diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/3rdparty_macro.cmake opencascade-7.5.1+dfsg1/adm/cmake/3rdparty_macro.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/3rdparty_macro.cmake 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/3rdparty_macro.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -97,12 +97,12 @@ if (3RDPARTY_${PRODUCT_NAME}_DIR AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_DIR}") find_path (3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR NAMES ${HEADER_NAME} PATHS ${3RDPARTY_${PRODUCT_NAME}_DIR} - PATH_SUFFIXES include inc + PATH_SUFFIXES include inc headers CMAKE_FIND_ROOT_PATH_BOTH NO_DEFAULT_PATH) else() find_path (3RDPARTY_${PRODUCT_NAME}_INCLUDE_DIR NAMES ${HEADER_NAME} - PATH_SUFFIXES include inc + PATH_SUFFIXES include inc headers CMAKE_FIND_ROOT_PATH_BOTH) endif() endif() @@ -125,10 +125,14 @@ set (${PRODUCT_NAME}_PATH_SUFFIXES lib) if (WIN32) set (${PRODUCT_NAME}_PATH_SUFFIXES ${${PRODUCT_NAME}_PATH_SUFFIXES} win${COMPILER_BITNESS}/${COMPILER}/lib) + set (${PRODUCT_NAME}_PATH_SUFFIXES ${${PRODUCT_NAME}_PATH_SUFFIXES} lib/win${COMPILER_BITNESS}) endif() if (ANDROID) set (${PRODUCT_NAME}_PATH_SUFFIXES ${${PRODUCT_NAME}_PATH_SUFFIXES} libs/${ANDROID_ABI}) endif() + if(UNIX AND NOT APPLE AND NOT ANDROID) + set (${PRODUCT_NAME}_PATH_SUFFIXES ${${PRODUCT_NAME}_PATH_SUFFIXES} lib/linux${COMPILER_BITNESS}) + endif() # set 3RDPARTY_${PRODUCT_NAME}_LIBRARY as notfound, otherwise find_library can't assign a new value to 3RDPARTY_${PRODUCT_NAME}_LIBRARY set (3RDPARTY_${PRODUCT_NAME}_LIBRARY_${LIBRARY_NAME_SUFFIX} "3RDPARTY_${PRODUCT_NAME}_LIBRARY_${LIBRARY_NAME_SUFFIX}-NOTFOUND" CACHE FILEPATH "The path to ${PRODUCT_NAME} library \"${LIBRARY_NAME}\"" FORCE) @@ -184,7 +188,7 @@ if ((3RDPARTY_${PRODUCT_NAME}_DIR AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_DIR}") OR (3RDPARTY_${PRODUCT_NAME}_DLL_DIR_${LIBRARY_NAME} AND EXISTS "${3RDPARTY_${PRODUCT_NAME}_DLL_DIR_${LIBRARY_NAME}}")) find_library (3RDPARTY_${PRODUCT_NAME}_DLL_${LIBRARY_NAME_SUFFIX} NAMES ${LIBRARY_NAME} PATHS "${3RDPARTY_${PRODUCT_NAME}_DLL_DIR_${LIBRARY_NAME}}" "${3RDPARTY_${PRODUCT_NAME}_DIR}" - PATH_SUFFIXES bin win${COMPILER_BITNESS}/${COMPILER}/bin + PATH_SUFFIXES bin win${COMPILER_BITNESS}/${COMPILER}/bin bin/win${COMPILER_BITNESS} NO_DEFAULT_PATH) if (3RDPARTY_${PRODUCT_NAME}_DLL_${LIBRARY_NAME_SUFFIX} STREQUAL "3RDPARTY_${PRODUCT_NAME}_DLL_${LIBRARY_NAME_SUFFIX}-NOTFOUND") # find directory recursive @@ -238,6 +242,7 @@ if (INSTALL_${PRODUCT_NAME}) OCCT_MAKE_OS_WITH_BITNESS() OCCT_MAKE_COMPILER_SHORT_NAME() + set (USED_3RDPARTY_${PRODUCT_NAME}_DIR "") if (WIN32) if (SINGLE_GENERATOR) @@ -280,14 +285,17 @@ endif() else() # the library directory for using by the executable - foreach (LIBRARY_NAME ${${LIBRARY_CSF_NAME}}) - string (REPLACE "." "" LIBRARY_NAME_SUFFIX "${LIBRARY_NAME}") + foreach (LIBRARY_NAME ${${LIBRARY_CSF_NAME}}) + string (REPLACE "." "" LIBRARY_NAME_SUFFIX "${LIBRARY_NAME}") if (WIN32) set (USED_3RDPARTY_${PRODUCT_NAME}_DIRS "${3RDPARTY_${PRODUCT_NAME}_DLL_DIR_${LIBRARY_NAME_SUFFIX}};${USED_3RDPARTY_${PRODUCT_NAME}_DIRS}") else() set (USED_3RDPARTY_${PRODUCT_NAME}_DIRS "${3RDPARTY_${PRODUCT_NAME}_LIBRARY_DIR_${LIBRARY_NAME_SUFFIX}}:${USED_3RDPARTY_${PRODUCT_NAME}_DIRS}") endif() endforeach() + if (WIN32) + set (USED_3RDPARTY_${PRODUCT_NAME}_DIR ${3RDPARTY_${PRODUCT_NAME}_DLL_DIR_${LIBRARY_NAME_SUFFIX}}) + endif() endif() mark_as_advanced (3RDPARTY_${PRODUCT_NAME}_LIBRARY_${LIBRARY_NAME_SUFFIX} 3RDPARTY_${PRODUCT_NAME}_DLL_${LIBRARY_NAME_SUFFIX}) diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/bison.cmake opencascade-7.5.1+dfsg1/adm/cmake/bison.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/bison.cmake 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/bison.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -2,19 +2,26 @@ # execute FindBISON script by "find_package (Bison)" is required to define BISON_TARGET macro -if (NOT DEFINED 3RDPARTY_BISON_EXECUTABLE) - set (3RDPARTY_BISON_EXECUTABLE "" CACHE FILEPATH "The path to the bison command") -endif() - -# BISON_EXECUTABLE is required by BISON_TARGET macro and should be defined -set (BISON_EXECUTABLE "${3RDPARTY_BISON_EXECUTABLE}" CACHE FILEPATH "path to the bison executable" FORCE) +# delete obsolete 3RDPARTY_BISON_EXECUTABLE cache variable (not used anymore) +unset (3RDPARTY_BISON_EXECUTABLE CACHE) -find_package (BISON) - -if (BISON_FOUND) - set (3RDPARTY_BISON_EXECUTABLE "${BISON_EXECUTABLE}" CACHE FILEPATH "The Path to the bison command" FORCE) +# delete BISON_EXECUTABLE cache variable if it is empty, otherwise find_package will fail +# without reasonable diagnostic +if (NOT BISON_EXECUTABLE OR NOT EXISTS "${BISON_EXECUTABLE}") + unset (BISON_EXECUTABLE CACHE) endif() -if (NOT 3RDPARTY_BISON_EXECUTABLE OR NOT EXISTS "${3RDPARTY_BISON_EXECUTABLE}") - list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_BISON_EXECUTABLE) -endif() \ No newline at end of file +# Add paths to 3rdparty subfolders containing name "bison" to CMAKE_PROGRAM_PATH variable to make +# these paths searhed by find_package +if (3RDPARTY_DIR) + file (GLOB BISON_PATHS LIST_DIRECTORIES true "${3RDPARTY_DIR}/*bison*/") + foreach (candidate_path ${BISON_PATHS}) + if (IS_DIRECTORY ${candidate_path}) + list (APPEND CMAKE_PROGRAM_PATH ${candidate_path}) + endif() + endforeach() +endif() + +# bison 3.2 is required because it provides options to avoid generation of redundant header +# files and embedding of local paths in the generated code +find_package (BISON 3.2) diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/flex.cmake opencascade-7.5.1+dfsg1/adm/cmake/flex.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/flex.cmake 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/flex.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -2,19 +2,34 @@ # execute FindFLEX script by "find_package (Flex)" is required to define FLEX_TARGET macro -if (NOT DEFINED 3RDPARTY_FLEX_EXECUTABLE) - set (3RDPARTY_FLEX_EXECUTABLE "" CACHE FILEPATH "The Path to the flex command") -endif() - -# FLEX_EXECUTABLE is required by FLEX_TARGET macro and should be defined -set (FLEX_EXECUTABLE "${3RDPARTY_FLEX_EXECUTABLE}" CACHE FILEPATH "path to the flex executable" FORCE) +# delete obsolete 3RDPARTY_FLEX_EXECUTABLE cache variable (not used anymore) +unset (3RDPARTY_FLEX_EXECUTABLE CACHE) -find_package (FLEX) +# delete FLEX_EXECUTABLE cache variable if it is empty, otherwise find_package will fail +# without reasonable diagnostic +if (NOT FLEX_EXECUTABLE OR NOT EXISTS "${FLEX_EXECUTABLE}") + unset (FLEX_EXECUTABLE CACHE) +endif() +if (NOT FLEX_INCLUDE_DIR OR NOT EXISTS "${FLEX_INCLUDE_DIR}") + unset (FLEX_INCLUDE_DIR CACHE) +endif() -if (FLEX_FOUND) - set (3RDPARTY_FLEX_EXECUTABLE "${FLEX_EXECUTABLE}" CACHE FILEPATH "The Path to the flex command" FORCE) +# Add paths to 3rdparty subfolders containing name "flex" to CMAKE_PROGRAM_PATH and +# CMAKE_INCLUDE_PATH variables to make these paths searhed by find_package +if (3RDPARTY_DIR) + file (GLOB FLEX_PATHS LIST_DIRECTORIES true "${3RDPARTY_DIR}/*flex*") + foreach (candidate_path ${FLEX_PATHS}) + if (IS_DIRECTORY ${candidate_path}) + list (APPEND CMAKE_PROGRAM_PATH ${candidate_path}) + list (APPEND CMAKE_INCLUDE_PATH ${candidate_path}) + endif() + endforeach() endif() + +# flex 2.5.37 is required because closest known lower version, 2.5.3 from WOK 6.8.0, +# generates code which is unusable on Windows (includes unistd.h without any way to avoid this) +find_package (FLEX 2.5.37) -if (NOT 3RDPARTY_FLEX_EXECUTABLE OR NOT EXISTS "${3RDPARTY_FLEX_EXECUTABLE}") - list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_FLEX_EXECUTABLE) -endif() \ No newline at end of file +if (NOT FLEX_FOUND OR NOT FLEX_INCLUDE_DIR OR NOT EXISTS "${FLEX_INCLUDE_DIR}/FlexLexer.h") + list (APPEND 3RDPARTY_NOT_INCLUDED FLEX_INCLUDE_DIR) +endif() diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/occt_csf.cmake opencascade-7.5.1+dfsg1/adm/cmake/occt_csf.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/occt_csf.cmake 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/occt_csf.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -42,6 +42,13 @@ endif() endif() +# OpenVR +if (USE_OPENVR) + set (CSF_OpenVR "openvr_api") +else() + set (CSF_OpenVR) +endif() + # TCL/TK if (USE_TCL) if (WIN32) @@ -108,6 +115,7 @@ elseif (ANDROID) set (CSF_ThreadLibs "c") set (CSF_OpenGlLibs "EGL GLESv2") + set (CSF_androidlog "log") elseif (UNIX) set (CSF_ThreadLibs "pthread rt stdc++") if (USE_GLES2) diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/occt_defs_flags.cmake opencascade-7.5.1+dfsg1/adm/cmake/occt_defs_flags.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/occt_defs_flags.cmake 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/occt_defs_flags.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -111,34 +111,31 @@ endif() endif() -if(MINGW) - # Set default release optimization option to O2 instead of O3, since in - # some OCCT related examples, this gives significantly smaller binaries - # at comparable performace with MinGW-w64. - string (REGEX MATCH "-O3" IS_O3_CXX "${CMAKE_CXX_FLAGS_RELEASE}") - if (IS_O3_CXX) - string (REGEX REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") - else() - set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2") - endif() - - set (CMAKE_CXX_FLAGS "-std=gnu++0x ${CMAKE_CXX_FLAGS}") - add_definitions(-D_WIN32_WINNT=0x0501) - # workaround bugs in mingw with vtable export - set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols") -elseif ("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang") +if ("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang") if (APPLE) # CLang can be used with both libstdc++ and libc++, however on OS X libstdc++ is outdated. set (CMAKE_CXX_FLAGS "-std=c++0x -stdlib=libc++ ${CMAKE_CXX_FLAGS}") - else() + elseif(NOT WIN32) + # CLang for Windows (at least CLang 8.0 distributed with VS 2019) + # does not support option "-std=c++0x" set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}") endif() + # Optimize size of binaries + set (CMAKE_SHARED_LINKER_FLAGS "-Wl,-s ${CMAKE_SHARED_LINKER_FLAGS}") +elseif(MINGW) + add_definitions(-D_WIN32_WINNT=0x0501) + # workaround bugs in mingw with vtable export + set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols") + + # Require C++11 + set (CMAKE_CXX_FLAGS "-std=gnu++0x ${CMAKE_CXX_FLAGS}") + # Optimize size of binaries + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s") + set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s") elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX) + # Require C++11 set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}") -endif() - -# Optimize size of binaries -if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR MINGW) + # Optimize size of binaries set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s") set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s") endif() diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/occt_macros.cmake opencascade-7.5.1+dfsg1/adm/cmake/occt_macros.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/occt_macros.cmake 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/occt_macros.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -12,18 +12,12 @@ endif() endmacro() -macro (OCCT_CHECK_AND_UNSET_GROUP VARNAME) - OCCT_CHECK_AND_UNSET ("${VARNAME}_DIR") - - OCCT_CHECK_AND_UNSET ("${VARNAME}_INCLUDE_DIR") - - OCCT_CHECK_AND_UNSET ("${VARNAME}_LIBRARY") - OCCT_CHECK_AND_UNSET ("${VARNAME}_LIBRARY_DIR") - - if (WIN32) - OCCT_CHECK_AND_UNSET ("${VARNAME}_DLL") - OCCT_CHECK_AND_UNSET ("${VARNAME}_DLL_DIR") - endif() +macro (OCCT_CHECK_AND_UNSET_GROUP GROUPNAME) + get_cmake_property(VARS VARIABLES) + string (REGEX MATCHALL "(^|;)${GROUPNAME}[A-Za-z0-9_]*" GROUPNAME_VARS "${VARS}") + foreach(GROUPNAME_VAR ${GROUPNAME_VARS}) + OCCT_CHECK_AND_UNSET(${GROUPNAME_VAR}) + endforeach() endmacro() macro (OCCT_CHECK_AND_UNSET_INSTALL_DIR_SUBDIRS) diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/occt_toolkit.cmake opencascade-7.5.1+dfsg1/adm/cmake/occt_toolkit.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/occt_toolkit.cmake 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/occt_toolkit.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -57,117 +57,140 @@ set (OCCT_PACKAGE_NAME "${OCCT_PACKAGE}") endif() - # TKService contains platform-dependent packages: Xw and WNT - if ((WIN32 AND "${OCCT_PACKAGE}" STREQUAL "Xw") OR (NOT WIN32 AND "${OCCT_PACKAGE}" STREQUAL "WNT")) - # do nothing - else() - - if (WIN32) - list (APPEND PRECOMPILED_DEFS "-D__${OCCT_PACKAGE_NAME}_DLL") - endif() - - set (SOURCE_FILES) - set (HEADER_FILES) + if (WIN32) + list (APPEND PRECOMPILED_DEFS "-D__${OCCT_PACKAGE_NAME}_DLL") + endif() - # Generate Flex and Bison files - if (${BUILD_YACCLEX}) + set (SOURCE_FILES) + set (HEADER_FILES) - # flex files - OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]lex" SOURCE_FILES_FLEX) - list (LENGTH SOURCE_FILES_FLEX SOURCE_FILES_FLEX_LEN) + # Generate Flex and Bison files + if (${BUILD_YACCLEX}) + # flex files + OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]lex" SOURCE_FILES_FLEX) + list (LENGTH SOURCE_FILES_FLEX SOURCE_FILES_FLEX_LEN) - # bison files - OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]yacc" SOURCE_FILES_BISON) - list (LENGTH SOURCE_FILES_BISON SOURCE_FILES_BISON_LEN) + # bison files + OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]yacc" SOURCE_FILES_BISON) + list (LENGTH SOURCE_FILES_BISON SOURCE_FILES_BISON_LEN) - if (${SOURCE_FILES_FLEX_LEN} EQUAL ${SOURCE_FILES_BISON_LEN} AND NOT ${SOURCE_FILES_FLEX_LEN} EQUAL 0) + if (${SOURCE_FILES_FLEX_LEN} EQUAL ${SOURCE_FILES_BISON_LEN} AND NOT ${SOURCE_FILES_FLEX_LEN} EQUAL 0) - list (SORT SOURCE_FILES_FLEX) - list (SORT SOURCE_FILES_BISON) + list (SORT SOURCE_FILES_FLEX) + list (SORT SOURCE_FILES_BISON) - math (EXPR SOURCE_FILES_FLEX_LEN "${SOURCE_FILES_FLEX_LEN} - 1") - foreach (FLEX_FILE_INDEX RANGE ${SOURCE_FILES_FLEX_LEN}) + math (EXPR SOURCE_FILES_FLEX_LEN "${SOURCE_FILES_FLEX_LEN} - 1") + foreach (FLEX_FILE_INDEX RANGE ${SOURCE_FILES_FLEX_LEN}) - list (GET SOURCE_FILES_FLEX ${FLEX_FILE_INDEX} CURRENT_FLEX_FILE) - get_filename_component (CURRENT_FLEX_FILE_NAME ${CURRENT_FLEX_FILE} NAME_WE) + list (GET SOURCE_FILES_FLEX ${FLEX_FILE_INDEX} CURRENT_FLEX_FILE) + get_filename_component (CURRENT_FLEX_FILE_NAME ${CURRENT_FLEX_FILE} NAME_WE) - list (GET SOURCE_FILES_BISON ${FLEX_FILE_INDEX} CURRENT_BISON_FILE) - get_filename_component (CURRENT_BISON_FILE_NAME ${CURRENT_BISON_FILE} NAME_WE) + list (GET SOURCE_FILES_BISON ${FLEX_FILE_INDEX} CURRENT_BISON_FILE) + get_filename_component (CURRENT_BISON_FILE_NAME ${CURRENT_BISON_FILE} NAME_WE) - string (COMPARE EQUAL ${CURRENT_FLEX_FILE_NAME} ${CURRENT_BISON_FILE_NAME} ARE_FILES_EQUAL) + string (COMPARE EQUAL ${CURRENT_FLEX_FILE_NAME} ${CURRENT_BISON_FILE_NAME} ARE_FILES_EQUAL) - if (EXISTS "${CURRENT_FLEX_FILE}" AND EXISTS "${CURRENT_BISON_FILE}" AND ${ARE_FILES_EQUAL}) - set (BISON_OUTPUT_FILE ${CURRENT_BISON_FILE_NAME}.tab.c) - set (FLEX_OUTPUT_FILE lex.${CURRENT_FLEX_FILE_NAME}.c) - BISON_TARGET (Parser_${CURRENT_BISON_FILE_NAME} ${CURRENT_BISON_FILE} ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${BISON_OUTPUT_FILE} COMPILE_FLAGS "-p ${CURRENT_BISON_FILE_NAME}") - FLEX_TARGET (Scanner_${CURRENT_FLEX_FILE_NAME} ${CURRENT_FLEX_FILE} ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${FLEX_OUTPUT_FILE} COMPILE_FLAGS "-P${CURRENT_FLEX_FILE_NAME}") - ADD_FLEX_BISON_DEPENDENCY (Scanner_${CURRENT_FLEX_FILE_NAME} Parser_${CURRENT_BISON_FILE_NAME}) + if (EXISTS "${CURRENT_FLEX_FILE}" AND EXISTS "${CURRENT_BISON_FILE}" AND ${ARE_FILES_EQUAL}) + + # Note: files are generated in original source directory (not in patch!) + set (FLEX_BISON_TARGET_DIR "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}") + + # choose apropriate extension for generated files: "cxx" if source file contains + # instruction to generate C++ code, "c" otherwise + set (BISON_OUTPUT_FILE_EXT "c") + set (FLEX_OUTPUT_FILE_EXT "c") + file (STRINGS "${CURRENT_BISON_FILE}" FILE_BISON_CONTENT) + foreach (FILE_BISON_CONTENT_LINE ${FILE_BISON_CONTENT}) + string (REGEX MATCH "%language \"C\\+\\+\"" CXX_BISON_LANGUAGE_FOUND ${FILE_BISON_CONTENT_LINE}) + if (CXX_BISON_LANGUAGE_FOUND) + set (BISON_OUTPUT_FILE_EXT "cxx") + endif() + endforeach() + file (STRINGS "${CURRENT_FLEX_FILE}" FILE_FLEX_CONTENT) + foreach (FILE_FLEX_CONTENT_LINE ${FILE_FLEX_CONTENT}) + string (REGEX MATCH "%option c\\+\\+" CXX_FLEX_LANGUAGE_FOUND ${FILE_FLEX_CONTENT_LINE}) + if (CXX_FLEX_LANGUAGE_FOUND) + set (FLEX_OUTPUT_FILE_EXT "cxx") + + # install copy of FlexLexer.h locally to allow further building without flex + if (FLEX_INCLUDE_DIR AND EXISTS "${FLEX_INCLUDE_DIR}/FlexLexer.h") + configure_file("${FLEX_INCLUDE_DIR}/FlexLexer.h" "${FLEX_BISON_TARGET_DIR}/FlexLexer.h" @ONLY NEWLINE_STYLE LF) + endif() + endif() + endforeach() + set (BISON_OUTPUT_FILE ${CURRENT_BISON_FILE_NAME}.tab.${BISON_OUTPUT_FILE_EXT}) + set (FLEX_OUTPUT_FILE lex.${CURRENT_FLEX_FILE_NAME}.${FLEX_OUTPUT_FILE_EXT}) + + BISON_TARGET (Parser_${CURRENT_BISON_FILE_NAME} ${CURRENT_BISON_FILE} "${FLEX_BISON_TARGET_DIR}/${BISON_OUTPUT_FILE}" + COMPILE_FLAGS "-p ${CURRENT_BISON_FILE_NAME} -l -M ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/=") + FLEX_TARGET (Scanner_${CURRENT_FLEX_FILE_NAME} ${CURRENT_FLEX_FILE} "${FLEX_BISON_TARGET_DIR}/${FLEX_OUTPUT_FILE}" + COMPILE_FLAGS "-P${CURRENT_FLEX_FILE_NAME} -L") + ADD_FLEX_BISON_DEPENDENCY (Scanner_${CURRENT_FLEX_FILE_NAME} Parser_${CURRENT_BISON_FILE_NAME}) - list (APPEND SOURCE_FILES ${BISON_OUTPUT_FILE} ${FLEX_OUTPUT_FILE}) - endif() - endforeach() - endif() + list (APPEND SOURCE_FILES ${BISON_OUTPUT_FILE} ${FLEX_OUTPUT_FILE}) + endif() + endforeach() endif() + endif() - # header files - if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES") - file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h") - file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx") - file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx") - - file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c") - if(APPLE) - file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm") - endif() - else() - file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h") - file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx") - file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx") - - file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c") - if(APPLE) - file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm") - endif() + # header files + if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES") + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h") + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx") + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx") + + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c") + if(APPLE) + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm") endif() - - list (APPEND HEADER_FILES ${HEADER_FILES_M} ${HEADER_FILES_LXX} ${SOURCE_FILES_GXX}) - list (APPEND SOURCE_FILES ${SOURCE_FILES_C}) + else() + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h") + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx") + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx") + + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c") if(APPLE) - list (APPEND SOURCE_FILES ${SOURCE_FILES_M}) + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm") endif() + endif() + + list (APPEND HEADER_FILES ${HEADER_FILES_M} ${HEADER_FILES_LXX} ${SOURCE_FILES_GXX}) + list (APPEND SOURCE_FILES ${SOURCE_FILES_C}) + if(APPLE) + list (APPEND SOURCE_FILES ${SOURCE_FILES_M}) + endif() - foreach(HEADER_FILE ${HEADER_FILES}) - if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") - message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") - list (APPEND USED_INCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") - SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") - else() - list (APPEND USED_INCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") - SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") - endif() - endforeach() + foreach(HEADER_FILE ${HEADER_FILES}) + if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + list (APPEND USED_INCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + else() + list (APPEND USED_INCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + endif() + endforeach() - foreach(SOURCE_FILE ${SOURCE_FILES}) - if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") - message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") - list (APPEND USED_SRCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") - SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") - else() - list (APPEND USED_SRCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") - SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") - endif() - endforeach() + foreach(SOURCE_FILE ${SOURCE_FILES}) + if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + list (APPEND USED_SRCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + else() + list (APPEND USED_SRCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + endif() + endforeach() - if (USE_QT) - FIND_AND_INSTALL_QT_RESOURCES (${OCCT_PACKAGE} RESOURCE_FILES) - #message("Qt Resource files are: ${QT_RESOURCE_FILES} in ${OCCT_PACKAGE}") - endif(USE_QT) - - #message("Resource files are: ${RESOURCE_FILES} in ${OCCT_PACKAGE}") - foreach(RESOURCE_FILE ${RESOURCE_FILES}) - SOURCE_GROUP ("Resource Files\\${OCCT_PACKAGE_NAME}" FILES "${RESOURCE_FILE}") - endforeach() - endif() + if (USE_QT) + FIND_AND_INSTALL_QT_RESOURCES (${OCCT_PACKAGE} RESOURCE_FILES) + #message("Qt Resource files are: ${QT_RESOURCE_FILES} in ${OCCT_PACKAGE}") + endif(USE_QT) + + #message("Resource files are: ${RESOURCE_FILES} in ${OCCT_PACKAGE}") + foreach(RESOURCE_FILE ${RESOURCE_FILES}) + SOURCE_GROUP ("Resource Files\\${OCCT_PACKAGE_NAME}" FILES "${RESOURCE_FILE}") + endforeach() endforeach() string (REGEX REPLACE ";" " " PRECOMPILED_DEFS "${PRECOMPILED_DEFS}") @@ -330,7 +353,7 @@ # Update list of used VTK libraries if OpenGL2 Rendering BackEnd is used. # Add VTK_OPENGL2_BACKEND definition. -if("${VTK_RENDERING_BACKEND}" STREQUAL "OpenGL2") +if("${VTK_RENDERING_BACKEND}" STREQUAL "OpenGL2" OR IS_VTK_9XX) add_definitions(-DVTK_OPENGL2_BACKEND) foreach (VTK_EXCLUDE_LIBRARY vtkRenderingOpenGL vtkRenderingFreeTypeOpenGL) list (FIND USED_TOOLKITS_BY_CURRENT_PROJECT "${VTK_EXCLUDE_LIBRARY}" IS_VTK_OPENGL_FOUND) @@ -354,6 +377,9 @@ endif() if (BUILD_SHARED_LIBS) + if(IS_VTK_9XX) + string (REGEX REPLACE "vtk" "VTK::" USED_TOOLKITS_BY_CURRENT_PROJECT "${USED_TOOLKITS_BY_CURRENT_PROJECT}") + endif() target_link_libraries (${PROJECT_NAME} ${USED_TOOLKITS_BY_CURRENT_PROJECT} ${USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT}) endif() diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/openvr.cmake opencascade-7.5.1+dfsg1/adm/cmake/openvr.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/openvr.cmake 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/openvr.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,5 @@ +# OpenVR SDK +# OpenVR is an API and runtime that allows access to VR hardware from multiple vendors without requiring that applications have specific knowledge of the hardware they are targeting. +# https://github.com/ValveSoftware/openvr + +THIRDPARTY_PRODUCT("OPENVR" "openvr.h" "CSF_OpenVR" "") diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/qt.cmake opencascade-7.5.1+dfsg1/adm/cmake/qt.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/qt.cmake 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/qt.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -7,7 +7,8 @@ FIND_PRODUCT_DIR ("${3RDPARTY_DIR}" Qt 3RDPARTY_QT_DIR_NAME) if (NOT DEFINED ${3RDPARTY_QT_DIR_NAME} AND ${3RDPARTY_QT_DIR_NAME} STREQUAL "") - message (FATAL_ERROR "... Qt root directory was not found") + set (3RDPARTY_QT_DIR "" CACHE PATH "The directory containing qt") + message (FATAL_ERROR "Could not find used third-party product: 3RDPARTY_QT_DIR") endif() # Combine directory name with absolute path and show in GUI @@ -31,4 +32,10 @@ #message (STATUS "Qt4 cmake configuration") else() #message (STATUS "Qt5 cmake configuration") -endif() \ No newline at end of file +endif() + +if (3RDPARTY_QT_DIR OR EXISTS "${3RDPARTY_QT_DIR}") + list (APPEND 3RDPARTY_DLL_DIRS "${3RDPARTY_QT_DIR}/bin") +else() + list (APPEND 3RDPARTY_NO_DLLS 3RDPARTY_QT_DLL_DIR) +endif() diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/vardescr.cmake opencascade-7.5.1+dfsg1/adm/cmake/vardescr.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/vardescr.cmake 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/vardescr.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -89,6 +89,7 @@ INSTALL_MESSAGE (INSTALL_DOC_Overview "OCCT overview documentation (HTML format)") INSTALL_MESSAGE (INSTALL_FFMPEG "FFmpeg binaries") INSTALL_MESSAGE (INSTALL_FREEIMAGE "FreeImage binaries") +INSTALL_MESSAGE (INSTALL_OPENVR "OpenVR binaries") INSTALL_MESSAGE (INSTALL_EIGEN "EIGEN header files") INSTALL_MESSAGE (INSTALL_EGL "EGL binaries") INSTALL_MESSAGE (INSTALL_GLES2 "OpenGL ES 2.0 binaries") @@ -162,6 +163,9 @@ "Indicates whether Freeimage product should be used in OCCT visualization module for support of popular graphics image formats (PNG, BMP etc)") +set (USE_OPENVR_DESCR +"Indicates whether OpenVR should be used in OCCT visualization module for VR support") + set (USE_RAPIDJSON_DESCR "Indicates whether RapidJSON product should be used in OCCT DataExchange module for support of JSON-based formats like glTF") diff -Nru opencascade-7.4.1+dfsg1/adm/cmake/vtk.cmake opencascade-7.5.1+dfsg1/adm/cmake/vtk.cmake --- opencascade-7.4.1+dfsg1/adm/cmake/vtk.cmake 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/cmake/vtk.cmake 2021-02-02 08:51:56.000000000 +0000 @@ -66,10 +66,15 @@ set (ENV{VTK_DIR} ${CACHED_VTK_DIR}) endif() +unset (IS_VTK_9XX) if (VTK_FOUND) - - # add compiler flags, preprocessor definitions, include and link dirs - include (${VTK_USE_FILE}) + message ("VTK version (${VTK_VERSION})") + if(VTK_MAJOR_VERSION EQUAL 8 AND VTK_MINOR_VERSION GREATER 9 OR VTK_MAJOR_VERSION GREATER 8) + set (IS_VTK_9XX 1) + else() + # add compiler flags, preprocessor definitions, include and link dirs + include (${VTK_USE_FILE}) + endif() if (VTK_LIBRARIES) @@ -81,79 +86,83 @@ # endif() foreach (VTK_LIBRARY ${VTK_LIBRARIES}) - string (REGEX MATCH "^vtk" IS_VTK_LIBRARY ${VTK_LIBRARY}) - if (IS_VTK_LIBRARY AND TARGET ${VTK_LIBRARY}) - # get paths from corresponding variables - if (${VTK_LIBRARY}_INCLUDE_DIRS AND EXISTS "${${VTK_LIBRARY}_INCLUDE_DIRS}") - list (APPEND 3RDPARTY_VTK_INCLUDE_DIRS "${${VTK_LIBRARY}_INCLUDE_DIRS}") + if (IS_VTK_9XX) + string (REGEX MATCH "^VTK::" IS_VTK_LIBRARY ${VTK_LIBRARY}) + else() + string (REGEX MATCH "^vtk" IS_VTK_LIBRARY ${VTK_LIBRARY}) + endif() + if (NOT IS_VTK_LIBRARY OR NOT TARGET ${VTK_LIBRARY}) + continue() + endif() + + # get paths from corresponding variables + if (${VTK_LIBRARY}_INCLUDE_DIRS AND EXISTS "${${VTK_LIBRARY}_INCLUDE_DIRS}") + list (APPEND 3RDPARTY_VTK_INCLUDE_DIRS "${${VTK_LIBRARY}_INCLUDE_DIRS}") + endif() + + if (${VTK_LIBRARY}_LIBRARY_DIRS AND EXISTS "${${VTK_LIBRARY}_LIBRARY_DIRS}") + list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${${VTK_LIBRARY}_LIBRARY_DIRS}") + endif() + + if (${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS AND EXISTS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}") + list (APPEND 3RDPARTY_VTK_DLL_DIRS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}") + if (NOT WIN32) + list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}") endif() + endif() - if (${VTK_LIBRARY}_LIBRARY_DIRS AND EXISTS "${${VTK_LIBRARY}_LIBRARY_DIRS}") - list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${${VTK_LIBRARY}_LIBRARY_DIRS}") - endif() + # get paths from corresponding properties + get_target_property (TARGET_VTK_IMPORT_CONFS ${VTK_LIBRARY} IMPORTED_CONFIGURATIONS) + if (TARGET_VTK_IMPORT_CONFS) + list (GET TARGET_VTK_IMPORT_CONFS 0 CHOSEN_IMPORT_CONF) + + # todo: choose configuration in connection with the build type + #if (CMAKE_BUILD_TYPE) + # foreach (IMPORT_CONF ${TARGET_VTK_IMPORT_CONFS}) + # endforeach() + #endif() + + # Work-around against link failure in case if VTK contains dependency + # on DirectX: its run-time is always present on Windows, but SDK can + # be absent on current workstation, while not actually needed for + # OCCT linking. + # VTK 6.1 for VC 10 + get_target_property (TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${VTK_LIBRARY} IMPORTED_LINK_INTERFACE_LIBRARIES_${CHOSEN_IMPORT_CONF}) + if(TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES) + string (REGEX MATCH "[^;]*d3d[0-9]+[.]lib" HARDCODED_D3D9_LIB "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}") + if (HARDCODED_D3D9_LIB) + message (STATUS "Warning: ${HARDCODED_D3D9_LIB} has been removed from imported dependencies of ${VTK_LIBRARY}") - if (${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS AND EXISTS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}") - list (APPEND 3RDPARTY_VTK_DLL_DIRS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}") - if (NOT WIN32) - list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}") - endif() + list (REMOVE_ITEM TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${HARDCODED_D3D9_LIB}) + set_target_properties (${VTK_LIBRARY} PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES_${CHOSEN_IMPORT_CONF} "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}") endif() + endif() + # VTK 6.1 for VC 12, 14 + get_target_property (TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${VTK_LIBRARY} INTERFACE_LINK_LIBRARIES) + if(TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES) + string (REGEX MATCH "[^;]*d3d[0-9]+[.]lib" HARDCODED_D3D9_LIB "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}") + if (HARDCODED_D3D9_LIB) + message (STATUS "Warning: ${HARDCODED_D3D9_LIB} has been removed from imported dependencies of ${VTK_LIBRARY}") - # get paths from corresponding properties - get_target_property (TARGET_VTK_IMPORT_CONFS ${VTK_LIBRARY} IMPORTED_CONFIGURATIONS) + list (REMOVE_ITEM TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${HARDCODED_D3D9_LIB}) + set_target_properties (${VTK_LIBRARY} PROPERTIES INTERFACE_LINK_LIBRARIES "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}") + endif() + endif() - if (TARGET_VTK_IMPORT_CONFS) - list (GET TARGET_VTK_IMPORT_CONFS 0 CHOSEN_IMPORT_CONF) + get_target_property (TARGET_PROPERTY_IMP_PATH ${VTK_LIBRARY} IMPORTED_IMPLIB_${CHOSEN_IMPORT_CONF}) + if(TARGET_PROPERTY_IMP_PATH AND EXISTS "${TARGET_PROPERTY_IMP_PATH}") + get_filename_component (TARGET_PROPERTY_IMP_DIR "${TARGET_PROPERTY_IMP_PATH}" PATH) + list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${TARGET_PROPERTY_IMP_DIR}") + endif() - # todo: choose configuration in connection with the build type - #if (CMAKE_BUILD_TYPE) - # foreach (IMPORT_CONF ${TARGET_VTK_IMPORT_CONFS}) - # endforeach() - #endif() - - # Work-around against link failure in case if VTK contains dependency - # on DirectX: its run-time is always present on Windows, but SDK can - # be absent on current workstation, while not actually needed for - # OCCT linking. - # VTK 6.1 for VC 10 - get_target_property (TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${VTK_LIBRARY} IMPORTED_LINK_INTERFACE_LIBRARIES_${CHOSEN_IMPORT_CONF}) - if(TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES) - string (REGEX MATCH "[^;]*d3d[0-9]+[.]lib" HARDCODED_D3D9_LIB "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}") - if (HARDCODED_D3D9_LIB) - message (STATUS "Warning: ${HARDCODED_D3D9_LIB} has been removed from imported dependencies of ${VTK_LIBRARY}") - - list (REMOVE_ITEM TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${HARDCODED_D3D9_LIB}) - set_target_properties (${VTK_LIBRARY} PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES_${CHOSEN_IMPORT_CONF} "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}") - endif() - endif() - # VTK 6.1 for VC 12, 14 - get_target_property (TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${VTK_LIBRARY} INTERFACE_LINK_LIBRARIES) - if(TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES) - string (REGEX MATCH "[^;]*d3d[0-9]+[.]lib" HARDCODED_D3D9_LIB "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}") - if (HARDCODED_D3D9_LIB) - message (STATUS "Warning: ${HARDCODED_D3D9_LIB} has been removed from imported dependencies of ${VTK_LIBRARY}") - - list (REMOVE_ITEM TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${HARDCODED_D3D9_LIB}) - set_target_properties (${VTK_LIBRARY} PROPERTIES INTERFACE_LINK_LIBRARIES "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}") - endif() - endif() - - get_target_property (TARGET_PROPERTY_IMP_PATH ${VTK_LIBRARY} IMPORTED_IMPLIB_${CHOSEN_IMPORT_CONF}) - if(TARGET_PROPERTY_IMP_PATH AND EXISTS "${TARGET_PROPERTY_IMP_PATH}") - get_filename_component (TARGET_PROPERTY_IMP_DIR "${TARGET_PROPERTY_IMP_PATH}" PATH) - list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${TARGET_PROPERTY_IMP_DIR}") - endif() - - get_target_property (TARGET_PROPERTY_LOCATION_PATH ${VTK_LIBRARY} IMPORTED_LOCATION_${CHOSEN_IMPORT_CONF}) - if(TARGET_PROPERTY_LOCATION_PATH AND EXISTS "${TARGET_PROPERTY_LOCATION_PATH}") - get_filename_component (TARGET_PROPERTY_LOCATION_DIR "${TARGET_PROPERTY_LOCATION_PATH}" PATH) - - if (WIN32) - list (APPEND 3RDPARTY_VTK_DLL_DIRS "${TARGET_PROPERTY_LOCATION_DIR}") - else() - list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${TARGET_PROPERTY_LOCATION_DIR}") - endif() - endif() + get_target_property (TARGET_PROPERTY_LOCATION_PATH ${VTK_LIBRARY} IMPORTED_LOCATION_${CHOSEN_IMPORT_CONF}) + if(TARGET_PROPERTY_LOCATION_PATH AND EXISTS "${TARGET_PROPERTY_LOCATION_PATH}") + get_filename_component (TARGET_PROPERTY_LOCATION_DIR "${TARGET_PROPERTY_LOCATION_PATH}" PATH) + + if (WIN32) + list (APPEND 3RDPARTY_VTK_DLL_DIRS "${TARGET_PROPERTY_LOCATION_DIR}") + else() + list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${TARGET_PROPERTY_LOCATION_DIR}") endif() endif() endif() @@ -187,6 +196,7 @@ endif() endif() # endif() +endif() if (3RDPARTY_VTK_INCLUDE_DIR AND EXISTS "${3RDPARTY_VTK_INCLUDE_DIR}") list (APPEND 3RDPARTY_INCLUDE_DIRS ${3RDPARTY_VTK_INCLUDE_DIR}) diff -Nru opencascade-7.4.1+dfsg1/adm/genconfdeps.tcl opencascade-7.5.1+dfsg1/adm/genconfdeps.tcl --- opencascade-7.4.1+dfsg1/adm/genconfdeps.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/genconfdeps.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -68,7 +68,7 @@ } # fetch environment variables (e.g. set by custom.sh or custom.bat) and set them as tcl variables with the same name -set THE_ENV_VARIABLES {HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_ZLIB HAVE_LIBLZMA HAVE_E57 HAVE_RAPIDJSON HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo} +set THE_ENV_VARIABLES {HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_ZLIB HAVE_LIBLZMA HAVE_E57 HAVE_RAPIDJSON HAVE_OPENVR HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo BUILD_Inspector} foreach anEnvIter $THE_ENV_VARIABLES { set ${anEnvIter} "false" if { [info exists ::env(${anEnvIter})] } { @@ -241,7 +241,11 @@ # keep only two first digits in "vc141" if { ! [regexp {^vc[0-9][0-9]} $theCmpl aCmpl] } { - set aCmpl $theCmpl + if { [regexp {^vclang} $theCmpl] } { + set aCmpl vc14 + } else { + set aCmpl $theCmpl + } } set aShortList {} @@ -621,6 +625,59 @@ return "$isFound" } +# Search OpenVR SDK placement +proc wokdep:SearchOpenVR {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { + upvar $theErrInc anErrInc + upvar $theErrLib32 anErrLib32 + upvar $theErrLib64 anErrLib64 + upvar $theErrBin32 anErrBin32 + upvar $theErrBin64 anErrBin64 + + set isFound "true" + set anOpenVrHPath [wokdep:SearchHeader "openvr.h"] + if { "$anOpenVrHPath" == "" } { + set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{openvr}*] "$::VCVER" "$::ARCH" ] + if { "$aPath" != "" && [file exists "$aPath/include/openvr.h"] } { + lappend ::CSF_OPT_INC "$aPath/include" + } elseif { "$aPath" != "" && [file exists "$aPath/headers/openvr.h"] } { + lappend ::CSF_OPT_INC "$aPath/headers" + } else { + lappend anErrInc "Error: 'openvr.h' not found (OpenVR)" + set isFound "false" + } + } + + set aPlatform "unknown" + if { "$::tcl_platform(platform)" == "windows" } { + set aPlatform "win" + } elseif { "$::tcl_platform(os)" == "Darwin" } { + set aPlatform "osx" + } elseif { "$::tcl_platform(os)" == "Linux" } { + set aPlatform "linux" + } + + foreach anArchIter {64 32} { + set anOpenVrLibPath [wokdep:SearchLib "openvr_api" "$anArchIter"] + if { "$anOpenVrLibPath" == "" } { + set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{openvr}*] "$::VCVER" "$anArchIter" ] + set anOpenVrLibPath [wokdep:SearchLib "openvr_api" "$anArchIter" "$aPath/lib/${aPlatform}${anArchIter}"] + set anOpenVrLibPath2 [wokdep:SearchLib "openvr_api" "$anArchIter" "$aPath/lib"] + if { "$anOpenVrLibPath" != "" } { + lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib/${aPlatform}${anArchIter}" + lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin/${aPlatform}${anArchIter}" + } elseif { "$anOpenVrLibPath2" != "" } { + lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" + lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" + } else { + lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}openvr_api.${::SYS_LIB_SUFFIX}' not found (OpenVR)" + if { "$::ARCH" == "$anArchIter"} { set isFound "false" } + } + } + } + + return "$isFound" +} + # Search TBB library placement proc wokdep:SearchTBB {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { upvar $theErrInc anErrInc @@ -631,7 +688,11 @@ # keep only two first digits in "vc141" if { ! [regexp {^vc[0-9][0-9]} ${::VCVER} aVcLib] } { - set aVcLib ${::VCVER} + if { [regexp {^vclang} ${::VCVER}] } { + set aVcLib vc14 + } else { + set aVcLib ${::VCVER} + } } set isFound "true" @@ -1014,8 +1075,8 @@ return "$isFound" } -# Search Qt4 libraries placement -proc wokdep:SearchQt4 {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { +# Search Qt libraries placement +proc wokdep:SearchQt {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} { upvar $theErrInc anErrInc upvar $theErrLib32 anErrLib32 upvar $theErrLib64 anErrLib64 @@ -1023,53 +1084,46 @@ upvar $theErrBin64 anErrBin64 set isFound "true" - set aQMsgBoxHPath [wokdep:SearchHeader "QtGui/qmessagebox.h"] + set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt}*] "$::VCVER" "$::ARCH" ] + set aQMsgBoxHPath [wokdep:SearchHeader "QtGui/qguiapplication.h"] if { "$aQMsgBoxHPath" == "" } { - set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt4}*] "$::VCVER" "$::ARCH" ] - if { "$aPath" != "" && [file exists "$aPath/include/QtGui/qmessagebox.h"] } { + if { "$aPath" != "" && [file exists "$aPath/include/QtGui/qguiapplication.h"] } { lappend ::CSF_OPT_INC "$aPath/include" lappend ::CSF_OPT_INC "$aPath/include/Qt" lappend ::CSF_OPT_INC "$aPath/include/QtGui" lappend ::CSF_OPT_INC "$aPath/include/QtCore" + lappend ::CSF_OPT_INC "$aPath/include/QtWidgets" + lappend ::CSF_OPT_INC "$aPath/include/QtXml" } else { - if { [file exists "/usr/include/qt4/QtGui/qmessagebox.h"] } { - lappend ::CSF_OPT_INC "/usr/include/qt4" - lappend ::CSF_OPT_INC "/usr/include/qt4/Qt" - lappend ::CSF_OPT_INC "/usr/include/qt4/QtGui" - lappend ::CSF_OPT_INC "/usr/include/qt4/QtCore" - } else { - lappend anErrInc "Error: 'QtGui/qmessagebox.h' not found (Qt4)" + lappend anErrInc "Error: 'QtGui/qguiapplication.h' not found" set isFound "false" - } } } set aQtGuiLibName "QtGui" if { "$::tcl_platform(platform)" == "windows" } { - set aQtGuiLibName "QtGui4" + set aQtGuiLibName "Qt5Gui" } foreach anArchIter {64 32} { set aQMsgBoxLibPath [wokdep:SearchLib "${aQtGuiLibName}" "$anArchIter"] if { "$aQMsgBoxLibPath" == "" } { - set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt4}*] "$::VCVER" "$anArchIter" ] set aQMsgBoxLibPath [wokdep:SearchLib "${aQtGuiLibName}" "$anArchIter" "$aPath/lib"] if { "$aQMsgBoxLibPath" != "" } { lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib" } else { - lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}${aQtGuiLibName}.${::SYS_LIB_SUFFIX}' not found (Qt4)" + lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}${aQtGuiLibName}.${::SYS_LIB_SUFFIX}' not found (Qt)" if { "$::ARCH" == "$anArchIter"} { set isFound "false" } } } if { "$::tcl_platform(platform)" == "windows" } { - set aQMsgBoxDllPath [wokdep:SearchBin "QtGui4.dll" "$anArchIter"] + set aQMsgBoxDllPath [wokdep:SearchBin "${aQtGuiLibName}.dll" "$anArchIter"] if { "$aQMsgBoxDllPath" == "" } { - set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt4}*] "$::VCVER" "$anArchIter" ] - set aQMsgBoxDllPath [wokdep:SearchBin "QtGui4.dll" "$anArchIter" "$aPath/bin"] + set aQMsgBoxDllPath [wokdep:SearchBin "${aQtGuiLibName}.dll" "$anArchIter" "$aPath/bin"] if { "$aQMsgBoxDllPath" != "" } { lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin" } else { - lappend anErrBin$anArchIter "Error: 'QtGui4.dll' not found (Qt4)" + lappend anErrBin$anArchIter "Error: '${aQtGuiLibName}.dll' not found (Qt)" if { "$::ARCH" == "$anArchIter"} { set isFound "false" } } } diff -Nru opencascade-7.4.1+dfsg1/adm/genconf.tcl opencascade-7.5.1+dfsg1/adm/genconf.tcl --- opencascade-7.4.1+dfsg1/adm/genconf.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/genconf.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -82,6 +82,11 @@ lappend ::SYS_VC_LIST "vc142-uwp" lappend ::SYS_VCVARS_LIST "$res\\VC\\vcvarsall.bat" } +if { ! [catch {exec vswhere.exe -version "\[16.0,16.99\]" -latest -requires Microsoft.VisualStudio.Component.VC.ClangCL -property installationPath} res] } { + lappend ::SYS_VS_LIST "Visual Studio 2019 (16, toolset ClangCL)" + lappend ::SYS_VC_LIST "vclang" + lappend ::SYS_VCVARS_LIST "$res\\VC\\vcvarsall.bat" +} # detect installed Visual Studio instances from global environment if { [info exists ::env(VS140COMNTOOLS)] } { @@ -182,6 +187,9 @@ if { "$::HAVE_FFMPEG" == "true" } { wokdep:SearchFFmpeg anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs } + if { "$::HAVE_OPENVR" == "true" } { + wokdep:SearchOpenVR anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs + } if { "$::HAVE_TBB" == "true" } { wokdep:SearchTBB anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs } @@ -193,7 +201,11 @@ } if { "$::HAVE_ZLIB" == "true" } { - wokdep:SearchStandardLibrary anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs "zlib" "zlib.h" "zlib" {"zlib"} + set aCheckLib "z" + if { "$::tcl_platform(platform)" == "windows" } { + set aCheckLib "zlib" + } + wokdep:SearchStandardLibrary anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs "zlib" "zlib.h" "$aCheckLib" {"zlib"} } if { "$::HAVE_LIBLZMA" == "true" } { set aCheckLib "lzma" @@ -214,9 +226,14 @@ wokdep:SearchRapidJson anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs } - if { "$::CHECK_QT4" == "true" } { - wokdep:SearchQt4 anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs + if {"$::BUILD_Inspector" == "true" } { + set ::CHECK_QT "true" + } + + if { "$::CHECK_QT" == "true" } { + wokdep:SearchQt anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs } + if { "$::CHECK_JDK" == "true" } { wokdep:SearchJDK anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs } @@ -458,6 +475,8 @@ ttk::label .myFrame.myChecks.myFImageLbl -text "Use FreeImage" checkbutton .myFrame.myChecks.myTbbCheck -offvalue "false" -onvalue "true" -variable HAVE_TBB -command wokdep:gui:UpdateList ttk::label .myFrame.myChecks.myTbbLbl -text "Use Intel TBB" +checkbutton .myFrame.myChecks.myOpenVrCheck -offvalue "false" -onvalue "true" -variable HAVE_OPENVR -command wokdep:gui:UpdateList +ttk::label .myFrame.myChecks.myOpenVrLbl -text "Use OpenVR" if { "$::tcl_platform(os)" != "Darwin" } { checkbutton .myFrame.myChecks.myGlesCheck -offvalue "false" -onvalue "true" -variable HAVE_GLES2 -command wokdep:gui:UpdateList ttk::label .myFrame.myChecks.myGlesLbl -text "Use OpenGL ES" @@ -485,11 +504,16 @@ checkbutton .myFrame.myChecks.myE57Check -offvalue "false" -onvalue "true" -variable HAVE_E57 -command wokdep:gui:UpdateList ttk::label .myFrame.myChecks.myE57Lbl -text "Use E57" -checkbutton .myFrame.myChecks.myQt4Check -offvalue "false" -onvalue "true" -variable CHECK_QT4 -command wokdep:gui:UpdateList -ttk::label .myFrame.myChecks.myQt4Lbl -text "Search Qt4" +checkbutton .myFrame.myChecks.myQtCheck -offvalue "false" -onvalue "true" -variable CHECK_QT -command wokdep:gui:UpdateList +ttk::label .myFrame.myChecks.myQtLbl -text "Search Qt" checkbutton .myFrame.myChecks.myJDKCheck -offvalue "false" -onvalue "true" -variable CHECK_JDK -command wokdep:gui:UpdateList ttk::label .myFrame.myChecks.myJDKLbl -text "Search JDK" +if { "$::tcl_platform(platform)" == "windows" } { + checkbutton .myFrame.myChecks.myInspectorBuild -offvalue "false" -onvalue "true" -variable BUILD_Inspector -command wokdep:gui:UpdateList + ttk::label .myFrame.myChecks.myInspectorLbl -text "Build Inspector" +} + # Additional headers search paths ttk::label .myFrame.myIncLbl -text "Additional headers search paths:" -padding {5 5 80 5} scrollbar .myFrame.myIncScrl -command ".myFrame.myIncList yview" @@ -593,8 +617,8 @@ grid .myFrame.myChecks.myZLibCheck -row $aCheckRowIter -column 6 -sticky e grid .myFrame.myChecks.myZLibLbl -row $aCheckRowIter -column 7 -sticky w -grid .myFrame.myChecks.myQt4Check -row $aCheckRowIter -column 12 -sticky e -grid .myFrame.myChecks.myQt4Lbl -row $aCheckRowIter -column 13 -sticky w +grid .myFrame.myChecks.myQtCheck -row $aCheckRowIter -column 12 -sticky e +grid .myFrame.myChecks.myQtLbl -row $aCheckRowIter -column 13 -sticky w incr aCheckRowIter grid .myFrame.myChecks.myFFmpegCheck -row $aCheckRowIter -column 0 -sticky e @@ -616,9 +640,16 @@ incr aCheckRowIter grid .myFrame.myChecks.myRapidJsonCheck -row $aCheckRowIter -column 0 -sticky e grid .myFrame.myChecks.myRapidJsonLbl -row $aCheckRowIter -column 1 -sticky w +grid .myFrame.myChecks.myOpenVrCheck -row $aCheckRowIter -column 4 -sticky e +grid .myFrame.myChecks.myOpenVrLbl -row $aCheckRowIter -column 5 -sticky w grid .myFrame.myChecks.myE57Check -row $aCheckRowIter -column 6 -sticky e grid .myFrame.myChecks.myE57Lbl -row $aCheckRowIter -column 7 -sticky w +if { "$::tcl_platform(platform)" == "windows" } { + grid .myFrame.myChecks.myInspectorBuild -row $aCheckRowIter -column 12 -sticky e + grid .myFrame.myChecks.myInspectorLbl -row $aCheckRowIter -column 13 -sticky w +} + incr aCheckRowIter # Additional headers search paths diff -Nru opencascade-7.4.1+dfsg1/adm/genproj.tcl opencascade-7.5.1+dfsg1/adm/genproj.tcl --- opencascade-7.4.1+dfsg1/adm/genproj.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/genproj.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -68,12 +68,12 @@ return "" } -proc _get_used_files { pk {inc true} {src true} } { +proc _get_used_files { pk theSrcDir {inc true} {src true} } { global path set type [_get_type $pk] set lret {} - set pk_path "$path/src/$pk" - set FILES_path "$path/src/$pk/FILES" + set pk_path "$path/$theSrcDir/$pk" + set FILES_path "$path/$theSrcDir/$pk/FILES" set FILES {} if {[file exists $FILES_path]} { set fd [open $FILES_path rb] @@ -100,12 +100,12 @@ return $lret } -# return location of the path within src directory -proc osutils:findSrcSubPath {theSubPath} { - if {[file exists "$::path/src/$theSubPath"]} { - return "$::path/src/$theSubPath" +# return location of the path within source directory +proc osutils:findSrcSubPath {theSrcDir theSubPath} { + if {[file exists "$::path/$theSrcDir/$theSubPath"]} { + return "$::path/$theSrcDir/$theSubPath" } - return "$::THE_CASROOT/src/$theSubPath" + return "$::THE_CASROOT/$theSrcDir/$theSubPath" } # Auxiliary tool comparing content of two files line-by-line. @@ -156,11 +156,11 @@ } # Function re-generating header files for specified text resource -proc genResources { theResource } { +proc genResources { theSrcDir theResource } { global path set aResFileList {} - set aResourceAbsPath [file normalize "${path}/src/${theResource}"] + set aResourceAbsPath [file normalize "${path}/$theSrcDir/${theResource}"] set aResourceDirectory "" set isResDirectory false @@ -193,13 +193,13 @@ # generate set aContent {} - lappend aContent "// This file has been automatically generated from resource file src/${aResourceDirectory}/${aResFileIter}" + lappend aContent "// This file has been automatically generated from resource file $theSrcDir/${aResourceDirectory}/${aResFileIter}" lappend aContent "" # generate necessary structures set aLineList {} - if {[file exists "${path}/src/${aResourceDirectory}/${aResFileIter}"]} { - set anInputFile [open "${path}/src/${aResourceDirectory}/${aResFileIter}" rb] + if {[file exists "${path}/$theSrcDir/${aResourceDirectory}/${aResFileIter}"]} { + set anInputFile [open "${path}/$theSrcDir/${aResourceDirectory}/${aResFileIter}" rb] fconfigure $anInputFile -translation crlf set aLineList [split [read $anInputFile] "\n"] close $anInputFile @@ -226,9 +226,9 @@ } # Save generated content to header file - set aHeaderFilePath "${path}/src/${aResourceDirectory}/${aHeaderFileName}" + set aHeaderFilePath "${path}/$theSrcDir/${aResourceDirectory}/${aHeaderFileName}" if { [osutils:writeTextFile $aHeaderFilePath $aContent] == true } { - puts "Generating header file from resource file: ${path}/src/${aResourceDirectory}/${aResFileIter}" + puts "Generating header file from resource file: ${path}/$theSrcDir/${aResourceDirectory}/${aResFileIter}" } else { #puts "Header file from resource ${path}/src/${aResourceDirectory}/${aResFileIter} is up-to-date" } @@ -236,7 +236,7 @@ } # Function re-generating header files for all text resources -proc genAllResources {} { +proc genAllResources { theSrcDir } { global path set aCasRoot [file normalize $path] if {![file exists "$aCasRoot/adm/RESOURCES"]} { @@ -250,13 +250,13 @@ set anAdmResources [lsearch -inline -all -not -exact $anAdmResources ""] foreach line $anAdmResources { - genResources "${line}" + genResources $theSrcDir "${line}" } } # Wrapper-function to generate VS project files proc genproj {theFormat args} { - set aSupportedFormats { "vc7" "vc8" "vc9" "vc10" "vc11" "vc12" "vc14" "vc141" "vc142" "cbp" "xcd" "pro"} + set aSupportedFormats { "vc7" "vc8" "vc9" "vc10" "vc11" "vc12" "vc14" "vc141" "vc142" "vclang" "cbp" "xcd" "pro"} set aSupportedPlatforms { "wnt" "uwp" "lin" "mac" "ios" "qnx" } set isHelpRequire false @@ -320,6 +320,7 @@ vc14 - Visual Studio 2015 vc141 - Visual Studio 2017 vc142 - Visual Studio 2019 + vclang - Visual Studio with ClangCL toolset cbp - CodeBlocks xcd - XCode pro - Qt Creator @@ -350,7 +351,7 @@ OS:MKPRC "$anAdmPath" "$theFormat" "$aLibType" "$aPlatform" "$aCmpl" "$aSolution" genprojbat "$theFormat" "$aPlatform" "$aSolution" - genAllResources + genAllResources "src" } # copy file providing warning if the target file exists and has @@ -396,6 +397,10 @@ } copy_with_warning "$::THE_CASROOT/adm/templates/draw.${aTargetPlatformExt}" "$::path/draw.${aTargetPlatformExt}" + + if { "$::BUILD_Inspector" == "true" } { + copy_with_warning "$::THE_CASROOT/adm/templates/inspector.${aTargetPlatformExt}" "$::path/inspector.${aTargetPlatformExt}" + } } set aSolShList "" @@ -485,7 +490,10 @@ } # make list of modules and platforms - set aModules [OS:init] + set aModules [OS:init OS Modules] + if { [llength $aModules] == 0 } { + set aModules [OS:init VAS Products] + } if { "$thePlatform" == "ios" } { set goaway [list Draw] set aModules [osutils:juststation $goaway $aModules] @@ -507,7 +515,26 @@ # collect all required header files puts "Collecting required header files into $path/inc ..." - osutils:collectinc $aModules $path/inc + osutils:collectinc $aModules "src" $path/inc + + # make list of Inspector tools + set aTools {} + if { "$::BUILD_Inspector" == "true" } { + set aTools [OS:init OS Tools] + if { [llength $aTools] == 0 } { + set aTools [OS:init VAS Tools] + } + + # create the out dir if it does not exist + if (![file isdirectory $path/inc/inspector]) { + puts "$path/inc/inspector folder does not exists and will be created" + wokUtils:FILES:mkdir $path/inc/inspector + } + + # collect all required header files + puts "Collecting required tools header files into $path/inc/inspector ..." + osutils:collectinc $aTools "tools" $path/inc/inspector + } if { "$theFormat" == "pro" } { return @@ -529,7 +556,8 @@ "vc12" - "vc14" - "vc141" - - "vc142" { OS:MKVC $anOutDir $aModules $theSolution $theFormat $isUWP} + "vc142" - + "vclang" { OS:MKVC $anOutDir $aModules $aTools $theSolution $theFormat $isUWP} "cbp" { OS:MKCBP $anOutDir $aModules $theSolution $thePlatform $theCmpl } "xcd" { set ::THE_GUIDS_LIST($::aTKNullKey) "000000000000000000000000" @@ -548,54 +576,50 @@ } # Function to generate Visual Studio solution and project files -proc OS:MKVC { theOutDir theModules theAllSolution theVcVer isUWP } { +proc OS:MKVC { theOutDir theModules theTools theAllSolution theVcVer isUWP } { puts stderr "Generating VS project files for $theVcVer" # generate projects for toolkits and separate solution for each module foreach aModule $theModules { - OS:vcsolution $theVcVer $aModule $aModule $theOutDir ::THE_GUIDS_LIST - OS:vcproj $theVcVer $isUWP $aModule $theOutDir ::THE_GUIDS_LIST + OS:vcsolution $theVcVer $aModule $aModule $theOutDir ::THE_GUIDS_LIST "src" "" "" + OS:vcproj $theVcVer $isUWP $aModule $theOutDir ::THE_GUIDS_LIST "src" "" + } + + # generate projects for toolkits and separate solution for each tool + foreach aTool $theTools { + OS:vcsolution $theVcVer $aTool $aTool $theOutDir ::THE_GUIDS_LIST "tools" "" "src" + OS:vcproj $theVcVer $isUWP $aTool $theOutDir ::THE_GUIDS_LIST "tools" "src" } # generate single solution "OCCT" containing projects from all modules if { "$theAllSolution" != "" } { - OS:vcsolution $theVcVer $theAllSolution $theModules $theOutDir ::THE_GUIDS_LIST + OS:vcsolution $theVcVer $theAllSolution $theModules $theOutDir ::THE_GUIDS_LIST "src" $theTools "tools" } puts "The Visual Studio solution and project files are stored in the $theOutDir directory" } -proc OS:init {{os {}}} { +proc OS:init {theVas theNameOfDefFile {os {}}} { set askplat $os set aModules {} if { "$os" == "" } { set os $::tcl_platform(os) } - if [file exists "$::path/src/VAS/Products.tcl"] { - source "$::path/src/VAS/Products.tcl" - foreach aModuleIter [VAS:Products] { - set aFileTcl "$::path/src/VAS/${aModuleIter}.tcl" - if [file exists $aFileTcl] { - source $aFileTcl - lappend aModules $aModuleIter - } else { - puts stderr "Definition file for module $aModuleIter is not found in unit VAS" - } - } + if { ![file exists "$::path/src/${theVas}/${theNameOfDefFile}.tcl"]} { return $aModules } # Load list of OCCT modules and their definitions - source "$::path/src/OS/Modules.tcl" - foreach aModuleIter [OS:Modules] { - set aFileTcl "$::path/src/OS/${aModuleIter}.tcl" + source "$::path/src/${theVas}/${theNameOfDefFile}.tcl" + foreach aModuleIter [${theVas}:${theNameOfDefFile}] { + set aFileTcl "$::path/src/${theVas}/${aModuleIter}.tcl" if [file exists $aFileTcl] { source $aFileTcl lappend aModules $aModuleIter } else { - puts stderr "Definition file for module $aModuleIter is not found in unit OS" + puts stderr "Definition file for $aModuleIter is not found in unit ${theVas}" } } @@ -714,10 +738,10 @@ } # Topological sort of toolkits in tklm -proc osutils:tk:sort { tklm } { +proc osutils:tk:sort { tklm theSrcDir theSourceDirOther } { set tkby2 {} foreach tkloc $tklm { - set lprg [wokUtils:LIST:Purge [osutils:tk:close $tkloc]] + set lprg [wokUtils:LIST:Purge [osutils:tk:close $tkloc $theSrcDir $theSourceDirOther]] foreach tkx $lprg { if { [lsearch $tklm $tkx] != -1 } { lappend tkby2 [list $tkx $tkloc] @@ -738,26 +762,26 @@ # close dependencies of ltk. (full wok pathes of toolkits) # The CURRENT WOK LOCATION MUST contains ALL TOOLKITS required. # (locate not performed.) -proc osutils:tk:close { ltk } { +proc osutils:tk:close { ltk theSrcDir theSourceDirOther } { set result {} set recurse {} foreach dir $ltk { - set ids [LibToLink $dir] + set ids [LibToLink $dir $theSrcDir $theSourceDirOther] # puts "osutils:tk:close($ltk) ids='$ids'" set eated [osutils:tk:eatpk $ids] set result [concat $result $eated] - set ids [LibToLink $dir] + set ids [LibToLink $dir $theSrcDir $theSourceDirOther] set result [concat $result $ids] foreach file $eated { - set kds [osutils:findSrcSubPath "$file/EXTERNLIB"] + set kds [osutils:findSrcSubPath $theSrcDir "$file/EXTERNLIB"] if { [osutils:tk:eatpk $kds] != {} } { lappend recurse $file } } } if { $recurse != {} } { - set result [concat $result [osutils:tk:close $recurse]] + set result [concat $result [osutils:tk:close $recurse $theSrcDir $theSourceDirOther]] } return $result } @@ -774,16 +798,19 @@ } # Define libraries to link using only EXTERNLIB file -proc LibToLink {theTKit} { +proc LibToLink {theTKit theSrcDir theSourceDirOther} { regexp {^.*:([^:]+)$} $theTKit dummy theTKit set type [_get_type $theTKit] if {$type != "t" && $type != "x"} { return } set aToolkits {} - set anExtLibList [osutils:tk:eatpk [osutils:findSrcSubPath "$theTKit/EXTERNLIB"]] + set anExtLibList [osutils:tk:eatpk [osutils:findSrcSubPath $theSrcDir "$theTKit/EXTERNLIB"]] foreach anExtLib $anExtLibList { - set aFullPath [LocateRecur $anExtLib] + set aFullPath [LocateRecur $anExtLib $theSrcDir] + if { "$aFullPath" == "" && "$theSourceDirOther" != "" } { + set aFullPath [LocateRecur $anExtLib $theSourceDirOther] + } if { "$aFullPath" != "" && [_get_type $anExtLib] == "t" } { lappend aToolkits $anExtLib } @@ -792,8 +819,8 @@ } # Search unit recursively -proc LocateRecur {theName} { - set theNamePath [osutils:findSrcSubPath "$theName"] +proc LocateRecur {theName theSrcDir} { + set theNamePath [osutils:findSrcSubPath $theSrcDir "$theName"] if {[file isdirectory $theNamePath]} { return $theNamePath } @@ -820,7 +847,7 @@ } # collect all include file that required for theModules in theOutDir -proc osutils:collectinc {theModules theIncPath} { +proc osutils:collectinc {theModules theSrcDir theIncPath} { global path set aCasRoot [file normalize $path] set anIncPath [file normalize $theIncPath] @@ -835,14 +862,14 @@ foreach aToolKit [${aModule}:toolkits] { lappend anUsedToolKits $aToolKit - foreach aDependency [LibToLink $aToolKit] { + foreach aDependency [LibToLink $aToolKit $theSrcDir ""] { lappend anUsedToolKits $aDependency } } foreach anExecutable [OS:executable ${aModule}] { lappend anUsedToolKits $anExecutable - foreach aDependency [LibToLink $anExecutable] { + foreach aDependency [LibToLink $anExecutable $theSrcDir ""] { lappend anUsedToolKits $aDependency } } @@ -851,7 +878,7 @@ set anUnits {} foreach anUsedToolKit $anUsedToolKits { - set anUnits [concat $anUnits [osutils:tk:units $anUsedToolKit]] + set anUnits [concat $anUnits [osutils:tk:units $anUsedToolKit $theSrcDir] ] } set anUnits [lsort -unique $anUnits] @@ -876,14 +903,14 @@ } set aHeaderTmpl [wokUtils:FILES:FileToString $::THE_CASROOT/adm/templates/header.in] - # relative anIncPath in connection with aCasRoot/src - set aFromBuildIncToSrcPath [relativePath "$anIncPath" "$aCasRoot/src"] + # relative anIncPath in connection with aCasRoot/$theSrcDir + set aFromBuildIncToSrcPath [relativePath "$anIncPath" "$aCasRoot/$theSrcDir"] # create and copy short-cut header files foreach anUnit $anUnits { - osutils:checksrcfiles ${anUnit} + osutils:checksrcfiles ${anUnit} $theSrcDir - set aHFiles [_get_used_files ${anUnit} true false] + set aHFiles [_get_used_files ${anUnit} $theSrcDir true false] foreach aHeaderFile ${aHFiles} { set aHeaderFileName [lindex ${aHeaderFile} 1] lappend allHeaderFiles "${aHeaderFileName}" @@ -918,15 +945,15 @@ } else { set nbcopied 0 foreach anUnit $anUnits { - osutils:checksrcfiles ${anUnit} + osutils:checksrcfiles ${anUnit} $theSrcDir - set aHFiles [_get_used_files ${anUnit} true false] + set aHFiles [_get_used_files ${anUnit} $theSrcDir true false] foreach aHeaderFile ${aHFiles} { set aHeaderFileName [lindex ${aHeaderFile} 1] lappend allHeaderFiles "${aHeaderFileName}" # copy file only if target does not exist or is older than original - set torig [file mtime $aCasRoot/src/$anUnit/$aHeaderFileName] + set torig [file mtime $aCasRoot/$theSrcDir/$anUnit/$aHeaderFileName] set tcopy 0 if { [file isfile $anIncPath/$aHeaderFileName] } { set tcopy [file mtime $anIncPath/$aHeaderFileName] @@ -937,12 +964,12 @@ if { $tcopy != 0 } { file delete -force "$theIncPath/$aHeaderFileName" } - file link -hard $anIncPath/$aHeaderFileName $aCasRoot/src/$anUnit/$aHeaderFileName + file link -hard $anIncPath/$aHeaderFileName $aCasRoot/$theSrcDir/$anUnit/$aHeaderFileName } else { - file copy -force $aCasRoot/src/$anUnit/$aHeaderFileName $anIncPath/$aHeaderFileName + file copy -force $aCasRoot/$theSrcDir/$anUnit/$aHeaderFileName $anIncPath/$aHeaderFileName } } elseif { $tcopy != $torig } { - puts "Warning: file $anIncPath/$aHeaderFileName is newer than $aCasRoot/src/$anUnit/$aHeaderFileName, not changed!" + puts "Warning: file $anIncPath/$aHeaderFileName is newer than $aCasRoot/$theSrcDir/$anUnit/$aHeaderFileName, not changed!" } } } @@ -984,7 +1011,8 @@ append var \ "Microsoft Visual Studio Solution File, Format Version 12.00\n" \ "# Visual Studio 2013\n" - } elseif { "$vcversion" == "vc14" || "$vcversion" == "vc141" || "$vcversion" == "vc142" } { + } elseif { "$vcversion" == "vc14" || "$vcversion" == "vc141" || + "$vcversion" == "vc142" || "$vcversion" == "vclang" } { append var \ "Microsoft Visual Studio Solution File, Format Version 12.00\n" \ "# Visual Studio 14\n" @@ -1070,44 +1098,16 @@ # generate Visual Studio solution file # if module is empty, generates one solution for all known modules -proc OS:vcsolution { theVcVer theSolName theModules theOutDir theGuidsMap } { +proc OS:vcsolution { theVcVer theSolName theModules theOutDir theGuidsMap theSrcDir theModulesOther theSourceDirOther } { global path upvar $theGuidsMap aGuidsMap # collect list of projects to be created set aProjects {} set aDependencies {} - foreach aModule $theModules { - # toolkits - foreach aToolKit [osutils:tk:sort [${aModule}:toolkits]] { - lappend aProjects $aToolKit - lappend aProjectsInModule($aModule) $aToolKit - lappend aDependencies [LibToLink $aToolKit] - } - # executables, assume one project per cxx file... - foreach aUnit [OS:executable ${aModule}] { - set aUnitLoc $aUnit - set src_files [_get_used_files $aUnit false] - set aSrcFiles {} - foreach s $src_files { - regexp {source ([^\s]+)} $s dummy name - lappend aSrcFiles $name - } - foreach aSrcFile $aSrcFiles { - set aFileExtension [file extension $aSrcFile] - if { $aFileExtension == ".cxx" } { - set aPrjName [file rootname $aSrcFile] - lappend aProjects $aPrjName - lappend aProjectsInModule($aModule) $aPrjName - if {[file isdirectory $path/src/$aUnitLoc]} { - lappend aDependencies [LibToLinkX $aUnitLoc [file rootname $aSrcFile]] - } else { - lappend aDependencies {} - } - } - } - } - } + + osutils:convertModules $theModules $theSrcDir $theSourceDirOther aProjects aProjectsInModule aDependencies + osutils:convertModules $theModulesOther $theSourceDirOther $theSrcDir aProjects aProjectsInModule aDependencies # generate GUIDs for projects (unless already known) foreach aProject $aProjects { @@ -1134,6 +1134,15 @@ } } + if { "$theVcVer" != "vc7" && [llength "$theModulesOther"] > 1 } { + set aModule "Tools" + if { ! [info exists aGuidsMap(_$aModule)] } { + set aGuidsMap(_$aModule) [OS:genGUID] + } + set aGuid $aGuidsMap(_$aModule) + append aFileBuff "Project(\"${VC_GROUP_GUID}\") = \"$aModule\", \"$aModule\", \"$aGuid\"\nEndProject\n" + } + # extension of project files set aProjExt [osutils:vcproj:ext $theVcVer] @@ -1178,6 +1187,13 @@ append aFileBuff " $aGuidsMap($aProject) = $aGuidsMap(_$aModule)\n" } } + set aToolsName "Tools" + foreach aModule $theModulesOther { + if { ! [info exists aProjectsInModule($aModule)] } { continue } + foreach aProject $aProjectsInModule($aModule) { + append aFileBuff " $aGuidsMap($aProject) = $aGuidsMap(_$aToolsName)\n" + } + } append aFileBuff " EndGlobalSection\n" } @@ -1191,19 +1207,65 @@ close $aFile return [file join $theOutDir ${theSolName}.sln] } + +# Generate auxiliary containers with information about modules. +# @param theModules List of modules +# @param theSrcDir Directory of module toolkits +# @param theSourceDirOther Directory with other additional sources to find out toolkits in dependencies +# @param theProjects list of all found projects/toolkits +# @param theProjectsInModule map of module into toolkits/projects +# @param theDependencies list of the project dependencies. To find the project dependencies, get it by the index in project container +proc osutils:convertModules { theModules theSrcDir theSourceDirOther theProjects theProjectsInModule theDependencies } { + global path + upvar $theProjectsInModule aProjectsInModule + upvar $theProjects aProjects + upvar $theDependencies aDependencies + + foreach aModule $theModules { + # toolkits + foreach aToolKit [osutils:tk:sort [${aModule}:toolkits] $theSrcDir $theSourceDirOther] { + lappend aProjects $aToolKit + lappend aProjectsInModule($aModule) $aToolKit + lappend aDependencies [LibToLink $aToolKit $theSrcDir $theSourceDirOther] + } + # executables, assume one project per cxx file... + foreach aUnit [OS:executable ${aModule}] { + set aUnitLoc $aUnit + set src_files [_get_used_files $aUnit $theSrcDir false] + set aSrcFiles {} + foreach s $src_files { + regexp {source ([^\s]+)} $s dummy name + lappend aSrcFiles $name + } + foreach aSrcFile $aSrcFiles { + set aFileExtension [file extension $aSrcFile] + if { $aFileExtension == ".cxx" } { + set aPrjName [file rootname $aSrcFile] + lappend aProjects $aPrjName + lappend aProjectsInModule($aModule) $aPrjName + if {[file isdirectory $path/$theSrcDir/$aUnitLoc]} { + lappend aDependencies [LibToLinkX $aUnitLoc [file rootname $aSrcFile] $theSrcDir $theSourceDirOther] + } else { + lappend aDependencies {} + } + } + } + } + } +} # Generate Visual Studio projects for specified version -proc OS:vcproj { theVcVer isUWP theModules theOutDir theGuidsMap } { +proc OS:vcproj { theVcVer isUWP theModules theOutDir theGuidsMap theSrcDir theSourceDirOther } { upvar $theGuidsMap aGuidsMap set aProjectFiles {} foreach aModule $theModules { foreach aToolKit [${aModule}:toolkits] { - lappend aProjectFiles [osutils:vcproj $theVcVer $isUWP $theOutDir $aToolKit aGuidsMap] + lappend aProjectFiles [osutils:vcproj $theVcVer $isUWP $theOutDir $aToolKit aGuidsMap $theSrcDir $theSourceDirOther] } foreach anExecutable [OS:executable ${aModule}] { - lappend aProjectFiles [osutils:vcprojx $theVcVer $isUWP $theOutDir $anExecutable aGuidsMap] + lappend aProjectFiles [osutils:vcprojx $theVcVer $isUWP $theOutDir $anExecutable aGuidsMap $theSrcDir $theSourceDirOther] } } return $aProjectFiles @@ -1225,6 +1287,9 @@ } elseif { $theVcVer == "vc142" } { set aVCRTVer "vc14" set aToolset "v142" + } elseif { $theVcVer == "vclang" } { + set aVCRTVer "vc14" + set aToolset "ClangCL" } set what "$theVcVer" @@ -1305,9 +1370,14 @@ return [list .h .hxx .hpp .lxx .pxx .gxx .mm ] } -proc osutils:commonUsedTK { theToolKit } { +# List extensions of Qt resource file in OCCT +proc osutils:fileExtensionsResources {thePlatform} { + return [list .qrc ] +} + +proc osutils:commonUsedTK { theToolKit theSrcDir theSourceDirOther} { set anUsedToolKits [list] - set aDepToolkits [LibToLink $theToolKit] + set aDepToolkits [LibToLink $theToolKit $theSrcDir $theSourceDirOther] foreach tkx $aDepToolkits { if {[_get_type $tkx] == "t"} { lappend anUsedToolKits "${tkx}" @@ -1332,7 +1402,7 @@ # @param theOS - target OS # @param theCsfLibsMap - libraries map # @param theCsfFrmsMap - frameworks map, OS X specific -proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap } { +proc osutils:csfList { theOS theCsfLibsMap theCsfFrmsMap theRelease} { upvar $theCsfLibsMap aLibsMap upvar $theCsfFrmsMap aFrmsMap @@ -1365,11 +1435,14 @@ } } if { "$::HAVE_ZLIB" == "true" } { - set aLibsMap(CSF_ZLIB) "zlib" + set aLibsMap(CSF_ZLIB) "z" } if { "$::HAVE_LIBLZMA" == "true" } { set aLibsMap(CSF_LIBLZMA) "liblzma" } + if { "$::HAVE_OPENVR" == "true" } { + set aLibsMap(CSF_OpenVR) "openvr_api" + } if { "$::HAVE_E57" == "true" && "$theOS" != "wnt" } { # exclude wnt, as there are different pragma lib depending on debug/release set aLibsMap(CSF_E57) "E57RefImpl" @@ -1397,11 +1470,18 @@ # the naming is different on Windows set aLibsMap(CSF_TclLibs) "tcl86" set aLibsMap(CSF_TclTkLibs) "tk86" - - set aLibsMap(CSF_QT) "QtCore4 QtGui4" + if { "$theRelease" == "true" } { + set aLibsMap(CSF_QT) "Qt5Gui Qt5Widgets Qt5Xml Qt5Core" + } else { + set aLibsMap(CSF_QT) "Qt5Guid Qt5Widgetsd Qt5Xmld Qt5Cored" + } # tbb headers define different pragma lib depending on debug/release set aLibsMap(CSF_TBB) "" + + if { "$::HAVE_ZLIB" == "true" } { + set aLibsMap(CSF_ZLIB) "zlib" + } } else { set aLibsMap(CSF_dl) "dl" if { "$theOS" == "mac" || "$theOS" == "ios" } { @@ -1419,6 +1499,9 @@ set aFrmsMap(CSF_TclTkLibs) "Tk" set aLibsMap(CSF_TclTkLibs) "" set aLibsMap(CSF_QT) "QtCore QtGui" + } elseif { "$theOS" == "android" } { + set aLibsMap(CSF_OpenGlLibs) "EGL GLESv2" + set aLibsMap(CSF_androidlog) "log" } else { set aLibsMap(CSF_fontconfig) "fontconfig" if { "$theOS" == "qnx" } { @@ -1470,16 +1553,16 @@ # @param theLibsList - dependencies (libraries list) # @param theFrameworks - dependencies (frameworks list, OS X specific) -proc osutils:usedOsLibs { theToolKit theOS theLibsList theFrameworks } { +proc osutils:usedOsLibs { theToolKit theOS theLibsList theFrameworks theSrcDir { theRelease true } } { global path upvar $theLibsList aLibsList upvar $theFrameworks aFrameworks set aLibsList [list] set aFrameworks [list] - osutils:csfList $theOS aLibsMap aFrmsMap + osutils:csfList $theOS aLibsMap aFrmsMap $theRelease - foreach aCsfElem [osutils:tk:csfInExternlib "$path/src/${theToolKit}/EXTERNLIB"] { + foreach aCsfElem [osutils:tk:csfInExternlib "$path/$theSrcDir/${theToolKit}/EXTERNLIB"] { if [info exists aLibsMap($aCsfElem)] { foreach aLib [split "$aLibsMap($aCsfElem)"] { if { [lsearch $aLibsList $aLib] == "-1" } { @@ -1498,12 +1581,12 @@ } # Returns liste of UD in a toolkit. tkloc is a full path wok. -proc osutils:tk:units { tkloc } { +proc osutils:tk:units { tkloc theSrcDir } { global path set l {} - set PACKAGES "$path/src/$tkloc/PACKAGES" + set PACKAGES "$path/$theSrcDir/$tkloc/PACKAGES" foreach u [wokUtils:FILES:FileToList $PACKAGES] { - if {[file isdirectory "$path/src/$u"]} { + if {[file isdirectory "$path/$theSrcDir/$u"]} { lappend l $u } } @@ -1513,11 +1596,6 @@ return $l } -proc osutils:justwnt { listloc } { - set goaway [list Xw] - return [osutils:juststation $goaway $listloc] -} - # remove from listloc OpenCascade units indesirables on NT proc osutils:juststation {goaway listloc} { global path @@ -1604,9 +1682,9 @@ } # Generate entry for one source file in Visual Studio 10 project file -proc osutils:vcxproj:cxxfile { theFile theParams } { +proc osutils:vcxproj:cxxfile { theFile theParams theSrcFileLevel } { if { $theParams == "" } { - return " \n" + return " \n" } set aParams [string trim ${theParams}] @@ -1703,7 +1781,15 @@ } # Generate Visual Studio project file for ToolKit -proc osutils:vcproj { theVcVer isUWP theOutDir theToolKit theGuidsMap } { +proc osutils:vcproj { theVcVer isUWP theOutDir theToolKit theGuidsMap theSrcDir theSourceDirOther } { + global path + + set aHasQtDep "false" + foreach aCsfElem [osutils:tk:csfInExternlib "$path/$theSrcDir/${theToolKit}/EXTERNLIB"] { + if { "$aCsfElem" == "CSF_QT" } { + set aHasQtDep "true" + } + } set theProjTmpl [osutils:vcproj:readtemplate $theVcVer $isUWP 0] set l_compilable [osutils:compilable wnt] @@ -1723,33 +1809,26 @@ lappend aUsedLibs "WindowsApp.lib" } - foreach tkx [osutils:commonUsedTK $theToolKit] { + foreach tkx [osutils:commonUsedTK $theToolKit $theSrcDir $theSourceDirOther] { lappend aUsedLibs "${tkx}.lib" } - osutils:usedOsLibs $theToolKit "wnt" aLibs aFrameworks - foreach aLibIter $aLibs { - lappend aUsedLibs "${aLibIter}.lib" - } + set anOsReleaseLibs {} + set anOsDebugLibs {} + osutils:usedOsLibs $theToolKit "wnt" anOsReleaseLibs aFrameworks $theSrcDir true + osutils:usedOsLibs $theToolKit "wnt" anOsDebugLibs aFrameworks $theSrcDir false # correct names of referred third-party libraries that are named with suffix # depending on VC version - set aVCRTVer [string range $theVcVer 0 3] - regsub -all -- {vc[0-9]+} $aUsedLibs $aVCRTVer aUsedLibs - - # and put this list to project file - #puts "$theToolKit requires $aUsedLibs" - if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } { - set aUsedLibs [join $aUsedLibs {;}] - } - regsub -all -- {__TKDEP__} $theProjTmpl $aUsedLibs theProjTmpl + regsub -all -- {__TKDEP__} $theProjTmpl [osutils:depLibraries $aUsedLibs $anOsReleaseLibs $theVcVer] theProjTmpl + regsub -all -- {__TKDEP_DEBUG__} $theProjTmpl [osutils:depLibraries $aUsedLibs $anOsDebugLibs $theVcVer] theProjTmpl set anIncPaths "..\\..\\..\\inc" # set aTKDefines "" set aFilesSection "" set aVcFilesCxx(units) "" set aVcFilesHxx(units) "" - set listloc [osutils:tk:units $theToolKit] + set listloc [osutils:tk:units $theToolKit $theSrcDir] if [array exists written] { unset written } #puts "\t1 [wokparam -v %CMPLRS_CXX_Options [w_info -f]] father" #puts "\t2 [wokparam -v %CMPLRS_CXX_Options] branch" @@ -1760,9 +1839,23 @@ set fxloparam "" foreach fxlo $listloc { set xlo $fxlo - set aSrcFiles [osutils:tk:cxxfiles $xlo wnt] - set aHxxFiles [osutils:tk:hxxfiles $xlo wnt] - set fxlo_cmplrs_options_cxx [_get_options wnt cmplrs_cxx $fxlo] + set aSrcFiles [osutils:tk:cxxfiles $xlo wnt $theSrcDir] + set aHxxFiles [osutils:tk:hxxfiles $xlo wnt $theSrcDir] + + # prepare Qt moc files, appears only in Inspector - directory tools + set aGeneratedFiles {} + if { "$aHasQtDep" == "true" } { + set aMocResFiles [osutils:tk:mocfiles $aHxxFiles $theOutDir] + set aGeneratedFiles [osutils:tk:execfiles $aMocResFiles $theOutDir moc${::SYS_EXE_SUFFIX} moc cpp] + + set aQrcResFiles [osutils:tk:qrcfiles $xlo wnt $theSrcDir] + set aQrcFiles [osutils:tk:execfiles $aQrcResFiles $theOutDir rcc${::SYS_EXE_SUFFIX} rcc cpp] + foreach resFile $aQrcFiles { + lappend aGeneratedFiles $resFile + } + } + + set fxlo_cmplrs_options_cxx [_get_options wnt cmplrs_cxx $fxlo] if {$fxlo_cmplrs_options_cxx == ""} { set fxlo_cmplrs_options_cxx [_get_options wnt cmplrs_cxx b] } @@ -1790,7 +1883,7 @@ foreach aSrcFile [lsort $aSrcFiles] { if { ![info exists written([file tail $aSrcFile])] } { set written([file tail $aSrcFile]) 1 - append aFilesSection [osutils:vcxproj:cxxfile $aSrcFile $needparam] + append aFilesSection [osutils:vcxproj:cxxfile $aSrcFile $needparam 3] } else { puts "Warning : in vcproj more than one occurences for [file tail $aSrcFile]" } @@ -1807,6 +1900,16 @@ if { ! [info exists aVcFilesHxx($xlo)] } { lappend aVcFilesHxx(units) $xlo } lappend aVcFilesHxx($xlo) $aHxxFile } + foreach aGenFile [lsort $aGeneratedFiles] { + if { ![info exists written([file tail $aGenFile])] } { + set written([file tail $aGenFile]) 1 + append aFilesSection [osutils:vcxproj:cxxfile $aGenFile $needparam 5] + } else { + puts "Warning : in vcproj more than one occurences for [file tail $aGenFile]" + } + if { ! [info exists aVcFilesCxx($xlo)] } { lappend aVcFilesCxx(units) $xlo } + lappend aVcFilesCxx($xlo) $aGenFile + } } else { append aFilesSection "\t\t\t [array names map]" set LType $Tfiles(source,${utyp}) foreach typ [array names map] { @@ -1908,15 +2037,52 @@ } # Returns the list of all compilable files name in a toolkit. -proc osutils:tk:cxxfiles { tkloc thePlatform } { return [osutils:tk:files $tkloc [osutils:compilable $thePlatform]] } +proc osutils:tk:cxxfiles { tkloc thePlatform theSrcDir } { return [osutils:tk:files $tkloc [osutils:compilable $thePlatform] $theSrcDir] } + +# Returns the list of all header files name in a toolkit. +proc osutils:tk:hxxfiles { tkloc thePlatform theSrcDir } { return [osutils:tk:files $tkloc [osutils:fileExtensionsHeaders $thePlatform] $theSrcDir] } + +# Returns the list of all resource (qrc) files name in a toolkit. +proc osutils:tk:qrcfiles { tkloc thePlatform theSourceDir } { return [osutils:tk:files $tkloc [osutils:fileExtensionsResources $thePlatform] $theSourceDir] } + +# Returns the list of all header files name in a toolkit. +proc osutils:tk:mocfiles { HxxFiles theOutDir } { + set lret {} + foreach file $HxxFiles { + # processing only files where Q_OBJECT exists + set fd [open "$file" rb] + set FILES [split [read $fd] "\n"] + close $fd + + set isQObject [expr [regexp "Q_OBJECT" $FILES]] + if { ! $isQObject } { + continue; + } + lappend lret $file + } + return $lret +} # Returns the list of all header files name in a toolkit. -proc osutils:tk:hxxfiles { tkloc thePlatform } { return [osutils:tk:files $tkloc [osutils:fileExtensionsHeaders $thePlatform]] } +proc osutils:tk:execfiles { theFiles theOutDir theCommand thePrefix theExtension} { + set lret {} + set anOutDir $theOutDir/$thePrefix + file mkdir $anOutDir + + foreach file $theFiles { + set aResourceName [file tail $file] + set anOutFile $anOutDir/${thePrefix}_[file rootname $aResourceName].$theExtension + + exec $theCommand $file -o $anOutFile + lappend lret $anOutFile + } + return $lret +} # Generate Visual Studio project file for executable -proc osutils:vcprojx { theVcVer isUWP theOutDir theToolKit theGuidsMap } { +proc osutils:vcprojx { theVcVer isUWP theOutDir theToolKit theGuidsMap theSrcDir theSourceDirOther } { set aVcFiles {} - foreach f [osutils:tk:cxxfiles $theToolKit wnt] { + foreach f [osutils:tk:cxxfiles $theToolKit wnt $theSrcDir] { set aProjTmpl [osutils:vcproj:readtemplate $theVcVer $isUWP 1] set aProjName [file rootname [file tail $f]] @@ -1930,25 +2096,18 @@ regsub -all -- {__PROJECT_GUID__} $aProjTmpl $aGuidsMap($aProjName) aProjTmpl set aUsedLibs [list] - foreach tkx [osutils:commonUsedTK $theToolKit] { + foreach tkx [osutils:commonUsedTK $theToolKit $theSrcDir $theSourceDirOther] { lappend aUsedLibs "${tkx}.lib" } - osutils:usedOsLibs $theToolKit "wnt" aLibs aFrameworks - foreach aLibIter $aLibs { - lappend aUsedLibs "${aLibIter}.lib" - } + set anOsReleaseLibs {} + set anOsDebugLibs {} + osutils:usedOsLibs $theToolKit "wnt" anOsReleaseLibs aFrameworks $theSrcDir true + osutils:usedOsLibs $theToolKit "wnt" anOsDebugLibs aFrameworks $theSrcDir false - # correct names of referred third-party libraries that are named with suffix - # depending on VC version set aVCRTVer [string range $theVcVer 0 3] - regsub -all -- {vc[0-9]+} $aUsedLibs $aVCRTVer aUsedLibs - -# puts "$aProjName requires $aUsedLibs" - if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } { - set aUsedLibs [join $aUsedLibs {;}] - } - regsub -all -- {__TKDEP__} $aProjTmpl $aUsedLibs aProjTmpl + regsub -all -- {__TKDEP__} $aProjTmpl [osutils:depLibraries $aUsedLibs $anOsReleaseLibs $theVcVer] aProjTmpl + regsub -all -- {__TKDEP_DEBUG__} $aProjTmpl [osutils:depLibraries $aUsedLibs $anOsDebugLibs $theVcVer] aProjTmpl set aFilesSection "" set aVcFilesCxx(units) "" @@ -1958,7 +2117,7 @@ set written([file tail $f]) 1 if { "$theVcVer" != "vc7" && "$theVcVer" != "vc8" && "$theVcVer" != "vc9" } { - append aFilesSection [osutils:vcxproj:cxxfile $f ""] + append aFilesSection [osutils:vcxproj:cxxfile $f "" 3] if { ! [info exists aVcFilesCxx($theToolKit)] } { lappend aVcFilesCxx(units) $theToolKit } lappend aVcFilesCxx($theToolKit) $f } else { @@ -1969,7 +2128,7 @@ append aFilesSection "\t\t\t" } } else { - puts "Warning : in vcproj there are than one occurences for [file tail $f]" + puts "Warning : in vcproj there are more than one occurences for [file tail $f]" } #puts "$aProjTmpl $aFilesSection" set anIncPaths "..\\..\\..\\inc" @@ -2103,17 +2262,6 @@ } } -# remove from listloc OpenCascade units indesirables on Unix -proc osutils:justunix { listloc } { - if { "$::tcl_platform(os)" == "Darwin" } { - set goaway [list Xw WNT] - } else { - set goaway [list WNT] - } - return [osutils:juststation $goaway $listloc] -} - - ####### CODEBLOCK ################################################################### # Function to generate Code Blocks workspace and project files proc OS:MKCBP { theOutDir theModules theAllSolution thePlatform theCmpl } { @@ -2156,28 +2304,23 @@ set aTKSrcFiles [list] # collect list of referred libraries to link with - osutils:usedOsLibs $theToolKit $thePlatform aUsedLibs aFrameworks - set aDepToolkits [wokUtils:LIST:Purge [osutils:tk:close $theToolKit]] + osutils:usedOsLibs $theToolKit $thePlatform aUsedLibs aFrameworks "src" + set aDepToolkits [wokUtils:LIST:Purge [osutils:tk:close $theToolKit "src" ""]] foreach tkx $aDepToolkits { lappend aUsedLibs "${tkx}" } lappend anIncPaths "../../../inc" - set listloc [osutils:tk:units $theToolKit] + set listloc [osutils:tk:units $theToolKit "src"] if { [llength $listloc] == 0 } { set listloc $theToolKit } - if { $thePlatform == "wnt" || $thePlatform == "uwp" } { - set resultloc [osutils:justwnt $listloc] - } else { - set resultloc [osutils:justunix $listloc] - } if [array exists written] { unset written } - foreach fxlo $resultloc { + foreach fxlo $listloc { set xlo $fxlo - set aSrcFiles [osutils:tk:cxxfiles $xlo $thePlatform] + set aSrcFiles [osutils:tk:cxxfiles $xlo $thePlatform "src"] foreach aSrcFile [lsort $aSrcFiles] { if { ![info exists written([file tail $aSrcFile])] } { set written([file tail $aSrcFile]) 1 @@ -2209,8 +2352,8 @@ # collect list of projects to be created foreach aModule $theModules { # toolkits - foreach aToolKit [osutils:tk:sort [${aModule}:toolkits]] { - set aDependencies [LibToLink $aToolKit] + foreach aToolKit [osutils:tk:sort [${aModule}:toolkits] "src" ""] { + set aDependencies [LibToLink $aToolKit "src" ""] if { [llength $aDependencies] == 0 } { puts $aFile "\t\t" } else { @@ -2225,7 +2368,7 @@ # executables, assume one project per cxx file... foreach aUnit [OS:executable ${aModule}] { set aUnitLoc $aUnit - set src_files [_get_used_files $aUnit false] + set src_files [_get_used_files $aUnit "src" false] set aSrcFiles {} foreach s $src_files { regexp {source ([^\s]+)} $s dummy name @@ -2237,7 +2380,7 @@ set aPrjName [file rootname $aSrcFile] set aDependencies [list] if {[file isdirectory $path/src/$aUnitLoc]} { - set aDependencies [LibToLinkX $aUnitLoc [file rootname $aSrcFile]] + set aDependencies [LibToLinkX $aUnitLoc [file rootname $aSrcFile] "src" ""] } set anActiveState "" if { $isActiveSet == 0 } { @@ -2271,7 +2414,7 @@ set aWokArch "$::env(ARCH)" set aCbpFiles {} - foreach aSrcFile [osutils:tk:cxxfiles $theToolKit $thePlatform] { + foreach aSrcFile [osutils:tk:cxxfiles $theToolKit $thePlatform "src"] { # collect list of referred libraries to link with set aUsedLibs [list] set aFrameworks [list] @@ -2280,9 +2423,9 @@ set aTKSrcFiles [list] set aProjName [file rootname [file tail $aSrcFile]] - osutils:usedOsLibs $theToolKit $thePlatform aUsedLibs aFrameworks + osutils:usedOsLibs $theToolKit $thePlatform aUsedLibs aFrameworks "src" - set aDepToolkits [LibToLinkX $theToolKit $aProjName] + set aDepToolkits [LibToLinkX $theToolKit $aProjName "src" ""] foreach tkx $aDepToolkits { if {[_get_type $tkx] == "t"} { lappend aUsedLibs "${tkx}" @@ -2580,8 +2723,8 @@ } # Define libraries to link using only EXTERNLIB file -proc LibToLinkX {thePackage theDummyName} { - set aToolKits [LibToLink $thePackage] +proc LibToLinkX {thePackage theDummyName theSrcDir theSourceDirOther} { + set aToolKits [LibToLink $thePackage $theSrcDir $theSourceDirOther] return $aToolKits } @@ -2607,7 +2750,7 @@ set aBuff "" # Adding toolkits for module in workspace. - foreach aToolKit [osutils:tk:sort [${theModule}:toolkits]] { + foreach aToolKit [osutils:tk:sort [${theModule}:toolkits] "src" ""] { append aBuff " \n" append aBuff " \n" @@ -2616,7 +2759,7 @@ # Adding executables for module, assume one project per cxx file... foreach aUnit [OS:executable ${theModule}] { set aUnitLoc $aUnit - set src_files [_get_used_files $aUnit false] + set src_files [_get_used_files $aUnit "src" false] set aSrcFiles {} foreach s $src_files { regexp {source ([^\s]+)} $s dummy name @@ -2710,13 +2853,13 @@ upvar $theDepsRefGuids aDepsRefGuids set aBuildFileSection "" - set aUsedLibs [wokUtils:LIST:Purge [osutils:tk:close $theToolKit]] - set aDepToolkits [lappend [wokUtils:LIST:Purge [osutils:tk:close $theToolKit]] $theToolKit] + set aUsedLibs [wokUtils:LIST:Purge [osutils:tk:close $theToolKit "src" ""]] + set aDepToolkits [lappend [wokUtils:LIST:Purge [osutils:tk:close $theToolKit "src" ""]] $theToolKit] if { "$theTargetType" == "executable" } { - set aFile [osutils:tk:cxxfiles $theToolKit mac] + set aFile [osutils:tk:cxxfiles $theToolKit mac "src"] set aProjName [file rootname [file tail $aFile]] - set aDepToolkits [LibToLinkX $theToolKit $aProjName] + set aDepToolkits [LibToLinkX $theToolKit $aProjName "src" ""] } set aLibExt "dylib" @@ -2727,7 +2870,7 @@ } } - osutils:usedOsLibs $theToolKit $thePlatform aLibs aFrameworks + osutils:usedOsLibs $theToolKit $thePlatform aLibs aFrameworks "src" set aUsedLibs [concat $aUsedLibs $aLibs] set aUsedLibs [concat $aUsedLibs $aFrameworks] foreach tkx $aUsedLibs { @@ -2763,10 +2906,9 @@ upvar $theGuidsMap aGuidsMap upvar $theIncPaths anIncPaths - set listloc [osutils:tk:units $theToolKit] - set resultloc [osutils:justunix $listloc] + set listloc [osutils:tk:units $theToolKit "src"] set aBuildFileSection "" - set aPackages [lsort -nocase $resultloc] + set aPackages [lsort -nocase $listloc] if { "$theTargetType" == "executable" } { set aPackages [list "$theToolKit"] } @@ -2780,7 +2922,7 @@ set aGuidsMap($aPackage) [OS:genGUID "xcd"] } - set aSrcFiles [osutils:tk:cxxfiles $xlo mac] + set aSrcFiles [osutils:tk:cxxfiles $xlo mac "src"] foreach aSrcFile [lsort $aSrcFiles] { set aFileExt "sourcecode.cpp.cpp" @@ -3419,7 +3561,7 @@ } # Report all files found in package directory but not listed in FILES -proc osutils:checksrcfiles { theUnit } { +proc osutils:checksrcfiles { theUnit theSrcDir} { global path set aCasRoot [file normalize ${path}] @@ -3428,7 +3570,7 @@ return } - set anUnitAbsPath [file normalize "${aCasRoot}/src/${theUnit}"] + set anUnitAbsPath [file normalize "${aCasRoot}/$theSrcDir/${theUnit}"] if {[file exists "${anUnitAbsPath}/FILES"]} { set aFilesFile [open "${anUnitAbsPath}/FILES" rb] @@ -3443,6 +3585,9 @@ if { "${aFile}" == "FILES" } { continue } + if { "${aFile}" == "icons" } { + continue + } if { [lsearch -exact ${aFilesFileList} ${aFile}] == -1 } { puts "Warning: file ${anUnitAbsPath}/${aFile} is not listed in ${anUnitAbsPath}/FILES!" } diff -Nru opencascade-7.4.1+dfsg1/adm/occaux.tcl opencascade-7.5.1+dfsg1/adm/occaux.tcl --- opencascade-7.4.1+dfsg1/adm/occaux.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/occaux.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -179,8 +179,10 @@ } if {"$is_win" == "yes"} { set exe ".exe" + set com ".com" } else { set exe "" + set com "" } set g_flag "no" @@ -224,11 +226,11 @@ } } if {$i_flag == "no"} { - if { [file exists $path/inkscape$exe] } { + if { [file exists $path/inkscape$com] } { catch { exec $path/inkscape -V } version puts "Info: $version " puts " found in $path." - set inkscape_path "$path/inkscape$exe" + set inkscape_path "$path/inkscape$com" set i_flag "yes" } } @@ -356,15 +358,29 @@ # Convert SVG files to PDF format to allow including them to PDF # (requires InkScape to be in PATH) proc OCCDoc_ProcessSvg {latexDir verboseMode} { + set anSvgList [glob -nocomplain $latexDir/*.svg] + if { $anSvgList == {} } { + return + } - foreach file [glob -nocomplain $latexDir/*.svg] { + catch { exec inkscape -V } anInkVer + set isOldSyntax 0 + if {[string match "Inkscape 0.*" $anInkVer]} { set isOldSyntax 1 } + foreach file $anSvgList { if {$verboseMode == "YES"} { puts "Info: Converting file $file..." } set pdffile "[file rootname $file].pdf" - if { [catch {exec inkscape -z -D --file=$file --export-pdf=$pdffile} res] } { - #puts "Error: $res." - return + if { $isOldSyntax == 1 } { + if { [catch {exec inkscape -z -D --file=$file --export-pdf=$pdffile} res] } { + #puts "Error: $res." + return + } + } else { + if { [catch {exec inkscape $file --export-area-drawing --export-type=pdf --export-filename=$pdffile} res] } { + #puts "Error: $res." + return + } } } } @@ -899,4 +915,4 @@ file delete -force $TEX file rename $TMPFILENAME $TEX } -} \ No newline at end of file +} diff -Nru opencascade-7.4.1+dfsg1/adm/qmake/OccToolkit.pri opencascade-7.5.1+dfsg1/adm/qmake/OccToolkit.pri --- opencascade-7.4.1+dfsg1/adm/qmake/OccToolkit.pri 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/qmake/OccToolkit.pri 2021-02-02 08:51:56.000000000 +0000 @@ -77,8 +77,8 @@ # Define the list of standard OCCT file extensions aHxxRegex = ^.*\.(hxx|h|lxx|gxx)$ aPxxRegex = ^.*\.(pxx)$ -aCxxRegex = ^.*\.(cxx|c)$ -mac { aCxxRegex = ^.*\.(cxx|c|m|mm)$ } +aCxxRegex = ^.*\.(cxx|cpp|c)$ +mac { aCxxRegex = ^.*\.(cxx|cpp|c|m|mm)$ } # Auxiliary function for probing file extension defineTest (occCheckExtension) { diff -Nru opencascade-7.4.1+dfsg1/adm/RESOURCES opencascade-7.5.1+dfsg1/adm/RESOURCES --- opencascade-7.4.1+dfsg1/adm/RESOURCES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/RESOURCES 2021-02-02 08:51:56.000000000 +0000 @@ -3,6 +3,7 @@ SHMessage Textures Shaders +XRResources XSMessage XSTEPResource XmlOcafResource diff -Nru opencascade-7.4.1+dfsg1/adm/SAMPLES opencascade-7.5.1+dfsg1/adm/SAMPLES --- opencascade-7.4.1+dfsg1/adm/SAMPLES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/SAMPLES 2021-02-02 08:51:56.000000000 +0000 @@ -1 +1 @@ -qt AndroidQt FuncDemo IESample Tutorial \ No newline at end of file +qt AndroidQt FuncDemo IESample Tutorial OCCTOverview \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/adm/SAMPLES_RESOURCES opencascade-7.5.1+dfsg1/adm/SAMPLES_RESOURCES --- opencascade-7.4.1+dfsg1/adm/SAMPLES_RESOURCES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/SAMPLES_RESOURCES 2021-02-02 08:51:56.000000000 +0000 @@ -1,2 +1,3 @@ qt/Common/res/ -qt/Tutorial/res/ \ No newline at end of file +qt/Tutorial/res/ +qt/OCCTOverview/res/ \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/android_build.bat opencascade-7.5.1+dfsg1/adm/scripts/android_build.bat --- opencascade-7.4.1+dfsg1/adm/scripts/android_build.bat 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/android_build.bat 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,234 @@ +@echo OFF + +rem Auxiliary script for semi-automated building of OCCT for Android platform. +rem android_custom.bat should be configured with paths +rem to CMake, 3rd-parties, Android NDK and MinGW make tool. + +set "aCasSrc=%~dp0..\.." +set "aBuildRoot=%aCasSrc%\work" + +set aNbJobs=%NUMBER_OF_PROCESSORS% + +rem Paths to 3rd-party tools and libraries +set "anNdkPath=" +set "aFreeType=" +set "aRapidJson=" + +rem Build stages to perform +set "toCMake=1" +set "toClean=0" +set "toMake=1" +set "toInstall=1" +set "toPack=1" +set "isStatic=0" + +rem Minimal Android platform and CPU architectures +set "anNdkApiLevel=21" +set "anNdkAbiList=armeabi-v7a x86 arm64-v8a x86_64" + +rem OCCT Modules to build +set "BUILD_ModelingData=ON" +set "BUILD_ModelingAlgorithms=ON" +set "BUILD_Visualization=ON" +set "BUILD_ApplicationFramework=ON" +set "BUILD_DataExchange=ON" + +rem Optional 3rd-party libraries to enable +set USE_RAPIDJSON=OFF + +rem Archive tool +set "THE_7Z_PARAMS=-t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on" +set "THE_7Z_PATH=%ProgramW6432%\7-Zip\7z.exe" + +rem Configuration file +if exist "%~dp0android_custom.bat" call "%~dp0android_custom.bat" + +set "aCompiler=gcc" +set "aCppLib=gnustl_shared" +if not exist "%anNdkPath%/sources/cxx-stl/gnu-libstdc++" ( + if exist "%anNdkPath%/sources/cxx-stl/llvm-libc++" ( + set "aCompiler=clang" + set "aCppLib=c++_shared" + ) +) +set "aLibType=Shared" +if ["%isStatic%"] == ["1"] set "aLibType=Static" +set "aDestDir=%aBuildRoot%\android-%aCompiler%" + +set "anOcctVerSuffix=" +set "anOcctVersion=0.0.0" +set "aGitBranch=" +for /f tokens^=2^ delims^=^" %%i in ('findstr /b /c:"#define OCC_VERSION_DEVELOPMENT" "%aCasSrc%\src\Standard\Standard_Version.hxx"') do ( set "anOcctVerSuffix=%%i" ) +for /f tokens^=2^ delims^=^" %%i in ('findstr /b /c:"#define OCC_VERSION_COMPLETE" "%aCasSrc%\src\Standard\Standard_Version.hxx"') do ( set "anOcctVersion=%%i" ) +for /f %%i in ('git symbolic-ref --short HEAD') do ( set "aGitBranch=%%i" ) + +for %%s in (%anNdkAbiList%) do ( + call :cmakeGenerate "%anNdkApiLevel%" "%%s" +) + +for /F "skip=1 delims=" %%F in (' + wmic PATH Win32_LocalTime GET Day^,Month^,Year /FORMAT:TABLE +') do ( + for /F "tokens=1-3" %%L in ("%%F") do ( + set DAY00=0%%L + set MONTH00=0%%M + set YEAR=%%N + ) +) +set DAY00=%DAY00:~-2% +set MONTH00=%MONTH00:~-2% +set "aRevision=-%YEAR%-%MONTH00%-%DAY00%" +rem set "aRevision=-%aGitBranch%" +set "anArchName=occt-%anOcctVersion%%anOcctVerSuffix%%aRevision%-android" +set "aTarget=%aBuildRoot%\%anArchName%" +if ["%toPack%"] == ["1"] ( + echo Creating archive %anArchName%.7z + rmdir /S /Q "%aTarget%" + if not exist "%aTarget%" ( mkdir "%aTarget%" ) + if exist "%aBuildRoot%/%anArchName%.7z" del "%aBuildRoot%/%anArchName%.7z" + xcopy /S /Y "%aDestDir%\*" "%aTarget%\" + + "%THE_7Z_PATH%" a -r %THE_7Z_PARAMS% "%aBuildRoot%/%anArchName%.7z" "%aTarget%" +) +if not ["%1"] == ["-nopause"] ( + pause +) + +goto :eof + +:cmakeGenerate +set "anApi=%~1" +set "anAbi=%~2" +set "aPlatformAndCompiler=android-%anAbi%-%aCompiler%" +set "aWorkDir=%aBuildRoot%\%aPlatformAndCompiler%-make" +set "aLogFile=%aBuildRoot%\build-%aPlatformAndCompiler%.log" +if not exist "%aWorkDir%" ( mkdir "%aWorkDir%" ) +if exist "%aLogFile%" ( del "%aLogFile%" ) + +rem include some information about OCCT into archive +echo ^> "%aWorkDir%\VERSION.html" +git status >> "%aWorkDir%\VERSION.html" +git log -n 100 >> "%aWorkDir%\VERSION.html" +echo ^>> "%aWorkDir%\VERSION.html" + +echo Start building OCCT for %aPlatformAndCompiler% +echo Start building OCCT for %aPlatformAndCompiler%>> %aLogFile% + +pushd "%aWorkDir%" + +set "aTimeZERO=%TIME%" +if ["%toCMake%"] == ["1"] ( + echo Configuring OCCT for Android %anAbi%, API level %anApi%... + cmake -G "MinGW Makefiles" ^ + -D CMAKE_SYSTEM_NAME:STRING="Android" ^ + -D CMAKE_ANDROID_NDK="%anNdkPath%" ^ + -D CMAKE_BUILD_TYPE:STRING="Release" ^ + -D CMAKE_ANDROID_ARCH_ABI:STRING="%anAbi%" ^ + -D CMAKE_SYSTEM_VERSION:STRING="%anApi%" ^ + -D CMAKE_ANDROID_STL_TYPE="%aCppLib%" ^ + -D BUILD_LIBRARY_TYPE:STRING="%aLibType%" ^ + -D INSTALL_DIR:PATH="%aDestDir%" ^ + -D INSTALL_DIR_INCLUDE:STRING="inc" ^ + -D INSTALL_DIR_LIB:STRING="libs/%anAbi%" ^ + -D INSTALL_DIR_CMAKE:STRING="libs/%anAbi%/cmake/opencascade" ^ + -D INSTALL_DIR_RESOURCE:STRING="src" ^ + -D BUILD_MODULE_FoundationClasses:BOOL="ON" ^ + -D BUILD_MODULE_ModelingData:BOOL="%BUILD_ModelingData%" ^ + -D BUILD_MODULE_ModelingAlgorithms:BOOL="%BUILD_ModelingAlgorithms%" ^ + -D BUILD_MODULE_Visualization:BOOL="%BUILD_Visualization%" ^ + -D BUILD_MODULE_ApplicationFramework:BOOL="%BUILD_ApplicationFramework%" ^ + -D BUILD_MODULE_DataExchange:BOOL="%BUILD_DataExchange%" ^ + -D BUILD_MODULE_Draw:BOOL="OFF" ^ + -D BUILD_DOC_Overview:BOOL="OFF" ^ + -D 3RDPARTY_FREETYPE_DIR:PATH="%aFreeType%" ^ + -D 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2:FILEPATH="%aFreeType%/include" ^ + -D 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build:FILEPATH="%aFreeType%/include" ^ + -D 3RDPARTY_FREETYPE_LIBRARY_DIR:PATH="%aFreeType%/libs/%anAbi%" ^ + -D 3RDPARTY_FREETYPE_LIBRARY:FILEPATH="%aFreeType%/libs/%anAbi%/libfreetype.so" ^ + -D USE_RAPIDJSON:BOOL="%USE_RAPIDJSON%" ^ + -D 3RDPARTY_RAPIDJSON_DIR:PATH="%aRapidJson%" ^ + -D 3RDPARTY_RAPIDJSON_INCLUDE_DIR:PATH="%aRapidJson%/include" ^ + "%aCasSrc%" + + if errorlevel 1 ( + popd + exit /B 1 + goto :eof + ) +) +set aTimeGEN=%TIME% +call :computeDuration %aTimeZERO% %aTimeGEN% +if ["%toCMake%"] == ["1"] ( + echo Generation time: %DURATION% + echo Generation time: %DURATION%>> "%aLogFile%" +) + +if ["%toClean%"] == ["1"] ( + mingw32-make clean +) + +if ["%toMake%"] == ["1"] ( + echo Building... + mingw32-make -j %aNbJobs% 2>> "%aLogFile%" + if errorlevel 1 ( + type "%aLogFile%" + popd + exit /B 1 + goto :eof + ) + type "%aLogFile%" +) +set aTimeBUILD=%TIME% +call :computeDuration %aTimeGEN% %aTimeBUILD% +if ["%toMake%"] == ["1"] ( + echo Building time: %DURATION% + echo Building time: %DURATION%>> "%aLogFile%" +) +call :computeDuration %aTimeZERO% %aTimeBUILD% +if ["%toMake%"] == ["1"] ( + echo Total building time: %DURATION% + echo Total building time: %DURATION%>> "%aLogFile%" +) + +if ["%toInstall%"] == ["1"] ( + echo Installing into %aDestDir%... + mingw32-make install 2>> "%aLogFile%" + copy /Y "%aWorkDir%\VERSION.html" "%aDestDir%\VERSION.html" +) +set "aTimeINSTALL=%TIME%" +call :computeDuration "%aTimeBUILD%" "%aTimeINSTALL%" +if ["%toInstall%"] == ["1"] ( + echo Install time: %DURATION% + echo Install time: %DURATION%>> "%aLogFile%" +) + +call :computeDuration "%aTimeZERO%" "%aTimeINSTALL%" +echo Total time: %DURATION% +echo Total time: %DURATION%>> "%aLogFile%" + +popd +goto :eof + +:computeDuration +set "aTimeFrom=%~1" +set "aTimeEnd=%~2" +rem handle time before 10AM (win10 - remove empty space at the beginning) +if "%aTimeFrom:~0,1%"==" " set "aTimeFrom=%aTimeFrom:~1%" +if "%aTimeEnd:~0,1%"==" " set "aTimeEnd=%aTimeEnd:~1%" +rem handle time before 10AM (win7 - add 0 at the beginning) +if "%aTimeFrom:~1,1%"==":" set "aTimeFrom=0%aTimeFrom%" +if "%aTimeEnd:~1,1%"==":" set "aTimeEnd=0%aTimeEnd%" +rem convert hours:minutes:seconds:ms into duration +set /A aTimeFrom=(1%aTimeFrom:~0,2%-100)*360000 + (1%aTimeFrom:~3,2%-100)*6000 + (1%aTimeFrom:~6,2%-100)*100 + (1%aTimeFrom:~9,2%-100) +set /A aTimeEnd= (1%aTimeEnd:~0,2%-100)*360000 + (1%aTimeEnd:~3,2%-100)*6000 + (1%aTimeEnd:~6,2%-100)*100 + (1%aTimeEnd:~9,2%-100) +set /A aDurTotalSec=%aTimeEnd%-%aTimeFrom% +if %aTimeEnd% LSS %aTimeFrom% set set /A aDurTotalSec=%aTimeFrom%-%aTimeEnd% +set /A aDurHH=%aDurTotalSec% / 360000 +set /A aDurMM=(%aDurTotalSec% - %aDurHH%*360000) / 6000 +set /A aDurSS=(%aDurTotalSec% - %aDurHH%*360000 - %aDurMM%*6000) / 100 +if %aDurHH% LSS 10 set aDurHH=0%aDurHH% +if %aDurMM% LSS 10 set aDurMM=0%aDurMM% +if %aDurSS% LSS 10 set aDurSS=0%aDurSS% + +set "DURATION=%aDurHH%:%aDurMM%:%aDurSS%" +goto :eof diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/android_custom.bat.template opencascade-7.5.1+dfsg1/adm/scripts/android_custom.bat.template --- opencascade-7.4.1+dfsg1/adm/scripts/android_custom.bat.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/android_custom.bat.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,31 @@ +rem Environment configuration template for android_build.bat (to be renamed as android_custom.bat) + +rem Paths to 3rd-party tools and libraries +rem call c:\TDM-GCC-64\mingwvars.bat +rem set "PATH=c:\CMake\bin;%PATH%" +rem set "anNdkPath=c:/android-ndk-r12" +rem set "aFreeType=c:/freetype-2.7.1-android" +rem set "aRapidJson=c:/rapidjson-1.1.0" + +rem Uncomment to customize building steps +rem set "aBuildRoot=%~dp0..\..\work" +rem set "toCMake=1" +rem set "toClean=0" +rem set "toMake=1" +rem set "toInstall=1" +rem set "toPack=1" +rem set "isStatic=0" + +rem Minimal Android platform and CPU architectures +rem set "anNdkApiLevel=21" +rem set "anNdkAbiList=arm64-v8a x86_64" + +rem OCCT Modules to build +rem set "BUILD_ModelingData=ON" +rem set "BUILD_ModelingAlgorithms=ON" +rem set "BUILD_Visualization=ON" +rem set "BUILD_ApplicationFramework=ON" +rem set "BUILD_DataExchange=ON" + +rem Optional 3rd-party libraries to enable +rem set USE_RAPIDJSON=ON diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/cmake_custom.bat.template opencascade-7.5.1+dfsg1/adm/scripts/cmake_custom.bat.template --- opencascade-7.4.1+dfsg1/adm/scripts/cmake_custom.bat.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/cmake_custom.bat.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,46 @@ +rem Environment configuration template for cmake_gen.bat (to be renamed as cmake_gen_custom.bat) + +set "OCCT3RDPARTY=%SrcRoot%\..\3rdparty" + +set VS=14 +set VSDATA=2015 + +rem Leave VSPLATFORM empty to build for x86 platform +set VSPLATFORM=Win64 + +rem ------------------------------------ +rem Uncomment to customize building steps +rem ------------------------------------ + +rem set "BUILD_DIR=build-vs%VS%-%VSPLATFORM%" +rem set "INSTALL_DIR=%SrcRoot%\install" + +rem set BUILD_DOC_Overview=OFF +rem set BUILD_Inspector=OFF +rem set BUILD_LIBRARY_TYPE=Shared +rem set BUILD_RELEASE_DISABLE_EXCEPTIONS=ON +rem set BUILD_WITH_DEBUG=OFF +rem set BUILD_ENABLE_FPE_SIGNAL_HANDLER=ON +rem set BUILD_USE_PCH=OFF + +rem Use semicolon-separated list of toolkits if you want to disable all modules +rem and build only some toolkits. +rem set BUILD_ADDITIONAL_TOOLKITS= + +rem Set a directory recognized as a patch for OCCT. +rem set BUILD_PATCH= + +rem set BUILD_MODULE_ApplicationFramework=ON +rem set BUILD_MODULE_DataExchange=ON +rem set BUILD_MODULE_Draw=ON +rem set BUILD_MODULE_ModelingAlgorithms=ON +rem set BUILD_MODULE_ModelingData=ON +rem set BUILD_MODULE_Visualization=ON + +rem set USE_D3D=OFF +rem set USE_FFMPEG=OFF +rem set USE_FREEIMAGE=OFF +rem set USE_GLES2=OFF +rem set USE_RAPIDJSON=OFF +rem set USE_TBB=OFF +rem set USE_VTK=OFF diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/cmake_custom.sh.template opencascade-7.5.1+dfsg1/adm/scripts/cmake_custom.sh.template --- opencascade-7.4.1+dfsg1/adm/scripts/cmake_custom.sh.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/cmake_custom.sh.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,42 @@ +# Environment configuration template for cmake_gen.sh (to be renamed as cmake_gen_custom.sh) + +OCCT3RDPARTY="$SrcRoot/../3rdparty" +FREETYPE_DIR="$OCCT3RDPARTY/freetype-2.7.1" + +# ------------------------------------ +# Uncomment to customize building steps +# ------------------------------------ + +#BUILD_DIR=build +#INSTALL_DIR="$SrcRoot/install" + +#BUILD_DOC_Overview=OFF +#BUILD_Inspector=OFF +#BUILD_LIBRARY_TYPE=Shared +#BUILD_RELEASE_DISABLE_EXCEPTIONS=ON +#BUILD_WITH_DEBUG=OFF +#BUILD_ENABLE_FPE_SIGNAL_HANDLER=ON + +# Use semicolon-separated list of toolkits if you want to disable all modules +# and build only some toolkits. +#BUILD_ADDITIONAL_TOOLKITS= + +# Set a directory recognized as a patch for OCCT. +#BUILD_PATCH= + +#BUILD_MODULE_ApplicationFramework=ON +#BUILD_MODULE_DataExchange=ON +#BUILD_MODULE_Draw=ON +#BUILD_MODULE_ModelingAlgorithms=ON +#BUILD_MODULE_ModelingData=ON +#BUILD_MODULE_Visualization=ON + +#USE_FFMPEG=OFF +#USE_FREEIMAGE=OFF +#USE_GLES2=OFF +#USE_RAPIDJSON=OFF +#USE_TBB=OFF +#USE_VTK=OFF + +# This is to add any additional arguments to cmake +#AUX_ARGS= diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/cmake_gen.bat opencascade-7.5.1+dfsg1/adm/scripts/cmake_gen.bat --- opencascade-7.4.1+dfsg1/adm/scripts/cmake_gen.bat 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/cmake_gen.bat 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,83 @@ +@echo off + +rem Auxiliary script for semi-automated building of OCCT using cmake. +rem cmake_custom.bat should be configured with VS version and path to 3rd-parties. +rem OCCT3RDPARTY must be specified as mandatory dependency. + +setlocal + +set "SrcRoot=%~dp0..\.." + +set VS=14 +set VSDATA=2015 +set VSPLATFORM=Win64 +set "BUILD_DIR=build-vs%VS%-%VSPLATFORM%" +set "INSTALL_DIR=%SrcRoot%\install" + +set BUILD_ADDITIONAL_TOOLKITS= +set BUILD_DOC_Overview=OFF +set BUILD_Inspector=OFF +set BUILD_LIBRARY_TYPE=Shared +set BUILD_PATCH= +set BUILD_RELEASE_DISABLE_EXCEPTIONS=ON +set BUILD_WITH_DEBUG=OFF +set BUILD_ENABLE_FPE_SIGNAL_HANDLER=ON +set BUILD_USE_PCH=OFF + +set BUILD_MODULE_ApplicationFramework=ON +set BUILD_MODULE_DataExchange=ON +set BUILD_MODULE_Draw=ON +set BUILD_MODULE_ModelingAlgorithms=ON +set BUILD_MODULE_ModelingData=ON +set BUILD_MODULE_Visualization=ON + +set USE_D3D=OFF +set USE_FFMPEG=OFF +set USE_FREEIMAGE=OFF +set USE_GLES2=OFF +set USE_RAPIDJSON=OFF +set USE_TBB=OFF +set USE_VTK=OFF + +if exist "%~dp0cmake_custom.bat" call "%~dp0cmake_custom.bat" + +if not "%VSPLATFORM%"=="" set "arch_compile=Visual Studio %VS% %VSDATA% %VSPLATFORM%" +if "%VSPLATFORM%"=="" set "arch_compile=Visual Studio %VS% %VSDATA%" + +set "INSTALL_DIR=%INSTALL_DIR:\=/%" +set "OCCT3RDPARTY=%OCCT3RDPARTY:\=/%" + +set "BUILD_DIR=%SrcRoot%\%BUILD_DIR%" +if not exist "%BUILD_DIR%" mkdir "%BUILD_DIR%" +pushd "%BUILD_DIR%" + +cmake -G "%arch_compile%" ^ + -D 3RDPARTY_DIR:STRING="%OCCT3RDPARTY%" ^ + -D BUILD_ADDITIONAL_TOOLKITS:STRING="%BUILD_ADDITIONAL_TOOLKITS%" ^ + -D BUILD_DOC_Overview:BOOL=%BUILD_DOC_Overview% ^ + -D BUILD_Inspector:BOOL=%BUILD_Inspector% ^ + -D BUILD_LIBRARY_TYPE:STRING=%BUILD_LIBRARY_TYPE% ^ + -D BUILD_MODULE_ApplicationFramework:BOOL=%BUILD_MODULE_ApplicationFramework% ^ + -D BUILD_MODULE_DataExchange:BOOL=%BUILD_MODULE_DataExchange% ^ + -D BUILD_MODULE_Draw:BOOL=%BUILD_MODULE_Draw% ^ + -D BUILD_MODULE_FoundationClasses:BOOL=ON ^ + -D BUILD_MODULE_ModelingAlgorithms:BOOL=%BUILD_MODULE_ModelingAlgorithms% ^ + -D BUILD_MODULE_ModelingData:BOOL=%BUILD_MODULE_ModelingData% ^ + -D BUILD_MODULE_Visualization:BOOL=%BUILD_MODULE_Visualization% ^ + -D BUILD_PATCH:PATH="%BUILD_PATCH%" ^ + -D BUILD_RELEASE_DISABLE_EXCEPTIONS:BOOL=%BUILD_RELEASE_DISABLE_EXCEPTIONS% ^ + -D BUILD_WITH_DEBUG:BOOL=%BUILD_WITH_DEBUG% ^ + -D BUILD_ENABLE_FPE_SIGNAL_HANDLER:BOOL=%BUILD_ENABLE_FPE_SIGNAL_HANDLER% ^ + -D BUILD_USE_PCH:BOOL=%BUILD_USE_PCH% ^ + -D INSTALL_DIR:PATH="%INSTALL_DIR%" ^ + -D USE_D3D:BOOL=%USE_D3D% ^ + -D USE_FFMPEG:BOOL=%USE_FFMPEG% ^ + -D USE_FREEIMAGE:BOOL=%USE_FREEIMAGE% ^ + -D USE_GLES2:BOOL=%USE_GLES2% ^ + -D USE_RAPIDJSON:BOOL=%USE_RAPIDJSON% ^ + -D USE_TBB:BOOL=%USE_TBB% ^ + -D USE_VTK:BOOL=%USE_VTK% ^ + "%SrcRoot%" + +popd +endlocal diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/cmake_gen.sh opencascade-7.5.1+dfsg1/adm/scripts/cmake_gen.sh --- opencascade-7.4.1+dfsg1/adm/scripts/cmake_gen.sh 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/cmake_gen.sh 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,86 @@ +#!/bin/bash + +# Auxiliary script for semi-automated building of OCCT using cmake. +# cmake_custom.sh should be configured with path to 3rd-parties. +# OCCT3RDPARTY and FREETYPE_DIR must be specified as mandatory dependencies. + +ScriptDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +SrcRoot="${ScriptDir}/../.." + +INSTALL_DIR="$SrcRoot/install" + +BUILD_DIR=build +DEB= +CMAKE_BUILD_TYPE=Release +if [ "$1" = "-d" ]; then + DEB=d + BUILD_DIR=${BUILD_DIR}-deb + CMAKE_BUILD_TYPE=Debug +fi +INSTALL_DIR_BIN=lin64/gcc/bin$DEB +INSTALL_DIR_LIB=lin64/gcc/lib$DEB + +BUILD_ADDITIONAL_TOOLKITS= +BUILD_DOC_Overview=OFF +BUILD_Inspector=OFF +BUILD_LIBRARY_TYPE=Shared +BUILD_PATCH= +BUILD_RELEASE_DISABLE_EXCEPTIONS=ON +BUILD_WITH_DEBUG=OFF +BUILD_ENABLE_FPE_SIGNAL_HANDLER=ON + +BUILD_MODULE_ApplicationFramework=ON +BUILD_MODULE_DataExchange=ON +BUILD_MODULE_Draw=ON +BUILD_MODULE_ModelingAlgorithms=ON +BUILD_MODULE_ModelingData=ON +BUILD_MODULE_Visualization=ON + +USE_FFMPEG=OFF +USE_FREEIMAGE=OFF +USE_GLES2=OFF +USE_RAPIDJSON=OFF +USE_TBB=OFF +USE_VTK=OFF +AUX_ARGS= + +if [ -f "${ScriptDir}/cmake_custom.sh" ]; then + . "${ScriptDir}/cmake_custom.sh" +fi + +BUILD_DIR="$SrcRoot/$BUILD_DIR" +if [ ! -d "$BUILD_DIR" ]; then mkdir -p "$BUILD_DIR"; fi +pushd "$BUILD_DIR" + +cmake -G "Unix Makefiles" \ + -D CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \ + -D 3RDPARTY_DIR:PATH="$OCCT3RDPARTY" \ + -D 3RDPARTY_FREETYPE_DIR:PATH="$FREETYPE_DIR" \ + -D BUILD_ADDITIONAL_TOOLKITS:STRING="$BUILD_ADDITIONAL_TOOLKITS" \ + -D BUILD_DOC_Overview:BOOL=$BUILD_DOC_Overview \ + -D BUILD_Inspector:BOOL=$BUILD_Inspector \ + -D BUILD_LIBRARY_TYPE:STRING=$BUILD_LIBRARY_TYPE \ + -D BUILD_MODULE_ApplicationFramework:BOOL=$BUILD_MODULE_ApplicationFramework \ + -D BUILD_MODULE_DataExchange:BOOL=$BUILD_MODULE_DataExchange \ + -D BUILD_MODULE_Draw:BOOL=$BUILD_MODULE_Draw \ + -D BUILD_MODULE_FoundationClasses:BOOL=ON \ + -D BUILD_MODULE_ModelingAlgorithms:BOOL=$BUILD_MODULE_ModelingAlgorithms \ + -D BUILD_MODULE_ModelingData:BOOL=$BUILD_MODULE_ModelingData \ + -D BUILD_MODULE_Visualization:BOOL=$BUILD_MODULE_Visualization \ + -D BUILD_PATCH:PATH="$BUILD_PATCH" \ + -D BUILD_RELEASE_DISABLE_EXCEPTIONS:BOOL=$BUILD_RELEASE_DISABLE_EXCEPTIONS \ + -D BUILD_WITH_DEBUG:BOOL=$BUILD_WITH_DEBUG \ + -D BUILD_ENABLE_FPE_SIGNAL_HANDLER:BOOL=$BUILD_ENABLE_FPE_SIGNAL_HANDLER \ + -D INSTALL_DIR:PATH="$INSTALL_DIR" \ + -D INSTALL_DIR_LAYOUT:STRING=Windows \ + -D INSTALL_DIR_BIN:STRING=$INSTALL_DIR_BIN \ + -D INSTALL_DIR_LIB:STRING=$INSTALL_DIR_LIB \ + -D USE_FFMPEG:BOOL=$USE_FFMPEG \ + -D USE_FREEIMAGE:BOOL=$USE_FREEIMAGE \ + -D USE_GLES2:BOOL=$USE_GLES2 \ + -D USE_RAPIDJSON:BOOL=$USE_RAPIDJSON \ + -D USE_TBB:BOOL=$USE_TBB \ + -D USE_VTK:BOOL=$USE_VTK \ + $AUX_ARGS "$SrcRoot" + +popd diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/.gitignore opencascade-7.5.1+dfsg1/adm/scripts/.gitignore --- opencascade-7.4.1+dfsg1/adm/scripts/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/.gitignore 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2 @@ +*custom.bat +*custom.sh diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/wasm_build.bat opencascade-7.5.1+dfsg1/adm/scripts/wasm_build.bat --- opencascade-7.4.1+dfsg1/adm/scripts/wasm_build.bat 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/wasm_build.bat 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,165 @@ +@echo OFF + +rem Auxiliary script for semi-automated building of OCCT for WASM platform. +rem wasm_custom.bat should be configured with paths to CMake, 3rd-parties and Emscripten SDK. +rem FreeType should be specified as mandatory dependency. + +set "aSrcRoot=%~dp0..\.." +set "aBuildRoot=work" + +set aNbJobs=%NUMBER_OF_PROCESSORS% + +set "toCMake=1" +set "toClean=0" +set "toMake=1" +set "toInstall=1" + +set "BUILD_ModelingData=ON" +set "BUILD_ModelingAlgorithms=ON" +set "BUILD_Visualization=ON" +set "BUILD_ApplicationFramework=ON" +set "BUILD_DataExchange=ON" + +rem Configuration file +if exist "%~dp0wasm_custom.bat" call "%~dp0wasm_custom.bat" + +call "%EMSDK_ROOT%\emsdk_env.bat" +set "aToolchain=%EMSDK%/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" + +set "anOcctVerSuffix=" +set "anOcctVersion=0.0.0" +set "aGitBranch=" +for /f tokens^=2^ delims^=^" %%i in ('findstr /b /c:"#define OCC_VERSION_DEVELOPMENT" "%aSrcRoot%\src\Standard\Standard_Version.hxx"') do ( set "anOcctVerSuffix=%%i" ) +for /f tokens^=2^ delims^=^" %%i in ('findstr /b /c:"#define OCC_VERSION_COMPLETE" "%aSrcRoot%\src\Standard\Standard_Version.hxx"') do ( set "anOcctVersion=%%i" ) +for /f %%i in ('git symbolic-ref --short HEAD') do ( set "aGitBranch=%%i" ) + +call :cmakeGenerate +if not ["%1"] == ["-nopause"] ( + pause +) + +goto :eof + +:cmakeGenerate +set "aPlatformAndCompiler=wasm" +set "aWorkDir=%aSrcRoot%\%aBuildRoot%\%aPlatformAndCompiler%-make" +set "aDestDir=%aSrcRoot%\%aBuildRoot%\%aPlatformAndCompiler%" +set "aLogFile=%aSrcRoot%\%aBuildRoot%\build-%aPlatformAndCompiler%.log" +if not exist "%aWorkDir%" ( mkdir "%aWorkDir%" ) +if exist "%aLogFile%" ( del "%aLogFile%" ) + +rem include some information about OCCT into archive +echo ^> "%aWorkDir%\VERSION.html" +git status >> "%aWorkDir%\VERSION.html" +git log -n 100 >> "%aWorkDir%\VERSION.html" +echo ^>> "%aWorkDir%\VERSION.html" + +echo Start building OCCT for %aPlatformAndCompiler% +echo Start building OCCT for %aPlatformAndCompiler%>> %aLogFile% + +pushd "%aWorkDir%" + +set aTimeZERO=%TIME% +if ["%toCMake%"] == ["1"] ( + echo "Configuring OCCT for WASM..." + cmake -G "MinGW Makefiles" ^ + -D CMAKE_TOOLCHAIN_FILE:FILEPATH="%aToolchain%" ^ + -D CMAKE_BUILD_TYPE:STRING="Release" ^ + -D BUILD_LIBRARY_TYPE:STRING="Static" ^ + -D INSTALL_DIR:PATH="%aDestDir%" ^ + -D INSTALL_DIR_INCLUDE:STRING="inc" ^ + -D INSTALL_DIR_RESOURCE:STRING="src" ^ + -D 3RDPARTY_FREETYPE_DIR:PATH="%aFreeType%" ^ + -D 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2:FILEPATH="%aFreeType%/include" ^ + -D 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build:FILEPATH="%aFreeType%/include" ^ + -D BUILD_MODULE_FoundationClasses:BOOL="ON" ^ + -D BUILD_MODULE_ModelingData:BOOL="%BUILD_ModelingData%" ^ + -D BUILD_MODULE_ModelingAlgorithms:BOOL="%BUILD_ModelingAlgorithms%" ^ + -D BUILD_MODULE_Visualization:BOOL="%BUILD_Visualization%" ^ + -D BUILD_MODULE_ApplicationFramework:BOOL="%BUILD_ApplicationFramework%" ^ + -D BUILD_MODULE_DataExchange:BOOL="%BUILD_DataExchange%" ^ + -D BUILD_MODULE_Draw:BOOL="OFF" ^ + -D BUILD_DOC_Overview:BOOL="OFF" ^ + "%aSrcRoot%" + + if errorlevel 1 ( + popd + exit /B 1 + goto :eof + ) +) +set aTimeGEN=%TIME% +call :computeDuration %aTimeZERO% %aTimeGEN% +if ["%toCMake%"] == ["1"] ( + echo Generation time: %DURATION% + echo Generation time: %DURATION%>> "%aLogFile%" +) + +if "%toClean%"=="1" ( + mingw32-make clean +) + +if "%toMake%"=="1" ( + echo Building... + mingw32-make -j %aNbJobs% 2>> "%aLogFile%" + if errorlevel 1 ( + popd + exit /B 1 + goto :eof + ) + type "%aLogFile%" +) +set aTimeBUILD=%TIME% +call :computeDuration %aTimeGEN% %aTimeBUILD% +if "%toMake%"=="1" ( + echo Building time: %DURATION% + echo Building time: %DURATION%>> "%aLogFile%" +) +call :computeDuration %aTimeZERO% %aTimeBUILD% +if "%toMake%"=="1" ( + echo Total building time: %DURATION% + echo Total building time: %DURATION%>> "%aLogFile%" +) + +if "%toInstall%"=="1" ( + echo Installing into %aDestDir%... + mingw32-make install 2>> "%aLogFile%" + copy /Y "%aWorkDir%\VERSION.html" "%aDestDir%\VERSION.html" +) +set aTimeINSTALL=%TIME% +call :computeDuration %aTimeBUILD% %aTimeINSTALL% +if "%toInstall%"=="1" ( + echo Install time: %DURATION% + echo Install time: %DURATION%>> "%aLogFile%" +) + +call :computeDuration %aTimeZERO% %aTimeINSTALL% +echo Total time: %DURATION% +echo Total time: %DURATION%>> "%aLogFile%" + +popd +goto :eof + +:computeDuration +set aTimeFrom=%1 +set aTimeEnd=%2 +rem handle time before 10AM (win10 - remove empty space at the beginning) +if "%aTimeFrom:~0,1%"==" " set "aTimeFrom=%aTimeFrom:~1%" +if "%aTimeEnd:~0,1%"==" " set "aTimeEnd=%aTimeEnd:~1%" +rem handle time before 10AM (win7 - add 0 at the beginning) +if "%aTimeFrom:~1,1%"==":" set "aTimeFrom=0%aTimeFrom%" +if "%aTimeEnd:~1,1%"==":" set "aTimeEnd=0%aTimeEnd%" +rem convert hours:minutes:seconds:ms into duration +set /A aTimeFrom=(1%aTimeFrom:~0,2%-100)*360000 + (1%aTimeFrom:~3,2%-100)*6000 + (1%aTimeFrom:~6,2%-100)*100 + (1%aTimeFrom:~9,2%-100) +set /A aTimeEnd= (1%aTimeEnd:~0,2%-100)*360000 + (1%aTimeEnd:~3,2%-100)*6000 + (1%aTimeEnd:~6,2%-100)*100 + (1%aTimeEnd:~9,2%-100) +set /A aDurTotalSec=%aTimeEnd%-%aTimeFrom% +if %aTimeEnd% LSS %aTimeFrom% set set /A aDurTotalSec=%aTimeFrom%-%aTimeEnd% +set /A aDurHH=%aDurTotalSec% / 360000 +set /A aDurMM=(%aDurTotalSec% - %aDurHH%*360000) / 6000 +set /A aDurSS=(%aDurTotalSec% - %aDurHH%*360000 - %aDurMM%*6000) / 100 +if %aDurHH% LSS 10 set aDurHH=0%aDurHH% +if %aDurMM% LSS 10 set aDurMM=0%aDurMM% +if %aDurSS% LSS 10 set aDurSS=0%aDurSS% + +set "DURATION=%aDurHH%:%aDurMM%:%aDurSS%" +goto :eof diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/wasm_build.sh opencascade-7.5.1+dfsg1/adm/scripts/wasm_build.sh --- opencascade-7.4.1+dfsg1/adm/scripts/wasm_build.sh 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/wasm_build.sh 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,126 @@ +#!/bin/bash + +# Auxiliary script for semi-automated building of OCCT for WASM platform. +# wasm_custom.sh should be configured with paths to CMake, 3rd-parties and Emscripten SDK. +# FreeType should be specified as mandatory dependency. + +export aScriptDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +export aSrcRoot="${aScriptDir}/../.." +export aBuildRoot=work + +export aNbJobs=${NUMBER_OF_PROCESSORS} + +export toCMake=1 +export toClean=0 +export toMake=1 +export toInstall=1 + +export BUILD_ModelingData=ON +export BUILD_ModelingAlgorithms=ON +export BUILD_Visualization=ON +export BUILD_ApplicationFramework=ON +export BUILD_DataExchange=ON + +if [ -f "${aScriptDir}/wasm_custom.sh" ] ; then + . "${aScriptDir}/wasm_custom.sh" +fi + +. "${EMSDK_ROOT}/emsdk_env.sh" + +export aToolchain="${EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake" + +export aGitBranch=`git symbolic-ref --short HEAD` + +echo "Compilation OCCT branch : $aGitBranch" + +export aPlatformAndCompiler=wasm + +export aWorkDir="${aSrcRoot}/${aBuildRoot}/${aPlatformAndCompiler}-make" +if [ ! -d "${aWorkDir}" ]; then + mkdir -p "${aWorkDir}" +fi + +export aDestDir="${aSrcRoot}/${aBuildRoot}/${aPlatformAndCompiler}" +if [ ! -d "${aDestDir}" ]; then + mkdir -p "${aDestDir}" +fi + +export aLogFile="${aSrcRoot}/${aBuildRoot}/build-${aPlatformAndCompiler}.log" +if [ -f "${aLogFile}" ]; then + rm "${aLogFile}" +fi + +echo Start building OCCT for ${aPlatformAndCompiler} +echo Start building OCCT for ${aPlatformAndCompiler}>> "${aLogFile}" + +pushd "${aWorkDir}" +pwd +echo toCMake=${toCMake} +if [ "${toCMake}" = "1" ]; then + +echo "Configuring OCCT for WASM..." +echo cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE:FILEPATH="${aToolchain}" \ +-DCMAKE_BUILD_TYPE:STRING="Release" \ +-DBUILD_LIBRARY_TYPE:STRING="Static" \ +-DINSTALL_DIR:PATH="${aDestDir}" \ +-DINSTALL_DIR_INCLUDE:STRING="inc" \ +-DINSTALL_DIR_RESOURCE:STRING="src" \ +-D3RDPARTY_FREETYPE_DIR:PATH="$aFreeType" \ +-D3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2:FILEPATH="$aFreeType/include" \ +-D3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build:FILEPATH="$aFreeType/include" \ +-DBUILD_MODULE_FoundationClasses:BOOL="ON" \ +-DBUILD_MODULE_ModelingData:BOOL="${BUILD_ModelingData}" \ +-DBUILD_MODULE_ModelingAlgorithms:BOOL="${BUILD_ModelingAlgorithms}" \ +-DBUILD_MODULE_Visualization:BOOL="${BUILD_Visualization}" \ +-DBUILD_MODULE_ApplicationFramework:BOOL="${BUILD_ApplicationFramework}" \ +-DBUILD_MODULE_DataExchange:BOOL="${BUILD_DataExchange}" \ +-DBUILD_MODULE_Draw:BOOL="OFF" \ +-DBUILD_DOC_Overview:BOOL="OFF" "${aSrcRoot}" + +cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE:FILEPATH="${aToolchain}" \ +-DCMAKE_BUILD_TYPE:STRING="Release" \ +-DBUILD_LIBRARY_TYPE:STRING="Static" \ +-DINSTALL_DIR:PATH="${aDestDir}" \ +-DINSTALL_DIR_INCLUDE:STRING="inc" \ +-DINSTALL_DIR_RESOURCE:STRING="src" \ +-D3RDPARTY_FREETYPE_DIR:PATH="$aFreeType" \ +-D3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2:FILEPATH="$aFreeType/include" \ +-D3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build:FILEPATH="$aFreeType/include" \ +-DBUILD_MODULE_FoundationClasses:BOOL="ON" \ +-DBUILD_MODULE_ModelingData:BOOL="${BUILD_ModelingData}" \ +-DBUILD_MODULE_ModelingAlgorithms:BOOL="${BUILD_ModelingAlgorithms}" \ +-DBUILD_MODULE_Visualization:BOOL="${BUILD_Visualization}" \ +-DBUILD_MODULE_ApplicationFramework:BOOL="${BUILD_ApplicationFramework}" \ +-DBUILD_MODULE_DataExchange:BOOL="${BUILD_DataExchange}" \ +-DBUILD_MODULE_Draw:BOOL="OFF" \ +-DBUILD_DOC_Overview:BOOL="OFF" "${aSrcRoot}" + + if [ $? -ne 0 ]; then + echo "Problem during configuration" + popd + exit 1 + fi + +fi + +if [ "${toClean}" = "1" ]; then + make clean +fi + +if [ "${toMake}" = "1" ]; then + echo Building... + make -j ${aNbJobs} 2>> "${aLogFile}" + if [ $? -ne 0 ]; then + echo "Problem during make operation" + popd + exit 1 + fi + echo "${aLogFile}" +fi + +if [ "${toInstall}" = "1" ]; then + echo Installing into ${aDestDir} + make install 2>> "${aLogFile}" +fi + +popd diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/wasm_custom.bat.template opencascade-7.5.1+dfsg1/adm/scripts/wasm_custom.bat.template --- opencascade-7.4.1+dfsg1/adm/scripts/wasm_custom.bat.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/wasm_custom.bat.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,16 @@ +rem Environment configuration template for occ_build_wasm.bat (to be renamed as wasm_custom_env.bat) +set "aFreeType=%aSrcRoot%\..\3rdparty\freetype-2.7.1-wasm" +set "EMSDK_ROOT=%aSrcRoot%\..\emsdk" + +rem Uncomment to customize building steps +rem set "aBuildRoot=work" +rem set "toCMake=1" +rem set "toClean=0" +rem set "toMake=1" +rem set "toInstall=1" + +rem set "BUILD_ModelingData=ON" +rem set "BUILD_ModelingAlgorithms=ON" +rem set "BUILD_Visualization=ON" +rem set "BUILD_ApplicationFramework=ON" +rem set "BUILD_DataExchange=ON" diff -Nru opencascade-7.4.1+dfsg1/adm/scripts/wasm_custom.sh.template opencascade-7.5.1+dfsg1/adm/scripts/wasm_custom.sh.template --- opencascade-7.4.1+dfsg1/adm/scripts/wasm_custom.sh.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/scripts/wasm_custom.sh.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,16 @@ +# environment configuration template for occ_build_wasm.sh (to be renamed as wasm_custom_env.sh) +export aFreeType="$aSrcRoot/../3rdparty/freetype-2.7.1-wasm" +export EMSDK_ROOT="$aSrcRoot/../emsdk" + +# Uncomment to customize building steps +#export aBuildRoot=work +#export toCMake=1 +#export toClean=0 +#export toMake=1 +#export toInstall=1 + +#export BUILD_ModelingData=ON +#export BUILD_ModelingAlgorithms=ON +#export BUILD_Visualization=ON +#export BUILD_ApplicationFramework=ON +#export BUILD_DataExchange=ON diff -Nru opencascade-7.4.1+dfsg1/adm/templates/build.bat opencascade-7.5.1+dfsg1/adm/templates/build.bat --- opencascade-7.4.1+dfsg1/adm/templates/build.bat 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/build.bat 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,38 @@ +@echo off +setlocal + +rem Setup environment +call "%~dp0env.bat" %1 %2 %3 + +rem Define path to project file +set "PRJFILE=%~dp0OCCT.sln" + +if "%VCVER%" == "vc8" ( + call "%VS80COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc9" ( + call "%VS90COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc10" ( + call "%VS100COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc11" ( + call "%VS110COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc12" ( + call "%VS120COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc14" ( + call "%VS140COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc141" ( + call "%VS141COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc142" ( + call "%VS142COMNTOOLS%/vsvars32.bat" > nul +) else ( + echo Error: wrong VS identifier + exit /B +) + +set BUILDCONFIG=Release +if "%CASDEB%"=="i" set BUILDCONFIG=RelWithDebInfo +if "%CASDEB%"=="d" set BUILDCONFIG=Debug +if "%ARCH%"=="32" set PLATFORM=win32 +if "%ARCH%"=="64" set PLATFORM=x64 + +msbuild "%PRJFILE%" /m /fl /flp:LogFile="build_%BUILDCONFIG%.log" /p:Configuration=%BUILDCONFIG% /p:Platform=%PLATFORM% /p:BuildProjectReferences=false +endlocal diff -Nru opencascade-7.4.1+dfsg1/adm/templates/custom.build.bat.in opencascade-7.5.1+dfsg1/adm/templates/custom.build.bat.in --- opencascade-7.4.1+dfsg1/adm/templates/custom.build.bat.in 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/custom.build.bat.in 2021-02-02 08:51:56.000000000 +0000 @@ -14,6 +14,7 @@ set "TBB_DIR=@3RDPARTY_TBB_DLL_DIR@" set "VTK_DIR=@3RDPARTY_VTK_DLL_DIR@" set "FFMPEG_DIR=@3RDPARTY_FFMPEG_DLL_DIR@" + set "OPENVR_DIR=@3RDPARTY_OPENVR_DLL_DIRS@" if not "@3RDPARTY_QT_DIR@" == "" ( set "QTDIR=@3RDPARTY_QT_DIR@" diff -Nru opencascade-7.4.1+dfsg1/adm/templates/custom.install.bat.in opencascade-7.5.1+dfsg1/adm/templates/custom.install.bat.in --- opencascade-7.4.1+dfsg1/adm/templates/custom.install.bat.in 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/custom.install.bat.in 2021-02-02 08:51:56.000000000 +0000 @@ -10,12 +10,13 @@ set "TCL_DIR=@USED_3RDPARTY_TCL_DIR@" set "TK_DIR=@USED_3RDPARTY_TK_DIR@" set "FREETYPE_DIR=@USED_3RDPARTY_FREETYPE_DIR@" - set "FREEIMAGE_DIR=@USED_3RDPARTY_FREEIMAGE_DIRS@" + set "FREEIMAGE_DIR=@USED_3RDPARTY_FREEIMAGE_DIR@" set "EGL_DIR=@USED_3RDPARTY_EGL_DIRS@" set "GLES2_DIR=@USED_3RDPARTY_GLES2_DIRS@" set "TBB_DIR=@USED_3RDPARTY_TBB_DIR@" set "VTK_DIR=@USED_3RDPARTY_VTK_DIR@" set "FFMPEG_DIR=@USED_3RDPARTY_FFMPEG_DIR@" + set "OPENVR_DIR=@USED_3RDPARTY_OPENVR_DIR@" if not "@USED_3RDPARTY_QT_DIR@" == "" ( set "QTDIR=@USED_3RDPARTY_QT_DIR@" diff -Nru opencascade-7.4.1+dfsg1/adm/templates/env.bat opencascade-7.5.1+dfsg1/adm/templates/env.bat --- opencascade-7.4.1+dfsg1/adm/templates/env.bat 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/env.bat 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ set "HAVE_ZLIB=false" set "HAVE_LIBLZMA=false" set "HAVE_RAPIDJSON=false" +set "HAVE_OPENVR=false" set "HAVE_E57=false" set "CSF_OPT_INC=" set "CSF_OPT_LIB32=" @@ -77,6 +78,9 @@ set VCLIB=%VCLIB%-uwp set VCPROP=Universal ) +if "%VCFMT%" == "vclang" ( + set VCLIB=vc14 +) rem echo VCVER=%VCVER% VCFMT=%VCFMT% VCLIB=%VCLIB% VCPROP=%VCPROP% rem ----- Parsing of Visual Studio platform ----- @@ -106,6 +110,10 @@ for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do ( set "DevEnvDir=%%i\Common7\IDE\" ) +) else if /I "%VCFMT%" == "vclang" ( + for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do ( + set "DevEnvDir=%%i\Common7\IDE\" + ) ) else if /I "%VCFMT%" == "gcc" ( rem MinGW ) else ( @@ -118,6 +126,7 @@ echo vc14 = VS 2015 echo vc141 = VS 2017 echo vc142 = VS 2019 + echo vclang = VS 2019 with ClangCL toolset exit /B ) @@ -147,6 +156,11 @@ set "VCVARS=%%i\VC\Auxiliary\Build\vcvarsall.bat" ) set "VCPlatformToolSet=v142" +) else if /I "%VCFMT%" == "vclang" ( + for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do ( + set "VCVARS=%%i\VC\Auxiliary\Build\vcvarsall.bat" + ) + set "VCPlatformToolSet=ClangCL" ) else if /I "%VCFMT%" == "gcc" ( rem MinGW ) else ( @@ -176,6 +190,7 @@ if ["%HAVE_ZLIB%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_ZLIB" & set "CSF_DEFINES=HAVE_ZLIB;%CSF_DEFINES%" if ["%HAVE_LIBLZMA%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_LIBLZMA" & set "CSF_DEFINES=HAVE_LIBLZMA;%CSF_DEFINES%" if ["%HAVE_RAPIDJSON%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_RAPIDJSON" & set "CSF_DEFINES=HAVE_RAPIDJSON;%CSF_DEFINES%" +if ["%HAVE_OPENVR%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_OPENVR" & set "CSF_DEFINES=HAVE_OPENVR;%CSF_DEFINES%" if ["%HAVE_E57%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_E57" & set "CSF_DEFINES=HAVE_E57;%CSF_DEFINES%" rem Eliminate VS warning diff -Nru opencascade-7.4.1+dfsg1/adm/templates/env.bat.in opencascade-7.5.1+dfsg1/adm/templates/env.bat.in --- opencascade-7.4.1+dfsg1/adm/templates/env.bat.in 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/env.bat.in 2021-02-02 08:51:56.000000000 +0000 @@ -119,12 +119,14 @@ if ["%CASROOT%"] == [""] set "CASROOT=%SCRIPTROOT%" rem ----- Define path to 3rdparty products ----- -set "THIRDPARTY_DIR=@3RDPARTY_DIR@" +if ["%THIRDPARTY_DIR%"] == [""] set "THIRDPARTY_DIR=@3RDPARTY_DIR@" if ["%ARCH%"] == ["32"] set VCARCH=x86 if ["%ARCH%"] == ["64"] set VCARCH=amd64 if /I ["%1"] == ["vc141"] set "VCVER=vc14" +if /I ["%1"] == ["vc142"] set "VCVER=vc14" + if exist "%CASROOT%\custom.bat" ( call "%CASROOT%\custom.bat" %VCVER% %ARCH% %CASDEB% ) @@ -138,7 +140,11 @@ if not ["%TBB_DIR%"] == [""] set "PATH=%TBB_DIR%;%PATH%" if not ["%VTK_DIR%"] == [""] set "PATH=%VTK_DIR%;%PATH%" if not ["%FFMPEG_DIR%"] == [""] set "PATH=%FFMPEG_DIR%;%PATH%" -if not ["%QTDIR%"] == [""] set "PATH=%QTDIR%/bin;%PATH%" +if not ["%OPENVR_DIR%"] == [""] set "PATH=%OPENVR_DIR%;%PATH%" +if not ["%QTDIR%"] == [""] ( + set "PATH=%QTDIR%/bin;%PATH%" + set "QT_PLUGIN_PATH=%QTDIR%/plugins" +) rem ----- Set path to 3rd party and OCCT libraries ----- if not "%CSF_OCCTBinPath%" == "" ( diff -Nru opencascade-7.4.1+dfsg1/adm/templates/env.install.sh.in opencascade-7.5.1+dfsg1/adm/templates/env.install.sh.in --- opencascade-7.4.1+dfsg1/adm/templates/env.install.sh.in 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/env.install.sh.in 2021-02-02 08:51:56.000000000 +0000 @@ -8,7 +8,9 @@ fi # ----- Define path to 3rdparty products ----- -export THIRDPARTY_DIR="@3RDPARTY_DIR@" +if [ "${THIRDPARTY_DIR}" == "" ]; then + export THIRDPARTY_DIR="@3RDPARTY_DIR@" +fi # ----- Read script arguments ----- shopt -s nocasematch diff -Nru opencascade-7.4.1+dfsg1/adm/templates/env.samples.bat.in opencascade-7.5.1+dfsg1/adm/templates/env.samples.bat.in --- opencascade-7.4.1+dfsg1/adm/templates/env.samples.bat.in 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/env.samples.bat.in 2021-02-02 08:51:56.000000000 +0000 @@ -6,6 +6,7 @@ call "@INSTALL_DIR_ABSOLUTE@\@INSTALL_DIR_SCRIPT@\env.bat" %1 %2 %3 if /I ["%1"] == ["vc141"] set "VCVER=vc141" +if /I ["%1"] == ["vc142"] set "VCVER=vc142" set "BIN_DIR=win%ARCH%\%VCVER%\bind" set "LIB_DIR=win%ARCH%\%VCVER%\libd" @@ -26,3 +27,5 @@ set "PATH=%QTDIR%/bin;%PATH%" set "QT_QPA_PLATFORM_PLUGIN_PATH=%QTDIR%\plugins\platforms" ) + +set "CSF_OCCTOverviewSampleCodePath=%~dp0..\..\OCCTOverview\code" diff -Nru opencascade-7.4.1+dfsg1/adm/templates/env.samples.sh.in opencascade-7.5.1+dfsg1/adm/templates/env.samples.sh.in --- opencascade-7.4.1+dfsg1/adm/templates/env.samples.sh.in 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/env.samples.sh.in 2021-02-02 08:51:56.000000000 +0000 @@ -20,3 +20,5 @@ export RES_DIR=${aSamplePath}/${STATION}/res export PATH=${QTDIR}/bin:${PATH} + +export "CSF_OCCTOverviewSampleCodePath=${aSamplePath}/../../OCCTOverview/code" diff -Nru opencascade-7.4.1+dfsg1/adm/templates/env.sh opencascade-7.5.1+dfsg1/adm/templates/env.sh --- opencascade-7.4.1+dfsg1/adm/templates/env.sh 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/env.sh 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ export HAVE_ZLIB="false"; export HAVE_LIBLZMA="false"; export HAVE_RAPIDJSON="false"; +export HAVE_OPENVR="false"; export HAVE_E57="false"; export MACOSX_USE_GLX="false"; export CSF_OPT_INC="" @@ -106,6 +107,7 @@ if [ "$HAVE_ZLIB" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_ZLIB"; fi if [ "$HAVE_LIBLZMA" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_LIBLZMA"; fi if [ "$HAVE_RAPIDJSON" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_RAPIDJSON"; fi +if [ "$HAVE_OPENVR" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_OPENVR"; fi if [ "$HAVE_E57" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_E57"; fi # Option to compile OCCT with X11 libs on Mac OS X if [ "$MACOSX_USE_GLX" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DMACOSX_USE_GLX"; fi diff -Nru opencascade-7.4.1+dfsg1/adm/templates/install.bat opencascade-7.5.1+dfsg1/adm/templates/install.bat --- opencascade-7.4.1+dfsg1/adm/templates/install.bat 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/install.bat 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,38 @@ +@echo off +setlocal + +rem Setup environment +call "%~dp0env.bat" %1 %2 %3 + +rem Define path to project file +set "PRJFILE=%~dp0INSTALL.vcxproj" + +if "%VCVER%" == "vc8" ( + call "%VS80COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc9" ( + call "%VS90COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc10" ( + call "%VS100COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc11" ( + call "%VS110COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc12" ( + call "%VS120COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc14" ( + call "%VS140COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc141" ( + call "%VS141COMNTOOLS%/vsvars32.bat" > nul +) else if "%VCVER%" == "vc142" ( + call "%VS142COMNTOOLS%/vsvars32.bat" > nul +) else ( + echo Error: wrong VS identifier + exit /B +) + +set BUILDCONFIG=Release +if "%CASDEB%"=="i" set BUILDCONFIG=RelWithDebInfo +if "%CASDEB%"=="d" set BUILDCONFIG=Debug +if "%ARCH%"=="32" set PLATFORM=win32 +if "%ARCH%"=="64" set PLATFORM=x64 + +msbuild "%PRJFILE%" /m /fl /flp:LogFile="install_%BUILDCONFIG%.log" /p:Configuration=%BUILDCONFIG% /p:Platform=%PLATFORM% /p:BuildProjectReferences=false +endlocal diff -Nru opencascade-7.4.1+dfsg1/adm/templates/OpenCASCADEConfig.cmake.in opencascade-7.5.1+dfsg1/adm/templates/OpenCASCADEConfig.cmake.in --- opencascade-7.4.1+dfsg1/adm/templates/OpenCASCADEConfig.cmake.in 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/OpenCASCADEConfig.cmake.in 2021-02-02 08:51:56.000000000 +0000 @@ -21,6 +21,7 @@ # This is made to support different locations of CMake files: # - in UNIX style: $INSTALL_DIR/lib/cmake/opencascade- # - in Windows style: $INSTALL_DIR/cmake +# - in Android style: $INSTALL_DIR/libs/$CMAKE_ANDROID_ARCH_ABI/cmake/opencascade- get_filename_component (OpenCASCADE_INSTALL_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) get_filename_component (OpenCASCADE_INSTALL_PREFIX "${OpenCASCADE_INSTALL_PREFIX}" PATH) if (OpenCASCADE_INSTALL_PREFIX MATCHES "/cmake$") @@ -29,6 +30,10 @@ if (OpenCASCADE_INSTALL_PREFIX MATCHES "/lib$") get_filename_component (OpenCASCADE_INSTALL_PREFIX "${OpenCASCADE_INSTALL_PREFIX}" PATH) endif() +if (OpenCASCADE_INSTALL_PREFIX MATCHES "/libs/${CMAKE_ANDROID_ARCH_ABI}$") + get_filename_component (OpenCASCADE_INSTALL_PREFIX "${OpenCASCADE_INSTALL_PREFIX}" PATH) + get_filename_component (OpenCASCADE_INSTALL_PREFIX "${OpenCASCADE_INSTALL_PREFIX}" PATH) +endif() # Set OpenCASCADE paths to headers, binaries, libraries, resources, tests, samples, data set (OpenCASCADE_BINARY_DIR "${OpenCASCADE_INSTALL_PREFIX}/@INSTALL_DIR_BIN@") diff -Nru opencascade-7.4.1+dfsg1/adm/templates/sample.bat opencascade-7.5.1+dfsg1/adm/templates/sample.bat --- opencascade-7.4.1+dfsg1/adm/templates/sample.bat 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/sample.bat 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,7 @@ echo AndroidQt echo FuncDemo echo IESample + echo OCCTOverview echo Tutorial PAUSE exit /B @@ -35,5 +36,8 @@ exit /B ) +rem Set path to location where sample code is installed +set "CSF_OCCTOverviewSampleCodePath=%CSF_OCCTSamplesPath%\OCCTOverview\code" + "%EXE_PATH%" diff -Nru opencascade-7.4.1+dfsg1/adm/templates/sample.sh opencascade-7.5.1+dfsg1/adm/templates/sample.sh --- opencascade-7.4.1+dfsg1/adm/templates/sample.sh 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/sample.sh 2021-02-02 08:51:56.000000000 +0000 @@ -8,6 +8,7 @@ echo available samples: echo FuncDemo echo IESample + echo OCCTOverview echo Tutorial fi @@ -31,5 +32,7 @@ exit 1 fi +export CSF_OCCTOverviewSampleCodePath="${CSF_OCCTSamplesPath}/OCCTOverview/code" + cd ${aCurrentPath} -"$EXE_PATH" \ No newline at end of file +"$EXE_PATH" diff -Nru opencascade-7.4.1+dfsg1/adm/templates/template.vc10 opencascade-7.5.1+dfsg1/adm/templates/template.vc10 --- opencascade-7.4.1+dfsg1/adm/templates/template.vc10 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/template.vc10 2021-02-02 08:51:56.000000000 +0000 @@ -159,7 +159,7 @@ _DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions) - __TKDEP__ + __TKDEP_DEBUG__ .\..\..\..\win32\__VCVER__\bind\__TKNAM__.dll true ..\..\..\win32\__VCVER__\libd;$(CSF_OPT_LIB32D);%(AdditionalLibraryDirectories) @@ -255,7 +255,7 @@ _DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions) - __TKDEP__ + __TKDEP_DEBUG__ .\..\..\..\win64\__VCVER__\bind\__TKNAM__.dll true ..\..\..\win64\__VCVER__\libd;$(CSF_OPT_LIB64D);%(AdditionalLibraryDirectories) diff -Nru opencascade-7.4.1+dfsg1/adm/templates/template.vc10x opencascade-7.5.1+dfsg1/adm/templates/template.vc10x --- opencascade-7.4.1+dfsg1/adm/templates/template.vc10x 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/templates/template.vc10x 2021-02-02 08:51:56.000000000 +0000 @@ -149,7 +149,7 @@ _DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions) - __TKDEP__ + __TKDEP_DEBUG__ true ..\..\..\win32\__VCVER__\libd;$(CSF_OPT_LIB32D);%(AdditionalLibraryDirectories) true @@ -238,7 +238,7 @@ _DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions) - __TKDEP__ + __TKDEP_DEBUG__ true ..\..\..\win64\__VCVER__\libd;$(CSF_OPT_LIB64D);%(AdditionalLibraryDirectories) true diff -Nru opencascade-7.4.1+dfsg1/adm/UDLIST opencascade-7.5.1+dfsg1/adm/UDLIST --- opencascade-7.4.1+dfsg1/adm/UDLIST 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/UDLIST 2021-02-02 08:51:56.000000000 +0000 @@ -108,6 +108,7 @@ n BRepMeshData n BRepOffset n BRepOffsetAPI +n BRepPreviewAPI n BRepPrim n BRepPrimAPI n BRepProj @@ -201,6 +202,7 @@ n AIS n Aspect n DsgPrs +n PrsDim n Graphic3d n Image n Media @@ -214,13 +216,13 @@ n SelectMgr n StdPrs n StdSelect -n TColQuantity n V3d n WNT n Xw n Cocoa r Textures r Shaders +r XRResources t TKMeshVS t TKOpenGl t TKD3DHost @@ -443,3 +445,23 @@ n RWGltf n RWMesh n RWObj +n DFBrowser +n DFBrowserPane +n DFBrowserPaneXDE +n ShapeView +n TInspector +n TInspectorAPI +x TInspectorEXE +t TKDFBrowser +t TKShapeView +t TKTInspector +t TKTInspectorAPI +t TKToolsDraw +t TKTreeModel +t TKView +t TKVInspector +n ToolsDraw +n TreeModel +n View +n ViewControl +n VInspector diff -Nru opencascade-7.4.1+dfsg1/adm/upgrade.dat opencascade-7.5.1+dfsg1/adm/upgrade.dat --- opencascade-7.4.1+dfsg1/adm/upgrade.dat 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/adm/upgrade.dat 2021-02-02 08:51:56.000000000 +0000 @@ -71,6 +71,7 @@ BOPCol_Box2DBndTreeSelector BOPTools_BoxSelector BiTgte_DataMapOfShapeBox TopTools_DataMapOfShapeBox CDM_MessageDriver Message_Messenger +Message_ProgressSentry Message_ProgressScope [tcollection] AdvApp2Var_SequenceOfNode diff -Nru opencascade-7.4.1+dfsg1/CMakeLists.txt opencascade-7.5.1+dfsg1/CMakeLists.txt --- opencascade-7.4.1+dfsg1/CMakeLists.txt 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/CMakeLists.txt 2021-02-02 08:51:56.000000000 +0000 @@ -101,7 +101,7 @@ # Load Cotire tool for accelerating build procedure include(cotire) - # Set Cotire to ignore lxx, pxx, gxx + # Set Cotire to ignore lxx, pxx, gxx set (COTIRE_ADDITIONAL_PREFIX_HEADER_IGNORE_EXTENSIONS "lxx;pxx;gxx" CACHE STRING "Set Cotire to ignore OCCT specific files that can be #included" FORCE) # Set priority for inclusion of system headers in PCH to reduce problems @@ -165,7 +165,7 @@ elseif (NOT "${CMAKE_INSTALL_PREFIX_PREV}" STREQUAL "${CMAKE_INSTALL_PREFIX}") # CMAKE_INSTALL_PREFIX has been changed at previous step set (CMAKE_INSTALL_PREFIX_PREV "${CMAKE_INSTALL_PREFIX}" CACHE INTERNAL "" FORCE) - + # INSTALL_DIR is required to be updated set (INSTALL_DIR "${CMAKE_INSTALL_PREFIX}" CACHE PATH "${INSTALL_DIR_DESCR}" FORCE) endif() @@ -177,10 +177,10 @@ # INSTALL_DIR has been changed at previous step set (INSTALL_DIR_PREV "${INSTALL_DIR}" CACHE INTERNAL "" FORCE) - # sync CMAKE_INSTALL_PREFIX with INSTALL_DIR + # sync CMAKE_INSTALL_PREFIX with INSTALL_DIR set (CMAKE_INSTALL_PREFIX "${INSTALL_DIR}" CACHE INTERNAL "" FORCE) - # set CMAKE_INSTALL_PREFIX_PREV to avoid the reset of structure of the install folder + # set CMAKE_INSTALL_PREFIX_PREV to avoid the reset of structure of the install folder set (CMAKE_INSTALL_PREFIX_PREV "${INSTALL_DIR}" CACHE INTERNAL "" FORCE) endif() @@ -406,7 +406,7 @@ set (DO_ONLY_CHECK_FOR_DOXYGEN ON) OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/doxygen") set (DO_ONLY_CHECK_FOR_DOXYGEN OFF) - + if (CAN_DOXYGEN_BE_USED) message (STATUS "Info. Overview building is turned on") endif() @@ -495,7 +495,7 @@ if (USE_TCL) message (STATUS "Info: TCL is used by OCCT") OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/tcl") - + message (STATUS "Info: TK is used by OCCT") OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/tk") else() @@ -523,7 +523,7 @@ OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/vtk") else() OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_VTK") - + if (NOT CAN_USE_VTK EQUAL -1) message (STATUS "Info: TKIVtk and TKIVtkDraw toolkits excluded due to VTK usage is disabled") @@ -565,6 +565,26 @@ OCCT_CHECK_AND_UNSET ("INSTALL_FREEIMAGE") endif() +# OpenVR +# search for CSF_OpenVR variable in EXTERNLIB of each being used toolkit +OCCT_IS_PRODUCT_REQUIRED (CSF_OpenVR CAN_USE_OPENVR) +if (CAN_USE_OPENVR) + set (USE_OPENVR OFF CACHE BOOL "${USE_OPENVR_DESCR}") + + if (USE_OPENVR) + add_definitions (-DHAVE_OPENVR) + OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/openvr") + else() + OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_OPENVR") + OCCT_CHECK_AND_UNSET ("INSTALL_OPENVR") + endif() +else() + OCCT_CHECK_AND_UNSET ("USE_OPENVR") + + OCCT_CHECK_AND_UNSET_GROUP ("3RDPARTY_OPENVR") + OCCT_CHECK_AND_UNSET ("INSTALL_OPENVR") +endif() + # FFmpeg # search for CSF_FFmpeg variable in EXTERNLIB of each being used toolkit OCCT_IS_PRODUCT_REQUIRED (CSF_FFmpeg CAN_USE_FFMPEG) @@ -694,14 +714,14 @@ OCCT_CHECK_AND_UNSET ("3RDPARTY_DOT_EXECUTABLE") endif() -# bison +# bison if (BUILD_YACCLEX) OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/bison") else() OCCT_CHECK_AND_UNSET ("3RDPARTY_BISON_EXECUTABLE") endif() -# flex +# flex if (BUILD_YACCLEX) OCCT_INCLUDE_CMAKE_FILE ("adm/cmake/flex") else() @@ -780,7 +800,7 @@ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bind") set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/libd") -if (WIN32) +if (WIN32) set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin") set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bini") set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bind") @@ -849,9 +869,11 @@ OCCT_INSTALL_FILE_OR_DIR ("samples/java" "${INSTALL_DIR_SAMPLES}") OCCT_INSTALL_FILE_OR_DIR ("samples/ocafsamples" "${INSTALL_DIR_SAMPLES}") OCCT_INSTALL_FILE_OR_DIR ("samples/qt" "${INSTALL_DIR_SAMPLES}") + OCCT_INSTALL_FILE_OR_DIR ("samples/OCCTOverview/code" "${INSTALL_DIR_SAMPLES}/OCCTOverview") install (FILES "${CMAKE_BINARY_DIR}/env.samples.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SAMPLES}/qt/FuncDemo" RENAME "env.${SCRIPT_EXT}") install (FILES "${CMAKE_BINARY_DIR}/env.samples.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SAMPLES}/qt/IESample" RENAME "env.${SCRIPT_EXT}") + install (FILES "${CMAKE_BINARY_DIR}/env.samples.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SAMPLES}/qt/OCCTOverview" RENAME "env.${SCRIPT_EXT}") install (FILES "${CMAKE_BINARY_DIR}/env.samples.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SAMPLES}/qt/Tutorial" RENAME "env.${SCRIPT_EXT}") endif() @@ -930,6 +952,9 @@ OCCT_CONFIGURE ("adm/templates/env.${SCRIPT_EXT}.in" "env.${SCRIPT_EXT}") # install env script install (FILES "${CMAKE_BINARY_DIR}/env.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SCRIPT}") + # copy build.bat and install.bat scripts to CMake binary folder + OCCT_COPY_FILE_OR_DIR ("adm/templates/build.bat" "${CMAKE_BINARY_DIR}") + OCCT_COPY_FILE_OR_DIR ("adm/templates/install.bat" "${CMAKE_BINARY_DIR}") else() set (SUB_ENV_NAME "env.${SCRIPT_EXT}") set (SUB_ENV_BUILD_NAME "env.install.${SCRIPT_EXT}") @@ -962,6 +987,15 @@ OCCT_INSTALL_FILE_OR_DIR ("samples/${RESOURCE}" "${INSTALL_DIR_RESOURCE}/samples") #message("Copy Sample resources: samples/${RESOURCE} into ${INSTALL_DIR_RESOURCE}/samples") endforeach() + + ## Copy sources of OCCTOverview for using in the sample + OCCT_INSTALL_FILE_OR_DIR ("samples/OCCTOverview/code/DataExchangeSamples.cxx" "${INSTALL_DIR_SAMPLES}/OCCTOverview/code") + OCCT_INSTALL_FILE_OR_DIR ("samples/OCCTOverview/code/OcafSamples.cxx" "${INSTALL_DIR_SAMPLES}/OCCTOverview/code") + OCCT_INSTALL_FILE_OR_DIR ("samples/OCCTOverview/code/GeometrySamples.cxx" "${INSTALL_DIR_SAMPLES}/OCCTOverview/code") + OCCT_INSTALL_FILE_OR_DIR ("samples/OCCTOverview/code/TopologySamples.cxx" "${INSTALL_DIR_SAMPLES}/OCCTOverview/code") + OCCT_INSTALL_FILE_OR_DIR ("samples/OCCTOverview/code/TriangulationSamples.cxx" "${INSTALL_DIR_SAMPLES}/OCCTOverview/code") + OCCT_INSTALL_FILE_OR_DIR ("samples/OCCTOverview/code/Viewer2dSamples.cxx" "${INSTALL_DIR_SAMPLES}/OCCTOverview/code") + OCCT_INSTALL_FILE_OR_DIR ("samples/OCCTOverview/code/Viewer3dSamples.cxx" "${INSTALL_DIR_SAMPLES}/OCCTOverview/code") endif() @@ -1179,7 +1213,7 @@ install(EXPORT OpenCASCADE${OCCT_MODULE}Targets DESTINATION "${INSTALL_DIR_CMAKE}") endforeach() -# Update generated OpenCASCADETargets-*.cmake files +# Update generated OpenCASCADETargets-*.cmake files # to have correct paths to libraries depending on the configuration OCCT_UPDATE_TARGET_FILE () diff -Nru opencascade-7.4.1+dfsg1/debian/changelog opencascade-7.5.1+dfsg1/debian/changelog --- opencascade-7.4.1+dfsg1/debian/changelog 2020-04-25 18:53:17.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/changelog 2021-02-08 00:02:09.000000000 +0000 @@ -1,3 +1,62 @@ +opencascade (7.5.1+dfsg1-2) unstable; urgency=medium + + * [88b5e8e] Use list-missing to fix arch all builds + + -- Kurt Kremitzki Sun, 07 Feb 2021 18:02:09 -0600 + +opencascade (7.5.1+dfsg1-1) unstable; urgency=medium + + * [9129a3e] Add chamfer and fillet error checking patch + * [6478887] Run cme fixes + * [a440db7] New upstream version 7.5.1+dfsg1 + * [99e4376] Refresh patches + * [8479961] Update occt-draw hardcoded version references + * [820116c] Add FlexLexer.h to debian/not-installed + + -- Kurt Kremitzki Fri, 05 Feb 2021 19:51:47 -0600 + +opencascade (7.5.0+dfsg1-4) unstable; urgency=medium + + * [c80ffb1] Add blobfish patches + + -- Kurt Kremitzki Sat, 23 Jan 2021 19:02:43 -0600 + +opencascade (7.5.0+dfsg1-3) unstable; urgency=medium + + * [c688fcc] Undo adding VTK integration for now (Closes: #978017) + + -- Kurt Kremitzki Sat, 26 Dec 2020 19:01:29 -0600 + +opencascade (7.5.0+dfsg1-2) unstable; urgency=medium + + * Include files from VTK integration + * Add Breaks+Replaces for 7.3 + + -- Kurt Kremitzki Wed, 23 Dec 2020 10:52:25 -0600 + +opencascade (7.5.0+dfsg1-1) unstable; urgency=medium + + * Build integration with VTK 7.1 + * Upload to unstable. + + -- Kurt Kremitzki Sun, 20 Dec 2020 17:36:46 -0600 + +opencascade (7.5.0+dfsg1-1~exp1) experimental; urgency=medium + + [ Tobias Frost ] + * Another take on CI… + - disable dbgsym generation on CI builds (artifacts too big, failing build) + - disable rerepo builds on CI builds (runs into timeout) + - override linitan errors about Adam's email address (See #966295 + once fixed, revert commit 8f49f5ebdee! + + [ Kurt Kremitzki ] + * New upstream version 7.5.0+dfsg1 + * Update packaging for v7.5.0 + * Build with RapidJSON for glTF support + + -- Kurt Kremitzki Mon, 23 Nov 2020 13:07:58 -0600 + opencascade (7.4.1+dfsg1-2) unstable; urgency=medium * Upload to unstable. diff -Nru opencascade-7.4.1+dfsg1/debian/compat opencascade-7.5.1+dfsg1/debian/compat --- opencascade-7.4.1+dfsg1/debian/compat 2020-04-25 18:50:15.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/compat 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -11 diff -Nru opencascade-7.4.1+dfsg1/debian/control opencascade-7.5.1+dfsg1/debian/control --- opencascade-7.4.1+dfsg1/debian/control 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/control 2021-02-07 23:43:38.000000000 +0000 @@ -1,10 +1,11 @@ Source: opencascade Maintainer: Debian Science Maintainers -Uploaders: Kurt Kremitzki , Tobias Frost +Uploaders: Kurt Kremitzki , + Tobias Frost Section: science Priority: optional Build-Depends: cmake, - debhelper(>=11), + debhelper-compat (= 13), dh-exec, libfreeimage-dev, libfreetype6-dev, @@ -15,24 +16,28 @@ libxext-dev, libxi-dev, libxmu-dev, + rapidjson-dev, tcl-dev, tk-dev Build-Depends-Indep: doxygen, graphviz -Standards-Version: 4.2.1 -Rules-Requires-Root: no +Standards-Version: 4.5.1 Vcs-Browser: https://salsa.debian.org/science-team/opencascade Vcs-Git: https://salsa.debian.org/science-team/opencascade.git Homepage: https://www.opencascade.com/ +Rules-Requires-Root: no -Package: libocct-foundation-7.4 +Package: libocct-foundation-7.5 Architecture: any Multi-Arch: same Section: libs -Depends: ${misc:Depends}, ${shlibs:Depends} +Depends: ${misc:Depends}, + ${shlibs:Depends} Pre-Depends: ${misc:Pre-Depends} -Breaks: libocct-foundation-7.3 -Replaces: libocct-foundation-7.3 +Breaks: libocct-foundation-7.3, + libocct-foundation-7.4 +Replaces: libocct-foundation-7.3, + libocct-foundation-7.4 Description: OCCT module underlying all other OCCT classes Open CASCADE Technology is a suite for 3D surface and solid modeling, visualization, data exchange and rapid application development. It is an @@ -51,8 +56,8 @@ Architecture: any Multi-Arch: same Section: libdevel -Depends: libocct-foundation-7.4 (<< ${binary:Version}+1~), - libocct-foundation-7.4 (>= ${binary:Version}), +Depends: libocct-foundation-7.5 (<< ${binary:Version}+1~), + libocct-foundation-7.5 (>= ${binary:Version}), ${misc:Depends} Conflicts: liboce-foundation-dev Replaces: liboce-foundation-dev @@ -65,14 +70,17 @@ This package contains the headers and symlinks for libraries shipped by libocct-foundation. -Package: libocct-modeling-data-7.4 +Package: libocct-modeling-data-7.5 Architecture: any Multi-Arch: same Section: libs -Depends: ${misc:Depends}, ${shlibs:Depends} +Depends: ${misc:Depends}, + ${shlibs:Depends} Pre-Depends: ${misc:Pre-Depends} -Breaks: libocct-modeling-data-7.3 -Replaces: libocct-modeling-data-7.3 +Breaks: libocct-modeling-data-7.3, + libocct-modeling-data-7.4 +Replaces: libocct-modeling-data-7.3, + libocct-modeling-data-7.4 Description: Open CASCADE Technology 2D/3D geometric primitives data structures Open CASCADE Technology is a suite for 3D surface and solid modeling, visualization, data exchange and rapid application development. It is an @@ -90,8 +98,8 @@ Section: libdevel Depends: libocct-foundation-dev (<< ${binary:Version}+1~), libocct-foundation-dev (>= ${binary:Version}), - libocct-modeling-data-7.4 (<< ${binary:Version}+1~), - libocct-modeling-data-7.4 (>= ${binary:Version}), + libocct-modeling-data-7.5 (<< ${binary:Version}+1~), + libocct-modeling-data-7.5 (>= ${binary:Version}), ${misc:Depends} Conflicts: liboce-modeling-dev Replaces: liboce-modeling-dev @@ -104,14 +112,17 @@ This package contains the headers and symlinks for libraries shipped by libocct-modeling-data. -Package: libocct-modeling-algorithms-7.4 +Package: libocct-modeling-algorithms-7.5 Architecture: any Multi-Arch: same Section: libs -Depends: ${misc:Depends}, ${shlibs:Depends} +Depends: ${misc:Depends}, + ${shlibs:Depends} Pre-Depends: ${misc:Pre-Depends} -Breaks: libocct-modeling-algorithms-7.3 -Replaces: libocct-modeling-algorithms-7.3 +Breaks: libocct-modeling-algorithms-7.3, + libocct-modeling-algorithms-7.4 +Replaces: libocct-modeling-algorithms-7.3, + libocct-modeling-algorithms-7.4 Description: Open CASCADE Technology geometrical & topological algorithms module Open CASCADE Technology is a suite for 3D surface and solid modeling, visualization, data exchange and rapid application development. It is an @@ -128,8 +139,8 @@ Section: libdevel Depends: libocct-foundation-dev (<< ${binary:Version}+1~), libocct-foundation-dev (>= ${binary:Version}), - libocct-modeling-algorithms-7.4 (<< ${binary:Version}+1~), - libocct-modeling-algorithms-7.4 (>= ${binary:Version}), + libocct-modeling-algorithms-7.5 (<< ${binary:Version}+1~), + libocct-modeling-algorithms-7.5 (>= ${binary:Version}), ${misc:Depends} Conflicts: liboce-modeling-dev Replaces: liboce-modeling-dev @@ -142,14 +153,17 @@ This package contains the headers and symlinks for libraries shipped by libocct-modeling-algorithms. -Package: libocct-visualization-7.4 +Package: libocct-visualization-7.5 Architecture: any Multi-Arch: same Section: libs -Depends: ${misc:Depends}, ${shlibs:Depends} +Depends: ${misc:Depends}, + ${shlibs:Depends} Pre-Depends: ${misc:Pre-Depends} -Breaks: libocct-visualization-7.3 -Replaces: libocct-visualization-7.3 +Breaks: libocct-visualization-7.3, + libocct-visualization-7.4 +Replaces: libocct-visualization-7.3, + libocct-visualization-7.4 Description: Open CASCADE Technology graphical data visualization module Open CASCADE Technology is a suite for 3D surface and solid modeling, visualization, data exchange and rapid application development. It is an @@ -177,8 +191,8 @@ libocct-modeling-data-dev (>= ${binary:Version}), libocct-ocaf-dev (<< ${binary:Version}+1~), libocct-ocaf-dev (>= ${binary:Version}), - libocct-visualization-7.4 (<< ${binary:Version}+1~), - libocct-visualization-7.4 (>= ${binary:Version}), + libocct-visualization-7.5 (<< ${binary:Version}+1~), + libocct-visualization-7.5 (>= ${binary:Version}), libx11-dev, libxext-dev, libxmu-dev, @@ -194,14 +208,17 @@ This package contains the headers and symlinks for libraries shipped by libocct-visualization. -Package: libocct-ocaf-7.4 +Package: libocct-ocaf-7.5 Architecture: any Multi-Arch: same Section: libs -Depends: ${misc:Depends}, ${shlibs:Depends} +Depends: ${misc:Depends}, + ${shlibs:Depends} Pre-Depends: ${misc:Pre-Depends} -Breaks: libocct-ocaf-7.3 -Replaces: libocct-ocaf-7.3 +Breaks: libocct-ocaf-7.3, + libocct-ocaf-7.4 +Replaces: libocct-ocaf-7.3, + libocct-ocaf-7.4 Description: Open CASCADE Technology application-specific data and functionality Open CASCADE Technology is a suite for 3D surface and solid modeling, visualization, data exchange and rapid application development. It is an @@ -225,13 +242,15 @@ libocct-modeling-algorithms-dev (>= ${binary:Version}), libocct-modeling-data-dev (<< ${binary:Version}+1~), libocct-modeling-data-dev (>= ${binary:Version}), - libocct-ocaf-7.4 (<< ${binary:Version}+1~), - libocct-ocaf-7.4 (>= ${binary:Version}), - libocct-visualization-7.4 (<< ${binary:Version}+1~), - libocct-visualization-7.4 (>= ${binary:Version}), + libocct-ocaf-7.5 (<< ${binary:Version}+1~), + libocct-ocaf-7.5 (>= ${binary:Version}), + libocct-visualization-7.5 (<< ${binary:Version}+1~), + libocct-visualization-7.5 (>= ${binary:Version}), ${misc:Depends} -Conflicts: liboce-ocaf-dev, liboce-ocaf-lite-dev -Replaces: liboce-ocaf-dev, liboce-ocaf-lite-dev +Conflicts: liboce-ocaf-dev, + liboce-ocaf-lite-dev +Replaces: liboce-ocaf-dev, + liboce-ocaf-lite-dev Description: Open CASCADE Technology application-specific data and functionality - dev files Open CASCADE Technology is a suite for 3D surface and solid modeling, visualization, data exchange and rapid application development. It is an @@ -241,14 +260,17 @@ This package contains the headers and symlinks for libraries shipped by libocct-ocaf. -Package: libocct-data-exchange-7.4 +Package: libocct-data-exchange-7.5 Architecture: any Multi-Arch: same Section: libs -Depends: ${misc:Depends}, ${shlibs:Depends} +Depends: ${misc:Depends}, + ${shlibs:Depends} Pre-Depends: ${misc:Pre-Depends} -Breaks: libocct-data-exchange-7.3 -Replaces: libocct-data-exchange-7.3 +Breaks: libocct-data-exchange-7.3, + libocct-data-exchange-7.4 +Replaces: libocct-data-exchange-7.3, + libocct-data-exchange-7.4 Description: Open CASCADE Technology module for CAD data format interoperability Open CASCADE Technology is a suite for 3D surface and solid modeling, visualization, data exchange and rapid application development. It is an @@ -265,8 +287,8 @@ Architecture: any Multi-Arch: same Section: libdevel -Depends: libocct-data-exchange-7.4 (<< ${binary:Version}+1~), - libocct-data-exchange-7.4 (>= ${binary:Version}), +Depends: libocct-data-exchange-7.5 (<< ${binary:Version}+1~), + libocct-data-exchange-7.5 (>= ${binary:Version}), libocct-foundation-dev (<< ${binary:Version}+1~), libocct-foundation-dev (>= ${binary:Version}), libocct-modeling-algorithms-dev (<< ${binary:Version}+1~), @@ -278,8 +300,10 @@ libocct-visualization-dev (<< ${binary:Version}+1~), libocct-visualization-dev (>= ${binary:Version}), ${misc:Depends} -Conflicts: liboce-ocaf-dev, liboce-ocaf-lite-dev -Replaces: liboce-ocaf-dev, liboce-ocaf-lite-dev +Conflicts: liboce-ocaf-dev, + liboce-ocaf-lite-dev +Replaces: liboce-ocaf-dev, + liboce-ocaf-lite-dev Description: Open CASCADE Technology module for CAD data format interoperability - dev files Open CASCADE Technology is a suite for 3D surface and solid modeling, visualization, data exchange and rapid application development. It is an @@ -289,7 +313,7 @@ This package contains the headers and symlinks for libraries shipped by libocct-data-exchange. -Package: libocct-draw-7.4 +Package: libocct-draw-7.5 Architecture: any Multi-Arch: same Section: libs @@ -300,8 +324,10 @@ ${misc:Depends}, ${shlibs:Depends} Pre-Depends: ${misc:Pre-Depends} -Breaks: libocct-draw-7.3 -Replaces: libocct-draw-7.3 +Breaks: libocct-draw-7.3, + libocct-draw-7.4 +Replaces: libocct-draw-7.3, + libocct-draw-7.4 Description: Open CASCADE Technology command interpreter & graphical test library Open CASCADE Technology is a suite for 3D surface and solid modeling, visualization, data exchange and rapid application development. It is an @@ -317,8 +343,8 @@ Architecture: any Multi-Arch: same Section: libdevel -Depends: libocct-draw-7.4 (<< ${binary:Version}+1~), - libocct-draw-7.4 (>= ${binary:Version}), +Depends: libocct-draw-7.5 (<< ${binary:Version}+1~), + libocct-draw-7.5 (>= ${binary:Version}), ${misc:Depends} Description: Open CASCADE Technology interpreter & graphics test library - dev files Open CASCADE Technology is a suite for 3D surface and solid modeling, @@ -335,7 +361,8 @@ Package: occt-draw Architecture: any Multi-Arch: foreign -Depends: ${misc:Depends}, ${shlibs:Depends} +Depends: ${misc:Depends}, + ${shlibs:Depends} Conflicts: oce-draw Replaces: oce-draw Description: Open CASCADE Technology command interpreter and graphical test system @@ -348,8 +375,8 @@ and demonstrate Open CASCADE Technology modeling libraries. Package: occt-misc -Section: utils Architecture: all +Section: utils Depends: ${misc:Depends} Description: OCCT CAE platform shared library miscellaneous files Open CASCADE Technology is a suite for 3D surface and solid modeling, @@ -360,9 +387,10 @@ This package contains resource files. Package: libocct-doc -Section: doc Architecture: all -Depends: libjs-mathjax, ${misc:Depends} +Section: doc +Depends: libjs-mathjax, + ${misc:Depends} Description: Open CASCADE Technology CAE platform documentation Open CASCADE Technology is a suite for 3D surface and solid modeling, visualization, data exchange and rapid application development. It is an diff -Nru opencascade-7.4.1+dfsg1/debian/copyright opencascade-7.5.1+dfsg1/debian/copyright --- opencascade-7.4.1+dfsg1/debian/copyright 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/copyright 2021-02-07 12:08:52.000000000 +0000 @@ -44,7 +44,7 @@ samples/ios: Non-free license samples/mfc: Windows cruft samples/qt/FuncDemo: Non-free license -Files-Excluded: +Files-Excluded: genconf.bat gendoc.bat genproj.bat @@ -54,7 +54,7 @@ samples/qt/FuncDemo Files: * -Copyright: 1990-2000 by Matra Datavision, +Copyright: 1990-2000 by Matra Datavision 1999-2017 Open CASCADE SAS 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -109,14 +109,10 @@ for internal or external distribution as long as this notice remains attached. -Files: src/OpenGl/glext.h -Copyright: 2013-2014 The Khronos Group Inc. -License: Expat - Files: src/ExprIntrp/ExprIntrp.tab.* src/StepFile/step.tab.* Copyright: 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. -License: GPL-3+ with Bison exception 2.2 +License: GPL-3+-with-Bison-exception-2.2 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 @@ -143,6 +139,10 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. +Files: src/OpenGl/glext.h +Copyright: 2013-2014 The Khronos Group Inc. +License: Expat + Files: adm/cmake/cotire.cmake Copyright: 2012-2016 Sascha Kratky License: Expat @@ -151,25 +151,6 @@ Copyright: 2012 Leonhard Gruenschloss License: Expat -License: Expat - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is furnished to do - so, subject to the following conditions: - . - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - . - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - Files: debian/* Copyright: 2008-2011 "Adam C. Powell, IV" 2017 Normand Chamberland @@ -193,3 +174,22 @@ On Debian systems, the full text of the GNU Lesser General Public License version 2.1 can be found in the file `/usr/share/common-licenses/LGPL-2.1'. + +License: Expat + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do + so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. diff -Nru opencascade-7.4.1+dfsg1/debian/gitlab-ci.yml opencascade-7.5.1+dfsg1/debian/gitlab-ci.yml --- opencascade-7.4.1+dfsg1/debian/gitlab-ci.yml 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/gitlab-ci.yml 2021-02-01 03:05:25.000000000 +0000 @@ -2,3 +2,9 @@ include: - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml + +variables: +# dbgsym packages will fail the build by exceeding the allowed artifact size. + DEB_BUILD_OPTIONS: "noddebs" +# repotest takes too long and will fail the build by hitting the timeout. + SALSA_CI_DISABLE_REPROTEST: 1 diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-7.4.install opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-7.4.install --- opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-7.4.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-7.4.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -usr/lib/*/libTKBinXCAF.so.* -usr/lib/*/libTKIGES.so.* -usr/lib/*/libTKSTEP.so.* -usr/lib/*/libTKSTEP209.so.* -usr/lib/*/libTKSTEPAttr.so.* -usr/lib/*/libTKSTEPBase.so.* -usr/lib/*/libTKSTL.so.* -usr/lib/*/libTKVRML.so.* -usr/lib/*/libTKXCAF.so.* -usr/lib/*/libTKXDEIGES.so.* -usr/lib/*/libTKXDESTEP.so.* -usr/lib/*/libTKXSBase.so.* -usr/lib/*/libTKXmlXCAF.so.* -usr/lib/*/libTKRWMesh.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-7.4.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-7.4.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-7.4.lintian-overrides 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-7.4.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -# this package contains a bunch of libraries and can thus not be named properly -package-name-doesnt-match-sonames -# symbols control files are not sustainable. -no-symbols-control-file diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-7.5.install opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-7.5.install --- opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-7.5.install 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-7.5.install 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,14 @@ +usr/lib/*/libTKBinXCAF.so.* +usr/lib/*/libTKIGES.so.* +usr/lib/*/libTKRWMesh.so.* +usr/lib/*/libTKSTEP209.so.* +usr/lib/*/libTKSTEPAttr.so.* +usr/lib/*/libTKSTEPBase.so.* +usr/lib/*/libTKSTEP.so.* +usr/lib/*/libTKSTL.so.* +usr/lib/*/libTKVRML.so.* +usr/lib/*/libTKXCAF.so.* +usr/lib/*/libTKXDEIGES.so.* +usr/lib/*/libTKXDESTEP.so.* +usr/lib/*/libTKXmlXCAF.so.* +usr/lib/*/libTKXSBase.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-7.5.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-7.5.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-7.5.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-7.5.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,6 @@ +# this package contains a bunch of libraries and can thus not be named properly +package-name-doesnt-match-sonames +# symbols control files are not sustainable. +no-symbols-control-file +# This is lintian bug #966295 +libocct-data-exchange-7.5: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-dev.install opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-dev.install --- opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-dev.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-dev.install 2021-02-07 12:08:52.000000000 +0000 @@ -1,42 +1,29 @@ usr/include/opencascade/APIHeaderSection_EditHeader.hxx usr/include/opencascade/APIHeaderSection_MakeHeader.hxx -usr/include/opencascade/BRepToIGESBRep_Entity.hxx -usr/include/opencascade/BRepToIGES_BREntity.hxx -usr/include/opencascade/BRepToIGES_BRShell.hxx -usr/include/opencascade/BRepToIGES_BRSolid.hxx -usr/include/opencascade/BRepToIGES_BRWire.hxx usr/include/opencascade/BinMDataXtd_TriangulationDriver.hxx -usr/include/opencascade/BinMXCAFDoc.hxx -usr/include/opencascade/BinMXCAFDoc_AreaDriver.hxx usr/include/opencascade/BinMXCAFDoc_AssemblyItemRefDriver.hxx usr/include/opencascade/BinMXCAFDoc_CentroidDriver.hxx -usr/include/opencascade/BinMXCAFDoc_ClippingPlaneToolDriver.hxx usr/include/opencascade/BinMXCAFDoc_ColorDriver.hxx -usr/include/opencascade/BinMXCAFDoc_ColorToolDriver.hxx usr/include/opencascade/BinMXCAFDoc_DatumDriver.hxx usr/include/opencascade/BinMXCAFDoc_DimTolDriver.hxx -usr/include/opencascade/BinMXCAFDoc_DimTolToolDriver.hxx -usr/include/opencascade/BinMXCAFDoc_DimensionDriver.hxx -usr/include/opencascade/BinMXCAFDoc_DocumentToolDriver.hxx -usr/include/opencascade/BinMXCAFDoc_GeomToleranceDriver.hxx usr/include/opencascade/BinMXCAFDoc_GraphNodeDriver.hxx -usr/include/opencascade/BinMXCAFDoc_LayerToolDriver.hxx +usr/include/opencascade/BinMXCAFDoc.hxx usr/include/opencascade/BinMXCAFDoc_LocationDriver.hxx usr/include/opencascade/BinMXCAFDoc_LocationDriver.lxx usr/include/opencascade/BinMXCAFDoc_MaterialDriver.hxx -usr/include/opencascade/BinMXCAFDoc_MaterialToolDriver.hxx -usr/include/opencascade/BinMXCAFDoc_NoteBalloonDriver.hxx usr/include/opencascade/BinMXCAFDoc_NoteBinDataDriver.hxx usr/include/opencascade/BinMXCAFDoc_NoteCommentDriver.hxx usr/include/opencascade/BinMXCAFDoc_NoteDriver.hxx -usr/include/opencascade/BinMXCAFDoc_NotesToolDriver.hxx -usr/include/opencascade/BinMXCAFDoc_ShapeToolDriver.hxx -usr/include/opencascade/BinMXCAFDoc_ViewDriver.hxx -usr/include/opencascade/BinMXCAFDoc_ViewToolDriver.hxx -usr/include/opencascade/BinMXCAFDoc_VolumeDriver.hxx -usr/include/opencascade/BinXCAFDrivers.hxx +usr/include/opencascade/BinMXCAFDoc_VisMaterialDriver.hxx +usr/include/opencascade/BinMXCAFDoc_VisMaterialToolDriver.hxx usr/include/opencascade/BinXCAFDrivers_DocumentRetrievalDriver.hxx usr/include/opencascade/BinXCAFDrivers_DocumentStorageDriver.hxx +usr/include/opencascade/BinXCAFDrivers.hxx +usr/include/opencascade/BRepToIGES_BREntity.hxx +usr/include/opencascade/BRepToIGESBRep_Entity.hxx +usr/include/opencascade/BRepToIGES_BRShell.hxx +usr/include/opencascade/BRepToIGES_BRSolid.hxx +usr/include/opencascade/BRepToIGES_BRWire.hxx usr/include/opencascade/Geom2dToIGES_Geom2dCurve.hxx usr/include/opencascade/Geom2dToIGES_Geom2dEntity.hxx usr/include/opencascade/Geom2dToIGES_Geom2dPoint.hxx @@ -49,16 +36,16 @@ usr/include/opencascade/GeomToStep_MakeAxis1Placement.hxx usr/include/opencascade/GeomToStep_MakeAxis2Placement2d.hxx usr/include/opencascade/GeomToStep_MakeAxis2Placement3d.hxx -usr/include/opencascade/GeomToStep_MakeBSplineCurveWithKnots.hxx -usr/include/opencascade/GeomToStep_MakeBSplineCurveWithKnotsAndRationalBSplineCurve.hxx -usr/include/opencascade/GeomToStep_MakeBSplineSurfaceWithKnots.hxx -usr/include/opencascade/GeomToStep_MakeBSplineSurfaceWithKnotsAndRationalBSplineSurface.hxx usr/include/opencascade/GeomToStep_MakeBoundedCurve.hxx usr/include/opencascade/GeomToStep_MakeBoundedSurface.hxx +usr/include/opencascade/GeomToStep_MakeBSplineCurveWithKnotsAndRationalBSplineCurve.hxx +usr/include/opencascade/GeomToStep_MakeBSplineCurveWithKnots.hxx +usr/include/opencascade/GeomToStep_MakeBSplineSurfaceWithKnotsAndRationalBSplineSurface.hxx +usr/include/opencascade/GeomToStep_MakeBSplineSurfaceWithKnots.hxx usr/include/opencascade/GeomToStep_MakeCartesianPoint.hxx usr/include/opencascade/GeomToStep_MakeCircle.hxx -usr/include/opencascade/GeomToStep_MakeConic.hxx usr/include/opencascade/GeomToStep_MakeConicalSurface.hxx +usr/include/opencascade/GeomToStep_MakeConic.hxx usr/include/opencascade/GeomToStep_MakeCurve.hxx usr/include/opencascade/GeomToStep_MakeCylindricalSurface.hxx usr/include/opencascade/GeomToStep_MakeDirection.hxx @@ -78,10 +65,10 @@ usr/include/opencascade/GeomToStep_MakeToroidalSurface.hxx usr/include/opencascade/GeomToStep_MakeVector.hxx usr/include/opencascade/GeomToStep_Root.hxx -usr/include/opencascade/HeaderSection.hxx usr/include/opencascade/HeaderSection_FileDescription.hxx usr/include/opencascade/HeaderSection_FileName.hxx usr/include/opencascade/HeaderSection_FileSchema.hxx +usr/include/opencascade/HeaderSection.hxx usr/include/opencascade/HeaderSection_Protocol.hxx usr/include/opencascade/IFGraph_AllConnected.hxx usr/include/opencascade/IFGraph_AllShared.hxx @@ -94,36 +81,36 @@ usr/include/opencascade/IFGraph_SCRoots.hxx usr/include/opencascade/IFGraph_StrongComponants.hxx usr/include/opencascade/IFGraph_SubPartsIterator.hxx -usr/include/opencascade/IFSelect.hxx -usr/include/opencascade/IFSelect_Act.hxx usr/include/opencascade/IFSelect_ActFunc.hxx +usr/include/opencascade/IFSelect_Act.hxx usr/include/opencascade/IFSelect_Activator.hxx usr/include/opencascade/IFSelect_AppliedModifiers.hxx usr/include/opencascade/IFSelect_BasicDumper.hxx usr/include/opencascade/IFSelect_CheckCounter.hxx usr/include/opencascade/IFSelect_ContextModif.hxx usr/include/opencascade/IFSelect_ContextWrite.hxx +usr/include/opencascade/IFSelect_Dispatch.hxx usr/include/opencascade/IFSelect_DispGlobal.hxx usr/include/opencascade/IFSelect_DispPerCount.hxx usr/include/opencascade/IFSelect_DispPerFiles.hxx usr/include/opencascade/IFSelect_DispPerOne.hxx usr/include/opencascade/IFSelect_DispPerSignature.hxx -usr/include/opencascade/IFSelect_Dispatch.hxx usr/include/opencascade/IFSelect_EditForm.hxx -usr/include/opencascade/IFSelect_EditValue.hxx usr/include/opencascade/IFSelect_Editor.hxx +usr/include/opencascade/IFSelect_EditValue.hxx usr/include/opencascade/IFSelect_FileModifier.gxx usr/include/opencascade/IFSelect_Functions.hxx usr/include/opencascade/IFSelect_GeneralModifier.hxx usr/include/opencascade/IFSelect_GraphCounter.hxx usr/include/opencascade/IFSelect_HSeqOfSelection.hxx +usr/include/opencascade/IFSelect.hxx usr/include/opencascade/IFSelect_IntParam.hxx usr/include/opencascade/IFSelect_ListEditor.hxx usr/include/opencascade/IFSelect_ModelCopier.hxx usr/include/opencascade/IFSelect_ModelModifier.gxx usr/include/opencascade/IFSelect_ModifEditForm.hxx -usr/include/opencascade/IFSelect_ModifReorder.hxx usr/include/opencascade/IFSelect_Modifier.hxx +usr/include/opencascade/IFSelect_ModifReorder.hxx usr/include/opencascade/IFSelect_PacketList.hxx usr/include/opencascade/IFSelect_ParamEditor.hxx usr/include/opencascade/IFSelect_PrintCount.hxx @@ -142,9 +129,11 @@ usr/include/opencascade/IFSelect_SelectExplore.hxx usr/include/opencascade/IFSelect_SelectExtract.hxx usr/include/opencascade/IFSelect_SelectFlag.hxx -usr/include/opencascade/IFSelect_SelectInList.hxx usr/include/opencascade/IFSelect_SelectIncorrectEntities.hxx +usr/include/opencascade/IFSelect_SelectInList.hxx usr/include/opencascade/IFSelect_SelectIntersection.hxx +usr/include/opencascade/IFSelect_Selection.hxx +usr/include/opencascade/IFSelect_SelectionIterator.hxx usr/include/opencascade/IFSelect_SelectModelEntities.hxx usr/include/opencascade/IFSelect_SelectModelRoots.hxx usr/include/opencascade/IFSelect_SelectPointed.hxx @@ -161,8 +150,6 @@ usr/include/opencascade/IFSelect_SelectType.hxx usr/include/opencascade/IFSelect_SelectUnion.hxx usr/include/opencascade/IFSelect_SelectUnknownEntities.hxx -usr/include/opencascade/IFSelect_Selection.hxx -usr/include/opencascade/IFSelect_SelectionIterator.hxx usr/include/opencascade/IFSelect_SequenceOfAppliedModifiers.hxx usr/include/opencascade/IFSelect_SequenceOfGeneralModifier.hxx usr/include/opencascade/IFSelect_SequenceOfInterfaceModel.hxx @@ -172,20 +159,19 @@ usr/include/opencascade/IFSelect_ShareOut.hxx usr/include/opencascade/IFSelect_ShareOutResult.hxx usr/include/opencascade/IFSelect_SignAncestor.hxx +usr/include/opencascade/IFSelect_Signature.hxx +usr/include/opencascade/IFSelect_SignatureList.hxx usr/include/opencascade/IFSelect_SignCategory.hxx usr/include/opencascade/IFSelect_SignCounter.hxx usr/include/opencascade/IFSelect_SignMultiple.hxx usr/include/opencascade/IFSelect_SignType.hxx usr/include/opencascade/IFSelect_SignValidity.hxx -usr/include/opencascade/IFSelect_Signature.hxx -usr/include/opencascade/IFSelect_SignatureList.hxx +usr/include/opencascade/IFSelect_Transformer.hxx +usr/include/opencascade/IFSelect_TransformStandard.hxx usr/include/opencascade/IFSelect_TSeqOfDispatch.hxx usr/include/opencascade/IFSelect_TSeqOfSelection.hxx -usr/include/opencascade/IFSelect_TransformStandard.hxx -usr/include/opencascade/IFSelect_Transformer.hxx usr/include/opencascade/IFSelect_WorkLibrary.hxx usr/include/opencascade/IFSelect_WorkSession.hxx -usr/include/opencascade/IGESAppli.hxx usr/include/opencascade/IGESAppli_Array1OfFiniteElement.hxx usr/include/opencascade/IGESAppli_Array1OfFlow.hxx usr/include/opencascade/IGESAppli_Array1OfNode.hxx @@ -198,6 +184,7 @@ usr/include/opencascade/IGESAppli_HArray1OfFiniteElement.hxx usr/include/opencascade/IGESAppli_HArray1OfFlow.hxx usr/include/opencascade/IGESAppli_HArray1OfNode.hxx +usr/include/opencascade/IGESAppli.hxx usr/include/opencascade/IGESAppli_LevelFunction.hxx usr/include/opencascade/IGESAppli_LevelToPWBLayerMap.hxx usr/include/opencascade/IGESAppli_LineWidening.hxx @@ -205,12 +192,12 @@ usr/include/opencascade/IGESAppli_NodalDisplAndRot.hxx usr/include/opencascade/IGESAppli_NodalResults.hxx usr/include/opencascade/IGESAppli_Node.hxx -usr/include/opencascade/IGESAppli_PWBArtworkStackup.hxx -usr/include/opencascade/IGESAppli_PWBDrilledHole.hxx usr/include/opencascade/IGESAppli_PartNumber.hxx usr/include/opencascade/IGESAppli_PinNumber.hxx usr/include/opencascade/IGESAppli_PipingFlow.hxx usr/include/opencascade/IGESAppli_Protocol.hxx +usr/include/opencascade/IGESAppli_PWBArtworkStackup.hxx +usr/include/opencascade/IGESAppli_PWBDrilledHole.hxx usr/include/opencascade/IGESAppli_ReadWriteModule.hxx usr/include/opencascade/IGESAppli_ReferenceDesignator.hxx usr/include/opencascade/IGESAppli_RegionRestriction.hxx @@ -227,23 +214,22 @@ usr/include/opencascade/IGESAppli_ToolNodalDisplAndRot.hxx usr/include/opencascade/IGESAppli_ToolNodalResults.hxx usr/include/opencascade/IGESAppli_ToolNode.hxx -usr/include/opencascade/IGESAppli_ToolPWBArtworkStackup.hxx -usr/include/opencascade/IGESAppli_ToolPWBDrilledHole.hxx usr/include/opencascade/IGESAppli_ToolPartNumber.hxx usr/include/opencascade/IGESAppli_ToolPinNumber.hxx usr/include/opencascade/IGESAppli_ToolPipingFlow.hxx +usr/include/opencascade/IGESAppli_ToolPWBArtworkStackup.hxx +usr/include/opencascade/IGESAppli_ToolPWBDrilledHole.hxx usr/include/opencascade/IGESAppli_ToolReferenceDesignator.hxx usr/include/opencascade/IGESAppli_ToolRegionRestriction.hxx -usr/include/opencascade/IGESBasic.hxx usr/include/opencascade/IGESBasic_Array1OfLineFontEntity.hxx usr/include/opencascade/IGESBasic_Array2OfHArray1OfReal.hxx usr/include/opencascade/IGESBasic_AssocGroupType.hxx +usr/include/opencascade/IGESBasic_ExternalReferenceFile.hxx usr/include/opencascade/IGESBasic_ExternalRefFile.hxx usr/include/opencascade/IGESBasic_ExternalRefFileIndex.hxx usr/include/opencascade/IGESBasic_ExternalRefFileName.hxx usr/include/opencascade/IGESBasic_ExternalRefLibName.hxx usr/include/opencascade/IGESBasic_ExternalRefName.hxx -usr/include/opencascade/IGESBasic_ExternalReferenceFile.hxx usr/include/opencascade/IGESBasic_GeneralModule.hxx usr/include/opencascade/IGESBasic_Group.hxx usr/include/opencascade/IGESBasic_GroupWithoutBackP.hxx @@ -255,6 +241,7 @@ usr/include/opencascade/IGESBasic_HArray1OfLineFontEntity.hxx usr/include/opencascade/IGESBasic_HArray2OfHArray1OfReal.hxx usr/include/opencascade/IGESBasic_Hierarchy.hxx +usr/include/opencascade/IGESBasic.hxx usr/include/opencascade/IGESBasic_Name.hxx usr/include/opencascade/IGESBasic_OrderedGroup.hxx usr/include/opencascade/IGESBasic_OrderedGroupWithoutBackP.hxx @@ -265,12 +252,12 @@ usr/include/opencascade/IGESBasic_SpecificModule.hxx usr/include/opencascade/IGESBasic_SubfigureDef.hxx usr/include/opencascade/IGESBasic_ToolAssocGroupType.hxx +usr/include/opencascade/IGESBasic_ToolExternalReferenceFile.hxx usr/include/opencascade/IGESBasic_ToolExternalRefFile.hxx usr/include/opencascade/IGESBasic_ToolExternalRefFileIndex.hxx usr/include/opencascade/IGESBasic_ToolExternalRefFileName.hxx usr/include/opencascade/IGESBasic_ToolExternalRefLibName.hxx usr/include/opencascade/IGESBasic_ToolExternalRefName.hxx -usr/include/opencascade/IGESBasic_ToolExternalReferenceFile.hxx usr/include/opencascade/IGESBasic_ToolGroup.hxx usr/include/opencascade/IGESBasic_ToolGroupWithoutBackP.hxx usr/include/opencascade/IGESBasic_ToolHierarchy.hxx @@ -291,18 +278,17 @@ usr/include/opencascade/IGESControl_Reader.lxx usr/include/opencascade/IGESControl_ToolContainer.hxx usr/include/opencascade/IGESControl_Writer.hxx -usr/include/opencascade/IGESConvGeom.hxx usr/include/opencascade/IGESConvGeom_GeomBuilder.hxx -usr/include/opencascade/IGESData.hxx +usr/include/opencascade/IGESConvGeom.hxx usr/include/opencascade/IGESData_Array1OfDirPart.hxx usr/include/opencascade/IGESData_Array1OfIGESEntity.hxx usr/include/opencascade/IGESData_BasicEditor.hxx usr/include/opencascade/IGESData_ColorEntity.hxx +usr/include/opencascade/IGESData_DefaultGeneral.hxx +usr/include/opencascade/IGESData_DefaultSpecific.hxx usr/include/opencascade/IGESData_DefList.hxx usr/include/opencascade/IGESData_DefSwitch.hxx usr/include/opencascade/IGESData_DefType.hxx -usr/include/opencascade/IGESData_DefaultGeneral.hxx -usr/include/opencascade/IGESData_DefaultSpecific.hxx usr/include/opencascade/IGESData_DirChecker.hxx usr/include/opencascade/IGESData_DirPart.hxx usr/include/opencascade/IGESData_Dump.hxx @@ -314,6 +300,7 @@ usr/include/opencascade/IGESData_GlobalNodeOfWriterLib.hxx usr/include/opencascade/IGESData_GlobalSection.hxx usr/include/opencascade/IGESData_HArray1OfIGESEntity.hxx +usr/include/opencascade/IGESData.hxx usr/include/opencascade/IGESData_IGESDumper.hxx usr/include/opencascade/IGESData_IGESEntity.hxx usr/include/opencascade/IGESData_IGESModel.hxx @@ -342,7 +329,6 @@ usr/include/opencascade/IGESData_UndefinedEntity.hxx usr/include/opencascade/IGESData_ViewKindEntity.hxx usr/include/opencascade/IGESData_WriterLib.hxx -usr/include/opencascade/IGESDefs.hxx usr/include/opencascade/IGESDefs_Array1OfTabularData.hxx usr/include/opencascade/IGESDefs_AssociativityDef.hxx usr/include/opencascade/IGESDefs_AttributeDef.hxx @@ -351,6 +337,7 @@ usr/include/opencascade/IGESDefs_GenericData.hxx usr/include/opencascade/IGESDefs_HArray1OfHArray1OfTextDisplayTemplate.hxx usr/include/opencascade/IGESDefs_HArray1OfTabularData.hxx +usr/include/opencascade/IGESDefs.hxx usr/include/opencascade/IGESDefs_MacroDef.hxx usr/include/opencascade/IGESDefs_Protocol.hxx usr/include/opencascade/IGESDefs_ReadWriteModule.hxx @@ -364,7 +351,6 @@ usr/include/opencascade/IGESDefs_ToolTabularData.hxx usr/include/opencascade/IGESDefs_ToolUnitsData.hxx usr/include/opencascade/IGESDefs_UnitsData.hxx -usr/include/opencascade/IGESDimen.hxx usr/include/opencascade/IGESDimen_AngularDimension.hxx usr/include/opencascade/IGESDimen_Array1OfGeneralNote.hxx usr/include/opencascade/IGESDimen_Array1OfLeaderArrow.hxx @@ -373,9 +359,9 @@ usr/include/opencascade/IGESDimen_CurveDimension.hxx usr/include/opencascade/IGESDimen_DiameterDimension.hxx usr/include/opencascade/IGESDimen_DimensionDisplayData.hxx +usr/include/opencascade/IGESDimen_DimensionedGeometry.hxx usr/include/opencascade/IGESDimen_DimensionTolerance.hxx usr/include/opencascade/IGESDimen_DimensionUnits.hxx -usr/include/opencascade/IGESDimen_DimensionedGeometry.hxx usr/include/opencascade/IGESDimen_FlagNote.hxx usr/include/opencascade/IGESDimen_GeneralLabel.hxx usr/include/opencascade/IGESDimen_GeneralModule.hxx @@ -383,6 +369,7 @@ usr/include/opencascade/IGESDimen_GeneralSymbol.hxx usr/include/opencascade/IGESDimen_HArray1OfGeneralNote.hxx usr/include/opencascade/IGESDimen_HArray1OfLeaderArrow.hxx +usr/include/opencascade/IGESDimen.hxx usr/include/opencascade/IGESDimen_LeaderArrow.hxx usr/include/opencascade/IGESDimen_LinearDimension.hxx usr/include/opencascade/IGESDimen_NewDimensionedGeometry.hxx @@ -392,8 +379,8 @@ usr/include/opencascade/IGESDimen_Protocol.hxx usr/include/opencascade/IGESDimen_RadiusDimension.hxx usr/include/opencascade/IGESDimen_ReadWriteModule.hxx -usr/include/opencascade/IGESDimen_Section.hxx usr/include/opencascade/IGESDimen_SectionedArea.hxx +usr/include/opencascade/IGESDimen_Section.hxx usr/include/opencascade/IGESDimen_SpecificModule.hxx usr/include/opencascade/IGESDimen_ToolAngularDimension.hxx usr/include/opencascade/IGESDimen_ToolBasicDimension.hxx @@ -401,9 +388,9 @@ usr/include/opencascade/IGESDimen_ToolCurveDimension.hxx usr/include/opencascade/IGESDimen_ToolDiameterDimension.hxx usr/include/opencascade/IGESDimen_ToolDimensionDisplayData.hxx +usr/include/opencascade/IGESDimen_ToolDimensionedGeometry.hxx usr/include/opencascade/IGESDimen_ToolDimensionTolerance.hxx usr/include/opencascade/IGESDimen_ToolDimensionUnits.hxx -usr/include/opencascade/IGESDimen_ToolDimensionedGeometry.hxx usr/include/opencascade/IGESDimen_ToolFlagNote.hxx usr/include/opencascade/IGESDimen_ToolGeneralLabel.hxx usr/include/opencascade/IGESDimen_ToolGeneralNote.hxx @@ -415,11 +402,10 @@ usr/include/opencascade/IGESDimen_ToolOrdinateDimension.hxx usr/include/opencascade/IGESDimen_ToolPointDimension.hxx usr/include/opencascade/IGESDimen_ToolRadiusDimension.hxx -usr/include/opencascade/IGESDimen_ToolSection.hxx usr/include/opencascade/IGESDimen_ToolSectionedArea.hxx +usr/include/opencascade/IGESDimen_ToolSection.hxx usr/include/opencascade/IGESDimen_ToolWitnessLine.hxx usr/include/opencascade/IGESDimen_WitnessLine.hxx -usr/include/opencascade/IGESDraw.hxx usr/include/opencascade/IGESDraw_Array1OfConnectPoint.hxx usr/include/opencascade/IGESDraw_Array1OfViewKindEntity.hxx usr/include/opencascade/IGESDraw_CircArraySubfigure.hxx @@ -429,9 +415,10 @@ usr/include/opencascade/IGESDraw_GeneralModule.hxx usr/include/opencascade/IGESDraw_HArray1OfConnectPoint.hxx usr/include/opencascade/IGESDraw_HArray1OfViewKindEntity.hxx +usr/include/opencascade/IGESDraw.hxx usr/include/opencascade/IGESDraw_LabelDisplay.hxx -usr/include/opencascade/IGESDraw_NetworkSubfigure.hxx usr/include/opencascade/IGESDraw_NetworkSubfigureDef.hxx +usr/include/opencascade/IGESDraw_NetworkSubfigure.hxx usr/include/opencascade/IGESDraw_PerspectiveView.hxx usr/include/opencascade/IGESDraw_Planar.hxx usr/include/opencascade/IGESDraw_Protocol.hxx @@ -444,8 +431,8 @@ usr/include/opencascade/IGESDraw_ToolDrawing.hxx usr/include/opencascade/IGESDraw_ToolDrawingWithRotation.hxx usr/include/opencascade/IGESDraw_ToolLabelDisplay.hxx -usr/include/opencascade/IGESDraw_ToolNetworkSubfigure.hxx usr/include/opencascade/IGESDraw_ToolNetworkSubfigureDef.hxx +usr/include/opencascade/IGESDraw_ToolNetworkSubfigure.hxx usr/include/opencascade/IGESDraw_ToolPerspectiveView.hxx usr/include/opencascade/IGESDraw_ToolPlanar.hxx usr/include/opencascade/IGESDraw_ToolRectArraySubfigure.hxx @@ -457,14 +444,13 @@ usr/include/opencascade/IGESDraw_ViewsVisible.hxx usr/include/opencascade/IGESDraw_ViewsVisibleWithAttr.hxx usr/include/opencascade/IGESFile_Read.hxx -usr/include/opencascade/IGESGeom.hxx usr/include/opencascade/IGESGeom_Array1OfBoundary.hxx usr/include/opencascade/IGESGeom_Array1OfCurveOnSurface.hxx usr/include/opencascade/IGESGeom_Array1OfTransformationMatrix.hxx -usr/include/opencascade/IGESGeom_BSplineCurve.hxx -usr/include/opencascade/IGESGeom_BSplineSurface.hxx usr/include/opencascade/IGESGeom_Boundary.hxx usr/include/opencascade/IGESGeom_BoundedSurface.hxx +usr/include/opencascade/IGESGeom_BSplineCurve.hxx +usr/include/opencascade/IGESGeom_BSplineSurface.hxx usr/include/opencascade/IGESGeom_CircularArc.hxx usr/include/opencascade/IGESGeom_CompositeCurve.hxx usr/include/opencascade/IGESGeom_ConicArc.hxx @@ -476,6 +462,7 @@ usr/include/opencascade/IGESGeom_HArray1OfBoundary.hxx usr/include/opencascade/IGESGeom_HArray1OfCurveOnSurface.hxx usr/include/opencascade/IGESGeom_HArray1OfTransformationMatrix.hxx +usr/include/opencascade/IGESGeom.hxx usr/include/opencascade/IGESGeom_Line.hxx usr/include/opencascade/IGESGeom_OffsetCurve.hxx usr/include/opencascade/IGESGeom_OffsetSurface.hxx @@ -489,10 +476,10 @@ usr/include/opencascade/IGESGeom_SplineSurface.hxx usr/include/opencascade/IGESGeom_SurfaceOfRevolution.hxx usr/include/opencascade/IGESGeom_TabulatedCylinder.hxx -usr/include/opencascade/IGESGeom_ToolBSplineCurve.hxx -usr/include/opencascade/IGESGeom_ToolBSplineSurface.hxx usr/include/opencascade/IGESGeom_ToolBoundary.hxx usr/include/opencascade/IGESGeom_ToolBoundedSurface.hxx +usr/include/opencascade/IGESGeom_ToolBSplineCurve.hxx +usr/include/opencascade/IGESGeom_ToolBSplineSurface.hxx usr/include/opencascade/IGESGeom_ToolCircularArc.hxx usr/include/opencascade/IGESGeom_ToolCompositeCurve.hxx usr/include/opencascade/IGESGeom_ToolConicArc.hxx @@ -514,7 +501,6 @@ usr/include/opencascade/IGESGeom_ToolTrimmedSurface.hxx usr/include/opencascade/IGESGeom_TransformationMatrix.hxx usr/include/opencascade/IGESGeom_TrimmedSurface.hxx -usr/include/opencascade/IGESGraph.hxx usr/include/opencascade/IGESGraph_Array1OfColor.hxx usr/include/opencascade/IGESGraph_Array1OfTextDisplayTemplate.hxx usr/include/opencascade/IGESGraph_Array1OfTextFontDef.hxx @@ -527,6 +513,7 @@ usr/include/opencascade/IGESGraph_HArray1OfTextDisplayTemplate.hxx usr/include/opencascade/IGESGraph_HArray1OfTextFontDef.hxx usr/include/opencascade/IGESGraph_HighLight.hxx +usr/include/opencascade/IGESGraph.hxx usr/include/opencascade/IGESGraph_IntercharacterSpacing.hxx usr/include/opencascade/IGESGraph_LineFontDefPattern.hxx usr/include/opencascade/IGESGraph_LineFontDefTemplate.hxx @@ -553,7 +540,7 @@ usr/include/opencascade/IGESGraph_ToolTextFontDef.hxx usr/include/opencascade/IGESGraph_ToolUniformRectGrid.hxx usr/include/opencascade/IGESGraph_UniformRectGrid.hxx -usr/include/opencascade/IGESSelect.hxx +usr/include/opencascade/igesread.h usr/include/opencascade/IGESSelect_Activator.hxx usr/include/opencascade/IGESSelect_AddFileComment.hxx usr/include/opencascade/IGESSelect_AddGroup.hxx @@ -569,6 +556,7 @@ usr/include/opencascade/IGESSelect_EditHeader.hxx usr/include/opencascade/IGESSelect_FileModifier.hxx usr/include/opencascade/IGESSelect_FloatFormat.hxx +usr/include/opencascade/IGESSelect.hxx usr/include/opencascade/IGESSelect_IGESName.hxx usr/include/opencascade/IGESSelect_IGESTypeForm.hxx usr/include/opencascade/IGESSelect_ModelModifier.hxx @@ -600,7 +588,6 @@ usr/include/opencascade/IGESSelect_UpdateLastChange.hxx usr/include/opencascade/IGESSelect_ViewSorter.hxx usr/include/opencascade/IGESSelect_WorkLibrary.hxx -usr/include/opencascade/IGESSolid.hxx usr/include/opencascade/IGESSolid_Array1OfFace.hxx usr/include/opencascade/IGESSolid_Array1OfLoop.hxx usr/include/opencascade/IGESSolid_Array1OfShell.hxx @@ -619,6 +606,7 @@ usr/include/opencascade/IGESSolid_HArray1OfLoop.hxx usr/include/opencascade/IGESSolid_HArray1OfShell.hxx usr/include/opencascade/IGESSolid_HArray1OfVertexList.hxx +usr/include/opencascade/IGESSolid.hxx usr/include/opencascade/IGESSolid_Loop.hxx usr/include/opencascade/IGESSolid_ManifoldSolid.hxx usr/include/opencascade/IGESSolid_PlaneSurface.hxx @@ -662,15 +650,15 @@ usr/include/opencascade/IGESSolid_ToroidalSurface.hxx usr/include/opencascade/IGESSolid_Torus.hxx usr/include/opencascade/IGESSolid_VertexList.hxx -usr/include/opencascade/IGESToBRep.hxx usr/include/opencascade/IGESToBRep_Actor.hxx usr/include/opencascade/IGESToBRep_AlgoContainer.hxx usr/include/opencascade/IGESToBRep_AlgoContainer.lxx -usr/include/opencascade/IGESToBRep_BRepEntity.hxx usr/include/opencascade/IGESToBRep_BasicCurve.hxx usr/include/opencascade/IGESToBRep_BasicSurface.hxx +usr/include/opencascade/IGESToBRep_BRepEntity.hxx usr/include/opencascade/IGESToBRep_CurveAndSurface.hxx usr/include/opencascade/IGESToBRep_CurveAndSurface.lxx +usr/include/opencascade/IGESToBRep.hxx usr/include/opencascade/IGESToBRep_IGESBoundary.hxx usr/include/opencascade/IGESToBRep_IGESBoundary.lxx usr/include/opencascade/IGESToBRep_Reader.hxx @@ -681,8 +669,8 @@ usr/include/opencascade/Interface_Array1OfHAsciiString.hxx usr/include/opencascade/Interface_BitMap.hxx usr/include/opencascade/Interface_Category.hxx -usr/include/opencascade/Interface_Check.hxx usr/include/opencascade/Interface_CheckFailure.hxx +usr/include/opencascade/Interface_Check.hxx usr/include/opencascade/Interface_CheckIterator.hxx usr/include/opencascade/Interface_CheckStatus.hxx usr/include/opencascade/Interface_CheckTool.hxx @@ -699,27 +687,27 @@ usr/include/opencascade/Interface_FileReaderData.hxx usr/include/opencascade/Interface_FileReaderTool.hxx usr/include/opencascade/Interface_FloatWriter.hxx -usr/include/opencascade/Interface_GTool.hxx usr/include/opencascade/Interface_GeneralLib.hxx usr/include/opencascade/Interface_GeneralModule.hxx usr/include/opencascade/Interface_GlobalNodeOfGeneralLib.hxx usr/include/opencascade/Interface_GlobalNodeOfReaderLib.hxx -usr/include/opencascade/Interface_Graph.hxx usr/include/opencascade/Interface_GraphContent.hxx +usr/include/opencascade/Interface_Graph.hxx +usr/include/opencascade/Interface_GTool.hxx usr/include/opencascade/Interface_HArray1OfHAsciiString.hxx usr/include/opencascade/Interface_HGraph.hxx usr/include/opencascade/Interface_HSequenceOfCheck.hxx usr/include/opencascade/Interface_IndexedMapOfAsciiString.hxx -usr/include/opencascade/Interface_IntList.hxx -usr/include/opencascade/Interface_IntVal.hxx usr/include/opencascade/Interface_InterfaceError.hxx usr/include/opencascade/Interface_InterfaceMismatch.hxx usr/include/opencascade/Interface_InterfaceModel.hxx +usr/include/opencascade/Interface_IntList.hxx +usr/include/opencascade/Interface_IntVal.hxx usr/include/opencascade/Interface_JaggedArray.gxx usr/include/opencascade/Interface_LineBuffer.hxx -usr/include/opencascade/Interface_MSG.hxx usr/include/opencascade/Interface_Macros.hxx usr/include/opencascade/Interface_MapAsciiStringHasher.hxx +usr/include/opencascade/Interface_MSG.hxx usr/include/opencascade/Interface_NodeOfGeneralLib.hxx usr/include/opencascade/Interface_NodeOfReaderLib.hxx usr/include/opencascade/Interface_ParamList.hxx @@ -731,12 +719,12 @@ usr/include/opencascade/Interface_ReaderModule.hxx usr/include/opencascade/Interface_Recognizer.gxx usr/include/opencascade/Interface_ReportEntity.hxx -usr/include/opencascade/Interface_STAT.hxx usr/include/opencascade/Interface_SequenceOfCheck.hxx usr/include/opencascade/Interface_ShareFlags.hxx usr/include/opencascade/Interface_ShareTool.hxx usr/include/opencascade/Interface_SignLabel.hxx usr/include/opencascade/Interface_SignType.hxx +usr/include/opencascade/Interface_STAT.hxx usr/include/opencascade/Interface_Static.hxx usr/include/opencascade/Interface_StaticSatisfies.hxx usr/include/opencascade/Interface_Statics.hxx @@ -757,14 +745,14 @@ usr/include/opencascade/MoniTool_DataMapIteratorOfDataMapOfTimer.hxx usr/include/opencascade/MoniTool_DataMapOfShapeTransient.hxx usr/include/opencascade/MoniTool_DataMapOfTimer.hxx -usr/include/opencascade/MoniTool_ElemHasher.hxx usr/include/opencascade/MoniTool_Element.hxx +usr/include/opencascade/MoniTool_ElemHasher.hxx usr/include/opencascade/MoniTool_HSequenceOfElement.hxx usr/include/opencascade/MoniTool_IndexedDataMapOfShapeTransient.hxx usr/include/opencascade/MoniTool_IntVal.hxx +usr/include/opencascade/MoniTool_Macros.hxx usr/include/opencascade/MoniTool_MTHasher.hxx usr/include/opencascade/MoniTool_MTHasher.lxx -usr/include/opencascade/MoniTool_Macros.hxx usr/include/opencascade/MoniTool_RealVal.hxx usr/include/opencascade/MoniTool_SequenceOfElement.hxx usr/include/opencascade/MoniTool_SignShape.hxx @@ -779,12 +767,49 @@ usr/include/opencascade/MoniTool_ValueInterpret.hxx usr/include/opencascade/MoniTool_ValueSatisfies.hxx usr/include/opencascade/MoniTool_ValueType.hxx -usr/include/opencascade/RWHeaderSection.hxx +usr/include/opencascade/RWGltf_CafReader.hxx +usr/include/opencascade/RWGltf_CafWriter.hxx +usr/include/opencascade/RWGltf_GltfAccessorCompType.hxx +usr/include/opencascade/RWGltf_GltfAccessor.hxx +usr/include/opencascade/RWGltf_GltfAccessorLayout.hxx +usr/include/opencascade/RWGltf_GltfAlphaMode.hxx +usr/include/opencascade/RWGltf_GltfArrayType.hxx +usr/include/opencascade/RWGltf_GltfBufferView.hxx +usr/include/opencascade/RWGltf_GltfBufferViewTarget.hxx +usr/include/opencascade/RWGltf_GltfFace.hxx +usr/include/opencascade/RWGltf_GltfLatePrimitiveArray.hxx +usr/include/opencascade/RWGltf_GltfMaterialMap.hxx +usr/include/opencascade/RWGltf_GltfOStreamWriter.hxx +usr/include/opencascade/RWGltf_GltfPrimArrayData.hxx +usr/include/opencascade/RWGltf_GltfPrimitiveMode.hxx +usr/include/opencascade/RWGltf_GltfRootElement.hxx +usr/include/opencascade/RWGltf_GltfSceneNodeMap.hxx +usr/include/opencascade/RWGltf_MaterialCommon.hxx +usr/include/opencascade/RWGltf_MaterialMetallicRoughness.hxx +usr/include/opencascade/RWGltf_PrimitiveArrayReader.hxx +usr/include/opencascade/RWGltf_TriangulationReader.hxx +usr/include/opencascade/RWGltf_WriterTrsfFormat.hxx usr/include/opencascade/RWHeaderSection_GeneralModule.hxx +usr/include/opencascade/RWHeaderSection.hxx +usr/include/opencascade/RWHeaderSection_ReadWriteModule.hxx usr/include/opencascade/RWHeaderSection_RWFileDescription.hxx usr/include/opencascade/RWHeaderSection_RWFileName.hxx usr/include/opencascade/RWHeaderSection_RWFileSchema.hxx -usr/include/opencascade/RWHeaderSection_ReadWriteModule.hxx +usr/include/opencascade/RWMesh_CafReader.hxx +usr/include/opencascade/RWMesh_CoordinateSystemConverter.hxx +usr/include/opencascade/RWMesh_CoordinateSystem.hxx +usr/include/opencascade/RWMesh_FaceIterator.hxx +usr/include/opencascade/RWMesh_MaterialMap.hxx +usr/include/opencascade/RWMesh_NodeAttributes.hxx +usr/include/opencascade/RWObj_CafReader.hxx +usr/include/opencascade/RWObj.hxx +usr/include/opencascade/RWObj_Material.hxx +usr/include/opencascade/RWObj_MtlReader.hxx +usr/include/opencascade/RWObj_Reader.hxx +usr/include/opencascade/RWObj_SubMesh.hxx +usr/include/opencascade/RWObj_SubMeshReason.hxx +usr/include/opencascade/RWObj_Tools.hxx +usr/include/opencascade/RWObj_TriangulationReader.hxx usr/include/opencascade/RWStepAP203_RWCcDesignApproval.hxx usr/include/opencascade/RWStepAP203_RWCcDesignCertification.hxx usr/include/opencascade/RWStepAP203_RWCcDesignContract.hxx @@ -796,8 +821,9 @@ usr/include/opencascade/RWStepAP203_RWChangeRequest.hxx usr/include/opencascade/RWStepAP203_RWStartRequest.hxx usr/include/opencascade/RWStepAP203_RWStartWork.hxx -usr/include/opencascade/RWStepAP214.hxx usr/include/opencascade/RWStepAP214_GeneralModule.hxx +usr/include/opencascade/RWStepAP214.hxx +usr/include/opencascade/RWStepAP214_ReadWriteModule.hxx usr/include/opencascade/RWStepAP214_RWAppliedApprovalAssignment.hxx usr/include/opencascade/RWStepAP214_RWAppliedDateAndTimeAssignment.hxx usr/include/opencascade/RWStepAP214_RWAppliedDateAssignment.hxx @@ -824,35 +850,33 @@ usr/include/opencascade/RWStepAP214_RWExternallyDefinedClass.hxx usr/include/opencascade/RWStepAP214_RWExternallyDefinedGeneralProperty.hxx usr/include/opencascade/RWStepAP214_RWRepItemGroup.hxx -usr/include/opencascade/RWStepAP214_ReadWriteModule.hxx usr/include/opencascade/RWStepAP242_RWDraughtingModelItemAssociation.hxx usr/include/opencascade/RWStepAP242_RWGeometricItemSpecificUsage.hxx usr/include/opencascade/RWStepAP242_RWIdAttribute.hxx usr/include/opencascade/RWStepAP242_RWItemIdentifiedRepresentationUsage.hxx -usr/include/opencascade/RWStepBasic_RWAction.hxx usr/include/opencascade/RWStepBasic_RWActionAssignment.hxx +usr/include/opencascade/RWStepBasic_RWAction.hxx usr/include/opencascade/RWStepBasic_RWActionMethod.hxx usr/include/opencascade/RWStepBasic_RWActionRequestAssignment.hxx usr/include/opencascade/RWStepBasic_RWActionRequestSolution.hxx usr/include/opencascade/RWStepBasic_RWAddress.hxx -usr/include/opencascade/RWStepBasic_RWApplicationContext.hxx usr/include/opencascade/RWStepBasic_RWApplicationContextElement.hxx +usr/include/opencascade/RWStepBasic_RWApplicationContext.hxx usr/include/opencascade/RWStepBasic_RWApplicationProtocolDefinition.hxx -usr/include/opencascade/RWStepBasic_RWApproval.hxx usr/include/opencascade/RWStepBasic_RWApprovalDateTime.hxx +usr/include/opencascade/RWStepBasic_RWApproval.hxx usr/include/opencascade/RWStepBasic_RWApprovalPersonOrganization.hxx usr/include/opencascade/RWStepBasic_RWApprovalRelationship.hxx usr/include/opencascade/RWStepBasic_RWApprovalRole.hxx usr/include/opencascade/RWStepBasic_RWApprovalStatus.hxx usr/include/opencascade/RWStepBasic_RWCalendarDate.hxx -usr/include/opencascade/RWStepBasic_RWCertification.hxx usr/include/opencascade/RWStepBasic_RWCertificationAssignment.hxx +usr/include/opencascade/RWStepBasic_RWCertification.hxx usr/include/opencascade/RWStepBasic_RWCertificationType.hxx usr/include/opencascade/RWStepBasic_RWCharacterizedObject.hxx -usr/include/opencascade/RWStepBasic_RWContract.hxx usr/include/opencascade/RWStepBasic_RWContractAssignment.hxx +usr/include/opencascade/RWStepBasic_RWContract.hxx usr/include/opencascade/RWStepBasic_RWContractType.hxx -usr/include/opencascade/RWStepBasic_RWConversionBasedUnit.hxx usr/include/opencascade/RWStepBasic_RWConversionBasedUnitAndAreaUnit.hxx usr/include/opencascade/RWStepBasic_RWConversionBasedUnitAndLengthUnit.hxx usr/include/opencascade/RWStepBasic_RWConversionBasedUnitAndMassUnit.hxx @@ -861,31 +885,32 @@ usr/include/opencascade/RWStepBasic_RWConversionBasedUnitAndSolidAngleUnit.hxx usr/include/opencascade/RWStepBasic_RWConversionBasedUnitAndTimeUnit.hxx usr/include/opencascade/RWStepBasic_RWConversionBasedUnitAndVolumeUnit.hxx +usr/include/opencascade/RWStepBasic_RWConversionBasedUnit.hxx usr/include/opencascade/RWStepBasic_RWCoordinatedUniversalTimeOffset.hxx -usr/include/opencascade/RWStepBasic_RWDate.hxx usr/include/opencascade/RWStepBasic_RWDateAndTime.hxx +usr/include/opencascade/RWStepBasic_RWDate.hxx usr/include/opencascade/RWStepBasic_RWDateRole.hxx usr/include/opencascade/RWStepBasic_RWDateTimeRole.hxx -usr/include/opencascade/RWStepBasic_RWDerivedUnit.hxx usr/include/opencascade/RWStepBasic_RWDerivedUnitElement.hxx +usr/include/opencascade/RWStepBasic_RWDerivedUnit.hxx usr/include/opencascade/RWStepBasic_RWDimensionalExponents.hxx -usr/include/opencascade/RWStepBasic_RWDocument.hxx usr/include/opencascade/RWStepBasic_RWDocumentFile.hxx +usr/include/opencascade/RWStepBasic_RWDocument.hxx usr/include/opencascade/RWStepBasic_RWDocumentProductAssociation.hxx usr/include/opencascade/RWStepBasic_RWDocumentProductEquivalence.hxx usr/include/opencascade/RWStepBasic_RWDocumentRelationship.hxx usr/include/opencascade/RWStepBasic_RWDocumentRepresentationType.hxx usr/include/opencascade/RWStepBasic_RWDocumentType.hxx usr/include/opencascade/RWStepBasic_RWDocumentUsageConstraint.hxx -usr/include/opencascade/RWStepBasic_RWEffectivity.hxx usr/include/opencascade/RWStepBasic_RWEffectivityAssignment.hxx +usr/include/opencascade/RWStepBasic_RWEffectivity.hxx usr/include/opencascade/RWStepBasic_RWEulerAngles.hxx usr/include/opencascade/RWStepBasic_RWExternalIdentificationAssignment.hxx -usr/include/opencascade/RWStepBasic_RWExternalSource.hxx usr/include/opencascade/RWStepBasic_RWExternallyDefinedItem.hxx +usr/include/opencascade/RWStepBasic_RWExternalSource.hxx usr/include/opencascade/RWStepBasic_RWGeneralProperty.hxx -usr/include/opencascade/RWStepBasic_RWGroup.hxx usr/include/opencascade/RWStepBasic_RWGroupAssignment.hxx +usr/include/opencascade/RWStepBasic_RWGroup.hxx usr/include/opencascade/RWStepBasic_RWGroupRelationship.hxx usr/include/opencascade/RWStepBasic_RWIdentificationAssignment.hxx usr/include/opencascade/RWStepBasic_RWIdentificationRole.hxx @@ -900,37 +925,36 @@ usr/include/opencascade/RWStepBasic_RWNamedUnit.hxx usr/include/opencascade/RWStepBasic_RWObjectRole.hxx usr/include/opencascade/RWStepBasic_RWOrdinalDate.hxx +usr/include/opencascade/RWStepBasic_RWOrganizationalAddress.hxx usr/include/opencascade/RWStepBasic_RWOrganization.hxx usr/include/opencascade/RWStepBasic_RWOrganizationRole.hxx -usr/include/opencascade/RWStepBasic_RWOrganizationalAddress.hxx -usr/include/opencascade/RWStepBasic_RWPerson.hxx +usr/include/opencascade/RWStepBasic_RWPersonalAddress.hxx usr/include/opencascade/RWStepBasic_RWPersonAndOrganization.hxx usr/include/opencascade/RWStepBasic_RWPersonAndOrganizationRole.hxx -usr/include/opencascade/RWStepBasic_RWPersonalAddress.hxx +usr/include/opencascade/RWStepBasic_RWPerson.hxx usr/include/opencascade/RWStepBasic_RWPlaneAngleMeasureWithUnit.hxx usr/include/opencascade/RWStepBasic_RWPlaneAngleUnit.hxx -usr/include/opencascade/RWStepBasic_RWProduct.hxx usr/include/opencascade/RWStepBasic_RWProductCategory.hxx usr/include/opencascade/RWStepBasic_RWProductCategoryRelationship.hxx usr/include/opencascade/RWStepBasic_RWProductConceptContext.hxx usr/include/opencascade/RWStepBasic_RWProductContext.hxx -usr/include/opencascade/RWStepBasic_RWProductDefinition.hxx usr/include/opencascade/RWStepBasic_RWProductDefinitionContext.hxx usr/include/opencascade/RWStepBasic_RWProductDefinitionEffectivity.hxx usr/include/opencascade/RWStepBasic_RWProductDefinitionFormation.hxx usr/include/opencascade/RWStepBasic_RWProductDefinitionFormationRelationship.hxx usr/include/opencascade/RWStepBasic_RWProductDefinitionFormationWithSpecifiedSource.hxx +usr/include/opencascade/RWStepBasic_RWProductDefinition.hxx usr/include/opencascade/RWStepBasic_RWProductDefinitionReference.hxx usr/include/opencascade/RWStepBasic_RWProductDefinitionReferenceWithLocalRepresentation.hxx usr/include/opencascade/RWStepBasic_RWProductDefinitionRelationship.hxx usr/include/opencascade/RWStepBasic_RWProductDefinitionWithAssociatedDocuments.hxx +usr/include/opencascade/RWStepBasic_RWProduct.hxx usr/include/opencascade/RWStepBasic_RWProductRelatedProductCategory.hxx usr/include/opencascade/RWStepBasic_RWProductType.hxx usr/include/opencascade/RWStepBasic_RWRatioMeasureWithUnit.hxx usr/include/opencascade/RWStepBasic_RWRoleAssociation.hxx usr/include/opencascade/RWStepBasic_RWSecurityClassification.hxx usr/include/opencascade/RWStepBasic_RWSecurityClassificationLevel.hxx -usr/include/opencascade/RWStepBasic_RWSiUnit.hxx usr/include/opencascade/RWStepBasic_RWSiUnitAndAreaUnit.hxx usr/include/opencascade/RWStepBasic_RWSiUnitAndLengthUnit.hxx usr/include/opencascade/RWStepBasic_RWSiUnitAndMassUnit.hxx @@ -940,6 +964,7 @@ usr/include/opencascade/RWStepBasic_RWSiUnitAndThermodynamicTemperatureUnit.hxx usr/include/opencascade/RWStepBasic_RWSiUnitAndTimeUnit.hxx usr/include/opencascade/RWStepBasic_RWSiUnitAndVolumeUnit.hxx +usr/include/opencascade/RWStepBasic_RWSiUnit.hxx usr/include/opencascade/RWStepBasic_RWSolidAngleMeasureWithUnit.hxx usr/include/opencascade/RWStepBasic_RWSolidAngleUnit.hxx usr/include/opencascade/RWStepBasic_RWThermodynamicTemperatureUnit.hxx @@ -952,23 +977,16 @@ usr/include/opencascade/RWStepDimTol_RWCommonDatum.hxx usr/include/opencascade/RWStepDimTol_RWConcentricityTolerance.hxx usr/include/opencascade/RWStepDimTol_RWCylindricityTolerance.hxx -usr/include/opencascade/RWStepDimTol_RWDatum.hxx usr/include/opencascade/RWStepDimTol_RWDatumFeature.hxx -usr/include/opencascade/RWStepDimTol_RWDatumReference.hxx +usr/include/opencascade/RWStepDimTol_RWDatum.hxx usr/include/opencascade/RWStepDimTol_RWDatumReferenceCompartment.hxx usr/include/opencascade/RWStepDimTol_RWDatumReferenceElement.hxx +usr/include/opencascade/RWStepDimTol_RWDatumReference.hxx usr/include/opencascade/RWStepDimTol_RWDatumReferenceModifierWithValue.hxx usr/include/opencascade/RWStepDimTol_RWDatumSystem.hxx usr/include/opencascade/RWStepDimTol_RWDatumTarget.hxx usr/include/opencascade/RWStepDimTol_RWFlatnessTolerance.hxx usr/include/opencascade/RWStepDimTol_RWGeneralDatumReference.hxx -usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthDatRef.hxx -usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol.hxx -usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthDatRefAndGeoTolWthMod.hxx -usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol.hxx -usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthDatRefAndUneqDisGeoTol.hxx -usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthMaxTol.hxx -usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthMod.hxx usr/include/opencascade/RWStepDimTol_RWGeometricTolerance.hxx usr/include/opencascade/RWStepDimTol_RWGeometricToleranceRelationship.hxx usr/include/opencascade/RWStepDimTol_RWGeometricToleranceWithDatumReference.hxx @@ -976,6 +994,13 @@ usr/include/opencascade/RWStepDimTol_RWGeometricToleranceWithDefinedUnit.hxx usr/include/opencascade/RWStepDimTol_RWGeometricToleranceWithMaximumTolerance.hxx usr/include/opencascade/RWStepDimTol_RWGeometricToleranceWithModifiers.hxx +usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol.hxx +usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthDatRefAndGeoTolWthMod.hxx +usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol.hxx +usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthDatRefAndUneqDisGeoTol.hxx +usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthDatRef.hxx +usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthMaxTol.hxx +usr/include/opencascade/RWStepDimTol_RWGeoTolAndGeoTolWthMod.hxx usr/include/opencascade/RWStepDimTol_RWLineProfileTolerance.hxx usr/include/opencascade/RWStepDimTol_RWModifiedGeometricTolerance.hxx usr/include/opencascade/RWStepDimTol_RWNonUniformZoneDefinition.hxx @@ -990,9 +1015,9 @@ usr/include/opencascade/RWStepDimTol_RWStraightnessTolerance.hxx usr/include/opencascade/RWStepDimTol_RWSurfaceProfileTolerance.hxx usr/include/opencascade/RWStepDimTol_RWSymmetryTolerance.hxx -usr/include/opencascade/RWStepDimTol_RWToleranceZone.hxx usr/include/opencascade/RWStepDimTol_RWToleranceZoneDefinition.hxx usr/include/opencascade/RWStepDimTol_RWToleranceZoneForm.hxx +usr/include/opencascade/RWStepDimTol_RWToleranceZone.hxx usr/include/opencascade/RWStepDimTol_RWTotalRunoutTolerance.hxx usr/include/opencascade/RWStepDimTol_RWUnequallyDisposedGeometricTolerance.hxx usr/include/opencascade/RWStepElement_RWAnalysisItemWithinRepresentation.hxx @@ -1004,10 +1029,10 @@ usr/include/opencascade/RWStepElement_RWElementMaterial.hxx usr/include/opencascade/RWStepElement_RWSurface3dElementDescriptor.hxx usr/include/opencascade/RWStepElement_RWSurfaceElementProperty.hxx -usr/include/opencascade/RWStepElement_RWSurfaceSection.hxx -usr/include/opencascade/RWStepElement_RWSurfaceSectionField.hxx usr/include/opencascade/RWStepElement_RWSurfaceSectionFieldConstant.hxx +usr/include/opencascade/RWStepElement_RWSurfaceSectionField.hxx usr/include/opencascade/RWStepElement_RWSurfaceSectionFieldVarying.hxx +usr/include/opencascade/RWStepElement_RWSurfaceSection.hxx usr/include/opencascade/RWStepElement_RWUniformSurfaceSection.hxx usr/include/opencascade/RWStepElement_RWVolume3dElementDescriptor.hxx usr/include/opencascade/RWStepFEA_RWAlignedCurve3dElementCoordinateSystem.hxx @@ -1018,8 +1043,8 @@ usr/include/opencascade/RWStepFEA_RWCurve3dElementRepresentation.hxx usr/include/opencascade/RWStepFEA_RWCurveElementEndOffset.hxx usr/include/opencascade/RWStepFEA_RWCurveElementEndRelease.hxx -usr/include/opencascade/RWStepFEA_RWCurveElementInterval.hxx usr/include/opencascade/RWStepFEA_RWCurveElementIntervalConstant.hxx +usr/include/opencascade/RWStepFEA_RWCurveElementInterval.hxx usr/include/opencascade/RWStepFEA_RWCurveElementIntervalLinearlyVarying.hxx usr/include/opencascade/RWStepFEA_RWCurveElementLocation.hxx usr/include/opencascade/RWStepFEA_RWDummyNode.hxx @@ -1034,9 +1059,9 @@ usr/include/opencascade/RWStepFEA_RWFeaMassDensity.hxx usr/include/opencascade/RWStepFEA_RWFeaMaterialPropertyRepresentation.hxx usr/include/opencascade/RWStepFEA_RWFeaMaterialPropertyRepresentationItem.hxx -usr/include/opencascade/RWStepFEA_RWFeaModel.hxx usr/include/opencascade/RWStepFEA_RWFeaModel3d.hxx usr/include/opencascade/RWStepFEA_RWFeaModelDefinition.hxx +usr/include/opencascade/RWStepFEA_RWFeaModel.hxx usr/include/opencascade/RWStepFEA_RWFeaMoistureAbsorption.hxx usr/include/opencascade/RWStepFEA_RWFeaParametricPoint.hxx usr/include/opencascade/RWStepFEA_RWFeaRepresentationItem.hxx @@ -1050,9 +1075,9 @@ usr/include/opencascade/RWStepFEA_RWFreedomAndCoefficient.hxx usr/include/opencascade/RWStepFEA_RWFreedomsList.hxx usr/include/opencascade/RWStepFEA_RWGeometricNode.hxx -usr/include/opencascade/RWStepFEA_RWNode.hxx usr/include/opencascade/RWStepFEA_RWNodeDefinition.hxx usr/include/opencascade/RWStepFEA_RWNodeGroup.hxx +usr/include/opencascade/RWStepFEA_RWNode.hxx usr/include/opencascade/RWStepFEA_RWNodeRepresentation.hxx usr/include/opencascade/RWStepFEA_RWNodeSet.hxx usr/include/opencascade/RWStepFEA_RWNodeWithSolutionCoordinateSystem.hxx @@ -1065,30 +1090,30 @@ usr/include/opencascade/RWStepGeom_RWAxis1Placement.hxx usr/include/opencascade/RWStepGeom_RWAxis2Placement2d.hxx usr/include/opencascade/RWStepGeom_RWAxis2Placement3d.hxx -usr/include/opencascade/RWStepGeom_RWBSplineCurve.hxx -usr/include/opencascade/RWStepGeom_RWBSplineCurveWithKnots.hxx -usr/include/opencascade/RWStepGeom_RWBSplineCurveWithKnotsAndRationalBSplineCurve.hxx -usr/include/opencascade/RWStepGeom_RWBSplineSurface.hxx -usr/include/opencascade/RWStepGeom_RWBSplineSurfaceWithKnots.hxx -usr/include/opencascade/RWStepGeom_RWBSplineSurfaceWithKnotsAndRationalBSplineSurface.hxx -usr/include/opencascade/RWStepGeom_RWBezierCurve.hxx usr/include/opencascade/RWStepGeom_RWBezierCurveAndRationalBSplineCurve.hxx -usr/include/opencascade/RWStepGeom_RWBezierSurface.hxx +usr/include/opencascade/RWStepGeom_RWBezierCurve.hxx usr/include/opencascade/RWStepGeom_RWBezierSurfaceAndRationalBSplineSurface.hxx +usr/include/opencascade/RWStepGeom_RWBezierSurface.hxx usr/include/opencascade/RWStepGeom_RWBoundaryCurve.hxx usr/include/opencascade/RWStepGeom_RWBoundedCurve.hxx usr/include/opencascade/RWStepGeom_RWBoundedSurface.hxx +usr/include/opencascade/RWStepGeom_RWBSplineCurve.hxx +usr/include/opencascade/RWStepGeom_RWBSplineCurveWithKnotsAndRationalBSplineCurve.hxx +usr/include/opencascade/RWStepGeom_RWBSplineCurveWithKnots.hxx +usr/include/opencascade/RWStepGeom_RWBSplineSurface.hxx +usr/include/opencascade/RWStepGeom_RWBSplineSurfaceWithKnotsAndRationalBSplineSurface.hxx +usr/include/opencascade/RWStepGeom_RWBSplineSurfaceWithKnots.hxx usr/include/opencascade/RWStepGeom_RWCartesianPoint.hxx -usr/include/opencascade/RWStepGeom_RWCartesianTransformationOperator.hxx usr/include/opencascade/RWStepGeom_RWCartesianTransformationOperator3d.hxx +usr/include/opencascade/RWStepGeom_RWCartesianTransformationOperator.hxx usr/include/opencascade/RWStepGeom_RWCircle.hxx usr/include/opencascade/RWStepGeom_RWCompositeCurve.hxx usr/include/opencascade/RWStepGeom_RWCompositeCurveOnSurface.hxx usr/include/opencascade/RWStepGeom_RWCompositeCurveSegment.hxx -usr/include/opencascade/RWStepGeom_RWConic.hxx usr/include/opencascade/RWStepGeom_RWConicalSurface.hxx -usr/include/opencascade/RWStepGeom_RWCurve.hxx +usr/include/opencascade/RWStepGeom_RWConic.hxx usr/include/opencascade/RWStepGeom_RWCurveBoundedSurface.hxx +usr/include/opencascade/RWStepGeom_RWCurve.hxx usr/include/opencascade/RWStepGeom_RWCurveReplica.hxx usr/include/opencascade/RWStepGeom_RWCylindricalSurface.hxx usr/include/opencascade/RWStepGeom_RWDegeneratePcurve.hxx @@ -1097,11 +1122,11 @@ usr/include/opencascade/RWStepGeom_RWElementarySurface.hxx usr/include/opencascade/RWStepGeom_RWEllipse.hxx usr/include/opencascade/RWStepGeom_RWEvaluatedDegeneratePcurve.hxx -usr/include/opencascade/RWStepGeom_RWGeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx.hxx -usr/include/opencascade/RWStepGeom_RWGeometricRepresentationContext.hxx usr/include/opencascade/RWStepGeom_RWGeometricRepresentationContextAndGlobalUnitAssignedContext.hxx usr/include/opencascade/RWStepGeom_RWGeometricRepresentationContextAndParametricRepresentationContext.hxx +usr/include/opencascade/RWStepGeom_RWGeometricRepresentationContext.hxx usr/include/opencascade/RWStepGeom_RWGeometricRepresentationItem.hxx +usr/include/opencascade/RWStepGeom_RWGeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx.hxx usr/include/opencascade/RWStepGeom_RWHyperbola.hxx usr/include/opencascade/RWStepGeom_RWIntersectionCurve.hxx usr/include/opencascade/RWStepGeom_RWLine.hxx @@ -1118,10 +1143,10 @@ usr/include/opencascade/RWStepGeom_RWPointOnSurface.hxx usr/include/opencascade/RWStepGeom_RWPointReplica.hxx usr/include/opencascade/RWStepGeom_RWPolyline.hxx -usr/include/opencascade/RWStepGeom_RWQuasiUniformCurve.hxx usr/include/opencascade/RWStepGeom_RWQuasiUniformCurveAndRationalBSplineCurve.hxx -usr/include/opencascade/RWStepGeom_RWQuasiUniformSurface.hxx +usr/include/opencascade/RWStepGeom_RWQuasiUniformCurve.hxx usr/include/opencascade/RWStepGeom_RWQuasiUniformSurfaceAndRationalBSplineSurface.hxx +usr/include/opencascade/RWStepGeom_RWQuasiUniformSurface.hxx usr/include/opencascade/RWStepGeom_RWRationalBSplineCurve.hxx usr/include/opencascade/RWStepGeom_RWRationalBSplineSurface.hxx usr/include/opencascade/RWStepGeom_RWRectangularCompositeSurface.hxx @@ -1129,9 +1154,9 @@ usr/include/opencascade/RWStepGeom_RWReparametrisedCompositeCurveSegment.hxx usr/include/opencascade/RWStepGeom_RWSeamCurve.hxx usr/include/opencascade/RWStepGeom_RWSphericalSurface.hxx -usr/include/opencascade/RWStepGeom_RWSurface.hxx -usr/include/opencascade/RWStepGeom_RWSurfaceCurve.hxx usr/include/opencascade/RWStepGeom_RWSurfaceCurveAndBoundedCurve.hxx +usr/include/opencascade/RWStepGeom_RWSurfaceCurve.hxx +usr/include/opencascade/RWStepGeom_RWSurface.hxx usr/include/opencascade/RWStepGeom_RWSurfaceOfLinearExtrusion.hxx usr/include/opencascade/RWStepGeom_RWSurfaceOfRevolution.hxx usr/include/opencascade/RWStepGeom_RWSurfacePatch.hxx @@ -1139,10 +1164,10 @@ usr/include/opencascade/RWStepGeom_RWSweptSurface.hxx usr/include/opencascade/RWStepGeom_RWToroidalSurface.hxx usr/include/opencascade/RWStepGeom_RWTrimmedCurve.hxx -usr/include/opencascade/RWStepGeom_RWUniformCurve.hxx usr/include/opencascade/RWStepGeom_RWUniformCurveAndRationalBSplineCurve.hxx -usr/include/opencascade/RWStepGeom_RWUniformSurface.hxx +usr/include/opencascade/RWStepGeom_RWUniformCurve.hxx usr/include/opencascade/RWStepGeom_RWUniformSurfaceAndRationalBSplineSurface.hxx +usr/include/opencascade/RWStepGeom_RWUniformSurface.hxx usr/include/opencascade/RWStepGeom_RWVector.hxx usr/include/opencascade/RWStepRepr_RWAllAroundShapeAspect.hxx usr/include/opencascade/RWStepRepr_RWApex.hxx @@ -1152,10 +1177,10 @@ usr/include/opencascade/RWStepRepr_RWCentreOfSymmetry.hxx usr/include/opencascade/RWStepRepr_RWCharacterizedRepresentation.hxx usr/include/opencascade/RWStepRepr_RWCompGroupShAspAndCompShAspAndDatumFeatAndShAsp.hxx -usr/include/opencascade/RWStepRepr_RWCompShAspAndDatumFeatAndShAsp.hxx usr/include/opencascade/RWStepRepr_RWCompositeGroupShapeAspect.hxx usr/include/opencascade/RWStepRepr_RWCompositeShapeAspect.hxx usr/include/opencascade/RWStepRepr_RWCompoundRepresentationItem.hxx +usr/include/opencascade/RWStepRepr_RWCompShAspAndDatumFeatAndShAsp.hxx usr/include/opencascade/RWStepRepr_RWConfigurationDesign.hxx usr/include/opencascade/RWStepRepr_RWConfigurationEffectivity.hxx usr/include/opencascade/RWStepRepr_RWConfigurationItem.hxx @@ -1189,24 +1214,24 @@ usr/include/opencascade/RWStepRepr_RWPropertyDefinitionRelationship.hxx usr/include/opencascade/RWStepRepr_RWPropertyDefinitionRepresentation.hxx usr/include/opencascade/RWStepRepr_RWQuantifiedAssemblyComponentUsage.hxx -usr/include/opencascade/RWStepRepr_RWReprItemAndLengthMeasureWithUnit.hxx -usr/include/opencascade/RWStepRepr_RWReprItemAndLengthMeasureWithUnitAndQRI.hxx -usr/include/opencascade/RWStepRepr_RWReprItemAndPlaneAngleMeasureWithUnit.hxx -usr/include/opencascade/RWStepRepr_RWReprItemAndPlaneAngleMeasureWithUnitAndQRI.hxx -usr/include/opencascade/RWStepRepr_RWRepresentation.hxx usr/include/opencascade/RWStepRepr_RWRepresentationContext.hxx +usr/include/opencascade/RWStepRepr_RWRepresentation.hxx usr/include/opencascade/RWStepRepr_RWRepresentationItem.hxx usr/include/opencascade/RWStepRepr_RWRepresentationMap.hxx usr/include/opencascade/RWStepRepr_RWRepresentationRelationship.hxx usr/include/opencascade/RWStepRepr_RWRepresentationRelationshipWithTransformation.hxx -usr/include/opencascade/RWStepRepr_RWShapeAspect.hxx +usr/include/opencascade/RWStepRepr_RWReprItemAndLengthMeasureWithUnitAndQRI.hxx +usr/include/opencascade/RWStepRepr_RWReprItemAndLengthMeasureWithUnit.hxx +usr/include/opencascade/RWStepRepr_RWReprItemAndPlaneAngleMeasureWithUnitAndQRI.hxx +usr/include/opencascade/RWStepRepr_RWReprItemAndPlaneAngleMeasureWithUnit.hxx usr/include/opencascade/RWStepRepr_RWShapeAspectDerivingRelationship.hxx +usr/include/opencascade/RWStepRepr_RWShapeAspect.hxx usr/include/opencascade/RWStepRepr_RWShapeAspectRelationship.hxx usr/include/opencascade/RWStepRepr_RWShapeAspectTransition.hxx usr/include/opencascade/RWStepRepr_RWShapeRepresentationRelationshipWithTransformation.hxx usr/include/opencascade/RWStepRepr_RWSpecifiedHigherUsageOccurrence.hxx -usr/include/opencascade/RWStepRepr_RWStructuralResponseProperty.hxx usr/include/opencascade/RWStepRepr_RWStructuralResponsePropertyDefinitionRepresentation.hxx +usr/include/opencascade/RWStepRepr_RWStructuralResponseProperty.hxx usr/include/opencascade/RWStepRepr_RWTangent.hxx usr/include/opencascade/RWStepRepr_RWValueRepresentationItem.hxx usr/include/opencascade/RWStepShape_RWAdvancedBrepShapeRepresentation.hxx @@ -1233,29 +1258,29 @@ usr/include/opencascade/RWStepShape_RWDimensionalLocationWithPath.hxx usr/include/opencascade/RWStepShape_RWDimensionalSize.hxx usr/include/opencascade/RWStepShape_RWDimensionalSizeWithPath.hxx -usr/include/opencascade/RWStepShape_RWEdge.hxx usr/include/opencascade/RWStepShape_RWEdgeBasedWireframeModel.hxx usr/include/opencascade/RWStepShape_RWEdgeBasedWireframeShapeRepresentation.hxx usr/include/opencascade/RWStepShape_RWEdgeCurve.hxx +usr/include/opencascade/RWStepShape_RWEdge.hxx usr/include/opencascade/RWStepShape_RWEdgeLoop.hxx usr/include/opencascade/RWStepShape_RWExtrudedAreaSolid.hxx usr/include/opencascade/RWStepShape_RWExtrudedFaceSolid.hxx -usr/include/opencascade/RWStepShape_RWFace.hxx usr/include/opencascade/RWStepShape_RWFaceBasedSurfaceModel.hxx usr/include/opencascade/RWStepShape_RWFaceBound.hxx +usr/include/opencascade/RWStepShape_RWFace.hxx usr/include/opencascade/RWStepShape_RWFaceOuterBound.hxx usr/include/opencascade/RWStepShape_RWFaceSurface.hxx -usr/include/opencascade/RWStepShape_RWFacetedBrep.hxx usr/include/opencascade/RWStepShape_RWFacetedBrepAndBrepWithVoids.hxx +usr/include/opencascade/RWStepShape_RWFacetedBrep.hxx usr/include/opencascade/RWStepShape_RWFacetedBrepShapeRepresentation.hxx -usr/include/opencascade/RWStepShape_RWGeometricCurveSet.hxx -usr/include/opencascade/RWStepShape_RWGeometricSet.hxx usr/include/opencascade/RWStepShape_RWGeometricallyBoundedSurfaceShapeRepresentation.hxx usr/include/opencascade/RWStepShape_RWGeometricallyBoundedWireframeShapeRepresentation.hxx +usr/include/opencascade/RWStepShape_RWGeometricCurveSet.hxx +usr/include/opencascade/RWStepShape_RWGeometricSet.hxx usr/include/opencascade/RWStepShape_RWHalfSpaceSolid.hxx usr/include/opencascade/RWStepShape_RWLimitsAndFits.hxx -usr/include/opencascade/RWStepShape_RWLoop.hxx usr/include/opencascade/RWStepShape_RWLoopAndPath.hxx +usr/include/opencascade/RWStepShape_RWLoop.hxx usr/include/opencascade/RWStepShape_RWManifoldSolidBrep.hxx usr/include/opencascade/RWStepShape_RWManifoldSurfaceShapeRepresentation.hxx usr/include/opencascade/RWStepShape_RWMeasureQualification.hxx @@ -1300,8 +1325,8 @@ usr/include/opencascade/RWStepShape_RWVertex.hxx usr/include/opencascade/RWStepShape_RWVertexLoop.hxx usr/include/opencascade/RWStepShape_RWVertexPoint.hxx +usr/include/opencascade/RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.hxx usr/include/opencascade/RWStepVisual_RWAnnotationCurveOccurrence.hxx -usr/include/opencascade/RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx usr/include/opencascade/RWStepVisual_RWAnnotationFillArea.hxx usr/include/opencascade/RWStepVisual_RWAnnotationFillAreaOccurrence.hxx usr/include/opencascade/RWStepVisual_RWAnnotationOccurrence.hxx @@ -1309,14 +1334,14 @@ usr/include/opencascade/RWStepVisual_RWAreaInSet.hxx usr/include/opencascade/RWStepVisual_RWBackgroundColour.hxx usr/include/opencascade/RWStepVisual_RWCameraImage.hxx -usr/include/opencascade/RWStepVisual_RWCameraModel.hxx usr/include/opencascade/RWStepVisual_RWCameraModelD2.hxx usr/include/opencascade/RWStepVisual_RWCameraModelD3.hxx usr/include/opencascade/RWStepVisual_RWCameraModelD3MultiClipping.hxx usr/include/opencascade/RWStepVisual_RWCameraModelD3MultiClippingIntersection.hxx usr/include/opencascade/RWStepVisual_RWCameraModelD3MultiClippingUnion.hxx +usr/include/opencascade/RWStepVisual_RWCameraModel.hxx usr/include/opencascade/RWStepVisual_RWCameraUsage.hxx -usr/include/opencascade/RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx +usr/include/opencascade/RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.hxx usr/include/opencascade/RWStepVisual_RWColour.hxx usr/include/opencascade/RWStepVisual_RWColourRgb.hxx usr/include/opencascade/RWStepVisual_RWColourSpecification.hxx @@ -1325,16 +1350,16 @@ usr/include/opencascade/RWStepVisual_RWContextDependentInvisibility.hxx usr/include/opencascade/RWStepVisual_RWContextDependentOverRidingStyledItem.hxx usr/include/opencascade/RWStepVisual_RWCoordinatesList.hxx -usr/include/opencascade/RWStepVisual_RWCurveStyle.hxx usr/include/opencascade/RWStepVisual_RWCurveStyleFont.hxx usr/include/opencascade/RWStepVisual_RWCurveStyleFontPattern.hxx +usr/include/opencascade/RWStepVisual_RWCurveStyle.hxx usr/include/opencascade/RWStepVisual_RWDraughtingCallout.hxx usr/include/opencascade/RWStepVisual_RWDraughtingModel.hxx usr/include/opencascade/RWStepVisual_RWDraughtingPreDefinedColour.hxx usr/include/opencascade/RWStepVisual_RWDraughtingPreDefinedCurveFont.hxx usr/include/opencascade/RWStepVisual_RWExternallyDefinedCurveFont.hxx -usr/include/opencascade/RWStepVisual_RWFillAreaStyle.hxx usr/include/opencascade/RWStepVisual_RWFillAreaStyleColour.hxx +usr/include/opencascade/RWStepVisual_RWFillAreaStyle.hxx usr/include/opencascade/RWStepVisual_RWInvisibility.hxx usr/include/opencascade/RWStepVisual_RWMechanicalDesignGeometricPresentationArea.hxx usr/include/opencascade/RWStepVisual_RWMechanicalDesignGeometricPresentationRepresentation.hxx @@ -1361,8 +1386,12 @@ usr/include/opencascade/RWStepVisual_RWSurfaceStyleControlGrid.hxx usr/include/opencascade/RWStepVisual_RWSurfaceStyleFillArea.hxx usr/include/opencascade/RWStepVisual_RWSurfaceStyleParameterLine.hxx +usr/include/opencascade/RWStepVisual_RWSurfaceStyleReflectanceAmbient.hxx +usr/include/opencascade/RWStepVisual_RWSurfaceStyleRendering.hxx +usr/include/opencascade/RWStepVisual_RWSurfaceStyleRenderingWithProperties.hxx usr/include/opencascade/RWStepVisual_RWSurfaceStyleSegmentationCurve.hxx usr/include/opencascade/RWStepVisual_RWSurfaceStyleSilhouette.hxx +usr/include/opencascade/RWStepVisual_RWSurfaceStyleTransparent.hxx usr/include/opencascade/RWStepVisual_RWSurfaceStyleUsage.hxx usr/include/opencascade/RWStepVisual_RWTemplate.hxx usr/include/opencascade/RWStepVisual_RWTemplateInstance.hxx @@ -1371,74 +1400,12 @@ usr/include/opencascade/RWStepVisual_RWTessellatedGeometricSet.hxx usr/include/opencascade/RWStepVisual_RWTessellatedItem.hxx usr/include/opencascade/RWStepVisual_RWTextLiteral.hxx -usr/include/opencascade/RWStepVisual_RWTextStyle.hxx usr/include/opencascade/RWStepVisual_RWTextStyleForDefinedFont.hxx +usr/include/opencascade/RWStepVisual_RWTextStyle.hxx usr/include/opencascade/RWStepVisual_RWTextStyleWithBoxCharacteristics.hxx usr/include/opencascade/RWStepVisual_RWViewVolume.hxx usr/include/opencascade/RWStl.hxx usr/include/opencascade/RWStl_Reader.hxx -usr/include/opencascade/STEPCAFControl_ActorWrite.hxx -usr/include/opencascade/STEPCAFControl_Controller.hxx -usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfLabelExternFile.hxx -usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfLabelShape.hxx -usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfPDExternFile.hxx -usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfSDRExternFile.hxx -usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfShapePD.hxx -usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfShapeSDR.hxx -usr/include/opencascade/STEPCAFControl_DataMapOfLabelExternFile.hxx -usr/include/opencascade/STEPCAFControl_DataMapOfLabelShape.hxx -usr/include/opencascade/STEPCAFControl_DataMapOfPDExternFile.hxx -usr/include/opencascade/STEPCAFControl_DataMapOfSDRExternFile.hxx -usr/include/opencascade/STEPCAFControl_DataMapOfShapePD.hxx -usr/include/opencascade/STEPCAFControl_DataMapOfShapeSDR.hxx -usr/include/opencascade/STEPCAFControl_ExternFile.hxx -usr/include/opencascade/STEPCAFControl_ExternFile.lxx -usr/include/opencascade/STEPCAFControl_GDTProperty.hxx -usr/include/opencascade/STEPCAFControl_Reader.hxx -usr/include/opencascade/STEPCAFControl_Writer.hxx -usr/include/opencascade/STEPConstruct.hxx -usr/include/opencascade/STEPConstruct_AP203Context.hxx -usr/include/opencascade/STEPConstruct_Assembly.hxx -usr/include/opencascade/STEPConstruct_ContextTool.hxx -usr/include/opencascade/STEPConstruct_DataMapIteratorOfDataMapOfAsciiStringTransient.hxx -usr/include/opencascade/STEPConstruct_DataMapIteratorOfDataMapOfPointTransient.hxx -usr/include/opencascade/STEPConstruct_DataMapOfAsciiStringTransient.hxx -usr/include/opencascade/STEPConstruct_DataMapOfPointTransient.hxx -usr/include/opencascade/STEPConstruct_ExternRefs.hxx -usr/include/opencascade/STEPConstruct_Part.hxx -usr/include/opencascade/STEPConstruct_PointHasher.hxx -usr/include/opencascade/STEPConstruct_PointHasher.lxx -usr/include/opencascade/STEPConstruct_Styles.hxx -usr/include/opencascade/STEPConstruct_Tool.hxx -usr/include/opencascade/STEPConstruct_Tool.lxx -usr/include/opencascade/STEPConstruct_UnitContext.hxx -usr/include/opencascade/STEPConstruct_ValidationProps.hxx -usr/include/opencascade/STEPControl_ActorRead.hxx -usr/include/opencascade/STEPControl_ActorWrite.hxx -usr/include/opencascade/STEPControl_Controller.hxx -usr/include/opencascade/STEPControl_Reader.hxx -usr/include/opencascade/STEPControl_StepModelType.hxx -usr/include/opencascade/STEPControl_Writer.hxx -usr/include/opencascade/STEPEdit.hxx -usr/include/opencascade/STEPEdit_EditContext.hxx -usr/include/opencascade/STEPEdit_EditSDR.hxx -usr/include/opencascade/STEPSelections_AssemblyComponent.hxx -usr/include/opencascade/STEPSelections_AssemblyComponent.lxx -usr/include/opencascade/STEPSelections_AssemblyExplorer.hxx -usr/include/opencascade/STEPSelections_AssemblyExplorer.lxx -usr/include/opencascade/STEPSelections_AssemblyLink.hxx -usr/include/opencascade/STEPSelections_AssemblyLink.lxx -usr/include/opencascade/STEPSelections_Counter.hxx -usr/include/opencascade/STEPSelections_Counter.lxx -usr/include/opencascade/STEPSelections_HSequenceOfAssemblyLink.hxx -usr/include/opencascade/STEPSelections_SelectAssembly.hxx -usr/include/opencascade/STEPSelections_SelectDerived.hxx -usr/include/opencascade/STEPSelections_SelectFaces.hxx -usr/include/opencascade/STEPSelections_SelectForTransfer.hxx -usr/include/opencascade/STEPSelections_SelectGSCurves.hxx -usr/include/opencascade/STEPSelections_SelectInstances.hxx -usr/include/opencascade/STEPSelections_SequenceOfAssemblyComponent.hxx -usr/include/opencascade/STEPSelections_SequenceOfAssemblyLink.hxx usr/include/opencascade/StepAP203_ApprovedItem.hxx usr/include/opencascade/StepAP203_Array1OfApprovedItem.hxx usr/include/opencascade/StepAP203_Array1OfCertifiedItem.hxx @@ -1481,7 +1448,6 @@ usr/include/opencascade/StepAP203_StartWork.hxx usr/include/opencascade/StepAP203_WorkItem.hxx usr/include/opencascade/StepAP209_Construct.hxx -usr/include/opencascade/StepAP214.hxx usr/include/opencascade/StepAP214_AppliedApprovalAssignment.hxx usr/include/opencascade/StepAP214_AppliedDateAndTimeAssignment.hxx usr/include/opencascade/StepAP214_AppliedDateAssignment.hxx @@ -1555,6 +1521,7 @@ usr/include/opencascade/StepAP214_HArray1OfPersonAndOrganizationItem.hxx usr/include/opencascade/StepAP214_HArray1OfPresentedItemSelect.hxx usr/include/opencascade/StepAP214_HArray1OfSecurityClassificationItem.hxx +usr/include/opencascade/StepAP214.hxx usr/include/opencascade/StepAP214_OrganizationItem.hxx usr/include/opencascade/StepAP214_PersonAndOrganizationItem.hxx usr/include/opencascade/StepAP214_PresentedItemSelect.hxx @@ -1565,21 +1532,21 @@ usr/include/opencascade/StepAP242_GeometricItemSpecificUsage.hxx usr/include/opencascade/StepAP242_IdAttribute.hxx usr/include/opencascade/StepAP242_IdAttributeSelect.hxx -usr/include/opencascade/StepAP242_ItemIdentifiedRepresentationUsage.hxx usr/include/opencascade/StepAP242_ItemIdentifiedRepresentationUsageDefinition.hxx -usr/include/opencascade/StepBasic_Action.hxx +usr/include/opencascade/StepAP242_ItemIdentifiedRepresentationUsage.hxx usr/include/opencascade/StepBasic_ActionAssignment.hxx +usr/include/opencascade/StepBasic_Action.hxx usr/include/opencascade/StepBasic_ActionMethod.hxx usr/include/opencascade/StepBasic_ActionRequestAssignment.hxx usr/include/opencascade/StepBasic_ActionRequestSolution.hxx usr/include/opencascade/StepBasic_Address.hxx usr/include/opencascade/StepBasic_AheadOrBehind.hxx -usr/include/opencascade/StepBasic_ApplicationContext.hxx usr/include/opencascade/StepBasic_ApplicationContextElement.hxx +usr/include/opencascade/StepBasic_ApplicationContext.hxx usr/include/opencascade/StepBasic_ApplicationProtocolDefinition.hxx -usr/include/opencascade/StepBasic_Approval.hxx usr/include/opencascade/StepBasic_ApprovalAssignment.hxx usr/include/opencascade/StepBasic_ApprovalDateTime.hxx +usr/include/opencascade/StepBasic_Approval.hxx usr/include/opencascade/StepBasic_ApprovalPersonOrganization.hxx usr/include/opencascade/StepBasic_ApprovalRelationship.hxx usr/include/opencascade/StepBasic_ApprovalRole.hxx @@ -1591,19 +1558,18 @@ usr/include/opencascade/StepBasic_Array1OfNamedUnit.hxx usr/include/opencascade/StepBasic_Array1OfOrganization.hxx usr/include/opencascade/StepBasic_Array1OfPerson.hxx -usr/include/opencascade/StepBasic_Array1OfProduct.hxx usr/include/opencascade/StepBasic_Array1OfProductContext.hxx usr/include/opencascade/StepBasic_Array1OfProductDefinition.hxx +usr/include/opencascade/StepBasic_Array1OfProduct.hxx usr/include/opencascade/StepBasic_Array1OfUncertaintyMeasureWithUnit.hxx usr/include/opencascade/StepBasic_CalendarDate.hxx -usr/include/opencascade/StepBasic_Certification.hxx usr/include/opencascade/StepBasic_CertificationAssignment.hxx +usr/include/opencascade/StepBasic_Certification.hxx usr/include/opencascade/StepBasic_CertificationType.hxx usr/include/opencascade/StepBasic_CharacterizedObject.hxx -usr/include/opencascade/StepBasic_Contract.hxx usr/include/opencascade/StepBasic_ContractAssignment.hxx +usr/include/opencascade/StepBasic_Contract.hxx usr/include/opencascade/StepBasic_ContractType.hxx -usr/include/opencascade/StepBasic_ConversionBasedUnit.hxx usr/include/opencascade/StepBasic_ConversionBasedUnitAndAreaUnit.hxx usr/include/opencascade/StepBasic_ConversionBasedUnitAndLengthUnit.hxx usr/include/opencascade/StepBasic_ConversionBasedUnitAndMassUnit.hxx @@ -1612,21 +1578,22 @@ usr/include/opencascade/StepBasic_ConversionBasedUnitAndSolidAngleUnit.hxx usr/include/opencascade/StepBasic_ConversionBasedUnitAndTimeUnit.hxx usr/include/opencascade/StepBasic_ConversionBasedUnitAndVolumeUnit.hxx +usr/include/opencascade/StepBasic_ConversionBasedUnit.hxx usr/include/opencascade/StepBasic_CoordinatedUniversalTimeOffset.hxx -usr/include/opencascade/StepBasic_Date.hxx -usr/include/opencascade/StepBasic_DateAndTime.hxx usr/include/opencascade/StepBasic_DateAndTimeAssignment.hxx +usr/include/opencascade/StepBasic_DateAndTime.hxx usr/include/opencascade/StepBasic_DateAssignment.hxx +usr/include/opencascade/StepBasic_Date.hxx usr/include/opencascade/StepBasic_DateRole.hxx usr/include/opencascade/StepBasic_DateTimeRole.hxx usr/include/opencascade/StepBasic_DateTimeSelect.hxx -usr/include/opencascade/StepBasic_DerivedUnit.hxx usr/include/opencascade/StepBasic_DerivedUnitElement.hxx +usr/include/opencascade/StepBasic_DerivedUnit.hxx usr/include/opencascade/StepBasic_DesignContext.hxx usr/include/opencascade/StepBasic_DigitalDocument.hxx usr/include/opencascade/StepBasic_DimensionalExponents.hxx -usr/include/opencascade/StepBasic_Document.hxx usr/include/opencascade/StepBasic_DocumentFile.hxx +usr/include/opencascade/StepBasic_Document.hxx usr/include/opencascade/StepBasic_DocumentProductAssociation.hxx usr/include/opencascade/StepBasic_DocumentProductEquivalence.hxx usr/include/opencascade/StepBasic_DocumentReference.hxx @@ -1634,15 +1601,15 @@ usr/include/opencascade/StepBasic_DocumentRepresentationType.hxx usr/include/opencascade/StepBasic_DocumentType.hxx usr/include/opencascade/StepBasic_DocumentUsageConstraint.hxx -usr/include/opencascade/StepBasic_Effectivity.hxx usr/include/opencascade/StepBasic_EffectivityAssignment.hxx +usr/include/opencascade/StepBasic_Effectivity.hxx usr/include/opencascade/StepBasic_EulerAngles.hxx usr/include/opencascade/StepBasic_ExternalIdentificationAssignment.hxx -usr/include/opencascade/StepBasic_ExternalSource.hxx usr/include/opencascade/StepBasic_ExternallyDefinedItem.hxx +usr/include/opencascade/StepBasic_ExternalSource.hxx usr/include/opencascade/StepBasic_GeneralProperty.hxx -usr/include/opencascade/StepBasic_Group.hxx usr/include/opencascade/StepBasic_GroupAssignment.hxx +usr/include/opencascade/StepBasic_Group.hxx usr/include/opencascade/StepBasic_GroupRelationship.hxx usr/include/opencascade/StepBasic_HArray1OfApproval.hxx usr/include/opencascade/StepBasic_HArray1OfDerivedUnitElement.hxx @@ -1650,9 +1617,9 @@ usr/include/opencascade/StepBasic_HArray1OfNamedUnit.hxx usr/include/opencascade/StepBasic_HArray1OfOrganization.hxx usr/include/opencascade/StepBasic_HArray1OfPerson.hxx -usr/include/opencascade/StepBasic_HArray1OfProduct.hxx usr/include/opencascade/StepBasic_HArray1OfProductContext.hxx usr/include/opencascade/StepBasic_HArray1OfProductDefinition.hxx +usr/include/opencascade/StepBasic_HArray1OfProduct.hxx usr/include/opencascade/StepBasic_HArray1OfUncertaintyMeasureWithUnit.hxx usr/include/opencascade/StepBasic_IdentificationAssignment.hxx usr/include/opencascade/StepBasic_IdentificationRole.hxx @@ -1668,35 +1635,35 @@ usr/include/opencascade/StepBasic_NamedUnit.hxx usr/include/opencascade/StepBasic_ObjectRole.hxx usr/include/opencascade/StepBasic_OrdinalDate.hxx -usr/include/opencascade/StepBasic_Organization.hxx +usr/include/opencascade/StepBasic_OrganizationalAddress.hxx usr/include/opencascade/StepBasic_OrganizationAssignment.hxx +usr/include/opencascade/StepBasic_Organization.hxx usr/include/opencascade/StepBasic_OrganizationRole.hxx -usr/include/opencascade/StepBasic_OrganizationalAddress.hxx -usr/include/opencascade/StepBasic_Person.hxx -usr/include/opencascade/StepBasic_PersonAndOrganization.hxx +usr/include/opencascade/StepBasic_PersonalAddress.hxx usr/include/opencascade/StepBasic_PersonAndOrganizationAssignment.hxx +usr/include/opencascade/StepBasic_PersonAndOrganization.hxx usr/include/opencascade/StepBasic_PersonAndOrganizationRole.hxx +usr/include/opencascade/StepBasic_Person.hxx usr/include/opencascade/StepBasic_PersonOrganizationSelect.hxx -usr/include/opencascade/StepBasic_PersonalAddress.hxx usr/include/opencascade/StepBasic_PhysicallyModeledProductDefinition.hxx usr/include/opencascade/StepBasic_PlaneAngleMeasureWithUnit.hxx usr/include/opencascade/StepBasic_PlaneAngleUnit.hxx -usr/include/opencascade/StepBasic_Product.hxx usr/include/opencascade/StepBasic_ProductCategory.hxx usr/include/opencascade/StepBasic_ProductCategoryRelationship.hxx usr/include/opencascade/StepBasic_ProductConceptContext.hxx usr/include/opencascade/StepBasic_ProductContext.hxx -usr/include/opencascade/StepBasic_ProductDefinition.hxx usr/include/opencascade/StepBasic_ProductDefinitionContext.hxx usr/include/opencascade/StepBasic_ProductDefinitionEffectivity.hxx usr/include/opencascade/StepBasic_ProductDefinitionFormation.hxx usr/include/opencascade/StepBasic_ProductDefinitionFormationRelationship.hxx usr/include/opencascade/StepBasic_ProductDefinitionFormationWithSpecifiedSource.hxx +usr/include/opencascade/StepBasic_ProductDefinition.hxx usr/include/opencascade/StepBasic_ProductDefinitionOrReference.hxx usr/include/opencascade/StepBasic_ProductDefinitionReference.hxx usr/include/opencascade/StepBasic_ProductDefinitionReferenceWithLocalRepresentation.hxx usr/include/opencascade/StepBasic_ProductDefinitionRelationship.hxx usr/include/opencascade/StepBasic_ProductDefinitionWithAssociatedDocuments.hxx +usr/include/opencascade/StepBasic_Product.hxx usr/include/opencascade/StepBasic_ProductOrFormationOrDefinition.hxx usr/include/opencascade/StepBasic_ProductRelatedProductCategory.hxx usr/include/opencascade/StepBasic_ProductType.hxx @@ -1704,11 +1671,10 @@ usr/include/opencascade/StepBasic_RatioUnit.hxx usr/include/opencascade/StepBasic_RoleAssociation.hxx usr/include/opencascade/StepBasic_RoleSelect.hxx -usr/include/opencascade/StepBasic_SecurityClassification.hxx usr/include/opencascade/StepBasic_SecurityClassificationAssignment.hxx +usr/include/opencascade/StepBasic_SecurityClassification.hxx usr/include/opencascade/StepBasic_SecurityClassificationLevel.hxx usr/include/opencascade/StepBasic_SiPrefix.hxx -usr/include/opencascade/StepBasic_SiUnit.hxx usr/include/opencascade/StepBasic_SiUnitAndAreaUnit.hxx usr/include/opencascade/StepBasic_SiUnitAndLengthUnit.hxx usr/include/opencascade/StepBasic_SiUnitAndMassUnit.hxx @@ -1718,6 +1684,7 @@ usr/include/opencascade/StepBasic_SiUnitAndThermodynamicTemperatureUnit.hxx usr/include/opencascade/StepBasic_SiUnitAndTimeUnit.hxx usr/include/opencascade/StepBasic_SiUnitAndVolumeUnit.hxx +usr/include/opencascade/StepBasic_SiUnit.hxx usr/include/opencascade/StepBasic_SiUnitName.hxx usr/include/opencascade/StepBasic_SizeMember.hxx usr/include/opencascade/StepBasic_SizeSelect.hxx @@ -1733,18 +1700,59 @@ usr/include/opencascade/StepBasic_VersionedActionRequest.hxx usr/include/opencascade/StepBasic_VolumeUnit.hxx usr/include/opencascade/StepBasic_WeekOfYearAndDayDate.hxx -usr/include/opencascade/StepData.hxx +usr/include/opencascade/STEPCAFControl_ActorWrite.hxx +usr/include/opencascade/STEPCAFControl_Controller.hxx +usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfLabelExternFile.hxx +usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfLabelShape.hxx +usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfPDExternFile.hxx +usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfSDRExternFile.hxx +usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfShapePD.hxx +usr/include/opencascade/STEPCAFControl_DataMapIteratorOfDataMapOfShapeSDR.hxx +usr/include/opencascade/STEPCAFControl_DataMapOfLabelExternFile.hxx +usr/include/opencascade/STEPCAFControl_DataMapOfLabelShape.hxx +usr/include/opencascade/STEPCAFControl_DataMapOfPDExternFile.hxx +usr/include/opencascade/STEPCAFControl_DataMapOfSDRExternFile.hxx +usr/include/opencascade/STEPCAFControl_DataMapOfShapePD.hxx +usr/include/opencascade/STEPCAFControl_DataMapOfShapeSDR.hxx +usr/include/opencascade/STEPCAFControl_ExternFile.hxx +usr/include/opencascade/STEPCAFControl_ExternFile.lxx +usr/include/opencascade/STEPCAFControl_GDTProperty.hxx +usr/include/opencascade/STEPCAFControl_Reader.hxx +usr/include/opencascade/STEPCAFControl_Writer.hxx +usr/include/opencascade/STEPConstruct_AP203Context.hxx +usr/include/opencascade/STEPConstruct_Assembly.hxx +usr/include/opencascade/STEPConstruct_ContextTool.hxx +usr/include/opencascade/STEPConstruct_DataMapIteratorOfDataMapOfAsciiStringTransient.hxx +usr/include/opencascade/STEPConstruct_DataMapIteratorOfDataMapOfPointTransient.hxx +usr/include/opencascade/STEPConstruct_DataMapOfAsciiStringTransient.hxx +usr/include/opencascade/STEPConstruct_DataMapOfPointTransient.hxx +usr/include/opencascade/STEPConstruct_ExternRefs.hxx +usr/include/opencascade/STEPConstruct.hxx +usr/include/opencascade/STEPConstruct_Part.hxx +usr/include/opencascade/STEPConstruct_PointHasher.hxx +usr/include/opencascade/STEPConstruct_PointHasher.lxx +usr/include/opencascade/STEPConstruct_Styles.hxx +usr/include/opencascade/STEPConstruct_Tool.hxx +usr/include/opencascade/STEPConstruct_Tool.lxx +usr/include/opencascade/STEPConstruct_UnitContext.hxx +usr/include/opencascade/STEPConstruct_ValidationProps.hxx +usr/include/opencascade/STEPControl_ActorRead.hxx +usr/include/opencascade/STEPControl_ActorWrite.hxx +usr/include/opencascade/STEPControl_Controller.hxx +usr/include/opencascade/STEPControl_Reader.hxx +usr/include/opencascade/STEPControl_StepModelType.hxx +usr/include/opencascade/STEPControl_Writer.hxx usr/include/opencascade/StepData_Array1OfField.hxx usr/include/opencascade/StepData_DefaultGeneral.hxx usr/include/opencascade/StepData_Described.hxx usr/include/opencascade/StepData_ECDescr.hxx usr/include/opencascade/StepData_EDescr.hxx -usr/include/opencascade/StepData_ESDescr.hxx usr/include/opencascade/StepData_EnumTool.hxx +usr/include/opencascade/StepData_ESDescr.hxx usr/include/opencascade/StepData_Field.hxx -usr/include/opencascade/StepData_FieldList.hxx usr/include/opencascade/StepData_FieldList1.hxx usr/include/opencascade/StepData_FieldListD.hxx +usr/include/opencascade/StepData_FieldList.hxx usr/include/opencascade/StepData_FieldListN.hxx usr/include/opencascade/StepData_FileProtocol.hxx usr/include/opencascade/StepData_FileRecognizer.hxx @@ -1752,6 +1760,7 @@ usr/include/opencascade/StepData_GeneralModule.hxx usr/include/opencascade/StepData_GlobalNodeOfWriterLib.hxx usr/include/opencascade/StepData_HArray1OfField.hxx +usr/include/opencascade/StepData.hxx usr/include/opencascade/StepData_Logical.hxx usr/include/opencascade/StepData_NodeOfWriterLib.hxx usr/include/opencascade/StepData_PDescr.hxx @@ -1774,9 +1783,9 @@ usr/include/opencascade/StepData_WriterLib.hxx usr/include/opencascade/StepDimTol_AngularityTolerance.hxx usr/include/opencascade/StepDimTol_AreaUnitType.hxx -usr/include/opencascade/StepDimTol_Array1OfDatumReference.hxx usr/include/opencascade/StepDimTol_Array1OfDatumReferenceCompartment.hxx usr/include/opencascade/StepDimTol_Array1OfDatumReferenceElement.hxx +usr/include/opencascade/StepDimTol_Array1OfDatumReference.hxx usr/include/opencascade/StepDimTol_Array1OfDatumReferenceModifier.hxx usr/include/opencascade/StepDimTol_Array1OfDatumSystemOrReference.hxx usr/include/opencascade/StepDimTol_Array1OfGeometricToleranceModifier.hxx @@ -1786,12 +1795,12 @@ usr/include/opencascade/StepDimTol_CommonDatum.hxx usr/include/opencascade/StepDimTol_ConcentricityTolerance.hxx usr/include/opencascade/StepDimTol_CylindricityTolerance.hxx -usr/include/opencascade/StepDimTol_Datum.hxx usr/include/opencascade/StepDimTol_DatumFeature.hxx +usr/include/opencascade/StepDimTol_Datum.hxx usr/include/opencascade/StepDimTol_DatumOrCommonDatum.hxx -usr/include/opencascade/StepDimTol_DatumReference.hxx usr/include/opencascade/StepDimTol_DatumReferenceCompartment.hxx usr/include/opencascade/StepDimTol_DatumReferenceElement.hxx +usr/include/opencascade/StepDimTol_DatumReference.hxx usr/include/opencascade/StepDimTol_DatumReferenceModifier.hxx usr/include/opencascade/StepDimTol_DatumReferenceModifierType.hxx usr/include/opencascade/StepDimTol_DatumReferenceModifierWithValue.hxx @@ -1800,13 +1809,6 @@ usr/include/opencascade/StepDimTol_DatumTarget.hxx usr/include/opencascade/StepDimTol_FlatnessTolerance.hxx usr/include/opencascade/StepDimTol_GeneralDatumReference.hxx -usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthDatRef.hxx -usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol.hxx -usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod.hxx -usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol.hxx -usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthDatRefAndUneqDisGeoTol.hxx -usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthMaxTol.hxx -usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthMod.hxx usr/include/opencascade/StepDimTol_GeometricTolerance.hxx usr/include/opencascade/StepDimTol_GeometricToleranceModifier.hxx usr/include/opencascade/StepDimTol_GeometricToleranceRelationship.hxx @@ -1817,9 +1819,16 @@ usr/include/opencascade/StepDimTol_GeometricToleranceWithDefinedUnit.hxx usr/include/opencascade/StepDimTol_GeometricToleranceWithMaximumTolerance.hxx usr/include/opencascade/StepDimTol_GeometricToleranceWithModifiers.hxx -usr/include/opencascade/StepDimTol_HArray1OfDatumReference.hxx +usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol.hxx +usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod.hxx +usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol.hxx +usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthDatRefAndUneqDisGeoTol.hxx +usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthDatRef.hxx +usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthMaxTol.hxx +usr/include/opencascade/StepDimTol_GeoTolAndGeoTolWthMod.hxx usr/include/opencascade/StepDimTol_HArray1OfDatumReferenceCompartment.hxx usr/include/opencascade/StepDimTol_HArray1OfDatumReferenceElement.hxx +usr/include/opencascade/StepDimTol_HArray1OfDatumReference.hxx usr/include/opencascade/StepDimTol_HArray1OfDatumReferenceModifier.hxx usr/include/opencascade/StepDimTol_HArray1OfDatumSystemOrReference.hxx usr/include/opencascade/StepDimTol_HArray1OfGeometricToleranceModifier.hxx @@ -1842,12 +1851,15 @@ usr/include/opencascade/StepDimTol_StraightnessTolerance.hxx usr/include/opencascade/StepDimTol_SurfaceProfileTolerance.hxx usr/include/opencascade/StepDimTol_SymmetryTolerance.hxx -usr/include/opencascade/StepDimTol_ToleranceZone.hxx usr/include/opencascade/StepDimTol_ToleranceZoneDefinition.hxx usr/include/opencascade/StepDimTol_ToleranceZoneForm.hxx +usr/include/opencascade/StepDimTol_ToleranceZone.hxx usr/include/opencascade/StepDimTol_ToleranceZoneTarget.hxx usr/include/opencascade/StepDimTol_TotalRunoutTolerance.hxx usr/include/opencascade/StepDimTol_UnequallyDisposedGeometricTolerance.hxx +usr/include/opencascade/STEPEdit_EditContext.hxx +usr/include/opencascade/STEPEdit_EditSDR.hxx +usr/include/opencascade/STEPEdit.hxx usr/include/opencascade/StepElement_AnalysisItemWithinRepresentation.hxx usr/include/opencascade/StepElement_Array1OfCurveElementEndReleasePacket.hxx usr/include/opencascade/StepElement_Array1OfCurveElementSectionDefinition.hxx @@ -1905,10 +1917,10 @@ usr/include/opencascade/StepElement_SurfaceElementProperty.hxx usr/include/opencascade/StepElement_SurfaceElementPurpose.hxx usr/include/opencascade/StepElement_SurfaceElementPurposeMember.hxx -usr/include/opencascade/StepElement_SurfaceSection.hxx -usr/include/opencascade/StepElement_SurfaceSectionField.hxx usr/include/opencascade/StepElement_SurfaceSectionFieldConstant.hxx +usr/include/opencascade/StepElement_SurfaceSectionField.hxx usr/include/opencascade/StepElement_SurfaceSectionFieldVarying.hxx +usr/include/opencascade/StepElement_SurfaceSection.hxx usr/include/opencascade/StepElement_UniformSurfaceSection.hxx usr/include/opencascade/StepElement_UnspecifiedValue.hxx usr/include/opencascade/StepElement_Volume3dElementDescriptor.hxx @@ -1932,8 +1944,8 @@ usr/include/opencascade/StepFEA_CurveElementEndCoordinateSystem.hxx usr/include/opencascade/StepFEA_CurveElementEndOffset.hxx usr/include/opencascade/StepFEA_CurveElementEndRelease.hxx -usr/include/opencascade/StepFEA_CurveElementInterval.hxx usr/include/opencascade/StepFEA_CurveElementIntervalConstant.hxx +usr/include/opencascade/StepFEA_CurveElementInterval.hxx usr/include/opencascade/StepFEA_CurveElementIntervalLinearlyVarying.hxx usr/include/opencascade/StepFEA_CurveElementLocation.hxx usr/include/opencascade/StepFEA_DegreeOfFreedom.hxx @@ -1953,9 +1965,9 @@ usr/include/opencascade/StepFEA_FeaMassDensity.hxx usr/include/opencascade/StepFEA_FeaMaterialPropertyRepresentation.hxx usr/include/opencascade/StepFEA_FeaMaterialPropertyRepresentationItem.hxx -usr/include/opencascade/StepFEA_FeaModel.hxx usr/include/opencascade/StepFEA_FeaModel3d.hxx usr/include/opencascade/StepFEA_FeaModelDefinition.hxx +usr/include/opencascade/StepFEA_FeaModel.hxx usr/include/opencascade/StepFEA_FeaMoistureAbsorption.hxx usr/include/opencascade/StepFEA_FeaParametricPoint.hxx usr/include/opencascade/StepFEA_FeaRepresentationItem.hxx @@ -1979,9 +1991,9 @@ usr/include/opencascade/StepFEA_HSequenceOfElementGeometricRelationship.hxx usr/include/opencascade/StepFEA_HSequenceOfElementRepresentation.hxx usr/include/opencascade/StepFEA_HSequenceOfNodeRepresentation.hxx -usr/include/opencascade/StepFEA_Node.hxx usr/include/opencascade/StepFEA_NodeDefinition.hxx usr/include/opencascade/StepFEA_NodeGroup.hxx +usr/include/opencascade/StepFEA_Node.hxx usr/include/opencascade/StepFEA_NodeRepresentation.hxx usr/include/opencascade/StepFEA_NodeSet.hxx usr/include/opencascade/StepFEA_NodeWithSolutionCoordinateSystem.hxx @@ -2002,9 +2014,7 @@ usr/include/opencascade/StepFEA_SymmetricTensor43dMember.hxx usr/include/opencascade/StepFEA_UnspecifiedValue.hxx usr/include/opencascade/StepFEA_Volume3dElementRepresentation.hxx -usr/include/opencascade/StepFile_CallFailure.hxx usr/include/opencascade/StepFile_Read.hxx -usr/include/opencascade/StepFile_Transfer.hxx usr/include/opencascade/StepGeom_Array1OfBoundaryCurve.hxx usr/include/opencascade/StepGeom_Array1OfCartesianPoint.hxx usr/include/opencascade/StepGeom_Array1OfCompositeCurveSegment.hxx @@ -2015,36 +2025,36 @@ usr/include/opencascade/StepGeom_Array2OfCartesianPoint.hxx usr/include/opencascade/StepGeom_Array2OfSurfacePatch.hxx usr/include/opencascade/StepGeom_Axis1Placement.hxx -usr/include/opencascade/StepGeom_Axis2Placement.hxx usr/include/opencascade/StepGeom_Axis2Placement2d.hxx usr/include/opencascade/StepGeom_Axis2Placement3d.hxx -usr/include/opencascade/StepGeom_BSplineCurve.hxx -usr/include/opencascade/StepGeom_BSplineCurveForm.hxx -usr/include/opencascade/StepGeom_BSplineCurveWithKnots.hxx -usr/include/opencascade/StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve.hxx -usr/include/opencascade/StepGeom_BSplineSurface.hxx -usr/include/opencascade/StepGeom_BSplineSurfaceForm.hxx -usr/include/opencascade/StepGeom_BSplineSurfaceWithKnots.hxx -usr/include/opencascade/StepGeom_BSplineSurfaceWithKnotsAndRationalBSplineSurface.hxx -usr/include/opencascade/StepGeom_BezierCurve.hxx +usr/include/opencascade/StepGeom_Axis2Placement.hxx usr/include/opencascade/StepGeom_BezierCurveAndRationalBSplineCurve.hxx -usr/include/opencascade/StepGeom_BezierSurface.hxx +usr/include/opencascade/StepGeom_BezierCurve.hxx usr/include/opencascade/StepGeom_BezierSurfaceAndRationalBSplineSurface.hxx +usr/include/opencascade/StepGeom_BezierSurface.hxx usr/include/opencascade/StepGeom_BoundaryCurve.hxx usr/include/opencascade/StepGeom_BoundedCurve.hxx usr/include/opencascade/StepGeom_BoundedSurface.hxx +usr/include/opencascade/StepGeom_BSplineCurveForm.hxx +usr/include/opencascade/StepGeom_BSplineCurve.hxx +usr/include/opencascade/StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve.hxx +usr/include/opencascade/StepGeom_BSplineCurveWithKnots.hxx +usr/include/opencascade/StepGeom_BSplineSurfaceForm.hxx +usr/include/opencascade/StepGeom_BSplineSurface.hxx +usr/include/opencascade/StepGeom_BSplineSurfaceWithKnotsAndRationalBSplineSurface.hxx +usr/include/opencascade/StepGeom_BSplineSurfaceWithKnots.hxx usr/include/opencascade/StepGeom_CartesianPoint.hxx -usr/include/opencascade/StepGeom_CartesianTransformationOperator.hxx usr/include/opencascade/StepGeom_CartesianTransformationOperator2d.hxx usr/include/opencascade/StepGeom_CartesianTransformationOperator3d.hxx +usr/include/opencascade/StepGeom_CartesianTransformationOperator.hxx usr/include/opencascade/StepGeom_Circle.hxx usr/include/opencascade/StepGeom_CompositeCurve.hxx usr/include/opencascade/StepGeom_CompositeCurveOnSurface.hxx usr/include/opencascade/StepGeom_CompositeCurveSegment.hxx -usr/include/opencascade/StepGeom_Conic.hxx usr/include/opencascade/StepGeom_ConicalSurface.hxx -usr/include/opencascade/StepGeom_Curve.hxx +usr/include/opencascade/StepGeom_Conic.hxx usr/include/opencascade/StepGeom_CurveBoundedSurface.hxx +usr/include/opencascade/StepGeom_Curve.hxx usr/include/opencascade/StepGeom_CurveOnSurface.hxx usr/include/opencascade/StepGeom_CurveReplica.hxx usr/include/opencascade/StepGeom_CylindricalSurface.hxx @@ -2054,11 +2064,11 @@ usr/include/opencascade/StepGeom_ElementarySurface.hxx usr/include/opencascade/StepGeom_Ellipse.hxx usr/include/opencascade/StepGeom_EvaluatedDegeneratePcurve.hxx -usr/include/opencascade/StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx.hxx -usr/include/opencascade/StepGeom_GeometricRepresentationContext.hxx usr/include/opencascade/StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext.hxx usr/include/opencascade/StepGeom_GeometricRepresentationContextAndParametricRepresentationContext.hxx +usr/include/opencascade/StepGeom_GeometricRepresentationContext.hxx usr/include/opencascade/StepGeom_GeometricRepresentationItem.hxx +usr/include/opencascade/StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx.hxx usr/include/opencascade/StepGeom_HArray1OfBoundaryCurve.hxx usr/include/opencascade/StepGeom_HArray1OfCartesianPoint.hxx usr/include/opencascade/StepGeom_HArray1OfCompositeCurveSegment.hxx @@ -2087,10 +2097,10 @@ usr/include/opencascade/StepGeom_PointReplica.hxx usr/include/opencascade/StepGeom_Polyline.hxx usr/include/opencascade/StepGeom_PreferredSurfaceCurveRepresentation.hxx -usr/include/opencascade/StepGeom_QuasiUniformCurve.hxx usr/include/opencascade/StepGeom_QuasiUniformCurveAndRationalBSplineCurve.hxx -usr/include/opencascade/StepGeom_QuasiUniformSurface.hxx +usr/include/opencascade/StepGeom_QuasiUniformCurve.hxx usr/include/opencascade/StepGeom_QuasiUniformSurfaceAndRationalBSplineSurface.hxx +usr/include/opencascade/StepGeom_QuasiUniformSurface.hxx usr/include/opencascade/StepGeom_RationalBSplineCurve.hxx usr/include/opencascade/StepGeom_RationalBSplineSurface.hxx usr/include/opencascade/StepGeom_RectangularCompositeSurface.hxx @@ -2098,10 +2108,10 @@ usr/include/opencascade/StepGeom_ReparametrisedCompositeCurveSegment.hxx usr/include/opencascade/StepGeom_SeamCurve.hxx usr/include/opencascade/StepGeom_SphericalSurface.hxx -usr/include/opencascade/StepGeom_Surface.hxx usr/include/opencascade/StepGeom_SurfaceBoundary.hxx -usr/include/opencascade/StepGeom_SurfaceCurve.hxx usr/include/opencascade/StepGeom_SurfaceCurveAndBoundedCurve.hxx +usr/include/opencascade/StepGeom_SurfaceCurve.hxx +usr/include/opencascade/StepGeom_Surface.hxx usr/include/opencascade/StepGeom_SurfaceOfLinearExtrusion.hxx usr/include/opencascade/StepGeom_SurfaceOfRevolution.hxx usr/include/opencascade/StepGeom_SurfacePatch.hxx @@ -2113,10 +2123,10 @@ usr/include/opencascade/StepGeom_TrimmingMember.hxx usr/include/opencascade/StepGeom_TrimmingPreference.hxx usr/include/opencascade/StepGeom_TrimmingSelect.hxx -usr/include/opencascade/StepGeom_UniformCurve.hxx usr/include/opencascade/StepGeom_UniformCurveAndRationalBSplineCurve.hxx -usr/include/opencascade/StepGeom_UniformSurface.hxx +usr/include/opencascade/StepGeom_UniformCurve.hxx usr/include/opencascade/StepGeom_UniformSurfaceAndRationalBSplineSurface.hxx +usr/include/opencascade/StepGeom_UniformSurface.hxx usr/include/opencascade/StepGeom_Vector.hxx usr/include/opencascade/StepGeom_VectorOrDirection.hxx usr/include/opencascade/StepRepr_AllAroundShapeAspect.hxx @@ -2132,10 +2142,10 @@ usr/include/opencascade/StepRepr_CharacterizedDefinition.hxx usr/include/opencascade/StepRepr_CharacterizedRepresentation.hxx usr/include/opencascade/StepRepr_CompGroupShAspAndCompShAspAndDatumFeatAndShAsp.hxx -usr/include/opencascade/StepRepr_CompShAspAndDatumFeatAndShAsp.hxx usr/include/opencascade/StepRepr_CompositeGroupShapeAspect.hxx usr/include/opencascade/StepRepr_CompositeShapeAspect.hxx usr/include/opencascade/StepRepr_CompoundRepresentationItem.hxx +usr/include/opencascade/StepRepr_CompShAspAndDatumFeatAndShAsp.hxx usr/include/opencascade/StepRepr_ConfigurationDesign.hxx usr/include/opencascade/StepRepr_ConfigurationDesignItem.hxx usr/include/opencascade/StepRepr_ConfigurationEffectivity.hxx @@ -2180,31 +2190,31 @@ usr/include/opencascade/StepRepr_PropertyDefinitionRelationship.hxx usr/include/opencascade/StepRepr_PropertyDefinitionRepresentation.hxx usr/include/opencascade/StepRepr_QuantifiedAssemblyComponentUsage.hxx -usr/include/opencascade/StepRepr_ReprItemAndLengthMeasureWithUnit.hxx -usr/include/opencascade/StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI.hxx -usr/include/opencascade/StepRepr_ReprItemAndMeasureWithUnit.hxx -usr/include/opencascade/StepRepr_ReprItemAndMeasureWithUnitAndQRI.hxx -usr/include/opencascade/StepRepr_ReprItemAndPlaneAngleMeasureWithUnit.hxx -usr/include/opencascade/StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI.hxx -usr/include/opencascade/StepRepr_Representation.hxx usr/include/opencascade/StepRepr_RepresentationContext.hxx +usr/include/opencascade/StepRepr_Representation.hxx usr/include/opencascade/StepRepr_RepresentationItem.hxx usr/include/opencascade/StepRepr_RepresentationMap.hxx usr/include/opencascade/StepRepr_RepresentationRelationship.hxx usr/include/opencascade/StepRepr_RepresentationRelationshipWithTransformation.hxx usr/include/opencascade/StepRepr_RepresentedDefinition.hxx +usr/include/opencascade/StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI.hxx +usr/include/opencascade/StepRepr_ReprItemAndLengthMeasureWithUnit.hxx +usr/include/opencascade/StepRepr_ReprItemAndMeasureWithUnitAndQRI.hxx +usr/include/opencascade/StepRepr_ReprItemAndMeasureWithUnit.hxx +usr/include/opencascade/StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI.hxx +usr/include/opencascade/StepRepr_ReprItemAndPlaneAngleMeasureWithUnit.hxx usr/include/opencascade/StepRepr_SequenceOfMaterialPropertyRepresentation.hxx usr/include/opencascade/StepRepr_SequenceOfRepresentationItem.hxx -usr/include/opencascade/StepRepr_ShapeAspect.hxx usr/include/opencascade/StepRepr_ShapeAspectDerivingRelationship.hxx +usr/include/opencascade/StepRepr_ShapeAspect.hxx usr/include/opencascade/StepRepr_ShapeAspectRelationship.hxx usr/include/opencascade/StepRepr_ShapeAspectTransition.hxx usr/include/opencascade/StepRepr_ShapeDefinition.hxx usr/include/opencascade/StepRepr_ShapeRepresentationRelationship.hxx usr/include/opencascade/StepRepr_ShapeRepresentationRelationshipWithTransformation.hxx usr/include/opencascade/StepRepr_SpecifiedHigherUsageOccurrence.hxx -usr/include/opencascade/StepRepr_StructuralResponseProperty.hxx usr/include/opencascade/StepRepr_StructuralResponsePropertyDefinitionRepresentation.hxx +usr/include/opencascade/StepRepr_StructuralResponseProperty.hxx usr/include/opencascade/StepRepr_SuppliedPartRelationship.hxx usr/include/opencascade/StepRepr_Tangent.hxx usr/include/opencascade/StepRepr_Transformation.hxx @@ -2213,6 +2223,23 @@ usr/include/opencascade/StepSelect_Activator.hxx usr/include/opencascade/StepSelect_FileModifier.hxx usr/include/opencascade/StepSelect_FloatFormat.hxx +usr/include/opencascade/STEPSelections_AssemblyComponent.hxx +usr/include/opencascade/STEPSelections_AssemblyComponent.lxx +usr/include/opencascade/STEPSelections_AssemblyExplorer.hxx +usr/include/opencascade/STEPSelections_AssemblyExplorer.lxx +usr/include/opencascade/STEPSelections_AssemblyLink.hxx +usr/include/opencascade/STEPSelections_AssemblyLink.lxx +usr/include/opencascade/STEPSelections_Counter.hxx +usr/include/opencascade/STEPSelections_Counter.lxx +usr/include/opencascade/STEPSelections_HSequenceOfAssemblyLink.hxx +usr/include/opencascade/STEPSelections_SelectAssembly.hxx +usr/include/opencascade/STEPSelections_SelectDerived.hxx +usr/include/opencascade/STEPSelections_SelectFaces.hxx +usr/include/opencascade/STEPSelections_SelectForTransfer.hxx +usr/include/opencascade/STEPSelections_SelectGSCurves.hxx +usr/include/opencascade/STEPSelections_SelectInstances.hxx +usr/include/opencascade/STEPSelections_SequenceOfAssemblyComponent.hxx +usr/include/opencascade/STEPSelections_SequenceOfAssemblyLink.hxx usr/include/opencascade/StepSelect_ModelModifier.hxx usr/include/opencascade/StepSelect_StepType.hxx usr/include/opencascade/StepSelect_WorkLibrary.hxx @@ -2224,8 +2251,8 @@ usr/include/opencascade/StepShape_Array1OfConnectedEdgeSet.hxx usr/include/opencascade/StepShape_Array1OfConnectedFaceSet.hxx usr/include/opencascade/StepShape_Array1OfEdge.hxx -usr/include/opencascade/StepShape_Array1OfFace.hxx usr/include/opencascade/StepShape_Array1OfFaceBound.hxx +usr/include/opencascade/StepShape_Array1OfFace.hxx usr/include/opencascade/StepShape_Array1OfGeometricSetSelect.hxx usr/include/opencascade/StepShape_Array1OfOrientedClosedShell.hxx usr/include/opencascade/StepShape_Array1OfOrientedEdge.hxx @@ -2258,41 +2285,41 @@ usr/include/opencascade/StepShape_DimensionalSize.hxx usr/include/opencascade/StepShape_DimensionalSizeWithPath.hxx usr/include/opencascade/StepShape_DirectedDimensionalLocation.hxx -usr/include/opencascade/StepShape_Edge.hxx usr/include/opencascade/StepShape_EdgeBasedWireframeModel.hxx usr/include/opencascade/StepShape_EdgeBasedWireframeShapeRepresentation.hxx usr/include/opencascade/StepShape_EdgeCurve.hxx +usr/include/opencascade/StepShape_Edge.hxx usr/include/opencascade/StepShape_EdgeLoop.hxx usr/include/opencascade/StepShape_ExtrudedAreaSolid.hxx usr/include/opencascade/StepShape_ExtrudedFaceSolid.hxx -usr/include/opencascade/StepShape_Face.hxx usr/include/opencascade/StepShape_FaceBasedSurfaceModel.hxx usr/include/opencascade/StepShape_FaceBound.hxx +usr/include/opencascade/StepShape_Face.hxx usr/include/opencascade/StepShape_FaceOuterBound.hxx usr/include/opencascade/StepShape_FaceSurface.hxx -usr/include/opencascade/StepShape_FacetedBrep.hxx usr/include/opencascade/StepShape_FacetedBrepAndBrepWithVoids.hxx +usr/include/opencascade/StepShape_FacetedBrep.hxx usr/include/opencascade/StepShape_FacetedBrepShapeRepresentation.hxx +usr/include/opencascade/StepShape_GeometricallyBoundedSurfaceShapeRepresentation.hxx +usr/include/opencascade/StepShape_GeometricallyBoundedWireframeShapeRepresentation.hxx usr/include/opencascade/StepShape_GeometricCurveSet.hxx usr/include/opencascade/StepShape_GeometricSet.hxx usr/include/opencascade/StepShape_GeometricSetSelect.hxx -usr/include/opencascade/StepShape_GeometricallyBoundedSurfaceShapeRepresentation.hxx -usr/include/opencascade/StepShape_GeometricallyBoundedWireframeShapeRepresentation.hxx +usr/include/opencascade/StepShape_HalfSpaceSolid.hxx usr/include/opencascade/StepShape_HArray1OfConnectedEdgeSet.hxx usr/include/opencascade/StepShape_HArray1OfConnectedFaceSet.hxx usr/include/opencascade/StepShape_HArray1OfEdge.hxx -usr/include/opencascade/StepShape_HArray1OfFace.hxx usr/include/opencascade/StepShape_HArray1OfFaceBound.hxx +usr/include/opencascade/StepShape_HArray1OfFace.hxx usr/include/opencascade/StepShape_HArray1OfGeometricSetSelect.hxx usr/include/opencascade/StepShape_HArray1OfOrientedClosedShell.hxx usr/include/opencascade/StepShape_HArray1OfOrientedEdge.hxx usr/include/opencascade/StepShape_HArray1OfShapeDimensionRepresentationItem.hxx usr/include/opencascade/StepShape_HArray1OfShell.hxx usr/include/opencascade/StepShape_HArray1OfValueQualifier.hxx -usr/include/opencascade/StepShape_HalfSpaceSolid.hxx usr/include/opencascade/StepShape_LimitsAndFits.hxx -usr/include/opencascade/StepShape_Loop.hxx usr/include/opencascade/StepShape_LoopAndPath.hxx +usr/include/opencascade/StepShape_Loop.hxx usr/include/opencascade/StepShape_ManifoldSolidBrep.hxx usr/include/opencascade/StepShape_ManifoldSurfaceShapeRepresentation.hxx usr/include/opencascade/StepShape_MeasureQualification.hxx @@ -2322,8 +2349,8 @@ usr/include/opencascade/StepShape_ShapeDimensionRepresentationItem.hxx usr/include/opencascade/StepShape_ShapeRepresentation.hxx usr/include/opencascade/StepShape_ShapeRepresentationWithParameters.hxx -usr/include/opencascade/StepShape_Shell.hxx usr/include/opencascade/StepShape_ShellBasedSurfaceModel.hxx +usr/include/opencascade/StepShape_Shell.hxx usr/include/opencascade/StepShape_SolidModel.hxx usr/include/opencascade/StepShape_SolidReplica.hxx usr/include/opencascade/StepShape_Sphere.hxx @@ -2343,10 +2370,10 @@ usr/include/opencascade/StepShape_Vertex.hxx usr/include/opencascade/StepShape_VertexLoop.hxx usr/include/opencascade/StepShape_VertexPoint.hxx +usr/include/opencascade/step.tab.hxx usr/include/opencascade/StepToGeom.hxx -usr/include/opencascade/StepToTopoDS.hxx -usr/include/opencascade/StepToTopoDS_Builder.hxx usr/include/opencascade/StepToTopoDS_BuilderError.hxx +usr/include/opencascade/StepToTopoDS_Builder.hxx usr/include/opencascade/StepToTopoDS_CartesianPointHasher.hxx usr/include/opencascade/StepToTopoDS_DataMapIteratorOfDataMapOfRI.hxx usr/include/opencascade/StepToTopoDS_DataMapIteratorOfDataMapOfRINames.hxx @@ -2356,13 +2383,14 @@ usr/include/opencascade/StepToTopoDS_DataMapOfRI.hxx usr/include/opencascade/StepToTopoDS_DataMapOfRINames.hxx usr/include/opencascade/StepToTopoDS_DataMapOfTRI.hxx -usr/include/opencascade/StepToTopoDS_GeometricTool.hxx usr/include/opencascade/StepToTopoDS_GeometricToolError.hxx +usr/include/opencascade/StepToTopoDS_GeometricTool.hxx +usr/include/opencascade/StepToTopoDS.hxx usr/include/opencascade/StepToTopoDS_MakeTransformed.hxx usr/include/opencascade/StepToTopoDS_NMTool.hxx usr/include/opencascade/StepToTopoDS_PointEdgeMap.hxx -usr/include/opencascade/StepToTopoDS_PointPair.hxx usr/include/opencascade/StepToTopoDS_PointPairHasher.hxx +usr/include/opencascade/StepToTopoDS_PointPair.hxx usr/include/opencascade/StepToTopoDS_PointVertexMap.hxx usr/include/opencascade/StepToTopoDS_Root.hxx usr/include/opencascade/StepToTopoDS_Root.lxx @@ -2370,27 +2398,27 @@ usr/include/opencascade/StepToTopoDS_TranslateCompositeCurve.hxx usr/include/opencascade/StepToTopoDS_TranslateCompositeCurve.lxx usr/include/opencascade/StepToTopoDS_TranslateCurveBoundedSurface.hxx -usr/include/opencascade/StepToTopoDS_TranslateEdge.hxx usr/include/opencascade/StepToTopoDS_TranslateEdgeError.hxx -usr/include/opencascade/StepToTopoDS_TranslateEdgeLoop.hxx +usr/include/opencascade/StepToTopoDS_TranslateEdge.hxx usr/include/opencascade/StepToTopoDS_TranslateEdgeLoopError.hxx -usr/include/opencascade/StepToTopoDS_TranslateFace.hxx +usr/include/opencascade/StepToTopoDS_TranslateEdgeLoop.hxx usr/include/opencascade/StepToTopoDS_TranslateFaceError.hxx -usr/include/opencascade/StepToTopoDS_TranslatePolyLoop.hxx +usr/include/opencascade/StepToTopoDS_TranslateFace.hxx usr/include/opencascade/StepToTopoDS_TranslatePolyLoopError.hxx -usr/include/opencascade/StepToTopoDS_TranslateShell.hxx +usr/include/opencascade/StepToTopoDS_TranslatePolyLoop.hxx usr/include/opencascade/StepToTopoDS_TranslateShellError.hxx -usr/include/opencascade/StepToTopoDS_TranslateVertex.hxx +usr/include/opencascade/StepToTopoDS_TranslateShell.hxx usr/include/opencascade/StepToTopoDS_TranslateVertexError.hxx -usr/include/opencascade/StepToTopoDS_TranslateVertexLoop.hxx +usr/include/opencascade/StepToTopoDS_TranslateVertex.hxx usr/include/opencascade/StepToTopoDS_TranslateVertexLoopError.hxx +usr/include/opencascade/StepToTopoDS_TranslateVertexLoop.hxx +usr/include/opencascade/StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.hxx usr/include/opencascade/StepVisual_AnnotationCurveOccurrence.hxx -usr/include/opencascade/StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx usr/include/opencascade/StepVisual_AnnotationFillArea.hxx usr/include/opencascade/StepVisual_AnnotationFillAreaOccurrence.hxx usr/include/opencascade/StepVisual_AnnotationOccurrence.hxx -usr/include/opencascade/StepVisual_AnnotationPlane.hxx usr/include/opencascade/StepVisual_AnnotationPlaneElement.hxx +usr/include/opencascade/StepVisual_AnnotationPlane.hxx usr/include/opencascade/StepVisual_AnnotationText.hxx usr/include/opencascade/StepVisual_AnnotationTextOccurrence.hxx usr/include/opencascade/StepVisual_AreaInSet.hxx @@ -2407,15 +2435,15 @@ usr/include/opencascade/StepVisual_Array1OfLayeredItem.hxx usr/include/opencascade/StepVisual_Array1OfPresentationStyleAssignment.hxx usr/include/opencascade/StepVisual_Array1OfPresentationStyleSelect.hxx +usr/include/opencascade/StepVisual_Array1OfRenderingPropertiesSelect.hxx usr/include/opencascade/StepVisual_Array1OfStyleContextSelect.hxx usr/include/opencascade/StepVisual_Array1OfSurfaceStyleElementSelect.hxx usr/include/opencascade/StepVisual_Array1OfTextOrCharacter.hxx usr/include/opencascade/StepVisual_BackgroundColour.hxx usr/include/opencascade/StepVisual_BoxCharacteristicSelect.hxx -usr/include/opencascade/StepVisual_CameraImage.hxx usr/include/opencascade/StepVisual_CameraImage2dWithScale.hxx usr/include/opencascade/StepVisual_CameraImage3dWithScale.hxx -usr/include/opencascade/StepVisual_CameraModel.hxx +usr/include/opencascade/StepVisual_CameraImage.hxx usr/include/opencascade/StepVisual_CameraModelD2.hxx usr/include/opencascade/StepVisual_CameraModelD3.hxx usr/include/opencascade/StepVisual_CameraModelD3MultiClipping.hxx @@ -2423,9 +2451,10 @@ usr/include/opencascade/StepVisual_CameraModelD3MultiClippingIntersection.hxx usr/include/opencascade/StepVisual_CameraModelD3MultiClippingUnion.hxx usr/include/opencascade/StepVisual_CameraModelD3MultiClippingUnionSelect.hxx +usr/include/opencascade/StepVisual_CameraModel.hxx usr/include/opencascade/StepVisual_CameraUsage.hxx usr/include/opencascade/StepVisual_CentralOrParallel.hxx -usr/include/opencascade/StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx +usr/include/opencascade/StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.hxx usr/include/opencascade/StepVisual_Colour.hxx usr/include/opencascade/StepVisual_ColourRgb.hxx usr/include/opencascade/StepVisual_ColourSpecification.hxx @@ -2434,21 +2463,21 @@ usr/include/opencascade/StepVisual_ContextDependentInvisibility.hxx usr/include/opencascade/StepVisual_ContextDependentOverRidingStyledItem.hxx usr/include/opencascade/StepVisual_CoordinatesList.hxx -usr/include/opencascade/StepVisual_CurveStyle.hxx usr/include/opencascade/StepVisual_CurveStyleFont.hxx usr/include/opencascade/StepVisual_CurveStyleFontPattern.hxx usr/include/opencascade/StepVisual_CurveStyleFontSelect.hxx +usr/include/opencascade/StepVisual_CurveStyle.hxx usr/include/opencascade/StepVisual_DirectionCountSelect.hxx usr/include/opencascade/StepVisual_DraughtingAnnotationOccurrence.hxx -usr/include/opencascade/StepVisual_DraughtingCallout.hxx usr/include/opencascade/StepVisual_DraughtingCalloutElement.hxx +usr/include/opencascade/StepVisual_DraughtingCallout.hxx usr/include/opencascade/StepVisual_DraughtingModel.hxx usr/include/opencascade/StepVisual_DraughtingPreDefinedColour.hxx usr/include/opencascade/StepVisual_DraughtingPreDefinedCurveFont.hxx usr/include/opencascade/StepVisual_ExternallyDefinedCurveFont.hxx usr/include/opencascade/StepVisual_ExternallyDefinedTextFont.hxx -usr/include/opencascade/StepVisual_FillAreaStyle.hxx usr/include/opencascade/StepVisual_FillAreaStyleColour.hxx +usr/include/opencascade/StepVisual_FillAreaStyle.hxx usr/include/opencascade/StepVisual_FillStyleSelect.hxx usr/include/opencascade/StepVisual_FontSelect.hxx usr/include/opencascade/StepVisual_HArray1OfAnnotationPlaneElement.hxx @@ -2463,11 +2492,12 @@ usr/include/opencascade/StepVisual_HArray1OfLayeredItem.hxx usr/include/opencascade/StepVisual_HArray1OfPresentationStyleAssignment.hxx usr/include/opencascade/StepVisual_HArray1OfPresentationStyleSelect.hxx +usr/include/opencascade/StepVisual_HArray1OfRenderingPropertiesSelect.hxx usr/include/opencascade/StepVisual_HArray1OfStyleContextSelect.hxx usr/include/opencascade/StepVisual_HArray1OfSurfaceStyleElementSelect.hxx usr/include/opencascade/StepVisual_HArray1OfTextOrCharacter.hxx -usr/include/opencascade/StepVisual_Invisibility.hxx usr/include/opencascade/StepVisual_InvisibilityContext.hxx +usr/include/opencascade/StepVisual_Invisibility.hxx usr/include/opencascade/StepVisual_InvisibleItem.hxx usr/include/opencascade/StepVisual_LayeredItem.hxx usr/include/opencascade/StepVisual_MarkerMember.hxx @@ -2491,14 +2521,16 @@ usr/include/opencascade/StepVisual_PresentationRepresentation.hxx usr/include/opencascade/StepVisual_PresentationRepresentationSelect.hxx usr/include/opencascade/StepVisual_PresentationSet.hxx -usr/include/opencascade/StepVisual_PresentationSize.hxx usr/include/opencascade/StepVisual_PresentationSizeAssignmentSelect.hxx +usr/include/opencascade/StepVisual_PresentationSize.hxx usr/include/opencascade/StepVisual_PresentationStyleAssignment.hxx usr/include/opencascade/StepVisual_PresentationStyleByContext.hxx usr/include/opencascade/StepVisual_PresentationStyleSelect.hxx usr/include/opencascade/StepVisual_PresentationView.hxx usr/include/opencascade/StepVisual_PresentedItem.hxx usr/include/opencascade/StepVisual_PresentedItemRepresentation.hxx +usr/include/opencascade/StepVisual_RenderingPropertiesSelect.hxx +usr/include/opencascade/StepVisual_ShadingSurfaceMethod.hxx usr/include/opencascade/StepVisual_StyleContextSelect.hxx usr/include/opencascade/StepVisual_StyledItem.hxx usr/include/opencascade/StepVisual_StyledItemTarget.hxx @@ -2509,8 +2541,12 @@ usr/include/opencascade/StepVisual_SurfaceStyleElementSelect.hxx usr/include/opencascade/StepVisual_SurfaceStyleFillArea.hxx usr/include/opencascade/StepVisual_SurfaceStyleParameterLine.hxx +usr/include/opencascade/StepVisual_SurfaceStyleReflectanceAmbient.hxx +usr/include/opencascade/StepVisual_SurfaceStyleRendering.hxx +usr/include/opencascade/StepVisual_SurfaceStyleRenderingWithProperties.hxx usr/include/opencascade/StepVisual_SurfaceStyleSegmentationCurve.hxx usr/include/opencascade/StepVisual_SurfaceStyleSilhouette.hxx +usr/include/opencascade/StepVisual_SurfaceStyleTransparent.hxx usr/include/opencascade/StepVisual_SurfaceStyleUsage.hxx usr/include/opencascade/StepVisual_Template.hxx usr/include/opencascade/StepVisual_TemplateInstance.hxx @@ -2521,23 +2557,23 @@ usr/include/opencascade/StepVisual_TextLiteral.hxx usr/include/opencascade/StepVisual_TextOrCharacter.hxx usr/include/opencascade/StepVisual_TextPath.hxx -usr/include/opencascade/StepVisual_TextStyle.hxx usr/include/opencascade/StepVisual_TextStyleForDefinedFont.hxx +usr/include/opencascade/StepVisual_TextStyle.hxx usr/include/opencascade/StepVisual_TextStyleWithBoxCharacteristics.hxx usr/include/opencascade/StepVisual_ViewVolume.hxx usr/include/opencascade/StlAPI.hxx usr/include/opencascade/StlAPI_Reader.hxx usr/include/opencascade/StlAPI_Writer.hxx -usr/include/opencascade/TopoDSToStep.hxx -usr/include/opencascade/TopoDSToStep_Builder.hxx usr/include/opencascade/TopoDSToStep_BuilderError.hxx +usr/include/opencascade/TopoDSToStep_Builder.hxx usr/include/opencascade/TopoDSToStep_FacetedError.hxx usr/include/opencascade/TopoDSToStep_FacetedTool.hxx +usr/include/opencascade/TopoDSToStep.hxx usr/include/opencascade/TopoDSToStep_MakeBrepWithVoids.hxx usr/include/opencascade/TopoDSToStep_MakeEdgeError.hxx usr/include/opencascade/TopoDSToStep_MakeFaceError.hxx -usr/include/opencascade/TopoDSToStep_MakeFacetedBrep.hxx usr/include/opencascade/TopoDSToStep_MakeFacetedBrepAndBrepWithVoids.hxx +usr/include/opencascade/TopoDSToStep_MakeFacetedBrep.hxx usr/include/opencascade/TopoDSToStep_MakeGeometricCurveSet.hxx usr/include/opencascade/TopoDSToStep_MakeManifoldSolidBrep.hxx usr/include/opencascade/TopoDSToStep_MakeShellBasedSurfaceModel.hxx @@ -2550,9 +2586,17 @@ usr/include/opencascade/TopoDSToStep_Root.hxx usr/include/opencascade/TopoDSToStep_Tool.hxx usr/include/opencascade/TopoDSToStep_WireframeBuilder.hxx -usr/include/opencascade/TransferBRep.hxx +usr/include/opencascade/Transfer_ActorDispatch.hxx +usr/include/opencascade/Transfer_Actor.gxx +usr/include/opencascade/Transfer_ActorOfFinderProcess.hxx +usr/include/opencascade/Transfer_ActorOfProcessForFinder.hxx +usr/include/opencascade/Transfer_ActorOfProcessForTransient.hxx +usr/include/opencascade/Transfer_ActorOfTransientProcess.hxx +usr/include/opencascade/Transfer_Binder.hxx +usr/include/opencascade/Transfer_BinderOfTransientInteger.hxx usr/include/opencascade/TransferBRep_BinderOfShape.hxx usr/include/opencascade/TransferBRep_HSequenceOfTransferResultInfo.hxx +usr/include/opencascade/TransferBRep.hxx usr/include/opencascade/TransferBRep_OrientedShapeMapper.hxx usr/include/opencascade/TransferBRep_Reader.hxx usr/include/opencascade/TransferBRep_SequenceOfTransferResultInfo.hxx @@ -2562,19 +2606,11 @@ usr/include/opencascade/TransferBRep_ShapeMapper.hxx usr/include/opencascade/TransferBRep_TransferResultInfo.hxx usr/include/opencascade/TransferBRep_TransferResultInfo.lxx -usr/include/opencascade/Transfer_Actor.gxx -usr/include/opencascade/Transfer_ActorDispatch.hxx -usr/include/opencascade/Transfer_ActorOfFinderProcess.hxx -usr/include/opencascade/Transfer_ActorOfProcessForFinder.hxx -usr/include/opencascade/Transfer_ActorOfProcessForTransient.hxx -usr/include/opencascade/Transfer_ActorOfTransientProcess.hxx -usr/include/opencascade/Transfer_Binder.hxx -usr/include/opencascade/Transfer_BinderOfTransientInteger.hxx usr/include/opencascade/Transfer_DataInfo.hxx usr/include/opencascade/Transfer_DispatchControl.hxx -usr/include/opencascade/Transfer_FindHasher.hxx usr/include/opencascade/Transfer_Finder.hxx usr/include/opencascade/Transfer_FinderProcess.hxx +usr/include/opencascade/Transfer_FindHasher.hxx usr/include/opencascade/Transfer_HSequenceOfBinder.hxx usr/include/opencascade/Transfer_HSequenceOfFinder.hxx usr/include/opencascade/Transfer_Iterator.gxx @@ -2607,10 +2643,13 @@ usr/include/opencascade/Transfer_UndefMode.hxx usr/include/opencascade/Transfer_VoidBinder.hxx usr/include/opencascade/UnitsMethods.hxx -usr/include/opencascade/Vrml.hxx usr/include/opencascade/VrmlAPI.hxx usr/include/opencascade/VrmlAPI_RepresentationOfShape.hxx usr/include/opencascade/VrmlAPI_Writer.hxx +usr/include/opencascade/Vrml_AsciiText.hxx +usr/include/opencascade/Vrml_AsciiTextJustification.hxx +usr/include/opencascade/Vrml_Cone.hxx +usr/include/opencascade/Vrml_ConeParts.hxx usr/include/opencascade/VrmlConverter_Curve.hxx usr/include/opencascade/VrmlConverter_DeflectionCurve.hxx usr/include/opencascade/VrmlConverter_Drawer.hxx @@ -2627,6 +2666,10 @@ usr/include/opencascade/VrmlConverter_WFDeflectionShape.hxx usr/include/opencascade/VrmlConverter_WFRestrictedFace.hxx usr/include/opencascade/VrmlConverter_WFShape.hxx +usr/include/opencascade/Vrml_Coordinate3.hxx +usr/include/opencascade/Vrml_Cube.hxx +usr/include/opencascade/Vrml_Cylinder.hxx +usr/include/opencascade/Vrml_CylinderParts.hxx usr/include/opencascade/VrmlData_Appearance.hxx usr/include/opencascade/VrmlData_ArrayVec3d.hxx usr/include/opencascade/VrmlData_Box.hxx @@ -2652,47 +2695,40 @@ usr/include/opencascade/VrmlData_ShapeConvert.hxx usr/include/opencascade/VrmlData_ShapeNode.hxx usr/include/opencascade/VrmlData_Sphere.hxx -usr/include/opencascade/VrmlData_Texture.hxx usr/include/opencascade/VrmlData_TextureCoordinate.hxx +usr/include/opencascade/VrmlData_Texture.hxx usr/include/opencascade/VrmlData_TextureTransform.hxx usr/include/opencascade/VrmlData_UnknownNode.hxx usr/include/opencascade/VrmlData_WorldInfo.hxx -usr/include/opencascade/Vrml_AsciiText.hxx -usr/include/opencascade/Vrml_AsciiTextJustification.hxx -usr/include/opencascade/Vrml_Cone.hxx -usr/include/opencascade/Vrml_ConeParts.hxx -usr/include/opencascade/Vrml_Coordinate3.hxx -usr/include/opencascade/Vrml_Cube.hxx -usr/include/opencascade/Vrml_Cylinder.hxx -usr/include/opencascade/Vrml_CylinderParts.hxx usr/include/opencascade/Vrml_DirectionalLight.hxx usr/include/opencascade/Vrml_FaceType.hxx -usr/include/opencascade/Vrml_FontStyle.hxx usr/include/opencascade/Vrml_FontStyleFamily.hxx +usr/include/opencascade/Vrml_FontStyle.hxx usr/include/opencascade/Vrml_FontStyleStyle.hxx usr/include/opencascade/Vrml_Group.hxx +usr/include/opencascade/Vrml.hxx usr/include/opencascade/Vrml_IndexedFaceSet.hxx usr/include/opencascade/Vrml_IndexedLineSet.hxx usr/include/opencascade/Vrml_Info.hxx usr/include/opencascade/Vrml_Instancing.hxx usr/include/opencascade/Vrml_LOD.hxx -usr/include/opencascade/Vrml_Material.hxx -usr/include/opencascade/Vrml_MaterialBinding.hxx usr/include/opencascade/Vrml_MaterialBindingAndNormalBinding.hxx +usr/include/opencascade/Vrml_MaterialBinding.hxx +usr/include/opencascade/Vrml_Material.hxx usr/include/opencascade/Vrml_MatrixTransform.hxx -usr/include/opencascade/Vrml_Normal.hxx usr/include/opencascade/Vrml_NormalBinding.hxx +usr/include/opencascade/Vrml_Normal.hxx usr/include/opencascade/Vrml_OrthographicCamera.hxx usr/include/opencascade/Vrml_PerspectiveCamera.hxx usr/include/opencascade/Vrml_PointLight.hxx usr/include/opencascade/Vrml_PointSet.hxx usr/include/opencascade/Vrml_Rotation.hxx -usr/include/opencascade/Vrml_SFImage.hxx -usr/include/opencascade/Vrml_SFImageNumber.hxx -usr/include/opencascade/Vrml_SFRotation.hxx usr/include/opencascade/Vrml_Scale.hxx usr/include/opencascade/Vrml_Separator.hxx usr/include/opencascade/Vrml_SeparatorRenderCulling.hxx +usr/include/opencascade/Vrml_SFImage.hxx +usr/include/opencascade/Vrml_SFImageNumber.hxx +usr/include/opencascade/Vrml_SFRotation.hxx usr/include/opencascade/Vrml_ShapeHints.hxx usr/include/opencascade/Vrml_ShapeType.hxx usr/include/opencascade/Vrml_Sphere.hxx @@ -2711,8 +2747,8 @@ usr/include/opencascade/Vrml_WWWInline.hxx usr/include/opencascade/XCAFApp_Application.hxx usr/include/opencascade/XCAFDimTolObjects_DataMapOfToleranceDatum.hxx -usr/include/opencascade/XCAFDimTolObjects_DatumModifWithValue.hxx usr/include/opencascade/XCAFDimTolObjects_DatumModifiersSequence.hxx +usr/include/opencascade/XCAFDimTolObjects_DatumModifWithValue.hxx usr/include/opencascade/XCAFDimTolObjects_DatumObject.hxx usr/include/opencascade/XCAFDimTolObjects_DatumObjectSequence.hxx usr/include/opencascade/XCAFDimTolObjects_DatumSingleModif.hxx @@ -2733,8 +2769,8 @@ usr/include/opencascade/XCAFDimTolObjects_GeomToleranceType.hxx usr/include/opencascade/XCAFDimTolObjects_GeomToleranceTypeValue.hxx usr/include/opencascade/XCAFDimTolObjects_GeomToleranceZoneModif.hxx +usr/include/opencascade/XCAFDimTolObjects_ToleranceZoneAffectedPlane.hxx usr/include/opencascade/XCAFDimTolObjects_Tool.hxx -usr/include/opencascade/XCAFDoc.hxx usr/include/opencascade/XCAFDoc_Area.hxx usr/include/opencascade/XCAFDoc_AssemblyItemId.hxx usr/include/opencascade/XCAFDoc_AssemblyItemRef.hxx @@ -2746,52 +2782,79 @@ usr/include/opencascade/XCAFDoc_DataMapIteratorOfDataMapOfShapeLabel.hxx usr/include/opencascade/XCAFDoc_DataMapOfShapeLabel.hxx usr/include/opencascade/XCAFDoc_Datum.hxx +usr/include/opencascade/XCAFDoc_Dimension.hxx usr/include/opencascade/XCAFDoc_DimTol.hxx usr/include/opencascade/XCAFDoc_DimTolTool.hxx -usr/include/opencascade/XCAFDoc_Dimension.hxx usr/include/opencascade/XCAFDoc_DocumentTool.hxx usr/include/opencascade/XCAFDoc_Editor.hxx usr/include/opencascade/XCAFDoc_GeomTolerance.hxx usr/include/opencascade/XCAFDoc_GraphNode.hxx usr/include/opencascade/XCAFDoc_GraphNodeSequence.hxx +usr/include/opencascade/XCAFDoc.hxx usr/include/opencascade/XCAFDoc_LayerTool.hxx usr/include/opencascade/XCAFDoc_Location.hxx usr/include/opencascade/XCAFDoc_Material.hxx usr/include/opencascade/XCAFDoc_MaterialTool.hxx -usr/include/opencascade/XCAFDoc_Note.hxx usr/include/opencascade/XCAFDoc_NoteBalloon.hxx usr/include/opencascade/XCAFDoc_NoteBinData.hxx usr/include/opencascade/XCAFDoc_NoteComment.hxx +usr/include/opencascade/XCAFDoc_Note.hxx usr/include/opencascade/XCAFDoc_NotesTool.hxx usr/include/opencascade/XCAFDoc_PartId.hxx usr/include/opencascade/XCAFDoc_ShapeMapTool.hxx usr/include/opencascade/XCAFDoc_ShapeTool.hxx usr/include/opencascade/XCAFDoc_View.hxx usr/include/opencascade/XCAFDoc_ViewTool.hxx +usr/include/opencascade/XCAFDoc_VisMaterialCommon.hxx +usr/include/opencascade/XCAFDoc_VisMaterial.hxx +usr/include/opencascade/XCAFDoc_VisMaterialPBR.hxx +usr/include/opencascade/XCAFDoc_VisMaterialTool.hxx usr/include/opencascade/XCAFDoc_Volume.hxx -usr/include/opencascade/XCAFPrs.hxx +usr/include/opencascade/XCAFNoteObjects_NoteObject.hxx usr/include/opencascade/XCAFPrs_AISObject.hxx usr/include/opencascade/XCAFPrs_DataMapIteratorOfDataMapOfStyleShape.hxx usr/include/opencascade/XCAFPrs_DataMapIteratorOfDataMapOfStyleTransient.hxx +usr/include/opencascade/XCAFPrs_DataMapIteratorOfIndexedDataMapOfShapeStyle.hxx usr/include/opencascade/XCAFPrs_DataMapOfStyleShape.hxx usr/include/opencascade/XCAFPrs_DataMapOfStyleTransient.hxx -usr/include/opencascade/XCAFPrs_Driver.hxx -usr/include/opencascade/XCAFPrs_Style.hxx usr/include/opencascade/XCAFPrs_DocumentExplorer.hxx usr/include/opencascade/XCAFPrs_DocumentIdIterator.hxx usr/include/opencascade/XCAFPrs_DocumentNode.hxx +usr/include/opencascade/XCAFPrs_Driver.hxx +usr/include/opencascade/XCAFPrs.hxx +usr/include/opencascade/XCAFPrs_IndexedDataMapOfShapeStyle.hxx +usr/include/opencascade/XCAFPrs_Style.hxx +usr/include/opencascade/XCAFPrs_Texture.hxx usr/include/opencascade/XCAFView_Object.hxx usr/include/opencascade/XCAFView_ProjectionType.hxx -usr/include/opencascade/XSAlgo.hxx +usr/include/opencascade/XmlMXCAFDoc_AssemblyItemRefDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_CentroidDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_ColorDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_DatumDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_DimTolDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_GraphNodeDriver.hxx +usr/include/opencascade/XmlMXCAFDoc.hxx +usr/include/opencascade/XmlMXCAFDoc_LocationDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_LocationDriver.lxx +usr/include/opencascade/XmlMXCAFDoc_MaterialDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_NoteBinDataDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_NoteCommentDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_NoteDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_VisMaterialDriver.hxx +usr/include/opencascade/XmlMXCAFDoc_VisMaterialToolDriver.hxx +usr/include/opencascade/XmlXCAFDrivers_DocumentRetrievalDriver.hxx +usr/include/opencascade/XmlXCAFDrivers_DocumentStorageDriver.hxx +usr/include/opencascade/XmlXCAFDrivers.hxx usr/include/opencascade/XSAlgo_AlgoContainer.hxx usr/include/opencascade/XSAlgo_AlgoContainer.lxx usr/include/opencascade/XSAlgo_Caller.hxx +usr/include/opencascade/XSAlgo.hxx usr/include/opencascade/XSAlgo_ToolContainer.hxx -usr/include/opencascade/XSControl.hxx usr/include/opencascade/XSControl_ConnectedShapes.hxx usr/include/opencascade/XSControl_Controller.hxx usr/include/opencascade/XSControl_FuncShape.hxx usr/include/opencascade/XSControl_Functions.hxx +usr/include/opencascade/XSControl.hxx usr/include/opencascade/XSControl_Reader.hxx usr/include/opencascade/XSControl_SelectForTransfer.hxx usr/include/opencascade/XSControl_SignTransferStatus.hxx @@ -2801,82 +2864,18 @@ usr/include/opencascade/XSControl_Vars.hxx usr/include/opencascade/XSControl_WorkSession.hxx usr/include/opencascade/XSControl_Writer.hxx -usr/include/opencascade/XmlMXCAFDoc.hxx -usr/include/opencascade/XmlMXCAFDoc_AreaDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_AssemblyItemRefDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_AssemblyItemRefDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_CentroidDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_ClippingPlaneToolDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_ColorDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_ColorToolDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_DatumDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_DimTolDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_DimTolToolDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_DocumentToolDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_GraphNodeDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_LayerToolDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_LocationDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_LocationDriver.lxx -usr/include/opencascade/XmlMXCAFDoc_MaterialDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_MaterialToolDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_NoteBalloonDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_NoteBinDataDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_NoteCommentDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_NoteDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_NotesToolDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_ShapeToolDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_ViewToolDriver.hxx -usr/include/opencascade/XmlMXCAFDoc_VolumeDriver.hxx -usr/include/opencascade/XmlXCAFDrivers.hxx -usr/include/opencascade/XmlXCAFDrivers_DocumentRetrievalDriver.hxx -usr/include/opencascade/XmlXCAFDrivers_DocumentStorageDriver.hxx -usr/include/opencascade/igesread.h -usr/include/opencascade/step.tab.h +usr/lib/cmake/opencascade/OpenCASCADEDataExchangeTargets*.cmake usr/lib/*/libTKBinXCAF.so usr/lib/*/libTKIGES.so -usr/lib/*/libTKSTEP.so +usr/lib/*/libTKRWMesh.so usr/lib/*/libTKSTEP209.so usr/lib/*/libTKSTEPAttr.so usr/lib/*/libTKSTEPBase.so +usr/lib/*/libTKSTEP.so usr/lib/*/libTKSTL.so usr/lib/*/libTKVRML.so usr/lib/*/libTKXCAF.so usr/lib/*/libTKXDEIGES.so usr/lib/*/libTKXDESTEP.so -usr/lib/*/libTKXSBase.so usr/lib/*/libTKXmlXCAF.so -usr/lib/*/libTKRWMesh.so -usr/lib/cmake/opencascade/OpenCASCADEDataExchangeTargets*.cmake -usr/include/opencascade/XCAFDimTolObjects_ToleranceZoneAffectedPlane.hxx -usr/include/opencascade/XCAFNoteObjects_NoteObject.hxx -usr/include/opencascade/XCAFPrs_DataMapIteratorOfIndexedDataMapOfShapeStyle.hxx -usr/include/opencascade/XCAFPrs_IndexedDataMapOfShapeStyle.hxx -usr/include/opencascade/RWGltf_CafReader.hxx -usr/include/opencascade/RWGltf_GltfAccessorCompType.hxx -usr/include/opencascade/RWGltf_GltfAccessor.hxx -usr/include/opencascade/RWGltf_GltfAccessorLayout.hxx -usr/include/opencascade/RWGltf_GltfArrayType.hxx -usr/include/opencascade/RWGltf_GltfBufferView.hxx -usr/include/opencascade/RWGltf_GltfBufferViewTarget.hxx -usr/include/opencascade/RWGltf_GltfFace.hxx -usr/include/opencascade/RWGltf_GltfLatePrimitiveArray.hxx -usr/include/opencascade/RWGltf_GltfPrimArrayData.hxx -usr/include/opencascade/RWGltf_GltfPrimitiveMode.hxx -usr/include/opencascade/RWGltf_GltfRootElement.hxx -usr/include/opencascade/RWGltf_MaterialCommon.hxx -usr/include/opencascade/RWGltf_MaterialMetallicRoughness.hxx -usr/include/opencascade/RWGltf_PrimitiveArrayReader.hxx -usr/include/opencascade/RWGltf_TriangulationReader.hxx -usr/include/opencascade/RWMesh_CafReader.hxx -usr/include/opencascade/RWMesh_CoordinateSystemConverter.hxx -usr/include/opencascade/RWMesh_CoordinateSystem.hxx -usr/include/opencascade/RWMesh_NodeAttributes.hxx -usr/include/opencascade/RWObj_CafReader.hxx -usr/include/opencascade/RWObj.hxx -usr/include/opencascade/RWObj_Material.hxx -usr/include/opencascade/RWObj_MtlReader.hxx -usr/include/opencascade/RWObj_Reader.hxx -usr/include/opencascade/RWObj_SubMesh.hxx -usr/include/opencascade/RWObj_SubMeshReason.hxx -usr/include/opencascade/RWObj_Tools.hxx -usr/include/opencascade/RWObj_TriangulationReader.hxx +usr/lib/*/libTKXSBase.so diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-dev.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-dev.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-data-exchange-dev.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-data-exchange-dev.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,2 @@ +# This is lintian bug #966295 +libocct-data-exchange-dev: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-doc.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-doc.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-doc.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-doc.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,2 @@ +# This is lintian bug #966295 +libocct-doc: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-draw-7.4.install opencascade-7.5.1+dfsg1/debian/libocct-draw-7.4.install --- opencascade-7.4.1+dfsg1/debian/libocct-draw-7.4.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-draw-7.4.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -usr/lib/*/libTKDCAF.so.* -usr/lib/*/libTKDraw.so.* -usr/lib/*/libTKQADraw.so.* -usr/lib/*/libTKTObjDRAW.so.* -usr/lib/*/libTKTopTest.so.* -usr/lib/*/libTKViewerTest.so.* -usr/lib/*/libTKXDEDRAW.so.* -usr/lib/*/libTKXSDRAW.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-draw-7.4.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-draw-7.4.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-draw-7.4.lintian-overrides 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-draw-7.4.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -# this package contains a bunch of libraries and can thus not be named properly -package-name-doesnt-match-sonames -# symbols control files are not sustainable. -no-symbols-control-file diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-draw-7.5.install opencascade-7.5.1+dfsg1/debian/libocct-draw-7.5.install --- opencascade-7.4.1+dfsg1/debian/libocct-draw-7.5.install 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-draw-7.5.install 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,8 @@ +usr/lib/*/libTKDCAF.so.* +usr/lib/*/libTKDraw.so.* +usr/lib/*/libTKQADraw.so.* +usr/lib/*/libTKTObjDRAW.so.* +usr/lib/*/libTKTopTest.so.* +usr/lib/*/libTKViewerTest.so.* +usr/lib/*/libTKXDEDRAW.so.* +usr/lib/*/libTKXSDRAW.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-draw-7.5.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-draw-7.5.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-draw-7.5.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-draw-7.5.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,6 @@ +# this package contains a bunch of libraries and can thus not be named properly +package-name-doesnt-match-sonames +# symbols control files are not sustainable. +no-symbols-control-file +# This is lintian bug #966295 +libocct-draw-7.5: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-draw-dev.install opencascade-7.5.1+dfsg1/debian/libocct-draw-dev.install --- opencascade-7.4.1+dfsg1/debian/libocct-draw-dev.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-draw-dev.install 2021-02-01 03:05:25.000000000 +0000 @@ -1,15 +1,17 @@ -usr/include/opencascade/BOPTest.hxx usr/include/opencascade/BOPTest_DrawableShape.hxx +usr/include/opencascade/BOPTest.hxx usr/include/opencascade/BOPTest_Objects.hxx +usr/include/opencascade/BRepTest_DrawableHistory.hxx usr/include/opencascade/BRepTest.hxx -usr/include/opencascade/DBRep.hxx +usr/include/opencascade/BRepTest_Objects.hxx +usr/include/opencascade/CommandWindow.h usr/include/opencascade/DBRep_DrawableShape.hxx usr/include/opencascade/DBRep_Edge.hxx usr/include/opencascade/DBRep_Edge.lxx usr/include/opencascade/DBRep_Face.hxx usr/include/opencascade/DBRep_Face.lxx usr/include/opencascade/DBRep_HideData.hxx -usr/include/opencascade/DBRep_HideData.lxx +usr/include/opencascade/DBRep.hxx usr/include/opencascade/DBRep_IsoBuilder.hxx usr/include/opencascade/DBRep_ListIteratorOfListOfEdge.hxx usr/include/opencascade/DBRep_ListIteratorOfListOfFace.hxx @@ -17,27 +19,26 @@ usr/include/opencascade/DBRep_ListOfEdge.hxx usr/include/opencascade/DBRep_ListOfFace.hxx usr/include/opencascade/DBRep_ListOfHideData.hxx -usr/include/opencascade/DDF.hxx +usr/include/opencascade/DDataStd_DrawDriver.hxx +usr/include/opencascade/DDataStd_DrawPresentation.hxx +usr/include/opencascade/DDataStd.hxx +usr/include/opencascade/DDataStd_TreeBrowser.hxx usr/include/opencascade/DDF_AttributeBrowser.hxx usr/include/opencascade/DDF_Browser.hxx usr/include/opencascade/DDF_Data.hxx -usr/include/opencascade/DDF_IOStream.hxx +usr/include/opencascade/DDF.hxx usr/include/opencascade/DDF_ListIteratorOfTransactionStack.hxx usr/include/opencascade/DDF_Transaction.hxx usr/include/opencascade/DDF_TransactionStack.hxx -usr/include/opencascade/DDataStd.hxx -usr/include/opencascade/DDataStd_DrawDriver.hxx -usr/include/opencascade/DDataStd_DrawPresentation.hxx -usr/include/opencascade/DDataStd_TreeBrowser.hxx -usr/include/opencascade/DDocStd.hxx usr/include/opencascade/DDocStd_DrawDocument.hxx -usr/include/opencascade/DNaming.hxx +usr/include/opencascade/DDocStd.hxx usr/include/opencascade/DNaming_BooleanOperationDriver.hxx usr/include/opencascade/DNaming_BoxDriver.hxx usr/include/opencascade/DNaming_CylinderDriver.hxx usr/include/opencascade/DNaming_DataMapIteratorOfDataMapOfShapeOfName.hxx usr/include/opencascade/DNaming_DataMapOfShapeOfName.hxx usr/include/opencascade/DNaming_FilletDriver.hxx +usr/include/opencascade/DNaming.hxx usr/include/opencascade/DNaming_Line3DDriver.hxx usr/include/opencascade/DNaming_PointDriver.hxx usr/include/opencascade/DNaming_PrismDriver.hxx @@ -46,46 +47,6 @@ usr/include/opencascade/DNaming_SphereDriver.hxx usr/include/opencascade/DNaming_TransformationDriver.hxx usr/include/opencascade/DPrsStd.hxx -usr/include/opencascade/Draw.hxx -usr/include/opencascade/DrawDim.hxx -usr/include/opencascade/DrawDim_Angle.hxx -usr/include/opencascade/DrawDim_Dimension.hxx -usr/include/opencascade/DrawDim_Distance.hxx -usr/include/opencascade/DrawDim_PlanarAngle.hxx -usr/include/opencascade/DrawDim_PlanarDiameter.hxx -usr/include/opencascade/DrawDim_PlanarDimension.hxx -usr/include/opencascade/DrawDim_PlanarDistance.hxx -usr/include/opencascade/DrawDim_PlanarRadius.hxx -usr/include/opencascade/DrawDim_Radius.hxx -usr/include/opencascade/DrawFairCurve_Batten.hxx -usr/include/opencascade/DrawFairCurve_MinimalVariation.hxx -usr/include/opencascade/DrawRessource.h -usr/include/opencascade/DrawTrSurf.hxx -usr/include/opencascade/DrawTrSurf_BSplineCurve.hxx -usr/include/opencascade/DrawTrSurf_BSplineCurve.lxx -usr/include/opencascade/DrawTrSurf_BSplineCurve2d.hxx -usr/include/opencascade/DrawTrSurf_BSplineCurve2d.lxx -usr/include/opencascade/DrawTrSurf_BSplineSurface.hxx -usr/include/opencascade/DrawTrSurf_BSplineSurface.lxx -usr/include/opencascade/DrawTrSurf_BezierCurve.hxx -usr/include/opencascade/DrawTrSurf_BezierCurve.lxx -usr/include/opencascade/DrawTrSurf_BezierCurve2d.hxx -usr/include/opencascade/DrawTrSurf_BezierCurve2d.lxx -usr/include/opencascade/DrawTrSurf_BezierSurface.hxx -usr/include/opencascade/DrawTrSurf_BezierSurface.lxx -usr/include/opencascade/DrawTrSurf_Curve.hxx -usr/include/opencascade/DrawTrSurf_Curve.lxx -usr/include/opencascade/DrawTrSurf_Curve2d.hxx -usr/include/opencascade/DrawTrSurf_Curve2d.lxx -usr/include/opencascade/DrawTrSurf_Drawable.hxx -usr/include/opencascade/DrawTrSurf_Drawable.lxx -usr/include/opencascade/DrawTrSurf_Point.hxx -usr/include/opencascade/DrawTrSurf_Polygon2D.hxx -usr/include/opencascade/DrawTrSurf_Polygon3D.hxx -usr/include/opencascade/DrawTrSurf_Surface.hxx -usr/include/opencascade/DrawTrSurf_Surface.lxx -usr/include/opencascade/DrawTrSurf_Triangulation.hxx -usr/include/opencascade/DrawTrSurf_Triangulation2D.hxx usr/include/opencascade/Draw_Appli.hxx usr/include/opencascade/Draw_Axis2D.hxx usr/include/opencascade/Draw_Axis3D.hxx @@ -95,13 +56,26 @@ usr/include/opencascade/Draw_Circle3D.hxx usr/include/opencascade/Draw_Color.hxx usr/include/opencascade/Draw_ColorKind.hxx +usr/include/opencascade/DrawDim_Angle.hxx +usr/include/opencascade/DrawDim_Dimension.hxx +usr/include/opencascade/DrawDim_Distance.hxx +usr/include/opencascade/DrawDim.hxx +usr/include/opencascade/DrawDim_PlanarAngle.hxx +usr/include/opencascade/DrawDim_PlanarDiameter.hxx +usr/include/opencascade/DrawDim_PlanarDimension.hxx +usr/include/opencascade/DrawDim_PlanarDistance.hxx +usr/include/opencascade/DrawDim_PlanarRadius.hxx +usr/include/opencascade/DrawDim_Radius.hxx usr/include/opencascade/Draw_Display.hxx usr/include/opencascade/Draw_Drawable2D.hxx usr/include/opencascade/Draw_Drawable3D.hxx usr/include/opencascade/Draw_Drawable3D.lxx usr/include/opencascade/Draw_Failure.hxx +usr/include/opencascade/DrawFairCurve_Batten.hxx +usr/include/opencascade/DrawFairCurve_MinimalVariation.hxx usr/include/opencascade/Draw_Grid.hxx usr/include/opencascade/Draw_Grid.lxx +usr/include/opencascade/Draw.hxx usr/include/opencascade/Draw_Interpretor.hxx usr/include/opencascade/Draw_Main.hxx usr/include/opencascade/Draw_MapOfAsciiString.hxx @@ -113,40 +87,69 @@ usr/include/opencascade/Draw_PluginMacro.hxx usr/include/opencascade/Draw_Printer.hxx usr/include/opencascade/Draw_ProgressIndicator.hxx +usr/include/opencascade/DrawRessource.h usr/include/opencascade/Draw_Segment2D.hxx usr/include/opencascade/Draw_Segment3D.hxx usr/include/opencascade/Draw_SequenceOfDrawable3D.hxx usr/include/opencascade/Draw_Text2D.hxx usr/include/opencascade/Draw_Text3D.hxx -usr/include/opencascade/Draw_View.hxx +usr/include/opencascade/DrawTrSurf_BezierCurve2d.hxx +usr/include/opencascade/DrawTrSurf_BezierCurve2d.lxx +usr/include/opencascade/DrawTrSurf_BezierCurve.hxx +usr/include/opencascade/DrawTrSurf_BezierCurve.lxx +usr/include/opencascade/DrawTrSurf_BezierSurface.hxx +usr/include/opencascade/DrawTrSurf_BezierSurface.lxx +usr/include/opencascade/DrawTrSurf_BSplineCurve2d.hxx +usr/include/opencascade/DrawTrSurf_BSplineCurve2d.lxx +usr/include/opencascade/DrawTrSurf_BSplineCurve.hxx +usr/include/opencascade/DrawTrSurf_BSplineCurve.lxx +usr/include/opencascade/DrawTrSurf_BSplineSurface.hxx +usr/include/opencascade/DrawTrSurf_BSplineSurface.lxx +usr/include/opencascade/DrawTrSurf_Curve2d.hxx +usr/include/opencascade/DrawTrSurf_Curve2d.lxx +usr/include/opencascade/DrawTrSurf_Curve.hxx +usr/include/opencascade/DrawTrSurf_Curve.lxx +usr/include/opencascade/DrawTrSurf_Drawable.hxx +usr/include/opencascade/DrawTrSurf_Drawable.lxx +usr/include/opencascade/DrawTrSurf.hxx +usr/include/opencascade/DrawTrSurf_Point.hxx +usr/include/opencascade/DrawTrSurf_Polygon2D.hxx +usr/include/opencascade/DrawTrSurf_Polygon3D.hxx +usr/include/opencascade/DrawTrSurf_Surface.hxx +usr/include/opencascade/DrawTrSurf_Surface.lxx +usr/include/opencascade/DrawTrSurf_Triangulation2D.hxx +usr/include/opencascade/DrawTrSurf_Triangulation.hxx usr/include/opencascade/Draw_Viewer.hxx +usr/include/opencascade/Draw_View.hxx usr/include/opencascade/Draw_Window.hxx -usr/include/opencascade/GeometryTest.hxx usr/include/opencascade/GeometryTest_DrawableQualifiedCurve2d.hxx +usr/include/opencascade/GeometryTest.hxx usr/include/opencascade/GeomliteTest.hxx -usr/include/opencascade/HLRTest.hxx usr/include/opencascade/HLRTest_DrawableEdgeTool.hxx usr/include/opencascade/HLRTest_DrawablePolyEdgeTool.hxx usr/include/opencascade/HLRTest_DrawablePolyEdgeTool.lxx +usr/include/opencascade/HLRTest.hxx usr/include/opencascade/HLRTest_OutLiner.hxx usr/include/opencascade/HLRTest_OutLiner.lxx usr/include/opencascade/HLRTest_Projector.hxx usr/include/opencascade/HLRTest_Projector.lxx usr/include/opencascade/HLRTest_ShapeData.hxx usr/include/opencascade/HLRTest_ShapeData.lxx -usr/include/opencascade/MeshTest.hxx +usr/include/opencascade/init.h +usr/include/opencascade/MainWindow.h usr/include/opencascade/MeshTest_CheckTopology.hxx +usr/include/opencascade/MeshTest.hxx usr/include/opencascade/ModelDefinitions.hxx usr/include/opencascade/QABugs.hxx usr/include/opencascade/QABugs_PresentableObject.hxx usr/include/opencascade/QADNaming.hxx usr/include/opencascade/QADraw.hxx -usr/include/opencascade/QANCollection.hxx usr/include/opencascade/QANCollection_Common.hxx usr/include/opencascade/QANCollection_DataMapIteratorOfDataMapOfRealPnt.hxx usr/include/opencascade/QANCollection_DataMapOfRealPnt.hxx usr/include/opencascade/QANCollection_DoubleMapIteratorOfDoubleMapOfRealInteger.hxx usr/include/opencascade/QANCollection_DoubleMapOfRealInteger.hxx +usr/include/opencascade/QANCollection.hxx usr/include/opencascade/QANCollection_IndexedDataMapOfRealPnt.hxx usr/include/opencascade/QANCollection_ListIteratorOfListOfPnt.hxx usr/include/opencascade/QANCollection_ListOfPnt.hxx @@ -155,40 +158,42 @@ usr/include/opencascade/SWDRAW_ShapeCustom.hxx usr/include/opencascade/SWDRAW_ShapeExtend.hxx usr/include/opencascade/SWDRAW_ShapeFix.hxx -usr/include/opencascade/SWDRAW_ShapeProcess.hxx usr/include/opencascade/SWDRAW_ShapeProcessAPI.hxx +usr/include/opencascade/SWDRAW_ShapeProcess.hxx usr/include/opencascade/SWDRAW_ShapeTool.hxx usr/include/opencascade/SWDRAW_ShapeUpgrade.hxx usr/include/opencascade/TObjDRAW.hxx -usr/include/opencascade/ViewerTest.hxx usr/include/opencascade/ViewerTest_AutoUpdater.hxx usr/include/opencascade/ViewerTest_CmdParser.hxx +usr/include/opencascade/ViewerTest_ContinuousRedrawer.hxx usr/include/opencascade/ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx usr/include/opencascade/ViewerTest_DoubleMapOfInteractiveAndName.hxx usr/include/opencascade/ViewerTest_EventManager.hxx -usr/include/opencascade/XDEDRAW.hxx +usr/include/opencascade/ViewerTest.hxx +usr/include/opencascade/ViewerTest_V3dView.hxx usr/include/opencascade/XDEDRAW_Colors.hxx usr/include/opencascade/XDEDRAW_Common.hxx usr/include/opencascade/XDEDRAW_GDTs.hxx +usr/include/opencascade/XDEDRAW.hxx usr/include/opencascade/XDEDRAW_Layers.hxx usr/include/opencascade/XDEDRAW_Notes.hxx usr/include/opencascade/XDEDRAW_Props.hxx usr/include/opencascade/XDEDRAW_Shapes.hxx usr/include/opencascade/XDEDRAW_Views.hxx +usr/include/opencascade/XSDRAW_Functions.hxx usr/include/opencascade/XSDRAW.hxx usr/include/opencascade/XSDRAWIGES.hxx usr/include/opencascade/XSDRAWSTEP.hxx -usr/include/opencascade/XSDRAWSTLVRML.hxx usr/include/opencascade/XSDRAWSTLVRML_CoordsMap.hxx usr/include/opencascade/XSDRAWSTLVRML_DataMapIteratorOfCoordsMap.hxx usr/include/opencascade/XSDRAWSTLVRML_DataMapIteratorOfElemNodesMap.hxx -usr/include/opencascade/XSDRAWSTLVRML_DataSource.hxx usr/include/opencascade/XSDRAWSTLVRML_DataSource3D.hxx +usr/include/opencascade/XSDRAWSTLVRML_DataSource.hxx usr/include/opencascade/XSDRAWSTLVRML_DrawableMesh.hxx usr/include/opencascade/XSDRAWSTLVRML_ElemNodesMap.hxx -usr/include/opencascade/XSDRAW_Functions.hxx +usr/include/opencascade/XSDRAWSTLVRML.hxx usr/include/opencascade/XSDRAW_Vars.hxx -usr/include/opencascade/init.h +usr/lib/cmake/opencascade/OpenCASCADEDrawTargets*.cmake usr/lib/*/libTKDCAF.so usr/lib/*/libTKDraw.so usr/lib/*/libTKQADraw.so @@ -197,9 +202,3 @@ usr/lib/*/libTKViewerTest.so usr/lib/*/libTKXDEDRAW.so usr/lib/*/libTKXSDRAW.so -usr/lib/cmake/opencascade/OpenCASCADEDrawTargets*.cmake -usr/include/opencascade/BRepTest_DrawableHistory.hxx -usr/include/opencascade/BRepTest_Objects.hxx -usr/include/opencascade/MainWindow.h -usr/include/opencascade/CommandWindow.h -usr/include/opencascade/ViewerTest_V3dView.hxx diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-draw-dev.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-draw-dev.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-draw-dev.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-draw-dev.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,2 @@ +# This is lintian bug #966295 +libocct-draw-dev: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-foundation-7.4.install opencascade-7.5.1+dfsg1/debian/libocct-foundation-7.4.install --- opencascade-7.4.1+dfsg1/debian/libocct-foundation-7.4.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-foundation-7.4.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -usr/lib/*/libTKMath.so.* -usr/lib/*/libTKernel.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-foundation-7.4.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-foundation-7.4.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-foundation-7.4.lintian-overrides 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-foundation-7.4.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -# this package contains a bunch of libraries and can thus not be named properly -package-name-doesnt-match-sonames - -# false positive lack of hardening detected -hardening-no-fortify-functions -# symbols control files are not sustainable. -no-symbols-control-file -# symbols control files are not sustainable. -no-symbols-control-file diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-foundation-7.5.install opencascade-7.5.1+dfsg1/debian/libocct-foundation-7.5.install --- opencascade-7.4.1+dfsg1/debian/libocct-foundation-7.5.install 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-foundation-7.5.install 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,2 @@ +usr/lib/*/libTKernel.so.* +usr/lib/*/libTKMath.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-foundation-7.5.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-foundation-7.5.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-foundation-7.5.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-foundation-7.5.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,9 @@ +# this package contains a bunch of libraries and can thus not be named properly +package-name-doesnt-match-sonames + +# false positive lack of hardening detected +hardening-no-fortify-functions +# symbols control files are not sustainable. +no-symbols-control-file +# This is lintian bug #966295 +libocct-foundation-7.5: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-foundation-dev.install opencascade-7.5.1+dfsg1/debian/libocct-foundation-dev.install --- opencascade-7.4.1+dfsg1/debian/libocct-foundation-dev.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-foundation-dev.install 2021-02-01 03:05:25.000000000 +0000 @@ -1,68 +1,73 @@ -usr/include/opencascade/BSplCLib.hxx -usr/include/opencascade/BSplCLib.lxx +usr/include/opencascade/Bnd_Array1OfBox2d.hxx +usr/include/opencascade/Bnd_Array1OfBox.hxx +usr/include/opencascade/Bnd_Array1OfSphere.hxx +usr/include/opencascade/Bnd_B2d.hxx +usr/include/opencascade/Bnd_B2f.hxx +usr/include/opencascade/Bnd_B2x.gxx +usr/include/opencascade/Bnd_B2x.lxx +usr/include/opencascade/Bnd_B3d.hxx +usr/include/opencascade/Bnd_B3f.hxx +usr/include/opencascade/Bnd_B3x.gxx +usr/include/opencascade/Bnd_B3x.lxx +usr/include/opencascade/Bnd_BoundSortBox2d.hxx +usr/include/opencascade/Bnd_BoundSortBox.hxx +usr/include/opencascade/Bnd_Box2d.hxx +usr/include/opencascade/Bnd_Box.hxx +usr/include/opencascade/Bnd_HArray1OfBox2d.hxx +usr/include/opencascade/Bnd_HArray1OfBox.hxx +usr/include/opencascade/Bnd_HArray1OfSphere.hxx +usr/include/opencascade/Bnd_OBB.hxx +usr/include/opencascade/Bnd_Range.hxx +usr/include/opencascade/Bnd_SeqOfBox.hxx +usr/include/opencascade/Bnd_Sphere.hxx +usr/include/opencascade/Bnd_Sphere.lxx usr/include/opencascade/BSplCLib_Cache.hxx +usr/include/opencascade/BSplCLib_CacheParams.hxx usr/include/opencascade/BSplCLib_CurveComputation.gxx usr/include/opencascade/BSplCLib_EvaluatorFunction.hxx +usr/include/opencascade/BSplCLib.hxx usr/include/opencascade/BSplCLib_KnotDistribution.hxx +usr/include/opencascade/BSplCLib.lxx usr/include/opencascade/BSplCLib_MultDistribution.hxx -usr/include/opencascade/BSplSLib.hxx -usr/include/opencascade/BSplSLib.lxx usr/include/opencascade/BSplSLib_Cache.hxx usr/include/opencascade/BSplSLib_EvaluatorFunction.hxx +usr/include/opencascade/BSplSLib.hxx +usr/include/opencascade/BSplSLib.lxx usr/include/opencascade/BVH_BinaryTree.hxx usr/include/opencascade/BVH_BinnedBuilder.hxx usr/include/opencascade/BVH_Box.hxx +usr/include/opencascade/BVH_BoxSet.hxx +usr/include/opencascade/BVH_Builder.hxx usr/include/opencascade/BVH_BuildQueue.hxx usr/include/opencascade/BVH_BuildThread.hxx -usr/include/opencascade/BVH_Builder.hxx usr/include/opencascade/BVH_Constants.hxx usr/include/opencascade/BVH_DistanceField.hxx usr/include/opencascade/BVH_DistanceField.lxx +usr/include/opencascade/BVH_Distance.hxx usr/include/opencascade/BVH_Geometry.hxx +usr/include/opencascade/BVH_IndexedBoxSet.hxx usr/include/opencascade/BVH_LinearBuilder.hxx usr/include/opencascade/BVH_Object.hxx usr/include/opencascade/BVH_ObjectSet.hxx -usr/include/opencascade/BVH_PrimitiveSet.hxx +usr/include/opencascade/BVH_PairDistance.hxx usr/include/opencascade/BVH_PrimitiveSet3d.hxx +usr/include/opencascade/BVH_PrimitiveSet.hxx usr/include/opencascade/BVH_Properties.hxx usr/include/opencascade/BVH_QuadTree.hxx usr/include/opencascade/BVH_QueueBuilder.hxx usr/include/opencascade/BVH_QuickSorter.hxx usr/include/opencascade/BVH_RadixSorter.hxx +usr/include/opencascade/BVH_Ray.hxx usr/include/opencascade/BVH_Set.hxx usr/include/opencascade/BVH_Sorter.hxx usr/include/opencascade/BVH_SpatialMedianBuilder.hxx usr/include/opencascade/BVH_SweepPlaneBuilder.hxx +usr/include/opencascade/BVH_Tools.hxx +usr/include/opencascade/BVH_Traverse.hxx +usr/include/opencascade/BVH_Traverse.lxx usr/include/opencascade/BVH_Tree.hxx usr/include/opencascade/BVH_Triangulation.hxx usr/include/opencascade/BVH_Types.hxx -usr/include/opencascade/Bnd_Array1OfBox.hxx -usr/include/opencascade/Bnd_Array1OfBox2d.hxx -usr/include/opencascade/Bnd_Array1OfSphere.hxx -usr/include/opencascade/Bnd_B2d.hxx -usr/include/opencascade/Bnd_B2f.hxx -usr/include/opencascade/Bnd_B2x.gxx -usr/include/opencascade/Bnd_B2x.lxx -usr/include/opencascade/Bnd_B3d.hxx -usr/include/opencascade/Bnd_B3f.hxx -usr/include/opencascade/Bnd_B3x.gxx -usr/include/opencascade/Bnd_B3x.lxx -usr/include/opencascade/Bnd_BoundSortBox.hxx -usr/include/opencascade/Bnd_BoundSortBox2d.hxx -usr/include/opencascade/Bnd_Box.hxx -usr/include/opencascade/Bnd_Box2d.hxx -usr/include/opencascade/Bnd_HArray1OfBox.hxx -usr/include/opencascade/Bnd_HArray1OfBox2d.hxx -usr/include/opencascade/Bnd_HArray1OfSphere.hxx -usr/include/opencascade/Bnd_Range.hxx -usr/include/opencascade/Bnd_SeqOfBox.hxx -usr/include/opencascade/Bnd_Sphere.hxx -usr/include/opencascade/Bnd_Sphere.lxx -usr/include/opencascade/CSLib.hxx -usr/include/opencascade/CSLib_Class2d.hxx -usr/include/opencascade/CSLib_DerivativeStatus.hxx -usr/include/opencascade/CSLib_NormalPolyDef.hxx -usr/include/opencascade/CSLib_NormalStatus.hxx usr/include/opencascade/Convert_CircleToBSplineCurve.hxx usr/include/opencascade/Convert_CompBezierCurves2dToBSplineCurve2d.hxx usr/include/opencascade/Convert_CompBezierCurvesToBSplineCurve.hxx @@ -78,33 +83,19 @@ usr/include/opencascade/Convert_ParabolaToBSplineCurve.hxx usr/include/opencascade/Convert_ParameterisationType.hxx usr/include/opencascade/Convert_PolynomialCosAndSin.hxx -usr/include/opencascade/Convert_SequenceOfArray1OfPoles.hxx usr/include/opencascade/Convert_SequenceOfArray1OfPoles2d.hxx +usr/include/opencascade/Convert_SequenceOfArray1OfPoles.hxx usr/include/opencascade/Convert_SphereToBSplineSurface.hxx usr/include/opencascade/Convert_TorusToBSplineSurface.hxx +usr/include/opencascade/CSLib_Class2d.hxx +usr/include/opencascade/CSLib_DerivativeStatus.hxx +usr/include/opencascade/CSLib.hxx +usr/include/opencascade/CSLib_NormalPolyDef.hxx +usr/include/opencascade/CSLib_NormalStatus.hxx usr/include/opencascade/ElCLib.hxx usr/include/opencascade/ElCLib.lxx usr/include/opencascade/ElSLib.hxx usr/include/opencascade/ElSLib.lxx -usr/include/opencascade/Expr.hxx -usr/include/opencascade/ExprIntrp.hxx -usr/include/opencascade/ExprIntrp.tab.h -usr/include/opencascade/ExprIntrp_Analysis.hxx -usr/include/opencascade/ExprIntrp_GenExp.hxx -usr/include/opencascade/ExprIntrp_GenFct.hxx -usr/include/opencascade/ExprIntrp_GenRel.hxx -usr/include/opencascade/ExprIntrp_Generator.hxx -usr/include/opencascade/ExprIntrp_ListIteratorOfStackOfGeneralExpression.hxx -usr/include/opencascade/ExprIntrp_ListIteratorOfStackOfGeneralFunction.hxx -usr/include/opencascade/ExprIntrp_ListIteratorOfStackOfGeneralRelation.hxx -usr/include/opencascade/ExprIntrp_SequenceOfNamedExpression.hxx -usr/include/opencascade/ExprIntrp_SequenceOfNamedFunction.hxx -usr/include/opencascade/ExprIntrp_StackOfGeneralExpression.hxx -usr/include/opencascade/ExprIntrp_StackOfGeneralFunction.hxx -usr/include/opencascade/ExprIntrp_StackOfGeneralRelation.hxx -usr/include/opencascade/ExprIntrp_SyntaxError.hxx -usr/include/opencascade/ExprIntrp_yaccanal.hxx -usr/include/opencascade/ExprIntrp_yaccintrf.hxx usr/include/opencascade/Expr_Absolute.hxx usr/include/opencascade/Expr_ArcCosine.hxx usr/include/opencascade/Expr_ArcSine.hxx @@ -133,6 +124,25 @@ usr/include/opencascade/Expr_GeneralRelation.hxx usr/include/opencascade/Expr_GreaterThan.hxx usr/include/opencascade/Expr_GreaterThanOrEqual.hxx +usr/include/opencascade/Expr.hxx +usr/include/opencascade/ExprIntrp_Analysis.hxx +usr/include/opencascade/ExprIntrp_Generator.hxx +usr/include/opencascade/ExprIntrp_GenExp.hxx +usr/include/opencascade/ExprIntrp_GenFct.hxx +usr/include/opencascade/ExprIntrp_GenRel.hxx +usr/include/opencascade/ExprIntrp.hxx +usr/include/opencascade/ExprIntrp_ListIteratorOfStackOfGeneralExpression.hxx +usr/include/opencascade/ExprIntrp_ListIteratorOfStackOfGeneralFunction.hxx +usr/include/opencascade/ExprIntrp_ListIteratorOfStackOfGeneralRelation.hxx +usr/include/opencascade/ExprIntrp_SequenceOfNamedExpression.hxx +usr/include/opencascade/ExprIntrp_SequenceOfNamedFunction.hxx +usr/include/opencascade/ExprIntrp_StackOfGeneralExpression.hxx +usr/include/opencascade/ExprIntrp_StackOfGeneralFunction.hxx +usr/include/opencascade/ExprIntrp_StackOfGeneralRelation.hxx +usr/include/opencascade/ExprIntrp_SyntaxError.hxx +usr/include/opencascade/ExprIntrp.tab.h +usr/include/opencascade/ExprIntrp_yaccanal.hxx +usr/include/opencascade/ExprIntrp_yaccintrf.hxx usr/include/opencascade/Expr_InvalidAssignment.hxx usr/include/opencascade/Expr_InvalidFunction.hxx usr/include/opencascade/Expr_InvalidOperand.hxx @@ -155,8 +165,8 @@ usr/include/opencascade/Expr_PolyExpression.lxx usr/include/opencascade/Expr_PolyFunction.hxx usr/include/opencascade/Expr_Product.hxx -usr/include/opencascade/Expr_RUIterator.hxx usr/include/opencascade/Expr_RelationIterator.hxx +usr/include/opencascade/Expr_RUIterator.hxx usr/include/opencascade/Expr_SequenceOfGeneralExpression.hxx usr/include/opencascade/Expr_SequenceOfGeneralRelation.hxx usr/include/opencascade/Expr_Sign.hxx @@ -174,214 +184,377 @@ usr/include/opencascade/Expr_UnaryFunction.hxx usr/include/opencascade/Expr_UnaryMinus.hxx usr/include/opencascade/Expr_UnknownIterator.hxx -usr/include/opencascade/FSD_BStream.hxx +usr/include/opencascade/FSD_Base64Decoder.hxx usr/include/opencascade/FSD_BinaryFile.hxx +usr/include/opencascade/FSD_BStream.hxx usr/include/opencascade/FSD_CmpFile.hxx -usr/include/opencascade/FSD_FStream.hxx -usr/include/opencascade/FSD_File.hxx usr/include/opencascade/FSD_FileHeader.hxx +usr/include/opencascade/FSD_File.hxx +usr/include/opencascade/FSD_FStream.hxx usr/include/opencascade/GeomAbs_BSplKnotDistribution.hxx -usr/include/opencascade/GeomAbs_CurveForm.hxx usr/include/opencascade/GeomAbs_CurveType.hxx usr/include/opencascade/GeomAbs_IsoType.hxx usr/include/opencascade/GeomAbs_JoinType.hxx usr/include/opencascade/GeomAbs_Shape.hxx -usr/include/opencascade/GeomAbs_SurfaceForm.hxx usr/include/opencascade/GeomAbs_SurfaceType.hxx -usr/include/opencascade/GeomAbs_UVSense.hxx -usr/include/opencascade/MMgt_TShared.hxx -usr/include/opencascade/Message.hxx -usr/include/opencascade/Message_Alert.hxx -usr/include/opencascade/Message_Algorithm.hxx -usr/include/opencascade/Message_Algorithm.lxx -usr/include/opencascade/Message_ExecStatus.hxx -usr/include/opencascade/Message_Gravity.hxx -usr/include/opencascade/Message_HArrayOfMsg.hxx -usr/include/opencascade/Message_ListIteratorOfListOfMsg.hxx -usr/include/opencascade/Message_ListOfAlert.hxx -usr/include/opencascade/Message_ListOfMsg.hxx -usr/include/opencascade/Message_Messenger.hxx -usr/include/opencascade/Message_Msg.hxx -usr/include/opencascade/Message_Msg.lxx -usr/include/opencascade/Message_MsgFile.hxx -usr/include/opencascade/Message_Printer.hxx -usr/include/opencascade/Message_PrinterOStream.hxx -usr/include/opencascade/Message_ProgressIndicator.hxx -usr/include/opencascade/Message_ProgressIndicator.lxx -usr/include/opencascade/Message_ProgressScale.hxx -usr/include/opencascade/Message_ProgressScale.lxx -usr/include/opencascade/Message_ProgressSentry.hxx -usr/include/opencascade/Message_ProgressSentry.lxx -usr/include/opencascade/Message_Report.hxx -usr/include/opencascade/Message_SequenceOfPrinters.hxx -usr/include/opencascade/Message_SequenceOfProgressScale.hxx -usr/include/opencascade/Message_Status.hxx -usr/include/opencascade/Message_StatusType.hxx -usr/include/opencascade/NCollection_AccAllocator.hxx -usr/include/opencascade/NCollection_AlignedAllocator.hxx -usr/include/opencascade/NCollection_Array1.hxx -usr/include/opencascade/NCollection_Array2.hxx -usr/include/opencascade/NCollection_BaseAllocator.hxx -usr/include/opencascade/NCollection_BaseList.hxx -usr/include/opencascade/NCollection_BaseMap.hxx -usr/include/opencascade/NCollection_BaseSequence.hxx -usr/include/opencascade/NCollection_BaseVector.hxx -usr/include/opencascade/NCollection_Buffer.hxx -usr/include/opencascade/NCollection_CellFilter.hxx -usr/include/opencascade/NCollection_Comparator.hxx -usr/include/opencascade/NCollection_DataMap.hxx -usr/include/opencascade/NCollection_DefaultHasher.hxx -usr/include/opencascade/NCollection_DefineAlloc.hxx -usr/include/opencascade/NCollection_DefineArray1.hxx -usr/include/opencascade/NCollection_DefineArray2.hxx -usr/include/opencascade/NCollection_DefineDataMap.hxx -usr/include/opencascade/NCollection_DefineDoubleMap.hxx -usr/include/opencascade/NCollection_DefineHArray1.hxx -usr/include/opencascade/NCollection_DefineHArray2.hxx -usr/include/opencascade/NCollection_DefineHSequence.hxx -usr/include/opencascade/NCollection_DefineIndexedDataMap.hxx -usr/include/opencascade/NCollection_DefineIndexedMap.hxx -usr/include/opencascade/NCollection_DefineList.hxx -usr/include/opencascade/NCollection_DefineMap.hxx -usr/include/opencascade/NCollection_DefineSequence.hxx -usr/include/opencascade/NCollection_DefineVector.hxx -usr/include/opencascade/NCollection_DoubleMap.hxx -usr/include/opencascade/NCollection_EBTree.hxx -usr/include/opencascade/NCollection_HArray1.hxx -usr/include/opencascade/NCollection_HArray2.hxx -usr/include/opencascade/NCollection_HSequence.hxx -usr/include/opencascade/NCollection_Haft.h -usr/include/opencascade/NCollection_Handle.hxx -usr/include/opencascade/NCollection_HeapAllocator.hxx -usr/include/opencascade/NCollection_IncAllocator.hxx -usr/include/opencascade/NCollection_IndexedDataMap.hxx -usr/include/opencascade/NCollection_IndexedMap.hxx -usr/include/opencascade/NCollection_Lerp.hxx -usr/include/opencascade/NCollection_List.hxx -usr/include/opencascade/NCollection_ListNode.hxx -usr/include/opencascade/NCollection_LocalArray.hxx -usr/include/opencascade/NCollection_Map.hxx -usr/include/opencascade/NCollection_Mat4.hxx -usr/include/opencascade/NCollection_Sequence.hxx -usr/include/opencascade/NCollection_Shared.hxx -usr/include/opencascade/NCollection_SparseArray.hxx -usr/include/opencascade/NCollection_SparseArrayBase.hxx -usr/include/opencascade/NCollection_StdAllocator.hxx -usr/include/opencascade/NCollection_StlIterator.hxx -usr/include/opencascade/NCollection_String.hxx -usr/include/opencascade/NCollection_TListIterator.hxx -usr/include/opencascade/NCollection_TListNode.hxx -usr/include/opencascade/NCollection_TypeDef.hxx -usr/include/opencascade/NCollection_UBTree.hxx -usr/include/opencascade/NCollection_UBTreeFiller.hxx -usr/include/opencascade/NCollection_UtfIterator.hxx -usr/include/opencascade/NCollection_UtfIterator.lxx -usr/include/opencascade/NCollection_UtfString.hxx -usr/include/opencascade/NCollection_UtfString.lxx -usr/include/opencascade/NCollection_Vec2.hxx -usr/include/opencascade/NCollection_Vec3.hxx -usr/include/opencascade/NCollection_Vec4.hxx -usr/include/opencascade/NCollection_Vector.hxx -usr/include/opencascade/NCollection_WinHeapAllocator.hxx -usr/include/opencascade/OSD.hxx -usr/include/opencascade/OSD_Chronometer.hxx -usr/include/opencascade/OSD_Directory.hxx -usr/include/opencascade/OSD_DirectoryIterator.hxx -usr/include/opencascade/OSD_Disk.hxx -usr/include/opencascade/OSD_Environment.hxx -usr/include/opencascade/OSD_Error.hxx -usr/include/opencascade/OSD_ErrorList.hxx -usr/include/opencascade/OSD_Exception.hxx -usr/include/opencascade/OSD_Exception_ACCESS_VIOLATION.hxx -usr/include/opencascade/OSD_Exception_ARRAY_BOUNDS_EXCEEDED.hxx -usr/include/opencascade/OSD_Exception_CTRL_BREAK.hxx -usr/include/opencascade/OSD_Exception_FLT_DENORMAL_OPERAND.hxx -usr/include/opencascade/OSD_Exception_FLT_DIVIDE_BY_ZERO.hxx -usr/include/opencascade/OSD_Exception_FLT_INEXACT_RESULT.hxx -usr/include/opencascade/OSD_Exception_FLT_INVALID_OPERATION.hxx -usr/include/opencascade/OSD_Exception_FLT_OVERFLOW.hxx -usr/include/opencascade/OSD_Exception_FLT_STACK_CHECK.hxx -usr/include/opencascade/OSD_Exception_FLT_UNDERFLOW.hxx -usr/include/opencascade/OSD_Exception_ILLEGAL_INSTRUCTION.hxx -usr/include/opencascade/OSD_Exception_INT_DIVIDE_BY_ZERO.hxx -usr/include/opencascade/OSD_Exception_INT_OVERFLOW.hxx -usr/include/opencascade/OSD_Exception_INVALID_DISPOSITION.hxx -usr/include/opencascade/OSD_Exception_IN_PAGE_ERROR.hxx -usr/include/opencascade/OSD_Exception_NONCONTINUABLE_EXCEPTION.hxx -usr/include/opencascade/OSD_Exception_PRIV_INSTRUCTION.hxx -usr/include/opencascade/OSD_Exception_STACK_OVERFLOW.hxx -usr/include/opencascade/OSD_Exception_STATUS_NO_MEMORY.hxx -usr/include/opencascade/OSD_File.hxx -usr/include/opencascade/OSD_FileIterator.hxx -usr/include/opencascade/OSD_FileNode.hxx -usr/include/opencascade/OSD_FromWhere.hxx -usr/include/opencascade/OSD_Function.hxx -usr/include/opencascade/OSD_Host.hxx -usr/include/opencascade/OSD_KindFile.hxx -usr/include/opencascade/OSD_LoadMode.hxx -usr/include/opencascade/OSD_LockType.hxx -usr/include/opencascade/OSD_MAllocHook.hxx -usr/include/opencascade/OSD_MemInfo.hxx -usr/include/opencascade/OSD_OEMType.hxx -usr/include/opencascade/OSD_OSDError.hxx -usr/include/opencascade/OSD_OpenFile.hxx -usr/include/opencascade/OSD_OpenMode.hxx -usr/include/opencascade/OSD_PThread.hxx +usr/include/opencascade/gp_Ax1.hxx +usr/include/opencascade/gp_Ax1.lxx +usr/include/opencascade/gp_Ax22d.hxx +usr/include/opencascade/gp_Ax22d.lxx +usr/include/opencascade/gp_Ax2d.hxx +usr/include/opencascade/gp_Ax2d.lxx +usr/include/opencascade/gp_Ax2.hxx +usr/include/opencascade/gp_Ax2.lxx +usr/include/opencascade/gp_Ax3.hxx +usr/include/opencascade/gp_Ax3.lxx +usr/include/opencascade/gp_Circ2d.hxx +usr/include/opencascade/gp_Circ2d.lxx +usr/include/opencascade/gp_Circ.hxx +usr/include/opencascade/gp_Circ.lxx +usr/include/opencascade/gp_Cone.hxx +usr/include/opencascade/gp_Cone.lxx +usr/include/opencascade/gp_Cylinder.hxx +usr/include/opencascade/gp_Cylinder.lxx +usr/include/opencascade/gp_Dir2d.hxx +usr/include/opencascade/gp_Dir2d.lxx +usr/include/opencascade/gp_Dir.hxx +usr/include/opencascade/gp_Dir.lxx +usr/include/opencascade/gp_Elips2d.hxx +usr/include/opencascade/gp_Elips2d.lxx +usr/include/opencascade/gp_Elips.hxx +usr/include/opencascade/gp_Elips.lxx +usr/include/opencascade/gp_EulerSequence.hxx +usr/include/opencascade/gp_GTrsf2d.hxx +usr/include/opencascade/gp_GTrsf2d.lxx +usr/include/opencascade/gp_GTrsf.hxx +usr/include/opencascade/gp_GTrsf.lxx +usr/include/opencascade/gp.hxx +usr/include/opencascade/gp_Hypr2d.hxx +usr/include/opencascade/gp_Hypr2d.lxx +usr/include/opencascade/gp_Hypr.hxx +usr/include/opencascade/gp_Hypr.lxx +usr/include/opencascade/gp_Lin2d.hxx +usr/include/opencascade/gp_Lin2d.lxx +usr/include/opencascade/gp_Lin.hxx +usr/include/opencascade/gp_Lin.lxx +usr/include/opencascade/gp.lxx +usr/include/opencascade/gp_Mat2d.hxx +usr/include/opencascade/gp_Mat2d.lxx +usr/include/opencascade/gp_Mat.hxx +usr/include/opencascade/gp_Mat.lxx +usr/include/opencascade/gp_Parab2d.hxx +usr/include/opencascade/gp_Parab2d.lxx +usr/include/opencascade/gp_Parab.hxx +usr/include/opencascade/gp_Parab.lxx +usr/include/opencascade/gp_Pln.hxx +usr/include/opencascade/gp_Pln.lxx +usr/include/opencascade/gp_Pnt2d.hxx +usr/include/opencascade/gp_Pnt2d.lxx +usr/include/opencascade/gp_Pnt.hxx +usr/include/opencascade/gp_Pnt.lxx +usr/include/opencascade/gp_Quaternion.hxx +usr/include/opencascade/gp_Quaternion.lxx +usr/include/opencascade/gp_QuaternionNLerp.hxx +usr/include/opencascade/gp_QuaternionSLerp.hxx +usr/include/opencascade/gp_Sphere.hxx +usr/include/opencascade/gp_Sphere.lxx +usr/include/opencascade/gp_Torus.hxx +usr/include/opencascade/gp_Torus.lxx +usr/include/opencascade/gp_Trsf2d.hxx +usr/include/opencascade/gp_Trsf2d.lxx +usr/include/opencascade/gp_TrsfForm.hxx +usr/include/opencascade/gp_Trsf.hxx +usr/include/opencascade/gp_Trsf.lxx +usr/include/opencascade/gp_TrsfNLerp.hxx +usr/include/opencascade/gp_Vec2d.hxx +usr/include/opencascade/gp_Vec2d.lxx +usr/include/opencascade/gp_Vec.hxx +usr/include/opencascade/gp_Vec.lxx +usr/include/opencascade/gp_VectorWithNullMagnitude.hxx +usr/include/opencascade/gp_XY.hxx +usr/include/opencascade/gp_XY.lxx +usr/include/opencascade/gp_XYZ.hxx +usr/include/opencascade/gp_XYZ.lxx +usr/include/opencascade/math_Array1OfValueAndWeight.hxx +usr/include/opencascade/math_BFGS.hxx +usr/include/opencascade/math_BFGS.lxx +usr/include/opencascade/math_BissecNewton.hxx +usr/include/opencascade/math_BissecNewton.lxx +usr/include/opencascade/math_BracketedRoot.hxx +usr/include/opencascade/math_BracketedRoot.lxx +usr/include/opencascade/math_BracketMinimum.hxx +usr/include/opencascade/math_BracketMinimum.lxx +usr/include/opencascade/math_BrentMinimum.hxx +usr/include/opencascade/math_BrentMinimum.lxx +usr/include/opencascade/math_BullardGenerator.hxx +usr/include/opencascade/math_ComputeGaussPointsAndWeights.hxx +usr/include/opencascade/math_ComputeKronrodPointsAndWeights.hxx +usr/include/opencascade/math_Crout.hxx +usr/include/opencascade/math_Crout.lxx +usr/include/opencascade/math_DirectPolynomialRoots.hxx +usr/include/opencascade/math_DirectPolynomialRoots.lxx +usr/include/opencascade/math_DoubleTab.hxx +usr/include/opencascade/math_DoubleTab.lxx +usr/include/opencascade/math_EigenValuesSearcher.hxx +usr/include/opencascade/math_FRPR.hxx +usr/include/opencascade/math_FRPR.lxx +usr/include/opencascade/math_FunctionAllRoots.hxx +usr/include/opencascade/math_FunctionAllRoots.lxx +usr/include/opencascade/math_Function.hxx +usr/include/opencascade/math_FunctionRoot.hxx +usr/include/opencascade/math_FunctionRoot.lxx +usr/include/opencascade/math_FunctionRoots.hxx +usr/include/opencascade/math_FunctionRoots.lxx +usr/include/opencascade/math_FunctionSample.hxx +usr/include/opencascade/math_FunctionSet.hxx +usr/include/opencascade/math_FunctionSetRoot.hxx +usr/include/opencascade/math_FunctionSetRoot.lxx +usr/include/opencascade/math_FunctionSetWithDerivatives.hxx +usr/include/opencascade/math_FunctionWithDerivative.hxx +usr/include/opencascade/math_Gauss.hxx +usr/include/opencascade/math_GaussLeastSquare.hxx +usr/include/opencascade/math_GaussLeastSquare.lxx +usr/include/opencascade/math_GaussMultipleIntegration.hxx +usr/include/opencascade/math_GaussMultipleIntegration.lxx +usr/include/opencascade/math_GaussSetIntegration.hxx +usr/include/opencascade/math_GaussSetIntegration.lxx +usr/include/opencascade/math_GaussSingleIntegration.hxx +usr/include/opencascade/math_GaussSingleIntegration.lxx +usr/include/opencascade/math_GlobOptMin.hxx +usr/include/opencascade/math_Householder.hxx +usr/include/opencascade/math_Householder.lxx +usr/include/opencascade/math.hxx +usr/include/opencascade/math_IntegerVector.hxx +usr/include/opencascade/math_Jacobi.hxx +usr/include/opencascade/math_Jacobi.lxx +usr/include/opencascade/math_KronrodSingleIntegration.hxx +usr/include/opencascade/math_KronrodSingleIntegration.lxx +usr/include/opencascade/math_Matrix.hxx +usr/include/opencascade/math_Matrix.lxx +usr/include/opencascade/math_MultipleVarFunction.hxx +usr/include/opencascade/math_MultipleVarFunctionWithGradient.hxx +usr/include/opencascade/math_MultipleVarFunctionWithHessian.hxx +usr/include/opencascade/math_NewtonFunctionRoot.hxx +usr/include/opencascade/math_NewtonFunctionRoot.lxx +usr/include/opencascade/math_NewtonFunctionSetRoot.hxx +usr/include/opencascade/math_NewtonFunctionSetRoot.lxx +usr/include/opencascade/math_NewtonMinimum.hxx +usr/include/opencascade/math_NewtonMinimum.lxx +usr/include/opencascade/math_NotSquare.hxx +usr/include/opencascade/math_Powell.hxx +usr/include/opencascade/math_Powell.lxx +usr/include/opencascade/math_PSO.hxx +usr/include/opencascade/math_PSOParticlesPool.hxx +usr/include/opencascade/math_Recipes.hxx +usr/include/opencascade/math_SingularMatrix.hxx +usr/include/opencascade/math_Status.hxx +usr/include/opencascade/math_SVD.hxx +usr/include/opencascade/math_SVD.lxx +usr/include/opencascade/math_TrigonometricEquationFunction.hxx +usr/include/opencascade/math_TrigonometricFunctionRoots.hxx +usr/include/opencascade/math_TrigonometricFunctionRoots.lxx +usr/include/opencascade/math_Uzawa.hxx +usr/include/opencascade/math_Uzawa.lxx +usr/include/opencascade/math_ValueAndWeight.hxx +usr/include/opencascade/math_Vector.hxx +usr/include/opencascade/Message_AlertExtended.hxx +usr/include/opencascade/Message_Alert.hxx +usr/include/opencascade/Message_Algorithm.hxx +usr/include/opencascade/Message_Algorithm.lxx +usr/include/opencascade/Message_Attribute.hxx +usr/include/opencascade/Message_AttributeMeter.hxx +usr/include/opencascade/Message_AttributeObject.hxx +usr/include/opencascade/Message_AttributeStream.hxx +usr/include/opencascade/Message_CompositeAlerts.hxx +usr/include/opencascade/Message_ConsoleColor.hxx +usr/include/opencascade/Message_ExecStatus.hxx +usr/include/opencascade/Message_Gravity.hxx +usr/include/opencascade/Message_HArrayOfMsg.hxx +usr/include/opencascade/Message.hxx +usr/include/opencascade/Message_Level.hxx +usr/include/opencascade/Message_ListIteratorOfListOfMsg.hxx +usr/include/opencascade/Message_ListOfAlert.hxx +usr/include/opencascade/Message_ListOfMsg.hxx +usr/include/opencascade/Message_Messenger.hxx +usr/include/opencascade/Message_MetricType.hxx +usr/include/opencascade/Message_MsgFile.hxx +usr/include/opencascade/Message_Msg.hxx +usr/include/opencascade/Message_Msg.lxx +usr/include/opencascade/Message_Printer.hxx +usr/include/opencascade/Message_PrinterOStream.hxx +usr/include/opencascade/Message_PrinterSystemLog.hxx +usr/include/opencascade/Message_PrinterToReport.hxx +usr/include/opencascade/Message_ProgressIndicator.hxx +usr/include/opencascade/Message_ProgressRange.hxx +usr/include/opencascade/Message_ProgressScope.hxx +usr/include/opencascade/Message_ProgressSentry.hxx +usr/include/opencascade/Message_Report.hxx +usr/include/opencascade/Message_SequenceOfPrinters.hxx +usr/include/opencascade/Message_Status.hxx +usr/include/opencascade/Message_StatusType.hxx +usr/include/opencascade/MMgt_TShared.hxx +usr/include/opencascade/NCollection_AccAllocator.hxx +usr/include/opencascade/NCollection_AlignedAllocator.hxx +usr/include/opencascade/NCollection_Array1.hxx +usr/include/opencascade/NCollection_Array2.hxx +usr/include/opencascade/NCollection_BaseAllocator.hxx +usr/include/opencascade/NCollection_BaseList.hxx +usr/include/opencascade/NCollection_BaseMap.hxx +usr/include/opencascade/NCollection_BaseSequence.hxx +usr/include/opencascade/NCollection_BaseVector.hxx +usr/include/opencascade/NCollection_Buffer.hxx +usr/include/opencascade/NCollection_CellFilter.hxx +usr/include/opencascade/NCollection_DataMap.hxx +usr/include/opencascade/NCollection_DefaultHasher.hxx +usr/include/opencascade/NCollection_DefineAlloc.hxx +usr/include/opencascade/NCollection_DefineArray1.hxx +usr/include/opencascade/NCollection_DefineArray2.hxx +usr/include/opencascade/NCollection_DefineDataMap.hxx +usr/include/opencascade/NCollection_DefineDoubleMap.hxx +usr/include/opencascade/NCollection_DefineHArray1.hxx +usr/include/opencascade/NCollection_DefineHArray2.hxx +usr/include/opencascade/NCollection_DefineHSequence.hxx +usr/include/opencascade/NCollection_DefineIndexedDataMap.hxx +usr/include/opencascade/NCollection_DefineIndexedMap.hxx +usr/include/opencascade/NCollection_DefineList.hxx +usr/include/opencascade/NCollection_DefineMap.hxx +usr/include/opencascade/NCollection_DefineSequence.hxx +usr/include/opencascade/NCollection_DefineVector.hxx +usr/include/opencascade/NCollection_DoubleMap.hxx +usr/include/opencascade/NCollection_EBTree.hxx +usr/include/opencascade/NCollection_Haft.h +usr/include/opencascade/NCollection_Handle.hxx +usr/include/opencascade/NCollection_HArray1.hxx +usr/include/opencascade/NCollection_HArray2.hxx +usr/include/opencascade/NCollection_HeapAllocator.hxx +usr/include/opencascade/NCollection_HSequence.hxx +usr/include/opencascade/NCollection_IncAllocator.hxx +usr/include/opencascade/NCollection_IndexedDataMap.hxx +usr/include/opencascade/NCollection_IndexedMap.hxx +usr/include/opencascade/NCollection_Lerp.hxx +usr/include/opencascade/NCollection_List.hxx +usr/include/opencascade/NCollection_ListNode.hxx +usr/include/opencascade/NCollection_LocalArray.hxx +usr/include/opencascade/NCollection_Map.hxx +usr/include/opencascade/NCollection_Mat4.hxx +usr/include/opencascade/NCollection_Sequence.hxx +usr/include/opencascade/NCollection_Shared.hxx +usr/include/opencascade/NCollection_SparseArrayBase.hxx +usr/include/opencascade/NCollection_SparseArray.hxx +usr/include/opencascade/NCollection_StdAllocator.hxx +usr/include/opencascade/NCollection_StlIterator.hxx +usr/include/opencascade/NCollection_String.hxx +usr/include/opencascade/NCollection_TListIterator.hxx +usr/include/opencascade/NCollection_TListNode.hxx +usr/include/opencascade/NCollection_TypeDef.hxx +usr/include/opencascade/NCollection_UBTreeFiller.hxx +usr/include/opencascade/NCollection_UBTree.hxx +usr/include/opencascade/NCollection_UtfIterator.hxx +usr/include/opencascade/NCollection_UtfIterator.lxx +usr/include/opencascade/NCollection_UtfString.hxx +usr/include/opencascade/NCollection_UtfString.lxx +usr/include/opencascade/NCollection_Vec2.hxx +usr/include/opencascade/NCollection_Vec3.hxx +usr/include/opencascade/NCollection_Vec4.hxx +usr/include/opencascade/NCollection_Vector.hxx +usr/include/opencascade/NCollection_WinHeapAllocator.hxx +usr/include/opencascade/OSD_Chronometer.hxx +usr/include/opencascade/OSD_Directory.hxx +usr/include/opencascade/OSD_DirectoryIterator.hxx +usr/include/opencascade/OSD_Disk.hxx +usr/include/opencascade/OSD_Environment.hxx +usr/include/opencascade/OSD_Error.hxx +usr/include/opencascade/OSD_ErrorList.hxx +usr/include/opencascade/OSD_Exception_ACCESS_VIOLATION.hxx +usr/include/opencascade/OSD_Exception_ARRAY_BOUNDS_EXCEEDED.hxx +usr/include/opencascade/OSD_Exception_CTRL_BREAK.hxx +usr/include/opencascade/OSD_Exception_FLT_DENORMAL_OPERAND.hxx +usr/include/opencascade/OSD_Exception_FLT_DIVIDE_BY_ZERO.hxx +usr/include/opencascade/OSD_Exception_FLT_INEXACT_RESULT.hxx +usr/include/opencascade/OSD_Exception_FLT_INVALID_OPERATION.hxx +usr/include/opencascade/OSD_Exception_FLT_OVERFLOW.hxx +usr/include/opencascade/OSD_Exception_FLT_STACK_CHECK.hxx +usr/include/opencascade/OSD_Exception_FLT_UNDERFLOW.hxx +usr/include/opencascade/OSD_Exception.hxx +usr/include/opencascade/OSD_Exception_ILLEGAL_INSTRUCTION.hxx +usr/include/opencascade/OSD_Exception_IN_PAGE_ERROR.hxx +usr/include/opencascade/OSD_Exception_INT_DIVIDE_BY_ZERO.hxx +usr/include/opencascade/OSD_Exception_INT_OVERFLOW.hxx +usr/include/opencascade/OSD_Exception_INVALID_DISPOSITION.hxx +usr/include/opencascade/OSD_Exception_NONCONTINUABLE_EXCEPTION.hxx +usr/include/opencascade/OSD_Exception_PRIV_INSTRUCTION.hxx +usr/include/opencascade/OSD_Exception_STACK_OVERFLOW.hxx +usr/include/opencascade/OSD_Exception_STATUS_NO_MEMORY.hxx +usr/include/opencascade/OSD_File.hxx +usr/include/opencascade/OSD_FileIterator.hxx +usr/include/opencascade/OSD_FileNode.hxx +usr/include/opencascade/OSD_FromWhere.hxx +usr/include/opencascade/OSD_Function.hxx +usr/include/opencascade/OSD_Host.hxx +usr/include/opencascade/OSD.hxx +usr/include/opencascade/OSD_KindFile.hxx +usr/include/opencascade/OSD_LoadMode.hxx +usr/include/opencascade/OSD_LockType.hxx +usr/include/opencascade/OSD_MAllocHook.hxx +usr/include/opencascade/OSD_MemInfo.hxx +usr/include/opencascade/OSD_OEMType.hxx +usr/include/opencascade/OSD_OpenFile.hxx +usr/include/opencascade/OSD_OpenMode.hxx +usr/include/opencascade/OSD_OSDError.hxx usr/include/opencascade/OSD_Parallel.hxx usr/include/opencascade/OSD_Path.hxx usr/include/opencascade/OSD_PerfMeter.h usr/include/opencascade/OSD_PerfMeter.hxx usr/include/opencascade/OSD_Process.hxx usr/include/opencascade/OSD_Protection.hxx +usr/include/opencascade/OSD_PThread.hxx +usr/include/opencascade/OSD_SharedLibrary.hxx usr/include/opencascade/OSD_SIGBUS.hxx usr/include/opencascade/OSD_SIGHUP.hxx usr/include/opencascade/OSD_SIGILL.hxx usr/include/opencascade/OSD_SIGINT.hxx usr/include/opencascade/OSD_SIGKILL.hxx +usr/include/opencascade/OSD_Signal.hxx +usr/include/opencascade/OSD_SignalMode.hxx usr/include/opencascade/OSD_SIGQUIT.hxx usr/include/opencascade/OSD_SIGSEGV.hxx usr/include/opencascade/OSD_SIGSYS.hxx -usr/include/opencascade/OSD_SharedLibrary.hxx -usr/include/opencascade/OSD_Signal.hxx usr/include/opencascade/OSD_SingleProtection.hxx usr/include/opencascade/OSD_SysType.hxx -usr/include/opencascade/OSD_Thread.hxx usr/include/opencascade/OSD_ThreadFunction.hxx +usr/include/opencascade/OSD_Thread.hxx +usr/include/opencascade/OSD_ThreadPool.hxx usr/include/opencascade/OSD_Timer.hxx -usr/include/opencascade/OSD_WNT.hxx usr/include/opencascade/OSD_WhoAmI.hxx -usr/include/opencascade/PLib.hxx +usr/include/opencascade/OSD_WNT.hxx usr/include/opencascade/PLib_Base.hxx usr/include/opencascade/PLib_DoubleJacobiPolynomial.hxx usr/include/opencascade/PLib_DoubleJacobiPolynomial.lxx usr/include/opencascade/PLib_HermitJacobi.hxx usr/include/opencascade/PLib_HermitJacobi.lxx +usr/include/opencascade/PLib.hxx usr/include/opencascade/PLib_JacobiPolynomial.hxx usr/include/opencascade/PLib_JacobiPolynomial.lxx -usr/include/opencascade/Plugin.hxx usr/include/opencascade/Plugin_DataMapIteratorOfMapOfFunctions.hxx usr/include/opencascade/Plugin_Failure.hxx +usr/include/opencascade/Plugin.hxx usr/include/opencascade/Plugin_Macro.hxx usr/include/opencascade/Plugin_MapOfFunctions.hxx -usr/include/opencascade/Poly.hxx usr/include/opencascade/Poly_Array1OfTriangle.hxx usr/include/opencascade/Poly_CoherentLink.hxx usr/include/opencascade/Poly_CoherentNode.hxx -usr/include/opencascade/Poly_CoherentTriPtr.hxx usr/include/opencascade/Poly_CoherentTriangle.hxx usr/include/opencascade/Poly_CoherentTriangulation.hxx +usr/include/opencascade/Poly_CoherentTriPtr.hxx usr/include/opencascade/Poly_Connect.hxx usr/include/opencascade/Poly_HArray1OfTriangle.hxx +usr/include/opencascade/Poly.hxx usr/include/opencascade/Poly_ListOfTriangulation.hxx usr/include/opencascade/Poly_MakeLoops.hxx usr/include/opencascade/Poly_Polygon2D.hxx -usr/include/opencascade/Poly_Polygon2D.lxx usr/include/opencascade/Poly_Polygon3D.hxx -usr/include/opencascade/Poly_Polygon3D.lxx usr/include/opencascade/Poly_PolygonOnTriangulation.hxx -usr/include/opencascade/Poly_PolygonOnTriangulation.lxx usr/include/opencascade/Poly_Triangle.hxx -usr/include/opencascade/Poly_Triangle.lxx usr/include/opencascade/Poly_Triangulation.hxx usr/include/opencascade/Precision.hxx usr/include/opencascade/Quantity_AbsorbedDose.hxx @@ -397,18 +570,17 @@ usr/include/opencascade/Quantity_Capacitance.hxx usr/include/opencascade/Quantity_Coefficient.hxx usr/include/opencascade/Quantity_CoefficientOfExpansion.hxx -usr/include/opencascade/Quantity_Color.hxx -usr/include/opencascade/Quantity_ColorDefinitionError.hxx usr/include/opencascade/Quantity_ColorHasher.hxx -usr/include/opencascade/Quantity_ColorRGBA.hxx +usr/include/opencascade/Quantity_Color.hxx usr/include/opencascade/Quantity_ColorRGBAHasher.hxx +usr/include/opencascade/Quantity_ColorRGBA.hxx usr/include/opencascade/Quantity_Concentration.hxx usr/include/opencascade/Quantity_Conductivity.hxx usr/include/opencascade/Quantity_Constant.hxx usr/include/opencascade/Quantity_Consumption.hxx usr/include/opencascade/Quantity_Content.hxx -usr/include/opencascade/Quantity_Date.hxx usr/include/opencascade/Quantity_DateDefinitionError.hxx +usr/include/opencascade/Quantity_Date.hxx usr/include/opencascade/Quantity_Density.hxx usr/include/opencascade/Quantity_DoseEquivalent.hxx usr/include/opencascade/Quantity_ElectricCapacitance.hxx @@ -436,22 +608,22 @@ usr/include/opencascade/Quantity_LuminousFlux.hxx usr/include/opencascade/Quantity_LuminousIntensity.hxx usr/include/opencascade/Quantity_MagneticFieldStrength.hxx -usr/include/opencascade/Quantity_MagneticFlux.hxx usr/include/opencascade/Quantity_MagneticFluxDensity.hxx -usr/include/opencascade/Quantity_Mass.hxx +usr/include/opencascade/Quantity_MagneticFlux.hxx usr/include/opencascade/Quantity_MassFlow.hxx +usr/include/opencascade/Quantity_Mass.hxx usr/include/opencascade/Quantity_MolarConcentration.hxx +usr/include/opencascade/Quantity_Molarity.hxx usr/include/opencascade/Quantity_MolarMass.hxx usr/include/opencascade/Quantity_MolarVolume.hxx -usr/include/opencascade/Quantity_Molarity.hxx usr/include/opencascade/Quantity_MomentOfAForce.hxx usr/include/opencascade/Quantity_MomentOfInertia.hxx usr/include/opencascade/Quantity_Momentum.hxx usr/include/opencascade/Quantity_NameOfColor.hxx usr/include/opencascade/Quantity_Normality.hxx usr/include/opencascade/Quantity_Parameter.hxx -usr/include/opencascade/Quantity_Period.hxx usr/include/opencascade/Quantity_PeriodDefinitionError.hxx +usr/include/opencascade/Quantity_Period.hxx usr/include/opencascade/Quantity_PhysicalQuantity.hxx usr/include/opencascade/Quantity_PlaneAngle.hxx usr/include/opencascade/Quantity_Power.hxx @@ -474,22 +646,18 @@ usr/include/opencascade/Quantity_TypeOfColor.hxx usr/include/opencascade/Quantity_Velocity.hxx usr/include/opencascade/Quantity_Viscosity.hxx -usr/include/opencascade/Quantity_Volume.hxx usr/include/opencascade/Quantity_VolumeFlow.hxx +usr/include/opencascade/Quantity_Volume.hxx usr/include/opencascade/Quantity_Weight.hxx usr/include/opencascade/Quantity_Work.hxx usr/include/opencascade/Resource_ConvertUnicode.hxx -usr/include/opencascade/Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString.hxx -usr/include/opencascade/Resource_DataMapIteratorOfDataMapOfAsciiStringExtendedString.hxx usr/include/opencascade/Resource_DataMapOfAsciiStringAsciiString.hxx usr/include/opencascade/Resource_DataMapOfAsciiStringExtendedString.hxx usr/include/opencascade/Resource_FormatType.hxx usr/include/opencascade/Resource_LexicalCompare.hxx usr/include/opencascade/Resource_Manager.hxx usr/include/opencascade/Resource_NoSuchResource.hxx -usr/include/opencascade/Resource_Shiftjis.h usr/include/opencascade/Resource_Unicode.hxx -usr/include/opencascade/Standard.hxx usr/include/opencascade/Standard_AbortiveTransaction.hxx usr/include/opencascade/Standard_Address.hxx usr/include/opencascade/Standard_ArrayStreamBuffer.hxx @@ -497,10 +665,11 @@ usr/include/opencascade/Standard_Atomic.hxx usr/include/opencascade/Standard_Boolean.hxx usr/include/opencascade/Standard_Byte.hxx -usr/include/opencascade/Standard_CLocaleSentry.hxx -usr/include/opencascade/Standard_CString.hxx usr/include/opencascade/Standard_Character.hxx +usr/include/opencascade/Standard_CLocaleSentry.hxx +usr/include/opencascade/Standard_Condition.hxx usr/include/opencascade/Standard_ConstructionError.hxx +usr/include/opencascade/Standard_CString.hxx usr/include/opencascade/Standard_DefineAlloc.hxx usr/include/opencascade/Standard_DefineException.hxx usr/include/opencascade/Standard_DefineHandle.hxx @@ -508,6 +677,7 @@ usr/include/opencascade/Standard_DimensionMismatch.hxx usr/include/opencascade/Standard_DivideByZero.hxx usr/include/opencascade/Standard_DomainError.hxx +usr/include/opencascade/Standard_Dump.hxx usr/include/opencascade/Standard_ErrorHandler.hxx usr/include/opencascade/Standard_ExtCharacter.hxx usr/include/opencascade/Standard_ExtString.hxx @@ -515,17 +685,19 @@ usr/include/opencascade/Standard_GUID.hxx usr/include/opencascade/Standard_Handle.hxx usr/include/opencascade/Standard_HandlerStatus.hxx -usr/include/opencascade/Standard_IStream.hxx +usr/include/opencascade/Standard.hxx usr/include/opencascade/Standard_ImmutableObject.hxx usr/include/opencascade/Standard_Integer.hxx +usr/include/opencascade/Standard_IStream.hxx usr/include/opencascade/Standard_JmpBuf.hxx usr/include/opencascade/Standard_LicenseError.hxx usr/include/opencascade/Standard_LicenseNotFound.hxx +usr/include/opencascade/Standard_Macro.hxx +usr/include/opencascade/Standard_math.hxx usr/include/opencascade/Standard_MMgrOpt.hxx usr/include/opencascade/Standard_MMgrRaw.hxx usr/include/opencascade/Standard_MMgrRoot.hxx usr/include/opencascade/Standard_MMgrTBBalloc.hxx -usr/include/opencascade/Standard_Macro.hxx usr/include/opencascade/Standard_MultiplyDefined.hxx usr/include/opencascade/Standard_Mutex.hxx usr/include/opencascade/Standard_NegativeValue.hxx @@ -542,38 +714,41 @@ usr/include/opencascade/Standard_PByte.hxx usr/include/opencascade/Standard_PCharacter.hxx usr/include/opencascade/Standard_PErrorHandler.hxx -usr/include/opencascade/Standard_PExtCharacter.hxx usr/include/opencascade/Standard_Persistent.hxx +usr/include/opencascade/Standard_PExtCharacter.hxx usr/include/opencascade/Standard_PrimitiveTypes.hxx usr/include/opencascade/Standard_ProgramError.hxx usr/include/opencascade/Standard_RangeError.hxx +usr/include/opencascade/Standard_ReadBuffer.hxx +usr/include/opencascade/Standard_ReadLineBuffer.hxx usr/include/opencascade/Standard_Real.hxx -usr/include/opencascade/Standard_SStream.hxx usr/include/opencascade/Standard_ShortReal.hxx usr/include/opencascade/Standard_Size.hxx +usr/include/opencascade/Standard_SStream.hxx +usr/include/opencascade/Standard_Std.hxx usr/include/opencascade/Standard_Stream.hxx usr/include/opencascade/Standard_ThreadId.hxx usr/include/opencascade/Standard_Time.hxx usr/include/opencascade/Standard_TooManyUsers.hxx usr/include/opencascade/Standard_Transient.hxx -usr/include/opencascade/Standard_Type.hxx usr/include/opencascade/Standard_TypeDef.hxx +usr/include/opencascade/Standard_Type.hxx usr/include/opencascade/Standard_TypeMismatch.hxx -usr/include/opencascade/Standard_UUID.hxx usr/include/opencascade/Standard_Underflow.hxx -usr/include/opencascade/Standard_Version.hxx -usr/include/opencascade/Standard_math.hxx +usr/include/opencascade/Standard_UUID.hxx usr/include/opencascade/Standard_values.h +usr/include/opencascade/Standard_Version.hxx +usr/include/opencascade/Standard_WarningDisableFunctionCast.hxx +usr/include/opencascade/Standard_WarningsDisable.hxx +usr/include/opencascade/Standard_WarningsRestore.hxx usr/include/opencascade/StdFail_InfiniteSolutions.hxx usr/include/opencascade/StdFail_NotDone.hxx -usr/include/opencascade/StdFail_Undefined.hxx usr/include/opencascade/StdFail_UndefinedDerivative.hxx +usr/include/opencascade/StdFail_Undefined.hxx usr/include/opencascade/StdFail_UndefinedValue.hxx -usr/include/opencascade/Storage.hxx usr/include/opencascade/Storage_ArrayOfCallBack.hxx usr/include/opencascade/Storage_ArrayOfSchema.hxx usr/include/opencascade/Storage_BaseDriver.hxx -usr/include/opencascade/Storage_BaseDriver.lxx usr/include/opencascade/Storage_BucketOfPersistent.hxx usr/include/opencascade/Storage_CallBack.hxx usr/include/opencascade/Storage_Data.hxx @@ -583,21 +758,21 @@ usr/include/opencascade/Storage_Error.hxx usr/include/opencascade/Storage_HArrayOfCallBack.hxx usr/include/opencascade/Storage_HArrayOfSchema.hxx +usr/include/opencascade/Storage_HeaderData.hxx usr/include/opencascade/Storage_HPArray.hxx usr/include/opencascade/Storage_HSeqOfRoot.hxx -usr/include/opencascade/Storage_HeaderData.hxx +usr/include/opencascade/Storage.hxx usr/include/opencascade/Storage_InternalData.hxx usr/include/opencascade/Storage_Macros.hxx usr/include/opencascade/Storage_MapOfCallBack.hxx usr/include/opencascade/Storage_MapOfPers.hxx usr/include/opencascade/Storage_OpenMode.hxx usr/include/opencascade/Storage_PArray.hxx -usr/include/opencascade/Storage_PType.hxx usr/include/opencascade/Storage_Position.hxx -usr/include/opencascade/Storage_Root.hxx +usr/include/opencascade/Storage_PType.hxx usr/include/opencascade/Storage_RootData.hxx +usr/include/opencascade/Storage_Root.hxx usr/include/opencascade/Storage_Schema.hxx -usr/include/opencascade/Storage_Schema.lxx usr/include/opencascade/Storage_SeqOfRoot.hxx usr/include/opencascade/Storage_SolveMode.hxx usr/include/opencascade/Storage_StreamExtCharParityError.hxx @@ -609,151 +784,64 @@ usr/include/opencascade/Storage_StreamWriteError.hxx usr/include/opencascade/Storage_TypeData.hxx usr/include/opencascade/Storage_TypedCallBack.hxx -usr/include/opencascade/TColStd_Array1OfAsciiString.hxx -usr/include/opencascade/TColStd_Array1OfBoolean.hxx -usr/include/opencascade/TColStd_Array1OfByte.hxx -usr/include/opencascade/TColStd_Array1OfCharacter.hxx -usr/include/opencascade/TColStd_Array1OfExtendedString.hxx -usr/include/opencascade/TColStd_Array1OfInteger.hxx -usr/include/opencascade/TColStd_Array1OfListOfInteger.hxx -usr/include/opencascade/TColStd_Array1OfReal.hxx -usr/include/opencascade/TColStd_Array1OfTransient.hxx -usr/include/opencascade/TColStd_Array2OfBoolean.hxx -usr/include/opencascade/TColStd_Array2OfCharacter.hxx -usr/include/opencascade/TColStd_Array2OfInteger.hxx -usr/include/opencascade/TColStd_Array2OfReal.hxx -usr/include/opencascade/TColStd_Array2OfTransient.hxx -usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfAsciiStringInteger.hxx -usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfIntegerInteger.hxx -usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfIntegerListOfInteger.hxx -usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfIntegerReal.hxx -usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfIntegerTransient.hxx -usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfStringInteger.hxx -usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfTransientTransient.hxx -usr/include/opencascade/TColStd_DataMapOfAsciiStringInteger.hxx -usr/include/opencascade/TColStd_DataMapOfIntegerInteger.hxx -usr/include/opencascade/TColStd_DataMapOfIntegerListOfInteger.hxx -usr/include/opencascade/TColStd_DataMapOfIntegerReal.hxx -usr/include/opencascade/TColStd_DataMapOfIntegerTransient.hxx -usr/include/opencascade/TColStd_DataMapOfStringInteger.hxx -usr/include/opencascade/TColStd_DataMapOfTransientTransient.hxx -usr/include/opencascade/TColStd_HArray1OfAsciiString.hxx -usr/include/opencascade/TColStd_HArray1OfBoolean.hxx -usr/include/opencascade/TColStd_HArray1OfByte.hxx -usr/include/opencascade/TColStd_HArray1OfCharacter.hxx -usr/include/opencascade/TColStd_HArray1OfExtendedString.hxx -usr/include/opencascade/TColStd_HArray1OfInteger.hxx -usr/include/opencascade/TColStd_HArray1OfListOfInteger.hxx -usr/include/opencascade/TColStd_HArray1OfReal.hxx -usr/include/opencascade/TColStd_HArray1OfTransient.hxx -usr/include/opencascade/TColStd_HArray2OfBoolean.hxx -usr/include/opencascade/TColStd_HArray2OfCharacter.hxx -usr/include/opencascade/TColStd_HArray2OfInteger.hxx -usr/include/opencascade/TColStd_HArray2OfReal.hxx -usr/include/opencascade/TColStd_HArray2OfTransient.hxx -usr/include/opencascade/TColStd_HPackedMapOfInteger.hxx -usr/include/opencascade/TColStd_HPackedMapOfInteger.lxx -usr/include/opencascade/TColStd_HSequenceOfAsciiString.hxx -usr/include/opencascade/TColStd_HSequenceOfExtendedString.hxx -usr/include/opencascade/TColStd_HSequenceOfHAsciiString.hxx -usr/include/opencascade/TColStd_HSequenceOfHExtendedString.hxx -usr/include/opencascade/TColStd_HSequenceOfInteger.hxx -usr/include/opencascade/TColStd_HSequenceOfReal.hxx -usr/include/opencascade/TColStd_HSequenceOfTransient.hxx -usr/include/opencascade/TColStd_IndexedDataMapOfStringString.hxx -usr/include/opencascade/TColStd_IndexedDataMapOfTransientTransient.hxx -usr/include/opencascade/TColStd_IndexedMapOfInteger.hxx -usr/include/opencascade/TColStd_IndexedMapOfReal.hxx -usr/include/opencascade/TColStd_IndexedMapOfTransient.hxx -usr/include/opencascade/TColStd_ListIteratorOfListOfAsciiString.hxx -usr/include/opencascade/TColStd_ListIteratorOfListOfInteger.hxx -usr/include/opencascade/TColStd_ListIteratorOfListOfReal.hxx -usr/include/opencascade/TColStd_ListIteratorOfListOfTransient.hxx -usr/include/opencascade/TColStd_ListOfAsciiString.hxx -usr/include/opencascade/TColStd_ListOfInteger.hxx -usr/include/opencascade/TColStd_ListOfReal.hxx -usr/include/opencascade/TColStd_ListOfTransient.hxx -usr/include/opencascade/TColStd_MapIntegerHasher.hxx -usr/include/opencascade/TColStd_MapIteratorOfMapOfAsciiString.hxx -usr/include/opencascade/TColStd_MapIteratorOfMapOfInteger.hxx -usr/include/opencascade/TColStd_MapIteratorOfMapOfReal.hxx -usr/include/opencascade/TColStd_MapIteratorOfMapOfTransient.hxx -usr/include/opencascade/TColStd_MapIteratorOfPackedMapOfInteger.hxx -usr/include/opencascade/TColStd_MapOfAsciiString.hxx -usr/include/opencascade/TColStd_MapOfInteger.hxx -usr/include/opencascade/TColStd_MapOfReal.hxx -usr/include/opencascade/TColStd_MapOfTransient.hxx -usr/include/opencascade/TColStd_MapRealHasher.hxx -usr/include/opencascade/TColStd_MapTransientHasher.hxx -usr/include/opencascade/TColStd_PackedMapOfInteger.hxx -usr/include/opencascade/TColStd_SequenceOfAddress.hxx -usr/include/opencascade/TColStd_SequenceOfAsciiString.hxx -usr/include/opencascade/TColStd_SequenceOfBoolean.hxx -usr/include/opencascade/TColStd_SequenceOfExtendedString.hxx -usr/include/opencascade/TColStd_SequenceOfHAsciiString.hxx -usr/include/opencascade/TColStd_SequenceOfHExtendedString.hxx -usr/include/opencascade/TColStd_SequenceOfInteger.hxx -usr/include/opencascade/TColStd_SequenceOfReal.hxx -usr/include/opencascade/TColStd_SequenceOfTransient.hxx usr/include/opencascade/TColgp_Array1OfCirc2d.hxx -usr/include/opencascade/TColgp_Array1OfDir.hxx usr/include/opencascade/TColgp_Array1OfDir2d.hxx +usr/include/opencascade/TColgp_Array1OfDir.hxx usr/include/opencascade/TColgp_Array1OfLin2d.hxx -usr/include/opencascade/TColgp_Array1OfPnt.hxx usr/include/opencascade/TColgp_Array1OfPnt2d.hxx -usr/include/opencascade/TColgp_Array1OfVec.hxx +usr/include/opencascade/TColgp_Array1OfPnt.hxx usr/include/opencascade/TColgp_Array1OfVec2d.hxx +usr/include/opencascade/TColgp_Array1OfVec.hxx usr/include/opencascade/TColgp_Array1OfXY.hxx usr/include/opencascade/TColgp_Array1OfXYZ.hxx usr/include/opencascade/TColgp_Array2OfCirc2d.hxx -usr/include/opencascade/TColgp_Array2OfDir.hxx usr/include/opencascade/TColgp_Array2OfDir2d.hxx +usr/include/opencascade/TColgp_Array2OfDir.hxx usr/include/opencascade/TColgp_Array2OfLin2d.hxx -usr/include/opencascade/TColgp_Array2OfPnt.hxx usr/include/opencascade/TColgp_Array2OfPnt2d.hxx -usr/include/opencascade/TColgp_Array2OfVec.hxx +usr/include/opencascade/TColgp_Array2OfPnt.hxx usr/include/opencascade/TColgp_Array2OfVec2d.hxx +usr/include/opencascade/TColgp_Array2OfVec.hxx usr/include/opencascade/TColgp_Array2OfXY.hxx usr/include/opencascade/TColgp_Array2OfXYZ.hxx usr/include/opencascade/TColgp_HArray1OfCirc2d.hxx -usr/include/opencascade/TColgp_HArray1OfDir.hxx usr/include/opencascade/TColgp_HArray1OfDir2d.hxx +usr/include/opencascade/TColgp_HArray1OfDir.hxx usr/include/opencascade/TColgp_HArray1OfLin2d.hxx -usr/include/opencascade/TColgp_HArray1OfPnt.hxx usr/include/opencascade/TColgp_HArray1OfPnt2d.hxx -usr/include/opencascade/TColgp_HArray1OfVec.hxx +usr/include/opencascade/TColgp_HArray1OfPnt.hxx usr/include/opencascade/TColgp_HArray1OfVec2d.hxx +usr/include/opencascade/TColgp_HArray1OfVec.hxx usr/include/opencascade/TColgp_HArray1OfXY.hxx usr/include/opencascade/TColgp_HArray1OfXYZ.hxx usr/include/opencascade/TColgp_HArray2OfCirc2d.hxx -usr/include/opencascade/TColgp_HArray2OfDir.hxx usr/include/opencascade/TColgp_HArray2OfDir2d.hxx +usr/include/opencascade/TColgp_HArray2OfDir.hxx usr/include/opencascade/TColgp_HArray2OfLin2d.hxx -usr/include/opencascade/TColgp_HArray2OfPnt.hxx usr/include/opencascade/TColgp_HArray2OfPnt2d.hxx -usr/include/opencascade/TColgp_HArray2OfVec.hxx +usr/include/opencascade/TColgp_HArray2OfPnt.hxx usr/include/opencascade/TColgp_HArray2OfVec2d.hxx +usr/include/opencascade/TColgp_HArray2OfVec.hxx usr/include/opencascade/TColgp_HArray2OfXY.hxx usr/include/opencascade/TColgp_HArray2OfXYZ.hxx -usr/include/opencascade/TColgp_HSequenceOfDir.hxx usr/include/opencascade/TColgp_HSequenceOfDir2d.hxx -usr/include/opencascade/TColgp_HSequenceOfPnt.hxx +usr/include/opencascade/TColgp_HSequenceOfDir.hxx usr/include/opencascade/TColgp_HSequenceOfPnt2d.hxx -usr/include/opencascade/TColgp_HSequenceOfVec.hxx +usr/include/opencascade/TColgp_HSequenceOfPnt.hxx usr/include/opencascade/TColgp_HSequenceOfVec2d.hxx +usr/include/opencascade/TColgp_HSequenceOfVec.hxx usr/include/opencascade/TColgp_HSequenceOfXY.hxx usr/include/opencascade/TColgp_HSequenceOfXYZ.hxx usr/include/opencascade/TColgp_SequenceOfArray1OfPnt2d.hxx usr/include/opencascade/TColgp_SequenceOfAx1.hxx -usr/include/opencascade/TColgp_SequenceOfDir.hxx usr/include/opencascade/TColgp_SequenceOfDir2d.hxx -usr/include/opencascade/TColgp_SequenceOfPnt.hxx +usr/include/opencascade/TColgp_SequenceOfDir.hxx usr/include/opencascade/TColgp_SequenceOfPnt2d.hxx -usr/include/opencascade/TColgp_SequenceOfVec.hxx +usr/include/opencascade/TColgp_SequenceOfPnt.hxx usr/include/opencascade/TColgp_SequenceOfVec2d.hxx +usr/include/opencascade/TColgp_SequenceOfVec.hxx usr/include/opencascade/TColgp_SequenceOfXY.hxx usr/include/opencascade/TColgp_SequenceOfXYZ.hxx -usr/include/opencascade/TCollection.hxx usr/include/opencascade/TCollection_Array1.gxx usr/include/opencascade/TCollection_Array1.lxx usr/include/opencascade/TCollection_Array2.gxx @@ -763,9 +851,9 @@ usr/include/opencascade/TCollection_BaseSequence.hxx usr/include/opencascade/TCollection_BaseSequence.lxx usr/include/opencascade/TCollection_BasicMap.hxx -usr/include/opencascade/TCollection_BasicMap.lxx usr/include/opencascade/TCollection_BasicMapIterator.hxx usr/include/opencascade/TCollection_BasicMapIterator.lxx +usr/include/opencascade/TCollection_BasicMap.lxx usr/include/opencascade/TCollection_DataMap.gxx usr/include/opencascade/TCollection_DataMapIterator.gxx usr/include/opencascade/TCollection_DataMapNode.gxx @@ -784,6 +872,7 @@ usr/include/opencascade/TCollection_HExtendedString.hxx usr/include/opencascade/TCollection_HSequence.gxx usr/include/opencascade/TCollection_HSequence.lxx +usr/include/opencascade/TCollection.hxx usr/include/opencascade/TCollection_IndexedDataMap.gxx usr/include/opencascade/TCollection_IndexedDataMapNode.gxx usr/include/opencascade/TCollection_IndexedDataMapNode.lxx @@ -791,9 +880,9 @@ usr/include/opencascade/TCollection_IndexedMapNode.gxx usr/include/opencascade/TCollection_IndexedMapNode.lxx usr/include/opencascade/TCollection_List.gxx -usr/include/opencascade/TCollection_List.lxx usr/include/opencascade/TCollection_ListIterator.gxx usr/include/opencascade/TCollection_ListIterator.lxx +usr/include/opencascade/TCollection_List.lxx usr/include/opencascade/TCollection_ListNode.gxx usr/include/opencascade/TCollection_ListNode.lxx usr/include/opencascade/TCollection_Map.gxx @@ -812,14 +901,93 @@ usr/include/opencascade/TCollection_Side.hxx usr/include/opencascade/TCollection_StdMapNode.gxx usr/include/opencascade/TCollection_StdMapNode.lxx -usr/include/opencascade/TShort_Array1OfShortReal.hxx -usr/include/opencascade/TShort_Array2OfShortReal.hxx -usr/include/opencascade/TShort_HArray1OfShortReal.hxx -usr/include/opencascade/TShort_HArray2OfShortReal.hxx -usr/include/opencascade/TShort_HSequenceOfShortReal.hxx -usr/include/opencascade/TShort_SequenceOfShortReal.hxx +usr/include/opencascade/TColStd_Array1OfAsciiString.hxx +usr/include/opencascade/TColStd_Array1OfBoolean.hxx +usr/include/opencascade/TColStd_Array1OfByte.hxx +usr/include/opencascade/TColStd_Array1OfCharacter.hxx +usr/include/opencascade/TColStd_Array1OfExtendedString.hxx +usr/include/opencascade/TColStd_Array1OfInteger.hxx +usr/include/opencascade/TColStd_Array1OfListOfInteger.hxx +usr/include/opencascade/TColStd_Array1OfReal.hxx +usr/include/opencascade/TColStd_Array1OfTransient.hxx +usr/include/opencascade/TColStd_Array2OfBoolean.hxx +usr/include/opencascade/TColStd_Array2OfCharacter.hxx +usr/include/opencascade/TColStd_Array2OfInteger.hxx +usr/include/opencascade/TColStd_Array2OfReal.hxx +usr/include/opencascade/TColStd_Array2OfTransient.hxx +usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfAsciiStringInteger.hxx +usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfIntegerInteger.hxx +usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfIntegerListOfInteger.hxx +usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfIntegerReal.hxx +usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfIntegerTransient.hxx +usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfStringInteger.hxx +usr/include/opencascade/TColStd_DataMapIteratorOfDataMapOfTransientTransient.hxx +usr/include/opencascade/TColStd_DataMapOfAsciiStringInteger.hxx +usr/include/opencascade/TColStd_DataMapOfIntegerInteger.hxx +usr/include/opencascade/TColStd_DataMapOfIntegerListOfInteger.hxx +usr/include/opencascade/TColStd_DataMapOfIntegerReal.hxx +usr/include/opencascade/TColStd_DataMapOfIntegerTransient.hxx +usr/include/opencascade/TColStd_DataMapOfStringInteger.hxx +usr/include/opencascade/TColStd_DataMapOfTransientTransient.hxx +usr/include/opencascade/TColStd_HArray1OfAsciiString.hxx +usr/include/opencascade/TColStd_HArray1OfBoolean.hxx +usr/include/opencascade/TColStd_HArray1OfByte.hxx +usr/include/opencascade/TColStd_HArray1OfCharacter.hxx +usr/include/opencascade/TColStd_HArray1OfExtendedString.hxx +usr/include/opencascade/TColStd_HArray1OfInteger.hxx +usr/include/opencascade/TColStd_HArray1OfListOfInteger.hxx +usr/include/opencascade/TColStd_HArray1OfReal.hxx +usr/include/opencascade/TColStd_HArray1OfTransient.hxx +usr/include/opencascade/TColStd_HArray2OfBoolean.hxx +usr/include/opencascade/TColStd_HArray2OfCharacter.hxx +usr/include/opencascade/TColStd_HArray2OfInteger.hxx +usr/include/opencascade/TColStd_HArray2OfReal.hxx +usr/include/opencascade/TColStd_HArray2OfTransient.hxx +usr/include/opencascade/TColStd_HPackedMapOfInteger.hxx +usr/include/opencascade/TColStd_HPackedMapOfInteger.lxx +usr/include/opencascade/TColStd_HSequenceOfAsciiString.hxx +usr/include/opencascade/TColStd_HSequenceOfExtendedString.hxx +usr/include/opencascade/TColStd_HSequenceOfHAsciiString.hxx +usr/include/opencascade/TColStd_HSequenceOfHExtendedString.hxx +usr/include/opencascade/TColStd_HSequenceOfInteger.hxx +usr/include/opencascade/TColStd_HSequenceOfReal.hxx +usr/include/opencascade/TColStd_HSequenceOfTransient.hxx +usr/include/opencascade/TColStd_IndexedDataMapOfStringString.hxx +usr/include/opencascade/TColStd_IndexedDataMapOfTransientTransient.hxx +usr/include/opencascade/TColStd_IndexedMapOfInteger.hxx +usr/include/opencascade/TColStd_IndexedMapOfReal.hxx +usr/include/opencascade/TColStd_IndexedMapOfTransient.hxx +usr/include/opencascade/TColStd_ListIteratorOfListOfAsciiString.hxx +usr/include/opencascade/TColStd_ListIteratorOfListOfInteger.hxx +usr/include/opencascade/TColStd_ListIteratorOfListOfReal.hxx +usr/include/opencascade/TColStd_ListIteratorOfListOfTransient.hxx +usr/include/opencascade/TColStd_ListOfAsciiString.hxx +usr/include/opencascade/TColStd_ListOfInteger.hxx +usr/include/opencascade/TColStd_ListOfReal.hxx +usr/include/opencascade/TColStd_ListOfTransient.hxx +usr/include/opencascade/TColStd_MapIntegerHasher.hxx +usr/include/opencascade/TColStd_MapIteratorOfMapOfAsciiString.hxx +usr/include/opencascade/TColStd_MapIteratorOfMapOfInteger.hxx +usr/include/opencascade/TColStd_MapIteratorOfMapOfReal.hxx +usr/include/opencascade/TColStd_MapIteratorOfMapOfTransient.hxx +usr/include/opencascade/TColStd_MapIteratorOfPackedMapOfInteger.hxx +usr/include/opencascade/TColStd_MapOfAsciiString.hxx +usr/include/opencascade/TColStd_MapOfInteger.hxx +usr/include/opencascade/TColStd_MapOfReal.hxx +usr/include/opencascade/TColStd_MapOfTransient.hxx +usr/include/opencascade/TColStd_MapRealHasher.hxx +usr/include/opencascade/TColStd_MapTransientHasher.hxx +usr/include/opencascade/TColStd_PackedMapOfInteger.hxx +usr/include/opencascade/TColStd_SequenceOfAddress.hxx +usr/include/opencascade/TColStd_SequenceOfAsciiString.hxx +usr/include/opencascade/TColStd_SequenceOfBoolean.hxx +usr/include/opencascade/TColStd_SequenceOfExtendedString.hxx +usr/include/opencascade/TColStd_SequenceOfHAsciiString.hxx +usr/include/opencascade/TColStd_SequenceOfHExtendedString.hxx +usr/include/opencascade/TColStd_SequenceOfInteger.hxx +usr/include/opencascade/TColStd_SequenceOfReal.hxx +usr/include/opencascade/TColStd_SequenceOfTransient.hxx usr/include/opencascade/TopLoc_Datum3D.hxx -usr/include/opencascade/TopLoc_Datum3D.lxx usr/include/opencascade/TopLoc_IndexedMapOfLocation.hxx usr/include/opencascade/TopLoc_ItemLocation.hxx usr/include/opencascade/TopLoc_Location.hxx @@ -830,12 +998,18 @@ usr/include/opencascade/TopLoc_SListNodeOfItemLocation.hxx usr/include/opencascade/TopLoc_SListNodeOfItemLocation.lxx usr/include/opencascade/TopLoc_SListOfItemLocation.hxx -usr/include/opencascade/Units.hxx +usr/include/opencascade/TShort_Array1OfShortReal.hxx +usr/include/opencascade/TShort_Array2OfShortReal.hxx +usr/include/opencascade/TShort_HArray1OfShortReal.hxx +usr/include/opencascade/TShort_HArray2OfShortReal.hxx +usr/include/opencascade/TShort_HSequenceOfShortReal.hxx +usr/include/opencascade/TShort_SequenceOfShortReal.hxx usr/include/opencascade/UnitsAPI.hxx usr/include/opencascade/UnitsAPI_SystemUnits.hxx usr/include/opencascade/Units_Dimensions.hxx usr/include/opencascade/Units_Dimensions.lxx usr/include/opencascade/Units_Explorer.hxx +usr/include/opencascade/Units.hxx usr/include/opencascade/Units_Lexicon.hxx usr/include/opencascade/Units_Lexicon.lxx usr/include/opencascade/Units_MathSentence.hxx @@ -857,197 +1031,14 @@ usr/include/opencascade/Units_TokensSequence.hxx usr/include/opencascade/Units_Unit.hxx usr/include/opencascade/Units_Unit.lxx -usr/include/opencascade/Units_UnitSentence.hxx usr/include/opencascade/Units_UnitsDictionary.hxx usr/include/opencascade/Units_UnitsDictionary.lxx +usr/include/opencascade/Units_UnitSentence.hxx usr/include/opencascade/Units_UnitsLexicon.hxx usr/include/opencascade/Units_UnitsLexicon.lxx usr/include/opencascade/Units_UnitsSequence.hxx usr/include/opencascade/Units_UnitsSystem.hxx usr/include/opencascade/Units_UtsSequence.hxx -usr/include/opencascade/gp.hxx -usr/include/opencascade/gp.lxx -usr/include/opencascade/gp_Ax1.hxx -usr/include/opencascade/gp_Ax1.lxx -usr/include/opencascade/gp_Ax2.hxx -usr/include/opencascade/gp_Ax2.lxx -usr/include/opencascade/gp_Ax22d.hxx -usr/include/opencascade/gp_Ax22d.lxx -usr/include/opencascade/gp_Ax2d.hxx -usr/include/opencascade/gp_Ax2d.lxx -usr/include/opencascade/gp_Ax3.hxx -usr/include/opencascade/gp_Ax3.lxx -usr/include/opencascade/gp_Circ.hxx -usr/include/opencascade/gp_Circ.lxx -usr/include/opencascade/gp_Circ2d.hxx -usr/include/opencascade/gp_Circ2d.lxx -usr/include/opencascade/gp_Cone.hxx -usr/include/opencascade/gp_Cone.lxx -usr/include/opencascade/gp_Cylinder.hxx -usr/include/opencascade/gp_Cylinder.lxx -usr/include/opencascade/gp_Dir.hxx -usr/include/opencascade/gp_Dir.lxx -usr/include/opencascade/gp_Dir2d.hxx -usr/include/opencascade/gp_Dir2d.lxx -usr/include/opencascade/gp_Elips.hxx -usr/include/opencascade/gp_Elips.lxx -usr/include/opencascade/gp_Elips2d.hxx -usr/include/opencascade/gp_Elips2d.lxx -usr/include/opencascade/gp_EulerSequence.hxx -usr/include/opencascade/gp_GTrsf.hxx -usr/include/opencascade/gp_GTrsf.lxx -usr/include/opencascade/gp_GTrsf2d.hxx -usr/include/opencascade/gp_GTrsf2d.lxx -usr/include/opencascade/gp_Hypr.hxx -usr/include/opencascade/gp_Hypr.lxx -usr/include/opencascade/gp_Hypr2d.hxx -usr/include/opencascade/gp_Hypr2d.lxx -usr/include/opencascade/gp_Lin.hxx -usr/include/opencascade/gp_Lin.lxx -usr/include/opencascade/gp_Lin2d.hxx -usr/include/opencascade/gp_Lin2d.lxx -usr/include/opencascade/gp_Mat.hxx -usr/include/opencascade/gp_Mat.lxx -usr/include/opencascade/gp_Mat2d.hxx -usr/include/opencascade/gp_Mat2d.lxx -usr/include/opencascade/gp_Parab.hxx -usr/include/opencascade/gp_Parab.lxx -usr/include/opencascade/gp_Parab2d.hxx -usr/include/opencascade/gp_Parab2d.lxx -usr/include/opencascade/gp_Pln.hxx -usr/include/opencascade/gp_Pln.lxx -usr/include/opencascade/gp_Pnt.hxx -usr/include/opencascade/gp_Pnt.lxx -usr/include/opencascade/gp_Pnt2d.hxx -usr/include/opencascade/gp_Pnt2d.lxx -usr/include/opencascade/gp_Quaternion.hxx -usr/include/opencascade/gp_Quaternion.lxx -usr/include/opencascade/gp_QuaternionNLerp.hxx -usr/include/opencascade/gp_QuaternionSLerp.hxx -usr/include/opencascade/gp_Sphere.hxx -usr/include/opencascade/gp_Sphere.lxx -usr/include/opencascade/gp_Torus.hxx -usr/include/opencascade/gp_Torus.lxx -usr/include/opencascade/gp_Trsf.hxx -usr/include/opencascade/gp_Trsf.lxx -usr/include/opencascade/gp_Trsf2d.hxx -usr/include/opencascade/gp_Trsf2d.lxx -usr/include/opencascade/gp_TrsfForm.hxx -usr/include/opencascade/gp_TrsfNLerp.hxx -usr/include/opencascade/gp_Vec.hxx -usr/include/opencascade/gp_Vec.lxx -usr/include/opencascade/gp_Vec2d.hxx -usr/include/opencascade/gp_Vec2d.lxx -usr/include/opencascade/gp_VectorWithNullMagnitude.hxx -usr/include/opencascade/gp_XY.hxx -usr/include/opencascade/gp_XY.lxx -usr/include/opencascade/gp_XYZ.hxx -usr/include/opencascade/gp_XYZ.lxx -usr/include/opencascade/math.hxx -usr/include/opencascade/math_Array1OfValueAndWeight.hxx -usr/include/opencascade/math_BFGS.hxx -usr/include/opencascade/math_BFGS.lxx -usr/include/opencascade/math_BissecNewton.hxx -usr/include/opencascade/math_BissecNewton.lxx -usr/include/opencascade/math_BracketMinimum.hxx -usr/include/opencascade/math_BracketMinimum.lxx -usr/include/opencascade/math_BracketedRoot.hxx -usr/include/opencascade/math_BracketedRoot.lxx -usr/include/opencascade/math_BrentMinimum.hxx -usr/include/opencascade/math_BrentMinimum.lxx -usr/include/opencascade/math_BullardGenerator.hxx -usr/include/opencascade/math_ComputeGaussPointsAndWeights.hxx -usr/include/opencascade/math_ComputeKronrodPointsAndWeights.hxx -usr/include/opencascade/math_Crout.hxx -usr/include/opencascade/math_Crout.lxx -usr/include/opencascade/math_DirectPolynomialRoots.hxx -usr/include/opencascade/math_DirectPolynomialRoots.lxx -usr/include/opencascade/math_DoubleTab.hxx -usr/include/opencascade/math_DoubleTab.lxx -usr/include/opencascade/math_EigenValuesSearcher.hxx -usr/include/opencascade/math_FRPR.hxx -usr/include/opencascade/math_FRPR.lxx -usr/include/opencascade/math_Function.hxx -usr/include/opencascade/math_FunctionAllRoots.hxx -usr/include/opencascade/math_FunctionAllRoots.lxx -usr/include/opencascade/math_FunctionRoot.hxx -usr/include/opencascade/math_FunctionRoot.lxx -usr/include/opencascade/math_FunctionRoots.hxx -usr/include/opencascade/math_FunctionRoots.lxx -usr/include/opencascade/math_FunctionSample.hxx -usr/include/opencascade/math_FunctionSet.hxx -usr/include/opencascade/math_FunctionSetRoot.hxx -usr/include/opencascade/math_FunctionSetRoot.lxx -usr/include/opencascade/math_FunctionSetWithDerivatives.hxx -usr/include/opencascade/math_FunctionWithDerivative.hxx -usr/include/opencascade/math_Gauss.hxx -usr/include/opencascade/math_GaussLeastSquare.hxx -usr/include/opencascade/math_GaussLeastSquare.lxx -usr/include/opencascade/math_GaussMultipleIntegration.hxx -usr/include/opencascade/math_GaussMultipleIntegration.lxx -usr/include/opencascade/math_GaussPoints.hxx -usr/include/opencascade/math_GaussSetIntegration.hxx -usr/include/opencascade/math_GaussSetIntegration.lxx -usr/include/opencascade/math_GaussSingleIntegration.hxx -usr/include/opencascade/math_GaussSingleIntegration.lxx -usr/include/opencascade/math_GlobOptMin.hxx -usr/include/opencascade/math_Householder.hxx -usr/include/opencascade/math_Householder.lxx -usr/include/opencascade/math_IntegerVector.hxx -usr/include/opencascade/math_Jacobi.hxx -usr/include/opencascade/math_Jacobi.lxx -usr/include/opencascade/math_KronrodSingleIntegration.hxx -usr/include/opencascade/math_KronrodSingleIntegration.lxx -usr/include/opencascade/math_Matrix.hxx -usr/include/opencascade/math_Matrix.lxx -usr/include/opencascade/math_MultipleVarFunction.hxx -usr/include/opencascade/math_MultipleVarFunctionWithGradient.hxx -usr/include/opencascade/math_MultipleVarFunctionWithHessian.hxx -usr/include/opencascade/math_NewtonFunctionRoot.hxx -usr/include/opencascade/math_NewtonFunctionRoot.lxx -usr/include/opencascade/math_NewtonFunctionSetRoot.hxx -usr/include/opencascade/math_NewtonFunctionSetRoot.lxx -usr/include/opencascade/math_NewtonMinimum.hxx -usr/include/opencascade/math_NewtonMinimum.lxx -usr/include/opencascade/math_NotSquare.hxx -usr/include/opencascade/math_PSO.hxx -usr/include/opencascade/math_PSOParticlesPool.hxx -usr/include/opencascade/math_Powell.hxx -usr/include/opencascade/math_Powell.lxx -usr/include/opencascade/math_Recipes.hxx -usr/include/opencascade/math_SVD.hxx -usr/include/opencascade/math_SVD.lxx -usr/include/opencascade/math_SingularMatrix.hxx -usr/include/opencascade/math_Status.hxx -usr/include/opencascade/math_TrigonometricFunctionRoots.hxx -usr/include/opencascade/math_TrigonometricFunctionRoots.lxx -usr/include/opencascade/math_Uzawa.hxx -usr/include/opencascade/math_Uzawa.lxx -usr/include/opencascade/math_ValueAndWeight.hxx -usr/include/opencascade/math_Vector.hxx -usr/lib/*/libTKMath.so -usr/lib/*/libTKernel.so usr/lib/cmake/opencascade/OpenCASCADEFoundationClassesTargets*.cmake -usr/include/opencascade/Bnd_OBB.hxx -usr/include/opencascade/math_TrigonometricEquationFunction.hxx -usr/include/opencascade/Resource_Big5.h -usr/include/opencascade/Resource_GB2312.h -usr/include/opencascade/Resource_GBK.h -usr/include/opencascade/Standard_WarningsDisable.hxx -usr/include/opencascade/Standard_WarningsRestore.hxx -usr/include/opencascade/BVH_BoxSet.hxx -usr/include/opencascade/BVH_Distance.hxx -usr/include/opencascade/BVH_IndexedBoxSet.hxx -usr/include/opencascade/BVH_PairDistance.hxx -usr/include/opencascade/BVH_Tools.hxx -usr/include/opencascade/BVH_Traverse.hxx -usr/include/opencascade/BVH_Traverse.lxx -usr/include/opencascade/OSD_SignalMode.hxx -usr/include/opencascade/OSD_ThreadPool.hxx -usr/include/opencascade/Standard_Condition.hxx -usr/include/opencascade/Standard_Dump.hxx -usr/include/opencascade/Standard_ReadBuffer.hxx -usr/include/opencascade/Standard_ReadLineBuffer.hxx -usr/include/opencascade/Standard_Std.hxx -usr/include/opencascade/FSD_Base64Decoder.hxx -usr/include/opencascade/BSplCLib_CacheParams.hxx +usr/lib/*/libTKernel.so +usr/lib/*/libTKMath.so diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-foundation-dev.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-foundation-dev.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-foundation-dev.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-foundation-dev.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,2 @@ +# This is lintian bug #966295 +libocct-foundation-dev: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-7.4.install opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-7.4.install --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-7.4.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-7.4.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -usr/lib/*/libTKBO.so.* -usr/lib/*/libTKBool.so.* -usr/lib/*/libTKFeat.so.* -usr/lib/*/libTKFillet.so.* -usr/lib/*/libTKGeomAlgo.so.* -usr/lib/*/libTKHLR.so.* -usr/lib/*/libTKMesh.so.* -usr/lib/*/libTKOffset.so.* -usr/lib/*/libTKPrim.so.* -usr/lib/*/libTKShHealing.so.* -usr/lib/*/libTKTopAlgo.so.* -usr/lib/*/libTKXMesh.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-7.4.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-7.4.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-7.4.lintian-overrides 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-7.4.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -# this package contains a bunch of libraries and can thus not be named properly -package-name-doesnt-match-sonames -# symbols control files are not sustainable. -no-symbols-control-file diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-7.5.install opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-7.5.install --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-7.5.install 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-7.5.install 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,12 @@ +usr/lib/*/libTKBool.so.* +usr/lib/*/libTKBO.so.* +usr/lib/*/libTKFeat.so.* +usr/lib/*/libTKFillet.so.* +usr/lib/*/libTKGeomAlgo.so.* +usr/lib/*/libTKHLR.so.* +usr/lib/*/libTKMesh.so.* +usr/lib/*/libTKOffset.so.* +usr/lib/*/libTKPrim.so.* +usr/lib/*/libTKShHealing.so.* +usr/lib/*/libTKTopAlgo.so.* +usr/lib/*/libTKXMesh.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-7.5.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-7.5.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-7.5.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-7.5.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,6 @@ +# this package contains a bunch of libraries and can thus not be named properly +package-name-doesnt-match-sonames +# symbols control files are not sustainable. +no-symbols-control-file +# This is lintian bug #966295 +libocct-modeling-algorithms-7.5: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-dev.install opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-dev.install --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-dev.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-dev.install 2021-02-07 12:08:52.000000000 +0000 @@ -1,6 +1,6 @@ +usr/include/opencascade/AppBlend_Approx.hxx usr/include/opencascade/AppBlend_AppSurf.gxx usr/include/opencascade/AppBlend_AppSurf.lxx -usr/include/opencascade/AppBlend_Approx.hxx usr/include/opencascade/ApproxInt_Approx.gxx usr/include/opencascade/ApproxInt_ImpPrmSvSurfaces.gxx usr/include/opencascade/ApproxInt_KnotTools.hxx @@ -8,39 +8,109 @@ usr/include/opencascade/ApproxInt_MultiLineTool.lxx usr/include/opencascade/ApproxInt_PrmPrmSvSurfaces.gxx usr/include/opencascade/ApproxInt_SvSurfaces.hxx +usr/include/opencascade/Bisector_BisecAna.hxx +usr/include/opencascade/Bisector_BisecCC.hxx +usr/include/opencascade/Bisector_Bisec.hxx +usr/include/opencascade/Bisector_BisecPC.hxx +usr/include/opencascade/Bisector_Curve.hxx +usr/include/opencascade/Bisector_FunctionH.hxx +usr/include/opencascade/Bisector_FunctionInter.hxx +usr/include/opencascade/Bisector.hxx +usr/include/opencascade/Bisector_Inter.hxx +usr/include/opencascade/Bisector_PointOnBis.hxx +usr/include/opencascade/Bisector_PolyBis.hxx +usr/include/opencascade/BiTgte_Blend.hxx +usr/include/opencascade/BiTgte_ContactType.hxx +usr/include/opencascade/BiTgte_CurveOnEdge.hxx +usr/include/opencascade/BiTgte_CurveOnVertex.hxx +usr/include/opencascade/BiTgte_HCurveOnEdge.hxx +usr/include/opencascade/BiTgte_HCurveOnVertex.hxx +usr/include/opencascade/Blend_AppFunction.hxx +usr/include/opencascade/Blend_CSFunction.hxx +usr/include/opencascade/Blend_CSWalking_1.gxx +usr/include/opencascade/Blend_CSWalking_2.gxx +usr/include/opencascade/Blend_CSWalking_3.gxx +usr/include/opencascade/Blend_CSWalking_4.gxx +usr/include/opencascade/Blend_CSWalking.gxx +usr/include/opencascade/Blend_CSWalking.lxx +usr/include/opencascade/Blend_CurvPointFuncInv.hxx +usr/include/opencascade/Blend_DecrochStatus.hxx +usr/include/opencascade/BlendFunc_Chamfer.hxx +usr/include/opencascade/BlendFunc_ChamfInv.hxx +usr/include/opencascade/BlendFunc_ChAsym.hxx +usr/include/opencascade/BlendFunc_ChAsymInv.hxx +usr/include/opencascade/BlendFunc_ConstRad.hxx +usr/include/opencascade/BlendFunc_ConstRadInv.hxx +usr/include/opencascade/BlendFunc_ConstThroat.hxx +usr/include/opencascade/BlendFunc_ConstThroatInv.hxx +usr/include/opencascade/BlendFunc_ConstThroatWithPenetration.hxx +usr/include/opencascade/BlendFunc_ConstThroatWithPenetrationInv.hxx +usr/include/opencascade/BlendFunc_Corde.hxx +usr/include/opencascade/BlendFunc_CSCircular.hxx +usr/include/opencascade/BlendFunc_CSConstRad.hxx +usr/include/opencascade/BlendFunc_EvolRad.hxx +usr/include/opencascade/BlendFunc_EvolRadInv.hxx +usr/include/opencascade/BlendFunc_GenChamfer.hxx +usr/include/opencascade/BlendFunc_GenChamfInv.hxx +usr/include/opencascade/BlendFunc.hxx +usr/include/opencascade/Blend_FuncInv.hxx +usr/include/opencascade/BlendFunc_Ruled.hxx +usr/include/opencascade/BlendFunc_RuledInv.hxx +usr/include/opencascade/BlendFunc_SectionShape.hxx +usr/include/opencascade/BlendFunc_Tensor.hxx +usr/include/opencascade/BlendFunc_Tensor.lxx +usr/include/opencascade/Blend_Function.hxx +usr/include/opencascade/Blend_Point.hxx +usr/include/opencascade/Blend_Point.lxx +usr/include/opencascade/Blend_RstRstFunction.hxx +usr/include/opencascade/Blend_SequenceOfPoint.hxx +usr/include/opencascade/Blend_Status.hxx +usr/include/opencascade/Blend_SurfCurvFuncInv.hxx +usr/include/opencascade/Blend_SurfPointFuncInv.hxx +usr/include/opencascade/Blend_SurfRstFunction.hxx +usr/include/opencascade/Blend_Walking_1.gxx +usr/include/opencascade/Blend_Walking_2.gxx +usr/include/opencascade/Blend_Walking_3.gxx +usr/include/opencascade/Blend_Walking_4.gxx +usr/include/opencascade/Blend_Walking.gxx +usr/include/opencascade/Blend_Walking.lxx +usr/include/opencascade/Bnd_Tools.hxx usr/include/opencascade/BOPAlgo_Alerts.hxx usr/include/opencascade/BOPAlgo_Algo.hxx usr/include/opencascade/BOPAlgo_ArgumentAnalyzer.hxx usr/include/opencascade/BOPAlgo_ArgumentAnalyzer.lxx usr/include/opencascade/BOPAlgo_BOP.hxx -usr/include/opencascade/BOPAlgo_Builder.hxx usr/include/opencascade/BOPAlgo_BuilderArea.hxx usr/include/opencascade/BOPAlgo_BuilderFace.hxx +usr/include/opencascade/BOPAlgo_Builder.hxx usr/include/opencascade/BOPAlgo_BuilderShape.hxx usr/include/opencascade/BOPAlgo_BuilderSolid.hxx usr/include/opencascade/BOPAlgo_CellsBuilder.hxx +usr/include/opencascade/BOPAlgo_CheckerSI.hxx usr/include/opencascade/BOPAlgo_CheckResult.hxx usr/include/opencascade/BOPAlgo_CheckStatus.hxx -usr/include/opencascade/BOPAlgo_CheckerSI.hxx usr/include/opencascade/BOPAlgo_GlueEnum.hxx usr/include/opencascade/BOPAlgo_ListOfCheckResult.hxx +usr/include/opencascade/BOPAlgo_MakeConnected.hxx +usr/include/opencascade/BOPAlgo_MakePeriodic.hxx usr/include/opencascade/BOPAlgo_MakerVolume.hxx usr/include/opencascade/BOPAlgo_MakerVolume.lxx usr/include/opencascade/BOPAlgo_Operation.hxx usr/include/opencascade/BOPAlgo_Options.hxx usr/include/opencascade/BOPAlgo_PArgumentAnalyzer.hxx +usr/include/opencascade/BOPAlgo_PaveFiller.hxx usr/include/opencascade/BOPAlgo_PBOP.hxx usr/include/opencascade/BOPAlgo_PBuilder.hxx usr/include/opencascade/BOPAlgo_PPaveFiller.hxx usr/include/opencascade/BOPAlgo_PSection.hxx usr/include/opencascade/BOPAlgo_PWireEdgeSet.hxx -usr/include/opencascade/BOPAlgo_PaveFiller.hxx usr/include/opencascade/BOPAlgo_RemoveFeatures.hxx -usr/include/opencascade/BOPAlgo_Section.hxx usr/include/opencascade/BOPAlgo_SectionAttribute.hxx +usr/include/opencascade/BOPAlgo_Section.hxx usr/include/opencascade/BOPAlgo_ShellSplitter.hxx usr/include/opencascade/BOPAlgo_Splitter.hxx usr/include/opencascade/BOPAlgo_Tools.hxx +usr/include/opencascade/BOPAlgo_ToolsProvider.hxx usr/include/opencascade/BOPAlgo_WireEdgeSet.hxx usr/include/opencascade/BOPAlgo_WireEdgeSet.lxx usr/include/opencascade/BOPAlgo_WireSplitter.hxx @@ -49,39 +119,40 @@ usr/include/opencascade/BOPDS_CoupleOfPaveBlocks.hxx usr/include/opencascade/BOPDS_Curve.hxx usr/include/opencascade/BOPDS_Curve.lxx -usr/include/opencascade/BOPDS_DS.hxx -usr/include/opencascade/BOPDS_DS.lxx +usr/include/opencascade/BOPDS_DataMapOfIntegerListOfPaveBlock.hxx usr/include/opencascade/BOPDS_DataMapOfPaveBlockCommonBlock.hxx usr/include/opencascade/BOPDS_DataMapOfPaveBlockListOfInteger.hxx usr/include/opencascade/BOPDS_DataMapOfPaveBlockListOfPaveBlock.hxx usr/include/opencascade/BOPDS_DataMapOfShapeCoupleOfPaveBlocks.hxx +usr/include/opencascade/BOPDS_DS.hxx +usr/include/opencascade/BOPDS_DS.lxx usr/include/opencascade/BOPDS_FaceInfo.hxx usr/include/opencascade/BOPDS_FaceInfo.lxx -usr/include/opencascade/BOPDS_IndexRange.hxx -usr/include/opencascade/BOPDS_IndexRange.lxx usr/include/opencascade/BOPDS_IndexedDataMapOfPaveBlockListOfInteger.hxx usr/include/opencascade/BOPDS_IndexedDataMapOfPaveBlockListOfPaveBlock.hxx usr/include/opencascade/BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks.hxx usr/include/opencascade/BOPDS_IndexedMapOfPaveBlock.hxx +usr/include/opencascade/BOPDS_IndexRange.hxx +usr/include/opencascade/BOPDS_IndexRange.lxx usr/include/opencascade/BOPDS_Interf.hxx usr/include/opencascade/BOPDS_Iterator.hxx usr/include/opencascade/BOPDS_IteratorSI.hxx -usr/include/opencascade/BOPDS_ListOfPave.hxx usr/include/opencascade/BOPDS_ListOfPaveBlock.hxx +usr/include/opencascade/BOPDS_ListOfPave.hxx usr/include/opencascade/BOPDS_MapOfCommonBlock.hxx usr/include/opencascade/BOPDS_MapOfPair.hxx -usr/include/opencascade/BOPDS_MapOfPave.hxx usr/include/opencascade/BOPDS_MapOfPaveBlock.hxx -usr/include/opencascade/BOPDS_PDS.hxx -usr/include/opencascade/BOPDS_PIterator.hxx -usr/include/opencascade/BOPDS_PIteratorSI.hxx +usr/include/opencascade/BOPDS_MapOfPave.hxx usr/include/opencascade/BOPDS_Pair.hxx usr/include/opencascade/BOPDS_PairMapHasher.hxx +usr/include/opencascade/BOPDS_PaveBlock.hxx usr/include/opencascade/BOPDS_Pave.hxx usr/include/opencascade/BOPDS_Pave.lxx -usr/include/opencascade/BOPDS_PaveBlock.hxx usr/include/opencascade/BOPDS_PaveMapHasher.hxx usr/include/opencascade/BOPDS_PaveMapHasher.lxx +usr/include/opencascade/BOPDS_PDS.hxx +usr/include/opencascade/BOPDS_PIterator.hxx +usr/include/opencascade/BOPDS_PIteratorSI.hxx usr/include/opencascade/BOPDS_Point.hxx usr/include/opencascade/BOPDS_Point.lxx usr/include/opencascade/BOPDS_ShapeInfo.hxx @@ -108,24 +179,29 @@ usr/include/opencascade/BOPDS_VectorOfPoint.hxx usr/include/opencascade/BOPDS_VectorOfShapeInfo.hxx usr/include/opencascade/BOPDS_VectorOfVectorOfPair.hxx -usr/include/opencascade/BOPTools_AlgoTools.hxx usr/include/opencascade/BOPTools_AlgoTools2D.hxx usr/include/opencascade/BOPTools_AlgoTools3D.hxx +usr/include/opencascade/BOPTools_AlgoTools.hxx +usr/include/opencascade/BOPTools_BoxSelector.hxx +usr/include/opencascade/BOPTools_BoxTree.hxx usr/include/opencascade/BOPTools_ConnexityBlock.hxx usr/include/opencascade/BOPTools_CoupleOfShape.hxx +usr/include/opencascade/BOPTools_IndexedDataMapOfSetShape.hxx usr/include/opencascade/BOPTools_ListOfConnexityBlock.hxx usr/include/opencascade/BOPTools_ListOfCoupleOfShape.hxx usr/include/opencascade/BOPTools_MapOfSet.hxx +usr/include/opencascade/BOPTools_PairSelector.hxx +usr/include/opencascade/BOPTools_Parallel.hxx usr/include/opencascade/BOPTools_Set.hxx usr/include/opencascade/BOPTools_SetMapHasher.hxx usr/include/opencascade/BOPTools_SetMapHasher.lxx -usr/include/opencascade/BRepAlgo.hxx usr/include/opencascade/BRepAlgoAPI_Algo.hxx usr/include/opencascade/BRepAlgoAPI_BooleanOperation.hxx usr/include/opencascade/BRepAlgoAPI_BuilderAlgo.hxx usr/include/opencascade/BRepAlgoAPI_Check.hxx usr/include/opencascade/BRepAlgoAPI_Common.hxx usr/include/opencascade/BRepAlgoAPI_Cut.hxx +usr/include/opencascade/BRepAlgoAPI_Defeaturing.hxx usr/include/opencascade/BRepAlgoAPI_Fuse.hxx usr/include/opencascade/BRepAlgoAPI_Section.hxx usr/include/opencascade/BRepAlgoAPI_Splitter.hxx @@ -136,6 +212,7 @@ usr/include/opencascade/BRepAlgo_Cut.hxx usr/include/opencascade/BRepAlgo_FaceRestrictor.hxx usr/include/opencascade/BRepAlgo_Fuse.hxx +usr/include/opencascade/BRepAlgo.hxx usr/include/opencascade/BRepAlgo_Image.hxx usr/include/opencascade/BRepAlgo_Loop.hxx usr/include/opencascade/BRepAlgo_NormalProjection.hxx @@ -146,17 +223,17 @@ usr/include/opencascade/BRepApprox_BSpGradient_BFGSOfMyBSplGradientOfTheComputeLineOfApprox.hxx usr/include/opencascade/BRepApprox_BSpParFunctionOfMyBSplGradientOfTheComputeLineOfApprox.hxx usr/include/opencascade/BRepApprox_BSpParLeastSquareOfMyBSplGradientOfTheComputeLineOfApprox.hxx -usr/include/opencascade/BRepApprox_Gradient_BFGSOfMyGradientOfTheComputeLineBezierOfApprox.hxx usr/include/opencascade/BRepApprox_Gradient_BFGSOfMyGradientbisOfTheComputeLineOfApprox.hxx +usr/include/opencascade/BRepApprox_Gradient_BFGSOfMyGradientOfTheComputeLineBezierOfApprox.hxx usr/include/opencascade/BRepApprox_MyBSplGradientOfTheComputeLineOfApprox.hxx -usr/include/opencascade/BRepApprox_MyGradientOfTheComputeLineBezierOfApprox.hxx usr/include/opencascade/BRepApprox_MyGradientbisOfTheComputeLineOfApprox.hxx -usr/include/opencascade/BRepApprox_ParFunctionOfMyGradientOfTheComputeLineBezierOfApprox.hxx +usr/include/opencascade/BRepApprox_MyGradientOfTheComputeLineBezierOfApprox.hxx usr/include/opencascade/BRepApprox_ParFunctionOfMyGradientbisOfTheComputeLineOfApprox.hxx -usr/include/opencascade/BRepApprox_ParLeastSquareOfMyGradientOfTheComputeLineBezierOfApprox.hxx +usr/include/opencascade/BRepApprox_ParFunctionOfMyGradientOfTheComputeLineBezierOfApprox.hxx usr/include/opencascade/BRepApprox_ParLeastSquareOfMyGradientbisOfTheComputeLineOfApprox.hxx -usr/include/opencascade/BRepApprox_ResConstraintOfMyGradientOfTheComputeLineBezierOfApprox.hxx +usr/include/opencascade/BRepApprox_ParLeastSquareOfMyGradientOfTheComputeLineBezierOfApprox.hxx usr/include/opencascade/BRepApprox_ResConstraintOfMyGradientbisOfTheComputeLineOfApprox.hxx +usr/include/opencascade/BRepApprox_ResConstraintOfMyGradientOfTheComputeLineBezierOfApprox.hxx usr/include/opencascade/BRepApprox_SurfaceTool.hxx usr/include/opencascade/BRepApprox_SurfaceTool.lxx usr/include/opencascade/BRepApprox_TheComputeLineBezierOfApprox.hxx @@ -172,20 +249,24 @@ usr/include/opencascade/BRepBlend_AppFuncRoot.hxx usr/include/opencascade/BRepBlend_AppFuncRst.hxx usr/include/opencascade/BRepBlend_AppFuncRstRst.hxx -usr/include/opencascade/BRepBlend_AppSurf.hxx usr/include/opencascade/BRepBlend_AppSurface.hxx usr/include/opencascade/BRepBlend_AppSurface.lxx +usr/include/opencascade/BRepBlend_AppSurf.hxx usr/include/opencascade/BRepBlend_BlendTool.hxx usr/include/opencascade/BRepBlend_BlendTool.lxx -usr/include/opencascade/BRepBlend_CSCircular.hxx -usr/include/opencascade/BRepBlend_CSConstRad.hxx -usr/include/opencascade/BRepBlend_CSWalking.hxx +usr/include/opencascade/BRepBlend_Chamfer.hxx +usr/include/opencascade/BRepBlend_ChamfInv.hxx usr/include/opencascade/BRepBlend_ChAsym.hxx usr/include/opencascade/BRepBlend_ChAsymInv.hxx -usr/include/opencascade/BRepBlend_ChamfInv.hxx -usr/include/opencascade/BRepBlend_Chamfer.hxx usr/include/opencascade/BRepBlend_ConstRad.hxx usr/include/opencascade/BRepBlend_ConstRadInv.hxx +usr/include/opencascade/BRepBlend_ConstThroat.hxx +usr/include/opencascade/BRepBlend_ConstThroatInv.hxx +usr/include/opencascade/BRepBlend_ConstThroatWithPenetration.hxx +usr/include/opencascade/BRepBlend_ConstThroatWithPenetrationInv.hxx +usr/include/opencascade/BRepBlend_CSCircular.hxx +usr/include/opencascade/BRepBlend_CSConstRad.hxx +usr/include/opencascade/BRepBlend_CSWalking.hxx usr/include/opencascade/BRepBlend_CurvPointRadInv.hxx usr/include/opencascade/BRepBlend_EvolRad.hxx usr/include/opencascade/BRepBlend_EvolRadInv.hxx @@ -217,7 +298,6 @@ usr/include/opencascade/BRepBlend_SurfRstLineBuilder.lxx usr/include/opencascade/BRepBlend_Walking.hxx usr/include/opencascade/BRepBndLib.hxx -usr/include/opencascade/BRepBuilderAPI.hxx usr/include/opencascade/BRepBuilderAPI_BndBoxTreeSelector.hxx usr/include/opencascade/BRepBuilderAPI_CellFilter.hxx usr/include/opencascade/BRepBuilderAPI_Collect.hxx @@ -228,8 +308,9 @@ usr/include/opencascade/BRepBuilderAPI_FastSewing.hxx usr/include/opencascade/BRepBuilderAPI_FindPlane.hxx usr/include/opencascade/BRepBuilderAPI_GTransform.hxx -usr/include/opencascade/BRepBuilderAPI_MakeEdge.hxx +usr/include/opencascade/BRepBuilderAPI.hxx usr/include/opencascade/BRepBuilderAPI_MakeEdge2d.hxx +usr/include/opencascade/BRepBuilderAPI_MakeEdge.hxx usr/include/opencascade/BRepBuilderAPI_MakeFace.hxx usr/include/opencascade/BRepBuilderAPI_MakePolygon.hxx usr/include/opencascade/BRepBuilderAPI_MakeShape.hxx @@ -248,7 +329,6 @@ usr/include/opencascade/BRepBuilderAPI_TransitionMode.hxx usr/include/opencascade/BRepBuilderAPI_VertexInspector.hxx usr/include/opencascade/BRepBuilderAPI_WireError.hxx -usr/include/opencascade/BRepCheck.hxx usr/include/opencascade/BRepCheck_Analyzer.hxx usr/include/opencascade/BRepCheck_Analyzer.lxx usr/include/opencascade/BRepCheck_DataMapIteratorOfDataMapOfShapeListOfStatus.hxx @@ -257,6 +337,7 @@ usr/include/opencascade/BRepCheck_DataMapOfShapeResult.hxx usr/include/opencascade/BRepCheck_Edge.hxx usr/include/opencascade/BRepCheck_Face.hxx +usr/include/opencascade/BRepCheck.hxx usr/include/opencascade/BRepCheck_ListIteratorOfListOfStatus.hxx usr/include/opencascade/BRepCheck_ListOfStatus.hxx usr/include/opencascade/BRepCheck_Result.hxx @@ -266,9 +347,9 @@ usr/include/opencascade/BRepCheck_Status.hxx usr/include/opencascade/BRepCheck_Vertex.hxx usr/include/opencascade/BRepCheck_Wire.hxx -usr/include/opencascade/BRepClass3d.hxx usr/include/opencascade/BRepClass3d_BndBoxTree.hxx usr/include/opencascade/BRepClass3d_DataMapIteratorOfMapOfInter.hxx +usr/include/opencascade/BRepClass3d.hxx usr/include/opencascade/BRepClass3d_Intersector3d.hxx usr/include/opencascade/BRepClass3d_Intersector3d.lxx usr/include/opencascade/BRepClass3d_MapOfInter.hxx @@ -278,15 +359,15 @@ usr/include/opencascade/BRepClass3d_SolidPassiveClassifier.hxx usr/include/opencascade/BRepClass_Edge.hxx usr/include/opencascade/BRepClass_Edge.lxx -usr/include/opencascade/BRepClass_FClass2dOfFClassifier.hxx -usr/include/opencascade/BRepClass_FClassifier.hxx usr/include/opencascade/BRepClass_FaceClassifier.hxx usr/include/opencascade/BRepClass_FaceExplorer.hxx usr/include/opencascade/BRepClass_FaceExplorer.lxx usr/include/opencascade/BRepClass_FacePassiveClassifier.hxx +usr/include/opencascade/BRepClass_FClass2dOfFClassifier.hxx +usr/include/opencascade/BRepClass_FClassifier.hxx usr/include/opencascade/BRepClass_Intersector.hxx -usr/include/opencascade/BRepExtrema_DistShapeShape.hxx usr/include/opencascade/BRepExtrema_DistanceSS.hxx +usr/include/opencascade/BRepExtrema_DistShapeShape.hxx usr/include/opencascade/BRepExtrema_ElementFilter.hxx usr/include/opencascade/BRepExtrema_ExtCC.hxx usr/include/opencascade/BRepExtrema_ExtCF.hxx @@ -303,12 +384,12 @@ usr/include/opencascade/BRepExtrema_SupportType.hxx usr/include/opencascade/BRepExtrema_TriangleSet.hxx usr/include/opencascade/BRepExtrema_UnCompatibleShape.hxx -usr/include/opencascade/BRepFeat.hxx usr/include/opencascade/BRepFeat_Builder.hxx usr/include/opencascade/BRepFeat_Form.hxx usr/include/opencascade/BRepFeat_Form.lxx usr/include/opencascade/BRepFeat_Gluer.hxx usr/include/opencascade/BRepFeat_Gluer.lxx +usr/include/opencascade/BRepFeat.hxx usr/include/opencascade/BRepFeat_MakeCylindricalHole.hxx usr/include/opencascade/BRepFeat_MakeCylindricalHole.lxx usr/include/opencascade/BRepFeat_MakeDPrism.hxx @@ -327,10 +408,10 @@ usr/include/opencascade/BRepFeat_RibSlot.lxx usr/include/opencascade/BRepFeat_SplitShape.hxx usr/include/opencascade/BRepFeat_SplitShape.lxx -usr/include/opencascade/BRepFeat_Status.hxx usr/include/opencascade/BRepFeat_StatusError.hxx -usr/include/opencascade/BRepFill.hxx +usr/include/opencascade/BRepFeat_Status.hxx usr/include/opencascade/BRepFill_ACRLaw.hxx +usr/include/opencascade/BRepFill_AdvancedEvolved.hxx usr/include/opencascade/BRepFill_ApproxSeewing.hxx usr/include/opencascade/BRepFill_CompatibleWires.hxx usr/include/opencascade/BRepFill_ComputeCLine.hxx @@ -354,11 +435,17 @@ usr/include/opencascade/BRepFill_Edge3DLaw.hxx usr/include/opencascade/BRepFill_EdgeFaceAndOrder.hxx usr/include/opencascade/BRepFill_EdgeOnSurfLaw.hxx +usr/include/opencascade/BRepFilletAPI_LocalOperation.hxx +usr/include/opencascade/BRepFilletAPI_MakeChamfer.hxx +usr/include/opencascade/BRepFilletAPI_MakeFillet2d.hxx +usr/include/opencascade/BRepFilletAPI_MakeFillet2d.lxx +usr/include/opencascade/BRepFilletAPI_MakeFillet.hxx usr/include/opencascade/BRepFill_Evolved.hxx usr/include/opencascade/BRepFill_FaceAndOrder.hxx usr/include/opencascade/BRepFill_Filling.hxx usr/include/opencascade/BRepFill_Generator.hxx usr/include/opencascade/BRepFill_Generator.lxx +usr/include/opencascade/BRepFill.hxx usr/include/opencascade/BRepFill_IndexedDataMapOfOrientedShapeListOfShape.hxx usr/include/opencascade/BRepFill_ListIteratorOfListOfOffsetWire.hxx usr/include/opencascade/BRepFill_ListOfOffsetWire.hxx @@ -370,8 +457,8 @@ usr/include/opencascade/BRepFill_Pipe.hxx usr/include/opencascade/BRepFill_PipeShell.hxx usr/include/opencascade/BRepFill_Section.hxx -usr/include/opencascade/BRepFill_Section.lxx usr/include/opencascade/BRepFill_SectionLaw.hxx +usr/include/opencascade/BRepFill_Section.lxx usr/include/opencascade/BRepFill_SectionPlacement.hxx usr/include/opencascade/BRepFill_SequenceOfEdgeFaceAndOrder.hxx usr/include/opencascade/BRepFill_SequenceOfFaceAndOrder.hxx @@ -384,12 +471,6 @@ usr/include/opencascade/BRepFill_TrimShellCorner.hxx usr/include/opencascade/BRepFill_TrimSurfaceTool.hxx usr/include/opencascade/BRepFill_TypeOfContact.hxx -usr/include/opencascade/BRepFilletAPI_LocalOperation.hxx -usr/include/opencascade/BRepFilletAPI_MakeChamfer.hxx -usr/include/opencascade/BRepFilletAPI_MakeFillet.hxx -usr/include/opencascade/BRepFilletAPI_MakeFillet2d.hxx -usr/include/opencascade/BRepFilletAPI_MakeFillet2d.lxx -usr/include/opencascade/BRepGProp.hxx usr/include/opencascade/BRepGProp_Cinert.hxx usr/include/opencascade/BRepGProp_Domain.hxx usr/include/opencascade/BRepGProp_Domain.lxx @@ -397,23 +478,26 @@ usr/include/opencascade/BRepGProp_Face.hxx usr/include/opencascade/BRepGProp_Face.lxx usr/include/opencascade/BRepGProp_Gauss.hxx +usr/include/opencascade/BRepGProp.hxx +usr/include/opencascade/BRepGProp_MeshCinert.hxx +usr/include/opencascade/BRepGProp_MeshProps.hxx usr/include/opencascade/BRepGProp_Sinert.hxx usr/include/opencascade/BRepGProp_TFunction.hxx usr/include/opencascade/BRepGProp_TFunction.lxx usr/include/opencascade/BRepGProp_UFunction.hxx usr/include/opencascade/BRepGProp_UFunction.lxx -usr/include/opencascade/BRepGProp_Vinert.hxx usr/include/opencascade/BRepGProp_VinertGK.hxx +usr/include/opencascade/BRepGProp_Vinert.hxx usr/include/opencascade/BRepIntCurveSurface_Inter.hxx -usr/include/opencascade/BRepLib.hxx usr/include/opencascade/BRepLib_CheckCurveOnSurface.hxx usr/include/opencascade/BRepLib_Command.hxx usr/include/opencascade/BRepLib_EdgeError.hxx usr/include/opencascade/BRepLib_FaceError.hxx usr/include/opencascade/BRepLib_FindSurface.hxx usr/include/opencascade/BRepLib_FuseEdges.hxx -usr/include/opencascade/BRepLib_MakeEdge.hxx +usr/include/opencascade/BRepLib.hxx usr/include/opencascade/BRepLib_MakeEdge2d.hxx +usr/include/opencascade/BRepLib_MakeEdge.hxx usr/include/opencascade/BRepLib_MakeFace.hxx usr/include/opencascade/BRepLib_MakePolygon.hxx usr/include/opencascade/BRepLib_MakeShape.hxx @@ -431,33 +515,70 @@ usr/include/opencascade/BRepMAT2d_DataMapOfShapeSequenceOfBasicElt.hxx usr/include/opencascade/BRepMAT2d_Explorer.hxx usr/include/opencascade/BRepMAT2d_LinkTopoBilo.hxx +usr/include/opencascade/BRepMesh_BaseMeshAlgo.hxx +usr/include/opencascade/BRepMesh_BoundaryParamsRangeSplitter.hxx usr/include/opencascade/BRepMesh_Circle.hxx usr/include/opencascade/BRepMesh_CircleInspector.hxx usr/include/opencascade/BRepMesh_CircleTool.hxx usr/include/opencascade/BRepMesh_Classifier.hxx +usr/include/opencascade/BRepMesh_ConeRangeSplitter.hxx +usr/include/opencascade/BRepMesh_ConstrainedBaseMeshAlgo.hxx +usr/include/opencascade/BRepMesh_Context.hxx +usr/include/opencascade/BRepMesh_CurveTessellator.hxx +usr/include/opencascade/BRepMesh_CustomBaseMeshAlgo.hxx +usr/include/opencascade/BRepMesh_CustomDelaunayBaseMeshAlgo.hxx +usr/include/opencascade/BRepMesh_CylinderRangeSplitter.hxx +usr/include/opencascade/BRepMeshData_Curve.hxx +usr/include/opencascade/BRepMeshData_Edge.hxx +usr/include/opencascade/BRepMeshData_Face.hxx +usr/include/opencascade/BRepMeshData_Model.hxx +usr/include/opencascade/BRepMeshData_PCurve.hxx usr/include/opencascade/BRepMesh_DataStructureOfDelaun.hxx +usr/include/opencascade/BRepMeshData_Wire.hxx +usr/include/opencascade/BRepMesh_DefaultRangeSplitter.hxx +usr/include/opencascade/BRepMesh_Deflection.hxx usr/include/opencascade/BRepMesh_DegreeOfFreedom.hxx +usr/include/opencascade/BRepMesh_DelabellaBaseMeshAlgo.hxx +usr/include/opencascade/BRepMesh_DelabellaMeshAlgoFactory.hxx +usr/include/opencascade/BRepMesh_DelaunayBaseMeshAlgo.hxx +usr/include/opencascade/BRepMesh_DelaunayDeflectionControlMeshAlgo.hxx +usr/include/opencascade/BRepMesh_DelaunayNodeInsertionMeshAlgo.hxx usr/include/opencascade/BRepMesh_Delaun.hxx usr/include/opencascade/BRepMesh_DiscretFactory.hxx usr/include/opencascade/BRepMesh_DiscretRoot.hxx +usr/include/opencascade/BRepMesh_EdgeDiscret.hxx usr/include/opencascade/BRepMesh_Edge.hxx usr/include/opencascade/BRepMesh_EdgeParameterProvider.hxx usr/include/opencascade/BRepMesh_EdgeTessellationExtractor.hxx +usr/include/opencascade/BRepMesh_FaceChecker.hxx +usr/include/opencascade/BRepMesh_FaceDiscret.hxx usr/include/opencascade/BRepMesh_FactoryError.hxx usr/include/opencascade/BRepMesh_FastDiscret.hxx usr/include/opencascade/BRepMesh_GeomTool.hxx usr/include/opencascade/BRepMesh_IncrementalMesh.hxx +usr/include/opencascade/BRepMesh_MeshAlgoFactory.hxx +usr/include/opencascade/BRepMesh_MeshTool.hxx +usr/include/opencascade/BRepMesh_ModelBuilder.hxx +usr/include/opencascade/BRepMesh_ModelHealer.hxx +usr/include/opencascade/BRepMesh_ModelPostProcessor.hxx +usr/include/opencascade/BRepMesh_ModelPreProcessor.hxx +usr/include/opencascade/BRepMesh_NodeInsertionMeshAlgo.hxx +usr/include/opencascade/BRepMesh_NURBSRangeSplitter.hxx usr/include/opencascade/BRepMesh_OrientedEdge.hxx usr/include/opencascade/BRepMesh_PairOfIndex.hxx usr/include/opencascade/BRepMesh_PluginEntryType.hxx usr/include/opencascade/BRepMesh_PluginMacro.hxx usr/include/opencascade/BRepMesh_SelectorOfDataStructureOfDelaun.hxx usr/include/opencascade/BRepMesh_ShapeTool.hxx +usr/include/opencascade/BRepMesh_ShapeVisitor.hxx +usr/include/opencascade/BRepMesh_SphereRangeSplitter.hxx +usr/include/opencascade/BRepMesh_TorusRangeSplitter.hxx usr/include/opencascade/BRepMesh_Triangle.hxx +usr/include/opencascade/BRepMesh_UVParamRangeSplitter.hxx usr/include/opencascade/BRepMesh_Vertex.hxx usr/include/opencascade/BRepMesh_VertexInspector.hxx usr/include/opencascade/BRepMesh_VertexTool.hxx -usr/include/opencascade/BRepOffset.hxx +usr/include/opencascade/BRepOffset_Analyse.hxx usr/include/opencascade/BRepOffsetAPI_DraftAngle.hxx usr/include/opencascade/BRepOffsetAPI_FindContigousEdges.hxx usr/include/opencascade/BRepOffsetAPI_MakeDraft.hxx @@ -474,7 +595,6 @@ usr/include/opencascade/BRepOffsetAPI_SequenceOfSequenceOfShape.hxx usr/include/opencascade/BRepOffsetAPI_Sewing.hxx usr/include/opencascade/BRepOffsetAPI_ThruSections.hxx -usr/include/opencascade/BRepOffset_Analyse.hxx usr/include/opencascade/BRepOffset_DataMapIteratorOfDataMapOfShapeListOfInterval.hxx usr/include/opencascade/BRepOffset_DataMapIteratorOfDataMapOfShapeMapOfShape.hxx usr/include/opencascade/BRepOffset_DataMapIteratorOfDataMapOfShapeOffset.hxx @@ -482,6 +602,7 @@ usr/include/opencascade/BRepOffset_DataMapOfShapeMapOfShape.hxx usr/include/opencascade/BRepOffset_DataMapOfShapeOffset.hxx usr/include/opencascade/BRepOffset_Error.hxx +usr/include/opencascade/BRepOffset.hxx usr/include/opencascade/BRepOffset_Inter2d.hxx usr/include/opencascade/BRepOffset_Inter3d.hxx usr/include/opencascade/BRepOffset_Interval.hxx @@ -497,7 +618,7 @@ usr/include/opencascade/BRepOffset_SimpleOffset.hxx usr/include/opencascade/BRepOffset_Status.hxx usr/include/opencascade/BRepOffset_Tool.hxx -usr/include/opencascade/BRepOffset_Type.hxx +usr/include/opencascade/BRepPreviewAPI_MakeBox.hxx usr/include/opencascade/BRepPrimAPI_MakeBox.hxx usr/include/opencascade/BRepPrimAPI_MakeCone.hxx usr/include/opencascade/BRepPrimAPI_MakeCylinder.hxx @@ -543,82 +664,23 @@ usr/include/opencascade/BRepTopAdaptor_SeqOfPtr.hxx usr/include/opencascade/BRepTopAdaptor_Tool.hxx usr/include/opencascade/BRepTopAdaptor_TopolTool.hxx -usr/include/opencascade/BiTgte_Blend.hxx -usr/include/opencascade/BiTgte_ContactType.hxx -usr/include/opencascade/BiTgte_CurveOnEdge.hxx -usr/include/opencascade/BiTgte_CurveOnVertex.hxx -usr/include/opencascade/BiTgte_HCurveOnEdge.hxx -usr/include/opencascade/BiTgte_HCurveOnVertex.hxx -usr/include/opencascade/Bisector.hxx -usr/include/opencascade/Bisector_Bisec.hxx -usr/include/opencascade/Bisector_BisecAna.hxx -usr/include/opencascade/Bisector_BisecCC.hxx -usr/include/opencascade/Bisector_BisecPC.hxx -usr/include/opencascade/Bisector_Curve.hxx -usr/include/opencascade/Bisector_FunctionH.hxx -usr/include/opencascade/Bisector_FunctionInter.hxx -usr/include/opencascade/Bisector_Inter.hxx -usr/include/opencascade/Bisector_PointOnBis.hxx -usr/include/opencascade/Bisector_PolyBis.hxx -usr/include/opencascade/BlendFunc.hxx -usr/include/opencascade/BlendFunc_CSCircular.hxx -usr/include/opencascade/BlendFunc_CSConstRad.hxx -usr/include/opencascade/BlendFunc_ChAsym.hxx -usr/include/opencascade/BlendFunc_ChAsymInv.hxx -usr/include/opencascade/BlendFunc_ChamfInv.hxx -usr/include/opencascade/BlendFunc_Chamfer.hxx -usr/include/opencascade/BlendFunc_ConstRad.hxx -usr/include/opencascade/BlendFunc_ConstRadInv.hxx -usr/include/opencascade/BlendFunc_Corde.hxx -usr/include/opencascade/BlendFunc_EvolRad.hxx -usr/include/opencascade/BlendFunc_EvolRadInv.hxx -usr/include/opencascade/BlendFunc_Ruled.hxx -usr/include/opencascade/BlendFunc_RuledInv.hxx -usr/include/opencascade/BlendFunc_SectionShape.hxx -usr/include/opencascade/BlendFunc_Tensor.hxx -usr/include/opencascade/BlendFunc_Tensor.lxx -usr/include/opencascade/Blend_AppFunction.hxx -usr/include/opencascade/Blend_CSFunction.hxx -usr/include/opencascade/Blend_CSWalking.gxx -usr/include/opencascade/Blend_CSWalking.lxx -usr/include/opencascade/Blend_CSWalking_1.gxx -usr/include/opencascade/Blend_CSWalking_2.gxx -usr/include/opencascade/Blend_CSWalking_3.gxx -usr/include/opencascade/Blend_CSWalking_4.gxx -usr/include/opencascade/Blend_CurvPointFuncInv.hxx -usr/include/opencascade/Blend_DecrochStatus.hxx -usr/include/opencascade/Blend_FuncInv.hxx -usr/include/opencascade/Blend_Function.hxx -usr/include/opencascade/Blend_Point.hxx -usr/include/opencascade/Blend_Point.lxx -usr/include/opencascade/Blend_RstRstFunction.hxx -usr/include/opencascade/Blend_SequenceOfPoint.hxx -usr/include/opencascade/Blend_Status.hxx -usr/include/opencascade/Blend_SurfCurvFuncInv.hxx -usr/include/opencascade/Blend_SurfPointFuncInv.hxx -usr/include/opencascade/Blend_SurfRstFunction.hxx -usr/include/opencascade/Blend_Walking.gxx -usr/include/opencascade/Blend_Walking.lxx -usr/include/opencascade/Blend_Walking_1.gxx -usr/include/opencascade/Blend_Walking_2.gxx -usr/include/opencascade/Blend_Walking_3.gxx -usr/include/opencascade/Blend_Walking_4.gxx -usr/include/opencascade/ChFi2d.hxx usr/include/opencascade/ChFi2d_AnaFilletAlgo.hxx usr/include/opencascade/ChFi2d_Builder.hxx usr/include/opencascade/ChFi2d_Builder.lxx usr/include/opencascade/ChFi2d_ChamferAPI.hxx usr/include/opencascade/ChFi2d_ConstructionError.hxx -usr/include/opencascade/ChFi2d_FilletAPI.hxx usr/include/opencascade/ChFi2d_FilletAlgo.hxx -usr/include/opencascade/ChFi3d.hxx -usr/include/opencascade/ChFi3d_Builder.hxx +usr/include/opencascade/ChFi2d_FilletAPI.hxx +usr/include/opencascade/ChFi2d.hxx usr/include/opencascade/ChFi3d_Builder_0.hxx +usr/include/opencascade/ChFi3d_Builder.hxx usr/include/opencascade/ChFi3d_ChBuilder.hxx usr/include/opencascade/ChFi3d_FilBuilder.hxx usr/include/opencascade/ChFi3d_FilletShape.hxx +usr/include/opencascade/ChFi3d.hxx usr/include/opencascade/ChFi3d_SearchSing.hxx usr/include/opencascade/ChFiDS_ChamfMethod.hxx +usr/include/opencascade/ChFiDS_ChamfMode.hxx usr/include/opencascade/ChFiDS_ChamfSpine.hxx usr/include/opencascade/ChFiDS_CircSection.hxx usr/include/opencascade/ChFiDS_CommonPoint.hxx @@ -636,8 +698,8 @@ usr/include/opencascade/ChFiDS_ListOfHElSpine.hxx usr/include/opencascade/ChFiDS_ListOfStripe.hxx usr/include/opencascade/ChFiDS_Map.hxx -usr/include/opencascade/ChFiDS_Regul.hxx usr/include/opencascade/ChFiDS_Regularities.hxx +usr/include/opencascade/ChFiDS_Regul.hxx usr/include/opencascade/ChFiDS_SecArray1.hxx usr/include/opencascade/ChFiDS_SecHArray1.hxx usr/include/opencascade/ChFiDS_SequenceOfSpine.hxx @@ -645,25 +707,26 @@ usr/include/opencascade/ChFiDS_Spine.hxx usr/include/opencascade/ChFiDS_Spine.lxx usr/include/opencascade/ChFiDS_State.hxx +usr/include/opencascade/ChFiDS_StripeArray1.hxx usr/include/opencascade/ChFiDS_Stripe.hxx usr/include/opencascade/ChFiDS_Stripe.lxx -usr/include/opencascade/ChFiDS_StripeArray1.hxx usr/include/opencascade/ChFiDS_StripeMap.hxx usr/include/opencascade/ChFiDS_StripeMap.lxx usr/include/opencascade/ChFiDS_SurfData.hxx usr/include/opencascade/ChFiDS_SurfData.lxx -usr/include/opencascade/ChFiKPart_ComputeData.hxx -usr/include/opencascade/ChFiKPart_ComputeData_CS.hxx +usr/include/opencascade/ChFiDS_TypeOfConcavity.hxx usr/include/opencascade/ChFiKPart_ComputeData_ChAsymPlnCon.hxx usr/include/opencascade/ChFiKPart_ComputeData_ChAsymPlnCyl.hxx usr/include/opencascade/ChFiKPart_ComputeData_ChAsymPlnPln.hxx usr/include/opencascade/ChFiKPart_ComputeData_ChPlnCon.hxx usr/include/opencascade/ChFiKPart_ComputeData_ChPlnCyl.hxx usr/include/opencascade/ChFiKPart_ComputeData_ChPlnPln.hxx +usr/include/opencascade/ChFiKPart_ComputeData_CS.hxx usr/include/opencascade/ChFiKPart_ComputeData_Fcts.hxx usr/include/opencascade/ChFiKPart_ComputeData_FilPlnCon.hxx usr/include/opencascade/ChFiKPart_ComputeData_FilPlnCyl.hxx usr/include/opencascade/ChFiKPart_ComputeData_FilPlnPln.hxx +usr/include/opencascade/ChFiKPart_ComputeData.hxx usr/include/opencascade/ChFiKPart_ComputeData_Rotule.hxx usr/include/opencascade/ChFiKPart_ComputeData_Sphere.hxx usr/include/opencascade/ChFiKPart_DataMapIteratorOfRstMap.hxx @@ -690,18 +753,18 @@ usr/include/opencascade/Contap_SurfProps.hxx usr/include/opencascade/Contap_TFunction.hxx usr/include/opencascade/Contap_TheHSequenceOfPoint.hxx -usr/include/opencascade/Contap_TheIWLineOfTheIWalking.hxx usr/include/opencascade/Contap_TheIWalking.hxx +usr/include/opencascade/Contap_TheIWLineOfTheIWalking.hxx usr/include/opencascade/Contap_ThePathPointOfTheSearch.hxx usr/include/opencascade/Contap_TheSearch.hxx usr/include/opencascade/Contap_TheSearchInside.hxx usr/include/opencascade/Contap_TheSegmentOfTheSearch.hxx usr/include/opencascade/Contap_TheSequenceOfLine.hxx usr/include/opencascade/Contap_TheSequenceOfPoint.hxx -usr/include/opencascade/Draft.hxx usr/include/opencascade/Draft_EdgeInfo.hxx usr/include/opencascade/Draft_ErrorStatus.hxx usr/include/opencascade/Draft_FaceInfo.hxx +usr/include/opencascade/Draft.hxx usr/include/opencascade/Draft_IndexedDataMapOfEdgeEdgeInfo.hxx usr/include/opencascade/Draft_IndexedDataMapOfFaceFaceInfo.hxx usr/include/opencascade/Draft_IndexedDataMapOfVertexVertexInfo.hxx @@ -709,9 +772,9 @@ usr/include/opencascade/Draft_VertexInfo.hxx usr/include/opencascade/FairCurve_AnalysisCode.hxx usr/include/opencascade/FairCurve_Batten.hxx -usr/include/opencascade/FairCurve_Batten.lxx usr/include/opencascade/FairCurve_BattenLaw.hxx usr/include/opencascade/FairCurve_BattenLaw.lxx +usr/include/opencascade/FairCurve_Batten.lxx usr/include/opencascade/FairCurve_DistributionOfEnergy.hxx usr/include/opencascade/FairCurve_DistributionOfJerk.hxx usr/include/opencascade/FairCurve_DistributionOfSagging.hxx @@ -747,19 +810,19 @@ usr/include/opencascade/GccAna_LinPnt2dBisec.hxx usr/include/opencascade/GccAna_NoSolution.hxx usr/include/opencascade/GccAna_Pnt2dBisec.hxx -usr/include/opencascade/GccEnt.hxx usr/include/opencascade/GccEnt_Array1OfPosition.hxx usr/include/opencascade/GccEnt_BadQualifier.hxx +usr/include/opencascade/GccEnt.hxx usr/include/opencascade/GccEnt_Position.hxx usr/include/opencascade/GccEnt_QualifiedCirc.hxx usr/include/opencascade/GccEnt_QualifiedLin.hxx usr/include/opencascade/GccInt_BCirc.hxx usr/include/opencascade/GccInt_BElips.hxx usr/include/opencascade/GccInt_BHyper.hxx +usr/include/opencascade/GccInt_Bisec.hxx usr/include/opencascade/GccInt_BLine.hxx usr/include/opencascade/GccInt_BParab.hxx usr/include/opencascade/GccInt_BPoint.hxx -usr/include/opencascade/GccInt_Bisec.hxx usr/include/opencascade/GccInt_IType.hxx usr/include/opencascade/Geom2dAPI_ExtremaCurveCurve.hxx usr/include/opencascade/Geom2dAPI_ExtremaCurveCurve.lxx @@ -769,25 +832,25 @@ usr/include/opencascade/Geom2dAPI_PointsToBSpline.hxx usr/include/opencascade/Geom2dAPI_ProjectPointOnCurve.hxx usr/include/opencascade/Geom2dAPI_ProjectPointOnCurve.lxx -usr/include/opencascade/Geom2dGcc.hxx -usr/include/opencascade/Geom2dGcc_Circ2d2TanOn.hxx usr/include/opencascade/Geom2dGcc_Circ2d2TanOnGeo.hxx +usr/include/opencascade/Geom2dGcc_Circ2d2TanOn.hxx usr/include/opencascade/Geom2dGcc_Circ2d2TanOnIter.hxx -usr/include/opencascade/Geom2dGcc_Circ2d2TanRad.hxx usr/include/opencascade/Geom2dGcc_Circ2d2TanRadGeo.hxx +usr/include/opencascade/Geom2dGcc_Circ2d2TanRad.hxx usr/include/opencascade/Geom2dGcc_Circ2d3Tan.hxx usr/include/opencascade/Geom2dGcc_Circ2d3TanIter.hxx -usr/include/opencascade/Geom2dGcc_Circ2dTanCen.hxx usr/include/opencascade/Geom2dGcc_Circ2dTanCenGeo.hxx -usr/include/opencascade/Geom2dGcc_Circ2dTanOnRad.hxx +usr/include/opencascade/Geom2dGcc_Circ2dTanCen.hxx usr/include/opencascade/Geom2dGcc_Circ2dTanOnRadGeo.hxx +usr/include/opencascade/Geom2dGcc_Circ2dTanOnRad.hxx usr/include/opencascade/Geom2dGcc_CurveTool.hxx usr/include/opencascade/Geom2dGcc_FunctionTanCirCu.hxx -usr/include/opencascade/Geom2dGcc_FunctionTanCuCu.hxx usr/include/opencascade/Geom2dGcc_FunctionTanCuCuCu.hxx +usr/include/opencascade/Geom2dGcc_FunctionTanCuCu.hxx usr/include/opencascade/Geom2dGcc_FunctionTanCuCuOnCu.hxx usr/include/opencascade/Geom2dGcc_FunctionTanCuPnt.hxx usr/include/opencascade/Geom2dGcc_FunctionTanObl.hxx +usr/include/opencascade/Geom2dGcc.hxx usr/include/opencascade/Geom2dGcc_IsParallel.hxx usr/include/opencascade/Geom2dGcc_Lin2d2Tan.hxx usr/include/opencascade/Geom2dGcc_Lin2d2TanIter.hxx @@ -812,54 +875,53 @@ usr/include/opencascade/Geom2dHatch_Intersector.lxx usr/include/opencascade/Geom2dHatch_MapOfElements.hxx usr/include/opencascade/Geom2dInt_ExactIntersectionPointOfTheIntPCurvePCurveOfGInter.hxx -usr/include/opencascade/Geom2dInt_GInter.hxx usr/include/opencascade/Geom2dInt_Geom2dCurveTool.hxx usr/include/opencascade/Geom2dInt_Geom2dCurveTool.lxx +usr/include/opencascade/Geom2dInt_GInter.hxx usr/include/opencascade/Geom2dInt_IntConicCurveOfGInter.hxx usr/include/opencascade/Geom2dInt_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfGInter.hxx usr/include/opencascade/Geom2dInt_PCLocFOfTheLocateExtPCOfTheProjPCurOfGInter.hxx usr/include/opencascade/Geom2dInt_TheCurveLocatorOfTheProjPCurOfGInter.hxx usr/include/opencascade/Geom2dInt_TheDistBetweenPCurvesOfTheIntPCurvePCurveOfGInter.hxx usr/include/opencascade/Geom2dInt_TheIntConicCurveOfGInter.hxx -usr/include/opencascade/Geom2dInt_TheIntPCurvePCurveOfGInter.hxx usr/include/opencascade/Geom2dInt_TheIntersectorOfTheIntConicCurveOfGInter.hxx +usr/include/opencascade/Geom2dInt_TheIntPCurvePCurveOfGInter.hxx usr/include/opencascade/Geom2dInt_TheLocateExtPCOfTheProjPCurOfGInter.hxx usr/include/opencascade/Geom2dInt_ThePolygon2dOfTheIntPCurvePCurveOfGInter.hxx usr/include/opencascade/Geom2dInt_TheProjPCurOfGInter.hxx -usr/include/opencascade/GeomAPI.hxx usr/include/opencascade/GeomAPI_ExtremaCurveCurve.hxx usr/include/opencascade/GeomAPI_ExtremaCurveCurve.lxx usr/include/opencascade/GeomAPI_ExtremaCurveSurface.hxx usr/include/opencascade/GeomAPI_ExtremaCurveSurface.lxx usr/include/opencascade/GeomAPI_ExtremaSurfaceSurface.hxx usr/include/opencascade/GeomAPI_ExtremaSurfaceSurface.lxx +usr/include/opencascade/GeomAPI.hxx usr/include/opencascade/GeomAPI_IntCS.hxx +usr/include/opencascade/GeomAPI_Interpolate.hxx usr/include/opencascade/GeomAPI_IntSS.hxx usr/include/opencascade/GeomAPI_IntSS.lxx -usr/include/opencascade/GeomAPI_Interpolate.hxx usr/include/opencascade/GeomAPI_PointsToBSpline.hxx usr/include/opencascade/GeomAPI_PointsToBSplineSurface.hxx usr/include/opencascade/GeomAPI_ProjectPointOnCurve.hxx usr/include/opencascade/GeomAPI_ProjectPointOnCurve.lxx usr/include/opencascade/GeomAPI_ProjectPointOnSurf.hxx usr/include/opencascade/GeomAPI_ProjectPointOnSurf.lxx -usr/include/opencascade/GeomFill.hxx +usr/include/opencascade/GeomFill_ApproxStyle.hxx usr/include/opencascade/GeomFill_AppSurf.hxx usr/include/opencascade/GeomFill_AppSweep.hxx -usr/include/opencascade/GeomFill_ApproxStyle.hxx usr/include/opencascade/GeomFill_Array1OfLocationLaw.hxx usr/include/opencascade/GeomFill_Array1OfSectionLaw.hxx -usr/include/opencascade/GeomFill_BSplineCurves.hxx -usr/include/opencascade/GeomFill_BSplineCurves.lxx usr/include/opencascade/GeomFill_BezierCurves.hxx usr/include/opencascade/GeomFill_BezierCurves.lxx -usr/include/opencascade/GeomFill_BoundWithSurf.hxx usr/include/opencascade/GeomFill_Boundary.hxx +usr/include/opencascade/GeomFill_BoundWithSurf.hxx +usr/include/opencascade/GeomFill_BSplineCurves.hxx +usr/include/opencascade/GeomFill_BSplineCurves.lxx usr/include/opencascade/GeomFill_CircularBlendFunc.hxx usr/include/opencascade/GeomFill_ConstantBiNormal.hxx usr/include/opencascade/GeomFill_ConstrainedFilling.hxx -usr/include/opencascade/GeomFill_Coons.hxx usr/include/opencascade/GeomFill_CoonsAlgPatch.hxx +usr/include/opencascade/GeomFill_Coons.hxx usr/include/opencascade/GeomFill_CornerState.hxx usr/include/opencascade/GeomFill_CorrectedFrenet.hxx usr/include/opencascade/GeomFill_CurveAndTrihedron.hxx @@ -882,16 +944,17 @@ usr/include/opencascade/GeomFill_HArray1OfLocationLaw.hxx usr/include/opencascade/GeomFill_HArray1OfSectionLaw.hxx usr/include/opencascade/GeomFill_HSequenceOfAx2.hxx +usr/include/opencascade/GeomFill.hxx usr/include/opencascade/GeomFill_Line.hxx usr/include/opencascade/GeomFill_Line.lxx -usr/include/opencascade/GeomFill_LocFunction.hxx usr/include/opencascade/GeomFill_LocationDraft.hxx usr/include/opencascade/GeomFill_LocationGuide.hxx usr/include/opencascade/GeomFill_LocationLaw.hxx +usr/include/opencascade/GeomFill_LocFunction.hxx usr/include/opencascade/GeomFill_NSections.hxx +usr/include/opencascade/GeomFill_PipeError.hxx usr/include/opencascade/GeomFill_Pipe.hxx usr/include/opencascade/GeomFill_Pipe.lxx -usr/include/opencascade/GeomFill_PipeError.hxx usr/include/opencascade/GeomFill_PlanFunc.hxx usr/include/opencascade/GeomFill_PolynomialConvertor.hxx usr/include/opencascade/GeomFill_Profiler.hxx @@ -905,8 +968,8 @@ usr/include/opencascade/GeomFill_SimpleBound.hxx usr/include/opencascade/GeomFill_SnglrFunc.hxx usr/include/opencascade/GeomFill_Stretch.hxx -usr/include/opencascade/GeomFill_Sweep.hxx usr/include/opencascade/GeomFill_SweepFunction.hxx +usr/include/opencascade/GeomFill_Sweep.hxx usr/include/opencascade/GeomFill_SweepSectionGenerator.hxx usr/include/opencascade/GeomFill_SweepSectionGenerator.lxx usr/include/opencascade/GeomFill_Tensor.hxx @@ -917,27 +980,27 @@ usr/include/opencascade/GeomFill_TrihedronLaw.hxx usr/include/opencascade/GeomFill_TrihedronWithGuide.hxx usr/include/opencascade/GeomFill_UniformSection.hxx -usr/include/opencascade/GeomInt.hxx usr/include/opencascade/GeomInt_BSpGradient_BFGSOfMyBSplGradientOfTheComputeLineOfWLApprox.hxx usr/include/opencascade/GeomInt_BSpParFunctionOfMyBSplGradientOfTheComputeLineOfWLApprox.hxx usr/include/opencascade/GeomInt_BSpParLeastSquareOfMyBSplGradientOfTheComputeLineOfWLApprox.hxx -usr/include/opencascade/GeomInt_Gradient_BFGSOfMyGradientOfTheComputeLineBezierOfWLApprox.hxx usr/include/opencascade/GeomInt_Gradient_BFGSOfMyGradientbisOfTheComputeLineOfWLApprox.hxx +usr/include/opencascade/GeomInt_Gradient_BFGSOfMyGradientOfTheComputeLineBezierOfWLApprox.hxx +usr/include/opencascade/GeomInt.hxx usr/include/opencascade/GeomInt_IntSS.hxx usr/include/opencascade/GeomInt_IntSS.lxx usr/include/opencascade/GeomInt_LineConstructor.hxx usr/include/opencascade/GeomInt_LineConstructor.lxx usr/include/opencascade/GeomInt_LineTool.hxx usr/include/opencascade/GeomInt_MyBSplGradientOfTheComputeLineOfWLApprox.hxx -usr/include/opencascade/GeomInt_MyGradientOfTheComputeLineBezierOfWLApprox.hxx usr/include/opencascade/GeomInt_MyGradientbisOfTheComputeLineOfWLApprox.hxx -usr/include/opencascade/GeomInt_ParFunctionOfMyGradientOfTheComputeLineBezierOfWLApprox.hxx +usr/include/opencascade/GeomInt_MyGradientOfTheComputeLineBezierOfWLApprox.hxx +usr/include/opencascade/GeomInt_ParameterAndOrientation.hxx usr/include/opencascade/GeomInt_ParFunctionOfMyGradientbisOfTheComputeLineOfWLApprox.hxx -usr/include/opencascade/GeomInt_ParLeastSquareOfMyGradientOfTheComputeLineBezierOfWLApprox.hxx +usr/include/opencascade/GeomInt_ParFunctionOfMyGradientOfTheComputeLineBezierOfWLApprox.hxx usr/include/opencascade/GeomInt_ParLeastSquareOfMyGradientbisOfTheComputeLineOfWLApprox.hxx -usr/include/opencascade/GeomInt_ParameterAndOrientation.hxx -usr/include/opencascade/GeomInt_ResConstraintOfMyGradientOfTheComputeLineBezierOfWLApprox.hxx +usr/include/opencascade/GeomInt_ParLeastSquareOfMyGradientOfTheComputeLineBezierOfWLApprox.hxx usr/include/opencascade/GeomInt_ResConstraintOfMyGradientbisOfTheComputeLineOfWLApprox.hxx +usr/include/opencascade/GeomInt_ResConstraintOfMyGradientOfTheComputeLineBezierOfWLApprox.hxx usr/include/opencascade/GeomInt_SequenceOfParameterAndOrientation.hxx usr/include/opencascade/GeomInt_TheComputeLineBezierOfWLApprox.hxx usr/include/opencascade/GeomInt_TheComputeLineOfWLApprox.hxx @@ -968,7 +1031,24 @@ usr/include/opencascade/GeomPlate_SequenceOfCurveConstraint.hxx usr/include/opencascade/GeomPlate_SequenceOfPointConstraint.hxx usr/include/opencascade/GeomPlate_Surface.hxx -usr/include/opencascade/HLRAlgo.hxx +usr/include/opencascade/HatchGen_Domain.hxx +usr/include/opencascade/HatchGen_Domain.lxx +usr/include/opencascade/HatchGen_Domains.hxx +usr/include/opencascade/HatchGen_ErrorStatus.hxx +usr/include/opencascade/HatchGen_IntersectionPoint.hxx +usr/include/opencascade/HatchGen_IntersectionType.hxx +usr/include/opencascade/HatchGen_PointOnElement.hxx +usr/include/opencascade/HatchGen_PointOnElement.lxx +usr/include/opencascade/HatchGen_PointOnHatching.hxx +usr/include/opencascade/HatchGen_PointsOnElement.hxx +usr/include/opencascade/HatchGen_PointsOnHatching.hxx +usr/include/opencascade/Hatch_Hatcher.hxx +usr/include/opencascade/Hatch_Hatcher.lxx +usr/include/opencascade/Hatch_LineForm.hxx +usr/include/opencascade/Hatch_Line.hxx +usr/include/opencascade/Hatch_Parameter.hxx +usr/include/opencascade/Hatch_SequenceOfLine.hxx +usr/include/opencascade/Hatch_SequenceOfParameter.hxx usr/include/opencascade/HLRAlgo_Array1OfPHDat.hxx usr/include/opencascade/HLRAlgo_Array1OfPINod.hxx usr/include/opencascade/HLRAlgo_Array1OfPISeg.hxx @@ -977,12 +1057,13 @@ usr/include/opencascade/HLRAlgo_Coincidence.hxx usr/include/opencascade/HLRAlgo_EdgeIterator.hxx usr/include/opencascade/HLRAlgo_EdgeIterator.lxx -usr/include/opencascade/HLRAlgo_EdgeStatus.hxx usr/include/opencascade/HLRAlgo_EdgesBlock.hxx +usr/include/opencascade/HLRAlgo_EdgeStatus.hxx usr/include/opencascade/HLRAlgo_HArray1OfPHDat.hxx usr/include/opencascade/HLRAlgo_HArray1OfPINod.hxx usr/include/opencascade/HLRAlgo_HArray1OfPISeg.hxx usr/include/opencascade/HLRAlgo_HArray1OfTData.hxx +usr/include/opencascade/HLRAlgo.hxx usr/include/opencascade/HLRAlgo_Interference.hxx usr/include/opencascade/HLRAlgo_InterferenceList.hxx usr/include/opencascade/HLRAlgo_Intersection.hxx @@ -1007,21 +1088,20 @@ usr/include/opencascade/HLRAlgo_TriangleData.hxx usr/include/opencascade/HLRAlgo_WiresBlock.hxx usr/include/opencascade/HLRAppli_ReflectLines.hxx -usr/include/opencascade/HLRBRep.hxx usr/include/opencascade/HLRBRep_Algo.hxx usr/include/opencascade/HLRBRep_AreaLimit.hxx usr/include/opencascade/HLRBRep_Array1OfEData.hxx usr/include/opencascade/HLRBRep_Array1OfFData.hxx usr/include/opencascade/HLRBRep_BCurveTool.hxx usr/include/opencascade/HLRBRep_BCurveTool.lxx -usr/include/opencascade/HLRBRep_BSurfaceTool.hxx -usr/include/opencascade/HLRBRep_BSurfaceTool.lxx usr/include/opencascade/HLRBRep_BiPnt2D.hxx usr/include/opencascade/HLRBRep_BiPoint.hxx +usr/include/opencascade/HLRBRep_BSurfaceTool.hxx +usr/include/opencascade/HLRBRep_BSurfaceTool.lxx usr/include/opencascade/HLRBRep_CInter.hxx -usr/include/opencascade/HLRBRep_CLProps.hxx usr/include/opencascade/HLRBRep_CLPropsATool.hxx usr/include/opencascade/HLRBRep_CLPropsATool.lxx +usr/include/opencascade/HLRBRep_CLProps.hxx usr/include/opencascade/HLRBRep_Curve.hxx usr/include/opencascade/HLRBRep_Curve.lxx usr/include/opencascade/HLRBRep_CurveTool.hxx @@ -1040,9 +1120,10 @@ usr/include/opencascade/HLRBRep_FaceData.lxx usr/include/opencascade/HLRBRep_FaceIterator.hxx usr/include/opencascade/HLRBRep_FaceIterator.lxx +usr/include/opencascade/HLRBRep_Hider.hxx usr/include/opencascade/HLRBRep_HLRToShape.hxx usr/include/opencascade/HLRBRep_HLRToShape.lxx -usr/include/opencascade/HLRBRep_Hider.hxx +usr/include/opencascade/HLRBRep.hxx usr/include/opencascade/HLRBRep_IntConicCurveOfCInter.hxx usr/include/opencascade/HLRBRep_InterCSurf.hxx usr/include/opencascade/HLRBRep_InternalAlgo.hxx @@ -1056,16 +1137,15 @@ usr/include/opencascade/HLRBRep_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfCInter.hxx usr/include/opencascade/HLRBRep_PCLocFOfTheLocateExtPCOfTheProjPCurOfCInter.hxx usr/include/opencascade/HLRBRep_PolyAlgo.hxx -usr/include/opencascade/HLRBRep_PolyAlgo.lxx usr/include/opencascade/HLRBRep_PolyHLRToShape.hxx usr/include/opencascade/HLRBRep_PolyHLRToShape.lxx -usr/include/opencascade/HLRBRep_SLProps.hxx -usr/include/opencascade/HLRBRep_SLPropsATool.hxx -usr/include/opencascade/HLRBRep_SLPropsATool.lxx usr/include/opencascade/HLRBRep_SeqOfShapeBounds.hxx usr/include/opencascade/HLRBRep_ShapeBounds.hxx usr/include/opencascade/HLRBRep_ShapeBounds.lxx usr/include/opencascade/HLRBRep_ShapeToHLR.hxx +usr/include/opencascade/HLRBRep_SLPropsATool.hxx +usr/include/opencascade/HLRBRep_SLPropsATool.lxx +usr/include/opencascade/HLRBRep_SLProps.hxx usr/include/opencascade/HLRBRep_Surface.hxx usr/include/opencascade/HLRBRep_Surface.lxx usr/include/opencascade/HLRBRep_SurfaceTool.hxx @@ -1075,9 +1155,9 @@ usr/include/opencascade/HLRBRep_TheDistBetweenPCurvesOfTheIntPCurvePCurveOfCInter.hxx usr/include/opencascade/HLRBRep_TheExactInterCSurf.hxx usr/include/opencascade/HLRBRep_TheIntConicCurveOfCInter.hxx -usr/include/opencascade/HLRBRep_TheIntPCurvePCurveOfCInter.hxx usr/include/opencascade/HLRBRep_TheInterferenceOfInterCSurf.hxx usr/include/opencascade/HLRBRep_TheIntersectorOfTheIntConicCurveOfCInter.hxx +usr/include/opencascade/HLRBRep_TheIntPCurvePCurveOfCInter.hxx usr/include/opencascade/HLRBRep_TheLocateExtPCOfTheProjPCurOfCInter.hxx usr/include/opencascade/HLRBRep_ThePolygon2dOfTheIntPCurvePCurveOfCInter.hxx usr/include/opencascade/HLRBRep_ThePolygonOfInterCSurf.hxx @@ -1089,12 +1169,12 @@ usr/include/opencascade/HLRBRep_TheQuadCurvFuncOfTheQuadCurvExactInterCSurf.hxx usr/include/opencascade/HLRBRep_TypeOfResultingEdge.hxx usr/include/opencascade/HLRBRep_VertexList.hxx -usr/include/opencascade/HLRTopoBRep_DSFiller.hxx usr/include/opencascade/HLRTopoBRep_Data.hxx usr/include/opencascade/HLRTopoBRep_Data.lxx usr/include/opencascade/HLRTopoBRep_DataMapIteratorOfDataMapOfShapeFaceData.hxx usr/include/opencascade/HLRTopoBRep_DataMapIteratorOfMapOfShapeListOfVData.hxx usr/include/opencascade/HLRTopoBRep_DataMapOfShapeFaceData.hxx +usr/include/opencascade/HLRTopoBRep_DSFiller.hxx usr/include/opencascade/HLRTopoBRep_FaceData.hxx usr/include/opencascade/HLRTopoBRep_FaceData.lxx usr/include/opencascade/HLRTopoBRep_FaceIsoLiner.hxx @@ -1105,24 +1185,54 @@ usr/include/opencascade/HLRTopoBRep_OutLiner.lxx usr/include/opencascade/HLRTopoBRep_VData.hxx usr/include/opencascade/HLRTopoBRep_VData.lxx -usr/include/opencascade/HatchGen_Domain.hxx -usr/include/opencascade/HatchGen_Domain.lxx -usr/include/opencascade/HatchGen_Domains.hxx -usr/include/opencascade/HatchGen_ErrorStatus.hxx -usr/include/opencascade/HatchGen_IntersectionPoint.hxx -usr/include/opencascade/HatchGen_IntersectionType.hxx -usr/include/opencascade/HatchGen_PointOnElement.hxx -usr/include/opencascade/HatchGen_PointOnElement.lxx -usr/include/opencascade/HatchGen_PointOnHatching.hxx -usr/include/opencascade/HatchGen_PointsOnElement.hxx -usr/include/opencascade/HatchGen_PointsOnHatching.hxx -usr/include/opencascade/Hatch_Hatcher.hxx -usr/include/opencascade/Hatch_Hatcher.lxx -usr/include/opencascade/Hatch_Line.hxx -usr/include/opencascade/Hatch_LineForm.hxx -usr/include/opencascade/Hatch_Parameter.hxx -usr/include/opencascade/Hatch_SequenceOfLine.hxx -usr/include/opencascade/Hatch_SequenceOfParameter.hxx +usr/include/opencascade/IMeshData_Curve.hxx +usr/include/opencascade/IMeshData_Edge.hxx +usr/include/opencascade/IMeshData_Face.hxx +usr/include/opencascade/IMeshData_Model.hxx +usr/include/opencascade/IMeshData_ParametersListArrayAdaptor.hxx +usr/include/opencascade/IMeshData_ParametersList.hxx +usr/include/opencascade/IMeshData_PCurve.hxx +usr/include/opencascade/IMeshData_Shape.hxx +usr/include/opencascade/IMeshData_Status.hxx +usr/include/opencascade/IMeshData_StatusOwner.hxx +usr/include/opencascade/IMeshData_TessellatedShape.hxx +usr/include/opencascade/IMeshData_Types.hxx +usr/include/opencascade/IMeshData_Wire.hxx +usr/include/opencascade/IMeshTools_Context.hxx +usr/include/opencascade/IMeshTools_CurveTessellator.hxx +usr/include/opencascade/IMeshTools_MeshAlgoFactory.hxx +usr/include/opencascade/IMeshTools_MeshAlgo.hxx +usr/include/opencascade/IMeshTools_MeshAlgoType.hxx +usr/include/opencascade/IMeshTools_MeshBuilder.hxx +usr/include/opencascade/IMeshTools_ModelAlgo.hxx +usr/include/opencascade/IMeshTools_ModelBuilder.hxx +usr/include/opencascade/IMeshTools_Parameters.hxx +usr/include/opencascade/IMeshTools_ShapeExplorer.hxx +usr/include/opencascade/IMeshTools_ShapeVisitor.hxx +usr/include/opencascade/IntCurve_DistBetweenPCurvesGen.gxx +usr/include/opencascade/IntCurve_ExactIntersectionPoint.gxx +usr/include/opencascade/IntCurve_IConicTool.hxx +usr/include/opencascade/IntCurve_IntConicConic.hxx +usr/include/opencascade/IntCurve_IntConicConic.lxx +usr/include/opencascade/IntCurve_IntConicConic_Tool.hxx +usr/include/opencascade/IntCurve_IntConicCurveGen.gxx +usr/include/opencascade/IntCurve_IntConicCurveGen.lxx +usr/include/opencascade/IntCurve_IntCurveCurveGen.gxx +usr/include/opencascade/IntCurve_IntCurveCurveGen.lxx +usr/include/opencascade/IntCurve_IntImpConicParConic.hxx +usr/include/opencascade/IntCurve_IntPolyPolyGen.gxx +usr/include/opencascade/IntCurve_MyImpParToolOfIntImpConicParConic.hxx +usr/include/opencascade/IntCurve_PConic.hxx +usr/include/opencascade/IntCurve_PConic.lxx +usr/include/opencascade/IntCurve_PConicTool.hxx +usr/include/opencascade/IntCurve_Polygon2dGen.gxx +usr/include/opencascade/IntCurve_Polygon2dGen.lxx +usr/include/opencascade/IntCurve_ProjectOnPConicTool.hxx +usr/include/opencascade/IntCurve_ProjPCurGen.gxx +usr/include/opencascade/IntCurvesFace_Intersector.hxx +usr/include/opencascade/IntCurvesFace_Intersector.lxx +usr/include/opencascade/IntCurvesFace_ShapeIntersector.hxx +usr/include/opencascade/IntCurvesFace_ShapeIntersector.lxx usr/include/opencascade/IntCurveSurface_HCurveTool.gxx usr/include/opencascade/IntCurveSurface_HCurveTool.lxx usr/include/opencascade/IntCurveSurface_HInter.hxx @@ -1154,62 +1264,54 @@ usr/include/opencascade/IntCurveSurface_TheQuadCurvExactHInter.hxx usr/include/opencascade/IntCurveSurface_TheQuadCurvFuncOfTheQuadCurvExactHInter.hxx usr/include/opencascade/IntCurveSurface_TransitionOnCurve.hxx -usr/include/opencascade/IntCurve_DistBetweenPCurvesGen.gxx -usr/include/opencascade/IntCurve_ExactIntersectionPoint.gxx -usr/include/opencascade/IntCurve_IConicTool.hxx -usr/include/opencascade/IntCurve_IntConicConic.hxx -usr/include/opencascade/IntCurve_IntConicConic.lxx -usr/include/opencascade/IntCurve_IntConicConic_Tool.hxx -usr/include/opencascade/IntCurve_IntConicCurveGen.gxx -usr/include/opencascade/IntCurve_IntConicCurveGen.lxx -usr/include/opencascade/IntCurve_IntCurveCurveGen.gxx -usr/include/opencascade/IntCurve_IntCurveCurveGen.lxx -usr/include/opencascade/IntCurve_IntImpConicParConic.hxx -usr/include/opencascade/IntCurve_IntPolyPolyGen.gxx -usr/include/opencascade/IntCurve_MyImpParToolOfIntImpConicParConic.hxx -usr/include/opencascade/IntCurve_PConic.hxx -usr/include/opencascade/IntCurve_PConic.lxx -usr/include/opencascade/IntCurve_PConicTool.hxx -usr/include/opencascade/IntCurve_Polygon2dGen.gxx -usr/include/opencascade/IntCurve_Polygon2dGen.lxx -usr/include/opencascade/IntCurve_ProjPCurGen.gxx -usr/include/opencascade/IntCurve_ProjectOnPConicTool.hxx usr/include/opencascade/IntCurve_UserIntConicCurveGen.gxx -usr/include/opencascade/IntCurvesFace_Intersector.hxx -usr/include/opencascade/IntCurvesFace_Intersector.lxx -usr/include/opencascade/IntCurvesFace_ShapeIntersector.hxx -usr/include/opencascade/IntCurvesFace_ShapeIntersector.lxx -usr/include/opencascade/IntImpParGen.hxx -usr/include/opencascade/IntImpParGen_ImpParTool.gxx -usr/include/opencascade/IntImpParGen_ImpTool.hxx -usr/include/opencascade/IntImpParGen_Intersector.gxx -usr/include/opencascade/IntImpParGen_Tool.hxx -usr/include/opencascade/IntImp_ComputeTangence.hxx -usr/include/opencascade/IntImp_ConstIsoparametric.hxx -usr/include/opencascade/IntImp_Int2S.gxx -usr/include/opencascade/IntImp_Int2S.lxx -usr/include/opencascade/IntImp_IntCS.gxx -usr/include/opencascade/IntImp_ZerCSParFunc.gxx -usr/include/opencascade/IntImp_ZerImpFunc.gxx -usr/include/opencascade/IntImp_ZerImpFunc.lxx -usr/include/opencascade/IntImp_ZerParFunc.gxx -usr/include/opencascade/IntImp_ZerParFunc.lxx -usr/include/opencascade/IntPatch_ALine.hxx -usr/include/opencascade/IntPatch_ALine.lxx -usr/include/opencascade/IntPatch_ALineToWLine.hxx -usr/include/opencascade/IntPatch_ArcFunction.hxx -usr/include/opencascade/IntPatch_ArcFunction.lxx -usr/include/opencascade/IntPatch_CSFunction.hxx -usr/include/opencascade/IntPatch_CurvIntSurf.hxx -usr/include/opencascade/IntPatch_GLine.hxx +usr/include/opencascade/Intf_Array1OfLin.hxx +usr/include/opencascade/Intf.hxx +usr/include/opencascade/Intf_Interference.hxx +usr/include/opencascade/Intf_Interference.lxx +usr/include/opencascade/Intf_InterferencePolygon2d.hxx +usr/include/opencascade/Intf_InterferencePolygonPolyhedron.gxx +usr/include/opencascade/Intf_PIType.hxx +usr/include/opencascade/Intf_Polygon2d.hxx +usr/include/opencascade/Intf_Polygon2d.lxx +usr/include/opencascade/Intf_SectionLine.hxx +usr/include/opencascade/Intf_SectionLine.lxx +usr/include/opencascade/Intf_SectionPoint.hxx +usr/include/opencascade/Intf_SectionPoint.lxx +usr/include/opencascade/Intf_SeqOfSectionLine.hxx +usr/include/opencascade/Intf_SeqOfSectionPoint.hxx +usr/include/opencascade/Intf_SeqOfTangentZone.hxx +usr/include/opencascade/Intf_TangentZone.hxx +usr/include/opencascade/Intf_TangentZone.lxx +usr/include/opencascade/Intf_Tool.hxx +usr/include/opencascade/IntImp_ComputeTangence.hxx +usr/include/opencascade/IntImp_ConstIsoparametric.hxx +usr/include/opencascade/IntImp_Int2S.gxx +usr/include/opencascade/IntImp_Int2S.lxx +usr/include/opencascade/IntImp_IntCS.gxx +usr/include/opencascade/IntImpParGen.hxx +usr/include/opencascade/IntImpParGen_ImpParTool.gxx +usr/include/opencascade/IntImpParGen_ImpTool.hxx +usr/include/opencascade/IntImpParGen_Intersector.gxx +usr/include/opencascade/IntImpParGen_Tool.hxx +usr/include/opencascade/IntImp_ZerCSParFunc.gxx +usr/include/opencascade/IntImp_ZerImpFunc.gxx +usr/include/opencascade/IntImp_ZerImpFunc.lxx +usr/include/opencascade/IntImp_ZerParFunc.gxx +usr/include/opencascade/IntImp_ZerParFunc.lxx +usr/include/opencascade/IntPatch_ALine.hxx +usr/include/opencascade/IntPatch_ALine.lxx +usr/include/opencascade/IntPatch_ALineToWLine.hxx +usr/include/opencascade/IntPatch_ArcFunction.hxx +usr/include/opencascade/IntPatch_ArcFunction.lxx +usr/include/opencascade/IntPatch_CSFunction.hxx +usr/include/opencascade/IntPatch_CurvIntSurf.hxx +usr/include/opencascade/IntPatch_GLine.hxx usr/include/opencascade/IntPatch_GLine.lxx usr/include/opencascade/IntPatch_HCurve2dTool.hxx usr/include/opencascade/IntPatch_HCurve2dTool.lxx usr/include/opencascade/IntPatch_HInterTool.hxx usr/include/opencascade/IntPatch_HInterTool.lxx -usr/include/opencascade/IntPatch_IType.hxx -usr/include/opencascade/IntPatch_ImpImpIntersection.hxx -usr/include/opencascade/IntPatch_ImpImpIntersection.lxx usr/include/opencascade/IntPatch_ImpImpIntersection_0.gxx usr/include/opencascade/IntPatch_ImpImpIntersection_1.gxx usr/include/opencascade/IntPatch_ImpImpIntersection_2.gxx @@ -1217,24 +1319,27 @@ usr/include/opencascade/IntPatch_ImpImpIntersection_4.gxx usr/include/opencascade/IntPatch_ImpImpIntersection_5.gxx usr/include/opencascade/IntPatch_ImpImpIntersection_6.gxx +usr/include/opencascade/IntPatch_ImpImpIntersection.hxx +usr/include/opencascade/IntPatch_ImpImpIntersection.lxx usr/include/opencascade/IntPatch_ImpPrmIntersection.hxx usr/include/opencascade/IntPatch_ImpPrmIntersection.lxx usr/include/opencascade/IntPatch_InterferencePolyhedron.hxx usr/include/opencascade/IntPatch_Intersection.hxx usr/include/opencascade/IntPatch_Intersection.lxx +usr/include/opencascade/IntPatch_IType.hxx +usr/include/opencascade/IntPatch_LineConstructor.hxx usr/include/opencascade/IntPatch_Line.hxx usr/include/opencascade/IntPatch_Line.lxx -usr/include/opencascade/IntPatch_LineConstructor.hxx usr/include/opencascade/IntPatch_Point.hxx -usr/include/opencascade/IntPatch_Point.lxx usr/include/opencascade/IntPatch_PointLine.hxx +usr/include/opencascade/IntPatch_Point.lxx usr/include/opencascade/IntPatch_PolyArc.hxx -usr/include/opencascade/IntPatch_PolyLine.hxx usr/include/opencascade/IntPatch_Polygo.hxx usr/include/opencascade/IntPatch_Polygo.lxx usr/include/opencascade/IntPatch_Polyhedron.hxx usr/include/opencascade/IntPatch_PolyhedronTool.hxx usr/include/opencascade/IntPatch_PolyhedronTool.lxx +usr/include/opencascade/IntPatch_PolyLine.hxx usr/include/opencascade/IntPatch_PrmPrmIntersection.hxx usr/include/opencascade/IntPatch_PrmPrmIntersection.lxx usr/include/opencascade/IntPatch_PrmPrmIntersection_T3Bits.hxx @@ -1248,20 +1353,21 @@ usr/include/opencascade/IntPatch_SequenceOfPathPointOfTheSOnBounds.hxx usr/include/opencascade/IntPatch_SequenceOfPoint.hxx usr/include/opencascade/IntPatch_SequenceOfSegmentOfTheSOnBounds.hxx -usr/include/opencascade/IntPatch_SpecPntType.hxx usr/include/opencascade/IntPatch_SpecialPoints.hxx -usr/include/opencascade/IntPatch_TheIWLineOfTheIWalking.hxx +usr/include/opencascade/IntPatch_SpecPntType.hxx usr/include/opencascade/IntPatch_TheIWalking.hxx +usr/include/opencascade/IntPatch_TheIWLineOfTheIWalking.hxx usr/include/opencascade/IntPatch_ThePathPointOfTheSOnBounds.hxx -usr/include/opencascade/IntPatch_TheSOnBounds.hxx usr/include/opencascade/IntPatch_TheSearchInside.hxx usr/include/opencascade/IntPatch_TheSegmentOfTheSOnBounds.hxx +usr/include/opencascade/IntPatch_TheSOnBounds.hxx usr/include/opencascade/IntPatch_TheSurfFunction.hxx usr/include/opencascade/IntPatch_WLine.hxx usr/include/opencascade/IntPatch_WLine.lxx usr/include/opencascade/IntPatch_WLineTool.hxx usr/include/opencascade/IntPolyh_Array.hxx usr/include/opencascade/IntPolyh_ArrayOfEdges.hxx +usr/include/opencascade/IntPolyh_ArrayOfPointNormal.hxx usr/include/opencascade/IntPolyh_ArrayOfPoints.hxx usr/include/opencascade/IntPolyh_ArrayOfSectionLines.hxx usr/include/opencascade/IntPolyh_ArrayOfTangentZones.hxx @@ -1277,6 +1383,7 @@ usr/include/opencascade/IntPolyh_SectionLine.hxx usr/include/opencascade/IntPolyh_SeqOfStartPoints.hxx usr/include/opencascade/IntPolyh_StartPoint.hxx +usr/include/opencascade/IntPolyh_Tools.hxx usr/include/opencascade/IntPolyh_Triangle.hxx usr/include/opencascade/IntRes2d_Domain.hxx usr/include/opencascade/IntRes2d_Domain.lxx @@ -1293,19 +1400,25 @@ usr/include/opencascade/IntRes2d_Transition.hxx usr/include/opencascade/IntRes2d_Transition.lxx usr/include/opencascade/IntRes2d_TypeTrans.hxx +usr/include/opencascade/Intrv_Interval.hxx +usr/include/opencascade/Intrv_Interval.lxx +usr/include/opencascade/Intrv_Intervals.hxx +usr/include/opencascade/Intrv_Intervals.lxx +usr/include/opencascade/Intrv_Position.hxx +usr/include/opencascade/Intrv_SequenceOfInterval.hxx usr/include/opencascade/IntStart_PathPoint.gxx usr/include/opencascade/IntStart_PathPoint.lxx -usr/include/opencascade/IntStart_SITopolTool.hxx usr/include/opencascade/IntStart_SearchInside.gxx usr/include/opencascade/IntStart_SearchInside.lxx usr/include/opencascade/IntStart_SearchOnBoundaries.gxx usr/include/opencascade/IntStart_SearchOnBoundaries.lxx usr/include/opencascade/IntStart_Segment.gxx usr/include/opencascade/IntStart_Segment.lxx -usr/include/opencascade/IntSurf.hxx +usr/include/opencascade/IntStart_SITopolTool.hxx usr/include/opencascade/IntSurf_Allocator.hxx usr/include/opencascade/IntSurf_Couple.hxx usr/include/opencascade/IntSurf_Couple.lxx +usr/include/opencascade/IntSurf.hxx usr/include/opencascade/IntSurf_InteriorPoint.hxx usr/include/opencascade/IntSurf_InteriorPoint.lxx usr/include/opencascade/IntSurf_InteriorPointTool.hxx @@ -1332,7 +1445,6 @@ usr/include/opencascade/IntSurf_Transition.hxx usr/include/opencascade/IntSurf_Transition.lxx usr/include/opencascade/IntSurf_TypeTrans.hxx -usr/include/opencascade/IntTools.hxx usr/include/opencascade/IntTools_Array1OfRange.hxx usr/include/opencascade/IntTools_Array1OfRoots.hxx usr/include/opencascade/IntTools_BaseRangeSample.hxx @@ -1358,8 +1470,9 @@ usr/include/opencascade/IntTools_EdgeEdge.hxx usr/include/opencascade/IntTools_EdgeEdge.lxx usr/include/opencascade/IntTools_EdgeFace.hxx -usr/include/opencascade/IntTools_FClass2d.hxx usr/include/opencascade/IntTools_FaceFace.hxx +usr/include/opencascade/IntTools_FClass2d.hxx +usr/include/opencascade/IntTools.hxx usr/include/opencascade/IntTools_ListIteratorOfListOfBox.hxx usr/include/opencascade/IntTools_ListIteratorOfListOfCurveRangeSample.hxx usr/include/opencascade/IntTools_ListIteratorOfListOfSurfaceRangeSample.hxx @@ -1391,16 +1504,16 @@ usr/include/opencascade/IntTools_Tools.hxx usr/include/opencascade/IntTools_TopolTool.hxx usr/include/opencascade/IntTools_WLineTool.hxx -usr/include/opencascade/IntWalk_IWLine.gxx -usr/include/opencascade/IntWalk_IWLine.lxx -usr/include/opencascade/IntWalk_IWalking.gxx -usr/include/opencascade/IntWalk_IWalking.lxx usr/include/opencascade/IntWalk_IWalking_1.gxx usr/include/opencascade/IntWalk_IWalking_2.gxx usr/include/opencascade/IntWalk_IWalking_3.gxx usr/include/opencascade/IntWalk_IWalking_4.gxx usr/include/opencascade/IntWalk_IWalking_5.gxx usr/include/opencascade/IntWalk_IWalking_6.gxx +usr/include/opencascade/IntWalk_IWalking.gxx +usr/include/opencascade/IntWalk_IWalking.lxx +usr/include/opencascade/IntWalk_IWLine.gxx +usr/include/opencascade/IntWalk_IWLine.lxx usr/include/opencascade/IntWalk_PWalking.hxx usr/include/opencascade/IntWalk_PWalking.lxx usr/include/opencascade/IntWalk_StatusDeflection.hxx @@ -1408,45 +1521,23 @@ usr/include/opencascade/IntWalk_TheInt2S.hxx usr/include/opencascade/IntWalk_VectorOfInteger.hxx usr/include/opencascade/IntWalk_VectorOfWalkingData.hxx -usr/include/opencascade/Intf.hxx -usr/include/opencascade/Intf_Array1OfLin.hxx -usr/include/opencascade/Intf_Interference.hxx -usr/include/opencascade/Intf_Interference.lxx -usr/include/opencascade/Intf_InterferencePolygon2d.hxx -usr/include/opencascade/Intf_InterferencePolygonPolyhedron.gxx -usr/include/opencascade/Intf_PIType.hxx -usr/include/opencascade/Intf_Polygon2d.hxx -usr/include/opencascade/Intf_Polygon2d.lxx -usr/include/opencascade/Intf_SectionLine.hxx -usr/include/opencascade/Intf_SectionLine.lxx -usr/include/opencascade/Intf_SectionPoint.hxx -usr/include/opencascade/Intf_SectionPoint.lxx -usr/include/opencascade/Intf_SeqOfSectionLine.hxx -usr/include/opencascade/Intf_SeqOfSectionPoint.hxx -usr/include/opencascade/Intf_SeqOfTangentZone.hxx -usr/include/opencascade/Intf_TangentZone.hxx -usr/include/opencascade/Intf_TangentZone.lxx -usr/include/opencascade/Intf_Tool.hxx -usr/include/opencascade/Intrv_Interval.hxx -usr/include/opencascade/Intrv_Interval.lxx -usr/include/opencascade/Intrv_Intervals.hxx -usr/include/opencascade/Intrv_Intervals.lxx -usr/include/opencascade/Intrv_Position.hxx -usr/include/opencascade/Intrv_SequenceOfInterval.hxx -usr/include/opencascade/Law.hxx usr/include/opencascade/Law_BSpFunc.hxx usr/include/opencascade/Law_BSpline.hxx usr/include/opencascade/Law_BSplineKnotSplitting.hxx usr/include/opencascade/Law_Composite.hxx usr/include/opencascade/Law_Constant.hxx usr/include/opencascade/Law_Function.hxx -usr/include/opencascade/Law_Interpol.hxx +usr/include/opencascade/Law.hxx usr/include/opencascade/Law_Interpolate.hxx +usr/include/opencascade/Law_Interpol.hxx usr/include/opencascade/Law_Laws.hxx usr/include/opencascade/Law_Linear.hxx usr/include/opencascade/Law_ListIteratorOfLaws.hxx usr/include/opencascade/Law_S.hxx -usr/include/opencascade/LocOpe.hxx +usr/include/opencascade/LocalAnalysis_CurveContinuity.hxx +usr/include/opencascade/LocalAnalysis.hxx +usr/include/opencascade/LocalAnalysis_StatusErrorType.hxx +usr/include/opencascade/LocalAnalysis_SurfaceContinuity.hxx usr/include/opencascade/LocOpe_BuildShape.hxx usr/include/opencascade/LocOpe_BuildShape.lxx usr/include/opencascade/LocOpe_BuildWires.hxx @@ -1454,19 +1545,20 @@ usr/include/opencascade/LocOpe_CSIntersector.lxx usr/include/opencascade/LocOpe_CurveShapeIntersector.hxx usr/include/opencascade/LocOpe_CurveShapeIntersector.lxx -usr/include/opencascade/LocOpe_DPrism.hxx usr/include/opencascade/LocOpe_DataMapIteratorOfDataMapOfShapePnt.hxx usr/include/opencascade/LocOpe_DataMapOfShapePnt.hxx +usr/include/opencascade/LocOpe_DPrism.hxx usr/include/opencascade/LocOpe_FindEdges.hxx -usr/include/opencascade/LocOpe_FindEdges.lxx usr/include/opencascade/LocOpe_FindEdgesInFace.hxx usr/include/opencascade/LocOpe_FindEdgesInFace.lxx +usr/include/opencascade/LocOpe_FindEdges.lxx usr/include/opencascade/LocOpe_GeneratedShape.hxx usr/include/opencascade/LocOpe_Generator.hxx usr/include/opencascade/LocOpe_Generator.lxx usr/include/opencascade/LocOpe_GluedShape.hxx usr/include/opencascade/LocOpe_Gluer.hxx usr/include/opencascade/LocOpe_Gluer.lxx +usr/include/opencascade/LocOpe.hxx usr/include/opencascade/LocOpe_LinearForm.hxx usr/include/opencascade/LocOpe_LinearForm.lxx usr/include/opencascade/LocOpe_Operation.hxx @@ -1481,16 +1573,12 @@ usr/include/opencascade/LocOpe_SequenceOfPntFace.hxx usr/include/opencascade/LocOpe_SplitDrafts.hxx usr/include/opencascade/LocOpe_SplitDrafts.lxx -usr/include/opencascade/LocOpe_SplitShape.hxx -usr/include/opencascade/LocOpe_SplitShape.lxx usr/include/opencascade/LocOpe_Spliter.hxx usr/include/opencascade/LocOpe_Spliter.lxx +usr/include/opencascade/LocOpe_SplitShape.hxx +usr/include/opencascade/LocOpe_SplitShape.lxx usr/include/opencascade/LocOpe_WiresOnShape.hxx usr/include/opencascade/LocOpe_WiresOnShape.lxx -usr/include/opencascade/LocalAnalysis.hxx -usr/include/opencascade/LocalAnalysis_CurveContinuity.hxx -usr/include/opencascade/LocalAnalysis_StatusErrorType.hxx -usr/include/opencascade/LocalAnalysis_SurfaceContinuity.hxx usr/include/opencascade/MAT2d_Array2OfConnexion.hxx usr/include/opencascade/MAT2d_BiInt.hxx usr/include/opencascade/MAT2d_Circuit.hxx @@ -1568,12 +1656,12 @@ usr/include/opencascade/Plate_GtoCConstraint.hxx usr/include/opencascade/Plate_GtoCConstraint.lxx usr/include/opencascade/Plate_HArray1OfPinpointConstraint.hxx -usr/include/opencascade/Plate_LineConstraint.hxx -usr/include/opencascade/Plate_LineConstraint.lxx usr/include/opencascade/Plate_LinearScalarConstraint.hxx usr/include/opencascade/Plate_LinearScalarConstraint.lxx usr/include/opencascade/Plate_LinearXYZConstraint.hxx usr/include/opencascade/Plate_LinearXYZConstraint.lxx +usr/include/opencascade/Plate_LineConstraint.hxx +usr/include/opencascade/Plate_LineConstraint.lxx usr/include/opencascade/Plate_PinpointConstraint.hxx usr/include/opencascade/Plate_PinpointConstraint.lxx usr/include/opencascade/Plate_PlaneConstraint.hxx @@ -1585,11 +1673,10 @@ usr/include/opencascade/Plate_SequenceOfLinearScalarConstraint.hxx usr/include/opencascade/Plate_SequenceOfLinearXYZConstraint.hxx usr/include/opencascade/Plate_SequenceOfPinpointConstraint.hxx -usr/include/opencascade/ShapeAlgo.hxx usr/include/opencascade/ShapeAlgo_AlgoContainer.hxx usr/include/opencascade/ShapeAlgo_AlgoContainer.lxx +usr/include/opencascade/ShapeAlgo.hxx usr/include/opencascade/ShapeAlgo_ToolContainer.hxx -usr/include/opencascade/ShapeAnalysis.hxx usr/include/opencascade/ShapeAnalysis_BoxBndTree.hxx usr/include/opencascade/ShapeAnalysis_CheckSmallFace.hxx usr/include/opencascade/ShapeAnalysis_CheckSmallFace.lxx @@ -1605,6 +1692,7 @@ usr/include/opencascade/ShapeAnalysis_FreeBoundsProperties.lxx usr/include/opencascade/ShapeAnalysis_Geom.hxx usr/include/opencascade/ShapeAnalysis_HSequenceOfFreeBounds.hxx +usr/include/opencascade/ShapeAnalysis.hxx usr/include/opencascade/ShapeAnalysis_SequenceOfFreeBounds.hxx usr/include/opencascade/ShapeAnalysis_ShapeContents.hxx usr/include/opencascade/ShapeAnalysis_ShapeContents.lxx @@ -1618,22 +1706,22 @@ usr/include/opencascade/ShapeAnalysis_Wire.lxx usr/include/opencascade/ShapeAnalysis_WireOrder.hxx usr/include/opencascade/ShapeAnalysis_WireVertex.hxx -usr/include/opencascade/ShapeBuild.hxx usr/include/opencascade/ShapeBuild_Edge.hxx +usr/include/opencascade/ShapeBuild.hxx usr/include/opencascade/ShapeBuild_ReShape.hxx usr/include/opencascade/ShapeBuild_Vertex.hxx -usr/include/opencascade/ShapeConstruct.hxx usr/include/opencascade/ShapeConstruct_Curve.hxx +usr/include/opencascade/ShapeConstruct.hxx usr/include/opencascade/ShapeConstruct_MakeTriangulation.hxx usr/include/opencascade/ShapeConstruct_ProjectCurveOnSurface.hxx -usr/include/opencascade/ShapeCustom.hxx usr/include/opencascade/ShapeCustom_BSplineRestriction.hxx usr/include/opencascade/ShapeCustom_BSplineRestriction.lxx usr/include/opencascade/ShapeCustom_ConvertToBSpline.hxx usr/include/opencascade/ShapeCustom_ConvertToRevolution.hxx -usr/include/opencascade/ShapeCustom_Curve.hxx usr/include/opencascade/ShapeCustom_Curve2d.hxx +usr/include/opencascade/ShapeCustom_Curve.hxx usr/include/opencascade/ShapeCustom_DirectModification.hxx +usr/include/opencascade/ShapeCustom.hxx usr/include/opencascade/ShapeCustom_Modification.hxx usr/include/opencascade/ShapeCustom_RestrictionParameters.hxx usr/include/opencascade/ShapeCustom_RestrictionParameters.lxx @@ -1641,7 +1729,6 @@ usr/include/opencascade/ShapeCustom_Surface.lxx usr/include/opencascade/ShapeCustom_SweptToElementary.hxx usr/include/opencascade/ShapeCustom_TrsfModification.hxx -usr/include/opencascade/ShapeExtend.hxx usr/include/opencascade/ShapeExtend_BasicMsgRegistrator.hxx usr/include/opencascade/ShapeExtend_ComplexCurve.hxx usr/include/opencascade/ShapeExtend_ComplexCurve.lxx @@ -1651,25 +1738,26 @@ usr/include/opencascade/ShapeExtend_DataMapOfShapeListOfMsg.hxx usr/include/opencascade/ShapeExtend_DataMapOfTransientListOfMsg.hxx usr/include/opencascade/ShapeExtend_Explorer.hxx +usr/include/opencascade/ShapeExtend.hxx usr/include/opencascade/ShapeExtend_MsgRegistrator.hxx usr/include/opencascade/ShapeExtend_MsgRegistrator.lxx usr/include/opencascade/ShapeExtend_Parametrisation.hxx usr/include/opencascade/ShapeExtend_Status.hxx usr/include/opencascade/ShapeExtend_WireData.hxx -usr/include/opencascade/ShapeFix.hxx usr/include/opencascade/ShapeFix_ComposeShell.hxx usr/include/opencascade/ShapeFix_DataMapIteratorOfDataMapOfShapeBox2d.hxx usr/include/opencascade/ShapeFix_DataMapOfShapeBox2d.hxx -usr/include/opencascade/ShapeFix_Edge.hxx usr/include/opencascade/ShapeFix_EdgeConnect.hxx +usr/include/opencascade/ShapeFix_Edge.hxx usr/include/opencascade/ShapeFix_EdgeProjAux.hxx +usr/include/opencascade/ShapeFix_FaceConnect.hxx usr/include/opencascade/ShapeFix_Face.hxx usr/include/opencascade/ShapeFix_Face.lxx -usr/include/opencascade/ShapeFix_FaceConnect.hxx usr/include/opencascade/ShapeFix_FixSmallFace.hxx usr/include/opencascade/ShapeFix_FixSmallSolid.hxx usr/include/opencascade/ShapeFix_FreeBounds.hxx usr/include/opencascade/ShapeFix_FreeBounds.lxx +usr/include/opencascade/ShapeFix.hxx usr/include/opencascade/ShapeFix_IntersectionTool.hxx usr/include/opencascade/ShapeFix_IntersectionTool.lxx usr/include/opencascade/ShapeFix_Root.hxx @@ -1683,21 +1771,20 @@ usr/include/opencascade/ShapeFix_Solid.hxx usr/include/opencascade/ShapeFix_SplitCommonVertex.hxx usr/include/opencascade/ShapeFix_SplitTool.hxx +usr/include/opencascade/ShapeFix_Wireframe.hxx +usr/include/opencascade/ShapeFix_Wireframe.lxx usr/include/opencascade/ShapeFix_Wire.hxx usr/include/opencascade/ShapeFix_Wire.lxx usr/include/opencascade/ShapeFix_WireSegment.hxx usr/include/opencascade/ShapeFix_WireVertex.hxx -usr/include/opencascade/ShapeFix_Wireframe.hxx -usr/include/opencascade/ShapeFix_Wireframe.lxx -usr/include/opencascade/ShapeProcess.hxx usr/include/opencascade/ShapeProcessAPI_ApplySequence.hxx usr/include/opencascade/ShapeProcess_Context.hxx +usr/include/opencascade/ShapeProcess.hxx +usr/include/opencascade/ShapeProcess_Operator.hxx usr/include/opencascade/ShapeProcess_OperFunc.hxx usr/include/opencascade/ShapeProcess_OperLibrary.hxx -usr/include/opencascade/ShapeProcess_Operator.hxx usr/include/opencascade/ShapeProcess_ShapeContext.hxx usr/include/opencascade/ShapeProcess_UOperator.hxx -usr/include/opencascade/ShapeUpgrade.hxx usr/include/opencascade/ShapeUpgrade_ClosedEdgeDivide.hxx usr/include/opencascade/ShapeUpgrade_ClosedFaceDivide.hxx usr/include/opencascade/ShapeUpgrade_ConvertCurve2dToBezier.hxx @@ -1707,43 +1794,44 @@ usr/include/opencascade/ShapeUpgrade_ConvertSurfaceToBezierBasis.lxx usr/include/opencascade/ShapeUpgrade_EdgeDivide.hxx usr/include/opencascade/ShapeUpgrade_EdgeDivide.lxx -usr/include/opencascade/ShapeUpgrade_FaceDivide.hxx usr/include/opencascade/ShapeUpgrade_FaceDivideArea.hxx usr/include/opencascade/ShapeUpgrade_FaceDivideArea.lxx +usr/include/opencascade/ShapeUpgrade_FaceDivide.hxx usr/include/opencascade/ShapeUpgrade_FixSmallBezierCurves.hxx usr/include/opencascade/ShapeUpgrade_FixSmallCurves.hxx +usr/include/opencascade/ShapeUpgrade.hxx usr/include/opencascade/ShapeUpgrade_RemoveInternalWires.hxx usr/include/opencascade/ShapeUpgrade_RemoveInternalWires.lxx usr/include/opencascade/ShapeUpgrade_RemoveLocations.hxx usr/include/opencascade/ShapeUpgrade_RemoveLocations.lxx usr/include/opencascade/ShapeUpgrade_ShapeConvertToBezier.hxx usr/include/opencascade/ShapeUpgrade_ShapeConvertToBezier.lxx -usr/include/opencascade/ShapeUpgrade_ShapeDivide.hxx usr/include/opencascade/ShapeUpgrade_ShapeDivideAngle.hxx usr/include/opencascade/ShapeUpgrade_ShapeDivideArea.hxx usr/include/opencascade/ShapeUpgrade_ShapeDivideArea.lxx -usr/include/opencascade/ShapeUpgrade_ShapeDivideClosed.hxx usr/include/opencascade/ShapeUpgrade_ShapeDivideClosedEdges.hxx +usr/include/opencascade/ShapeUpgrade_ShapeDivideClosed.hxx usr/include/opencascade/ShapeUpgrade_ShapeDivideContinuity.hxx +usr/include/opencascade/ShapeUpgrade_ShapeDivide.hxx usr/include/opencascade/ShapeUpgrade_ShellSewing.hxx -usr/include/opencascade/ShapeUpgrade_SplitCurve.hxx -usr/include/opencascade/ShapeUpgrade_SplitCurve2d.hxx usr/include/opencascade/ShapeUpgrade_SplitCurve2dContinuity.hxx -usr/include/opencascade/ShapeUpgrade_SplitCurve3d.hxx +usr/include/opencascade/ShapeUpgrade_SplitCurve2d.hxx usr/include/opencascade/ShapeUpgrade_SplitCurve3dContinuity.hxx -usr/include/opencascade/ShapeUpgrade_SplitSurface.hxx +usr/include/opencascade/ShapeUpgrade_SplitCurve3d.hxx +usr/include/opencascade/ShapeUpgrade_SplitCurve.hxx usr/include/opencascade/ShapeUpgrade_SplitSurfaceAngle.hxx usr/include/opencascade/ShapeUpgrade_SplitSurfaceArea.hxx usr/include/opencascade/ShapeUpgrade_SplitSurfaceArea.lxx usr/include/opencascade/ShapeUpgrade_SplitSurfaceContinuity.hxx +usr/include/opencascade/ShapeUpgrade_SplitSurface.hxx usr/include/opencascade/ShapeUpgrade_Tool.hxx usr/include/opencascade/ShapeUpgrade_Tool.lxx usr/include/opencascade/ShapeUpgrade_UnifySameDomain.hxx usr/include/opencascade/ShapeUpgrade_WireDivide.hxx usr/include/opencascade/Sweep_NumShape.hxx -usr/include/opencascade/Sweep_NumShape.lxx usr/include/opencascade/Sweep_NumShapeIterator.hxx usr/include/opencascade/Sweep_NumShapeIterator.lxx +usr/include/opencascade/Sweep_NumShape.lxx usr/include/opencascade/Sweep_NumShapeTool.hxx usr/include/opencascade/TopBas_Interference.gxx usr/include/opencascade/TopBas_Interference.lxx @@ -1759,7 +1847,9 @@ usr/include/opencascade/TopClass_SolidClassifier.gxx usr/include/opencascade/TopClass_SolidExplorer.hxx usr/include/opencascade/TopCnx_EdgeFaceTransition.hxx -usr/include/opencascade/TopOpeBRep.hxx +usr/include/opencascade/TopOpeBRep_Array1OfLineInter.hxx +usr/include/opencascade/TopOpeBRep_Array1OfVPointInter.hxx +usr/include/opencascade/TopOpeBRep_Bipoint.hxx usr/include/opencascade/TopOpeBRepBuild_Area1dBuilder.hxx usr/include/opencascade/TopOpeBRepBuild_Area2dBuilder.hxx usr/include/opencascade/TopOpeBRepBuild_Area3dBuilder.hxx @@ -1767,13 +1857,14 @@ usr/include/opencascade/TopOpeBRepBuild_BlockBuilder.hxx usr/include/opencascade/TopOpeBRepBuild_BlockIterator.hxx usr/include/opencascade/TopOpeBRepBuild_BlockIterator.lxx -usr/include/opencascade/TopOpeBRepBuild_Builder.hxx usr/include/opencascade/TopOpeBRepBuild_Builder1.hxx +usr/include/opencascade/TopOpeBRepBuild_Builder.hxx usr/include/opencascade/TopOpeBRepBuild_BuilderON.hxx usr/include/opencascade/TopOpeBRepBuild_CompositeClassifier.hxx usr/include/opencascade/TopOpeBRepBuild_CorrectFace2d.hxx usr/include/opencascade/TopOpeBRepBuild_DataMapIteratorOfDataMapOfShapeListOfShapeListOfShape.hxx usr/include/opencascade/TopOpeBRepBuild_DataMapOfShapeListOfShapeListOfShape.hxx +usr/include/opencascade/TopOpeBRepBuild_define.hxx usr/include/opencascade/TopOpeBRepBuild_EdgeBuilder.hxx usr/include/opencascade/TopOpeBRepBuild_FaceAreaBuilder.hxx usr/include/opencascade/TopOpeBRepBuild_FaceBuilder.hxx @@ -1784,6 +1875,7 @@ usr/include/opencascade/TopOpeBRepBuild_GTopo.hxx usr/include/opencascade/TopOpeBRepBuild_HBuilder.hxx usr/include/opencascade/TopOpeBRepBuild_IndexedDataMapOfShapeVertexInfo.hxx +usr/include/opencascade/TopOpeBRepBuild_kpresu.hxx usr/include/opencascade/TopOpeBRepBuild_ListIteratorOfListOfListOfLoop.hxx usr/include/opencascade/TopOpeBRepBuild_ListIteratorOfListOfLoop.hxx usr/include/opencascade/TopOpeBRepBuild_ListIteratorOfListOfPave.hxx @@ -1792,16 +1884,16 @@ usr/include/opencascade/TopOpeBRepBuild_ListOfLoop.hxx usr/include/opencascade/TopOpeBRepBuild_ListOfPave.hxx usr/include/opencascade/TopOpeBRepBuild_ListOfShapeListOfShape.hxx -usr/include/opencascade/TopOpeBRepBuild_Loop.hxx usr/include/opencascade/TopOpeBRepBuild_LoopClassifier.hxx usr/include/opencascade/TopOpeBRepBuild_LoopEnum.hxx +usr/include/opencascade/TopOpeBRepBuild_Loop.hxx usr/include/opencascade/TopOpeBRepBuild_LoopSet.hxx +usr/include/opencascade/TopOpeBRepBuild_PaveClassifier.hxx +usr/include/opencascade/TopOpeBRepBuild_Pave.hxx +usr/include/opencascade/TopOpeBRepBuild_PaveSet.hxx usr/include/opencascade/TopOpeBRepBuild_PBuilder.hxx usr/include/opencascade/TopOpeBRepBuild_PGTopo.hxx usr/include/opencascade/TopOpeBRepBuild_PWireEdgeSet.hxx -usr/include/opencascade/TopOpeBRepBuild_Pave.hxx -usr/include/opencascade/TopOpeBRepBuild_PaveClassifier.hxx -usr/include/opencascade/TopOpeBRepBuild_PaveSet.hxx usr/include/opencascade/TopOpeBRepBuild_ShapeListOfShape.hxx usr/include/opencascade/TopOpeBRepBuild_ShapeSet.hxx usr/include/opencascade/TopOpeBRepBuild_ShellFaceClassifier.hxx @@ -1809,27 +1901,28 @@ usr/include/opencascade/TopOpeBRepBuild_ShellToSolid.hxx usr/include/opencascade/TopOpeBRepBuild_SolidAreaBuilder.hxx usr/include/opencascade/TopOpeBRepBuild_SolidBuilder.hxx -usr/include/opencascade/TopOpeBRepBuild_Tools.hxx usr/include/opencascade/TopOpeBRepBuild_Tools2d.hxx +usr/include/opencascade/TopOpeBRepBuild_Tools.hxx usr/include/opencascade/TopOpeBRepBuild_VertexInfo.hxx usr/include/opencascade/TopOpeBRepBuild_WireEdgeClassifier.hxx usr/include/opencascade/TopOpeBRepBuild_WireEdgeSet.hxx usr/include/opencascade/TopOpeBRepBuild_WireToFace.hxx -usr/include/opencascade/TopOpeBRepBuild_define.hxx -usr/include/opencascade/TopOpeBRepBuild_kpresu.hxx -usr/include/opencascade/TopOpeBRepDS.hxx +usr/include/opencascade/TopOpeBRep_DataMapIteratorOfDataMapOfTopolTool.hxx +usr/include/opencascade/TopOpeBRep_DataMapOfTopolTool.hxx +usr/include/opencascade/TopOpeBRep_define.hxx +usr/include/opencascade/TopOpeBRep_DRAW.hxx usr/include/opencascade/TopOpeBRepDS_Array1OfDataMapOfIntegerListOfInterference.hxx usr/include/opencascade/TopOpeBRepDS_Association.hxx usr/include/opencascade/TopOpeBRepDS_BuildTool.hxx usr/include/opencascade/TopOpeBRepDS_Check.hxx usr/include/opencascade/TopOpeBRepDS_CheckStatus.hxx usr/include/opencascade/TopOpeBRepDS_Config.hxx -usr/include/opencascade/TopOpeBRepDS_Curve.hxx +usr/include/opencascade/TopOpeBRepDS_connex.hxx usr/include/opencascade/TopOpeBRepDS_CurveData.hxx usr/include/opencascade/TopOpeBRepDS_CurveExplorer.hxx +usr/include/opencascade/TopOpeBRepDS_Curve.hxx usr/include/opencascade/TopOpeBRepDS_CurveIterator.hxx usr/include/opencascade/TopOpeBRepDS_CurvePointInterference.hxx -usr/include/opencascade/TopOpeBRepDS_DRAW.hxx usr/include/opencascade/TopOpeBRepDS_DataMapIteratorOfDataMapOfCheckStatus.hxx usr/include/opencascade/TopOpeBRepDS_DataMapIteratorOfDataMapOfIntegerListOfInterference.hxx usr/include/opencascade/TopOpeBRepDS_DataMapIteratorOfDataMapOfInterferenceListOfInterference.hxx @@ -1848,24 +1941,28 @@ usr/include/opencascade/TopOpeBRepDS_DataMapOfShapeListOfShapeOn1State.hxx usr/include/opencascade/TopOpeBRepDS_DataMapOfShapeState.hxx usr/include/opencascade/TopOpeBRepDS_DataStructure.hxx +usr/include/opencascade/TopOpeBRepDS_define.hxx usr/include/opencascade/TopOpeBRepDS_DoubleMapIteratorOfDoubleMapOfIntegerShape.hxx usr/include/opencascade/TopOpeBRepDS_DoubleMapOfIntegerShape.hxx +usr/include/opencascade/TopOpeBRepDS_DRAW.hxx usr/include/opencascade/TopOpeBRepDS_Dumper.hxx -usr/include/opencascade/TopOpeBRepDS_EIR.hxx -usr/include/opencascade/TopOpeBRepDS_EXPORT.hxx usr/include/opencascade/TopOpeBRepDS_Edge3dInterferenceTool.hxx usr/include/opencascade/TopOpeBRepDS_EdgeInterferenceTool.hxx usr/include/opencascade/TopOpeBRepDS_EdgeVertexInterference.hxx +usr/include/opencascade/TopOpeBRepDS_EIR.hxx usr/include/opencascade/TopOpeBRepDS_Explorer.hxx -usr/include/opencascade/TopOpeBRepDS_FIR.hxx +usr/include/opencascade/TopOpeBRepDS_EXPORT.hxx usr/include/opencascade/TopOpeBRepDS_FaceEdgeInterference.hxx usr/include/opencascade/TopOpeBRepDS_FaceInterferenceTool.hxx +usr/include/opencascade/TopOpeBRep_DSFiller.hxx usr/include/opencascade/TopOpeBRepDS_Filter.hxx +usr/include/opencascade/TopOpeBRepDS_FIR.hxx usr/include/opencascade/TopOpeBRepDS_GapFiller.hxx usr/include/opencascade/TopOpeBRepDS_GapTool.hxx usr/include/opencascade/TopOpeBRepDS_GeometryData.hxx usr/include/opencascade/TopOpeBRepDS_HArray1OfDataMapOfIntegerListOfInterference.hxx usr/include/opencascade/TopOpeBRepDS_HDataStructure.hxx +usr/include/opencascade/TopOpeBRepDS.hxx usr/include/opencascade/TopOpeBRepDS_IndexedDataMapOfShapeWithState.hxx usr/include/opencascade/TopOpeBRepDS_IndexedDataMapOfVertexPoint.hxx usr/include/opencascade/TopOpeBRepDS_Interference.hxx @@ -1882,136 +1979,128 @@ usr/include/opencascade/TopOpeBRepDS_MapOfSurface.hxx usr/include/opencascade/TopOpeBRepDS_Marker.hxx usr/include/opencascade/TopOpeBRepDS_PDataStructure.hxx -usr/include/opencascade/TopOpeBRepDS_Point.hxx usr/include/opencascade/TopOpeBRepDS_PointData.hxx usr/include/opencascade/TopOpeBRepDS_PointExplorer.hxx +usr/include/opencascade/TopOpeBRepDS_Point.hxx usr/include/opencascade/TopOpeBRepDS_PointIterator.hxx usr/include/opencascade/TopOpeBRepDS_ProcessInterferencesTool.hxx usr/include/opencascade/TopOpeBRepDS_Reducer.hxx +usr/include/opencascade/TopOpeBRepDS_repvg.hxx +usr/include/opencascade/TopOpeBRepDS_samdom.hxx usr/include/opencascade/TopOpeBRepDS_ShapeData.hxx usr/include/opencascade/TopOpeBRepDS_ShapeShapeInterference.hxx usr/include/opencascade/TopOpeBRepDS_ShapeSurface.hxx usr/include/opencascade/TopOpeBRepDS_ShapeWithState.hxx usr/include/opencascade/TopOpeBRepDS_SolidSurfaceInterference.hxx -usr/include/opencascade/TopOpeBRepDS_Surface.hxx usr/include/opencascade/TopOpeBRepDS_SurfaceCurveInterference.hxx usr/include/opencascade/TopOpeBRepDS_SurfaceData.hxx usr/include/opencascade/TopOpeBRepDS_SurfaceExplorer.hxx +usr/include/opencascade/TopOpeBRepDS_Surface.hxx usr/include/opencascade/TopOpeBRepDS_SurfaceIterator.hxx usr/include/opencascade/TopOpeBRepDS_TKI.hxx usr/include/opencascade/TopOpeBRepDS_TOOL.hxx usr/include/opencascade/TopOpeBRepDS_Transition.hxx -usr/include/opencascade/TopOpeBRepDS_connex.hxx -usr/include/opencascade/TopOpeBRepDS_define.hxx -usr/include/opencascade/TopOpeBRepDS_repvg.hxx -usr/include/opencascade/TopOpeBRepDS_samdom.hxx -usr/include/opencascade/TopOpeBRepTool.hxx +usr/include/opencascade/TopOpeBRep_EdgesFiller.hxx +usr/include/opencascade/TopOpeBRep_EdgesIntersector.hxx +usr/include/opencascade/TopOpeBRep_FaceEdgeFiller.hxx +usr/include/opencascade/TopOpeBRep_FaceEdgeIntersector.hxx +usr/include/opencascade/TopOpeBRep_FacesFiller.hxx +usr/include/opencascade/TopOpeBRep_FacesIntersector.hxx +usr/include/opencascade/TopOpeBRep_FFDumper.hxx +usr/include/opencascade/TopOpeBRep_FFTransitionTool.hxx +usr/include/opencascade/TopOpeBRep_GeomTool.hxx +usr/include/opencascade/TopOpeBRep_HArray1OfLineInter.hxx +usr/include/opencascade/TopOpeBRep_HArray1OfVPointInter.hxx +usr/include/opencascade/TopOpeBRep_Hctxee2d.hxx +usr/include/opencascade/TopOpeBRep_Hctxff2d.hxx +usr/include/opencascade/TopOpeBRep.hxx +usr/include/opencascade/TopOpeBRep_LineInter.hxx +usr/include/opencascade/TopOpeBRep_LineInter.lxx +usr/include/opencascade/TopOpeBRep_ListIteratorOfListOfBipoint.hxx +usr/include/opencascade/TopOpeBRep_ListOfBipoint.hxx +usr/include/opencascade/TopOpeBRep_P2Dstatus.hxx +usr/include/opencascade/TopOpeBRep_PEdgesIntersector.hxx +usr/include/opencascade/TopOpeBRep_PFacesFiller.hxx +usr/include/opencascade/TopOpeBRep_PFacesIntersector.hxx +usr/include/opencascade/TopOpeBRep_PIntRes2d_IntersectionPoint.hxx +usr/include/opencascade/TopOpeBRep_PLineInter.hxx +usr/include/opencascade/TopOpeBRep_Point2d.hxx +usr/include/opencascade/TopOpeBRep_Point2d.lxx +usr/include/opencascade/TopOpeBRep_PointClassifier.hxx +usr/include/opencascade/TopOpeBRep_PointGeomTool.hxx +usr/include/opencascade/TopOpeBRep_PPntOn2S.hxx +usr/include/opencascade/TopOpeBRep_PThePointOfIntersection.hxx +usr/include/opencascade/TopOpeBRep_SequenceOfPoint2d.hxx +usr/include/opencascade/TopOpeBRep_ShapeIntersector2d.hxx +usr/include/opencascade/TopOpeBRep_ShapeIntersector.hxx +usr/include/opencascade/TopOpeBRep_ShapeScanner.hxx usr/include/opencascade/TopOpeBRepTool_2d.hxx usr/include/opencascade/TopOpeBRepTool_AncestorsTool.hxx +usr/include/opencascade/TopOpeBRepTool_box.hxx usr/include/opencascade/TopOpeBRepTool_BoxSort.hxx usr/include/opencascade/TopOpeBRepTool_C2DF.hxx usr/include/opencascade/TopOpeBRepTool_CLASSI.hxx +usr/include/opencascade/TopOpeBRepTool_connexity.hxx usr/include/opencascade/TopOpeBRepTool_CORRISO.hxx usr/include/opencascade/TopOpeBRepTool_CurveTool.hxx -usr/include/opencascade/TopOpeBRepTool_DRAW.hxx usr/include/opencascade/TopOpeBRepTool_DataMapIteratorOfDataMapOfOrientedShapeC2DF.hxx -usr/include/opencascade/TopOpeBRepTool_DataMapIteratorOfDataMapOfShapeListOfC2DF.hxx usr/include/opencascade/TopOpeBRepTool_DataMapIteratorOfDataMapOfShapeface.hxx +usr/include/opencascade/TopOpeBRepTool_DataMapIteratorOfDataMapOfShapeListOfC2DF.hxx usr/include/opencascade/TopOpeBRepTool_DataMapOfOrientedShapeC2DF.hxx -usr/include/opencascade/TopOpeBRepTool_DataMapOfShapeListOfC2DF.hxx usr/include/opencascade/TopOpeBRepTool_DataMapOfShapeface.hxx +usr/include/opencascade/TopOpeBRepTool_DataMapOfShapeListOfC2DF.hxx +usr/include/opencascade/TopOpeBRepTool_defineG.hxx +usr/include/opencascade/TopOpeBRepTool_define.hxx +usr/include/opencascade/TopOpeBRepTool_DRAW.hxx usr/include/opencascade/TopOpeBRepTool_EXPORT.hxx +usr/include/opencascade/TopOpeBRepTool_face.hxx usr/include/opencascade/TopOpeBRepTool_FuseEdges.hxx usr/include/opencascade/TopOpeBRepTool_GEOMETRY.hxx usr/include/opencascade/TopOpeBRepTool_GeomTool.hxx usr/include/opencascade/TopOpeBRepTool_HBoxTool.hxx -usr/include/opencascade/TopOpeBRepTool_IndexedDataMapOfShapeBox.hxx +usr/include/opencascade/TopOpeBRepTool.hxx usr/include/opencascade/TopOpeBRepTool_IndexedDataMapOfShapeBox2d.hxx +usr/include/opencascade/TopOpeBRepTool_IndexedDataMapOfShapeBox.hxx usr/include/opencascade/TopOpeBRepTool_IndexedDataMapOfShapeconnexity.hxx usr/include/opencascade/TopOpeBRepTool_IndexedDataMapOfSolidClassifier.hxx usr/include/opencascade/TopOpeBRepTool_KRO.hxx usr/include/opencascade/TopOpeBRepTool_ListIteratorOfListOfC2DF.hxx usr/include/opencascade/TopOpeBRepTool_ListOfC2DF.hxx +usr/include/opencascade/TopOpeBRepTool_makeTransition.hxx +usr/include/opencascade/TopOpeBRepTool_mkTondgE.hxx usr/include/opencascade/TopOpeBRepTool_OutCurveType.hxx +usr/include/opencascade/TopOpeBRepTool_Plos.hxx usr/include/opencascade/TopOpeBRepTool_PROJECT.hxx usr/include/opencascade/TopOpeBRepTool_PShapeClassifier.hxx usr/include/opencascade/TopOpeBRepTool_PSoClassif.hxx usr/include/opencascade/TopOpeBRepTool_PURGE.hxx -usr/include/opencascade/TopOpeBRepTool_Plos.hxx usr/include/opencascade/TopOpeBRepTool_PurgeInternalEdges.hxx usr/include/opencascade/TopOpeBRepTool_REGUS.hxx usr/include/opencascade/TopOpeBRepTool_REGUW.hxx usr/include/opencascade/TopOpeBRepTool_SC.hxx -usr/include/opencascade/TopOpeBRepTool_STATE.hxx usr/include/opencascade/TopOpeBRepTool_ShapeClassifier.hxx usr/include/opencascade/TopOpeBRepTool_ShapeExplorer.hxx usr/include/opencascade/TopOpeBRepTool_ShapeTool.hxx usr/include/opencascade/TopOpeBRepTool_SolidClassifier.hxx +usr/include/opencascade/TopOpeBRepTool_STATE.hxx +usr/include/opencascade/TopOpeBRepTool_tol.hxx usr/include/opencascade/TopOpeBRepTool_TOOL.hxx usr/include/opencascade/TopOpeBRepTool_TOPOLOGY.hxx -usr/include/opencascade/TopOpeBRepTool_box.hxx -usr/include/opencascade/TopOpeBRepTool_connexity.hxx -usr/include/opencascade/TopOpeBRepTool_define.hxx -usr/include/opencascade/TopOpeBRepTool_defineG.hxx -usr/include/opencascade/TopOpeBRepTool_face.hxx -usr/include/opencascade/TopOpeBRepTool_makeTransition.hxx -usr/include/opencascade/TopOpeBRepTool_mkTondgE.hxx -usr/include/opencascade/TopOpeBRepTool_tol.hxx -usr/include/opencascade/TopOpeBRep_Array1OfLineInter.hxx -usr/include/opencascade/TopOpeBRep_Array1OfVPointInter.hxx -usr/include/opencascade/TopOpeBRep_Bipoint.hxx -usr/include/opencascade/TopOpeBRep_DRAW.hxx -usr/include/opencascade/TopOpeBRep_DSFiller.hxx -usr/include/opencascade/TopOpeBRep_DataMapIteratorOfDataMapOfTopolTool.hxx -usr/include/opencascade/TopOpeBRep_DataMapOfTopolTool.hxx -usr/include/opencascade/TopOpeBRep_EdgesFiller.hxx -usr/include/opencascade/TopOpeBRep_EdgesIntersector.hxx -usr/include/opencascade/TopOpeBRep_FFDumper.hxx -usr/include/opencascade/TopOpeBRep_FFTransitionTool.hxx -usr/include/opencascade/TopOpeBRep_FaceEdgeFiller.hxx -usr/include/opencascade/TopOpeBRep_FaceEdgeIntersector.hxx -usr/include/opencascade/TopOpeBRep_FacesFiller.hxx -usr/include/opencascade/TopOpeBRep_FacesIntersector.hxx -usr/include/opencascade/TopOpeBRep_GeomTool.hxx -usr/include/opencascade/TopOpeBRep_HArray1OfLineInter.hxx -usr/include/opencascade/TopOpeBRep_HArray1OfVPointInter.hxx -usr/include/opencascade/TopOpeBRep_Hctxee2d.hxx -usr/include/opencascade/TopOpeBRep_Hctxff2d.hxx -usr/include/opencascade/TopOpeBRep_LineInter.hxx -usr/include/opencascade/TopOpeBRep_LineInter.lxx -usr/include/opencascade/TopOpeBRep_ListIteratorOfListOfBipoint.hxx -usr/include/opencascade/TopOpeBRep_ListOfBipoint.hxx -usr/include/opencascade/TopOpeBRep_P2Dstatus.hxx -usr/include/opencascade/TopOpeBRep_PEdgesIntersector.hxx -usr/include/opencascade/TopOpeBRep_PFacesFiller.hxx -usr/include/opencascade/TopOpeBRep_PFacesIntersector.hxx -usr/include/opencascade/TopOpeBRep_PIntRes2d_IntersectionPoint.hxx -usr/include/opencascade/TopOpeBRep_PLineInter.hxx -usr/include/opencascade/TopOpeBRep_PPntOn2S.hxx -usr/include/opencascade/TopOpeBRep_PThePointOfIntersection.hxx -usr/include/opencascade/TopOpeBRep_Point2d.hxx -usr/include/opencascade/TopOpeBRep_Point2d.lxx -usr/include/opencascade/TopOpeBRep_PointClassifier.hxx -usr/include/opencascade/TopOpeBRep_PointGeomTool.hxx -usr/include/opencascade/TopOpeBRep_SequenceOfPoint2d.hxx -usr/include/opencascade/TopOpeBRep_ShapeIntersector.hxx -usr/include/opencascade/TopOpeBRep_ShapeIntersector2d.hxx -usr/include/opencascade/TopOpeBRep_ShapeScanner.hxx +usr/include/opencascade/TopOpeBRep_traceSIFF.hxx usr/include/opencascade/TopOpeBRep_TypeLineCurve.hxx -usr/include/opencascade/TopOpeBRep_VPointInter.hxx -usr/include/opencascade/TopOpeBRep_VPointInter.lxx usr/include/opencascade/TopOpeBRep_VPointInterClassifier.hxx +usr/include/opencascade/TopOpeBRep_VPointInter.hxx usr/include/opencascade/TopOpeBRep_VPointInterIterator.hxx +usr/include/opencascade/TopOpeBRep_VPointInter.lxx usr/include/opencascade/TopOpeBRep_WPointInter.hxx usr/include/opencascade/TopOpeBRep_WPointInterIterator.hxx -usr/include/opencascade/TopOpeBRep_define.hxx -usr/include/opencascade/TopOpeBRep_traceSIFF.hxx usr/include/opencascade/TopTrans_Array2OfOrientation.hxx usr/include/opencascade/TopTrans_CurveTransition.hxx usr/include/opencascade/TopTrans_SurfaceTransition.hxx usr/include/opencascade/XBRepMesh.hxx -usr/lib/*/libTKBO.so +usr/lib/cmake/opencascade/OpenCASCADEModelingAlgorithmsTargets*.cmake usr/lib/*/libTKBool.so +usr/lib/*/libTKBO.so usr/lib/*/libTKFeat.so usr/lib/*/libTKFillet.so usr/lib/*/libTKGeomAlgo.so @@ -2022,90 +2111,3 @@ usr/lib/*/libTKShHealing.so usr/lib/*/libTKTopAlgo.so usr/lib/*/libTKXMesh.so -usr/lib/cmake/opencascade/OpenCASCADEModelingAlgorithmsTargets*.cmake -usr/include/opencascade/BOPAlgo_RemoveFeatures.hxx -usr/include/opencascade/BOPAlgo_ToolsProvider.hxx -usr/include/opencascade/BOPDS_DataMapOfIntegerListOfPaveBlock.hxx -usr/include/opencascade/BOPTools_BoxSelector.hxx -usr/include/opencascade/BOPTools_IndexedDataMapOfSetShape.hxx -usr/include/opencascade/BOPTools_Parallel.hxx -usr/include/opencascade/BRepAlgoAPI_Defeaturing.hxx -usr/include/opencascade/IntPolyh_ArrayOfPointNormal.hxx -usr/include/opencascade/IntPolyh_Tools.hxx -usr/include/opencascade/BOPAlgo_MakeConnected.hxx -usr/include/opencascade/BOPAlgo_MakePeriodic.hxx -usr/include/opencascade/BOPTools_BoxTree.hxx -usr/include/opencascade/BOPTools_PairSelector.hxx -usr/include/opencascade/BRepBlend_ConstThroat.hxx -usr/include/opencascade/BRepBlend_ConstThroatInv.hxx -usr/include/opencascade/BRepBlend_ConstThroatWithPenetration.hxx -usr/include/opencascade/BRepBlend_ConstThroatWithPenetrationInv.hxx -usr/include/opencascade/BRepFill_AdvancedEvolved.hxx -usr/include/opencascade/BRepGProp_MeshCinert.hxx -usr/include/opencascade/BRepGProp_MeshProps.hxx -usr/include/opencascade/BRepMesh_BaseMeshAlgo.hxx -usr/include/opencascade/BRepMesh_BoundaryParamsRangeSplitter.hxx -usr/include/opencascade/BRepMesh_ConeRangeSplitter.hxx -usr/include/opencascade/BRepMesh_ConstrainedBaseMeshAlgo.hxx -usr/include/opencascade/BRepMesh_Context.hxx -usr/include/opencascade/BRepMesh_CurveTessellator.hxx -usr/include/opencascade/BRepMesh_CustomBaseMeshAlgo.hxx -usr/include/opencascade/BRepMesh_CustomDelaunayBaseMeshAlgo.hxx -usr/include/opencascade/BRepMesh_CylinderRangeSplitter.hxx -usr/include/opencascade/BRepMeshData_Curve.hxx -usr/include/opencascade/BRepMeshData_Edge.hxx -usr/include/opencascade/BRepMeshData_Face.hxx -usr/include/opencascade/BRepMeshData_Model.hxx -usr/include/opencascade/BRepMeshData_PCurve.hxx -usr/include/opencascade/BRepMeshData_Wire.hxx -usr/include/opencascade/BRepMesh_DefaultRangeSplitter.hxx -usr/include/opencascade/BRepMesh_Deflection.hxx -usr/include/opencascade/BRepMesh_DelaunayBaseMeshAlgo.hxx -usr/include/opencascade/BRepMesh_DelaunayDeflectionControlMeshAlgo.hxx -usr/include/opencascade/BRepMesh_DelaunayNodeInsertionMeshAlgo.hxx -usr/include/opencascade/BRepMesh_EdgeDiscret.hxx -usr/include/opencascade/BRepMesh_FaceChecker.hxx -usr/include/opencascade/BRepMesh_FaceDiscret.hxx -usr/include/opencascade/BRepMesh_MeshAlgoFactory.hxx -usr/include/opencascade/BRepMesh_MeshTool.hxx -usr/include/opencascade/BRepMesh_ModelBuilder.hxx -usr/include/opencascade/BRepMesh_ModelHealer.hxx -usr/include/opencascade/BRepMesh_ModelPostProcessor.hxx -usr/include/opencascade/BRepMesh_ModelPreProcessor.hxx -usr/include/opencascade/BRepMesh_NodeInsertionMeshAlgo.hxx -usr/include/opencascade/BRepMesh_NURBSRangeSplitter.hxx -usr/include/opencascade/BRepMesh_ShapeVisitor.hxx -usr/include/opencascade/BRepMesh_SphereRangeSplitter.hxx -usr/include/opencascade/BRepMesh_TorusRangeSplitter.hxx -usr/include/opencascade/BRepMesh_UVParamRangeSplitter.hxx -usr/include/opencascade/BlendFunc_ConstThroat.hxx -usr/include/opencascade/BlendFunc_ConstThroatInv.hxx -usr/include/opencascade/BlendFunc_ConstThroatWithPenetration.hxx -usr/include/opencascade/BlendFunc_ConstThroatWithPenetrationInv.hxx -usr/include/opencascade/BlendFunc_GenChamfer.hxx -usr/include/opencascade/BlendFunc_GenChamfInv.hxx -usr/include/opencascade/IMeshData_Curve.hxx -usr/include/opencascade/IMeshData_Edge.hxx -usr/include/opencascade/IMeshData_Face.hxx -usr/include/opencascade/IMeshData_Model.hxx -usr/include/opencascade/IMeshData_ParametersListArrayAdaptor.hxx -usr/include/opencascade/IMeshData_ParametersList.hxx -usr/include/opencascade/IMeshData_PCurve.hxx -usr/include/opencascade/IMeshData_Shape.hxx -usr/include/opencascade/IMeshData_Status.hxx -usr/include/opencascade/IMeshData_StatusOwner.hxx -usr/include/opencascade/IMeshData_TessellatedShape.hxx -usr/include/opencascade/IMeshData_Types.hxx -usr/include/opencascade/IMeshData_Wire.hxx -usr/include/opencascade/IMeshTools_Context.hxx -usr/include/opencascade/IMeshTools_CurveTessellator.hxx -usr/include/opencascade/IMeshTools_MeshAlgoFactory.hxx -usr/include/opencascade/IMeshTools_MeshAlgo.hxx -usr/include/opencascade/IMeshTools_MeshBuilder.hxx -usr/include/opencascade/IMeshTools_ModelAlgo.hxx -usr/include/opencascade/IMeshTools_ModelBuilder.hxx -usr/include/opencascade/IMeshTools_Parameters.hxx -usr/include/opencascade/IMeshTools_ShapeExplorer.hxx -usr/include/opencascade/IMeshTools_ShapeVisitor.hxx -usr/include/opencascade/Bnd_Tools.hxx -usr/include/opencascade/ChFiDS_ChamfMode.hxx diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-dev.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-dev.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-algorithms-dev.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-algorithms-dev.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,2 @@ +# This is lintian bug #966295 +libocct-modeling-algorithms-dev: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-7.4.install opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-7.4.install --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-7.4.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-7.4.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -usr/lib/*/libTKBRep.so.* -usr/lib/*/libTKG2d.so.* -usr/lib/*/libTKG3d.so.* -usr/lib/*/libTKGeomBase.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-7.4.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-7.4.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-7.4.lintian-overrides 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-7.4.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -# this package contains a bunch of libraries and can thus not be named properly -package-name-doesnt-match-sonames -# symbols control files are not sustainable. -no-symbols-control-file diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-7.5.install opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-7.5.install --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-7.5.install 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-7.5.install 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,4 @@ +usr/lib/*/libTKBRep.so.* +usr/lib/*/libTKG2d.so.* +usr/lib/*/libTKG3d.so.* +usr/lib/*/libTKGeomBase.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-7.5.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-7.5.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-7.5.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-7.5.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,6 @@ +# this package contains a bunch of libraries and can thus not be named properly +package-name-doesnt-match-sonames +# symbols control files are not sustainable. +no-symbols-control-file +# This is lintian bug #966295 +libocct-modeling-data-7.5: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-dev.install opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-dev.install --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-dev.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-dev.install 2021-02-07 12:08:52.000000000 +0000 @@ -38,15 +38,13 @@ usr/include/opencascade/AdvApp2Var_Criterion.hxx usr/include/opencascade/AdvApp2Var_CriterionRepartition.hxx usr/include/opencascade/AdvApp2Var_CriterionType.hxx -usr/include/opencascade/AdvApp2Var_Data.hxx usr/include/opencascade/AdvApp2Var_Data_f2c.hxx +usr/include/opencascade/AdvApp2Var_Data.hxx usr/include/opencascade/AdvApp2Var_EvaluatorFunc2Var.hxx usr/include/opencascade/AdvApp2Var_Framework.hxx -usr/include/opencascade/AdvApp2Var_Framework.lxx usr/include/opencascade/AdvApp2Var_Iso.hxx usr/include/opencascade/AdvApp2Var_MathBase.hxx usr/include/opencascade/AdvApp2Var_Network.hxx -usr/include/opencascade/AdvApp2Var_Network.lxx usr/include/opencascade/AdvApp2Var_Node.hxx usr/include/opencascade/AdvApp2Var_Patch.hxx usr/include/opencascade/AdvApp2Var_SequenceOfNode.hxx @@ -67,29 +65,29 @@ usr/include/opencascade/AppCont_LeastSquare.hxx usr/include/opencascade/AppDef_Array1OfMultiPointConstraint.hxx usr/include/opencascade/AppDef_BSpGradient_BFGSOfMyBSplGradientOfBSplineCompute.hxx +usr/include/opencascade/AppDef_BSplineCompute.hxx usr/include/opencascade/AppDef_BSpParFunctionOfMyBSplGradientOfBSplineCompute.hxx usr/include/opencascade/AppDef_BSpParLeastSquareOfMyBSplGradientOfBSplineCompute.hxx -usr/include/opencascade/AppDef_BSplineCompute.hxx usr/include/opencascade/AppDef_Compute.hxx -usr/include/opencascade/AppDef_Gradient_BFGSOfMyGradientOfCompute.hxx usr/include/opencascade/AppDef_Gradient_BFGSOfMyGradientbisOfBSplineCompute.hxx +usr/include/opencascade/AppDef_Gradient_BFGSOfMyGradientOfCompute.hxx usr/include/opencascade/AppDef_Gradient_BFGSOfTheGradient.hxx usr/include/opencascade/AppDef_HArray1OfMultiPointConstraint.hxx usr/include/opencascade/AppDef_LinearCriteria.hxx usr/include/opencascade/AppDef_MultiLine.hxx usr/include/opencascade/AppDef_MultiPointConstraint.hxx usr/include/opencascade/AppDef_MyBSplGradientOfBSplineCompute.hxx -usr/include/opencascade/AppDef_MyGradientOfCompute.hxx usr/include/opencascade/AppDef_MyGradientbisOfBSplineCompute.hxx +usr/include/opencascade/AppDef_MyGradientOfCompute.hxx usr/include/opencascade/AppDef_MyLineTool.hxx -usr/include/opencascade/AppDef_ParFunctionOfMyGradientOfCompute.hxx usr/include/opencascade/AppDef_ParFunctionOfMyGradientbisOfBSplineCompute.hxx +usr/include/opencascade/AppDef_ParFunctionOfMyGradientOfCompute.hxx usr/include/opencascade/AppDef_ParFunctionOfTheGradient.hxx -usr/include/opencascade/AppDef_ParLeastSquareOfMyGradientOfCompute.hxx usr/include/opencascade/AppDef_ParLeastSquareOfMyGradientbisOfBSplineCompute.hxx +usr/include/opencascade/AppDef_ParLeastSquareOfMyGradientOfCompute.hxx usr/include/opencascade/AppDef_ParLeastSquareOfTheGradient.hxx -usr/include/opencascade/AppDef_ResConstraintOfMyGradientOfCompute.hxx usr/include/opencascade/AppDef_ResConstraintOfMyGradientbisOfBSplineCompute.hxx +usr/include/opencascade/AppDef_ResConstraintOfMyGradientOfCompute.hxx usr/include/opencascade/AppDef_ResConstraintOfTheGradient.hxx usr/include/opencascade/AppDef_SmoothCriterion.hxx usr/include/opencascade/AppDef_TheFunction.hxx @@ -97,23 +95,23 @@ usr/include/opencascade/AppDef_TheLeastSquares.hxx usr/include/opencascade/AppDef_TheResol.hxx usr/include/opencascade/AppDef_Variational.hxx -usr/include/opencascade/AppParCurves.hxx usr/include/opencascade/AppParCurves_Array1OfConstraintCouple.hxx usr/include/opencascade/AppParCurves_Array1OfMultiBSpCurve.hxx usr/include/opencascade/AppParCurves_Array1OfMultiCurve.hxx usr/include/opencascade/AppParCurves_Array1OfMultiPoint.hxx usr/include/opencascade/AppParCurves_BSpFunction.gxx -usr/include/opencascade/AppParCurves_BSpGradient.gxx usr/include/opencascade/AppParCurves_BSpGradient_BFGS.gxx -usr/include/opencascade/AppParCurves_Constraint.hxx +usr/include/opencascade/AppParCurves_BSpGradient.gxx usr/include/opencascade/AppParCurves_ConstraintCouple.hxx +usr/include/opencascade/AppParCurves_Constraint.hxx usr/include/opencascade/AppParCurves_Function.gxx -usr/include/opencascade/AppParCurves_Gradient.gxx usr/include/opencascade/AppParCurves_Gradient_BFGS.gxx +usr/include/opencascade/AppParCurves_Gradient.gxx usr/include/opencascade/AppParCurves_HArray1OfConstraintCouple.hxx usr/include/opencascade/AppParCurves_HArray1OfMultiBSpCurve.hxx usr/include/opencascade/AppParCurves_HArray1OfMultiCurve.hxx usr/include/opencascade/AppParCurves_HArray1OfMultiPoint.hxx +usr/include/opencascade/AppParCurves.hxx usr/include/opencascade/AppParCurves_LeastSquare.gxx usr/include/opencascade/AppParCurves_MultiBSpCurve.hxx usr/include/opencascade/AppParCurves_MultiCurve.hxx @@ -132,50 +130,40 @@ usr/include/opencascade/Approx_CurveOnSurface.hxx usr/include/opencascade/Approx_CurvilinearParameter.hxx usr/include/opencascade/Approx_CurvlinFunc.hxx -usr/include/opencascade/Approx_FitAndDivide.hxx usr/include/opencascade/Approx_FitAndDivide2d.hxx +usr/include/opencascade/Approx_FitAndDivide.hxx usr/include/opencascade/Approx_HArray1OfAdHSurface.hxx usr/include/opencascade/Approx_HArray1OfGTrsf2d.hxx usr/include/opencascade/Approx_MCurvesToBSpCurve.hxx usr/include/opencascade/Approx_ParametrizationType.hxx usr/include/opencascade/Approx_SameParameter.hxx -usr/include/opencascade/Approx_SameParameter.lxx usr/include/opencascade/Approx_SequenceOfHArray1OfReal.hxx usr/include/opencascade/Approx_Status.hxx usr/include/opencascade/Approx_SweepApproximation.hxx usr/include/opencascade/Approx_SweepApproximation.lxx usr/include/opencascade/Approx_SweepFunction.hxx +usr/include/opencascade/BinTools_Curve2dSet.hxx +usr/include/opencascade/BinTools_CurveSet.hxx +usr/include/opencascade/BinTools.hxx +usr/include/opencascade/BinTools_LocationSet.hxx +usr/include/opencascade/BinTools_LocationSetPtr.hxx +usr/include/opencascade/BinTools_ShapeSet.hxx +usr/include/opencascade/BinTools_SurfaceSet.hxx +usr/include/opencascade/BndLib_Add2dCurve.hxx +usr/include/opencascade/BndLib_Add3dCurve.hxx +usr/include/opencascade/BndLib_AddSurface.hxx +usr/include/opencascade/BndLib.hxx usr/include/opencascade/BRepAdaptor_Array1OfCurve.hxx usr/include/opencascade/BRepAdaptor_CompCurve.hxx -usr/include/opencascade/BRepAdaptor_Curve.hxx usr/include/opencascade/BRepAdaptor_Curve2d.hxx +usr/include/opencascade/BRepAdaptor_Curve.hxx usr/include/opencascade/BRepAdaptor_HArray1OfCurve.hxx usr/include/opencascade/BRepAdaptor_HCompCurve.hxx -usr/include/opencascade/BRepAdaptor_HCurve.hxx usr/include/opencascade/BRepAdaptor_HCurve2d.hxx +usr/include/opencascade/BRepAdaptor_HCurve.hxx usr/include/opencascade/BRepAdaptor_HSurface.hxx usr/include/opencascade/BRepAdaptor_Surface.hxx usr/include/opencascade/BRepAdaptor_Surface.lxx -usr/include/opencascade/BRepLProp.hxx -usr/include/opencascade/BRepLProp_CLProps.hxx -usr/include/opencascade/BRepLProp_CurveTool.hxx -usr/include/opencascade/BRepLProp_SLProps.hxx -usr/include/opencascade/BRepLProp_SurfaceTool.hxx -usr/include/opencascade/BRepTools.hxx -usr/include/opencascade/BRepTools_DataMapIteratorOfMapOfVertexPnt2d.hxx -usr/include/opencascade/BRepTools_GTrsfModification.hxx -usr/include/opencascade/BRepTools_History.hxx -usr/include/opencascade/BRepTools_MapOfVertexPnt2d.hxx -usr/include/opencascade/BRepTools_Modification.hxx -usr/include/opencascade/BRepTools_Modifier.hxx -usr/include/opencascade/BRepTools_Modifier.lxx -usr/include/opencascade/BRepTools_NurbsConvertModification.hxx -usr/include/opencascade/BRepTools_Quilt.hxx -usr/include/opencascade/BRepTools_ReShape.hxx -usr/include/opencascade/BRepTools_ShapeSet.hxx -usr/include/opencascade/BRepTools_Substitution.hxx -usr/include/opencascade/BRepTools_TrsfModification.hxx -usr/include/opencascade/BRepTools_WireExplorer.hxx usr/include/opencascade/BRep_Builder.hxx usr/include/opencascade/BRep_Builder.lxx usr/include/opencascade/BRep_Curve3D.hxx @@ -192,6 +180,11 @@ usr/include/opencascade/BRep_ListIteratorOfListOfPointRepresentation.hxx usr/include/opencascade/BRep_ListOfCurveRepresentation.hxx usr/include/opencascade/BRep_ListOfPointRepresentation.hxx +usr/include/opencascade/BRepLProp_CLProps.hxx +usr/include/opencascade/BRepLProp_CurveTool.hxx +usr/include/opencascade/BRepLProp.hxx +usr/include/opencascade/BRepLProp_SLProps.hxx +usr/include/opencascade/BRepLProp_SurfaceTool.hxx usr/include/opencascade/BRep_PointOnCurve.hxx usr/include/opencascade/BRep_PointOnCurveOnSurface.hxx usr/include/opencascade/BRep_PointOnSurface.hxx @@ -207,20 +200,24 @@ usr/include/opencascade/BRep_TEdge.lxx usr/include/opencascade/BRep_TFace.hxx usr/include/opencascade/BRep_TFace.lxx +usr/include/opencascade/BRep_Tool.hxx +usr/include/opencascade/BRepTools_DataMapIteratorOfMapOfVertexPnt2d.hxx +usr/include/opencascade/BRepTools_GTrsfModification.hxx +usr/include/opencascade/BRepTools_History.hxx +usr/include/opencascade/BRepTools.hxx +usr/include/opencascade/BRepTools_MapOfVertexPnt2d.hxx +usr/include/opencascade/BRepTools_Modification.hxx +usr/include/opencascade/BRepTools_Modifier.hxx +usr/include/opencascade/BRepTools_Modifier.lxx +usr/include/opencascade/BRepTools_NurbsConvertModification.hxx +usr/include/opencascade/BRepTools_Quilt.hxx +usr/include/opencascade/BRepTools_ReShape.hxx +usr/include/opencascade/BRepTools_ShapeSet.hxx +usr/include/opencascade/BRepTools_Substitution.hxx +usr/include/opencascade/BRepTools_TrsfModification.hxx +usr/include/opencascade/BRepTools_WireExplorer.hxx usr/include/opencascade/BRep_TVertex.hxx usr/include/opencascade/BRep_TVertex.lxx -usr/include/opencascade/BRep_Tool.hxx -usr/include/opencascade/BinTools.hxx -usr/include/opencascade/BinTools_Curve2dSet.hxx -usr/include/opencascade/BinTools_CurveSet.hxx -usr/include/opencascade/BinTools_LocationSet.hxx -usr/include/opencascade/BinTools_LocationSetPtr.hxx -usr/include/opencascade/BinTools_ShapeSet.hxx -usr/include/opencascade/BinTools_SurfaceSet.hxx -usr/include/opencascade/BndLib.hxx -usr/include/opencascade/BndLib_Add2dCurve.hxx -usr/include/opencascade/BndLib_Add3dCurve.hxx -usr/include/opencascade/BndLib_AddSurface.hxx usr/include/opencascade/CPnts_AbscissaPoint.hxx usr/include/opencascade/CPnts_AbscissaPoint.lxx usr/include/opencascade/CPnts_MyGaussFunction.hxx @@ -230,42 +227,42 @@ usr/include/opencascade/CPnts_RealFunction.hxx usr/include/opencascade/CPnts_UniformDeflection.hxx usr/include/opencascade/CPnts_UniformDeflection.lxx -usr/include/opencascade/Extrema_Array1OfPOnCurv.hxx usr/include/opencascade/Extrema_Array1OfPOnCurv2d.hxx +usr/include/opencascade/Extrema_Array1OfPOnCurv.hxx usr/include/opencascade/Extrema_Array1OfPOnSurf.hxx -usr/include/opencascade/Extrema_Array2OfPOnCurv.hxx usr/include/opencascade/Extrema_Array2OfPOnCurv2d.hxx +usr/include/opencascade/Extrema_Array2OfPOnCurv.hxx usr/include/opencascade/Extrema_Array2OfPOnSurf.hxx usr/include/opencascade/Extrema_Array2OfPOnSurfParams.hxx -usr/include/opencascade/Extrema_CCLocFOfLocECC.hxx usr/include/opencascade/Extrema_CCLocFOfLocECC2d.hxx +usr/include/opencascade/Extrema_CCLocFOfLocECC.hxx usr/include/opencascade/Extrema_Curve2dTool.hxx usr/include/opencascade/Extrema_Curve2dTool.lxx usr/include/opencascade/Extrema_CurveLocator.gxx usr/include/opencascade/Extrema_CurveTool.hxx usr/include/opencascade/Extrema_CurveTool.lxx -usr/include/opencascade/Extrema_ECC.hxx usr/include/opencascade/Extrema_ECC2d.hxx -usr/include/opencascade/Extrema_ELPCOfLocateExtPC.hxx +usr/include/opencascade/Extrema_ECC.hxx +usr/include/opencascade/Extrema_ElementType.hxx usr/include/opencascade/Extrema_ELPCOfLocateExtPC2d.hxx -usr/include/opencascade/Extrema_EPCOfELPCOfLocateExtPC.hxx +usr/include/opencascade/Extrema_ELPCOfLocateExtPC.hxx usr/include/opencascade/Extrema_EPCOfELPCOfLocateExtPC2d.hxx -usr/include/opencascade/Extrema_EPCOfExtPC.hxx +usr/include/opencascade/Extrema_EPCOfELPCOfLocateExtPC.hxx usr/include/opencascade/Extrema_EPCOfExtPC2d.hxx -usr/include/opencascade/Extrema_ElementType.hxx +usr/include/opencascade/Extrema_EPCOfExtPC.hxx usr/include/opencascade/Extrema_ExtAlgo.hxx -usr/include/opencascade/Extrema_ExtCC.hxx usr/include/opencascade/Extrema_ExtCC2d.hxx +usr/include/opencascade/Extrema_ExtCC.hxx usr/include/opencascade/Extrema_ExtCS.hxx -usr/include/opencascade/Extrema_ExtElC.hxx usr/include/opencascade/Extrema_ExtElC2d.hxx +usr/include/opencascade/Extrema_ExtElC.hxx usr/include/opencascade/Extrema_ExtElCS.hxx usr/include/opencascade/Extrema_ExtElSS.hxx usr/include/opencascade/Extrema_ExtFlag.hxx -usr/include/opencascade/Extrema_ExtPC.hxx usr/include/opencascade/Extrema_ExtPC2d.hxx -usr/include/opencascade/Extrema_ExtPElC.hxx +usr/include/opencascade/Extrema_ExtPC.hxx usr/include/opencascade/Extrema_ExtPElC2d.hxx +usr/include/opencascade/Extrema_ExtPElC.hxx usr/include/opencascade/Extrema_ExtPElS.hxx usr/include/opencascade/Extrema_ExtPExtS.hxx usr/include/opencascade/Extrema_ExtPRevS.hxx @@ -278,8 +275,6 @@ usr/include/opencascade/Extrema_FuncExtSS.hxx usr/include/opencascade/Extrema_FuncPSDist.hxx usr/include/opencascade/Extrema_FuncPSNorm.hxx -usr/include/opencascade/Extrema_GExtPC.gxx -usr/include/opencascade/Extrema_GLocateExtPC.gxx usr/include/opencascade/Extrema_GenExtCC.gxx usr/include/opencascade/Extrema_GenExtCS.hxx usr/include/opencascade/Extrema_GenExtPC.gxx @@ -290,40 +285,44 @@ usr/include/opencascade/Extrema_GenLocateExtPC.gxx usr/include/opencascade/Extrema_GenLocateExtPS.hxx usr/include/opencascade/Extrema_GenLocateExtSS.hxx +usr/include/opencascade/Extrema_GExtPC.gxx usr/include/opencascade/Extrema_GlobOptFuncCC.hxx +usr/include/opencascade/Extrema_GlobOptFuncConicS.hxx +usr/include/opencascade/Extrema_GlobOptFuncCQuadric.hxx usr/include/opencascade/Extrema_GlobOptFuncCS.hxx -usr/include/opencascade/Extrema_HArray1OfPOnCurv.hxx +usr/include/opencascade/Extrema_GLocateExtPC.gxx usr/include/opencascade/Extrema_HArray1OfPOnCurv2d.hxx +usr/include/opencascade/Extrema_HArray1OfPOnCurv.hxx usr/include/opencascade/Extrema_HArray1OfPOnSurf.hxx -usr/include/opencascade/Extrema_HArray2OfPOnCurv.hxx usr/include/opencascade/Extrema_HArray2OfPOnCurv2d.hxx +usr/include/opencascade/Extrema_HArray2OfPOnCurv.hxx usr/include/opencascade/Extrema_HArray2OfPOnSurf.hxx usr/include/opencascade/Extrema_HArray2OfPOnSurfParams.hxx usr/include/opencascade/Extrema_HUBTreeOfSphere.hxx -usr/include/opencascade/Extrema_LocECC.hxx -usr/include/opencascade/Extrema_LocECC2d.hxx -usr/include/opencascade/Extrema_LocEPCOfLocateExtPC.hxx -usr/include/opencascade/Extrema_LocEPCOfLocateExtPC2d.hxx -usr/include/opencascade/Extrema_LocateExtCC.hxx usr/include/opencascade/Extrema_LocateExtCC2d.hxx -usr/include/opencascade/Extrema_LocateExtPC.hxx +usr/include/opencascade/Extrema_LocateExtCC.hxx usr/include/opencascade/Extrema_LocateExtPC2d.hxx -usr/include/opencascade/Extrema_PCFOfEPCOfELPCOfLocateExtPC.hxx +usr/include/opencascade/Extrema_LocateExtPC.hxx +usr/include/opencascade/Extrema_LocECC2d.hxx +usr/include/opencascade/Extrema_LocECC.hxx +usr/include/opencascade/Extrema_LocEPCOfLocateExtPC2d.hxx +usr/include/opencascade/Extrema_LocEPCOfLocateExtPC.hxx usr/include/opencascade/Extrema_PCFOfEPCOfELPCOfLocateExtPC2d.hxx -usr/include/opencascade/Extrema_PCFOfEPCOfExtPC.hxx +usr/include/opencascade/Extrema_PCFOfEPCOfELPCOfLocateExtPC.hxx usr/include/opencascade/Extrema_PCFOfEPCOfExtPC2d.hxx -usr/include/opencascade/Extrema_PCLocFOfLocEPCOfLocateExtPC.hxx +usr/include/opencascade/Extrema_PCFOfEPCOfExtPC.hxx usr/include/opencascade/Extrema_PCLocFOfLocEPCOfLocateExtPC2d.hxx -usr/include/opencascade/Extrema_POnCurv.hxx +usr/include/opencascade/Extrema_PCLocFOfLocEPCOfLocateExtPC.hxx +usr/include/opencascade/Extrema_Point.gxx +usr/include/opencascade/Extrema_Point.lxx usr/include/opencascade/Extrema_POnCurv2d.hxx +usr/include/opencascade/Extrema_POnCurv.hxx usr/include/opencascade/Extrema_POnSurf.hxx usr/include/opencascade/Extrema_POnSurf.lxx usr/include/opencascade/Extrema_POnSurfParams.hxx usr/include/opencascade/Extrema_POnSurfParams.lxx -usr/include/opencascade/Extrema_Point.gxx -usr/include/opencascade/Extrema_Point.lxx -usr/include/opencascade/Extrema_SequenceOfPOnCurv.hxx usr/include/opencascade/Extrema_SequenceOfPOnCurv2d.hxx +usr/include/opencascade/Extrema_SequenceOfPOnCurv.hxx usr/include/opencascade/Extrema_SequenceOfPOnSurf.hxx usr/include/opencascade/FEmTool_Assembly.hxx usr/include/opencascade/FEmTool_AssemblyTable.hxx @@ -355,16 +354,32 @@ usr/include/opencascade/GCE2d_MakeTranslation.hxx usr/include/opencascade/GCE2d_Root.hxx usr/include/opencascade/GCE2d_Root.lxx -usr/include/opencascade/GCPnts_AbscissaPoint.hxx -usr/include/opencascade/GCPnts_AbscissaType.hxx -usr/include/opencascade/GCPnts_DeflectionType.hxx -usr/include/opencascade/GCPnts_DistFunction.hxx -usr/include/opencascade/GCPnts_DistFunction2d.hxx -usr/include/opencascade/GCPnts_QuasiUniformAbscissa.hxx -usr/include/opencascade/GCPnts_QuasiUniformDeflection.hxx -usr/include/opencascade/GCPnts_TangentialDeflection.hxx -usr/include/opencascade/GCPnts_UniformAbscissa.hxx -usr/include/opencascade/GCPnts_UniformDeflection.hxx +usr/include/opencascade/gce_ErrorType.hxx +usr/include/opencascade/gce_MakeCirc2d.hxx +usr/include/opencascade/gce_MakeCirc.hxx +usr/include/opencascade/gce_MakeCone.hxx +usr/include/opencascade/gce_MakeCylinder.hxx +usr/include/opencascade/gce_MakeDir2d.hxx +usr/include/opencascade/gce_MakeDir.hxx +usr/include/opencascade/gce_MakeElips2d.hxx +usr/include/opencascade/gce_MakeElips.hxx +usr/include/opencascade/gce_MakeHypr2d.hxx +usr/include/opencascade/gce_MakeHypr.hxx +usr/include/opencascade/gce_MakeLin2d.hxx +usr/include/opencascade/gce_MakeLin.hxx +usr/include/opencascade/gce_MakeMirror2d.hxx +usr/include/opencascade/gce_MakeMirror.hxx +usr/include/opencascade/gce_MakeParab2d.hxx +usr/include/opencascade/gce_MakeParab.hxx +usr/include/opencascade/gce_MakePln.hxx +usr/include/opencascade/gce_MakeRotation2d.hxx +usr/include/opencascade/gce_MakeRotation.hxx +usr/include/opencascade/gce_MakeScale2d.hxx +usr/include/opencascade/gce_MakeScale.hxx +usr/include/opencascade/gce_MakeTranslation2d.hxx +usr/include/opencascade/gce_MakeTranslation.hxx +usr/include/opencascade/gce_Root.hxx +usr/include/opencascade/gce_Root.lxx usr/include/opencascade/GC_MakeArcOfCircle.hxx usr/include/opencascade/GC_MakeArcOfEllipse.hxx usr/include/opencascade/GC_MakeArcOfHyperbola.hxx @@ -383,50 +398,50 @@ usr/include/opencascade/GC_MakeTranslation.hxx usr/include/opencascade/GC_MakeTrimmedCone.hxx usr/include/opencascade/GC_MakeTrimmedCylinder.hxx +usr/include/opencascade/GCPnts_AbscissaPoint.hxx +usr/include/opencascade/GCPnts_AbscissaType.hxx +usr/include/opencascade/GCPnts_DeflectionType.hxx +usr/include/opencascade/GCPnts_DistFunction2d.hxx +usr/include/opencascade/GCPnts_DistFunction.hxx +usr/include/opencascade/GCPnts_QuasiUniformAbscissa.hxx +usr/include/opencascade/GCPnts_QuasiUniformDeflection.hxx +usr/include/opencascade/GCPnts_TangentialDeflection.hxx +usr/include/opencascade/GCPnts_UniformAbscissa.hxx +usr/include/opencascade/GCPnts_UniformDeflection.hxx usr/include/opencascade/GC_Root.hxx usr/include/opencascade/GC_Root.lxx -usr/include/opencascade/GProp.hxx -usr/include/opencascade/GProp_CelGProps.hxx -usr/include/opencascade/GProp_EquaType.hxx -usr/include/opencascade/GProp_GProps.hxx -usr/include/opencascade/GProp_PEquation.hxx -usr/include/opencascade/GProp_PGProps.hxx -usr/include/opencascade/GProp_PrincipalProps.hxx -usr/include/opencascade/GProp_SelGProps.hxx -usr/include/opencascade/GProp_UndefinedAxis.hxx -usr/include/opencascade/GProp_ValueType.hxx -usr/include/opencascade/GProp_VelGProps.hxx -usr/include/opencascade/Geom2dAdaptor.hxx usr/include/opencascade/Geom2dAdaptor_Curve.hxx usr/include/opencascade/Geom2dAdaptor_Curve.lxx usr/include/opencascade/Geom2dAdaptor_GHCurve.hxx usr/include/opencascade/Geom2dAdaptor_HCurve.hxx -usr/include/opencascade/Geom2dConvert.hxx -usr/include/opencascade/Geom2dConvert_ApproxCurve.hxx -usr/include/opencascade/Geom2dConvert_BSplineCurveKnotSplitting.hxx -usr/include/opencascade/Geom2dConvert_BSplineCurveToBezierCurve.hxx -usr/include/opencascade/Geom2dConvert_CompCurveToBSplineCurve.hxx -usr/include/opencascade/Geom2dEvaluator_Curve.hxx -usr/include/opencascade/Geom2dEvaluator_OffsetCurve.hxx -usr/include/opencascade/Geom2dLProp_CLProps2d.hxx -usr/include/opencascade/Geom2dLProp_CurAndInf2d.hxx -usr/include/opencascade/Geom2dLProp_Curve2dTool.hxx -usr/include/opencascade/Geom2dLProp_FuncCurExt.hxx -usr/include/opencascade/Geom2dLProp_FuncCurNul.hxx -usr/include/opencascade/Geom2dLProp_NumericCurInf2d.hxx +usr/include/opencascade/Geom2dAdaptor.hxx usr/include/opencascade/Geom2d_AxisPlacement.hxx -usr/include/opencascade/Geom2d_BSplineCurve.hxx usr/include/opencascade/Geom2d_BezierCurve.hxx usr/include/opencascade/Geom2d_BoundedCurve.hxx +usr/include/opencascade/Geom2d_BSplineCurve.hxx usr/include/opencascade/Geom2d_CartesianPoint.hxx usr/include/opencascade/Geom2d_Circle.hxx usr/include/opencascade/Geom2d_Conic.hxx +usr/include/opencascade/Geom2dConvert_ApproxCurve.hxx +usr/include/opencascade/Geom2dConvert_BSplineCurveKnotSplitting.hxx +usr/include/opencascade/Geom2dConvert_BSplineCurveToBezierCurve.hxx +usr/include/opencascade/Geom2dConvert_CompCurveToBSplineCurve.hxx +usr/include/opencascade/Geom2dConvert.hxx usr/include/opencascade/Geom2d_Curve.hxx usr/include/opencascade/Geom2d_Direction.hxx usr/include/opencascade/Geom2d_Ellipse.hxx +usr/include/opencascade/Geom2dEvaluator_Curve.hxx +usr/include/opencascade/Geom2dEvaluator.hxx +usr/include/opencascade/Geom2dEvaluator_OffsetCurve.hxx usr/include/opencascade/Geom2d_Geometry.hxx usr/include/opencascade/Geom2d_Hyperbola.hxx usr/include/opencascade/Geom2d_Line.hxx +usr/include/opencascade/Geom2dLProp_CLProps2d.hxx +usr/include/opencascade/Geom2dLProp_CurAndInf2d.hxx +usr/include/opencascade/Geom2dLProp_Curve2dTool.hxx +usr/include/opencascade/Geom2dLProp_FuncCurExt.hxx +usr/include/opencascade/Geom2dLProp_FuncCurNul.hxx +usr/include/opencascade/Geom2dLProp_NumericCurInf2d.hxx usr/include/opencascade/Geom2d_OffsetCurve.hxx usr/include/opencascade/Geom2d_Parabola.hxx usr/include/opencascade/Geom2d_Point.hxx @@ -436,7 +451,6 @@ usr/include/opencascade/Geom2d_UndefinedValue.hxx usr/include/opencascade/Geom2d_Vector.hxx usr/include/opencascade/Geom2d_VectorWithMagnitude.hxx -usr/include/opencascade/GeomAdaptor.hxx usr/include/opencascade/GeomAdaptor_Curve.hxx usr/include/opencascade/GeomAdaptor_Curve.lxx usr/include/opencascade/GeomAdaptor_GHCurve.hxx @@ -447,11 +461,24 @@ usr/include/opencascade/GeomAdaptor_HSurface.lxx usr/include/opencascade/GeomAdaptor_HSurfaceOfLinearExtrusion.hxx usr/include/opencascade/GeomAdaptor_HSurfaceOfRevolution.hxx +usr/include/opencascade/GeomAdaptor.hxx usr/include/opencascade/GeomAdaptor_Surface.hxx usr/include/opencascade/GeomAdaptor_Surface.lxx usr/include/opencascade/GeomAdaptor_SurfaceOfLinearExtrusion.hxx usr/include/opencascade/GeomAdaptor_SurfaceOfRevolution.hxx -usr/include/opencascade/GeomConvert.hxx +usr/include/opencascade/Geom_Axis1Placement.hxx +usr/include/opencascade/Geom_Axis2Placement.hxx +usr/include/opencascade/Geom_AxisPlacement.hxx +usr/include/opencascade/Geom_BezierCurve.hxx +usr/include/opencascade/Geom_BezierSurface.hxx +usr/include/opencascade/Geom_BoundedCurve.hxx +usr/include/opencascade/Geom_BoundedSurface.hxx +usr/include/opencascade/Geom_BSplineCurve.hxx +usr/include/opencascade/Geom_BSplineSurface.hxx +usr/include/opencascade/Geom_CartesianPoint.hxx +usr/include/opencascade/Geom_Circle.hxx +usr/include/opencascade/Geom_ConicalSurface.hxx +usr/include/opencascade/Geom_Conic.hxx usr/include/opencascade/GeomConvert_ApproxCurve.hxx usr/include/opencascade/GeomConvert_ApproxSurface.hxx usr/include/opencascade/GeomConvert_BSplineCurveKnotSplitting.hxx @@ -461,18 +488,21 @@ usr/include/opencascade/GeomConvert_CompBezierSurfacesToBSplineSurface.hxx usr/include/opencascade/GeomConvert_CompBezierSurfacesToBSplineSurface.lxx usr/include/opencascade/GeomConvert_CompCurveToBSplineCurve.hxx +usr/include/opencascade/GeomConvert.hxx +usr/include/opencascade/Geom_Curve.hxx +usr/include/opencascade/Geom_CylindricalSurface.hxx +usr/include/opencascade/Geom_Direction.hxx +usr/include/opencascade/Geom_ElementarySurface.hxx +usr/include/opencascade/Geom_Ellipse.hxx usr/include/opencascade/GeomEvaluator_Curve.hxx usr/include/opencascade/GeomEvaluator_OffsetCurve.hxx usr/include/opencascade/GeomEvaluator_OffsetSurface.hxx usr/include/opencascade/GeomEvaluator_Surface.hxx usr/include/opencascade/GeomEvaluator_SurfaceOfExtrusion.hxx usr/include/opencascade/GeomEvaluator_SurfaceOfRevolution.hxx -usr/include/opencascade/GeomLProp.hxx -usr/include/opencascade/GeomLProp_CLProps.hxx -usr/include/opencascade/GeomLProp_CurveTool.hxx -usr/include/opencascade/GeomLProp_SLProps.hxx -usr/include/opencascade/GeomLProp_SurfaceTool.hxx -usr/include/opencascade/GeomLib.hxx +usr/include/opencascade/Geom_Geometry.hxx +usr/include/opencascade/Geom_HSequenceOfBSplineSurface.hxx +usr/include/opencascade/Geom_Hyperbola.hxx usr/include/opencascade/GeomLib_Array1OfMat.hxx usr/include/opencascade/GeomLib_Check2dBSplineCurve.hxx usr/include/opencascade/GeomLib_Check2dBSplineCurve.lxx @@ -481,6 +511,7 @@ usr/include/opencascade/GeomLib_CheckCurveOnSurface.hxx usr/include/opencascade/GeomLib_DenominatorMultiplier.hxx usr/include/opencascade/GeomLib_DenominatorMultiplierPtr.hxx +usr/include/opencascade/GeomLib.hxx usr/include/opencascade/GeomLib_Interpolate.hxx usr/include/opencascade/GeomLib_Interpolate.lxx usr/include/opencascade/GeomLib_InterpolationErrors.hxx @@ -490,40 +521,19 @@ usr/include/opencascade/GeomLib_MakeCurvefromApprox.lxx usr/include/opencascade/GeomLib_PolyFunc.hxx usr/include/opencascade/GeomLib_Tool.hxx -usr/include/opencascade/GeomProjLib.hxx -usr/include/opencascade/GeomTools.hxx -usr/include/opencascade/GeomTools_Curve2dSet.hxx -usr/include/opencascade/GeomTools_CurveSet.hxx -usr/include/opencascade/GeomTools_SurfaceSet.hxx -usr/include/opencascade/GeomTools_UndefinedTypeHandler.hxx -usr/include/opencascade/Geom_Axis1Placement.hxx -usr/include/opencascade/Geom_Axis2Placement.hxx -usr/include/opencascade/Geom_AxisPlacement.hxx -usr/include/opencascade/Geom_BSplineCurve.hxx -usr/include/opencascade/Geom_BSplineSurface.hxx -usr/include/opencascade/Geom_BezierCurve.hxx -usr/include/opencascade/Geom_BezierSurface.hxx -usr/include/opencascade/Geom_BoundedCurve.hxx -usr/include/opencascade/Geom_BoundedSurface.hxx -usr/include/opencascade/Geom_CartesianPoint.hxx -usr/include/opencascade/Geom_Circle.hxx -usr/include/opencascade/Geom_Conic.hxx -usr/include/opencascade/Geom_ConicalSurface.hxx -usr/include/opencascade/Geom_Curve.hxx -usr/include/opencascade/Geom_CylindricalSurface.hxx -usr/include/opencascade/Geom_Direction.hxx -usr/include/opencascade/Geom_ElementarySurface.hxx -usr/include/opencascade/Geom_Ellipse.hxx -usr/include/opencascade/Geom_Geometry.hxx -usr/include/opencascade/Geom_HSequenceOfBSplineSurface.hxx -usr/include/opencascade/Geom_Hyperbola.hxx usr/include/opencascade/Geom_Line.hxx +usr/include/opencascade/GeomLProp_CLProps.hxx +usr/include/opencascade/GeomLProp_CurveTool.hxx +usr/include/opencascade/GeomLProp.hxx +usr/include/opencascade/GeomLProp_SLProps.hxx +usr/include/opencascade/GeomLProp_SurfaceTool.hxx usr/include/opencascade/Geom_OffsetCurve.hxx usr/include/opencascade/Geom_OffsetSurface.hxx usr/include/opencascade/Geom_OsculatingSurface.hxx usr/include/opencascade/Geom_Parabola.hxx usr/include/opencascade/Geom_Plane.hxx usr/include/opencascade/Geom_Point.hxx +usr/include/opencascade/GeomProjLib.hxx usr/include/opencascade/Geom_RectangularTrimmedSurface.hxx usr/include/opencascade/Geom_SequenceOfBSplineSurface.hxx usr/include/opencascade/Geom_SphericalSurface.hxx @@ -531,6 +541,11 @@ usr/include/opencascade/Geom_SurfaceOfLinearExtrusion.hxx usr/include/opencascade/Geom_SurfaceOfRevolution.hxx usr/include/opencascade/Geom_SweptSurface.hxx +usr/include/opencascade/GeomTools_Curve2dSet.hxx +usr/include/opencascade/GeomTools_CurveSet.hxx +usr/include/opencascade/GeomTools.hxx +usr/include/opencascade/GeomTools_SurfaceSet.hxx +usr/include/opencascade/GeomTools_UndefinedTypeHandler.hxx usr/include/opencascade/Geom_ToroidalSurface.hxx usr/include/opencascade/Geom_Transformation.hxx usr/include/opencascade/Geom_TrimmedCurve.hxx @@ -538,6 +553,17 @@ usr/include/opencascade/Geom_UndefinedValue.hxx usr/include/opencascade/Geom_Vector.hxx usr/include/opencascade/Geom_VectorWithMagnitude.hxx +usr/include/opencascade/GProp_CelGProps.hxx +usr/include/opencascade/GProp_EquaType.hxx +usr/include/opencascade/GProp_GProps.hxx +usr/include/opencascade/GProp.hxx +usr/include/opencascade/GProp_PEquation.hxx +usr/include/opencascade/GProp_PGProps.hxx +usr/include/opencascade/GProp_PrincipalProps.hxx +usr/include/opencascade/GProp_SelGProps.hxx +usr/include/opencascade/GProp_UndefinedAxis.hxx +usr/include/opencascade/GProp_ValueType.hxx +usr/include/opencascade/GProp_VelGProps.hxx usr/include/opencascade/Hermit.hxx usr/include/opencascade/IntAna2d_AnaIntersection.hxx usr/include/opencascade/IntAna2d_AnaIntersection.lxx @@ -570,10 +596,9 @@ usr/include/opencascade/LProp_CLProps.gxx usr/include/opencascade/LProp_CurAndInf.hxx usr/include/opencascade/LProp_NotDefined.hxx -usr/include/opencascade/LProp_SLProps.gxx usr/include/opencascade/LProp_SequenceOfCIType.hxx +usr/include/opencascade/LProp_SLProps.gxx usr/include/opencascade/LProp_Status.hxx -usr/include/opencascade/ProjLib.hxx usr/include/opencascade/ProjLib_CompProjectedCurve.hxx usr/include/opencascade/ProjLib_ComputeApprox.hxx usr/include/opencascade/ProjLib_ComputeApproxOnPolarSurface.hxx @@ -582,35 +607,36 @@ usr/include/opencascade/ProjLib_HCompProjectedCurve.hxx usr/include/opencascade/ProjLib_HProjectedCurve.hxx usr/include/opencascade/ProjLib_HSequenceOfHSequenceOfPnt.hxx +usr/include/opencascade/ProjLib.hxx usr/include/opencascade/ProjLib_Plane.hxx usr/include/opencascade/ProjLib_PrjFunc.hxx usr/include/opencascade/ProjLib_PrjResolve.hxx +usr/include/opencascade/ProjLib_ProjectedCurve.hxx usr/include/opencascade/ProjLib_ProjectOnPlane.hxx usr/include/opencascade/ProjLib_ProjectOnSurface.hxx -usr/include/opencascade/ProjLib_ProjectedCurve.hxx usr/include/opencascade/ProjLib_Projector.hxx usr/include/opencascade/ProjLib_SequenceOfHSequenceOfPnt.hxx usr/include/opencascade/ProjLib_Sphere.hxx usr/include/opencascade/ProjLib_Torus.hxx -usr/include/opencascade/TColGeom2d_Array1OfBSplineCurve.hxx usr/include/opencascade/TColGeom2d_Array1OfBezierCurve.hxx +usr/include/opencascade/TColGeom2d_Array1OfBSplineCurve.hxx usr/include/opencascade/TColGeom2d_Array1OfCurve.hxx -usr/include/opencascade/TColGeom2d_HArray1OfBSplineCurve.hxx usr/include/opencascade/TColGeom2d_HArray1OfBezierCurve.hxx +usr/include/opencascade/TColGeom2d_HArray1OfBSplineCurve.hxx usr/include/opencascade/TColGeom2d_HArray1OfCurve.hxx usr/include/opencascade/TColGeom2d_HSequenceOfBoundedCurve.hxx usr/include/opencascade/TColGeom2d_HSequenceOfCurve.hxx usr/include/opencascade/TColGeom2d_SequenceOfBoundedCurve.hxx usr/include/opencascade/TColGeom2d_SequenceOfCurve.hxx usr/include/opencascade/TColGeom2d_SequenceOfGeometry.hxx -usr/include/opencascade/TColGeom_Array1OfBSplineCurve.hxx usr/include/opencascade/TColGeom_Array1OfBezierCurve.hxx +usr/include/opencascade/TColGeom_Array1OfBSplineCurve.hxx usr/include/opencascade/TColGeom_Array1OfCurve.hxx usr/include/opencascade/TColGeom_Array1OfSurface.hxx usr/include/opencascade/TColGeom_Array2OfBezierSurface.hxx usr/include/opencascade/TColGeom_Array2OfSurface.hxx -usr/include/opencascade/TColGeom_HArray1OfBSplineCurve.hxx usr/include/opencascade/TColGeom_HArray1OfBezierCurve.hxx +usr/include/opencascade/TColGeom_HArray1OfBSplineCurve.hxx usr/include/opencascade/TColGeom_HArray1OfCurve.hxx usr/include/opencascade/TColGeom_HArray1OfSurface.hxx usr/include/opencascade/TColGeom_HArray2OfSurface.hxx @@ -623,11 +649,59 @@ usr/include/opencascade/TopAbs_Orientation.hxx usr/include/opencascade/TopAbs_ShapeEnum.hxx usr/include/opencascade/TopAbs_State.hxx -usr/include/opencascade/TopExp.hxx usr/include/opencascade/TopExp_Explorer.hxx usr/include/opencascade/TopExp_Explorer.lxx +usr/include/opencascade/TopExp.hxx usr/include/opencascade/TopExp_Stack.hxx -usr/include/opencascade/TopTools.hxx +usr/include/opencascade/TopoDS_AlertAttribute.hxx +usr/include/opencascade/TopoDS_AlertWithShape.hxx +usr/include/opencascade/TopoDS_Builder.hxx +usr/include/opencascade/TopoDS_Builder.lxx +usr/include/opencascade/TopoDS_Compound.hxx +usr/include/opencascade/TopoDS_Compound.lxx +usr/include/opencascade/TopoDS_CompSolid.hxx +usr/include/opencascade/TopoDS_CompSolid.lxx +usr/include/opencascade/TopoDS_Edge.hxx +usr/include/opencascade/TopoDS_Edge.lxx +usr/include/opencascade/TopoDS_Face.hxx +usr/include/opencascade/TopoDS_Face.lxx +usr/include/opencascade/TopoDS_FrozenShape.hxx +usr/include/opencascade/TopoDS_HShape.hxx +usr/include/opencascade/TopoDS_HShape.lxx +usr/include/opencascade/TopoDS.hxx +usr/include/opencascade/TopoDS_Iterator.hxx +usr/include/opencascade/TopoDS_Iterator.lxx +usr/include/opencascade/TopoDS_ListIteratorOfListOfShape.hxx +usr/include/opencascade/TopoDS_ListOfShape.hxx +usr/include/opencascade/TopoDS_LockedShape.hxx +usr/include/opencascade/TopoDS.lxx +usr/include/opencascade/TopoDS_Shape.hxx +usr/include/opencascade/TopoDS_Shell.hxx +usr/include/opencascade/TopoDS_Shell.lxx +usr/include/opencascade/TopoDS_Solid.hxx +usr/include/opencascade/TopoDS_Solid.lxx +usr/include/opencascade/TopoDS_TCompound.hxx +usr/include/opencascade/TopoDS_TCompound.lxx +usr/include/opencascade/TopoDS_TCompSolid.hxx +usr/include/opencascade/TopoDS_TCompSolid.lxx +usr/include/opencascade/TopoDS_TEdge.hxx +usr/include/opencascade/TopoDS_TEdge.lxx +usr/include/opencascade/TopoDS_TFace.hxx +usr/include/opencascade/TopoDS_TFace.lxx +usr/include/opencascade/TopoDS_TShape.hxx +usr/include/opencascade/TopoDS_TShell.hxx +usr/include/opencascade/TopoDS_TShell.lxx +usr/include/opencascade/TopoDS_TSolid.hxx +usr/include/opencascade/TopoDS_TSolid.lxx +usr/include/opencascade/TopoDS_TVertex.hxx +usr/include/opencascade/TopoDS_TVertex.lxx +usr/include/opencascade/TopoDS_TWire.hxx +usr/include/opencascade/TopoDS_TWire.lxx +usr/include/opencascade/TopoDS_UnCompatibleShapes.hxx +usr/include/opencascade/TopoDS_Vertex.hxx +usr/include/opencascade/TopoDS_Vertex.lxx +usr/include/opencascade/TopoDS_Wire.hxx +usr/include/opencascade/TopoDS_Wire.lxx usr/include/opencascade/TopTools_Array1OfListOfShape.hxx usr/include/opencascade/TopTools_Array1OfShape.hxx usr/include/opencascade/TopTools_Array2OfShape.hxx @@ -656,13 +730,15 @@ usr/include/opencascade/TopTools_HArray1OfShape.hxx usr/include/opencascade/TopTools_HArray2OfShape.hxx usr/include/opencascade/TopTools_HSequenceOfShape.hxx +usr/include/opencascade/TopTools.hxx usr/include/opencascade/TopTools_IndexedDataMapOfShapeAddress.hxx usr/include/opencascade/TopTools_IndexedDataMapOfShapeListOfShape.hxx +usr/include/opencascade/TopTools_IndexedDataMapOfShapeReal.hxx usr/include/opencascade/TopTools_IndexedDataMapOfShapeShape.hxx usr/include/opencascade/TopTools_IndexedMapOfOrientedShape.hxx -usr/include/opencascade/TopTools_IndexedDataMapOfShapeReal.hxx usr/include/opencascade/TopTools_IndexedMapOfShape.hxx usr/include/opencascade/TopTools_ListIteratorOfListOfShape.hxx +usr/include/opencascade/TopTools_ListOfListOfShape.hxx usr/include/opencascade/TopTools_ListOfShape.hxx usr/include/opencascade/TopTools_LocationSet.hxx usr/include/opencascade/TopTools_LocationSetPtr.hxx @@ -677,85 +753,8 @@ usr/include/opencascade/TopTools_ShapeMapHasher.hxx usr/include/opencascade/TopTools_ShapeMapHasher.lxx usr/include/opencascade/TopTools_ShapeSet.hxx -usr/include/opencascade/TopoDS.hxx -usr/include/opencascade/TopoDS.lxx -usr/include/opencascade/TopoDS_AlertWithShape.hxx -usr/include/opencascade/TopoDS_Builder.hxx -usr/include/opencascade/TopoDS_Builder.lxx -usr/include/opencascade/TopoDS_CompSolid.hxx -usr/include/opencascade/TopoDS_CompSolid.lxx -usr/include/opencascade/TopoDS_Compound.hxx -usr/include/opencascade/TopoDS_Compound.lxx -usr/include/opencascade/TopoDS_Edge.hxx -usr/include/opencascade/TopoDS_Edge.lxx -usr/include/opencascade/TopoDS_Face.hxx -usr/include/opencascade/TopoDS_Face.lxx -usr/include/opencascade/TopoDS_FrozenShape.hxx -usr/include/opencascade/TopoDS_HShape.hxx -usr/include/opencascade/TopoDS_HShape.lxx -usr/include/opencascade/TopoDS_Iterator.hxx -usr/include/opencascade/TopoDS_Iterator.lxx -usr/include/opencascade/TopoDS_ListIteratorOfListOfShape.hxx -usr/include/opencascade/TopoDS_ListOfShape.hxx -usr/include/opencascade/TopoDS_LockedShape.hxx -usr/include/opencascade/TopoDS_Shape.hxx -usr/include/opencascade/TopoDS_Shell.hxx -usr/include/opencascade/TopoDS_Shell.lxx -usr/include/opencascade/TopoDS_Solid.hxx -usr/include/opencascade/TopoDS_Solid.lxx -usr/include/opencascade/TopoDS_TCompSolid.hxx -usr/include/opencascade/TopoDS_TCompSolid.lxx -usr/include/opencascade/TopoDS_TCompound.hxx -usr/include/opencascade/TopoDS_TCompound.lxx -usr/include/opencascade/TopoDS_TEdge.hxx -usr/include/opencascade/TopoDS_TEdge.lxx -usr/include/opencascade/TopoDS_TFace.hxx -usr/include/opencascade/TopoDS_TFace.lxx -usr/include/opencascade/TopoDS_TShape.hxx -usr/include/opencascade/TopoDS_TShell.hxx -usr/include/opencascade/TopoDS_TShell.lxx -usr/include/opencascade/TopoDS_TSolid.hxx -usr/include/opencascade/TopoDS_TSolid.lxx -usr/include/opencascade/TopoDS_TVertex.hxx -usr/include/opencascade/TopoDS_TVertex.lxx -usr/include/opencascade/TopoDS_TWire.hxx -usr/include/opencascade/TopoDS_TWire.lxx -usr/include/opencascade/TopoDS_UnCompatibleShapes.hxx -usr/include/opencascade/TopoDS_Vertex.hxx -usr/include/opencascade/TopoDS_Vertex.lxx -usr/include/opencascade/TopoDS_Wire.hxx -usr/include/opencascade/TopoDS_Wire.lxx -usr/include/opencascade/gce_ErrorType.hxx -usr/include/opencascade/gce_MakeCirc.hxx -usr/include/opencascade/gce_MakeCirc2d.hxx -usr/include/opencascade/gce_MakeCone.hxx -usr/include/opencascade/gce_MakeCylinder.hxx -usr/include/opencascade/gce_MakeDir.hxx -usr/include/opencascade/gce_MakeDir2d.hxx -usr/include/opencascade/gce_MakeElips.hxx -usr/include/opencascade/gce_MakeElips2d.hxx -usr/include/opencascade/gce_MakeHypr.hxx -usr/include/opencascade/gce_MakeHypr2d.hxx -usr/include/opencascade/gce_MakeLin.hxx -usr/include/opencascade/gce_MakeLin2d.hxx -usr/include/opencascade/gce_MakeMirror.hxx -usr/include/opencascade/gce_MakeMirror2d.hxx -usr/include/opencascade/gce_MakeParab.hxx -usr/include/opencascade/gce_MakeParab2d.hxx -usr/include/opencascade/gce_MakePln.hxx -usr/include/opencascade/gce_MakeRotation.hxx -usr/include/opencascade/gce_MakeRotation2d.hxx -usr/include/opencascade/gce_MakeScale.hxx -usr/include/opencascade/gce_MakeScale2d.hxx -usr/include/opencascade/gce_MakeTranslation.hxx -usr/include/opencascade/gce_MakeTranslation2d.hxx -usr/include/opencascade/gce_Root.hxx -usr/include/opencascade/gce_Root.lxx +usr/lib/cmake/opencascade/OpenCASCADEModelingDataTargets*.cmake usr/lib/*/libTKBRep.so usr/lib/*/libTKG2d.so usr/lib/*/libTKG3d.so usr/lib/*/libTKGeomBase.so -usr/lib/cmake/opencascade/OpenCASCADEModelingDataTargets*.cmake -usr/include/opencascade/TopTools_DataMapOfShapeBox.hxx -usr/include/opencascade/TopTools_IndexedDataMapOfShapeReal.hxx -usr/include/opencascade/TopTools_ListOfListOfShape.hxx diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-dev.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-dev.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-modeling-data-dev.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-modeling-data-dev.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,2 @@ +# This is lintian bug #966295 +libocct-modeling-data-dev: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-ocaf-7.4.install opencascade-7.5.1+dfsg1/debian/libocct-ocaf-7.4.install --- opencascade-7.4.1+dfsg1/debian/libocct-ocaf-7.4.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-ocaf-7.4.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -usr/lib/*/libTKBin.so.* -usr/lib/*/libTKBinL.so.* -usr/lib/*/libTKBinTObj.so.* -usr/lib/*/libTKCAF.so.* -usr/lib/*/libTKCDF.so.* -usr/lib/*/libTKLCAF.so.* -usr/lib/*/libTKStd.so.* -usr/lib/*/libTKStdL.so.* -usr/lib/*/libTKTObj.so.* -usr/lib/*/libTKVCAF.so.* -usr/lib/*/libTKXml.so.* -usr/lib/*/libTKXmlL.so.* -usr/lib/*/libTKXmlTObj.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-ocaf-7.4.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-ocaf-7.4.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-ocaf-7.4.lintian-overrides 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-ocaf-7.4.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -# this package contains a bunch of libraries and can thus not be named properly -package-name-doesnt-match-sonames - -# false positive lack of hardening detected -hardening-no-fortify-functions -# symbols control files are not sustainable. -no-symbols-control-file diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-ocaf-7.5.install opencascade-7.5.1+dfsg1/debian/libocct-ocaf-7.5.install --- opencascade-7.4.1+dfsg1/debian/libocct-ocaf-7.5.install 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-ocaf-7.5.install 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,13 @@ +usr/lib/*/libTKBinL.so.* +usr/lib/*/libTKBin.so.* +usr/lib/*/libTKBinTObj.so.* +usr/lib/*/libTKCAF.so.* +usr/lib/*/libTKCDF.so.* +usr/lib/*/libTKLCAF.so.* +usr/lib/*/libTKStdL.so.* +usr/lib/*/libTKStd.so.* +usr/lib/*/libTKTObj.so.* +usr/lib/*/libTKVCAF.so.* +usr/lib/*/libTKXmlL.so.* +usr/lib/*/libTKXml.so.* +usr/lib/*/libTKXmlTObj.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-ocaf-7.5.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-ocaf-7.5.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-ocaf-7.5.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-ocaf-7.5.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,9 @@ +# this package contains a bunch of libraries and can thus not be named properly +package-name-doesnt-match-sonames + +# false positive lack of hardening detected +hardening-no-fortify-functions +# symbols control files are not sustainable. +no-symbols-control-file +# This is lintian bug #966295 +libocct-ocaf-7.5: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-ocaf-dev.install opencascade-7.5.1+dfsg1/debian/libocct-ocaf-dev.install --- opencascade-7.4.1+dfsg1/debian/libocct-ocaf-dev.install 2020-04-25 18:50:15.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-ocaf-dev.install 2021-02-01 03:05:25.000000000 +0000 @@ -1,70 +1,62 @@ -usr/include/opencascade/AppStdL_Application.hxx usr/include/opencascade/AppStd_Application.hxx -usr/include/opencascade/BinDrivers.hxx +usr/include/opencascade/AppStdL_Application.hxx usr/include/opencascade/BinDrivers_DocumentRetrievalDriver.hxx usr/include/opencascade/BinDrivers_DocumentStorageDriver.hxx +usr/include/opencascade/BinDrivers.hxx usr/include/opencascade/BinDrivers_Marker.hxx -usr/include/opencascade/BinLDrivers.hxx usr/include/opencascade/BinLDrivers_DocumentRetrievalDriver.hxx usr/include/opencascade/BinLDrivers_DocumentSection.hxx usr/include/opencascade/BinLDrivers_DocumentStorageDriver.hxx +usr/include/opencascade/BinLDrivers.hxx usr/include/opencascade/BinLDrivers_Marker.hxx usr/include/opencascade/BinLDrivers_VectorOfDocumentSection.hxx -usr/include/opencascade/BinMDF.hxx -usr/include/opencascade/BinMDF_ADriver.hxx -usr/include/opencascade/BinMDF_ADriver.lxx -usr/include/opencascade/BinMDF_ADriverTable.hxx -usr/include/opencascade/BinMDF_ADriverTable.lxx -usr/include/opencascade/BinMDF_DataMapIteratorOfTypeADriverMap.hxx -usr/include/opencascade/BinMDF_DoubleMapIteratorOfTypeIdMap.hxx -usr/include/opencascade/BinMDF_ReferenceDriver.hxx -usr/include/opencascade/BinMDF_StringIdMap.hxx -usr/include/opencascade/BinMDF_TagSourceDriver.hxx -usr/include/opencascade/BinMDF_TypeADriverMap.hxx -usr/include/opencascade/BinMDF_TypeIdMap.hxx -usr/include/opencascade/BinMDataStd.hxx usr/include/opencascade/BinMDataStd_AsciiStringDriver.hxx usr/include/opencascade/BinMDataStd_BooleanArrayDriver.hxx usr/include/opencascade/BinMDataStd_BooleanListDriver.hxx usr/include/opencascade/BinMDataStd_ByteArrayDriver.hxx -usr/include/opencascade/BinMDataStd_CommentDriver.hxx -usr/include/opencascade/BinMDataStd_DirectoryDriver.hxx usr/include/opencascade/BinMDataStd_ExpressionDriver.hxx usr/include/opencascade/BinMDataStd_ExtStringArrayDriver.hxx usr/include/opencascade/BinMDataStd_ExtStringListDriver.hxx -usr/include/opencascade/BinMDataStd_IntPackedMapDriver.hxx +usr/include/opencascade/BinMDataStd_GenericEmptyDriver.hxx +usr/include/opencascade/BinMDataStd_GenericExtStringDriver.hxx +usr/include/opencascade/BinMDataStd.hxx usr/include/opencascade/BinMDataStd_IntegerArrayDriver.hxx usr/include/opencascade/BinMDataStd_IntegerDriver.hxx usr/include/opencascade/BinMDataStd_IntegerListDriver.hxx -usr/include/opencascade/BinMDataStd_NameDriver.hxx +usr/include/opencascade/BinMDataStd_IntPackedMapDriver.hxx usr/include/opencascade/BinMDataStd_NamedDataDriver.hxx -usr/include/opencascade/BinMDataStd_NoteBookDriver.hxx usr/include/opencascade/BinMDataStd_RealArrayDriver.hxx usr/include/opencascade/BinMDataStd_RealDriver.hxx usr/include/opencascade/BinMDataStd_RealListDriver.hxx usr/include/opencascade/BinMDataStd_ReferenceArrayDriver.hxx usr/include/opencascade/BinMDataStd_ReferenceListDriver.hxx -usr/include/opencascade/BinMDataStd_RelationDriver.hxx -usr/include/opencascade/BinMDataStd_TickDriver.hxx usr/include/opencascade/BinMDataStd_TreeNodeDriver.hxx usr/include/opencascade/BinMDataStd_UAttributeDriver.hxx usr/include/opencascade/BinMDataStd_VariableDriver.hxx -usr/include/opencascade/BinMDataXtd.hxx -usr/include/opencascade/BinMDataXtd_AxisDriver.hxx usr/include/opencascade/BinMDataXtd_ConstraintDriver.hxx usr/include/opencascade/BinMDataXtd_GeometryDriver.hxx +usr/include/opencascade/BinMDataXtd.hxx usr/include/opencascade/BinMDataXtd_PatternStdDriver.hxx -usr/include/opencascade/BinMDataXtd_PlacementDriver.hxx -usr/include/opencascade/BinMDataXtd_PlaneDriver.hxx -usr/include/opencascade/BinMDataXtd_PointDriver.hxx usr/include/opencascade/BinMDataXtd_PositionDriver.hxx usr/include/opencascade/BinMDataXtd_PresentationDriver.hxx -usr/include/opencascade/BinMDataXtd_ShapeDriver.hxx +usr/include/opencascade/BinMDF_ADriver.hxx +usr/include/opencascade/BinMDF_ADriver.lxx +usr/include/opencascade/BinMDF_ADriverTable.hxx +usr/include/opencascade/BinMDF_ADriverTable.lxx +usr/include/opencascade/BinMDF_DataMapIteratorOfTypeADriverMap.hxx +usr/include/opencascade/BinMDF_DerivedDriver.hxx +usr/include/opencascade/BinMDF_DoubleMapIteratorOfTypeIdMap.hxx +usr/include/opencascade/BinMDF.hxx +usr/include/opencascade/BinMDF_ReferenceDriver.hxx +usr/include/opencascade/BinMDF_StringIdMap.hxx +usr/include/opencascade/BinMDF_TagSourceDriver.hxx +usr/include/opencascade/BinMDF_TypeADriverMap.hxx +usr/include/opencascade/BinMDF_TypeIdMap.hxx usr/include/opencascade/BinMDocStd.hxx usr/include/opencascade/BinMDocStd_XLinkDriver.hxx -usr/include/opencascade/BinMFunction.hxx usr/include/opencascade/BinMFunction_FunctionDriver.hxx usr/include/opencascade/BinMFunction_GraphNodeDriver.hxx +usr/include/opencascade/BinMFunction.hxx usr/include/opencascade/BinMFunction_ScopeDriver.hxx usr/include/opencascade/BinMNaming.hxx usr/include/opencascade/BinMNaming_NamedShapeDriver.hxx @@ -72,31 +64,29 @@ usr/include/opencascade/BinMNaming_NamingDriver.hxx usr/include/opencascade/BinObjMgt_PByte.hxx usr/include/opencascade/BinObjMgt_PChar.hxx +usr/include/opencascade/BinObjMgt_Persistent.hxx +usr/include/opencascade/BinObjMgt_Persistent.lxx usr/include/opencascade/BinObjMgt_PExtChar.hxx usr/include/opencascade/BinObjMgt_PInteger.hxx usr/include/opencascade/BinObjMgt_PReal.hxx usr/include/opencascade/BinObjMgt_PShortReal.hxx -usr/include/opencascade/BinObjMgt_Persistent.hxx -usr/include/opencascade/BinObjMgt_Persistent.lxx usr/include/opencascade/BinObjMgt_RRelocationTable.hxx usr/include/opencascade/BinObjMgt_SRelocationTable.hxx -usr/include/opencascade/BinTObjDrivers.hxx usr/include/opencascade/BinTObjDrivers_DocumentRetrievalDriver.hxx usr/include/opencascade/BinTObjDrivers_DocumentStorageDriver.hxx +usr/include/opencascade/BinTObjDrivers.hxx usr/include/opencascade/BinTObjDrivers_IntSparseArrayDriver.hxx usr/include/opencascade/BinTObjDrivers_ModelDriver.hxx usr/include/opencascade/BinTObjDrivers_ObjectDriver.hxx usr/include/opencascade/BinTObjDrivers_ReferenceDriver.hxx usr/include/opencascade/BinTObjDrivers_XYZDriver.hxx -usr/include/opencascade/CDF.hxx usr/include/opencascade/CDF_Application.hxx usr/include/opencascade/CDF_Directory.hxx usr/include/opencascade/CDF_DirectoryIterator.hxx usr/include/opencascade/CDF_FWOSDriver.hxx -usr/include/opencascade/CDF_MetaDataDriver.hxx usr/include/opencascade/CDF_MetaDataDriverError.hxx usr/include/opencascade/CDF_MetaDataDriverFactory.hxx -usr/include/opencascade/CDF_Session.hxx +usr/include/opencascade/CDF_MetaDataDriver.hxx usr/include/opencascade/CDF_Store.hxx usr/include/opencascade/CDF_StoreList.hxx usr/include/opencascade/CDF_StoreSetNameStatus.hxx @@ -106,9 +96,8 @@ usr/include/opencascade/CDM_Application.hxx usr/include/opencascade/CDM_CanCloseStatus.hxx usr/include/opencascade/CDM_DataMapIteratorOfMetaDataLookUpTable.hxx -usr/include/opencascade/CDM_DataMapIteratorOfPresentationDirectory.hxx -usr/include/opencascade/CDM_Document.hxx usr/include/opencascade/CDM_DocumentHasher.hxx +usr/include/opencascade/CDM_Document.hxx usr/include/opencascade/CDM_DocumentPointer.hxx usr/include/opencascade/CDM_ListIteratorOfListOfDocument.hxx usr/include/opencascade/CDM_ListIteratorOfListOfReferences.hxx @@ -119,20 +108,17 @@ usr/include/opencascade/CDM_MetaData.hxx usr/include/opencascade/CDM_MetaDataLookUpTable.hxx usr/include/opencascade/CDM_NamesDirectory.hxx -usr/include/opencascade/CDM_PresentationDirectory.hxx usr/include/opencascade/CDM_Reference.hxx usr/include/opencascade/CDM_ReferenceIterator.hxx -usr/include/opencascade/LDOMBasicString.hxx -usr/include/opencascade/LDOMParser.hxx -usr/include/opencascade/LDOMString.hxx usr/include/opencascade/LDOM_Attr.hxx usr/include/opencascade/LDOM_BasicAttribute.hxx usr/include/opencascade/LDOM_BasicElement.hxx usr/include/opencascade/LDOM_BasicNode.hxx +usr/include/opencascade/LDOMBasicString.hxx usr/include/opencascade/LDOM_BasicText.hxx usr/include/opencascade/LDOM_CDATASection.hxx -usr/include/opencascade/LDOM_CharReference.hxx usr/include/opencascade/LDOM_CharacterData.hxx +usr/include/opencascade/LDOM_CharReference.hxx usr/include/opencascade/LDOM_Comment.hxx usr/include/opencascade/LDOM_DeclareSequence.hxx usr/include/opencascade/LDOM_Document.hxx @@ -143,19 +129,21 @@ usr/include/opencascade/LDOM_Node.hxx usr/include/opencascade/LDOM_NodeList.hxx usr/include/opencascade/LDOM_OSStream.hxx +usr/include/opencascade/LDOMParser.hxx +usr/include/opencascade/LDOMString.hxx usr/include/opencascade/LDOM_Text.hxx usr/include/opencascade/LDOM_XmlReader.hxx usr/include/opencascade/LDOM_XmlWriter.hxx -usr/include/opencascade/PCDM.hxx usr/include/opencascade/PCDM_BaseDriverPointer.hxx -usr/include/opencascade/PCDM_DOMHeaderParser.hxx usr/include/opencascade/PCDM_Document.hxx +usr/include/opencascade/PCDM_DOMHeaderParser.hxx usr/include/opencascade/PCDM_DriverError.hxx -usr/include/opencascade/PCDM_ReadWriter.hxx -usr/include/opencascade/PCDM_ReadWriter_1.hxx +usr/include/opencascade/PCDM.hxx usr/include/opencascade/PCDM_Reader.hxx usr/include/opencascade/PCDM_Reader.lxx usr/include/opencascade/PCDM_ReaderStatus.hxx +usr/include/opencascade/PCDM_ReadWriter_1.hxx +usr/include/opencascade/PCDM_ReadWriter.hxx usr/include/opencascade/PCDM_Reference.hxx usr/include/opencascade/PCDM_ReferenceIterator.hxx usr/include/opencascade/PCDM_RetrievalDriver.hxx @@ -165,24 +153,23 @@ usr/include/opencascade/PCDM_StoreStatus.hxx usr/include/opencascade/PCDM_TypeOfFileDriver.hxx usr/include/opencascade/PCDM_Writer.hxx -usr/include/opencascade/ShapePersistent.hxx usr/include/opencascade/ShapePersistent_BRep.hxx -usr/include/opencascade/ShapePersistent_Geom.hxx -usr/include/opencascade/ShapePersistent_Geom2d.hxx usr/include/opencascade/ShapePersistent_Geom2d_Curve.hxx +usr/include/opencascade/ShapePersistent_Geom2d.hxx usr/include/opencascade/ShapePersistent_Geom_Curve.hxx +usr/include/opencascade/ShapePersistent_Geom.hxx usr/include/opencascade/ShapePersistent_Geom_Surface.hxx usr/include/opencascade/ShapePersistent_HArray1.hxx usr/include/opencascade/ShapePersistent_HArray2.hxx usr/include/opencascade/ShapePersistent_HSequence.hxx +usr/include/opencascade/ShapePersistent.hxx usr/include/opencascade/ShapePersistent_Poly.hxx usr/include/opencascade/ShapePersistent_TopoDS.hxx usr/include/opencascade/ShapePersistent_TriangleMode.hxx -usr/include/opencascade/StdDrivers.hxx usr/include/opencascade/StdDrivers_DocumentRetrievalDriver.hxx -usr/include/opencascade/StdLDrivers.hxx +usr/include/opencascade/StdDrivers.hxx usr/include/opencascade/StdLDrivers_DocumentRetrievalDriver.hxx -usr/include/opencascade/StdLPersistent.hxx +usr/include/opencascade/StdLDrivers.hxx usr/include/opencascade/StdLPersistent_Collection.hxx usr/include/opencascade/StdLPersistent_Data.hxx usr/include/opencascade/StdLPersistent_Dependency.hxx @@ -191,6 +178,7 @@ usr/include/opencascade/StdLPersistent_HArray1.hxx usr/include/opencascade/StdLPersistent_HArray2.hxx usr/include/opencascade/StdLPersistent_HString.hxx +usr/include/opencascade/StdLPersistent.hxx usr/include/opencascade/StdLPersistent_NamedData.hxx usr/include/opencascade/StdLPersistent_Real.hxx usr/include/opencascade/StdLPersistent_TreeNode.hxx @@ -198,6 +186,13 @@ usr/include/opencascade/StdLPersistent_Variable.hxx usr/include/opencascade/StdLPersistent_Void.hxx usr/include/opencascade/StdLPersistent_XLink.hxx +usr/include/opencascade/StdObject_gp_Axes.hxx +usr/include/opencascade/StdObject_gp_Curves.hxx +usr/include/opencascade/StdObject_gp_Surfaces.hxx +usr/include/opencascade/StdObject_gp_Trsfs.hxx +usr/include/opencascade/StdObject_gp_Vectors.hxx +usr/include/opencascade/StdObject_Location.hxx +usr/include/opencascade/StdObject_Shape.hxx usr/include/opencascade/StdObjMgt_Attribute.hxx usr/include/opencascade/StdObjMgt_MapOfInstantiators.hxx usr/include/opencascade/StdObjMgt_Persistent.hxx @@ -205,44 +200,115 @@ usr/include/opencascade/StdObjMgt_SharedObject.hxx usr/include/opencascade/StdObjMgt_TransientPersistentMap.hxx usr/include/opencascade/StdObjMgt_WriteData.hxx -usr/include/opencascade/StdObject_Location.hxx -usr/include/opencascade/StdObject_Shape.hxx -usr/include/opencascade/StdObject_gp_Axes.hxx -usr/include/opencascade/StdObject_gp_Curves.hxx -usr/include/opencascade/StdObject_gp_Surfaces.hxx -usr/include/opencascade/StdObject_gp_Trsfs.hxx -usr/include/opencascade/StdObject_gp_Vectors.hxx -usr/include/opencascade/StdPersistent.hxx -usr/include/opencascade/StdPersistent_DataXtd.hxx usr/include/opencascade/StdPersistent_DataXtd_Constraint.hxx +usr/include/opencascade/StdPersistent_DataXtd.hxx usr/include/opencascade/StdPersistent_DataXtd_PatternStd.hxx usr/include/opencascade/StdPersistent_HArray1.hxx +usr/include/opencascade/StdPersistent.hxx usr/include/opencascade/StdPersistent_Naming.hxx usr/include/opencascade/StdPersistent_PPrsStd.hxx usr/include/opencascade/StdPersistent_TopLoc.hxx usr/include/opencascade/StdPersistent_TopoDS.hxx -usr/include/opencascade/StdStorage.hxx usr/include/opencascade/StdStorage_BacketOfPersistent.hxx usr/include/opencascade/StdStorage_Data.hxx -usr/include/opencascade/StdStorage_HSequenceOfRoots.hxx usr/include/opencascade/StdStorage_HeaderData.hxx +usr/include/opencascade/StdStorage_HSequenceOfRoots.hxx +usr/include/opencascade/StdStorage.hxx usr/include/opencascade/StdStorage_MapOfRoots.hxx usr/include/opencascade/StdStorage_MapOfTypes.hxx -usr/include/opencascade/StdStorage_Root.hxx usr/include/opencascade/StdStorage_RootData.hxx +usr/include/opencascade/StdStorage_Root.hxx usr/include/opencascade/StdStorage_SequenceOfRoots.hxx usr/include/opencascade/StdStorage_TypeData.hxx -usr/include/opencascade/TDF.hxx -usr/include/opencascade/TDF_Attribute.hxx -usr/include/opencascade/TDF_Attribute.lxx +usr/include/opencascade/TDataStd_AsciiString.hxx +usr/include/opencascade/TDataStd_BooleanArray.hxx +usr/include/opencascade/TDataStd_BooleanList.hxx +usr/include/opencascade/TDataStd_ByteArray.hxx +usr/include/opencascade/TDataStd_ChildNodeIterator.hxx +usr/include/opencascade/TDataStd_Comment.hxx +usr/include/opencascade/TDataStd_Current.hxx +usr/include/opencascade/TDataStd_DataMapIteratorOfDataMapOfStringByte.hxx +usr/include/opencascade/TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger.hxx +usr/include/opencascade/TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal.hxx +usr/include/opencascade/TDataStd_DataMapIteratorOfDataMapOfStringReal.hxx +usr/include/opencascade/TDataStd_DataMapIteratorOfDataMapOfStringString.hxx +usr/include/opencascade/TDataStd_DataMapOfStringByte.hxx +usr/include/opencascade/TDataStd_DataMapOfStringHArray1OfInteger.hxx +usr/include/opencascade/TDataStd_DataMapOfStringHArray1OfReal.hxx +usr/include/opencascade/TDataStd_DataMapOfStringReal.hxx +usr/include/opencascade/TDataStd_DataMapOfStringString.hxx +usr/include/opencascade/TDataStd_DeltaOnModificationOfByteArray.hxx +usr/include/opencascade/TDataStd_DeltaOnModificationOfExtStringArray.hxx +usr/include/opencascade/TDataStd_DeltaOnModificationOfIntArray.hxx +usr/include/opencascade/TDataStd_DeltaOnModificationOfIntPackedMap.hxx +usr/include/opencascade/TDataStd_DeltaOnModificationOfRealArray.hxx +usr/include/opencascade/TDataStd_Directory.hxx +usr/include/opencascade/TDataStd_Expression.hxx +usr/include/opencascade/TDataStd_ExtStringArray.hxx +usr/include/opencascade/TDataStd_ExtStringList.hxx +usr/include/opencascade/TDataStd_GenericEmpty.hxx +usr/include/opencascade/TDataStd_GenericExtString.hxx +usr/include/opencascade/TDataStd_HDataMapOfStringByte.hxx +usr/include/opencascade/TDataStd_HDataMapOfStringHArray1OfInteger.hxx +usr/include/opencascade/TDataStd_HDataMapOfStringHArray1OfReal.hxx +usr/include/opencascade/TDataStd_HDataMapOfStringInteger.hxx +usr/include/opencascade/TDataStd_HDataMapOfStringReal.hxx +usr/include/opencascade/TDataStd_HDataMapOfStringString.hxx +usr/include/opencascade/TDataStd_HLabelArray1.hxx +usr/include/opencascade/TDataStd.hxx +usr/include/opencascade/TDataStd_IntegerArray.hxx +usr/include/opencascade/TDataStd_Integer.hxx +usr/include/opencascade/TDataStd_IntegerList.hxx +usr/include/opencascade/TDataStd_IntPackedMap.hxx +usr/include/opencascade/TDataStd_LabelArray1.hxx +usr/include/opencascade/TDataStd_ListIteratorOfListOfByte.hxx +usr/include/opencascade/TDataStd_ListIteratorOfListOfExtendedString.hxx +usr/include/opencascade/TDataStd_ListOfByte.hxx +usr/include/opencascade/TDataStd_ListOfExtendedString.hxx +usr/include/opencascade/TDataStd_NamedData.hxx +usr/include/opencascade/TDataStd_Name.hxx +usr/include/opencascade/TDataStd_NoteBook.hxx +usr/include/opencascade/TDataStd_PtrTreeNode.hxx +usr/include/opencascade/TDataStd_RealArray.hxx +usr/include/opencascade/TDataStd_RealEnum.hxx +usr/include/opencascade/TDataStd_Real.hxx +usr/include/opencascade/TDataStd_RealList.hxx +usr/include/opencascade/TDataStd_ReferenceArray.hxx +usr/include/opencascade/TDataStd_ReferenceList.hxx +usr/include/opencascade/TDataStd_Relation.hxx +usr/include/opencascade/TDataStd_Tick.hxx +usr/include/opencascade/TDataStd_TreeNode.hxx +usr/include/opencascade/TDataStd_TreeNode.lxx +usr/include/opencascade/TDataStd_UAttribute.hxx +usr/include/opencascade/TDataStd_Variable.hxx +usr/include/opencascade/TDataXtd_Array1OfTrsf.hxx +usr/include/opencascade/TDataXtd_Axis.hxx +usr/include/opencascade/TDataXtd_ConstraintEnum.hxx +usr/include/opencascade/TDataXtd_Constraint.hxx +usr/include/opencascade/TDataXtd_GeometryEnum.hxx +usr/include/opencascade/TDataXtd_Geometry.hxx +usr/include/opencascade/TDataXtd_HArray1OfTrsf.hxx +usr/include/opencascade/TDataXtd.hxx +usr/include/opencascade/TDataXtd_Pattern.hxx +usr/include/opencascade/TDataXtd_PatternStd.hxx +usr/include/opencascade/TDataXtd_PatternStd.lxx +usr/include/opencascade/TDataXtd_Placement.hxx +usr/include/opencascade/TDataXtd_Plane.hxx +usr/include/opencascade/TDataXtd_Point.hxx +usr/include/opencascade/TDataXtd_Position.hxx +usr/include/opencascade/TDataXtd_Presentation.hxx +usr/include/opencascade/TDataXtd_Shape.hxx +usr/include/opencascade/TDataXtd_Triangulation.hxx usr/include/opencascade/TDF_AttributeArray1.hxx usr/include/opencascade/TDF_AttributeDataMap.hxx usr/include/opencascade/TDF_AttributeDelta.hxx usr/include/opencascade/TDF_AttributeDeltaList.hxx usr/include/opencascade/TDF_AttributeDoubleMap.hxx +usr/include/opencascade/TDF_Attribute.hxx usr/include/opencascade/TDF_AttributeIndexedMap.hxx usr/include/opencascade/TDF_AttributeIterator.hxx usr/include/opencascade/TDF_AttributeList.hxx +usr/include/opencascade/TDF_Attribute.lxx usr/include/opencascade/TDF_AttributeMap.hxx usr/include/opencascade/TDF_AttributeSequence.hxx usr/include/opencascade/TDF_ChildIDIterator.hxx @@ -266,32 +332,34 @@ usr/include/opencascade/TDF_DefaultDeltaOnModification.hxx usr/include/opencascade/TDF_DefaultDeltaOnRemoval.hxx usr/include/opencascade/TDF_Delta.hxx -usr/include/opencascade/TDF_Delta.lxx usr/include/opencascade/TDF_DeltaList.hxx +usr/include/opencascade/TDF_Delta.lxx usr/include/opencascade/TDF_DeltaOnAddition.hxx usr/include/opencascade/TDF_DeltaOnForget.hxx usr/include/opencascade/TDF_DeltaOnModification.hxx usr/include/opencascade/TDF_DeltaOnRemoval.hxx usr/include/opencascade/TDF_DeltaOnResume.hxx +usr/include/opencascade/TDF_DerivedAttribute.hxx usr/include/opencascade/TDF_DoubleMapIteratorOfAttributeDoubleMap.hxx usr/include/opencascade/TDF_DoubleMapIteratorOfGUIDProgIDMap.hxx usr/include/opencascade/TDF_DoubleMapIteratorOfLabelDoubleMap.hxx usr/include/opencascade/TDF_GUIDProgIDMap.hxx usr/include/opencascade/TDF_HAllocator.hxx usr/include/opencascade/TDF_HAttributeArray1.hxx +usr/include/opencascade/TDF.hxx usr/include/opencascade/TDF_IDFilter.hxx usr/include/opencascade/TDF_IDFilter.lxx usr/include/opencascade/TDF_IDList.hxx usr/include/opencascade/TDF_IDMap.hxx -usr/include/opencascade/TDF_Label.hxx -usr/include/opencascade/TDF_Label.lxx usr/include/opencascade/TDF_LabelDataMap.hxx usr/include/opencascade/TDF_LabelDoubleMap.hxx +usr/include/opencascade/TDF_Label.hxx usr/include/opencascade/TDF_LabelIndexedMap.hxx usr/include/opencascade/TDF_LabelIntegerMap.hxx usr/include/opencascade/TDF_LabelList.hxx -usr/include/opencascade/TDF_LabelMap.hxx +usr/include/opencascade/TDF_Label.lxx usr/include/opencascade/TDF_LabelMapHasher.hxx +usr/include/opencascade/TDF_LabelMap.hxx usr/include/opencascade/TDF_LabelNode.hxx usr/include/opencascade/TDF_LabelNodePtr.hxx usr/include/opencascade/TDF_LabelSequence.hxx @@ -309,93 +377,15 @@ usr/include/opencascade/TDF_Tool.hxx usr/include/opencascade/TDF_Transaction.hxx usr/include/opencascade/TDF_Transaction.lxx -usr/include/opencascade/TDataStd.hxx -usr/include/opencascade/TDataStd_AsciiString.hxx -usr/include/opencascade/TDataStd_BooleanArray.hxx -usr/include/opencascade/TDataStd_BooleanList.hxx -usr/include/opencascade/TDataStd_ByteArray.hxx -usr/include/opencascade/TDataStd_ChildNodeIterator.hxx -usr/include/opencascade/TDataStd_Comment.hxx -usr/include/opencascade/TDataStd_Current.hxx -usr/include/opencascade/TDataStd_DataMapIteratorOfDataMapOfStringByte.hxx -usr/include/opencascade/TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger.hxx -usr/include/opencascade/TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal.hxx -usr/include/opencascade/TDataStd_DataMapIteratorOfDataMapOfStringReal.hxx -usr/include/opencascade/TDataStd_DataMapIteratorOfDataMapOfStringString.hxx -usr/include/opencascade/TDataStd_DataMapOfStringByte.hxx -usr/include/opencascade/TDataStd_DataMapOfStringHArray1OfInteger.hxx -usr/include/opencascade/TDataStd_DataMapOfStringHArray1OfReal.hxx -usr/include/opencascade/TDataStd_DataMapOfStringReal.hxx -usr/include/opencascade/TDataStd_DataMapOfStringString.hxx -usr/include/opencascade/TDataStd_DeltaOnModificationOfByteArray.hxx -usr/include/opencascade/TDataStd_DeltaOnModificationOfExtStringArray.hxx -usr/include/opencascade/TDataStd_DeltaOnModificationOfIntArray.hxx -usr/include/opencascade/TDataStd_DeltaOnModificationOfIntPackedMap.hxx -usr/include/opencascade/TDataStd_DeltaOnModificationOfRealArray.hxx -usr/include/opencascade/TDataStd_Directory.hxx -usr/include/opencascade/TDataStd_Expression.hxx -usr/include/opencascade/TDataStd_ExtStringArray.hxx -usr/include/opencascade/TDataStd_ExtStringList.hxx -usr/include/opencascade/TDataStd_HDataMapOfStringByte.hxx -usr/include/opencascade/TDataStd_HDataMapOfStringHArray1OfInteger.hxx -usr/include/opencascade/TDataStd_HDataMapOfStringHArray1OfReal.hxx -usr/include/opencascade/TDataStd_HDataMapOfStringInteger.hxx -usr/include/opencascade/TDataStd_HDataMapOfStringReal.hxx -usr/include/opencascade/TDataStd_HDataMapOfStringString.hxx -usr/include/opencascade/TDataStd_HLabelArray1.hxx -usr/include/opencascade/TDataStd_IntPackedMap.hxx -usr/include/opencascade/TDataStd_Integer.hxx -usr/include/opencascade/TDataStd_IntegerArray.hxx -usr/include/opencascade/TDataStd_IntegerList.hxx -usr/include/opencascade/TDataStd_LabelArray1.hxx -usr/include/opencascade/TDataStd_ListIteratorOfListOfByte.hxx -usr/include/opencascade/TDataStd_ListIteratorOfListOfExtendedString.hxx -usr/include/opencascade/TDataStd_ListOfByte.hxx -usr/include/opencascade/TDataStd_ListOfExtendedString.hxx -usr/include/opencascade/TDataStd_Name.hxx -usr/include/opencascade/TDataStd_NamedData.hxx -usr/include/opencascade/TDataStd_NamedData.lxx -usr/include/opencascade/TDataStd_NoteBook.hxx -usr/include/opencascade/TDataStd_PtrTreeNode.hxx -usr/include/opencascade/TDataStd_Real.hxx -usr/include/opencascade/TDataStd_RealArray.hxx -usr/include/opencascade/TDataStd_RealEnum.hxx -usr/include/opencascade/TDataStd_RealList.hxx -usr/include/opencascade/TDataStd_ReferenceArray.hxx -usr/include/opencascade/TDataStd_ReferenceList.hxx -usr/include/opencascade/TDataStd_Relation.hxx -usr/include/opencascade/TDataStd_Tick.hxx -usr/include/opencascade/TDataStd_TreeNode.hxx -usr/include/opencascade/TDataStd_TreeNode.lxx -usr/include/opencascade/TDataStd_UAttribute.hxx -usr/include/opencascade/TDataStd_Variable.hxx -usr/include/opencascade/TDataXtd.hxx -usr/include/opencascade/TDataXtd_Array1OfTrsf.hxx -usr/include/opencascade/TDataXtd_Axis.hxx -usr/include/opencascade/TDataXtd_Constraint.hxx -usr/include/opencascade/TDataXtd_ConstraintEnum.hxx -usr/include/opencascade/TDataXtd_Geometry.hxx -usr/include/opencascade/TDataXtd_GeometryEnum.hxx -usr/include/opencascade/TDataXtd_HArray1OfTrsf.hxx -usr/include/opencascade/TDataXtd_Pattern.hxx -usr/include/opencascade/TDataXtd_PatternStd.hxx -usr/include/opencascade/TDataXtd_PatternStd.lxx -usr/include/opencascade/TDataXtd_Placement.hxx -usr/include/opencascade/TDataXtd_Plane.hxx -usr/include/opencascade/TDataXtd_Point.hxx -usr/include/opencascade/TDataXtd_Position.hxx -usr/include/opencascade/TDataXtd_Presentation.hxx -usr/include/opencascade/TDataXtd_Shape.hxx -usr/include/opencascade/TDataXtd_Triangulation.hxx -usr/include/opencascade/TDocStd.hxx -usr/include/opencascade/TDocStd_Application.hxx usr/include/opencascade/TDocStd_ApplicationDelta.hxx usr/include/opencascade/TDocStd_ApplicationDelta.lxx +usr/include/opencascade/TDocStd_Application.hxx usr/include/opencascade/TDocStd_CompoundDelta.hxx usr/include/opencascade/TDocStd_Context.hxx usr/include/opencascade/TDocStd_DataMapIteratorOfLabelIDMapDataMap.hxx usr/include/opencascade/TDocStd_Document.hxx usr/include/opencascade/TDocStd_Document.lxx +usr/include/opencascade/TDocStd.hxx usr/include/opencascade/TDocStd_LabelIDMapDataMap.hxx usr/include/opencascade/TDocStd_Modified.hxx usr/include/opencascade/TDocStd_MultiTransactionManager.hxx @@ -405,9 +395,9 @@ usr/include/opencascade/TDocStd_SequenceOfApplicationDelta.hxx usr/include/opencascade/TDocStd_SequenceOfDocument.hxx usr/include/opencascade/TDocStd_XLink.hxx -usr/include/opencascade/TDocStd_XLink.lxx usr/include/opencascade/TDocStd_XLinkIterator.hxx usr/include/opencascade/TDocStd_XLinkIterator.lxx +usr/include/opencascade/TDocStd_XLink.lxx usr/include/opencascade/TDocStd_XLinkPtr.hxx usr/include/opencascade/TDocStd_XLinkRoot.hxx usr/include/opencascade/TDocStd_XLinkRoot.lxx @@ -431,7 +421,6 @@ usr/include/opencascade/TFunction_Logbook.hxx usr/include/opencascade/TFunction_Logbook.lxx usr/include/opencascade/TFunction_Scope.hxx -usr/include/opencascade/TNaming.hxx usr/include/opencascade/TNaming_Builder.hxx usr/include/opencascade/TNaming_CopyShape.hxx usr/include/opencascade/TNaming_DataMapIteratorOfDataMapOfShapePtrRefShape.hxx @@ -441,6 +430,7 @@ usr/include/opencascade/TNaming_DeltaOnModification.hxx usr/include/opencascade/TNaming_DeltaOnRemoval.hxx usr/include/opencascade/TNaming_Evolution.hxx +usr/include/opencascade/TNaming.hxx usr/include/opencascade/TNaming_Identifier.hxx usr/include/opencascade/TNaming_Iterator.hxx usr/include/opencascade/TNaming_Iterator.lxx @@ -455,14 +445,14 @@ usr/include/opencascade/TNaming_Localizer.hxx usr/include/opencascade/TNaming_MapIteratorOfMapOfNamedShape.hxx usr/include/opencascade/TNaming_MapOfNamedShape.hxx -usr/include/opencascade/TNaming_NCollections.hxx -usr/include/opencascade/TNaming_Name.hxx -usr/include/opencascade/TNaming_NameType.hxx +usr/include/opencascade/TNaming_NamedShapeHasher.hxx usr/include/opencascade/TNaming_NamedShape.hxx usr/include/opencascade/TNaming_NamedShape.lxx -usr/include/opencascade/TNaming_NamedShapeHasher.hxx +usr/include/opencascade/TNaming_Name.hxx +usr/include/opencascade/TNaming_NameType.hxx usr/include/opencascade/TNaming_Naming.hxx usr/include/opencascade/TNaming_NamingTool.hxx +usr/include/opencascade/TNaming_NCollections.hxx usr/include/opencascade/TNaming_NewShapeIterator.hxx usr/include/opencascade/TNaming_NewShapeIterator.lxx usr/include/opencascade/TNaming_OldShapeIterator.hxx @@ -522,103 +512,95 @@ usr/include/opencascade/TPrsStd_PlaneDriver.hxx usr/include/opencascade/TPrsStd_PointDriver.hxx usr/include/opencascade/UTL.hxx -usr/include/opencascade/XmlDrivers.hxx usr/include/opencascade/XmlDrivers_DocumentRetrievalDriver.hxx usr/include/opencascade/XmlDrivers_DocumentStorageDriver.hxx -usr/include/opencascade/XmlLDrivers.hxx +usr/include/opencascade/XmlDrivers.hxx usr/include/opencascade/XmlLDrivers_DocumentRetrievalDriver.hxx usr/include/opencascade/XmlLDrivers_DocumentStorageDriver.hxx +usr/include/opencascade/XmlLDrivers.hxx usr/include/opencascade/XmlLDrivers_NamespaceDef.hxx usr/include/opencascade/XmlLDrivers_SequenceOfNamespaceDef.hxx -usr/include/opencascade/XmlMDF.hxx -usr/include/opencascade/XmlMDF_ADriver.hxx -usr/include/opencascade/XmlMDF_ADriverTable.hxx -usr/include/opencascade/XmlMDF_DataMapIteratorOfMapOfDriver.hxx -usr/include/opencascade/XmlMDF_DataMapIteratorOfTypeADriverMap.hxx -usr/include/opencascade/XmlMDF_MapOfDriver.hxx -usr/include/opencascade/XmlMDF_ReferenceDriver.hxx -usr/include/opencascade/XmlMDF_TagSourceDriver.hxx -usr/include/opencascade/XmlMDF_TypeADriverMap.hxx -usr/include/opencascade/XmlMDataStd.hxx usr/include/opencascade/XmlMDataStd_AsciiStringDriver.hxx usr/include/opencascade/XmlMDataStd_BooleanArrayDriver.hxx usr/include/opencascade/XmlMDataStd_BooleanListDriver.hxx usr/include/opencascade/XmlMDataStd_ByteArrayDriver.hxx -usr/include/opencascade/XmlMDataStd_CommentDriver.hxx -usr/include/opencascade/XmlMDataStd_DirectoryDriver.hxx usr/include/opencascade/XmlMDataStd_ExpressionDriver.hxx usr/include/opencascade/XmlMDataStd_ExtStringArrayDriver.hxx usr/include/opencascade/XmlMDataStd_ExtStringListDriver.hxx -usr/include/opencascade/XmlMDataStd_IntPackedMapDriver.hxx +usr/include/opencascade/XmlMDataStd_GenericEmptyDriver.hxx +usr/include/opencascade/XmlMDataStd_GenericExtStringDriver.hxx +usr/include/opencascade/XmlMDataStd.hxx usr/include/opencascade/XmlMDataStd_IntegerArrayDriver.hxx usr/include/opencascade/XmlMDataStd_IntegerDriver.hxx usr/include/opencascade/XmlMDataStd_IntegerListDriver.hxx -usr/include/opencascade/XmlMDataStd_NameDriver.hxx +usr/include/opencascade/XmlMDataStd_IntPackedMapDriver.hxx usr/include/opencascade/XmlMDataStd_NamedDataDriver.hxx -usr/include/opencascade/XmlMDataStd_NoteBookDriver.hxx usr/include/opencascade/XmlMDataStd_RealArrayDriver.hxx usr/include/opencascade/XmlMDataStd_RealDriver.hxx usr/include/opencascade/XmlMDataStd_RealListDriver.hxx usr/include/opencascade/XmlMDataStd_ReferenceArrayDriver.hxx usr/include/opencascade/XmlMDataStd_ReferenceListDriver.hxx -usr/include/opencascade/XmlMDataStd_RelationDriver.hxx -usr/include/opencascade/XmlMDataStd_TickDriver.hxx usr/include/opencascade/XmlMDataStd_TreeNodeDriver.hxx usr/include/opencascade/XmlMDataStd_UAttributeDriver.hxx usr/include/opencascade/XmlMDataStd_VariableDriver.hxx -usr/include/opencascade/XmlMDataXtd.hxx -usr/include/opencascade/XmlMDataXtd_AxisDriver.hxx usr/include/opencascade/XmlMDataXtd_ConstraintDriver.hxx usr/include/opencascade/XmlMDataXtd_GeometryDriver.hxx +usr/include/opencascade/XmlMDataXtd.hxx usr/include/opencascade/XmlMDataXtd_PatternStdDriver.hxx -usr/include/opencascade/XmlMDataXtd_PlacementDriver.hxx -usr/include/opencascade/XmlMDataXtd_PlaneDriver.hxx -usr/include/opencascade/XmlMDataXtd_PointDriver.hxx usr/include/opencascade/XmlMDataXtd_PositionDriver.hxx usr/include/opencascade/XmlMDataXtd_PresentationDriver.hxx -usr/include/opencascade/XmlMDataXtd_ShapeDriver.hxx usr/include/opencascade/XmlMDataXtd_TriangulationDriver.hxx +usr/include/opencascade/XmlMDF_ADriver.hxx +usr/include/opencascade/XmlMDF_ADriverTable.hxx +usr/include/opencascade/XmlMDF_DataMapIteratorOfMapOfDriver.hxx +usr/include/opencascade/XmlMDF_DataMapIteratorOfTypeADriverMap.hxx +usr/include/opencascade/XmlMDF_DerivedDriver.hxx +usr/include/opencascade/XmlMDF.hxx +usr/include/opencascade/XmlMDF_MapOfDriver.hxx +usr/include/opencascade/XmlMDF_ReferenceDriver.hxx +usr/include/opencascade/XmlMDF_TagSourceDriver.hxx +usr/include/opencascade/XmlMDF_TypeADriverMap.hxx usr/include/opencascade/XmlMDocStd.hxx usr/include/opencascade/XmlMDocStd_XLinkDriver.hxx -usr/include/opencascade/XmlMFunction.hxx usr/include/opencascade/XmlMFunction_FunctionDriver.hxx usr/include/opencascade/XmlMFunction_GraphNodeDriver.hxx +usr/include/opencascade/XmlMFunction.hxx usr/include/opencascade/XmlMFunction_ScopeDriver.hxx usr/include/opencascade/XmlMNaming.hxx usr/include/opencascade/XmlMNaming_NamedShapeDriver.hxx usr/include/opencascade/XmlMNaming_NamedShapeDriver.lxx usr/include/opencascade/XmlMNaming_NamingDriver.hxx usr/include/opencascade/XmlMNaming_Shape1.hxx -usr/include/opencascade/XmlObjMgt.hxx usr/include/opencascade/XmlObjMgt_Array1.hxx usr/include/opencascade/XmlObjMgt_Array1.lxx -usr/include/opencascade/XmlObjMgt_DOMString.hxx usr/include/opencascade/XmlObjMgt_Document.hxx +usr/include/opencascade/XmlObjMgt_DOMString.hxx usr/include/opencascade/XmlObjMgt_Element.hxx usr/include/opencascade/XmlObjMgt_GP.hxx +usr/include/opencascade/XmlObjMgt.hxx usr/include/opencascade/XmlObjMgt_Persistent.hxx usr/include/opencascade/XmlObjMgt_Persistent.lxx usr/include/opencascade/XmlObjMgt_RRelocationTable.hxx usr/include/opencascade/XmlObjMgt_SRelocationTable.hxx -usr/include/opencascade/XmlTObjDrivers.hxx usr/include/opencascade/XmlTObjDrivers_DocumentRetrievalDriver.hxx usr/include/opencascade/XmlTObjDrivers_DocumentStorageDriver.hxx +usr/include/opencascade/XmlTObjDrivers.hxx usr/include/opencascade/XmlTObjDrivers_IntSparseArrayDriver.hxx usr/include/opencascade/XmlTObjDrivers_ModelDriver.hxx usr/include/opencascade/XmlTObjDrivers_ObjectDriver.hxx usr/include/opencascade/XmlTObjDrivers_ReferenceDriver.hxx usr/include/opencascade/XmlTObjDrivers_XYZDriver.hxx -usr/lib/*/libTKBin.so +usr/lib/cmake/opencascade/OpenCASCADEApplicationFrameworkTargets*.cmake usr/lib/*/libTKBinL.so +usr/lib/*/libTKBin.so usr/lib/*/libTKBinTObj.so usr/lib/*/libTKCAF.so usr/lib/*/libTKCDF.so usr/lib/*/libTKLCAF.so -usr/lib/*/libTKStd.so usr/lib/*/libTKStdL.so +usr/lib/*/libTKStd.so usr/lib/*/libTKTObj.so usr/lib/*/libTKVCAF.so -usr/lib/*/libTKXml.so usr/lib/*/libTKXmlL.so +usr/lib/*/libTKXml.so usr/lib/*/libTKXmlTObj.so -usr/lib/cmake/opencascade/OpenCASCADEApplicationFrameworkTargets*.cmake diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-ocaf-dev.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-ocaf-dev.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-ocaf-dev.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-ocaf-dev.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,2 @@ +# This is lintian bug #966295 +libocct-ocaf-dev: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-visualization-7.4.install opencascade-7.5.1+dfsg1/debian/libocct-visualization-7.4.install --- opencascade-7.4.1+dfsg1/debian/libocct-visualization-7.4.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-visualization-7.4.install 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -usr/lib/*/libTKMeshVS.so.* -usr/lib/*/libTKOpenGl.so.* -usr/lib/*/libTKService.so.* -usr/lib/*/libTKV3d.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-visualization-7.4.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-visualization-7.4.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-visualization-7.4.lintian-overrides 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-visualization-7.4.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -# this package contains a bunch of libraries and can thus not be named properly -package-name-doesnt-match-sonames -# symbols control files are not sustainable. -no-symbols-control-file diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-visualization-7.5.install opencascade-7.5.1+dfsg1/debian/libocct-visualization-7.5.install --- opencascade-7.4.1+dfsg1/debian/libocct-visualization-7.5.install 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-visualization-7.5.install 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,4 @@ +usr/lib/*/libTKMeshVS.so.* +usr/lib/*/libTKOpenGl.so.* +usr/lib/*/libTKService.so.* +usr/lib/*/libTKV3d.so.* diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-visualization-7.5.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-visualization-7.5.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-visualization-7.5.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-visualization-7.5.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,6 @@ +# this package contains a bunch of libraries and can thus not be named properly +package-name-doesnt-match-sonames +# symbols control files are not sustainable. +no-symbols-control-file +# This is lintian bug #966295 +libocct-visualization-7.5: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-visualization-dev.install opencascade-7.5.1+dfsg1/debian/libocct-visualization-dev.install --- opencascade-7.4.1+dfsg1/debian/libocct-visualization-dev.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-visualization-dev.install 2021-02-07 12:08:52.000000000 +0000 @@ -1,7 +1,6 @@ -usr/include/opencascade/AIS.hxx usr/include/opencascade/AIS_AngleDimension.hxx -usr/include/opencascade/AIS_Animation.hxx usr/include/opencascade/AIS_AnimationCamera.hxx +usr/include/opencascade/AIS_Animation.hxx usr/include/opencascade/AIS_AnimationObject.hxx usr/include/opencascade/AIS_AnimationTimer.hxx usr/include/opencascade/AIS_AttributeFilter.hxx @@ -9,52 +8,44 @@ usr/include/opencascade/AIS_Axis.hxx usr/include/opencascade/AIS_BadEdgeFilter.hxx usr/include/opencascade/AIS_C0RegularityFilter.hxx +usr/include/opencascade/AIS_CameraFrustum.hxx usr/include/opencascade/AIS_Chamf2dDimension.hxx -usr/include/opencascade/AIS_Chamf2dDimension.lxx usr/include/opencascade/AIS_Chamf3dDimension.hxx -usr/include/opencascade/AIS_Chamf3dDimension.lxx usr/include/opencascade/AIS_Circle.hxx usr/include/opencascade/AIS_ClearMode.hxx -usr/include/opencascade/AIS_ColorScale.hxx usr/include/opencascade/AIS_ColoredDrawer.hxx usr/include/opencascade/AIS_ColoredShape.hxx +usr/include/opencascade/AIS_ColorScale.hxx usr/include/opencascade/AIS_ConcentricRelation.hxx -usr/include/opencascade/AIS_ConnectStatus.hxx usr/include/opencascade/AIS_ConnectedInteractive.hxx +usr/include/opencascade/AIS_ConnectStatus.hxx +usr/include/opencascade/AIS_DataMapIteratorOfDataMapofIntegerListOfinteractive.hxx usr/include/opencascade/AIS_DataMapIteratorOfDataMapOfIOStatus.hxx usr/include/opencascade/AIS_DataMapIteratorOfDataMapOfSelStat.hxx -usr/include/opencascade/AIS_DataMapIteratorOfDataMapofIntegerListOfinteractive.hxx +usr/include/opencascade/AIS_DataMapofIntegerListOfinteractive.hxx usr/include/opencascade/AIS_DataMapOfIOStatus.hxx usr/include/opencascade/AIS_DataMapOfSelStat.hxx usr/include/opencascade/AIS_DataMapOfShapeDrawer.hxx -usr/include/opencascade/AIS_DataMapofIntegerListOfinteractive.hxx usr/include/opencascade/AIS_DiameterDimension.hxx usr/include/opencascade/AIS_Dimension.hxx usr/include/opencascade/AIS_DimensionOwner.hxx -usr/include/opencascade/AIS_DimensionSelectionMode.hxx usr/include/opencascade/AIS_DisplayMode.hxx -usr/include/opencascade/AIS_DisplaySpecialSymbol.hxx usr/include/opencascade/AIS_DisplayStatus.hxx +usr/include/opencascade/AIS_DragAction.hxx usr/include/opencascade/AIS_EllipseRadiusDimension.hxx usr/include/opencascade/AIS_EqualDistanceRelation.hxx -usr/include/opencascade/AIS_EqualDistanceRelation.lxx usr/include/opencascade/AIS_EqualRadiusRelation.hxx usr/include/opencascade/AIS_ExclusionFilter.hxx usr/include/opencascade/AIS_ExclusionFilter.lxx usr/include/opencascade/AIS_FixRelation.hxx -usr/include/opencascade/AIS_FixRelation.lxx usr/include/opencascade/AIS_GlobalStatus.hxx usr/include/opencascade/AIS_GraphicTool.hxx +usr/include/opencascade/AIS.hxx usr/include/opencascade/AIS_IdenticRelation.hxx -usr/include/opencascade/AIS_IdenticRelation.lxx usr/include/opencascade/AIS_IndexedDataMapOfOwnerPrs.hxx usr/include/opencascade/AIS_InteractiveContext.hxx usr/include/opencascade/AIS_InteractiveObject.hxx -usr/include/opencascade/AIS_KindOfDimension.hxx usr/include/opencascade/AIS_KindOfInteractive.hxx -usr/include/opencascade/AIS_KindOfRelation.hxx -usr/include/opencascade/AIS_KindOfSurface.hxx -usr/include/opencascade/AIS_KindOfUnit.hxx usr/include/opencascade/AIS_LengthDimension.hxx usr/include/opencascade/AIS_Line.hxx usr/include/opencascade/AIS_ListIteratorOfListOfInteractive.hxx @@ -65,35 +56,34 @@ usr/include/opencascade/AIS_MapIteratorOfMapOfInteractive.hxx usr/include/opencascade/AIS_MapOfInteractive.hxx usr/include/opencascade/AIS_MaxRadiusDimension.hxx +usr/include/opencascade/AIS_MediaPlayer.hxx usr/include/opencascade/AIS_MidPointRelation.hxx -usr/include/opencascade/AIS_MidPointRelation.lxx usr/include/opencascade/AIS_MinRadiusDimension.hxx +usr/include/opencascade/AIS_MouseGesture.hxx usr/include/opencascade/AIS_MultipleConnectedInteractive.hxx usr/include/opencascade/AIS_MultipleConnectedInteractive.lxx +usr/include/opencascade/AIS_NavigationMode.hxx usr/include/opencascade/AIS_NListOfEntityOwner.hxx usr/include/opencascade/AIS_OffsetDimension.hxx -usr/include/opencascade/AIS_OffsetDimension.lxx usr/include/opencascade/AIS_ParallelRelation.hxx -usr/include/opencascade/AIS_ParallelRelation.lxx usr/include/opencascade/AIS_PerpendicularRelation.hxx usr/include/opencascade/AIS_Plane.hxx usr/include/opencascade/AIS_PlaneTrihedron.hxx -usr/include/opencascade/AIS_Point.hxx usr/include/opencascade/AIS_PointCloud.hxx +usr/include/opencascade/AIS_Point.hxx usr/include/opencascade/AIS_RadiusDimension.hxx usr/include/opencascade/AIS_Relation.hxx +usr/include/opencascade/AIS_RotationMode.hxx usr/include/opencascade/AIS_RubberBand.hxx -usr/include/opencascade/AIS_SelectStatus.hxx usr/include/opencascade/AIS_Selection.hxx -usr/include/opencascade/AIS_SequenceOfDimension.hxx +usr/include/opencascade/AIS_SelectionModesConcurrency.hxx +usr/include/opencascade/AIS_SelectStatus.hxx usr/include/opencascade/AIS_SequenceOfInteractive.hxx usr/include/opencascade/AIS_Shape.hxx usr/include/opencascade/AIS_SignatureFilter.hxx -usr/include/opencascade/AIS_StandardDatum.hxx usr/include/opencascade/AIS_StatusOfDetection.hxx usr/include/opencascade/AIS_StatusOfPick.hxx usr/include/opencascade/AIS_SymmetricRelation.hxx -usr/include/opencascade/AIS_SymmetricRelation.lxx usr/include/opencascade/AIS_TangentRelation.hxx usr/include/opencascade/AIS_TextLabel.hxx usr/include/opencascade/AIS_TexturedShape.hxx @@ -102,55 +92,57 @@ usr/include/opencascade/AIS_TrihedronOwner.hxx usr/include/opencascade/AIS_TrihedronSelectionMode.hxx usr/include/opencascade/AIS_TypeFilter.hxx -usr/include/opencascade/AIS_TypeOfAngle.hxx -usr/include/opencascade/AIS_TypeOfAngleArrowVisibility.hxx usr/include/opencascade/AIS_TypeOfAttribute.hxx usr/include/opencascade/AIS_TypeOfAxis.hxx -usr/include/opencascade/AIS_TypeOfDist.hxx usr/include/opencascade/AIS_TypeOfIso.hxx usr/include/opencascade/AIS_TypeOfPlane.hxx -usr/include/opencascade/AIS_CameraFrustum.hxx -usr/include/opencascade/AIS_DragAction.hxx -usr/include/opencascade/AIS_MediaPlayer.hxx -usr/include/opencascade/AIS_MouseGesture.hxx -usr/include/opencascade/AIS_NavigationMode.hxx -usr/include/opencascade/AIS_RotationMode.hxx usr/include/opencascade/AIS_ViewController.hxx usr/include/opencascade/AIS_ViewCube.hxx usr/include/opencascade/AIS_ViewInputBuffer.hxx usr/include/opencascade/AIS_WalkDelta.hxx +usr/include/opencascade/AIS_XRTrackedDevice.hxx usr/include/opencascade/Aspect_AspectFillAreaDefinitionError.hxx usr/include/opencascade/Aspect_AspectLineDefinitionError.hxx usr/include/opencascade/Aspect_AspectMarkerDefinitionError.hxx usr/include/opencascade/Aspect_Background.hxx usr/include/opencascade/Aspect_CircularGrid.hxx +usr/include/opencascade/Aspect_ColorSpace.hxx usr/include/opencascade/Aspect_Convert.hxx -usr/include/opencascade/Aspect_Display.hxx -usr/include/opencascade/Aspect_DisplayConnection.hxx usr/include/opencascade/Aspect_DisplayConnectionDefinitionError.hxx +usr/include/opencascade/Aspect_DisplayConnection.hxx +usr/include/opencascade/Aspect_Display.hxx usr/include/opencascade/Aspect_Drawable.hxx +usr/include/opencascade/Aspect_Eye.hxx usr/include/opencascade/Aspect_FBConfig.hxx usr/include/opencascade/Aspect_FillMethod.hxx +usr/include/opencascade/Aspect_FrustumLRBT.hxx usr/include/opencascade/Aspect_GenId.hxx usr/include/opencascade/Aspect_GradientBackground.hxx usr/include/opencascade/Aspect_GradientFillMethod.hxx usr/include/opencascade/Aspect_GraphicDeviceDefinitionError.hxx -usr/include/opencascade/Aspect_Grid.hxx +usr/include/opencascade/Aspect_GraphicsLibrary.hxx usr/include/opencascade/Aspect_GridDrawMode.hxx +usr/include/opencascade/Aspect_Grid.hxx usr/include/opencascade/Aspect_GridType.hxx usr/include/opencascade/Aspect_Handle.hxx usr/include/opencascade/Aspect_HatchStyle.hxx usr/include/opencascade/Aspect_IdentDefinitionError.hxx usr/include/opencascade/Aspect_InteriorStyle.hxx usr/include/opencascade/Aspect_NeutralWindow.hxx +usr/include/opencascade/Aspect_OpenVRSession.hxx usr/include/opencascade/Aspect_PolygonOffsetMode.hxx usr/include/opencascade/Aspect_RectangularGrid.hxx usr/include/opencascade/Aspect_RenderingContext.hxx +usr/include/opencascade/Aspect_ScrollDelta.hxx usr/include/opencascade/Aspect_SequenceOfColor.hxx +usr/include/opencascade/Aspect_Touch.hxx +usr/include/opencascade/Aspect_TouchMap.hxx +usr/include/opencascade/Aspect_TrackedDevicePose.hxx usr/include/opencascade/Aspect_TypeOfColorScaleData.hxx usr/include/opencascade/Aspect_TypeOfColorScaleOrientation.hxx usr/include/opencascade/Aspect_TypeOfColorScalePosition.hxx usr/include/opencascade/Aspect_TypeOfDeflection.hxx +usr/include/opencascade/Aspect_TypeOfDisplayText.hxx usr/include/opencascade/Aspect_TypeOfFacingModel.hxx usr/include/opencascade/Aspect_TypeOfHighlightMethod.hxx usr/include/opencascade/Aspect_TypeOfLine.hxx @@ -159,15 +151,27 @@ usr/include/opencascade/Aspect_TypeOfStyleText.hxx usr/include/opencascade/Aspect_TypeOfTriedronPosition.hxx usr/include/opencascade/Aspect_Units.hxx +usr/include/opencascade/Aspect_VKeyFlags.hxx +usr/include/opencascade/Aspect_VKey.hxx +usr/include/opencascade/Aspect_VKeySet.hxx usr/include/opencascade/Aspect_WidthOfLine.hxx -usr/include/opencascade/Aspect_Window.hxx usr/include/opencascade/Aspect_WindowDefinitionError.hxx usr/include/opencascade/Aspect_WindowError.hxx +usr/include/opencascade/Aspect_Window.hxx usr/include/opencascade/Aspect_XAtom.hxx +usr/include/opencascade/Aspect_XRAction.hxx +usr/include/opencascade/Aspect_XRActionSet.hxx +usr/include/opencascade/Aspect_XRActionType.hxx +usr/include/opencascade/Aspect_XRAnalogActionData.hxx +usr/include/opencascade/Aspect_XRDigitalActionData.hxx +usr/include/opencascade/Aspect_XRGenericAction.hxx +usr/include/opencascade/Aspect_XRHapticActionData.hxx +usr/include/opencascade/Aspect_XRPoseActionData.hxx +usr/include/opencascade/Aspect_XRSession.hxx +usr/include/opencascade/Aspect_XRTrackedDeviceRole.hxx usr/include/opencascade/Aspect_XWD.hxx usr/include/opencascade/Cocoa_LocalPool.hxx usr/include/opencascade/Cocoa_Window.hxx -usr/include/opencascade/DsgPrs.hxx usr/include/opencascade/DsgPrs_AnglePresentation.hxx usr/include/opencascade/DsgPrs_ArrowSide.hxx usr/include/opencascade/DsgPrs_Chamf2dPresentation.hxx @@ -179,6 +183,7 @@ usr/include/opencascade/DsgPrs_EqualRadiusPresentation.hxx usr/include/opencascade/DsgPrs_FilletRadiusPresentation.hxx usr/include/opencascade/DsgPrs_FixPresentation.hxx +usr/include/opencascade/DsgPrs.hxx usr/include/opencascade/DsgPrs_IdenticPresentation.hxx usr/include/opencascade/DsgPrs_LengthPresentation.hxx usr/include/opencascade/DsgPrs_MidPointPresentation.hxx @@ -195,77 +200,104 @@ usr/include/opencascade/DsgPrs_XYZPlanePresentation.hxx usr/include/opencascade/Font_BRepFont.hxx usr/include/opencascade/Font_BRepTextBuilder.hxx -usr/include/opencascade/Font_FTFont.hxx -usr/include/opencascade/Font_FTLibrary.hxx usr/include/opencascade/Font_FontAspect.hxx usr/include/opencascade/Font_FontMgr.hxx -usr/include/opencascade/Font_NListOfSystemFont.hxx -usr/include/opencascade/Font_NameOfFont.hxx +usr/include/opencascade/Font_FTFont.hxx +usr/include/opencascade/Font_FTLibrary.hxx usr/include/opencascade/Font_NameOfFont.hxx +usr/include/opencascade/Font_NListOfSystemFont.hxx usr/include/opencascade/Font_Rect.hxx +usr/include/opencascade/Font_StrictLevel.hxx usr/include/opencascade/Font_SystemFont.hxx usr/include/opencascade/Font_TextFormatter.hxx +usr/include/opencascade/Font_UnicodeSubset.hxx +usr/include/opencascade/glext.h +usr/include/opencascade/Graphic3d_AlphaMode.hxx +usr/include/opencascade/Graphic3d_ArrayFlags.hxx usr/include/opencascade/Graphic3d_ArrayOfPoints.hxx usr/include/opencascade/Graphic3d_ArrayOfPolygons.hxx usr/include/opencascade/Graphic3d_ArrayOfPolylines.hxx usr/include/opencascade/Graphic3d_ArrayOfPrimitives.hxx -usr/include/opencascade/Graphic3d_ArrayOfQuadrangleStrips.hxx usr/include/opencascade/Graphic3d_ArrayOfQuadrangles.hxx +usr/include/opencascade/Graphic3d_ArrayOfQuadrangleStrips.hxx usr/include/opencascade/Graphic3d_ArrayOfSegments.hxx usr/include/opencascade/Graphic3d_ArrayOfTriangleFans.hxx -usr/include/opencascade/Graphic3d_ArrayOfTriangleStrips.hxx usr/include/opencascade/Graphic3d_ArrayOfTriangles.hxx +usr/include/opencascade/Graphic3d_ArrayOfTriangleStrips.hxx usr/include/opencascade/Graphic3d_AspectFillArea3d.hxx usr/include/opencascade/Graphic3d_AspectLine3d.hxx usr/include/opencascade/Graphic3d_AspectMarker3d.hxx +usr/include/opencascade/Graphic3d_Aspects.hxx usr/include/opencascade/Graphic3d_AspectText3d.hxx -usr/include/opencascade/Graphic3d_BSDF.hxx +usr/include/opencascade/Graphic3d_AttribBuffer.hxx usr/include/opencascade/Graphic3d_BndBox3d.hxx usr/include/opencascade/Graphic3d_BndBox4d.hxx usr/include/opencascade/Graphic3d_BndBox4f.hxx usr/include/opencascade/Graphic3d_BoundBuffer.hxx +usr/include/opencascade/Graphic3d_BSDF.hxx usr/include/opencascade/Graphic3d_Buffer.hxx +usr/include/opencascade/Graphic3d_BufferRange.hxx usr/include/opencascade/Graphic3d_BufferType.hxx -usr/include/opencascade/Graphic3d_CLight.hxx -usr/include/opencascade/Graphic3d_CStructure.hxx -usr/include/opencascade/Graphic3d_CTexture.hxx -usr/include/opencascade/Graphic3d_CView.hxx +usr/include/opencascade/Graphic3d_BvhCStructureSet.hxx +usr/include/opencascade/Graphic3d_BvhCStructureSetTrsfPers.hxx usr/include/opencascade/Graphic3d_Camera.hxx usr/include/opencascade/Graphic3d_CameraTile.hxx usr/include/opencascade/Graphic3d_CappingFlags.hxx +usr/include/opencascade/Graphic3d_CLight.hxx usr/include/opencascade/Graphic3d_ClipPlane.hxx +usr/include/opencascade/Graphic3d_CStructure.hxx +usr/include/opencascade/Graphic3d_CTexture.hxx +usr/include/opencascade/Graphic3d_CubeMap.hxx +usr/include/opencascade/Graphic3d_CubeMapOrder.hxx +usr/include/opencascade/Graphic3d_CubeMapPacked.hxx +usr/include/opencascade/Graphic3d_CubeMapSeparate.hxx +usr/include/opencascade/Graphic3d_CubeMapSide.hxx +usr/include/opencascade/Graphic3d_CullingTool.hxx +usr/include/opencascade/Graphic3d_CView.hxx usr/include/opencascade/Graphic3d_DataStructureManager.hxx usr/include/opencascade/Graphic3d_DiagnosticInfo.hxx +usr/include/opencascade/Graphic3d_FrameStatsCounter.hxx +usr/include/opencascade/Graphic3d_FrameStatsData.hxx +usr/include/opencascade/Graphic3d_FrameStats.hxx +usr/include/opencascade/Graphic3d_FrameStatsTimer.hxx usr/include/opencascade/Graphic3d_GraduatedTrihedron.hxx usr/include/opencascade/Graphic3d_GraphicDriver.hxx -usr/include/opencascade/Graphic3d_Group.hxx usr/include/opencascade/Graphic3d_GroupAspect.hxx usr/include/opencascade/Graphic3d_GroupDefinitionError.hxx +usr/include/opencascade/Graphic3d_Group.hxx usr/include/opencascade/Graphic3d_HatchStyle.hxx usr/include/opencascade/Graphic3d_HighlightStyle.hxx usr/include/opencascade/Graphic3d_HorizontalTextAlignment.hxx usr/include/opencascade/Graphic3d_IndexBuffer.hxx +usr/include/opencascade/Graphic3d_Layer.hxx usr/include/opencascade/Graphic3d_LevelOfTextureAnisotropy.hxx +usr/include/opencascade/Graphic3d_LightSet.hxx usr/include/opencascade/Graphic3d_MapIteratorOfMapOfStructure.hxx +usr/include/opencascade/Graphic3d_MapOfAspectsToAspects.hxx usr/include/opencascade/Graphic3d_MapOfObject.hxx usr/include/opencascade/Graphic3d_MapOfStructure.hxx +usr/include/opencascade/Graphic3d_MapOfZLayerSettings.hxx usr/include/opencascade/Graphic3d_MarkerImage.hxx -usr/include/opencascade/Graphic3d_Mat4.hxx usr/include/opencascade/Graphic3d_Mat4d.hxx +usr/include/opencascade/Graphic3d_Mat4.hxx usr/include/opencascade/Graphic3d_MaterialAspect.hxx usr/include/opencascade/Graphic3d_MaterialDefinitionError.hxx -usr/include/opencascade/Graphic3d_NMapOfTransient.hxx +usr/include/opencascade/Graphic3d_MediaTexture.hxx +usr/include/opencascade/Graphic3d_MediaTextureSet.hxx +usr/include/opencascade/Graphic3d_MutableIndexBuffer.hxx usr/include/opencascade/Graphic3d_NameOfMaterial.hxx usr/include/opencascade/Graphic3d_NameOfTexture1D.hxx usr/include/opencascade/Graphic3d_NameOfTexture2D.hxx usr/include/opencascade/Graphic3d_NameOfTextureEnv.hxx usr/include/opencascade/Graphic3d_NameOfTexturePlane.hxx +usr/include/opencascade/Graphic3d_NMapOfTransient.hxx +usr/include/opencascade/Graphic3d_PBRMaterial.hxx usr/include/opencascade/Graphic3d_PolygonOffset.hxx usr/include/opencascade/Graphic3d_PresentationAttributes.hxx usr/include/opencascade/Graphic3d_PriorityDefinitionError.hxx -usr/include/opencascade/Graphic3d_RenderTransparentMethod.hxx usr/include/opencascade/Graphic3d_RenderingMode.hxx usr/include/opencascade/Graphic3d_RenderingParams.hxx +usr/include/opencascade/Graphic3d_RenderTransparentMethod.hxx usr/include/opencascade/Graphic3d_SequenceOfGroup.hxx usr/include/opencascade/Graphic3d_SequenceOfHClipPlane.hxx usr/include/opencascade/Graphic3d_SequenceOfStructure.hxx @@ -275,9 +307,10 @@ usr/include/opencascade/Graphic3d_ShaderVariable.hxx usr/include/opencascade/Graphic3d_ShaderVariable.lxx usr/include/opencascade/Graphic3d_StereoMode.hxx -usr/include/opencascade/Graphic3d_Structure.hxx usr/include/opencascade/Graphic3d_StructureDefinitionError.hxx +usr/include/opencascade/Graphic3d_Structure.hxx usr/include/opencascade/Graphic3d_StructureManager.hxx +usr/include/opencascade/Graphic3d_Text.hxx usr/include/opencascade/Graphic3d_TextPath.hxx usr/include/opencascade/Graphic3d_Texture1D.hxx usr/include/opencascade/Graphic3d_Texture1Dmanual.hxx @@ -289,13 +322,14 @@ usr/include/opencascade/Graphic3d_TextureMap.hxx usr/include/opencascade/Graphic3d_TextureParams.hxx usr/include/opencascade/Graphic3d_TextureRoot.hxx +usr/include/opencascade/Graphic3d_TextureSetBits.hxx usr/include/opencascade/Graphic3d_TextureSet.hxx usr/include/opencascade/Graphic3d_TextureUnit.hxx usr/include/opencascade/Graphic3d_ToneMappingMethod.hxx -usr/include/opencascade/Graphic3d_TransModeFlags.hxx usr/include/opencascade/Graphic3d_TransformError.hxx usr/include/opencascade/Graphic3d_TransformPers.hxx usr/include/opencascade/Graphic3d_TransformUtils.hxx +usr/include/opencascade/Graphic3d_TransModeFlags.hxx usr/include/opencascade/Graphic3d_TypeOfAnswer.hxx usr/include/opencascade/Graphic3d_TypeOfBackfacingModel.hxx usr/include/opencascade/Graphic3d_TypeOfBackground.hxx @@ -309,14 +343,14 @@ usr/include/opencascade/Graphic3d_TypeOfShaderObject.hxx usr/include/opencascade/Graphic3d_TypeOfShadingModel.hxx usr/include/opencascade/Graphic3d_TypeOfStructure.hxx -usr/include/opencascade/Graphic3d_TypeOfTexture.hxx usr/include/opencascade/Graphic3d_TypeOfTextureFilter.hxx +usr/include/opencascade/Graphic3d_TypeOfTexture.hxx usr/include/opencascade/Graphic3d_TypeOfTextureMode.hxx usr/include/opencascade/Graphic3d_TypeOfVisualization.hxx -usr/include/opencascade/Graphic3d_Vec.hxx usr/include/opencascade/Graphic3d_Vec2.hxx usr/include/opencascade/Graphic3d_Vec3.hxx usr/include/opencascade/Graphic3d_Vec4.hxx +usr/include/opencascade/Graphic3d_Vec.hxx usr/include/opencascade/Graphic3d_Vertex.hxx usr/include/opencascade/Graphic3d_VerticalTextAlignment.hxx usr/include/opencascade/Graphic3d_ViewAffinity.hxx @@ -325,12 +359,27 @@ usr/include/opencascade/Graphic3d_ZLayerSettings.hxx usr/include/opencascade/Image_AlienPixMap.hxx usr/include/opencascade/Image_Color.hxx +usr/include/opencascade/Image_CompressedFormat.hxx +usr/include/opencascade/Image_CompressedPixMap.hxx +usr/include/opencascade/Image_DDSParser.hxx usr/include/opencascade/Image_Diff.hxx usr/include/opencascade/Image_Format.hxx -usr/include/opencascade/Image_PixMap.hxx usr/include/opencascade/Image_PixMapData.hxx +usr/include/opencascade/Image_PixMap.hxx +usr/include/opencascade/Image_PixMapTypedData.hxx +usr/include/opencascade/Image_SupportedFormats.hxx +usr/include/opencascade/Image_Texture.hxx usr/include/opencascade/Image_VideoRecorder.hxx usr/include/opencascade/InterfaceGraphic.hxx +usr/include/opencascade/Media_BufferPool.hxx +usr/include/opencascade/Media_CodecContext.hxx +usr/include/opencascade/Media_FormatContext.hxx +usr/include/opencascade/Media_Frame.hxx +usr/include/opencascade/Media_IFrameQueue.hxx +usr/include/opencascade/Media_Packet.hxx +usr/include/opencascade/Media_PlayerContext.hxx +usr/include/opencascade/Media_Scaler.hxx +usr/include/opencascade/Media_Timer.hxx usr/include/opencascade/MeshVS_Array1OfSequenceOfInteger.hxx usr/include/opencascade/MeshVS_Buffer.hxx usr/include/opencascade/MeshVS_BuilderPriority.hxx @@ -358,20 +407,20 @@ usr/include/opencascade/MeshVS_DataMapOfIntegerTwoColors.hxx usr/include/opencascade/MeshVS_DataMapOfIntegerVector.hxx usr/include/opencascade/MeshVS_DataMapOfTwoColorsMapOfInteger.hxx -usr/include/opencascade/MeshVS_DataSource.hxx usr/include/opencascade/MeshVS_DataSource3D.hxx +usr/include/opencascade/MeshVS_DataSource.hxx usr/include/opencascade/MeshVS_DeformedDataSource.hxx usr/include/opencascade/MeshVS_DisplayModeFlags.hxx -usr/include/opencascade/MeshVS_Drawer.hxx usr/include/opencascade/MeshVS_DrawerAttribute.hxx +usr/include/opencascade/MeshVS_Drawer.hxx usr/include/opencascade/MeshVS_DummySensitiveEntity.hxx usr/include/opencascade/MeshVS_ElementalColorPrsBuilder.hxx usr/include/opencascade/MeshVS_EntityType.hxx usr/include/opencascade/MeshVS_HArray1OfSequenceOfInteger.hxx usr/include/opencascade/MeshVS_MapIteratorOfMapOfTwoNodes.hxx usr/include/opencascade/MeshVS_MapOfTwoNodes.hxx -usr/include/opencascade/MeshVS_Mesh.hxx usr/include/opencascade/MeshVS_MeshEntityOwner.hxx +usr/include/opencascade/MeshVS_Mesh.hxx usr/include/opencascade/MeshVS_MeshOwner.hxx usr/include/opencascade/MeshVS_MeshPrsBuilder.hxx usr/include/opencascade/MeshVS_MeshPrsBuilder.lxx @@ -389,10 +438,10 @@ usr/include/opencascade/MeshVS_SymmetricPairHasher.hxx usr/include/opencascade/MeshVS_TextPrsBuilder.hxx usr/include/opencascade/MeshVS_Tool.hxx -usr/include/opencascade/MeshVS_TwoColors.hxx usr/include/opencascade/MeshVS_TwoColorsHasher.hxx -usr/include/opencascade/MeshVS_TwoNodes.hxx +usr/include/opencascade/MeshVS_TwoColors.hxx usr/include/opencascade/MeshVS_TwoNodesHasher.hxx +usr/include/opencascade/MeshVS_TwoNodes.hxx usr/include/opencascade/MeshVS_VectorPrsBuilder.hxx usr/include/opencascade/OpenGl_ArbDbg.hxx usr/include/opencascade/OpenGl_ArbFBO.hxx @@ -400,19 +449,26 @@ usr/include/opencascade/OpenGl_ArbSamplerObject.hxx usr/include/opencascade/OpenGl_ArbTBO.hxx usr/include/opencascade/OpenGl_ArbTexBindless.hxx +usr/include/opencascade/OpenGl_Aspects.hxx +usr/include/opencascade/OpenGl_AspectsProgram.hxx +usr/include/opencascade/OpenGl_AspectsSprite.hxx +usr/include/opencascade/OpenGl_AspectsTextureSet.hxx usr/include/opencascade/OpenGl_BackgroundArray.hxx usr/include/opencascade/OpenGl_CappingAlgo.hxx usr/include/opencascade/OpenGl_CappingPlaneResource.hxx usr/include/opencascade/OpenGl_Caps.hxx usr/include/opencascade/OpenGl_Clipping.hxx +usr/include/opencascade/OpenGl_ClippingIterator.hxx usr/include/opencascade/OpenGl_Context.hxx usr/include/opencascade/OpenGl_Element.hxx usr/include/opencascade/OpenGl_ExtGS.hxx usr/include/opencascade/OpenGl_Flipper.hxx usr/include/opencascade/OpenGl_Font.hxx usr/include/opencascade/OpenGl_FrameBuffer.hxx -usr/include/opencascade/OpenGl_GlCore11.hxx +usr/include/opencascade/OpenGl_FrameStats.hxx +usr/include/opencascade/OpenGl_FrameStatsPrs.hxx usr/include/opencascade/OpenGl_GlCore11Fwd.hxx +usr/include/opencascade/OpenGl_GlCore11.hxx usr/include/opencascade/OpenGl_GlCore12.hxx usr/include/opencascade/OpenGl_GlCore13.hxx usr/include/opencascade/OpenGl_GlCore14.hxx @@ -428,14 +484,16 @@ usr/include/opencascade/OpenGl_GlCore42.hxx usr/include/opencascade/OpenGl_GlCore43.hxx usr/include/opencascade/OpenGl_GlCore44.hxx +usr/include/opencascade/OpenGl_GlCore45.hxx +usr/include/opencascade/OpenGl_GLESExtensions.hxx usr/include/opencascade/OpenGl_GlFunctions.hxx usr/include/opencascade/OpenGl_GraduatedTrihedron.hxx usr/include/opencascade/OpenGl_GraphicDriver.hxx usr/include/opencascade/OpenGl_Group.hxx usr/include/opencascade/OpenGl_HaltonSampler.hxx usr/include/opencascade/OpenGl_IndexBuffer.hxx -usr/include/opencascade/OpenGl_Layer.hxx usr/include/opencascade/OpenGl_LayerFilter.hxx +usr/include/opencascade/OpenGl_Layer.hxx usr/include/opencascade/OpenGl_LayerList.hxx usr/include/opencascade/OpenGl_LineAttributes.hxx usr/include/opencascade/OpenGl_Material.hxx @@ -443,6 +501,7 @@ usr/include/opencascade/OpenGl_Matrix.hxx usr/include/opencascade/OpenGl_MatrixState.hxx usr/include/opencascade/OpenGl_NamedResource.hxx +usr/include/opencascade/OpenGl_PBREnvironment.hxx usr/include/opencascade/OpenGl_PointSprite.hxx usr/include/opencascade/OpenGl_PrimitiveArray.hxx usr/include/opencascade/OpenGl_RenderFilter.hxx @@ -452,29 +511,32 @@ usr/include/opencascade/OpenGl_SetOfShaderPrograms.hxx usr/include/opencascade/OpenGl_ShaderManager.hxx usr/include/opencascade/OpenGl_ShaderObject.hxx +usr/include/opencascade/OpenGl_ShaderProgramDumpLevel.hxx usr/include/opencascade/OpenGl_ShaderProgram.hxx usr/include/opencascade/OpenGl_ShaderStates.hxx usr/include/opencascade/OpenGl_StencilTest.hxx usr/include/opencascade/OpenGl_Structure.hxx usr/include/opencascade/OpenGl_StructureShadow.hxx -usr/include/opencascade/OpenGl_Text.hxx usr/include/opencascade/OpenGl_TextBuilder.hxx -usr/include/opencascade/OpenGl_Texture.hxx +usr/include/opencascade/OpenGl_Text.hxx usr/include/opencascade/OpenGl_TextureBufferArb.hxx +usr/include/opencascade/OpenGl_TextureFormat.hxx +usr/include/opencascade/OpenGl_Texture.hxx usr/include/opencascade/OpenGl_TextureSet.hxx +usr/include/opencascade/OpenGl_TextureSetPairIterator.hxx usr/include/opencascade/OpenGl_TileSampler.hxx usr/include/opencascade/OpenGl_Vec.hxx -usr/include/opencascade/OpenGl_VertexBuffer.hxx -usr/include/opencascade/OpenGl_VertexBuffer.lxx usr/include/opencascade/OpenGl_VertexBufferCompat.hxx usr/include/opencascade/OpenGl_VertexBufferEditor.hxx +usr/include/opencascade/OpenGl_VertexBuffer.hxx +usr/include/opencascade/OpenGl_VertexBuffer.lxx usr/include/opencascade/OpenGl_View.hxx usr/include/opencascade/OpenGl_Window.hxx usr/include/opencascade/OpenGl_Workspace.hxx -usr/include/opencascade/Prs3d.hxx -usr/include/opencascade/Prs3d_Arrow.hxx usr/include/opencascade/Prs3d_ArrowAspect.hxx +usr/include/opencascade/Prs3d_Arrow.hxx usr/include/opencascade/Prs3d_BasicAspect.hxx +usr/include/opencascade/Prs3d_BndBox.hxx usr/include/opencascade/Prs3d_DatumAspect.hxx usr/include/opencascade/Prs3d_DatumAttribute.hxx usr/include/opencascade/Prs3d_DatumAxes.hxx @@ -486,43 +548,76 @@ usr/include/opencascade/Prs3d_DimensionTextVerticalPosition.hxx usr/include/opencascade/Prs3d_DimensionUnits.hxx usr/include/opencascade/Prs3d_Drawer.hxx +usr/include/opencascade/Prs3d.hxx usr/include/opencascade/Prs3d_InvalidAngle.hxx usr/include/opencascade/Prs3d_IsoAspect.hxx usr/include/opencascade/Prs3d_LineAspect.hxx usr/include/opencascade/Prs3d_NListIteratorOfListOfSequenceOfPnt.hxx usr/include/opencascade/Prs3d_NListOfSequenceOfPnt.hxx usr/include/opencascade/Prs3d_PlaneAspect.hxx -usr/include/opencascade/Prs3d_Point.hxx usr/include/opencascade/Prs3d_PointAspect.hxx +usr/include/opencascade/Prs3d_Point.hxx usr/include/opencascade/Prs3d_Presentation.hxx usr/include/opencascade/Prs3d_PresentationShadow.hxx -usr/include/opencascade/Prs3d_Projector.hxx usr/include/opencascade/Prs3d_Root.hxx usr/include/opencascade/Prs3d_ShadingAspect.hxx usr/include/opencascade/Prs3d_ShapeTool.hxx -usr/include/opencascade/Prs3d_Text.hxx usr/include/opencascade/Prs3d_TextAspect.hxx +usr/include/opencascade/Prs3d_Text.hxx usr/include/opencascade/Prs3d_ToolCylinder.hxx usr/include/opencascade/Prs3d_ToolDisk.hxx usr/include/opencascade/Prs3d_ToolQuadric.hxx +usr/include/opencascade/Prs3d_ToolSector.hxx usr/include/opencascade/Prs3d_ToolSphere.hxx -usr/include/opencascade/Prs3d_TypeOfHLR.hxx -usr/include/opencascade/Prs3d_TypeOfHighlight.hxx +usr/include/opencascade/Prs3d_ToolTorus.hxx usr/include/opencascade/Prs3d_TypeOfHighlight.hxx +usr/include/opencascade/Prs3d_TypeOfHLR.hxx usr/include/opencascade/Prs3d_TypeOfLinePicking.hxx usr/include/opencascade/Prs3d_VertexDrawMode.hxx +usr/include/opencascade/PrsDim_AngleDimension.hxx +usr/include/opencascade/PrsDim_Chamf2dDimension.hxx +usr/include/opencascade/PrsDim_Chamf3dDimension.hxx +usr/include/opencascade/PrsDim_ConcentricRelation.hxx +usr/include/opencascade/PrsDim_DiameterDimension.hxx +usr/include/opencascade/PrsDim_Dimension.hxx +usr/include/opencascade/PrsDim_DimensionOwner.hxx +usr/include/opencascade/PrsDim_DimensionSelectionMode.hxx +usr/include/opencascade/PrsDim_DisplaySpecialSymbol.hxx +usr/include/opencascade/PrsDim_EllipseRadiusDimension.hxx +usr/include/opencascade/PrsDim_EqualDistanceRelation.hxx +usr/include/opencascade/PrsDim_EqualRadiusRelation.hxx +usr/include/opencascade/PrsDim_FixRelation.hxx +usr/include/opencascade/PrsDim.hxx +usr/include/opencascade/PrsDim_IdenticRelation.hxx +usr/include/opencascade/PrsDim_KindOfDimension.hxx +usr/include/opencascade/PrsDim_KindOfRelation.hxx +usr/include/opencascade/PrsDim_KindOfSurface.hxx +usr/include/opencascade/PrsDim_LengthDimension.hxx +usr/include/opencascade/PrsDim_MaxRadiusDimension.hxx +usr/include/opencascade/PrsDim_MidPointRelation.hxx +usr/include/opencascade/PrsDim_MinRadiusDimension.hxx +usr/include/opencascade/PrsDim_OffsetDimension.hxx +usr/include/opencascade/PrsDim_ParallelRelation.hxx +usr/include/opencascade/PrsDim_PerpendicularRelation.hxx +usr/include/opencascade/PrsDim_RadiusDimension.hxx +usr/include/opencascade/PrsDim_Relation.hxx +usr/include/opencascade/PrsDim_SymmetricRelation.hxx +usr/include/opencascade/PrsDim_TangentRelation.hxx +usr/include/opencascade/PrsDim_TypeOfAngleArrowVisibility.hxx +usr/include/opencascade/PrsDim_TypeOfAngle.hxx +usr/include/opencascade/PrsDim_TypeOfDist.hxx usr/include/opencascade/PrsMgr_ListOfPresentableObjects.hxx usr/include/opencascade/PrsMgr_ListOfPresentations.hxx usr/include/opencascade/PrsMgr_PresentableObject.hxx -usr/include/opencascade/PrsMgr_Presentation.hxx usr/include/opencascade/PrsMgr_Presentation3d.hxx -usr/include/opencascade/PrsMgr_PresentationManager.hxx +usr/include/opencascade/PrsMgr_Presentation.hxx usr/include/opencascade/PrsMgr_PresentationManager3d.hxx +usr/include/opencascade/PrsMgr_PresentationManager.hxx usr/include/opencascade/PrsMgr_Presentations.hxx usr/include/opencascade/PrsMgr_TypeOfPresentation3d.hxx +usr/include/opencascade/Select3D_BndBox3d.hxx usr/include/opencascade/Select3D_BVHBuilder3d.hxx usr/include/opencascade/Select3D_BVHIndexBuffer.hxx -usr/include/opencascade/Select3D_BndBox3d.hxx usr/include/opencascade/Select3D_EntitySequence.hxx usr/include/opencascade/Select3D_IndexedMapOfEntity.hxx usr/include/opencascade/Select3D_InteriorSensitivePointSet.hxx @@ -543,20 +638,24 @@ usr/include/opencascade/Select3D_SensitiveTriangulation.hxx usr/include/opencascade/Select3D_SensitiveWire.hxx usr/include/opencascade/Select3D_TypeOfSensitivity.hxx -usr/include/opencascade/SelectBasics.hxx usr/include/opencascade/SelectBasics_EntityOwner.hxx +usr/include/opencascade/SelectBasics.hxx usr/include/opencascade/SelectBasics_PickResult.hxx usr/include/opencascade/SelectBasics_SelectingVolumeManager.hxx usr/include/opencascade/SelectBasics_SensitiveEntity.hxx usr/include/opencascade/SelectMgr_AndFilter.hxx +usr/include/opencascade/SelectMgr_AndOrFilter.hxx usr/include/opencascade/SelectMgr_BaseFrustum.hxx +usr/include/opencascade/SelectMgr_BVHThreadPool.hxx usr/include/opencascade/SelectMgr_CompositionFilter.hxx usr/include/opencascade/SelectMgr_CompositionFilter.lxx usr/include/opencascade/SelectMgr_EntityOwner.hxx usr/include/opencascade/SelectMgr_Filter.hxx +usr/include/opencascade/SelectMgr_FilterType.hxx +usr/include/opencascade/SelectMgr_FrustumBuilder.hxx usr/include/opencascade/SelectMgr_Frustum.hxx usr/include/opencascade/SelectMgr_Frustum.lxx -usr/include/opencascade/SelectMgr_FrustumBuilder.hxx +usr/include/opencascade/SelectMgr.hxx usr/include/opencascade/SelectMgr_IndexedDataMapOfOwnerCriterion.hxx usr/include/opencascade/SelectMgr_IndexedMapOfOwner.hxx usr/include/opencascade/SelectMgr_ListIteratorOfListOfFilter.hxx @@ -564,11 +663,11 @@ usr/include/opencascade/SelectMgr_OrFilter.hxx usr/include/opencascade/SelectMgr_PickingStrategy.hxx usr/include/opencascade/SelectMgr_RectangularFrustum.hxx -usr/include/opencascade/SelectMgr_SOPtr.hxx usr/include/opencascade/SelectMgr_SelectableObject.hxx usr/include/opencascade/SelectMgr_SelectableObjectSet.hxx usr/include/opencascade/SelectMgr_SelectingVolumeManager.hxx usr/include/opencascade/SelectMgr_Selection.hxx +usr/include/opencascade/SelectMgr_SelectionImageFiller.hxx usr/include/opencascade/SelectMgr_SelectionManager.hxx usr/include/opencascade/SelectMgr_SensitiveEntity.hxx usr/include/opencascade/SelectMgr_SensitiveEntitySet.hxx @@ -581,15 +680,20 @@ usr/include/opencascade/SelectMgr_TriangularFrustum.hxx usr/include/opencascade/SelectMgr_TriangularFrustumSet.hxx usr/include/opencascade/SelectMgr_TypeOfBVHUpdate.hxx +usr/include/opencascade/SelectMgr_TypeOfDepthTolerance.hxx usr/include/opencascade/SelectMgr_TypeOfUpdate.hxx usr/include/opencascade/SelectMgr_VectorTypes.hxx usr/include/opencascade/SelectMgr_ViewClipRange.hxx +usr/include/opencascade/SelectMgr_ViewerSelector3d.hxx usr/include/opencascade/SelectMgr_ViewerSelector.hxx usr/include/opencascade/StdPrs_BndBox.hxx +usr/include/opencascade/StdPrs_BRepFont.hxx +usr/include/opencascade/StdPrs_BRepTextBuilder.hxx usr/include/opencascade/StdPrs_Curve.hxx usr/include/opencascade/StdPrs_DeflectionCurve.hxx usr/include/opencascade/StdPrs_HLRPolyShape.hxx usr/include/opencascade/StdPrs_HLRShape.hxx +usr/include/opencascade/StdPrs_HLRShapeI.hxx usr/include/opencascade/StdPrs_HLRToolShape.hxx usr/include/opencascade/StdPrs_Isolines.hxx usr/include/opencascade/StdPrs_Plane.hxx @@ -597,6 +701,7 @@ usr/include/opencascade/StdPrs_PoleCurve.hxx usr/include/opencascade/StdPrs_ShadedShape.hxx usr/include/opencascade/StdPrs_ShadedSurface.hxx +usr/include/opencascade/StdPrs_ShapeTool.hxx usr/include/opencascade/StdPrs_ToolPoint.hxx usr/include/opencascade/StdPrs_ToolRFace.hxx usr/include/opencascade/StdPrs_ToolTriangulatedShape.hxx @@ -609,43 +714,31 @@ usr/include/opencascade/StdPrs_WFRestrictedFace.hxx usr/include/opencascade/StdPrs_WFShape.hxx usr/include/opencascade/StdPrs_WFSurface.hxx -usr/include/opencascade/StdSelect.hxx usr/include/opencascade/StdSelect_BRepOwner.hxx -usr/include/opencascade/StdSelect_BRepOwner.lxx usr/include/opencascade/StdSelect_BRepSelectionTool.hxx -usr/include/opencascade/StdSelect_DisplayMode.hxx usr/include/opencascade/StdSelect_EdgeFilter.hxx usr/include/opencascade/StdSelect_FaceFilter.hxx -usr/include/opencascade/StdSelect_IndexedDataMapOfOwnerPrs.hxx -usr/include/opencascade/StdSelect_Prs.hxx -usr/include/opencascade/StdSelect_Prs.lxx -usr/include/opencascade/StdSelect_SensitivityMode.hxx +usr/include/opencascade/StdSelect.hxx usr/include/opencascade/StdSelect_Shape.hxx usr/include/opencascade/StdSelect_ShapeTypeFilter.hxx -usr/include/opencascade/StdSelect_ShapeTypeFilter.lxx usr/include/opencascade/StdSelect_TypeOfEdge.hxx usr/include/opencascade/StdSelect_TypeOfFace.hxx -usr/include/opencascade/StdSelect_TypeOfResult.hxx usr/include/opencascade/StdSelect_TypeOfSelectionImage.hxx usr/include/opencascade/StdSelect_ViewerSelector3d.hxx -usr/include/opencascade/TColQuantity_Array1OfLength.hxx -usr/include/opencascade/TColQuantity_Array2OfLength.hxx -usr/include/opencascade/TColQuantity_HArray1OfLength.hxx -usr/include/opencascade/TColQuantity_HArray2OfLength.hxx -usr/include/opencascade/V3d.hxx usr/include/opencascade/V3d_AmbientLight.hxx usr/include/opencascade/V3d_BadValue.hxx usr/include/opencascade/V3d_CircularGrid.hxx usr/include/opencascade/V3d_Coordinate.hxx usr/include/opencascade/V3d_DirectionalLight.hxx +usr/include/opencascade/V3d.hxx usr/include/opencascade/V3d_ImageDumpOptions.hxx usr/include/opencascade/V3d_Light.hxx usr/include/opencascade/V3d_ListOfLight.hxx usr/include/opencascade/V3d_ListOfView.hxx usr/include/opencascade/V3d_Parameter.hxx usr/include/opencascade/V3d_Plane.hxx -usr/include/opencascade/V3d_PositionLight.hxx usr/include/opencascade/V3d_PositionalLight.hxx +usr/include/opencascade/V3d_PositionLight.hxx usr/include/opencascade/V3d_RectangularGrid.hxx usr/include/opencascade/V3d_SpotLight.hxx usr/include/opencascade/V3d_StereoDumpOptions.hxx @@ -661,77 +754,21 @@ usr/include/opencascade/V3d_TypeOfView.hxx usr/include/opencascade/V3d_TypeOfVisualization.hxx usr/include/opencascade/V3d_UnMapped.hxx -usr/include/opencascade/V3d_View.hxx -usr/include/opencascade/V3d_ViewPointer.hxx usr/include/opencascade/V3d_Viewer.hxx usr/include/opencascade/V3d_ViewerPointer.hxx +usr/include/opencascade/V3d_View.hxx +usr/include/opencascade/V3d_ViewPointer.hxx usr/include/opencascade/WNT_ClassDefinitionError.hxx usr/include/opencascade/WNT_Dword.hxx +usr/include/opencascade/WNT_HIDSpaceMouse.hxx usr/include/opencascade/WNT_OrientationType.hxx usr/include/opencascade/WNT_WClass.hxx usr/include/opencascade/WNT_Window.hxx usr/include/opencascade/WNT_Window.lxx usr/include/opencascade/WNT_WindowPtr.hxx usr/include/opencascade/Xw_Window.hxx -usr/include/opencascade/glext.h +usr/lib/cmake/opencascade/OpenCASCADEVisualizationTargets*.cmake usr/lib/*/libTKMeshVS.so usr/lib/*/libTKOpenGl.so usr/lib/*/libTKService.so usr/lib/*/libTKV3d.so -usr/lib/cmake/opencascade/OpenCASCADEVisualizationTargets*.cmake -usr/include/opencascade/AIS_SelectionModesConcurrency.hxx -usr/include/opencascade/Aspect_TypeOfDisplayText.hxx -usr/include/opencascade/Graphic3d_AlphaMode.hxx -usr/include/opencascade/Graphic3d_LightSet.hxx -usr/include/opencascade/OpenGl_FrameStats.hxx -usr/include/opencascade/OpenGl_FrameStatsPrs.hxx -usr/include/opencascade/Graphic3d_ArrayFlags.hxx -usr/include/opencascade/Graphic3d_Aspects.hxx -usr/include/opencascade/Graphic3d_AttribBuffer.hxx -usr/include/opencascade/Graphic3d_BufferRange.hxx -usr/include/opencascade/Graphic3d_BvhCStructureSet.hxx -usr/include/opencascade/Graphic3d_BvhCStructureSetTrsfPers.hxx -usr/include/opencascade/Graphic3d_CubeMap.hxx -usr/include/opencascade/Graphic3d_CubeMapOrder.hxx -usr/include/opencascade/Graphic3d_CubeMapPacked.hxx -usr/include/opencascade/Graphic3d_CubeMapSeparate.hxx -usr/include/opencascade/Graphic3d_CubeMapSide.hxx -usr/include/opencascade/Graphic3d_CullingTool.hxx -usr/include/opencascade/Graphic3d_FrameStatsCounter.hxx -usr/include/opencascade/Graphic3d_FrameStatsData.hxx -usr/include/opencascade/Graphic3d_FrameStats.hxx -usr/include/opencascade/Graphic3d_FrameStatsTimer.hxx -usr/include/opencascade/Graphic3d_Layer.hxx -usr/include/opencascade/Graphic3d_MapOfAspectsToAspects.hxx -usr/include/opencascade/Graphic3d_MapOfZLayerSettings.hxx -usr/include/opencascade/Graphic3d_MediaTexture.hxx -usr/include/opencascade/Graphic3d_MediaTextureSet.hxx -usr/include/opencascade/Graphic3d_MutableIndexBuffer.hxx -usr/include/opencascade/Graphic3d_Text.hxx -usr/include/opencascade/OpenGl_Aspects.hxx -usr/include/opencascade/OpenGl_AspectsProgram.hxx -usr/include/opencascade/OpenGl_AspectsSprite.hxx -usr/include/opencascade/OpenGl_AspectsTextureSet.hxx -usr/include/opencascade/OpenGl_ClippingIterator.hxx -usr/include/opencascade/OpenGl_GlCore45.hxx -usr/include/opencascade/OpenGl_ShaderProgramDumpLevel.hxx -usr/include/opencascade/Aspect_ScrollDelta.hxx -usr/include/opencascade/Aspect_Touch.hxx -usr/include/opencascade/Aspect_TouchMap.hxx -usr/include/opencascade/Aspect_VKeyFlags.hxx -usr/include/opencascade/Aspect_VKey.hxx -usr/include/opencascade/Aspect_VKeySet.hxx -usr/include/opencascade/Media_BufferPool.hxx -usr/include/opencascade/Media_CodecContext.hxx -usr/include/opencascade/Media_FormatContext.hxx -usr/include/opencascade/Media_Frame.hxx -usr/include/opencascade/Media_IFrameQueue.hxx -usr/include/opencascade/Media_Packet.hxx -usr/include/opencascade/Media_PlayerContext.hxx -usr/include/opencascade/Media_Scaler.hxx -usr/include/opencascade/Media_Timer.hxx -usr/include/opencascade/Font_StrictLevel.hxx -usr/include/opencascade/Font_UnicodeSubset.hxx -usr/include/opencascade/Image_PixMapTypedData.hxx -usr/include/opencascade/Image_Texture.hxx -usr/include/opencascade/Prs3d_ToolSector.hxx diff -Nru opencascade-7.4.1+dfsg1/debian/libocct-visualization-dev.lintian-overrides opencascade-7.5.1+dfsg1/debian/libocct-visualization-dev.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/libocct-visualization-dev.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/libocct-visualization-dev.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,2 @@ +# This is lintian bug #966295 +libocct-visualization-dev: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/not-installed opencascade-7.5.1+dfsg1/debian/not-installed --- opencascade-7.4.1+dfsg1/debian/not-installed 2020-04-25 18:50:15.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/not-installed 2021-02-07 12:16:53.000000000 +0000 @@ -9,3 +9,4 @@ debian/tmp/usr/share/opencascade/resources/XSTEPResource/FILES debian/tmp/usr/share/opencascade/resources/SHMessage/FILES debian/tmp/usr/share/opencascade/resources/StdResource/FILES +debian/tmp/usr/include/opencascade/FlexLexer.h diff -Nru opencascade-7.4.1+dfsg1/debian/occt-draw.1 opencascade-7.5.1+dfsg1/debian/occt-draw.1 --- opencascade-7.4.1+dfsg1/debian/occt-draw.1 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/occt-draw.1 2021-02-07 12:08:52.000000000 +0000 @@ -6,6 +6,6 @@ .SH DESCRIPTION This program provides a kind of scripting interface to the OpenCASCADE libraries. You can perform a simple test by starting it and entering at the -command line: "pload ALL" then "source /usr/share/occt/7.4.0/src/DrawResources/VisualizationDemo.tcl". +command line: "pload ALL" then "source /usr/share/occt/7.5.1/src/DrawResources/VisualizationDemo.tcl". .SH AUTHOR Adam Powell diff -Nru opencascade-7.4.1+dfsg1/debian/occt-draw-7.4.1 opencascade-7.5.1+dfsg1/debian/occt-draw-7.4.1 --- opencascade-7.4.1+dfsg1/debian/occt-draw-7.4.1 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/occt-draw-7.4.1 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -.TH occt-draw 1 "OpenCASCADE command interpreter and graphical test system" "DEBIAN" \" -*- nroff -*- -.SH NAME -occt-draw \- OpenCASCADE command interpreter and graphical test system -.SH SYNOPSIS -\fBocct-draw\fP -.SH DESCRIPTION -This program provides a kind of scripting interface to the OpenCASCADE -libraries. You can perform a simple test by starting it and entering at the -command line: "pload ALL" then "source /usr/share/occt/7.4.0/src/DrawResources/VisualizationDemo.tcl". -.SH AUTHOR -Adam Powell diff -Nru opencascade-7.4.1+dfsg1/debian/occt-draw-7.5.1 opencascade-7.5.1+dfsg1/debian/occt-draw-7.5.1 --- opencascade-7.4.1+dfsg1/debian/occt-draw-7.5.1 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/occt-draw-7.5.1 2021-02-07 12:08:52.000000000 +0000 @@ -0,0 +1,11 @@ +.TH occt-draw 1 "OpenCASCADE command interpreter and graphical test system" "DEBIAN" \" -*- nroff -*- +.SH NAME +occt-draw \- OpenCASCADE command interpreter and graphical test system +.SH SYNOPSIS +\fBocct-draw\fP +.SH DESCRIPTION +This program provides a kind of scripting interface to the OpenCASCADE +libraries. You can perform a simple test by starting it and entering at the +command line: "pload ALL" then "source /usr/share/occt/7.5.1/src/DrawResources/VisualizationDemo.tcl". +.SH AUTHOR +Adam Powell diff -Nru opencascade-7.4.1+dfsg1/debian/occt-draw.install opencascade-7.5.1+dfsg1/debian/occt-draw.install --- opencascade-7.4.1+dfsg1/debian/occt-draw.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/occt-draw.install 2021-02-07 12:16:53.000000000 +0000 @@ -1,34 +1,31 @@ #!/usr/bin/dh-exec -usr/bin/DRAWEXE-7.4.0 => usr/bin/occt-draw-7.4 -usr/bin/custom.sh => usr/share/opencascade/bin/custom.sh +../occ-icon-48.xpm usr/share/icons/hicolor/64x64/apps +../occt-draw*.desktop usr/share/applications +usr/bin/DRAWEXE-7.5.1 => usr/bin/occt-draw-7.5 usr/bin/custom_gcc_${DEB_HOST_ARCH_BITS}.sh => usr/share/opencascade/bin/custom_gcc_${DEB_HOST_ARCH_BITS}.sh +usr/bin/custom.sh => usr/share/opencascade/bin/custom.sh usr/bin/draw.sh => usr/share/opencascade/bin/draw.sh usr/bin/env.sh => usr/share/opencascade/bin/env.sh - usr/share/opencascade/resources/DrawResources/CheckCommands.tcl -usr/share/opencascade/resources/DrawResources/Vector.tcl +usr/share/opencascade/resources/DrawResources/CURVES.tcl +usr/share/opencascade/resources/DrawResources/dfb_attribns.gif +usr/share/opencascade/resources/DrawResources/dfb_attribute.gif +usr/share/opencascade/resources/DrawResources/dfb_folder.gif +usr/share/opencascade/resources/DrawResources/dftree.tcl usr/share/opencascade/resources/DrawResources/DrawDefault -usr/share/opencascade/resources/DrawResources/SCAN.tcl +usr/share/opencascade/resources/DrawResources/DrawPlugin +usr/share/opencascade/resources/DrawResources/DrawTK.tcl usr/share/opencascade/resources/DrawResources/Geometry.tcl -usr/share/opencascade/resources/DrawResources/Move.tcl usr/share/opencascade/resources/DrawResources/InitEnvironment.tcl -usr/share/opencascade/resources/DrawResources/StandardCommands.tcl usr/share/opencascade/resources/DrawResources/lamp.ico -usr/share/opencascade/resources/DrawResources/TestCommands.tcl -usr/share/opencascade/resources/DrawResources/StandardViews.tcl -usr/share/opencascade/resources/DrawResources/TKTopTest.tcl -usr/share/opencascade/resources/DrawResources/dftree.tcl -usr/share/opencascade/resources/DrawResources/DrawPlugin -usr/share/opencascade/resources/DrawResources/PROFIL.tcl +usr/share/opencascade/resources/DrawResources/Move.tcl usr/share/opencascade/resources/DrawResources/OCC_logo.png -usr/share/opencascade/resources/DrawResources/DrawTK.tcl +usr/share/opencascade/resources/DrawResources/PROFIL.tcl +usr/share/opencascade/resources/DrawResources/SCAN.tcl +usr/share/opencascade/resources/DrawResources/StandardCommands.tcl +usr/share/opencascade/resources/DrawResources/StandardViews.tcl usr/share/opencascade/resources/DrawResources/SURFACES.tcl -usr/share/opencascade/resources/DrawResources/CURVES.tcl +usr/share/opencascade/resources/DrawResources/TestCommands.tcl +usr/share/opencascade/resources/DrawResources/TKTopTest.tcl +usr/share/opencascade/resources/DrawResources/Vector.tcl usr/share/opencascade/resources/TObj/TObj.msg -usr/share/opencascade/resources/DrawResources/dfb_folder.gif -usr/share/opencascade/resources/DrawResources/dfb_attribute.gif -usr/share/opencascade/resources/DrawResources/dfb_attribns.gif - -../occ-icon-48.xpm usr/share/icons/hicolor/64x64/apps - -../occt-draw*.desktop usr/share/applications diff -Nru opencascade-7.4.1+dfsg1/debian/occt-draw.links opencascade-7.5.1+dfsg1/debian/occt-draw.links --- opencascade-7.4.1+dfsg1/debian/occt-draw.links 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/occt-draw.links 2021-02-01 03:05:25.000000000 +0000 @@ -1 +1 @@ -/usr/bin/occt-draw-7.4 /usr/bin/occt-draw +/usr/bin/occt-draw-7.5 /usr/bin/occt-draw diff -Nru opencascade-7.4.1+dfsg1/debian/occt-draw.lintian-overrides opencascade-7.5.1+dfsg1/debian/occt-draw.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/occt-draw.lintian-overrides 2020-04-25 18:50:15.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/occt-draw.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -1,2 +1,4 @@ # /usr/share/opencascade/bin/*.sh are reference scripts script-not-executable +# This is lintian bug #966295 +occt-draw: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/occt-draw.manpages opencascade-7.5.1+dfsg1/debian/occt-draw.manpages --- opencascade-7.4.1+dfsg1/debian/occt-draw.manpages 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/occt-draw.manpages 2021-02-01 03:05:25.000000000 +0000 @@ -1,2 +1,2 @@ -debian/occt-draw-7.4.1 +debian/occt-draw-7.5.1 debian/occt-draw.1 diff -Nru opencascade-7.4.1+dfsg1/debian/occt-misc.install opencascade-7.5.1+dfsg1/debian/occt-misc.install --- opencascade-7.4.1+dfsg1/debian/occt-misc.install 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/occt-misc.install 2021-02-07 12:08:52.000000000 +0000 @@ -4,11 +4,11 @@ usr/share/doc/opencascade/OCCT_LGPL_EXCEPTION.txt usr/share/opencascade/data/iges/bearing.iges usr/share/opencascade/data/iges/hammer.iges -usr/share/opencascade/data/images/Graph.PNG usr/share/opencascade/data/images/carrelage1.gif usr/share/opencascade/data/images/chataignier.gif usr/share/opencascade/data/images/cookerplate.gif usr/share/opencascade/data/images/cyl_4_1.gif +usr/share/opencascade/data/images/Graph.PNG usr/share/opencascade/data/images/hatch_1.png usr/share/opencascade/data/images/impexp.bmp usr/share/opencascade/data/images/marker_box1.png @@ -21,13 +21,24 @@ usr/share/opencascade/data/images/salome_interface04.jpg usr/share/opencascade/data/images/terrain.gif usr/share/opencascade/data/images/wallpaper.gif +usr/share/opencascade/data/occ/asahi.brep usr/share/opencascade/data/occ/Axis_of_bearing.brep usr/share/opencascade/data/occ/Ball.brep +usr/share/opencascade/data/occ/bottle.brep usr/share/opencascade/data/occ/Bottom.brep usr/share/opencascade/data/occ/CrankArm.brep usr/share/opencascade/data/occ/CrankArm.rle usr/share/opencascade/data/occ/CylinderHead.rle +usr/share/opencascade/data/occ/edge.brep usr/share/opencascade/data/occ/EngineBlock.rle +usr/share/opencascade/data/occ/face1.brep +usr/share/opencascade/data/occ/face2.brep +usr/share/opencascade/data/occ/face.brep +usr/share/opencascade/data/occ/fuse.brep +usr/share/opencascade/data/occ/hammer.brep +usr/share/opencascade/data/occ/mal_ecrou.brep +usr/share/opencascade/data/occ/mal_tige.brep +usr/share/opencascade/data/occ/mal_vis.brep usr/share/opencascade/data/occ/MAT.brep usr/share/opencascade/data/occ/MAT.pnt usr/share/opencascade/data/occ/MODERN_Chair_1.brep @@ -47,29 +58,16 @@ usr/share/opencascade/data/occ/Pump_Nut.brep usr/share/opencascade/data/occ/Pump_TopCover.brep usr/share/opencascade/data/occ/Room.brep -usr/share/opencascade/data/occ/SurfaceFromPoints/sol1.dat -usr/share/opencascade/data/occ/SurfaceFromPoints/sol2.dat -usr/share/opencascade/data/occ/Top.brep -usr/share/opencascade/data/occ/asahi.brep -usr/share/opencascade/data/occ/bottle.brep -usr/share/opencascade/data/occ/edge.brep -usr/share/opencascade/data/occ/face.brep -usr/share/opencascade/data/occ/face1.brep -usr/share/opencascade/data/occ/face2.brep -usr/share/opencascade/data/occ/fuse.brep -usr/share/opencascade/data/occ/hammer.brep -usr/share/opencascade/data/occ/mal_ecrou.brep -usr/share/opencascade/data/occ/mal_tige.brep -usr/share/opencascade/data/occ/mal_vis.brep usr/share/opencascade/data/occ/shell1.brep usr/share/opencascade/data/occ/solid.brep +usr/share/opencascade/data/occ/SurfaceFromPoints/sol1.dat +usr/share/opencascade/data/occ/SurfaceFromPoints/sol2.dat usr/share/opencascade/data/occ/terrain.brep +usr/share/opencascade/data/occ/Top.brep usr/share/opencascade/data/occ/wedge_ok.brep usr/share/opencascade/data/occ/wing.brep usr/share/opencascade/data/step/linkrods.step usr/share/opencascade/data/step/screw.step -usr/share/opencascade/data/stl/TR12J_OCC.stl -usr/share/opencascade/data/stl/TR12J_OCC64K.stl usr/share/opencascade/data/stl/bearing.stl usr/share/opencascade/data/stl/head.stl usr/share/opencascade/data/stl/motor.stl @@ -77,29 +75,49 @@ usr/share/opencascade/data/stl/sh1.stl usr/share/opencascade/data/stl/sh2.stl usr/share/opencascade/data/stl/shape.stl +usr/share/opencascade/data/stl/TR12J_OCC64K.stl +usr/share/opencascade/data/stl/TR12J_OCC.stl usr/share/opencascade/data/stl/video_part.stl usr/share/opencascade/data/vrml/face.vrml -usr/share/opencascade/resources/SHMessage/SHAPE.fr -usr/share/opencascade/resources/SHMessage/SHAPE.us -usr/share/opencascade/resources/SHMessage/SHMessage_SHAPE_us.pxx usr/share/opencascade/resources/Shaders/Declarations.glsl usr/share/opencascade/resources/Shaders/DeclarationsImpl.glsl usr/share/opencascade/resources/Shaders/Display.fs usr/share/opencascade/resources/Shaders/PathtraceBase.fs +usr/share/opencascade/resources/Shaders/PBRCookTorrance.glsl +usr/share/opencascade/resources/Shaders/PBRDistribution.glsl +usr/share/opencascade/resources/Shaders/PBREnvBaking.fs +usr/share/opencascade/resources/Shaders/PBREnvBaking.vs +usr/share/opencascade/resources/Shaders/PBRFresnel.glsl +usr/share/opencascade/resources/Shaders/PBRGeometry.glsl +usr/share/opencascade/resources/Shaders/PBRIllumination.glsl usr/share/opencascade/resources/Shaders/PhongShading.fs usr/share/opencascade/resources/Shaders/PhongShading.vs +usr/share/opencascade/resources/Shaders/PointLightAttenuation.glsl usr/share/opencascade/resources/Shaders/RaytraceBase.fs usr/share/opencascade/resources/Shaders/RaytraceBase.vs usr/share/opencascade/resources/Shaders/RaytraceRender.fs usr/share/opencascade/resources/Shaders/RaytraceSmooth.fs -usr/share/opencascade/resources/Shaders/Shaders_DeclarationsImpl_glsl.pxx usr/share/opencascade/resources/Shaders/Shaders_Declarations_glsl.pxx +usr/share/opencascade/resources/Shaders/Shaders_DeclarationsImpl_glsl.pxx usr/share/opencascade/resources/Shaders/Shaders_Display_fs.pxx usr/share/opencascade/resources/Shaders/Shaders_PathtraceBase_fs.pxx +usr/share/opencascade/resources/Shaders/Shaders_PBRCookTorrance_glsl.pxx +usr/share/opencascade/resources/Shaders/Shaders_PBRDistribution_glsl.pxx +usr/share/opencascade/resources/Shaders/Shaders_PBREnvBaking_fs.pxx +usr/share/opencascade/resources/Shaders/Shaders_PBREnvBaking_vs.pxx +usr/share/opencascade/resources/Shaders/Shaders_PBRFresnel_glsl.pxx +usr/share/opencascade/resources/Shaders/Shaders_PBRGeometry_glsl.pxx +usr/share/opencascade/resources/Shaders/Shaders_PBRIllumination_glsl.pxx +usr/share/opencascade/resources/Shaders/Shaders_PointLightAttenuation_glsl.pxx usr/share/opencascade/resources/Shaders/Shaders_RaytraceBase_fs.pxx usr/share/opencascade/resources/Shaders/Shaders_RaytraceBase_vs.pxx usr/share/opencascade/resources/Shaders/Shaders_RaytraceRender_fs.pxx usr/share/opencascade/resources/Shaders/Shaders_RaytraceSmooth_fs.pxx +usr/share/opencascade/resources/Shaders/Shaders_TangentSpaceNormal_glsl.pxx +usr/share/opencascade/resources/Shaders/TangentSpaceNormal.glsl +usr/share/opencascade/resources/SHMessage/SHAPE.fr +usr/share/opencascade/resources/SHMessage/SHAPE.us +usr/share/opencascade/resources/SHMessage/SHMessage_SHAPE_us.pxx usr/share/opencascade/resources/StdResource/MigrationSheet.txt usr/share/opencascade/resources/StdResource/Plugin usr/share/opencascade/resources/StdResource/Standard @@ -107,7 +125,6 @@ usr/share/opencascade/resources/StdResource/TObj usr/share/opencascade/resources/StdResource/XCAF usr/share/opencascade/resources/Textures/1d_elevation.rgb -usr/share/opencascade/resources/Textures/2d_MatraDatavision.rgb usr/share/opencascade/resources/Textures/2d_alienskin.rgb usr/share/opencascade/resources/Textures/2d_aluminum.rgb usr/share/opencascade/resources/Textures/2d_blue_rock.rgb @@ -126,6 +143,7 @@ usr/share/opencascade/resources/Textures/2d_knurl.rgb usr/share/opencascade/resources/Textures/2d_maple.rgb usr/share/opencascade/resources/Textures/2d_marble.rgb +usr/share/opencascade/resources/Textures/2d_MatraDatavision.rgb usr/share/opencascade/resources/Textures/2d_mottled.rgb usr/share/opencascade/resources/Textures/2d_rain.rgb usr/share/opencascade/resources/Textures/2d_rock.rgb @@ -137,46 +155,56 @@ usr/share/opencascade/resources/Textures/env_road.rgb usr/share/opencascade/resources/Textures/env_sky1.rgb usr/share/opencascade/resources/Textures/env_sky2.rgb +usr/share/opencascade/resources/Textures/Textures_EnvLUT.pxx usr/share/opencascade/resources/UnitsAPI/Units.dat -usr/share/opencascade/resources/XSMessage/XSMessage_XSTEP_us.pxx -usr/share/opencascade/resources/XSMessage/XSTEP.fr -usr/share/opencascade/resources/XSMessage/XSTEP.us -usr/share/opencascade/resources/XSTEPResource/IGES -usr/share/opencascade/resources/XSTEPResource/STEP -usr/share/opencascade/resources/XmlOcafResource/XmlOcaf.xsd usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_SmallTypes.xsd -usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TDF.xsd -usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TDataStd.xsd usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TDataStd_Name.xsd +usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TDataStd.xsd +usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TDF.xsd usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TDocStd.xsd usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TFunction.xsd -usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TNaming.xsd usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TNaming_NamedShape.xsd +usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TNaming.xsd usr/share/opencascade/resources/XmlOcafResource/XmlOcaf_TPrsStd.xsd +usr/share/opencascade/resources/XmlOcafResource/XmlOcaf.xsd usr/share/opencascade/resources/XmlOcafResource/XmlXcaf.xsd +usr/share/opencascade/resources/XRResources/FILES +usr/share/opencascade/resources/XRResources/occtvr_actions.json +usr/share/opencascade/resources/XRResources/occtvr_bindings_generic.json +usr/share/opencascade/resources/XRResources/occtvr_bindings_holographic_hmd.json +usr/share/opencascade/resources/XRResources/occtvr_bindings_index_hmd.json +usr/share/opencascade/resources/XRResources/occtvr_bindings_rift.json +usr/share/opencascade/resources/XRResources/occtvr_bindings_vive_controller.json +usr/share/opencascade/resources/XRResources/occtvr_bindings_vive_cosmos.json +usr/share/opencascade/resources/XRResources/occtvr_bindings_vive.json +usr/share/opencascade/resources/XRResources/occtvr_bindings_vive_pro.json +usr/share/opencascade/resources/XSMessage/XSMessage_XSTEP_us.pxx +usr/share/opencascade/resources/XSMessage/XSTEP.fr +usr/share/opencascade/resources/XSMessage/XSTEP.us +usr/share/opencascade/resources/XSTEPResource/IGES +usr/share/opencascade/resources/XSTEPResource/STEP usr/share/opencascade/samples/tcl/ANC101.tcl -usr/share/opencascade/samples/tcl/DataExchangeDemo.tcl -usr/share/opencascade/samples/tcl/MBBGehauseRohteil.tcl -usr/share/opencascade/samples/tcl/ModelingDemo.tcl -usr/share/opencascade/samples/tcl/Penrose.tcl -usr/share/opencascade/samples/tcl/Penrose.tcl -usr/share/opencascade/samples/tcl/Readme.txt -usr/share/opencascade/samples/tcl/Readme.txt -usr/share/opencascade/samples/tcl/VisualizationDemo.tcl usr/share/opencascade/samples/tcl/bottle.tcl usr/share/opencascade/samples/tcl/cad.tcl usr/share/opencascade/samples/tcl/cpu.tcl usr/share/opencascade/samples/tcl/cutter.tcl +usr/share/opencascade/samples/tcl/DataExchangeDemo.tcl usr/share/opencascade/samples/tcl/dimensions.tcl usr/share/opencascade/samples/tcl/drill.tcl +usr/share/opencascade/samples/tcl/logo2019.tcl usr/share/opencascade/samples/tcl/markers.tcl usr/share/opencascade/samples/tcl/materials.tcl +usr/share/opencascade/samples/tcl/MBBGehauseRohteil.tcl +usr/share/opencascade/samples/tcl/ModelingDemo.tcl usr/share/opencascade/samples/tcl/pathtrace_ball.tcl usr/share/opencascade/samples/tcl/pathtrace_cube.tcl usr/share/opencascade/samples/tcl/pathtrace_materials.tcl usr/share/opencascade/samples/tcl/pencil.tcl +usr/share/opencascade/samples/tcl/Penrose.tcl usr/share/opencascade/samples/tcl/raytrace.tcl +usr/share/opencascade/samples/tcl/Readme.txt usr/share/opencascade/samples/tcl/snowflake.tcl usr/share/opencascade/samples/tcl/spheres.tcl +usr/share/opencascade/samples/tcl/vis_pbr_spheres.tcl +usr/share/opencascade/samples/tcl/VisualizationDemo.tcl usr/share/opencascade/samples/tcl/xde.tcl -usr/share/opencascade/samples/tcl/logo2019.tcl diff -Nru opencascade-7.4.1+dfsg1/debian/occt-misc.lintian-overrides opencascade-7.5.1+dfsg1/debian/occt-misc.lintian-overrides --- opencascade-7.4.1+dfsg1/debian/occt-misc.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/occt-misc.lintian-overrides 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,2 @@ +# This is lintian bug #966295 +occt-misc: bogus-mail-host-in-debian-changelog Adam C. Powell, IV diff -Nru opencascade-7.4.1+dfsg1/debian/patches/0001-cmake-Don-t-try-to-write-to-install-directory.-You-k.patch opencascade-7.5.1+dfsg1/debian/patches/0001-cmake-Don-t-try-to-write-to-install-directory.-You-k.patch --- opencascade-7.4.1+dfsg1/debian/patches/0001-cmake-Don-t-try-to-write-to-install-directory.-You-k.patch 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/0001-cmake-Don-t-try-to-write-to-install-directory.-You-k.patch 2021-02-07 12:08:52.000000000 +0000 @@ -0,0 +1,36 @@ +Subject: [PATCH 1/7] cmake: Don't try to write to install directory. You know, permissions and all +From: blobfish + +Date: Tue, 29 Sep 2020 06:24:25 -0400 + + +--- + CMakeLists.txt | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -915,15 +915,15 @@ + endif() + + # change custom.bat/sh +-if (EXISTS "${INSTALL_DIR}/${INSTALL_DIR_SCRIPT}/custom.${SCRIPT_EXT}") +- file (READ "${INSTALL_DIR}/${INSTALL_DIR_SCRIPT}/custom.${SCRIPT_EXT}" CUSTOM_CONTENT) +- +- set (CUSTOM_CONTENT "${CUSTOM_CONTENT} ${ADDITIONAL_CUSTOM_CONTENT}") +- +- file (WRITE "${INSTALL_DIR}/${INSTALL_DIR_SCRIPT}/custom.${SCRIPT_EXT}" "${CUSTOM_CONTENT}") +-else() ++# if (EXISTS "${INSTALL_DIR}/${INSTALL_DIR_SCRIPT}/custom.${SCRIPT_EXT}") ++# file (READ "${INSTALL_DIR}/${INSTALL_DIR_SCRIPT}/custom.${SCRIPT_EXT}" CUSTOM_CONTENT) ++# ++# set (CUSTOM_CONTENT "${CUSTOM_CONTENT} ${ADDITIONAL_CUSTOM_CONTENT}") ++# ++# file (WRITE "${INSTALL_DIR}/${INSTALL_DIR_SCRIPT}/custom.${SCRIPT_EXT}" "${CUSTOM_CONTENT}") ++# else() + OCCT_CONFIGURE_AND_INSTALL ("adm/templates/custom.${SCRIPT_EXT}.main" "custom.${SCRIPT_EXT}" "custom.${SCRIPT_EXT}" "${INSTALL_DIR_SCRIPT}") +-endif() ++# endif() + + if (WIN32) + set (THIRDPARTY_DIR_REPLACE "%THIRDPARTY_DIR%") diff -Nru opencascade-7.4.1+dfsg1/debian/patches/0002-GeomPlate_BuildAveragePlane-BasePlan-Don-t-set-yvect.patch opencascade-7.5.1+dfsg1/debian/patches/0002-GeomPlate_BuildAveragePlane-BasePlan-Don-t-set-yvect.patch --- opencascade-7.4.1+dfsg1/debian/patches/0002-GeomPlate_BuildAveragePlane-BasePlan-Don-t-set-yvect.patch 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/0002-GeomPlate_BuildAveragePlane-BasePlan-Don-t-set-yvect.patch 2021-02-07 12:08:52.000000000 +0000 @@ -0,0 +1,23 @@ +Subject: [PATCH 2/7] GeomPlate_BuildAveragePlane: BasePlan: Don't set yvector to zero. See Following: +From: blobfish + +Date: Tue, 29 Sep 2020 06:36:13 -0400 + + When we return, the yvector is crossed with x and we crash. + The z vector is passed in and we calculate the x vector, so just cross those 2 in this case to get y. + +--- + src/GeomPlate/GeomPlate_BuildAveragePlane.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/src/GeomPlate/GeomPlate_BuildAveragePlane.cxx ++++ b/src/GeomPlate/GeomPlate_BuildAveragePlane.cxx +@@ -436,7 +436,7 @@ + || ((Abs(n2)<=myTol)&&(Abs(n3)<=myTol)) + || ((Abs(n1)<=myTol)&&(Abs(n3)<=myTol))) { + myOX.SetCoord(V3(1),V3(2),V3(3)); +- myOY.SetCoord(0,0,0); ++ myOY = OZ ^ myOX; + } + else { + myOX.SetCoord(V3(1),V3(2),V3(3)); diff -Nru opencascade-7.4.1+dfsg1/debian/patches/0003-BRepFill_Filling-WireFromList-We-can-t-assume-that-a.patch opencascade-7.5.1+dfsg1/debian/patches/0003-BRepFill_Filling-WireFromList-We-can-t-assume-that-a.patch --- opencascade-7.4.1+dfsg1/debian/patches/0003-BRepFill_Filling-WireFromList-We-can-t-assume-that-a.patch 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/0003-BRepFill_Filling-WireFromList-We-can-t-assume-that-a.patch 2021-02-07 12:08:52.000000000 +0000 @@ -0,0 +1,40 @@ +Subject: [PATCH 3/7] BRepFill_Filling: WireFromList: We can't assume that a connected edge was found and the iterator is valid or we will crash on Edges.Remove +From: blobfish + +Date: Tue, 29 Sep 2020 06:41:32 -0400 + + +--- + src/BRepFill/BRepFill_Filling.cxx | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +--- a/src/BRepFill/BRepFill_Filling.cxx ++++ b/src/BRepFill/BRepFill_Filling.cxx +@@ -105,6 +105,7 @@ + while (!Edges.IsEmpty()) + { + TopTools_ListIteratorOfListOfShape itl(Edges); ++ bool found = false; + for (; itl.More(); itl.Next()) + { + anEdge = TopoDS::Edge(itl.Value()); +@@ -127,11 +128,17 @@ + anEdge.Reverse(); + V2 = V3; + } ++ found = true; + break; + } + } +- BB.Add(aWire, anEdge); +- Edges.Remove(itl); ++ if (found) ++ { ++ BB.Add(aWire, anEdge); ++ Edges.Remove(itl); ++ } ++ else ++ break; + } + + aWire.Closed(Standard_True); diff -Nru opencascade-7.4.1+dfsg1/debian/patches/0004-BRepFill_Filling-Curve-constraints-confused-by-impli.patch opencascade-7.5.1+dfsg1/debian/patches/0004-BRepFill_Filling-Curve-constraints-confused-by-impli.patch --- opencascade-7.4.1+dfsg1/debian/patches/0004-BRepFill_Filling-Curve-constraints-confused-by-impli.patch 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/0004-BRepFill_Filling-Curve-constraints-confused-by-impli.patch 2021-02-07 12:08:52.000000000 +0000 @@ -0,0 +1,54 @@ +Subject: [PATCH 4/7] BRepFill_Filling: Curve constraints confused by implicit cast from GeomAbs_Shape to Standard_Integer +From: blobfish + +Date: Tue, 29 Sep 2020 07:47:55 -0400 + + +--- + src/BRepFill/BRepFill_Filling.cxx | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +--- a/src/BRepFill/BRepFill_Filling.cxx ++++ b/src/BRepFill/BRepFill_Filling.cxx +@@ -333,13 +333,22 @@ + CurFace = SeqOfConstraints(i).myFace; + CurOrder = SeqOfConstraints(i).myOrder; + ++ // this silently defaults to C0 with an invalid value, ++ // where before an exception would be ++ // thrown out of curve constraints. Good, Bad? ++ Standard_Integer orderAdapt = 0; ++ if (CurOrder == GeomAbs_G1) ++ orderAdapt = 1; ++ else if (CurOrder == GeomAbs_G2) ++ orderAdapt = 2; ++ + if (CurFace.IsNull()) { + if (CurOrder == GeomAbs_C0) { + Handle( BRepAdaptor_HCurve ) HCurve = new BRepAdaptor_HCurve(); + HCurve->ChangeCurve().Initialize( CurEdge ); + const Handle(Adaptor3d_HCurve)& aHCurve = HCurve; // to avoid ambiguity + Constr = new BRepFill_CurveConstraint(aHCurve, +- CurOrder, ++ orderAdapt, + myNbPtsOnCur, + myTol3d ); + } +@@ -363,7 +372,7 @@ + Handle (Adaptor3d_HCurveOnSurface) HCurvOnSurf = new Adaptor3d_HCurveOnSurface( CurvOnSurf ); + + Constr = new GeomPlate_CurveConstraint(HCurvOnSurf, +- CurOrder, ++ orderAdapt, + myNbPtsOnCur, + myTol3d, + myTolAng, +@@ -383,7 +392,7 @@ + Handle (Adaptor3d_HCurveOnSurface) HCurvOnSurf = new Adaptor3d_HCurveOnSurface( CurvOnSurf ); + + Constr = new BRepFill_CurveConstraint( HCurvOnSurf, +- CurOrder, ++ orderAdapt, + myNbPtsOnCur, + myTol3d, + myTolAng, diff -Nru opencascade-7.4.1+dfsg1/debian/patches/0005-BRepFill_Filling-Don-t-even-attempt-to-build-with-em.patch opencascade-7.5.1+dfsg1/debian/patches/0005-BRepFill_Filling-Don-t-even-attempt-to-build-with-em.patch --- opencascade-7.4.1+dfsg1/debian/patches/0005-BRepFill_Filling-Don-t-even-attempt-to-build-with-em.patch 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/0005-BRepFill_Filling-Don-t-even-attempt-to-build-with-em.patch 2021-02-07 12:08:52.000000000 +0000 @@ -0,0 +1,25 @@ +Subject: [PATCH 5/7] BRepFill_Filling: Don't even attempt to build with empty boundary +From: blobfish + +Date: Thu, 1 Oct 2020 10:06:35 -0400 + + +--- + src/BRepFill/BRepFill_Filling.cxx | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/src/BRepFill/BRepFill_Filling.cxx ++++ b/src/BRepFill/BRepFill_Filling.cxx +@@ -590,6 +590,12 @@ + GeomPlate_BuildPlateSurface thebuild( myDegree, myNbPtsOnCur, myNbIter, + myTol2d, myTol3d, myTolAng, myTolCurv, myAnisotropie ); + ++ if (myBoundary.IsEmpty()) ++ { ++ myIsDone = Standard_False; ++ return; ++ } ++ + myBuilder = thebuild; + TopoDS_Edge CurEdge; + TopoDS_Face CurFace; diff -Nru opencascade-7.4.1+dfsg1/debian/patches/0006-BRepOffset_Tool-TryProject-Check-return-of-BRepLib-B.patch opencascade-7.5.1+dfsg1/debian/patches/0006-BRepOffset_Tool-TryProject-Check-return-of-BRepLib-B.patch --- opencascade-7.4.1+dfsg1/debian/patches/0006-BRepOffset_Tool-TryProject-Check-return-of-BRepLib-B.patch 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/0006-BRepOffset_Tool-TryProject-Check-return-of-BRepLib-B.patch 2021-02-07 12:08:52.000000000 +0000 @@ -0,0 +1,22 @@ +Subject: [PATCH 6/7] BRepOffset_Tool: TryProject: Check return of BRepLib::BuildCurve3d. Might be degenerate edge, so no curve +From: blobfish + +Date: Mon, 18 Jan 2021 22:26:33 -0500 + + +--- + src/BRepOffset/BRepOffset_Tool.cxx | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/src/BRepOffset/BRepOffset_Tool.cxx ++++ b/src/BRepOffset/BRepOffset_Tool.cxx +@@ -1894,7 +1894,8 @@ + TopoDS_Edge CurE = TopoDS::Edge(it.Value()); + Handle(Geom_Curve) C = BRep_Tool::Curve(CurE,L,f,l); + if (C.IsNull()) { +- BRepLib::BuildCurve3d(CurE,BRep_Tool::Tolerance(CurE)); ++ if (!BRepLib::BuildCurve3d(CurE,BRep_Tool::Tolerance(CurE))) ++ continue; + C = BRep_Tool::Curve(CurE,L,f,l); + } + C = new Geom_TrimmedCurve(C,f,l); diff -Nru opencascade-7.4.1+dfsg1/debian/patches/0007-ChFi3d_Builder-PerformIntersectionAtEnd-Check-max-nu.patch opencascade-7.5.1+dfsg1/debian/patches/0007-ChFi3d_Builder-PerformIntersectionAtEnd-Check-max-nu.patch --- opencascade-7.4.1+dfsg1/debian/patches/0007-ChFi3d_Builder-PerformIntersectionAtEnd-Check-max-nu.patch 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/0007-ChFi3d_Builder-PerformIntersectionAtEnd-Check-max-nu.patch 2021-02-07 12:08:52.000000000 +0000 @@ -0,0 +1,20 @@ +Subject: [PATCH 7/7] ChFi3d_Builder: PerformIntersectionAtEnd: Check max number of faces +From: blobfish + +Date: Mon, 18 Jan 2021 22:47:56 -0500 + + +--- + src/ChFi3d/ChFi3d_Builder_C1.cxx | 1 + + 1 file changed, 1 insertion(+) + +--- a/src/ChFi3d/ChFi3d_Builder_C1.cxx ++++ b/src/ChFi3d/ChFi3d_Builder_C1.cxx +@@ -2018,6 +2018,7 @@ + if ((possible1 && possible2) || (!possible1 && !possible2) || (nbarete > 4)) { + while (!trouve) { + nb++; ++ if (nb>=nn) throw Standard_Failure("IntersectionAtEnd : the max number of faces reached"); + if (nb!=1) F3=Face[nb-2]; + Face[nb-1]=F3; + if (CV1.Arc().IsSame(edgelibre1)) diff -Nru opencascade-7.4.1+dfsg1/debian/patches/0008-Add-error-checking-to-chamfer-and-fillet-code.patch opencascade-7.5.1+dfsg1/debian/patches/0008-Add-error-checking-to-chamfer-and-fillet-code.patch --- opencascade-7.4.1+dfsg1/debian/patches/0008-Add-error-checking-to-chamfer-and-fillet-code.patch 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/0008-Add-error-checking-to-chamfer-and-fillet-code.patch 2021-02-07 12:08:52.000000000 +0000 @@ -0,0 +1,252 @@ +From 124f0d742ca49f2e897f27f4595b1079c9266f8e Mon Sep 17 00:00:00 2001 +From: Chris Hennes +Date: Sat, 30 Jan 2021 17:58:39 -0600 +Subject: [PATCH] Add error-checking to chamfer and fillet code + +--- + src/ChFi3d/ChFi3d_Builder_0.cxx | 9 +++++++++ + src/ChFi3d/ChFi3d_Builder_C1.cxx | 24 ++++++++++++++++++++++++ + src/ChFi3d/ChFi3d_Builder_CnCrn.cxx | 14 +++++++++++++- + 3 files changed, 46 insertions(+), 1 deletion(-) + +--- a/src/ChFi3d/ChFi3d_Builder_0.cxx ++++ b/src/ChFi3d/ChFi3d_Builder_0.cxx +@@ -4394,6 +4394,9 @@ + if (!Fcur.IsSame(F1)) { + F=Fcur;trouve=Standard_True;} + } ++ if (trouve == Standard_False) { ++ throw Standard_Failure("Failed to find element."); ++ } + } + //======================================================================= + //function : cherche_element +@@ -4433,6 +4436,9 @@ + } + } + } ++ if (trouve == Standard_False) { ++ throw Standard_Failure("Failed to find edge."); ++ } + } + //======================================================================= + //function : cherche_edge +@@ -4477,6 +4483,9 @@ + } + } + } ++ if (trouve == Standard_False) { ++ throw Standard_Failure("Failed to find element."); ++ } + } + + //======================================================================= +--- a/src/ChFi3d/ChFi3d_Builder_C1.cxx ++++ b/src/ChFi3d/ChFi3d_Builder_C1.cxx +@@ -338,6 +338,7 @@ + return Standard_False; + + Handle(Geom2d_Curve) gpcprol = BRep_Tool::CurveOnSurface(Eprol,Fprol,uf,ul); ++ if (gpcprol.IsNull()) throw Standard_Failure("Failed to create curve."); + Handle(Geom2dAdaptor_HCurve) pcprol = new Geom2dAdaptor_HCurve(gpcprol); + Standard_Real partemp = BRep_Tool::Parameter(Vtx,Eprol); + +@@ -822,11 +823,13 @@ + if (onsame && IFopArc == 1) pfac1 = p2dbout; + else { + Hc1 = BRep_Tool::CurveOnSurface(CV1.Arc(),Fv,Ubid,Ubid); ++ if (Hc1.IsNull()) throw Standard_Failure("Failed to create curve."); + pfac1 = Hc1->Value(CV1.ParameterOnArc()); + } + if (onsame && IFopArc == 2) pfac2 = p2dbout; + else { + Hc2 = BRep_Tool::CurveOnSurface(CV2.Arc(),Fv,Ubid,Ubid); ++ if (Hc2.IsNull()) throw Standard_Failure("Failed to create curve."); + pfac2 = Hc2->Value(CV2.ParameterOnArc()); + } + if (Fi1.LineIndex() != 0) { +@@ -868,6 +871,7 @@ + + //Standard_Real Ubid,Vbid; + Handle (Geom_Curve) C=BRep_Tool::Curve(edgecouture,Ubid,Vbid); ++ if (C.IsNull()) throw Standard_Failure("Failed to create curve."); + Handle(Geom_TrimmedCurve) Ctrim=new Geom_TrimmedCurve (C,Ubid,Vbid); + GeomAdaptor_Curve cur1(Ctrim->BasisCurve()); + GeomAdaptor_Curve cur2(Cc); +@@ -1050,6 +1054,7 @@ + Standard_Real first, last, prm1, prm2; + Standard_Boolean onfirst, FirstToPar; + Handle(Geom2d_Curve) Hc = BRep_Tool::CurveOnSurface( CV[i].Arc(), Fv, first, last ); ++ if (Hc.IsNull()) throw Standard_Failure("Failed to create curve."); + pfac1 = Hc->Value( CV[i].ParameterOnArc() ); + PcF = Pc->Value( Udeb ); + PcL = Pc->Value( Ufin ); +@@ -1101,6 +1106,7 @@ + TopoDS_Edge aLocalEdge = CV[i].Arc(); + aLocalEdge.Reverse(); + Handle(Geom2d_Curve) HcR = BRep_Tool::CurveOnSurface( aLocalEdge, Fv, first, last ); ++ if (HcR.IsNull()) throw Standard_Failure("Failed to create curve."); + Interfc = ChFi3d_FilCurveInDS( indcurv, indface, HcR, aLocalEdge.Orientation() ); + DStr.ChangeShapeInterferences(indface).Append( Interfc ); + //modify degenerated edge +@@ -1126,6 +1132,7 @@ + { + Standard_Real fd, ld; + Handle(Geom2d_Curve) Cd = BRep_Tool::CurveOnSurface( Edeg, Fv, fd, ld ); ++ if (Cd.IsNull()) throw Standard_Failure("Failed to create curve."); + Handle(Geom2d_TrimmedCurve) tCd = Handle(Geom2d_TrimmedCurve)::DownCast(Cd); + if (! tCd.IsNull()) + Cd = tCd->BasisCurve(); +@@ -1244,9 +1251,11 @@ + const ChFiDS_FaceInterference& Fiop = Fd->Interference(IFopArc); + gp_Pnt2d pop1, pop2, pv1, pv2; + Hc = BRep_Tool::CurveOnSurface(Arcprol,Fop,Ubid,Ubid); ++ if (Hc.IsNull()) throw Standard_Failure("Failed to create curve."); + pop1 = Hc->Value(parVtx); + pop2 = Fiop.PCurveOnFace()->Value(Fiop.Parameter(isfirst)); + Hc = BRep_Tool::CurveOnSurface(Arcprol,Fv,Ubid,Ubid); ++ if (Hc.IsNull()) throw Standard_Failure("Failed to create curve."); + pv1 = Hc->Value(parVtx); + pv2 = p2dbout; + ChFi3d_Recale(Bs,pv1,pv2,1); +@@ -1436,6 +1445,9 @@ + } + } + } ++ if (trouve == Standard_False) { ++ throw Standard_Failure("Failed to find face."); ++ } + } + + //======================================================================= +@@ -1466,6 +1478,9 @@ + {Edge=Ecur1;trouve=Standard_True;} + } + } ++ if (trouve == Standard_False) { ++ throw Standard_Failure("Failed to find edge."); ++ } + } + + //======================================================================= +@@ -2147,6 +2162,7 @@ + + if (nb==1) { + Hc1 = BRep_Tool::CurveOnSurface(Edge[0],Face[0],Ubid,Ubid); ++ if (Hc1.IsNull()) throw Standard_Failure("Failed to create curve."); + if (isOnSame1) { + // update interference param on Fi1 and point of CV1 + if (prolface[0]) Bs.Initialize(faceprol[0], Standard_False); +@@ -2219,6 +2235,7 @@ + + Handle(Geom_Curve) C; + C=BRep_Tool::Curve(E2,Ubid,Vbid); ++ if (C.IsNull()) throw Standard_Failure("Failed to create curve."); + Handle(Geom_TrimmedCurve) Ctrim = new Geom_TrimmedCurve(C,Ubid,Vbid); + Standard_Real Utrim,Vtrim; + Utrim=Ctrim->BasisCurve()->FirstParameter(); +@@ -2344,7 +2361,9 @@ + paredge2=inters.Point(nbp).W(); + if (!extend) { + cfacemoins1=BRep_Tool::CurveOnSurface(E2,F,u2,v2); ++ if (cfacemoins1.IsNull()) throw Standard_Failure("Failed to create curve."); + cface=BRep_Tool::CurveOnSurface(E2,Face[nb],u2,v2); ++ if (cface.IsNull()) throw Standard_Failure("Failed to create curve."); + cfacemoins1->D0(paredge2,pfac2); + cface->D0(paredge2,pint); + } +@@ -4010,11 +4029,13 @@ + if( IFopArc == 1) pfac1 = p2dbout; + else { + Hc1 = BRep_Tool::CurveOnSurface(CV1.Arc(),Fv,Ubid,Ubid); ++ if (Hc1.IsNull()) throw Standard_Failure("Failed to create curve."); + pfac1 = Hc1->Value(CV1.ParameterOnArc()); + } + if(IFopArc == 2) pfac2 = p2dbout; + else { + Hc2 = BRep_Tool::CurveOnSurface(CV2.Arc(),Fv,Ubid,Ubid); ++ if (Hc2.IsNull()) throw Standard_Failure("Failed to create curve."); + pfac2 = Hc2->Value(CV2.ParameterOnArc()); + } + if(Fi1.LineIndex() != 0){ +@@ -4054,6 +4075,7 @@ + + //Standard_Real Ubid,Vbid; + Handle (Geom_Curve) C=BRep_Tool::Curve(edgecouture,Ubid,Vbid); ++ if (C.IsNull()) throw Standard_Failure("Failed to create curve."); + Handle(Geom_TrimmedCurve) Ctrim=new Geom_TrimmedCurve (C,Ubid,Vbid); + GeomAdaptor_Curve cur1(Ctrim->BasisCurve()); + GeomAdaptor_Curve cur2(Cc); +@@ -4284,9 +4306,11 @@ + // Modified by skv - Thu Aug 21 11:55:58 2008 OCC20222 End + //fin modif + Hc = BRep_Tool::CurveOnSurface(Arcprolbis,Fop,Ubid,Ubid); ++ if (Hc.IsNull()) throw Standard_Failure("Failed to create curve."); + pop1 = Hc->Value(parVtx); + pop2 = Fiop.PCurveOnFace()->Value(Fiop.Parameter(isfirst)); + Hc = BRep_Tool::CurveOnSurface(Arcprol,Fv,Ubid,Ubid); ++ if (Hc.IsNull()) throw Standard_Failure("Failed to create curve."); + //modif + parVtx = BRep_Tool::Parameter(Vtx,Arcprol); + //fin modif +--- a/src/ChFi3d/ChFi3d_Builder_CnCrn.cxx ++++ b/src/ChFi3d/ChFi3d_Builder_CnCrn.cxx +@@ -291,6 +291,9 @@ + {Edge=Ecur1;trouve=Standard_True;} + } + } ++ if (trouve == Standard_False) { ++ throw Standard_Failure("Failed to find edge."); ++ } + } + + //======================================================================= +@@ -332,6 +335,7 @@ + Handle (Geom_Curve) c1,c2; + if (sharpicmoins) { + c1=BRep_Tool::Curve(Eviveicmoins,up1,up2); ++ if (c1.IsNull()) throw Standard_Failure("Failed to create curve."); + } + else { + if (jficmoins==1) +@@ -341,6 +345,7 @@ + } + if (sharpicplus){ + c2=BRep_Tool::Curve(Eviveicplus,up1,up2); ++ if (c2.IsNull()) throw Standard_Failure("Failed to create curve."); + } + else { + jfp=3-jficplus; +@@ -414,8 +419,10 @@ + } + Eproj.Append(E1); + proj1=BRep_Tool::CurveOnSurface(E1,F,up1,up2); ++ if (proj1.IsNull()) throw Standard_Failure("Failed to create curve."); + proj2d.Append(new Geom2d_TrimmedCurve(proj1,up1,up2)); + proj1c=BRep_Tool::Curve(E1,up1,up2); ++ if (proj1c.IsNull()) throw Standard_Failure("Failed to create curve."); + cproj.Append(new Geom_TrimmedCurve(proj1c,up1,up2)); + if (error>BRep_Tool::Tolerance(E1)) error=BRep_Tool::Tolerance(E1); + } +@@ -2459,15 +2466,20 @@ + Pf=BRep_Tool::Pnt(Vf); + Pl=BRep_Tool::Pnt(Vl); + para=parcom.Value(nb); +- Pcom=BRep_Tool::Curve(TopoDS::Edge(Ecom.Value(nb)),up1,up2)->Value(para); ++ Handle(Geom_Curve) result = BRep_Tool::Curve(TopoDS::Edge(Ecom.Value(nb)),up1,up2); ++ if (result.IsNull()) throw Standard_Failure("Failed to create curve."); ++ Pcom=result->Value(para); ++ + if (Pf.Distance(BRep_Tool::Pnt(V1))< Pl.Distance(BRep_Tool::Pnt(V1))) + orvt=TopAbs_FORWARD; + if (!Eproj.Value(nb).IsNull()) { + n3d++; + proj=BRep_Tool::CurveOnSurface(TopoDS::Edge(Eproj.Value(nb)), + TopoDS::Face(Fproj.Value(nb)),up1,up2); ++ if (proj.IsNull()) throw Standard_Failure("Failed to create curve."); + proj2d=new Geom2d_TrimmedCurve(proj,up1,up2); + projc=BRep_Tool::Curve(TopoDS::Edge(Eproj.Value(nb)),up1,up2); ++ if (projc.IsNull()) throw Standard_Failure("Failed to create curve."); + cproj=new Geom_TrimmedCurve(projc,up1,up2); + pardeb=cproj->FirstParameter(); + parfin=cproj->LastParameter(); diff -Nru opencascade-7.4.1+dfsg1/debian/patches/dox-cmake-cleanup.diff opencascade-7.5.1+dfsg1/debian/patches/dox-cmake-cleanup.diff --- opencascade-7.4.1+dfsg1/debian/patches/dox-cmake-cleanup.diff 2020-04-25 18:50:15.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/dox-cmake-cleanup.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -Description: This patch removes build refs to Files-Excluded in d/copyright -Author: Kurt Kremitzki -Last-Update: 2018-03-26 - -Index: opencascade-7.2.0/dox/FILES_HTML.txt -=================================================================== ---- opencascade-7.2.0.orig/dox/FILES_HTML.txt -+++ opencascade-7.2.0/dox/FILES_HTML.txt -@@ -7,13 +7,11 @@ - - overview/overview.md - --../samples/mfc/standard/ReadMe.md - ../samples/CSharp/ReadMe.md - ../samples/CSharp/ReadMe_D3D.md - - ../samples/qt/AndroidQt/ReadMe.md - ../samples/java/jniviewer/ReadMe.md --../samples/ios/UIKitSample/ReadMe.md - - tutorial/tutorial.md - diff -Nru opencascade-7.4.1+dfsg1/debian/patches/dox-cmake-cleanup.patch opencascade-7.5.1+dfsg1/debian/patches/dox-cmake-cleanup.patch --- opencascade-7.4.1+dfsg1/debian/patches/dox-cmake-cleanup.patch 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/dox-cmake-cleanup.patch 2021-02-01 03:05:25.000000000 +0000 @@ -0,0 +1,20 @@ +Description: This patch removes build refs to Files-Excluded in d/copyright +Author: Kurt Kremitzki +Last-Update: 2020-11-23 + +--- a/dox/FILES_HTML.txt ++++ b/dox/FILES_HTML.txt +@@ -8,13 +8,11 @@ + introduction/introduction.md + + samples/samples.md +-../samples/mfc/standard/ReadMe.md + ../samples/CSharp/ReadMe.md + ../samples/CSharp/ReadMe_D3D.md + ../samples/qt/AndroidQt/ReadMe.md + ../samples/qt/OCCTOverview/ReadMe.md + ../samples/java/jniviewer/ReadMe.md +-../samples/ios/UIKitSample/ReadMe.md + ../samples/webgl/ReadMe.md + samples/ocaf.md + samples/ocaf_func.md diff -Nru opencascade-7.4.1+dfsg1/debian/patches/fix-install-dir-references.diff opencascade-7.5.1+dfsg1/debian/patches/fix-install-dir-references.diff --- opencascade-7.4.1+dfsg1/debian/patches/fix-install-dir-references.diff 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/fix-install-dir-references.diff 2021-02-01 03:05:25.000000000 +0000 @@ -6,7 +6,7 @@ --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -1122,7 +1122,7 @@ +@@ -1156,7 +1156,7 @@ endforeach() # install OpenCASCADE config file with compile definitions and C/C++ flags ONLY for current configuration install (CODE "string (TOLOWER \"\${CMAKE_INSTALL_CONFIG_NAME}\" CMAKE_INSTALL_CONFIG_NAME_LOWER)") @@ -17,7 +17,7 @@ if (BUILD_MODULE_${OCCT_MODULE}) --- a/adm/cmake/occt_macros.cmake +++ b/adm/cmake/occt_macros.cmake -@@ -598,7 +598,7 @@ +@@ -592,7 +592,7 @@ "cmake_policy(PUSH) cmake_policy(SET CMP0007 NEW) string (TOLOWER \"\${CMAKE_INSTALL_CONFIG_NAME}\" CMAKE_INSTALL_CONFIG_NAME_LOWERCASE) diff -Nru opencascade-7.4.1+dfsg1/debian/patches/remove-cloudflare-mathjax.diff opencascade-7.5.1+dfsg1/debian/patches/remove-cloudflare-mathjax.diff --- opencascade-7.4.1+dfsg1/debian/patches/remove-cloudflare-mathjax.diff 2020-04-25 18:50:15.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/remove-cloudflare-mathjax.diff 2021-02-07 12:08:52.000000000 +0000 @@ -2,11 +2,9 @@ Author: Kurt Kremitzki Last-Update: 2018-03-06 -Index: opencascade-7.2.0/dox/CMakeLists.txt -=================================================================== ---- opencascade-7.2.0.orig/dox/CMakeLists.txt -+++ opencascade-7.2.0/dox/CMakeLists.txt -@@ -35,7 +35,7 @@ endif() +--- a/dox/CMakeLists.txt ++++ b/dox/CMakeLists.txt +@@ -35,7 +35,7 @@ # configuration file for doxygen set (OCCT_CONFIG_FOR_DOXYGEN "${OCCT_GENERATED_DOC_DIR}/occt.cfg") diff -Nru opencascade-7.4.1+dfsg1/debian/patches/series opencascade-7.5.1+dfsg1/debian/patches/series --- opencascade-7.4.1+dfsg1/debian/patches/series 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/patches/series 2021-02-07 12:08:52.000000000 +0000 @@ -1,5 +1,13 @@ +dox-cmake-cleanup.patch fix-install-dir-references.diff remove-cloudflare-mathjax.diff -dox-cmake-cleanup.diff armel-ftbfs.patch do-not-use-doxygen-searchengine.patch +0001-cmake-Don-t-try-to-write-to-install-directory.-You-k.patch +0002-GeomPlate_BuildAveragePlane-BasePlan-Don-t-set-yvect.patch +0003-BRepFill_Filling-WireFromList-We-can-t-assume-that-a.patch +0004-BRepFill_Filling-Curve-constraints-confused-by-impli.patch +0005-BRepFill_Filling-Don-t-even-attempt-to-build-with-em.patch +0006-BRepOffset_Tool-TryProject-Check-return-of-BRepLib-B.patch +0007-ChFi3d_Builder-PerformIntersectionAtEnd-Check-max-nu.patch +0008-Add-error-checking-to-chamfer-and-fillet-code.patch diff -Nru opencascade-7.4.1+dfsg1/debian/rules opencascade-7.5.1+dfsg1/debian/rules --- opencascade-7.4.1+dfsg1/debian/rules 2020-04-25 18:50:48.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/rules 2021-02-07 23:57:53.000000000 +0000 @@ -17,8 +17,9 @@ -DFREETYPE_INCLUDE_DIR=/usr/include/freetype2 \ -DINSTALL_CMAKE_DATA_DIR:PATH=lib/$(DEB_HOST_MULTIARCH)/opencascade \ -DINSTALL_DIR_LIB:PATH=lib/$(DEB_HOST_MULTIARCH) \ - -DUSE_VTK:BOOL=off \ + -DUSE_RAPIDJSON:BOOL=on \ -DUSE_TBB:BOOL=on \ + -DUSE_VTK:BOOL=off \ -DUSE_FREEIMAGE:BOOL=on \ -DBUILD_RELEASE_DISABLE_EXCEPTIONS:BOOL=off \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ @@ -28,8 +29,8 @@ dh_installdocs dh_doxygen -override_dh_missing-arch: - dh_missing --fail-missing +override_dh_missing: + dh_missing --list-missing override_dh_shlibdeps: # Disable unnecessary warnings happening because of the way the packages diff -Nru opencascade-7.4.1+dfsg1/debian/source/lintian-overrides opencascade-7.5.1+dfsg1/debian/source/lintian-overrides --- opencascade-7.4.1+dfsg1/debian/source/lintian-overrides 2020-04-25 18:50:15.000000000 +0000 +++ opencascade-7.5.1+dfsg1/debian/source/lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -# Lintian thinks uploader Adam Powell's name violates policy -opencascade source: uploader-address-missing "Adam C. Powell -opencascade source: uploader-not-full-name IV" diff -Nru opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/building_3rdparty.md opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/building_3rdparty.md --- opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/building_3rdparty.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/building_3rdparty.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,633 @@ + Build 3rd-parties {#build_upgrade_building_3rdparty} +============================================== +@tableofcontents + +On Windows, the easiest way to install third-party libraries is to download archive with pre-built binaries from https://opencascade.com/content/3rd-party-components. +On Linux and OS X, it is recommended to use the version installed in the system natively. + +@section dev_guides__building_3rdparty_win_1 Windows + +This document presents guidelines for building third-party products used by Open CASCADE Technology (OCCT) and samples on Windows platform. It is assumed that you are already familiar with MS Visual Studio / Visual C++. + +You need to use the same version of MS Visual Studio for building all third-party products and OCCT itself, in order to receive a consistent set of run-time binaries. + +The links for downloading the third-party products are available at https://opencascade.com/content/3rd-party-components. + +There are two types of third-party products used by OCCT: + +* Mandatory products: + * Tcl/Tk 8.5 -- 8.6; + * FreeType 2.4.10 -- 2.5.3. +* Optional products: + * TBB 3.x -- 4.x; + * FreeImage 3.14.1 -- 3.16.0; + * VTK 6.1.0. + +It is recommended to create a separate new folder on your workstation, where you will unpack the downloaded archives of the third-party products, and where you will build these products (for example, *c:\\occ3rdparty*). + +Further in this document, this folder is referred to as *3rdparty*. + +@subsection dev_guides__building_3rdparty_win_2 Tcl/Tk + +Tcl/Tk is required for DRAW test harness. + +**Installation from sources: Tcl** + +Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. + +1. In the *win* sub-directory, edit file *buildall.vc.bat*: + + * Edit the line "call ... vcvars32.bat" to have correct path to the version of Visual Studio to be used for building, for instance: + + call "%VS80COMNTOOLS%\vsvars32.bat" + + If you are building 64-bit version, set environment accordingly, e.g.: + + call "%VS80COMNTOOLS%\..\..\VC\vcvarsall.bat" amd64 + + * Define variable *INSTALLDIR* pointing to directory where Tcl/Tk will be installed, e.g.: + + set INSTALLDIR=D:\OCCT\3rdparty\tcltk-86-32 + + * Add option *install* to the first command line calling *nmake*: + + nmake -nologo -f makefile.vc release htmlhelp install %1 + + * Remove second call to *nmake* (building statically linked executable) + +2. Edit file *rules.vc* replacing line + + SUFX = tsgx + + by + + SUFX = sgx + + This is to avoid extra prefix 't' in the library name, which is not recognized by default by OCCT build tools. + + +3. By default, Tcl uses dynamic version of run-time library (MSVCRT), which must be installed on the system where Tcl will be used. + You may wish to link Tcl library with static version of run-time to avoid this dependency. + For that: + + * Edit file *makefile.vc* replacing strings "crt = -MD" by "crt = -MT" + + * Edit source file *tclMain.c* (located in folder *generic*) commenting out forward declaration of function *isatty()*. + + +4. In the command prompt, run *buildall.vc.bat* + + You might need to run this script twice to have *tclsh* executable installed; check subfolder *bin* of specified installation path to verify this. + +5. For convenience of use, we recommend making a copy of *tclsh* executable created in subfolder *bin* of *INSTALLDIR* and named with Tcl version number suffix, as *tclsh.exe* (with no suffix) + + > cd D:\OCCT\3rdparty\tcltk-86-32\bin + > cp tclsh86.exe tclsh.exe + +**Installation from sources: Tk** + +Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. + +Apply the same steps as described for building Tcl above, with the same INSTALLDIR. +Note that Tk produces its own executable, called *wish*. + +You might need to edit default value of *TCLDIR* variable defined in *buildall.vc.bat* (should be not necessary if you unpack both Tcl and Tk sources in the same folder). + +@subsection dev_guides__building_3rdparty_win_2_2 FreeType + +FreeType is required for text display in a 3D viewer. You can download its sources from https://sourceforge.net/projects/freetype/files/ + +### The building procedure + +1. Unpack the downloaded archive of FreeType product into the *3rdparty* folder. As a result, you will get a folder named, for example, *3rdparty\\freetype-2.4.10*. Further in this document, this folder is referred to as *freetype*. + +2. Open the solution file *freetype\\builds\\win32\\vc20xx\\freetype.sln* in Visual Studio. Here *vc20xx* stands for your version of Visual Studio. + +3. Select the configuration to build: either Debug or Release. + +4. Build the *freetype* project. + + As a result, you will get a freetype import library (.lib) in the *freetype\\obj\\win32\\vc20xx* folder. + + +5. If you build FreeType for a 64 bit platform, select in the main menu **Build - Configuration Manager** and add *x64* platform to the solution configuration by copying the settings from Win32 platform: + + @figure{/build/build_3rdparty/images/3rdparty_image001.png} + + Update the value of the Output File for x64 configuration: + + @figure{/build/build_3rdparty/images/3rdparty_image003.png} + + Build the *freetype* project. + + As a result, you will obtain a 64 bit import library (.lib) file in the *freetype\\x64\\vc20xx* folder. + + To build FreeType as a dynamic library (.dll) follow steps 6, 7 and 8 of this procedure. + +6. Open menu Project-> Properties-> Configuration Properties-> General and change option **Configuration Type** to *Dynamic Library (.dll)*. +7. Edit file *freetype\\include\\freetype\\config\\ftoption.h*: + + in line 255, uncomment the definition of macro *FT_EXPORT* and change it as follows: + + #define FT_EXPORT(x) __declspec(dllexport) x + +8. Build the *freetype* project. + + As a result, you will obtain the files of the import library (.lib) and the dynamic library (.dll) in folders freetype \\objs\\release or \\objs\\debug . + + If you build for a 64 bit platform, follow step 5 of the procedure. + + To facilitate the use of FreeType libraries in OCCT with minimal adjustment of build procedures, it is recommended to copy the include files and libraries of FreeType into a separate folder, named according to the pattern: *freetype-compiler-bitness-building mode*, where: + * **compiler** is *vc8* or *vc9* or *vc10* or *vc11*; + * **bitness** is *32* or *64*; + * **building mode** is *opt* (for Release) or *deb* (for Debug). + + The *include* subfolder should be copied as is, while libraries should be renamed to *freetype.lib* and *freetype.dll* (suffixes removed) and placed to subdirectories *lib *and *bin*, respectively. If the Debug configuration is built, the Debug libraries should be put into subdirectories *libd* and *bind*. + + +@subsection dev_guides__building_3rdparty_win_3_1 TBB + +This third-party product is installed with binaries +from the archive that can be downloaded from https://github.com/intel/tbb. +Go to the **Download** page, find the release version you need (e.g. *tbb30_018oss*) and pick the archive for Windows platform. + +Unpack the downloaded archive of TBB product into the *3rdparty* folder. + +Further in this document, this folder is referred to as *tbb*. + +@subsection dev_guides__building_3rdparty_win_3_3 FreeImage + +This third-party product should be built as a dynamically loadable library (.dll file). +You can download its sources from +https://sourceforge.net/projects/freeimage/files/Source%20Distribution/ + +### The building procedure: + +1. Unpack the downloaded archive of FreeImage product into *3rdparty* folder. + + As a result, you should have a folder named *3rdparty\\FreeImage*. + + Rename it according to the rule: *freeimage-platform-compiler-building mode*, where + + * **platform** is *win32* or *win64*; + * **compiler** is *vc8* or *vc9* or *vc10* or *vc11*; + * **building mode** is *opt* (for release) or *deb* (for debug) + + Further in this document, this folder is referred to as *freeimage*. + +2. Open the solution file *freeimage\\FreeImage.*.sln* in your Visual Studio. + + If you use a Visual Studio version higher than VC++ 2008, apply conversion of the workspace. + Such conversion should be suggested automatically by Visual Studio. + +3. Select a configuration to build. + + - Choose **Release** if you are building Release binaries. + - Choose **Debug** if you are building Debug binaries. + + *Note:* + + If you want to build a debug version of FreeImage binaries then you need to rename the following files in FreeImage and FreeimagePlus projects: + + Project -> Properties -> Configuration Properties -> Linker -> General -> Output File + + FreeImage*d*.dll to FreeImage.dll + FreeImagePlus*d*.dll to FreeImagePlus.dll + + Project -> Properties -> Configuration Properties -> Linker -> Debugging-> Generate Program Database File + + FreeImage*d*.pdb to FreeImage.pdb + FreeImagePlus*d*.pdb to FreeImagePlus.pdb + + Project -> Properties -> Configuration Properties -> Linker -> Advanced-Import Library + + FreeImage*d*.lib to FreeImage.lib + FreeImagePlus*d*.lib to FreeImagePlus.lib + + Project -> Properties -> Configuration Properties -> Build Events -> Post -> Build Event -> Command Line + + FreeImage*d*.dll to FreeImage.dll + FreeImage*d*.lib to FreeImage.lib + FreeImagePlus*d*.dll to FreeImagePlus.dll + FreeImagePlus*d*.lib to FreeImagePlus.lib + + Additionally, rename in project FreeImagePlus + + Project -> Properties -> Configuration Properties -> Linker -> Input -> Additional Dependencies + + from FreeImage*d*.lib to FreeImage.lib + +4. Select a platform to build. + + - Choose *Win32* if you are building for a 32 bit platform. + - Choose *x64* if you are building for a 64 bit platform. + +5. Start the building process. + + As a result, you should have the library files of FreeImage product in *freeimage\\Dist* folder (*FreeImage.dll* and *FreeImage.lib*) and in *freeimage\\Wrapper\\FreeImagePlus\\dist* folder (*FreeImagePlus.dll* and *FreeImagePlus.lib*). + +@subsection dev_guides__building_3rdparty_win_3_4 VTK + +VTK is an open-source, freely available software system for 3D computer graphics, image processing and visualization. VTK Integration Services component provides adaptation functionality for visualization of OCCT topological shapes by means of VTK library. + +### The building procedure: + +1. Download the necessary archive from https://www.vtk.org/VTK/resources/software.html and unpack it into *3rdparty* folder. + + As a result, you will get a folder named, for example, 3rdparty\VTK-6.1.0. + + Further in this document, this folder is referred to as *VTK*. + +2. Use CMake to generate VS projects for building the library: + - Start CMake-GUI and select VTK folder as source path, and the folder of your choice for VS project and intermediate build data. + - Click **Configure**. + - Select the VS version to be used from the ones you have installed (we recommend using VS 2010) and the architecture (32 or 64-bit). + - Generate VS projects with default CMake options. The open solution *VTK.sln* will be generated in the build folder. + +3. Build project VTK in Release mode. + + +@section build_3rdparty_linux Linux + +This document presents additional guidelines for building third-party +products used by Open CASCADE Technology and samples on Linux platform. + +The links for downloading the third-party products are available on the web site at +https://opencascade.com/content/3rd-party-components. + +There are two types of third-party products, which are necessary to build OCCT: + +* Mandatory products: + * Tcl/Tk 8.5 - 8.6;   + * FreeType 2.4.10 - 2.5.3; +* Optional products: + * TBB 3.x - 4.x; + * FreeImage 3.14.1 - 3.16.0; + * VTK 6.1.0. + + +@subsection dev_guides__building_3rdparty_linux_2_1 Tcl/Tk + +Tcl/Tk is required for DRAW test harness. + +**Installation from sources: Tcl** + +Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. + +1. Enter the unix sub-directory of the directory where the Tcl source files are located (TCL_SRC_DIR). + + cd TCL_SRC_DIR/unix + +2. Run the *configure* command: + + configure --enable-gcc --enable-shared --enable-threads --prefix=TCL_INSTALL_DIR + + For a 64 bit platform also add --enable-64bit option to the command line. + +3. If the configure command has finished successfully, start the building process: + + make + +4. If building is finished successfully, start the installation of Tcl. + All binary and service files of the product will be copied to the directory defined by *TCL_INSTALL_DIR* + + make install + +**Installation from sources: Tk** + +Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. + +1. Enter the unix sub-directory of the directory where the Tk source files are located (TK_SRC_DIR) + + cd TK_SRC_DIR/unix + +2. Run the configure command, where TCL_LIB_DIR is *TCL_INSTALL_DIR/lib*. + + configure --enable-gcc --enable-shared --enable-threads --with-tcl=TCL_LIB_DIR --prefix=TK_INSTALL_DIR + + For a 64 bit platform also add --enable-64bit option to the command line. + +3. If the configure command has finished successfully, start the building process: + + make + +4. If the building has finished successfully, start the installation of Tk. + All binary and service files of the product will be copied + to the directory defined by *TK_INSTALL_DIR* (usually it is *TCL_INSTALL_DIR*) + + make install + +@subsection dev_guides__building_3rdparty_linux_2_2 FreeType + +FreeType is required for text display in the 3D viewer. +Download the necessary archive from https://sourceforge.net/projects/freetype/files/ and unpack it. + +1. Enter the directory where the source files of FreeType are located (FREETYPE_SRC_DIR). + + cd FREETYPE_SRC_DIR + +2. Run the *configure* command: + + configure --prefix=FREETYPE_INSTALL_DIR + + For a 64 bit platform also add CFLAGS='-m64 -fPIC' CPPFLAGS='-m64 -fPIC' option to the command line. + +3. If the *configure* command has finished successfully, start the building process: + + make + +4. If the building has finished successfully, start the installation of FreeType. + All binary and service files of the product will be copied to the directory defined by *FREETYPE_INSTALL_DIR* + + make install + + +@subsection dev_guides__building_3rdparty_linux_3_1 TBB + +This third-party product is installed with binaries from the archive that can be downloaded from https://github.com/intel/tbb. +Go to the **Download** page, find the release version you need and pick the archive for Linux platform. +To install, unpack the downloaded archive of TBB product. + +@subsection dev_guides__building_3rdparty_linux_3_3 FreeImage + +Download the necessary archive from https://sourceforge.net/projects/freeimage/files/Source%20Distribution/ +and unpack it. The directory with unpacked sources is further referred to as *FREEIMAGE_SRC_DIR*. + +1. Modify *FREEIMAGE_SRC_DIR/Source/OpenEXR/Imath/ImathMatrix.h*: + In line 60 insert the following: + + #include string.h + +2. Enter the directory where the source files of FreeImage are located (FREEIMAGE_SRC_DIR). + + cd FREEIMAGE_SRC_DIR + +3. Run the building process + + make + +4. Run the installation process + + a. If you have the permission to write into directories /usr/include and /usr/lib, run the following command: + + make install + b. If you do not have this permission, you need to modify file *FREEIMAGE_SRC_DIR/Makefile.gnu*: + + Change lines 7-9 from: + + DESTDIR ?= / + INCDIR ?= $(DESTDIR)/usr/include + INSTALLDIR ?= $(DESTDIR)/usr/lib + + to: + + DESTDIR ?= $(DESTDIR) + INCDIR ?= $(DESTDIR)/include + INSTALLDIR ?= $(DESTDIR)/lib + + Change lines 65-67 from: + + install -m 644 -o root -g root $(HEADER) $(INCDIR) + install -m 644 -o root -g root $(STATICLIB) $(INSTALLDIR) + install -m 755 -o root -g root $(SHAREDLIB) $(INSTALLDIR) + + to: + + install -m 755 $(HEADER) $(INCDIR) + install -m 755 $(STATICLIB) $(INSTALLDIR) + install -m 755 $(SHAREDLIB) $(INSTALLDIR) + + Change line 70 from:  + + ldconfig + + to: + + \#ldconfig + + Then run the installation process by the following command: + + make DESTDIR=FREEIMAGE_INSTALL_DIR install + +5. Clean temporary files + + make clean + +@subsection dev_guides__building_3rdparty_linux_3_4 VTK + +You can download VTK sources from https://www.vtk.org/VTK/resources/software.html + +### The building procedure: + +Download the necessary archive from https://www.vtk.org/VTK/resources/software.html and unpack it. + +1. Install or build *cmake* product from the source file. +2. Start *cmake* in GUI mode with the directory where the source files of *VTK* are located: + + ccmake VTK_SRC_DIR + + * Press [c] to make the initial configuration + * Define the necessary options in *VTK_INSTALL_PREFIX* + * Press [c] to make the final configuration + * Press [g] to generate Makefile and exit + +3. Start the building of VTK: + + make + +4. Start the installation of VTK. Binaries will be installed according to the *VTK_INSTALL_PREFIX* option. + + make install + +@subsection dev_guides__building_3rdparty_linux_4 Installation From Official Repositories + +**Debian-based distributives** + +All 3rd-party products required for building of OCCT could be installed +from official repositories. You may install them from console using apt-get utility: + + sudo apt-get install tcllib tklib tcl-dev tk-dev libfreetype-dev libxt-dev libxmu-dev libxi-dev libgl1-mesa-dev libglu1-mesa-dev libfreeimage-dev libtbb-dev + +To launch binaries built with WOK you need to install C shell and 32-bit libraries on x86_64 distributives: + + # you may need to add i386 if not done already by command "dpkg --add-architecture i386" + sudo apt-get install csh libstdc++6:i386 libxt6:i386 libxext6:i386 libxmu6:i386 + +Building is possible with C++ compliant compiler: + + sudo apt-get install g++ + +@section build_3rdparty_macos Mac OS X + +This document presents additional guidelines for building third-party products +used by Open CASCADE Technology and samples on Mac OS X platform (10.6.4 and later). + +The links for downloading the third-party products are available at https://opencascade.com/content/3rd-party-components. + +There are two types of third-party products, which are necessary to build OCCT: + +* Mandatory products: + * Tcl/Tk 8.5 - 8.6; + * FreeType 2.4.10 - 2.5.3. +* Optional products: + * TBB 3.x - 4.x; + * FreeImage 3.14.1 - 3.16.0 + + +@subsection dev_guides__building_3rdparty_osx_2_1 Tcl/Tk 8.5 + +Tcl/Tk is required for DRAW test harness. Version 8.5 or 8.6 can be used with OCCT. + +**Installation from sources: Tcl 8.5** + +Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. + +1. Enter the *macosx* sub-directory of the directory where the Tcl source files are located (TCL_SRC_DIR). + + cd TCL_SRC_DIR/macosx + +2. Run the *configure* command + + configure --enable-gcc --enable-shared --enable-threads --prefix=TCL_INSTALL_DIR + + For a 64 bit platform also add --enable-64bit option to the command line. + +3. If the *configure* command has finished successfully, start the building process + + make + +4. If building is finished successfully, start the installation of Tcl. + All binary and service files of the product will be copied to the directory defined by *TCL_INSTALL_DIR*. + + make install + +**Installation from sources: Tk 8.5** + +Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. + +1. Enter the *macosx* sub-directory of the directory where the source files of Tk are located (TK_SRC_DIR). + + cd TK_SRC_DIR/macosx + +2. Run the *configure* command, where TCL_LIB_DIR is TCL_INSTALL_DIR/lib + + configure --enable-gcc --enable-shared --enable-threads --with-tcl=TCL_LIB_DIR --prefix=TK_INSTALL_DIR + + For a 64 bit platform also add --enable-64bit option to the command line. + +3. If the *configure* command has finished successfully, start the building process: + + make + +4. If the building has finished successfully, start the installation of Tk. All binary and service files of the product will be copied to the directory defined by *TK_INSTALL_DIR* (usually it is TCL_INSTALL_DIR) + + make install + +@subsection dev_guides__building_3rdparty_osx_2_2 FreeType 2.4.10 + +FreeType is required for text display in the 3D viewer. + +Download the necessary archive from https://sourceforge.net/projects/freetype/files/ and unpack it. + +1. Enter the directory where the source files of FreeType are located (FREETYPE_SRC_DIR). + + cd FREETYPE_SRC_DIR + +2. Run the *configure* command + + configure --prefix=FREETYPE_INSTALL_DIR + + For a 64 bit platform also add CFLAGS='-m64 -fPIC' CPPFLAGS='-m64 -fPIC' option to the command line. + +3. If the *configure* command has finished successfully, start the building process + + make + +4. If building has finished successfully, start the installation of FreeType. + All binary and service files of the product will be copied to the directory defined by *FREETYPE_INSTALL_DIR*. + + make install + +@subsection dev_guides__building_3rdparty_osx_3_1 TBB 3.x or 4.x + +This third-party product is installed with binaries from the archive +that can be downloaded from https://github.com/intel/tbb. +Go to the **Download** page, find the release version you need (e.g. *tbb30_018oss*) +and pick the archive for Mac OS X platform. +To install, unpack the downloaded archive of TBB 3.0 product (*tbb30_018oss_osx.tgz*). + +@subsection dev_guides__building_3rdparty_osx_3_3 FreeImage 3.14.1 or 3.15.x + +Download the necessary archive from +https://sourceforge.net/projects/freeimage/files/Source%20Distribution/ +and unpack it. The directory with unpacked sources is further referred to as *FREEIMAGE_SRC_DIR*. + +Note that for building FreeImage on Mac OS X 10.7 you should replace *Makefile.osx* +in *FREEIMAGE_SRC_DIR* by the corrected file, which you can find in attachment to issue #22811 in OCCT Mantis bug tracker +(https://tracker.dev.opencascade.org/file_download.php?file_id=6937&type=bug). + +1. If you build FreeImage 3.15.x you can skip this step. + Modify FREEIMAGE_SRC_DIR/Source/OpenEXR/Imath/ImathMatrix.h: + + In line 60 insert the following: + + #include string.h + + Modify FREEIMAGE_SRC_DIR/Source/FreeImage/PluginTARGA.cpp: + + In line 320 replace: + + SwapShort(value); + + with: + + SwapShort(&value); + +2. Enter the directory where the source files of FreeImage are located (FREEIMAGE_SRC_DIR). + + cd FREEIMAGE_SRC_DIR + +3. Run the building process + + make + +4. Run the installation process + + 1. If you have the permission to write into /usr/local/include and /usr/local/lib directories, run the following command: + + make install + + 2. If you do not have this permission, you need to modify file *FREEIMAGE_SRC_DIR/Makefile.osx*: + + Change line 49 from:    + + PREFIX ?= /usr/local + + to: + + PREFIX ?= $(PREFIX) + +   Change lines 65-69 from: + + install -d -m 755 -o root -g wheel $(INCDIR) $(INSTALLDIR) + install -m 644 -o root -g wheel $(HEADER) $(INCDIR) + install -m 644 -o root -g wheel $(SHAREDLIB) $(STATICLIB) $(INSTALLDIR) + ranlib -sf $(INSTALLDIR)/$(STATICLIB) + ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(LIBNAME) + + to: + + install -d $(INCDIR) $(INSTALLDIR) + install -m 755 $(HEADER) $(INCDIR) + install -m 755 $(STATICLIB) $(INSTALLDIR) + install -m 755 $(SHAREDLIB) $(INSTALLDIR) + ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(VERLIBNAME) + ln -sf $(VERLIBNAME) $(INSTALLDIR)/$(LIBNAME) + + Then run the installation process by the following command: + + make PREFIX=FREEIMAGE_INSTALL_DIR install + +5. Clean temporary files + + make clean \ No newline at end of file Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image007.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/images/3rdparty_image007.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/images/genconf_linux.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/images/genconf_linux.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/images/genconf_osx.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/images/genconf_osx.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_3rdparty/images/genconf_windows.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_3rdparty/images/genconf_windows.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/build/build_documentation/building_documentation.md opencascade-7.5.1+dfsg1/dox/build/build_documentation/building_documentation.md --- opencascade-7.4.1+dfsg1/dox/build/build_documentation/building_documentation.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/build/build_documentation/building_documentation.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,19 @@ +Build Documentation {#build_upgrade__building_documentation} +================= + +To generate HTML documentation from sources contained in *dox* subdirectory, +you need to have Tcl and Doxygen 1.8.5 (or above) installed on your system. + +Use script **gendoc** (batch file on Windows, shell script on Linux / Mac OSX) to generate documentation. + +To generate Overview documentation: + + cmd> gendoc -overview + +To generate Reference manual: + + cmd> gendoc -refman + +Run this command without arguments to get help on supported options. + +See @ref occt_contribution__documentation for prerequisites and details on OCCT documentation system. diff -Nru opencascade-7.4.1+dfsg1/dox/build/build_occt/building_occt.md opencascade-7.5.1+dfsg1/dox/build/build_occt/building_occt.md --- opencascade-7.4.1+dfsg1/dox/build/build_occt/building_occt.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/build/build_occt/building_occt.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,582 @@ +Build OCCT {#build_upgrade__building_occt} +=================== + +@tableofcontents + +@note Before building OCCT, make sure to have all required third-party libraries installed. +The list of required libraries depends on what OCCT modules will be used, and your preferences. +The typical minimum is **Freetype** (necessary for Visualization) and **Tcl/Tk** (for DRAW). +See @ref intro_req "requirements on 3rdparty libraries" for a full list. +On OS X we recommend to use native libraries. + +@section build_occt_windows Windows + +@subsection build_occt_win_cmake Building with CMake tool + +This article describes the **CMake**-based build process, which is now suggested as a standard way to produce the binaries of Open CASCADE Technology from sources. *OCCT requires CMake version 2.8.12 or later*. + +@note Compared to the previous (6.x) releases of Open CASCADE Technology, OCCT 7.x has a complete set of CMake scripts and projects, so that there is no need to use WOK anymore. Moreover, CMake gives you a powerful configuration tool, which allows to control many aspects of OCCT deployment. At the same time this tool is quite intuitive, which is a significant advantage over the legacy WOK utilities. + +Here we describe the build procedure on the example of Windows platform with Visual Studio 2010. +However, CMake is cross-platform and can be used to build OCCT on Linux and OS X in essentially the same way. + +@note Before you start, make sure to have installed all 3-rd party products that you are going to use with OCCT; see @ref build_upgrade. + +@subsubsection build_cmake_start Start CMake + +CMake is a tool that generates the actual project files for the selected target build system (e.g. Unix makefiles) or IDE (e.g. Visual Studio 2010). + +For unexperienced users we recommend to start with *cmake-gui* -- a cross-platform GUI tool provided by CMake on Windows, Mac and Linux. +A command-line alternative, *ccmake* can also be used. + +CMake deals with three directories: source, build or binary and installation. + +* The source directory is where the sources of OCCT are located in your file system; +* The build or binary directory is where all files created during CMake configuration and generation process will be located. The mentioned process will be described below. +* The installation directory is where binaries will be installed after building the *INSTALL* project that is created by CMake generation process, along with header files and resources required for OCCT use in applications. + +The good practice is not to use the source directory as a build one. +Different configurations should be built in different build directories to avoid conflicts. +It is however possible to choose one installation directory for several configurations of OCCT (differentiated by platform, bitness, compiler and build type), for example: + + d:/occt/ -- the source directory + d:/tmp/occt-build-vc10-x64 -- the build directory with the generated + solution and other intermediate files created during a CMake tool working + d:/occt-install -- the installation directory that is + able to contain several OCCT configurations + +@subsubsection build_cmake_conf Configuration process + +If the command-line tool is used, run the tool from the build directory with a single argument indicating the source (relative or absolute path) directory: + + cd d:/tmp/occt-build-vc10-x64 + ccmake d:/occt + +@figure{/build/build_occt/images/cmake_image000.png} + +Press *c* to configure. + +All actions required in the configuration process with the GUI tool will be described below. + +If the GUI tool is used, run this tool without additional arguments and after that specify the source directory by clicking **Browse Source** and the build (binary) one by clicking **Browse Build**. + +@figure{/build/build_occt/images/cmake_image001.png} + +**Note**: Each configuration of the project should be built in its own directory. When building multiple configurations it is recommended to indicate in the name of build directories the system, bitness and compiler (e.g., d:/occt/build/win32-vc10 ). + +Once the source and build directories are selected, "Configure" button should be pressed in order to start manual configuration process. It begins with selection of a target configurator. It is "Visual Studio 10 2010 Win64" in our example. + +@figure{/build/build_occt/images/cmake_image002.png} + +To build OCCT for **Universal Windows Platform (UWP)** specify the path to toolchain file for cross-compiling d:/occt/adm/templates/uwp.toolchain.config.cmake. + +Alternatively, if you are using CMake from the command line add options -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 . + +**Note**: Universal Windows Platform (UWP) is supported only on "Visual Studio 14 2015". File d:/occt/samples/xaml/ReadMe.md describes the building procedure of XAML (UWP) sample. + +Once "Finish" button is pressed, the first pass of the configuration process is executed. At the end of the process, CMake outputs the list of environment variables, which have to be properly specified for successful configuration. + +@figure{/build/build_occt/images/cmake_image003.png} + +The error message provides some information about these variables. This message will appear after each pass of the process until all required variables are specified correctly. + +The change of the state of some variables can lead to the appearance of new variables. The new variables appeared after the pass of the configuration process are highlighted with red color by CMake GUI tool. + +Note: There is "grouped" option, which groups variables with a common prefix. + +The following table gives the full list of environment variables used at the configuration stage: + +| Variable | Type | Purpose | +|----------|------|---------| +| CMAKE_BUILD_TYPE | String | Specifies the build type on single-configuration generators (such as make). Possible values are Debug, Release and RelWithDebInfo | +| USE_FREEIMAGE | Boolean flag | Indicates whether FreeImage product should be used in OCCT visualization module for support of popular graphics image formats (PNG, BMP, etc.) | +| USE_RAPIDJSON | Boolean flag | Indicates whether RapidJSON product should be used in OCCT Data Exchange module for support of glTF mesh file format | +| USE_TBB | Boolean flag | Indicates whether TBB 3rd party is used or not. TBB stands for Threading Building Blocks, the technology of Intel Corp, which comes with different mechanisms and patterns for injecting parallelism into your application. OCCT remains parallel even without TBB product | +| USE_VTK | Boolean flag | Indicates whether VTK 3rd party is used or not. VTK stands for Visualization ToolKit, the technology of Kitware Inc intended for general-purpose scientific visualization. OCCT comes with a bridge between CAD data representation and VTK by means of its dedicated VIS component (VTK Integration Services). You may skip this 3rd party unless you are planning to use VTK visualization for OCCT geometry. See the official documentation @ref occt_user_guides__vis for the details on VIS | +| 3RDPARTY_DIR | Path | Defines the root directory where all required 3rd party products will be searched. Once you define this path it is very convenient to click "Configure" button in order to let CMake automatically detect all necessary products| +| 3RDPARTY_FREETYPE_* | Path | Path to Freetype binaries | +| 3RDPARTY_TCL_* 3RDPARTY_TK_* | Path | Path to Tcl/Tk binaries | +| 3RDPARTY_FREEIMAGE* | Path | Path to Freeimage binaries | +| 3RDPARTY_TBB* | Path | Path to TBB binaries | +| 3RDPARTY_VTK_* | Path | Path to VTK binaries | +| BUILD_MODULE_| Boolean flag | Indicates whether the corresponding OCCT module should be built or not. It should be noted that some toolkits of a module can be built even if this module is not checked (this happens if some other modules depend on these toolkits). The main modules and their descriptions can be found in @ref user_guides | +| BUILD_LIBRARY_TYPE | String | Specifies the type of library to be created. "Shared" libraries are linked dynamically and loaded at runtime. "Static" libraries are archives of object files used when linking other targets. Note that Draw Harness plugin system is incompatible with "Static" builds, and therefore it is disabled for these builds.| +| BUILD_ADDITIONAL_TOOLKITS | String | Semicolon-separated individual toolkits to include into build process. If you want to build some particular libraries (toolkits) only, then you may uncheck all modules in the corresponding *BUILD_MODUE_\* options and provide the list of necessary libraries here. Of course, all dependencies will be resolved automatically | +| BUILD_YACCLEX | Boolean flag | Enables Flex/Bison lexical analyzers. OCCT source files relating to STEP reader and ExprIntrp functionality are generated automatically with Flex/Bison. Checking this option leads to automatic search of Flex/Bison binaries and regeneration of the mentioned files | +| BUILD_SAMPLES_MFC | Boolean flag | Indicates whether MFC samples should be built together with OCCT. This option is only relevant to Windows platforms | +| BUILD_SAMPLES_QT | Boolean flag | Indicates whether QT samples should be built together with OCCT. | +| BUILD_Inspector | Boolean flag | Indicates whether Inspector should be built together with OCCT. | +| BUILD_DOC_Overview | Boolean flag | Indicates whether OCCT overview documentation project should be created together with OCCT. It is not built together with OCCT. Checking this option leads to automatic search of Doxygen binaries. Its building calls Doxygen command to generate the documentation in HTML format | +| BUILD_PATCH | Path | Points to the directory recognized as a "patch" for OCCT. If specified, the files from this directory take precedence over the corresponding native OCCT sources. This way you are able to introduce patches to Open CASCADE Technology not affecting the original source distribution | +| BUILD_WITH_DEBUG | Boolean flag | Enables extended messages of many OCCT algorithms, usually printed to cout. These include messages on internal errors and special cases encountered, timing, etc. | +| BUILD_ENABLE_FPE_SIGNAL_HANDLER | Boolean flag | Enable/Disable the floating point exceptions (FPE) during DRAW execution only. Corresponding environment variable (CSF_FPE) can be changed manually in custom.bat/sh scripts without regeneration by CMake. | +| CMAKE_CONFIGURATION_TYPES | String | Semicolon-separated CMake configurations | +| INSTALL_DIR | Path | Points to the installation directory. *INSTALL_DIR* is a synonym of *CMAKE_INSTALL_PREFIX*. The user can specify both *INSTALL_DIR* or *CMAKE_INSTALL_PREFIX* | +| INSTALL_DIR_BIN | Path | Relative path to the binaries installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_BIN}) | +| INSTALL_DIR_SCRIPT | Path | Relative path to the scripts installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_SCRIPT}) | +| INSTALL_DIR_LIB | Path | Relative path to the libraries installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_LIB}) | +| INSTALL_DIR_INCLUDE | Path | Relative path to the includes installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_INCLUDE}) | +| INSTALL_DIR_RESOURCE | Path | Relative path to the resources installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_RESOURCE}) | +| INSTALL_DIR_LAYOUT | String | Defines the structure of OCCT files (binaries, resources, headers, etc.) for the install directory. Two variants are predefined: for Windows (standard OCCT layout) and for Unix operating systems (standard Linux layout). If needed, the layout can be customized with INSTALL_DIR_* variables | +| INSTALL_DIR_DATA | Path | Relative path to the data files installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_DATA}) | +| INSTALL_DIR_SAMPLES | Path | Relative path to the samples installation directory. Note that only "samples/tcl" folder will be installed. (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_SAMPLES}) | +| INSTALL_DIR_TESTS | Path | Relative path to the tests installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_TESTS}) | +| INSTALL_DIR_DOC | Path | Relative path to the documentation installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_DOC}) | +| INSTALL_FREETYPE | Boolean flag | Indicates whether Freetype binaries should be installed into the installation directory | +| INSTALL_FREEIMAGE* | Boolean flag | Indicates whether Freeimage binaries should be installed into the installation directory | +| INSTALL_TBB | Boolean flag | Indicates whether TBB binaries should be installed into the installation directory | +| INSTALL_VTK | Boolean flag | Indicates whether VTK binaries should be installed into the installation directory | +| INSTALL_TCL | Boolean flag | Indicates whether TCL binaries should be installed into the installation directory | +| INSTALL_TEST_CASES | Boolean flag | Indicates whether non-regression OCCT test scripts should be installed into the installation directory | +| INSTALL_DOC_Overview | Boolean flag | Indicates whether OCCT overview documentation should be installed into the installation directory | + +**Note:** Only the forward slashes ("/") are acceptable in the CMake options defining paths. + +@subsubsection build_cmake_3rdparty 3rd party search mechanism + +If *3RDPARTY_DIR* directory is defined, then required 3rd party binaries are sought in it, and default system folders are ignored. + +The procedure expects to find binary and header files of each 3rd party product in its own sub-directory: *bin*, *lib* and *include*. + +The results of the search (achieved on the next pass of the configuration process) are recorded in the corresponding variables: + +* *3RDPARTY_\_DIR* -- path to the 3rdparty directory (with directory name) (e.g. D:/3rdparty/tcltk-86-32) +* *3RDPARTY_\_LIBRARY_DIR* -- path to the directory containing a library (e.g. D:/3rdparty/tcltk-86-32/lib). +* *3RDPARTY_\_INCLUDE_DIR* -- path to the directory containing a header file (e.g., D:/3rdparty/tcltk-86-32/include) +* *3RDPARTY_\_DLL_DIR* -- path to the directory containing a shared library (e.g., D:/3rdparty/tcltk-86-32/bin) This variable is only relevant to Windows platforms. + +Note: each library and include directory should be children of the product directory if the last one is defined. + +The search process is as follows: + +1. Common path: *3RDPARTY_DIR* +2. Path to a particular 3rd-party library: *3RDPARTY_\_DIR* +3. Paths to headers and binaries: + 1. *3RDPARTY_\_INCLUDE_DIR* + 2. *3RDPARTY_\_LIBRARY_DIR* + 3. *3RDPARTY_\_DLL_DIR* + +If a variable of any level is not defined (empty or \-NOTFOUND ) and the upper level variable is defined, the content of the non-defined variable will be sought at the next configuration step. If the search process at level 3 does not find the required files, it seeks in default places. + +If a search result (include path, or library path, or dll path) does not meet your expectations, you can change *3RDPARTY_\_*_DIR variable*, clear (if they are not empty) *3RDPARTY_\_DLL_DIR, 3RDPARTY_\_INCLUDE_DIR* and 3RDPARTY_\_LIBRARY_DIR variables (or clear one of them) and run the configuration process again. + +At this time the search will be performed in the newly identified directory +and the result will be recorded to corresponding variables (replace old value if it is necessary). + +For example, *3RDPARTY_FREETYPE_DIR* variable + + d:/3rdparty/freetype-2.4.10 + +can be changed to + + d:/3rdparty/freetype-2.5.3 + +During the configuration process the related variables (*3RDPARTY_FREETYPE_DLL_DIR*, *3RDPARTY_FREETYPE_INCLUDE_DIR* and *3RDPARTY_FREETYPE_LIBRARY_DIR*) will be filled with new found values. + +**Note**: The names of searched libraries and header files are hard-coded. If there is the need to change their names, change appropriate cmake variables (edit CMakeCache.txt file or edit in cmake-gui in advance mode) without reconfiguration: *3RDPARTY_\_INCLUDE* for include, *3RDPARTY_\_LIB* for library and *3RDPARTY_\_DLL* for shared library. + +@subsubsection build_cmake_gen Projects generation + +Once the configuration process is done, the "Generate" button is used to prepare project files for the target IDE. In our exercise the Visual Studio solution will be automatically created in the buid directory. + +@subsubsection build_cmake_build Building + +Go to the build folder, start the Visual Studio solution *OCCT.sln* and build it by clicking **Build -> Build Solution**. + +@figure{/build/build_occt/images/cmake_image004.png} + +By default the build solution process skips the building of the INSTALL and Overview project. + +When the building process is finished build: +* Overview project to generate OCCT overview documentation (if BUILD_DOC_Overview variable is checked) +* the *INSTALL* project to run **the installation process** + +For this, right-click on the *Overview/INSTALL* project and select **Project Only -> Build Only** -> *Overview/INSTALL* in the solution explorer. + +@subsubsection build_cmake_install Installation + +Installation is a process of extracting redistributable resources (binaries, include files etc) from the build directory into the installation one. The installation directory will be free of project files, intermediate object files and any other information related to the build routines. + +Normally you use the installation directory of OCCT to link against your specific application. + +The directory structure is as follows: + + data -- data files for OCCT (brep, iges, stp) + doc -- OCCT overview documentation in HTML format + inc -- header files + samples -- samples + src -- all required source files for OCCT + tests -- OCCT test suite + win32\vc10\bind -- binary files (installed 3rdparties and occt) + \libd -- libraries (installed 3rdparties and occt) + +**Note:** The above example is given for debug configuration. However, it is generally safe to use the same installation directory for the release build. In the latter case the contents of install directory will be enriched with subdirectories and files related to the release configuration. In particular, the binaries directory win64 will be expanded as +follows: + + \win32\vc10\bind + \libd + \bin + \lib + +If CMake installation flags are enabled for the 3rd party products (e.g. INSTALL_FREETYPE), then the corresponding binaries will be copied to the same bin(d) and lib(d) directories together with the native binaries of OCCT. Such organization of libraries can be especially helpful if your OCCT-based software does not use itself the 3rd parties of Open CASCADE Technology (thus, there is no sense to pack them into dedicated directories). + +The installation folder contains the scripts to run *DRAWEXE* (*draw.bat* or *draw.sh*), samples (if they were installed) and overview.html (short-cut for installed OCCT overview documentation). + +@subsection build_occt_win_codeblocks Building with Code::Blocks + +This file describes steps to build OCCT libraries from sources using **Code::Blocks**, a cross-platform IDE, using project files generated by OCCT legacy tool **genproj**. +It can be used as an alternative to CMake build system (see @ref build_occt_win_cmake) for all supported platforms. + +@subsubsection build_codeblocks_3rdparty Third-party libraries + +Before building OCCT, make sure to have all the needed third-party libraries installed, see @ref build_upgrade. + +@subsubsection build_codeblocks_conf Configuration + +Before building it is necessary to set up build environment. + +The environment is defined in the file *custom.sh* (on Linux and OS X) or *custom.bat* (on Windows) which can be edited directly: + +* Add paths to includes of used third-party libraries in variable *CSF_OPT_INC*. +* Add paths to their binary libraries in variable *CSF_OPT_LIB64*. +* Set variable *SHORTCUT_HEADERS* to specify a method for population of folder *inc* by header files. Supported methods are: + * *Copy* - headers will be copied from *src*; + * *ShortCut* - short-cut header files will be created, redirecting to same-named header located in *src*; + * "HardLink* - hard links to headers located in *src* will be created. +* For optional third-party libraries, set corresponding environment variable HAVE_ to either *false*, e.g.: +~~~~~ + export HAVE_FREEIMAGE=false +~~~~~ + +Alternatively, or when *custom.sh* or *custom.bat* does not exist, you can launch **genconf** tool to configure environment interactively: + +@figure{/build/build_occt/images/genconf_linux.png} + +Click "Save" to store the specified configuration in *custom.sh* or *custom.bat* file. + +@subsubsection build_codeblocks_gen Projects generation + +Launch **genproj** tool with option *cbp* to update content of *inc* folder and generate project files after changes in OCCT code affecting layout or composition of source files: + +~~~~~ + $ cd /dev/OCCT/opencascade-7.0.0 + $ ./genproj cbp +~~~~~ + +The generated Code::Blocks project are placed into subfolder *adm/<OS>/cbp*. + +@note To use **genproj** and **genconf** tools you need to have Tcl installed and accessible by PATH. + +@subsubsection build_codeblocks_build Building + +To start **Code::Blocks**, launch script *codeblocks.sh*. + +To build all toolkits, click **Build->Build workspace** in the menu bar. + +To start *DRAWEXE*, which has been built with **Code::Blocks** on Mac OS X, run the script +~~~~~ + ./draw.sh cbp [d] +~~~~~ +Option *d* is used if OCCT has been built in **Debug** mode. + +@subsection build_occt_genproj Building with Genproj tool + +This page describes steps to build OCCT libraries from a complete source archive on Windows with MS Visual C++ using projects generated by **genproj** tool. +It is an alternative to use of CMake build system (see @ref build_occt_win_cmake). + +**genproj** is a legacy tool (originated from command "wgenproj" in WOK) for generation of Visual Studio, Code.Blocks, and XCode project files used for building Open CASCADE Technology. +These project files are placed inside OCCT directory (in *adm* subfolder) and use relative paths, thus can be moved together with sources. + +The project files included in official distribution of OCCT are generated by this tool. +If you have official distribution with project files included, you can use them directly without a need to call **genproj**. + +@subsubsection build_msvc_3rdparty Third-party libraries + +Before building OCCT, make sure to have all the required third-party libraries installed. + +The easiest way to install third-party libraries is to download archive with pre-built binaries, corresponding to version of Visual Studio you are using, from https://opencascade.com/content/3rd-party-components. + +You can also build third-party libraries from their sources, see @ref build_upgrade_building_3rdparty for instructions. + +@subsubsection build_msvc_conf Configuration + +If you have Visual Studio projects already available (pre-installed or generated), you can edit file *custom.bat* manually to adjust the environment: + +* *VCVER* -- specification of format of project files, defining also version of Visual Studio to be used, and default name of the sub-folder for binaries: + +| VCVER | Visual Studio version | Windows Platform | Binaries folder name | +|-----------|-----------------------|----------------------------------|----------------------| +| vc10 | 2010 (10) | Desktop (Windows API) | vc10 | +| vc11 | 2012 (11) | Desktop (Windows API) | vc11 | +| vc12 | 2013 (12) | Desktop (Windows API) | vc12 | +| vc14 | 2015 (14) | Desktop (Windows API) | vc14 | +| vc14-uwp | 2015 (14) | UWP (Universal Windows Platform) | vc14-uwp | +| vc141 | 2017 (15) | Desktop (Windows API) | vc14 | +| vc141-uwp | 2017 (15) | UWP (Universal Windows Platform) | vc14-uwp | +| vc142 | 2019 (16) | Desktop (Windows API) | vc14 | +| vc142-uwp | 2019 (16) | UWP (Universal Windows Platform) | vc14-uwp | + +* *ARCH* -- architecture (32 or 64), affects only *PATH* variable for execution +* HAVE_* -- flags to enable or disable use of optional third-party products +* CSF_OPT_* -- paths to search for includes and binaries of all used third-party products +* *SHORTCUT_HEADERS* -- defines method for population of folder *inc* by header files. Supported methods are: + * *Copy* - headers will be copied from *src*; + * *ShortCut* - short-cut header files will be created, redirecting to same-named header located in *src*; + * "HardLink* - hard links to headers located in *src* will be created. + +Alternatively, you can launch **genconf**, a GUI tool allowing to configure build options interactively. +That tool will analyze your environment and propose you to choose available options: + +* Version of Visual Studio to be used (from the list of installed ones, detected by presence of environment variables like *VS100COMNTOOLS*). +* Method to populate folder *inc* (short-cuts by default). +* Location of third-party libraries (usually downloaded from OCCT web site, see above). +* Path to common directory where third-party libraries are located (optional). +* Paths to headers and binaries of the third-party libraries (found automatically basing on previous options; click button "Reset" to update). +* Generation of PDB files within Release build ("Release with Debug info", false by default). + +@figure{/build/build_occt/images/genconf_windows.png} + +Click "Save" to store the specified configuration in *custom.bat* file. + +@subsubsection build_msvc_generate Projects generation + +Launch **genproj** to update content of *inc* folder and generate project files after changes in OCCT code affecting layout or composition of source files. + +@note To use **genproj** and **genconf** tools you need to have Tcl installed and accessible by PATH. +If Tcl is not found, the tool may prompt you to enter the path to directory where Tcl can be found. + +~~~~~ + $ genproj.bat +~~~~~ + +Note that if *custom.bat* is not present, **genproj** will start **genconf** to configure environment. + +@subsubsection build_msvc_build Building + +Launch *msvc.bat* to start Visual Studio with all necessary environment variables defined, and build the whole solution or required toolkits. + +Note: the MSVC project files are located in folders adm\\msvc\\vc.... +Binaries are produced in *win32* or *win64* folders. + +To start DRAW, launch *draw.bat*. + +@section build_occt_linux Linux + +You may choose one of the following ways to generate, configure and build OCCT sources on Linux just keeping in mind +this platform specific: + +* @ref build_occt_win_cmake "Configuration, generation and building OCCT on Windows using CMake tool" +* @ref build_occt_code_blocks "Building on Mac OS X with Code::Blocks IDE" + +@section build_occt_crossplatform_cmake Android (cross-compiling) + +This article describes the steps to build OCCT libraries for Android from a complete source package +with GNU make (makefiles). The steps on Windows 7 and Ubuntu 15.10 are similar. There is the only one difference: + makefiles are built with mingw32-make +on Windows and native GNU make on Ubuntu. + +Required tools (download and install if it is required): + - CMake v3.0+ http://www.cmake.org/cmake/resources/software.html + - Cross-compilation toolchain for CMake https://github.com/taka-no-me/android-cmake + - Android NDK rev.10+ https://developer.android.com/tools/sdk/ndk/index.html + - GNU Make: MinGW v4.82+ for Windows (http://sourceforge.net/projects/mingw/files/), GNU Make 4.0 for Ubuntu. + +Run GUI tool provided by CMake. + +@subsection build_occt_crossplatform_cmake_config Configuration + +**Configure Tools** + - Specify the root folder of OCCT ($CASROOT, which contains *CMakelists.txt* file) by clicking **Browse Source**. + - Specify the location (build folder) for Cmake generated project files by clicking **Browse Build**. + +@figure{/build/build_occt/images/android_image001.png} + +Click **Configure** button. It opens the window with a drop-down list of generators supported by CMake project. + +Select "MinGW MakeFiles" item from the list + - Choose "Specify toolchain file for cross-compiling" + - Click "Next" +@figure{/build/build_occt/images/android_image002.png} + + - Specify a toolchain file at the next dialog by android.toolchain.cmake . It is contained by cross-compilation +toolchain for CMake + - Click "Finish" +@figure{/build/build_occt/images/android_image003.png} + +If ANDROID_NDK environment variable is not defined in current OS, add cache entry ANDROID_NDK (entry type is PATH) -- +path to the NDK folder ("Add Entry" button) +@figure{/build/build_occt/images/android_image004.png} + +If on Windows the message is appeared: "CMake Error: CMake was unable to find a build program corresponding +to "MinGW Makefiles" +CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.", +specify **CMAKE_MAKE_PROGRAM** to mingw32-make executable. +@figure{/build/build_occt/images/android_image005.png} + +**Configure OCCT** + +How to configure OCCT, see "OCCT Configuration" section of @ref build_occt_win_cmake +"Configure, Generate, Build using CMake tool" taking into account the specific configuration variables for android: + - ANDROID_ABI = armeabi-v7a + - ANDROID_NATIVE_API_LEVEL = 15 + - ANDROID_NDK_LAYOUT is equal to CMAKE_BUILD_TYPE variable + - **BUILD_MODULE_Draw = OFF** + +@figure{/build/build_occt/images/android_image006.png} + +@subsection build_occt_crossplatform_cmake_generation Generate Makefiles + +Click **Generate** button and wait until the generation process is finished. +Then makefiles will appear in the build folder (e.g. D:/tmp/occt-android ). + +@subsection build_occt_crossplatform_cmake_building Build Makefiles + +Open console and go to the build folder. Type "mingw32-make" (Windows) or "make" (Ubuntu) to start build process. + +> mingw32-make +or +> make + +Parallel building can be started with using **"-jN"** argument of "mingw32-make/make", where N is the number of + building threads. + +> mingw32-make -j4 +or +> make -j4 + +@subsection build_occt_crossplatform_cmake_install Install OCCT Libraries + +Type "mingw32-make/make" with argument "install" to place the libraries to the install folder + +> mingw32-make install +or +> make install + +@section build_occt_macos Mac OS X + +@subsection build_occt_macos_xcode Building with Xcode + +This file describes steps to build OCCT libraries from sources on Mac OS X with **Xcode** projects, generated by OCCT legacy tool **genproj**. + +

Configuration

+ +Before building it is necessary to set up build environment. + +The environment is defined in the file *custom.sh* which can be edited directly: + +* Add paths to includes of used third-party libraries in variable *CSF_OPT_INC* (use colon ":" as path separator). +* Add paths to their binary libraries in variable *CSF_OPT_LIB64*. +* Set variable *SHORTCUT_HEADERS* to specify a method for population of folder *inc* by header files. Supported methods are: + * *Copy* - headers will be copied from *src*; + * *ShortCut* - short-cut header files will be created, redirecting to same-named header located in *src*; + * "HardLink* - hard links to headers located in *src* will be created. +* For optional third-party libraries, set corresponding environment variable HAVE_ to either *false*, e.g.: +~~~~~ + export HAVE_GL2PS=false +~~~~~ + +Alternatively, or when *custom.sh* does not exist, you can launch *genconf.sh* to configure environment interactively: + +@figure{/build/build_occt/images/genconf_osx.png} + +Click "Save" to store the specified configuration in *custom.sh* file. + +

Projects generation

+ +Launch **genproj** tool to update content of *inc* folder and generate project files after changes in OCCT code affecting layout or composition of source files. + +@note To use **genproj** and **genconf** tools you need to have Tcl installed and accessible by PATH. + +For instance, in Terminal application: + +~~~~~ + $ cd /dev/OCCT/opencascade-7.0.0 + $ ./genproj +~~~~~ + +

Building

+ +To start **Xcode**, launch script *xcode.sh*. + +To build a certain toolkit, select it in **Scheme** drop-down list in Xcode toolbar, press **Product** in the menu and click **Build** button. + +To build the entire OCCT: +* Create a new empty project (select **File -> New -> Project -> Empty project** in the menu; input the project name, e.g. *OCCT*; then click **Next** and **Create**). +* Drag and drop the *OCCT* folder in the created *OCCT* project in the Project navigator. +* Select **File -> New -> Target -> Aggregate** in the menu. +* Enter the project name (e.g. *OCCT*) and click **Finish**. The **Build Phases** tab will open. +* Click "+" button to add the necessary toolkits to the target project. It is possible to select all toolkits by pressing **Command+A** combination. + +

Launching DRAW

+ +To start *DRAWEXE*, which has been built with Xcode on Mac OS X, perform the following steps: + +1.Open Terminal application + +2.Enter \: +~~~~~ + cd \ +~~~~~ + +3.Run the script +~~~~~ + ./draw_cbp.sh xcd [d] +~~~~~ + +Option *d* is used if OCCT has been built in **Debug** mode. + +@subsection build_occt_code_blocks Building with Code::Blocks + +This file describes steps to build OCCT libraries from sources using **Code::Blocks**, a cross-platform IDE, using +project files generated by OCCT legacy tool **genproj**. + +

Configure

+ +Before building it is necessary to set up build environment. + +The environment is defined in the file *custom.sh* (on Linux and OS X) or *custom.bat* (on Windows) which can be edited +directly: + +* Add paths to includes of used third-party libraries in variable *CSF_OPT_INC*. +* Add paths to their binary libraries in variable *CSF_OPT_LIB64*. +* Set variable *SHORTCUT_HEADERS* to specify a method for population of folder *inc* by header files. Supported methods are: + * *Copy* - headers will be copied from *src*; + * *ShortCut* - short-cut header files will be created, redirecting to same-named header located in *src*; + * "HardLink* - hard links to headers located in *src* will be created. +* For optional third-party libraries, set corresponding environment variable HAVE_ to either *false*, e.g.: +~~~~~ + export HAVE_GL2PS=false +~~~~~ + +Alternatively, or when *custom.sh* or *custom.bat* does not exist, you can launch **genconf** tool to configure + environment interactively: + +@figure{/build/build_occt/images/genconf_linux.png} + +Click "Save" to store the specified configuration in *custom.sh* or *custom.bat* file. + +

Generate Projects

+ +Launch **genproj** tool with option *cbp* to update content of *inc* folder and generate project files after changes in +OCCT code affecting layout or composition of source files: + +~~~~~ + $ cd /dev/OCCT/opencascade-7.0.0 + $ ./genproj cbp +~~~~~ + +The generated Code::Blocks project are placed into subfolder *adm/<OS>/cbp*. + +@note To use **genproj** and **genconf** tools you need to have Tcl installed and accessible by PATH. + +

Build

+ +To start **Code::Blocks**, launch script *codeblocks.sh*. + +To build all toolkits, click **Build->Build workspace** in the menu bar. + +To start *DRAWEXE*, which has been built with **Code::Blocks** on Mac OS X, run the script +~~~~~ + ./draw_cbp.sh cbp [d] +~~~~~ +Option *d* is used if OCCT has been built in **Debug** mode. \ No newline at end of file Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/android_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/android_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/android_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/android_image002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/android_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/android_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/android_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/android_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/android_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/android_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/android_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/android_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/cmake_image000.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/cmake_image000.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/cmake_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/cmake_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/cmake_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/cmake_image002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/cmake_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/cmake_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/cmake_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/cmake_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/genconf_linux.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/genconf_linux.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/genconf_osx.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/genconf_osx.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/build/build_occt/images/genconf_windows.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/build/build_occt/images/genconf_windows.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/build/build_upgrade.md opencascade-7.5.1+dfsg1/dox/build/build_upgrade.md --- opencascade-7.4.1+dfsg1/dox/build/build_upgrade.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/build/build_upgrade.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,10 @@ +Build, Debug and Upgrade {#build_upgrade} +================= + +This chapter contains the detailed infomation about building, debugging and upgrade procedures: + +* @subpage build_upgrade__building_occt +* @subpage build_upgrade_building_3rdparty +* @subpage build_upgrade__building_documentation +* @subpage occt__debug +* @subpage occt__upgrade diff -Nru opencascade-7.4.1+dfsg1/dox/contribution/coding_rules.md opencascade-7.5.1+dfsg1/dox/contribution/coding_rules.md --- opencascade-7.4.1+dfsg1/dox/contribution/coding_rules.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/contribution/coding_rules.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1152 @@ +Coding Rules {#occt_contribution__coding_rules} +====================================== + +@tableofcontents + +@section occt_coding_rules_1 Introduction + +The purpose of this document is to define a common programming style for Open CASCADE Technology. + +The common style facilitates understanding and maintaining a code developed cooperatively by several programmers. In addition, it enables construction of tools that incorporate knowledge of these standards to help in the programming. + +OCCT programming style follows common and appropriate best practices, so some guidelines have been excerpted from the public domain. + +The guide can be improved in the future as new ideas and enhancements are added. + +@subsection occt_coding_rules_1_1 Scope of the document + +Rules in this document refer to C++ code. However, with minor exceptions due to language restrictions, they are applicable to any sources in Open CASCADE Technology framework, including: +- C/C++ +- GLSL programs +- OpenCL kernels +- TCL scripts and test cases + +@section occt_coding_rules_2 Naming Conventions + +@subsection occt_coding_rules_2_1 General naming rules + +The names considered in this section mainly refer to the interface of Open CASCADE Technology libraries or source code itself. + +### International language [MANDATORY] + +Open CASCADE Technology is an open source platform available for an international community, thus all names need to be composed of English words or their abbreviations. + +### Meaningful names + +Names should be meaningful or, at least, contain a meaningful part. To better understand this requirement, let us examine the existing names of toolkits, packages, classes and methods: +- Packages containing words *Geom* or *Geom2d* in their names are related to geometrical data and operations. +- Packages containing words *TopoDS* or *BRep* in their names are related to topological data and operations. +- Packages ending with ...Test define Draw Harness plugins. +- Methods starting with *Get...* and *Set...* are usually responsible for correspondingly retrieving and storing data. + +### Related names + +Names related to a logically connected functionality should have the same prefix (start with the same letters) or, at least, have any other common part. +For example, method *GetCoord* returns a triple of real values and is defined for directions, vectors and points. The logical connection is obvious. + +### Camel Case style +Camel Case style is preferred for names. +For example: + +~~~~~{.cpp} +Standard_Integer awidthofbox; // this is bad +Standard_Integer width_of_box; // this is bad +Standard_Integer aWidthOfBox; // this is OK +~~~~~ + +@subsection occt_coding_rules_2_2 Names of development units + +Usually a unit (e.g. a package) is a set of classes, methods, enumerations or any other sources implementing a common functionality, which is self-contained and independent from other parts of the library. + +### No underscores in unit names [MANDATORY] + +Names of units should not contain underscores, unless the use of underscores is allowed explicitly. + +### File name extensions [MANDATORY] + +The following extensions should be used for source files, depending on their type: + +* .cxx -- C++ source files +* .hxx -- C++ header files +* .lxx -- additional headers containing definitions of inline methods and auxiliary code + +Note that .lxx files should be avoided in most cases - inline method should be placed in header file instead. + +### Prefix for toolkit names [MANDATORY] + +Toolkit names are prefixed by *TK*, followed by a meaningful part of the name explaining the domain of functionality covered by the toolkit (e.g. *TKOpenGl*). + +### Names of public types + +Names of public classes and other types (structures, enums, typedefs) should match the common pattern: name of the package followed by underscore and suffix (the own name of the type): + +~~~~~ + _ +~~~~~ + +Static methods related to the whole package are defined in the class with the same name as package (without suffix). + +Each type should be defined in its own header file with the name of the type and extension ".hxx". +Implementation should be placed in the file with the same name and extension ".cxx"; for large classes it is possible to split implementation into multiple source files with additional suffixes in the names (usually numerical, e.g. *BSplCLib_1.cxx*). + +For example, class *Adaptor2d_Curve2d* belongs to the package *Adaptor2d*; it is defined in header file *Adaptor2d_Curve2d.hxx* and implemented in source file *Adaptor2d_Curve2d.cxx*. + +This rule also applies to complex types constructed by instantiation of templates. +Such types should be given own names using *typedef* statement, located in same-named header file. + +For example, see definition in the file *TColStd_IndexedDataMapOfStringString.hxx*: +~~~~~ +typedef NCollection_IndexedDataMap TColStd_IndexedDataMapOfStringString; +~~~~~ + +### Names of functions + +The term **function** here is defined as: +- Any class method +- Any package method +- Any non-member procedure or function + +It is preferred to start names of public methods from an upper case character and to start names of protected and private methods from a lower case character. + + +~~~~~{.cpp} +class MyPackage_MyClass +{ + +public: + + Standard_Integer Value() const; + void SetValue (const Standard_Integer theValue); + +private: + + void setIntegerValue (const Standard_Integer theValue); + +}; +~~~~~ + +@subsection occt_coding_rules_2_3 Names of variables + +There are several rules that describe currently accepted practices for naming variables. + +### Naming of variables + +Name of a variable should not conflict with the existing or possible global names (for packages, macros, functions, global variables, etc.). + +The name of a variable should not start with an underscore. + +See the following examples: + +~~~~~{.cpp} +Standard_Integer Elapsed_Time = 0; // this is bad - possible class name +Standard_Integer gp = 0; // this is bad - existing package name +Standard_Integer aGp = 0; // this is OK +Standard_Integer _KERNEL = 0; // this is bad +Standard_Integer THE_KERNEL = 0; // this is OK +~~~~~ + +### Names of function parameters + +The name of a function (procedure, class method) parameter should start with prefix *the* followed by the meaningful part of the name starting with a capital letter. + +See the following examples: + +~~~~~{.cpp} +void Package_MyClass::MyFunction (const gp_Pnt& p); // this is bad +void Package_MyClass::MyFunction (const gp_Pnt& theP); // this is OK +void Package_MyClass::MyFunction (const gp_Pnt& thePoint); // this is preferred +~~~~~ + +### Names of class member variables + +The name of a class member variable should start with prefix *my* followed by the meaningful of the name starting with a capital letter. + +See the following examples: + +~~~~~{.cpp} +Standard_Integer counter; // This is bad +Standard_Integer myC; // This is OK +Standard_Integer myCounter; // This is preferred +~~~~~ + +### Names of global variables + +It is strongly recommended to avoid defining any global variables. +However, as soon as a global variable is necessary, its name should be prefixed by the name of a class or a package where it is defined followed with _my. + +See the following examples: + +~~~~~{.cpp} +Standard_Integer MyPackage_myGlobalVariable = 0; +Standard_Integer MyPackage_MyClass_myGlobalVariable = 0; +~~~~~ + +Static constants within the file should be written in upper-case and begin with prefix *THE_*: +~~~~~{.cpp} +namespace +{ + static const Standard_Real THE_CONSTANT_COEF = 3.14; +}; +~~~~~ + +### Names of local variables + +The name of a local variable should be distinguishable from the name of a function parameter, a class member variable and a global variable. + +It is preferred to prefix local variable names with *a* and *an* (or *is*, *to* and *has* for Boolean variables). + +See the following example: + +~~~~~{.cpp} +Standard_Integer theI; // this is bad +Standard_Integer i; // this is bad +Standard_Integer index; // this is bad +Standard_Integer anIndex; // this is OK +~~~~~ + +### Avoid dummy names +Avoid dummy names, such as i, j, k. Such names are meaningless and easy to mix up. + +The code becomes more and more complicated when such dummy names are used there multiple times with different meanings, or in cycles with different iteration ranges, etc. + +See the following examples for preferred style: + +~~~~~{.cpp} +void Average (const Standard_Real** theArray, + Standard_Integer theRowsNb, + Standard_Integer theRowLen, + Standard_Real& theResult) +{ + theResult = 0.0; + for (Standard_Integer aRow = 0; aRow < aRowsNb; ++aRow) + { + for (Standard_Integer aCol = 0; aCol < aRowLen; ++aCol) + { + theResult += theArray[aRow][aCol]; + } + theResult /= Standard_Real(aRowsNb * aRowLen); + } +} +~~~~~ + +@section occt_coding_rules_3 Formatting rules + +To improve the open source readability and, consequently, maintainability, the following set of rules is applied. + +### International language [MANDATORY] + +All comments in all sources must be in English. + +### Line length + +Try to stay within the limit of 120 characters per line in all sources. + +### C++ style comments + +Prefer C++ style comments in C++ sources. + +### Commenting out unused code + +Delete unused code instead of commenting it or using \#define. + +### Indentation in sources [MANDATORY] + +Indentation in all sources should be set to two space characters. +Use of tabulation characters for indentation is disallowed. + +### Separating spaces + +Punctuation rules follow the rules of the English language. +* C/C++ reserved words, commas, colons and semicolons should be followed by a space character if they are not at the end of a line. +* There should be no space characters after '(' and before ')'. Closing and opening brackets should be separated by a space character. +* For better readability it is also recommended to surround conventional operators by a space character. +Examples: + +~~~~~{.cpp} +while (true) // NOT: while( true ) ... +{ + DoSomething (theA, theB, theC, theD); // NOT: DoSomething(theA,theB,theC,theD); +} +for (anIter = 0; anIter < 10; ++anIter) // NOT: for (anIter=0;anIter<10;++anIter){ +{ + theA = (theB + theC) * theD; // NOT: theA=(theB+theC)*theD +} +~~~~~ + +### Declaration of pointers and references + +In declarations of simple pointers and references put asterisk (*) or ampersand (&) right after the type without extra space. + +Since declaration of several variables with mixed pointer types contrudicts this rule, it should be avoided. Instead, declare each variable independently with fully qualified type. + +Examples: + +~~~~~{.cpp} +Standard_Integer *theVariable; // not recommended +Standard_Integer * theVariable; // not recommended +Standard_Integer* theVariable; // this is OK + +Standard_Integer *&theVariable; // not recommended +Standard_Integer *& theVariable; // not recommended +Standard_Integer*& theVariable; // this is OK + +Standard_Integer **theVariable; // not recommended +Standard_Integer ** theVariable; // not recommended +Standard_Integer** theVariable; // this is OK + +Standard_Integer *theA, theB, **theC; // not recommended (declare each variable independently) +~~~~~ + +### Separate logical blocks + +Separate logical blocks of code with one blank line and comments. + +See the following example: + +~~~~~{.cpp} +// check arguments +Standard_Integer anArgsNb = argCount(); +if (anArgsNb < 3 || isSmthInvalid) +{ + return THE_ARG_INVALID; +} + +// read and check header +... +... + +// do our job +... +... +~~~~~ + +Notice that multiple blank lines should be avoided. + +### Separate function bodies [MANDATORY] + +Use function descriptive blocks to separate function bodies from each other. +Each descriptive block should contain at least a function name and purpose description. + +See the following example: + +~~~~~{.cpp} +// ======================================================================= +// function : TellMeSmthGood +// purpose : Gives me good news +// ======================================================================= +void TellMeSmthGood() +{ + ... +} + +// ======================================================================= +// function : TellMeSmthBad +// purpose : Gives me bad news +// ======================================================================= +void TellMeSmthBad() +{ + ... +} +~~~~~ + +### Block layout [MANDATORY] +Figure brackets { } and each operator (for, if, else, try, catch) should be written on a dedicated line. + +In general, the layout should be as follows: + +~~~~~{.cpp} +while (expression) +{ + ... +} +~~~~~ + +Entering a block increases and leaving a block decreases the indentation by one tabulation. + +### Single-line operators + +Single-line conditional operators (if, while, for, etc.) can be written without brackets on the following line. + +~~~~~{.cpp} +if (!myIsInit) return Standard_False; // bad + +if (thePtr == NULL) // OK + return Standard_False; + +if (!theAlgo.IsNull()) // preferred +{ + DoSomething(); +} +~~~~~ + +Having all code in the same line is less convenient for debugging. + +### Comparison expressions with constants + +In comparisons, put the variable (in the current context) on the left side and constant on the right side of expression. +That is, the so called "Yoda style" is to be avoided. + +~~~~~{.cpp} +if (NULL != thePointer) // Yoda style, not recommended +if (thePointer != NULL) // OK + +if (34 < anIter) // Yoda style, not recommended +if (anIter > 34) // OK + +if (theNbValues >= anIter) // bad style (constant function argument vs. local variable) +if (anIter <= theNbValues) // OK + +if (THE_LIMIT == theValue) // bad style (global constant vs. variable) +if (theValue == THE_LIMIT) // OK +~~~~~ + +### Alignment + +Use alignment wherever it enhances the readability. See the following example: + +~~~~~{.cpp} +MyPackage_MyClass anObject; +Standard_Real aMinimum = 0.0; +Standard_Integer aVal = theVal; +switch (aVal) +{ + case 0: computeSomething(); break; + case 12: computeSomethingElse (aMinimum); break; + case 3: + default: computeSomethingElseYet(); break; +} +~~~~~ + +### Indentation of comments + +Comments should be indented in the same way as the code to which they refer or they can be in the same line if they are short. + +The text of the comment should be separated from the slash character by a single space character. + +See the following example: + +~~~~~{.cpp} +while (expression) //bad comment +{ + // this is a long multi-line comment + // which is really required + DoSomething(); // maybe, enough + DoSomethingMore(); // again +} +~~~~~ + +### Early return statement + +Use an early return condition rather than collect indentations. + +Write like this: + +~~~~~{.cpp} +Standard_Integer ComputeSumm (const Standard_Integer* theArray, + const Standard_Size theSize) +{ + Standard_Integer aSumm = 0; + if (theArray == NULL || theSize == 0) + { + return 0; + } + + ... computing summ ... + return aSumm; +} +~~~~~ + +Rather than: + +~~~~~{.cpp} +Standard_Integer ComputeSumm (const Standard_Integer* theArray, + const Standard_Size theSize) +{ + Standard_Integer aSumm = 0; + if (theArray != NULL && theSize != 0) + { + ... computing summ ... + } + return aSumm; +} +~~~~~ + +This helps to improve readability and reduce the unnecessary indentation depth. + +### Trailing spaces + +Trailing spaces should be removed whenever possible. +Spaces at the end of a line are useless and do not affect functionality. + +### Headers order + +Split headers into groups: system headers, headers per each framework, project headers; sort the list of includes alphabetically. +Within the class source file, the class header file should be included first. + +This rule improves readability, allows detecting useless multiple header inclusions and makes 3rd-party dependencies clearly visible. +Inclusion of class header on top verifies consistency of the header (e.g. that header file does not use any undefined declarations due to missing includes of dependencies). + +An exception to the rule is ordering system headers generating a macros declaration conflicts (like "windows.h" or "X11/Xlib.h") - these headers should be placed in the way solving the conflict. + +The source or header file should include only minimal set of headers necessary for compilation, without duplicates (considering nested includes). + +~~~~~{.cpp} +// the header file of implemented class +#include + +// OCCT headers +#include +#include +#include + +// Qt headers +#include +#include + +// system headers +#include +#include +~~~~~ + +@section occt_coding_rules_4 Documentation rules + +The source code is one of the most important references for documentation. +The comments in the source code should be complete enough to allow understanding the corresponding code and to serve as basis for other documents. + +The main reasons why the comments are regarded as documentation and should be maintained are: +- The comments are easy to reach -- they are always together with the source code; +- It is easy to update a description in the comment when the source is modified; +- The source by itself is a good context to describe various details that would require much more explanations in a separate document; +- As a summary, this is the most cost-effective documentation. + +The comments should be compatible with Doxygen tool for automatic documentation generation (thus should use compatible tags). + +### Documenting classes [MANDATORY] + +Each class should be documented in its header file (.hxx). +The comment should give enough details for the reader to understand the purpose of the class and the main way of work with it. + +### Documenting class methods [MANDATORY] + +Each class or package method should be documented in the header file (.hxx). + +The comment should explain the purpose of the method, its parameters, and returned value(s). +Accepted style is: + +@verbatim +//! Method computes the square value. +//! @param theValue the input value +//! @return squared value +Standard_Export Standard_Real Square (Standard_Real theValue); +@endverbatim + +### Documenting C/C++ sources + +It is very desirable to put comments in the C/C++ sources of the package/class. + +They should be detailed enough to allow any person to understand what each part of code does. + +It is recommended to comment all static functions (like methods in headers), and to insert at least one comment per each 10-100 lines in the function body. + +There are also some rules that define how comments should be formatted, see @ref occt_coding_rules_3 "Formatting Rules". + +Following these rules is important for good comprehension of the comments. Moreover, this approach allows automatically generating user-oriented documentation directly from the commented sources. + +@section occt_coding_rules_5 Application design + +The following rules define the common style, which should be applied by any developer contributing to the open source. + +### Allow possible inheritance + +Try to design general classes (objects) keeping possible inheritance in mind. +This rule means that the user who makes possible extensions of your class should not encounter problems of private implementation. +Try to use protected members and virtual methods wherever you expect extensions in the future. + +### Avoid friend declarations + +Avoid using 'friend' classes or functions except for some specific cases (for example, iteration) 'Friend' declarations increase coupling. + +### Set/get methods + +Avoid providing set/get methods for all fields of the class. +Intensive set/get functions break down encapsulation. + +### Hiding virtual functions [MANDATORY] + +Avoid hiding a base class virtual function by a redefined function with a different signature. +Most of the compilers issue warning on this. + +### Avoid mixing error reporting strategies + +Try not to mix different error indication/handling strategies (exceptions or returned values) on the same application level. + +### Minimize compiler warnings [MANDATORY] + +When compiling the source pay attention to and try to minimize compiler warnings. + +### Avoid unnecessary inclusions + +Try to minimize compilation dependencies by removing unnecessary inclusions. + +@section occt_coding_rules_6 General C/C++ rules + +This section defines the rules for writing a portable and maintainable C/C++ source code. + +### Wrapping of global variables [MANDATORY] + +Use package or class methods returning reference to wrap global variables to reduce possible name space conflicts. + +### Avoid private members + +Use *protected* members instead of *private* wherever reasonable to enable future extensions. +Use *private* fields if future extensions should be disabled. + +### Constants and inlines over defines [MANDATORY] + +Use constant variables (const) and inline functions instead of defines (\#define). + +### Avoid explicit numerical values [MANDATORY] + +Avoid usage of explicit numeric values. Use named constants and enumerations instead. +Numbers produce difficulties for reading and maintenance. + +### Three mandatory methods + +If a class has a destructor, an assignment operator or a copy constructor, it usually needs the other two methods. + +### Virtual destructor + +A class with virtual function(s) ought to have a virtual destructor. + +### Overriding virtual methods + +Declaration of overriding method should contains specifiers "virtual" and "override" +(using Standard_OVERRIDE alias for compatibility with old compilers). + +~~~~~{.cpp} +class MyPackage_BaseClass +{ + +public: + + Standard_EXPORT virtual Standard_Boolean Perform(); + +}; + +class MyPackage_MyClass : public MyPackage_BaseClass +{ + +public: + + Standard_EXPORT virtual Standard_Boolean Perform() Standard_OVERRIDE; + +}; +~~~~~ + +This makes class definition more clear (virtual methods become highlighted). + +Declaration of interface using pure virtual functions protects against +incomplete inheritance at first level, but does not help when method is overridden multiple times within nested inheritance +or when method in base class is intended to be optional. + +And here "override" specifier introduces additional protection against situations when interface changes might be missed +(class might contain old methods which will be never called). + +### Default parameter value + +Do not redefine a default parameter value in an inherited function. + +### Use const modifier + +Use *const* modifier wherever possible (functions parameters, return values, etc.) + +### Usage of goto [MANDATORY] +Avoid *goto* statement unless it is really needed. + +### Declaring variable in for() header + +Declare a cycle variable in the header of the *for()* statement if not used out of cycle. + +~~~~~{.cpp} +Standard_Real aMinDist = Precision::Infinite(); +for (NCollection_Sequence::Iterator aPntIter (theSequence); + aPntIter.More(); aPntIter.Next()) +{ + aMinDist = Min (aMinDist, theOrigin.Distance (aPntIter.Value())); +} +~~~~~ + +### Condition statements within zero + +Avoid usage of C-style comparison for non-boolean variables: + +~~~~~{.cpp} +void Function (Standard_Integer theValue, + Standard_Real* thePointer) +{ + if (!theValue) // bad style - ambiguous logic + { + DoSome(); + } + + if (theValue == 0) // OK + { + DoSome(); + } + + if (thePointer != NULL) // OK, predefined NULL makes pointer comparison cleaner to reader + { // (nullptr should be used instead as soon as C++11 will be available) + DoSome2(); + } +} +~~~~~ + +@section occt_coding_rules_7 Portability issues + +This chapter contains rules that are critical for cross-platform portability. + +### Provide code portability [MANDATORY] + +The source code must be portable to all platforms listed in the official 'Technical Requirements'. +The term 'portable' here means 'able to be built from source'. + +The C++ source code should meet C++03 standard. +Any usage of compiler-specific features or further language versions (for example, C++11, until all major compilers on all supported platforms implement all its features) should be optional (used only with appropriate preprocessor checks) and non-exclusive (an alternative implementation compatible with other compilers should be provided). + +### Avoid usage of global variables [MANDATORY] + +Avoid usage of global variables. Usage of global variables may cause problems when accessed from another shared library. + +Use global (package or class) functions that return reference to static variable local to this function instead of global variables. + +Another possible problem is the order of initialization of global variables defined in various libraries that may differ depending on platform, compiler and environment. + +### Avoid explicit basic types + +Avoid explicit usage of basic types (*int*, *float*, *double*, etc.), use Open CASCADE Technology types from package *Standard: Standard_Integer, Standard_Real, Standard_ShortReal, Standard_Boolean, Standard_CString* and others or a specific *typedef* instead. + +### Use *sizeof()* to calculate sizes [MANDATORY] + +Do not assume sizes of types. Use *sizeof()* instead to calculate sizes. + +### Empty line at the end of file [MANDATORY] + +In accordance with C++03 standard source files should be trailed by an empty line. +It is recommended to follow this rule for any plain text files for consistency and for correct work of git difference tools. + +@section occt_coding_rules_8 Stability issues + +The rules listed in this chapter are important for stability of the programs that use Open CASCADE Technology libraries. + +### Use *OSD::SetSignal()* to catch exceptions + +When using Open CASCADE Technology in an application, call *OSD::SetSignal()* function when the application is initialized. + +This will install C handlers for run-time interrupt signals and exceptions, so that low-level exceptions (such as access violation, division by zero, etc.) will be redirected to C++ exceptions +that use *try {...} catch (Standard_Failure) {...}* blocks. + +The above rule is especially important for robustness of modeling algorithms. + +### Cross-referenced handles + +Take care about cycling of handled references to avoid chains, which will never be freed. For this purpose, use a pointer at one (subordinate) side. + +See the following example: + +~~~~{.cpp} + class Slave; + + class Master : public Standard_Transient + { + ... + void SetSlave (const Handle(Slave)& theSlave) + { + mySlave = theSlave; + } + ... + private: + Handle(Slave) theSlave; // smart pointer + ... + } + + class Slave : public Standard_Transient + { + ... + void SetMaster (const Handle(Master)& theMaster) + { + myMaster = theMaster.get(); + } + ... + private: + Master* theMaster; // simple pointer + ... + } +~~~~ + +### C++ memory allocation + +In C++ use *new* and *delete* operators instead of *malloc()* and *free()*. Try not to mix different memory allocation techniques. + +### Match *new* and *delete* [MANDATORY] + +Use the same form of new and delete. + +~~~~~{.cpp} +aPtr1 = new TypeA[n]; ... ; delete[] aPtr1; +aPtr2 = new TypeB(); ... ; delete aPtr2; +aPtr3 = Standard::Allocate (4096); ... ; Standard::Free (aPtr3); +~~~~~ + +### Methods managing dynamical allocation [MANDATORY] + +Define a destructor, a copy constructor and an assignment operator for classes with dynamically allocated memory. + +### Uninitialized variables [MANDATORY] + +Every variable should be initialized. + +~~~~~{.cpp} +Standard_Integer aTmpVar1; // bad +Standard_Integer aTmpVar2 = 0; // OK +~~~~~ + +Uninitialized variables might be kept only within performance-sensitive code blocks and only when their initialization is guaranteed by subsequent code. + +### Do not hide global *new* + +Avoid hiding the global *new* operator. + +### Assignment operator + +In *operator=()* assign to all data members and check for assignment to self. + +### Float comparison + +Don't check floats for equality or non-equality; check for GT, GE, LT or LE. + +~~~~~{.cpp} +if (Abs (theFloat1 - theFloat2) < theTolerance) +{ + DoSome(); +} +~~~~~ + +Package *Precision* provides standard values for SI units and widely adopted by existing modeling algorithms: + +- *Precision::Confusion()* for lengths in meters; +- *Precision::Angular()* for angles in radians. + +as well as definition of infinite values within normal range of double precision: +- *Precision::Infinite()* +- *Precision::IsInfinite()* +- *Precision::IsPositiveInfinite()* +- *Precision::IsNegativeInfinite()* + +### Non-indexed iteration + +Avoid usage of iteration over non-indexed collections of objects. +If such iteration is used, make sure that the result of the algorithm does not depend on the order of iterated items. + +Since the order of iteration is unpredictable in case of a non-indexed collection of objects, it frequently leads to different behavior of the application from one run to another, thus embarrassing the debugging process. + +It mostly concerns mapped objects for which pointers are involved in calculating the hash function. For example, the hash function of *TopoDS_Shape* involves the address of *TopoDS_TShape* object. Thus the order of the same shape in the *TopTools_MapOfShape* will vary in different sessions of the application. + +### Do not throw in destructors + +Do not throw from within a destructor. + +### Assigning to reference [MANDATORY] + +Avoid the assignment of a temporary object to a reference. This results in a different behavior for different compilers on different platforms. + +@section occt_coding_rules_9 Performance issues + +These rules define the ways of avoiding possible loss of performance caused by ineffective programming. + +### Class fields alignment + +Declare fields of a class in the decreasing order of their size for better alignment. +Generally, try to reduce misaligned accesses since they impact the performance (for example, on Intel machines). + +### Fields initialization order [MANDATORY] + +List class data members in the constructor's initialization list in the order they are declared. + +~~~~~{.cpp} +class MyPackage_MyClass +{ + +public: + + MyPackage_MyClass() + : myPropertyA (1), + myPropertyB (2) {} + +// NOT +// : myPropertyB (2), +// myPropertyA (1) {} + +private: + + Standard_Integer myPropertyA; + Standard_Integer myPropertyB; + +}; +~~~~~ + +### Initialization over assignment + +Prefer initialization over assignment in class constructors. + +~~~~~{.cpp} +MyPackage_MyClass() +: myPropertyA (1) // preferred +{ + myPropertyB = 2; // not recommended +} +~~~~~ + +### Optimize caching + +When programming procedures with extensive memory access, try to optimize them in terms of cache behavior. Here is an example of how the cache behavior can be impacted: + +On x86 this code + +~~~~~{.cpp} +Standard_Real anArray[4096][2]; +for (Standard_Integer anIter = 0; anIter < 4096; ++anIter) +{ + anArray[anIter][0] = anArray[anIter][1]; +} +~~~~~ + +is more efficient then + +~~~~~{.cpp} +Standard_Real anArray[2][4096]; +for (Standard_Integer anIter = 0; anIter < 4096; ++anIter) +{ + anArray[0][anIter] = anArray[1][anIter]; +} +~~~~~ + +since linear access does not invalidate cache too often. + +@section occt_coding_rules_10 Draw Harness command + +Draw Harness provides TCL interface for OCCT algorithms. + +There is no TCL wrapper over OCCT C++ classes, instead interface is provided through the set of TCL commands implemented in C++. + +There is a list of common rules which should be followed to implement well-formed Draw Harness command. + +### Return value + +Command should return 0 in most cases even if the executed algorithm has failed. Returning 1 would lead to a TCL exception, thus should be used in case of a command line syntax error and similar issues. + +### Validate input parameters + +Command arguments should be validated before usage. The user should see a human-readable error description instead of a runtime exception from the executed algorithm. + +### Validate the number of input parameters + +Command should warn the user about unknown arguments, including cases when extra parameters have been pushed for the command with a fixed number of arguments. + +~~~~~{.cpp} + if (theArgsNb != 3) + { + std::cout << "Syntax error - wrong number of arguments!\n"; + return 1; + } + + Standard_Integer anArgIter = 1; + Standard_CString aResName = theArgVec[anArgIter++]; + Standard_CString aFaceName = theArgVec[anArgIter++]; + TopoDS_Shape aFaceShape = DBRep::Get (aFaceName); + if (aFaceShape.IsNull() + || aFaceShape.ShapeType() != TopAbs_FACE) + { + std::cout << "Shape " << aFaceName << " is empty or not a Face!\n"; + return 1; + } + DBRep::Set (aResName, aFaceShape); + return 0; +~~~~~ + +### Message printing + +Informative messages should be printed into standard output *std::cout*, whilst command results (if any) -- into Draw Interpreter. + +Information printed into Draw Interpreter should be well-structured to allow usage in TCL script. + +### Long list of arguments + +Any command with a long list of obligatory parameters should be considered as ill-formed by design. +Optional parameters should start with flag name (with '-' prefix) and followed by its values: + +~~~~~{.tcl} +myCommand -flag1 value1 value2 -flag2 value3 +~~~~~ + +### Arguments parser + +- Integer values should be read using *Draw::Atoi()* function. +- Real values should be read using *Draw::Atof()* function. +- Flags names should be checked in case insensitive manner. + +Functions *Draw::Atof()* and *Draw::Atoi()* support expressions and read values in C-locale. + +~~~~~{.cpp} + Standard_Real aPosition[3] = {0.0, 0.0, 0.0}; + for (Standard_Integer anArgIter = 1; anArgIter < theArgsNb; ++anArgIter) + { + Standard_CString anArg = theArgVec[anArgIter]; + TCollection_AsciiString aFlag (anArg); + aFlag.LowerCase(); //!< for case insensitive comparison + if (aFlag == "position") + { + if ((anArgIt + 3) >= theArgsNb) + { + std::cerr << "Wrong syntax at argument '" << anArg << "'!\n"; + return 1; + } + aPosition[0] = Draw::Atof (theArgVec[++anArgIt]); + aPosition[1] = Draw::Atof (theArgVec[++anArgIt]); + aPosition[2] = Draw::Atof (theArgVec[++anArgIt]); + } + else + { + std::cout << "Syntax error! Unknown flag '" << anArg << "'\n"; + return 1; + } + } +~~~~~ + +@section occt_coding_rules_11 Examples + +### Sample documented class + +@verbatim +class Package_Class +{ + +public: //! @name public methods + + //! Method computes the square value. + //! @param theValue the input value + //! @return squared value + Standard_Export Standard_Real Square (const Standard_Real theValue); + +private: //! \@name private methods + + //! Auxiliary method + void increment(); + +private: //! \@name private fields + + Standard_Integer myCounter; //!< usage counter + +}; + + +@endverbatim + +~~~~~ +#include +// ========================================================== +// function : Square +// purpose : Method computes the square value +// ========================================================== +Standard_Real Package_Class::Square (const Standard_Real theValue) +{ + increment(); + return theValue * theValue; +} + +// ========================================================== +// function : increment +// purpose : +// ========================================================== +void Package_Class::increment() +{ + ++myCounter; +} +~~~~~ + +### TCL script for Draw Harness + +~~~~~{.tcl} +# show fragments (solids) in shading with different colors +proc DisplayColored {theShape} { + set aSolids [uplevel #0 explode $theShape so] + set aColorIter 0 + set THE_COLORS {red green blue1 magenta1 yellow cyan1 brown} + foreach aSolIter $aSolids { + uplevel #0 vdisplay $aSolIter + uplevel #0 vsetcolor $aSolIter [lindex $THE_COLORS [expr [incr aColorIter] % [llength $THE_COLORS]]] + uplevel #0 vsetdispmode $aSolIter 1 + uplevel #0 vsetmaterial $aSolIter plastic + uplevel #0 vsettransparency $aSolIter 0.5 + } +} + +# load modules +pload MODELING VISUALIZATION + +# create boxes +box bc 0 0 0 1 1 1 +box br 1 0 0 1 1 2 +compound bc br c + +# show fragments (solids) in shading with different colors +vinit View1 +vclear +vaxo +vzbufftrihedron +DisplayColored c +vfit +vdump $imagedir/${casename}.png 512 512 +~~~~~ + +### GLSL program: +~~~~~{.fs} +vec3 Ambient; //!< Ambient contribution of light sources +vec3 Diffuse; //!< Diffuse contribution of light sources +vec3 Specular; //!< Specular contribution of light sources + +//! Computes illumination from light sources +vec4 ComputeLighting (in vec3 theNormal, + in vec3 theView, + in vec4 thePoint) +{ + // clear the light intensity accumulators + Ambient = occLightAmbient.rgb; + Diffuse = vec3 (0.0); + Specular = vec3 (0.0); + vec3 aPoint = thePoint.xyz / thePoint.w; + for (int anIndex = 0; anIndex < occLightSourcesCount; ++anIndex) + { + int aType = occLight_Type (anIndex); + if (aType == OccLightType_Direct) + { + directionalLight (anIndex, theNormal, theView); + } + else if (aType == OccLightType_Point) + { + pointLight (anIndex, theNormal, theView, aPoint); + } + } + + return vec4 (Ambient, 1.0) * occFrontMaterial_Ambient() + + vec4 (Diffuse, 1.0) * occFrontMaterial_Diffuse() + + vec4 (Specular, 1.0) * occFrontMaterial_Specular(); +} + +//! Entry point to the Fragment Shader +void main() +{ + gl_FragColor = computeLighting (normalize (Normal), + normalize (View), + Position); +} +~~~~~ diff -Nru opencascade-7.4.1+dfsg1/dox/contribution/contribution.md opencascade-7.5.1+dfsg1/dox/contribution/contribution.md --- opencascade-7.4.1+dfsg1/dox/contribution/contribution.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/contribution/contribution.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,10 @@ +Contribution {#contribution} +============ + +This chapter contains the detailed infomation about contribution procedure: + +* @subpage occt_contribution__contribution_workflow +* @subpage occt_contribution__git_guide +* @subpage occt_contribution__coding_rules +* @subpage occt_contribution__tests +* @subpage occt_contribution__documentation diff -Nru opencascade-7.4.1+dfsg1/dox/contribution/contribution_workflow/contribution_workflow.md opencascade-7.5.1+dfsg1/dox/contribution/contribution_workflow/contribution_workflow.md --- opencascade-7.4.1+dfsg1/dox/contribution/contribution_workflow/contribution_workflow.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/contribution/contribution_workflow/contribution_workflow.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,464 @@ +Contribution Workflow {#occt_contribution__contribution_workflow} +==================================== +@tableofcontents + +@section occt_contribution_intro Introduction + +The purpose of this document is to describe standard workflow for processing contributions to certified version of OCCT. + +@subsection occt_contribution_intro_tracker Use of issue tracker system + +Each contribution should have corresponding issue (bug, or feature, or integration request) +registered in the MantisBT issue tracker system accessible by URL +https://tracker.dev.opencascade.org. +The issue is processed according to the described workflow. + +@subsection occt_contribution_intro_access Access levels + +Access level defines the permissions of the user to view, register and modify issues in the issue tracker. +The correspondence of access level and user permissions is defined in the table below. + +| Access level | Granted to | Permissions | Can set statuses | +|:------------- | :--------- | :-------------- | :----------------------- | +| Viewer | Everyone (anonymous access) | View public issues only | None | +| Updater | Users registered on dev.opencascade.org, in Open CASCADE project | View and comment issues | None | +| Reporter | Users registered on dev.opencascade.org, in Community project | View, report, and comment issues | New, Resolved, Feedback | +| Developer | OCC developers and (in Community project) external contributors who signed the CLA | View, report, modify, and handle issues | New, Assigned, Resolved, Reviewed, Feedback | +| Tester | OCC engineer devoted to certification testing | View, report, modify, and handle issues | Assigned, Tested, Feedback | +| Maintainer | Person responsible for a project or OCCT component | View, report, modify, and handle issues | New, Resolved, Reviewed, Tested, Closed, Feedback | +| Bugmaster | Person responsible for Mantis issue tracker, integrations, certification, and releases | Full access | All statuses | + +According to his access level, the user can participate in the issue handling process under different roles, as described below. + +@section occt_contribution_workflow Standard workflow for an issue + +@subsection occt_contribution_workflow_general General scheme + +
+@figure{OCCT_ContributionWorkflow_V3_image001.svg,"Standard life cycle of an issue",360} +
+ +@subsection occt_contribution_workflow_issue Issue registration + +An issue is registered in Mantis bugtracker by the **Reporter** with definition of the necessary attributes (see also @ref occt_contribution_app): + +**Category** -- indicates the OCCT component, to which the issue relates. + (If in doubt, assign to OCCT:Foundation Classes.) + +**Severity** -- indicates the impact of the issue in the context where it was discovered. + +**Profile** -- specifies the configuration, on which the problem was detected. +For specific configurations it is possible to specify separately platform, OS, and version. +These fields can be left empty if the issue is not configuration-specific. +Additional details relevant for the environment where the issue is reproduced (such as compiler version, bitness, etc.) can be provided in the **Description**. + +**Products Version** -- defines the OCCT version, on which the problem has been detected. + +It is preferable to indicate the version of the earliest known official release where the problem can be reproduced. +If the issue is reported on the current development version of OCCT, the current development version should be used (for convenience, this version is marked by asterisk in Mantis). + +@note OCCT version number can be consulted in the file Standard_Version.hxx (value of OCC_VERSION_COMPLETE macro). + +**Assign to** -- developer to whom the issue will be assigned. + By default, it is set to **Maintainer** of the OCCT component selected in **Category** field. + +**Target Version** -- defines the target version for the fix to be provided. + By default, it is set to the current version under development. + +**Summary** -- a short, one sentence description of the issue. + +The **Summary** has a limit of 128 characters. +It should be informative and useful for the developers. +It is not allowed to mention the issue originator, and in particular the customer, in the name of the registered issue. + +A good practice is to start the issue with indication of the relevant component (OCCT module, package, class etc.) to better represent its context. + +The summary should be given in imperative mood when it can be formulated as goal to be achieved or action to be done. +In particular, this applies to feature requests and improvements, for instance: + +> *Visualization - provide a support of zoom persistent selection* + +If the issue reports a problem, the summary should be given in Present Simple. +If reported problem is believed to be a regression, it is recommended to indicate this in the summary, like this: + +> [Regression in 6.9.0] *IGES - Export of a reversed face leads to wrong data* + +**Description** -- should contain a detailed definition of the nature of the registered issue depending on its type. + +For a bug it is required to submit a detailed description of the incorrect behavior, including the indication of the cause of the problem (if known at this stage), and details on the context where the issue has been detected. + +For a feature or integration request it is necessary to describe the proposed feature in details (as much as possible at that stage), including the changes required for its implementation and the main features of the new functionality. + +Example: + +> *Currently selection does not work correctly for non-zoomable objects (those defined using transform persistence). To provide correct selection for such objects, first-level (object) BVH structures must be updated on each camera change, and frustum must be rebuilt accordingly.* + +@note In the description and notes to the issues you can refer to another issue by its ID prefixed by number sign (e.g.: #12345), and refer to a note by its ID prefixed by tilde (e.g.: ~20123). +These references will be expanded by Mantis into links to the corresponding issue or note. +When the number sign or the tilde followed by digits are a part of a normal text, add a space before digits (e.g.: "face # 12345 contains ~ 1000 edges") to avoid this conversion. + +**Steps To Reproduce** -- allows describing in detail how to reproduce the issue. + +This information is crucial for the developer to investigate the cause of the problem and to create the test case. +The optimal approach is to give a sequence of @ref occt_user_guides__test_harness "DRAW Test Harness" commands to reproduce the problem in DRAW. +This information can also be provided as a DRAW Tcl script attached to the issue (in **Upload File** field). + +**Additional information and documentation updates** -- any additional information, remarks to be taken into account in Release Notes, etc.. + +**Upload File** -- allows attaching the shapes, snapshots, scripts, documents, or modified source files of OCCT. + +This field can be used to attach a prototype test case in form of a Tcl script for DRAW, a C++ code which can be organized in DRAW commands, sample shapes, documents describing proposed change or analysis of the problem, or other data required for reproduction of the issue. +Where applicable, pictures demonstrating a problem and/or desired result can be attached. + +The newly registered issue gets status **NEW** and is assigned to the person indicated in the **Assign to** field. + +@subsection occt_contribution_workflow_assign Assigning the issue + +The description of the new issue is checked by the **Maintainer** and if it is feasible, he may assign the issue to a **Developer**. +Alternatively, any user with **Developer** access level or higher can assign the issue to himself if he wants to provide a solution. + +The recommended way to handle contributions is that the **Reporter** assigns the issue to himself and provides a solution. + +The **Maintainer** or **Bugmaster** can close or reassign the issue (in **FEEDBACK** state) to the **Reporter** after it has been registered, if its description does not contain sufficient details to reproduce the bug or explain the need of the new feature. +That decision shall be documented in the comments to the issue in the Bugtracker. + +The assigned issue has status **ASSIGNED**. + +@subsection occt_contribution_workflow_fix Resolving the issue + +The **Developer** responsible for the issue assigned to him provides a solution including: + +* Changes in the code, with appropriate comments; +* Test case (when applicable) and data necessary for its execution; +* Changes in the user and developer guides (when necessary). + +The change is integrated to branch named CRxxxxx (where **xxxxx** is issue number) in the OCCT Git repository, based on current master, and containing a single commit with the appropriate description. +Then the issue is switched to **RESOLVED** for further review and testing. + +The following sub-sections describe this process, relevant requirements and options, in more details. + +@subsubsection occt_contribution_workflow_fix_code Requirements to the code modification + +The amount of code affected by the change should be limited to the changes required for the bug fix or improvement. +Change of layout or re-formatting of the existing code is allowed only in the parts where meaningful changes related to the issue have been made. + +@note If deemed useful, re-formatting or cosmetic changes affecting considerable parts of the code can be made within a dedicated issue. + +The changes should comply with the OCCT @ref occt_contribution__coding_rules "Codng Rules". +It is especially important to comment the code properly so that other people can understand it easier. + +The modification should be tested by running OCCT tests (on the platform and scope available to **Developer**) and ensuring absence of regressions. +In case if modification affects results of some existing test case and the new result is correct, such test case should be updated to report OK (or BAD), as descibed in @ref testmanual_details_results "Automated Test System / Interpretation of Test Results". + +@subsubsection occt_contribution_workflow_fix_test Providing a test case + +For modifications affecting OCCT functionality, a test case should be created (unless already exists) and included in the commit or patch. +See @ref testmanual_intro_quick_create "Automated Test System / Creating a New Test" for relevant instructions. + +The data files required for a test case should be attached to the corresponding issue in Mantis (i.e. not included in the commit). + +When the test case cannot be provided for any reason, the maximum possible information on how the problem can be reproduced and how to check the fix should be provided in the **Steps to Reproduce** field of an issue. + +@subsubsection occt_contribution_workflow_fix_doc Updating user and developer guides + +If the change affects a functionality described in @ref user_guides "User Guides", the corresponding user guide should be updated to reflect the change. + +If the change affects OCCT test system, build environment, or development tools described in @ref build_upgrade "Build, Debug and Upgrade" or @ref contribution "Contribution", the corresponding guide should be updated. + +The changes that break compatibility with the previous versions of OCCT (i.e. affecting API or behavior of existing functionality in the way that may require update of existing applications based on an earlier official release of OCCT to work correctly) should be described in the document @ref occt__upgrade "Upgrade from previous OCCT versions". +It is recommended to add a sub-section for each change described. +The description should provide the explanation of the incompatibility introduced by the change, and describe how it can be resolved (at least, in known situations). +When feasible, the automatic upgrade procedure (adm/upgrade.tcl) can be extended by a new option to perform the required upgrade of the dependent code automatically. + +@subsubsection occt_contribution_workflow_fix_git Submission of change as a Git branch + +The modification of sources should be provided in the dedicated branch of the official OCCT Git repository. + +The branch should contain a single commit, with the appropriate commit message (see @ref occt_contribution_workflow_fix_commit "Requirements to the commit message" below). + +In general, this branch should be based on the recent version of the master branch. +It is highly preferable to submit changes basing on the current master. +In case if the fix is implemented on the previous release of OCCT, the branch can be based on the corresponding tag in Git, instead of the master. + +The branch name should be composed of letters **CR** (abbreviation of "Change Request") followed by the issue ID number (without leading zeros). +It is possible to add an optional suffix to the branch name after the issue ID, e.g. to distinguish between several versions of the fix (see @ref occt_contribution_nonstd_rebase). + +See @ref occt_contribution__git_guide "Guide to using GIT" for help. + +@note When a branch with the name given according to the above rule is pushed to Git, a note is automatically added to the corresponding issue in Mantis, indicating the person who has made the push, the commit hash, and (for new commits) the description. + +@subsubsection occt_contribution_workflow_fix_commit Requirements to the commit message + +The commit message posted in Git constitutes an integral part of both the fix and the release documentation. + +The first line of the commit message should contain the Summary of the issue (starting with its ID followed by colon, e.g. "0022943: Bug in TDataXtd_PatternStd"), followed by an empty line. + +The following lines should provide a description of the context and details on the changes made. +The contents and the recommended structure of the description depend on the nature of the bug. + +In a general case, the following elements should be present: +* **Problem** -- a description of the unwanted behavior; +* **Change** -- a description of the implemented changes, including the names of involved classes / methods / enumerations etc.; +* **Result** -- a description of the current behavior (after the implementation). + +Example: + +> *0026330: BRepOffsetAPI_ThruSections creates invalid shape.* +> +> *Methods BRep_Tool::CurveOnSurface() and BRepCheck_Edge::InContext() now properly handle parametric range on a 3D curve when it is used to generate a p-curve dynamically (on a planar surface) and both the surface and the 3D curve have non-null locations.* + +Provide sufficient context so that potential user of the affected functionality can understand what has been changed and how the algorithm works now. +Describe reason and essence of the changes made, but do not go too deep into implementation details -- these should be reflected in comments in the code. + +@subsubsection occt_contribution_workflow_fix_resolve Marking issue as resolved + +To mark the change as ready for review and testing, the corresponding issue should be switched to **RESOLVED** state. +By default, the issue gets assigned to the **Maintainer** of the component, who is thus responsible for its review. +Alternatively, another person can be selected as a reviewer at this step. + +When the issue is switched to **RESOLVED**, it is required to update or fill the field **Steps to reproduce**. +The possible variants are: + +* The name of an existing or new test case (preferred variant); +* A sequence of DRAW commands; +* N/A (Not required / Not possible / Not applicable); +* Reference to an issue in the bug tracker of another project. + +@subsection occt_contribution_workflow_review Code review + +The **Reviewer** analyzes the proposed solution for applicability in accordance with OCCT @ref occt_contribution__coding_rules "Coding Rules" and examines all changes in the sources, test case(s), and documentation to detect obvious and possible errors, misprints, or violations of the coding style. + +If the Reviewer detects some problems, he can either: + +* Fix these issues and provide a new solution. + The issue can then be switched to **REVIEWED**. + + In case of doubt or possible disagreement the **Reviewer** can reassign the issue (in **RESOLVED** state) to the **Developer**, who then becomes a **Reviewer**. + Possible disagreements should be resolved through discussion, which is done normally within issue notes (or on the OCCT developer’s forum if necessary). + +* Reassign the issue back to the **Developer**, providing detailed list of remarks. The issue then gets status **ASSIGNED** and a new solution should be provided. + +If Reviewer does not detect any problems, or provides a corrected version, he changes status to **REVIEWED**. +The issue gets assigned to the **Bugmaster**. + +@subsection occt_contribution_workflow_test Testing + + The issues that are in **REVIEWED** state are subject of certification (non-regression) testing. + The issue is assigned to an OCCT **Tester** when he starts processing it. + + If the branch submitted for testing is based on obsolete status of the master branch, **Tester** @ref occt_contribution_nonstd_rebase "rebases" it on master HEAD. + In case of conflicts, the issue is assigned back to **Developer** in **FEEDBACK** status, requesting for a rebase. + + Certification testing includes: + * Addition of new data models (if required for a new test case) to the data base; + * Revision of the new test case(s) added by developer, and changes in the existing test cases included in commit. + The **Tester** can amend tests to ensure their correct behavior in the certification environment. + * Building OCCT on a sub-set of supported configurations (OS and compiler), watching for errors and warnings; + * Execution of tests on sub-set of supported platforms (at least, one Windows and one Linux configuration), watching for regressions; + * Building OCCT samples, watching for errors; + * Building and testing of OCC products based on OCCT. + +If the **Tester** does not detect problems or regressions, he changes the status to **TESTED** for further integration. + +If the **Tester** detects build problems or regressions, he changes the status to **ASSIGNED** and reassigns the issue to the **Developer** with a detailed description of the problems. +The **Developer** should analyze the reported problems and, depending on results of this analysis, either: +* Confirm that the detected problems are expected changes and they should be accepted as a new status of the code. Then the issue should be switched to **FEEDBACK** and assigned to the **Bugmaster**. +* Produce a new solution (see @ref occt_contribution_workflow_fix, and also @ref occt_contribution_nonstd_minor). + +@subsection occt_contribution_workflow_integrate Integration of a solution + +Before integration into the master branch of the repository the **Integrator** checks the following conditions: + * the change has been reviewed; + * the change has been tested without regressions (or with regressions treated properly); + * the test case has been created for this issue (when applicable), and the change has been rechecked on this test case; + * the change does not conflict with other changes integrated previously. + +If the result of check is successful the Integrator integrates the solution into the branch. +The integrations are performed weekly; integration branches are named following the pattern IR-YYYY-MM-DD. + +Each change is integrated as a single commit without preserving the history of changes made in the branch (by rebase, squashing all intermediate commits if any), however, preserving the author when possible. +This is done to have the master branch history plain and clean. +The following picture illustrates the process: + +@figure{OCCT_ContributionWorkflow_V3_image002.png,"Integration of several branches",420} + +The new integration branch is tested against possible regressions that might appear due to interference between separate changes. +When the tests are OK, the integration branch is pushed as the new master to the official repository. +The issue status is set then to **VERIFIED** and is assigned to the **Reporter** so that he could check the fix as integrated. + +The branches corresponding to the integrated fixes are removed from the repository by the **Bugmaster**. + +@subsection occt_contribution_workflow_close Closing an issue + +When possible, the **Reporter** should check whether the problem is actually resolved in the environment where it has been discovered, after the fix is integrated to master. +If the fix does not actually resolve the original problem, the issue in **VERIFIED** status can be reopened and assigned back to the **Developer** for rework. +The details on how to check that the issue is still reproducible should be provided. +However, if the issue does resolve the problem as described in the original report, but a similar problem is discovered for another input data or configuration, or the fix has caused a regression, that problem should be registered as a separate (@ref occt_contribution_nonstd_relate "related") issue. + +If the fix integrated to master causes regressions, **Bugmaster** can revert it and reopen the issue. + +The **Bugmaster** closes the issue after the regular OCCT Release, provided that the issue status is **VERIFIED** and the change was actually included in the release. +The final issue state is **CLOSED**. + +The field **Fixed in Version** of the issue is set to the OCCT version where it is fixed. + +@section occt_contribution_nonstd Additional workflow elements + +@subsection occt_contribution_nonstd_feedback Requesting more information or specific action + +If, at any step of the issue lifetime, the person responsible for it cannot process it due to absence of required information, expertise, or rights, he can switch it to status **FEEDBACK** and assign to the person who is (presumably) able to resolve the block. Some examples of typical situations where **FEEDBACK** is used are: + +* The **Maintainer** or the **Developer** requests for more information from the **Reporter** to reproduce the issue; +* The **Tester** requests the **Developer** or the **Maintainer** to help him in the interpretation of testing results; +* The **Developer** or the **Maintainer** asks the **Bugmaster** to close the issue that is found irrelevant or already fixed (see @ref occt_contribution_nonstd_autofix). + +In general, issues with status **FEEDBACK** should be processed as fast as possible, to avoid unjustified delays. + +@subsection occt_contribution_nonstd_relate Defining relationships between issues + +When two or more issues are related to each other, this relationship should be reflected in the issue tracker. +It is also highly recommended to add a note to explain the relationship. +Typical cases of relationships are: + +* Issue A is caused by previous fix made for issue B (A is a child of B); +* Issue A describes the same problem as issue B (A is a duplicate of B); +* Issues A and B relate to the same piece of code, functionality etc., in the sense that the fix for one of these issues will affect the other (A is related to B) + +When the fix made for one issue also resolves another one, these issues should be marked as related or duplicate. +In general, the duplicate issue should have the same status, and, when closed, be marked as fixed in the same OCCT version, as the main one. + +@subsection occt_contribution_nonstd_patch Submission of a change as a patch + +In some cases (if Git is not accessible for the contributor), external contributions can be submitted as a patch file (generated by *diff* command) or as modified sources attached to the Mantis issue. +The OCCT version, for which the patch is generated, should be clearly specified (e.g. as hash code of Git commit if the patch is based on an intermediate state of the master). + +@note Such contributions should be put to Git by someone else (e.g. the **Reviewer**), this may cause delay in their processing. + +@subsection occt_contribution_nonstd_rebase Updating branches in Git + +Updates of the existing branch (e.g. taking into account the remarks of the **Reviewer**, or fixing regressions) should be provided as new commits on top of previous state of the branch. + +It is allowed to rebase the branch on the new state of the master and push it to the repository under the same name (with --force option) provided that the original sequence of commits is preserved. + +When a change is squashed into a single commit (e.g. to be submitted for review), it should be pushed into a branch a with different name. + +The recommended approach is to add a numeric suffix (index) indicating the version of the change, e.g. "CR12345_5". +Usually it is worth keeping a non-squashed branch in Git for reference. + +To avoid confusions, the branch corresponding to the latest version of the change should have a greater index. + +@note Make sure to revise the commit message after squashing a branch, to keep it meaningful and comprehensive. + +@subsection occt_contribution_nonstd_minor Minor corrections + +In some cases review remarks or results of testing require only minor corrections to be done in the branch containing a change. +"Minor" implies that the correction does not impact the functionality and does not affect the description of the previously committed change. + +As an exception to general @ref occt_contribution_workflow_fix_git "single-commit rule", it is allowed to put such minor corrections on top of the existing branch as a separate commit, and re-submit it for further processing in the same branch, without squashing. + +Minor commits should have a single-line message starting with #. +These messages will be ignored when the branch is squashed at integration. + +Typical cases of minor corrections are: + +* Amendments of test cases (including those made by the **Tester** to adjust a test script to a specific platform); +* Trivial corrections of compilation warnings (such as removal of an unused variable); +* Addition or correction of comments or documentation; +* Corrections of code formatting (e.g. reversion of irrelevant formatting changes made in the main commit). + +@subsection occt_contribution_nonstd_autofix Handling non-reproducible issues + +Investigation of each issue starts with reproducing it on current development version (master). + +If it cannot be reproduced on the current master, but can be reproduced on one of previous releases (or previous state of the master), it is considered as solved by a change made for another issue. +If that "fixing" issue can be identified (e.g. by parsing Git log), it should be set as related to that issue. +The issue should be switched to **FEEDBACK** and assigned to the **Bugmaster** for further processing. + +The **Bugmaster** decides whether it is necessary to create a test case for that issue, and if so may assign it to the **Developer** or the **Tester** to create a test. +The issue then follows the standard workflow. + +Otherwise, if the issue is fixed in one of previous releases, the **Bugmaster** closes it setting the appropriate value in **Fixed in Version** field, or, if the issue is fixed after the last release, switches it to **VERIFIED** status. + +If the issue cannot be reproduced due to an unclear description, missing data, etc., it should be assigned back to the **Reporter** in **FEEDBACK** status, requesting for more information. +The **Reporter** should provide additional information within one month; after that time, if no new information is provided, the issue should be closed by the **Bugmaster** with resolution **Unable to reproduce**. + +@section occt_contribution_app Appendix: Issue attributes + +@subsection occt_contribution_app_category Category + +The category corresponds to the component of OCCT where the issue is found: + + | Category | Component | + | :--------------------------- | :----------------------------------------------------- | + | OCCT:Foundation Classes | Foundation Classes module | + | OCCT:Modeling Data | Modeling Data classes | + | OCCT:Modeling Algorithms | Modeling Algorithms, except shape healing and meshing | + | OCCT:Shape Healing | Shape Healing component (TKShapeHealing) | + | OCCT:Mesh | BRepMesh algorithm | + | OCCT:Data Exchange | Data Exchange module | + | OCCT:Visualization | Visualization module | + | OCCT:Application Framework | OCAF | + | OCCT:DRAW | DRAW Test Harness | + | OCCT:Tests | Automatic Test System | + | OCCT:Documentation | Documentation | + | OCCT:Coding | General code quality | + | OCCT:Configuration | Configuration, build system, etc. | + | OCCT:Releases | Official OCCT releases | + | Website:Tracker | OCCT Mantis issue tracker, tracker.dev.opencascade.org | + | Website:Portal | OCCT development portal, dev.opencascade.org | + | Website:Git | OCCT Git repository, git.dev.opencascade.org | + + +@subsection occt_contribution_app_severity Severity + + Severity shows at which extent the issue affects the product. + The list of used severities is given in the table below in the descending order. + + | Severity | Description | + | :---------- | :------------------------------------------------ | + | crash | Crash of the application or OS, loss of data | + | block | Regression corresponding to the previously delivered official version. Impossible operation of a function on any data with no work-around. Missing function previously requested in software requirements specification. Destroyed data. | + | major | Impossible operation of a function with existing work-around. Incorrect operation of a function on a particular dataset. Impossible operation of a function after intentional input of incorrect data. Incorrect behavior of a function after intentional input of incorrect data. | + | minor | Incorrect behavior of a function corresponding to the description in software requirements specification. Insufficient performance of a function. | + | tweak | Ergonomic inconvenience, need of light updates. | + | text | Non-conformance of the program code to the Coding Rules, mistakes and non-functional errors in the source text (e.g. unnecessary variable declarations, missing comments, grammatical errors in user manuals). | + | trivial | Cosmetic issues. | + | feature | Request for a new feature or improvement. | + | integration request | Requested integration of an existing feature into the product. | + | just a question | A question to be processed, without need of any changes in the product. | + +@subsection occt_contribution_app_status Status + + The bug statuses that can be applied to the issues are listed in the table below. + + | Status | Description | + | :------------------- | :----------------------------------------- | + | New | A new, just registered issue. | + | Acknowledged | Can be used to mark the issue as postponed. | + | Confirmed | Can be used to mark the issue as postponed. | + | Feedback | The issue requires more information or a specific action. | + | Assigned | Assigned to a developer. | + | Resolved | The issue has been fixed, and now is waiting for review. | + | Reviewed | The issue has been reviewed, and now is waiting for testing (or being tested). | + | Tested | The fix has been internally tested by the tester with success on the full non-regression database or its part and a test case has been created for this issue. | + | Verified | The fix has been integrated into the master of the corresponding repository | + | Closed + resolution | The fix has been integrated to the master. The corresponding test case has been executed successfully. The issue is no longer reproduced. | + +@subsection occt_contribution_app_resolution Resolution + + **Resolution** is set when the bug is closed. "Reopen" resolution is added automatically when the bug is reopened. + + | Resolution | Description | + |:--------------------- | :--------------------------------------------------------------------------- | + | Open | The issue is pending. | + | Fixed | The issue has been successfully fixed. | + | Reopened | The bug has been reopened because of insufficient fix or regression. | + | Unable to reproduce | The bug is not reproduced. | + | Not fixable | The bug cannot be fixed because e.g. it is a bug of third party software, OS or hardware limitation, etc. | + | Duplicate | The bug for the same issue already exists in the tracker. | + | Not a bug | It is a normal behavior in accordance with the specification of the product. | + | No change required | The issue didn’t require any change of the product, such as a question issue.| + | Suspended | The issue is postponed (for Acknowledged status). | + | Documentation updated | The documentation has been updated to resolve a misunderstanding causing the issue. | + | Won’t fix | It is decided to keep the existing behavior. | + diff -Nru opencascade-7.4.1+dfsg1/dox/contribution/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image001.svg opencascade-7.5.1+dfsg1/dox/contribution/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image001.svg --- opencascade-7.4.1+dfsg1/dox/contribution/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image001.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/contribution/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image001.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1609 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + YES, bug + + + Reporter + provides + more info + + + No + t clear: + + more info + + requested + + + Developer resolves + + the issue + + + Reporter registers an issue + + + + New + + + + + Resolved + + + + Ma + intainer + + checks + + the + description + + + + Feedback + + + + + + + + YES, fixed + + + Reporter + + is not satisfied + with + + the + fix + + + YES, fixed + , no regressions + + + Tester + is not satisfied + with + the + fix + + + Integrator merges the fix to trunk + + + Tester verifies the solution + + + + + Tested + + + + Integration to the trunk + + Verified + + + + + Fixed? + + + + + Conflict ? + + + + YES, fixed + + + + Assigned + + + Reviewer + + verifies the solution + + + + + Reviewer + + is not + satisfied with + the fix + + + + + Good + ? + + + + Reviewed + + + + Resolution + + + + Delivery of the release + + Closed + + + YES, code is good + + + Reporter can re + - + check the fix + + + + + OK + ? + + + + + Conflict with other + change is detected + + + + + + YES, fix provided + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Clear? + Fix provided? + + Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image002.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/contribution/documentation/documentation.md opencascade-7.5.1+dfsg1/dox/contribution/documentation/documentation.md --- opencascade-7.4.1+dfsg1/dox/contribution/documentation/documentation.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/contribution/documentation/documentation.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,515 @@ + Documentation System {#occt_contribution__documentation} +====================== + +@tableofcontents + +@section OCCT_DM_SECTION_1 Introduction + +OCCT documentation is provided in several forms: + +- This overview provides general description of OCCT structure, functionality, modules, and features. + It is available in HTML format (generated by Doxygen) and includes User and Developer Guides. + The sources of this documentation are contained in **dox** subdirectory of OCCT sources + (plain text format is used, with mixed MarkDown / Doxygen syntax mark-up). + +- User and Developer Guides describing in details OCCT modules and development tools are also available in + Adobe Portable Document Format (PDF). To read this format, you need Adobe Acrobat Reader, + which is a freeware and can be downloaded from the Adobe site. + +- Full reference documentation covering all OCCT classes generated automatically by Doxygen + software is provided in HTML format. + Reference documentation is presented in **Modules --> Toolkits --> Packages --> Classes** + logic structure with cross-references to all OCCT classes and complete in-browser search by all classes. + +This document provides practical guidelines for generation and editing of OCCT user documentation. + +@section OCCT_DM_SECTION_2 Prerequisites + +You need to have the following software installed to generate the documentation. + +**Tcl/Tk** +Version 8.5 or 8.6: https://www.tcl.tk/software/tcltk/download.html + +**Doxygen** +Version 1.8.4 or above: http://www.doxygen.nl/download.html + +**Dot** +Part of Graphviz software, used by Doxygen for generation of class diagrams in Reference Manual: https://www.graphviz.org/download/ + +**MiKTeX** or other package providing **pdflatex** command (only needed for generation of PDF documents): https://miktex.org/download + +**Inkscape** (only needed for generation of PDF documents containing SVG images): http://www.inkscape.org/download + +When generating PDF documentation, **pdflatex** and **inkscape** executables should be accessible by PATH variable. +You can use *custom.bat* file to add necessary paths to the *PATH* variable. + +Note that in the process of PDF generation MiKTeX may need some packages not installed by default. +We recommend setting option "Install missing packages on-the-fly" to "Ask me first" (default) during MiKTeX installation: + +@figure{/contribution/documentation/images/documentation_miktex.png,"",320} + +On the first run of **pdflatex** it will open a dialog window prompting for installation of missing packages. +Follow the instructions to proceed (define proxy settings if needed, select a mirror site to download from, etc.). + +**MathJax** is used for rendering math formulas in browser (HTML and CHM outputs): http://www.mathjax.org. + +By default MathJAX scripts and fonts work on-line and no installation of MathJAX is necessary if Internet is accessible. +If you need to use OCCT documentation while off-line, you can install a local copy of MatJAX, see https://docs.mathjax.org/en/v2.7-latest/start.html#installing-your-own-copy-of-mathjax. +See \ref OCCT_DM_SECTION_A_9 for more details on inserting mathematical expressions. + +@section OCCT_DM_SECTION_2_1 Documentation Generation + +Run command *gendoc* from command prompt (with OCCT directory as current one) to generate OCCT documentation. +The synopsis is: + + gendoc \[-h\] {-refman|-overview} \[-html|-pdf|-chm\] \[-m=|-ug=\] \[-v\] \[-s=\] \[-mathjax=\] + +Here the options are: + +* Choice of documentation to be generated: + * -overview: To generate Overview and User Guides (cannot be used with -refman) + * -refman: To generate class Reference Manual (cannot be used with -overview) + +* Choice of output format: + * -html: To generate HTML files (default, cannot be used with -pdf or -chm) + * -pdf: To generate PDF files (cannot be used with -refman, -html, or -chm) + * -chm: To generate CHM files (cannot be used with -html or -pdf) + +* Additional options: + * -m=\: List of OCCT modules (separated with comma), for generation of Reference Manual + * -ug=\: List of MarkDown documents (separated with comma), to use for generation of Overview / User Guides + * -mathjax=\: To use local or alternative copy of MathJax + * -s=\: Specifies the Search mode of HTML documents; can be: none | local | server | external + * -h: Prints this help message + * -v: Enables more verbose output + +**Note** + +* In case of PDF output the utility generates a separate PDF file for each document; +* In case of HTML output the utility generates a common Table of contents containing references to all documents. +* In case of CHM output single CHM file is generated + +**Examples** + +To generate the output for a specific document specify the path to the corresponding MarkDown file (paths relative to *dox* sub-folder can be given), for instance: + +~~~~ + > gendoc -overview -ug=dev_guides/documentation/documentation.md +~~~~ + +To generate Reference Manual for the whole Open CASCADE Technology library, run: +~~~~ + > gendoc -refman +~~~~ + +To generate Reference Manual for Foundation Classes and Modeling Data modules only, with search option, run: +~~~~ + > gendoc -refman -m=FoundationClasses,ModelingData,ModelingAlgorithms -s=local +~~~~ + +@section OCCT_DM_SECTION_3 Documentation Conventions + +This section contains information about file format conventions, directories structure, etc. + +@subsection OCCT_DM_SECTION_3_1 File Format + +The format used for documentation is MarkDown with Doxygen extensions. +The MarkDown files have a *.md extension and are based on rules described in \ref OCCT_DM_SECTION_A section. + +@subsection OCCT_DM_SECTION_3_2 Directory Structure + +@figure{/contribution/documentation/images/documentation_folders.png,"",160} + +Each document has its own folder if there are any images used in it. These images are stored in *images* subfolder. + +If you want to use the same image for several documents, you can place it in *dox/resources* folder. + +**Note**: To avoid incorrect image display, use a relative path to the image (starting from *dox* folder). For instance: + + +@verbatim +@figure{/contribution/documentation/images/documentation_test_image.svg,"",420} +@endverbatim + + +The documentation is generated in subfolder *doc* : +* *html* -- a directory for generated HTML pages; +* *pdf* -- a directory for generated PDF files. + +@section OCCT_DM_SECTION_4 Adding a New Document + +Place a new document in the folder taking into account its logical position in the documentation hierarchy. For instance, the document *svn.md* about the use of SVN to work with OCCT source code can be placed into /dox/contribution/. + +If there are images in the document, it should be placed in its own folder containing a subfolder for images. For instance: +* /dox/contribution/svn/ -- for *svn.md* file; +* /dox/contribution/svn/images/ -- for images. + +Add a relative path to *svn.md* in file dox/FILES.txt. For instance + +@verbatim +contribution/svn/svn.md +@endverbatim + +**Note** that the order of paths to documents in *FILES.txt* is reproduced in the Table of Contents in the HTML output, thus they need to be placed logically. + +**Note** that you should specify a file tag, not the document name. See @ref OCCT_DM_SECTION_A_1 "Header and hierarchic document structure" section for details. + +@section OCCT_DOC_SECTION_5 Additional Resources + +More information about OCCT can be found at http://www.opencascade.com and
http://dev.opencascade.org sites. + + +The information on formula syntax can be found at:
+http://en.wikipedia.org/wiki/Help:Displaying_a_formula + +More information on MarkDown and Doxygen syntax can be found at:
+http://www.stack.nl/~dimitri/doxygen/manual + +@section OCCT_DM_SECTION_A Appendix 1: Document Syntax + +A document file in *.md format must start with a proper header defining a caption and a unique tag. + +@verbatim +Documentation System {#contribution__documentation} +===================== +@endverbatim + +The document structure is formed by sections that must be defined consistently. + +The document can contain plain text, lists, tables, code snippets, images, math, etc. +Any specific text elements can be introduced by Markdown language tags or by usual HTML tags. + +The table of contents, page numbers (in PDF), and figure numbers (in PDF) are generated automatically. + +@subsection OCCT_DM_SECTION_A_1 Headers and hierarchic document structure + +Headers of different levels can be specified with the following tags: +* \@section -- for the first-level headers; +* \@subsection -- for the second level headers; +* \@subsubsection -- for the third level headers. + +For example: + +@verbatim + @section occt_ocaf_1 Basic Concepts + @subsection occt_ocaf_1_1 Applications and Documents + @subsubsection occt_ocaf_1_1_1 The document and the data framework +@endverbatim + +**Note** that section names can be used for references within the document and in other documents, so it is necessary to use the common prefix indicative of the document name for all section names in the given document. +For example, *occt_ocaf* for sections in Open CASCADE Application Framework manual. + +The remaining part of section names in most documents consists only of numbers, for example *1_1*. Actually, the hierarchical structure of the output table of contents is not based on these numbers and is generated automatically. + +The numbers are only indicative of a section location in the body of the document. However, duplicate section names in a document inevitably cause errors during generation. + +If you insert a section in the middle of a big document, do not renumber the document to the end (which is inefficient and error prone), but choose an arbitrary number or letter, not yet used in the document section naming, and base the naming in this section on it. + +The section hierarchy is limited to three levels and further levels cannot be presented in the Table of Contents. + +However, the fourth and fifth level headers can be tagged with #### and ##### correspondingly. + +It is also possible to use tags ## and ### for second and third level headers if you do not wish to show them in the table of contents or make references to them. + +@subsection OCCT_DM_SECTION_A_2 Plain Text + +A plain text is organized in paragraphs, separated by empty lines in MarkDown source. +The length of lines is not restricted; it is recommended to put each sentence on a separate line -- this is optimal for easier comparison of different versions of the same document. + +To insert special symbols, like \< , \> or \\, prepend them with \\ character: \\\<, \\\>, \\\\, etc. +To emphasize a word or a group of words, wrap the text with one pair of asterisks (*) or underscores (_) to make it *italic* and two pairs of these symbols to make it **Bold**. + +**Note** that if your emphasized text starts or ends with a special symbol, the asterisks may not work. Use explicit HTML tags \\ and \\ instead. + + +@subsection OCCT_DM_SECTION_A_3 Lists + +To create a bulleted list, start each line with a hyphen or an asterisk, +followed by a space. List items can be nested. This code: + +@verbatim +* Bullet 1 +* Bullet 2 + - Bullet 2a + - Bullet 2b +* Bullet 3 +@endverbatim + +produces this list: + +* Bullet 1 +* Bullet 2 + * Bullet 2a + * Bullet 2b +* Bullet 3 + +To create a numbered list, start each line with number and a period, +then a space. Numbered lists can also be nested. Thus this code + +@verbatim +1. List item 1 + 1. Sub-item 1 + 2. Sub-item 2 +2. List item 2 +4. List item 3 +@endverbatim + +produces this list: + +1. List item 1 + 1. Sub-item 1 + 2. Sub-item 2 +2. List item 2 +3. List item 3 + +**Note** that numbers of list items in the output are generated so they do not necessarily follow the numbering of source items. + +In some cases automatic generation adversely restarts the numbering, i.e. you get list items 1. 1. 1. instead of 1. 2. 3. in the output. +The use of explicit HTML tags \\ and \\ can help in this case. + +Each list item can contain several paragraphs of text; these paragraphs must +have the same indentation as text after bullet or number in the numbered list +item (otherwise numbering will be broken). + +Code blocks can be inserted as paragraphs with additional indentation +(4 spaces more). Note that fenced code blocks do not work within numbered lists +and their use may cause numeration to be reset. + + +Example of a complex nested list: + +1. List item 1 + + Additional paragraph + + code fragment + + One more paragraph + + 1. Sub-item 1 + + code fragment for sub-item 1 + + 2. Sub-item 2 + + Paragraph for sub-item 2 + + Yet one more paragraph for list item 1 + +2. List item 2 + + +@subsection OCCT_DM_SECTION_A_4 Tables + +A table consists of a header line, a separator line, and at least one row line. +Table columns are separated by the pipe (|) character. The following example: + +@verbatim +First Header | Second Header +------------- | ------------- +Content Cell | Content Cell +Content Cell | Content Cell +@endverbatim + + will produce the following table: + +First Header | Second Header +------------ | ------------- +Content Cell | Content Cell +Content Cell | Content Cell + +Column alignment can be controlled via one or two colons at the header separator line: + +@verbatim +| Right | Center | Left | +| ----: | :----: | :---- | +| 10 | 10 | 10 | +| 1000 | 1000 | 1000 | +@endverbatim + +which will looks as follows: + +| Right | Center | Left | +| ----: | :----: | :---- | +| 10 | 10 | 10 | +| 1000 | 1000 | 1000 | + +Note that each table row should be contained in one line of text; complex tables can be created using HTML tags. + +@subsection OCCT_DM_SECTION_A_5 Code Blocks + +Paragraphs indented with 4 or more spaces are considered as code fragments and rendered using Courier font. +Example: + + This line is indented by 4 spaces and rendered as a code block. + +A fenced code block does not require indentation, and is defined by a pair of "fence lines". +Such line consists of 3 or more tilde (~) characters on a line. +The end of the block should have the same number of tildes. +Thus it is strongly advised to use only three or four tildes. + +By default the output is the same as for a normal code block. +To highlight the code, the developer has to indicate the typical file extension, +which corresponds to the programming language, after the opening fence. +For highlighting according to the C++ language, for instance, write the following code (the curly braces and dot are optional): + +@verbatim +~~~{.cpp} +int func(int a,int b) { return a*b; } +~~~ +@endverbatim + +which will produce: +~~~{.cpp} +int func(int a,int b) { return a*b; } +~~~ + +Smaller code blocks can be inserted by wrapping with tags \@code and \@endcode. + +Verbatim content (same as code but without syntax highlighting) can be inserted by wrapping with tags \@verbatim and \@endverbatim. + +@subsection OCCT_DM_SECTION_A_5a Quotes + +Text quoted from other sources can be indented using ">" tag. For example: + +@verbatim +> [Regression in 6.9.0] *IGES - Export of a reversed face leads to wrong data* +@endverbatim + +will produce + +> [Regression in 6.9.0] *IGES - Export of a reversed face leads to wrong data* + +Note that this tag should prefix each line of the quoted text. +Empty lines in the quoted text, if any, should not have trailing spaces after the ">" (lines with trailing spaces will break the quote block). + +@subsection OCCT_DM_SECTION_A_6 References + +To insert a reference to a website, it is sufficient to write an URL. +For example: http://en.wikipedia.org + +To insert a reference to a document or its subsection, use command \@ref followed by the document or section tag name. +For instance, @code @ref OCCT_DM_SECTION_A @endcode will be rendered as @ref OCCT_DM_SECTION_A. + +Note that links between documents will not work in PDF output if each document is generated independently. +Hence it is recommended to add a name of the referenced section after the tag name in the \@ref command (in quotes): this will guarantee that the reference is recognizable for the reader even if the cross-link is not instantiated. +For instance: @code @ref occt_modat_1 "Geometry Utilities" @endcode will be rendered as @ref occt_modat_1 "Geometry Utilities". + +@subsection OCCT_DM_SECTION_A_7 Images + +For inserting images into the document use the command \@figure, as follows: + +@verbatim + @figure{/relative/path/to/image/image_file_name.png,"Image caption"} +@endverbatim + +The first argument is a path to the image file, relative to the *dox* folder. +The supported formats for images are PNG, JPG, and SVG. +The file extension must be lowercase and correspond to the file format. +The image file name should have no dots except for the one before extension (names with more than one dot confuse **pdflatex**). + +The second argument is optional, it defines the caption for the image to be inserted. +The caption argument, if given, should be quoted, even if it is a single word. +Captions are included below the image; in PDF output the images with caption are numbered automatically. + +Example: + +@verbatim + @figure{/contribution/documentation/images/documentation_test_image.svg,"Test SVG image"} +@endverbatim + +is rendered as: + +@figure{/contribution/documentation/images/documentation_test_image.svg,"Test SVG image",320} + +We recommend using **Inkscape** for creation and edition of vector graphics. +The graphics created in MS Word Draw and some other vector editors can be copy-pasted to Inkscape and saved as SVG images. + +Note that the image that will be included in documentation is the whole page of the Inkscape document; use option "Resize page to content" in menu **File -> Document properties** of Inkscape to fit page dimensions to the picture (adding margins as necessary). + +Note that the *figure* command is an alias to the standard Doxygen command *image* repeated twice: once for HTML and then for Latex output (used for PDF generation). Thus if HTML and PDF outputs should include different images or captions, command "image" can be used: + +@verbatim + @image html /relative/path/to/image/occ_logo_for_html.png + @image latex /relative/path/to/image/occ_logo_for_pdf.png +@endverbatim + +@subsection OCCT_DM_SECTION_A_8 Table Of Contents + +Use \@tableofcontents tag to get the table of contents at the beginning of the document. + +Actually, it is not strictly necessary now because TreeView option for HTML is used. +The TOC in the PDF document will be generated automatically. + +@subsection OCCT_DM_SECTION_A_9 Formulas + +Formulas within MarkDown documents can be defined using LaTeX syntax. + +Equations can be written by several ways: + +1.Unnumbered displayed formulas that are centered on a separate line. +These formulas should be put between \@f\[ and \@f\] tags. An example: + +@verbatim +@f[ + |I_2|=\left| \int_{0}^T \psi(t) + \left\{ + u(a,t)- + \int_{\gamma(t)}^a + \frac{d\theta}{k(\theta,t)} + \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi + \right\} dt + \right| +@f] +@endverbatim + +gives the following result: + + @f$ + |I_2|=\left| \int_{0}^T \psi(t) + \left\{ + u(a,t)- + \int_{\gamma(t)}^a + \frac{d\theta}{k(\theta,t)} + \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi + \right\} dt + \right| + @f$ + +2.Formulas can also be put between @verbatim \begin{align} @endverbatim and @verbatim \end{align} @endverbatim tags. + + For example: + +@verbatim + \begin{align} + \dot{x} & = \sigma(y-x) \\ + \dot{y} & = \rho x - y - xz \\ + \dot{z} & = -\beta z + xy + \end{align} +@endverbatim + + gives the following result: +@latexonly + \begin{align} + \dot{x} & = \sigma(y-x) \\ + \dot{y} & = \rho x - y - xz \\ + \dot{z} & = -\beta z + xy + \end{align} +@endlatexonly + +@htmlonly + \begin{align} + \dot{x} & = \sigma(y-x) \\ + \dot{y} & = \rho x - y - xz \\ + \dot{z} & = -\beta z + xy + \end{align} +@endhtmlonly + +3.Inline formulas can be specified using this syntax: + +@verbatim + @f$ \sqrt{3x-1}+(1+x)^2 @f$ +@endverbatim + + that leads to the following result: @f$ \sqrt{3x-1}+(1+x)^2 @f$ + Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/documentation/images/documentation_folders.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/documentation/images/documentation_folders.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/documentation/images/documentation_miktex.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/documentation/images/documentation_miktex.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/contribution/documentation/images/documentation_test_image.svg opencascade-7.5.1+dfsg1/dox/contribution/documentation/images/documentation_test_image.svg --- opencascade-7.4.1+dfsg1/dox/contribution/documentation/images/documentation_test_image.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/contribution/documentation/images/documentation_test_image.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,91 @@ + + + + + + + + + + image/svg+xml + + + + + + + + Test SVG image + + + diff -Nru opencascade-7.4.1+dfsg1/dox/contribution/git_guide/git_guide.md opencascade-7.5.1+dfsg1/dox/contribution/git_guide/git_guide.md --- opencascade-7.4.1+dfsg1/dox/contribution/git_guide/git_guide.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/contribution/git_guide/git_guide.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,519 @@ +Guide to installing and using Git for OCCT development {#occt_contribution__git_guide} +================================= + +@tableofcontents + +@section occt_gitguide_1 Overview + +@subsection occt_gitguide_1_1 Purpose + + The purpose of this document is to provide a practical introduction to Git + to OCCT developers who are not familiar with this tool + and to facilitate the use of the official OCCT Git repository for code contribution to OCCT. + + It can be useful to learn more about Git concepts and tools from a book a or manual. + Many good books on Git can be found at https://git-scm.com/documentation + + For the experienced Git users it can be enough to read sections 1 and 3 + of this document to start working with the repository. + + Familiarize yourselves with the @ref occt_contribution__contribution_workflow "Contribution Workflow document" + that describes how Git is used for processing contributions to OCCT. + + This and related documents are available at the Resources page + of the OCCT development portal at https://dev.opencascade.org/index.php?q=home/resources. + +@subsection occt_gitguide_1_2 Git URL + + URL of the official OCCT source code Git repository (accessed by SSH protocol) is: + + gitolite@git.dev.opencascade.org:occt + + or + + ssh://gitolite@dev.opencascade.org/occt.git + +@subsection occt_gitguide_1_3 Content + +The official repository contains: + + * The current certified version of OCCT: the "master" branch. This branch is updated by the Bugmaster only. Official OCCT releases are marked by tags. + * Topic branches created by contributors to submit changes for review / testing or for collaborative development. The topic branches should be named by the pattern "CR12345" where 12345 is the ID of the relevant issue registered in Mantis (without leading zeroes), and "CR" stands for "Change Request". The name can have an additional postfix used if more than one branch was created for the same issue. + * Occasionally topic branches with non-standard names can be created by the Bugmaster for special needs. + +@subsection occt_gitguide_1_4 Short rules of use + + The name specified in the user.name field in Git configuration should correspond + to your login name on the OCCT development portal. + This is important to clearly identify the authorship of commits. + (The full real name can be used as well; in this case add the login username in parentheses.) + + By default, contributors are allowed to push branches only with the names starting with CR + (followed by the relevant Mantis issue ID). + Possibility to work with other branches can be enabled by the Bugmaster on request. + + The branch is created by the developer in his local repository when the development of a contribution starts. + The branch for new developments is to be created from the current master. + The branch for integration of patches or developments based on an obsolete version + is created from a relevant tag or commit. The branch should be pushed to the official repo + only when sharing with other people (for collaborative work or review / testing) is needed. + + Rebasing the local branch to the current master is encouraged before the first submission + to the official repository. If rebasing was needed after the branch is pushed to the official repo, + the rebased branch should have a different name (use suffix). + + Integration of contributions that have passed certification testing is made exclusively by the Bugmaster. + Normally this is made by rebasing the contribution branch on the current master + and squashing it into a single commit. This is made to have the master branch history plain and clean, + following the general rule “one issue -- one commitâ€. + The description of the commit integrated to the master branch is taken from the Mantis issue + (ID, 'Summary', followed by the information from 'Documentation' field if present). + + In special cases when it is important to save the commits history in the branch + (e.g. in case of a long-term development integration) it can be integrated by merge (no fast-forward). + + The authorship of the contribution is respected by preserving the Author field of the commit when integrating. + Branches are removed from the official repository when integrated to the master. + The Bugmaster can also remove branches which have no commits during one-month period. + + The Bugmaster may ask the developer (normally the one who produced the contribution) + to rebase a branch on the current master, in the case if merge conflicts appear during integration. + +@subsection occt_gitguide_1_5 Version of Git + + The repository is tested to work with Git 1.7.6 and above. + Avoid using versions below 1.7.1 as they are known to cause troubles. + +@section occt_gitguide_2 Installing Tools for Work with Git + +@subsection occt_gitguide_2_1 Windows platform + + Installation of Git for Windows (provided by MSysGit project) is required. + + In addition, it is recommended to install TortoiseGit to work with Git on Windows. + If you do not install TortoiseGit or any other GUI tool, + you can use GitGui and Gitk GUI tools delivered with Git and available on all platforms. + +@subsubsection occt_gitguide_2_1_1 Installation of Git for Windows + + Download Git for Windows distributive from https://git-for-windows.github.io/ + During the installation: + + * Check-in "Windows Explorer integration" options: + * "Git Bash Here"; + * "Git GUI Here". + * To avoid a mess in your PATH, we recommend selecting "Run Git from Windows Prompt" in the environment settings dialog: + * In "Configuring the line ending conversions" dialog, select "Checkout Windows-style, commit Unix style endings". + + Note that by default Git user interface is localized to the system default language. + If you prefer to work with the English interface, remove or rename .msg localization file + in subdirectories *share/git-gui/lib/msgs* and *share/gitk/lib/msgs* of the Git installation directory. + + Before the first commit to the OCCT repository, make sure that your User Name in the Git configuration file (file .gitconfig in the $HOME directory) is equal to your username on the OCCT development portal. + +@subsubsection occt_gitguide_2_1_2 Installation and configuration of TortoiseGit + + Download TortoiseGit distributive from https://tortoisegit.org/download/. + Launch the installation. + + * Select your SSH client. Choose option + * "OpenSSH, Git default SSH Client" if you prefer to use command-line tools for SSH keys generation, or + * "TortoisePLink, coming from Putty, integrates with Windows better" if you prefer to use GUI tool (PuttyGen, see 3.2). + * Complete the installation. + + TortoiseGit integrates into Windows Explorer, thus it is possible to use context menu in Windows Explorer to access its functionality: + +@figure{OCCT_GitGuide_V2_image005.png,"",100} + + + + Note that if you have installed MSysGit or have Git installed in non-default path, + on the first time you use TortoiseGit you may get the message demanding to define path to Git. + In such case, click on **Set MSysGit path** button and add the path to git.exe + and path to MigGW libraries in the Settings dialog. + + * After the installation select Start -> Programs -> TortoiseGit Settings to configure TortoiseGit. + + Select Git->Config to add your user name and Email address to the local .gitconfig file + + @figure{OCCT_GitGuide_V2_image006.png,"",320} + + Optionally, you can set up TortoiseGit to use visual diff utility for SVG images used in OCCT documentation. + For that, click on item "Diff Viewer" in the Settings dialog, then click button "Advanced..." in the right tab to add a new record with the following parameters: + - Extension: .svg + - External program: <path_to_OCCT>\\adm\\svgdiff.bat %%base %%mine %%bname %%yname + +@figure{OCCT_GitGuide_V2_svgdiff.png,"",320} + +@subsection occt_gitguide_2_2 Linux platform + + We assume that Linux users have Git already installed and available in the *PATH*. + + Make sure to configure Git so that the user name is equal to your username + on the OCCT development portal, and set SafeCrLf option to true: + +~~~~~ + > git config --global user.name "Your User Name" + > git config --global user.email your@mail.address + > git config --global your@mail.address +~~~~~ + +@section occt_gitguide_3 Getting access to the repository + +@subsection occt_gitguide_3_1 Prerequisites + + Access to the repository is granted to the users who have signed the Contributor License Agreement. + + The repository is accessed by SSH protocol, thus you need to register your public SSH key + on the development portal to get access to the repository. + + SSH keys are used for secure authentication of the user when accessing the Git server. + Private key is the one stored on the user workstation (optionally encrypted). + Open (or public) key is stored in the user account page on the web site. + When Git client accesses the remote repository through SSH, + it uses this key pair to identify the user and acquire relevant access rights. + + Normally when you have Git installed, you should have also SSH client available. + On Unix/Linux it is installed by default in the system. + On Windows it is typical to have several SSH clients installed; + in particular they are included with Cygwin, Git, TortoiseGit. + + It is highly recommended to use the tools that come + with the chosen Git client for generation of SSH keys. + Using incompatible tools (e.g. *ssh-keygen.exe* from Cygwin for code generation, + and TortoiseGit GUI with a default Putty client for connection to server) + may lead to authentication problems. + +@subsection occt_gitguide_3_2 How to generate a key + +@subsubsection occt_gitguide_3_2_1 Generating key with Putty + + Use this option if you have installed TortoiseGit (or other GUI Git client on Windows) + and have chosen “TortoisePLink†(or other Putty client) as SSH client during installation. + + To generate the key with this client, run **Puttygen** (e.g. from Start menu -> TortoiseGit -> Puttygen), + then click **Generate** and move mouse cursor over the blank area until the key is generated. + +@figure{OCCT_GitGuide_V2_image007.png,"Putty key generator",320} + + After the key is generated, you will see GUI controls to define the public key comment + and / or specify the password for the private key protection. + When done, save both the public and the private key to the files of your choice + (make sure to store your private key in a secure place!). + + Copy the public key as shown by Puttygen to the clipboard to add it in your account. + Do not copy the Putty public key file content -- it is formatted in a way not suitable for the web site. + +@subsubsection occt_gitguide_3_2_2 Generating key with command-line tools + + Use this option if you work on Linux or if you have chosen “OpenSSH†as SSH client + during installation of TortoiseGit (or other Windows tool). + + Make sure that you have *ssh* and *ssh-keygen* commands in the path. + On Windows, you might need to start **Git Bash** command prompt window. + + Use the following command to generate SSH keys: +~~~~~ + > ssh-keygen -t rsa -C "your@mail.address" +~~~~~ + + The last argument is an optional comment, which can be included with the public key and used to distinguish between different keys (if you have many). The common practice is to put here your mail address or workstation name. + + The command will ask you where to store the keys. It is recommended to accept the default path $HOME/.ssh/id_rsa. Just press **Enter** for that. You will be warned if a key is already present in the specified file; you can either overwrite it by the new one, or stop generation and use the old key. + + If you want to be on the safe side, enter password to encrypt the private key. You will be asked to enter this password each time you use that key (e.g. access a remote Git repository), unless you use the tool that caches the key (like TortoiseGit). If you do not want to bother, enter an empty string. + + On Windows, make sure to note the complete path to the generated files (the location of your $HOME might be not obvious). Two key files will be created in the specified location (by default in $HOME/.ssh/): + + * *id_rsa* -- private key + * *id_rsa.pub* -- public key + + The content of the public key file (one text line) is the key to be added to the user account on the site (see below). + +@subsubsection occt_gitguide_3_2_3 Generating key with Git GUI + + GitGUI (standard GUI interface included with Git) provides the option + to either generate the SSH key (if not present yet) or show the existing one. + Click Help/Show SSH key and copy the public key content for adding to the user account page (see below). + +@subsection occt_gitguide_3_3 Adding public key in your account + +Log in on the portal https://dev.opencascade.org and click on **My account** link to the right. If you have a Contributor status, you will see **SSH keys** tab to the right. + +Click on that tab, then click **Add a public key**, and paste the text of the public key (see above sections on how to generate the key) into the text box. + +Click **Save** to input the key to the system. + + Note that a user can have several SSH keys. + You can distinguish between these keys by the Title field ID; by default it is taken from SSH key comment. + It is typical to use your e-mail address or workstation name for this field; no restrictions are set by the portal. + + + **Note** that some time (5-10 min) is needed for the system + to update the configuration after the new key is added. + After that time, you can try accessing Git. + +@section occt_gitguide_4 Work with repository: developer operations + +@subsection occt_gitguide_4_1 General workflow + + To start working with OCCT source repository, you need to create its clone in your local system. + This cloned repository will manage your working copy of the sources + and provide you the means to exchange code between your clone and the origin. + + In most cases it is sufficient to have one clone of the repository; + your working copy will be updated automatically by Git when you switch branches. + + The typical development cycle for an issue is as follows: + + * Create a new branch for your development, basing on the selected version of the sources + (usually the current master) and switch your working copy to it + * Develop and test your change. + * Do as many commits in your branch as you feel convenient; + the general recommendation is to commit every stable state (even incomplete), to record the history of your development. + * Push your branch to the repository when your development is complete or when you need to share it with other people (e.g. for review) + * Before the first push, rebase your local branch on the latest master; + consider collapsing the history in one commit unless you think the history of your commits is interesting for others. + Make sure to provide a good commit message. + * Do not amend the commits that have been already pushed in the remote repository, + If you need to rebase your branch, commit the rebased branch under a different name, and remove the old branch. + + You can switch to another branch at any moment + (unless you have some uncommitted changes in the working copy) + and return back to the branch when necessary (e.g. to take into account review remarks). + Note that only the sources that are different between the switched branches will be modified, + thus required recompilation should be reasonably small in most cases. + +@subsection occt_gitguide_4_2 Cloning official repository + + Clone the official OCCT repository in one of following ways: + + * From command line by command: + +~~~~~ + > git clone gitolite@git.dev.opencascade.org:occt +~~~~~ + + where \ is the path to the new folder which will be created for the repository. + + * In TortoiseGit: create a new folder, open it and right-click in the Explorer window, then choose **Git Clone** in the context menu: + +@figure{OCCT_GitGuide_V2_image009.png,"",320} + + If you have chosen Putty as SSH client during TortoiseGit installation, check the **Load Putty Key** option and specify the location of the private key file saved by PuttyGen (see 3.2.1). This shall be done for the first time only. + + Note that on the first connection to the repository server you may be requested to enter a password for your private SSH key; further you can get a message that the authenticity of the host cannot be established and will be asked if you want to continue connecting or not. Choose **Yes** to continue. The host’s key will be stored in $HOME/.ssh/known_hosts file. + +@subsection occt_gitguide_4_3 Branch creation + + You need to create a branch when you are going to start development of a new change, + apply a patch, etc. It is recommended to fetch updates from the remote repository + before this operation, to make sure you work with the up-to-date version. + + Create a branch from the current master branch unless you need to base your development on a particular version or revision. + +In the console: + +~~~~~ + > git checkout -b CR12345 origin/master +~~~~~ + +In TortoiseGit: + * Go to the local copy of the repository. + * Right-click in the Explorer window, then choose **Git Create Branch**. + * Select **Base On** Branch *remotes/origin/master*. + +@figure{OCCT_GitGuide_V2_image012.png,"",320} + + Check option **Switch to new branch** if you are going to start working with the newly created branch immediately. + +@subsection occt_gitguide_4_4 Branch switching + + If you need to switch to another branch, use Git command checkout for that. + In the console: + +~~~~~ + > git checkout CR12345 +~~~~~ + + In TortoiseGit: right-click in the explorer window and select in the context menu **TortoiseGit** -> **Switch/Checkout**. + +@figure{OCCT_GitGuide_V2_image013.png,"",320} + + Note that in order to work with the branch locally you need to set option + **Create new branch** when you checkout the branch from the remote repository for the first time. + Option **Track** stores association between the local branch and the original branch in a remote repository. + +@subsection occt_gitguide_4_5 Committing branch changes + + Commit your changes locally as soon as a stable status of the work is reached. + Make sure to review carefully the committed changes beforehand to avoid unintentional commit of a wrong code. + + * In the console: + +~~~~~ + > git diff + … + > git commit -a -m "Write meaningful commit message here" +~~~~~ + + Option -a tells the command to automatically include (stage) files + that have been modified or deleted, but it will omit the new files that might have been added by you. + To commit such new files, you must add (stage) them before commit command. + + To find new unstaged files and them to commit, use commands: + +~~~~~ + > git status -s + ?? file1.hxx + ?? file2.cxx + > git add file1.hxx file2.cxx +~~~~~ + + * In TortoiseGit: right-click in the explorer window and select in the context menu Git Commit -> CR…: + +@figure{OCCT_GitGuide_V2_image014.png,"",320} + + Unstaged files will be shown if you check the option ‘Show Unversioned Files’. + Double-click on each modified file to see the changes to be committed (as a difference vs. the base version). + +@subsection occt_gitguide_4_6 Pushing branch to the remote repository + + When the code developed in your local branch is ready for review, + or you need to share it with others, push your local changes to the remote repository. + + * In the console: + +~~~~~ + > git push "origin" CR12345:CR12345 +~~~~~ + + * In TortoiseGit: right-click in the explorer window and select in the context menu, TortoiseGit -> **Push** + +@figure{OCCT_GitGuide_V2_image015.png,"",320} + +Note that Git forbids pushing a branch if the corresponding remote branch already exists and has some changes, which are not in the history of your local branch. This may happen in different situations: + * You have amended the last commit which is already in the remote repository. If you are sure that nobody else uses your branch, push again with **Force** option. + * You have rebased your branch, so that now it is completely different from the branch in the remote repository. In this case, push it under a different name (add a suffix): + +@figure{OCCT_GitGuide_V2_image016.png,"",320} + + Then remove the original remote branch so that other people recognize that it has been replaced by the new one. For that, select TortoiseGit -> **Push** again, select an empty line for your local branch name, + and enter the name of the branch to be removed in **Remote** field: + + * The other developer has committed some changes in the remote branch. In this case, **Pull** changes from the remote repository to have them merged with your version, and push your branch after it is successfully merged. + +@subsection occt_gitguide_4_7 Synchronizing with remote repository + + Maintain your repository synchronized with the remote one and clean unnecessary stuff regularly. + + Use Git command *fetch* with option *prune* to get the update of all branches from the remote repository and to clean your local repository from the remote branches that have been deleted. + + * In the console: +~~~~~ + > git fetch --prune +~~~~~ + + * In TortoiseGit: right-click in the explorer window and select in the context menu **TortoiseGit** -> **Fetch**. Check in **Prune** check-box. + +@figure{OCCT_GitGuide_V2_image018.png,"",320} + + If the branch you are working with has been changed in the remote repository, use Git command *pull* to get the remote changes and merge them with your local branch. + + This operation is required in particular to update your local master branch when the remote master changes. + + * In console: +~~~~~ + > git pull +~~~~~ + + * In TortoiseGit: right-click in the explorer window and select in the context menu **TortoiseGit** -> **Pull**. + +@figure{OCCT_GitGuide_V2_image019.png,"",320} + +Note that the local branches of your repository are the primary place, where your changes are stored until they get integrated to the official version of OCCT (master branch). The branches submitted to official repository are for collaborative work, review, and integration -- that repository should not be used for long-term storage of incomplete changes. + +Remove the local branches that you do not need any more. Note that you cannot delete the current branch. It means that you need to switch to another one (e.g. master) if the branch you are going to delete is the current one. + + * In the console: +~~~~~ + > git branch -d CR12345 +~~~~~ + + * In TortoiseGit: right-click in the explorer window and select in the context menu **TortoiseGit** -> **Git Show Log**. + +@figure{OCCT_GitGuide_V2_image020.png,"",420} + + Select **All branches** check-box to view all branches. + Right-click on the branch you want to delete and select **Delete** item in the context menu. + +Note that many functions described above can be accessed from the Log View, which is a very convenient tool to visualize and manage branches. + +@subsection occt_gitguide_4_8 Applying a fix made on older version of OCCT + +If you have a fix made on a previous version of OCCT, perform the following sequence of operations to prepare it for testing and integration to the current development version: + * Identify the version of OCCT on which the fix has been made. In most cases, this will be an OCCT release, e.g. OCCT 6.7.0. + * Find a tag or a commit corresponding to this version in the Git history log of the master branch. + * Create a branch basing on this tag or commit. In TortoiseGit history log: right-click on the base commit, then select **Create branch at this version**. + +@figure{OCCT_GitGuide_V2_image021.png,"",320} + + * Check option **Switch to the new branch** to start working within the new branch immediately, or switch to it separately afterwards. + * Put your fix in the working copy, build and check that it works, then commit to the branch. + * Rebase the branch on the current master. In TortoiseGit: right-click on the working directory, choose **TortoiseGit** -> **Rebase**, select *remotes/origin/master* as UpStream revision, and click **Start**: + +@figure{OCCT_GitGuide_V2_image022.png,"",320} + +Note that you can get some conflicts during rebase. To resolve them, double-click on each conflicted file (highlighted by red in the file list) to open visual merge tool. Switch between conflicting fragments by red arrows, and for each one decide if the code of one or both conflicting versions is to be taken. + +@subsection occt_gitguide_4_9 Rebasing with history clean-up + +At some moments you might need to rebase your branch on the latest version of the master. + +We recommend rebasing before the first submission of the branch for review or when the master has diverged substantially from your branch. + +Rebasing is a good occasion to clean-up the history of commits in the branch. Consider collapsing (squashing, in terms of Git) the history of your branch into a single commit unless you deem that having separate commits is important for your future work with the branch or its code reviewing. Git also allows changing the order of commits, edit commit contents and messages, etc. + +To rebase your branch into a single commit, you need to do the following: + * Switch to your branch (e.g. “CR12345â€) + * In TortoiseGit history log, select a branch to rebase on (remotes/origin/master) and in the context menu choose **Rebase “CR12345†onto this**. + * In the **Rebase** dialog, check **Squash All**. You can also change the order of commits and define for each commit whether it should be kept (**Pick**), edited, or just skipped. + +@figure{OCCT_GitGuide_V2_image023.png,"",320} + + * Click **Start**. + * The process will stop if a conflict is detected. In that case, find files with status **Conflicted** in the list (marked by red), and double-click on them to resolve the conflict. When all conflicts are resolved, click **Continue**. + +@figure{OCCT_GitGuide_V2_image024.png,"",320} + + * At the end of the process, edit the final commit message (it should start from the issue ID and a description from Mantis in the first line, followed by a summary of actual changes), and click **Commit**. + +@figure{OCCT_GitGuide_V2_image025.png,"",320} + +@section occt_gitguide_5 Work with repository: Reviewer operations + +@subsection occt_gitguide_5_1 Review branch changes using GitWeb + + The changes made in the branch can be reviewed without direct access to Git, using GitWeb interface: + + * Open GitWeb in your web browser: https://git.dev.opencascade.org/gitweb/?p=occt.git + * Locate the branch you want to review among **heads** (click ‘…’ at the bottom of the page to see the full list). + * Click **log** (or **shortlog**) to see the history of the branch. + + **Note** that the branch can contain more than one commit, and you need to distinguish commits that belong to that branch (those to be reviewed) from the commits corresponding to the previous state of the master branch. Normally the first commit in the list that starts from the ID of the other issue indicates the branching point; commits above it are the ones to be reviewed. + + * Click **commitdiff** on each log entry to review the changes (highlighted with color format). + +@subsection occt_gitguide_5_2 Review branch changes with TortoiseGit + + Use of TortoiseGit is recommended for convenient code review: + + * Fetch the changes from the remote repository as described in @ref occt_gitguide_4_7 "Synchronizing with remote repository" section. + * Right-click on the repository, choose **TortoiseGit** -> **Show** log; + * Locate the remote branch you need to review; + * To review commits one-by-one, select each commit in the log. The list of changed files is shown at the bottom of the window; double-click on the file will open visual compare tool. + * To review all changes made in the branch at once, or to compare two arbitrary revisions, select the corresponding commits in the log (e.g. the last commit in the branch and the branching point), ight-click for the context menu, and choose **Compare revisions**. + +@figure{OCCT_GitGuide_V2_image026.png,"",320} + + Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image007.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image007.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image009.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image009.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image012.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image012.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image013.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image013.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image014.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image014.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image015.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image015.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image016.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image016.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image018.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image018.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image019.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image019.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image020.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image020.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image021.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image021.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image022.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image022.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image023.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image023.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image024.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image024.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image025.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image025.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image026.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_image026.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_svgdiff.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/git_guide/images/OCCT_GitGuide_V2_svgdiff.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/contribution/tests/images/tests_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/contribution/tests/images/tests_image001.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/contribution/tests/tests.md opencascade-7.5.1+dfsg1/dox/contribution/tests/tests.md --- opencascade-7.4.1+dfsg1/dox/contribution/tests/tests.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/contribution/tests/tests.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1470 @@ + Automated Testing System {#occt_contribution__tests} +====================================== + +@tableofcontents + +@section testmanual_intro Introduction + +This document provides OCCT developers and contributors with an overview and practical guidelines for work with OCCT automatic testing system. + +Reading the Introduction should be sufficient for developers to use the test system to control non-regression of the modifications they implement in OCCT. Other sections provide a more in-depth description of the test system, required for modifying the tests and adding new test cases. + +@subsection testmanual_intro_basic Basic Information + +OCCT automatic testing system is organized around @ref occt_user_guides__test_harness "DRAW Test Harness", a console application based on Tcl (a scripting language) interpreter extended by OCCT-related commands. + +Standard OCCT tests are included with OCCT sources and are located in subdirectory *tests* of the OCCT root folder. Other test folders can be included in the test system, e.g. for testing applications based on OCCT. + +The tests are organized in three levels: + + * Group: a group of related test grids, usually testing a particular OCCT functionality (e.g. blend); + * Grid: a set of test cases within a group, usually aimed at testing some particular aspect or mode of execution of the relevant functionality (e.g. buildevol); + * Test case: a script implementing an individual test (e.g. K4). + +See @ref testmanual_5_1 "Test Groups" chapter for the current list of available test groups and grids. + +@note Many tests involve data files (typically CAD models) which are located separately and (except a few) are not included with OCCT code. +These tests will be skipped if data files are not available. + +@subsection testmanual_1_2 Intended Use of Automatic Tests + +Each modification made in OCCT code must be checked for non-regression +by running the whole set of tests. The developer who makes the modification +is responsible for running and ensuring non-regression for the tests available to him. + +Note that many tests are based on data files that are confidential and thus available only at OPEN CASCADE. +The official certification testing of each change before its integration to master branch of official OCCT Git repository (and finally to the official release) is performed by OPEN CASCADE to ensure non-regression on all existing test cases and supported platforms. + +Each new non-trivial modification (improvement, bug fix, new feature) in OCCT should be accompanied by a relevant test case suitable for verifying that modification. This test case is to be added by the developer who provides the modification. + +If a modification affects the result of an existing test case, either the modification should be corrected (if it causes regression) or the affected test cases should be updated to account for the modification. + +The modifications made in the OCCT code and related test scripts should be included in the same integration to the master branch. + +@subsection testmanual_1_3 Quick Start + +@subsubsection testmanual_1_3_1 Setup + +Before running tests, make sure to define environment variable *CSF_TestDataPath* pointing to the directory containing test data files. + +For this it is recommended to add a file *DrawAppliInit* in the directory which is current at the moment of starting DRAWEXE (normally it is OCCT root directory, $CASROOT ). This file is evaluated automatically at the DRAW start. + +Example (Windows) + +~~~~~{.tcl} +set env(CSF_TestDataPath) $env(CSF_TestDataPath)\;d:/occt/test-data +~~~~~ + +Note that variable *CSF_TestDataPath* is set to default value at DRAW start, pointing at the folder $CASROOT/data. +In this example, subdirectory d:/occt/test-data is added to this path. Similar code could be used on Linux and Mac OS X except that on non-Windows platforms colon ":" should be used as path separator instead of semicolon ";". + +All tests are run from DRAW command prompt (run *draw.bat* or *draw.sh* to start it). + +@subsubsection testmanual_1_3_2 Running Tests + +To run all tests, type command *testgrid* + +Example: + +~~~~~ +Draw[]> testgrid +~~~~~ + +To run only a subset of test cases, give masks for group, grid, and test case names to be executed. +Each argument is a list of file masks separated with commas or spaces; by default "*" is assumed. + +Example: + +~~~~~ +Draw[]> testgrid bugs caf,moddata*,xde +~~~~~ + +As the tests progress, the result of each test case is reported. +At the end of the log a summary of test cases is output, +including the list of detected regressions and improvements, if any. + + +Example: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} + Tests summary + + CASE 3rdparty export A1: OK + ... + CASE pipe standard B1: BAD (known problem) + CASE pipe standard C1: OK + No regressions + Total cases: 208 BAD, 31 SKIPPED, 3 IMPROVEMENT, 1791 OK + Elapsed time: 1 Hours 14 Minutes 33.7384512019 Seconds + Detailed logs are saved in D:/occt/results_2012-06-04T0919 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The tests are considered as non-regressive if only OK, BAD (i.e. known problem), and SKIPPED (i.e. not executed, typically because of lack of a data file) statuses are reported. See @ref testmanual_details_results "Interpretation of test results" for details. + +The results and detailed logs of the tests are saved by default to a new subdirectory of the subdirectory *results* in the current folder, whose name is generated automatically using the current date and time, prefixed by Git branch name (if Git is available and current sources are managed by Git). +If necessary, a non-default output directory can be specified using option -outdir followed by a path to the directory. This directory should be new or empty; use option -overwrite to allow writing results in the existing non-empty directory. + +Example: +~~~~~ +Draw[]> testgrid -outdir d:/occt/last_results -overwrite +~~~~~ +In the output directory, a cumulative HTML report summary.html provides links to reports on each test case. An additional report in JUnit-style XML format can be output for use in Jenkins or other continuous integration system. + +To re-run the test cases, which were detected as regressions on the previous run, option -regress dirname should be used. +dirname is a path to the directory containing the results of the previous run. Only the test cases with *FAILED* and *IMPROVEMENT* statuses will be tested. + +Example: +~~~~~ +Draw[]> testgrid -regress d:/occt/last_results +~~~~~ + +Type help testgrid in DRAW prompt to get help on options supported by *testgrid* command: + +~~~~~ +Draw[3]> help testgrid +testgrid: Run all tests, or specified group, or one grid + Use: testgrid [groupmask [gridmask [casemask]]] [options...] + Allowed options are: + -parallel N: run N parallel processes (default is number of CPUs, 0 to disable) + -refresh N: save summary logs every N seconds (default 60, minimal 1, 0 to disable) + -outdir dirname: set log directory (should be empty or non-existing) + -overwrite: force writing logs in existing non-empty directory + -xml filename: write XML report for Jenkins (in JUnit-like format) + -beep: play sound signal at the end of the tests + -regress dirname: re-run only a set of tests that have been detected as regressions on the previous run. + Here "dirname" is a path to the directory containing the results of the previous run. + Groups, grids, and test cases to be executed can be specified by the list of file + masks separated by spaces or commas; default is all (*). +~~~~~ + +@subsubsection testmanual_1_3_3 Running a Single Test + +To run a single test, type command *test* followed by names of group, grid, and test case. + +Example: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} + Draw[1]> test blend simple A1 + CASE blend simple A1: OK + Draw[2]> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Note that normally an intermediate output of the script is not shown. The detailed log of the test can be obtained after the test execution by running command "dlog get". + +To see intermediate commands and their output during the test execution, add one more argument +"echo" at the end of the command line. Note that with this option the log is not collected and summary is not produced. + +Type help test in DRAW prompt to get help on options supported by *test* command: + +~~~~~ +Draw[3]> help test +test: Run specified test case + Use: test group grid casename [options...] + Allowed options are: + -echo: all commands and results are echoed immediately, + but log is not saved and summary is not produced + It is also possible to use "1" instead of "-echo" + If echo is OFF, log is stored in memory and only summary + is output (the log can be obtained with command "dlog get") + -outfile filename: set log file (should be non-existing), + it is possible to save log file in text file or + in html file(with snapshot), for that "filename" + should have ".html" extension + -overwrite: force writing log in existing file + -beep: play sound signal at the end of the test + -errors: show all lines from the log report that are recognized as errors + This key will be ignored if the "-echo" key is already set. +~~~~~ + +@subsubsection testmanual_intro_quick_create Creating a New Test + +The detailed rules of creation of new tests are given in @ref testmanual_3 "Creation and modification of tests" chapter. The following short description covers the most typical situations: + +Use prefix bug followed by Mantis issue ID and, if necessary, additional suffixes, for naming the test script, data files, and DRAW commands specific for this test case. + +1. If the test requires C++ code, add it as new DRAW command(s) in one of files in *QABugs* package. +2. Add script(s) for the test case in the subfolder corresponding to the relevant OCCT module of the group *bugs* ($CASROOT/tests/bugs). See @ref testmanual_5_2 "the correspondence map". +3. In the test script: + * Load all necessary DRAW modules by command *pload*. + * Use command *locate_data_file* to get a path to data files used by test script. (Make sure to have this command not inside catch statement if it is used.) + * Use DRAW commands to reproduce the tested situation. + * Make sure that in case of failure the test produces a message containing word "Error" or other recognized by the test system as error (add new error patterns in file parse.rules if necessary). + * If the test case reports error due to an existing problem and the fix is not available, add @ref testmanual_3_6 "TODO" statement for each error to mark it as a known problem. The TODO statements must be specific so as to match the actually generated messages but not all similar errors. + * To check expected output which should be obtained as the test result, add @ref testmanual_3_7 "REQUIRED" statement for each line of output to mark it as required. + * If the test case produces error messages (contained in parse.rules), which are expected in that test and should not be considered as its failure (e.g. test for *checkshape* command), add REQUIRED statement for each error to mark it as required output. +4. To check whether the data files needed for the test are already present in the database, use DRAW command *testfile* (see below). + If the data file is already present, use it for a new test instead of adding a duplicate. + If the data file(s) are not yet present in the test database, put them to a folder and add it to the environment variable *CSF_TestDataPath* to be found by the test system. + The location of the data files, which need to be accessed by OCC team and put to the official database, should be provided in the comment to Mantis issue, clearly indicating how the names of the files used by the test script match the actual names of the files. + The simplest way is to attach the data files to the Mantis issue, with the same names as used by the test script. +5. Check that the test case runs as expected (test for fix: OK with the fix, FAILED without the fix; test for existing problem: BAD), and integrate it to the Git branch created for the issue. + +Example: + +* Added files: + +~~~~~ +git status -short +A tests/bugs/heal/data/bug210_a.brep +A tests/bugs/heal/data/bug210_b.brep +A tests/bugs/heal/bug210_1 +A tests/bugs/heal/bug210_2 +~~~~~ + +* Test script + +~~~~~{.tcl} +puts "OCC210 (case 1): Improve FixShape for touching wires" + +restore [locate_data_file bug210_a.brep] a + +fixshape result a 0.01 0.01 +checkshape result +~~~~~ + +DRAW command *testfile* should be used to check the data files used by the test for possible duplication of content or names. +The command accepts the list of paths to files to be checked (as a single argument) and gives a conclusion on each of the files, for instance: + +~~~~~ +Draw[1]> testfile [glob /my/data/path/bug12345*] +Collecting info on test data files repository... +Checking new file(s)... + +* /my/data/path/bug12345.brep: duplicate + already present under name bug28773_1.brep + --> //server/occt_tests_data/public/brep/bug28773_1.brep + +* /my/data/path/cadso.brep: new file + Warning: DOS encoding detected, consider converting to + UNIX unless DOS line ends are needed for the test + Warning: shape contains triangulation (946 triangles), + consider removing them unless they are needed for the test! + BREP size=201 KiB, nbfaces=33, nbedges=94 -> private + +* /my/data/path/case_8_wire3.brep: already present + --> //server/occt_tests_data/public/brep/case_8_wire3.brep + +* /my/data/path/case_8_wire4.brep: error + name is already used by existing file + --> //server/occt_tests_data/public/brep/case_8_wire4.brep +~~~~~ + +@section testmanual_2 Organization of Test Scripts + +@subsection testmanual_2_1 General Layout + +Standard OCCT tests are located in subdirectory tests of the OCCT root folder ($CASROOT). + +Additional test folders can be added to the test system by defining environment variable *CSF_TestScriptsPath*. This should be list of paths separated by semicolons (*;*) on Windows +or colons (*:*) on Linux or Mac. Upon DRAW launch, path to *tests* subfolder of OCCT is added at the end of this variable automatically. + +Each test folder is expected to contain: + * Optional file *parse.rules* defining patterns for interpretation of test results, common for all groups in this folder + * One or several test group directories. + +Each group directory contains: + + * File *grids.list* that identifies this test group and defines list of test grids in it. + * Test grids (sub-directories), each containing set of scripts for test cases, and optional files *cases.list*, *parse.rules*, *begin* and *end*. + * Optional sub-directory data + +By convention, names of test groups, grids, and cases should contain no spaces and be lower-case. +The names *begin, end, data, parse.rules, grids.list* and *cases.list* are reserved. + +General layout of test scripts is shown in Figure 1. + +@figure{/contribution/tests/images/tests_image001.png,"Layout of tests folder",400} + + +@subsection testmanual_2_2 Test Groups + +@subsubsection testmanual_2_2_1 Group Names + +The names of directories of test groups containing systematic test grids correspond to the functionality tested by each group. + +Example: + +~~~~~ + caf + mesh + offset +~~~~~ + +Test group *bugs* is used to collect the tests coming from bug reports. Group *demo* collects tests of the test system, DRAW, samples, etc. + +@subsubsection testmanual_2_2_2 File "grids.list" + +This test group contains file *grids.list*, which defines an ordered list of grids in this group in the following format: + +~~~~~~~~~~~~~~~~~ +001 gridname1 +002 gridname2 +... +NNN gridnameN +~~~~~~~~~~~~~~~~~ + +Example: + +~~~~~~~~~~~~~~~~~ + 001 basic + 002 advanced +~~~~~~~~~~~~~~~~~ + +@subsubsection testmanual_2_2_3 File "begin" + +This file is a Tcl script. It is executed before every test in the current group. +Usually it loads necessary Draw commands, sets common parameters and defines +additional Tcl functions used in test scripts. + +Example: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} + pload TOPTEST ;# load topological command + set cpulimit 300 ;# set maximum time allowed for script execution +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +@subsubsection testmanual_2_2_4 File "end" + +This file is a TCL script. It is executed after every test in the current group. Usually it checks the results of script work, makes a snap-shot of the viewer and writes *TEST COMPLETED* to the output. + +Note: *TEST COMPLETED* string should be present in the output to indicate that the test is finished without crash. + +See @ref testmanual_3 "Creation and modification of tests" chapter for more information. + +Example: +~~~~~ + if { [isdraw result] } { + checkshape result + } else { + puts "Error: The result shape can not be built" + } + puts "TEST COMPLETED" +~~~~~ + +@subsubsection testmanual_2_2_5 File "parse.rules" + +The test group may contain *parse.rules* file. This file defines patterns used for analysis of the test execution log and deciding the status of the test run. + +Each line in the file should specify a status (single word), followed by a regular expression delimited by slashes (*/*) that will be matched against lines in the test output log to check if it corresponds to this status. + +The regular expressions should follow Tcl syntax, with a special exception that "\b" is considered as word limit (Perl-style), in addition to "\y" used in Tcl. + +The rest of the line can contain a comment message, which will be added to the test report when this status is detected. + +Example: + +~~~~~ + FAILED /\b[Ee]xception\b/ exception + FAILED /\bError\b/ error + SKIPPED /Cannot open file for reading/ data file is missing + SKIPPED /Could not read file .*, abandon/ data file is missing +~~~~~ + +Lines starting with a *#* character and blank lines are ignored to allow comments and spacing. + +See @ref testmanual_details_results "Interpretation of test results" chapter for details. + +If a line matches several rules, the first one applies. Rules defined in the grid are checked first, then rules in the group, then rules in the test root directory. This allows defining some rules on the grid level with status *IGNORE* to ignore messages that would otherwise be treated as errors due to the group level rules. + +Example: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} + FAILED /\\bFaulty\\b/ bad shape + IGNORE /^Error [23]d = [\d.-]+/ debug output of blend command + IGNORE /^Tcl Exception: tolerance ang : [\d.-]+/ blend failure +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +@subsubsection testmanual_2_2_6 Directory "data" +The test group may contain subdirectory *data*, where test scripts shared by different test grids can be put. See also @ref testmanual_2_3_5 "Directory data". + +@subsection testmanual_2_3 Test Grids + +@subsubsection testmanual_2_3_1 Grid Names + +The folder of a test group can have several sub-directories (Grid 1… Grid N) defining test grids. +Each directory contains a set of related test cases. The name of a directory should correspond to its contents. + +Example: + +~~~~~ +caf + basic + bugs + presentation +~~~~~ + +Here *caf* is the name of the test group and *basic*, *bugs*, *presentation*, etc. are the names of grids. + +@subsubsection testmanual_2_3_2 File "begin" + +This file is a TCL script executed before every test in the current grid. + +Usually it sets variables specific for the current grid. + +Example: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} + set command bopfuse ;# command tested in this grid +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +@subsubsection testmanual_2_3_3 File "end" + +This file is a TCL script executed after every test in current grid. + +Usually it executes a specific sequence of commands common for all tests in the grid. + +Example: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} + vdump $imagedir/${casename}.png ;# makes a snap-shot of AIS viewer +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +@subsubsection testmanual_2_3_4 File "cases.list" + +The grid directory can contain an optional file cases.list +defining an alternative location of the test cases. +This file should contain a single line defining the relative path to the collection of test cases. + +Example: + +~~~~~ +../data/simple +~~~~~ + +This option is used for creation of several grids of tests with the same data files and operations but performed with differing parameters. The common scripts are usually located place in the common +subdirectory of the test group, data/simple for example. + +If file *cases.list* exists, the grid directory should not contain any test cases. +The specific parameters and pre- and post-processing commands +for test execution in this grid should be defined in the files *begin* and *end*. + + +@subsubsection testmanual_2_3_5 Directory "data" + +The test grid may contain subdirectory *data*, containing data files used in tests (BREP, IGES, STEP, etc.) of this grid. + +@subsection testmanual_2_4 Test Cases + +The test case is a TCL script, which performs some operations using DRAW commands +and produces meaningful messages that can be used to check the validity of the result. + +Example: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} + pcylinder c1 10 20 ;# create first cylinder + pcylinder c2 5 20 ;# create second cylinder + ttranslate c2 5 0 10 ;# translate second cylinder to x,y,z + bsection result c1 c2 ;# create a section of two cylinders + checksection result ;# will output error message if result is bad +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The test case can have any name (except for the reserved names *begin, end, data, cases.list* and *parse.rules*). +For systematic grids it is usually a capital English letter followed by a number. + +Example: + +~~~~~ + A1 + A2 + B1 + B2 +~~~~~ + +Such naming facilitates compact representation of tests execution results in tabular format within HTML reports. + + +@section testmanual_3 Creation And Modification Of Tests + +This section describes how to add new tests and update existing ones. + +@subsection testmanual_3_1 Choosing Group, Grid, and Test Case Name + +The new tests are usually added in the frame of processing issues in OCCT Mantis tracker. +Such tests in general should be added to group bugs, in the grid +corresponding to the affected OCCT functionality. See @ref testmanual_5_2 "Mapping of OCCT functionality to grid names in group bugs". + +New grids can be added as necessary to contain tests for the functionality not yet covered by existing test grids. +The test case name in the bugs group should be prefixed by the ID of the corresponding issue in Mantis (without leading zeroes) with prefix *bug*. It is recommended to add a suffix providing a hint on the tested situation. If more than one test is added for a bug, they should be distinguished by suffixes; either meaningful or just ordinal numbers. + +Example: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} + bug12345_coaxial + bug12345_orthogonal_1 + bug12345_orthogonal_2 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If the new test corresponds to a functionality already covered by the existing systematic test grid (e.g. group *mesh* for *BRepMesh* issues), this test can be added (or moved later by OCC team) to that grid. + +@subsection testmanual_3_2 Adding Data Files Required for a Test + +It is advisable to make self-contained test scripts whenever possible, so as they could be used in the environments where data files are not available. For that simple geometric objects and shapes can be created using DRAW commands in the test script itself. + +If the test requires a data file, it should be put to the directory listed in environment variable *CSF_TestDataPath*. +Alternatively, it can be put to subdirectory *data* of the test grid. +It is recommended to prefix the data file with the corresponding issue id prefixed by *bug*, e.g. *bug12345_face1.brep*, to avoid possible conflicts with names of existing data files. + +Note that when the test is integrated to the master branch, OCC team will move the data file to the data files repository, to keep OCCT sources repository clean from data files. + +When you prepare a test script, try to minimize the size of involved data model. For instance, if the problem detected on a big shape can be reproduced on a single face extracted from that shape, use only that face in the test. + + +@subsection testmanual_3_3 Adding new DRAW commands + +If the test cannot be implemented using available DRAW commands, consider the following possibilities: +* If the existing DRAW command can be extended to enable possibility required for a test in a natural way (e.g. by adding an option to activate a specific mode of the algorithm), this way is recommended. This change should be appropriately documented in a relevant Mantis issue. +* If the new command is needed to access OCCT functionality not exposed to DRAW previously, and this command can be potentially reused (for other tests), it should be added to the package where similar commands are implemented (use *getsource* DRAW command to get the package name). The name and arguments of the new command should be chosen to keep similarity with the existing commands. This change should be documented in a relevant Mantis issue. +* Otherwise the new command implementing the actions needed for this particular test should be added in *QABugs* package. The command name should be formed by the Mantis issue ID prefixed by *bug*, e.g. *bug12345*. + +Note that a DRAW command is expected to return 0 in case of a normal completion, and 1 (Tcl exception) if it is incorrectly used (e.g. a wrong number of input arguments). Thus if the new command needs to report a test error, this should be done by outputting an appropriate error message rather than by returning a non-zero value. +File names must be encoded in the script rather than in the DRAW command and passed to the DRAW command as an argument. + +@subsection testmanual_3_4 Script Implementation + +The test should run commands necessary to perform the tested operations, in general assuming a clean DRAW session. The required DRAW modules should be loaded by *pload* command, if it is not done by *begin* script. The messages produced by commands in a standard output should include identifiable messages on the discovered problems if any. + +Usually the script represents a set of commands that a person would run interactively to perform the operation and see its results, with additional comments to explain what happens. + +Example: +~~~~~ +# Simple test of fusing box and sphere +box b 10 10 10 +sphere s 5 +bfuse result b s +checkshape result +~~~~~ + +Make sure that file *parse.rules* in the grid or group directory contains a regular expression to catch possible messages indicating the failure of the test. + +For instance, for catching errors reported by *checkshape* command relevant grids define a rule to recognize its report by the word *Faulty*: + +~~~~~ +FAILED /\bFaulty\b/ bad shape +~~~~~ + +For the messages generated in the script it is recommended to use the word 'Error' in the error message. + +Example: + +~~~~~ +set expected_length 11 +if { [expr $actual_length - $expected_length] > 0.001 } { + puts "Error: The length of the edge should be $expected_length" +} +~~~~~ + +At the end, the test script should output *TEST COMPLETED* string to mark a successful completion of the script. This is often done by the *end* script in the grid. + +During execution of a test, the following Tcl variables are defined on global level: + +| Variable | Value | +|-----------|-------| +| dirname | Path to the root directory of the current set of test scripts | +| groupname | Name of the test group (subfolder of $dirname) | +| gridname | Name of the test grid (subfolder of $dirname/$gridname) | +| casename | Name of the test | +| imagedir | Path to folder where test log and other artifacts are saved | + +The test script can use some data stored in a separate file (e.g. reference results of the test execution). +Such file can be put in subfolder *data* of the test grid directory. +During execution of the test, location of such data file can be constructed using the variables listed above. + +Example: + +~~~~~ +checkresult $result $::dirname/$::groupname/$::gridname/data/${::casename}.txt +~~~~~ + +CAD models and other data files which are not going to change over time should be stored separately from the source repository. +Use Tcl procedure *locate_data_file* to get a path to such data files, instead of coding the path explicitly. +For the file to be found by that procedure, add directory that contains it into the environment variable *CSF_TestDataPath* (list of paths separated by semicolons on Windows or colons on other platforms). +The search is recursive, thus adding only root folder of a directory containing data files is sufficient. +If the file is not found, *locate_data_file* will raise exception, and the test will be reported as SKIPPED. + +Example: + +~~~~~ +stepread [locate_data_file CAROSKI_COUPELLE.step] a * +~~~~~ + +When the test needs to produce some snapshots or other artefacts, use Tcl variable *imagedir* as the location where such files should be put. +* Command *testgrid* sets this variable to the subdirectory of the results folder corresponding to the grid. +* Command *test* by default creates a dedicated temporary directory in the system temporary folder (normally the one specified by environment variable *TempDir*, *TEMP*, or *TMP*) for each execution, and sets *imagedir* to that location. + +However if variable *imagedir* is defined on the top level of Tcl interpretor, command *test* will use it instead of creating a new directory. + +Use Tcl variable *casename* to prefix all files produced by the test. +This variable is set to the name of the test case. + +The test system can recognize an image file (snapshot) and include it in HTML log and differences if its name starts with the name of the test case (use variable *casename*), optionally followed by underscore or dash and arbitrary suffix. + +The image format (defined by extension) should be *png*. + +Example: +~~~~~ +xwd $::imagedir/${::casename}.png +vdisplay result; vfit +vdump $::imagedir/${::casename}-axo.png +vfront; vfit +vdump $::imagedir/${::casename}-front.png +~~~~~ + +would produce: +~~~~~ +A1.png +A1-axo.png +A1-front.png +~~~~~ + +Note that OCCT must be built with FreeImage support to be able to produce usable images. + +In order to ensure that the test works as expected in different environments, observe the following additional rules: +* Avoid using external commands such as *grep, rm,* etc., as these commands can be absent on another system (e.g. on Windows); use facilities provided by Tcl instead. +* Do not put call to *locate_data_file* in catch statement -- this can prevent correct interpretation of the missing data file by the test system. +* Do not use commands *decho* and *dlog* in the test script, to avoid interference with use of these commands by the test system. + +@subsection testmanual_details_results Interpretation of test results + +The result of the test is evaluated by checking its output against patterns defined in the files *parse.rules* of the grid and group. + +The OCCT test system recognizes five statuses of the test execution: +* SKIPPED: reported if a line matching SKIPPED pattern is found (prior to any FAILED pattern). This indicates that the test cannot be run in the current environment; the most typical case is the absence of the required data file. +* FAILED: reported if a line matching pattern with status FAILED is found (unless it is masked by the preceding IGNORE pattern or a TODO or REQUIRED statement), or if message TEST COMPLETED or at least one of REQUIRED patterns is not found. This indicates that the test has produced a bad or unexpected result, and usually means a regression. +* BAD: reported if the test script output contains one or several TODO statements and the corresponding number of matching lines in the log. This indicates a known problem. The lines matching TODO statements are not checked against other patterns and thus will not cause a FAILED status. +* IMPROVEMENT: reported if the test script output contains a TODO statement for which no corresponding line is found. This is a possible indication of improvement (a known problem has disappeared). +* OK: reported if none of the above statuses have been assigned. This means that the test has passed without problems. + +Other statuses can be specified in *parse.rules* files, these will be classified as FAILED. + +For integration of the change to OCCT repository, all tests should return either OK or BAD status. +The new test created for an unsolved problem should return BAD. The new test created for a fixed problem should return FAILED without the fix, and OK with the fix. + +@subsection testmanual_3_6 Marking BAD cases + +If the test produces an invalid result at a certain moment then the corresponding bug should be created in the OCCT issue tracker located at https://tracker.dev.opencascade.org, and the problem should be marked as TODO in the test script. + +The following statement should be added to such a test script: +~~~~~ +puts "TODO BugNumber ListOfPlatforms: RegularExpression" +~~~~~ + +Here: +* *BugNumber* is the bug ID in the tracker. For example: #12345. +* *ListOfPlatforms* is a list of platforms, at which the bug is reproduced (Linux, Windows, MacOS, or All). Note that the platform name is custom for the OCCT test system; Use procedure *checkplatform* to get the platform name. + +Example: +~~~~~ +Draw[2]> checkplatform +Windows +~~~~~ + +* RegularExpression is a regular expression, which should be matched against the line indicating the problem in the script output. + +Example: +~~~~~ +puts "TODO #22622 Mandriva2008: Abort .* an exception was raised" +~~~~~ + +The parser checks the test output and if an output line matches the *RegularExpression* then it will be assigned a BAD status instead of FAILED. + +A separate TODO line must be added for each output line matching an error expression to mark the test as BAD. If not all TODO messages are found in the test log, the test will be considered as possible improvement. + +To mark the test as BAD for an incomplete case (when the final *TEST COMPLETE* message is missing) the expression *TEST INCOMPLETE* should be used instead of the regular expression. + +Example: + +~~~~~ +puts "TODO OCC22817 All: exception.+There are no suitable edges" +puts "TODO OCC22817 All: \\*\\* Exception \\*\\*" +puts "TODO OCC22817 All: TEST INCOMPLETE" +~~~~~ + +@subsection testmanual_3_7 Marking required output + +To check the obtained test output matches the expected results considered correct, add REQUIRED statement for each specific message. +For that, the following statement should be added to the corresponding test script: + +~~~~~ +puts "REQUIRED ListOfPlatforms: RegularExpression" +~~~~~ + +Here *ListOfPlatforms* and *RegularExpression* have the same meaning as in TODO statements described above. + +The REQUIRED statement can also be used to mask the message that would normally be interpreted as error (according to the rules defined in *parse.rules*) but should not be considered as such within the current test. + +Example: +~~~~~ +puts "REQUIRED Linux: Faulty shapes in variables faulty_1 to faulty_5" +~~~~~ + +This statement notifies test system that errors reported by *checkshape* command are expected in that test case, and test should be considered as OK if this message appears, despite of presence of general rule stating that 'Faulty' signals failure. + +If output does not contain required statement, test case will be marked as FAILED. + +@section testmanual_4 Advanced Use + +@subsection testmanual_4_1 Running Tests on Older Versions of OCCT + +Sometimes it might be necessary to run tests on the previous versions of OCCT (<= 6.5.4) that do not include this test system. This can be done by adding DRAW configuration file *DrawAppliInit* in the directory, which is current by the moment of DRAW start-up, to load test commands and to define the necessary environment. + +Note: in OCCT 6.5.3, file *DrawAppliInit* already exists in $CASROOT/src/DrawResources, new commands should be added to this file instead of a new one in the current directory. + +For example, let us assume that *d:/occt* contains an up-to-date version of OCCT sources with tests, and the test data archive is unpacked to *d:/test-data*): + +~~~~~ +set env(CASROOT) d:/occt +set env(CSF_TestScriptsPath) $env(CASROOT)/tests +source $env(CASROOT)/src/DrawResources/TestCommands.tcl +set env(CSF_TestDataPath) $env(CASROOT)/data;d:/test-data +return +~~~~~ + +Note that on older versions of OCCT the tests are run in compatibility mode and thus not all output of the test command can be captured; this can lead to absence of some error messages (can be reported as either a failure or an improvement). + +@subsection testmanual_4_2 Adding custom tests + +You can extend the test system by adding your own tests. For that it is necessary to add paths to the directory where these tests are located, and one or more additional data directories, to the environment variables *CSF_TestScriptsPath* and *CSF_TestDataPath*. The recommended way for doing this is using DRAW configuration file *DrawAppliInit* located in the directory which is current by the moment of DRAW start-up. + +Use Tcl command _path_separator to insert a platform-dependent separator to the path list. + +For example: +~~~~~ +set env(CSF_TestScriptsPath) \ + $env(TestScriptsPath)[_path_separator]d:/MyOCCTProject/tests +set env(CSF_TestDataPath) \ + d:/occt/test-data[_path_separator]d:/MyOCCTProject/data +return ;# this is to avoid an echo of the last command above in cout +~~~~~ + +@subsection testmanual_4_3 Parallel execution of tests + +For better efficiency, on computers with multiple CPUs the tests can be run in parallel mode. This is default behavior for command *testgrid* : the tests are executed in parallel processes (their number is equal to the number of CPUs available on the system). In order to change this behavior, use option parallel followed by the number of processes to be used (1 or 0 to run sequentially). + +Note that the parallel execution is only possible if Tcl extension package *Thread* is installed. +If this package is not available, *testgrid* command will output a warning message. + +@subsection testmanual_4_4 Checking non-regression of performance, memory, and visualization + +Some test results are very dependent on the characteristics of the workstation, where they are performed, and thus cannot be checked by comparison with some predefined values. These results can be checked for non-regression (after a change in OCCT code) by comparing them with the results produced by the version without this change. The most typical case is comparing the result obtained in a branch created for integration of a fix (CR***) with the results obtained on the master branch before that change is made. + +OCCT test system provides a dedicated command *testdiff* for comparing CPU time of execution, memory usage, and images produced by the tests. + +~~~~~ +testdiff dir1 dir2 [groupname [gridname]] [options...] +~~~~~ +Here *dir1* and *dir2* are directories containing logs of two test runs. + +Possible options are: +* -save \ -- saves the resulting log in a specified file ($dir1/diff-$dir2.log by default). HTML log is saved with the same name and extension .html; +* -status {same|ok|all} -- allows filtering compared cases by their status: + * *same* -- only cases with same status are compared (default); + * *ok* -- only cases with OK status in both logs are compared; + * *all* -- results are compared regardless of status; +* -verbose \ -- defines the scope of output data: + * 1 -- outputs only differences; + * 2 -- additionally outputs the list of logs and directories present in one of directories only; + * 3 -- (by default) additionally outputs progress messages; +* -image [filename] - compare images and save the resulting log in specified file ($dir1/diffimage-$dir2.log by default) +* -cpu [filename] - compare overall CPU and save the resulting log in specified file ($dir1/diffcpu-$dir2.log by default) +* -memory [filename] - compare memory delta and save the resulting log in specified file ($dir1/diffmemory-$dir2.log by default) +* -highlight_percent \ - highlight considerable (>value in %) deviations of CPU and memory (default value is 5%) + +Example: + +~~~~~ +Draw[]> testdiff results/CR12345-2012-10-10T08:00 results/master-2012-10-09T21:20 +~~~~~ + +Particular tests can generate additional data that need to be compared by *testdiff* command. +For that, for each parameter to be controlled, the test should produce the line containing keyword "COUNTER* followed by arbitrary name of the parameter, then colon and numeric value of the parameter. + +Example of test code: + +~~~~~ +puts "COUNTER Memory heap usage at step 5: [meminfo h]" +~~~~~ + +@section testmanual_5 APPENDIX + +@subsection testmanual_5_1 Test groups + +@subsubsection testmanual_5_1_1 3rdparty + +This group allows testing the interaction of OCCT and 3rdparty products. + +DRAW module: VISUALIZATION. + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| export | vexport | export of images to different formats | +| fonts | vtrihedron, vcolorscale, vdrawtext | display of fonts | + + +@subsubsection testmanual_5_1_2 blend + +This group allows testing blends (fillets) and related operations. + +DRAW module: MODELING. + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| simple | blend | fillets on simple shapes | +| complex | blend | fillets on complex shapes, non-trivial geometry | +| tolblend_simple | tolblend, blend | | +| buildevol | buildevol | | +| tolblend_buildvol | tolblend, buildevol | use of additional command tolblend | +| bfuseblend | bfuseblend | | +| encoderegularity | encoderegularity | | + +@subsubsection testmanual_5_1_3 boolean + +This group allows testing Boolean operations. + +DRAW module: MODELING (packages *BOPTest* and *BRepTest*). + +Grids names are based on name of the command used, with suffixes: +* _2d -- for tests operating with 2d objects (wires, wires, 3d objects, etc.); +* _simple -- for tests operating on simple shapes (boxes, cylinders, toruses, etc.); +* _complex -- for tests dealing with complex shapes. + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| bcommon_2d | bcommon | Common operation (old algorithm), 2d | +| bcommon_complex | bcommon | Common operation (old algorithm), complex shapes | +| bcommon_simple | bcommon | Common operation (old algorithm), simple shapes | +| bcut_2d | bcut | Cut operation (old algorithm), 2d | +| bcut_complex | bcut | Cut operation (old algorithm), complex shapes | +| bcut_simple | bcut | Cut operation (old algorithm), simple shapes | +| bcutblend | bcutblend | | +| bfuse_2d | bfuse | Fuse operation (old algorithm), 2d | +| bfuse_complex | bfuse | Fuse operation (old algorithm), complex shapes | +| bfuse_simple | bfuse | Fuse operation (old algorithm), simple shapes | +| bopcommon_2d | bopcommon | Common operation, 2d | +| bopcommon_complex | bopcommon | Common operation, complex shapes | +| bopcommon_simple | bopcommon | Common operation, simple shapes | +| bopcut_2d | bopcut | Cut operation, 2d | +| bopcut_complex | bopcut | Cut operation, complex shapes | +| bopcut_simple | bopcut | Cut operation, simple shapes | +| bopfuse_2d | bopfuse | Fuse operation, 2d | +| bopfuse_complex | bopfuse | Fuse operation, complex shapes | +| bopfuse_simple | bopfuse | Fuse operation, simple shapes | +| bopsection | bopsection | Section | +| boptuc_2d | boptuc | | +| boptuc_complex | boptuc | | +| boptuc_simple | boptuc | | +| bsection | bsection | Section (old algorithm) | + +@subsubsection testmanual_5_1_4 bugs + +This group allows testing cases coming from Mantis issues. + +The grids are organized following OCCT module and category set for the issue in the Mantis tracker. +See @ref testmanual_5_2 "Mapping of OCCT functionality to grid names in group bugs" chapter for details. + +@subsubsection testmanual_5_1_5 caf + +This group allows testing OCAF functionality. + +DRAW module: OCAFKERNEL. + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| basic | | Basic attributes | +| bugs | | Saving and restoring of document | +| driver | | OCAF drivers | +| named_shape | | *TNaming_NamedShape* attribute | +| presentation | | *AISPresentation* attributes | +| tree | | Tree construction attributes | +| xlink | | XLink attributes | + +@subsubsection testmanual_5_1_6 chamfer + +This group allows testing chamfer operations. + +DRAW module: MODELING. + +The test grid name is constructed depending on the type of the tested chamfers. Additional suffix _complex is used for test cases involving complex geometry (e.g. intersections of edges forming a chamfer); suffix _sequence is used for grids where chamfers are computed sequentially. + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| equal_dist | | Equal distances from edge | +| equal_dist_complex | | Equal distances from edge, complex shapes | +| equal_dist_sequence | | Equal distances from edge, sequential operations | +| dist_dist | | Two distances from edge | +| dist_dist_complex | | Two distances from edge, complex shapes | +| dist_dist_sequence | | Two distances from edge, sequential operations | +| dist_angle | | Distance from edge and given angle | +| dist_angle_complex | | Distance from edge and given angle | +| dist_angle_sequence | | Distance from edge and given angle | + +@subsubsection testmanual_5_1_7 de + +This group tests reading and writing of CAD data files (iges, step) to and from OCCT. + +Test cases check transfer status, shape and attributes against expected reference values. + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| iges_1, iges_2, iges_3 | igesbrep, brepiges, ReadIges, WriteIges | IGES tests | +| step_1, step_2, step_3, step_4, step_5 | stepread, stepwrite, ReadStep, WriteStep | STEP tests | + +@subsubsection testmanual_5_1_8 demo + +This group allows demonstrating how testing cases are created, and testing DRAW commands and the test system as a whole. + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| draw | getsource, restore | Basic DRAW commands | +| testsystem | | Testing system | +| samples | | OCCT samples | + + +@subsubsection testmanual_5_1_9 draft + +This group allows testing draft operations. + +DRAW module: MODELING. + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| Angle | depouille | Drafts with angle (inclined walls) | + + +@subsubsection testmanual_5_1_10 feat + +This group allows testing creation of features on a shape. + +DRAW module: MODELING (package *BRepTest*). + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| featdprism | | | +| featlf | | | +| featprism | | | +| featrevol | | | +| featrf | | | + +@subsubsection testmanual_5_1_11 heal + +This group allows testing the functionality provided by *ShapeHealing* toolkit. + +DRAW module: XSDRAW + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| fix_shape | fixshape | Shape healing | +| fix_gaps | fixwgaps | Fixing gaps between edges on a wire | +| same_parameter | sameparameter | Fixing non-sameparameter edges | +| same_parameter_locked | sameparameter | Fixing non-sameparameter edges | +| fix_face_size | DT_ApplySeq | Removal of small faces | +| elementary_to_revolution | DT_ApplySeq | Conversion of elementary surfaces to revolution | +| direct_faces | directfaces | Correction of axis of elementary surfaces | +| drop_small_edges | fixsmall | Removal of small edges | +| split_angle | DT_SplitAngle | Splitting periodic surfaces by angle | +| split_angle_advanced | DT_SplitAngle | Splitting periodic surfaces by angle | +| split_angle_standard | DT_SplitAngle | Splitting periodic surfaces by angle | +| split_closed_faces | DT_ClosedSplit | Splitting of closed faces | +| surface_to_bspline | DT_ToBspl | Conversion of surfaces to b-splines | +| surface_to_bezier | DT_ShapeConvert | Conversion of surfaces to bezier | +| split_continuity | DT_ShapeDivide | Split surfaces by continuity criterion | +| split_continuity_advanced | DT_ShapeDivide | Split surfaces by continuity criterion | +| split_continuity_standard | DT_ShapeDivide | Split surfaces by continuity criterion | +| surface_to_revolution_advanced | DT_ShapeConvertRev | Convert elementary surfaces to revolutions, complex cases | +| surface_to_revolution_standard | DT_ShapeConvertRev | Convert elementary surfaces to revolutions, simple cases | +| update_tolerance_locked | updatetolerance | Update the tolerance of shape so that it satisfy the rule: toler(face)<=toler(edge)<=toler(vertex) | + +@subsubsection testmanual_5_1_12 mesh + +This group allows testing shape tessellation (*BRepMesh*) and shading. + +DRAW modules: MODELING (package *MeshTest*), VISUALIZATION (package *ViewerTest*) + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| advanced_shading | vdisplay | Shading, complex shapes | +| standard_shading | vdisplay | Shading, simple shapes | +| advanced_mesh | mesh | Meshing of complex shapes | +| standard_mesh | mesh | Meshing of simple shapes | +| advanced_incmesh | incmesh | Meshing of complex shapes | +| standard_incmesh | incmesh | Meshing of simple shapes | +| advanced_incmesh_parallel | incmesh | Meshing of complex shapes, parallel mode | +| standard_incmesh_parallel | incmesh | Meshing of simple shapes, parallel mode | + +@subsubsection testmanual_5_1_13 mkface + +This group allows testing creation of simple surfaces. + +DRAW module: MODELING (package *BRepTest*) + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| after_trim | mkface | | +| after_offset | mkface | | +| after_extsurf_and_offset | mkface | | +| after_extsurf_and_trim | mkface | | +| after_revsurf_and_offset | mkface | | +| mkplane | mkplane | | + +@subsubsection testmanual_5_1_14 nproject + +This group allows testing normal projection of edges and wires onto a face. + +DRAW module: MODELING (package *BRepTest*) + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| Base | nproject | | + +@subsubsection testmanual_5_1_15 offset + +This group allows testing offset functionality for curves and surfaces. + +DRAW module: MODELING (package *BRepTest*) + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| compshape | offsetcompshape | Offset of shapes with removal of some faces | +| faces_type_a | offsetparameter, offsetload, offsetperform | Offset on a subset of faces with a fillet | +| faces_type_i | offsetparameter, offsetload, offsetperform | Offset on a subset of faces with a sharp edge | +| shape_type_a | offsetparameter, offsetload, offsetperform | Offset on a whole shape with a fillet | +| shape_type_i | offsetparameter, offsetload, offsetperform | Offset on a whole shape with a fillet | +| shape | offsetshape | | +| wire_closed_outside_0_005, wire_closed_outside_0_025, wire_closed_outside_0_075, wire_closed_inside_0_005, wire_closed_inside_0_025, wire_closed_inside_0_075, wire_unclosed_outside_0_005, wire_unclosed_outside_0_025, wire_unclosed_outside_0_075 | mkoffset | 2d offset of closed and unclosed planar wires with different offset step and directions of offset ( inside / outside ) | + +@subsubsection testmanual_5_1_16 pipe + +This group allows testing construction of pipes (sweeping of a contour along profile). + +DRAW module: MODELING (package *BRepTest*) + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| Standard | pipe | | + +@subsubsection testmanual_5_1_17 prism + +This group allows testing construction of prisms. + +DRAW module: MODELING (package *BRepTest*) + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| seminf | prism | | + +@subsubsection testmanual_5_1_18 sewing + +This group allows testing sewing of faces by connecting edges. + +DRAW module: MODELING (package *BRepTest*) + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| tol_0_01 | sewing | Sewing faces with tolerance 0.01 | +| tol_1 | sewing | Sewing faces with tolerance 1 | +| tol_100 | sewing | Sewing faces with tolerance 100 | + +@subsubsection testmanual_5_1_19 thrusection + +This group allows testing construction of shell or a solid passing through a set of sections in a given sequence (loft). + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| solids | thrusection | Lofting with resulting solid | +| not_solids | thrusection | Lofting with resulting shell or face | + +@subsubsection testmanual_5_1_20 xcaf + +This group allows testing extended data exchange packages. + +| Grid | Commands | Functionality | +| :---- | :----- | :------- | +| dxc, dxc_add_ACL, dxc_add_CL, igs_to_dxc, igs_add_ACL, brep_to_igs_add_CL, stp_to_dxc, stp_add_ACL, brep_to_stp_add_CL, brep_to_dxc, add_ACL_brep, brep_add_CL | | Subgroups are divided by format of source file, by format of result file and by type of document modification. For example, *brep_to_igs* means that the source shape in brep format was added to the document, which was saved into igs format after that. The postfix *add_CL* means that colors and layers were initialized in the document before saving and the postfix *add_ACL* corresponds to the creation of assembly and initialization of colors and layers in a document before saving. | + + +@subsection testmanual_5_2 Mapping of OCCT functionality to grid names in group *bugs* + +| OCCT Module / Mantis category | Toolkits | Test grid in group bugs | +| :---------- | :--------- | :---------- | +| Application Framework | PTKernel, TKPShape, TKCDF, TKLCAF, TKCAF, TKBinL, TKXmlL, TKShapeSchema, TKPLCAF, TKBin, TKXml, TKPCAF, FWOSPlugin, TKStdLSchema, TKStdSchema, TKTObj, TKBinTObj, TKXmlTObj | caf | +| Draw | TKDraw, TKTopTest, TKViewerTest, TKXSDRAW, TKDCAF, TKXDEDRAW, TKTObjDRAW, TKQADraw, DRAWEXE, Problems of testing system | draw | +| Shape Healing | TKShHealing | heal | +| Mesh | TKMesh, TKXMesh | mesh | +| Data Exchange | TKIGES | iges | +| Data Exchange | TKSTEPBase, TKSTEPAttr, TKSTEP209, TKSTEP | step | +| Data Exchange | TKSTL, TKVRML | stlvrml | +| Data Exchange | TKXSBase, TKXCAF, TKXCAFSchema, TKXDEIGES, TKXDESTEP, TKXmlXCAF, TKBinXCAF | xde | +| Foundation Classes | TKernel, TKMath | fclasses | +| Modeling_algorithms | TKGeomAlgo, TKTopAlgo, TKPrim, TKBO, TKBool, TKHLR, TKFillet, TKOffset, TKFeat, TKXMesh | modalg | +| Modeling Data | TKG2d, TKG3d, TKGeomBase, TKBRep | moddata | +| Visualization | TKService, TKV2d, TKV3d, TKOpenGl, TKMeshVS, TKNIS | vis | + + +@subsection testmanual_5_3 Recommended approaches to checking test results + +@subsubsection testmanual_5_3_1 Shape validity + +Run command *checkshape* on the result (or intermediate) shape and make sure that *parse.rules* of the test grid or group reports bad shapes (usually recognized by word "Faulty") as error. + +Example +~~~~~ +checkshape result +~~~~~ + +To check the number of faults in the shape command *checkfaults* can be used. + +Use: checkfaults shape source_shape [ref_value=0] + +The default syntax of *checkfaults* command: +~~~~~ +checkfaults results a_1 +~~~~~ + +The command will check the number of faults in the source shape (*a_1*) and compare it +with number of faults in the resulting shape (*result*). If shape *result* contains +more faults, you will get an error: +~~~~~ +checkfaults results a_1 +Error : Number of faults is 5 +~~~~~ +It is possible to set the reference value for comparison (reference value is 4): + +~~~~~ +checkfaults results a_1 4 +~~~~~ + +If number of faults in the resulting shape is unstable, reference value should be set to "-1". +As a result command *checkfaults* will return the following error: + +~~~~~ +checkfaults results a_1 -1 +Error : Number of faults is UNSTABLE +~~~~~ + +@subsubsection testmanual_5_3_2 Shape tolerance + +The maximal tolerance of sub-shapes of each kind of the resulting shape can be extracted from output of tolerance command as follows: + +~~~~~ +set tolerance [tolerance result] +regexp { *FACE +: +MAX=([-0-9.+eE]+)} $tolerance dummy max_face +regexp { *EDGE +: +MAX=([-0-9.+eE]+)} $tolerance dummy max_edgee +regexp { *VERTEX +: +MAX=([-0-9.+eE]+)} $tolerance dummy max_vertex +~~~~~ + +It is possible to use command *checkmaxtol* to check maximal tolerance of shape and compare it with reference value. + +Use: checkmaxtol shape [options...] + +Allowed options are: + * -ref -- reference value of maximum tolerance; + * -source -- list of shapes to compare with; + * -min_tol -- minimum tolerance for comparison; + * -multi_tol -- tolerance multiplier. + +The default syntax of *checkmaxtol* command for comparison with the reference value: +~~~~~ +checkmaxtol result -ref 0.00001 +~~~~~ + +There is an opportunity to compare max tolerance of resulting shape with max tolerance of source shape. +In the following example command *checkmaxtol* gets max tolerance among objects *a_1* and *a_2*. +Then it chooses the maximum value between founded tolerance and value -min_tol (0.000001) +and multiply it on the coefficient -multi_tol (i.e. 2): + +~~~~~ +checkmaxtol result -source {a_1 a_2} -min_tol 0.000001 -multi_tol 2 +~~~~~ + +If the value of maximum tolerance more than founded tolerance for comparison, the command will return an error. + +Also, command *checkmaxtol* can be used to get max tolerance of the shape: + +~~~~~ +set maxtol [checkmaxtol result] +~~~~~ + +@subsubsection testmanual_5_3_3 Shape volume, area, or length + +Use command *vprops, sprops,* or *lprops* to correspondingly measure volume, area, or length of the shape produced by the test. The value can be extracted from the result of the command by *regexp*. + +Example: +~~~~~ +# check area of shape result with 1% tolerance +regexp {Mass +: +([-0-9.+eE]+)} [sprops result] dummy area +if { abs($area - $expected) > 0.1 + 0.01 * abs ($area) } { + puts "Error: The area of result shape is $area, while expected $expected" +} +~~~~~ + +@subsubsection testmanual_5_3_4 Memory leaks + +The test system measures the amount of memory used by each test case. Considerable deviations (as well as the overall difference) in comparison with reference results can be reported by command *testdiff* (see @ref testmanual_4_4). + +To check memory leak on a particular operation, run it in a cycle, measure the memory consumption at each step and compare it with a threshold value. +The command *checktrend* (defined in *tests/bugs/begin*) can be used to analyze a sequence of memory measurements and to get a statistically based evaluation of the leak presence. + +Example: +~~~~~ +set listmem {} +for {set i 1} {$i < 100} {incr i} { + # run suspect operation + … + # check memory usage (with tolerance equal to half page size) + lappend listmem [expr [meminfo w] / 1024] + if { [checktrend $listmem 0 256 "Memory leak detected"] } { + puts "No memory leak, $i iterations" + break + } +} +~~~~~ + +@subsubsection testmanual_5_3_5 Visualization + +The following command sequence allows you to take a snapshot of the viewer, give it the name of the test case, and save in the directory indicated by Tcl variable *imagedir*. + +~~~~~ +vinit +vclear +vdisplay result +vsetdispmode 1 +vfit +vzfit +vdump $imagedir/${casename}_shading.png +~~~~~ + +This image will be included in the HTML log produced by *testgrid* command and will be checked for non-regression through comparison of images by command *testdiff*. + +Also it is possible to use command *checkview* to make a snapshot of the viewer. + +Use: checkview [options...] +Allowed options are: +* -display shapename -- displays shape with name *shapename*; +* -3d -- displays shape in 3d viewer; +* -2d [ v2d / smallview ] - displays shape in 2d viewer (the default viewer is *smallview*); +* -path PATH -- sets the location of the saved viewer screenshot; +* -vdispmode N -- sets *vdispmode* for 3d viewer (default value is 1) +* -screenshot -- makes a screenshot of already created viewer +* The procedure can check a property of shape (length, area or volume) and compare it with value *N*: + * -l [N] + * -s [N] + * -v [N] + * If the current property is equal to value *N*, the shape is marked as valid in the procedure. + * If value *N* is not given, the procedure will mark the shape as valid if the current property is non-zero. +* -with {a b c} -- displays shapes *a, b* and *c* together with the shape (if the shape is valid) +* -otherwise {d e f} -- displays shapes *d, e* and *f* instead of the shape (if the shape is NOT valid) + +Note that is required to use either option -2d or option -3d. + +Examples: +~~~~~ +checkview -display result -2d -path ${imagedir}/${test_image}.png +checkview -display result -3d -path ${imagedir}/${test_image}.png +checkview -display result_2d -2d v2d -path ${imagedir}/${test_image}.png +~~~~~ + +~~~~~ +box a 10 10 10 +box b 5 5 5 10 10 10 +bcut result b a +set result_vertices [explode result v] +checkview -display result -2d -with ${result_vertices} -otherwise { a b } -l -path ${imagedir}/${test_image}.png +~~~~~ + +~~~~~ +box a 10 10 10 +box b 5 5 5 10 10 10 +bcut result b a +vinit +vdisplay a b +vfit +checkview -screenshot -3d -path ${imagedir}/${test_image}.png +~~~~~ + +@subsubsection testmanual_5_3_6 Number of free edges + +Procedure *checkfreebounds* compares the number of free edges with a reference value. + +Use: checkfreebounds shape ref_value [options...] + +Allowed options are: + * -tol N -- used tolerance (default -0.01); + * -type N -- used type, possible values are "closed" and "opened" (default "closed"). + +~~~~~ +checkfreebounds result 13 +~~~~~ + +Option -tol N defines tolerance for command *freebounds*, which is used within command *checkfreebounds*. + +Option -type N is used to select the type of counted free edges: closed or open. + +If the number of free edges in the resulting shape is unstable, the reference value should be set to "-1". +As a result command *checkfreebounds* will return the following error: + +~~~~~ +checkfreebounds result -1 +Error : Number of free edges is UNSTABLE +~~~~~ + +@subsubsection testmanual_5_3_7 Compare numbers + +Procedure *checkreal* checks the equality of two reals with a tolerance (relative and absolute). + +Use: checkreal name value expected tol_abs tol_rel + +~~~~~ +checkreal "Some important value" $value 5 0.0001 0.01 +~~~~~ + +@subsubsection testmanual_5_3_8 Check number of sub-shapes + +Procedure *checknbshapes* compares the number of sub-shapes in "shape" with the given reference data. + +Use: checknbshapes shape [options...] + +Allowed options are: + * -vertex N + * -edge N + * -wire N + * -face N + * -shell N + * -solid N + * -compsolid N + * -compound N + * -shape N + * -t -- compares the number of sub-shapes in "shape" counting + the same sub-shapes with different location as different sub-shapes. + * -m msg -- prints "msg" in case of error + +~~~~~ +checknbshapes result -vertex 8 -edge 4 +~~~~~ + +@subsubsection testmanual_5_3_9 Check pixel color + +Command *checkcolor* can be used to check pixel color. + +Use: checkcolor x y red green blue + +where: + * x, y -- pixel coordinates; + * red green blue -- expected pixel color (values from 0 to 1). + +This procedure checks color with tolerance (5x5 area). + +Next example will compare color of point with coordinates x=100 y=100 with RGB color R=1 G=0 B=0. +If colors are not equal, procedure will check the nearest ones points (5x5 area) +~~~~~ +checkcolor 100 100 1 0 0 +~~~~~ + +@subsubsection testmanual_5_3_10 Compute length, area and volume of input shape + +Procedure *checkprops* computes length, area and volume of the input shape. + +Use: checkprops shapename [options...] + +Allowed options are: + * -l LENGTH -- command *lprops*, computes the mass properties of all edges in the shape with a linear density of 1; + * -s AREA -- command *sprops*, computes the mass properties of all faces with a surface density of 1; + * -v VOLUME -- command *vprops*, computes the mass properties of all solids with a density of 1; + * -eps EPSILON -- the epsilon defines relative precision of computation; + * -deps DEPSILON -- the epsilon defines relative precision to compare corresponding values; + * -equal SHAPE -- compares area, volume and length of input shapes. Puts error if they are not equal; + * -notequal SHAPE -- compares area, volume and length of input shapes. Puts error if they are equal. + +Options -l, -s and -v are independent and can be used in any order. Tolerance *epsilon* is the same for all options. + +~~~~~ +checkprops result -s 6265.68 +checkprops result -s -equal FaceBrep +~~~~~ + +@subsubsection testmanual_5_3_11 Parse output dump and compare it with reference values + +Procedure *checkdump* is used to parse output dump and compare it with reference values. + +Use: checkdump shapename [options...] + +Allowed options are: + * -name NAME -- list of parsing parameters (e.g. Center, Axis, etc.); + * -ref VALUE -- list of reference values for each parameter in *NAME*; + * -eps EPSILON -- the epsilon defines relative precision of computation. + +~~~~~ +checkdump result -name {Center Axis XAxis YAxis Radii} -ref {{-70 0} {-1 -0} {-1 -0} {0 -1} {20 10}} -eps 0.01 +~~~~~ + +@subsubsection testmanual_5_3_12 Compute length of input curve + +Procedure *checklength* computes length of the input curve. + +Use: checklength curvename [options...] + +Allowed options are: + * -l LENGTH -- command *length*, computes the length of the input curve with precision of computation; + * -eps EPSILON -- the epsilon defines a relative precision of computation; + * -equal CURVE -- compares the length of input curves. Puts error if they are not equal; + * -notequal CURVE -- compares the length of input curves. Puts error if they are equal. + +~~~~~ +checklength cp1 -l 7.278 +checklength res -l -equal ext_1 +~~~~~ +@subsubsection testmanual_5_3_13 Check maximum deflection, number of triangles and nodes in mesh + +Command *checktrinfo* can be used to to check the maximum deflection, as well as the number of nodes and triangles in mesh. + +Use: checktrinfo shapename [options...] + +Allowed options are: + * -tri [N] -- compares the current number of triangles in *shapename* mesh with the given reference data. + If reference value N is not given and the current number of triangles is equal to 0, procedure *checktrinfo* will print an error. + * -nod [N] -- compares the current number of nodes in *shapename* mesh with the given reference data. + If reference value N is not given and the current number of nodes is equal to 0, procedure *checktrinfo* will print an error. + * -defl [N] -- compares the current value of maximum deflection in *shapename* mesh with the given reference data. + If reference value N is not given and current maximum deflection is equal to 0, procedure *checktrinfo* will print an error. + * -max_defl N -- compares the current value of maximum deflection in *shapename* mesh with the max possible value. + * -tol_abs_tri N -- absolute tolerance for comparison of number of triangles (default value 0). + * -tol_rel_tri N -- relative tolerance for comparison of number of triangles (default value 0). + * -tol_abs_nod N -- absolute tolerance for comparison of number of nodes (default value 0). + * -tol_rel_nod N -- relative tolerance for comparison of number of nodes (default value 0). + * -tol_abs_defl N -- absolute tolerance for deflection comparison (default value 0). + * -tol_rel_defl N -- relative tolerance for deflection comparison (default value 0). + * -ref [trinfo a] -- compares deflection, number of triangles and nodes in *shapename* and *a*. + +Note that options -tri, -nod and -defl do not work together with option -ref. + +Examples: + +Comparison with some reference values: +~~~~~ +checktrinfo result -tri 129 -nod 131 -defl 0.01 +~~~~~ + +Comparison with another mesh: +~~~~~ +checktrinfo result -ref [tringo a] +~~~~~ + +Comparison of deflection with the max possible value: +~~~~~ +checktrinfo result -max_defl 1 +~~~~~ + +Check that the current values are not equal to zero: +~~~~~ +checktrinfo result -tri -nod -defl +~~~~~ + +Check that the number of triangles and the number of nodes are not equal to some specific values: +~~~~~ +checktrinfo result -tri !10 -nod !8 +~~~~~ + +It is possible to compare current values with reference values with some tolerances. +Use options -tol_\* for that. +~~~~~ +checktrinfo result -defl 1 -tol_abs_defl 0.001 +~~~~~ + diff -Nru opencascade-7.4.1+dfsg1/dox/debug/debug.md opencascade-7.5.1+dfsg1/dox/debug/debug.md --- opencascade-7.4.1+dfsg1/dox/debug/debug.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/debug/debug.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,421 @@ +Debugging tools and hints {#occt__debug} +========================= + +@tableofcontents + +@section occt_debug_intro Introduction + +This manual describes facilities included in OCCT to support debugging, and provides some hints for more efficient debug. + +@section occt_debug_macro Compiler macro to enable extended debug messages + +Many OCCT algorithms can produce extended debug messages, usually printed to cout. +These include messages on internal errors and special cases encountered, timing etc. +In OCCT versions prior to 6.8.0 most of these messages were activated by compiler macro *DEB*, enabled by default in debug builds. +Since version 6.8.0 this is disabled by default but can be enabled by defining compiler macro *OCCT_DEBUG*. + +To enable this macro on Windows when building with Visual Studio projects, edit file custom.bat and add the line: + + set CSF_DEFINES=OCCT_DEBUG + +Some algorithms use specific macros for yet more verbose messages, usually started with OCCT_DEBUG_. +These messages can be enabled in the same way, by defining corresponding macro. + +Note that some header files are modified when *OCCT_DEBUG* is enabled, hence binaries built with it enabled are not compatible with client code built without this option; this is not intended for production use. + +@section occt_debug_exceptions Calling JIT debugger on exception + +On Windows platform when using Visual Studio compiler there is a possibility to start the debugger automatically if an exception is caught in a program running OCCT. For this, set environment variable *CSF_DEBUG* to any value. Note that this feature works only if you enable OCCT exception handler in your application by calling *OSD::SetSignal()*. + +@section occt_debug_bop Self-diagnostics in Boolean operations algorithm + +In real-world applications modeling operations are often performed in a long sequence, while the user sees only the final result of the whole sequence. If the final result is wrong, the first debug step is to identify the offending operation to be debugged further. Boolean operation algorithm in OCCT provides a self-diagnostic feature which can help to do that step. + +This feature can be activated by defining environment variable *CSF_DEBUG_BOP*, which should specify an existing writeable directory. + +The diagnostic code checks validity of the input arguments and the result of each Boolean operation. When an invalid situation is detected, the report consisting of argument shapes and a DRAW script to reproduce the problematic operation is saved to the directory pointed by *CSF_DEBUG_BOP*. + +Note that this feature does not applicable for UWP build. + +@section occt_debug_call Functions for calling from debugger + +Modern interactive debuggers provide the possibility to execute application code at a program break point. This feature can be used to analyse the temporary objects available only in the context of the debugged code. OCCT provides several global functions that can be used in this way. + +Note that all these functions accept pointer to variable as void* to allow calling the function even when debugger does not recognize type equivalence or can not perform necessary type cast automatically. It is responsibility of the developer to provide the correct pointer. In general these functions are not guaranteed to work, thus use them with caution and at your own risk. + +@subsection occt_debug_call_draw Interacting with DRAW + +Open CASCADE Test Harness or @ref occt_user_guides__test_harness "DRAW" provides an extensive set of tools for inspection and analysis of OCCT shapes and geometric objects and is mostly used as environment for prototyping and debugging OCCT-based algorithms. + +In some cases the objects to be inspected are available in DRAW as results of DRAW commands. In other cases, however, it is necessary to inspect intermediate objects created by the debugged algorithm. To support this, DRAW provides a set of commands allowing the developer to store intermediate objects directly from the debugger stopped at some point during the program execution (usually at a breakpoint). + +~~~~~ +const char* Draw_Eval (const char *theCommandStr) +~~~~~ + +Evaluates a DRAW command or script. +A command is passed as a string parameter. + +~~~~~ +const char* DBRep_Set (const char* theNameStr, void* theShapePtr) +~~~~~ + +Sets the specified shape as a value of DRAW interpreter variable with the given name. +- *theNameStr* -- the DRAW interpreter variable name to set. +- *theShapePtr* -- a pointer to *TopoDS_Shape* variable. + +~~~~~ +const char* DBRep_SetComp (const char* theNameStr, void* theListPtr) +~~~~~ + +Makes a compound from the specified list of shapes and sets it as a value of DRAW interpreter variable with the given name. +- *theNameStr* -- the DRAW interpreter variable name to set. +- *theListPtr* -- a pointer to *TopTools_ListOfShape* variable. + +~~~~~ +const char* DrawTrSurf_Set (const char* theNameStr, void* theHandlePtr) +const char* DrawTrSurf_SetPnt (const char* theNameStr, void* thePntPtr) +const char* DrawTrSurf_SetPnt2d (const char* theNameStr, void* thePnt2dPtr) +~~~~~ + +Sets the specified geometric object as a value of DRAW interpreter variable with the given name. +- *theNameStr* -- the DRAW interpreter variable name to set. +- *theHandlePtr* -- a pointer to the geometric variable (Handle to *Geom_Geometry* or *Geom2d_Curve* or descendant) to be set. +- *thePntPtr* -- a pointer to the variable of type *gp_Pnt* to be set. +- *thePnt2dPtr* -- a pointer to the variable of type *gp_Pnt2d* to be set. + +All these functions are defined in *TKDraw* toolkit and return a string indicating the result of execution. + +@subsection occt_debug_call_brep Saving and dumping shapes and geometric objects + +The following functions are provided by *TKBRep* toolkit and can be used from debugger prompt: + +~~~~~ +const char* BRepTools_Write (const char* theFileNameStr, void* theShapePtr) +~~~~~ + +Saves the specified shape to a file with the given name. +- *theFileNameStr* -- the name of the file where the shape is saved. +- *theShapePtr* -- a pointer to *TopoDS_Shape* variable. + +~~~~~ +const char* BRepTools_Dump (void* theShapePtr) +const char* BRepTools_DumpLoc (void* theShapePtr) +~~~~~ + +Dumps shape or its location to cout. +- *theShapePtr* -- a pointer to *TopoDS_Shape* variable. + +The following function is provided by *TKMesh* toolkit: + +~~~~~ +const char* BRepMesh_Dump (void* theMeshHandlePtr, const char* theFileNameStr) +~~~~~ + +Stores mesh produced in parametric space to BREP file. +- *theMeshHandlePtr* -- a pointer to *Handle(BRepMesh_DataStructureOfDelaun)* variable. +- *theFileNameStr* -- the name of the file where the mesh is stored. + +The following functions are provided by *TKTopTest* toolkit: + +~~~~~ +const char* MeshTest_DrawLinks(const char* theNameStr, void* theFaceAttr) +const char* MeshTest_DrawTriangles(const char* theNameStr, void* theFaceAttr) +~~~~~ + +Sets the edges or triangles from mesh data structure of type *Handle(BRepMesh_FaceAttribute)* as DRAW interpreter variables, assigning a unique name in the form "_" to each object. +- *theNameStr* -- the prefix to use in names of objects. +- *theFaceAttr* -- a pointer to *Handle(BRepMesh_FaceAttribute)* variable. + +The following additional function is provided by *TKGeomBase* toolkit: + +~~~~~ +const char* GeomTools_Dump (void* theHandlePtr) +~~~~~ + +Dump geometric object to cout. +- *theHandlePtr* -- a pointer to the geometric variable (Handle to *Geom_Geometry* or *Geom2d_Curve* or descendant) to be set. + + +@section occt_debug_dump_json Dump OCCT objects into Json + +Many OCCT classes may dump the current state into the stream. This stream contains the information about the class field into the field value/s. +It is possible to prepare recursive dump using corresponded macro for class fields. The depth of this recursion is defined by parameter of the dump. +The object defines What parameters should be presented in the Dump. The usual way is to dump all object fields. + +@subsection occt_debug_dump_json_object Implementation in object + +Steps to prepare dump of the object into json: + +1. Create method DumpJson. The method should accept the output stream and the depth for the fields dump. +Depth, equal to zero means that only fields of this class should be dumped. Default value -1 means that whole tree of dump will be built recursively calling dump of all fields. + +2. Put into the first row of the method OCCT_DUMP_CLASS_BEGIN or OCCT_DUMP_TRANSIENT_CLASS_BEGIN (for Standard_Transient objects). +This macro appends class name into output stream. + +3. Add several macro to store field values. + +The following macro are defined to cover the object parameters into json format: + +| Name | Result in json | +| :-------------------------- | :--------| +| OCCT_DUMP_FIELD_VALUE_NUMERICAL | "field": value | +| OCCT_DUMP_FIELD_VALUE_STRING | "field": "value" | +| OCCT_DUMP_FIELD_VALUE_POINTER | "field": "pointer address" | +| OCCT_DUMP_FIELD_VALUES_DUMPED | "field": { result of field->DumpJson(...) } | +| OCCT_DUMP_FIELD_VALUES_NUMERICAL | "field": [value_1, ..., value_n] +| OCCT_DUMP_FIELD_VALUES_STRING | "field": ["value_1", ..., "value_n"] +| OCCT_DUMP_BASE_CLASS | "kind": { result of kind::DumpJson(...) } | + +@subsection occt_debug_dump_json_draw Using in DRAW + +In DRAW, key '-dumpJson' is used to dump an object. +It is implemented in 'vaspect' and 'boundingbox' commands. + +Json output for Bnd_OBB (using command 'bounding v -obb -dumpJson'): + +~~~~~ +"Bnd_OBB": { + "Center": { + "gp_XYZ": [1, 2, 3] + }, + "Axes[0]": { + "gp_XYZ:" [1, 0, 0] + }, + "Axes[1]": { + "gp_XYZ:" [0, 1, 0] + }, + "Axes[2]": { + "gp_XYZ:" [0, 0, 1] + }, + "HDims[0]": 0, + "HDims[1]": 0, + "HDims[2]": 0, + "IsAABox": 1, +} +~~~~~ + +@section occt_debug_vstudio Using Visual Studio debugger + +@subsection occt_debug_vstudio_command Command window + +Visual Studio debugger provides the Command Window (can be activated from menu View / Other Windows / Command Window), which can be used to evaluate variables and expressions interactively in a debug session (see https://msdn.microsoft.com/en-us/library/c785s0kz.aspx). Note that the Immediate Window can also be used but it has some limitations, e.g. does not support aliases. + +When the execution is interrupted by a breakpoint, you can use this window to call the above described functions in context of the currently debugged function. Note that in most cases you will need to specify explicitly context of the function by indicating the name of the DLL where it is defined. + +For example, assume that you are debugging a function, where local variable *TopoDS_Edge* *anEdge1* is of interest. +The following set of commands in the Command window will save this edge to file *edge1.brep*, then put it to DRAW variable *e1* and show it maximized in the axonometric DRAW view: + +~~~~~ +>? ({,,TKBRep.dll}BRepTools_Write)("d:/edge1.brep",(void*)&anEdge1) +0x04a2f234 "d:/edge1.brep" +>? ({,,TKDraw.dll}DBRep_Set)("e1",(void*)&anEdge1) +0x0369eba8 "e1" +>? ({,,TKDraw.dll}Draw_Eval)("donly e1; axo; fit") +0x029a48f0 "" +~~~~~ + +For convenience it is possible to define aliases to commands in this window, for instance (here ">" is prompt provided by the command window; in the Immediate window this symbol should be entered manually): + +~~~~~ +>alias deval ? ({,,TKDraw}Draw_Eval) +>alias dsetshape ? ({,,TKDraw}DBRep_Set) +>alias dsetcomp ? ({,,TKDraw}DBRep_SetComp) +>alias dsetgeom ? ({,,TKDraw}DrawTrSurf_Set) +>alias dsetpnt ? ({,,TKDraw}DrawTrSurf_SetPnt) +>alias dsetpnt2d ? ({,,TKDraw}DrawTrSurf_SetPnt2d) +>alias saveshape ? ({,,TKBRep}BRepTools_Write) +>alias dumpshape ? ({,,TKBRep}BRepTools_Dump) +>alias dumploc ? ({,,TKBRep}BRepTools_DumpLoc) +>alias dumpmesh ? ({,,TKMesh}BRepMesh_Dump) +>alias dumpgeom ? ({,,TKGeomBase}GeomTools_Dump) +~~~~~ + +Note that aliases are stored in the Visual Studio user's preferences and it is sufficient to define them once on a workstation. With these aliases, the above example can be reproduced easier (note the space symbol after alias name!): + +~~~~~ +>saveshape ("d:/edge1.brep",(void*)&anEdge1) +0x04a2f234 "d:/edge1.brep" +>dsetshape ("e1",(void*)&anEdge1) +0x0369eba8 "e1" +>deval ("donly e1; axo; fit") +0x029a48f0 "" +~~~~~ + +Note that there is no guarantee that the call will succeed and will not affect the program execution, thus use this feature at your own risk. In particular, the commands interacting with window system (such as *axo*, *vinit*, etc.) are known to cause application crash when the program is built in 64-bit mode. To avoid this, it is recommended to prepare all necessary view windows in advance, and arrange these windows to avoid overlapping with the Visual Studio window, to ensure that they are visible during debug. + +@subsection occt_debug_vstudio_watch Customized display of variables content + +Visual Studio provides a way to customize display of variables of different types in debugger windows (Watch, Autos, Locals, etc.). + +In Visual Studio 2005-2010 the rules for this display are defined in file *autoexp.dat* located in subfolder *Common7\\Packages\\Debugger* of the Visual Studio installation folder (hint: the path to that folder is given in the corresponding environment variable, e.g. *VS100COMNTOOLS* for vc10). This file contains two sections: *AutoExpand* and *Visualizer*. The following rules can be added to these sections to provide more convenient display of some OCCT data types. + +### \[AutoExpand\] section + +~~~~~ +; Open CASCADE classes +Standard_Transient=<,t> count= +Handle_Standard_Transient= count=count,d> <,t> +TCollection_AsciiString= +TCollection_HAsciiString= +TCollection_ExtendedString= +TCollection_HExtendedString= +TCollection_BaseSequence=size= curr= +TCollection_BasicMap=size= +NCollection_BaseSequence=size= curr= +NCollection_BaseList=length= +NCollection_BaseMap=size= buckets= +NCollection_BaseVector=length= +TDF_Label= tag=myTag> +TDF_LabelNode=tag= +TDocStd_Document=format= count= <,t> +TopoDS_Shape= +gp_XYZ=, , +gp_Pnt=, , +gp_Vec=, , +gp_Dir=, , +gp_XY=, +gp_Pnt2d=, +gp_Dir2d=, +gp_Vec2d=, +gp_Mat2d={,}, {,} +gp_Ax1=loc={, , } vdir={, , } +~~~~~ + +### \[Visualizer\] section + +~~~~~ +; Open CASCADE classes + +NCollection_Handle<*> { + preview ( *((($T0::Ptr*)$e.entity)->myPtr) ) + children ( (($T0::Ptr*)$e.entity)->myPtr ) +} + +NCollection_List<*> { + preview ( #( "NCollection_List [", $e.myLength, "]" ) ) + children ( #list( head: $c.myFirst, next: myNext ) : #(*($T1*)(&$e+1)) ) +} + +NCollection_Array1<*> { + preview ( #( "NCollection_Array1 [", $e.myLowerBound, "..", $e.myUpperBound, "]" ) ) + children ( #array( expr: $c.myData[$i], size: 1+$c.myUpperBound ) ) +} + +math_Vector { + preview ( #( "math_Vector [", $e.LowerIndex, "..", $e.UpperIndex, "]" ) ) + children ( #array ( expr: ((double*)($c.Array.Addr))[$i], size: 1+$c.UpperIndex ) ) +} + +TColStd_Array1OfReal { + preview ( #( "Array1OfReal [", $e.myLowerBound, "..", $e.myUpperBound, "]" ) ) + children ( #array ( expr: ((double*)($c.myStart))[$i], size: 1+$c.myUpperBound ) ) +} + +Handle_TColStd_HArray1OfReal { + preview ( #( "HArray1OfReal [", + ((TColStd_HArray1OfReal*)$e.entity)->myArray.myLowerBound, "..", + ((TColStd_HArray1OfReal*)$e.entity)->myArray.myUpperBound, "] ", + [$e.entity,x], " count=", $e.entity->count ) ) + children ( #array ( expr: ((double*)(((TColStd_HArray1OfReal*)$e.entity)->myArray.myStart))[$i], + size: 1+((TColStd_HArray1OfReal*)$e.entity)->myArray.myUpperBound ) ) +} + +TColStd_Array1OfInteger { + preview ( #( "Array1OfInteger [", $e.myLowerBound, "..", $e.myUpperBound, "]" ) ) + children ( #array ( expr: ((int*)($c.myStart))[$i], size: 1+$c.myUpperBound ) ) +} + +Handle_TColStd_HArray1OfInteger { + preview ( #( "HArray1OfInteger [", + ((TColStd_HArray1OfInteger*)$e.entity)->myArray.myLowerBound, "..", + ((TColStd_HArray1OfInteger*)$e.entity)->myArray.myUpperBound, "] ", + [$e.entity,x], " count=", $e.entity->count ) ) + children ( #array ( expr: ((int*)(((TColStd_HArray1OfInteger*)$e.entity)->myArray.myStart))[$i], + size: 1+((TColStd_HArray1OfInteger*)$e.entity)->myArray.myUpperBound ) ) +} + +Handle_TCollection_HExtendedString { + preview ( #( "HExtendedString ", [$e.entity,x], " count=", $e.entity->count, + " ", ((TCollection_HExtendedString*)$e.entity)->myString ) ) + children ( #([actual members]: [$e,!] ) ) +} + +Handle_TCollection_HAsciiString { + preview ( #( "HAsciiString ", [$e.entity,x], " count=", $e.entity->count, + " ", ((TCollection_HAsciiString*)$e.entity)->myString ) ) + children ( #([actual members]: [$e,!], + #array( expr: ((TCollection_HAsciiString*)$e.entity)->myString.mystring[$i], + size: ((TCollection_HAsciiString*)$e.entity)->myString.mylength) ) ) +} +~~~~~ + +In Visual Studio 2012 and later, visualizers can be put in a separate file in subdirectory *Visualizers*. See file *occt.natvis* for example. + +@section occt_debug_perf Performance measurement tools + +It is recommended to use specialized performance analysis tools to profile OCCT and application code. +However, when such tools are not available or cannot be used for some reason, tools provided by OSD package can be used: low-level C functions and macros defined in *OSD_PerfMeter.h* and *OSD_PerfMeter* class. + +This tool maintains an array of 100 global performance counters that can be started and stopped independently. Adding a performance counter to a function of interest allows to get statistics on the number of calls and the total execution time of the function. +* In C++ code, this can be achieved by creating local variable *OSD_PerfMeter* in each block of code to be measured. +* In C or Fortran code, use functions *perf_start_meter* and *perf_stop_meter* to start and stop the counter. + +Note that this instrumentation is intended to be removed when the profiling is completed. + +Macros provided in *OSD_PerfMeter.h* can be used to keep instrumentation code permanently but enable it only when macro *PERF_ENABLE_METERS* is defined. +Each counter has its name shown when the collected statistics are printed. + +In DRAW, use command *dperf* to print all performance statistics. + +Note that performance counters are not thread-safe. + +@section occt_debug_sanitizers Use of compiler sanitizers + +GCC and Clang compilers provide options for instrumenting the code with the tools intended for detection of run-time errors, called sanitizers. +This section provides some hints for using sanitizers for detecting possible errors in OCCT code. + +@subsection occt_debug_sanitizers_linux Linux + +Example of configuration steps for Ubuntu: + +1. In CMake configuration: + + - Use up-to-date version of the GCC or CLang compiler; make sure that if CMAKE_CXX_COMPILER is set to C++ compiler (e.g. "clang++-6.0") and CMAKE_C_COMPILER is set to C compiler (e.g. "clang-6.0") + - Ensure that CMAKE_LINKER is set to the C++ linker bundled with compiler (e.g. clang++-6.0); this is important to avoid linking problems + - For building with Address sanitizer, set CMAKE_CXX_FLAGS and CMAKE_C_FLAGS to "-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls" + - For building with Undefined Behavior sanitizer, set CMAKE_CXX_FLAGS and CMAKE_C_FLAGS to "-fsanitize=undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls" + - Set CMAKE_BUILD_TYPE to RelWithDebInfo to get more informative stack traces on errors + +2. Build as usual (make) + + Be prepared that it works much slower than normal build and consumes more disk space. + +3. Before running executable, make sure that "llvm-symbolizer" is in PATH; this is necessary to get human-readable stack traces. The tool must have exactly that name. + + If it is installed in common folder (/usr/bin or similar) with different name, one option is to create a symlink, for instance: +> sudo ln -s /usr/bin/llvm-symbolizer-6.0 /usr/bin/llvm-symbolizer + + Alternatively, add directory where actual llvm-symbolizer is located (such as /usr/lib/llvm-6.0/bin) to the PATH variable. + +4. Set environment variable to disable memory leaks detection (they seem to be reported for every global variable at exit, not much useful): +> export ASAN_OPTIONS=detect_leaks=0 + +5. Set environment variable CSF_CPULIMIT_FACTOR to reasonably large number to increase the time limits for program execution (used by OCCT tests) to compensate the performance penalty introduced by sanitizers: +> export CSF_CPULIMIT_FACTOR=20 + +6. When using UBSan, set environment variable UBSAN_OPTIONS to get stack traces: +> export UBSAN_OPTIONS=print_stacktrace=1 + +7. Run DRAW and perform tests as usual, keeping in mind that running with sanitizer is much heavier than normal build: +> ./draw.sh relwithdeb
+> Draw[]> testgrid -parallel 0 + +Note that when running tests under sanitizers, behavior may be different. +Known problems (as of CLang 6.0) are: +- Software signals (access violation etc.) are not handled +- Heap memory usage always reports zero + +@subsection occt_debug_sanitizers_windows Windows + +Though CLang toolset is available in Visual Studio 2015 and newer, sanitizer do not seem to be available out of the box (last tested with VS 2019 16.2.3). diff -Nru opencascade-7.4.1+dfsg1/dox/debug/occt.natvis opencascade-7.5.1+dfsg1/dox/debug/occt.natvis --- opencascade-7.4.1+dfsg1/dox/debug/occt.natvis 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/debug/occt.natvis 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,260 @@ + + + + [{(float)x} {(float)y}] + + + + + [{(float)cood.x} {(float)cood.y}] + + + [{(float)x} {(float)y} {(float)z}] + + + + + [{(float)coord.x} {(float)coord.y} {(float)coord.z}] + + + [{v[0]} {v[1]}] + + + [{v[0]} {v[1]} {v[2]}] + + + [{v[0]} {v[1]} {v[2]} {v[3]}] + + + + [{(float)matrix[0][0]} {(float)matrix[0][1]}], [{(float)matrix[1][0]} {(float)matrix[1][1]}] + + + + + ((NCollection_Vec4<$T1>*)myMat)[0] + ((NCollection_Vec4<$T1>*)myMat)[1] + ((NCollection_Vec4<$T1>*)myMat)[2] + ((NCollection_Vec4<$T1>*)myMat)[3] + + + + NULL + [cnt={entity->count}] + + *entity + + + + NULL + {(void*)entity} [cnt={entity->count}] + + *((NCollection_Handle<$T1>::Ptr*)entity)->myPtr + + + + NULL + {(void*)entity} [cnt={entity->count} {*entity}] + + (opencascade::handle<$T1>::element_type*)entity + + + + {mylength}: {mystring,s} + + mystring,s8 + + + + {myString.mylength}: {myString.mystring,s} + + + {myLength}: {myString,s} + + + {mylength}: {(wchar_t *)mystring,su} + + + {myString.mylength}: {(wchar_t *)myString.mystring,su} + + + TCollection_Sequence [{Size}], curr={CurrentIndex} + + + + TCollection_Map [{mySize}] + + + TColStd_PackedMapOfInteger [{myExtent}] + + + NCollection_Vector [{myLength}] + + + myData->Length + *($T1*)((char*)myData->DataPtr + $i * myItemSize) + + + myLength + *($T1*)((char*)myData->DataPtr + $i * myItemSize) + + + + + NCollection_List [{myLength}] + + + myLength + myFirst + myNext + *($T1*)(sizeof(NCollection_ListNode) + ((char *)this)) + + + + + NCollection_Sequence [{mySize}] + + + mySize + myFirstItem + myNext + *($T1*)(sizeof(NCollection_SeqNode) + ((char *)this)) + + + + + + VOID + + Center: [{(float)myCenter[0]} {(float)myCenter[1]}], hSize: [{(float)myHSize[0]} {(float)myHSize[1]}] + + + + + VOID + + Center: [{(float)myCenter[0]} {(float)myCenter[1]} {(float)myCenter[2]}], hSize: [{(float)myHSize[0]} {(float)myHSize[1]} {(float)myHSize[2]}] + + + + NULL + [:{myLabelNode->myTag}] + + *myLabelNode + + + + [:{myTag}] + + * myBrother + * myFirstChild + myFirstAttribute + + + + NULL + + [transaction={((TDF_Attribute*)entity)->myTransaction}] + + + + (TDF_Attribute*)entity + + + + [{myGlVerMajor}.{myGlVerMinor}] + + + + + empty + {{size = {myUpperBound - myLowerBound + 1}}} + + myUpperBound - myLowerBound + 1 + + myUpperBound - myLowerBound + 1 + (Standard_Integer*)(myStart) + myLowerBound + + + + + + empty + {{size = {myUpperBound - myLowerBound + 1}}} + + myUpperBound - myLowerBound + 1 + + myUpperBound - myLowerBound + 1 + (Standard_Real*)(myStart) + myLowerBound + + + + + + + empty + extent = {(myUpperColumn-myLowerColumn+1) * (myUpperRow-myLowerRow+1)} + + + + + + {{current = {myValue}}} + + + this + (TColStd_ListNodeOfListOfInteger*)myNext + this->myValue + + + + + + empty + + (TColStd_ListNodeOfListOfInteger*)(myFirst) + + + + + {{current = {myValue}}} + + + this + (TColStd_ListNodeOfListOfReal*)myNext + this->myValue + + + + + + empty + + (TColStd_ListNodeOfListOfReal*)(myFirst) + + + + + empty + + (BRep_ListNodeOfListOfCurveRepresentation*)(myFirst) + + + + + {myOrient} {myTShape} loc={myLocation} + + + + subshapes={myShapes} flags={myFlags} + + + + {{{myIndex} {myParameter}}} + + + + edge={myEdge} orig={myOriginalEdge} pave1={myPave1} pave2={myPave2} extpaves={myExtPaves} + + + diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_linux.md opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_linux.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_linux.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_linux.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,217 +0,0 @@ - Building 3rd-party libraries on Linux {#occt_dev_guides__building_3rdparty_linux} -========= - -@tableofcontents - -@section dev_guides__building_3rdparty_linux_1 Introduction - -This document presents additional guidelines for building third-party -products used by Open CASCADE Technology and samples on Linux platform. - -The links for downloading the third-party products are available on the web site -of OPEN CASCADE SAS at -https://www.opencascade.com/content/3rd-party-components. - -There are two types of third-party products, which are necessary to build OCCT: - -* Mandatory products: - * Tcl/Tk 8.5 - 8.6;   - * FreeType 2.4.10 - 2.5.3; -* Optional products: - * TBB 3.x - 4.x; - * FreeImage 3.14.1 - 3.16.0; - * VTK 6.1.0. - -@section dev_guides__building_3rdparty_linux_2 Building Mandatory Third-party Products - -@subsection dev_guides__building_3rdparty_linux_2_1 Tcl/Tk - -Tcl/Tk is required for DRAW test harness. - -@subsubsection dev_guides__building_3rdparty_linux_2_1_2 Installation from sources: Tcl - -Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. - -1. Enter the unix sub-directory of the directory where the Tcl source files are located (TCL_SRC_DIR). - - cd TCL_SRC_DIR/unix - -2. Run the *configure* command: - - configure --enable-gcc --enable-shared --enable-threads --prefix=TCL_INSTALL_DIR - - For a 64 bit platform also add --enable-64bit option to the command line. - -3. If the configure command has finished successfully, start the building process: - - make - -4. If building is finished successfully, start the installation of Tcl. - All binary and service files of the product will be copied to the directory defined by *TCL_INSTALL_DIR* - - make install - -@subsubsection dev_guides__building_3rdparty_linux_2_1_3 Installation from sources: Tk - -Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. - -1. Enter the unix sub-directory of the directory where the Tk source files are located (TK_SRC_DIR) - - cd TK_SRC_DIR/unix - -2. Run the configure command, where TCL_LIB_DIR is *TCL_INSTALL_DIR/lib*. - - configure --enable-gcc --enable-shared --enable-threads --with-tcl=TCL_LIB_DIR --prefix=TK_INSTALL_DIR - - For a 64 bit platform also add --enable-64bit option to the command line. - -3. If the configure command has finished successfully, start the building process: - - make - -4. If the building has finished successfully, start the installation of Tk. - All binary and service files of the product will be copied - to the directory defined by *TK_INSTALL_DIR* (usually it is *TCL_INSTALL_DIR*) - - make install - -@subsection dev_guides__building_3rdparty_linux_2_2 FreeType - -FreeType is required for text display in the 3D viewer. -Download the necessary archive from https://sourceforge.net/projects/freetype/files/ and unpack it. - -1. Enter the directory where the source files of FreeType are located (FREETYPE_SRC_DIR). - - cd FREETYPE_SRC_DIR - -2. Run the *configure* command: - - configure --prefix=FREETYPE_INSTALL_DIR - - For a 64 bit platform also add CFLAGS='-m64 -fPIC' CPPFLAGS='-m64 -fPIC' option to the command line. - -3. If the *configure* command has finished successfully, start the building process: - - make - -4. If the building has finished successfully, start the installation of FreeType. - All binary and service files of the product will be copied to the directory defined by *FREETYPE_INSTALL_DIR* - - make install - -@section dev_guides__building_3rdparty_linux_3 Building Optional Third-party Products - -@subsection dev_guides__building_3rdparty_linux_3_1 TBB - -This third-party product is installed with binaries from the archive that can be downloaded from https://github.com/intel/tbb. -Go to the **Download** page, find the release version you need and pick the archive for Linux platform. -To install, unpack the downloaded archive of TBB product. - -@subsection dev_guides__building_3rdparty_linux_3_3 FreeImage - -Download the necessary archive from https://sourceforge.net/projects/freeimage/files/Source%20Distribution/ -and unpack it. The directory with unpacked sources is further referred to as *FREEIMAGE_SRC_DIR*. - -1. Modify *FREEIMAGE_SRC_DIR/Source/OpenEXR/Imath/ImathMatrix.h*: - In line 60 insert the following: - - #include string.h - -2. Enter the directory where the source files of FreeImage are located (FREEIMAGE_SRC_DIR). - - cd FREEIMAGE_SRC_DIR - -3. Run the building process - - make - -4. Run the installation process - - a. If you have the permission to write into directories /usr/include and /usr/lib, run the following command: - - make install - b. If you do not have this permission, you need to modify file *FREEIMAGE_SRC_DIR/Makefile.gnu*: - - Change lines 7-9 from: - - DESTDIR ?= / - INCDIR ?= $(DESTDIR)/usr/include - INSTALLDIR ?= $(DESTDIR)/usr/lib - - to: - - DESTDIR ?= $(DESTDIR) - INCDIR ?= $(DESTDIR)/include - INSTALLDIR ?= $(DESTDIR)/lib - - Change lines 65-67 from: - - install -m 644 -o root -g root $(HEADER) $(INCDIR) - install -m 644 -o root -g root $(STATICLIB) $(INSTALLDIR) - install -m 755 -o root -g root $(SHAREDLIB) $(INSTALLDIR) - - to: - - install -m 755 $(HEADER) $(INCDIR) - install -m 755 $(STATICLIB) $(INSTALLDIR) - install -m 755 $(SHAREDLIB) $(INSTALLDIR) - - Change line 70 from:  - - ldconfig - - to: - - \#ldconfig - - Then run the installation process by the following command: - - make DESTDIR=FREEIMAGE_INSTALL_DIR install - -5. Clean temporary files - - make clean - -@subsection dev_guides__building_3rdparty_linux_3_4 VTK - -You can download VTK sources from https://www.vtk.org/VTK/resources/software.html - -### The building procedure: - -Download the necessary archive from https://www.vtk.org/VTK/resources/software.html and unpack it. - -1. Install or build *cmake* product from the source file. -2. Start *cmake* in GUI mode with the directory where the source files of *VTK* are located: - - ccmake VTK_SRC_DIR - - * Press [c] to make the initial configuration - * Define the necessary options in *VTK_INSTALL_PREFIX* - * Press [c] to make the final configuration - * Press [g] to generate Makefile and exit - -3. Start the building of VTK: - - make - -4. Start the installation of VTK. Binaries will be installed according to the *VTK_INSTALL_PREFIX* option. - - make install - -@section dev_guides__building_3rdparty_linux_4 Installation From Official Repositories - -@subsection dev_guides__building_3rdparty_linux_4_1 Debian-based distributives - -All 3rd-party products required for building of OCCT could be installed -from official repositories. You may install them from console using apt-get utility: - - sudo apt-get install tcllib tklib tcl-dev tk-dev libfreetype-dev libxt-dev libxmu-dev libxi-dev libgl1-mesa-dev libglu1-mesa-dev libfreeimage-dev libtbb-dev - -To launch binaries built with WOK you need to install C shell and 32-bit libraries on x86_64 distributives: - - # you may need to add i386 if not done already by command "dpkg --add-architecture i386" - sudo apt-get install csh libstdc++6:i386 libxt6:i386 libxext6:i386 libxmu6:i386 - -Building is possible with C++ compliant compiler: - - sudo apt-get install g++ diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_osx.md opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_osx.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_osx.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_osx.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,182 +0,0 @@ - Building 3rd-party libraries on MacOS X {#occt_dev_guides__building_3rdparty_osx} -============================================== -@tableofcontents - -@section dev_guides__building_3rdparty_osx_1 Introduction - -This document presents additional guidelines for building third-party products -used by Open CASCADE Technology and samples on Mac OS X platform (10.6.4 and later). - -The links for downloading the third-party products are available -on the web site of OPEN CASCADE SAS at https://www.opencascade.com/content/3rd-party-components. - -There are two types of third-party products, which are necessary to build OCCT: - -* Mandatory products: - * Tcl/Tk 8.5 - 8.6; - * FreeType 2.4.10 - 2.5.3. -* Optional products: - * TBB 3.x - 4.x; - * FreeImage 3.14.1 - 3.16.0 - -@section dev_guides__building_3rdparty_osx_2 Building Mandatory Third-party Products - -@subsection dev_guides__building_3rdparty_osx_2_1 Tcl/Tk 8.5 - -Tcl/Tk is required for DRAW test harness. Version 8.5 or 8.6 can be used with OCCT. - -@subsubsection dev_guides__building_3rdparty_osx_2_1_2 Installation from sources: Tcl 8.5 - -Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. - -1. Enter the *macosx* sub-directory of the directory where the Tcl source files are located (TCL_SRC_DIR). - - cd TCL_SRC_DIR/macosx - -2. Run the *configure* command - - configure --enable-gcc --enable-shared --enable-threads --prefix=TCL_INSTALL_DIR - - For a 64 bit platform also add --enable-64bit option to the command line. - -3. If the *configure* command has finished successfully, start the building process - - make - -4. If building is finished successfully, start the installation of Tcl. - All binary and service files of the product will be copied to the directory defined by *TCL_INSTALL_DIR*. - - make install - -@subsubsection dev_guides__building_3rdparty_osx_2_1_3 Installation from sources: Tk 8.5 - -Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. - -1. Enter the *macosx* sub-directory of the directory where the source files of Tk are located (TK_SRC_DIR). - - cd TK_SRC_DIR/macosx - -2. Run the *configure* command, where TCL_LIB_DIR is TCL_INSTALL_DIR/lib - - configure --enable-gcc --enable-shared --enable-threads --with-tcl=TCL_LIB_DIR --prefix=TK_INSTALL_DIR - - For a 64 bit platform also add --enable-64bit option to the command line. - -3. If the *configure* command has finished successfully, start the building process: - - make - -4. If the building has finished successfully, start the installation of Tk. All binary and service files of the product will be copied to the directory defined by *TK_INSTALL_DIR* (usually it is TCL_INSTALL_DIR) - - make install - -@subsection dev_guides__building_3rdparty_osx_2_2 FreeType 2.4.10 - -FreeType is required for text display in the 3D viewer. - -Download the necessary archive from https://sourceforge.net/projects/freetype/files/ and unpack it. - -1. Enter the directory where the source files of FreeType are located (FREETYPE_SRC_DIR). - - cd FREETYPE_SRC_DIR - -2. Run the *configure* command - - configure --prefix=FREETYPE_INSTALL_DIR - - For a 64 bit platform also add CFLAGS='-m64 -fPIC' CPPFLAGS='-m64 -fPIC' option to the command line. - -3. If the *configure* command has finished successfully, start the building process - - make - -4. If building has finished successfully, start the installation of FreeType. - All binary and service files of the product will be copied to the directory defined by *FREETYPE_INSTALL_DIR*. - - make install - -@section dev_guides__building_3rdparty_osx_3 Building Optional Third-party Products - -@subsection dev_guides__building_3rdparty_osx_3_1 TBB 3.x or 4.x - -This third-party product is installed with binaries from the archive -that can be downloaded from https://github.com/intel/tbb. -Go to the **Download** page, find the release version you need (e.g. *tbb30_018oss*) -and pick the archive for Mac OS X platform. -To install, unpack the downloaded archive of TBB 3.0 product (*tbb30_018oss_osx.tgz*). - -@subsection dev_guides__building_3rdparty_osx_3_3 FreeImage 3.14.1 or 3.15.x - -Download the necessary archive from -https://sourceforge.net/projects/freeimage/files/Source%20Distribution/ -and unpack it. The directory with unpacked sources is further referred to as *FREEIMAGE_SRC_DIR*. - -Note that for building FreeImage on Mac OS X 10.7 you should replace *Makefile.osx* -in *FREEIMAGE_SRC_DIR* by the corrected file, which you can find in attachment to issue #22811 in OCCT Mantis bug tracker -(https://tracker.dev.opencascade.org/file_download.php?file_id=6937&type=bug). - -1. If you build FreeImage 3.15.x you can skip this step. - Modify FREEIMAGE_SRC_DIR/Source/OpenEXR/Imath/ImathMatrix.h: - - In line 60 insert the following: - - #include string.h - - Modify FREEIMAGE_SRC_DIR/Source/FreeImage/PluginTARGA.cpp: - - In line 320 replace: - - SwapShort(value); - - with: - - SwapShort(&value); - -2. Enter the directory where the source files of FreeImage are located (FREEIMAGE_SRC_DIR). - - cd FREEIMAGE_SRC_DIR - -3. Run the building process - - make - -4. Run the installation process - - 1. If you have the permission to write into /usr/local/include and /usr/local/lib directories, run the following command: - - make install - - 2. If you do not have this permission, you need to modify file *FREEIMAGE_SRC_DIR/Makefile.osx*: - - Change line 49 from:    - - PREFIX ?= /usr/local - - to: - - PREFIX ?= $(PREFIX) - -   Change lines 65-69 from: - - install -d -m 755 -o root -g wheel $(INCDIR) $(INSTALLDIR) - install -m 644 -o root -g wheel $(HEADER) $(INCDIR) - install -m 644 -o root -g wheel $(SHAREDLIB) $(STATICLIB) $(INSTALLDIR) - ranlib -sf $(INSTALLDIR)/$(STATICLIB) - ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(LIBNAME) - - to: - - install -d $(INCDIR) $(INSTALLDIR) - install -m 755 $(HEADER) $(INCDIR) - install -m 755 $(STATICLIB) $(INSTALLDIR) - install -m 755 $(SHAREDLIB) $(INSTALLDIR) - ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(VERLIBNAME) - ln -sf $(VERLIBNAME) $(INSTALLDIR)/$(LIBNAME) - - Then run the installation process by the following command: - - make PREFIX=FREEIMAGE_INSTALL_DIR install - -5. Clean temporary files - - make clean diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_windows.md opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_windows.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_windows.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/3rdparty_windows.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,247 +0,0 @@ - Building 3rd-party libraries on Windows {#occt_dev_guides__building_3rdparty_windows} -============================================== -@tableofcontents - -@section dev_guides__building_3rdparty_win_1 Introduction - -This document presents guidelines for building third-party products used by Open CASCADE Technology (OCCT) and samples on Windows platform. It is assumed that you are already familiar with MS Visual Studio / Visual C++. - -You need to use the same version of MS Visual Studio for building all third-party products and OCCT itself, in order to receive a consistent set of run-time binaries. - -The links for downloading the third-party products are available on the web site of OPEN CASCADE SAS at https://www.opencascade.com/content/3rd-party-components. - -There are two types of third-party products used by OCCT: - -* Mandatory products: - * Tcl/Tk 8.5 -- 8.6; - * FreeType 2.4.10 -- 2.5.3. -* Optional products: - * TBB 3.x -- 4.x; - * FreeImage 3.14.1 -- 3.16.0; - * VTK 6.1.0. - -It is recommended to create a separate new folder on your workstation, where you will unpack the downloaded archives of the third-party products, and where you will build these products (for example, *c:\\occ3rdparty*). - -Further in this document, this folder is referred to as *3rdparty*. - -@section dev_guides__building_3rdparty_win_2 Building Mandatory Third-party Products - -@subsection dev_guides__building_3rdparty_win_2_1 Tcl/Tk - -Tcl/Tk is required for DRAW test harness. - -@subsubsection dev_guides__building_3rdparty_win_2_1_1 Installation from sources: Tcl - -Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. - -1. In the *win* sub-directory, edit file *buildall.vc.bat*: - - * Edit the line "call ... vcvars32.bat" to have correct path to the version of Visual Studio to be used for building, for instance: - - call "%VS80COMNTOOLS%\vsvars32.bat" - - If you are building 64-bit version, set environment accordingly, e.g.: - - call "%VS80COMNTOOLS%\..\..\VC\vcvarsall.bat" amd64 - - * Define variable *INSTALLDIR* pointing to directory where Tcl/Tk will be installed, e.g.: - - set INSTALLDIR=D:\OCCT\3rdparty\tcltk-86-32 - - * Add option *install* to the first command line calling *nmake*: - - nmake -nologo -f makefile.vc release htmlhelp install %1 - - * Remove second call to *nmake* (building statically linked executable) - -2. Edit file *rules.vc* replacing line - - SUFX = tsgx - - by - - SUFX = sgx - - This is to avoid extra prefix 't' in the library name, which is not recognized by default by OCCT build tools. - - -3. By default, Tcl uses dynamic version of run-time library (MSVCRT), which must be installed on the system where Tcl will be used. - You may wish to link Tcl library with static version of run-time to avoid this dependency. - For that: - - * Edit file *makefile.vc* replacing strings "crt = -MD" by "crt = -MT" - - * Edit source file *tclMain.c* (located in folder *generic*) commenting out forward declaration of function *isatty()*. - - -4. In the command prompt, run *buildall.vc.bat* - - You might need to run this script twice to have *tclsh* executable installed; check subfolder *bin* of specified installation path to verify this. - -5. For convenience of use, we recommend making a copy of *tclsh* executable created in subfolder *bin* of *INSTALLDIR* and named with Tcl version number suffix, as *tclsh.exe* (with no suffix) - - > cd D:\OCCT\3rdparty\tcltk-86-32\bin - > cp tclsh86.exe tclsh.exe - -@subsubsection dev_guides__building_3rdparty_win_2_1_2 Installation from sources: Tk - -Download the necessary archive from https://www.tcl.tk/software/tcltk/download.html and unpack it. - -Apply the same steps as described for building Tcl above, with the same INSTALLDIR. -Note that Tk produces its own executable, called *wish*. - -You might need to edit default value of *TCLDIR* variable defined in *buildall.vc.bat* (should be not necessary if you unpack both Tcl and Tk sources in the same folder). - -@subsection dev_guides__building_3rdparty_win_2_2 FreeType - -FreeType is required for text display in a 3D viewer. You can download its sources from https://sourceforge.net/projects/freetype/files/ - -### The building procedure - -1. Unpack the downloaded archive of FreeType product into the *3rdparty* folder. As a result, you will get a folder named, for example, *3rdparty\\freetype-2.4.10*. Further in this document, this folder is referred to as *freetype*. - -2. Open the solution file *freetype\\builds\\win32\\vc20xx\\freetype.sln* in Visual Studio. Here *vc20xx* stands for your version of Visual Studio. - -3. Select the configuration to build: either Debug or Release. - -4. Build the *freetype* project. - - As a result, you will get a freetype import library (.lib) in the *freetype\\obj\\win32\\vc20xx* folder. - - -5. If you build FreeType for a 64 bit platform, select in the main menu **Build - Configuration Manager** and add *x64* platform to the solution configuration by copying the settings from Win32 platform: - - @figure{/dev_guides/building/3rdparty/images/3rdparty_image001.png} - - Update the value of the Output File for x64 configuration: - - @figure{/dev_guides/building/3rdparty/images/3rdparty_image003.png} - - Build the *freetype* project. - - As a result, you will obtain a 64 bit import library (.lib) file in the *freetype\\x64\\vc20xx* folder. - - To build FreeType as a dynamic library (.dll) follow steps 6, 7 and 8 of this procedure. - -6. Open menu Project-> Properties-> Configuration Properties-> General and change option **Configuration Type** to *Dynamic Library (.dll)*. -7. Edit file *freetype\\include\\freetype\\config\\ftoption.h*: - - in line 255, uncomment the definition of macro *FT_EXPORT* and change it as follows: - - #define FT_EXPORT(x) __declspec(dllexport) x - -8. Build the *freetype* project. - - As a result, you will obtain the files of the import library (.lib) and the dynamic library (.dll) in folders freetype \\objs\\release or \\objs\\debug . - - If you build for a 64 bit platform, follow step 5 of the procedure. - - To facilitate the use of FreeType libraries in OCCT with minimal adjustment of build procedures, it is recommended to copy the include files and libraries of FreeType into a separate folder, named according to the pattern: *freetype-compiler-bitness-building mode*, where: - * **compiler** is *vc8* or *vc9* or *vc10* or *vc11*; - * **bitness** is *32* or *64*; - * **building mode** is *opt* (for Release) or *deb* (for Debug). - - The *include* subfolder should be copied as is, while libraries should be renamed to *freetype.lib* and *freetype.dll* (suffixes removed) and placed to subdirectories *lib *and *bin*, respectively. If the Debug configuration is built, the Debug libraries should be put into subdirectories *libd* and *bind*. - -@section dev_guides__building_3rdparty_win_3 Building Optional Third-party Products - -@subsection dev_guides__building_3rdparty_win_3_1 TBB - -This third-party product is installed with binaries -from the archive that can be downloaded from https://github.com/intel/tbb. -Go to the **Download** page, find the release version you need (e.g. *tbb30_018oss*) and pick the archive for Windows platform. - -Unpack the downloaded archive of TBB product into the *3rdparty* folder. - -Further in this document, this folder is referred to as *tbb*. - -@subsection dev_guides__building_3rdparty_win_3_3 FreeImage - -This third-party product should be built as a dynamically loadable library (.dll file). -You can download its sources from -https://sourceforge.net/projects/freeimage/files/Source%20Distribution/ - -### The building procedure: - -1. Unpack the downloaded archive of FreeImage product into *3rdparty* folder. - - As a result, you should have a folder named *3rdparty\\FreeImage*. - - Rename it according to the rule: *freeimage-platform-compiler-building mode*, where - - * **platform** is *win32* or *win64*; - * **compiler** is *vc8* or *vc9* or *vc10* or *vc11*; - * **building mode** is *opt* (for release) or *deb* (for debug) - - Further in this document, this folder is referred to as *freeimage*. - -2. Open the solution file *freeimage\\FreeImage.*.sln* in your Visual Studio. - - If you use a Visual Studio version higher than VC++ 2008, apply conversion of the workspace. - Such conversion should be suggested automatically by Visual Studio. - -3. Select a configuration to build. - - - Choose **Release** if you are building Release binaries. - - Choose **Debug** if you are building Debug binaries. - - *Note:* - - If you want to build a debug version of FreeImage binaries then you need to rename the following files in FreeImage and FreeimagePlus projects: - - Project -> Properties -> Configuration Properties -> Linker -> General -> Output File - - FreeImage*d*.dll to FreeImage.dll - FreeImagePlus*d*.dll to FreeImagePlus.dll - - Project -> Properties -> Configuration Properties -> Linker -> Debugging-> Generate Program Database File - - FreeImage*d*.pdb to FreeImage.pdb - FreeImagePlus*d*.pdb to FreeImagePlus.pdb - - Project -> Properties -> Configuration Properties -> Linker -> Advanced-Import Library - - FreeImage*d*.lib to FreeImage.lib - FreeImagePlus*d*.lib to FreeImagePlus.lib - - Project -> Properties -> Configuration Properties -> Build Events -> Post -> Build Event -> Command Line - - FreeImage*d*.dll to FreeImage.dll - FreeImage*d*.lib to FreeImage.lib - FreeImagePlus*d*.dll to FreeImagePlus.dll - FreeImagePlus*d*.lib to FreeImagePlus.lib - - Additionally, rename in project FreeImagePlus - - Project -> Properties -> Configuration Properties -> Linker -> Input -> Additional Dependencies - - from FreeImage*d*.lib to FreeImage.lib - -4. Select a platform to build. - - - Choose *Win32* if you are building for a 32 bit platform. - - Choose *x64* if you are building for a 64 bit platform. - -5. Start the building process. - - As a result, you should have the library files of FreeImage product in *freeimage\\Dist* folder (*FreeImage.dll* and *FreeImage.lib*) and in *freeimage\\Wrapper\\FreeImagePlus\\dist* folder (*FreeImagePlus.dll* and *FreeImagePlus.lib*). - -@subsection dev_guides__building_3rdparty_win_3_4 VTK - -VTK is an open-source, freely available software system for 3D computer graphics, image processing and visualization. VTK Integration Services component provides adaptation functionality for visualization of OCCT topological shapes by means of VTK library. - -### The building procedure: - -1. Download the necessary archive from https://www.vtk.org/VTK/resources/software.html and unpack it into *3rdparty* folder. - - As a result, you will get a folder named, for example, 3rdparty\VTK-6.1.0. - - Further in this document, this folder is referred to as *VTK*. - -2. Use CMake to generate VS projects for building the library: - - Start CMake-GUI and select VTK folder as source path, and the folder of your choice for VS project and intermediate build data. - - Click **Configure**. - - Select the VS version to be used from the ones you have installed (we recommend using VS 2010) and the architecture (32 or 64-bit). - - Generate VS projects with default CMake options. The open solution *VTK.sln* will be generated in the build folder. - -3. Build project VTK in Release mode. Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image007.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/images/3rdparty_image007.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/images/genconf_linux.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/images/genconf_linux.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/images/genconf_osx.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/images/genconf_osx.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/3rdparty/images/genconf_windows.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/3rdparty/images/genconf_windows.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/building/android/android.md opencascade-7.5.1+dfsg1/dox/dev_guides/building/android/android.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/building/android/android.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/building/android/android.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -Building with CMake for Android {#occt_dev_guides__building_android} -=================== - -@tableofcontents - -This article describes the steps to build OCCT libraries for Android from a complete source package -with GNU make (makefiles) on Windows 7 and Ubuntu 15.10. - -The steps on Windows and Ubuntu are similar. There is the only one difference: makefiles are built with mingw32-make -on Windows and native GNU make on Ubuntu. - -Required tools (download and install if it is required): - - CMake v3.7+ https://www.cmake.org/cmake/resources/software.html - - Android NDK rev.10+ https://developer.android.com/tools/sdk/ndk/index.html - - GNU Make: MinGW v4.82+ for Windows (https://sourceforge.net/projects/mingw/files/), GNU Make 4.0 for Ubuntu. - -## Prerequisites - -In toolchain file $CASROOT/adm/templates/android.toolchain.config.cmake: - - - Set CMAKE_ANDROID_NDK variable equal to your Android NDK path. - - Set CMAKE_ANDROID_STL_TYPE variable to specify which C++ standard library to use. - -The default value of CMAKE_ANDROID_STL_TYPE is gnustl_shared (GNU libstdc++ Shared) - -@figure{/dev_guides/building/android/images/android_image001.png} - -## Generation of makefiles using CMake GUI tool -Run GUI tool provided by CMake: cmake-gui - -### Tools configuration - - Specify the root folder of OCCT ($CASROOT, which contains *CMakelists.txt* file) by clicking **Browse Source**. - - Specify the location (build folder) for Cmake generated project files by clicking **Browse Build**. - -@figure{/dev_guides/building/android/images/android_image002.png} - -Click **Configure** button. It opens the window with a drop-down list of generators supported by CMake project. - -Select "MinGW Makefiles" item from the list - - Choose "Specify toolchain file for cross-compiling" - - Click "Next" - -@figure{/dev_guides/building/android/images/android_image003.png} - - - Specify a toolchain file at the next dialog by android.toolchain.config.cmake . It is contained by cross-compilation toolchain for CMake - - Click "Finish" -@figure{/dev_guides/building/android/images/android_image004.png} - -If on Windows the message is appeared: "CMake Error: CMake was unable to find a build program corresponding to "MinGW Makefiles" -CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.", -specify **CMAKE_MAKE_PROGRAM** to mingw32-make executable. -@figure{/dev_guides/building/android/images/android_image005.png} - -### OCCT Configuration - -How to configure OCCT, see "OCCT Configuration" section of @ref occt_dev_guides__building_cmake "Building with CMake" - -### Generation of makefiles - -Click **Generate** button and wait until the generation process is finished. -Then makefiles will appear in the build folder (e.g. D:/occt/build-android ). - -## Generation of makefiles using CMake from the command line - -Alternatively one may specify the values without a toolchain file: - -> cmake -G "MinGW Makefiles" -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=D:/DevTools/android-ndk-r13b -DCMAKE_ANDROID_STL_TYPE=gnustl_shared -DCMAKE_SYSTEM_VERSION=15 -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_MAKE_PROGRAM=D:/DevTools/MinGW/bin/mingw32-make.exe -D3RDPARTY_DIR=D:/occt-3rdparty D:/occt - -@figure{/dev_guides/building/android/images/android_image006.png} - -## Building makefiles of OCCT - -Open console and go to the build folder. Type "mingw32-make" (Windows) or "make" (Ubuntu) to start build process. - -> mingw32-make -or -> make - - -Parallel building can be started with using **"-jN"** argument of "mingw32-make/make", where N is the number of building threads. - -> mingw32-make -j4 -or -> make -j4 - -## Install built OCCT libraries - -Type "mingw32-make/make" with argument "install" to place the libraries -to the install folder (see "OCCT Configuration" section of @ref occt_dev_guides__building_cmake "Building with CMake") - -> mingw32-make install -or -> make install Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/android/images/android_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/android/images/android_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/android/images/android_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/android/images/android_image002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/android/images/android_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/android/images/android_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/android/images/android_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/android/images/android_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/android/images/android_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/android/images/android_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/android/images/android_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/android/images/android_image006.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/building/building.md opencascade-7.5.1+dfsg1/dox/dev_guides/building/building.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/building/building.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/building/building.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -Building OCCT from sources {#occt_dev_guides__building} -========= - -Before building OCCT, make sure to have all the required third-party libraries installed. -The list of required libraries depends on what OCCT modules will be used, and your preferences. -The typical minimum is **Freetype** (necessary for Visualization) and **Tcl/Tk** (for DRAW Test Harness). -See "Third-party libraries" section in \ref OCCT_OVW_SECTION_5 "Overview" for a full list. - -On Windows, the easiest way to install third-party libraries is to download archive with pre-built binaries from https://www.opencascade.com/content/3rd-party-components. -On Linux and OS X, it is recommended to use the version installed in the system natively. - -You can also build third-party libraries from their sources: -* \subpage occt_dev_guides__building_3rdparty_windows -* \subpage occt_dev_guides__building_3rdparty_linux -* \subpage occt_dev_guides__building_3rdparty_osx - -Build OCCT using your preferred build tool. -* \subpage occt_dev_guides__building_cmake "Building with CMake (cross-platform)" -* \subpage occt_dev_guides__building_android "Building with CMake for Android (cross-platform)" -* \subpage occt_dev_guides__building_msvc "Building on Windows with MS Visual Studio projects" -* \subpage occt_dev_guides__building_code_blocks "Building on Mac OS X with Code::Blocks projects" -* \subpage occt_dev_guides__building_xcode "Building on Mac OS X with Xcode projects" - -The current version of OCCT can be consulted in the file src/Standard/Standard_Version.hxx \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/building/cmake/cmake.md opencascade-7.5.1+dfsg1/dox/dev_guides/building/cmake/cmake.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/building/cmake/cmake.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/building/cmake/cmake.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,215 +0,0 @@ -Building with CMake {#occt_dev_guides__building_cmake} -=================== - -@tableofcontents - -@section build_cmake_intro General - -This article describes the **CMake**-based build process, which is now suggested as a standard way to produce the binaries of Open CASCADE Technology from sources. *OCCT requires CMake version 2.8.12 or later*. - -@note Compared to the previous (6.x) releases of Open CASCADE Technology, OCCT 7.x has a complete set of CMake scripts and projects, so that there is no need to use WOK anymore. Moreover, CMake gives you a powerful configuration tool, which allows to control many aspects of OCCT deployment. At the same time this tool is quite intuitive, which is a significant advantage over the legacy WOK utilities. - -Here we describe the build procedure on the example of Windows platform with Visual Studio 2010. -However, CMake is cross-platform and can be used to build OCCT on Linux and OS X in essentially the same way. - -@note Before you start, make sure to have installed all 3-rd party products that you are going to use with OCCT; see @ref occt_dev_guides__building. - -@section build_cmake_start Start CMake - -CMake is a tool that generates the actual project files for the selected target build system (e.g. Unix makefiles) or IDE (e.g. Visual Studio 2010). - -For unexperienced users we recommend to start with *cmake-gui* -- a cross-platform GUI tool provided by CMake on Windows, Mac and Linux. -A command-line alternative, *ccmake* can also be used. - -CMake deals with three directories: source, build or binary and installation. - -* The source directory is where the sources of OCCT are located in your file system; -* The build or binary directory is where all files created during CMake configuration and generation process will be located. The mentioned process will be described below. -* The installation directory is where binaries will be installed after building the *INSTALL* project that is created by CMake generation process, along with header files and resources required for OCCT use in applications. - -The good practice is not to use the source directory as a build one. -Different configurations should be built in different build directories to avoid conflicts. -It is however possible to choose one installation directory for several configurations of OCCT (differentiated by platform, bitness, compiler and build type), for example: - - d:/occt/ -- the source directory - d:/tmp/occt-build-vc10-x64 -- the build directory with the generated - solution and other intermediate files created during a CMake tool working - d:/occt-install -- the installation directory that is - able to contain several OCCT configurations - -@section build_cmake_conf Configuration process - -If the command-line tool is used, run the tool from the build directory with a single argument indicating the source (relative or absolute path) directory: - - cd d:/tmp/occt-build-vc10-x64 - ccmake d:/occt - -@figure{/dev_guides/building/cmake/images/cmake_image000.png} - -Press *c* to configure. - -All actions required in the configuration process with the GUI tool will be described below. - -If the GUI tool is used, run this tool without additional arguments and after that specify the source directory by clicking **Browse Source** and the build (binary) one by clicking **Browse Build**. - -@figure{/dev_guides/building/cmake/images/cmake_image001.png} - -**Note**: Each configuration of the project should be built in its own directory. When building multiple configurations it is recommended to indicate in the name of build directories the system, bitness and compiler (e.g., d:/occt/build/win32-vc10 ). - -Once the source and build directories are selected, "Configure" button should be pressed in order to start manual configuration process. It begins with selection of a target configurator. It is "Visual Studio 10 2010 Win64" in our example. - -@figure{/dev_guides/building/cmake/images/cmake_image002.png} - -To build OCCT for **Universal Windows Platform (UWP)** specify the path to toolchain file for cross-compiling d:/occt/adm/templates/uwp.toolchain.config.cmake. - -Alternatively, if you are using CMake from the command line add options -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION=10.0 . - -**Note**: Universal Windows Platform (UWP) is supported only on "Visual Studio 14 2015". File d:/occt/samples/xaml/ReadMe.md describes the building procedure of XAML (UWP) sample. - -Once "Finish" button is pressed, the first pass of the configuration process is executed. At the end of the process, CMake outputs the list of environment variables, which have to be properly specified for successful configuration. - -@figure{/dev_guides/building/cmake/images/cmake_image003.png} - -The error message provides some information about these variables. This message will appear after each pass of the process until all required variables are specified correctly. - -The change of the state of some variables can lead to the appearance of new variables. The new variables appeared after the pass of the configuration process are highlighted with red color by CMake GUI tool. - -Note: There is "grouped" option, which groups variables with a common prefix. - -The following table gives the full list of environment variables used at the configuration stage: - -| Variable | Type | Purpose | -|----------|------|---------| -| CMAKE_BUILD_TYPE | String | Specifies the build type on single-configuration generators (such as make). Possible values are Debug, Release and RelWithDebInfo | -| USE_FREEIMAGE | Boolean flag | Indicates whether FreeImage product should be used in OCCT visualization module for support of popular graphics image formats (PNG, BMP, etc.) | -| USE_RAPIDJSON | Boolean flag | Indicates whether RapidJSON product should be used in OCCT Data Exchange module for support of glTF mesh file format | -| USE_TBB | Boolean flag | Indicates whether TBB 3rd party is used or not. TBB stands for Threading Building Blocks, the technology of Intel Corp, which comes with different mechanisms and patterns for injecting parallelism into your application. OCCT remains parallel even without TBB product | -| USE_VTK | Boolean flag | Indicates whether VTK 3rd party is used or not. VTK stands for Visualization ToolKit, the technology of Kitware Inc intended for general-purpose scientific visualization. OCCT comes with a bridge between CAD data representation and VTK by means of its dedicated VIS component (VTK Integration Services). You may skip this 3rd party unless you are planning to use VTK visualization for OCCT geometry. See the official documentation @ref occt_user_guides__vis for the details on VIS | -| 3RDPARTY_DIR | Path | Defines the root directory where all required 3rd party products will be searched. Once you define this path it is very convenient to click "Configure" button in order to let CMake automatically detect all necessary products| -| 3RDPARTY_FREETYPE_* | Path | Path to Freetype binaries | -| 3RDPARTY_TCL_* 3RDPARTY_TK_* | Path | Path to Tcl/Tk binaries | -| 3RDPARTY_FREEIMAGE* | Path | Path to Freeimage binaries | -| 3RDPARTY_TBB* | Path | Path to TBB binaries | -| 3RDPARTY_VTK_* | Path | Path to VTK binaries | -| BUILD_MODULE_| Boolean flag | Indicates whether the corresponding OCCT module should be built or not. It should be noted that some toolkits of a module can be built even if this module is not checked (this happens if some other modules depend on these toolkits). The main modules and their descriptions can be found in @ref user_guides | -| BUILD_LIBRARY_TYPE | String | Specifies the type of library to be created. "Shared" libraries are linked dynamically and loaded at runtime. "Static" libraries are archives of object files used when linking other targets. Note that Draw Harness plugin system is incompatible with "Static" builds, and therefore it is disabled for these builds.| -| BUILD_ADDITIONAL_TOOLKITS | String | Semicolon-separated individual toolkits to include into build process. If you want to build some particular libraries (toolkits) only, then you may uncheck all modules in the corresponding *BUILD_MODUE_\* options and provide the list of necessary libraries here. Of course, all dependencies will be resolved automatically | -| BUILD_YACCLEX | Boolean flag | Enables Flex/Bison lexical analyzers. OCCT source files relating to STEP reader and ExprIntrp functionality are generated automatically with Flex/Bison. Checking this option leads to automatic search of Flex/Bison binaries and regeneration of the mentioned files | -| BUILD_SAMPLES_MFC | Boolean flag | Indicates whether MFC samples should be built together with OCCT. This option is only relevant to Windows platforms | -| BUILD_SAMPLES_QT | Boolean flag | Indicates whether QT samples should be built together with OCCT. | -| BUILD_Inspector | Boolean flag | Indicates whether Inspector should be built together with OCCT. | -| BUILD_DOC_Overview | Boolean flag | Indicates whether OCCT overview documentation project should be created together with OCCT. It is not built together with OCCT. Checking this option leads to automatic search of Doxygen binaries. Its building calls Doxygen command to generate the documentation in HTML format | -| BUILD_PATCH | Path | Points to the directory recognized as a "patch" for OCCT. If specified, the files from this directory take precedence over the corresponding native OCCT sources. This way you are able to introduce patches to Open CASCADE Technology not affecting the original source distribution | -| BUILD_WITH_DEBUG | Boolean flag | Enables extended messages of many OCCT algorithms, usually printed to cout. These include messages on internal errors and special cases encountered, timing, etc. | -| BUILD_ENABLE_FPE_SIGNAL_HANDLER | Boolean flag | Enable/Disable the floating point exceptions (FPE) during DRAW execution only. Corresponding environment variable (CSF_FPE) can be changed manually in custom.bat/sh scripts without regeneration by CMake. | -| CMAKE_CONFIGURATION_TYPES | String | Semicolon-separated CMake configurations | -| INSTALL_DIR | Path | Points to the installation directory. *INSTALL_DIR* is a synonym of *CMAKE_INSTALL_PREFIX*. The user can specify both *INSTALL_DIR* or *CMAKE_INSTALL_PREFIX* | -| INSTALL_DIR_BIN | Path | Relative path to the binaries installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_BIN}) | -| INSTALL_DIR_SCRIPT | Path | Relative path to the scripts installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_SCRIPT}) | -| INSTALL_DIR_LIB | Path | Relative path to the libraries installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_LIB}) | -| INSTALL_DIR_INCLUDE | Path | Relative path to the includes installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_INCLUDE}) | -| INSTALL_DIR_RESOURCE | Path | Relative path to the resources installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_RESOURCE}) | -| INSTALL_DIR_LAYOUT | String | Defines the structure of OCCT files (binaries, resources, headers, etc.) for the install directory. Two variants are predefined: for Windows (standard OCCT layout) and for Unix operating systems (standard Linux layout). If needed, the layout can be customized with INSTALL_DIR_* variables | -| INSTALL_DIR_DATA | Path | Relative path to the data files installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_DATA}) | -| INSTALL_DIR_SAMPLES | Path | Relative path to the samples installation directory. Note that only "samples/tcl" folder will be installed. (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_SAMPLES}) | -| INSTALL_DIR_TESTS | Path | Relative path to the tests installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_TESTS}) | -| INSTALL_DIR_DOC | Path | Relative path to the documentation installation directory (absolute path is ${INSTALL_DIR}/${INSTALL_DIR_DOC}) | -| INSTALL_FREETYPE | Boolean flag | Indicates whether Freetype binaries should be installed into the installation directory | -| INSTALL_FREEIMAGE* | Boolean flag | Indicates whether Freeimage binaries should be installed into the installation directory | -| INSTALL_TBB | Boolean flag | Indicates whether TBB binaries should be installed into the installation directory | -| INSTALL_VTK | Boolean flag | Indicates whether VTK binaries should be installed into the installation directory | -| INSTALL_TCL | Boolean flag | Indicates whether TCL binaries should be installed into the installation directory | -| INSTALL_TEST_CASES | Boolean flag | Indicates whether non-regression OCCT test scripts should be installed into the installation directory | -| INSTALL_DOC_Overview | Boolean flag | Indicates whether OCCT overview documentation should be installed into the installation directory | - -**Note:** Only the forward slashes ("/") are acceptable in the CMake options defining paths. - -@section build_cmake_3rdparty 3rd party search mechanism - -If *3RDPARTY_DIR* directory is defined, then required 3rd party binaries are sought in it, and default system folders are ignored. - -The procedure expects to find binary and header files of each 3rd party product in its own sub-directory: *bin*, *lib* and *include*. - -The results of the search (achieved on the next pass of the configuration process) are recorded in the corresponding variables: - -* *3RDPARTY_\_DIR* -- path to the 3rdparty directory (with directory name) (e.g. D:/3rdparty/tcltk-86-32) -* *3RDPARTY_\_LIBRARY_DIR* -- path to the directory containing a library (e.g. D:/3rdparty/tcltk-86-32/lib). -* *3RDPARTY_\_INCLUDE_DIR* -- path to the directory containing a header file (e.g., D:/3rdparty/tcltk-86-32/include) -* *3RDPARTY_\_DLL_DIR* -- path to the directory containing a shared library (e.g., D:/3rdparty/tcltk-86-32/bin) This variable is only relevant to Windows platforms. - -Note: each library and include directory should be children of the product directory if the last one is defined. - -The search process is as follows: - -1. Common path: *3RDPARTY_DIR* -2. Path to a particular 3rd-party library: *3RDPARTY_\_DIR* -3. Paths to headers and binaries: - 1. *3RDPARTY_\_INCLUDE_DIR* - 2. *3RDPARTY_\_LIBRARY_DIR* - 3. *3RDPARTY_\_DLL_DIR* - -If a variable of any level is not defined (empty or \-NOTFOUND ) and the upper level variable is defined, the content of the non-defined variable will be sought at the next configuration step. If the search process at level 3 does not find the required files, it seeks in default places. - -If a search result (include path, or library path, or dll path) does not meet your expectations, you can change *3RDPARTY_\_*_DIR variable*, clear (if they are not empty) *3RDPARTY_\_DLL_DIR, 3RDPARTY_\_INCLUDE_DIR* and 3RDPARTY_\_LIBRARY_DIR variables (or clear one of them) and run the configuration process again. - -At this time the search will be performed in the newly identified directory -and the result will be recorded to corresponding variables (replace old value if it is necessary). - -For example, *3RDPARTY_FREETYPE_DIR* variable - - d:/3rdparty/freetype-2.4.10 - -can be changed to - - d:/3rdparty/freetype-2.5.3 - -During the configuration process the related variables (*3RDPARTY_FREETYPE_DLL_DIR*, *3RDPARTY_FREETYPE_INCLUDE_DIR* and *3RDPARTY_FREETYPE_LIBRARY_DIR*) will be filled with new found values. - -**Note**: The names of searched libraries and header files are hard-coded. If there is the need to change their names, change appropriate cmake variables (edit CMakeCache.txt file or edit in cmake-gui in advance mode) without reconfiguration: *3RDPARTY_\_INCLUDE* for include, *3RDPARTY_\_LIB* for library and *3RDPARTY_\_DLL* for shared library. - -@section build_cmake_gen Projects generation - -Once the configuration process is done, the "Generate" button is used to prepare project files for the target IDE. In our exercise the Visual Studio solution will be automatically created in the buid directory. - -@section build_cmake_build Building - -Go to the build folder, start the Visual Studio solution *OCCT.sln* and build it by clicking **Build -> Build Solution**. - -@figure{/dev_guides/building/cmake/images/cmake_image004.png} - -By default the build solution process skips the building of the INSTALL and Overview project. - -When the building process is finished build: -* Overview project to generate OCCT overview documentation (if BUILD_DOC_Overview variable is checked) -* the *INSTALL* project to run **the installation process** - -For this, right-click on the *Overview/INSTALL* project and select **Project Only -> Build Only** -> *Overview/INSTALL* in the solution explorer. - -@section build_cmake_install Installation - -Installation is a process of extracting redistributable resources (binaries, include files etc) from the build directory into the installation one. The installation directory will be free of project files, intermediate object files and any other information related to the build routines. - -Normally you use the installation directory of OCCT to link against your specific application. - -The directory structure is as follows: - - data -- data files for OCCT (brep, iges, stp) - doc -- OCCT overview documentation in HTML format - inc -- header files - samples -- samples - src -- all required source files for OCCT - tests -- OCCT test suite - win32\vc10\bind -- binary files (installed 3rdparties and occt) - \libd -- libraries (installed 3rdparties and occt) - -**Note:** The above example is given for debug configuration. However, it is generally safe to use the same installation directory for the release build. In the latter case the contents of install directory will be enriched with subdirectories and files related to the release configuration. In particular, the binaries directory win64 will be expanded as -follows: - - \win32\vc10\bind - \libd - \bin - \lib - -If CMake installation flags are enabled for the 3rd party products (e.g. INSTALL_FREETYPE), then the corresponding binaries will be copied to the same bin(d) and lib(d) directories together with the native binaries of OCCT. Such organization of libraries can be especially helpful if your OCCT-based software does not use itself the 3rd parties of Open CASCADE Technology (thus, there is no sense to pack them into dedicated directories). - -The installation folder contains the scripts to run *DRAWEXE* (*draw.bat* or *draw.sh*), samples (if they were installed) and overview.html (short-cut for installed OCCT overview documentation). Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/cmake/images/cmake_image000.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/cmake/images/cmake_image000.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/cmake/images/cmake_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/cmake/images/cmake_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/cmake/images/cmake_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/cmake/images/cmake_image002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/cmake/images/cmake_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/cmake/images/cmake_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/building/cmake/images/cmake_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/building/cmake/images/cmake_image004.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/building/code_blocks.md opencascade-7.5.1+dfsg1/dox/dev_guides/building/code_blocks.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/building/code_blocks.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/building/code_blocks.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -Building with Code::Blocks {#occt_dev_guides__building_code_blocks} -========================== - -@tableofcontents - -@section build_codeblocks_intro General - -This file describes steps to build OCCT libraries from sources using **Code::Blocks**, a cross-platform IDE, using project files generated by OCCT legacy tool **genproj**. -It can be used as an alternative to CMake build system (see @ref occt_dev_guides__building_cmake) for all supported platforms. - -@section build_codeblocks_3rdparty Third-party libraries - -Before building OCCT, make sure to have all the needed third-party libraries installed, see @ref occt_dev_guides__building. - -@section build_codeblocks_conf Configuration - -Before building it is necessary to set up build environment. - -The environment is defined in the file *custom.sh* (on Linux and OS X) or *custom.bat* (on Windows) which can be edited directly: - -* Add paths to includes of used third-party libraries in variable *CSF_OPT_INC*. -* Add paths to their binary libraries in variable *CSF_OPT_LIB64*. -* Set variable *SHORTCUT_HEADERS* to specify a method for population of folder *inc* by header files. Supported methods are: - * *Copy* - headers will be copied from *src*; - * *ShortCut* - short-cut header files will be created, redirecting to same-named header located in *src*; - * "HardLink* - hard links to headers located in *src* will be created. -* For optional third-party libraries, set corresponding environment variable HAVE_ to either *false*, e.g.: -~~~~~ - export HAVE_FREEIMAGE=false -~~~~~ - -Alternatively, or when *custom.sh* or *custom.bat* does not exist, you can launch **genconf** tool to configure environment interactively: - -@figure{/dev_guides/building/3rdparty/images/genconf_linux.png} - -Click "Save" to store the specified configuration in *custom.sh* or *custom.bat* file. - -@section build_codeblocks_gen Projects generation - -Launch **genproj** tool with option *cbp* to update content of *inc* folder and generate project files after changes in OCCT code affecting layout or composition of source files: - -~~~~~ - $ cd /dev/OCCT/opencascade-7.0.0 - $ ./genproj cbp -~~~~~ - -The generated Code::Blocks project are placed into subfolder *adm/<OS>/cbp*. - -@note To use **genproj** and **genconf** tools you need to have Tcl installed and accessible by PATH. - -@section build_codeblocks_build Building - -To start **Code::Blocks**, launch script *codeblocks.sh*. - -To build all toolkits, click **Build->Build workspace** in the menu bar. - -To start *DRAWEXE*, which has been built with **Code::Blocks** on Mac OS X, run the script -~~~~~ - ./draw.sh cbp [d] -~~~~~ -Option *d* is used if OCCT has been built in **Debug** mode. diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/building/msvc.md opencascade-7.5.1+dfsg1/dox/dev_guides/building/msvc.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/building/msvc.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/building/msvc.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -Building with MS Visual C++ {#occt_dev_guides__building_msvc} -=========================== - -@tableofcontents - -@section build_msvc_intro General - -This page describes steps to build OCCT libraries from a complete source archive on Windows with MS Visual C++ using projects generated by **genproj** tool. -It is an alternative to use of CMake build system (see @ref occt_dev_guides__building_cmake). - -**genproj** is a legacy tool (originated from command "wgenproj" in WOK) for generation of Visual Studio, Code.Blocks, and XCode project files used for building Open CASCADE Technology. -These project files are placed inside OCCT directory (in *adm* subfolder) and use relative paths, thus can be moved together with sources. - -The project files included in official distribution of OCCT are generated by this tool. -If you have official distribution with project files included, you can use them directly without a need to call **genproj**. - -@section build_msvc_3rdparty Third-party libraries - -Before building OCCT, make sure to have all the required third-party libraries installed. - -The easiest way to install third-party libraries is to download archive with pre-built binaries, corresponding to version of Visual Studio you are using, from https://www.opencascade.com/content/3rd-party-components. - -You can also build third-party libraries from their sources, see @ref occt_dev_guides__building_3rdparty_windows for instructions. - -@section build_msvc_conf Configuration - -If you have Visual Studio projects already available (pre-installed or generated), you can edit file *custom.bat* manually to adjust the environment: - -* *VCVER* -- specification of format of project files, defining also version of Visual Studio to be used, and default name of the sub-folder for binaries: - -| VCVER | Visual Studio version | Windows Platform | Binaries folder name | -|-----------|-----------------------|----------------------------------|----------------------| -| vc10 | 2010 (10) | Desktop (Windows API) | vc10 | -| vc11 | 2012 (11) | Desktop (Windows API) | vc11 | -| vc12 | 2013 (12) | Desktop (Windows API) | vc12 | -| vc14 | 2015 (14) | Desktop (Windows API) | vc14 | -| vc14-uwp | 2015 (14) | UWP (Universal Windows Platform) | vc14-uwp | -| vc141 | 2017 (15) | Desktop (Windows API) | vc14 | -| vc141-uwp | 2017 (15) | UWP (Universal Windows Platform) | vc14-uwp | -| vc142 | 2019 (16) | Desktop (Windows API) | vc14 | -| vc142-uwp | 2019 (16) | UWP (Universal Windows Platform) | vc14-uwp | - -* *ARCH* -- architecture (32 or 64), affects only *PATH* variable for execution -* HAVE_* -- flags to enable or disable use of optional third-party products -* CSF_OPT_* -- paths to search for includes and binaries of all used third-party products -* *SHORTCUT_HEADERS* -- defines method for population of folder *inc* by header files. Supported methods are: - * *Copy* - headers will be copied from *src*; - * *ShortCut* - short-cut header files will be created, redirecting to same-named header located in *src*; - * "HardLink* - hard links to headers located in *src* will be created. - -Alternatively, you can launch **genconf**, a GUI tool allowing to configure build options interactively. -That tool will analyze your environment and propose you to choose available options: - -* Version of Visual Studio to be used (from the list of installed ones, detected by presence of environment variables like *VS100COMNTOOLS*). -* Method to populate folder *inc* (short-cuts by default). -* Location of third-party libraries (usually downloaded from OCCT web site, see above). -* Path to common directory where third-party libraries are located (optional). -* Paths to headers and binaries of the third-party libraries (found automatically basing on previous options; click button "Reset" to update). -* Generation of PDB files within Release build ("Release with Debug info", false by default). - -@figure{/dev_guides/building/3rdparty/images/genconf_windows.png} - -Click "Save" to store the specified configuration in *custom.bat* file. - -@section build_msvc_generate Projects generation - -Launch **genproj** to update content of *inc* folder and generate project files after changes in OCCT code affecting layout or composition of source files. - -@note To use **genproj** and **genconf** tools you need to have Tcl installed and accessible by PATH. -If Tcl is not found, the tool may prompt you to enter the path to directory where Tcl can be found. - -~~~~~ - $ genproj.bat -~~~~~ - -Note that if *custom.bat* is not present, **genproj** will start **genconf** to configure environment. - -@section build_msvc_build Building - -Launch *msvc.bat* to start Visual Studio with all necessary environment variables defined, and build the whole solution or required toolkits. - -Note: the MSVC project files are located in folders adm\\msvc\\vc.... -Binaries are produced in *win32* or *win64* folders. - -To start DRAW, launch *draw.bat*. diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/building/xcode.md opencascade-7.5.1+dfsg1/dox/dev_guides/building/xcode.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/building/xcode.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/building/xcode.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -Building with Xcode {#occt_dev_guides__building_xcode} -=================== - -@tableofcontents - -@section build_xcode_intro General - -This file describes steps to build OCCT libraries from sources on Mac OS X with **Xcode** projects, generated by OCCT legacy tool **genproj**. - -@section build_xcode_3rdparty Third-party libraries - -Before building OCCT, make sure to have all the needed third-party libraries installed. -On OS X we recommend to use native libraries. -You can also build third-party libraries from their sources, see @ref occt_dev_guides__building_3rdparty_osx for instructions. - -@section build_xcode_conf Configuration - -Before building it is necessary to set up build environment. - -The environment is defined in the file *custom.sh* which can be edited directly: - -* Add paths to includes of used third-party libraries in variable *CSF_OPT_INC* (use colon ":" as path separator). -* Add paths to their binary libraries in variable *CSF_OPT_LIB64*. -* Set variable *SHORTCUT_HEADERS* to specify a method for population of folder *inc* by header files. Supported methods are: - * *Copy* - headers will be copied from *src*; - * *ShortCut* - short-cut header files will be created, redirecting to same-named header located in *src*; - * "HardLink* - hard links to headers located in *src* will be created. -* For optional third-party libraries, set corresponding environment variable HAVE_ to either *false*, e.g.: -~~~~~ - export HAVE_FREEIMAGE=false -~~~~~ - -Alternatively, or when *custom.sh* does not exist, you can launch *genconf.sh* to configure environment interactively: - -@figure{/dev_guides/building/3rdparty/images/genconf_osx.png} - -Click "Save" to store the specified configuration in *custom.sh* file. - -@section build_xcode_gen Projects generation - -Launch **genproj** tool to update content of *inc* folder and generate project files after changes in OCCT code affecting layout or composition of source files. - -@note To use **genproj** and **genconf** tools you need to have Tcl installed and accessible by PATH. - -For instance, in Terminal application: - -~~~~~ - $ cd /dev/OCCT/opencascade-7.0.0 - $ ./genproj -~~~~~ - -Option **-static** can be used with XCode to build static libraries. - -~~~~~ - $ cd /dev/OCCT/opencascade-7.0.0 - $ ./genproj xcd -static -~~~~~ - -@section build_xcode_build Building - -To start **Xcode**, launch script *xcode.sh*. - -To build a certain toolkit, select it in **Scheme** drop-down list in Xcode toolbar, press **Product** in the menu and click **Build** button. - -To build the entire OCCT: -* Create a new empty project (select **File -> New -> Project -> Empty project** in the menu; input the project name, e.g. *OCCT*; then click **Next** and **Create**). -* Drag and drop the *OCCT* folder in the created *OCCT* project in the Project navigator. -* Select **File -> New -> Target -> Aggregate** in the menu. -* Enter the project name (e.g. *OCCT*) and click **Finish**. The **Build Phases** tab will open. -* Click "+" button to add the necessary toolkits to the target project. It is possible to select all toolkits by pressing **Command+A** combination. - -@section build_xcode_draw Launching DRAW - -To start *DRAWEXE*, which has been built with Xcode on Mac OS X, perform the following steps: - -1.Open Terminal application - -2.Enter \: -~~~~~ - cd \ -~~~~~ - -3.Run the script -~~~~~ - ./draw.sh xcd [d] -~~~~~ - -Option *d* is used if OCCT has been built in **Debug** mode. diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/contribution/coding_rules.md opencascade-7.5.1+dfsg1/dox/dev_guides/contribution/coding_rules.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/contribution/coding_rules.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/contribution/coding_rules.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,1152 +0,0 @@ -Coding Rules {#occt_dev_guides__coding_rules} -====================================== - -@tableofcontents - -@section occt_coding_rules_1 Introduction - -The purpose of this document is to define a common programming style for Open CASCADE Technology. - -The common style facilitates understanding and maintaining a code developed cooperatively by several programmers. In addition, it enables construction of tools that incorporate knowledge of these standards to help in the programming. - -OCCT programming style follows common and appropriate best practices, so some guidelines have been excerpted from the public domain. - -The guide can be improved in the future as new ideas and enhancements are added. - -@subsection occt_coding_rules_1_1 Scope of the document - -Rules in this document refer to C++ code. However, with minor exceptions due to language restrictions, they are applicable to any sources in Open CASCADE Technology framework, including: -- C/C++ -- GLSL programs -- OpenCL kernels -- TCL scripts and test cases - -@section occt_coding_rules_2 Naming Conventions - -@subsection occt_coding_rules_2_1 General naming rules - -The names considered in this section mainly refer to the interface of Open CASCADE Technology libraries or source code itself. - -### International language [MANDATORY] - -Open CASCADE Technology is an open source platform available for an international community, thus all names need to be composed of English words or their abbreviations. - -### Meaningful names - -Names should be meaningful or, at least, contain a meaningful part. To better understand this requirement, let us examine the existing names of toolkits, packages, classes and methods: -- Packages containing words *Geom* or *Geom2d* in their names are related to geometrical data and operations. -- Packages containing words *TopoDS* or *BRep* in their names are related to topological data and operations. -- Packages ending with ...Test define Draw Harness plugins. -- Methods starting with *Get...* and *Set...* are usually responsible for correspondingly retrieving and storing data. - -### Related names - -Names related to a logically connected functionality should have the same prefix (start with the same letters) or, at least, have any other common part. -For example, method *GetCoord* returns a triple of real values and is defined for directions, vectors and points. The logical connection is obvious. - -### Camel Case style -Camel Case style is preferred for names. -For example: - -~~~~~{.cpp} -Standard_Integer awidthofbox; // this is bad -Standard_Integer width_of_box; // this is bad -Standard_Integer aWidthOfBox; // this is OK -~~~~~ - -@subsection occt_coding_rules_2_2 Names of development units - -Usually a unit (e.g. a package) is a set of classes, methods, enumerations or any other sources implementing a common functionality, which is self-contained and independent from other parts of the library. - -### No underscores in unit names [MANDATORY] - -Names of units should not contain underscores, unless the use of underscores is allowed explicitly. - -### File name extensions [MANDATORY] - -The following extensions should be used for source files, depending on their type: - -* .cxx -- C++ source files -* .hxx -- C++ header files -* .lxx -- additional headers containing definitions of inline methods and auxiliary code - -Note that .lxx files should be avoided in most cases - inline method should be placed in header file instead. - -### Prefix for toolkit names [MANDATORY] - -Toolkit names are prefixed by *TK*, followed by a meaningful part of the name explaining the domain of functionality covered by the toolkit (e.g. *TKOpenGl*). - -### Names of public types - -Names of public classes and other types (structures, enums, typedefs) should match the common pattern: name of the package followed by underscore and suffix (the own name of the type): - -~~~~~ - _ -~~~~~ - -Static methods related to the whole package are defined in the class with the same name as package (without suffix). - -Each type should be defined in its own header file with the name of the type and extension ".hxx". -Implementation should be placed in the file with the same name and extension ".cxx"; for large classes it is possible to split implementation into multiple source files with additional suffixes in the names (usually numerical, e.g. *BSplCLib_1.cxx*). - -For example, class *Adaptor2d_Curve2d* belongs to the package *Adaptor2d*; it is defined in header file *Adaptor2d_Curve2d.hxx* and implemented in source file *Adaptor2d_Curve2d.cxx*. - -This rule also applies to complex types constructed by instantiation of templates. -Such types should be given own names using *typedef* statement, located in same-named header file. - -For example, see definition in the file *TColStd_IndexedDataMapOfStringString.hxx*: -~~~~~ -typedef NCollection_IndexedDataMap TColStd_IndexedDataMapOfStringString; -~~~~~ - -### Names of functions - -The term **function** here is defined as: -- Any class method -- Any package method -- Any non-member procedure or function - -It is preferred to start names of public methods from an upper case character and to start names of protected and private methods from a lower case character. - - -~~~~~{.cpp} -class MyPackage_MyClass -{ - -public: - - Standard_Integer Value() const; - void SetValue (const Standard_Integer theValue); - -private: - - void setIntegerValue (const Standard_Integer theValue); - -}; -~~~~~ - -@subsection occt_coding_rules_2_3 Names of variables - -There are several rules that describe currently accepted practices for naming variables. - -### Naming of variables - -Name of a variable should not conflict with the existing or possible global names (for packages, macros, functions, global variables, etc.). - -The name of a variable should not start with an underscore. - -See the following examples: - -~~~~~{.cpp} -Standard_Integer Elapsed_Time = 0; // this is bad - possible class name -Standard_Integer gp = 0; // this is bad - existing package name -Standard_Integer aGp = 0; // this is OK -Standard_Integer _KERNEL = 0; // this is bad -Standard_Integer THE_KERNEL = 0; // this is OK -~~~~~ - -### Names of function parameters - -The name of a function (procedure, class method) parameter should start with prefix *the* followed by the meaningful part of the name starting with a capital letter. - -See the following examples: - -~~~~~{.cpp} -void Package_MyClass::MyFunction (const gp_Pnt& p); // this is bad -void Package_MyClass::MyFunction (const gp_Pnt& theP); // this is OK -void Package_MyClass::MyFunction (const gp_Pnt& thePoint); // this is preferred -~~~~~ - -### Names of class member variables - -The name of a class member variable should start with prefix *my* followed by the meaningful of the name starting with a capital letter. - -See the following examples: - -~~~~~{.cpp} -Standard_Integer counter; // This is bad -Standard_Integer myC; // This is OK -Standard_Integer myCounter; // This is preferred -~~~~~ - -### Names of global variables - -It is strongly recommended to avoid defining any global variables. -However, as soon as a global variable is necessary, its name should be prefixed by the name of a class or a package where it is defined followed with _my. - -See the following examples: - -~~~~~{.cpp} -Standard_Integer MyPackage_myGlobalVariable = 0; -Standard_Integer MyPackage_MyClass_myGlobalVariable = 0; -~~~~~ - -Static constants within the file should be written in upper-case and begin with prefix *THE_*: -~~~~~{.cpp} -namespace -{ - static const Standard_Real THE_CONSTANT_COEF = 3.14; -}; -~~~~~ - -### Names of local variables - -The name of a local variable should be distinguishable from the name of a function parameter, a class member variable and a global variable. - -It is preferred to prefix local variable names with *a* and *an* (or *is*, *to* and *has* for Boolean variables). - -See the following example: - -~~~~~{.cpp} -Standard_Integer theI; // this is bad -Standard_Integer i; // this is bad -Standard_Integer index; // this is bad -Standard_Integer anIndex; // this is OK -~~~~~ - -### Avoid dummy names -Avoid dummy names, such as i, j, k. Such names are meaningless and easy to mix up. - -The code becomes more and more complicated when such dummy names are used there multiple times with different meanings, or in cycles with different iteration ranges, etc. - -See the following examples for preferred style: - -~~~~~{.cpp} -void Average (const Standard_Real** theArray, - Standard_Integer theRowsNb, - Standard_Integer theRowLen, - Standard_Real& theResult) -{ - theResult = 0.0; - for (Standard_Integer aRow = 0; aRow < aRowsNb; ++aRow) - { - for (Standard_Integer aCol = 0; aCol < aRowLen; ++aCol) - { - theResult += theArray[aRow][aCol]; - } - theResult /= Standard_Real(aRowsNb * aRowLen); - } -} -~~~~~ - -@section occt_coding_rules_3 Formatting rules - -To improve the open source readability and, consequently, maintainability, the following set of rules is applied. - -### International language [MANDATORY] - -All comments in all sources must be in English. - -### Line length - -Try to stay within the limit of 120 characters per line in all sources. - -### C++ style comments - -Prefer C++ style comments in C++ sources. - -### Commenting out unused code - -Delete unused code instead of commenting it or using \#define. - -### Indentation in sources [MANDATORY] - -Indentation in all sources should be set to two space characters. -Use of tabulation characters for indentation is disallowed. - -### Separating spaces - -Punctuation rules follow the rules of the English language. -* C/C++ reserved words, commas, colons and semicolons should be followed by a space character if they are not at the end of a line. -* There should be no space characters after '(' and before ')'. Closing and opening brackets should be separated by a space character. -* For better readability it is also recommended to surround conventional operators by a space character. -Examples: - -~~~~~{.cpp} -while (true) // NOT: while( true ) ... -{ - DoSomething (theA, theB, theC, theD); // NOT: DoSomething(theA,theB,theC,theD); -} -for (anIter = 0; anIter < 10; ++anIter) // NOT: for (anIter=0;anIter<10;++anIter){ -{ - theA = (theB + theC) * theD; // NOT: theA=(theB+theC)*theD -} -~~~~~ - -### Declaration of pointers and references - -In declarations of simple pointers and references put asterisk (*) or ampersand (&) right after the type without extra space. - -Since declaration of several variables with mixed pointer types contrudicts this rule, it should be avoided. Instead, declare each variable independently with fully qualified type. - -Examples: - -~~~~~{.cpp} -Standard_Integer *theVariable; // not recommended -Standard_Integer * theVariable; // not recommended -Standard_Integer* theVariable; // this is OK - -Standard_Integer *&theVariable; // not recommended -Standard_Integer *& theVariable; // not recommended -Standard_Integer*& theVariable; // this is OK - -Standard_Integer **theVariable; // not recommended -Standard_Integer ** theVariable; // not recommended -Standard_Integer** theVariable; // this is OK - -Standard_Integer *theA, theB, **theC; // not recommended (declare each variable independently) -~~~~~ - -### Separate logical blocks - -Separate logical blocks of code with one blank line and comments. - -See the following example: - -~~~~~{.cpp} -// check arguments -Standard_Integer anArgsNb = argCount(); -if (anArgsNb < 3 || isSmthInvalid) -{ - return THE_ARG_INVALID; -} - -// read and check header -... -... - -// do our job -... -... -~~~~~ - -Notice that multiple blank lines should be avoided. - -### Separate function bodies [MANDATORY] - -Use function descriptive blocks to separate function bodies from each other. -Each descriptive block should contain at least a function name and purpose description. - -See the following example: - -~~~~~{.cpp} -// ======================================================================= -// function : TellMeSmthGood -// purpose : Gives me good news -// ======================================================================= -void TellMeSmthGood() -{ - ... -} - -// ======================================================================= -// function : TellMeSmthBad -// purpose : Gives me bad news -// ======================================================================= -void TellMeSmthBad() -{ - ... -} -~~~~~ - -### Block layout [MANDATORY] -Figure brackets { } and each operator (for, if, else, try, catch) should be written on a dedicated line. - -In general, the layout should be as follows: - -~~~~~{.cpp} -while (expression) -{ - ... -} -~~~~~ - -Entering a block increases and leaving a block decreases the indentation by one tabulation. - -### Single-line operators - -Single-line conditional operators (if, while, for, etc.) can be written without brackets on the following line. - -~~~~~{.cpp} -if (!myIsInit) return Standard_False; // bad - -if (thePtr == NULL) // OK - return Standard_False; - -if (!theAlgo.IsNull()) // preferred -{ - DoSomething(); -} -~~~~~ - -Having all code in the same line is less convenient for debugging. - -### Comparison expressions with constants - -In comparisons, put the variable (in the current context) on the left side and constant on the right side of expression. -That is, the so called "Yoda style" is to be avoided. - -~~~~~{.cpp} -if (NULL != thePointer) // Yoda style, not recommended -if (thePointer != NULL) // OK - -if (34 < anIter) // Yoda style, not recommended -if (anIter > 34) // OK - -if (theNbValues >= anIter) // bad style (constant function argument vs. local variable) -if (anIter <= theNbValues) // OK - -if (THE_LIMIT == theValue) // bad style (global constant vs. variable) -if (theValue == THE_LIMIT) // OK -~~~~~ - -### Alignment - -Use alignment wherever it enhances the readability. See the following example: - -~~~~~{.cpp} -MyPackage_MyClass anObject; -Standard_Real aMinimum = 0.0; -Standard_Integer aVal = theVal; -switch (aVal) -{ - case 0: computeSomething(); break; - case 12: computeSomethingElse (aMinimum); break; - case 3: - default: computeSomethingElseYet(); break; -} -~~~~~ - -### Indentation of comments - -Comments should be indented in the same way as the code to which they refer or they can be in the same line if they are short. - -The text of the comment should be separated from the slash character by a single space character. - -See the following example: - -~~~~~{.cpp} -while (expression) //bad comment -{ - // this is a long multi-line comment - // which is really required - DoSomething(); // maybe, enough - DoSomethingMore(); // again -} -~~~~~ - -### Early return statement - -Use an early return condition rather than collect indentations. - -Write like this: - -~~~~~{.cpp} -Standard_Integer ComputeSumm (const Standard_Integer* theArray, - const Standard_Size theSize) -{ - Standard_Integer aSumm = 0; - if (theArray == NULL || theSize == 0) - { - return 0; - } - - ... computing summ ... - return aSumm; -} -~~~~~ - -Rather than: - -~~~~~{.cpp} -Standard_Integer ComputeSumm (const Standard_Integer* theArray, - const Standard_Size theSize) -{ - Standard_Integer aSumm = 0; - if (theArray != NULL && theSize != 0) - { - ... computing summ ... - } - return aSumm; -} -~~~~~ - -This helps to improve readability and reduce the unnecessary indentation depth. - -### Trailing spaces - -Trailing spaces should be removed whenever possible. -Spaces at the end of a line are useless and do not affect functionality. - -### Headers order - -Split headers into groups: system headers, headers per each framework, project headers; sort the list of includes alphabetically. -Within the class source file, the class header file should be included first. - -This rule improves readability, allows detecting useless multiple header inclusions and makes 3rd-party dependencies clearly visible. -Inclusion of class header on top verifies consistency of the header (e.g. that header file does not use any undefined declarations due to missing includes of dependencies). - -An exception to the rule is ordering system headers generating a macros declaration conflicts (like "windows.h" or "X11/Xlib.h") - these headers should be placed in the way solving the conflict. - -The source or header file should include only minimal set of headers necessary for compilation, without duplicates (considering nested includes). - -~~~~~{.cpp} -// the header file of implemented class -#include - -// OCCT headers -#include -#include -#include - -// Qt headers -#include -#include - -// system headers -#include -#include -~~~~~ - -@section occt_coding_rules_4 Documentation rules - -The source code is one of the most important references for documentation. -The comments in the source code should be complete enough to allow understanding the corresponding code and to serve as basis for other documents. - -The main reasons why the comments are regarded as documentation and should be maintained are: -- The comments are easy to reach -- they are always together with the source code; -- It is easy to update a description in the comment when the source is modified; -- The source by itself is a good context to describe various details that would require much more explanations in a separate document; -- As a summary, this is the most cost-effective documentation. - -The comments should be compatible with Doxygen tool for automatic documentation generation (thus should use compatible tags). - -### Documenting classes [MANDATORY] - -Each class should be documented in its header file (.hxx). -The comment should give enough details for the reader to understand the purpose of the class and the main way of work with it. - -### Documenting class methods [MANDATORY] - -Each class or package method should be documented in the header file (.hxx). - -The comment should explain the purpose of the method, its parameters, and returned value(s). -Accepted style is: - -@verbatim -//! Method computes the square value. -//! @param theValue the input value -//! @return squared value -Standard_Export Standard_Real Square (Standard_Real theValue); -@endverbatim - -### Documenting C/C++ sources - -It is very desirable to put comments in the C/C++ sources of the package/class. - -They should be detailed enough to allow any person to understand what each part of code does. - -It is recommended to comment all static functions (like methods in headers), and to insert at least one comment per each 10-100 lines in the function body. - -There are also some rules that define how comments should be formatted, see @ref occt_coding_rules_3 "Formatting Rules". - -Following these rules is important for good comprehension of the comments. Moreover, this approach allows automatically generating user-oriented documentation directly from the commented sources. - -@section occt_coding_rules_5 Application design - -The following rules define the common style, which should be applied by any developer contributing to the open source. - -### Allow possible inheritance - -Try to design general classes (objects) keeping possible inheritance in mind. -This rule means that the user who makes possible extensions of your class should not encounter problems of private implementation. -Try to use protected members and virtual methods wherever you expect extensions in the future. - -### Avoid friend declarations - -Avoid using 'friend' classes or functions except for some specific cases (for example, iteration) 'Friend' declarations increase coupling. - -### Set/get methods - -Avoid providing set/get methods for all fields of the class. -Intensive set/get functions break down encapsulation. - -### Hiding virtual functions [MANDATORY] - -Avoid hiding a base class virtual function by a redefined function with a different signature. -Most of the compilers issue warning on this. - -### Avoid mixing error reporting strategies - -Try not to mix different error indication/handling strategies (exceptions or returned values) on the same application level. - -### Minimize compiler warnings [MANDATORY] - -When compiling the source pay attention to and try to minimize compiler warnings. - -### Avoid unnecessary inclusions - -Try to minimize compilation dependencies by removing unnecessary inclusions. - -@section occt_coding_rules_6 General C/C++ rules - -This section defines the rules for writing a portable and maintainable C/C++ source code. - -### Wrapping of global variables [MANDATORY] - -Use package or class methods returning reference to wrap global variables to reduce possible name space conflicts. - -### Avoid private members - -Use *protected* members instead of *private* wherever reasonable to enable future extensions. -Use *private* fields if future extensions should be disabled. - -### Constants and inlines over defines [MANDATORY] - -Use constant variables (const) and inline functions instead of defines (\#define). - -### Avoid explicit numerical values [MANDATORY] - -Avoid usage of explicit numeric values. Use named constants and enumerations instead. -Numbers produce difficulties for reading and maintenance. - -### Three mandatory methods - -If a class has a destructor, an assignment operator or a copy constructor, it usually needs the other two methods. - -### Virtual destructor - -A class with virtual function(s) ought to have a virtual destructor. - -### Overriding virtual methods - -Declaration of overriding method should contains specifiers "virtual" and "override" -(using Standard_OVERRIDE alias for compatibility with old compilers). - -~~~~~{.cpp} -class MyPackage_BaseClass -{ - -public: - - Standard_EXPORT virtual Standard_Boolean Perform(); - -}; - -class MyPackage_MyClass : public MyPackage_BaseClass -{ - -public: - - Standard_EXPORT virtual Standard_Boolean Perform() Standard_OVERRIDE; - -}; -~~~~~ - -This makes class definition more clear (virtual methods become highlighted). - -Declaration of interface using pure virtual functions protects against -incomplete inheritance at first level, but does not help when method is overridden multiple times within nested inheritance -or when method in base class is intended to be optional. - -And here "override" specifier introduces additional protection against situations when interface changes might be missed -(class might contain old methods which will be never called). - -### Default parameter value - -Do not redefine a default parameter value in an inherited function. - -### Use const modifier - -Use *const* modifier wherever possible (functions parameters, return values, etc.) - -### Usage of goto [MANDATORY] -Avoid *goto* statement unless it is really needed. - -### Declaring variable in for() header - -Declare a cycle variable in the header of the *for()* statement if not used out of cycle. - -~~~~~{.cpp} -Standard_Real aMinDist = Precision::Infinite(); -for (NCollection_Sequence::Iterator aPntIter (theSequence); - aPntIter.More(); aPntIter.Next()) -{ - aMinDist = Min (aMinDist, theOrigin.Distance (aPntIter.Value())); -} -~~~~~ - -### Condition statements within zero - -Avoid usage of C-style comparison for non-boolean variables: - -~~~~~{.cpp} -void Function (Standard_Integer theValue, - Standard_Real* thePointer) -{ - if (!theValue) // bad style - ambiguous logic - { - DoSome(); - } - - if (theValue == 0) // OK - { - DoSome(); - } - - if (thePointer != NULL) // OK, predefined NULL makes pointer comparison cleaner to reader - { // (nullptr should be used instead as soon as C++11 will be available) - DoSome2(); - } -} -~~~~~ - -@section occt_coding_rules_7 Portability issues - -This chapter contains rules that are critical for cross-platform portability. - -### Provide code portability [MANDATORY] - -The source code must be portable to all platforms listed in the official 'Technical Requirements'. -The term 'portable' here means 'able to be built from source'. - -The C++ source code should meet C++03 standard. -Any usage of compiler-specific features or further language versions (for example, C++11, until all major compilers on all supported platforms implement all its features) should be optional (used only with appropriate preprocessor checks) and non-exclusive (an alternative implementation compatible with other compilers should be provided). - -### Avoid usage of global variables [MANDATORY] - -Avoid usage of global variables. Usage of global variables may cause problems when accessed from another shared library. - -Use global (package or class) functions that return reference to static variable local to this function instead of global variables. - -Another possible problem is the order of initialization of global variables defined in various libraries that may differ depending on platform, compiler and environment. - -### Avoid explicit basic types - -Avoid explicit usage of basic types (*int*, *float*, *double*, etc.), use Open CASCADE Technology types from package *Standard: Standard_Integer, Standard_Real, Standard_ShortReal, Standard_Boolean, Standard_CString* and others or a specific *typedef* instead. - -### Use *sizeof()* to calculate sizes [MANDATORY] - -Do not assume sizes of types. Use *sizeof()* instead to calculate sizes. - -### Empty line at the end of file [MANDATORY] - -In accordance with C++03 standard source files should be trailed by an empty line. -It is recommended to follow this rule for any plain text files for consistency and for correct work of git difference tools. - -@section occt_coding_rules_8 Stability issues - -The rules listed in this chapter are important for stability of the programs that use Open CASCADE Technology libraries. - -### Use *OSD::SetSignal()* to catch exceptions - -When using Open CASCADE Technology in an application, call *OSD::SetSignal()* function when the application is initialized. - -This will install C handlers for run-time interrupt signals and exceptions, so that low-level exceptions (such as access violation, division by zero, etc.) will be redirected to C++ exceptions -that use *try {...} catch (Standard_Failure) {...}* blocks. - -The above rule is especially important for robustness of modeling algorithms. - -### Cross-referenced handles - -Take care about cycling of handled references to avoid chains, which will never be freed. For this purpose, use a pointer at one (subordinate) side. - -See the following example: - -~~~~{.cpp} - class Slave; - - class Master : public Standard_Transient - { - ... - void SetSlave (const Handle(Slave)& theSlave) - { - mySlave = theSlave; - } - ... - private: - Handle(Slave) theSlave; // smart pointer - ... - } - - class Slave : public Standard_Transient - { - ... - void SetMaster (const Handle(Master)& theMaster) - { - myMaster = theMaster.get(); - } - ... - private: - Master* theMaster; // simple pointer - ... - } -~~~~ - -### C++ memory allocation - -In C++ use *new* and *delete* operators instead of *malloc()* and *free()*. Try not to mix different memory allocation techniques. - -### Match *new* and *delete* [MANDATORY] - -Use the same form of new and delete. - -~~~~~{.cpp} -aPtr1 = new TypeA[n]; ... ; delete[] aPtr1; -aPtr2 = new TypeB(); ... ; delete aPtr2; -aPtr3 = Standard::Allocate (4096); ... ; Standard::Free (aPtr3); -~~~~~ - -### Methods managing dynamical allocation [MANDATORY] - -Define a destructor, a copy constructor and an assignment operator for classes with dynamically allocated memory. - -### Uninitialized variables [MANDATORY] - -Every variable should be initialized. - -~~~~~{.cpp} -Standard_Integer aTmpVar1; // bad -Standard_Integer aTmpVar2 = 0; // OK -~~~~~ - -Uninitialized variables might be kept only within performance-sensitive code blocks and only when their initialization is guaranteed by subsequent code. - -### Do not hide global *new* - -Avoid hiding the global *new* operator. - -### Assignment operator - -In *operator=()* assign to all data members and check for assignment to self. - -### Float comparison - -Don't check floats for equality or non-equality; check for GT, GE, LT or LE. - -~~~~~{.cpp} -if (Abs (theFloat1 - theFloat2) < theTolerance) -{ - DoSome(); -} -~~~~~ - -Package *Precision* provides standard values for SI units and widely adopted by existing modeling algorithms: - -- *Precision::Confusion()* for lengths in meters; -- *Precision::Angular()* for angles in radians. - -as well as definition of infinite values within normal range of double precision: -- *Precision::Infinite()* -- *Precision::IsInfinite()* -- *Precision::IsPositiveInfinite()* -- *Precision::IsNegativeInfinite()* - -### Non-indexed iteration - -Avoid usage of iteration over non-indexed collections of objects. -If such iteration is used, make sure that the result of the algorithm does not depend on the order of iterated items. - -Since the order of iteration is unpredictable in case of a non-indexed collection of objects, it frequently leads to different behavior of the application from one run to another, thus embarrassing the debugging process. - -It mostly concerns mapped objects for which pointers are involved in calculating the hash function. For example, the hash function of *TopoDS_Shape* involves the address of *TopoDS_TShape* object. Thus the order of the same shape in the *TopTools_MapOfShape* will vary in different sessions of the application. - -### Do not throw in destructors - -Do not throw from within a destructor. - -### Assigning to reference [MANDATORY] - -Avoid the assignment of a temporary object to a reference. This results in a different behavior for different compilers on different platforms. - -@section occt_coding_rules_9 Performance issues - -These rules define the ways of avoiding possible loss of performance caused by ineffective programming. - -### Class fields alignment - -Declare fields of a class in the decreasing order of their size for better alignment. -Generally, try to reduce misaligned accesses since they impact the performance (for example, on Intel machines). - -### Fields initialization order [MANDATORY] - -List class data members in the constructor's initialization list in the order they are declared. - -~~~~~{.cpp} -class MyPackage_MyClass -{ - -public: - - MyPackage_MyClass() - : myPropertyA (1), - myPropertyB (2) {} - -// NOT -// : myPropertyB (2), -// myPropertyA (1) {} - -private: - - Standard_Integer myPropertyA; - Standard_Integer myPropertyB; - -}; -~~~~~ - -### Initialization over assignment - -Prefer initialization over assignment in class constructors. - -~~~~~{.cpp} -MyPackage_MyClass() -: myPropertyA (1) // preferred -{ - myPropertyB = 2; // not recommended -} -~~~~~ - -### Optimize caching - -When programming procedures with extensive memory access, try to optimize them in terms of cache behavior. Here is an example of how the cache behavior can be impacted: - -On x86 this code - -~~~~~{.cpp} -Standard_Real anArray[4096][2]; -for (Standard_Integer anIter = 0; anIter < 4096; ++anIter) -{ - anArray[anIter][0] = anArray[anIter][1]; -} -~~~~~ - -is more efficient then - -~~~~~{.cpp} -Standard_Real anArray[2][4096]; -for (Standard_Integer anIter = 0; anIter < 4096; ++anIter) -{ - anArray[0][anIter] = anArray[1][anIter]; -} -~~~~~ - -since linear access does not invalidate cache too often. - -@section occt_coding_rules_10 Draw Harness command - -Draw Harness provides TCL interface for OCCT algorithms. - -There is no TCL wrapper over OCCT C++ classes, instead interface is provided through the set of TCL commands implemented in C++. - -There is a list of common rules which should be followed to implement well-formed Draw Harness command. - -### Return value - -Command should return 0 in most cases even if the executed algorithm has failed. Returning 1 would lead to a TCL exception, thus should be used in case of a command line syntax error and similar issues. - -### Validate input parameters - -Command arguments should be validated before usage. The user should see a human-readable error description instead of a runtime exception from the executed algorithm. - -### Validate the number of input parameters - -Command should warn the user about unknown arguments, including cases when extra parameters have been pushed for the command with a fixed number of arguments. - -~~~~~{.cpp} - if (theArgsNb != 3) - { - std::cout << "Syntax error - wrong number of arguments!\n"; - return 1; - } - - Standard_Integer anArgIter = 1; - Standard_CString aResName = theArgVec[anArgIter++]; - Standard_CString aFaceName = theArgVec[anArgIter++]; - TopoDS_Shape aFaceShape = DBRep::Get (aFaceName); - if (aFaceShape.IsNull() - || aFaceShape.ShapeType() != TopAbs_FACE) - { - std::cout << "Shape " << aFaceName << " is empty or not a Face!\n"; - return 1; - } - DBRep::Set (aResName, aFaceShape); - return 0; -~~~~~ - -### Message printing - -Informative messages should be printed into standard output *std::cout*, whilst command results (if any) -- into Draw Interpreter. - -Information printed into Draw Interpreter should be well-structured to allow usage in TCL script. - -### Long list of arguments - -Any command with a long list of obligatory parameters should be considered as ill-formed by design. -Optional parameters should start with flag name (with '-' prefix) and followed by its values: - -~~~~~{.tcl} -myCommand -flag1 value1 value2 -flag2 value3 -~~~~~ - -### Arguments parser - -- Integer values should be read using *Draw::Atoi()* function. -- Real values should be read using *Draw::Atof()* function. -- Flags names should be checked in case insensitive manner. - -Functions *Draw::Atof()* and *Draw::Atoi()* support expressions and read values in C-locale. - -~~~~~{.cpp} - Standard_Real aPosition[3] = {0.0, 0.0, 0.0}; - for (Standard_Integer anArgIter = 1; anArgIter < theArgsNb; ++anArgIter) - { - Standard_CString anArg = theArgVec[anArgIter]; - TCollection_AsciiString aFlag (anArg); - aFlag.LowerCase(); //!< for case insensitive comparison - if (aFlag == "position") - { - if ((anArgIt + 3) >= theArgsNb) - { - std::cerr << "Wrong syntax at argument '" << anArg << "'!\n"; - return 1; - } - aPosition[0] = Draw::Atof (theArgVec[++anArgIt]); - aPosition[1] = Draw::Atof (theArgVec[++anArgIt]); - aPosition[2] = Draw::Atof (theArgVec[++anArgIt]); - } - else - { - std::cout << "Syntax error! Unknown flag '" << anArg << "'\n"; - return 1; - } - } -~~~~~ - -@section occt_coding_rules_11 Examples - -### Sample documented class - -@verbatim -class Package_Class -{ - -public: //! @name public methods - - //! Method computes the square value. - //! @param theValue the input value - //! @return squared value - Standard_Export Standard_Real Square (const Standard_Real theValue); - -private: //! \@name private methods - - //! Auxiliary method - void increment(); - -private: //! \@name private fields - - Standard_Integer myCounter; //!< usage counter - -}; - - -@endverbatim - -~~~~~ -#include -// ========================================================== -// function : Square -// purpose : Method computes the square value -// ========================================================== -Standard_Real Package_Class::Square (const Standard_Real theValue) -{ - increment(); - return theValue * theValue; -} - -// ========================================================== -// function : increment -// purpose : -// ========================================================== -void Package_Class::increment() -{ - ++myCounter; -} -~~~~~ - -### TCL script for Draw Harness - -~~~~~{.tcl} -# show fragments (solids) in shading with different colors -proc DisplayColored {theShape} { - set aSolids [uplevel #0 explode $theShape so] - set aColorIter 0 - set THE_COLORS {red green blue1 magenta1 yellow cyan1 brown} - foreach aSolIter $aSolids { - uplevel #0 vdisplay $aSolIter - uplevel #0 vsetcolor $aSolIter [lindex $THE_COLORS [expr [incr aColorIter] % [llength $THE_COLORS]]] - uplevel #0 vsetdispmode $aSolIter 1 - uplevel #0 vsetmaterial $aSolIter plastic - uplevel #0 vsettransparency $aSolIter 0.5 - } -} - -# load modules -pload MODELING VISUALIZATION - -# create boxes -box bc 0 0 0 1 1 1 -box br 1 0 0 1 1 2 -compound bc br c - -# show fragments (solids) in shading with different colors -vinit View1 -vclear -vaxo -vzbufftrihedron -DisplayColored c -vfit -vdump $imagedir/${casename}.png 512 512 -~~~~~ - -### GLSL program: -~~~~~{.fs} -vec3 Ambient; //!< Ambient contribution of light sources -vec3 Diffuse; //!< Diffuse contribution of light sources -vec3 Specular; //!< Specular contribution of light sources - -//! Computes illumination from light sources -vec4 ComputeLighting (in vec3 theNormal, - in vec3 theView, - in vec4 thePoint) -{ - // clear the light intensity accumulators - Ambient = occLightAmbient.rgb; - Diffuse = vec3 (0.0); - Specular = vec3 (0.0); - vec3 aPoint = thePoint.xyz / thePoint.w; - for (int anIndex = 0; anIndex < occLightSourcesCount; ++anIndex) - { - int aType = occLight_Type (anIndex); - if (aType == OccLightType_Direct) - { - directionalLight (anIndex, theNormal, theView); - } - else if (aType == OccLightType_Point) - { - pointLight (anIndex, theNormal, theView, aPoint); - } - } - - return vec4 (Ambient, 1.0) * occFrontMaterial_Ambient() - + vec4 (Diffuse, 1.0) * occFrontMaterial_Diffuse() - + vec4 (Specular, 1.0) * occFrontMaterial_Specular(); -} - -//! Entry point to the Fragment Shader -void main() -{ - gl_FragColor = computeLighting (normalize (Normal), - normalize (View), - Position); -} -~~~~~ diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/contribution_workflow/contribution_workflow.md opencascade-7.5.1+dfsg1/dox/dev_guides/contribution_workflow/contribution_workflow.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/contribution_workflow/contribution_workflow.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/contribution_workflow/contribution_workflow.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,464 +0,0 @@ -Contribution Workflow {#occt_dev_guides__contribution_workflow} -==================================== -@tableofcontents - -@section occt_contribution_intro Introduction - -The purpose of this document is to describe standard workflow for processing contributions to certified version of OCCT. - -@subsection occt_contribution_intro_tracker Use of issue tracker system - -Each contribution should have corresponding issue (bug, or feature, or integration request) -registered in the MantisBT issue tracker system accessible by URL -https://tracker.dev.opencascade.org. -The issue is processed according to the described workflow. - -@subsection occt_contribution_intro_access Access levels - -Access level defines the permissions of the user to view, register and modify issues in the issue tracker. -The correspondence of access level and user permissions is defined in the table below. - -| Access level | Granted to | Permissions | Can set statuses | -|:------------- | :--------- | :-------------- | :----------------------- | -| Viewer | Everyone (anonymous access) | View public issues only | None | -| Updater | Users registered on dev.opencascade.org, in Open CASCADE project | View and comment issues | None | -| Reporter | Users registered on dev.opencascade.org, in Community project | View, report, and comment issues | New, Resolved, Feedback | -| Developer | OCC developers and (in Community project) external contributors who signed the CLA | View, report, modify, and handle issues | New, Assigned, Resolved, Reviewed, Feedback | -| Tester | OCC engineer devoted to certification testing | View, report, modify, and handle issues | Assigned, Tested, Feedback | -| Maintainer | Person responsible for a project or OCCT component | View, report, modify, and handle issues | New, Resolved, Reviewed, Tested, Closed, Feedback | -| Bugmaster | Person responsible for Mantis issue tracker, integrations, certification, and releases | Full access | All statuses | - -According to his access level, the user can participate in the issue handling process under different roles, as described below. - -@section occt_contribution_workflow Standard workflow for an issue - -@subsection occt_contribution_workflow_general General scheme - -
-@figure{OCCT_ContributionWorkflow_V3_image001.svg,"Standard life cycle of an issue",360} -
- -@subsection occt_contribution_workflow_issue Issue registration - -An issue is registered in Mantis bugtracker by the **Reporter** with definition of the necessary attributes (see also @ref occt_contribution_app): - -**Category** -- indicates the OCCT component, to which the issue relates. - (If in doubt, assign to OCCT:Foundation Classes.) - -**Severity** -- indicates the impact of the issue in the context where it was discovered. - -**Profile** -- specifies the configuration, on which the problem was detected. -For specific configurations it is possible to specify separately platform, OS, and version. -These fields can be left empty if the issue is not configuration-specific. -Additional details relevant for the environment where the issue is reproduced (such as compiler version, bitness, etc.) can be provided in the **Description**. - -**Products Version** -- defines the OCCT version, on which the problem has been detected. - -It is preferable to indicate the version of the earliest known official release where the problem can be reproduced. -If the issue is reported on the current development version of OCCT, the current development version should be used (for convenience, this version is marked by asterisk in Mantis). - -@note OCCT version number can be consulted in the file Standard_Version.hxx (value of OCC_VERSION_COMPLETE macro). - -**Assign to** -- developer to whom the issue will be assigned. - By default, it is set to **Maintainer** of the OCCT component selected in **Category** field. - -**Target Version** -- defines the target version for the fix to be provided. - By default, it is set to the current version under development. - -**Summary** -- a short, one sentence description of the issue. - -The **Summary** has a limit of 128 characters. -It should be informative and useful for the developers. -It is not allowed to mention the issue originator, and in particular the customer, in the name of the registered issue. - -A good practice is to start the issue with indication of the relevant component (OCCT module, package, class etc.) to better represent its context. - -The summary should be given in imperative mood when it can be formulated as goal to be achieved or action to be done. -In particular, this applies to feature requests and improvements, for instance: - -> *Visualization - provide a support of zoom persistent selection* - -If the issue reports a problem, the summary should be given in Present Simple. -If reported problem is believed to be a regression, it is recommended to indicate this in the summary, like this: - -> [Regression in 6.9.0] *IGES - Export of a reversed face leads to wrong data* - -**Description** -- should contain a detailed definition of the nature of the registered issue depending on its type. - -For a bug it is required to submit a detailed description of the incorrect behavior, including the indication of the cause of the problem (if known at this stage), and details on the context where the issue has been detected. - -For a feature or integration request it is necessary to describe the proposed feature in details (as much as possible at that stage), including the changes required for its implementation and the main features of the new functionality. - -Example: - -> *Currently selection does not work correctly for non-zoomable objects (those defined using transform persistence). To provide correct selection for such objects, first-level (object) BVH structures must be updated on each camera change, and frustum must be rebuilt accordingly.* - -@note In the description and notes to the issues you can refer to another issue by its ID prefixed by number sign (e.g.: #12345), and refer to a note by its ID prefixed by tilde (e.g.: ~20123). -These references will be expanded by Mantis into links to the corresponding issue or note. -When the number sign or the tilde followed by digits are a part of a normal text, add a space before digits (e.g.: "face # 12345 contains ~ 1000 edges") to avoid this conversion. - -**Steps To Reproduce** -- allows describing in detail how to reproduce the issue. - -This information is crucial for the developer to investigate the cause of the problem and to create the test case. -The optimal approach is to give a sequence of @ref occt_user_guides__test_harness "DRAW Test Harness" commands to reproduce the problem in DRAW. -This information can also be provided as a DRAW Tcl script attached to the issue (in **Upload File** field). - -**Additional information and documentation updates** -- any additional information, remarks to be taken into account in Release Notes, etc.. - -**Upload File** -- allows attaching the shapes, snapshots, scripts, documents, or modified source files of OCCT. - -This field can be used to attach a prototype test case in form of a Tcl script for DRAW, a C++ code which can be organized in DRAW commands, sample shapes, documents describing proposed change or analysis of the problem, or other data required for reproduction of the issue. -Where applicable, pictures demonstrating a problem and/or desired result can be attached. - -The newly registered issue gets status **NEW** and is assigned to the person indicated in the **Assign to** field. - -@subsection occt_contribution_workflow_assign Assigning the issue - -The description of the new issue is checked by the **Maintainer** and if it is feasible, he may assign the issue to a **Developer**. -Alternatively, any user with **Developer** access level or higher can assign the issue to himself if he wants to provide a solution. - -The recommended way to handle contributions is that the **Reporter** assigns the issue to himself and provides a solution. - -The **Maintainer** or **Bugmaster** can close or reassign the issue (in **FEEDBACK** state) to the **Reporter** after it has been registered, if its description does not contain sufficient details to reproduce the bug or explain the need of the new feature. -That decision shall be documented in the comments to the issue in the Bugtracker. - -The assigned issue has status **ASSIGNED**. - -@subsection occt_contribution_workflow_fix Resolving the issue - -The **Developer** responsible for the issue assigned to him provides a solution including: - -* Changes in the code, with appropriate comments; -* Test case (when applicable) and data necessary for its execution; -* Changes in the user and developer guides (when necessary). - -The change is integrated to branch named CRxxxxx (where **xxxxx** is issue number) in the OCCT Git repository, based on current master, and containing a single commit with the appropriate description. -Then the issue is switched to **RESOLVED** for further review and testing. - -The following sub-sections describe this process, relevant requirements and options, in more details. - -@subsubsection occt_contribution_workflow_fix_code Requirements to the code modification - -The amount of code affected by the change should be limited to the changes required for the bug fix or improvement. -Change of layout or re-formatting of the existing code is allowed only in the parts where meaningful changes related to the issue have been made. - -@note If deemed useful, re-formatting or cosmetic changes affecting considerable parts of the code can be made within a dedicated issue. - -The changes should comply with the OCCT @ref occt_dev_guides__coding_rules "Codng Rules". -It is especially important to comment the code properly so that other people can understand it easier. - -The modification should be tested by running OCCT tests (on the platform and scope available to **Developer**) and ensuring absence of regressions. -In case if modification affects results of some existing test case and the new result is correct, such test case should be updated to report OK (or BAD), as descibed in @ref testmanual_details_results "Automated Test System / Interpretation of Test Results". - -@subsubsection occt_contribution_workflow_fix_test Providing a test case - -For modifications affecting OCCT functionality, a test case should be created (unless already exists) and included in the commit or patch. -See @ref testmanual_intro_quick_create "Automated Test System / Creating a New Test" for relevant instructions. - -The data files required for a test case should be attached to the corresponding issue in Mantis (i.e. not included in the commit). - -When the test case cannot be provided for any reason, the maximum possible information on how the problem can be reproduced and how to check the fix should be provided in the **Steps to Reproduce** field of an issue. - -@subsubsection occt_contribution_workflow_fix_doc Updating user and developer guides - -If the change affects a functionality described in @ref user_guides "User Guides", the corresponding user guide should be updated to reflect the change. - -If the change affects OCCT test system, build environment, or development tools described in @ref dev_guides "Developer Guides", the corresponding guide should be updated. - -The changes that break compatibility with the previous versions of OCCT (i.e. affecting API or behavior of existing functionality in the way that may require update of existing applications based on an earlier official release of OCCT to work correctly) should be described in the document @ref occt_dev_guides__upgrade "Upgrade from previous OCCT versions". -It is recommended to add a sub-section for each change described. -The description should provide the explanation of the incompatibility introduced by the change, and describe how it can be resolved (at least, in known situations). -When feasible, the automatic upgrade procedure (adm/upgrade.tcl) can be extended by a new option to perform the required upgrade of the dependent code automatically. - -@subsubsection occt_contribution_workflow_fix_git Submission of change as a Git branch - -The modification of sources should be provided in the dedicated branch of the official OCCT Git repository. - -The branch should contain a single commit, with the appropriate commit message (see @ref occt_contribution_workflow_fix_commit "Requirements to the commit message" below). - -In general, this branch should be based on the recent version of the master branch. -It is highly preferable to submit changes basing on the current master. -In case if the fix is implemented on the previous release of OCCT, the branch can be based on the corresponding tag in Git, instead of the master. - -The branch name should be composed of letters **CR** (abbreviation of "Change Request") followed by the issue ID number (without leading zeros). -It is possible to add an optional suffix to the branch name after the issue ID, e.g. to distinguish between several versions of the fix (see @ref occt_contribution_nonstd_rebase). - -See @ref occt_dev_guides__git_guide "Guide to using GIT" for help. - -@note When a branch with the name given according to the above rule is pushed to Git, a note is automatically added to the corresponding issue in Mantis, indicating the person who has made the push, the commit hash, and (for new commits) the description. - -@subsubsection occt_contribution_workflow_fix_commit Requirements to the commit message - -The commit message posted in Git constitutes an integral part of both the fix and the release documentation. - -The first line of the commit message should contain the Summary of the issue (starting with its ID followed by colon, e.g. "0022943: Bug in TDataXtd_PatternStd"), followed by an empty line. - -The following lines should provide a description of the context and details on the changes made. -The contents and the recommended structure of the description depend on the nature of the bug. - -In a general case, the following elements should be present: -* **Problem** -- a description of the unwanted behavior; -* **Change** -- a description of the implemented changes, including the names of involved classes / methods / enumerations etc.; -* **Result** -- a description of the current behavior (after the implementation). - -Example: - -> *0026330: BRepOffsetAPI_ThruSections creates invalid shape.* -> -> *Methods BRep_Tool::CurveOnSurface() and BRepCheck_Edge::InContext() now properly handle parametric range on a 3D curve when it is used to generate a p-curve dynamically (on a planar surface) and both the surface and the 3D curve have non-null locations.* - -Provide sufficient context so that potential user of the affected functionality can understand what has been changed and how the algorithm works now. -Describe reason and essence of the changes made, but do not go too deep into implementation details -- these should be reflected in comments in the code. - -@subsubsection occt_contribution_workflow_fix_resolve Marking issue as resolved - -To mark the change as ready for review and testing, the corresponding issue should be switched to **RESOLVED** state. -By default, the issue gets assigned to the **Maintainer** of the component, who is thus responsible for its review. -Alternatively, another person can be selected as a reviewer at this step. - -When the issue is switched to **RESOLVED**, it is required to update or fill the field **Steps to reproduce**. -The possible variants are: - -* The name of an existing or new test case (preferred variant); -* A sequence of DRAW commands; -* N/A (Not required / Not possible / Not applicable); -* Reference to an issue in the bug tracker of another project. - -@subsection occt_contribution_workflow_review Code review - -The **Reviewer** analyzes the proposed solution for applicability in accordance with OCCT @ref occt_dev_guides__coding_rules "Coding Rules" and examines all changes in the sources, test case(s), and documentation to detect obvious and possible errors, misprints, or violations of the coding style. - -If the Reviewer detects some problems, he can either: - -* Fix these issues and provide a new solution. - The issue can then be switched to **REVIEWED**. - - In case of doubt or possible disagreement the **Reviewer** can reassign the issue (in **RESOLVED** state) to the **Developer**, who then becomes a **Reviewer**. - Possible disagreements should be resolved through discussion, which is done normally within issue notes (or on the OCCT developer’s forum if necessary). - -* Reassign the issue back to the **Developer**, providing detailed list of remarks. The issue then gets status **ASSIGNED** and a new solution should be provided. - -If Reviewer does not detect any problems, or provides a corrected version, he changes status to **REVIEWED**. -The issue gets assigned to the **Bugmaster**. - -@subsection occt_contribution_workflow_test Testing - - The issues that are in **REVIEWED** state are subject of certification (non-regression) testing. - The issue is assigned to an OCCT **Tester** when he starts processing it. - - If the branch submitted for testing is based on obsolete status of the master branch, **Tester** @ref occt_contribution_nonstd_rebase "rebases" it on master HEAD. - In case of conflicts, the issue is assigned back to **Developer** in **FEEDBACK** status, requesting for a rebase. - - Certification testing includes: - * Addition of new data models (if required for a new test case) to the data base; - * Revision of the new test case(s) added by developer, and changes in the existing test cases included in commit. - The **Tester** can amend tests to ensure their correct behavior in the certification environment. - * Building OCCT on a sub-set of supported configurations (OS and compiler), watching for errors and warnings; - * Execution of tests on sub-set of supported platforms (at least, one Windows and one Linux configuration), watching for regressions; - * Building OCCT samples, watching for errors; - * Building and testing of OCC products based on OCCT. - -If the **Tester** does not detect problems or regressions, he changes the status to **TESTED** for further integration. - -If the **Tester** detects build problems or regressions, he changes the status to **ASSIGNED** and reassigns the issue to the **Developer** with a detailed description of the problems. -The **Developer** should analyze the reported problems and, depending on results of this analysis, either: -* Confirm that the detected problems are expected changes and they should be accepted as a new status of the code. Then the issue should be switched to **FEEDBACK** and assigned to the **Bugmaster**. -* Produce a new solution (see @ref occt_contribution_workflow_fix, and also @ref occt_contribution_nonstd_minor). - -@subsection occt_contribution_workflow_integrate Integration of a solution - -Before integration into the master branch of the repository the **Integrator** checks the following conditions: - * the change has been reviewed; - * the change has been tested without regressions (or with regressions treated properly); - * the test case has been created for this issue (when applicable), and the change has been rechecked on this test case; - * the change does not conflict with other changes integrated previously. - -If the result of check is successful the Integrator integrates the solution into the branch. -The integrations are performed weekly; integration branches are named following the pattern IR-YYYY-MM-DD. - -Each change is integrated as a single commit without preserving the history of changes made in the branch (by rebase, squashing all intermediate commits if any), however, preserving the author when possible. -This is done to have the master branch history plain and clean. -The following picture illustrates the process: - -@figure{OCCT_ContributionWorkflow_V3_image002.png,"Integration of several branches",420} - -The new integration branch is tested against possible regressions that might appear due to interference between separate changes. -When the tests are OK, the integration branch is pushed as the new master to the official repository. -The issue status is set then to **VERIFIED** and is assigned to the **Reporter** so that he could check the fix as integrated. - -The branches corresponding to the integrated fixes are removed from the repository by the **Bugmaster**. - -@subsection occt_contribution_workflow_close Closing an issue - -When possible, the **Reporter** should check whether the problem is actually resolved in the environment where it has been discovered, after the fix is integrated to master. -If the fix does not actually resolve the original problem, the issue in **VERIFIED** status can be reopened and assigned back to the **Developer** for rework. -The details on how to check that the issue is still reproducible should be provided. -However, if the issue does resolve the problem as described in the original report, but a similar problem is discovered for another input data or configuration, or the fix has caused a regression, that problem should be registered as a separate (@ref occt_contribution_nonstd_relate "related") issue. - -If the fix integrated to master causes regressions, **Bugmaster** can revert it and reopen the issue. - -The **Bugmaster** closes the issue after the regular OCCT Release, provided that the issue status is **VERIFIED** and the change was actually included in the release. -The final issue state is **CLOSED**. - -The field **Fixed in Version** of the issue is set to the OCCT version where it is fixed. - -@section occt_contribution_nonstd Additional workflow elements - -@subsection occt_contribution_nonstd_feedback Requesting more information or specific action - -If, at any step of the issue lifetime, the person responsible for it cannot process it due to absence of required information, expertise, or rights, he can switch it to status **FEEDBACK** and assign to the person who is (presumably) able to resolve the block. Some examples of typical situations where **FEEDBACK** is used are: - -* The **Maintainer** or the **Developer** requests for more information from the **Reporter** to reproduce the issue; -* The **Tester** requests the **Developer** or the **Maintainer** to help him in the interpretation of testing results; -* The **Developer** or the **Maintainer** asks the **Bugmaster** to close the issue that is found irrelevant or already fixed (see @ref occt_contribution_nonstd_autofix). - -In general, issues with status **FEEDBACK** should be processed as fast as possible, to avoid unjustified delays. - -@subsection occt_contribution_nonstd_relate Defining relationships between issues - -When two or more issues are related to each other, this relationship should be reflected in the issue tracker. -It is also highly recommended to add a note to explain the relationship. -Typical cases of relationships are: - -* Issue A is caused by previous fix made for issue B (A is a child of B); -* Issue A describes the same problem as issue B (A is a duplicate of B); -* Issues A and B relate to the same piece of code, functionality etc., in the sense that the fix for one of these issues will affect the other (A is related to B) - -When the fix made for one issue also resolves another one, these issues should be marked as related or duplicate. -In general, the duplicate issue should have the same status, and, when closed, be marked as fixed in the same OCCT version, as the main one. - -@subsection occt_contribution_nonstd_patch Submission of a change as a patch - -In some cases (if Git is not accessible for the contributor), external contributions can be submitted as a patch file (generated by *diff* command) or as modified sources attached to the Mantis issue. -The OCCT version, for which the patch is generated, should be clearly specified (e.g. as hash code of Git commit if the patch is based on an intermediate state of the master). - -@note Such contributions should be put to Git by someone else (e.g. the **Reviewer**), this may cause delay in their processing. - -@subsection occt_contribution_nonstd_rebase Updating branches in Git - -Updates of the existing branch (e.g. taking into account the remarks of the **Reviewer**, or fixing regressions) should be provided as new commits on top of previous state of the branch. - -It is allowed to rebase the branch on the new state of the master and push it to the repository under the same name (with --force option) provided that the original sequence of commits is preserved. - -When a change is squashed into a single commit (e.g. to be submitted for review), it should be pushed into a branch a with different name. - -The recommended approach is to add a numeric suffix (index) indicating the version of the change, e.g. "CR12345_5". -Usually it is worth keeping a non-squashed branch in Git for reference. - -To avoid confusions, the branch corresponding to the latest version of the change should have a greater index. - -@note Make sure to revise the commit message after squashing a branch, to keep it meaningful and comprehensive. - -@subsection occt_contribution_nonstd_minor Minor corrections - -In some cases review remarks or results of testing require only minor corrections to be done in the branch containing a change. -"Minor" implies that the correction does not impact the functionality and does not affect the description of the previously committed change. - -As an exception to general @ref occt_contribution_workflow_fix_git "single-commit rule", it is allowed to put such minor corrections on top of the existing branch as a separate commit, and re-submit it for further processing in the same branch, without squashing. - -Minor commits should have a single-line message starting with #. -These messages will be ignored when the branch is squashed at integration. - -Typical cases of minor corrections are: - -* Amendments of test cases (including those made by the **Tester** to adjust a test script to a specific platform); -* Trivial corrections of compilation warnings (such as removal of an unused variable); -* Addition or correction of comments or documentation; -* Corrections of code formatting (e.g. reversion of irrelevant formatting changes made in the main commit). - -@subsection occt_contribution_nonstd_autofix Handling non-reproducible issues - -Investigation of each issue starts with reproducing it on current development version (master). - -If it cannot be reproduced on the current master, but can be reproduced on one of previous releases (or previous state of the master), it is considered as solved by a change made for another issue. -If that "fixing" issue can be identified (e.g. by parsing Git log), it should be set as related to that issue. -The issue should be switched to **FEEDBACK** and assigned to the **Bugmaster** for further processing. - -The **Bugmaster** decides whether it is necessary to create a test case for that issue, and if so may assign it to the **Developer** or the **Tester** to create a test. -The issue then follows the standard workflow. - -Otherwise, if the issue is fixed in one of previous releases, the **Bugmaster** closes it setting the appropriate value in **Fixed in Version** field, or, if the issue is fixed after the last release, switches it to **VERIFIED** status. - -If the issue cannot be reproduced due to an unclear description, missing data, etc., it should be assigned back to the **Reporter** in **FEEDBACK** status, requesting for more information. -The **Reporter** should provide additional information within one month; after that time, if no new information is provided, the issue should be closed by the **Bugmaster** with resolution **Unable to reproduce**. - -@section occt_contribution_app Appendix: Issue attributes - -@subsection occt_contribution_app_category Category - -The category corresponds to the component of OCCT where the issue is found: - - | Category | Component | - | :--------------------------- | :----------------------------------------------------- | - | OCCT:Foundation Classes | Foundation Classes module | - | OCCT:Modeling Data | Modeling Data classes | - | OCCT:Modeling Algorithms | Modeling Algorithms, except shape healing and meshing | - | OCCT:Shape Healing | Shape Healing component (TKShapeHealing) | - | OCCT:Mesh | BRepMesh algorithm | - | OCCT:Data Exchange | Data Exchange module | - | OCCT:Visualization | Visualization module | - | OCCT:Application Framework | OCAF | - | OCCT:DRAW | DRAW Test Harness | - | OCCT:Tests | Automatic Test System | - | OCCT:Documentation | Documentation | - | OCCT:Coding | General code quality | - | OCCT:Configuration | Configuration, build system, etc. | - | OCCT:Releases | Official OCCT releases | - | Website:Tracker | OCCT Mantis issue tracker, tracker.dev.opencascade.org | - | Website:Portal | OCCT development portal, dev.opencascade.org | - | Website:Git | OCCT Git repository, git.dev.opencascade.org | - - -@subsection occt_contribution_app_severity Severity - - Severity shows at which extent the issue affects the product. - The list of used severities is given in the table below in the descending order. - - | Severity | Description | - | :---------- | :------------------------------------------------ | - | crash | Crash of the application or OS, loss of data | - | block | Regression corresponding to the previously delivered official version. Impossible operation of a function on any data with no work-around. Missing function previously requested in software requirements specification. Destroyed data. | - | major | Impossible operation of a function with existing work-around. Incorrect operation of a function on a particular dataset. Impossible operation of a function after intentional input of incorrect data. Incorrect behavior of a function after intentional input of incorrect data. | - | minor | Incorrect behavior of a function corresponding to the description in software requirements specification. Insufficient performance of a function. | - | tweak | Ergonomic inconvenience, need of light updates. | - | text | Non-conformance of the program code to the Coding Rules, mistakes and non-functional errors in the source text (e.g. unnecessary variable declarations, missing comments, grammatical errors in user manuals). | - | trivial | Cosmetic issues. | - | feature | Request for a new feature or improvement. | - | integration request | Requested integration of an existing feature into the product. | - | just a question | A question to be processed, without need of any changes in the product. | - -@subsection occt_contribution_app_status Status - - The bug statuses that can be applied to the issues are listed in the table below. - - | Status | Description | - | :------------------- | :----------------------------------------- | - | New | A new, just registered issue. | - | Acknowledged | Can be used to mark the issue as postponed. | - | Confirmed | Can be used to mark the issue as postponed. | - | Feedback | The issue requires more information or a specific action. | - | Assigned | Assigned to a developer. | - | Resolved | The issue has been fixed, and now is waiting for review. | - | Reviewed | The issue has been reviewed, and now is waiting for testing (or being tested). | - | Tested | The fix has been internally tested by the tester with success on the full non-regression database or its part and a test case has been created for this issue. | - | Verified | The fix has been integrated into the master of the corresponding repository | - | Closed + resolution | The fix has been integrated to the master. The corresponding test case has been executed successfully. The issue is no longer reproduced. | - -@subsection occt_contribution_app_resolution Resolution - - **Resolution** is set when the bug is closed. "Reopen" resolution is added automatically when the bug is reopened. - - | Resolution | Description | - |:--------------------- | :--------------------------------------------------------------------------- | - | Open | The issue is pending. | - | Fixed | The issue has been successfully fixed. | - | Reopened | The bug has been reopened because of insufficient fix or regression. | - | Unable to reproduce | The bug is not reproduced. | - | Not fixable | The bug cannot be fixed because e.g. it is a bug of third party software, OS or hardware limitation, etc. | - | Duplicate | The bug for the same issue already exists in the tracker. | - | Not a bug | It is a normal behavior in accordance with the specification of the product. | - | No change required | The issue didn’t require any change of the product, such as a question issue.| - | Suspended | The issue is postponed (for Acknowledged status). | - | Documentation updated | The documentation has been updated to resolve a misunderstanding causing the issue. | - | Won’t fix | It is decided to keep the existing behavior. | - diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image001.svg opencascade-7.5.1+dfsg1/dox/dev_guides/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image001.svg --- opencascade-7.4.1+dfsg1/dox/dev_guides/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image001.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image001.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,1609 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - YES, bug - - - Reporter - provides - more info - - - No - t clear: - - more info - - requested - - - Developer resolves - - the issue - - - Reporter registers an issue - - - - New - - - - - Resolved - - - - Ma - intainer - - checks - - the - description - - - - Feedback - - - - - - - - YES, fixed - - - Reporter - - is not satisfied - with - - the - fix - - - YES, fixed - , no regressions - - - Tester - is not satisfied - with - the - fix - - - Integrator merges the fix to trunk - - - Tester verifies the solution - - - - - Tested - - - - Integration to the trunk - - Verified - - - - - Fixed? - - - - - Conflict ? - - - - YES, fixed - - - - Assigned - - - Reviewer - - verifies the solution - - - - - Reviewer - - is not - satisfied with - the fix - - - - - Good - ? - - - - Reviewed - - - + Resolution - - - - Delivery of the release - - Closed - - - YES, code is good - - - Reporter can re - - - check the fix - - - - - OK - ? - - - - - Conflict with other - change is detected - - - - - - YES, fix provided - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Clear? - Fix provided? - - Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/contribution_workflow/images/OCCT_ContributionWorkflow_V3_image002.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/debug/debug.md opencascade-7.5.1+dfsg1/dox/dev_guides/debug/debug.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/debug/debug.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/debug/debug.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,370 +0,0 @@ -Debugging tools and hints {#occt_dev_guides__debug} -========================= - -@tableofcontents - -@section occt_debug_intro Introduction - -This manual describes facilities included in OCCT to support debugging, and provides some hints for more efficient debug. - -@section occt_debug_macro Compiler macro to enable extended debug messages - -Many OCCT algorithms can produce extended debug messages, usually printed to cout. -These include messages on internal errors and special cases encountered, timing etc. -In OCCT versions prior to 6.8.0 most of these messages were activated by compiler macro *DEB*, enabled by default in debug builds. -Since version 6.8.0 this is disabled by default but can be enabled by defining compiler macro *OCCT_DEBUG*. - -To enable this macro on Windows when building with Visual Studio projects, edit file custom.bat and add the line: - - set CSF_DEFINES=OCCT_DEBUG - -Some algorithms use specific macros for yet more verbose messages, usually started with OCCT_DEBUG_. -These messages can be enabled in the same way, by defining corresponding macro. - -Note that some header files are modified when *OCCT_DEBUG* is enabled, hence binaries built with it enabled are not compatible with client code built without this option; this is not intended for production use. - -@section occt_debug_exceptions Calling JIT debugger on exception - -On Windows platform when using Visual Studio compiler there is a possibility to start the debugger automatically if an exception is caught in a program running OCCT. For this, set environment variable *CSF_DEBUG* to any value. Note that this feature works only if you enable OCCT exception handler in your application by calling *OSD::SetSignal()*. - -@section occt_debug_bop Self-diagnostics in Boolean operations algorithm - -In real-world applications modeling operations are often performed in a long sequence, while the user sees only the final result of the whole sequence. If the final result is wrong, the first debug step is to identify the offending operation to be debugged further. Boolean operation algorithm in OCCT provides a self-diagnostic feature which can help to do that step. - -This feature can be activated by defining environment variable *CSF_DEBUG_BOP*, which should specify an existing writeable directory. - -The diagnostic code checks validity of the input arguments and the result of each Boolean operation. When an invalid situation is detected, the report consisting of argument shapes and a DRAW script to reproduce the problematic operation is saved to the directory pointed by *CSF_DEBUG_BOP*. - -Note that this feature does not applicable for UWP build. - -@section occt_debug_call Functions for calling from debugger - -Modern interactive debuggers provide the possibility to execute application code at a program break point. This feature can be used to analyse the temporary objects available only in the context of the debugged code. OCCT provides several global functions that can be used in this way. - -Note that all these functions accept pointer to variable as void* to allow calling the function even when debugger does not recognize type equivalence or can not perform necessary type cast automatically. It is responsibility of the developer to provide the correct pointer. In general these functions are not guaranteed to work, thus use them with caution and at your own risk. - -@subsection occt_debug_call_draw Interacting with DRAW - -Open CASCADE Test Harness or @ref occt_user_guides__test_harness "DRAW" provides an extensive set of tools for inspection and analysis of OCCT shapes and geometric objects and is mostly used as environment for prototyping and debugging OCCT-based algorithms. - -In some cases the objects to be inspected are available in DRAW as results of DRAW commands. In other cases, however, it is necessary to inspect intermediate objects created by the debugged algorithm. To support this, DRAW provides a set of commands allowing the developer to store intermediate objects directly from the debugger stopped at some point during the program execution (usually at a breakpoint). - -~~~~~ -const char* Draw_Eval (const char *theCommandStr) -~~~~~ - -Evaluates a DRAW command or script. -A command is passed as a string parameter. - -~~~~~ -const char* DBRep_Set (const char* theNameStr, void* theShapePtr) -~~~~~ - -Sets the specified shape as a value of DRAW interpreter variable with the given name. -- *theNameStr* -- the DRAW interpreter variable name to set. -- *theShapePtr* -- a pointer to *TopoDS_Shape* variable. - -~~~~~ -const char* DBRep_SetComp (const char* theNameStr, void* theListPtr) -~~~~~ - -Makes a compound from the specified list of shapes and sets it as a value of DRAW interpreter variable with the given name. -- *theNameStr* -- the DRAW interpreter variable name to set. -- *theListPtr* -- a pointer to *TopTools_ListOfShape* variable. - -~~~~~ -const char* DrawTrSurf_Set (const char* theNameStr, void* theHandlePtr) -const char* DrawTrSurf_SetPnt (const char* theNameStr, void* thePntPtr) -const char* DrawTrSurf_SetPnt2d (const char* theNameStr, void* thePnt2dPtr) -~~~~~ - -Sets the specified geometric object as a value of DRAW interpreter variable with the given name. -- *theNameStr* -- the DRAW interpreter variable name to set. -- *theHandlePtr* -- a pointer to the geometric variable (Handle to *Geom_Geometry* or *Geom2d_Curve* or descendant) to be set. -- *thePntPtr* -- a pointer to the variable of type *gp_Pnt* to be set. -- *thePnt2dPtr* -- a pointer to the variable of type *gp_Pnt2d* to be set. - -All these functions are defined in *TKDraw* toolkit and return a string indicating the result of execution. - -@subsection occt_debug_call_brep Saving and dumping shapes and geometric objects - -The following functions are provided by *TKBRep* toolkit and can be used from debugger prompt: - -~~~~~ -const char* BRepTools_Write (const char* theFileNameStr, void* theShapePtr) -~~~~~ - -Saves the specified shape to a file with the given name. -- *theFileNameStr* -- the name of the file where the shape is saved. -- *theShapePtr* -- a pointer to *TopoDS_Shape* variable. - -~~~~~ -const char* BRepTools_Dump (void* theShapePtr) -const char* BRepTools_DumpLoc (void* theShapePtr) -~~~~~ - -Dumps shape or its location to cout. -- *theShapePtr* -- a pointer to *TopoDS_Shape* variable. - -The following function is provided by *TKMesh* toolkit: - -~~~~~ -const char* BRepMesh_Dump (void* theMeshHandlePtr, const char* theFileNameStr) -~~~~~ - -Stores mesh produced in parametric space to BREP file. -- *theMeshHandlePtr* -- a pointer to *Handle(BRepMesh_DataStructureOfDelaun)* variable. -- *theFileNameStr* -- the name of the file where the mesh is stored. - -The following functions are provided by *TKTopTest* toolkit: - -~~~~~ -const char* MeshTest_DrawLinks(const char* theNameStr, void* theFaceAttr) -const char* MeshTest_DrawTriangles(const char* theNameStr, void* theFaceAttr) -~~~~~ - -Sets the edges or triangles from mesh data structure of type *Handle(BRepMesh_FaceAttribute)* as DRAW interpreter variables, assigning a unique name in the form "_" to each object. -- *theNameStr* -- the prefix to use in names of objects. -- *theFaceAttr* -- a pointer to *Handle(BRepMesh_FaceAttribute)* variable. - -The following additional function is provided by *TKGeomBase* toolkit: - -~~~~~ -const char* GeomTools_Dump (void* theHandlePtr) -~~~~~ - -Dump geometric object to cout. -- *theHandlePtr* -- a pointer to the geometric variable (Handle to *Geom_Geometry* or *Geom2d_Curve* or descendant) to be set. - - -@section occt_debug_dump_json Dump OCCT objects into Json - -Many OCCT classes may dump the current state into the stream. This stream contains the information about the class field into the field value/s. -It is possible to prepare recursive dump using corresponded macro for class fields. The depth of this recursion is defined by parameter of the dump. -The object defines What parameters should be presented in the Dump. The usual way is to dump all object fields. - -@subsection occt_debug_dump_json_object Implementation in object - -Steps to prepare dump of the object into json: - -1. Create method DumpJson. The method should accept the output stream and the depth for the fields dump. -Depth, equal to zero means that only fields of this class should be dumped. Default value -1 means that whole tree of dump will be built recursively calling dump of all fields. - -2. Put into the first row of the method OCCT_DUMP_CLASS_BEGIN. This macro creates a local variable, that will open Json structure on start, and close on exit from this method. - -3. Add several macro to store field values. - -The following macro are defined to cover the object parameters into json format: - -| Name | Result in json | -| :-------------------------- | :--------| -| OCCT_DUMP_FIELD_VALUE_NUMERICAL | "field": value | -| OCCT_DUMP_FIELD_VALUE_STRING | "field": "value" | -| OCCT_DUMP_FIELD_VALUE_POINTER | "field": "pointer address" | -| OCCT_DUMP_FIELD_VALUES_DUMPED | "field": { result of field->DumpJson(...) } | -| OCCT_DUMP_FIELD_VALUES_NUMERICAL | "field": [value_1, ..., value_n] -| OCCT_DUMP_FIELD_VALUES_STRING | "field": ["value_1", ..., "value_n"] -| OCCT_DUMP_BASE_CLASS | "kind": { result of kind::DumpJson(...) } | - -@subsection occt_debug_dump_json_draw Using in DRAW - -In DRAW, key '-dumpJson' is used to dump an object. -It is implemented in 'vaspect' and 'boundingbox' commands. - -Json output for Bnd_OBB (using command 'bounding v -obb -dumpJson'): - -~~~~~ -"Bnd_OBB": { - "Center": { - "gp_XYZ": [1, 2, 3] - }, - "Axes[0]": { - "gp_XYZ:" [1, 0, 0] - }, - "Axes[1]": { - "gp_XYZ:" [0, 1, 0] - }, - "Axes[2]": { - "gp_XYZ:" [0, 0, 1] - }, - "HDims[0]": 0, - "HDims[1]": 0, - "HDims[2]": 0, - "IsAABox": 1, -} -~~~~~ - -@section occt_debug_vstudio Using Visual Studio debugger - -@subsection occt_debug_vstudio_command Command window - -Visual Studio debugger provides the Command Window (can be activated from menu View / Other Windows / Command Window), which can be used to evaluate variables and expressions interactively in a debug session (see https://msdn.microsoft.com/en-us/library/c785s0kz.aspx). Note that the Immediate Window can also be used but it has some limitations, e.g. does not support aliases. - -When the execution is interrupted by a breakpoint, you can use this window to call the above described functions in context of the currently debugged function. Note that in most cases you will need to specify explicitly context of the function by indicating the name of the DLL where it is defined. - -For example, assume that you are debugging a function, where local variable *TopoDS_Edge* *anEdge1* is of interest. -The following set of commands in the Command window will save this edge to file *edge1.brep*, then put it to DRAW variable *e1* and show it maximized in the axonometric DRAW view: - -~~~~~ ->? ({,,TKBRep.dll}BRepTools_Write)("d:/edge1.brep",(void*)&anEdge1) -0x04a2f234 "d:/edge1.brep" ->? ({,,TKDraw.dll}DBRep_Set)("e1",(void*)&anEdge1) -0x0369eba8 "e1" ->? ({,,TKDraw.dll}Draw_Eval)("donly e1; axo; fit") -0x029a48f0 "" -~~~~~ - -For convenience it is possible to define aliases to commands in this window, for instance (here ">" is prompt provided by the command window; in the Immediate window this symbol should be entered manually): - -~~~~~ ->alias deval ? ({,,TKDraw}Draw_Eval) ->alias dsetshape ? ({,,TKDraw}DBRep_Set) ->alias dsetcomp ? ({,,TKDraw}DBRep_SetComp) ->alias dsetgeom ? ({,,TKDraw}DrawTrSurf_Set) ->alias dsetpnt ? ({,,TKDraw}DrawTrSurf_SetPnt) ->alias dsetpnt2d ? ({,,TKDraw}DrawTrSurf_SetPnt2d) ->alias saveshape ? ({,,TKBRep}BRepTools_Write) ->alias dumpshape ? ({,,TKBRep}BRepTools_Dump) ->alias dumploc ? ({,,TKBRep}BRepTools_DumpLoc) ->alias dumpmesh ? ({,,TKMesh}BRepMesh_Dump) ->alias dumpgeom ? ({,,TKGeomBase}GeomTools_Dump) -~~~~~ - -Note that aliases are stored in the Visual Studio user's preferences and it is sufficient to define them once on a workstation. With these aliases, the above example can be reproduced easier (note the space symbol after alias name!): - -~~~~~ ->saveshape ("d:/edge1.brep",(void*)&anEdge1) -0x04a2f234 "d:/edge1.brep" ->dsetshape ("e1",(void*)&anEdge1) -0x0369eba8 "e1" ->deval ("donly e1; axo; fit") -0x029a48f0 "" -~~~~~ - -Note that there is no guarantee that the call will succeed and will not affect the program execution, thus use this feature at your own risk. In particular, the commands interacting with window system (such as *axo*, *vinit*, etc.) are known to cause application crash when the program is built in 64-bit mode. To avoid this, it is recommended to prepare all necessary view windows in advance, and arrange these windows to avoid overlapping with the Visual Studio window, to ensure that they are visible during debug. - -@subsection occt_debug_vstudio_watch Customized display of variables content - -Visual Studio provides a way to customize display of variables of different types in debugger windows (Watch, Autos, Locals, etc.). - -In Visual Studio 2005-2010 the rules for this display are defined in file *autoexp.dat* located in subfolder *Common7\\Packages\\Debugger* of the Visual Studio installation folder (hint: the path to that folder is given in the corresponding environment variable, e.g. *VS100COMNTOOLS* for vc10). This file contains two sections: *AutoExpand* and *Visualizer*. The following rules can be added to these sections to provide more convenient display of some OCCT data types. - -### \[AutoExpand\] section - -~~~~~ -; Open CASCADE classes -Standard_Transient=<,t> count= -Handle_Standard_Transient= count=count,d> <,t> -TCollection_AsciiString= -TCollection_HAsciiString= -TCollection_ExtendedString= -TCollection_HExtendedString= -TCollection_BaseSequence=size= curr= -TCollection_BasicMap=size= -NCollection_BaseSequence=size= curr= -NCollection_BaseList=length= -NCollection_BaseMap=size= buckets= -NCollection_BaseVector=length= -TDF_Label= tag=myTag> -TDF_LabelNode=tag= -TDocStd_Document=format= count= <,t> -TopoDS_Shape= -gp_XYZ=, , -gp_Pnt=, , -gp_Vec=, , -gp_Dir=, , -gp_XY=, -gp_Pnt2d=, -gp_Dir2d=, -gp_Vec2d=, -gp_Mat2d={,}, {,} -gp_Ax1=loc={, , } vdir={, , } -~~~~~ - -### \[Visualizer\] section - -~~~~~ -; Open CASCADE classes - -NCollection_Handle<*> { - preview ( *((($T0::Ptr*)$e.entity)->myPtr) ) - children ( (($T0::Ptr*)$e.entity)->myPtr ) -} - -NCollection_List<*> { - preview ( #( "NCollection_List [", $e.myLength, "]" ) ) - children ( #list( head: $c.myFirst, next: myNext ) : #(*($T1*)(&$e+1)) ) -} - -NCollection_Array1<*> { - preview ( #( "NCollection_Array1 [", $e.myLowerBound, "..", $e.myUpperBound, "]" ) ) - children ( #array( expr: $c.myData[$i], size: 1+$c.myUpperBound ) ) -} - -math_Vector { - preview ( #( "math_Vector [", $e.LowerIndex, "..", $e.UpperIndex, "]" ) ) - children ( #array ( expr: ((double*)($c.Array.Addr))[$i], size: 1+$c.UpperIndex ) ) -} - -TColStd_Array1OfReal { - preview ( #( "Array1OfReal [", $e.myLowerBound, "..", $e.myUpperBound, "]" ) ) - children ( #array ( expr: ((double*)($c.myStart))[$i], size: 1+$c.myUpperBound ) ) -} - -Handle_TColStd_HArray1OfReal { - preview ( #( "HArray1OfReal [", - ((TColStd_HArray1OfReal*)$e.entity)->myArray.myLowerBound, "..", - ((TColStd_HArray1OfReal*)$e.entity)->myArray.myUpperBound, "] ", - [$e.entity,x], " count=", $e.entity->count ) ) - children ( #array ( expr: ((double*)(((TColStd_HArray1OfReal*)$e.entity)->myArray.myStart))[$i], - size: 1+((TColStd_HArray1OfReal*)$e.entity)->myArray.myUpperBound ) ) -} - -TColStd_Array1OfInteger { - preview ( #( "Array1OfInteger [", $e.myLowerBound, "..", $e.myUpperBound, "]" ) ) - children ( #array ( expr: ((int*)($c.myStart))[$i], size: 1+$c.myUpperBound ) ) -} - -Handle_TColStd_HArray1OfInteger { - preview ( #( "HArray1OfInteger [", - ((TColStd_HArray1OfInteger*)$e.entity)->myArray.myLowerBound, "..", - ((TColStd_HArray1OfInteger*)$e.entity)->myArray.myUpperBound, "] ", - [$e.entity,x], " count=", $e.entity->count ) ) - children ( #array ( expr: ((int*)(((TColStd_HArray1OfInteger*)$e.entity)->myArray.myStart))[$i], - size: 1+((TColStd_HArray1OfInteger*)$e.entity)->myArray.myUpperBound ) ) -} - -Handle_TCollection_HExtendedString { - preview ( #( "HExtendedString ", [$e.entity,x], " count=", $e.entity->count, - " ", ((TCollection_HExtendedString*)$e.entity)->myString ) ) - children ( #([actual members]: [$e,!] ) ) -} - -Handle_TCollection_HAsciiString { - preview ( #( "HAsciiString ", [$e.entity,x], " count=", $e.entity->count, - " ", ((TCollection_HAsciiString*)$e.entity)->myString ) ) - children ( #([actual members]: [$e,!], - #array( expr: ((TCollection_HAsciiString*)$e.entity)->myString.mystring[$i], - size: ((TCollection_HAsciiString*)$e.entity)->myString.mylength) ) ) -} -~~~~~ - -In Visual Studio 2012 and later, visualizers can be put in a separate file in subdirectory *Visualizers*. See file *occt.natvis* for example. - -@section occt_debug_perf Performance measurement tools - -It is recommended to use specialized performance analysis tools to profile OCCT and application code. -However, when such tools are not available or cannot be used for some reason, tools provided by OSD package can be used: low-level C functions and macros defined in *OSD_PerfMeter.h* and *OSD_PerfMeter* class. - -This tool maintains an array of 100 global performance counters that can be started and stopped independently. Adding a performance counter to a function of interest allows to get statistics on the number of calls and the total execution time of the function. -* In C++ code, this can be achieved by creating local variable *OSD_PerfMeter* in each block of code to be measured. -* In C or Fortran code, use functions *perf_start_meter* and *perf_stop_meter* to start and stop the counter. - -Note that this instrumentation is intended to be removed when the profiling is completed. - -Macros provided in *OSD_PerfMeter.h* can be used to keep instrumentation code permanently but enable it only when macro *PERF_ENABLE_METERS* is defined. -Each counter has its name shown when the collected statistics are printed. - -In DRAW, use command *dperf* to print all performance statistics. - -Note that performance counters are not thread-safe. diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/debug/occt.natvis opencascade-7.5.1+dfsg1/dox/dev_guides/debug/occt.natvis --- opencascade-7.4.1+dfsg1/dox/dev_guides/debug/occt.natvis 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/debug/occt.natvis 1970-01-01 00:00:00.000000000 +0000 @@ -1,257 +0,0 @@ - - - - [{(float)x} {(float)y}] - - - - - [{(float)cood.x} {(float)cood.y}] - - - [{(float)x} {(float)y} {(float)z}] - - - - - [{(float)coord.x} {(float)coord.y} {(float)coord.z}] - - - [{v[0]} {v[1]}] - - - [{v[0]} {v[1]} {v[2]}] - - - [{v[0]} {v[1]} {v[2]} {v[3]}] - - - - [{(float)matrix[0][0]} {(float)matrix[0][1]}], [{(float)matrix[1][0]} {(float)matrix[1][1]}] - - - - - ((NCollection_Vec4<$T1>*)myMat)[0] - ((NCollection_Vec4<$T1>*)myMat)[1] - ((NCollection_Vec4<$T1>*)myMat)[2] - ((NCollection_Vec4<$T1>*)myMat)[3] - - - - NULL - [cnt={entity->count}] - - *entity - - - - NULL - {(void*)entity} [cnt={entity->count}] - - *((NCollection_Handle<$T1>::Ptr*)entity)->myPtr - - - - NULL - {(void*)entity} [cnt={entity->count} {*entity}] - - (opencascade::handle<$T1>::element_type*)entity - - - - {mylength}: {mystring,s} - - - {myString.mylength}: {myString.mystring,s} - - - {myLength}: {myString,s} - - - {mylength}: {(wchar_t *)mystring,su} - - - {myString.mylength}: {(wchar_t *)myString.mystring,su} - - - TCollection_Sequence [{Size}], curr={CurrentIndex} - - - - TCollection_Map [{mySize}] - - - TColStd_PackedMapOfInteger [{myExtent}] - - - NCollection_Vector [{myLength}] - - - myData->Length - *($T1*)((char*)myData->DataPtr + $i * myItemSize) - - - myLength - *($T1*)((char*)myData->DataPtr + $i * myItemSize) - - - - - NCollection_List [{myLength}] - - - myLength - myFirst - myNext - *($T1*)(sizeof(NCollection_ListNode) + ((char *)this)) - - - - - NCollection_Sequence [{mySize}] - - - mySize - myFirstItem - myNext - *($T1*)(sizeof(NCollection_SeqNode) + ((char *)this)) - - - - - - VOID - - Center: [{(float)myCenter[0]} {(float)myCenter[1]}], hSize: [{(float)myHSize[0]} {(float)myHSize[1]}] - - - - - VOID - - Center: [{(float)myCenter[0]} {(float)myCenter[1]} {(float)myCenter[2]}], hSize: [{(float)myHSize[0]} {(float)myHSize[1]} {(float)myHSize[2]}] - - - - NULL - [:{myLabelNode->myTag}] - - *myLabelNode - - - - [:{myTag}] - - * myBrother - * myFirstChild - myFirstAttribute - - - - NULL - - [transaction={((TDF_Attribute*)entity)->myTransaction}] - - - - (TDF_Attribute*)entity - - - - [{myGlVerMajor}.{myGlVerMinor}] - - - - - empty - {{size = {myUpperBound - myLowerBound + 1}}} - - myUpperBound - myLowerBound + 1 - - myUpperBound - myLowerBound + 1 - (Standard_Integer*)(myStart) + myLowerBound - - - - - - empty - {{size = {myUpperBound - myLowerBound + 1}}} - - myUpperBound - myLowerBound + 1 - - myUpperBound - myLowerBound + 1 - (Standard_Real*)(myStart) + myLowerBound - - - - - - - empty - extent = {(myUpperColumn-myLowerColumn+1) * (myUpperRow-myLowerRow+1)} - - - - - - {{current = {myValue}}} - - - this - (TColStd_ListNodeOfListOfInteger*)myNext - this->myValue - - - - - - empty - - (TColStd_ListNodeOfListOfInteger*)(myFirst) - - - - - {{current = {myValue}}} - - - this - (TColStd_ListNodeOfListOfReal*)myNext - this->myValue - - - - - - empty - - (TColStd_ListNodeOfListOfReal*)(myFirst) - - - - - empty - - (BRep_ListNodeOfListOfCurveRepresentation*)(myFirst) - - - - - {myOrient} {myTShape} loc={myLocation} - - - - subshapes={myShapes} flags={myFlags} - - - - {{{myIndex} {myParameter}}} - - - - edge={myEdge} orig={myOriginalEdge} pave1={myPave1} pave2={myPave2} extpaves={myExtPaves} - - - diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/dev_guides.md opencascade-7.5.1+dfsg1/dox/dev_guides/dev_guides.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/dev_guides.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/dev_guides.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - Developer Guides {#dev_guides} -================ - -The following documents provide information on OCCT building, development and testing: - -* @subpage occt_dev_guides__building "Building OCCT from sources" -* @subpage occt_dev_guides__documentation "Documentation system" -* @subpage occt_dev_guides__coding_rules "Coding Rules" -* @subpage occt_dev_guides__contribution_workflow "Contribution Workflow" -* @subpage occt_dev_guides__git_guide "Guide to installing and using Git for OCCT development" -* @subpage occt_dev_guides__tests "Automatic Testing system" -* @subpage occt_dev_guides__debug "Debugging tools and hints" - -The following guide provides information relevant to upgrading applications developed with previous versions of OCCT, to recent one: - -* @subpage occt_dev_guides__upgrade "Upgrade from previous OCCT versions" diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/documentation/documentation.md opencascade-7.5.1+dfsg1/dox/dev_guides/documentation/documentation.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/documentation/documentation.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/documentation/documentation.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,499 +0,0 @@ - Documentation System {#occt_dev_guides__documentation} -====================== - -@tableofcontents - -@section OCCT_DM_SECTION_1 Introduction - -This document provides practical guidelines for generation and editing of OCCT user documentation. - -@section OCCT_DM_SECTION_2 Prerequisites - -You need to have the following software installed to generate the documentation. - -**Tcl/Tk** -Version 8.5 or 8.6: https://www.tcl.tk/software/tcltk/download.html - -**Doxygen** -Version 1.8.4 or above: http://www.doxygen.nl/download.html - -**Dot** -Part of Graphviz software, used by Doxygen for generation of class diagrams in Reference Manual: https://www.graphviz.org/download/ - -**MiKTeX** or other package providing **pdflatex** command (only needed for generation of PDF documents): https://miktex.org/download - -**Inkscape** (only needed for generation of PDF documents containing SVG images): http://www.inkscape.org/download - -When generating PDF documentation, **pdflatex** and **inkscape** executables should be accessible by PATH variable. -You can use *custom.bat* file to add necessary paths to the *PATH* variable. - -Note that in the process of PDF generation MiKTeX may need some packages not installed by default. -We recommend setting option "Install missing packages on-the-fly" to "Ask me first" (default) during MiKTeX installation: - -@figure{/dev_guides/documentation/images/documentation_miktex.png,"",320} - -On the first run of **pdflatex** it will open a dialog window prompting for installation of missing packages. -Follow the instructions to proceed (define proxy settings if needed, select a mirror site to download from, etc.). - -**MathJax** is used for rendering math formulas in browser (HTML and CHM outputs): http://www.mathjax.org. - -By default MathJAX scripts and fonts work on-line and no installation of MathJAX is necessary if Internet is accessible. -If you need to use OCCT documentation while off-line, you can install a local copy of MatJAX, see https://docs.mathjax.org/en/v2.7-latest/start.html#installing-your-own-copy-of-mathjax. -See \ref OCCT_DM_SECTION_A_9 for more details on inserting mathematical expressions. - -@section OCCT_DM_SECTION_2_1 Documentation Generation - -Run command *gendoc* from command prompt (with OCCT directory as current one) to generate OCCT documentation. -The synopsis is: - - gendoc \[-h\] {-refman|-overview} \[-html|-pdf|-chm\] \[-m=|-ug=\] \[-v\] \[-s=\] \[-mathjax=\] - -Here the options are: - -* Choice of documentation to be generated: - * -overview: To generate Overview and User Guides (cannot be used with -refman) - * -refman: To generate class Reference Manual (cannot be used with -overview) - -* Choice of output format: - * -html: To generate HTML files (default, cannot be used with -pdf or -chm) - * -pdf: To generate PDF files (cannot be used with -refman, -html, or -chm) - * -chm: To generate CHM files (cannot be used with -html or -pdf) - -* Additional options: - * -m=\: List of OCCT modules (separated with comma), for generation of Reference Manual - * -ug=\: List of MarkDown documents (separated with comma), to use for generation of Overview / User Guides - * -mathjax=\: To use local or alternative copy of MathJax - * -s=\: Specifies the Search mode of HTML documents; can be: none | local | server | external - * -h: Prints this help message - * -v: Enables more verbose output - -**Note** - -* In case of PDF output the utility generates a separate PDF file for each document; -* In case of HTML output the utility generates a common Table of contents containing references to all documents. -* In case of CHM output single CHM file is generated - -**Examples** - -To generate the output for a specific document specify the path to the corresponding MarkDown file (paths relative to *dox* sub-folder can be given), for instance: - -~~~~ - > gendoc -overview -ug=dev_guides/documentation/documentation.md -~~~~ - -To generate Reference Manual for the whole Open CASCADE Technology library, run: -~~~~ - > gendoc -refman -~~~~ - -To generate Reference Manual for Foundation Classes and Modeling Data modules only, with search option, run: -~~~~ - > gendoc -refman -m=FoundationClasses,ModelingData,ModelingAlgorithms -s=local -~~~~ - -@section OCCT_DM_SECTION_3 Documentation Conventions - -This section contains information about file format conventions, directories structure, etc. - -@subsection OCCT_DM_SECTION_3_1 File Format - -The format used for documentation is MarkDown with Doxygen extensions. -The MarkDown files have a *.md extension and are based on rules described in \ref OCCT_DM_SECTION_A section. - -@subsection OCCT_DM_SECTION_3_2 Directory Structure - -@figure{/dev_guides/documentation/images/documentation_folders.png,"",160} - -Each document has its own folder if there are any images used in it. These images are stored in *images* subfolder. - -If you want to use the same image for several documents, you can place it in *dox/resources* folder. - -**Note**: To avoid incorrect image display, use a relative path to the image (starting from *dox* folder). For instance: - - -@verbatim -@figure{/dev_guides/documentation/images/documentation_test_image.svg,"",420} -@endverbatim - - -The documentation is generated in subfolder *doc* : -* *html* -- a directory for generated HTML pages; -* *pdf* -- a directory for generated PDF files. - -@section OCCT_DM_SECTION_4 Adding a New Document - -Place a new document in the folder taking into account its logical position in the documentation hierarchy. For instance, the document *svn.md* about the use of SVN to work with OCCT source code can be placed into /dox/dev_guides/. - -If there are images in the document, it should be placed in its own folder containing a subfolder for images. For instance: -* /dox/dev_guides/svn/ -- for *svn.md* file; -* /dox/dev_guides/svn/images/ -- for images. - -Add a relative path to *svn.md* in file dox/FILES.txt. For instance - -@verbatim -dev_guides/svn/svn.md -@endverbatim - -**Note** that the order of paths to documents in *FILES.txt* is reproduced in the Table of Contents in the HTML output, thus they need to be placed logically. - -**Note** that you should specify a file tag, not the document name. See @ref OCCT_DM_SECTION_A_1 "Header and hierarchic document structure" section for details. - -@section OCCT_DOC_SECTION_5 Additional Resources - -More information about OCCT can be found at http://www.opencascade.com and
http://dev.opencascade.org sites. - - -The information on formula syntax can be found at:
-http://en.wikipedia.org/wiki/Help:Displaying_a_formula - -More information on MarkDown and Doxygen syntax can be found at:
-http://www.stack.nl/~dimitri/doxygen/manual - -@section OCCT_DM_SECTION_A Appendix 1: Document Syntax - -A document file in *.md format must start with a proper header defining a caption and a unique tag. - -@verbatim -Documentation System {#dev_guides__documentation} -===================== -@endverbatim - -The document structure is formed by sections that must be defined consistently. - -The document can contain plain text, lists, tables, code snippets, images, math, etc. -Any specific text elements can be introduced by Markdown language tags or by usual HTML tags. - -The table of contents, page numbers (in PDF), and figure numbers (in PDF) are generated automatically. - -@subsection OCCT_DM_SECTION_A_1 Headers and hierarchic document structure - -Headers of different levels can be specified with the following tags: -* \@section -- for the first-level headers; -* \@subsection -- for the second level headers; -* \@subsubsection -- for the third level headers. - -For example: - -@verbatim - @section occt_ocaf_1 Basic Concepts - @subsection occt_ocaf_1_1 Applications and Documents - @subsubsection occt_ocaf_1_1_1 The document and the data framework -@endverbatim - -**Note** that section names can be used for references within the document and in other documents, so it is necessary to use the common prefix indicative of the document name for all section names in the given document. -For example, *occt_ocaf* for sections in Open CASCADE Application Framework manual. - -The remaining part of section names in most documents consists only of numbers, for example *1_1*. Actually, the hierarchical structure of the output table of contents is not based on these numbers and is generated automatically. - -The numbers are only indicative of a section location in the body of the document. However, duplicate section names in a document inevitably cause errors during generation. - -If you insert a section in the middle of a big document, do not renumber the document to the end (which is inefficient and error prone), but choose an arbitrary number or letter, not yet used in the document section naming, and base the naming in this section on it. - -The section hierarchy is limited to three levels and further levels cannot be presented in the Table of Contents. - -However, the fourth and fifth level headers can be tagged with #### and ##### correspondingly. - -It is also possible to use tags ## and ### for second and third level headers if you do not wish to show them in the table of contents or make references to them. - -@subsection OCCT_DM_SECTION_A_2 Plain Text - -A plain text is organized in paragraphs, separated by empty lines in MarkDown source. -The length of lines is not restricted; it is recommended to put each sentence on a separate line -- this is optimal for easier comparison of different versions of the same document. - -To insert special symbols, like \< , \> or \\, prepend them with \\ character: \\\<, \\\>, \\\\, etc. -To emphasize a word or a group of words, wrap the text with one pair of asterisks (*) or underscores (_) to make it *italic* and two pairs of these symbols to make it **Bold**. - -**Note** that if your emphasized text starts or ends with a special symbol, the asterisks may not work. Use explicit HTML tags \\ and \\ instead. - - -@subsection OCCT_DM_SECTION_A_3 Lists - -To create a bulleted list, start each line with a hyphen or an asterisk, -followed by a space. List items can be nested. This code: - -@verbatim -* Bullet 1 -* Bullet 2 - - Bullet 2a - - Bullet 2b -* Bullet 3 -@endverbatim - -produces this list: - -* Bullet 1 -* Bullet 2 - * Bullet 2a - * Bullet 2b -* Bullet 3 - -To create a numbered list, start each line with number and a period, -then a space. Numbered lists can also be nested. Thus this code - -@verbatim -1. List item 1 - 1. Sub-item 1 - 2. Sub-item 2 -2. List item 2 -4. List item 3 -@endverbatim - -produces this list: - -1. List item 1 - 1. Sub-item 1 - 2. Sub-item 2 -2. List item 2 -3. List item 3 - -**Note** that numbers of list items in the output are generated so they do not necessarily follow the numbering of source items. - -In some cases automatic generation adversely restarts the numbering, i.e. you get list items 1. 1. 1. instead of 1. 2. 3. in the output. -The use of explicit HTML tags \\ and \\ can help in this case. - -Each list item can contain several paragraphs of text; these paragraphs must -have the same indentation as text after bullet or number in the numbered list -item (otherwise numbering will be broken). - -Code blocks can be inserted as paragraphs with additional indentation -(4 spaces more). Note that fenced code blocks do not work within numbered lists -and their use may cause numeration to be reset. - - -Example of a complex nested list: - -1. List item 1 - - Additional paragraph - - code fragment - - One more paragraph - - 1. Sub-item 1 - - code fragment for sub-item 1 - - 2. Sub-item 2 - - Paragraph for sub-item 2 - - Yet one more paragraph for list item 1 - -2. List item 2 - - -@subsection OCCT_DM_SECTION_A_4 Tables - -A table consists of a header line, a separator line, and at least one row line. -Table columns are separated by the pipe (|) character. The following example: - -@verbatim -First Header | Second Header -------------- | ------------- -Content Cell | Content Cell -Content Cell | Content Cell -@endverbatim - - will produce the following table: - -First Header | Second Header ------------- | ------------- -Content Cell | Content Cell -Content Cell | Content Cell - -Column alignment can be controlled via one or two colons at the header separator line: - -@verbatim -| Right | Center | Left | -| ----: | :----: | :---- | -| 10 | 10 | 10 | -| 1000 | 1000 | 1000 | -@endverbatim - -which will looks as follows: - -| Right | Center | Left | -| ----: | :----: | :---- | -| 10 | 10 | 10 | -| 1000 | 1000 | 1000 | - -Note that each table row should be contained in one line of text; complex tables can be created using HTML tags. - -@subsection OCCT_DM_SECTION_A_5 Code Blocks - -Paragraphs indented with 4 or more spaces are considered as code fragments and rendered using Courier font. -Example: - - This line is indented by 4 spaces and rendered as a code block. - -A fenced code block does not require indentation, and is defined by a pair of "fence lines". -Such line consists of 3 or more tilde (~) characters on a line. -The end of the block should have the same number of tildes. -Thus it is strongly advised to use only three or four tildes. - -By default the output is the same as for a normal code block. -To highlight the code, the developer has to indicate the typical file extension, -which corresponds to the programming language, after the opening fence. -For highlighting according to the C++ language, for instance, write the following code (the curly braces and dot are optional): - -@verbatim -~~~{.cpp} -int func(int a,int b) { return a*b; } -~~~ -@endverbatim - -which will produce: -~~~{.cpp} -int func(int a,int b) { return a*b; } -~~~ - -Smaller code blocks can be inserted by wrapping with tags \@code and \@endcode. - -Verbatim content (same as code but without syntax highlighting) can be inserted by wrapping with tags \@verbatim and \@endverbatim. - -@subsection OCCT_DM_SECTION_A_5a Quotes - -Text quoted from other sources can be indented using ">" tag. For example: - -@verbatim -> [Regression in 6.9.0] *IGES - Export of a reversed face leads to wrong data* -@endverbatim - -will produce - -> [Regression in 6.9.0] *IGES - Export of a reversed face leads to wrong data* - -Note that this tag should prefix each line of the quoted text. -Empty lines in the quoted text, if any, should not have trailing spaces after the ">" (lines with trailing spaces will break the quote block). - -@subsection OCCT_DM_SECTION_A_6 References - -To insert a reference to a website, it is sufficient to write an URL. -For example: http://en.wikipedia.org - -To insert a reference to a document or its subsection, use command \@ref followed by the document or section tag name. -For instance, @code @ref OCCT_DM_SECTION_A @endcode will be rendered as @ref OCCT_DM_SECTION_A. - -Note that links between documents will not work in PDF output if each document is generated independently. -Hence it is recommended to add a name of the referenced section after the tag name in the \@ref command (in quotes): this will guarantee that the reference is recognizable for the reader even if the cross-link is not instantiated. -For instance: @code @ref occt_modat_1 "Geometry Utilities" @endcode will be rendered as @ref occt_modat_1 "Geometry Utilities". - -@subsection OCCT_DM_SECTION_A_7 Images - -For inserting images into the document use the command \@figure, as follows: - -@verbatim - @figure{/relative/path/to/image/image_file_name.png,"Image caption"} -@endverbatim - -The first argument is a path to the image file, relative to the *dox* folder. -The supported formats for images are PNG, JPG, and SVG. -The file extension must be lowercase and correspond to the file format. -The image file name should have no dots except for the one before extension (names with more than one dot confuse **pdflatex**). - -The second argument is optional, it defines the caption for the image to be inserted. -The caption argument, if given, should be quoted, even if it is a single word. -Captions are included below the image; in PDF output the images with caption are numbered automatically. - -Example: - -@verbatim - @figure{/dev_guides/documentation/images/documentation_test_image.svg,"Test SVG image"} -@endverbatim - -is rendered as: - -@figure{/dev_guides/documentation/images/documentation_test_image.svg,"Test SVG image",320} - -We recommend using **Inkscape** for creation and edition of vector graphics. -The graphics created in MS Word Draw and some other vector editors can be copy-pasted to Inkscape and saved as SVG images. - -Note that the image that will be included in documentation is the whole page of the Inkscape document; use option "Resize page to content" in menu **File -> Document properties** of Inkscape to fit page dimensions to the picture (adding margins as necessary). - -Note that the *figure* command is an alias to the standard Doxygen command *image* repeated twice: once for HTML and then for Latex output (used for PDF generation). Thus if HTML and PDF outputs should include different images or captions, command "image" can be used: - -@verbatim - @image html /relative/path/to/image/occ_logo_for_html.png - @image latex /relative/path/to/image/occ_logo_for_pdf.png -@endverbatim - -@subsection OCCT_DM_SECTION_A_8 Table Of Contents - -Use \@tableofcontents tag to get the table of contents at the beginning of the document. - -Actually, it is not strictly necessary now because TreeView option for HTML is used. -The TOC in the PDF document will be generated automatically. - -@subsection OCCT_DM_SECTION_A_9 Formulas - -Formulas within MarkDown documents can be defined using LaTeX syntax. - -Equations can be written by several ways: - -1.Unnumbered displayed formulas that are centered on a separate line. -These formulas should be put between \@f\[ and \@f\] tags. An example: - -@verbatim -@f[ - |I_2|=\left| \int_{0}^T \psi(t) - \left\{ - u(a,t)- - \int_{\gamma(t)}^a - \frac{d\theta}{k(\theta,t)} - \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi - \right\} dt - \right| -@f] -@endverbatim - -gives the following result: - - @f$ - |I_2|=\left| \int_{0}^T \psi(t) - \left\{ - u(a,t)- - \int_{\gamma(t)}^a - \frac{d\theta}{k(\theta,t)} - \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi - \right\} dt - \right| - @f$ - -2.Formulas can also be put between @verbatim \begin{align} @endverbatim and @verbatim \end{align} @endverbatim tags. - - For example: - -@verbatim - \begin{align} - \dot{x} & = \sigma(y-x) \\ - \dot{y} & = \rho x - y - xz \\ - \dot{z} & = -\beta z + xy - \end{align} -@endverbatim - - gives the following result: -@latexonly - \begin{align} - \dot{x} & = \sigma(y-x) \\ - \dot{y} & = \rho x - y - xz \\ - \dot{z} & = -\beta z + xy - \end{align} -@endlatexonly - -@htmlonly - \begin{align} - \dot{x} & = \sigma(y-x) \\ - \dot{y} & = \rho x - y - xz \\ - \dot{z} & = -\beta z + xy - \end{align} -@endhtmlonly - -3.Inline formulas can be specified using this syntax: - -@verbatim - @f$ \sqrt{3x-1}+(1+x)^2 @f$ -@endverbatim - - that leads to the following result: @f$ \sqrt{3x-1}+(1+x)^2 @f$ - Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/documentation/images/documentation_folders.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/documentation/images/documentation_folders.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/documentation/images/documentation_miktex.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/documentation/images/documentation_miktex.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/documentation/images/documentation_test_image.svg opencascade-7.5.1+dfsg1/dox/dev_guides/documentation/images/documentation_test_image.svg --- opencascade-7.4.1+dfsg1/dox/dev_guides/documentation/images/documentation_test_image.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/documentation/images/documentation_test_image.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - Test SVG image - - - diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/git_guide.md opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/git_guide.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/git_guide.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/git_guide.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,519 +0,0 @@ -Guide to installing and using Git for OCCT development {#occt_dev_guides__git_guide} -================================= - -@tableofcontents - -@section occt_gitguide_1 Overview - -@subsection occt_gitguide_1_1 Purpose - - The purpose of this document is to provide a practical introduction to Git - to OCCT developers who are not familiar with this tool - and to facilitate the use of the official OCCT Git repository for code contribution to OCCT. - - It can be useful to learn more about Git concepts and tools from a book a or manual. - Many good books on Git can be found at https://git-scm.com/documentation - - For the experienced Git users it can be enough to read sections 1 and 3 - of this document to start working with the repository. - - Familiarize yourselves with the @ref occt_dev_guides__contribution_workflow "Contribution Workflow document" - that describes how Git is used for processing contributions to OCCT. - - This and related documents are available at the Resources page - of the OCCT development portal at https://dev.opencascade.org/index.php?q=home/resources. - -@subsection occt_gitguide_1_2 Git URL - - URL of the official OCCT source code Git repository (accessed by SSH protocol) is: - - gitolite@git.dev.opencascade.org:occt - - or - - ssh://gitolite@dev.opencascade.org/occt.git - -@subsection occt_gitguide_1_3 Content - -The official repository contains: - - * The current certified version of OCCT: the "master" branch. This branch is updated by the Bugmaster only. Official OCCT releases are marked by tags. - * Topic branches created by contributors to submit changes for review / testing or for collaborative development. The topic branches should be named by the pattern "CR12345" where 12345 is the ID of the relevant issue registered in Mantis (without leading zeroes), and "CR" stands for "Change Request". The name can have an additional postfix used if more than one branch was created for the same issue. - * Occasionally topic branches with non-standard names can be created by the Bugmaster for special needs. - -@subsection occt_gitguide_1_4 Short rules of use - - The name specified in the user.name field in Git configuration should correspond - to your login name on the OCCT development portal. - This is important to clearly identify the authorship of commits. - (The full real name can be used as well; in this case add the login username in parentheses.) - - By default, contributors are allowed to push branches only with the names starting with CR - (followed by the relevant Mantis issue ID). - Possibility to work with other branches can be enabled by the Bugmaster on request. - - The branch is created by the developer in his local repository when the development of a contribution starts. - The branch for new developments is to be created from the current master. - The branch for integration of patches or developments based on an obsolete version - is created from a relevant tag or commit. The branch should be pushed to the official repo - only when sharing with other people (for collaborative work or review / testing) is needed. - - Rebasing the local branch to the current master is encouraged before the first submission - to the official repository. If rebasing was needed after the branch is pushed to the official repo, - the rebased branch should have a different name (use suffix). - - Integration of contributions that have passed certification testing is made exclusively by the Bugmaster. - Normally this is made by rebasing the contribution branch on the current master - and squashing it into a single commit. This is made to have the master branch history plain and clean, - following the general rule “one issue -- one commitâ€. - The description of the commit integrated to the master branch is taken from the Mantis issue - (ID, 'Summary', followed by the information from 'Documentation' field if present). - - In special cases when it is important to save the commits history in the branch - (e.g. in case of a long-term development integration) it can be integrated by merge (no fast-forward). - - The authorship of the contribution is respected by preserving the Author field of the commit when integrating. - Branches are removed from the official repository when integrated to the master. - The Bugmaster can also remove branches which have no commits during one-month period. - - The Bugmaster may ask the developer (normally the one who produced the contribution) - to rebase a branch on the current master, in the case if merge conflicts appear during integration. - -@subsection occt_gitguide_1_5 Version of Git - - The repository is tested to work with Git 1.7.6 and above. - Avoid using versions below 1.7.1 as they are known to cause troubles. - -@section occt_gitguide_2 Installing Tools for Work with Git - -@subsection occt_gitguide_2_1 Windows platform - - Installation of Git for Windows (provided by MSysGit project) is required. - - In addition, it is recommended to install TortoiseGit to work with Git on Windows. - If you do not install TortoiseGit or any other GUI tool, - you can use GitGui and Gitk GUI tools delivered with Git and available on all platforms. - -@subsubsection occt_gitguide_2_1_1 Installation of Git for Windows - - Download Git for Windows distributive from https://git-for-windows.github.io/ - During the installation: - - * Check-in "Windows Explorer integration" options: - * "Git Bash Here"; - * "Git GUI Here". - * To avoid a mess in your PATH, we recommend selecting "Run Git from Windows Prompt" in the environment settings dialog: - * In "Configuring the line ending conversions" dialog, select "Checkout Windows-style, commit Unix style endings". - - Note that by default Git user interface is localized to the system default language. - If you prefer to work with the English interface, remove or rename .msg localization file - in subdirectories *share/git-gui/lib/msgs* and *share/gitk/lib/msgs* of the Git installation directory. - - Before the first commit to the OCCT repository, make sure that your User Name in the Git configuration file (file .gitconfig in the $HOME directory) is equal to your username on the OCCT development portal. - -@subsubsection occt_gitguide_2_1_2 Installation and configuration of TortoiseGit - - Download TortoiseGit distributive from https://tortoisegit.org/download/. - Launch the installation. - - * Select your SSH client. Choose option - * "OpenSSH, Git default SSH Client" if you prefer to use command-line tools for SSH keys generation, or - * "TortoisePLink, coming from Putty, integrates with Windows better" if you prefer to use GUI tool (PuttyGen, see 3.2). - * Complete the installation. - - TortoiseGit integrates into Windows Explorer, thus it is possible to use context menu in Windows Explorer to access its functionality: - -@figure{OCCT_GitGuide_V2_image005.png,"",100} - - - - Note that if you have installed MSysGit or have Git installed in non-default path, - on the first time you use TortoiseGit you may get the message demanding to define path to Git. - In such case, click on **Set MSysGit path** button and add the path to git.exe - and path to MigGW libraries in the Settings dialog. - - * After the installation select Start -> Programs -> TortoiseGit Settings to configure TortoiseGit. - - Select Git->Config to add your user name and Email address to the local .gitconfig file - - @figure{OCCT_GitGuide_V2_image006.png,"",320} - - Optionally, you can set up TortoiseGit to use visual diff utility for SVG images used in OCCT documentation. - For that, click on item "Diff Viewer" in the Settings dialog, then click button "Advanced..." in the right tab to add a new record with the following parameters: - - Extension: .svg - - External program: <path_to_OCCT>\\adm\\svgdiff.bat %%base %%mine %%bname %%yname - -@figure{OCCT_GitGuide_V2_svgdiff.png,"",709} - -@subsection occt_gitguide_2_2 Linux platform - - We assume that Linux users have Git already installed and available in the *PATH*. - - Make sure to configure Git so that the user name is equal to your username - on the OCCT development portal, and set SafeCrLf option to true: - -~~~~~ - > git config --global user.name "Your User Name" - > git config --global user.email your@mail.address - > git config --global your@mail.address -~~~~~ - -@section occt_gitguide_3 Getting access to the repository - -@subsection occt_gitguide_3_1 Prerequisites - - Access to the repository is granted to the users who have signed the Contributor License Agreement. - - The repository is accessed by SSH protocol, thus you need to register your public SSH key - on the development portal to get access to the repository. - - SSH keys are used for secure authentication of the user when accessing the Git server. - Private key is the one stored on the user workstation (optionally encrypted). - Open (or public) key is stored in the user account page on the web site. - When Git client accesses the remote repository through SSH, - it uses this key pair to identify the user and acquire relevant access rights. - - Normally when you have Git installed, you should have also SSH client available. - On Unix/Linux it is installed by default in the system. - On Windows it is typical to have several SSH clients installed; - in particular they are included with Cygwin, Git, TortoiseGit. - - It is highly recommended to use the tools that come - with the chosen Git client for generation of SSH keys. - Using incompatible tools (e.g. *ssh-keygen.exe* from Cygwin for code generation, - and TortoiseGit GUI with a default Putty client for connection to server) - may lead to authentication problems. - -@subsection occt_gitguide_3_2 How to generate a key - -@subsubsection occt_gitguide_3_2_1 Generating key with Putty - - Use this option if you have installed TortoiseGit (or other GUI Git client on Windows) - and have chosen “TortoisePLink†(or other Putty client) as SSH client during installation. - - To generate the key with this client, run **Puttygen** (e.g. from Start menu -> TortoiseGit -> Puttygen), - then click **Generate** and move mouse cursor over the blank area until the key is generated. - -@figure{OCCT_GitGuide_V2_image007.png,"Putty key generator",320} - - After the key is generated, you will see GUI controls to define the public key comment - and / or specify the password for the private key protection. - When done, save both the public and the private key to the files of your choice - (make sure to store your private key in a secure place!). - - Copy the public key as shown by Puttygen to the clipboard to add it in your account. - Do not copy the Putty public key file content -- it is formatted in a way not suitable for the web site. - -@subsubsection occt_gitguide_3_2_2 Generating key with command-line tools - - Use this option if you work on Linux or if you have chosen “OpenSSH†as SSH client - during installation of TortoiseGit (or other Windows tool). - - Make sure that you have *ssh* and *ssh-keygen* commands in the path. - On Windows, you might need to start **Git Bash** command prompt window. - - Use the following command to generate SSH keys: -~~~~~ - > ssh-keygen -t rsa -C "your@mail.address" -~~~~~ - - The last argument is an optional comment, which can be included with the public key and used to distinguish between different keys (if you have many). The common practice is to put here your mail address or workstation name. - - The command will ask you where to store the keys. It is recommended to accept the default path $HOME/.ssh/id_rsa. Just press **Enter** for that. You will be warned if a key is already present in the specified file; you can either overwrite it by the new one, or stop generation and use the old key. - - If you want to be on the safe side, enter password to encrypt the private key. You will be asked to enter this password each time you use that key (e.g. access a remote Git repository), unless you use the tool that caches the key (like TortoiseGit). If you do not want to bother, enter an empty string. - - On Windows, make sure to note the complete path to the generated files (the location of your $HOME might be not obvious). Two key files will be created in the specified location (by default in $HOME/.ssh/): - - * *id_rsa* -- private key - * *id_rsa.pub* -- public key - - The content of the public key file (one text line) is the key to be added to the user account on the site (see below). - -@subsubsection occt_gitguide_3_2_3 Generating key with Git GUI - - GitGUI (standard GUI interface included with Git) provides the option - to either generate the SSH key (if not present yet) or show the existing one. - Click Help/Show SSH key and copy the public key content for adding to the user account page (see below). - -@subsection occt_gitguide_3_3 Adding public key in your account - -Log in on the portal https://dev.opencascade.org and click on **My account** link to the right. If you have a Contributor status, you will see **SSH keys** tab to the right. - -Click on that tab, then click **Add a public key**, and paste the text of the public key (see above sections on how to generate the key) into the text box. - -Click **Save** to input the key to the system. - - Note that a user can have several SSH keys. - You can distinguish between these keys by the Title field ID; by default it is taken from SSH key comment. - It is typical to use your e-mail address or workstation name for this field; no restrictions are set by the portal. - - - **Note** that some time (5-10 min) is needed for the system - to update the configuration after the new key is added. - After that time, you can try accessing Git. - -@section occt_gitguide_4 Work with repository: developer operations - -@subsection occt_gitguide_4_1 General workflow - - To start working with OCCT source repository, you need to create its clone in your local system. - This cloned repository will manage your working copy of the sources - and provide you the means to exchange code between your clone and the origin. - - In most cases it is sufficient to have one clone of the repository; - your working copy will be updated automatically by Git when you switch branches. - - The typical development cycle for an issue is as follows: - - * Create a new branch for your development, basing on the selected version of the sources - (usually the current master) and switch your working copy to it - * Develop and test your change. - * Do as many commits in your branch as you feel convenient; - the general recommendation is to commit every stable state (even incomplete), to record the history of your development. - * Push your branch to the repository when your development is complete or when you need to share it with other people (e.g. for review) - * Before the first push, rebase your local branch on the latest master; - consider collapsing the history in one commit unless you think the history of your commits is interesting for others. - Make sure to provide a good commit message. - * Do not amend the commits that have been already pushed in the remote repository, - If you need to rebase your branch, commit the rebased branch under a different name, and remove the old branch. - - You can switch to another branch at any moment - (unless you have some uncommitted changes in the working copy) - and return back to the branch when necessary (e.g. to take into account review remarks). - Note that only the sources that are different between the switched branches will be modified, - thus required recompilation should be reasonably small in most cases. - -@subsection occt_gitguide_4_2 Cloning official repository - - Clone the official OCCT repository in one of following ways: - - * From command line by command: - -~~~~~ - > git clone gitolite@git.dev.opencascade.org:occt -~~~~~ - - where \ is the path to the new folder which will be created for the repository. - - * In TortoiseGit: create a new folder, open it and right-click in the Explorer window, then choose **Git Clone** in the context menu: - -@figure{OCCT_GitGuide_V2_image009.png,"",320} - - If you have chosen Putty as SSH client during TortoiseGit installation, check the **Load Putty Key** option and specify the location of the private key file saved by PuttyGen (see 3.2.1). This shall be done for the first time only. - - Note that on the first connection to the repository server you may be requested to enter a password for your private SSH key; further you can get a message that the authenticity of the host cannot be established and will be asked if you want to continue connecting or not. Choose **Yes** to continue. The host’s key will be stored in $HOME/.ssh/known_hosts file. - -@subsection occt_gitguide_4_3 Branch creation - - You need to create a branch when you are going to start development of a new change, - apply a patch, etc. It is recommended to fetch updates from the remote repository - before this operation, to make sure you work with the up-to-date version. - - Create a branch from the current master branch unless you need to base your development on a particular version or revision. - -In the console: - -~~~~~ - > git checkout -b CR12345 origin/master -~~~~~ - -In TortoiseGit: - * Go to the local copy of the repository. - * Right-click in the Explorer window, then choose **Git Create Branch**. - * Select **Base On** Branch *remotes/origin/master*. - -@figure{OCCT_GitGuide_V2_image012.png,"",320} - - Check option **Switch to new branch** if you are going to start working with the newly created branch immediately. - -@subsection occt_gitguide_4_4 Branch switching - - If you need to switch to another branch, use Git command checkout for that. - In the console: - -~~~~~ - > git checkout CR12345 -~~~~~ - - In TortoiseGit: right-click in the explorer window and select in the context menu **TortoiseGit** -> **Switch/Checkout**. - -@figure{OCCT_GitGuide_V2_image013.png,"",320} - - Note that in order to work with the branch locally you need to set option - **Create new branch** when you checkout the branch from the remote repository for the first time. - Option **Track** stores association between the local branch and the original branch in a remote repository. - -@subsection occt_gitguide_4_5 Committing branch changes - - Commit your changes locally as soon as a stable status of the work is reached. - Make sure to review carefully the committed changes beforehand to avoid unintentional commit of a wrong code. - - * In the console: - -~~~~~ - > git diff - … - > git commit -a -m "Write meaningful commit message here" -~~~~~ - - Option -a tells the command to automatically include (stage) files - that have been modified or deleted, but it will omit the new files that might have been added by you. - To commit such new files, you must add (stage) them before commit command. - - To find new unstaged files and them to commit, use commands: - -~~~~~ - > git status -s - ?? file1.hxx - ?? file2.cxx - > git add file1.hxx file2.cxx -~~~~~ - - * In TortoiseGit: right-click in the explorer window and select in the context menu Git Commit -> CR…: - -@figure{OCCT_GitGuide_V2_image014.png,"",320} - - Unstaged files will be shown if you check the option ‘Show Unversioned Files’. - Double-click on each modified file to see the changes to be committed (as a difference vs. the base version). - -@subsection occt_gitguide_4_6 Pushing branch to the remote repository - - When the code developed in your local branch is ready for review, - or you need to share it with others, push your local changes to the remote repository. - - * In the console: - -~~~~~ - > git push "origin" CR12345:CR12345 -~~~~~ - - * In TortoiseGit: right-click in the explorer window and select in the context menu, TortoiseGit -> **Push** - -@figure{OCCT_GitGuide_V2_image015.png,"",320} - -Note that Git forbids pushing a branch if the corresponding remote branch already exists and has some changes, which are not in the history of your local branch. This may happen in different situations: - * You have amended the last commit which is already in the remote repository. If you are sure that nobody else uses your branch, push again with **Force** option. - * You have rebased your branch, so that now it is completely different from the branch in the remote repository. In this case, push it under a different name (add a suffix): - -@figure{OCCT_GitGuide_V2_image016.png,"",320} - - Then remove the original remote branch so that other people recognize that it has been replaced by the new one. For that, select TortoiseGit -> **Push** again, select an empty line for your local branch name, - and enter the name of the branch to be removed in **Remote** field: - - * The other developer has committed some changes in the remote branch. In this case, **Pull** changes from the remote repository to have them merged with your version, and push your branch after it is successfully merged. - -@subsection occt_gitguide_4_7 Synchronizing with remote repository - - Maintain your repository synchronized with the remote one and clean unnecessary stuff regularly. - - Use Git command *fetch* with option *prune* to get the update of all branches from the remote repository and to clean your local repository from the remote branches that have been deleted. - - * In the console: -~~~~~ - > git fetch --prune -~~~~~ - - * In TortoiseGit: right-click in the explorer window and select in the context menu **TortoiseGit** -> **Fetch**. Check in **Prune** check-box. - -@figure{OCCT_GitGuide_V2_image018.png,"",320} - - If the branch you are working with has been changed in the remote repository, use Git command *pull* to get the remote changes and merge them with your local branch. - - This operation is required in particular to update your local master branch when the remote master changes. - - * In console: -~~~~~ - > git pull -~~~~~ - - * In TortoiseGit: right-click in the explorer window and select in the context menu **TortoiseGit** -> **Pull**. - -@figure{OCCT_GitGuide_V2_image019.png,"",320} - -Note that the local branches of your repository are the primary place, where your changes are stored until they get integrated to the official version of OCCT (master branch). The branches submitted to official repository are for collaborative work, review, and integration -- that repository should not be used for long-term storage of incomplete changes. - -Remove the local branches that you do not need any more. Note that you cannot delete the current branch. It means that you need to switch to another one (e.g. master) if the branch you are going to delete is the current one. - - * In the console: -~~~~~ - > git branch -d CR12345 -~~~~~ - - * In TortoiseGit: right-click in the explorer window and select in the context menu **TortoiseGit** -> **Git Show Log**. - -@figure{OCCT_GitGuide_V2_image020.png,"",420} - - Select **All branches** check-box to view all branches. - Right-click on the branch you want to delete and select **Delete** item in the context menu. - -Note that many functions described above can be accessed from the Log View, which is a very convenient tool to visualize and manage branches. - -@subsection occt_gitguide_4_8 Applying a fix made on older version of OCCT - -If you have a fix made on a previous version of OCCT, perform the following sequence of operations to prepare it for testing and integration to the current development version: - * Identify the version of OCCT on which the fix has been made. In most cases, this will be an OCCT release, e.g. OCCT 6.7.0. - * Find a tag or a commit corresponding to this version in the Git history log of the master branch. - * Create a branch basing on this tag or commit. In TortoiseGit history log: right-click on the base commit, then select **Create branch at this version**. - -@figure{OCCT_GitGuide_V2_image021.png,"",320} - - * Check option **Switch to the new branch** to start working within the new branch immediately, or switch to it separately afterwards. - * Put your fix in the working copy, build and check that it works, then commit to the branch. - * Rebase the branch on the current master. In TortoiseGit: right-click on the working directory, choose **TortoiseGit** -> **Rebase**, select *remotes/origin/master* as UpStream revision, and click **Start**: - -@figure{OCCT_GitGuide_V2_image022.png,"",320} - -Note that you can get some conflicts during rebase. To resolve them, double-click on each conflicted file (highlighted by red in the file list) to open visual merge tool. Switch between conflicting fragments by red arrows, and for each one decide if the code of one or both conflicting versions is to be taken. - -@subsection occt_gitguide_4_9 Rebasing with history clean-up - -At some moments you might need to rebase your branch on the latest version of the master. - -We recommend rebasing before the first submission of the branch for review or when the master has diverged substantially from your branch. - -Rebasing is a good occasion to clean-up the history of commits in the branch. Consider collapsing (squashing, in terms of Git) the history of your branch into a single commit unless you deem that having separate commits is important for your future work with the branch or its code reviewing. Git also allows changing the order of commits, edit commit contents and messages, etc. - -To rebase your branch into a single commit, you need to do the following: - * Switch to your branch (e.g. “CR12345â€) - * In TortoiseGit history log, select a branch to rebase on (remotes/origin/master) and in the context menu choose **Rebase “CR12345†onto this**. - * In the **Rebase** dialog, check **Squash All**. You can also change the order of commits and define for each commit whether it should be kept (**Pick**), edited, or just skipped. - -@figure{OCCT_GitGuide_V2_image023.png,"",320} - - * Click **Start**. - * The process will stop if a conflict is detected. In that case, find files with status **Conflicted** in the list (marked by red), and double-click on them to resolve the conflict. When all conflicts are resolved, click **Continue**. - -@figure{OCCT_GitGuide_V2_image024.png,"",320} - - * At the end of the process, edit the final commit message (it should start from the issue ID and a description from Mantis in the first line, followed by a summary of actual changes), and click **Commit**. - -@figure{OCCT_GitGuide_V2_image025.png,"",320} - -@section occt_gitguide_5 Work with repository: Reviewer operations - -@subsection occt_gitguide_5_1 Review branch changes using GitWeb - - The changes made in the branch can be reviewed without direct access to Git, using GitWeb interface: - - * Open GitWeb in your web browser: https://git.dev.opencascade.org/gitweb/?p=occt.git - * Locate the branch you want to review among **heads** (click ‘…’ at the bottom of the page to see the full list). - * Click **log** (or **shortlog**) to see the history of the branch. - - **Note** that the branch can contain more than one commit, and you need to distinguish commits that belong to that branch (those to be reviewed) from the commits corresponding to the previous state of the master branch. Normally the first commit in the list that starts from the ID of the other issue indicates the branching point; commits above it are the ones to be reviewed. - - * Click **commitdiff** on each log entry to review the changes (highlighted with color format). - -@subsection occt_gitguide_5_2 Review branch changes with TortoiseGit - - Use of TortoiseGit is recommended for convenient code review: - - * Fetch the changes from the remote repository as described in @ref occt_gitguide_4_7 "Synchronizing with remote repository" section. - * Right-click on the repository, choose **TortoiseGit** -> **Show** log; - * Locate the remote branch you need to review; - * To review commits one-by-one, select each commit in the log. The list of changed files is shown at the bottom of the window; double-click on the file will open visual compare tool. - * To review all changes made in the branch at once, or to compare two arbitrary revisions, select the corresponding commits in the log (e.g. the last commit in the branch and the branching point), ight-click for the context menu, and choose **Compare revisions**. - -@figure{OCCT_GitGuide_V2_image026.png,"",320} - - Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image007.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image007.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image009.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image009.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image012.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image012.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image013.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image013.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image014.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image014.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image015.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image015.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image016.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image016.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image018.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image018.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image019.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image019.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image020.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image020.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image021.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image021.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image022.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image022.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image023.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image023.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image024.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image024.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image025.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image025.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image026.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_image026.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_svgdiff.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/git_guide/images/OCCT_GitGuide_V2_svgdiff.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/dev_guides/tests/images/tests_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/dev_guides/tests/images/tests_image001.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/tests/tests.md opencascade-7.5.1+dfsg1/dox/dev_guides/tests/tests.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/tests/tests.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/tests/tests.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,1451 +0,0 @@ - Automated Testing System {#occt_dev_guides__tests} -====================================== - -@tableofcontents - -@section testmanual_intro Introduction - -This document provides OCCT developers and contributors with an overview and practical guidelines for work with OCCT automatic testing system. - -Reading the Introduction should be sufficient for developers to use the test system to control non-regression of the modifications they implement in OCCT. Other sections provide a more in-depth description of the test system, required for modifying the tests and adding new test cases. - -@subsection testmanual_intro_basic Basic Information - -OCCT automatic testing system is organized around @ref occt_user_guides__test_harness "DRAW Test Harness", a console application based on Tcl (a scripting language) interpreter extended by OCCT-related commands. - -Standard OCCT tests are included with OCCT sources and are located in subdirectory *tests* of the OCCT root folder. Other test folders can be included in the test system, e.g. for testing applications based on OCCT. - -The tests are organized in three levels: - - * Group: a group of related test grids, usually testing a particular OCCT functionality (e.g. blend); - * Grid: a set of test cases within a group, usually aimed at testing some particular aspect or mode of execution of the relevant functionality (e.g. buildevol); - * Test case: a script implementing an individual test (e.g. K4). - -See @ref testmanual_5_1 "Test Groups" chapter for the current list of available test groups and grids. - -@note Many tests involve data files (typically CAD models) which are located separately and (except a few) are not included with OCCT code. -These tests will be skipped if data files are not available. - -@subsection testmanual_1_2 Intended Use of Automatic Tests - -Each modification made in OCCT code must be checked for non-regression -by running the whole set of tests. The developer who makes the modification -is responsible for running and ensuring non-regression for the tests available to him. - -Note that many tests are based on data files that are confidential and thus available only at OPEN CASCADE. -The official certification testing of each change before its integration to master branch of official OCCT Git repository (and finally to the official release) is performed by OPEN CASCADE to ensure non-regression on all existing test cases and supported platforms. - -Each new non-trivial modification (improvement, bug fix, new feature) in OCCT should be accompanied by a relevant test case suitable for verifying that modification. This test case is to be added by the developer who provides the modification. - -If a modification affects the result of an existing test case, either the modification should be corrected (if it causes regression) or the affected test cases should be updated to account for the modification. - -The modifications made in the OCCT code and related test scripts should be included in the same integration to the master branch. - -@subsection testmanual_1_3 Quick Start - -@subsubsection testmanual_1_3_1 Setup - -Before running tests, make sure to define environment variable *CSF_TestDataPath* pointing to the directory containing test data files. - -For this it is recommended to add a file *DrawAppliInit* in the directory which is current at the moment of starting DRAWEXE (normally it is OCCT root directory, $CASROOT ). This file is evaluated automatically at the DRAW start. - -Example (Windows) - -~~~~~{.tcl} -set env(CSF_TestDataPath) $env(CSF_TestDataPath)\;d:/occt/test-data -~~~~~ - -Note that variable *CSF_TestDataPath* is set to default value at DRAW start, pointing at the folder $CASROOT/data. -In this example, subdirectory d:/occt/test-data is added to this path. Similar code could be used on Linux and Mac OS X except that on non-Windows platforms colon ":" should be used as path separator instead of semicolon ";". - -All tests are run from DRAW command prompt (run *draw.bat* or *draw.sh* to start it). - -@subsubsection testmanual_1_3_2 Running Tests - -To run all tests, type command *testgrid* - -Example: - -~~~~~ -Draw[]> testgrid -~~~~~ - -To run only a subset of test cases, give masks for group, grid, and test case names to be executed. -Each argument is a list of file masks separated with commas or spaces; by default "*" is assumed. - -Example: - -~~~~~ -Draw[]> testgrid bugs caf,moddata*,xde -~~~~~ - -As the tests progress, the result of each test case is reported. -At the end of the log a summary of test cases is output, -including the list of detected regressions and improvements, if any. - - -Example: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} - Tests summary - - CASE 3rdparty export A1: OK - ... - CASE pipe standard B1: BAD (known problem) - CASE pipe standard C1: OK - No regressions - Total cases: 208 BAD, 31 SKIPPED, 3 IMPROVEMENT, 1791 OK - Elapsed time: 1 Hours 14 Minutes 33.7384512019 Seconds - Detailed logs are saved in D:/occt/results_2012-06-04T0919 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The tests are considered as non-regressive if only OK, BAD (i.e. known problem), and SKIPPED (i.e. not executed, typically because of lack of a data file) statuses are reported. See @ref testmanual_details_results "Interpretation of test results" for details. - -The results and detailed logs of the tests are saved by default to a new subdirectory of the subdirectory *results* in the current folder, whose name is generated automatically using the current date and time, prefixed by Git branch name (if Git is available and current sources are managed by Git). -If necessary, a non-default output directory can be specified using option -outdir followed by a path to the directory. This directory should be new or empty; use option -overwrite to allow writing results in the existing non-empty directory. - -Example: -~~~~~ -Draw[]> testgrid -outdir d:/occt/last_results -overwrite -~~~~~ -In the output directory, a cumulative HTML report summary.html provides links to reports on each test case. An additional report in JUnit-style XML format can be output for use in Jenkins or other continuous integration system. - -To re-run the test cases, which were detected as regressions on the previous run, option -regress dirname should be used. -dirname is a path to the directory containing the results of the previous run. Only the test cases with *FAILED* and *IMPROVEMENT* statuses will be tested. - -Example: -~~~~~ -Draw[]> testgrid -regress d:/occt/last_results -~~~~~ - -Type help testgrid in DRAW prompt to get help on options supported by *testgrid* command: - -~~~~~ -Draw[3]> help testgrid -testgrid: Run all tests, or specified group, or one grid - Use: testgrid [groupmask [gridmask [casemask]]] [options...] - Allowed options are: - -parallel N: run N parallel processes (default is number of CPUs, 0 to disable) - -refresh N: save summary logs every N seconds (default 60, minimal 1, 0 to disable) - -outdir dirname: set log directory (should be empty or non-existing) - -overwrite: force writing logs in existing non-empty directory - -xml filename: write XML report for Jenkins (in JUnit-like format) - -beep: play sound signal at the end of the tests - -regress dirname: re-run only a set of tests that have been detected as regressions on the previous run. - Here "dirname" is a path to the directory containing the results of the previous run. - Groups, grids, and test cases to be executed can be specified by the list of file - masks separated by spaces or commas; default is all (*). -~~~~~ - -@subsubsection testmanual_1_3_3 Running a Single Test - -To run a single test, type command *test* followed by names of group, grid, and test case. - -Example: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} - Draw[1]> test blend simple A1 - CASE blend simple A1: OK - Draw[2]> -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Note that normally an intermediate output of the script is not shown. The detailed log of the test can be obtained after the test execution by running command "dlog get". - -To see intermediate commands and their output during the test execution, add one more argument -"echo" at the end of the command line. Note that with this option the log is not collected and summary is not produced. - -Type help test in DRAW prompt to get help on options supported by *test* command: - -~~~~~ -Draw[3]> help test -test: Run specified test case - Use: test group grid casename [options...] - Allowed options are: - -echo: all commands and results are echoed immediately, - but log is not saved and summary is not produced - It is also possible to use "1" instead of "-echo" - If echo is OFF, log is stored in memory and only summary - is output (the log can be obtained with command "dlog get") - -outfile filename: set log file (should be non-existing), - it is possible to save log file in text file or - in html file(with snapshot), for that "filename" - should have ".html" extension - -overwrite: force writing log in existing file - -beep: play sound signal at the end of the test - -errors: show all lines from the log report that are recognized as errors - This key will be ignored if the "-echo" key is already set. -~~~~~ - -@subsubsection testmanual_intro_quick_create Creating a New Test - -The detailed rules of creation of new tests are given in @ref testmanual_3 "Creation and modification of tests" chapter. The following short description covers the most typical situations: - -Use prefix bug followed by Mantis issue ID and, if necessary, additional suffixes, for naming the test script, data files, and DRAW commands specific for this test case. - -1. If the test requires C++ code, add it as new DRAW command(s) in one of files in *QABugs* package. -2. Add script(s) for the test case in the subfolder corresponding to the relevant OCCT module of the group *bugs* ($CASROOT/tests/bugs). See @ref testmanual_5_2 "the correspondence map". -3. In the test script: - * Load all necessary DRAW modules by command *pload*. - * Use command *locate_data_file* to get a path to data files used by test script. (Make sure to have this command not inside catch statement if it is used.) - * Use DRAW commands to reproduce the tested situation. - * Make sure that in case of failure the test produces a message containing word "Error" or other recognized by the test system as error (add new error patterns in file parse.rules if necessary). - * If the test case reports error due to an existing problem and the fix is not available, add @ref testmanual_3_6 "TODO" statement for each error to mark it as a known problem. The TODO statements must be specific so as to match the actually generated messages but not all similar errors. - * To check expected output which should be obtained as the test result, add @ref testmanual_3_7 "REQUIRED" statement for each line of output to mark it as required. - * If the test case produces error messages (contained in parse.rules), which are expected in that test and should not be considered as its failure (e.g. test for *checkshape* command), add REQUIRED statement for each error to mark it as required output. -4. To check whether the data files needed for the test are already present in the database, use DRAW command *testfile* (see below). - If the data file is already present, use it for a new test instead of adding a duplicate. - If the data file(s) are not yet present in the test database, put them to a folder and add it to the environment variable *CSF_TestDataPath* to be found by the test system. - The location of the data files, which need to be accessed by OCC team and put to the official database, should be provided in the comment to Mantis issue, clearly indicating how the names of the files used by the test script match the actual names of the files. - The simplest way is to attach the data files to the Mantis issue, with the same names as used by the test script. -5. Check that the test case runs as expected (test for fix: OK with the fix, FAILED without the fix; test for existing problem: BAD), and integrate it to the Git branch created for the issue. - -Example: - -* Added files: - -~~~~~ -git status -short -A tests/bugs/heal/data/bug210_a.brep -A tests/bugs/heal/data/bug210_b.brep -A tests/bugs/heal/bug210_1 -A tests/bugs/heal/bug210_2 -~~~~~ - -* Test script - -~~~~~{.tcl} -puts "OCC210 (case 1): Improve FixShape for touching wires" - -restore [locate_data_file bug210_a.brep] a - -fixshape result a 0.01 0.01 -checkshape result -~~~~~ - -DRAW command *testfile* should be used to check the data files used by the test for possible duplication of content or names. -The command accepts the list of paths to files to be checked (as a single argument) and gives a conclusion on each of the files, for instance: - -~~~~~ -Draw[1]> testfile [glob /my/data/path/bug12345*] -Collecting info on test data files repository... -Checking new file(s)... - -* /my/data/path/bug12345.brep: duplicate - already present under name bug28773_1.brep - --> //server/occt_tests_data/public/brep/bug28773_1.brep - -* /my/data/path/cadso.brep: new file - Warning: DOS encoding detected, consider converting to - UNIX unless DOS line ends are needed for the test - Warning: shape contains triangulation (946 triangles), - consider removing them unless they are needed for the test! - BREP size=201 KiB, nbfaces=33, nbedges=94 -> private - -* /my/data/path/case_8_wire3.brep: already present - --> //server/occt_tests_data/public/brep/case_8_wire3.brep - -* /my/data/path/case_8_wire4.brep: error - name is already used by existing file - --> //server/occt_tests_data/public/brep/case_8_wire4.brep -~~~~~ - -@section testmanual_2 Organization of Test Scripts - -@subsection testmanual_2_1 General Layout - -Standard OCCT tests are located in subdirectory tests of the OCCT root folder ($CASROOT). - -Additional test folders can be added to the test system by defining environment variable *CSF_TestScriptsPath*. This should be list of paths separated by semicolons (*;*) on Windows -or colons (*:*) on Linux or Mac. Upon DRAW launch, path to *tests* subfolder of OCCT is added at the end of this variable automatically. - -Each test folder is expected to contain: - * Optional file *parse.rules* defining patterns for interpretation of test results, common for all groups in this folder - * One or several test group directories. - -Each group directory contains: - - * File *grids.list* that identifies this test group and defines list of test grids in it. - * Test grids (sub-directories), each containing set of scripts for test cases, and optional files *cases.list*, *parse.rules*, *begin* and *end*. - * Optional sub-directory data - -By convention, names of test groups, grids, and cases should contain no spaces and be lower-case. -The names *begin, end, data, parse.rules, grids.list* and *cases.list* are reserved. - -General layout of test scripts is shown in Figure 1. - -@figure{/dev_guides/tests/images/tests_image001.png,"Layout of tests folder",400} - - -@subsection testmanual_2_2 Test Groups - -@subsubsection testmanual_2_2_1 Group Names - -The names of directories of test groups containing systematic test grids correspond to the functionality tested by each group. - -Example: - -~~~~~ - caf - mesh - offset -~~~~~ - -Test group *bugs* is used to collect the tests coming from bug reports. Group *demo* collects tests of the test system, DRAW, samples, etc. - -@subsubsection testmanual_2_2_2 File "grids.list" - -This test group contains file *grids.list*, which defines an ordered list of grids in this group in the following format: - -~~~~~~~~~~~~~~~~~ -001 gridname1 -002 gridname2 -... -NNN gridnameN -~~~~~~~~~~~~~~~~~ - -Example: - -~~~~~~~~~~~~~~~~~ - 001 basic - 002 advanced -~~~~~~~~~~~~~~~~~ - -@subsubsection testmanual_2_2_3 File "begin" - -This file is a Tcl script. It is executed before every test in the current group. -Usually it loads necessary Draw commands, sets common parameters and defines -additional Tcl functions used in test scripts. - -Example: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} - pload TOPTEST ;# load topological command - set cpulimit 300 ;# set maximum time allowed for script execution -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -@subsubsection testmanual_2_2_4 File "end" - -This file is a TCL script. It is executed after every test in the current group. Usually it checks the results of script work, makes a snap-shot of the viewer and writes *TEST COMPLETED* to the output. - -Note: *TEST COMPLETED* string should be present in the output to indicate that the test is finished without crash. - -See @ref testmanual_3 "Creation and modification of tests" chapter for more information. - -Example: -~~~~~ - if { [isdraw result] } { - checkshape result - } else { - puts "Error: The result shape can not be built" - } - puts "TEST COMPLETED" -~~~~~ - -@subsubsection testmanual_2_2_5 File "parse.rules" - -The test group may contain *parse.rules* file. This file defines patterns used for analysis of the test execution log and deciding the status of the test run. - -Each line in the file should specify a status (single word), followed by a regular expression delimited by slashes (*/*) that will be matched against lines in the test output log to check if it corresponds to this status. - -The regular expressions should follow Tcl syntax, with a special exception that "\b" is considered as word limit (Perl-style), in addition to "\y" used in Tcl. - -The rest of the line can contain a comment message, which will be added to the test report when this status is detected. - -Example: - -~~~~~ - FAILED /\b[Ee]xception\b/ exception - FAILED /\bError\b/ error - SKIPPED /Cannot open file for reading/ data file is missing - SKIPPED /Could not read file .*, abandon/ data file is missing -~~~~~ - -Lines starting with a *#* character and blank lines are ignored to allow comments and spacing. - -See @ref testmanual_details_results "Interpretation of test results" chapter for details. - -If a line matches several rules, the first one applies. Rules defined in the grid are checked first, then rules in the group, then rules in the test root directory. This allows defining some rules on the grid level with status *IGNORE* to ignore messages that would otherwise be treated as errors due to the group level rules. - -Example: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} - FAILED /\\bFaulty\\b/ bad shape - IGNORE /^Error [23]d = [\d.-]+/ debug output of blend command - IGNORE /^Tcl Exception: tolerance ang : [\d.-]+/ blend failure -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -@subsubsection testmanual_2_2_6 Directory "data" -The test group may contain subdirectory *data*, where test scripts shared by different test grids can be put. See also @ref testmanual_2_3_5 "Directory data". - -@subsection testmanual_2_3 Test Grids - -@subsubsection testmanual_2_3_1 Grid Names - -The folder of a test group can have several sub-directories (Grid 1… Grid N) defining test grids. -Each directory contains a set of related test cases. The name of a directory should correspond to its contents. - -Example: - -~~~~~ -caf - basic - bugs - presentation -~~~~~ - -Here *caf* is the name of the test group and *basic*, *bugs*, *presentation*, etc. are the names of grids. - -@subsubsection testmanual_2_3_2 File "begin" - -This file is a TCL script executed before every test in the current grid. - -Usually it sets variables specific for the current grid. - -Example: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} - set command bopfuse ;# command tested in this grid -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -@subsubsection testmanual_2_3_3 File "end" - -This file is a TCL script executed after every test in current grid. - -Usually it executes a specific sequence of commands common for all tests in the grid. - -Example: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} - vdump $imagedir/${casename}.png ;# makes a snap-shot of AIS viewer -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -@subsubsection testmanual_2_3_4 File "cases.list" - -The grid directory can contain an optional file cases.list -defining an alternative location of the test cases. -This file should contain a single line defining the relative path to the collection of test cases. - -Example: - -~~~~~ -../data/simple -~~~~~ - -This option is used for creation of several grids of tests with the same data files and operations but performed with differing parameters. The common scripts are usually located place in the common -subdirectory of the test group, data/simple for example. - -If file *cases.list* exists, the grid directory should not contain any test cases. -The specific parameters and pre- and post-processing commands -for test execution in this grid should be defined in the files *begin* and *end*. - - -@subsubsection testmanual_2_3_5 Directory "data" - -The test grid may contain subdirectory *data*, containing data files used in tests (BREP, IGES, STEP, etc.) of this grid. - -@subsection testmanual_2_4 Test Cases - -The test case is a TCL script, which performs some operations using DRAW commands -and produces meaningful messages that can be used to check the validity of the result. - -Example: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} - pcylinder c1 10 20 ;# create first cylinder - pcylinder c2 5 20 ;# create second cylinder - ttranslate c2 5 0 10 ;# translate second cylinder to x,y,z - bsection result c1 c2 ;# create a section of two cylinders - checksection result ;# will output error message if result is bad -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The test case can have any name (except for the reserved names *begin, end, data, cases.list* and *parse.rules*). -For systematic grids it is usually a capital English letter followed by a number. - -Example: - -~~~~~ - A1 - A2 - B1 - B2 -~~~~~ - -Such naming facilitates compact representation of tests execution results in tabular format within HTML reports. - - -@section testmanual_3 Creation And Modification Of Tests - -This section describes how to add new tests and update existing ones. - -@subsection testmanual_3_1 Choosing Group, Grid, and Test Case Name - -The new tests are usually added in the frame of processing issues in OCCT Mantis tracker. -Such tests in general should be added to group bugs, in the grid -corresponding to the affected OCCT functionality. See @ref testmanual_5_2 "Mapping of OCCT functionality to grid names in group bugs". - -New grids can be added as necessary to contain tests for the functionality not yet covered by existing test grids. -The test case name in the bugs group should be prefixed by the ID of the corresponding issue in Mantis (without leading zeroes) with prefix *bug*. It is recommended to add a suffix providing a hint on the tested situation. If more than one test is added for a bug, they should be distinguished by suffixes; either meaningful or just ordinal numbers. - -Example: - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.tcl} - bug12345_coaxial - bug12345_orthogonal_1 - bug12345_orthogonal_2 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If the new test corresponds to a functionality already covered by the existing systematic test grid (e.g. group *mesh* for *BRepMesh* issues), this test can be added (or moved later by OCC team) to that grid. - -@subsection testmanual_3_2 Adding Data Files Required for a Test - -It is advisable to make self-contained test scripts whenever possible, so as they could be used in the environments where data files are not available. For that simple geometric objects and shapes can be created using DRAW commands in the test script itself. - -If the test requires a data file, it should be put to the directory listed in environment variable *CSF_TestDataPath*. -Alternatively, it can be put to subdirectory *data* of the test grid. -It is recommended to prefix the data file with the corresponding issue id prefixed by *bug*, e.g. *bug12345_face1.brep*, to avoid possible conflicts with names of existing data files. - -Note that when the test is integrated to the master branch, OCC team will move the data file to the data files repository, to keep OCCT sources repository clean from data files. - -When you prepare a test script, try to minimize the size of involved data model. For instance, if the problem detected on a big shape can be reproduced on a single face extracted from that shape, use only that face in the test. - - -@subsection testmanual_3_3 Adding new DRAW commands - -If the test cannot be implemented using available DRAW commands, consider the following possibilities: -* If the existing DRAW command can be extended to enable possibility required for a test in a natural way (e.g. by adding an option to activate a specific mode of the algorithm), this way is recommended. This change should be appropriately documented in a relevant Mantis issue. -* If the new command is needed to access OCCT functionality not exposed to DRAW previously, and this command can be potentially reused (for other tests), it should be added to the package where similar commands are implemented (use *getsource* DRAW command to get the package name). The name and arguments of the new command should be chosen to keep similarity with the existing commands. This change should be documented in a relevant Mantis issue. -* Otherwise the new command implementing the actions needed for this particular test should be added in *QABugs* package. The command name should be formed by the Mantis issue ID prefixed by *bug*, e.g. *bug12345*. - -Note that a DRAW command is expected to return 0 in case of a normal completion, and 1 (Tcl exception) if it is incorrectly used (e.g. a wrong number of input arguments). Thus if the new command needs to report a test error, this should be done by outputting an appropriate error message rather than by returning a non-zero value. -File names must be encoded in the script rather than in the DRAW command and passed to the DRAW command as an argument. - -@subsection testmanual_3_4 Script Implementation - -The test should run commands necessary to perform the tested operations, in general assuming a clean DRAW session. The required DRAW modules should be loaded by *pload* command, if it is not done by *begin* script. The messages produced by commands in a standard output should include identifiable messages on the discovered problems if any. - -Usually the script represents a set of commands that a person would run interactively to perform the operation and see its results, with additional comments to explain what happens. - -Example: -~~~~~ -# Simple test of fusing box and sphere -box b 10 10 10 -sphere s 5 -bfuse result b s -checkshape result -~~~~~ - -Make sure that file *parse.rules* in the grid or group directory contains a regular expression to catch possible messages indicating the failure of the test. - -For instance, for catching errors reported by *checkshape* command relevant grids define a rule to recognize its report by the word *Faulty*: - -~~~~~ -FAILED /\bFaulty\b/ bad shape -~~~~~ - -For the messages generated in the script it is recommended to use the word 'Error' in the error message. - -Example: - -~~~~~ -set expected_length 11 -if { [expr $actual_length - $expected_length] > 0.001 } { - puts "Error: The length of the edge should be $expected_length" -} -~~~~~ - -At the end, the test script should output *TEST COMPLETED* string to mark a successful completion of the script. This is often done by the *end* script in the grid. - -When the test script requires a data file, use Tcl procedure *locate_data_file* to get a path to it, instead of putting the path explicitly. This will allow easy move of the data file from OCCT sources repository to the data files repository without the need to update the test script. - -Example: - -~~~~~ -stepread [locate_data_file CAROSKI_COUPELLE.step] a * -~~~~~ - -When the test needs to produce some snapshots or other artefacts, use Tcl variable *imagedir* as the location where such files should be put. -* Command *testgrid* sets this variable to the subdirectory of the results folder corresponding to the grid. -* Command *test* by default creates a dedicated temporary directory in the system temporary folder (normally the one specified by environment variable *TempDir*, *TEMP*, or *TMP*) for each execution, and sets *imagedir* to that location. - -However if variable *imagedir* is defined on the top level of Tcl interpretor, command *test* will use it instead of creating a new directory. - -Use Tcl variable *casename* to prefix all files produced by the test. -This variable is set to the name of the test case. - -The test system can recognize an image file (snapshot) and include it in HTML log and differences if its name starts with the name of the test case (use variable *casename*), optionally followed by underscore or dash and arbitrary suffix. - -The image format (defined by extension) should be *png*. - -Example: -~~~~~ -xwd $imagedir/${casename}.png -vdisplay result; vfit -vdump $imagedir/${casename}-axo.png -vfront; vfit -vdump $imagedir/${casename}-front.png -~~~~~ - -would produce: -~~~~~ -A1.png -A1-axo.png -A1-front.png -~~~~~ - -Note that OCCT must be built with FreeImage support to be able to produce usable images. - -Other Tcl variables defined during the test execution are: -- *groupname*: name of the test group; -- *gridname*: name of the test grid; -- *dirname*: path to the root directory of the current set of test scripts. - -In order to ensure that the test works as expected in different environments, observe the following additional rules: -* Avoid using external commands such as *grep, rm,* etc., as these commands can be absent on another system (e.g. on Windows); use facilities provided by Tcl instead. -* Do not put call to *locate_data_file* in catch statement -- this can prevent correct interpretation of the missing data file by the test system. -* Do not use commands *decho* and *dlog* in the test script, to avoid interference with use of these commands by the test system. - -@subsection testmanual_details_results Interpretation of test results - -The result of the test is evaluated by checking its output against patterns defined in the files *parse.rules* of the grid and group. - -The OCCT test system recognizes five statuses of the test execution: -* SKIPPED: reported if a line matching SKIPPED pattern is found (prior to any FAILED pattern). This indicates that the test cannot be run in the current environment; the most typical case is the absence of the required data file. -* FAILED: reported if a line matching pattern with status FAILED is found (unless it is masked by the preceding IGNORE pattern or a TODO or REQUIRED statement), or if message TEST COMPLETED or at least one of REQUIRED patterns is not found. This indicates that the test has produced a bad or unexpected result, and usually means a regression. -* BAD: reported if the test script output contains one or several TODO statements and the corresponding number of matching lines in the log. This indicates a known problem. The lines matching TODO statements are not checked against other patterns and thus will not cause a FAILED status. -* IMPROVEMENT: reported if the test script output contains a TODO statement for which no corresponding line is found. This is a possible indication of improvement (a known problem has disappeared). -* OK: reported if none of the above statuses have been assigned. This means that the test has passed without problems. - -Other statuses can be specified in *parse.rules* files, these will be classified as FAILED. - -For integration of the change to OCCT repository, all tests should return either OK or BAD status. -The new test created for an unsolved problem should return BAD. The new test created for a fixed problem should return FAILED without the fix, and OK with the fix. - -@subsection testmanual_3_6 Marking BAD cases - -If the test produces an invalid result at a certain moment then the corresponding bug should be created in the OCCT issue tracker located at https://tracker.dev.opencascade.org, and the problem should be marked as TODO in the test script. - -The following statement should be added to such a test script: -~~~~~ -puts "TODO BugNumber ListOfPlatforms: RegularExpression" -~~~~~ - -Here: -* *BugNumber* is the bug ID in the tracker. For example: #12345. -* *ListOfPlatforms* is a list of platforms, at which the bug is reproduced (Linux, Windows, MacOS, or All). Note that the platform name is custom for the OCCT test system; Use procedure *checkplatform* to get the platform name. - -Example: -~~~~~ -Draw[2]> checkplatform -Windows -~~~~~ - -* RegularExpression is a regular expression, which should be matched against the line indicating the problem in the script output. - -Example: -~~~~~ -puts "TODO #22622 Mandriva2008: Abort .* an exception was raised" -~~~~~ - -The parser checks the test output and if an output line matches the *RegularExpression* then it will be assigned a BAD status instead of FAILED. - -A separate TODO line must be added for each output line matching an error expression to mark the test as BAD. If not all TODO messages are found in the test log, the test will be considered as possible improvement. - -To mark the test as BAD for an incomplete case (when the final *TEST COMPLETE* message is missing) the expression *TEST INCOMPLETE* should be used instead of the regular expression. - -Example: - -~~~~~ -puts "TODO OCC22817 All: exception.+There are no suitable edges" -puts "TODO OCC22817 All: \\*\\* Exception \\*\\*" -puts "TODO OCC22817 All: TEST INCOMPLETE" -~~~~~ - -@subsection testmanual_3_7 Marking required output - -To check the obtained test output matches the expected results considered correct, add REQUIRED statement for each specific message. -For that, the following statement should be added to the corresponding test script: - -~~~~~ -puts "REQUIRED ListOfPlatforms: RegularExpression" -~~~~~ - -Here *ListOfPlatforms* and *RegularExpression* have the same meaning as in TODO statements described above. - -The REQUIRED statement can also be used to mask the message that would normally be interpreted as error (according to the rules defined in *parse.rules*) but should not be considered as such within the current test. - -Example: -~~~~~ -puts "REQUIRED Linux: Faulty shapes in variables faulty_1 to faulty_5" -~~~~~ - -This statement notifies test system that errors reported by *checkshape* command are expected in that test case, and test should be considered as OK if this message appears, despite of presence of general rule stating that 'Faulty' signals failure. - -If output does not contain required statement, test case will be marked as FAILED. - -@section testmanual_4 Advanced Use - -@subsection testmanual_4_1 Running Tests on Older Versions of OCCT - -Sometimes it might be necessary to run tests on the previous versions of OCCT (<= 6.5.4) that do not include this test system. This can be done by adding DRAW configuration file *DrawAppliInit* in the directory, which is current by the moment of DRAW start-up, to load test commands and to define the necessary environment. - -Note: in OCCT 6.5.3, file *DrawAppliInit* already exists in $CASROOT/src/DrawResources, new commands should be added to this file instead of a new one in the current directory. - -For example, let us assume that *d:/occt* contains an up-to-date version of OCCT sources with tests, and the test data archive is unpacked to *d:/test-data*): - -~~~~~ -set env(CASROOT) d:/occt -set env(CSF_TestScriptsPath) $env(CASROOT)/tests -source $env(CASROOT)/src/DrawResources/TestCommands.tcl -set env(CSF_TestDataPath) $env(CASROOT)/data;d:/test-data -return -~~~~~ - -Note that on older versions of OCCT the tests are run in compatibility mode and thus not all output of the test command can be captured; this can lead to absence of some error messages (can be reported as either a failure or an improvement). - -@subsection testmanual_4_2 Adding custom tests - -You can extend the test system by adding your own tests. For that it is necessary to add paths to the directory where these tests are located, and one or more additional data directories, to the environment variables *CSF_TestScriptsPath* and *CSF_TestDataPath*. The recommended way for doing this is using DRAW configuration file *DrawAppliInit* located in the directory which is current by the moment of DRAW start-up. - -Use Tcl command _path_separator to insert a platform-dependent separator to the path list. - -For example: -~~~~~ -set env(CSF_TestScriptsPath) \ - $env(TestScriptsPath)[_path_separator]d:/MyOCCTProject/tests -set env(CSF_TestDataPath) \ - d:/occt/test-data[_path_separator]d:/MyOCCTProject/data -return ;# this is to avoid an echo of the last command above in cout -~~~~~ - -@subsection testmanual_4_3 Parallel execution of tests - -For better efficiency, on computers with multiple CPUs the tests can be run in parallel mode. This is default behavior for command *testgrid* : the tests are executed in parallel processes (their number is equal to the number of CPUs available on the system). In order to change this behavior, use option parallel followed by the number of processes to be used (1 or 0 to run sequentially). - -Note that the parallel execution is only possible if Tcl extension package *Thread* is installed. -If this package is not available, *testgrid* command will output a warning message. - -@subsection testmanual_4_4 Checking non-regression of performance, memory, and visualization - -Some test results are very dependent on the characteristics of the workstation, where they are performed, and thus cannot be checked by comparison with some predefined values. These results can be checked for non-regression (after a change in OCCT code) by comparing them with the results produced by the version without this change. The most typical case is comparing the result obtained in a branch created for integration of a fix (CR***) with the results obtained on the master branch before that change is made. - -OCCT test system provides a dedicated command *testdiff* for comparing CPU time of execution, memory usage, and images produced by the tests. - -~~~~~ -testdiff dir1 dir2 [groupname [gridname]] [options...] -~~~~~ -Here *dir1* and *dir2* are directories containing logs of two test runs. - -Possible options are: -* -save \ -- saves the resulting log in a specified file ($dir1/diff-$dir2.log by default). HTML log is saved with the same name and extension .html; -* -status {same|ok|all} -- allows filtering compared cases by their status: - * *same* -- only cases with same status are compared (default); - * *ok* -- only cases with OK status in both logs are compared; - * *all* -- results are compared regardless of status; -* -verbose \ -- defines the scope of output data: - * 1 -- outputs only differences; - * 2 -- additionally outputs the list of logs and directories present in one of directories only; - * 3 -- (by default) additionally outputs progress messages; -* -image [filename] - compare images and save the resulting log in specified file ($dir1/diffimage-$dir2.log by default) -* -cpu [filename] - compare overall CPU and save the resulting log in specified file ($dir1/diffcpu-$dir2.log by default) -* -memory [filename] - compare memory delta and save the resulting log in specified file ($dir1/diffmemory-$dir2.log by default) -* -highlight_percent \ - highlight considerable (>value in %) deviations of CPU and memory (default value is 5%) - -Example: - -~~~~~ -Draw[]> testdiff results/CR12345-2012-10-10T08:00 results/master-2012-10-09T21:20 -~~~~~ - -Particular tests can generate additional data that need to be compared by *testdiff* command. -For that, for each parameter to be controlled, the test should produce the line containing keyword "COUNTER* followed by arbitrary name of the parameter, then colon and numeric value of the parameter. - -Example of test code: - -~~~~~ -puts "COUNTER Memory heap usage at step 5: [meminfo h]" -~~~~~ - -@section testmanual_5 APPENDIX - -@subsection testmanual_5_1 Test groups - -@subsubsection testmanual_5_1_1 3rdparty - -This group allows testing the interaction of OCCT and 3rdparty products. - -DRAW module: VISUALIZATION. - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| export | vexport | export of images to different formats | -| fonts | vtrihedron, vcolorscale, vdrawtext | display of fonts | - - -@subsubsection testmanual_5_1_2 blend - -This group allows testing blends (fillets) and related operations. - -DRAW module: MODELING. - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| simple | blend | fillets on simple shapes | -| complex | blend | fillets on complex shapes, non-trivial geometry | -| tolblend_simple | tolblend, blend | | -| buildevol | buildevol | | -| tolblend_buildvol | tolblend, buildevol | use of additional command tolblend | -| bfuseblend | bfuseblend | | -| encoderegularity | encoderegularity | | - -@subsubsection testmanual_5_1_3 boolean - -This group allows testing Boolean operations. - -DRAW module: MODELING (packages *BOPTest* and *BRepTest*). - -Grids names are based on name of the command used, with suffixes: -* _2d -- for tests operating with 2d objects (wires, wires, 3d objects, etc.); -* _simple -- for tests operating on simple shapes (boxes, cylinders, toruses, etc.); -* _complex -- for tests dealing with complex shapes. - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| bcommon_2d | bcommon | Common operation (old algorithm), 2d | -| bcommon_complex | bcommon | Common operation (old algorithm), complex shapes | -| bcommon_simple | bcommon | Common operation (old algorithm), simple shapes | -| bcut_2d | bcut | Cut operation (old algorithm), 2d | -| bcut_complex | bcut | Cut operation (old algorithm), complex shapes | -| bcut_simple | bcut | Cut operation (old algorithm), simple shapes | -| bcutblend | bcutblend | | -| bfuse_2d | bfuse | Fuse operation (old algorithm), 2d | -| bfuse_complex | bfuse | Fuse operation (old algorithm), complex shapes | -| bfuse_simple | bfuse | Fuse operation (old algorithm), simple shapes | -| bopcommon_2d | bopcommon | Common operation, 2d | -| bopcommon_complex | bopcommon | Common operation, complex shapes | -| bopcommon_simple | bopcommon | Common operation, simple shapes | -| bopcut_2d | bopcut | Cut operation, 2d | -| bopcut_complex | bopcut | Cut operation, complex shapes | -| bopcut_simple | bopcut | Cut operation, simple shapes | -| bopfuse_2d | bopfuse | Fuse operation, 2d | -| bopfuse_complex | bopfuse | Fuse operation, complex shapes | -| bopfuse_simple | bopfuse | Fuse operation, simple shapes | -| bopsection | bopsection | Section | -| boptuc_2d | boptuc | | -| boptuc_complex | boptuc | | -| boptuc_simple | boptuc | | -| bsection | bsection | Section (old algorithm) | - -@subsubsection testmanual_5_1_4 bugs - -This group allows testing cases coming from Mantis issues. - -The grids are organized following OCCT module and category set for the issue in the Mantis tracker. -See @ref testmanual_5_2 "Mapping of OCCT functionality to grid names in group bugs" chapter for details. - -@subsubsection testmanual_5_1_5 caf - -This group allows testing OCAF functionality. - -DRAW module: OCAFKERNEL. - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| basic | | Basic attributes | -| bugs | | Saving and restoring of document | -| driver | | OCAF drivers | -| named_shape | | *TNaming_NamedShape* attribute | -| presentation | | *AISPresentation* attributes | -| tree | | Tree construction attributes | -| xlink | | XLink attributes | - -@subsubsection testmanual_5_1_6 chamfer - -This group allows testing chamfer operations. - -DRAW module: MODELING. - -The test grid name is constructed depending on the type of the tested chamfers. Additional suffix _complex is used for test cases involving complex geometry (e.g. intersections of edges forming a chamfer); suffix _sequence is used for grids where chamfers are computed sequentially. - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| equal_dist | | Equal distances from edge | -| equal_dist_complex | | Equal distances from edge, complex shapes | -| equal_dist_sequence | | Equal distances from edge, sequential operations | -| dist_dist | | Two distances from edge | -| dist_dist_complex | | Two distances from edge, complex shapes | -| dist_dist_sequence | | Two distances from edge, sequential operations | -| dist_angle | | Distance from edge and given angle | -| dist_angle_complex | | Distance from edge and given angle | -| dist_angle_sequence | | Distance from edge and given angle | - -@subsubsection testmanual_5_1_7 de - -This group tests reading and writing of CAD data files (iges, step) to and from OCCT. - -Test cases check transfer status, shape and attributes against expected reference values. - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| iges_1, iges_2, iges_3 | igesbrep, brepiges, ReadIges, WriteIges | IGES tests | -| step_1, step_2, step_3, step_4, step_5 | stepread, stepwrite, ReadStep, WriteStep | STEP tests | - -@subsubsection testmanual_5_1_8 demo - -This group allows demonstrating how testing cases are created, and testing DRAW commands and the test system as a whole. - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| draw | getsource, restore | Basic DRAW commands | -| testsystem | | Testing system | -| samples | | OCCT samples | - - -@subsubsection testmanual_5_1_9 draft - -This group allows testing draft operations. - -DRAW module: MODELING. - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| Angle | depouille | Drafts with angle (inclined walls) | - - -@subsubsection testmanual_5_1_10 feat - -This group allows testing creation of features on a shape. - -DRAW module: MODELING (package *BRepTest*). - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| featdprism | | | -| featlf | | | -| featprism | | | -| featrevol | | | -| featrf | | | - -@subsubsection testmanual_5_1_11 heal - -This group allows testing the functionality provided by *ShapeHealing* toolkit. - -DRAW module: XSDRAW - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| fix_shape | fixshape | Shape healing | -| fix_gaps | fixwgaps | Fixing gaps between edges on a wire | -| same_parameter | sameparameter | Fixing non-sameparameter edges | -| same_parameter_locked | sameparameter | Fixing non-sameparameter edges | -| fix_face_size | DT_ApplySeq | Removal of small faces | -| elementary_to_revolution | DT_ApplySeq | Conversion of elementary surfaces to revolution | -| direct_faces | directfaces | Correction of axis of elementary surfaces | -| drop_small_edges | fixsmall | Removal of small edges | -| split_angle | DT_SplitAngle | Splitting periodic surfaces by angle | -| split_angle_advanced | DT_SplitAngle | Splitting periodic surfaces by angle | -| split_angle_standard | DT_SplitAngle | Splitting periodic surfaces by angle | -| split_closed_faces | DT_ClosedSplit | Splitting of closed faces | -| surface_to_bspline | DT_ToBspl | Conversion of surfaces to b-splines | -| surface_to_bezier | DT_ShapeConvert | Conversion of surfaces to bezier | -| split_continuity | DT_ShapeDivide | Split surfaces by continuity criterion | -| split_continuity_advanced | DT_ShapeDivide | Split surfaces by continuity criterion | -| split_continuity_standard | DT_ShapeDivide | Split surfaces by continuity criterion | -| surface_to_revolution_advanced | DT_ShapeConvertRev | Convert elementary surfaces to revolutions, complex cases | -| surface_to_revolution_standard | DT_ShapeConvertRev | Convert elementary surfaces to revolutions, simple cases | -| update_tolerance_locked | updatetolerance | Update the tolerance of shape so that it satisfy the rule: toler(face)<=toler(edge)<=toler(vertex) | - -@subsubsection testmanual_5_1_12 mesh - -This group allows testing shape tessellation (*BRepMesh*) and shading. - -DRAW modules: MODELING (package *MeshTest*), VISUALIZATION (package *ViewerTest*) - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| advanced_shading | vdisplay | Shading, complex shapes | -| standard_shading | vdisplay | Shading, simple shapes | -| advanced_mesh | mesh | Meshing of complex shapes | -| standard_mesh | mesh | Meshing of simple shapes | -| advanced_incmesh | incmesh | Meshing of complex shapes | -| standard_incmesh | incmesh | Meshing of simple shapes | -| advanced_incmesh_parallel | incmesh | Meshing of complex shapes, parallel mode | -| standard_incmesh_parallel | incmesh | Meshing of simple shapes, parallel mode | - -@subsubsection testmanual_5_1_13 mkface - -This group allows testing creation of simple surfaces. - -DRAW module: MODELING (package *BRepTest*) - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| after_trim | mkface | | -| after_offset | mkface | | -| after_extsurf_and_offset | mkface | | -| after_extsurf_and_trim | mkface | | -| after_revsurf_and_offset | mkface | | -| mkplane | mkplane | | - -@subsubsection testmanual_5_1_14 nproject - -This group allows testing normal projection of edges and wires onto a face. - -DRAW module: MODELING (package *BRepTest*) - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| Base | nproject | | - -@subsubsection testmanual_5_1_15 offset - -This group allows testing offset functionality for curves and surfaces. - -DRAW module: MODELING (package *BRepTest*) - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| compshape | offsetcompshape | Offset of shapes with removal of some faces | -| faces_type_a | offsetparameter, offsetload, offsetperform | Offset on a subset of faces with a fillet | -| faces_type_i | offsetparameter, offsetload, offsetperform | Offset on a subset of faces with a sharp edge | -| shape_type_a | offsetparameter, offsetload, offsetperform | Offset on a whole shape with a fillet | -| shape_type_i | offsetparameter, offsetload, offsetperform | Offset on a whole shape with a fillet | -| shape | offsetshape | | -| wire_closed_outside_0_005, wire_closed_outside_0_025, wire_closed_outside_0_075, wire_closed_inside_0_005, wire_closed_inside_0_025, wire_closed_inside_0_075, wire_unclosed_outside_0_005, wire_unclosed_outside_0_025, wire_unclosed_outside_0_075 | mkoffset | 2d offset of closed and unclosed planar wires with different offset step and directions of offset ( inside / outside ) | - -@subsubsection testmanual_5_1_16 pipe - -This group allows testing construction of pipes (sweeping of a contour along profile). - -DRAW module: MODELING (package *BRepTest*) - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| Standard | pipe | | - -@subsubsection testmanual_5_1_17 prism - -This group allows testing construction of prisms. - -DRAW module: MODELING (package *BRepTest*) - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| seminf | prism | | - -@subsubsection testmanual_5_1_18 sewing - -This group allows testing sewing of faces by connecting edges. - -DRAW module: MODELING (package *BRepTest*) - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| tol_0_01 | sewing | Sewing faces with tolerance 0.01 | -| tol_1 | sewing | Sewing faces with tolerance 1 | -| tol_100 | sewing | Sewing faces with tolerance 100 | - -@subsubsection testmanual_5_1_19 thrusection - -This group allows testing construction of shell or a solid passing through a set of sections in a given sequence (loft). - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| solids | thrusection | Lofting with resulting solid | -| not_solids | thrusection | Lofting with resulting shell or face | - -@subsubsection testmanual_5_1_20 xcaf - -This group allows testing extended data exchange packages. - -| Grid | Commands | Functionality | -| :---- | :----- | :------- | -| dxc, dxc_add_ACL, dxc_add_CL, igs_to_dxc, igs_add_ACL, brep_to_igs_add_CL, stp_to_dxc, stp_add_ACL, brep_to_stp_add_CL, brep_to_dxc, add_ACL_brep, brep_add_CL | | Subgroups are divided by format of source file, by format of result file and by type of document modification. For example, *brep_to_igs* means that the source shape in brep format was added to the document, which was saved into igs format after that. The postfix *add_CL* means that colors and layers were initialized in the document before saving and the postfix *add_ACL* corresponds to the creation of assembly and initialization of colors and layers in a document before saving. | - - -@subsection testmanual_5_2 Mapping of OCCT functionality to grid names in group *bugs* - -| OCCT Module / Mantis category | Toolkits | Test grid in group bugs | -| :---------- | :--------- | :---------- | -| Application Framework | PTKernel, TKPShape, TKCDF, TKLCAF, TKCAF, TKBinL, TKXmlL, TKShapeSchema, TKPLCAF, TKBin, TKXml, TKPCAF, FWOSPlugin, TKStdLSchema, TKStdSchema, TKTObj, TKBinTObj, TKXmlTObj | caf | -| Draw | TKDraw, TKTopTest, TKViewerTest, TKXSDRAW, TKDCAF, TKXDEDRAW, TKTObjDRAW, TKQADraw, DRAWEXE, Problems of testing system | draw | -| Shape Healing | TKShHealing | heal | -| Mesh | TKMesh, TKXMesh | mesh | -| Data Exchange | TKIGES | iges | -| Data Exchange | TKSTEPBase, TKSTEPAttr, TKSTEP209, TKSTEP | step | -| Data Exchange | TKSTL, TKVRML | stlvrml | -| Data Exchange | TKXSBase, TKXCAF, TKXCAFSchema, TKXDEIGES, TKXDESTEP, TKXmlXCAF, TKBinXCAF | xde | -| Foundation Classes | TKernel, TKMath | fclasses | -| Modeling_algorithms | TKGeomAlgo, TKTopAlgo, TKPrim, TKBO, TKBool, TKHLR, TKFillet, TKOffset, TKFeat, TKXMesh | modalg | -| Modeling Data | TKG2d, TKG3d, TKGeomBase, TKBRep | moddata | -| Visualization | TKService, TKV2d, TKV3d, TKOpenGl, TKMeshVS, TKNIS | vis | - - -@subsection testmanual_5_3 Recommended approaches to checking test results - -@subsubsection testmanual_5_3_1 Shape validity - -Run command *checkshape* on the result (or intermediate) shape and make sure that *parse.rules* of the test grid or group reports bad shapes (usually recognized by word "Faulty") as error. - -Example -~~~~~ -checkshape result -~~~~~ - -To check the number of faults in the shape command *checkfaults* can be used. - -Use: checkfaults shape source_shape [ref_value=0] - -The default syntax of *checkfaults* command: -~~~~~ -checkfaults results a_1 -~~~~~ - -The command will check the number of faults in the source shape (*a_1*) and compare it -with number of faults in the resulting shape (*result*). If shape *result* contains -more faults, you will get an error: -~~~~~ -checkfaults results a_1 -Error : Number of faults is 5 -~~~~~ -It is possible to set the reference value for comparison (reference value is 4): - -~~~~~ -checkfaults results a_1 4 -~~~~~ - -If number of faults in the resulting shape is unstable, reference value should be set to "-1". -As a result command *checkfaults* will return the following error: - -~~~~~ -checkfaults results a_1 -1 -Error : Number of faults is UNSTABLE -~~~~~ - -@subsubsection testmanual_5_3_2 Shape tolerance - -The maximal tolerance of sub-shapes of each kind of the resulting shape can be extracted from output of tolerance command as follows: - -~~~~~ -set tolerance [tolerance result] -regexp { *FACE +: +MAX=([-0-9.+eE]+)} $tolerance dummy max_face -regexp { *EDGE +: +MAX=([-0-9.+eE]+)} $tolerance dummy max_edgee -regexp { *VERTEX +: +MAX=([-0-9.+eE]+)} $tolerance dummy max_vertex -~~~~~ - -It is possible to use command *checkmaxtol* to check maximal tolerance of shape and compare it with reference value. - -Use: checkmaxtol shape [options...] - -Allowed options are: - * -ref -- reference value of maximum tolerance; - * -source -- list of shapes to compare with; - * -min_tol -- minimum tolerance for comparison; - * -multi_tol -- tolerance multiplier. - -The default syntax of *checkmaxtol* command for comparison with the reference value: -~~~~~ -checkmaxtol result -ref 0.00001 -~~~~~ - -There is an opportunity to compare max tolerance of resulting shape with max tolerance of source shape. -In the following example command *checkmaxtol* gets max tolerance among objects *a_1* and *a_2*. -Then it chooses the maximum value between founded tolerance and value -min_tol (0.000001) -and multiply it on the coefficient -multi_tol (i.e. 2): - -~~~~~ -checkmaxtol result -source {a_1 a_2} -min_tol 0.000001 -multi_tol 2 -~~~~~ - -If the value of maximum tolerance more than founded tolerance for comparison, the command will return an error. - -Also, command *checkmaxtol* can be used to get max tolerance of the shape: - -~~~~~ -set maxtol [checkmaxtol result] -~~~~~ - -@subsubsection testmanual_5_3_3 Shape volume, area, or length - -Use command *vprops, sprops,* or *lprops* to correspondingly measure volume, area, or length of the shape produced by the test. The value can be extracted from the result of the command by *regexp*. - -Example: -~~~~~ -# check area of shape result with 1% tolerance -regexp {Mass +: +([-0-9.+eE]+)} [sprops result] dummy area -if { abs($area - $expected) > 0.1 + 0.01 * abs ($area) } { - puts "Error: The area of result shape is $area, while expected $expected" -} -~~~~~ - -@subsubsection testmanual_5_3_4 Memory leaks - -The test system measures the amount of memory used by each test case. Considerable deviations (as well as the overall difference) in comparison with reference results can be reported by command *testdiff* (see @ref testmanual_4_4). - -To check memory leak on a particular operation, run it in a cycle, measure the memory consumption at each step and compare it with a threshold value. -The command *checktrend* (defined in *tests/bugs/begin*) can be used to analyze a sequence of memory measurements and to get a statistically based evaluation of the leak presence. - -Example: -~~~~~ -set listmem {} -for {set i 1} {$i < 100} {incr i} { - # run suspect operation - … - # check memory usage (with tolerance equal to half page size) - lappend listmem [expr [meminfo w] / 1024] - if { [checktrend $listmem 0 256 "Memory leak detected"] } { - puts "No memory leak, $i iterations" - break - } -} -~~~~~ - -@subsubsection testmanual_5_3_5 Visualization - -The following command sequence allows you to take a snapshot of the viewer, give it the name of the test case, and save in the directory indicated by Tcl variable *imagedir*. - -~~~~~ -vinit -vclear -vdisplay result -vsetdispmode 1 -vfit -vzfit -vdump $imagedir/${casename}_shading.png -~~~~~ - -This image will be included in the HTML log produced by *testgrid* command and will be checked for non-regression through comparison of images by command *testdiff*. - -Also it is possible to use command *checkview* to make a snapshot of the viewer. - -Use: checkview [options...] -Allowed options are: -* -display shapename -- displays shape with name *shapename*; -* -3d -- displays shape in 3d viewer; -* -2d [ v2d / smallview ] - displays shape in 2d viewer (the default viewer is *smallview*); -* -path PATH -- sets the location of the saved viewer screenshot; -* -vdispmode N -- sets *vdispmode* for 3d viewer (default value is 1) -* -screenshot -- makes a screenshot of already created viewer -* The procedure can check a property of shape (length, area or volume) and compare it with value *N*: - * -l [N] - * -s [N] - * -v [N] - * If the current property is equal to value *N*, the shape is marked as valid in the procedure. - * If value *N* is not given, the procedure will mark the shape as valid if the current property is non-zero. -* -with {a b c} -- displays shapes *a, b* and *c* together with the shape (if the shape is valid) -* -otherwise {d e f} -- displays shapes *d, e* and *f* instead of the shape (if the shape is NOT valid) - -Note that is required to use either option -2d or option -3d. - -Examples: -~~~~~ -checkview -display result -2d -path ${imagedir}/${test_image}.png -checkview -display result -3d -path ${imagedir}/${test_image}.png -checkview -display result_2d -2d v2d -path ${imagedir}/${test_image}.png -~~~~~ - -~~~~~ -box a 10 10 10 -box b 5 5 5 10 10 10 -bcut result b a -set result_vertices [explode result v] -checkview -display result -2d -with ${result_vertices} -otherwise { a b } -l -path ${imagedir}/${test_image}.png -~~~~~ - -~~~~~ -box a 10 10 10 -box b 5 5 5 10 10 10 -bcut result b a -vinit -vdisplay a b -vfit -checkview -screenshot -3d -path ${imagedir}/${test_image}.png -~~~~~ - -@subsubsection testmanual_5_3_6 Number of free edges - -Procedure *checkfreebounds* compares the number of free edges with a reference value. - -Use: checkfreebounds shape ref_value [options...] - -Allowed options are: - * -tol N -- used tolerance (default -0.01); - * -type N -- used type, possible values are "closed" and "opened" (default "closed"). - -~~~~~ -checkfreebounds result 13 -~~~~~ - -Option -tol N defines tolerance for command *freebounds*, which is used within command *checkfreebounds*. - -Option -type N is used to select the type of counted free edges: closed or open. - -If the number of free edges in the resulting shape is unstable, the reference value should be set to "-1". -As a result command *checkfreebounds* will return the following error: - -~~~~~ -checkfreebounds result -1 -Error : Number of free edges is UNSTABLE -~~~~~ - -@subsubsection testmanual_5_3_7 Compare numbers - -Procedure *checkreal* checks the equality of two reals with a tolerance (relative and absolute). - -Use: checkreal name value expected tol_abs tol_rel - -~~~~~ -checkreal "Some important value" $value 5 0.0001 0.01 -~~~~~ - -@subsubsection testmanual_5_3_8 Check number of sub-shapes - -Procedure *checknbshapes* compares the number of sub-shapes in "shape" with the given reference data. - -Use: checknbshapes shape [options...] - -Allowed options are: - * -vertex N - * -edge N - * -wire N - * -face N - * -shell N - * -solid N - * -compsolid N - * -compound N - * -shape N - * -t -- compares the number of sub-shapes in "shape" counting - the same sub-shapes with different location as different sub-shapes. - * -m msg -- prints "msg" in case of error - -~~~~~ -checknbshapes result -vertex 8 -edge 4 -~~~~~ - -@subsubsection testmanual_5_3_9 Check pixel color - -Command *checkcolor* can be used to check pixel color. - -Use: checkcolor x y red green blue - -where: - * x, y -- pixel coordinates; - * red green blue -- expected pixel color (values from 0 to 1). - -This procedure checks color with tolerance (5x5 area). - -Next example will compare color of point with coordinates x=100 y=100 with RGB color R=1 G=0 B=0. -If colors are not equal, procedure will check the nearest ones points (5x5 area) -~~~~~ -checkcolor 100 100 1 0 0 -~~~~~ - -@subsubsection testmanual_5_3_10 Compute length, area and volume of input shape - -Procedure *checkprops* computes length, area and volume of the input shape. - -Use: checkprops shapename [options...] - -Allowed options are: - * -l LENGTH -- command *lprops*, computes the mass properties of all edges in the shape with a linear density of 1; - * -s AREA -- command *sprops*, computes the mass properties of all faces with a surface density of 1; - * -v VOLUME -- command *vprops*, computes the mass properties of all solids with a density of 1; - * -eps EPSILON -- the epsilon defines relative precision of computation; - * -deps DEPSILON -- the epsilon defines relative precision to compare corresponding values; - * -equal SHAPE -- compares area, volume and length of input shapes. Puts error if they are not equal; - * -notequal SHAPE -- compares area, volume and length of input shapes. Puts error if they are equal. - -Options -l, -s and -v are independent and can be used in any order. Tolerance *epsilon* is the same for all options. - -~~~~~ -checkprops result -s 6265.68 -checkprops result -s -equal FaceBrep -~~~~~ - -@subsubsection testmanual_5_3_11 Parse output dump and compare it with reference values - -Procedure *checkdump* is used to parse output dump and compare it with reference values. - -Use: checkdump shapename [options...] - -Allowed options are: - * -name NAME -- list of parsing parameters (e.g. Center, Axis, etc.); - * -ref VALUE -- list of reference values for each parameter in *NAME*; - * -eps EPSILON -- the epsilon defines relative precision of computation. - -~~~~~ -checkdump result -name {Center Axis XAxis YAxis Radii} -ref {{-70 0} {-1 -0} {-1 -0} {0 -1} {20 10}} -eps 0.01 -~~~~~ - -@subsubsection testmanual_5_3_12 Compute length of input curve - -Procedure *checklength* computes length of the input curve. - -Use: checklength curvename [options...] - -Allowed options are: - * -l LENGTH -- command *length*, computes the length of the input curve with precision of computation; - * -eps EPSILON -- the epsilon defines a relative precision of computation; - * -equal CURVE -- compares the length of input curves. Puts error if they are not equal; - * -notequal CURVE -- compares the length of input curves. Puts error if they are equal. - -~~~~~ -checklength cp1 -l 7.278 -checklength res -l -equal ext_1 -~~~~~ -@subsubsection testmanual_5_3_13 Check maximum deflection, number of triangles and nodes in mesh - -Command *checktrinfo* can be used to to check the maximum deflection, as well as the number of nodes and triangles in mesh. - -Use: checktrinfo shapename [options...] - -Allowed options are: - * -tri [N] -- compares the current number of triangles in *shapename* mesh with the given reference data. - If reference value N is not given and the current number of triangles is equal to 0, procedure *checktrinfo* will print an error. - * -nod [N] -- compares the current number of nodes in *shapename* mesh with the given reference data. - If reference value N is not given and the current number of nodes is equal to 0, procedure *checktrinfo* will print an error. - * -defl [N] -- compares the current value of maximum deflection in *shapename* mesh with the given reference data. - If reference value N is not given and current maximum deflection is equal to 0, procedure *checktrinfo* will print an error. - * -max_defl N -- compares the current value of maximum deflection in *shapename* mesh with the max possible value. - * -tol_abs_tri N -- absolute tolerance for comparison of number of triangles (default value 0). - * -tol_rel_tri N -- relative tolerance for comparison of number of triangles (default value 0). - * -tol_abs_nod N -- absolute tolerance for comparison of number of nodes (default value 0). - * -tol_rel_nod N -- relative tolerance for comparison of number of nodes (default value 0). - * -tol_abs_defl N -- absolute tolerance for deflection comparison (default value 0). - * -tol_rel_defl N -- relative tolerance for deflection comparison (default value 0). - * -ref [trinfo a] -- compares deflection, number of triangles and nodes in *shapename* and *a*. - -Note that options -tri, -nod and -defl do not work together with option -ref. - -Examples: - -Comparison with some reference values: -~~~~~ -checktrinfo result -tri 129 -nod 131 -defl 0.01 -~~~~~ - -Comparison with another mesh: -~~~~~ -checktrinfo result -ref [tringo a] -~~~~~ - -Comparison of deflection with the max possible value: -~~~~~ -checktrinfo result -max_defl 1 -~~~~~ - -Check that the current values are not equal to zero: -~~~~~ -checktrinfo result -tri -nod -defl -~~~~~ - -Check that the number of triangles and the number of nodes are not equal to some specific values: -~~~~~ -checktrinfo result -tri !10 -nod !8 -~~~~~ - -It is possible to compare current values with reference values with some tolerances. -Use options -tol_\* for that. -~~~~~ -checktrinfo result -defl 1 -tol_abs_defl 0.001 -~~~~~ - diff -Nru opencascade-7.4.1+dfsg1/dox/dev_guides/upgrade/upgrade.md opencascade-7.5.1+dfsg1/dox/dev_guides/upgrade/upgrade.md --- opencascade-7.4.1+dfsg1/dox/dev_guides/upgrade/upgrade.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/dev_guides/upgrade/upgrade.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,1906 +0,0 @@ -Upgrade from older OCCT versions {#occt_dev_guides__upgrade} -================================ - -@tableofcontents - -@section upgrade_intro Introduction - -This document provides technical details on changes made in particular versions of OCCT. It can help to upgrade user applications based on previous versions of OCCT to newer ones. - -@subsection upgrade_intro_precautions Precautions - -Back-up your code before the upgrade. -We strongly recommend using version control system during the upgrade process and saving one or several commits at each step of upgrade, until the overall result is verified. -This will facilitate identification and correction of possible problems that can occur at the intermediate steps of upgrade. -It is advisable to document each step carefully to be able to repeat it if necessary. - -@subsection upgrade_intro_disclaim Disclaimer - -This document describes known issues that have been encountered during porting of OCCT and some applications and approaches that have helped to resolve these issues in known cases. -It does not pretend to cover all possible migration issues that can appear in your application. -Take this document with discretion; apply your expertise and knowledge of your application to ensure the correct result. - -The automatic upgrade tool is provided as is, without warranty of any kind, and we explicitly disclaim any liability for possible errors that may appear due to use of this tool. -It is your responsibility to ensure that the changes you made in your code are correct. -When you upgrade the code by an automatic script, make sure to carefully review the introduced changes at each step before committing them. - - -@section upgrade_65 Upgrade to OCCT 6.5.0 - -Porting of user applications from an earlier OCCT version to version 6.5 requires taking into account the following major changes: -* If you are not comfortable with dependence on Intel TBB, FreeImage, or Gl2Ps libraries, you will need to (re)build OCCT with these dependencies disabled. -* The low-level format version of OCAF binary and XML persistence has been incremented. Hence, the files saved by OCCT 6.5 to OCAF binary or XML format will not be readable by previous versions of OCCT. -* The *BRepMesh* triangulation algorithm has been seriously revised and now tries hard to fulfill the requested deflection and angular tolerance parameters. If you experience any problems with performance or triangulation quality (in particular, display of shapes in shading mode), consider revising the values of these parameters used in your application. -* If you were using method *ToPixMap()* of class *V3d_View* to get a buffer for passing to Windows API functions (e.g. *BitBlt*), this will not work anymore. You will need to use method *Image_PixMap::AccessBuffer()* to get the raw buffer data that can be further passed to WinAPI functions. -* As the processing of message gravity parameter in *Message* package has been improved, some application messages (especially the ones generated by IGES or STEP translators) can be suppressed or new messages appear in the application. Use relevant message level parameter to tune this behavior. - -@section upgrade_651 Upgrade to OCCT 6.5.1 - -Porting of user applications from an earlier OCCT version to version 6.5.1 requires taking into account the following major changes: - -* Method *Graphic3d_Structure::Groups()* now returns *Graphic3d_SequenceOfGroup*. If this method has been used, the application code should be updated to iterate another collection type or, if *Graphic3d_HSetOfGroup* is required, to fill its own collection: -~~~~ -const Graphic3d_SequenceOfGroup& aGroupsSeq = theStructure.Groups(); -Handle(Graphic3d_HSetOfGroup) aGroupSet = new Graphic3d_HSetOfGroup(); -Standard_Integer aLen = aGroupsSeq.Length(); -for (Standard_Integer aGr = 1; aGr <= aLen; ++aGr) -{ - aGroupSet->Add (aGroupsSeq.Value (aGr)); -} -~~~~ - -* All occurrences of *Select3D_Projector* in the application code (if any) should be replaced with *Handle(Select3D_Projector)*. -* The code of inheritors of *Select3D_SensitiveEntity* should be updated if they override Matches() (this is probable, if clipping planes are used). -* Constructor for *V3d_Plane* has been changed, so the extra argument should be removed if used in the application. It is necessary to add a new plane using method *V3d_Viewer::AddPlane()* if *V3d_Viewer* has been used to manage clipping planes list (this does not affect clipping planes representation). Have a look at the source code for new DRAWEXE *vclipplane* command in *ViewerTest_ObjectsCommands.cxx, VClipPlane* to see how clipping planes can be managed in the application. - -@section upgrade_652 Upgrade to OCCT 6.5.2 - -Porting of user applications from an earlier OCCT version to version 6.5.2 requires taking into account the following major changes: -* Any code that has been generated by WOK from CDL generic classes *Tcollection_DataMap* and *Tcollection_IndexedDataMap* needs to be regenerated by WOK to take into account the change in the interface of these classes. -* The enumerations *CDF_StoreStatus* and *CDF_RetrievableStatus* have been replaced by the enumerations *PCDM_StoreStatus* and *PCDM_ReaderStatus*. Correspondingly, the methods *Open, Save* and *SaveAs* of the class *TDocStd_Application* have changed their return value. Any code, which uses these enumerations, needs to be updated. -* *BRepLib_MakeFace* has been modified to receive tolerance value for resolution of degenerated edges. This tolerance parameter has no default value to ensure that the client code takes care of passing a meaningful value, not just *Precision::Confusion*, so some porting overheads are expected. -* If the callback mechanism in call_togl_redraw function was used in the application code, it is necessary to revise it to take into account the new callback execution and provide a check of reason value of Aspect_GraphicCallbackStruct in callback methods to confirm that the callback code is executed at the right moment. Now the callbacks are executed before redrawing the underlayer, before redrawing the overlayer and at the end of redrawing. The information about the moment when the callback is invoked is provided with the reason value in form of an additional bit flag (OCC_PRE_REDRAW, OCC_PRE_OVERLAY). The state of OpenGl changed in callback methods will not be restored automatically, which might lead to unwanted behavior in redrawing procedure. -* The print method used in the application code might need to be revised to take into account the ability to choose between print algorithms: tile and stretch. The stretch algorithm will be selected by default during porting. -* It is recommended to *BRepMesh_DiscretFactory* users, to check *BRepMesh_DiscretFactory::SetDefault()* return value to determine plugin availability / validity. *BRepMesh_DiscretFactory::Discret()* method now returns handle instead of pointer. The code should be updated in the following manner: -~~~~ -Handle(BRepMesh_DiscretRoot) aMeshAlgo = BRepMesh_DiscretFactory::Get().Discret (theShape, theDeflection, theAngularToler); - if (!aMeshAlgo.IsNull()) {} -~~~~ - -* The default state of *BRepMesh* parallelization has been turned off. The user should switch this flag explicitly: - * by using methods *BRepMesh_IncrementalMesh::SetParallel(Standard_True)* for each *BRepMesh_IncrementalMesh* instance before Perform(); - * by calling *BRepMesh_IncrementalMesh::SetParallelDefault(Standard_True)* when *BRepMesh_DiscretFactory* is used to retrieve the meshing tool (this also affects auto-triangulation in *AIS*). - -@section upgrade_653 Upgrade to OCCT 6.5.3 - -Porting of user applications from an earlier OCCT version to version 6.5.3 requires taking into account the following major changes: -* As a result of code clean-up and redesign of *TKOpenGl* driver, some obsolete functions and rendering primitives (TriangleMesh, TriangleSet, Bezier, Polyline, Polygon, PolygonHoles, QuadrangleMesh and *QuadrangleSet*) have been removed. Instead, the application developers should use primitive arrays that provide the same functionality but are hardware-accelerated. The details can be found in OCCT Visualization User's Guide, “Primitive Arrays†chapter. -* Applications should not call *AIS_InteractiveObject::SetPolygonOffsets()* method for an instance of *AIS_TexturedShape* class after it has been added to *AIS_InteractiveContext*. More generally, modification of *Graphic3d_AspectFillArea3d* parameters for the computed groups of any *AIS_InteractiveObject* subclass that uses texture mapping should be avoided, because this results in broken texture mapping (see issue 23118). It is still possible to apply non-default polygon offsets to *AIS_TexturedShape* by calling *SetPolygonOffsets()* before displaying the shape. -* The applications that might have used internal functions provided by *TKOpenGl* or removed primitives will need to be updated. -* In connection with the implementation of Z-layers it might be necessary to revise the application code or revise the custom direct descendant classes of *Graphic3d_GraphicDriver* and *Graphic3d_StructureManager* to use the Z-layer feature. -* Global variables *Standard_PI* and *PI* have been eliminated (use macro *M_PI* instead). -* Method *HashCode()* has been removed from class *Standard_Transient*. It is advisable to use global function HashCode() for Handle objects instead. -* Declaration of operators new/delete for classes has become consistent and is encapsulated in macros. -* Memory management has been changed to use standard heap (MMGT_OPT=0) and reentrant mode (MMGT_REENTRANT=1) by default. -* Map classes in *NCollection* package now receive one more argument defining a hash tool. - -@section upgrade_654 Upgrade to OCCT 6.5.4 - -Porting of user applications from an earlier OCCT version to version 6.5.4 requires taking into account the following major changes: -* The code using obsolete classes *Aspect_PixMap, Xw_PixMap* and *WNT_PixMap* should be rewritten implementing class *Image_PixMap*, which is now retrieved by *ToPixMap* methods as argument. A sample code using *ToPixMap* is given below: -~~~~ -#include -void dump (Handle(V3d_View)& theView3D) -{ - Standard_Integer aWndSizeX = 0; - Standard_Integer aWndSizeY = 0; - theView3D->Window()->Size (aWndSizeX, aWndSizeY); - Image_AlienPixMap aPixMap; - theView3D->ToPixMap (aPixMap, aWndSizeX, aWndSizeY); - aPixMap.Save ("c:\\image.png"); -} -~~~~ -* Now OpenGL resources related to Interactive Objects are automatically freed when the last view (window) is removed from graphical driver. -To avoid presentation data loss, the application should replace an old view with a new one in the proper order: first the new view is created and activated and only then the old one is detached and removed. -* It is recommended to use *NCollection* containers with hasher parameter (introduced in 6.5.3) instead of global definition IsEqual()/HashCode() as well as to use explicit namespaces to avoid name collision. - - -@section upgrade_660 Upgrade to OCCT 6.6.0 - -Porting of user applications from an earlier OCCT version to version 6.6.0 requires taking into account the following major changes: -* Due to the changes in the implementation of Boolean Operations, the order of sub-shapes resulting from the same operation performed with OCCT 6.5.x and OCCT 6.6.0 can be different. -It is necessary to introduce the corresponding changes in the applications for which the order of sub-shapes resulting from a Boolean operation is important. It is strongly recommended to use identification methods not relying on the order of sub-shapes (e.g. OCAF naming). -* If you need to use OCCT on Mac OS X with X11 (without Cocoa), build OCCT with defined pre-processor macro *CSF_MAC_USE_GLX11*. XLib front-end (previously the only way for unofficial OCCT builds on Mac OS X) is now disabled by default on this platform. If your application has no support for Cocoa framework you may build OCCT with XLib front-end adding *MACOSX_USE_GLX* macro to compiler options (you may check the appropriate option in WOK configuration GUI and in CMake configuration). Notice that XQuartz (XLib implementation for Mac OS X) now is an optional component and does not provide a sufficient level of integrity with native (Cocoa-based) applications in the system. It is not possible to build OCCT with both XLib and Cocoa at the same time due to symbols conflict in OpenGL functions. -* Animation mode and degeneration presentation mode (simplified presentation for animation) and associated methods have been removed from 3D viewer functionality. -Correspondingly, the code using methods *SetAnimationModeOn(), SetAnimationModeOff(), AnimationModeIsOn(), AnimationMode(), Tumble(), SetDegenerateModeOn(), SetDegenerateModeOff()* and *DegenerateModeIsOn()* of classes *V3d_View* and *Visual3d_View* will need to be removed or redesigned. Hidden Line Removal presentation was not affected; however, the old code that used methods *V3d_View::SetDegenerateModeOn* or *V3d_View::SetDegenerateModeOff* to control HLR presentation should be updated to use *V3d_View::SetComputedMode* method instead. -* Calls of *Graphic3d_Group::BeginPrimitives()* and *Graphic3d_Group::EndPrimitives()* should be removed from the application code. -* Application functionality for drawing 2D graphics that was formerly based on *TKV2d* API should be migrated to *TKV3d* API. The following changes are recommended for this migration: - * A 2D view can be implemented as a *V3d_View* instance belonging to *V3d_Viewer* managed by *AIS_InteractiveContext* instance. To turn *V3d_View* into a 2D view, the necessary view orientation should be set up at the view initialization stage using *V3d_View::SetProj()* method, and view rotation methods simply should not be called. - * Any 2D graphic entity (formerly represented with *AIS2D_InteractiveObject*) should become a class derived from *AIS_InteractiveObject* base. These entities should be manipulated in a view using *AIS_InteractiveContext* class API. - * All drawing code should be put into *Compute()* virtual method of a custom interactive object class and use API of *Graphic3d* package. In particular, all geometry should be drawn using class hierarchy derived from *Graphic3d_ArrayOfPrimitives*. Normally, the Z coordinate for 2D geometry should be constant, unless the application implements some advanced 2D drawing techniques like e.g. multiple "Z layers" of drawings. - * Interactive selection of 2D presentations should be set up inside *ComputeSelection()* virtual method of a custom interactive object class, using standard sensitive entities from *Select3D* package and standard or custom entity owners derived from *SelectMgr_EntityOwner* base. -Refer to the Visualization User's Guide for further details concerning OCCT 3D visualization and selection classes. See also *Viewer2D* OCCT sample application, which shows how 2D drawing can be implemented using TKV3d API. -* Run-time graphic driver library loading mechanism based on *CSF_GraphicShr* environment variable usage has been replaced by explicit linking against *TKOpenGl* library. The code sample below shows how the graphic driver should be created and initialized in the application code: -~~~~ -// initialize a new viewer with OpenGl graphic driver -Handle(Graphic3d_GraphicDriver) aGraphicDriver = -new OpenGl_GraphicDriver ("TKOpenGl"); - aGraphicDriver->Begin (new Aspect_DisplayConnection()); - TCollection_ExtendedString aNameOfViewer ("Visu3D"); - Handle(V3d_Viewer) aViewer -= new V3d_Viewer (aGraphicDriver, aNameOfViewer.ToExtString()); - aViewer->Init(); - -// create a new window or a wrapper over the existing window, -// provided by a 3rd-party framework (Qt, MFC, C# or Cocoa) -#if defined(_WIN32) || defined(__WIN32__) - Aspect_Handle aWindowHandle = (Aspect_Handle )winId(); - Handle(WNT_Window) aWindow = new WNT_Window (winId()); -#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX) - NSView* aViewHandle = (NSView* )winId(); - Handle(Cocoa_Window) aWindow = new Cocoa_Window (aViewHandle); -#else - Aspect_Handle aWindowHandle = (Aspect_Handle )winId(); - Handle(Xw_Window) aWindow = - new Xw_Window (aGraphicDriver->GetDisplayConnection(), aWindowHandle); -#endif // WNT - -// setup the window for a new view - Handle(V3d_View) aView = aViewer->CreateView(); - aView->SetWindow (aWindow); -~~~~ - -* The following changes should be made in the application-specific implementations of texture aspect: - * *Graphic3d_TextureRoot* inheritors now should return texture image by overloading of *Graphic3d_TextureRoot::GetImage()* method instead of the old logic. - * Now you can decide if the application should store the image copy as a field of property or reload it dynamically each time (to optimize the memory usage). The default implementation (which loads the image content from the provided file path) does not hold an extra copy since it will be uploaded to the graphic memory when first used. - * Notice that the image itself should be created within *Image_PixMap* class from *AlienImage* package, while *Image_Image* class is no more supported and will be removed in the next OCCT release. - -@section upgrade_670 Upgrade to OCCT 6.7.0 - -Porting of user applications from an earlier OCCT version to version 6.7.0 requires taking into account the following major changes. - -@subsection upgrade_670_clipping Object-level clipping and capping algorithm. - -* It might be necessary to revise and port code related to management of view-level clipping to use *Graphic3d_ClipPlane* instead of *V3d_Plane* instances. Note that *V3d_Plane* class has been preserved -- as previously, it can be used as plane representation. Another approach to represent *Graphic3d_ClipPlane* in a view is to use custom presentable object. -* The list of arguments of *Select3D_SensitiveEntity::Matches()* method for picking detection has changed. Since now, for correct selection clipping, the implementations should perform a depth clipping check and return (as output argument) minimum depth value found at the detected part of sensitive. Refer to CDL / Doxygen documentation to find descriptive hints and snippets. -* *Select3D_SensitiveEntity::ComputeDepth()* abstract method has been removed. Custom implementations should provide depth checks by method *Matches()* instead -- all data required for it is available within a scope of single method. -* It might be necessary to revise the code of custom sensitive entities and port *Matches()* and *ComputeDepth()* methods to ensure proper selection clipping. Note that obsolete signature of *Matches* is not used anymore by the selector. If your class inheriting *Select3D_SensitiveEntity* redefines the method with old signature the code should not compile as the return type has been changed. This is done to prevent override of removed methods. - -@subsection upgrade_670_markers Redesign of markers presentation - -* Due to the redesign of *Graphic3d_AspectMarker3d* class the code of custom markers initialization should be updated. Notice that you can reuse old markers definition code as *TColStd_HArray1OfByte*; however, *Image_PixMap* is now the preferred way (and supports full-color images on modern hardware). -* Logics and arguments of methods *AIS_InteractiveContext::Erase()* and *AIS_InteractiveContext::EraseAll()* have been changed. Now these methods do not remove resources from *Graphic3d_Structure*; they simply change the visibility flag in it. Therefore, the code that deletes and reÑomputes resources should be revised. -* *Graphic3d_Group::MarkerSet()* has been removed. *Graphic3d_Group::AddPrimitiveArray()* should be used instead to specify marker(s) array. - -@subsection upgrade_670_views Default views are not created automatically - -As the obsolete methods *Init(), DefaultOrthographicView()* and *DefaultPerspectiveView()* have been removed from *V3d_Viewer* class, the two default views are no longer created automatically. It is obligatory to create *V3d_View* instances explicitly, either directly by operator new or by calling *V3d_Viewer::CreateView()*. - -The call *V3d_Viewer::SetDefaultLights()* should also be done explicitly at the application level, if the application prefers to use the default light source configuration. Otherwise, the application itself should set up the light sources to obtain a correct 3D scene. - -@subsection upgrade_670_dimensions Improved dimensions implementation - -* It might be necessary to revise and port code related to management of *AIS_LengthDimension, AIS_AngleDimension* and *AIS_DiameterDimension* presentations. There is no more need to compute value of dimension and pass it as string to constructor argument. The value is computed internally. The custom value can be set with *SetCustomValue()* method. -* The definition of units and general aspect properties is now provided by *Prs3d_DimensionUnits* and *Prs3d_DimensionApsect* classes. -* It might be also necessary to revise code of your application related to usage of *AIS_DimensionDisplayMode enumeration*. If it used for specifying the selection mode, then it should be replaced by a more appropriate enumeration *AIS_DimensionSelectionMode*. - -@subsection upgrade_670_list_collection NCollection_Set replaced by List collection - -It might be necessary to revise your application code, which uses non-ordered *Graphic3d_SetOfHClipPlane* collection type and replace its occurrences by ordered *Graphic3d_SequenceOfHClipPlane* collection type. - - -@section upgrade_680 Upgrade to OCCT 6.8.0 - -Porting of user applications from an earlier OCCT version to version 6.8.0 requires taking into account the following major changes. - -@subsection upgrade_680_ncollection Changes in NCollection classes - -Method *Assign()* in *NCollection* classes does not allow any more copying between different collection types. Such copying should be done manually. - -List and map classes in *NCollection* package now require that their items be copy-constructible, but do not require items to have default constructor. Thus the code using *NCollection* classes for non-copy-constructible objects needs be updated. One option is to provide copy constructor; another possibility is to use Handle or other smart pointer. - -@subsection upgrade_680_view_camera 3D View Camera - -If *ViewMapping* and *ViewOrientation* were used directly, this functionality has to be ported to the new camera model. The following methods should be considered as an alternative to the obsolete *Visual3d* services (all points and directions are supposed to be in world coordinates): -* *Graphic3d_Camera::ViewDimensions()* or *V3d_View::Size()/ZSize()* -- returns view width, height and depth (or "Z size"). Since the view is symmetric now, you can easily compute top, bottom, left and right limits. *Graphic3d_Camera::ZNear()/ZFar()* can be used to obtain the near and far clipping distances with respect to the eye. -* *Graphic3d_Camera::Up()* or *V3d_View::Up()* -- returns Y direction of the view. -* *Graphic3d_Camera::Direction()* returns the reverse view normal directed from the eye, *V3d_View::Proj()* returns the old-style view normal. -* *Graphic3d_Camera::Eye()* or *V3d_View::Eye()* -- returns the camera position (same as projection reference point in old implementation). -* *Graphic3d_Camera::Center()* or *V3d_View::At()* -- returns the point the camera looks at (or view reference point according to old terminology). - -The current perspective model is not fully backward compatible, so the old perspective-related functionality needs to be reviewed. - -Revise application-specific custom presentations to provide a proper bounding box, otherwise the object might become erroneously clipped by automatic *ZFit* or frustum culling algorithms enabled by default. - -@subsection upgrade_680_connected_objects Redesign of Connected Interactive Objects - -The new implementation of connected Interactive Objects makes it necessary to take the following steps if you use connected Interactive Objects in your application. -* Use new *PrsMgr_PresentableObject* transformation API. -* Call *RemoveChild()* from the original object after connect if you need the original object and *AIS_ConnectedInteractive* to move independently. -* Access instances of objects connected to *AIS_MultiplyConnectedInteractive* with *Children()* method. -* For *PrsMgr_PresentableObject* transformation: - * *SetLocation (TopLoc_Location) -> SetLocalTransformation (gp_Trsf)* - * *Location -> LocalTransformation* - * *HasLocation -> HasTransformation* - * *ResetLocation -> ResetTransformation* - -@subsection upgrade_680_unicode Support of UNICODE Characters - -Support of UNICODE characters introduced in OCCT breaks backward compatibility with applications, which currently use filenames in extended ASCII encoding bound to the current locale. Such applications should be updated to convert such strings to UTF-8 format. - -The conversion from UTF-8 to wchar_t is made using little-endian approach. Thus, this code will not work correctly on big-endian platforms. It is needed to complete this in the way similar as it is done for binary persistence (see the macro *DO_INVERSE* in *FSD_FileHeader.hxx).* - -@subsection upgrade_680_projection_shift Elimination of Projection Shift Concept - -It might be necessary to revise the application code, which deals with *Center()* method of *V3d_View*. - -This method was used to pan a *V3d* view by virtually moving the screen center with respect to the projection ray passed through Eye and At points. There is no more need to derive the panning from the Center parameter to get a camera-like eye position and look at the coordinates. *Eye()* and *At()* now return these coordinates directly. When porting code dealing with *Center()*, the parameters *Eye()* and *At()* can be adjusted instead. Also *V3d_View::SetCenter(Xpix, Ypix)* method can be used instead of *V3d_View::Center(X, Y)* to center the view at the given point. However, if the center coordinates X and Y come from older OCCT releases, calling *V3d_View::Panning(-X, -Y)* can be recommended to compensate missing projection shift effect. - -There are several changes introduced to *Graphic3d_Camera*. The internal data structure of the camera is based on *Standard_Real* data types to avoid redundant application-level conversions and precision errors. The transformation matrices now can be evaluated both for *Standard_Real* and *Standard_ShortReal* value types. *ZNear* and *ZFar* planes can be either negative or positive for orthographic camera projection, providing a trade-off between the camera distance and the range of *ZNear* or *ZFar* to reduce difference of exponents of values composing the orientation matrix - to avoid calculation errors. The negative values can be specified to avoid Z-clipping if the reference system of camera goes inside of the model when decreasing camera distance. - -The auto z fit mode, since now, has a parameter defining Z-range margin (the one which is usually passed as argument to *ZFitAll()* method). The methods *SetAutoZFitMode(), AutoZFitScaleFactor()* and *ZFitAll()* from class *V3d_View* deal with the new parameter. - -The class *Select3D_Projector* now supports both orientation and projection transformation matrices, which can be naturally set for the projector. The definition of projector was revised in *StdSelect_ViewerSelector3d*: perspective and orthographic projection parameters are handled properly. Orthographic projector is based only on direction of projection - no more *Center* property. This makes it possible to avoid unnecessary re-projection of sensitive while panning, zooming or moving along the projection ray of the view. These operations do not affect the orthographic projection. - - -@section upgrade_690 Upgrade to OCCT 6.9.0 - -Porting of user applications from an earlier OCCT version to version 6.9.0 requires taking into account the following major changes. - -@subsection upgrade_690_shaders 3D Viewer initialization - -3D Viewer now uses GLSL programs for managing frame buffer and stereoscopic output. -For proper initialization, application should configure **CSF_ShadersDirectory** environment variable pointing to a folder with GLSL resources - files from folder **CASROOT**/src/Shaders. -*Note that **CSF_ShadersDirectory** become optional since OCCT 7.1.0 release*. - -@subsection upgrade_690_selection Changes in Selection - -Selection mechanism of 3D Viewer has been redesigned to use 3-level BVH tree traverse directly in 3D space instead of projection onto 2D screen space (updated on each rotation). This architectural redesign may require appropriate changes at application level in case if custom Interactive Objects are used. - -#### Standard selection -Usage of standard OCCT selection entities would require only minor updates. - -Custom Interactive Objects should implement new virtual method *SelectMgr_SelectableObject::BoundingBox().* - -Now the method *SelectMgr_Selection::Sensitive()* does not return *SelectBasics_SensitiveEntity*. It returns an instance of *SelectMgr_SensitiveEntity*, which belongs to a different class hierarchy (thus *DownCast()* will fail). To access base sensitive it is necessary to use method *SelectMgr_SensitiveEntity::BaseSensitive()*. For example: - -~~~~ -Handle(SelectMgr_Selection) aSelection = anInteractiveObject->Selection (aMode); -for (aSelection->Init(); aSelection->More(); aSelection->Next()) -{ - Handle(SelectBasics_SensitiveEntity) anEntity = aSelection->Sensitive()->BaseSensitive(); -} -~~~~ - -#### Custom sensitive entities - -Custom sensitive entities require more complex changes, since the selection algorithm has been redesigned and requires different output from the entities. - -The method *SelectBasics_SensitiveEntity::Matches()* of the base class should be overridden following the new signature: - -*Standard_Boolean Matches (SelectBasics_SelectingVolumeManager& theMgr, SelectBasics_PickResult& thePickResult)*, where *theMgr* contains information about the currently selected frustum or set of frustums (see *SelectMgr_RectangularFrustum, SelectMgr_TrangularFrustum, SelectMgr_TriangularFrustumSet)* and *SelectBasics_PickResult* is an output parameter, containing information about the depth of the detected entity and distance to its center of geometry. - -In the overridden method it is necessary to implement an algorithm of overlap and inclusion detection (the active mode is returned by *theMgr.IsOverlapAllowed()*) with triangular and rectangular frustums. - -The depth and distance to the center of geometry must be calculated for the 3D projection of user-picked screen point in the world space. You may use already implemented overlap and inclusion detection methods for different primitives from *SelectMgr_RectangularFrustum* and *SelectMgr_TriangularFrustum*, including triangle, point, axis-aligned box, line segment and planar polygon. - -Here is an example of overlap/inclusion test for a box: - -~~~~ -if (!theMgr.IsOverlapAllowed()) // check for inclusion -{ - Standard_Boolean isInside = Standard_True; - return theMgr.Overlaps (myBox.CornerMin(), myBox.CornerMax(), &isInside) && isInside; -} - -Standard_Real aDepth; -if (!theMgr.Overlaps (myBox, aDepth)) // check for overlap -{ - return Standard_False; -} - -thePickResult = -SelectBasics_PickResult (aDepth, theMgr.DistToGeometryCenter (myCenter3d)); -~~~~ - -The interface of *SelectBasics_SensitiveEntity* now contains four new pure virtual functions that should be implemented by each custom sensitive: -* BoundingBox() – returns a bounding box of the entity; -* Clear() – clears up all the resources and memory allocated for complex sensitive entities; -* BVH() – builds a BVH tree for complex sensitive entities, if it is needed; -* NbSubElements() – returns atomic sub-entities of a complex sensitive entity, which will be used as primitives for BVH building. If the entity is simple and no BVH is required, this method returns 1. - -Each sensitive entity now has its own tolerance, which can be overridden by method *SelectBasics_SensitiveEntity::SetSensitivityFactor()* called from constructor. - - -@subsection upgrade_690_adaptor3d-curve Changes in Adaptor3d_Curve class - -All classes inheriting *Adaptor3d_Curve* (directly or indirectly) must be updated in application code to use new signature of methods *Intervals()* and *NbIntervals()*. Note that no compiler warning will be generated if this is not done. - -@subsection upgrade_690_v3d_view Changes in V3d_View class - -The methods *V3d_View::Convert* and *V3d_View::ConvertWithProj()* have ceased to return point on the active grid. It might be necessary to revise the code of your application so that *V3d_View::ConvertToGrid()* was called explicitly for the values returned by *V3d_View::Convert* to get analogous coordinates on the grid. The methods *V3d_View::Convert* and *V3d_View::ConvertWithProj* convert point into reference plane of the view corresponding to the intersection with the projection plane of the eye/view point vector. - -@section upgrade_700 Upgrade to OCCT 7.0.0 - -Porting of user applications from an earlier OCCT version to version 7.0.0 requires taking into account the following major changes. - -Building OCCT now requires compiler supporting some C++11 features. -The supported compilers are: -- MSVC: version 10 (Visual Studio 2010) or later -- GCC: version 4.3 or later -- CLang: version 3.6 or later -- ICC: version XE 2013 SP 1 or later - -When compiling code that uses OCCT with GCC and CLang compilers, it is necessary to use compiler option -std=c++0x (or its siblings) to enable C++11 features. - -@subsection upgrade_700_persist Removal of legacy persistence - -Legacy persistence for shapes and OCAF data based on *Storage_Schema* (toolkits *TKPShape*, *TKPLCAF*, *TKPCAF*, *TKShapeShcema, TLStdLSchema, TKStdSchema*, and *TKXCAFSchema*) has been removed in OCCT 7.0.0. -The applications that used these data persistence tools need to be updated to use other persistence mechanisms. - -@note For compatibility with previous versions, the possibility to read standard OCAF data (*TKLCAF* and *TKCAF*) from files stored in the old format is preserved (toolkits *TKStdL* and *TKStd*). - -The existing data files in standard formats can be converted using OCCT 6.9.1 or a previous version, as follows. - -@note Reading / writing custom files capability from OCCT 6.9.1 is restored in OCCT 7.2.0. See details in @ref upgrade_720_persistence section. - -#### CSFDB files - -Files in *CSFDB* format (usually with extension .csfdb) contain OCCT shape data that can be converted to BRep format. -The easiest way to do that is to use ImportExport sample provided with OCCT 6.9.0 (or earlier): - -- Start ImportExport sample; -- Select File / New; -- Select File / Import / CSFDB... and specify the file to be converted; -- Drag the mouse with the right button pressed across the view to select all shapes by the rectangle; -- Select File / Export / BREP... and specify the location and name for the resulting file - -#### OCAF and XCAF documents - -Files containing OCAF data saved in the old format usually have extensions .std, .sgd or .dxc (XDE documents). -These files can be converted to XML or binary OCAF formats using DRAW Test Harness commands. -Note that if the file contains only attributes defined in *TKLCAF* and *TKCAF*, this action can be performed in OCCT 7.0; otherwise OCCT 6.9.1 or earlier should be used. - -For that, start *DRAWEXE* and perform the following commands: - - * To convert *.std and *.sgd file formats to binary format *.cbf (The created document should be in *BinOcaf* format instead of *MDTV-Standard*): - - @code - Draw[]> pload ALL - Draw[]> Open [path to *.std or *.sgd file] Doc - Draw[]> Format Doc BinOcaf - Draw[]> SaveAs Doc [path to the new file] - @endcode - - * To convert *.dxc file format to binary format *.xbf (The created document should be in *BinXCAF* format instead of *MDTV-XCAF*): - - @code - Draw[]> pload ALL - Draw[]> XOpen [path to *.dxc file] Doc - Draw[]> Format Doc BinXCAF - Draw[]> XSave Doc [path to the new file] - @endcode - -On Windows, it is necessary to replace back slashes in the file path by direct slashes or pairs of back slashes. - -Use *XmlOcaf* or *XmlXCAF* instead of *BinOcaf* and *BinXCAF*, respectively, to save in XML format instead of binary one. - -@subsection upgrade_occt700_cdl Removal of CDL and WOK - -OCCT code has been completely refactored in version 7.0 to get rid of obsolete technologies used since its inception: CDL (Cas.Cade Definition Language) and WOK (Workshop Organization Kit). - -C++ code previously generated by WOK from CDL declarations is now included directly in OCCT sources. - -This modification did not change names, API, and behavior of existing OCCT classes, thus in general the code based on OCCT 6.x should compile and work fine with OCCT 7.0. -However, due to redesign of basic mechanisms (CDL generic classes, Handles and RTTI) using C++ templates, some changes may be necessary in the code when porting to OCCT 7.0, as described below. - -WOK is not necessary anymore for building OCCT from sources, though it still can be used in a traditional way -- auxiliary files required for that are preserved. -The recommended method for building OCCT 7.x is CMake, see @ref occt_dev_guides__building_cmake. -The alternative solution is to use project files generated by OCCT legacy tool **genproj**, see @ref occt_dev_guides__building_msvc, @ref occt_dev_guides__building_code_blocks, and @ref occt_dev_guides__building_xcode. - -@subsubsection upgrade_occt700_cdl_auto Automatic upgrade - -Most of typical changes required for upgrading code for OCCT 7.0 can be done automatically using the *upgrade* tool included in OCCT 7.0. -This tool is a Tcl script, thus Tcl should be available on your workstation to run it. - -Example: -~~~~~ - $ tclsh - % source /adm/upgrade.tcl - % upgrade -recurse -all -src= -~~~~~ - -On Windows, the helper batch script *upgrade.bat* can be used, provided that Tcl is either available in *PATH*, or configured via *custom.bat* script (for instance, if you use OCCT installed from Windows installer package). Start it from the command prompt: - -~~~~~ -cmd> \upgrade.bat -recurse -all -inc=\inc -src= [options] -~~~~~ - -Run the upgrade tool without arguments to see the list of available options. - -The upgrade tool performs the following changes in the code. - -1. Replaces macro *DEFINE_STANDARD_RTTI* by *DEFINE_STANDARD_RTTIEXT*, with second argument indicating base class for the main argument class (if inheritance is recognized by the script): -~~~~~ -DEFINE_STANDARD_RTTI(Class) -> DEFINE_STANDARD_RTTIEXT(Class, Base) -~~~~~ - - @note If macro *DEFINE_STANDARD_RTTI* with two arguments (used in intermediate development versions of OCCT 7.0) is found, the script will convert it to either *DEFINE_STANDARD_RTTIEXT* or *DEFINE_STANDARD_RTTI_INLINE*. - The former case is used if current file is header and source file with the same name is found in the same folder. - In this case, macro *IMPLEMENT_STANDARD_RTTI* is injected in the corresponding source file. - The latter variant defines all methods for RTTI as inline, and does not require *IMPLEMENT_STANDARD_RTTIEXT* macro. - -2. Replaces forward declarations of collection classes previously generated from CDL generics (defined in *TCollection* package) by inclusion of the corresponding header: -~~~~~ -class TColStd_Array1OfReal; -> #include -~~~~~ - -3. Replaces underscored names of *Handle* classes by usage of a macro: -~~~~~ -Handle_Class -> Handle(Class) -~~~~~ - This change is not applied if the source or header file is recognized as containing the definition of Qt class with signals or slots, to avoid possible compilation errors of MOC files caused by inability of MOC to recognize macros (see https://doc.qt.io/qt-4.8/signalsandslots.html). - The file is considered as defining a Qt object if it contains strings *Q_OBJECT* and either *slots:* or *signals:*. - -4. Removes forward declarations of classes with names Handle(C) or *Handle_C*, replacing them either by forward declaration of its argument class, or (for files defining Qt objects) \#include statement for a header with the name of the argument class and extension .hxx: -~~~~~ -class Handle(TColStd_HArray1OfReal); -> #include -~~~~~ - -5. Removes \#includes of files Handle_...hxx that have disappeared in OCCT 7.0: -~~~~~ -#include -> -~~~~~ - -6. Removes *typedef* statements that use *Handle* macro to generate the name: -~~~~~ -typedef NCollection_Handle Handle(Message_Msg); -> -~~~~~ - -7. Converts C-style casts applied to Handles into calls to DownCast() method: -~~~~~ - ((Handle(A)&)b) -> Handle(A)::DownCast(b) - (Handle(A)&)b -> Handle(A)::DownCast(b) - (*((Handle(A)*)&b)) -> Handle(A)::DownCast(b) - *((Handle(A)*)&b) -> Handle(A)::DownCast(b) - (*(Handle(A)*)&b) -> Handle(A)::DownCast(b) -~~~~~ - -8. Moves Handle() macro out of namespace scope: -~~~~~ -Namespace::Handle(Class) -> Handle(Namespace::Class) -~~~~~ - -9. Converts local variables of reference type, which are initialized by a temporary object returned by call to DownCast(), to the variables of non-reference type (to avoid using references to destroyed memory): -~~~~~ - const Handle(A)& a = Handle(B)::DownCast (b); -> Handle(A) a (Handle(B)::DownCast (b)); -~~~~~ - -10. Adds \#include for all classes used as argument to macro STANDARD_TYPE(), except for already included ones; - -11. Removes uses of obsolete macros *IMPLEMENT_DOWNCAST* and *IMPLEMENT_STANDARD_*..., except *IMPLEMENT_STANDARD_RTTIEXT*. - - @note If you plan to keep compatibility of your code with older versions of OCCT, add option -compat to avoid this change. See also @ref upgrade_occt700_cdl_compat. - -. - -As long as the upgrade routine runs, some information messages are sent to the standard output. -In some cases the warnings or errors like the following may appear: - -~~~~~ - Error in {HEADER_FILE}: Macro DEFINE_STANDARD_RTTI used for class {CLASS_NAME} whose declaration is not found in this file, cannot fix -~~~~~ - -Be sure to check carefully all reported errors and warnings, as the corresponding code will likely require manual corrections. -In some cases these messages may help you to detect errors in your code, for instance, cases where *DEFINE_STANDARD_RTTI* macro is used with incorrect class name as an argument. - -@subsubsection upgrade_occt700_cdl_compiler Possible compiler errors - -Some situations requiring upgrade cannot be detected and / or handled by the automatic procedure. -If you get compiler errors or warnings when trying to build the upgraded code, you will need to fix them manually. -The following paragraphs list known situations of this kind. - -#### Missing header files - -The use of handle objects (construction, comparison using operators == or !=, use of function STANDRAD_TYPE() and method DownCast()) now requires the type of the object pointed by Handle to be completely known at compile time. Thus it may be necessary to include header of the corresponding class to make the code compilable. - -For example, the following lines will fail to compile if *Geom_Line.hxx* is not included: - -~~~~~ -Handle(Geom_Line) aLine = 0; -if (aLine != aCurve) {...} -if (aCurve->IsKind(STANDARD_TYPE(Geom_Line)) {...} -aLine = Handle(Geom_Line)::DownCast (aCurve); -~~~~~ - -Note that it is not necessary to include header of the class to declare Handle to it. -However, if you define a class *B* that uses Handle(*A*) in its fields, or contains a method returning Handle(*A*), it is advisable to have header defining *A* included in the header of *B*. -This will eliminate the need to include the header *A* in each source file where class *B* is used. - -#### Ambiguity of calls to overloaded functions - -This issue appears in the compilers that do not support default arguments in template functions (known cases are Visual C++ 10 and 11): the compiler reports an ambiguity error if a handle is used in the argument of a call to the function that has two or more overloaded versions, receiving handles to different types. -The problem is that operator const handle& is defined for any type *T2*, thus the compiler cannot make the right choice. - -Example: -~~~~~ -void func (const Handle(Geom_Curve)&); -void func (const Handle(Geom_Surface)&); - -Handle(Geom_TrimmedCurve) aCurve = new Geom_TrimmedCurve (...); -func (aCurve); // ambiguity error in VC++ 10 -~~~~~ - -Note that this problem can be avoided in many cases if macro *OCCT_HANDLE_NOCAST* is used, see @ref upgrade_occt700_cdl_nocast "below". - -To resolve this ambiguity, change your code so that argument type should correspond exactly to the function signature. -In some cases this can be done by using the relevant type for the corresponding variable, like in the example above: - -~~~~~ -Handle(Geom_Curve) aCurve = new Geom_TrimmedCurve (...); -~~~~~ - -Other variants consist in assigning the argument to a local variable of the correct type and using the direct cast or constructor: - -~~~~~ -const Handle(Geom_Curve)& aGCurve (aTrimmedCurve); -func (aGCurve); // OK - argument has exact type -func (static_cast(aCurve)); // OK - direct cast -func (Handle(Geom_Curve)(aCurve)); // OK - temporary handle is constructed -~~~~~ - -Another possibility consists in defining additional template variant of the overloaded function causing ambiguity, and using *SFINAE* to resolve the ambiguity. -This technique can be illustrated by the definition of the template variant of method IGESData_IGESWriter::Send(). - -#### Lack of implicit cast to base type - -As the cast of a handle to the reference to another handle to the base type has become a user-defined operation, the conversions that require this cast together with another user-defined cast will not be resolved automatically by the compiler. - -For example: - -~~~~~ -Handle(Geom_Geometry) aC = GC_MakeLine (p, v); // compiler error -~~~~~ - -The problem is that the class *GC_MakeLine* has a user-defined conversion to const Handle(Geom_TrimmedCurve)&, which is not the same as the type of the local variable *aC*. - -To resolve this, use method Value(): - -~~~~~ -Handle(Geom_Geometry) aC = GC_MakeLine (p, v).Value(); // ok -~~~~~ - -or use variable of the appropriate type: - -~~~~~ -Handle(Geom_TrimmedCurve) aC = GC_MakeLine (p, v); // ok -~~~~~ - -A similar problem appears with GCC compiler, when *const* handle to derived type is used to construct handle to base type via assignment (and in some cases in return statement), for instance: - -~~~~~ - const Handle(Geom_Line) aLine; - Handle(Geom_Curve) c1 = aLine; // GCC error - Handle(Geom_Curve) c2 (aLine); // ok -~~~~~ - -This problem is specific to GCC and it does not appear if macro *OCCT_HANDLE_NOCAST* is used, see @ref upgrade_occt700_cdl_nocast "below". - -#### Incorrect use of STANDARD_TYPE and Handle macros - -You might need to clean your code from incorrect use of macros *STANDARD_TYPE*() and *Handle*(). - -1. Explicit definitions of static functions with names generated by macro *STANDARD_TYPE()*, which are artifacts of old implementation of RTTI, should be removed. - - Example: -~~~~~ -const Handle(Standard_Type)& STANDARD_TYPE(math_GlobOptMin) -{ - static Handle(Standard_Type) _atype = new Standard_Type ("math_GlobOptMin", sizeof (math_GlobOptMin)); - return _atype; -} -~~~~~ - -2. Incorrect location of closing parenthesis of *Handle()* macro that was not detectable in OCCT 6.x will cause a compiler error and must be corrected. - - Example (note misplaced closing parenthesis): -~~~~~ -aBSpline = Handle( Geom2d_BSplineCurve::DownCast(BS->Copy()) ); -~~~~~ - -#### Use of class Standard_AncestorIterator - -Class *Standard_AncestorIterator* has been removed; use method *Parent()* of *Standard_Type* class to parse the inheritance chain. - -#### Absence of cast to Standard_Transient* - -Handles in OCCT 7.0 do not have the operator of conversion to Standard_Transient*, which was present in earlier versions. -This is done to prevent possible unintended errors like this: - -~~~~~ -Handle(Geom_Line) aLine = ...; -Handle(Geom_Surface) aSurf = ...; -... -if (aLine == aSurf) {...} // will cause a compiler error in OCCT 7.0, but not OCCT 6.x -~~~~~ - -The places where this implicit cast has been used should be corrected manually. -The typical situation is when Handle is passed to stream: - -~~~~~ -Handle(Geom_Line) aLine = ...; -os << aLine; // in OCCT 6.9.0, resolves to operator << (void*) -~~~~~ - -Call method get() explicitly to output the address of the Handle. - -#### Method DownCast for non-base types - -Method *DownCast()* in OCCT 7.0 is made templated; if its argument is not a base class, "deprecated" compiler warning is generated. -This is done to prevent possible unintended errors like this: - -~~~~~ -Handle(Geom_Surface) aSurf = ; -Handle(Geom_Line) aLine = - Handle(Geom_Line)::DownCast (aSurf); // will cause a compiler warning in OCCT 7.0, but not OCCT 6.x -~~~~~ - -The places where this cast has been used should be corrected manually. - -If down casting is used in a template context where the argument can have the same or unrelated type so that *DownCast()* may be not available in all cases, use C++ *dynamic_cast<>* instead, e.g.: - -~~~~~ -template -bool CheckLine (const Handle(T) theArg) -{ - Handle(Geom_Line) aLine = dynamic_cast (theArg.get()); - ... -} -~~~~~ - -@subsubsection upgrade_occt700_cdl_runtime Possible runtime problems - -Here is the list of known possible problems at run time after the upgrade to OCCT 7.0. - -#### References to temporary objects - -In previous versions, the compiler was able to detect the situation when a local variable of a "reference to a Handle" type is initialized by temporary object, and ensured that lifetime of that object is longer than that of the variable. -In OCCT 7.0 with default options, it will not work if types of the temporary object and variable are different (due to involvement of user-defined type cast), thus such temporary object will be destroyed immediately. - -This problem does not appear if macro *OCCT_HANDLE_NOCAST* is used during compilation, see below. - -Example: - -~~~~~ -// note that DownCast() returns new temporary object! -const Handle(Geom_BoundedCurve)& aBC = -Handle(Geom_TrimmedCurve)::DownCast(aCurve); -aBC->Transform (T); // access violation in OCCT 7.0 -~~~~~ - -@subsubsection upgrade_occt700_cdl_nocast Option to avoid cast of handle to reference to base type - -In OCCT 6.x and earlier versions the handle classes formed a hierarchy echoing the hierarchy of the corresponding object classes . -This automatically enabled the possibility to use the handle to a derived class in all contexts where the handle to a base class was needed, e.g. to pass it in a function by reference without copying: - -~~~~ -Standard_Boolean GetCurve (Handle(Geom_Curve)& theCurve); -.... -Handle(Geom_Line) aLine; -if (GetCurve (aLine)) { - // use aLine, unsafe -} -~~~~ - -This feature was used in multiple places in OCCT and dependent projects. -However it is potentially unsafe: in the above example no checks are done at compile time or at run time to ensure that the type assigned to the argument handle is compatible with the type of the handle passed as argument. -If an object of incompatible type (e.g. Geom_Circle) is assigned to *theCurve*, the behavior will be unpredictable. - -For compatibility with the existing code, OCCT 7.0 keeps this possibility by default, providing operators of type cast to the handle to a base type. However, this feature is unsafe and in specific situations it may cause compile-time or run-time errors as described above. - -To provide a safer behavior, this feature can be disabled by a compile-time macro *OCCT_HANDLE_NOCAST*. -When it is used, constructors and assignment operators are defined (instead of type cast operators) to convert handles to a derived type into handles to a base type. -This implies creation of temporary objects and hence may be more expensive at run time in some circumstances, however this way is more standard, safer, and in general recommended. - -The code that relies on the possibility of casting to base should be amended to always use the handle of argument type in function call and to use *DownCast()* to safely convert the result to the desired type. -For instance, the code from the example below can be changed as follows: - -~~~~~ -Handle(Geom_Line) aLine; -Handle(Geom_Curve) aCurve; -if (GetCurve (aCure) && !(aLine = Handle(Geom_Line)::DownCast (aCurve)).IsNull()) { - // use aLine safely -} -~~~~~ - -@subsubsection upgrade_occt700_cdl_compat Preserving compatibility with OCCT 6.x - -If you like to preserve the compatibility of your application code with OCCT versions 6.x even after the upgrade to 7.0, consider the following suggestions: - -1. If your code used sequences of macros *IMPLEMENT_STANDARD_*... generated by WOK, replace them by single macro *IMPLEMENT_STANDARD_RTTIEXT* - -2. When running automatic upgrade tool, add option -compat. - -3. Define macros *DEFINE_STANDARD_RTTIEXT* and *DEFINE_STANDARD_RTTI_INLINE* when building with previous versions of OCCT, resolving to *DEFINE_STANDARD_RTTI* with single argument - - Example: -~~~~~ -#if OCC_VERSION_HEX < 0x070000 - #define DEFINE_STANDARD_RTTIEXT(C1,C2) DEFINE_STANDARD_RTTI(C1) - #define DEFINE_STANDARD_RTTI_INLINE(C1,C2) DEFINE_STANDARD_RTTI(C1) -#endif -~~~~~ - -@subsubsection upgrade_occt700_cdl_wok Applications based on CDL and WOK - -If your application is essentially based on CDL, and you need to upgrade it to OCCT 7.0, you will very likely need to convert your application code to non-CDL form. -This is a non-trivial effort; the required actions would depend strongly on the structure of the code and used CDL features. - -The upgrade script and sources of a specialized WOK version used for OCCT code upgrade can be found in WOK Git repository in branch [CR0_700_2](https://git.dev.opencascade.org/gitweb/?p=occt-wok.git;a=log;h=refs/heads/CR0_700_2). - -[Contact us](https://www.opencascade.com/contact/) if you need more help. - -@subsection upgrade_occt700_bspline Separation of BSpline cache - -Implementation of NURBS curves and surfaces has been revised: the cache of polynomial coefficients, which is used to accelerate the calculation of values of a B-spline, has been separated from data objects *Geom2d_BSplineCurve, Geom_BSplineCurve* and *Geom_BSplineSurface* into the dedicated classes *BSplCLib_Cache* and *BSplSLib_Cache*. - -The benefits of this change are: -* Reduced memory footprint of OCCT shapes (up to 20% on some cases) -* Possibility to evaluate the same B-Spline concurrently in parallel threads without data races and mutex locks - -The drawback is that direct evaluation of B-Splines using methods of curves and surfaces becomes slower due to the absence of cache. The slow-down can be avoided by using adaptor classes *Geom2dAdaptor_Curve, GeomAdaptor_Curve* and *GeomAdaptor_Surface*, which now use cache when the curve or surface is a B-spline. - -OCCT algorithms have been changed to use adaptors for B-spline calculations instead of direct methods for curves and surfaces. -The same changes (use of adaptors instead of direct call to curve and surface methods) should be implemented in relevant places in the applications based on OCCT to get the maximum performance. - -@subsection upgrade_occt700_booleanresult Structural result of Boolean operations - -The result of Boolean operations became structured according to the structure of the input shapes. Therefore it may impact old applications that always iterate on direct children of the result compound assuming to obtain solids as iteration items, regardless of the structure of the input shapes. In order to get always solids as iteration items it is recommended to use TopExp_Explorer instead of TopoDS_Iterator. - -@subsection upgrade_occt700_brepextrema BRepExtrema_ExtCC finds one solution only - -Extrema computation between non-analytical curves in shape-shape distance calculation algorithm has been changed in order to return only one solution. So, if e.g. two edges are created on parallel b-spline curves the algorithm BRepExtrema_DistShapeShape will return only one solution instead of enormous number of solutions. There is no way to get algorithm working in old manner. - -@subsection upgrade_occt700_sorttools Removal of SortTools package - -Package *SortTools* has been removed. -The code that used the tools provided by that package should be corrected manually. -The recommended approach is to use sorting algorithms provided by STL. - -For instance: -~~~~~ -#include -#include -#include -... -TCollection_Array1OfReal aValues = ...; -... -TCollection_CompareOfReal aCompReal; -SortTools_StraightInsertionSortOfReal::Sort(aValues, aCompReal); -~~~~~ -can be replaced by: -~~~~~ -#include -... -TCollection_Array1OfReal aValues = ...; -... -std::stable_sort (aValues.begin(), aValues.end()); -~~~~~ - -@subsection upgrade_occt700_2dlayers On-screen objects and ColorScale - -The old mechanism for rendering Underlay and Overlay on-screen 2D objects based on *Visual3d_Layer* and immediate drawing model (uncached and thus slow) has been removed. -Classes *Aspect_Clayer2d, OpenGl_GraphicDriver_Layer, Visual3d_Layer, Visual3d_LayerItem, V3d_LayerMgr* and *V3d_LayerMgrPointer* have been deleted. -The following auxiliary definition have been removed as well: Aspect_TypeOfPrimitive, Aspect_TypeOfLayer, Aspect_TypeOfEdge, Aspect_TypeOfDrawMode, Aspect_TypeOfConstraint, Aspect_DriverDefinitionError, Aspect_BadAccess. - -General AIS interactive objects with transformation persistence flag *Graphic3d_TMF_2d* can be used as a replacement of *Visual3d_LayerItem*. -The anchor point specified for transformation persistence defines the window corner of (or center in case of (0, 0) point). -To keep on-screen 2D objects on top of the main screen, they can be assigned to the appropriate Z-layer. -Predefined Z-layers *Graphic3d_ZLayerId_TopOSD* and *Graphic3d_ZLayerId_BotOSD* are intended to replace Underlay and Overlay layers within the old API. - -*ColorScale* object previously implemented using *Visual3d_LayerItem* has been moved to a new class *AIS_ColorScale*, with width and height specified explicitly. -The property of *V3d_View* storing the global *ColorScale* object has been removed with associated methods *V3d_View::ColorScaleDisplay(), V3d_View::ColorScaleErase(), V3d_View::ColorScaleIsDisplayed()* and *V3d_View::ColorScale()* as well as the classes *V3d_ColorScale, V3d_ColorScaleLayerItem* and *Aspect_ColorScale*. -Here is an example of creating *ColorScale* using the updated API: - -~~~~~ -Handle(AIS_ColorScale) aCS = new AIS_ColorScale(); -// configuring -Standard_Integer aWidth, aHeight; -aView->Window()->Size (aWidth, aHeight); -aCS->SetSize (aWidth, aHeight); -aCS->SetRange (0.0, 10.0); -aCS->SetNumberOfIntervals (10); -// displaying -aCS->SetZLayer (Graphic3d_ZLayerId_TopOSD); -aCS->SetTransformPersistence (Graphic3d_TMF_2d, gp_Pnt (-1,-1,0)); -aCS->SetToUpdate(); -theContextAIS->Display (aCS); -~~~~~ - -To see how 2d objects are implemented in OCCT you can call Draw commands *vcolorscale, vlayerline* or *vdrawtext* (with -2d option). -Draw command *vcolorscale* now requires the name of *ColorScale* object as argument. -To display this object use command *vdisplay*. For example: - -~~~~~ -pload VISUALIZATION -vinit -vcolorscale cs -demo -pload MODELING -box b 100 100 100 -vdisplay b -vsetdispmode 1 -vfit -vlayerline 0 300 300 300 10 -vdrawtext t "2D-TEXT" -2d -pos 0 150 0 -color red -~~~~~ - -Here is a small example in C++ illustrating how to display a custom AIS object in 2d: -~~~~~ -Handle(AIS_InteractiveContext) aContext = ...; -Handle(AIS_InteractiveObject) anObj =...; // create an AIS object -anObj->SetZLayer(Graphic3d_ZLayerId_TopOSD); // display object in overlay -anObj->SetTransformPersistence (Graphic3d_TMF_2d, gp_Pnt (-1,-1,0)); // set 2d flag, coordinate origin is set to down-left corner -aContext->Display (anObj); // display the object -~~~~~ - -@subsection upgrade_occt700_userdraw UserDraw and Visual3d - -#### Visual3d package - -Package *Visual3d* implementing the intermediate layer between high-level *V3d* classes -and low-level OpenGl classes for views and graphic structures management has been dropped. - -The *OpenGl_View* inherits from the new class *Graphic3d_CView*. -*Graphic3d_CView* is an interface class that declares abstract methods for managing displayed structures, -display properties and a base layer code that implements computation -and management of HLR (or more broadly speaking view-depended) structures. - -In the new implementation it takes place of the eliminated *Visual3d_View*. -As before the instance of *Graphic3d_CView* is still completely managed by *V3d_View* classes. -It can be accessed through *V3d_View* interface but normally it should not be required as all its methods are completely wrapped. - -In more details, a concrete specialization of *Graphic3d_CView* is created and returned by the graphical driver on request. -Right after the creation the views are directly used for setting rendering properties and adding graphical structures to be displayed. - -The rendering of graphics is possible after mapping a window and activating the view. -The direct setting of properties obsoletes the use of intermediate structures with display parameter -like *Visual3d_ContextView*, etc. This means that the whole package *Visual3d* becomes redundant. - -The functionality previously provided by *Visual3d* package has been redesigned in the following way : -- The management of display of structures has been moved from *Visual3d_ViewManager* into *Graphic3d_StructureManager*. -- The class *Visual3d_View* has been removed. The management of computed structures has been moved into the base layer of *Graphi3d_CView*. -- All intermediate structures for storing view parameters, e.g. *Visual3d_ContextView*, have been removed. - The settings are now kept by instances of *Graphic3d_CView*. -- The intermediate class *Visual3d_Light* has been removed. All light properties are stored in *Graphic3d_CLight* structure, which is directly accessed by instances of *V3d_Light* classes. -- All necessary enumerations have been moved into *Graphic3d* package. - -#### Custom OpenGL rendering and UserDraw - -Old APIs based on global callback functions for creating *UserDraw* objects and for performing custom OpenGL rendering within the view have been dropped. -*UserDraw* callbacks are no more required since *OpenGl_Group* now inherits *Graphic3d_Group* and thus can be accessed directly from *AIS_InteractiveObject*: - -~~~~~ -//! Class implementing custom OpenGL element. -class UserDrawElement : public OpenGl_Element {}; - -//! Implementation of virtual method AIS_InteractiveObject::Compute(). -void UserDrawObject::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, - const Handle(Prs3d_Presentation)& thePrs, - const Standard_Integer theMode) -{ - Graphic3d_Vec4 aBndMin (myCoords[0], myCoords[1], myCoords[2], 1.0f); - Graphic3d_Vec4 aBndMax (myCoords[3], myCoords[4], myCoords[5], 1.0f); - - // casting to OpenGl_Group should be always true as far as application uses OpenGl_GraphicDriver for rendering - Handle(OpenGl_Group) aGroup = Handle(OpenGl_Group)::DownCast (thePrs->NewGroup()); - aGroup->SetMinMaxValues (aBndMin.x(), aBndMin.y(), aBndMin.z(), - aBndMax.x(), aBndMax.y(), aBndMax.z()); - UserDrawElement* anElem = new UserDrawElement (this); - aGroup->AddElement(anElem); - - // invalidate bounding box of the scene - thePrsMgr->StructureManager()->Update(); -} -~~~~~ - -To perform a custom OpenGL code within the view, it is necessary to inherit from class *OpenGl_View*. -See the following code sample: - -~~~~~ -//! Custom view. -class UserView : public OpenGl_View -{ -public: - //! Override rendering into the view. - virtual void render (Graphic3d_Camera::Projection theProjection, - OpenGl_FrameBuffer* theReadDrawFbo, - const Standard_Boolean theToDrawImmediate) - { - OpenGl_View::render (theProjection, theReadDrawFbo, theToDrawImmediate); - if (theToDrawImmediate) - { - return; - } - - // perform custom drawing - const Handle(OpenGl_Context)& aCtx = myWorkspace->GetGlContext(); - GLfloat aVerts[3] = { 0.0f, 0,0f, 0,0f }; - aCtx->core20->glEnableClientState(GL_VERTEX_ARRAY); - aCtx->core20->glVertexPointer(3, GL_FLOAT, 0, aVerts); - aCtx->core20->glDrawArrays(GL_POINTS, 0, 1); - aCtx->core20->glDisableClientState(GL_VERTEX_ARRAY); - } - -}; - -//! Custom driver for creating UserView. -class UserDriver : public OpenGl_GraphicDriver -{ -public: - //! Create instance of own view. - virtual Handle(Graphic3d_CView) CreateView (const Handle(Graphic3d_StructureManager)& theMgr) Standard_OVERRIDE - { - Handle(UserView) aView = new UserView (theMgr, this, myCaps, myDeviceLostFlag, &myStateCounter); - myMapOfView.Add (aView); - for (TColStd_SequenceOfInteger::Iterator aLayerIt (myLayerSeq); aLayerIt.More(); aLayerIt.Next()) - { - const Graphic3d_ZLayerId aLayerID = aLayerIt.Value(); - const Graphic3d_ZLayerSettings& aSettings = myMapOfZLayerSettings.Find (aLayerID); - aView->AddZLayer (aLayerID); - aView->SetZLayerSettings (aLayerID, aSettings); - } - return aView; - } -}; - -~~~~~ - -@subsection upgrade_occt700_localcontext Deprecation of Local Context - -The conception of Local Context has been deprecated. -The related classes, e.g. *AIS_LocalContext*, and methods ( AIS_InteractiveContext::OpenLocalContext() and others) will be removed in a future OCCT release. - -The main functionality provided by Local Context - selection of object subparts - can be now used within Neutral Point without opening any Local Context. - -The property *SelectionMode()* has been removed from the class *AIS_InteractiveObject*. -This property contradicts to selection logic, since it is allowed to activate several Selection modes at once. -Therefore keeping one selection mode as object field makes no sense. -Applications that used this method should implement selection mode caching at application level, if it is necessary for some reason. - -@subsection upgrade_occt700_separate_caf_visualisation Separation of visualization part from TKCAF - -Visualization CAF attributes have been moved into a new toolkit *TKVCAF*. -If your application uses the classes from *TPrsStd* package then add link to *TKVCAF* library. - -Version numbers of *BinOCAF* and *XmlOCAF* formats are incremented; new files cannot be read by earlier versions of OCCT. - -Before loading the OCAF files saved by previous versions and containing *TPrsStd_AISPresentation* attribute it is necessary to define the environment variable *CSF_MIGRATION_TYPES*, pointing to file *src/StdResources/MigrationSheet.txt*. -When using documents loaded from a file, make sure to call method *TPrsStd_AISViewer::New()* prior to accessing *TPrsStd_AISPresentation* attributes in this document as that method creates them. - -@subsection upgrade_euler_angles Correction of interpretation of Euler angles in gp_Quaternion - -Conversion of *gp_Quaternion* to and from intrinsic Tait-Bryan angles (including *gp_YawPitchRoll*) is fixed. - -Before that fix the sequence of rotation axes was opposite to the intended; e.g. *gp_YawPitchRoll* (equivalent to *gp_Intrinsic_ZYX*) actually defined intrinsic rotations around X, then Y, then Z. Now the rotations are made in the correct order. - -The applications that use *gp_Quaternion* to convert Yaw-Pitch-Roll angles (or other intrinsic Tait-Bryan sequences) may need to be updated to take this change into account. - -@subsection upgrade_zoom_persistent_selection Zoom Persistent Selection - -Zoom persistent selection introduces a new structure *Graphic3d_TransformPers* to transform persistence methods and parameters and a new class *Graphic3d_WorldViewProjState* to refer to the camera transformation state. You might need to update your code to deal with the new classes if you were using the related features. Keep in mind the following: -* *Graphic3d_Camera::ModelViewState* has been renamed to *Graphic3d_Camera::WorldViewState*. -* Transformation matrix utilities from *OpenGl_Utils* namespace have been moved to *Graphic3d_TransformUtils* and *Graphic3d_TransformUtils.hxx* header respectively. -* Matrix stack utilities from *OpenGl_Utils* namespace have been moved to *OpenGl_MatrixStack* class and *OpenGl_MatrixStack.hxx* header respectively. -* *OpenGl_View* methods *Begin/EndTransformPersistence* have been removed. Use *Graphic3d_TransformPers::Apply()* instead to apply persistence to perspective and world-view projection matrices. - -@subsection upgrade_occt700_correction_of_texture Texture mapping of objects - -Textured objects now have the priority over the environment mapping. - -Redundant enumerations *V3d_TypeOfSurface* and *Graphic3d_TypeOfSurface*, class *OpenGl_SurfaceDetailState*, the corresponding methods from *Graphic3d_CView, OpenGl_ShaderManager, OpenGl_View, V3d_View* and *V3d_Viewer* have been deleted. -Draw command *VSetTextureMode* has been deleted. - -@subsection upgrade_occt700_wfshape Shape presentation builders - -Presentation tools for building Wireframe presentation have been refactored to eliminate duplicated code and interfaces. -Therefore, the following classes have been modified: -* *StdPrs_WFDeflectionShape* and *Prs3d_WFShape* have been removed. *StdPrs_WFShape* should be used instead. -* *StdPrs_ToolShadedShape* has been renamed to *StdPrs_ToolTriangulatedShape*. - -@section upgrade_occt710 Upgrade to OCCT 7.1.0 - -@subsection upgrade_710_aspects Presentation attributes - -This section should be considered if application defines custom presentations, i.e. inherited from *AIS_InteractiveObject*. -The previous versions of OCCT have three levels for defining presentation properties (e.g. colors, materials, etc.): - -1. For the entire structure - *Graphic3d_Structure* / *Prs3d_Presentation*. -2. For a specific group of primitives - *Graphic3d_Group::SetGroupPrimitivesAspect()* overriding structure aspects. -3. For a specific primitive array within the graphic group - *Graphic3d_Group::SetPrimitivesAspect()*. - -The structure level has de facto not been used for a long time since OCCT presentations always define aspects at the graphic group level (overriding any structure aspects). -Within this OCCT release, structure level of aspects has been completely removed. In most cases the application code should just remove missing methods. In those rare cases, when this functionality was intentionally used, the application should explicitly define aspects to the appropriate graphic groups. - -Note that defining several different aspects within the same graphic group should also be avoided in the application code since it is a deprecated functionality which can be removed in further releases. -*Graphic3d_Group::SetGroupPrimitivesAspect()* should be the main method defining presentation attributes. - -The implementation of *Graphic3d_Group::SetGroupPrimitivesAspect()* has been changed from copying aspect values to keeping the passed object. -Although it was not documented, previously it was possible to modify a single aspect instance, like *Graphic3d_AspectFillArea3d* and set it to multiple groups. -Now such code would produce an unexpected result and therefore should be updated to create the dedicated aspect instance. - -@subsection upgrade_710_types Typedefs - -The following type definitions in OCCT has been modified to use C++11 types: -- *Standard_Boolean* is now *bool* (previously *unsigned int*). -- *Standard_ExtCharacter* is now *char16_t* (previously *short*). -- *Standard_ExtString;* is now *const char16_t* (previously *const short*). -- *Standard_Utf16Char* is now *char16_t* (previously *uint16_t* for compatibility with old compilers). -- *Standard_Utf32Char* is now *char32_t* (previously *uint32_t* for compatibility with old compilers). - -For most applications this change should be transparent on the level of source code. Binary compatibility is not maintained, as *bool* has a different size in comparison with *unsigned int*. - -@subsection upgrade_710_ffp Programmable Pipeline - -Fixed-function pipeline has been already deprecated since OCCT 7.0.0. -Release 7.1.0 disables this functionality by default in favor of Programmable Pipeline (based on GLSL programs). - -Method *V3d_View::Export()*, based on *gl2ps* library, requires fixed pipeline and will return error if used with default settings. -Applications should explicitly enable fixed pipeline by setting *OpenGl_Caps::ffpEnable* flag to TRUE within *OpenGl_GraphicDriver::ChangeOptions()* before creating the viewer to use *V3d_View::Export()*. -This method is declared as deprecated and will be removed in one of the the next OCCT releases. -The recommended way to generate a vector image of a 3D model or scene is to use an application-level solution independent from OpenGL. - -@subsection upgrade_710_trsfpers Transformation persistence - -The behavior of transformation persistence flags *Graphic3d_TMF_ZoomPers* and *Graphic3d_TMF_TriedronPers* has been changed for consistency with a textured fixed-size 2D text. -An object with these flags is considered as defined in pixel units, and the presentation is no more scaled depending on the view height. -The applications that need to scale such objects depending on viewport size should update them manually. - -Flags *Graphic3d_TMF_PanPers* and *Graphic3d_TMF_FullPers* have been removed. -*Graphic3d_TMF_TriedronPers* or *Graphic3d_TMF_2d* can be used instead depending on the context. - -*Graphic3d_TransModeFlags* is not an integer bitmask anymore - enumeration values should be specified instead. -Several transformation persistence methods in *PrsMgr_PresentableObject* have been marked deprecated. -Transformation persistence should be defined using *Graphic3d_TransformPers* constructor directly and passed by a handle, not value. - -@subsection upgrade_710_selprops Dynamic highlight and selection properties - -Release 7.1.0 introduces *Graphic3d_HighlightStyle* - an entity that allows flexible customization of highlighting parameters (such as highlighting method, color, and transparency). Therefore, the signatures of the following methods related to highlighting: -- *AIS_InteractiveContext::Hilight()*; -- *AIS_InteractiveContext::HilightWithColor()*; -- *PrsMgr_PresentationManager::Color()*; -- *SelectMgr_EntityOwner::HilightWithColor()*; -have been changed to receive *Graphic3d_HighlightStyle* instead of *Quantity_Color*. - -Method *AIS_InteractiveContext::Hilight* is now deprecated and highlights the interactive object with selection style. - -A group of methods *AIS_InteractiveContext::IsHilighted* has changed its behavior - now they only check highlight flags of the object or the owner in the global status. If the highlight color is required on the application level, it is necessary to use overloaded methods *AIS_InteractiveContext::HighlightStyle* for the owner and the object. - -The following methods have been replaced in *AIS_InteractiveContext* class: -- *HilightColor* and *SetHilightColor* by *HighlightStyle* and *SetHighlightStyle*; -- *SelectionColor* setter and getter by *SelectionStyle* and *SetSelectionStyle*. - -The API of *Prs3d_Drawer* has been extended to allow setting up styles for both dynamic selection and highlighting. Therefore, it is possible to change the highlight style of a particular object on the application level via *SelectMgr_SelectableObject::HilightAttributes()* and process it in the entity owner. - -@subsection upgrade_occt710_correction_of_TObj_Model Correction in TObj_Model class - -Methods *TObj_Model::SaveAs* and *TObj_Model::Load* now receive *TCollection_ExtendedString* filename arguments instead of char*. UTF-16 encoding can be used to pass file names containing Unicode symbols. - -@subsection upgrade_710_env Redundant environment variables - -The following environment variables have become redundant: - -* *CSF_UnitsLexicon* and *CSF_UnitsDefinition* are no more used. Units definition (*UnitsAPI/Lexi_Expr.dat* and *UnitsAPI/Units.dat*) is now embedded into source code. -* *CSF_XSMessage* and *CSF_XHMessage* are now optional. - English messages (XSMessage/\*XSTEP.us* and SHMessage/\*SHAPE.us*) are now embedded into source code - and automatically loaded when environment variables are not set. -* *CSF_ShadersDirectory* is not required any more, though it still can be used to load custom shaders. - Mandatory GLSL resources are now embedded into source code. -* *CSF_PluginDefaults* and other variables pointing to OCAF plugin resources (*CSF_StandardDefaults*, *CSF_XCAFDefaults*, *CSF_StandardLiteDefaults* and *CSF_XmlOcafResource*) are not necessary if method *TDocStd_Application::DefineFormat()* is used to enable persistence of OCAF documents. - -Other environment variables still can be used to customize behavior of relevant algorithms but are not necessary any more (all required resources are embedded). - -@subsection upgrade_710_removed Removed features - -The following obsolete features have been removed: -* Anti-aliasing API *V3d_View::SetAntialiasingOn()*. This method was intended to activate deprecated OpenGL functionality *GL_POLYGON_SMOOTH, GL_LINE_SMOOTH* and *GL_POINT_SMOOTH*. - Instead of the old API, the application should request MSAA buffers for anti-aliasing by assigning *Graphic3d_RenderingParams::NbMsaaSamples* property of the structure returned by *V3d_View::ChangeRenderingParams()*. -* *Prs3d_Drawer::ShadingAspectGlobal()* flag has been removed as not used. The corresponding calls can be removed safely from the application code. -* The methods managing ZClipping planes and ZCueing: *V3d_View::SetZClippingType()*, *V3d_View::SetZCueingOn()*, etc. have been removed. ZClipping planes can be replaced by general-purpose clipping planes (the application should update plane definition manually). -* The 3D viewer printing API *V3d_View::Print()* has been removed. This functionality was available on Windows platforms only. The applications should use the general image dump API *V3d_View::ToPixMap()* and manage printing using a platform-specific API at the application level. - Text resolution can be managed by rendering parameter *Graphic3d_RenderingParams::Resolution*, returned by *V3d_View::ChangeRenderingParams()*. -* Methods *PrsMgr_PresentationManager::BoundBox*, *PrsMgr_PresentationManager::Hilight* and *SelectMgr_EntityOwner::Hilight* have been removed as not used. The corresponding method in custom implementations of *SelectMgr_EntityOwner* can be removed safely. *PrsMgr_PresentationManager::Color* with the corresponding style must be used instead. -* Class *NCollection_QuickSort* has been removed. The code that used the tools provided by that class should be corrected manually. The recommended approach is to use sorting algorithms provided by STL (std::sort). See also @ref upgrade_occt700_sorttools above. - -* Package *Dico*. The code that used the tools provided by that package should be corrected manually. The recommended approach is to use *NCollection_DataMap* and *NCollection_IndexedDataMap* classes. - -@subsection upgrade_710_changed_methods Other changes - -The following classes have been changed: - -* *BVH_Sorter* class has become abstract. The list of arguments of both *Perform* methods has been changed and the methods became pure virtual. -* *Extrema_FuncExtPS* has been renamed to *Extrema_FuncPSNorm*. -* The default constructor and the constructor taking a point and a surface have been removed from class *Extrema_GenLocateExtPS*. Now the only constructor takes the surface and optional tolerances in U and V directions. The new method *Perform* takes the point with the start solution and processes it. The class has become not assignable and not copy-constructable. -* Constructors with arguments *(const gp_Ax22d& D, const gp_Pnt2d& F)* have been removed from *GCE2d_MakeParabola*, *gce_MakeParab2d* and *gp_Parab2d*. The objects created with some constructors of class *gp_Parab2d* may differ from the previous version (see the comments in *gp_Parab2d.hxx*). The result returned by *gp_Parab2d::Directrix()* method has an opposite direction in comparison with the previous OCCT versions. -* *BRepTools_Modifier* class now has two modes of work. They are defined by the boolean parameter *MutableInput*, which is turned off by default. This means that the algorithm always makes a copy of a sub-shape (e.g. vertex) if its tolerance is to be increased in the output shape. The old mode corresponds to *MutableInput* turned on. This change may impact an application if it implements a class derived from *BRepTools_Modifier*. -* The second parameter *theIsOuterWire* of method *ShapeAnalysis_Wire::CheckSmallArea* has been removed. -* In class *GeomPlate_CurveConstraint*, two constructors taking boundary curves of different types have been replaced with one constructor taking the curve of an abstract type. -* The last optional argument *RemoveInvalidFaces* has been removed from the constructor of class *BRepOffset_MakeOffset* and method *Initialize*. -* The public method *BOPDS_DS::VerticesOnIn* has been renamed into *SubShapesOnIn* and the new output parameter *theCommonPB* has been added. - -@section upgrade_occt720 Upgrade to OCCT 7.2.0 - -@subsection upgrade_720_removed Removed features - -The following obsolete features have been removed: -* *AIS_InteractiveContext::PreSelectionColor()*, *DefaultColor()*, *WasCurrentTouched()*, *ZDetection()*. - These properties were unused, and therefore application should remove occurrences of these methods. -* *AIS_InteractiveObject::SelectionPriority()*. - These property was not implemented. -* The class *LocOpe_HBuilder* has been removed as obsolete. -* The package *TestTopOpe* has been removed; -* The package *TestTopOpeDraw* has been removed; -* The package *TestTopOpeTools* has been removed. -* The packages *QANewModTopOpe*, *QANewBRepNaming* and *QANewDBRepNaming* have been removed as containing obsolete features. -* The following methods of the *IntPolyh_Triangle* class have been removed as unused: - - *CheckCommonEdge* - - *SetEdgeandOrientation* - - *MultipleMiddleRefinement2*. -* The method *IntPolyh_Triangle::TriangleDeflection* has been renamed to *IntPolyh_Triangle::ComputeDeflection*. -* The following methods of the *IntPolyh_MaillageAffinage* class have been removed as unused: - - *LinkEdges2Triangles*; - - *TriangleEdgeContact2*; - - *StartingPointsResearch2*; - - *NextStartingPointsResearch2*; - - *TriangleComparePSP*; - - *StartPointsCalcul*. -* The method PerformAdvanced of the *ShapeConstruct_ProjectCurveOnSurface* class has been removed as unused. -* The method Perform of the *ShapeConstruct_ProjectCurveOnSurface* class is modified: - - input arguments *continuity*, *maxdeg*, *nbinterval* have been removed as unused; - - input arguments *TolFirst*, *TolLast* have been added at the end of arguments' list. -* Typedefs Quantity_Factor, Quantity_Parameter, Quantity_Ratio, Quantity_Coefficient, Quantity_PlaneAngle, Quantity_Length, V3d_Parameter and V3d_Coordinate have been removed; Standard_Real should be used instead. - -@subsection upgrade_occt720_reshape_oriented_removed Corrections in BRepOffset API - -In classes *BRepTools_ReShape* and *ShapeBuild_ReShape*, the possibility to process shapes different only by orientation in different ways has been removed. -Thus methods *Remove()* and *Replace()* do not have any more the last argument 'oriented'; they work always as if *Standard_False* was passed before (default behavior). -Methods *ModeConsiderLo()* and *Apply()* with three arguments have been removed. - -@subsection upgrade_occt720_correction_of_Offset_API Corrections in BRepOffset API - -Class *BRepOffsetAPI_MakeOffsetShape*: -* *BRepOffsetAPI_MakeOffsetShape::BRepOffsetAPI_MakeOffsetShape()* - constructor with parameters has been deleted. -* *BRepOffsetAPI_MakeOffsetShape::PerformByJoin()* - method has been added. This method is old algorithm behaviour. - -The code below shows new calling procedure: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} - BRepOffsetAPI_MakeOffsetShape OffsetMaker; - OffsetMaker.PerformByJoin(Shape, OffsetValue, Tolerance); - NewShape = OffsetMaker.Shape(); -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Class *BRepOffsetAPI_MakeThickSolid*: -* *BRepOffsetAPI_MakeThickSolid::BRepOffsetAPI_MakeThickSolid()* - constructor with parameters has been deleted. -* *BRepOffsetAPI_MakeThickSolid::MakeThickSolidByJoin()* - method has been added. This method is old algorithm behaviour. - -The code below shows new calling procedure: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} - BRepOffsetAPI_MakeThickSolid BodyMaker; - BodyMaker.MakeThickSolidByJoin(myBody, facesToRemove, -myThickness / 50, 1.e-3); - myBody = BodyMaker.Shape(); -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -@subsection upgrade_720_highlight Highlight style - -Management of highlight attributes has been revised and might require modifications from application side: -* New class *Graphic3d_PresentationAttributes* defining basic presentation attributes has been introduced. - It's definition includes properties previously defined by class Graphic3d_HighlightStyle (*Color*, *Transparency*), - and new properties (*Display mode*, *ZLayer*, optional *FillArea aspect*). -* Class *Prs3d_Drawer* now inherits class *Graphic3d_PresentationAttributes*. - So that overall presentation attributes are now split into two parts - Basic attributes and Detailed attributes. -* Class *Graphic3d_HighlightStyle* has been dropped. - It is now defined as a typedef to *Prs3d_Drawer*. - Therefore, highlight style now also includes not only Basic presentation attributes, but also Detailed attributes - which can be used by custom presentation builders. -* Highlighting style defined by class *Graphic3d_PresentationAttributes* now provides more options: - - *Graphic3d_PresentationAttributes::BasicFillAreaAspect()* property providing complete Material definition. - This option, when defined, can be used instead of the pair Object Material + Highlight Color. - - *Graphic3d_PresentationAttributes::ZLayer()* property specifying the Layer where highlighted presentation should be shown. - This property can be set to Graphic3d_ZLayerId_UNKNOWN, which means that ZLayer of main presentation should be used instead. - - *Graphic3d_PresentationAttributes::DisplayMode()* property specifying Display Mode for highlight presentation. -* Since Highlight and Selection styles within *AIS_InteractiveContext* are now defined by *Prs3d_Drawer* inheriting from *Graphic3d_PresentationAttributes*, - it is now possible to customize default highlight attributes like *Display Mode* and *ZLayer*, which previously could be defined only on Object level. -* Properties *Prs3d_Drawer::HighlightStyle()* and *Prs3d_Drawer::SelectionStyle()* have been removed. - Instead, *AIS_InteractiveObject* now defines *DynamicHilightAttributes()* for dynamic highlighting in addition to *HilightAttributes()* used for highlighting in selected state. - Note that *AIS_InteractiveObject::HilightAttributes()* and *AIS_InteractiveObject::DynamicHilightAttributes()* override highlighting properties for both - entire object and for part coming from decomposition. - This includes Z-layer settings, which will be the same when overriding properties through AIS_InteractiveObject, while *AIS_InteractiveContext::HighlightStyle()* allows customizing properties for local and global selection independently - (with Graphic3d_ZLayerId_Top used for dynamic highlighting of entire object and Graphic3d_ZLayerId_Topmost for dynamic highlighting of object part by default). -* The following protected fields have been removed from class *AIS_InteractiveObject*: - - *myOwnColor*, replaced by *myDrawer->Color()* - - *myTransparency*, replaced by *myDrawer->Transparency()* - - *myZLayer*, replaced by *myDrawer->ZLayer()* -* The method *PrsMgr_PresentationManager::Unhighlight()* taking Display Mode as an argument has been marked deprecated. - Implementation now performs unhighlighting of all highlighted presentation mode. -* The methods taking/returning *Quantity_NameOfColor* (predefined list of colors) and duplicating methods operating with *Quantity_Color* (definition of arbitrary RGB color) in AIS have been removed. - *Quantity_Color* should be now used instead. - -@subsection upgrade_720_implicit_viewer_update Elimination of implicit 3D Viewer updates - -Most AIS_InteractiveContext methods are defined with a flag to update viewer immediatly or not. -Within previous version of OCCT, this argument had default value TRUE. -While immediate viewer updates are useful for beginners (the result is displayed as soon as possible), -this approach is inefficent for batch viewer updates, and having default value as TRUE -leaded to non-intended accidential updates which are difficult to find. - -To avoid such issues, the interface has been modified and default value has been removed. -Therefore, old application code should be updated to set the flag theToUpdateViewer explicitly -to desired value (TRUE to preserve old previous behavior), if it was not already set. - -The following AIS_InteractiveContext methods have been changed: - Display, Erase, EraseAll, DisplayAll, EraseSelected, DisplaySelected, ClearPrs, Remove, RemoveAll, Hilight, - HilightWithColor, Unhilight, Redisplay, RecomputePrsOnly, Update, SetDisplayMode, UnsetDisplayMode, SetColor, - UnsetColor, SetWidth, UnsetWidth, SetMaterial, UnsetMaterial, SetTransparency, UnsetTransparency, - SetLocalAttributes, UnsetLocalAttributes, SetPolygonOffsets, SetTrihedronSize, SetPlaneSize, SetPlaneSize, - SetDeviationCoefficient, SetDeviationAngle, SetAngleAndDeviation, SetHLRDeviationCoefficient, - SetHLRDeviationAngle, SetHLRAngleAndDeviation, SetSelectedAspect, MoveTo, Select, ShiftSelect, SetSelected, - UpdateSelected, AddOrRemoveSelected, HilightSelected, UnhilightSelected, ClearSelected, ResetOriginalState, - SubIntensityOn, SubIntensityOff, FitSelected, EraseGlobal, ClearGlobal, ClearGlobalPrs. - -In addition, the API for immediate viewer update has been removed from V3d_View and Graphic3d_StructureManager classes -(enumerations *Aspect_TypeOfUpdate* and *V3d_TypeOfUpdate*): - V3d::SetUpdateMode(), V3d::UpdateMode(), Graphic3d_StructureManager::SetUpdateMode(), Graphic3d_StructureManager::UpdateMode(). - -The argument theUpdateMode has been removed from methods Graphic3d_CView::Display(), Erase(), Update(). -Method Graphic3d_CView::Update() does not redraw the view and does not re-compute structures anymore. - -The following Grid management methods within class V3d_Viewer do not implicitly redraw the viewer: - ActivateGrid, DeactivateGrid, SetRectangularGridValues, SetCircularGridValues, - RectangularGridGraphicValues, CircularGridGraphicValues, SetPrivilegedPlane, DisplayPrivilegedPlane. - -@subsection upgrade_720_v3d_colorname Elimination of Quantity_NameOfColor from TKV3d interface classes - -The duplicating interface methods accepting *Quantity_NameOfColor* (in addition to methods accepting *Quantity_Color*) of TKV3d toolkit have been removed. -In most cases this change should be transparent, however applications implementing such interface methods should also remove them -(compiler will automatically highlight this issue for methods marked with Standard_OVERRIDE keyword). - -@subsection upgrade_720_Result_Of_BOP_On_Containers Result of Boolean operations on containers - -* The result of Boolean operations on arguments of collection types (WIRE/SHELL/COMPSOLID) is now filtered from duplicating containers. - -@subsection upgrade_720_changes_methods Other changes - -* *MMgt_TShared* class definition has been removed - Standard_Transient should be used instead (MMgt_TShared is marked as deprecated typedef of Standard_Transient for smooth migration). -* Class GeomPlate_BuildPlateSurface accepts base class Adaptor3d_HCurve (instead of inherited Adaptor3d_HCurveOnSurface accepted earlier). -* Types GeomPlate_Array1OfHCurveOnSurface and GeomPlate_HArray1OfHCurveOnSurface have been replaced with GeomPlate_Array1OfHCurve and GeomPlate_HArray1OfHCurve correspondingly (accept base class Adaptor3d_HCurve instead of Adaptor3d_HCurveOnSurface). -* Enumeration *Image_PixMap::ImgFormat*, previously declared as nested enumeration within class *Image_PixMap*, has been moved to global namespace as *Image_Format* following OCCT coding rules. - The enumeration values have suffix Image_Format_ and preserve previous name scheme for easy renaming of old values - e.g. Image_PixMap::ImgGray become Image_Format_Gray. - Old definitions are preserved as depreacated aliases to the new ones; -* Methods *Image_PixMap::PixelColor()* and *Image_PixMap::SetPixelColor()* now take/return Quantity_ColorRGBA instead of Quantity_Color/NCollection_Vec4. -* The method BOPAlgo_Builder::Origins() returns BOPCol_DataMapOfShapeListOfShape instead of BOPCol_DataMapOfShapeShape. -* The methods BOPDS_DS::IsToSort(const Handle(BOPDS_CommonBlock)&, Standard_Integer&) and BOPDS_DS::SortPaveBlocks(const Handle(BOPDS_CommonBlock)&) have been removed. The sorting is now performed during the addition of the Pave Blocks into Common Block. -* The methods BOPAlgo_Tools::MakeBlocks() and BOPAlgo_Tools::MakeBlocksCnx() have been replaced with the single template method BOPAlgo_Tools::MakeBlocks(). The chains of connected elements are now stored into the list of list instead of data map. -* The methods BOPAlgo_Tools::FillMap() have been replaced with the single template method BOPAlgo_Tools::FillMap(). -* Package BVH now uses opencascade::handle instead of NCollection_Handle (for classes BVH_Properties, BVH_Builder, BVH_Tree, BVH_Object). - Application code using BVH package directly should be updated accordingly. -* AIS_Shape now computes UV texture coordinates for AIS_Shaded presentation in case if texture mapping is enabled within Shaded Attributes. - Therefore, redundant class *AIS_TexturedShape is now deprecated* - applications can use *AIS_Shape* directly (texture mapping should be defined through AIS_Shape::Attributes()). -* Methods for managing active texture within OpenGl_Workspace class (ActiveTexture(), DisableTexture(), EnableTexture()) have been moved to *OpenGl_Context::BindTextures()*. - -@subsection upgrade_720_BOP_DataStructure BOP - Pairs of interfering indices - -* The classes *BOPDS_PassKey* and *BOPDS_PassKeyBoolean* are too excessive and not used any more in Boolean Operations. To replace them the new *BOPDS_Pair* class has been implemented. Thus: - - The method *BOPDS_DS::Interferences()* now returns the *BOPDS_MapOfPair*; - - The method *BOPDS_Iterator::Value()* takes now only two parameters - the indices of interfering sub-shapes. - -@subsection upgrade_720_Removal_Of_Old_Boolean_Operations_Draw Removal of the Draw commands based on old Boolean operations - -* The commands *fubl* and *cubl* have been removed. The alternative for these commands are the commands *bfuseblend* and *bcutblend* respectively. -* The command *ksection* has been removed. The alternative for this command is the command *bsection*. - -@subsection upgrade_720_Change_Of_FaceFace_Intersection Change of Face/Face intersection in Boolean operations - -* Previously, the intersection tolerance for all section curves between pair of faces has been calculated as the maximal tolerance among all curves. - Now, each curve has its own valid tolerance calculated as the maximal deviation of the 3D curve from its 2D curves or surfaces in case there are no 2D curves. -* The methods *IntTools_FaceFace::TolReached3d()*, *IntTools_FaceFace::TolReal()* and *IntTools_FaceFace::TolReached2d()* have been removed. -* Intersection tolerances of the curve can be obtained from the curve itself: - - *IntTools_Curve::Tolerance()* - returns the valid tolerance for the curve; - - *IntTools_Curve::TangentialTolerance()* - returns the tangential tolerance, which reflects the size of the common between faces. -* 2d tolerance (*IntTools_FaceFace::TolReached2d()*) has been completely removed from the algorithm as unused. - - -@subsection upgrade_720_persistence Restore OCCT 6.9.1 persistence - -The capability of reading / writing files in old format using *Storage_ShapeSchema* functionality from OCCT 6.9.1 has been restored in OCCT 7.2.0. - -One can use this functionality in two ways: -- invoke DRAW Test Harness commands *fsdread / fsdwrite* for shapes; -- call *StdStorage* class *Read / Write* functions in custom code. - -The code example below demonstrates how to read shapes from a storage driver using *StdStorage* class. - -~~~~ -// aDriver should be created and opened for reading -Handle(StdStorage_Data) aData; - -// Read data from the driver -// StdStorage::Read creates aData instance automatically if it is null -Storage_Error anError = StdStorage::Read(*aDriver, aData); -if (anError != Storage_VSOk) -{ - // Error processing -} - -// Get root objects -Handle(StdStorage_RootData) aRootData = aData->RootData(); -Handle(StdStorage_HSequenceOfRoots) aRoots = aRootData->Roots(); -if (!aRoots.IsNull()) -{ - // Iterator over the sequence of root objects - for (StdStorage_HSequenceOfRoots::Iterator anIt(*aRoots); anIt.More(); anIt.Next()) - { - Handle(StdStorage_Root)& aRoot = anIt.ChangeValue(); - // Get a persistent root's object - Handle(StdObjMgt_Persistent) aPObject = aRoot->Object(); - if (!aPObject.IsNull()) - { - Handle(ShapePersistent_TopoDS::HShape) aHShape = Handle(ShapePersistent_TopoDS::HShape)::DownCast(aPObject); - if (aHShape) // Downcast to an expected type to import transient data - { - TopoDS_Shape aShape = aHShape->Import(); - shapes.Append(aShape); - } - } - } -} -~~~~ - -The following code demonstrates how to write shapes in OCCT 7.2.0 using *StdStorage* class. - -~~~~ -// Create a file driver -NCollection_Handle aFileDriver(new FSD_File()); - -// Try to open the file driver for writing -try -{ - OCC_CATCH_SIGNALS - PCDM_ReadWriter::Open (*aFileDriver, TCollection_ExtendedString(theFilename), Storage_VSWrite); -} -catch (Standard_Failure& e) -{ - // Error processing -} - -// Create a storage data instance -Handle(StdStorage_Data) aData = new StdStorage_Data(); -// Set an axiliary application name (optional) -aData->HeaderData()->SetApplicationName(TCollection_ExtendedString("Application")); - -// Provide a map to track sharing -StdObjMgt_TransientPersistentMap aMap; -// Iterator over a collection of shapes -for (Standard_Integer i = 1; i <= shapes.Length(); ++i) -{ - TopoDS_Shape aShape = shapes.Value(i); - // Translate a shape to a persistent object - Handle(ShapePersistent_TopoDS::HShape) aPShape = - ShapePersistent_TopoDS::Translate(aShape, aMap, ShapePersistent_WithTriangle); - if (aPShape.IsNull()) - { - // Error processing - } - - // Construct a root name - TCollection_AsciiString aName = TCollection_AsciiString("Shape_") + i; - - // Add a root to storage data - Handle(StdStorage_Root) aRoot = new StdStorage_Root(aName, aPShape); - aData->RootData()->AddRoot(aRoot); -} - -// Write storage data to the driver -Storage_Error anError = StdStorage::Write(*aFileDriver, aData); -if (anError != Storage_VSOk) -{ - // Error processing -} -~~~~ - -@subsection upgrade_720_Change_In_BRepLib_MakeFace_Algo Change in BRepLib_MakeFace algorithm - -Previously, *BRepLib_MakeFace* algorithm changed orientation of the source wire in order to avoid creation of face as a hole (i.e. it is impossible to create the entire face as a hole; the hole can be created in context of another face only). New algorithm does not reverse the wire if it is open. Material of the face for the open wire will be located on the left side from the source wire. - -@subsection upgrade_720_Change_In_BRepFill_OffsetWire Change in BRepFill_OffsetWire algorithm - -From now on, the offset will always be directed to the outer region in case of positive offset value and to the inner region in case of negative offset value. -Inner/Outer region for an open wire is defined by the following rule: -when we go along the wire (taking into account edges orientation) the outer region will be on the right side, the inner region will be on the left side. -In case of a closed wire, the inner region will always be inside the wire (at that, the edges orientation is not taken into account). - -@subsection upgrade_720_Change_In_GeomAdaptor_Curve Change in Geom(2d)Adaptor_Curve::IsPeriodic - -Since 7.2.0 version, method *IsPeriodic()* returns the corresponding status of periodicity of the basis curve regardless of closure status of the adaptor curve (see method *IsClosed()*). -Method *IsClosed()* for adaptor can return false even on periodic curve, in the case if its parametric range is not full period, e.g. for adaptor on circle in range [0, @f$ \pi @f$]. -In previous versions, *IsPeriodic()* always returned false if *IsClosed()* returned false. - -@subsection upgrade_720_UnifySameDomain Change in algorithm ShapeUpgrade_UnifySameDomain - -The history of the changing of the initial shape was corrected: -* all shapes created by the algorithm are considered as modified shapes instead of generated ones; -* method Generated was removed and its calls should be replaced by calls of method History()->Modified. - -@subsection upgrade_720_Change_In_RWStl Changes in STL Reader / Writer - -Class RWStl now uses class Poly_Triangulation for storing triangular mesh instead of StlMesh data classes; the latter have been removed. - -@subsection upgrade_720_New_Error_Warning_system_in_BOA Refactoring of the Error/Warning reporting system in Boolean Component - -The Error/Warning reporting system of the algorithms in Boolean Component (in all BOPAlgo_* and BRepAlgoAPI_* algorithms) has been refactored. -The methods returning the status of errors and warnings of the algorithms (ErrorStatus() and WarningStatus()) have been removed. -Instead use methods HasErrors() and HasWarnings() to check for presence of errors and warnings, respectively. -The full list of errors and warnings, with associated data such as problematic sub-shapes, can be obtained by method GetReport(). - -@section upgrade_occt721 Upgrade to OCCT 7.2.1 - -@subsection upgrade_721_Changes_In_USD Changes in ShapeUpgrade_UnifySameDomain - -The following public methods in the class ShapeUpgrade_UnifySameDomain became protected: -* *UnifyFaces* -* *UnifyEdges* - -The following public method has been removed: -* *UnifyFacesAndEdges* - -@subsection upgrade_721_Move_BuildPCurveForEdgeOnPlane Moving BuildPCurveForEdgeOnPlane from BOPTools_AlgoTools2D to BRepLib - -The methods BuildPCurveForEdgeOnPlane and BuildPCurveForEdgesOnPlane have been moved from the class BOPTools_AlgoTools2D -to the more lower level class BRepLib. - -@subsection upgrade_721_removed Removed features - -The following obsolete features have been removed: -* The package BOPCol has been fully removed: - - *BOPCol_BaseAllocator* is replaced with *Handle(NCollection_BaseAllocator)*; - - *BOPCol_BoxBndTree* is replaced with *BOPTools_BoxBndTree*; - - *BOPCol_Box2DBndTree* is removed as unused; - - *BOPCol_DataMapOfIntegerInteger* is replaced with *TColStd_DataMapOfIntegerInteger*; - - *BOPCol_DataMapOfIntegerListOfInteger* is replaced with *TColStd_DataMapOfIntegerListOfInteger*; - - *BOPCol_DataMapOfIntegerListOfShape* is replaced with *TopTools_DataMapOfIntegerListOfShape*; - - *BOPCol_DataMapOfIntegerMapOfInteger.hxx* is removed as unused; - - *BOPCol_DataMapOfIntegerReal* is replaced with *TColStd_DataMapOfIntegerReal*; - - *BOPCol_DataMapOfIntegerShape* is replaced with *TopTools_DataMapOfIntegerShape*; - - *BOPCol_DataMapOfShapeBox* is replaced with *TopTools_DataMapOfShapeBox*; - - *BOPCol_DataMapOfShapeInteger* is replaced with *TopTools_DataMapOfShapeInteger*; - - *BOPCol_DataMapOfShapeListOfShape* is replaced with *TopTools_DataMapOfShapeListOfShape*; - - *BOPCol_DataMapOfShapeReal* is replaced with *TopTools_DataMapOfShapeReal*; - - *BOPCol_DataMapOfShapeShape* is replaced with *TopTools_DataMapOfShapeShape*; - - *BOPCol_DataMapOfTransientAddress* is removed as unused; - - *BOPCol_IndexedDataMapOfIntegerListOfInteger* is removed as unused; - - *BOPCol_IndexedDataMapOfShapeBox* is removed as unused; - - *BOPCol_IndexedDataMapOfShapeInteger* is removed as unused; - - *BOPCol_IndexedDataMapOfShapeListOfShape* is replaced with *TopTools_IndexedDataMapOfShapeListOfShape*; - - *BOPCol_IndexedDataMapOfShapeReal* is removed as unused; - - *BOPCol_IndexedDataMapOfShapeShape* is replaced with *TopTools_IndexedDataMapOfShapeShape*; - - *BOPCol_IndexedMapOfInteger* is replaced with *TColStd_IndexedMapOfInteger*; - - *BOPCol_IndexedMapOfOrientedShape* is replaced with *TopTools_IndexedMapOfOrientedShape*; - - *BOPCol_IndexedMapOfShape* is replaced with *TopTools_IndexedMapOfShape*; - - *BOPCol_ListOfInteger* is replaced with *TColStd_ListOfInteger*; - - *BOPCol_ListOfListOfShape* is replaced with *TopTools_ListOfListOfShape*; - - *BOPCol_ListOfShape* is replaced with *TopTools_ListOfShape*; - - *BOPCol_MapOfInteger* is replaced with *TColStd_MapOfInteger*; - - *BOPCol_MapOfOrientedShape* is replaced with *TopTools_MapOfOrientedShape*; - - *BOPCol_MapOfShape* is replaced with *TopTools_MapOfShape*; - - *BOPCol_PListOfInteger* is removed as unused; - - *BOPCol_PInteger* is removed as unused - - *BOPCol_SequenceOfPnt2d* is replaced with *TColgp_SequenceOfPnt2d*; - - *BOPCol_SequenceOfReal* is replaced with *TColStd_SequenceOfReal*; - - *BOPCol_SequenceOfShape* is replaced with *TopTools_SequenceOfShape*; - - *BOPCol_Parallel* is replaced with *BOPTools_Parallel*; - - *BOPCol_NCVector* is replaced with *NCollection_Vector*; -* The class *BOPDS_PassKey* and containers for it have been removed as unused. -* The unused containers from *IntTools* package have been removed: - - *IntTools_DataMapOfShapeAddress* is removed as unused; - - *IntTools_IndexedDataMapOfTransientAddress* is removed as unused; -* The container *BiTgte_DataMapOfShapeBox* is replaced with *TopTools_DataMapOfShapeBox*; -* The class *BOPTools* has been removed as duplicate of the class *TopExp*; -* The method *BOPAlgo_Builder::Splits()* has been removed as excessive. The method *BOPAlgo_Builder::Images()* can be used instead. -* The method *BOPTools_AlgoTools::CheckSameGeom()* has been removed as excessive. The method *BOPTools_AlgoTools::AreFacesSameDomain()* can be used instead. - -@section upgrade_occt730 Upgrade to OCCT 7.3.0 - -@subsection upgrade_730_lights Light sources - -Multiple changes have been applied to lights management within *TKV3d* and *TKOpenGl*: -* *V3d_Light* class is now an alias to *Graphic3d_CLight*. - *Graphic3d_CLight* is now a Handle class with refactored methods for managing light source parameters. - Most methods of *V3d_Light* sub-classes have been preserved to simplify porting. -* Obsolete debugging functionality for drawing a light source has been removed from *V3d_Light*. - Methods and constructors that take parameters for debug display and do not affect the light definition itself have also been removed. -* Light constructors taking *V3d_Viewer* have been marked as deprecated. - Use method *AddLight()* of the class *V3d_Viewer* or *V3d_View* to add new light sources to a scene or a single view, respectively. -* The upper limit of 8 light sources has been removed. -* The classes for specific light source types: *V3d_AmbientLight, V3d_DirectionalLight, V3d_PositionalLight* and *V3d_SpotLight* have been preserved, but it is now possible to define the light of any type by creating base class *Graphic3d_CLight* directly. The specific classes only hide unrelated light properties depending on the type of light source. -* It is no more required to call *V3d_Viewer::UpdateLights()* after modifying the properties of light sources (color, position, etc.) - -@subsection upgrade_730_shadingmodels Shading Models - -*Graphic3d_AspectFillArea3d* has been extended by a new property *ShadingModel()*, which previously has been defined globally for the entire View. - -Previously, a triangle array without normal vertex attributes was implicitly considered as unshaded, -but now such array will be shaded using *Graphic3d_TOSM_FACET* model (e.g. by computing per-triangle normals). -Therefore, *Graphic3d_TOSM_UNLIT* should be explicitly specified to disable shading of triangles array. -Alternatively, a material without reflectance properties can be used to disable shading (as before). - -@subsection upgrade_730_tkopengl Custom low-level OpenGL elements - -The following API changes should be considered while porting custom *OpenGl_Element* objects: -* *OpenGl_ShaderManager::BindFaceProgram()*, *BindLineProgram()*, *BindMarkerProgram()* now take enumeration arguments instead of Boolean flags. - -@subsection upgrade_730_BOPAlgo_Section Changes in BOPAlgo_Section - -The public method *BuildSection()* in the class *BOPAlgo_Section* has become protected. The methods *Perform()* or *PerformWithFiller()* should be called for construction of the result of SECTION operation. - -@subsection upgrade_730_BRepAdaptor_CompCurve Changes in BRepAdaptor_CompCurve - -The method *BRepAdaptor_CompCurve::SetPeriodic* has been eliminated. -Since the new version, the method *BRepAdaptor_CompCurve::IsPeriodic()* will always return FALSE. Earlier, it could return TRUE in case if the wire contained only one edge based on a periodic curve. - -@subsection upgrade_730_removed Removed features -* The methods *SetDeflection*, *SetEpsilonT*, *SetDiscretize* of the class *IntTools_EdgeFace* have been removed as redundant. -* Deprecated functionality *V3d_View::Export()*, related enumerations Graphic3d_ExportFormat, Graphic3d_SortType - as well as optional dependency from gl2ps library have been removed. - -@subsection upgrade_730_BuilderSolid Boolean Operations - Solid Builder algorithm - -Previously, the unclassified faces of *BOPAlgo_BuilderSolid* algorithm (i.e. the faces not used for solids creation and located outside of all created solids) were used to form an additional (not closed) solid with INTERNAL orientation. -Since the new version, these unclassified faces are no longer added into the resulting solids. Instead, the @ref occt_algorithms_ers "warning" with a list of these faces appears. - -The following public methods of the *BOPAlgo_BuilderSolid* class have been removed as redundant: -* *void SetSolid(const TopoDS_Solid& theSolid);* -* *const TopoDS_Solid& Solid() const;* - -@subsection upgrade_730_BRepAlgoBO Boolean Operation classes in BRepAlgo are deprecated - -The API classes in the package BRepAlgo providing access to old Boolean operations are marked as deprecated: -* BRepAlgo_Fuse -* BRepAlgo_Common -* BRepAlgo_Cut -* BRepAlgo_Section -Corresponding classes from the package BRepAlgoAPI should be used instead. - -@subsection upgrade_730_replace_CDM_MessageDriver_interface_by_Message_Messenger Unification of the Error/Warning reporting system of Application Framework - -Class *CDM_MessageDriver* and its descendants have been removed; class *Message_Messenger* is used instead in all OCAF packages. -By default, messenger returned by *Message::DefaultMessenger()* is used, thus all messages generated by OCAF are directed in the common message queue of OCCT. - -In classes implementing OCAF persistence for custom attributes (those inheriting from *BinMDF_ADriver*, *XmlMDF_ADriver*), uses of method *WriteMessage()* should be replaced by call to method *Send()* of the inherited field *myMessageDriver*. Note that this method takes additional argument indicating the gravity of the message (Trace, Info, Warning, Alarm, or Fail). - -Class *Message_PrinterOStream* can be used instead of *CDM_COutMessageDriver* to direct all messages to a stream. -If custom driver class is used in the application, that class shall be reimplemented inheriting from *Message_Printer* instead of *CDM_MessageDriver*. -Method *Send()* should be redefined instead of method *Write()* of *CDM_MessageDriver*. -To use the custom printer in OCAF, it can be either added to default messenger or set into the custom *Message_Messenger* object created in the method *MessageDriver()* of a class inheriting *CDF_Application*. - -@section upgrade_occt740 Upgrade to OCCT 7.4.0 - -@subsection upgrade_740_BRepPrimAPI_MakeRevol Changes in BRepPrimAPI_MakeRevol algorithm -Previously the algorithm could create a shape with the same degenerated edge shared between some faces. Now it is prevented. The algorithm creates the different copy of this edge for each face. The method *Generated(...)* has been changed in order to apply restriction to the input shape: input shape can be only of type VERTEX, EDGE, FACE or SOLID. For input shape of another type the method always returns empty list. - -@subsection upgrade_740_removed Removed features -* The following methods of the class *BRepAlgoAPI_BooleanOperation* have been removed as obsolete or replaced: - - *BuilderCanWork* can be replaced with *IsDone* or *HasErrors* method. - - *FuseEdges* removed as obsolete. - - *RefineEdges* replaced with new method *SimplifyResult*. -* The method *ImagesResult* of the class *BOPAlgo_BuilderShape* has been removed as unused. The functionality of this method can be completely replaced by the history methods *Modified* and *IsDeleted*. -* The method *TrackHistory* of the classes *BOPAlgo_RemoveFeatures* and *BRepAlgoAPI_Defeaturing* has been renamed to *SetToFillHistory*. -* The method *GetHistory* of the class *BRepAlgoAPI_Defeaturing* has been renamed to *History*. -* The classes *BRepAlgo_BooleanOperations* and *BRepAlgo_DSAccess* have been removed as obsolete. Please use the BRepAlgoAPI_* classes to perform Boolean operations. -* *BRepAlgo_DataMapOfShapeBoolean* has been removed as unused. -* *BRepAlgo_DataMapOfShapeInterference* has been removed as unused. -* *BRepAlgo_EdgeConnector* has been removed as unused. -* *BRepAlgo_SequenceOfSequenceOfInteger* has been removed as unused. - -@subsection upgrade_740_localcontext Local Context removal - -Previously deprecated Local Context functionality has been removed from AIS package, -so that related methods have been removed from AIS_InteractiveContext interface: -*HasOpenedContext()*, *HighestIndex()*, *LocalContext()*, *LocalSelector()*, *OpenLocalContext()*, *CloseLocalContext()*, -*IndexOfCurrentLocal()*, *CloseAllContexts()*, *ResetOriginalState()*, *ClearLocalContext()*, *UseDisplayedObjects()*, *NotUseDisplayedObjects()*, -*SetShapeDecomposition()*, *SetTemporaryAttributes()*, *ActivateStandardMode()*, *DeactivateStandardMode()*, *KeepTemporary()*, -*SubIntensityOn()*, *SubIntensityOff()*, *ActivatedStandardModes()*, *IsInLocal()*, *AddOrRemoveSelected()* taking TopoDS_Shape. - -A set of deprecated methods previously related to Local Context and now redirecting to other methods has been preserved to simplify porting; they will be removed in next release. - -@subsection upgrade_740_geomconvert Changes in behavior of Convert algorithms - -Now methods *GeomConvert::ConcatG1*, *GeomConvert::ConcatC1*, *Geom2dConvert::ConcatG1*, *Geom2dConvert::ConcatC1* modify the input argument representing the flag of closedness. - -@subsection upgrade_740_selection Changes in selection API and picked point calculation algorithm. - -*SelectBasics_PickResult* structure has been extended, so that it now defines a 3D point on the detected entity in addition to Depth value along picking ray. -*SelectMgr_SelectingVolumeManager::Overlap()* methods have been corrected to fill in *SelectBasics_PickResult* structure (depth and 3D point) instead of only depth value, so that custom *Select3D_SensitiveEntity* implementation should be updated accordingly (including *Select3D_SensitiveSet* subclasses). - -@subsection upgrade_740_ocafpersistence Document format version management improvement. - -Previously Document format version restored by *DocumentRetrievalDriver* was propagated using static methods of the corresponding units (like *MDataStd* or *MNaming*) to static variables of these units and after that became accessible to Drivers of these units. -Now Document format version is available to drivers via *RelocationTable*. The Relocation table now keeps *HeaderData* of the document and a format version can be extracted in the following way: *theRelocTable.GetHeaderData()->StorageVersion()*. -Obsolete methods: *static void SetDocumentVersion (const Standard_Integer DocVersion)* and *static Standard_Integer DocumentVersion()* have been removed from *BinMDataStd*, *BinMNaming*, *XmlMDataStd* and *XmlMNaming*. - -@subsection upgrade_740_changed_api_of_brepmesh BRepMesh - revision of the data model - -The entire structure of *BRepMesh* component has been revised and separated into several logically connected classes. - -In new version, deflection is controlled more accurately, this may be necessary to tune parameters of call of the BRepMesh algorithm on the application side to obtain the same quality of presentation and/or performance as before. - -*BRepMesh_FastDiscret* and *BRepMesh_FastDiscretFace* classes have been removed. - -The following changes have been introduced in the API of *BRepMesh_IncrementalMesh*, component entry point: -* Due to revised logic, *adaptiveMin* parameter of the constructor has been removed as meaningless; -* *BRepMesh_FastDiscret::Parameters* has been moved to a separate structure called *IMeshTools_Parameters*; the signatures of related methods have been changed correspondingly. - -* Interface of *BRepMesh_Delaun* class has been changed. - -Example of usage: -Case 1 (explicit parameters): -~~~~ -#include -#include -#include - -Standard_Boolean meshing_explicit_parameters() -{ - BRepMesh_IncrementalMesh aMesher (aShape, 0.1, Standard_False, 0.5, Standard_True); - const Standard_Integer aStatus = aMesher.GetStatusFlags(); - return !aStatus; -} - -Standard_Boolean meshing_new() -{ - IMeshTools_Parameters aMeshParams; - aMeshParams.Deflection = 0.1; - aMeshParams.Angle = 0.5; - aMeshParams.Relative = Standard_False; - aMeshParams.InParallel = Standard_True; - aMeshParams.MinSize = Precision::Confusion(); - aMeshParams.InternalVerticesMode = Standard_True; - aMeshParams.ControlSurfaceDeflection = Standard_True; - - BRepMesh_IncrementalMesh aMesher (aShape, aMeshParams); - const Standard_Integer aStatus = aMesher.GetStatusFlags(); - return !aStatus; -} -~~~~ - -@subsection upgrade_740_chamfer Changes in API of Chamfer algorithms - -Some public methods of the class BRepFilletAPI_MakeChamfer are released from excess arguments: -- method Add for symmetric chamfer now takes only 2 arguments: distance and edge; -- method GetDistAngle now takes only 3 arguments: index of contour, distance and angle. - -@subsection upgrade_740_aspects Aspects unification - -Fill Area, Line and Marker aspects (classes *Graphic3d_AspectFillArea3d*, *Graphic3d_AspectLine3d*, *Graphic3d_AspectMarker3d* and *Graphic3d_AspectText3d*) -have been merged into new class *Graphic3d_Aspects* providing a single state for rendering primitives of any type. -The old per-primitive type aspect classes have been preserved as sub-classes of *Graphic3d_Aspects* with default values close to the previous behavior. -All aspects except Graphic3d_AspectFillArea3d define Graphic3d_TOSM_UNLIT shading model. - -The previous approach with dedicated aspects per primitive type was handy in simplified case, but lead to confusion otherwise. -In fact, drawing points or lines with lighting applied is a valid use case, but only *Graphic3d_AspectFillArea3d* previously defined necessary material properties. - -As aspects for different primitive types have been merged, Graphic3d_Group does no more provide per-type aspect properties. -Existing code relying on old behavior and putting interleaved per-type aspects into single Graphic3d_Group should be updated. -For example, the following pseudo-code will not work anymore, because all *SetGroupPrimitivesAspect* calls will setup the same property: -~~~~ -Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); -aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect()); -aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect()); //!< overrides previous aspect - -Handle(Graphic3d_ArrayOfSegments) aLines = new Graphic3d_ArrayOfSegments (2); -Handle(Graphic3d_ArrayOfTriangles) aTris = new Graphic3d_ArrayOfTriangles (3); -aGroup->AddPrimitiveArray (aLines); //!< both arrays will use the same aspect -aGroup->AddPrimitiveArray (aTris); -~~~~ - -To solve the problem, the code should be modified to either put primitives into dedicated groups (preferred approach), or using *SetPrimitivesAspect* in proper order: -~~~~ -Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); - -aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect()); -Handle(Graphic3d_ArrayOfTriangles) aTris = new Graphic3d_ArrayOfTriangles (3); -aGroup->AddPrimitiveArray (aTris); - -Handle(Graphic3d_ArrayOfSegments) aLines = new Graphic3d_ArrayOfSegments (2); -aGroup->SetPrimitivesAspect (myDrawer->LineAspect()->Aspect()); //!< next array will use the new aspect -aGroup->AddPrimitiveArray (aLines); -~~~~ - -@subsection upgrade_740_materials Material definition - -Decomposition of Ambient, Diffuse, Specular and Emissive properties has been eliminated within *Graphic3d_MaterialAspect* definition. -As result, the following methods of *Graphic3d_MaterialAspect* class have been removed: SetReflectionMode(), SetReflectionModeOn(), Ambient(), Diffuse(), Emissive(), Specular(), SetAmbient(), SetDiffuse(), SetSpecular(), SetEmissive(). - -Previously, computation of final value required the following code: -~~~~ -Graphic3d_MaterialAspect theMaterial; Quantity_Color theInteriorColor; -Graphic3d_Vec3 anAmbient (0.0f); -if (theMaterial.ReflectionMode (Graphic3d_TOR_AMBIENT)) -{ - anAmbient = theMaterial.MaterialType (Graphic3d_MATERIAL_ASPECT) - ? (Graphic3d_Vec3 )theInteriorColor * theMaterial.Ambient() - : (Graphic3d_Vec3 )theMaterial.AmbientColor() * theMaterial.Ambient(); -} -~~~~ - -New code looks like this: -~~~~ -Graphic3d_MaterialAspect theMaterial; Quantity_Color theInteriorColor; -Graphic3d_Vec3 anAmbient = theMaterial.AmbientColor(); -if (theMaterial.MaterialType (Graphic3d_MATERIAL_ASPECT)) { anAmbient *= (Graphic3d_Vec3 )theInteriorColor; } -~~~~ - -Existing code should be updated to: -- Replace Graphic3d_MaterialAspect::SetReflectionModeOff() with setting black color; SetReflectionModeOn() calls can be simply removed. - R.g. theMaterial.SetAmbientColor(Quantity_NOC_BLACK). -- Replace Graphic3d_MaterialAspect::Ambient(), SetAmbient(), Diffuse(), SetDiffuse(), Specular(), SetSpecular(), Emissive(), SetEmissive() with methods working with pre-multiplied color. - E.g. theMaterial.SetAmbientColor(Graphic3d_Vec3 (1.0f, 0.0f, 0.0f) * 0.2f). -- Avoid using Graphic3d_MaterialAspect::Color() and SetColor() with non-physical materials (Graphic3d_MATERIAL_ASPECT). - These materials do not include color definition, because it is taken from Graphic3d_Aspects::InteriorColor() - this has not been changed. - However, previously it was possible storing the color with SetColor() call and then fetching it with Color() by application code (the rendering ignored this value); - now SetColor() explicitly ignores call for Graphic3d_MATERIAL_ASPECT materials and Color() returns DiffuseColor() multiplication coefficients. - -@subsection upgrade_740_text Changes in Graphic3d_Text and OpenGl_Text API - -Parameters of *Text* in *Graphic3d_Group* are moved into a new *Graphic3d_Text* class. *AddText* of *Graphic3d_Group* should be used instead of the previous *Text*. - -The previous code: -~~~~ -Standard_Real x, y, z; -theAttachmentPoint.Coord(x,y,z); -theGroup->Text (theText, - Graphic3d_Vertex(x,y,z), - theAspect->Height(), - theAspect->Angle(), - theAspect->Orientation(), - theAspect->HorizontalJustification(), - theAspect->VerticalJustification()); -~~~~ -should be replaced by the new code: -~~~~ -Handle(Graphic3d_Text) aText = new Graphic3d_Text (theAspect->Height()); -aText->SetText (theText.ToExtString()); -aText->SetPosition (theAttachmentPoint); -aText->SetHorizontalAlignment (theAspect->HorizontalJustification()); -aText->SetVerticalAlignment (theAspect->VerticalJustification()); -theGroup->AddText (aText); -~~~~ - -*OpenGl_Text* contains *Graphic3d_Text* field. - -*OpenGl_TextParam* struct is removed. Constructor and *Init* of *OpenGl_Text* with *OpenGl_TextParam* are also removed. -Instead of using them, change *OpenGl_Text*. - -Please, note, that after modifying *OpenGl_Text*, *Reset* of *OpenGl_Text* should be called. - -*FormatParams* of *OpenGl_Text* is replaced by *Text*. - -@subsection upgrade_740_prsupdate Presentation invalidation - -Historically AIS_InteractiveObject provided two independent mechanisms invalidating presentation (asking presentation manager to recompute specific display mode or all modes): - -1. *AIS_InteractiveObject::SetToUpdate()*, marking existing presentation for update. - This is main invalidation API, which is expected to be followed by *AIS_InteractiveContext::Update()* call. -2. *AIS_InteractiveObject::myToRecomputeModes* + *myRecomputeEveryPrs*. - This is auxiliary invalidation API, used internally by AIS_InteractiveContext::SetColor()/UnsetColor() and similar modification methods. - -The latter one has been removed to avoid confusion and unexpected behavior. -In addition, two methods *AIS_InteractiveObject::Update()* have been deprecated in favor of new *AIS_InteractiveObject::UpdatePresentations()* recomputing only invalidated presentations. - -Custom presentations implementing interface methods *AIS_InteractiveObject::SetColor()* and others should be revised to use *AIS_InteractiveObject::SetToUpdate()* -or updating presentation without recomputation (see *AIS_InteractiveObject::SynchronizeAspects()* and *AIS_InteractiveObject::replaceAspects()*). - -@subsection upgrade_740_interiorstyles Interior styles - -* *Aspect_IS_HOLLOW* is now an alias to *Aspect_IS_EMPTY* and does not implicitly enables drawing mesh edges anymore. - Specify Graphic3d_AspectFillArea3d::SetDrawEdges(true) with Graphic3d_AspectFillArea3d::SetInteriorStyle(Aspect_IS_EMPTY) to get previous behavior of Aspect_IS_HOLLOW style. -* *Aspect_IS_HIDDENLINE* does not implicitly enables drawing mesh edges anymore. - Specify Graphic3d_AspectFillArea3d::SetDrawEdges(true) with Graphic3d_AspectFillArea3d::SetInteriorStyle(Aspect_IS_HIDDENLINE) to get previous behavior of Aspect_IS_HIDDENLINE style. - -@subsection upgrade_740_modedprs PrsMgr and SelectMgr hierarchy clean up - -Proxy classes *Prs3d_Presentation*, *PrsMgr_ModedPresentation* and *PrsMgr_Prs* have been removed. -Code iterating through the list of low-level structures AIS_InteractiveObject::Presentations() should be updated to access PrsMgr_Presentation directly. -Forward declarations of *Prs3d_Presentation* should be corrected, since it is now a typedef to *Graphic3d_Structure*. - -Proxy classes *SelectBasics_SensitiveEntity* and *SelectBasics_EntityOwner* have been removed - *Select3D_SensitiveEntity* and *SelectMgr_EntityOwner* should be now used directly instead. - -@subsection upgrade_740_offset Polygon offset defaults - -*Graphic3d_PolygonOffset* default constructor has been corrected to define Units=1 instead of Units=0. -Default polygon offset settings Mode=Aspect_POM_Fill + Factor=1 + Units=1 are intended to push triangulation -(Shaded presentation) a little bit behind of lines (Wireframe and Face Edges) -for reducing z-fighting effect of Shaded+Wireframe combination. -The change in defaults (Units changed from 0 to 1) is intended to cover scenario when camera direction is perpendicular to model plane (like 2D view). - -Application observing unexpected visual difference on this change should consider customizing this property within AIS_InteractiveContext default attributes -or on per-presentation basis via *Graphic3d_Aspects::SetPolygonOffset()* methods. - -@subsection upgrade_740_zlayer Adding ZLayers in given position - -Interface of insertion ZLayer in the viewer has been improved with ability to insert new layer before or after existing one. -Previously undocumented behavior of *V3d_Viewer::AddZlayer()* method has been corrected to insert new layer before *Graphic3d_ZLayerId_Top*. -Applications might need revising their custom layers creation code and specify precisely their order with new methods *V3d_Viewer::InsertLayerBefore()* and *V3d_Viewer::InsertLayerAfter()*. - -@subsection upgrade_740_enum_changed Modified enumerations - -Applications using integer values of the following enumerations in persistence -should be corrected as these enumerations have been modified: - -| Name | -| :----- | -| AIS_TypeOfAttribute | -| Aspect_InteriorStyle | -| Font_FontAspect | - -@subsection upgrade_740_geproj Custom defines within env.bat - -*env.bat* produced by Visual Studio project generator *genproj.bat* has been modified so that *%CSF_DEFINES%* variable is reset to initial state. -Custom building environment relying on old behavior and setting extra macros within *%CSF_DEFINES%* before env.bat should be updated -to either modify custom.bat or setup new variable *%CSF_DEFINES_EXTRA%* instead. - -@subsection upgrade_740_BVH_in_BOP Switching Boolean Operations algorithm to use BVH tree instead of UB tree - -Since OCCT 7.4.0 Boolean Operations algorithm uses BVH tree instead of UBTree to find the pairs of entities with interfering bounding boxes. -The following API changes have been made: -* BOPTools_BoxBndTree and BOPTools_BoxBndTreeSelector have been removed. Use the BOPTools_BoxTree and BOPTools_BoxTreeSelector instead. -* BOPTools_BoxSelector::SetBox() method now accepts the BVH_Box instead of Bnd_Box. -* Methods BOPTools_BoxSelector::Reject and BOPTools_BoxSelector::Accept have been removed as unused. -* The RunParallel flag has been removed from the list of parameters of BOPAlgo_Tools::IntersectVertices method. Earlier, it performed selection from the UB tree in parallel mode. Now all interfering pairs are found in one pass, using pair traverse of the same BVH tree. - -@subsection upgrade_740_stdnamespace Standard_Stream.hxx no more has "using std::" statements -*Standard_Stream.hxx* header, commonly included by other OCCT header files, does no more add entities from *std namespace* related to streams (like *std::cout*, *std::istream* and others) into global namespace. -The application code relying on this matter should be updated to either specify std namespace explicitly (like std::cout) or add "using std::" statements locally. -<<<<<<< HEAD -======= - -@section upgrade_occt750 Upgrade to OCCT 7.5.0 - -@subsection upgrade_750_srgb_color RGB color definition - -OCCT 3D Viewer has been improved to properly perform lighting using in linear RGB color space and then convert result into non-linear gamma-shifted sRGB color space before displaying on display. -This change affects texture mapping, material definition and color definition. - -Previously *Quantity_Color* definition was provided with unspecified RGB color space. -In practice, mixed color spaces have been actually used, with non-linear sRGB prevailing in general. -Since OCCT 7.5.0, *Quantity_Color* now specifies that components are defined in linear RGB color space. - -This change affects following parts: -* Standard colors defined by *Quantity_NameOfColor* enumeration have been converted into linear RGB values within Quantity_Color construction. -* Application may use new enumeration value *Quantity_TOC_sRGB* for passing/fetching colors in sRGB color space, - which can be useful for interoperation with color picking widgets (returning 8-bit integer values within [0..255] range) - or for porting colors constants within old application code without manual conversion. -* *Graphic3d_MaterialAspect* color components are now expected in linear RGB color space, - and standard OCCT materials within *Graphic3d_NameOfMaterial* enumeration have been updated accordingly. -* Texture mapping now handles new *Graphic3d_TextureRoot::IsColorMap()* for interpreting content in linear RGB or sRGB color space. - It is responsibility of user specifying this flag correctly. The flag value is TRUE by default. -* Method *Image_PixMap::PixelColor()* has been extended with a new Boolean flag for performing linearization of non-linear sRGB. - This flag is FALSE by default; application should consider passing TRUE instead for further handling *Quantity_Color* properly as linear RGB values. - -@subsection upgrade_750_aspectwindow Aspect_Window interface change - -Unexpected const-ness of Aspect_Window::DoResize() method has been removed, so that application classes implementing this interface should be updated accordingly. - -@subsection upgrade_750_rename Renaming of types - -Enumeration BRepOffset_Type is renamed to ChFiDS_TypeOfConcavity. - -@subsection upgrade_750_sensitiveEntity Select3D_SensitiveEntity interface change - -The method Select3D_SensitiveEntity::NbSubElements() has been changed to be constant. Select3D_SensitiveEntity subclasses at application level should be updated accordingly. - - -@subsection upgrade_750_Booleans Changes in Boolean operations algorithm - -* TreatCompound method has been moved from *BOPAlgo_Tools* to *BOPTools_AlgoTools*. Additionally, the map parameter became optional: -~~~~ -void BOPTools_AlgoTools::TreatCompound (const TopoDS_Shape& theS, - TopTools_ListOfShape& theLS, - TopTools_MapOfShape* theMap = NULL); -~~~~ diff -Nru opencascade-7.4.1+dfsg1/dox/FILES_HTML.txt opencascade-7.5.1+dfsg1/dox/FILES_HTML.txt --- opencascade-7.4.1+dfsg1/dox/FILES_HTML.txt 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/FILES_HTML.txt 2021-02-02 08:51:56.000000000 +0000 @@ -5,54 +5,56 @@ # The order of files in this list determines order of top-level pages # in the generated documentation. -overview/overview.md +introduction/introduction.md +samples/samples.md ../samples/mfc/standard/ReadMe.md ../samples/CSharp/ReadMe.md ../samples/CSharp/ReadMe_D3D.md - ../samples/qt/AndroidQt/ReadMe.md +../samples/qt/OCCTOverview/ReadMe.md ../samples/java/jniviewer/ReadMe.md ../samples/ios/UIKitSample/ReadMe.md +../samples/webgl/ReadMe.md +samples/ocaf.md +samples/ocaf_func.md +samples/draw_scripts.md tutorial/tutorial.md -technical_overview/technical_overview.md +build/build_upgrade.md +build/build_occt/building_occt.md +build/build_3rdparty/building_3rdparty.md +build/build_documentation/building_documentation.md + +debug/debug.md +upgrade/upgrade.md user_guides/user_guides.md user_guides/foundation_classes/foundation_classes.md user_guides/modeling_data/modeling_data.md user_guides/modeling_algos/modeling_algos.md -user_guides/boolean_operations/boolean_operations.md +user_guides/mesh/mesh.md user_guides/shape_healing/shape_healing.md user_guides/visualization/visualization.md user_guides/iges/iges.md user_guides/step/step.md user_guides/xde/xde.md user_guides/ocaf/ocaf.md -user_guides/tobj/tobj.md user_guides/draw_test_harness/draw_test_harness.md user_guides/inspector/inspector.md -user_guides/brep_wp/brep_wp.md user_guides/vis/vis.md -dev_guides/dev_guides.md -dev_guides/documentation/documentation.md -dev_guides/contribution/coding_rules.md -dev_guides/contribution_workflow/contribution_workflow.md -dev_guides/git_guide/git_guide.md -dev_guides/tests/tests.md -dev_guides/debug/debug.md -dev_guides/upgrade/upgrade.md - -dev_guides/building/building.md -dev_guides/building/3rdparty/3rdparty_windows.md -dev_guides/building/3rdparty/3rdparty_linux.md -dev_guides/building/3rdparty/3rdparty_osx.md -dev_guides/building/cmake/cmake.md -dev_guides/building/android/android.md -dev_guides/building/code_blocks.md -dev_guides/building/msvc.md -dev_guides/building/xcode.md +specification/specification.md +specification/boolean_operations/boolean_operations.md +specification/brep_format.md +specification/pbr_math.md + +contribution/contribution.md +contribution/documentation/documentation.md +contribution/coding_rules.md +contribution/contribution_workflow/contribution_workflow.md +contribution/git_guide/git_guide.md +contribution/tests/tests.md license.md diff -Nru opencascade-7.4.1+dfsg1/dox/FILES_PDF.txt opencascade-7.5.1+dfsg1/dox/FILES_PDF.txt --- opencascade-7.4.1+dfsg1/dox/FILES_PDF.txt 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/FILES_PDF.txt 2021-02-02 08:51:56.000000000 +0000 @@ -4,27 +4,29 @@ # Empty spaces are allowed. # Strings starting with '#' are treated as comments and ignored. -user_guides/brep_wp/brep_wp.md +tutorial/tutorial.md + +upgrade/upgrade.md + user_guides/foundation_classes/foundation_classes.md -user_guides/iges/iges.md user_guides/modeling_data/modeling_data.md user_guides/modeling_algos/modeling_algos.md -user_guides/boolean_operations/boolean_operations.md -user_guides/shape_healing/shape_healing.md +user_guides/mesh/mesh.md user_guides/ocaf/ocaf.md -user_guides/step/step.md -user_guides/draw_test_harness/draw_test_harness.md -user_guides/inspector/inspector.md -user_guides/tobj/tobj.md user_guides/visualization/visualization.md -user_guides/xde/xde.md user_guides/vis/vis.md +user_guides/iges/iges.md +user_guides/step/step.md +user_guides/xde/xde.md +user_guides/inspector/inspector.md +user_guides/draw_test_harness/draw_test_harness.md -dev_guides/contribution_workflow/contribution_workflow.md -dev_guides/documentation/documentation.md -dev_guides/contribution/coding_rules.md -dev_guides/git_guide/git_guide.md -dev_guides/tests/tests.md -dev_guides/upgrade/upgrade.md +contribution/contribution_workflow/contribution_workflow.md +contribution/documentation/documentation.md +contribution/coding_rules.md +contribution/git_guide/git_guide.md +contribution/tests/tests.md -tutorial/tutorial.md +specification/boolean_operations/boolean_operations.md +specification/brep_format.md +specification/pbr_math.md Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/0001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/0001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/0002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/0002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/0003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/0003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/0004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/0004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/0008.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/0008.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/0012.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/0012.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/0013.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/0013.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/0014.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/0014.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/overview_3rdparty.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/overview_3rdparty.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/overview_draw.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/overview_draw.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/overview_installation.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/overview_installation.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/introduction/images/technical_overview_schema.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/introduction/images/technical_overview_schema.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/introduction/introduction.md opencascade-7.5.1+dfsg1/dox/introduction/introduction.md --- opencascade-7.4.1+dfsg1/dox/introduction/introduction.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/introduction/introduction.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,662 @@ +Introduction {#mainpage} +======== + +@tableofcontents + +@htmlonly
@endhtmlonly +@figure{/resources/occt_logo.png} +@htmlonly
@endhtmlonly + +Welcome to Open CASCADE Technology (OCCT), a software development platform +providing services for 3D surface and solid modeling, CAD data exchange, and +visualization. Most of OCCT functionality is available in the form of C++ +libraries. OCCT can be best applied in development of software dealing with 3D +modeling (CAD), manufacturing / measuring (CAM) or numerical simulation (CAE). + +@htmlonly
@endhtmlonly +https://www.opencascade.com +@figure{/resources/occ_logo.png} +@htmlonly
@endhtmlonly + +@section intro_overview Overview + +Open CASCADE Technology (OCCT) is an object-oriented C++ class library designed for rapid production of sophisticated domain-specific CAD/CAM/CAE applications. + +A typical application developed using OCCT deals with two or three-dimensional (2D or 3D) geometric modeling +in general-purpose or specialized Computer Aided Design (CAD) systems, manufacturing +or analysis applications, simulation applications, or even illustration tools. + +OCCT library is designed to be truly modular and extensible, providing C++ classes for: + * Basic data structures (geometric modeling, visualization, interactive selection and application specific services); + * Modeling algorithms; + * Working with mesh (faceted) data; + * Data interoperability with neutral formats (IGES, STEP); + +The C++ classes and other types are grouped into packages. Packages are organized into toolkits (libraries), to which you can link your application. Finally, toolkits are grouped into seven modules. + +This modular structure is illustrated in the diagram below. + +@figure{/introduction/images/technical_overview_schema.png} + +* @ref intro_overview_fclasses "Foundation Classes" module underlies all other OCCT classes; +* @ref intro_overview_moddata "Modeling Data" module supplies data structures to represent 2D and 3D geometric primitives and their compositions into CAD models; +* @ref intro_overview_modalgo "Modeling Algorithms" module contains a vast range of geometrical and topological algorithms; + * @ref intro_overview_mesh "Mesh" toolkit from "Modeling Algorithms" module implements tessellated representations of objects; +* @ref intro_overview_visu "Visualization" module provides complex mechanisms for graphical data representation; +* @ref intro_overview_de "Data Exchange" module inter-operates with popular data formats and relies on @ref intro_overview_heal "Shape Healing" to improve compatibility between CAD software of different vendors; +* @ref intro_overview_ocaf "Application Framework" module offers ready-to-use solutions for handling application-specific data (user attributes) and commonly used functionality (save/restore, undo/redo, copy/paste, tracking CAD modifications, etc). + +In addition, @ref intro_overview_draw "Open CASCADE Test Harness", also called Draw, provides an entry point to the library and can be used as a testing tool for its modules. + +@subsection intro_overview_fclasses Foundation Classes + +**Foundation Classes** module contains data structures and services used by higher-level Open CASCADE Technology classes: + + * Primitive types, such as Boolean, Character, Integer or Real; + * String classes that handle Unicode strings; + * Collection classes that handle statically or dynamically sized aggregates of data, such as arrays, lists, queues, sets and hash tables (data maps). + * Classes providing commonly used numerical algorithms and basic linear algebra calculations (addition, multiplication, transposition of vectors and matrices, solving linear systems etc). + * Fundamental types like color, date and time information; + * Primitive geometry types providing implementation of basic geometric and algebraic entities that define and manipulate elementary data structures. + * Exception classes that describe situations, when the normal execution of program is abandoned; + +This module also provides a variety of general-purpose services, such as: + * Safe handling of dynamically created objects, ensuring automatic deletion of unreferenced objects (smart pointers); + * Standard and specialized memory allocators; + * Extended run-time type information (RTTI) mechanism maintaining a full type hierarchy and providing means to iterate over it; + * Encapsulation of C++ streams; + * Basic interpreter of expressions facilitating the creation of customized scripting tools, generic definition of expressions, etc.; + * Tools for dealing with configuration resource files and customizable message files facilitating multi-language support in applications; + * Progress indication and user break interfaces, giving a possibility even for low-level algorithms to communicate with the user in a universal and convenient way; + * and many others... + +See the details in @ref occt_user_guides__foundation_classes "Foundation Classes User's Guide" + +@subsection intro_overview_moddata Modeling Data + +**Modeling Data** supplies data structures to implement boundary representation (BRep) of objects in 3D. +In BRep the shape is represented as an aggregation of geometry within topology. +The geometry is understood as a mathematical description of a shape, e.g. as curves and surfaces (simple or canonical, Bezier, NURBS, etc). +The topology is a data structure binding geometrical objects together. + +Geometry types and utilities provide geometric data structures and services for: + * Description of points, vectors, curves and surfaces: + * their positioning in 3D space using axis or coordinate systems, and + * their geometric transformation, by applying translations, rotations, symmetries, scaling transformations and combinations thereof. + * Creation of parametric curves and surfaces by interpolation and approximation; + * Algorithms of direct construction; + * Conversion of curves and surfaces to NURBS form; + * Computation of point coordinates on 2D and 3D curves; + * Calculation of extrema between geometric objects. + +Topology defines relationships between simple geometric entities. +A shape, which is a basic topological entity, can be divided into components (sub-shapes): + * Vertex -- a zero-dimensional shape corresponding to a point; + * Edge -- a shape corresponding to a curve and bounded by a vertex at each extremity; + * Wire -- a sequence of edges connected by their vertices; + * Face -- a part of a plane (in 2D) or a surface (in 3D) bounded by wires; + * Shell -- a collection of faces connected by edges of their wire boundaries; + * Solid -- a finite closed part of 3D space bounded by shells; + * Composite solid -- a collection of solids connected by faces of their shell boundaries; + * Compound -- a collection of shapes of arbitrary type. + +Complex shapes can be defined as assemblies (compounds) of simpler entities. + +See the details in @ref occt_user_guides__modeling_data "Modeling Data User's Guide" + +3D geometric models can be stored in OCCT native BREP format. +See @ref specification__brep_format "BREP Format Description White Paper" for details on the format. + +@subsection intro_overview_modalgo Modeling Algorithms + +**Modeling Algorithms** module groups a wide range of topological and geometric algorithms used in geometric modeling. +Basically, there are two groups of algorithms in Open CASCADE Technology: + * High-level modeling routines used in the real design; + * Low-level mathematical support functions used as a groundwork for the modeling API. + +Low-level *geometric tools* provide the algorithms, which: + * Calculate the intersection of two curves, surfaces, or a curve and a surface; + * Project points onto 2D and 3D curves, points onto surfaces and 3D curves onto surfaces; + * Construct lines and circles from constraints; + * Construct free-form curves and surfaces from constraints (interpolation, approximation, skinning, gap filling, etc). + +Low-level *topological tools* provide the algorithms, which: + * Tessellate shapes; + * Check correct definition of shapes; + * Determine the local and global properties of shapes (derivatives, mass-inertia properties, etc); + * Perform affine transformations; + * Find planes in which edges are located; + * Convert shapes to NURBS geometry; + * Sew connected topologies (shells and wires) from separate topological elements (faces and edges). + +Top-level API provides the following functionality: + * Construction of Primitives: + * Boxes; + * Prisms; + * Cylinders; + * Cones; + * Spheres; + * Toruses. + * Kinematic Modeling: + * Prisms -- linear sweeps; + * Revolutions -- rotational sweeps; + * Pipes -- general-form sweeps; + * Lofting. + +@figure{/introduction/images/0001.png "Shapes containing pipes with variable radius produced by sweeping"} + + * Boolean Operations, which allow creating new shapes from the combinations of source shapes. For two shapes *S1* and *S2*: + * *Common* contains all points that are in *S1* and *S2*; + * *Fuse* contains all points that are in *S1* or *S2*; + * *Cut* contains all points in that are in *S1* and not in *S2*. + +See @ref specification__boolean_operations "Boolean Operations" User's Guide for detailed documentation. + + * Algorithms for local modifications such as: + * Hollowing; + * Shelling; + * Creation of tapered shapes using draft angles; + * Algorithms to make fillets and chamfers on shape edges, including those with variable radius (chord). + + * Algorithms for creation of mechanical features, i.e. depressions, protrusions, ribs and grooves or slots along planar or revolution surfaces. + +@figure{/introduction/images/0004.png} + +See the details in @ref occt_user_guides__modeling_algos "Modeling Algorithms User's Guide". + +@subsection intro_overview_mesh Mesh + +**Mesh** toolkit provides the functionality to work with tessellated representations of objects in form of triangular facets. This toolkit contains: +- data structures to store surface mesh data associated to shapes and basic algorithms to handle them; +- data structures and algorithms to build triangular surface mesh from *BRep* objects (shapes); +- tools for displaying meshes with associated pre- and post-processor data (scalars or vectors). + +Open CASCADE SAS also offers Advanced Mesh Products: +- Open CASCADE Mesh Framework (OMF) +- Express Mesh + +@figure{/introduction/images/0003.png} + +@subsection intro_overview_visu Visualization + +**Visualization** module provides ready-to-use algorithms to create graphic presentations from various objects: shapes, meshes, etc. + +In Open CASCADE Technology visualization is based on the separation of CAD data and its graphical presentation. +The module also supports a fast and powerful interactive selection mechanism. + +Visualization module relies on the following key toolkits: +- *TKV3d* toolkit defines a high-level API called (Application Interactive Services* (AIS) for working with interactive objects. +- *TKService* toolkit defines a low-level API for managing and creating presentations from primitive arrays. + This toolkit defines an abstraction layer for defining an arbitrary graphic driver responsible for actual rendering. +- *TKOpenGl* toolkit implements the graphic driver using OpenGL and OpenGL ES libraries. + +While low-level API operates with primitive arrays (triangles, lines, points), the higher level includes services for building presentations for B-Rep shapes (shaded and wireframe). +A comprehensive list of standard interactive objects includes topological shape, mesh presentation, various dimensions, manipulators and others. +It provides a solid basis for rapid application development, while flexible and extensible API allows development of highly customized application-specific presentations. + +Here are a few examples of OCCT Visualization features: +* Camera-driven view projection and orientation. + Perspective, orthographic and stereographic projections are supported. +* Support of Common (diffuse/ambient/specular) and PBR metallic-roughness material models. +* Possibility to flexibly adjust appearance of dimensions in a 3D view. + The 3D text object represents a given text string as a true 3D object in the model space. +* Definition of clipping planes through the plane equation coefficients. + Ability to define visual attributes for cross-section at the level or individual clipping planes. + In the image below different parts of the rocket are clipped with different planes and hatched. +@figure{/introduction/images/0008.png, "Display of shape cross-section and dimensions"} + +* Support of built-in and application-specific GLSL shaders. +@figure{/introduction/images/0013.png, "Fragment shader implementing custom clipping surface"} + +* Optimization of rendering performance through the algorithms of: + * View frustum culling, which skips the presentation outside camera at the rendering stage; + * Back face culling, which reduces the rendered number of triangles and eliminates artifacts at shape boundaries. +* Real-time ray tracing technique using recursive Whitted's algorithm and Bounded Volume Hierarchy effective optimization structure. +@figure{introduction/images/0002.png, "Real time visualization by ray tracing method"} +@figure{introduction/images/0012.png, "Simulation of a glass cover"} + +For more details, see @ref occt_user_guides__visualization "Visualization User's Guide". + +The visualization of OCCT topological shapes by means of VTK library provided by VIS component is described in a separate @ref occt_user_guides__vis "VTK Integration Services" User's Guide. + +@subsection intro_overview_de Data Exchange + +**Data Exchange** allows developing OCCT-based applications that can interact with other CAD systems by writing and reading CAD models to and from external data. + +@figure{/introduction/images/0014.png,"Shape imported from STEP"} + +**Data Exchange** is organized in a modular way as a set of interfaces that comply with various CAD formats: IGES, STEP, STL, VRML, etc. +The interfaces allow software based on OCCT to exchange data with various CAD/PDM software packages, maintaining a good level of interoperability. +This module handles various problems of interoperability between CAD systems, caused by differences in model validity criteria and requirements to internal representation. + +* **Standardized Data Exchange** interfaces allow querying and examining the input file, converting its contents to a CAD model and running validity checks on a fully translated shape. + The following formats are currently supported: + * @ref occt_user_guides__step "STEP" (AP203: Mechanical Design, this covers General 3D CAD; AP214: Automotive Design; AP242). + * @ref occt_iges_1 "IGES" (up to 5.3). + * **glTF** 2.0 reader and writer. + * **OBJ** mesh file reader. + * **VRML** converter translates Open CASCADE shapes to VRML 1.0 files (Virtual Reality Modeling Language). + * **STL** converter translates Open CASCADE shapes to STL files. + STL (STtereoLithography) format is widely used for rapid prototyping (3D printing). +* @ref occt_user_guides__xde "Extended data exchange" (XDE) allows translating additional attributes attached to geometric data (colors, layers, names, materials etc). +* Advanced Data Exchange Components + are available in addition to standard Data Exchange interfaces to support interoperability and data adaptation (also using @ref intro_overview_heal "Shape Healing") with CAD software using the following proprietary formats: + * ACIS SAT + * Parasolid + * DXF + * IFC + * JT + +These components are based on the same architecture as interfaces with STEP and IGES. + +@subsection intro_overview_heal Shape Healing + +**Shape Healing** library provides algorithms to correct and adapt the geometry and topology of shapes imported to OCCT from other CAD systems. + +Shape Healing algorithms include, but are not limited to, the following operations: + * Analyze shape characteristics and, in particular, identify the shapes that do not comply with OCCT geometry and topology validity rules by analyzing geometrical objects and topology: + - check edge and wire consistency; + - check edge order in a wire; + - check the orientation of face boundaries; + - analyze shape tolerances; + - identify closed and open wires in a boundary. + * Fix incorrect or incomplete shapes: + - provide consistency between a 3D curve and its corresponding parametric curve; + - repair defective wires; + - fit the shapes to a user-defined tolerance value; + - fill gaps between patches and edges. + * Upgrade and change shape characteristics: + - reduce curve and surface degree; + - split shapes to obtain C1 continuity; + - convert any types of curves or surfaces to Bezier or B-Spline curves or surfaces and back; + - split closed surfaces and revolution surfaces. + +Each sub-domain of Shape Healing has its own scope of functionality: + +| Sub-domain | Description | Impact on the shape | +| :--- | :---- | :---- | +| Analysis | Explores shape properties, computes shape features, detects violation of OCCT requirements. | The shape itself is not modified. | +| Fixing | Fixes the shape to meet the OCCT requirements. | The shape may change its original form: modification, removal or creation of sub-shapes, etc.) | +| Upgrade | Improves the shape to fit some particular algorithms. | The shape is replaced with a new one, but geometrically they are the same. | +| Customization | Modifies the shape representation to fit specific needs. | The shape is not modified, only the mathematical form of its internal representation is changed. | +| Processing | Mechanism of shape modification via a user-editable resource file. | | + +For more details, refer to @ref occt_user_guides__shape_healing "Shape Healing User's guide". + +@subsection intro_overview_ocaf Application Framework + +**Open CASCADE Application Framework** (OCAF) handles Application Data basing on the Application/Document paradigm. +It uses an associativity engine to simplify the development of a CAD application thanks to the following ready-to-use features and services: + +* Data attributes managing the application data, which can be organized according to the development needs; +* Data storage and persistence (open/save); +* Possibility to modify and recompute attributes in documents. + With OCAF it is easy to represent the history of modification and parametric dependencies within your model; +* Possibility to manage multiple documents; +* Predefined attributes common to CAD/CAM/CAE applications (e.g. to store dimensions); +* Undo-Redo and Copy-Paste functions. + +Since OCAF handles the application structure, the only development task is the creation of application-specific data and GUIs. + +OCAF differs from any other CAD framework in the organization of application data, as there the data structures are based on reference keys rather than on shapes. +In a model, such attributes as shape data, color and material are attached to an invariant structure, which is deeper than the shapes. +A shape object becomes the value of *Shape* attribute, in the same way as an integer number is the value of *Integer* attribute and a string is the value of *Name* attribute. + +OCAF organizes and embeds these attributes in a document. OCAF documents, in their turn, are managed by an OCAF application. + +For more details, see @ref occt_user_guides__ocaf "OCAF User's Guide". + +@subsection intro_overview_draw Draw Test Harness + +**Test Harness** or **Draw** is a convenient testing tool for OCCT libraries. +It can be used to test and prototype various algorithms before building an entire application. +It includes: +- A command interpreter based on the TCL language; +- A number of 2D and 3D viewers; +- A set of predefined commands. + +The viewers support operations such as zoom, pan, rotation and full-screen views. + +The basic commands provide general-purpose services such as: +- Getting help; +- Evaluating a script from a file; +- Capturing commands in a file; +- Managing views; +- Displaying objects. + +In addition, **Test Harness** provides commands to create and manipulate curves and surfaces (geometry) and shapes, access visualization services, work with OCAF documents, perform data exchange, etc. + +You can add custom commands to test or demonstrate any new functionalities, which you develop. + +For more details, see @ref occt_user_guides__test_harness "Draw Test Harness Manual". + +@section intro_req Requirements + +Open CASCADE Technology is designed to be highly portable and is known to +work on wide range of platforms. +Current version is officially certified on Windows (IA-32 and x86-64), +Linux (x86-64), OS X / macOS (x86-64), Android (armv7 and x86), and +iOS (armv7, arm64) platforms. + +The tables below describe the recommended software configurations +for which OCCT is certified to work. + +@subsection intro_req_cpp C++ Compiler / IDE + +| OS | Compiler | +| --------- | ----------- | +| Windows | Microsoft Visual Studio: 2008 SP1, 2010 SP1, 2012 Update 4, 2013 Update 5, 2015 Update 3, 2017 1, 2019
, LLVM (ClangCL), GCC 4.3+ (Mingw-w64)| +| Linux | GNU gcc 4.3+
LLVM CLang 3.6+ | +| OS X / macOS | XCode 6 or newer | +| Android | NDK r10, GNU gcc 4.8 or newer | +| Web | Emscripten SDK 1.39 or newer (CLang) | + +1) VC++ 141 64-bit is used for regular testing and for building binary package of official release of OCCT on Windows. + +@subsection intro_req_libs Third-party libraries and tools + +The following third-party libraries and tools are not included in OCCT sources but are either required or can be optionally used for the indicated components of OCCT. +They are not needed if relevant component is not needed. + +Note that pre-built packages of many of the listed libraries are available at +https://www.opencascade.com/content/3rd-party-components + +| Component | Where to find | Used for | Required or optional | +| --------- | ------------- | -------- | -------------------- | +| CMake 2.8+ | https://cmake.org/ | Build from sources | Optional | +| Intel TBB 4.x or later | https://www.threadingbuildingblocks.org/ | All | Optional (advanced parallelization of algorithms) | +| OpenGL 3.3+, OpenGL ES 2.0+ | System | Visualization | Required | +| OpenVR 1.10+ | https://github.com/ValveSoftware/openvr | Visualization | Optional (VR support) | +| Direct3D 9 | Windows | Visualization | Optional (integration with GUI using Direct3D) | +| FreeType 2.4.11-2.7.1 | https://sourceforge.net/projects/freetype/files/ | Visualization | Required | +| FreeImage 3.17.0+ | https://sourceforge.net/projects/freeimage/files | Visualization | Optional (support of common 2D graphic formats) | +| FFmpeg 3.1+ | https://www.ffmpeg.org/download.html | Visualization | Optional (video recording) | +| VTK 6.1+ | https://www.vtk.org/download/ | Visualization | Optional (VTK integration) | +| Flex 2.6.4+ and Bison 3.7.1+ | https://sourceforge.net/projects/winflexbison/ | Data Exchange | Optional (update of STEP and ExprIntrp parsers) | +| RapidJSON 1.1+ | https://rapidjson.org/ | Data Exchange | Optional (reading glTF files) | +| Tcl/Tk 8.6.3+
or ActiveTcl 8.6 | https://www.tcl.tk/software/tcltk/download.html
https://www.activestate.com/activetcl/downloads | DRAW Test Harness | Required | +| Qt Desktop: Qt 4.8.6+
Android: Qt 5.3.2+ | https://www.qt.io/download/ | Samples and demos | Optional (Qt samples) | +| Doxygen 1.8.5+ | https://www.doxygen.nl/download.html | Documentation | Required | +| Graphviz 2.38+ | https://graphviz.org/ | Documentation | Optional (dependency graphs) | + +@subsection intro_req_hw Hardware + +| Component | Requirement | +| --------- | ----------- | +| Minimum memory | 512 MB, 1 GB recommended | +| Free disk space (complete installation) | 600 MB approx. | + +On desktop, 3D viewer for optimal performance requires graphics processing unit (GPU) supporting OpenGL 3.3 or above. +Ray tracing requires OpenGL 4.0+ or OpenGL 3.3+ with *GL_ARB_texture_buffer_object_rgb32* extension. +Textures within ray tracing will be available only when *GL_ARB_bindless_texture extension* is provided by driver. + +On mobile platforms, OpenGL ES 2.0+ is required for 3D viewer (OpenGL ES 3.1+ is recommended). +The ray tracing is not yet available on mobile platforms. +Some old hardware might be unable to execute complex GLSL programs (e.g. with high number of light sources, clipping planes). + +OCCT 3D Viewer, in general, supports wide range of graphics hardware - from very old to new. +Therefore, if you observe some unexpected visual issues - first check for OpenGL driver update (or firmware update in case of mobile platforms); +but beware that driver update might also come with new bugs. +Don't forget to report these bugs to vendors. + +@section intro_install Download and Installation + +OCCT can be downloaded from https://www.opencascade.com/content/latest-release + +In most cases you would want to rebuild OCCT from sources on your platform (OS, compiler) before +using it in your project, to ensure binary compatibility and appropriate configuration of the library. +See @ref build_upgrade for instructions on building OCCT from sources on supported platforms. + +The following subsections describe how OCCT can be installed from ready-to-use packages on different platforms. + +@subsection intro_install_windows Windows + +On Windows Open CASCADE Technology with binaries precompiled by Visual C++ 2017 +can be installed using installation procedure available on official download page. + +**Recommendation:** + +If you have a previous version of OCCT installed on your station, +and you do not plan to use it along with the new version, you might want to uninstall +the previous version (using Control Panel, Add/Remove Programs) before +the installation of this new version, to avoid possible problems +(conflict of system variables, paths, etc). + +Full OCCT installation with reference documentation requires 1.8 Gb on disk. + +When the installation is complete, you will find the directories for 3rd party products +(some might be absent in case of custom installation) and the main **OCCT** directory: + +@figure{/introduction/images/overview_3rdparty.png} + +The contents of the OCCT-7.4.0 directory (called further "OCCT root", or $CASROOT) are as follows: + +@figure{/introduction/images/overview_installation.png, "The directory tree"} + + * **adm** This folder contains administration files, which allow rebuilding OCCT; + * **adm/cmake** This folder contains files of CMake building procedure; + * **adm/msvc** This folder contains Visual Studio projects for Visual C++ 2010, 2012, 2013, 2015, 2017 and 2019 which allow rebuilding OCCT under Windows platform in 32 and 64-bit mode; + * **adm/scripts** This folder contains auxiliary scripts for semi-automated building and packaging of OCCT for different platforms; + * **data** This folder contains CAD files in different formats, which can be used to test the OCCT functionality; + * **doc** This folder contains OCCT documentation in HTML and PDF format; + * **dox** This folder contains sources of OCCT documentation in plain text (MarkDown) format; + * **inc** This folder contains copies of all OCCT header files; + * **samples** This folder contains sample applications. + * **src** This folder contains OCCT source files. They are organized in folders, one per development unit; + * **tests** This folder contains scripts for OCCT testing. + * **tools** This folder contains sources of Inspector tool. + * **win64/vc10** This folder contains executable and library files built in optimize mode for Windows platform by Visual C++ 2010; + +@subsection intro_install_linux Linux + +OCCT is available as package "opencascade" in official repositories of many Linux distributions. + +See https://repology.org/project/opencascade/versions for overview of available repositories. + +@subsection intro_install_mac macOS + +On macOS, OCCT is available in Homebrew (https://formulae.brew.sh/formula/opencascade) +and MacPorts (https://ports.macports.org/port/opencascade/summary) repositories. + +@section intro_env Environment Variables + +To run any Open CASCADE Technology application you need to set the environment variables. + +### On Windows + +You can define the environment variables with env.bat script located in the +$CASROOT folder. This script accepts two arguments to be used: +the version of Visual Studio (vc10 -- vc142) and the architecture (win32 or win64). + +The additional environment settings necessary for compiling OCCT libraries and samples +by Microsoft Visual Studio can be set using script custom.bat located in the same folder. +You might need to edit this script to correct the paths to third-party libraries +if they are installed on your system in a non-default location. + +Script msvc.bat can be used with the same arguments for immediate launch of Visual Studio for (re)compiling OCCT. + +### On Unix + + + If OCCT was built by Code::Blocks, you can define the environment variables with env_cbp.sh or custom_cbp.sh script. + + If OCCT was built by Automake, you can define the environment variables with env_amk.sh or custom_amk.sh script. + +The scripts are located in the OCCT root folder. + +### Description of system variables: + + * **CASROOT** is used to define the root directory of Open CASCADE Technology; + * **PATH** is required to define the path to OCCT binaries and 3rdparty folder; + * **LD_LIBRARY_PATH** is required to define the path to OCCT libraries (on UNIX platforms only; **DYLD_LIBRARY_PATH** variable in case of macOS); + * **MMGT_OPT** (optional) if set to 1, the memory manager performs optimizations as described below; if set to 2, + Intel (R) TBB optimized memory manager is used; if 0 (default), every memory block is allocated + in C memory heap directly (via malloc() and free() functions). + In the latter case, all other options starting with *MMGT*, except MMGT_CLEAR, are ignored; + * **MMGT_CLEAR** (optional) if set to 1 (default), every allocated memory block is cleared by zeros; + if set to 0, memory block is returned as it is; + * **MMGT_CELLSIZE** (optional) defines the maximal size of blocks allocated in large pools of memory. Default is 200; + * **MMGT_NBPAGES** (optional) defines the size of memory chunks allocated for small blocks in pages + (operating-system dependent). Default is 10000; + * **MMGT_THRESHOLD** (optional) defines the maximal size of blocks that are recycled internally + instead of being returned to the heap. Default is 40000; + * **MMGT_MMAP** (optional) when set to 1 (default), large memory blocks are allocated using + memory mapping functions of the operating system; if set to 0, + they will be allocated in the C heap by malloc(); + * **CSF_LANGUAGE** (optional) defines default language of messages; + * **CSF_DEBUG** (optional, Windows only): if defined then a diagnostic message is displayed in case of an exception; + * **CSF_DEBUG_BOP** (optional): if defined then it should specify directory where diagnostic data on problems occured in Boolean operations will be saved; + * **CSF_MDTVTexturesDirectory** defines the directory for available textures when using texture mapping; + * **CSF_ShadersDirectory** (optional) defines the directory for GLSL programs for Ray Tracing renderer (embedded resources are used when variable is undefined); + * **CSF_SHMessage** (optional) defines the path to the messages file for *ShapeHealing*; + * **CSF_XSMessage** (optional) defines the path to the messages file for **STEP** and **IGES** translators; + * **CSF_StandardDefaults**, **CSF_StandardLiteDefaults*, **CSF_XCAFDefaults**, and **CSF_PluginDefaults** define paths to directory where configuration files for OCAF persistence are located (required for open/save operations with OCAF documents); + * **CSF_IGESDefaults** and **CSF_STEPDefaults** (optional) define paths to directory where resource files of **IGES** and **STEP** translators are located; + * **CSF_XmlOcafResource** is required in order to set the path to **XSD** resources, which defines XML grammar. + * **CSF_MIGRATION_TYPES** is required in order to read documents that contain old data types, such as *TDataStd_Shape*; + +@section intro_license License + +Open CASCADE Technology and all materials, including this documentation, is +Copyright (c) 1999-2020 by OPEN CASCADE S.A.S. All rights reserved. + +Open CASCADE Technology is free software; you can redistribute it and / or modify it under the terms of the +@ref license_lgpl_21 "GNU Lesser General Public License (LGPL) version 2.1", with additional @ref occt_lgpl_exception "exception". + +Note that LGPL imposes some obligations on the application linked with Open CASCADE Technology. +If you wish to use OCCT in a proprietary application, please pay a special attention to address the requirements of LGPL section 6. +At minimum the following should be considered: +1. Add the notice visible to the users of your application clearly stating that Open CASCADE Technology is used in this application, and that they have rights in this regard according to LGPL. + Such notice can be added in About dialog box (this is mandatory if this box contains copyright statements) or a similar place and/or in the documentation. + The text of LGPL license should be accessible to the user. +2. Make the copy of OCCT sources used by the application available to its users, and if necessary provide instructions on how to build it in a way compatible with the application. +3. Ensure that the user actually can exercise the right to run your application with a modified version of OCCT. + If the application is distributed in a form that does not allow the user to modify OCCT part (e.g. the application is linked to OCCT statically or is distributed via AppStore on iOS, GooglePlay on Android, Windows Store, etc.), + the application should be provided separately in a modifiable form, with all materials needed for the user to be able to run the application with a modified version of OCCT. + +If you want to use Open CASCADE Technology without being bound by LGPL requirements, +please contact Open CASCADE company for a commercial license. + +Note that Open CASCADE Technology is provided on an "AS IS" basis, WITHOUT +WARRANTY OF ANY KIND. The entire risk related to any use of the OCCT code and +materials is on you. See the @ref occt_public_license "license" text for formal +disclaimer. + +@section intro_acknowledge Acknowledgments + +The following parties are acknowledged for producing tools which are used within +Open CASCADE Technology libraries or for release preparation. + +You are hereby informed that all rights to the software listed below belong to its respective +authors and such software may not be freely available and/or be free of charge for any kind +of use or purpose. We strongly recommend that you carefully read the license of these products +and, in case you need any further information, directly contact their authors. + +**Qt** is a cross-platform application framework that is widely used for developing application software +with graphical user interface (GUI). Qt is free and open source software distributed under +the terms of the GNU Lesser General Public License. In OCCT Qt is used for programming samples. +If you need further information on Qt, refer to Qt Homepage (https://www.qt.io/) + +**Tcl** is a high-level programming language. Tk is a graphical user interface (GUI) toolkit, +with buttons, menus, listboxes, scrollbars, and so on. Taken together Tcl and Tk provide a solution +to develop cross-platform graphical user interfaces with a native look and feel. Tcl/Tk is under copyright by +Scriptics Corp., Sun Microsystems, and other companies. However, Tcl/Tk is an open source, and +the copyright allows you to use, modify, and redistribute Tcl/Tk for any purpose, without an +explicit license agreement and without paying any license fees or royalties. +To use Tcl/Tk, refer to the Licensing Terms (https://www.tcl.tk/software/tcltk/license.html). + +**FreeType 2** is developed by Antoine Leca, David Turner, Werner Lemberg and others. +It is a software font engine that is designed to be small, efficient, highly customizable and +portable while capable of producing high-quality output (glyph images). This product +can be used in graphic libraries, display servers, font conversion tools, +text image generation tools, and many other products. +FreeType 2 is released under two open-source licenses: BSD-like FreeType License and the GPL (https://www.freetype.org/license.html). + +**Intel(R) Threading Building Blocks (TBB)** offers a rich and complete approach to expressing parallelism in a C++ program. +It is a library that helps you to take advantage of multi-core processor performance without having to be a threading expert. +Threading Building Blocks is not just a threads-replacement library. It represents a higher-level, task-based parallelism that +abstracts platform details and threading mechanisms for scalability and performance. +TBB version 2017 is available under Apache 2.0 license, while older versions +until 4.4 are available under GPLv2 license with the runtime exception (https://www.threadingbuildingblocks.org). + +**OpenGL** is an industry standard API for 3D graphics used by OCCT for +implementation of 3D viewer. OpenGL specification is developed by the +Khronos group, https://www.khronos.org/opengl/. OCCT code includes header +file *glext.h* obtained from Khronos web site. + +**OpenVR** is an API and runtime that allows access to VR hardware from multiple vendors +without requiring that applications have specific knowledge of the hardware they are targeting. +OpenVR is optionally used by OCCT for VR support. +OpenVR is released under BSD-like license (https://github.com/ValveSoftware/openvr/blob/master/LICENSE). + +**VTK** -- The **Visualization Toolkit (VTK)** is an open-source, freely available software system for 3D computer graphics, image processing and visualization. +OCCT VIS component provides adaptation functionality for visualization of OCCT topological shapes by means of VTK library. +If you need further information on VTK, refer to VTK Homepage https://www.vtk.org/. + +**Doxygen** developed by Dimitri van Heesch is open source documentation system for +C++, C, Java, Objective-C, Python, IDL, PHP and C#. This product is used in Open CASCADE Technology +for automatic creation of Technical Documentation from C++ header files. +If you need further information on Doxygen, refer to https://www.stack.nl/~dimitri/doxygen/index.html. + +**Graphviz** is open source graph visualization software developed by John Ellson, Emden Gansner, Yifan Hu and Arif Bilgin. +Graph visualization is representiation of structured information as diagrams of abstract graphs and networks. +This product is used together with Doxygen in Open CASCADE Technology for automatic creation of Technical Documentation +(generation of dependency graphs). Current versions of Graphviz are licensed on an open source +basis under The Eclipse Public License (EPL) (https://www.graphviz.org/license/). + +**Inno Setup** is a free script-driven installation system created in CodeGear Delphi by Jordan Russell. +In OCCT Inno Setup is used to create Installation Wizard on Windows. +It is licensed under Inno Setup License (http://www.jrsoftware.org/files/is/license.txt). + +**FreeImage** is an Open Source library supporting popular graphics image formats, such as PNG, BMP, JPEG, TIFF, +and others used by multimedia applications. This library is developed by Hervé Drolon and Floris van den Berg. +FreeImage is easy to use, fast, multithreading safe, compatible with all 32-bit or 64-bit versions of Windows, +and cross-platform (works both with Linux and Mac OS X). FreeImage is optionally used by OCCT to work +with images, on conditions of the FreeImage Public License (FIPL) (https://freeimage.sourceforge.net/freeimage-license.txt). + +**FFmpeg** is an Open Source framework supporting various image, video and audio codecs. +FFmpeg is optionally used by OCCT for video recording, on LGPL conditions (https://www.ffmpeg.org/legal.html). + +**David M. Gay's floating point routines** (dtoa.c) are used for fast reading of floating point values from text strings. +These routines are available under MIT-like license (see https://www.netlib.org/fp/). + +**Flex** is a generator of lexical analyzers (scanners), available under BSD license (https://github.com/westes/flex). + +GNU **Bison** is a parser generator used (together with **Flex**) for implementation of reader of STEP file format and parser of expressions. +It is available under GNU GPL v3 license (https://www.gnu.org/software/bison/). + +**Delabella** is an open-source, cross-platform implementation of the Newton Apple Wrapper algorithm producing 2D Delaunay triangulation. +Delabella is used by BRepMesh as one of alternative 2D triangulation algorithms. +Delabella is licensed under the MIT license (https://github.com/msokalski/delabella). + +**CMake** is an open-source, cross-platform family of tools designed to build, test and package software. +CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice. +OCCT uses CMake as a build system. CMake is available under BSD 3-Clause license. +See more at https://cmake.org/ + +**Cotire** (compile time reducer) is a CMake module that speeds up the build process of CMake based build systems +by fully automating techniques as precompiled header usage and single compilation unit builds for C and C++. +Cotire is included in OCCT repository and used optionally by OCCT CMake scripts to accelerate builds by use of precompiled headers. +Cotire is licensed under the MIT license (https://github.com/sakra/cotire/blob/master/license). + +**MikTEX** is up-to-date implementation of TeX/LaTeX and related programs for Windows. It is used +for generation of User and Developer Guides in PDF format. See https://miktex.org for information +on this tool. + +**RapidJSON** is an Open Source JSON parser and generator for C++. +RapidJSON is optionally used by OCCT for reading glTF files (https://rapidjson.org/). + +**DejaVu** fonts are a font family based on the Vera Fonts under a permissive license (MIT-like, https://dejavu-fonts.github.io/License.html). +DejaVu Sans (basic Latin sub-set) is used by OCCT as fallback font when no system font is available. + +Adobe Systems, Inc. provides **Adobe Reader**, which can be used to view files in Portable Document Format (PDF). + +**CAS.CADE** and **Open CASCADE** are registered trademarks of OPEN CASCADE S.A.S. + +**Linux** is a registered trademark of Linus Torvalds. + +**Windows** is a registered trademark of Microsoft Corporation in the United States and other countries. + +**Mac**, **OS X**, **macOS**, and the Mac logo are trademarks of Apple Inc., registered in the U.S. and other countries. + +**Android** is a trademark of Google LLC. Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/overview/images/overview_3rdparty.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/overview/images/overview_3rdparty.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/overview/images/overview_c__ie.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/overview/images/overview_c__ie.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/overview/images/overview_draw.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/overview/images/overview_draw.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/overview/images/overview_installation.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/overview/images/overview_installation.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/overview/images/overview_mvc.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/overview/images/overview_mvc.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/overview/images/overview_qt.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/overview/images/overview_qt.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/overview/images/sample_ios_uikit.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/overview/images/sample_ios_uikit.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/overview/images/samples_java_android_occt.jpg and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/overview/images/samples_java_android_occt.jpg differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/overview/images/samples_qml_android_occt.jpg and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/overview/images/samples_qml_android_occt.jpg differ diff -Nru opencascade-7.4.1+dfsg1/dox/overview/overview.md opencascade-7.5.1+dfsg1/dox/overview/overview.md --- opencascade-7.4.1+dfsg1/dox/overview/overview.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/overview/overview.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,571 +0,0 @@ -Overview {#mainpage} -======== - -@tableofcontents - -@htmlonly
@endhtmlonly -@figure{/resources/occt_logo.png} -@htmlonly
@endhtmlonly - -@section OCCT_OVW_SECTION_1 Welcome - -Welcome to Open CASCADE Technology (OCCT), a software development platform -providing services for 3D surface and solid modeling, CAD data exchange, and -visualization. Most of OCCT functionality is available in the form of C++ -libraries. OCCT can be best applied in development of software dealing with 3D -modeling (CAD), manufacturing / measuring (CAM) or numerical simulation (CAE). - -@section OCCT_OVW_SECTION_2 Copyrights - -Open CASCADE Technology and all materials, including this documentation, is -Copyright (c) 1999-2018 by OPEN CASCADE S.A.S. All rights reserved. - -@htmlonly
@endhtmlonly -https://www.opencascade.com -@figure{/resources/occ_logo.png} -@htmlonly
@endhtmlonly - - License --------- - -Open CASCADE Technology is free software; you can redistribute it and / or modify it under the terms of the -@ref license_lgpl_21 "GNU Lesser General Public License (LGPL) version 2.1", with additional @ref occt_lgpl_exception "exception". - -Note that LGPL imposes some obligations on the application linked with Open CASCADE Technology. -If you wish to use OCCT in a proprietary application, please pay a special attention to address the requirements of LGPL section 6. -At minimum the following should be considered: -1. Add the notice visible to the users of your application clearly stating that Open CASCADE Technology is used in this application, and that they have rights in this regard according to LGPL. - Such notice can be added in About dialog box (this is mandatory if this box contains copyright statements) or a similar place and/or in the documentation. - The text of LGPL license should be accessible to the user. -2. Make the copy of OCCT sources used by the application available to its users, and if necessary provide instructions on how to build it in a way compatible with the application. -3. Ensure that the user actually can exercise the right to run your application with a modified version of OCCT. - If the application is distributed in a form that does not allow the user to modify OCCT part (e.g. the application is linked to OCCT statically or is distributed via AppStore on iOS, GooglePlay on Android, Windows Store, etc.), - the application should be provided separately in a modifiable form, with all materials needed for the user to be able to run the application with a modified version of OCCT. - -If you want to use Open CASCADE Technology without being bound by LGPL requirements, -please contact Open CASCADE company for a commercial license. - -Note that Open CASCADE Technology is provided on an "AS IS" basis, WITHOUT -WARRANTY OF ANY KIND. The entire risk related to any use of the OCCT code and -materials is on you. See the @ref occt_public_license "license" text for formal -disclaimer. - - Trademark information ----------------------- - -You are hereby informed that all software is a property of its respective authors and is protected by -international and domestic laws on intellectual property and trademarks. -Should you need further information, directly contact the authors. - -**CAS.CADE** and **Open CASCADE** are registered trademarks of -OPEN CASCADE S.A.S. - -**Linux** is a registered trademark of Linus Torvalds. - -**Windows** is a registered trademark of Microsoft Corporation in the United States and other countries. - -**Mac** and the Mac logo are trademarks of Apple Inc., registered in the U.S. and other countries. - - Acknowledgments ------------------ - -The following parties are acknowledged for producing tools which are used within -Open CASCADE Technology libraries or for release preparation. - -You are hereby informed that all rights to the software listed below belong to its respective -authors and such software may not be freely available and/or be free of charge for any kind -of use or purpose. We strongly recommend that you carefully read the license of these products -and, in case you need any further information, directly contact their authors. - -**Qt** is a cross-platform application framework that is widely used for developing application software -with graphical user interface (GUI). Qt is free and open source software distributed under -the terms of the GNU Lesser General Public License. In OCCT Qt is used for programming samples. -If you need further information on Qt, refer to Qt Homepage (https://www.qt.io/) - -**Tcl** is a high-level programming language. Tk is a graphical user interface (GUI) toolkit, -with buttons, menus, listboxes, scrollbars, and so on. Taken together Tcl and Tk provide a solution -to develop cross-platform graphical user interfaces with a native look and feel. Tcl/Tk is under copyright by -Scriptics Corp., Sun Microsystems, and other companies. However, Tcl/Tk is an open source, and -the copyright allows you to use, modify, and redistribute Tcl/Tk for any purpose, without an -explicit license agreement and without paying any license fees or royalties. -To use Tcl/Tk, refer to the Licensing Terms (https://www.tcl.tk/software/tcltk/license.html). - -**FreeType 2** is developed by Antoine Leca, David Turner, Werner Lemberg and others. -It is a software font engine that is designed to be small, efficient, highly customizable and -portable while capable of producing high-quality output (glyph images). This product -can be used in graphic libraries, display servers, font conversion tools, -text image generation tools, and many other products. -FreeType 2 is released under two open-source licenses: BSD-like FreeType License and the GPL (https://www.freetype.org/license.html). - -**Intel(R) Threading Building Blocks (TBB)** offers a rich and complete approach to expressing parallelism in a C++ program. -It is a library that helps you to take advantage of multi-core processor performance without having to be a threading expert. -Threading Building Blocks is not just a threads-replacement library. It represents a higher-level, task-based parallelism that -abstracts platform details and threading mechanisms for scalability and performance. -TBB version 2017 is available under Apache 2.0 license, while older versions -until 4.4 are available under GPLv2 license with the runtime exception (https://www.threadingbuildingblocks.org). - -**OpenGL** is an industry standard API for 3D graphics used by OCCT for -implementation of 3D viewer. OpenGL specification is developed by the -Khronos group, https://www.khronos.org/opengl/. OCCT code includes header -file *glext.h* obtained from Khronos web site. - -**VTK** -- The **Visualization Toolkit (VTK)** is an open-source, freely available software system for 3D computer graphics, image processing and visualization. OCCT VIS component provides adaptation functionality for visualization of OCCT topological shapes by means of VTK library. If you need further information on VTK, refer to VTK Homepage https://www.vtk.org/. - -**Doxygen** developed by Dimitri van Heesch is open source documentation system for -C++, C, Java, Objective-C, Python, IDL, PHP and C#. This product is used in Open CASCADE Technology -for automatic creation of Technical Documentation from C++ header files. -If you need further information on Doxygen, refer to https://www.stack.nl/~dimitri/doxygen/index.html. - -**Graphviz** is open source graph visualization software developed by John Ellson, Emden Gansner, Yifan Hu and Arif Bilgin. -Graph visualization is representiation of structured information as diagrams of abstract graphs and networks. -This product is used together with Doxygen in Open CASCADE Technology for automatic creation of Technical Documentation -(generation of dependency graphs). Current versions of Graphviz are licensed on an open source -basis under The Eclipse Public License (EPL) (https://www.graphviz.org/license/). - -**Inno Setup** is a free script-driven installation system created in CodeGear Delphi by Jordan Russell. -In OCCT Inno Setup is used to create Installation Wizard on Windows. -It is licensed under Inno Setup License (http://www.jrsoftware.org/files/is/license.txt). - -**FreeImage** is an Open Source library supporting popular graphics image formats, such as PNG, BMP, JPEG, TIFF, -and others used by multimedia applications. This library is developed by Hervé Drolon and Floris van den Berg. -FreeImage is easy to use, fast, multithreading safe, compatible with all 32-bit or 64-bit versions of Windows, -and cross-platform (works both with Linux and Mac OS X). FreeImage is optionally used by OCCT to work -with images, on conditions of the FreeImage Public License (FIPL) (https://freeimage.sourceforge.net/freeimage-license.txt). - -**David M. Gay's floating point routines** (dtoa.c) are used for fast reading of floating point values from text strings. -These routines are available under MIT-like license (see https://www.netlib.org/fp/). - -**CMake** is an open-source, cross-platform family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice. -OCCT uses CMake as a build system. CMake is available under BSD 3-Clause license. See more at https://cmake.org/ - -**Cotire** (compile time reducer) is a CMake module that speeds up the build process of CMake based build systems -by fully automating techniques as precompiled header usage and single compilation unit builds for C and C++. -Cotire is included in OCCT repository and used optionally by OCCT CMake scripts to accelerate builds by use of precompiled headers. -Cotire is licensed under the MIT license (https://github.com/sakra/cotire/blob/master/license). - -**FFmpeg** is an Open Source framework supporting various image, video and audio codecs. -FFmpeg is optionally used by OCCT for video recording, on LGPL conditions (https://www.ffmpeg.org/legal.html). - -**MikTEX** is up-to-date implementation of TeX/LaTeX and related programs for Windows. It is used -for generation of User and Developer Guides in PDF format. See https://miktex.org for information -on this tool. - -**RapidJSON** is an Open Source JSON parser and generator for C++. -RapidJSON is optionally used by OCCT for reading glTF files (https://rapidjson.org/). - -Adobe Systems, Inc. provides **Adobe Reader**, which can be used to view files in Portable Document Format (PDF). - -@section OCCT_OVW_SECTION_3 Documentation - -OCCT documentation is provided in several forms: - -- This overview provides general description of OCCT structure, functionality, modules, and features. - It is available in HTML format (generated by Doxygen) and includes User and Developer Guides. - The sources of this documentation are contained in **dox** subdirectory of OCCT sources - (plain text format is used, with mixed MarkDown / Doxygen syntax mark-up). - -- User and Developer Guides describing in details OCCT modules and development tools are also available in - Adobe Portable Document Format (PDF). To read this format, you need Adobe Acrobat Reader, - which is a freeware and can be downloaded from the Adobe site. - -- Full reference documentation covering all OCCT classes generated automatically by Doxygen - software is provided in HTML format. - Reference documentation is presented in **Modules --> Toolkits --> Packages --> Classes** - logic structure with cross-references to all OCCT classes and complete in-browser search by all classes. - -See @ref occt_dev_guides__documentation "OCCT Documentation Guide" for details on OCCT documentation system. - -**Generation of HTML documentation** - -To generate HTML documentation from sources contained in *dox* subdirectory, -you need to have Tcl and Doxygen 1.8.5 (or above) installed on your system. - -Use script **gendoc** (batch file on Windows, shell script on Linux / Mac OSX) to generate documentation. - -To generate Overview documentation: - - cmd> gendoc -overview - -To generate Reference manual: - - cmd> gendoc -refman - -Run this command without arguments to get help on supported options. - -@section OCCT_OVW_SECTION_5 Requirements - -Open CASCADE Technology is designed to be highly portable and is known to -work on wide range of platforms. -Current version is officially certified on Windows (IA-32 and x86-64), -Linux (x86-64), OS X / macOS (x86-64), Android (armv7 and x86), and -iOS (armv7, arm64) platforms. - -The tables below describe the recommended software configurations -for which OCCT is certified to work. - -@subsection overview_req_cpp C++ Compiler / IDE - -| OS | Compiler | -| --------- | ----------- | -| Windows | Microsoft Visual Studio: 2008 SP1, 2010 SP1, 2012 Update 4, 2013 Update 5, 2015 Update 3, 2017 1, 2019
GCC 4.3+ (Mingw-w64)| -| Linux | GNU gcc 4.3+
LLVM CLang 3.6+ | -| OS X / macOS | XCode 6 or newer | -| Android | NDK r10, GNU gcc 4.8 or newer | - -1) VC++ 141 64-bit is used for regular testing and for building binary package of official release of OCCT on Windows. - -@subsection overview_req_libs Third-party libraries - -| Component | Requirement | -| --------- | ----------- | -| Graphic library | OpenGL 3.3+, OpenGL ES 2.0+
Direct3D 9 | -| Qt (for samples and demos) | Desktop: Qt 4.8.6+ https://www.qt.io/download/
Android: Qt 5.3.2+ https://www.qt.io/download/ | -| TCL (for testing tools) | Tcl/Tk 8.6.3+ https://www.tcl.tk/software/tcltk/download.html
or ActiveTcl 8.6 https://www.activestate.com/activetcl/downloads (for Windows)| -| Freetype (for text rendering) | FreeType 2.4.11-2.7.1 https://sourceforge.net/projects/freetype/files/ | -| FreeImage (optional, for support of common 2D graphic formats) | FreeImage 3.17.0+ https://sourceforge.net/projects/freeimage/files | -| FFmpeg (optional, for video recording) | FFmpeg 3.1+ https://www.ffmpeg.org/download.html | -| RapidJSON (optional, for reading glTF) | RapidJSON 1.1+ https://rapidjson.org/ | -| Intel TBB (optional, for multithreaded algorithms) | TBB 4.x or 5.x https://www.threadingbuildingblocks.org/ | -| VTK (for VTK Integration Services | VTK 6.1+ https://www.vtk.org/download/ | -| Doxygen (optional for building documentation) | Doxygen 1.8.5+ https://www.stack.nl/~dimitri/doxygen/download.html | - -@subsection overview_req_hw Hardware - -| Component | Requirement | -| --------- | ----------- | -| Minimum memory | 512 MB, 1 GB recommended | -| Free disk space (complete installation) | 600 MB approx. | - -On desktop, 3D viewer for optimal performance requires graphics processing unit (GPU) supporting OpenGL 3.3 or above. -Ray tracing requires OpenGL 4.0+ or OpenGL 3.3+ with *GL_ARB_texture_buffer_object_rgb32* extension. -Textures within ray tracing will be available only when *GL_ARB_bindless_texture extension* is provided by driver. - -On mobile platforms, OpenGL ES 2.0+ is required for 3D viewer (OpenGL ES 3.1+ is recommended). -The ray tracing is not yet available on mobile platforms. -Some old hardware might be unable to execute complex GLSL programs (e.g. with high number of light sources, clipping planes). - -OCCT 3D Viewer, in general, supports wide range of graphics hardware - from very old to new. -Therefore, if you observe some unexpected visual issues - first check for OpenGL driver update (or firmware update in case of mobile platforms); -but beware that driver update might also come with new bugs. -Don't forget to report these bugs to vendors. - -@section OCCT_OVW_SECTION_4 Installation - -In most cases you need to rebuild OCCT on your platform (OS, compiler) before -using it in your project, to ensure binary compatibility. -See @ref occt_dev_guides__building for instructions on -building OCCT from sources on supported platforms. - -@subsection OCCT_OVW_SECTION_4_1 Using Windows installer - -On Windows Open CASCADE Technology can be installed with binaries precompiled by -Visual C++ 2010 with installation procedure. - -**Recommendation:** - -If you have a previous version of OCCT installed on your station, -and you do not plan to use it along with the new version, you might want to uninstall -the previous version (using Control Panel, Add/Remove Programs) before -the installation of this new version, to avoid possible problems -(conflict of system variables, paths, etc). - -**Attention:** For full installation OCCT requires approximately 650 Mb of disk space, -but during the installation process you will need 1,2 Gb of free disk space. - -OCCT installation with reference documentation requires 1,4 Gb on disk. - - * Download the OCCT installer from OPEN CASCADE web site using the link. you have been provided - * Launch the installer and follow the instructions. - -The includes and binaries of third-party libraries necessary for building and launching -OCCT are included into binary distribution (built with Visual C++ 2010). -When the installation is complete, you will find the directories for 3rd party products -(some might be absent in case of custom installation) and the main **OCCT** directory: - -@figure{/overview/images/overview_3rdparty.png} - -The contents of the OCCT-7.4.0 directory (called further "OCCT root", or $CASROOT) are as follows: - -@figure{/overview/images/overview_installation.png, "The directory tree"} - - * **adm** This folder contains administration files, which allow rebuilding OCCT; - * **adm/cmake** This folder contains files of CMake building procedure; - * **adm/msvc** This folder contains Visual Studio projects for Visual C++ 2010, 2012, 2013, 2015, 2017 and 2019 which allow rebuilding OCCT under Windows platform in 32 and 64-bit mode; - * **data** This folder contains CAD files in different formats, which can be used to test the OCCT functionality; - * **doc** This folder contains OCCT documentation in HTML and PDF format; - * **dox** This folder contains sources of OCCT documentation in plain text (MarkDown) format; - * **inc** This folder contains copies of all OCCT header files; - * **samples** This folder contains sample applications. - * **src** This folder contains OCCT source files. They are organized in folders, one per development unit; - * **tests** This folder contains scripts for OCCT testing. - * **tools** This folder contains sources of Inspector tool. - * **win64/vc10** This folder contains executable and library files built in optimize mode for Windows platform by Visual C++ 2010; - -@section OCCT_OVW_SECTION_4_2 Environment Variables - -To run any Open CASCADE Technology application you need to set the environment variables. - -### On Windows - -You can define the environment variables with env.bat script located in the -$CASROOT folder. This script accepts two arguments to be used: -the version of Visual Studio (vc10 -- vc142) and the architecture (win32 or win64). - -The additional environment settings necessary for compiling OCCT libraries and samples -by Microsoft Visual Studio can be set using script custom.bat located in the same folder. -You might need to edit this script to correct the paths to third-party libraries -if they are installed on your system in a non-default location. - -Script msvc.bat can be used with the same arguments for immediate launch of Visual Studio for (re)compiling OCCT. - -### On Unix - - - If OCCT was built by Code::Blocks, you can define the environment variables with env_cbp.sh or custom_cbp.sh script. - - If OCCT was built by Automake, you can define the environment variables with env_amk.sh or custom_amk.sh script. - -The scripts are located in the OCCT root folder. - - -### Description of system variables: - - * **CASROOT** is used to define the root directory of Open CASCADE Technology; - * **PATH** is required to define the path to OCCT binaries and 3rdparty folder; - * **LD_LIBRARY_PATH** is required to define the path to OCCT libraries (on UNIX platforms only; **DYLD_LIBRARY_PATH** variable in case of macOS); - * **MMGT_OPT** (optional) if set to 1, the memory manager performs optimizations as described below; if set to 2, - Intel (R) TBB optimized memory manager is used; if 0 (default), every memory block is allocated - in C memory heap directly (via malloc() and free() functions). - In the latter case, all other options starting with *MMGT*, except MMGT_CLEAR, are ignored; - * **MMGT_CLEAR** (optional) if set to 1 (default), every allocated memory block is cleared by zeros; - if set to 0, memory block is returned as it is; - * **MMGT_CELLSIZE** (optional) defines the maximal size of blocks allocated in large pools of memory. Default is 200; - * **MMGT_NBPAGES** (optional) defines the size of memory chunks allocated for small blocks in pages - (operating-system dependent). Default is 10000; - * **MMGT_THRESHOLD** (optional) defines the maximal size of blocks that are recycled internally - instead of being returned to the heap. Default is 40000; - * **MMGT_MMAP** (optional) when set to 1 (default), large memory blocks are allocated using - memory mapping functions of the operating system; if set to 0, - they will be allocated in the C heap by malloc(); - * **CSF_LANGUAGE** (optional) defines default language of messages; - * **CSF_DEBUG** (optional, Windows only): if defined then a diagnostic message is displayed in case of an exception; - * **CSF_DEBUG_BOP** (optional): if defined then it should specify directory where diagnostic data on problems occured in Boolean operations will be saved; - * **CSF_MDTVTexturesDirectory** defines the directory for available textures when using texture mapping; - * **CSF_ShadersDirectory** (optional) defines the directory for GLSL programs for Ray Tracing renderer (embedded resources are used when variable is undefined); - * **CSF_SHMessage** (optional) defines the path to the messages file for *ShapeHealing*; - * **CSF_XSMessage** (optional) defines the path to the messages file for **STEP** and **IGES** translators; - * **CSF_StandardDefaults**, **CSF_StandardLiteDefaults*, **CSF_XCAFDefaults**, and **CSF_PluginDefaults** define paths to directory where configuration files for OCAF persistence are located (required for open/save operations with OCAF documents); - * **CSF_IGESDefaults** and **CSF_STEPDefaults** (optional) define paths to directory where resource files of **IGES** and **STEP** translators are located; - * **CSF_XmlOcafResource** is required in order to set the path to **XSD** resources, which defines XML grammar. - * **CSF_MIGRATION_TYPES** is required in order to read documents that contain old data types, such as *TDataStd_Shape*; - -@section OCCT_OVW_SECTION_7 Getting Started - -@subsection OCCT_OVW_SECTION_7_1 Draw Test Harness - -Draw is a command interpreter based on TCL and a graphical system used for testing and demonstrating OCCT modeling libraries. - -Draw can be used interactively to create, display and modify objects such as curves, surfaces and topological shapes. - -@figure{/overview/images/overview_draw.png} - -Scripts can be written to customize Draw and perform tests. -New types of objects and new commands can be added using C++ programming language. - -Draw contains: - - * A command interpreter based on TCL command language. - * A 2D an 3D graphic viewer with support of operations such as zoom, pan, rotation and full-screen views. - * An optional set of geometric commands to create and modify curves and surfaces and to use OCCT geometry algorithms. - * A set of topological commands to create and modify BRep shapes and to use OCCT topology algorithms. - * A set of graphic commands for view and display operations including Mesh Visualization Service. - * A set of Application framework commands for handling of files and attributes. - * A set of Data Exchange commands for translation of files from various formats (IGES,STEP) into OCCT shapes. - * A set of Shape Healing commands: check of overlapping edges, approximation of a shape to BSpline, etc. - -You can add new custom test harness commands to Draw in order to test -or demonstrate a new functionality, which you are developing. - -Currently DRAW Test Harness is a single executable called *DRAWEXE*. - -Commands grouped in toolkits can be loaded at run-time thereby implementing dynamically loaded plug-ins. -Thus you can work only with the commands that suit your needs adding -the commands dynamically without leaving the Test Harness session. - -Declaration of available plug-ins is done through special resource file(s). -The *pload* command loads the plug-in in accordance with -the specified resource file and activates the commands implemented in the plug-in. - -The whole process of using the plug-in mechanism as well as the instructions for extending Test Harness is described in the @ref occt_user_guides__test_harness. - -Draw Test Harness provides an environment for OCCT automated testing system. -Check its @ref occt_dev_guides__tests "Automated Testing System" for details. - -Remarks: - -* The DRAWEXE executable is delivered with the installation procedure on Windows platform only. -* To start it, launch DRAWEXE executable from Open CASCADE Technology/Draw Test Harness item of the Start\\Programs menu. - -@subsection OCCT_OVW_SECTION_7_2 Experimenting with Draw Test Harness - - Running Draw ------------- - -**On Linux:** - -* If OCCT was built by Code::Blocks use $CASROOT/draw.sh file to launch *DRAWEXE* executable. - -Draw[1]> prompt appears in the command window - -Type *pload ALL* - -**On Windows:** - -Launch Draw executable from Open CASCADE Technology\\Test Harness\\Draw Test Harness -item of the Start\\Programs menu or Use $CASROOT\\draw.bat file to launch *DRAWEXE* executable. - -Draw[1]> prompt appears in the command window - -Type pload ALL - -**Creating your first geometric objects** - -1. In the command window, type *axo* to create an axonometric view -2. Type *box b -10 -10 -10 20 20 20* to create a cube *b* of size 20, parallel to the X Y Z axis and centered on the origin. The cube will be displayed in the axonometric view in wireframe mode. -3. Type *fit* to fill the viewer with the cube -4. Type *pcylinder c 2 30* to create a cylinder *c* of radius 2 and height 30. The cylinder will be displayed in addition to the cube - -**Manipulating the view** - -1. Type *clear* to erase the view -2. Type *donly c* to display the cylinder only -3. Type *donly b* to display the cube only -4. Type *hlr hlr b* to display the cube in the hidden line removal mode - -**Running demonstration files** - -1. Type *cd ../..* to return to the root directory -2. Type *cd samples/tcl* to reach the *DrawResources* directory -3. Type *source \* to run the demonstration file provided with Open CASCADE. The following demonstration files are available: - * DataExchangeDemo.tcl: demonstrates sample sequence of operations with writing and reading IGES file - * ModelingDemo.tcl: demonstrates creation of simple shape and displaying it in HLR mode - * VisualizationDemo.tcl: demonstrates use of 3d viewer - * cad.tcl: creates solid shape looking like abbreviation "CAD" - * bottle.tcl: creates bottle as in OCCT Tutorial - * drill.tcl: creates twist drill bit shape - * cutter.tcl: creates milling cutter shape - * xde.tcl: demonstrates creation of simple assembly in XDE - * materials.tcl: demonstrates visual properties of materials supported by 3d viewer - * raytrace.tcl: demonstrates use of ray tracing display in 3d viewer - * dimensions.tcl: demonstrates use of dimensions, clipping, and capping in 3d viewer - -**Getting Help** - -1. Type *help* to see all available commands -2. Type *help \* to find out the arguments for a given command - -@subsection OCCT_OVW_SECTION_7_3 Programming Samples - -@subsubsection OCCT_OVW_SECTION_7_3_1 MFC - -Visual C++ programming samples containing 10 Visual C++ projects -illustrating how to use a particular module or functionality. - -The list of MFC samples: - - * Geometry - * Modeling - * Viewer2d - * Viewer3d - * ImportExport - * Ocaf - * Triangulation - * HLR - * Animation - * Convert - -@figure{/overview/images/overview_mvc.png} - -**Remarks:** - - * MFC samples are available only on Windows platform; - * To start a sample use Open CASCADE Technology\\Samples\\Mfc\\ item of the Start\\Programs menu; - * Read carefully readme.txt to learn about launching and compilation options. - -See \subpage samples_mfc_standard "Readme" for details. - -@subsubsection OCCT_OVW_SECTION_7_3_2 Qt - -OCCT contains three samples based on Qt application framework - - Import Export -------------- - - Import Export programming sample contains 3D Viewer and Import / Export functionality. - -@figure{/overview/images/overview_qt.png} - - Tutorial ---------- - -The Qt programming tutorial teaches how to use Open CASCADE Technology services to model a 3D object. -The purpose of the tutorial is not to explain all OCCT classes but -to help start thinking in terms of the Open CASCADE Technology. - -This tutorial assumes that the user has experience in using and setting up C++. -From the viewpoint of programming, Open CASCADE Technology is designed -to enhance user's C++ tools with high performance modeling classes, methods and functions. -The combination of these resources allows creating substantial applications. - -**See also:** @ref occt__tutorial "OCCT Tutorial" - -**Remarks:** - - * Qt samples are available on all supported platforms; - * To start a sample on Windows use Open CASCADE Technology\\Samples\\Qt\\ item of the Start\\Programs menu. - -@subsubsection OCCT_OVW_SECTION_7_3_3 C# - -C# sample demonstrates integration of OCCT 3D Viewer and Import / Export functionality into .NET applications (using Windows Forms and WPF front ends). - -@figure{/overview/images/overview_c__ie.png} - -Import: - - * BRep - * Iges - * Step - -Export: - - * Brep - * Iges - * Step - * Stl - * Vrml - -See \subpage samples_csharp_occt "C# sample Readme" for details. - -There is also another C# example with the same functionality, which demonstrates the integration of Direct3D Viewer into .NET applications using WPF front end. - -See \subpage samples_csharp_direct3d "Direct3D C# sample Readme" for details. - -@subsubsection OCCT_OVW_SECTION_7_3_4 Android - -There are two samples are representing usage OCCT framework on Android mobile platform. They represent an OCCT-based 3D-viewer with CAD import support in formats BREP, STEP and IGES: jniviewer (java) and AndroidQt (qt+qml) - -jniviewer -@figure{/overview/images/samples_java_android_occt.jpg} -Java -- See \subpage samples_java_android_occt "Android Java sample Readme" for details. - -AndroidQt -@figure{/overview/images/samples_qml_android_occt.jpg} -Qt -- See \subpage samples_qml_android_occt "Android Qt sample Readme" for details. - -@subsubsection OCCT_OVW_SECTION_7_3_5 iOS - -There is a sample demonstrating usage of OCCT on iOS with Apple UIKit framework. - -@figure{/overview/images/sample_ios_uikit.png} - -See \subpage occt_samples_ios_uikit "iOS sample Readme" for details. Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/resources/occ_logo.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/resources/occ_logo.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/samples/draw_scripts.md opencascade-7.5.1+dfsg1/dox/samples/draw_scripts.md --- opencascade-7.4.1+dfsg1/dox/samples/draw_scripts.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/samples/draw_scripts.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,125 @@ +Draw Demo Scripts {#samples__draw_scripts} +================ + +All demo scripts are provided with OCCT sources and locate in CASROOT/samples/tcl. To play around them please +follow the steps below: + +1. Start DRAWEXE +2. Type *cd ../..* to return to the root directory +3. Type *cd samples/tcl* to reach the *DrawResources* directory +4. Type *source \* to run the demonstration file provided with Open CASCADE. The following demonstration +files are available: + * DataExchangeDemo.tcl: demonstrates sample sequence of operations with writing and reading IGES file + * ModelingDemo.tcl: demonstrates creation of simple shape and displaying it in HLR mode + * VisualizationDemo.tcl: demonstrates use of 3d viewer + * cad.tcl: creates solid shape looking like abbreviation "CAD" + * bottle.tcl: creates bottle as in OCCT Tutorial + * drill.tcl: creates twist drill bit shape + * cutter.tcl: creates milling cutter shape + * xde.tcl: demonstrates creation of simple assembly in XDE + * materials.tcl: demonstrates visual properties of materials supported by 3d viewer + * raytrace.tcl: demonstrates use of ray tracing display in 3d viewer + * dimensions.tcl: demonstrates use of dimensions, clipping, and capping in 3d viewer + * ... + +Draw is a command interpreter based on TCL and a graphical system used for testing and demonstrating OCCT modeling libraries. + +Draw can be used interactively to create, display and modify objects such as curves, surfaces and topological shapes. + +@figure{/introduction/images/overview_draw.png} + +Scripts can be written to customize Draw and perform tests. +New types of objects and new commands can be added using C++ programming language. + +Draw contains: + + * A command interpreter based on TCL command language. + * A 2D an 3D graphic viewer with support of operations such as zoom, pan, rotation and full-screen views. + * An optional set of geometric commands to create and modify curves and surfaces and to use OCCT geometry algorithms. + * A set of topological commands to create and modify BRep shapes and to use OCCT topology algorithms. + * A set of graphic commands for view and display operations including Mesh Visualization Service. + * A set of Application framework commands for handling of files and attributes. + * A set of Data Exchange commands for translation of files from various formats (IGES,STEP) into OCCT shapes. + * A set of Shape Healing commands: check of overlapping edges, approximation of a shape to BSpline, etc. + +You can add new custom test harness commands to Draw in order to test +or demonstrate a new functionality, which you are developing. + +Currently DRAW Test Harness is a single executable called *DRAWEXE*. + +Commands grouped in toolkits can be loaded at run-time thereby implementing dynamically loaded plug-ins. +Thus you can work only with the commands that suit your needs adding +the commands dynamically without leaving the Test Harness session. + +Declaration of available plug-ins is done through special resource file(s). +The *pload* command loads the plug-in in accordance with +the specified resource file and activates the commands implemented in the plug-in. + +The whole process of using the plug-in mechanism as well as the instructions for extending Test Harness is described in the @ref occt_user_guides__test_harness. + +Draw Test Harness provides an environment for OCCT automated testing system. +Check its @ref occt_contribution__tests "Automated Testing System" for details. + +Remarks: + +* The DRAWEXE executable is delivered with the installation procedure on Windows platform only. +* To start it, launch DRAWEXE executable from Open CASCADE Technology/Draw Test Harness item of the Start\\Programs menu. + +Experimenting with Draw Test Harness +------------------------------------ + + Running Draw +------------ + +**On Linux:** + +* If OCCT was built by Code::Blocks use $CASROOT/draw.sh file to launch *DRAWEXE* executable. + +Draw[1]> prompt appears in the command window + +Type *pload ALL* + +**On Windows:** + +Launch Draw executable from Open CASCADE Technology\\Test Harness\\Draw Test Harness +item of the Start\\Programs menu or Use $CASROOT\\draw.bat file to launch *DRAWEXE* executable. + +Draw[1]> prompt appears in the command window + +Type pload ALL + +**Creating your first geometric objects** + +1. In the command window, type *axo* to create an axonometric view +2. Type *box b -10 -10 -10 20 20 20* to create a cube *b* of size 20, parallel to the X Y Z axis and centered on the origin. The cube will be displayed in the axonometric view in wireframe mode. +3. Type *fit* to fill the viewer with the cube +4. Type *pcylinder c 2 30* to create a cylinder *c* of radius 2 and height 30. The cylinder will be displayed in addition to the cube + +**Manipulating the view** + +1. Type *clear* to erase the view +2. Type *donly c* to display the cylinder only +3. Type *donly b* to display the cube only +4. Type *hlr hlr b* to display the cube in the hidden line removal mode + +**Running demonstration files** + +1. Type *cd ../..* to return to the root directory +2. Type *cd samples/tcl* to reach the *DrawResources* directory +3. Type *source \* to run the demonstration file provided with Open CASCADE. The following demonstration files are available: + * DataExchangeDemo.tcl: demonstrates sample sequence of operations with writing and reading IGES file + * ModelingDemo.tcl: demonstrates creation of simple shape and displaying it in HLR mode + * VisualizationDemo.tcl: demonstrates use of 3d viewer + * cad.tcl: creates solid shape looking like abbreviation "CAD" + * bottle.tcl: creates bottle as in OCCT Tutorial + * drill.tcl: creates twist drill bit shape + * cutter.tcl: creates milling cutter shape + * xde.tcl: demonstrates creation of simple assembly in XDE + * materials.tcl: demonstrates visual properties of materials supported by 3d viewer + * raytrace.tcl: demonstrates use of ray tracing display in 3d viewer + * dimensions.tcl: demonstrates use of dimensions, clipping, and capping in 3d viewer + +**Getting Help** + +1. Type *help* to see all available commands +2. Type *help \* to find out the arguments for a given command \ No newline at end of file Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/samples/images/sample_ios_uikit.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/samples/images/sample_ios_uikit.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/samples/images/sample_overview_qt.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/samples/images/sample_overview_qt.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/samples/images/samples_c__ie.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/samples/images/samples_c__ie.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/samples/images/samples_draw.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/samples/images/samples_draw.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/samples/images/samples_java_android_occt.jpg and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/samples/images/samples_java_android_occt.jpg differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/samples/images/samples_mvc.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/samples/images/samples_mvc.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/samples/images/samples_qml_android_occt.jpg and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/samples/images/samples_qml_android_occt.jpg differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/samples/images/samples_qt.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/samples/images/samples_qt.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/samples/images/sample_webgl.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/samples/images/sample_webgl.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/samples/ocaf_func.md opencascade-7.5.1+dfsg1/dox/samples/ocaf_func.md --- opencascade-7.4.1+dfsg1/dox/samples/ocaf_func.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/samples/ocaf_func.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,286 @@ +Function Mechanism Usage {#samples__ocaf_func} +======================== + +Let us describe the usage of the "Function Mechanism" of Open CASCADE Application Framework on a simple example. +This example represents a "nail" composed by a cone and two cylinders of different radius and height: + +@image html ocaf_functionmechanism_wp_image003.png "A nail" +@image latex ocaf_functionmechanism_wp_image003.png " A nail" + + These three objects (a cone and two cylinders) are independent, + but the Function Mechanism makes them connected to each other and representing one object -- a nail. + The object "nail" has the following parameters: + + * The position of the nail is defined by the apex point of the cone. + The cylinders are built on the cone and therefore they depend on the position of the cone. + In this way we define a dependency of the cylinders on the cone. + * The height of the nail is defined by the height of the cone. + Let’s consider that the long cylinder has 3 heights of the cone + and the header cylinder has a half of the height of the cone. + * The radius of the nail is defined by the radius of the cone. + The radius of the long cylinder coincides with this value. + Let’s consider that the header cylinder has one and a half radiuses of the cone. + + So, the cylinders depend on the cone and the cone parameters define the size of the nail. + + It means that re-positioning the cone (changing its apex point) moves the nail, + the change of the radius of the cone produces a thinner or thicker nail, + and the change of the height of the cone shortens or prolongates the nail. +  It is suggested to examine the programming steps needed to create a 3D parametric model of the "nail". + +## Step1: Data Tree + + The first step consists in model data allocation in the OCAF tree. + In other words, it is necessary to decide where to put the data. + + In this case, the data can be organized into a simple tree + using references for definition of dependent parameters: + +* Nail + * Cone + + Position (x,y,z) + + Radius + + Height + * Cylinder (stem) + + Position = "Cone" position translated for "Cone" height along Z; + + Radius = "Cone" radius; + + Height = "Cone" height multiplied by 3; + * Cylinder (head) + + Position = "Long cylinder" position translated for "Long cylinder" height along Z; + + Radius = "Long cylinder" radius multiplied by 1.5; + + Height = "Cone" height divided by 2. + + The "nail" object has three sub-leaves in the tree: the cone and two cylinders. + + The cone object is independent. + + The long cylinder representing a "stem" of the nail refers to the corresponding parameters + of the cone to define its own data (position, radius and height). It means that the long cylinder depends on the cone. + + The parameters of the head cylinder may be expressed through the cone parameters + only or through the cone and the long cylinder parameters. + It is suggested to express the position and the radius of the head cylinder + through the position and the radius of the long cylinder, and the height + of the head cylinder through the height of the cone. + It means that the head cylinder depends on the cone and the long cylinder. + +## Step 2: Interfaces + + The interfaces of the data model are responsible for dynamic creation + of the data tree of the represented at the previous step, data modification and deletion. + + The interface called *INail* should contain the methods for creation + of the data tree for the nail, setting and getting of its parameters, computation, visualization and removal. + +### Creation of the nail + + This method of the interface creates a data tree for the nail at a given leaf of OCAF data tree. + + It creates three sub-leaves for the cone and two cylinders and allocates the necessary data (references at the +sub-leaves of the long and the head cylinders). + + It sets the default values of position, radius and height of the nail. + + The nail has the following user parameters: + * The position -- coincides with the position of the cone + * The radius of the stem part of the nail -- coincides with the radius of the cone + * The height of the nail -- a sum of heights of the cone and both cylinders + + The values of the position and the radius of the nail are defined for the cone object data. + The height of the cone is recomputed as 2 * heights of nail and divided by 9. + +### Computation + + The Function Mechanism is responsible for re-computation of the nail. + It will be described in detail later in this document. + + A data leaf consists of the reference  to the location of the real data + and a real value defining a coefficient of multiplication of the referenced data. + + For example, the height of the long cylinder is defined as a reference to the height of the cone + with coefficient 3. The data leaf of the height of the long cylinder + should contain two attributes: a reference to the height of cone and a real value equal to 3. + +### Visualization + + The shape resulting of the nail function can be displayed using the standard OCAF visualization mechanism. + +### Removal of the nail + +To automatically erase the nail from the viewer and the data tree it is enough to clean the nail leaf from attributes. + +## Step 3: Functions + + The nail is defined by four functions: the cone, the two cylinders and the nail function. + The function of the cone is independent. The functions of the cylinders depend on the cone function. + The nail function depends on the results of all functions: + +@image html ocaf_functionmechanism_wp_image005.png "A graph of dependencies between functions" +@image latex ocaf_functionmechanism_wp_image005.png "A graph of dependencies between functions" + + Computation of the model starts with the cone function, then the long cylinder, + after that the header cylinder and, finally, the result is generated by the nail function at the end of function chain. + + The Function Mechanism of Open CASCADE Technology creates this graph of dependencies + and allows iterating it following the dependencies. + The only thing the Function Mechanism requires from its user + is the implementation of pure virtual methods of *TFunction_Driver*: + + * \::Arguments() -- returns a list of arguments for the function + * \::Results() -- returns a list of results of the function + + These methods give the Function Mechanism the information on the location of arguments + and results of the function and allow building a graph of functions. + The class *TFunction_Iterator* iterates the functions of the graph in the execution order. + + The pure virtual method *TFunction_Driver::Execute()* calculating the function should be overridden. + + The method \::MustExecute() calls the method \::Arguments() of the function driver + and ideally this information (knowledge of modification of arguments of the function) is enough + to make a decision whether the function should be executed or not. Therefore, this method usually shouldn’t be overridden. + + The cone and cylinder functions differ only in geometrical construction algorithms. + Other parameters are the same (position, radius and height). + + It means that it is possible to create a base class -- function driver for the three functions, + and two descendant classes producing: a cone or a cylinder. + + For the base function driver the methods \::Arguments() and \::Results() will be overridden. + Two descendant function drivers responsible for creation of a cone and a cylinder will override only the method +\::Execute(). + + The method \::Arguments() of the function driver of the nail returns the results of the functions located under +it in the tree of leaves. The method \::Execute() just collects the results of the functions and makes one + shape -- a nail. + + This way the data model using the Function Mechanism is ready for usage. Do not forget to introduce the function +drivers for a function driver table with the help of *TFunction_DriverTable* class. + +### Example 1: iteration and execution of functions. + + This is an example of the code for iteration and execution of functions. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} + + // The scope of functions is defined. + Handle(TFunction_Scope) scope = TFunction_Scope::Set( anyLabel ); + + // The information on modifications in the model is received. + TFunction_Logbook& log = scope-GetLogbook(); + + // The iterator is iInitialized by the scope of functions. + TFunction_Iterator iterator( anyLabel ); + Iterator.SetUsageOfExecutionOrder( true ); + + // The function is iterated,  its dependency is checked on the modified data and  executed if necessary. + for (; iterator.more(); iterator.Next()) + { + // The function iterator may return a list of current functions for execution. + // It might be useful for multi-threaded execution of functions. + const TDF_LabelList& currentFunctions = iterator.Current(); + + //The list of current functions is iterated. + TDF_ListIteratorOfLabelList currentterator( currentFucntions ); + for (; currentIterator.More(); currentIterator.Next()) + { + // An interface for the function is created. + TFunction_IFunction interface( currentIterator.Value() ); + + // The function driver is retrieved. + Handle(TFunction_Driver) driver = interface.GetDriver(); + + // The dependency of the function on the  modified data is checked. + If (driver-MustExecute( log )) + { + // The function is executed. + int ret = driver-Execute( log ); + if ( ret ) + return false; + } // end if check on modification + } // end of iteration of current functions + } // end of iteration of functions. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +### Example 2: Cylinder function driver + + This is an example of the code for a cylinder function driver. To make the things clearer, the methods +\::Arguments() and \::Results() from the base class are also mentioned. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} + + // A virtual method ::Arguments() returns a list of arguments of the function. + CylinderDriver::Arguments( TDF_LabelList& args ) + { + // The direct arguments, located at sub-leaves of the fucntion, are collected (see picture 2). + TDF_ChildIterator cIterator( Label(), false ); + for (; cIterator.More(); cIterator.Next() ) + { + // Direct argument. + TDF_Label sublabel = cIterator.Value(); + Args.Append( sublabel ); + + // The references to the external data are checked. + Handle(TDF_Reference) ref; + If ( sublabel.FindAttribute( TDF_Reference::GetID(), ref ) ) + { + args.Append( ref-Get() ); + } + } + + // A virtual method ::Results() returns a list of result leaves. + CylinderDriver::Results( TDF_LabelList& res ) + { + // The result is kept at the function label. +   Res.Append( Label() ); + } + + // Execution of the function driver. + Int CylinderDriver::Execute( TFunction_Logbook& log ) + { + // Position of the cylinder - position of the first function (cone) + //is  elevated along Z for height values of all previous functions. + gp_Ax2 axes = …. // out of the scope of this guide. + // The radius value is retrieved. + // It is located at second child sub-leaf (see the picture 2). + TDF_Label radiusLabel = Label().FindChild( 2 ); + + // The multiplicator of the radius ()is retrieved. + Handle(TDataStd_Real) radiusValue; + radiusLabel.FindAttribute( TDataStd_Real::GetID(), radiusValue); + + // The reference to the radius is retrieved. + Handle(TDF_Reference) refRadius; + RadiusLabel.FindAttribute( TDF_Reference::GetID(), refRadius ); + + // The radius value is calculated. + double radius = 0.0; + + if ( refRadius.IsNull() ) + { + radius = radiusValue-Get(); + } + else + { + // The referenced radius value is retrieved. + Handle(TDataStd_Real) referencedRadiusValue; + RefRadius-Get().FindAttribute(TDataStd_Real::GetID() ,referencedRadiusValue ); + radius = referencedRadiusValue-Get() * radiusValue-Get(); + } + + // The height value is retrieved. + double height = … // similar code to taking the radius value. + + // The cylinder is created. + TopoDS_Shape cylinder = BRepPrimAPI_MakeCylinder(axes, radius, height); + + // The result (cylinder) is set + TNaming_Builder builder( Label() ); + Builder.Generated( cylinder ); + + // The modification of the result leaf is saved in the log. + log.SetImpacted( Label() ); + + return 0; + } +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff -Nru opencascade-7.4.1+dfsg1/dox/samples/ocaf.md opencascade-7.5.1+dfsg1/dox/samples/ocaf.md --- opencascade-7.4.1+dfsg1/dox/samples/ocaf.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/samples/ocaf.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,594 @@ +OCAF Usage {#samples__ocaf} +======== + +## Getting Started + + At the beginning of your development, you first define an application class by inheriting from the Application abstract class. + You only have to create and determine the resources of the application + for specifying the format of your documents (you generally use the standard one) and their file extension. + + Then, you design the application data model by organizing attributes you choose among those provided with OCAF. + You can specialize these attributes using the User attribute. For example, if you need a reflection coefficient, + you aggregate a User attribute identified as a reflection coefficient + with a Real attribute containing the value of the coefficient (as such, you don't define a new class). + + If you need application specific data not provided with OCAF, for example, + to incorporate a finite element model in the data structure, + you define a new attribute class containing the mesh, + and you include its persistent homologue in a new file format. + + Once you have implemented the commands which create and modify the data structure + according to your specification, OCAF provides you, without any additional programming: + + * Persistent reference to any data, including geometric elements â€" several documents can be linked with such reference; + * Document-View association; + * Ready-to-use functions such as : + * Undo-redo; + * Save and open application data. + + Finally, you develop the application's graphical user interface using the toolkit of your choice, for example: + * KDE Qt or GNOME GTK+ on Linux; + * Microsoft Foundation Classes (MFC) on Windows Motif on Sun; + * Other commercial products such as Ilog Views. + + You can also implement the user interface in the Java language using + the Swing-based Java Application Desktop component (JAD) provided with OCAF. + +## An example of OCAF usage + +To create a useful OCAF-based application, it is necessary to redefine two deferred methods: Formats and ResourcesName + +In the Formats method, add the format of the documents, which need to be read by the application and may have been built in other applications. + +For example: + +~~~~ + void myApplication::Formats(TColStd_SequenceOfExtendedString& Formats) + { + Formats.Append(TCollection_ExtendedString ("OCAF-myApplication")); + } +~~~~ + +In the ResourcesName method, you only define the name of the resource file. This +file contains several definitions for the saving and opening mechanisms associated +with each format and calling of the plug-in file. + +~~~~ + Standard_CString myApplication::ResourcesName() + { + return Standard_CString ("Resources"); + } +~~~~ + +To obtain the saving and opening mechanisms, it is necessary to set two environment variables: CSF_PluginDefaults, which defines the path of the plug-in file, and CSF_ResourcesDefault, which defines the resource file: + +~~~~ + SetEnvironmentVariable ( "CSF_ResourcesDefaults",myDirectory); + SetEnvironmentVariable ( "CSF_PluginDefaults",myDirectory); +~~~~ + +The plugin and the resource files of the application will be located in myDirector. +The name of the plugin file must be Plugin. + +### Resource File + +The resource file describes the documents (type and extension) and +the type of data that the application can manipulate +by identifying the storage and retrieval drivers appropriate for this data. + +Each driver is unique and identified by a GUID generated, for example, with the uuidgen tool in Windows. + +Five drivers are required to use all standard attributes provided within OCAF: + + * the schema driver (ad696002-5b34-11d1-b5ba-00a0c9064368) + * the document storage driver (ad696000-5b34-11d1-b5ba-00a0c9064368) + * the document retrieval driver (ad696001-5b34-11d1-b5ba-00a0c9064368) + * the attribute storage driver (47b0b826-d931-11d1-b5da-00a0c9064368) + * the attribute retrieval driver (47b0b827-d931-11d1-b5da-00a0c9064368) + +These drivers are provided as plug-ins and are located in the PappStdPlugin library. + + +For example, this is a resource file, which declares a new model document OCAF-MyApplication: + +~~~~ +formatlist:OCAF-MyApplication +OCAF-MyApplication.Description: MyApplication Document Version 1.0 +OCAF-MyApplication.FileExtension: sta +OCAF-MyApplication.StoragePlugin: ad696000-5b34-11d1-b5ba-00a0c9064368 +OCAF-MyApplication.RetrievalPlugin: ad696001-5b34-11d1-b5ba-00a0c9064368 +OCAF-MyApplicationSchema: ad696002-5b34-11d1-b5ba-00a0c9064368 +OCAF-MyApplication.AttributeStoragePlugin: 47b0b826-d931-11d1-b5da-00a0c9064368 +OCAF-MyApplication.AttributeRetrievalPlugin: 47b0b827-d931-11d1-b5da-00a0c9064368 +~~~~ + +### Plugin File + +The plugin file describes the list of required plug-ins to run the application and the +libraries in which plug-ins are located. + +You need at least the FWOSPlugin and the plug-in drivers to run an OCAF application. + +The syntax of each item is Identification.Location Library_Name, where: +* Identification is GUID. +* Location defines the location of the Identification (where its definition is found). +* Library_Name is the name (and path to) the library, where the plug-in is located. + +For example, this is a Plugin file: + +~~~~ +a148e300-5740-11d1-a904-080036aaa103.Location: FWOSPlugin +! base document drivers plugin +ad696000-5b34-11d1-b5ba-00a0c9064368.Location: PAppStdPlugin +ad696001-5b34-11d1-b5ba-00a0c9064368.Location: PAppStdPlugin +ad696002-5b34-11d1-b5ba-00a0c9064368.Location: PAppStdPlugin +47b0b826-d931-11d1-b5da-00a0c9064368.Location: PAppStdPlugin +47b0b827-d931-11d1-b5da-00a0c9064368.Location: PAppStdPlugin +~~~~ + +## Implementation of Attribute Transformation in a HXX file + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} +\#include + +\#include +\#include +\#include +\#include + +//! This attribute implements a transformation data container +class MyPackage_Transformation : public TDF_Attribute +{ +public: + //!@ name Static methods + + //! The method returns a unique GUID of this attribute. + //! By means of this GUID this attribute may be identified + //! among other attributes attached to the same label. + Standard_EXPORT static const Standard_GUID& GetID (); + + //! Finds or creates the attribute attached to . + //! The found or created attribute is returned. + Standard_EXPORT static Handle(MyPackage_Transformation) Set (const TDF_Label theLabel); + + //!@ name Methods for access to the attribute data + + //! The method returns the transformation. + Standard_EXPORT gp_Trsf Get () const; + + //!@ name Methods for setting the data of transformation + + //! The method defines a rotation type of transformation. + Standard_EXPORT void SetRotation (const gp_Ax1& theAxis, Standard_Real theAngle); + + //! The method defines a translation type of transformation. + Standard_EXPORT void SetTranslation (const gp_Vec& theVector); + + //! The method defines a point mirror type of transformation (point symmetry). + Standard_EXPORT void SetMirror (const gp_Pnt& thePoint); + + //! The method defines an axis mirror type of transformation (axial symmetry). + Standard_EXPORT void SetMirror (const gp_Ax1& theAxis); + + //! The method defines a point mirror type of transformation (planar symmetry). + Standard_EXPORT void SetMirror (const gp_Ax2& thePlane); + + //! The method defines a scale type of transformation. + Standard_EXPORT void SetScale (const gp_Pnt& thePoint, Standard_Real theScale); + + //! The method defines a complex type of transformation from one co-ordinate system to another. + Standard_EXPORT void SetTransformation (const gp_Ax3& theCoordinateSystem1, const gp_Ax3& theCoordinateSystem2); + + //!@ name Overridden methods from TDF_Attribute + + //! The method returns a unique GUID of the attribute. + //! By means of this GUID this attribute may be identified among other attributes attached to the same label. + Standard_EXPORT const Standard_GUID& ID () const; + + //! The method is called on Undo / Redo. + //! It copies the content of theAttribute into this attribute (copies the fields). + Standard_EXPORT void Restore (const Handle(TDF_Attribute)& theAttribute); + + //! It creates a new instance of this attribute. + //! It is called on Copy / Paste, Undo / Redo. + Standard_EXPORT Handle(TDF_Attribute) NewEmpty () const; + + //! The method is called on Copy / Paste. + //! It copies the content of this attribute into theAttribute (copies the fields). + Standard_EXPORT void Paste (const Handle(TDF_Attribute)& theAttribute, const Handle(TDF_RelocationTable)& theRelocationTable); + + //! Prints the content of this attribute into the stream. + Standard_EXPORT Standard_OStream& Dump(Standard_OStream& theOS); + + //!@ name Constructor + + //! The C++ constructor of this atribute class. + //! Usually it is never called outside this class. + Standard_EXPORT MyPackage_Transformation(); + +private: + gp_TrsfForm myType; + + // Axes (Ax1, Ax2, Ax3) + gp_Ax1 myAx1; + gp_Ax2 myAx2; + gp_Ax3 myFirstAx3; + gp_Ax3 mySecondAx3; + + // Scalar values + Standard_Real myAngle; + Standard_Real myScale; + + // Points + gp_Pnt myFirstPoint; + gp_Pnt mySecondPoint; +}; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## Implementation of Attribute Transformation in a CPP file + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} +\#include + +//======================================================================= +//function : GetID +//purpose : The method returns a unique GUID of this attribute. +// By means of this GUID this attribute may be identified +// among other attributes attached to the same label. +//======================================================================= +const Standard_GUID& MyPackage_Transformation::GetID() +{ + static Standard_GUID ID("4443368E-C808-4468-984D-B26906BA8573"); + return ID; +} + +//======================================================================= +//function : Set +//purpose : Finds or creates the attribute attached to . +// The found or created attribute is returned. +//======================================================================= +Handle(MyPackage_Transformation) MyPackage_Transformation::Set(const TDF_Label& theLabel) +{ + Handle(MyPackage_Transformation) T; + if (!theLabel.FindAttribute(MyPackage_Transformation::GetID(), T)) + { + T = new MyPackage_Transformation(); + theLabel.AddAttribute(T); + } + return T; +} + +//======================================================================= +//function : Get +//purpose : The method returns the transformation. +//======================================================================= +gp_Trsf MyPackage_Transformation::Get() const +{ + gp_Trsf transformation; + switch (myType) + { + case gp_Identity: + { + break; + } + case gp_Rotation: + { + transformation.SetRotation(myAx1, myAngle); + break; + } + case gp_Translation: + { + transformation.SetTranslation(myFirstPoint, mySecondPoint); + break; + } + case gp_PntMirror: + { + transformation.SetMirror(myFirstPoint); + break; + } + case gp_Ax1Mirror: + { + transformation.SetMirror(myAx1); + break; + } + case gp_Ax2Mirror: + { + transformation.SetMirror(myAx2); + break; + } + case gp_Scale: + { + transformation.SetScale(myFirstPoint, myScale); + break; + } + case gp_CompoundTrsf: + { + transformation.SetTransformation(myFirstAx3, mySecondAx3); + break; + } + case gp_Other: + { + break; + } + } + return transformation; +} + +//======================================================================= +//function : SetRotation +//purpose : The method defines a rotation type of transformation. +//======================================================================= +void MyPackage_Transformation::SetRotation(const gp_Ax1& theAxis, const Standard_Real theAngle) +{ + Backup(); + myType = gp_Rotation; + myAx1 = theAxis; + myAngle = theAngle; +} + +//======================================================================= +//function : SetTranslation +//purpose : The method defines a translation type of transformation. +//======================================================================= +void MyPackage_Transformation::SetTranslation(const gp_Vec& theVector) +{ + Backup(); + myType = gp_Translation; + myFirstPoint.SetCoord(0, 0, 0); + mySecondPoint.SetCoord(theVector.X(), theVector.Y(), theVector.Z()); +} + +//======================================================================= +//function : SetMirror +//purpose : The method defines a point mirror type of transformation +// (point symmetry). +//======================================================================= +void MyPackage_Transformation::SetMirror(const gp_Pnt& thePoint) +{ + Backup(); + myType = gp_PntMirror; + myFirstPoint = thePoint; +} + +//======================================================================= +//function : SetMirror +//purpose : The method defines an axis mirror type of transformation +// (axial symmetry). +//======================================================================= +void MyPackage_Transformation::SetMirror(const gp_Ax1& theAxis) +{ + Backup(); + myType = gp_Ax1Mirror; + myAx1 = theAxis; +} + +//======================================================================= +//function : SetMirror +//purpose : The method defines a point mirror type of transformation +// (planar symmetry). +//======================================================================= +void MyPackage_Transformation::SetMirror(const gp_Ax2& thePlane) +{ + Backup(); + myType = gp_Ax2Mirror; + myAx2 = thePlane; +} + +//======================================================================= +//function : SetScale +//purpose : The method defines a scale type of transformation. +//======================================================================= +void MyPackage_Transformation::SetScale(const gp_Pnt& thePoint, const Standard_Real theScale) +{ + Backup(); + myType = gp_Scale; + myFirstPoint = thePoint; + myScale = theScale; +} + +//======================================================================= +//function : SetTransformation +//purpose : The method defines a complex type of transformation +// from one co-ordinate system to another. +//======================================================================= +void MyPackage_Transformation::SetTransformation(const gp_Ax3& theCoordinateSystem1, + const gp_Ax3& theCoordinateSystem2) +{ + Backup(); + myFirstAx3 = theCoordinateSystem1; + mySecondAx3 = theCoordinateSystem2; +} + +//======================================================================= +//function : ID +//purpose : The method returns a unique GUID of the attribute. +// By means of this GUID this attribute may be identified +// among other attributes attached to the same label. +//======================================================================= +const Standard_GUID& MyPackage_Transformation::ID() const +{ + return GetID(); +} + +//======================================================================= +//function : Restore +//purpose : The method is called on Undo / Redo. +// It copies the content of +// into this attribute (copies the fields). +//======================================================================= +void MyPackage_Transformation::Restore(const Handle(TDF_Attribute)& theAttribute) +{ + Handle(MyPackage_Transformation) theTransformation = Handle(MyPackage_Transformation)::DownCast(theAttribute); + myType = theTransformation->myType; + myAx1 = theTransformation->myAx1; + myAx2 = theTransformation->myAx2; + myFirstAx3 = theTransformation->myFirstAx3; + mySecondAx3 = theTransformation->mySecondAx3; + myAngle = theTransformation->myAngle; + myScale = theTransformation->myScale; + myFirstPoint = theTransformation->myFirstPoint; + mySecondPoint = theTransformation->mySecondPoint; +} + +//======================================================================= +//function : NewEmpty +//purpose : It creates a new instance of this attribute. +// It is called on Copy / Paste, Undo / Redo. +//======================================================================= +Handle(TDF_Attribute) MyPackage_Transformation::NewEmpty() const +{ + return new MyPackage_Transformation(); +} + +//======================================================================= +//function : Paste +//purpose : The method is called on Copy / Paste. +// It copies the content of this attribute into +// (copies the fields). +//======================================================================= +void MyPackage_Transformation::Paste(const Handle(TDF_Attribute)& theAttribute, + const Handle(TDF_RelocationTable)& ) const +{ + Handle(MyPackage_Transformation) theTransformation = Handle(MyPackage_Transformation)::DownCast(theAttribute); + theTransformation->myType = myType; + theTransformation->myAx1 = myAx1; + theTransformation->myAx2 = myAx2; + theTransformation->myFirstAx3 = myFirstAx3; + theTransformation->mySecondAx3 = mySecondAx3; + theTransformation->myAngle = myAngle; + theTransformation->myScale = myScale; + theTransformation->myFirstPoint = myFirstPoint; + theTransformation->mySecondPoint = mySecondPoint; +} + +//======================================================================= +//function : Dump +//purpose : Prints the content of this attribute into the stream. +//======================================================================= +Standard_OStream& MyPackage_Transformation::Dump(Standard_OStream& anOS) const +{ + anOS = "Transformation: "; + switch (myType) + { + case gp_Identity: + { + anOS = "gp_Identity"; + break; + } + case gp_Rotation: + { + anOS = "gp_Rotation"; + break; + } + case gp_Translation: + { + anOS = "gp_Translation"; + break; + } + case gp_PntMirror: + { + anOS = "gp_PntMirror"; + break; + } + case gp_Ax1Mirror: + { + anOS = "gp_Ax1Mirror"; + break; + } + case gp_Ax2Mirror: + { + anOS = "gp_Ax2Mirror"; + break; + } + case gp_Scale: + { + anOS = "gp_Scale"; + break; + } + case gp_CompoundTrsf: + { + anOS = "gp_CompoundTrsf"; + break; + } + case gp_Other: + { + anOS = "gp_Other"; + break; + } + } + return anOS; +} + +//======================================================================= +//function : MyPackage_Transformation +//purpose : A constructor. +//======================================================================= +MyPackage_Transformation::MyPackage_Transformation():myType(gp_Identity){ + +} +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## Implementation of typical actions with standard OCAF attributes. + +There are four sample files provided in the directory 'OpenCasCade/ros/samples/ocafsamples'. They present typical actions with OCAF services (mainly for newcomers). +The method *Sample()* of each file is not dedicated for execution 'as is', it is rather a set of logical actions using some OCAF services. + +### TDataStd_Sample.cxx +This sample contains templates for typical actions with the following standard OCAF attributes: +- Starting with data framework; +- TDataStd_Integer attribute management; +- TDataStd_RealArray attribute management; +- TDataStd_Comment attribute management; +- TDataStd_Name attribute management; +- TDataStd_UAttribute attribute management; +- TDF_Reference attribute management; +- TDataXtd_Point attribute management; +- TDataXtd_Plane attribute management; +- TDataXtd_Axis attribute management; +- TDataXtd_Geometry attribute management; +- TDataXtd_Constraint attribute management; +- TDataStd_Directory attribute management; +- TDataStd_TreeNode attribute management. + +### TDocStd_Sample.cxx +This sample contains template for the following typical actions: +- creating application; +- creating the new document (document contains a framework); +- retrieving the document from a label of its framework; +- filling a document with data; +- saving a document in the file; +- closing a document; +- opening the document stored in the file; +- copying content of a document to another document with possibility to update the copy in the future. + +### TPrsStd_Sample.cxx +This sample contains template for the following typical actions: +- starting with data framework; +- setting the TPrsStd_AISViewer in the framework; +- initialization of aViewer; +- finding TPrsStd_AISViewer attribute in the DataFramework; +- getting AIS_InteractiveContext from TPrsStd_AISViewer; +- adding driver to the map of drivers; +- getting driver from the map of drivers; +- setting TNaming_NamedShape to \; +- setting the new TPrsStd_AISPresentation to \; +- displaying; +- erasing; +- updating and displaying presentation of the attribute to be displayed; +- setting a color to the displayed attribute; +- getting transparency of the displayed attribute; +- modify attribute; +- updating presentation of the attribute in viewer. + +### TNaming_Sample.cxx +This sample contains template for typical actions with OCAF Topological Naming services. +The following scenario is used: +- data framework initialization; +- creating Box1 and pushing it as PRIMITIVE in DF; +- creating Box2 and pushing it as PRIMITIVE in DF; +- moving Box2 (applying a transformation); +- pushing the selected edges of the top face of Box1 in DF; +- creating a Fillet (using the selected edges) and pushing the result as a modification of Box1; +- creating a Cut (Box1, Box2) as a modification of Box1 and push it in DF; +- recovering the result from DF. + diff -Nru opencascade-7.4.1+dfsg1/dox/samples/samples.md opencascade-7.5.1+dfsg1/dox/samples/samples.md --- opencascade-7.4.1+dfsg1/dox/samples/samples.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/samples/samples.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,176 @@ +Tutorials and Samples {#samples} +===================== + +Tutorial: Modelling a Bottle +---------------------------- +The Qt programming tutorial teaches how to use Open CASCADE Technology services to model a 3D object. +The purpose of the tutorial is not to explain all OCCT classes but +to help start thinking in terms of the Open CASCADE Technology. + +This tutorial assumes that the user has experience in using and setting up C++. +From the viewpoint of programming, Open CASCADE Technology is designed +to enhance user's C++ tools with high performance modeling classes, methods and functions. +The combination of these resources allows creating substantial applications. + +Read more about @subpage occt__tutorial + +MFC +--------- + +Visual C++ programming samples containing 10 Visual C++ projects +illustrating how to use a particular module or functionality. + +The list of MFC samples: + + * Geometry + * Modeling + * Viewer2d + * Viewer3d + * ImportExport + * Ocaf + * Triangulation + * HLR + * Animation + * Convert + +@figure{/samples/images/samples_mvc.png} + +**Remarks:** + + * MFC samples are available only on Windows platform; + * To start a sample use Open CASCADE Technology\\Samples\\Mfc\\ item of the Start\\Programs menu; + * Read carefully readme.txt to learn about launching and compilation options. + +See @subpage samples_mfc_standard "Readme" for details. + +Qt +--- + + OCCT includes several samples based on Qt application framework. +These samples are available on all supported desktop platforms. + +To start a sample on Windows use Open CASCADE Technology\\Samples\\Qt\\ item of the Start\\Programs menu. + + Import Export +------------- + + Import Export programming sample contains 3D Viewer and Import / Export functionality. + +@figure{/samples/images/samples_qt.png} + + Tutorial +--------- + +The Qt programming tutorial teaches how to use Open CASCADE Technology services to model a 3D object. +The purpose of the tutorial is not to explain all OCCT classes but +to help start thinking in terms of the Open CASCADE Technology. + +This tutorial assumes that the user has experience in using and setting up C++. +From the viewpoint of programming, Open CASCADE Technology is designed +to enhance user's C++ tools with high performance modeling classes, methods and functions. +The combination of these resources allows creating substantial applications. + +**See also:** @ref occt__tutorial "OCCT Tutorial" + +Overview +--------- + +The Qt application providing samples for basic usage of C++ API of various OCCT functionality. + +The samples are organized in several categories according to relevant module of OCCT: + + * Geometry + * Topology, + * Triangulation + * DataExchange + * OCAF + * Viewer 2d + * Viewer 3d + +Each sample presents geometry view, C++ code fragment and sample output window. + +@figure{/samples/images/sample_overview_qt.png} + +See \subpage samples_qt_overview "Readme" for details. + +C# +--- + +C# sample demonstrates integration of OCCT 3D Viewer and Import / Export functionality into .NET applications (using Windows Forms and WPF front ends). + +@figure{/samples/images/samples_c__ie.png} + +Import: + + * BRep + * Iges + * Step + +Export: + + * Brep + * Iges + * Step + * Stl + * Vrml + +See @subpage samples_csharp_occt "C# sample Readme" for details. + +There is also another C# example with the same functionality, which demonstrates the integration of Direct3D Viewer into .NET applications using WPF front end. + +See @subpage samples_csharp_direct3d "Direct3D C# sample Readme" for details. + +Android +--------- + +There are two samples are representing usage OCCT framework on Android mobile platform. They represent an OCCT-based 3D-viewer with CAD import support in formats BREP, STEP and IGES: jniviewer (java) and AndroidQt (qt+qml) + +jniviewer +@figure{/samples/images/samples_java_android_occt.jpg} +Java -- See @subpage samples_java_android_occt "Android Java sample Readme" for details. + +AndroidQt +@figure{/samples/images/samples_qml_android_occt.jpg} +Qt -- See \subpage samples_qml_android_occt "Android Qt sample Readme" for details. + +iOS +--- + +There is a sample demonstrating usage of OCCT on iOS with Apple UIKit framework. + +@figure{/samples/images/sample_ios_uikit.png} + +See @subpage occt_samples_ios_uikit "iOS sample Readme" for details. + +Web +--------- + +WebGL Viewer sample demonstrating usage of OCCT 3D Viewer in Web browser with Emscripten SDK can be found in `samples/webgl`. + +@figure{/samples/images/sample_webgl.png} + +See @subpage occt_samples_webgl "WebGL sample Readme" for details. + +OCAF Usage Sample +------------------ + +The provided set of samples dedicates to get initial knowledge about typical actions with OCAF services. It may be +useful for newcomers. + +Read more about @subpage samples__ocaf + +OCAF Function Mechanism Usage +----------------------------- + +This simple example dedicates to the usage of "Function Mechanism" of OCCT Application Framework. It represents a "nail" +composed by a cone and two cylinders of different radius and height. + +Read more about @subpage samples__ocaf_func + +Draw Demo Scripts +------------------ + +A set of demo scripts demonsrates using OCCT functionality from DRAW. These scripts can be also considered as a +tutorials on tcl usage within Draw. + +Read more about @subpage samples__draw_scripts diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/boolean_operations.md opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/boolean_operations.md --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/boolean_operations.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/boolean_operations.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,3563 @@ +Boolean Operations {#specification__boolean_operations} +========================= + +@tableofcontents + +@section specification__boolean_1 Introduction + +Boolean operations are used to create new shapes from the combinations of two groups of shapes. +This document provides a comprehensive description of the algorithms in the Boolean Operations Component as it is implemented in Open CASCADE Technology. The Boolean Component contains: + +* General Fuse Operator (GFA), +* Boolean Operator (BOA), +* Section Operator (SA), +* Splitter Operator (SPA). + +GFA is the base algorithm for BOA, SPA, SA. + +GFA has a history-based architecture designed to allow using OCAF naming functionality. The architecture of GFA is expandable, that allows creating new algorithms basing on it. + + +@section specification__boolean_2 Overview + +@subsection specification__boolean_2_1 Operators + +@subsubsection specification__boolean_2_1_1 Boolean operator + +The Boolean operator provides the following operations between two groups *Objects* and *Tools*: +* FUSE - Union of two groups; +* COMMON - Intersection of two groups; +* CUT - Difference between two groups. + +Each group consists of an arbitrary number of arguments in terms of *TopoDS_Shape*. + +The operator can be represented as: + +RB=Bj (G1, G2), + +where: +* *RB* -- result of the operation; +* *Bj* -- operation of type *j* (Common, Fuse, Cut); +* *G1={S11, S12 ... S1n1}* group of arguments (Objects); +* *G2={S21, S22 ... S2n2}* group of arguments (Tools); +* *n1* -- Number of arguments in *Objects* group; +* *n2* -- Number of arguments in *Tools* group. + + +**Note** There is an operation *Cut21*, which is an extension for forward Cut operation, i.e Cut21=Cut(G2, G1). + +For more details see @ref specification__boolean_9 "Boolean Operations Algorithm" section. + +@subsubsection specification__boolean_2_1_2 General Fuse operator + +The General fuse operator can be applied to an arbitrary number of arguments in terms of *TopoDS_Shape*. + +The GFA operator can be represented as: + +RGF = GF (S1, S2 ... Sn), + +where +* *RGF* -- result of the operation, +* *S1, S2 ... Sn* -- arguments of the operation, +* *n* -- number of arguments. + +The result of the Boolean operator, *RB*, can be obtained from *RGF*. + +For example, for two arguments *S1* and *S2* the result *RGF* is + +RGF = GF (S1, S2) = Sp1 + Sp2 + Sp12 + +@figure{/specification/boolean_operations/images/operations_image001.svg,"Operators",320} + +This Figure shows that +* Bcommon (S1, S2) = Sp12; +* Bcut12 (S1, S2) = Sp1; +* Bcut21 (S1, S2) = Sp2; +* Bfuse (S1, S2) = Sp1+Sp2+Sp12 + +RGF=GF (S1, S2) = Bfuse = Bcommon+ Bcut12+ Bcut21. + +The fact that *RGF* contains the components of *RB* allows considering GFA as the general case of BOA. So it is possible to implement BOA as a subclass of GFA. + +For more details see @ref specification__boolean_7 "General Fuse Algorithm" section. + +@subsubsection specification__boolean_2_1_3 Splitter operator + +The Splitter operator can be applied to an arbitrary number of arguments in terms of *TopoDS_Shape*. The arguments are divided into two groups: *Objects* and *Tools*. The result of *SPA* contains all parts that belong to the *Objects* but does not contain the parts that belong to the *Tools*. + +The *SPA* operator can be represented as follows: + +RSPA=SPA (G1, G2), +where: +* RSPA -- is the result of the operation; +* *G1={S11, S12 ... S1n1}* group of arguments (*Objects*); +* *G2={S21, S22 ... S2n2}* group of arguments (*Tools*); +* *n1* -- Number of arguments in *Objects* group; +* *n2* -- Number of arguments in *Tools* group. + +The result *RSPA* can be obtained from *RGF* . + +For example, for two arguments *S1* and *S2* the result *RSPA* is + +RSPA=SPA(S1,S2)=Sp1+Sp12. + +In case when all arguments of the *SPA* are *Objects* and there are no *Tools*, the result of *SPA* is equivalent to the result of *GFA*. + +For example, when *G1* consists of shapes *S1* and *S2* the result of *SPA* is + +RSPA=SPA(S1, S2) = Sp1 + Sp2 + Sp12 = GF (S1, S2) + +The fact that the *RGF* contains the components of *RSPA* allows considering *GFA* as the general case of *SPA*. Thus, it is possible to implement *SPA* as a subclass of *GFA*. + +For more details see @ref specification__boolean_8 "Splitter Algorithm" section. + +@subsubsection specification__boolean_2_1_4 Section operator + +The Section operator *SA* can be applied to arbitrary number of arguments in terms of *TopoDS_Shape*. The result of *SA* contains vertices and edges in accordance with interferences between the arguments +The SA operator can be represented as follows: +RSA=SA(S1, S2… Sn), where +* RSA -- the operation result; +* S1, S2 ... Sn -- the operation arguments; +* *n* -- the number of arguments. + +For more details see @ref specification__boolean_10a "Section Algorithm" section. + +@subsection specification__boolean_2_2 Parts of algorithms + +GFA, BOA, SPA and SA have the same Data Structure (DS). The main goal of the Data Structure is to store all necessary information for input data and intermediate results. + +The operators consist of two main parts: +* Intersection Part (IP). The main goal of IP is to compute the interferences between sub-shapes of arguments. The IP uses DS to retrieve input data and store the results of intersections. +* Building Part (BP). The main goal of BP is to build required result of an operation. This part also uses DS to retrieve data and store the results. + +As it follows from the definition of operator results, the main differences between GFA, BOA, SPA and SA are in the Building Part. The Intersection Part is the same for the algorithms. + +@section specification__boolean_3 Terms and Definitions + +This chapter provides the background terms and definitions that are necessary to understand how the algorithms work. + +@subsection specification__boolean_3_1 Interferences + +There are two groups of interferences. + +At first, each shape having a boundary representation (vertex, edge, face) has an internal value of geometrical tolerance. The shapes interfere with each other in terms of their tolerances. The shapes that have a boundary representation interfere when there is a part of 3D space where the distance between the underlying geometry of shapes is less or equal to the sum of tolerances of the shapes. Three types of shapes: vertex, edge and face -- produce six types of **BRep interferences:** +* Vertex/Vertex, +* Vertex/Edge, +* Vertex/Face, +* Edge/Edge, +* Edge/Face and +* Face/Face. + +At second, there are interferences that occur between a solid *Z1* and a shape *S2* when *Z1* and *S2* have no BRep interferences but *S2* is completely inside of *Z1*. These interferences are **Non-BRep interferences**. There are four possible cases: +* Vertex/Solid, +* Edge/Solid, +* Face/Solid and +* Solid/Solid. + +@subsubsection specification__boolean_3_1_1 Vertex/Vertex interference + +For two vertices *Vi* and *Vj*, the distance between their corresponding 3D points is less than the sum of their tolerances *Tol(Vi)* and *Tol(Vj)*. + +@figure{/specification/boolean_operations/images/operations_image002.svg,"Vertex/vertex interference",420} + +The result is a new vertex *Vn* with 3D point *Pn* and tolerance value Tol(Vn). + +The coordinates of *Pn* and the value Tol(Vn) are computed as the center and the radius of the sphere enclosing the tolerance spheres of the source vertices (V1, V2). + +@subsubsection specification__boolean_3_1_2 Vertex/Edge interference + +For a vertex *Vi* and an edge *Ej*, the distance *D* between 3D point of the vertex and its projection on the 3D curve of edge *Ej* is less or equal than sum of tolerances of vertex *Tol(Vi)* and edge *Tol(Ej)*. + +@figure{/specification/boolean_operations/images/operations_image003.svg,"Vertex/edge interference",420} + +The result is vertex *Vi* with the corresponding tolerance value Tol(Vi)=Max(Tol(Vi), D+Tol(Ej)), where D = distance (Pi, PPi); + +and parameter *ti* of the projected point *PPi* on 3D curve *Cj* of edge *Ej*. + +@subsubsection specification__boolean_3_1_3 Vertex/Face interference + +For a vertex *Vi* and a face *Fj* the distance *D* between 3D point of the vertex and its projection on the surface of the face is less or equal than sum of tolerances of the vertex *Tol(Vi)* and the face *Tol(Fj)*. + +@figure{/specification/boolean_operations/images/operations_image004.svg,"Vertex/face interference",420} + +The result is vertex *Vi* with the corresponding tolerance value Tol(Vi)=Max(Tol(Vi), D+Tol(Fj)), where D = distance (Pi, PPi) + +and parameters ui, vi of the projected point *PPi* on surface *Sj* of face *Fj*. + +@subsubsection specification__boolean_3_1_4 Edge/Edge interference + +For two edges *Ei* and *Ej* (with the corresponding 3D curves *Ci* and *Cj*) there are some places where the distance between the curves is less than (or equal to) sum of tolerances of the edges. + +Let us examine two cases: + +In the first case two edges have one or several common parts of 3D curves in terms of tolerance. + +@figure{/specification/boolean_operations/images/operations_image005.svg,"Edge/edge interference: common parts",420} + +The results are: +* Parametric range [ti1, ti2 ] for 3D curve *Ci* of edge *Ei*. +* Parametric range [tj1, tj2 ] for 3D curve *Cj* of edge *Ej*. + +In the second case two edges have one or several common points in terms of tolerance. + +@figure{/specification/boolean_operations/images/operations_image006.svg,"Edge/edge interference: common points",420} + +The result is a new vertex *Vn* with 3D point *Pn* and tolerance value *Tol(Vn)*. + +The coordinates of *Pn* and the value *Tol(Vn)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of 3D curves *Ci*, *Cj* of source edges *Ei*, *Ej*. + +* Parameter *ti* of *Pi* for the 3D curve *Ci*. +* Parameter *tj* of *Pj* for the 3D curve *Cj*. + +@subsubsection specification__boolean_3_1_5 Edge/Face interference + +For an edge *Ei* (with the corresponding 3D curve *Ci*) and a face *Fj* (with the corresponding 3D surface *Sj*) there are some places in 3D space, where the distance between *Ci* and surface *Sj* is less than (or equal to) the sum of tolerances of edge *Ei* and face *Fj*. + +Let us examine two cases: + +In the first case Edge *Ei* and Face *Fj* have one or several common parts in terms of tolerance. + +@figure{/specification/boolean_operations/images/operations_image007.svg,"Edge/face interference: common parts",420} + +The result is a parametric range [ti1, ti2] for the 3D curve *Ci* of the edge *Ei*. + +In the second case Edge *Ei* and Face *Fj* have one or several common points in terms of tolerance. + +@figure{/specification/boolean_operations/images/operations_image008.svg,"Edge/face interference: common points",420} + +The result is a new vertex *Vn* with 3D point *Pn* and tolerance value *Tol(Vn)*. + +The coordinates of *Pn* and the value *Tol(Vn)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of 3D curve *Ci* and surface *Sj* of source edges *Ei*, *Fj*. + +* Parameter *ti* of *Pi* for the 3D curve *Ci*. +* Parameters *ui* and *vi* of the projected point *PPi* on the surface *Sj* of the face *Fj*. + +@subsubsection specification__boolean_3_1_6 Face/Face Interference + +For a face *Fi* and a face *Fj* (with the corresponding surfaces *Si* and *Sj*) there are some places in 3D space, where the distance between the surfaces is less than (or equal to) sum of tolerances of the faces. + +@figure{/specification/boolean_operations/images/operations_image009.svg,"Face/face interference: common curves",418} + +In the first case the result contains intersection curves *Cijk (k = 0, 1, 2…kN,* where *kN* is the number of intersection curves with corresponding values of tolerances *Tol(Cijk)*. + +@figure{/specification/boolean_operations/images/operations_image010.svg,"Face/face interference: common points",305} + +In the second case Face *Fi* and face *Fj* have one or several new vertices *Vijm*, where m=0,1,2, ... mN, mN is the number of intersection points. + +The coordinates of a 3D point *Pijm* and the value *Tol(Vijm)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of the surface *Si*, *Sj* of source shapes *Fi*, *Fj*. + +* Parameters *uj*, *vj* belong to point *PPj* projected on surface *Sj* of face *Fj*. +* Parameters *ui* and *vi* belong to point *PPi* projected on surface *Si* of face *Fi*. + +@subsubsection specification__boolean_3_1_7 Vertex/Solid Interference + +For a vertex *Vi* and a solid *Zj* there is Vertex/Solid interference if the vertex *Vi* has no BRep interferences with any sub-shape of *Zj* and *Vi* is completely inside the solid *Zj*. + +@figure{/specification/boolean_operations/images/operations_image060.png,"Vertex/Solid Interference",220} + +@subsubsection specification__boolean_3_1_8 Edge/Soild Interference + +For an edge *Ei* and a solid *Zj* there is Edge/Solid interference if the edge *Ei* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Ei* is completely inside the solid *Zj*. + +@figure{/specification/boolean_operations/images/operations_image061.png,"Edge/Solid Interference",220} + +@subsubsection specification__boolean_3_1_9 Face/Soild Interference + +For a face *Fi* and a solid *Zj* there is Face/Solid interference if the face *Fi* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Fi* is completely inside the solid *Zj*. + +@figure{/specification/boolean_operations/images/operations_image062.png,"Face/Solid Interference",220} + +@subsubsection specification__boolean_3_1_10 Solid/Soild Interference + +For a solid *Zi* and a solid *Zj* there is Solid/Solid interference if the solid *Zi* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Zi* is completely inside the solid *Zj*. + +@figure{/specification/boolean_operations/images/operations_image063.png,"Solid/Solid Interference",220} + + +@subsubsection specification__boolean_3_1_11 Computation Order + +The interferences between shapes are computed on the basis of increasing of the dimension value of the shape in the following order: +* Vertex/Vertex, +* Vertex/Edge, +* Edge/Edge, +* Vertex/Face, +* Edge/Face, +* Face/Face, +* Vertex/Solid, +* Edge/Solid, +* Face/Solid, +* Solid/Solid. + +This order allows avoiding the computation of redundant interferences between upper-level shapes *Si* and *Sj* when there are interferences between lower sub-shapes *Sik* and *Sjm*. + +@subsubsection specification__boolean_3_1_12 Results + +* The result of the interference is a shape that can be either interfered shape itself (or its part) or a new shape. +* The result of the interference is a shape with the dimension value that is less or equal to the minimal dimension value of interfered shapes. For example, the result of Vertex/Edge interference is a vertex, but not an edge. +* The result of the interference splits the source shapes on the parts each time as it can do that. + +@subsection specification__boolean_3_2 Paves + +The result of interferences of the type Vertex/Edge, Edge/Edge and Edge/Face in most cases is a vertex (new or old) lying on an edge. + +The result of interferences of the type Face/Face in most cases is intersection curves, which go through some vertices lying on the faces. + +The position of vertex *Vi* on curve *C* can be defined by a value of parameter ti of the 3D point of the vertex on the curve. +Pave *PVi* on curve *C* is a structure containing the vertex *Vi* and correspondent value of the parameter ti of the 3D point of the vertex on the curve. Curve *C* can be a 3D or a 2D curve. + +@figure{/specification/boolean_operations/images/operations_image011.svg,"Paves",340} + +Two paves *PV1* and *PV2* on the same curve *C* can be compared using the parameter value @code PV1 > PV2 if t1 > t2 @endcode + +The usage of paves allows binding of the vertex to the curve (or any structure that contains a curve: edge, intersection curve). + + +@subsection specification__boolean_3_3 Pave Blocks + +A set of paves *PVi (i=1, 2...nPV)*, where *nPV* is the number of paves] of curve *C* can be sorted in the increasing order using the value of parameter *t* on curve *C*. + +A pave block *PBi* is a part of the object (edge, intersection curve) between neighboring paves. + +@figure{/specification/boolean_operations/images/operations_image012.svg,"Pave Blocks",340} + +Any finite source edge *E* has at least one pave block that contains two paves *PVb* and *PVe*: +* Pave *PVb* corresponds to the vertex *Vb* with minimal parameter tb on the curve of the edge. +* Pave *PVe* corresponds to the vertex *Ve* with maximal parameter te on the curve of the edge. + +@subsection specification__boolean_3_4 Shrunk Range + +Pave block *PV* of curve *C* is bounded by vertices *V1* and *V2* with tolerance values *Tol(V1)* and *Tol(V2)*. Curve *C* has its own tolerance value *Tol(C)*: +* In case of edge, the tolerance value is the tolerance of the edge. +* In case of intersection curve, the tolerance value is obtained from an intersection algorithm. + +@figure{/specification/boolean_operations/images/operations_image013.svg,"Shrunk Range",340} + +The theoretical parametric range of the pave block is [t1C, t2C]. + +The positions of the vertices *V1* and *V2* of the pave block can be different. The positions are determined by the following conditions: +~~~~ +Distance (P1, P1c) is equal or less than Tol(V1) + Tol(C) +Distance (P2, P2c) is equal or less than Tol(V2) + Tol(C) +~~~~ +The Figure shows that each tolerance sphere of a vertex can reduce the parametric range of the pave block to a range [t1S, t2S]. The range [t1S, t2S] is the shrunk range of the pave block. + +The shrunk range of the pave block is the part of 3D curve that can interfere with other shapes. + +@subsection specification__boolean_3_5 Common Blocks + +The interferences of the type Edge/Edge, Edge/Face produce results as common parts. + +In case of Edge/Edge interference the common parts are pave blocks that have different base edges. + +@figure{/specification/boolean_operations/images/operations_image014.svg,"Common Blocks: Edge/Edge interference",340} + +If the pave blocks PB1, PB2…PBNbPB , where *NbPB* is the number of pave blocks have the same bounding vertices and geometrically coincide, the pave blocks form common block *CB*. + + +In case of Edge/Face interference the common parts are pave blocks lying on a face(s). + +@figure{/specification/boolean_operations/images/operations_image015.svg,"Common Blocks: Edge/Face interference",265} + +If the pave blocks *PBi* geometrically coincide with a face *Fj*, the pave blocks form common block *CB*. + +In general case a common block *CB* contains: +* Pave blocks *PBi (i=0,1,2, 3… NbPB)*. +* A set of faces *Fj (j=0,1... NbF), NbF* -- number of faces. + + +@subsection specification__boolean_3_6 FaceInfo + +The structure *FaceInfo* contains the following information: +* Pave blocks that have state **In** for the face; +* Vertices that have state **In** for the face; +* Pave blocks that have state **On** for the face; +* Vertices that have state **On** for the face; +* Pave blocks built up from intersection curves for the face; +* Vertices built up from intersection points for the face. + +@figure{/specification/boolean_operations/images/operations_image016.svg,"Face Info",420} + +In the figure, for face *F1*: +* Pave blocks that have state **In** for the face: *PBin1*. +* Vertices that have state **In** for the face: *Vin1*. +* Pave blocks that have state **On** for the face: *PBon11*, *PBon12*, *PBon2*, *PBon31*, *PBon32*, *PBon4*. +* Vertices that have state **On** for the face: *V1, V2, V3, V4, V5, V6*. +* Pave blocks built up from intersection curves for the face: *PBsc1*. +* Vertices built up from intersection points for the face: none + + +@section specification__boolean_4 Data Structure + +Data Structure (DS) is used to: +* Store information about input data and intermediate results; +* Provide the access to the information; +* Provide the links between the chunks of information. + +This information includes: +* Arguments; +* Shapes; +* Interferences; +* Pave Blocks; +* Common Blocks. + +Data Structure is implemented in the class *BOPDS_DS*. + +@subsection specification__boolean_4_1 Arguments + +The arguments are shapes (in terms of *TopoDS_Shape*): +* Number of arguments is unlimited. +* Each argument is a valid shape (in terms of *BRepCheck_Analyzer*). +* Each argument can be of one of the following types (see the Table): + +| No | Type | Index of Type | +| :----- | :----- | :----- | +| 1 | COMPOUND | 0 | +| 2 | COMPSOLID | 1 | +| 3 | SOLID | 2 | +| 4 | SHELL | 3 | +| 5 | FACE | 4 | +| 6 | WIRE | 5 | +| 7 | EDGE | 6 | +| 8 | VERTEX | 7 | + +* The argument of type *0 (COMPOUND)* can include any number of shapes of an arbitrary type (0, 1…7). +* The argument should not be self-interfered, i.e. all sub-shapes of the argument that have geometrical coincidence through any topological entities (vertices, edges, faces) must share these entities. +* There are no restrictions on the type of underlying geometry of the shapes. The faces or edges of arguments *Si* can have underlying geometry of any type supported by Open CASCADE Technology modeling algorithms (in terms of *GeomAbs_CurveType* and *GeomAbs_SurfaceType*). +* The faces or edges of the arguments should have underlying geometry with continuity that is not less than C1. + +@subsection specification__boolean_4_2 Shapes + +The information about Shapes is stored in structure *BOPDS_ShapeInfo*. The objects of type *BOPDS_ShapeInfo* are stored in the container of array type. The array allows getting the access to the information by an index (DS index). +The structure *BOPDS_ShapeInfo* has the following contents: + + +| Name | Contents | +| :-------- | :----- | +| *myShape* | Shape itself | +| *myType* | Type of shape | +| *myBox* | 3D bounding box of the shape | +| *mySubShapes* | List of DS indices of sub-shapes | +| *myReference* | Storage for some auxiliary information | +| *myFlag* | Storage for some auxiliary information | + +@subsection specification__boolean_4_3 Interferences + +The information about interferences is stored in the instances of classes that are inherited from class BOPDS_Interf. + +| Name | Contents | +| :----- | :----- | +| *BOPDS_Interf* | Root class for interference | +| *Index1* | DS index of the shape 1 | +| *Index2* | DS index of the shape 2 | +| *BOPDS_InterfVV* | Storage for Vertex/Vertex interference | +| *BOPDS_InterfVE* | Storage for Vertex/Edge interference | +| *myParam* | The value of parameter of the point of the vertex on the curve of the edge | +| *BOPDS_InterfVF* | Storage for Vertex/Face interference | +| *myU, myV* | The value of parameters of the point of the vertex on the surface of the face | +| *BOPDS_InterfEE* | Storage for Edge/Edge interference | +| *myCommonPart* | Common part (in terms of *IntTools_CommonPart* ) | +| *BOPDS_InterfEF* | Storage for Edge/Face interference | +| *myCommonPart* | Common part (in terms of *IntTools_CommonPart* ) | +| *BOPDS_InterfFF* | Storage for Face/Face interference | +| *myTolR3D, myTolR2D* | The value of tolerances of curves (points) reached in 3D and 2D | +| *myCurves* | Intersection Curves (in terms of *BOPDS_Curve*) | +| *myPoints* | Intersection Points (in terms of *BOPDS_Point*) | +| *BOPDS_InterfVZ* | Storage for Vertex/Solid interference | +| *BOPDS_InterfEZ* | Storage for Edge/Solid interference | +| *BOPDS_InterfFZ* | Storage for Face/Solid interference | +| *BOPDS_InterfZZ* | Storage for Solid/Solid interference | + + + + + +The Figure shows inheritance diagram for *BOPDS_Interf* classes. + +@figure{/specification/boolean_operations/images/operations_image017.svg,"BOPDS_Interf classes",420} + + +@subsection specification__boolean_4_4 Pave, PaveBlock and CommonBlock + +The information about the pave is stored in objects of type *BOPDS_Pave*. + +| Name | Contents | +| :--- | :------ | +| *BOPDS_Pave* | | +| *myIndex* | DS index of the vertex | +| *myParam* | Value of the parameter of the 3D point of vertex on curve. | + +The information about pave blocks is stored in objects of type *BOPDS_PaveBlock*. + +| Name | Contents | +| :--- | :------ | +| *BOPDS_PaveBlock* | | +| *myEdge* | DS index of the edge produced from the pave block | +| *myOriginalEdge* | DS index of the source edge | +| *myPave1* | Pave 1 (in terms of *BOPDS_Pave*) | +| *myPave2* | Pave 2 (in terms of *BOPDS_Pave*) | +| *myExtPaves* | The list of paves (in terms of *BOPDS_Pave*) that is used to store paves lying inside the pave block during intersection process | +| *myCommonBlock* | The reference to common block (in terms of *BOPDS_CommonBlock*) if the pave block is a common block | +| *myShrunkData* | The shrunk range of the pave block | + +* To be bound to an edge (or intersection curve) the structures of type *BOPDS_PaveBlock* are stored in one container of list type (BOPDS_ListOfPaveBlock). +* In case of edge, all the lists of pave blocks above are stored in one container of array type. The array allows getting the access to the information by index of the list of pave blocks for the edge. This index (if exists) is stored in the field *myReference*. + +The information about common block is stored in objects of type *BOPDS_CommonBlock*. + +| Name | Contents | +| :---- | :------ | +| *BOPDS_CommonBlock* | | +| *myPaveBlocks* | The list of pave blocks that are common in terms of @ref specification__boolean_3_5 "Common Blocks" | +| *myFaces* | The list of DS indices of the faces, on which the pave blocks lie. | + + +@subsection specification__boolean_4_5 Points and Curves +The information about intersection point is stored in objects of type *BOPDS_Point*. + +| Name | Contents | +| :---- | :----- | +| *BOPDS_Point* | | +| *myPnt* | 3D point | +| *myPnt2D1* | 2D point on the face1 | +| *myPnt2D2* | 2D point on the face2 | + +The information about intersection curve is stored in objects of type *BOPDS_Curve*. + +| Name | Contents | +| :---- | :----- | +| *BOPDS_Curve* | | +| *myCurve* | The intersection curve (in terms of *IntTools_Curve* ) | +| *myPaveBlocks* | The list of pave blocks that belong to the curve | +| *myBox* | The bounding box of the curve (in terms of *Bnd_Box* ) | + +@subsection specification__boolean_4_6 FaceInfo +The information about *FaceInfo* is stored in a structure *BOPDS_FaceInfo*. +The structure *BOPDS_FaceInfo* has the following contents. + +| Name | Contents | +| :---- | :----- | +| *BOPDS_FaceInfo* | | +| *myPaveBlocksIn* | Pave blocks that have state In for the face | +| *myVerticesIn* | Vertices that have state In for the face | +| *myPaveBlocksOn* | Pave blocks that have state On for the face | +| *myVerticesOn* | Vertices that have state On for the face | +| *myPaveBlocksSc* | Pave blocks built up from intersection curves for the face | +| *myVerticesSc* | Vertices built up from intersection points for the face + + +The objects of type *BOPDS_FaceInfo* are stored in one container of array type. The array allows getting the access to the information by index. This index (if exists) is stored in the field *myReference*. + +@section specification__boolean_root_classes Root Classes + +@subsection specification__boolean_root_classes_1 Class BOPAlgo_Options +The class *BOPAlgo_Options* provides the following options for the algorithms: +* Set the appropriate memory allocator; +* Check the presence of the Errors and Warnings; +* Turn on/off the parallel processing; +* Set the additional tolerance for the operation; +* Break the operations by user request; +* Usage of Oriented Bounding boxes in the operation. + +@subsection specification__boolean_root_classes_2 Class BOPAlgo_Algo + +The class *BOPAlgo_Algo* provides the base interface for all algorithms: +* Perform the operation; +* Check the input data; +* Check the result. + +@section specification__boolean_5 Intersection Part + +Intersection Part (IP) is used to +* Initialize the Data Structure; +* Compute interferences between the arguments (or their sub-shapes); +* Compute same domain vertices, edges; +* Build split edges; +* Build section edges; +* Build p-curves; +* Store all obtained information in DS. + +IP is implemented in the class *BOPAlgo_PaveFiller*. + +@figure{/specification/boolean_operations/images/operations_image064.png,"Diagram for Class BOPAlgo_PaveFiller",230} + +The description provided in the next paragraphs is coherent with the implementation of the method *BOPAlgo_PaveFiller::Perform()*. + +@subsection specification__boolean_5_1 Initialization +The input data for the step is the Arguments. The description of initialization step is shown in the Table. + +| No | Contents | Implementation | +| :--- | :----- | :----- | +| 1 | Initialization the array of shapes (in terms of @ref specification__boolean_4_2 "Shapes"). Filling the array of shapes. | *BOPDS_DS::Init()* | +| 2 | Initialization the array pave blocks (in terms of @ref specification__boolean_4_4 "Pave, PaveBlock, CommonBlock") | *BOPDS_DS::Init()* | +| 3 | Initialization of intersection Iterator. The intersection Iterator is the object that computes intersections between sub-shapes of the arguments in terms of bounding boxes. The intersection Iterator provides approximate number of the interferences for given type (in terms of @ref specification__boolean_3_1 "Interferences") | *BOPDS_Iterator* | +| 4 | Initialization of intersection Context. The intersection Context is an object that contains geometrical and topological toolkit (classifiers, projectors, etc). The intersection Context is used to cache the tools to increase the algorithm performance. | *IntTools_Context* | + + +@subsection specification__boolean_5_2 Compute Vertex/Vertex Interferences + +The input data for this step is the DS after the @ref specification__boolean_5_1 "Initialization". The description of this step is shown in the table : + + +| No | Contents | Implementation | +| :--- | :---- | :----- | +| 1 | Initialize array of Vertex/Vertex interferences. | *BOPAlgo_PaveFiller::PerformVV()* | +| 2 | Access to the pairs of interfered shapes (nVi, nVj)k, k=0, 1…nk, where *nVi* and *nVj* are DS indices of vertices *Vi* and *Vj* and *nk* is the number of pairs. | *BOPDS_Iterator* | +| 3 | Compute the connexity chains of interfered vertices *nV1C, nV2C… nVnC)k, C=0, 1…nCs*, where *nCs* is the number of the connexity chains | *BOPAlgo_Tools::MakeBlocksCnx()* | +| 4 | Build new vertices from the chains *VNc. C=0, 1…nCs.* | *BOPAlgo_PaveFiller::PerformVV()* | +| 5 | Append new vertices in DS. | *BOPDS_DS::Append()* | +| 6 | Append same domain vertices in DS. | *BOPDS_DS::AddShapeSD()* | +| 7 | Append Vertex/Vertex interferences in DS. | *BOPDS_DS::AddInterf()* | + +* The pairs of interfered vertices are: (nV11, nV12), (nV11, nV13), (nV12, nV13), (nV13, nV15), (nV13, nV14), (nV14, nV15), (nV21, nV22), (nV21, nV23), (nV22, nV23); +* These pairs produce two chains: (nV11, nV12, nV13, nV14, nV15) and (nV21, nV22, nV23); +* Each chain is used to create a new vertex, *VN1* and *VN2*, correspondingly. + +The example of connexity chains of interfered vertices is given in the image: + +@figure{/specification/boolean_operations/images/operations_image018.svg,"Connexity chains of interfered vertices",394} + + +@subsection specification__boolean_5_3 Compute Vertex/Edge Interferences + +The input data for this step is the DS after computing Vertex/Vertex interferences. + +| No | Contents | Implementation | +| :--- | :--- | :--- | +| 1 | Initialize array of Vertex/Edge interferences | *BOPAlgo_PaveFiller::PerformVE()* | +| 2 | Access to the pairs of interfered shapes (nVi, nEj)k k=0, 1…nk, where *nVi* is DS index of vertex *Vi*, *nEj* is DS index of edge *Ej* and *nk* is the number of pairs. | *BOPDS_Iterator* | +| 3 | Compute paves. See @ref specification__boolean_3_1_2 "Vertex/Edge Interference" | *BOPInt_Context::ComputeVE()* | +| 4 | Initialize pave blocks for the edges *Ej* involved in the interference | *BOPDS_DS:: ChangePaveBlocks()* | +| 5 | Append the paves into the pave blocks in terms of @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock" | *BOPDS_PaveBlock:: AppendExtPave()* | +| 6 | Append Vertex/Edge interferences in DS | *BOPDS_DS::AddInterf()* | + +@subsection specification__boolean_5_4 Update Pave Blocks +The input data for this step is the DS after computing Vertex/Edge Interferences. + +| No | Contents | Implementation | +| :--- | :---- | :--- | +| 1 | Each pave block PB containing internal paves is split by internal paves into new pave blocks *PBN1, PBN2… PBNn*. PB is replaced by new pave blocks *PBN1, PBN2… PBNn* in the DS. | *BOPDS_DS:: UpdatePaveBlocks()* | + +@subsection specification__boolean_5_5 Compute Edge/Edge Interferences + +The input data for this step is the DS after updating Pave Blocks. + +| No | Contents | Implementation | +| :---- | :---- | :----- | +| 1 | Initialize array of Edge/Edge interferences | *BOPAlgo_PaveFiller::PerformEE()* | +| 2 | Access to the pairs of interfered shapes (nEi, nEj)k, k=0, 1…nk, where *nEi* is DS index of the edge *Ei*, *nEj* is DS index of the edge *Ej* and *nk* is the number of pairs. | *BOPDS_Iterator* | +| 3 | Initialize pave blocks for the edges involved in the interference, if it is necessary. | *BOPDS_DS:: ChangePaveBlocks()* | +| 4 | Access to the pave blocks of interfered shapes: (PBi1, PBi2…PBiNi) for edge *Ei* and (PBj1, PBj2…PBjNj) for edge *Ej* | *BOPAlgo_PaveFiller::PerformEE()* | +| 5 | Compute shrunk data for pave blocks in terms of @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock", if it is necessary. | *BOPAlgo_PaveFiller::FillShrunkData()* | +| 6 | Compute Edge/Edge interference for pave blocks *PBix* and *PBiy*. The result of the computation is a set of objects of type *IntTools_CommonPart* | *IntTools_EdgeEdge* | +| 7.1 | For each *CommonPart* of type *VERTEX:* Create new vertices *VNi (i =1, 2…,NbVN),* where *NbVN* is the number of new vertices. Intersect the vertices *VNi* using the steps Initialization and compute Vertex/Vertex interferences as follows: a) create a new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use new vertices *VNi (i=1, 2…,NbVN), NbVN* as arguments (in terms of *TopoDs_Shape*) of *PFn*; c) invoke method *Perform()* for *PFn*. The resulting vertices *VNXi (i=1, 2…,NbVNX)*, where *NbVNX* is the number of vertices, are obtained via mapping between *VNi* and the results of *PVn*. | *BOPTools_Tools::MakeNewVertex()* | +| 7.2 | For each *CommonPart* of type *EDGE:* Compute the coinciding connexity chains of pave blocks (PB1C, PB2C… PNnC)k, C=0, 1…nCs, where *nCs* is the number of the connexity chains. Create common blocks (CBc. C=0, 1…nCs) from the chains. Attach the common blocks to the pave blocks. | *BOPAlgo_Tools::PerformCommonBlocks()* | +| 8 | Post-processing. Append the paves of *VNXi* into the corresponding pave blocks in terms of @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock" | *BOPDS_PaveBlock:: AppendExtPave()* | +| 9 | Split common blocks CBc by the paves. | *BOPDS_DS:: UpdateCommonBlock()* | +| 10 | Append Edge/Edge interferences in the DS. | *BOPDS_DS::AddInterf()* | + +The example of coinciding chains of pave blocks is given in the image: + +@figure{/specification/boolean_operations/images/operations_image019.png,"Coinciding chains of pave blocks",420} + +* The pairs of coincided pave blocks are: (PB11, PB12), (PB11, PB13), (PB12, PB13), (PB21, PB22), (PB21, PB23), (PB22, PB23). +* The pairs produce two chains: (PB11, PB12, PB13) and (PB21, PB22, PB23). + +@subsection specification__boolean_5_6 Compute Vertex/Face Interferences + +The input data for this step is the DS after computing Edge/Edge interferences. + +| No | Contents | Implementation | +| :---- | :--- | :---- | +| 1 | Initialize array of Vertex/Face interferences | *BOPAlgo_PaveFiller::PerformVF()* | +| 2 | Access to the pairs of interfered shapes (nVi, nFj)k, k=0, 1…nk, where *nVi* is DS index of the vertex *Vi*, *nFj* is DS index of the edge *Fj* and *nk* is the number of pairs. | *BOPDS_Iterator* | +| 3 | Compute interference See @ref specification__boolean_3_1_3 "Vertex/Face Interference" | *BOPInt_Context::ComputeVF()* | +| 4 | Append Vertex/Face interferences in the DS | *BOPDS_DS::AddInterf()* | +| 5 | Repeat steps 2-4 for each new vertex *VNXi (i=1, 2…,NbVNX),* where *NbVNX* is the number of vertices. | *BOPAlgo_PaveFiller::TreatVerticesEE()* | + +@subsection specification__boolean_5_7 Compute Edge/Face Interferences +The input data for this step is the DS after computing Vertex/Face Interferences. + +| No | Contents | Implementation | +| :---- | :---- | :---- | +| 1 | Initialize array of Edge/Face interferences | *BOPAlgo_PaveFiller::PerformEF()* | +| 2 | Access to the pairs of interfered shapes (nEi, nFj)k, k=0, 1…nk, where *nEi* is DS index of edge *Ei*, *nFj* is DS index of face *Fj* and *nk* is the number of pairs. | *BOPDS_Iterator* | +| 3 | Initialize pave blocks for the edges involved in the interference, if it is necessary. | *BOPDS_DS::ChangePaveBlocks()* | +| 4 | Access to the pave blocks of interfered edge (PBi1, PBi2…PBiNi) for edge *Ei* | *BOPAlgo_PaveFiller::PerformEF()* | +| 5 | Compute shrunk data for pave blocks (in terms of @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock") if it is necessary. | *BOPAlgo_PaveFiller::FillShrunkData()* | +| 6 | Compute Edge/Face interference for pave block *PBix*, and face *nFj*. The result of the computation is a set of objects of type *IntTools_CommonPart* | *IntTools_EdgeFace* | +| 7.1 | For each *CommonPart* of type *VERTEX:* Create new vertices *VNi (i=1, 2…,NbVN),* where *NbVN* is the number of new vertices. Merge vertices *VNi* as follows: a) create new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use new vertices *VNi (i=1, 2…,NbVN), NbVN* as arguments (in terms of *TopoDs_Shape*) of *PFn*; c) invoke method *Perform()* for *PFn*. The resulting vertices *VNXi (i=1, 2…,NbVNX)*, where *NbVNX* is the number of vertices, are obtained via mapping between *VNi* and the results of *PVn*. | *BOPTools_Tools::MakeNewVertex()* and *BOPAlgo_PaveFiller::PerformVertices1()* | +| 7.2 | For each *CommonPart* of type *EDGE:* Create common blocks (CBc. C=0, 1…nCs) from pave blocks that lie on the faces. Attach the common blocks to the pave blocks. | *BOPAlgo_Tools::PerformCommonBlocks()* | +| 8 | Post-processing. Append the paves of *VNXi* into the corresponding pave blocks in terms of @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock". | *BOPDS_PaveBlock:: AppendExtPave()* | +| 9 | Split pave blocks and common blocks *CBc* by the paves. | *BOPAlgo_PaveFiller::PerformVertices1()*, *BOPDS_DS:: UpdatePaveBlock()* and *BOPDS_DS:: UpdateCommonBlock()* | +| 10 | Append Edge/Face interferences in the DS | *BOPDS_DS::AddInterf()* | +| 11 | Update *FaceInfo* for all faces having EF common parts. | *BOPDS_DS:: UpdateFaceInfoIn()* | + + +@subsection specification__boolean_5_8 Build Split Edges + +The input data for this step is the DS after computing Edge/Face Interferences. + +For each pave block *PB* take the following steps: + +| No | Contents | Implementation | +| :--- | :--- | :--- | +| 1 | Get the real pave block *PBR*, which is equal to *PB* if *PB* is not a common block and to *PB1* if *PB* is a common block. *PB1* is the first pave block in the pave blocks list of the common block. See @ref specification__boolean_4_4 "Pave, PaveBlock and CommonBlock". | *BOPAlgo_PaveFiller::MakeSplitEdges()* | +| 2 | Build the split edge *Esp* using the information from *DS* and *PBR*. | *BOPTools_Tools::MakeSplitEdge()* | +| 3 | Compute *BOPDS_ShapeInfo* contents for Esp | *BOPAlgo_PaveFiller::MakeSplitEdges()* | +| 4 | Append *BOPDS_ShapeInfo* contents to the DS | *BOPDS_DS::Append()* | + +@subsection specification__boolean_5_9 Compute Face/Face Interferences + +The input data for this step is DS after building Split Edges. + +| No | Contents | Implementation | +| :--- | :--- | :--- | +| 1 | Initialize array of Face/Face interferences | *BOPAlgo_PaveFiller::PerformFF()* | +| 2 | Access to the pairs of interfered shapes (nFi, nFj)k, k=0, 1…nk, where *nFi* is DS index of edge *Fi*, *nFj* is DS index of face *Fj* and *nk* is the number of pairs. | *BOPDS_Iterator* | +| 3 | Compute Face/Face interference | *IntTools_FaceFace* | +| 4 | Append Face/Face interferences in the DS. | *BOPDS_DS::AddInterf()* | + +@subsection specification__boolean_5_10 Build Section Edges + +The input data for this step is the DS after computing Face/Face interferences. + +| No | Contents | Implementation | +| :---- | :---- | :---- | +| 1 | For each Face/Face interference *nFi, nFj*, retrieve @ref specification__boolean_4_6 "FaceInfo". Create draft vertices from intersection points *VPk (k=1, 2…, NbVP)*, where *NbVP* is the number of new vertices, and the draft vertex *VPk* is created from an intersection point if *VPk ≠ Vm (m = 0, 1, 2… NbVm)*, where *Vm* is an existing vertex for the faces *nFi* and *nF,j* (*On* or *In* in terms of *TopoDs_Shape*), *NbVm* is the number of vertices existing on faces *nFi* and *nF,j* and ≠ -- means non-coincidence in terms of @ref specification__boolean_3_1_1 "Vertex/Vertex interference". | *BOPAlgo_PaveFiller::MakeBlocks()* | +| 2 | For each intersection curve *Cijk* | | +| 2.1 | Create paves PVc for the curve using existing vertices, i.e. vertices On or In (in terms of *FaceInfo*) for faces *nFi* and *nFj*. Append the paves *PVc* | *BOPAlgo_PaveFiller::PutPaveOnCurve()* and *BOPDS_PaveBlock::AppendExtPave()* | +| 2.2 | Create technological vertices *Vt*, which are the bounding points of an intersection curve (with the value of tolerance *Tol(Cijk)*). Each vertex *Vt* with parameter *Tt* on curve *Cijk* forms pave *PVt* on curve *Cijk*. Append technological paves. | *BOPAlgo_PaveFiller::PutBoundPaveOnCurve()* | +| 2.3 | Create pave blocks *PBk* for the curve using paves (k=1, 2…, NbPB), where *NbPB* is the number of pave blocks | *BOPAlgo_PaveFiller::MakeBlocks()* | +| 2.4 | Build draft section edges *ESk* using the pave blocks (k=1, 2…, NbES), where *NbES* is the number of draft section edges The draft section edge is created from a pave block *PBk* if *PBk* has state *In* or *On* for both faces *nFi* and *nF,j* and *PBk ≠ PBm (m=0, 1, 2… NbPBm)*, where *PBm* is an existing pave block for faces *nFi* and *nF,j* (*On* or *In* in terms of *FaceInfo*), *NbVm* is the number of existing pave blocks for faces *nFi* and *nF,j* and ≠ -- means non-coincidence (in terms of @ref specification__boolean_3_1_3 "Vertex/Face interference"). | *BOPTools_Tools::MakeEdge()* | +| 3 | Intersect the draft vertices *VPk (k=1, 2…, NbVP)* and the draft section edges *ESk (k=1, 2…, NbES)*. For this: a) create new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use vertices *VPk* and edges *ESk* as arguments (in terms of @ref specification__boolean_4_1 "Arguments") of *PFn*; c) invoke method *Perform()* for *PFn*. Resulting vertices *VPXk (k=1, 2… NbVPX)* and edges *ESXk (k=1, 2… NbESX)* are obtained via mapping between *VPk, ESk* and the results of *PVn*. | *BOPAlgo_PaveFiller::PostTreatFF()* | +| 4 | Update face info (sections about pave blocks and vertices) | *BOPAlgo_PaveFiller::PerformFF()* | + +@subsection specification__boolean_5_11 Build P-Curves +The input data for this step is the DS after building section edges. + +| No | Contents | Implementation | +| :---- | :---- | :---- | +| 1 | For each Face/Face interference *nFi* and *nFj* build p-Curves on *nFi* and *nFj* for each section edge *ESXk*. | *BOPAlgo_PaveFiller::MakePCurves()* | +| 2 | For each pave block that is common for faces *nFi* and *nFj* build p-Curves on *nFi* and *nFj*. | *BOPAlgo_PaveFiller::MakePCurves()* | + +@subsection specification__boolean_5_12 Process Degenerated Edges +The input data for this step is the DS after building P-curves. + +| No | Contents | Implementation | +| :---- | :---- | :---- | +| | For each degenerated edge *ED* having vertex *VD* | BOPAlgo_PaveFiller::ProcessDE() | +| 1 | Find pave blocks *PBi (i=1,2… NbPB)*, where *NbPB* is the number of pave blocks, that go through vertex *VD*. | *BOPAlgo_PaveFiller::FindPaveBlocks()* | +| 2 | Compute paves for the degenerated edge *ED* using a 2D curve of *ED* and a 2D curve of *PBi*. Form pave blocks *PBDi (i=1,2… NbPBD)*, where *NbPBD* is the number of the pave blocks for the degenerated edge *ED* | *BOPAlgo_PaveFiller::FillPaves()* | +| 3 | Build split edges *ESDi (i=1,2…NbESD)*, where *ESD* is the number of split edges, using the pave blocks *PBDi* | *BOPAlgo_PaveFiller:: MakeSplitEdge()* | + +@section specification__boolean_6 General description of the Building Part + +Building Part (BP) is used to +* Build the result of the operation +* Provide history information (in terms of \::Generated(), \::Modified() and \::IsDeleted()) +BP uses the DS prepared by *BOPAlgo_PaveFiller* described at chapter 5 as input data. +BP is implemented in the following classes: +* *BOPAlgo_Builder* -- for the General Fuse operator (GFA). +* *BOPAlgo_BOP* -- for the Boolean Operation operator (BOA). +* *BOPAlgo_Section* -- for the Section operator (SA). +* *BOPAlgo_MakerVolume* -- for the Volume Maker operator. +* *BOPAlgo_Splitter* -- for the Splitter operator. +* *BOPAlgo_CellsBuilder* -- for the Cells Builder operator. + +@figure{/specification/boolean_operations/images/operations_image020.png,"Diagram for BP classes",300} + +The class *BOPAlgo_BuilderShape* provides the interface for algorithms that have: +* A Shape as the result; +* History information (in terms of \::Generated(), \::Modified() and \::IsDeleted()). + +@section specification__boolean_7 General Fuse Algorithm +@subsection specification__boolean_7_1 Arguments +The arguments of the algorithm are shapes (in terms of *TopoDS_Shape*). The main requirements for the arguments are described in @ref specification__boolean_4 "Data Structure" chapter. + +@subsection specification__boolean_7_2 Results + +During the operation argument *Si* can be split into several parts *Si1, Si2… Si1NbSp*, where *NbSp* is the number of parts. The set (Si1, Si2… Si1NbSp) is an image of argument *Si*. +* The result of the General Fuse operation is a compound. Each sub-shape of the compound corresponds to the certain argument shape S1, S2…Sn and has shared sub-shapes in accordance with interferences between the arguments. +* For the arguments of the type EDGE, FACE, SOLID the result contains split parts of the argument. +* For the arguments of the type WIRE, SHELL, COMPSOLID, COMPOUND the result contains the image of the shape of the corresponding type (i.e. WIRE, SHELL, COMPSOLID or COMPOUND). +The types of resulting shapes depend on the type of the corresponding argument participating in the operation. See the table below: + +| No | Type of argument | Type of resulting shape | Comments | +| :--- | :---- | :--- | :--- | +| 1 | COMPOUND | COMPOUND | The resulting COMPOUND is built from images of sub-shapes of type COMPOUND COMPSOLID, SHELL, WIRE and VERTEX. Sets of split sub-shapes of type SOLID, FACE, EDGE. | +| 2 | COMPSOLID | COMPSOLID | The resulting COMPSOLID is built from split SOLIDs. | +| 3 | SOLID | Set of split SOLIDs | | +| 4 | SHELL | SHELL | The resulting SHELL is built from split FACEs | +| 5 | FACE | Set of split FACEs | | +| 6 | WIRE | WIRE | The resulting WIRE is built from split EDGEs | +| 7 | EDGE | Set of split EDGEs | | +| 8 | VERTEX | VERTEX | | + +@subsection specification__boolean_7_3a Options + +The General Fuse algorithm has a set of options, which allow speeding-up the operation and improving the quality of the result: +* Parallel processing option allows running the algorithm in parallel mode; +* Fuzzy option allows setting the additional tolerance for the operation; +* Safe input shapes option allows preventing modification of the input shapes; +* Gluing option allows speeding-up the intersection of the arguments; +* Possibility to disable the check for the inverted solids among input shapes; +* Usage of Oriented Bounding Boxes in the operation; +* History support. + +For more detailed information on these options, see the @ref specification__boolean_11a "Advanced options" section. + +@subsection specification__boolean_7_3b Usage + +The following example illustrates how to use the GF algorithm: + +#### Usage of the GF algorithm on C++ level + +~~~~ +BOPAlgo_Builder aBuilder; +// Setting arguments +TopTools_ListOfShape aLSObjects = …; // Objects +aBuilder.SetArguments(aLSObjects); + +// Setting options for GF + +// Set parallel processing mode (default is false) +Standard_Boolean bRunParallel = Standard_True; +aBuilder.SetRunParallel(bRunParallel); + +// Set Fuzzy value (default is Precision::Confusion()) +Standard_Real aFuzzyValue = 1.e-5; +aBuilder.SetFuzzyValue(aFuzzyValue); + +// Set safe processing mode (default is false) +Standard_Boolean bSafeMode = Standard_True; +aBuilder.SetNonDestructive(bSafeMode); + +// Set Gluing mode for coinciding arguments (default is off) +BOPAlgo_GlueEnum aGlue = BOPAlgo_GlueShift; +aBuilder.SetGlue(aGlue); + +// Disabling/Enabling the check for inverted solids (default is true) +Standard Boolean bCheckInverted = Standard_False; +aBuilder.SetCheckInverted(bCheckInverted); + +// Set OBB usage (default is false) +Standard_Boolean bUseOBB = Standard_True; +aBuilder.SetUseOBB(buseobb); + +// Perform the operation +aBuilder.Perform(); + +// Check for the errors +if (aBuilder.HasErrors()) +{ + return; +} + +// Check for the warnings +if (aBuilder.HasWarnings()) +{ + // treatment of the warnings + ... +} + +// result of the operation +const TopoDS_Shape& aResult = aBuilder.Shape(); +~~~~ + +#### Usage of the GF algorithm on Tcl level + +~~~~ +# prepare the arguments +box b1 10 10 10 +box b2 3 4 5 10 10 10 +box b3 5 6 7 10 10 10 + +# clear inner contents +bclearobjects; bcleartools; + +# set the arguments +baddobjects b1 b2 b3 + +# setting options for GF + +# set parallel processing mode (default is 0) +brunparallel 1 + +# set Fuzzy value +bfuzzyvalue 1.e-5 + +# set safe processing mode (default is 0) +bnondestructive 1 + +# set gluing mode (default is 0) +bglue 1 + +# set check for inverted (default is 1) +bcheckinverted 0 + +# set obb usage (default is 0) +buseobb 1 + +# perform intersection +bfillds + +# perform GF operaton +bbuild result +~~~~ + +@subsection specification__boolean_7_3 Examples + +Have a look at the examples to better understand the definitions. + +@subsubsection specification__boolean_7_3_1 Case 1: Three edges intersecting at a point + +Let us consider three edges: *E1, E2* and *E3* that intersect in one 3D point. + +@figure{/specification/boolean_operations/images/operations_image021.svg,"Three Intersecting Edges",420} + +The result of the GFA operation is a compound containing 6 new edges: *E11, E12, E21, E22, E31*, and *E32*. These edges have one shared vertex *Vn1*. + +In this case: +* The argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*). +* The argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*). +* The argument edge *E3* has resulting split edges *E31* and *E32* (image of *E3*). + +@subsubsection specification__boolean_7_3_2 Case 2: Two wires and an edge + +Let us consider two wires *W1 (Ew11, Ew12, Ew13)* and *W2 (Ew21, Ew22, Ew23)* and edge *E1*. + +@figure{/specification/boolean_operations/images/operations_image022.svg,"Two wires and an edge",420} + +The result of the GF operation is a compound consisting of 2 wires: *Wn1 (Ew11, En1, En2, En3, Ew13)* and *Wn2 (Ew21, En2, En3, En4, Ew23)* and two edges: *E11* and *E12*. + +In this case : +* The argument *W1* has image *Wn1*. +* The argument *W2* has image *Wn2*. +* The argument edge *E1* has split edges *E11* and *E12*. (image of *E1*). +The edges *En1, En2, En3, En4* and vertex *Vn1* are new shapes created during the operation. Edge *Ew12* has split edges *En1, En2* and *En3* and edge *Ew22* has split edges *En2, En3* and *En4*. + +@subsubsection specification__boolean_7_3_3 Case 3: An edge intersecting with a face + +Let us consider edge *E1* and face *F2*: + +@figure{/specification/boolean_operations/images/operations_image023.svg,"An edge intersecting with a face",420} + +The result of the GF operation is a compound consisting of 3 shapes: +* Split edge parts *E11* and *E12* (image of *E1*). +* New face *F21* with internal edge *E12* (image of *F2*). + +@subsubsection specification__boolean_7_3_4 Case 4: An edge lying on a face + +Let us consider edge *E1* and face *F2*: + +@figure{/specification/boolean_operations/images/operations_image024.svg,"An edge lying on a face",420} + +The result of the GF operation is a compound consisting of 5 shapes: +* Split edge parts *E11, E12* and *E13* (image of *E1*). +* Split face parts *F21* and *F22* (image of *F2*). + + +@subsubsection specification__boolean_7_3_5 Case 5: An edge and a shell + +Let us consider edge *E1* and shell *Sh2* that consists of 2 faces: *F21* and *F22* + +@figure{/specification/boolean_operations/images/operations_image025.svg,"An edge and a shell",488} + +The result of the GF operation is a compound consisting of 5 shapes: +* Split edge parts *E11, E12 , E13* and *E14* (image of *E1*). +* Image shell *Sh21* (that contains split face parts *F211, F212, F221* and *F222*). + +@subsubsection specification__boolean_7_3_6 Case 6: A wire and a shell + +Let us consider wire *W1 (E1, E2, E3, E4)* and shell *Sh2 (F21, F22)*. +@figure{/specification/boolean_operations/images/operations_image026.svg,"A wire and a shell",427} + +The result of the GF operation is a compound consisting of 2 shapes: + +* Image wire *W11* that consists of split edge parts from wire *W1: E11, E12, E13* and *E14*. +* Image shell *Sh21* that contains split face parts: *F211, F212, F213, F221, F222* and *F223*. + +@subsubsection specification__boolean_7_3_7 Case 7: Three faces + +Let us consider 3 faces: *F1, F2* and *F3*. @figure{/specification/boolean_operations/images/operations_image027.png,"Three faces",420} + +The result of the GF operation is a compound consisting of 7 shapes: +* Split face parts: *Fn1, Fn2, Fn3, Fn4, Fn5, Fn6* and *Fn7*. + +@subsubsection specification__boolean_7_3_8 Case 8: A face and a shell + +Let us consider shell *Sh1 (F11, F12, F13)* and face *F2*. +@figure{/specification/boolean_operations/images/operations_image028.png,"A face and a shell",420} + +The result of the GF operation is a compound consisting of 4 shapes: +* Image shell *Sh11* that consists of split face parts from shell *Sh1: Fn1, Fn2, Fn3, Fn4, Fn5* and *Fn6*. +* Split parts of face *F2: Fn3, Fn6* and *Fn7*. + +@subsubsection specification__boolean_7_3_9 Case 9: A shell and a solid + +Let us consider shell *Sh1 (F11, F12…F16)* and solid *So2*. @figure{/specification/boolean_operations/images/operations_image029.png,"A shell and a solid: arguments",220} + +The result of the GF operation is a compound consisting of 2 shapes: +* Image shell *Sh11* consisting of split face parts of *Sh1: Fn1, Fn2 ... Fn8.* +* Solid *So21* with internal shell. (image of *So2*). +@figure{/specification/boolean_operations/images/operations_image030.png,"A shell and a solid: results",420} + +@subsubsection specification__boolean_7_3_10 Case 10: A compound and a solid + +Let us consider compound *Cm1* consisting of 2 solids *So11* and *So12*) and solid *So2*. +@figure{/specification/boolean_operations/images/operations_image031.png,"A compound and a solid: arguments",220} + +The result of the GF operation is a compound consisting of 4 shapes: +* Image compound *Cm11* consisting of split solid parts from *So11* and *So12 (Sn1, Sn2, Sn3, Sn4)*. +* Split parts of solid *So2 (Sn2, Sn3, Sn5)*. + +@figure{/specification/boolean_operations/images/operations_image032.png,"A compound and a solid: results",420} + +@subsection specification__boolean_7_4 Class BOPAlgo_Builder + +GFA is implemented in the class *BOPAlgo_Builder*. + +@subsubsection specification__boolean_7_4_1 Fields + +The main fields of the class are described in the Table: + +| Name | Contents | +| :---- | :---- | +| *myPaveFiller* | Pointer to the *BOPAlgo_PaveFiller* object | +| *myDS* | Pointer to the *BOPDS_DS* object | +| *myContext* | Pointer to the intersection Context | +| *myImages* | The Map between the source shape and its images | +| *myShapesSD* | The Map between the source shape (or split part of source shape) and the shape (or part of shape) that will be used in result due to same domain property. | + +@subsubsection specification__boolean_7_4_2 Initialization + +The input data for this step is a *BOPAlgo_PaveFiller* object (in terms of @ref specification__boolean_5 "Intersection") at the state after @ref specification__boolean_5_12 "Processing of degenerated edges" with the corresponding DS. + +| No | Contents | Implementation | +| :---- | :---- | :---- | +| 1 | Check the readiness of the DS and *BOPAlgo_PaveFiller*. | *BOPAlgo_Builder::CheckData()* | +| 2 | Build an empty result of type Compound. | *BOPAlgo_Builder::Prepare()* | + +@subsubsection specification__boolean_7_4_3 Build Images for Vertices + +The input data for this step is *BOPAlgo_Builder* object after Initialization. + +| No | Contents | Implementation | +| :--- | :--- | :--- | +| 1 | Fill *myShapesSD* by SD vertices using the information from the DS. | *BOPAlgo_Builder::FillImagesVertices()* | + +@subsubsection specification__boolean_7_4_4 Build Result of Type Vertex + +The input data for this step is *BOPAlgo_Builder* object after building images for vertices and *Type*, which is the shape type (*TopAbs_VERTEX*). + +| No | Contents | Implementation | +| :--- | :--- | :----- | +| 1 | For the arguments of type *Type*. If there is an image for the argument: add the image to the result. If there is no image for the argument: add the argument to the result. | *BOPAlgo_Builder::BuildResult()* | + +@subsubsection specification__boolean_7_4_5 Build Images for Edges + +The input data for this step is *BOPAlgo_Builder object* after building result of type vertex. + +| No | Contents | Implementation | +| :---- | :---- | :----- | +| 1 | For all pave blocks in the DS. Fill *myImages* for the original edge *E* by split edges *ESPi* from pave blocks. In case of common blocks on edges, use edge *ESPSDj* that corresponds to the leading pave block and fill *myShapesSD* by the pairs *ESPi/ESPSDj*. | *BOPAlgo_Builder::FillImagesEdges()* | + +@subsubsection specification__boolean_7_4_6 Build Result of Type Edge + +This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex", but for the type *Edge*. + +@subsubsection specification__boolean_7_4_7 Build Images for Wires + +The input data for this step is: +* *BOPAlgo_Builder* object after building result of type *Edge*; +* Original Shape -- Wire +* *Type* -- the shape type (TopAbs_WIRE). + +| No | Contents | Implementation | +| :---- | :---- | :----- | +| 1 | For all arguments of the type *Type*. Create a container C of the type *Type*. | *BOPAlgo_Builder::FillImagesContainers()* | +| 2 | Add to C the images or non-split parts of the *Original Shape*, taking into account its orientation. | *BOPAlgo_Builder::FillImagesContainers()* *BOPTools_Tools::IsSplitToReverse()* | +| 3 | Fill *myImages* for the *Original Shape* by the information above. | *BOPAlgo_Builder::FillImagesContainers()* | + +@subsubsection specification__boolean_7_4_8 Build Result of Type Wire + +This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex" but for the type *Wire*. + +@subsubsection specification__boolean_7_4_9 Build Images for Faces + +The input data for this step is *BOPAlgo_Builder* object after building result of type *Wire*. + +| No | Contents | Implementation | +| :--- | :--- | :--- | +| 1 | Build Split Faces for all interfered DS shapes *Fi* of type *FACE*. | | +| 1.1 | Collect all edges or their images of *Fi(ESPij)*. | *BOPAlgo_Builder::BuildSplitFaces()* | +| 1.2 | Impart to ESPij the orientation to be coherent with the original one. | *BOPAlgo_Builder::BuildSplitFaces()* | +| 1.3 | Collect all section edges *SEk* for *Fi*. | *BOPAlgo_Builder::BuildSplitFaces()* | +| 1.4 | Build split faces for *Fi (Fi1, Fi2…FiNbSp)*, where *NbSp* is the number of split parts (see @ref specification__boolean_7_2 "Building faces from a set of edges" for more details). | *BOPAlgo_BuilderFace* | +| 1.5 | Impart to (Fi1, Fi2…FiNbSp) the orientation coherent with the original face *Fi*. | *BOPAlgo_Builder::BuildSplitFaces()* | +| 1.6 | Fill the map mySplits with *Fi/(Fi1, Fi2…FiNbSp)* | *BOPAlgo_Builder::BuildSplitFaces()* | +| 2 | Fill Same Domain faces | *BOPAlgo_Builder::FillSameDomainFaces* | +| 2.1 | Find and collect in the contents of *mySplits* the pairs of same domain split faces (Fij, Fkl)m, where *m* is the number of pairs. | *BOPAlgo_Builder::FillSameDomainFaces* *BOPTools_Tools::AreFacesSameDomain()* | +| 2.2 | Compute the connexity chains 1) of same domain faces (F1C, F2C… FnC)k, C=0, 1…nCs, where *nCs* is the number of connexity chains. | *BOPAlgo_Builder::FillSameDomainFaces()* | +| 2.3 | Fill *myShapesSD* using the chains (F1C, F2C… FnC)k | *BOPAlgo_Builder::FillSameDomainFaces()* | +| 2.4 | Add internal vertices to split faces. | *BOPAlgo_Builder::FillSameDomainFaces()* | +| 2.5 | Fill *myImages* using *myShapesSD* and *mySplits*. | *BOPAlgo_Builder::FillSameDomainFaces()* | + + +The example of chains of same domain faces is given in the image: + +@figure{/specification/boolean_operations/images/operations_image033.svg,"Chains of same domain faces",420} + +* The pairs of same domain faces are: (F11, F21), (F22, F31), (F41, F51) , (F41, F6) and (F51, F6). +* The pairs produce the three chains: (F11, F21), (F22, F31) and (F41, F51, F6). + +@subsubsection specification__boolean_7_4_10 Build Result of Type Face +This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex" but for the type *Face*. + +@subsubsection specification__boolean_7_4_11 Build Images for Shells +The input data for this step is: +* *BOPAlgo_Builder* object after building result of type face; +* *Original Shape* -- a Shell; +* *Type* -- the type of the shape (TopAbs_SHELL). + +The procedure is the same as for building images for wires. + +@subsubsection specification__boolean_7_4_12 Build Result of Type Shell +This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex" but for the type *Shell*. + +@subsubsection specification__boolean_7_4_13 Build Images for Solids + +The input data for this step is *BOPAlgo_Builder* object after building result of type *Shell*. + +The following procedure is executed for all interfered DS shapes *Si* of type *SOLID*. + +| No | Contents | Implementation | +| :--- | :--- | :--- | +| 1 | Collect all images or non-split parts for all faces (FSPij) that have 3D state *In Si*. | *BOPAlgo_Builder::FillIn3DParts ()* | +| 2 | Collect all images or non-split parts for all faces of *Si* | *BOPAlgo_Builder::BuildSplitSolids()* | +| 3 | Build split solids for *Si -> (Si1, Si2…SiNbSp)*, where *NbSp* is the number of split parts (see @ref specification__boolean_7_2 "Building faces from a set of edges" for more details) | *BOPAlgo_BuilderSolid* | +| 4 | Fill the map Same Domain solids *myShapesSD* | *BOPAlgo_Builder::BuildSplitSolids()* | +| 5 | Fill the map *myImages* | *BOPAlgo_Builder::BuildSplitSolids()* | +| 6 | Add internal vertices to split solids | *BOPAlgo_Builder::FillInternalShapes()* | + +@subsubsection specification__boolean_7_4_14 Build Result of Type Solid +This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex", but for the type Solid. + +@subsubsection specification__boolean_7_4_15 Build Images for Type CompSolid + +The input data for this step is: +* *BOPAlgo_Builder* object after building result of type solid; +* *Original Shape* -- a Compsolid; +* *Type* -- the type of the shape (TopAbs_COMPSOLID). + +The procedure is the same as for building images for wires. + +@subsubsection specification__boolean_7_4_16 Build Result of Type Compsolid +This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex", but for the type Compsolid. + +@subsubsection specification__boolean_7_4_17 Build Images for Compounds +The input data for this step is as follows: +* *BOPAlgo_Builder* object after building results of type *compsolid*; +* *Original Shape* -- a Compound; +* *Type* -- the type of the shape (TopAbs_COMPOUND). + +The procedure is the same as for building images for wires. + +@subsubsection specification__boolean_7_4_18 Build Result of Type Compound + +This step is the same as @ref specification__boolean_7_4_4 "Building Result of Type Vertex", but for the type Compound. + +@subsubsection specification__boolean_7_4_19 Post-Processing +The purpose of the step is to correct tolerances of the result to provide its validity in terms of *BRepCheck_Analyzer.* + +The input data for this step is a *BOPAlgo_Builder* object after building result of type compound. + +| No | Contents | Implementation | +| :---- | :---- | :----- | +| 1 | Correct tolerances of vertices on curves | *BOPTools_Tools::CorrectPointOnCurve()* | +| 2 | Correct tolerances of edges on faces | *BOPTools_Tools::CorrectCurveOnSurface()* | + + +@section specification__boolean_8 Splitter Algorithm + +The Splitter algorithm allows splitting a group of arbitrary shapes by another group of arbitrary shapes.
+It is based on the General Fuse algorithm, thus all options of the General Fuse (see @ref specification__boolean_7_3a "GF Options") are also available in this algorithm. + +@subsection specification__boolean_8_1 Arguments + +* The arguments of the Splitter algorithm are divided into two groups - *Objects* (shapes that will be split) and *Tools* (shapes, by which the *Objects* will be split); +* The requirements for the arguments (both for *Objects* and *Tools*) are the same as for the General Fuse algorithm - there can be any number of arguments of any type in each group, but each argument should be valid and not self-interfered. + +@subsection specification__boolean_8_2 Results + +* The result of Splitter algorithm contains only the split parts of the shapes included into the group of *Objects*; +* The split parts of the shapes included only into the group of *Tools* are excluded from the result; +* If there are no shapes in the group of *Tools* the result of the operation will be equivalent to the result of General Fuse operation; +* The shapes can be split by other shapes from the same group (if these shapes are interfering). + +@subsection specification__boolean_8_3 Usage + +@subsubsection specification__boolean_8_3_1 API + +On the low level the Splitter algorithm is implemented in class *BOPAlgo_Splitter*. The usage of this algorithm looks as follows: +~~~~~ +BOPAlgo_Splitter aSplitter; +// Setting arguments and tools +TopTools_ListOfShape aLSObjects = …; // Objects +TopTools_ListOfShape aLSTools = …; // Tools +aSplitter.SetArguments(aLSObjects); +aSplitter.SetTools(aLSTools); + +// Set options for the algorithm +// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) +... + +// Perform the operation +aSplitter.Perform(); +if (aSplitter.HasErrors()) { //check error status + return; +} +// +const TopoDS_Shape& aResult = aSplitter.Shape(); // result of the operation +~~~~~ + +@subsubsection specification__boolean_8_3_2 DRAW + +The command *bsplit* implements the Splitter algorithm in DRAW. Similarly to the *bbuild* command for the General Fuse algorithm, the *bsplit* command should be used after the Pave Filler is filled. +~~~~~ +# s1 s2 s3 - objects +# t1 t2 t3 - tools +bclearobjects +bcleartools +baddobjects s1 s2 s3 +baddtools t1 t2 t3 +bfillds +bsplit result +~~~~~ + +@subsection specification__boolean_8_4 Examples + +@subsubsection specification__boolean_8_4_1 Example 1 + +Splitting a face by the set of edges: + +~~~~ +# draw script for reproducing +bclearobjects +bcleartools + +set height 20 +cylinder cyl 0 0 0 0 0 1 10 +mkface f cyl 0 2*pi -$height $height +baddobjects f + +# create tool edges +compound edges + +set nb_uedges 10 +set pi2 [dval 2*pi] +set ustep [expr $pi2/$nb_uedges] +for {set i 0} {$i <= $pi2} {set i [expr $i + $ustep]} { + uiso c cyl $i + mkedge e c -25 25 + add e edges +} + +set nb_vedges 10 +set vstep [expr 2*$height/$nb_vedges] +for {set i -20} {$i <= 20} {set i [expr $i + $vstep]} { + viso c cyl $i + mkedge e c + add e edges +} +baddctools edges + +bfillds +bsplit result +~~~~ + + + + + + +
@figure{/specification/boolean_operations/images/bsplit_image001.png,"Arguments",160}@figure{/specification/boolean_operations/images/bsplit_image002.png,"Result",160}
+ +@subsubsection specification__boolean_8_4_2 Example 2 + +Splitting a plate by the set of cylinders: + +~~~~ +# draw script for reproducing: +bclearobjects +bcleartools + +box plate 100 100 1 +baddobjects plate + +pcylinder p 1 11 +compound cylinders +for {set i 0} {$i < 101} {incr i 5} { + for {set j 0} {$j < 101} {incr j 5} { + copy p p1; + ttranslate p1 $i $j -5; + add p1 cylinders + } +} +baddtools cylinders + +bfillds +bsplit result +~~~~ + + + + + + +
@figure{/specification/boolean_operations/images/bsplit_image003.png,"Arguments",160}@figure{/specification/boolean_operations/images/bsplit_image004.png,"Result",160}
+ +@subsubsection specification__boolean_8_4_3 Example 3 + +Splitting shell hull by the planes: + + + + + +
@figure{/specification/boolean_operations/images/bsplit_image005.png,"Arguments",160}@figure{/specification/boolean_operations/images/bsplit_image006.png,"Results",160}
+ +@section specification__boolean_9 Boolean Operations Algorithm + +@subsection specification__boolean_9_1 Arguments + +* The arguments of BOA are shapes in terms of *TopoDS_Shape*. The main requirements for the arguments are described in the @ref specification__boolean_4 "Data Structure" +* There are two groups of arguments in BOA: + * Objects (S1=S11, S12, ...); + * Tools (S2=S21, S22, ...). +* The following table contains the values of dimension for different types of arguments: + +| No | Type of Argument | Index of Type | Dimension | +| :---- | :---- | :----- | :---- | +| 1 | COMPOUND | 0 | One of 0, 1, 2, 3 | +| 2 | COMPSOLID | 1 | 3 | +| 3 | SOLID | 2 | 3 | +| 4 | SHELL | 3 | 2 | +| 5 | FACE | 4 | 2 | +| 6 | WIRE | 5 | 1 | +| 7 | EDGE | 6 | 1 | +| 8 | VERTEX | 7 | 0 | + +* For Boolean operation Fuse all arguments should have equal dimensions. +* For Boolean operation Cut the minimal dimension of *S2* should not be less than the maximal dimension of *S1*. +* For Boolean operation Common the arguments can have any dimension. + +@subsection specification__boolean_9_3 Results. General Rules + +* The result of the Boolean operation is a compound (if defined). Each sub-shape of the compound has shared sub-shapes in accordance with interferences between the arguments. +* The content of the result depends on the type of the operation (Common, Fuse, Cut12, Cut21) and the dimensions of the arguments. +* The result of the operation Fuse is defined for arguments *S1* and *S2* that have the same dimension value : *Dim(S1)=Dim(S2)*. If the arguments have different dimension values the result of the operation Fuse is not defined. The dimension of the result is equal to the dimension of the arguments. For example, it is impossible to fuse an edge and a face. +* The result of the operation Fuse for arguments *S1* and *S2* contains the parts of arguments that have states **OUT** relative to the opposite arguments. +* The result of the operation Fuse for arguments *S1* and *S2* having dimension value 3 (Solids) is refined by removing all possible internal faces to provide minimal number of solids. +* The result of the operation Common for arguments *S1* and *S2* is defined for all values of the dimensions of the arguments. The result can contain shapes of different dimensions, but the minimal dimension of the result will be equal to the minimal dimension of the arguments. For example, the result of the operation Common between edges cannot be a vertex. +* The result of the operation Common for the arguments *S1* and *S2* contains the parts of the argument that have states **IN** and **ON** relative to the opposite argument. +* The result of the operation Cut is defined for arguments *S1* and *S2* that have values of dimensions *Dim(S2)* that should not be less than *Dim(S1)*. The result can contain shapes of different dimensions, but the minimal dimension of the result will be equal to the minimal dimension of the objects *Dim(S1)*. The result of the operation *Cut12* is not defined for other cases. For example, it is impossible to cut an edge from a solid, because a solid without an edge is not defined. +* The result of the operation *Cut12* for arguments *S1* and *S2* contains the parts of argument *S1* that have state **OUT** relative to the opposite argument *S2*. +* The result of the operation *Cut21* for arguments *S1* and *S2* contains the parts of argument *S2* that have state **OUT** relative to the opposite argument *S1*. +* For the arguments of collection type (WIRE, SHELL, COMPSOLID) the type will be passed in the result. For example, the result of Common operation between Shell and Wire will be a compound containing Wire. +* For the arguments of collection type (WIRE, SHELL, COMPSOLID) containing overlapping parts the overlapping parts passed into result will be repeated for each container from the input shapes containing such parts. The containers completely included in other containers will be avoided in the result. +* For the arguments of collection type (WIRE, SHELL, COMPSOLID) the containers included into result will have the same orientation as the original containers from arguments. In case of duplication its orientation will be defined by the orientation of the first container in arguments. Each container included into result will have coherent orientation of its sub-shapes. +* The result of the operation Fuse for the arguments of collection type (WIRE, SHELL) will consist of the shapes of the same collection type. The overlapping parts (EDGES/FACES) will be shared among containers, but duplicating containers will be avoided in the result. For example, the result of Fuse operation between two fully coinciding wires will be one wire, but the result of Fuse operation between two partially coinciding wires will be two wires sharing coinciding edges. +* The result of the operation Fuse for the arguments of type COMPSOLID will consist of the compound containing COMPSOLIDs created from connexity blocks of fused solids. +* The result of the operation Common for the arguments of collection type (WIRE, SHELL, COMPSOLID) will consist of the unique containers containing the overlapping parts. For example, the result of Common operation between two fully overlapping wires will be one wire containing all splits of edges. The number of wires in the result of Common operation between two partially overlapping wires will be equal to the number of connexity blocks of overlapping edges. + +@subsection specification__boolean_9_4 Examples + +@subsubsection specification__boolean_9_4_1 Case 1: Two Vertices + +Let us consider two interfering vertices *V1* and *V2*: + +@figure{/specification/boolean_operations/images/boolean_image001.svg,"",160} + +* The result of *Fuse* operation is the compound that contains new vertex *V*. + +@figure{/specification/boolean_operations/images/boolean_image002.svg,"",160} + +* The result of *Common* operation is a compound containing new vertex *V*. + +* The result of *Cut12* operation is an empty compound. +* The result of *Cut21* operation is an empty compound. + +@subsubsection specification__boolean_9_4_2 Case 2: A Vertex and an Edge + +Let us consider vertex *V1* and the edge *E2*, that intersect in a 3D point: + +@figure{/specification/boolean_operations/images/boolean_image004.png,"",230} + +* The result of *Fuse* operation is result is not defined because the dimension of the vertex (0) is not equal to the dimension of the edge (1). + +* The result of *Common* operation is a compound containing vertex *V1* as the argument *V1* has a common part with edge *E2*. + +@figure{/specification/boolean_operations/images/boolean_image005.png,"",230} + +* The result of *Cut12* operation is an empty compound. +* The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the edge (1). + +@subsubsection specification__boolean_9_4_3 Case 3: A Vertex and a Face + +Let us consider vertex *V1* and face *F2*, that intersect in a 3D point: + +@figure{/specification/boolean_operations/images/boolean_image006.png,"",230} + +* The result of *Fuse* operation is not defined because the dimension of the vertex (0) is not equal to the dimension of the face (2). + +* The result of *Common* operation is a compound containing vertex *V1* as the argument *V1* has a common part with face *F2*. + +@figure{/specification/boolean_operations/images/boolean_image007.png,"",230} + +* The result of *Cut12* operation is an empty compound. +* The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the face (2). + +@subsubsection specification__boolean_9_4_4 Case 4: A Vertex and a Solid + +Let us consider vertex *V1* and solid *S2*, that intersect in a 3D point: + +@figure{/specification/boolean_operations/images/boolean_image008.png,"",230} + +* The result of *Fuse* operation is not defined because the dimension of the vertex (0) is not equal to the dimension of the solid (3). + +* The result of *Common* operation is a compound containing vertex *V1* as the argument *V1* has a common part with solid *S2*. + +@figure{/specification/boolean_operations/images/boolean_image009.png,"",230} + +* The result of *Cut12* operation is an empty compound. +* The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the solid (3). + +@subsubsection specification__boolean_9_4_5 Case 5: Two edges intersecting at one point + +Let us consider edges *E1* and *E2* that intersect in a 3D point: + +@figure{/specification/boolean_operations/images/boolean_image010.svg,"",230} + +* The result of *Fuse* operation is a compound containing split parts of arguments i.e. 4 new edges *E11, E12, E21*, and *E22*. These edges have one shared vertex *Vn1*. +In this case: + * argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*); + * argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*). + +@figure{/specification/boolean_operations/images/boolean_image011.svg,"",230} + +* The result of *Common* operation is an empty compound because the dimension (0) of the common part between the edges (vertex) is less than the dimension of the arguments (1). + +* The result of *Cut12* operation is a compound containing split parts of the argument *E1*, i.e. 2 new edges *E11* and *E12*. These edges have one shared vertex *Vn1*. + +In this case the argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*). + +@figure{/specification/boolean_operations/images/boolean_image012.svg,"",230} + +* The result of *Cut21* operation is a compound containing split parts of the argument *E2*, i.e. 2 new edges *E21* and *E12*. These edges have one shared vertex *Vn1*. + +In this case the argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*). + +@figure{/specification/boolean_operations/images/boolean_image013.svg,"",70} + +@subsubsection specification__boolean_9_4_6 Case 6: Two edges having a common block + +Let us consider edges *E1* and *E2* that have a common block: + +@figure{/specification/boolean_operations/images/boolean_image014.svg,"",230} + +* The result of *Fuse* operation is a compound containing split parts of arguments i.e. 3 new edges *E11*, *E12* and *E22*. These edges have two shared vertices. +In this case: + * argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*); + * argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*); + * edge *E12* is common for the images of *E1* and *E2*. + +@figure{/specification/boolean_operations/images/boolean_image015.svg,"",230} + +* The result of *Common* operation is a compound containing split parts of arguments i.e. 1 new edge *E12*. In this case edge *E12* is common for the images of *E1* and *E2*. +The common part between the edges (edge) has the same dimension (1) as the dimension of the arguments (1). + +@figure{/specification/boolean_operations/images/boolean_image016.svg,"",230} + +* The result of *Cut12* operation is a compound containing a split part of argument *E1*, i.e. new edge *E11*. + +@figure{/specification/boolean_operations/images/boolean_image017.svg,"",230} + +* The result of *Cut21* operation is a compound containing a split part of argument *E2*, i.e. new edge *E22*. + +@figure{/specification/boolean_operations/images/boolean_image018.svg,"",230} + + +@subsubsection specification__boolean_9_4_7 Case 7: An Edge and a Face intersecting at a point + +Let us consider edge *E1* and face *F2* that intersect at a 3D point: + +@figure{/specification/boolean_operations/images/boolean_image019.png,"",230} + +* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the face (2). + +* The result of *Common* operation is an empty compound because the dimension (0) of the common part between the edge and face (vertex) is less than the dimension of the arguments (1). + +* The result of *Cut12* operation is a compound containing split parts of the argument *E1*, i.e. 2 new edges *E11* and *E12*. + +In this case the argument edge *E1* has no common parts with the face *F2* so the whole image of *E1* is in the result. + +@figure{/specification/boolean_operations/images/boolean_image020.png,"",230} + +* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the face (2). + +@subsubsection specification__boolean_9_4_8 Case 8: A Face and an Edge that have a common block + +Let us consider edge *E1* and face *F2* that have a common block: + +@figure{/specification/boolean_operations/images/boolean_image021.png,"",230} + +* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the face (2). + +* The result of *Common* operation is a compound containing a split part of the argument *E1*, i.e. new edge *E12*. + +In this case the argument edge *E1* has a common part with face *F2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *F2*. + +@figure{/specification/boolean_operations/images/boolean_image022.png,"",230} + +* The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*. + +In this case the argument edge *E1* has a common part with face *F2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of F2. + +@figure{/specification/boolean_operations/images/boolean_image023.png,"",230} + +* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the face (2). + +@subsubsection specification__boolean_9_4_9 Case 9: An Edge and a Solid intersecting at a point + +Let us consider edge *E1* and solid *S2* that intersect at a point: + +@figure{/specification/boolean_operations/images/boolean_image024.png,"",230} + +* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the solid (3). + +* The result of *Common* operation is a compound containing a split part of the argument *E1*, i.e. new edge *E12*. + +In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *S2*. + +@figure{/specification/boolean_operations/images/boolean_image025.png,"",230} + +* The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*. + +In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of *S2*. + +@figure{/specification/boolean_operations/images/boolean_image071.png,"",230} + +* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the solid (3). + +@subsubsection specification__boolean_9_4_10 Case 10: An Edge and a Solid that have a common block + +Let us consider edge *E1* and solid *S2* that have a common block: + +@figure{/specification/boolean_operations/images/boolean_image072.png,"",230} + +* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the solid (3). + +* The result of *Common* operation is a compound containing a split part of the argument *E1*, i.e. new edge *E12*. + +In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *S2*. + +@figure{/specification/boolean_operations/images/boolean_image073.png,"",230} + +* The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*. + +In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of *S2*. + +@figure{/specification/boolean_operations/images/boolean_image026.png,"",230} + +* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the solid (3). + +@subsubsection specification__boolean_9_4_11 Case 11: Two intersecting faces + +Let us consider two intersecting faces *F1* and *F2*: + +@figure{/specification/boolean_operations/images/boolean_image027.png,"",230} + +* The result of *Fuse* operation is a compound containing split parts of arguments i.e. 2 new faces *F11* and *F21*. These faces have one shared edge *En1*. + +@figure{/specification/boolean_operations/images/boolean_image028.png,"",230} + + +* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *F2* (edge) is less than the dimension of arguments (2). + +* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*. + +@figure{/specification/boolean_operations/images/boolean_image029.png,"",230} + +* The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*. + +@figure{/specification/boolean_operations/images/boolean_image030.png,"",127} + +@subsubsection specification__boolean_9_4_12 Case 12: Two faces that have a common part + +Let us consider two faces *F1* and *F2* that have a common part: + +@figure{/specification/boolean_operations/images/boolean_image031.png,"",230} + +* The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 3 new faces: *F11*, *F12* and *F22*. These faces are shared through edges In this case: + * the argument edge *F1* has resulting split faces *F11* and *F12* (image of *F1*) + * the argument face *F2* has resulting split faces *F12* and *F22* (image of *F2*) + * the face *F12* is common for the images of *F1* and *F2*. + +@figure{/specification/boolean_operations/images/boolean_image032.png,"",230} + +* The result of *Common* operation is a compound containing split parts of arguments i.e. 1 new face *F12*. +In this case: face *F12* is common for the images of *F1* and *F2*. +The common part between the faces (face) has the same dimension (2) as the dimension of the arguments (2). + + +@figure{/specification/boolean_operations/images/boolean_image033.png,"",230} + +* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*. + +@figure{/specification/boolean_operations/images/boolean_image034.png,"",230} + +* The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*. + +@figure{/specification/boolean_operations/images/boolean_image035.png,"",230} + +@subsubsection specification__boolean_9_4_13 Case 13: Two faces that have a common edge + +Let us consider two faces *F1* and *F2* that have a common edge: + +@figure{/specification/boolean_operations/images/boolean_image036.png,"",230} + +* The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 2 new faces: *F11* and *F21*. These faces have one shared edge *En1*. + +@figure{/specification/boolean_operations/images/boolean_image037.png,"",230} + +* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *F2* (edge)is less than the dimension of the arguments (2) + +* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*. The vertices are shown just to clarify the fact that the edges are spitted. + +@figure{/specification/boolean_operations/images/boolean_image038.png,"",230} + +* The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*. The vertices are shown just to clarify the fact that the edges are spitted. + +@figure{/specification/boolean_operations/images/boolean_image039.png,"",230} + +@subsubsection specification__boolean_9_4_14 Case 14: Two faces that have a common vertex + +Let us consider two faces *F1* and *F2* that have a common vertex: + +@figure{/specification/boolean_operations/images/boolean_image040.png,"",230} + +* The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 2 new faces: *F11* and *F21*. These faces have one shared vertex *Vn1*. + +@figure{/specification/boolean_operations/images/boolean_image041.png,"",230} + +* The result of *Common* operation is an empty compound because the dimension (0) of the common part between *F1* and *F2* (vertex) is less than the dimension of the arguments (2) + +* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*. + +@figure{/specification/boolean_operations/images/boolean_image042.png,"",230} + +* The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*. + +@figure{/specification/boolean_operations/images/boolean_image043.png,"",230} + + +@subsubsection specification__boolean_9_4_15 Case 15: A Face and a Solid that have an intersection curve. + +Let us consider face *F1* and solid *S2* that have an intersection curve: + +@figure{/specification/boolean_operations/images/boolean_image044.png,"",230} + +* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3). + +* The result of *Common* operation is a compound containing split part of the argument *F1*. In this case the argument face *F1* has a common part with solid *S2*, so the corresponding part of the image of *F1* is in the result. The yellow contour is not a part of the result. It only shows the place of *S2*. + +@figure{/specification/boolean_operations/images/boolean_image045.png,"",230} + +* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*. + +@figure{/specification/boolean_operations/images/boolean_image046.png,"",230} + +* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3). + +@subsubsection specification__boolean_9_4_16 Case 16: A Face and a Solid that have overlapping faces. + +Let us consider face *F1* and solid *S2* that have overlapping faces: + +@figure{/specification/boolean_operations/images/boolean_image047.png,"",230} + +* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3). + +* The result of *Common* operation is a compound containing split part of the argument *F1*. In this case the argument face *F1* has a common part with solid *S2*, so the corresponding part of the image of *F1* is included in the result. The yellow contour is not a part of the result. It only shows the place of *S2*. + +@figure{/specification/boolean_operations/images/boolean_image048.png,"",230} + +* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*. + +@figure{/specification/boolean_operations/images/boolean_image049.png,"",230} + +* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3). + + +@subsubsection specification__boolean_9_4_17 Case 17: A Face and a Solid that have overlapping edges. + +Let us consider face *F1* and solid *S2* that have overlapping edges: + +@figure{/specification/boolean_operations/images/boolean_image050.png,"",230} + +* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3). + +* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *S2* (edge) is less than the lower dimension of the arguments (2). + +* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*. + +@figure{/specification/boolean_operations/images/boolean_image051.png,"",230} + +* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3). + +@subsubsection specification__boolean_9_4_18 Case 18: A Face and a Solid that have overlapping vertices. + +Let us consider face *F1* and solid *S2* that have overlapping vertices: + +@figure{/specification/boolean_operations/images/boolean_image052.png,"",230} + +* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3). + +* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *S2* (vertex) is less than the lower dimension of the arguments (2). + +* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*. + +@figure{/specification/boolean_operations/images/boolean_image053.png,"",230} + +* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3). + +@subsubsection specification__boolean_9_4_19 Case 19: Two intersecting Solids. + +Let us consider two intersecting solids *S1* and *S2*: + +@figure{/specification/boolean_operations/images/boolean_image054.png,"",230} + +* The result of *Fuse* operation is a compound composed from the split parts of arguments *S11, S12* and *S22* (Cut12, Common, Cut21). All inner webs are removed, so the result is one new solid *R*. + +@figure{/specification/boolean_operations/images/boolean_image055.png,"",230} + +* The result of *Common* operation is a compound containing split parts of arguments i.e. one new solid *S12*. In this case solid *S12* is common for the images of *S1* and *S2*. The common part between the solids (solid) has the same dimension (3) as the dimension of the arguments (3). The yellow contour is not a part of the result. It only shows the place of *S1*. + +@figure{/specification/boolean_operations/images/boolean_image056.png,"",176} + +* The result of *Cut12* operation is a compound containing split part of the argument *S1*, i.e. 1 new solid *S11*. + +@figure{/specification/boolean_operations/images/boolean_image057.png,"",230} + +* The result of *Cut21* operation is a compound containing split part of the argument *S2*, i.e. 1 new solid *S21*. + +@figure{/specification/boolean_operations/images/boolean_image058.png,"",230} + +@subsubsection specification__boolean_9_4_20 Case 20: Two Solids that have overlapping faces. + +Let us consider two solids *S1* and *S2* that have a common part on face: + +@figure{/specification/boolean_operations/images/boolean_image059.png,"",230} + +* The result of *Fuse* operation is a compound composed from the split parts of arguments *S11, S12* and *S22* (Cut12, Common, Cut21). All inner webs are removed, so the result is one new solid *R*. + +@figure{/specification/boolean_operations/images/boolean_image060.png,"",230} + +* The result of *Common* operation is an empty compound because the dimension (2) of the common part between *S1* and *S2* (face) is less than the lower dimension of the arguments (3). + +* The result of *Cut12* operation is a compound containing split part of the argument *S1*, i.e. 1 new solid *S11*. + +@figure{/specification/boolean_operations/images/boolean_image061.png,"",230} + +* The result of *Cut21* operation is a compound containing split part of the argument *S2*, i.e. 1 new solid *S21*. +@figure{/specification/boolean_operations/images/boolean_image062.png,"",230} + + +@subsubsection specification__boolean_9_4_21 Case 21: Two Solids that have overlapping edges. + +Let us consider two solids *S1* and *S2* that have overlapping edges: + +@figure{/specification/boolean_operations/images/boolean_image063.png,"",230} + +* The result of *Fuse* operation is a compound composed from the split parts of arguments i.e. 2 new solids *S11* and *S21*. These solids have one shared edge *En1*. + +@figure{/specification/boolean_operations/images/boolean_image064.png,"",230} + +* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *S1* and *S2* (edge) is less than the lower dimension of the arguments (3). + +* The result of *Cut12* operation is a compound containing split part of the argument *S1*. In this case +argument *S1* has a common part with solid *S2* so the corresponding part is not included into the result. + +@figure{/specification/boolean_operations/images/boolean_image065.png,"",230} + +* The result of *Cut21* operation is a compound containing split part of the argument *S2*. In this case +argument *S2* has a common part with solid *S1* so the corresponding part is not included into the result. + +@figure{/specification/boolean_operations/images/boolean_image066.png,"",230} + +@subsubsection specification__boolean_9_4_22 Case 22: Two Solids that have overlapping vertices. + +Let us consider two solids *S1* and *S2* that have overlapping vertices: + +@figure{/specification/boolean_operations/images/boolean_image067.png,"",230} + +* The result of *Fuse* operation is a compound composed from the split parts of arguments i.e. 2 new solids *S11* and *S21*. These solids share *Vn1*. + +@figure{/specification/boolean_operations/images/boolean_image068.png,"",230} + +* The result of *Common* operation is an empty compound because the dimension (0) of the common part between *S1* and *S2* (vertex) is less than the lower dimension of the arguments (3). + +* The result of *Cut12* operation is a compound containing split part of the argument *S1*. + +@figure{/specification/boolean_operations/images/boolean_image069.png,"",230} + +* The result of *Cut21* operation is a compound containing split part of the argument *S2*. + +@figure{/specification/boolean_operations/images/boolean_image070.png,"",230} + +@subsubsection specification__boolean_9_4_23 Case 23: A Shell and a Wire cut by a Solid. + +Let us consider Shell *Sh* and Wire *W* as the objects and Solid *S* as the tool: + +@figure{/specification/boolean_operations/images/boolean_image136.png,"",230} + +* The result of *Fuse* operation is not defined as the dimension of the arguments is not the same. + +* The result of *Common* operation is a compound containing the parts of the initial Shell and Wire common for the Solid. The new Shell and Wire are created from the objects. + +@figure{/specification/boolean_operations/images/boolean_image137.png,"",230} + +* The result of *Cut12* operation is a compound containing new Shell and Wire split from the arguments *Sh* and *W*. In this case they have a common part with solid *S* so the corresponding part is not included into the result. + +@figure{/specification/boolean_operations/images/boolean_image138.png,"",230} + +* The result of *Cut21* operation is not defined as the objects have a lower dimension than the tool. + +@subsubsection specification__boolean_9_4_24 Case 24: Two Wires that have overlapping edges. + +Let us consider two Wires that have overlapping edges, *W1* is the object and *W2* is the tool: + +@figure{/specification/boolean_operations/images/boolean_image139.png,"",230} + +* The result of *Fuse* operation is a compound containing two Wires, which share an overlapping edge. The new Wires are created from the objects: + +@figure{/specification/boolean_operations/images/boolean_image140.png,"",230} + +* The result of *Common* operation is a compound containing one Wire consisting of an overlapping edge. The new Wire is created from the objects: + +@figure{/specification/boolean_operations/images/boolean_image141.png,"",230} + +* The result of *Cut12* operation is a compound containing a wire split from object *W1*. Its common part with *W2* is not included into the result. + +@figure{/specification/boolean_operations/images/boolean_image142.png,"",230} + +* The result of *Cut21* operation is a compound containing a wire split from *W2*. Its common part with *W1* is not included into the result. + +@figure{/specification/boolean_operations/images/boolean_image143.png,"",230} + + +@subsection specification__boolean_9_5 Class BOPAlgo_BOP + +BOA is implemented in the class *BOPAlgo_BOP*. The main fields of this class are described in the Table: + +| Name | Contents | +| :---- | :--- | +| *myOperation* | The type of the Boolean operation (Common, Fuse, Cut) | +| *myTools* | The tools | +| *myDims[2]* | The values of the dimensions of the arguments | +| *myRC* | The draft result (shape) | + +The main steps of the *BOPAlgo_BOP* are the same as of @ref specification__boolean_7_4 "BOPAlgo_Builder" except for some aspects described in the next paragraphs. + +@subsection specification__boolean_9_6 Building Draft Result + +The input data for this step is as follows: +* *BOPAlgo_BOP* object after building result of type *Compound*; +* *Type* of the Boolean operation. + +| No | Contents | Implementation | +| :---- | :----- | :----- | +| 1 | For the Boolean operation *Fuse* add to *myRC* all images of arguments. | *BOPAlgo_BOP::BuildRC()* | +| 2 | For the Boolean operation *Common* or *Cut* add to *myRC* all images of argument *S1* that are *Common* for the Common operation and are *Not Common* for the Cut operation | *BOPAlgo_BOP::BuildRC()* | + +@subsection specification__boolean_9_7 Building the Result + +The input data for this step is as follows: +* *BOPAlgo_BOP* object the state after building draft result. + +| No | Contents | Implementation | +| :---- | :---- | :------ | +| 1 | For the Type of the Boolean operation Common, Cut with any dimension and operation Fuse with *myDim[0] < 3* | | +| 1.1 | Find containers (WIRE, SHELL, COMPSOLID) in the arguments | *BOPAlgo_BOP:: BuildShape()* | +| 1.2 | Make connexity blocks from splits of each container that are in *myRC* | *BOPTools_Tools::MakeConnexityBlocks()* | +| 1.3 | Build the result from shapes made from the connexity blocks | *BOPAlgo_BOP:: BuildShape()* | +| 1.4 | Add the remaining shapes from *myRC* to the result | *BOPAlgo_BOP:: BuildShape()* | +| 2 | For the Type of the Boolean operation Fuse with *myDim[0] = 3* | | +| 2.1 | Find internal faces (FWi) in *myRC* | *BOPAlgo_BOP::BuildSolid()* | +| 2.2 | Collect all faces of *myRC* except for internal faces (FWi) -> SFS | *BOPAlgo_BOP::BuildSolid ()* | +| 2.3 | Build solids (SDi) from *SFS*. | *BOPAlgo_BuilderSolid* | +| 2.4 | Add the solids (SDi) to the result | | + +@subsection specification__boolean_bop_on_opensolids Boolean operations on open solids + +The Boolean operations on open solids are tricky enough that the standard approach of Boolean operations for building the result, based on the splits of solids does not work. +It happens because the algorithm for splitting solids (*BOPAlgo_BuilderSolid*) always tries to create the closed loops (shells) and make solids from them. But if the input solid is not closed, what can be expected from its splits? +For performing Boolean Operations on open solids another approach is used, which does not rely on the splits of the solids to be correct, but tries to select the splits of faces, which are necessary for the given type of operation. +The point here is that the type of Boolean operation clearly defines the states for the faces to be taken into result: +- For **COMMON** operation all the faces from the arguments located inside any solid of the opposite group must be taken; +- For **FUSE** operation all the faces from the arguments located outside of all solids of the opposite group must be taken; +- For **CUT** operation all the faces from the Objects located outside of all solids of the Tools and all faces from the Tools located inside any solid of the Objects must be taken; +- For **CUT21** operation all the faces from the Objects located inside any solid of the Tools and all faces from the Tools located outside of all solids of the Objects must be taken. +From the selected faces the result solids are built. Please note, that the result may contain as normal (closed) solids as the open ones. + +Even with this approach, the correct result of Boolean operation on open solids cannot be always guaranteed. +This is explained by non-manifold nature of open solids: in some cases classification of a face depends on the point of the face chosen for classification. + +@section specification__boolean_10a Section Algorithm + +@subsection specification__boolean_10a_1 Arguments + +The arguments of BOA are shapes in terms of *TopoDS_Shape*. The main requirements for the arguments are described in the Algorithms. + +@subsection specification__boolean_10a_2 Results and general rules +* The result of Section operation is a compound. Each sub-shape of the compound has shared sub-shapes in accordance with interferences between the arguments. +* The result of Section operation contains shapes that have dimension that is less then 2 i.e. vertices and edges. +* The result of Section operation contains standalone vertices if these vertices do not belong to the edges of the result. +* The result of Section operation contains vertices and edges of the arguments (or images of the arguments) that belong to at least two arguments (or two images of the arguments). +* The result of Section operation contains Section vertices and edges obtained from Face/Face interferences. +* The result of Section operation contains vertices that are the result of interferences between vertices and faces. +* The result of Section operation contains edges that are the result of interferences between edges and faces (Common Blocks), + +@subsection specification__boolean_10a_3 Examples + +@subsubsection specification__boolean_10a_3_1 Case 1: Two Vertices + +Let us consider two interfering vertices: *V1* and *V2*. + +@figure{/specification/boolean_operations/images/boolean_image080.png,"",131} + +The result of *Section* operation is the compound that contains a new vertex *V*. + +@figure{/specification/boolean_operations/images/boolean_image081.png,"",128} + +@subsubsection specification__boolean_10a_3_2 Case 1: Case 2: A Vertex and an Edge + +Let us consider vertex *V1* and the edge *E2*, that intersect in a 3D point: + +@figure{/specification/boolean_operations/images/boolean_image082.png,"",230} + +The result of *Section* operation is the compound that contains vertex *V1*. + +@figure{/specification/boolean_operations/images/boolean_image083.png,"",230} + +@subsubsection specification__boolean_10a_3_3 Case 1: Case 2: A Vertex and a Face + +Let us consider vertex *V1* and face *F2*, that intersect in a 3D point: + +@figure{/specification/boolean_operations/images/boolean_image084.png,"",230} + +The result of *Section* operation is the compound that contains vertex *V1*. + +@figure{/specification/boolean_operations/images/boolean_image085.png,"",230} + +@subsubsection specification__boolean_10a_3_4 Case 4: A Vertex and a Solid + +Let us consider vertex *V1* and solid *Z2*. The vertex *V1* is inside the solid *Z2*. + +@figure{/specification/boolean_operations/images/boolean_image086.png,"",230} + +The result of *Section* operation is an empty compound. + +@subsubsection specification__boolean_10a_3_5 Case 5: Two edges intersecting at one point + +Let us consider edges *E1* and *E2*, that intersect in a 3D point: + +@figure{/specification/boolean_operations/images/boolean_image087.png,"",230} + +The result of *Section* operation is the compound that contains a new vertex *Vnew*. + +@figure{/specification/boolean_operations/images/boolean_image088.png,"",230} + +@subsubsection specification__boolean_10a_3_6 Case 6: Two edges having a common block + +Let us consider edges *E1* and *E2*, that have a common block: + +@figure{/specification/boolean_operations/images/boolean_image089.png,"",230} + +The result of *Section* operation is the compound that contains a new edge *Enew*. + +@figure{/specification/boolean_operations/images/boolean_image090.png,"",230} + +@subsubsection specification__boolean_10a_3_7 Case 7: An Edge and a Face intersecting at a point + +Let us consider edge *E1* and face *F2*, that intersect at a 3D point: + +@figure{/specification/boolean_operations/images/boolean_image091.png,"",230} + +The result of *Section* operation is the compound that contains a new vertex *Vnew*. + +@figure{/specification/boolean_operations/images/boolean_image092.png,"",230} + +@subsubsection specification__boolean_10a_3_8 Case 8: A Face and an Edge that have a common block + +Let us consider edge *E1* and face *F2*, that have a common block: + +@figure{/specification/boolean_operations/images/boolean_image093.png,"",230} + +The result of *Section* operation is the compound that contains new edge *Enew*. + +@figure{/specification/boolean_operations/images/boolean_image094.png,"",230} + + +@subsubsection specification__boolean_10a_3_9 Case 9: An Edge and a Solid intersecting at a point + +Let us consider edge *E1* and solid *Z2*, that intersect at a point: + +@figure{/specification/boolean_operations/images/boolean_image095.png,"",230} + +The result of *Section* operation is the compound that contains a new vertex *Vnew*. + +@figure{/specification/boolean_operations/images/boolean_image096.png,"",230} + +@subsubsection specification__boolean_10a_3_10 Case 10: An Edge and a Solid that have a common block + +Let us consider edge *E1* and solid *Z2*, that have a common block at a face: + +@figure{/specification/boolean_operations/images/boolean_image097.png,"",230} + +The result of *Section* operation is the compound that contains a new edge *Enew*. + +@figure{/specification/boolean_operations/images/boolean_image098.png,"",230} + +@subsubsection specification__boolean_10a_3_11 Case 11: Two intersecting faces + +Let us consider two intersecting faces *F1* and *F2*: + +@figure{/specification/boolean_operations/images/boolean_image099.png,"",230} + +The result of *Section* operation is the compound that contains a new edge *Enew*. + +@figure{/specification/boolean_operations/images/boolean_image100.png,"",230} + +@subsubsection specification__boolean_10a_3_12 Case 12: Two faces that have a common part + +Let us consider two faces *F1* and *F2* that have a common part: + +@figure{/specification/boolean_operations/images/boolean_image133.png,"",230} + +The result of *Section* operation is the compound that contains 4 new edges. + +@figure{/specification/boolean_operations/images/boolean_image134.png,"",230} + +@subsubsection specification__boolean_10a_3_13 Case 13: Two faces that have overlapping edges + +Let us consider two faces *F1* and *F2* that have a overlapping edges: + +@figure{/specification/boolean_operations/images/boolean_image101.png,"",230} + +The result of *Section* operation is the compound that contains a new edge *Enew*. + +@figure{/specification/boolean_operations/images/boolean_image102.png,"",230} + +@subsubsection specification__boolean_10a_3_14 Case 14: Two faces that have overlapping vertices + +Let us consider two faces *F1* and *F2* that have overlapping vertices: + +@figure{/specification/boolean_operations/images/boolean_image103.png,"",230} + +The result of *Section* operation is the compound that contains a new vertex *Vnew*. + +@figure{/specification/boolean_operations/images/boolean_image104.png,"",230} + +@subsubsection specification__boolean_10a_3_15 Case 15: A Face and a Solid that have an intersection curve + +Let us consider face *F1* and solid *Z2* that have an intersection curve: + +@figure{/specification/boolean_operations/images/boolean_image105.png,"",230} + +The result of *Section* operation is the compound that contains new edges. + +@figure{/specification/boolean_operations/images/boolean_image106.png,"",230} + +@subsubsection specification__boolean_10a_3_16 Case 16: A Face and a Solid that have overlapping faces. + +Let us consider face *F1* and solid *Z2* that have overlapping faces: + +@figure{/specification/boolean_operations/images/boolean_image107.png,"",230} + +The result of *Section* operation is the compound that contains new edges + +@figure{/specification/boolean_operations/images/boolean_image108.png,"",230} + +@subsubsection specification__boolean_10a_3_17 Case 17: A Face and a Solid that have overlapping edges. + +Let us consider face *F1* and solid *Z2* that have a common part on edge: + +@figure{/specification/boolean_operations/images/boolean_image109.png,"",230} + +The result of *Section* operation is the compound that contains a new edge *Enew*. + +@figure{/specification/boolean_operations/images/boolean_image110.png,"",230} + +@subsubsection specification__boolean_10a_3_18 Case 18: A Face and a Solid that have overlapping vertices. + +Let us consider face *F1* and solid *Z2* that have overlapping vertices: + +@figure{/specification/boolean_operations/images/boolean_image111.png,"",230} + +The result of *Section* operation is the compound that contains a new vertex *Vnew*. + +@figure{/specification/boolean_operations/images/boolean_image112.png,"",230} + +@subsubsection specification__boolean_10a_3_19 Case 19: Two intersecting Solids + +Let us consider two intersecting solids *Z1* and *Z2*: +@figure{/specification/boolean_operations/images/boolean_image113.png,"",230} + +The result of *Section* operation is the compound that contains new edges. +@figure{/specification/boolean_operations/images/boolean_image114.png,"",230} + +@subsubsection specification__boolean_10a_3_20 Case 20: Two Solids that have overlapping faces + +Let us consider two solids *Z1* and *Z2* that have a common part on face: +@figure{/specification/boolean_operations/images/boolean_image115.png,"",230} + +The result of *Section* operation is the compound that contains new edges. +@figure{/specification/boolean_operations/images/boolean_image116.png,"",230} + +@subsubsection specification__boolean_10a_3_21 Case 21: Two Solids that have overlapping edges + +Let us consider two solids *Z1* and *Z2* that have overlapping edges: +@figure{/specification/boolean_operations/images/boolean_image117.png,"",230} + +The result of *Section* operation is the compound that contains a new edge *Enew*. +@figure{/specification/boolean_operations/images/boolean_image118.png,"",230} + +@subsubsection specification__boolean_10a_3_22 Case 22: Two Solids that have overlapping vertices + +Let us consider two solids *Z1* and *Z2* that have overlapping vertices: +@figure{/specification/boolean_operations/images/boolean_image119.png,"",230} + +The result of *Section* operation is the compound that contains a new vertex *Vnew*. +@figure{/specification/boolean_operations/images/boolean_image120.png,"",230} + +@subsection specification__boolean_10a_4 Class BOPAlgo_Section + +SA is implemented in the class *BOPAlgo_Section*. The class has no specific fields. +The main steps of the *BOPAlgo_Section* are the same as of *BOPAlgo_Builder* except for the following steps: + +* Build Images for Wires; +* Build Result of Type Wire; +* Build Images for Faces; +* Build Result of Type Face; +* Build Images for Shells; +* Build Result of Type Shell; +* Build Images for Solids; +* Build Result of Type Solid; +* Build Images for Type CompSolid; +* Build Result of Type CompSolid; +* Build Images for Compounds; +Some aspects of building the result are described in the next paragraph + +@subsection specification__boolean_10a_5 Building the Result + +| No | Contents | Implementation | +| :---- | :---- | :------ | +| 1 | Build the result of the operation using all information contained in *FaceInfo*, Common Block, Shared entities of the arguments, etc. | *BOPAlgo_Section:: BuildSection()* | + +@section specification__boolean_10b Volume Maker Algorithm + +The Volume Maker algorithm has been designed for building the elementary volumes (solids) from a set of connected, intersecting, or nested shapes. The algorithm can also be useful for splitting solids into parts, or constructing new solid(s) from set of intersecting or connected faces or shells. +The algorithm creates only closed solids. In general case the result solids are non-manifold: fragments of the input shapes (wires, faces) located inside the solids are added as internal sub-shapes to these solids. +But the algorithm allows preventing the addition of the internal for solids parts into result. In this case the result solids will be manifold and not contain any internal parts. However, this option does not prevent from the occurrence of the internal edges or vertices in the faces.
+Non-closed faces, free wires etc. located outside of any solid are always excluded from the result. + +The Volume Maker algorithm is implemented in the class BOPAlgo_MakerVolume. It is based on the General Fuse (GF) algorithm. All the options of the GF algorithm (see @ref specification__boolean_7_3a "GF Options") are also available in this algorithm. + +The requirements for the arguments are the same as for the arguments of GF algorithm - they could be of any type, but each argument should be valid and not self-interfered. + +The algorithm allows disabling the calculation of intersections among the arguments. In this case the algorithm will run much faster, but the user should guarantee that the arguments do not interfere with each other, otherwise the result will be invalid (e.g. contain unexpected parts) or empty. +This option is useful e.g. for building a solid from the faces of one shell or from the shapes that have already been intersected. + +@subsection specification__boolean_10b_1 Usage + +#### C++ Level +The usage of the algorithm on the API level: +~~~~ +BOPAlgo_MakerVolume aMV; +// Set the arguments +TopTools_ListOfShape aLS = …; // arguments +aMV.SetArguments(aLS); + +// Set options for the algorithm +// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) +... +// Additional option of the algorithm +Standard_Boolean bAvoidInternalShapes = Standard_False; // Set to True to exclude from the result any shapes internal to the solids +aMV.SetAvoidInternalShapes(bAvoidInternalShapes); + +// Perform the operation +aMV.Perform(); +if (aMV.HasErrors()) { //check error status + return; +} +// +const TopoDS_Shape& aResult = aMV.Shape(); // result of the operation +~~~~ + +#### Tcl Level +To use the algorithm in Draw the command mkvolume has been implemented. The usage of this command is following: +~~~~ +Usage: mkvolume r b1 b2 ... [-c] [-ni] [-ai] +Options: +-c - use this option to have input compounds considered as set of separate arguments (allows passing multiple arguments as one compound); +-ni - use this option to disable the intersection of the arguments; +-ai - use this option to avoid internal for solids shapes in the result. +~~~~ + +@subsection specification__boolean_10b_2 Examples + +#### Example 1 +Creation of 9832 solids from sphere and set of 63 planes: + + + + + + +
@figure{/specification/boolean_operations/images/mkvolume_image001.png,"Arguments",200}@figure{/specification/boolean_operations/images/mkvolume_image002.png,"Results",200}
+ +#### Example 2 +Creating compartments on a ship defined by hull shell and a set of planes. The ship is divided on compartments by five transverse bulkheads and a deck – six compartments are created: + + + + + + +
@figure{/specification/boolean_operations/images/mkvolume_image003.png,"Arguments",200}@figure{/specification/boolean_operations/images/mkvolume_image004.png,"Results",200}
+ +@section specification__boolean_10c_Cells Cells Builder algorithm + +The Cells Builder algorithm is an extension of the General Fuse algorithm. The result of General Fuse algorithm contains all split parts of the arguments. The Cells Builder algorithm provides means to specify if any given split part of the arguments (referred to as Cell) can be taken or avoided in the result. + +The possibility of selecting any Cell allows combining any possible result and gives the Cells Builder algorithm a very wide sphere of application - from building the result of any Boolean operation to building the result of any application-specific operation. + +The algorithm builds Cells only once and then just reuses them for combining the result. This gives this algorithm the performance advantage over Boolean operations, which always rebuild the splits to obtain the desirable result. + +Thus, the Cells Builder algorithm can be especially useful for simulating Boolean expressions, i.e. a sequence of Boolean operations on the same arguments. Instead of performing many Boolean operations it allows getting the final result in a single operation. The Cells Builder will also be beneficial to obtain the results of different Boolean operations on the same arguments - Cut and Common, for example. + +The Cells Builder algorithm also provides the possibility to remove any internal boundaries between splits of the same type, i.e. to fuse any same-dimensional parts added into the result and to keep any other parts as separate. This possibility is implemented through the Cells material approach: to remove the boundary between two Cells, both Cells should be assigned with the same material ID. However, if the same material ID has been assigned to the Cells of different dimension, the removal of the internal boundaries for that material will not be performed. Currently, such case is considered a limitation for the algorithm. + +The algorithm can also create containers from the connected Cells added into result - WIRES from Edges, SHELLS from Faces and COMPSOLIDS from Solids. + +@subsection specification__boolean_10c_Cells_1 Usage + +The algorithm has been implemented in the *BOPAlgo_CellsBuilder* class. + +Cells Builder is based on the General Fuse algorithm. Thus all options of the General Fuse algorithm (see @ref specification__boolean_7_3a "GF Options") are also available in this algorithm. + +The requirements for the input shapes are the same as for General Fuse - each argument should be valid in terms of *BRepCheck_Analyzer* and *BOPAlgo_ArgumentAnalyzer*. + +The result of the algorithm is a compound containing the selected parts of the basic type (VERTEX, EDGE, FACE or SOLID). The default result is an empty compound. It is possible to add any Cell by using the methods *AddToRessult()* and *AddAllToResult()*. It is also possible to remove any part from the result by using methods *RemoveFromResult()* and *RemoveAllFromResult()*. The method *RemoveAllFromResult()* is also suitable for clearing the result. + +The Cells that should be added/removed to/from the result are defined through the input shapes containing the parts that should be taken *(ShapesToTake)* and the ones containing parts that should be avoided (ShapesToAvoid). +To be taken into the result the part must be IN all shapes from *ShapesToTake* and OUT of all shapes from *ShapesToAvoid*. + +To remove Internal boundaries, it is necessary to set the same material to the Cells, between which the boundaries should be removed, and call the method *RemoveInternalBoundaries()*. +The material should not be equal to 0, as this is the default material ID. The boundaries between Cells with this material ID will not be removed. The same Cell cannot be added with different materials. +It is also possible to remove the boundaries when the result is combined. To do this, it is necessary to set the material for parts (not equal to 0) and set the flag *bUpdate* to TRUE. +If the same material ID has been set for parts of different dimension, the removal of internal boundaries for this material will not be performed. + +It is possible to create typed Containers from the parts added into result by using method *MakeContainers()*. The type of the containers will depend on the type of the input shapes: WIRES for EDGE, SHELLS for FACES and COMPSOLIDS for SOLIDS. The result will be a compound containing containers. + +#### API usage +Here is the example of the algorithm use on the API level: +~~~~ +BOPAlgo_CellsBuilder aCBuilder; +// Set the arguments +TopTools_ListOfShape aLS = …; // arguments +aCBuilder.SetArguments(aLS); + +// Set options for the algorithm +// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) +... + +aCBuilder.Perform(); // build splits of all arguments (GF) +if (aCBuilder.HasErrors()) { // check error status + return; +} +// +// collecting of the cells into result +const TopoDS_Shape& anEmptyRes = aCBuilder.Shape(); // empty result, as nothing has been added yet +const TopoDS_Shape& anAllCells = aCBuilder.GetAllParts(); //all split parts +// +TopTools_ListOfShape aLSToTake = ...; // parts of these arguments will be taken into result +TopTools_ListOfShape aLSToAvoid = ...; // parts of these arguments will not be taken into result +// +Standard_Integer iMaterial = 1; // defines the material for the cells +Standard_Boolean bUpdate = Standard_False; // defines whether to update the result right now or not +// adding to result +aCBuilder.AddToResult(aLSToTake, aLSToAvoid, iMaterial, bUpdate); +aCBuilder.RemoveInternalBoundaries(); // removing of the boundaries +TopoDS_Shape aResult = aCBuilder.Shape(); // the result +// removing from result +aCBuilder.AddAllToResult(); +aCBuilder.RemoveFromResult(aLSToTake, aLSToAvoid); +aResult = aCBuilder.Shape(); // the result +~~~~ + +#### DRAW usage + +The following set of new commands has been implemented to run the algorithm in DRAW Test Harness: +~~~~ +bcbuild : Initialization of the Cells Builder. Use: *bcbuild r* +bcadd : Add parts to result. Use: *bcadd r s1 (0,1) s2 (0,1) ... [-m material [-u]]* +bcaddall : Add all parts to result. Use: *bcaddall r [-m material [-u]]* +bcremove : Remove parts from result. Use: *bcremove r s1 (0,1) s2 (0,1) ...* +bcremoveall : Remove all parts from result. Use: *bcremoveall* +bcremoveint : Remove internal boundaries. Use: *bcremoveint r* +bcmakecontainers : Make containers from the parts added to result. Use: *bcmakecontainers r* +~~~~ + +Here is the example of the algorithm use on the DRAW level: +~~~~ +psphere s1 15 +psphere s2 15 +psphere s3 15 +ttranslate s1 0 0 10 +ttranslate s2 20 0 10 +ttranslate s3 10 0 0 +bclearobjects; bcleartools +baddobjects s1 s2 s3 +bfillds +# rx will contain all split parts +bcbuild rx +# add to result the part that is common for all three spheres +bcadd res s1 1 s2 1 s3 1 -m 1 +# add to result the part that is common only for first and third spheres +bcadd res s1 1 s2 0 s3 1 -m 1 +# remove internal boundaries +bcremoveint res +~~~~ + +@subsection specification__boolean_10c_Cells_2 Examples + +The following simple example illustrates the possibilities of the algorithm working on a cylinder and a sphere intersected by a plane: +~~~~ +pcylinder c 10 30 +psphere s 15 +ttranslate s 0 0 30 +plane p 0 0 20 1 0 0 +mkface f p -25 30 -17 17 +~~~~ + +@figure{/specification/boolean_operations/images/cells_algorithm_001.png,"Arguments",160} + +~~~~ +bclearobjects +bcleartools +baddobjects c s f +bfillds +bcbuild r +~~~~ + +#### 1. Common for all arguments + +~~~~ +bcremoveall +bcadd res c 1 s 1 f 1 +~~~~ + +@figure{/specification/boolean_operations/images/cells_algorithm_002.png,"The result of COMMON operation",126} + +#### 2. Common between cylinder and face + +~~~~ +bcremoveall +bcadd res f 1 c 1 +~~~~ + +@figure{/specification/boolean_operations/images/cells_algorithm_003.png,"The result of COMMON operation between cylinder and face",90} + +#### 3. Common between cylinder and sphere + +~~~~ +bcremoveall +bcadd res c 1 s 1 +~~~~ + +@figure{/specification/boolean_operations/images/cells_algorithm_004.png,"The result of COMMON operation between cylinder and sphere",120} + +#### 4. Fuse of cylinder and sphere + +~~~~ +bcremoveall +bcadd res c 1 -m 1 +bcadd res s 1 -m 1 +bcremoveint res +~~~~ + +@figure{/specification/boolean_operations/images/cells_algorithm_005.png,"The result of FUSE operation between cylinder and sphere",160} + +#### 5. Parts of the face inside solids - FUSE(COMMON(f, c), COMMON(f, s)) + +~~~~ +bcremoveall +bcadd res f 1 s 1 -m 1 +bcadd res f 1 c 1 -m 1 +~~~~ + +@figure{/specification/boolean_operations/images/cells_algorithm_006_1.png,"Parts of the face inside solids",160} + +~~~~ +bcremoveint res +~~~~ + +@figure{/specification/boolean_operations/images/cells_algorithm_006_2.png,"Unified parts of the face inside solids",160} + +#### 6. Part of the face outside solids + +~~~~ +bcremoveall +bcadd res f 1 c 0 s 0 +~~~~ + +@figure{/specification/boolean_operations/images/cells_algorithm_007.png,"Part of the face outside solids",160} + +#### 7. Fuse operation (impossible using standard Boolean Fuse operation) + +~~~~ +bcremoveall +bcadd res c 1 -m 1 +bcadd res s 1 -m 1 +bcadd res f 1 c 0 s 0 +bcremoveint res +~~~~ + +@figure{/specification/boolean_operations/images/cells_algorithm_008.png,"Fuse operation",160} + + +These examples may last forever. To define any new operation, it is just necessary to define, which Cells should be taken and which should be avoided. + + +@section specification__boolean_10 Algorithm Limitations + +The chapter describes the problems that are considered as Algorithm limitations. In most cases an Algorithm failure is caused by a combination of various factors, such as self-interfered arguments, inappropriate or ungrounded values of the argument tolerances, adverse mutual position of the arguments, tangency, etc. + +A lot of failures of GFA algorithm can be caused by bugs in low-level algorithms: Intersection Algorithm, Projection Algorithm, Approximation Algorithm, Classification Algorithm, etc. +* The Intersection, Projection and Approximation Algorithms are mostly used at the Intersection step. Their bugs directly cause wrong section results (i.e. incorrect section edges, section points, missing section edges or micro edges). It is not possible to obtain a correct final result of the GFA if a section result is wrong. +* The Projection Algorithm is used at the Intersection step. The purpose of Projection Algorithm is to compute 2D curves on surfaces. Wrong results here lead to incorrect or missing faces in the final GFA result. +* The Classification Algorithm is used at the Building step. The bugs in the Classification Algorithm lead to errors in selecting shape parts (edges, faces, solids) and ultimately to a wrong final GFA result. + +The description below illustrates some known GFA limitations. It does not enumerate exhaustively all problems that can arise in practice. Please address cases of Algorithm failure to the OCCT Maintenance Service. + + +@subsection specification__boolean_10_1 Arguments + +@subsubsection specification__boolean_10_1_1 Common requirements + +Each argument should be valid (in terms of *BRepCheck_Analyzer*), or conversely, if the argument is considered as non-valid (in terms of *BRepCheck_Analyzer*), it cannot be used as an argument of the algorithm. + +The class *BRepCheck_Analyzer* is used to check the overall validity of a shape. In OCCT a Shape (or its sub-shapes) is considered valid if it meets certain criteria. If the shape is found as invalid, it can be fixed by tools from *ShapeAnalysis, ShapeUpgrade* and *ShapeFix* packages. + +However, it is important to note that class *BRepCheck_Analyzer* is just a tool that can have its own problems; this means that due to a specific factor(s) this tool can sometimes provide a wrong result. + +Let us consider the following example: + +The Analyzer checks distances between couples of 3D check-points (Pi, PSi) of edge *E* on face *F*. Point *Pi* is obtained from the 3D curve (at the parameter *ti*) of the edge. *PSi* is obtained from 2D curve (at the parameter *ti*) of the edge on surface *S* of face *F*. To be valid the distance should be less than *Tol(E)* for all couples of check-points. The number of these check-points is a predefined value (e.g. 23). + +Let us consider the case when edge *E* is recognized valid (in terms of *BRepCheck_Analyzer*). + +Further, after some operation, edge *E* is split into two edges *E1* and *E2*. Each split edge has the same 3D curve and 2D curve as the original edge *E*. + +Let us check *E1* (or E2). The Analyzer again checks the distances between the couples of check-points points (Pi, PSi). The number of these check-points is the same constant value (23), but there is no guarantee that the distances will be less than *Tol(E)*, because the points chosen for *E1* are not the same as for *E*. + +Thus, if *E1* is recognized by the Analyzer as non-valid, edge *E* should also be non-valid. However *E* has been recognized as valid. Thus the Analyzer gives a wrong result for *E*. + +The fact that the argument is a valid shape (in terms of *BRepCheck_Analyzer*) is a necessary but insufficient requirement to produce a valid result of the Algorithms. + +@subsubsection specification__boolean_10_1_3 Pure self-interference + +The argument should not be self-interfered, i.e. all sub-shapes of the argument that have geometrical coincidence through any topological entities (vertices, edges, faces) should share these entities. + +#### Example 1: Compound of two edges +The compound of two edges *E1* and *E2* is a self-interfered shape and cannot be used as the argument of the Algorithms. + +@figure{/specification/boolean_operations/images/operations_image036.svg,"Compound of two edges",230} + +#### Example 2: Self-interfered Edge +The edge *E* is a self-interfered shape and cannot be used as an argument of the Algorithms. + +@figure{/specification/boolean_operations/images/operations_image037.svg,"Self-interfered Edge",140} + +#### Example 3: Self-interfered Face +The face *F* is a self-interfered shape and cannot be used as an argument of the Algorithms. + +@figure{/specification/boolean_operations/images/operations_image038.svg,"Self-interfered Face",230} + +#### Example 4: Face of Revolution +The face *F* has been obtained by revolution of edge *E* around line *L*. + +@figure{/specification/boolean_operations/images/operations_image039a.png,"Face of Revolution: Arguments",230} +@figure{/specification/boolean_operations/images/operations_image039b.png,"Face of Revolution: Result",230} + +In spite of the fact that face *F* is valid (in terms of *BRepCheck_Analyzer*) it is a self-interfered shape and cannot be used as the argument of the Algorithms. + +@subsubsection specification__boolean_10_1_4 Self-interferences due to tolerances +#### Example 1: Non-closed Edge + +Let us consider edge *E* based on a non-closed circle. @figure{/specification/boolean_operations/images/operations_image040.png,"Edge based on a non-closed circle",230} + +The distance between the vertices of *E* is *D=0.69799*. The values of the tolerances *Tol(V1)=Tol(V2)=0.5*. +@figure{/specification/boolean_operations/images/operations_image041.png,"Distance and Tolerances",230} + +In spite of the fact that the edge *E* is valid in terms of *BRepCheck_Analyzer*, it is a self-interfered shape because its vertices are interfered. Thus, edge *E* cannot be used as an argument of the Algorithms. + +#### Example 2: Solid containing an interfered vertex + +Let us consider solid *S* containing vertex V. @figure{/specification/boolean_operations/images/operations_image042.png,"Solid containing an interfered vertex",230} + +The value of tolerance Tol(V)= 50.000075982061. + +@figure{/specification/boolean_operations/images/operations_image043.png,"Tolerance",230} + +In spite of the fact that solid *S* is valid in terms of *BRepCheck_Analyzer* it is a self-interfered shape because vertex *V* is interfered with a lot of sub-shapes from *S* without any topological connection with them. Thus solid *S* cannot be used as an argument of the Algorithms. + +@subsubsection specification__boolean_10_1_5 Parametric representation +The parameterization of some surfaces (cylinder, cone, surface of revolution) can be the cause of limitation. + +#### Example 1: Cylindrical surface +The parameterization range for cylindrical surface is: + +@figure{/specification/boolean_operations/images/boolean_image135.png,"",230} + +The range of *U* coordinate is always restricted while the range of *V* coordinate is non-restricted. + +Let us consider a cylinder-based *Face 1* with radii *R=3* and *H=6*. + +@figure{/specification/boolean_operations/images/operations_image044.png,"Face 1",230} + +@figure{/specification/boolean_operations/images/operations_image045.png,"P-Curves for Face 1",230} + +Let us also consider a cylinder-based *Face 2* with radii *R=3000* and *H=6000* (resulting from scaling Face 1 with scale factor *ScF=1000*). + +@figure{/specification/boolean_operations/images/operations_image046.png,"Face 2",230} + +@figure{/specification/boolean_operations/images/operations_image047.png,"P-Curves for Face 2",230} + +Pay attention to the Zoom value of the Figures. + +It is obvious that starting with some value of *ScF*, e.g. *ScF>1000000*, all sloped p-Curves on *Face 2* will be almost vertical. At least, there will be no difference between the values of angles computed by standard C Run-Time Library functions, such as *double acos(double x)*. The loss of accuracy in computation of angles can cause failure of some BP sub-algorithms, such as building faces from a set of edges or building solids from a set of faces. + + +@subsubsection specification__boolean_10_1_6 Using tolerances of vertices to fix gaps + +It is possible to create shapes that use sub-shapes of lower order to avoid gaps in the tolerance-based data model. + +Let us consider the following example: + +@figure{/specification/boolean_operations/images/operations_image048.png,"Example",230} + +* Face *F* has two edges *E1* and *E2* and two vertices, the base plane is {0,0,0, 0,0,1}; +* Edge *E1* is based on line {0,0,0, 1,0,0}, Tol(E1) = 1.e-7; +* Edge *E2* is based on line {0,1,0, 1,0,0}, Tol(E2) = 1.e-7; +* Vertex *V1*, point {0,0.5,0}, Tol(V1) = 1; +* Vertex *V2*, point {10,0.5,0}, Tol(V2) = 1; +* Face *F* is valid (in terms of *BRepCheck_Analyzer*). + +The values of tolerances *Tol(V1)* and *Tol(V2)* are big enough to fix the gaps between the ends of the edges, but the vertices *V1* and *V2* do not contain any information about the trajectories connecting the corresponding ends of the edges. Thus, the trajectories are undefined. This will cause failure of some sub-algorithms of BP. For example, the sub-algorithms for building faces from a set of edges use the information about all edges connected in a vertex. The situation when a vertex has several pairs of edges such as above will not be solved in a right way. + + +@subsection specification__boolean_11_1 Intersection problems +@subsubsection specification__boolean_11_1_1 Pure intersections and common zones + +#### Example: Intersecting Edges + +Let us consider the intersection between two edges: +* *E1* is based on a line: {0,-10,0, 1,0,0}, Tol(E1)=2. +* *E2* is based on a circle: {0,0,0, 0,0,1}, R=10, Tol(E2)=2. + +@figure{/specification/boolean_operations/images/operations_image049.png,"Intersecting Edges",320} + +The result of pure intersection between *E1* and *E2* is vertex *Vx {0,-10,0}*. + +The result of intersection taking into account tolerances is the common zone *CZ* (part of 3D-space where the distance between the curves is less than or equals to the sum of edge tolerances. + +The Intersection Part of Algorithms uses the result of pure intersection *Vx* instead of *CZ* for the following reasons: +* The Algorithms do not produce Common Blocks between edges based on underlying curves of explicitly different type (e.g. Line / Circle). If the curves have different types, the rule of thumb is that the produced result is of type **vertex**. This rule does not work for non-analytic curves (Bezier, B-Spline) and their combinations with analytic curves. +* The algorithm of intersection between two surfaces *IntPatch_Intersection* does not compute *CZ* of the intersection between curves and points. So even if *CZ* were computed by Edge/Edge intersection algorithm, its result could not be treated by Face/Face intersection algorithm. + +@subsubsection specification__boolean_11_2_2 Tolerances and inaccuracies + +The following limitations result from modeling errors or inaccuracies. + +#### Example: Intersection of planar faces + +Let us consider two planar rectangular faces *F1* and *F2*. + +The intersection curve between the planes is curve *C12*. The curve produces a new intersection edge *EC12*. The edge goes through vertices *V1* and *V2* thanks to big tolerance values of vertices *Tol(V1)* and *Tol(V2)*. So, two straight edges *E12* and *EC12* go through two vertices, which is impossible in this case. + +@figure{/specification/boolean_operations/images/operations_image050.svg,"Intersecting Faces",320} + + +The problem cannot be solved in general, because the length of *E12* can be infinite and the values of *Tol(V1)* and *Tol(V2)* theoretically can be infinite too. + +In a particular case the problem can be solved in several ways: +* Reduce, if possible, the values of *Tol(V1)* and *Tol(V2)* (refinement of *F1*). +* Analyze the value of *Tol(EC12)* and increase *Tol(EC12)* to get a common part between the edges *EC12* and *E12*. Then the common part will be rejected as there is an already existing edge *E12* for face *F1*. + +It is easy to see that if *C12* is slightly above the tolerance spheres of *V1* and *V2* the problem does not appear. + +#### Example: Intersection of two edges + +Let us consider two edges *E1* and *E2*, which have common vertices *V1* and *V2*. The edges *E1* and *E2* have 3D-curves *C1* and *C2. Tol(E1)=1.e-7, Tol(E2)=1.e-7.* + +*C1* practically coincides in 3D with *C2*. The value of deflection is *Dmax* (e.g. *Dmax=1.e-6*). + +@figure{/specification/boolean_operations/images/operations_image051.svg,"Intersecting Edges",420} + +The evident and prospective result should be the Common Block between *E1* and *E2*. However, the result of intersection differs. + +@figure{/specification/boolean_operations/images/operations_image052.svg,"Result of Intersection",420} + +The result contains three new vertices *Vx1, Vx2* and *Vx3*, 8 new edges (V1, Vx1, Vx2, Vx3, V2) and no Common Blocks. This is correct due to the source data: *Tol(E1)=1.e-7, Tol(E2)=1.e-7* and Dmax=1.e-6. + +In this particular case the problem can be solved by several ways: +* Increase, if possible, the values *Tol(E1)* and *Tol(E2)* to get coincidence in 3D between *E1* and *E2* in terms of tolerance. +* Replace *E1* by a more accurate model. + +The example can be extended from 1D (edges) to 2D (faces). + +@figure{/specification/boolean_operations/images/operations_image053.svg,"Intersecting Faces",420} + +The comments and recommendations are the same as for 1D case above. + + +@subsubsection specification__boolean_11_2_3 Acquired Self-interferences +#### Example 1: Vertex and edge + +Let us consider vertex *V1* and edge *E2*. + +@figure{/specification/boolean_operations/images/operations_image054.svg,"Vertex and Edge",171} + +Vertex *V1* interferes with vertices *V12* and *V22*. +So vertex *V21* should interfere with vertex *V22*, which is impossible because vertices *V21* and *V22* are the vertices of edge *E2*, thus *V21* is not equal to *V22*. + +The problem cannot be solved in general, because the length can be as small as possible to provide validity of *E2* (in the extreme case: *Length (E2) = Tol(V21) + Tol(V22) + e,* where *e-> 0*). + +In a particular case the problem can be solved by refinement of arguments, i.e. by decreasing the values of *Tol(V21)*, *Tol(V22)* and *Tol(V1)*. + +#### Example 2: Vertex and wire + +Let us consider vertex *V2* and wire consisting of edges *E11* and *E12*. + +@figure{/specification/boolean_operations/images/operations_image055.svg,"Vertex and Wire",200} + +The arguments themselves are not self-intersected. +Vertex *V2* interferes with edges *E11* and *E12*. Thus, edge *E11* should interfere with edge *E22*, but it is impossible because edges *E11* and *E12* cannot interfere by the condition. + +The cases when a non-self-interfered argument (or its sub-shapes) become interfered due to the intersections with other arguments (or their sub-shapes) are considered as limitations for the Algorithms. + +@section specification__boolean_11a Advanced Options + +The previous chapters describe so called Basic Operations. Most of tasks can be solved using Basic Operations. Nonetheless, there are cases that can not be solved straightforwardly by Basic Operations. The tasks are considered as limitations of Basic Operations. + +The chapter is devoted to Advanced Options. In some cases the usage of Advanced Options allows overcoming the limitations, improving the quality of the result of operations, robustness and performance of the operators themselves. + +@subsection specification__boolean_11a_1 Fuzzy Boolean Operation + +Fuzzy Boolean operation is the option of Basic Operations such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building operations, in which additional user-specified tolerance is used. This option allows operators to handle robustly cases of touching and near-coincident, misaligned entities of the arguments. + +The Fuzzy option is useful on the shapes with gaps or embeddings between the entities of these shapes, which are not covered by the tolerance values of these entities. Such shapes can be the result of modeling mistakes, or translating process, or import from other systems with loss of precision, or errors in some algorithms. + +Most likely, the Basic Operations will give unsatisfactory results on such models. The result may contain unexpected and unwanted small entities, faulty entities (in terms of *BRepCheck_Analyzer*), or there can be no result at all. + +With the Fuzzy option it is possible to get the expected result -- it is just necessary to define the appropriate value of fuzzy tolerance for the operation. To define that value it is necessary to measure the value of the gap (or the value of embedding depth) between the entities of the models, slightly increase it (to make the shifted entities coincident in terms of their tolerance plus the additional one) and pass it to the algorithm. + +Fuzzy option is included in interface of Intersection Part (class *BOPAlgo_PaveFiller*) and application programming interface (class *BRepAlgoAPI_BooleanOperation*) + +@subsubsection specification__boolean_11a_1_1 Examples +The following examples demonstrate the advantages of usage Fuzzy option operations over the Basic Operations in typical situations. + +#### Case 1 + +In this example the cylinder (shown in yellow and transparent) is subtracted from the box (shown in red). The cylinder is shifted by 5e-5 relatively to the box along its axis (the distance between rear faces of the box and cylinder is 5e-5). + +@figure{/specification/boolean_operations/images/boolean_image121.png,"",240} + +The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 5e-5: + +@figure{/specification/boolean_operations/images/boolean_image122.png,"Result of CUT operation obtained with Basic Operations",240} + +@figure{/specification/boolean_operations/images/boolean_image123.png,"Result of CUT operation obtained with Fuzzy Option",240} + +In this example Fuzzy option allows eliminating a very thin part of the result shape produced by Basic algorithm due to misalignment of rear faces of the box and the cylinder. + +#### Case 2 + +In this example two boxes are fused. One of them has dimensions 10*10*10, and the other is 10*10.000001*10.000001 and adjacent to the first one. There is no gap in this case as the surfaces of the neighboring faces coincide, but one box is slightly greater than the other. + +@figure{/specification/boolean_operations/images/boolean_image124.png,"",240} + +The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 1e-6: + +@figure{/specification/boolean_operations/images/boolean_image125.png,"Result of CUT operation obtained with Basic Operations",240} + +@figure{/specification/boolean_operations/images/boolean_image126.png,"Result of CUT operation obtained with Fuzzy Option",240} + +In this example Fuzzy option allows eliminating an extremely narrow face in the result produced by Basic operation. + +#### Case 3 + +In this example the small planar face (shown in orange) is subtracted from the big one (shown in yellow). There is a gap 1e-5 between the edges of these faces. + +@figure{/specification/boolean_operations/images/boolean_image127.png,"",240} + +The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 1e-5: + +@figure{/specification/boolean_operations/images/boolean_image128.png,"Result of CUT operation obtained with Basic Operations",240} + +@figure{/specification/boolean_operations/images/boolean_image129.png,"Result of CUT operation obtained with Fuzzy Option",240} + +In this example Fuzzy options eliminated a pin-like protrusion resulting from the gap between edges of the argument faces. + +#### Case 4 + +In this example the small edge is subtracted from the big one. The edges are overlapping not precisely, with max deviation between them equal to 5.28004e-5. We will use 6e-5 value for Fuzzy option. + +@figure{/specification/boolean_operations/images/boolean_image130.png,"",240} + +The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 6e-5: + +@figure{/specification/boolean_operations/images/boolean_image131.png,"Result of CUT operation obtained with Basic Operations",240} + +@figure{/specification/boolean_operations/images/boolean_image132.png,"Result of CUT operation obtained with Fuzzy Option",240} + +This example stresses not only the validity, but also the performance issue. The usage of Fuzzy option with the appropriate value allows processing the case much faster than with the pure Basic operation. The performance gain for the case is 45 (Processor: Intel(R) Core(TM) i5-3450 CPU @ 3.10 GHz). + +@subsection specification__boolean_11a_2 Gluing Operation + +The Gluing operation is the option of the Basic Operations such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building operations. +It has been designed to speed up the computation of the interferences among arguments of the operations on special cases, in which the arguments may be overlapping but do not have real intersections between their sub-shapes. + +This option cannot be used on the shapes having real intersections, like intersection vertex between edges, or intersection vertex between edge and a face or intersection line between faces: + +@figure{/specification/boolean_operations/images/glue_options_image002.png,"Intersecting faces",240} + +There are two possibilities of overlapping shapes: +* The shapes can be partially coinciding - the faces do not have intersection curves, but overlapping. The faces of such arguments will be split during the operation. The following picture illustrates such shapes: + +@figure{/specification/boolean_operations/images/glue_options_image001.png,"Partially coinciding faces",240} + +* The shapes can be fully coinciding - there should be no partial overlapping of the faces, thus no intersection of type EDGE/FACE at all. In such cases the faces will not be split during the operation. + +@figure{/specification/boolean_operations/images/glue_options_image003.png,"Full coinciding faces of the boxes",240} + +Thus, there are two possible options - for full and partial coincidence of the shapes. + +Even though there are no real intersections on such cases without Gluing options the algorithm will still intersect the sub-shapes of the arguments with interfering bounding boxes. + +The performance improvement in gluing mode is achieved by excluding the most time consuming computations and in some case can go up to 90%: +* Exclude computation of FACE/FACE intersections for partial coincidence; +* Exclude computation of VERTEX/FACE, EDGE/FACE and FACE/FACE intersections for full coincidence. + +By setting the Gluing option for the operation user should guarantee that the arguments are really coinciding. The algorithm does not check this itself. Setting inappropriate option for the operation is likely to lead to incorrect result. + +@subsubsection specification__boolean_11a_2_1 Usage + +The Gluing option is an enumeration implemented in BOPAlgo_GlueEnum.hxx: +* BOPAlgo_GlueOff - default value for the algorithms, Gluing is switched off; +* BOPAlgo_GlueShift - Glue option for shapes with partial coincidence; +* BOPAlgo_GlueFull - Glue option for shapes with full coincidence. + +#### API level +For setting the Gluing options for the algorithm it is just necessary to call the SetGlue(const BOPAlgo_Glue) method with appropriate value: +~~~~ +BOPAlgo_Builder aGF; +// +.... +// setting the gluing option to speed up intersection of the arguments +aGF.SetGlue(BOPAlgo_GlueShift) +// +.... +~~~~ + +#### TCL level +For setting the Gluing options in DRAW it is necessary to call the bglue command with appropriate value: +* 0 - default value, Gluing is off; +* 1 - for partial coincidence; +* 2 - for full coincidence + +~~~~ +bglue 1 +~~~~ + +@subsubsection specification__boolean_11a_2_2 Examples +#### Case1 - Fusing the 64 bspline boxes into one solid + +@figure{/specification/boolean_operations/images/glue_options_image004.png,"BSpline Boxes with partial coincidence",240} + +Performance improvement from using the GlueShift option in this case is about 70 percent. + +#### Case2 - Sewing faces of the shape after reading from IGES + +@figure{/specification/boolean_operations/images/glue_options_image005.png,"Faces with coinciding but not shared edges",240} + +Performance improvement in this case is also about 70 percent. + +@subsection specification__boolean_11a_3 Safe processing mode + +The safe processing mode is the advanced option in Boolean Operation component. This mode can be applied to all Basic operations such as General Fuse, Splitting, Boolean, Section, Maker Volume, Cells building. +This option allows keeping the input arguments untouched. In other words, switching this option on prevents the input arguments from any modification such as tolerance increase, addition of the P-Curves on edges, etc. + +The option can be very useful for implementation of the Undo/Redo mechanism in the applications and allows performing the operation many times without changing the inputs. + +By default the safe processing option is switched off for the algorithms. Enabling this option might slightly decrease the performance of the operation, because instead of the modification of some entity it will be necessary to create the copy of this entity and modify it. However, this degradation should be very small because the copying is performed only in case of necessity. + +The option is also available in the Intersection algorithm - *BOPAlgo_PaveFiller*. To perform several different operations on the same arguments, the safe processing mode can be enabled in PaveFiller, prepared only once and then used in operations. It is enough to set this option to PaveFiller only and all algorithms taking this PaveFiller will also work in the safe mode. + +@subsubsection specification__boolean_11a_3_1 Usage + +#### API level + +To enable/disable the safe processing mode for the algorithm, it is necessary to call *SetNonDestructive()* method with the appropriate value: +~~~~ +BOPAlgo_Builder aGF; +// +.... +// enabling the safe processing mode to prevent modification of the input shapes +aGF.SetNonDestructive(Standard_True); +// +.... +~~~~ + +#### TCL level +To enable the safe processing mode for the operation in DRAW, it is necessary to call the bnondestructive command with the appropriate value: +* 0 - default value, the safe mode is switched off; +* 1 - the safe mode will be switched on. + +~~~~ +bnondestructive 1 +~~~~ + +@subsection specification__boolean_11a_4 How to disable check of input solids for inverted status + +By default, all input solids are checked for inverted status, i.e. the solids are classified to understand if they are holes in the space (negative volumes) or normal solids (positive volumes). The possibility to disable the check of the input solids for inverted status is the advanced option in Boolean Operation component. This option can be applied to all Basic operations, such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building. +This option allows avoiding time-consuming classification of the input solids and processing them in the same way as positive volumes, saving up to 10 percent of time on the cases with a big number of input solids. + +The classification should be disabled only if the user is sure that there are no negative volumes among the input solids, otherwise the result may be invalid. + +@subsubsection specification__boolean_11a_4_1 Usage + +#### API level + +To enable/disable the classification of the input solids it is necessary to call *SetCheckInverted()* method with the appropriate value: +~~~~ +BOPAlgo_Builder aGF; +// +.... +// disabling the classification of the input solid +aGF.SetCheckInverted(Standard_False); +// +.... +~~~~ + +#### TCL level +To enable/disable the classification of the solids in DRAW, it is necessary to call *bcheckinverted* command with the appropriate value: +* 0 - disabling the classification; +* 1 - default value, enabling the classification. + +~~~~ +bcheckinverted 0 +~~~~ + +@subsection specification__boolean_11a_5_obb Usage of Oriented Bounding Boxes + +Since Oriented Bounding Boxes are usually much tighter than Axes Aligned Bounding Boxes (for more information on OBB see the @ref occt_modat_6 "Bounding boxes" chapter of Modeling data User guide) its usage can significantly speed-up the intersection stage of the operation by reducing the number of interfering objects. + +@subsubsection specification__boolean_11a_5_obb_1 Usage + +#### API level +To enable/disable the usage of OBB in the operation it is necessary to call the *SetUseOBB()* method with the approriate value: +~~~~ +BOPAlgo_Builder aGF; +// +.... +// Enabling the usage of OBB in the operation +aGF.SetUseOBB(Standard_True); +// +.... +~~~~ + +#### TCL level +To enable/disable the usage of OBB in the operation in DRAW it is necessary to call the *buseobb* command with the approriate value: +* 0 - disabling the usage of OBB; +* 1 - enabling the usage of OBB. +~~~~ +buseobb 1 +~~~~ + +@section specification__boolean_ers Errors and warnings reporting system + +The chapter describes the Error/Warning reporting system of the algorithms in the Boolean Component. + +The errors and warnings are collected in the instance of the class *Message_Report* maintained as a field by common base class of Boolean operation algorithms *BOPAlgo_Options*. + +The error is reported in for problems which cannot be treated and cause the algorithm to fail. +In this case the result of the operation will be incorrect or incomplete or there will be no result at all. + +The warnings are reported for the problems which can be potentially handled or ignored and thus do not cause the algorithms to stop their work (but probably affect the result). + +All possible errors and warnings that can be set by the algorithm are listed in its header file. +The complete list of errors and warnings that can be generated by Boolean operations is defined in *BOPAlgo_Alerts.hxx*. + +Use method *HasErrors()* to check for presence of error; method *HasError()* can be used to check for particular error. +Methods *DumpErrors()* outputs textual description of collected errors into the stream. +Similar methods *HasWarnings()*, *HasWarning()*, and *DumpWarnings()* are provided for warnings. + +Note that messages corresponding to errors and warnings are defined in resource file *BOPAlgo.msg*. +These messages can be localized; for that put translated version to separate file and load it in the application by call to *Message_MsgFile::Load()* . + +Here is the example of how to use this system: +~~~~~ +BOPAlgo_PaveFiller aPF; +aPF.SetArguments(...); +aPF.Perform(); +if (aPF.HasErrors()) { + aPF.DumpErrors(std::cerr); + // + if (aPF.HasError(STANDARD_TYPE(BOPAlgo_AlertNullInputShapes)) { + // some actions + } + if (aPF.HasWarning(STANDARD_TYPE(BOPAlgo_AlertTooSmallEdge)) { + // some actions + } + ... +} +~~~~~ + +DRAW commands executing Boolean operations output errors and warnings generated by these operations in textual form. +Additional option allows saving shapes for which warnings have been generated, as DRAW variables. +To activate this option, run command *bdrawwarnshapes* with argument 1 (or with 0 to deactivate): +~~~~ +bdrawwarnshapes 1 +~~~~ + +After setting this option and running an algorithm the result will look as follows: +~~~~ +Warning: The interfering vertices of the same argument: ws_1_1 ws_1_2 +Warning: The positioning of the shapes leads to creation of small edges without valid range: ws_2_1 +~~~~ + + +@section specification__boolean_history History Information + +All operations in Boolean Component support @ref occt_modalg_hist "History information". This chapter describes how the History is filled for these operations. + +Additionally to Vertices, Edges and Faces the history is also available for the Solids. + +The rules for filling the History information about Deleted and Modified shapes are the same as for the API algorithms. + +Only the rules for Generated shapes require clarification. +In terms of the algorithms in Boolean Component the shape from the arguments can have Generated shapes only if these new shapes +have been obtained as a result of pure intersection (not overlapping) of this shape with any other shapes from arguments. Thus, the Generated shapes are always: +* VERTICES created from the intersection points and may be Generated from edges and faces only; +* EDGES created from the intersection edges and may be Generated from faces only. + +So, only EDGES and FACES could have information about Generated shapes. For all other types of shapes the list of Generated shapes will be empty. + +@subsection specification__boolean_history_ex Examples + +Here are some examples illustrating the History information. + +@subsubsection specification__boolean_history_ex_del Deleted shapes + +The result of CUT operation of two overlapping planar faces (see the example below) does not contain any parts from the tool face. Thus, the tool face is considered as Deleted. +If the faces are not fully coinciding, the result must contain some parts of the object face. In this case object face will be considered as not deleted. +But if the faces are fully coinciding, the result must be empty, and both faces will be considered as Deleted. + +Example of the overlapping faces: + +~~~~ +plane p 0 0 0 0 0 1 +mkface f1 p -10 10 -10 10 +mkface f2 p 0 20 -10 10 + +bclearobjects +bcleartools +baddobjects f1 +baddtools f2 +bfillds +bbop r 2 + +savehistory cut_hist +isdeleted cut_hist f1 +# Not deleted + +isdeleted cut_hist f2 +# Deleted +~~~~ + +@subsubsection specification__boolean_history_ex_modif Modified shapes + +In the FUSE operation of two edges intersecting in one point (see the example below), both edges will be split by the intersection point. All these splits will be contained in the result. +Thus, each of the input edges will be Modified into its two splits. +But in the CUT operation on the same edges, the tool edge will be Deleted from the result and, thus, will not have any Modified shapes. + +Example of the intersecting edges: +~~~~ +line l1 0 0 0 1 0 0 +mkedge e1 l1 -10 10 + +line l2 0 0 0 0 1 0 +mkedge e2 l2 -10 10 + +bclearobjects +bcleartools +baddobjects e1 +baddtools e2 +bfillds + +# fuse operation +bbop r 1 + +savehistory fuse_hist + +modified m1 fuse_hist e1 +nbshapes m1 +# EDGES: 2 + +modified m2 fuse_hist e2 +nbshapes m2 +# EDGES: 2 + +# cut operation +bbop r 2 + +savehistory cut_hist + +modified m1 cut_hist e1 +nbshapes m1 +# EDGES: 2 + +modified m2 cut_hist e2 +# The shape has not been modified +~~~~ + + +@subsubsection specification__boolean_history_gen Generated shapes + +Two intersecting edges will both have the intersection vertices Generated from them. + +As for the operation with intersecting faces, consider the following example: + +~~~~ +plane p1 0 0 0 0 0 1 +mkface f1 p1 -10 10 -10 10 + +plane p2 0 0 0 1 0 0 +mkface f2 p2 -10 10 -10 10 + +bclearobjects +bcleartools +baddobjects f1 +baddtools f2 +bfillds + +# fuse operation +bbop r 1 + +savehistory fuse_hist + +generated gf1 fuse_hist f1 +nbshapes gf1 +# EDGES: 1 + +generated gf2 fuse_hist f2 +nbshapes gf2 +# EDGES: 1 + + +# common operation - result is empty +bbop r 0 + +savehistory com_hist + +generated gf1 com_hist f1 +# No shapes were generated from the shape + +generated gf2 com_hist f2 +# No shapes were generated from the shape + +~~~~ + +@section specification__boolean_simplification BOP result simplification + +The API algorithms implementing Boolean Operations provide possibility to simplify the result shape by unification of the connected tangential edges and faces. +This simplification is performed by the method *SimplifyResult* which is implemented in the class *BRepAlgoAPI_BuilderAlgo* (General Fuse operation). +It makes it available for users of the classes *BRepAlgoAPI_BooleanOperation* (all Boolean Operations) and *BRepAlgoAPI_Splitter* (split operation). + +The simplification is performed by the means of *ShapeUpgrade_UnifySameDom* algorithm. The result of operation is overwritten with the simplified result. + +The simplification is performed without creation of the Internal shapes, i.e. shapes connections will never be broken. It is performed on the whole result shape. +Thus, if the input shapes contained connected tangent edges or faces unmodified during the operation they will also be unified. + +History of the simplification is merged into the main history of operation, thus it will be accounted when asking for Modified, Generated and Deleted shapes. + +Some options of the main operation are passed into the Unifier: +- Fuzzy tolerance of the operation is given to the Unifier as the linear tolerance. +- Non destructive mode here controls the safe input mode in Unifier. + +For controlling this possibility in DRAW the command **bsimplify** has been implemented. See the @ref occt_draw_bop_options "Boolean Operations options" chapter in draw user guide. + + +@subsection specification__boolean_simplification_examples Examples + +Here is the simple example of simplification of the result of Fuse operation of two boxes: + +~~~~ +bsimplify -f 1 + +box b1 10 10 15 +box b2 3 7 0 10 10 15 +bclearobjects +bcleartools +baddobjects b1 +baddtools b2 +bfillds +bapibop r 1 +~~~~ + + + + + + +
@figure{/specification/boolean_operations/images/bop_simple_001.png, "Not simplified result", 420}@figure{/specification/boolean_operations/images/bop_simple_002.png, "Simplified result", 420}
+ + +@section specification__boolean_11b Usage + +The chapter contains some examples of the OCCT Boolean Component usage. The usage is possible on two levels: C++ and Tcl. + +@subsection specification__boolean_11b_1 Package BRepAlgoAPI + +The package *BRepAlgoAPI* provides the Application Programming Interface of the Boolean Component. + +The package consists of the following classes: +* *BRepAlgoAPI_Algo* -- the root class that provides the interface for algorithms. +* *BRepAlgoAPI_BuilderAlgo* -- the class API level of General Fuse algorithm. +* *BRepAlgoAPI_Splitter* -- the class API level of the Splitter algorithm. +* *BRepAlgoAPI_BooleanOperation* -- the root class for the classes *BRepAlgoAPI_Fuse*. *BRepAlgoAPI_Common*, *BRepAlgoAPI_Cut* and *BRepAlgoAPI_Section*. +* *BRepAlgoAPI_Fuse* -- the class provides Boolean fusion operation. +* *BRepAlgoAPI_Common* -- the class provides Boolean common operation. +* *BRepAlgoAPI_Cut* -- the class provides Boolean cut operation. +* *BRepAlgoAPI_Section* -- the class provides Boolean section operation. + +@figure{/specification/boolean_operations/images/operations_image065.png,"Diagram of BRepAlgoAPI package",420} + +The detailed description of the classes can be found in the corresponding .hxx files. The examples are below in this chapter. + +@subsection specification__boolean_11b_2 Package BOPTest +The package *BOPTest* provides the usage of the Boolean Component on Tcl level. The method *BOPTest::APICommands* contains corresponding Tcl commands: + +* *bapibuild* -- for General Fuse Operator; +* *bapisplit* -- for Splitter Operator; +* *bapibop* -- for Boolean Operator and Section Operator. + +The examples of how to use the commands are below in this chapter. + +@subsubsection specification__boolean_11b_2_1 Case 1. General Fuse operation + +The following example illustrates how to use General Fuse operator: + +#### C++ Level + +~~~~ +#include +#include +#include + {… + BRepAlgoAPI_BuilderAlgo aBuilder; + // + // prepare the arguments + TopTools_ListOfShape& aLS=…; + // + // set the arguments + aBuilder.SetArguments(aLS); + + // Set options for the algorithm + // setting options on this level is similar to setting options to GF algorithm on low level (see "GF Usage" chapter) + ... + + // run the algorithm + aBuilder.Build(); + if (aBuilder.HasErrors()) { + // an error treatment + return; + } + // + // result of the operation aR + const TopoDS_Shape& aR=aBuilder.Shape(); +… +} +~~~~ + +#### Tcl Level + +~~~~ +# prepare the arguments +box b1 10 10 10 +box b2 3 4 5 10 10 10 +box b3 5 6 7 10 10 10 +# +# clear inner contents +bclearobjects; bcleartools; +# +# set the arguments +baddobjects b1 b2 b3 + +# set options for the algorithm (see "GF Usage" chapter) +... + +# run the algorithm +# r is the result of the operation +bapibuild r +~~~~ + +@subsubsection specification__boolean_11b_2_2 Case 2. Splitting operation + +The following example illustrates how to use the Splitter operator: + +#### C++ Level + +~~~~ +#include +#include +#include +// +BRepAlgoAPI_BuilderAlgo aSplitter; +// +// prepare the arguments +// objects +TopTools_ListOfShape& aLSObjects = … ; +// tools +TopTools_ListOfShape& aLSTools = … ; +// +// set the arguments +aSplitter.SetArguments(aLSObjects); +aSplitter.SetTools(aLSTools); +// +// Set options for the algorithm +// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) +... +// +// run the algorithm +aSplitter.Build(); +// check error status +if (aSplitter.HasErrors()) { + return; +} +// +// result of the operation aResult +const TopoDS_Shape& aResult = aSplitter.Shape(); +~~~~ + +#### Tcl Level + +~~~~ +# prepare the arguments +# objects +box b1 10 10 10 +box b2 7 0 0 10 10 10 + +# tools +plane p 10 5 5 0 1 0 +mkface f p -20 20 -20 20 +# +# clear inner contents +bclearobjects; bcleartools; +# +# set the objects +baddobjects b1 b2 +# set the tools +baddtools f +# +# set options for the algorithm (see "GF Usage" chapter) +... +# +# run the algorithm +# r is the result of the operation +bapisplit r +~~~~ + +@subsubsection specification__boolean_11b_2_3 Case 3. Common operation + +The following example illustrates how to use Common operation: + +#### C++ Level + +~~~~ +#include +#include +#include < BRepAlgoAPI_Common.hxx> + {… + Standard_Boolean bRunParallel; + Standard_Real aFuzzyValue; + BRepAlgoAPI_Common aBuilder; + + // perpare the arguments + TopTools_ListOfShape& aLS=…; + TopTools_ListOfShape& aLT=…; + // + bRunParallel=Standard_True; + aFuzzyValue=2.1e-5; + // + // set the arguments + aBuilder.SetArguments(aLS); + aBuilder.SetTools(aLT); + // + // Set options for the algorithm + // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) + ... + // + // run the algorithm + aBuilder.Build(); + if (aBuilder.HasErrors()) { + // an error treatment + return; + } + // + // result of the operation aR + const TopoDS_Shape& aR=aBuilder.Shape(); +… +} +~~~~ + +#### Tcl Level + +~~~~ +# prepare the arguments +box b1 10 10 10 +box b2 7 0 4 10 10 10 +box b3 14 0 0 10 10 10 +# +# clear inner contents +bclearobjects; bcleartools; +# +# set the arguments +baddobjects b1 b3 +baddtools b2 +# +# set options for the algorithm (see "GF Usage" chapter) +... +# +# run the algorithm +# r is the result of the operation +# 0 means Common operation +bapibop r 0 +~~~~ + +@subsubsection specification__boolean_11b_2_4 Case 4. Fuse operation + +The following example illustrates how to use Fuse operation: + +#### C++ Level + +~~~~ +#include +#include +#include < BRepAlgoAPI_Fuse.hxx> + {… + Standard_Boolean bRunParallel; + Standard_Real aFuzzyValue; + BRepAlgoAPI_Fuse aBuilder; + + // perpare the arguments + TopTools_ListOfShape& aLS=…; + TopTools_ListOfShape& aLT=…; + // + bRunParallel=Standard_True; + aFuzzyValue=2.1e-5; + // + // set the arguments + aBuilder.SetArguments(aLS); + aBuilder.SetTools(aLT); + // + // Set options for the algorithm + // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) + ... + // + // run the algorithm + aBuilder.Build(); + if (aBuilder.HasErrors()) { + // an error treatment + return; + } + // + // result of the operation aR + const TopoDS_Shape& aR=aBuilder.Shape(); +… +} +~~~~ + +#### Tcl Level + +~~~~ +# prepare the arguments +box b1 10 10 10 +box b2 7 0 4 10 10 10 +box b3 14 0 0 10 10 10 +# +# clear inner contents +bclearobjects; bcleartools; +# +# set the arguments +baddobjects b1 b3 +baddtools b2 +# +# set options for the algorithm (see "GF Usage" chapter) +... +# +# run the algorithm +# r is the result of the operation +# 1 means Fuse operation +bapibop r 1 +~~~~ + +@subsubsection specification__boolean_11b_2_5 Case 5. Cut operation + +The following example illustrates how to use Cut operation: + +#### C++ Level + +~~~~ +#include +#include +#include < BRepAlgoAPI_Cut.hxx> + {… + Standard_Boolean bRunParallel; + Standard_Real aFuzzyValue; + BRepAlgoAPI_Cut aBuilder; + + // perpare the arguments + TopTools_ListOfShape& aLS=…; + TopTools_ListOfShape& aLT=…; + // + bRunParallel=Standard_True; + aFuzzyValue=2.1e-5; + // + // set the arguments + aBuilder.SetArguments(aLS); + aBuilder.SetTools(aLT); + // + // Set options for the algorithm + // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) + ... + // + // run the algorithm + aBuilder.Build(); + if (aBuilder.HasErrors()) { + // an error treatment + return; + } + // + // result of the operation aR + const TopoDS_Shape& aR=aBuilder.Shape(); +… +} +~~~~ + +#### Tcl Level + +~~~~ +# prepare the arguments +box b1 10 10 10 +box b2 7 0 4 10 10 10 +box b3 14 0 0 10 10 10 +# +# clear inner contents +bclearobjects; bcleartools; +# +# set the arguments +baddobjects b1 b3 +baddtools b2 +# +# set options for the algorithm (see "GF Usage" chapter) +... +# +# run the algorithm +# r is the result of the operation +# 2 means Cut operation +bapibop r 2 +~~~~ + + +@subsubsection specification__boolean_11b_2_6 Case 6. Section operation + +The following example illustrates how to use Section operation: + +#### C++ Level + +~~~~ +#include +#include +#include < BRepAlgoAPI_Section.hxx> + {… + Standard_Boolean bRunParallel; + Standard_Real aFuzzyValue; + BRepAlgoAPI_Section aBuilder; + + // perpare the arguments + TopTools_ListOfShape& aLS=…; + TopTools_ListOfShape& aLT=…; + // + bRunParallel=Standard_True; + aFuzzyValue=2.1e-5; + // + // set the arguments + aBuilder.SetArguments(aLS); + aBuilder.SetTools(aLT); + // + // Set options for the algorithm + // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) + ... + // + // run the algorithm + aBuilder.Build(); + if (aBuilder.HasErrors()) { + // an error treatment + return; + } + // + // result of the operation aR + const TopoDS_Shape& aR=aBuilder.Shape(); +… +} +~~~~ + +#### Tcl Level + +~~~~ +# prepare the arguments +box b1 10 10 10 +box b2 3 4 5 10 10 10 +box b3 5 6 7 10 10 10 +# +# clear inner contents +bclearobjects; bcleartools; +# +# set the arguments +baddobjects b1 b3 +baddtools b2 +# +# set options for the algorithm (see "GF Usage" chapter) +... +# +# run the algorithm +# r is the result of the operation +# 4 means Section operation +bapibop r 4 +~~~~ + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image001.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image001.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image001.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image001.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + V + 1 + + + + + V + 2 + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image002.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image002.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image002.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image002.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + V + 1 + + + + + V + 2 + + + V + + + + + + + + + + Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image007.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image007.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image008.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image008.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image009.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image009.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image010.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image010.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image010.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image010.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + E + 2 + + + E + 1 + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image011.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image011.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image011.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image011.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + Vn + 1 + + + E + 21 + + + E + 11 + + + E + 12 + + + E + 22 + + + + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image012.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image012.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image012.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image012.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + Vn + 1 + + + E + 11 + + + E + 12 + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image013.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image013.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image013.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image013.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + Vn + 1 + + + E + 21 + + + E + 22 + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image014.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image014.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image014.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image014.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + E + 2 + + + E + 1 + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image015.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image015.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image015.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image015.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + E + 12 + + + E + 22 + + + E + 11 + + + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image016.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image016.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image016.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image016.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + E + 12 + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image017.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image017.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image017.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image017.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + E + 11 + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image018.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image018.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image018.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image018.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + E + 22 + + + + + + + + + Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image019.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image019.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image020.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image020.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image021.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image021.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image022.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image022.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image023.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image023.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image024.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image024.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image025.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image025.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image026.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image026.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image027.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image027.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image028.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image028.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image029.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image029.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image030.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image030.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image031.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image031.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image032.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image032.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image033.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image033.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image034.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image034.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image035.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image035.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image036.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image036.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image037.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image037.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image038.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image038.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image039.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image039.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image040.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image040.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image041.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image041.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image042.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image042.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image043.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image043.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image044.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image044.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image045.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image045.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image046.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image046.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image047.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image047.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image048.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image048.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image049.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image049.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image050.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image050.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image051.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image051.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image052.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image052.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image053.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image053.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image054.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image054.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image055.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image055.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image056.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image056.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image057.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image057.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image058.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image058.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image059.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image059.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image060.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image060.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image061.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image061.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image062.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image062.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image063.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image063.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image064.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image064.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image065.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image065.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image066.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image066.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image067.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image067.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image068.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image068.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image069.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image069.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image070.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image070.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image071.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image071.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image072.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image072.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image073.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image073.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image080.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image080.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image081.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image081.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image082.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image082.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image083.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image083.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image084.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image084.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image085.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image085.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image086.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image086.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image087.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image087.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image088.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image088.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image089.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image089.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image090.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image090.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image091.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image091.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image092.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image092.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image093.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image093.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image094.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image094.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image095.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image095.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image096.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image096.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image097.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image097.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image098.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image098.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image099.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image099.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image100.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image100.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image101.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image101.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image102.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image102.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image103.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image103.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image104.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image104.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image105.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image105.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image106.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image106.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image107.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image107.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image108.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image108.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image109.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image109.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image110.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image110.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image111.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image111.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image112.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image112.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image113.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image113.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image114.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image114.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image115.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image115.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image116.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image116.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image117.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image117.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image118.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image118.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image119.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image119.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image120.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image120.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image121.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image121.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image122.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image122.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image123.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image123.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image124.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image124.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image125.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image125.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image126.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image126.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image127.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image127.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image128.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image128.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image129.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image129.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image130.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image130.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image131.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image131.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image132.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image132.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image133.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image133.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image134.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image134.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image135.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image135.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image136.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image136.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image137.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image137.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image138.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image138.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image139.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image139.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image140.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image140.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image141.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image141.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image142.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image142.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/boolean_image143.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/boolean_image143.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/bop_simple_001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/bop_simple_001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/bop_simple_002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/bop_simple_002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/bsplit_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_006_1.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_006_1.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_006_2.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_006_2.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_007.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_007.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_008.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/cells_algorithm_008.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/glue_options_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/glue_options_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/glue_options_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/glue_options_image002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/glue_options_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/glue_options_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/glue_options_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/glue_options_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/glue_options_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/glue_options_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/mkvolume_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/mkvolume_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/mkvolume_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/mkvolume_image002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/mkvolume_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/mkvolume_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/mkvolume_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/mkvolume_image004.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image001.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image001.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image001.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image001.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + S + 1 + + S + 2 + + + + + + + S + p1 + + S + p2 + + + + + S + p12 + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image002.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image002.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image002.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image002.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,591 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tol(Vi) + + Tol + ( + Vj) + + Vj + + Vi + + T + + s + + + + D + + + + + + + + + Tol(Vn) + + Vn + + Pn + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image003.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image003.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image003.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image003.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,597 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + E + j + + V + i + + + + + + + + + + + + + + + + + + + + Tol(E + j + ) + + Tol(V + i + ) + + + V + i + + + + + + + + + + + + + + + C + j + + Tol(V + i + ) + + + + + + + + t + i + + + + PP + i + + P + i + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image004.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image004.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image004.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image004.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,750 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + Tol(Vi) + + Fj + + Vi + + + + + + Pi + + PPi + + + + + + + 2 + · + Tol(Fj) + + + + Tol(Vi) + + Fj + + Vi + + + + + + + + + Pi + + PPi + + + + + + + u + + v + + + + v + i + + u + i + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image005.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image005.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image005.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image005.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,827 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + E + j + + + + + + + + + + + + + + Tol(E + j + ) + + + + + + + + + + + + + + + Tol(E + i + ) + + E + i2 + + + E + j + + + + + + + + + + + + + + + + E + i + + + + + + t + j2 + + t + j1 + + C + j + + + + + + + j2 + i + i1 + V + V + V + + i + + + + V + i2 + j2 + C + + t + + t + j1 + V + j1 + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image006.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image006.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image006.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image006.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,817 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + E + j + + + + + + + + + + + + + + Tol(E + j + ) + + + + + + + + + + + + E + i + + + + Tol(E + i + ) + + + + + + + + E + j + + + + + + + + + + + + + + + + + + + E + i + + + + + t + j + + + + C + j + + + V + n + + + + + + Tol(V + n + ) + + + + Ci + + + + + + + t + i + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image007.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image007.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image007.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image007.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,712 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + Tol(Ei) + + + + + + + + + Fj + + + + + + + + + + 2 + · + Tol(Fj) + + + + + + + + + + + + + + Ei + + + + + + + + + + + Fj + + + + + + + + + + + + Ei + + + Ci + + + + + + + + t + i2 + + t + i1 + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image008.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image008.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image008.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image008.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,690 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + Tol(Ei) + + + + + Fj + + + + + + 2 + · + Tol(Fj) + + Ei + + + + + + + + + + + + + + + + + + + + + Fj + + + + Ei + + + + + + + + + + + + + + + + + Tol(Vn) + + Vn + + + + Ci + + + + t + i + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image009.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image009.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image009.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image009.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,430 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + Tol(Cijk) + + + + + + Fi + + + + + + + 2·Tol(Fj) + + + + + + + + + + + + + 2·Tol(Fi) + + Fj + + Cijk + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image010.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image010.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image010.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image010.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,471 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + Tol(Vijm) + + + + + Fi + + + + + + + 2·Tol(Fj) + + 2·Tol(Fi) + + Fj + + + + + + + + + + + + + + + + + + + Vijm + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image011.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image011.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image011.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image011.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + PVb + + + + + + + + E + + C + + PVe + + PVi + + + t + i + + t + e + + + t + b + =0 + + + + Ve + + Vb + + Vi + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image012.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image012.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image012.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image012.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,762 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + PVb + + + + + + + + E + + C + + PVe + + PVi + + + t + b + =0 + + + Ve + + Vb + + Vi + + + + + + + + + + + + + + + PVh + + PVj + + t + h + + t + i + + t + j + + t + e + + Vh + + Vj + + + PBi + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image013.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image013.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image013.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image013.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,704 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + V + 1 + + V + 2 + + C(t) + + Tol(V + 2 + ) + + Tol(V + 1 + ) + + Tol(C) + + t + 1C + + t + 2C + + t + 2S + + t + 1S + + + + + + + + P + 1 + + P + 2 + + P + 2C + + P + 1C + + + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image014.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image014.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image014.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image014.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,428 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + E + 1 + + + + + + + + + + E + 2 + + V + 1 + 1 + + V + 1 + 2 + + V + 21 + + V + 22 + + + + + + CB + + + + PB + 2 + + PB + 1 + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image015.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image015.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image015.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image015.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,403 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + V + 1 + 1 + + PB + + F + 2 + + + + + + + + F + 3 + + E + 1 + + + + + CB + + V + i + + V + j + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image016.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image016.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image016.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image016.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,918 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + F + 1 + + + + + + + + + + + + + + + + + + F + 2 + + F + 3 + + E + x + + V + in1 + + PB + on11 + + PB + on12 + + PB + on2 + + PB + on31 + + PB + on32 + + PB + on4 + + PB + in1 + + PB + sc1 + + E + 1 + + E + 2 + + E + 3 + + E + 4 + + + + + + + V + 1 + + V + 2 + + V + 3 + + V + 4 + + V + 5 + + V + 6 + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image017.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image017.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image017.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image017.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,681 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + BOPDS_Interf + + + + BOPDS_InterfVV + + + + + + BOPDS + _InterfVE + + + + BOPDS_InterfVF + + + + BOPDS_InterfEE + + + + BOPDS_InterfEF + + + + BOPDS_InterfFF + + + + + + + + + + + + + + + + + + + + + + + + BOPDS_InterfVZ + BOPDS_InterfEZ + BOPDS_InterfFZ + BOPDS_InterfZZ + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image018.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image018.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image018.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image018.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,827 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + V + 1 + 1 + + + + + V + 12 + + + + + V + 13 + + + + + V + 1 + 4 + + + + + V + 1 + 5 + + + + + V + 21 + + + + + V + 22 + + + + + V + 23 + + + + V + N + 1 + + + + V + N + 2 + + + + + + + + + + + Chain 1 + Chain 2 + + + Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image019.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image019.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image020.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image020.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image021.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image021.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image021.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image021.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,596 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + E + 1 + + + E + 2 + + + E + 3 + + + + + + + + + + + + + + + + + + Vn + 1 + + + E + 31 + + + E + 11 + + + E + 21 + + + E + 12 + + + E + 22 + + + E + 32 + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image022.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image022.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image022.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image022.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1010 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + E + 1 + + W + 1 + + W + 2 + + Ew + 21 + + Ew + 22 + + Ew + 23 + + Ew + 11 + + Ew + 12 + + Ew + 13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + E + 11 + + W + n1 + + W + 2 + + Ew + 11 + + Ew + 13 + + Ew + 21 + + Ew + 23 + + E + 12 + + En + 1 + + En + 2 + + En + 3 + + En + 4 + + Vn + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image023.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image023.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image023.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image023.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,516 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + E + 1 + + F + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + F + 21 + + E + 11 + + E + 12 + + E + 12 + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image024.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image024.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image024.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image024.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,584 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + E + 1 + + F + 2 + + + + + + + + + + + + + + + + + + + + + + + F + 21 + + + + + + + + + + + + + + F + 22 + + E + 12 + + E + 12 + + E + 11 + + E + 13 + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image025.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image025.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image025.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image025.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,806 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + F + 21 + + + F + 22 + + + E + 1 + + + + + + + + + + + + + + + + + E + 11 + + E + 14 + + + + + + + + + + + + + + + + + + + F + 212 + + + F + 222 + + + + + + + + + F + 211 + + F + 221 + + + + E + 13 + + + + + E + 12 + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image026.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image026.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image026.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image026.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1061 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + Sh + 2 + + + + + + + + + + + + + + + + + + + + + F + 21 + + + F + 22 + + W + 1 + + + + + + + + + + + + + + + + + + + + + + F + 212 + + + F + 222 + + + + F + 211 + + F + 221 + + + + + + + + F + 223 + + F + 213 + + + + + + W + 11 + + Sh + 2 + + + + + + + + + + + + E + 11 + + E + 12 + + E + 13 + + E + 14 + + Sh + 21 + + E + 1 + + E + 2 + + E + 3 + + E + 4 + + + + + + + + + + + + + + Sh2 + + + Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image027.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image027.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image028.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image028.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image029.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image029.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image030.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image030.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image031.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image031.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image032.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image032.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image033.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image033.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image033.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image033.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,563 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + F + 2 + + Chain 1 + + Chain 2 + + + + + F + 1 + + F + 3 + + + + F + 4 + + F + 5 + + F + 11 + + F + 21 + + F + 22 + + F + 31 + + + + F + 6 + + F + 51 + + F + 41 + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image036.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image036.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image036.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image036.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + E + 1 + + + E + 2 + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image037.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image037.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image037.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image037.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + E + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image038.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image038.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image038.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image038.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2759 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + F + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image039a.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image039a.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image039b.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image039b.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image040.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image040.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image041.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image041.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image042.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image042.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image043.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image043.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image044.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image044.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image045.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image045.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image046.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image046.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image047.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image047.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image048.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image048.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image049.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image049.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image050.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image050.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image050.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image050.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,931 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + V + 3 + + Tol(V + 1 + ) + + V + 2 + + E + 12 + + E + 23 + + E + 41 + + F + 1 + + C + 12 + + E + 34 + + V + 4 + + F + 2 + + EC + 12 + + V + 1 + + Tol(V + 2 + ) + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image051.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image051.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image051.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image051.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + E + 1 + + + E + 2 + + + + Dmax + + + + V + 1 + + V + 2 + + + + C + 1 + + C + 2 + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image052.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image052.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image052.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image052.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,464 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + E + 1 + + + E + 2 + + + + + + 2*Tol(E + 1 + ) + + 2*Tol(E + 2 + ) + + + + + + + + + + + + + + V + X1 + + V + X2 + + V + X3 + + V + 1 + + V + 2 + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image053.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image053.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image053.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image053.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2764 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + F + 1 + + + F + 2 + + + + Dmax + + + + + E + x1 + + E + x2 + + E + x3 + + + E + 1 + + E + 2 + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image054.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image054.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image054.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image054.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + V + 21 + + + + + + + V + 22 + + E + 2 + + + + + + V + 1 + + + Tol(V + 1 + ) + + Tol(V + 21 + ) + + Tol(V + 22 + ) + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image055.svg opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image055.svg --- opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image055.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image055.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tol(V + 2 + ) + + E + 11 + + E + 12 + + + + Tol( + E + 11 + ) + + Tol( + E + 12 + ) + + + + Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image060.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image060.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image061.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image061.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image062.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image062.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image063.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image063.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image064.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image064.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/specification/boolean_operations/images/operations_image065.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/specification/boolean_operations/images/operations_image065.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/specification/brep_format.md opencascade-7.5.1+dfsg1/dox/specification/brep_format.md --- opencascade-7.4.1+dfsg1/dox/specification/brep_format.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/brep_format.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2283 @@ +BRep Format {#specification__brep_format} +======================== + +@tableofcontents + +@section specification__brep_format_1 Introduction + + BREP format is used to store 3D models and allows to store a model which consists + of vertices, edges, wires, faces, shells, solids, compsolids, compounds, edge triangulations, + face triangulations, polylines on triangulations, space location and orientation. + Any set of such models may be stored as a single model which is a compound of the models. + + The format is described in an order which is convenient for understanding + rather than in the order the format parts follow each other. + BNF-like definitions are used in this document. + Most of the chapters contain BREP format descriptions in the following order: + + * format file fragment to illustrate the part; + * BNF-like definition of the part; + * detailed description of the part. + +**Note** that the format is a part of Open CASCADE Technology (OCCT). + +Some data fields of the format have additional values, which are used in OCCT. + +Some data fields of the format are specific for OCCT. + +@section specification__brep_format_2 Storage of shapes + +*BRepTools* and *BinTools* packages contain methods *Read* and *Write* allowing to read and write a Shape to/from a stream or a file. +The methods provided by *BRepTools* package use ASCII storage format; *BinTools* package uses binary format. +Each of these methods has two arguments: +- a *TopoDS_Shape* object to be read/written; +- a stream object or a file name to read from/write to. + +The following sample code reads a shape from ASCII file and writes it to a binary one: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} + TopoDS_Shape aShape; + if (BRepTools::Read (aShape, "source_file.txt")) { + BinTools::Write (aShape, "result_file.bin"); + } +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +@section specification__brep_format_3 Format Common Structure + + ASCII encoding is used to read/write BREP format from/to file. The format data are stored in a file as text data. + + BREP format uses the following BNF terms: + + * \<\\n\>: It is the operating-system-dependent ASCII character sequence which separates ASCII text strings in the operating system used; + * \<_\\n\>: = " "*\<\\n\>; + * \<_\>: = " "+; It is a not empty sequence of space characters with ASCII code 21h; + * \: = "0" | "1"; + * \: It is an integer number from -231 to 231-1 which is written in denary system; + * \: It is a real from -1.7976931348623158 @f$\cdot@f$ 10308 to 1.7976931348623158 @f$\cdot@f$ 10308 which is written in decimal or E form with base 10.The point is used as a delimiter of the integer and fractional parts; + * \<2D point\>: = \\<_\>\; + * \<3D point\>: = \(\<_\>\2; + * \<2D direction\>: It is a \<2D point\> *x y* so that *x2 + y2* = 1; + * \<3D direction\>: It is a \<3D point\> *x y z* so that *x2 + y2 + z2* = 1; + * \<+\>: It is an arithmetic operation of addition. + + The format consists of the following sections: + + * \; + * \; + * \; + * \; + * \. + + \ = "DBRep_DrawableShape" \<_\\n\>\<_\\n\>; + \ have other values [1]. + + \ = ("CASCADE Topology V1, (c) Matra-Datavision" | "CASCADE Topology V2, (c) Matra-Datavision")\<_\\n\>; + The difference of the versions is described in the document. + + Sections \, \ and \ are described below in separate chapters of the document. + +@section specification__brep_format_4 Locations + +**Example** + +@verbatim + Locations 3 + 1 +               0               0               1               0 +               1               0               0               0 +               0               1               0               0 + 1 +               1               0               0               4 +               0               1               0               5 +               0               0               1               6 + 2  1 1 2 1 0 +@endverbatim + +**BNF-like Definition** + +@verbatim + = <_\n> ; + = "Locations" <_> ; + = ; + = ^ ; + = | ; + = "1" <_\n> ; + = "2" <_> ; + = ((<_> ) ^ 4 <_\n>) ^ 3; + = ( <_> <_>)* "0" <_\n>; +@endverbatim + +**Description** + +\ is interpreted as a 3 x 4 matrix +@f$Q = +\begin{pmatrix} +{q}_{1,1} &{q}_{1,2} &{q}_{1,3} &{q}_{1,4}\\ +{q}_{2,1} &{q}_{2,2} &{q}_{2,3} &{q}_{2,4}\\ +{q}_{3,1} &{q}_{3,2} &{q}_{3,3} &{q}_{3,4} +\end{pmatrix}@f$  +which describes transformation of 3 dimensional space and satisfies the following constraints: + * @f$ d \neq 0@f$ where @f$d = |Q_{2}|@f$ where + @f$ Q_{2} = \begin{pmatrix} + {q}_{1,1} &{q}_{1,2} &{q}_{1,3} &{q}_{1,4}\\ + {q}_{2,1} &{q}_{2,2} &{q}_{2,3} &{q}_{2,4}\\ + {q}_{3,1} &{q}_{3,2} &{q}_{3,3} &{q}_{3,4} + \end{pmatrix}; @f$ + * @f$ Q_{3}^{T} = Q_{3}^{-1}@f$ where @f$Q_{3} = Q_{2}/d^{1/3}. @f$ + +The transformation transforms a point (x, y, z) to another point (u, v, w) by the rule: +@f[ \begin{pmatrix} +u \\ v \\ w +\end{pmatrix} = +Q\cdot(x\;y\;z\;1)^{T} = +\begin{pmatrix} +{q}_{1,1}\cdot x +{q}_{1,2}\cdot y +{q}_{1,3}\cdot z +{q}_{1,4}\\ +{q}_{2,1}\cdot x +{q}_{2,2}\cdot y +{q}_{2,3}\cdot z +{q}_{2,4}\\ +{q}_{3,1}\cdot x +{q}_{3,2}\cdot y +{q}_{3,3}\cdot z +{q}_{3,4} +\end{pmatrix} . @f] + +*Q* may be a composition of matrices for the following elementary transformations: + + * parallel translation -- + @f$ \begin{pmatrix} + 1 &0 &0 &{q}_{1,4}\\ + 0 &1 &0 &{q}_{2,4}\\ + 0 &0 &1 &{q}_{3,4} + \end{pmatrix}; @f$ + * rotation around an axis with a direction *D(Dx, Dy, Dz)* by an angle @f$ \varphi @f$ -- + + @f[ \begin{pmatrix} + D_{x}^{2} \cdot (1-cos(\varphi)) + cos(\varphi) &D_{x} \cdot D_{y} \cdot (1-cos(\varphi)) - D_{z} \cdot sin(\varphi) &D_{x} \cdot D_{z} \cdot (1-cos(\varphi)) + D_{y} \cdot sin(\varphi) &0\\ + D_{x} \cdot D_{y} \cdot (1-cos(\varphi)) + D_{z} \cdot sin(\varphi) &D_{y}^{2} \cdot (1-cos(\varphi)) + cos(\varphi) &D_{y} \cdot D_{z} \cdot (1-cos(\varphi)) - D_{x} \cdot sin(\varphi) &0\\ + D_{x} \cdot D_{z} \cdot (1-cos(\varphi)) - D_{y} \cdot sin(\varphi) &D_{y} \cdot D_{z} \cdot (1-cos(\varphi)) + D_{x} \cdot sin(\varphi) &D_{z}^{2} \cdot (1-cos(\varphi)) + cos(\varphi) &0 + \end{pmatrix}; @f] + + * scaling -- @f$ \begin{pmatrix} s &0 &0 &0\\ 0 &s &0 &0\\ 0 &0 &s &0 \end{pmatrix} @f$ where @f$ S \in (-\infty,\; \infty)/\left \{ 0 \right \}; @f$ + * central symmetry -- @f$ \begin{pmatrix} -1 &0 &0 &0\\ 0 &-1 &0 &0\\ 0 &0 &-1 &0 \end{pmatrix}; @f$ + * axis symmetry -- @f$ \begin{pmatrix} -1 &0 &0 &0\\ 0 &-1 &0 &0\\ 0 &0 &1 &0 \end{pmatrix}; @f$ + * plane symmetry -- @f$ \begin{pmatrix} 1 &0 &0 &0\\ 0 &1 &0 &0\\ 0 &0 &-1 &0 \end{pmatrix}. @f$ + +\ is interpreted as a composition of locations raised to a power and placed above this \ in the section \. \ is a sequence @f$l_{1}p_{1} ... l_{n}p_{n}@f$ of @f$ n \geq 0 @f$ integer pairs @f$ l_{i}p_{i} \; (1 \leq i \leq n) @f$. \ 0 is the indicator of the sequence end. The sequence is interpreted as a composition @f$ L_{l_{1}}^{p_{1}} \cdot ... \cdot L_{l_{n}}^{p_{n}} @f$ where @f$ L_{l_{i}} @f$ is a location from @f$ l_{i} @f$-th \ in the section locations. \ numbering starts from 1. + + +@section specification__brep_format_5 Geometry + +@verbatim + = + <2D curves> + <3D curves> + <3D polygons> + + + ; +@endverbatim + +@subsection specification__brep_format_5_1 3D curves + +**Example** + +@verbatim + Curves 13 + 1 0 0 0 0 0 1 + 1 0 0 3 -0 1 0 + 1 0 2 0 0 0 1 + 1 0 0 0 -0 1 0 + 1 1 0 0 0 0 1 + 1 1 0 3 0 1 0 + 1 1 2 0 0 0 1 + 1 1 0 0 -0 1 0 + 1 0 0 0 1 0 -0 + 1 0 0 3 1 0 -0 + 1 0 2 0 1 0 -0 + 1 0 2 3 1 0 -0 + 1 1 0 0 1 0 0 +@endverbatim + +**BNF-like Definition** + +@verbatim + <3D curves> = <3D curve header> <_\n> <3D curve records>; + + <3D curve header> = "Curves" <_> <3D curve count>; + + <3D curve count> = ; + + <3D curve records> = <3D curve record> ^ <3D curve count>; + + <3D curve record> = + <3D curve record 1> | + <3D curve record 2> | + <3D curve record 3> | + <3D curve record 4> | + <3D curve record 5> | + <3D curve record 6> | + <3D curve record 7> | + <3D curve record 8> | + <3D curve record 9>; + @endverbatim + +@subsubsection specification__brep_format_5_1_1 Line - \<3D curve record 1\> + +**Example** + +@verbatim + 1 1 0 3 0 1 0 +@endverbatim + +**BNF-like Definition** + +@verbatim + <3D curve record 1> = "1" <_> <3D point> <_> <3D direction> <_\n>; +@endverbatim + +**Description** + +\<3D curve record 1\> describes a line. The line data consist of a 3D point *P* and a 3D direction *D*. The line passes through the point *P*, has the direction *D* and is defined by the following parametric equation: + +@f[ C(u)=P+u \cdot D, \; u \in (-\infty,\; \infty). @f] + +The example record is interpreted as a line which passes through a point *P*=(1, 0, 3), has a direction *D*=(0, 1, 0) and is defined by the following parametric equation: @f$ C(u)=(1,0,3)+u \cdot (0,1,0) @f$. + + +@subsubsection specification__brep_format_5_1_2 Circle - \<3D curve record 2\> + +**Example** + +@verbatim + 2 1 2 3 0 0 1 1 0 -0 -0 1 0 4 +@endverbatim + +**BNF-like Definition** + +~~~~ + <3D curve record 2> = "2" <_> <3D circle center> <_> <3D circle N> <_> <3D circle Dx> <_> <3D circle Dy> <_> <3D circle radius> <_\n>; + + <3D circle center> = <3D point>; + + <3D circle N> = <3D direction>; + + <3D circle Dx> = <3D direction>; + + <3D circle Dy> = <3D direction>; + + <3D circle radius> = ; +~~~~ + +**Description** + +\<3D curve record 2\> describes a circle. The circle data consist of a 3D point *P*, pairwise orthogonal 3D directions *N*, *Dx* and *Dy* and a non-negative real *r*. The circle has a center *P* and is located in a plane with a normal *N*. The circle has a radius *r* and is defined by the following parametric equation: + +@f[ C(u)=P+r \cdot (cos(u) \cdot D_{x} + sin(u) \cdot D_{y}), \; u \in [o,\;2 \cdot \pi). @f] + +The example record is interpreted as a circle which has its center *P*=(1, 2, 3), is located in plane with a normal *N*=(0, 0 ,1). Directions for the circle are *Dx*=(1, 0 ,0) and *Dy*=(0, 1 ,0). The circle has a radius *r*=4 and is defined by the following parametric equation: @f$ C(u) = (1,2,3) + 4 \cdot ( cos(u) \cdot(1,0,0) + sin(u) \cdot (0,1,0) ) @f$. + + +@subsubsection specification__brep_format_5_1_3 Ellipse - \<3D curve record 3\> + +**Example** + +@verbatim + 3 1 2 3 0 0 1 1 0 -0 -0 1 0 5 4 +@endverbatim + +**BNF-like Definition** + +~~~~ + <3D curve record 3> = "3" <_> <3D ellipse center> <_> <3D ellipse N> <_> <3D ellipse Dmaj> <_> <3D ellipse Dmin> <_> <3D ellipse Rmaj> <_> <3D ellipse Rmin> <_\n>; + + <3D ellipse center> = <3D point>; + + <3D ellipse N> = <3D direction>; + + <3D ellipse Dmaj> = <3D direction>; + + <3D ellipse Dmin> = <3D direction>; + + <3D ellipse Rmaj> = ; + + <3D ellipse Rmin> = ; +~~~~ + +**Description** + +\<3D curve record 3\> describes an ellipse. The ellipse data consist of a 3D point *P*, pairwise orthogonal 3D directions *N*, *Dmaj* and *Dmin* and non-negative reals *rmaj* and *rmin* so that *rmin* @f$ \leq @f$ *rmaj*. The ellipse has its center *P*, is located in plane with the normal *N*, has major and minor axis directions *Dmaj* and *Dmin*, major and minor radii *rmaj* and *rmin* and is defined by the following parametric equation: + +@f[ C(u)=P+r_{maj} \cdot cos(u) \cdot D_{maj} + r_{min} \cdot sin(u) \cdot D_{min}, u \in [0, 2 \cdot \pi). @f] + +The example record is interpreted as an ellipse which has its center *P*=(1, 2, 3), is located in plane with a normal *N*=(0, 0, 1), has major and minor axis directions *Dmaj*=(1, 0, 0) and *Dmin*=(0, 1, 0), major and minor radii *rmaj*=5 and *rmin*=4 and is defined by the following parametric equation: @f$ C(u) = (1,2,3) + 5 \cdot cos(u) \cdot(1,0,0) + 4 \cdot sin(u) \cdot (0,1,0) @f$. + + +@subsubsection specification__brep_format_5_1_4 Parabola - \<3D curve record 4\> + +**Example** + +@verbatim + 4 1 2 3 0 0 1 1 0 -0 -0 1 0 16 +@endverbatim + +**BNF-like Definition** + +~~~~ + <3D curve record 4> = "4" <_> <3D parabola origin> <_> <3D parabola N> <_> <3D parabola Dx> <_> <3D parabola Dy> <_> <3D parabola focal length> <_\n>; + + <3D parabola origin> = <3D point>; + + <3D parabola N> = <3D direction>; + + <3D parabola Dx> = <3D direction>; + + <3D parabola Dy> = <3D direction>; + + <3D parabola focal length> = ; +~~~~ + +**Description** + +\<3D curve record 4\> describes a parabola. The parabola data consist of a 3D point *P*, pairwise orthogonal 3D directions *N*, *Dx* and *Dy* and a non-negative real *f*. The parabola is located in plane which passes through the point *P* and has the normal *N*. The parabola has a focus length *f* and is defined by the following parametric equation: + +@f[ C(u)=P+\frac{u^{2}}{4 \cdot f} \cdot D_{x} + u \cdot D_{y}, u \in (-\infty,\; \infty) \Leftarrow f \neq 0; @f] +@f[ C(u)=P+u \cdot D_{x}, u \in (-\infty,\; \infty) \Leftarrow f = 0\;(degenerated\;case). @f] + +The example record is interpreted as a parabola in plane which passes through a point *P*=(1, 2, 3) and has a normal *N*=(0, 0, 1). Directions for the parabola are *Dx*=(1, 0, 0) and *Dy*=(0, 1, 0). The parabola has a focus length *f*=16 and is defined by the following parametric equation: @f$ C(u) = (1,2,3) + \frac{u^{2}}{64} \cdot (1,0,0) + u \cdot (0,1,0) @f$. + + +@subsubsection specification__brep_format_5_1_5 Hyperbola - \<3D curve record 5\> + +**Example** + +@verbatim + 5 1 2 3 0 0 1 1 0 -0 -0 1 0 5 4 +@endverbatim + +**BNF-like Definition** + +~~~~ + <3D curve record 5> = "5" <_> <3D hyperbola origin> <_> <3D hyperbola N> <_> <3D hyperbola Dx> <_> <3D hyperbola Dy> <_> <3D hyperbola Kx> <_> <3D hyperbola Ky> <_\n>; + + <3D hyperbola origin> = <3D point>; + + <3D hyperbola N> = <3D direction>; + + <3D hyperbola Dx> = <3D direction>; + + <3D hyperbola Dy> = <3D direction>; + + <3D hyperbola Kx> = ; + + <3D hyperbola Ky> = ; +~~~~ + +**Descripton** + +\<3D curve record 5\> describes a hyperbola. The hyperbola data consist of a 3D point *P*, pairwise orthogonal 3D directions *N*, *Dx* and *Dy* and non-negative reals *kx* and *ky*. The hyperbola is located in plane which passes through the point *P* and has the normal *N*. The hyperbola is defined by the following parametric equation: + +@f[ C(u)=P+k_{x} \cdot cosh(u) \cdot D_{x}+k_{y} \cdot sinh(u) \cdot D_{y} , u \in (-\infty,\; \infty). @f] + +The example record is interpreted as a hyperbola in plane which passes through a point *P*=(1, 2, 3) and has a normal *N*=(0, 0, 1). Other hyperbola data are *Dx*=(1, 0, 0), *Dy*=(0, 1, 0), *kx*=5 and *ky*=4. The hyperbola is defined by the following parametric equation: @f$ C(u) = (1,2,3) + 5 \cdot cosh(u) \cdot (1,0,0) +4 \cdot sinh(u) \cdot (0,1,0) @f$. + + +@subsubsection specification__brep_format_5_1_6 Bezier Curve - \<3D curve record 6\> + +**Example** + +@verbatim + 6 1 2 0 1 0  4 1 -2 0  5 2 3 0  6 +@endverbatim + +**BNF-like Definition** + +@verbatim + <3D curve record 6> = "6" <_> <3D Bezier rational flag> <_> <3D Bezier degree> + <3D Bezier weight poles> <_\n>; + + <3D Bezier rational flag> = ; + + <3D Bezier degree> = ; + + 3D Bezier weight poles> = (<_> <3D Bezier weight pole>) ^ (<3D Bezier degree> <+> "1"); + + <3D Bezier weight pole> = <3D point> [<_> ]; +@endverbatim + +**Description** + +\<3D curve record 6\> describes a Bezier curve. The curve data consist of a rational *r*, a degree @f$ m \leq 25 @f$ and weight poles. + +The weight poles are *m*+1 3D points *B0 ... Bm* if the flag *r* is 0. The weight poles are *m*+1 pairs *B0h0 ... Bmhm* if flag *r* is 1. Here *Bi* is a 3D point and *hi* is a positive real @f$ (0 \leq i \leq m) @f$. @f$ h_{i}=1\; (0 \leq i \leq m) @f$ if the flag *r* is 0. + +The Bezier curve is defined by the following parametric equation: + +@f[ C(u) = \frac{\sum_{i=0}^{m}B_{i} \cdot h_{i} \cdot C_{m}^{i} \cdot u^{i} \cdot (1-u)^{m-i}}{\sum_{i=0}^{m}h_{i} \cdot C_{m}^{i} \cdot u^{i} \cdot (1-u)^{m-i}},\;u \in [0,\; 1] @f] + +where @f$ 0^{0} \equiv 1 @f$. + +The example record is interpreted as a Bezier curve with a rational flag *r*=1, degree *m*=2 and weight poles *B0*=(0, 1, 0), *h0*=4, *B1*=(1, -2, 0), *h1*=5 and *B2*=(2, 3, 0), *h2*=6. The Bezier curve is defined by the following parametric equation: + +@f[ C(u)=\frac{(0,1,0) \cdot 4 \cdot (1-u)^{2}+(1,-2,0) \cdot 5 \cdot 2 \cdot u \cdot (1-u) + (2,3,0) \cdot 6 \cdot u^{2} )}{4 \cdot (1-u)^{2}+5 \cdot 2 \cdot u \cdot (1-u)+6 \cdot u^{2}}. @f] + + +@subsubsection specification__brep_format_5_1_7 B-Spline Curve - \<3D curve record 7\> + +**Example** + +@verbatim + 7 1 0  1 3 5  0 1 0  4 1 -2 0  5 2 3 0  6 +  0 1 0.25 1 0.5 1 0.75 1 1 1 +@endverbatim + +**BNF-like Definition** + +~~~~ + <3D curve record 7> = "7" <_> <3D B-spline rational flag> <_> "0" <_> <3D B-spline degree> <_> + <3D B-spline pole count> <_> <3D B-spline multiplicity knot count> <3D B-spline weight poles> + <_\n> <3D B-spline multiplicity knots> <_\n>; + + <3D B-spline rational flag> = ; + + <3D B-spline degree> = ; + + <3D B-spline pole count> = ; + + <3D B-spline multiplicity knot count> = ; + + <3D B-spline weight poles> = (<_> <3D B-spline weight pole>) ^ <3D B-spline pole count>; + + <3D B-spline weight pole> = <3D point> [<_> ]; + + <3D B-spline multiplicity knots> = (<_> <3D B-spline multiplicity knot>) ^ <3D B-spline multiplicity knot count>; + + <3D B-spline multiplicity knot> = <_> ; +~~~~ + +**Description** + +\<3D curve record 7\> describes a B-spline curve. The curve data consist of a rational flag *r*, a degree @f$ m \leq 25 @f$, pole count @f$ n \geq 2 @f$, multiplicity knot count *k*, weight poles and multiplicity knots. + +The weight poles are *n* 3D points *B1 ... Bn* if the flag *r* is 0. The weight poles are *n* pairs *B1h1 ... Bnhn* if the flag *r* is 1. Here *Bi* is a 3D point and *hi* is a positive real @f$ (1 \leq i \leq n) @f$. @f$ h_{i}=1\; (1 \leq i \leq n) @f$ if the flag *r* is 0. + +The multiplicity knots are *k* pairs *u1q1 ... ukqk*. Here *ui* is a knot with a multiplicity @f$ q_{i} \geq 1 \; (1 \leq i \leq k) @f$ so that + +@f[ u_{i} < u_{i+1} (1 \leq i \leq k-1),@f] +@f[ q_{1} \leq m+1,\; q_{k} \leq m+1,\; q_{i} \leq m\; (2 \leq i \leq k-1), \sum_{i=1}^{k}q_{i}=m+n+1. @f] + +The B-spline curve is defined by the following parametric equation: + +@f[ C(u) = \frac{\sum_{i=1}^{n}B_{i} \cdot h_{i} \cdot N_{i,m+1}(u)}{\sum_{i=1}^{n}h_{i} \cdot N_{i,m+1}(u)},\;u \in [u_{1},\; u_{k}] @f] + +where functions @f$ N_{i,j} @f$ have the following recursion definition by *j*: + +@f[ N_{i,1}(u)=\left\{\begin{matrix} +1\Leftarrow \bar{u}_{i} \leq u \leq \bar{u}_{i+1}\\ +0\Leftarrow u < \bar{u}_{i} \vee \bar{u}_{i+1} \leq u \end{matrix} \right.,\; +N_{i,j}(u)=\frac{(u-\bar{u}_{i}) \cdot N_{i,j-1}(u) }{\bar{u}_{i+j-1}-\bar{u}_{i}}+ \frac{(\bar{u}_{i+j}-u) \cdot N_{i+1,j-1}(u)}{\bar{u}_{i+j}-\bar{u}_{i+1}},\;(2 \leq j \leq m+1) @f] + +where + +@f[ \bar{u}_{i} = u_{j},\; (1 \leq j \leq k,\; \sum_{l=1}^{j-1}q_{l}+1 \leq i \leq \sum_{l=1}^{j}q_{l} ). @f] + +The example record is interpreted as a B-spline curve with a rational flag *r*=1, a degree *m*=1, pole count *n*=3, multiplicity knot count *k*=5, weight poles *B1*=(0,1,0), *h1*=4, *B2*=(1,-2,0), *h2*=5 and *B3*=(2,3,0), *h3*=6, multiplicity knots *u1*=0, *q1*=1, *u2*=0.25, *q2*=1, *u3*=0.5, *q3*=1, *u4*=0.75, *q4*=1 and *u5*=1, *q5*=1. The B-spline curve is defined by the following parametric equation: + +@f[ C(u)=\frac{(0,1,0) \cdot 4 \cdot N_{1,2}(u) + (1,-2,0) \cdot 5 \cdot N_{2,2}(u)+(2,3,0) \cdot 6 \cdot N_{3,2}(u)}{4 \cdot N_{1,2}(u)+5 \cdot N_{2,2}(u)+6 \cdot N_{3,2}(u)}. @f] + + +@subsubsection specification__brep_format_5_1_8 Trimmed Curve - \<3D curve record 8\> + +**Example** + +@verbatim + 8 -4 5 + 1 1 2 3 1 0 0 +@endverbatim + +**BNF-like Definition** + +~~~~ + <3D curve record 8> = "8" <_> <3D trimmed curve u min> <_> <3D trimmed curve u max> <_\n> <3D curve record>; + + <3D trimmed curve u min> = ; + + <3D trimmed curve u max> = ; +~~~~ + +**Description** + +\<3D curve record 8\> describes a trimmed curve. The trimmed curve data consist of reals *umin* and *umax* and \<3D curve record\> so that *umin* < *umax*. The trimmed curve is a restriction of the base curve *B* described in the record to the segment @f$ [u_{min},\;u_{max}]\subseteq domain(B) @f$. The trimmed curve is defined by the following parametric equation: + +@f[ C(u)=B(u),\; u \in [u_{min},\;u_{max}]. @f] + +The example record is interpreted as a trimmed curve with *umin*=-4 and *umax*=5 for the base curve @f$ B(u)=(1,2,3)+u \cdot (1,0,0) @f$. The trimmed curve is defined by the following parametric equation: @f$ C(u)=(1,2,3)+u \cdot (1,0,0),\; u \in [-4,\; 5] @f$. + + +@subsubsection specification__brep_format_5_1_9 Offset Curve - \<3D curve record 9\> + +**Example** + +@verbatim + 9 2 + 0 1 0 + 1 1 2 3 1 0 0 +@endverbatim + +**BNF-like Definition** + +@verbatim + <3D curve record 9> = "9" <_> <3D offset curve distance> <_\n>; + <3D offset curve direction> <_\n>; + <3D curve record>; + + <3D offset curve distance> = ; + + <3D offset curve direction> = <3D direction>; +@endverbatim + +**Description** + +\<3D curve record 9\> describes an offset curve. The offset curve data consist of a distance *d*, a 3D direction *D* and a \<3D curve record\>. The offset curve is the result of offsetting the base curve *B* described in the record to the distance *d* along the vector @f$ [B'(u),\; D] \neq \vec{0} @f$. The offset curve is defined by the following parametric equation: + +@f[ C(u)=B(u)+d \cdot \frac{[B'(u),\; D]}{|[B'(u),\; D]|},\; u \in domain(B) . @f] + +The example record is interpreted as an offset curve with a distance *d*=2, direction *D*=(0, 1, 0), base curve @f$ B(u)=(1,2,3)+u \cdot (1,0,0) @f$ and defined by the following parametric equation: @f$ C(u)=(1,2,3)+u \cdot (1,0,0)+2 \cdot (0,0,1) @f$. + +@subsection specification__brep_format_5_2 Surfaces + +**Example** + +@verbatim + Surfaces 6 + 1 0 0 0 1 0 -0 0 0 1 0 -1 0 + 1 0 0 0 -0 1 0 0 0 1 1 0 -0 + 1 0 0 3 0 0 1 1 0 -0 -0 1 0 + 1 0 2 0 -0 1 0 0 0 1 1 0 -0 + 1 0 0 0 0 0 1 1 0 -0 -0 1 0 + 1 1 0 0 1 0 -0 0 0 1 0 -1 0 +@endverbatim + +**BNF-like Definition** + +@verbatim + = <_\n> ; + + = “Surfaces†<_> ; + + = ^ ; + + = + | + | + | + | + | + | + | + | + | + | + ; +@endverbatim + +@subsubsection specification__brep_format_5_2_1 Plane - \< surface record 1 \> + +**Example** + +@verbatim + 1 0 0 3 0 0 1 1 0 -0 -0 1 0 +@endverbatim + +**BNF-like Definition** + +@verbatim + = "1" <_> <3D point> (<_> <3D direction>) ^ 3 <_\n>; +@endverbatim + +**Description** + +\ describes a plane. The plane data consist of a 3D point *P* and pairwise orthogonal 3D directions *N*, *Du* and *Dv*. The plane passes through the point *P*, has the normal *N* and is defined by the following parametric equation: + +@f[ S(u,v)=P+u \cdot D_{u}+v \cdot D_{v},\; (u,\;v) \in (-\infty,\; \infty) \times (-\infty,\; \infty). @f] + +The example record is interpreted as a plane which passes through a point *P*=(0, 0, 3), has a normal *N*=(0, 0, 1) and is defined by the following parametric equation: @f$ S(u,v)=(0,0,3)+u \cdot (1,0,0) + v \cdot (0,1,0) @f$. + + +@subsubsection specification__brep_format_5_2_2 Cylinder - \< surface record 2 \> + +**Example** + +@verbatim + 2 1 2 3 0 0 1 1 0 -0 -0 1 0 4 +@endverbatim + +**BNF-like Definition** + +@verbatim + = "2" <_> <3D point> (<_> <3D direction>) ^ 3 <_> <_\n>; +@endverbatim + +**Description** + +\ describes a cylinder. The cylinder data consist of a 3D point *P*, pairwise orthogonal 3D directions *Dv*, *DX* and *DY* and a non-negative real *r*. The cylinder axis passes through the point *P* and has the direction *Dv*. The cylinder has the radius *r* and is defined by the following parametric equation: + +@f[ S(u,v)=P+r \cdot (cos(u) \cdot D_{x}+sin(u) \cdot D_{y} )+v \cdot D_{v},\; (u,v) \in [0,\; 2 \cdot \pi) \times (-\infty,\; \infty) . @f] + +The example record is interpreted as a cylinder which axis passes through a point *P*=(1, 2, 3) and has a direction *Dv*=(0, 0, 1). Directions for the cylinder are *DX*=(1,0,0) and *DY*=(0,1,0). The cylinder has a radius *r*=4 and is defined by the following parametric equation: @f$ S(u,v)=(1,2,3)+4 \cdot ( cos(u) \cdot D_{X} + sin(u) \cdot D_{Y} ) + v \cdot D_{v}. @f$ + + +@subsubsection specification__brep_format_5_2_3 Cone - \< surface record 3 \> + +**Example** + +@verbatim + 3 1 2 3 0 0 1 1 0 -0 -0 1 0 4 + 0.75 +@endverbatim + + +**BNF-like Definition** + +@verbatim + = "3" <_> <3D point> (<_> <3D direction>) ^ 3 (<_> ) ^ 2 <_\n>; +@endverbatim + +**Description** + +\ describes a cone. The cone data consist of a 3D point *P*, pairwise orthogonal 3D directions *DZ*, *DX* and *DY*, a non-negative real *r* and a real @f$ \varphi \in (-\pi /2,\; \pi/2)/\left \{ 0 \right \} @f$. The cone axis passes through the point *P* and has the direction *DZ*. The plane which passes through the point *P* and is parallel to directions *DX* and *DY* is the cone referenced plane. The cone section by the plane is a circle with the radius *r*. The direction from the point *P* to the cone apex is @f$ -sgn(\varphi) \cdot D_{Z} @f$. The cone has a half-angle @f$| \varphi | @f$ and is defined by the following parametric equation: + +@f[ S(u,v)=P+(r+v \cdot sin(\varphi)) \cdot (cos(u) \cdot D_{X}+sin(u) \cdot D_{Y})+v \cdot cos(\varphi) \cdot D_{Z}, (u,v) \in [0,\; 2 \cdot \pi) \times (-\infty,\; \infty) . @f] + +The example record is interpreted as a cone with an axis which passes through a point *P*=(1, 2, 3) and has a direction *DZ*=(0, 0, 1). Other cone data are *DX*=(1, 0, 0), *DY*=(0, 1, 0), *r*=4 and @f$ \varphi = 0.75 @f$. The cone is defined by the following parametric equation: +@f[ S(u,v)=(1,2,3)+( 4 + v \cdot sin(0.75)) \cdot ( cos(u) \cdot (1,0,0) + sin(u) \cdot (0,1,0) ) + v \cdot cos(0.75) \cdot (0,0,1) . @f] + + +@subsubsection specification__brep_format_5_2_4 Sphere - \< surface record 4 \> + +**Example** + +@verbatim + 4 1 2 3 0 0 1 1 0 -0 -0 1 0 4 +@endverbatim + +**BNF-like Definition** + +@verbatim + = "4" <_> <3D point> (<_> <3D direction>) ^ 3 <_> <_\n>; +@endverbatim + +**Description** + +\ describes a sphere. The sphere data consist of a 3D point *P*, pairwise orthogonal 3D directions *DZ*, *DX* and *DY* and a non-negative real *r*. The sphere has the center *P*, radius *r* and is defined by the following parametric equation: + +@f[ S(u,v)=P+r \cdot cos(v) \cdot (cos(u) \cdot D_{x}+sin(u) \cdot D_{y} ) +r \cdot sin(v) \cdot D_{Z},\; (u,v) \in [0,\;2 \cdot \pi) \times [-\pi /2,\; \pi /2] . @f] + +The example record is interpreted as a sphere with its center *P*=(1, 2, 3). Directions for the sphere are *DZ*=(0, 0, 1), *DX*=(1, 0, 0) and *DY*=(0, 1, 0). The sphere has a radius *r*=4 and is defined by the following parametric equation: +@f[ S(u,v)=(1,2,3)+ 4 \cdot cos(v) \cdot ( cos(u) \cdot (1,0,0) + sin(u) \cdot (0,1,0) ) + 4 \cdot sin(v) \cdot (0,0,1) . @f] + + +@subsubsection specification__brep_format_5_2_5 Torus - \< surface record 5 \> + +**Example** + +@verbatim + 5 1 2 3 0 0 1 1 0 -0 -0 1 0 8 4 +@endverbatim + +**BNF-like Definition** + +@verbatim + = "5" <_> <3D point> (<_> <3D direction>) ^ 3 (<_> ) ^ 2 <_\n>; +@endverbatim + +**Description** + +\ describes a torus. The torus data consist of a 3D point *P*, pairwise orthogonal 3D directions *DZ*, *DX* and *DY* and non-negative reals *r1* and *r2*. The torus axis passes through the point *P* and has the direction *DZ*. *r1* is the distance from the torus circle center to the axis. The torus circle has the radius *r2*. The torus is defined by the following parametric equation: + +@f[ S(u,v)=P+(r_{1}+r_{2} \cdot cos(v)) \cdot (cos(u) \cdot D_{x}+sin(u) \cdot D_{y} ) +r_{2} \cdot sin(v) \cdot D_{Z},\; (u,v) \in [0,\;2 \cdot \pi) \times [0,\; 2 \cdot \pi) . @f] + +The example record is interpreted as a torus with an axis which passes through a point *P*=(1, 2, 3) and has a direction *DZ*=(0, 0, 1). *DX*=(1, 0, 0), *DY*=(0, 1, 0), *r1*=8 and *r2*=4 for the torus. The torus is defined by the following parametric equation: +@f[ S(u,v)=(1,2,3)+ (8+4 \cdot cos(v)) \cdot ( cos(u) \cdot (1,0,0) + sin(u) \cdot (0,1,0) ) + 4 \cdot sin(v) \cdot (0,0,1) . @f] + + +@subsubsection specification__brep_format_5_2_6 Linear Extrusion - \< surface record 6 \> + +**Example** + +@verbatim + 6 0 0.6 0.8 + 2 1 2 3 0 0 1 1 0 -0 -0 1 0 4 +@endverbatim + +**BNF-like Definition** + +@verbatim + = "6" <_> <3D direction> <_\n> <3D curve record>; +@endverbatim + +**Description** + +\ describes a linear extrusion surface. The surface data consist of a 3D direction *Dv* and a \<3D curve record\>. The linear extrusion surface has the direction *Dv*, the base curve *C* described in the record and is defined by the following parametric equation: + +@f[ S(u,v)=C(u)+v \cdot D_{v},\; (u,v) \in domain(C) \times (-\infty,\; \infty) . @f] + +The example record is interpreted as a linear extrusion surface with a direction *Dv*=(0, 0.6, 0.8). The base curve is a circle for the surface. The surface is defined by the following parametric equation: + +@f[ S(u,v)=(1,2,3)+4 \cdot (cos(u) \cdot (1,0,0)+sin(u) \cdot (0,1,0))+v \cdot (0, 0.6, 0.8),\; (u,v) \in [0,\; 2 \cdot \pi) \times (-\infty,\; \infty). @f] + + +@subsubsection specification__brep_format_5_2_7 Revolution Surface - \< surface record 7 \> + +**Example** + +@verbatim + 7 -4 0 3 0 1 0 + 2 1 2 3 0 0 1 1 0 -0 -0 1 0 4 +@endverbatim + +**BNF-like Definition** + +@verbatim + = "7" <_> <3D point> <_> <3D direction> <_\n> <3D curve record>; +@endverbatim + +**Description** + +\ describes a revolution surface. The surface data consist of a 3D point *P*, a 3D direction *D* and a \<3D curve record\>. The surface axis passes through the point *P* and has the direction *D*. The base curve *C* described by the record and the axis are coplanar. The surface is defined by the following parametric equation: + +@f[ S(u,v)= P+V_{D}(v)+cos(u) \cdot (V(v)-V_{D}(v))+sin(u) \cdot [D,V(v)],\;(u,v) \in [0,\; 2 \cdot \pi)\times domain(C) @f] + +where @f$ V(v)=C(v)-P, V_{D}(v)=(D,V(v)) \cdot D @f$. + +The example record is interpreted as a revolution surface with an axis which passes through a point *P*=(-4, 0, 3) and has a direction *D*=(0, 1, 0). The base curve is a circle for the surface. The surface is defined by the following parametric equation: + +@f[ S(u,v)= (-4,0,3)+V_{D}(v)+cos(u) \cdot (V(v)-V_{D}(v))+sin(u) \cdot [(0,1,0),V(v)],\;(u,v) \in [0,\; 2 \cdot \pi)\times [0,\; 2 \cdot \pi) @f] + +where @f$ V(v)=(5,2,0)+4 \cdot (cos(v) \cdot (1,0,0)+sin(v) \cdot (0,1,0)), V_{D}(v)=((0,1,0),V(v)) \cdot (0,1,0) @f$. + + +@subsubsection specification__brep_format_5_2_8 Bezier Surface - \< surface record 8 \> + +**Example** + +@verbatim + 8 1 1 2 1 0 0 1  7 1 0 -4  10 + 0 1 -2  8 1 1 5  11 + 0 2 3  9 1 2 6  12 +@endverbatim + +**BNF-like Definition** + +~~~~ + = "8" <_> <_> <_> <_> <_> + ; + + = ; + + = ; + + = ; + + = ; + + = + ( <_\n>) ^ ( <+> "1"); + + = + (<_> ) ^ ; + + = <3D point> [<_> ]; +~~~~ + +**Description** + +\ describes a Bezier surface. The surface data consist of a u rational flag *ru*, v rational flag *rv*, u degree @f$ m_{u} \leq 25 @f$, v degree @f$ m_{v} \leq 25 @f$ and weight poles. + +The weight poles are @f$ (m_{u}+1) \cdot (m_{v}+1) @f$ 3D points @f$ B_{i,j}\; ((i,j) \in \left \{ 0,...,m_{u} \right \} \times \left \{ 0,...,m_{v} \right \}) @f$ if @f$ r_{u}+r_{v}=0 @f$. The weight poles are @f$ (m_{u}+1) \cdot (m_{v}+1) @f$ pairs @f$ B_{i,j}h_{i,j}\; ((i,j) \in \left \{ 0,...,m_{u} \right \} \times \left \{ 0,...,m_{v} \right \}) @f$ if @f$ r_{u}+r_{v} \neq 0 @f$. Here @f$ B_{i,j} @f$ is a 3D point and @f$ h_{i,j} @f$ is a positive real @f$ ((i,j) \in \left \{ 0,...,m_{u} \right \} \times \left \{ 0,...,m_{v} \right \}) @f$. @f$ h_{i,j}=1\; ((i,j) \in \left \{ 0,...,m_{u} \right \} \times \left \{ 0,...,m_{v} \right \}) @f$ if @f$ r_{u}+r_{v} = 0 @f$. + +The Bezier surface is defined by the following parametric equation: + +@f[ S(u,v)=\frac{\sum_{i=0}^{m_{u}} \sum_{j=0}^{m_{v}} B_{i,j} \cdot h_{i,j} \cdot C_{m_{u}}^{i} \cdot u^{i} \cdot (1-u)^{m_{u}-i} \cdot C_{m_{v}}^{j} \cdot v^{j} \cdot (1-v)^{m_{v}-j}}{\sum_{i=0}^{m_{u}} \sum_{j=0}^{m_{v}} h_{i,j} \cdot C_{m_{u}}^{i} \cdot u^{i} \cdot (1-u)^{m_{u}-i} \cdot C_{m_{v}}^{j} \cdot v^{j} \cdot (1-v)^{m_{v}-j}}, (u,v) \in [0,1] \times [0,1] @f] + +where @f$ 0^{0} \equiv 1 @f$. + +The example record is interpreted as a Bezier surface with a u rational flag *ru*=1, v rational flag *rv*=1, u degree *mu*=2, v degree *mv*=1, weight poles *B0,0*=(0, 0, 1), *h0,0*=7, *B0,1*=(1, 0, -4), *h0,1*=10, *B1,0*=(0, 1, -2), *h1,0*=8, *B1,1*=(1, 1, 5), *h1,1*=11, *B2,0*=(0, 2, 3), *h2,0*=9 and *B2,1*=(1, 2, 6), *h2,1*=12. The surface is defined by the following parametric equation: + +@f[ +\begin{align} +S(u,v)= [ (0,0,1) \cdot 7 \cdot (1-u)^{2} \cdot (1-v)+(1,0,-4) \cdot 10 \cdot (1-u)^{2} \cdot v+ (0,1,-2) \cdot 8 \cdot 2 \cdot u \cdot (1-u) \cdot (1-v) + \\ +(1,1,5) \cdot 11 \cdot 2 \cdot u \cdot (1-u) \cdot v+ (0,2,3) \cdot 9 \cdot u^{2} \cdot (1-v)+(1,2,6) \cdot 12 \cdot u^{2} \cdot v] \div [7 \cdot (1-u)^{2} \cdot (1-v)+ \\ +10 \cdot (1-u)^{2} \cdot v+ 8 \cdot 2 \cdot u \cdot (1-u) \cdot (1-v)+ 11 \cdot 2 \cdot u \cdot (1-u) \cdot v+ 9 \cdot u^{2} \cdot (1-v)+12 \cdot u^{2} \cdot v ] +\end{align} +@f] + + +@subsubsection specification__brep_format_5_2_9 B-spline Surface - \< surface record 9 \> + +**Example** + +@verbatim + 9 1 1 0 0 1 1 3 2 5 4 0 0 1  7 1 0 -4  10 + 0 1 -2  8 1 1 5  11 + 0 2 3  9 1 2 6  12 + + 0 1 + 0.25 1 + 0.5 1 + 0.75 1 + 1 1 + + 0 1 + 0.3 1 + 0.7 1 + 1 1 +@endverbatim + +**BNF-like Definition** + +@verbatim + = "9" <_> <_> + <_> "0" <_> "0" <_> <_> + <_> <_> + <_> <_> + <_> <_\n> + <_\n> ; + + = ; + + = ; + + = ; + + = ; + + = ; + + = ; + + = ; + + = ; + + = + ( <_\n>) ^ ; + + = + ( <_>) ^ ; + + = <3D point> [<_> ]; + + = + ( <_\n>) ^ ; + + = <_> ; + + = + ( <_\n>) ^ ; + + = <_> ; +@endverbatim + +**Description** + +\ describes a B-spline surface. The surface data consist of a u rational flag *ru*, v rational flag *rv*, u degree @f$ m_{u} \leq 25 @f$, v degree @f$ m_{v} \leq 25 @f$, u pole count @f$ n_{u} \geq 2 @f$, v pole count @f$ n_{v} \geq 2 @f$, u multiplicity knot count *ku*, v multiplicity knot count *kv*, weight poles, u multiplicity knots, v multiplicity knots. + +The weight poles are @f$ n_{u} \cdot n_{v} @f$ 3D points @f$ B_{i,j}\; ((i,j) \in \left \{ 1,...,n_{u} \right \} \times \left \{ 1,...,n_{v} \right \}) @f$ if @f$ r_{u}+r_{v}=0 @f$. The weight poles are @f$ n_{u} \cdot n_{v} @f$ pairs @f$ B_{i,j}h_{i,j}\; ((i,j) \in \left \{ 1,...,n_{u} \right \} \times \left \{ 1,...,n_{v} \right \}) @f$ if @f$ r_{u}+r_{v} \neq 0 @f$. Here @f$ B_{i,j} @f$ is a 3D point and @f$ h_{i,j} @f$ is a positive real @f$ ((i,j) \in \left \{ 1,...,n_{u} \right \} \times \left \{ 1,...,n_{v} \right \}) @f$. @f$ h_{i,j}=1\; ((i,j) \in \left \{ 1,...,n_{u} \right \} \times \left \{ 1,...,n_{v} \right \}) @f$ if @f$ r_{u}+r_{v} = 0 @f$. + +The u multiplicity knots are *ku* pairs @f$ u_{1}q_{1} ... u_{k_{u}}q_{k_{u}} @f$. Here @f$ u_{i} @f$ is a knot with multiplicity @f$ q_{i} \geq 1 \;(1\leq i\leq k_{u}) @f$ so that + +@f[ u_{i} < u_{i+1} \; (1\leq i\leq k_{u}-1), \\ +q_{1} \leq m_{u}+1,\; q_{k_{u}} \leq m_{u}+1,\; q_{i} \leq m_{u}\; (2\leq i\leq k_{u}-1),\; \sum_{i=1}^{k_{u}}q_{i}=m_{u}+n_{u}+1. @f] + +The v multiplicity knots are *kv* pairs @f$ v_{1}t_{1} ... v_{k_{v}}t_{k_{v}} @f$. Here @f$ v_{j} @f$ is a knot with multiplicity @f$ t_{i} \geq 1\;(1\leq i\leq k_{v}) @f$ so that + +@f[ v_{j} < v_{j+1} \; (1\leq j\leq k_{v}-1), \\ +t_{1} \leq m_{v}+1,\; t_{k_{v}} \leq m_{v}+1,\; t_{j} \leq m_{v}\; (2\leq j\leq k_{v}-1),\; \sum_{j=1}^{k_{v}}t_{j}=m_{v}+n_{v}+1. @f] + +The B-spline surface is defined by the following parametric equation: + +@f[ S(u,v)=\frac{\sum_{i=1}^{n_{u}} \sum_{j=1}^{n_{v}} B_{i,j} \cdot h_{i,j} \cdot N_{i,m_{u}+1}(u) \cdot M_{j,m_{v}+1}(v)}{\sum_{i=1}^{n_{u}} \sum_{j=1}^{n_{v}} h_{i,j} \cdot N_{i,m_{u}+1}(u) \cdot M_{j,m_{v}+1}(v)}, (u,v) \in [u_{1},u_{k_{u}}] \times [v_{1},v_{k_{v}}] @f] + +where functions *Ni,j* and *Mi,j* have the following recursion definition by *j*: + +@f[ +\begin{align} +N_{i,1}(u)= \left\{\begin{matrix} +1\Leftarrow \bar{u}_{i} \leq u \leq \bar{u}_{i+1} +0\Leftarrow u < \bar{u}_{i} \vee \bar{u}_{i+1} \leq u \end{matrix} \right.,\; \\ +N_{i,j}(u)=\frac{(u-\bar{u}_{i}) \cdot N_{i,j-1}(u) }{\bar{u}_{i+j-1}-\bar{u}_{i}}+ +\frac{(\bar{u}_{i+j}-u) \cdot N_{i+1,j-1}(u)}{\bar{u}_{i+j}-\bar{u}_{i+1}},\;(2 \leq j \leq m_{u}+1), \; \\ +M_{i,1}(v)=\left\{\begin{matrix} +1\Leftarrow \bar{v}_{i} \leq v \leq \bar{v}_{i+1}\\ +0\Leftarrow v < \bar{v}_{i} \vee \bar{v}_{i+1} \leq v \end{matrix} \right.,\; \\ +M_{i,j}(v)=\frac{(v-\bar{v}_{i}) \cdot M_{i,j-1}(v) }{\bar{v}_{i+j-1}-\bar{v}_{i}}+ \frac{(\bar{v}_{i+j}-v) \cdot M_{i+1,j-1}(v)}{\bar{v}_{i+j}-\bar{v}_{i+1}},\;(2 \leq j \leq m_{v}+1); +\end{align} +@f] + +where +@f[ \bar{u}_{i}=u_{j}\; (1 \leq j \leq k_{u},\; \sum_{l=1}^{j-1}q_{l} \leq i \leq \sum_{l=1}^{j}q_{l}), \\ + \bar{v}_{i}=v_{j}\; (1 \leq j \leq k_{v},\; \sum_{l=1}^{j-1}t_{l} \leq i \leq \sum_{l=1}^{j}t_{l}); @f] + +The example record is interpreted as a B-spline surface with a u rational flag *ru*=1, v rational flag *rv*=1, u degree *mu*=1, v degree *mv*=1, u pole count *nu*=3, v pole count *nv*=2, u multiplicity knot count *ku*=5, v multiplicity knot count *kv*=4, weight poles *B1,1*=(0, 0, 1), *h1,1*=7, *B1,2*=(1, 0, -4), *h1,2*=10, *B2,1*=(0, 1, -2), *h2,1*=8, *B2,2*=(1, 1, 5), *h2,2*=11, *B3,1*=(0, 2, 3), *h3,1*=9 and *B3,2*=(1, 2, 6), *h3,2*=12, u multiplicity knots *u1*=0, *q1*=1, *u2*=0.25, *q2*=1, *u3*=0.5, *q3*=1, *u4*=0.75, *q4*=1 and *u5*=1, *q5*=1, v multiplicity knots *v1*=0, *r1*=1, *v2*=0.3, *r2*=1, *v3*=0.7, *r3*=1 and *v4*=1, *r4*=1. The B-spline surface is defined by the following parametric equation: + +@f[ +\begin{align} +S(u,v)= [ (0,0,1) \cdot 7 \cdot N_{1,2}(u) \cdot M_{1,2}(v)+(1,0,-4) \cdot 10 \cdot N_{1,2}(u) \cdot M_{2,2}(v)+ \\ +(0,1,-2) \cdot 8 \cdot N_{2,2}(u) \cdot M_{1,2}(v)+(1,1,5) \cdot 11 \cdot N_{2,2}(u) \cdot M_{2,2}(v)+ \\ +(0,2,3) \cdot 9 \cdot N_{3,2}(u) \cdot M_{1,2}(v)+(1,2,6) \cdot 12 \cdot N_{3,2}(u) \cdot M_{2,2}(v)] \div \\ +[7 \cdot N_{1,2}(u) \cdot M_{1,2}(v)+10 \cdot N_{1,2}(u) \cdot M_{2,2}(v)+ 8 \cdot N_{2,2}(u) \cdot M_{1,2}(v)+ \\ +11 \cdot N_{2,2}(u) \cdot M_{2,2}(v)+ 9 \cdot N_{3,2}(u) \cdot M_{1,2}(v)+12 \cdot N_{3,2}(u) \cdot M_{2,2}(v) ] +\end{align} +@f] + +@subsubsection specification__brep_format_5_2_10 Rectangular Trim Surface - \< surface record 10 \> + +**Example** + +@verbatim + 10 -1 2 -3 4 + 1 1 2 3 0 0 1 1 0 -0 -0 1 0 +@endverbatim + +**BNF-like Definition** + +@verbatim + = "10" <_> <_> <_> + <_> <_\n> ; + + = ; + + = ; + + = ; + + = ; +@endverbatim + +**Description** + +\ describes a rectangular trim surface. The surface data consist of reals *umin*, *umax*, *vmin* and *vmax* and a \ so that *umin* < *umax* and *vmin* < *vmax*. The rectangular trim surface is a restriction of the base surface *B* described in the record to the set @f$ [u_{min},u_{max}] \times [v_{min},v_{max}] \subseteq domain(B) @f$. The rectangular trim surface is defined by the following parametric equation: + +@f[ S(u,v)=B(u,v),\; (u,v) \in [u_{min},u_{max}] \times [v_{min},v_{max}] . @f] + +The example record is interpreted as a rectangular trim surface to the set [-1, 2]x[-3, 4] for the base surface @f$ B(u,v)=(1,2,3)+u \cdot (1,0,0)+v \cdot (0,1,0) @f$. The rectangular trim surface is defined by the following parametric equation: @f$ B(u,v)=(1,2,3)+u \cdot (1,0,0)+ v \cdot (0,1,0),\; (u,v) \in [-1,2] \times [-3,4] @f$. + + +@subsubsection specification__brep_format_5_2_11 Offset Surface - \< surface record 11 \> + +**Example** + +@verbatim + 11 -2 + 1 1 2 3 0 0 1 1 0 -0 -0 1 0 +@endverbatim + +**BNF-like Definition** + +@verbatim + = "11" <_> <_\n> ; + + = ; +@endverbatim + +**Description** + +\ describes an offset surface. +The offset surface data consist of a distance *d* and a \. The offset surface is the result of offsetting the base surface *B* described in the record to the distance *d* along the normal *N* of surface *B*. The offset surface is defined by the following parametric equation: + +@f[ S(u,v)=B(u,v)+d \cdot N(u,v),\; (u,v) \in domain(B) . \\ +N(u,v) = [S'_{u}(u,v),S'_{v}(u,v)] @f] +if @f$ [S'_{u}(u,v),S'_{v}(u,v)] \neq \vec{0} @f$. + +The example record is interpreted as an offset surface with a distance *d*=-2 and base surface @f$ B(u,v)=(1,2,3)+u \cdot (1,0,0)+v \cdot (0,1,0) @f$. The offset surface is defined by the following parametric equation: @f$ S(u,v)=(1,2,3)+u \cdot (1,0,0)+v \cdot (0,1,0)-2 \cdot (0,0,1) @f$. + + +@subsection specification__brep_format_5_3 2D curves + +**Example** + +@verbatim + Curve2ds 24 + 1 0 0 1 0 + 1 0 0 1 0 + 1 3 0 0 -1 + 1 0 0 0 1 + 1 0 -2 1 0 + 1 0 0 1 0 + 1 0 0 0 -1 + 1 0 0 0 1 + 1 0 0 1 0 + 1 0 1 1 0 + 1 3 0 0 -1 + 1 1 0 0 1 + 1 0 -2 1 0 + 1 0 1 1 0 + 1 0 0 0 -1 + 1 1 0 0 1 + 1 0 0 0 1 + 1 0 0 1 0 + 1 3 0 0 1 + 1 0 0 1 0 + 1 0 0 0 1 + 1 0 2 1 0 + 1 3 0 0 1 + 1 0 2 1 0 +@endverbatim + +**BNF-like Definition** + +@verbatim + <2D curves> = <2D curve header> <_\n> <2D curve records>; + + <2D curve header> = "Curve2ds" <_> <2D curve count>; + + <2D curve count> = ; + + <2D curve records> = <2D curve record> ^ <2D curve count>; + + <2D curve record> = + <2D curve record 1> | + <2D curve record 2> | + <2D curve record 3> | + <2D curve record 4> | + <2D curve record 5> | + <2D curve record 6> | + <2D curve record 7> | + <2D curve record 8> | + <2D curve record 9>; +@endverbatim + +@subsubsection specification__brep_format_5_3_1 Line - \<2D curve record 1\> + +**Example** + +@verbatim + 1 3 0 0 -1 +@endverbatim + +**BNF-like Definition** + +@verbatim + <2D curve record 1> = "1" <_> <2D point> <_> <2D direction> <_\n>; +@endverbatim + +**Description** + +\<2D curve record 1\> describes a line. The line data consist of a 2D point *P* and a 2D direction *D*. The line passes through the point *P*, has the direction *D* and is defined by the following parametric equation: + +@f[ C(u)=P+u \cdot D, \; u \in (-\infty,\; \infty). @f] + +The example record is interpreted as a line which passes through a point *P*=(3,0), has a direction *D*=(0,-1) and is defined by the following parametric equation: @f$ C(u)=(3,0)+ u \cdot (0,-1) @f$. + + +@subsubsection specification__brep_format_5_3_2 Circle - \<2D curve record 2\> + +**Example** + +@verbatim + 2 1 2 1 0 -0 1 3 +@endverbatim + +**BNF-like Definition** + +~~~~ + <2D curve record 2> = "2" <_> <2D circle center> <_> <2D circle Dx> <_> <2D circle Dy> <_> <2D circle radius> <_\n>; + + <2D circle center> = <2D point>; + + <2D circle Dx> = <2D direction>; + + <2D circle Dy> = <2D direction>; + + <2D circle radius> = ; +~~~~ + +**Description** + +\<2D curve record 2\> describes a circle. The circle data consist of a 2D point *P*, orthogonal 2D directions *Dx* and *Dy* and a non-negative real *r*. The circle has a center *P*. The circle plane is parallel to directions *Dx* and *Dy*. The circle has a radius *r* and is defined by the following parametric equation: + +@f[ C(u)=P+r \cdot (cos(u) \cdot D_{x} + sin(u) \cdot D_{y}),\; u \in [0,\; 2 \cdot \pi) . @f] + +The example record is interpreted as a circle which has a center *P*=(1,2). The circle plane is parallel to directions *Dx*=(1,0) and *Dy*=(0,1). The circle has a radius *r*=3 and is defined by the following parametric equation: @f$ C(u)=(1,2)+3 \cdot (cos(u) \cdot (1,0) + sin(u) \cdot (0,1)) @f$. + + +@subsubsection specification__brep_format_5_3_3 Ellipse - \<2D curve record 3\> + +**Example** + +@verbatim + 3 1 2 1 0 -0 1 4 3 +@endverbatim + +**BNF-like Definition** + +@verbatim + <2D curve record 3> = "3" <_> <2D ellipse center> <_> <2D ellipse Dmaj> <_> + <2D ellipse Dmin> <_> <2D ellipse Rmaj> <_> <2D ellipse Rmin> <_\n>; + + <2D ellipse center> = <2D point>; + + <2D ellipse Dmaj> = <2D direction>; + + <2D ellipse Dmin> = <2D direction>; + + <2D ellipse Rmaj> = ; + + <2D ellipse Rmin> = ; +@endverbatim + +**Description** + +\<2D curve record 3\> describes an ellipse. The ellipse data are 2D point *P*, orthogonal 2D directions *Dmaj* and *Dmin* and non-negative reals *rmaj* and *rmin* that *rmaj* @f$ \leq @f$ *rmin*. The ellipse has a center *P*, major and minor axis directions *Dmaj* and *Dmin*, major and minor radii *rmaj* and *rmin* and is defined by the following parametric equation: + +@f[ C(u)=P+r_{maj} \cdot cos(u) \cdot D_{maj}+r_{min} \cdot sin(u) \cdot D_{min},\; u \in [0,\; 2 \cdot \pi) . @f] + +The example record is interpreted as an ellipse which has a center *P*=(1,2), major and minor axis directions *Dmaj*=(1,0) and *Dmin*=(0,1), major and minor radii *rmaj*=4 and *rmin*=3 and is defined by the following parametric equation: @f$ C(u)=(1,2)+4 \cdot cos(u) \cdot (1,0)+3 \cdot sin(u) \cdot (0,1) @f$. + + +@subsubsection specification__brep_format_5_3_4 Parabola - \<2D curve record 4\> + +**Example** + +@verbatim + 4 1 2 1 0 -0 1 16 +@endverbatim + +**BNF-like Definition** + +@verbatim + <2D curve record 4> = "4" <_> <2D parabola origin> <_> <2D parabola Dx> <_> + <2D parabola Dy> <_> <2D parabola focal length> <_\n>; + + <2D parabola origin> = <2D point>; + + <2D parabola Dx> = <2D direction>; + + <2D parabola Dy> = <2D direction>; + + <2D parabola focal length> = ; +@endverbatim + +**Description** + +\<2D curve record 4\> describes a parabola. The parabola data consist of a 2D point *P*, orthogonal 2D directions *Dx* and *Dy* and a non-negative real *f*. The parabola coordinate system has its origin *P* and axis directions *Dx* and *Dy*. The parabola has a focus length *f* and is defined by the following parametric equation: + +@f[ C(u)=P+\frac{u^{2}}{4 \cdot f} \cdot D_{x}+u \cdot D_{y},\; u \in (-\infty,\; \infty) \Leftarrow f \neq 0;\\ +C(u)=P+u \cdot D_{x},\; u \in (-\infty,\; \infty) \Leftarrow f = 0\; (degenerated\;case). @f] + +The example record is interpreted as a parabola in plane which passes through a point *P*=(1,2) and is parallel to directions *Dx*=(1,0) and *Dy*=(0,1). The parabola has a focus length *f*=16 and is defined by the following parametric equation: @f$ C(u)=(1,2)+ \frac{u^{2}}{64} \cdot (1,0)+u \cdot (0,1) @f$. + + +@subsubsection specification__brep_format_5_3_5 Hyperbola - \<2D curve record 5\> +**Example** + +5 1 2 1 0 -0 1 3 4 + + +**BNF-like Definition** + +@verbatim + <2D curve record 5> = "5" <_> <2D hyperbola origin> <_> <2D hyperbola Dx> <_> + <2D hyperbola Dy> <_> <2D hyperbola Kx> <_> <2D hyperbola Ky> <_\n>; + + <2D hyperbola origin> = <2D point>; + + <2D hyperbola Dx> = <2D direction>; + + <2D hyperbola Dy> = <2D direction>; + + <2D hyperbola Kx> = ; + + <2D hyperbola Ky> = ; +@endverbatim + +**Description** + +\<2D curve record 5\> describes a hyperbola. The hyperbola data consist of a 2D point *P*, orthogonal 2D directions *Dx* and *Dy* and non-negative reals *kx* and *ky*. The hyperbola coordinate system has origin *P* and axis directions *Dx* and *Dy*. The hyperbola is defined by the following parametric equation: + +@f[ C(u)=P+k_{x} \cdot cosh(u) D_{x}+k_{y} \cdot sinh(u) \cdot D_{y},\; u \in (-\infty,\; \infty). @f] + +The example record is interpreted as a hyperbola with coordinate system which has origin *P*=(1,2) and axis directions *Dx*=(1,0) and *Dy*=(0,1). Other data for the hyperbola are *kx*=5 and *ky*=4. The hyperbola is defined by the following parametric equation: @f$ C(u)=(1,2)+3 \cdot cosh(u) \cdot (1,0)+4 \cdot sinh(u) \cdot (0,1) @f$. + + +@subsubsection specification__brep_format_5_3_6 Bezier Curve - \<2D curve record 6\> + +**Example** + +@verbatim +6 1 2 0 1  4 1 -2  5 2 3  6 +@endverbatim + +**BNF-like Definition** + +@verbatim + <2D curve record 6> = "6" <_> <2D Bezier rational flag> <_> <2D Bezier degree> + <2D Bezier weight poles> <_\n>; + + <2D Bezier rational flag> = ; + + <2D Bezier degree> = ; + + <2D Bezier weight poles> = (<_> <2D Bezier weight pole>) ^ (<2D Bezier degree> <+> “1â€); + + <2D Bezier weight pole> = <2D point> [<_> ]; +@endverbatim + +**Description** + +\<2D curve record 6\> describes a Bezier curve. The curve data consist of a rational flag *r*, a degree @f$ m \leq 25 @f$ and weight poles. + +The weight poles are *m*+1 2D points *B0 ... Bm* if the flag *r* is 0. The weight poles are *m*+1 pairs *B0h0 ... Bmhm* if the flag *r* is 1. Here *Bi* is a 2D point and *hi* is a positive real @f$ (0\leq i\leq m) @f$. *hi*=1 @f$(0\leq i\leq m) @f$ if the flag *r* is 0. + +The Bezier curve is defined by the following parametric equation: + +@f[ C(u)= \frac{\sum_{i=0}^{m} B_{i} \cdot h_{i} \cdot C_{m}^{i} \cdot u^{i} \cdot (1-u)^{m-i}}{\sum_{i=0}^{m} h_{i} \cdot C_{m}^{i} \cdot u^{i} \cdot (1-u)^{m-i}},\; u \in [0,1] @f] + +where @f$ 0^{0} \equiv 1 @f$. + +The example record is interpreted as a Bezier curve with a rational flag *r*=1, a degree *m*=2 and weight poles *B0*=(0,1), *h0*=4, *B1*=(1,-2), *h1*=5 and *B2*=(2,3), *h2*=6. The Bezier curve is defined by the following parametric equation: + +@f[ C(u)= \frac{(0,1) \cdot 4 \cdot (1-u)^{2}+(1,-2) \cdot 5 \cdot 2 \cdot u \cdot (1-u)+(2,3) \cdot 6 \cdot u^{2}}{ 4 \cdot (1-u)^{2}+5 \cdot 2 \cdot u \cdot (1-u)+6 \cdot u^{2}} . @f] + + +@subsubsection specification__brep_format_5_3_7 B-spline Curve - \<2D curve record 7\> + +**Example** + +@verbatim +7 1 0  1 3 5  0 1  4 1 -2  5 2 3  6 + 0 1 0.25 1 0.5 1 0.75 1 1 1 +@endverbatim + +**BNF-like Definition** + +~~~~ + <2D curve record 7> = "7" <_> <2D B-spline rational flag> <_> "0" <_> <2D B-spline degree> <_> <2D B-spline pole count> <_> <2D B-spline multiplicity knot count> <2D B-spline weight poles> <_\n> <2D B-spline multiplicity knots> <_\n>; + + <2D B-spline rational flag> = ; + + <2D B-spline degree> = ; + + <2D B-spline pole count> = ; + + <2D B-spline multiplicity knot count> = ; + + <2D B-spline weight poles> = <2D B-spline weight pole> ^ <2D B-spline pole count>; + + <2D B-spline weight pole> = <_> <2D point> [<_> ]; + + <2D B-spline multiplicity knots> = + <2D B-spline multiplicity knot> ^ <2D B-spline multiplicity knot count>; + + <2D B-spline multiplicity knot> = <_> <_> ; +~~~~ + +**Description** + +\<2D curve record 7\> describes a B-spline curve. The curve data consist of a rational flag *r*, a degree @f$ m \leq 25 @f$, a pole count @f$ n \geq 2 @f$, a multiplicity knot count *k*, weight poles and multiplicity knots. + +The weight poles are *n* 2D points *B1 ... Bn* if the flag *r* is 0. The weight poles are *n* pairs *B1h1 ... Bnhn* if the flag *r* is 1. Here *Bi* is a 2D point and *hi* is a positive real @f$ (1\leq i\leq n) @f$. *hi*=1 @f$(1\leq i\leq n) @f$ if the flag *r* is 0. + +The multiplicity knots are *k* pairs *u1q1 ... ukqk*. Here *ui* is a knot with multiplicity @f$ q_{i} \geq 1\; (1 \leq i \leq k) @f$ so that + +@f[ u_{i} < u_{i+1}\; (1 \leq i \leq k-1), \\ +q_{1} \leq m+1,\; q_{k} \leq m+1,\; q_{i} \leq m\; (2 \leq i \leq k-1),\; \sum_{i=1}^{k}q_{i}=m+n+1 . @f] + +The B-spline curve is defined by the following parametric equation: + +@f[ C(u)= \frac{\sum_{i=1}^{n} B_{i} \cdot h_{i} \cdot N_{i,m+1}(u) }{\sum_{i=1}^{n} h_{i} \cdot N_{i,m+1}(u)},\; u \in [u_{1},\; u_{k}] @f] + +where functions *Ni,j* have the following recursion definition by *j* + +@f[ N_{i,1}(u)=\left\{\begin{matrix} +1\Leftarrow \bar{u}_{i} \leq u \leq \bar{u}_{i+1}\\ +0\Leftarrow u < \bar{u}_{i} \vee \bar{u}_{i+1} \leq u \end{matrix} \right.,\; +N_{i,j}(u)=\frac{(u-\bar{u}_{i}) \cdot N_{i,j-1}(u) }{\bar{u}_{i+j-1}-\bar{u}_{i}}+ \frac{(\bar{u}_{i+j}-u) \cdot N_{i+1,j-1}(u)}{\bar{u}_{i+j}-\bar{u}_{i+1}},\;(2 \leq j \leq m+1) @f] + +where + +@f[ \bar{u}_{i}=u_{j}\; (1\leq j\leq k,\; \sum_{l=1}^{j-1}q_{l}+1 \leq i \leq \sum_{l=1}^{j}q_{l}) . @f] + +The example record is interpreted as a B-spline curve with a rational flag *r*=1, a degree *m*=1, a pole count *n*=3, a multiplicity knot count *k*=5, weight poles *B1*=(0,1), *h1*=4, *B2*=(1,-2), *h2*=5 and *B3*=(2,3), *h3*=6 and multiplicity knots *u1*=0, *q1*=1, *u2*=0.25, *q2*=1, *u3*=0.5, *q3*=1, *u4*=0.75, *q4*=1 and *u5*=1, *q5*=1. The B-spline curve is defined by the following parametric equation: + +@f[ C(u)= \frac{(0,1) \cdot 4 \cdot N_{1,2}(u)+(1,-2) \cdot 5 \cdot N_{2,2}(u)+(2,3) \cdot 6 \cdot N_{3,2}(u)}{ 4 \cdot N_{1,2}(u)+5 \cdot N_{2,2}(u)+6 \cdot N_{3,2}(u)} . @f] + + +@subsubsection specification__brep_format_5_3_8 Trimmed Curve - \<2D curve record 8\> + +**Example** + +@verbatim + 8 -4 5 + 1 1 2 1 0 +@endverbatim + +**BNF-like Definition** + +@verbatim + <2D curve record 8> = "8" <_> <2D trimmed curve u min> <_> <2D trimmed curve u max> <_\n> + <2D curve record>; + + <2D trimmed curve u min> = ; + + <2D trimmed curve u max> = ; +@endverbatim + +**Description** + +\<2D curve record 8\> describes a trimmed curve. The trimmed curve data consist of reals *umin* and *umax* and a \<2D curve record\> so that *umin* < *umax*. The trimmed curve is a restriction of the base curve *B* described in the record to the segment @f$ [u_{min},\;u_{max}]\subseteq domain(B) @f$. The trimmed curve is defined by the following parametric equation: + +@f[ C(u)=B(u),\; u \in [u_{min},\;u_{max}] . @f] + +The example record is interpreted as a trimmed curve with *umin*=-4, *umax*=5 and base curve @f$ B(u)=(1,2)+u \cdot (1,0) @f$. The trimmed curve is defined by the following parametric equation: @f$ C(u)=(1,2)+u \cdot (1,0),\; u \in [-4,5] @f$. + + +@subsubsection specification__brep_format_5_3_9 Offset Curve - \<2D curve record 9\> + +**Example** + +@verbatim + 9 2 + 1 1 2 1 0 +@endverbatim + +**BNF-like Definition** + +@verbatim +<2D curve record 9> = "9" <_> <2D offset curve distance> <_\n> <2D curve record>; + +<2D offset curve distance> = ; +@endverbatim + +**Description** + +\<2D curve record 9\> describes an offset curve. The offset curve data consist of a distance *d* and a \<2D curve record\>. The offset curve is the result of offsetting the base curve *B* described in the record to the distance *d* along the vector @f$ (B'_{Y}(u),\; -B'_{X}(u)) \neq \vec{0} @f$ where @f$ B(u)=(B'_{X}(u),\; B'_{Y}(u)) @f$. The offset curve is defined by the following parametric equation: + +@f[ C(u)=B(u)+d \cdot (B'_{Y}(u),\; -B'_{X}(u)),\; u \in domain(B) . @f] + +The example record is interpreted as an offset curve with a distance *d*=2 and base curve @f$ B(u)=(1,2)+u \cdot (1,0) @f$ and is defined by the following parametric equation: @f$ C(u)=(1,2)+u \cdot (1,0)+2 \cdot (0,-1) @f$. + +@subsection specification__brep_format_5_4 3D polygons + +**Example** + +@verbatim + Polygon3D 1 + 2 1 + 0.1 + 1 0 0 2 0 0 + 0 1 +@endverbatim + +**BNF-like Definition** + +@verbatim + <3D polygons> = <3D polygon header> <_\n> <3D polygon records>; + + <3D polygon header> = "Polygon3D" <_> <3D polygon record count>; + + <3D polygon records> = <3D polygon record> ^ <3D polygon record count>; + + <3D polygon record> = + <3D polygon node count> <_> <3D polygon flag of parameter presence> <_\n> + <3D polygon deflection> <_\n> + <3D polygon nodes> <_\n> + [<3D polygon parameters> <_\n>]; + + <3D polygon node count> = ; + + <3D polygon flag of parameter presence> = ; + + <3D polygon deflection> = ; + + <3D polygon nodes> = (<3D polygon node> <_>) ^ <3D polygon node count>; + + <3D polygon node> = <3D point>; + + <3D polygon u parameters> = (<3D polygon u parameter> <_>) ^ <3D polygon node count>; + + <3D polygon u parameter> = ; +@endverbatim + +**Description** + +\<3D polygons\> record describes a 3D polyline *L* which approximates a 3D curve *C*. The polyline data consist of a node count @f$ m \geq 2 @f$, a parameter presence flag *p*, a deflection @f$ d \geq 0 @f$, nodes @f$ N_{i}\; (1\leq i \leq m) @f$ and parameters @f$ u_{i}\; (1\leq i \leq m) @f$. The parameters are present only if *p*=1. The polyline *L* passes through the nodes. The deflection *d* describes the deflection of polyline *L* from the curve *C*: + +@f[ \underset{P \in C}{max}\; \underset{Q \in L}{min}|Q-P| \leq d . @f] + +The parameter @f$ u_{i}\; (1\leq i \leq m) @f$ is the parameter of the node *Ni* on the curve *C*: + +@f[ C(u_{i})=N_{i} . @f] + +The example record describes a polyline from *m*=2 nodes with a parameter presence flag *p*=1, a deflection *d*=0.1, nodes *N1*=(1,0,0) and *N2*=(2,0,0) and parameters *u1*=0 and *u2*=1. + + +@subsection specification__brep_format_6_4 Triangulations + +**Example** + +@verbatim + Triangulations 6 + 4 2 1 0 + 0 0 0 0 0 3 0 2 3 0 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 + 4 2 1 0 + 0 0 0 1 0 0 1 0 3 0 0 3 0 0 0 1 3 1 3 0 3 2 1 3 1 4 + 4 2 1 0 + 0 0 3 0 2 3 1 2 3 1 0 3 0 0 0 2 1 2 1 0 3 2 1 3 1 4 + 4 2 1 0 + 0 2 0 1 2 0 1 2 3 0 2 3 0 0 0 1 3 1 3 0 3 2 1 3 1 4 + 4 2 1 0 + 0 0 0 0 2 0 1 2 0 1 0 0 0 0 0 2 1 2 1 0 3 2 1 3 1 4 + 4 2 1 0 + 1 0 0 1 0 3 1 2 3 1 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 +@endverbatim + +**BNF-like Definition** + +~~~~ + = <_\n> ; + + = "Triangulations" <_> ; + + = ^ ; + + = <_> <_> <_> <_\n> + [<_> ] <_> <_\n>; + + = ; + + = ; + + = ; + + = ; + + = ( <_>) ^ ; + + = <3D point>; + + = + ( <_>) ^ ; + + = <_> ; + + = ( <_>) ^ ; + + = <_> <_> . +~~~~ + +**Description** + +\ describes a triangulation *T* which approximates a surface *S*. The triangulation data consist of a node count @f$ m \geq 3 @f$, a triangle count @f$ k \geq 1 @f$, a parameter presence flag *p*, a deflection @f$ d \geq 0 @f$, nodes @f$ N_{i}\; (1\leq i \leq m) @f$, parameter pairs @f$ u_{i}\; v_{i}\; (1\leq i \leq m) @f$, triangles @f$ n_{j,1}\; n_{j,2}\; n_{j,3}\; (1\leq j \leq k,\; n_{j,l} \in \left \{1,...,m \right \}\; (1\leq l\leq 3)) @f$. The parameters are present only if *p*=1. The deflection describes the triangulation deflection from the surface: + +@f[ \underset{P \in S}{max}\; \underset{Q \in T}{min}|Q-P| \leq d . @f] + +The parameter pair @f$ u_{i}\; v_{i}\; (1\leq i \leq m) @f$ describes the parameters of node *Ni* on the surface: + +@f[ S(u_{i},v_{i})=N_{i} . @f] + +The triangle @f$ n_{j,1}\; n_{j,2}\; n_{j,3}\; (1\leq j \leq k) @f$ is interpreted as a triangle of nodes @f$ N_{n_{j},1}\; N_{n_{j},2}@f$ and @f$ N_{n_{j},3} @f$ with circular traversal of the nodes in the order @f$ N_{n_{j},1}\; N_{n_{j},2}@f$ and @f$ N_{n_{j},3} @f$. From any side of the triangulation *T* all its triangles have the same direction of the node circular traversal: either clockwise or counterclockwise. + +Triangulation record + +@verbatim + 4 2 1 0 + 0 0 0 0 0 3 0 2 3 0 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 +@endverbatim + +describes a triangulation with *m*=4 nodes, *k*=2 triangles, parameter presence flag *p*=1, deflection *d*=0, nodes *N1*=(0,0,0), *N2*=(0,0,3), *N3*=(0,2,3) and *N4*=(0,2,0), parameters (*u1*, *v1*)=(0,0), (*u2*, *v2*)=(3,0), (*u3*, *v3*)=(3,-2) and (*u4*, *v4*)=(0,-2), and triangles (*n1,1*, *n1,2*, *n1,3*)=(2,4,3) and (*n2,1*, *n2,2*, *n2,3*)=(2,1,4). From the point (1,0,0) ((-1,0,0)) the triangles have clockwise (counterclockwise) direction of the node circular traversal. + + +@subsection specification__brep_format_6_5 Polygons on triangulations + +**Example** + +@verbatim + PolygonOnTriangulations 24 + 2 1 2 + p 0.1 1 0 3 + 2 1 4 + p 0.1 1 0 3 + 2 2 3 + p 0.1 1 0 2 + 2 1 2 + p 0.1 1 0 2 + 2 4 3 + p 0.1 1 0 3 + 2 1 4 + p 0.1 1 0 3 + 2 1 4 + p 0.1 1 0 2 + 2 1 2 + p 0.1 1 0 2 + 2 1 2 + p 0.1 1 0 3 + 2 2 3 + p 0.1 1 0 3 + 2 2 3 + p 0.1 1 0 2 + 2 4 3 + p 0.1 1 0 2 + 2 4 3 + p 0.1 1 0 3 + 2 2 3 + p 0.1 1 0 3 + 2 1 4 + p 0.1 1 0 2 + 2 4 3 + p 0.1 1 0 2 + 2 1 2 + p 0.1 1 0 1 + 2 1 4 + p 0.1 1 0 1 + 2 4 3 + p 0.1 1 0 1 + 2 1 4 + p 0.1 1 0 1 + 2 1 2 + p 0.1 1 0 1 + 2 2 3 + p 0.1 1 0 1 + 2 4 3 + p 0.1 1 0 1 + 2 2 3 + p 0.1 1 0 1 +@endverbatim + +**BNF-like Definition** + +@verbatim + = <_\n> + ; + + = + "PolygonOnTriangulations" <_> ; + + = ; + + = + ^ ; + + = + <_> <_\n> + "p" <_> <_> + + [<_> ] <_\n>; + + = ; + + = + ^ ; + + = ; + + = ; + + = ; + + = + ( <_>) ^ ; + + = ; +@endverbatim + +**Description** + +\ describes a polyline *L* on a triangulation which approximates a curve *C*. The polyline data consist of a node count @f$ m \geq 2 @f$, node numbers @f$ n_{i} \geq 1 @f$, deflection @f$ d \geq 0 @f$, a parameter presence flag *p* and parameters @f$ u_{i}\; (1\leq i\leq m) @f$. The parameters are present only if *p*=1. The deflection *d* describes the deflection of polyline *L* from the curve *C*: + +@f[ \underset{P \in C}{max}\; \underset{Q \in L}{min}|Q-P| \leq d . @f] + +Parameter @f$ u_{i}\; (1\leq i\leq m) @f$ is *ni*-th node *C(ui)* parameter on curve *C*. + + +@subsection specification__brep_format_6_6 Geometric Sense of a Curve + +Geometric sense of curve *C* described above is determined by the direction of parameter *u* increasing. + + +@section specification__brep_format_7 Shapes + +An example of section shapes and a whole *.brep file are given in chapter 7 @ref specification__brep_format_8 "Appendix". + + +**BNF-like Definition** + +@verbatim + = <_\n> <_\n> ; + + = "TShapes" <_> ; + + = ; + + = ^ ; + + = <_\n> <_\n> <_\n>; + + = ^ 7; + + = ( <_>)* "*"; + + = + <_> ; + + = "+" | "-" | "i" | "e"; + + = ; + + = ; + + = ; + + = + ("Ve" <_\n> <_\n>) | + ("Ed" <_\n> <_\n>) | + ("Wi" <_\n> <_\n>) | + ("Fa" <_\n> ) | + ("Sh" <_\n> <_\n>) | + ("So" <_\n> <_\n>) | + ("CS" <_\n> <_\n>) | + ("Co" <_\n> <_\n>); +@endverbatim + +**Description** + +\ @f$ f_{1}\; f_{2}\; f_{3}\; f_{4}\; f_{5}\; f_{6}\; f_{7} @f$ \s @f$ f_{i}\;(1\leq i \leq 7) @f$ are interpreted as shape flags in the following way: + + * @f$ f_{1} @f$ -- free; + * @f$ f_{2} @f$ -- modified; + * @f$ f_{3} @f$ -- IGNORED(version 1) \\ checked (version 2); + * @f$ f_{4} @f$ -- orientable; + * @f$ f_{5} @f$ -- closed; + * @f$ f_{6} @f$ -- infinite; + * @f$ f_{7} @f$ -- convex. + +The flags are used in a special way [1]. + +\ is interpreted in the following way: + + * + -- forward; + * - -- reversed; + * i -- internal; + * e -- external. + +\ is used in a special way [1]. + +\ is the number of a \ which is located in this section above the \. \ numbering is backward and starts from 1. + +\ types are interpreted in the following way: + + * "Ve" -- vertex; + * "Ed" -- edge; + * "Wi" -- wire; + * "Fa" -- face; + * "Sh" -- shell; + * "So" -- solid; + * "CS" -- compsolid; + * "Co" -- compound. + +\ determines the orientation and location for the whole model. + +@subsection specification__brep_format_7_1 Common Terms + +The terms below are used by \, \ and \. + + +**BNF-like Definition** + +@verbatim + = ; + + <3D curve number> = ; + + = ; + + <2D curve number> = ; + + <3D polygon number> = ; + + = ; + + = ; + + = <_> ; + + = + real> <_> <_> <_> ; +@endverbatim + +**Description** + +\ is the number of \ from section locations. \ numbering starts from 1. \ 0 is interpreted as the identity location. + +\<3D curve number\> is the number of a \<3D curve record\> from subsection \<3D curves\> of section \. \<3D curve record\> numbering starts from 1. + +\ is the number of a \ from subsection \ of section \. \ numbering starts from 1. + +\<2D curve number\> is the number of a \<2D curve record\> from subsection \<2D curves\> of section \. \<2D curve record\> numbering starts from 1. + +\<3D polygon number\> is the number of a \<3D polygon record\> from subsection \<3D polygons\> of section \. \<3D polygon record\> numbering starts from 1. + +\ is the number of a \ from subsection \ of section \. \ numbering starts from 1. + +\ number is the number of a \ from subsection \ of section \. +\ numbering starts from 1. + +\ *umin* and *umax* are the curve parameter *u* bounds: *umin* @f$ \leq @f$ *u* @f$ \leq @f$ *umax*. + +\ *umin* and *umax* are real pairs *xmin ymin* and *xmax ymax* that (*xmin*, *ymin*)= *C* (*umin*) and (*xmax*, *ymax*)= *C* (*umax*) where *C* is a parametric equation of the curve. + + +@subsection specification__brep_format_7_2 Vertex data + +**BNF-like Definition** + +@verbatim + = <_\n> <_\n> + ; + + = ; + + = <3D point>; + + = ( <_\n>)* "0 0"; + + = <_> + <_> ; + + = ; + + = + ("1" <_> ) | + ("2" <_> ) | + ("3" <_> ); + + = <3D curve number>; + + = <2D curve number> <_> ; + + = + <_> ; + + = ; +@endverbatim + +**Description** + +The usage of \ *U* is described below. + +\ and parameter *U* describe the position of the vertex *V* on a 3D curve *C*. Parameter *U* is a parameter of the vertex *V* on the curve *C*: *C(u)=V*. + +\ and parameter *U* describe the position of the vertex *V* on a 2D curve *C* which is located on a surface. Parameter *U* is a parameter of the vertex *V* on the curve *C*: *C(u)=V*. + +\ and parameter *u* describe the position of the vertex *V* on a surface *S* through \ *v*: *S(u,v)=V*. + +\ *t* describes the maximum distance from the vertex *V* to the set *R* of vertex *V* representations: + +@f[ \underset{P \in R }{max} |P-V| \leq t . @f] + + +@subsection specification__brep_format_7_3 Edge data + +**BNF-like Definition** + +~~~~ + = <_> <_> <_> edge data same range flag> <_> <_\n> ; + + = ; + + = ; + + = ; + + = ; + + = ( <_\n>)* "0"; + + = + "1" <_> + "2" <_> + "3" <_> + "4" <_> + "5" <_> + "6" <_> + "7" <_> ; + + = <3D curve number> <_> <_> + ; + + = <2D curve number> <_> <_> + <_> + [<_\n> ]; + + = (<2D curve number> <_>) ^ 2 <_> <_> <_> <\n> ]; + + = "C0" | "C1" | "C2" | "C3" | "CN" | "G1" | "G2". + + = + (<_> <_> ) ^ 2; + + = <3D polygon number> <_> ; + + = + <_> <_> ; + + = ( <_>) ^ 2 + <_> ; +~~~~ + +**Description** + +Flags \, \ and \ are used in a special way [1]. + +\ describes a 3D curve. + +\ describes a 2D curve on a surface. +\ are used only in version 2. + +\ describes a 2D curve on a closed surface. +\ are used only in version 2. + +\ describes a 3D polyline. + +\ describes a polyline on a triangulation. + +\ *t* describes the maximum distance from the edge *E* to the set *R* of edge *E* representations: + +@f[ \underset{C \in R}{max}\;\underset{P \in E}{max}\;\underset{Q \in C}{min}|Q-P| \leq t @f] + + +@subsection specification__brep_format_7_4 Face data + +**BNF-like Definition** + +~~~~ + = <_> <_> <_> <\n> ["2" <_> ]; + + = ; + + = ; +~~~~ + +**Description** + +\ describes a surface *S* of face *F* and a triangulation *T* of face *F*. The surface *S* may be empty: \ = 0. + +\ *t* describes the maximum distance from the face *F* to the surface *S*: + +@f[ \underset{P \in F}{max}\;\underset{Q \in S}{min}|Q-P| \leq t @f] + +Flag \ is used in a special way [1]. + + +@section specification__brep_format_8 Appendix + + This chapter contains a *.brep file example. + +@verbatim + DBRep_DrawableShape + + CASCADE Topology V1, (c) Matra-Datavision + Locations 3 + 1 +               0               0               1               0 +               1               0               0               0 +               0               1               0               0 + 1 +               1               0               0               4 +               0               1               0               5 +               0               0               1               6 + 2  1 1 2 1 0 + Curve2ds 24 + 1 0 0 1 0 + 1 0 0 1 0 + 1 3 0 0 -1 + 1 0 0 0 1 + 1 0 -2 1 0 + 1 0 0 1 0 + 1 0 0 0 -1 + 1 0 0 0 1 + 1 0 0 1 0 + 1 0 1 1 0 + 1 3 0 0 -1 + 1 1 0 0 1 + 1 0 -2 1 0 + 1 0 1 1 0 + 1 0 0 0 -1 + 1 1 0 0 1 + 1 0 0 0 1 + 1 0 0 1 0 + 1 3 0 0 1 + 1 0 0 1 0 + 1 0 0 0 1 + 1 0 2 1 0 + 1 3 0 0 1 + 1 0 2 1 0 + Curves 13 + 1 0 0 0 0 0 1 + 1 0 0 3 -0 1 0 + 1 0 2 0 0 0 1 + 1 0 0 0 -0 1 0 + 1 1 0 0 0 0 1 + 1 1 0 3 0 1 0 + 1 1 2 0 0 0 1 + 1 1 0 0 -0 1 0 + 1 0 0 0 1 0 -0 + 1 0 0 3 1 0 -0 + 1 0 2 0 1 0 -0 + 1 0 2 3 1 0 -0 + 1 1 0 0 1 0 0 + Polygon3D 1 + 2 1 + 0.1 + 1 0 0 2 0 0 + 0 1 + PolygonOnTriangulations 24 + 2 1 2 + p 0.1 1 0 3 + 2 1 4 + p 0.1 1 0 3 + 2 2 3 + p 0.1 1 0 2 + 2 1 2 + p 0.1 1 0 2 + 2 4 3 + p 0.1 1 0 3 + 2 1 4 + p 0.1 1 0 3 + 2 1 4 + p 0.1 1 0 2 + 2 1 2 + p 0.1 1 0 2 + 2 1 2 + p 0.1 1 0 3 + 2 2 3 + p 0.1 1 0 3 + 2 2 3 + p 0.1 1 0 2 + 2 4 3 + p 0.1 1 0 2 + 2 4 3 + p 0.1 1 0 3 + 2 2 3 + p 0.1 1 0 3 + 2 1 4 + p 0.1 1 0 2 + 2 4 3 + p 0.1 1 0 2 + 2 1 2 + p 0.1 1 0 1 + 2 1 4 + p 0.1 1 0 1 + 2 4 3 + p 0.1 1 0 1 + 2 1 4 + p 0.1 1 0 1 + 2 1 2 + p 0.1 1 0 1 + 2 2 3 + p 0.1 1 0 1 + 2 4 3 + p 0.1 1 0 1 + 2 2 3 + p 0.1 1 0 1 + Surfaces 6 + 1 0 0 0 1 0 -0 0 0 1 0 -1 0 + 1 0 0 0 -0 1 0 0 0 1 1 0 -0 + 1 0 0 3 0 0 1 1 0 -0 -0 1 0 + 1 0 2 0 -0 1 0 0 0 1 1 0 -0 + 1 0 0 0 0 0 1 1 0 -0 -0 1 0 + 1 1 0 0 1 0 -0 0 0 1 0 -1 0 + Triangulations 6 + 4 2 1 0 + 0 0 0 0 0 3 0 2 3 0 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 + 4 2 1 0 + 0 0 0 1 0 0 1 0 3 0 0 3 0 0 0 1 3 1 3 0 3 2 1 3 1 4 + 4 2 1 0 + 0 0 3 0 2 3 1 2 3 1 0 3 0 0 0 2 1 2 1 0 3 2 1 3 1 4 + 4 2 1 0 + 0 2 0 1 2 0 1 2 3 0 2 3 0 0 0 1 3 1 3 0 3 2 1 3 1 4 + 4 2 1 0 + 0 0 0 0 2 0 1 2 0 1 0 0 0 0 0 2 1 2 1 0 3 2 1 3 1 4 + 4 2 1 0 + 1 0 0 1 0 3 1 2 3 1 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 + + TShapes 39 + Ve + 1e-007 + 0 0 3 + 0 0 + + 0101101 + * + Ve + 1e-007 + 0 0 0 + 0 0 + + 0101101 + * + Ed +  1e-007 1 1 0 + 1  1 0 0 3 + 2  1 1 0 0 3 + 2  2 2 0 0 3 + 6  1 1 0 + 6  2 2 0 + 0 + + 0101000 + -39 0 +38 0 * + Ve + 1e-007 + 0 2 3 + 0 0 + + 0101101 + * + Ed +  1e-007 1 1 0 + 1  2 0 0 2 + 2  3 1 0 0 2 + 2  4 3 0 0 2 + 6  3 1 0 + 6  4 3 0 + 0 + + 0101000 + -36 0 +39 0 * + Ve + 1e-007 + 0 2 0 + 0 0 + + 0101101 + * + Ed +  1e-007 1 1 0 + 1  3 0 0 3 + 2  5 1 0 0 3 + 2  6 4 0 0 3 + 6  5 1 0 + 6  6 4 0 + 0 + + 0101000 + -36 0 +34 0 * + Ed +  1e-007 1 1 0 + 1  4 0 0 2 + 2  7 1 0 0 2 + 2  8 5 0 0 2 + 6  7 1 0 + 6  8 5 0 + 0 + + 0101000 + -34 0 +38 0 * + Wi + + 0101000 + -37 0 -35 0 +33 0 +32 0 * + Fa + 0  1e-007 1 0 + 2  1 + 0101000 + +31 0 * + Ve + 1e-007 + 1 0 3 + 0 0 + + 0101101 + * + Ve + 1e-007 + 1 0 0 + 0 0 + + 0101101 + * + Ed +  1e-007 1 1 0 + 1  5 0 0 3 + 2  9 6 0 0 3 + 2  10 2 0 0 3 + 6  9 6 0 + 6  10 2 0 + 0 + + 0101000 + -29 0 +28 0 * + Ve + 1e-007 + 1 2 3 + 0 0 + + 0101101 + * + Ed +  1e-007 1 1 0 + 1  6 0 0 2 + 2  11 6 0 0 2 + 2  12 3 0 0 2 + 6  11 6 0 + 6  12 3 0 + 0 + + 0101000 + -26 0 +29 0 * + Ve + 1e-007 + 1 2 0 + 0 0 + + 0101101 + * + Ed +  1e-007 1 1 0 + 1  7 0 0 3 + 2  13 6 0 0 3 + 2  14 4 0 0 3 + 6  13 6 0 + 6  14 4 0 + 0 + + 0101000 + -26 0 +24 0 * + Ed +  1e-007 1 1 0 + 1  8 0 0 2 + 2  15 6 0 0 2 + 2  16 5 0 0 2 + 6  15 6 0 + 6  16 5 0 + 0 + + 0101000 + -24 0 +28 0 * + Wi + + 0101000 + -27 0 -25 0 +23 0 +22 0 * + Fa + 0  1e-007 6 0 + 2  6 + 0101000 + +21 0 * + Ed +  1e-007 1 1 0 + 1  9 0 0 1 + 2  17 2 0 0 1 + 2  18 5 0 0 1 + 6  17 2 0 + 6  18 5 0 + 0 + + 0101000 + -28 0 +38 0 * + Ed +  1e-007 1 1 0 + 1  10 0 0 1 + 2  19 2 0 0 1 + 2  20 3 0 0 1 + 6  19 2 0 + 6  20 3 0 + 0 + + 0101000 + -29 0 +39 0 * + Wi + + 0101000 + -19 0 -27 0 +18 0 +37 0 * + Fa + 0  1e-007 2 0 + 2  2 + 0101000 + +17 0 * + Ed +  1e-007 1 1 0 + 1  11 0 0 1 + 2  21 4 0 0 1 + 2  22 5 0 0 1 + 6  21 4 0 + 6  22 5 0 + 0 + + 0101000 + -24 0 +34 0 * + Ed +  1e-007 1 1 0 + 1  12 0 0 1 + 2  23 4 0 0 1 + 2  24 3 0 0 1 + 6  23 4 0 + 6  24 3 0 + 0 + + 0101000 + -26 0 +36 0 * + Wi + + 0101000 + -15 0 -23 0 +14 0 +33 0 * + Fa + 0  1e-007 4 0 + 2  4 + 0101000 + +13 0 * + Wi + + 0101000 + -32 0 -15 0 +22 0 +19 0 * + Fa + 0  1e-007 5 0 + 2  5 + 0101000 + +11 0 * + Wi + + 0101000 + -35 0 -14 0 +25 0 +18 0 * + Fa + 0  1e-007 3 0 + 2  3 + 0101000 + +9 0 * + Sh + + 0101100 + -30 0 +20 0 -16 0 +12 0 -10 0 +8 0 * + So + + 0100000 + +7 0 * + CS + + 0101000 + +6 3 * + Ve + 1e-007 + 1 0 0 + 0 0 + + 0101101 + * + Ve + 1e-007 + 2 0 0 + 0 0 + + 0101101 + * + Ed +  1e-007 1 1 0 + 1  13 0 0 1 + 5  1 0 + 0 + + 0101000 + +4 0 -3 0 * + Co + + 1100000 + +5 0 +2 0 * + + +1 0 + 0 +@endverbatim diff -Nru opencascade-7.4.1+dfsg1/dox/specification/pbr_math.md opencascade-7.5.1+dfsg1/dox/specification/pbr_math.md --- opencascade-7.4.1+dfsg1/dox/specification/pbr_math.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/pbr_math.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,881 @@ +PBR math (rasterization) {#specification__pbr_math} +======================== +@tableofcontents + +@section pbr_preface Preface + +**Empirical** illumination models like **Phong reflection model** have been used in real-time graphics for a long time due to their simplicity, convincing look and affordable performance. +Before programmable pipeline has been introduced, graphics cards implemented Gouraud shading as part of fixed-function Transformation & Lighting (T&L) hardware blocks. +Nowadays, however, numerous trade-offs of this simplicity (like lighting partially baked into object material properties and others) pushed developers to **Physically-Based Rendering** (**PBR**) illumination models. + +PBR models try to fit surface shading formulas into constrains of physical laws of light propagation / absorption / reflection - hence, called "physically-based". +There are two main categories of PBR illumination: + + 1. Non-real-time renderer (cinematic). + 2. Real-time renderer. + +The main objective of cinematic renderer is uncompromised quality, so that it relies on ray-tracing (path-tracing) rendering pipeline. +Although performance of current graphics hardware does not make it possible using computationally-intensive path-tracing renderer in real-time graphics, it can be used in interactive fashion. + +"Physically-based" does not necessarily mean physically-correct/precise. +The main objective of real-time PBR renderer is to be fast enough even on low-end graphics hardware. +So that in contrast, it hardly relies on rasterization rendering pipeline, various approximations and tricks making it applicable in real-time, while looking good enough and preserving some physical properties. + +OCCT 3D Viewer provides both kinds of PBR renderers, and although they share some details in common, this article is devoted to real-time PBR metallic-roughness illumination model. +This article describes the math underneath PBR shading in OCCT 3D Viewer and its GLSL programs. +However, this article does not clarifies related high-level APIs nor PBR material creation pipelines, as this is another topic. + +@section pbr_notation Notation + +| | | | +|-:|:-|:-| +| \f$n\f$ | normal (on surface) | \f$\|n\|=1\f$ | +| \f$v\f$ | view direction | \f$\|v\|=1\f$ | +| \f$l\f$ | light | \f$\|l\| = 1\f$ | +| \f$h=\frac{v+l}{\|v + l\|}\f$ | half vector | | +| \f$m\f$ | metallic factor | \f$[0, 1]\f$ | +| \f$r\f$ | roughness factor | \f$[0, 1]\f$ | +| \f$IOR\f$ | index of refraction | \f$[1, 3]\f$ | +| \f$c\f$ | albedo color | \f$(R, G, B)\f$ | + +\f$\cos\theta_l=(n \cdot l)\f$ + +\f$\cos\theta_v=(n \cdot v)\f$ + +\f$\cos\theta_h=(n \cdot h)\f$ + +\f$\cos\theta_{vh}=(v \cdot h)\f$ + +@section pbr_illumination_model Illumination model + +The main goal of illumination model is to calculate outgoing light radiance \f$L_o\f$ along the certain direction. +The starting point of calculation might be the view direction \f$v\f$ aimed from point on surface (or in more general case just in space) to viewer position. +Considering the point on opaque surface with normal \f$n\f$ the main equation of illumination can be defined as: + +\f[L_o=\int\limits_H f(v, l) L_i(l) \cos\theta_l\, \mathrm{d}l\f] + +Where \f$L_i(l)\f$ is light radiance coming from \f$l\f$ direction, \f$f(v,l)\f$ is **Bidirectional Reflectance Distribution Function** (**BRDF**) and \f$H\f$ is hemisphere which is oriented regarding to the surface normal \f$n\f$. +Opaqueness of the surface mentioned earlier is important because in that case hemisphere is enough. +More general model will require to consider directions all around a whole sphere and is not observed in this paper. +\f$\cos\theta_l\f$ factor appearing is caused by affection of surface area and light direction mutual orientation to the amount of radiance coming to this area. +This is mainly due to geometric laws. The rest part of integral is the key of the whole illumination model. +BRDF defines it's complexity and optical properties of material. +It has to model all light and material interactions and also has to satisfy some following criteria in order to be physical correct [@ref Duvenhage13]: +* Positivity: \f$f(v,l) \geq 0\f$ +* Helmholtz reciprocity: \f$f(v,l) = f(l, v)\f$ (follows from 2nd Law of Thermodynamics) +* Energy conservation: \f$\displaystyle \forall v \, \int\limits_H f(v,l) \cos\theta_l \, \mathrm{d}l = 1\f$ (in order not to reflect more light than came) + +It is worth to be mentioned that \f$f(v,l)\f$ depends on \f$n\f$ also but it is omitted to simplify notation. BRDF is usually split into two parts: + +\f[f(v,l) = f_d(v,l)+f_s(v, l)\f] + +Where \f$f_s(v, l)\f$ (specular BRDF) models reflection light interaction on surface and \f$f_d(v,l)\f$ (diffuse BRDF) models other processes happening depth in material (subsurface scattering for example). +So that illumination equation might be rewritten as: + +\f[L_o=\int\limits_H (f_d(v,l)+f_s(v, l)) L_i(l) \cos\theta_l\, \mathrm{d}l\f] + +PBR theory is based on **Cook-Torrance specular BRDF** [@ref Cook81]. It imagines surface as set of perfectly reflected micro faces distributed on area in different ways which is pretty good model approximation of real world materials. +If this area is small enough not to be able to recognize separate micro surfaces the results becomes a sort of averaging or mixing of every micro plane illumination contribution. +In that level it allows to work with micro faces in statistical manner manipulating only probabilities distributions of micro surfaces parameters such as normals, height, pattern, orientation etc. +In computer graphics pixels are units of images and it usually covers a relatively large areas of surfaces so that micro planes can be considered to be unrecognizable. +Going back to the BRDF the Cook-Torrance approach has the following expression: + +\f[f_s(v,l)=\frac{DGF}{4\cos\theta_l\cos\theta_v}\f] + +Three parts presented in nominator have its own meaning but can have different implementation with various levels of complexity and physical accuracy. +In that paper only one certain implementation is used. The \f$D\f$ component is responsible for **micro faces normals distribution**. +It is the main instrument that controls reflection's shape and strength according to **roughness** \f$r\f$ parameter. +The implementation with good visual results is **Trowbridge-Reitz GGX** approach used in Disney's RenderMan and Unreal Engine [@ref Karis13]: + +\f[D=\frac{\alpha^2}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f] + +Where \f$\alpha = r^2\f$. This square in needed only for smoother roughness parameter control. +Without it the visual appearance of surface becomes rough too quickly during the parameter's increasing. + +The second \f$G\f$ component is called **geometric shadowing** or attenuation factor. +The point is that micro surfaces form kind of terrain and can cast shadows over each other especially on extreme viewing angles [@ref Heitz14]. +**Smith-Schlick model** [@ref Heitz14], [@ref Schlick94] has been chosen as implementation: + +\f[\displaystyle G=\frac{\cos\theta_l \cos\theta_v}{(\cos\theta_l(1-k)+k)(\cos\theta_v(1-k)+k)}\f] + +Where \f$k=\frac{\alpha}{2}\f$, which means \f$k=\frac{r^2}{2}\f$ in terms of this paper. +But \f$G\f$ depends on many factors so that it's approximations has float nature and can be modified a little bit in some cases in order to get more pleasant visual results. +One of this modification will be described later in following chapters. + +The last component \f$F\f$ shows **how much light is reflected from surface** and is called **Fresnel's factor**. +The rest amount of radiance might be absorbed or refracted by material. +The most accurate expression of it is pretty complicate for calculation so that there is a variety of approximations. +The good one with less computation efforts is **Schlick's implementation** [@ref Schlick94]: + +\f[F=F_0+(1-F_0)(1-\cos\theta_{vh})^5\f] + +Here \f$F_0\f$ is material's response coefficient at normal incidence (zero angle). +Fresnel's factor has to be calculated differently for metals and dielectric/non-metals, but PBR theory tries to come up with universal formula for all types of material. +In order to do that it is needed to be noticed that Schlick's approximation is applicable only to non-conductors and in that case \f$F_0 = F_{dielectric} = \left(\frac{1-IOR}{1+IOR}\right)^2\f$. +**Index of Refraction** \f$IOR\f$ shows the proportion between light speed in vacuum (or even in air) and in material. +The reference value of \f$IOR\f$ for plastic is **1.5**, and this value can be considered as default for all unknown dielectrics. +In practice this parameter controls reflectance ability of material. +Also it should be remembered that this approximation produces poor results with large \f$IOR\f$ values so that it is recommended to be kept in range of \f$[1, 3]\f$ in order to get plausible Fresnel's factor [@ref Lazanyi05], [@ref Lagarde13]. +This formula might be further propagated onto metals by using \f$F_0\f$ measured specifically for certain metal. +It can be considered as some kind of a 'color' of metal and can be stored as albedo parameter \f$c\f$. +And the final step of defining Fresnel's factor formula is mixing all this \f$F_0\f$ using metallic parameter \f$m\f$ (**metalness**): + +\f[F_0 = F_{dielectric}(1-m)+cm\f] + +For pure dielectrics with \f$m=0\f$ exactly Schlick's approximation will be used. +For pure metals with \f$m=1\f$ it will be a little inaccurate but the same formula with measured \f$F_0\f$ values. +Everything else for \f$m \in (0, 1)\f$ is not physically correct and it is recommended to keep \f$m\f$ exactly 1 or 0. +Intermediate values may represent mixed areas for smooth transition between materials - like partially rusted metal (rust is mostly dielectric). +Also it might be useful when parameters are read from textures with filtering and smoothing. + +BRDF described above has one important trait making computations easier called **isotropy**. +Isotropy in this case means independence from rotation about normal resulting from supposition of uniform micro faces distribution at any direction along a surface. +It allows to simplify random samples generation during Monte-Carlo integrals calculation and reduce dimensions of some lookup tables, which will be discussed in following chapters. +Of course, isotropic materials form only subset of all real world's materials, but this subset covers majority of cases. +There are special models considering special anisotropic traits of surfaces like a grinding of metal or other with dependency on rotation about normal; +these models require special calculation tricks and additional parameters and are out of scope of this paper. + +The only thing left to do is to define \f$f_d(v,l)\f$. +This part is responsible for processes happening in depth of material. +First of all the amount of input light radiance participating in these processes is needed to be calculated. +And it exactly can be realized from already known Fresnel's factor \f$F\f$ showing amount of reflected light but in negative term in this case in order to get the radiance left after reflection: + +\f[1-F\f] + +This part of ingoing light is assumed to be refracted in depth of surface and variety of events may happen there. +A sequence of absorptions, reflections and reemissions more or less leads to light's subsurface scattering. +Some part of this scattered light can go back outside but in modified form and in pretty unpredictable directions and positions. +For opaque materials this part is noticeable and forms it's own color. +If subsurface's paths of light are small enough and points of output are distributed locally around the input point it's possible to work in statistical way similar to the micro faces. +This assumption covers a big amount of real world opaque materials. +Other materials like skin, milk etc. with noticeable effect of subsurface scattering usually presented in form of partial translucency and some kind of self emission +have more widely distributed output points and require more accurate and complicate ways of modeling with maybe some theory and techniques from volumetric rendering. +The simple but visually enough assuming for statistically driven type of materials is just the same radiance for any direction. It results to **Lambertian's BRDF**: + +\f[\frac{c}{\pi}\f] + +Where \f$\pi\f$ is normalization coefficient in order to meet BRDF's criteria and \f$c\f$ is material's own color formed by adventures of light under surface. +There is one detail about light interaction bringing some physicality to the model, and that is an absence of this diffuse component in metals. +Metals reflect main part of light and the rest of it is absorbed being transformed into other form (mostly heat). +That is the main visual difference between metallic and non-metallic materials realizing of which brings model to higher level of quality in compare to older non-physical models. + +So that all parts described above can be combined into united diffuse BRDF: + +\f[f_d(v,l) = (1-F)(1-m)\frac{c}{\pi}\f] + +\f$m\f$ is recommended to be exactly 1 or 0 but all values between can represent transition areas, as mentioned before. + +In this chapter one possible implementation of illumination model reflecting main PBR principles has been defined. +The next step is using of it in practice. + +@section pbr_practical_application Practical application + +It's time to apply deduced illumination model in practice. +And the first step of it is separation of **direction based light sources** from illumination integral. +Directional nature of such light sources means possibility to calculate it's influence to point of surface using only one direction and its intensity. +Usually sources of this type do not have physical size and are represented only by position in space (for point or spot lights) or by direction itself (direction light imagined to be too far point sources like sun). +This is just a kind of abstraction, while real world light emitters have noticeably sizes. +But sources with realistic form and size cannot be presented in discrete term and require continuous integrals calculations or special approximations in order to be accurately injected to the model. +In most cases direct based light sources in form of emitting points in space or just certain directions are good approximations and are enough for beginning. +Having finite discrete amount of it in scene and considering only single direction from every of these lights, the integral is transformed just to the sum: + +\f[L_{direct} = \sum_{j=1}^M f(v, l_j) L_i^{direct}(l_j) \cos\theta_{l_j}\f] + +Where \f$M\f$ is a number of sources, \f$l_j\f$ is a direction and \f$L_i^{direct}\f$ is an intensity related to this direction. +\f$direct\f$ label means that illumination has been computed directly from sources. +The BRDF can be used directly without any calculation problems. +The only exception might be \f$k\f$ in \f$G\f$ factor - it is recommended to use \f$ k = (r+1)^2 / 8 \f$ in order to get more pleasant results [@ref Karis13] (that is modification mentioned in previous chapter). +And actually it is enough to finally see something. +There will be correct visualization with assumption of complete dark environment and absence of other points influence. +It is called **local illumination**. Based on this name there is also a global or **indirect illumination** and that is the rest of integral: + +\f[L_{indirect} = \int\limits_H f(v, l) L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f] + +It includes influence of light reflected or scattered from other points and environment's contribution. +It's impossible to achieve photorealistic results without this component, but is is also very difficult to compute. +While the cross point light interaction cannot be calculated in a simple way (especially in real time rendering), the environment illumination has some options to be realized via precomputational work before visualization. +But right now lets summarize the practical application of illumination model. +At this moment the output radiance is represented as: + +\f[L_o = L_{direct} + L_{indirect}\f] + +Where \f$L_{direct}\f$ is direction based light sources contribution which can be directly computed just applying bare formulas. +It is enough to get some results in terms of local illumination but without \f$L_{indirect}\f$ component image will not be looked lifelike. +\f$L_{indirect}\f$ is not trivial thing for calculation and that is stumbling block for real time rendering applications. +But it can be relatively easy implemented in case of environment illumination via some precomputational work about which will be told in details in following chapters. + +@section pbr_image_based_lighting Image based lighting + +The next goal after \f$L_{direct}\f$ calculation is to find \f$L_{indirect}\f$. +And it would be easier if \f$L_i^{indirect}(l)\f$ was known for every \f$l\f$. +That is the main assumption of **image based lightning** (**IBL**). +In practice, it can be achieved using environment image map, which is a special image representing illumination from all possible directions. +This image might be a photo capturing a real world environment (spherical 360 degrees panoramas) or generated image baking the 3D scene itself, including in that case reflections of other objects. +Environment image might be packed in different ways - **cube maps** and equirectangular maps are the most commonly used. +Anyway, it allows \f$L_i^{indirect}(l)\f$ to be defined for every \f$l\f$ and its practical implementation in form of images gives name for this approach. +Lets back to indirect illumination integral: + +\f[L_{indirect} = \int\limits_H f(v, l) L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f] + +Substituting the BRDF by its expression allows to split indirect illumination into diffuse and specular components: + +\f[L_{indirect} = \int\limits_H f_d(v,l)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l + \int\limits_H f_s(v,l)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l = \f] + +\f[= (1-m)\frac{c}{\pi}\int\limits_H (1-F)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l + \frac{1}{4}\int\limits_H \frac{DFG}{\cos\theta_l \cos\theta_v}L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l\f] + +This splitting seems not to lead to simplicity of calculation but these two parts will be computed in slightly different ways in future. +Lets write down this separately: + +\f[L_{indirect}^d = (1-m)\frac{c}{\pi}\int\limits_H (1-F)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l\f] + +\f[L_{indirect}^s = \frac{1}{4}\int\limits_H \frac{DFG}{\cos\theta_v \cos\theta_l} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f] + +Next transformations of these expressions require understanding of numerical way to find hemisphere integral and also its performance optimization techniques. +And that the topic of the next chapter. + +@section pbr_monte_carlo_integration Monte-Carlo numeric integration + +**Monte-Carlo** is one of numeric methods to **find integral**. +It is based on idea of mathematical expectation calculation. +In one dimensional case if \f$f(x)\f$ is a function with parameter distributed according to probability density \f$p(x)\f$ the mathematical expectation of it can be found using following expression: + +\f[E = \int\limits_{-\infty}^\infty f(x) p(x)\, \mathrm{d}x\f] + +Also this expectation can be approximated in statistical term using certain sequence of random variable \f$x\f$: + +\f[E \approx \frac{1}{N} \sum_{i=1}^{N} f(x_i)\f] + +It can be used in general definite integrals calculations. +Just valid \f$p(x)\f$ defined on \f$[a, b]\f$ range and sequence \f$x_i\f$ generated according to it are needed for that: + +\f[\int\limits_a^b f(x)\, \mathrm{d}x = \int\limits_a^b \frac{f(x)}{p(x)}p(x)\, \mathrm{d}x = \int\limits_{-\infty}^{\infty} \frac{f(x)}{p(x)}p(x)\, \mathrm{d}x \approx \frac{1}{N} \sum_{i=1}^{N} \frac{f(x_i)}{p(x_i)}\f] + +Where \f$f(x)\f$ is considered to be equal to zero outside of \f$[a, b]\f$ range. +This is also true for functions on sphere or hemisphere: + +\f[\int\limits_{H|S} f(l)\, \mathrm{d}l \approx \frac{1}{N}\sum_{i=1}^{N} \frac{f(l_i)}{p(l_i)}\f] + +The main questions are choosing \f$p(l)\f$ and generating samples \f$l_i\f$. +The one of the simple ways is uniform distribution along sphere or hemisphere. +Lets realize that on sphere for example. +There are \f$4\pi\f$ possible directions in terms of sphere's areas and steradians (direction can be presented as dot on a unit sphere): + +\f[\int\limits_S 1\, \mathrm{d}l = 4\pi\f] + +Where \f$S\f$ is the unit sphere. +In order to be uniform \f$p(l)\f$ must be constant and satisfy normalization criteria: + +\f[\int\limits_S p(l)\, \mathrm{d}l = 1\f] + +So that \f$p(l) = \frac{1}{4\pi}\f$. +Usually direction \f$l\f$ is parametrized by spherical coordinates \f$\phi \in [0, 2\pi]\f$ and \f$\theta \in [0, \pi]\f$ boiling down to the 2D samples generation. +But in these terms joint \f$p(\theta, \phi)\f$ will be looked slightly different due to variables transition. +\f$l\f$ is defined in regular Cartesian coordinates \f$l=(x, y, z)\f$ with \f$\|l\| = 1\f$. +The spherical coordinates transform looks like: + +\f[x = r\sin\theta\cos\phi,\, y = r\sin\theta\sin\phi,\, z = r\cos\theta\f] + +Where \f$r = 1\f$. +In order to express probability density using new variables it is needed to multiply this density by Jacobian of transform: + +\f[p(\theta,\phi) = p(l)|J_T|\f] + +Where: + +\f[|J_T| = \begin{vmatrix} \frac{\partial x}{\partial r} & \frac{\partial x}{\partial \theta} & \frac{\partial x}{\partial \phi} \\ \frac{\partial y}{\partial r} & \frac{\partial y}{\partial \theta} & \frac{\partial y}{\partial \phi} \\ \frac{\partial z}{\partial r} & \frac{\partial z}{\partial \theta} & \frac{\partial z}{\partial \phi} \end{vmatrix} = r^2\sin\theta\f] + +So that joint probability density in new variables looks like: + +\f[p(\theta, \phi) = \frac{\sin\theta}{4\pi}\f] + +This variable transfer rule of **Probability Density Function** (**PDF**) will be useful in following chapters, when integral calculation optimization techniques will be being told. +Having \f$p(\theta, \phi)\f$ the partial single dimensional probability densities are able to be found: + +\f[p(\phi) = \int\limits_0^\pi p(\theta, \phi)\, \mathrm{d}\theta = \frac{1}{4\pi} \int\limits_0^\pi \sin\theta\, \mathrm{d}\theta = \frac{1}{2\pi}\f] + +\f[p(\theta) = \int\limits_0^{2\pi} p(\theta, \phi)\, \mathrm{d}\phi = \frac{\sin\theta}{4\pi}\int\limits_0^{2\pi}1\, \mathrm{d}\phi = \frac{\sin\theta}{2}\f] + +The final step is sequence generation itself. +In order to be able to generate values with arbitrary distributions it is helpful to start from uniform numbers in range of \f$[0, 1]\f$. +And that can be done via any known true- and pseudo- random generators. +Even simple \f$\frac{1}{i}\f$ sequence is appropriate for beginning but it can be not so efficient in terms of computations convergence. +There are specially designed series for the last reason and it will be tackled in chapter about optimizations. +The \f$\phi\f$ variable is noticed to be uniformly distributed so that it can be directly generated without any additional manipulations. +Just range \f$[0, 1]\f$ is needed to be mapped to range \f$[0, 2\pi]\f$. +For any other variables including \f$\theta\f$ the inverse transform sampling approach can be applied. +First of all **cumulative distribution function** (**CDF**) is needed to be found. +It is probability of random value to be less than argument of this functions by definition. +For continues distributions it can be expressed in following form: + +\f[F(x) = \int\limits_{-\infty}^x p(x')\, \mathrm{d}x'\f] + +Lets find CDF for \f$\theta\f$: + +\f[F(\theta) = \int\limits_{-\infty}^\theta p(\theta')\, \mathrm{d}\theta' = \int\limits_0^\theta \frac{\sin\theta'}{2}\, \mathrm{d}\theta' = \frac{1-\cos\theta}{2}\f] + +The CDF maps \f$\theta\f$ values from range of \f$[0, \pi]\f$ to probability in range of \f$[0, 1]\f$. +The next step is to find inverse cumulative function which can be not so trivial sometimes but pretty obvious in current case: + +\f[F^{-1}(u) = \arccos(1-2u)\f] + +If substitute uniform distributed in range \f$[0, 1]\f$ values \f$u\f$ as argument of this function the values with origin probability density will appear. +In other words: + +\f[\theta = \arccos(1 - 2u),\, u \in [0, 1],\, p(u) = 1 \Rightarrow p(\theta) = \frac{\sin\theta}{2}\f] + +That is the key of this random values generation technique. +All steps described above can be also done for hemisphere: + +\f[p(l) = \frac{1}{2\pi}\f] + +\f[p(\theta, \phi) = \frac{\sin\theta}{2\pi}\f] + +\f[p(\phi) = \int\limits_0^\frac{\pi}{2} p(\theta, \phi)\, \mathrm{d}\theta = \frac{1}{2\pi} \int\limits_0^\frac{\pi}{2} \sin\theta\, \mathrm{d}\theta = \frac{1}{2\pi}\f] + +\f[p(\theta) = \int\limits_0^{2\pi} p(\theta, \phi)\, \mathrm{d}\phi = \frac{\sin\theta}{2\pi}\int\limits_0^{2\pi}1\, \mathrm{d}\phi = \sin\theta\f] + +\f[\theta = \arccos(1-u)\f] + +Mote-Carlo integration cannot guarantee exact estimation of convergence speed with using random generated samples. +There is only probability estimation of it. +But this algorithm is pretty universal and relatively simple to be applied to almost any function using at least uniform distributed points. +Moreover special \f$p(l)\f$ can be chosen and special pseudo-random sequences can be designed in order to speed up convergence for some functions (following chapter talk about that in details). +That is why this method is widely used in computer graphics and demonstrates good results. +Also another one advantage is worth to be mentioned - possibility to iteratively accumulate computations and present intermediate results during rendering which is used in some ray tracing applications. + +@section pbr_split_sum Split sum + +Lets go back to the image based lighting and the figure of specular component. +As was defined before that is hemisphere integral with following expression: + +\f[L_{indirect}^s = \frac{1}{4}\int\limits_H \frac{DFG}{\cos\theta_v \cos\theta_l} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f] + +The Monte-Carlo integration algorithm can be directly applied: + +\f[L_{indirect}^s = \int\limits_H f_s(v, l)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l \approx \frac{1}{N}\sum_{i=1}^N \frac{f_s(v, l_i) L_i^{indirect}(l_i) \cos\theta_{l_i}}{p(v, l_i)}\f] + +\f$p(v, l_i)\f$ depends on \f$v\f$ and implicitly on \f$r\f$ in order to be completely general. +Optimization strategies use different samples distributions for different view direction orientations and roughness values. +Anyway even with all optimization techniques this algorithm continues to require too much calculations. +Good visual results require noticeable number of samples and using this approach for every point in real time rendering becomes unrealistic. +The way to avoid these enormous calculations is doing them beforehand somehow. +The first trick on the way to this is split the sum separating environment light component [@ref Karis13]: + +\f[L_{indirect}^s \approx \frac{1}{N} \sum_{i=1}^N \frac{f_s(v, l_i) L_i^{indirect}(l_i) \cos\theta_{l_i}}{p(v, l_i)} \approx \left( \frac{1}{N} \sum_{i=1}^N L_i^{indirect}(l_i) \right) \left( \frac{1}{N} \sum_{i=1}^N \frac{f_s(v, l_i) \cos\theta_{l_i}}{p(v, l_i)} \right)\f] + +Where the second brackets represent approximation of integral so that the expression can be rewritten as: + +\f[L_{indirect}^s \approx \frac{1}{N} \sum_{i=1}^N \frac{f_s(v, l_i) L_i^{indirect}(l_i) \cos\theta_{l_i}}{p(v, l_i)} \approx \left( \frac{1}{N} \sum_{i=1}^N L_i^{indirect}(l_i) \right) \int\limits_H f_s(v, l) \cos\theta_l\, \mathrm{d}l\f] + +This integral is exact \f$L_{indirect}^s\f$ in condition when \f$L_i^{indirect}(l) = 1\f$ what just means white uniform environment. +The sum before it is kind of averaged environment illumination. +The main accomplishment after all this manipulations is possibility to calculate light and BRDF components separately. +The sum with \f$L_i^{indirect}(l_i)\f$ can be computed beforehand for every normal direction and stored to image called specular map but with some valuable details. +The problem is that \f$l_i\f$ samples must be generated according to \f$p(v, l_i)\f$ distribution depended on \f$v\f$ and \f$r\f$ as was mentioned earlier. +Variation of normal is not enough in that case and these variables are needed to be considered too. +The ways to resolve it are topic of one of the following chapters and now understanding the fact that at least this part can be precomputed before rendering is enough for now. +And it is important not to miss out that there is no more BRDF influence in this sum and only \f$p(v, l)\f$ can affect in this case. +That is why it is so important to strict to PDF during samples generation and that is why \f$p(v, l)\f$ must be correlated with BRDF somehow in this approximation approach with splitting. +For example completely mirroring materials with \f$r = 0\f$ will not be looked as expected if just uniform distribution is used +because such surfaces have only one possible direction from which light can be reflected along view direction in compare with \f$N\f$ absolutely scattered in case of uniform or many other distributions. + +The rest part also can be saved to image. Lets unroll its expression: + +\f[\int\limits_H f_s(v, l) \cos\theta_l\, \mathrm{d}l = \int\limits_H \frac{DGF}{4\cos\theta_v \cos\theta_l} \cos\theta_l\, \mathrm{d}l\f] + +This integral is not actually a scalar. +That is RGB value due to only \f$F\f$ factor and even more only to \f$F_0\f$. +In order to simplify future computations \f$F_0\f$ is needed to be moved out of integral. +Substitution of Schlick's approximation helps to achieve it: + +\f[F = F_0+(1-F_0)(1-\cos\theta_{vh})^5 = F_0(1-(1-\cos\theta_{vh})^5) + (1-\cos\theta_{vh})^5\f] + +\f[\int\limits_H \frac{DGF}{\cos\theta_v \cos\theta_l} \cos\theta_l\, \mathrm{d}l = F_0 \int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} (1-(1-\cos\theta_{vh})^5) \cos\theta_l\, \mathrm{d}l + \int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} (1-\cos\theta_{vh})^5 \cos\theta_l\, \mathrm{d}l\f] + +This form may not look easier, but it has several advantages. +The first one is independence from globally defined \f$L_i^{indirect}(l)\f$, so that normal orientation does not matter and can be set in any handful way for calculations (Z axis for example). +The second one results from isotropic illumination system allowing \f$\phi\f$ component of view vector to be set arbitrarily (0 for example) and \f$\cos\theta_v\f$ will be enough to define view direction. +And the third one is scalar nature of integrals so that only two precomputed numbers are needed to find BRDF part of \f$L_{indirect}^s\f$. +Considering dependency of these integrals from \f$\cos\theta_v\f$ and \f$r\f$ both of it can be precomputed and stored to 2D look-up image variating these two parameters in range \f$[0, 1]\f$ with two channels consisting of scale and bias for \f$F_0\f$. + +Current result for \f$L_{indirect}^s\f$ is computing it using 2D image for BRDF part and omnidirectional image for environment illumination. +There were a lot of words about Monte-Carlo optimizations techniques and about PDF choice which is important not only in terms of numeric integration but in terms of visual results correctness. +It's time to talk about that. + +@section pbr_importance_sampling Importance sampling + +Current goal is to speed up Monte-Carlo integration of Cook-Torrance like integrals with following expression: + +\f[\int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} g(v, l) \cos\theta_l\, \mathrm{d}l\f] + +Where \f$g(v, l)\f$ is just arbitrary function representing Fresnel's factor itself or its components. +In order to increase convergence the samples with larger contribution (or in other words with larger function's values) have to appear more frequently than others proportionally to its contribution. +So that less significant summand with less influence to result will be considered rarely and in opposite way parts brining noticeable changes to the sum will be taken often. +That is the main idea of **importance sampling technique**. +\f$p(l)\f$ has to represent significance of sample in terms of integrated function via probability somehow. +And it will be like that if PDF is already part of original function because in that case probability density directly affects to contribution forming. +Separating this distribution component is one possible and effective way to realize importance sampling strategy. +In integral presented above PDF part already exists and that is \f$D\f$ component. +But it is distribution of micro faces normals or ideally reflection direction or \f$h\f$ in other word and not light directions distribution which is needed in fact. +Anyway that is good starting point and lets generate \f$h\f$ vectors first. +\f$D\f$ has the following expression: + +\f[D=\frac{\alpha^2}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f] + +Frankly speaking \f$D(h)\f$ is called normal distribution but cannot be directly used as hemisphere distribution. +Originally it is statistical factor used to define total area of micro faces \f$\mathrm{d}A_h\f$ +whose normals lie withing given infinitesimal solid angle \f$\mathrm{d}h\f$ centered on \f$h\f$ direction using the original small enough area of macro surface \f$\mathrm{d}A\f$ [@ref Walter07]: + +\f[dA_h = D(h)\,\mathrm{d}h\, \mathrm{d}A\f] + +First of all this factor must be positive: + +\f[D(h) \geq 0\f] + +But the total area of micro faces landscape is at least equal to origin surface but even bigger in general: + +\f[1 \leq \int\limits_H D(h)\, \mathrm{d}h\f] + +This trait does not allow to use \f$D\f$ as hemisphere distribution. +But it can be fixed with following feature: + +\f[\forall v\, \int\limits_H D(h)(v \cdot h)\, \mathrm{d}h = (v \cdot n)\f] + +Which means that total area of micro faces projected to any direction must be the same as projected area of origin macro surface. +It is pretty tricky trait in \f$D\f$ definition but it leads to interesting results in condition when \f$v = n\f$: + +\f[\int\limits_H D(h)\cos\theta_h\, \mathrm{d}h = 1\f] + +So that \f$\cos\theta_h\f$ coefficient normalizes normal distribution in terms of hemisphere and allows to use it as distribution. +Finally PDF of half vectors can be wrote: + +\f[p(\theta_h, \phi_h) = D\cos\theta_h\sin\theta_h = \frac{\alpha^2 \cos\theta_h\sin\theta_h}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f] + +\f$\sin\theta_h\f$ results from spherical coordinate system transfer which was described in Monte-Carlo integration chapter. +Lets strict to samples generation procedure and find partial probability densities: + +\f[p(\phi_h) = \int\limits_0^\frac{\pi}{2} p(\theta_h, \phi_h)\, \mathrm{d}\theta_h = \int\limits_0^\frac{\pi}{2} \frac{\alpha^2 \cos\theta_h\sin\theta_h}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\, \mathrm{d}\theta = \frac{1}{2\pi}\f] + +\f[p(\theta_h) = \int\limits_0^{2\pi} p(\theta_h, \phi_h)\, \mathrm{d}\phi_h = \int\limits_0^{2\pi} \frac{\alpha^2 \cos\theta_h\sin\theta_h}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\, \mathrm{d}\phi = \frac{2 \alpha^2 \cos\theta_h\sin\theta_h}{(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f] + +\f$p(\phi_h)\f$ is unnecessary to be calculated analytically. +The fact of independency from \f$\phi\f$ is enough to figure out that this coordinate is uniformly distributed. +Anyway the \f$F(\theta_h)\f$ is next step [@ref Cao15]: + +\f[F(\theta_h) = \int\limits_0^{\theta_h} \frac{2 \alpha^2 \cos\theta'_h\sin\theta'_h}{(\cos^2\theta'_h(\alpha^2-1) + 1)^2}\, \mathrm{d}\theta'_h = \int\limits_{\theta_h}^0 \frac{2 \alpha^2}{(\cos^2\theta'_h(\alpha^2-1) + 1)^2}\, \mathrm{d}(\cos^2\theta'_h) = \frac{\alpha^2}{\alpha^2-1}\int\limits_0^{\theta_h} \mathrm{d}\frac{1}{\cos^2\theta'_h(\alpha^2-1)+1} =\f] + +\f[ = \frac{\alpha^2}{\alpha^2-1} \left( \frac{1}{\cos^2\theta_h(\alpha^2-1) + 1} - \frac{1}{\alpha^2} \right) = \frac{\alpha^2}{\cos^2\theta_h(\alpha^2-1)^2+(\alpha^2-1)} - \frac{1}{\alpha^2-1}\f] + +In order to apply inverse transform sampling the \f$F^{-1}(u)\f$ is needed to be found: + +\f[F^{-1}(u) = \theta_h = \arccos\sqrt{\frac{1-u}{u(\alpha^2-1)+1}}\f] + +So that there is no more obstacles to generate \f$h\f$. +But the main goal was \f$l\f$ direction. +In order to get it the view vector \f$v\f$ has to be reflected related to already found \f$h\f$: + +\f[l = 2(v \cdot h)h - v\f] + +That is practical side of light direction generation. +But the theoretical one is needed to be resolved to calculate sum. +It is time to find \f$p(l)\f$ using known \f$p(h)\f$. +First of all the fact that \f$l\f$ is just transformed \f$h\f$ is needed to be understood. +In that way the light direction's PDF has following expression: + +\f[p(l) = p(h)|J_T|\f] + +Where \f$|J_T|\f$ is Jacobian of reflection transformation. +Lets find it. +Right now \f$n\f$ is axis from which \f$\theta\f$ spherical coordinate is encountered. +The first step is setting \f$v\f$ as starting point of \f$\theta\f$ instead of \f$n\f$. +This is linear transform so that \f$|J_T| = 1\f$. +Next step is transfer to spherical coordinate with \f$|J_T| = \sin\theta_{vh}\f$. +Due to previous step \f$\theta_{vh}\f$ is used instead of \f$\theta_h\f$. +In this coordinate system reflecting of \f$v\f$ relative to \f$h\f$ is just doubling \f$\theta_{vh}\f$ and Jacobian of it is equal to \f$\frac{1}{2}\f$. +In series of transform the Jacobians are multiplied so that currently \f$|J_T| = \frac{1}{2}\sin\theta_{vh}\f$. +And the final step is inverse transform to Cartesian coordinate system with \f$|J_T| = (\sin\theta_{vl})^{-1} = (\sin2\theta_{vh})^{-1}\f$. +Combining this all together the following expression is obtained for reflection transform Jacobian [@ref Schutte18]: + +\f[|J_T| = \frac{\sin\theta_{vh}}{2\sin2\theta_{vh}} = \frac{\sin\theta_{vh}}{4\sin\theta_{vh}\cos\theta_{vh}} = \frac{1}{4\cos\theta_{vh}}\f] + +And finally \f$p(l)\f$ looks like: + +\f[p(l) = p(h)|J_T| = \frac{D\cos\theta_h}{4\cos\theta_{vh}}\f] + +Lets go back to the Monte-Carlo sum and insert found result to it: + +\f[\int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} g(v, l) \cos\theta_l\, \mathrm{d}l \approx \frac{1}{N} \sum_{i=1}^N \frac{DG\, g(v, l_i) \cos\theta_{l_i}}{4\cos\theta_v \cos\theta_{l_i}\, p(l_i)} = \frac{1}{N} \sum_{i=1}^N \frac{G\, g(v, l_i) \cos\theta_{l_i} \cos\theta_{vh_i}}{\cos\theta_v \cos\theta_{l_i} \cos\theta_{h_i}}\f] + +Here \f$G\f$ component is recommended to be calculated with original \f$k=\frac{\alpha}{2} = \frac{r^2}{2}\f$ in order to get more plausible result. +Of course, all \f$\cos\f$ must be clamped to range \f$[0, 1]\f$ because integral is calculated on a hemisphere and all expressions are defined on it. +\f$\cos\theta_v \cos\theta_{l_i}\f$ in denominator can be reduced with exactly the same part in geometric attenuation factor in order to avoid additional zero division cases. + +Summarizing importance sampling strategy described above the convergence of Monte-Carlo integration can be improved using special PDF correlated with integrated function. +In case of BRDF with normal distribution functions \f$D\f$ the PDF producing procedure is defined. +Practically half vector \f$h\f$ is generated first and \f$l\f$ is obtained from it by view vector \f$v\f$ reflecting. +Due to this transformation final form of probability density used in sum is quite different but also has defined algorithm of calculation. +For isotropic Cook-Torrance BRDF the \f$\cos\theta_v\f$ and roughness \f$r\f$ are enough to start generation so that all integrals of that kind can be precalculated in 2D look-up tables variating these two parameters. +The same samples generation procedure must be used in specular map baking described in next chapter. + +@section pbr_specular_map Specular map + +The situation with BRDF part of \f$L_{indirect}^s\f$ is clear now and \f$L_i^{indirect}(l)\f$ sum is left to be discussed. +That was called **specular map** and has following form: + +\f[\frac{1}{N}\sum_{i=1}^N L_i^{indirect}(l_i)\f] + +As was mentioned this sum must be calculated for every normal direction using the same samples generation principles as in numeric integration computation. +This principles require two scalar parameters \f$\cos\theta_v\f$ and \f$r\f$ but now \f$\phi\f$ really matters. +So that in fact the specular map has to be saved in 3D table consisting omnidirectional textures. +That is a big expense of computational and memory resources. +A couple of tricks helps to reduce dimensions. +First of all the \f$\cos\theta_v\f$ and \f$\phi\f$ can be just excluded. +In that way \f$v\f$ is considered to be equal to \f$n\f$. +Of course this approach produces an error and affects the final result. +It can be fixed more or less by \f$\cos\theta_{l_i}\f$ weighting [@ref Karis13]: + +\f[\frac{1}{N} \sum_{i=1}^N L_i^{indirect}(l_i) \cos\theta_{l_i}\f] + +It is not a complete solution but practice shows that it is enough to get plausible illumination with sacrificing of lengthy reflections at grazing angles which exist in fact if everything is honestly computed. +The problem is that for \f$v \neq n\f$ considering this sum to be defined related to \f$n\f$ became incorrect. +For example, for complete mirroring materials with \f$r = 0\f$ this sum must boil down to \f$L_i^{indirect}(v_r)\f$ +but not to \f$L_i^{indirect}(n)\f$ where \f$v_r\f$ is just reflected \f$v\f$ or in other words \f$v_r = 2(v \cdot n)n - v\f$. +That it just mirroring reflection principle. +Assumption of \f$n = v\f$ also means that \f$n = v = v_r\f$. +In that way radiance map better to be considered as averaging of illumination coming from \f$v_r\f$. +So that it has become to be defined related to reflection direction which has to be calculated before map's fetching. + +Anyway, there are just two dimensions in radiance look-up table remain. +The rest one with \f$r\f$ parameter cannot be reduced. +There is no other ways except just roughness variation but in order to simplify that computations can be done for several values and the rest ones lying between can be obtained from linear interpolation. +This is another source of visual artifacts but it also works good in practice and that is pretty common approach. +But it still requires noticeably amount of samples and that is for every pixel related to each \f$r\f$ value. +It can be appropriate for precomputations but still limits using dynamic environments in real time rendering or just even static environments but on weak devices such as mobile ones. +And there are several possible ways to improve radiance map baking performance. + +The first one is using textures with smaller resolutions for larger roughnesses. +The point is that smaller \f$r\f$ values produce map saving more details from origin environment in opposite to larger ones representing lower frequency components and working as low pass filters in fact. +So less pixels in combination with linear interpolation is enough to store less detailed convolutions. +Moreover, this approach naturally works with textures levels of details in graphics API +so that every certain radiance map related to certain \f$r\f$ can be stored on its own mip level and be directly fetched with linear interpolation not only over one texture but over levels too. +As practice shows 6 levels are enough. + +After reducing pixels count it is turn for samples number. +And again correlation with roughness can be noticed. +For example map for completely mirroring materials with \f$r = 0\f$ the same sample \f$l_i = v_r\f$ will be produced. +So that only one sample is enough in this case. +In opposite way directions for \f$r = 1\f$ will be scattered over almost whole hemisphere what requires as much samples as available. +The 'locality' of distribution is decreased during increasing roughness and it is possible to assume that samples number might to be proportional to this 'locality' keeping accuracy at the same level. +But how can 'locality' be interpreted in terms of probability distribution? One possible way is CDF meaning. +\f$F(\theta_h)\f$ has been already defined and by definition it shows the probability of random value \f$\theta_h\f$ to be less than argument of CDF. +In other words \f$F(\theta'_h) = u\f$ means that probability of \f$\theta_h\f$ to be in range of \f$[0, \theta'_h]\f$ is \f$u\f$. +The inverse task of range searching using given \f$u\f$ can be solved with help of \f$F^{-1}(u) = \theta'_h\f$. +If \f$u\f$ is close to 1 (exact 1 has no sense because in that case \f$\theta'_h = \max\theta_h = \frac{\pi}{2}\f$) +then \f$\theta'_h\f$ represents the range of the most probable or most frequently generated values and that can be interpreted as 'locality' of distribution. +After that if samples number of the worst case with \f$r = 1\f$ is set (\f$N(1) = \max N\f$) the other ones can be estimated using following formula: + +\f[N(r) = N(1)\frac{\theta'_h(r)}{\frac{\pi}{2}} = N(1)\frac{2\theta'_h(r)}{\pi} = N(1)\frac{2F^{-1}(u)}{\pi} = N(1)\frac{2}{\pi}\arccos\sqrt{\frac{1-u}{u(\alpha^2-1)+1}}\f] + +It is approximate expression representing only estimated general proportionality so that cases of \f$r = 0\f$ and \f$r = 1\f$ must be processed separately with \f$N(0) = 1\f$ and \f$N(1) = \max N\f$. +\f$u\f$ can be parameter of this optimization strategy controlling speed of samples reducing in order to balance performance and quality (\f$u = 1\f$ disables this optimization at all). +This pretty tricky technique allows reducing calculations for every pixels without sacrificing the quality. + +In addition to optimizations mentioned before another one can be applied in order to help to reduce samples numbers as previous one. +Using less samples produces image noise due to discrete nature of Monte-Carlo approximation. +But it can be slightly smoothed using some prefiltration. +The idea is that for the directions with small PDF or in other words for rare directions the samples near of it is unlikely to be generated. +So that this direction represents the averaged illumination from relatively big area on hemisphere but approximate it by just a constant. +It wold be better to get from such direction already averaged over bigger area environment. +It can be achieved using mip levels of origin \f$L_i^{indirect}\f$ whose pixels of one level is exact 4 averaged pixels from previous one. +Also mip levels generation is build in most common graphic API so there are no problems with it. +But first of all the area covered by one sample is needed to be found. +And that can be done as [@ref Colbert07]: + +\f[\Omega_s = \frac{1}{N\,p(l)} = \frac{4\cos\theta_{vh}}{ND\cos\theta_h}\f] + +Circumstance of \f$v = v_r = n\f$ leads to \f$\cos\theta_{vh}\f$ and \f$\cos\theta_h\f$ reducing so expression becomes even simpler: + +\f[\Omega_s =\frac{4}{ND}\f] + +Of course all zero divisions must be avoided by clamping, for example. +After that the area covered by one pixel of environment map is calculated. +In case of a cube map it looks like: + +\f[\Omega_p = \frac{4\pi}{6k^2}\f] + +Where \f$k\f$ is size of one cube map side in pixels (sides are assumed to be quads). +Finally the mip level of origin environment map which is needed to be fetched for this certain sample is defined by following expression: + +\f[lod = \frac{1}{2} \log_2\left(\frac{\Omega_s}{\Omega_p}\right)\f] + +The mathematics connected with mip levels sizes lie behind it but this is out of scope of this paper. +In combination with previous optimization technique this approach allows \f$N(1)\f$ to be smaller keeping visual results good. + +That is not all possible optimization tricks but at least these three significantly reduces compute efforts and brings radiance map calculation to weak devices or even to dynamic environments in real time but in reasonable limits. + +In that way \f$L_{indirect}^s\f$ can be completely computed without any integral approximations. +Only 2D look-up table of BRDF part and mip mapped omnidirectional texture of irradiance map are needed. +The first one can be got even without any environment. +It was achieved using some rough approximations and assumptions but despite of that the visual result are still plausible and can be compared even with ray traced images. +In order to complete whole image based lighting the \f$L_{indirect}^d\f$ component is left to be discussed. + +@section pbr_spherical_harmonics Spherical harmonics + +Lets go back to diffuse indirect illumination component represented by following formula: + +\f[L_{indirect}^d = (1-m)\frac{c}{\pi}\int\limits_H (1-F)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l\f] + +Of course, Monte-Carlo algorithm can be applied directly and hemisphere integral can be precalculated for every normal direction +but dependence from \f$v\f$ in Fresnel's factor does not allow to do it efficiently (every \f$v\f$ direction is needed to be considered again). +In order to resolve it modified version of Schlick's approximation has been created [[?](TODO)]: + +\f[F \approx F_{ss}=F_0+(\max(1-r, F_0))(1-\cos\theta_v)^5\f] + +It differs from origin one and loses accuracy a little bit but now there is no light direction inside +so that it can be considered as kind of screen space defined Fresnel's factor (\f$ss\f$ means exactly 'screen space') and can be removed from integral: + +\f[L_{indirect}^d = (1-m)(1-F_{ss})\frac{c}{\pi} \int\limits_H L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f] + +The resulted expression without \f$(1-m)\f$ and \f$(1-F_{ss})\f$ parts is pretty known entity called **irradiance**. +It can be precalculated using \f$\cos\theta_l\f$ as PDF for importance sampling (actually it is only option in this case excluding uniform distribution). +But even with that samples will be scattered almost over whole hemisphere. +As was discussed in previous chapter this case requires significant amount of samples in order to average illumination with appropriate quality. +Poor accuracy resulted from lack of summand can be noticed especially on high frequency environments having a lot of contrasting details. +It worth to be mentioned that irradiance is used not only in BRDF. +Omnidirectional diffuse illumination captured for certain point or even for several points uniformly or hierarchically distributed is base of some baking global illumination techniques. +There it is called a **light probe**. So that other way to compute and store irradiance maps was found resolving many mentioned problems. +The Fourier's decomposition analogue for spherical function allows to achieve this. +That would be easy to explain concept directly on example. +So lets start from \f$L_i^{indirect}(l)\f$. +It is spherical function because directions are just points on sphere. +The decomposition looks like: + +\f[L_i^{indirect}(l) = \sum_{i = 0}^\infty \sum_{j=-i}^i L_i^j y_i^j(l)\f] + +Where \f$y_i^j(l)\f$ are spherical functions forming orthonormalized basis called spherical harmonics and \f$L_i^j\f$ is decompositions coefficients. +Orthonormality means that dot product of two basis elements is equal to 1 if this is the same functions and is equal to zero otherwise. +Dot product on a sphere is defined as integral of functions multiplication. In other words: + +\f[\int\limits_S y_i^j(l)\, y_{i'}^{j'}(l)\, \mathrm{d}l = \begin{cases} 1 & \quad i,j = i',j' \\ 0 & \quad \mathrm{otherwise}\end{cases}\f] + +Function basis with such traits is known and is described by following formulas [@ref Guy18]: + +\f[y_i^{j > 0}(\theta, \phi) = \sqrt{2}K_i^j\cos(j\phi)P_i^j(\cos\theta)\f] +\f[y_i^{j<0}(\theta, \phi) = \sqrt{2}K_i^j\sin(j\phi)P_i^{|j|}(\cos\theta)\f] +\f[y_i^0(\theta, \phi) = K_i^0P_i^0(\cos\theta)\f] + +\f[K_i^j = \sqrt{\frac{(2i+1)(i-|j|)!}{4\pi(i+|j|)!}}\f] +\f[P_0^0(x) = 1\f] +\f[P_1^0(x) = x\f] +\f[P_i^i(x) = (-1)^i(2i-1)!!(1-x^2)^\frac{i}{2}\f] +\f[P_i^j(x) = \frac{(2i-1)xP_{i-1}^j(x) - (i + j - 1)P_{i-2}^j}{i - j}\f] + +Here \f$K_i^j\f$ are normalization factors and \f$P_i^j\f$ are **Legendre's polynomials**. +Decomposition coefficients \f$L_i^j\f$ are dot product of origin function (\f$L_i^{indirect}(l)\f$ in current case) and corresponding basis element. It can be written down as: + +\f[L_i^j = \int\limits_S L_i^{indirect}(l)\,y_i^j(l)\, \mathrm{d}l\f] + +Fact that all calculation happen over a sphere but not over hemisphere right now is important not to be missed. +That was example of spherical function decomposition but not a solution for original task which looks like: + +\f[\int\limits_H L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f] + +First of all, lets transform this integral to be defined not over hemisphere but sphere: + +\f[\int\limits_H L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l = \int\limits_S L_i^{indirect}(l)\overline{\cos}\theta_l\, \mathrm{d}l\f] + +Where \f$\overline{\cos}\f$ is cosine clamped to zero which can be expressed as: + +\f[\overline{\cos}\theta_l = \max(\cos\theta_l, 0)\f] + +Resulted expression can be considered as convolution in terms of spherical functions where \f$L_i^{indirect}(l)\f$ is target and \f$\overline{\cos}\theta_l\f$ is core. +This integral may seem independent but in fact hemisphere is oriented related to \f$n\f$ therefore \f$\overline{\cos}\theta_l\f$ depends on it too and became a kind of 'oriented' version of cosine. +That is pretty tricky and explanation about meaning of convolution on sphere is out of scope of this paper. +Fact that this is convolution analogue related to \f$n\f$ is enough for now [@ref Aguilar17], [@ref Ramamoorthi01]. +The goal of looking at integral from this angle is using of convolution's trait allowing to compute decomposition using just only coefficients of function and core. +\f$\overline{\cos}\theta_l\f$ is independent from \f$\phi_l\f$ and in case of such radial symmetric cores the resulting coefficients boil down to following formula: + +\f[(L_i^{indirect}(l) \ast \overline{\cos}\theta_l)_i^j = \frac{1}{K_i^0}L_i^j\, c_i^0 = \sqrt{\frac{4\pi}{2i+1}}L_i^j\, c_i^0\f] + +Where \f$c_i^0\f$ are spherical harmonics factors corresponding to \f$\overline{\cos}\theta\f$. +Therefore the final decomposition looks like: + +\f[\int\limits_{H(n)} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l = \int\limits_S L_i^{indirect}(l)\overline{\cos}\theta_l\, \mathrm{d}l = \sum_{i=0}^\infty \sum_{j = -i}^i \sqrt{\frac{4\pi}{2i+1}}L_i^j\, c_i^0\, y_i^j(n)\f] + +\f$c_i^0\f$ is left to be found. +Due to independence from \f$\phi\f$ all \f$c_i^{j \neq 0} = 0\f$. +The rest ones are calculated by regular dot product with basis functions: + +\f[c_i^0 = c_i = \int\limits_S y_i^0(l)\, \overline{\cos}\theta_l\, \mathrm{d}l = \int\limits_0^{2\pi} \mathrm{d}\phi \int\limits_0^\pi y_i^0(\theta, \phi)\, \overline{\cos}\theta \sin\theta\, \mathrm{d}\theta = \int\limits_0^{2\pi} \mathrm{d}\phi \int\limits_0^\frac{\pi}{2} y_i^0(\theta, \phi)\, \cos\theta\sin\theta\, \mathrm{d}\theta = \f] + +\f[= 2\pi\int\limits_0^\frac{\pi}{2} y_i^0(\theta, \phi)\, \cos\theta\sin\theta\, \mathrm{d}\theta = 2\pi K_i^0\int\limits_0^\frac{\pi}{2} P_i^0(\cos\theta)\, \cos\theta\sin\theta\, \mathrm{d}\theta\f] + +\f$\sin\theta\f$ appears due to transfer from integral over sphere to double integral where \f$\mathrm{d}l = \sin\theta\, \mathrm{d}\theta\, \mathrm{d}\phi\f$. +There is an analytical solution for this expressions: + +\f[c_1 = \sqrt{\frac{\pi}{3}}\f] + +\f[c_{odd} = 0 \quad c_{even} = 2\pi\sqrt{\frac{2i+1}{4\pi}}\frac{(-1)^{\frac{i}{2}-1}}{(i+2)(i-1)}\frac{i!}{2^i\left(\frac{i!}{2}\right)^2}\f] + +Starting from about the third \f$c_i\f$ the coefficients become less and less valuable so that only couple of them is enough in order to approximate \f$\overline{\cos}\theta\f$ with appropriate accuracy. +The same principle is true for convolution too because its coefficients are multiplied by \f$c_i\f$. +So there is no need to use more than even three bands (\f$i = 0, 1, 2\f$) of basis functions. +Lets write down them all in Cartesian coordinate [@ref Ramamoorthi01]: + +\f[y_0^0 = \frac{1}{2}\sqrt{\frac{1}{\pi}} = Y_0^0\f] + +\f[y_1^{-1} = -\frac{1}{2}\sqrt{\frac{3}{\pi}}y = Y_1^{-1}y\f] +\f[y_1^0 = \frac{1}{2}\sqrt{\frac{3}{\pi}}z = Y_1^0z\f] +\f[y_1^1 = -\frac{1}{2}\sqrt{\frac{3}{\pi}}x = Y_1^1x\f] + +\f[y_2^{-2} = \frac{1}{2}\sqrt{\frac{15}{\pi}}xy = Y_2^{-2}xy\f] +\f[y_2^{-1} = -\frac{1}{2}\sqrt{\frac{15}{\pi}}yz = Y_2^{-1}yz\f] +\f[y_2^0 = \frac{1}{4}\sqrt{\frac{5}{\pi}}(3z^2-1) = Y_2^0(3z^2-1)\f] +\f[y_2^1 = -\frac{1}{2}\sqrt{\frac{15}{\pi}}xz = Y_2^1xz\f] +\f[y_2^2 = \frac{1}{4}\sqrt{\frac{15}{\pi}}(x^2-y^2) = Y_2^2(x^2-y^2)\f] + +All \f$Y_i^j\f$ are just constants so that it can be moved from integral during calculations and can be taken from precomputed table. +Other constants related to \f$c_i\f$ can be united and also be calculated beforehand: + +\f[\hat{c}_i = \frac{1}{K_i^0}\, c_i = \sqrt{\frac{4\pi}{2i+1}}\, c_i\f] + +Finally expression of irradiance map approximation can be defined: + +\f[\int\limits_{H(n)} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l \approx \sum_{i=0}^2 \sum_{j=-i}^i L_i^j\, \hat{c}_i\, y_i^j(n)\f] + +Where \f$\hat{c}_i\f$ is precalculated constants \f$y_i^j(n)\f$ are pretty easy functions and only \f$L_i^j\f$ are needed to be precomputed. +Of course \f$L_i^j\f$ are integrals over even whole sphere but now there is only nine of it instead of one for every pixel of omnidirectional image. +Moreover, texture is not needed at all in that case and only 9 colors representing \f$L_i^j\f$ have to be saved. +The Monte-Carlo algorithm can be applied with just uniform samples distribution without importance sampling at all. +\f$Y_i^j\f$ are used twice: in \f$L_i^j\f$ calculations and in sum after that. +So there is sense to store only squares of it. +All tables with constants presented below [@ref Ramamoorthi01]: + +| | +|-| +| \f$(Y_0^0)^2 \approx (0.282095)^2\f$ | +| \f$(Y_1^{-1})^2 = (Y_1^0)^2 = (Y_1^1)^2 \approx (0.488603)^2\f$ | +| \f$(Y_2^{-2})^2 = (Y_2^{-1})^2 = (Y_2^1)^2 \approx (1.092548)^2\f$ | +| \f$(Y_2^0)^2 \approx (0.315392)^2\f$ | +| \f$(Y_2^2)^2 \approx (0.546274)^2\f$ | + +| | | +|-|-| +| \f$\hat{c}_0\f$ | \f$3.141593\f$ | +| \f$\hat{c}_1\f$ | \f$2.094395\f$ | +| \f$\hat{c}_2\f$ | \f$0.785398\f$ | + +Summarizing all mathematics above spherical harmonics decomposition boils down irradiance map to only 9 values which is needed to be precalculated as integrals. +As practice shows this is very good approximation of diffuse indirect illumination component. + +@section pbr_transparency Transparent materials + +TODO + +@section pbr_low_discrepancy Low discrepancy sequence + +TODO + +@section pbr_references References + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+@anchor Duvenhage13 **[Duvenhage13]** + +Bernardt Duvenhage, Kadi Bouatouch, D.G. Kourie, +"Numerical Verification of Bidirectional Reflectance Distribution Functions for Physical Plausibility", +*Proceedings of the South African Institute for Computer Scientists and Information Technologists Conference*, +October 2013. +
+@anchor Cook81 **[Cook81]** + +Robert Cook, Kenneth Torrance, +"A Refectance Model for Computer Graphics", +*SIGGRAPH '81: Proceedings of the 8th annual conference on Computer graphics and interactive techniques*, +August 1981, pp. 307-316. +
+@anchor Karis13 **[Karis13]** + +Brian Karis, "Real Shading in Unreal Engine 4", *SIGGRAPH 2013 Presentation Notes*. +
+@anchor Heitz14 **[Heitz14]** + +Eric Heitz, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs", +*Journal of Computer Graphics Techniques*, Vol. 3, No. 2, 2014. +
+@anchor Schlick94 **[Schlick94]** + +Christophe Schlick, "An inexpensive brdf model for physically-based rendering", +*Computer Graphics Forum 13*, 1994, pp. 233-246. +
+@anchor Lazanyi05 **[Lazanyi05]** + +Istvan Lazanyi, Lazslo Szirmay-Kalos, "Fresnel term approximations for Metals", January 2005. +
+@anchor Lagarde13 **[Lagarde13]** + +Sebastien Lagarde, "Memo on Fresnel equations", +*Blog post*: [https://seblagarde.wordpress.com/2013/04/29/memo-on-fresnel-equations/](https://seblagarde.wordpress.com/2013/04/29/memo-on-fresnel-equations/). +
+@anchor Walter07 **[Walter07]** + +Bruce Walter, Stephen Marschner, Hongsong Li, Kenneth Torrance, +"Microfacet Models for Refraction through Rough Surfaces", *Proceedings of Eurographics Symposium on Rendering*, 2007. +
+@anchor Cao15 **[Cao15]** + +Jiayin Cao, "Sampling microfacet BRDF", November 1, 2015, +*Blog post*: [https://agraphicsguy.wordpress.com/2015/11/01/sampling-microfacet-brdf/](https://agraphicsguy.wordpress.com/2015/11/01/sampling-microfacet-brdf/). +
+@anchor Schutte18 **[Schutte18]** + +Joe Schutte, "Sampling techniques for GGX with Smith Masking-Shadowing: Part 1", March 7, 2018, +*Blog post*: [https://schuttejoe.github.io/post/ggximportancesamplingpart1/](https://schuttejoe.github.io/post/ggximportancesamplingpart1/). +
+@anchor Colbert07 **[Colbert07]** + +Mark Colbert, Jaroslav Krivanek, "GPU-Based Importance Sampling", *NVIDIA GPU Gems 3*, Chapter 20, 2007. +
+@anchor Guy18 **[Guy18]** + +Romain Guy, Mathias Agopian, "Physically Based Rendering in Filament", *Part of Google's Filament project documentation*: +[https://google.github.io/filament/](https://google.github.io/filament/Filament.md.html) +
+@anchor Aguilar17 **[Aguilar17]** + +Orlando Aguilar, "Spherical Harmonics", *Blog post*: +[http://orlandoaguilar.github.io/sh/spherical/harmonics/irradiance/map/2017/02/12/SphericalHarmonics.html](http://orlandoaguilar.github.io/sh/spherical/harmonics/irradiance/map/2017/02/12/SphericalHarmonics.html) +
+@anchor Ramamoorthi01 **[Ramamoorthi01]** + +Ravi Ramamoorthi, Pat Hanrahan, "An Efficient Representation for Irradiance Environment Maps", +*SIGGRAPH '01: Proceedings of the 28th annual conference on Computer graphics and interactive techniques*, August 2001, pp. 497-500 +
diff -Nru opencascade-7.4.1+dfsg1/dox/specification/specification.md opencascade-7.5.1+dfsg1/dox/specification/specification.md --- opencascade-7.4.1+dfsg1/dox/specification/specification.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/specification/specification.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,8 @@ +Specifications {#specification} +============= + +This chapter contains the detailed specifications infomation: + +* @subpage specification__boolean_operations "Boolean Operations" +* @subpage specification__brep_format "BRep Format" +* @subpage specification__pbr_math "PBR math (rasterization)" \ No newline at end of file Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/0001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/0001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/0002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/0002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/0003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/0003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/0004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/0004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/0008.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/0008.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/0012.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/0012.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/0013.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/0013.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/0014.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/0014.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/technical_overview_occt_logo.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/technical_overview_occt_logo.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/technical_overview_over.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/technical_overview_over.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/technical_overview/images/technical_overview_schema.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/technical_overview/images/technical_overview_schema.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/technical_overview/technical_overview.md opencascade-7.5.1+dfsg1/dox/technical_overview/technical_overview.md --- opencascade-7.4.1+dfsg1/dox/technical_overview/technical_overview.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/technical_overview/technical_overview.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,315 +0,0 @@ -Technical Overview {#technical_overview} -======================================== - -@tableofcontents - -Open CASCADE Technology (OCCT) is an object-oriented C++ class library designed for rapid production of sophisticated domain-specific CAD/CAM/CAE applications. - -A typical application developed using OCCT deals with two or three-dimensional (2D or 3D) geometric modeling -in general-purpose or specialized Computer Aided Design (CAD) systems, manufacturing -or analysis applications, simulation applications, or even illustration tools. - -@figure{/technical_overview/images/technical_overview_over.png} - -OCCT library is designed to be truly modular and extensible, providing C++ classes for: - * Basic data structures (geometric modeling, visualization, interactive selection and application specific services); - * Modeling algorithms; - * Working with mesh (faceted) data; - * Data interoperability with neutral formats (IGES, STEP); - -The C++ classes and other types are grouped into packages. Packages are organized into toolkits (libraries), to which you can link your application. Finally, toolkits are grouped into seven modules. - -This modular structure is illustrated in the diagram below. - -@figure{/technical_overview/images/technical_overview_schema.png} - -* @ref OCCT_TOVW_SECTION_2 "Foundation Classes" module underlies all other OCCT classes; -* @ref OCCT_TOVW_SECTION_3 "Modeling Data" module supplies data structures to represent 2D and 3D geometric primitives and their compositions into CAD models; -* @ref OCCT_TOVW_SECTION_4 "Modeling Algorithms" module contains a vast range of geometrical and topological algorithms; -* @ref OCCT_TOVW_SECTION_4a "Mesh" module implements tessellated representations of objects; -* @ref OCCT_TOVW_SECTION_5 "Visualization" module provides complex mechanisms for graphical data representation; -* @ref OCCT_TOVW_SECTION_6 "Data Exchange" module inter-operates with popular data formats and relies on @ref OCCT_TOVW_SECTION_6a "Shape Healing" to improve compatibility between CAD software of different vendors; -* @ref OCCT_TOVW_SECTION_7 "Application Framework" module offers ready-to-use solutions for handling application-specific data (user attributes) and commonly used functionality (save/restore, undo/redo, copy/paste, tracking CAD modifications, etc). - -In addition, @ref OCCT_TOVW_SECTION_8 "Open CASCADE Test Harness", also called Draw, provides an entry point to the library and can be used as a testing tool for its modules. - -@section OCCT_TOVW_SECTION_2 Foundation Classes - -**Foundation Classes** module contains data structures and services used by higher-level Open CASCADE Technology classes: - - * Primitive types, such as Boolean, Character, Integer or Real; - * String classes that handle ASCII and Unicode strings; - * Collection classes that handle statically or dynamically sized aggregates of data, such as arrays, lists, queues, sets and hash tables (data maps). - * Classes providing commonly used numerical algorithms and basic linear algebra calculations (addition, multiplication, transposition of vectors and matrices, solving linear systems etc). - * Fundamental types representing physical quantities and supporting date and time information; - * Primitive geometry types providing implementation of basic geometric and algebraic entities that define and manipulate elementary data structures. - * Exception classes that describe situations, when the normal execution of program is abandoned; - -This module also provides a variety of general-purpose services, such as: - * Safe handling of dynamically created objects, ensuring automatic deletion of unreferenced objects (smart pointers); - * Configurable optimized memory manager increasing the performance of applications that intensively use dynamically created objects; - * Extended run-time type information (RTTI) mechanism maintaining a full type hierarchy and providing means to iterate over it; - * Encapsulation of C++ streams; - * Automated management of heap memory by means of specific allocators; - * Basic interpreter of expressions facilitating the creation of customized scripting tools, generic definition of expressions, etc.; - * Tools for dealing with configuration resource files and customizable message files facilitating multi-language support in applications; - * Progress indication and user break interfaces, giving a possibility even for low-level algorithms to communicate with the user in a universal and convenient way; - * and many others... - -See the details in @ref occt_user_guides__foundation_classes "Foundation Classes User's Guide" - -See also: our E-learning & Training offerings. - -@section OCCT_TOVW_SECTION_3 Modeling Data - -**Modeling Data** supplies data structures to implement boundary representation (BRep) of objects in 3D. In BRep the shape is represented as an aggregation of geometry within topology. The geometry is understood as a mathematical description of a shape, e.g. as curves and surfaces (simple or canonical, Bezier, NURBS, etc). The topology is a data structure binding geometrical objects together. - -Geometry types and utilities provide geometric data structures and services for: - * Description of points, vectors, curves and surfaces: - * their positioning in 3D space using axis or coordinate systems, and - * their geometric transformation, by applying translations, rotations, symmetries, scaling transformations and combinations thereof. - * Creation of parametric curves and surfaces by interpolation and approximation; - * Algorithms of direct construction; - * Conversion of curves and surfaces to NURBS form; - * Computation of point coordinates on 2D and 3D curves; - * Calculation of extrema between geometric objects. - -Topology defines relationships between simple geometric entities. A shape, which is a basic topological entity, can be divided into components (sub-shapes): - * Vertex -- a zero-dimensional shape corresponding to a point; - * Edge -- a shape corresponding to a curve and bounded by a vertex at each extremity; - * Wire -- a sequence of edges connected by their vertices; - * Face -- a part of a plane (in 2D) or a surface (in 3D) bounded by wires; - * Shell -- a collection of faces connected by edges of their wire boundaries; - * Solid -- a finite closed part of 3D space bounded by shells; - * Compound solid -- a collection of solids connected by faces of their shell boundaries. - -Complex shapes can be defined as assemblies of simpler entities. - -See the details in @ref occt_user_guides__modeling_data "Modeling Data User's Guide" - -3D geometric models can be stored in OCCT native BREP format. -See @ref occt_user_guides__brep_wp "BREP Format Description White Paper" for details on the format. - -See also: our E-learning & Training offerings. - -@section OCCT_TOVW_SECTION_4 Modeling Algorithms - -**Modeling Algorithms** module groups a wide range of topological and geometric algorithms used in geometric modeling. Basically, there are two groups of algorithms in Open CASCADE Technology: -* High-level modeling routines used in the real design; -* Low-level mathematical support functions used as a groundwork for the modeling API; - -* Low-level geometric tools provide the algorithms, which: - * Calculate the intersection of two curves, surfaces, or a curve and a surface; - * Project points onto 2D and 3D curves, points onto surfaces and 3D curves onto surfaces; - * Construct lines and circles from constraints; - * Construct free-form curves and surfaces from constraints (interpolation, approximation, skinning, gap filling, etc); - -* Low-level topological tools provide the algorithms, which: - * Tessellate shapes; - * Check correct definition of shapes; - * Determine the local and global properties of shapes (derivatives, mass-inertia properties, etc); - * Perform affine transformations; - * Find planes in which edges are located; - * Convert shapes to NURBS geometry; - * Sew connected topologies (shells and wires) from separate topological elements (faces and edges). - -Top-level API provides the following functionality: - -* Construction of Primitives: - * Boxes; - * Prisms; - * Cylinders; - * Cones; - * Spheres; - * Toruses. -* Kinematic Modeling: - * Prisms -- linear sweeps; - * Revolutions -- rotational sweeps; - * Pipes -- general-form sweeps; - * Lofting. - -@figure{/technical_overview/images/0001.png "Shapes containing pipes with variable radius produced by sweeping"} - -* Boolean Operations, which allow creating new shapes from the combinations of source shapes. For two shapes *S1* and *S2*: - * *Common* contains all points that are in *S1* and *S2*; - * *Fuse* contains all points that are in *S1* or *S2*; - * *Cut* contains all points in that are in *S1* and not in *S2* - -See @ref occt_user_guides__boolean_operations "Boolean Operations" User's Guide for detailed documentation. - -* Algorithms for local modifications such as: - * Hollowing; - * Shelling; - * Creation of tapered shapes using draft angles; - * Algorithms to make fillets and chamfers on shape edges, including those with variable radius (chord). - -* Algorithms for creation of mechanical features, i.e. depressions, protrusions, ribs and grooves or slots along planar or revolution surfaces. - -@figure{/technical_overview/images/0004.png} - -See the details in @ref occt_user_guides__modeling_algos "Modeling Algorithms User's Guide". - -See also: our E-learning & Training offerings. - -@section OCCT_TOVW_SECTION_4a Mesh - -**Mesh** module provides the functionality to work with tessellated representations of objects in form of triangular facets. This module contains: -- data structures to store surface mesh data associated to shapes and basic algorithms to handle them; -- data structures and algorithms to a build triangular surface mesh from *BRep* objects (shapes); -- tools for displaying meshes with associated pre- and post-processor data (scalars or vectors). - -Open CASCADE Technology includes two mesh converters: -- VRML converter translates Open CASCADE shapes to VRML 1.0 files (Virtual Reality Modeling Language). Two representation modes are possible: shaded, which presents shapes as sets of triangles computed by the mesh algorithm, or wireframe, which presents shapes as sets of curves. -- STL converter translates Open CASCADE shapes to STL files. STL (STtereoLithography) format is widely used for rapid prototyping (3D printing). - -Open CASCADE SAS also offers Advanced Mesh Products: -- Open CASCADE Mesh Framework (OMF) -- Express Mesh - -@figure{/technical_overview/images/0003.png} - -@section OCCT_TOVW_SECTION_5 Visualization - -**Visualization** module provides ready-to-use algorithms to create graphic presentations from various objects: shapes, meshes, etc. - -In Open CASCADE Technology visualization is based on the separation of CAD data and its graphical presentation. The presentations can be customized to take the specificity of your application into account. - -The module also supports a fast and powerful interactive selection mechanism. - -The view facilities provided by OCCT range from low-level tools working with basic geometry and topology (such as NURBS visualization with control points and nodes, rendering of isolines to estimate speed and quality of parameterization, or rendering of a parametric profile of edges) to high-level tools for real time quality rendering of models using ray tracing: shades, reflections, transparency, anti-aliasing, etc. - -Here are just a few examples: - -* Camera-driven view projection and orientation. It is possible to choose between perspective, orthographic and stereographic projection. - -* Real-time ray tracing technique using recursive Whitted's algorithm and Bounded Volume Hierarchy effective optimization structure. - -@figure{/technical_overview/images/0002.png, "Real time visualization by ray tracing method"} - -* Support of GLSL shaders. The shader management is fully automatic, like with any other OpenGL resource. - -@figure{/technical_overview/images/0013.png, "Fragment shader implementing custom clipping surface"} - -* Support of standard and custom materials, defined by transparency, diffuse, ambient and specular reflection and refraction index. The latter allows implementing transparent materials, such as glass, diamond and water. - -@figure{/technical_overview/images/0012.png, "Simulation of a glass cover"} - -* Optimization of rendering performance through the algorithms of: - * View frustum culling, which skips the presentation outside camera at the rendering stage and - * Back face culling, which reduces the rendered number of triangles and eliminates artifacts at shape boundaries. - -* Definition of clipping planes through the plane equation coefficients. Ability to define visual attributes for cross-section at the level or individual clipping planes. In the image below different parts of the rocket are clipped with different planes and hatched. - -* Possibility to flexibly adjust appearance of dimensions in a 3D view. The 3D text object represents a given text string as a true 3D object in the model space. - -@figure{/technical_overview/images/0008.png, "Display of shape cross-section and dimensions"} - -For more details, see @ref occt_user_guides__visualization "Visualization User's Guide". - -The visualization of OCCT topological shapes by means of VTK library provided by VIS component is described in a separate @ref occt_user_guides__vis "VTK Integration Services" User's Guide. - -See also: our E-learning & Training offerings. - - -@section OCCT_TOVW_SECTION_6 Data Exchange - -**Data Exchange** allows developing OCCT-based applications that can interact with other CAD systems by writing and reading CAD models to and from external data. The exchanges run smoothly regardless of the quality of external data or requirements to its internal representation, for example, to the data types, accepted geometric inaccuracies, etc. - -@figure{/technical_overview/images/0014.png,"Shape imported from STEP"} - -**Data Exchange** is organized in a modular way as a set of interfaces that comply with various CAD formats: IGES, STEP, STL, VRML, etc. The interfaces allow software based on OCCT to exchange data with various CAD/PDM software packages, maintaining a good level of interoperability. - -* **Standardized Data Exchange** interfaces allow querying and examining the input file, converting its contents to a CAD model and running validity checks on a fully translated shape. The following formats are currently supported. - * @ref occt_user_guides__step "STEP" (AP203 : Mechanical Design, this covers General 3D CAD; AP214: Automotive Design) - * @ref occt_user_guides__iges "IGES" (up to 5.3) - * glTF, OBJ, VRML and STL meshes. -* @ref occt_user_guides__xde "Extended data exchange" (XDE) allows translating additional attributes attached to geometric data (colors, layers, names, materials etc). -* Advanced Data Exchange Components are available in addition to standard Data Exchange interfaces to support interoperability and data adaptation (also using @ref OCCT_TOVW_SECTION_6a "Shape Healing") with CAD software using the following proprietary formats: - * ACIS SAT - * Parasolid - * DXF - * IFC - * JT - -These components are based on the same architecture as interfaces with STEP and IGES. - -@section OCCT_TOVW_SECTION_6a Shape Healing - -**Shape Healing** library provides algorithms to correct and adapt the geometry and topology of shapes imported to OCCT from other CAD systems. - -Shape Healing algorithms include, but are not limited to, the following operations: -* analyze shape characteristics and, in particular, identify the shapes that do not comply with OCCT geometry and topology validity rules by analyzing geometrical objects and topology: - - check edge and wire consistency; - - check edge order in a wire; - - check the orientation of face boundaries; - - analyze shape tolerances; - - identify closed and open wires in a boundary. -* fix incorrect or incomplete shapes: - - provide consistency between a 3D curve and its corresponding parametric curve; - - repair defective wires; - - fit the shapes to a user-defined tolerance value; - - fill gaps between patches and edges. -* upgrade and change shape characteristics: - - reduce curve and surface degree; - - split shapes to obtain C1 continuity; - - convert any types of curves or surfaces to Bezier or B-Spline curves or surfaces and back; - - split closed surfaces and revolution surfaces. - -Each sub-domain of Shape Healing has its own scope of functionality: - -| Sub-domain | Description | Impact on the shape | -| :--- | :---- | :---- | -| Analysis | Explores shape properties, computes shape features, detects violation of OCCT requirements. | The shape itself is not modified. | -| Fixing | Fixes the shape to meet the OCCT requirements. | The shape may change its original form: modification, removal or creation of sub-shapes, etc.) | -| Upgrade | Improves the shape to fit some particular algorithms. | The shape is replaced with a new one, but geometrically they are the same. | -| Customization | Modifies the shape representation to fit specific needs. | The shape is not modified, only the mathematical form of its internal representation is changed. | -| Processing | Mechanism of shape modification via a user-editable resource file. | | - -For more details, refer to @ref occt_user_guides__shape_healing "Shape Healing User's guide". - -See also: our E-learning & Training offerings. - - -@section OCCT_TOVW_SECTION_7 Application Framework - -**Open CASCADE Application Framework** (OCAF) handles Application Data basing on the Application/Document paradigm. It uses an associativity engine to simplify the development of a CAD application thanks to the following ready-to-use features and services: - -* Data attributes managing the application data, which can be organized according to the development needs; -* Data storage and persistence (open/save); -* Possibility to modify and recompute attributes in documents. With OCAF it is easy to represent the history of modification and parametric dependencies within your model; -* Possibility to manage multiple documents; -* Predefined attributes common to CAD/CAM/CAE applications (e.g. to store dimensions); -* Undo-Redo and Copy-Paste functions. - -Since OCAF handles the application structure, the only development task is the creation of application-specific data and GUIs. - -OCAF differs from any other CAD framework in the organization of application data, as there the data structures are based on reference keys rather than on shapes. In a model, such attributes as shape data, color and material are attached to an invariant structure, which is deeper than the shapes. A shape object becomes the value of *Shape* attribute, in the same way as an integer number is the value of *Integer* attribute and a string is the value of *Name* attribute. - -OCAF organizes and embeds these attributes in a document. OCAF documents, in their turn, are managed by an OCAF application. - -For more details, see @ref occt_user_guides__ocaf "OCAF User's Guide". - -See also: our E-learning & Training offerings. - - -@section OCCT_TOVW_SECTION_8 Draw Test Harness - -**Test Harness** or **Draw** is a convenient testing tool for OCCT libraries. It can be used to test and prototype various algorithms before building an entire application. It includes: -- A command interpreter based on the TCL language; -- A number of 2D and 3D viewers; -- A set of predefined commands. - -The viewers support operations such as zoom, pan, rotation and full-screen views. - -The basic commands provide general-purpose services such as: -- Getting help; -- Evaluating a script from a file; -- Capturing commands in a file; -- Managing views; -- Displaying objects. - -In addition, **Test Harness** provides commands to create and manipulate curves and surfaces (geometry) and shapes, access visualization services, work with OCAF documents, perform data exchange, etc. - -You can add custom commands to test or demonstrate any new functionalities, which you develop. - -For more details, see @ref occt_user_guides__test_harness "Draw Test Harness Manual". Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image011.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image011.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image012.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image012.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image013.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image013.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image014.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image014.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image015.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image015.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image016.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image016.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image017.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image017.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/tutorial/images/tutorial_image018.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/tutorial/images/tutorial_image018.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/upgrade/upgrade.md opencascade-7.5.1+dfsg1/dox/upgrade/upgrade.md --- opencascade-7.4.1+dfsg1/dox/upgrade/upgrade.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/upgrade/upgrade.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2158 @@ +Upgrade from older OCCT versions {#occt__upgrade} +================================ + +@tableofcontents + +@section upgrade_intro Introduction + +This document provides technical details on changes made in particular versions of OCCT. It can help to upgrade user applications based on previous versions of OCCT to newer ones. + +@subsection upgrade_intro_precautions Precautions + +Back-up your code before the upgrade. +We strongly recommend using version control system during the upgrade process and saving one or several commits at each step of upgrade, until the overall result is verified. +This will facilitate identification and correction of possible problems that can occur at the intermediate steps of upgrade. +It is advisable to document each step carefully to be able to repeat it if necessary. + +@subsection upgrade_intro_disclaim Disclaimer + +This document describes known issues that have been encountered during porting of OCCT and some applications and approaches that have helped to resolve these issues in known cases. +It does not pretend to cover all possible migration issues that can appear in your application. +Take this document with discretion; apply your expertise and knowledge of your application to ensure the correct result. + +The automatic upgrade tool is provided as is, without warranty of any kind, and we explicitly disclaim any liability for possible errors that may appear due to use of this tool. +It is your responsibility to ensure that the changes you made in your code are correct. +When you upgrade the code by an automatic script, make sure to carefully review the introduced changes at each step before committing them. + + +@section upgrade_65 Upgrade to OCCT 6.5.0 + +Porting of user applications from an earlier OCCT version to version 6.5 requires taking into account the following major changes: +* If you are not comfortable with dependence on Intel TBB, FreeImage, or Gl2Ps libraries, you will need to (re)build OCCT with these dependencies disabled. +* The low-level format version of OCAF binary and XML persistence has been incremented. Hence, the files saved by OCCT 6.5 to OCAF binary or XML format will not be readable by previous versions of OCCT. +* The *BRepMesh* triangulation algorithm has been seriously revised and now tries hard to fulfill the requested deflection and angular tolerance parameters. If you experience any problems with performance or triangulation quality (in particular, display of shapes in shading mode), consider revising the values of these parameters used in your application. +* If you were using method *ToPixMap()* of class *V3d_View* to get a buffer for passing to Windows API functions (e.g. *BitBlt*), this will not work anymore. You will need to use method *Image_PixMap::AccessBuffer()* to get the raw buffer data that can be further passed to WinAPI functions. +* As the processing of message gravity parameter in *Message* package has been improved, some application messages (especially the ones generated by IGES or STEP translators) can be suppressed or new messages appear in the application. Use relevant message level parameter to tune this behavior. + +@section upgrade_651 Upgrade to OCCT 6.5.1 + +Porting of user applications from an earlier OCCT version to version 6.5.1 requires taking into account the following major changes: + +* Method *Graphic3d_Structure::Groups()* now returns *Graphic3d_SequenceOfGroup*. If this method has been used, the application code should be updated to iterate another collection type or, if *Graphic3d_HSetOfGroup* is required, to fill its own collection: +~~~~ +const Graphic3d_SequenceOfGroup& aGroupsSeq = theStructure.Groups(); +Handle(Graphic3d_HSetOfGroup) aGroupSet = new Graphic3d_HSetOfGroup(); +Standard_Integer aLen = aGroupsSeq.Length(); +for (Standard_Integer aGr = 1; aGr <= aLen; ++aGr) +{ + aGroupSet->Add (aGroupsSeq.Value (aGr)); +} +~~~~ + +* All occurrences of *Select3D_Projector* in the application code (if any) should be replaced with *Handle(Select3D_Projector)*. +* The code of inheritors of *Select3D_SensitiveEntity* should be updated if they override Matches() (this is probable, if clipping planes are used). +* Constructor for *V3d_Plane* has been changed, so the extra argument should be removed if used in the application. It is necessary to add a new plane using method *V3d_Viewer::AddPlane()* if *V3d_Viewer* has been used to manage clipping planes list (this does not affect clipping planes representation). Have a look at the source code for new DRAWEXE *vclipplane* command in *ViewerTest_ObjectsCommands.cxx, VClipPlane* to see how clipping planes can be managed in the application. + +@section upgrade_652 Upgrade to OCCT 6.5.2 + +Porting of user applications from an earlier OCCT version to version 6.5.2 requires taking into account the following major changes: +* Any code that has been generated by WOK from CDL generic classes *Tcollection_DataMap* and *Tcollection_IndexedDataMap* needs to be regenerated by WOK to take into account the change in the interface of these classes. +* The enumerations *CDF_StoreStatus* and *CDF_RetrievableStatus* have been replaced by the enumerations *PCDM_StoreStatus* and *PCDM_ReaderStatus*. Correspondingly, the methods *Open, Save* and *SaveAs* of the class *TDocStd_Application* have changed their return value. Any code, which uses these enumerations, needs to be updated. +* *BRepLib_MakeFace* has been modified to receive tolerance value for resolution of degenerated edges. This tolerance parameter has no default value to ensure that the client code takes care of passing a meaningful value, not just *Precision::Confusion*, so some porting overheads are expected. +* If the callback mechanism in call_togl_redraw function was used in the application code, it is necessary to revise it to take into account the new callback execution and provide a check of reason value of Aspect_GraphicCallbackStruct in callback methods to confirm that the callback code is executed at the right moment. Now the callbacks are executed before redrawing the underlayer, before redrawing the overlayer and at the end of redrawing. The information about the moment when the callback is invoked is provided with the reason value in form of an additional bit flag (OCC_PRE_REDRAW, OCC_PRE_OVERLAY). The state of OpenGl changed in callback methods will not be restored automatically, which might lead to unwanted behavior in redrawing procedure. +* The print method used in the application code might need to be revised to take into account the ability to choose between print algorithms: tile and stretch. The stretch algorithm will be selected by default during porting. +* It is recommended to *BRepMesh_DiscretFactory* users, to check *BRepMesh_DiscretFactory::SetDefault()* return value to determine plugin availability / validity. *BRepMesh_DiscretFactory::Discret()* method now returns handle instead of pointer. The code should be updated in the following manner: +~~~~ +Handle(BRepMesh_DiscretRoot) aMeshAlgo = BRepMesh_DiscretFactory::Get().Discret (theShape, theDeflection, theAngularToler); + if (!aMeshAlgo.IsNull()) {} +~~~~ + +* The default state of *BRepMesh* parallelization has been turned off. The user should switch this flag explicitly: + * by using methods *BRepMesh_IncrementalMesh::SetParallel(Standard_True)* for each *BRepMesh_IncrementalMesh* instance before Perform(); + * by calling *BRepMesh_IncrementalMesh::SetParallelDefault(Standard_True)* when *BRepMesh_DiscretFactory* is used to retrieve the meshing tool (this also affects auto-triangulation in *AIS*). + +@section upgrade_653 Upgrade to OCCT 6.5.3 + +Porting of user applications from an earlier OCCT version to version 6.5.3 requires taking into account the following major changes: +* As a result of code clean-up and redesign of *TKOpenGl* driver, some obsolete functions and rendering primitives (TriangleMesh, TriangleSet, Bezier, Polyline, Polygon, PolygonHoles, QuadrangleMesh and *QuadrangleSet*) have been removed. Instead, the application developers should use primitive arrays that provide the same functionality but are hardware-accelerated. The details can be found in OCCT Visualization User's Guide, “Primitive Arrays†chapter. +* Applications should not call *AIS_InteractiveObject::SetPolygonOffsets()* method for an instance of *AIS_TexturedShape* class after it has been added to *AIS_InteractiveContext*. More generally, modification of *Graphic3d_AspectFillArea3d* parameters for the computed groups of any *AIS_InteractiveObject* subclass that uses texture mapping should be avoided, because this results in broken texture mapping (see issue 23118). It is still possible to apply non-default polygon offsets to *AIS_TexturedShape* by calling *SetPolygonOffsets()* before displaying the shape. +* The applications that might have used internal functions provided by *TKOpenGl* or removed primitives will need to be updated. +* In connection with the implementation of Z-layers it might be necessary to revise the application code or revise the custom direct descendant classes of *Graphic3d_GraphicDriver* and *Graphic3d_StructureManager* to use the Z-layer feature. +* Global variables *Standard_PI* and *PI* have been eliminated (use macro *M_PI* instead). +* Method *HashCode()* has been removed from class *Standard_Transient*. It is advisable to use global function HashCode() for Handle objects instead. +* Declaration of operators new/delete for classes has become consistent and is encapsulated in macros. +* Memory management has been changed to use standard heap (MMGT_OPT=0) and reentrant mode (MMGT_REENTRANT=1) by default. +* Map classes in *NCollection* package now receive one more argument defining a hash tool. + +@section upgrade_654 Upgrade to OCCT 6.5.4 + +Porting of user applications from an earlier OCCT version to version 6.5.4 requires taking into account the following major changes: +* The code using obsolete classes *Aspect_PixMap, Xw_PixMap* and *WNT_PixMap* should be rewritten implementing class *Image_PixMap*, which is now retrieved by *ToPixMap* methods as argument. A sample code using *ToPixMap* is given below: +~~~~ +#include +void dump (Handle(V3d_View)& theView3D) +{ + Standard_Integer aWndSizeX = 0; + Standard_Integer aWndSizeY = 0; + theView3D->Window()->Size (aWndSizeX, aWndSizeY); + Image_AlienPixMap aPixMap; + theView3D->ToPixMap (aPixMap, aWndSizeX, aWndSizeY); + aPixMap.Save ("c:\\image.png"); +} +~~~~ +* Now OpenGL resources related to Interactive Objects are automatically freed when the last view (window) is removed from graphical driver. +To avoid presentation data loss, the application should replace an old view with a new one in the proper order: first the new view is created and activated and only then the old one is detached and removed. +* It is recommended to use *NCollection* containers with hasher parameter (introduced in 6.5.3) instead of global definition IsEqual()/HashCode() as well as to use explicit namespaces to avoid name collision. + + +@section upgrade_660 Upgrade to OCCT 6.6.0 + +Porting of user applications from an earlier OCCT version to version 6.6.0 requires taking into account the following major changes: +* Due to the changes in the implementation of Boolean Operations, the order of sub-shapes resulting from the same operation performed with OCCT 6.5.x and OCCT 6.6.0 can be different. +It is necessary to introduce the corresponding changes in the applications for which the order of sub-shapes resulting from a Boolean operation is important. It is strongly recommended to use identification methods not relying on the order of sub-shapes (e.g. OCAF naming). +* If you need to use OCCT on Mac OS X with X11 (without Cocoa), build OCCT with defined pre-processor macro *CSF_MAC_USE_GLX11*. XLib front-end (previously the only way for unofficial OCCT builds on Mac OS X) is now disabled by default on this platform. If your application has no support for Cocoa framework you may build OCCT with XLib front-end adding *MACOSX_USE_GLX* macro to compiler options (you may check the appropriate option in WOK configuration GUI and in CMake configuration). Notice that XQuartz (XLib implementation for Mac OS X) now is an optional component and does not provide a sufficient level of integrity with native (Cocoa-based) applications in the system. It is not possible to build OCCT with both XLib and Cocoa at the same time due to symbols conflict in OpenGL functions. +* Animation mode and degeneration presentation mode (simplified presentation for animation) and associated methods have been removed from 3D viewer functionality. +Correspondingly, the code using methods *SetAnimationModeOn(), SetAnimationModeOff(), AnimationModeIsOn(), AnimationMode(), Tumble(), SetDegenerateModeOn(), SetDegenerateModeOff()* and *DegenerateModeIsOn()* of classes *V3d_View* and *Visual3d_View* will need to be removed or redesigned. Hidden Line Removal presentation was not affected; however, the old code that used methods *V3d_View::SetDegenerateModeOn* or *V3d_View::SetDegenerateModeOff* to control HLR presentation should be updated to use *V3d_View::SetComputedMode* method instead. +* Calls of *Graphic3d_Group::BeginPrimitives()* and *Graphic3d_Group::EndPrimitives()* should be removed from the application code. +* Application functionality for drawing 2D graphics that was formerly based on *TKV2d* API should be migrated to *TKV3d* API. The following changes are recommended for this migration: + * A 2D view can be implemented as a *V3d_View* instance belonging to *V3d_Viewer* managed by *AIS_InteractiveContext* instance. To turn *V3d_View* into a 2D view, the necessary view orientation should be set up at the view initialization stage using *V3d_View::SetProj()* method, and view rotation methods simply should not be called. + * Any 2D graphic entity (formerly represented with *AIS2D_InteractiveObject*) should become a class derived from *AIS_InteractiveObject* base. These entities should be manipulated in a view using *AIS_InteractiveContext* class API. + * All drawing code should be put into *Compute()* virtual method of a custom interactive object class and use API of *Graphic3d* package. In particular, all geometry should be drawn using class hierarchy derived from *Graphic3d_ArrayOfPrimitives*. Normally, the Z coordinate for 2D geometry should be constant, unless the application implements some advanced 2D drawing techniques like e.g. multiple "Z layers" of drawings. + * Interactive selection of 2D presentations should be set up inside *ComputeSelection()* virtual method of a custom interactive object class, using standard sensitive entities from *Select3D* package and standard or custom entity owners derived from *SelectMgr_EntityOwner* base. +Refer to the Visualization User's Guide for further details concerning OCCT 3D visualization and selection classes. See also *Viewer2D* OCCT sample application, which shows how 2D drawing can be implemented using TKV3d API. +* Run-time graphic driver library loading mechanism based on *CSF_GraphicShr* environment variable usage has been replaced by explicit linking against *TKOpenGl* library. The code sample below shows how the graphic driver should be created and initialized in the application code: +~~~~ +// initialize a new viewer with OpenGl graphic driver +Handle(Graphic3d_GraphicDriver) aGraphicDriver = +new OpenGl_GraphicDriver ("TKOpenGl"); + aGraphicDriver->Begin (new Aspect_DisplayConnection()); + TCollection_ExtendedString aNameOfViewer ("Visu3D"); + Handle(V3d_Viewer) aViewer += new V3d_Viewer (aGraphicDriver, aNameOfViewer.ToExtString()); + aViewer->Init(); + +// create a new window or a wrapper over the existing window, +// provided by a 3rd-party framework (Qt, MFC, C# or Cocoa) +#if defined(_WIN32) || defined(__WIN32__) + Aspect_Handle aWindowHandle = (Aspect_Handle )winId(); + Handle(WNT_Window) aWindow = new WNT_Window (winId()); +#elif defined(__APPLE__) && !defined(MACOSX_USE_GLX) + NSView* aViewHandle = (NSView* )winId(); + Handle(Cocoa_Window) aWindow = new Cocoa_Window (aViewHandle); +#else + Aspect_Handle aWindowHandle = (Aspect_Handle )winId(); + Handle(Xw_Window) aWindow = + new Xw_Window (aGraphicDriver->GetDisplayConnection(), aWindowHandle); +#endif // WNT + +// setup the window for a new view + Handle(V3d_View) aView = aViewer->CreateView(); + aView->SetWindow (aWindow); +~~~~ + +* The following changes should be made in the application-specific implementations of texture aspect: + * *Graphic3d_TextureRoot* inheritors now should return texture image by overloading of *Graphic3d_TextureRoot::GetImage()* method instead of the old logic. + * Now you can decide if the application should store the image copy as a field of property or reload it dynamically each time (to optimize the memory usage). The default implementation (which loads the image content from the provided file path) does not hold an extra copy since it will be uploaded to the graphic memory when first used. + * Notice that the image itself should be created within *Image_PixMap* class from *AlienImage* package, while *Image_Image* class is no more supported and will be removed in the next OCCT release. + +@section upgrade_670 Upgrade to OCCT 6.7.0 + +Porting of user applications from an earlier OCCT version to version 6.7.0 requires taking into account the following major changes. + +@subsection upgrade_670_clipping Object-level clipping and capping algorithm. + +* It might be necessary to revise and port code related to management of view-level clipping to use *Graphic3d_ClipPlane* instead of *V3d_Plane* instances. Note that *V3d_Plane* class has been preserved -- as previously, it can be used as plane representation. Another approach to represent *Graphic3d_ClipPlane* in a view is to use custom presentable object. +* The list of arguments of *Select3D_SensitiveEntity::Matches()* method for picking detection has changed. Since now, for correct selection clipping, the implementations should perform a depth clipping check and return (as output argument) minimum depth value found at the detected part of sensitive. Refer to CDL / Doxygen documentation to find descriptive hints and snippets. +* *Select3D_SensitiveEntity::ComputeDepth()* abstract method has been removed. Custom implementations should provide depth checks by method *Matches()* instead -- all data required for it is available within a scope of single method. +* It might be necessary to revise the code of custom sensitive entities and port *Matches()* and *ComputeDepth()* methods to ensure proper selection clipping. Note that obsolete signature of *Matches* is not used anymore by the selector. If your class inheriting *Select3D_SensitiveEntity* redefines the method with old signature the code should not compile as the return type has been changed. This is done to prevent override of removed methods. + +@subsection upgrade_670_markers Redesign of markers presentation + +* Due to the redesign of *Graphic3d_AspectMarker3d* class the code of custom markers initialization should be updated. Notice that you can reuse old markers definition code as *TColStd_HArray1OfByte*; however, *Image_PixMap* is now the preferred way (and supports full-color images on modern hardware). +* Logics and arguments of methods *AIS_InteractiveContext::Erase()* and *AIS_InteractiveContext::EraseAll()* have been changed. Now these methods do not remove resources from *Graphic3d_Structure*; they simply change the visibility flag in it. Therefore, the code that deletes and reÑomputes resources should be revised. +* *Graphic3d_Group::MarkerSet()* has been removed. *Graphic3d_Group::AddPrimitiveArray()* should be used instead to specify marker(s) array. + +@subsection upgrade_670_views Default views are not created automatically + +As the obsolete methods *Init(), DefaultOrthographicView()* and *DefaultPerspectiveView()* have been removed from *V3d_Viewer* class, the two default views are no longer created automatically. It is obligatory to create *V3d_View* instances explicitly, either directly by operator new or by calling *V3d_Viewer::CreateView()*. + +The call *V3d_Viewer::SetDefaultLights()* should also be done explicitly at the application level, if the application prefers to use the default light source configuration. Otherwise, the application itself should set up the light sources to obtain a correct 3D scene. + +@subsection upgrade_670_dimensions Improved dimensions implementation + +* It might be necessary to revise and port code related to management of *AIS_LengthDimension, AIS_AngleDimension* and *AIS_DiameterDimension* presentations. There is no more need to compute value of dimension and pass it as string to constructor argument. The value is computed internally. The custom value can be set with *SetCustomValue()* method. +* The definition of units and general aspect properties is now provided by *Prs3d_DimensionUnits* and *Prs3d_DimensionApsect* classes. +* It might be also necessary to revise code of your application related to usage of *AIS_DimensionDisplayMode enumeration*. If it used for specifying the selection mode, then it should be replaced by a more appropriate enumeration *AIS_DimensionSelectionMode*. + +@subsection upgrade_670_list_collection NCollection_Set replaced by List collection + +It might be necessary to revise your application code, which uses non-ordered *Graphic3d_SetOfHClipPlane* collection type and replace its occurrences by ordered *Graphic3d_SequenceOfHClipPlane* collection type. + + +@section upgrade_680 Upgrade to OCCT 6.8.0 + +Porting of user applications from an earlier OCCT version to version 6.8.0 requires taking into account the following major changes. + +@subsection upgrade_680_ncollection Changes in NCollection classes + +Method *Assign()* in *NCollection* classes does not allow any more copying between different collection types. Such copying should be done manually. + +List and map classes in *NCollection* package now require that their items be copy-constructible, but do not require items to have default constructor. Thus the code using *NCollection* classes for non-copy-constructible objects needs be updated. One option is to provide copy constructor; another possibility is to use Handle or other smart pointer. + +@subsection upgrade_680_view_camera 3D View Camera + +If *ViewMapping* and *ViewOrientation* were used directly, this functionality has to be ported to the new camera model. The following methods should be considered as an alternative to the obsolete *Visual3d* services (all points and directions are supposed to be in world coordinates): +* *Graphic3d_Camera::ViewDimensions()* or *V3d_View::Size()/ZSize()* -- returns view width, height and depth (or "Z size"). Since the view is symmetric now, you can easily compute top, bottom, left and right limits. *Graphic3d_Camera::ZNear()/ZFar()* can be used to obtain the near and far clipping distances with respect to the eye. +* *Graphic3d_Camera::Up()* or *V3d_View::Up()* -- returns Y direction of the view. +* *Graphic3d_Camera::Direction()* returns the reverse view normal directed from the eye, *V3d_View::Proj()* returns the old-style view normal. +* *Graphic3d_Camera::Eye()* or *V3d_View::Eye()* -- returns the camera position (same as projection reference point in old implementation). +* *Graphic3d_Camera::Center()* or *V3d_View::At()* -- returns the point the camera looks at (or view reference point according to old terminology). + +The current perspective model is not fully backward compatible, so the old perspective-related functionality needs to be reviewed. + +Revise application-specific custom presentations to provide a proper bounding box, otherwise the object might become erroneously clipped by automatic *ZFit* or frustum culling algorithms enabled by default. + +@subsection upgrade_680_connected_objects Redesign of Connected Interactive Objects + +The new implementation of connected Interactive Objects makes it necessary to take the following steps if you use connected Interactive Objects in your application. +* Use new *PrsMgr_PresentableObject* transformation API. +* Call *RemoveChild()* from the original object after connect if you need the original object and *AIS_ConnectedInteractive* to move independently. +* Access instances of objects connected to *AIS_MultiplyConnectedInteractive* with *Children()* method. +* For *PrsMgr_PresentableObject* transformation: + * *SetLocation (TopLoc_Location) -> SetLocalTransformation (gp_Trsf)* + * *Location -> LocalTransformation* + * *HasLocation -> HasTransformation* + * *ResetLocation -> ResetTransformation* + +@subsection upgrade_680_unicode Support of UNICODE Characters + +Support of UNICODE characters introduced in OCCT breaks backward compatibility with applications, which currently use filenames in extended ASCII encoding bound to the current locale. Such applications should be updated to convert such strings to UTF-8 format. + +The conversion from UTF-8 to wchar_t is made using little-endian approach. Thus, this code will not work correctly on big-endian platforms. It is needed to complete this in the way similar as it is done for binary persistence (see the macro *DO_INVERSE* in *FSD_FileHeader.hxx).* + +@subsection upgrade_680_projection_shift Elimination of Projection Shift Concept + +It might be necessary to revise the application code, which deals with *Center()* method of *V3d_View*. + +This method was used to pan a *V3d* view by virtually moving the screen center with respect to the projection ray passed through Eye and At points. There is no more need to derive the panning from the Center parameter to get a camera-like eye position and look at the coordinates. *Eye()* and *At()* now return these coordinates directly. When porting code dealing with *Center()*, the parameters *Eye()* and *At()* can be adjusted instead. Also *V3d_View::SetCenter(Xpix, Ypix)* method can be used instead of *V3d_View::Center(X, Y)* to center the view at the given point. However, if the center coordinates X and Y come from older OCCT releases, calling *V3d_View::Panning(-X, -Y)* can be recommended to compensate missing projection shift effect. + +There are several changes introduced to *Graphic3d_Camera*. The internal data structure of the camera is based on *Standard_Real* data types to avoid redundant application-level conversions and precision errors. The transformation matrices now can be evaluated both for *Standard_Real* and *Standard_ShortReal* value types. *ZNear* and *ZFar* planes can be either negative or positive for orthographic camera projection, providing a trade-off between the camera distance and the range of *ZNear* or *ZFar* to reduce difference of exponents of values composing the orientation matrix - to avoid calculation errors. The negative values can be specified to avoid Z-clipping if the reference system of camera goes inside of the model when decreasing camera distance. + +The auto z fit mode, since now, has a parameter defining Z-range margin (the one which is usually passed as argument to *ZFitAll()* method). The methods *SetAutoZFitMode(), AutoZFitScaleFactor()* and *ZFitAll()* from class *V3d_View* deal with the new parameter. + +The class *Select3D_Projector* now supports both orientation and projection transformation matrices, which can be naturally set for the projector. The definition of projector was revised in *StdSelect_ViewerSelector3d*: perspective and orthographic projection parameters are handled properly. Orthographic projector is based only on direction of projection - no more *Center* property. This makes it possible to avoid unnecessary re-projection of sensitive while panning, zooming or moving along the projection ray of the view. These operations do not affect the orthographic projection. + + +@section upgrade_690 Upgrade to OCCT 6.9.0 + +Porting of user applications from an earlier OCCT version to version 6.9.0 requires taking into account the following major changes. + +@subsection upgrade_690_shaders 3D Viewer initialization + +3D Viewer now uses GLSL programs for managing frame buffer and stereoscopic output. +For proper initialization, application should configure **CSF_ShadersDirectory** environment variable pointing to a folder with GLSL resources - files from folder **CASROOT**/src/Shaders. +*Note that **CSF_ShadersDirectory** become optional since OCCT 7.1.0 release*. + +@subsection upgrade_690_selection Changes in Selection + +Selection mechanism of 3D Viewer has been redesigned to use 3-level BVH tree traverse directly in 3D space instead of projection onto 2D screen space (updated on each rotation). This architectural redesign may require appropriate changes at application level in case if custom Interactive Objects are used. + +#### Standard selection +Usage of standard OCCT selection entities would require only minor updates. + +Custom Interactive Objects should implement new virtual method *SelectMgr_SelectableObject::BoundingBox().* + +Now the method *SelectMgr_Selection::Sensitive()* does not return *SelectBasics_SensitiveEntity*. It returns an instance of *SelectMgr_SensitiveEntity*, which belongs to a different class hierarchy (thus *DownCast()* will fail). To access base sensitive it is necessary to use method *SelectMgr_SensitiveEntity::BaseSensitive()*. For example: + +~~~~ +Handle(SelectMgr_Selection) aSelection = anInteractiveObject->Selection (aMode); +for (aSelection->Init(); aSelection->More(); aSelection->Next()) +{ + Handle(SelectBasics_SensitiveEntity) anEntity = aSelection->Sensitive()->BaseSensitive(); +} +~~~~ + +#### Custom sensitive entities + +Custom sensitive entities require more complex changes, since the selection algorithm has been redesigned and requires different output from the entities. + +The method *SelectBasics_SensitiveEntity::Matches()* of the base class should be overridden following the new signature: + +*Standard_Boolean Matches (SelectBasics_SelectingVolumeManager& theMgr, SelectBasics_PickResult& thePickResult)*, where *theMgr* contains information about the currently selected frustum or set of frustums (see *SelectMgr_RectangularFrustum, SelectMgr_TrangularFrustum, SelectMgr_TriangularFrustumSet)* and *SelectBasics_PickResult* is an output parameter, containing information about the depth of the detected entity and distance to its center of geometry. + +In the overridden method it is necessary to implement an algorithm of overlap and inclusion detection (the active mode is returned by *theMgr.IsOverlapAllowed()*) with triangular and rectangular frustums. + +The depth and distance to the center of geometry must be calculated for the 3D projection of user-picked screen point in the world space. You may use already implemented overlap and inclusion detection methods for different primitives from *SelectMgr_RectangularFrustum* and *SelectMgr_TriangularFrustum*, including triangle, point, axis-aligned box, line segment and planar polygon. + +Here is an example of overlap/inclusion test for a box: + +~~~~ +if (!theMgr.IsOverlapAllowed()) // check for inclusion +{ + Standard_Boolean isInside = Standard_True; + return theMgr.Overlaps (myBox.CornerMin(), myBox.CornerMax(), &isInside) && isInside; +} + +Standard_Real aDepth; +if (!theMgr.Overlaps (myBox, aDepth)) // check for overlap +{ + return Standard_False; +} + +thePickResult = +SelectBasics_PickResult (aDepth, theMgr.DistToGeometryCenter (myCenter3d)); +~~~~ + +The interface of *SelectBasics_SensitiveEntity* now contains four new pure virtual functions that should be implemented by each custom sensitive: +* BoundingBox() – returns a bounding box of the entity; +* Clear() – clears up all the resources and memory allocated for complex sensitive entities; +* BVH() – builds a BVH tree for complex sensitive entities, if it is needed; +* NbSubElements() – returns atomic sub-entities of a complex sensitive entity, which will be used as primitives for BVH building. If the entity is simple and no BVH is required, this method returns 1. + +Each sensitive entity now has its own tolerance, which can be overridden by method *SelectBasics_SensitiveEntity::SetSensitivityFactor()* called from constructor. + + +@subsection upgrade_690_adaptor3d-curve Changes in Adaptor3d_Curve class + +All classes inheriting *Adaptor3d_Curve* (directly or indirectly) must be updated in application code to use new signature of methods *Intervals()* and *NbIntervals()*. Note that no compiler warning will be generated if this is not done. + +@subsection upgrade_690_v3d_view Changes in V3d_View class + +The methods *V3d_View::Convert* and *V3d_View::ConvertWithProj()* have ceased to return point on the active grid. It might be necessary to revise the code of your application so that *V3d_View::ConvertToGrid()* was called explicitly for the values returned by *V3d_View::Convert* to get analogous coordinates on the grid. The methods *V3d_View::Convert* and *V3d_View::ConvertWithProj* convert point into reference plane of the view corresponding to the intersection with the projection plane of the eye/view point vector. + +@section upgrade_700 Upgrade to OCCT 7.0.0 + +Porting of user applications from an earlier OCCT version to version 7.0.0 requires taking into account the following major changes. + +Building OCCT now requires compiler supporting some C++11 features. +The supported compilers are: +- MSVC: version 10 (Visual Studio 2010) or later +- GCC: version 4.3 or later +- CLang: version 3.6 or later +- ICC: version XE 2013 SP 1 or later + +When compiling code that uses OCCT with GCC and CLang compilers, it is necessary to use compiler option -std=c++0x (or its siblings) to enable C++11 features. + +@subsection upgrade_700_persist Removal of legacy persistence + +Legacy persistence for shapes and OCAF data based on *Storage_Schema* (toolkits *TKPShape*, *TKPLCAF*, *TKPCAF*, *TKShapeShcema, TLStdLSchema, TKStdSchema*, and *TKXCAFSchema*) has been removed in OCCT 7.0.0. +The applications that used these data persistence tools need to be updated to use other persistence mechanisms. + +@note For compatibility with previous versions, the possibility to read standard OCAF data (*TKLCAF* and *TKCAF*) from files stored in the old format is preserved (toolkits *TKStdL* and *TKStd*). + +The existing data files in standard formats can be converted using OCCT 6.9.1 or a previous version, as follows. + +@note Reading / writing custom files capability from OCCT 6.9.1 is restored in OCCT 7.2.0. See details in @ref upgrade_720_persistence section. + +#### CSFDB files + +Files in *CSFDB* format (usually with extension .csfdb) contain OCCT shape data that can be converted to BRep format. +The easiest way to do that is to use ImportExport sample provided with OCCT 6.9.0 (or earlier): + +- Start ImportExport sample; +- Select File / New; +- Select File / Import / CSFDB... and specify the file to be converted; +- Drag the mouse with the right button pressed across the view to select all shapes by the rectangle; +- Select File / Export / BREP... and specify the location and name for the resulting file + +#### OCAF and XCAF documents + +Files containing OCAF data saved in the old format usually have extensions .std, .sgd or .dxc (XDE documents). +These files can be converted to XML or binary OCAF formats using DRAW Test Harness commands. +Note that if the file contains only attributes defined in *TKLCAF* and *TKCAF*, this action can be performed in OCCT 7.0; otherwise OCCT 6.9.1 or earlier should be used. + +For that, start *DRAWEXE* and perform the following commands: + + * To convert *.std and *.sgd file formats to binary format *.cbf (The created document should be in *BinOcaf* format instead of *MDTV-Standard*): + + @code + Draw[]> pload ALL + Draw[]> Open [path to *.std or *.sgd file] Doc + Draw[]> Format Doc BinOcaf + Draw[]> SaveAs Doc [path to the new file] + @endcode + + * To convert *.dxc file format to binary format *.xbf (The created document should be in *BinXCAF* format instead of *MDTV-XCAF*): + + @code + Draw[]> pload ALL + Draw[]> XOpen [path to *.dxc file] Doc + Draw[]> Format Doc BinXCAF + Draw[]> XSave Doc [path to the new file] + @endcode + +On Windows, it is necessary to replace back slashes in the file path by direct slashes or pairs of back slashes. + +Use *XmlOcaf* or *XmlXCAF* instead of *BinOcaf* and *BinXCAF*, respectively, to save in XML format instead of binary one. + +@subsection upgrade_occt700_cdl Removal of CDL and WOK + +OCCT code has been completely refactored in version 7.0 to get rid of obsolete technologies used since its inception: CDL (Cas.Cade Definition Language) and WOK (Workshop Organization Kit). + +C++ code previously generated by WOK from CDL declarations is now included directly in OCCT sources. + +This modification did not change names, API, and behavior of existing OCCT classes, thus in general the code based on OCCT 6.x should compile and work fine with OCCT 7.0. +However, due to redesign of basic mechanisms (CDL generic classes, Handles and RTTI) using C++ templates, some changes may be necessary in the code when porting to OCCT 7.0, as described below. + +WOK is not necessary anymore for building OCCT from sources, though it still can be used in a traditional way -- auxiliary files required for that are preserved. +The recommended method for building OCCT 7.x is CMake, see @ref build_occt_win_cmake. +The alternative solution is to use project files generated by OCCT legacy tool **genproj**, see @ref build_occt_genproj, @ref build_occt_win_codeblocks, and @ref build_occt_macos_xcode. + +@subsubsection upgrade_occt700_cdl_auto Automatic upgrade + +Most of typical changes required for upgrading code for OCCT 7.0 can be done automatically using the *upgrade* tool included in OCCT 7.0. +This tool is a Tcl script, thus Tcl should be available on your workstation to run it. + +Example: +~~~~~ + $ tclsh + % source /adm/upgrade.tcl + % upgrade -recurse -all -src= +~~~~~ + +On Windows, the helper batch script *upgrade.bat* can be used, provided that Tcl is either available in *PATH*, or configured via *custom.bat* script (for instance, if you use OCCT installed from Windows installer package). Start it from the command prompt: + +~~~~~ +cmd> \upgrade.bat -recurse -all -inc=\inc -src= [options] +~~~~~ + +Run the upgrade tool without arguments to see the list of available options. + +The upgrade tool performs the following changes in the code. + +1. Replaces macro *DEFINE_STANDARD_RTTI* by *DEFINE_STANDARD_RTTIEXT*, with second argument indicating base class for the main argument class (if inheritance is recognized by the script): +~~~~~ +DEFINE_STANDARD_RTTI(Class) -> DEFINE_STANDARD_RTTIEXT(Class, Base) +~~~~~ + + @note If macro *DEFINE_STANDARD_RTTI* with two arguments (used in intermediate development versions of OCCT 7.0) is found, the script will convert it to either *DEFINE_STANDARD_RTTIEXT* or *DEFINE_STANDARD_RTTI_INLINE*. + The former case is used if current file is header and source file with the same name is found in the same folder. + In this case, macro *IMPLEMENT_STANDARD_RTTI* is injected in the corresponding source file. + The latter variant defines all methods for RTTI as inline, and does not require *IMPLEMENT_STANDARD_RTTIEXT* macro. + +2. Replaces forward declarations of collection classes previously generated from CDL generics (defined in *TCollection* package) by inclusion of the corresponding header: +~~~~~ +class TColStd_Array1OfReal; -> #include +~~~~~ + +3. Replaces underscored names of *Handle* classes by usage of a macro: +~~~~~ +Handle_Class -> Handle(Class) +~~~~~ + This change is not applied if the source or header file is recognized as containing the definition of Qt class with signals or slots, to avoid possible compilation errors of MOC files caused by inability of MOC to recognize macros (see https://doc.qt.io/qt-4.8/signalsandslots.html). + The file is considered as defining a Qt object if it contains strings *Q_OBJECT* and either *slots:* or *signals:*. + +4. Removes forward declarations of classes with names Handle(C) or *Handle_C*, replacing them either by forward declaration of its argument class, or (for files defining Qt objects) \#include statement for a header with the name of the argument class and extension .hxx: +~~~~~ +class Handle(TColStd_HArray1OfReal); -> #include +~~~~~ + +5. Removes \#includes of files Handle_...hxx that have disappeared in OCCT 7.0: +~~~~~ +#include -> +~~~~~ + +6. Removes *typedef* statements that use *Handle* macro to generate the name: +~~~~~ +typedef NCollection_Handle Handle(Message_Msg); -> +~~~~~ + +7. Converts C-style casts applied to Handles into calls to DownCast() method: +~~~~~ + ((Handle(A)&)b) -> Handle(A)::DownCast(b) + (Handle(A)&)b -> Handle(A)::DownCast(b) + (*((Handle(A)*)&b)) -> Handle(A)::DownCast(b) + *((Handle(A)*)&b) -> Handle(A)::DownCast(b) + (*(Handle(A)*)&b) -> Handle(A)::DownCast(b) +~~~~~ + +8. Moves Handle() macro out of namespace scope: +~~~~~ +Namespace::Handle(Class) -> Handle(Namespace::Class) +~~~~~ + +9. Converts local variables of reference type, which are initialized by a temporary object returned by call to DownCast(), to the variables of non-reference type (to avoid using references to destroyed memory): +~~~~~ + const Handle(A)& a = Handle(B)::DownCast (b); -> Handle(A) a (Handle(B)::DownCast (b)); +~~~~~ + +10. Adds \#include for all classes used as argument to macro STANDARD_TYPE(), except for already included ones; + +11. Removes uses of obsolete macros *IMPLEMENT_DOWNCAST* and *IMPLEMENT_STANDARD_*..., except *IMPLEMENT_STANDARD_RTTIEXT*. + + @note If you plan to keep compatibility of your code with older versions of OCCT, add option -compat to avoid this change. See also @ref upgrade_occt700_cdl_compat. + +. + +As long as the upgrade routine runs, some information messages are sent to the standard output. +In some cases the warnings or errors like the following may appear: + +~~~~~ + Error in {HEADER_FILE}: Macro DEFINE_STANDARD_RTTI used for class {CLASS_NAME} whose declaration is not found in this file, cannot fix +~~~~~ + +Be sure to check carefully all reported errors and warnings, as the corresponding code will likely require manual corrections. +In some cases these messages may help you to detect errors in your code, for instance, cases where *DEFINE_STANDARD_RTTI* macro is used with incorrect class name as an argument. + +@subsubsection upgrade_occt700_cdl_compiler Possible compiler errors + +Some situations requiring upgrade cannot be detected and / or handled by the automatic procedure. +If you get compiler errors or warnings when trying to build the upgraded code, you will need to fix them manually. +The following paragraphs list known situations of this kind. + +#### Missing header files + +The use of handle objects (construction, comparison using operators == or !=, use of function STANDRAD_TYPE() and method DownCast()) now requires the type of the object pointed by Handle to be completely known at compile time. Thus it may be necessary to include header of the corresponding class to make the code compilable. + +For example, the following lines will fail to compile if *Geom_Line.hxx* is not included: + +~~~~~ +Handle(Geom_Line) aLine = 0; +if (aLine != aCurve) {...} +if (aCurve->IsKind(STANDARD_TYPE(Geom_Line)) {...} +aLine = Handle(Geom_Line)::DownCast (aCurve); +~~~~~ + +Note that it is not necessary to include header of the class to declare Handle to it. +However, if you define a class *B* that uses Handle(*A*) in its fields, or contains a method returning Handle(*A*), it is advisable to have header defining *A* included in the header of *B*. +This will eliminate the need to include the header *A* in each source file where class *B* is used. + +#### Ambiguity of calls to overloaded functions + +This issue appears in the compilers that do not support default arguments in template functions (known cases are Visual C++ 10 and 11): the compiler reports an ambiguity error if a handle is used in the argument of a call to the function that has two or more overloaded versions, receiving handles to different types. +The problem is that operator const handle& is defined for any type *T2*, thus the compiler cannot make the right choice. + +Example: +~~~~~ +void func (const Handle(Geom_Curve)&); +void func (const Handle(Geom_Surface)&); + +Handle(Geom_TrimmedCurve) aCurve = new Geom_TrimmedCurve (...); +func (aCurve); // ambiguity error in VC++ 10 +~~~~~ + +Note that this problem can be avoided in many cases if macro *OCCT_HANDLE_NOCAST* is used, see @ref upgrade_occt700_cdl_nocast "below". + +To resolve this ambiguity, change your code so that argument type should correspond exactly to the function signature. +In some cases this can be done by using the relevant type for the corresponding variable, like in the example above: + +~~~~~ +Handle(Geom_Curve) aCurve = new Geom_TrimmedCurve (...); +~~~~~ + +Other variants consist in assigning the argument to a local variable of the correct type and using the direct cast or constructor: + +~~~~~ +const Handle(Geom_Curve)& aGCurve (aTrimmedCurve); +func (aGCurve); // OK - argument has exact type +func (static_cast(aCurve)); // OK - direct cast +func (Handle(Geom_Curve)(aCurve)); // OK - temporary handle is constructed +~~~~~ + +Another possibility consists in defining additional template variant of the overloaded function causing ambiguity, and using *SFINAE* to resolve the ambiguity. +This technique can be illustrated by the definition of the template variant of method IGESData_IGESWriter::Send(). + +#### Lack of implicit cast to base type + +As the cast of a handle to the reference to another handle to the base type has become a user-defined operation, the conversions that require this cast together with another user-defined cast will not be resolved automatically by the compiler. + +For example: + +~~~~~ +Handle(Geom_Geometry) aC = GC_MakeLine (p, v); // compiler error +~~~~~ + +The problem is that the class *GC_MakeLine* has a user-defined conversion to const Handle(Geom_TrimmedCurve)&, which is not the same as the type of the local variable *aC*. + +To resolve this, use method Value(): + +~~~~~ +Handle(Geom_Geometry) aC = GC_MakeLine (p, v).Value(); // ok +~~~~~ + +or use variable of the appropriate type: + +~~~~~ +Handle(Geom_TrimmedCurve) aC = GC_MakeLine (p, v); // ok +~~~~~ + +A similar problem appears with GCC compiler, when *const* handle to derived type is used to construct handle to base type via assignment (and in some cases in return statement), for instance: + +~~~~~ + const Handle(Geom_Line) aLine; + Handle(Geom_Curve) c1 = aLine; // GCC error + Handle(Geom_Curve) c2 (aLine); // ok +~~~~~ + +This problem is specific to GCC and it does not appear if macro *OCCT_HANDLE_NOCAST* is used, see @ref upgrade_occt700_cdl_nocast "below". + +#### Incorrect use of STANDARD_TYPE and Handle macros + +You might need to clean your code from incorrect use of macros *STANDARD_TYPE*() and *Handle*(). + +1. Explicit definitions of static functions with names generated by macro *STANDARD_TYPE()*, which are artifacts of old implementation of RTTI, should be removed. + + Example: +~~~~~ +const Handle(Standard_Type)& STANDARD_TYPE(math_GlobOptMin) +{ + static Handle(Standard_Type) _atype = new Standard_Type ("math_GlobOptMin", sizeof (math_GlobOptMin)); + return _atype; +} +~~~~~ + +2. Incorrect location of closing parenthesis of *Handle()* macro that was not detectable in OCCT 6.x will cause a compiler error and must be corrected. + + Example (note misplaced closing parenthesis): +~~~~~ +aBSpline = Handle( Geom2d_BSplineCurve::DownCast(BS->Copy()) ); +~~~~~ + +#### Use of class Standard_AncestorIterator + +Class *Standard_AncestorIterator* has been removed; use method *Parent()* of *Standard_Type* class to parse the inheritance chain. + +#### Absence of cast to Standard_Transient* + +Handles in OCCT 7.0 do not have the operator of conversion to Standard_Transient*, which was present in earlier versions. +This is done to prevent possible unintended errors like this: + +~~~~~ +Handle(Geom_Line) aLine = ...; +Handle(Geom_Surface) aSurf = ...; +... +if (aLine == aSurf) {...} // will cause a compiler error in OCCT 7.0, but not OCCT 6.x +~~~~~ + +The places where this implicit cast has been used should be corrected manually. +The typical situation is when Handle is passed to stream: + +~~~~~ +Handle(Geom_Line) aLine = ...; +os << aLine; // in OCCT 6.9.0, resolves to operator << (void*) +~~~~~ + +Call method get() explicitly to output the address of the Handle. + +#### Method DownCast for non-base types + +Method *DownCast()* in OCCT 7.0 is made templated; if its argument is not a base class, "deprecated" compiler warning is generated. +This is done to prevent possible unintended errors like this: + +~~~~~ +Handle(Geom_Surface) aSurf = ; +Handle(Geom_Line) aLine = + Handle(Geom_Line)::DownCast (aSurf); // will cause a compiler warning in OCCT 7.0, but not OCCT 6.x +~~~~~ + +The places where this cast has been used should be corrected manually. + +If down casting is used in a template context where the argument can have the same or unrelated type so that *DownCast()* may be not available in all cases, use C++ *dynamic_cast<>* instead, e.g.: + +~~~~~ +template +bool CheckLine (const Handle(T) theArg) +{ + Handle(Geom_Line) aLine = dynamic_cast (theArg.get()); + ... +} +~~~~~ + +@subsubsection upgrade_occt700_cdl_runtime Possible runtime problems + +Here is the list of known possible problems at run time after the upgrade to OCCT 7.0. + +#### References to temporary objects + +In previous versions, the compiler was able to detect the situation when a local variable of a "reference to a Handle" type is initialized by temporary object, and ensured that lifetime of that object is longer than that of the variable. +In OCCT 7.0 with default options, it will not work if types of the temporary object and variable are different (due to involvement of user-defined type cast), thus such temporary object will be destroyed immediately. + +This problem does not appear if macro *OCCT_HANDLE_NOCAST* is used during compilation, see below. + +Example: + +~~~~~ +// note that DownCast() returns new temporary object! +const Handle(Geom_BoundedCurve)& aBC = +Handle(Geom_TrimmedCurve)::DownCast(aCurve); +aBC->Transform (T); // access violation in OCCT 7.0 +~~~~~ + +@subsubsection upgrade_occt700_cdl_nocast Option to avoid cast of handle to reference to base type + +In OCCT 6.x and earlier versions the handle classes formed a hierarchy echoing the hierarchy of the corresponding object classes . +This automatically enabled the possibility to use the handle to a derived class in all contexts where the handle to a base class was needed, e.g. to pass it in a function by reference without copying: + +~~~~ +Standard_Boolean GetCurve (Handle(Geom_Curve)& theCurve); +.... +Handle(Geom_Line) aLine; +if (GetCurve (aLine)) { + // use aLine, unsafe +} +~~~~ + +This feature was used in multiple places in OCCT and dependent projects. +However it is potentially unsafe: in the above example no checks are done at compile time or at run time to ensure that the type assigned to the argument handle is compatible with the type of the handle passed as argument. +If an object of incompatible type (e.g. Geom_Circle) is assigned to *theCurve*, the behavior will be unpredictable. + +For compatibility with the existing code, OCCT 7.0 keeps this possibility by default, providing operators of type cast to the handle to a base type. However, this feature is unsafe and in specific situations it may cause compile-time or run-time errors as described above. + +To provide a safer behavior, this feature can be disabled by a compile-time macro *OCCT_HANDLE_NOCAST*. +When it is used, constructors and assignment operators are defined (instead of type cast operators) to convert handles to a derived type into handles to a base type. +This implies creation of temporary objects and hence may be more expensive at run time in some circumstances, however this way is more standard, safer, and in general recommended. + +The code that relies on the possibility of casting to base should be amended to always use the handle of argument type in function call and to use *DownCast()* to safely convert the result to the desired type. +For instance, the code from the example below can be changed as follows: + +~~~~~ +Handle(Geom_Line) aLine; +Handle(Geom_Curve) aCurve; +if (GetCurve (aCure) && !(aLine = Handle(Geom_Line)::DownCast (aCurve)).IsNull()) { + // use aLine safely +} +~~~~~ + +@subsubsection upgrade_occt700_cdl_compat Preserving compatibility with OCCT 6.x + +If you like to preserve the compatibility of your application code with OCCT versions 6.x even after the upgrade to 7.0, consider the following suggestions: + +1. If your code used sequences of macros *IMPLEMENT_STANDARD_*... generated by WOK, replace them by single macro *IMPLEMENT_STANDARD_RTTIEXT* + +2. When running automatic upgrade tool, add option -compat. + +3. Define macros *DEFINE_STANDARD_RTTIEXT* and *DEFINE_STANDARD_RTTI_INLINE* when building with previous versions of OCCT, resolving to *DEFINE_STANDARD_RTTI* with single argument + + Example: +~~~~~ +#if OCC_VERSION_HEX < 0x070000 + #define DEFINE_STANDARD_RTTIEXT(C1,C2) DEFINE_STANDARD_RTTI(C1) + #define DEFINE_STANDARD_RTTI_INLINE(C1,C2) DEFINE_STANDARD_RTTI(C1) +#endif +~~~~~ + +@subsubsection upgrade_occt700_cdl_wok Applications based on CDL and WOK + +If your application is essentially based on CDL, and you need to upgrade it to OCCT 7.0, you will very likely need to convert your application code to non-CDL form. +This is a non-trivial effort; the required actions would depend strongly on the structure of the code and used CDL features. + +The upgrade script and sources of a specialized WOK version used for OCCT code upgrade can be found in WOK Git repository in branch [CR0_700_2](https://git.dev.opencascade.org/gitweb/?p=occt-wok.git;a=log;h=refs/heads/CR0_700_2). + +[Contact us](https://www.opencascade.com/contact/) if you need more help. + +@subsection upgrade_occt700_bspline Separation of BSpline cache + +Implementation of NURBS curves and surfaces has been revised: the cache of polynomial coefficients, which is used to accelerate the calculation of values of a B-spline, has been separated from data objects *Geom2d_BSplineCurve, Geom_BSplineCurve* and *Geom_BSplineSurface* into the dedicated classes *BSplCLib_Cache* and *BSplSLib_Cache*. + +The benefits of this change are: +* Reduced memory footprint of OCCT shapes (up to 20% on some cases) +* Possibility to evaluate the same B-Spline concurrently in parallel threads without data races and mutex locks + +The drawback is that direct evaluation of B-Splines using methods of curves and surfaces becomes slower due to the absence of cache. The slow-down can be avoided by using adaptor classes *Geom2dAdaptor_Curve, GeomAdaptor_Curve* and *GeomAdaptor_Surface*, which now use cache when the curve or surface is a B-spline. + +OCCT algorithms have been changed to use adaptors for B-spline calculations instead of direct methods for curves and surfaces. +The same changes (use of adaptors instead of direct call to curve and surface methods) should be implemented in relevant places in the applications based on OCCT to get the maximum performance. + +@subsection upgrade_occt700_booleanresult Structural result of Boolean operations + +The result of Boolean operations became structured according to the structure of the input shapes. Therefore it may impact old applications that always iterate on direct children of the result compound assuming to obtain solids as iteration items, regardless of the structure of the input shapes. In order to get always solids as iteration items it is recommended to use TopExp_Explorer instead of TopoDS_Iterator. + +@subsection upgrade_occt700_brepextrema BRepExtrema_ExtCC finds one solution only + +Extrema computation between non-analytical curves in shape-shape distance calculation algorithm has been changed in order to return only one solution. So, if e.g. two edges are created on parallel b-spline curves the algorithm BRepExtrema_DistShapeShape will return only one solution instead of enormous number of solutions. There is no way to get algorithm working in old manner. + +@subsection upgrade_occt700_sorttools Removal of SortTools package + +Package *SortTools* has been removed. +The code that used the tools provided by that package should be corrected manually. +The recommended approach is to use sorting algorithms provided by STL. + +For instance: +~~~~~ +#include +#include +#include +... +TCollection_Array1OfReal aValues = ...; +... +TCollection_CompareOfReal aCompReal; +SortTools_StraightInsertionSortOfReal::Sort(aValues, aCompReal); +~~~~~ +can be replaced by: +~~~~~ +#include +... +TCollection_Array1OfReal aValues = ...; +... +std::stable_sort (aValues.begin(), aValues.end()); +~~~~~ + +@subsection upgrade_occt700_2dlayers On-screen objects and ColorScale + +The old mechanism for rendering Underlay and Overlay on-screen 2D objects based on *Visual3d_Layer* and immediate drawing model (uncached and thus slow) has been removed. +Classes *Aspect_Clayer2d, OpenGl_GraphicDriver_Layer, Visual3d_Layer, Visual3d_LayerItem, V3d_LayerMgr* and *V3d_LayerMgrPointer* have been deleted. +The following auxiliary definition have been removed as well: Aspect_TypeOfPrimitive, Aspect_TypeOfLayer, Aspect_TypeOfEdge, Aspect_TypeOfDrawMode, Aspect_TypeOfConstraint, Aspect_DriverDefinitionError, Aspect_BadAccess. + +General AIS interactive objects with transformation persistence flag *Graphic3d_TMF_2d* can be used as a replacement of *Visual3d_LayerItem*. +The anchor point specified for transformation persistence defines the window corner of (or center in case of (0, 0) point). +To keep on-screen 2D objects on top of the main screen, they can be assigned to the appropriate Z-layer. +Predefined Z-layers *Graphic3d_ZLayerId_TopOSD* and *Graphic3d_ZLayerId_BotOSD* are intended to replace Underlay and Overlay layers within the old API. + +*ColorScale* object previously implemented using *Visual3d_LayerItem* has been moved to a new class *AIS_ColorScale*, with width and height specified explicitly. +The property of *V3d_View* storing the global *ColorScale* object has been removed with associated methods *V3d_View::ColorScaleDisplay(), V3d_View::ColorScaleErase(), V3d_View::ColorScaleIsDisplayed()* and *V3d_View::ColorScale()* as well as the classes *V3d_ColorScale, V3d_ColorScaleLayerItem* and *Aspect_ColorScale*. +Here is an example of creating *ColorScale* using the updated API: + +~~~~~ +Handle(AIS_ColorScale) aCS = new AIS_ColorScale(); +// configuring +Standard_Integer aWidth, aHeight; +aView->Window()->Size (aWidth, aHeight); +aCS->SetSize (aWidth, aHeight); +aCS->SetRange (0.0, 10.0); +aCS->SetNumberOfIntervals (10); +// displaying +aCS->SetZLayer (Graphic3d_ZLayerId_TopOSD); +aCS->SetTransformPersistence (Graphic3d_TMF_2d, gp_Pnt (-1,-1,0)); +aCS->SetToUpdate(); +theContextAIS->Display (aCS); +~~~~~ + +To see how 2d objects are implemented in OCCT you can call Draw commands *vcolorscale, vlayerline* or *vdrawtext* (with -2d option). +Draw command *vcolorscale* now requires the name of *ColorScale* object as argument. +To display this object use command *vdisplay*. For example: + +~~~~~ +pload VISUALIZATION +vinit +vcolorscale cs -demo +pload MODELING +box b 100 100 100 +vdisplay b +vsetdispmode 1 +vfit +vlayerline 0 300 300 300 10 +vdrawtext t "2D-TEXT" -2d -pos 0 150 0 -color red +~~~~~ + +Here is a small example in C++ illustrating how to display a custom AIS object in 2d: +~~~~~ +Handle(AIS_InteractiveContext) aContext = ...; +Handle(AIS_InteractiveObject) anObj =...; // create an AIS object +anObj->SetZLayer(Graphic3d_ZLayerId_TopOSD); // display object in overlay +anObj->SetTransformPersistence (Graphic3d_TMF_2d, gp_Pnt (-1,-1,0)); // set 2d flag, coordinate origin is set to down-left corner +aContext->Display (anObj); // display the object +~~~~~ + +@subsection upgrade_occt700_userdraw UserDraw and Visual3d + +#### Visual3d package + +Package *Visual3d* implementing the intermediate layer between high-level *V3d* classes +and low-level OpenGl classes for views and graphic structures management has been dropped. + +The *OpenGl_View* inherits from the new class *Graphic3d_CView*. +*Graphic3d_CView* is an interface class that declares abstract methods for managing displayed structures, +display properties and a base layer code that implements computation +and management of HLR (or more broadly speaking view-depended) structures. + +In the new implementation it takes place of the eliminated *Visual3d_View*. +As before the instance of *Graphic3d_CView* is still completely managed by *V3d_View* classes. +It can be accessed through *V3d_View* interface but normally it should not be required as all its methods are completely wrapped. + +In more details, a concrete specialization of *Graphic3d_CView* is created and returned by the graphical driver on request. +Right after the creation the views are directly used for setting rendering properties and adding graphical structures to be displayed. + +The rendering of graphics is possible after mapping a window and activating the view. +The direct setting of properties obsoletes the use of intermediate structures with display parameter +like *Visual3d_ContextView*, etc. This means that the whole package *Visual3d* becomes redundant. + +The functionality previously provided by *Visual3d* package has been redesigned in the following way : +- The management of display of structures has been moved from *Visual3d_ViewManager* into *Graphic3d_StructureManager*. +- The class *Visual3d_View* has been removed. The management of computed structures has been moved into the base layer of *Graphi3d_CView*. +- All intermediate structures for storing view parameters, e.g. *Visual3d_ContextView*, have been removed. + The settings are now kept by instances of *Graphic3d_CView*. +- The intermediate class *Visual3d_Light* has been removed. All light properties are stored in *Graphic3d_CLight* structure, which is directly accessed by instances of *V3d_Light* classes. +- All necessary enumerations have been moved into *Graphic3d* package. + +#### Custom OpenGL rendering and UserDraw + +Old APIs based on global callback functions for creating *UserDraw* objects and for performing custom OpenGL rendering within the view have been dropped. +*UserDraw* callbacks are no more required since *OpenGl_Group* now inherits *Graphic3d_Group* and thus can be accessed directly from *AIS_InteractiveObject*: + +~~~~~ +//! Class implementing custom OpenGL element. +class UserDrawElement : public OpenGl_Element {}; + +//! Implementation of virtual method AIS_InteractiveObject::Compute(). +void UserDrawObject::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) +{ + Graphic3d_Vec4 aBndMin (myCoords[0], myCoords[1], myCoords[2], 1.0f); + Graphic3d_Vec4 aBndMax (myCoords[3], myCoords[4], myCoords[5], 1.0f); + + // casting to OpenGl_Group should be always true as far as application uses OpenGl_GraphicDriver for rendering + Handle(OpenGl_Group) aGroup = Handle(OpenGl_Group)::DownCast (thePrs->NewGroup()); + aGroup->SetMinMaxValues (aBndMin.x(), aBndMin.y(), aBndMin.z(), + aBndMax.x(), aBndMax.y(), aBndMax.z()); + UserDrawElement* anElem = new UserDrawElement (this); + aGroup->AddElement(anElem); + + // invalidate bounding box of the scene + thePrsMgr->StructureManager()->Update(); +} +~~~~~ + +To perform a custom OpenGL code within the view, it is necessary to inherit from class *OpenGl_View*. +See the following code sample: + +~~~~~ +//! Custom view. +class UserView : public OpenGl_View +{ +public: + //! Override rendering into the view. + virtual void render (Graphic3d_Camera::Projection theProjection, + OpenGl_FrameBuffer* theReadDrawFbo, + const Standard_Boolean theToDrawImmediate) + { + OpenGl_View::render (theProjection, theReadDrawFbo, theToDrawImmediate); + if (theToDrawImmediate) + { + return; + } + + // perform custom drawing + const Handle(OpenGl_Context)& aCtx = myWorkspace->GetGlContext(); + GLfloat aVerts[3] = { 0.0f, 0,0f, 0,0f }; + aCtx->core20->glEnableClientState(GL_VERTEX_ARRAY); + aCtx->core20->glVertexPointer(3, GL_FLOAT, 0, aVerts); + aCtx->core20->glDrawArrays(GL_POINTS, 0, 1); + aCtx->core20->glDisableClientState(GL_VERTEX_ARRAY); + } + +}; + +//! Custom driver for creating UserView. +class UserDriver : public OpenGl_GraphicDriver +{ +public: + //! Create instance of own view. + virtual Handle(Graphic3d_CView) CreateView (const Handle(Graphic3d_StructureManager)& theMgr) Standard_OVERRIDE + { + Handle(UserView) aView = new UserView (theMgr, this, myCaps, myDeviceLostFlag, &myStateCounter); + myMapOfView.Add (aView); + for (TColStd_SequenceOfInteger::Iterator aLayerIt (myLayerSeq); aLayerIt.More(); aLayerIt.Next()) + { + const Graphic3d_ZLayerId aLayerID = aLayerIt.Value(); + const Graphic3d_ZLayerSettings& aSettings = myMapOfZLayerSettings.Find (aLayerID); + aView->AddZLayer (aLayerID); + aView->SetZLayerSettings (aLayerID, aSettings); + } + return aView; + } +}; + +~~~~~ + +@subsection upgrade_occt700_localcontext Deprecation of Local Context + +The conception of Local Context has been deprecated. +The related classes, e.g. *AIS_LocalContext*, and methods ( AIS_InteractiveContext::OpenLocalContext() and others) will be removed in a future OCCT release. + +The main functionality provided by Local Context - selection of object subparts - can be now used within Neutral Point without opening any Local Context. + +The property *SelectionMode()* has been removed from the class *AIS_InteractiveObject*. +This property contradicts to selection logic, since it is allowed to activate several Selection modes at once. +Therefore keeping one selection mode as object field makes no sense. +Applications that used this method should implement selection mode caching at application level, if it is necessary for some reason. + +@subsection upgrade_occt700_separate_caf_visualisation Separation of visualization part from TKCAF + +Visualization CAF attributes have been moved into a new toolkit *TKVCAF*. +If your application uses the classes from *TPrsStd* package then add link to *TKVCAF* library. + +Version numbers of *BinOCAF* and *XmlOCAF* formats are incremented; new files cannot be read by earlier versions of OCCT. + +Before loading the OCAF files saved by previous versions and containing *TPrsStd_AISPresentation* attribute it is necessary to define the environment variable *CSF_MIGRATION_TYPES*, pointing to file *src/StdResources/MigrationSheet.txt*. +When using documents loaded from a file, make sure to call method *TPrsStd_AISViewer::New()* prior to accessing *TPrsStd_AISPresentation* attributes in this document as that method creates them. + +@subsection upgrade_euler_angles Correction of interpretation of Euler angles in gp_Quaternion + +Conversion of *gp_Quaternion* to and from intrinsic Tait-Bryan angles (including *gp_YawPitchRoll*) is fixed. + +Before that fix the sequence of rotation axes was opposite to the intended; e.g. *gp_YawPitchRoll* (equivalent to *gp_Intrinsic_ZYX*) actually defined intrinsic rotations around X, then Y, then Z. Now the rotations are made in the correct order. + +The applications that use *gp_Quaternion* to convert Yaw-Pitch-Roll angles (or other intrinsic Tait-Bryan sequences) may need to be updated to take this change into account. + +@subsection upgrade_zoom_persistent_selection Zoom Persistent Selection + +Zoom persistent selection introduces a new structure *Graphic3d_TransformPers* to transform persistence methods and parameters and a new class *Graphic3d_WorldViewProjState* to refer to the camera transformation state. You might need to update your code to deal with the new classes if you were using the related features. Keep in mind the following: +* *Graphic3d_Camera::ModelViewState* has been renamed to *Graphic3d_Camera::WorldViewState*. +* Transformation matrix utilities from *OpenGl_Utils* namespace have been moved to *Graphic3d_TransformUtils* and *Graphic3d_TransformUtils.hxx* header respectively. +* Matrix stack utilities from *OpenGl_Utils* namespace have been moved to *OpenGl_MatrixStack* class and *OpenGl_MatrixStack.hxx* header respectively. +* *OpenGl_View* methods *Begin/EndTransformPersistence* have been removed. Use *Graphic3d_TransformPers::Apply()* instead to apply persistence to perspective and world-view projection matrices. + +@subsection upgrade_occt700_correction_of_texture Texture mapping of objects + +Textured objects now have the priority over the environment mapping. + +Redundant enumerations *V3d_TypeOfSurface* and *Graphic3d_TypeOfSurface*, class *OpenGl_SurfaceDetailState*, the corresponding methods from *Graphic3d_CView, OpenGl_ShaderManager, OpenGl_View, V3d_View* and *V3d_Viewer* have been deleted. +Draw command *VSetTextureMode* has been deleted. + +@subsection upgrade_occt700_wfshape Shape presentation builders + +Presentation tools for building Wireframe presentation have been refactored to eliminate duplicated code and interfaces. +Therefore, the following classes have been modified: +* *StdPrs_WFDeflectionShape* and *Prs3d_WFShape* have been removed. *StdPrs_WFShape* should be used instead. +* *StdPrs_ToolShadedShape* has been renamed to *StdPrs_ToolTriangulatedShape*. + +@section upgrade_occt710 Upgrade to OCCT 7.1.0 + +@subsection upgrade_710_aspects Presentation attributes + +This section should be considered if application defines custom presentations, i.e. inherited from *AIS_InteractiveObject*. +The previous versions of OCCT have three levels for defining presentation properties (e.g. colors, materials, etc.): + +1. For the entire structure - *Graphic3d_Structure* / *Prs3d_Presentation*. +2. For a specific group of primitives - *Graphic3d_Group::SetGroupPrimitivesAspect()* overriding structure aspects. +3. For a specific primitive array within the graphic group - *Graphic3d_Group::SetPrimitivesAspect()*. + +The structure level has de facto not been used for a long time since OCCT presentations always define aspects at the graphic group level (overriding any structure aspects). +Within this OCCT release, structure level of aspects has been completely removed. In most cases the application code should just remove missing methods. In those rare cases, when this functionality was intentionally used, the application should explicitly define aspects to the appropriate graphic groups. + +Note that defining several different aspects within the same graphic group should also be avoided in the application code since it is a deprecated functionality which can be removed in further releases. +*Graphic3d_Group::SetGroupPrimitivesAspect()* should be the main method defining presentation attributes. + +The implementation of *Graphic3d_Group::SetGroupPrimitivesAspect()* has been changed from copying aspect values to keeping the passed object. +Although it was not documented, previously it was possible to modify a single aspect instance, like *Graphic3d_AspectFillArea3d* and set it to multiple groups. +Now such code would produce an unexpected result and therefore should be updated to create the dedicated aspect instance. + +@subsection upgrade_710_types Typedefs + +The following type definitions in OCCT has been modified to use C++11 types: +- *Standard_Boolean* is now *bool* (previously *unsigned int*). +- *Standard_ExtCharacter* is now *char16_t* (previously *short*). +- *Standard_ExtString;* is now *const char16_t* (previously *const short*). +- *Standard_Utf16Char* is now *char16_t* (previously *uint16_t* for compatibility with old compilers). +- *Standard_Utf32Char* is now *char32_t* (previously *uint32_t* for compatibility with old compilers). + +For most applications this change should be transparent on the level of source code. Binary compatibility is not maintained, as *bool* has a different size in comparison with *unsigned int*. + +@subsection upgrade_710_ffp Programmable Pipeline + +Fixed-function pipeline has been already deprecated since OCCT 7.0.0. +Release 7.1.0 disables this functionality by default in favor of Programmable Pipeline (based on GLSL programs). + +Method *V3d_View::Export()*, based on *gl2ps* library, requires fixed pipeline and will return error if used with default settings. +Applications should explicitly enable fixed pipeline by setting *OpenGl_Caps::ffpEnable* flag to TRUE within *OpenGl_GraphicDriver::ChangeOptions()* before creating the viewer to use *V3d_View::Export()*. +This method is declared as deprecated and will be removed in one of the the next OCCT releases. +The recommended way to generate a vector image of a 3D model or scene is to use an application-level solution independent from OpenGL. + +@subsection upgrade_710_trsfpers Transformation persistence + +The behavior of transformation persistence flags *Graphic3d_TMF_ZoomPers* and *Graphic3d_TMF_TriedronPers* has been changed for consistency with a textured fixed-size 2D text. +An object with these flags is considered as defined in pixel units, and the presentation is no more scaled depending on the view height. +The applications that need to scale such objects depending on viewport size should update them manually. + +Flags *Graphic3d_TMF_PanPers* and *Graphic3d_TMF_FullPers* have been removed. +*Graphic3d_TMF_TriedronPers* or *Graphic3d_TMF_2d* can be used instead depending on the context. + +*Graphic3d_TransModeFlags* is not an integer bitmask anymore - enumeration values should be specified instead. +Several transformation persistence methods in *PrsMgr_PresentableObject* have been marked deprecated. +Transformation persistence should be defined using *Graphic3d_TransformPers* constructor directly and passed by a handle, not value. + +@subsection upgrade_710_selprops Dynamic highlight and selection properties + +Release 7.1.0 introduces *Graphic3d_HighlightStyle* - an entity that allows flexible customization of highlighting parameters (such as highlighting method, color, and transparency). Therefore, the signatures of the following methods related to highlighting: +- *AIS_InteractiveContext::Hilight()*; +- *AIS_InteractiveContext::HilightWithColor()*; +- *PrsMgr_PresentationManager::Color()*; +- *SelectMgr_EntityOwner::HilightWithColor()*; +have been changed to receive *Graphic3d_HighlightStyle* instead of *Quantity_Color*. + +Method *AIS_InteractiveContext::Hilight* is now deprecated and highlights the interactive object with selection style. + +A group of methods *AIS_InteractiveContext::IsHilighted* has changed its behavior - now they only check highlight flags of the object or the owner in the global status. If the highlight color is required on the application level, it is necessary to use overloaded methods *AIS_InteractiveContext::HighlightStyle* for the owner and the object. + +The following methods have been replaced in *AIS_InteractiveContext* class: +- *HilightColor* and *SetHilightColor* by *HighlightStyle* and *SetHighlightStyle*; +- *SelectionColor* setter and getter by *SelectionStyle* and *SetSelectionStyle*. + +The API of *Prs3d_Drawer* has been extended to allow setting up styles for both dynamic selection and highlighting. Therefore, it is possible to change the highlight style of a particular object on the application level via *SelectMgr_SelectableObject::HilightAttributes()* and process it in the entity owner. + +@subsection upgrade_occt710_correction_of_TObj_Model Correction in TObj_Model class + +Methods *TObj_Model::SaveAs* and *TObj_Model::Load* now receive *TCollection_ExtendedString* filename arguments instead of char*. UTF-16 encoding can be used to pass file names containing Unicode symbols. + +@subsection upgrade_710_env Redundant environment variables + +The following environment variables have become redundant: + +* *CSF_UnitsLexicon* and *CSF_UnitsDefinition* are no more used. Units definition (*UnitsAPI/Lexi_Expr.dat* and *UnitsAPI/Units.dat*) is now embedded into source code. +* *CSF_XSMessage* and *CSF_XHMessage* are now optional. + English messages (XSMessage/\*XSTEP.us* and SHMessage/\*SHAPE.us*) are now embedded into source code + and automatically loaded when environment variables are not set. +* *CSF_ShadersDirectory* is not required any more, though it still can be used to load custom shaders. + Mandatory GLSL resources are now embedded into source code. +* *CSF_PluginDefaults* and other variables pointing to OCAF plugin resources (*CSF_StandardDefaults*, *CSF_XCAFDefaults*, *CSF_StandardLiteDefaults* and *CSF_XmlOcafResource*) are not necessary if method *TDocStd_Application::DefineFormat()* is used to enable persistence of OCAF documents. + +Other environment variables still can be used to customize behavior of relevant algorithms but are not necessary any more (all required resources are embedded). + +@subsection upgrade_710_removed Removed features + +The following obsolete features have been removed: +* Anti-aliasing API *V3d_View::SetAntialiasingOn()*. This method was intended to activate deprecated OpenGL functionality *GL_POLYGON_SMOOTH, GL_LINE_SMOOTH* and *GL_POINT_SMOOTH*. + Instead of the old API, the application should request MSAA buffers for anti-aliasing by assigning *Graphic3d_RenderingParams::NbMsaaSamples* property of the structure returned by *V3d_View::ChangeRenderingParams()*. +* *Prs3d_Drawer::ShadingAspectGlobal()* flag has been removed as not used. The corresponding calls can be removed safely from the application code. +* The methods managing ZClipping planes and ZCueing: *V3d_View::SetZClippingType()*, *V3d_View::SetZCueingOn()*, etc. have been removed. ZClipping planes can be replaced by general-purpose clipping planes (the application should update plane definition manually). +* The 3D viewer printing API *V3d_View::Print()* has been removed. This functionality was available on Windows platforms only. The applications should use the general image dump API *V3d_View::ToPixMap()* and manage printing using a platform-specific API at the application level. + Text resolution can be managed by rendering parameter *Graphic3d_RenderingParams::Resolution*, returned by *V3d_View::ChangeRenderingParams()*. +* Methods *PrsMgr_PresentationManager::BoundBox*, *PrsMgr_PresentationManager::Hilight* and *SelectMgr_EntityOwner::Hilight* have been removed as not used. The corresponding method in custom implementations of *SelectMgr_EntityOwner* can be removed safely. *PrsMgr_PresentationManager::Color* with the corresponding style must be used instead. +* Class *NCollection_QuickSort* has been removed. The code that used the tools provided by that class should be corrected manually. The recommended approach is to use sorting algorithms provided by STL (std::sort). See also @ref upgrade_occt700_sorttools above. + +* Package *Dico*. The code that used the tools provided by that package should be corrected manually. The recommended approach is to use *NCollection_DataMap* and *NCollection_IndexedDataMap* classes. + +@subsection upgrade_710_changed_methods Other changes + +The following classes have been changed: + +* *BVH_Sorter* class has become abstract. The list of arguments of both *Perform* methods has been changed and the methods became pure virtual. +* *Extrema_FuncExtPS* has been renamed to *Extrema_FuncPSNorm*. +* The default constructor and the constructor taking a point and a surface have been removed from class *Extrema_GenLocateExtPS*. Now the only constructor takes the surface and optional tolerances in U and V directions. The new method *Perform* takes the point with the start solution and processes it. The class has become not assignable and not copy-constructable. +* Constructors with arguments *(const gp_Ax22d& D, const gp_Pnt2d& F)* have been removed from *GCE2d_MakeParabola*, *gce_MakeParab2d* and *gp_Parab2d*. The objects created with some constructors of class *gp_Parab2d* may differ from the previous version (see the comments in *gp_Parab2d.hxx*). The result returned by *gp_Parab2d::Directrix()* method has an opposite direction in comparison with the previous OCCT versions. +* *BRepTools_Modifier* class now has two modes of work. They are defined by the boolean parameter *MutableInput*, which is turned off by default. This means that the algorithm always makes a copy of a sub-shape (e.g. vertex) if its tolerance is to be increased in the output shape. The old mode corresponds to *MutableInput* turned on. This change may impact an application if it implements a class derived from *BRepTools_Modifier*. +* The second parameter *theIsOuterWire* of method *ShapeAnalysis_Wire::CheckSmallArea* has been removed. +* In class *GeomPlate_CurveConstraint*, two constructors taking boundary curves of different types have been replaced with one constructor taking the curve of an abstract type. +* The last optional argument *RemoveInvalidFaces* has been removed from the constructor of class *BRepOffset_MakeOffset* and method *Initialize*. +* The public method *BOPDS_DS::VerticesOnIn* has been renamed into *SubShapesOnIn* and the new output parameter *theCommonPB* has been added. + +@section upgrade_occt720 Upgrade to OCCT 7.2.0 + +@subsection upgrade_720_removed Removed features + +The following obsolete features have been removed: +* *AIS_InteractiveContext::PreSelectionColor()*, *DefaultColor()*, *WasCurrentTouched()*, *ZDetection()*. + These properties were unused, and therefore application should remove occurrences of these methods. +* *AIS_InteractiveObject::SelectionPriority()*. + These property was not implemented. +* The class *LocOpe_HBuilder* has been removed as obsolete. +* The package *TestTopOpe* has been removed; +* The package *TestTopOpeDraw* has been removed; +* The package *TestTopOpeTools* has been removed. +* The packages *QANewModTopOpe*, *QANewBRepNaming* and *QANewDBRepNaming* have been removed as containing obsolete features. +* The following methods of the *IntPolyh_Triangle* class have been removed as unused: + - *CheckCommonEdge* + - *SetEdgeandOrientation* + - *MultipleMiddleRefinement2*. +* The method *IntPolyh_Triangle::TriangleDeflection* has been renamed to *IntPolyh_Triangle::ComputeDeflection*. +* The following methods of the *IntPolyh_MaillageAffinage* class have been removed as unused: + - *LinkEdges2Triangles*; + - *TriangleEdgeContact2*; + - *StartingPointsResearch2*; + - *NextStartingPointsResearch2*; + - *TriangleComparePSP*; + - *StartPointsCalcul*. +* The method PerformAdvanced of the *ShapeConstruct_ProjectCurveOnSurface* class has been removed as unused. +* The method Perform of the *ShapeConstruct_ProjectCurveOnSurface* class is modified: + - input arguments *continuity*, *maxdeg*, *nbinterval* have been removed as unused; + - input arguments *TolFirst*, *TolLast* have been added at the end of arguments' list. +* Typedefs Quantity_Factor, Quantity_Parameter, Quantity_Ratio, Quantity_Coefficient, Quantity_PlaneAngle, Quantity_Length, V3d_Parameter and V3d_Coordinate have been removed; Standard_Real should be used instead. + +@subsection upgrade_occt720_reshape_oriented_removed Corrections in BRepOffset API + +In classes *BRepTools_ReShape* and *ShapeBuild_ReShape*, the possibility to process shapes different only by orientation in different ways has been removed. +Thus methods *Remove()* and *Replace()* do not have any more the last argument 'oriented'; they work always as if *Standard_False* was passed before (default behavior). +Methods *ModeConsiderLo()* and *Apply()* with three arguments have been removed. + +@subsection upgrade_occt720_correction_of_Offset_API Corrections in BRepOffset API + +Class *BRepOffsetAPI_MakeOffsetShape*: +* *BRepOffsetAPI_MakeOffsetShape::BRepOffsetAPI_MakeOffsetShape()* - constructor with parameters has been deleted. +* *BRepOffsetAPI_MakeOffsetShape::PerformByJoin()* - method has been added. This method is old algorithm behaviour. + +The code below shows new calling procedure: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} + BRepOffsetAPI_MakeOffsetShape OffsetMaker; + OffsetMaker.PerformByJoin(Shape, OffsetValue, Tolerance); + NewShape = OffsetMaker.Shape(); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Class *BRepOffsetAPI_MakeThickSolid*: +* *BRepOffsetAPI_MakeThickSolid::BRepOffsetAPI_MakeThickSolid()* - constructor with parameters has been deleted. +* *BRepOffsetAPI_MakeThickSolid::MakeThickSolidByJoin()* - method has been added. This method is old algorithm behaviour. + +The code below shows new calling procedure: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} + BRepOffsetAPI_MakeThickSolid BodyMaker; + BodyMaker.MakeThickSolidByJoin(myBody, facesToRemove, -myThickness / 50, 1.e-3); + myBody = BodyMaker.Shape(); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +@subsection upgrade_720_highlight Highlight style + +Management of highlight attributes has been revised and might require modifications from application side: +* New class *Graphic3d_PresentationAttributes* defining basic presentation attributes has been introduced. + It's definition includes properties previously defined by class Graphic3d_HighlightStyle (*Color*, *Transparency*), + and new properties (*Display mode*, *ZLayer*, optional *FillArea aspect*). +* Class *Prs3d_Drawer* now inherits class *Graphic3d_PresentationAttributes*. + So that overall presentation attributes are now split into two parts - Basic attributes and Detailed attributes. +* Class *Graphic3d_HighlightStyle* has been dropped. + It is now defined as a typedef to *Prs3d_Drawer*. + Therefore, highlight style now also includes not only Basic presentation attributes, but also Detailed attributes + which can be used by custom presentation builders. +* Highlighting style defined by class *Graphic3d_PresentationAttributes* now provides more options: + - *Graphic3d_PresentationAttributes::BasicFillAreaAspect()* property providing complete Material definition. + This option, when defined, can be used instead of the pair Object Material + Highlight Color. + - *Graphic3d_PresentationAttributes::ZLayer()* property specifying the Layer where highlighted presentation should be shown. + This property can be set to Graphic3d_ZLayerId_UNKNOWN, which means that ZLayer of main presentation should be used instead. + - *Graphic3d_PresentationAttributes::DisplayMode()* property specifying Display Mode for highlight presentation. +* Since Highlight and Selection styles within *AIS_InteractiveContext* are now defined by *Prs3d_Drawer* inheriting from *Graphic3d_PresentationAttributes*, + it is now possible to customize default highlight attributes like *Display Mode* and *ZLayer*, which previously could be defined only on Object level. +* Properties *Prs3d_Drawer::HighlightStyle()* and *Prs3d_Drawer::SelectionStyle()* have been removed. + Instead, *AIS_InteractiveObject* now defines *DynamicHilightAttributes()* for dynamic highlighting in addition to *HilightAttributes()* used for highlighting in selected state. + Note that *AIS_InteractiveObject::HilightAttributes()* and *AIS_InteractiveObject::DynamicHilightAttributes()* override highlighting properties for both - entire object and for part coming from decomposition. + This includes Z-layer settings, which will be the same when overriding properties through AIS_InteractiveObject, while *AIS_InteractiveContext::HighlightStyle()* allows customizing properties for local and global selection independently + (with Graphic3d_ZLayerId_Top used for dynamic highlighting of entire object and Graphic3d_ZLayerId_Topmost for dynamic highlighting of object part by default). +* The following protected fields have been removed from class *AIS_InteractiveObject*: + - *myOwnColor*, replaced by *myDrawer->Color()* + - *myTransparency*, replaced by *myDrawer->Transparency()* + - *myZLayer*, replaced by *myDrawer->ZLayer()* +* The method *PrsMgr_PresentationManager::Unhighlight()* taking Display Mode as an argument has been marked deprecated. + Implementation now performs unhighlighting of all highlighted presentation mode. +* The methods taking/returning *Quantity_NameOfColor* (predefined list of colors) and duplicating methods operating with *Quantity_Color* (definition of arbitrary RGB color) in AIS have been removed. + *Quantity_Color* should be now used instead. + +@subsection upgrade_720_implicit_viewer_update Elimination of implicit 3D Viewer updates + +Most AIS_InteractiveContext methods are defined with a flag to update viewer immediatly or not. +Within previous version of OCCT, this argument had default value TRUE. +While immediate viewer updates are useful for beginners (the result is displayed as soon as possible), +this approach is inefficent for batch viewer updates, and having default value as TRUE +leaded to non-intended accidential updates which are difficult to find. + +To avoid such issues, the interface has been modified and default value has been removed. +Therefore, old application code should be updated to set the flag theToUpdateViewer explicitly +to desired value (TRUE to preserve old previous behavior), if it was not already set. + +The following AIS_InteractiveContext methods have been changed: + Display, Erase, EraseAll, DisplayAll, EraseSelected, DisplaySelected, ClearPrs, Remove, RemoveAll, Hilight, + HilightWithColor, Unhilight, Redisplay, RecomputePrsOnly, Update, SetDisplayMode, UnsetDisplayMode, SetColor, + UnsetColor, SetWidth, UnsetWidth, SetMaterial, UnsetMaterial, SetTransparency, UnsetTransparency, + SetLocalAttributes, UnsetLocalAttributes, SetPolygonOffsets, SetTrihedronSize, SetPlaneSize, SetPlaneSize, + SetDeviationCoefficient, SetDeviationAngle, SetAngleAndDeviation, SetHLRDeviationCoefficient, + SetHLRDeviationAngle, SetHLRAngleAndDeviation, SetSelectedAspect, MoveTo, Select, ShiftSelect, SetSelected, + UpdateSelected, AddOrRemoveSelected, HilightSelected, UnhilightSelected, ClearSelected, ResetOriginalState, + SubIntensityOn, SubIntensityOff, FitSelected, EraseGlobal, ClearGlobal, ClearGlobalPrs. + +In addition, the API for immediate viewer update has been removed from V3d_View and Graphic3d_StructureManager classes +(enumerations *Aspect_TypeOfUpdate* and *V3d_TypeOfUpdate*): + V3d::SetUpdateMode(), V3d::UpdateMode(), Graphic3d_StructureManager::SetUpdateMode(), Graphic3d_StructureManager::UpdateMode(). + +The argument theUpdateMode has been removed from methods Graphic3d_CView::Display(), Erase(), Update(). +Method Graphic3d_CView::Update() does not redraw the view and does not re-compute structures anymore. + +The following Grid management methods within class V3d_Viewer do not implicitly redraw the viewer: + ActivateGrid, DeactivateGrid, SetRectangularGridValues, SetCircularGridValues, + RectangularGridGraphicValues, CircularGridGraphicValues, SetPrivilegedPlane, DisplayPrivilegedPlane. + +@subsection upgrade_720_v3d_colorname Elimination of Quantity_NameOfColor from TKV3d interface classes + +The duplicating interface methods accepting *Quantity_NameOfColor* (in addition to methods accepting *Quantity_Color*) of TKV3d toolkit have been removed. +In most cases this change should be transparent, however applications implementing such interface methods should also remove them +(compiler will automatically highlight this issue for methods marked with Standard_OVERRIDE keyword). + +@subsection upgrade_720_Result_Of_BOP_On_Containers Result of Boolean operations on containers + +* The result of Boolean operations on arguments of collection types (WIRE/SHELL/COMPSOLID) is now filtered from duplicating containers. + +@subsection upgrade_720_changes_methods Other changes + +* *MMgt_TShared* class definition has been removed - Standard_Transient should be used instead (MMgt_TShared is marked as deprecated typedef of Standard_Transient for smooth migration). +* Class GeomPlate_BuildPlateSurface accepts base class Adaptor3d_HCurve (instead of inherited Adaptor3d_HCurveOnSurface accepted earlier). +* Types GeomPlate_Array1OfHCurveOnSurface and GeomPlate_HArray1OfHCurveOnSurface have been replaced with GeomPlate_Array1OfHCurve and GeomPlate_HArray1OfHCurve correspondingly (accept base class Adaptor3d_HCurve instead of Adaptor3d_HCurveOnSurface). +* Enumeration *Image_PixMap::ImgFormat*, previously declared as nested enumeration within class *Image_PixMap*, has been moved to global namespace as *Image_Format* following OCCT coding rules. + The enumeration values have suffix Image_Format_ and preserve previous name scheme for easy renaming of old values - e.g. Image_PixMap::ImgGray become Image_Format_Gray. + Old definitions are preserved as depreacated aliases to the new ones; +* Methods *Image_PixMap::PixelColor()* and *Image_PixMap::SetPixelColor()* now take/return Quantity_ColorRGBA instead of Quantity_Color/NCollection_Vec4. +* The method BOPAlgo_Builder::Origins() returns BOPCol_DataMapOfShapeListOfShape instead of BOPCol_DataMapOfShapeShape. +* The methods BOPDS_DS::IsToSort(const Handle(BOPDS_CommonBlock)&, Standard_Integer&) and BOPDS_DS::SortPaveBlocks(const Handle(BOPDS_CommonBlock)&) have been removed. The sorting is now performed during the addition of the Pave Blocks into Common Block. +* The methods BOPAlgo_Tools::MakeBlocks() and BOPAlgo_Tools::MakeBlocksCnx() have been replaced with the single template method BOPAlgo_Tools::MakeBlocks(). The chains of connected elements are now stored into the list of list instead of data map. +* The methods BOPAlgo_Tools::FillMap() have been replaced with the single template method BOPAlgo_Tools::FillMap(). +* Package BVH now uses opencascade::handle instead of NCollection_Handle (for classes BVH_Properties, BVH_Builder, BVH_Tree, BVH_Object). + Application code using BVH package directly should be updated accordingly. +* AIS_Shape now computes UV texture coordinates for AIS_Shaded presentation in case if texture mapping is enabled within Shaded Attributes. + Therefore, redundant class *AIS_TexturedShape is now deprecated* - applications can use *AIS_Shape* directly (texture mapping should be defined through AIS_Shape::Attributes()). +* Methods for managing active texture within OpenGl_Workspace class (ActiveTexture(), DisableTexture(), EnableTexture()) have been moved to *OpenGl_Context::BindTextures()*. + +@subsection upgrade_720_BOP_DataStructure BOP - Pairs of interfering indices + +* The classes *BOPDS_PassKey* and *BOPDS_PassKeyBoolean* are too excessive and not used any more in Boolean Operations. To replace them the new *BOPDS_Pair* class has been implemented. Thus: + - The method *BOPDS_DS::Interferences()* now returns the *BOPDS_MapOfPair*; + - The method *BOPDS_Iterator::Value()* takes now only two parameters - the indices of interfering sub-shapes. + +@subsection upgrade_720_Removal_Of_Old_Boolean_Operations_Draw Removal of the Draw commands based on old Boolean operations + +* The commands *fubl* and *cubl* have been removed. The alternative for these commands are the commands *bfuseblend* and *bcutblend* respectively. +* The command *ksection* has been removed. The alternative for this command is the command *bsection*. + +@subsection upgrade_720_Change_Of_FaceFace_Intersection Change of Face/Face intersection in Boolean operations + +* Previously, the intersection tolerance for all section curves between pair of faces has been calculated as the maximal tolerance among all curves. + Now, each curve has its own valid tolerance calculated as the maximal deviation of the 3D curve from its 2D curves or surfaces in case there are no 2D curves. +* The methods *IntTools_FaceFace::TolReached3d()*, *IntTools_FaceFace::TolReal()* and *IntTools_FaceFace::TolReached2d()* have been removed. +* Intersection tolerances of the curve can be obtained from the curve itself: + - *IntTools_Curve::Tolerance()* - returns the valid tolerance for the curve; + - *IntTools_Curve::TangentialTolerance()* - returns the tangential tolerance, which reflects the size of the common between faces. +* 2d tolerance (*IntTools_FaceFace::TolReached2d()*) has been completely removed from the algorithm as unused. + + +@subsection upgrade_720_persistence Restore OCCT 6.9.1 persistence + +The capability of reading / writing files in old format using *Storage_ShapeSchema* functionality from OCCT 6.9.1 has been restored in OCCT 7.2.0. + +One can use this functionality in two ways: +- invoke DRAW Test Harness commands *fsdread / fsdwrite* for shapes; +- call *StdStorage* class *Read / Write* functions in custom code. + +The code example below demonstrates how to read shapes from a storage driver using *StdStorage* class. + +~~~~ +// aDriver should be created and opened for reading +Handle(StdStorage_Data) aData; + +// Read data from the driver +// StdStorage::Read creates aData instance automatically if it is null +Storage_Error anError = StdStorage::Read(*aDriver, aData); +if (anError != Storage_VSOk) +{ + // Error processing +} + +// Get root objects +Handle(StdStorage_RootData) aRootData = aData->RootData(); +Handle(StdStorage_HSequenceOfRoots) aRoots = aRootData->Roots(); +if (!aRoots.IsNull()) +{ + // Iterator over the sequence of root objects + for (StdStorage_HSequenceOfRoots::Iterator anIt(*aRoots); anIt.More(); anIt.Next()) + { + Handle(StdStorage_Root)& aRoot = anIt.ChangeValue(); + // Get a persistent root's object + Handle(StdObjMgt_Persistent) aPObject = aRoot->Object(); + if (!aPObject.IsNull()) + { + Handle(ShapePersistent_TopoDS::HShape) aHShape = Handle(ShapePersistent_TopoDS::HShape)::DownCast(aPObject); + if (aHShape) // Downcast to an expected type to import transient data + { + TopoDS_Shape aShape = aHShape->Import(); + shapes.Append(aShape); + } + } + } +} +~~~~ + +The following code demonstrates how to write shapes in OCCT 7.2.0 using *StdStorage* class. + +~~~~ +// Create a file driver +NCollection_Handle aFileDriver(new FSD_File()); + +// Try to open the file driver for writing +try +{ + OCC_CATCH_SIGNALS + PCDM_ReadWriter::Open (*aFileDriver, TCollection_ExtendedString(theFilename), Storage_VSWrite); +} +catch (Standard_Failure& e) +{ + // Error processing +} + +// Create a storage data instance +Handle(StdStorage_Data) aData = new StdStorage_Data(); +// Set an axiliary application name (optional) +aData->HeaderData()->SetApplicationName(TCollection_ExtendedString("Application")); + +// Provide a map to track sharing +StdObjMgt_TransientPersistentMap aMap; +// Iterator over a collection of shapes +for (Standard_Integer i = 1; i <= shapes.Length(); ++i) +{ + TopoDS_Shape aShape = shapes.Value(i); + // Translate a shape to a persistent object + Handle(ShapePersistent_TopoDS::HShape) aPShape = + ShapePersistent_TopoDS::Translate(aShape, aMap, ShapePersistent_WithTriangle); + if (aPShape.IsNull()) + { + // Error processing + } + + // Construct a root name + TCollection_AsciiString aName = TCollection_AsciiString("Shape_") + i; + + // Add a root to storage data + Handle(StdStorage_Root) aRoot = new StdStorage_Root(aName, aPShape); + aData->RootData()->AddRoot(aRoot); +} + +// Write storage data to the driver +Storage_Error anError = StdStorage::Write(*aFileDriver, aData); +if (anError != Storage_VSOk) +{ + // Error processing +} +~~~~ + +@subsection upgrade_720_Change_In_BRepLib_MakeFace_Algo Change in BRepLib_MakeFace algorithm + +Previously, *BRepLib_MakeFace* algorithm changed orientation of the source wire in order to avoid creation of face as a hole (i.e. it is impossible to create the entire face as a hole; the hole can be created in context of another face only). New algorithm does not reverse the wire if it is open. Material of the face for the open wire will be located on the left side from the source wire. + +@subsection upgrade_720_Change_In_BRepFill_OffsetWire Change in BRepFill_OffsetWire algorithm + +From now on, the offset will always be directed to the outer region in case of positive offset value and to the inner region in case of negative offset value. +Inner/Outer region for an open wire is defined by the following rule: +when we go along the wire (taking into account edges orientation) the outer region will be on the right side, the inner region will be on the left side. +In case of a closed wire, the inner region will always be inside the wire (at that, the edges orientation is not taken into account). + +@subsection upgrade_720_Change_In_GeomAdaptor_Curve Change in Geom(2d)Adaptor_Curve::IsPeriodic + +Since 7.2.0 version, method *IsPeriodic()* returns the corresponding status of periodicity of the basis curve regardless of closure status of the adaptor curve (see method *IsClosed()*). +Method *IsClosed()* for adaptor can return false even on periodic curve, in the case if its parametric range is not full period, e.g. for adaptor on circle in range [0, @f$ \pi @f$]. +In previous versions, *IsPeriodic()* always returned false if *IsClosed()* returned false. + +@subsection upgrade_720_UnifySameDomain Change in algorithm ShapeUpgrade_UnifySameDomain + +The history of the changing of the initial shape was corrected: +* all shapes created by the algorithm are considered as modified shapes instead of generated ones; +* method Generated was removed and its calls should be replaced by calls of method History()->Modified. + +@subsection upgrade_720_Change_In_RWStl Changes in STL Reader / Writer + +Class RWStl now uses class Poly_Triangulation for storing triangular mesh instead of StlMesh data classes; the latter have been removed. + +@subsection upgrade_720_New_Error_Warning_system_in_BOA Refactoring of the Error/Warning reporting system in Boolean Component + +The Error/Warning reporting system of the algorithms in Boolean Component (in all BOPAlgo_* and BRepAlgoAPI_* algorithms) has been refactored. +The methods returning the status of errors and warnings of the algorithms (ErrorStatus() and WarningStatus()) have been removed. +Instead use methods HasErrors() and HasWarnings() to check for presence of errors and warnings, respectively. +The full list of errors and warnings, with associated data such as problematic sub-shapes, can be obtained by method GetReport(). + +@section upgrade_occt721 Upgrade to OCCT 7.2.1 + +@subsection upgrade_721_Changes_In_USD Changes in ShapeUpgrade_UnifySameDomain + +The following public methods in the class ShapeUpgrade_UnifySameDomain became protected: +* *UnifyFaces* +* *UnifyEdges* + +The following public method has been removed: +* *UnifyFacesAndEdges* + +@subsection upgrade_721_Move_BuildPCurveForEdgeOnPlane Moving BuildPCurveForEdgeOnPlane from BOPTools_AlgoTools2D to BRepLib + +The methods BuildPCurveForEdgeOnPlane and BuildPCurveForEdgesOnPlane have been moved from the class BOPTools_AlgoTools2D +to the more lower level class BRepLib. + +@subsection upgrade_721_removed Removed features + +The following obsolete features have been removed: +* The package BOPCol has been fully removed: + - *BOPCol_BaseAllocator* is replaced with *Handle(NCollection_BaseAllocator)*; + - *BOPCol_BoxBndTree* is replaced with *BOPTools_BoxBndTree*; + - *BOPCol_Box2DBndTree* is removed as unused; + - *BOPCol_DataMapOfIntegerInteger* is replaced with *TColStd_DataMapOfIntegerInteger*; + - *BOPCol_DataMapOfIntegerListOfInteger* is replaced with *TColStd_DataMapOfIntegerListOfInteger*; + - *BOPCol_DataMapOfIntegerListOfShape* is replaced with *TopTools_DataMapOfIntegerListOfShape*; + - *BOPCol_DataMapOfIntegerMapOfInteger.hxx* is removed as unused; + - *BOPCol_DataMapOfIntegerReal* is replaced with *TColStd_DataMapOfIntegerReal*; + - *BOPCol_DataMapOfIntegerShape* is replaced with *TopTools_DataMapOfIntegerShape*; + - *BOPCol_DataMapOfShapeBox* is replaced with *TopTools_DataMapOfShapeBox*; + - *BOPCol_DataMapOfShapeInteger* is replaced with *TopTools_DataMapOfShapeInteger*; + - *BOPCol_DataMapOfShapeListOfShape* is replaced with *TopTools_DataMapOfShapeListOfShape*; + - *BOPCol_DataMapOfShapeReal* is replaced with *TopTools_DataMapOfShapeReal*; + - *BOPCol_DataMapOfShapeShape* is replaced with *TopTools_DataMapOfShapeShape*; + - *BOPCol_DataMapOfTransientAddress* is removed as unused; + - *BOPCol_IndexedDataMapOfIntegerListOfInteger* is removed as unused; + - *BOPCol_IndexedDataMapOfShapeBox* is removed as unused; + - *BOPCol_IndexedDataMapOfShapeInteger* is removed as unused; + - *BOPCol_IndexedDataMapOfShapeListOfShape* is replaced with *TopTools_IndexedDataMapOfShapeListOfShape*; + - *BOPCol_IndexedDataMapOfShapeReal* is removed as unused; + - *BOPCol_IndexedDataMapOfShapeShape* is replaced with *TopTools_IndexedDataMapOfShapeShape*; + - *BOPCol_IndexedMapOfInteger* is replaced with *TColStd_IndexedMapOfInteger*; + - *BOPCol_IndexedMapOfOrientedShape* is replaced with *TopTools_IndexedMapOfOrientedShape*; + - *BOPCol_IndexedMapOfShape* is replaced with *TopTools_IndexedMapOfShape*; + - *BOPCol_ListOfInteger* is replaced with *TColStd_ListOfInteger*; + - *BOPCol_ListOfListOfShape* is replaced with *TopTools_ListOfListOfShape*; + - *BOPCol_ListOfShape* is replaced with *TopTools_ListOfShape*; + - *BOPCol_MapOfInteger* is replaced with *TColStd_MapOfInteger*; + - *BOPCol_MapOfOrientedShape* is replaced with *TopTools_MapOfOrientedShape*; + - *BOPCol_MapOfShape* is replaced with *TopTools_MapOfShape*; + - *BOPCol_PListOfInteger* is removed as unused; + - *BOPCol_PInteger* is removed as unused + - *BOPCol_SequenceOfPnt2d* is replaced with *TColgp_SequenceOfPnt2d*; + - *BOPCol_SequenceOfReal* is replaced with *TColStd_SequenceOfReal*; + - *BOPCol_SequenceOfShape* is replaced with *TopTools_SequenceOfShape*; + - *BOPCol_Parallel* is replaced with *BOPTools_Parallel*; + - *BOPCol_NCVector* is replaced with *NCollection_Vector*; +* The class *BOPDS_PassKey* and containers for it have been removed as unused. +* The unused containers from *IntTools* package have been removed: + - *IntTools_DataMapOfShapeAddress* is removed as unused; + - *IntTools_IndexedDataMapOfTransientAddress* is removed as unused; +* The container *BiTgte_DataMapOfShapeBox* is replaced with *TopTools_DataMapOfShapeBox*; +* The class *BOPTools* has been removed as duplicate of the class *TopExp*; +* The method *BOPAlgo_Builder::Splits()* has been removed as excessive. The method *BOPAlgo_Builder::Images()* can be used instead. +* The method *BOPTools_AlgoTools::CheckSameGeom()* has been removed as excessive. The method *BOPTools_AlgoTools::AreFacesSameDomain()* can be used instead. + +@section upgrade_occt730 Upgrade to OCCT 7.3.0 + +@subsection upgrade_730_lights Light sources + +Multiple changes have been applied to lights management within *TKV3d* and *TKOpenGl*: +* *V3d_Light* class is now an alias to *Graphic3d_CLight*. + *Graphic3d_CLight* is now a Handle class with refactored methods for managing light source parameters. + Most methods of *V3d_Light* sub-classes have been preserved to simplify porting. +* Obsolete debugging functionality for drawing a light source has been removed from *V3d_Light*. + Methods and constructors that take parameters for debug display and do not affect the light definition itself have also been removed. +* Light constructors taking *V3d_Viewer* have been marked as deprecated. + Use method *AddLight()* of the class *V3d_Viewer* or *V3d_View* to add new light sources to a scene or a single view, respectively. +* The upper limit of 8 light sources has been removed. +* The classes for specific light source types: *V3d_AmbientLight, V3d_DirectionalLight, V3d_PositionalLight* and *V3d_SpotLight* have been preserved, but it is now possible to define the light of any type by creating base class *Graphic3d_CLight* directly. The specific classes only hide unrelated light properties depending on the type of light source. +* It is no more required to call *V3d_Viewer::UpdateLights()* after modifying the properties of light sources (color, position, etc.) + +@subsection upgrade_730_shadingmodels Shading Models + +*Graphic3d_AspectFillArea3d* has been extended by a new property *ShadingModel()*, which previously has been defined globally for the entire View. + +Previously, a triangle array without normal vertex attributes was implicitly considered as unshaded, +but now such array will be shaded using *Graphic3d_TOSM_FACET* model (e.g. by computing per-triangle normals). +Therefore, *Graphic3d_TOSM_UNLIT* should be explicitly specified to disable shading of triangles array. +Alternatively, a material without reflectance properties can be used to disable shading (as before). + +@subsection upgrade_730_tkopengl Custom low-level OpenGL elements + +The following API changes should be considered while porting custom *OpenGl_Element* objects: +* *OpenGl_ShaderManager::BindFaceProgram()*, *BindLineProgram()*, *BindMarkerProgram()* now take enumeration arguments instead of Boolean flags. + +@subsection upgrade_730_BOPAlgo_Section Changes in BOPAlgo_Section + +The public method *BuildSection()* in the class *BOPAlgo_Section* has become protected. The methods *Perform()* or *PerformWithFiller()* should be called for construction of the result of SECTION operation. + +@subsection upgrade_730_BRepAdaptor_CompCurve Changes in BRepAdaptor_CompCurve + +The method *BRepAdaptor_CompCurve::SetPeriodic* has been eliminated. +Since the new version, the method *BRepAdaptor_CompCurve::IsPeriodic()* will always return FALSE. Earlier, it could return TRUE in case if the wire contained only one edge based on a periodic curve. + +@subsection upgrade_730_removed Removed features +* The methods *SetDeflection*, *SetEpsilonT*, *SetDiscretize* of the class *IntTools_EdgeFace* have been removed as redundant. +* Deprecated functionality *V3d_View::Export()*, related enumerations Graphic3d_ExportFormat, Graphic3d_SortType + as well as optional dependency from gl2ps library have been removed. + +@subsection upgrade_730_BuilderSolid Boolean Operations - Solid Builder algorithm + +Previously, the unclassified faces of *BOPAlgo_BuilderSolid* algorithm (i.e. the faces not used for solids creation and located outside of all created solids) were used to form an additional (not closed) solid with INTERNAL orientation. +Since the new version, these unclassified faces are no longer added into the resulting solids. Instead, the @ref specification__boolean_ers "warning" with a list of these faces appears. + +The following public methods of the *BOPAlgo_BuilderSolid* class have been removed as redundant: +* *void SetSolid(const TopoDS_Solid& theSolid);* +* *const TopoDS_Solid& Solid() const;* + +@subsection upgrade_730_BRepAlgoBO Boolean Operation classes in BRepAlgo are deprecated + +The API classes in the package BRepAlgo providing access to old Boolean operations are marked as deprecated: +* BRepAlgo_Fuse +* BRepAlgo_Common +* BRepAlgo_Cut +* BRepAlgo_Section +Corresponding classes from the package BRepAlgoAPI should be used instead. + +@subsection upgrade_730_replace_CDM_MessageDriver_interface_by_Message_Messenger Unification of the Error/Warning reporting system of Application Framework + +Class *CDM_MessageDriver* and its descendants have been removed; class *Message_Messenger* is used instead in all OCAF packages. +By default, messenger returned by *Message::DefaultMessenger()* is used, thus all messages generated by OCAF are directed in the common message queue of OCCT. + +In classes implementing OCAF persistence for custom attributes (those inheriting from *BinMDF_ADriver*, *XmlMDF_ADriver*), uses of method *WriteMessage()* should be replaced by call to method *Send()* of the inherited field *myMessageDriver*. Note that this method takes additional argument indicating the gravity of the message (Trace, Info, Warning, Alarm, or Fail). + +Class *Message_PrinterOStream* can be used instead of *CDM_COutMessageDriver* to direct all messages to a stream. +If custom driver class is used in the application, that class shall be reimplemented inheriting from *Message_Printer* instead of *CDM_MessageDriver*. +Method *Send()* should be redefined instead of method *Write()* of *CDM_MessageDriver*. +To use the custom printer in OCAF, it can be either added to default messenger or set into the custom *Message_Messenger* object created in the method *MessageDriver()* of a class inheriting *CDF_Application*. + +@section upgrade_occt740 Upgrade to OCCT 7.4.0 + +@subsection upgrade_740_BRepPrimAPI_MakeRevol Changes in BRepPrimAPI_MakeRevol algorithm +Previously the algorithm could create a shape with the same degenerated edge shared between some faces. Now it is prevented. The algorithm creates the different copy of this edge for each face. The method *Generated(...)* has been changed in order to apply restriction to the input shape: input shape can be only of type VERTEX, EDGE, FACE or SOLID. For input shape of another type the method always returns empty list. + +@subsection upgrade_740_removed Removed features +* The following methods of the class *BRepAlgoAPI_BooleanOperation* have been removed as obsolete or replaced: + - *BuilderCanWork* can be replaced with *IsDone* or *HasErrors* method. + - *FuseEdges* removed as obsolete. + - *RefineEdges* replaced with new method *SimplifyResult*. +* The method *ImagesResult* of the class *BOPAlgo_BuilderShape* has been removed as unused. The functionality of this method can be completely replaced by the history methods *Modified* and *IsDeleted*. +* The method *TrackHistory* of the classes *BOPAlgo_RemoveFeatures* and *BRepAlgoAPI_Defeaturing* has been renamed to *SetToFillHistory*. +* The method *GetHistory* of the class *BRepAlgoAPI_Defeaturing* has been renamed to *History*. +* The classes *BRepAlgo_BooleanOperations* and *BRepAlgo_DSAccess* have been removed as obsolete. Please use the BRepAlgoAPI_* classes to perform Boolean operations. +* *BRepAlgo_DataMapOfShapeBoolean* has been removed as unused. +* *BRepAlgo_DataMapOfShapeInterference* has been removed as unused. +* *BRepAlgo_EdgeConnector* has been removed as unused. +* *BRepAlgo_SequenceOfSequenceOfInteger* has been removed as unused. + +@subsection upgrade_740_localcontext Local Context removal + +Previously deprecated Local Context functionality has been removed from AIS package, +so that related methods have been removed from AIS_InteractiveContext interface: +*HasOpenedContext()*, *HighestIndex()*, *LocalContext()*, *LocalSelector()*, *OpenLocalContext()*, *CloseLocalContext()*, +*IndexOfCurrentLocal()*, *CloseAllContexts()*, *ResetOriginalState()*, *ClearLocalContext()*, *UseDisplayedObjects()*, *NotUseDisplayedObjects()*, +*SetShapeDecomposition()*, *SetTemporaryAttributes()*, *ActivateStandardMode()*, *DeactivateStandardMode()*, *KeepTemporary()*, +*SubIntensityOn()*, *SubIntensityOff()*, *ActivatedStandardModes()*, *IsInLocal()*, *AddOrRemoveSelected()* taking TopoDS_Shape. + +A set of deprecated methods previously related to Local Context and now redirecting to other methods has been preserved to simplify porting; they will be removed in next release. + +@subsection upgrade_740_geomconvert Changes in behavior of Convert algorithms + +Now methods *GeomConvert::ConcatG1*, *GeomConvert::ConcatC1*, *Geom2dConvert::ConcatG1*, *Geom2dConvert::ConcatC1* modify the input argument representing the flag of closedness. + +@subsection upgrade_740_selection Changes in selection API and picked point calculation algorithm. + +*SelectBasics_PickResult* structure has been extended, so that it now defines a 3D point on the detected entity in addition to Depth value along picking ray. +*SelectMgr_SelectingVolumeManager::Overlap()* methods have been corrected to fill in *SelectBasics_PickResult* structure (depth and 3D point) instead of only depth value, so that custom *Select3D_SensitiveEntity* implementation should be updated accordingly (including *Select3D_SensitiveSet* subclasses). + +@subsection upgrade_740_ocafpersistence Document format version management improvement. + +Previously Document format version restored by *DocumentRetrievalDriver* was propagated using static methods of the corresponding units (like *MDataStd* or *MNaming*) to static variables of these units and after that became accessible to Drivers of these units. +Now Document format version is available to drivers via *RelocationTable*. The Relocation table now keeps *HeaderData* of the document and a format version can be extracted in the following way: *theRelocTable.GetHeaderData()->StorageVersion()*. +Obsolete methods: *static void SetDocumentVersion (const Standard_Integer DocVersion)* and *static Standard_Integer DocumentVersion()* have been removed from *BinMDataStd*, *BinMNaming*, *XmlMDataStd* and *XmlMNaming*. + +@subsection upgrade_740_changed_api_of_brepmesh BRepMesh - revision of the data model + +The entire structure of *BRepMesh* component has been revised and separated into several logically connected classes. + +In new version, deflection is controlled more accurately, this may be necessary to tune parameters of call of the BRepMesh algorithm on the application side to obtain the same quality of presentation and/or performance as before. + +*BRepMesh_FastDiscret* and *BRepMesh_FastDiscretFace* classes have been removed. + +The following changes have been introduced in the API of *BRepMesh_IncrementalMesh*, component entry point: +* Due to revised logic, *adaptiveMin* parameter of the constructor has been removed as meaningless; +* *BRepMesh_FastDiscret::Parameters* has been moved to a separate structure called *IMeshTools_Parameters*; the signatures of related methods have been changed correspondingly. + +* Interface of *BRepMesh_Delaun* class has been changed. + +Example of usage: +Case 1 (explicit parameters): +~~~~ +#include +#include +#include + +Standard_Boolean meshing_explicit_parameters() +{ + BRepMesh_IncrementalMesh aMesher (aShape, 0.1, Standard_False, 0.5, Standard_True); + const Standard_Integer aStatus = aMesher.GetStatusFlags(); + return !aStatus; +} + +Standard_Boolean meshing_new() +{ + IMeshTools_Parameters aMeshParams; + aMeshParams.Deflection = 0.1; + aMeshParams.Angle = 0.5; + aMeshParams.Relative = Standard_False; + aMeshParams.InParallel = Standard_True; + aMeshParams.MinSize = Precision::Confusion(); + aMeshParams.InternalVerticesMode = Standard_True; + aMeshParams.ControlSurfaceDeflection = Standard_True; + + BRepMesh_IncrementalMesh aMesher (aShape, aMeshParams); + const Standard_Integer aStatus = aMesher.GetStatusFlags(); + return !aStatus; +} +~~~~ + +@subsection upgrade_740_chamfer Changes in API of Chamfer algorithms + +Some public methods of the class BRepFilletAPI_MakeChamfer are released from excess arguments: +- method Add for symmetric chamfer now takes only 2 arguments: distance and edge; +- method GetDistAngle now takes only 3 arguments: index of contour, distance and angle. + +@subsection upgrade_740_aspects Aspects unification + +Fill Area, Line and Marker aspects (classes *Graphic3d_AspectFillArea3d*, *Graphic3d_AspectLine3d*, *Graphic3d_AspectMarker3d* and *Graphic3d_AspectText3d*) +have been merged into new class *Graphic3d_Aspects* providing a single state for rendering primitives of any type. +The old per-primitive type aspect classes have been preserved as sub-classes of *Graphic3d_Aspects* with default values close to the previous behavior. +All aspects except Graphic3d_AspectFillArea3d define Graphic3d_TOSM_UNLIT shading model. + +The previous approach with dedicated aspects per primitive type was handy in simplified case, but lead to confusion otherwise. +In fact, drawing points or lines with lighting applied is a valid use case, but only *Graphic3d_AspectFillArea3d* previously defined necessary material properties. + +As aspects for different primitive types have been merged, Graphic3d_Group does no more provide per-type aspect properties. +Existing code relying on old behavior and putting interleaved per-type aspects into single Graphic3d_Group should be updated. +For example, the following pseudo-code will not work anymore, because all *SetGroupPrimitivesAspect* calls will setup the same property: +~~~~ +Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); +aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect()); +aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect()); //!< overrides previous aspect + +Handle(Graphic3d_ArrayOfSegments) aLines = new Graphic3d_ArrayOfSegments (2); +Handle(Graphic3d_ArrayOfTriangles) aTris = new Graphic3d_ArrayOfTriangles (3); +aGroup->AddPrimitiveArray (aLines); //!< both arrays will use the same aspect +aGroup->AddPrimitiveArray (aTris); +~~~~ + +To solve the problem, the code should be modified to either put primitives into dedicated groups (preferred approach), or using *SetPrimitivesAspect* in proper order: +~~~~ +Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); + +aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect()); +Handle(Graphic3d_ArrayOfTriangles) aTris = new Graphic3d_ArrayOfTriangles (3); +aGroup->AddPrimitiveArray (aTris); + +Handle(Graphic3d_ArrayOfSegments) aLines = new Graphic3d_ArrayOfSegments (2); +aGroup->SetPrimitivesAspect (myDrawer->LineAspect()->Aspect()); //!< next array will use the new aspect +aGroup->AddPrimitiveArray (aLines); +~~~~ + +@subsection upgrade_740_materials Material definition + +Decomposition of Ambient, Diffuse, Specular and Emissive properties has been eliminated within *Graphic3d_MaterialAspect* definition. +As result, the following methods of *Graphic3d_MaterialAspect* class have been removed: SetReflectionMode(), SetReflectionModeOn(), Ambient(), Diffuse(), Emissive(), Specular(), SetAmbient(), SetDiffuse(), SetSpecular(), SetEmissive(). + +Previously, computation of final value required the following code: +~~~~ +Graphic3d_MaterialAspect theMaterial; Quantity_Color theInteriorColor; +Graphic3d_Vec3 anAmbient (0.0f); +if (theMaterial.ReflectionMode (Graphic3d_TOR_AMBIENT)) +{ + anAmbient = theMaterial.MaterialType (Graphic3d_MATERIAL_ASPECT) + ? (Graphic3d_Vec3 )theInteriorColor * theMaterial.Ambient() + : (Graphic3d_Vec3 )theMaterial.AmbientColor() * theMaterial.Ambient(); +} +~~~~ + +New code looks like this: +~~~~ +Graphic3d_MaterialAspect theMaterial; Quantity_Color theInteriorColor; +Graphic3d_Vec3 anAmbient = theMaterial.AmbientColor(); +if (theMaterial.MaterialType (Graphic3d_MATERIAL_ASPECT)) { anAmbient *= (Graphic3d_Vec3 )theInteriorColor; } +~~~~ + +Existing code should be updated to: +- Replace Graphic3d_MaterialAspect::SetReflectionModeOff() with setting black color; SetReflectionModeOn() calls can be simply removed. + R.g. theMaterial.SetAmbientColor(Quantity_NOC_BLACK). +- Replace Graphic3d_MaterialAspect::Ambient(), SetAmbient(), Diffuse(), SetDiffuse(), Specular(), SetSpecular(), Emissive(), SetEmissive() with methods working with pre-multiplied color. + E.g. theMaterial.SetAmbientColor(Graphic3d_Vec3 (1.0f, 0.0f, 0.0f) * 0.2f). +- Avoid using Graphic3d_MaterialAspect::Color() and SetColor() with non-physical materials (Graphic3d_MATERIAL_ASPECT). + These materials do not include color definition, because it is taken from Graphic3d_Aspects::InteriorColor() - this has not been changed. + However, previously it was possible storing the color with SetColor() call and then fetching it with Color() by application code (the rendering ignored this value); + now SetColor() explicitly ignores call for Graphic3d_MATERIAL_ASPECT materials and Color() returns DiffuseColor() multiplication coefficients. + +@subsection upgrade_740_text Changes in Graphic3d_Text and OpenGl_Text API + +Parameters of *Text* in *Graphic3d_Group* are moved into a new *Graphic3d_Text* class. *AddText* of *Graphic3d_Group* should be used instead of the previous *Text*. + +The previous code: +~~~~ +Standard_Real x, y, z; +theAttachmentPoint.Coord(x,y,z); +theGroup->Text (theText, + Graphic3d_Vertex(x,y,z), + theAspect->Height(), + theAspect->Angle(), + theAspect->Orientation(), + theAspect->HorizontalJustification(), + theAspect->VerticalJustification()); +~~~~ +should be replaced by the new code: +~~~~ +Handle(Graphic3d_Text) aText = new Graphic3d_Text (theAspect->Height()); +aText->SetText (theText.ToExtString()); +aText->SetPosition (theAttachmentPoint); +aText->SetHorizontalAlignment (theAspect->HorizontalJustification()); +aText->SetVerticalAlignment (theAspect->VerticalJustification()); +theGroup->AddText (aText); +~~~~ + +*OpenGl_Text* contains *Graphic3d_Text* field. + +*OpenGl_TextParam* struct is removed. Constructor and *Init* of *OpenGl_Text* with *OpenGl_TextParam* are also removed. +Instead of using them, change *OpenGl_Text*. + +Please, note, that after modifying *OpenGl_Text*, *Reset* of *OpenGl_Text* should be called. + +*FormatParams* of *OpenGl_Text* is replaced by *Text*. + +@subsection upgrade_740_prsupdate Presentation invalidation + +Historically AIS_InteractiveObject provided two independent mechanisms invalidating presentation (asking presentation manager to recompute specific display mode or all modes): + +1. *AIS_InteractiveObject::SetToUpdate()*, marking existing presentation for update. + This is main invalidation API, which is expected to be followed by *AIS_InteractiveContext::Update()* call. +2. *AIS_InteractiveObject::myToRecomputeModes* + *myRecomputeEveryPrs*. + This is auxiliary invalidation API, used internally by AIS_InteractiveContext::SetColor()/UnsetColor() and similar modification methods. + +The latter one has been removed to avoid confusion and unexpected behavior. +In addition, two methods *AIS_InteractiveObject::Update()* have been deprecated in favor of new *AIS_InteractiveObject::UpdatePresentations()* recomputing only invalidated presentations. + +Custom presentations implementing interface methods *AIS_InteractiveObject::SetColor()* and others should be revised to use *AIS_InteractiveObject::SetToUpdate()* +or updating presentation without recomputation (see *AIS_InteractiveObject::SynchronizeAspects()* and *AIS_InteractiveObject::replaceAspects()*). + +@subsection upgrade_740_interiorstyles Interior styles + +* *Aspect_IS_HOLLOW* is now an alias to *Aspect_IS_EMPTY* and does not implicitly enables drawing mesh edges anymore. + Specify Graphic3d_AspectFillArea3d::SetDrawEdges(true) with Graphic3d_AspectFillArea3d::SetInteriorStyle(Aspect_IS_EMPTY) to get previous behavior of Aspect_IS_HOLLOW style. +* *Aspect_IS_HIDDENLINE* does not implicitly enables drawing mesh edges anymore. + Specify Graphic3d_AspectFillArea3d::SetDrawEdges(true) with Graphic3d_AspectFillArea3d::SetInteriorStyle(Aspect_IS_HIDDENLINE) to get previous behavior of Aspect_IS_HIDDENLINE style. + +@subsection upgrade_740_modedprs PrsMgr and SelectMgr hierarchy clean up + +Proxy classes *Prs3d_Presentation*, *PrsMgr_ModedPresentation* and *PrsMgr_Prs* have been removed. +Code iterating through the list of low-level structures AIS_InteractiveObject::Presentations() should be updated to access PrsMgr_Presentation directly. +Forward declarations of *Prs3d_Presentation* should be corrected, since it is now a typedef to *Graphic3d_Structure*. + +Proxy classes *SelectBasics_SensitiveEntity* and *SelectBasics_EntityOwner* have been removed - *Select3D_SensitiveEntity* and *SelectMgr_EntityOwner* should be now used directly instead. + +@subsection upgrade_740_offset Polygon offset defaults + +*Graphic3d_PolygonOffset* default constructor has been corrected to define Units=1 instead of Units=0. +Default polygon offset settings Mode=Aspect_POM_Fill + Factor=1 + Units=1 are intended to push triangulation +(Shaded presentation) a little bit behind of lines (Wireframe and Face Edges) +for reducing z-fighting effect of Shaded+Wireframe combination. +The change in defaults (Units changed from 0 to 1) is intended to cover scenario when camera direction is perpendicular to model plane (like 2D view). + +Application observing unexpected visual difference on this change should consider customizing this property within AIS_InteractiveContext default attributes +or on per-presentation basis via *Graphic3d_Aspects::SetPolygonOffset()* methods. + +@subsection upgrade_740_zlayer Adding ZLayers in given position + +Interface of insertion ZLayer in the viewer has been improved with ability to insert new layer before or after existing one. +Previously undocumented behavior of *V3d_Viewer::AddZlayer()* method has been corrected to insert new layer before *Graphic3d_ZLayerId_Top*. +Applications might need revising their custom layers creation code and specify precisely their order with new methods *V3d_Viewer::InsertLayerBefore()* and *V3d_Viewer::InsertLayerAfter()*. + +@subsection upgrade_740_enum_changed Modified enumerations + +Applications using integer values of the following enumerations in persistence +should be corrected as these enumerations have been modified: + +| Name | +| :----- | +| AIS_TypeOfAttribute | +| Aspect_InteriorStyle | +| Font_FontAspect | + +@subsection upgrade_740_geproj Custom defines within env.bat + +*env.bat* produced by Visual Studio project generator *genproj.bat* has been modified so that *%CSF_DEFINES%* variable is reset to initial state. +Custom building environment relying on old behavior and setting extra macros within *%CSF_DEFINES%* before env.bat should be updated +to either modify custom.bat or setup new variable *%CSF_DEFINES_EXTRA%* instead. + +@subsection upgrade_740_BVH_in_BOP Switching Boolean Operations algorithm to use BVH tree instead of UB tree + +Since OCCT 7.4.0 Boolean Operations algorithm uses BVH tree instead of UBTree to find the pairs of entities with interfering bounding boxes. +The following API changes have been made: +* BOPTools_BoxBndTree and BOPTools_BoxBndTreeSelector have been removed. Use the BOPTools_BoxTree and BOPTools_BoxTreeSelector instead. +* BOPTools_BoxSelector::SetBox() method now accepts the BVH_Box instead of Bnd_Box. +* Methods BOPTools_BoxSelector::Reject and BOPTools_BoxSelector::Accept have been removed as unused. +* The RunParallel flag has been removed from the list of parameters of BOPAlgo_Tools::IntersectVertices method. Earlier, it performed selection from the UB tree in parallel mode. Now all interfering pairs are found in one pass, using pair traverse of the same BVH tree. + +@subsection upgrade_740_stdnamespace Standard_Stream.hxx no more has "using std::" statements +*Standard_Stream.hxx* header, commonly included by other OCCT header files, does no more add entities from *std namespace* related to streams (like *std::cout*, *std::istream* and others) into global namespace. +The application code relying on this matter should be updated to either specify std namespace explicitly (like std::cout) or add "using std::" statements locally. + +@section upgrade_occt750 Upgrade to OCCT 7.5.0 + +@subsection upgrade_750_srgb_color RGB color definition + +OCCT 3D Viewer has been improved to properly perform lighting using in linear RGB color space and then convert result into non-linear gamma-shifted sRGB color space before displaying on display. +This change affects texture mapping, material definition and color definition. + +Previously *Quantity_Color* definition was provided with unspecified RGB color space. +In practice, mixed color spaces have been actually used, with non-linear sRGB prevailing in general. +Since OCCT 7.5.0, *Quantity_Color* now specifies that components are defined in linear RGB color space. + +This change affects following parts: +* Standard colors defined by *Quantity_NameOfColor* enumeration have been converted into linear RGB values within Quantity_Color construction. +* Application may use new enumeration value *Quantity_TOC_sRGB* for passing/fetching colors in sRGB color space, + which can be useful for interoperation with color picking widgets (returning 8-bit integer values within [0..255] range) + or for porting colors constants within old application code without manual conversion. +* *Graphic3d_MaterialAspect* color components are now expected in linear RGB color space, + and standard OCCT materials within *Graphic3d_NameOfMaterial* enumeration have been updated accordingly. +* Texture mapping now handles new *Graphic3d_TextureRoot::IsColorMap()* for interpreting content in linear RGB or sRGB color space. + It is responsibility of user specifying this flag correctly. The flag value is TRUE by default. +* Method *Image_PixMap::PixelColor()* has been extended with a new Boolean flag for performing linearization of non-linear sRGB. + This flag is FALSE by default; application should consider passing TRUE instead for further handling *Quantity_Color* properly as linear RGB values. + +@subsection upgrade_750_aspectwindow Aspect_Window interface change + +Unexpected const-ness of Aspect_Window::DoResize() method has been removed, so that application classes implementing this interface should be updated accordingly. + +@subsection upgrade_750_rename Renaming of types + +Enumeration BRepOffset_Type is renamed to ChFiDS_TypeOfConcavity. + +@subsection upgrade_750_BRepOffset_MakeOffset change in construction of offset faces + +Now by default offset faces of non-planar faces may be planar faces if their originals can be approximated by planes. + +@subsection upgrade_750_tkv3d TKV3d/TKService toolkits changes + +The following changes could be highlighted while porting: +* *Prs3d::GetDeflection()* has been moved to *StdPrs_ToolTriangulatedShape::GetDeflection()*. +* *Prs3d_ShapeTool* has been moved to *StdPrs_ShapeTool*. +* *StdSelect_ViewerSelector3d* has been moved to *SelectMgr_ViewerSelector3d*. +* *Font_BRepFont* has been moved to *StdPrs_BRepFont*. +* Visualization classes now use *TopLoc_Datum3D* (from *TKMath*) instead of *Geom_Transformation* (from *TKG3d*) as smart pointer to *gp_Trsf*. + This is rather an internal change, but some applications might need to be updated. + +@subsection upgrade_750_hlrangle Prs3d_Drawer deviation angle + +Properties Prs3d_Drawer::HLRAngle() and Prs3d_Drawer::HLRDeviationCoefficient() have been removed from classes *Prs3d_Drawer*, *AIS_Shape* and *AIS_InteractiveContext*. +Prs3d_Drawer::DeviationAngle() should be now used instead of Prs3d_Drawer::HLRAngle() and Prs3d_Drawer::DeviationCoefficient() instead of Prs3d_Drawer::HLRDeviationCoefficient(). +The default value of Prs3d_Drawer::DeviationAngle() property has been changed from 12 to 20 degrees to match removed Prs3d_Drawer::HLRAngle(), previously used as input for triangulation algorithm. + +@subsection upgrade_750_hlrprs Changes in HLR presentation API + +Methods computing HLR presentation within *PrsMgr_PresentableObject::Compute()* have been renamed to *PrsMgr_PresentableObject::computeHLR()* +and now accept *Graphic3d_Camera* object instead of removed *Prs3d_Projector*. + +@subsection upgrade_750_dimensions Dimension and Relation presentations moved from AIS to PrsDim + +Presentation classes displaying Dimensions and Relations have been moved from *AIS* package to *PrsDim*. +Corresponding classes should be renamed in application code (like *AIS_LengthDimension* -> *PrsDim_LengthDimension*). + +@subsection upgrade_750_sensitiveEntity Select3D_SensitiveEntity interface change + +The method Select3D_SensitiveEntity::NbSubElements() has been changed to be constant. Select3D_SensitiveEntity subclasses at application level should be updated accordingly. + + +@subsection upgrade_750_Booleans Changes in Boolean operations algorithm + +* TreatCompound method has been moved from *BOPAlgo_Tools* to *BOPTools_AlgoTools*. Additionally, the map parameter became optional: +~~~~ +void BOPTools_AlgoTools::TreatCompound (const TopoDS_Shape& theS, + TopTools_ListOfShape& theLS, + TopTools_MapOfShape* theMap = NULL); +~~~~ + +@subsection upgrade_750_Adaptor2d_OffsetCurve Offset direction change + +Offset direction, which used in class Adaptor2d_OffsetCurve for evaluating values and derivatives of offset curve is unified for offset direction used in class Geom2d_OffsetCurve: now offset direction points to outer ("right") side of base curve instead of the previously used inner ("left") side. Old usage of class in any application should be changed something like that: + +Adaptor2d_OffsetCurve aOC(BaseCurve, Offset) --> Adaptor2d_OffsetCurve aOC(BaseCurve, -Offset) + +@subsection upgrade_750_ProgressIndicator Change of progress indication API + +The progress indication mechanism has been revised to eliminate its weak points in +previous design (leading to implementation mistakes). +Redesign also allows using progress indicator in multi-threaded algorithms +in more straight-forward way with minimal overhead. +Note however, that multi-threaded algorithm should pre-allocate per-task +progress ranges in advance to ensure thread-safety - +see examples in documentation of class Message_ProgressScope for details. + +Classes Message_ProgressSentry and Message_ProgressScale have been removed. +New classes Message_ProgressScope and Message_ProgressRange should be used as main +API classes to organize progress indication in the algorithms. +Instances of the class Message_ProgressRange are used to pass the progress capability to +nested levels of the algorithm, and an instance of the class Message_ProgressScope is to +be created (preferably as local variable) to manage progress at each level of the algorithm. +The instance of Message_ProgressIndicator is not passed anymore to sub-algorithms. +See documentation of the class Message_ProgressScope for more details and examples. + +Methods to deal with progress scopes and to advance progress are removed from class +Message_ProgressIndicator; now it only provides interface to the application-level progress indicator. +Virtual method Message_ProgressIndicator::Show() has changed its signature and should be +updated accordingly in descendants of Message_ProgressIndicator. +The scope passed as argument to this method can be used to obtain information on context +of the current process (instead of calling method GetScope() in previous implementation). +Methods Show(), UserBreak(), and Reset() are made protected in class Message_ProgressIndicator; +methods More() or UserBreak() of classes Message_ProgressScope or Message_ProgressRange should +be used to know if the cancel event has come. +See documentation of the class Message_ProgressIndicator for more details and implementation +of Draw_ProgressIndicator for an example. + +Let's take a look onto typical algorithm using an old API: +@code +class MyAlgo +{ +public: + //! Algorithm entry point taking an optional Progress Indicator. + bool Perform (const TCollection_AsciiString& theFileName, + const Handle(Message_ProgressIndicator)& theProgress = Handle(Message_ProgressIndicator)()) + { + Message_ProgressSentry aPSentry (theProgress, (TCollection_AsciiString("Processing ") + theFileName).ToCString(), 2); + { + Message_ProgressSentry aPSentry1 (theProgress, "Stage 1", 0, 153, 1); + for (int anIter = 0; anIter < 153; ++anIter, aPSentry1.Next()) + { + if (!aPSentry1.More()) { return false; } + // do some job here... + } + } + aPSentry.Next(); + { + perform2 (theProgress); + } + aPSentry.Next(); + bool wasAborted = !theProgress.IsNull() && theProgress->UserBreak(); + return !wasAborted; + } + +private: + //! Nested sub-algorithm taking Progress Indicator. + bool perform2 (const Handle(Message_ProgressIndicator)& theProgress) + { + Message_ProgressSentry aPSentry2 (theProgress, "Stage 2", 0, 100, 1); + for (int anIter = 0; anIter < 100 && aPSentry2.More(); ++anIter, aPSentry2.Next()) {} + return !aPSentry2.UserBreak(); + } +}; + +// application executing an algorithm +Handle(Message_ProgressIndicator) aProgress = new MyProgress(); +MyAlgo anAlgo; +anAlgo.Perform ("FileName", aProgress); +@endcode + +The following guidance can be used to update such code: +- Replace `const Handle(Message_ProgressIndicator)&` with `const Message_ProgressRange&` + in arguments of the methods that support progress indication. + Message_ProgressIndicator object should be now created only at place where application starts algorithms. +- Replace `Message_ProgressSentry` with `Message_ProgressScope`. + Take note that Message_ProgressScope has less arguments (no "minimal value"). + In other aspects, Message_ProgressScope mimics an iterator-style interface + (with methods More() and Next()) close to the old Message_ProgressSentry (pay attention + to extra functionality of Message_ProgressScope::Next() method below). + Note that method Message_ProgressScope::Close() is equivalent of the method + Relieve() of Message_ProgressSentry in previous version. + Class Message_ProgressSentry is still defined (marked as deprecated) providing + API more close to old one, and can be still used to reduce porting efforts. +- Each Message_ProgressScope should take the next Range object to work with. + Within old API, Message_ProgressSentry received the root Progress Indicator + object which mantained the sequence of ranges internally. + Message_ProgressScope in new API takes Message_ProgressRange, which should be + returned by Message_ProgressScope::Next() method of the parent scope. + Do not use the same Range passed to the algorithm for all sub-Scopes like + it was possible in old API; each range object may be used only once. + +Take a look onto ported code and compare with code above to see differences: + +@code +class MyAlgo +{ +public: + //! Algorithm entry point taking an optional Progress Range. + bool Perform (const TCollection_AsciiString& theFileName, + const Message_ProgressRange& theProgress = Message_ProgressRange()) + { + Message_ProgressScope aPSentry (theProgress, TCollection_AsciiString("Processing ") + theFileName, 2); + { + Message_ProgressScope aPSentry1 (aPSentry.Next(), "Stage 1", 153); + for (int anIter = 0; anIter < 153; ++anIter, aPSentry1.Next()) + { + if (!aPSentry1.More()) { return false; }; + // do some job here... + } + } + { + perform2 (aPSentry.Next()); + } + bool wasAborted = aPSentry.UserBreak(); + return !wasAborted; + } + + //! Nested sub-algorithm taking Progress sub-Range. + bool perform2 (const Message_ProgressRange& theProgress) + { + Message_ProgressScope aPSentry2 (theProgress, "Stage 2", 100); + for (int anIter = 0; anIter < 100 && aPSentry2.More(); ++anIter, aPSentry2.Next()) {} + return !aPSentry2.UserBreak(); + } +}; + +// application executing an algorithm +Handle(Message_ProgressIndicator) aProgress = new MyProgress(); +MyAlgo anAlgo; +anAlgo.Perform ("FileName", aProgress->Start()); +@endcode + +@subsection upgrade_750_message_messenger Message_Messenger interface change + +Operators << with left argument *Handle(Message_Messenger)*, used to output messages with +a stream-like interface, have been removed. +This functionality is provided now by separate class *Message_Messenger::StreamBuffer*. +That class contains a stringstream buffer which can be filled using standard stream +operators. The string is sent to a messenger on destruction of the buffer object, +call of its method Flush(), or using operator << with one of ostream manipulators +(*std::endl, std::flush, std::ends*). Manipulator *Message_EndLine* has been removed, +*std::endl* should be used instead. + +New methods *SendFail(), SendAlarm(), SendWarning(), SendInfo()*, and *SendTrace()* are +provided in both *Message_Messenger* class and as static functions in *Message* package +(short-cuts to default messenger), returning buffer object for the output of +corresponding type of the message. + +The code that used operator << for messenger, should be ported as follows. + +Before the change: +~~~~~ + Handle(Message_Messenger) theMessenger = ...; + theMessenger << "Value = " << anInteger << Message_EndLine; +~~~~~ + +After the change, single-line variant: +~~~~~ + Handle(Message_Messenger) theMessenger = ...; + theMessenger->SendInfo() << "Value = " << anInteger << std::endl; +~~~~~ + +After the change, extended variant: +~~~~~ + Handle(Message_Messenger) theMessenger = ...; + Message_Messenger::StreamBuffer aSender = theMessenger->SendInfo(); + aSender << "Array: [ "; + for (int i = 0; i < aNb; ++i) { aSender << anArray[i] << " "; } + aSender << "]" << std::endl; // aSender can be used further for other messages +~~~~~ + +@subsection upgrade_750_message_printer Message_Printer interface change + +Previously, sub-classes of *Message_Printer* have to provide a triplet of *Message_Printer::Send()* methods accepting different string representations: TCollection_AsciiString, TCollection_ExtendedString and Standard_CString. +*Message_Printer* interface has been changed, so that sub-classes now have to implement only single method *Message_Printer::send()* accepting TCollection_AsciiString argument and having no Endl flag, which has been removed. +Old three Message_Printer::Send() methods remain defined virtual with unused last argument and redirecting to new send() method by default. + +@subsection upgrade_750_prd3d_root Prs3d_Root deprecation + +Redundant class Prs3d_Root has been marked as deprecated - Prs3d_Presentation::NewGroup() should be called directly. + +@subsection upgrade_750_cdf_session Support of multiple OCAF application instances + +Class *CDF_Session* has been removed. +That class was used to store global instance of OCAF application (object of class *CDM_Application* or descendant, typically *TDataStd_Application*). +Global directory of all opened OCAF documents has been removed as well; such directory is maintained now by each instance of the *CDM_Application* class. + +This allows creating programs that work with different OCAF documents concurrently in paralel threads, +provided that each thread deals with its own instance of *TDataStd_Application* and documents managed by this instance. + +Note that neither *TDataStd_Application* nor *TDocStd_Document* is protected from concurrent access from several threads. +Such protection, if necessary, shall be implemented on the application level. +For an example, access to labels and attributes could be protected by mutex if there is a probability that different threads access the same labels / attributes: +~~~~~ + { + Standard_Mutex::Sentry aSentry (myMainLabelAccess); + TDF_Label aChildLab = aDocument->Main().NewChild(); + TDataStd_Integer::Set(aChildLab, 0); + } +~~~~~ + +@subsection upgrade_750_draw_hotkeys Draw Harness hotkeys + +Draw Harness hotkeys **W** (Wireframe) and **S** (Shaded) have been re-mapped to **Ctrl+W** and **Ctrl+S**. +Hotkey **A** has been remapped to **Backspace**. +Hotkeys WASD and Arrays are now mapped for walk-through navigation in 3D Viewer. + +@subsection upgrade_750_msgfile_utf8 Utf-8 encoding for message files + +Message files (with extension .msg) are now expected to be in UTF-8 encoding (unless they have UTF-16 BOM in which case UTF-16 is expected). +This allows using arbitrary Unicode symbols for localization of messages. + +Existing message files containing 8-bit characters (previously interpreted as characters from Latin-1 code block) should be converted to UTF-8. diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/boolean_operations.md opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/boolean_operations.md --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/boolean_operations.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/boolean_operations.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,3556 +0,0 @@ -Boolean Operations {#occt_user_guides__boolean_operations} -========================= - -@tableofcontents - -@section occt_algorithms_1 Introduction - -This document provides a comprehensive description of the Boolean Operation Algorithm (BOA) as it is implemented in Open CASCADE Technology. The Boolean Component contains: - -* General Fuse Operator (GFA), -* Boolean Operator (BOA), -* Section Operator (SA), -* Splitter Operator (SPA). - -GFA is the base algorithm for BOA, SPA, SA. - -GFA has a history-based architecture designed to allow using OCAF naming functionality. The architecture of GFA is expandable, that allows creating new algorithms basing on it. - - -@section occt_algorithms_2 Overview - -@subsection occt_algorithms_2_1 Operators - -@subsubsection occt_algorithms_2_1_1 Boolean operator - -The Boolean operator provides the operations (Common, Fuse, Cut) between two groups: *Objects* and *Tools*. Each group consists of an arbitrary number of arguments in terms of *TopoDS_Shape*. - -The operator can be represented as: - -RB=Bj (G1, G2), - -where: -* *RB* -- result of the operation; -* *Bj* -- operation of type *j* (Common, Fuse, Cut); -* *G1={S11, S12 ... S1n1}* group of arguments (Objects); -* *G2={S21, S22 ... S2n2}* group of arguments (Tools); -* *n1* -- Number of arguments in *Objects* group; -* *n2* -- Number of arguments in *Tools* group. - - -**Note** There is an operation *Cut21*, which is an extension for forward Cut operation, i.e Cut21=Cut(G2, G1). - -For more details see @ref occt_algorithms_9 "Boolean Operations Algorithm" section. - -@subsubsection occt_algorithms_2_1_2 General Fuse operator - -The General fuse operator can be applied to an arbitrary number of arguments in terms of *TopoDS_Shape*. - -The GFA operator can be represented as: - -RGF = GF (S1, S2 ... Sn), - -where -* *RGF* -- result of the operation, -* *S1, S2 ... Sn* -- arguments of the operation, -* *n* -- number of arguments. - -The result of the Boolean operator, *RB*, can be obtained from *RGF*. - -For example, for two arguments *S1* and *S2* the result *RGF* is - -RGF = GF (S1, S2) = Sp1 + Sp2 + Sp12 - -@figure{/user_guides/boolean_operations/images/operations_image001.svg,"Operators",320} - -This Figure shows that -* Bcommon (S1, S2) = Sp12; -* Bcut12 (S1, S2) = Sp1; -* Bcut21 (S1, S2) = Sp2; -* Bfuse (S1, S2) = Sp1+Sp2+Sp12 - -RGF=GF (S1, S2) = Bfuse = Bcommon+ Bcut12+ Bcut21. - -The fact that *RGF* contains the components of *RB* allows considering GFA as the general case of BOA. So it is possible to implement BOA as a subclass of GFA. - -For more details see @ref occt_algorithms_7 "General Fuse Algorithm" section. - -@subsubsection occt_algorithms_2_1_3 Splitter operator - -The Splitter operator can be applied to an arbitrary number of arguments in terms of *TopoDS_Shape*. The arguments are divided into two groups: *Objects* and *Tools*. The result of *SPA* contains all parts that belong to the *Objects* but does not contain the parts that belong to the *Tools*. - -The *SPA* operator can be represented as follows: - -RSPA=SPA (G1, G2), -where: -* RSPA -- is the result of the operation; -* *G1={S11, S12 ... S1n1}* group of arguments (*Objects*); -* *G2={S21, S22 ... S2n2}* group of arguments (*Tools*); -* *n1* -- Number of arguments in *Objects* group; -* *n2* -- Number of arguments in *Tools* group. - -The result *RSPA* can be obtained from *RGF* . - -For example, for two arguments *S1* and *S2* the result *RSPA* is - -RSPA=SPA(S1,S2)=Sp1+Sp12. - -In case when all arguments of the *SPA* are *Objects* and there are no *Tools*, the result of *SPA* is equivalent to the result of *GFA*. - -For example, when *G1* consists of shapes *S1* and *S2* the result of *SPA* is - -RSPA=SPA(S1, S2) = Sp1 + Sp2 + Sp12 = GF (S1, S2) - -The fact that the *RGF* contains the components of *RSPA* allows considering *GFA* as the general case of *SPA*. Thus, it is possible to implement *SPA* as a subclass of *GFA*. - -For more details see @ref occt_algorithms_8 "Splitter Algorithm" section. - -@subsubsection occt_algorithms_2_1_4 Section operator - -The Section operator *SA* can be applied to arbitrary number of arguments in terms of *TopoDS_Shape*. The result of *SA* contains vertices and edges in accordance with interferences between the arguments -The SA operator can be represented as follows: -RSA=SA(S1, S2… Sn), where -* RSA -- the operation result; -* S1, S2 ... Sn -- the operation arguments; -* *n* -- the number of arguments. - -For more details see @ref occt_algorithms_10a "Section Algorithm" section. - -@subsection occt_algorithms_2_2 Parts of algorithms - -GFA, BOA, SPA and SA have the same Data Structure (DS). The main goal of the Data Structure is to store all necessary information for input data and intermediate results. - -The operators consist of two main parts: -* Intersection Part (IP). The main goal of IP is to compute the interferences between sub-shapes of arguments. The IP uses DS to retrieve input data and store the results of intersections. -* Building Part (BP). The main goal of BP is to build required result of an operation. This part also uses DS to retrieve data and store the results. - -As it follows from the definition of operator results, the main differences between GFA, BOA, SPA and SA are in the Building Part. The Intersection Part is the same for the algorithms. - -@section occt_algorithms_3 Terms and Definitions - -This chapter provides the background terms and definitions that are necessary to understand how the algorithms work. - -@subsection occt_algorithms_3_1 Interferences - -There are two groups of interferences. - -At first, each shape having a boundary representation (vertex, edge, face) has an internal value of geometrical tolerance. The shapes interfere with each other in terms of their tolerances. The shapes that have a boundary representation interfere when there is a part of 3D space where the distance between the underlying geometry of shapes is less or equal to the sum of tolerances of the shapes. Three types of shapes: vertex, edge and face -- produce six types of **BRep interferences:** -* Vertex/Vertex, -* Vertex/Edge, -* Vertex/Face, -* Edge/Edge, -* Edge/Face and -* Face/Face. - -At second, there are interferences that occur between a solid *Z1* and a shape *S2* when *Z1* and *S2* have no BRep interferences but *S2* is completely inside of *Z1*. These interferences are **Non-BRep interferences**. There are four possible cases: -* Vertex/Solid, -* Edge/Solid, -* Face/Solid and -* Solid/Solid. - -@subsubsection occt_algorithms_3_1_1 Vertex/Vertex interference - -For two vertices *Vi* and *Vj*, the distance between their corresponding 3D points is less than the sum of their tolerances *Tol(Vi)* and *Tol(Vj)*. - -@figure{/user_guides/boolean_operations/images/operations_image002.svg,"Vertex/vertex interference",420} - -The result is a new vertex *Vn* with 3D point *Pn* and tolerance value Tol(Vn). - -The coordinates of *Pn* and the value Tol(Vn) are computed as the center and the radius of the sphere enclosing the tolerance spheres of the source vertices (V1, V2). - -@subsubsection occt_algorithms_3_1_2 Vertex/Edge interference - -For a vertex *Vi* and an edge *Ej*, the distance *D* between 3D point of the vertex and its projection on the 3D curve of edge *Ej* is less or equal than sum of tolerances of vertex *Tol(Vi)* and edge *Tol(Ej)*. - -@figure{/user_guides/boolean_operations/images/operations_image003.svg,"Vertex/edge interference",420} - -The result is vertex *Vi* with the corresponding tolerance value Tol(Vi)=Max(Tol(Vi), D+Tol(Ej)), where D = distance (Pi, PPi); - -and parameter *ti* of the projected point *PPi* on 3D curve *Cj* of edge *Ej*. - -@subsubsection occt_algorithms_3_1_3 Vertex/Face interference - -For a vertex *Vi* and a face *Fj* the distance *D* between 3D point of the vertex and its projection on the surface of the face is less or equal than sum of tolerances of the vertex *Tol(Vi)* and the face *Tol(Fj)*. - -@figure{/user_guides/boolean_operations/images/operations_image004.svg,"Vertex/face interference",420} - -The result is vertex *Vi* with the corresponding tolerance value Tol(Vi)=Max(Tol(Vi), D+Tol(Fj)), where D = distance (Pi, PPi) - -and parameters ui, vi of the projected point *PPi* on surface *Sj* of face *Fj*. - -@subsubsection occt_algorithms_3_1_4 Edge/Edge interference - -For two edges *Ei* and *Ej* (with the corresponding 3D curves *Ci* and *Cj*) there are some places where the distance between the curves is less than (or equal to) sum of tolerances of the edges. - -Let us examine two cases: - -In the first case two edges have one or several common parts of 3D curves in terms of tolerance. - -@figure{/user_guides/boolean_operations/images/operations_image005.svg,"Edge/edge interference: common parts",420} - -The results are: -* Parametric range [ti1, ti2 ] for 3D curve *Ci* of edge *Ei*. -* Parametric range [tj1, tj2 ] for 3D curve *Cj* of edge *Ej*. - -In the second case two edges have one or several common points in terms of tolerance. - -@figure{/user_guides/boolean_operations/images/operations_image006.svg,"Edge/edge interference: common points",420} - -The result is a new vertex *Vn* with 3D point *Pn* and tolerance value *Tol(Vn)*. - -The coordinates of *Pn* and the value *Tol(Vn)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of 3D curves *Ci*, *Cj* of source edges *Ei*, *Ej*. - -* Parameter *ti* of *Pi* for the 3D curve *Ci*. -* Parameter *tj* of *Pj* for the 3D curve *Cj*. - -@subsubsection occt_algorithms_3_1_5 Edge/Face interference - -For an edge *Ei* (with the corresponding 3D curve *Ci*) and a face *Fj* (with the corresponding 3D surface *Sj*) there are some places in 3D space, where the distance between *Ci* and surface *Sj* is less than (or equal to) the sum of tolerances of edge *Ei* and face *Fj*. - -Let us examine two cases: - -In the first case Edge *Ei* and Face *Fj* have one or several common parts in terms of tolerance. - -@figure{/user_guides/boolean_operations/images/operations_image007.svg,"Edge/face interference: common parts",420} - -The result is a parametric range [ti1, ti2] for the 3D curve *Ci* of the edge *Ei*. - -In the second case Edge *Ei* and Face *Fj* have one or several common points in terms of tolerance. - -@figure{/user_guides/boolean_operations/images/operations_image008.svg,"Edge/face interference: common points",420} - -The result is a new vertex *Vn* with 3D point *Pn* and tolerance value *Tol(Vn)*. - -The coordinates of *Pn* and the value *Tol(Vn)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of 3D curve *Ci* and surface *Sj* of source edges *Ei*, *Fj*. - -* Parameter *ti* of *Pi* for the 3D curve *Ci*. -* Parameters *ui* and *vi* of the projected point *PPi* on the surface *Sj* of the face *Fj*. - -@subsubsection occt_algorithms_3_1_6 Face/Face Interference - -For a face *Fi* and a face *Fj* (with the corresponding surfaces *Si* and *Sj*) there are some places in 3D space, where the distance between the surfaces is less than (or equal to) sum of tolerances of the faces. - -@figure{/user_guides/boolean_operations/images/operations_image009.svg,"Face/face interference: common curves",418} - -In the first case the result contains intersection curves *Cijk (k = 0, 1, 2…kN,* where *kN* is the number of intersection curves with corresponding values of tolerances *Tol(Cijk)*. - -@figure{/user_guides/boolean_operations/images/operations_image010.svg,"Face/face interference: common points",305} - -In the second case Face *Fi* and face *Fj* have one or several new vertices *Vijm*, where m=0,1,2, ... mN, mN is the number of intersection points. - -The coordinates of a 3D point *Pijm* and the value *Tol(Vijm)* are computed as the center and the radius of the sphere enclosing the tolerance spheres of the corresponding nearest points *Pi*, *Pj* of the surface *Si*, *Sj* of source shapes *Fi*, *Fj*. - -* Parameters *uj*, *vj* belong to point *PPj* projected on surface *Sj* of face *Fj*. -* Parameters *ui* and *vi* belong to point *PPi* projected on surface *Si* of face *Fi*. - -@subsubsection occt_algorithms_3_1_7 Vertex/Solid Interference - -For a vertex *Vi* and a solid *Zj* there is Vertex/Solid interference if the vertex *Vi* has no BRep interferences with any sub-shape of *Zj* and *Vi* is completely inside the solid *Zj*. - -@figure{/user_guides/boolean_operations/images/operations_image060.png,"Vertex/Solid Interference",220} - -@subsubsection occt_algorithms_3_1_8 Edge/Soild Interference - -For an edge *Ei* and a solid *Zj* there is Edge/Solid interference if the edge *Ei* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Ei* is completely inside the solid *Zj*. - -@figure{/user_guides/boolean_operations/images/operations_image061.png,"Edge/Solid Interference",220} - -@subsubsection occt_algorithms_3_1_9 Face/Soild Interference - -For a face *Fi* and a solid *Zj* there is Face/Solid interference if the face *Fi* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Fi* is completely inside the solid *Zj*. - -@figure{/user_guides/boolean_operations/images/operations_image062.png,"Face/Solid Interference",220} - -@subsubsection occt_algorithms_3_1_10 Solid/Soild Interference - -For a solid *Zi* and a solid *Zj* there is Solid/Solid interference if the solid *Zi* and its sub-shapes have no BRep interferences with any sub-shape of *Zj* and *Zi* is completely inside the solid *Zj*. - -@figure{/user_guides/boolean_operations/images/operations_image063.png,"Solid/Solid Interference",220} - - -@subsubsection occt_algorithms_3_1_11 Computation Order - -The interferences between shapes are computed on the basis of increasing of the dimension value of the shape in the following order: -* Vertex/Vertex, -* Vertex/Edge, -* Edge/Edge, -* Vertex/Face, -* Edge/Face, -* Face/Face, -* Vertex/Solid, -* Edge/Solid, -* Face/Solid, -* Solid/Solid. - -This order allows avoiding the computation of redundant interferences between upper-level shapes *Si* and *Sj* when there are interferences between lower sub-shapes *Sik* and *Sjm*. - -@subsubsection occt_algorithms_3_1_12 Results - -* The result of the interference is a shape that can be either interfered shape itself (or its part) or a new shape. -* The result of the interference is a shape with the dimension value that is less or equal to the minimal dimension value of interfered shapes. For example, the result of Vertex/Edge interference is a vertex, but not an edge. -* The result of the interference splits the source shapes on the parts each time as it can do that. - -@subsection occt_algorithms_3_2 Paves - -The result of interferences of the type Vertex/Edge, Edge/Edge and Edge/Face in most cases is a vertex (new or old) lying on an edge. - -The result of interferences of the type Face/Face in most cases is intersection curves, which go through some vertices lying on the faces. - -The position of vertex *Vi* on curve *C* can be defined by a value of parameter ti of the 3D point of the vertex on the curve. -Pave *PVi* on curve *C* is a structure containing the vertex *Vi* and correspondent value of the parameter ti of the 3D point of the vertex on the curve. Curve *C* can be a 3D or a 2D curve. - -@figure{/user_guides/boolean_operations/images/operations_image011.svg,"Paves",340} - -Two paves *PV1* and *PV2* on the same curve *C* can be compared using the parameter value @code PV1 > PV2 if t1 > t2 @endcode - -The usage of paves allows binding of the vertex to the curve (or any structure that contains a curve: edge, intersection curve). - - -@subsection occt_algorithms_3_3 Pave Blocks - -A set of paves *PVi (i=1, 2...nPV)*, where *nPV* is the number of paves] of curve *C* can be sorted in the increasing order using the value of parameter *t* on curve *C*. - -A pave block *PBi* is a part of the object (edge, intersection curve) between neighboring paves. - -@figure{/user_guides/boolean_operations/images/operations_image012.svg,"Pave Blocks",340} - -Any finite source edge *E* has at least one pave block that contains two paves *PVb* and *PVe*: -* Pave *PVb* corresponds to the vertex *Vb* with minimal parameter tb on the curve of the edge. -* Pave *PVe* corresponds to the vertex *Ve* with maximal parameter te on the curve of the edge. - -@subsection occt_algorithms_3_4 Shrunk Range - -Pave block *PV* of curve *C* is bounded by vertices *V1* and *V2* with tolerance values *Tol(V1)* and *Tol(V2)*. Curve *C* has its own tolerance value *Tol(C)*: -* In case of edge, the tolerance value is the tolerance of the edge. -* In case of intersection curve, the tolerance value is obtained from an intersection algorithm. - -@figure{/user_guides/boolean_operations/images/operations_image013.svg,"Shrunk Range",340} - -The theoretical parametric range of the pave block is [t1C, t2C]. - -The positions of the vertices *V1* and *V2* of the pave block can be different. The positions are determined by the following conditions: -~~~~ -Distance (P1, P1c) is equal or less than Tol(V1) + Tol(C) -Distance (P2, P2c) is equal or less than Tol(V2) + Tol(C) -~~~~ -The Figure shows that each tolerance sphere of a vertex can reduce the parametric range of the pave block to a range [t1S, t2S]. The range [t1S, t2S] is the shrunk range of the pave block. - -The shrunk range of the pave block is the part of 3D curve that can interfere with other shapes. - -@subsection occt_algorithms_3_5 Common Blocks - -The interferences of the type Edge/Edge, Edge/Face produce results as common parts. - -In case of Edge/Edge interference the common parts are pave blocks that have different base edges. - -@figure{/user_guides/boolean_operations/images/operations_image014.svg,"Common Blocks: Edge/Edge interference",340} - -If the pave blocks PB1, PB2…PBNbPB , where *NbPB* is the number of pave blocks have the same bounding vertices and geometrically coincide, the pave blocks form common block *CB*. - - -In case of Edge/Face interference the common parts are pave blocks lying on a face(s). - -@figure{/user_guides/boolean_operations/images/operations_image015.svg,"Common Blocks: Edge/Face interference",265} - -If the pave blocks *PBi* geometrically coincide with a face *Fj*, the pave blocks form common block *CB*. - -In general case a common block *CB* contains: -* Pave blocks *PBi (i=0,1,2, 3… NbPB)*. -* A set of faces *Fj (j=0,1... NbF), NbF* -- number of faces. - - -@subsection occt_algorithms_3_6 FaceInfo - -The structure *FaceInfo* contains the following information: -* Pave blocks that have state **In** for the face; -* Vertices that have state **In** for the face; -* Pave blocks that have state **On** for the face; -* Vertices that have state **On** for the face; -* Pave blocks built up from intersection curves for the face; -* Vertices built up from intersection points for the face. - -@figure{/user_guides/boolean_operations/images/operations_image016.svg,"Face Info",420} - -In the figure, for face *F1*: -* Pave blocks that have state **In** for the face: *PBin1*. -* Vertices that have state **In** for the face: *Vin1*. -* Pave blocks that have state **On** for the face: *PBon11*, *PBon12*, *PBon2*, *PBon31*, *PBon32*, *PBon4*. -* Vertices that have state **On** for the face: *V1, V2, V3, V4, V5, V6*. -* Pave blocks built up from intersection curves for the face: *PBsc1*. -* Vertices built up from intersection points for the face: none - - -@section occt_algorithms_4 Data Structure - -Data Structure (DS) is used to: -* Store information about input data and intermediate results; -* Provide the access to the information; -* Provide the links between the chunks of information. - -This information includes: -* Arguments; -* Shapes; -* Interferences; -* Pave Blocks; -* Common Blocks. - -Data Structure is implemented in the class *BOPDS_DS*. - -@subsection occt_algorithms_4_1 Arguments - -The arguments are shapes (in terms of *TopoDS_Shape*): -* Number of arguments is unlimited. -* Each argument is a valid shape (in terms of *BRepCheck_Analyzer*). -* Each argument can be of one of the following types (see the Table): - -| No | Type | Index of Type | -| :----- | :----- | :----- | -| 1 | COMPOUND | 0 | -| 2 | COMPSOLID | 1 | -| 3 | SOLID | 2 | -| 4 | SHELL | 3 | -| 5 | FACE | 4 | -| 6 | WIRE | 5 | -| 7 | EDGE | 6 | -| 8 | VERTEX | 7 | - -* The argument of type *0 (COMPOUND)* can include any number of shapes of an arbitrary type (0, 1…7). -* The argument should not be self-interfered, i.e. all sub-shapes of the argument that have geometrical coincidence through any topological entities (vertices, edges, faces) must share these entities. -* There are no restrictions on the type of underlying geometry of the shapes. The faces or edges of arguments *Si* can have underlying geometry of any type supported by Open CASCADE Technology modeling algorithms (in terms of *GeomAbs_CurveType* and *GeomAbs_SurfaceType*). -* The faces or edges of the arguments should have underlying geometry with continuity that is not less than C1. - -@subsection occt_algorithms_4_2 Shapes - -The information about Shapes is stored in structure *BOPDS_ShapeInfo*. The objects of type *BOPDS_ShapeInfo* are stored in the container of array type. The array allows getting the access to the information by an index (DS index). -The structure *BOPDS_ShapeInfo* has the following contents: - - -| Name | Contents | -| :-------- | :----- | -| *myShape* | Shape itself | -| *myType* | Type of shape | -| *myBox* | 3D bounding box of the shape | -| *mySubShapes* | List of DS indices of sub-shapes | -| *myReference* | Storage for some auxiliary information | -| *myFlag* | Storage for some auxiliary information | - -@subsection occt_algorithms_4_3 Interferences - -The information about interferences is stored in the instances of classes that are inherited from class BOPDS_Interf. - -| Name | Contents | -| :----- | :----- | -| *BOPDS_Interf* | Root class for interference | -| *Index1* | DS index of the shape 1 | -| *Index2* | DS index of the shape 2 | -| *BOPDS_InterfVV* | Storage for Vertex/Vertex interference | -| *BOPDS_InterfVE* | Storage for Vertex/Edge interference | -| *myParam* | The value of parameter of the point of the vertex on the curve of the edge | -| *BOPDS_InterfVF* | Storage for Vertex/Face interference | -| *myU, myV* | The value of parameters of the point of the vertex on the surface of the face | -| *BOPDS_InterfEE* | Storage for Edge/Edge interference | -| *myCommonPart* | Common part (in terms of *IntTools_CommonPart* ) | -| *BOPDS_InterfEF* | Storage for Edge/Face interference | -| *myCommonPart* | Common part (in terms of *IntTools_CommonPart* ) | -| *BOPDS_InterfFF* | Storage for Face/Face interference | -| *myTolR3D, myTolR2D* | The value of tolerances of curves (points) reached in 3D and 2D | -| *myCurves* | Intersection Curves (in terms of *BOPDS_Curve*) | -| *myPoints* | Intersection Points (in terms of *BOPDS_Point*) | -| *BOPDS_InterfVZ* | Storage for Vertex/Solid interference | -| *BOPDS_InterfEZ* | Storage for Edge/Solid interference | -| *BOPDS_InterfFZ* | Storage for Face/Solid interference | -| *BOPDS_InterfZZ* | Storage for Solid/Solid interference | - - - - - -The Figure shows inheritance diagram for *BOPDS_Interf* classes. - -@figure{/user_guides/boolean_operations/images/operations_image017.svg,"BOPDS_Interf classes",420} - - -@subsection occt_algorithms_4_4 Pave, PaveBlock and CommonBlock - -The information about the pave is stored in objects of type *BOPDS_Pave*. - -| Name | Contents | -| :--- | :------ | -| *BOPDS_Pave* | | -| *myIndex* | DS index of the vertex | -| *myParam* | Value of the parameter of the 3D point of vertex on curve. | - -The information about pave blocks is stored in objects of type *BOPDS_PaveBlock*. - -| Name | Contents | -| :--- | :------ | -| *BOPDS_PaveBlock* | | -| *myEdge* | DS index of the edge produced from the pave block | -| *myOriginalEdge* | DS index of the source edge | -| *myPave1* | Pave 1 (in terms of *BOPDS_Pave*) | -| *myPave2* | Pave 2 (in terms of *BOPDS_Pave*) | -| *myExtPaves* | The list of paves (in terms of *BOPDS_Pave*) that is used to store paves lying inside the pave block during intersection process | -| *myCommonBlock* | The reference to common block (in terms of *BOPDS_CommonBlock*) if the pave block is a common block | -| *myShrunkData* | The shrunk range of the pave block | - -* To be bound to an edge (or intersection curve) the structures of type *BOPDS_PaveBlock* are stored in one container of list type (BOPDS_ListOfPaveBlock). -* In case of edge, all the lists of pave blocks above are stored in one container of array type. The array allows getting the access to the information by index of the list of pave blocks for the edge. This index (if exists) is stored in the field *myReference*. - -The information about common block is stored in objects of type *BOPDS_CommonBlock*. - -| Name | Contents | -| :---- | :------ | -| *BOPDS_CommonBlock* | | -| *myPaveBlocks* | The list of pave blocks that are common in terms of @ref occt_algorithms_3_5 "Common Blocks" | -| *myFaces* | The list of DS indices of the faces, on which the pave blocks lie. | - - -@subsection occt_algorithms_4_5 Points and Curves -The information about intersection point is stored in objects of type *BOPDS_Point*. - -| Name | Contents | -| :---- | :----- | -| *BOPDS_Point* | | -| *myPnt* | 3D point | -| *myPnt2D1* | 2D point on the face1 | -| *myPnt2D2* | 2D point on the face2 | - -The information about intersection curve is stored in objects of type *BOPDS_Curve*. - -| Name | Contents | -| :---- | :----- | -| *BOPDS_Curve* | | -| *myCurve* | The intersection curve (in terms of *IntTools_Curve* ) | -| *myPaveBlocks* | The list of pave blocks that belong to the curve | -| *myBox* | The bounding box of the curve (in terms of *Bnd_Box* ) | - -@subsection occt_algorithms_4_6 FaceInfo -The information about *FaceInfo* is stored in a structure *BOPDS_FaceInfo*. -The structure *BOPDS_FaceInfo* has the following contents. - -| Name | Contents | -| :---- | :----- | -| *BOPDS_FaceInfo* | | -| *myPaveBlocksIn* | Pave blocks that have state In for the face | -| *myVerticesIn* | Vertices that have state In for the face | -| *myPaveBlocksOn* | Pave blocks that have state On for the face | -| *myVerticesOn* | Vertices that have state On for the face | -| *myPaveBlocksSc* | Pave blocks built up from intersection curves for the face | -| *myVerticesSc* | Vertices built up from intersection points for the face + - -The objects of type *BOPDS_FaceInfo* are stored in one container of array type. The array allows getting the access to the information by index. This index (if exists) is stored in the field *myReference*. - -@section occt_algorithms_root_classes Root Classes - -@subsection occt_algorithms_root_classes_1 Class BOPAlgo_Options -The class *BOPAlgo_Options* provides the following options for the algorithms: -* Set the appropriate memory allocator; -* Check the presence of the Errors and Warnings; -* Turn on/off the parallel processing; -* Set the additional tolerance for the operation; -* Break the operations by user request; -* Usage of Oriented Bounding boxes in the operation. - -@subsection occt_algorithms_root_classes_2 Class BOPAlgo_Algo - -The class *BOPAlgo_Algo* provides the base interface for all algorithms: -* Perform the operation; -* Check the input data; -* Check the result. - -@section occt_algorithms_5 Intersection Part - -Intersection Part (IP) is used to -* Initialize the Data Structure; -* Compute interferences between the arguments (or their sub-shapes); -* Compute same domain vertices, edges; -* Build split edges; -* Build section edges; -* Build p-curves; -* Store all obtained information in DS. - -IP is implemented in the class *BOPAlgo_PaveFiller*. - -@figure{/user_guides/boolean_operations/images/operations_image064.png,"Diagram for Class BOPAlgo_PaveFiller",230} - -The description provided in the next paragraphs is coherent with the implementation of the method *BOPAlgo_PaveFiller::Perform()*. - -@subsection occt_algorithms_5_1 Initialization -The input data for the step is the Arguments. The description of initialization step is shown in the Table. - -| No | Contents | Implementation | -| :--- | :----- | :----- | -| 1 | Initialization the array of shapes (in terms of @ref occt_algorithms_4_2 "Shapes"). Filling the array of shapes. | *BOPDS_DS::Init()* | -| 2 | Initialization the array pave blocks (in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock, CommonBlock") | *BOPDS_DS::Init()* | -| 3 | Initialization of intersection Iterator. The intersection Iterator is the object that computes intersections between sub-shapes of the arguments in terms of bounding boxes. The intersection Iterator provides approximate number of the interferences for given type (in terms of @ref occt_algorithms_3_1 "Interferences") | *BOPDS_Iterator* | -| 4 | Initialization of intersection Context. The intersection Context is an object that contains geometrical and topological toolkit (classifiers, projectors, etc). The intersection Context is used to cache the tools to increase the algorithm performance. | *IntTools_Context* | - - -@subsection occt_algorithms_5_2 Compute Vertex/Vertex Interferences - -The input data for this step is the DS after the @ref occt_algorithms_5_1 "Initialization". The description of this step is shown in the table : - - -| No | Contents | Implementation | -| :--- | :---- | :----- | -| 1 | Initialize array of Vertex/Vertex interferences. | *BOPAlgo_PaveFiller::PerformVV()* | -| 2 | Access to the pairs of interfered shapes (nVi, nVj)k, k=0, 1…nk, where *nVi* and *nVj* are DS indices of vertices *Vi* and *Vj* and *nk* is the number of pairs. | *BOPDS_Iterator* | -| 3 | Compute the connexity chains of interfered vertices *nV1C, nV2C… nVnC)k, C=0, 1…nCs*, where *nCs* is the number of the connexity chains | *BOPAlgo_Tools::MakeBlocksCnx()* | -| 4 | Build new vertices from the chains *VNc. C=0, 1…nCs.* | *BOPAlgo_PaveFiller::PerformVV()* | -| 5 | Append new vertices in DS. | *BOPDS_DS::Append()* | -| 6 | Append same domain vertices in DS. | *BOPDS_DS::AddShapeSD()* | -| 7 | Append Vertex/Vertex interferences in DS. | *BOPDS_DS::AddInterf()* | - -* The pairs of interfered vertices are: (nV11, nV12), (nV11, nV13), (nV12, nV13), (nV13, nV15), (nV13, nV14), (nV14, nV15), (nV21, nV22), (nV21, nV23), (nV22, nV23); -* These pairs produce two chains: (nV11, nV12, nV13, nV14, nV15) and (nV21, nV22, nV23); -* Each chain is used to create a new vertex, *VN1* and *VN2*, correspondingly. - -The example of connexity chains of interfered vertices is given in the image: - -@figure{/user_guides/boolean_operations/images/operations_image018.svg,"Connexity chains of interfered vertices",394} - - -@subsection occt_algorithms_5_3 Compute Vertex/Edge Interferences - -The input data for this step is the DS after computing Vertex/Vertex interferences. - -| No | Contents | Implementation | -| :--- | :--- | :--- | -| 1 | Initialize array of Vertex/Edge interferences | *BOPAlgo_PaveFiller::PerformVE()* | -| 2 | Access to the pairs of interfered shapes (nVi, nEj)k k=0, 1…nk, where *nVi* is DS index of vertex *Vi*, *nEj* is DS index of edge *Ej* and *nk* is the number of pairs. | *BOPDS_Iterator* | -| 3 | Compute paves. See @ref occt_algorithms_3_1_2 "Vertex/Edge Interference" | *BOPInt_Context::ComputeVE()* | -| 4 | Initialize pave blocks for the edges *Ej* involved in the interference | *BOPDS_DS:: ChangePaveBlocks()* | -| 5 | Append the paves into the pave blocks in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock" | *BOPDS_PaveBlock:: AppendExtPave()* | -| 6 | Append Vertex/Edge interferences in DS | *BOPDS_DS::AddInterf()* | - -@subsection occt_algorithms_5_4 Update Pave Blocks -The input data for this step is the DS after computing Vertex/Edge Interferences. - -| No | Contents | Implementation | -| :--- | :---- | :--- | -| 1 | Each pave block PB containing internal paves is split by internal paves into new pave blocks *PBN1, PBN2… PBNn*. PB is replaced by new pave blocks *PBN1, PBN2… PBNn* in the DS. | *BOPDS_DS:: UpdatePaveBlocks()* | - -@subsection occt_algorithms_5_5 Compute Edge/Edge Interferences - -The input data for this step is the DS after updating Pave Blocks. - -| No | Contents | Implementation | -| :---- | :---- | :----- | -| 1 | Initialize array of Edge/Edge interferences | *BOPAlgo_PaveFiller::PerformEE()* | -| 2 | Access to the pairs of interfered shapes (nEi, nEj)k, k=0, 1…nk, where *nEi* is DS index of the edge *Ei*, *nEj* is DS index of the edge *Ej* and *nk* is the number of pairs. | *BOPDS_Iterator* | -| 3 | Initialize pave blocks for the edges involved in the interference, if it is necessary. | *BOPDS_DS:: ChangePaveBlocks()* | -| 4 | Access to the pave blocks of interfered shapes: (PBi1, PBi2…PBiNi) for edge *Ei* and (PBj1, PBj2…PBjNj) for edge *Ej* | *BOPAlgo_PaveFiller::PerformEE()* | -| 5 | Compute shrunk data for pave blocks in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock", if it is necessary. | *BOPAlgo_PaveFiller::FillShrunkData()* | -| 6 | Compute Edge/Edge interference for pave blocks *PBix* and *PBiy*. The result of the computation is a set of objects of type *IntTools_CommonPart* | *IntTools_EdgeEdge* | -| 7.1 | For each *CommonPart* of type *VERTEX:* Create new vertices *VNi (i =1, 2…,NbVN),* where *NbVN* is the number of new vertices. Intersect the vertices *VNi* using the steps Initialization and compute Vertex/Vertex interferences as follows: a) create a new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use new vertices *VNi (i=1, 2…,NbVN), NbVN* as arguments (in terms of *TopoDs_Shape*) of *PFn*; c) invoke method *Perform()* for *PFn*. The resulting vertices *VNXi (i=1, 2…,NbVNX)*, where *NbVNX* is the number of vertices, are obtained via mapping between *VNi* and the results of *PVn*. | *BOPTools_Tools::MakeNewVertex()* | -| 7.2 | For each *CommonPart* of type *EDGE:* Compute the coinciding connexity chains of pave blocks (PB1C, PB2C… PNnC)k, C=0, 1…nCs, where *nCs* is the number of the connexity chains. Create common blocks (CBc. C=0, 1…nCs) from the chains. Attach the common blocks to the pave blocks. | *BOPAlgo_Tools::PerformCommonBlocks()* | -| 8 | Post-processing. Append the paves of *VNXi* into the corresponding pave blocks in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock" | *BOPDS_PaveBlock:: AppendExtPave()* | -| 9 | Split common blocks CBc by the paves. | *BOPDS_DS:: UpdateCommonBlock()* | -| 10 | Append Edge/Edge interferences in the DS. | *BOPDS_DS::AddInterf()* | - -The example of coinciding chains of pave blocks is given in the image: - -@figure{/user_guides/boolean_operations/images/operations_image019.png,"Coinciding chains of pave blocks",420} - -* The pairs of coincided pave blocks are: (PB11, PB12), (PB11, PB13), (PB12, PB13), (PB21, PB22), (PB21, PB23), (PB22, PB23). -* The pairs produce two chains: (PB11, PB12, PB13) and (PB21, PB22, PB23). - -@subsection occt_algorithms_5_6 Compute Vertex/Face Interferences - -The input data for this step is the DS after computing Edge/Edge interferences. - -| No | Contents | Implementation | -| :---- | :--- | :---- | -| 1 | Initialize array of Vertex/Face interferences | *BOPAlgo_PaveFiller::PerformVF()* | -| 2 | Access to the pairs of interfered shapes (nVi, nFj)k, k=0, 1…nk, where *nVi* is DS index of the vertex *Vi*, *nFj* is DS index of the edge *Fj* and *nk* is the number of pairs. | *BOPDS_Iterator* | -| 3 | Compute interference See @ref occt_algorithms_3_1_3 "Vertex/Face Interference" | *BOPInt_Context::ComputeVF()* | -| 4 | Append Vertex/Face interferences in the DS | *BOPDS_DS::AddInterf()* | -| 5 | Repeat steps 2-4 for each new vertex *VNXi (i=1, 2…,NbVNX),* where *NbVNX* is the number of vertices. | *BOPAlgo_PaveFiller::TreatVerticesEE()* | - -@subsection occt_algorithms_5_7 Compute Edge/Face Interferences -The input data for this step is the DS after computing Vertex/Face Interferences. - -| No | Contents | Implementation | -| :---- | :---- | :---- | -| 1 | Initialize array of Edge/Face interferences | *BOPAlgo_PaveFiller::PerformEF()* | -| 2 | Access to the pairs of interfered shapes (nEi, nFj)k, k=0, 1…nk, where *nEi* is DS index of edge *Ei*, *nFj* is DS index of face *Fj* and *nk* is the number of pairs. | *BOPDS_Iterator* | -| 3 | Initialize pave blocks for the edges involved in the interference, if it is necessary. | *BOPDS_DS::ChangePaveBlocks()* | -| 4 | Access to the pave blocks of interfered edge (PBi1, PBi2…PBiNi) for edge *Ei* | *BOPAlgo_PaveFiller::PerformEF()* | -| 5 | Compute shrunk data for pave blocks (in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock") if it is necessary. | *BOPAlgo_PaveFiller::FillShrunkData()* | -| 6 | Compute Edge/Face interference for pave block *PBix*, and face *nFj*. The result of the computation is a set of objects of type *IntTools_CommonPart* | *IntTools_EdgeFace* | -| 7.1 | For each *CommonPart* of type *VERTEX:* Create new vertices *VNi (i=1, 2…,NbVN),* where *NbVN* is the number of new vertices. Merge vertices *VNi* as follows: a) create new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use new vertices *VNi (i=1, 2…,NbVN), NbVN* as arguments (in terms of *TopoDs_Shape*) of *PFn*; c) invoke method *Perform()* for *PFn*. The resulting vertices *VNXi (i=1, 2…,NbVNX)*, where *NbVNX* is the number of vertices, are obtained via mapping between *VNi* and the results of *PVn*. | *BOPTools_Tools::MakeNewVertex()* and *BOPAlgo_PaveFiller::PerformVertices1()* | -| 7.2 | For each *CommonPart* of type *EDGE:* Create common blocks (CBc. C=0, 1…nCs) from pave blocks that lie on the faces. Attach the common blocks to the pave blocks. | *BOPAlgo_Tools::PerformCommonBlocks()* | -| 8 | Post-processing. Append the paves of *VNXi* into the corresponding pave blocks in terms of @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock". | *BOPDS_PaveBlock:: AppendExtPave()* | -| 9 | Split pave blocks and common blocks *CBc* by the paves. | *BOPAlgo_PaveFiller::PerformVertices1()*, *BOPDS_DS:: UpdatePaveBlock()* and *BOPDS_DS:: UpdateCommonBlock()* | -| 10 | Append Edge/Face interferences in the DS | *BOPDS_DS::AddInterf()* | -| 11 | Update *FaceInfo* for all faces having EF common parts. | *BOPDS_DS:: UpdateFaceInfoIn()* | - - -@subsection occt_algorithms_5_8 Build Split Edges - -The input data for this step is the DS after computing Edge/Face Interferences. - -For each pave block *PB* take the following steps: - -| No | Contents | Implementation | -| :--- | :--- | :--- | -| 1 | Get the real pave block *PBR*, which is equal to *PB* if *PB* is not a common block and to *PB1* if *PB* is a common block. *PB1* is the first pave block in the pave blocks list of the common block. See @ref occt_algorithms_4_4 "Pave, PaveBlock and CommonBlock". | *BOPAlgo_PaveFiller::MakeSplitEdges()* | -| 2 | Build the split edge *Esp* using the information from *DS* and *PBR*. | *BOPTools_Tools::MakeSplitEdge()* | -| 3 | Compute *BOPDS_ShapeInfo* contents for Esp | *BOPAlgo_PaveFiller::MakeSplitEdges()* | -| 4 | Append *BOPDS_ShapeInfo* contents to the DS | *BOPDS_DS::Append()* | - -@subsection occt_algorithms_5_9 Compute Face/Face Interferences - -The input data for this step is DS after building Split Edges. - -| No | Contents | Implementation | -| :--- | :--- | :--- | -| 1 | Initialize array of Face/Face interferences | *BOPAlgo_PaveFiller::PerformFF()* | -| 2 | Access to the pairs of interfered shapes (nFi, nFj)k, k=0, 1…nk, where *nFi* is DS index of edge *Fi*, *nFj* is DS index of face *Fj* and *nk* is the number of pairs. | *BOPDS_Iterator* | -| 3 | Compute Face/Face interference | *IntTools_FaceFace* | -| 4 | Append Face/Face interferences in the DS. | *BOPDS_DS::AddInterf()* | - -@subsection occt_algorithms_5_10 Build Section Edges - -The input data for this step is the DS after computing Face/Face interferences. - -| No | Contents | Implementation | -| :---- | :---- | :---- | -| 1 | For each Face/Face interference *nFi, nFj*, retrieve @ref occt_algorithms_4_6 "FaceInfo". Create draft vertices from intersection points *VPk (k=1, 2…, NbVP)*, where *NbVP* is the number of new vertices, and the draft vertex *VPk* is created from an intersection point if *VPk ≠ Vm (m = 0, 1, 2… NbVm)*, where *Vm* is an existing vertex for the faces *nFi* and *nF,j* (*On* or *In* in terms of *TopoDs_Shape*), *NbVm* is the number of vertices existing on faces *nFi* and *nF,j* and ≠ -- means non-coincidence in terms of @ref occt_algorithms_3_1_1 "Vertex/Vertex interference". | *BOPAlgo_PaveFiller::MakeBlocks()* | -| 2 | For each intersection curve *Cijk* | | -| 2.1 | Create paves PVc for the curve using existing vertices, i.e. vertices On or In (in terms of *FaceInfo*) for faces *nFi* and *nFj*. Append the paves *PVc* | *BOPAlgo_PaveFiller::PutPaveOnCurve()* and *BOPDS_PaveBlock::AppendExtPave()* | -| 2.2 | Create technological vertices *Vt*, which are the bounding points of an intersection curve (with the value of tolerance *Tol(Cijk)*). Each vertex *Vt* with parameter *Tt* on curve *Cijk* forms pave *PVt* on curve *Cijk*. Append technological paves. | *BOPAlgo_PaveFiller::PutBoundPaveOnCurve()* | -| 2.3 | Create pave blocks *PBk* for the curve using paves (k=1, 2…, NbPB), where *NbPB* is the number of pave blocks | *BOPAlgo_PaveFiller::MakeBlocks()* | -| 2.4 | Build draft section edges *ESk* using the pave blocks (k=1, 2…, NbES), where *NbES* is the number of draft section edges The draft section edge is created from a pave block *PBk* if *PBk* has state *In* or *On* for both faces *nFi* and *nF,j* and *PBk ≠ PBm (m=0, 1, 2… NbPBm)*, where *PBm* is an existing pave block for faces *nFi* and *nF,j* (*On* or *In* in terms of *FaceInfo*), *NbVm* is the number of existing pave blocks for faces *nFi* and *nF,j* and ≠ -- means non-coincidence (in terms of @ref occt_algorithms_3_1_3 "Vertex/Face interference"). | *BOPTools_Tools::MakeEdge()* | -| 3 | Intersect the draft vertices *VPk (k=1, 2…, NbVP)* and the draft section edges *ESk (k=1, 2…, NbES)*. For this: a) create new object *PFn* of type *BOPAlgo_PaveFiller* with its own DS; b) use vertices *VPk* and edges *ESk* as arguments (in terms of @ref occt_algorithms_4_1 "Arguments") of *PFn*; c) invoke method *Perform()* for *PFn*. Resulting vertices *VPXk (k=1, 2… NbVPX)* and edges *ESXk (k=1, 2… NbESX)* are obtained via mapping between *VPk, ESk* and the results of *PVn*. | *BOPAlgo_PaveFiller::PostTreatFF()* | -| 4 | Update face info (sections about pave blocks and vertices) | *BOPAlgo_PaveFiller::PerformFF()* | - -@subsection occt_algorithms_5_11 Build P-Curves -The input data for this step is the DS after building section edges. - -| No | Contents | Implementation | -| :---- | :---- | :---- | -| 1 | For each Face/Face interference *nFi* and *nFj* build p-Curves on *nFi* and *nFj* for each section edge *ESXk*. | *BOPAlgo_PaveFiller::MakePCurves()* | -| 2 | For each pave block that is common for faces *nFi* and *nFj* build p-Curves on *nFi* and *nFj*. | *BOPAlgo_PaveFiller::MakePCurves()* | - -@subsection occt_algorithms_5_12 Process Degenerated Edges -The input data for this step is the DS after building P-curves. - -| No | Contents | Implementation | -| :---- | :---- | :---- | -| | For each degenerated edge *ED* having vertex *VD* | BOPAlgo_PaveFiller::ProcessDE() | -| 1 | Find pave blocks *PBi (i=1,2… NbPB)*, where *NbPB* is the number of pave blocks, that go through vertex *VD*. | *BOPAlgo_PaveFiller::FindPaveBlocks()* | -| 2 | Compute paves for the degenerated edge *ED* using a 2D curve of *ED* and a 2D curve of *PBi*. Form pave blocks *PBDi (i=1,2… NbPBD)*, where *NbPBD* is the number of the pave blocks for the degenerated edge *ED* | *BOPAlgo_PaveFiller::FillPaves()* | -| 3 | Build split edges *ESDi (i=1,2…NbESD)*, where *ESD* is the number of split edges, using the pave blocks *PBDi* | *BOPAlgo_PaveFiller:: MakeSplitEdge()* | - -@section occt_algorithms_6 General description of the Building Part - -Building Part (BP) is used to -* Build the result of the operation -* Provide history information (in terms of \::Generated(), \::Modified() and \::IsDeleted()) -BP uses the DS prepared by *BOPAlgo_PaveFiller* described at chapter 5 as input data. -BP is implemented in the following classes: -* *BOPAlgo_Builder* -- for the General Fuse operator (GFA). -* *BOPAlgo_BOP* -- for the Boolean Operation operator (BOA). -* *BOPAlgo_Section* -- for the Section operator (SA). -* *BOPAlgo_MakerVolume* -- for the Volume Maker operator. -* *BOPAlgo_Splitter* -- for the Splitter operator. -* *BOPAlgo_CellsBuilder* -- for the Cells Builder operator. - -@figure{/user_guides/boolean_operations/images/operations_image020.png,"Diagram for BP classes",300} - -The class *BOPAlgo_BuilderShape* provides the interface for algorithms that have: -* A Shape as the result; -* History information (in terms of \::Generated(), \::Modified() and \::IsDeleted()). - -@section occt_algorithms_7 General Fuse Algorithm -@subsection occt_algorithms_7_1 Arguments -The arguments of the algorithm are shapes (in terms of *TopoDS_Shape*). The main requirements for the arguments are described in @ref occt_algorithms_4 "Data Structure" chapter. - -@subsection occt_algorithms_7_2 Results - -During the operation argument *Si* can be split into several parts *Si1, Si2… Si1NbSp*, where *NbSp* is the number of parts. The set (Si1, Si2… Si1NbSp) is an image of argument *Si*. -* The result of the General Fuse operation is a compound. Each sub-shape of the compound corresponds to the certain argument shape S1, S2…Sn and has shared sub-shapes in accordance with interferences between the arguments. -* For the arguments of the type EDGE, FACE, SOLID the result contains split parts of the argument. -* For the arguments of the type WIRE, SHELL, COMPSOLID, COMPOUND the result contains the image of the shape of the corresponding type (i.e. WIRE, SHELL, COMPSOLID or COMPOUND). -The types of resulting shapes depend on the type of the corresponding argument participating in the operation. See the table below: - -| No | Type of argument | Type of resulting shape | Comments | -| :--- | :---- | :--- | :--- | -| 1 | COMPOUND | COMPOUND | The resulting COMPOUND is built from images of sub-shapes of type COMPOUND COMPSOLID, SHELL, WIRE and VERTEX. Sets of split sub-shapes of type SOLID, FACE, EDGE. | -| 2 | COMPSOLID | COMPSOLID | The resulting COMPSOLID is built from split SOLIDs. | -| 3 | SOLID | Set of split SOLIDs | | -| 4 | SHELL | SHELL | The resulting SHELL is built from split FACEs | -| 5 | FACE | Set of split FACEs | | -| 6 | WIRE | WIRE | The resulting WIRE is built from split EDGEs | -| 7 | EDGE | Set of split EDGEs | | -| 8 | VERTEX | VERTEX | | - -@subsection occt_algorithms_7_3a Options - -The General Fuse algorithm has a set of options, which allow speeding-up the operation and improving the quality of the result: -* Parallel processing option allows running the algorithm in parallel mode; -* Fuzzy option allows setting the additional tolerance for the operation; -* Safe input shapes option allows preventing modification of the input shapes; -* Gluing option allows speeding-up the intersection of the arguments; -* Possibility to disable the check for the inverted solids among input shapes; -* Usage of Oriented Bounding Boxes in the operation; -* History support. - -For more detailed information on these options, see the @ref occt_algorithms_11a "Advanced options" section. - -@subsection occt_algorithms_7_3b Usage - -The following example illustrates how to use the GF algorithm: - -#### Usage of the GF algorithm on C++ level - -~~~~ -BOPAlgo_Builder aBuilder; -// Setting arguments -TopTools_ListOfShape aLSObjects = …; // Objects -aBuilder.SetArguments(aLSObjects); - -// Setting options for GF - -// Set parallel processing mode (default is false) -Standard_Boolean bRunParallel = Standard_True; -aBuilder.SetRunParallel(bRunParallel); - -// Set Fuzzy value (default is Precision::Confusion()) -Standard_Real aFuzzyValue = 1.e-5; -aBuilder.SetFuzzyValue(aFuzzyValue); - -// Set safe processing mode (default is false) -Standard_Boolean bSafeMode = Standard_True; -aBuilder.SetNonDestructive(bSafeMode); - -// Set Gluing mode for coinciding arguments (default is off) -BOPAlgo_GlueEnum aGlue = BOPAlgo_GlueShift; -aBuilder.SetGlue(aGlue); - -// Disabling/Enabling the check for inverted solids (default is true) -Standard Boolean bCheckInverted = Standard_False; -aBuilder.SetCheckInverted(bCheckInverted); - -// Set OBB usage (default is false) -Standard_Boolean bUseOBB = Standard_True; -aBuilder.SetUseOBB(buseobb); - -// Perform the operation -aBuilder.Perform(); - -// Check for the errors -if (aBuilder.HasErrors()) -{ - return; -} - -// Check for the warnings -if (aBuilder.HasWarnings()) -{ - // treatment of the warnings - ... -} - -// result of the operation -const TopoDS_Shape& aResult = aBuilder.Shape(); -~~~~ - -#### Usage of the GF algorithm on Tcl level - -~~~~ -# prepare the arguments -box b1 10 10 10 -box b2 3 4 5 10 10 10 -box b3 5 6 7 10 10 10 - -# clear inner contents -bclearobjects; bcleartools; - -# set the arguments -baddobjects b1 b2 b3 - -# setting options for GF - -# set parallel processing mode (default is 0) -brunparallel 1 - -# set Fuzzy value -bfuzzyvalue 1.e-5 - -# set safe processing mode (default is 0) -bnondestructive 1 - -# set gluing mode (default is 0) -bglue 1 - -# set check for inverted (default is 1) -bcheckinverted 0 - -# set obb usage (default is 0) -buseobb 1 - -# perform intersection -bfillds - -# perform GF operaton -bbuild result -~~~~ - -@subsection occt_algorithms_7_3 Examples - -Have a look at the examples to better understand the definitions. - -@subsubsection occt_algorithms_7_3_1 Case 1: Three edges intersecting at a point - -Let us consider three edges: *E1, E2* and *E3* that intersect in one 3D point. - -@figure{/user_guides/boolean_operations/images/operations_image021.svg,"Three Intersecting Edges",420} - -The result of the GFA operation is a compound containing 6 new edges: *E11, E12, E21, E22, E31*, and *E32*. These edges have one shared vertex *Vn1*. - -In this case: -* The argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*). -* The argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*). -* The argument edge *E3* has resulting split edges *E31* and *E32* (image of *E3*). - -@subsubsection occt_algorithms_7_3_2 Case 2: Two wires and an edge - -Let us consider two wires *W1 (Ew11, Ew12, Ew13)* and *W2 (Ew21, Ew22, Ew23)* and edge *E1*. - -@figure{/user_guides/boolean_operations/images/operations_image022.svg,"Two wires and an edge",420} - -The result of the GF operation is a compound consisting of 2 wires: *Wn1 (Ew11, En1, En2, En3, Ew13)* and *Wn2 (Ew21, En2, En3, En4, Ew23)* and two edges: *E11* and *E12*. - -In this case : -* The argument *W1* has image *Wn1*. -* The argument *W2* has image *Wn2*. -* The argument edge *E1* has split edges *E11* and *E12*. (image of *E1*). -The edges *En1, En2, En3, En4* and vertex *Vn1* are new shapes created during the operation. Edge *Ew12* has split edges *En1, En2* and *En3* and edge *Ew22* has split edges *En2, En3* and *En4*. - -@subsubsection occt_algorithms_7_3_3 Case 3: An edge intersecting with a face - -Let us consider edge *E1* and face *F2*: - -@figure{/user_guides/boolean_operations/images/operations_image023.svg,"An edge intersecting with a face",420} - -The result of the GF operation is a compound consisting of 3 shapes: -* Split edge parts *E11* and *E12* (image of *E1*). -* New face *F21* with internal edge *E12* (image of *F2*). - -@subsubsection occt_algorithms_7_3_4 Case 4: An edge lying on a face - -Let us consider edge *E1* and face *F2*: - -@figure{/user_guides/boolean_operations/images/operations_image024.svg,"An edge lying on a face",420} - -The result of the GF operation is a compound consisting of 5 shapes: -* Split edge parts *E11, E12* and *E13* (image of *E1*). -* Split face parts *F21* and *F22* (image of *F2*). - - -@subsubsection occt_algorithms_7_3_5 Case 5: An edge and a shell - -Let us consider edge *E1* and shell *Sh2* that consists of 2 faces: *F21* and *F22* - -@figure{/user_guides/boolean_operations/images/operations_image025.svg,"An edge and a shell",488} - -The result of the GF operation is a compound consisting of 5 shapes: -* Split edge parts *E11, E12 , E13* and *E14* (image of *E1*). -* Image shell *Sh21* (that contains split face parts *F211, F212, F221* and *F222*). - -@subsubsection occt_algorithms_7_3_6 Case 6: A wire and a shell - -Let us consider wire *W1 (E1, E2, E3, E4)* and shell *Sh2 (F21, F22)*. -@figure{/user_guides/boolean_operations/images/operations_image026.svg,"A wire and a shell",427} - -The result of the GF operation is a compound consisting of 2 shapes: - -* Image wire *W11* that consists of split edge parts from wire *W1: E11, E12, E13* and *E14*. -* Image shell *Sh21* that contains split face parts: *F211, F212, F213, F221, F222* and *F223*. - -@subsubsection occt_algorithms_7_3_7 Case 7: Three faces - -Let us consider 3 faces: *F1, F2* and *F3*. @figure{/user_guides/boolean_operations/images/operations_image027.png,"Three faces",420} - -The result of the GF operation is a compound consisting of 7 shapes: -* Split face parts: *Fn1, Fn2, Fn3, Fn4, Fn5, Fn6* and *Fn7*. - -@subsubsection occt_algorithms_7_3_8 Case 8: A face and a shell - -Let us consider shell *Sh1 (F11, F12, F13)* and face *F2*. -@figure{/user_guides/boolean_operations/images/operations_image028.png,"A face and a shell",420} - -The result of the GF operation is a compound consisting of 4 shapes: -* Image shell *Sh11* that consists of split face parts from shell *Sh1: Fn1, Fn2, Fn3, Fn4, Fn5* and *Fn6*. -* Split parts of face *F2: Fn3, Fn6* and *Fn7*. - -@subsubsection occt_algorithms_7_3_9 Case 9: A shell and a solid - -Let us consider shell *Sh1 (F11, F12…F16)* and solid *So2*. @figure{/user_guides/boolean_operations/images/operations_image029.png,"A shell and a solid: arguments",220} - -The result of the GF operation is a compound consisting of 2 shapes: -* Image shell *Sh11* consisting of split face parts of *Sh1: Fn1, Fn2 ... Fn8.* -* Solid *So21* with internal shell. (image of *So2*). -@figure{/user_guides/boolean_operations/images/operations_image030.png,"A shell and a solid: results",420} - -@subsubsection occt_algorithms_7_3_10 Case 10: A compound and a solid - -Let us consider compound *Cm1* consisting of 2 solids *So11* and *So12*) and solid *So2*. -@figure{/user_guides/boolean_operations/images/operations_image031.png,"A compound and a solid: arguments",220} - -The result of the GF operation is a compound consisting of 4 shapes: -* Image compound *Cm11* consisting of split solid parts from *So11* and *So12 (Sn1, Sn2, Sn3, Sn4)*. -* Split parts of solid *So2 (Sn2, Sn3, Sn5)*. - -@figure{/user_guides/boolean_operations/images/operations_image032.png,"A compound and a solid: results",420} - -@subsection occt_algorithms_7_4 Class BOPAlgo_Builder - -GFA is implemented in the class *BOPAlgo_Builder*. - -@subsubsection occt_algorithms_7_4_1 Fields - -The main fields of the class are described in the Table: - -| Name | Contents | -| :---- | :---- | -| *myPaveFiller* | Pointer to the *BOPAlgo_PaveFiller* object | -| *myDS* | Pointer to the *BOPDS_DS* object | -| *myContext* | Pointer to the intersection Context | -| *myImages* | The Map between the source shape and its images | -| *myShapesSD* | The Map between the source shape (or split part of source shape) and the shape (or part of shape) that will be used in result due to same domain property. | - -@subsubsection occt_algorithms_7_4_2 Initialization - -The input data for this step is a *BOPAlgo_PaveFiller* object (in terms of @ref occt_algorithms_5 "Intersection") at the state after @ref occt_algorithms_5_12 "Processing of degenerated edges" with the corresponding DS. - -| No | Contents | Implementation | -| :---- | :---- | :---- | -| 1 | Check the readiness of the DS and *BOPAlgo_PaveFiller*. | *BOPAlgo_Builder::CheckData()* | -| 2 | Build an empty result of type Compound. | *BOPAlgo_Builder::Prepare()* | - -@subsubsection occt_algorithms_7_4_3 Build Images for Vertices - -The input data for this step is *BOPAlgo_Builder* object after Initialization. - -| No | Contents | Implementation | -| :--- | :--- | :--- | -| 1 | Fill *myShapesSD* by SD vertices using the information from the DS. | *BOPAlgo_Builder::FillImagesVertices()* | - -@subsubsection occt_algorithms_7_4_4 Build Result of Type Vertex - -The input data for this step is *BOPAlgo_Builder* object after building images for vertices and *Type*, which is the shape type (*TopAbs_VERTEX*). - -| No | Contents | Implementation | -| :--- | :--- | :----- | -| 1 | For the arguments of type *Type*. If there is an image for the argument: add the image to the result. If there is no image for the argument: add the argument to the result. | *BOPAlgo_Builder::BuildResult()* | - -@subsubsection occt_algorithms_7_4_5 Build Images for Edges - -The input data for this step is *BOPAlgo_Builder object* after building result of type vertex. - -| No | Contents | Implementation | -| :---- | :---- | :----- | -| 1 | For all pave blocks in the DS. Fill *myImages* for the original edge *E* by split edges *ESPi* from pave blocks. In case of common blocks on edges, use edge *ESPSDj* that corresponds to the leading pave block and fill *myShapesSD* by the pairs *ESPi/ESPSDj*. | *BOPAlgo_Builder::FillImagesEdges()* | - -@subsubsection occt_algorithms_7_4_6 Build Result of Type Edge - -This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex", but for the type *Edge*. - -@subsubsection occt_algorithms_7_4_7 Build Images for Wires - -The input data for this step is: -* *BOPAlgo_Builder* object after building result of type *Edge*; -* Original Shape -- Wire -* *Type* -- the shape type (TopAbs_WIRE). - -| No | Contents | Implementation | -| :---- | :---- | :----- | -| 1 | For all arguments of the type *Type*. Create a container C of the type *Type*. | *BOPAlgo_Builder::FillImagesContainers()* | -| 2 | Add to C the images or non-split parts of the *Original Shape*, taking into account its orientation. | *BOPAlgo_Builder::FillImagesContainers()* *BOPTools_Tools::IsSplitToReverse()* | -| 3 | Fill *myImages* for the *Original Shape* by the information above. | *BOPAlgo_Builder::FillImagesContainers()* | - -@subsubsection occt_algorithms_7_4_8 Build Result of Type Wire - -This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex" but for the type *Wire*. - -@subsubsection occt_algorithms_7_4_9 Build Images for Faces - -The input data for this step is *BOPAlgo_Builder* object after building result of type *Wire*. - -| No | Contents | Implementation | -| :--- | :--- | :--- | -| 1 | Build Split Faces for all interfered DS shapes *Fi* of type *FACE*. | | -| 1.1 | Collect all edges or their images of *Fi(ESPij)*. | *BOPAlgo_Builder::BuildSplitFaces()* | -| 1.2 | Impart to ESPij the orientation to be coherent with the original one. | *BOPAlgo_Builder::BuildSplitFaces()* | -| 1.3 | Collect all section edges *SEk* for *Fi*. | *BOPAlgo_Builder::BuildSplitFaces()* | -| 1.4 | Build split faces for *Fi (Fi1, Fi2…FiNbSp)*, where *NbSp* is the number of split parts (see @ref occt_algorithms_7_2 "Building faces from a set of edges" for more details). | *BOPAlgo_BuilderFace* | -| 1.5 | Impart to (Fi1, Fi2…FiNbSp) the orientation coherent with the original face *Fi*. | *BOPAlgo_Builder::BuildSplitFaces()* | -| 1.6 | Fill the map mySplits with *Fi/(Fi1, Fi2…FiNbSp)* | *BOPAlgo_Builder::BuildSplitFaces()* | -| 2 | Fill Same Domain faces | *BOPAlgo_Builder::FillSameDomainFaces* | -| 2.1 | Find and collect in the contents of *mySplits* the pairs of same domain split faces (Fij, Fkl)m, where *m* is the number of pairs. | *BOPAlgo_Builder::FillSameDomainFaces* *BOPTools_Tools::AreFacesSameDomain()* | -| 2.2 | Compute the connexity chains 1) of same domain faces (F1C, F2C… FnC)k, C=0, 1…nCs, where *nCs* is the number of connexity chains. | *BOPAlgo_Builder::FillSameDomainFaces()* | -| 2.3 | Fill *myShapesSD* using the chains (F1C, F2C… FnC)k | *BOPAlgo_Builder::FillSameDomainFaces()* | -| 2.4 | Add internal vertices to split faces. | *BOPAlgo_Builder::FillSameDomainFaces()* | -| 2.5 | Fill *myImages* using *myShapesSD* and *mySplits*. | *BOPAlgo_Builder::FillSameDomainFaces()* | - - -The example of chains of same domain faces is given in the image: - -@figure{/user_guides/boolean_operations/images/operations_image033.svg,"Chains of same domain faces",420} - -* The pairs of same domain faces are: (F11, F21), (F22, F31), (F41, F51) , (F41, F6) and (F51, F6). -* The pairs produce the three chains: (F11, F21), (F22, F31) and (F41, F51, F6). - -@subsubsection occt_algorithms_7_4_10 Build Result of Type Face -This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex" but for the type *Face*. - -@subsubsection occt_algorithms_7_4_11 Build Images for Shells -The input data for this step is: -* *BOPAlgo_Builder* object after building result of type face; -* *Original Shape* -- a Shell; -* *Type* -- the type of the shape (TopAbs_SHELL). - -The procedure is the same as for building images for wires. - -@subsubsection occt_algorithms_7_4_12 Build Result of Type Shell -This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex" but for the type *Shell*. - -@subsubsection occt_algorithms_7_4_13 Build Images for Solids - -The input data for this step is *BOPAlgo_Builder* object after building result of type *Shell*. - -The following procedure is executed for all interfered DS shapes *Si* of type *SOLID*. - -| No | Contents | Implementation | -| :--- | :--- | :--- | -| 1 | Collect all images or non-split parts for all faces (FSPij) that have 3D state *In Si*. | *BOPAlgo_Builder::FillIn3DParts ()* | -| 2 | Collect all images or non-split parts for all faces of *Si* | *BOPAlgo_Builder::BuildSplitSolids()* | -| 3 | Build split solids for *Si -> (Si1, Si2…SiNbSp)*, where *NbSp* is the number of split parts (see @ref occt_algorithms_7_2 "Building faces from a set of edges" for more details) | *BOPAlgo_BuilderSolid* | -| 4 | Fill the map Same Domain solids *myShapesSD* | *BOPAlgo_Builder::BuildSplitSolids()* | -| 5 | Fill the map *myImages* | *BOPAlgo_Builder::BuildSplitSolids()* | -| 6 | Add internal vertices to split solids | *BOPAlgo_Builder::FillInternalShapes()* | - -@subsubsection occt_algorithms_7_4_14 Build Result of Type Solid -This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex", but for the type Solid. - -@subsubsection occt_algorithms_7_4_15 Build Images for Type CompSolid - -The input data for this step is: -* *BOPAlgo_Builder* object after building result of type solid; -* *Original Shape* -- a Compsolid; -* *Type* -- the type of the shape (TopAbs_COMPSOLID). - -The procedure is the same as for building images for wires. - -@subsubsection occt_algorithms_7_4_16 Build Result of Type Compsolid -This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex", but for the type Compsolid. - -@subsubsection occt_algorithms_7_4_17 Build Images for Compounds -The input data for this step is as follows: -* *BOPAlgo_Builder* object after building results of type *compsolid*; -* *Original Shape* -- a Compound; -* *Type* -- the type of the shape (TopAbs_COMPOUND). - -The procedure is the same as for building images for wires. - -@subsubsection occt_algorithms_7_4_18 Build Result of Type Compound - -This step is the same as @ref occt_algorithms_7_4_4 "Building Result of Type Vertex", but for the type Compound. - -@subsubsection occt_algorithms_7_4_19 Post-Processing -The purpose of the step is to correct tolerances of the result to provide its validity in terms of *BRepCheck_Analyzer.* - -The input data for this step is a *BOPAlgo_Builder* object after building result of type compound. - -| No | Contents | Implementation | -| :---- | :---- | :----- | -| 1 | Correct tolerances of vertices on curves | *BOPTools_Tools::CorrectPointOnCurve()* | -| 2 | Correct tolerances of edges on faces | *BOPTools_Tools::CorrectCurveOnSurface()* | - - -@section occt_algorithms_8 Splitter Algorithm - -The Splitter algorithm allows splitting a group of arbitrary shapes by another group of arbitrary shapes.
-It is based on the General Fuse algorithm, thus all options of the General Fuse (see @ref occt_algorithms_7_3a "GF Options") are also available in this algorithm. - -@subsection occt_algorithms_8_1 Arguments - -* The arguments of the Splitter algorithm are divided into two groups - *Objects* (shapes that will be split) and *Tools* (shapes, by which the *Objects* will be split); -* The requirements for the arguments (both for *Objects* and *Tools*) are the same as for the General Fuse algorithm - there can be any number of arguments of any type in each group, but each argument should be valid and not self-interfered. - -@subsection occt_algorithms_8_2 Results - -* The result of Splitter algorithm contains only the split parts of the shapes included into the group of *Objects*; -* The split parts of the shapes included only into the group of *Tools* are excluded from the result; -* If there are no shapes in the group of *Tools* the result of the operation will be equivalent to the result of General Fuse operation; -* The shapes can be split by other shapes from the same group (if these shapes are interfering). - -@subsection occt_algorithms_8_3 Usage - -@subsubsection occt_algorithms_8_3_1 API - -On the low level the Splitter algorithm is implemented in class *BOPAlgo_Splitter*. The usage of this algorithm looks as follows: -~~~~~ -BOPAlgo_Splitter aSplitter; -// Setting arguments and tools -TopTools_ListOfShape aLSObjects = …; // Objects -TopTools_ListOfShape aLSTools = …; // Tools -aSplitter.SetArguments(aLSObjects); -aSplitter.SetTools(aLSTools); - -// Set options for the algorithm -// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) -... - -// Perform the operation -aSplitter.Perform(); -if (aSplitter.HasErrors()) { //check error status - return; -} -// -const TopoDS_Shape& aResult = aSplitter.Shape(); // result of the operation -~~~~~ - -@subsubsection occt_algorithms_8_3_2 DRAW - -The command *bsplit* implements the Splitter algorithm in DRAW. Similarly to the *bbuild* command for the General Fuse algorithm, the *bsplit* command should be used after the Pave Filler is filled. -~~~~~ -# s1 s2 s3 - objects -# t1 t2 t3 - tools -bclearobjects -bcleartools -baddobjects s1 s2 s3 -baddtools t1 t2 t3 -bfillds -bsplit result -~~~~~ - -@subsection occt_algorithms_8_4 Examples - -@subsubsection occt_algorithms_8_4_1 Example 1 - -Splitting a face by the set of edges: - -~~~~ -# draw script for reproducing -bclearobjects -bcleartools - -set height 20 -cylinder cyl 0 0 0 0 0 1 10 -mkface f cyl 0 2*pi -$height $height -baddobjects f - -# create tool edges -compound edges - -set nb_uedges 10 -set pi2 [dval 2*pi] -set ustep [expr $pi2/$nb_uedges] -for {set i 0} {$i <= $pi2} {set i [expr $i + $ustep]} { - uiso c cyl $i - mkedge e c -25 25 - add e edges -} - -set nb_vedges 10 -set vstep [expr 2*$height/$nb_vedges] -for {set i -20} {$i <= 20} {set i [expr $i + $vstep]} { - viso c cyl $i - mkedge e c - add e edges -} -baddctools edges - -bfillds -bsplit result -~~~~ - - - - - - -
@figure{/user_guides/boolean_operations/images/bsplit_image001.png,"Arguments",160}@figure{/user_guides/boolean_operations/images/bsplit_image002.png,"Result",160}
- -@subsubsection occt_algorithms_8_4_2 Example 2 - -Splitting a plate by the set of cylinders: - -~~~~ -# draw script for reproducing: -bclearobjects -bcleartools - -box plate 100 100 1 -baddobjects plate - -pcylinder p 1 11 -compound cylinders -for {set i 0} {$i < 101} {incr i 5} { - for {set j 0} {$j < 101} {incr j 5} { - copy p p1; - ttranslate p1 $i $j -5; - add p1 cylinders - } -} -baddtools cylinders - -bfillds -bsplit result -~~~~ - - - - - - -
@figure{/user_guides/boolean_operations/images/bsplit_image003.png,"Arguments",160}@figure{/user_guides/boolean_operations/images/bsplit_image004.png,"Result",160}
- -@subsubsection occt_algorithms_8_4_3 Example 3 - -Splitting shell hull by the planes: - - - - - -
@figure{/user_guides/boolean_operations/images/bsplit_image005.png,"Arguments",160}@figure{/user_guides/boolean_operations/images/bsplit_image006.png,"Results",160}
- -@section occt_algorithms_9 Boolean Operations Algorithm - -@subsection occt_algorithms_9_1 Arguments - -* The arguments of BOA are shapes in terms of *TopoDS_Shape*. The main requirements for the arguments are described in the @ref occt_algorithms_4 "Data Structure" -* There are two groups of arguments in BOA: - * Objects (S1=S11, S12, ...); - * Tools (S2=S21, S22, ...). -* The following table contains the values of dimension for different types of arguments: - -| No | Type of Argument | Index of Type | Dimension | -| :---- | :---- | :----- | :---- | -| 1 | COMPOUND | 0 | One of 0, 1, 2, 3 | -| 2 | COMPSOLID | 1 | 3 | -| 3 | SOLID | 2 | 3 | -| 4 | SHELL | 3 | 2 | -| 5 | FACE | 4 | 2 | -| 6 | WIRE | 5 | 1 | -| 7 | EDGE | 6 | 1 | -| 8 | VERTEX | 7 | 0 | - -* For Boolean operation Fuse all arguments should have equal dimensions. -* For Boolean operation Cut the minimal dimension of *S2* should not be less than the maximal dimension of *S1*. -* For Boolean operation Common the arguments can have any dimension. - -@subsection occt_algorithms_9_3 Results. General Rules - -* The result of the Boolean operation is a compound (if defined). Each sub-shape of the compound has shared sub-shapes in accordance with interferences between the arguments. -* The content of the result depends on the type of the operation (Common, Fuse, Cut12, Cut21) and the dimensions of the arguments. -* The result of the operation Fuse is defined for arguments *S1* and *S2* that have the same dimension value : *Dim(S1)=Dim(S2)*. If the arguments have different dimension values the result of the operation Fuse is not defined. The dimension of the result is equal to the dimension of the arguments. For example, it is impossible to fuse an edge and a face. -* The result of the operation Fuse for arguments *S1* and *S2* contains the parts of arguments that have states **OUT** relative to the opposite arguments. -* The result of the operation Fuse for arguments *S1* and *S2* having dimension value 3 (Solids) is refined by removing all possible internal faces to provide minimal number of solids. -* The result of the operation Common for arguments *S1* and *S2* is defined for all values of the dimensions of the arguments. The result can contain shapes of different dimensions, but the minimal dimension of the result will be equal to the minimal dimension of the arguments. For example, the result of the operation Common between edges cannot be a vertex. -* The result of the operation Common for the arguments *S1* and *S2* contains the parts of the argument that have states **IN** and **ON** relative to the opposite argument. -* The result of the operation Cut is defined for arguments *S1* and *S2* that have values of dimensions *Dim(S2)* that should not be less than *Dim(S1)*. The result can contain shapes of different dimensions, but the minimal dimension of the result will be equal to the minimal dimension of the objects *Dim(S1)*. The result of the operation *Cut12* is not defined for other cases. For example, it is impossible to cut an edge from a solid, because a solid without an edge is not defined. -* The result of the operation *Cut12* for arguments *S1* and *S2* contains the parts of argument *S1* that have state **OUT** relative to the opposite argument *S2*. -* The result of the operation *Cut21* for arguments *S1* and *S2* contains the parts of argument *S2* that have state **OUT** relative to the opposite argument *S1*. -* For the arguments of collection type (WIRE, SHELL, COMPSOLID) the type will be passed in the result. For example, the result of Common operation between Shell and Wire will be a compound containing Wire. -* For the arguments of collection type (WIRE, SHELL, COMPSOLID) containing overlapping parts the overlapping parts passed into result will be repeated for each container from the input shapes containing such parts. The containers completely included in other containers will be avoided in the result. -* For the arguments of collection type (WIRE, SHELL, COMPSOLID) the containers included into result will have the same orientation as the original containers from arguments. In case of duplication its orientation will be defined by the orientation of the first container in arguments. Each container included into result will have coherent orientation of its sub-shapes. -* The result of the operation Fuse for the arguments of collection type (WIRE, SHELL) will consist of the shapes of the same collection type. The overlapping parts (EDGES/FACES) will be shared among containers, but duplicating containers will be avoided in the result. For example, the result of Fuse operation between two fully coinciding wires will be one wire, but the result of Fuse operation between two partially coinciding wires will be two wires sharing coinciding edges. -* The result of the operation Fuse for the arguments of type COMPSOLID will consist of the compound containing COMPSOLIDs created from connexity blocks of fused solids. -* The result of the operation Common for the arguments of collection type (WIRE, SHELL, COMPSOLID) will consist of the unique containers containing the overlapping parts. For example, the result of Common operation between two fully overlapping wires will be one wire containing all splits of edges. The number of wires in the result of Common operation between two partially overlapping wires will be equal to the number of connexity blocks of overlapping edges. - -@subsection occt_algorithms_9_4 Examples - -@subsubsection occt_algorithms_9_4_1 Case 1: Two Vertices - -Let us consider two interfering vertices *V1* and *V2*: - -@figure{/user_guides/boolean_operations/images/boolean_image001.svg,"",160} - -* The result of *Fuse* operation is the compound that contains new vertex *V*. - -@figure{/user_guides/boolean_operations/images/boolean_image002.svg,"",160} - -* The result of *Common* operation is a compound containing new vertex *V*. - -* The result of *Cut12* operation is an empty compound. -* The result of *Cut21* operation is an empty compound. - -@subsubsection occt_algorithms_9_4_2 Case 2: A Vertex and an Edge - -Let us consider vertex *V1* and the edge *E2*, that intersect in a 3D point: - -@figure{/user_guides/boolean_operations/images/boolean_image004.png,"",230} - -* The result of *Fuse* operation is result is not defined because the dimension of the vertex (0) is not equal to the dimension of the edge (1). - -* The result of *Common* operation is a compound containing vertex *V1* as the argument *V1* has a common part with edge *E2*. - -@figure{/user_guides/boolean_operations/images/boolean_image005.png,"",230} - -* The result of *Cut12* operation is an empty compound. -* The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the edge (1). - -@subsubsection occt_algorithms_9_4_3 Case 3: A Vertex and a Face - -Let us consider vertex *V1* and face *F2*, that intersect in a 3D point: - -@figure{/user_guides/boolean_operations/images/boolean_image006.png,"",230} - -* The result of *Fuse* operation is not defined because the dimension of the vertex (0) is not equal to the dimension of the face (2). - -* The result of *Common* operation is a compound containing vertex *V1* as the argument *V1* has a common part with face *F2*. - -@figure{/user_guides/boolean_operations/images/boolean_image007.png,"",230} - -* The result of *Cut12* operation is an empty compound. -* The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the face (2). - -@subsubsection occt_algorithms_9_4_4 Case 4: A Vertex and a Solid - -Let us consider vertex *V1* and solid *S2*, that intersect in a 3D point: - -@figure{/user_guides/boolean_operations/images/boolean_image008.png,"",230} - -* The result of *Fuse* operation is not defined because the dimension of the vertex (0) is not equal to the dimension of the solid (3). - -* The result of *Common* operation is a compound containing vertex *V1* as the argument *V1* has a common part with solid *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image009.png,"",230} - -* The result of *Cut12* operation is an empty compound. -* The result of *Cut21* operation is not defined because the dimension of the vertex (0) is less than the dimension of the solid (3). - -@subsubsection occt_algorithms_9_4_5 Case 5: Two edges intersecting at one point - -Let us consider edges *E1* and *E2* that intersect in a 3D point: - -@figure{/user_guides/boolean_operations/images/boolean_image010.svg,"",230} - -* The result of *Fuse* operation is a compound containing split parts of arguments i.e. 4 new edges *E11, E12, E21*, and *E22*. These edges have one shared vertex *Vn1*. -In this case: - * argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*); - * argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*). - -@figure{/user_guides/boolean_operations/images/boolean_image011.svg,"",230} - -* The result of *Common* operation is an empty compound because the dimension (0) of the common part between the edges (vertex) is less than the dimension of the arguments (1). - -* The result of *Cut12* operation is a compound containing split parts of the argument *E1*, i.e. 2 new edges *E11* and *E12*. These edges have one shared vertex *Vn1*. - -In this case the argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*). - -@figure{/user_guides/boolean_operations/images/boolean_image012.svg,"",230} - -* The result of *Cut21* operation is a compound containing split parts of the argument *E2*, i.e. 2 new edges *E21* and *E12*. These edges have one shared vertex *Vn1*. - -In this case the argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*). - -@figure{/user_guides/boolean_operations/images/boolean_image013.svg,"",70} - -@subsubsection occt_algorithms_9_4_6 Case 6: Two edges having a common block - -Let us consider edges *E1* and *E2* that have a common block: - -@figure{/user_guides/boolean_operations/images/boolean_image014.svg,"",230} - -* The result of *Fuse* operation is a compound containing split parts of arguments i.e. 3 new edges *E11*, *E12* and *E22*. These edges have two shared vertices. -In this case: - * argument edge *E1* has resulting split edges *E11* and *E12* (image of *E1*); - * argument edge *E2* has resulting split edges *E21* and *E22* (image of *E2*); - * edge *E12* is common for the images of *E1* and *E2*. - -@figure{/user_guides/boolean_operations/images/boolean_image015.svg,"",230} - -* The result of *Common* operation is a compound containing split parts of arguments i.e. 1 new edge *E12*. In this case edge *E12* is common for the images of *E1* and *E2*. -The common part between the edges (edge) has the same dimension (1) as the dimension of the arguments (1). - -@figure{/user_guides/boolean_operations/images/boolean_image016.svg,"",230} - -* The result of *Cut12* operation is a compound containing a split part of argument *E1*, i.e. new edge *E11*. - -@figure{/user_guides/boolean_operations/images/boolean_image017.svg,"",230} - -* The result of *Cut21* operation is a compound containing a split part of argument *E2*, i.e. new edge *E22*. - -@figure{/user_guides/boolean_operations/images/boolean_image018.svg,"",230} - - -@subsubsection occt_algorithms_9_4_7 Case 7: An Edge and a Face intersecting at a point - -Let us consider edge *E1* and face *F2* that intersect at a 3D point: - -@figure{/user_guides/boolean_operations/images/boolean_image019.png,"",230} - -* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the face (2). - -* The result of *Common* operation is an empty compound because the dimension (0) of the common part between the edge and face (vertex) is less than the dimension of the arguments (1). - -* The result of *Cut12* operation is a compound containing split parts of the argument *E1*, i.e. 2 new edges *E11* and *E12*. - -In this case the argument edge *E1* has no common parts with the face *F2* so the whole image of *E1* is in the result. - -@figure{/user_guides/boolean_operations/images/boolean_image020.png,"",230} - -* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the face (2). - -@subsubsection occt_algorithms_9_4_8 Case 8: A Face and an Edge that have a common block - -Let us consider edge *E1* and face *F2* that have a common block: - -@figure{/user_guides/boolean_operations/images/boolean_image021.png,"",230} - -* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the face (2). - -* The result of *Common* operation is a compound containing a split part of the argument *E1*, i.e. new edge *E12*. - -In this case the argument edge *E1* has a common part with face *F2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *F2*. - -@figure{/user_guides/boolean_operations/images/boolean_image022.png,"",230} - -* The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*. - -In this case the argument edge *E1* has a common part with face *F2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of F2. - -@figure{/user_guides/boolean_operations/images/boolean_image023.png,"",230} - -* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the face (2). - -@subsubsection occt_algorithms_9_4_9 Case 9: An Edge and a Solid intersecting at a point - -Let us consider edge *E1* and solid *S2* that intersect at a point: - -@figure{/user_guides/boolean_operations/images/boolean_image024.png,"",230} - -* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the solid (3). - -* The result of *Common* operation is a compound containing a split part of the argument *E1*, i.e. new edge *E12*. - -In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image025.png,"",230} - -* The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*. - -In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image071.png,"",230} - -* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the solid (3). - -@subsubsection occt_algorithms_9_4_10 Case 10: An Edge and a Solid that have a common block - -Let us consider edge *E1* and solid *S2* that have a common block: - -@figure{/user_guides/boolean_operations/images/boolean_image072.png,"",230} - -* The result of *Fuse* operation is not defined because the dimension of the edge (1) is not equal to the dimension of the solid (3). - -* The result of *Common* operation is a compound containing a split part of the argument *E1*, i.e. new edge *E12*. - -In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part of the image of *E1* is in the result. The yellow square is not a part of the result. It only shows the place of *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image073.png,"",230} - -* The result of *Cut12* operation is a compound containing split part of the argument *E1*, i.e. new edge *E11*. - -In this case the argument edge *E1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow square is not a part of the result. It only shows the place of *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image026.png,"",230} - -* The result of *Cut21* operation is not defined because the dimension of the edge (1) is less than the dimension of the solid (3). - -@subsubsection occt_algorithms_9_4_11 Case 11: Two intersecting faces - -Let us consider two intersecting faces *F1* and *F2*: - -@figure{/user_guides/boolean_operations/images/boolean_image027.png,"",230} - -* The result of *Fuse* operation is a compound containing split parts of arguments i.e. 2 new faces *F11* and *F21*. These faces have one shared edge *En1*. - -@figure{/user_guides/boolean_operations/images/boolean_image028.png,"",230} - - -* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *F2* (edge) is less than the dimension of arguments (2). - -* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*. - -@figure{/user_guides/boolean_operations/images/boolean_image029.png,"",230} - -* The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*. - -@figure{/user_guides/boolean_operations/images/boolean_image030.png,"",127} - -@subsubsection occt_algorithms_9_4_12 Case 12: Two faces that have a common part - -Let us consider two faces *F1* and *F2* that have a common part: - -@figure{/user_guides/boolean_operations/images/boolean_image031.png,"",230} - -* The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 3 new faces: *F11*, *F12* and *F22*. These faces are shared through edges In this case: - * the argument edge *F1* has resulting split faces *F11* and *F12* (image of *F1*) - * the argument face *F2* has resulting split faces *F12* and *F22* (image of *F2*) - * the face *F12* is common for the images of *F1* and *F2*. - -@figure{/user_guides/boolean_operations/images/boolean_image032.png,"",230} - -* The result of *Common* operation is a compound containing split parts of arguments i.e. 1 new face *F12*. -In this case: face *F12* is common for the images of *F1* and *F2*. -The common part between the faces (face) has the same dimension (2) as the dimension of the arguments (2). - - -@figure{/user_guides/boolean_operations/images/boolean_image033.png,"",230} - -* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*. - -@figure{/user_guides/boolean_operations/images/boolean_image034.png,"",230} - -* The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*. - -@figure{/user_guides/boolean_operations/images/boolean_image035.png,"",230} - -@subsubsection occt_algorithms_9_4_13 Case 13: Two faces that have a common edge - -Let us consider two faces *F1* and *F2* that have a common edge: - -@figure{/user_guides/boolean_operations/images/boolean_image036.png,"",230} - -* The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 2 new faces: *F11* and *F21*. These faces have one shared edge *En1*. - -@figure{/user_guides/boolean_operations/images/boolean_image037.png,"",230} - -* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *F2* (edge)is less than the dimension of the arguments (2) - -* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*. The vertices are shown just to clarify the fact that the edges are spitted. - -@figure{/user_guides/boolean_operations/images/boolean_image038.png,"",230} - -* The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*. The vertices are shown just to clarify the fact that the edges are spitted. - -@figure{/user_guides/boolean_operations/images/boolean_image039.png,"",230} - -@subsubsection occt_algorithms_9_4_14 Case 14: Two faces that have a common vertex - -Let us consider two faces *F1* and *F2* that have a common vertex: - -@figure{/user_guides/boolean_operations/images/boolean_image040.png,"",230} - -* The result of *Fuse* operation is a compound containing split parts of arguments, i.e. 2 new faces: *F11* and *F21*. These faces have one shared vertex *Vn1*. - -@figure{/user_guides/boolean_operations/images/boolean_image041.png,"",230} - -* The result of *Common* operation is an empty compound because the dimension (0) of the common part between *F1* and *F2* (vertex) is less than the dimension of the arguments (2) - -* The result of *Cut12* operation is a compound containing split part of the argument *F1*, i.e. new face *F11*. - -@figure{/user_guides/boolean_operations/images/boolean_image042.png,"",230} - -* The result of *Cut21* operation is a compound containing split parts of the argument *F2*, i.e. 1 new face *F21*. - -@figure{/user_guides/boolean_operations/images/boolean_image043.png,"",230} - - -@subsubsection occt_algorithms_9_4_15 Case 15: A Face and a Solid that have an intersection curve. - -Let us consider face *F1* and solid *S2* that have an intersection curve: - -@figure{/user_guides/boolean_operations/images/boolean_image044.png,"",230} - -* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3). - -* The result of *Common* operation is a compound containing split part of the argument *F1*. In this case the argument face *F1* has a common part with solid *S2*, so the corresponding part of the image of *F1* is in the result. The yellow contour is not a part of the result. It only shows the place of *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image045.png,"",230} - -* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image046.png,"",230} - -* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3). - -@subsubsection occt_algorithms_9_4_16 Case 16: A Face and a Solid that have overlapping faces. - -Let us consider face *F1* and solid *S2* that have overlapping faces: - -@figure{/user_guides/boolean_operations/images/boolean_image047.png,"",230} - -* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3). - -* The result of *Common* operation is a compound containing split part of the argument *F1*. In this case the argument face *F1* has a common part with solid *S2*, so the corresponding part of the image of *F1* is included in the result. The yellow contour is not a part of the result. It only shows the place of *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image048.png,"",230} - -* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image049.png,"",230} - -* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3). - - -@subsubsection occt_algorithms_9_4_17 Case 17: A Face and a Solid that have overlapping edges. - -Let us consider face *F1* and solid *S2* that have overlapping edges: - -@figure{/user_guides/boolean_operations/images/boolean_image050.png,"",230} - -* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3). - -* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *S2* (edge) is less than the lower dimension of the arguments (2). - -* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image051.png,"",230} - -* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3). - -@subsubsection occt_algorithms_9_4_18 Case 18: A Face and a Solid that have overlapping vertices. - -Let us consider face *F1* and solid *S2* that have overlapping vertices: - -@figure{/user_guides/boolean_operations/images/boolean_image052.png,"",230} - -* The result of *Fuse* operation is not defined because the dimension of the face (2) is not equal to the dimension of the solid (3). - -* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *F1* and *S2* (vertex) is less than the lower dimension of the arguments (2). - -* The result of *Cut12* operation is a compound containing split part of the argument *F1*. In this case argument face *F1* has a common part with solid *S2* so the corresponding part is not included into the result. The yellow contour is not a part of the result. It only shows the place of *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image053.png,"",230} - -* The result of *Cut21* operation is is not defined because the dimension of the face (2) is less than the dimension of the solid (3). - -@subsubsection occt_algorithms_9_4_19 Case 19: Two intersecting Solids. - -Let us consider two intersecting solids *S1* and *S2*: - -@figure{/user_guides/boolean_operations/images/boolean_image054.png,"",230} - -* The result of *Fuse* operation is a compound composed from the split parts of arguments *S11, S12* and *S22* (Cut12, Common, Cut21). All inner webs are removed, so the result is one new solid *R*. - -@figure{/user_guides/boolean_operations/images/boolean_image055.png,"",230} - -* The result of *Common* operation is a compound containing split parts of arguments i.e. one new solid *S12*. In this case solid *S12* is common for the images of *S1* and *S2*. The common part between the solids (solid) has the same dimension (3) as the dimension of the arguments (3). The yellow contour is not a part of the result. It only shows the place of *S1*. - -@figure{/user_guides/boolean_operations/images/boolean_image056.png,"",176} - -* The result of *Cut12* operation is a compound containing split part of the argument *S1*, i.e. 1 new solid *S11*. - -@figure{/user_guides/boolean_operations/images/boolean_image057.png,"",230} - -* The result of *Cut21* operation is a compound containing split part of the argument *S2*, i.e. 1 new solid *S21*. - -@figure{/user_guides/boolean_operations/images/boolean_image058.png,"",230} - -@subsubsection occt_algorithms_9_4_20 Case 20: Two Solids that have overlapping faces. - -Let us consider two solids *S1* and *S2* that have a common part on face: - -@figure{/user_guides/boolean_operations/images/boolean_image059.png,"",230} - -* The result of *Fuse* operation is a compound composed from the split parts of arguments *S11, S12* and *S22* (Cut12, Common, Cut21). All inner webs are removed, so the result is one new solid *R*. - -@figure{/user_guides/boolean_operations/images/boolean_image060.png,"",230} - -* The result of *Common* operation is an empty compound because the dimension (2) of the common part between *S1* and *S2* (face) is less than the lower dimension of the arguments (3). - -* The result of *Cut12* operation is a compound containing split part of the argument *S1*, i.e. 1 new solid *S11*. - -@figure{/user_guides/boolean_operations/images/boolean_image061.png,"",230} - -* The result of *Cut21* operation is a compound containing split part of the argument *S2*, i.e. 1 new solid *S21*. -@figure{/user_guides/boolean_operations/images/boolean_image062.png,"",230} - - -@subsubsection occt_algorithms_9_4_21 Case 21: Two Solids that have overlapping edges. - -Let us consider two solids *S1* and *S2* that have overlapping edges: - -@figure{/user_guides/boolean_operations/images/boolean_image063.png,"",230} - -* The result of *Fuse* operation is a compound composed from the split parts of arguments i.e. 2 new solids *S11* and *S21*. These solids have one shared edge *En1*. - -@figure{/user_guides/boolean_operations/images/boolean_image064.png,"",230} - -* The result of *Common* operation is an empty compound because the dimension (1) of the common part between *S1* and *S2* (edge) is less than the lower dimension of the arguments (3). - -* The result of *Cut12* operation is a compound containing split part of the argument *S1*. In this case -argument *S1* has a common part with solid *S2* so the corresponding part is not included into the result. - -@figure{/user_guides/boolean_operations/images/boolean_image065.png,"",230} - -* The result of *Cut21* operation is a compound containing split part of the argument *S2*. In this case -argument *S2* has a common part with solid *S1* so the corresponding part is not included into the result. - -@figure{/user_guides/boolean_operations/images/boolean_image066.png,"",230} - -@subsubsection occt_algorithms_9_4_22 Case 22: Two Solids that have overlapping vertices. - -Let us consider two solids *S1* and *S2* that have overlapping vertices: - -@figure{/user_guides/boolean_operations/images/boolean_image067.png,"",230} - -* The result of *Fuse* operation is a compound composed from the split parts of arguments i.e. 2 new solids *S11* and *S21*. These solids share *Vn1*. - -@figure{/user_guides/boolean_operations/images/boolean_image068.png,"",230} - -* The result of *Common* operation is an empty compound because the dimension (0) of the common part between *S1* and *S2* (vertex) is less than the lower dimension of the arguments (3). - -* The result of *Cut12* operation is a compound containing split part of the argument *S1*. - -@figure{/user_guides/boolean_operations/images/boolean_image069.png,"",230} - -* The result of *Cut21* operation is a compound containing split part of the argument *S2*. - -@figure{/user_guides/boolean_operations/images/boolean_image070.png,"",230} - -@subsubsection occt_algorithms_9_4_23 Case 23: A Shell and a Wire cut by a Solid. - -Let us consider Shell *Sh* and Wire *W* as the objects and Solid *S* as the tool: - -@figure{/user_guides/boolean_operations/images/boolean_image136.png,"",230} - -* The result of *Fuse* operation is not defined as the dimension of the arguments is not the same. - -* The result of *Common* operation is a compound containing the parts of the initial Shell and Wire common for the Solid. The new Shell and Wire are created from the objects. - -@figure{/user_guides/boolean_operations/images/boolean_image137.png,"",230} - -* The result of *Cut12* operation is a compound containing new Shell and Wire split from the arguments *Sh* and *W*. In this case they have a common part with solid *S* so the corresponding part is not included into the result. - -@figure{/user_guides/boolean_operations/images/boolean_image138.png,"",230} - -* The result of *Cut21* operation is not defined as the objects have a lower dimension than the tool. - -@subsubsection occt_algorithms_9_4_24 Case 24: Two Wires that have overlapping edges. - -Let us consider two Wires that have overlapping edges, *W1* is the object and *W2* is the tool: - -@figure{/user_guides/boolean_operations/images/boolean_image139.png,"",230} - -* The result of *Fuse* operation is a compound containing two Wires, which share an overlapping edge. The new Wires are created from the objects: - -@figure{/user_guides/boolean_operations/images/boolean_image140.png,"",230} - -* The result of *Common* operation is a compound containing one Wire consisting of an overlapping edge. The new Wire is created from the objects: - -@figure{/user_guides/boolean_operations/images/boolean_image141.png,"",230} - -* The result of *Cut12* operation is a compound containing a wire split from object *W1*. Its common part with *W2* is not included into the result. - -@figure{/user_guides/boolean_operations/images/boolean_image142.png,"",230} - -* The result of *Cut21* operation is a compound containing a wire split from *W2*. Its common part with *W1* is not included into the result. - -@figure{/user_guides/boolean_operations/images/boolean_image143.png,"",230} - - -@subsection occt_algorithms_9_5 Class BOPAlgo_BOP - -BOA is implemented in the class *BOPAlgo_BOP*. The main fields of this class are described in the Table: - -| Name | Contents | -| :---- | :--- | -| *myOperation* | The type of the Boolean operation (Common, Fuse, Cut) | -| *myTools* | The tools | -| *myDims[2]* | The values of the dimensions of the arguments | -| *myRC* | The draft result (shape) | - -The main steps of the *BOPAlgo_BOP* are the same as of @ref occt_algorithms_7_4 "BOPAlgo_Builder" except for some aspects described in the next paragraphs. - -@subsection occt_algorithms_9_6 Building Draft Result - -The input data for this step is as follows: -* *BOPAlgo_BOP* object after building result of type *Compound*; -* *Type* of the Boolean operation. - -| No | Contents | Implementation | -| :---- | :----- | :----- | -| 1 | For the Boolean operation *Fuse* add to *myRC* all images of arguments. | *BOPAlgo_BOP::BuildRC()* | -| 2 | For the Boolean operation *Common* or *Cut* add to *myRC* all images of argument *S1* that are *Common* for the Common operation and are *Not Common* for the Cut operation | *BOPAlgo_BOP::BuildRC()* | - -@subsection occt_algorithms_9_7 Building the Result - -The input data for this step is as follows: -* *BOPAlgo_BOP* object the state after building draft result. - -| No | Contents | Implementation | -| :---- | :---- | :------ | -| 1 | For the Type of the Boolean operation Common, Cut with any dimension and operation Fuse with *myDim[0] < 3* | | -| 1.1 | Find containers (WIRE, SHELL, COMPSOLID) in the arguments | *BOPAlgo_BOP:: BuildShape()* | -| 1.2 | Make connexity blocks from splits of each container that are in *myRC* | *BOPTools_Tools::MakeConnexityBlocks()* | -| 1.3 | Build the result from shapes made from the connexity blocks | *BOPAlgo_BOP:: BuildShape()* | -| 1.4 | Add the remaining shapes from *myRC* to the result | *BOPAlgo_BOP:: BuildShape()* | -| 2 | For the Type of the Boolean operation Fuse with *myDim[0] = 3* | | -| 2.1 | Find internal faces (FWi) in *myRC* | *BOPAlgo_BOP::BuildSolid()* | -| 2.2 | Collect all faces of *myRC* except for internal faces (FWi) -> SFS | *BOPAlgo_BOP::BuildSolid ()* | -| 2.3 | Build solids (SDi) from *SFS*. | *BOPAlgo_BuilderSolid* | -| 2.4 | Add the solids (SDi) to the result | | - -@subsection occt_algorithms_bop_on_opensolids Boolean operations on open solids - -The Boolean operations on open solids are tricky enough that the standard approach of Boolean operations for building the result, based on the splits of solids does not work. -It happens because the algorithm for splitting solids (*BOPAlgo_BuilderSolid*) always tries to create the closed loops (shells) and make solids from them. But if the input solid is not closed, what can be expected from its splits? -For performing Boolean Operations on open solids another approach is used, which does not rely on the splits of the solids to be correct, but tries to select the splits of faces, which are necessary for the given type of operation. -The point here is that the type of Boolean operation clearly defines the states for the faces to be taken into result: -- For **COMMON** operation all the faces from the arguments located inside any solid of the opposite group must be taken; -- For **FUSE** operation all the faces from the arguments located outside of all solids of the opposite group must be taken; -- For **CUT** operation all the faces from the Objects located outside of all solids of the Tools and all faces from the Tools located inside any solid of the Objects must be taken; -- For **CUT21** operation all the faces from the Objects located inside any solid of the Tools and all faces from the Tools located outside of all solids of the Objects must be taken. -From the selected faces the result solids are built. Please note, that the result may contain as normal (closed) solids as the open ones. - -Even with this approach, the correct result of Boolean operation on open solids cannot be always guaranteed. -This is explained by non-manifold nature of open solids: in some cases classification of a face depends on the point of the face chosen for classification. - -@section occt_algorithms_10a Section Algorithm - -@subsection occt_algorithms_10a_1 Arguments - -The arguments of BOA are shapes in terms of *TopoDS_Shape*. The main requirements for the arguments are described in the Algorithms. - -@subsection occt_algorithms_10a_2 Results and general rules -* The result of Section operation is a compound. Each sub-shape of the compound has shared sub-shapes in accordance with interferences between the arguments. -* The result of Section operation contains shapes that have dimension that is less then 2 i.e. vertices and edges. -* The result of Section operation contains standalone vertices if these vertices do not belong to the edges of the result. -* The result of Section operation contains vertices and edges of the arguments (or images of the arguments) that belong to at least two arguments (or two images of the arguments). -* The result of Section operation contains Section vertices and edges obtained from Face/Face interferences. -* The result of Section operation contains vertices that are the result of interferences between vertices and faces. -* The result of Section operation contains edges that are the result of interferences between edges and faces (Common Blocks), - -@subsection occt_algorithms_10a_3 Examples - -@subsubsection occt_algorithms_10a_3_1 Case 1: Two Vertices - -Let us consider two interfering vertices: *V1* and *V2*. - -@figure{/user_guides/boolean_operations/images/boolean_image080.png,"",131} - -The result of *Section* operation is the compound that contains a new vertex *V*. - -@figure{/user_guides/boolean_operations/images/boolean_image081.png,"",128} - -@subsubsection occt_algorithms_10a_3_2 Case 1: Case 2: A Vertex and an Edge - -Let us consider vertex *V1* and the edge *E2*, that intersect in a 3D point: - -@figure{/user_guides/boolean_operations/images/boolean_image082.png,"",230} - -The result of *Section* operation is the compound that contains vertex *V1*. - -@figure{/user_guides/boolean_operations/images/boolean_image083.png,"",230} - -@subsubsection occt_algorithms_10a_3_3 Case 1: Case 2: A Vertex and a Face - -Let us consider vertex *V1* and face *F2*, that intersect in a 3D point: - -@figure{/user_guides/boolean_operations/images/boolean_image084.png,"",230} - -The result of *Section* operation is the compound that contains vertex *V1*. - -@figure{/user_guides/boolean_operations/images/boolean_image085.png,"",230} - -@subsubsection occt_algorithms_10a_3_4 Case 4: A Vertex and a Solid - -Let us consider vertex *V1* and solid *Z2*. The vertex *V1* is inside the solid *Z2*. - -@figure{/user_guides/boolean_operations/images/boolean_image086.png,"",230} - -The result of *Section* operation is an empty compound. - -@subsubsection occt_algorithms_10a_3_5 Case 5: Two edges intersecting at one point - -Let us consider edges *E1* and *E2*, that intersect in a 3D point: - -@figure{/user_guides/boolean_operations/images/boolean_image087.png,"",230} - -The result of *Section* operation is the compound that contains a new vertex *Vnew*. - -@figure{/user_guides/boolean_operations/images/boolean_image088.png,"",230} - -@subsubsection occt_algorithms_10a_3_6 Case 6: Two edges having a common block - -Let us consider edges *E1* and *E2*, that have a common block: - -@figure{/user_guides/boolean_operations/images/boolean_image089.png,"",230} - -The result of *Section* operation is the compound that contains a new edge *Enew*. - -@figure{/user_guides/boolean_operations/images/boolean_image090.png,"",230} - -@subsubsection occt_algorithms_10a_3_7 Case 7: An Edge and a Face intersecting at a point - -Let us consider edge *E1* and face *F2*, that intersect at a 3D point: - -@figure{/user_guides/boolean_operations/images/boolean_image091.png,"",230} - -The result of *Section* operation is the compound that contains a new vertex *Vnew*. - -@figure{/user_guides/boolean_operations/images/boolean_image092.png,"",230} - -@subsubsection occt_algorithms_10a_3_8 Case 8: A Face and an Edge that have a common block - -Let us consider edge *E1* and face *F2*, that have a common block: - -@figure{/user_guides/boolean_operations/images/boolean_image093.png,"",230} - -The result of *Section* operation is the compound that contains new edge *Enew*. - -@figure{/user_guides/boolean_operations/images/boolean_image094.png,"",230} - - -@subsubsection occt_algorithms_10a_3_9 Case 9: An Edge and a Solid intersecting at a point - -Let us consider edge *E1* and solid *Z2*, that intersect at a point: - -@figure{/user_guides/boolean_operations/images/boolean_image095.png,"",230} - -The result of *Section* operation is the compound that contains a new vertex *Vnew*. - -@figure{/user_guides/boolean_operations/images/boolean_image096.png,"",230} - -@subsubsection occt_algorithms_10a_3_10 Case 10: An Edge and a Solid that have a common block - -Let us consider edge *E1* and solid *Z2*, that have a common block at a face: - -@figure{/user_guides/boolean_operations/images/boolean_image097.png,"",230} - -The result of *Section* operation is the compound that contains a new edge *Enew*. - -@figure{/user_guides/boolean_operations/images/boolean_image098.png,"",230} - -@subsubsection occt_algorithms_10a_3_11 Case 11: Two intersecting faces - -Let us consider two intersecting faces *F1* and *F2*: - -@figure{/user_guides/boolean_operations/images/boolean_image099.png,"",230} - -The result of *Section* operation is the compound that contains a new edge *Enew*. - -@figure{/user_guides/boolean_operations/images/boolean_image100.png,"",230} - -@subsubsection occt_algorithms_10a_3_12 Case 12: Two faces that have a common part - -Let us consider two faces *F1* and *F2* that have a common part: - -@figure{/user_guides/boolean_operations/images/boolean_image133.png,"",230} - -The result of *Section* operation is the compound that contains 4 new edges. - -@figure{/user_guides/boolean_operations/images/boolean_image134.png,"",230} - -@subsubsection occt_algorithms_10a_3_13 Case 13: Two faces that have overlapping edges - -Let us consider two faces *F1* and *F2* that have a overlapping edges: - -@figure{/user_guides/boolean_operations/images/boolean_image101.png,"",230} - -The result of *Section* operation is the compound that contains a new edge *Enew*. - -@figure{/user_guides/boolean_operations/images/boolean_image102.png,"",230} - -@subsubsection occt_algorithms_10a_3_14 Case 14: Two faces that have overlapping vertices - -Let us consider two faces *F1* and *F2* that have overlapping vertices: - -@figure{/user_guides/boolean_operations/images/boolean_image103.png,"",230} - -The result of *Section* operation is the compound that contains a new vertex *Vnew*. - -@figure{/user_guides/boolean_operations/images/boolean_image104.png,"",230} - -@subsubsection occt_algorithms_10a_3_15 Case 15: A Face and a Solid that have an intersection curve - -Let us consider face *F1* and solid *Z2* that have an intersection curve: - -@figure{/user_guides/boolean_operations/images/boolean_image105.png,"",230} - -The result of *Section* operation is the compound that contains new edges. - -@figure{/user_guides/boolean_operations/images/boolean_image106.png,"",230} - -@subsubsection occt_algorithms_10a_3_16 Case 16: A Face and a Solid that have overlapping faces. - -Let us consider face *F1* and solid *Z2* that have overlapping faces: - -@figure{/user_guides/boolean_operations/images/boolean_image107.png,"",230} - -The result of *Section* operation is the compound that contains new edges - -@figure{/user_guides/boolean_operations/images/boolean_image108.png,"",230} - -@subsubsection occt_algorithms_10a_3_17 Case 17: A Face and a Solid that have overlapping edges. - -Let us consider face *F1* and solid *Z2* that have a common part on edge: - -@figure{/user_guides/boolean_operations/images/boolean_image109.png,"",230} - -The result of *Section* operation is the compound that contains a new edge *Enew*. - -@figure{/user_guides/boolean_operations/images/boolean_image110.png,"",230} - -@subsubsection occt_algorithms_10a_3_18 Case 18: A Face and a Solid that have overlapping vertices. - -Let us consider face *F1* and solid *Z2* that have overlapping vertices: - -@figure{/user_guides/boolean_operations/images/boolean_image111.png,"",230} - -The result of *Section* operation is the compound that contains a new vertex *Vnew*. - -@figure{/user_guides/boolean_operations/images/boolean_image112.png,"",230} - -@subsubsection occt_algorithms_10a_3_19 Case 19: Two intersecting Solids - -Let us consider two intersecting solids *Z1* and *Z2*: -@figure{/user_guides/boolean_operations/images/boolean_image113.png,"",230} - -The result of *Section* operation is the compound that contains new edges. -@figure{/user_guides/boolean_operations/images/boolean_image114.png,"",230} - -@subsubsection occt_algorithms_10a_3_20 Case 20: Two Solids that have overlapping faces - -Let us consider two solids *Z1* and *Z2* that have a common part on face: -@figure{/user_guides/boolean_operations/images/boolean_image115.png,"",230} - -The result of *Section* operation is the compound that contains new edges. -@figure{/user_guides/boolean_operations/images/boolean_image116.png,"",230} - -@subsubsection occt_algorithms_10a_3_21 Case 21: Two Solids that have overlapping edges - -Let us consider two solids *Z1* and *Z2* that have overlapping edges: -@figure{/user_guides/boolean_operations/images/boolean_image117.png,"",230} - -The result of *Section* operation is the compound that contains a new edge *Enew*. -@figure{/user_guides/boolean_operations/images/boolean_image118.png,"",230} - -@subsubsection occt_algorithms_10a_3_22 Case 22: Two Solids that have overlapping vertices - -Let us consider two solids *Z1* and *Z2* that have overlapping vertices: -@figure{/user_guides/boolean_operations/images/boolean_image119.png,"",230} - -The result of *Section* operation is the compound that contains a new vertex *Vnew*. -@figure{/user_guides/boolean_operations/images/boolean_image120.png,"",230} - -@subsection occt_algorithms_10a_4 Class BOPAlgo_Section - -SA is implemented in the class *BOPAlgo_Section*. The class has no specific fields. -The main steps of the *BOPAlgo_Section* are the same as of *BOPAlgo_Builder* except for the following steps: - -* Build Images for Wires; -* Build Result of Type Wire; -* Build Images for Faces; -* Build Result of Type Face; -* Build Images for Shells; -* Build Result of Type Shell; -* Build Images for Solids; -* Build Result of Type Solid; -* Build Images for Type CompSolid; -* Build Result of Type CompSolid; -* Build Images for Compounds; -Some aspects of building the result are described in the next paragraph - -@subsection occt_algorithms_10a_5 Building the Result - -| No | Contents | Implementation | -| :---- | :---- | :------ | -| 1 | Build the result of the operation using all information contained in *FaceInfo*, Common Block, Shared entities of the arguments, etc. | *BOPAlgo_Section:: BuildSection()* | - -@section occt_algorithms_10b Volume Maker Algorithm - -The Volume Maker algorithm has been designed for building the elementary volumes (solids) from a set of connected, intersecting, or nested shapes. The algorithm can also be useful for splitting solids into parts, or constructing new solid(s) from set of intersecting or connected faces or shells. -The algorithm creates only closed solids. In general case the result solids are non-manifold: fragments of the input shapes (wires, faces) located inside the solids are added as internal sub-shapes to these solids. -But the algorithm allows preventing the addition of the internal for solids parts into result. In this case the result solids will be manifold and not contain any internal parts. However, this option does not prevent from the occurrence of the internal edges or vertices in the faces.
-Non-closed faces, free wires etc. located outside of any solid are always excluded from the result. - -The Volume Maker algorithm is implemented in the class BOPAlgo_MakerVolume. It is based on the General Fuse (GF) algorithm. All the options of the GF algorithm (see @ref occt_algorithms_7_3a "GF Options") are also available in this algorithm. - -The requirements for the arguments are the same as for the arguments of GF algorithm - they could be of any type, but each argument should be valid and not self-interfered. - -The algorithm allows disabling the calculation of intersections among the arguments. In this case the algorithm will run much faster, but the user should guarantee that the arguments do not interfere with each other, otherwise the result will be invalid (e.g. contain unexpected parts) or empty. -This option is useful e.g. for building a solid from the faces of one shell or from the shapes that have already been intersected. - -@subsection occt_algorithms_10b_1 Usage - -#### C++ Level -The usage of the algorithm on the API level: -~~~~ -BOPAlgo_MakerVolume aMV; -// Set the arguments -TopTools_ListOfShape aLS = …; // arguments -aMV.SetArguments(aLS); - -// Set options for the algorithm -// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) -... -// Additional option of the algorithm -Standard_Boolean bAvoidInternalShapes = Standard_False; // Set to True to exclude from the result any shapes internal to the solids -aMV.SetAvoidInternalShapes(bAvoidInternalShapes); - -// Perform the operation -aMV.Perform(); -if (aMV.HasErrors()) { //check error status - return; -} -// -const TopoDS_Shape& aResult = aMV.Shape(); // result of the operation -~~~~ - -#### Tcl Level -To use the algorithm in Draw the command mkvolume has been implemented. The usage of this command is following: -~~~~ -Usage: mkvolume r b1 b2 ... [-c] [-ni] [-ai] -Options: --c - use this option to have input compounds considered as set of separate arguments (allows passing multiple arguments as one compound); --ni - use this option to disable the intersection of the arguments; --ai - use this option to avoid internal for solids shapes in the result. -~~~~ - -@subsection occt_algorithms_10b_2 Examples - -#### Example 1 -Creation of 9832 solids from sphere and set of 63 planes: - - - - - - -
@figure{/user_guides/boolean_operations/images/mkvolume_image001.png,"Arguments",200}@figure{/user_guides/boolean_operations/images/mkvolume_image002.png,"Results",200}
- -#### Example 2 -Creating compartments on a ship defined by hull shell and a set of planes. The ship is divided on compartments by five transverse bulkheads and a deck – six compartments are created: - - - - - - -
@figure{/user_guides/boolean_operations/images/mkvolume_image003.png,"Arguments",200}@figure{/user_guides/boolean_operations/images/mkvolume_image004.png,"Results",200}
- -@section occt_algorithms_10c_Cells Cells Builder algorithm - -The Cells Builder algorithm is an extension of the General Fuse algorithm. The result of General Fuse algorithm contains all split parts of the arguments. The Cells Builder algorithm provides means to specify if any given split part of the arguments (referred to as Cell) can be taken or avoided in the result. - -The possibility of selecting any Cell allows combining any possible result and gives the Cells Builder algorithm a very wide sphere of application - from building the result of any Boolean operation to building the result of any application-specific operation. - -The algorithm builds Cells only once and then just reuses them for combining the result. This gives this algorithm the performance advantage over Boolean operations, which always rebuild the splits to obtain the desirable result. - -Thus, the Cells Builder algorithm can be especially useful for simulating Boolean expressions, i.e. a sequence of Boolean operations on the same arguments. Instead of performing many Boolean operations it allows getting the final result in a single operation. The Cells Builder will also be beneficial to obtain the results of different Boolean operations on the same arguments - Cut and Common, for example. - -The Cells Builder algorithm also provides the possibility to remove any internal boundaries between splits of the same type, i.e. to fuse any same-dimensional parts added into the result and to keep any other parts as separate. This possibility is implemented through the Cells material approach: to remove the boundary between two Cells, both Cells should be assigned with the same material ID. However, if the same material ID has been assigned to the Cells of different dimension, the removal of the internal boundaries for that material will not be performed. Currently, such case is considered a limitation for the algorithm. - -The algorithm can also create containers from the connected Cells added into result - WIRES from Edges, SHELLS from Faces and COMPSOLIDS from Solids. - -@subsection occt_algorithms_10c_Cells_1 Usage - -The algorithm has been implemented in the *BOPAlgo_CellsBuilder* class. - -Cells Builder is based on the General Fuse algorithm. Thus all options of the General Fuse algorithm (see @ref occt_algorithms_7_3a "GF Options") are also available in this algorithm. - -The requirements for the input shapes are the same as for General Fuse - each argument should be valid in terms of *BRepCheck_Analyzer* and *BOPAlgo_ArgumentAnalyzer*. - -The result of the algorithm is a compound containing the selected parts of the basic type (VERTEX, EDGE, FACE or SOLID). The default result is an empty compound. It is possible to add any Cell by using the methods *AddToRessult()* and *AddAllToResult()*. It is also possible to remove any part from the result by using methods *RemoveFromResult()* and *RemoveAllFromResult()*. The method *RemoveAllFromResult()* is also suitable for clearing the result. - -The Cells that should be added/removed to/from the result are defined through the input shapes containing the parts that should be taken *(ShapesToTake)* and the ones containing parts that should be avoided (ShapesToAvoid). -To be taken into the result the part must be IN all shapes from *ShapesToTake* and OUT of all shapes from *ShapesToAvoid*. - -To remove Internal boundaries, it is necessary to set the same material to the Cells, between which the boundaries should be removed, and call the method *RemoveInternalBoundaries()*. -The material should not be equal to 0, as this is the default material ID. The boundaries between Cells with this material ID will not be removed. The same Cell cannot be added with different materials. -It is also possible to remove the boundaries when the result is combined. To do this, it is necessary to set the material for parts (not equal to 0) and set the flag *bUpdate* to TRUE. -If the same material ID has been set for parts of different dimension, the removal of internal boundaries for this material will not be performed. - -It is possible to create typed Containers from the parts added into result by using method *MakeContainers()*. The type of the containers will depend on the type of the input shapes: WIRES for EDGE, SHELLS for FACES and COMPSOLIDS for SOLIDS. The result will be a compound containing containers. - -#### API usage -Here is the example of the algorithm use on the API level: -~~~~ -BOPAlgo_CellsBuilder aCBuilder; -// Set the arguments -TopTools_ListOfShape aLS = …; // arguments -aCBuilder.SetArguments(aLS); - -// Set options for the algorithm -// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) -... - -aCBuilder.Perform(); // build splits of all arguments (GF) -if (aCBuilder.HasErrors()) { // check error status - return; -} -// -// collecting of the cells into result -const TopoDS_Shape& anEmptyRes = aCBuilder.Shape(); // empty result, as nothing has been added yet -const TopoDS_Shape& anAllCells = aCBuilder.GetAllParts(); //all split parts -// -TopTools_ListOfShape aLSToTake = ...; // parts of these arguments will be taken into result -TopTools_ListOfShape aLSToAvoid = ...; // parts of these arguments will not be taken into result -// -Standard_Integer iMaterial = 1; // defines the material for the cells -Standard_Boolean bUpdate = Standard_False; // defines whether to update the result right now or not -// adding to result -aCBuilder.AddToResult(aLSToTake, aLSToAvoid, iMaterial, bUpdate); -aCBuilder.RemoveInternalBoundaries(); // removing of the boundaries -TopoDS_Shape aResult = aCBuilder.Shape(); // the result -// removing from result -aCBuilder.AddAllToResult(); -aCBuilder.RemoveFromResult(aLSToTake, aLSToAvoid); -aResult = aCBuilder.Shape(); // the result -~~~~ - -#### DRAW usage - -The following set of new commands has been implemented to run the algorithm in DRAW Test Harness: -~~~~ -bcbuild : Initialization of the Cells Builder. Use: *bcbuild r* -bcadd : Add parts to result. Use: *bcadd r s1 (0,1) s2 (0,1) ... [-m material [-u]]* -bcaddall : Add all parts to result. Use: *bcaddall r [-m material [-u]]* -bcremove : Remove parts from result. Use: *bcremove r s1 (0,1) s2 (0,1) ...* -bcremoveall : Remove all parts from result. Use: *bcremoveall* -bcremoveint : Remove internal boundaries. Use: *bcremoveint r* -bcmakecontainers : Make containers from the parts added to result. Use: *bcmakecontainers r* -~~~~ - -Here is the example of the algorithm use on the DRAW level: -~~~~ -psphere s1 15 -psphere s2 15 -psphere s3 15 -ttranslate s1 0 0 10 -ttranslate s2 20 0 10 -ttranslate s3 10 0 0 -bclearobjects; bcleartools -baddobjects s1 s2 s3 -bfillds -# rx will contain all split parts -bcbuild rx -# add to result the part that is common for all three spheres -bcadd res s1 1 s2 1 s3 1 -m 1 -# add to result the part that is common only for first and third spheres -bcadd res s1 1 s2 0 s3 1 -m 1 -# remove internal boundaries -bcremoveint res -~~~~ - -@subsection occt_algorithms_10c_Cells_2 Examples - -The following simple example illustrates the possibilities of the algorithm working on a cylinder and a sphere intersected by a plane: -~~~~ -pcylinder c 10 30 -psphere s 15 -ttranslate s 0 0 30 -plane p 0 0 20 1 0 0 -mkface f p -25 30 -17 17 -~~~~ - -@figure{/user_guides/boolean_operations/images/cells_algorithm_001.png,"Arguments",160} - -~~~~ -bclearobjects -bcleartools -baddobjects c s f -bfillds -bcbuild r -~~~~ - -#### 1. Common for all arguments - -~~~~ -bcremoveall -bcadd res c 1 s 1 f 1 -~~~~ - -@figure{/user_guides/boolean_operations/images/cells_algorithm_002.png,"The result of COMMON operation",126} - -#### 2. Common between cylinder and face - -~~~~ -bcremoveall -bcadd res f 1 c 1 -~~~~ - -@figure{/user_guides/boolean_operations/images/cells_algorithm_003.png,"The result of COMMON operation between cylinder and face",90} - -#### 3. Common between cylinder and sphere - -~~~~ -bcremoveall -bcadd res c 1 s 1 -~~~~ - -@figure{/user_guides/boolean_operations/images/cells_algorithm_004.png,"The result of COMMON operation between cylinder and sphere",120} - -#### 4. Fuse of cylinder and sphere - -~~~~ -bcremoveall -bcadd res c 1 -m 1 -bcadd res s 1 -m 1 -bcremoveint res -~~~~ - -@figure{/user_guides/boolean_operations/images/cells_algorithm_005.png,"The result of FUSE operation between cylinder and sphere",160} - -#### 5. Parts of the face inside solids - FUSE(COMMON(f, c), COMMON(f, s)) - -~~~~ -bcremoveall -bcadd res f 1 s 1 -m 1 -bcadd res f 1 c 1 -m 1 -~~~~ - -@figure{/user_guides/boolean_operations/images/cells_algorithm_006_1.png,"Parts of the face inside solids",160} - -~~~~ -bcremoveint res -~~~~ - -@figure{/user_guides/boolean_operations/images/cells_algorithm_006_2.png,"Unified parts of the face inside solids",160} - -#### 6. Part of the face outside solids - -~~~~ -bcremoveall -bcadd res f 1 c 0 s 0 -~~~~ - -@figure{/user_guides/boolean_operations/images/cells_algorithm_007.png,"Part of the face outside solids",160} - -#### 7. Fuse operation (impossible using standard Boolean Fuse operation) - -~~~~ -bcremoveall -bcadd res c 1 -m 1 -bcadd res s 1 -m 1 -bcadd res f 1 c 0 s 0 -bcremoveint res -~~~~ - -@figure{/user_guides/boolean_operations/images/cells_algorithm_008.png,"Fuse operation",160} - - -These examples may last forever. To define any new operation, it is just necessary to define, which Cells should be taken and which should be avoided. - - -@section occt_algorithms_10 Algorithm Limitations - -The chapter describes the problems that are considered as Algorithm limitations. In most cases an Algorithm failure is caused by a combination of various factors, such as self-interfered arguments, inappropriate or ungrounded values of the argument tolerances, adverse mutual position of the arguments, tangency, etc. - -A lot of failures of GFA algorithm can be caused by bugs in low-level algorithms: Intersection Algorithm, Projection Algorithm, Approximation Algorithm, Classification Algorithm, etc. -* The Intersection, Projection and Approximation Algorithms are mostly used at the Intersection step. Their bugs directly cause wrong section results (i.e. incorrect section edges, section points, missing section edges or micro edges). It is not possible to obtain a correct final result of the GFA if a section result is wrong. -* The Projection Algorithm is used at the Intersection step. The purpose of Projection Algorithm is to compute 2D curves on surfaces. Wrong results here lead to incorrect or missing faces in the final GFA result. -* The Classification Algorithm is used at the Building step. The bugs in the Classification Algorithm lead to errors in selecting shape parts (edges, faces, solids) and ultimately to a wrong final GFA result. - -The description below illustrates some known GFA limitations. It does not enumerate exhaustively all problems that can arise in practice. Please address cases of Algorithm failure to the OCCT Maintenance Service. - - -@subsection occt_algorithms_10_1 Arguments - -@subsubsection occt_algorithms_10_1_1 Common requirements - -Each argument should be valid (in terms of *BRepCheck_Analyzer*), or conversely, if the argument is considered as non-valid (in terms of *BRepCheck_Analyzer*), it cannot be used as an argument of the algorithm. - -The class *BRepCheck_Analyzer* is used to check the overall validity of a shape. In OCCT a Shape (or its sub-shapes) is considered valid if it meets certain criteria. If the shape is found as invalid, it can be fixed by tools from *ShapeAnalysis, ShapeUpgrade* and *ShapeFix* packages. - -However, it is important to note that class *BRepCheck_Analyzer* is just a tool that can have its own problems; this means that due to a specific factor(s) this tool can sometimes provide a wrong result. - -Let us consider the following example: - -The Analyzer checks distances between couples of 3D check-points (Pi, PSi) of edge *E* on face *F*. Point *Pi* is obtained from the 3D curve (at the parameter *ti*) of the edge. *PSi* is obtained from 2D curve (at the parameter *ti*) of the edge on surface *S* of face *F*. To be valid the distance should be less than *Tol(E)* for all couples of check-points. The number of these check-points is a predefined value (e.g. 23). - -Let us consider the case when edge *E* is recognized valid (in terms of *BRepCheck_Analyzer*). - -Further, after some operation, edge *E* is split into two edges *E1* and *E2*. Each split edge has the same 3D curve and 2D curve as the original edge *E*. - -Let us check *E1* (or E2). The Analyzer again checks the distances between the couples of check-points points (Pi, PSi). The number of these check-points is the same constant value (23), but there is no guarantee that the distances will be less than *Tol(E)*, because the points chosen for *E1* are not the same as for *E*. - -Thus, if *E1* is recognized by the Analyzer as non-valid, edge *E* should also be non-valid. However *E* has been recognized as valid. Thus the Analyzer gives a wrong result for *E*. - -The fact that the argument is a valid shape (in terms of *BRepCheck_Analyzer*) is a necessary but insufficient requirement to produce a valid result of the Algorithms. - -@subsubsection occt_algorithms_10_1_3 Pure self-interference - -The argument should not be self-interfered, i.e. all sub-shapes of the argument that have geometrical coincidence through any topological entities (vertices, edges, faces) should share these entities. - -#### Example 1: Compound of two edges -The compound of two edges *E1* and *E2* is a self-interfered shape and cannot be used as the argument of the Algorithms. - -@figure{/user_guides/boolean_operations/images/operations_image036.svg,"Compound of two edges",230} - -#### Example 2: Self-interfered Edge -The edge *E* is a self-interfered shape and cannot be used as an argument of the Algorithms. - -@figure{/user_guides/boolean_operations/images/operations_image037.svg,"Self-interfered Edge",140} - -#### Example 3: Self-interfered Face -The face *F* is a self-interfered shape and cannot be used as an argument of the Algorithms. - -@figure{/user_guides/boolean_operations/images/operations_image038.svg,"Self-interfered Face",230} - -#### Example 4: Face of Revolution -The face *F* has been obtained by revolution of edge *E* around line *L*. - -@figure{/user_guides/boolean_operations/images/operations_image039a.png,"Face of Revolution: Arguments",230} -@figure{/user_guides/boolean_operations/images/operations_image039b.png,"Face of Revolution: Result",230} - -In spite of the fact that face *F* is valid (in terms of *BRepCheck_Analyzer*) it is a self-interfered shape and cannot be used as the argument of the Algorithms. - -@subsubsection occt_algorithms_10_1_4 Self-interferences due to tolerances -#### Example 1: Non-closed Edge - -Let us consider edge *E* based on a non-closed circle. @figure{/user_guides/boolean_operations/images/operations_image040.png,"Edge based on a non-closed circle",230} - -The distance between the vertices of *E* is *D=0.69799*. The values of the tolerances *Tol(V1)=Tol(V2)=0.5*. -@figure{/user_guides/boolean_operations/images/operations_image041.png,"Distance and Tolerances",230} - -In spite of the fact that the edge *E* is valid in terms of *BRepCheck_Analyzer*, it is a self-interfered shape because its vertices are interfered. Thus, edge *E* cannot be used as an argument of the Algorithms. - -#### Example 2: Solid containing an interfered vertex - -Let us consider solid *S* containing vertex V. @figure{/user_guides/boolean_operations/images/operations_image042.png,"Solid containing an interfered vertex",230} - -The value of tolerance Tol(V)= 50.000075982061. - -@figure{/user_guides/boolean_operations/images/operations_image043.png,"Tolerance",230} - -In spite of the fact that solid *S* is valid in terms of *BRepCheck_Analyzer* it is a self-interfered shape because vertex *V* is interfered with a lot of sub-shapes from *S* without any topological connection with them. Thus solid *S* cannot be used as an argument of the Algorithms. - -@subsubsection occt_algorithms_10_1_5 Parametric representation -The parameterization of some surfaces (cylinder, cone, surface of revolution) can be the cause of limitation. - -#### Example 1: Cylindrical surface -The parameterization range for cylindrical surface is: - -@figure{/user_guides/boolean_operations/images/boolean_image135.png,"",230} - -The range of *U* coordinate is always restricted while the range of *V* coordinate is non-restricted. - -Let us consider a cylinder-based *Face 1* with radii *R=3* and *H=6*. - -@figure{/user_guides/boolean_operations/images/operations_image044.png,"Face 1",230} - -@figure{/user_guides/boolean_operations/images/operations_image045.png,"P-Curves for Face 1",230} - -Let us also consider a cylinder-based *Face 2* with radii *R=3000* and *H=6000* (resulting from scaling Face 1 with scale factor *ScF=1000*). - -@figure{/user_guides/boolean_operations/images/operations_image046.png,"Face 2",230} - -@figure{/user_guides/boolean_operations/images/operations_image047.png,"P-Curves for Face 2",230} - -Pay attention to the Zoom value of the Figures. - -It is obvious that starting with some value of *ScF*, e.g. *ScF>1000000*, all sloped p-Curves on *Face 2* will be almost vertical. At least, there will be no difference between the values of angles computed by standard C Run-Time Library functions, such as *double acos(double x)*. The loss of accuracy in computation of angles can cause failure of some BP sub-algorithms, such as building faces from a set of edges or building solids from a set of faces. - - -@subsubsection occt_algorithms_10_1_6 Using tolerances of vertices to fix gaps - -It is possible to create shapes that use sub-shapes of lower order to avoid gaps in the tolerance-based data model. - -Let us consider the following example: - -@figure{/user_guides/boolean_operations/images/operations_image048.png,"Example",230} - -* Face *F* has two edges *E1* and *E2* and two vertices, the base plane is {0,0,0, 0,0,1}; -* Edge *E1* is based on line {0,0,0, 1,0,0}, Tol(E1) = 1.e-7; -* Edge *E2* is based on line {0,1,0, 1,0,0}, Tol(E2) = 1.e-7; -* Vertex *V1*, point {0,0.5,0}, Tol(V1) = 1; -* Vertex *V2*, point {10,0.5,0}, Tol(V2) = 1; -* Face *F* is valid (in terms of *BRepCheck_Analyzer*). - -The values of tolerances *Tol(V1)* and *Tol(V2)* are big enough to fix the gaps between the ends of the edges, but the vertices *V1* and *V2* do not contain any information about the trajectories connecting the corresponding ends of the edges. Thus, the trajectories are undefined. This will cause failure of some sub-algorithms of BP. For example, the sub-algorithms for building faces from a set of edges use the information about all edges connected in a vertex. The situation when a vertex has several pairs of edges such as above will not be solved in a right way. - - -@subsection occt_algorithms_11_1 Intersection problems -@subsubsection occt_algorithms_11_1_1 Pure intersections and common zones - -#### Example: Intersecting Edges - -Let us consider the intersection between two edges: -* *E1* is based on a line: {0,-10,0, 1,0,0}, Tol(E1)=2. -* *E2* is based on a circle: {0,0,0, 0,0,1}, R=10, Tol(E2)=2. - -@figure{/user_guides/boolean_operations/images/operations_image049.png,"Intersecting Edges",320} - -The result of pure intersection between *E1* and *E2* is vertex *Vx {0,-10,0}*. - -The result of intersection taking into account tolerances is the common zone *CZ* (part of 3D-space where the distance between the curves is less than or equals to the sum of edge tolerances. - -The Intersection Part of Algorithms uses the result of pure intersection *Vx* instead of *CZ* for the following reasons: -* The Algorithms do not produce Common Blocks between edges based on underlying curves of explicitly different type (e.g. Line / Circle). If the curves have different types, the rule of thumb is that the produced result is of type **vertex**. This rule does not work for non-analytic curves (Bezier, B-Spline) and their combinations with analytic curves. -* The algorithm of intersection between two surfaces *IntPatch_Intersection* does not compute *CZ* of the intersection between curves and points. So even if *CZ* were computed by Edge/Edge intersection algorithm, its result could not be treated by Face/Face intersection algorithm. - -@subsubsection occt_algorithms_11_2_2 Tolerances and inaccuracies - -The following limitations result from modeling errors or inaccuracies. - -#### Example: Intersection of planar faces - -Let us consider two planar rectangular faces *F1* and *F2*. - -The intersection curve between the planes is curve *C12*. The curve produces a new intersection edge *EC12*. The edge goes through vertices *V1* and *V2* thanks to big tolerance values of vertices *Tol(V1)* and *Tol(V2)*. So, two straight edges *E12* and *EC12* go through two vertices, which is impossible in this case. - -@figure{/user_guides/boolean_operations/images/operations_image050.svg,"Intersecting Faces",320} - - -The problem cannot be solved in general, because the length of *E12* can be infinite and the values of *Tol(V1)* and *Tol(V2)* theoretically can be infinite too. - -In a particular case the problem can be solved in several ways: -* Reduce, if possible, the values of *Tol(V1)* and *Tol(V2)* (refinement of *F1*). -* Analyze the value of *Tol(EC12)* and increase *Tol(EC12)* to get a common part between the edges *EC12* and *E12*. Then the common part will be rejected as there is an already existing edge *E12* for face *F1*. - -It is easy to see that if *C12* is slightly above the tolerance spheres of *V1* and *V2* the problem does not appear. - -#### Example: Intersection of two edges - -Let us consider two edges *E1* and *E2*, which have common vertices *V1* and *V2*. The edges *E1* and *E2* have 3D-curves *C1* and *C2. Tol(E1)=1.e-7, Tol(E2)=1.e-7.* - -*C1* practically coincides in 3D with *C2*. The value of deflection is *Dmax* (e.g. *Dmax=1.e-6*). - -@figure{/user_guides/boolean_operations/images/operations_image051.svg,"Intersecting Edges",420} - -The evident and prospective result should be the Common Block between *E1* and *E2*. However, the result of intersection differs. - -@figure{/user_guides/boolean_operations/images/operations_image052.svg,"Result of Intersection",420} - -The result contains three new vertices *Vx1, Vx2* and *Vx3*, 8 new edges (V1, Vx1, Vx2, Vx3, V2) and no Common Blocks. This is correct due to the source data: *Tol(E1)=1.e-7, Tol(E2)=1.e-7* and Dmax=1.e-6. - -In this particular case the problem can be solved by several ways: -* Increase, if possible, the values *Tol(E1)* and *Tol(E2)* to get coincidence in 3D between *E1* and *E2* in terms of tolerance. -* Replace *E1* by a more accurate model. - -The example can be extended from 1D (edges) to 2D (faces). - -@figure{/user_guides/boolean_operations/images/operations_image053.svg,"Intersecting Faces",420} - -The comments and recommendations are the same as for 1D case above. - - -@subsubsection occt_algorithms_11_2_3 Acquired Self-interferences -#### Example 1: Vertex and edge - -Let us consider vertex *V1* and edge *E2*. - -@figure{/user_guides/boolean_operations/images/operations_image054.svg,"Vertex and Edge",171} - -Vertex *V1* interferes with vertices *V12* and *V22*. -So vertex *V21* should interfere with vertex *V22*, which is impossible because vertices *V21* and *V22* are the vertices of edge *E2*, thus *V21* is not equal to *V22*. - -The problem cannot be solved in general, because the length can be as small as possible to provide validity of *E2* (in the extreme case: *Length (E2) = Tol(V21) + Tol(V22) + e,* where *e-> 0*). - -In a particular case the problem can be solved by refinement of arguments, i.e. by decreasing the values of *Tol(V21)*, *Tol(V22)* and *Tol(V1)*. - -#### Example 2: Vertex and wire - -Let us consider vertex *V2* and wire consisting of edges *E11* and *E12*. - -@figure{/user_guides/boolean_operations/images/operations_image055.svg,"Vertex and Wire",200} - -The arguments themselves are not self-intersected. -Vertex *V2* interferes with edges *E11* and *E12*. Thus, edge *E11* should interfere with edge *E22*, but it is impossible because edges *E11* and *E12* cannot interfere by the condition. - -The cases when a non-self-interfered argument (or its sub-shapes) become interfered due to the intersections with other arguments (or their sub-shapes) are considered as limitations for the Algorithms. - -@section occt_algorithms_11a Advanced Options - -The previous chapters describe so called Basic Operations. Most of tasks can be solved using Basic Operations. Nonetheless, there are cases that can not be solved straightforwardly by Basic Operations. The tasks are considered as limitations of Basic Operations. - -The chapter is devoted to Advanced Options. In some cases the usage of Advanced Options allows overcoming the limitations, improving the quality of the result of operations, robustness and performance of the operators themselves. - -@subsection occt_algorithms_11a_1 Fuzzy Boolean Operation - -Fuzzy Boolean operation is the option of Basic Operations such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building operations, in which additional user-specified tolerance is used. This option allows operators to handle robustly cases of touching and near-coincident, misaligned entities of the arguments. - -The Fuzzy option is useful on the shapes with gaps or embeddings between the entities of these shapes, which are not covered by the tolerance values of these entities. Such shapes can be the result of modeling mistakes, or translating process, or import from other systems with loss of precision, or errors in some algorithms. - -Most likely, the Basic Operations will give unsatisfactory results on such models. The result may contain unexpected and unwanted small entities, faulty entities (in terms of *BRepCheck_Analyzer*), or there can be no result at all. - -With the Fuzzy option it is possible to get the expected result -- it is just necessary to define the appropriate value of fuzzy tolerance for the operation. To define that value it is necessary to measure the value of the gap (or the value of embedding depth) between the entities of the models, slightly increase it (to make the shifted entities coincident in terms of their tolerance plus the additional one) and pass it to the algorithm. - -Fuzzy option is included in interface of Intersection Part (class *BOPAlgo_PaveFiller*) and application programming interface (class *BRepAlgoAPI_BooleanOperation*) - -@subsubsection occt_algorithms_11a_1_1 Examples -The following examples demonstrate the advantages of usage Fuzzy option operations over the Basic Operations in typical situations. - -#### Case 1 - -In this example the cylinder (shown in yellow and transparent) is subtracted from the box (shown in red). The cylinder is shifted by 5e-5 relatively to the box along its axis (the distance between rear faces of the box and cylinder is 5e-5). - -@figure{/user_guides/boolean_operations/images/boolean_image121.png,"",240} - -The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 5e-5: - -@figure{/user_guides/boolean_operations/images/boolean_image122.png,"Result of CUT operation obtained with Basic Operations",240} - -@figure{/user_guides/boolean_operations/images/boolean_image123.png,"Result of CUT operation obtained with Fuzzy Option",240} - -In this example Fuzzy option allows eliminating a very thin part of the result shape produced by Basic algorithm due to misalignment of rear faces of the box and the cylinder. - -#### Case 2 - -In this example two boxes are fused. One of them has dimensions 10*10*10, and the other is 10*10.000001*10.000001 and adjacent to the first one. There is no gap in this case as the surfaces of the neighboring faces coincide, but one box is slightly greater than the other. - -@figure{/user_guides/boolean_operations/images/boolean_image124.png,"",240} - -The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 1e-6: - -@figure{/user_guides/boolean_operations/images/boolean_image125.png,"Result of CUT operation obtained with Basic Operations",240} - -@figure{/user_guides/boolean_operations/images/boolean_image126.png,"Result of CUT operation obtained with Fuzzy Option",240} - -In this example Fuzzy option allows eliminating an extremely narrow face in the result produced by Basic operation. - -#### Case 3 - -In this example the small planar face (shown in orange) is subtracted from the big one (shown in yellow). There is a gap 1e-5 between the edges of these faces. - -@figure{/user_guides/boolean_operations/images/boolean_image127.png,"",240} - -The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 1e-5: - -@figure{/user_guides/boolean_operations/images/boolean_image128.png,"Result of CUT operation obtained with Basic Operations",240} - -@figure{/user_guides/boolean_operations/images/boolean_image129.png,"Result of CUT operation obtained with Fuzzy Option",240} - -In this example Fuzzy options eliminated a pin-like protrusion resulting from the gap between edges of the argument faces. - -#### Case 4 - -In this example the small edge is subtracted from the big one. The edges are overlapping not precisely, with max deviation between them equal to 5.28004e-5. We will use 6e-5 value for Fuzzy option. - -@figure{/user_guides/boolean_operations/images/boolean_image130.png,"",240} - -The following results are obtained using Basic Operations and the Fuzzy ones with the fuzzy value 6e-5: - -@figure{/user_guides/boolean_operations/images/boolean_image131.png,"Result of CUT operation obtained with Basic Operations",240} - -@figure{/user_guides/boolean_operations/images/boolean_image132.png,"Result of CUT operation obtained with Fuzzy Option",240} - -This example stresses not only the validity, but also the performance issue. The usage of Fuzzy option with the appropriate value allows processing the case much faster than with the pure Basic operation. The performance gain for the case is 45 (Processor: Intel(R) Core(TM) i5-3450 CPU @ 3.10 GHz). - -@subsection occt_algorithms_11a_2 Gluing Operation - -The Gluing operation is the option of the Basic Operations such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building operations. -It has been designed to speed up the computation of the interferences among arguments of the operations on special cases, in which the arguments may be overlapping but do not have real intersections between their sub-shapes. - -This option cannot be used on the shapes having real intersections, like intersection vertex between edges, or intersection vertex between edge and a face or intersection line between faces: - -@figure{/user_guides/boolean_operations/images/glue_options_image002.png,"Intersecting faces",240} - -There are two possibilities of overlapping shapes: -* The shapes can be partially coinciding - the faces do not have intersection curves, but overlapping. The faces of such arguments will be split during the operation. The following picture illustrates such shapes: - -@figure{/user_guides/boolean_operations/images/glue_options_image001.png,"Partially coinciding faces",240} - -* The shapes can be fully coinciding - there should be no partial overlapping of the faces, thus no intersection of type EDGE/FACE at all. In such cases the faces will not be split during the operation. - -@figure{/user_guides/boolean_operations/images/glue_options_image003.png,"Full coinciding faces of the boxes",240} - -Thus, there are two possible options - for full and partial coincidence of the shapes. - -Even though there are no real intersections on such cases without Gluing options the algorithm will still intersect the sub-shapes of the arguments with interfering bounding boxes. - -The performance improvement in gluing mode is achieved by excluding the most time consuming computations and in some case can go up to 90%: -* Exclude computation of FACE/FACE intersections for partial coincidence; -* Exclude computation of VERTEX/FACE, EDGE/FACE and FACE/FACE intersections for full coincidence. - -By setting the Gluing option for the operation user should guarantee that the arguments are really coinciding. The algorithm does not check this itself. Setting inappropriate option for the operation is likely to lead to incorrect result. - -@subsubsection occt_algorithms_11a_2_1 Usage - -The Gluing option is an enumeration implemented in BOPAlgo_GlueEnum.hxx: -* BOPAlgo_GlueOff - default value for the algorithms, Gluing is switched off; -* BOPAlgo_GlueShift - Glue option for shapes with partial coincidence; -* BOPAlgo_GlueFull - Glue option for shapes with full coincidence. - -#### API level -For setting the Gluing options for the algorithm it is just necessary to call the SetGlue(const BOPAlgo_Glue) method with appropriate value: -~~~~ -BOPAlgo_Builder aGF; -// -.... -// setting the gluing option to speed up intersection of the arguments -aGF.SetGlue(BOPAlgo_GlueShift) -// -.... -~~~~ - -#### TCL level -For setting the Gluing options in DRAW it is necessary to call the bglue command with appropriate value: -* 0 - default value, Gluing is off; -* 1 - for partial coincidence; -* 2 - for full coincidence - -~~~~ -bglue 1 -~~~~ - -@subsubsection occt_algorithms_11a_2_2 Examples -#### Case1 - Fusing the 64 bspline boxes into one solid - -@figure{/user_guides/boolean_operations/images/glue_options_image004.png,"BSpline Boxes with partial coincidence",240} - -Performance improvement from using the GlueShift option in this case is about 70 percent. - -#### Case2 - Sewing faces of the shape after reading from IGES - -@figure{/user_guides/boolean_operations/images/glue_options_image005.png,"Faces with coinciding but not shared edges",240} - -Performance improvement in this case is also about 70 percent. - -@subsection occt_algorithms_11a_3 Safe processing mode - -The safe processing mode is the advanced option in Boolean Operation component. This mode can be applied to all Basic operations such as General Fuse, Splitting, Boolean, Section, Maker Volume, Cells building. -This option allows keeping the input arguments untouched. In other words, switching this option on prevents the input arguments from any modification such as tolerance increase, addition of the P-Curves on edges, etc. - -The option can be very useful for implementation of the Undo/Redo mechanism in the applications and allows performing the operation many times without changing the inputs. - -By default the safe processing option is switched off for the algorithms. Enabling this option might slightly decrease the performance of the operation, because instead of the modification of some entity it will be necessary to create the copy of this entity and modify it. However, this degradation should be very small because the copying is performed only in case of necessity. - -The option is also available in the Intersection algorithm - *BOPAlgo_PaveFiller*. To perform several different operations on the same arguments, the safe processing mode can be enabled in PaveFiller, prepared only once and then used in operations. It is enough to set this option to PaveFiller only and all algorithms taking this PaveFiller will also work in the safe mode. - -@subsubsection occt_algorithms_11a_3_1 Usage - -#### API level - -To enable/disable the safe processing mode for the algorithm, it is necessary to call *SetNonDestructive()* method with the appropriate value: -~~~~ -BOPAlgo_Builder aGF; -// -.... -// enabling the safe processing mode to prevent modification of the input shapes -aGF.SetNonDestructive(Standard_True); -// -.... -~~~~ - -#### TCL level -To enable the safe processing mode for the operation in DRAW, it is necessary to call the bnondestructive command with the appropriate value: -* 0 - default value, the safe mode is switched off; -* 1 - the safe mode will be switched on. - -~~~~ -bnondestructive 1 -~~~~ - -@subsection occt_algorithms_11a_4 How to disable check of input solids for inverted status - -By default, all input solids are checked for inverted status, i.e. the solids are classified to understand if they are holes in the space (negative volumes) or normal solids (positive volumes). The possibility to disable the check of the input solids for inverted status is the advanced option in Boolean Operation component. This option can be applied to all Basic operations, such as General Fuse, Splitting, Boolean, Section, Maker Volume and Cells building. -This option allows avoiding time-consuming classification of the input solids and processing them in the same way as positive volumes, saving up to 10 percent of time on the cases with a big number of input solids. - -The classification should be disabled only if the user is sure that there are no negative volumes among the input solids, otherwise the result may be invalid. - -@subsubsection occt_algorithms_11a_4_1 Usage - -#### API level - -To enable/disable the classification of the input solids it is necessary to call *SetCheckInverted()* method with the appropriate value: -~~~~ -BOPAlgo_Builder aGF; -// -.... -// disabling the classification of the input solid -aGF.SetCheckInverted(Standard_False); -// -.... -~~~~ - -#### TCL level -To enable/disable the classification of the solids in DRAW, it is necessary to call *bcheckinverted* command with the appropriate value: -* 0 - disabling the classification; -* 1 - default value, enabling the classification. - -~~~~ -bcheckinverted 0 -~~~~ - -@subsection occt_algorithms_11a_5_obb Usage of Oriented Bounding Boxes - -Since Oriented Bounding Boxes are usually much tighter than Axes Aligned Bounding Boxes (for more information on OBB see the @ref occt_modat_6 "Bounding boxes" chapter of Modeling data User guide) its usage can significantly speed-up the intersection stage of the operation by reducing the number of interfering objects. - -@subsubsection occt_algorithms_11a_5_obb_1 Usage - -#### API level -To enable/disable the usage of OBB in the operation it is necessary to call the *SetUseOBB()* method with the approriate value: -~~~~ -BOPAlgo_Builder aGF; -// -.... -// Enabling the usage of OBB in the operation -aGF.SetUseOBB(Standard_True); -// -.... -~~~~ - -#### TCL level -To enable/disable the usage of OBB in the operation in DRAW it is necessary to call the *buseobb* command with the approriate value: -* 0 - disabling the usage of OBB; -* 1 - enabling the usage of OBB. -~~~~ -buseobb 1 -~~~~ - -@section occt_algorithms_ers Errors and warnings reporting system - -The chapter describes the Error/Warning reporting system of the algorithms in the Boolean Component. - -The errors and warnings are collected in the instance of the class *Message_Report* maintained as a field by common base class of Boolean operation algorithms *BOPAlgo_Options*. - -The error is reported in for problems which cannot be treated and cause the algorithm to fail. -In this case the result of the operation will be incorrect or incomplete or there will be no result at all. - -The warnings are reported for the problems which can be potentially handled or ignored and thus do not cause the algorithms to stop their work (but probably affect the result). - -All possible errors and warnings that can be set by the algorithm are listed in its header file. -The complete list of errors and warnings that can be generated by Boolean operations is defined in *BOPAlgo_Alerts.hxx*. - -Use method *HasErrors()* to check for presence of error; method *HasError()* can be used to check for particular error. -Methods *DumpErrors()* outputs textual description of collected errors into the stream. -Similar methods *HasWarnings()*, *HasWarning()*, and *DumpWarnings()* are provided for warnings. - -Note that messages corresponding to errors and warnings are defined in resource file *BOPAlgo.msg*. -These messages can be localized; for that put translated version to separate file and load it in the application by call to *Message_MsgFile::Load()* . - -Here is the example of how to use this system: -~~~~~ -BOPAlgo_PaveFiller aPF; -aPF.SetArguments(...); -aPF.Perform(); -if (aPF.HasErrors()) { - aPF.DumpErrors(std::cerr); - // - if (aPF.HasError(STANDARD_TYPE(BOPAlgo_AlertNullInputShapes)) { - // some actions - } - if (aPF.HasWarning(STANDARD_TYPE(BOPAlgo_AlertTooSmallEdge)) { - // some actions - } - ... -} -~~~~~ - -DRAW commands executing Boolean operations output errors and warnings generated by these operations in textual form. -Additional option allows saving shapes for which warnings have been generated, as DRAW variables. -To activate this option, run command *bdrawwarnshapes* with argument 1 (or with 0 to deactivate): -~~~~ -bdrawwarnshapes 1 -~~~~ - -After setting this option and running an algorithm the result will look as follows: -~~~~ -Warning: The interfering vertices of the same argument: ws_1_1 ws_1_2 -Warning: The positioning of the shapes leads to creation of small edges without valid range: ws_2_1 -~~~~ - - -@section occt_algorithms_history History Information - -All operations in Boolean Component support @ref occt_modalg_hist "History information". This chapter describes how the History is filled for these operations. - -Additionally to Vertices, Edges and Faces the history is also available for the Solids. - -The rules for filling the History information about Deleted and Modified shapes are the same as for the API algorithms. - -Only the rules for Generated shapes require clarification. -In terms of the algorithms in Boolean Component the shape from the arguments can have Generated shapes only if these new shapes -have been obtained as a result of pure intersection (not overlapping) of this shape with any other shapes from arguments. Thus, the Generated shapes are always: -* VERTICES created from the intersection points and may be Generated from edges and faces only; -* EDGES created from the intersection edges and may be Generated from faces only. - -So, only EDGES and FACES could have information about Generated shapes. For all other types of shapes the list of Generated shapes will be empty. - -@subsection occt_algorithms_history_ex Examples - -Here are some examples illustrating the History information. - -@subsubsection occt_algorithms_history_ex_del Deleted shapes - -The result of CUT operation of two overlapping planar faces (see the example below) does not contain any parts from the tool face. Thus, the tool face is considered as Deleted. -If the faces are not fully coinciding, the result must contain some parts of the object face. In this case object face will be considered as not deleted. -But if the faces are fully coinciding, the result must be empty, and both faces will be considered as Deleted. - -Example of the overlapping faces: - -~~~~ -plane p 0 0 0 0 0 1 -mkface f1 p -10 10 -10 10 -mkface f2 p 0 20 -10 10 - -bclearobjects -bcleartools -baddobjects f1 -baddtools f2 -bfillds -bbop r 2 - -savehistory cut_hist -isdeleted cut_hist f1 -# Not deleted - -isdeleted cut_hist f2 -# Deleted -~~~~ - -@subsubsection occt_algorithms_history_ex_modif Modified shapes - -In the FUSE operation of two edges intersecting in one point (see the example below), both edges will be split by the intersection point. All these splits will be contained in the result. -Thus, each of the input edges will be Modified into its two splits. -But in the CUT operation on the same edges, the tool edge will be Deleted from the result and, thus, will not have any Modified shapes. - -Example of the intersecting edges: -~~~~ -line l1 0 0 0 1 0 0 -mkedge e1 l1 -10 10 - -line l2 0 0 0 0 1 0 -mkedge e2 l2 -10 10 - -bclearobjects -bcleartools -baddobjects e1 -baddtools e2 -bfillds - -# fuse operation -bbop r 1 - -savehistory fuse_hist - -modified m1 fuse_hist e1 -nbshapes m1 -# EDGES: 2 - -modified m2 fuse_hist e2 -nbshapes m2 -# EDGES: 2 - -# cut operation -bbop r 2 - -savehistory cut_hist - -modified m1 cut_hist e1 -nbshapes m1 -# EDGES: 2 - -modified m2 cut_hist e2 -# The shape has not been modified -~~~~ - - -@subsubsection occt_algorithms_history_gen Generated shapes - -Two intersecting edges will both have the intersection vertices Generated from them. - -As for the operation with intersecting faces, consider the following example: - -~~~~ -plane p1 0 0 0 0 0 1 -mkface f1 p1 -10 10 -10 10 - -plane p2 0 0 0 1 0 0 -mkface f2 p2 -10 10 -10 10 - -bclearobjects -bcleartools -baddobjects f1 -baddtools f2 -bfillds - -# fuse operation -bbop r 1 - -savehistory fuse_hist - -generated gf1 fuse_hist f1 -nbshapes gf1 -# EDGES: 1 - -generated gf2 fuse_hist f2 -nbshapes gf2 -# EDGES: 1 - - -# common operation - result is empty -bbop r 0 - -savehistory com_hist - -generated gf1 com_hist f1 -# No shapes were generated from the shape - -generated gf2 com_hist f2 -# No shapes were generated from the shape - -~~~~ - -@section occt_algorithms_simplification BOP result simplification - -The API algorithms implementing Boolean Operations provide possibility to simplify the result shape by unification of the connected tangential edges and faces. -This simplification is performed by the method *SimplifyResult* which is implemented in the class *BRepAlgoAPI_BuilderAlgo* (General Fuse operation). -It makes it available for users of the classes *BRepAlgoAPI_BooleanOperation* (all Boolean Operations) and *BRepAlgoAPI_Splitter* (split operation). - -The simplification is performed by the means of *ShapeUpgrade_UnifySameDom* algorithm. The result of operation is overwritten with the simplified result. - -The simplification is performed without creation of the Internal shapes, i.e. shapes connections will never be broken. It is performed on the whole result shape. -Thus, if the input shapes contained connected tangent edges or faces unmodified during the operation they will also be unified. - -History of the simplification is merged into the main history of operation, thus it will be accounted when asking for Modified, Generated and Deleted shapes. - -Some options of the main operation are passed into the Unifier: -- Fuzzy tolerance of the operation is given to the Unifier as the linear tolerance. -- Non destructive mode here controls the safe input mode in Unifier. - -For controlling this possibility in DRAW the command **bsimplify** has been implemented. See the @ref occt_draw_bop_options "Boolean Operations options" chapter in draw user guide. - - -@subsection occt_algorithms_simplification_examples Examples - -Here is the simple example of simplification of the result of Fuse operation of two boxes: - -~~~~ -bsimplify -f 1 - -box b1 10 10 15 -box b2 3 7 0 10 10 15 -bclearobjects -bcleartools -baddobjects b1 -baddtools b2 -bfillds -bapibop r 1 -~~~~ - - - - - - -
@figure{/user_guides/boolean_operations/images/bop_simple_001.png, "Not simplified result", 420}@figure{/user_guides/boolean_operations/images/bop_simple_002.png, "Simplified result", 420}
- - -@section occt_algorithms_11b Usage - -The chapter contains some examples of the OCCT Boolean Component usage. The usage is possible on two levels: C++ and Tcl. - -@subsection occt_algorithms_11b_1 Package BRepAlgoAPI - -The package *BRepAlgoAPI* provides the Application Programming Interface of the Boolean Component. - -The package consists of the following classes: -* *BRepAlgoAPI_Algo* -- the root class that provides the interface for algorithms. -* *BRepAlgoAPI_BuilderAlgo* -- the class API level of General Fuse algorithm. -* *BRepAlgoAPI_Splitter* -- the class API level of the Splitter algorithm. -* *BRepAlgoAPI_BooleanOperation* -- the root class for the classes *BRepAlgoAPI_Fuse*. *BRepAlgoAPI_Common*, *BRepAlgoAPI_Cut* and *BRepAlgoAPI_Section*. -* *BRepAlgoAPI_Fuse* -- the class provides Boolean fusion operation. -* *BRepAlgoAPI_Common* -- the class provides Boolean common operation. -* *BRepAlgoAPI_Cut* -- the class provides Boolean cut operation. -* *BRepAlgoAPI_Section* -- the class provides Boolean section operation. - -@figure{/user_guides/boolean_operations/images/operations_image065.png,"Diagram of BRepAlgoAPI package",420} - -The detailed description of the classes can be found in the corresponding .hxx files. The examples are below in this chapter. - -@subsection occt_algorithms_11b_2 Package BOPTest -The package *BOPTest* provides the usage of the Boolean Component on Tcl level. The method *BOPTest::APICommands* contains corresponding Tcl commands: - -* *bapibuild* -- for General Fuse Operator; -* *bapisplit* -- for Splitter Operator; -* *bapibop* -- for Boolean Operator and Section Operator. - -The examples of how to use the commands are below in this chapter. - -@subsubsection occt_algorithms_11b_2_1 Case 1. General Fuse operation - -The following example illustrates how to use General Fuse operator: - -#### C++ Level - -~~~~ -#include -#include -#include - {… - BRepAlgoAPI_BuilderAlgo aBuilder; - // - // prepare the arguments - TopTools_ListOfShape& aLS=…; - // - // set the arguments - aBuilder.SetArguments(aLS); - - // Set options for the algorithm - // setting options on this level is similar to setting options to GF algorithm on low level (see "GF Usage" chapter) - ... - - // run the algorithm - aBuilder.Build(); - if (aBuilder.HasErrors()) { - // an error treatment - return; - } - // - // result of the operation aR - const TopoDS_Shape& aR=aBuilder.Shape(); -… -} -~~~~ - -#### Tcl Level - -~~~~ -# prepare the arguments -box b1 10 10 10 -box b2 3 4 5 10 10 10 -box b3 5 6 7 10 10 10 -# -# clear inner contents -bclearobjects; bcleartools; -# -# set the arguments -baddobjects b1 b2 b3 - -# set options for the algorithm (see "GF Usage" chapter) -... - -# run the algorithm -# r is the result of the operation -bapibuild r -~~~~ - -@subsubsection occt_algorithms_11b_2_2 Case 2. Splitting operation - -The following example illustrates how to use the Splitter operator: - -#### C++ Level - -~~~~ -#include -#include -#include -// -BRepAlgoAPI_BuilderAlgo aSplitter; -// -// prepare the arguments -// objects -TopTools_ListOfShape& aLSObjects = … ; -// tools -TopTools_ListOfShape& aLSTools = … ; -// -// set the arguments -aSplitter.SetArguments(aLSObjects); -aSplitter.SetTools(aLSTools); -// -// Set options for the algorithm -// setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) -... -// -// run the algorithm -aSplitter.Build(); -// check error status -if (aSplitter.HasErrors()) { - return; -} -// -// result of the operation aResult -const TopoDS_Shape& aResult = aSplitter.Shape(); -~~~~ - -#### Tcl Level - -~~~~ -# prepare the arguments -# objects -box b1 10 10 10 -box b2 7 0 0 10 10 10 - -# tools -plane p 10 5 5 0 1 0 -mkface f p -20 20 -20 20 -# -# clear inner contents -bclearobjects; bcleartools; -# -# set the objects -baddobjects b1 b2 -# set the tools -baddtools f -# -# set options for the algorithm (see "GF Usage" chapter) -... -# -# run the algorithm -# r is the result of the operation -bapisplit r -~~~~ - -@subsubsection occt_algorithms_11b_2_3 Case 3. Common operation - -The following example illustrates how to use Common operation: - -#### C++ Level - -~~~~ -#include -#include -#include < BRepAlgoAPI_Common.hxx> - {… - Standard_Boolean bRunParallel; - Standard_Real aFuzzyValue; - BRepAlgoAPI_Common aBuilder; - - // perpare the arguments - TopTools_ListOfShape& aLS=…; - TopTools_ListOfShape& aLT=…; - // - bRunParallel=Standard_True; - aFuzzyValue=2.1e-5; - // - // set the arguments - aBuilder.SetArguments(aLS); - aBuilder.SetTools(aLT); - // - // Set options for the algorithm - // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) - ... - // - // run the algorithm - aBuilder.Build(); - if (aBuilder.HasErrors()) { - // an error treatment - return; - } - // - // result of the operation aR - const TopoDS_Shape& aR=aBuilder.Shape(); -… -} -~~~~ - -#### Tcl Level - -~~~~ -# prepare the arguments -box b1 10 10 10 -box b2 7 0 4 10 10 10 -box b3 14 0 0 10 10 10 -# -# clear inner contents -bclearobjects; bcleartools; -# -# set the arguments -baddobjects b1 b3 -baddtools b2 -# -# set options for the algorithm (see "GF Usage" chapter) -... -# -# run the algorithm -# r is the result of the operation -# 0 means Common operation -bapibop r 0 -~~~~ - -@subsubsection occt_algorithms_11b_2_4 Case 4. Fuse operation - -The following example illustrates how to use Fuse operation: - -#### C++ Level - -~~~~ -#include -#include -#include < BRepAlgoAPI_Fuse.hxx> - {… - Standard_Boolean bRunParallel; - Standard_Real aFuzzyValue; - BRepAlgoAPI_Fuse aBuilder; - - // perpare the arguments - TopTools_ListOfShape& aLS=…; - TopTools_ListOfShape& aLT=…; - // - bRunParallel=Standard_True; - aFuzzyValue=2.1e-5; - // - // set the arguments - aBuilder.SetArguments(aLS); - aBuilder.SetTools(aLT); - // - // Set options for the algorithm - // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) - ... - // - // run the algorithm - aBuilder.Build(); - if (aBuilder.HasErrors()) { - // an error treatment - return; - } - // - // result of the operation aR - const TopoDS_Shape& aR=aBuilder.Shape(); -… -} -~~~~ - -#### Tcl Level - -~~~~ -# prepare the arguments -box b1 10 10 10 -box b2 7 0 4 10 10 10 -box b3 14 0 0 10 10 10 -# -# clear inner contents -bclearobjects; bcleartools; -# -# set the arguments -baddobjects b1 b3 -baddtools b2 -# -# set options for the algorithm (see "GF Usage" chapter) -... -# -# run the algorithm -# r is the result of the operation -# 1 means Fuse operation -bapibop r 1 -~~~~ - -@subsubsection occt_algorithms_11b_2_5 Case 5. Cut operation - -The following example illustrates how to use Cut operation: - -#### C++ Level - -~~~~ -#include -#include -#include < BRepAlgoAPI_Cut.hxx> - {… - Standard_Boolean bRunParallel; - Standard_Real aFuzzyValue; - BRepAlgoAPI_Cut aBuilder; - - // perpare the arguments - TopTools_ListOfShape& aLS=…; - TopTools_ListOfShape& aLT=…; - // - bRunParallel=Standard_True; - aFuzzyValue=2.1e-5; - // - // set the arguments - aBuilder.SetArguments(aLS); - aBuilder.SetTools(aLT); - // - // Set options for the algorithm - // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) - ... - // - // run the algorithm - aBuilder.Build(); - if (aBuilder.HasErrors()) { - // an error treatment - return; - } - // - // result of the operation aR - const TopoDS_Shape& aR=aBuilder.Shape(); -… -} -~~~~ - -#### Tcl Level - -~~~~ -# prepare the arguments -box b1 10 10 10 -box b2 7 0 4 10 10 10 -box b3 14 0 0 10 10 10 -# -# clear inner contents -bclearobjects; bcleartools; -# -# set the arguments -baddobjects b1 b3 -baddtools b2 -# -# set options for the algorithm (see "GF Usage" chapter) -... -# -# run the algorithm -# r is the result of the operation -# 2 means Cut operation -bapibop r 2 -~~~~ - - -@subsubsection occt_algorithms_11b_2_6 Case 6. Section operation - -The following example illustrates how to use Section operation: - -#### C++ Level - -~~~~ -#include -#include -#include < BRepAlgoAPI_Section.hxx> - {… - Standard_Boolean bRunParallel; - Standard_Real aFuzzyValue; - BRepAlgoAPI_Section aBuilder; - - // perpare the arguments - TopTools_ListOfShape& aLS=…; - TopTools_ListOfShape& aLT=…; - // - bRunParallel=Standard_True; - aFuzzyValue=2.1e-5; - // - // set the arguments - aBuilder.SetArguments(aLS); - aBuilder.SetTools(aLT); - // - // Set options for the algorithm - // setting options for this algorithm is similar to setting options for GF algorithm (see "GF Usage" chapter) - ... - // - // run the algorithm - aBuilder.Build(); - if (aBuilder.HasErrors()) { - // an error treatment - return; - } - // - // result of the operation aR - const TopoDS_Shape& aR=aBuilder.Shape(); -… -} -~~~~ - -#### Tcl Level - -~~~~ -# prepare the arguments -box b1 10 10 10 -box b2 3 4 5 10 10 10 -box b3 5 6 7 10 10 10 -# -# clear inner contents -bclearobjects; bcleartools; -# -# set the arguments -baddobjects b1 b3 -baddtools b2 -# -# set options for the algorithm (see "GF Usage" chapter) -... -# -# run the algorithm -# r is the result of the operation -# 4 means Section operation -bapibop r 4 -~~~~ - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image001.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image001.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image001.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image001.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,173 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - V - 1 - - - - - V - 2 - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image002.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image002.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image002.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image002.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - V - 1 - - - - - V - 2 - - - V - - - - - - - - - - Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image007.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image007.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image008.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image008.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image009.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image009.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image010.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image010.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image010.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image010.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,210 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - E - 2 - - - E - 1 - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image011.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image011.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image011.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image011.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,322 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - Vn - 1 - - - E - 21 - - - E - 11 - - - E - 12 - - - E - 22 - - - - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image012.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image012.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image012.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image012.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - Vn - 1 - - - E - 11 - - - E - 12 - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image013.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image013.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image013.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image013.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - Vn - 1 - - - E - 21 - - - E - 22 - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image014.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image014.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image014.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image014.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,205 +0,0 @@ - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - E - 2 - - - E - 1 - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image015.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image015.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image015.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image015.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,250 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - E - 12 - - - E - 22 - - - E - 11 - - - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image016.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image016.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image016.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image016.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - E - 12 - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image017.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image017.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image017.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image017.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - E - 11 - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image018.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image018.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image018.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image018.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - E - 22 - - - - - - - - - Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image019.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image019.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image020.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image020.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image021.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image021.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image022.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image022.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image023.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image023.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image024.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image024.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image025.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image025.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image026.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image026.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image027.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image027.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image028.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image028.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image029.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image029.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image030.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image030.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image031.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image031.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image032.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image032.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image033.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image033.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image034.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image034.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image035.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image035.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image036.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image036.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image037.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image037.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image038.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image038.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image039.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image039.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image040.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image040.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image041.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image041.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image042.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image042.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image043.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image043.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image044.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image044.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image045.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image045.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image046.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image046.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image047.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image047.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image048.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image048.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image049.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image049.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image050.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image050.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image051.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image051.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image052.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image052.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image053.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image053.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image054.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image054.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image055.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image055.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image056.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image056.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image057.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image057.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image058.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image058.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image059.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image059.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image060.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image060.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image061.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image061.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image062.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image062.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image063.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image063.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image064.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image064.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image065.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image065.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image066.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image066.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image067.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image067.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image068.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image068.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image069.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image069.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image070.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image070.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image071.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image071.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image072.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image072.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image073.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image073.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image080.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image080.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image081.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image081.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image082.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image082.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image083.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image083.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image084.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image084.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image085.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image085.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image086.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image086.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image087.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image087.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image088.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image088.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image089.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image089.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image090.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image090.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image091.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image091.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image092.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image092.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image093.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image093.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image094.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image094.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image095.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image095.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image096.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image096.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image097.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image097.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image098.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image098.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image099.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image099.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image100.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image100.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image101.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image101.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image102.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image102.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image103.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image103.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image104.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image104.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image105.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image105.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image106.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image106.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image107.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image107.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image108.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image108.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image109.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image109.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image110.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image110.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image111.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image111.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image112.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image112.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image113.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image113.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image114.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image114.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image115.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image115.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image116.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image116.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image117.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image117.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image118.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image118.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image119.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image119.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image120.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image120.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image121.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image121.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image122.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image122.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image123.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image123.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image124.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image124.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image125.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image125.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image126.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image126.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image127.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image127.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image128.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image128.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image129.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image129.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image130.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image130.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image131.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image131.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image132.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image132.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image133.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image133.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image134.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image134.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image135.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image135.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image136.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image136.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image137.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image137.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image138.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image138.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image139.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image139.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image140.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image140.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image141.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image141.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image142.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image142.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image143.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/boolean_image143.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/bop_simple_001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/bop_simple_001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/bop_simple_002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/bop_simple_002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/bsplit_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_006_1.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_006_1.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_006_2.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_006_2.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_007.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_007.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_008.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/cells_algorithm_008.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/glue_options_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/glue_options_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/glue_options_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/glue_options_image002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/glue_options_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/glue_options_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/glue_options_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/glue_options_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/glue_options_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/glue_options_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/mkvolume_image001.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/mkvolume_image001.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/mkvolume_image002.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/mkvolume_image002.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/mkvolume_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/mkvolume_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/mkvolume_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/mkvolume_image004.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image001.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image001.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image001.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image001.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,274 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - S - 1 - - S - 2 - - - - - - - S - p1 - - S - p2 - - - - - S - p12 - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image002.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image002.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image002.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image002.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,591 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tol(Vi) - - Tol - ( - Vj) - - Vj - - Vi - - T - - s - - - - D - - - - - - - - - Tol(Vn) - - Vn - - Pn - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image003.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image003.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image003.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image003.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,597 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - E - j - - V - i - - - - - - - - - - - - - - - - - - - - Tol(E - j - ) - - Tol(V - i - ) - - - V - i - - - - - - - - - - - - - - - C - j - - Tol(V - i - ) - - - - - - - - t - i - - - - PP - i - - P - i - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image004.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image004.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image004.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image004.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,750 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - Tol(Vi) - - Fj - - Vi - - - - - - Pi - - PPi - - - - - - - 2 - · - Tol(Fj) - - - - Tol(Vi) - - Fj - - Vi - - - - - - - - - Pi - - PPi - - - - - - - u - - v - - - - v - i - - u - i - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image005.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image005.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image005.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image005.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,827 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - E - j - - - - - - - - - - - - - - Tol(E - j - ) - - - - - - - - - - - - - - - Tol(E - i - ) - - E - i2 - - - E - j - - - - - - - - - - - - - - - - E - i - - - - - - t - j2 - - t - j1 - - C - j - - - - - - - j2 - i - i1 - V - V - V - - i - - - - V - i2 - j2 - C - - t - - t - j1 - V - j1 - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image006.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image006.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image006.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image006.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,817 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - E - j - - - - - - - - - - - - - - Tol(E - j - ) - - - - - - - - - - - - E - i - - - - Tol(E - i - ) - - - - - - - - E - j - - - - - - - - - - - - - - - - - - - E - i - - - - - t - j - - - - C - j - - - V - n - - - - - - Tol(V - n - ) - - - - Ci - - - - - - - t - i - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image007.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image007.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image007.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image007.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,712 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - Tol(Ei) - - - - - - - - - Fj - - - - - - - - - - 2 - · - Tol(Fj) - - - - - - - - - - - - - - Ei - - - - - - - - - - - Fj - - - - - - - - - - - - Ei - - - Ci - - - - - - - - t - i2 - - t - i1 - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image008.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image008.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image008.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image008.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,690 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - Tol(Ei) - - - - - Fj - - - - - - 2 - · - Tol(Fj) - - Ei - - - - - - - - - - - - - - - - - - - - - Fj - - - - Ei - - - - - - - - - - - - - - - - - Tol(Vn) - - Vn - - - - Ci - - - - t - i - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image009.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image009.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image009.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image009.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,430 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - Tol(Cijk) - - - - - - Fi - - - - - - - 2·Tol(Fj) - - - - - - - - - - - - - 2·Tol(Fi) - - Fj - - Cijk - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image010.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image010.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image010.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image010.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,471 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - Tol(Vijm) - - - - - Fi - - - - - - - 2·Tol(Fj) - - 2·Tol(Fi) - - Fj - - - - - - - - - - - - - - - - - - - Vijm - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image011.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image011.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image011.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image011.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,483 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - PVb - - - - - - - - E - - C - - PVe - - PVi - - - t - i - - t - e - - - t - b - =0 - - - - Ve - - Vb - - Vi - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image012.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image012.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image012.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image012.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,762 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - PVb - - - - - - - - E - - C - - PVe - - PVi - - - t - b - =0 - - - Ve - - Vb - - Vi - - - - - - - - - - - - - - - PVh - - PVj - - t - h - - t - i - - t - j - - t - e - - Vh - - Vj - - - PBi - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image013.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image013.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image013.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image013.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,704 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - V - 1 - - V - 2 - - C(t) - - Tol(V - 2 - ) - - Tol(V - 1 - ) - - Tol(C) - - t - 1C - - t - 2C - - t - 2S - - t - 1S - - - - - - - - P - 1 - - P - 2 - - P - 2C - - P - 1C - - - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image014.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image014.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image014.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image014.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,428 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - E - 1 - - - - - - - - - - E - 2 - - V - 1 - 1 - - V - 1 - 2 - - V - 21 - - V - 22 - - - - - - CB - - - - PB - 2 - - PB - 1 - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image015.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image015.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image015.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image015.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,403 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - V - 1 - 1 - - PB - - F - 2 - - - - - - - - F - 3 - - E - 1 - - - - - CB - - V - i - - V - j - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image016.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image016.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image016.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image016.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,918 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - F - 1 - - - - - - - - - - - - - - - - - - F - 2 - - F - 3 - - E - x - - V - in1 - - PB - on11 - - PB - on12 - - PB - on2 - - PB - on31 - - PB - on32 - - PB - on4 - - PB - in1 - - PB - sc1 - - E - 1 - - E - 2 - - E - 3 - - E - 4 - - - - - - - V - 1 - - V - 2 - - V - 3 - - V - 4 - - V - 5 - - V - 6 - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image017.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image017.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image017.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image017.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,681 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - BOPDS_Interf - - - - BOPDS_InterfVV - - - - - - BOPDS - _InterfVE - - - - BOPDS_InterfVF - - - - BOPDS_InterfEE - - - - BOPDS_InterfEF - - - - BOPDS_InterfFF - - - - - - - - - - - - - - - - - - - - - - - - BOPDS_InterfVZ - BOPDS_InterfEZ - BOPDS_InterfFZ - BOPDS_InterfZZ - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image018.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image018.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image018.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image018.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,827 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - V - 1 - 1 - - - - - V - 12 - - - - - V - 13 - - - - - V - 1 - 4 - - - - - V - 1 - 5 - - - - - V - 21 - - - - - V - 22 - - - - - V - 23 - - - - V - N - 1 - - - - V - N - 2 - - - - - - - - - - - Chain 1 - Chain 2 - - - Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image019.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image019.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image020.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image020.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image021.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image021.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image021.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image021.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,596 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - E - 1 - - - E - 2 - - - E - 3 - - - - - - - - - - - - - - - - - - Vn - 1 - - - E - 31 - - - E - 11 - - - E - 21 - - - E - 12 - - - E - 22 - - - E - 32 - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image022.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image022.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image022.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image022.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,1010 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - E - 1 - - W - 1 - - W - 2 - - Ew - 21 - - Ew - 22 - - Ew - 23 - - Ew - 11 - - Ew - 12 - - Ew - 13 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - E - 11 - - W - n1 - - W - 2 - - Ew - 11 - - Ew - 13 - - Ew - 21 - - Ew - 23 - - E - 12 - - En - 1 - - En - 2 - - En - 3 - - En - 4 - - Vn - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image023.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image023.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image023.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image023.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,516 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - E - 1 - - F - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - F - 21 - - E - 11 - - E - 12 - - E - 12 - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image024.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image024.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image024.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image024.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,584 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - E - 1 - - F - 2 - - - - - - - - - - - - - - - - - - - - - - - F - 21 - - - - - - - - - - - - - - F - 22 - - E - 12 - - E - 12 - - E - 11 - - E - 13 - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image025.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image025.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image025.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image025.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,806 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - F - 21 - - - F - 22 - - - E - 1 - - - - - - - - - - - - - - - - - E - 11 - - E - 14 - - - - - - - - - - - - - - - - - - - F - 212 - - - F - 222 - - - - - - - - - F - 211 - - F - 221 - - - - E - 13 - - - - - E - 12 - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image026.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image026.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image026.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image026.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,1061 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - Sh - 2 - - - - - - - - - - - - - - - - - - - - - F - 21 - - - F - 22 - - W - 1 - - - - - - - - - - - - - - - - - - - - - - F - 212 - - - F - 222 - - - - F - 211 - - F - 221 - - - - - - - - F - 223 - - F - 213 - - - - - - W - 11 - - Sh - 2 - - - - - - - - - - - - E - 11 - - E - 12 - - E - 13 - - E - 14 - - Sh - 21 - - E - 1 - - E - 2 - - E - 3 - - E - 4 - - - - - - - - - - - - - - Sh2 - - - Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image027.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image027.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image028.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image028.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image029.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image029.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image030.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image030.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image031.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image031.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image032.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image032.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image033.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image033.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image033.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image033.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,563 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - F - 2 - - Chain 1 - - Chain 2 - - - - - F - 1 - - F - 3 - - - - F - 4 - - F - 5 - - F - 11 - - F - 21 - - F - 22 - - F - 31 - - - - F - 6 - - F - 51 - - F - 41 - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image036.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image036.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image036.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image036.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - E - 1 - - - E - 2 - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image037.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image037.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image037.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image037.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - E - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image038.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image038.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image038.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image038.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,2759 +0,0 @@ - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - F - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image039a.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image039a.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image039b.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image039b.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image040.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image040.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image041.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image041.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image042.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image042.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image043.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image043.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image044.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image044.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image045.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image045.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image046.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image046.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image047.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image047.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image048.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image048.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image049.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image049.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image050.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image050.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image050.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image050.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,931 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - V - 3 - - Tol(V - 1 - ) - - V - 2 - - E - 12 - - E - 23 - - E - 41 - - F - 1 - - C - 12 - - E - 34 - - V - 4 - - F - 2 - - EC - 12 - - V - 1 - - Tol(V - 2 - ) - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image051.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image051.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image051.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image051.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,331 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - E - 1 - - - E - 2 - - - - Dmax - - - - V - 1 - - V - 2 - - - - C - 1 - - C - 2 - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image052.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image052.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image052.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image052.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,464 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - E - 1 - - - E - 2 - - - - - - 2*Tol(E - 1 - ) - - 2*Tol(E - 2 - ) - - - - - - - - - - - - - - V - X1 - - V - X2 - - V - X3 - - V - 1 - - V - 2 - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image053.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image053.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image053.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image053.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,2764 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - F - 1 - - - F - 2 - - - - Dmax - - - - - E - x1 - - E - x2 - - E - x3 - - - E - 1 - - E - 2 - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image054.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image054.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image054.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image054.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,384 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - V - 21 - - - - - - - V - 22 - - E - 2 - - - - - - V - 1 - - - Tol(V - 1 - ) - - Tol(V - 21 - ) - - Tol(V - 22 - ) - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image055.svg opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image055.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image055.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image055.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,347 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - Tol(V - 2 - ) - - E - 11 - - E - 12 - - - - Tol( - E - 11 - ) - - Tol( - E - 12 - ) - - - - Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image060.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image060.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image061.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image061.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image062.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image062.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image063.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image063.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image064.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image064.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image065.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/boolean_operations/images/operations_image065.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/brep_wp/brep_wp.md opencascade-7.5.1+dfsg1/dox/user_guides/brep_wp/brep_wp.md --- opencascade-7.4.1+dfsg1/dox/user_guides/brep_wp/brep_wp.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/brep_wp/brep_wp.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,2266 +0,0 @@ - BRep Format {#occt_user_guides__brep_wp} -======================== - -@tableofcontents - -@section occt_brep_format_1 Introduction - - BREP format is used to store 3D models and allows to store a model which consists - of vertices, edges, wires, faces, shells, solids, compsolids, compounds, edge triangulations, - face triangulations, polylines on triangulations, space location and orientation. - Any set of such models may be stored as a single model which is a compound of the models. - - The format is described in an order which is convenient for understanding - rather than in the order the format parts follow each other. - BNF-like definitions are used in this document. - Most of the chapters contain BREP format descriptions in the following order: - - * format file fragment to illustrate the part; - * BNF-like definition of the part; - * detailed description of the part. - -**Note** that the format is a part of Open CASCADE Technology (OCCT). - -Some data fields of the format have additional values, which are used in OCCT. - -Some data fields of the format are specific for OCCT. - -@section occt_brep_format_2 Format Common Structure - - ASCII encoding is used to read/write BREP format from/to file. The format data are stored in a file as text data. - - BREP format uses the following BNF terms: - - * \<\\n\>: It is the operating-system-dependent ASCII character sequence which separates ASCII text strings in the operating system used; - * \<_\\n\>: = " "*\<\\n\>; - * \<_\>: = " "+; It is a not empty sequence of space characters with ASCII code 21h; - * \: = "0" | "1"; - * \: It is an integer number from -231 to 231-1 which is written in denary system; - * \: It is a real from -1.7976931348623158 @f$\cdot@f$ 10308 to 1.7976931348623158 @f$\cdot@f$ 10308 which is written in decimal or E form with base 10.The point is used as a delimiter of the integer and fractional parts; - * \<2D point\>: = \\<_\>\; - * \<3D point\>: = \(\<_\>\2; - * \<2D direction\>: It is a \<2D point\> *x y* so that *x2 + y2* = 1; - * \<3D direction\>: It is a \<3D point\> *x y z* so that *x2 + y2 + z2* = 1; - * \<+\>: It is an arithmetic operation of addition. - - The format consists of the following sections: - - * \; - * \; - * \; - * \; - * \. - - \ = "DBRep_DrawableShape" \<_\\n\>\<_\\n\>; - \ have other values [1]. - - \ = ("CASCADE Topology V1, (c) Matra-Datavision" | "CASCADE Topology V2, (c) Matra-Datavision")\<_\\n\>; - The difference of the versions is described in the document. - - Sections \, \ and \ are described below in separate chapters of the document. - -@section occt_brep_format_3 Locations - -**Example** - -@verbatim - Locations 3 - 1 -               0               0               1               0 -               1               0               0               0 -               0               1               0               0 - 1 -               1               0               0               4 -               0               1               0               5 -               0               0               1               6 - 2  1 1 2 1 0 -@endverbatim - -**BNF-like Definition** - -@verbatim - = <_\n> ; - = "Locations" <_> ; - = ; - = ^ ; - = | ; - = "1" <_\n> ; - = "2" <_> ; - = ((<_> ) ^ 4 <_\n>) ^ 3; - = ( <_> <_>)* "0" <_\n>; -@endverbatim - -**Description** - -\ is interpreted as a 3 x 4 matrix -@f$Q = -\begin{pmatrix} -{q}_{1,1} &{q}_{1,2} &{q}_{1,3} &{q}_{1,4}\\ -{q}_{2,1} &{q}_{2,2} &{q}_{2,3} &{q}_{2,4}\\ -{q}_{3,1} &{q}_{3,2} &{q}_{3,3} &{q}_{3,4} -\end{pmatrix}@f$  -which describes transformation of 3 dimensional space and satisfies the following constraints: - * @f$ d \neq 0@f$ where @f$d = |Q_{2}|@f$ where - @f$ Q_{2} = \begin{pmatrix} - {q}_{1,1} &{q}_{1,2} &{q}_{1,3} &{q}_{1,4}\\ - {q}_{2,1} &{q}_{2,2} &{q}_{2,3} &{q}_{2,4}\\ - {q}_{3,1} &{q}_{3,2} &{q}_{3,3} &{q}_{3,4} - \end{pmatrix}; @f$ - * @f$ Q_{3}^{T} = Q_{3}^{-1}@f$ where @f$Q_{3} = Q_{2}/d^{1/3}. @f$ - -The transformation transforms a point (x, y, z) to another point (u, v, w) by the rule: -@f[ \begin{pmatrix} -u \\ v \\ w -\end{pmatrix} = -Q\cdot(x\;y\;z\;1)^{T} = -\begin{pmatrix} -{q}_{1,1}\cdot x +{q}_{1,2}\cdot y +{q}_{1,3}\cdot z +{q}_{1,4}\\ -{q}_{2,1}\cdot x +{q}_{2,2}\cdot y +{q}_{2,3}\cdot z +{q}_{2,4}\\ -{q}_{3,1}\cdot x +{q}_{3,2}\cdot y +{q}_{3,3}\cdot z +{q}_{3,4} -\end{pmatrix} . @f] - -*Q* may be a composition of matrices for the following elementary transformations: - - * parallel translation -- - @f$ \begin{pmatrix} - 1 &0 &0 &{q}_{1,4}\\ - 0 &1 &0 &{q}_{2,4}\\ - 0 &0 &1 &{q}_{3,4} - \end{pmatrix}; @f$ - * rotation around an axis with a direction *D(Dx, Dy, Dz)* by an angle @f$ \varphi @f$ -- - - @f[ \begin{pmatrix} - D_{x}^{2} \cdot (1-cos(\varphi)) + cos(\varphi) &D_{x} \cdot D_{y} \cdot (1-cos(\varphi)) - D_{z} \cdot sin(\varphi) &D_{x} \cdot D_{z} \cdot (1-cos(\varphi)) + D_{y} \cdot sin(\varphi) &0\\ - D_{x} \cdot D_{y} \cdot (1-cos(\varphi)) + D_{z} \cdot sin(\varphi) &D_{y}^{2} \cdot (1-cos(\varphi)) + cos(\varphi) &D_{y} \cdot D_{z} \cdot (1-cos(\varphi)) - D_{x} \cdot sin(\varphi) &0\\ - D_{x} \cdot D_{z} \cdot (1-cos(\varphi)) - D_{y} \cdot sin(\varphi) &D_{y} \cdot D_{z} \cdot (1-cos(\varphi)) + D_{x} \cdot sin(\varphi) &D_{z}^{2} \cdot (1-cos(\varphi)) + cos(\varphi) &0 - \end{pmatrix}; @f] - - * scaling -- @f$ \begin{pmatrix} s &0 &0 &0\\ 0 &s &0 &0\\ 0 &0 &s &0 \end{pmatrix} @f$ where @f$ S \in (-\infty,\; \infty)/\left \{ 0 \right \}; @f$ - * central symmetry -- @f$ \begin{pmatrix} -1 &0 &0 &0\\ 0 &-1 &0 &0\\ 0 &0 &-1 &0 \end{pmatrix}; @f$ - * axis symmetry -- @f$ \begin{pmatrix} -1 &0 &0 &0\\ 0 &-1 &0 &0\\ 0 &0 &1 &0 \end{pmatrix}; @f$ - * plane symmetry -- @f$ \begin{pmatrix} 1 &0 &0 &0\\ 0 &1 &0 &0\\ 0 &0 &-1 &0 \end{pmatrix}. @f$ - -\ is interpreted as a composition of locations raised to a power and placed above this \ in the section \. \ is a sequence @f$l_{1}p_{1} ... l_{n}p_{n}@f$ of @f$ n \geq 0 @f$ integer pairs @f$ l_{i}p_{i} \; (1 \leq i \leq n) @f$. \ 0 is the indicator of the sequence end. The sequence is interpreted as a composition @f$ L_{l_{1}}^{p_{1}} \cdot ... \cdot L_{l_{n}}^{p_{n}} @f$ where @f$ L_{l_{i}} @f$ is a location from @f$ l_{i} @f$-th \ in the section locations. \ numbering starts from 1. - - -@section occt_brep_format_4 Geometry - -@verbatim - = - <2D curves> - <3D curves> - <3D polygons> - - - ; -@endverbatim - -@subsection occt_brep_format_4_1 3D curves - -**Example** - -@verbatim - Curves 13 - 1 0 0 0 0 0 1 - 1 0 0 3 -0 1 0 - 1 0 2 0 0 0 1 - 1 0 0 0 -0 1 0 - 1 1 0 0 0 0 1 - 1 1 0 3 0 1 0 - 1 1 2 0 0 0 1 - 1 1 0 0 -0 1 0 - 1 0 0 0 1 0 -0 - 1 0 0 3 1 0 -0 - 1 0 2 0 1 0 -0 - 1 0 2 3 1 0 -0 - 1 1 0 0 1 0 0 -@endverbatim - -**BNF-like Definition** - -@verbatim - <3D curves> = <3D curve header> <_\n> <3D curve records>; - - <3D curve header> = "Curves" <_> <3D curve count>; - - <3D curve count> = ; - - <3D curve records> = <3D curve record> ^ <3D curve count>; - - <3D curve record> = - <3D curve record 1> | - <3D curve record 2> | - <3D curve record 3> | - <3D curve record 4> | - <3D curve record 5> | - <3D curve record 6> | - <3D curve record 7> | - <3D curve record 8> | - <3D curve record 9>; - @endverbatim - -@subsubsection occt_brep_format_4_1_1 Line - \<3D curve record 1\> - -**Example** - -@verbatim - 1 1 0 3 0 1 0 -@endverbatim - -**BNF-like Definition** - -@verbatim - <3D curve record 1> = "1" <_> <3D point> <_> <3D direction> <_\n>; -@endverbatim - -**Description** - -\<3D curve record 1\> describes a line. The line data consist of a 3D point *P* and a 3D direction *D*. The line passes through the point *P*, has the direction *D* and is defined by the following parametric equation: - -@f[ C(u)=P+u \cdot D, \; u \in (-\infty,\; \infty). @f] - -The example record is interpreted as a line which passes through a point *P*=(1, 0, 3), has a direction *D*=(0, 1, 0) and is defined by the following parametric equation: @f$ C(u)=(1,0,3)+u \cdot (0,1,0) @f$. - - -@subsubsection occt_brep_format_4_1_2 Circle - \<3D curve record 2\> - -**Example** - -@verbatim - 2 1 2 3 0 0 1 1 0 -0 -0 1 0 4 -@endverbatim - -**BNF-like Definition** - -~~~~ - <3D curve record 2> = "2" <_> <3D circle center> <_> <3D circle N> <_> <3D circle Dx> <_> <3D circle Dy> <_> <3D circle radius> <_\n>; - - <3D circle center> = <3D point>; - - <3D circle N> = <3D direction>; - - <3D circle Dx> = <3D direction>; - - <3D circle Dy> = <3D direction>; - - <3D circle radius> = ; -~~~~ - -**Description** - -\<3D curve record 2\> describes a circle. The circle data consist of a 3D point *P*, pairwise orthogonal 3D directions *N*, *Dx* and *Dy* and a non-negative real *r*. The circle has a center *P* and is located in a plane with a normal *N*. The circle has a radius *r* and is defined by the following parametric equation: - -@f[ C(u)=P+r \cdot (cos(u) \cdot D_{x} + sin(u) \cdot D_{y}), \; u \in [o,\;2 \cdot \pi). @f] - -The example record is interpreted as a circle which has its center *P*=(1, 2, 3), is located in plane with a normal *N*=(0, 0 ,1). Directions for the circle are *Dx*=(1, 0 ,0) and *Dy*=(0, 1 ,0). The circle has a radius *r*=4 and is defined by the following parametric equation: @f$ C(u) = (1,2,3) + 4 \cdot ( cos(u) \cdot(1,0,0) + sin(u) \cdot (0,1,0) ) @f$. - - -@subsubsection occt_brep_format_4_1_3 Ellipse - \<3D curve record 3\> - -**Example** - -@verbatim - 3 1 2 3 0 0 1 1 0 -0 -0 1 0 5 4 -@endverbatim - -**BNF-like Definition** - -~~~~ - <3D curve record 3> = "3" <_> <3D ellipse center> <_> <3D ellipse N> <_> <3D ellipse Dmaj> <_> <3D ellipse Dmin> <_> <3D ellipse Rmaj> <_> <3D ellipse Rmin> <_\n>; - - <3D ellipse center> = <3D point>; - - <3D ellipse N> = <3D direction>; - - <3D ellipse Dmaj> = <3D direction>; - - <3D ellipse Dmin> = <3D direction>; - - <3D ellipse Rmaj> = ; - - <3D ellipse Rmin> = ; -~~~~ - -**Description** - -\<3D curve record 3\> describes an ellipse. The ellipse data consist of a 3D point *P*, pairwise orthogonal 3D directions *N*, *Dmaj* and *Dmin* and non-negative reals *rmaj* and *rmin* so that *rmin* @f$ \leq @f$ *rmaj*. The ellipse has its center *P*, is located in plane with the normal *N*, has major and minor axis directions *Dmaj* and *Dmin*, major and minor radii *rmaj* and *rmin* and is defined by the following parametric equation: - -@f[ C(u)=P+r_{maj} \cdot cos(u) \cdot D_{maj} + r_{min} \cdot sin(u) \cdot D_{min}, u \in [0, 2 \cdot \pi). @f] - -The example record is interpreted as an ellipse which has its center *P*=(1, 2, 3), is located in plane with a normal *N*=(0, 0, 1), has major and minor axis directions *Dmaj*=(1, 0, 0) and *Dmin*=(0, 1, 0), major and minor radii *rmaj*=5 and *rmin*=4 and is defined by the following parametric equation: @f$ C(u) = (1,2,3) + 5 \cdot cos(u) \cdot(1,0,0) + 4 \cdot sin(u) \cdot (0,1,0) @f$. - - -@subsubsection occt_brep_format_4_1_4 Parabola - \<3D curve record 4\> - -**Example** - -@verbatim - 4 1 2 3 0 0 1 1 0 -0 -0 1 0 16 -@endverbatim - -**BNF-like Definition** - -~~~~ - <3D curve record 4> = "4" <_> <3D parabola origin> <_> <3D parabola N> <_> <3D parabola Dx> <_> <3D parabola Dy> <_> <3D parabola focal length> <_\n>; - - <3D parabola origin> = <3D point>; - - <3D parabola N> = <3D direction>; - - <3D parabola Dx> = <3D direction>; - - <3D parabola Dy> = <3D direction>; - - <3D parabola focal length> = ; -~~~~ - -**Description** - -\<3D curve record 4\> describes a parabola. The parabola data consist of a 3D point *P*, pairwise orthogonal 3D directions *N*, *Dx* and *Dy* and a non-negative real *f*. The parabola is located in plane which passes through the point *P* and has the normal *N*. The parabola has a focus length *f* and is defined by the following parametric equation: - -@f[ C(u)=P+\frac{u^{2}}{4 \cdot f} \cdot D_{x} + u \cdot D_{y}, u \in (-\infty,\; \infty) \Leftarrow f \neq 0; @f] -@f[ C(u)=P+u \cdot D_{x}, u \in (-\infty,\; \infty) \Leftarrow f = 0\;(degenerated\;case). @f] - -The example record is interpreted as a parabola in plane which passes through a point *P*=(1, 2, 3) and has a normal *N*=(0, 0, 1). Directions for the parabola are *Dx*=(1, 0, 0) and *Dy*=(0, 1, 0). The parabola has a focus length *f*=16 and is defined by the following parametric equation: @f$ C(u) = (1,2,3) + \frac{u^{2}}{64} \cdot (1,0,0) + u \cdot (0,1,0) @f$. - - -@subsubsection occt_brep_format_4_1_5 Hyperbola - \<3D curve record 5\> - -**Example** - -@verbatim - 5 1 2 3 0 0 1 1 0 -0 -0 1 0 5 4 -@endverbatim - -**BNF-like Definition** - -~~~~ - <3D curve record 5> = "5" <_> <3D hyperbola origin> <_> <3D hyperbola N> <_> <3D hyperbola Dx> <_> <3D hyperbola Dy> <_> <3D hyperbola Kx> <_> <3D hyperbola Ky> <_\n>; - - <3D hyperbola origin> = <3D point>; - - <3D hyperbola N> = <3D direction>; - - <3D hyperbola Dx> = <3D direction>; - - <3D hyperbola Dy> = <3D direction>; - - <3D hyperbola Kx> = ; - - <3D hyperbola Ky> = ; -~~~~ - -**Descripton** - -\<3D curve record 5\> describes a hyperbola. The hyperbola data consist of a 3D point *P*, pairwise orthogonal 3D directions *N*, *Dx* and *Dy* and non-negative reals *kx* and *ky*. The hyperbola is located in plane which passes through the point *P* and has the normal *N*. The hyperbola is defined by the following parametric equation: - -@f[ C(u)=P+k_{x} \cdot cosh(u) \cdot D_{x}+k_{y} \cdot sinh(u) \cdot D_{y} , u \in (-\infty,\; \infty). @f] - -The example record is interpreted as a hyperbola in plane which passes through a point *P*=(1, 2, 3) and has a normal *N*=(0, 0, 1). Other hyperbola data are *Dx*=(1, 0, 0), *Dy*=(0, 1, 0), *kx*=5 and *ky*=4. The hyperbola is defined by the following parametric equation: @f$ C(u) = (1,2,3) + 5 \cdot cosh(u) \cdot (1,0,0) +4 \cdot sinh(u) \cdot (0,1,0) @f$. - - -@subsubsection occt_brep_format_4_1_6 Bezier Curve - \<3D curve record 6\> - -**Example** - -@verbatim - 6 1 2 0 1 0  4 1 -2 0  5 2 3 0  6 -@endverbatim - -**BNF-like Definition** - -@verbatim - <3D curve record 6> = "6" <_> <3D Bezier rational flag> <_> <3D Bezier degree> - <3D Bezier weight poles> <_\n>; - - <3D Bezier rational flag> = ; - - <3D Bezier degree> = ; - - 3D Bezier weight poles> = (<_> <3D Bezier weight pole>) ^ (<3D Bezier degree> <+> "1"); - - <3D Bezier weight pole> = <3D point> [<_> ]; -@endverbatim - -**Description** - -\<3D curve record 6\> describes a Bezier curve. The curve data consist of a rational *r*, a degree @f$ m \leq 25 @f$ and weight poles. - -The weight poles are *m*+1 3D points *B0 ... Bm* if the flag *r* is 0. The weight poles are *m*+1 pairs *B0h0 ... Bmhm* if flag *r* is 1. Here *Bi* is a 3D point and *hi* is a positive real @f$ (0 \leq i \leq m) @f$. @f$ h_{i}=1\; (0 \leq i \leq m) @f$ if the flag *r* is 0. - -The Bezier curve is defined by the following parametric equation: - -@f[ C(u) = \frac{\sum_{i=0}^{m}B_{i} \cdot h_{i} \cdot C_{m}^{i} \cdot u^{i} \cdot (1-u)^{m-i}}{\sum_{i=0}^{m}h_{i} \cdot C_{m}^{i} \cdot u^{i} \cdot (1-u)^{m-i}},\;u \in [0,\; 1] @f] - -where @f$ 0^{0} \equiv 1 @f$. - -The example record is interpreted as a Bezier curve with a rational flag *r*=1, degree *m*=2 and weight poles *B0*=(0, 1, 0), *h0*=4, *B1*=(1, -2, 0), *h1*=5 and *B2*=(2, 3, 0), *h2*=6. The Bezier curve is defined by the following parametric equation: - -@f[ C(u)=\frac{(0,1,0) \cdot 4 \cdot (1-u)^{2}+(1,-2,0) \cdot 5 \cdot 2 \cdot u \cdot (1-u) + (2,3,0) \cdot 6 \cdot u^{2} )}{4 \cdot (1-u)^{2}+5 \cdot 2 \cdot u \cdot (1-u)+6 \cdot u^{2}}. @f] - - -@subsubsection occt_brep_format_4_1_7 B-spline Curve - \<3D curve record 7\> - -**Example** - -@verbatim - 7 1 0  1 3 5  0 1 0  4 1 -2 0  5 2 3 0  6 -  0 1 0.25 1 0.5 1 0.75 1 1 1 -@endverbatim - -**BNF-like Definition** - -~~~~ - <3D curve record 7> = "7" <_> <3D B-spline rational flag> <_> "0" <_> <3D B-spline degree> <_> - <3D B-spline pole count> <_> <3D B-spline multiplicity knot count> <3D B-spline weight poles> - <_\n> <3D B-spline multiplicity knots> <_\n>; - - <3D B-spline rational flag> = ; - - <3D B-spline degree> = ; - - <3D B-spline pole count> = ; - - <3D B-spline multiplicity knot count> = ; - - <3D B-spline weight poles> = (<_> <3D B-spline weight pole>) ^ <3D B-spline pole count>; - - <3D B-spline weight pole> = <3D point> [<_> ]; - - <3D B-spline multiplicity knots> = (<_> <3D B-spline multiplicity knot>) ^ <3D B-spline multiplicity knot count>; - - <3D B-spline multiplicity knot> = <_> ; -~~~~ - -**Description** - -\<3D curve record 7\> describes a B-spline curve. The curve data consist of a rational flag *r*, a degree @f$ m \leq 25 @f$, pole count @f$ n \geq 2 @f$, multiplicity knot count *k*, weight poles and multiplicity knots. - -The weight poles are *n* 3D points *B1 ... Bn* if the flag *r* is 0. The weight poles are *n* pairs *B1h1 ... Bnhn* if the flag *r* is 1. Here *Bi* is a 3D point and *hi* is a positive real @f$ (1 \leq i \leq n) @f$. @f$ h_{i}=1\; (1 \leq i \leq n) @f$ if the flag *r* is 0. - -The multiplicity knots are *k* pairs *u1q1 ... ukqk*. Here *ui* is a knot with a multiplicity @f$ q_{i} \geq 1 \; (1 \leq i \leq k) @f$ so that - -@f[ u_{i} < u_{i+1} (1 \leq i \leq k-1),@f] -@f[ q_{1} \leq m+1,\; q_{k} \leq m+1,\; q_{i} \leq m\; (2 \leq i \leq k-1), \sum_{i=1}^{k}q_{i}=m+n+1. @f] - -The B-spline curve is defined by the following parametric equation: - -@f[ C(u) = \frac{\sum_{i=1}^{n}B_{i} \cdot h_{i} \cdot N_{i,m+1}(u)}{\sum_{i=1}^{n}h_{i} \cdot N_{i,m+1}(u)},\;u \in [u_{1},\; u_{k}] @f] - -where functions @f$ N_{i,j} @f$ have the following recursion definition by *j*: - -@f[ N_{i,1}(u)=\left\{\begin{matrix} -1\Leftarrow \bar{u}_{i} \leq u \leq \bar{u}_{i+1}\\ -0\Leftarrow u < \bar{u}_{i} \vee \bar{u}_{i+1} \leq u \end{matrix} \right.,\; -N_{i,j}(u)=\frac{(u-\bar{u}_{i}) \cdot N_{i,j-1}(u) }{\bar{u}_{i+j-1}-\bar{u}_{i}}+ \frac{(\bar{u}_{i+j}-u) \cdot N_{i+1,j-1}(u)}{\bar{u}_{i+j}-\bar{u}_{i+1}},\;(2 \leq j \leq m+1) @f] - -where - -@f[ \bar{u}_{i} = u_{j},\; (1 \leq j \leq k,\; \sum_{l=1}^{j-1}q_{l}+1 \leq i \leq \sum_{l=1}^{j}q_{l} ). @f] - -The example record is interpreted as a B-spline curve with a rational flag *r*=1, a degree *m*=1, pole count *n*=3, multiplicity knot count *k*=5, weight poles *B1*=(0,1,0), *h1*=4, *B2*=(1,-2,0), *h2*=5 and *B3*=(2,3,0), *h3*=6, multiplicity knots *u1*=0, *q1*=1, *u2*=0.25, *q2*=1, *u3*=0.5, *q3*=1, *u4*=0.75, *q4*=1 and *u5*=1, *q5*=1. The B-spline curve is defined by the following parametric equation: - -@f[ C(u)=\frac{(0,1,0) \cdot 4 \cdot N_{1,2}(u) + (1,-2,0) \cdot 5 \cdot N_{2,2}(u)+(2,3,0) \cdot 6 \cdot N_{3,2}(u)}{4 \cdot N_{1,2}(u)+5 \cdot N_{2,2}(u)+6 \cdot N_{3,2}(u)}. @f] - - -@subsubsection occt_brep_format_4_1_8 Trimmed Curve - \<3D curve record 8\> - -**Example** - -@verbatim - 8 -4 5 - 1 1 2 3 1 0 0 -@endverbatim - -**BNF-like Definition** - -~~~~ - <3D curve record 8> = "8" <_> <3D trimmed curve u min> <_> <3D trimmed curve u max> <_\n> <3D curve record>; - - <3D trimmed curve u min> = ; - - <3D trimmed curve u max> = ; -~~~~ - -**Description** - -\<3D curve record 8\> describes a trimmed curve. The trimmed curve data consist of reals *umin* and *umax* and \<3D curve record\> so that *umin* < *umax*. The trimmed curve is a restriction of the base curve *B* described in the record to the segment @f$ [u_{min},\;u_{max}]\subseteq domain(B) @f$. The trimmed curve is defined by the following parametric equation: - -@f[ C(u)=B(u),\; u \in [u_{min},\;u_{max}]. @f] - -The example record is interpreted as a trimmed curve with *umin*=-4 and *umax*=5 for the base curve @f$ B(u)=(1,2,3)+u \cdot (1,0,0) @f$. The trimmed curve is defined by the following parametric equation: @f$ C(u)=(1,2,3)+u \cdot (1,0,0),\; u \in [-4,\; 5] @f$. - - -@subsubsection occt_brep_format_4_1_9 Offset Curve - \<3D curve record 9\> - -**Example** - -@verbatim - 9 2 - 0 1 0 - 1 1 2 3 1 0 0 -@endverbatim - -**BNF-like Definition** - -@verbatim - <3D curve record 9> = "9" <_> <3D offset curve distance> <_\n>; - <3D offset curve direction> <_\n>; - <3D curve record>; - - <3D offset curve distance> = ; - - <3D offset curve direction> = <3D direction>; -@endverbatim - -**Description** - -\<3D curve record 9\> describes an offset curve. The offset curve data consist of a distance *d*, a 3D direction *D* and a \<3D curve record\>. The offset curve is the result of offsetting the base curve *B* described in the record to the distance *d* along the vector @f$ [B'(u),\; D] \neq \vec{0} @f$. The offset curve is defined by the following parametric equation: - -@f[ C(u)=B(u)+d \cdot \frac{[B'(u),\; D]}{|[B'(u),\; D]|},\; u \in domain(B) . @f] - -The example record is interpreted as an offset curve with a distance *d*=2, direction *D*=(0, 1, 0), base curve @f$ B(u)=(1,2,3)+u \cdot (1,0,0) @f$ and defined by the following parametric equation: @f$ C(u)=(1,2,3)+u \cdot (1,0,0)+2 \cdot (0,0,1) @f$. - -@subsection occt_brep_format_4_2 Surfaces - -**Example** - -@verbatim - Surfaces 6 - 1 0 0 0 1 0 -0 0 0 1 0 -1 0 - 1 0 0 0 -0 1 0 0 0 1 1 0 -0 - 1 0 0 3 0 0 1 1 0 -0 -0 1 0 - 1 0 2 0 -0 1 0 0 0 1 1 0 -0 - 1 0 0 0 0 0 1 1 0 -0 -0 1 0 - 1 1 0 0 1 0 -0 0 0 1 0 -1 0 -@endverbatim - -**BNF-like Definition** - -@verbatim - = <_\n> ; - - = “Surfaces†<_> ; - - = ^ ; - - = - | - | - | - | - | - | - | - | - | - | - ; -@endverbatim - -@subsubsection occt_brep_format_4_2_1 Plane - \< surface record 1 \> - -**Example** - -@verbatim - 1 0 0 3 0 0 1 1 0 -0 -0 1 0 -@endverbatim - -**BNF-like Definition** - -@verbatim - = "1" <_> <3D point> (<_> <3D direction>) ^ 3 <_\n>; -@endverbatim - -**Description** - -\ describes a plane. The plane data consist of a 3D point *P* and pairwise orthogonal 3D directions *N*, *Du* and *Dv*. The plane passes through the point *P*, has the normal *N* and is defined by the following parametric equation: - -@f[ S(u,v)=P+u \cdot D_{u}+v \cdot D_{v},\; (u,\;v) \in (-\infty,\; \infty) \times (-\infty,\; \infty). @f] - -The example record is interpreted as a plane which passes through a point *P*=(0, 0, 3), has a normal *N*=(0, 0, 1) and is defined by the following parametric equation: @f$ S(u,v)=(0,0,3)+u \cdot (1,0,0) + v \cdot (0,1,0) @f$. - - -@subsubsection occt_brep_format_4_2_2 Cylinder - \< surface record 2 \> - -**Example** - -@verbatim - 2 1 2 3 0 0 1 1 0 -0 -0 1 0 4 -@endverbatim - -**BNF-like Definition** - -@verbatim - = "2" <_> <3D point> (<_> <3D direction>) ^ 3 <_> <_\n>; -@endverbatim - -**Description** - -\ describes a cylinder. The cylinder data consist of a 3D point *P*, pairwise orthogonal 3D directions *Dv*, *DX* and *DY* and a non-negative real *r*. The cylinder axis passes through the point *P* and has the direction *Dv*. The cylinder has the radius *r* and is defined by the following parametric equation: - -@f[ S(u,v)=P+r \cdot (cos(u) \cdot D_{x}+sin(u) \cdot D_{y} )+v \cdot D_{v},\; (u,v) \in [0,\; 2 \cdot \pi) \times (-\infty,\; \infty) . @f] - -The example record is interpreted as a cylinder which axis passes through a point *P*=(1, 2, 3) and has a direction *Dv*=(0, 0, 1). Directions for the cylinder are *DX*=(1,0,0) and *DY*=(0,1,0). The cylinder has a radius *r*=4 and is defined by the following parametric equation: @f$ S(u,v)=(1,2,3)+4 \cdot ( cos(u) \cdot D_{X} + sin(u) \cdot D_{Y} ) + v \cdot D_{v}. @f$ - - -@subsubsection occt_brep_format_4_2_3 Cone - \< surface record 3 \> - -**Example** - -@verbatim - 3 1 2 3 0 0 1 1 0 -0 -0 1 0 4 - 0.75 -@endverbatim - - -**BNF-like Definition** - -@verbatim - = "3" <_> <3D point> (<_> <3D direction>) ^ 3 (<_> ) ^ 2 <_\n>; -@endverbatim - -**Description** - -\ describes a cone. The cone data consist of a 3D point *P*, pairwise orthogonal 3D directions *DZ*, *DX* and *DY*, a non-negative real *r* and a real @f$ \varphi \in (-\pi /2,\; \pi/2)/\left \{ 0 \right \} @f$. The cone axis passes through the point *P* and has the direction *DZ*. The plane which passes through the point *P* and is parallel to directions *DX* and *DY* is the cone referenced plane. The cone section by the plane is a circle with the radius *r*. The direction from the point *P* to the cone apex is @f$ -sgn(\varphi) \cdot D_{Z} @f$. The cone has a half-angle @f$| \varphi | @f$ and is defined by the following parametric equation: - -@f[ S(u,v)=P+(r+v \cdot sin(\varphi)) \cdot (cos(u) \cdot D_{X}+sin(u) \cdot D_{Y})+v \cdot cos(\varphi) \cdot D_{Z}, (u,v) \in [0,\; 2 \cdot \pi) \times (-\infty,\; \infty) . @f] - -The example record is interpreted as a cone with an axis which passes through a point *P*=(1, 2, 3) and has a direction *DZ*=(0, 0, 1). Other cone data are *DX*=(1, 0, 0), *DY*=(0, 1, 0), *r*=4 and @f$ \varphi = 0.75 @f$. The cone is defined by the following parametric equation: -@f[ S(u,v)=(1,2,3)+( 4 + v \cdot sin(0.75)) \cdot ( cos(u) \cdot (1,0,0) + sin(u) \cdot (0,1,0) ) + v \cdot cos(0.75) \cdot (0,0,1) . @f] - - -@subsubsection occt_brep_format_4_2_4 Sphere - \< surface record 4 \> - -**Example** - -@verbatim - 4 1 2 3 0 0 1 1 0 -0 -0 1 0 4 -@endverbatim - -**BNF-like Definition** - -@verbatim - = "4" <_> <3D point> (<_> <3D direction>) ^ 3 <_> <_\n>; -@endverbatim - -**Description** - -\ describes a sphere. The sphere data consist of a 3D point *P*, pairwise orthogonal 3D directions *DZ*, *DX* and *DY* and a non-negative real *r*. The sphere has the center *P*, radius *r* and is defined by the following parametric equation: - -@f[ S(u,v)=P+r \cdot cos(v) \cdot (cos(u) \cdot D_{x}+sin(u) \cdot D_{y} ) +r \cdot sin(v) \cdot D_{Z},\; (u,v) \in [0,\;2 \cdot \pi) \times [-\pi /2,\; \pi /2] . @f] - -The example record is interpreted as a sphere with its center *P*=(1, 2, 3). Directions for the sphere are *DZ*=(0, 0, 1), *DX*=(1, 0, 0) and *DY*=(0, 1, 0). The sphere has a radius *r*=4 and is defined by the following parametric equation: -@f[ S(u,v)=(1,2,3)+ 4 \cdot cos(v) \cdot ( cos(u) \cdot (1,0,0) + sin(u) \cdot (0,1,0) ) + 4 \cdot sin(v) \cdot (0,0,1) . @f] - - -@subsubsection occt_brep_format_4_2_5 Torus - \< surface record 5 \> - -**Example** - -@verbatim - 5 1 2 3 0 0 1 1 0 -0 -0 1 0 8 4 -@endverbatim - -**BNF-like Definition** - -@verbatim - = "5" <_> <3D point> (<_> <3D direction>) ^ 3 (<_> ) ^ 2 <_\n>; -@endverbatim - -**Description** - -\ describes a torus. The torus data consist of a 3D point *P*, pairwise orthogonal 3D directions *DZ*, *DX* and *DY* and non-negative reals *r1* and *r2*. The torus axis passes through the point *P* and has the direction *DZ*. *r1* is the distance from the torus circle center to the axis. The torus circle has the radius *r2*. The torus is defined by the following parametric equation: - -@f[ S(u,v)=P+(r_{1}+r_{2} \cdot cos(v)) \cdot (cos(u) \cdot D_{x}+sin(u) \cdot D_{y} ) +r_{2} \cdot sin(v) \cdot D_{Z},\; (u,v) \in [0,\;2 \cdot \pi) \times [0,\; 2 \cdot \pi) . @f] - -The example record is interpreted as a torus with an axis which passes through a point *P*=(1, 2, 3) and has a direction *DZ*=(0, 0, 1). *DX*=(1, 0, 0), *DY*=(0, 1, 0), *r1*=8 and *r2*=4 for the torus. The torus is defined by the following parametric equation: -@f[ S(u,v)=(1,2,3)+ (8+4 \cdot cos(v)) \cdot ( cos(u) \cdot (1,0,0) + sin(u) \cdot (0,1,0) ) + 4 \cdot sin(v) \cdot (0,0,1) . @f] - - -@subsubsection occt_brep_format_4_2_6 Linear Extrusion - \< surface record 6 \> - -**Example** - -@verbatim - 6 0 0.6 0.8 - 2 1 2 3 0 0 1 1 0 -0 -0 1 0 4 -@endverbatim - -**BNF-like Definition** - -@verbatim - = "6" <_> <3D direction> <_\n> <3D curve record>; -@endverbatim - -**Description** - -\ describes a linear extrusion surface. The surface data consist of a 3D direction *Dv* and a \<3D curve record\>. The linear extrusion surface has the direction *Dv*, the base curve *C* described in the record and is defined by the following parametric equation: - -@f[ S(u,v)=C(u)+v \cdot D_{v},\; (u,v) \in domain(C) \times (-\infty,\; \infty) . @f] - -The example record is interpreted as a linear extrusion surface with a direction *Dv*=(0, 0.6, 0.8). The base curve is a circle for the surface. The surface is defined by the following parametric equation: - -@f[ S(u,v)=(1,2,3)+4 \cdot (cos(u) \cdot (1,0,0)+sin(u) \cdot (0,1,0))+v \cdot (0, 0.6, 0.8),\; (u,v) \in [0,\; 2 \cdot \pi) \times (-\infty,\; \infty). @f] - - -@subsubsection occt_brep_format_4_2_7 Revolution Surface - \< surface record 7 \> - -**Example** - -@verbatim - 7 -4 0 3 0 1 0 - 2 1 2 3 0 0 1 1 0 -0 -0 1 0 4 -@endverbatim - -**BNF-like Definition** - -@verbatim - = "7" <_> <3D point> <_> <3D direction> <_\n> <3D curve record>; -@endverbatim - -**Description** - -\ describes a revolution surface. The surface data consist of a 3D point *P*, a 3D direction *D* and a \<3D curve record\>. The surface axis passes through the point *P* and has the direction *D*. The base curve *C* described by the record and the axis are coplanar. The surface is defined by the following parametric equation: - -@f[ S(u,v)= P+V_{D}(v)+cos(u) \cdot (V(v)-V_{D}(v))+sin(u) \cdot [D,V(v)],\;(u,v) \in [0,\; 2 \cdot \pi)\times domain(C) @f] - -where @f$ V(v)=C(v)-P, V_{D}(v)=(D,V(v)) \cdot D @f$. - -The example record is interpreted as a revolution surface with an axis which passes through a point *P*=(-4, 0, 3) and has a direction *D*=(0, 1, 0). The base curve is a circle for the surface. The surface is defined by the following parametric equation: - -@f[ S(u,v)= (-4,0,3)+V_{D}(v)+cos(u) \cdot (V(v)-V_{D}(v))+sin(u) \cdot [(0,1,0),V(v)],\;(u,v) \in [0,\; 2 \cdot \pi)\times [0,\; 2 \cdot \pi) @f] - -where @f$ V(v)=(5,2,0)+4 \cdot (cos(v) \cdot (1,0,0)+sin(v) \cdot (0,1,0)), V_{D}(v)=((0,1,0),V(v)) \cdot (0,1,0) @f$. - - -@subsubsection occt_brep_format_4_2_8 Bezier Surface - \< surface record 8 \> - -**Example** - -@verbatim - 8 1 1 2 1 0 0 1  7 1 0 -4  10 - 0 1 -2  8 1 1 5  11 - 0 2 3  9 1 2 6  12 -@endverbatim - -**BNF-like Definition** - -~~~~ - = "8" <_> <_> <_> <_> <_> - ; - - = ; - - = ; - - = ; - - = ; - - = - ( <_\n>) ^ ( <+> "1"); - - = - (<_> ) ^ ; - - = <3D point> [<_> ]; -~~~~ - -**Description** - -\ describes a Bezier surface. The surface data consist of a u rational flag *ru*, v rational flag *rv*, u degree @f$ m_{u} \leq 25 @f$, v degree @f$ m_{v} \leq 25 @f$ and weight poles. - -The weight poles are @f$ (m_{u}+1) \cdot (m_{v}+1) @f$ 3D points @f$ B_{i,j}\; ((i,j) \in \left \{ 0,...,m_{u} \right \} \times \left \{ 0,...,m_{v} \right \}) @f$ if @f$ r_{u}+r_{v}=0 @f$. The weight poles are @f$ (m_{u}+1) \cdot (m_{v}+1) @f$ pairs @f$ B_{i,j}h_{i,j}\; ((i,j) \in \left \{ 0,...,m_{u} \right \} \times \left \{ 0,...,m_{v} \right \}) @f$ if @f$ r_{u}+r_{v} \neq 0 @f$. Here @f$ B_{i,j} @f$ is a 3D point and @f$ h_{i,j} @f$ is a positive real @f$ ((i,j) \in \left \{ 0,...,m_{u} \right \} \times \left \{ 0,...,m_{v} \right \}) @f$. @f$ h_{i,j}=1\; ((i,j) \in \left \{ 0,...,m_{u} \right \} \times \left \{ 0,...,m_{v} \right \}) @f$ if @f$ r_{u}+r_{v} = 0 @f$. - -The Bezier surface is defined by the following parametric equation: - -@f[ S(u,v)=\frac{\sum_{i=0}^{m_{u}} \sum_{j=0}^{m_{v}} B_{i,j} \cdot h_{i,j} \cdot C_{m_{u}}^{i} \cdot u^{i} \cdot (1-u)^{m_{u}-i} \cdot C_{m_{v}}^{j} \cdot v^{j} \cdot (1-v)^{m_{v}-j}}{\sum_{i=0}^{m_{u}} \sum_{j=0}^{m_{v}} h_{i,j} \cdot C_{m_{u}}^{i} \cdot u^{i} \cdot (1-u)^{m_{u}-i} \cdot C_{m_{v}}^{j} \cdot v^{j} \cdot (1-v)^{m_{v}-j}}, (u,v) \in [0,1] \times [0,1] @f] - -where @f$ 0^{0} \equiv 1 @f$. - -The example record is interpreted as a Bezier surface with a u rational flag *ru*=1, v rational flag *rv*=1, u degree *mu*=2, v degree *mv*=1, weight poles *B0,0*=(0, 0, 1), *h0,0*=7, *B0,1*=(1, 0, -4), *h0,1*=10, *B1,0*=(0, 1, -2), *h1,0*=8, *B1,1*=(1, 1, 5), *h1,1*=11, *B2,0*=(0, 2, 3), *h2,0*=9 and *B2,1*=(1, 2, 6), *h2,1*=12. The surface is defined by the following parametric equation: - -@f[ -\begin{align} -S(u,v)= [ (0,0,1) \cdot 7 \cdot (1-u)^{2} \cdot (1-v)+(1,0,-4) \cdot 10 \cdot (1-u)^{2} \cdot v+ (0,1,-2) \cdot 8 \cdot 2 \cdot u \cdot (1-u) \cdot (1-v) + \\ -(1,1,5) \cdot 11 \cdot 2 \cdot u \cdot (1-u) \cdot v+ (0,2,3) \cdot 9 \cdot u^{2} \cdot (1-v)+(1,2,6) \cdot 12 \cdot u^{2} \cdot v] \div [7 \cdot (1-u)^{2} \cdot (1-v)+ \\ -10 \cdot (1-u)^{2} \cdot v+ 8 \cdot 2 \cdot u \cdot (1-u) \cdot (1-v)+ 11 \cdot 2 \cdot u \cdot (1-u) \cdot v+ 9 \cdot u^{2} \cdot (1-v)+12 \cdot u^{2} \cdot v ] -\end{align} -@f] - - -@subsubsection occt_brep_format_4_2_9 B-spline Surface - \< surface record 9 \> - -**Example** - -@verbatim - 9 1 1 0 0 1 1 3 2 5 4 0 0 1  7 1 0 -4  10 - 0 1 -2  8 1 1 5  11 - 0 2 3  9 1 2 6  12 - - 0 1 - 0.25 1 - 0.5 1 - 0.75 1 - 1 1 - - 0 1 - 0.3 1 - 0.7 1 - 1 1 -@endverbatim - -**BNF-like Definition** - -@verbatim - = "9" <_> <_> - <_> "0" <_> "0" <_> <_> - <_> <_> - <_> <_> - <_> <_\n> - <_\n> ; - - = ; - - = ; - - = ; - - = ; - - = ; - - = ; - - = ; - - = ; - - = - ( <_\n>) ^ ; - - = - ( <_>) ^ ; - - = <3D point> [<_> ]; - - = - ( <_\n>) ^ ; - - = <_> ; - - = - ( <_\n>) ^ ; - - = <_> ; -@endverbatim - -**Description** - -\ describes a B-spline surface. The surface data consist of a u rational flag *ru*, v rational flag *rv*, u degree @f$ m_{u} \leq 25 @f$, v degree @f$ m_{v} \leq 25 @f$, u pole count @f$ n_{u} \geq 2 @f$, v pole count @f$ n_{v} \geq 2 @f$, u multiplicity knot count *ku*, v multiplicity knot count *kv*, weight poles, u multiplicity knots, v multiplicity knots. - -The weight poles are @f$ n_{u} \cdot n_{v} @f$ 3D points @f$ B_{i,j}\; ((i,j) \in \left \{ 1,...,n_{u} \right \} \times \left \{ 1,...,n_{v} \right \}) @f$ if @f$ r_{u}+r_{v}=0 @f$. The weight poles are @f$ n_{u} \cdot n_{v} @f$ pairs @f$ B_{i,j}h_{i,j}\; ((i,j) \in \left \{ 1,...,n_{u} \right \} \times \left \{ 1,...,n_{v} \right \}) @f$ if @f$ r_{u}+r_{v} \neq 0 @f$. Here @f$ B_{i,j} @f$ is a 3D point and @f$ h_{i,j} @f$ is a positive real @f$ ((i,j) \in \left \{ 1,...,n_{u} \right \} \times \left \{ 1,...,n_{v} \right \}) @f$. @f$ h_{i,j}=1\; ((i,j) \in \left \{ 1,...,n_{u} \right \} \times \left \{ 1,...,n_{v} \right \}) @f$ if @f$ r_{u}+r_{v} = 0 @f$. - -The u multiplicity knots are *ku* pairs @f$ u_{1}q_{1} ... u_{k_{u}}q_{k_{u}} @f$. Here @f$ u_{i} @f$ is a knot with multiplicity @f$ q_{i} \geq 1 \;(1\leq i\leq k_{u}) @f$ so that - -@f[ u_{i} < u_{i+1} \; (1\leq i\leq k_{u}-1), \\ -q_{1} \leq m_{u}+1,\; q_{k_{u}} \leq m_{u}+1,\; q_{i} \leq m_{u}\; (2\leq i\leq k_{u}-1),\; \sum_{i=1}^{k_{u}}q_{i}=m_{u}+n_{u}+1. @f] - -The v multiplicity knots are *kv* pairs @f$ v_{1}t_{1} ... v_{k_{v}}t_{k_{v}} @f$. Here @f$ v_{j} @f$ is a knot with multiplicity @f$ t_{i} \geq 1\;(1\leq i\leq k_{v}) @f$ so that - -@f[ v_{j} < v_{j+1} \; (1\leq j\leq k_{v}-1), \\ -t_{1} \leq m_{v}+1,\; t_{k_{v}} \leq m_{v}+1,\; t_{j} \leq m_{v}\; (2\leq j\leq k_{v}-1),\; \sum_{j=1}^{k_{v}}t_{j}=m_{v}+n_{v}+1. @f] - -The B-spline surface is defined by the following parametric equation: - -@f[ S(u,v)=\frac{\sum_{i=1}^{n_{u}} \sum_{j=1}^{n_{v}} B_{i,j} \cdot h_{i,j} \cdot N_{i,m_{u}+1}(u) \cdot M_{j,m_{v}+1}(v)}{\sum_{i=1}^{n_{u}} \sum_{j=1}^{n_{v}} h_{i,j} \cdot N_{i,m_{u}+1}(u) \cdot M_{j,m_{v}+1}(v)}, (u,v) \in [u_{1},u_{k_{u}}] \times [v_{1},v_{k_{v}}] @f] - -where functions *Ni,j* and *Mi,j* have the following recursion definition by *j*: - -@f[ -\begin{align} -N_{i,1}(u)= \left\{\begin{matrix} -1\Leftarrow \bar{u}_{i} \leq u \leq \bar{u}_{i+1} -0\Leftarrow u < \bar{u}_{i} \vee \bar{u}_{i+1} \leq u \end{matrix} \right.,\; \\ -N_{i,j}(u)=\frac{(u-\bar{u}_{i}) \cdot N_{i,j-1}(u) }{\bar{u}_{i+j-1}-\bar{u}_{i}}+ -\frac{(\bar{u}_{i+j}-u) \cdot N_{i+1,j-1}(u)}{\bar{u}_{i+j}-\bar{u}_{i+1}},\;(2 \leq j \leq m_{u}+1), \; \\ -M_{i,1}(v)=\left\{\begin{matrix} -1\Leftarrow \bar{v}_{i} \leq v \leq \bar{v}_{i+1}\\ -0\Leftarrow v < \bar{v}_{i} \vee \bar{v}_{i+1} \leq v \end{matrix} \right.,\; \\ -M_{i,j}(v)=\frac{(v-\bar{v}_{i}) \cdot M_{i,j-1}(v) }{\bar{v}_{i+j-1}-\bar{v}_{i}}+ \frac{(\bar{v}_{i+j}-v) \cdot M_{i+1,j-1}(v)}{\bar{v}_{i+j}-\bar{v}_{i+1}},\;(2 \leq j \leq m_{v}+1); -\end{align} -@f] - -where -@f[ \bar{u}_{i}=u_{j}\; (1 \leq j \leq k_{u},\; \sum_{l=1}^{j-1}q_{l} \leq i \leq \sum_{l=1}^{j}q_{l}), \\ - \bar{v}_{i}=v_{j}\; (1 \leq j \leq k_{v},\; \sum_{l=1}^{j-1}t_{l} \leq i \leq \sum_{l=1}^{j}t_{l}); @f] - -The example record is interpreted as a B-spline surface with a u rational flag *ru*=1, v rational flag *rv*=1, u degree *mu*=1, v degree *mv*=1, u pole count *nu*=3, v pole count *nv*=2, u multiplicity knot count *ku*=5, v multiplicity knot count *kv*=4, weight poles *B1,1*=(0, 0, 1), *h1,1*=7, *B1,2*=(1, 0, -4), *h1,2*=10, *B2,1*=(0, 1, -2), *h2,1*=8, *B2,2*=(1, 1, 5), *h2,2*=11, *B3,1*=(0, 2, 3), *h3,1*=9 and *B3,2*=(1, 2, 6), *h3,2*=12, u multiplicity knots *u1*=0, *q1*=1, *u2*=0.25, *q2*=1, *u3*=0.5, *q3*=1, *u4*=0.75, *q4*=1 and *u5*=1, *q5*=1, v multiplicity knots *v1*=0, *r1*=1, *v2*=0.3, *r2*=1, *v3*=0.7, *r3*=1 and *v4*=1, *r4*=1. The B-spline surface is defined by the following parametric equation: - -@f[ -\begin{align} -S(u,v)= [ (0,0,1) \cdot 7 \cdot N_{1,2}(u) \cdot M_{1,2}(v)+(1,0,-4) \cdot 10 \cdot N_{1,2}(u) \cdot M_{2,2}(v)+ \\ -(0,1,-2) \cdot 8 \cdot N_{2,2}(u) \cdot M_{1,2}(v)+(1,1,5) \cdot 11 \cdot N_{2,2}(u) \cdot M_{2,2}(v)+ \\ -(0,2,3) \cdot 9 \cdot N_{3,2}(u) \cdot M_{1,2}(v)+(1,2,6) \cdot 12 \cdot N_{3,2}(u) \cdot M_{2,2}(v)] \div \\ -[7 \cdot N_{1,2}(u) \cdot M_{1,2}(v)+10 \cdot N_{1,2}(u) \cdot M_{2,2}(v)+ 8 \cdot N_{2,2}(u) \cdot M_{1,2}(v)+ \\ -11 \cdot N_{2,2}(u) \cdot M_{2,2}(v)+ 9 \cdot N_{3,2}(u) \cdot M_{1,2}(v)+12 \cdot N_{3,2}(u) \cdot M_{2,2}(v) ] -\end{align} -@f] - -@subsubsection occt_brep_format_4_2_10 Rectangular Trim Surface - \< surface record 10 \> - -**Example** - -@verbatim - 10 -1 2 -3 4 - 1 1 2 3 0 0 1 1 0 -0 -0 1 0 -@endverbatim - -**BNF-like Definition** - -@verbatim - = "10" <_> <_> <_> - <_> <_\n> ; - - = ; - - = ; - - = ; - - = ; -@endverbatim - -**Description** - -\ describes a rectangular trim surface. The surface data consist of reals *umin*, *umax*, *vmin* and *vmax* and a \ so that *umin* < *umax* and *vmin* < *vmax*. The rectangular trim surface is a restriction of the base surface *B* described in the record to the set @f$ [u_{min},u_{max}] \times [v_{min},v_{max}] \subseteq domain(B) @f$. The rectangular trim surface is defined by the following parametric equation: - -@f[ S(u,v)=B(u,v),\; (u,v) \in [u_{min},u_{max}] \times [v_{min},v_{max}] . @f] - -The example record is interpreted as a rectangular trim surface to the set [-1, 2]x[-3, 4] for the base surface @f$ B(u,v)=(1,2,3)+u \cdot (1,0,0)+v \cdot (0,1,0) @f$. The rectangular trim surface is defined by the following parametric equation: @f$ B(u,v)=(1,2,3)+u \cdot (1,0,0)+ v \cdot (0,1,0),\; (u,v) \in [-1,2] \times [-3,4] @f$. - - -@subsubsection occt_brep_format_4_2_11 Offset Surface - \< surface record 11 \> - -**Example** - -@verbatim - 11 -2 - 1 1 2 3 0 0 1 1 0 -0 -0 1 0 -@endverbatim - -**BNF-like Definition** - -@verbatim - = "11" <_> <_\n> ; - - = ; -@endverbatim - -**Description** - -\ describes an offset surface. -The offset surface data consist of a distance *d* and a \. The offset surface is the result of offsetting the base surface *B* described in the record to the distance *d* along the normal *N* of surface *B*. The offset surface is defined by the following parametric equation: - -@f[ S(u,v)=B(u,v)+d \cdot N(u,v),\; (u,v) \in domain(B) . \\ -N(u,v) = [S'_{u}(u,v),S'_{v}(u,v)] @f] -if @f$ [S'_{u}(u,v),S'_{v}(u,v)] \neq \vec{0} @f$. - -The example record is interpreted as an offset surface with a distance *d*=-2 and base surface @f$ B(u,v)=(1,2,3)+u \cdot (1,0,0)+v \cdot (0,1,0) @f$. The offset surface is defined by the following parametric equation: @f$ S(u,v)=(1,2,3)+u \cdot (1,0,0)+v \cdot (0,1,0)-2 \cdot (0,0,1) @f$. - - -@subsection occt_brep_format_4_3 2D curves - -**Example** - -@verbatim - Curve2ds 24 - 1 0 0 1 0 - 1 0 0 1 0 - 1 3 0 0 -1 - 1 0 0 0 1 - 1 0 -2 1 0 - 1 0 0 1 0 - 1 0 0 0 -1 - 1 0 0 0 1 - 1 0 0 1 0 - 1 0 1 1 0 - 1 3 0 0 -1 - 1 1 0 0 1 - 1 0 -2 1 0 - 1 0 1 1 0 - 1 0 0 0 -1 - 1 1 0 0 1 - 1 0 0 0 1 - 1 0 0 1 0 - 1 3 0 0 1 - 1 0 0 1 0 - 1 0 0 0 1 - 1 0 2 1 0 - 1 3 0 0 1 - 1 0 2 1 0 -@endverbatim - -**BNF-like Definition** - -@verbatim - <2D curves> = <2D curve header> <_\n> <2D curve records>; - - <2D curve header> = "Curve2ds" <_> <2D curve count>; - - <2D curve count> = ; - - <2D curve records> = <2D curve record> ^ <2D curve count>; - - <2D curve record> = - <2D curve record 1> | - <2D curve record 2> | - <2D curve record 3> | - <2D curve record 4> | - <2D curve record 5> | - <2D curve record 6> | - <2D curve record 7> | - <2D curve record 8> | - <2D curve record 9>; -@endverbatim - -@subsubsection occt_brep_format_4_3_1 Line - \<2D curve record 1\> - -**Example** - -@verbatim - 1 3 0 0 -1 -@endverbatim - -**BNF-like Definition** - -@verbatim - <2D curve record 1> = "1" <_> <2D point> <_> <2D direction> <_\n>; -@endverbatim - -**Description** - -\<2D curve record 1\> describes a line. The line data consist of a 2D point *P* and a 2D direction *D*. The line passes through the point *P*, has the direction *D* and is defined by the following parametric equation: - -@f[ C(u)=P+u \cdot D, \; u \in (-\infty,\; \infty). @f] - -The example record is interpreted as a line which passes through a point *P*=(3,0), has a direction *D*=(0,-1) and is defined by the following parametric equation: @f$ C(u)=(3,0)+ u \cdot (0,-1) @f$. - - -@subsubsection occt_brep_format_4_3_2 Circle - \<2D curve record 2\> - -**Example** - -@verbatim - 2 1 2 1 0 -0 1 3 -@endverbatim - -**BNF-like Definition** - -~~~~ - <2D curve record 2> = "2" <_> <2D circle center> <_> <2D circle Dx> <_> <2D circle Dy> <_> <2D circle radius> <_\n>; - - <2D circle center> = <2D point>; - - <2D circle Dx> = <2D direction>; - - <2D circle Dy> = <2D direction>; - - <2D circle radius> = ; -~~~~ - -**Description** - -\<2D curve record 2\> describes a circle. The circle data consist of a 2D point *P*, orthogonal 2D directions *Dx* and *Dy* and a non-negative real *r*. The circle has a center *P*. The circle plane is parallel to directions *Dx* and *Dy*. The circle has a radius *r* and is defined by the following parametric equation: - -@f[ C(u)=P+r \cdot (cos(u) \cdot D_{x} + sin(u) \cdot D_{y}),\; u \in [0,\; 2 \cdot \pi) . @f] - -The example record is interpreted as a circle which has a center *P*=(1,2). The circle plane is parallel to directions *Dx*=(1,0) and *Dy*=(0,1). The circle has a radius *r*=3 and is defined by the following parametric equation: @f$ C(u)=(1,2)+3 \cdot (cos(u) \cdot (1,0) + sin(u) \cdot (0,1)) @f$. - - -@subsubsection occt_brep_format_4_3_3 Ellipse - \<2D curve record 3\> - -**Example** - -@verbatim - 3 1 2 1 0 -0 1 4 3 -@endverbatim - -**BNF-like Definition** - -@verbatim - <2D curve record 3> = "3" <_> <2D ellipse center> <_> <2D ellipse Dmaj> <_> - <2D ellipse Dmin> <_> <2D ellipse Rmaj> <_> <2D ellipse Rmin> <_\n>; - - <2D ellipse center> = <2D point>; - - <2D ellipse Dmaj> = <2D direction>; - - <2D ellipse Dmin> = <2D direction>; - - <2D ellipse Rmaj> = ; - - <2D ellipse Rmin> = ; -@endverbatim - -**Description** - -\<2D curve record 3\> describes an ellipse. The ellipse data are 2D point *P*, orthogonal 2D directions *Dmaj* and *Dmin* and non-negative reals *rmaj* and *rmin* that *rmaj* @f$ \leq @f$ *rmin*. The ellipse has a center *P*, major and minor axis directions *Dmaj* and *Dmin*, major and minor radii *rmaj* and *rmin* and is defined by the following parametric equation: - -@f[ C(u)=P+r_{maj} \cdot cos(u) \cdot D_{maj}+r_{min} \cdot sin(u) \cdot D_{min},\; u \in [0,\; 2 \cdot \pi) . @f] - -The example record is interpreted as an ellipse which has a center *P*=(1,2), major and minor axis directions *Dmaj*=(1,0) and *Dmin*=(0,1), major and minor radii *rmaj*=4 and *rmin*=3 and is defined by the following parametric equation: @f$ C(u)=(1,2)+4 \cdot cos(u) \cdot (1,0)+3 \cdot sin(u) \cdot (0,1) @f$. - - -@subsubsection occt_brep_format_4_3_4 Parabola - \<2D curve record 4\> - -**Example** - -@verbatim - 4 1 2 1 0 -0 1 16 -@endverbatim - -**BNF-like Definition** - -@verbatim - <2D curve record 4> = "4" <_> <2D parabola origin> <_> <2D parabola Dx> <_> - <2D parabola Dy> <_> <2D parabola focal length> <_\n>; - - <2D parabola origin> = <2D point>; - - <2D parabola Dx> = <2D direction>; - - <2D parabola Dy> = <2D direction>; - - <2D parabola focal length> = ; -@endverbatim - -**Description** - -\<2D curve record 4\> describes a parabola. The parabola data consist of a 2D point *P*, orthogonal 2D directions *Dx* and *Dy* and a non-negative real *f*. The parabola coordinate system has its origin *P* and axis directions *Dx* and *Dy*. The parabola has a focus length *f* and is defined by the following parametric equation: - -@f[ C(u)=P+\frac{u^{2}}{4 \cdot f} \cdot D_{x}+u \cdot D_{y},\; u \in (-\infty,\; \infty) \Leftarrow f \neq 0;\\ -C(u)=P+u \cdot D_{x},\; u \in (-\infty,\; \infty) \Leftarrow f = 0\; (degenerated\;case). @f] - -The example record is interpreted as a parabola in plane which passes through a point *P*=(1,2) and is parallel to directions *Dx*=(1,0) and *Dy*=(0,1). The parabola has a focus length *f*=16 and is defined by the following parametric equation: @f$ C(u)=(1,2)+ \frac{u^{2}}{64} \cdot (1,0)+u \cdot (0,1) @f$. - - -@subsubsection occt_brep_format_4_3_5 Hyperbola - \<2D curve record 5\> -**Example** - -5 1 2 1 0 -0 1 3 4 - - -**BNF-like Definition** - -@verbatim - <2D curve record 5> = "5" <_> <2D hyperbola origin> <_> <2D hyperbola Dx> <_> - <2D hyperbola Dy> <_> <2D hyperbola Kx> <_> <2D hyperbola Ky> <_\n>; - - <2D hyperbola origin> = <2D point>; - - <2D hyperbola Dx> = <2D direction>; - - <2D hyperbola Dy> = <2D direction>; - - <2D hyperbola Kx> = ; - - <2D hyperbola Ky> = ; -@endverbatim - -**Description** - -\<2D curve record 5\> describes a hyperbola. The hyperbola data consist of a 2D point *P*, orthogonal 2D directions *Dx* and *Dy* and non-negative reals *kx* and *ky*. The hyperbola coordinate system has origin *P* and axis directions *Dx* and *Dy*. The hyperbola is defined by the following parametric equation: - -@f[ C(u)=P+k_{x} \cdot cosh(u) D_{x}+k_{y} \cdot sinh(u) \cdot D_{y},\; u \in (-\infty,\; \infty). @f] - -The example record is interpreted as a hyperbola with coordinate system which has origin *P*=(1,2) and axis directions *Dx*=(1,0) and *Dy*=(0,1). Other data for the hyperbola are *kx*=5 and *ky*=4. The hyperbola is defined by the following parametric equation: @f$ C(u)=(1,2)+3 \cdot cosh(u) \cdot (1,0)+4 \cdot sinh(u) \cdot (0,1) @f$. - - -@subsubsection occt_brep_format_4_3_6 Bezier Curve - \<2D curve record 6\> - -**Example** - -@verbatim -6 1 2 0 1  4 1 -2  5 2 3  6 -@endverbatim - -**BNF-like Definition** - -@verbatim - <2D curve record 6> = "6" <_> <2D Bezier rational flag> <_> <2D Bezier degree> - <2D Bezier weight poles> <_\n>; - - <2D Bezier rational flag> = ; - - <2D Bezier degree> = ; - - <2D Bezier weight poles> = (<_> <2D Bezier weight pole>) ^ (<2D Bezier degree> <+> “1â€); - - <2D Bezier weight pole> = <2D point> [<_> ]; -@endverbatim - -**Description** - -\<2D curve record 6\> describes a Bezier curve. The curve data consist of a rational flag *r*, a degree @f$ m \leq 25 @f$ and weight poles. - -The weight poles are *m*+1 2D points *B0 ... Bm* if the flag *r* is 0. The weight poles are *m*+1 pairs *B0h0 ... Bmhm* if the flag *r* is 1. Here *Bi* is a 2D point and *hi* is a positive real @f$ (0\leq i\leq m) @f$. *hi*=1 @f$(0\leq i\leq m) @f$ if the flag *r* is 0. - -The Bezier curve is defined by the following parametric equation: - -@f[ C(u)= \frac{\sum_{i=0}^{m} B_{i} \cdot h_{i} \cdot C_{m}^{i} \cdot u^{i} \cdot (1-u)^{m-i}}{\sum_{i=0}^{m} h_{i} \cdot C_{m}^{i} \cdot u^{i} \cdot (1-u)^{m-i}},\; u \in [0,1] @f] - -where @f$ 0^{0} \equiv 1 @f$. - -The example record is interpreted as a Bezier curve with a rational flag *r*=1, a degree *m*=2 and weight poles *B0*=(0,1), *h0*=4, *B1*=(1,-2), *h1*=5 and *B2*=(2,3), *h2*=6. The Bezier curve is defined by the following parametric equation: - -@f[ C(u)= \frac{(0,1) \cdot 4 \cdot (1-u)^{2}+(1,-2) \cdot 5 \cdot 2 \cdot u \cdot (1-u)+(2,3) \cdot 6 \cdot u^{2}}{ 4 \cdot (1-u)^{2}+5 \cdot 2 \cdot u \cdot (1-u)+6 \cdot u^{2}} . @f] - - -@subsubsection occt_brep_format_4_3_7 B-spline Curve - \<2D curve record 7\> - -**Example** - -@verbatim -7 1 0  1 3 5  0 1  4 1 -2  5 2 3  6 - 0 1 0.25 1 0.5 1 0.75 1 1 1 -@endverbatim - -**BNF-like Definition** - -~~~~ - <2D curve record 7> = "7" <_> <2D B-spline rational flag> <_> "0" <_> <2D B-spline degree> <_> <2D B-spline pole count> <_> <2D B-spline multiplicity knot count> <2D B-spline weight poles> <_\n> <2D B-spline multiplicity knots> <_\n>; - - <2D B-spline rational flag> = ; - - <2D B-spline degree> = ; - - <2D B-spline pole count> = ; - - <2D B-spline multiplicity knot count> = ; - - <2D B-spline weight poles> = <2D B-spline weight pole> ^ <2D B-spline pole count>; - - <2D B-spline weight pole> = <_> <2D point> [<_> ]; - - <2D B-spline multiplicity knots> = - <2D B-spline multiplicity knot> ^ <2D B-spline multiplicity knot count>; - - <2D B-spline multiplicity knot> = <_> <_> ; -~~~~ - -**Description** - -\<2D curve record 7\> describes a B-spline curve. The curve data consist of a rational flag *r*, a degree @f$ m \leq 25 @f$, a pole count @f$ n \geq 2 @f$, a multiplicity knot count *k*, weight poles and multiplicity knots. - -The weight poles are *n* 2D points *B1 ... Bn* if the flag *r* is 0. The weight poles are *n* pairs *B1h1 ... Bnhn* if the flag *r* is 1. Here *Bi* is a 2D point and *hi* is a positive real @f$ (1\leq i\leq n) @f$. *hi*=1 @f$(1\leq i\leq n) @f$ if the flag *r* is 0. - -The multiplicity knots are *k* pairs *u1q1 ... ukqk*. Here *ui* is a knot with multiplicity @f$ q_{i} \geq 1\; (1 \leq i \leq k) @f$ so that - -@f[ u_{i} < u_{i+1}\; (1 \leq i \leq k-1), \\ -q_{1} \leq m+1,\; q_{k} \leq m+1,\; q_{i} \leq m\; (2 \leq i \leq k-1),\; \sum_{i=1}^{k}q_{i}=m+n+1 . @f] - -The B-spline curve is defined by the following parametric equation: - -@f[ C(u)= \frac{\sum_{i=1}^{n} B_{i} \cdot h_{i} \cdot N_{i,m+1}(u) }{\sum_{i=1}^{n} h_{i} \cdot N_{i,m+1}(u)},\; u \in [u_{1},\; u_{k}] @f] - -where functions *Ni,j* have the following recursion definition by *j* - -@f[ N_{i,1}(u)=\left\{\begin{matrix} -1\Leftarrow \bar{u}_{i} \leq u \leq \bar{u}_{i+1}\\ -0\Leftarrow u < \bar{u}_{i} \vee \bar{u}_{i+1} \leq u \end{matrix} \right.,\; -N_{i,j}(u)=\frac{(u-\bar{u}_{i}) \cdot N_{i,j-1}(u) }{\bar{u}_{i+j-1}-\bar{u}_{i}}+ \frac{(\bar{u}_{i+j}-u) \cdot N_{i+1,j-1}(u)}{\bar{u}_{i+j}-\bar{u}_{i+1}},\;(2 \leq j \leq m+1) @f] - -where - -@f[ \bar{u}_{i}=u_{j}\; (1\leq j\leq k,\; \sum_{l=1}^{j-1}q_{l}+1 \leq i \leq \sum_{l=1}^{j}q_{l}) . @f] - -The example record is interpreted as a B-spline curve with a rational flag *r*=1, a degree *m*=1, a pole count *n*=3, a multiplicity knot count *k*=5, weight poles *B1*=(0,1), *h1*=4, *B2*=(1,-2), *h2*=5 and *B3*=(2,3), *h3*=6 and multiplicity knots *u1*=0, *q1*=1, *u2*=0.25, *q2*=1, *u3*=0.5, *q3*=1, *u4*=0.75, *q4*=1 and *u5*=1, *q5*=1. The B-spline curve is defined by the following parametric equation: - -@f[ C(u)= \frac{(0,1) \cdot 4 \cdot N_{1,2}(u)+(1,-2) \cdot 5 \cdot N_{2,2}(u)+(2,3) \cdot 6 \cdot N_{3,2}(u)}{ 4 \cdot N_{1,2}(u)+5 \cdot N_{2,2}(u)+6 \cdot N_{3,2}(u)} . @f] - - -@subsubsection occt_brep_format_4_3_8 Trimmed Curve - \<2D curve record 8\> - -**Example** - -@verbatim - 8 -4 5 - 1 1 2 1 0 -@endverbatim - -**BNF-like Definition** - -@verbatim - <2D curve record 8> = "8" <_> <2D trimmed curve u min> <_> <2D trimmed curve u max> <_\n> - <2D curve record>; - - <2D trimmed curve u min> = ; - - <2D trimmed curve u max> = ; -@endverbatim - -**Description** - -\<2D curve record 8\> describes a trimmed curve. The trimmed curve data consist of reals *umin* and *umax* and a \<2D curve record\> so that *umin* < *umax*. The trimmed curve is a restriction of the base curve *B* described in the record to the segment @f$ [u_{min},\;u_{max}]\subseteq domain(B) @f$. The trimmed curve is defined by the following parametric equation: - -@f[ C(u)=B(u),\; u \in [u_{min},\;u_{max}] . @f] - -The example record is interpreted as a trimmed curve with *umin*=-4, *umax*=5 and base curve @f$ B(u)=(1,2)+u \cdot (1,0) @f$. The trimmed curve is defined by the following parametric equation: @f$ C(u)=(1,2)+u \cdot (1,0),\; u \in [-4,5] @f$. - - -@subsubsection occt_brep_format_4_3_9 Offset Curve - \<2D curve record 9\> - -**Example** - -@verbatim - 9 2 - 1 1 2 1 0 -@endverbatim - -**BNF-like Definition** - -@verbatim -<2D curve record 9> = "9" <_> <2D offset curve distance> <_\n> <2D curve record>; - -<2D offset curve distance> = ; -@endverbatim - -**Description** - -\<2D curve record 9\> describes an offset curve. The offset curve data consist of a distance *d* and a \<2D curve record\>. The offset curve is the result of offsetting the base curve *B* described in the record to the distance *d* along the vector @f$ (B'_{Y}(u),\; -B'_{X}(u)) \neq \vec{0} @f$ where @f$ B(u)=(B'_{X}(u),\; B'_{Y}(u)) @f$. The offset curve is defined by the following parametric equation: - -@f[ C(u)=B(u)+d \cdot (B'_{Y}(u),\; -B'_{X}(u)),\; u \in domain(B) . @f] - -The example record is interpreted as an offset curve with a distance *d*=2 and base curve @f$ B(u)=(1,2)+u \cdot (1,0) @f$ and is defined by the following parametric equation: @f$ C(u)=(1,2)+u \cdot (1,0)+2 \cdot (0,-1) @f$. - -@subsection occt_brep_format_4_4 3D polygons - -**Example** - -@verbatim - Polygon3D 1 - 2 1 - 0.1 - 1 0 0 2 0 0 - 0 1 -@endverbatim - -**BNF-like Definition** - -@verbatim - <3D polygons> = <3D polygon header> <_\n> <3D polygon records>; - - <3D polygon header> = "Polygon3D" <_> <3D polygon record count>; - - <3D polygon records> = <3D polygon record> ^ <3D polygon record count>; - - <3D polygon record> = - <3D polygon node count> <_> <3D polygon flag of parameter presence> <_\n> - <3D polygon deflection> <_\n> - <3D polygon nodes> <_\n> - [<3D polygon parameters> <_\n>]; - - <3D polygon node count> = ; - - <3D polygon flag of parameter presence> = ; - - <3D polygon deflection> = ; - - <3D polygon nodes> = (<3D polygon node> <_>) ^ <3D polygon node count>; - - <3D polygon node> = <3D point>; - - <3D polygon u parameters> = (<3D polygon u parameter> <_>) ^ <3D polygon node count>; - - <3D polygon u parameter> = ; -@endverbatim - -**Description** - -\<3D polygons\> record describes a 3D polyline *L* which approximates a 3D curve *C*. The polyline data consist of a node count @f$ m \geq 2 @f$, a parameter presence flag *p*, a deflection @f$ d \geq 0 @f$, nodes @f$ N_{i}\; (1\leq i \leq m) @f$ and parameters @f$ u_{i}\; (1\leq i \leq m) @f$. The parameters are present only if *p*=1. The polyline *L* passes through the nodes. The deflection *d* describes the deflection of polyline *L* from the curve *C*: - -@f[ \underset{P \in C}{max}\; \underset{Q \in L}{min}|Q-P| \leq d . @f] - -The parameter @f$ u_{i}\; (1\leq i \leq m) @f$ is the parameter of the node *Ni* on the curve *C*: - -@f[ C(u_{i})=N_{i} . @f] - -The example record describes a polyline from *m*=2 nodes with a parameter presence flag *p*=1, a deflection *d*=0.1, nodes *N1*=(1,0,0) and *N2*=(2,0,0) and parameters *u1*=0 and *u2*=1. - - -@subsection occt_brep_format_4_5 Triangulations - -**Example** - -@verbatim - Triangulations 6 - 4 2 1 0 - 0 0 0 0 0 3 0 2 3 0 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 - 4 2 1 0 - 0 0 0 1 0 0 1 0 3 0 0 3 0 0 0 1 3 1 3 0 3 2 1 3 1 4 - 4 2 1 0 - 0 0 3 0 2 3 1 2 3 1 0 3 0 0 0 2 1 2 1 0 3 2 1 3 1 4 - 4 2 1 0 - 0 2 0 1 2 0 1 2 3 0 2 3 0 0 0 1 3 1 3 0 3 2 1 3 1 4 - 4 2 1 0 - 0 0 0 0 2 0 1 2 0 1 0 0 0 0 0 2 1 2 1 0 3 2 1 3 1 4 - 4 2 1 0 - 1 0 0 1 0 3 1 2 3 1 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 -@endverbatim - -**BNF-like Definition** - -~~~~ - = <_\n> ; - - = "Triangulations" <_> ; - - = ^ ; - - = <_> <_> <_> <_\n> - [<_> ] <_> <_\n>; - - = ; - - = ; - - = ; - - = ; - - = ( <_>) ^ ; - - = <3D point>; - - = - ( <_>) ^ ; - - = <_> ; - - = ( <_>) ^ ; - - = <_> <_> . -~~~~ - -**Description** - -\ describes a triangulation *T* which approximates a surface *S*. The triangulation data consist of a node count @f$ m \geq 3 @f$, a triangle count @f$ k \geq 1 @f$, a parameter presence flag *p*, a deflection @f$ d \geq 0 @f$, nodes @f$ N_{i}\; (1\leq i \leq m) @f$, parameter pairs @f$ u_{i}\; v_{i}\; (1\leq i \leq m) @f$, triangles @f$ n_{j,1}\; n_{j,2}\; n_{j,3}\; (1\leq j \leq k,\; n_{j,l} \in \left \{1,...,m \right \}\; (1\leq l\leq 3)) @f$. The parameters are present only if *p*=1. The deflection describes the triangulation deflection from the surface: - -@f[ \underset{P \in S}{max}\; \underset{Q \in T}{min}|Q-P| \leq d . @f] - -The parameter pair @f$ u_{i}\; v_{i}\; (1\leq i \leq m) @f$ describes the parameters of node *Ni* on the surface: - -@f[ S(u_{i},v_{i})=N_{i} . @f] - -The triangle @f$ n_{j,1}\; n_{j,2}\; n_{j,3}\; (1\leq j \leq k) @f$ is interpreted as a triangle of nodes @f$ N_{n_{j},1}\; N_{n_{j},2}@f$ and @f$ N_{n_{j},3} @f$ with circular traversal of the nodes in the order @f$ N_{n_{j},1}\; N_{n_{j},2}@f$ and @f$ N_{n_{j},3} @f$. From any side of the triangulation *T* all its triangles have the same direction of the node circular traversal: either clockwise or counterclockwise. - -Triangulation record - -@verbatim - 4 2 1 0 - 0 0 0 0 0 3 0 2 3 0 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 -@endverbatim - -describes a triangulation with *m*=4 nodes, *k*=2 triangles, parameter presence flag *p*=1, deflection *d*=0, nodes *N1*=(0,0,0), *N2*=(0,0,3), *N3*=(0,2,3) and *N4*=(0,2,0), parameters (*u1*, *v1*)=(0,0), (*u2*, *v2*)=(3,0), (*u3*, *v3*)=(3,-2) and (*u4*, *v4*)=(0,-2), and triangles (*n1,1*, *n1,2*, *n1,3*)=(2,4,3) and (*n2,1*, *n2,2*, *n2,3*)=(2,1,4). From the point (1,0,0) ((-1,0,0)) the triangles have clockwise (counterclockwise) direction of the node circular traversal. - - -@subsection occt_brep_format_4_6 Polygons on triangulations - -**Example** - -@verbatim - PolygonOnTriangulations 24 - 2 1 2 - p 0.1 1 0 3 - 2 1 4 - p 0.1 1 0 3 - 2 2 3 - p 0.1 1 0 2 - 2 1 2 - p 0.1 1 0 2 - 2 4 3 - p 0.1 1 0 3 - 2 1 4 - p 0.1 1 0 3 - 2 1 4 - p 0.1 1 0 2 - 2 1 2 - p 0.1 1 0 2 - 2 1 2 - p 0.1 1 0 3 - 2 2 3 - p 0.1 1 0 3 - 2 2 3 - p 0.1 1 0 2 - 2 4 3 - p 0.1 1 0 2 - 2 4 3 - p 0.1 1 0 3 - 2 2 3 - p 0.1 1 0 3 - 2 1 4 - p 0.1 1 0 2 - 2 4 3 - p 0.1 1 0 2 - 2 1 2 - p 0.1 1 0 1 - 2 1 4 - p 0.1 1 0 1 - 2 4 3 - p 0.1 1 0 1 - 2 1 4 - p 0.1 1 0 1 - 2 1 2 - p 0.1 1 0 1 - 2 2 3 - p 0.1 1 0 1 - 2 4 3 - p 0.1 1 0 1 - 2 2 3 - p 0.1 1 0 1 -@endverbatim - -**BNF-like Definition** - -@verbatim - = <_\n> - ; - - = - "PolygonOnTriangulations" <_> ; - - = ; - - = - ^ ; - - = - <_> <_\n> - "p" <_> <_> - - [<_> ] <_\n>; - - = ; - - = - ^ ; - - = ; - - = ; - - = ; - - = - ( <_>) ^ ; - - = ; -@endverbatim - -**Description** - -\ describes a polyline *L* on a triangulation which approximates a curve *C*. The polyline data consist of a node count @f$ m \geq 2 @f$, node numbers @f$ n_{i} \geq 1 @f$, deflection @f$ d \geq 0 @f$, a parameter presence flag *p* and parameters @f$ u_{i}\; (1\leq i\leq m) @f$. The parameters are present only if *p*=1. The deflection *d* describes the deflection of polyline *L* from the curve *C*: - -@f[ \underset{P \in C}{max}\; \underset{Q \in L}{min}|Q-P| \leq d . @f] - -Parameter @f$ u_{i}\; (1\leq i\leq m) @f$ is *ni*-th node *C(ui)* parameter on curve *C*. - - -@subsection occt_brep_format_4_7 Geometric Sense of a Curve - -Geometric sense of curve *C* described above is determined by the direction of parameter *u* increasing. - - -@section occt_brep_format_5 Shapes - -An example of section shapes and a whole *.brep file are given in chapter 7 @ref occt_brep_format_6 "Appendix". - - -**BNF-like Definition** - -@verbatim - = <_\n> <_\n> ; - - = "TShapes" <_> ; - - = ; - - = ^ ; - - = <_\n> <_\n> <_\n>; - - = ^ 7; - - = ( <_>)* "*"; - - = - <_> ; - - = "+" | "-" | "i" | "e"; - - = ; - - = ; - - = ; - - = - ("Ve" <_\n> <_\n>) | - ("Ed" <_\n> <_\n>) | - ("Wi" <_\n> <_\n>) | - ("Fa" <_\n> ) | - ("Sh" <_\n> <_\n>) | - ("So" <_\n> <_\n>) | - ("CS" <_\n> <_\n>) | - ("Co" <_\n> <_\n>); -@endverbatim - -**Description** - -\ @f$ f_{1}\; f_{2}\; f_{3}\; f_{4}\; f_{5}\; f_{6}\; f_{7} @f$ \s @f$ f_{i}\;(1\leq i \leq 7) @f$ are interpreted as shape flags in the following way: - - * @f$ f_{1} @f$ -- free; - * @f$ f_{2} @f$ -- modified; - * @f$ f_{3} @f$ -- IGNORED(version 1) \\ checked (version 2); - * @f$ f_{4} @f$ -- orientable; - * @f$ f_{5} @f$ -- closed; - * @f$ f_{6} @f$ -- infinite; - * @f$ f_{7} @f$ -- convex. - -The flags are used in a special way [1]. - -\ is interpreted in the following way: - - * + -- forward; - * - -- reversed; - * i -- internal; - * e -- external. - -\ is used in a special way [1]. - -\ is the number of a \ which is located in this section above the \. \ numbering is backward and starts from 1. - -\ types are interpreted in the following way: - - * "Ve" -- vertex; - * "Ed" -- edge; - * "Wi" -- wire; - * "Fa" -- face; - * "Sh" -- shell; - * "So" -- solid; - * "CS" -- compsolid; - * "Co" -- compound. - -\ determines the orientation and location for the whole model. - -@subsection occt_brep_format_5_1 Common Terms - -The terms below are used by \, \ and \. - - -**BNF-like Definition** - -@verbatim - = ; - - <3D curve number> = ; - - = ; - - <2D curve number> = ; - - <3D polygon number> = ; - - = ; - - = ; - - = <_> ; - - = - real> <_> <_> <_> ; -@endverbatim - -**Description** - -\ is the number of \ from section locations. \ numbering starts from 1. \ 0 is interpreted as the identity location. - -\<3D curve number\> is the number of a \<3D curve record\> from subsection \<3D curves\> of section \. \<3D curve record\> numbering starts from 1. - -\ is the number of a \ from subsection \ of section \. \ numbering starts from 1. - -\<2D curve number\> is the number of a \<2D curve record\> from subsection \<2D curves\> of section \. \<2D curve record\> numbering starts from 1. - -\<3D polygon number\> is the number of a \<3D polygon record\> from subsection \<3D polygons\> of section \. \<3D polygon record\> numbering starts from 1. - -\ is the number of a \ from subsection \ of section \. \ numbering starts from 1. - -\ number is the number of a \ from subsection \ of section \. -\ numbering starts from 1. - -\ *umin* and *umax* are the curve parameter *u* bounds: *umin* @f$ \leq @f$ *u* @f$ \leq @f$ *umax*. - -\ *umin* and *umax* are real pairs *xmin ymin* and *xmax ymax* that (*xmin*, *ymin*)= *C* (*umin*) and (*xmax*, *ymax*)= *C* (*umax*) where *C* is a parametric equation of the curve. - - -@subsection occt_brep_format_5_2 Vertex data - -**BNF-like Definition** - -@verbatim - = <_\n> <_\n> - ; - - = ; - - = <3D point>; - - = ( <_\n>)* "0 0"; - - = <_> - <_> ; - - = ; - - = - ("1" <_> ) | - ("2" <_> ) | - ("3" <_> ); - - = <3D curve number>; - - = <2D curve number> <_> ; - - = - <_> ; - - = ; -@endverbatim - -**Description** - -The usage of \ *U* is described below. - -\ and parameter *U* describe the position of the vertex *V* on a 3D curve *C*. Parameter *U* is a parameter of the vertex *V* on the curve *C*: *C(u)=V*. - -\ and parameter *U* describe the position of the vertex *V* on a 2D curve *C* which is located on a surface. Parameter *U* is a parameter of the vertex *V* on the curve *C*: *C(u)=V*. - -\ and parameter *u* describe the position of the vertex *V* on a surface *S* through \ *v*: *S(u,v)=V*. - -\ *t* describes the maximum distance from the vertex *V* to the set *R* of vertex *V* representations: - -@f[ \underset{P \in R }{max} |P-V| \leq t . @f] - - -@subsection occt_brep_format_5_3 Edge data - -**BNF-like Definition** - -~~~~ - = <_> <_> <_> edge data same range flag> <_> <_\n> ; - - = ; - - = ; - - = ; - - = ; - - = ( <_\n>)* "0"; - - = - "1" <_> - "2" <_> - "3" <_> - "4" <_> - "5" <_> - "6" <_> - "7" <_> ; - - = <3D curve number> <_> <_> - ; - - = <2D curve number> <_> <_> - <_> - [<_\n> ]; - - = (<2D curve number> <_>) ^ 2 <_> <_> <_> <\n> ]; - - = "C0" | "C1" | "C2" | "C3" | "CN" | "G1" | "G2". - - = - (<_> <_> ) ^ 2; - - = <3D polygon number> <_> ; - - = - <_> <_> ; - - = ( <_>) ^ 2 - <_> ; -~~~~ - -**Description** - -Flags \, \ and \ are used in a special way [1]. - -\ describes a 3D curve. - -\ describes a 2D curve on a surface. -\ are used only in version 2. - -\ describes a 2D curve on a closed surface. -\ are used only in version 2. - -\ describes a 3D polyline. - -\ describes a polyline on a triangulation. - -\ *t* describes the maximum distance from the edge *E* to the set *R* of edge *E* representations: - -@f[ \underset{C \in R}{max}\;\underset{P \in E}{max}\;\underset{Q \in C}{min}|Q-P| \leq t @f] - - -@subsection occt_brep_format_5_4 Face data - -**BNF-like Definition** - -~~~~ - = <_> <_> <_> <\n> ["2" <_> ]; - - = ; - - = ; -~~~~ - -**Description** - -\ describes a surface *S* of face *F* and a triangulation *T* of face *F*. The surface *S* may be empty: \ = 0. - -\ *t* describes the maximum distance from the face *F* to the surface *S*: - -@f[ \underset{P \in F}{max}\;\underset{Q \in S}{min}|Q-P| \leq t @f] - -Flag \ is used in a special way [1]. - - -@section occt_brep_format_6 Appendix - - This chapter contains a *.brep file example. - -@verbatim - DBRep_DrawableShape - - CASCADE Topology V1, (c) Matra-Datavision - Locations 3 - 1 -               0               0               1               0 -               1               0               0               0 -               0               1               0               0 - 1 -               1               0               0               4 -               0               1               0               5 -               0               0               1               6 - 2  1 1 2 1 0 - Curve2ds 24 - 1 0 0 1 0 - 1 0 0 1 0 - 1 3 0 0 -1 - 1 0 0 0 1 - 1 0 -2 1 0 - 1 0 0 1 0 - 1 0 0 0 -1 - 1 0 0 0 1 - 1 0 0 1 0 - 1 0 1 1 0 - 1 3 0 0 -1 - 1 1 0 0 1 - 1 0 -2 1 0 - 1 0 1 1 0 - 1 0 0 0 -1 - 1 1 0 0 1 - 1 0 0 0 1 - 1 0 0 1 0 - 1 3 0 0 1 - 1 0 0 1 0 - 1 0 0 0 1 - 1 0 2 1 0 - 1 3 0 0 1 - 1 0 2 1 0 - Curves 13 - 1 0 0 0 0 0 1 - 1 0 0 3 -0 1 0 - 1 0 2 0 0 0 1 - 1 0 0 0 -0 1 0 - 1 1 0 0 0 0 1 - 1 1 0 3 0 1 0 - 1 1 2 0 0 0 1 - 1 1 0 0 -0 1 0 - 1 0 0 0 1 0 -0 - 1 0 0 3 1 0 -0 - 1 0 2 0 1 0 -0 - 1 0 2 3 1 0 -0 - 1 1 0 0 1 0 0 - Polygon3D 1 - 2 1 - 0.1 - 1 0 0 2 0 0 - 0 1 - PolygonOnTriangulations 24 - 2 1 2 - p 0.1 1 0 3 - 2 1 4 - p 0.1 1 0 3 - 2 2 3 - p 0.1 1 0 2 - 2 1 2 - p 0.1 1 0 2 - 2 4 3 - p 0.1 1 0 3 - 2 1 4 - p 0.1 1 0 3 - 2 1 4 - p 0.1 1 0 2 - 2 1 2 - p 0.1 1 0 2 - 2 1 2 - p 0.1 1 0 3 - 2 2 3 - p 0.1 1 0 3 - 2 2 3 - p 0.1 1 0 2 - 2 4 3 - p 0.1 1 0 2 - 2 4 3 - p 0.1 1 0 3 - 2 2 3 - p 0.1 1 0 3 - 2 1 4 - p 0.1 1 0 2 - 2 4 3 - p 0.1 1 0 2 - 2 1 2 - p 0.1 1 0 1 - 2 1 4 - p 0.1 1 0 1 - 2 4 3 - p 0.1 1 0 1 - 2 1 4 - p 0.1 1 0 1 - 2 1 2 - p 0.1 1 0 1 - 2 2 3 - p 0.1 1 0 1 - 2 4 3 - p 0.1 1 0 1 - 2 2 3 - p 0.1 1 0 1 - Surfaces 6 - 1 0 0 0 1 0 -0 0 0 1 0 -1 0 - 1 0 0 0 -0 1 0 0 0 1 1 0 -0 - 1 0 0 3 0 0 1 1 0 -0 -0 1 0 - 1 0 2 0 -0 1 0 0 0 1 1 0 -0 - 1 0 0 0 0 0 1 1 0 -0 -0 1 0 - 1 1 0 0 1 0 -0 0 0 1 0 -1 0 - Triangulations 6 - 4 2 1 0 - 0 0 0 0 0 3 0 2 3 0 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 - 4 2 1 0 - 0 0 0 1 0 0 1 0 3 0 0 3 0 0 0 1 3 1 3 0 3 2 1 3 1 4 - 4 2 1 0 - 0 0 3 0 2 3 1 2 3 1 0 3 0 0 0 2 1 2 1 0 3 2 1 3 1 4 - 4 2 1 0 - 0 2 0 1 2 0 1 2 3 0 2 3 0 0 0 1 3 1 3 0 3 2 1 3 1 4 - 4 2 1 0 - 0 0 0 0 2 0 1 2 0 1 0 0 0 0 0 2 1 2 1 0 3 2 1 3 1 4 - 4 2 1 0 - 1 0 0 1 0 3 1 2 3 1 2 0 0 0 3 0 3 -2 0 -2 2 4 3 2 1 4 - - TShapes 39 - Ve - 1e-007 - 0 0 3 - 0 0 - - 0101101 - * - Ve - 1e-007 - 0 0 0 - 0 0 - - 0101101 - * - Ed -  1e-007 1 1 0 - 1  1 0 0 3 - 2  1 1 0 0 3 - 2  2 2 0 0 3 - 6  1 1 0 - 6  2 2 0 - 0 - - 0101000 - -39 0 +38 0 * - Ve - 1e-007 - 0 2 3 - 0 0 - - 0101101 - * - Ed -  1e-007 1 1 0 - 1  2 0 0 2 - 2  3 1 0 0 2 - 2  4 3 0 0 2 - 6  3 1 0 - 6  4 3 0 - 0 - - 0101000 - -36 0 +39 0 * - Ve - 1e-007 - 0 2 0 - 0 0 - - 0101101 - * - Ed -  1e-007 1 1 0 - 1  3 0 0 3 - 2  5 1 0 0 3 - 2  6 4 0 0 3 - 6  5 1 0 - 6  6 4 0 - 0 - - 0101000 - -36 0 +34 0 * - Ed -  1e-007 1 1 0 - 1  4 0 0 2 - 2  7 1 0 0 2 - 2  8 5 0 0 2 - 6  7 1 0 - 6  8 5 0 - 0 - - 0101000 - -34 0 +38 0 * - Wi - - 0101000 - -37 0 -35 0 +33 0 +32 0 * - Fa - 0  1e-007 1 0 - 2  1 - 0101000 - +31 0 * - Ve - 1e-007 - 1 0 3 - 0 0 - - 0101101 - * - Ve - 1e-007 - 1 0 0 - 0 0 - - 0101101 - * - Ed -  1e-007 1 1 0 - 1  5 0 0 3 - 2  9 6 0 0 3 - 2  10 2 0 0 3 - 6  9 6 0 - 6  10 2 0 - 0 - - 0101000 - -29 0 +28 0 * - Ve - 1e-007 - 1 2 3 - 0 0 - - 0101101 - * - Ed -  1e-007 1 1 0 - 1  6 0 0 2 - 2  11 6 0 0 2 - 2  12 3 0 0 2 - 6  11 6 0 - 6  12 3 0 - 0 - - 0101000 - -26 0 +29 0 * - Ve - 1e-007 - 1 2 0 - 0 0 - - 0101101 - * - Ed -  1e-007 1 1 0 - 1  7 0 0 3 - 2  13 6 0 0 3 - 2  14 4 0 0 3 - 6  13 6 0 - 6  14 4 0 - 0 - - 0101000 - -26 0 +24 0 * - Ed -  1e-007 1 1 0 - 1  8 0 0 2 - 2  15 6 0 0 2 - 2  16 5 0 0 2 - 6  15 6 0 - 6  16 5 0 - 0 - - 0101000 - -24 0 +28 0 * - Wi - - 0101000 - -27 0 -25 0 +23 0 +22 0 * - Fa - 0  1e-007 6 0 - 2  6 - 0101000 - +21 0 * - Ed -  1e-007 1 1 0 - 1  9 0 0 1 - 2  17 2 0 0 1 - 2  18 5 0 0 1 - 6  17 2 0 - 6  18 5 0 - 0 - - 0101000 - -28 0 +38 0 * - Ed -  1e-007 1 1 0 - 1  10 0 0 1 - 2  19 2 0 0 1 - 2  20 3 0 0 1 - 6  19 2 0 - 6  20 3 0 - 0 - - 0101000 - -29 0 +39 0 * - Wi - - 0101000 - -19 0 -27 0 +18 0 +37 0 * - Fa - 0  1e-007 2 0 - 2  2 - 0101000 - +17 0 * - Ed -  1e-007 1 1 0 - 1  11 0 0 1 - 2  21 4 0 0 1 - 2  22 5 0 0 1 - 6  21 4 0 - 6  22 5 0 - 0 - - 0101000 - -24 0 +34 0 * - Ed -  1e-007 1 1 0 - 1  12 0 0 1 - 2  23 4 0 0 1 - 2  24 3 0 0 1 - 6  23 4 0 - 6  24 3 0 - 0 - - 0101000 - -26 0 +36 0 * - Wi - - 0101000 - -15 0 -23 0 +14 0 +33 0 * - Fa - 0  1e-007 4 0 - 2  4 - 0101000 - +13 0 * - Wi - - 0101000 - -32 0 -15 0 +22 0 +19 0 * - Fa - 0  1e-007 5 0 - 2  5 - 0101000 - +11 0 * - Wi - - 0101000 - -35 0 -14 0 +25 0 +18 0 * - Fa - 0  1e-007 3 0 - 2  3 - 0101000 - +9 0 * - Sh - - 0101100 - -30 0 +20 0 -16 0 +12 0 -10 0 +8 0 * - So - - 0100000 - +7 0 * - CS - - 0101000 - +6 3 * - Ve - 1e-007 - 1 0 0 - 0 0 - - 0101101 - * - Ve - 1e-007 - 2 0 0 - 0 0 - - 0101101 - * - Ed -  1e-007 1 1 0 - 1  13 0 0 1 - 5  1 0 - 0 - - 0101000 - +4 0 -3 0 * - Co - - 1100000 - +5 0 +2 0 * - - +1 0 - 0 -@endverbatim \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/draw_test_harness/draw_test_harness.md opencascade-7.5.1+dfsg1/dox/user_guides/draw_test_harness/draw_test_harness.md --- opencascade-7.4.1+dfsg1/dox/user_guides/draw_test_harness/draw_test_harness.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/draw_test_harness/draw_test_harness.md 2021-02-02 08:51:56.000000000 +0000 @@ -6979,7 +6979,7 @@ The new algorithm of Boolean operations avoids a large number of weak points and limitations presented in the old Boolean operation algorithm. It also provides wider range of options and diagnostics. -The algorithms of Boolean component are fully described in the @ref occt_algorithms_1 "Boolean Operations" of boolean operation user guide. +The algorithms of Boolean component are fully described in the @ref specification__boolean_operations "Boolean Operations" of boolean operation user guide. For the Draw commands to perform operations in Boolean component, read the dedicated section @ref occt_draw_bop "Boolean operations commands" @@ -8333,7 +8333,7 @@ @section occt_draw_bop Boolean Operations Commands This chapter describes existing commands of Open CASCADE Draw Test Harness that are used for performing, analyzing, debugging the algorithm in Boolean Component. -See @ref occt_user_guides__boolean_operations "Boolean operations" user's guide for the description of these algorithms. +See @ref specification__boolean_operations "Boolean operations" user's guide for the description of these algorithms. @subsection occt_draw_bop_two Boolean Operations on two operands @@ -8419,7 +8419,7 @@ The modern Boolean Operations algorithm available in Open CASCADE Technology is capable of performing a Boolean Operations not only on two shapes, but on arbitrary number of shapes. In terms of Boolean Operations these arguments are divided on two groups **Objects** and **Tools**. The meaning of these groups is similar to the single object and tool of Boolean Operations on two shapes. -The Boolean operations are based on the General Fuse operation (see @ref occt_algorithms_7 "General Fuse algorithm") which splits all input shapes basing on the intersection results. +The Boolean operations are based on the General Fuse operation (see @ref specification__boolean_7 "General Fuse algorithm") which splits all input shapes basing on the intersection results. Depending on the type of Boolean operation the BOP algorithm choses the necessary splits of the arguments. @subsection occt_draw_bop_general_com General commands for working with multiple arguments @@ -8542,7 +8542,7 @@ There is an alternative way to build the result of Boolean operation using the **buildbop** command, which should be run after any other building command, such as **bbuild** or **bbop** or **bsplit**. The command has the following features: -* It is designed to work on open solids and thus uses the alternative approach for building the results (see @ref occt_algorithms_bop_on_opensolids "BOP on open solids" chapter of Boolean operations user guide). +* It is designed to work on open solids and thus uses the alternative approach for building the results (see @ref specification__boolean_bop_on_opensolids "BOP on open solids" chapter of Boolean operations user guide). * It allows changing the groups of Objects and Tools of the operation (even excluding some of the arguments is possible). * History information for solids will be lost. @@ -8596,7 +8596,7 @@ @subsubsection occt_draw_bop_build_CB Cells Builder -See the @ref occt_algorithms_10c_Cells_1 "Cells Builder Usage" for the Draw usage of Cells Builder algorithm. +See the @ref specification__boolean_10c_Cells_1 "Cells Builder Usage" for the Draw usage of Cells Builder algorithm. @subsubsection occt_draw_bop_build_API Building result through API @@ -10990,8 +10990,6 @@ **Example:** ~~~~~ - -~~~~~ # split surface with name "su" DT_SplitSurface res su 0.1 1 ==> single surf @@ -11003,7 +11001,6 @@ ==> transfert resultat ==> res1_1_1 res1_2_1 res1_3_1 res1_4_1 res1_5_1 res1_6_1 ~~~~~ -~~~~~ @subsubsection occt_draw_9_2_8 DT_ToBspl @@ -11733,4 +11730,3 @@ Draw[]> set env(CSF_MyDrawPluginDefaults) /users/test Draw[]> pload -MyDrawPlugin ALL ~~~~ - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/foundation_classes/foundation_classes.md opencascade-7.5.1+dfsg1/dox/user_guides/foundation_classes/foundation_classes.md --- opencascade-7.4.1+dfsg1/dox/user_guides/foundation_classes/foundation_classes.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/foundation_classes/foundation_classes.md 2021-02-02 08:51:56.000000000 +0000 @@ -5,178 +5,210 @@ @section occt_fcug_1 Introduction -This manual explains how to use Open CASCADE Technology (**OCCT**) Foundation Classes. It provides basic documentation on foundation classes. For advanced information on foundation classes and their applications, see our E-learning & Training offerings. +This manual explains how to use Open CASCADE Technology (**OCCT**) Foundation Classes. +It provides basic documentation on foundation classes. -Foundation Classes provide a variety of general-purpose services such as automated dynamic memory management (manipulation of objects by handle), collections, exception handling, genericity by down-casting and plug-in creation. +Foundation Classes provide a variety of general-purpose services such as automated dynamic memory management (manipulation of objects by handle), collections, exception handling, genericity by down-casting and plug-in creation. Foundation Classes include the following: ### Root Classes -Root classes are the basic data types and classes on which all the other classes are built. They provide: +Root classes are the basic data types and classes on which all the other classes are built. +They provide: * fundamental types such as Boolean, Character, Integer or Real, - * safe handling of dynamically created objects, ensuring automatic deletion of unreferenced objects (see *Standard_Transient* class), - * configurable optimized memory manager increasing the performance of applications that intensively use dynamically created objects, - * extended run-time type information (RTTI) mechanism facilitating the creation of complex programs, + * safe handling of dynamically created objects, ensuring automatic deletion of unreferenced objects (see *Standard_Transient* class), + * standard and custom memory allocators, + * extended run-time type information (RTTI) mechanism facilitating the creation of complex programs, * management of exceptions, * encapsulation of C++ streams. -Root classes are mainly implemented in *Standard* and *MMgt* packages. +Root classes are mainly implemented in *Standard* package. ### Strings -Strings are classes that handle dynamically sized sequences of characters based on both ASCII (normal 8-bit character type) and Unicode (16-bit character type). -Strings may also be manipulated by handles, and consequently be shared. -Strings are implemented in the *TCollection* package. +Strings are classes that handle dynamically sized sequences of characters based on UTF-8 and UTF-16 encodings. +Strings may also be manipulated by handles, and consequently be shared. +Strings are implemented in the *TCollection* package. ### Collections -Collections are the classes that handle dynamically sized aggregates of data. -Collection classes are *generic*, that is, they define a structure and algorithms allowing to hold a variety of objects which do not necessarily inherit from a unique root class (similarly to C++ templates). When you need to use a collection of a given type of object, you must *instantiate* it for this specific type of element. Once this declaration is compiled, all functions available on the generic collection are available on your *instantiated class*. +Collections are the classes that handle dynamically sized aggregates of data. +Collection classes are *generic* and rely on C++ templates. -Collections include a wide range of generic classes such as run-time sized arrays, lists, stacks, queues, sets and hash maps. -Collections are implemented in the *TCollection* and *NCollection* packages. +Collections include a wide range of generic classes such as run-time sized arrays, lists, stacks, queues, sets and hash maps. +Collections are implemented in the *TCollection* and *NCollection* packages. ### Collections of Standard Objects -The *TColStd* package provides frequently used instantiations of generic classes from the *TCollection* package with objects from the *Standard* package or strings from the *TCollection* package. +The *TColStd* package provides frequently used instantiations of generic classes from the *TCollection* package with objects from the *Standard* package or strings from the *TCollection* package. ### Vectors and Matrices -These classes provide commonly used mathematical algorithms and basic calculations (addition, multiplication, transposition, inversion, etc.) involving vectors and matrices. +These classes provide commonly used mathematical algorithms and basic calculations (addition, multiplication, transposition, inversion, etc.) involving vectors and matrices. ### Primitive Geometric Types -Open CASCADE Technology primitive geometric types are a STEP-compliant implementation of basic geometric and algebraic entities. -They provide: - * Descriptions of elementary geometric shapes: - * Points, - * Vectors, - * Lines, - * Circles and conics, - * Planes and elementary surfaces, - * Positioning of these shapes in space or in a plane by means of an axis or a coordinate system, - * Definition and application of geometric transformations to these shapes: - * Translations - * Rotations - * Symmetries - * Scaling transformations - * Composed transformations - * Tools (coordinates and matrices) for algebraic computation. - +Open CASCADE Technology primitive geometric types are a STEP-compliant implementation of basic geometric and algebraic entities. +They provide: + * Descriptions of elementary geometric shapes: + * Points, + * Vectors, + * Lines, + * Circles and conics, + * Planes and elementary surfaces, + * Positioning of these shapes in space or in a plane by means of an axis or a coordinate system, + * Definition and application of geometric transformations to these shapes: + * Translations + * Rotations + * Symmetries + * Scaling transformations + * Composed transformations + * Tools (coordinates and matrices) for algebraic computation. + ### Common Math Algorithms -Open CASCADE Technology common math algorithms provide a C++ implementation of the most frequently used mathematical algorithms. -These include: +Open CASCADE Technology common math algorithms provide a C++ implementation of the most frequently used mathematical algorithms. +These include: * Algorithms to solve a set of linear algebraic equations, - * Algorithms to find the minimum of a function of one or more independent variables, - * Algorithms to find roots of one, or of a set, of non-linear equations, - * Algorithms to find the eigen-values and eigen-vectors of a square matrix. + * Algorithms to find the minimum of a function of one or more independent variables, + * Algorithms to find roots of one, or of a set, of non-linear equations, + * Algorithms to find the eigen-values and eigen-vectors of a square matrix. ### Exceptions -A hierarchy of commonly used exception classes is provided, all based on class Failure, the root of exceptions. -Exceptions describe exceptional situations, which can arise during the execution of a function. With the raising of an exception, the normal course of program execution is abandoned. The execution of actions in response to this situation is called the treatment of the exception. +A hierarchy of commonly used exception classes is provided, all based on class Standard_Failure, the root of exceptions. +Exceptions describe exceptional situations, which can arise during the execution of a function. +With the raising of an exception, the normal course of program execution is abandoned. +The execution of actions in response to this situation is called the treatment of the exception. ### Quantities -These are various classes supporting date and time information and fundamental types representing most physical quantities such as length, area, volume, mass, density, weight, temperature, pressure etc. +These are various classes supporting date and time information. ### Application services -Foundation Classes also include implementation of several low-level services that facilitate the creation of customizable and user-friendly applications with Open CASCADE Technology. These include: - * Unit conversion tools, providing a uniform mechanism for dealing with quantities and associated physical units: check unit compatibility, perform conversions of values between different units and so on (see package *UnitsAPI*); - * Basic interpreter of expressions that facilitates the creation of customized scripting tools, generic definition of expressions and so on (see package *ExprIntrp*); - * Tools for dealing with configuration resource files (see package *Resource*) and customizable message files (see package *Message*), making it easy to provide a multi-language support in applications; - * Progress indication and user break interfaces, giving a possibility even for low-level algorithms to communicate with the user in a universal and convenient way. - +Foundation Classes also include implementation of several low-level services that facilitate the creation of customizable and user-friendly applications with Open CASCADE Technology. +These include: + * Unit conversion tools, providing a uniform mechanism for dealing with quantities and associated physical units: + check unit compatibility, perform conversions of values between different units and so on (see package *UnitsAPI*); + * Basic interpreter of expressions that facilitates the creation of customized scripting tools, generic definition of expressions and so on (see package *ExprIntrp*); + * Tools for dealing with configuration resource files (see package *Resource*) and customizable message files (see package *Message*), making it easy to provide a multi-language support in applications; + * Progress indication and user break interfaces, giving a possibility even for low-level algorithms to communicate with the user in a universal and convenient way. @section occt_fcug_2 Basics -This chapter deals with basic services such as library organization, persistence, data types, memory management, programming with handles, exception handling, genericity by downcasting and plug-in creation. - +This chapter deals with basic services such as library organization, persistence, data types, memory management, programming with handles, exception handling, genericity by downcasting and plug-in creation. @subsection occt_fcug_2_a Library organization This chapter introduces some basic concepts, which are used not only in Foundation Classes, but throughout the whole OCCT library. -@subsubsection occt_fcug_2_a_1 Modules and toolkits +@subsubsection occt_fcug_2_a_1 Modules and toolkits -The whole OCCT library is organized in a set of modules. The first module, providing most basic services and used by all other modules, is called Foundation Classes and described by this manual. +The whole OCCT library is organized in a set of modules. +The first module, providing most basic services and used by all other modules, is called Foundation Classes and described by this manual. -Every module consists primarily of one or several toolkits (though it can also contain executables, resource units etc.). Physically a toolkit is represented by a shared library (e.g. .so or .dll). The toolkit is built from one or several packages. +Every module consists primarily of one or several toolkits (though it can also contain executables, resource units etc.). +Physically a toolkit is represented by a shared library (e.g. .so or .dll). +The toolkit is built from one or several packages. @subsubsection occt_fcug_2_a_2 Packages -A **package** groups together a number of classes which have semantic links. For example, a geometry package would contain Point, Line, and Circle classes. A package can also contain enumerations, exceptions and package methods (functions). In practice, a class name is prefixed with the name of its package e.g. -*Geom_Circle*. -Data types described in a package may include one or more of the following data types: +A **package** groups together a number of classes which have semantic links. +For example, a geometry package would contain Point, Line, and Circle classes. +A package can also contain enumerations, exceptions and package methods (functions). +In practice, a class name is prefixed with the name of its package e.g. *Geom_Circle*. +Data types described in a package may include one or more of the following data types: * Enumerations * Object classes * Exceptions * Pointers to other object classes -Inside a package, two data types cannot bear the same name. +Inside a package, two data types cannot bear the same name. @figure{/user_guides/foundation_classes/images/foundation_classes_image003.png,"Contents of a package",420} -**Methods** are either **functions** or **procedures**. Functions return an object, whereas procedures only communicate by passing arguments. In both cases, when the transmitted object is an instance manipulated by a handle, its identifier is passed. There are three categories of methods: -* **Object constructor** Creates an instance of the described class. A class will have one or more object constructors with various different arguments or none. -* **Instance method** Operates on the instance which owns it. -* **Class method** Does not work on individual instances, only on the class itself. +**Methods** are either **functions** or **procedures**. +Functions return an object, whereas procedures only communicate by passing arguments. +In both cases, when the transmitted object is an instance manipulated by a handle, its identifier is passed. +There are three categories of methods: +* **Object constructor** Creates an instance of the described class. + A class will have one or more object constructors with various different arguments or none. +* **Instance method** Operates on the instance which owns it. +* **Class method** Does not work on individual instances, only on the class itself. @subsubsection occt_fcug_2_a_3 Classes -The fundamental software component in object-oriented software development is the class. A class is the implementation of a **data type**. It defines its **behavior** (the services offered by its functions) and its **representation** (the data structure of the class -- the fields, which store its data). +The fundamental software component in object-oriented software development is the class. +A class is the implementation of a **data type**. +It defines its **behavior** (the services offered by its functions) and its **representation** (the data structure of the class -- the fields, which store its data). -Classes fall into three categories: +Classes fall into three categories: * Ordinary classes. -* Abstract classes. An **abstract class** cannot be instantiated. The purpose of having such classes is to have a given behavior shared by a hierarchy of classes and dependent on the implementation of the descendants. This is a way of guaranteeing a certain base of inherited behavior common to all the classes based on a particular deferred class. -* Template classes. A **template class** offers a set of functional behaviors to manipulate other data types. Instantiation of a template class requires that a data type is given for its argument(s). +* Abstract classes. + An **abstract class** cannot be instantiated. + The purpose of having such classes is to have a given behavior shared by a hierarchy of classes and dependent on the implementation of the descendants. + This is a way of guaranteeing a certain base of inherited behavior common to all the classes based on a particular deferred class. +* Template classes. + A **template class** offers a set of functional behaviors to manipulate other data types. + Instantiation of a template class requires that a data type is given for its argument(s). @subsubsection occt_fcug_2_a_5 Inheritance -The purpose of inheritance is to reduce the development workload. The inheritance mechanism allows a new class to be declared already containing the characteristics of an existing class. This new class can then be rapidly specialized for the task in hand. This avoids the necessity of developing each component “from scratchâ€. -For example, having already developed a class *BankAccount* you could quickly specialize new classes: *SavingsAccount, LongTermDepositAccount, MoneyMarketAccount, RevolvingCreditAccount*, etc.... - -The corollary of this is that when two or more classes inherit from a parent (or ancestor) class, all these classes guarantee as a minimum the behavior of their parent (or ancestor). For example, if the parent class BankAccount contains the method Print which tells it to print itself out, then all its descendant classes guarantee to offer the same service. - -One way of ensuring the use of inheritance is to declare classes at the top of a hierarchy as being **abstract**. In such classes, the methods are not implemented. This forces the user to create a new class which redefines the methods. This is a way of guaranteeing a certain minimum of behavior among descendant classes. +The purpose of inheritance is to reduce the development workload. +The inheritance mechanism allows a new class to be declared already containing the characteristics of an existing class. +This new class can then be rapidly specialized for the task in hand. +This avoids the necessity of developing each component "from scratch". +For example, having already developed a class *BankAccount* you could quickly specialize new classes: *SavingsAccount, LongTermDepositAccount, MoneyMarketAccount, RevolvingCreditAccount*, etc.... + +The corollary of this is that when two or more classes inherit from a parent (or ancestor) class, all these classes guarantee as a minimum the behavior of their parent (or ancestor). +For example, if the parent class BankAccount contains the method Print which tells it to print itself out, then all its descendant classes guarantee to offer the same service. + +One way of ensuring the use of inheritance is to declare classes at the top of a hierarchy as being **abstract**. +In such classes, the methods are not implemented. +This forces the user to create a new class which redefines the methods. +This is a way of guaranteeing a certain minimum of behavior among descendant classes. @subsection occt_fcug_2_1 Data Types -An object-oriented language structures a system around data types rather than around the actions carried out on this data. In this context, an **object** is an **instance** of a data type and its definition determines how it can be used. Each data type is implemented by one or more classes, which make up the basic elements of the system. +An object-oriented language structures a system around data types rather than around the actions carried out on this data. +In this context, an **object** is an **instance** of a data type and its definition determines how it can be used. +Each data type is implemented by one or more classes, which make up the basic elements of the system. -The data types in Open CASCADE Technology fall into two categories: +The data types in Open CASCADE Technology fall into two categories: * Data types manipulated by handle (or reference) * Data types manipulated by value - + @figure{/user_guides/foundation_classes/images/foundation_classes_image004.png,"Manipulation of data types",420} - -A data type is implemented as a class. The class not only defines its data representation and the methods available on instances, but it also suggests how the instance will be manipulated. - * A variable of a type manipulated by value contains the instance itself. - * A variable of a type manipulated by handle contains a reference to the instance. -The first examples of types manipulated by values are the predefined **primitive types**: *Boolean, Character, Integer, Real*, etc. -A variable of a type manipulated by handle which is not attached to an object is said to be **null**. To reference an object, we instantiate the class with one of its constructors. For example, in C++: +A data type is implemented as a class. +The class not only defines its data representation and the methods available on instances, but it also suggests how the instance will be manipulated. + * A variable of a type manipulated by value contains the instance itself. + * A variable of a type manipulated by handle contains a reference to the instance. +The first examples of types manipulated by values are the predefined **primitive types**: *Boolean, Character, Integer, Real*, etc. + +A variable of a type manipulated by handle which is not attached to an object is said to be **null**. +To reference an object, we instantiate the class with one of its constructors. +For example, in C++: ~~~~~ -Handle(myClass) m = new myClass; +Handle(MyClass) anObject = new MyClass(); ~~~~~ -In Open CASCADE Technology, the Handles are specific classes that are used to safely manipulate objects allocated in the dynamic memory by reference, providing reference counting mechanism and automatic destruction of the object when it is not referenced. - - +In Open CASCADE Technology, the Handles are specific classes that are used to safely manipulate objects allocated in the dynamic memory by reference, +providing reference counting mechanism and automatic destruction of the object when it is not referenced. @subsubsection occt_fcug_2_1_1 Primitive Types -The primitive types are predefined in the language and they are **manipulated by value**. +The primitive types are predefined in the language and they are **manipulated by value**. -* **Boolean** is used to represent logical data. It may have only two values: *Standard_True* and *Standard_False*. -* **Character** designates any ASCII character. -* **ExtCharacter** is an extended character. -* **Integer** is a whole number. -* **Real** denotes a real number (i.e. one with whole and a fractional part, either of which may be null). -* **ShortReal** is a real with a smaller choice of values and memory size. -* **CString** is used for literal constants. -* **ExtString** is an extended string. -* **Address** represents a byte address of undetermined size. +* **Standard_Boolean** is used to represent logical data. + It may have only two values: *Standard_True* and *Standard_False*. +* **Standard_Character** designates any ASCII character. +* **Standard_ExtCharacter** is an extended character. +* **Standard_Integer** is a whole number. +* **Standard_Real** denotes a real number (i.e. one with whole and a fractional part, either of which may be null). +* **Standard_ShortReal** is a real with a smaller choice of values and memory size. +* **Standard_CString** is used for literal constants. +* **Standard_ExtString** is an extended string. +* **Standard_Address** represents a byte address of undetermined size. -The services offered by each of these types are described in the **Standard** Package. -The table below presents the equivalence existing between C++ fundamental types and OCCT primitive types. +The services offered by each of these types are described in the **Standard** Package. +The table below presents the equivalence existing between C++ fundamental types and OCCT primitive types. -**Table 1: Equivalence between C++ Types and OCCT Primitive Types** +**Table 1: Equivalence between C++ Types and OCCT Primitive Types** | C++ Types | OCCT Types | | :--------- | :----------- | @@ -185,57 +217,73 @@ | float | Standard_ShortReal | | bool | Standard_Boolean | | char | Standard_Character | -| char16_t | Standard_ExtCharacter | +| char16_t | Standard_Utf16Char | | char\* | Standard_CString | | void\* | Standard_Address | | char16_t\* | Standard_ExtString | -\* The types with asterisk are pointers. +\* The types with asterisk are pointers. -**Reminder of the classes listed above:** +**Reminder of the classes listed above:** -* **Standard_Integer** : fundamental type representing 32-bit integers yielding negative, positive or null values. *Integer* is implemented as a *typedef* of the C++ *int* fundamental type. As such, the algebraic operations +, -, *, / as well as the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on it. -* **Standard_Real** : fundamental type representing real numbers with finite precision and finite size. **Real** is implemented as a *typedef* of the C++ *double* (double precision) fundamental type. As such, the algebraic operations +, -, *, /, unary- and the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on reals. -* **Standard_ShortReal** : fundamental type representing real numbers with finite precision and finite size. *ShortReal* is implemented as a *typedef* of the C++ *float* (simple precision) fundamental type. As such, the algebraic operations +, -, *, /, unary- and the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on reals. -* **Standard_Boolean** : fundamental type representing logical expressions. It has two values: *false* and *true*. *Boolean* is implemented as a *typedef* of the C++ *bool* fundamental type. As such, the algebraic operations *and, or, xor* and *not* as well as equivalence relations == and != are defined on Booleans. -* **Standard_Character** : fundamental type representing the normalized ASCII character set. It may be assigned the values of the 128 ASCII characters. *Character* is implemented as a *typedef* of the C++ *char* fundamental type. As such, the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on characters using the order of the ASCII chart (ex: A B). -* **Standard_ExtCharacter** : fundamental type representing the Unicode character set. It is a 16-bit character type. *ExtCharacter* is implemented as a *typedef* of the C++ *char16_t* fundamental type. As such, the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on extended characters using the order of the UNICODE chart (ex: A B). -* **Standard_CString** : fundamental type representing string literals. A string literal is a sequence of UTF-8 (8 bits) code points enclosed in double quotes. *CString* is implemented as a *typedef* of the C++ *char* fundamental type. -* **Standard_Address** : fundamental type representing a generic pointer. *Address* is implemented as a *typedef* of the C++ *void* fundamental type. -* **Standard_ExtString** is a fundamental type representing string literals as sequences of Unicode (16 bits) characters. *ExtString* is implemented as a *typedef* of the C++ *char16_t* fundamental type. +* **Standard_Integer**: fundamental type representing 32-bit integers yielding negative, positive or null values. + *Integer* is implemented as a *typedef* of the C++ *int* fundamental type. + As such, the algebraic operations +, -, *, / as well as the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on it. +* **Standard_Real**: fundamental type representing real numbers with finite precision and finite size. + **Real** is implemented as a *typedef* of the C++ *double* (double precision) fundamental type. + As such, the algebraic operations +, -, *, /, unary- and the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on reals. +* **Standard_ShortReal**: fundamental type representing real numbers with finite precision and finite size. + *ShortReal* is implemented as a *typedef* of the C++ *float* (single precision) fundamental type. + As such, the algebraic operations +, -, *, /, unary- and the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on reals. +* **Standard_Boolean**: fundamental type representing logical expressions. + It has two values: *false* and *true*. + *Boolean* is implemented as a *typedef* of the C++ *bool* fundamental type. + As such, the algebraic operations *and, or, xor* and *not* as well as equivalence relations == and != are defined on Booleans. +* **Standard_Character**: fundamental type representing the UTF-8 character set. + *Character* is implemented as a *typedef* of the C++ *char* fundamental type. + As such, the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on characters using the order of the ASCII chart (ex: A B). +* **Standard_ExtCharacter**: fundamental type representing the UTF-16 character set. + It is a 16-bit character type. + *ExtCharacter* is implemented as a *typedef* of the C++ *char16_t* fundamental type. + As such, the ordering and equivalence relations <, <=, ==, !=, >=, > are defined on extended characters using the order of the UNICODE chart (ex: A B). +* **Standard_CString**: fundamental type representing string literals. + A string literal is a sequence of UTF-8 (8 bits) code points enclosed in double quotes. + *CString* is implemented as a *typedef* of the C++ *char* fundamental type. +* **Standard_Address**: fundamental type representing a generic pointer. + *Address* is implemented as a *typedef* of the C++ *void* fundamental type. +* **Standard_ExtString**: fundamental type representing string literals as sequences of Unicode (16 bits) characters. + *ExtString* is implemented as a *typedef* of the C++ *char16_t* fundamental type. @subsubsection occt_fcug_2_1_2 Types manipulated by value -There are three categories of types which are manipulated by value: +There are three categories of types which are manipulated by value: * Primitive types * Enumerated types * Types defined by classes not inheriting from *Standard_Transient*, whether directly or not. -Types which are manipulated by value behave in a more direct fashion than those manipulated by handle and thus can be expected to perform operations faster, but they cannot be stored independently in a file. +Types which are manipulated by value behave in a more direct fashion than those manipulated by handle and thus can be expected to perform operations faster, but they cannot be stored independently in a file. @figure{/user_guides/foundation_classes/images/foundation_classes_image005.png,"Manipulation of a data type by value",420} @subsubsection occt_fcug_2_1_3 Types manipulated by reference (handle) -These are types defined by classes inheriting from the *Transient* class. - +These are types defined by classes inheriting from the *Standard_Transient* class. + @figure{/user_guides/foundation_classes/images/foundation_classes_image006.png,"Manipulation of a data type by reference",420} @subsubsection occt_fcug_2_1_4 When is it necessary to use a handle? -When you design an object, it can be difficult to choose how to manipulate that -object: by value or by handle. The following ideas can help you to make up your mind: - -* If your object may have a long lifetime within the application and you want to make multiple -references to it, it would be preferable to manipulate this object with a handle. The memory for the -object will be allocated on the heap. The handle which points to that memory is a light object which -can be rapidly passed in argument. This avoids the penalty of copying a large object. -* If your object will have a limited lifetime, for example, used within a single algorithm, it would -be preferable to manipulate this object by value, non-regarding its size, because this object is -allocated on the stack and the allocation and de-allocation of memory is extremely rapid, which -avoids the implicit calls to *new* and *delete* occasioned by allocation on the heap. -* Finally, if an object will be created only once during, but will exist throughout the lifetime of -the application, the best choice may be a class manipulated by handle or a value declared as a -global variable. - +When you design an object, it can be difficult to choose how to manipulate that object: by value or by handle. +The following ideas can help you to make up your mind: + * If your object may have a long lifetime within the application and you want to make multiple references to it, + it would be preferable to manipulate this object with a handle. + The memory for the object will be allocated on the heap. + The handle which points to that memory is a light object which can be rapidly passed in argument. + This avoids the penalty of copying a large object. + * If your object will have a limited lifetime, for example, used within a single algorithm, + it would be preferable to manipulate this object by value, non-regarding its size, + because this object is allocated on the stack and the allocation and de-allocation of memory is extremely rapid, + which avoids the implicit calls to *new* and *delete* occasioned by allocation on the heap. + * Finally, if an object will be created only once during, but will exist throughout the lifetime of the application, + the best choice may be a class manipulated by handle or a value declared as a global variable. @subsection occt_fcug_2_2 Programming with Handles @@ -243,21 +291,22 @@ A handle is OCCT implementation of a smart pointer. Several handles can reference the same object. -Also, a single handle may reference several objects, but only one at a time. -To have access to the object it refers to, the handle must be de-referenced just as with a C++ pointer. +Also, a single handle may reference several objects, but only one at a time. +To have access to the object it refers to, the handle must be de-referenced just as with a C++ pointer. #### Organization of Classes -Class *Standard_Transient* is a root of a big hierarchy of OCCT classes that are said to be operable by handles. It provides a reference counter field, inherited by all its descendant classes, that is used by associated *Handle()* classes to track a number of handles pointing to this instance of the object. +Class *Standard_Transient* is a root of a big hierarchy of OCCT classes that are said to be operable by handles. +It provides a reference counter field, inherited by all its descendant classes, that is used by associated *Handle()* classes to track a number of handles pointing to this instance of the object. Objects of classes derived (directly or indirectly) from *Transient*, are normally allocated in dynamic memory using operator **new**, and manipulated by handle. Handle is defined as template class *opencascade::handle<>*. -Open CASCADE Technology provides preprocessor macro *Handle()* that is historically used throughout OCCT code to name a handle: +Open CASCADE Technology provides preprocessor macro *Handle()* that is historically used throughout OCCT code to name a handle: ~~~~~{.cpp} Handle(Geom_Line) aLine; // "Handle(Geom_Line)" is expanded to "opencascade::handle" ~~~~~ -In addition, for standard OCCT classes additional *typedef* is defined for a handle, as the name of a class prefixed by *Handle_*. +In addition, for most OCCT classes additional *typedef* is defined for a handle, as the name of a class prefixed by *Handle_*. For instance, the above example can be also coded as: ~~~~~{.cpp} Handle_Geom_Line aLine; // "Handle_Geom_Line" is typedef to "opencascade::handle" @@ -265,22 +314,25 @@ #### Using a Handle +A handle is characterized by the object it references. -A handle is characterized by the object it references. - -Before performing any operation on a transient object, you must declare the handle. For example, if Point and Line are two transient classes from the Geom package, you would write: +Before performing any operation on a transient object, you must declare the handle. +For example, if Point and Line are two transient classes from the Geom package, you would write: ~~~~~ -Handle(Geom_Point) p1, p2; +Handle(Geom_Point) p1, p2; ~~~~~ -Declaring a handle creates a null handle that does not refer to any object. The handle may be checked to be null by its method *IsNull()*. To nullify a handle, use method *Nullify()*. +Declaring a handle creates a null handle that does not refer to any object. +The handle may be checked to be null by its method *IsNull()*. +To nullify a handle, use method *Nullify()*. -To initialize a handle, either a new object should be created or the value of another handle can be assigned to it, on condition that their types are compatible. +To initialize a handle, either a new object should be created or the value of another handle can be assigned to it, on condition that their types are compatible. -**Note** that handles should only be used for object sharing. For all local operations, it is advisable to use classes manipulated by values. +**Note** that handles should only be used for object sharing. +For all local operations, it is advisable to use classes manipulated by values. @subsubsection occt_fcug_2_2_2 Type Management -Open CASCADE Technology provides a means to describe the hierarchy of data types in a generic way, with a possibility to check the exact type of the given object at run-time (similarly to C++ RTTI). +Open CASCADE Technology provides a means to describe the hierarchy of data types in a generic way, with a possibility to check the exact type of the given object at run-time (similarly to C++ RTTI). To enable this feature, a class declaration should include the declaration of OCCT RTTI. Header *Standard_Type.hxx* provides two variants of preprocessor macros facilitating this: @@ -332,36 +384,42 @@ #### Type Conformity -The type used in the declaration of a handle is the static type of the object, the type seen by the compiler. A handle can reference an object instantiated from a subclass of its static type. Thus, the dynamic type of an object (also called the actual type of an object) can be a descendant of the type which appears in the handle declaration through which it is manipulated. +The type used in the declaration of a handle is the static type of the object, the type seen by the compiler. +A handle can reference an object instantiated from a subclass of its static type. +Thus, the dynamic type of an object (also called the actual type of an object) can be a descendant of the type which appears in the handle declaration through which it is manipulated. -Consider the class *CartesianPoint*, a sub-class of *Point*; the rule of type conformity can be illustrated as follows: +Consider the class *Geom_CartesianPoint*, a sub-class of *Geom_Point*; the rule of type conformity can be illustrated as follows: ~~~~~ -Handle (Geom_Point) p1; -Handle (Geom_CartesianPoint) p2; -p2 = new Geom_CartesianPoint; -p1 = p2; // OK, the types are compatible +Handle(Geom_Point) aPnt1; +Handle(Geom_CartesianPoint) aPnt2; +aPnt2 = new Geom_CartesianPoint(); +aPnt1 = aPnt2; // OK, the types are compatible ~~~~~ - -The compiler sees p1 as a handle to *Point* though the actual object referenced by *p1* is of the *CartesianPoint* type. +The compiler sees *aPnt1* as a handle to *Geom_Point* though the actual object referenced by *aPnt1* is of the *Geom_CartesianPoint* type. #### Explicit Type Conversion -According to the rule of type conformity, it is always possible to go up the class hierarchy through successive assignments of handles. On the other hand, assignment does not authorize you to go down the hierarchy. Consequently, an explicit type conversion of handles is required. - -A handle can be converted explicitly into one of its sub-types if the actual type of the referenced object is a descendant of the object used to cast the handle. If this is not the case, the handle is nullified (explicit type conversion is sometimes called a “safe castâ€). Consider the example below. +According to the rule of type conformity, it is always possible to go up the class hierarchy through successive assignments of handles. +On the other hand, assignment does not authorize you to go down the hierarchy. +Consequently, an explicit type conversion of handles is required. + +A handle can be converted explicitly into one of its sub-types if the actual type of the referenced object is a descendant of the object used to cast the handle. +If this is not the case, the handle is nullified (explicit type conversion is sometimes called a "safe cast"). +Consider the example below. ~~~~~~ -Handle (Geom_Point) p1; -Handle (Geom_CartesianPoint) p2, p3; -p2 = new Geom_CartesianPoint; -p1 = p2; // OK, standard assignment -p3 = Handle (Geom_CartesianPoint)::DownCast (p1); -// OK, the actual type of p1 is CartesianPoint, although the static type of the handle is Point +Handle(Geom_Point) aPnt1; +Handle(Geom_CartesianPoint) aPnt2, aPnt3; +aPnt2 = new Geom_CartesianPoint(); +aPnt1 = aPnt2; // OK, standard assignment +aPnt3 = Handle(Geom_CartesianPoint)::DownCast (aPnt1); +// OK, the actual type of aPnt1 is Geom_CartesianPoint, although the static type of the handle is Geom_Point ~~~~~~ -If conversion is not compatible with the actual type of the referenced object, the handle which was “cast†becomes null (and no exception is raised). So, if you require reliable services defined in a sub-class of the type seen by the handle (static type), write as follows: +If conversion is not compatible with the actual type of the referenced object, the handle which was "cast" becomes null (and no exception is raised). +So, if you require reliable services defined in a sub-class of the type seen by the handle (static type), write as follows: ~~~~~~ void MyFunction (const Handle(A) & a) @@ -375,99 +433,113 @@ } } ~~~~~~ -Downcasting is used particularly with collections of objects of different types; however, these objects should inherit from the same root class. +Downcasting is used particularly with collections of objects of different types; however, these objects should inherit from the same root class. -For example, with a sequence of transient objects *SequenceOfTransient* and two classes A and B that both inherit from *Standard_Transient*, you get the following syntax: +For example, with a sequence of transient objects *TColStd_SequenceOfTransient* and two classes A and B that both inherit from *Standard_Transient*, you get the following syntax: ~~~~~ -Handle (A) a; -Handle (B) b; -Handle (Standard_Transient) t; -SequenceOfTransient s; -a = new A; -s.Append (a); -b = new B; -s.Append (b); -t = s.Value (1); +Handle(A) a; +Handle(B) b; +Handle(Standard_Transient) t; +TColStd_SequenceOfTransient aSeq; +a = new A(); +aSeq.Append (a); +b = new B(); +aSeq.Append (b); +t = aSeq.Value (1); // here, you cannot write: // a = t; // ERROR ! // so you downcast: a = Handle (A)::Downcast (t) -if (! a.IsNull()) { - // types are compatible, you can use a +if (!a.IsNull()) +{ + // types are compatible, you can use a } -else { - // the types are incompatible +else +{ + // the types are incompatible } ~~~~~ -@subsubsection occt_fcug_2_2_3 Using Handles to Create Objects +@subsubsection occt_fcug_2_2_3 Using Handles to Create Objects -To create an object which is manipulated by handle, declare the handle and initialize it with the standard C++ **new** operator, immediately followed by a call to the constructor. The constructor can be any of those specified in the source of the class from which the object is instanced. +To create an object which is manipulated by handle, declare the handle and initialize it with the standard C++ **new** operator, immediately followed by a call to the constructor. +The constructor can be any of those specified in the source of the class from which the object is instanced. ~~~~~ -Handle (Geom_CartesianPoint) p; -p = new Geom_CartesianPoint (0, 0, 0); +Handle(Geom_CartesianPoint) aPnt; +aPnt = new Geom_CartesianPoint (0, 0, 0); ~~~~~ -Unlike for a pointer, the **delete** operator does not work on a handle; the referenced object is automatically destroyed when no longer in use. +Unlike for a pointer, the **delete** operator does not work on a handle; the referenced object is automatically destroyed when no longer in use. @subsubsection occt_fcug_2_2_4 Invoking Methods -Once you have a handle to an object, you can use it like a pointer in C++. To invoke a method which acts on the referenced object, you translate this method by the standard *arrow* operator, or alternatively, by function call syntax when this is available. +Once you have a handle to an object, you can use it like a pointer in C++. +To invoke a method which acts on the referenced object, you translate this method by the standard *arrow* operator, or alternatively, by function call syntax when this is available. -To test or to modify the state of the handle, the method is translated by the *dot* operator. -The example below illustrates how to access the coordinates of an (optionally initialized) point object: +To test or to modify the state of the handle, the method is translated by the *dot* operator. +The example below illustrates how to access the coordinates of an (optionally initialized) point object: ~~~~~ -Handle (Geom_CartesianPoint) centre; +Handle(Geom_CartesianPoint) aCentre; Standard_Real x, y, z; -if (centre.IsNull()) { - centre = new PGeom_CartesianPoint (0, 0, 0); +if (aCentre.IsNull()) +{ + aCentre = new PGeom_CartesianPoint (0, 0, 0); } -centre->Coord(x, y, z); +aCentre->Coord (x, y, z); ~~~~~ -The example below illustrates how to access the type object of a Cartesian point: +The example below illustrates how to access the type object of a Cartesian point: ~~~~~ -Handle(Standard_Transient) p = new Geom_CartesianPoint(0.,0.,0.); -if ( p->DynamicType() == STANDARD_TYPE(Geom_CartesianPoint) ) - cout << ;Type check OK; << endl; -else - cout << ;Type check FAILED; << endl; +Handle(Standard_Transient) aPnt = new Geom_CartesianPoint (0., 0., 0.); +if (aPnt->DynamicType() == STANDARD_TYPE(Geom_CartesianPoint)) +{ + std::cout << "Type check OK\n"; +} +else +{ + std::cout << "Type check FAILED\n"; +} ~~~~~ -*NullObject* exception will be raised if a field or a method of an object is accessed via a *Null* handle. +*Standard_NullObject* exception will be raised if a field or a method of an object is accessed via a *Null* handle. #### Invoking Class Methods -A class method is called like a static C++ function, i.e. it is called by the name of the class of which it is a member, followed by the “::†operator and the name of the method. +A class method is called like a static C++ function, i.e. it is called by the name of the class of which it is a member, followed by the “::†operator and the name of the method. For example, we can find the maximum degree of a Bezier curve: ~~~~~ -Standard_Integer n; -n = Geom_BezierCurve::MaxDegree(); +Standard_Integer aDegree = Geom_BezierCurve::MaxDegree(); ~~~~~ @subsubsection occt_fcug_2_2_5 Handle deallocation -Before you delete an object, you must ensure it is no longer referenced. To reduce the programming load related to this management of object life, the delete function in Open CASCADE Technology is secured by a **reference counter** of classes manipulated by handle. A handle automatically deletes an object when it is no longer referenced. Normally you never call the delete operator explicitly on instances of subclasses of *Standard_Transient*. - -When a new handle to the same object is created, the reference counter is incremented. When the handle is destroyed, nullified, or reassigned to another object, that counter is decremented. The object is automatically deleted by the handle when reference counter becomes 0. +Before you delete an object, you must ensure it is no longer referenced. +To reduce the programming load related to this management of object life, the delete function in Open CASCADE Technology is secured by a **reference counter** of classes manipulated by handle. +A handle automatically deletes an object when it is no longer referenced. +Normally you never call the delete operator explicitly on instances of subclasses of *Standard_Transient*. + +When a new handle to the same object is created, the reference counter is incremented. +When the handle is destroyed, nullified, or reassigned to another object, that counter is decremented. +The object is automatically deleted by the handle when reference counter becomes 0. -The principle of allocation can be seen in the example below. +The principle of allocation can be seen in the example below. ~~~~~ ... { -Handle (TColStd_HSequenceOfInteger) H1 = new TColStd_HSequenceOfInteger; + Handle(TColStd_HSequenceOfInteger) H1 = new TColStd_HSequenceOfInteger(); // H1 has one reference and corresponds to 48 bytes of memory { - Handle (TColStd_HSequenceOfInteger) H2; + Handle(TColStd_HSequenceOfInteger) H2; H2 = H1; // H1 has two references - if (argc == 3) { - Handle (TColStd_HSequenceOfInteger) H3; + if (argc == 3) + { + Handle(TColStd_HSequenceOfInteger) H3; H3 = H1; // Here, H1 has three references ... @@ -476,232 +548,284 @@ } // Here, H1 has 1 reference } -// Here, H1 has no reference and the referred TColStd_HSequenceOfInteger object is deleted. +// Here, H1 has no reference and the referred TColStd_HSequenceOfInteger object is deleted. ~~~~~ You can easily cast a reference to the handle object to void* by defining the following: ~~~~ - void *pointer; - Handle(Some_class) aHandle; - // Here only a pointer will be copied - Pointer = &aHandle; - // Here the Handle object will be copied - aHandle = * (Handle(Some_Class) *)pointer; + void* aPointer; + Handle(Some_Class) aHandle; + // Here only a pointer will be copied + aPointer = &aHandle; + // Here the Handle object will be copied + aHandle = *(Handle(Some_Class)*)aPointer; ~~~~ +@subsubsection occt_fcug_2_2_6 Cycles -@subsubsection occt_fcug_2_2_6 Cycles +Cycles appear if two or more objects reference each other by handles (stored as fields). +In this condition automatic destruction will not work. -Cycles appear if two or more objects reference each other by handles (stored as fields). In this condition automatic destruction will not work. +Consider for example a graph, whose objects (primitives) have to know the graph object to which they belong, i.e. a primitive must have a reference to complete graph object. +If both primitives and the graph are manipulated by handle and they refer to each other by keeping a handle as a field, the cycle appears. -Consider for example a graph, whose objects (primitives) have to know the graph object to which they belong, i.e. a primitive must have a reference to complete graph object. If both primitives and the graph are manipulated by handle and they refer to each other by keeping a handle as a field, the cycle appears. +The graph object will not be deleted when the last handle to it is destructed in the application, since there are handles to it stored inside its own data structure (primitives). -The graph object will not be deleted when the last handle to it is destructed in the application, since there are handles to it stored inside its own data structure (primitives). - -There are two approaches how to avoid such situation: - * Use C++ pointer for one kind of references, e.g. from a primitive to the graph - * Nullify one set of handles (e.g. handles to a graph in primitives) when a graph object needs to be destroyed +There are two approaches how to avoid such situation: + * Use C++ pointer for one kind of references, e.g. from a primitive to the graph + * Nullify one set of handles (e.g. handles to a graph in primitives) when a graph object needs to be destroyed @subsection occt_fcug_2_3 Memory Management -In a work session, geometric modeling applications create and delete a considerable number of C++ objects allocated in the dynamic memory (heap). In this context, performance of standard functions for allocating and deallocating memory may be not sufficient. For this reason, Open CASCADE Technology employs a specialized memory manager implemented in the *Standard* package. +In a work session, geometric modeling applications create and delete a considerable number of C++ objects allocated in the dynamic memory (heap). +In this context, performance of standard functions for allocating and deallocating memory may be not sufficient. +For this reason, Open CASCADE Technology employs a specialized memory manager implemented in the *Standard* package. The Memory Manager is based on the following principles: * small memory arrays are grouped into clusters and then recycled (clusters are never released to the system), * large arrays are allocated and de-allocated through the standard functions of the system (the arrays are released to system when they are no longer used). -As a general rule, it is advisable to allocate memory through significant blocks. In this way, the user can work with blocks of contiguous data and it facilitates memory page manager processing. +As a general rule, it is advisable to allocate memory through significant blocks. +In this way, the user can work with blocks of contiguous data and it facilitates memory page manager processing. @subsubsection occt_fcug_2_3_1 Usage of Memory Manager -To allocate memory in a C code with Open CASCADE Technology memory manager, simply use method *Standard::Allocate()* instead of *malloc()* and method *Standard::Free()* instead of *free()*. In addition, method *Standard::Reallocate()* is provided to replace C function *realloc()*. +To allocate memory in a C code with Open CASCADE Technology memory manager, simply use method *Standard::Allocate()* instead of *malloc()* and method *Standard::Free()* instead of *free()*. +In addition, method *Standard::Reallocate()* is provided to replace C function *realloc()*. -In C++, operators *new()* and *delete()* for a class may be defined so as to allocate memory using *Standard::Allocate()* and free it using *Standard::Free()*. In that case all objects of that class and all inherited classes will be allocated using the OCCT memory manager. +In C++, operators *new()* and *delete()* for a class may be defined so as to allocate memory using *Standard::Allocate()* and free it using *Standard::Free()*. +In that case all objects of that class and all inherited classes will be allocated using the OCCT memory manager. Preprocessor macro *DEFINE_STANDARD_ALLOC* provided by header *Standard_DefineAlloc.hxx* defines *new()* and *delete()* in this way. -It is used for all OCCT classes (apart from a few exceptions) which thus are allocated using the OCCT memory manager. -Since operators *new()* and *delete()* are inherited, this is also true for any class derived from an OCCT class, for instance, for all classes derived from *Standard_Transient*. +It is used for all OCCT classes (apart from a few exceptions) which thus are allocated using the OCCT memory manager. +Since operators *new()* and *delete()* are inherited, this is also true for any class derived from an OCCT class, for instance, for all classes derived from *Standard_Transient*. -**Note** that it is possible (though not recommended unless really unavoidable) to redefine *new()* and *delete()* functions for a class inheriting *Standard_Transient*. If that is done, the method *Delete()* should be also redefined to apply operator *delete* to this pointer. This will ensure that appropriate *delete()* function will be called, even if the object is manipulated by a handle to a base class. +**Note** that it is possible (though not recommended unless really unavoidable) to redefine *new()* and *delete()* functions for a class inheriting *Standard_Transient*. +If that is done, the method *Delete()* should be also redefined to apply operator *delete* to this pointer. +This will ensure that appropriate *delete()* function will be called, even if the object is manipulated by a handle to a base class. @subsubsection occt_fcug_2_3_2 How to configure the Memory Manager -The OCCT memory manager may be configured to apply different optimization techniques to different memory blocks (depending on their size), or even to avoid any optimization and use C functions *malloc()* and *free()* directly. -The configuration is defined by numeric values of the following environment variables: - * *MMGT_OPT*: if set to 0 (default) every memory block is allocated in C memory heap directly (via *malloc()* and *free()* functions). In this case, all other options except for *MMGT_CLEAR* are ignored; if set to 1 the memory manager performs optimizations as described below; if set to 2, Intel ® TBB optimized memory manager is used. - * *MMGT_CLEAR*: if set to 1 (default), every allocated memory block is cleared by zeros; if set to 0, memory block is returned as it is. - * *MMGT_CELLSIZE*: defines the maximal size of blocks allocated in large pools of memory. Default is 200. - * *MMGT_NBPAGES*: defines the size of memory chunks allocated for small blocks in pages (operating-system dependent). Default is 1000. - * *MMGT_THRESHOLD*: defines the maximal size of blocks that are recycled internally instead of being returned to the heap. Default is 40000. - * *MMGT_MMAP*: when set to 1 (default), large memory blocks are allocated using memory mapping functions of the operating system; if set to 0, they will be allocated in the C heap by *malloc()*. +The OCCT memory manager may be configured to apply different optimization techniques to different memory blocks (depending on their size), +or even to avoid any optimization and use C functions *malloc()* and *free()* directly. +The configuration is defined by numeric values of the following environment variables: + * *MMGT_OPT*: + - if set to 0 (default) every memory block is allocated in C memory heap directly (via *malloc()* and *free()* functions). + In this case, all other options except for *MMGT_CLEAR* are ignored; + - if set to 1 the memory manager performs optimizations as described below; + - if set to 2, Intel ® TBB optimized memory manager is used. + * *MMGT_CLEAR*: if set to 1 (default), every allocated memory block is cleared by zeros; if set to 0, memory block is returned as it is. + * *MMGT_CELLSIZE*: defines the maximal size of blocks allocated in large pools of memory. Default is 200. + * *MMGT_NBPAGES*: defines the size of memory chunks allocated for small blocks in pages (operating-system dependent). Default is 1000. + * *MMGT_THRESHOLD*: defines the maximal size of blocks that are recycled internally instead of being returned to the heap. Default is 40000. + * *MMGT_MMAP*: when set to 1 (default), large memory blocks are allocated using memory mapping functions of the operating system; if set to 0, they will be allocated in the C heap by *malloc()*. @subsubsection occt_fcug_2_3_3 Optimization Techniques -When *MMGT_OPT* is set to 1, the following optimization techniques are used: - * Small blocks with a size less than *MMGT_CELLSIZE*, are not allocated separately. Instead, a large pools of memory are allocated (the size of each pool is *MMGT_NBPAGES* pages). Every new memory block is arranged in a spare place of the current pool. When the current memory pool is completely occupied, the next one is allocated, and so on. - -In the current version memory pools are never returned to the system (until the process finishes). However, memory blocks that are released by the method *Standard::Free()* are remembered in the free lists and later reused when the next block of the same size is allocated (recycling). - - * Medium-sized blocks, with a size greater than *MMGT_CELLSIZE* but less than *MMGT_THRESHOLD*, are allocated directly in the C heap (using *malloc()* and *free()*). When such blocks are released by the method *Standard::Free()* they are recycled just like small blocks. - -However, unlike small blocks, the recycled medium blocks contained in the free lists (i.e. released by the program but held by the memory manager) can be returned to the heap by method *Standard::Purge()*. - - * Large blocks with a size greater than *MMGT_THRESHOLD*, including memory pools used for small blocks, are allocated depending on the value of *MMGT_MMAP*: if it is 0, these blocks are allocated in the C heap; otherwise they are allocated using operating-system specific functions managing memory mapped files. Large blocks are returned to the system immediately when *Standard::Free()* is called. +When *MMGT_OPT* is set to 1, the following optimization techniques are used: + * Small blocks with a size less than *MMGT_CELLSIZE*, are not allocated separately. + Instead, a large pools of memory are allocated (the size of each pool is *MMGT_NBPAGES* pages). + Every new memory block is arranged in a spare place of the current pool. + When the current memory pool is completely occupied, the next one is allocated, and so on. + +In the current version memory pools are never returned to the system (until the process finishes). +However, memory blocks that are released by the method *Standard::Free()* are remembered in the free lists and later reused when the next block of the same size is allocated (recycling). + + * Medium-sized blocks, with a size greater than *MMGT_CELLSIZE* but less than *MMGT_THRESHOLD*, are allocated directly in the C heap (using *malloc()* and *free()*). + When such blocks are released by the method *Standard::Free()* they are recycled just like small blocks. + +However, unlike small blocks, the recycled medium blocks contained in the free lists (i.e. released by the program but held by the memory manager) can be returned to the heap by method *Standard::Purge()*. + + * Large blocks with a size greater than *MMGT_THRESHOLD*, including memory pools used for small blocks, are allocated depending on the value of *MMGT_MMAP*: + if it is 0, these blocks are allocated in the C heap; otherwise they are allocated using operating-system specific functions managing memory mapped files. + Large blocks are returned to the system immediately when *Standard::Free()* is called. @subsubsection occt_fcug_2_3_4 Benefits and drawbacks -The major benefit of the OCCT memory manager is explained by its recycling of small and medium blocks that makes an application work much faster when it constantly allocates and frees multiple memory blocks of similar sizes. In practical situations, the real gain on the application performance may be up to 50%. +The major benefit of the OCCT memory manager is explained by its recycling of small and medium blocks that makes an application work much faster +when it constantly allocates and frees multiple memory blocks of similar sizes. +In practical situations, the real gain on the application performance may be up to 50%. -The associated drawback is that recycled memory is not returned to the operating system during program execution. This may lead to considerable memory consumption and even be misinterpreted as a memory leak. To minimize this effect it is necessary to call the method *Standard::Purge* after the completion of memory-intensive operations. +The associated drawback is that recycled memory is not returned to the operating system during program execution. +This may lead to considerable memory consumption and even be misinterpreted as a memory leak. +To minimize this effect it is necessary to call the method *Standard::Purge* after the completion of memory-intensive operations. -The overhead expenses induced by the OCCT memory manager are: - * size of every allocated memory block is rounded up to 8 bytes (when *MMGT_OPT* is 0 (default), the rounding is defined by the CRT; the typical value for 32-bit platforms is 4 bytes) - * additional 4 bytes (or 8 on 64-bit platforms) are allocated in the beginning of every memory block to hold its size (or address of the next free memory block when recycled in free list) only when *MMGT_OPT* is 1. - -Note that these overheads may be greater or less than overheads induced by the C heap memory manager, so overall memory consumption may be greater in either optimized or standard modes, depending on circumstances. +The overhead expenses induced by the OCCT memory manager are: + * size of every allocated memory block is rounded up to 8 bytes + (when *MMGT_OPT* is 0 (default), the rounding is defined by the CRT; the typical value for 32-bit platforms is 4 bytes) + * additional 4 bytes (or 8 on 64-bit platforms) are allocated in the beginning of every memory block to hold its size + (or address of the next free memory block when recycled in free list) only when *MMGT_OPT* is 1. + +Note that these overheads may be greater or less than overheads induced by the C heap memory manager, +so overall memory consumption may be greater in either optimized or standard modes, depending on circumstances. -As a general rule, it is advisable to allocate memory through significant blocks. In this way, you can work with blocks of contiguous data, and processing is facilitated for the memory page manager. +As a general rule, it is advisable to allocate memory through significant blocks. +In this way, you can work with blocks of contiguous data, and processing is facilitated for the memory page manager. -OCCT memory manager uses mutex to lock access to free lists, therefore it may have less performance than non-optimized mode in situations when different threads often make simultaneous calls to the memory manager. -The reason is that modern implementations of *malloc()* and *free()* employ several allocation arenas and thus avoid delays waiting mutex release, which are possible in such situations. +OCCT memory manager uses mutex to lock access to free lists, therefore it may have less performance than non-optimized mode in situations +when different threads often make simultaneous calls to the memory manager. +The reason is that modern implementations of *malloc()* and *free()* employ several allocation arenas and thus avoid delays waiting mutex release, which are possible in such situations. -@subsection occt_fcug_2_4 Exceptions +@subsection occt_fcug_2_4 Exceptions -@subsubsection occt_fcug_2_4_1 Introduction +@subsubsection occt_fcug_2_4_1 Introduction -The behavior of any object is implemented by the methods, which were defined in its class declaration. The definition of these methods includes not only their signature (their programming interface) but also their domain of validity. +The behavior of any object is implemented by the methods, which were defined in its class declaration. +The definition of these methods includes not only their signature (their programming interface) but also their domain of validity. -This domain is expressed by **exceptions**. Exceptions are raised under various error conditions to protect software quality. +This domain is expressed by **exceptions**. +Exceptions are raised under various error conditions to protect software quality. -Exception handling provides a means of transferring control from a given point in a program being executed to an **exception handler** associated with another point previously executed. +Exception handling provides a means of transferring control from a given point in a program being executed to an **exception handler** associated with another point previously executed. -A method may raise an exception which interrupts its normal execution and transfers control to the handler catching this exception. +A method may raise an exception which interrupts its normal execution and transfers control to the handler catching this exception. -A hierarchy of commonly used exception classes is provided. The root class is *Standard_Failure* from the *Standard* package. So each exception inherits from *Standard_Failure* either directly or by inheriting from another exception. Exception classes list all exceptions, which can be raised by any OCCT function. +A hierarchy of commonly used exception classes is provided. +The root class is *Standard_Failure* from the *Standard* package. +So each exception inherits from *Standard_Failure* either directly or by inheriting from another exception. +Exception classes list all exceptions, which can be raised by any OCCT function. -Open CASCADE Technology also provides support for converting system signals (such as access violation or division by zero) to exceptions, so that such situations can be safely handled with the same uniform approach. +Open CASCADE Technology also provides support for converting system signals (such as access violation or division by zero) to exceptions, +so that such situations can be safely handled with the same uniform approach. -However, in order to support this functionality on various platforms, some special methods and workarounds are used. Though the implementation details are hidden and handling of OCCT exceptions is done basically in the same way as with C++, some peculiarities of this approach shall be taken into account and some rules must be respected. +However, in order to support this functionality on various platforms, some special methods and workarounds are used. +Though the implementation details are hidden and handling of OCCT exceptions is done basically in the same way as with C++, +some peculiarities of this approach shall be taken into account and some rules must be respected. -The following paragraphs describe recommended approaches for using exceptions when working with Open CASCADE Technology. +The following paragraphs describe recommended approaches for using exceptions when working with Open CASCADE Technology. -@subsubsection occt_fcug_2_4_2 Raising an Exception +@subsubsection occt_fcug_2_4_2 Raising an Exception -#### “C++ like†Syntax +#### "C++ like" Syntax -To raise an exception of a definite type method Raise() of the appropriate exception class shall be used. +The following example: ~~~~~ -Standard_DomainError::Raise(“Cannot cope with this conditionâ€); +throw Standard_DomainError ("Cannot cope with this condition"); ~~~~~ -raises an exception of *Standard_DomainError* type with the associated message “Cannot cope with this conditionâ€, the message being optional. This exception may be caught by a handler of a *Standard_DomainError* type as follows: +raises an exception of *Standard_DomainError* type with the associated message "Cannot cope with this condition", the message being optional. +This exception may be caught by a handler of a *Standard_DomainError* type as follows: ~~~~~ -try { +try +{ OCC_CATCH_SIGNALS // try block } -catch(const Standard_DomainError& ) { -// handle Standard_DomainError exceptions here +catch (const Standard_DomainError& ) +{ + // handle Standard_DomainError exceptions here } ~~~~~ #### Regular usage -Exceptions should not be used as a programming technique, to replace a “goto†statement for example, but as a way to protect methods against misuse. The caller must make sure its condition is such that the method can cope with it. +Exceptions should not be used as a programming technique, to replace a "goto" statement for example, but as a way to protect methods against misuse. +The caller must make sure its condition is such that the method can cope with it. -Thus, - * No exception should be raised during normal execution of an application. - * A method which may raise an exception should be protected by other methods allowing the caller to check on the validity of the call. - -For example, if you consider the *TCollection_Array1* class used with: - * *Value* function to extract an element - * *Lower* function to extract the lower bound of the array - * *Upper* function to extract the upper bound of the array. - -then, the *Value* function may be implemented as follows: +Thus, + * No exception should be raised during normal execution of an application. + * A method which may raise an exception should be protected by other methods allowing the caller to check on the validity of the call. + +For example, if you consider the *TCollection_Array1* class used with: + * *Value* function to extract an element; + * *Lower* function to extract the lower bound of the array; + * *Upper* function to extract the upper bound of the array. + +then, the *Value* function may be implemented as follows: ~~~~~ -Item TCollection_Array1::Value (const Standard_Integer&index) const +Item TCollection_Array1::Value (Standard_Integer theIndex) const { - // where r1 and r2 are the lower and upper bounds of the array - if(index < r1 || index > r2) { - OutOfRange::Raise(“Index out of range in Array1::Valueâ€); + // where myR1 and myR2 are the lower and upper bounds of the array + if (theIndex < myR1 || theIndex > myR2) + { + throw Standard_OutOfRange ("Index out of range in TCollection_Array1::Value"); } - return contents[index]; + return myContents[theIndex]; } ~~~~~ -Here validity of the index is first verified using the Lower and Upper functions in order to protect the call. -Normally the caller ensures the index being in the valid range before calling Value(). In this case the above implementation of *Value* is not optimal since the test done in *Value* is time-consuming and redundant. +Here validity of the index is first verified using the Lower and Upper functions in order to protect the call. +Normally the caller ensures the index being in the valid range before calling Value(). +In this case the above implementation of *Value* is not optimal since the test done in *Value* is time-consuming and redundant. -It is a widely used practice to include that kind of protections in a debug build of the program and exclude in release (optimized) build. To support this practice, the macros Raise_if() are provided for every OCCT exception class: +It is a widely used practice to include that kind of protections in a debug build of the program and exclude in release (optimized) build. +To support this practice, the macros Raise_if() are provided for every OCCT exception class: ~~~~~ -_Raise_if(condition, “Error messageâ€); +_Raise_if(condition, "Error message"); ~~~~~ -where *ErrorTypeName* is the exception type, *condition* is the logical expression leading to the raise of the exception, and *Error message* is the associated message. +where *ErrorTypeName* is the exception type, *condition* is the logical expression leading to the raise of the exception, and *Error message* is the associated message. -The entire call may be removed by defining one of the preprocessor symbols *No_Exception* or No_ at compile-time: +The entire call may be removed by defining one of the preprocessor symbols *No_Exception* or No_ at compile-time: ~~~~~ -#define No_Exception /* remove all raises */ +#define No_Exception // remove all raises ~~~~~ -Using this syntax, the *Value* function becomes: +Using this syntax, the *Value* function becomes: ~~~~~ -Item TCollection_Array1::Value (const Standard_Integer&index) const - { - Standard_OutOfRange_Raise_if(index < r1 || index > r2, “index out of range in Array1::Valueâ€); - return contents[index]; +Item TCollection_Array1::Value (Standard_Integer theIndex) const +{ + Standard_OutOfRange_Raise_if(theIndex < myR1 || theIndex > myR2, "index out of range in TCollection_Array1::Value"); + return myContents[theIndex]; } ~~~~~ -@subsubsection occt_fcug_2_4_3 Handling an Exception +@subsubsection occt_fcug_2_4_3 Handling an Exception -When an exception is raised, control is transferred to the nearest handler of a given type in the call stack, that is: - * the handler whose try block was most recently entered and not yet exited, +When an exception is raised, control is transferred to the nearest handler of a given type in the call stack, that is: + * the handler whose try block was most recently entered and not yet exited, * the handler whose type matches the raise expression. -A handler of T exception type is a match for a raise expression with an exception type of E if: +A handler of T exception type is a match for a raise expression with an exception type of E if: * T and E are of the same type, or * T is a supertype of E. - -In order to handle system signals as exceptions, make sure to insert macro *OCC_CATCH_SIGNALS* somewhere in the beginning of the relevant code. The recommended location for it is first statement after opening brace of try {} block. -As an example, consider the exceptions of type *NumericError, Overflow, Underflow* and *ZeroDivide*, where *NumericError* is the parent type of the three others. +In order to handle system signals as exceptions, make sure to insert macro *OCC_CATCH_SIGNALS* somewhere in the beginning of the relevant code. +The recommended location for it is first statement after opening brace of try {} block. + +As an example, consider the exceptions of type *Standard_NumericError, Standard_Overflow, Standard_Underflow* and *Standard_DivideByZero*, where *Standard_NumericError* is the parent type of the three others. ~~~~~ void f(1) - { - try { +{ + try + { OCC_CATCH_SIGNALS // try block } - catch(Standard_Overflow) { // first handler + catch (const Standard_Overflow& ) // first handler + { // ... } - catch(Standard_NumericError) { // second handler + catch (const Standard_NumericError& ) // second handler + { // ... } } ~~~~~ -Here, the first handler will catch exceptions of *Overflow* type and the second one -- exceptions of *NumericError* type and all exceptions derived from it, including *Underflow* and *ZeroDivide*. +Here, the first handler will catch exceptions of *Standard_Overflow* type +and the second one -- exceptions of *Standard_NumericError* type and all exceptions derived from it, including *Standard_Underflow* and *Standard_DivideByZero*. -The handlers are checked in order of appearance, from the nearest to the try block to the most distant from it, until one matches the raise expression. For a try block, it would be a mistake to place a handler for a base exception type ahead of a handler for its derived type since that would ensure that the handler for the derived exception would never be invoked. +The handlers are checked in order of appearance, from the nearest to the try block to the most distant from it, until one matches the raise expression. +For a try block, it would be a mistake to place a handler for a base exception type ahead of a handler for its derived type since that would ensure that the handler for the derived exception would never be invoked. ~~~~~ void f(1) { int i = 0; { - try { + try + { OCC_CATCH_SIGNALS g(i);// i is accessible } // statement here will produce compile-time errors ! - catch(Standard_NumericError) { + catch (const Standard_NumericError& ) + { // fix up with possible reuse of i } // statement here may produce unexpected side effect @@ -710,83 +834,98 @@ } ~~~~~ -The exceptions form a hierarchy tree completely separated from other user defined classes. One exception of type *Failure* is the root of the entire exception hierarchy. Thus, using a handler with *Failure* type catches any OCCT exception. It is recommended to set up such a handler in the main routine. +The exceptions form a hierarchy tree completely separated from other user defined classes. +One exception of type *Standard_Failure* is the root of the entire exception hierarchy. +Thus, using a handler with *Standard_Failure* type catches any OCCT exception. +It is recommended to set up such a handler in the main routine. -The main routine of a program would look like this: +The main routine of a program would look like this: ~~~~~ #include #include -#include +#include int main (int argc, char* argv[]) { - try { + try + { OCC_CATCH_SIGNALS // main block return 0; } - catch(Standard_Failure) { - Handle(Standard_Failure) error = Standard_Failure::Caught (); - cout error end1; + catch (const Standard_Failure& theFailure) + { + std::cerr << "Error " + theFailure.DynamicType()->Name() << " [" << theFailure.GetMessageString() << "]\n"; } return 1; } ~~~~~ -In this example function *Caught* is a static member of *Failure* that returns an exception object containing the error message built in the raise expression. Note that this method of accessing a raised object is used in Open CASCADE Technology instead of usual C++ syntax (receiving the exception in catch argument). - -Though standard C++ scoping rules and syntax apply to try block and handlers, note that on some platforms Open CASCADE Technology may be compiled in compatibility mode when exceptions are emulated by long jumps (see below). In this mode it is required that no statement precedes or follows any handler. Thus it is highly recommended to always include a try block into additional {} braces. Also this mode requires that header file *Standard_ErrorHandler.hxx* be included in your program before a try block, otherwise it may fail to handle Open CASCADE Technology exceptions; furthermore *catch()* statement does not allow passing exception object as argument. +Though standard C++ scoping rules and syntax apply to try block and handlers, note that on some platforms Open CASCADE Technology may be compiled in compatibility mode when exceptions are emulated by long jumps (see below). +In this mode it is required that no statement precedes or follows any handler. +Thus it is highly recommended to always include a try block into additional {} braces. +Also this mode requires that header file *Standard_ErrorHandler.hxx* be included in your program before a try block, otherwise it may fail to handle Open CASCADE Technology exceptions. #### Catching signals -In order for the application to be able to catch system signals (access violation, division by zero, etc.) in the same way as other exceptions, the appropriate signal handler shall be installed in the runtime by the method *OSD::SetSignal()*. +In order for the application to be able to catch system signals (access violation, division by zero, etc.) in the same way as other exceptions, the appropriate signal handler shall be installed in the runtime by the method *OSD::SetSignal()*. -Normally this method is called in the beginning of the main() function. It installs a handler that will convert system signals into OCCT exceptions. +Normally this method is called in the beginning of the main() function. +It installs a handler that will convert system signals into OCCT exceptions. -In order to actually convert signals to exceptions, macro *OCC_CATCH_SIGNALS* needs to be inserted in the source code. The typical place where this macro is put is beginning of the *try{}* block which catches such exceptions. +In order to actually convert signals to exceptions, macro *OCC_CATCH_SIGNALS* needs to be inserted in the source code. +The typical place where this macro is put is beginning of the *try{}* block which catches such exceptions. -@subsubsection occt_fcug_2_4_4 Implementation on various platforms. +@subsubsection occt_fcug_2_4_4 Implementation on various platforms -The exception handling mechanism in Open CASCADE Technology is implemented in different ways depending on the preprocessor macro *OCC_CONVERT_SIGNALS*, which shall be consistently defined by compilation procedures for both Open CASCADE Technology and user applications: +The exception handling mechanism in Open CASCADE Technology is implemented in different ways depending on the preprocessor macro *OCC_CONVERT_SIGNALS*, which shall be consistently defined by compilation procedures for both Open CASCADE Technology and user applications: -1. On Windows, these macros are not defined by default, and normal C++ exceptions are used in all cases, including throwing from signal handler. Thus the behavior is as expected in C++. +1. On Windows, these macros are not defined by default, and normal C++ exceptions are used in all cases, including throwing from signal handler. + Thus the behavior is as expected in C++. -2. On Linux, macro *OCC_CONVERT_SIGNALS* is defined by default. The C++ exception mechanism is used for catching exceptions and for throwing them from normal code. Since it is not possible to throw C++ exception from system signal handler function, that function makes a long jump to the nearest (in the execution stack) invocation of macro *OCC_CATCH_SIGNALS*, and only there the C++ exception gets actually thrown. The macro *OCC_CATCH_SIGNALS* is defined in the file *Standard_ErrorHandler.hxx*. Therefore, including this file is necessary for successful compilation of a code containing this macro. +2. On Linux, macro *OCC_CONVERT_SIGNALS* is defined by default. + The C++ exception mechanism is used for catching exceptions and for throwing them from normal code. + Since it is not possible to throw C++ exception from system signal handler function, that function makes a long jump to the nearest (in the execution stack) invocation of macro *OCC_CATCH_SIGNALS*, and only there the C++ exception gets actually thrown. + The macro *OCC_CATCH_SIGNALS* is defined in the file *Standard_ErrorHandler.hxx*. + Therefore, including this file is necessary for successful compilation of a code containing this macro. - This mode differs from standard C++ exception handling only for signals: - - * macro *OCC_CATCH_SIGNALS* is necessary (besides call to *OSD::SetSignal()* described above) for conversion of signals into exceptions; - * the destructors for automatic C++ objects created in the code after that macro and till the place where signal is raised will not be called in case of signal, since no C++ stack unwinding is performed by long jump. + This mode differs from standard C++ exception handling only for signals: -In general, for writing platform-independent code it is recommended to insert macros *OCC_CATCH_SIGNALS* in try {} blocks or other code where signals may happen. + * macro *OCC_CATCH_SIGNALS* is necessary (besides call to *OSD::SetSignal()* described above) for conversion of signals into exceptions; + * the destructors for automatic C++ objects created in the code after that macro and till the place where signal is raised will not be called in case of signal, since no C++ stack unwinding is performed by long jump. -@subsection occt_fcug_2_5 Plug-In Management +In general, for writing platform-independent code it is recommended to insert macros *OCC_CATCH_SIGNALS* in try {} blocks or other code where signals may happen. + +@subsection occt_fcug_2_5 Plug-In Management @subsubsection occt_fcug_2_5_1 Distribution by Plug-Ins -A plug-in is a component that can be loaded dynamically into a client application, not requiring to be directly linked to it. The plug-in is not bound to its client, i.e. the plug-in knows only how its connection mechanism is defined and how to call the corresponding services. +A plug-in is a component that can be loaded dynamically into a client application, not requiring to be directly linked to it. +The plug-in is not bound to its client, i.e. the plug-in knows only how its connection mechanism is defined and how to call the corresponding services. -A plug-in can be used to: - * implement the mechanism of a *driver*, i.e dynamically changing a driver implementation according to the current transactions (for example, retrieving a document stored in another version of an application), - * restrict processing resources to the minimum required (for example, it does not load any application services at run-time as long as the user does not need them), - * facilitate modular development (an application can be delivered with base functions while some advanced capabilities will be added as plug-ins when they are available). - -The plug-in is identified with the help of the global universal identifier (GUID). The GUID includes lower case characters and cannot end with a blank space. +A plug-in can be used to: + * implement the mechanism of a *driver*, i.e dynamically changing a driver implementation according to the current transactions (for example, retrieving a document stored in another version of an application), + * restrict processing resources to the minimum required (for example, it does not load any application services at run-time as long as the user does not need them), + * facilitate modular development (an application can be delivered with base functions while some advanced capabilities will be added as plug-ins when they are available). + +The plug-in is identified with the help of the global universal identifier (GUID). +The GUID includes lower case characters and cannot end with a blank space. -Once it has been loaded, the call to the services provided by the plug-in is direct (the client is implemented in the same language as the plug-in). +Once it has been loaded, the call to the services provided by the plug-in is direct (the client is implemented in the same language as the plug-in). -#### C++ Plug-In Implementation +#### C++ Plug-In Implementation -The C++ plug-in implements a service as an object with functions defined in an abstract class (this abstract class and its parent classes with the GUID are the only information about the plug-in implemented in the client application). The plug-in consists of a sharable library including a method named Factory which creates the C++ object (the client cannot instantiate this object because the plug-in implementation is not visible). -Foundation classes provide in the package *Plugin* a method named *Load()*, which enables the client to access the required service through a library. +The C++ plug-in implements a service as an object with functions defined in an abstract class (this abstract class and its parent classes with the GUID are the only information about the plug-in implemented in the client application). +The plug-in consists of a sharable library including a method named Factory which creates the C++ object (the client cannot instantiate this object because the plug-in implementation is not visible). +Foundation classes provide in the package *Plugin* a method named *Load()*, which enables the client to access the required service through a library. -That method reads the information regarding available plug-ins and their locations from the resource file *Plugin* found by environment variable *CSF_PluginDefaults*: +That method reads the information regarding available plug-ins and their locations from the resource file *Plugin* found by environment variable *CSF_PluginDefaults*: ~~~~~ -$CSF_PluginDefaults/Plugin +$CSF_PluginDefaults/Plugin ~~~~~ -The *Load* method looks for the library name in the resource file or registry through its GUID, for example, on UNIX: +The *Load* method looks for the library name in the resource file or registry through its GUID, for example, on UNIX: ~~~~~ ! METADATADRIVER whose value must be OS or DM. @@ -794,12 +933,13 @@ a148e300-5740-11d1-a904-080036aaa103.Location: libFWOSPlugin.so ~~~~~ -Then the *Load* method loads the library according to the rules of the operating system of the host machine (for example, by using environment variables such as *LD_LIBRARY_PATH* with Unix and *PATH* with Windows). After that it invokes the *PLUGINFACTORY* method to return the object, which supports the required service. -The client may then call the functions supported by this object. +Then the *Load* method loads the library according to the rules of the operating system of the host machine (for example, by using environment variables such as *LD_LIBRARY_PATH* with Unix and *PATH* with Windows). +After that it invokes the *PLUGINFACTORY* method to return the object, which supports the required service. +The client may then call the functions supported by this object. -#### C++ Client Plug-In Implementation +#### C++ Client Plug-In Implementation -To invoke one of the services provided by the plug-in, you may call the *Plugin::Load()* global function with the *Standard_GUID* of the requested service as follows: +To invoke one of the services provided by the plug-in, you may call the *Plugin::Load()* global function with the *Standard_GUID* of the requested service as follows: ~~~~~{.cpp} Handle(FADriver_PartStorer)::DownCast(PlugIn::Load (yourStandardGUID)); @@ -837,7 +977,6 @@ // function : Factory // purpose : //====================================================== - Handle(Standard_Transient) FAFactory::Factory (const Standard_GUID& theGUID) { if (theGUID == StorageDriver) @@ -846,14 +985,12 @@ static Handle(FADriver_PartStorer) sd = new FADriver_PartStorer(); return sd; } - if (theGUID == RetrievalDriver) { std::cout << "FAFactory : Create retrieve driver\n"; static Handle(FADriver_PartRetriever) rd = new FADriver_PartRetriever(); return rd; } - if (theGUID == Schema) { std::cout << "FAFactory : Create schema\n"; @@ -861,7 +998,7 @@ return s; } - Standard_Failure::Raise ("FAFactory: unknown GUID"); + throw Standard_Failure ("FAFactory: unknown GUID"); return Handle(Standard_Transient)(); } @@ -871,1042 +1008,886 @@ Application might also instantiate a factory by linking to the library and calling *FAFactory::Factory()* directly. -@section occt_fcug_3 Collections, Strings, Quantities and Unit Conversion +@section occt_fcug_3 Collections, Strings, Quantities and Unit Conversion @subsection occt_fcug_3_1 Collections @subsubsection occt_fcug_3_1_1 Overview -The **Collections** component contains the classes that handle dynamically sized aggregates of data. They include a wide range of collections such as arrays, lists and maps. +The **Collections** component contains the classes that handle dynamically sized aggregates of data. +They include a wide range of collections such as arrays, lists and maps. -Collections classes are *generic* (C++ template-like), that is, they define a structure and algorithms allowing to hold a variety of objects which do not necessarily inherit from a unique root class (similarly to C++ templates). +Some OCCT collections have close friends in modern STL (standard templates collection), but define a little bit different properties or behavior. +OCCT gives user a wider choice, but it is up to user to decide which particular OCCT or STL collection is most suitable for specific algorithm (including performance and usage convenience). +OCCT itself highly relies on its own collections for historical reasons - many features implemented by OCCT were unavailable in earlier versions of STL. + +Collections classes are *generic* (C++ templates), that is, they define a structure and algorithms allowing to hold a variety of objects which do not necessarily inherit from a unique root class. + +Note that: + * Each collection directly used as an argument in OCCT public syntax is instantiated in an OCCT component. + * The *TColStd* package (**Collections of Standard Objects** component) provides numerous instantiations of these generic collections with objects from the **Standard** package or from the **Strings** component. + +The **Collections** component provides a wide range of generic collections: + * **Arrays** are generally used for a quick access to the item, however an array is a fixed sized aggregate. + * **Sequences** are variable-sized structures, they avoid the use of large and quasi-empty arrays. + A sequence item is longer to access than an array item: only an exploration in sequence is effective (but sequences are not adapted for numerous explorations). + Arrays and sequences are commonly used as data structures for more complex objects. + * **Maps** are dynamic structures, where the size is constantly adapted to the number of inserted items and access to an item is the fastest. + Maps structures are commonly used in cases of numerous explorations: they are typically internal data structures for complex algorithms. + * **Lists** are similar to sequences but have different algorithms to explore them. + * **Acceleration structures** are trees or other structures optimized for fast traverse based on locality criteria (like picking objects by ray in 3D). -When you need to use a collection of a given type of object you must *instantiate* it for this specific type of element. Once this declaration is compiled, all the functions available on the generic collection are available on your *instantiated class*. +Macro definitions of these classes are stored in *NCollection_Define\*.hxx* files. +These definitions are now obsolete though still can be used, particularly for compatibility with the existing code. -However, note that: - * Each collection directly used as an argument in OCCT public syntax is instantiated in an OCCT component. - * The *TColStd* package (**Collections of Standard Objects** component) provides numerous instantiations of these generic collections with objects from the **Standard** package or from the **Strings** component. -The **Collections** component provides a wide range of generic collections: - * **Arrays** are generally used for a quick access to the item, however an array is a fixed sized aggregate. - * **Sequences** are variable-sized structures, they avoid the use of large and quasi-empty arrays. A sequence item is longer to access than an array item: only an exploration in sequence is effective (but sequences are not adapted for numerous explorations). Arrays and sequences are commonly used as data structures for more complex objects. - * **Maps** are dynamic structures, where the size is constantly adapted to the number of inserted items and access to an item is the fastest. Maps structures are commonly used in cases of numerous explorations: they are typically internal data structures for complex algorithms. - * **Lists** are similar to sequences but have different algorithms to explore them. - * Specific iterators for sequences and maps. - -@subsubsection occt_fcug_3_1_2 Generic general-purpose Aggregates - -#### TCollection_Array1 - -These are unidimensional arrays similar to C arrays, i.e. of fixed size but dynamically dimensioned at construction time. -As with a C array, the access time for an *Array1* indexed item is constant and is independent of the array size. Arrays are commonly used as elementary data structures for more complex objects. +Let see an example of NCollection template class instantiation for a sequence of points in the header file *MyPackage_SequenceOfPnt.hxx* (analogue of *TColgp_SequenceOfPnt*): -*Array1* is a generic class which depends on *Item*, the type of element in the array. - -*Array1* indexes start and end at a user-defined position. Thus, when accessing an item, you must base the index on the lower and upper bounds of the array. +~~~~~{.cpp} +#include +#include +typedef NCollection_Sequence MyPackage_SequenceOfPnt; +~~~~~ -#### TCollection_Array2 +For the case, when sequence itself should be managed by handle, auxiliary macros *DEFINE_HSEQUENCE* can be used: +~~~~~{.cpp} +#include +#include +#include +typedef NCollection_Sequence MyPackage_SequenceOfPnt; +DEFINE_HSEQUENCE(MyPackage_HSequenceOfPnt, MyPackage_SequenceOfPnt) +... +Handle(MyPackage_HSequenceOfPnt) aSeq = new MyPackage_HSequenceOfPnt(); +~~~~~ -These are bi-dimensional arrays of fixed size but dynamically dimensioned at construction time. +See more details about available collections in following sections. -As with a C array, the access time for an *Array2* indexed item is constant and is independent of the array size. Arrays are commonly used as elementary data structures for more complex objects. +@subsubsection occt_fcug_3_1_2 Arrays and sequences -*Array2* is a generic class which depends on *Item*, the type of element in the array. +Standard collections provided by OCCT are: +* *NCollection_Array1* -- fixed-size (at initialization) one-dimensional array; note that the index can start at any value, usually 1; +* *NCollection_Array2* -- fixed-size (at initialization) two-dimensional array; note that the index can start at any value, usually 1; +* *NCollection_List* -- plain list; +* *NCollection_Sequence* -- double-connected list with access by index; note that the index starts at 1; +* *NCollection_Vector* -- two-step indexed array, expandable in size, but not shrinkable; +* *NCollection_SparseArray* -- array-alike structure with sparse memory allocation for sequences with discontinuities. -*Array2* indexes start and end at a user-defined position. Thus, when accessing an item, you must base the index on the lower and upper bounds of the array. +These classes provide STL-style iterators (methods begin() and end()) and thus can be used in STL algorithms. -#### TCollection_HArray1 +##### NCollection_Array1 -These are unidimensional arrays similar to C arrays, i.e. of fixed size but dynamically dimensioned at construction time. -As with a C array, the access time for an *HArray1* or *HArray2* indexed item is constant and is independent of the array size. Arrays are commonly used as elementary data structures for more complex objects. +These are unidimensional arrays similar to C arrays, i.e. of fixed size but dynamically dimensioned at construction time. +As with a C array, the access time for an *NCollection_Array1* indexed item is constant and is independent of the array size. +Arrays are commonly used as elementary data structures for more complex objects. -*HArray1* objects are **handles** to arrays. - * *HArray1* arrays may be shared by several objects. - * You may use a *TCollection_Array1* structure to have the actual array. - -*HArray1* is a generic class which depends on two parameters: - * **Item**, the type of element in the array, - * **Array**, the actual type of array handled by *HArray1*. This is an instantiation with **Item** of the *TCollection_Array1* generic class. - -*HArray1* indexes start and end at a user-defined position. Thus, when accessing an item, you must base the index on the lower and upper bounds of the array. +This template class depends on *Item*, the type of element in the array. +Array indexation starts and ends at a position given to class constructor. +Thus, when accessing an item, you must base the index on the lower and upper bounds of the array. -#### TCollection_HArray2 +##### NCollection_Array2 -These are bi-dimensional arrays of fixed size but dynamically dimensioned at construction time. +These are bi-dimensional arrays of fixed size but dynamically dimensioned at construction time. -As with a C array, the access time for an *HArray2* indexed item is constant and is independent of the array size. Arrays are commonly used as elementary data structures for more complex objects. +As with a C array, the access time for an *NCollection_Array2* indexed item is constant and is independent of the array size. +Arrays are commonly used as elementary data structures for more complex objects. -*HArray2* objects are **handles** to arrays. - * *HArray2* arrays may be shared by several objects. - * You may use a *TCollection_Array2* structure to have the actual array. - -*HArray2* is a generic class which depends on two parameters: - * *Item*, the type of element in the array, - * *Array*, the actual type of array handled by *HArray2*. This is an instantiation with *Item* of the *TCollection_Array2* generic class. +This template class depends on *Item*, the type of element in the array. +Array indexation starts and ends at a position given to class constructor. +Thus, when accessing an item, you must base the index on the lower and upper bounds of the array. -#### TCollection_HSequence - -This is a sequence of items indexed by an integer. +##### NCollection_List -Sequences have about the same goal as unidimensional arrays *TCollection_HArray1*: they are commonly used as elementary data structures for more complex objects. But a sequence is a structure of *variable size*: sequences avoid the use of large and quasi-empty arrays. Exploring a sequence data structure is effective when the exploration is done in sequence; elsewhere a sequence item is longer to read than an array item. Note also that sequences are not effective when they have to support numerous algorithmic explorations: a map is better for that. +These are ordered lists of non-unique objects which can be accessed sequentially using an NCollection_List::Iterator. +Item insertion in a list is very fast at any position. +But searching for items by value may be slow if the list is long, because it requires a sequential search. -*HSequence* objects are **handles** to sequences. - * *HSequence* sequences may be shared by several objects. - * You may use a *TCollection_Sequence* structure to have the actual sequence. - -*HSequence* is a generic class which depends on two parameters: - * *Item*, the type of element in the sequence, - * *Seq*, the actual type of sequence handled by *HSequence*. This is an instantiation with *Item* of the *TCollection_Sequence* generic class. - -#### TCollection_List +This template class depends on *Item*, the type of element in the structure. +A sequence is a better structure when searching for items by value. +Queues and stacks are other kinds of list with a different access to data. -These are ordered lists of non-unique objects which can be accessed sequentially using an iterator. -Item insertion in a list is very fast at any position. But searching for items by value may be slow if the list is long, because it requires a sequential search. +##### NCollection_Sequence -*List* is a generic class, which depends on *Item*, the type of element in the structure. -Use a *ListIterator* iterator to explore a *List* structure. +This is a sequence of items indexed by an integer. +Sequences have about the same goal as unidimensional arrays (*NCollection_Array1*): they are commonly used as elementary data structures for more complex objects. +But a sequence is a structure of *variable size*: sequences avoid the use of large and quasi-empty arrays. +Exploring a sequence data structure is effective when the exploration is done *in sequence*; elsewhere a sequence item is longer to read than an array item. +Note also that sequences are not effective when they have to support numerous algorithmic explorations: a map is better for that. -An iterator class is automatically instantiated from the *TCollection_ListIterator* class at the time of instantiation of a *List* structure. +This template class depends on *Item*, the type of element in the sequence. +The first element in sequence has index equal to 1. -A sequence is a better structure when searching for items by value. +##### NCollection_Vector -Queues and stacks are other kinds of list with a different access to data. - -#### TCollection_Sequence - -This is a sequence of items indexed by an integer. -Sequences have about the same goal as unidimensional arrays (*TCollection_Array1*): they are commonly used as elementary data structures for more complex objects. But a sequence is a structure of *variable size*: sequences avoid the use of large and quasi-empty arrays. Exploring a sequence data structure is effective when the exploration is done *in sequence*; elsewhere a sequence item is longer to read than an array item. Note also that sequences are not effective when they have to support numerous algorithmic explorations: a map is better for that. - -*Sequence* is a generic class which depends on *Item*, the type of element in the sequence. - -@subsubsection occt_fcug_3_1_3 Generic Maps - -Maps are dynamically extended data structures where data is quickly accessed with a key. *TCollection_BasicMap* is a root class for maps. - -#### General properties of maps - -Map items may contain complex non-unitary data, thus it can be difficult to manage them with an array. The map allows a data structure to be indexed by complex data. - -The size of a map is dynamically extended. So a map may be first dimensioned for a little number of items. Maps avoid the use of large and quasi-empty arrays. +Class *NCollection_Vector* is implemented internally as a list of arrays of the same size. +Its properties: +* Direct (constant-time) access to members like in NCollection_Array1 type. + Data are allocated in compact blocks, this provides faster iteration. +* Can grow without limits, like NCollection_List or NCollection_Sequence types. +* Once having the size LEN, it cannot be reduced to any size less than LEN -- there is no operation of removal of items. -The access time for a map item is much better than the one for a sequence, list, queue or stack item. It is comparable with the access time for an array item. It depends on the size of the map and on the quality of the user redefinable function (the *hashing function*) to find quickly where is the item. +Insertion in a Vector-type class is made by two methods: +* _SetValue(ind, theValue)_ -- array-type insertion, where ind is the index of the inserted item, can be any non-negative number. + If it is greater than or equal to Length(), then the vector is enlarged (its Length() grows). +* _Append(theValue)_ -- list-type insertion equivalent to _myVec.SetValue(myVec.Length(), theValue)_, incrementing the size of the collection. -The performance of a map exploration may be better of an array exploration because the size of the map is adapted to the number of inserted items. +Other essential properties coming from NCollection_List and NCollection_Array1 type collections: +* Like in *NCollection_List*, the method *Clear()* destroys all contained objects and releases the allocated memory. +* Like in *NCollection_Array1*, the methods *Value()* and *ChangeValue()* return a contained object by index. + Also, these methods have the form of overloaded operator(). -That is why maps are commonly used as internal data structures for algorithms. +The first element in vector has index equal to 0. -#### Definitions +##### NCollection_SparseArray -A map is a data structure for which data are addressed by *keys*. +Class *NCollection_SparseArray* has almost the same features as *NCollection_Vector*, but it allows to store items having scattered indices. +In NCollection_Vector, if you set an item with index 1000000, the container will allocate memory for all items with indices in the range 0-1000000. +In NCollection_SparseArray, only one small block of items will be reserved that contains the item with index 1000000. -Once inserted in the map, a map item is referenced as an *entry* of the map. +This class can be also seen as equivalence of *NCollection_DataMap* with the only one practical difference: it can be much less memory-expensive if items are small (e.g. Integer or Handle). -Each entry of the map is addressed by a key. Two different keys address two different entries of the map. -The position of an entry in the map is called a *bucket*. +This type has both interfaces of NCollection_DataMap and NCollection_Vector to access items. -A map is dimensioned by its number of buckets, i.e. the maximum number of entries in the map. The performance of a map is conditioned by the number of buckets. +@subsubsection occt_fcug_3_1_3 Maps -The *hashing function* transforms a key into a bucket index. The number of values that can be computed by the hashing function is equal to the number of buckets of the map. +OCCT provides several classes for storage of objects by value, providing fast search due to use of hash: +* *NCollection_Map* -- hash set; +* *NCollection_IndexedMap* -- set with a prefixed order of elements, allowing fast access by index or by value (hash-based); +* *NCollection_DataMap* -- hash map; +* *NCollection_IndexedDataMap* -- map with a prefixed order of elements, allowing fast access by index or by value (hash-based); +* *NCollection_DoubleMap* -- two-side hash map (with two keys). -Both the hashing function and the equality test between two keys are provided by a *hasher* object. +Maps are dynamically extended data structures where data is quickly accessed with a *key*. +Once inserted in the map, a map item is referenced as an *entry* of the map. +Maps avoid the use of large and quasi-empty arrays. -A map may be explored by a *map iterator*. This exploration provides only inserted entries in the map (i.e. non empty buckets). +Each entry of the map is addressed by a key. +Two different keys address two different entries of the map. +The position of an entry in the map is called a *bucket*. -#### Collections of generic maps +A map is dimensioned by its number of buckets, i.e. the maximum number of entries in the map. +The *hashing function* transforms a key into a bucket index. +The number of values that can be computed by the hashing function is equal to the number of buckets of the map. -The *Collections* component provides numerous generic derived maps. +Both the hashing function and the equality test between two keys are provided by a *hasher* object. -These maps include automatic management of the number of *buckets*: they are automatically resized when the number of *keys* exceeds the number of buckets. If you have a fair idea of the number of items in your map, you can save on automatic resizing by specifying a number of buckets at the time of construction, or by using a resizing function. This may be considered for crucial optimization issues. +The access time for a map item is much better than the one for a sequence, list, queue or stack item. +It is comparable with the access time for an array item. +It depends on the size of the map (number of buckets) and on the quality of the user redefinable *hashing function*. -*Keys, items* and *hashers* are parameters of these generic derived maps. +*Keys, items* and *hashers* are parameters of these OCCT map templates. +*NCollection_DefaultHasher* class describes the functions required by any *hasher*, which is to be used with a map instantiated from the **NCollection** component. -*TCollection_MapHasher* class describes the functions required by any *hasher*, which is to be used with a map instantiated from the **Collections** component. +A map may be explored by a *map iterator*. +This exploration provides only inserted entries in the map (i.e. non empty buckets). -An iterator class is automatically instantiated at the time of instantiation of a map provided by the *Collections* component if this map is to be explored with an iterator. Note that some provided generic maps are not to be explored with an iterator but with indexes (*indexed maps*). +##### NCollection_DataMap -##### TCollection_DataMap +This is a map used to store keys with associated items. +An entry of **NCollection_DataMap** is composed of both the key and the item. +The *NCollection_DataMap* can be seen as an extended array where the keys are the indexes. -This is a map used to store keys with associated items. An entry of **DataMap** is composed of both the key and the item. -The *DataMap* can be seen as an extended array where the keys are the indexes. - -*DataMap* is a generic class which depends on three parameters: +*NCollection_DataMap* is a template class which depends on three parameters: * *Key* is the type of key for an entry in the map, - * *Item* is the type of element associated with a key in the map, + * *Item* is the type of element associated with a key in the map, * *Hasher* is the type of hasher on keys. - -Use a *DataMapIterator* iterator to explore a *DataMap* map. - -An iterator class is automatically instantiated from the *TCollection_DataMapIterator* generic class at the time of instantiation of a *DataMap* map. -*TCollection_MapHasher* class describes the functions required for a *Hasher* object. +Use a *NCollection_DataMap::Iterator* to explore a *NCollection_DataMap* map. +*NCollection_DefaultHasher* class describes the functions required for a *Hasher* object. -##### TCollection_DoubleMap +##### NCollection_DoubleMap -This is a map used to bind pairs of keys (Key1,Key2) and retrieve them in linear time. +This is a map used to bind pairs of keys (Key1,Key2) and retrieve them in linear time. -*Key1* is referenced as the first key of the *DoubleMap* and *Key2* as the second key. +*Key1* is referenced as the first key of the *NCollection_DoubleMap* and *Key2* as the second key. -An entry of a *DoubleMap* is composed of a pair of two keys: the first key and the second key. +An entry of a *NCollection_DoubleMap* is composed of a pair of two keys: the first key and the second key. -*DoubleMap* is a generic class which depends on four parameters: +*NCollection_DoubleMap* is a teamplate class which depends on four parameters: * *Key1* is the type of the first key for an entry in the map, - * *Key2* is the type of the second key for an entry in the map, + * *Key2* is the type of the second key for an entry in the map, * *Hasher1* is the type of hasher on first keys, * *Hasher2* is the type of hasher on second keys. - -Use *DoubleMapIterator* to explore a *DoubleMap* map. - -An iterator class is automatically instantiated from the *TCollection_DoubleMapIterator* class at the time of instantiation of a *DoubleMap* map. - -*TCollection_MapHasher* class describes the functions required for a *Hasher1* or a *Hasher2* object. -##### TCollection_IndexedDataMap +Use *NCollection_DoubleMap::Iterator* to explore a *NCollection_DoubleMap* map. +*NCollection_DefaultHasher* class describes the functions required for a *Hasher1* or a *Hasher2* object. -This is map to store keys with associated items and to bind an index to them. +##### NCollection_IndexedDataMap -Each new key stored in the map is assigned an index. Indexes are incremented as keys (and items) stored in the map. A key can be found by the index, and an index can be found by the key. No key but the last can be removed, so the indexes are in the range 1...Upper, where *Upper* is the number of keys stored in the map. An item is stored with each key. +This is map to store keys with associated items and to bind an index to them. -An entry of an *IndexedDataMap* is composed of both the key, the item and the index. An *IndexedDataMap* is an ordered map, which allows a linear iteration on its contents. It combines the interest: +Each new key stored in the map is assigned an index. +Indexes are incremented as keys (and items) stored in the map. +A key can be found by the index, and an index can be found by the key. +No key but the last can be removed, so the indexes are in the range 1...Upper, where *Upper* is the number of keys stored in the map. +An item is stored with each key. + +An entry of an *NCollection_IndexedDataMap* is composed of both the key, the item and the index. +An *NCollection_IndexedDataMap* is an ordered map, which allows a linear iteration on its contents. +It combines the interest: * of an array because data may be accessed with an index, * and of a map because data may also be accessed with a key. -*IndexedDataMap* is a generic class which depends on three parameters: - * *Key* is the type of key for an entry in the map, - * *Item* is the type of element associated with a key in the map, - * *Hasher* is the type of hasher on keys. +*NCollection_IndexedDataMap* is a template class which depends on three parameters: + * *Key* is the type of key for an entry in the map, + * *Item* is the type of element associated with a key in the map, + * *Hasher* is the type of hasher on keys. -##### TCollection_IndexedMap +##### NCollection_IndexedMap -This is map used to store keys and to bind an index to them. +This is map used to store keys and to bind an index to them. -Each new key stored in the map is assigned an index. Indexes are incremented as keys stored in the map. A key can be found by the index, and an index by the key. No key but the last can be removed, so the indexes are in the range 1...Upper where Upper is the number of keys stored in the map. +Each new key stored in the map is assigned an index. +Indexes are incremented as keys stored in the map. +A key can be found by the index, and an index by the key. +No key but the last can be removed, so the indexes are in the range 1...Upper where Upper is the number of keys stored in the map. -An entry of an *IndexedMap* is composed of both the key and the index. An *IndexedMap* is an ordered map, which allows a linear iteration on its contents. But no data is attached to the key. An *IndexedMap* is typically used by an algorithm to know if some action is still performed on components of a complex data structure. +An entry of an *NCollection_IndexedMap* is composed of both the key and the index. +An *NCollection_IndexedMap* is an ordered map, which allows a linear iteration on its contents. +But no data is attached to the key. +An *NCollection_IndexedMap* is typically used by an algorithm to know if some action is still performed on components of a complex data structure. -*IndexedMap* is a generic class which depends on two parameters: +*NCollection_IndexedMap* is a template class which depends on two parameters: * *Key* is the type of key for an entry in the map, * *Hasher* is the type of hasher on keys. -##### TCollection_Map +##### NCollection_Map -This is a basic hashed map, used to store and retrieve keys in linear time. +This is a basic hashed map, used to store and retrieve keys in linear time. -An entry of a *Map* is composed of the key only. No data is attached to the key. A *Map* is typically used by an algorithm to know if some action is still performed on components of a complex data structure. +An entry of a *NCollection_Map* is composed of the key only. +No data is attached to the key. +An *NCollection_Map* is typically used by an algorithm to know if some action is still performed on components of a complex data structure. -*Map* is a generic class which depends on two parameters: +*NCollection_Map* is a generic class which depends on two parameters: * *Key* is the type of key in the map, * *Hasher* is the type of hasher on keys. -Use a *MapIterator* iterator to explore a *Map* map. - -##### TCollection_MapHasher - -This is a hasher on the *keys* of a map instantiated from the *Collections* component. - -A hasher provides two functions: -* *HashCode()* function transforms a key into a bucket index in the map. The number of values that can be computed by the hashing function is equal to the number of buckets in the map. -* *IsEqual* is the equality test between two keys. Hashers are used as parameters in generic maps provided by the **Collections** component. - -*MapHasher* is a generic class which depends on the type of keys, providing that *Key* is a type from the *Standard* package. In such cases *MapHasher* may be directly instantiated with *Key*. Note that the package *TColStd* provides some of these instantiations. - -Elsewhere, if *Key* is not a type from the *Standard* package you must consider *MapHasher* as a template and build a class which includes its functions, in order to use it as a hasher in a map instantiated from the *Collections* component. - -Note that *TCollection_AsciiString* and *TCollection_ExtendedString* classes correspond to these specifications, in consequence they may be used as hashers: when *Key* is one of these two types you may just define the hasher as the same type at the time of instantiation of your map. - -@subsubsection occt_fcug_3_1_4 Iterators - -#### TCollection_BasicMapIterator - -This is a root class for map iterators. A map iterator provides a step by step exploration of all the entries of a map. - -#### TCollection_DataMapIterator - -These are functions used for iterating the contents of a *DataMap* map. - -A map is a non-ordered data structure. The order in which entries of a map are explored by the iterator depends on its contents and change when the map is edited. It is not recommended to modify the contents of a map during the iteration: the result is unpredictable. - -#### TCollection_DoubleMapIterator - -These are functions used for iterating the contents of a *DoubleMap* map. - -#### TCollection_ListIterator - -These are unctions used for iterating the contents of a *List* data structure. - -A *ListIterator* object can be used to go through a list sequentially, and as a bookmark to hold a position in a list. It is not an index, however. Each step of the iteration gives the current position of the iterator, to which corresponds the current item in the list. The current position is not defined if the list is empty, or when the exploration is finished. - -An iterator class is automatically instantiated from this generic class at the time of instantiation of a *List* data structure. - -#### TCollection_MapIterator +Use a *NCollection_Map::Iterator* to explore a *NCollection_Map* map. -These are functions used for iterating the contents of a *Map* map. -An iterator class is automatically instantiated from this generic class at the time of instantiation of a *Map* map. +##### NCollection_DefaultHasher -#### TCollection_SetIterator +This is a default hasher on the *keys* of a map instantiated from the *NCollection* component. -These are functions used for iterating the contents of a *Set* data structure. -An iterator class is automatically instantiated from this generic class at the time of instantiation of a *Set* structure. +A hasher provides two functions: +* *HashCode()* function transforms a key into a bucket index in the map. + The number of values that can be computed by the hashing function is equal to the number of buckets in the map. +* *IsEqual* is the equality test between two keys. -#### TCollection_StackIterator +Hashers are used as parameters in template maps provided by the **NCollection** component. -These are functions used for iterating the contents of a **Stack** data structure. +*NCollection_DefaultHasher* is a template class which depends on the type of keys, providing that *Key* is a type from the *Standard* package. +In such cases *NCollection_DefaultHasher* may be directly instantiated with *Key*. +Note that the package *TColStd* provides some of these instantiations. -An iterator class is automatically instantiated from this generic class at the time of instantiation of a *Stack* structure. +Elsewhere, if *Key* is not a type from the *Standard* package you must consider *NCollection_DefaultHasher* as a template +and build a class which includes its functions, in order to use it as a hasher in a map instantiated from the *NCollection* component. -@subsection occt_fcug_3_2 Collections of Standard Objects -@subsubsection occt_fcug_3_2_1 Overview -While generic classes of the *TCollection* package are the root classes that describe the generic purpose of every type of collection, classes effectively used are extracted from the *TColStd* package. -The *TColStd* and *TShort* packages provide frequently used instantiations of generic classes with objects from the *Standard* package or strings from the *TCollection* package. - -@subsubsection occt_fcug_3_2_2 Description -These instantiations are the following: - * Unidimensional arrays: instantiations of the *TCollection_Array1* generic class with *Standard* Objects and *TCollection* strings. - * Bidimensional arrays: instantiations of the *TCollection_Array2* generic class with *Standard* Objects. - * Unidimensional arrays manipulated by handles: instantiations of the *TCollection_HArray1* generic class with *Standard* Objects and *TCollection* strings. - * Bidimensional arrays manipulated by handles: instantiations of the *TCollection_HArray2* generic class with *Standard* Objects. - * Sequences: instantiations of the *TCollection_Sequence* generic class with *Standard* objects and *TCollection* strings. - * Sequences manipulated by handles: instantiations of the *TCollection_HSequence* generic class with *Standard* objects and *TCollection* strings. - * Lists: instantiations of the *TCollection_List* generic class with *Standard* objects. - * Queues: instantiations of the *TCollection_Queue* generic class with *Standard* objects. - * Sets: instantiations of the *TCollection_Set* generic class with *Standard* objects. - * Sets manipulated by handles: instantiations of the *TCollection_HSet* generic class with *Standard* objects. - * Stacks: instantiations of the *TCollection_Stack* generic class with *Standard* objects. - * Hashers on map keys: instantiations of the *TCollection_MapHasher* generic class with *Standard* objects. - * Basic hashed maps: instantiations of the *TCollection_Map* generic class with *Standard* objects. - * Hashed maps with an additional item: instantiations of the *TCollection_DataMap* generic class with *Standard* objects. - * Basic indexed maps: instantiations of the *TCollection_IndexedMap* generic class with *Standard* objects. - * Indexed maps with an additional item: instantiations of the *TCollection_IndexedDataMap* generic class with *Standard_Transient* objects. - * Class *TColStd_PackedMapOfInteger* provides alternative implementation of map of integer numbers, optimized for both performance and memory usage (it uses bit flags to encode integers, which results in spending only 24 bytes per 32 integers stored in optimal case). This class also provides Boolean operations with maps as sets of integers (union, intersection, subtraction, difference, checks for equality and containment). - -@subsection occt_fcug_3_3 NCollections -@subsubsection occt_fcug_3_3_1 Overview - -The *NCollection* package provides a set of template collection classes used throughout OCCT. - -Macro definitions of these classes are stored in *NCollection_Define\*.hxx* files. These definitions are now obsolete though still can be used, particularly for compatibility with the existing code. - -@subsubsection occt_fcug_3_3_2 Instantiation of collection classes - -Now we are going to implement the definitions from *NCollection* in the code, taking as an example a sequence of points (analogue of *TColgp_SequenceOfPnt*). - -#### Definition of a new collection class - -Let the header file be *MyPackage_SequenceOfPnt.hxx* : - -Template class instantiaton -~~~~~ -#include -#include -typedef NCollection_Sequence MyPackage_SequenceOfPnt; -~~~~~ - -Macro instantiation -~~~~~ -#include -#include -~~~~~ - -The following line defines the class "base collection of points" -~~~~~ -DEFINE_BASECOLLECTION(MyPackage_BaseCollPnt, gp_Pnt) -~~~~~ - -The following line defines the class *MyPackage_SequenceOfPnt* +Note that *TCollection_AsciiString* and *TCollection_ExtendedString* classes correspond to these specifications, in consequence they may be used as hashers: +when *Key* is one of these two types you may just define the hasher as the same type at the time of instantiation of your map. -~~~~~ -DEFINE_SEQUENCE (MyPackage_SequenceOfPnt, MyPackage_BaseCollPnt , gp_Pnt) -~~~~~ - -#### Definition of a new collection class managed by Handle - -It is necessary to provide relevant statements both in the header ( .hxx file) and the C++ source ( .cxx file). - -Header file MyPackage_HSequenceOfPnt.hxx: - -~~~~~ -#include -#include -~~~~~ - -The following line defines the class "base collection of points" +@subsubsection occt_fcug_3_1_4 Iterators -~~~~~ -DEFINE_BASECOLLECTION(MyPackage_BaseCollPnt, gp_Pnt) -~~~~~ +Every collection defines its *Iterator* class capable of iterating the members in some predefined order. +Every Iterator is defined as a subtype of the particular collection type (e.g., MyPackage_StackOfPnt::Iterator). +The order of iteration is defined by a particular collection type. + +The common methods of Iterator are: + +| Name | Method | Description | +| :---------------- | :--------------------------- | :----------- | +| **Init()** | _void Init (MyCollection& )_ | Initializes the iterator on the collection object | +| **More()** | _bool More()_ | Makes a query if there is another non-iterated member | +| **Next()** | _void Next()_ | Increments the iterator | +| **Value()** | _const ItemType& Value()_ | Returns the current member | +| **ChangeValue()** | _ItemType& ChangeValue()_ | Returns the mutable current member | -The following line defines the class *MyPackage_SequenceOfPnt* +Usage sample: -~~~~~ -DEFINE_SEQUENCE (MyPackage_SequenceOfPnt, MyPackage_BaseCollPnt, gp_Pnt) +~~~~~{.cpp} +typedef Ncollection_Sequence MyPackage_SequenceOfPnt; +void Perform (const MyPackage_SequenceOfPnt& theSequence) +{ + for (MyPackage_SequenceOfPnt::Iterator anIter (theSequence); anIter.More(); anIter.Next()) + { + const gp_Pnt aPnt& = anIter.Value(); + ... + } +} ~~~~~ -The following line defines the classes *MyPackage_HSequenceOfPnt* and *Handle(MyPackage_HSequenceOfPnt)* +@subsubsection occt_fcug_3_1_5 Allocators -~~~~~ -DEFINE_HSEQUENCE (MyPackage_HSequenceOfPnt, MyPackage_SequenceOfPnt) -~~~~~ - -Source code file will be *MyPackage_HSequenceOfPnt.cxx* or any other .cxx file (once in the whole project): +All constructors of *NCollection* classes receive the *Allocator* object as the last parameter. +This is an object of a type managed by Handle, inheriting *NCollection_BaseAllocator*, with the following (mandatory) methods redefined: -~~~~~ -IMPLEMENT_HSEQUENCE (MyPackage_HSequenceOfPnt) +~~~~~{.cpp} + virtual void* Allocate (const size_t theSize) override; + virtual void Free (void* theAddress) override; ~~~~~ -@subsubsection occt_fcug_3_3_3 Arrays and sequences +It is used internally every time when the collection allocates memory for its item(s) and releases this memory. +The default value of this parameter (empty *Handle*) designates the use of *NCollection_BaseAllocator*, where the functions *Standard::Allocate* and *Standard::Free* are called. +Therefore if the user of *NCollection* does not specify any allocator as a parameter to the constructor of his collection, the memory management will be identical to other Open CASCADE Technology classes. -Standard collections provided by OCCT are: -* *NCollection_Array1* -- fixed-size (at initialization) one-dimensional array; note that the index can start at any value, usually 1; -* *NCollection_Array2* -- fixed-size (at initialization) two-dimensional array; note that the index can start at any value, usually 1; -* *NCollection_List* -- plain list; -* *NCollection_Sequence* -- double-connected list with access by index; note that the index starts at 1. +Nevertheless, it is possible to define a custom *Allocator* type to manage the memory in the most optimal or convenient way for this algorithm. -These classes provide STL-style iterators (methods begin() and end()) and thus can be used in STL algorithms. +As one possible choice, the class *NCollection_IncAllocator* is included. +Unlike *NCollection_BaseAllocator*, the memory is allocated in big blocks (about 20kB) and the allocator keeps track of the amount of occupied memory. +The method *Allocate* just increments the pointer to non-occupied memory and returns its previous value. +Memory is only released in the destructor of *NCollection_IncAllocator*, the method *Free* is empty. +If used properly, this Allocator can greatly improve the performance of specific algorithms. -@subsubsection occt_fcug_3_3_3x Maps +@subsubsection occt_fcug_3_1_6 Acceleration structures -NCollection provides several classes for storage of objects by value, providing fast search due to use of hash: -* *NCollection_Map* -- hash set; -* *NCollection_IndexedMap* -- set with a prefixed order of elements, allowing fast access by index or by value (hash-based); -* *NCollection_DataMap* -- hash map; -* *NCollection_IndexedDataMap* -- map with a prefixed order of elements, allowing fast access by index or by value (hash-based); -* *NCollection_DoubleMap* -- two-side hash map (with two keys). +OCCT provides several data structures for optimized traverse of large collection of objects based on their locality (in 3D space). + * *NCollection_UBTree* -- Unbalanced Binary Tree; + * *NCollection_CellFilter* -- array of 2D/3D cells; + * *BVH_Tree* -- boundary volume hierarchy. -@subsubsection occt_fcug_3_3_4 Other collection types +##### NCollection_UBTree -There are 4 collection types provided as template classes: -* *NCollection_Vector* -* *NCollection_UBTree* -* *NCollection_SparseArray* -* *NCollection_CellFilter* - -#### Vector - -This type is implemented internally as a list of arrays of the same size. Its properties: -* Direct (constant-time) access to members like in Array1 type; data are allocated in compact blocks, this provides faster iteration. -* Can grow without limits, like List, Stack or Queue types. -* Once having the size LEN, it cannot be reduced to any size less than LEN -- there is no operation of removal of items. +The class name NCollection_UBTree stands for "Unbalanced Binary Tree". +It stores the members in a binary tree of overlapped bounding objects (boxes or else). +Once the tree of boxes of geometric objects is constructed, the algorithm is capable of fast geometric selection of objects. +The tree can be easily updated by adding to it a new object with bounding box. +The time of adding to the tree of one object is O(log(N)), where N is the total number of objects, so the time of building a tree of N objects is O(N(log(N)). +The search time of one object is O(log(N)). -Insertion in a Vector-type class is made by two methods: -* _SetValue(ind, theValue)_ -- array-type insertion, where ind is the index of the inserted item, can be any non-negative number. If it is greater than or equal to Length(), then the vector is enlarged (its Length() grows). -* _Append(theValue)_ -- list-type insertion equivalent to _myVec.SetValue(myVec.Length(), theValue)_, incrementing the size of the collection. +Defining various classes inheriting *NCollection_UBTree::Selector* we can perform various kinds of selection over the same b-tree object. -Other essential properties coming from List and Array1 type collections: -* Like in *List*, the method *Clear()* destroys all contained objects and releases the allocated memory. -* Like in *Array1*, the methods *Value()* and *ChangeValue()* return a contained object by index. Also, these methods have the form of overloaded operator (). +The object may be of any type allowing copying. +Among the best suitable solutions there can be a pointer to an object, handled object or integer index of object inside some collection. -#### UBTree +The bounding object may have any dimension and geometry. +The minimal interface of *TheBndType* (besides public empty and copy constructor and operator=) used in NCollection_UBTree algorithm as follows: -The name of this type stands for “Unbalanced Binary Treeâ€. It stores the members in a binary tree of overlapped bounding objects (boxes or else). -Once the tree of boxes of geometric objects is constructed, the algorithm is capable of fast geometric selection of objects. The tree can be easily updated by adding to it a new object with bounding box. -The time of adding to the tree of one object is O(log(N)), where N is the total number of objects, so the time of building a tree of N objects is O(N(log(N)). The search time of one object is O(log(N)). - -Defining various classes inheriting *NCollection_UBTree::Selector* we can perform various kinds of selection over the same b-tree object. - -The object may be of any type allowing copying. Among the best suitable solutions there can be a pointer to an object, handled object or integer index of object inside some collection. The bounding object may have any dimension and geometry. The minimal interface of *TheBndType* (besides public empty and copy constructor and operator =) used in UBTree algorithm as follows: - -~~~~~ - class MyBndType - { - public: - inline void Add (const MyBndType& other); - // Updates me with other bounding type instance +~~~~~{.cpp} +class MyBndType +{ +public: + //! Updates me with other bounding type instance + void Add (const MyBndType& theOther); - inline Standard_Boolean IsOut (const MyBndType& other) const; - // Classifies other bounding type instance relatively me + //! Classifies other bounding type instance relatively me + Standard_Boolean IsOut (const MyBndType& theOther) const; - inline Standard_Real SquareExtent() const; - // Computes the squared maximal linear extent of me (for a box it is the squared diagonal of the box). - }; + //! Computes the squared maximal linear extent of me (for a box it is the squared diagonal of the box). + Standard_Real SquareExtent() const; +}; ~~~~~ - This interface is implemented in types of Bnd package: *Bnd_Box, Bnd_Box2d, Bnd_B2x, Bnd_B3x*. -To select objects you need to define a class derived from *UBTree::Selector* that should redefine the necessary virtual methods to maintain the selection condition. Usually this class instance is also used to retrieve selected objects after search. -The class *UBTreeFiller* is used to randomly populate a *UBTree* instance. The quality of a tree is better (considering the speed of searches) if objects are added to it in a random order trying to avoid the addition of a chain of nearby objects one following another. -Instantiation of *UBTreeFiller* collects objects to be added, and then adds them at once to the given UBTree instance in a random order using the Fisher-Yates algorithm. +To select objects you need to define a class derived from *NCollection_UBTree::Selector* that should redefine the necessary virtual methods to maintain the selection condition. +Usually this class instance is also used to retrieve selected objects after search. +The class *NCollection_UBTreeFiller* is used to randomly populate a *NCollection_UBTree* instance. +The quality of a tree is better (considering the speed of searches) if objects are added to it in a random order trying to avoid the addition of a chain of nearby objects one following another. +Instantiation of *NCollection_UBTreeFiller* collects objects to be added, and then adds them at once to the given NCollection_UBTree instance in a random order using the Fisher-Yates algorithm. Below is the sample code that creates an instance of *NCollection_UBTree* indexed by 2D boxes (Bnd_B2f), then a selection is performed returning the objects whose bounding boxes contain the given 2D point. -~~~~~ +~~~~~{.cpp} typedef NCollection_UBTree UBTree; typedef NCollection_List ListOfSelected; //! Tree Selector type class MyTreeSelector : public UBTree::Selector { public: - // This constructor initializes the selection criterion (e.g., a point) - + //! This constructor initializes the selection criterion (e.g., a point) MyTreeSelector (const gp_XY& thePnt) : myPnt(thePnt) {} - // Get the list of selected objects - const ListOfSelected& ListAccepted () const - { return myList; } - // Bounding box rejection - definition of virtual method. @return True if theBox is outside the selection criterion. - - Standard_Boolean Reject (const Bnd_B2f& theBox) const - { return theBox.IsOut(myPnt); } - // Redefined from the base class. Called when the bounding of theData conforms to the selection criterion. This method updates myList. - - Standard_Boolean Accept (const MyData& theData) - { myList.Append(theData); } - private: + //! Get the list of selected objects + const ListOfSelected& ListAccepted() const { return myList; } + + //! Bounding box rejection - definition of virtual method. + //! @return True if theBox is outside the selection criterion. + virtual Standard_Boolean Reject (const Bnd_B2f& theBox) const override { return theBox.IsOut (myPnt); } + + //! Redefined from the base class. + //! Called when the bounding of theData conforms to the selection criterion. + //! This method updates myList. + virtual Standard_Boolean Accept (const MyData& theData) override { myList.Append (theData); } + +private: gp_XY myPnt; ListOfSelected myList; }; . . . // Create a UBTree instance and fill it with data, each data item having the corresponding 2D box. - UBTree aTree; -NCollection_UBTreeFiller aTreeFiller(aTree); -for(;;) { - const MyData& aData = …; +NCollection_UBTreeFiller aTreeFiller (aTree); +for(;;) +{ + const MyData& aData = ...; const Bnd_B2d& aBox = aData.GetBox(); - aTreeFiller.Add(aData, aBox); + aTreeFiller.Add (aData, aBox); } aTreeFiller.Fill(); . . . -// Perform selection based on ‘aPoint2d’ -MyTreeSelector aSel(aPoint2d); -aTree.Select(aSel); -const ListOfSelected = aSel.ListAccepted(); +// Perform selection based on "aPoint2d" +MyTreeSelector aSel (aPoint2d); +aTree.Select (aSel); +const ListOfSelected& aSelected = aSel.ListAccepted(); ~~~~~ +##### NCollection_CellFilter -#### SparseArray - - -This type has almost the same features as Vector but it allows to store items having scattered indices. In Vector, if you set an item with index 1000000, the container will allocate memory for all items with indices in the range 0-1000000. In SparseArray, only one small block of items will be reserved that contains the item with index 1000000. - -This class can be also seen as equivalence of *DataMap* with the only one practical difference: it can be much less memory-expensive if items are small (e.g. Integer or Handle). - -This type has both interfaces of DataMap and Vector to access items. - -#### CellFilter - -This class represents a data structure for sorting geometric objects in n-dimensional space into cells, with associated algorithm for fast checking of coincidence (overlapping, intersection, etc.) with other objects. It can be considered as a functional alternative to UBTree, as in the best case it provides the direct access to an object like in an n-dimensional array, while search with UBTree provides logarithmic law access time. - -@subsubsection occt_fcug_3_3_5 Features - -NCollection defines some specific features, in addition to the public API inherited from TCollection classes. - -#### Iterators - -Every collection defines its Iterator class capable of iterating the members in some predefined order. Every Iterator is defined as a subtype of the particular collection type (e.g., MyPackage_StackOfPnt::Iterator ). The order of iteration is defined by a particular collection type. The methods of Iterator are: - -* _void Init (const MyCollection&)_ -- initializes the iterator on the collection object; -* _Standard_Boolean More () const_ -- makes a query if there is another non-iterated member; -* _void Next ()_ -- increments the iterator; -* _const ItemType& Value () const_ -- returns the current member; -* _ItemType& ChangeValue () const_ -- returns the mutable current member +Class *NCollection_CellFilter* represents a data structure for sorting geometric objects in n-dimensional space into cells, with associated algorithm for fast checking of coincidence (overlapping, intersection, etc.) with other objects. +It can be considered as a functional alternative to *NCollection_UBTree*, as in the best case it provides the direct access to an object like in an n-dimensional array, +while search with NCollection_UBTree provides logarithmic law access time. -~~~~~ -typedef Ncollection_Sequence -MyPackage_SequenceOfPnt -void Perform (const MyPackage_SequenceOfPnt& theSequence) -{ - MyPackage_SequenceOfPnt::Iterator anIter (theSequence); - for (; anIter.More(); anIter.Next()) { - const gp_Pnt aPnt& = anIter.Value(); -.... - } -} -~~~~~ - -This feature is present only for some classes in *TCollection (Stack, List, Set, Map, DataMap, DoubleMap)*. In *NCollection* it is generalized. - - -#### Class BaseCollection - -There is a common abstract base class for all collections for a given item type (e.g., gp_Pnt). Developer X can arbitrarily name this base class like *MyPackage_BaseCollPnt* in the examples above. This name is further used in the declarations of any (non-abstract) collection class to designate the C++ inheritance. - -This base class has the following public API: -* abstract class Iterator as the base class for all Iterators descried above; -* _Iterator& CreateIterator () const_ -- creates and returns the Iterator on this collection; -* _Standard_Integer Size () const_ -- returns the number of items in this collection; -* *void Assign (const NCollection_BaseCollection& theOther)* -- copies the contents of the Other to this collection object; - -These members enable accessing any collection without knowing its exact type. In particular, it makes possible to implement methods receiving objects of the abstract collection type: - -~~~~~ -#include -typedef NCollection_Map MyPackage_MapOfPnt; -typedef NCollection_BaseCollection MyPackage_BaseCollPnt; -MyPackage_MapOfPnt aMapPnt; -.... -gp_Pnt aResult = COG (aMapPnt); -.... -gp_Pnt COG(const MyPackage_BaseCollPnt& theColl) -{ - gp_XYZ aCentreOfGravity(0., 0., 0.); -// create type-independent iterator (it is abstract type instance) - MyPackage_BaseCollString::Iterator& anIter = theColl.CreateIterator(); - for (; anIter.More(); anIter.Next()) { - aCentreOfGravity += anIter.Value().XYZ(); - } - return aCentreOfGravity / theColl.Size(); -} -~~~~~ - -Note that there are fundamental differences between the shown type-independent iterator and the iterator belonging to a particular non-abstract collection: -* Type-independent iterator can only be obtained via the call CreateIterator(); the typed iterator -- only via the explicit construction. -* Type-independent iterator is an abstract class, so it is impossible to copy it or to assign it to another collection object; the typed iterators can be copied and reassigned using the method Init(). -* Type-independent iterator is actually destroyed when its collection object is destroyed; the typed iterator is destroyed as any other C++ object in the corresponding C++ scope. - -The common point between them is that it is possible to create any number of both types of iterators on the same collection object. - -#### Heterogeneous Assign - -The semantics of the method *Assign()* has been changed in comparison to *TCollection*. In *NCollection* classes the method *Assign()* is virtual and it receives the object of the abstract *BaseCollection* class (see the previous section). Therefore this method can be used to assign any collection type to any other if only these collections are instantiated on the same *ItemType*. - -For example, conversion of *Map* into *Array1* is performed like this: - -~~~~~ -#include -#include -typedef NCollection_Map MyPackage_MapOfPnt; -typedef NCollection_Array1 MyPackage_Array1OfPnt; -.... -MyPackage_MapOfPnt aMapPnt; -.... -MyPackage_Array1OfPnt anArr1Pnt (1, aMapPnt.Size()); -anArr1Pnt.Assign (aMapPnt); // heterogeneous assignment -~~~~~ - -There are some aspects to mention: -* Unlike in *TCollection*, in *NCollection* the methods *Assign* and operator= do not coincide. The former is a virtual method defined in the *BaseCollection* class. The latter is always defined in instance classes as a non-virtual inline method and it corresponds exactly to the method *Assign* in *TCollection* classes. Therefore it is always profitable to use operator= instead of *Assign* wherever the types on both sides of assignment are known. -* If the method *Assign* copies to *Array1* or *Array2* structure, it first checks if the size of the array is equal to the number of items in the copied collection object. If the sizes differ, an exception is thrown, as in *TCollection_Array1.gxx*. -* Copying to *Map, IndexedMap, DataMap* and *IndexedDataMap* can bring about a loss of data: when two or more copied data items have the same key value, only one item is copied and the others are discarded. It can lead to an error in the code like the following: - -~~~~~ -MyPackage_Array1OfPnt anArr1Pnt (1, 100); -MyPackage_MapOfPnt aMapPnt; -.... -aMapPnt.Assign(anArr1Pnt); -anArr1Pnt.Assign(aMapPnt); -~~~~~ - -Objects of classes parameterised with two types (*DoubleMap, DataMap* and *IndexedDataMap*) cannot be assigned. Their method *Assign* throws the exception *Standard_TypeMismatch* (because it is impossible to check if the passed *BaseCollection* parameter belongs to the same collection type). - -#### Allocator - -All constructors of *NCollection* classes receive the *Allocator* Object as the last parameter. This is an object of a type managed by Handle, inheriting *NCollection_BaseAllocator*, with the following (mandatory) methods redefined: +@subsection occt_fcug_3_2 Collections of Standard Objects +Packages *TShort*, *TColGeom*, *TColGeom2d*, *TColStd*, *TColgp* provide template instantiations (typedefs) of *NCollection* templates to standard OCCT types. +Classes with *H* prefix in name are handle-based variants and inherit Standard_Transient. +~~~~~{.cpp} +typedef NCollection_Array1 TColgp_Array1OfVec; +typedef NCollection_Array1 TColStd_Array1OfAsciiString; ~~~~~ -Standard_EXPORT virtual void* Allocate (const size_t size); -Standard_EXPORT virtual void Free (void * anAddress); -~~~~~ - -It is used internally every time when the collection allocates memory for its item(s) and releases this memory. The default value of this parameter (empty *Handle*) designates the use of *NCollection_BaseAllocator* X where the functions *Standard::Allocate* and *Standard::Free* are called. Therefore if the user of *NCollection* does not specify any allocator as a parameter to the constructor of his collection, the memory management will be identical to the one in *TCollection* and other Open CASCADE Technology classes. - -Nevertheless, the it is possible to define a custom *Allocator* type to manage the memory in the most optimal or convenient way for his algorithms. - -As one possible choice, the class *NCollection_IncAllocator* is included. Unlike *BaseAllocator*, it owns all memory it allocates from the system. Memory is allocated in big blocks (about 20kB) and the allocator keeps track of the amount of occupied memory. The method *Allocate* just increments the pointer to non-occupied memory and returns its previous value. Memory is only released in the destructor of *IncAllocator*, the method *Free* is empty. If used efficiently, this Allocator can greatly improve the performance of OCCT collections. +Packages like *TopTools* also include definitions of collections and hash functions for complex types like shapes -- *TopTools_ShapeMapHasher*, *TopTools_MapOfShape*. +Apart from that class *TColStd_PackedMapOfInteger* provides an alternative implementation of map of integer numbers, +optimized for both performance and memory usage (it uses bit flags to encode integers, which results in spending only 24 bytes per 32 integers stored in optimal case). +This class also provides Boolean operations with maps as sets of integers (union, intersection, subtraction, difference, checks for equality and containment). @subsection occt_fcug_3_4 Strings -Strings are classes that handle dynamically sized sequences of characters based on -ASCII/Unicode UTF-8 (normal 8-bit character type) and UTF-16/UCS-2 (16-bit character type). They provide editing operations with built-in memory management which make the relative objects easier to use than ordinary character arrays. +*TCollection_AsciiString* defines a variable-length sequence of UTF-8 code points (normal 8-bit character type), while *TCollection_ExtendedString* stores UTF-16/UCS-2 code points (16-bit character type). +Both follow value semantics - that is, they are the actual strings, not handles to strings, and are copied through assignment. +*TCollection_HAsciiString* / *TCollection_HExtendedString* are handle wrappers over *TCollection_AsciiString* / *TCollection_ExtendedString*. String classes provide the following services to manipulate character strings: - * Editing operations on string objects, using a built-in string manager - * Handling of dynamically-sized sequences of characters + * Editing operations on string objects, using a built-in string manager + * Handling of dynamically-sized sequences of characters * Conversion from/to ASCII and UTF-8 strings. -Strings may also be manipulated by handles and therefore shared. - -@subsubsection occt_fcug_3_4_1 Examples - -#### TCollection_AsciiString - -A variable-length sequence of ASCII characters (normal 8-bit character type). It provides editing operations with built-in memory management to make *AsciiString* objects easier to use than ordinary character arrays. -*AsciiString* objects follow value semantics;, that is, they are the actual strings, not handles to strings, and are copied through assignment. You may use *HAsciiString* objects to get handles to strings. - -#### TCollection_ExtendedString - -A variable-length sequence of "extended" (UNICODE) characters (16-bit character type). It provides editing operations with built-in memory management to make *ExtendedString* objects easier to use than ordinary extended character arrays. - -*ExtendedString* objects follow value semantics;, that is, they are the actual strings, not handles to strings, and are copied through assignment. You may use *HExtendedString* objects to get handles to strings. - -#### TCollection_HAsciiString - -A variable-length sequence of ASCII characters (normal 8-bit character type). It provides editing operations with built-in memory management to make *HAsciiString* objects easier to use than ordinary character arrays. -*HAsciiString* objects are *handles* to strings. - * *HAsciiString* strings may be shared by several objects. - * You may use an *AsciiString* object to get the actual string. -*HAsciiString* objects use an *AsciiString* string as a field. - -#### TCollection_HExtendedString - -A variable-length sequence of extended; (UNICODE) characters (16-bit character type). It provides editing operations with built-in memory management to make *ExtendedString* objects easier to use than ordinary extended character arrays. -*HExtendedString* objects are *handles* to strings. - * *HExtendedString* strings may be shared by several objects. - * You may use an *ExtendedString* object to get the actual string. -*HExtendedString* objects use an *ExtendedString* string as a field. - -@subsubsection occt_fcug_3_4_2 Conversion - -*Resource_Unicode* provides functions to convert a non-ASCII *C string* given in ANSI, EUC, GB or SJIS format, to a Unicode string of extended characters, and vice versa. +*TCollection_AsciiString* and *TCollection_ExtendedString* provide UTF-8 <-> UTF-16 conversion constructors, making these string classes interchangeable. +*Resource_Unicode* provides functions to convert strings given in ANSI, EUC, GB or SJIS format, to a Unicode string and vice versa. +*NCollection_UtfIterator* class implements an iterator over multibyte UTF-8/UTF-16 strings as a sequence of UTF-32 Unicode symbols. @subsection occt_fcug_3_5 Quantities -Quantities are various classes supporting date and time information and fundamental types representing most physical quantities such as length, area, volume, mass, density, weight, temperature, pressure etc. +Quantities are various classes supporting date and time information and color. Quantity classes provide the following services: - * Definition of primitive types representing most of mathematical and physical quantities; - * Unit conversion tools providing a uniform mechanism for dealing with quantities and associated physical units: check unit compatibility, perform conversions of values between different units, etc. (see package *UnitsAPI*) - * Resources to manage time information such as dates and time periods - * Resources to manage color definition + * Unit conversion tools providing a uniform mechanism for dealing with quantities and associated physical units: check unit compatibility, perform conversions of values between different units, etc. (see package *UnitsAPI*) + * Resources to manage time information such as dates and time periods + * Resources to manage color definition A mathematical quantity is characterized by the name and the value (real). -A physical quantity is characterized by the name, the value (real) and the unit. The unit may be either an international unit complying with the International Unit System (SI) or a user defined unit. The unit is managed by the physical quantity user. - -The fact that both physical and mathematical quantities are manipulated as real values means that : - * They are defined as aliases of real values, so all functions provided by the Standard_Real class are available on each quantity. - * It is possible to mix several physical quantities in a mathematical or physical formula involving real values. - -Quantity package includes all commonly used basic physical quantities. +A physical quantity is characterized by the name, the value (real) and the unit. +The unit may be either an international unit complying with the International Unit System (SI) or a user defined unit. +The unit is managed by the physical quantity user. @subsection occt_fcug_3_6 Unit Conversion -The *UnitsAPI* global functions are used to convert a value from any unit into another unit. Conversion is executed among three unit systems: +The *UnitsAPI* global functions are used to convert a value from any unit into another unit. +Conversion is executed among three unit systems: * the **SI System**, - * the user’s **Local System**, - * the user’s **Current System**. -The **SI System** is the standard international unit system. It is indicated by *SI* in the signatures of the *UnitsAPI* functions. - -The OCCT (former MDTV) System corresponds to the SI international standard but the length unit and all its derivatives use the millimeter instead of the meter. - -Both systems are proposed by Open CASCADE Technology; the SI System is the standard option. By selecting one of these two systems, you define your **Local System** through the *SetLocalSystem* function. The **Local System** is indicated by *LS* in the signatures of the *UnitsAPI* functions. -The Local System units can be modified in the working environment. You define your **Current System** by modifying its units through the *SetCurrentUnit* function. The Current System is indicated by *Current* in the signatures of the *UnitsAPI* functions. -A physical quantity is defined by a string (example: LENGTH). + * the user's **Local System**, + * the user's **Current System**. + +The **SI System** is the standard international unit system. +It is indicated by *SI* in the signatures of the *UnitsAPI* functions. +The OCCT (former MDTV) System corresponds to the SI international standard but the length unit and all its derivatives use the millimeter instead of the meter. + +Both systems are proposed by Open CASCADE Technology; the SI System is the standard option. +By selecting one of these two systems, you define your **Local System** through the *SetLocalSystem* function. +The **Local System** is indicated by *LS* in the signatures of the *UnitsAPI* functions. +The Local System units can be modified in the working environment. +You define your **Current System** by modifying its units through the *SetCurrentUnit* function. +The Current System is indicated by *Current* in the signatures of the *UnitsAPI* functions. +A physical quantity is defined by a string (example: LENGTH). @section occt_occt_fcug_4 Math Primitives and Algorithms @subsection occt_occt_fcug_4_1 Overview -Math primitives and algorithms available in Open CASCADE Technology include: +Math primitives and algorithms available in Open CASCADE Technology include: * Vectors and matrices * Geometric primitives * Math algorithms - -@subsection occt_occt_fcug_4_2 Vectors and Matrices - -The Vectors and Matrices component provides a C++ implementation of the fundamental types *Vector* and *Matrix*, which are regularly used to define more complex data structures. -The Vector and Matrix classes provide commonly used mathematical algorithms which -include: +@subsection occt_occt_fcug_4_2 Vectors and Matrices - * Basic calculations involving vectors and matrices; - * Computation of eigenvalues and eigenvectors of a square matrix; - * Solvers for a set of linear algebraic equations; - * Algorithms to find the roots of a set of non-linear equations; - * Algorithms to find the minimum function of one or more independent variables. +The Vectors and Matrices component provides a C++ implementation of the fundamental types *math_Vector* and *math_Matrix*, which are regularly used to define more complex data structures. -These classes also provide a data structure to represent any expression, -relation, or function used in mathematics, including the assignment of variables. +The math_Vector and math_Matrix classes provide commonly used mathematical algorithms which include: -Vectors and matrices have arbitrary ranges which must be defined at declaration time -and cannot be changed after declaration. + * Basic calculations involving vectors and matrices; + * Computation of eigenvalues and eigenvectors of a square matrix; + * Solvers for a set of linear algebraic equations; + * Algorithms to find the roots of a set of non-linear equations; + * Algorithms to find the minimum function of one or more independent variables. -~~~~~ -math_Vector v(1, 3); -// a vector of dimension 3 with range (1..3) -math_Matrix m(0, 2, 0, 2); -// a matrix of dimension 3x3 with range (0..2, 0..2) -math_Vector v(N1, N2); -// a vector of dimension N2-N1+1 with range (N1..N2) -~~~~~ +These classes also provide a data structure to represent any expression, relation, or function used in mathematics, including the assignment of variables. -Vector and Matrix objects use value semantics. In other words, they cannot be shared and are copied through assignment. +Vectors and matrices have arbitrary ranges which must be defined at declaration time and cannot be changed after declaration. +~~~~~{.cpp} +math_Vector aVec (1, 3); +// a vector of dimension 3 with range (1..3) +math_Matrix aMat (0, 2, 0, 2); +// a matrix of dimension 3x3 with range (0..2, 0..2) +math_Vector aVec (N1, N2); +// a vector of dimension N2-N1+1 with range (N1..N2) ~~~~~ -math_Vector v1(1, 3), v2(0, 2); -v2 = v1; -// v1 is copied into v2. a modification of v1 does not affect v2 -~~~~~ - -Vector and Matrix values may be initialized and obtained using indexes which must lie within the range definition of the vector or the matrix. -~~~~~ -math_Vector v(1, 3); -math_Matrix m(1, 3, 1, 3); -Standard_Real value; +Vector and Matrix objects use value semantics. +In other words, they cannot be shared and are copied through assignment. -v(2) = 1.0; -value = v(1); -m(1, 3) = 1.0; -value = m(2, 2); +~~~~~{.cpp} +math_Vector aVec1 (1, 3), aVec2 (0, 2); +aVec2 = aVec1; +// aVec1 is copied into aVec2; a modification of aVec1 does not affect aVec2 ~~~~~ -Some operations on Vector and Matrix objects may not be legal. In this case an exception is raised. Two standard exceptions are used: - * *Standard_DimensionError* exception is raised when two matrices or vectors involved in an operation are of incompatible dimensions. - * *Standard_RangeError* exception is raised if an access outside the range definition of a vector or of a matrix is attempted. - -~~~~~~ -math_Vector v1(1, 3), v2(1, 2), v3(0, 2); -v1 = v2; -// error: Standard_DimensionError is raised - -v1 = v3; -// OK: ranges are not equal but dimensions are -// compatible +Vector and Matrix values may be initialized and obtained using indexes which must lie within the range definition of the vector or the matrix. -v1(0) = 2.0; -// error: Standard_RangeError is raised +~~~~~{.cpp} +math_Vector aVec (1, 3); +math_Matrix aMat (1, 3, 1, 3); +Standard_Real aValue; + +aVec (2) = 1.0; +aValue = aVec(1); +aMat (1, 3) = 1.0; +aValue = aMat (2, 2); +~~~~~ + +Some operations on Vector and Matrix objects may not be legal. +In this case an exception is raised. +Two standard exceptions are used: + * *Standard_DimensionError* exception is raised when two matrices or vectors involved in an operation are of incompatible dimensions. + * *Standard_RangeError* exception is raised if an access outside the range definition of a vector or of a matrix is attempted. + +~~~~~~{.cpp} +math_Vector aVec1 (1, 3), aVec2 (1, 2), aVec3 (0, 2); +aVec1 = aVec2; // error: Standard_DimensionError is raised +aVec1 = aVec3; // OK: ranges are not equal but dimensions are compatible +aVec1 (0) = 2.0; // error: Standard_RangeError is raised ~~~~~~ @subsection occt_occt_fcug_4_3 Primitive Geometric Types -Open CASCADE Technology primitive geometric types are a STEP-compliant implementation of basic geometric and algebraic entities. -They provide: +Open CASCADE Technology primitive geometric types are a STEP-compliant implementation of basic geometric and algebraic entities. +They provide: * Descriptions of primitive geometric shapes, such as: - * Points; - * Vectors; - * Lines; - * Circles and conics; - * Planes and elementary surfaces; + * Points; + * Vectors; + * Lines; + * Circles and conics; + * Planes and elementary surfaces; * Positioning of these shapes in space or in a plane by means of an axis or a coordinate system; * Definition and application of geometric transformations to these shapes: - * Translations; - * Rotations; - * Symmetries; - * Scaling transformations; - * Composed transformations; + * Translations; + * Rotations; + * Symmetries; + * Scaling transformations; + * Composed transformations; * Tools (coordinates and matrices) for algebraic computation. - -All these functions are provided by geometric processor package gp. Its classes for 2d and 3d objects are handled by value rather than by reference. When this sort of object is copied, it is copied entirely. Changes in one instance will not be reflected in another. - -The *gp* package defines the basic geometric entities used for algebraic calculation and basic analytical geometry in 2d & 3d space. It also provides basic transformations such as identity, rotation, translation, mirroring, scale transformations, combinations of transformations, etc. Entities are handled by value. - -Note that gp curves and surfaces are analytic: there is no parameterization and no orientation on gp entities, i.e. these entities do not provide functions which work with these properties. - -If you need, you may use more evolved data structures provided by Geom (in 3D space) and Geom2d (in the plane). However, the definition of gp entities is identical to the one of equivalent Geom and Geom2d entities, and they are located in the plane or in space with the same kind of positioning systems. They implicitly contain the orientation, which they express on the Geom and Geom2d entities, and they induce the definition of their parameterization. -Therefore, it is easy to give an implicit parameterization to gp curves and surfaces, which is the parametrization of the equivalent Geom or Geom2d entity. This property is particularly useful when computing projections or intersections, or for operations involving complex algorithms where it is particularly important to manipulate the simplest data structures, i.e. those of gp. Thus, ElCLib and ElSLib packages provide functions to compute: +All these functions are provided by geometric processor package gp. +Its classes for 2d and 3d objects are handled by value rather than by reference. +When this sort of object is copied, it is copied entirely. +Changes in one instance will not be reflected in another. + +The *gp* package defines the basic geometric entities used for algebraic calculation and basic analytical geometry in 2d & 3d space. +It also provides basic transformations such as identity, rotation, translation, mirroring, scale transformations, combinations of transformations, etc. +Entities are handled by value. + +Note that gp curves and surfaces are analytic: there is no parameterization and no orientation on gp entities, i.e. these entities do not provide functions which work with these properties. + +If you need, you may use more evolved data structures provided by Geom (in 3D space) and Geom2d (in the plane). +However, the definition of gp entities is identical to the one of equivalent Geom and Geom2d entities, and they are located in the plane or in space with the same kind of positioning systems. +They implicitly contain the orientation, which they express on the Geom and Geom2d entities, and they induce the definition of their parameterization. + +Therefore, it is easy to give an implicit parameterization to gp curves and surfaces, which is the parametrization of the equivalent Geom or Geom2d entity. +This property is particularly useful when computing projections or intersections, or for operations involving complex algorithms where it is particularly important to manipulate the simplest data structures, i.e. those of gp. +Thus, ElCLib and ElSLib packages provide functions to compute: * the point of parameter u on a 2D or 3D gp curve, * the point of parameter (u,v) on a gp elementary surface, and * any derivative vector at this point. -Note: the gp entities cannot be shared when they are inside more complex data structures. - +Note: the gp entities cannot be shared when they are inside more complex data structures. + @subsection occt_occt_fcug_4_4 Collections of Primitive Geometric Types -Before creating a geometric object, you must decide whether you are in a 2d or in a 3d context and how you want to handle the object. -If you do not need a single instance of a geometric primitive but a set of them then the package which deals with collections of this sort of object, *TColgp*, will provide the necessary functionality. -In particular, this package provides standard and frequently used instantiations of generic classes with geometric objects, i.e. *XY*, *XYZ*, *Pnt*, *Pnt2d*, *Vec*, *Vec2d*, *Lin*, *Lin2d*, *Circ*, *Circ2d.* +Before creating a geometric object, you must decide whether you are in a 2d or in a 3d context and how you want to handle the object. +If you do not need a single instance of a geometric primitive but a set of them then the package which deals with collections of this sort of object, *TColgp*, will provide the necessary functionality. +In particular, this package provides standard and frequently used instantiations of generic classes with geometric objects, i.e. *gp_XY*, *gp_XYZ*, *gp_Pnt*, *gp_Pnt2d*, *gp_Vec*, *gp_Vec2d*, *gp_Lin*, *gp_Lin2d*, *gp_Circ*, *gp_Circ2d*. @subsection occt_occt_fcug_4_5 Basic Geometric Libraries -There are various library packages available which offer a range of basic computations on curves and surfaces. -If you are dealing with objects created from the *gp* package, the useful algorithms are in the elementary curves and surfaces libraries -- the *ElCLib* and *ElSLib* packages. -* *EICLib* provides methods for analytic curves. This is a library of simple computations on curves from the *gp* package (Lines, Circles and Conics). It is possible to compute points with a given parameter or to compute the parameter for a point. -* *EISLib* provides methods for analytic surfaces. This is a library of simple computations on surfaces from the package *gp* (Planes, Cylinders, Spheres, Cones, Tori). It is possible to compute points with a given pair of parameters or to compute the parameter for a point. There is a library for calculating normals on curves and surfaces. +There are various library packages available which offer a range of basic computations on curves and surfaces. +If you are dealing with objects created from the *gp* package, the useful algorithms are in the elementary curves and surfaces libraries -- the *ElCLib* and *ElSLib* packages. +* *EICLib* provides methods for analytic curves. + This is a library of simple computations on curves from the *gp* package (Lines, Circles and Conics). + It is possible to compute points with a given parameter or to compute the parameter for a point. +* *EISLib* provides methods for analytic surfaces. + This is a library of simple computations on surfaces from the package *gp* (Planes, Cylinders, Spheres, Cones, Tori). + It is possible to compute points with a given pair of parameters or to compute the parameter for a point. + There is a library for calculating normals on curves and surfaces. -Additionally, *Bnd* package provides a set of classes and tools to operate with bounding boxes of geometric objects in 2d and 3d space. +Additionally, *Bnd* package provides a set of classes and tools to operate with bounding boxes of geometric objects in 2d and 3d space. @subsection occt_occt_fcug_4_6 Common Math Algorithms The common math algorithms library provides a C++ implementation of the most frequently used mathematical algorithms. These include: * Algorithms to solve a set of linear algebraic equations, - * Algorithms to find the minimum of a function of one or more independent variables, - * Algorithms to find roots of one, or of a set, of non-linear equations, - * An algorithm to find the eigenvalues and eigenvectors of a square matrix. - -All mathematical algorithms are implemented using the same principles. They contain: -A constructor performing all, or most of, the calculation, given the appropriate arguments. All relevant information is stored inside the resulting object, so that all subsequent calculations or interrogations will be solved in the most efficient way. + * Algorithms to find the minimum of a function of one or more independent variables, + * Algorithms to find roots of one, or of a set, of non-linear equations, + * An algorithm to find the eigenvalues and eigenvectors of a square matrix. + +All mathematical algorithms are implemented using the same principles. +They contain: + * A constructor performing all, or most of, the calculation, given the appropriate arguments. + All relevant information is stored inside the resulting object, so that all subsequent calculations or interrogations will be solved in the most efficient way. + * A function *IsDone* returning the boolean true if the calculation was successful. + * A set of functions, specific to each algorithm, enabling all the various results to be obtained. + Calling these functions is legal only if the function *IsDone* answers **true**, otherwise the exception *StdFail_NotDone* is raised. -A function *IsDone* returning the boolean true if the calculation was successful. -A set of functions, specific to each algorithm, enabling all the various results to be obtained. -Calling these functions is legal only if the function *IsDone* answers **true**, otherwise the exception *StdFail_NotDone* is raised. +The example below demonstrates the use of the math_Gauss class, which implements the Gauss solution for a set of linear equations. +The following definition is an extract from the header file of the class *math_Gauss*: -The example below demonstrates the use of the Gauss class, which implements the Gauss solution for a set of linear equations.The following definition is an extract from the header file of the class *math_Gauss*: - -~~~~~~ -class Gauss { +~~~~~~{.cpp} +class math_Gauss +{ public: - Gauss (const math_Matrix& A); + math_Gauss (const math_Matrix& A); Standard_Boolean IsDone() const; - void Solve (const math_Vector& B, - math_Vector& X) const; + void Solve (const math_Vector& B, math_Vector& X) const; }; ~~~~~~ -Now the main program uses the Gauss class to solve the equations a*x1=b1 and a*x2=b2: +Now the main program uses the math_Gauss class to solve the equations _a*x1=b1_ and _a*x2=b2_: -~~~~~ +~~~~~{.cpp} #include #include -main () +main() { math_Vector a(1, 3, 1, 3); math_Vector b1(1, 3), b2(1, 3); math_Vector x1(1, 3), x2(1, 3); // a, b1 and b2 are set here to the appropriate values - math_Gauss sol(a); // computation of the - // LU decomposition of A - if(sol.IsDone()) { // is it OK ? - sol.Solve(b1, x1); // yes, so compute x1 - sol.Solve(b2, x2); // then x2 + ... + + math_Gauss aSol(a); // computation of the LU decomposition of A + if (aSol.IsDone()) // is it OK ? + { + aSol.Solve(b1, x1); // yes, so compute x1 + aSol.Solve(b2, x2); // then x2 ... } - else { // it is not OK: + else // it is not OK: + { // fix up - sol.Solve(b1, x1); // error: + aSol.Solve(b1, x1); // error: // StdFail_NotDone is raised } } ~~~~~ -The next example demonstrates the use of the *BissecNewton* class, which implements a combination of the Newton and Bissection algorithms to find the root of a function known to lie between two bounds. The definition is an extract from the header file of the class *math_BissecNewton*: +The next example demonstrates the use of the *math_BissecNewton* class, which implements a combination of the Newton and Bissection algorithms to find the root of a function known to lie between two bounds. +The definition is an extract from the header file of the class *math_BissecNewton*: -~~~~~ -class BissecNewton { - public: - BissecNewton (math_FunctionWithDerivative& f, - const Standard_Real bound1, - const Standard_Real bound2, - const Standard_Real tolx); - Standard_Boolean IsDone() const; - Standard_Real Root(); +~~~~~{.cpp} +class math_BissecNewton +{ +public: + math_BissecNewton (math_FunctionWithDerivative& f, + const Standard_Real bound1, + const Standard_Real bound2, + const Standard_Real tolx); + Standard_Boolean IsDone() const; + Standard_Real Root(); }; ~~~~~ -The abstract class *math_FunctionWithDerivative* describes the services which have to be implemented for the function f which is to be used by a *BissecNewton* algorithm. The following definition corresponds to the header file of the abstract class *math_FunctionWithDerivative*: +The abstract class *math_FunctionWithDerivative* describes the services which have to be implemented for the function _f_ which is to be used by a *math_BissecNewton* algorithm. +The following definition corresponds to the header file of the abstract class *math_FunctionWithDerivative*: -~~~~~ -class math_FunctionWithDerivative { - public: - virtual Standard_Boolean Value - (const Standard_Real x, Standard_Real& f) = 0; - virtual Standard_Boolean Derivative - (const Standard_Real x, Standard_Real& d) = 0; - virtual Standard_Boolean Values - (const Standard_Real x, - Standard_Real& f, - Standard_Real& d) = 0; -}; +~~~~~{.cpp} +class math_FunctionWithDerivative +{ +public: + virtual Standard_Boolean Value (const Standard_Real x, Standard_Real& f) = 0; + virtual Standard_Boolean Derivative (const Standard_Real x, Standard_Real& d) = 0; + virtual Standard_Boolean Values (const Standard_Real x, Standard_Real& f, Standard_Real& d) = 0; +}; ~~~~~ -Now the test sample uses the *BissecNewton* class to find the root of the equation *f(x)=x**2-4* in the interval [1.5, 2.5]: the function to solve is implemented in the class *myFunction* which inherits from the class *math_FunctionWithDerivative*, then the main program finds the required root. +Now the test sample uses the *math_BissecNewton* class to find the root of the equation _f(x)=x**2-4_ in the interval [1.5, 2.5]. +The function to solve is implemented in the class *myFunction* which inherits from the class *math_FunctionWithDerivative*, then the main program finds the required root. -~~~~~ -#include +~~~~~{.cpp} +#include #include -class myFunction : public math_FunctionWithDerivative +class myFunction : public math_FunctionWithDerivative { - Standard_Real coefa, coefb, coefc; + Standard_Real myCoefA, myCoefB, myCoefC; - public: - myFunction (const Standard_Real a, const Standard_Real b, - const Standard_Real c) : - coefa(a), coefb(b), coefc(c) - {} +public: + myFunction (const Standard_Real theA, const Standard_Real theB, const Standard_Real theC) + : myCoefA(a), myCoefB(b), myCoefC(c) {} - virtual Standard_Boolean Value (const Standard_Real x, - Standard_Real& f) - { - f = coefa * x * x + coefb * x + coefc; - } + virtual Standard_Boolean Value (const Standard_Real x, Standard_Real& f) override + { + f = myCoefA * x * x + myCoefB * x + myCoefC; + } - virtual Standard_Boolean Derivative (const Standard_Real x, - Standard_Real& d) - { - d = coefa * x * 2.0 + coefb; - } + virtual Standard_Boolean Derivative (const Standard_Real x, Standard_Real& d) override + { + d = myCoefA * x * 2.0 + myCoefB; + } - virtual Standard_Boolean Values (const Standard_Real x, - Standard_Real& f, Standard_Real& d) - { - f = coefa * x * x + coefb * x + coefc; - d = coefa * x * 2.0 + coefb; - } + virtual Standard_Boolean Values (const Standard_Real x, Standard_Real& f, Standard_Real& d) override + { + f = myCoefA * x * x + myCoefB * x + myCoefC; + d = myCoefA * x * 2.0 + myCoefB; + } }; main() { - myFunction f(1.0, 0.0, 4.0); - math_BissecNewton sol(F, 1.5, 2.5, 0.000001); - if(Sol.IsDone()) { // is it OK ? - Standard_Real x = sol.Root(); // yes. + myFunction aFunc (1.0, 0.0, 4.0); + math_BissecNewton aSol (aFunc, 1.5, 2.5, 0.000001); + if (aSol.IsDone()) // is it OK ? + { + Standard_Real x = aSol.Root(); // yes } - else { // no + else // no + { } ~~~~~ @subsection occt_occt_fcug_4_7 Precision -On the OCCT platform, each object stored in the database should carry its own precision value. This is important when dealing with systems where objects are imported from other systems as well as with various associated precision values. +On the OCCT platform, each object stored in the database should carry its own precision value. +This is important when dealing with systems where objects are imported from other systems as well as with various associated precision values. + +The *Precision* package addresses the daily problem of the geometric algorithm developer: what precision setting to use to compare two numbers. +Real number equivalence is clearly a poor choice. +The difference between the numbers should be compared to a given precision setting. -The *Precision* package addresses the daily problem of the geometric algorithm developer: what precision setting to use to compare two numbers. Real number equivalence is clearly a poor choice. The difference between the numbers should be compared to a given precision setting. +Do not write _if (X1 == X2)_, instead write _if (Abs(X1-X2) < Precision)_. -Do not write _if (X1 == X2),_ instead write _if (Abs(X1-X2) < Precision)._ +Also, to order real numbers, keep in mind that _if (X1 < X2 - Precision)_ is incorrect. +_if (X2 - X1 > Precision)_ is far better when *X1* and *X2* are high numbers. -Also, to order real numbers, keep in mind that _if (X1 < X2 - Precision)_ is incorrect. -_if (X2 - X1 > Precision)_ is far better when *X1* and *X2* are high numbers. +This package proposes a set of methods providing precision settings for the most commonly encountered situations. -This package proposes a set of methods providing precision settings for the most commonly encountered situations. +In Open CASCADE Technology, precision is usually not implicit; low-level geometric algorithms accept precision settings as arguments. +Usually these should not refer directly to this package. -In Open CASCADE Technology, precision is usually not implicit; low-level geometric algorithms accept precision settings as arguments. Usually these should not refer directly to this package. +High-level modeling algorithms have to provide a precision setting to the low level geometric algorithms they call. +One way is to use the settings provided by this package. +The high-level modeling algorithms can also have their own strategy for managing precision. +As an example the Topology Data Structure stores precision values which are later used by algorithms. +When a new topology is created, it takes the stored value. -High-level modeling algorithms have to provide a precision setting to the low level geometric algorithms they call. One way is to use the settings provided by this package. The high-level modeling algorithms can also have their own strategy for managing precision. As an example the Topology Data Structure stores precision values which are later used by algorithms. When a new topology is created, it takes the stored value. -Different precision settings offered by this package cover the most common needs of geometric algorithms such as *Intersection* and *Approximation*. -The choice of a precision value depends both on the algorithm and on the geometric space. The geometric space may be either: - * a real space, 3d or 2d where the lengths are measured in meters, micron, inches, etc. - * a parametric space, 1d on a curve or 2d on a surface where numbers have no dimension. -The choice of precision value for parametric space depends not only on the accuracy of the machine, but also on the dimensions of the curve or the surface. -This is because it is desirable to link parametric precision and real precision. If you are on a curve defined by the equation *P(t)*, you would want to have equivalence between the following: +Different precision settings offered by this package cover the most common needs of geometric algorithms such as *Intersection* and *Approximation*. +The choice of a precision value depends both on the algorithm and on the geometric space. +The geometric space may be either: + * a real space, 3d or 2d where the lengths are measured in meters, micron, inches, etc. + * a parametric space, 1d on a curve or 2d on a surface where numbers have no dimension. + +The choice of precision value for parametric space depends not only on the accuracy of the machine, but also on the dimensions of the curve or the surface. +This is because it is desirable to link parametric precision and real precision. +If you are on a curve defined by the equation *P(t)*, you would want to have equivalence between the following: ~~~~~ -Abs(t1-t2) < ParametricPrecision -Distance (P(t1),P(t2)) < RealPrecision. + Abs (t1 - t2) < ParametricPrecision + Distance (P(t1), P(t2)) < RealPrecision ~~~~~ @subsubsection occt_occt_fcug_4_7_1 The Precision package -The *Precision* package offers a number of package methods and default precisions for use in dealing with angles, distances, intersections, approximations, and parametric space. -It provides values to use in comparisons to test for real number equalities. - * Angular precision compares angles. - * Confusion precision compares distances. - * Intersection precision is used by intersection algorithms. - * Approximation precision is used by approximation algorithms. - * Parametric precision gets a parametric space precision from a 3D precision. - * *Infinite* returns a high number that can be considered to be infinite. Use -Infinite for a high negative number. - + +The *Precision* package offers a number of package methods and default precisions for use in dealing with angles, distances, intersections, approximations, and parametric space. +It provides values to use in comparisons to test for real number equalities. + * **Angular** precision compares angles. + * **Confusion** precision compares distances. + * **Intersection** precision is used by intersection algorithms. + * **Approximation** precision is used by approximation algorithms. + * **Parametric** precision gets a parametric space precision from a 3D precision. + * **Infinite** returns a high number that can be considered to be infinite. + Use -Infinite for a high negative number. + @subsubsection occt_occt_fcug_4_7_2 Standard Precision values -This package provides a set of real space precision values for algorithms. The real space precisions are designed for precision to *0.1* nanometers. The only unit available is the millimeter. -The parametric precisions are derived from the real precisions by the *Parametric* function. This applies a scaling factor which is the length of a tangent to the curve or the surface. You, the user, provide this length. There is a default value for a curve with [0,1] parameter space and a length less than 100 meters. -The geometric packages provide Parametric precisions for the different types of curves. -The *Precision* package provides methods to test whether a real number can be considered to be infinite. + +This package provides a set of real space precision values for algorithms. +The real space precisions are designed for precision to *0.1* nanometers (in case if model is defined in millimeters). + +The parametric precisions are derived from the real precisions by the *Parametric* function. +This applies a scaling factor which is the length of a tangent to the curve or the surface. +You, the user, provide this length. +There is a default value for a curve with [0,1] parameter space and a length less than 100 meters. + +The geometric packages provide Parametric precisions for the different types of curves. +The *Precision* package provides methods to test whether a real number can be considered to be infinite. #### Precision::Angular -This method is used to compare two angles. Its current value is *Epsilon(2 * PI)* i.e. the smallest number *x* such that *2*PI + x* is different of *2\*PI*. +This method is used to compare two angles. +Its current value is *Epsilon(2 * PI)* i.e. the smallest number *x* such that *2*PI + x* is different of *2\*PI*. -It can be used to check confusion of two angles as follows: -_Abs(Angle1 - Angle2) < Precision::Angular()_ +It can be used to check confusion of two angles as follows: +~~~{.cpp} +bool areEqualAngles (double theAngle1, double theAngle2) +{ + return Abs(theAngle1 - theAngle2) < Precision::Angular(); +} +~~~ -It is also possible to check parallelism of two vectors (_Vec_ from _gp_) as follows _V1.IsParallel(V2,Precision::Angular())_ +It is also possible to check parallelism of two vectors as follows: +~~~{.cpp} +bool areParallelVectors (const gp_Vec& theVec1, const gp_Vec& theVec2) +{ + return theVec1.IsParallel (theVec2, Precision::Angular()); +} +~~~ -Note that *Precision::Angular()* can be used on both dot and cross products because for small angles the *Sine* and the *Angle* are equivalent. So to test if two directions of type *gp_Dir* are perpendicular, it is legal to use the following code: -_Abs(D1 * D2) < Precision::Angular()_ +Note that *Precision::Angular()* can be used on both dot and cross products because for small angles the *Sine* and the *Angle* are equivalent. +So to test if two directions of type *gp_Dir* are perpendicular, it is legal to use the following code: +~~~{.cpp} +bool arePerpendicular (const gp_Dir& theDir1, const gp_Dir& theDir2) +{ + return Abs(theDir1 * theDir2) < Precision::Angular(); +} +~~~ #### Precision::Confusion -This method is used to test 3D distances. The current value is *1.e-7*, in other words, 1/10 micron if the unit used is the millimeter. +This method is used to test 3D distances. +The current value is *1.e-7*, in other words, 1/10 micron if the unit used is the millimeter. -It can be used to check confusion of two points (_Pnt_ from _gp_) as follows: -_P1.IsEqual(P2,Precision::Confusion())_ +It can be used to check confusion of two points as follows: +~~~{.cpp} +bool areEqualPoints (const gp_Pnt& thePnt1, const gp_Pnt& thePnt2) +{ + return thePnt1.IsEqual (thePnt2, Precision::Confusion()); +} +~~~ -It is also possible to find a vector of null length (_Vec_ from _gp_) : -_V.Magnitude() < Precision::Confusion()_ +It is also possible to find a vector of null length: +~~~{.cpp} +bool isNullVector (const gp_Vec& theVec) +{ + return theVec.Magnitude() < Precision::Confusion(); +} +~~~ #### Precision::Intersection -This is reasonable precision to pass to an Intersection process as a limit of refinement of Intersection Points. *Intersection* is high enough for the process to converge quickly. *Intersection* is lower than *Confusion* so that you still get a point on the intersected geometries. The current value is *Confusion() / 100*. +This is reasonable precision to pass to an Intersection process as a limit of refinement of Intersection Points. +*Intersection* is high enough for the process to converge quickly. +*Intersection* is lower than *Confusion* so that you still get a point on the intersected geometries. +The current value is *Confusion() / 100*. #### Precision::Approximation -This is a reasonable precision to pass to an approximation process as a limit of refinement of fitting. The approximation is greater than the other precisions because it is designed to be used when the time is at a premium. It has been provided as a reasonable compromise by the designers of the Approximation algorithm. The current value is *Confusion() * 10*. -Note that Approximation is greater than Confusion, so care must be taken when using Confusion in an approximation process. - - +This is a reasonable precision to pass to an approximation process as a limit of refinement of fitting. +The approximation is greater than the other precisions because it is designed to be used when the time is at a premium. +It has been provided as a reasonable compromise by the designers of the Approximation algorithm. +The current value is *Confusion() * 10*. +Note that Approximation is greater than Confusion, so care must be taken when using Confusion in an approximation process. Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/foundation_classes/images/foundation_classes_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/foundation_classes/images/foundation_classes_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/foundation_classes/images/foundation_classes_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/foundation_classes/images/foundation_classes_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/foundation_classes/images/foundation_classes_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/foundation_classes/images/foundation_classes_image006.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/iges/iges.md opencascade-7.5.1+dfsg1/dox/user_guides/iges/iges.md --- opencascade-7.4.1+dfsg1/dox/user_guides/iges/iges.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/iges/iges.md 2021-02-02 08:51:56.000000000 +0000 @@ -1,4 +1,4 @@ -IGES Support {#occt_user_guides__iges} +IGES Translator {#occt_user_guides__iges} ================== @tableofcontents @@ -15,7 +15,7 @@ * an IGES entity is an entity in the IGES normal sense. * a root entity is the highest level entity of any given type, e.g. type 144 for surfaces and type 186 for solids. Roots are not referenced by other entities. -This manual mainly explains how to convert an IGES file to an Open CASCADE Technology (**OCCT**) shape and vice versa. It provides basic documentation on conversion. For advanced information on conversion, see our E-learning & Training offerings. +This manual mainly explains how to convert an IGES file to an Open CASCADE Technology (**OCCT**) shape and vice versa. It provides basic documentation on conversion. IGES files produced in accordance with IGES standard versions up to and including version 5.3 can be read. IGES files that are produced by this interface conform to IGES version 5.3 (Initial Graphics Exchange Specification, IGES 5.3. ANS US PRO/IPO-100-1996). Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_image056.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_image056.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_image057.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_image057.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_001.svg opencascade-7.5.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_001.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_001.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_001.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +BRepMesh Workflow + + + + + + +Create Model Data Structure + + + + + + + +IMeshData_Model : [1] + + + + + + +Discretize Edges 3D & 2D Curves + + + + + + + +IMeshData_Model : [1] + + + + + + +Heal Discrete Model + + + + +Preprocess Discrete Model + + + + +Discretize Faces + + + + +Postprocess Discrete Model + + + +TopoDS_Shape + +Mesh + + + +Meshing Parameters : IMeshTools_Parameters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_002.svg opencascade-7.5.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_002.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_002.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_002.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,715 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +IMeshTools_Parameters + + + +Deflection : Real [1] + +Angle : Real [1] + +MinSize : Real [1] + +Relative : Boolean [1] + +InParallel : Boolean [1] + +InternalVerticesMode : +Boolean [1] + +ControlSurfaceDeflection : +Boolean [1] + +CleanModel : Boolean [1] + + + + + + + + +IMeshTools_Context + + + +myParameters : IMeshTools_Parameters [1] + +myModel : [1] + +myModelBuilder : IMeshTools_ModelBuilder [1] + +myEdgeDiscret : IMeshTools_ModelAlgo [1] + +myModelHealer : IMeshTools_ModelAlgo [1] + +myPreProcessor : IMeshTools_ModelAlgo [1] + +myFaceDiscret : IMeshTools_ModelAlgo [1] + +myPostProcessor : IMeshTools_ModelAlgo [1] + +GetParameters() + +ChangeParameters() + +BuildModel() + +GetModel() + +DiscretizeEdges() + +HealModel() + +PreProcessModel() + +DiscretizeFaces() + +PostProcessModel() + +SetModelBuilder() + +GetModelBuilder() + +SetEdgeDiscret() + +GetEdgeDiscret() + +SetModelHealer() + +GetModelHealer() + +SetPreProcessor() + +GetPreProcessor() + +SetFaceDiscret() + +GetFaceDiscret() + +SetPostProcessor() + +GetPostProcessor() + +Clean() + + + + + + + + +IMeshTools_ModelBuilder + + + +Perform(TopoDS_Shape : , +IMeshTools_Parameter : ) + + + + + + + + +IMeshTools_ModelAlgo + + + +Perform(IMeshData_Model : , +IMeshTools_Parameters : ) + + + + + + + + +IMeshData_Model + + + +GetMaxSize() + +FacesNb() + +AddFace() + +GetFace() + +EdgesNb() + +AddEdge() + +GetEdge() + + + + + + + + +IMeshTools_MeshBuilder + + + +SetContext() + +GetContext() + +Perform() + + + + + + + + +<<use>> + + + + + +<<use>> + + + + + +<<use>> + + + +caches +context[1] +parameters[1] + + + + + +caches +context[1] +builder[1] + + + + + +caches +context[1] +model[1] + + + + + +caches +context[1] +algo[5] + + + + + +<<use>> + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_003.svg opencascade-7.5.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_003.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_003.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_003.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,5085 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IMeshData_Shape + + + + myShape : + TopoDS_Shape [1] + + SetShape() + + GetShape() + + + + + + + + + IMeshData_Model + + + + GetMaxSize() + + FacesNb() + + AddFace() + + GetFace() + + EdgesNb() + + AddEdge() + + GetEdge() + + + + + + + + + IMeshData_TessellatedShape + + + + SetDeflection() + + GetDeflection() + + + + + + + + + IMeshData_Edge + + + + GetEdge() + + SetCurve() + + GetCurve() + + PCurvesNb() + + AddPCurve() + + GetPCurve() + + Clear() + + IsFree() + + GetAngularDeflection() + + SetAngularDeflection() + + SetSameParam() + + GetSameParam() + + SetSameRange() + + GetSameRange() + + SetDegenerated() + + GetDegenerated() + + + + + + + + + IMeshData_Wire + + + + GetWire() + + EdgesNb() + + AddEdge() + + GetEdge() + + GetEdgeOrientation() + + + + + + + + + IMeshData_Face + + + + GetFace() + + WiresNb() + + AddWire() + + GetWire() + + GetSurface() + + IsValid() + + + + + + + + + IMeshData_StatusOwner + + + + IsEqual() + + IsSet() + + SetStatus() + + UnsetStatus() + + GetStatusMask() + + + + + + + + + IMeshData_ParametersList + + + + GetParameter() + + ParametersNb() + + Clear() + + + + + + + + + IMeshData_Curve + + + + InsertPoint() + + AddPoint() + + GetPoint() + + RemovePoint() + + + + + + + + + IMeshData_PCurve + + + + InsertPoint() + + AddPoint() + + GetPoint() + + RemovePoint() + + GetIndex() + + IsForward() + + IsInternal() + + GetOrientation() + + GetFace() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + has + edge[1] + curve[1] + + + + + has + edge[1] + pcurve[*] + + + + + references + pcurve[1] + face[1] + + + + has + face[1] + wire[1..*] + + + + has + wire[1] + edge[1..*] + + + + + has + model[1] + edge[*] + + + + + has + model[1] + face[*] + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_004.svg opencascade-7.5.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_004.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_004.svg 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/mesh/images/modeling_algos_mesh_004.svg 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,820 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +IMeshTools_MeshAlgoFactory + + + +GetAlgo(GeomAbs_SurfaceType : , +IMeshTools_Parameters : ) + + + + + + + + +BRepMesh_MeshAlgoFactory + + + + + + +Triangulation Algo + + + + + +IMeshTools_MeshAlgo + + + +Perform(IMeshData_Face : , +IMeshTools_Parameters : ) + + + + + + + + +BRepMesh_DelaunayBaseMeshAlgo + + + + + + +BRepMesh_DelaunayNodeInsertionMeshAlgo +<RangeSplitter> + + + + + + +BRepMesh_DelaunayDeflectionControlMeshAlgo +<RangeSplitter> + + + + + + +BRepMesh_SweepLineMeshAlgo + + + + + + +BRepMesh_SweepLineNodeInsertionMeshAlgo +<RangeSplitter> + + + + + + +RangeSplitter + + + + + +BRepMesh_DefaultRangeSplitter + + + + + + +BRepMesh_ConeRangeSplitter + + + + + + +BRepMesh_CylinderRangeSplitter + + + + + + +BRepMesh_SphereRangeSplitter + + + + + + +BRepMesh_UVParamRangeSplitter + + + + + + +BRepMesh_TorusRangeSplitter + + + + + + +BRepMesh_NURBSRangeSplitter + + + + + + +BRepMesh_BoundaryParamsRangeSplitter + + + + + + + + + + + +BRepMesh_BaseMeshAlgo + + + + + + +BRepMesh_DataStructureOfDelaun + + + + + + +BRepMesh_NodeInsertionMeshAlgo +<RangeSplitter, BaseClass> + + + + + + + + + + + +BRepMesh_FaceDiscret + + + + + +RangeSplitter->T, BaseClass->BRepMesh_SweepLineMeshAlgo + + + + +RangeSplitter->RangeSplitter + + + + + + + + + + + + + + + + + + + +RangeSplitter->RangeSplitter + + + + + + + + + +RangeSplitter->T, BaseClass->BRepMesh_DelaunayBaseMeshAlgo + + + + + + + + + + + + + + + + + + + + + + + + + + + +RangeSplitter->RangeSplitter + + + +<<use>> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +RangeSplitter->RangeSplitter + + + + +RangeSplitter->RangeSplitter + + + + +RangeSplitter->RangeSplitter + + + +<<use>> + + + +<<use>> + + + + + + + + + + + +<<use>> + + + + + + + + + +RangeSplitter->T, BaseClass->BRepMesh_DelaunayBaseMeshAlgo + + + + +RangeSplitter->T, BaseClass->BRepMesh_SweepLineMeshAlgo + + + + + + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/mesh/mesh.md opencascade-7.5.1+dfsg1/dox/user_guides/mesh/mesh.md --- opencascade-7.4.1+dfsg1/dox/user_guides/mesh/mesh.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/mesh/mesh.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,228 @@ +Mesh {#occt_user_guides__mesh} +========================= + +@tableofcontents + +@section occt_modalg_11_1 Mesh presentations + +In addition to support of exact geometrical representation of 3D objects Open CASCADE Technology provides functionality to work with tessellated representations of objects in form of meshes. + +Open CASCADE Technology mesh functionality provides: +- data structures to store surface mesh data associated to shapes, and some basic algorithms to handle these data +- data structures and algorithms to build surface triangular mesh from *BRep* objects (shapes). +- tools to extend 3D visualization capabilities of Open CASCADE Technology with displaying meshes along with associated pre- and post-processor data. + +Open CASCADE Technology includes two mesh converters: +- VRML converter translates Open CASCADE shapes to VRML 1.0 files (Virtual Reality Modeling Language). Open CASCADE shapes may be translated in two representations: shaded or wireframe. A shaded representation present shapes as sets of triangles computed by a mesh algorithm while a wireframe representation present shapes as sets of curves. +- STL converter translates Open CASCADE shapes to STL files. STL (STtereoLithography) format is widely used for rapid prototyping. + +Open CASCADE SAS also offers Advanced Mesh Products: +- Open CASCADE Mesh Framework (OMF) +- Express Mesh + +Besides, we can efficiently help you in the fields of surface and volume meshing algorithms, mesh optimization algorithms etc. If you require a qualified advice about meshing algorithms, do not hesitate to benefit from the expertise of our team in that domain. + +The projects dealing with numerical simulation can benefit from using SALOME - an Open Source Framework for CAE with CAD data interfaces, generic Pre- and Post- F.E. processors and API for integrating F.E. solvers. + +Learn more about SALOME platform on https://www.salome-platform.org + +@section occt_modalg_11_2 Meshing algorithm + +The algorithm of shape triangulation is provided by the functionality of *BRepMesh_IncrementalMesh* class, which adds a triangulation of the shape to its topological data structure. This triangulation is used to visualize the shape in shaded mode. + +~~~~~ +#include +#include +#include + +Standard_Boolean meshing_explicit_parameters() +{ + const Standard_Real aRadius = 10.0; + const Standard_Real aHeight = 25.0; + BRepPrimAPI_MakeCylinder aCylinder(aRadius, aHeight); + TopoDS_Shape aShape = aCylinder.Shape(); + + const Standard_Real aLinearDeflection = 0.01; + const Standard_Real anAngularDeflection = 0.5; + BRepMesh_IncrementalMesh aMesher (aShape, aLinearDeflection, Standard_False, anAngularDeflection, Standard_True); + const Standard_Integer aStatus = aMesher.GetStatusFlags(); + return !aStatus; +} + +Standard_Boolean meshing_imeshtools_parameters() +{ + const Standard_Real aRadius = 10.0; + const Standard_Real aHeight = 25.0; + BRepPrimAPI_MakeCylinder aCylinder(aRadius, aHeight); + TopoDS_Shape aShape = aCylinder.Shape(); + + IMeshTools_Parameters aMeshParams; + aMeshParams.Deflection = 0.01; + aMeshParams.Angle = 0.5; + aMeshParams.Relative = Standard_False; + aMeshParams.InParallel = Standard_True; + aMeshParams.MinSize = Precision::Confusion(); + aMeshParams.InternalVerticesMode = Standard_True; + aMeshParams.ControlSurfaceDeflection = Standard_True; + + BRepMesh_IncrementalMesh aMesher (aShape, aMeshParams); + const Standard_Integer aStatus = aMesher.GetStatusFlags(); + return !aStatus; +} +~~~~~ + +The default meshing algorithm *BRepMesh_IncrementalMesh* has two major options to define triangulation -- linear and angular deflections. + +At the first step all edges from a face are discretized according to the specified parameters. + +At the second step, the faces are tessellated. Linear deflection limits the distance between a curve and its tessellation, whereas angular deflection limits the angle between subsequent segments in a polyline. + +@figure{/user_guides/mesh/images/modeling_algos_image056.png,"Deflection parameters of BRepMesh_IncrementalMesh algorithm",420} + +There are additional options to control behavior of the meshing of face interior: *DeflectionInterior* and *AngleInterior*. *DeflectionInterior* limits the distance between triangles and the face interior. *AngleInterior* (used for tessellation of B-spline faces only) limits the angle between normals (N1, N2 and N3 in the picture) in the nodes of every link of the triangle. There is an exception for the links along the face boundary edges, "Angular Deflection" is used for them during edges discretization. + +@figure{/user_guides/mesh/images/modeling_algos_image057.png,"Linear and angular interior deflections",420} + +Note that if a given value of linear deflection is less than shape tolerance then the algorithm will skip this value and will take into account the shape tolerance. + +The application should provide deflection parameters to compute a satisfactory mesh. Angular deflection is relatively simple and allows using a default value (12-20 degrees). Linear deflection has an absolute meaning and the application should provide the correct value for its models. Giving small values may result in a too huge mesh (consuming a lot of memory, which results in a long computation time and slow rendering) while big values result in an ugly mesh. + +For an application working in dimensions known in advance it can be reasonable to use the absolute linear deflection for all models. This provides meshes according to metrics and precision used in the application (for example, it it is known that the model will be stored in meters, 0.004 m is enough for most tasks). + +However, an application that imports models created in other applications may not use the same deflection for all models. Note that actually this is an abnormal situation and this application is probably just a viewer for CAD models with dimensions varying by an order of magnitude. This problem can be solved by introducing the concept of a relative linear deflection with some LOD (level of detail). The level of detail is a scale factor for absolute deflection, which is applied to model dimensions. + +Meshing covers a shape with a triangular mesh. Other than hidden line removal, you can use meshing to transfer the shape to another tool: a manufacturing tool, a shading algorithm, a finite element algorithm, or a collision algorithm. + +You can obtain information on the shape by first exploring it. To access triangulation of a face in the shape later, use *BRepTool::Triangulation*. To access a polygon, which is the approximation of an edge of the face, use *BRepTool::PolygonOnTriangulation*. + +@section occt_modalg_11_3 BRepMesh Architecture +@subsection occt_modalg_11_3_1 Goals + +The main goals of the chosen architecture are: + * Remove tight connections between data structures, auxiliary tools and algorithms to create an extensible solution, easy for maintenance and improvements; + * Separate the code among several functional units responsible for specific operation for the sake of simplification of debugging and readability; + * Introduce new data structures enabling the possibility to manipulate a discrete model of a particular entity (edge, wire, face) in order to perform computations locally instead of processing the entire model; + * Implement a new triangulation algorithm replacing the existing functionality that contains overcomplicated solutions that need to be moved to the upper level. In addition, provide the possibility to change the algorithm depending on surface type (initially to speed up meshing of planes). + +@subsection occt_modalg_11_3_2 General workflow +@figure{/user_guides/mesh/images/modeling_algos_mesh_001.svg,"General workflow of BRepMesh component",500} + +Generally, the workflow of the component can be divided into six parts: + * **Creation of model data structure**: source *TopoDS_Shape* passed to algorithm is analyzed and exploded into faces and edges. The reflection corresponding to each topological entity is created in the data model. Note that underlying algorithms use the data model as input and access it via a common interface which allows creating a custom data model with necessary dependencies between particular entities (see the paragraph "Data model interface"); + * **Discretize edges 3D & 2D curves**: 3D curve as well as an associated set of 2D curves of each model edge is discretized in order to create a coherent skeleton used as a base in face meshing process. If an edge of the source shape already contains polygonal data which suits the specified parameters, it is extracted from the shape and stored in the model as is. Each edge is processed separately, the adjacency is not taken into account; + * **Heal discrete model**: the source *TopoDS_Shape* can contain problems, such as open wires or self-intersections, introduced during design, exchange or modification of model. In addition, some problems like self-intersections can be introduced by roughly discretized edges. This stage is responsible for analysis of a discrete model in order to detect and repair problems or to refuse further processing of a model part in case if a problem cannot be solved; + * **Preprocess discrete model**: defines actions specific to the implemented approach to be performed before meshing of faces. By default, this operation iterates over model faces, checks the consistency of existing triangulations and cleans topological faces and adjacent edges from polygonal data in case of inconsistency or marks a face of the discrete model as not required for the computation; + * **Discretize faces**: represents the core part performing mesh generation for a particular face based on 2D discrete data. This operation caches polygonal data associated with face edges in the data model for further processing and stores the generated mesh to *TopoDS_Face*; + * **Postprocess discrete model**: defines actions specific for the implemented approach to be performed after meshing of faces. By default, this operation stores polygonal data obtained at the previous stage to *TopoDS_Edge* objects of the source model. + +@subsection occt_modalg_11_3_3 Common interfaces +The component structure contains two units: IMeshData (see Data model interface) and IMeshTools, defining common interfaces for the data model and algorithmic tools correspondingly. Class *IMeshTools_Context* represents a connector between these units. The context class caches the data model as well as the tools corresponding to each of six stages of the workflow mentioned above and provides methods to call the corresponding tool safely (designed similarly to *IntTools_Context* in order to keep consistency with OCCT core tools). All stages, except for the first one, use the data model as input and perform a specific action on the entire structure. Thus, API class *IMeshTools_ModelAlgo* is defined in order to unify the interface of tools manipulating the data model. Each tool supposed to process the data model should inherit this interface enabling the possibility to cache it in context. In contrast to others, the model builder interface is defined by another class *IMeshTools_ModelBuilder* due to a different meaning of the stage. The entry point starting the entire workflow is represented by *IMeshTools_MeshBuilder*. + +The default implementation of *IMeshTools_Context* is given in *BRepMesh_Context* class initializing the context by instances of default algorithmic tools. + +The factory interface *IMeshTools_MeshAlgoFactory* gives the possibility to change the triangulation algorithm for a specific surface. The factory returns an instance of the triangulation algorithm via *IMeshTools_MeshAlgo* interface depending on the type of surface passed as parameter. It is supposed to be used at the face discretization stage. + +The default implementation of AlgoFactory is given in *BRepMesh_MeshAlgoFactory* returning algorithms of different complexity chosen according to the passed surface type. In its turn, it is used as the initializer of *BRepMesh_FaceDiscret* algorithm representing the starter of face discretization stage. + +@figure{/user_guides/mesh/images/modeling_algos_mesh_002.svg,"Interface describing entry point to meshing workflow",500} + +Remaining interfaces describe auxiliary tools: + * *IMeshTools_CurveTessellator*: provides a common interface to the algorithms responsible for creation of discrete polygons on 3D and 2D curves as well as tools for extraction of existing polygons from *TopoDS_Edge* allowing to obtain discrete points and the corresponding parameters on curve regardless of the implementation details (see examples of usage of derived classes *BRepMesh_CurveTessellator*, *BRepMesh_EdgeTessellationExtractor* in *BRepMesh_EdgeDiscret*); + * *IMeshTools_ShapeExplorer*: the last two interfaces represent visitor design pattern and are intended to separate iteration over elements of topological shape (edges and faces) from the operations performed on a particular element; + * *IMeshTools_ShapeVisitor*: provides a common interface for operations on edges and faces of the target topological shape. It can be used in couple with *IMeshTools_ShapeExplorer*. The default implementation available in *BRepMesh_ShapeVisitor* performs initialization of the data model. The advantage of such approach is that the implementation of *IMeshTools_ShapeVisitor* can be changed according to the specific data model whereas the shape explorer implementation remains the same. + +@subsection occt_modalg_11_3_4 Create model data structure +The data structures intended to keep discrete and temporary data required by underlying algorithms are created at the first stage of the meshing procedure. Generally, the model represents dependencies between entities of the source topological shape suitable for the target task. + +#### Data model interface +Unit IMeshData provides common interfaces specifying the data model API used on different stages of the entire workflow. Dependencies and references of the designed interfaces are given in the figure below. A specific interface implementation depends on the target application which allows the developer to implement different models and use custom low-level data structures, e.g. different collections, either NCollection or STL. *IMeshData_Shape* is used as the base class for all data structures and tools keeping the topological shape in order to avoid possible copy-paste. + +The default implementation of interfaces is given in BRepMeshData unit. The main aim of the default data model is to provide features performing discretization of edges in a parallel mode. Thus, curve, pcurve and other classes are based on STL containers and smart-pointers as far as NCollection does not provide thread-safety for some cases (e.g. *NCollection_Sequence*). In addition, it closely reflects topology of the source shape, i.e. the number of edges in the data model is equal to the number of edges in the source model; each edge contains a set of pcurves associated with its adjacent faces which allows creation of discrete polygons for all pcurves or the 3D curve of a particular edge in a separate thread. + +**Advantages**: +In case of necessity, the data model (probably with algorithms for its processing) can be easily substituted by another implementation supporting another kind of dependencies between elements. + +An additional example of a different data model is the case when it is not required to create a mesh with discrete polygons synchronized between adjacent faces, i.e. in case of necessity to speed up creation of a rough per-face tessellation used for visualization or quick computation only (the approach used in *XDEDRAW_Props*). + +@figure{/user_guides/mesh/images/modeling_algos_mesh_003.svg,"Common API of data model",500} + +#### Collecting data model +At this stage the data model is filled by entities according to the topological structure of the source shape. A default implementation of the data model is given in BRepMeshData unit and represents the model as two sets: a set of edges and a set of faces. Each face consists of one or several wires, the first of which always represents the outer wire, while others are internal. In its turn, each wire depicts the ordered sequence of oriented edges. Each edge is characterized by a single 3D curve and zero (in case of free edge) or more 2D curves associated with faces adjacent to this edge. Both 3D and 2D curves represent a set of pairs point-parameter defined in 3D and 2D space of the reference face correspondingly. An additional difference between a curve and a pcurve is that the latter has a reference to the face it is defined for. + +Model filler algorithm is represented by *BRepMesh_ShapeVisitor* class creating the model as a reflection to topological shape with help of *BRepMesh_ShapeExplorer* performing iteration over edges and faces of the target shape. Note that the algorithm operates on a common interface of the data model and creates a structure without any knowledge about the implementation details and underlying data structures. The entry point to collecting functionality is *BRepMesh_ModelBuilder* class. + +@subsection occt_modalg_11_3_5 Discretize edges 3D & 2D curves +At this stage only the edges of the data model are considered. Each edge is processed separately (with the possibility to run processing in multiple threads). The edge is checked for existing polygonal data. In case if at least one representation exists and suits the meshing parameters, it is recuperated and used as reference data for tessellation of the whole set of pcurves as well as 3D curve assigned to the edge (see *BRepMesh_EdgeTessellationExtractor*). Otherwise, a new tessellation algorithm is created and used to generate the initial polygon (see *BRepMesh_CurveTessellator*) and the edge is marked as outdated. In addition, the model edge is updated by deflection as well as recomputed same range, same parameter and degeneracy parameters. See *BRepMesh_EdgeDiscret* for implementation details. + +IMeshData unit defines interface *IMeshData_ParametersListArrayAdaptor*, which is intended to adapt arbitrary data structures to the *NCollection_Array1* container API. This solution is made to use both *NCollection_Array1* and *IMeshData_Curve* as the source for *BRepMesh_EdgeParameterProvider* tool intended to generate a consistent parametrization taking into account the same parameter property. + +@subsection occt_modalg_11_3_6 Heal discrete model +In general, this stage represents a set of operations performed on the entire discrete model in order to resolve inconsistencies due to the problems caused by design, translation or rough discretization. A different sequence of operations can be performed depending on the target triangulation algorithm, e.g. there are different approaches to process self-intersections – either to amplify edges discretization by decreasing the target precision or to split links at the intersection points. At this stage the whole set of edges is considered in aggregate and their adjacency is taken into account. A default implementation of the model healer is given in *BRepMesh_ModelHealer* which performs the following actions: + * Iterates over model faces and checks their wires for consistency, i.e. whether the wires are closed and do not contain self-intersections. The data structures are designed free of collisions, thus it is possible to run processing in a parallel mode; + * Forcibly connects the ends of adjacent edges in the parametric space, closing gaps between possible disconnected parts. The aim of this operation is to create a correct discrete model defined relatively to the parametric space of the target face taking into account connectivity and tolerances of 3D space only. This means that no specific computations are made to determine U and V tolerance; + * Registers intersections on edges forming the face shape. Two solutions are possible in order to resolve self-intersection: + * Decrease deflection of a particular edge and update its discrete model. After that the workflow "intersection check – amplification" is repeated up to 5 times. As the result, target edges contain a finer tessellation and meshing continues or the face is marked by *IMeshData_SelfIntersectingWire* status and refused from further processing; + * Split target edges by intersection point and synchronize the updated polygon with curve and remaining pcurves associated to each edge. This operation presents a more robust solution comparing to the amplification procedure with a guaranteed result, but it is more difficult for implementation from the point of view of synchronization functionality. + +@subsection occt_modalg_11_3_7 Preprocess discrete model +This stage implements actions to be performed before meshing of faces. Depending on target goals it can be changed or omitted. By default, *BRepMesh_ModelPreProcessor* implements the functionality checking topological faces for consistency of existing triangulation, i.e.: consistency with the target deflection parameter; indices of nodes referenced by triangles do not exceed the number of nodes stored in a triangulation. If the face fails some checks, it is cleaned from triangulation and its adjacent edges are cleaned from existing polygons. This does not affect a discrete model and does not require any recomputation as the model keeps tessellations for the whole set of edges despite consistency of their polygons. + +@subsection occt_modalg_11_3_8 Discretize faces +Discretization of faces is the general part of meshing algorithm. At this stage edges tessellation data obtained and processed on previous steps is used to form contours of target faces and passed as input to the triangulation algorithm. Default implementation is provided by *BRepMesh_FaceDiscret* class which represents a starter for triangulation algorithm. It iterates over faces available in the data model, creates an instance of the triangulation algorithm according to the type of surface associated with each face via *IMeshTools_MeshAlgoFactory* and executes it. Each face is processed separately, thus it is possible to process faces in a parallel mode. The class diagram of face discretization is given in the figure below. + +@figure{/user_guides/mesh/images/modeling_algos_mesh_004.svg,"Class diagram of face discrete stage",300} + +In general, face meshing algorithms have the following structure: + * *BRepMesh_BaseMeshAlgo* implements *IMeshTools_MeshAlgo* interface and the base functionality for inherited algorithms. The main goal of this class is to initialize an instance of *BRepMesh_DataStructureOfDelaun* as well as auxiliary data structures suitable for nested algorithms using face model data passed as input parameter. Despite implementation of triangulation algorithm this structure is currently supposed as common for OCCT. However, the user is free to implement a custom algorithm and supporting data structure accessible via *IMeshTools_MeshAlgo* interface, e.g. to connect a 3-rd party meshing tool that does not support *TopoDS_Shape* out of box. For this, such structure provides the possibility to distribute connectors to various algorithms in the form of plugins; + * *BRepMesh_DelaunayBaseMeshAlgo* and *BRepMesh_SweepLineMeshAlgo* classes implement core meshing functionality operating directly on an instance of *BRepMesh_DataStructureOfDelaun*. The algorithms represent mesh generation tools adding new points from the data structure to the final mesh; + * *BRepMesh_NodeInsertionMeshAlgo* class represents a wrapper intended to extend the algorithm inherited from *BRepMesh_BaseMeshAlgo* to enable the functionality generating surface nodes and inserting them into the structure. On this level, an instance of the classification tool is created and can be used to accept-reject internal nodes. In addition, computations necessary for scaling UV coordinates of points relatively to the range specified for the corresponding direction are performed. As far as both triangulation algorithms work on static data provided by the structure, new nodes are added at the initialization stage. Surface nodes are generated by an auxiliary tool called range splitter and passed as template parameter (see Range splitter); + * Classes *BRepMesh_DelaunayNodeInsertionMeshAlgo* and *BRepMesh_SweepLineNodeInsertionMeshAlgo* implement algorithm-specific functionality related to addition of internal nodes supplementing functionality provided by *BRepMesh_NodeInsertionMeshAlgo*; + * *BRepMesh_DelaunayDeflectionControlMeshAlgo* extends functionality of *BRepMesh_DelaunayNodeInsertionMeshAlgo* by additional procedure controlling deflection of generated triangles. + + + + + +BRepMesh provides user a way to switch default triangulation algorithm to a custom one, either implemented by user or available worldwide. There are three base classes that can be currently used to integrate 3rd-party algorithms: + +* *BRepMesh_ConstrainedBaseMeshAlgo* base class for tools providing generation of triangulations with constraints requiring no common processing by BRepMesh; +* *BRepMesh_CustomBaseMeshAlgo* provides the entry point for generic algorithms without support of constraints and supposed for generation of base mesh only. Constraint edges are processed using standard functionality provided by the component itself upon background mesh produced by 3rd-party solver; +* *BRepMesh_CustomDelaunayBaseMeshAlgo* contains initialization part for tools used by BRepMesh for checks or optimizations using results of 3rd-party algorithm. + +Meshing algorithms could be provided by implemeting *IMeshTools_MeshAlgoFactory* with related interfaces and passing it to *BRepMesh_Context::SetFaceDiscret()*. OCCT comes with two base 2D meshing algorithms: *BRepMesh_MeshAlgoFactory* (used by default) and *BRepMesh_DelabellaMeshAlgoFactory*. + +The following example demonstrates how it could be done from *Draw* environment: + +~~~~~ +psphere s 10 + +### Default Algo ### +incmesh s 0.0001 -algo default + +### Delabella Algo ### +incmesh s 0.0001 -algo delabella +~~~~~ + +The code snippet below shows passing a custom mesh factory to BRepMesh_IncrementalMesh: + +~~~~~ +IMeshTools_Parameters aMeshParams; +Handle(IMeshTools_Context) aContext = new BRepMesh_Context(); +aContext->SetFaceDiscret (new BRepMesh_FaceDiscret (new BRepMesh_DelabellaMeshAlgoFactory())); + +BRepMesh_IncrementalMesh aMesher; +aMesher.SetShape (aShape); +aMesher.ChangeParameters() = aMeshParams; + +aMesher.Perform (aContext); +~~~~~ + +#### Range splitter +Range splitter tools provide functionality to generate internal surface nodes defined within the range computed using discrete model data. The base functionality is provided by *BRepMesh_DefaultRangeSplitter* which can be used without modifications in case of planar surface. The default splitter does not generate any internal node. + +*BRepMesh_ConeRangeSplitter*, *BRepMesh_CylinderRangeSplitter* and *BRepMesh_SphereRangeSplitter* are specializations of the default splitter intended for quick generation of internal nodes for the corresponding type of analytical surface. + +*BRepMesh_UVParamRangeSplitter* implements base functionality taking discretization points of face border into account for node generation. Its successors BRepMesh_TorusRangeSplitter and *BRepMesh_NURBSRangeSplitter* extend the base functionality for toroidal and NURBS surfaces correspondingly. + +@subsection occt_modalg_11_3_9 Postprocess discrete model +This stage implements actions to be performed after meshing of faces. Depending on target goals it can be changed or omitted. By default, *BRepMesh_ModelPostProcessor* commits polygonal data stored in the data model to *TopoDS_Edge*. \ No newline at end of file Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image014.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image014.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image015.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image015.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image016.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image016.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image017.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image017.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image021.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image021.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image023.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image023.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image028.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image028.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image030.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image030.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image035.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image035.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image037.gif and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image037.gif differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image040.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image040.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image041.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image041.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image043.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image043.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image045.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image045.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image047.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image047.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image048.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image048.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image049.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image049.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image051.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image051.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image056.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image056.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image057.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image057.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image058.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_image058.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_001.svg opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_001.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_001.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_001.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,263 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -BRepMesh Workflow - - - - - - -Create Model Data Structure - - - - - - - -IMeshData_Model : [1] - - - - - - -Discretize Edges 3D & 2D Curves - - - - - - - -IMeshData_Model : [1] - - - - - - -Heal Discrete Model - - - - -Preprocess Discrete Model - - - - -Discretize Faces - - - - -Postprocess Discrete Model - - - -TopoDS_Shape - -Mesh - - - -Meshing Parameters : IMeshTools_Parameters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_002.svg opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_002.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_002.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_002.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,715 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -IMeshTools_Parameters - - - -Deflection : Real [1] - -Angle : Real [1] - -MinSize : Real [1] - -Relative : Boolean [1] - -InParallel : Boolean [1] - -InternalVerticesMode : -Boolean [1] - -ControlSurfaceDeflection : -Boolean [1] - -CleanModel : Boolean [1] - - - - - - - - -IMeshTools_Context - - - -myParameters : IMeshTools_Parameters [1] - -myModel : [1] - -myModelBuilder : IMeshTools_ModelBuilder [1] - -myEdgeDiscret : IMeshTools_ModelAlgo [1] - -myModelHealer : IMeshTools_ModelAlgo [1] - -myPreProcessor : IMeshTools_ModelAlgo [1] - -myFaceDiscret : IMeshTools_ModelAlgo [1] - -myPostProcessor : IMeshTools_ModelAlgo [1] - -GetParameters() - -ChangeParameters() - -BuildModel() - -GetModel() - -DiscretizeEdges() - -HealModel() - -PreProcessModel() - -DiscretizeFaces() - -PostProcessModel() - -SetModelBuilder() - -GetModelBuilder() - -SetEdgeDiscret() - -GetEdgeDiscret() - -SetModelHealer() - -GetModelHealer() - -SetPreProcessor() - -GetPreProcessor() - -SetFaceDiscret() - -GetFaceDiscret() - -SetPostProcessor() - -GetPostProcessor() - -Clean() - - - - - - - - -IMeshTools_ModelBuilder - - - -Perform(TopoDS_Shape : , -IMeshTools_Parameter : ) - - - - - - - - -IMeshTools_ModelAlgo - - - -Perform(IMeshData_Model : , -IMeshTools_Parameters : ) - - - - - - - - -IMeshData_Model - - - -GetMaxSize() - -FacesNb() - -AddFace() - -GetFace() - -EdgesNb() - -AddEdge() - -GetEdge() - - - - - - - - -IMeshTools_MeshBuilder - - - -SetContext() - -GetContext() - -Perform() - - - - - - - - -<<use>> - - - - - -<<use>> - - - - - -<<use>> - - - -caches -context[1] -parameters[1] - - - - - -caches -context[1] -builder[1] - - - - - -caches -context[1] -model[1] - - - - - -caches -context[1] -algo[5] - - - - - -<<use>> - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_003.svg opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_003.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_003.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_003.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5085 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMeshData_Shape - - - - myShape : - TopoDS_Shape [1] - - SetShape() - - GetShape() - - - - - - - - - IMeshData_Model - - - - GetMaxSize() - - FacesNb() - - AddFace() - - GetFace() - - EdgesNb() - - AddEdge() - - GetEdge() - - - - - - - - - IMeshData_TessellatedShape - - - - SetDeflection() - - GetDeflection() - - - - - - - - - IMeshData_Edge - - - - GetEdge() - - SetCurve() - - GetCurve() - - PCurvesNb() - - AddPCurve() - - GetPCurve() - - Clear() - - IsFree() - - GetAngularDeflection() - - SetAngularDeflection() - - SetSameParam() - - GetSameParam() - - SetSameRange() - - GetSameRange() - - SetDegenerated() - - GetDegenerated() - - - - - - - - - IMeshData_Wire - - - - GetWire() - - EdgesNb() - - AddEdge() - - GetEdge() - - GetEdgeOrientation() - - - - - - - - - IMeshData_Face - - - - GetFace() - - WiresNb() - - AddWire() - - GetWire() - - GetSurface() - - IsValid() - - - - - - - - - IMeshData_StatusOwner - - - - IsEqual() - - IsSet() - - SetStatus() - - UnsetStatus() - - GetStatusMask() - - - - - - - - - IMeshData_ParametersList - - - - GetParameter() - - ParametersNb() - - Clear() - - - - - - - - - IMeshData_Curve - - - - InsertPoint() - - AddPoint() - - GetPoint() - - RemovePoint() - - - - - - - - - IMeshData_PCurve - - - - InsertPoint() - - AddPoint() - - GetPoint() - - RemovePoint() - - GetIndex() - - IsForward() - - IsInternal() - - GetOrientation() - - GetFace() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - has - edge[1] - curve[1] - - - - - has - edge[1] - pcurve[*] - - - - - references - pcurve[1] - face[1] - - - - has - face[1] - wire[1..*] - - - - has - wire[1] - edge[1..*] - - - - - has - model[1] - edge[*] - - - - - has - model[1] - face[*] - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_004.svg opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_004.svg --- opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_004.svg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_algos_mesh_004.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,820 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -IMeshTools_MeshAlgoFactory - - - -GetAlgo(GeomAbs_SurfaceType : , -IMeshTools_Parameters : ) - - - - - - - - -BRepMesh_MeshAlgoFactory - - - - - - -Triangulation Algo - - - - - -IMeshTools_MeshAlgo - - - -Perform(IMeshData_Face : , -IMeshTools_Parameters : ) - - - - - - - - -BRepMesh_DelaunayBaseMeshAlgo - - - - - - -BRepMesh_DelaunayNodeInsertionMeshAlgo -<RangeSplitter> - - - - - - -BRepMesh_DelaunayDeflectionControlMeshAlgo -<RangeSplitter> - - - - - - -BRepMesh_SweepLineMeshAlgo - - - - - - -BRepMesh_SweepLineNodeInsertionMeshAlgo -<RangeSplitter> - - - - - - -RangeSplitter - - - - - -BRepMesh_DefaultRangeSplitter - - - - - - -BRepMesh_ConeRangeSplitter - - - - - - -BRepMesh_CylinderRangeSplitter - - - - - - -BRepMesh_SphereRangeSplitter - - - - - - -BRepMesh_UVParamRangeSplitter - - - - - - -BRepMesh_TorusRangeSplitter - - - - - - -BRepMesh_NURBSRangeSplitter - - - - - - -BRepMesh_BoundaryParamsRangeSplitter - - - - - - - - - - - -BRepMesh_BaseMeshAlgo - - - - - - -BRepMesh_DataStructureOfDelaun - - - - - - -BRepMesh_NodeInsertionMeshAlgo -<RangeSplitter, BaseClass> - - - - - - - - - - - -BRepMesh_FaceDiscret - - - - - -RangeSplitter->T, BaseClass->BRepMesh_SweepLineMeshAlgo - - - - -RangeSplitter->RangeSplitter - - - - - - - - - - - - - - - - - - - -RangeSplitter->RangeSplitter - - - - - - - - - -RangeSplitter->T, BaseClass->BRepMesh_DelaunayBaseMeshAlgo - - - - - - - - - - - - - - - - - - - - - - - - - - - -RangeSplitter->RangeSplitter - - - -<<use>> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -RangeSplitter->RangeSplitter - - - - -RangeSplitter->RangeSplitter - - - - -RangeSplitter->RangeSplitter - - - -<<use>> - - - -<<use>> - - - - - - - - - - - -<<use>> - - - - - - - - - -RangeSplitter->T, BaseClass->BRepMesh_DelaunayBaseMeshAlgo - - - - -RangeSplitter->T, BaseClass->BRepMesh_SweepLineMeshAlgo - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_data_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_data_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_data_image014.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_data_image014.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_data_image015.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/images/modeling_data_image015.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/modeling_algos.md opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/modeling_algos.md --- opencascade-7.4.1+dfsg1/dox/user_guides/modeling_algos/modeling_algos.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/modeling_algos/modeling_algos.md 2021-02-02 08:51:56.000000000 +0000 @@ -5,7 +5,7 @@ @section occt_modalg_1 Introduction -This manual explains how to use the Modeling Algorithms. It provides basic documentation on modeling algorithms. For advanced information on Modeling Algorithms, see our E-learning & Training offerings. +This manual explains how to use the Modeling Algorithms. It provides basic documentation on modeling algorithms. The Modeling Algorithms module brings together a wide range of topological algorithms used in modeling. Along with these tools, you will find the geometric algorithms, which they call. @@ -28,7 +28,7 @@ The *Geom2dAPI_InterCurveCurve* class allows the evaluation of the intersection points (*gp_Pnt2d*) between two geometric curves (*Geom2d_Curve*) and the evaluation of the points of self-intersection of a curve. -@figure{/user_guides/modeling_algos/images/modeling_algos_image003.png,"Intersection and self-intersection of curves",420} +@figure{/user_guides/modeling_algos/images/modeling_algos_image003.png,"Intersection and self-intersection of curves",300} In both cases, the algorithm requires a value for the tolerance (Standard_Real) for the confusion between two points. The default tolerance value used in all constructors is *1.0e-6.* @@ -1050,342 +1050,6 @@ ~~~~~ -@section occt_modalg_2_topo_tools Topological Tools - -Open CASCADE Technology topological tools provide algorithms to - * Create wires from edges; - * Create faces from wires; - * Compute state of the shape relatively other shape; - * Orient shapes in container; - * Create new shapes from the existing ones; - * Build PCurves of edges on the faces; - * Check the validity of the shapes; - * Take the point in the face; - * Get the normal direction for the face. - - -@subsection occt_modalg_2_topo_tools_1 Creation of the faces from wireframe model - -It is possible to create the planar faces from the arbitrary set of planar edges randomly located in 3D space. -This feature might be useful if you need for instance to restore the shape from the wireframe model: - - - - - -
@figure{/user_guides/modeling_algos/images/modeling_algos_image062.png,"Wireframe model",160}@figure{/user_guides/modeling_algos/images/modeling_algos_image063.png,"Faces of the model",160}
- -To make the faces from edges it is, firstly, necessary to create planar wires from the given edges and than create planar faces from each wire. -The static methods *BOPAlgo_Tools::EdgesToWires* and *BOPAlgo_Tools::WiresToFaces* can be used for that: -~~~~~ -TopoDS_Shape anEdges = ...; /* The input edges */ -Standard_Real anAngTol = 1.e-8; /* The angular tolerance for distinguishing the planes in which the wires are located */ -Standard_Boolean bShared = Standard_False; /* Defines whether the edges are shared or not */ -// -TopoDS_Shape aWires; /* resulting wires */ -Standard_Integer iErr = BOPAlgo_Tools::EdgesToWires(anEdges, aWires, bShared, anAngTol); -if (iErr) { - cout << "Error: Unable to build wires from given edges\n"; - return; -} -// -TopoDS_Shape aFaces; /* resulting faces */ -Standard_Boolean bDone = BOPAlgo_Tools::WiresToFaces(aWires, aFaces, anAngTol); -if (!bDone) { - cout << "Error: Unable to build faces from wires\n"; - return; -} -~~~~~ - -These methods can also be used separately: - * *BOPAlgo_Tools::EdgesToWires* allows creating planar wires from edges. -The input edges may be not shared, but the output wires will be sharing the coinciding vertices and edges. For this the intersection of the edges is performed. -Although, it is possible to skip the intersection stage (if the input edges are already shared) by passing the corresponding flag into the method. -The input edges are expected to be planar, but the method does not check it. Thus, if the input edges are not planar, the output wires will also be not planar. -In general, the output wires are non-manifold and may contain free vertices, as well as multi-connected vertices. - * *BOPAlgo_Tools::WiresToFaces* allows creating planar faces from the planar wires. -In general, the input wires are non-manifold and may be not closed, but should share the coinciding parts. -The wires located in the same plane and completely included into other wires will create holes in the faces built from outer wires: - - - - - - -
@figure{/user_guides/modeling_algos/images/modeling_algos_image064.png,"Wireframe model",160}@figure{/user_guides/modeling_algos/images/modeling_algos_image065.png,"Two faces (red face has a hole)",160}
- - -@subsection occt_modalg_2_topo_tools_2 Classification of the shapes - -The following methods allow classifying the different shapes relatively other shapes: - * The variety of the *BOPTools_AlgoTools::ComputState* methods classify the vertex/edge/face relatively solid; - * *BOPTools_AlgoTools::IsHole* classifies wire relatively face; - * *IntTools_Tools::ClassifyPointByFace* classifies point relatively face. - -@subsection occt_modalg_2_topo_tools_3 Orientation of the shapes in the container - -The following methods allow reorienting shapes in the containers: - * *BOPTools_AlgoTools::OrientEdgesOnWire* correctly orients edges on the wire; - * *BOPTools_AlgoTools::OrientFacesOnShell* correctly orients faces on the shell. - -@subsection occt_modalg_2_topo_tools_4 Making new shapes - -The following methods allow creating new shapes from the existing ones: - * The variety of the *BOPTools_AlgoTools::MakeNewVertex* creates the new vertices from other vertices and edges; - * *BOPTools_AlgoTools::MakeSplitEdge* splits the edge by the given parameters. - -@subsection occt_modalg_2_topo_tools_5 Building PCurves - -The following methods allow building PCurves of edges on faces: - * *BOPTools_AlgoTools::BuildPCurveForEdgeOnFace* computes PCurve for the edge on the face; - * *BOPTools_AlgoTools::BuildPCurveForEdgeOnPlane* and *BOPTools_AlgoTools::BuildPCurveForEdgesOnPlane* allow building PCurves for edges on the planar face; - * *BOPTools_AlgoTools::AttachExistingPCurve* takes PCurve on the face from one edge and attach this PCurve to other edge coinciding with the first one. - -@subsection occt_modalg_2_topo_tools_6 Checking the validity of the shapes - -The following methods allow checking the validity of the shapes: - * *BOPTools_AlgoTools::IsMicroEdge* detects the small edges; - * *BOPTools_AlgoTools::ComputeTolerance* computes the correct tolerance of the edge on the face; - * *BOPTools_AlgoTools::CorrectShapeTolerances* and *BOPTools_AlgoTools::CorrectTolerances* allow correcting the tolerances of the sub-shapes. - * *BRepLib::FindValidRange* finds a range of 3d curve of the edge not covered by tolerance spheres of vertices. - -@subsection occt_modalg_2_topo_tools_7 Taking a point inside the face - -The following methods allow taking a point located inside the face: - * The variety of the *BOPTools_AlgoTools3D::PointNearEdge* allows getting a point inside the face located near the edge; - * *BOPTools_AlgoTools3D::PointInFace* allows getting a point inside the face. - -@subsection occt_modalg_2_topo_tools_8 Getting normal for the face - -The following methods allow getting the normal direction for the face/surface: - * *BOPTools_AlgoTools3D::GetNormalToSurface* computes the normal direction for the surface in the given point defined by UV parameters; - * *BOPTools_AlgoTools3D::GetNormalToFaceOnEdge* computes the normal direction for the face in the point located on the edge of the face; - * *BOPTools_AlgoTools3D::GetApproxNormalToFaceOnEdge* computes the normal direction for the face in the point located near the edge of the face. - - - -@section occt_modalg_3a The Topology API - -The Topology API of Open CASCADE Technology (**OCCT**) includes the following six packages: - * *BRepAlgoAPI* - * *BRepBuilderAPI* - * *BRepFilletAPI* - * *BRepFeat* - * *BRepOffsetAPI* - * *BRepPrimAPI* - -The classes provided by the API have the following features: - * The constructors of classes provide different construction methods; - * The class retains different tools used to build objects as fields; - * The class provides a casting method to obtain the result automatically with a function-like call. - -Let us use the class *BRepBuilderAPI_MakeEdge* to create a linear edge from two points. - -~~~~~ -gp_Pnt P1(10,0,0), P2(20,0,0); -TopoDS_Edge E = BRepBuilderAPI_MakeEdge(P1,P2); -~~~~~ - -This is the simplest way to create edge E from two points P1, P2, but the developer can test for errors when he is not as confident of the data as in the previous example. - -~~~~~ -#include -#include -#include -void EdgeTest() -{ -gp_Pnt P1; -gp_Pnt P2; -BRepBuilderAPI_MakeEdge ME(P1,P2); -if (!ME.IsDone()) -{ -// doing ME.Edge() or E = ME here -// would raise StdFail_NotDone -Standard_DomainError::Raise -(“ProcessPoints::Failed to createan edgeâ€); -} -TopoDS_Edge E = ME; -} -~~~~~ - -In this example an intermediary object ME has been introduced. This can be tested for the completion of the function before accessing the result. More information on **error handling** in the topology programming interface can be found in the next section. - -*BRepBuilderAPI_MakeEdge* provides valuable information. For example, when creating an edge from two points, two vertices have to be created from the points. Sometimes you may be interested in getting these vertices quickly without exploring the new edge. Such information can be provided when using a class. The following example shows a function creating an edge and two vertices from two points. - -~~~~~ -void MakeEdgeAndVertices(const gp_Pnt& P1, -const gp_Pnt& P2, -TopoDS_Edge& E, -TopoDS_Vertex& V1, -TopoDS_Vertex& V2) -{ -BRepBuilderAPI_MakeEdge ME(P1,P2); -if (!ME.IsDone()) { -Standard_DomainError::Raise -(“MakeEdgeAndVerices::Failed to create an edgeâ€); -} -E = ME; -V1 = ME.Vextex1(); -V2 = ME.Vertex2(); -~~~~~ - -The class *BRepBuilderAPI_MakeEdge* provides two methods *Vertex1* and *Vertex2*, which return two vertices used to create the edge. - -How can *BRepBuilderAPI_MakeEdge* be both a function and a class? It can do this because it uses the casting capabilities of C++. The *BRepBuilderAPI_MakeEdge* class has a method called Edge; in the previous example the line E = ME could have been written. - -~~~~~ -E = ME.Edge(); -~~~~~ - -This instruction tells the C++ compiler that there is an **implicit casting** of a *BRepBuilderAPI_MakeEdge* into a *TopoDS_Edge* using the *Edge* method. It means this method is automatically called when a *BRepBuilderAPI_MakeEdge* is found where a *TopoDS_Edge* is required. - -This feature allows you to provide classes, which have the simplicity of function calls when required and the power of classes when advanced processing is necessary. All the benefits of this approach are explained when describing the topology programming interface classes. - - -@subsection occt_modalg_3a_1 Error Handling in the Topology API - -A method can report an error in the two following situations: - * The data or arguments of the method are incorrect, i.e. they do not respect the restrictions specified by the methods in its specifications. Typical example: creating a linear edge from two identical points is likely to lead to a zero divide when computing the direction of the line. - * Something unexpected happened. This situation covers every error not included in the first category. Including: interruption, programming errors in the method or in another method called by the first method, bad specifications of the arguments (i.e. a set of arguments that was not expected to fail). - -The second situation is supposed to become increasingly exceptional as a system is debugged and it is handled by the **exception mechanism**. Using exceptions avoids handling error statuses in the call to a method: a very cumbersome style of programming. - -In the first situation, an exception is also supposed to be raised because the calling method should have verified the arguments and if it did not do so, there is a bug. For example, if before calling *MakeEdge* you are not sure that the two points are non-identical, this situation must be tested. - -Making those validity checks on the arguments can be tedious to program and frustrating as you have probably correctly surmised that the method will perform the test twice. It does not trust you. -As the test involves a great deal of computation, performing it twice is also time-consuming. - -Consequently, you might be tempted to adopt the highly inadvisable style of programming illustrated in the following example: - -~~~~~ -#include -try { -TopoDS_Edge E = BRepBuilderAPI_MakeEdge(P1,P2); -// go on with the edge -} -catch { -// process the error. -} -~~~~~ - -To help the user, the Topology API classes only raise the exception *StdFail_NotDone*. Any other exception means that something happened which was unforeseen in the design of this API. - -The *NotDone* exception is only raised when the user tries to access the result of the computation and the original data is corrupted. At the construction of the class instance, if the algorithm cannot be completed, the internal flag *NotDone* is set. This flag can be tested and in some situations a more complete description of the error can be queried. If the user ignores the *NotDone* status and tries to access the result, an exception is raised. - -~~~~~ -BRepBuilderAPI_MakeEdge ME(P1,P2); -if (!ME.IsDone()) { -// doing ME.Edge() or E = ME here -// would raise StdFail_NotDone -Standard_DomainError::Raise -(“ProcessPoints::Failed to create an edgeâ€); -} -TopoDS_Edge E = ME; -~~~~~ - - -@subsection occt_modalg_hist History support - -All topological API algorithms support the history of shape modifications (or just History) for their arguments. -Generally, the history is available for the following types of sub-shapes of input shapes: -* Vertex; -* Edge; -* Face. - -Some algorithms also support the history for Solids. - -The history information consists of the following information: -* Information about Deleted shapes; -* Information about Modified shapes; -* Information about Generated shapes. - -The History is filled basing on the result of the operation. History cannot return any shapes not contained in the result. -If the result of the operation is an empty shape, all input shapes will be considered as Deleted and none will have Modified and Generated shapes. - -The history information can be accessed by the API methods: -* *Standard_Boolean IsDeleted(const TopoDS_Shape& theS)* - to check if the shape has been Deleted during the operation; -* *const TopTools_ListOfShape& Modified(const TopoDS_Shape& theS)* - to get the shapes Modified from the given shape; -* *const TopTools_ListOfShape& Generated(const TopoDS_Shape& theS)* - to get the shapes Generated from the given shape. - -@subsubsection occt_modalg_hist_del Deleted shapes - -The shape is considered as Deleted during the operation if all of the following conditions are met: -* The shape is a part of the argument shapes of the operation; -* The result shape does not contain the shape itself; -* The result shape does not contain any of the splits of the shape. - -For example, in the CUT operation between two intersecting solids all vertices/edges/faces located completely inside the Tool solid will be Deleted during the operation. - -@subsubsection occt_modalg_hist_mod Modified shapes - -The shape is considered as Modified during the operation if the result shape contains the splits of the shape, not the shape itself. The shape can be modified only into the shapes with the same dimension. -The splits of the shape contained in the result shape are Modified from the shape. -The Modified shapes are created from the sub-shapes of the input shapes and, generally, repeat their geometry. - -The list of Modified elements will contain only those contributing to the result of the operation. If the list is empty, the shape has not been modified and it is necessary to check if it has been Deleted. - -For example, after translation of the shape in any direction all its sub-shapes will be modified into their translated copies. - -@subsubsection occt_modalg_hist_gen Generated shapes - -The shapes contained in the result shape are considered as Generated from the input shape if they were produced during the operation and have a different dimension from the shapes from which they were created. - -The list of Generated elements will contain only those included in the result of the operation. If the list is empty, no new shapes have been Generated from the shape. - -For example, extrusion of the edge in some direction will create a face. This face will be generated from the edge. - -@subsubsection occt_modalg_hist_tool BRepTools_History - -*BRepTools_History* is the general History tool intended for unification of the histories of different algorithms. - -*BRepTools_History* can be created from any algorithm supporting the standard history methods *(IsDeleted(), Modified()* and *Generated())*: -~~~~ -// The arguments of the operation -TopoDS_Shape aS = ...; - -// Perform transformation on the shape -gp_Trsf aTrsf; -aTrsf.SetTranslationPart(gp_Vec(0, 0, 1)); -BRepBuilderAPI_Transform aTransformer(aS, aTrsf); // Transformation API algorithm -const TopoDS_Shape& aRes = aTransformer.Shape(); - -// Create the translation history object -TopTools_ListOfShape anArguments; -anArguments.Append(aS); -BRepTools_History aHistory(anArguments, aTransformer); -~~~~ - -*BRepTools_History* also allows merging histories. Thus, if you have two or more subsequent operations you can get one final history combined from histories of these operations: - -~~~~ -Handle(BRepTools_History) aHist1 = ...; // History of first operation -Handle(BRepTools_History) aHist2 = ...; // History of second operation -~~~~ - -It is possible to merge the second history into the first one: -~~~~ -aHist1->Merge(aHist2); -~~~~ - -Or create the new history keeping the two histories unmodified: -~~~~ -Handle(BRepTools_History) aResHistory = new BRepTools_History; -aResHistory->Merge(aHist1); -aResHistory->Merge(aHist2); -~~~~ - -The possibilities of Merging histories and history creation from the API algorithms allow providing easy History support for the new algorithms. - -@subsubsection occt_modalg_hist_draw DRAW history support - -DRAW History support for the algorithms is provided by three basic commands: -* *isdeleted*; -* *modified*; -* *generated*. - -For more information on the Draw History mechanism, refer to the corresponding chapter in the Draw users guide - @ref occt_draw_hist "History commands". - - @section occt_modalg_3 Standard Topological Objects The following standard topological objects can be created: @@ -1797,331 +1461,588 @@ The solid is a composite shape built not from a geometry, but by the assembly of shells. Use *BRepBuilderAPI_MakeSolid* class to build a Solid from a set of Shells. Its use is similar to the use of the MakeWire class: shells are added to the solid in the same way that edges are added to the wire in MakeWire. -@section occt_modalg_3b Object Modification +@section occt_modalg_4 Primitives -@subsection occt_modalg_3b_1 Transformation -*BRepBuilderAPI_Transform* class can be used to apply a transformation to a shape (see class *gp_Trsf*). The methods have a boolean argument to copy or share the original shape, as long as the transformation allows (it is only possible for direct isometric transformations). By default, the original shape is shared. +The BRepPrimAPI package provides an API (Application Programming Interface) for construction of primitives such as: + * Boxes; + * Cones; + * Cylinders; + * Prisms. -The following example deals with the rotation of shapes. +It is possible to create partial solids, such as a sphere limited by longitude. In real models, primitives can be used for easy creation of specific sub-parts. + + * Construction by sweeping along a profile: + * Linear; + * Rotational (through an angle of rotation). + +Sweeps are objects obtained by sweeping a profile along a path. The profile can be any topology and the path is usually a curve or a wire. The profile generates objects according to the following rules: + * Vertices generate Edges + * Edges generate Faces. + * Wires generate Shells. + * Faces generate Solids. + * Shells generate Composite Solids. + +It is not allowed to sweep Solids and Composite Solids. Swept constructions along complex profiles such as BSpline curves also available in the BRepOffsetAPI package. This API provides simple, high level calls for the most common operations. + +@subsection occt_modalg_4_1 Making Primitives +@subsubsection occt_modalg_4_1_1 Box + +The class *BRepPrimAPI_MakeBox* allows building a parallelepiped box. The result is either a **Shell** or a **Solid**. There are four ways to build a box: + +* From three dimensions *dx, dy* and *dz*. The box is parallel to the axes and extends for [0,dx] [0,dy] [0,dz] . +* From a point and three dimensions. The same as above but the point is the new origin. +* From two points, the box is parallel to the axes and extends on the intervals defined by the coordinates of the two points. +* From a system of axes *gp_Ax2* and three dimensions. Same as the first way but the box is parallel to the given system of axes. +An error is raised if the box is flat in any dimension using the default precision. The following code shows how to create a box: +~~~~~ +TopoDS_Solid theBox = BRepPrimAPI_MakeBox(10.,20.,30.); ~~~~~ -TopoDS_Shape myShape1 = ...; -// The original shape 1 -TopoDS_Shape myShape2 = ...; -// The original shape2 -gp_Trsf T; -T.SetRotation(gp_Ax1(gp_Pnt(0.,0.,0.),gp_Vec(0.,0.,1.)), -2.*PI/5.); -BRepBuilderAPI_Transformation theTrsf(T); -theTrsf.Perform(myShape1); -TopoDS_Shape myNewShape1 = theTrsf.Shape() -theTrsf.Perform(myShape2,Standard_True); -// Here duplication is forced -TopoDS_Shape myNewShape2 = theTrsf.Shape() +The four methods to build a box are shown in the figure: + +@figure{/user_guides/modeling_algos/images/modeling_algos_image026.png,"Making Boxes",420} + +@subsubsection occt_modalg_4_1_2 Wedge +*BRepPrimAPI_MakeWedge* class allows building a wedge, which is a slanted box, i.e. a box with angles. The wedge is constructed in much the same way as a box i.e. from three dimensions dx,dy,dz plus arguments or from an axis system, three dimensions, and arguments. + +The following figure shows two ways to build wedges. One is to add a dimension *ltx*, which is the length in *x* of the face at *dy*. The second is to add *xmin, xmax, zmin* and *zmax* to describe the face at *dy*. + +The first method is a particular case of the second with *xmin = 0, xmax = ltx, zmin = 0, zmax = dz*. +To make a centered pyramid you can use *xmin = xmax = dx / 2, zmin = zmax = dz / 2*. + +@figure{/user_guides/modeling_algos/images/modeling_algos_image027.png,"Making Wedges",420} + +@subsubsection occt_modalg_4_1_3 Rotation object +*BRepPrimAPI_MakeOneAxis* is a deferred class used as a root class for all classes constructing rotational primitives. Rotational primitives are created by rotating a curve around an axis. They cover the cylinder, the cone, the sphere, the torus, and the revolution, which provides all other curves. + +The particular constructions of these primitives are described, but they all have some common arguments, which are: + + * A system of coordinates, where the Z axis is the rotation axis.. + * An angle in the range [0,2*PI]. + * A vmin, vmax parameter range on the curve. + +The result of the OneAxis construction is a Solid, a Shell, or a Face. The face is the face covering the rotational surface. Remember that you will not use the OneAxis directly but one of the derived classes, which provide improved constructions. The following figure illustrates the OneAxis arguments. + +@figure{/user_guides/modeling_algos/images/modeling_algos_image028.png,"MakeOneAxis arguments",360} + +@subsubsection occt_modalg_4_1_4 Cylinder +*BRepPrimAPI_MakeCylinder* class allows creating cylindrical primitives. A cylinder is created either in the default coordinate system or in a given coordinate system *gp_Ax2*. There are two constructions: + + * Radius and height, to build a full cylinder. + * Radius, height and angle to build a portion of a cylinder. + +The following code builds the cylindrical face of the figure, which is a quarter of cylinder along the *Y* axis with the origin at *X,Y,Z* the length of *DY* and radius *R*. + +~~~~~ + +Standard_Real X = 20, Y = 10, Z = 15, R = 10, DY = 30; +// Make the system of coordinates +gp_Ax2 axes = gp::ZOX(); +axes.Translate(gp_Vec(X,Y,Z)); +TopoDS_Face F = +BRepPrimAPI_MakeCylinder(axes,R,DY,PI/2.); +~~~~~ +@figure{/user_guides/modeling_algos/images/modeling_algos_image029.png,"Cylinder",360} + +@subsubsection occt_modalg_4_1_5 Cone +*BRepPrimAPI_MakeCone* class allows creating conical primitives. Like a cylinder, a cone is created either in the default coordinate system or in a given coordinate system (gp_Ax2). There are two constructions: + + * Two radii and height, to build a full cone. One of the radii can be null to make a sharp cone. + * Radii, height and angle to build a truncated cone. + +The following code builds the solid cone of the figure, which is located in the default system with radii *R1* and *R2* and height *H*. + +~~~~~ +Standard_Real R1 = 30, R2 = 10, H = 15; +TopoDS_Solid S = BRepPrimAPI_MakeCone(R1,R2,H); +~~~~~ + +@figure{/user_guides/modeling_algos/images/modeling_algos_image030.png,"Cone",360} + +@subsubsection occt_modalg_4_1_6 Sphere +*BRepPrimAPI_MakeSphere* class allows creating spherical primitives. Like a cylinder, a sphere is created either in the default coordinate system or in a given coordinate system *gp_Ax2*. There are four constructions: + + * From a radius -- builds a full sphere. + * From a radius and an angle -- builds a lune (digon). + * From a radius and two angles -- builds a wraparound spherical segment between two latitudes. The angles *a1* and *a2* must follow the relation: PI/2 <= a1 < a2 <= PI/2 . + * From a radius and three angles -- a combination of two previous methods builds a portion of spherical segment. + +The following code builds four spheres from a radius and three angles. + +~~~~~ +Standard_Real R = 30, ang = + PI/2, a1 = -PI/2.3, a2 = PI/4; +TopoDS_Solid S1 = BRepPrimAPI_MakeSphere(R); +TopoDS_Solid S2 = BRepPrimAPI_MakeSphere(R,ang); +TopoDS_Solid S3 = BRepPrimAPI_MakeSphere(R,a1,a2); +TopoDS_Solid S4 = BRepPrimAPI_MakeSphere(R,a1,a2,ang); +~~~~~ + +Note that we could equally well choose to create Shells instead of Solids. + +@figure{/user_guides/modeling_algos/images/modeling_algos_image031.png,"Examples of Spheres",420} + + +@subsubsection occt_modalg_4_1_7 Torus +*BRepPrimAPI_MakeTorus* class allows creating toroidal primitives. Like the other primitives, a torus is created either in the default coordinate system or in a given coordinate system *gp_Ax2*. There are four constructions similar to the sphere constructions: + + * Two radii -- builds a full torus. + * Two radii and an angle -- builds an angular torus segment. + * Two radii and two angles -- builds a wraparound torus segment between two radial planes. The angles a1, a2 must follow the relation 0 < a2 - a1 < 2*PI. + * Two radii and three angles -- a combination of two previous methods builds a portion of torus segment. + +@figure{/user_guides/modeling_algos/images/modeling_algos_image032.png,"Examples of Tori",420} + +The following code builds four toroidal shells from two radii and three angles. + +~~~~~ +Standard_Real R1 = 30, R2 = 10, ang = PI, a1 = 0, + a2 = PI/2; +TopoDS_Shell S1 = BRepPrimAPI_MakeTorus(R1,R2); +TopoDS_Shell S2 = BRepPrimAPI_MakeTorus(R1,R2,ang); +TopoDS_Shell S3 = BRepPrimAPI_MakeTorus(R1,R2,a1,a2); +TopoDS_Shell S4 = + BRepPrimAPI_MakeTorus(R1,R2,a1,a2,ang); +~~~~~ + +Note that we could equally well choose to create Solids instead of Shells. + +@subsubsection occt_modalg_4_1_8 Revolution +*BRepPrimAPI_MakeRevolution* class allows building a uniaxial primitive from a curve. As other uniaxial primitives it can be created in the default coordinate system or in a given coordinate system. + +The curve can be any *Geom_Curve*, provided it is planar and lies in the same plane as the Z-axis of local coordinate system. There are four modes of construction: + + * From a curve, use the full curve and make a full rotation. + * From a curve and an angle of rotation. + * From a curve and two parameters to trim the curve. The two parameters must be growing and within the curve range. + * From a curve, two parameters, and an angle. The two parameters must be growing and within the curve range. + + +@subsection occt_modalg_4_2 Sweeping: Prism, Revolution and Pipe +@subsubsection occt_modalg_4_2_1 Sweeping + +Sweeps are the objects you obtain by sweeping a **profile** along a **path**. The profile can be of any topology. The path is usually a curve or a wire. The profile generates objects according to the following rules: + + * Vertices generate Edges + * Edges generate Faces. + * Wires generate Shells. + * Faces generate Solids. + * Shells generate Composite Solids + +It is forbidden to sweep Solids and Composite Solids. A Compound generates a Compound with the sweep of all its elements. + +@figure{/user_guides/modeling_algos/images/modeling_algos_image033.png,"Generating a sweep",360} + +*BRepPrimAPI_MakeSweep class* is a deferred class used as a root of the the following sweep classes: +* *BRepPrimAPI_MakePrism* -- produces a linear sweep +* *BRepPrimAPI_MakeRevol* -- produces a rotational sweep +* *BRepPrimAPI_MakePipe* -- produces a general sweep. + + +@subsubsection occt_modalg_4_2_2 Prism +*BRepPrimAPI_MakePrism* class allows creating a linear **prism** from a shape and a vector or a direction. +* A vector allows creating a finite prism; +* A direction allows creating an infinite or semi-infinite prism. The semi-infinite or infinite prism is toggled by a Boolean argument. All constructors have a boolean argument to copy the original shape or share it (by default). + +The following code creates a finite, an infinite and a semi-infinite solid using a face, a direction and a length. + +~~~~~ +TopoDS_Face F = ..; // The swept face +gp_Dir direc(0,0,1); +Standard_Real l = 10; +// create a vector from the direction and the length +gp_Vec v = direc; +v *= l; +TopoDS_Solid P1 = BRepPrimAPI_MakePrism(F,v); +// finite +TopoDS_Solid P2 = BRepPrimAPI_MakePrism(F,direc); +// infinite +TopoDS_Solid P3 = BRepPrimAPI_MakePrism(F,direc,Standard_False); +// semi-infinite +~~~~~ + +@figure{/user_guides/modeling_algos/images/modeling_algos_image034.png,"Finite, infinite, and semi-infinite prisms",420} + +@subsubsection occt_modalg_4_2_3 Rotational Sweep +*BRepPrimAPI_MakeRevol* class allows creating a rotational sweep from a shape, an axis (gp_Ax1), and an angle. The angle has a default value of 2*PI which means a closed revolution. + +*BRepPrimAPI_MakeRevol* constructors have a last argument to copy or share the original shape. The following code creates a a full and a partial rotation using a face, an axis and an angle. + +~~~~~ +TopoDS_Face F = ...; // the profile +gp_Ax1 axis(gp_Pnt(0,0,0),gp_Dir(0,0,1)); +Standard_Real ang = PI/3; +TopoDS_Solid R1 = BRepPrimAPI_MakeRevol(F,axis); +// Full revol +TopoDS_Solid R2 = BRepPrimAPI_MakeRevol(F,axis,ang); ~~~~~ -@subsection occt_modalg_3b_2 Duplication +@figure{/user_guides/modeling_algos/images/modeling_algos_image035.png,"Full and partial rotation",420} + + + + +@section occt_modalg_5 Boolean Operations + +Boolean operations are used to create new shapes from the combinations of two groups of shapes. + +| Operation | Result | +| :---- | :------ | +| Fuse | all points in S1 or S2 | +| Common | all points in S1 and S2 | +| Cut S1 by S2| all points in S1 and not in S2 | + +@figure{/user_guides/modeling_algos/images/modeling_algos_image036.png,"Boolean Operations",420} + +From the viewpoint of Topology these are topological operations followed by blending (putting fillets onto edges created after the topological operation). + +Topological operations are the most convenient way to create real industrial parts. As most industrial parts consist of several simple elements such as gear wheels, arms, holes, ribs, tubes and pipes. It is usually easy to create those elements separately and then to combine them by Boolean operations in the whole final part. + +See @ref specification__boolean_operations "Boolean Operations" for detailed documentation. -Use the *BRepBuilderAPI_Copy* class to duplicate a shape. A new shape is thus created. -In the following example, a solid is copied: +@subsection occt_modalg_5_1 Input and Result Arguments -~~~~~ -TopoDS Solid MySolid; -....// Creates a solid +Boolean Operations have the following types of the arguments and produce the following results: +* For arguments having the same shape type (e.g. SOLID / SOLID) the type of the resulting shape will be a COMPOUND, containing shapes of this type; +* For arguments having different shape types (e.g. SHELL / SOLID) the type of the resulting shape will be a COMPOUND, containing shapes of the type that is the same as that of the low type of the argument. Example: For SHELL/SOLID the result is a COMPOUND of SHELLs. +* For arguments with different shape types some of Boolean Operations can not be done using the default implementation, because of a non-manifold type of the result. Example: the FUSE operation for SHELL and SOLID can not be done, but the CUT operation can be done, where SHELL is the object and SOLID is the tool. +* It is possible to perform Boolean Operations on arguments of the COMPOUND shape type. In this case each compound must not be heterogeneous, i.e. it must contain equidimensional shapes (EDGEs or/and WIREs, FACEs or/and SHELLs, SOLIDs). SOLIDs inside the COMPOUND must not contact (intersect or touch) each other. The same condition should be respected for SHELLs or FACEs, WIREs or EDGEs. +* Boolean Operations for COMPSOLID type of shape are not supported. -TopoDS_Solid myCopy = BRepBuilderAPI_Copy(mySolid); -~~~~~ +@subsection occt_modalg_5_2 Implementation +*BRepAlgoAPI_BooleanOperation* class is the deferred root class for Boolean operations. -@section occt_modalg_4 Primitives +#### Fuse -The BRepPrimAPI package provides an API (Application Programming Interface) for construction of primitives such as: - * Boxes; - * Cones; - * Cylinders; - * Prisms. +*BRepAlgoAPI_Fuse* performs the Fuse operation. -It is possible to create partial solids, such as a sphere limited by longitude. In real models, primitives can be used for easy creation of specific sub-parts. +~~~~~ +TopoDS_Shape A = ..., B = ...; +TopoDS_Shape S = BRepAlgoAPI_Fuse(A,B); +~~~~~ - * Construction by sweeping along a profile: - * Linear; - * Rotational (through an angle of rotation). +#### Common -Sweeps are objects obtained by sweeping a profile along a path. The profile can be any topology and the path is usually a curve or a wire. The profile generates objects according to the following rules: - * Vertices generate Edges - * Edges generate Faces. - * Wires generate Shells. - * Faces generate Solids. - * Shells generate Composite Solids. +*BRepAlgoAPI_Common* performs the Common operation. -It is not allowed to sweep Solids and Composite Solids. Swept constructions along complex profiles such as BSpline curves also available in the BRepOffsetAPI package. This API provides simple, high level calls for the most common operations. +~~~~~ +TopoDS_Shape A = ..., B = ...; +TopoDS_Shape S = BRepAlgoAPI_Common(A,B); +~~~~~ -@subsection occt_modalg_4_1 Making Primitives -@subsubsection occt_modalg_4_1_1 Box +#### Cut +*BRepAlgoAPI_Cut* performs the Cut operation. -The class *BRepPrimAPI_MakeBox* allows building a parallelepiped box. The result is either a **Shell** or a **Solid**. There are four ways to build a box: +~~~~~ +TopoDS_Shape A = ..., B = ...; +TopoDS_Shape S = BRepAlgoAPI_Cut(A,B); +~~~~~ -* From three dimensions *dx, dy* and *dz*. The box is parallel to the axes and extends for [0,dx] [0,dy] [0,dz] . -* From a point and three dimensions. The same as above but the point is the new origin. -* From two points, the box is parallel to the axes and extends on the intervals defined by the coordinates of the two points. -* From a system of axes *gp_Ax2* and three dimensions. Same as the first way but the box is parallel to the given system of axes. +#### Section + +*BRepAlgoAPI_Section* performs the section, described as a *TopoDS_Compound* made of *TopoDS_Edge*. + +@figure{/user_guides/modeling_algos/images/modeling_algos_image037.png,"Section operation",220} -An error is raised if the box is flat in any dimension using the default precision. The following code shows how to create a box: ~~~~~ -TopoDS_Solid theBox = BRepPrimAPI_MakeBox(10.,20.,30.); +TopoDS_Shape A = ..., TopoDS_ShapeB = ...; +TopoDS_Shape S = BRepAlgoAPI_Section(A,B); ~~~~~ -The four methods to build a box are shown in the figure: -@figure{/user_guides/modeling_algos/images/modeling_algos_image026.png,"Making Boxes",420} -@subsubsection occt_modalg_4_1_2 Wedge -*BRepPrimAPI_MakeWedge* class allows building a wedge, which is a slanted box, i.e. a box with angles. The wedge is constructed in much the same way as a box i.e. from three dimensions dx,dy,dz plus arguments or from an axis system, three dimensions, and arguments. -The following figure shows two ways to build wedges. One is to add a dimension *ltx*, which is the length in *x* of the face at *dy*. The second is to add *xmin, xmax, zmin* and *zmax* to describe the face at *dy*. +@section occt_modalg_2_topo_tools Topological Tools -The first method is a particular case of the second with *xmin = 0, xmax = ltx, zmin = 0, zmax = dz*. -To make a centered pyramid you can use *xmin = xmax = dx / 2, zmin = zmax = dz / 2*. +Open CASCADE Technology topological tools provide algorithms to + * Create wires from edges; + * Create faces from wires; + * Compute state of the shape relatively other shape; + * Orient shapes in container; + * Create new shapes from the existing ones; + * Build PCurves of edges on the faces; + * Check the validity of the shapes; + * Take the point in the face; + * Get the normal direction for the face. -@figure{/user_guides/modeling_algos/images/modeling_algos_image027.png,"Making Wedges",420} -@subsubsection occt_modalg_4_1_3 Rotation object -*BRepPrimAPI_MakeOneAxis* is a deferred class used as a root class for all classes constructing rotational primitives. Rotational primitives are created by rotating a curve around an axis. They cover the cylinder, the cone, the sphere, the torus, and the revolution, which provides all other curves. +@subsection occt_modalg_2_topo_tools_1 Creation of the faces from wireframe model -The particular constructions of these primitives are described, but they all have some common arguments, which are: +It is possible to create the planar faces from the arbitrary set of planar edges randomly located in 3D space. +This feature might be useful if you need for instance to restore the shape from the wireframe model: - * A system of coordinates, where the Z axis is the rotation axis.. - * An angle in the range [0,2*PI]. - * A vmin, vmax parameter range on the curve. +@figure{/user_guides/modeling_algos/images/modeling_algos_image062.png,"Wireframe model",160} +@figure{/user_guides/modeling_algos/images/modeling_algos_image063.png,"Faces of the model",160} -The result of the OneAxis construction is a Solid, a Shell, or a Face. The face is the face covering the rotational surface. Remember that you will not use the OneAxis directly but one of the derived classes, which provide improved constructions. The following figure illustrates the OneAxis arguments. -@figure{/user_guides/modeling_algos/images/modeling_algos_image028.png,"MakeOneAxis arguments",360} +To make the faces from edges it is, firstly, necessary to create planar wires from the given edges and than create planar faces from each wire. +The static methods *BOPAlgo_Tools::EdgesToWires* and *BOPAlgo_Tools::WiresToFaces* can be used for that: +~~~~~ +TopoDS_Shape anEdges = ...; /* The input edges */ +Standard_Real anAngTol = 1.e-8; /* The angular tolerance for distinguishing the planes in which the wires are located */ +Standard_Boolean bShared = Standard_False; /* Defines whether the edges are shared or not */ +// +TopoDS_Shape aWires; /* resulting wires */ +Standard_Integer iErr = BOPAlgo_Tools::EdgesToWires(anEdges, aWires, bShared, anAngTol); +if (iErr) { + cout << "Error: Unable to build wires from given edges\n"; + return; +} +// +TopoDS_Shape aFaces; /* resulting faces */ +Standard_Boolean bDone = BOPAlgo_Tools::WiresToFaces(aWires, aFaces, anAngTol); +if (!bDone) { + cout << "Error: Unable to build faces from wires\n"; + return; +} +~~~~~ -@subsubsection occt_modalg_4_1_4 Cylinder -*BRepPrimAPI_MakeCylinder* class allows creating cylindrical primitives. A cylinder is created either in the default coordinate system or in a given coordinate system *gp_Ax2*. There are two constructions: +These methods can also be used separately: + * *BOPAlgo_Tools::EdgesToWires* allows creating planar wires from edges. +The input edges may be not shared, but the output wires will be sharing the coinciding vertices and edges. For this the intersection of the edges is performed. +Although, it is possible to skip the intersection stage (if the input edges are already shared) by passing the corresponding flag into the method. +The input edges are expected to be planar, but the method does not check it. Thus, if the input edges are not planar, the output wires will also be not planar. +In general, the output wires are non-manifold and may contain free vertices, as well as multi-connected vertices. + * *BOPAlgo_Tools::WiresToFaces* allows creating planar faces from the planar wires. +In general, the input wires are non-manifold and may be not closed, but should share the coinciding parts. +The wires located in the same plane and completely included into other wires will create holes in the faces built from outer wires: - * Radius and height, to build a full cylinder. - * Radius, height and angle to build a portion of a cylinder. +@figure{/user_guides/modeling_algos/images/modeling_algos_image064.png,"Wireframe model",160} +@figure{/user_guides/modeling_algos/images/modeling_algos_image065.png,"Two faces (red face has a hole)",160} -The following code builds the cylindrical face of the figure, which is a quarter of cylinder along the *Y* axis with the origin at *X,Y,Z* the length of *DY* and radius *R*. -~~~~~ -Standard_Real X = 20, Y = 10, Z = 15, R = 10, DY = 30; -// Make the system of coordinates -gp_Ax2 axes = gp::ZOX(); -axes.Translate(gp_Vec(X,Y,Z)); -TopoDS_Face F = -BRepPrimAPI_MakeCylinder(axes,R,DY,PI/2.); -~~~~~ -@figure{/user_guides/modeling_algos/images/modeling_algos_image029.png,"Cylinder",360} +@subsection occt_modalg_2_topo_tools_2 Classification of the shapes -@subsubsection occt_modalg_4_1_5 Cone -*BRepPrimAPI_MakeCone* class allows creating conical primitives. Like a cylinder, a cone is created either in the default coordinate system or in a given coordinate system (gp_Ax2). There are two constructions: +The following methods allow classifying the different shapes relatively other shapes: + * The variety of the *BOPTools_AlgoTools::ComputState* methods classify the vertex/edge/face relatively solid; + * *BOPTools_AlgoTools::IsHole* classifies wire relatively face; + * *IntTools_Tools::ClassifyPointByFace* classifies point relatively face. - * Two radii and height, to build a full cone. One of the radii can be null to make a sharp cone. - * Radii, height and angle to build a truncated cone. +@subsection occt_modalg_2_topo_tools_3 Orientation of the shapes in the container -The following code builds the solid cone of the figure, which is located in the default system with radii *R1* and *R2* and height *H*. +The following methods allow reorienting shapes in the containers: + * *BOPTools_AlgoTools::OrientEdgesOnWire* correctly orients edges on the wire; + * *BOPTools_AlgoTools::OrientFacesOnShell* correctly orients faces on the shell. -~~~~~ -Standard_Real R1 = 30, R2 = 10, H = 15; -TopoDS_Solid S = BRepPrimAPI_MakeCone(R1,R2,H); -~~~~~ +@subsection occt_modalg_2_topo_tools_4 Making new shapes -@figure{/user_guides/modeling_algos/images/modeling_algos_image030.png,"Cone",360} +The following methods allow creating new shapes from the existing ones: + * The variety of the *BOPTools_AlgoTools::MakeNewVertex* creates the new vertices from other vertices and edges; + * *BOPTools_AlgoTools::MakeSplitEdge* splits the edge by the given parameters. -@subsubsection occt_modalg_4_1_6 Sphere -*BRepPrimAPI_MakeSphere* class allows creating spherical primitives. Like a cylinder, a sphere is created either in the default coordinate system or in a given coordinate system *gp_Ax2*. There are four constructions: +@subsection occt_modalg_2_topo_tools_5 Building PCurves - * From a radius -- builds a full sphere. - * From a radius and an angle -- builds a lune (digon). - * From a radius and two angles -- builds a wraparound spherical segment between two latitudes. The angles *a1* and *a2* must follow the relation: PI/2 <= a1 < a2 <= PI/2 . - * From a radius and three angles -- a combination of two previous methods builds a portion of spherical segment. +The following methods allow building PCurves of edges on faces: + * *BOPTools_AlgoTools::BuildPCurveForEdgeOnFace* computes PCurve for the edge on the face; + * *BOPTools_AlgoTools::BuildPCurveForEdgeOnPlane* and *BOPTools_AlgoTools::BuildPCurveForEdgesOnPlane* allow building PCurves for edges on the planar face; + * *BOPTools_AlgoTools::AttachExistingPCurve* takes PCurve on the face from one edge and attach this PCurve to other edge coinciding with the first one. -The following code builds four spheres from a radius and three angles. +@subsection occt_modalg_2_topo_tools_6 Checking the validity of the shapes -~~~~~ -Standard_Real R = 30, ang = - PI/2, a1 = -PI/2.3, a2 = PI/4; -TopoDS_Solid S1 = BRepPrimAPI_MakeSphere(R); -TopoDS_Solid S2 = BRepPrimAPI_MakeSphere(R,ang); -TopoDS_Solid S3 = BRepPrimAPI_MakeSphere(R,a1,a2); -TopoDS_Solid S4 = BRepPrimAPI_MakeSphere(R,a1,a2,ang); -~~~~~ +The following methods allow checking the validity of the shapes: + * *BOPTools_AlgoTools::IsMicroEdge* detects the small edges; + * *BOPTools_AlgoTools::ComputeTolerance* computes the correct tolerance of the edge on the face; + * *BOPTools_AlgoTools::CorrectShapeTolerances* and *BOPTools_AlgoTools::CorrectTolerances* allow correcting the tolerances of the sub-shapes. + * *BRepLib::FindValidRange* finds a range of 3d curve of the edge not covered by tolerance spheres of vertices. + +@subsection occt_modalg_2_topo_tools_7 Taking a point inside the face -Note that we could equally well choose to create Shells instead of Solids. +The following methods allow taking a point located inside the face: + * The variety of the *BOPTools_AlgoTools3D::PointNearEdge* allows getting a point inside the face located near the edge; + * *BOPTools_AlgoTools3D::PointInFace* allows getting a point inside the face. -@figure{/user_guides/modeling_algos/images/modeling_algos_image031.png,"Examples of Spheres",420} +@subsection occt_modalg_2_topo_tools_8 Getting normal for the face +The following methods allow getting the normal direction for the face/surface: + * *BOPTools_AlgoTools3D::GetNormalToSurface* computes the normal direction for the surface in the given point defined by UV parameters; + * *BOPTools_AlgoTools3D::GetNormalToFaceOnEdge* computes the normal direction for the face in the point located on the edge of the face; + * *BOPTools_AlgoTools3D::GetApproxNormalToFaceOnEdge* computes the normal direction for the face in the point located near the edge of the face. -@subsubsection occt_modalg_4_1_7 Torus -*BRepPrimAPI_MakeTorus* class allows creating toroidal primitives. Like the other primitives, a torus is created either in the default coordinate system or in a given coordinate system *gp_Ax2*. There are four constructions similar to the sphere constructions: - * Two radii -- builds a full torus. - * Two radii and an angle -- builds an angular torus segment. - * Two radii and two angles -- builds a wraparound torus segment between two radial planes. The angles a1, a2 must follow the relation 0 < a2 - a1 < 2*PI. - * Two radii and three angles -- a combination of two previous methods builds a portion of torus segment. -@figure{/user_guides/modeling_algos/images/modeling_algos_image032.png,"Examples of Tori",420} +@section occt_modalg_3a The Topology API + +The Topology API of Open CASCADE Technology (**OCCT**) includes the following six packages: + * *BRepAlgoAPI* + * *BRepBuilderAPI* + * *BRepFilletAPI* + * *BRepFeat* + * *BRepOffsetAPI* + * *BRepPrimAPI* -The following code builds four toroidal shells from two radii and three angles. +The classes provided by the API have the following features: + * The constructors of classes provide different construction methods; + * The class retains different tools used to build objects as fields; + * The class provides a casting method to obtain the result automatically with a function-like call. + +Let us use the class *BRepBuilderAPI_MakeEdge* to create a linear edge from two points. ~~~~~ -Standard_Real R1 = 30, R2 = 10, ang = PI, a1 = 0, - a2 = PI/2; -TopoDS_Shell S1 = BRepPrimAPI_MakeTorus(R1,R2); -TopoDS_Shell S2 = BRepPrimAPI_MakeTorus(R1,R2,ang); -TopoDS_Shell S3 = BRepPrimAPI_MakeTorus(R1,R2,a1,a2); -TopoDS_Shell S4 = - BRepPrimAPI_MakeTorus(R1,R2,a1,a2,ang); +gp_Pnt P1(10,0,0), P2(20,0,0); +TopoDS_Edge E = BRepBuilderAPI_MakeEdge(P1,P2); ~~~~~ -Note that we could equally well choose to create Solids instead of Shells. - -@subsubsection occt_modalg_4_1_8 Revolution -*BRepPrimAPI_MakeRevolution* class allows building a uniaxial primitive from a curve. As other uniaxial primitives it can be created in the default coordinate system or in a given coordinate system. - -The curve can be any *Geom_Curve*, provided it is planar and lies in the same plane as the Z-axis of local coordinate system. There are four modes of construction: +This is the simplest way to create edge E from two points P1, P2, but the developer can test for errors when he is not as confident of the data as in the previous example. - * From a curve, use the full curve and make a full rotation. - * From a curve and an angle of rotation. - * From a curve and two parameters to trim the curve. The two parameters must be growing and within the curve range. - * From a curve, two parameters, and an angle. The two parameters must be growing and within the curve range. +~~~~~ +#include +#include +#include +void EdgeTest() +{ +gp_Pnt P1; +gp_Pnt P2; +BRepBuilderAPI_MakeEdge ME(P1,P2); +if (!ME.IsDone()) +{ +// doing ME.Edge() or E = ME here +// would raise StdFail_NotDone +Standard_DomainError::Raise +(“ProcessPoints::Failed to createan edgeâ€); +} +TopoDS_Edge E = ME; +} +~~~~~ +In this example an intermediary object ME has been introduced. This can be tested for the completion of the function before accessing the result. More information on **error handling** in the topology programming interface can be found in the next section. -@subsection occt_modalg_4_2 Sweeping: Prism, Revolution and Pipe -@subsubsection occt_modalg_4_2_1 Sweeping +*BRepBuilderAPI_MakeEdge* provides valuable information. For example, when creating an edge from two points, two vertices have to be created from the points. Sometimes you may be interested in getting these vertices quickly without exploring the new edge. Such information can be provided when using a class. The following example shows a function creating an edge and two vertices from two points. -Sweeps are the objects you obtain by sweeping a **profile** along a **path**. The profile can be of any topology. The path is usually a curve or a wire. The profile generates objects according to the following rules: +~~~~~ +void MakeEdgeAndVertices(const gp_Pnt& P1, +const gp_Pnt& P2, +TopoDS_Edge& E, +TopoDS_Vertex& V1, +TopoDS_Vertex& V2) +{ +BRepBuilderAPI_MakeEdge ME(P1,P2); +if (!ME.IsDone()) { +Standard_DomainError::Raise +(“MakeEdgeAndVerices::Failed to create an edgeâ€); +} +E = ME; +V1 = ME.Vextex1(); +V2 = ME.Vertex2(); +~~~~~ - * Vertices generate Edges - * Edges generate Faces. - * Wires generate Shells. - * Faces generate Solids. - * Shells generate Composite Solids +The class *BRepBuilderAPI_MakeEdge* provides two methods *Vertex1* and *Vertex2*, which return two vertices used to create the edge. -It is forbidden to sweep Solids and Composite Solids. A Compound generates a Compound with the sweep of all its elements. +How can *BRepBuilderAPI_MakeEdge* be both a function and a class? It can do this because it uses the casting capabilities of C++. The *BRepBuilderAPI_MakeEdge* class has a method called Edge; in the previous example the line E = ME could have been written. -@figure{/user_guides/modeling_algos/images/modeling_algos_image033.png,"Generating a sweep",360} +~~~~~ +E = ME.Edge(); +~~~~~ -*BRepPrimAPI_MakeSweep class* is a deferred class used as a root of the the following sweep classes: -* *BRepPrimAPI_MakePrism* -- produces a linear sweep -* *BRepPrimAPI_MakeRevol* -- produces a rotational sweep -* *BRepPrimAPI_MakePipe* -- produces a general sweep. +This instruction tells the C++ compiler that there is an **implicit casting** of a *BRepBuilderAPI_MakeEdge* into a *TopoDS_Edge* using the *Edge* method. It means this method is automatically called when a *BRepBuilderAPI_MakeEdge* is found where a *TopoDS_Edge* is required. +This feature allows you to provide classes, which have the simplicity of function calls when required and the power of classes when advanced processing is necessary. All the benefits of this approach are explained when describing the topology programming interface classes. -@subsubsection occt_modalg_4_2_2 Prism -*BRepPrimAPI_MakePrism* class allows creating a linear **prism** from a shape and a vector or a direction. -* A vector allows creating a finite prism; -* A direction allows creating an infinite or semi-infinite prism. The semi-infinite or infinite prism is toggled by a Boolean argument. All constructors have a boolean argument to copy the original shape or share it (by default). -The following code creates a finite, an infinite and a semi-infinite solid using a face, a direction and a length. +@subsection occt_modalg_hist History support -~~~~~ -TopoDS_Face F = ..; // The swept face -gp_Dir direc(0,0,1); -Standard_Real l = 10; -// create a vector from the direction and the length -gp_Vec v = direc; -v *= l; -TopoDS_Solid P1 = BRepPrimAPI_MakePrism(F,v); -// finite -TopoDS_Solid P2 = BRepPrimAPI_MakePrism(F,direc); -// infinite -TopoDS_Solid P3 = BRepPrimAPI_MakePrism(F,direc,Standard_False); -// semi-infinite -~~~~~ +All topological API algorithms support the history of shape modifications (or just History) for their arguments. +Generally, the history is available for the following types of sub-shapes of input shapes: +* Vertex; +* Edge; +* Face. -@figure{/user_guides/modeling_algos/images/modeling_algos_image034.png,"Finite, infinite, and semi-infinite prisms",420} +Some algorithms also support the history for Solids. -@subsubsection occt_modalg_4_2_3 Rotational Sweep -*BRepPrimAPI_MakeRevol* class allows creating a rotational sweep from a shape, an axis (gp_Ax1), and an angle. The angle has a default value of 2*PI which means a closed revolution. +The history information consists of the following information: +* Information about Deleted shapes; +* Information about Modified shapes; +* Information about Generated shapes. -*BRepPrimAPI_MakeRevol* constructors have a last argument to copy or share the original shape. The following code creates a a full and a partial rotation using a face, an axis and an angle. +The History is filled basing on the result of the operation. History cannot return any shapes not contained in the result. +If the result of the operation is an empty shape, all input shapes will be considered as Deleted and none will have Modified and Generated shapes. -~~~~~ -TopoDS_Face F = ...; // the profile -gp_Ax1 axis(gp_Pnt(0,0,0),gp_Dir(0,0,1)); -Standard_Real ang = PI/3; -TopoDS_Solid R1 = BRepPrimAPI_MakeRevol(F,axis); -// Full revol -TopoDS_Solid R2 = BRepPrimAPI_MakeRevol(F,axis,ang); -~~~~~ +The history information can be accessed by the API methods: +* *Standard_Boolean IsDeleted(const TopoDS_Shape& theS)* - to check if the shape has been Deleted during the operation; +* *const TopTools_ListOfShape& Modified(const TopoDS_Shape& theS)* - to get the shapes Modified from the given shape; +* *const TopTools_ListOfShape& Generated(const TopoDS_Shape& theS)* - to get the shapes Generated from the given shape. -@figure{/user_guides/modeling_algos/images/modeling_algos_image035.png,"Full and partial rotation",420} +@subsubsection occt_modalg_hist_del Deleted shapes -@section occt_modalg_5 Boolean Operations +The shape is considered as Deleted during the operation if all of the following conditions are met: +* The shape is a part of the argument shapes of the operation; +* The result shape does not contain the shape itself; +* The result shape does not contain any of the splits of the shape. -Boolean operations are used to create new shapes from the combinations of two groups of shapes. +For example, in the CUT operation between two intersecting solids all vertices/edges/faces located completely inside the Tool solid will be Deleted during the operation. -| Operation | Result | -| :---- | :------ | -| Fuse | all points in S1 or S2 | -| Common | all points in S1 and S2 | -| Cut S1 by S2| all points in S1 and not in S2 | +@subsubsection occt_modalg_hist_mod Modified shapes -@figure{/user_guides/modeling_algos/images/modeling_algos_image036.png,"Boolean Operations",420} +The shape is considered as Modified during the operation if the result shape contains the splits of the shape, not the shape itself. The shape can be modified only into the shapes with the same dimension. +The splits of the shape contained in the result shape are Modified from the shape. +The Modified shapes are created from the sub-shapes of the input shapes and, generally, repeat their geometry. -From the viewpoint of Topology these are topological operations followed by blending (putting fillets onto edges created after the topological operation). +The list of Modified elements will contain only those contributing to the result of the operation. If the list is empty, the shape has not been modified and it is necessary to check if it has been Deleted. -Topological operations are the most convenient way to create real industrial parts. As most industrial parts consist of several simple elements such as gear wheels, arms, holes, ribs, tubes and pipes. It is usually easy to create those elements separately and then to combine them by Boolean operations in the whole final part. +For example, after translation of the shape in any direction all its sub-shapes will be modified into their translated copies. -See @ref occt_user_guides__boolean_operations "Boolean Operations" for detailed documentation. +@subsubsection occt_modalg_hist_gen Generated shapes -@subsection occt_modalg_5_1 Input and Result Arguments +The shapes contained in the result shape are considered as Generated from the input shape if they were produced during the operation and have a different dimension from the shapes from which they were created. -Boolean Operations have the following types of the arguments and produce the following results: -* For arguments having the same shape type (e.g. SOLID / SOLID) the type of the resulting shape will be a COMPOUND, containing shapes of this type; -* For arguments having different shape types (e.g. SHELL / SOLID) the type of the resulting shape will be a COMPOUND, containing shapes of the type that is the same as that of the low type of the argument. Example: For SHELL/SOLID the result is a COMPOUND of SHELLs. -* For arguments with different shape types some of Boolean Operations can not be done using the default implementation, because of a non-manifold type of the result. Example: the FUSE operation for SHELL and SOLID can not be done, but the CUT operation can be done, where SHELL is the object and SOLID is the tool. -* It is possible to perform Boolean Operations on arguments of the COMPOUND shape type. In this case each compound must not be heterogeneous, i.e. it must contain equidimensional shapes (EDGEs or/and WIREs, FACEs or/and SHELLs, SOLIDs). SOLIDs inside the COMPOUND must not contact (intersect or touch) each other. The same condition should be respected for SHELLs or FACEs, WIREs or EDGEs. -* Boolean Operations for COMPSOLID type of shape are not supported. +The list of Generated elements will contain only those included in the result of the operation. If the list is empty, no new shapes have been Generated from the shape. -@subsection occt_modalg_5_2 Implementation +For example, extrusion of the edge in some direction will create a face. This face will be generated from the edge. -*BRepAlgoAPI_BooleanOperation* class is the deferred root class for Boolean operations. +@subsubsection occt_modalg_hist_tool BRepTools_History -#### Fuse +*BRepTools_History* is the general History tool intended for unification of the histories of different algorithms. -*BRepAlgoAPI_Fuse* performs the Fuse operation. +*BRepTools_History* can be created from any algorithm supporting the standard history methods *(IsDeleted(), Modified()* and *Generated())*: +~~~~ +// The arguments of the operation +TopoDS_Shape aS = ...; -~~~~~ -TopoDS_Shape A = ..., B = ...; -TopoDS_Shape S = BRepAlgoAPI_Fuse(A,B); -~~~~~ +// Perform transformation on the shape +gp_Trsf aTrsf; +aTrsf.SetTranslationPart(gp_Vec(0, 0, 1)); +BRepBuilderAPI_Transform aTransformer(aS, aTrsf); // Transformation API algorithm +const TopoDS_Shape& aRes = aTransformer.Shape(); -#### Common +// Create the translation history object +TopTools_ListOfShape anArguments; +anArguments.Append(aS); +BRepTools_History aHistory(anArguments, aTransformer); +~~~~ -*BRepAlgoAPI_Common* performs the Common operation. +*BRepTools_History* also allows merging histories. Thus, if you have two or more subsequent operations you can get one final history combined from histories of these operations: -~~~~~ -TopoDS_Shape A = ..., B = ...; -TopoDS_Shape S = BRepAlgoAPI_Common(A,B); -~~~~~ +~~~~ +Handle(BRepTools_History) aHist1 = ...; // History of first operation +Handle(BRepTools_History) aHist2 = ...; // History of second operation +~~~~ -#### Cut -*BRepAlgoAPI_Cut* performs the Cut operation. +It is possible to merge the second history into the first one: +~~~~ +aHist1->Merge(aHist2); +~~~~ -~~~~~ -TopoDS_Shape A = ..., B = ...; -TopoDS_Shape S = BRepAlgoAPI_Cut(A,B); -~~~~~ +Or create the new history keeping the two histories unmodified: +~~~~ +Handle(BRepTools_History) aResHistory = new BRepTools_History; +aResHistory->Merge(aHist1); +aResHistory->Merge(aHist2); +~~~~ -#### Section +The possibilities of Merging histories and history creation from the API algorithms allow providing easy History support for the new algorithms. -*BRepAlgoAPI_Section* performs the section, described as a *TopoDS_Compound* made of *TopoDS_Edge*. +@subsubsection occt_modalg_hist_draw DRAW history support -@figure{/user_guides/modeling_algos/images/modeling_algos_image037.png,"Section operation",220} +DRAW History support for the algorithms is provided by three basic commands: +* *isdeleted*; +* *modified*; +* *generated*. -~~~~~ -TopoDS_Shape A = ..., TopoDS_ShapeB = ...; -TopoDS_Shape S = BRepAlgoAPI_Section(A,B); -~~~~~ +For more information on the Draw History mechanism, refer to the corresponding chapter in the Draw users guide - @ref occt_draw_hist "History commands". -@section occt_modalg_6 Fillets and Chamfers +@subsection occt_modalg_6 Fillets and Chamfers This library provides algorithms to make fillets and chamfers on shape edges. The following cases are addressed: @@ -2131,8 +2052,8 @@ If there is a concavity, both surfaces that need to be extended and those, which do not, are processed. -@subsection occt_modalg_6_1 Fillets -@subsection occt_modalg_6_1_1 Fillet on shape +@subsubsection occt_modalg_6_1 Fillets +@subsubsection occt_modalg_6_1_1 Fillet on shape A fillet is a smooth face replacing a sharp edge. @@ -2206,7 +2127,7 @@ @figure{/user_guides/modeling_algos/images/modeling_algos_image040.png,"Fillet with changing radius",360} -@subsection occt_modalg_6_1_2 Chamfer +@subsubsection occt_modalg_6_1_2 Chamfer A chamfer is a rectilinear edge replacing a sharp vertex of the face. @@ -2221,7 +2142,7 @@ @figure{/user_guides/modeling_algos/images/modeling_algos_image041.png,"Chamfer",360} -@subsection occt_modalg_6_1_3 Fillet on a planar face +@subsubsection occt_modalg_6_1_3 Fillet on a planar face *BRepFilletAPI_MakeFillet2d* class allows constructing fillets and chamfers on planar faces. To create a fillet on planar face: define it, indicate, which vertex is to be deleted, and give the fillet radius with *AddFillet* method. @@ -2270,7 +2191,7 @@ } ~~~~~ -@section occt_modalg_7 Offsets, Drafts, Pipes and Evolved shapes +@subsection occt_modalg_7 Offsets, Drafts, Pipes and Evolved shapes These classes provide the following services: @@ -2281,7 +2202,7 @@ * Creation of tapered shapes using draft angles; * Creation of sweeps. -@subsection occt_modalg_7_1 Offset computation +@subsubsection occt_modalg_7_1 Offset computation Offset computation can be performed using *BRepOffsetAPI_MakeOffsetShape*. This class provides API to the two different offset algorithms: @@ -2315,7 +2236,7 @@ NewShape = OffsetMaker2.Shape(); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -@subsection occt_modalg_7_2 Shelling +@subsubsection occt_modalg_7_2 Shelling Shelling is used to offset given faces of a solid by a specific value. It rounds or intersects adjacent faces along its edges depending on the convexity of the edge. The MakeThickSolidByJoin method of the *BRepOffsetAPI_MakeThickSolid* takes the solid, the list of faces to remove and an offset value as input. @@ -2353,7 +2274,7 @@ Solid = SolidMaker.Shape(); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -@subsection occt_modalg_7_3 Draft Angle +@subsubsection occt_modalg_7_3 Draft Angle *BRepOffsetAPI_DraftAngle* class allows modifying a shape by applying draft angles to its planar, cylindrical and conical faces. @@ -2405,7 +2326,7 @@ @figure{/user_guides/modeling_algos/images/modeling_algos_image043.png,"DraftAngle",420} -@subsection occt_modalg_7_4 Pipe Constructor +@subsubsection occt_modalg_7_4 Pipe Constructor *BRepOffsetAPI_MakePipe* class allows creating a pipe from a Spine, which is a Wire and a Profile which is a Shape. This implementation is limited to spines with smooth transitions, sharp transitions are precessed by *BRepOffsetAPI_MakePipeShell*. To be more precise the continuity must be G1, which means that the tangent must have the same direction, though not necessarily the same magnitude, at neighboring edges. @@ -2419,32 +2340,110 @@ @figure{/user_guides/modeling_algos/images/modeling_algos_image044.png,"Example of a Pipe",320} -@subsection occt_modalg_7_5 Evolved Solid +@subsubsection occt_modalg_7_5 Evolved Solid *BRepOffsetAPI_MakeEvolved* class allows creating an evolved solid from a Spine (planar face or wire) and a profile (wire). -The evolved solid is an unlooped sweep generated by the spine and the profile. +The evolved solid is an unlooped sweep generated by the spine and the profile. + +The evolved solid is created by sweeping the profile’s reference axes on the spine. The origin of the axes moves to the spine, the X axis and the local tangent coincide and the Z axis is normal to the face. + +The reference axes of the profile can be defined following two distinct modes: + +* The reference axes of the profile are the origin axes. +* The references axes of the profile are calculated as follows: + + the origin is given by the point on the spine which is the closest to the profile + + the X axis is given by the tangent to the spine at the point defined above + + the Z axis is the normal to the plane which contains the spine. + +~~~~~ +TopoDS_Face Spine = ...; +TopoDS_Wire Profile = ...; +TopoDS_Shape Evol = +BRepOffsetAPI_MakeEvolved(Spine,Profile); +~~~~~ + +@subsection occt_modalg_3b Object Modification + +@subsubsection occt_modalg_3b_1 Transformation +*BRepBuilderAPI_Transform* class can be used to apply a transformation to a shape (see class *gp_Trsf*). The methods have a boolean argument to copy or share the original shape, as long as the transformation allows (it is only possible for direct isometric transformations). By default, the original shape is shared. + +The following example deals with the rotation of shapes. + +~~~~~ + +TopoDS_Shape myShape1 = ...; +// The original shape 1 +TopoDS_Shape myShape2 = ...; +// The original shape2 +gp_Trsf T; +T.SetRotation(gp_Ax1(gp_Pnt(0.,0.,0.),gp_Vec(0.,0.,1.)), +2.*PI/5.); +BRepBuilderAPI_Transformation theTrsf(T); +theTrsf.Perform(myShape1); +TopoDS_Shape myNewShape1 = theTrsf.Shape() +theTrsf.Perform(myShape2,Standard_True); +// Here duplication is forced +TopoDS_Shape myNewShape2 = theTrsf.Shape() +~~~~~ + +@subsubsection occt_modalg_3b_2 Duplication + +Use the *BRepBuilderAPI_Copy* class to duplicate a shape. A new shape is thus created. +In the following example, a solid is copied: + +~~~~~ +TopoDS Solid MySolid; +....// Creates a solid + +TopoDS_Solid myCopy = BRepBuilderAPI_Copy(mySolid); +~~~~~ + +@subsection occt_modalg_3a_1 Error Handling in the Topology API + +A method can report an error in the two following situations: + * The data or arguments of the method are incorrect, i.e. they do not respect the restrictions specified by the methods in its specifications. Typical example: creating a linear edge from two identical points is likely to lead to a zero divide when computing the direction of the line. + * Something unexpected happened. This situation covers every error not included in the first category. Including: interruption, programming errors in the method or in another method called by the first method, bad specifications of the arguments (i.e. a set of arguments that was not expected to fail). + +The second situation is supposed to become increasingly exceptional as a system is debugged and it is handled by the **exception mechanism**. Using exceptions avoids handling error statuses in the call to a method: a very cumbersome style of programming. + +In the first situation, an exception is also supposed to be raised because the calling method should have verified the arguments and if it did not do so, there is a bug. For example, if before calling *MakeEdge* you are not sure that the two points are non-identical, this situation must be tested. + +Making those validity checks on the arguments can be tedious to program and frustrating as you have probably correctly surmised that the method will perform the test twice. It does not trust you. +As the test involves a great deal of computation, performing it twice is also time-consuming. + +Consequently, you might be tempted to adopt the highly inadvisable style of programming illustrated in the following example: -The evolved solid is created by sweeping the profile’s reference axes on the spine. The origin of the axes moves to the spine, the X axis and the local tangent coincide and the Z axis is normal to the face. +~~~~~ +#include +try { +TopoDS_Edge E = BRepBuilderAPI_MakeEdge(P1,P2); +// go on with the edge +} +catch { +// process the error. +} +~~~~~ -The reference axes of the profile can be defined following two distinct modes: +To help the user, the Topology API classes only raise the exception *StdFail_NotDone*. Any other exception means that something happened which was unforeseen in the design of this API. -* The reference axes of the profile are the origin axes. -* The references axes of the profile are calculated as follows: - + the origin is given by the point on the spine which is the closest to the profile - + the X axis is given by the tangent to the spine at the point defined above - + the Z axis is the normal to the plane which contains the spine. +The *NotDone* exception is only raised when the user tries to access the result of the computation and the original data is corrupted. At the construction of the class instance, if the algorithm cannot be completed, the internal flag *NotDone* is set. This flag can be tested and in some situations a more complete description of the error can be queried. If the user ignores the *NotDone* status and tries to access the result, an exception is raised. ~~~~~ -TopoDS_Face Spine = ...; -TopoDS_Wire Profile = ...; -TopoDS_Shape Evol = -BRepOffsetAPI_MakeEvolved(Spine,Profile); +BRepBuilderAPI_MakeEdge ME(P1,P2); +if (!ME.IsDone()) { +// doing ME.Edge() or E = ME here +// would raise StdFail_NotDone +Standard_DomainError::Raise +(“ProcessPoints::Failed to create an edgeâ€); +} +TopoDS_Edge E = ME; ~~~~~ -@section occt_modalg_8 Sewing -@subsection occt_modalg_8_1 Introduction +@subsection occt_modalg_8 Sewing + +@subsubsection occt_modalg_8_1 Introduction Sewing allows creation of connected topology (shells and wires) from a set of separate topological elements (faces and edges). For example, Sewing can be used to create of shell from a compound of separate faces. @@ -2461,7 +2460,7 @@ * **Sewn faces** should have edges shared with each other. * **Sewn edges** should have vertices shared with each other. -@subsection occt_modalg_8_2 Sewing Algorithm +@subsubsection occt_modalg_8_2 Sewing Algorithm The sewing algorithm is one of the basic algorithms used for shape processing, therefore its quality is very important. @@ -2500,7 +2499,7 @@ If all faces have been sewn correctly, the result is a shell. Otherwise, it is a compound. After a successful sewing operation all faces have a coherent orientation. -@subsection occt_modalg_8_3 Tolerance Management +@subsubsection occt_modalg_8_3 Tolerance Management To produce a closed shell, Sewing allows specifying the value of working tolerance, exceeding the size of small faces belonging to the shape. @@ -2512,7 +2511,7 @@ - If it is expected to obtain a shell with holes (free boundaries) as a result of sewing, the working tolerance should be set to a value not greater than the size of the smallest element (edge) or smallest distance between elements of such free boundary. Otherwise the free boundary may be sewn only partially. - It should be mentioned that the Sewing algorithm is unable to understand which small (less than working tolerance) free boundary should be kept and which should be sewn. -@subsection occt_modalg_8_4 Manifold and Non-manifold Sewing +@subsubsection occt_modalg_8_4 Manifold and Non-manifold Sewing To create one or several shells from a set of faces, sewing merges edges, which belong to different faces or one closed face. @@ -2524,7 +2523,7 @@ Giving a large tolerance value to non manifold sewing will cause a lot of incorrectness since all nearby geometry will be sewn. -@subsection occt_modalg_8_5 Local Sewing +@subsubsection occt_modalg_8_5 Local Sewing If a shape still has some non-sewn faces or edges after sewing, it is possible to use local sewing with a greater tolerance. @@ -2558,11 +2557,11 @@ ~~~~ -@section occt_modalg_9 Features +@subsection occt_modalg_9 Features This library contained in *BRepFeat* package is necessary for creation and manipulation of form and mechanical features that go beyond the classical boundary representation of shapes. In that sense, *BRepFeat* is an extension of *BRepBuilderAPI* package. -@subsection occt_modalg_9_1 Form Features +@subsubsection occt_modalg_9_1 Form Features The form features are depressions or protrusions including the following types: @@ -2593,7 +2592,7 @@ The *Form* from *BRepFeat* package is a deferred class used as a root for form features. It inherits *MakeShape* from *BRepBuilderAPI* and provides implementation of methods keep track of all sub-shapes. -@subsubsection occt_modalg_9_1_1 Prism +**Prism** The class *BRepFeat_MakePrism* is used to build a prism interacting with a shape. It is created or initialized from * a shape (the basic shape), @@ -2638,7 +2637,7 @@ @figure{/user_guides/modeling_algos/images/modeling_algos_image048.png,"Creating a prism between two faces with Perform()",320} -@subsubsection occt_modalg_9_1_2 Draft Prism +**Draft Prism** The class *BRepFeat_MakeDPrism* is used to build draft prism topologies interacting with a basis shape. These can be depressions or protrusions. A class object is created or initialized from: * a shape (basic shape), @@ -2691,7 +2690,7 @@ @figure{/user_guides/modeling_algos/images/modeling_algos_image049.png,"A tapered prism",320} -@subsubsection occt_modalg_9_1_3 Revolution +**Revolution** The class *BRepFeat_MakeRevol* is used to build a revolution interacting with a shape. It is created or initialized from: * a shape (the basic shape,) @@ -2733,7 +2732,7 @@ } ~~~~~ -@subsubsection occt_modalg_9_1_4 Pipe +**Pipe** The class *BRepFeat_MakePipe* constructs compound shapes with pipe features: depressions or protrusions. A class object is created or initialized from: * a shape (basic shape), @@ -2801,7 +2800,7 @@ @figure{/user_guides/modeling_algos/images/modeling_algos_image050.png,"Pipe depression",240} -@subsection occt_modalg_9_2 Mechanical Features +@subsubsection occt_modalg_9_2 Mechanical Features Mechanical features include ribs, protrusions and grooves (or slots), depressions along planar (linear) surfaces or revolution surfaces. @@ -2822,7 +2821,7 @@ * a Boolean indicating the type of operation (fusion=rib or cut=groove) on the basic shape; * another Boolean indicating if self-intersections have to be found (not used in every case). -@subsubsection occt_modalg_9_2_1 Linear Form +**Linear Form** Linear form is implemented in *MakeLinearForm* class, which creates a rib or a groove along a planar surface. There is one *Perform()* method, which performs a prism from the wire along the *direction1* and *direction2* interacting with base shape *Sbase*. The height of the prism is *Magnitude(Direction1)+Magnitude(direction2)*. @@ -2855,414 +2854,74 @@ new Geom_Plane(gp_Pnt(0.,45.,0.), gp_Vec(0.,1.,0.)); BRepFeat_MakeLinearForm aform(S, W, aplane, gp_Dir (0.,5.,0.), gp_Dir(0.,-3.,0.), 1, Standard_True); -aform.Perform(); -TopoDS_Shape res = aform.Shape(); -~~~~~ - -@figure{/user_guides/modeling_algos/images/modeling_algos_image051.png,"Creating a rib",240} - -@subsubsection occt_modalg_9_2_3 Gluer - -The class *BRepFeat_Gluer* allows gluing two solids along faces. The contact faces of the glued shape must not have parts outside the contact faces of the basic shape. Upon completion the algorithm gives the glued shape with cut out parts of faces inside the shape. - -The class is created or initialized from two shapes: the “glued†shape and the basic shape (on which the other shape is glued). -Two *Bind* methods are used to bind a face of the glued shape to a face of the basic shape and an edge of the glued shape to an edge of the basic shape. - -**Note** that every face and edge has to be bounded, if two edges of two glued faces are coincident they must be explicitly bounded. - -~~~~~ -TopoDS_Shape Sbase = ...; // the basic shape -TopoDS_Shape Sglued = ...; // the glued shape - -TopTools_ListOfShape Lfbase; -TopTools_ListOfShape Lfglued; -// Determination of the glued faces -... - -BRepFeat_Gluer theGlue(Sglue, Sbase); -TopTools_ListIteratorOfListOfShape itlb(Lfbase); -TopTools_ListIteratorOfListOfShape itlg(Lfglued); -for (; itlb.More(); itlb.Next(), itlg(Next()) { -const TopoDS_Face& f1 = TopoDS::Face(itlg.Value()); -const TopoDS_Face& f2 = TopoDS::Face(itlb.Value()); -theGlue.Bind(f1,f2); -// for example, use the class FindEdges from LocOpe to -// determine coincident edges -LocOpe_FindEdge fined(f1,f2); -for (fined.InitIterator(); fined.More(); fined.Next()) { -theGlue.Bind(fined.EdgeFrom(),fined.EdgeTo()); -} -} -theGlue.Build(); -if (theGlue.IsDone() { -TopoDS_Shape theResult = theGlue; -... -} -~~~~~ - -@subsubsection occt_modalg_9_2_4 Split Shape - -The class *BRepFeat_SplitShape* is used to split faces of a shape into wires or edges. The shape containing the new entities is rebuilt, sharing the unmodified ones. - -The class is created or initialized from a shape (the basic shape). -Three Add methods are available: -* *Add(Wire, Face)* -- adds a new wire on a face of the basic shape. -* *Add(Edge, Face)* -- adds a new edge on a face of the basic shape. -* *Add(EdgeNew, EdgeOld)* -- adds a new edge on an existing one (the old edge must contain the new edge). - -**Note** The added wires and edges must define closed wires on faces or wires located between two existing edges. Existing edges must not be intersected. - -~~~~~ -TopoDS_Shape Sbase = ...; // basic shape -TopoDS_Face Fsplit = ...; // face of Sbase -TopoDS_Wire Wsplit = ...; // new wire contained in Fsplit -BRepFeat_SplitShape Spls(Sbase); -Spls.Add(Wsplit, Fsplit); -TopoDS_Shape theResult = Spls; -... -~~~~~ - - -@section occt_modalg_10 Hidden Line Removal - -To provide the precision required in industrial design, drawings need to offer the possibility of removing lines, which are hidden in a given projection. - -For this the Hidden Line Removal component provides two algorithms: *HLRBRep_Algo* and *HLRBRep_PolyAlgo*. - -These algorithms are based on the principle of comparing each edge of the shape to be visualized with each of its faces, and calculating the visible and the hidden parts of each edge. Note that these are not the algorithms used in generating shading, which calculate the visible and hidden parts of each face in a shape to be visualized by comparing each face in the shape with every other face in the same shape. -These algorithms operate on a shape and remove or indicate edges hidden by faces. For a given projection, they calculate a set of lines characteristic of the object being represented. They are also used in conjunction with extraction utilities, which reconstruct a new, simplified shape from a selection of the results of the calculation. This new shape is made up of edges, which represent the shape visualized in the projection. - -*HLRBRep_Algo* allows working with the shape itself, whereas *HLRBRep_PolyAlgo* works with a polyhedral simplification of the shape. When you use *HLRBRep_Algo*, you obtain an exact result, whereas, when you use *HLRBRep_PolyAlgo*, you reduce the computation time, but obtain polygonal segments. - -No smoothing algorithm is provided. Consequently, a polyhedron will be treated as such and the algorithms will give the results in form of line segments conforming to the mathematical definition of the polyhedron. This is always the case with *HLRBRep_PolyAlgo*. - -*HLRBRep_Algo* and *HLRBRep_PolyAlgo* can deal with any kind of object, for example, assemblies of volumes, surfaces, and lines, as long as there are no unfinished objects or points within it. - -However, there some restrictions in HLR use: - * Points are not processed; - * Infinite faces or lines are not processed. - - -@figure{/user_guides/modeling_algos/images/modeling_algos_image052.png,"Sharp, smooth and sewn edges in a simple screw shape",320} - -@figure{/user_guides/modeling_algos/images/modeling_algos_image053.png,"Outline edges and isoparameters in the same shape",320} - -@figure{/user_guides/modeling_algos/images/modeling_algos_image054.png,"A simple screw shape seen with shading",320} - -@figure{/user_guides/modeling_algos/images/modeling_algos_image055.png,"An extraction showing hidden sharp edges",320} - - -The following services are related to Hidden Lines Removal : - -### Loading Shapes - -To pass a *TopoDS_Shape* to an *HLRBRep_Algo* object, use *HLRBRep_Algo::Add*. With an *HLRBRep_PolyAlgo* object, use *HLRBRep_PolyAlgo::Load*. If you wish to add several shapes, use Add or Load as often as necessary. - -### Setting view parameters - -*HLRBRep_Algo::Projector* and *HLRBRep_PolyAlgo::Projector* set a projector object which defines the parameters of the view. This object is an *HLRAlgo_Projector*. - -### Computing the projections - -*HLRBRep_PolyAlgo::Update* launches the calculation of outlines of the shape visualized by the *HLRBRep_PolyAlgo* framework. - -In the case of *HLRBRep_Algo*, use *HLRBRep_Algo::Update*. With this algorithm, you must also call the method *HLRBRep_Algo::Hide* to calculate visible and hidden lines of the shape to be visualized. With an *HLRBRep_PolyAlgo* object, visible and hidden lines are computed by *HLRBRep_PolyHLRToShape*. - -### Extracting edges - -The classes *HLRBRep_HLRToShape* and *HLRBRep_PolyHLRToShape* present a range of extraction filters for an *HLRBRep_Algo object* and an *HLRBRep_PolyAlgo* object, respectively. They highlight the type of edge from the results calculated by the algorithm on a shape. With both extraction classes, you can highlight the following types of output: - * visible/hidden sharp edges; - * visible/hidden smooth edges; - * visible/hidden sewn edges; - * visible/hidden outline edges. - -To perform extraction on an *HLRBRep_PolyHLRToShape* object, use *HLRBRep_PolyHLRToShape::Update* function. - -For an *HLRBRep_HLRToShape* object built from an *HLRBRepAlgo* object you can also highlight: - * visible isoparameters and - * hidden isoparameters. - -@subsection occt_modalg_10_1 Examples - -### HLRBRep_Algo - -~~~~~ -// Build The algorithm object -myAlgo = new HLRBRep_Algo(); - -// Add Shapes into the algorithm -TopTools_ListIteratorOfListOfShape anIterator(myListOfShape); -for (;anIterator.More();anIterator.Next()) -myAlgo-Add(anIterator.Value(),myNbIsos); - -// Set The Projector (myProjector is a -HLRAlgo_Projector) -myAlgo-Projector(myProjector); - -// Build HLR -myAlgo->Update(); - -// Set The Edge Status -myAlgo->Hide(); - -// Build the extraction object : -HLRBRep_HLRToShape aHLRToShape(myAlgo); - -// extract the results : -TopoDS_Shape VCompound = aHLRToShape.VCompound(); -TopoDS_Shape Rg1LineVCompound = -aHLRToShape.Rg1LineVCompound(); -TopoDS_Shape RgNLineVCompound = -aHLRToShape.RgNLineVCompound(); -TopoDS_Shape OutLineVCompound = -aHLRToShape.OutLineVCompound(); -TopoDS_Shape IsoLineVCompound = -aHLRToShape.IsoLineVCompound(); -TopoDS_Shape HCompound = aHLRToShape.HCompound(); -TopoDS_Shape Rg1LineHCompound = -aHLRToShape.Rg1LineHCompound(); -TopoDS_Shape RgNLineHCompound = -aHLRToShape.RgNLineHCompound(); -TopoDS_Shape OutLineHCompound = -aHLRToShape.OutLineHCompound(); -TopoDS_Shape IsoLineHCompound = -aHLRToShape.IsoLineHCompound(); -~~~~~ - -### HLRBRep_PolyAlgo - - -~~~~~ - -// Build The algorithm object -myPolyAlgo = new HLRBRep_PolyAlgo(); - -// Add Shapes into the algorithm -TopTools_ListIteratorOfListOfShape -anIterator(myListOfShape); -for (;anIterator.More();anIterator.Next()) -myPolyAlgo-Load(anIterator.Value()); - -// Set The Projector (myProjector is a -HLRAlgo_Projector) -myPolyAlgo->Projector(myProjector); - -// Build HLR -myPolyAlgo->Update(); - -// Build the extraction object : -HLRBRep_PolyHLRToShape aPolyHLRToShape; -aPolyHLRToShape.Update(myPolyAlgo); - -// extract the results : -TopoDS_Shape VCompound = -aPolyHLRToShape.VCompound(); -TopoDS_Shape Rg1LineVCompound = -aPolyHLRToShape.Rg1LineVCompound(); -TopoDS_Shape RgNLineVCompound = -aPolyHLRToShape.RgNLineVCompound(); -TopoDS_Shape OutLineVCompound = -aPolyHLRToShape.OutLineVCompound(); -TopoDS_Shape HCompound = -aPolyHLRToShape.HCompound(); -TopoDS_Shape Rg1LineHCompound = -aPolyHLRToShape.Rg1LineHCompound(); -TopoDS_Shape RgNLineHCompound = -aPolyHLRToShape.RgNLineHCompound(); -TopoDS_Shape OutLineHCompound = -aPolyHLRToShape.OutLineHCompound(); -~~~~~ - -@section occt_modalg_11 Meshing - -@subsection occt_modalg_11_1 Mesh presentations - -In addition to support of exact geometrical representation of 3D objects Open CASCADE Technology provides functionality to work with tessellated representations of objects in form of meshes. - -Open CASCADE Technology mesh functionality provides: -- data structures to store surface mesh data associated to shapes, and some basic algorithms to handle these data -- data structures and algorithms to build surface triangular mesh from *BRep* objects (shapes). -- tools to extend 3D visualization capabilities of Open CASCADE Technology with displaying meshes along with associated pre- and post-processor data. - -Open CASCADE Technology includes two mesh converters: -- VRML converter translates Open CASCADE shapes to VRML 1.0 files (Virtual Reality Modeling Language). Open CASCADE shapes may be translated in two representations: shaded or wireframe. A shaded representation present shapes as sets of triangles computed by a mesh algorithm while a wireframe representation present shapes as sets of curves. -- STL converter translates Open CASCADE shapes to STL files. STL (STtereoLithography) format is widely used for rapid prototyping. - -Open CASCADE SAS also offers Advanced Mesh Products: -- Open CASCADE Mesh Framework (OMF) -- Express Mesh +aform.Perform(); +TopoDS_Shape res = aform.Shape(); +~~~~~ -Besides, we can efficiently help you in the fields of surface and volume meshing algorithms, mesh optimization algorithms etc. If you require a qualified advice about meshing algorithms, do not hesitate to benefit from the expertise of our team in that domain. +@figure{/user_guides/modeling_algos/images/modeling_algos_image051.png,"Creating a rib",240} -The projects dealing with numerical simulation can benefit from using SALOME - an Open Source Framework for CAE with CAD data interfaces, generic Pre- and Post- F.E. processors and API for integrating F.E. solvers. +**Gluer** -Learn more about SALOME platform on https://www.salome-platform.org +The class *BRepFeat_Gluer* allows gluing two solids along faces. The contact faces of the glued shape must not have parts outside the contact faces of the basic shape. Upon completion the algorithm gives the glued shape with cut out parts of faces inside the shape. -@subsection occt_modalg_11_2 Meshing algorithm +The class is created or initialized from two shapes: the “glued†shape and the basic shape (on which the other shape is glued). +Two *Bind* methods are used to bind a face of the glued shape to a face of the basic shape and an edge of the glued shape to an edge of the basic shape. -The algorithm of shape triangulation is provided by the functionality of *BRepMesh_IncrementalMesh* class, which adds a triangulation of the shape to its topological data structure. This triangulation is used to visualize the shape in shaded mode. +**Note** that every face and edge has to be bounded, if two edges of two glued faces are coincident they must be explicitly bounded. ~~~~~ -#include -#include -#include +TopoDS_Shape Sbase = ...; // the basic shape +TopoDS_Shape Sglued = ...; // the glued shape -Standard_Boolean meshing_explicit_parameters() -{ - const Standard_Real aRadius = 10.0; - const Standard_Real aHeight = 25.0; - BRepPrimAPI_MakeCylinder aCylinder(aRadius, aHeight); - TopoDS_Shape aShape = aCylinder.Shape(); - - const Standard_Real aLinearDeflection = 0.01; - const Standard_Real anAngularDeflection = 0.5; - BRepMesh_IncrementalMesh aMesher (aShape, aLinearDeflection, Standard_False, anAngularDeflection, Standard_True); - const Standard_Integer aStatus = aMesher.GetStatusFlags(); - return !aStatus; -} +TopTools_ListOfShape Lfbase; +TopTools_ListOfShape Lfglued; +// Determination of the glued faces +... -Standard_Boolean meshing_imeshtools_parameters() -{ - const Standard_Real aRadius = 10.0; - const Standard_Real aHeight = 25.0; - BRepPrimAPI_MakeCylinder aCylinder(aRadius, aHeight); - TopoDS_Shape aShape = aCylinder.Shape(); - - IMeshTools_Parameters aMeshParams; - aMeshParams.Deflection = 0.01; - aMeshParams.Angle = 0.5; - aMeshParams.Relative = Standard_False; - aMeshParams.InParallel = Standard_True; - aMeshParams.MinSize = Precision::Confusion(); - aMeshParams.InternalVerticesMode = Standard_True; - aMeshParams.ControlSurfaceDeflection = Standard_True; - - BRepMesh_IncrementalMesh aMesher (aShape, aMeshParams); - const Standard_Integer aStatus = aMesher.GetStatusFlags(); - return !aStatus; -} +BRepFeat_Gluer theGlue(Sglue, Sbase); +TopTools_ListIteratorOfListOfShape itlb(Lfbase); +TopTools_ListIteratorOfListOfShape itlg(Lfglued); +for (; itlb.More(); itlb.Next(), itlg(Next()) { +const TopoDS_Face& f1 = TopoDS::Face(itlg.Value()); +const TopoDS_Face& f2 = TopoDS::Face(itlb.Value()); +theGlue.Bind(f1,f2); +// for example, use the class FindEdges from LocOpe to +// determine coincident edges +LocOpe_FindEdge fined(f1,f2); +for (fined.InitIterator(); fined.More(); fined.Next()) { +theGlue.Bind(fined.EdgeFrom(),fined.EdgeTo()); +} +} +theGlue.Build(); +if (theGlue.IsDone() { +TopoDS_Shape theResult = theGlue; +... +} ~~~~~ -The default meshing algorithm *BRepMesh_IncrementalMesh* has two major options to define triangulation -- linear and angular deflections. - -At the first step all edges from a face are discretized according to the specified parameters. - -At the second step, the faces are tessellated. Linear deflection limits the distance between a curve and its tessellation, whereas angular deflection limits the angle between subsequent segments in a polyline. - -@figure{/user_guides/modeling_algos/images/modeling_algos_image056.png,"Deflection parameters of BRepMesh_IncrementalMesh algorithm",420} - -There are additional options to control behavior of the meshing of face interior: *DeflectionInterior* and *AngleInterior*. *DeflectionInterior* limits the distance between triangles and the face interior. *AngleInterior* (used for tessellation of B-spline faces only) limits the angle between normals (N1, N2 and N3 in the picture) in the nodes of every link of the triangle. There is an exception for the links along the face boundary edges, "Angular Deflection" is used for them during edges discretization. - -@figure{/user_guides/modeling_algos/images/modeling_algos_image057.png,"Linear and angular interior deflections",420} - -Note that if a given value of linear deflection is less than shape tolerance then the algorithm will skip this value and will take into account the shape tolerance. - -The application should provide deflection parameters to compute a satisfactory mesh. Angular deflection is relatively simple and allows using a default value (12-20 degrees). Linear deflection has an absolute meaning and the application should provide the correct value for its models. Giving small values may result in a too huge mesh (consuming a lot of memory, which results in a long computation time and slow rendering) while big values result in an ugly mesh. - -For an application working in dimensions known in advance it can be reasonable to use the absolute linear deflection for all models. This provides meshes according to metrics and precision used in the application (for example, it it is known that the model will be stored in meters, 0.004 m is enough for most tasks). - -However, an application that imports models created in other applications may not use the same deflection for all models. Note that actually this is an abnormal situation and this application is probably just a viewer for CAD models with dimensions varying by an order of magnitude. This problem can be solved by introducing the concept of a relative linear deflection with some LOD (level of detail). The level of detail is a scale factor for absolute deflection, which is applied to model dimensions. - -Meshing covers a shape with a triangular mesh. Other than hidden line removal, you can use meshing to transfer the shape to another tool: a manufacturing tool, a shading algorithm, a finite element algorithm, or a collision algorithm. - -You can obtain information on the shape by first exploring it. To access triangulation of a face in the shape later, use *BRepTool::Triangulation*. To access a polygon, which is the approximation of an edge of the face, use *BRepTool::PolygonOnTriangulation*. - -@subsection occt_modalg_11_3 BRepMesh Architecture -@subsubsection occt_modalg_11_3_1 Goals - -The main goals of the chosen architecture are: - * Remove tight connections between data structures, auxiliary tools and algorithms to create an extensible solution, easy for maintenance and improvements; - * Separate the code among several functional units responsible for specific operation for the sake of simplification of debugging and readability; - * Introduce new data structures enabling the possibility to manipulate a discrete model of a particular entity (edge, wire, face) in order to perform computations locally instead of processing the entire model; - * Implement a new triangulation algorithm replacing the existing functionality that contains overcomplicated solutions that need to be moved to the upper level. In addition, provide the possibility to change the algorithm depending on surface type (initially to speed up meshing of planes). - -@subsubsection occt_modalg_11_3_2 General workflow -@figure{/user_guides/modeling_algos/images/modeling_algos_mesh_001.svg,"General workflow of BRepMesh component",500} - -Generally, the workflow of the component can be divided into six parts: - * **Creation of model data structure**: source *TopoDS_Shape* passed to algorithm is analyzed and exploded into faces and edges. The reflection corresponding to each topological entity is created in the data model. Note that underlying algorithms use the data model as input and access it via a common interface which allows creating a custom data model with necessary dependencies between particular entities (see the paragraph "Data model interface"); - * **Discretize edges 3D & 2D curves**: 3D curve as well as an associated set of 2D curves of each model edge is discretized in order to create a coherent skeleton used as a base in face meshing process. If an edge of the source shape already contains polygonal data which suits the specified parameters, it is extracted from the shape and stored in the model as is. Each edge is processed separately, the adjacency is not taken into account; - * **Heal discrete model**: the source *TopoDS_Shape* can contain problems, such as open wires or self-intersections, introduced during design, exchange or modification of model. In addition, some problems like self-intersections can be introduced by roughly discretized edges. This stage is responsible for analysis of a discrete model in order to detect and repair problems or to refuse further processing of a model part in case if a problem cannot be solved; - * **Preprocess discrete model**: defines actions specific to the implemented approach to be performed before meshing of faces. By default, this operation iterates over model faces, checks the consistency of existing triangulations and cleans topological faces and adjacent edges from polygonal data in case of inconsistency or marks a face of the discrete model as not required for the computation; - * **Discretize faces**: represents the core part performing mesh generation for a particular face based on 2D discrete data. This operation caches polygonal data associated with face edges in the data model for further processing and stores the generated mesh to *TopoDS_Face*; - * **Postprocess discrete model**: defines actions specific for the implemented approach to be performed after meshing of faces. By default, this operation stores polygonal data obtained at the previous stage to *TopoDS_Edge* objects of the source model. - -@subsubsection occt_modalg_11_3_3 Common interfaces -The component structure contains two units: IMeshData (see Data model interface) and IMeshTools, defining common interfaces for the data model and algorithmic tools correspondingly. Class *IMeshTools_Context* represents a connector between these units. The context class caches the data model as well as the tools corresponding to each of six stages of the workflow mentioned above and provides methods to call the corresponding tool safely (designed similarly to *IntTools_Context* in order to keep consistency with OCCT core tools). All stages, except for the first one, use the data model as input and perform a specific action on the entire structure. Thus, API class *IMeshTools_ModelAlgo* is defined in order to unify the interface of tools manipulating the data model. Each tool supposed to process the data model should inherit this interface enabling the possibility to cache it in context. In contrast to others, the model builder interface is defined by another class *IMeshTools_ModelBuilder* due to a different meaning of the stage. The entry point starting the entire workflow is represented by *IMeshTools_MeshBuilder*. - -The default implementation of *IMeshTools_Context* is given in *BRepMesh_Context* class initializing the context by instances of default algorithmic tools. - -The factory interface *IMeshTools_MeshAlgoFactory* gives the possibility to change the triangulation algorithm for a specific surface. The factory returns an instance of the triangulation algorithm via *IMeshTools_MeshAlgo* interface depending on the type of surface passed as parameter. It is supposed to be used at the face discretization stage. - -The default implementation of AlgoFactory is given in *BRepMesh_MeshAlgoFactory* returning algorithms of different complexity chosen according to the passed surface type. In its turn, it is used as the initializer of *BRepMesh_FaceDiscret* algorithm representing the starter of face discretization stage. - -@figure{/user_guides/modeling_algos/images/modeling_algos_mesh_002.svg,"Interface describing entry point to meshing workflow",500} - -Remaining interfaces describe auxiliary tools: - * *IMeshTools_CurveTessellator*: provides a common interface to the algorithms responsible for creation of discrete polygons on 3D and 2D curves as well as tools for extraction of existing polygons from *TopoDS_Edge* allowing to obtain discrete points and the corresponding parameters on curve regardless of the implementation details (see examples of usage of derived classes *BRepMesh_CurveTessellator*, *BRepMesh_EdgeTessellationExtractor* in *BRepMesh_EdgeDiscret*); - * *IMeshTools_ShapeExplorer*: the last two interfaces represent visitor design pattern and are intended to separate iteration over elements of topological shape (edges and faces) from the operations performed on a particular element; - * *IMeshTools_ShapeVisitor*: provides a common interface for operations on edges and faces of the target topological shape. It can be used in couple with *IMeshTools_ShapeExplorer*. The default implementation available in *BRepMesh_ShapeVisitor* performs initialization of the data model. The advantage of such approach is that the implementation of *IMeshTools_ShapeVisitor* can be changed according to the specific data model whereas the shape explorer implementation remains the same. - -@subsubsection occt_modalg_11_3_4 Create model data structure -The data structures intended to keep discrete and temporary data required by underlying algorithms are created at the first stage of the meshing procedure. Generally, the model represents dependencies between entities of the source topological shape suitable for the target task. - -#### Data model interface -Unit IMeshData provides common interfaces specifying the data model API used on different stages of the entire workflow. Dependencies and references of the designed interfaces are given in the figure below. A specific interface implementation depends on the target application which allows the developer to implement different models and use custom low-level data structures, e.g. different collections, either NCollection or STL. *IMeshData_Shape* is used as the base class for all data structures and tools keeping the topological shape in order to avoid possible copy-paste. - -The default implementation of interfaces is given in BRepMeshData unit. The main aim of the default data model is to provide features performing discretization of edges in a parallel mode. Thus, curve, pcurve and other classes are based on STL containers and smart-pointers as far as NCollection does not provide thread-safety for some cases (e.g. *NCollection_Sequence*). In addition, it closely reflects topology of the source shape, i.e. the number of edges in the data model is equal to the number of edges in the source model; each edge contains a set of pcurves associated with its adjacent faces which allows creation of discrete polygons for all pcurves or the 3D curve of a particular edge in a separate thread. - -**Advantages**: -In case of necessity, the data model (probably with algorithms for its processing) can be easily substituted by another implementation supporting another kind of dependencies between elements. - -An additional example of a different data model is the case when it is not required to create a mesh with discrete polygons synchronized between adjacent faces, i.e. in case of necessity to speed up creation of a rough per-face tessellation used for visualization or quick computation only (the approach used in *XDEDRAW_Props*). - -@figure{/user_guides/modeling_algos/images/modeling_algos_mesh_003.svg,"Common API of data model",500} - -#### Collecting data model -At this stage the data model is filled by entities according to the topological structure of the source shape. A default implementation of the data model is given in BRepMeshData unit and represents the model as two sets: a set of edges and a set of faces. Each face consists of one or several wires, the first of which always represents the outer wire, while others are internal. In its turn, each wire depicts the ordered sequence of oriented edges. Each edge is characterized by a single 3D curve and zero (in case of free edge) or more 2D curves associated with faces adjacent to this edge. Both 3D and 2D curves represent a set of pairs point-parameter defined in 3D and 2D space of the reference face correspondingly. An additional difference between a curve and a pcurve is that the latter has a reference to the face it is defined for. - -Model filler algorithm is represented by *BRepMesh_ShapeVisitor* class creating the model as a reflection to topological shape with help of *BRepMesh_ShapeExplorer* performing iteration over edges and faces of the target shape. Note that the algorithm operates on a common interface of the data model and creates a structure without any knowledge about the implementation details and underlying data structures. The entry point to collecting functionality is *BRepMesh_ModelBuilder* class. - -@subsubsection occt_modalg_11_3_5 Discretize edges 3D & 2D curves -At this stage only the edges of the data model are considered. Each edge is processed separately (with the possibility to run processing in multiple threads). The edge is checked for existing polygonal data. In case if at least one representation exists and suits the meshing parameters, it is recuperated and used as reference data for tessellation of the whole set of pcurves as well as 3D curve assigned to the edge (see *BRepMesh_EdgeTessellationExtractor*). Otherwise, a new tessellation algorithm is created and used to generate the initial polygon (see *BRepMesh_CurveTessellator*) and the edge is marked as outdated. In addition, the model edge is updated by deflection as well as recomputed same range, same parameter and degeneracy parameters. See *BRepMesh_EdgeDiscret* for implementation details. - -IMeshData unit defines interface *IMeshData_ParametersListArrayAdaptor*, which is intended to adapt arbitrary data structures to the *NCollection_Array1* container API. This solution is made to use both *NCollection_Array1* and *IMeshData_Curve* as the source for *BRepMesh_EdgeParameterProvider* tool intended to generate a consistent parametrization taking into account the same parameter property. - -@subsubsection occt_modalg_11_3_6 Heal discrete model -In general, this stage represents a set of operations performed on the entire discrete model in order to resolve inconsistencies due to the problems caused by design, translation or rough discretization. A different sequence of operations can be performed depending on the target triangulation algorithm, e.g. there are different approaches to process self-intersections – either to amplify edges discretization by decreasing the target precision or to split links at the intersection points. At this stage the whole set of edges is considered in aggregate and their adjacency is taken into account. A default implementation of the model healer is given in *BRepMesh_ModelHealer* which performs the following actions: - * Iterates over model faces and checks their wires for consistency, i.e. whether the wires are closed and do not contain self-intersections. The data structures are designed free of collisions, thus it is possible to run processing in a parallel mode; - * Forcibly connects the ends of adjacent edges in the parametric space, closing gaps between possible disconnected parts. The aim of this operation is to create a correct discrete model defined relatively to the parametric space of the target face taking into account connectivity and tolerances of 3D space only. This means that no specific computations are made to determine U and V tolerance; - * Registers intersections on edges forming the face shape. Two solutions are possible in order to resolve self-intersection: - * Decrease deflection of a particular edge and update its discrete model. After that the workflow "intersection check – amplification" is repeated up to 5 times. As the result, target edges contain a finer tessellation and meshing continues or the face is marked by *IMeshData_SelfIntersectingWire* status and refused from further processing; - * Split target edges by intersection point and synchronize the updated polygon with curve and remaining pcurves associated to each edge. This operation presents a more robust solution comparing to the amplification procedure with a guaranteed result, but it is more difficult for implementation from the point of view of synchronization functionality. - -@subsubsection occt_modalg_11_3_7 Preprocess discrete model -This stage implements actions to be performed before meshing of faces. Depending on target goals it can be changed or omitted. By default, *BRepMesh_ModelPreProcessor* implements the functionality checking topological faces for consistency of existing triangulation, i.e.: consistency with the target deflection parameter; indices of nodes referenced by triangles do not exceed the number of nodes stored in a triangulation. If the face fails some checks, it is cleaned from triangulation and its adjacent edges are cleaned from existing polygons. This does not affect a discrete model and does not require any recomputation as the model keeps tessellations for the whole set of edges despite consistency of their polygons. - -@subsubsection occt_modalg_11_3_8 Discretize faces -Discretization of faces is the general part of meshing algorithm. At this stage edges tessellation data obtained and processed on previous steps is used to form contours of target faces and passed as input to the triangulation algorithm. Default implementation is provided by *BRepMesh_FaceDiscret* class which represents a starter for triangulation algorithm. It iterates over faces available in the data model, creates an instance of the triangulation algorithm according to the type of surface associated with each face via *IMeshTools_MeshAlgoFactory* and executes it. Each face is processed separately, thus it is possible to process faces in a parallel mode. The class diagram of face discretization is given in the figure below. - -@figure{/user_guides/modeling_algos/images/modeling_algos_mesh_004.svg,"Class diagram of face discrete stage",300} - -In general, face meshing algorithms have the following structure: - * *BRepMesh_BaseMeshAlgo* implements *IMeshTools_MeshAlgo* interface and the base functionality for inherited algorithms. The main goal of this class is to initialize an instance of *BRepMesh_DataStructureOfDelaun* as well as auxiliary data structures suitable for nested algorithms using face model data passed as input parameter. Despite implementation of triangulation algorithm this structure is currently supposed as common for OCCT. However, the user is free to implement a custom algorithm and supporting data structure accessible via *IMeshTools_MeshAlgo* interface, e.g. to connect a 3-rd party meshing tool that does not support *TopoDS_Shape* out of box. For this, such structure provides the possibility to distribute connectors to various algorithms in the form of plugins; - * *BRepMesh_DelaunayBaseMeshAlgo* and *BRepMesh_SweepLineMeshAlgo* classes implement core meshing functionality operating directly on an instance of *BRepMesh_DataStructureOfDelaun*. The algorithms represent mesh generation tools adding new points from the data structure to the final mesh; - * *BRepMesh_NodeInsertionMeshAlgo* class represents a wrapper intended to extend the algorithm inherited from *BRepMesh_BaseMeshAlgo* to enable the functionality generating surface nodes and inserting them into the structure. On this level, an instance of the classification tool is created and can be used to accept-reject internal nodes. In addition, computations necessary for scaling UV coordinates of points relatively to the range specified for the corresponding direction are performed. As far as both triangulation algorithms work on static data provided by the structure, new nodes are added at the initialization stage. Surface nodes are generated by an auxiliary tool called range splitter and passed as template parameter (see Range splitter); - * Classes *BRepMesh_DelaunayNodeInsertionMeshAlgo* and *BRepMesh_SweepLineNodeInsertionMeshAlgo* implement algorithm-specific functionality related to addition of internal nodes supplementing functionality provided by *BRepMesh_NodeInsertionMeshAlgo*; - * *BRepMesh_DelaunayDeflectionControlMeshAlgo* extends functionality of *BRepMesh_DelaunayNodeInsertionMeshAlgo* by additional procedure controlling deflection of generated triangles. - -#### Range splitter -Range splitter tools provide functionality to generate internal surface nodes defined within the range computed using discrete model data. The base functionality is provided by *BRepMesh_DefaultRangeSplitter* which can be used without modifications in case of planar surface. The default splitter does not generate any internal node. +@subsubsection occt_modalg_9_2_4 Split Shape -*BRepMesh_ConeRangeSplitter*, *BRepMesh_CylinderRangeSplitter* and *BRepMesh_SphereRangeSplitter* are specializations of the default splitter intended for quick generation of internal nodes for the corresponding type of analytical surface. +The class *BRepFeat_SplitShape* is used to split faces of a shape into wires or edges. The shape containing the new entities is rebuilt, sharing the unmodified ones. -*BRepMesh_UVParamRangeSplitter* implements base functionality taking discretization points of face border into account for node generation. Its successors BRepMesh_TorusRangeSplitter and *BRepMesh_NURBSRangeSplitter* extend the base functionality for toroidal and NURBS surfaces correspondingly. +The class is created or initialized from a shape (the basic shape). +Three Add methods are available: +* *Add(Wire, Face)* -- adds a new wire on a face of the basic shape. +* *Add(Edge, Face)* -- adds a new edge on a face of the basic shape. +* *Add(EdgeNew, EdgeOld)* -- adds a new edge on an existing one (the old edge must contain the new edge). -@subsubsection occt_modalg_11_3_9 Postprocess discrete model -This stage implements actions to be performed after meshing of faces. Depending on target goals it can be changed or omitted. By default, *BRepMesh_ModelPostProcessor* commits polygonal data stored in the data model to *TopoDS_Edge*. +**Note** The added wires and edges must define closed wires on faces or wires located between two existing edges. Existing edges must not be intersected. +~~~~~ +TopoDS_Shape Sbase = ...; // basic shape +TopoDS_Face Fsplit = ...; // face of Sbase +TopoDS_Wire Wsplit = ...; // new wire contained in Fsplit +BRepFeat_SplitShape Spls(Sbase); +Spls.Add(Wsplit, Fsplit); +TopoDS_Shape theResult = Spls; +... +~~~~~ -@section occt_modalg_defeaturing 3D Model Defeaturing +@subsection occt_modalg_defeaturing 3D Model Defeaturing The Open CASCADE Technology Defeaturing algorithm is intended for removal of the unwanted parts or features from the model. These parts can be holes, protrusions, gaps, chamfers, fillets, etc. @@ -3304,7 +2963,7 @@ * *BOPAlgo_AlertUnableToRemoveTheFeature* - the warning alert is given to inform the user the removal of the feature is not possible. The algorithm will still try to remove the other features; * *BOPAlgo_AlertRemoveFeaturesFailed* - the error alert is given in case if the operation was aborted by the unknown reason. -For more information on the error/warning reporting system, see the chapter @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide. +For more information on the error/warning reporting system, see the chapter @ref specification__boolean_ers "Errors and warnings reporting system" of Boolean operations user guide. Parallel processing mode - allows running the algorithm in parallel mode obtaining the result faster. @@ -3319,14 +2978,11 @@ Removal of all three faces of the gap is not going to work, because there will be no face to fill the transverse part of the step. Although, removal of only two faces, keeping one of the transverse faces, will fill the gap with the kept face: - - - - - -
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im002.png,"Keeping the right transverse face",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im003.png,"Keeping the left transverse face",220}
-@subsection occt_modalg_defeaturing_usage Usage +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im002.png,"Keeping the right transverse face",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im003.png,"Keeping the left transverse face",220} + +@subsubsection occt_modalg_defeaturing_usage Usage Here is the example of usage of the *BRepAlgoAPI_Defeaturing* algorithm on the C++ level: ~~~~ @@ -3375,72 +3031,55 @@ For more details on commands above, refer to the @ref occt_draw_defeaturing "Defeaturing commands" of the Draw test harness user guide. -@subsection occt_modalg_defeaturing_examples Examples +@subsubsection occt_modalg_defeaturing_examples Examples Here are the examples of defeaturing of the ANC101 model: @figure{/user_guides/modeling_algos/images/modeling_algos_rf_im004.png,"ANC101 model",220} - - - - - - - - - - - - - - - - - - - - - - - - - -
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im005.png,"Removing the cylindrical protrusion",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im006.png,"Result",220}
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im007.png,"Removing the cylindrical holes",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im008.png,"Result",220}
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im009.png,"Removing the cylindrical holes",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im010.png,"Result",220}
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im011.png,"Removing the small gaps in the front",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im012.png,"Result",220}
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im013.png,"Removing the gaps in the front completely",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im014.png,"Result",220}
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im015.png,"Removing the cylindrical protrusion",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im016.png,"Result",220}
+ +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im005.png,"Removing the cylindrical protrusion",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im006.png,"Result",220} + +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im007.png,"Removing the cylindrical holes",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im008.png,"Result",220} + +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im009.png,"Removing the cylindrical holes",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im010.png,"Result",220} + +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im011.png,"Removing the small gaps in the front",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im012.png,"Result",220} + +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im013.png,"Removing the gaps in the front completely",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im014.png,"Result",220} + +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im015.png,"Removing the cylindrical protrusion",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im016.png,"Result",220} Here are the few examples of defeaturing of the model containing boxes with blends: -@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im017.png,"Box blend model",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im017.png,"Box blend model",220} + +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im018.png,"Removing the blend",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im019.png,"Result",220} + +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im020.png,"Removing the blend",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im021.png,"Result",220} + +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im022.png,"Removing the blend",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im023.png,"Result",220} + +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im024.png,"Removing the blend",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im025.png,"Result",220} + +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im026.png,"Removing the blend",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im027.png,"Result",220} - - - - - - - - - - - - - - - - - - - - - - - - - -
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im018.png,"Removing the blend",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im019.png,"Result",220}
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im020.png,"Removing the blend",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im021.png,"Result",220}
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im022.png,"Removing the blend",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im023.png,"Result",220}
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im024.png,"Removing the blend",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im025.png,"Result",220}
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im026.png,"Removing the blend",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im027.png,"Result",220}
@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im028.png,"Removing the blend",220}@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im029.png,"Result",220}
+@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im028.png,"Removing the blend",220} +@figure{/user_guides/modeling_algos/images/modeling_algos_rf_im029.png,"Result",220} -@section occt_modalg_makeperiodic 3D Model Periodicity +@subsection occt_modalg_makeperiodic 3D Model Periodicity Open CASCADE Technology provides tools for making an arbitrary 3D model (or just shape) periodic in 3D space in the specified directions. @@ -3474,7 +3113,7 @@ E.g. let's make the L-shape periodic only in X direction with the period 2 starting at X parameter 4: @figure{/user_guides/modeling_algos/images/modeling_algos_mkperiodic_im005.png,"Periodic trimmed shape",220} -@subsection occt_modalg_makeperiodic_how_it_works How the shape is made periodic +@subsubsection occt_modalg_makeperiodic_how_it_works How the shape is made periodic For making the shape periodic in certain direction the algorithm performs the following steps: * Creates the copy of the shape and moves it on the period into negative side of the requested direction; @@ -3486,12 +3125,12 @@ Thus, in the periodic shape the geometry from positive side of the shape is always copied on the negative side of periodic directions. -@subsection occt_modalg_makeperiodic_association Opposite shapes association +@subsubsection occt_modalg_makeperiodic_association Opposite shapes association The algorithm also associates the identical (or twin) shapes located on the opposite sides of the periodic shape. By the construction, the twin shapes should always have the same geometry and distanced from each other on the period. It is possible that the shape does not have any twins. It means that when repeating this shape will not touch the opposite side of the shape. In the example when the periods of the shape are grater than its extensions, non of the sub-shapes has a twin. -@subsection occt_modalg_makeperiodic_repetition Periodic shape repetition +@subsubsection occt_modalg_makeperiodic_repetition Periodic shape repetition The algorithm also provides the methods to repeat the periodic shape in periodic directions. To repeat shape the algorithm makes the requested number of copies of the shape and translates them one by one on the time * period value. After all copies are made and translated they are glued to have valid shape. @@ -3500,7 +3139,7 @@ The repetitions can be cleared and started over. -@subsection occt_modalg_makeperiodic_history History support +@subsubsection occt_modalg_makeperiodic_history History support The algorithm supports the history of shapes modifications, thus it is possible to track how the shapes have been changed to make it periodic and what new shapes have been created during repetitions. Both split history and history of periodic shape repetition are available here. Note, that all repeated shapes are stored as generated into the history. @@ -3508,7 +3147,7 @@ *BRepTools_History* is used for history support. -@subsection occt_modalg_makeperiodic_errors Errors/Warnings +@subsubsection occt_modalg_makeperiodic_errors Errors/Warnings The algorithm supports the Error/Warning reporting system which allows obtaining the extended overview of the errors and warning occurred during the operation. As soon as any error appears the algorithm stops working. The warnings allow continuing the job, informing the user that something went wrong. @@ -3518,9 +3157,9 @@ * *BOPAlgo_AlertUnableToMakeIdentical* - Error alert is given if splitting of the shape by its moved copies has failed; * *BOPAlgo_AlertUnableToRepeat* - Warning alert is given if the gluing of the repeated shapes has failed. -For more information on the error/warning reporting system please see the chapter @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide. +For more information on the error/warning reporting system please see the chapter @ref specification__boolean_ers "Errors and warnings reporting system" of Boolean operations user guide. -@subsection occt_modalg_makeperiodic_usage Usage +@subsubsection occt_modalg_makeperiodic_usage Usage The algorithm is implemented in the class *BOPAlgo_MakePeriodic*. Here is the example of its usage on the API level: @@ -3582,9 +3221,9 @@ To track the history of a shape modification during MakePeriodic operation the @ref occt_draw_hist "standard history commands" can be used. -To have possibility to access the error/warning shapes of the operation use the *bdrawwarnshapes* command before running the algorithm (see command usage in the @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide). +To have possibility to access the error/warning shapes of the operation use the *bdrawwarnshapes* command before running the algorithm (see command usage in the @ref specification__boolean_ers "Errors and warnings reporting system" of Boolean operations user guide). -@subsection occt_modalg_makeperiodic_examples Examples +@subsubsection occt_modalg_makeperiodic_examples Examples Imagine that you need to make the drills in the plate on the same distance from each other. To model this process it is necessary to make a lot of cylinders (simulating the drills) and cut these cylinders from the plate. With the periodicity tool, the process looks very simple: @@ -3605,10 +3244,162 @@ @figure{/user_guides/modeling_algos/images/modeling_algos_mkperiodic_im006.png,"Plate with drills",220} +@section occt_modalg_10 Hidden Line Removal + +To provide the precision required in industrial design, drawings need to offer the possibility of removing lines, which are hidden in a given projection. + +For this the Hidden Line Removal component provides two algorithms: *HLRBRep_Algo* and *HLRBRep_PolyAlgo*. + +These algorithms are based on the principle of comparing each edge of the shape to be visualized with each of its faces, and calculating the visible and the hidden parts of each edge. Note that these are not the algorithms used in generating shading, which calculate the visible and hidden parts of each face in a shape to be visualized by comparing each face in the shape with every other face in the same shape. +These algorithms operate on a shape and remove or indicate edges hidden by faces. For a given projection, they calculate a set of lines characteristic of the object being represented. They are also used in conjunction with extraction utilities, which reconstruct a new, simplified shape from a selection of the results of the calculation. This new shape is made up of edges, which represent the shape visualized in the projection. + +*HLRBRep_Algo* allows working with the shape itself, whereas *HLRBRep_PolyAlgo* works with a polyhedral simplification of the shape. When you use *HLRBRep_Algo*, you obtain an exact result, whereas, when you use *HLRBRep_PolyAlgo*, you reduce the computation time, but obtain polygonal segments. + +No smoothing algorithm is provided. Consequently, a polyhedron will be treated as such and the algorithms will give the results in form of line segments conforming to the mathematical definition of the polyhedron. This is always the case with *HLRBRep_PolyAlgo*. + +*HLRBRep_Algo* and *HLRBRep_PolyAlgo* can deal with any kind of object, for example, assemblies of volumes, surfaces, and lines, as long as there are no unfinished objects or points within it. + +However, there some restrictions in HLR use: + * Points are not processed; + * Infinite faces or lines are not processed. + + +@figure{/user_guides/modeling_algos/images/modeling_algos_image052.png,"Sharp, smooth and sewn edges in a simple screw shape",320} + +@figure{/user_guides/modeling_algos/images/modeling_algos_image053.png,"Outline edges and isoparameters in the same shape",320} + +@figure{/user_guides/modeling_algos/images/modeling_algos_image054.png,"A simple screw shape seen with shading",320} + +@figure{/user_guides/modeling_algos/images/modeling_algos_image055.png,"An extraction showing hidden sharp edges",320} + + +The following services are related to Hidden Lines Removal : + +### Loading Shapes + +To pass a *TopoDS_Shape* to an *HLRBRep_Algo* object, use *HLRBRep_Algo::Add*. With an *HLRBRep_PolyAlgo* object, use *HLRBRep_PolyAlgo::Load*. If you wish to add several shapes, use Add or Load as often as necessary. + +### Setting view parameters + +*HLRBRep_Algo::Projector* and *HLRBRep_PolyAlgo::Projector* set a projector object which defines the parameters of the view. This object is an *HLRAlgo_Projector*. + +### Computing the projections + +*HLRBRep_PolyAlgo::Update* launches the calculation of outlines of the shape visualized by the *HLRBRep_PolyAlgo* framework. + +In the case of *HLRBRep_Algo*, use *HLRBRep_Algo::Update*. With this algorithm, you must also call the method *HLRBRep_Algo::Hide* to calculate visible and hidden lines of the shape to be visualized. With an *HLRBRep_PolyAlgo* object, visible and hidden lines are computed by *HLRBRep_PolyHLRToShape*. + +### Extracting edges + +The classes *HLRBRep_HLRToShape* and *HLRBRep_PolyHLRToShape* present a range of extraction filters for an *HLRBRep_Algo object* and an *HLRBRep_PolyAlgo* object, respectively. They highlight the type of edge from the results calculated by the algorithm on a shape. With both extraction classes, you can highlight the following types of output: + * visible/hidden sharp edges; + * visible/hidden smooth edges; + * visible/hidden sewn edges; + * visible/hidden outline edges. + +To perform extraction on an *HLRBRep_PolyHLRToShape* object, use *HLRBRep_PolyHLRToShape::Update* function. + +For an *HLRBRep_HLRToShape* object built from an *HLRBRepAlgo* object you can also highlight: + * visible isoparameters and + * hidden isoparameters. + +@subsection occt_modalg_10_1 Examples + +### HLRBRep_Algo + +~~~~~ +// Build The algorithm object +myAlgo = new HLRBRep_Algo(); + +// Add Shapes into the algorithm +TopTools_ListIteratorOfListOfShape anIterator(myListOfShape); +for (;anIterator.More();anIterator.Next()) +myAlgo-Add(anIterator.Value(),myNbIsos); + +// Set The Projector (myProjector is a +HLRAlgo_Projector) +myAlgo-Projector(myProjector); + +// Build HLR +myAlgo->Update(); + +// Set The Edge Status +myAlgo->Hide(); + +// Build the extraction object : +HLRBRep_HLRToShape aHLRToShape(myAlgo); + +// extract the results : +TopoDS_Shape VCompound = aHLRToShape.VCompound(); +TopoDS_Shape Rg1LineVCompound = +aHLRToShape.Rg1LineVCompound(); +TopoDS_Shape RgNLineVCompound = +aHLRToShape.RgNLineVCompound(); +TopoDS_Shape OutLineVCompound = +aHLRToShape.OutLineVCompound(); +TopoDS_Shape IsoLineVCompound = +aHLRToShape.IsoLineVCompound(); +TopoDS_Shape HCompound = aHLRToShape.HCompound(); +TopoDS_Shape Rg1LineHCompound = +aHLRToShape.Rg1LineHCompound(); +TopoDS_Shape RgNLineHCompound = +aHLRToShape.RgNLineHCompound(); +TopoDS_Shape OutLineHCompound = +aHLRToShape.OutLineHCompound(); +TopoDS_Shape IsoLineHCompound = +aHLRToShape.IsoLineHCompound(); +~~~~~ + +### HLRBRep_PolyAlgo + + +~~~~~ + +// Build The algorithm object +myPolyAlgo = new HLRBRep_PolyAlgo(); + +// Add Shapes into the algorithm +TopTools_ListIteratorOfListOfShape +anIterator(myListOfShape); +for (;anIterator.More();anIterator.Next()) +myPolyAlgo-Load(anIterator.Value()); + +// Set The Projector (myProjector is a +HLRAlgo_Projector) +myPolyAlgo->Projector(myProjector); + +// Build HLR +myPolyAlgo->Update(); + +// Build the extraction object : +HLRBRep_PolyHLRToShape aPolyHLRToShape; +aPolyHLRToShape.Update(myPolyAlgo); + +// extract the results : +TopoDS_Shape VCompound = +aPolyHLRToShape.VCompound(); +TopoDS_Shape Rg1LineVCompound = +aPolyHLRToShape.Rg1LineVCompound(); +TopoDS_Shape RgNLineVCompound = +aPolyHLRToShape.RgNLineVCompound(); +TopoDS_Shape OutLineVCompound = +aPolyHLRToShape.OutLineVCompound(); +TopoDS_Shape HCompound = +aPolyHLRToShape.HCompound(); +TopoDS_Shape Rg1LineHCompound = +aPolyHLRToShape.Rg1LineHCompound(); +TopoDS_Shape RgNLineHCompound = +aPolyHLRToShape.RgNLineHCompound(); +TopoDS_Shape OutLineHCompound = +aPolyHLRToShape.OutLineHCompound(); +~~~~~ + + + @section occt_modalg_makeconnected Making touching shapes connected Open CASCADE Technology provides tools for making the same-dimensional touching shapes connected (or glued), i.e. for making the coinciding geometries topologically shared among shapes. -To make the shapes connected they are glued by the means of @ref occt_algorithms_7 "General Fuse algorithm". The option BOPAlgo_GlueShift is used, thus if the input shapes have been interfering the algorithm will be unable to recognize this. +To make the shapes connected they are glued by the means of @ref specification__boolean_7 "General Fuse algorithm". The option BOPAlgo_GlueShift is used, thus if the input shapes have been interfering the algorithm will be unable to recognize this. Making the group of shapes connected can be useful e.g. before meshing the group. It will allow making the resulting mesh conformal. @@ -3666,7 +3457,7 @@ * *BOPAlgo_AlertUnableToMakePeriodic* - warning alert is given if the periodicity maker is unable to make the connected shape periodic with given options; * *BOPAlgo_AlertShapeIsNotPeriodic* - warning alert is given on the attempt to repeat the shape before making it periodic. -For more information on the error/warning reporting system please see the chapter @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide. +For more information on the error/warning reporting system please see the chapter @ref specification__boolean_ers "Errors and warnings reporting system" of Boolean operations user guide. @subsection occt_modalg_makeconnected_usage Usage @@ -3746,4 +3537,4 @@ To track the history of a shape modification during MakeConnected operation the @ref occt_draw_hist "standard history commands" can be used. -To have possibility to access the error/warning shapes of the operation use the *bdrawwarnshapes* command before running the algorithm (see command usage in the @ref occt_algorithms_ers "Errors and warnings reporting system" of Boolean operations user guide). +To have possibility to access the error/warning shapes of the operation use the *bdrawwarnshapes* command before running the algorithm (see command usage in the @ref specification__boolean_ers "Errors and warnings reporting system" of Boolean operations user guide). Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_data/images/modeling_data_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_data/images/modeling_data_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_data/images/modeling_data_image014.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_data/images/modeling_data_image014.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/modeling_data/images/modeling_data_image015.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/modeling_data/images/modeling_data_image015.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/modeling_data/modeling_data.md opencascade-7.5.1+dfsg1/dox/user_guides/modeling_data/modeling_data.md --- opencascade-7.4.1+dfsg1/dox/user_guides/modeling_data/modeling_data.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/modeling_data/modeling_data.md 2021-02-02 08:51:56.000000000 +0000 @@ -7,7 +7,7 @@ Modeling Data supplies data structures to represent 2D and 3D geometric models. -This manual explains how to use Modeling Data. For advanced information on modeling data, see our E-learning & Training offerings. +This manual explains how to use Modeling Data. @section occt_modat_1 Geometry Utilities @@ -548,181 +548,6 @@ You can refer to the GC package to find more evolved construction algorithms for Geom objects. -@section occt_modat_4 Properties of Shapes - -@subsection occt_modat_4_1 Local Properties of Shapes - -BRepLProp package provides the Local Properties of Shapes component, -which contains algorithms computing various local properties on edges and faces in a BRep model. - -The local properties which may be queried are: - - * for a point of parameter u on a curve which supports an edge : - * the point, - * the derivative vectors, up to the third degree, - * the tangent vector, - * the normal, - * the curvature, and the center of curvature; - * for a point of parameter (u, v) on a surface which supports a face : - * the point, - * the derivative vectors, up to the second degree, - * the tangent vectors to the u and v isoparametric curves, - * the normal vector, - * the minimum or maximum curvature, and the corresponding directions of curvature; - * the degree of continuity of a curve which supports an edge, built by the concatenation of two other edges, at their junction point. - -Analyzed edges and faces are described as BRepAdaptor curves and surfaces, -which provide shapes with an interface for the description of their geometric support. -The base point for local properties is defined by its u parameter value on a curve, or its (u, v) parameter values on a surface. - -@subsection occt_modat_4_2 Local Properties of Curves and Surfaces - -The "Local Properties of Curves and Surfaces" component provides algorithms for computing various local properties on a Geom curve (in 2D or 3D space) or a surface. It is composed of: - - * Geom2dLProp package, which allows computing Derivative and Tangent vectors (normal and curvature) of a parametric point on a 2D curve; - * GeomLProp package, which provides local properties on 3D curves and surfaces - * LProp package, which provides an enumeration used to characterize a particular point on a 2D curve. - -Curves are either Geom_Curve curves (in 3D space) or Geom2d_Curve curves (in the plane). -Surfaces are Geom_Surface surfaces. The point on which local properties are calculated -is defined by its u parameter value on a curve, and its (u,v) parameter values on a surface. - -It is possible to query the same local properties for points as mentioned above, and additionally for 2D curves: - - * the points corresponding to a minimum or a maximum of curvature; - * the inflection points. - - -#### Example: How to check the surface concavity - -To check the concavity of a surface, proceed as follows: - - 1. Sample the surface and compute at each point the Gaussian curvature. - 2. If the value of the curvature changes of sign, the surface is concave or convex depending on the point of view. - 3. To compute a Gaussian curvature, use the class SLprops from GeomLProp, which instantiates the generic class SLProps from LProp and use the method GaussianCurvature. - -@subsection occt_modat_4_2a Continuity of Curves and Surfaces - -Types of supported continuities for curves and surfaces are described in *GeomAbs_Shape* enumeration. - -In respect of curves, the following types of continuity are supported (see the figure below): - * C0 (*GeomAbs_C0*) - parametric continuity. It is the same as G0 (geometric continuity), so the last one is not represented by separate variable. - * G1 (*GeomAbs_G1*) - tangent vectors on left and on right are parallel. - * C1 (*GeomAbs_C1*) - indicates the continuity of the first derivative. - * G2 (*GeomAbs_G2*) - in addition to G1 continuity, the centers of curvature on left and on right are the same. - * C2 (*GeomAbs_C2*) - continuity of all derivatives till the second order. - * C3 (*GeomAbs_C3*) - continuity of all derivatives till the third order. - * CN (*GeomAbs_CN*) - continuity of all derivatives till the N-th order (infinite order of continuity). - -*Note:* Geometric continuity (G1, G2) means that the curve can be reparametrized to have parametric (C1, C2) continuity. - -@figure{/user_guides/modeling_data/images/modeling_data_continuity_curves.svg,"Continuity of Curves",420} - -The following types of surface continuity are supported: - * C0 (*GeomAbs_C0*) - parametric continuity (the surface has no points or curves of discontinuity). - * G1 (*GeomAbs_G1*) - surface has single tangent plane in each point. - * C1 (*GeomAbs_C1*) - indicates the continuity of the first derivatives. - * G2 (*GeomAbs_G2*) - in addition to G1 continuity, principal curvatures and directions are continuous. - * C2 (*GeomAbs_C2*) - continuity of all derivatives till the second order. - * C3 (*GeomAbs_C3*) - continuity of all derivatives till the third order. - * CN (*GeomAbs_CN*) - continuity of all derivatives till the N-th order (infinite order of continuity). - -@figure{/user_guides/modeling_data/images/modeling_data_continuity_surfaces.svg,"Continuity of Surfaces",420} - -Against single surface, the connection of two surfaces (see the figure above) defines its continuity in each intersection point only. Smoothness of connection is a minimal value of continuities on the intersection curve. - - -@subsection occt_modat_4_2b Regularity of Shared Edges - -Regularity of an edge is a smoothness of connection of two faces sharing this edge. In other words, regularity is a minimal continuity between connected faces in each point on edge. - -Edge's regularity can be set by *BRep_Builder::Continuity* method. To get the regularity use *BRep_Tool::Continuity* method. - -Some algorithms like @ref occt_modalg_6 "Fillet" set regularity of produced edges by their own algorithms. On the other hand, some other algorithms (like @ref occt_user_guides__boolean_operations "Boolean Operations", @ref occt_user_guides__shape_healing "Shape Healing", etc.) do not set regularity. If the regularity is needed to be set correctly on a shape, the method *BRepLib::EncodeRegularity* can be used. It calculates and sets correct values for all edges of the shape. - -The regularity flag is extensively used by the following high level algorithms: @ref occt_modalg_6_1_2 "Chamfer", @ref occt_modalg_7_3 "Draft Angle", @ref occt_modalg_10 "Hidden Line Removal", @ref occt_modalg_9_2_3 "Gluer". - - -@subsection occt_modat_4_3 Global Properties of Shapes - -The Global Properties of Shapes component provides algorithms for computing the global -properties of a composite geometric system in 3D space, and frameworks to query the computed results. - -The global properties computed for a system are : - * mass, - * mass center, - * matrix of inertia, - * moment about an axis, - * radius of gyration about an axis, - * principal properties of inertia such as principal axis, principal moments, and principal radius of gyration. - -Geometric systems are generally defined as shapes. Depending on the way they are analyzed, these shapes will give properties of: - - * lines induced from the edges of the shape, - * surfaces induced from the faces of the shape, or - * volumes induced from the solid bounded by the shape. - -The global properties of several systems may be brought together to give the global properties of the system composed of the sum of all individual systems. - -The Global Properties of Shapes component is composed of: -* seven functions for computing global properties of a shape: one function for lines, two functions for surfaces and four functions for volumes. The choice of functions depends on input parameters and algorithms used for computation (BRepGProp global functions), -* a framework for computing global properties for a set of points (GProp_PGProps), -* a general framework to bring together the global properties retained by several more elementary frameworks, and provide a general programming interface to consult computed global properties. - -Packages *GeomLProp* and *Geom2dLProp* provide algorithms calculating the local properties of curves and surfaces - -A curve (for one parameter) has the following local properties: -- Point -- Derivative -- Tangent -- Normal -- Curvature -- Center of curvature. - -A surface (for two parameters U and V) has the following local properties: -- point -- derivative for U and V) -- tangent line (for U and V) -- normal -- max curvature -- min curvature -- main directions of curvature -- mean curvature -- Gaussian curvature - -The following methods are available: -* *CLProps* -- calculates the local properties of a curve (tangency, curvature,normal); -* *CurAndInf2d* -- calculates the maximum and minimum curvatures and the inflection points of 2d curves; -* *SLProps* -- calculates the local properties of a surface (tangency, the normal and curvature). -* *Continuity* -- calculates regularity at the junction of two curves. - -Note that the B-spline curve and surface are accepted but they are not cut into pieces of the desired continuity. It is the global continuity, which is seen. - -@subsection occt_modat_4_4 Adaptors for Curves and Surfaces - -Some Open CASCADE Technology general algorithms may work theoretically on numerous types of curves or surfaces. - -To do this, they simply get the services required of the analyzed curve or surface through an interface so as to a single API, whatever the type of curve or surface. These interfaces are called adaptors. - -For example, Adaptor3d_Curve is the abstract class which provides the required services by an algorithm which uses any 3d curve. - - GeomAdaptor package provides interfaces: - * On a Geom curve; - * On a curve lying on a Geom surface; - * On a Geom surface; - - Geom2dAdaptor package provides interfaces : - * On a Geom2d curve. - - BRepAdaptor package provides interfaces: - * On a Face - * On an Edge - -When you write an algorithm which operates on geometric objects, use Adaptor3d (or Adaptor2d) objects. - -As a result, you can use the algorithm with any kind of object, if you provide for this object an interface derived from *Adaptor3d* or *Adaptor2d*. -These interfaces are easy to use: simply create an adapted curve or surface from a *Geom2d* curve, and then use this adapted curve as an argument for the algorithm? which requires it. - @section occt_modat_5 Topology @@ -763,39 +588,9 @@ * TopTools package provides basic tools to use on topological data structures. * TopExp package provides classes to explore and manipulate the topological data structures described in the TopoDS package. * BRepTools package provides classes to explore, manipulate, read and write BRep data structures. These more complex data structures combine topological descriptions with additional geometric information, and include rules for evaluating equivalence of different possible representations of the same object, for example, a point. + -@subsection occt_modat_5_1 Shape Location - -A local coordinate system can be viewed as either of the following: -- A right-handed trihedron with an origin and three orthonormal vectors. The *gp_Ax2* package corresponds to this definition. -- A transformation of a +1 determinant, allowing the transformation of coordinates between local and global references frames. This corresponds to the *gp_Trsf*. - -*TopLoc* package distinguishes two notions: -- *TopLoc_Datum3D* class provides the elementary reference coordinate, represented by a right-handed orthonormal system of axes or by a right-handed unitary transformation. -- *TopLoc_Location* class provides the composite reference coordinate made from elementary ones. It is a marker composed of a chain of references to elementary markers. The resulting cumulative transformation is stored in order to avoid recalculating the sum of the transformations for the whole list. - -@figure{/user_guides/modeling_data/images/modeling_data_image005.png,"Structure of TopLoc_Location",420} - -Two reference coordinates are equal if they are made up of the same elementary coordinates in the same order. There is no numerical comparison. Two coordinates can thus correspond to the same transformation without being equal if they were not built from the same elementary coordinates. - -For example, consider three elementary coordinates: -R1, R2, R3 -The composite coordinates are: -C1 = R1 * R2, -C2 = R2 * R3 -C3 = C1 * R3 -C4 = R1 * C2 - -**NOTE** C3 and C4 are equal because they are both R1 * R2 * R3. - -The *TopLoc* package is chiefly targeted at the topological data structure, but it can be used for other purposes. - -Change of coordinates ---------------------- - -*TopLoc_Datum3D* class represents a change of elementary coordinates. Such changes must be shared so this class inherits from *Standard_Transient*. The coordinate is represented by a transformation *gp_Trsfpackage*. This transformation has no scaling factor. - -@subsection occt_modat_5_2 Naming shapes, sub-shapes, their orientation and state +@subsection occt_modat_5_2 Shape content The **TopAbs** package provides general enumerations describing the basic concepts of topology and methods to handle these enumerations. It contains no classes. This package has been separated from the rest of the topology because the notions it contains are sufficiently general to be used by all topological tools. This avoids redefinition of enumerations by remaining independent of modeling resources. The TopAbs package defines three notions: - **Type** *TopAbs_ShapeEnum*; @@ -879,6 +674,37 @@ @figure{/user_guides/modeling_data/images/modeling_data_image010.png,"State specifies the parts of an edge intersecting a face",420} +@subsubsection occt_modat_5_1 Shape Location + +A local coordinate system can be viewed as either of the following: +- A right-handed trihedron with an origin and three orthonormal vectors. The *gp_Ax2* package corresponds to this definition. +- A transformation of a +1 determinant, allowing the transformation of coordinates between local and global references frames. This corresponds to the *gp_Trsf*. + +*TopLoc* package distinguishes two notions: +- *TopLoc_Datum3D* class provides the elementary reference coordinate, represented by a right-handed orthonormal system of axes or by a right-handed unitary transformation. +- *TopLoc_Location* class provides the composite reference coordinate made from elementary ones. It is a marker composed of a chain of references to elementary markers. The resulting cumulative transformation is stored in order to avoid recalculating the sum of the transformations for the whole list. + +@figure{/user_guides/modeling_data/images/modeling_data_image005.png,"Structure of TopLoc_Location",420} + +Two reference coordinates are equal if they are made up of the same elementary coordinates in the same order. There is no numerical comparison. Two coordinates can thus correspond to the same transformation without being equal if they were not built from the same elementary coordinates. + +For example, consider three elementary coordinates: +R1, R2, R3 +The composite coordinates are: +C1 = R1 * R2, +C2 = R2 * R3 +C3 = C1 * R3 +C4 = R1 * C2 + +**NOTE** C3 and C4 are equal because they are both R1 * R2 * R3. + +The *TopLoc* package is chiefly targeted at the topological data structure, but it can be used for other purposes. + +Change of coordinates +--------------------- + +*TopLoc_Datum3D* class represents a change of elementary coordinates. Such changes must be shared so this class inherits from *Standard_Transient*. The coordinate is represented by a transformation *gp_Trsfpackage*. This transformation has no scaling factor. + @subsection occt_modat_5_3 Manipulating shapes and sub-shapes The *TopoDS* package describes the topological data structure with the following characteristics: @@ -1106,7 +932,7 @@ } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -@subsection occt_modat_5_5 Lists and Maps of Shapes +@subsubsection occt_modat_5_5 Lists and Maps of Shapes **TopTools** package contains tools for exploiting the *TopoDS* data structure. It is an instantiation of the tools from *TCollection* package with the Shape classes of *TopoDS*. @@ -1257,7 +1083,7 @@ } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -@subsubsection occt_modat_5_5_1 Wire Explorer +**Wire Explorer** *BRepTools_WireExplorer* class can access edges of a wire in their order of connection. @@ -1277,22 +1103,180 @@ } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -@subsection occt_modat_5_6 Storage of shapes +@section occt_modat_4 Properties of Shapes -*BRepTools* and *BinTools* packages contain methods *Read* and *Write* allowing to read and write a Shape to/from a stream or a file. -The methods provided by *BRepTools* package use ASCII storage format; *BinTools* package uses binary format. -Each of these methods has two arguments: -- a *TopoDS_Shape* object to be read/written; -- a stream object or a file name to read from/write to. +@subsection occt_modat_4_1 Local Properties of Shapes -The following sample code reads a shape from ASCII file and writes it to a binary one: +BRepLProp package provides the Local Properties of Shapes component, +which contains algorithms computing various local properties on edges and faces in a BRep model. -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} - TopoDS_Shape aShape; - if (BRepTools::Read (aShape, "source_file.txt")) { - BinTools::Write (aShape, "result_file.bin"); - } -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The local properties which may be queried are: + + * for a point of parameter u on a curve which supports an edge : + * the point, + * the derivative vectors, up to the third degree, + * the tangent vector, + * the normal, + * the curvature, and the center of curvature; + * for a point of parameter (u, v) on a surface which supports a face : + * the point, + * the derivative vectors, up to the second degree, + * the tangent vectors to the u and v isoparametric curves, + * the normal vector, + * the minimum or maximum curvature, and the corresponding directions of curvature; + * the degree of continuity of a curve which supports an edge, built by the concatenation of two other edges, at their junction point. + +Analyzed edges and faces are described as BRepAdaptor curves and surfaces, +which provide shapes with an interface for the description of their geometric support. +The base point for local properties is defined by its u parameter value on a curve, or its (u, v) parameter values on a surface. + +@subsection occt_modat_4_2 Local Properties of Curves and Surfaces + +The "Local Properties of Curves and Surfaces" component provides algorithms for computing various local properties on a Geom curve (in 2D or 3D space) or a surface. It is composed of: + + * Geom2dLProp package, which allows computing Derivative and Tangent vectors (normal and curvature) of a parametric point on a 2D curve; + * GeomLProp package, which provides local properties on 3D curves and surfaces + * LProp package, which provides an enumeration used to characterize a particular point on a 2D curve. + +Curves are either Geom_Curve curves (in 3D space) or Geom2d_Curve curves (in the plane). +Surfaces are Geom_Surface surfaces. The point on which local properties are calculated +is defined by its u parameter value on a curve, and its (u,v) parameter values on a surface. + +It is possible to query the same local properties for points as mentioned above, and additionally for 2D curves: + + * the points corresponding to a minimum or a maximum of curvature; + * the inflection points. + + +#### Example: How to check the surface concavity + +To check the concavity of a surface, proceed as follows: + + 1. Sample the surface and compute at each point the Gaussian curvature. + 2. If the value of the curvature changes of sign, the surface is concave or convex depending on the point of view. + 3. To compute a Gaussian curvature, use the class SLprops from GeomLProp, which instantiates the generic class SLProps from LProp and use the method GaussianCurvature. + +@subsection occt_modat_4_2a Continuity of Curves and Surfaces + +Types of supported continuities for curves and surfaces are described in *GeomAbs_Shape* enumeration. + +In respect of curves, the following types of continuity are supported (see the figure below): + * C0 (*GeomAbs_C0*) - parametric continuity. It is the same as G0 (geometric continuity), so the last one is not represented by separate variable. + * G1 (*GeomAbs_G1*) - tangent vectors on left and on right are parallel. + * C1 (*GeomAbs_C1*) - indicates the continuity of the first derivative. + * G2 (*GeomAbs_G2*) - in addition to G1 continuity, the centers of curvature on left and on right are the same. + * C2 (*GeomAbs_C2*) - continuity of all derivatives till the second order. + * C3 (*GeomAbs_C3*) - continuity of all derivatives till the third order. + * CN (*GeomAbs_CN*) - continuity of all derivatives till the N-th order (infinite order of continuity). + +*Note:* Geometric continuity (G1, G2) means that the curve can be reparametrized to have parametric (C1, C2) continuity. + +@figure{/user_guides/modeling_data/images/modeling_data_continuity_curves.svg,"Continuity of Curves",420} + +The following types of surface continuity are supported: + * C0 (*GeomAbs_C0*) - parametric continuity (the surface has no points or curves of discontinuity). + * G1 (*GeomAbs_G1*) - surface has single tangent plane in each point. + * C1 (*GeomAbs_C1*) - indicates the continuity of the first derivatives. + * G2 (*GeomAbs_G2*) - in addition to G1 continuity, principal curvatures and directions are continuous. + * C2 (*GeomAbs_C2*) - continuity of all derivatives till the second order. + * C3 (*GeomAbs_C3*) - continuity of all derivatives till the third order. + * CN (*GeomAbs_CN*) - continuity of all derivatives till the N-th order (infinite order of continuity). + +@figure{/user_guides/modeling_data/images/modeling_data_continuity_surfaces.svg,"Continuity of Surfaces",420} + +Against single surface, the connection of two surfaces (see the figure above) defines its continuity in each intersection point only. Smoothness of connection is a minimal value of continuities on the intersection curve. + + +@subsection occt_modat_4_2b Regularity of Shared Edges + +Regularity of an edge is a smoothness of connection of two faces sharing this edge. In other words, regularity is a minimal continuity between connected faces in each point on edge. + +Edge's regularity can be set by *BRep_Builder::Continuity* method. To get the regularity use *BRep_Tool::Continuity* method. + +Some algorithms like @ref occt_modalg_6 "Fillet" set regularity of produced edges by their own algorithms. On the other hand, some other algorithms (like @ref specification__boolean_operations "Boolean Operations", @ref occt_user_guides__shape_healing "Shape Healing", etc.) do not set regularity. If the regularity is needed to be set correctly on a shape, the method *BRepLib::EncodeRegularity* can be used. It calculates and sets correct values for all edges of the shape. + +The regularity flag is extensively used by the following high level algorithms: @ref occt_modalg_6_1_2 "Chamfer", @ref occt_modalg_7_3 "Draft Angle", @ref occt_modalg_10 "Hidden Line Removal", @ref occt_modalg_9_2 "Gluer". + + +@subsection occt_modat_4_3 Global Properties of Shapes + +The Global Properties of Shapes component provides algorithms for computing the global +properties of a composite geometric system in 3D space, and frameworks to query the computed results. + +The global properties computed for a system are : + * mass, + * mass center, + * matrix of inertia, + * moment about an axis, + * radius of gyration about an axis, + * principal properties of inertia such as principal axis, principal moments, and principal radius of gyration. + +Geometric systems are generally defined as shapes. Depending on the way they are analyzed, these shapes will give properties of: + + * lines induced from the edges of the shape, + * surfaces induced from the faces of the shape, or + * volumes induced from the solid bounded by the shape. + +The global properties of several systems may be brought together to give the global properties of the system composed of the sum of all individual systems. + +The Global Properties of Shapes component is composed of: +* seven functions for computing global properties of a shape: one function for lines, two functions for surfaces and four functions for volumes. The choice of functions depends on input parameters and algorithms used for computation (BRepGProp global functions), +* a framework for computing global properties for a set of points (GProp_PGProps), +* a general framework to bring together the global properties retained by several more elementary frameworks, and provide a general programming interface to consult computed global properties. + +Packages *GeomLProp* and *Geom2dLProp* provide algorithms calculating the local properties of curves and surfaces + +A curve (for one parameter) has the following local properties: +- Point +- Derivative +- Tangent +- Normal +- Curvature +- Center of curvature. + +A surface (for two parameters U and V) has the following local properties: +- point +- derivative for U and V) +- tangent line (for U and V) +- normal +- max curvature +- min curvature +- main directions of curvature +- mean curvature +- Gaussian curvature + +The following methods are available: +* *CLProps* -- calculates the local properties of a curve (tangency, curvature,normal); +* *CurAndInf2d* -- calculates the maximum and minimum curvatures and the inflection points of 2d curves; +* *SLProps* -- calculates the local properties of a surface (tangency, the normal and curvature). +* *Continuity* -- calculates regularity at the junction of two curves. + +Note that the B-spline curve and surface are accepted but they are not cut into pieces of the desired continuity. It is the global continuity, which is seen. + +@subsection occt_modat_4_4 Adaptors for Curves and Surfaces + +Some Open CASCADE Technology general algorithms may work theoretically on numerous types of curves or surfaces. + +To do this, they simply get the services required of the analyzed curve or surface through an interface so as to a single API, whatever the type of curve or surface. These interfaces are called adaptors. + +For example, Adaptor3d_Curve is the abstract class which provides the required services by an algorithm which uses any 3d curve. + + GeomAdaptor package provides interfaces: + * On a Geom curve; + * On a curve lying on a Geom surface; + * On a Geom surface; + + Geom2dAdaptor package provides interfaces : + * On a Geom2d curve. + + BRepAdaptor package provides interfaces: + * On a Face + * On an Edge + +When you write an algorithm which operates on geometric objects, use Adaptor3d (or Adaptor2d) objects. + +As a result, you can use the algorithm with any kind of object, if you provide for this object an interface derived from *Adaptor3d* or *Adaptor2d*. +These interfaces are easy to use: simply create an adapted curve or surface from a *Geom2d* curve, and then use this adapted curve as an argument for the algorithm? which requires it. @section occt_modat_6 Bounding boxes Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/ocaf/images/tobj_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/ocaf/images/tobj_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/ocaf/images/tobj_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/ocaf/images/tobj_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/ocaf/images/tobj_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/ocaf/images/tobj_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/ocaf/images/tobj_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/ocaf/images/tobj_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/ocaf/images/tobj_image007.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/ocaf/images/tobj_image007.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/ocaf/images/tobj_image008.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/ocaf/images/tobj_image008.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/ocaf/ocaf.md opencascade-7.5.1+dfsg1/dox/user_guides/ocaf/ocaf.md --- opencascade-7.4.1+dfsg1/dox/user_guides/ocaf/ocaf.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/ocaf/ocaf.md 2021-02-02 08:51:56.000000000 +0000 @@ -6,8 +6,7 @@ @section occt_ocaf_1 Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). -It provides basic documentation on using OCAF. For advanced information on OCAF -and its applications, see our E-learning & Training offerings. +It provides basic documentation on using OCAF. @subsection occt_ocaf_1_1 Purpose of OCAF @@ -512,7 +511,7 @@ Let’s study the implementation of the same data type in both ways by the example of transformation represented by *gp_Trsf* class. The class *gp_Trsf* defines the transformation according to the type (*gp_TrsfForm*) and a set of parameters of the particular type of transformation (two points or a vector for translation, an axis and an angle for rotation, and so on). -1. The first way: creation of a new attribute. The implementation of the transformation by creation of a new attribute is represented in the @ref occt_ocaf_11 "Samples". +1. The first way: creation of a new attribute. The implementation of the transformation by creation of a new attribute is represented in the @ref samples__ocaf "Samples". 2. The second way: creation of a new data type by means of combination of standard attributes. Depending on the type of transformation it may be kept in data framework by different standard attributes. For example, a translation is defined by two points. Therefore the data tree for translation looks like this: * Type of transformation (gp_Translation) as *TDataStd_Integer*; @@ -1820,6 +1819,912 @@ * Add (in the new *DocumentStorageDriver*) the *targetNamespace* accompanied with its prefix, using method *XmlDrivers_DocumentStorageDriver::AddNamespace*. The same is done for all namespaces objects which are used by the new persistence, with the exception of the "ocaf" namespace. * Pass (in every OCAF attribute driver) the namespace prefix of the *targetNamespace* to the constructor of *XmlMDF_ADriver*. +@section occt_tobj TObj Package + +@subsection occt_tobj_1 Introduction + +This document describes the package TObj, which is an add-on +to the Open CASCADE Application Framework (OCAF). + +This package provides a set of classes and auxiliary tools facilitating +the creation of object-oriented data models on top of low-level OCAF data structures. +This includes: + + * Definition of classes representing data objects. Data objects store their data using primitive OCAF attributes, taking advantage of OCAF mechanisms for Undo/Redo and persistence. At the same time they provide a higher level abstraction over the pure OCAF document structure (labels / attributes). + * Organization of the data model as a hierarchical (tree-like) structure of objects. + * Support of cross-references between objects within one model or among different models. In case of cross-model references the models should depend hierarchically. + * Persistence mechanism for storing *TObj* objects in OCAF files, which allows storing and retrieving objects of derived types without writing additional code to support persistence. + +This document describes basic principles of logical and physical organization +of TObj-based data models and typical approaches to implementation of classes representing model objects. + +@subsubsection occt_tobj_1_1 Applicability + +The main purpose of the *TObj* data model is rapid development +of the object-oriented data models for applications, using the existing +functionality provided by OCAF (Undo/Redo and persistence) +without the necessity to redevelop such functionality from scratch. + +As opposed to using bare OCAF (at the level of labels and attributes), +TObj facilitates dealing with higher level abstracts, which are closer +to the application domain. It works best when the application data are naturally +organized in hierarchical structures, and is especially useful for complex data +models with dependencies between objects belonging to different parts of the model. + +It should be noted that *TObj* is efficient for representing data structures containing +a limited number of objects at each level of the data structure (typically less than 1000). +A greater number of objects causes performance problems due to list-based organization of OCAF documents. Therefore, other methods of storage, such as arrays, are advisable for data models or their sub-parts containing a great number of uniform objects. However, these methods +can be combined with the usage of *TObj* to represent the high-level structure of the model. + +@subsection occt_tobj_2 TObj Model + +@subsubsection occt_tobj_2_1 TObj Model structure + +In the *TObj* data model the data are separated from the interfaces that manage them. + +It should be emphasized that *TObj* package defines only the interfaces and the basic structure of the model and objects, while the actual contents and structure of the model of a particular application are defined by its specific classes inherited from *TObj* classes. The implementation can add its own features or even change the default behaviour and the data layout, though this is not recommended. + +Logically the *TObj* data model is represented as a tree of model objects, with upper-level objects typically being collections of other objects (called *partitions*, represented by the class *TObj_Partition*). The root object of the model is called the *Main partition* and is maintained by the model itself. This partition contains a list of sub-objects called its *children* each sub-object may contain its own children (according to its type), etc. + +@figure{/user_guides/ocaf/images/tobj_image003.png,"TObj Data Model",240} + +As the *TObj* Data Model is based on OCAF (Open CASCADE Application Framework) technology, +it stores its data in the underlying OCAF document. The OCAF document consists of a tree of +items called *labels*. Each label has some data attached to it in the form of *attributes*, +and may contain an arbitrary number of sub-labels. Each sub-label is identified by its sequential +number called the *tag*. The complete sequence of tag numbers of the label +and its parents starting from the document root constitutes the complete *entry* +of the label, which uniquely identifies its position in the document. + +Generally the structure of the OCAF tree of the *TObj* data +model corresponds to the logical structure of the model and can be presented as in the following picture: + +@figure{/user_guides/ocaf/images/tobj_image004.png,"TObj Data Model mapped on OCAF document",360} + +All data of the model are stored in the root label (0:1) of the OCAF document. +An attribute *TObj_TModel* is located in this root label. It +stores the object of type *TObj_Model*. This object serves as a main interface tool +to access all data and functionalities of the data model. + +In simple cases all data needed by the application may be +contained in a single data model. Moreover, *TObj* gives the possibility to +distribute the data between several interconnected data models. This can be +especially useful for the applications dealing with great amounts of data. because +only the data required for the current operation is loaded in the memory at one time. +It is presumed that the models have a hierarchical (tree-like) structure, +where the objects of the child models can refer to the objects of the parent +models, not vice-versa. Provided that the correct order of loading and closing +of the models is ensured, the *TObj* classes will maintain references between the objects automatically. + +@subsubsection occt_tobj_2_2 Data Model basic features + +The class *TObj_Model* describing the data model provides the following functionalities: + + * Loading and saving of the model from or in a file (methods *Load* and *Save*) + * Closing and removal of the model from memory (method *Close*) + * Definition of the full file name of the persistence storage for this model (method *GetFile*) + * Tools to organize data objects in partitions and iterate on objects (methods *GetObjects*, *GetMainPartition*, *GetChildren*, *getPartition*, *getElementPartition*) + * Mechanism to give unique names to model objects + * Copy (*clone*) of the model (methods *NewEmpty* and *Paste*) + * Support of earlier model formats for proper conversion of a model loaded from a file written by a previous version of the application (methods *GetFormatVersion* and *SetFormatVersion*) + * Interface to check and update the model if necessary (method *Update*) + * Support of several data models in one application. For this feature use OCAF multi-transaction manager, unique names and GUIDs of the data model (methods *GetModelName*, *GetGUID*) + +@subsubsection occt_tobj_2_3 Model Persistence + +The persistent representation of any OCAF model is contained in an XML or a binary file, +which is defined by the format string returned by the method *GetFormat*. +The default implementation works with a binary OCAF document format (*BinOcaf*). +The other available format is *XmlOcaf*. The class **TObj_Model** declares and provides a default +implementation of two virtual methods: + +~~~~~{.cpp} + virtual Standard_Boolean Load (const char* theFile); + virtual Standard_Boolean SaveAs (const char* theFile); +~~~~~ + +which retrieve and store the model from or +in the OCAF file. The descendants +should define the following protected method to support Load and Save operations: + +~~~~~{.cpp} + virtual Standard_Boolean initNewModel (const Standard_Boolean IsNew); +~~~~~ + +This method is called by *Load* after creation of a new model +or after its loading from the file; its purpose is to perform +the necessary initialization of the model (such as creation of necessary top-level +partitions, model update due to version changes etc.). Note that if +the specified file does not exist, method *Load* will create +a new document and call *initNewModel* with the argument **True**. +If the file has been normally loaded, the argument **False** is passed. +Thus, a new empty *TObj* model is created by calling *Load* with an empty +string or the path to a nonexistent file as argument. + +The method *Load* returns **True** if the model has been retrieved successfully +(or created a new), or **False** if the model could not be loaded. +If no errors have been detected during initialization (model retrieval or creation), +the virtual method *AfterRetrieval* is invoked for all objects of the model. +This method initializes or updates the objects immediately after the model initialization. +It could be useful when some object data should be imported from an OCAF attribute into transient +fields which could be changed outside of the OCAF transaction mechanism. +Such fields can be stored into OCAF attributes for saving into persistent storage during the save operation. + +To avoid memory leaks, the *TObj_Model* class destructor invokes *Close* method +which clears the OCAF document and removes all data from memory before the model is destroyed. + +For XML and binary persistence of the *TObj* data model the corresponding drivers are implemented +in *BinLDrivers*, *BinMObj* and *XmlLDrivers*, *XmlMObj* packages. +These packages contain retrieval and storage drivers for the model, model objects and custom attributes +from the *TObj* package. The schemas support persistence for the standard OCAF and *TObj* attributes. +This is sufficient for the implementation of simple data models, but +in some cases it can be reasonable to add specific OCAF attributes to +facilitate the storage of the data specific to the application. +In this case the schema should be extended using the standard OCAF mechanism. + +@subsubsection occt_tobj_2_4 Access to the objects in the model + +All objects in the model are stored in the main partition and accessed by iterators. +To access all model objects use: + +~~~~~{.cpp} + virtual Handle(TObj_ObjectIterator) GetObjects () const; +~~~~~ + +This method returns a recursive iterator on all objects stored in the model. + +~~~~~{.cpp} + virtual Handle(TObj_ObjectIterator) GetChildren () const; +~~~~~ + +This method returns an iterator on child objects of the main partition. +Use the following method to get the main partition: + +~~~~~{.cpp} + Handle(TObj_Partition) GetMainPartition() const; +~~~~~ + +To receive the iterator on objects of a specific type *AType* use the following call: + +~~~~~{.cpp} + GetMainPartition()->GetChildren(STANDARD_TYPE(AType) ); +~~~~~ + +The set of protected methods is provided for descendant classes to deal with partitions: + +~~~~~{.cpp} + virtual Handle(TObj_Partition) getPartition (const TDF_Label, const Standard_Boolean theHidden) const; +~~~~~ + +This method returns (creating if necessary) a partition in the specified label of the document. +The partition can be created as hidden (*TObj_HiddenPartition* class). +A hidden partition can be useful to distinguish the data that +should not be visible to the user when browsing the model in the application. + +The following two methods allow getting (creating) a partition +in the sub-label of the specified label in the document +(the label of the main partition for the second method) and with the given name: + +~~~~~{.cpp} + virtual Handle(TObj_Partition) getPartition (const TDF_Label, const Standard_Integer theIndex, const TCollection_ExtendedString& theName, const Standard_Boolean theHidden) const; + virtual Handle(TObj_Partition) getPartition (const Standard_Integer theIndex, const TCollection_ExtendedString& theName, const Standard_Boolean theHidden) const; +~~~~~ + +If the default object naming and the name register mechanism +is turned on, the object can be found in the model by its unique name: + +~~~~~{.cpp} + Handle(TObj_Object) FindObject (const Handle(TCollection_HExtendedString)& theName, const Handle(TObj_TNameContainer)& theDictionary) const; +~~~~~ + +@subsubsection occt_tobj_2_5 Own model data + +The model object can store its own data in the Data label +of its main partition, however, there is no standard API for +setting and getting these data types. The descendants can add +their own data using standard OCAF methods. The enumeration DataTag is defined +in *TObj_Model* to avoid conflict of data labels used by this class +and its descendants, similarly to objects (see below). + +@subsubsection occt_tobj_2_6 Object naming + +The basic implementation of *TObj_Model* provides the default +naming mechanism: all objects must have unique names, +which are registered automatically in the data model dictionary. +The dictionary is a *TObj_TNameContainer* +attribute whose instance is located in the model root label. +If necessary, the developer can add several dictionaries into +the specific partitions, providing the name registration in the +correct name dictionary and restoring the name map after document is loaded from file. +To ignore name registering it is necessary to redefine the methods *SetName*, +*AfterRetrieval* of the *TObj_Object* class and skip the registration of the object name. +Use the following methods for the naming mechanism: + +~~~~~{.cpp} + Standard_Boolean IsRegisteredName (const Handle(TCollection_HExtendedString)& theName, const Handle(TObj_TNameContainer)& theDictionary ) const; +~~~~~ + +Returns **True** if the object name is already registered in the indicated (or model) dictionary. + +~~~~~{.cpp} + void RegisterName (const Handle(TCollection_HExtendedString)& theName, const TDF_Label& theLabel, const Handle(TObj_TNameContainer)& theDictionary ) const; +~~~~~ + +Registers the object name with the indicated label where the object +is located in the OCAF document. Note that the default implementation +of the method *SetName* of the object registers the new name automatically +(if the name is not yet registered for any other object) + +~~~~~{.cpp} + void UnRegisterName (const Handle(TCollection_HExtendedString)& theName, const Handle(TObj_TNameContainer)& theDictionary ) const; +~~~~~ + +Unregisters the name from the dictionary. Ther names of *TObj* model +objects are removed from the dictionary when the objects are deleted from the model. + +~~~~~{.cpp} + Handle(TObj_TNameContainer) GetDictionary() const; +~~~~~ + +Returns a default instance of the model dictionary (located at the model root label). +The default implementation works only with one dictionary. +If there are a necessity to have more than one dictionary for the model objects, +it is recommended to redefine the corresponding virtual method of TObj_Object +that returns the dictionary where names of objects should be registered. + +@subsubsection occt_tobj_2_7 API for transaction mechanism + +Class *TObj_Model* provides the API for transaction mechanism (supported by OCAF): + +~~~~~{.cpp} + Standard_Boolean HasOpenCommand() const; +~~~~~ + +Returns True if a Command transaction is open + +~~~~~{.cpp} + void OpenCommand() const; +~~~~~ + +Opens a new command transaction. + +~~~~~{.cpp} + void CommitCommand() const; +~~~~~ + +Commits the Command transaction. Does nothing If there is no open Command transaction. + +~~~~~{.cpp} + void AbortCommand() const; +~~~~~ + +Aborts the Command transaction. Does nothing if there is no open Command transaction. + +~~~~~{.cpp} + Standard_Boolean IsModified() const; +~~~~~ + +Returns True if the model document has a modified status (has changes after the last save) + +~~~~~{.cpp} + void SetModified( const Standard_Boolean ); +~~~~~ + +Changes the modified status by force. For synchronization of transactions +within several *TObj_Model* documents use class *TDocStd_MultiTransactionManager*. + +@subsubsection occt_tobj_28 Model format and version + +Class *TObj_Model* provides the descendant classes with a means to control +the format of the persistent file by choosing the schema used to store or retrieve operations. + +~~~~~{.cpp} + virtual TCollection_ExtendedString GetFormat () const; +~~~~~ + +Returns the string *TObjBin* or *TObjXml* indicating +the current persistent mechanism. The default value is *TObjBin*. +Due to the evolution of functionality of the developed application, +the contents and the structure of its data model vary from version to version. +*TObj* package provides a basic mechanism supporting backward versions compatibility, +which means that newer versions of the application will be able to read +Data Model files created by previous versions (but not vice-versa) with a minimum loss of data. +For each type of Data Model, all known versions of the data format +should be enumerated in increasing order, incremented with every change +of the model format. The current version of the model +format is stored in the model file and can be checked upon retrieval. + +~~~~~{.cpp} + Standard_Integer GetFormatVersion() const; +~~~~~ + +Returns the format version stored in the model file + +~~~~~{.cpp} + void SetFormatVersion(const Standard_Integer theVersion); +~~~~~ + +Defines the format version used for save. + +Upon loading a model, the method *initNewModel()*, called immediately +after opening a model from disk (on the level of the OCAF document), +provides a specific code that checks the format version stored in that model. +If it is older than the current version of the application, the data update can be performed. +Each model can have its own specific conversion code +that performs the necessary data conversion to make them compliant with the current version. + +When the conversion ends the user is advised of that by the messenger interface +provided by the model (see messaging chapter for more details), +and the model version is updated. If the version of data model is not supported +(it is newer than the current or too old), the load operation should fail. +The program updating the model after version change can be implemented as static +methods directly in C++ files of the corresponding Data Model classes, +not exposing it to the other parts of the application. +These codes can use direct access to the model and objects data (attributes) +not using objects interfaces, because the data model API and object classes +could have already been changed. + +Note that this mechanism has been designed to maintain version compatibility +for the changes of data stored in the model, not for the changes of +low-level format of data files (such as the storage format of a specific OCAF attribute). +If the format of data files changes, a specific treatment on a case-by-case basis will be required. + +@subsubsection occt_tobj_2_9 Model update + +The following methods are used for model update to ensure its consistency +with respect to the other models in case of cross-model dependencies: + +~~~~~{.cpp} + virtual Standard_Boolean Update(); +~~~~~ + +This method is usually called after loading of the model. +The default implementation does nothing and returns **True**. + +~~~~~{.cpp} + virtual Standard_Boolean initNewModel( const Standard_Boolean IsNew); +~~~~~ + +This method performs model initialization, check and updates (as described above). + +~~~~~{.cpp} + virtual void updateBackReferences( const Handle(TObj_Object)& theObj); +~~~~~ + +This method is called from the previous method to update back references +of the indicated object after the retrieval of the model from file +(see data model - object relationship chapter for more details) + +@subsubsection occt_tobj_2_10 Model copying + +To copy the model between OCAF documents use the following methods: + +~~~~~{.cpp} + virtual Standard_Boolean Paste (Handle(TObj_Model) theModel, Handle(TDF_RelocationTable) theRelocTable = 0 ); +~~~~~ + +Pastes the current model to the new model. The relocation table +ensures correct copying of the sub-data shared by several parts of the model. +It stores a map of processed original objects of relevant types in their copies. + +~~~~~{.cpp} + virtual Handle(TObj_Model) NewEmpty() = 0; +~~~~~ + +Redefines a pure virtual method to create a new empty instance of the model. + +~~~~~{.cpp} + void CopyReferences ( const Handle(TObj_Model)& theTarget, const Handle(TDF_RelocationTable)& theRelocTable); +~~~~~ + +Copies the references from the current model to the target model. + +@subsubsection occt_tobj_2_11 Messaging + +The messaging is organised using Open CASCADE Messenger from the package Message. +The messenger is stored as the field of the model instance +and can be set and retrieved by the following methods: + +~~~~~{.cpp} + void SetMessenger( const Handle(Message_Messenger)& ); + Handle(Message_Messenger) Messenger() const; +~~~~~ + +A developer should create his own instance of the Messenger +bound to the application user interface, and attribute it to the model +for future usage. In particular the messenger is used for reporting +errors and warnings in the persistence mechanism. +Each message has a unique string identifier (key). +All message keys are stored in a special resource file TObj.msg. +This file should be loaded at the start of the application +by call to the appropriate method of the class *Message_MsgFile*. + +@subsection occt_tobj_3 Model object + +Class *TObj_Object* provides basic interface and default implementation +of important features of *TObj* model objects. This implementation defines +basic approaches that are recommended for all descendants, +and provides tools to facilitate their usage. + +@figure{/user_guides/ocaf/images/tobj_image005.png,"TObj objects hierarchy",170} + +@subsubsection occt_tobj_3_1 Separation of data and interface + +In the *TObj* data model, the data are separated from the interfaces that manage them. +The data belonging to a model object are stored in its root label and sub-labels +in the form of standard OCAF attributes. This allows using standard OCAF mechanisms +for work with these data, and eases the implementation of the persistence mechanism. + +The instance of the interface which serves as an API for managing object data +(e.g. represents the model object) is stored in the root label of the object, +and typically does not bring its own data. The interface classes are organized in a hierarchy +corresponding to the natural hierarchy of the model objects according to the application. + +In the text below the term 'object' is used to denote either the instance +of the interface class or the object itself (both interface and data stored in OCAF). + +The special type of attribute *TObj_TObject* is used for storing instances of objects interfaces +in the OCAF tree. *TObj_TObject* is a simple container for the object of type *TObj_Object*. +All objects (interfaces) of the data model inherit this class. + +@figure{/user_guides/ocaf/images/tobj_image006.png,"TObj object stored on OCAF label",360} + + +@subsubsection occt_tobj_3_2 Basic features + +The *TObj_Object* class provides some basic features that can be inherited (or, if necessary, redefined) by the descendants: + + * Gives access to the model to which the object belongs (method *GetModel*) and to the OCAF label in which the object is stored (method *GetLabel*). + * Supports references (and back references) to other objects in the same or in another model (methods *getReference*, *setReference*, *addReference*, *GetReferences*, *GetBackReferences*, *AddBackReference*, *RemoveBackReference*, *ReplaceReference*) + * Provides the ability to contain child objects, as it is actual for partition objects (methods *GetChildren*, *GetFatherObject*) + * Organizes its data in the OCAF structure by separating the sub-labels of the main label intended for various kinds of data and providing tools to organize these data (see below). The kinds of data stored separately are: + * Child objects stored in the label returned by the method *GetChildLabel* + * References to other objects stored in the label returned by the method *GetReferenceLabel* + * Other data, both common to all objects and specific for each subtype of the model object, are stored in the label returned by the method *GetDataLabel* + * Provides unique names of all objects in the model (methods *GetDictionary*, *GetName*, *SetName*) + * Provides unified means to maintain persistence (implemented in descendants with the help of macros *DECLARE_TOBJOCAF_PERSISTENCE* and *IMPLEMENT_TOBJOCAF_PERSISTENCE*) + * Allows an object to remove itself from the OCAF document and check the depending objects can be deleted according to the back references (method *Detach*) + * Implements methods for identification and versioning of objects + * Manages the object interaction with OCAF Undo/Redo mechanism (method *IsAlive*, *AfterRetrieval*, *BeforeStoring*) + * Allows make a clone (methods *Clone*, *CopyReferences*, *CopyChildren*, *copyData*) + * Contains additional word of bit flags (methods *GetFlags*, *SetFlags*, *TestFlags*, *ClearFlags*) + * Defines the interface to sort the objects by rank (methods *GetOrder*, *SetOrder*) + * Provides a number of auxiliary methods for descendants to set/get the standard attribute values, such as int, double, string, arrays etc. + +An object can be received from the model by the following methods: + +~~~~~{.cpp} + static Standard_Boolean GetObj ( const TDF_Label& theLabel, Handle(TObj_Object)& theResObject, const Standard_Boolean isSuper = Standard_False ); +~~~~~ + +Returns *True* if the object has been found in the indicated label (or in the upper level label if *isSuper* is *True*). + +~~~~~{.cpp} + Handle(TObj_Object) GetFatherObject ( const Handle(Standard_Type)& theType = NULL ) const; +~~~~~ + +Returns the father object of the indicated type +for the current object (the direct father object if the type is NULL). + +@subsubsection occt_tobj_3_3 Data layout and inheritance + +As far as the data objects are separated from the interfaces and stored in the OCAF tree, +the functionality to support inheritance is required. Each object has its own data +and references stored in the labels in the OCAF tree. All data are stored in the sub-tree +of the main object label. If it is necessary to inherit a class from the base class, +the descendant class should use different labels for data and references than its ancestor. + +Therefore each *TObj* class can reserve the range of tags in each of +*Data*, *References*, and *Child* sub-labels. +The reserved range is declared by the enumeration defined +in the class scope (called DataTag, RefTag, and ChildTag, respectively). +The item *First* of the enumeration of each type is defined via the *Last* item +of the corresponding enumeration of the parent class, thus ensuring that the tag numbers +do not overlap. The item *Last* of the enumeration defines the last tag reserved by this class. +Other items of the enumeration define the tags used for storing particular data items of the object. +See the declaration of the TObj_Partition class for the example. + +*TObj_Object* class provides a set of auxiliary methods for descendants +to access the data stored in sub-labels by their tag numbers: + +~~~~~{.cpp} + TDF_Label getDataLabel (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; + TDF_Label getReferenceLabel (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; +~~~~~ + +Returns the label in *Data* or *References* sub-labels at a given tag number (theRank1). +The second argument, theRank2, allows accessing the next level of hierarchy +(theRank2-th sub-label of theRank1-th data label). +This is useful when the data to be stored are represented by multiple OCAF attributes +of the same type (e.g. sequences of homogeneous data or references). + +The get/set methods allow easily accessing the data located in the specified data label +for the most widely used data types (*Standard_Real*, *Standard_Integer*, *TCollection_HExtendedString*, + *TColStd_HArray1OfReal*, *TColStd_HArray1OfInteger*, *TColStd_HArray1OfExtendedString*). +For instance, methods provided for real numbers are: + +~~~~~{.cpp} + Standard_Real getReal (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; + Standard_Boolean setReal (const Standard_Real theValue, const Standard_Integer theRank1, const Standard_Integer theRank2 = 0, const Standard_Real theTolerance = 0.) const; +~~~~~ + +Similar methods are provided to access references to other objects: + +~~~~~{.cpp} + Handle(TObj_Object) getReference (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; + Standard_Boolean setReference (const Handle(TObj_Object) &theObject, const Standard_Integer theRank1, const Standard_Integer theRank2 = 0); +~~~~~ + +The method *addReference* gives an easy way to store a sequence of homogeneous references in one label. + +~~~~~{.cpp} + TDF_Label addReference (const Standard_Integer theRank1, const Handle(TObj_Object) &theObject); +~~~~~ + +Note that while references to other objects should be defined by descendant classes +individually according to the type of object, *TObj_Object* provides methods +to manipulate (check, remove, iterate) the existing references in the uniform way, as described below. + +@subsubsection occt_tobj_3_4 Persistence + +The persistence of the *TObj* Data Model is implemented with the help +of standard OCAF mechanisms (a schema defining necessary plugins, drivers, etc.). +This implies the possibility to store/retrieve all data that are stored +as standard OCAF attributes., The corresponding handlers are added +to the drivers for *TObj*-specific attributes. + +The special tool is provided for classes inheriting from *TObj_Object* +to add the new types of persistence without regeneration of the OCAF schema. +The class *TObj_Persistence* provides basic means for that: + + * automatic run-time registration of object types + * creation of a new object of the specified type (one of the registered types) + +Two macros defined in the file TObj_Persistence.hxx have to be included in the definition +of each model object class inheriting TObj_Object to activate the persistence mechanism: + +~~~~~{.cpp} + DECLARE_TOBJOCAF_PERSISTENCE (classname, ancestorname) +~~~~~ + +Should be included in the private section of declaration of each class inheriting +*TObj_Object* (hxx file). This macro adds an additional constructor to the object class, +and declares an auxiliary (private) class inheriting *TObj_Persistence* +that provides a tool to create a new object of the proper type. + +~~~~~{.cpp} + IMPLEMENT_TOBJOCAF_PERSISTENCE (classname) +~~~~~ + +Should be included in .cxx file of each object class that should be saved and restored. +This is not needed for abstract types of objects. This macro implements the functions +declared by the previous macro and creates a static member +that automatically registers that type for persistence. + +When the attribute *TObj_TObject* that contains the interface object is saved, +its persistence handler stores the runtime type of the object class. +When the type is restored the handler dynamically recognizes the type +and creates the corresponding object using mechanisms provided by *TObj_Persistence*. + +@subsubsection occt_tobj_3_5 Names of objects + +All *TObj* model objects have names by which the user can refer to the object. +Upon creation, each object receives a default name, constructed +from the prefix corresponding to the object type (more precisely, the prefix is defined +by the partition to which the object belongs), and the index of the object in the current partition. +The user has the possibility to change this name. The uniqueness of the name in the model is ensured +by the naming mechanism (if the name is already used, it cannot be attributed to another object). +This default implementation of *TObj* package works with a single instance of the name container (dictionary) +for name registration of objects and it is enough in most simple projects. +If necessary, it is easy to redefine a couple of object methods +(for instance *GetDictionary*()) and to take care of construction and initialization of containers. + +This functionality is provided by the following methods: + +~~~~~{.cpp} + virtual Handle(TObj_TNameContainer) GetDictionary() const; +~~~~~ + +Returns the name container where the name of object should be registered. +The default implementation returns the model name container. + +~~~~~{.cpp} + Handle(TCollection_HExtendedString) GetName() const; + Standard_Boolean GetName( TCollection_ExtendedString& theName ) const; + Standard_Boolean GetName( TCollection_AsciiString& theName ) const; +~~~~~ + +Returns the object name. The methods with in / out argument return False if the object name is not defined. + +~~~~~{.cpp} + virtual Standard_Boolean SetName ( const Handle(TCollection_HExtendedString)& theName ) const; + Standard_Boolean SetName ( const Handle(TCollection_HAsciiString)& theName ) const; + Standard_Boolean SetName ( const Standard_CString theName ) const; +~~~~~ + +Attributes a new name to the object and returns **True** if the name has been attributed successfully. +Returns False if the name has been already attributed to another object. +The last two methods are short-cuts to the first one. + +@subsubsection occt_tobj_3_6 References between objects + +Class *TObj_Object* allows creating references to other objects in the model. +Such references describe relations among objects which are not adequately reflected +by the hierarchical objects structure in the model (parent-child relationship). + +The references are stored internally using the attribute TObj_TReference. +This attribute is located in the sub-label of the referring object (called *master*) +and keeps reference to the main label of the referred object. +At the same time the referred object can maintain the back reference to the master object. + +@figure{/user_guides/ocaf/images/tobj_image007.png,"Objects relationship",360} + + + +The back references are stored not in the OCAF document but as a transient field +of the object; they are created when the model is restored from file, +and updated automatically when the references are manipulated. +The class *TObj_TReference* allows storing references between objects +from different *TObj* models, facilitating the construction of complex relations between objects. + +The most used methods for work with references are: + +~~~~~{.cpp} + virtual Standard_Boolean HasReference( const Handle(TObj_Object)& theObject) const; +~~~~~ + +Returns True if the current object refers to the indicated object. + +~~~~~{.cpp} + virtual Handle(TObj_ObjectIterator) GetReferences ( const Handle(Standard_Type)& theType = NULL ) const; +~~~~~ + +Returns an iterator on the object references. The optional argument *theType* +restricts the types of referred objects, or does not if it is NULL. + +~~~~~{.cpp} + virtual void RemoveAllReferences(); +~~~~~ + +Removes all references from the current object. + +~~~~~{.cpp} + virtual void RemoveReference( const Handle(TObj_Object)& theObject ); +~~~~~ + +Removes the reference to the indicated object. + +~~~~~{.cpp} + virtual Handle(TObj_ObjectIterator) GetBackReferences ( const Handle(Standard_Type)& theType = NULL ) const; +~~~~~ + +Returns an iterator on the object back references. +The argument theType restricts the types of master objects, or does not if it is NULL. + +~~~~~{.cpp} + virtual void ReplaceReference ( const Handle(TObj_Object)& theOldObject, const Handle(TObj_Object)& theNewObject ); +~~~~~ + +Replaces the reference to theOldObject by the reference to *theNewObject*. +The handle theNewObject may be NULL to remove the reference. + +~~~~~{.cpp} + virtual Standard_Boolean RelocateReferences ( const TDF_Label& theFromRoot, const TDF_Label& theToRoot, const Standard_Boolean theUpdateackRefs = Standard_True ); +~~~~~ + +Replaces all references to a descendant label of *theFromRoot* +by the references to an equivalent label under *theToRoot*. +Returns **False** if the resulting reference does not point at a *TObj_Object*. +Updates back references if theUpdateackRefs is **True**. + +~~~~~{.cpp} + virtual Standard_Boolean CanRemoveReference ( const Handle(TObj_Object)& theObj) const; +~~~~~ + +Returns **True** if the reference can be removed and the master object +will remain valid (*weak* reference). +Returns **False** if the master object cannot be valid without the referred object (*strong* reference). +This affects the behaviour of objects removal from the model -- if the reference cannot be removed, +either the referred object will not be removed, or both the referred +and the master objects will be removed (depends on the deletion mode in the method **Detach**) + +@subsubsection occt_tobj_3_7 Creation and deletion of objects + +It is recommended that all objects inheriting from *TObj_Object* + should implement the same approach to creation and deletion. + +The object of the *TObj* data model cannot be created independently +of the model instance, as far as it stores the object data in OCAF data structures. +Therefore an object class cannot be created directly as its constructor is protected. + +Instead, each object should provide a static method *Create*(), which accepts the model, +with the label, which stores the object and other type-dependent parameters +necessary for proper definition of the object. This method creates a new object with its data +(a set of OCAF attributes) in the specified label, and returns a handle to the object's interface. + +The method *Detach*() is provided for deletion of objects from OCAF model. +Object data are deleted from the corresponding OCAF label; however, +the handle on object remains valid. The only operation available after object deletion +is the method *IsAlive*() checking whether the object has been deleted or not, +which returns False if the object has been deleted. + +When the object is deleted from the data model, the method checks +whether there are any alive references to the object. +Iterating on references the object asks each referring (master) object +whether the reference can be removed. If the master object can be unlinked, +the reference is removed, otherwise the master object will be removed too +or the referred object will be kept alive. This check is performed by the method *Detach* , +but the behavior depends on the deletion mode *TObj_DeletingMode*: + + * **TObj_FreeOnly** -- the object will be destroyed only if it is free, i.e. there are no references to it from other objects + * **TObj_KeepDepending** -- the object will be destroyed if there are no strong references to it from master objects (all references can be unlinked) + * **TObj_Force** -- the object and all depending master objects that have strong references to it will be destroyed. + +The most used methods for object removing are: + +~~~~~{.cpp} + virtual Standard_Boolean CanDetachObject (const TObj_DeletingMode theMode = TObj_FreeOnly ); +~~~~~ + +Returns **True** if the object can be deleted with the indicated deletion mode. + +~~~~~{.cpp} + virtual Standard_Boolean Detach ( const TObj_DeletingMode theMode = TObj_FreeOnly ); +~~~~~ + +Removes the object from the document if possible +(according to the indicated deletion mode). +Unlinks references from removed objects. +Returns **True** if the objects have been successfully deleted. + +@subsubsection occt_tobj_3_8 Transformation and replication of object data + +*TObj_Object* provides a number of special virtual methods to support replications of objects. These methods should be redefined by descendants when necessary. + +~~~~~{.cpp} + virtual Handle(TObj_Object) Clone (const TDF_Label& theTargetLabel, Handle(TDF_RelocationTable) theRelocTable = 0); +~~~~~ + +Copies the object to theTargetLabel. The new object will have all references of its original. +Returns a handle to the new object (null handle if fail). The data are copied directly, +but the name is changed by adding the postfix *_copy*. +To assign different names to the copies redefine the method: + +~~~~~{.cpp} + virtual Handle(TCollection_HExtendedString) GetNameForClone ( const Handle(TObj_Object)& ) const; +~~~~~ + +Returns the name for a new object copy. It could be useful to return the same object name +if the copy will be in the other model or in the other partition with its own dictionary. +The method *Clone* uses the following public methods for object data replications: + +~~~~~{.cpp} + virtual void CopyReferences (const const Handle(TObj_Object)& theTargetObject, const Handle(TDF_RelocationTable) theRelocTable); +~~~~~ + +Adds to the copy of the original object its references. + +~~~~~{.cpp} + virtual void CopyChildren (TDF_Label& theTargetLabel, const Handle(TDF_RelocationTable) theRelocTable); +~~~~~ + +Copies the children of an object to the target child label. + +@subsubsection occt_tobj_3_9 Object flags + +Each instance of *TObj_Object* stores a set of bit flags, +which facilitate the storage of auxiliary logical information assigned to the objects +(object state). Several typical state flags are defined in the enumeration *ObjectState*: + + * *ObjectState_Hidden* -- the object is marked as hidden + * *ObjectState_Saved* -- the object has (or should have) the corresponding saved file on disk + * *ObjectState_Imported* -- the object is imported from somewhere + * *ObjectState_ImportedByFile* -- the object has been imported from file and should be updated to have correct relations with other objects + * *ObjectState_Ordered* -- the partition contains objects that can be ordered. + +The user (developer) can define any new flags in descendant classes. +To set/get an object, the flags use the following methods: + +~~~~~{.cpp} + Standard_Integer GetFlags() const; + void SetFlags( const Standard_Integer theMask ); + Stadnard_Boolean TestFlags( const Standard_Integer theMask ) const; + void ClearFlags( const Standard_Integer theMask = 0 ); +~~~~~ + +In addition, the generic virtual interface stores the logical properties +of the object class in the form of a set of bit flags. +Type flags can be received by the method: + +~~~~~{.cpp} + virtual Standard_Integer GetTypeFlags() const; +~~~~~ + +The default implementation returns the flag **Visible** +defined in the enumeration *TypeFlags*. This flag is used to define visibility +of the object for the user browsing the model (see class *TObj_HiddenPartition*). +Other flags can be added by the applications. + +@subsubsection occt_tobj_310 Partitions + +The special kind of objects defined by the class *TObj_Partition* +(and its descendant *TObj_HiddenPartition*) is provided for partitioning +the model into a hierarchical structure. This object represents the container +of other objects. Each *TObj* model contains the main partition that is placed +in the same OCAF label as the model object, and serves as a root of the object's tree. +A hidden partition is a simple partition with a predefined hidden flag. + +The main partition object methods: + +~~~~~{.cpp} + TDF_Label NewLabel() const; +~~~~~ + +Allocates and returns a new label for creation of a new child object. + +~~~~~{.cpp} + void SetNamePrefix ( const Handle(TCollection_HExtendedString)& thePrefix); +~~~~~ + +Defines the prefix for automatic generation of names of the newly created objects. + +~~~~~{.cpp} + Handle(TCollection_HExtendedString) GetNamePrefix() const; +~~~~~ + +Returns the current name prefix. + +~~~~~{.cpp} + Handle(TCollection_HExtendedString) GetNewName ( const Standard_Boolean theIsToChangeCount) const; +~~~~~ + +Generates the new name and increases the internal counter of child objects if theIsToChangeCount is **True**. + +~~~~~{.cpp} + Standard_Integer GetLastIndex() const; +~~~~~ + +Returns the last reserved child index. + +~~~~~{.cpp} + void SetLastIndex( const Standard_Integer theIndex ); +~~~~~ + +Sets the last reserved index. + +@subsection occt_tobj_4 Auxiliary classes + +Apart from the model and the object, package *TObj* provides a set of auxiliary classes: + + * *TObj_Application* -- defines OCAF application supporting existence and operation with *TObj* documents. + * *TObj_Assistant* -- class provides an interface to the static data to be used during save and load operations on models. In particular, in case of cross-model dependencies it allows passing information on the parent model to the OCAF loader to correctly resolve the references when loading a dependent model. + * *TObj_TReference* -- OCAF attribute describes the references between objects in the *TObj* model(s). This attribute stores the label of the referred model object, and provides transparent cross-model references. At runtime, these references are simple Handles; in persistence mode, the cross-model references are automatically detected and processed by the persistence mechanism of *TObj_TReference* attribute. + * Other classes starting with *TObj_T...* -- define OCAF attributes used to store TObj-specific classes and some types of data on OCAF labels. + * Iterators -- a set of classes implementing *TObj_ObjectIterator* interface, used for iterations on *TObj* objects: + * *TObj_ObjectIterator* -- a basic abstract class for other *TObj* iterators. Iterates on *TObj_Object* instances. + * *TObj_LabelIterator* -- iterates on object labels in the *TObj* model document + * *TObj_ModelIterator* -- iterates on all objects in the model. Works with sequences of other iterators. + * *TObj_OcafObjectIterator* -- Iterates on *TObj* data model objects. Can iterate on objects of a specific type. + * *TObj_ReferenceIterator* -- iterates on object references. + * *TObj_SequenceIterator* -- iterates on a sequence of *TObj* objects. + * *TObj_CheckModel* -- a tool that checks the internal consistency of the model. The basic implementation checks only the consistency of references between objects. + +The structure of *TObj* iterators hierarchy is presented below: + +@figure{/user_guides/ocaf/images/tobj_image008.png,"Hierarchy of iterators",420} + + +@subsection occt_tobj_5 Packaging + +The *TObj* sources are distributed in the following packages: + + * *TObj* -- defines basic classes that implement *TObj* interfaces for OCAF-based modelers. + * *BinLDrivers, XmlLDrivers* -- binary and XML driver of *TObj* package + * *BinLPlugin, XmlLPlugin* -- plug-in for binary and XML persistence + * *BinMObj, XmlMObj* -- binary and XML drivers to store and retrieve specific *TObj* data to or from OCAF document + * *TKBinL, TKXmlL* -- toolkits of binary and XML persistence + + @section occt_ocaf_10 GLOSSARY * **Application** -- a document container holding all documents containing all application data. @@ -1868,506 +2773,3 @@ * **Topological naming** -- systematic referencing of topological entities so that these entities can still be identified after the models they belong to have gone through several steps in modeling. In other words, topological naming allows you to track entities through the steps in the modeling process. This referencing is needed when a model is edited and regenerated, and can be seen as a mapping of labels and name attributes of the entities in the old version of a model to those of the corresponding entities in its new version. Note that if the topology of a model changes during the modeling, this mapping may not fully coincide. A Boolean operation, for example, may split edges. * **Topological tracking** -- following a topological entity in a model through the steps taken to edit and regenerate that model. * **Valid label** -- in a data framework, this is a label, which is already recomputed in the scope of regeneration sequence and includes the label containing a feature which is to be recalculated. Consider the case of a box to which you first add a fillet, then a protrusion feature. For recalculation purposes, only valid labels of each construction stage are used. In recalculating a fillet, they are only those of the box and the fillet, not the protrusion feature which was added afterwards. - -@section occt_ocaf_11 Samples - -@subsection occt_ocaf_11_a Getting Started - - At the beginning of your development, you first define an application class by inheriting from the Application abstract class. - You only have to create and determine the resources of the application - for specifying the format of your documents (you generally use the standard one) and their file extension. - - Then, you design the application data model by organizing attributes you choose among those provided with OCAF. - You can specialize these attributes using the User attribute. For example, if you need a reflection coefficient, - you aggregate a User attribute identified as a reflection coefficient - with a Real attribute containing the value of the coefficient (as such, you don't define a new class). - - If you need application specific data not provided with OCAF, for example, - to incorporate a finite element model in the data structure, - you define a new attribute class containing the mesh, - and you include its persistent homologue in a new file format. - - Once you have implemented the commands which create and modify the data structure - according to your specification, OCAF provides you, without any additional programming: - - * Persistent reference to any data, including geometric elements — several documents can be linked with such reference; - * Document-View association; - * Ready-to-use functions such as : - * Undo-redo; - * Save and open application data. - - Finally, you develop the application's graphical user interface using the toolkit of your choice, for example: - * KDE Qt or GNOME GTK+ on Linux; - * Microsoft Foundation Classes (MFC) on Windows Motif on Sun; - * Other commercial products such as Ilog Views. - - You can also implement the user interface in the Java language using - the Swing-based Java Application Desktop component (JAD) provided with OCAF. - -@subsection occt_ocaf_11_1 Implementation of Attribute Transformation in a HXX file - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} -#include - -#include -#include -#include -#include - -// This attribute implements a transformation data container -class MyPackage_Transformation : public TDF_Attribute -{ -public: - //!@ name Static methods - - //! The method returns a unique GUID of this attribute. - //! By means of this GUID this attribute may be identified - //! among other attributes attached to the same label. - Standard_EXPORT static const Standard_GUID& GetID (); - - //! Finds or creates the attribute attached to . - //! The found or created attribute is returned. - Standard_EXPORT static Handle(MyPackage_Transformation) Set (const TDF_Label theLabel); - - //!@ name Methods for access to the attribute data - - //! The method returns the transformation. - Standard_EXPORT gp_Trsf Get () const; - - //!@ name Methods for setting the data of transformation - - //! The method defines a rotation type of transformation. - Standard_EXPORT void SetRotation (const gp_Ax1& theAxis, Standard_Real theAngle); - - //! The method defines a translation type of transformation. - Standard_EXPORT void SetTranslation (const gp_Vec& theVector); - - //! The method defines a point mirror type of transformation (point symmetry). - Standard_EXPORT void SetMirror (const gp_Pnt& thePoint); - - //! The method defines an axis mirror type of transformation (axial symmetry). - Standard_EXPORT void SetMirror (const gp_Ax1& theAxis); - - //! The method defines a point mirror type of transformation (planar symmetry). - Standard_EXPORT void SetMirror (const gp_Ax2& thePlane); - - //! The method defines a scale type of transformation. - Standard_EXPORT void SetScale (const gp_Pnt& thePoint, Standard_Real theScale); - - //! The method defines a complex type of transformation from one co-ordinate system to another. - Standard_EXPORT void SetTransformation (const gp_Ax3& theCoordinateSystem1, const gp_Ax3& theCoordinateSystem2); - - //!@ name Overridden methods from TDF_Attribute - - //! The method returns a unique GUID of the attribute. - //! By means of this GUID this attribute may be identified among other attributes attached to the same label. - Standard_EXPORT const Standard_GUID& ID () const; - - //! The method is called on Undo / Redo. - //! It copies the content of theAttribute into this attribute (copies the fields). - Standard_EXPORT void Restore (const Handle(TDF_Attribute)& theAttribute); - - //! It creates a new instance of this attribute. - //! It is called on Copy / Paste, Undo / Redo. - Standard_EXPORT Handle(TDF_Attribute) NewEmpty () const; - - //! The method is called on Copy / Paste. - //! It copies the content of this attribute into theAttribute (copies the fields). - Standard_EXPORT void Paste (const Handle(TDF_Attribute)& theAttribute, const Handle(TDF_RelocationTable)& theRelocationTable); - - //! Prints the content of this attribute into the stream. - Standard_EXPORT Standard_OStream& Dump(Standard_OStream& theOS); - - //!@ name Constructor - - //! The C++ constructor of this atribute class. - //! Usually it is never called outside this class. - Standard_EXPORT MyPackage_Transformation(); - -private: - gp_TrsfForm myType; - - // Axes (Ax1, Ax2, Ax3) - gp_Ax1 myAx1; - gp_Ax2 myAx2; - gp_Ax3 myFirstAx3; - gp_Ax3 mySecondAx3; - - // Scalar values - Standard_Real myAngle; - Standard_Real myScale; - - // Points - gp_Pnt myFirstPoint; - gp_Pnt mySecondPoint; -}; -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -@subsection occt_ocaf_11_2 Implementation of Attribute Transformation in a CPP file - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp} -#include - -//======================================================================= -//function : GetID -//purpose : The method returns a unique GUID of this attribute. -// By means of this GUID this attribute may be identified -// among other attributes attached to the same label. -//======================================================================= -const Standard_GUID& MyPackage_Transformation::GetID() -{ - static Standard_GUID ID("4443368E-C808-4468-984D-B26906BA8573"); - return ID; -} - -//======================================================================= -//function : Set -//purpose : Finds or creates the attribute attached to . -// The found or created attribute is returned. -//======================================================================= -Handle(MyPackage_Transformation) MyPackage_Transformation::Set(const TDF_Label& theLabel) -{ - Handle(MyPackage_Transformation) T; - if (!theLabel.FindAttribute(MyPackage_Transformation::GetID(), T)) - { - T = new MyPackage_Transformation(); - theLabel.AddAttribute(T); - } - return T; -} - -//======================================================================= -//function : Get -//purpose : The method returns the transformation. -//======================================================================= -gp_Trsf MyPackage_Transformation::Get() const -{ - gp_Trsf transformation; - switch (myType) - { - case gp_Identity: - { - break; - } - case gp_Rotation: - { - transformation.SetRotation(myAx1, myAngle); - break; - } - case gp_Translation: - { - transformation.SetTranslation(myFirstPoint, mySecondPoint); - break; - } - case gp_PntMirror: - { - transformation.SetMirror(myFirstPoint); - break; - } - case gp_Ax1Mirror: - { - transformation.SetMirror(myAx1); - break; - } - case gp_Ax2Mirror: - { - transformation.SetMirror(myAx2); - break; - } - case gp_Scale: - { - transformation.SetScale(myFirstPoint, myScale); - break; - } - case gp_CompoundTrsf: - { - transformation.SetTransformation(myFirstAx3, mySecondAx3); - break; - } - case gp_Other: - { - break; - } - } - return transformation; -} - -//======================================================================= -//function : SetRotation -//purpose : The method defines a rotation type of transformation. -//======================================================================= -void MyPackage_Transformation::SetRotation(const gp_Ax1& theAxis, const Standard_Real theAngle) -{ - Backup(); - myType = gp_Rotation; - myAx1 = theAxis; - myAngle = theAngle; -} - -//======================================================================= -//function : SetTranslation -//purpose : The method defines a translation type of transformation. -//======================================================================= -void MyPackage_Transformation::SetTranslation(const gp_Vec& theVector) -{ - Backup(); - myType = gp_Translation; - myFirstPoint.SetCoord(0, 0, 0); - mySecondPoint.SetCoord(theVector.X(), theVector.Y(), theVector.Z()); -} - -//======================================================================= -//function : SetMirror -//purpose : The method defines a point mirror type of transformation -// (point symmetry). -//======================================================================= -void MyPackage_Transformation::SetMirror(const gp_Pnt& thePoint) -{ - Backup(); - myType = gp_PntMirror; - myFirstPoint = thePoint; -} - -//======================================================================= -//function : SetMirror -//purpose : The method defines an axis mirror type of transformation -// (axial symmetry). -//======================================================================= -void MyPackage_Transformation::SetMirror(const gp_Ax1& theAxis) -{ - Backup(); - myType = gp_Ax1Mirror; - myAx1 = theAxis; -} - -//======================================================================= -//function : SetMirror -//purpose : The method defines a point mirror type of transformation -// (planar symmetry). -//======================================================================= -void MyPackage_Transformation::SetMirror(const gp_Ax2& thePlane) -{ - Backup(); - myType = gp_Ax2Mirror; - myAx2 = thePlane; -} - -//======================================================================= -//function : SetScale -//purpose : The method defines a scale type of transformation. -//======================================================================= -void MyPackage_Transformation::SetScale(const gp_Pnt& thePoint, const Standard_Real theScale) -{ - Backup(); - myType = gp_Scale; - myFirstPoint = thePoint; - myScale = theScale; -} - -//======================================================================= -//function : SetTransformation -//purpose : The method defines a complex type of transformation -// from one co-ordinate system to another. -//======================================================================= -void MyPackage_Transformation::SetTransformation(const gp_Ax3& theCoordinateSystem1, - const gp_Ax3& theCoordinateSystem2) -{ - Backup(); - myFirstAx3 = theCoordinateSystem1; - mySecondAx3 = theCoordinateSystem2; -} - -//======================================================================= -//function : ID -//purpose : The method returns a unique GUID of the attribute. -// By means of this GUID this attribute may be identified -// among other attributes attached to the same label. -//======================================================================= -const Standard_GUID& MyPackage_Transformation::ID() const -{ - return GetID(); -} - -//======================================================================= -//function : Restore -//purpose : The method is called on Undo / Redo. -// It copies the content of -// into this attribute (copies the fields). -//======================================================================= -void MyPackage_Transformation::Restore(const Handle(TDF_Attribute)& theAttribute) -{ - Handle(MyPackage_Transformation) theTransformation = Handle(MyPackage_Transformation)::DownCast(theAttribute); - myType = theTransformation->myType; - myAx1 = theTransformation->myAx1; - myAx2 = theTransformation->myAx2; - myFirstAx3 = theTransformation->myFirstAx3; - mySecondAx3 = theTransformation->mySecondAx3; - myAngle = theTransformation->myAngle; - myScale = theTransformation->myScale; - myFirstPoint = theTransformation->myFirstPoint; - mySecondPoint = theTransformation->mySecondPoint; -} - -//======================================================================= -//function : NewEmpty -//purpose : It creates a new instance of this attribute. -// It is called on Copy / Paste, Undo / Redo. -//======================================================================= -Handle(TDF_Attribute) MyPackage_Transformation::NewEmpty() const -{ - return new MyPackage_Transformation(); -} - -//======================================================================= -//function : Paste -//purpose : The method is called on Copy / Paste. -// It copies the content of this attribute into -// (copies the fields). -//======================================================================= -void MyPackage_Transformation::Paste(const Handle(TDF_Attribute)& theAttribute, - const Handle(TDF_RelocationTable)& ) const -{ - Handle(MyPackage_Transformation) theTransformation = Handle(MyPackage_Transformation)::DownCast(theAttribute); - theTransformation->myType = myType; - theTransformation->myAx1 = myAx1; - theTransformation->myAx2 = myAx2; - theTransformation->myFirstAx3 = myFirstAx3; - theTransformation->mySecondAx3 = mySecondAx3; - theTransformation->myAngle = myAngle; - theTransformation->myScale = myScale; - theTransformation->myFirstPoint = myFirstPoint; - theTransformation->mySecondPoint = mySecondPoint; -} - -//======================================================================= -//function : Dump -//purpose : Prints the content of this attribute into the stream. -//======================================================================= -Standard_OStream& MyPackage_Transformation::Dump(Standard_OStream& anOS) const -{ - anOS = "Transformation: "; - switch (myType) - { - case gp_Identity: - { - anOS = "gp_Identity"; - break; - } - case gp_Rotation: - { - anOS = "gp_Rotation"; - break; - } - case gp_Translation: - { - anOS = "gp_Translation"; - break; - } - case gp_PntMirror: - { - anOS = "gp_PntMirror"; - break; - } - case gp_Ax1Mirror: - { - anOS = "gp_Ax1Mirror"; - break; - } - case gp_Ax2Mirror: - { - anOS = "gp_Ax2Mirror"; - break; - } - case gp_Scale: - { - anOS = "gp_Scale"; - break; - } - case gp_CompoundTrsf: - { - anOS = "gp_CompoundTrsf"; - break; - } - case gp_Other: - { - anOS = "gp_Other"; - break; - } - } - return anOS; -} - -//======================================================================= -//function : MyPackage_Transformation -//purpose : A constructor. -//======================================================================= -MyPackage_Transformation::MyPackage_Transformation():myType(gp_Identity){ - -} -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -@subsection occt_ocaf_11_3 Implementation of typical actions with standard OCAF attributes. - -There are four sample files provided in the directory 'OpenCasCade/ros/samples/ocafsamples'. They present typical actions with OCAF services (mainly for newcomers). -The method *Sample()* of each file is not dedicated for execution 'as is', it is rather a set of logical actions using some OCAF services. - -### TDataStd_Sample.cxx -This sample contains templates for typical actions with the following standard OCAF attributes: -- Starting with data framework; -- TDataStd_Integer attribute management; -- TDataStd_RealArray attribute management; -- TDataStd_Comment attribute management; -- TDataStd_Name attribute management; -- TDataStd_UAttribute attribute management; -- TDF_Reference attribute management; -- TDataXtd_Point attribute management; -- TDataXtd_Plane attribute management; -- TDataXtd_Axis attribute management; -- TDataXtd_Geometry attribute management; -- TDataXtd_Constraint attribute management; -- TDataStd_Directory attribute management; -- TDataStd_TreeNode attribute management. - -### TDocStd_Sample.cxx -This sample contains template for the following typical actions: -- creating application; -- creating the new document (document contains a framework); -- retrieving the document from a label of its framework; -- filling a document with data; -- saving a document in the file; -- closing a document; -- opening the document stored in the file; -- copying content of a document to another document with possibility to update the copy in the future. - -### TPrsStd_Sample.cxx -This sample contains template for the following typical actions: -- starting with data framework; -- setting the TPrsStd_AISViewer in the framework; -- initialization of aViewer; -- finding TPrsStd_AISViewer attribute in the DataFramework; -- getting AIS_InteractiveContext from TPrsStd_AISViewer; -- adding driver to the map of drivers; -- getting driver from the map of drivers; -- setting TNaming_NamedShape to \; -- setting the new TPrsStd_AISPresentation to \; -- displaying; -- erasing; -- updating and displaying presentation of the attribute to be displayed; -- setting a color to the displayed attribute; -- getting transparency of the displayed attribute; -- modify attribute; -- updating presentation of the attribute in viewer. - -### TNaming_Sample.cxx -This sample contains template for typical actions with OCAF Topological Naming services. -The following scenario is used: -- data framework initialization; -- creating Box1 and pushing it as PRIMITIVE in DF; -- creating Box2 and pushing it as PRIMITIVE in DF; -- moving Box2 (applying a transformation); -- pushing the selected edges of the top face of Box1 in DF; -- creating a Fillet (using the selected edges) and pushing the result as a modification of Box1; -- creating a Cut (Box1, Box2) as a modification of Box1 and push it in DF; -- recovering the result from DF. - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/step/step.md opencascade-7.5.1+dfsg1/dox/user_guides/step/step.md --- opencascade-7.4.1+dfsg1/dox/user_guides/step/step.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/step/step.md 2021-02-02 08:51:56.000000000 +0000 @@ -1,4 +1,4 @@ -STEP processor {#occt_user_guides__step} +STEP Translator {#occt_user_guides__step} ======================== @tableofcontents @@ -22,9 +22,7 @@ @ref occt_user_guides__shape_healing "Shape Healing" toolkit provides tools to heal various problems, which may be encountered in translated shapes, and to make them valid in Open CASCADE. The Shape Healing is smoothly connected to STEP translator using the same API, only the names of API packages change. -For testing the STEP component in DRAW Test Harness, a set of commands for reading and writing STEP files and analysis of relevant data are provided by the *TKXSDRAW* plugin. - -See also our E-learning & Training offerings. +For testing the STEP component in DRAW Test Harness, a set of commands for reading and writing STEP files and analysis of relevant data are provided by the *TKXSDRAW* plugin. @subsection occt_step_1_1 STEP Exchanges in Open Cascade technology @@ -406,6 +404,47 @@ ~~~~~ Default value is 1 (ON). +

read.step.constructivegeom.relationship:

+ +Boolean flag regulating translation of "CONSTRUCTIVE_GEOMETRY_REPRESENTATION_RELATIONSHIP" entities that define +position of constructive geometry entities contained in "CONSTRUCTIVE_GEOMETRY_REPRESENTATION" with respect to the +main representation of the shape (product). + +By default, the flag is set to 0 (OFF) so these entities are not translated. +Set this flag to 1 (ON) if you need to translate constructive geometry entities associated with the parts: + +~~~~~ +if (!Interface_Static::SetIVal("read.step.constructivegeom.relationship", 1)) { .. error .. } +~~~~~ + +The "CONSTRUCTIVE_GEOMETRY_REPRESENTATION" entity is translated into compound of two unlimited planar faces, +whose location is result of translation of corresponding "AXIS_PLACEMENT" entity. +Note that appropriate interpretation of the translated data should be done after translation. + +The result of translation can be obtained either for the "CONSTRUCTIVE_GEOMETRY_REPRESENTATION_RELATIONSHIP" entity, +of for each of the two "AXIS2_PLACEMENT_3D" entities referenced by it. as follows: + +~~~~~ + STEPControl_Reader aReader; + ... // translate file and parse STEP model to find relevant axis entity + Handle(StepGeom_Axis2Placement3d) aSTEPAxis = ...; + Handle(Transfer_Binder) aBinder = aReader->WS()->TransferReader()->TransientProcess()->Find(aSTEPAxis); + Handle(TransferBRep_ShapeBinder) aShBinder = Handle(TransferBRep_ShapeBinder)::DownCast(aBinder); + if (! aShBinder.IsNull()) + { + TopoDS_Face aFace = TopoDS::Face (aShBinder->Result()); + if (! aFace.IsNull()) + { + Handle(Geom_Plane) aSurf = Handle(Geom_Plane)::DownCast (BRep_Tool::Surface (aFace)); + if (! aSurf.IsNull()) + { + gp_Ax3 anAxis = aSurf->Placement(); + ... // use the axis placement data + } + } + } +~~~~~ + @subsubsection occt_step_2_3_4 Performing the STEP file translation Perform the translation according to what you want to translate. You can choose either root entities (all or selected by the number of root), or select any entity by its number in the STEP file. There is a limited set of types of entities that can be used as starting entities for translation. Only the following entities are recognized as transferable: Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/tobj/images/tobj_image003.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/tobj/images/tobj_image003.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/tobj/images/tobj_image004.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/tobj/images/tobj_image004.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/tobj/images/tobj_image005.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/tobj/images/tobj_image005.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/tobj/images/tobj_image006.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/tobj/images/tobj_image006.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/tobj/images/tobj_image007.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/tobj/images/tobj_image007.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/dox/user_guides/tobj/images/tobj_image008.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/dox/user_guides/tobj/images/tobj_image008.png differ diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/tobj/tobj.md opencascade-7.5.1+dfsg1/dox/user_guides/tobj/tobj.md --- opencascade-7.4.1+dfsg1/dox/user_guides/tobj/tobj.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/tobj/tobj.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,910 +0,0 @@ -TObj Package {#occt_user_guides__tobj} -================== - -@tableofcontents - -@section occt_tobj_1 Introduction - -This document describes the package TObj, which is an add-on -to the Open CASCADE Application Framework (OCAF). - -This package provides a set of classes and auxiliary tools facilitating -the creation of object-oriented data models on top of low-level OCAF data structures. -This includes: - - * Definition of classes representing data objects. Data objects store their data using primitive OCAF attributes, taking advantage of OCAF mechanisms for Undo/Redo and persistence. At the same time they provide a higher level abstraction over the pure OCAF document structure (labels / attributes). - * Organization of the data model as a hierarchical (tree-like) structure of objects. - * Support of cross-references between objects within one model or among different models. In case of cross-model references the models should depend hierarchically. - * Persistence mechanism for storing *TObj* objects in OCAF files, which allows storing and retrieving objects of derived types without writing additional code to support persistence. - -This document describes basic principles of logical and physical organization -of TObj-based data models and typical approaches to implementation of classes representing model objects. - -@subsection occt_tobj_1_1 Applicability - -The main purpose of the *TObj* data model is rapid development -of the object-oriented data models for applications, using the existing -functionality provided by OCAF (Undo/Redo and persistence) -without the necessity to redevelop such functionality from scratch. - -As opposed to using bare OCAF (at the level of labels and attributes), -TObj facilitates dealing with higher level abstracts, which are closer -to the application domain. It works best when the application data are naturally -organized in hierarchical structures, and is especially useful for complex data -models with dependencies between objects belonging to different parts of the model. - -It should be noted that *TObj* is efficient for representing data structures containing -a limited number of objects at each level of the data structure (typically less than 1000). -A greater number of objects causes performance problems due to list-based organization of OCAF documents. Therefore, other methods of storage, such as arrays, are advisable for data models or their sub-parts containing a great number of uniform objects. However, these methods -can be combined with the usage of *TObj* to represent the high-level structure of the model. - -@section occt_tobj_2 TObj Model - -@subsection occt_tobj_2_1 TObj Model structure - -In the *TObj* data model the data are separated from the interfaces that manage them. - -It should be emphasized that *TObj* package defines only the interfaces and the basic structure of the model and objects, while the actual contents and structure of the model of a particular application are defined by its specific classes inherited from *TObj* classes. The implementation can add its own features or even change the default behaviour and the data layout, though this is not recommended. - -Logically the *TObj* data model is represented as a tree of model objects, with upper-level objects typically being collections of other objects (called *partitions*, represented by the class *TObj_Partition*). The root object of the model is called the *Main partition* and is maintained by the model itself. This partition contains a list of sub-objects called its *children* each sub-object may contain its own children (according to its type), etc. - -@figure{/user_guides/tobj/images/tobj_image003.png,"TObj Data Model",240} - -As the *TObj* Data Model is based on OCAF (Open CASCADE Application Framework) technology, -it stores its data in the underlying OCAF document. The OCAF document consists of a tree of -items called *labels*. Each label has some data attached to it in the form of *attributes*, -and may contain an arbitrary number of sub-labels. Each sub-label is identified by its sequential -number called the *tag*. The complete sequence of tag numbers of the label -and its parents starting from the document root constitutes the complete *entry* -of the label, which uniquely identifies its position in the document. - -Generally the structure of the OCAF tree of the *TObj* data -model corresponds to the logical structure of the model and can be presented as in the following picture: - -@figure{/user_guides/tobj/images/tobj_image004.png,"TObj Data Model mapped on OCAF document",360} - -All data of the model are stored in the root label (0:1) of the OCAF document. -An attribute *TObj_TModel* is located in this root label. It -stores the object of type *TObj_Model*. This object serves as a main interface tool -to access all data and functionalities of the data model. - -In simple cases all data needed by the application may be -contained in a single data model. Moreover, *TObj* gives the possibility to -distribute the data between several interconnected data models. This can be -especially useful for the applications dealing with great amounts of data. because -only the data required for the current operation is loaded in the memory at one time. -It is presumed that the models have a hierarchical (tree-like) structure, -where the objects of the child models can refer to the objects of the parent -models, not vice-versa. Provided that the correct order of loading and closing -of the models is ensured, the *TObj* classes will maintain references between the objects automatically. - -@subsection occt_tobj_2_2 Data Model basic features - -The class *TObj_Model* describing the data model provides the following functionalities: - - * Loading and saving of the model from or in a file (methods *Load* and *Save*) - * Closing and removal of the model from memory (method *Close*) - * Definition of the full file name of the persistence storage for this model (method *GetFile*) - * Tools to organize data objects in partitions and iterate on objects (methods *GetObjects*, *GetMainPartition*, *GetChildren*, *getPartition*, *getElementPartition*) - * Mechanism to give unique names to model objects - * Copy (*clone*) of the model (methods *NewEmpty* and *Paste*) - * Support of earlier model formats for proper conversion of a model loaded from a file written by a previous version of the application (methods *GetFormatVersion* and *SetFormatVersion*) - * Interface to check and update the model if necessary (method *Update*) - * Support of several data models in one application. For this feature use OCAF multi-transaction manager, unique names and GUIDs of the data model (methods *GetModelName*, *GetGUID*) - -@subsection occt_tobj_2_3 Model Persistence - -The persistent representation of any OCAF model is contained in an XML or a binary file, -which is defined by the format string returned by the method *GetFormat*. -The default implementation works with a binary OCAF document format (*BinOcaf*). -The other available format is *XmlOcaf*. The class **TObj_Model** declares and provides a default -implementation of two virtual methods: - -~~~~~{.cpp} - virtual Standard_Boolean Load (const char* theFile); - virtual Standard_Boolean SaveAs (const char* theFile); -~~~~~ - -which retrieve and store the model from or -in the OCAF file. The descendants -should define the following protected method to support Load and Save operations: - -~~~~~{.cpp} - virtual Standard_Boolean initNewModel (const Standard_Boolean IsNew); -~~~~~ - -This method is called by *Load* after creation of a new model -or after its loading from the file; its purpose is to perform -the necessary initialization of the model (such as creation of necessary top-level -partitions, model update due to version changes etc.). Note that if -the specified file does not exist, method *Load* will create -a new document and call *initNewModel* with the argument **True**. -If the file has been normally loaded, the argument **False** is passed. -Thus, a new empty *TObj* model is created by calling *Load* with an empty -string or the path to a nonexistent file as argument. - -The method *Load* returns **True** if the model has been retrieved successfully -(or created a new), or **False** if the model could not be loaded. -If no errors have been detected during initialization (model retrieval or creation), -the virtual method *AfterRetrieval* is invoked for all objects of the model. -This method initializes or updates the objects immediately after the model initialization. -It could be useful when some object data should be imported from an OCAF attribute into transient -fields which could be changed outside of the OCAF transaction mechanism. -Such fields can be stored into OCAF attributes for saving into persistent storage during the save operation. - -To avoid memory leaks, the *TObj_Model* class destructor invokes *Close* method -which clears the OCAF document and removes all data from memory before the model is destroyed. - -For XML and binary persistence of the *TObj* data model the corresponding drivers are implemented -in *BinLDrivers*, *BinMObj* and *XmlLDrivers*, *XmlMObj* packages. -These packages contain retrieval and storage drivers for the model, model objects and custom attributes -from the *TObj* package. The schemas support persistence for the standard OCAF and *TObj* attributes. -This is sufficient for the implementation of simple data models, but -in some cases it can be reasonable to add specific OCAF attributes to -facilitate the storage of the data specific to the application. -In this case the schema should be extended using the standard OCAF mechanism. - -@subsection occt_tobj_2_4 Access to the objects in the model - -All objects in the model are stored in the main partition and accessed by iterators. -To access all model objects use: - -~~~~~{.cpp} - virtual Handle(TObj_ObjectIterator) GetObjects () const; -~~~~~ - -This method returns a recursive iterator on all objects stored in the model. - -~~~~~{.cpp} - virtual Handle(TObj_ObjectIterator) GetChildren () const; -~~~~~ - -This method returns an iterator on child objects of the main partition. -Use the following method to get the main partition: - -~~~~~{.cpp} - Handle(TObj_Partition) GetMainPartition() const; -~~~~~ - -To receive the iterator on objects of a specific type *AType* use the following call: - -~~~~~{.cpp} - GetMainPartition()->GetChildren(STANDARD_TYPE(AType) ); -~~~~~ - -The set of protected methods is provided for descendant classes to deal with partitions: - -~~~~~{.cpp} - virtual Handle(TObj_Partition) getPartition (const TDF_Label, const Standard_Boolean theHidden) const; -~~~~~ - -This method returns (creating if necessary) a partition in the specified label of the document. -The partition can be created as hidden (*TObj_HiddenPartition* class). -A hidden partition can be useful to distinguish the data that -should not be visible to the user when browsing the model in the application. - -The following two methods allow getting (creating) a partition -in the sub-label of the specified label in the document -(the label of the main partition for the second method) and with the given name: - -~~~~~{.cpp} - virtual Handle(TObj_Partition) getPartition (const TDF_Label, const Standard_Integer theIndex, const TCollection_ExtendedString& theName, const Standard_Boolean theHidden) const; - virtual Handle(TObj_Partition) getPartition (const Standard_Integer theIndex, const TCollection_ExtendedString& theName, const Standard_Boolean theHidden) const; -~~~~~ - -If the default object naming and the name register mechanism -is turned on, the object can be found in the model by its unique name: - -~~~~~{.cpp} - Handle(TObj_Object) FindObject (const Handle(TCollection_HExtendedString)& theName, const Handle(TObj_TNameContainer)& theDictionary) const; -~~~~~ - -@subsection occt_tobj_2_5 Own model data - -The model object can store its own data in the Data label -of its main partition, however, there is no standard API for -setting and getting these data types. The descendants can add -their own data using standard OCAF methods. The enumeration DataTag is defined -in *TObj_Model* to avoid conflict of data labels used by this class -and its descendants, similarly to objects (see below). - -@subsection occt_tobj_2_6 Object naming - -The basic implementation of *TObj_Model* provides the default -naming mechanism: all objects must have unique names, -which are registered automatically in the data model dictionary. -The dictionary is a *TObj_TNameContainer* -attribute whose instance is located in the model root label. -If necessary, the developer can add several dictionaries into -the specific partitions, providing the name registration in the -correct name dictionary and restoring the name map after document is loaded from file. -To ignore name registering it is necessary to redefine the methods *SetName*, -*AfterRetrieval* of the *TObj_Object* class and skip the registration of the object name. -Use the following methods for the naming mechanism: - -~~~~~{.cpp} - Standard_Boolean IsRegisteredName (const Handle(TCollection_HExtendedString)& theName, const Handle(TObj_TNameContainer)& theDictionary ) const; -~~~~~ - -Returns **True** if the object name is already registered in the indicated (or model) dictionary. - -~~~~~{.cpp} - void RegisterName (const Handle(TCollection_HExtendedString)& theName, const TDF_Label& theLabel, const Handle(TObj_TNameContainer)& theDictionary ) const; -~~~~~ - -Registers the object name with the indicated label where the object -is located in the OCAF document. Note that the default implementation -of the method *SetName* of the object registers the new name automatically -(if the name is not yet registered for any other object) - -~~~~~{.cpp} - void UnRegisterName (const Handle(TCollection_HExtendedString)& theName, const Handle(TObj_TNameContainer)& theDictionary ) const; -~~~~~ - -Unregisters the name from the dictionary. Ther names of *TObj* model -objects are removed from the dictionary when the objects are deleted from the model. - -~~~~~{.cpp} - Handle(TObj_TNameContainer) GetDictionary() const; -~~~~~ - -Returns a default instance of the model dictionary (located at the model root label). -The default implementation works only with one dictionary. -If there are a necessity to have more than one dictionary for the model objects, -it is recommended to redefine the corresponding virtual method of TObj_Object -that returns the dictionary where names of objects should be registered. - -@subsection occt_tobj_2_7 API for transaction mechanism - -Class *TObj_Model* provides the API for transaction mechanism (supported by OCAF): - -~~~~~{.cpp} - Standard_Boolean HasOpenCommand() const; -~~~~~ - -Returns True if a Command transaction is open - -~~~~~{.cpp} - void OpenCommand() const; -~~~~~ - -Opens a new command transaction. - -~~~~~{.cpp} - void CommitCommand() const; -~~~~~ - -Commits the Command transaction. Does nothing If there is no open Command transaction. - -~~~~~{.cpp} - void AbortCommand() const; -~~~~~ - -Aborts the Command transaction. Does nothing if there is no open Command transaction. - -~~~~~{.cpp} - Standard_Boolean IsModified() const; -~~~~~ - -Returns True if the model document has a modified status (has changes after the last save) - -~~~~~{.cpp} - void SetModified( const Standard_Boolean ); -~~~~~ - -Changes the modified status by force. For synchronization of transactions -within several *TObj_Model* documents use class *TDocStd_MultiTransactionManager*. - -@subsection occt_tobj_28 Model format and version - -Class *TObj_Model* provides the descendant classes with a means to control -the format of the persistent file by choosing the schema used to store or retrieve operations. - -~~~~~{.cpp} - virtual TCollection_ExtendedString GetFormat () const; -~~~~~ - -Returns the string *TObjBin* or *TObjXml* indicating -the current persistent mechanism. The default value is *TObjBin*. -Due to the evolution of functionality of the developed application, -the contents and the structure of its data model vary from version to version. -*TObj* package provides a basic mechanism supporting backward versions compatibility, -which means that newer versions of the application will be able to read -Data Model files created by previous versions (but not vice-versa) with a minimum loss of data. -For each type of Data Model, all known versions of the data format -should be enumerated in increasing order, incremented with every change -of the model format. The current version of the model -format is stored in the model file and can be checked upon retrieval. - -~~~~~{.cpp} - Standard_Integer GetFormatVersion() const; -~~~~~ - -Returns the format version stored in the model file - -~~~~~{.cpp} - void SetFormatVersion(const Standard_Integer theVersion); -~~~~~ - -Defines the format version used for save. - -Upon loading a model, the method *initNewModel()*, called immediately -after opening a model from disk (on the level of the OCAF document), -provides a specific code that checks the format version stored in that model. -If it is older than the current version of the application, the data update can be performed. -Each model can have its own specific conversion code -that performs the necessary data conversion to make them compliant with the current version. - -When the conversion ends the user is advised of that by the messenger interface -provided by the model (see messaging chapter for more details), -and the model version is updated. If the version of data model is not supported -(it is newer than the current or too old), the load operation should fail. -The program updating the model after version change can be implemented as static -methods directly in C++ files of the corresponding Data Model classes, -not exposing it to the other parts of the application. -These codes can use direct access to the model and objects data (attributes) -not using objects interfaces, because the data model API and object classes -could have already been changed. - -Note that this mechanism has been designed to maintain version compatibility -for the changes of data stored in the model, not for the changes of -low-level format of data files (such as the storage format of a specific OCAF attribute). -If the format of data files changes, a specific treatment on a case-by-case basis will be required. - -@subsection occt_tobj_2_9 Model update - -The following methods are used for model update to ensure its consistency -with respect to the other models in case of cross-model dependencies: - -~~~~~{.cpp} - virtual Standard_Boolean Update(); -~~~~~ - -This method is usually called after loading of the model. -The default implementation does nothing and returns **True**. - -~~~~~{.cpp} - virtual Standard_Boolean initNewModel( const Standard_Boolean IsNew); -~~~~~ - -This method performs model initialization, check and updates (as described above). - -~~~~~{.cpp} - virtual void updateBackReferences( const Handle(TObj_Object)& theObj); -~~~~~ - -This method is called from the previous method to update back references -of the indicated object after the retrieval of the model from file -(see data model - object relationship chapter for more details) - -@subsection occt_tobj_2_10 Model copying - -To copy the model between OCAF documents use the following methods: - -~~~~~{.cpp} - virtual Standard_Boolean Paste (Handle(TObj_Model) theModel, Handle(TDF_RelocationTable) theRelocTable = 0 ); -~~~~~ - -Pastes the current model to the new model. The relocation table -ensures correct copying of the sub-data shared by several parts of the model. -It stores a map of processed original objects of relevant types in their copies. - -~~~~~{.cpp} - virtual Handle(TObj_Model) NewEmpty() = 0; -~~~~~ - -Redefines a pure virtual method to create a new empty instance of the model. - -~~~~~{.cpp} - void CopyReferences ( const Handle(TObj_Model)& theTarget, const Handle(TDF_RelocationTable)& theRelocTable); -~~~~~ - -Copies the references from the current model to the target model. - -@subsection occt_tobj_2_11 Messaging - -The messaging is organised using Open CASCADE Messenger from the package Message. -The messenger is stored as the field of the model instance -and can be set and retrieved by the following methods: - -~~~~~{.cpp} - void SetMessenger( const Handle(Message_Messenger)& ); - Handle(Message_Messenger) Messenger() const; -~~~~~ - -A developer should create his own instance of the Messenger -bound to the application user interface, and attribute it to the model -for future usage. In particular the messenger is used for reporting -errors and warnings in the persistence mechanism. -Each message has a unique string identifier (key). -All message keys are stored in a special resource file TObj.msg. -This file should be loaded at the start of the application -by call to the appropriate method of the class *Message_MsgFile*. - -@section occt_tobj_3 Model object - -Class *TObj_Object* provides basic interface and default implementation -of important features of *TObj* model objects. This implementation defines -basic approaches that are recommended for all descendants, -and provides tools to facilitate their usage. - -@figure{/user_guides/tobj/images/tobj_image005.png,"TObj objects hierarchy",170} - -@subsection occt_tobj_3_1 Separation of data and interface - -In the *TObj* data model, the data are separated from the interfaces that manage them. -The data belonging to a model object are stored in its root label and sub-labels -in the form of standard OCAF attributes. This allows using standard OCAF mechanisms -for work with these data, and eases the implementation of the persistence mechanism. - -The instance of the interface which serves as an API for managing object data -(e.g. represents the model object) is stored in the root label of the object, -and typically does not bring its own data. The interface classes are organized in a hierarchy -corresponding to the natural hierarchy of the model objects according to the application. - -In the text below the term 'object' is used to denote either the instance -of the interface class or the object itself (both interface and data stored in OCAF). - -The special type of attribute *TObj_TObject* is used for storing instances of objects interfaces -in the OCAF tree. *TObj_TObject* is a simple container for the object of type *TObj_Object*. -All objects (interfaces) of the data model inherit this class. - -@figure{/user_guides/tobj/images/tobj_image006.png,"TObj object stored on OCAF label",360} - - -@subsection occt_tobj_3_2 Basic features - -The *TObj_Object* class provides some basic features that can be inherited (or, if necessary, redefined) by the descendants: - - * Gives access to the model to which the object belongs (method *GetModel*) and to the OCAF label in which the object is stored (method *GetLabel*). - * Supports references (and back references) to other objects in the same or in another model (methods *getReference*, *setReference*, *addReference*, *GetReferences*, *GetBackReferences*, *AddBackReference*, *RemoveBackReference*, *ReplaceReference*) - * Provides the ability to contain child objects, as it is actual for partition objects (methods *GetChildren*, *GetFatherObject*) - * Organizes its data in the OCAF structure by separating the sub-labels of the main label intended for various kinds of data and providing tools to organize these data (see below). The kinds of data stored separately are: - * Child objects stored in the label returned by the method *GetChildLabel* - * References to other objects stored in the label returned by the method *GetReferenceLabel* - * Other data, both common to all objects and specific for each subtype of the model object, are stored in the label returned by the method *GetDataLabel* - * Provides unique names of all objects in the model (methods *GetDictionary*, *GetName*, *SetName*) - * Provides unified means to maintain persistence (implemented in descendants with the help of macros *DECLARE_TOBJOCAF_PERSISTENCE* and *IMPLEMENT_TOBJOCAF_PERSISTENCE*) - * Allows an object to remove itself from the OCAF document and check the depending objects can be deleted according to the back references (method *Detach*) - * Implements methods for identification and versioning of objects - * Manages the object interaction with OCAF Undo/Redo mechanism (method *IsAlive*, *AfterRetrieval*, *BeforeStoring*) - * Allows make a clone (methods *Clone*, *CopyReferences*, *CopyChildren*, *copyData*) - * Contains additional word of bit flags (methods *GetFlags*, *SetFlags*, *TestFlags*, *ClearFlags*) - * Defines the interface to sort the objects by rank (methods *GetOrder*, *SetOrder*) - * Provides a number of auxiliary methods for descendants to set/get the standard attribute values, such as int, double, string, arrays etc. - -An object can be received from the model by the following methods: - -~~~~~{.cpp} - static Standard_Boolean GetObj ( const TDF_Label& theLabel, Handle(TObj_Object)& theResObject, const Standard_Boolean isSuper = Standard_False ); -~~~~~ - -Returns *True* if the object has been found in the indicated label (or in the upper level label if *isSuper* is *True*). - -~~~~~{.cpp} - Handle(TObj_Object) GetFatherObject ( const Handle(Standard_Type)& theType = NULL ) const; -~~~~~ - -Returns the father object of the indicated type -for the current object (the direct father object if the type is NULL). - -@subsection occt_tobj_3_3 Data layout and inheritance - -As far as the data objects are separated from the interfaces and stored in the OCAF tree, -the functionality to support inheritance is required. Each object has its own data -and references stored in the labels in the OCAF tree. All data are stored in the sub-tree -of the main object label. If it is necessary to inherit a class from the base class, -the descendant class should use different labels for data and references than its ancestor. - -Therefore each *TObj* class can reserve the range of tags in each of -*Data*, *References*, and *Child* sub-labels. -The reserved range is declared by the enumeration defined -in the class scope (called DataTag, RefTag, and ChildTag, respectively). -The item *First* of the enumeration of each type is defined via the *Last* item -of the corresponding enumeration of the parent class, thus ensuring that the tag numbers -do not overlap. The item *Last* of the enumeration defines the last tag reserved by this class. -Other items of the enumeration define the tags used for storing particular data items of the object. -See the declaration of the TObj_Partition class for the example. - -*TObj_Object* class provides a set of auxiliary methods for descendants -to access the data stored in sub-labels by their tag numbers: - -~~~~~{.cpp} - TDF_Label getDataLabel (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; - TDF_Label getReferenceLabel (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; -~~~~~ - -Returns the label in *Data* or *References* sub-labels at a given tag number (theRank1). -The second argument, theRank2, allows accessing the next level of hierarchy -(theRank2-th sub-label of theRank1-th data label). -This is useful when the data to be stored are represented by multiple OCAF attributes -of the same type (e.g. sequences of homogeneous data or references). - -The get/set methods allow easily accessing the data located in the specified data label -for the most widely used data types (*Standard_Real*, *Standard_Integer*, *TCollection_HExtendedString*, - *TColStd_HArray1OfReal*, *TColStd_HArray1OfInteger*, *TColStd_HArray1OfExtendedString*). -For instance, methods provided for real numbers are: - -~~~~~{.cpp} - Standard_Real getReal (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; - Standard_Boolean setReal (const Standard_Real theValue, const Standard_Integer theRank1, const Standard_Integer theRank2 = 0, const Standard_Real theTolerance = 0.) const; -~~~~~ - -Similar methods are provided to access references to other objects: - -~~~~~{.cpp} - Handle(TObj_Object) getReference (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; - Standard_Boolean setReference (const Handle(TObj_Object) &theObject, const Standard_Integer theRank1, const Standard_Integer theRank2 = 0); -~~~~~ - -The method *addReference* gives an easy way to store a sequence of homogeneous references in one label. - -~~~~~{.cpp} - TDF_Label addReference (const Standard_Integer theRank1, const Handle(TObj_Object) &theObject); -~~~~~ - -Note that while references to other objects should be defined by descendant classes -individually according to the type of object, *TObj_Object* provides methods -to manipulate (check, remove, iterate) the existing references in the uniform way, as described below. - -@subsection occt_tobj_3_4 Persistence - -The persistence of the *TObj* Data Model is implemented with the help -of standard OCAF mechanisms (a schema defining necessary plugins, drivers, etc.). -This implies the possibility to store/retrieve all data that are stored -as standard OCAF attributes., The corresponding handlers are added -to the drivers for *TObj*-specific attributes. - -The special tool is provided for classes inheriting from *TObj_Object* -to add the new types of persistence without regeneration of the OCAF schema. -The class *TObj_Persistence* provides basic means for that: - - * automatic run-time registration of object types - * creation of a new object of the specified type (one of the registered types) - -Two macros defined in the file TObj_Persistence.hxx have to be included in the definition -of each model object class inheriting TObj_Object to activate the persistence mechanism: - -~~~~~{.cpp} - DECLARE_TOBJOCAF_PERSISTENCE (classname, ancestorname) -~~~~~ - -Should be included in the private section of declaration of each class inheriting -*TObj_Object* (hxx file). This macro adds an additional constructor to the object class, -and declares an auxiliary (private) class inheriting *TObj_Persistence* -that provides a tool to create a new object of the proper type. - -~~~~~{.cpp} - IMPLEMENT_TOBJOCAF_PERSISTENCE (classname) -~~~~~ - -Should be included in .cxx file of each object class that should be saved and restored. -This is not needed for abstract types of objects. This macro implements the functions -declared by the previous macro and creates a static member -that automatically registers that type for persistence. - -When the attribute *TObj_TObject* that contains the interface object is saved, -its persistence handler stores the runtime type of the object class. -When the type is restored the handler dynamically recognizes the type -and creates the corresponding object using mechanisms provided by *TObj_Persistence*. - -@subsection occt_tobj_3_5 Names of objects - -All *TObj* model objects have names by which the user can refer to the object. -Upon creation, each object receives a default name, constructed -from the prefix corresponding to the object type (more precisely, the prefix is defined -by the partition to which the object belongs), and the index of the object in the current partition. -The user has the possibility to change this name. The uniqueness of the name in the model is ensured -by the naming mechanism (if the name is already used, it cannot be attributed to another object). -This default implementation of *TObj* package works with a single instance of the name container (dictionary) -for name registration of objects and it is enough in most simple projects. -If necessary, it is easy to redefine a couple of object methods -(for instance *GetDictionary*()) and to take care of construction and initialization of containers. - -This functionality is provided by the following methods: - -~~~~~{.cpp} - virtual Handle(TObj_TNameContainer) GetDictionary() const; -~~~~~ - -Returns the name container where the name of object should be registered. -The default implementation returns the model name container. - -~~~~~{.cpp} - Handle(TCollection_HExtendedString) GetName() const; - Standard_Boolean GetName( TCollection_ExtendedString& theName ) const; - Standard_Boolean GetName( TCollection_AsciiString& theName ) const; -~~~~~ - -Returns the object name. The methods with in / out argument return False if the object name is not defined. - -~~~~~{.cpp} - virtual Standard_Boolean SetName ( const Handle(TCollection_HExtendedString)& theName ) const; - Standard_Boolean SetName ( const Handle(TCollection_HAsciiString)& theName ) const; - Standard_Boolean SetName ( const Standard_CString theName ) const; -~~~~~ - -Attributes a new name to the object and returns **True** if the name has been attributed successfully. -Returns False if the name has been already attributed to another object. -The last two methods are short-cuts to the first one. - -@subsection occt_tobj_3_6 References between objects - -Class *TObj_Object* allows creating references to other objects in the model. -Such references describe relations among objects which are not adequately reflected -by the hierarchical objects structure in the model (parent-child relationship). - -The references are stored internally using the attribute TObj_TReference. -This attribute is located in the sub-label of the referring object (called *master*) -and keeps reference to the main label of the referred object. -At the same time the referred object can maintain the back reference to the master object. - -@figure{/user_guides/tobj/images/tobj_image007.png,"Objects relationship",360} - - - -The back references are stored not in the OCAF document but as a transient field -of the object; they are created when the model is restored from file, -and updated automatically when the references are manipulated. -The class *TObj_TReference* allows storing references between objects -from different *TObj* models, facilitating the construction of complex relations between objects. - -The most used methods for work with references are: - -~~~~~{.cpp} - virtual Standard_Boolean HasReference( const Handle(TObj_Object)& theObject) const; -~~~~~ - -Returns True if the current object refers to the indicated object. - -~~~~~{.cpp} - virtual Handle(TObj_ObjectIterator) GetReferences ( const Handle(Standard_Type)& theType = NULL ) const; -~~~~~ - -Returns an iterator on the object references. The optional argument *theType* -restricts the types of referred objects, or does not if it is NULL. - -~~~~~{.cpp} - virtual void RemoveAllReferences(); -~~~~~ - -Removes all references from the current object. - -~~~~~{.cpp} - virtual void RemoveReference( const Handle(TObj_Object)& theObject ); -~~~~~ - -Removes the reference to the indicated object. - -~~~~~{.cpp} - virtual Handle(TObj_ObjectIterator) GetBackReferences ( const Handle(Standard_Type)& theType = NULL ) const; -~~~~~ - -Returns an iterator on the object back references. -The argument theType restricts the types of master objects, or does not if it is NULL. - -~~~~~{.cpp} - virtual void ReplaceReference ( const Handle(TObj_Object)& theOldObject, const Handle(TObj_Object)& theNewObject ); -~~~~~ - -Replaces the reference to theOldObject by the reference to *theNewObject*. -The handle theNewObject may be NULL to remove the reference. - -~~~~~{.cpp} - virtual Standard_Boolean RelocateReferences ( const TDF_Label& theFromRoot, const TDF_Label& theToRoot, const Standard_Boolean theUpdateackRefs = Standard_True ); -~~~~~ - -Replaces all references to a descendant label of *theFromRoot* -by the references to an equivalent label under *theToRoot*. -Returns **False** if the resulting reference does not point at a *TObj_Object*. -Updates back references if theUpdateackRefs is **True**. - -~~~~~{.cpp} - virtual Standard_Boolean CanRemoveReference ( const Handle(TObj_Object)& theObj) const; -~~~~~ - -Returns **True** if the reference can be removed and the master object -will remain valid (*weak* reference). -Returns **False** if the master object cannot be valid without the referred object (*strong* reference). -This affects the behaviour of objects removal from the model -- if the reference cannot be removed, -either the referred object will not be removed, or both the referred -and the master objects will be removed (depends on the deletion mode in the method **Detach**) - -@subsection occt_tobj_3_7 Creation and deletion of objects - -It is recommended that all objects inheriting from *TObj_Object* - should implement the same approach to creation and deletion. - -The object of the *TObj* data model cannot be created independently -of the model instance, as far as it stores the object data in OCAF data structures. -Therefore an object class cannot be created directly as its constructor is protected. - -Instead, each object should provide a static method *Create*(), which accepts the model, -with the label, which stores the object and other type-dependent parameters -necessary for proper definition of the object. This method creates a new object with its data -(a set of OCAF attributes) in the specified label, and returns a handle to the object's interface. - -The method *Detach*() is provided for deletion of objects from OCAF model. -Object data are deleted from the corresponding OCAF label; however, -the handle on object remains valid. The only operation available after object deletion -is the method *IsAlive*() checking whether the object has been deleted or not, -which returns False if the object has been deleted. - -When the object is deleted from the data model, the method checks -whether there are any alive references to the object. -Iterating on references the object asks each referring (master) object -whether the reference can be removed. If the master object can be unlinked, -the reference is removed, otherwise the master object will be removed too -or the referred object will be kept alive. This check is performed by the method *Detach* , -but the behavior depends on the deletion mode *TObj_DeletingMode*: - - * **TObj_FreeOnly** -- the object will be destroyed only if it is free, i.e. there are no references to it from other objects - * **TObj_KeepDepending** -- the object will be destroyed if there are no strong references to it from master objects (all references can be unlinked) - * **TObj_Force** -- the object and all depending master objects that have strong references to it will be destroyed. - -The most used methods for object removing are: - -~~~~~{.cpp} - virtual Standard_Boolean CanDetachObject (const TObj_DeletingMode theMode = TObj_FreeOnly ); -~~~~~ - -Returns **True** if the object can be deleted with the indicated deletion mode. - -~~~~~{.cpp} - virtual Standard_Boolean Detach ( const TObj_DeletingMode theMode = TObj_FreeOnly ); -~~~~~ - -Removes the object from the document if possible -(according to the indicated deletion mode). -Unlinks references from removed objects. -Returns **True** if the objects have been successfully deleted. - -@subsection occt_tobj_3_8 Transformation and replication of object data - -*TObj_Object* provides a number of special virtual methods to support replications of objects. These methods should be redefined by descendants when necessary. - -~~~~~{.cpp} - virtual Handle(TObj_Object) Clone (const TDF_Label& theTargetLabel, Handle(TDF_RelocationTable) theRelocTable = 0); -~~~~~ - -Copies the object to theTargetLabel. The new object will have all references of its original. -Returns a handle to the new object (null handle if fail). The data are copied directly, -but the name is changed by adding the postfix *_copy*. -To assign different names to the copies redefine the method: - -~~~~~{.cpp} - virtual Handle(TCollection_HExtendedString) GetNameForClone ( const Handle(TObj_Object)& ) const; -~~~~~ - -Returns the name for a new object copy. It could be useful to return the same object name -if the copy will be in the other model or in the other partition with its own dictionary. -The method *Clone* uses the following public methods for object data replications: - -~~~~~{.cpp} - virtual void CopyReferences (const const Handle(TObj_Object)& theTargetObject, const Handle(TDF_RelocationTable) theRelocTable); -~~~~~ - -Adds to the copy of the original object its references. - -~~~~~{.cpp} - virtual void CopyChildren (TDF_Label& theTargetLabel, const Handle(TDF_RelocationTable) theRelocTable); -~~~~~ - -Copies the children of an object to the target child label. - -@subsection occt_tobj_3_9 Object flags - -Each instance of *TObj_Object* stores a set of bit flags, -which facilitate the storage of auxiliary logical information assigned to the objects -(object state). Several typical state flags are defined in the enumeration *ObjectState*: - - * *ObjectState_Hidden* -- the object is marked as hidden - * *ObjectState_Saved* -- the object has (or should have) the corresponding saved file on disk - * *ObjectState_Imported* -- the object is imported from somewhere - * *ObjectState_ImportedByFile* -- the object has been imported from file and should be updated to have correct relations with other objects - * *ObjectState_Ordered* -- the partition contains objects that can be ordered. - -The user (developer) can define any new flags in descendant classes. -To set/get an object, the flags use the following methods: - -~~~~~{.cpp} - Standard_Integer GetFlags() const; - void SetFlags( const Standard_Integer theMask ); - Stadnard_Boolean TestFlags( const Standard_Integer theMask ) const; - void ClearFlags( const Standard_Integer theMask = 0 ); -~~~~~ - -In addition, the generic virtual interface stores the logical properties -of the object class in the form of a set of bit flags. -Type flags can be received by the method: - -~~~~~{.cpp} - virtual Standard_Integer GetTypeFlags() const; -~~~~~ - -The default implementation returns the flag **Visible** -defined in the enumeration *TypeFlags*. This flag is used to define visibility -of the object for the user browsing the model (see class *TObj_HiddenPartition*). -Other flags can be added by the applications. - -@subsection occt_tobj_310 Partitions - -The special kind of objects defined by the class *TObj_Partition* -(and its descendant *TObj_HiddenPartition*) is provided for partitioning -the model into a hierarchical structure. This object represents the container -of other objects. Each *TObj* model contains the main partition that is placed -in the same OCAF label as the model object, and serves as a root of the object's tree. -A hidden partition is a simple partition with a predefined hidden flag. - -The main partition object methods: - -~~~~~{.cpp} - TDF_Label NewLabel() const; -~~~~~ - -Allocates and returns a new label for creation of a new child object. - -~~~~~{.cpp} - void SetNamePrefix ( const Handle(TCollection_HExtendedString)& thePrefix); -~~~~~ - -Defines the prefix for automatic generation of names of the newly created objects. - -~~~~~{.cpp} - Handle(TCollection_HExtendedString) GetNamePrefix() const; -~~~~~ - -Returns the current name prefix. - -~~~~~{.cpp} - Handle(TCollection_HExtendedString) GetNewName ( const Standard_Boolean theIsToChangeCount) const; -~~~~~ - -Generates the new name and increases the internal counter of child objects if theIsToChangeCount is **True**. - -~~~~~{.cpp} - Standard_Integer GetLastIndex() const; -~~~~~ - -Returns the last reserved child index. - -~~~~~{.cpp} - void SetLastIndex( const Standard_Integer theIndex ); -~~~~~ - -Sets the last reserved index. - -@section occt_tobj_4 Auxiliary classes - -Apart from the model and the object, package *TObj* provides a set of auxiliary classes: - - * *TObj_Application* -- defines OCAF application supporting existence and operation with *TObj* documents. - * *TObj_Assistant* -- class provides an interface to the static data to be used during save and load operations on models. In particular, in case of cross-model dependencies it allows passing information on the parent model to the OCAF loader to correctly resolve the references when loading a dependent model. - * *TObj_TReference* -- OCAF attribute describes the references between objects in the *TObj* model(s). This attribute stores the label of the referred model object, and provides transparent cross-model references. At runtime, these references are simple Handles; in persistence mode, the cross-model references are automatically detected and processed by the persistence mechanism of *TObj_TReference* attribute. - * Other classes starting with *TObj_T...* -- define OCAF attributes used to store TObj-specific classes and some types of data on OCAF labels. - * Iterators -- a set of classes implementing *TObj_ObjectIterator* interface, used for iterations on *TObj* objects: - * *TObj_ObjectIterator* -- a basic abstract class for other *TObj* iterators. Iterates on *TObj_Object* instances. - * *TObj_LabelIterator* -- iterates on object labels in the *TObj* model document - * *TObj_ModelIterator* -- iterates on all objects in the model. Works with sequences of other iterators. - * *TObj_OcafObjectIterator* -- Iterates on *TObj* data model objects. Can iterate on objects of a specific type. - * *TObj_ReferenceIterator* -- iterates on object references. - * *TObj_SequenceIterator* -- iterates on a sequence of *TObj* objects. - * *TObj_CheckModel* -- a tool that checks the internal consistency of the model. The basic implementation checks only the consistency of references between objects. - -The structure of *TObj* iterators hierarchy is presented below: - -@figure{/user_guides/tobj/images/tobj_image008.png,"Hierarchy of iterators",420} - - -@section occt_tobj_5 Packaging - -The *TObj* sources are distributed in the following packages: - - * *TObj* -- defines basic classes that implement *TObj* interfaces for OCAF-based modelers. - * *BinLDrivers, XmlLDrivers* -- binary and XML driver of *TObj* package - * *BinLPlugin, XmlLPlugin* -- plug-in for binary and XML persistence - * *BinMObj, XmlMObj* -- binary and XML drivers to store and retrieve specific *TObj* data to or from OCAF document - * *TKBinL, TKXmlL* -- toolkits of binary and XML persistence - - - diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/user_guides.md opencascade-7.5.1+dfsg1/dox/user_guides/user_guides.md --- opencascade-7.4.1+dfsg1/dox/user_guides/user_guides.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/user_guides.md 2021-02-02 08:51:56.000000000 +0000 @@ -5,17 +5,14 @@ * @subpage occt_user_guides__foundation_classes "Foundation Classes" * @subpage occt_user_guides__modeling_data "Modeling Data" - * @subpage occt_user_guides__brep_wp "BREP format description" * @subpage occt_user_guides__modeling_algos "Modeling Algorithms" - * @subpage occt_user_guides__boolean_operations "Boolean Operations" - * @subpage occt_user_guides__shape_healing "Shape Healing" +* @subpage occt_user_guides__mesh "Mesh" +* @subpage occt_user_guides__shape_healing "Shape Healing" * @subpage occt_user_guides__visualization "Visualization" - * @subpage occt_user_guides__vis "VTK Integration Services" -* Data Exchange - * @subpage occt_user_guides__iges "IGES translator" - * @subpage occt_user_guides__step "STEP translator" - * @subpage occt_user_guides__xde "Extended Data Exchange (XDE)" +* @subpage occt_user_guides__vis "VTK Integration Services" +* @subpage occt_user_guides__iges "IGES Translator" +* @subpage occt_user_guides__step "STEP Translator" +* @subpage occt_user_guides__xde "Extended Data Exchange (XDE)" * @subpage occt_user_guides__ocaf "Open CASCADE Application Framework (OCAF)" - * @subpage occt_user_guides__tobj "TObj package" * @subpage occt_user_guides__test_harness "DRAW Test Harness" -* @subpage occt_user_guides__inspector "Inspector" \ No newline at end of file +* @subpage occt_user_guides__inspector "Inspector" diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/visualization/visualization.md opencascade-7.5.1+dfsg1/dox/user_guides/visualization/visualization.md --- opencascade-7.4.1+dfsg1/dox/user_guides/visualization/visualization.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/visualization/visualization.md 2021-02-02 08:51:56.000000000 +0000 @@ -6,15 +6,19 @@ Visualization in Open CASCADE Technology is based on the separation of: * on the one hand -- the data which stores the geometry and topology of the entities you want to display and select, and - * on the other hand -- its **presentation** (what you see when an object is displayed in a scene) and **selection** (possibility to choose the whole object or its sub-parts interactively to apply application-defined operations to the selected entities). + * on the other hand -- its **presentation** (what you see when an object is displayed in a scene) + and **selection** (possibility to choose the whole object or its sub-parts interactively to apply application-defined operations to the selected entities). Presentations are managed through the **Presentation** component, and selection through the **Selection** component. -**Application Interactive Services** (AIS) provides the means to create links between an application GUI viewer and the packages, which are used to manage selection and presentation, which makes management of these functionalities in 3D more intuitive and consequently, more transparent. +**Application Interactive Services** (AIS) provides the means to create links between an application GUI viewer and the packages, +which are used to manage selection and presentation, which makes management of these functionalities in 3D more intuitive and consequently, more transparent. -*AIS* uses the notion of the *Interactive Object*, a displayable and selectable entity, which represents an element from the application data. As a result, in 3D, you, the user, have no need to be familiar with any functions underlying AIS unless you want to create your own interactive objects or selection filters. +*AIS* uses the notion of the *Interactive Object*, a displayable and selectable entity, which represents an element from the application data. +As a result, in 3D, you, the user, have no need to be familiar with any functions underlying AIS unless you want to create your own interactive objects or selection filters. -If, however, you require types of interactive objects and filters other than those provided, you will need to know the mechanics of presentable and selectable objects, specifically how to implement their virtual functions. To do this requires familiarity with such fundamental concepts as the Sensitive Primitive and the Presentable Object. +If, however, you require types of interactive objects and filters other than those provided, you will need to know the mechanics of presentable and selectable objects, specifically how to implement their virtual functions. +To do this requires familiarity with such fundamental concepts as the Sensitive Primitive and the Presentable Object. The the following packages are used to display 3D objects: * *AIS*; @@ -26,22 +30,24 @@ The packages used to display 3D objects are also applicable for visualization of 2D objects. -The figure below presents a schematic overview of the relations between the key concepts and packages in visualization. Naturally, "Geometry & Topology" is just an example of application data that can be handled by *AIS*, and application-specific interactive objects can deal with any kind of data. +The figure below presents a schematic overview of the relations between the key concepts and packages in visualization. +Naturally, "Geometry & Topology" is just an example of application data that can be handled by *AIS*, and application-specific interactive objects can deal with any kind of data. @figure{visualization_image003.png,"Key concepts and packages in visualization",400} To answer different needs of CASCADE users, this User's Guide offers the following three paths in reading it. * If the 3D services proposed in AIS meet your requirements, you need only read chapter 3 @ref occt_visu_3 "AIS: Application Interactive Services". - * If you need more detail, for example, a selection filter on another type of entity -- you should read chapter 2 @ref occt_visu_2 "Fundamental Concepts", chapter 3 @ref occt_visu_3 "AIS: Application Interactive Services", and 4 @ref occt_visu_4 "3D Presentations". You may want to begin with the chapter presenting AIS. - -For advanced information on visualization algorithms, see our E-learning & Training offerings. + * If you need more detail, for example, a selection filter on another type of entity -- you should read + chapter 2 @ref occt_visu_2 "Fundamental Concepts", chapter 3 @ref occt_visu_3 "AIS: Application Interactive Services", and 4 @ref occt_visu_4 "3D Presentations". + You may want to begin with the chapter presenting AIS. @section occt_visu_2 Fundamental Concepts @subsection occt_visu_2_1 Presentation -In Open CASCADE Technology, presentation services are separated from the data, which they represent, which is generated by applicative algorithms. This division allows you to modify a geometric or topological algorithm and its resulting objects without modifying the visualization services. +In Open CASCADE Technology, presentation services are separated from the data, which they represent, which is generated by applicative algorithms. +This division allows you to modify a geometric or topological algorithm and its resulting objects without modifying the visualization services. @subsubsection occt_visu_2_1_1 Structure of the Presentation @@ -52,36 +58,56 @@ #### The presentable object -The purpose of a presentable object is to provide the graphical representation of an object in the form of *Graphic3d* structure. On the first display request, it creates this structure by calling the appropriate algorithm and retaining this framework for further display. +The purpose of a presentable object is to provide the graphical representation of an object in the form of *Graphic3d_Structure*. +On the first display request, it creates this structure by calling the appropriate algorithm and retaining this framework for further display. -Standard presentation algorithms are provided in the *StdPrs* and *Prs3d* packages. You can, however, write specific presentation algorithms of your own, provided that they create presentations made of structures from the *Graphic3d* packages. You can also create several presentations of a single presentable object: one for each visualization mode supported by your application. +Standard presentation algorithms are provided in the *StdPrs* and *Prs3d* packages. +You can, however, write specific presentation algorithms of your own, provided that they create presentations made of structures from the *Graphic3d* packages. +You can also create several presentations of a single presentable object: one for each visualization mode supported by your application. Each object to be presented individually must be presentable or associated with a presentable object. #### The viewer -The viewer allows interactively manipulating views of the object. When you zoom, translate or rotate a view, the viewer operates on the graphic structure created by the presentable object and not on the data model of the application. Creating Graphic3d structures in your presentation algorithms allows you to use the 3D viewers provided in Open CASCADE Technology for 3D visualisation. +The viewer allows interactively manipulating views of the object. +When you zoom, translate or rotate a view, the viewer operates on the graphic structure created by the presentable object and not on the data model of the application. +Creating Graphic3d structures in your presentation algorithms allows you to use the 3D viewers provided in Open CASCADE Technology for 3D visualization. #### The Interactive Context -The interactive context controls the entire presentation process from a common high-level API. When the application requests the display of an object, the interactive context requests the graphic structure from the presentable object and sends it to the viewer for displaying. +The interactive context controls the entire presentation process from a common high-level API. +When the application requests the display of an object, the interactive context requests the graphic structure from the presentable object and sends it to the viewer for displaying. @subsubsection occt_visu_2_1_2 Presentation packages -Presentation involves at least the *AIS, PrsMgr, StdPrs* and *V3d* packages. Additional packages, such as *Prs3d* and *Graphic3d* may be used if you need to implement your own presentation algorithms. +Presentation involves at least the *AIS, PrsMgr, StdPrs* and *V3d* packages. +Additional packages, such as *Prs3d* and *Graphic3d* may be used if you need to implement your own presentation algorithms. -* *AIS* package provides all classes to implement interactive objects (presentable and selectable entities). -* *PrsMgr* package provides low level services and is only to be used when you do not want to use the services provided by AIS. It contains all classes needed to implement the presentation process: abstract classes *Presentation* and *PresentableObject* and concrete class *PresentationManager3d*. -* *StdPrs* package provides ready-to-use standard presentation algorithms for specific geometries: points, curves and shapes of the geometry and topology toolkits. -* *Prs3d* package provides generic presentation algorithms such as wireframe, shading and hidden line removal associated with a *Drawer* class, which controls the attributes of the presentation to be created in terms of color, line type, thickness, etc. -* *V3d* package provides the services supported by the 3D viewer. -* *Graphic3d* package provides resources to create 3D graphic structures. -* *Visual3d* package contains classes implementing commands for 3D viewer. -* *DsgPrs* package provides tools for display of dimensions, relations and XYZ trihedrons. +* Standard Interactive Objects + * *AIS* package provides classes to implement interactive objects (presentable and selectable entities). + * *PrsDim* package provides presentable objects for drawing dimensions and relations. + * *MeshVS* package provides presentable object MeshVS_Mesh for working with mesh data. +* Standard presentation builders + * *Prs3d* package provides ready-to-use standard presentation algorithms for simple geometries like arrow, cylinder, sphere. + It also defines *Prs3d_Drawer* class controlling the attributes of the presentation to be created in terms of color, line type, thickness, etc. + * *StdPrs* package provides ready-to-use standard presentation algorithms for B-Rep shapes. + It provides generic presentation algorithms such as shading, wireframe, isolines and hidden line removal. + * *DsgPrs* package provides tools for display of dimensions, relations and XYZ trihedrons. +* Selection services + * *Select3D*, *SelectBasics* and *SelectMgr* implement selection (picking) services. + * *StdSelect* package provide selection builders for B-Rep shapes. +* Viewer management + *V3d* package provides the services supported by the 3D viewer. +* Low-level interfaces + * *PrsMgr* package defines basic interfaces and tools for presentable object. + It contains all classes needed to implement the presentation process: + abstract classes *PrsMgr_Presentation* and *PrsMgr_PresentableObject* and concrete class *PrsMgr_PresentationManager*. + * *Graphic3d* package provides low-level graphic structures. + It also defines an interface of Graphic3d_GraphicDriver providing a connection with low-level graphics APIs like OpenGL. @subsubsection occt_visu_2_1_3 A Basic Example: How to display a 3D object -~~~~~ +~~~~~{.cpp} Handle(V3d_Viewer) theViewer; Handle(AIS_InteractiveContext) aContext = new AIS_InteractiveContext (theViewer); @@ -91,20 +117,26 @@ aContext->Display (aShapePrs, AIS_Shaded, 0, true); // display the presentable object and redraw 3d viewer ~~~~~ -The shape is created using the *BRepPrimAPI_MakeWedge* command. An *AIS_Shape* is then created from the shape. When calling the *Display* command, the interactive context calls the Compute method of the presentable object to calculate the presentation data and transfer it to the viewer. See figure below. +The shape is created using the *BRepPrimAPI_MakeWedge* command. +An *AIS_Shape* is then created from the shape. +When calling the *Display* command, the interactive context calls the Compute method of the presentable object to calculate the presentation data and transfer it to the viewer. +See figure below. @figure{visualization_image004.svg,"Processes involved in displaying a presentable shape",400} @subsection occt_visu_2_2 Selection -Standard OCCT selection algorithm is represented by 2 parts: dynamic and static. Dynamic selection causes objects to be automatically highlighted as the mouse cursor moves over them. Static selection allows to pick particular object (or objects) for further processing. +Standard OCCT selection algorithm is represented by 2 parts: dynamic and static. +Dynamic selection causes objects to be automatically highlighted as the mouse cursor moves over them. +Static selection allows to pick particular object (or objects) for further processing. There are 3 different selection types: - **Point selection** -- allows picking and highlighting a single object (or its part) located under the mouse cursor; - **Rectangle selection** -- allows picking objects or parts located under the rectangle defined by the start and end mouse cursor positions; - **Polyline selection** -- allows picking objects or parts located under a user-defined non-self-intersecting polyline. -For OCCT selection algorithm, all selectable objects are represented as a set of sensitive zones, called **sensitive entities**. When the mouse cursor moves in the view, the sensitive entities of each object are analyzed for collision. +For OCCT selection algorithm, all selectable objects are represented as a set of sensitive zones, called **sensitive entities**. +When the mouse cursor moves in the view, the sensitive entities of each object are analyzed for collision. @subsubsection occt_visu_2_2_1 Terms and notions @@ -114,31 +146,41 @@ Sensitive entities in the same way as entity owners are links between objects and the selection mechanism. -The purpose of entities is to define what parts of the object will be selectable in particular. Thus, any object that is meant to be selectable must be split into sensitive entities (one or several). For instance, to apply face selection to an object it is necessary to explode it into faces and use them for creation of a sensitive entity set. +The purpose of entities is to define what parts of the object will be selectable in particular. +Thus, any object that is meant to be selectable must be split into sensitive entities (one or several). +For instance, to apply face selection to an object it is necessary to explode it into faces and use them for creation of a sensitive entity set. @figure{visualization_image005.png,"Example of a shape divided into sensitive entities",400} -Depending on the user's needs, sensitive entities may be atomic (point or edge) or complex. Complex entities contain many sub-elements that can be handled by detection mechanism in a similar way (for example, a polyline stored as a set of line segments or a triangulation). +Depending on the user's needs, sensitive entities may be atomic (point or edge) or complex. +Complex entities contain many sub-elements that can be handled by detection mechanism in a similar way +(for example, a polyline stored as a set of line segments or a triangulation). -Entities are used as internal units of the selection algorithm and do not contain any topological data, hence they have a link to an upper-level interface that maintains topology-specific methods. +Entities are used as internal units of the selection algorithm and do not contain any topological data, +hence they have a link to an upper-level interface that maintains topology-specific methods. #### Entity owner -Each sensitive entity stores a reference to its owner, which is a class connecting the entity and the corresponding selectable object. Besides, owners can store any additional information, for example, the topological shape of the sensitive entity, highlight colors and methods, or if the entity is selected or not. +Each *Select3D_SensitiveEntity* stores a reference to its owner *SelectMgr_EntityOwner*, +which is a class connecting the entity and the corresponding selectable object (*SelectMgr_SelectableObject*). +Besides, owners can store any additional information, for example, the topological shape of the sensitive entity, highlight colors and methods, or if the entity is selected or not. #### Selection -To simplify the handling of different selection modes of an object, sensitive entities linked to their owners are organized into sets, called **selections**. +To simplify the handling of different selection modes of an object, sensitive entities linked to their owners are organized into sets, called **selections** (*SelectMgr_Selection*). Each selection contains entities created for a certain mode along with the sensitivity and update states. #### Selectable object -Selectable object stores information about all created selection modes and sensitive entities. - -All successors of a selectable object must implement the method that splits its presentation into sensitive entities according to the given mode. The computed entities are arranged in one selection and added to the list of all selections of this object. No selection will be removed from the list until the object is deleted permanently. +Selectable object (*SelectMgr_SelectableObject* or more precisely *AIS_InteractiveObject*) stores information about all created selection modes and sensitive entities. -For all standard OCCT shapes, zero mode is supposed to select the whole object (but it may be redefined easily in the custom object). For example, the standard OCCT selection mechanism and *AIS_Shape* determine the following modes (see AIS_Shape::SelectionMode()): - - 0 -- selection of the entire object *(AIS_Shape)*; +All successors of a selectable object must implement the method that splits its presentation into sensitive entities according to the given mode. +The computed entities are arranged in one selection and added to the list of all selections of this object. +No selection will be removed from the list until the object is deleted permanently. + +For all standard OCCT interactive objects, zero mode is supposed to select the whole object (but it may be redefined in the custom object). +For example, the *AIS_Shape* object determine the following modes (see AIS_Shape::SelectionMode()): + - 0 -- selection of the entire object (AIS_Shape); - 1 -- selection of the vertices (TopAbs_VERTEX); - 2 -- selection of the edges (TopAbs_EDGE); - 3 -- selection of the wires (TopAbs_WIRE); @@ -152,24 +194,32 @@ #### Viewer selector -For each OCCT viewer there is a **Viewer selector** class instance. It provides a high-level API for the whole selection algorithm and encapsulates the processing of objects and sensitive entities for each mouse pick. -The viewer selector maintains activation and deactivation of selection modes, launches the algorithm, which detects candidate entities to be picked, and stores its results, as well as implements an interface for keeping selection structures up-to-date. +For each OCCT viewer there is a **Viewer selector** class *SelectMgr_ViewerSelector3d*. +It provides a high-level API for the whole selection algorithm and encapsulates the processing of objects and sensitive entities for each mouse pick. +The viewer selector maintains activation and deactivation of selection modes, launches the algorithm, which detects candidate entities to be picked, +and stores its results, as well as implements an interface for keeping selection structures up-to-date. #### Selection manager -Selection manager is a high-level API to manipulate selection of all displayed objects. It handles all viewer selectors, activates and deactivates selection modes for the objects in all or particular selectors, manages computation and update of selections for each object. Moreover, it keeps selection structures updated taking into account applied changes. +Selection manager *SelectMgr_SelectionManager* is a high-level API to manipulate selection of all displayed objects. +It handles all viewer selectors, activates and deactivates selection modes for the objects in all or particular selectors, +manages computation and update of selections for each object. +Moreover, it keeps selection structures updated taking into account applied changes. @figure{visualization_image008.png,"The relations chain between viewer selector and selection manager",400} @subsubsection occt_visu_2_2_2 Algorithm -All three types of OCCT selection are implemented as a single concept, based on the search for overlap between frustum and sensitive entity through 3-level BVH tree traversal. +All three types of OCCT selection are implemented as a single concept, +based on the search for overlap between frustum and sensitive entity through 3-level BVH tree traversal. #### Selection Frustum The first step of each run of selection algorithm is to build the selection frustum according to the currently activated selection type. -For the point or the rectangular selection the base of the frustum is a rectangle built in conformity with the pixel tolerance or the dimensions of a user-defined area, respectively. For the polyline selection, the polygon defined by the constructed line is triangulated and each triangle is used as the base for its own frustum. Thus, this type of selection uses a set of triangular frustums for overlap detection. +For the point or the rectangular selection the base of the frustum is a rectangle built in conformity with the pixel tolerance or the dimensions of a user-defined area, respectively. +For the polyline selection, the polygon defined by the constructed line is triangulated and each triangle is used as the base for its own frustum. +Thus, this type of selection uses a set of triangular frustums for overlap detection. The frustum length is limited by near and far view volume planes and each plane is built parallel to the corresponding view volume plane. @@ -185,11 +235,16 @@ To maintain selection mechanism at the viewer level, a speedup structure composed of 3 BVH trees is used. -The first level tree is constructed of axis-aligned bounding boxes of each selectable object. Hence, the root of this tree contains the combination of all selectable boundaries even if they have no currently activated selections. Objects are added during the display of *AIS_InteractiveObject* and will be removed from this tree only when the object is destroyed. The 1st level BVH tree is build on demand simultaneously with the first run of the selection algorithm. +The first level tree is constructed of axis-aligned bounding boxes of each selectable object. +Hence, the root of this tree contains the combination of all selectable boundaries even if they have no currently activated selections. +Objects are added during the display of *AIS_InteractiveObject* and will be removed from this tree only when the object is destroyed. +The 1st level BVH tree is build on demand simultaneously with the first run of the selection algorithm. -The second level BVH tree consists of all sensitive entities of one selectable object. The 2nd level trees are built automatically when the default mode is activated and rebuilt whenever a new selection mode is calculated for the first time. +The second level BVH tree consists of all sensitive entities of one selectable object. +The 2nd level trees are built automatically when the default mode is activated and rebuilt whenever a new selection mode is calculated for the first time. -The third level BVH tree is used for complex sensitive entities that contain many elements: for example, triangulations, wires with many segments, point sets, etc. It is built on demand for sensitive entities with under 800K sub-elements. +The third level BVH tree is used for complex sensitive entities that contain many elements: for example, triangulations, wires with many segments, point sets, etc. +It is built on demand for sensitive entities with more than 800K sub-elements (defined by *StdSelect_BRepSelectionTool::PreBuildBVH()*). @figure{visualization_image022.png,"Selection BVH tree hierarchy: from the biggest object-level (first) to the smallest complex entity level (third)",400} @@ -203,21 +258,33 @@ ##### First stage -- traverse of the first level BVH tree -After successful building of the selection frustum, the algorithm starts traversal of the object-level BVH tree. The nodes containing axis-aligned bounding boxes are tested for overlap with the selection frustum following the terms of *separating axis theorem (SAT)*. When the traversal goes down to the leaf node, it means that a candidate object with possibly overlapping sensitive entities has been found. If no such objects have been detected, the algorithm stops and it is assumed that no object needs to be selected. Otherwise it passes to the next stage to process the entities of the found selectable object. +After successful building of the selection frustum, the algorithm starts traversal of the object-level BVH tree. +The nodes containing axis-aligned bounding boxes are tested for overlap with the selection frustum following the terms of *separating axis theorem (SAT)*. +When the traversal goes down to the leaf node, it means that a candidate object with possibly overlapping sensitive entities has been found. +If no such objects have been detected, the algorithm stops and it is assumed that no object needs to be selected. +Otherwise it passes to the next stage to process the entities of the found selectable object. ##### Second stage -- traversal of the second level BVH tree At this stage it is necessary to determine if there are candidates among all sensitive entities of one object. -First of all, at this stage the algorithm checks if there is any transformation applied for the current object. If it has its own location, then the correspondingly transformed frustum will be used for further calculations. At the next step the nodes of the second level BVH tree of the given object are visited to search for overlapping leaves. If no such leafs have been found, the algorithm returns to the second stage. Otherwise it starts processing the found entities by performing the following checks: +First of all, at this stage the algorithm checks if there is any transformation applied for the current object. +If it has its own location, then the correspondingly transformed frustum will be used for further calculations. +At the next step the nodes of the second level BVH tree of the given object are visited to search for overlapping leaves. +If no such leafs have been found, the algorithm returns to the second stage. +Otherwise it starts processing the found entities by performing the following checks: - activation check - the entity may be inactive at the moment as it belongs to deactivated selection; - - tolerance check - current selection frustum may be too large for further checks as it is always built with the maximum tolerance among all activated entities. Thus, at this step the frustum may be scaled. + - tolerance check - current selection frustum may be too large for further checks as it is always built with the maximum tolerance among all activated entities; + thus, at this step the frustum may be scaled. After these checks the algorithm passes to the last stage. ##### Third stage -- overlap or inclusion test of a particular sensitive entity -If the entity is atomic, a simple SAT test is performed. In case of a complex entity, the third level BVH tree is traversed. The quantitative characteristics (like depth, distance to the center of geometry) of matched sensitive entities is analyzed and clipping planes are applied (if they have been set). The result of detection is stored and the algorithm returns to the second stage. +If the entity is atomic, a simple SAT test is performed. +In case of a complex entity, the third level BVH tree is traversed. +The quantitative characteristics (like depth, distance to the center of geometry) of matched sensitive entities is analyzed and clipping planes are applied (if they have been set). +The result of detection is stored and the algorithm returns to the second stage. @subsubsection occt_visu_2_2_3 Packages and classes @@ -225,7 +292,8 @@ #### SelectBasics -*SelectBasics* package contains basic classes and interfaces for selection. The most notable are: +*SelectBasics* package contains basic classes and interfaces for selection. +The most notable are: - *SelectBasics_PickResult* -- the structure for storing quantitative results of detection procedure, for example, depth and distance to the center of geometry; - *SelectBasics_SelectingVolumeManager* -- the interface for interaction with the current selection frustum. @@ -250,41 +318,53 @@ *Select3D_SensitiveEntity* -- the base definition of a sensitive entity. -*Select3D_SensitiveSet* -- a base class for all complex sensitive entities that require the third level BVH usage. It implements traverse of the tree and defines an interface for the methods that check sub-entities. +*Select3D_SensitiveSet* -- a base class for all complex sensitive entities that require the third level BVH usage. +It implements traverse of the tree and defines an interface for the methods that check sub-entities. -*Select3D_SensitivePoly* -- describes an arbitrary point set and implements basic functions for selection. It is important to know that this class does not perform any internal data checks. Hence, custom implementations of sensitive entity inherited from *Select3D_SensitivePoly* must satisfy the terms of Separating Axis Theorem to use standard OCCT overlap detection methods. +*Select3D_SensitivePoly* -- describes an arbitrary point set and implements basic functions for selection. +It is important to know that this class does not perform any internal data checks. +Hence, custom implementations of sensitive entity inherited from *Select3D_SensitivePoly* must satisfy the terms of Separating Axis Theorem to use standard OCCT overlap detection methods. #### SelectMgr -*SelectMgr* package is used to maintain the whole selection process. For this purpose, the package provides the following services: +*SelectMgr* package is used to maintain the whole selection process. +For this purpose, the package provides the following services: - activation and deactivation of selection modes for all selectable objects; - interfaces to compute selection mode of the object; - definition of selection filter classes; - keeping selection BVH data up-to-date. A brief description of the main classes: - - *SelectMgr_BaseFrustum*, *SelectMgr_Frustum*, *SelectMgr_RectangularFrustum*, *SelectMgr_TriangularFrustum* and *SelectMgr_TriangularFrustumSet* -- interfaces and implementations of selecting frustums, these classes implement different SAT tests for overlap and inclusion detection. They also contain methods to measure characteristics of detected entities (depth, distance to center of geometry); - - *SelectMgr_SensitiveEntity*, *SelectMgr_Selection* and *SelectMgr_SensitiveEntitySet* -- store and handle sensitive entities; *SelectMgr_SensitiveEntitySet* implements a primitive set for the second level BVH tree; - - *SelectMgr_SelectableObject* and *SelectMgr_SelectableObjectSet* -- describe selectable objects. They also manage storage, calculation and removal of selections. *SelectMgr_SelectableObjectSet* implements a primitive set for the first level BVH tree; - - *SelectMgr_ViewerSelector* -- encapsulates all logics of the selection algorithm and implements the third level BVH tree traverse; + - *SelectMgr_BaseFrustum*, *SelectMgr_Frustum*, *SelectMgr_RectangularFrustum*, *SelectMgr_TriangularFrustum* and *SelectMgr_TriangularFrustumSet* -- interfaces and implementations of selecting frustums. + These classes implement different SAT tests for overlap and inclusion detection. + They also contain methods to measure characteristics of detected entities (depth, distance to center of geometry). + - *SelectMgr_SensitiveEntity*, *SelectMgr_Selection* and *SelectMgr_SensitiveEntitySet* -- store and handle sensitive entities. + *SelectMgr_SensitiveEntitySet* implements a primitive set for the second level BVH tree. + - *SelectMgr_SelectableObject* and *SelectMgr_SelectableObjectSet* -- describe selectable objects. + They also manage storage, calculation and removal of selections. + *SelectMgr_SelectableObjectSet* implements a primitive set for the first level BVH tree. + - *SelectMgr_ViewerSelector* -- encapsulates all logics of the selection algorithm and implements the third level BVH tree traverse. - *SelectMgr_SelectionManager* -- manages activation/deactivation, calculation and update of selections of every selectable object, and keeps BVH data up-to-date. #### StdSelect -*StdSelect* package contains the implementation of some *SelectMgr* classes and tools for creation of selection structures. For example, +*StdSelect* package contains the implementation of some *SelectMgr* classes and tools for creation of selection structures. +For example, - *StdSelect_BRepOwner* -- defines an entity owner with a link to its topological shape and methods for highlighting; - *StdSelect_BRepSelectionTool* -- contains algorithms for splitting standard AIS shapes into sensitive primitives; - - *StdSelect_ViewerSelector3d* -- an example of *SelectMgr_ViewerSelector* implementation, which is used in a default OCCT selection mechanism; - *StdSelect_FaceFilter*, *StdSelect_EdgeFilter* -- implementation of selection filters. @subsubsection occt_visu_2_2_4 Examples of usage -The first code snippet illustrates the implementation of *SelectMgr_SelectableObject::ComputeSelection()* method in a custom interactive object. The method is used for computation of user-defined selection modes. +The first code snippet illustrates the implementation of *SelectMgr_SelectableObject::ComputeSelection()* method in a custom interactive object. +The method is used for computation of user-defined selection modes. Let us assume it is required to make a box selectable in two modes -- the whole shape (mode 0) and each of its edges (mode 1). -To select the whole box, the application can create a sensitive primitive for each face of the interactive object. In this case, all primitives share the same owner -- the box itself. -To select box's edge, the application must create one sensitive primitive per edge. Here all sensitive entities cannot share the owner since different geometric primitives must be highlighted as the result of selection procedure. +To select the whole box, the application can create a sensitive primitive for each face of the interactive object. +In this case, all primitives share the same owner -- the box itself. +To select box's edge, the application must create one sensitive primitive per edge. +Here all sensitive entities cannot share the owner since different geometric primitives must be highlighted as the result of selection procedure. -~~~~ +~~~~{.cpp} void InteractiveBox::ComputeSelection (const Handle(SelectMgr_Selection)& theSel, const Standard_Integer theMode) { @@ -296,7 +376,7 @@ for (Standard_Integer aFaceIter = 1; aFaceIter <= myNbFaces; ++aFaceIter) { Select3D_TypeOfSensitivity aSensType = myIsInterior; - theSel->Add (new Select3D_SensitiveFace (anOwner, myFaces[aFaceIter]->PointArray(), aSensType)); + theSel->Add (new Select3D_SensitiveFace (anOwner, myFaces[aFaceIter]->PointArray(), aSensType)); } break; } @@ -306,7 +386,7 @@ { // 1 owner per edge, where 6 is a priority of the sensitive Handle(MySelection_EdgeOwner) anOwner = new MySelection_EdgeOwner (this, anEdgeIter, 6); - theSel->Add (new Select3D_SensitiveSegment (anOwner, myFirstPnt[anEdgeIter]), myLastPnt[anEdgeIter])); + theSel->Add (new Select3D_SensitiveSegment (anOwner, myFirstPnt[anEdgeIter]), myLastPnt[anEdgeIter])); } break; } @@ -314,14 +394,17 @@ } ~~~~ -The algorithms for creating selection structures store sensitive primitives in *SelectMgr_Selection* instance. Each *SelectMgr_Selection* sequence in the list of selections of the object must correspond to a particular selection mode. -To describe the decomposition of the object into selectable primitives, a set of ready-made sensitive entities is supplied in *Select3D* package. Custom sensitive primitives can be defined through inheritance from *Select3D_SensitiveEntity*. -To make custom interactive objects selectable or customize selection modes of existing objects, the entity owners must be defined. They must inherit *SelectMgr_EntityOwner* interface. +The algorithms for creating selection structures store sensitive primitives in *SelectMgr_Selection* instance. +Each *SelectMgr_Selection* sequence in the list of selections of the object must correspond to a particular selection mode. +To describe the decomposition of the object into selectable primitives, a set of ready-made sensitive entities is supplied in *Select3D* package. +Custom sensitive primitives can be defined through inheritance from *Select3D_SensitiveEntity*. +To make custom interactive objects selectable or customize selection modes of existing objects, the entity owners must be defined. +They must inherit *SelectMgr_EntityOwner* interface. Selection structures for any interactive object are created in *SelectMgr_SelectableObject::ComputeSelection()* method. The example below shows how computation of different selection modes of the topological shape can be done using standard OCCT mechanisms, implemented in *StdSelect_BRepSelectionTool*. -~~~~ +~~~~{.cpp} void MyInteractiveObject::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, const Standard_Integer theMode) { @@ -338,27 +421,36 @@ The *StdSelect_BRepSelectionTool* class provides a high level API for computing sensitive entities of the given type (for example, face, vertex, edge, wire and others) using topological data from the given *TopoDS_Shape*. -The traditional way of highlighting selected entity owners adopted by Open CASCADE Technology assumes that each entity owner highlights itself on its own. This approach has two drawbacks: +The traditional way of highlighting selected entity owners adopted by Open CASCADE Technology assumes that each entity owner highlights itself on its own. +This approach has two drawbacks: - each entity owner has to maintain its own *Graphic3d_Structure* object, that results in a considerable memory overhead; - drawing selected owners one by one is not efficient from the visualization point of view. -Therefore, to overcome these limitations, OCCT has an alternative way to implement the highlighting of a selected presentation. Using this approach, the interactive object itself will be responsible for the highlighting, not the entity owner. - -On the basis of *SelectMgr_EntityOwner::IsAutoHilight()* return value, *AIS_InteractiveContext* object either uses the traditional way of highlighting (in case if *IsAutoHilight()* returns TRUE) or groups such owners according to their selectable objects and finally calls *SelectMgr_SelectableObject::HilightSelected()* or *SelectMgr_SelectableObject::ClearSelected()*, passing a group of owners as an argument. +Therefore, to overcome these limitations, OCCT has an alternative way to implement the highlighting of a selected presentation. +Using this approach, the interactive object itself will be responsible for the highlighting, not the entity owner. -Hence, an application can derive its own interactive object and redefine virtual methods *HilightSelected()*, *ClearSelected()* and *HilightOwnerWithColor()* from *SelectMgr_SelectableObject*. *SelectMgr_SelectableObject::GetHilightPresentation* and *SelectMgr_SelectableObject::GetSelectPresentation* methods can be used to optimize filling of selection and highlight presentations according to the user's needs. - -After all the necessary sensitive entities are computed and packed in *SelectMgr_Selection* instance with the corresponding owners in a redefinition of *SelectMgr_SelectableObject::ComputeSelection()* method, it is necessary to register the prepared selection in *SelectMgr_SelectionManager* through the following steps: +On the basis of *SelectMgr_EntityOwner::IsAutoHilight()* return value, *AIS_InteractiveContext* object either uses the traditional way of highlighting +(in case if *IsAutoHilight()* returns TRUE) or groups such owners according to their selectable objects and finally calls *SelectMgr_SelectableObject::HilightSelected()* or *SelectMgr_SelectableObject::ClearSelected()*, +passing a group of owners as an argument. + +Hence, an application can derive its own interactive object and redefine virtual methods *HilightSelected()*, *ClearSelected()* and *HilightOwnerWithColor()* from *SelectMgr_SelectableObject*. +*SelectMgr_SelectableObject::GetHilightPresentation* and *SelectMgr_SelectableObject::GetSelectPresentation* methods can be used to optimize filling of selection and highlight presentations according to the user's needs. + +After all the necessary sensitive entities are computed and packed in *SelectMgr_Selection* instance with the corresponding owners +in a redefinition of *SelectMgr_SelectableObject::ComputeSelection()* method, +it is necessary to register the prepared selection in *SelectMgr_SelectionManager* through the following steps: - if there was no *AIS_InteractiveContext* opened, create an interactive context and display the selectable object in it; - - load the selectable object to the selection manager of the interactive context using *AIS_InteractiveContext::Load()* method. If the selection mode passed as a parameter to this method is not equal to -1, *ComputeSelection()* for this selection mode will be called; + - load the selectable object to the selection manager of the interactive context using *AIS_InteractiveContext::Load()* method. + If the selection mode passed as a parameter to this method is not equal to -1, *ComputeSelection()* for this selection mode will be called; - activate or deactivate the defined selection mode using *AIS_InteractiveContext::Activate()* or *AIS_InteractiveContext::Deactivate()* methods. After these steps, the selection manager of the created interactive context will contain the given object and its selection entities, and they will be involved in the detection procedure. -The code snippet below illustrates the above steps. It also contains the code to start the detection procedure and parse the results of selection. +The code snippet below illustrates the above steps. +It also contains the code to start the detection procedure and parse the results of selection. -~~~~~ +~~~~~{.cpp} // Suppose there is an instance of class InteractiveBox from the previous sample. // It contains an implementation of method InteractiveBox::ComputeSelection() for selection // modes 0 (whole box must be selected) and 1 (edge of the box must be selectable) @@ -389,12 +481,15 @@ ~~~~~ It is also important to know, that there are 2 types of detection implemented for rectangular selection in OCCT: - - inclusive detection. In this case the sensitive primitive is considered detected only when all its points are included in the area defined by the selection rectangle; - - overlap detection. In this case the sensitive primitive is considered detected when it is partially overlapped by the selection rectangle. + - inclusive detection. + In this case the sensitive primitive is considered detected only when all its points are included in the area defined by the selection rectangle; + - overlap detection. + In this case the sensitive primitive is considered detected when it is partially overlapped by the selection rectangle. -The standard OCCT selection mechanism uses inclusion detection by default. To change this, use the following code: +The standard OCCT selection mechanism uses inclusion detection by default. +To change this, use the following code: -~~~~~ +~~~~~{.cpp} // Assume there is a created interactive context const Handle(AIS_InteractiveContext) theContext; // Retrieve the current viewer selector @@ -407,41 +502,55 @@ @subsection occt_visu_3_1 Introduction Application Interactive Services allow managing presentations and dynamic selection in a viewer in a simple and transparent manner. -The central entity for management of visualization and selections is the **Interactive Context**. It is connected to the main viewer. +The central entity for management of visualization and selections is the **Interactive Context** (*AIS_InteractiveContext*). +It is connected to the main viewer (*V3d_Viewer*). -Interactive context by default starts at **Neutral Point** with each selectable object picked as a whole, but the user might activate **Local Selection** for specific objects to make selectable parts of the objects. +Interactive context by default starts at **Neutral Point** with each selectable object picked as a whole, +but the user might activate **Local Selection** for specific objects to make selectable parts of the objects. Local/global selection is managed by a list of selection modes activated for each displayed object with 0 (default selection mode) usually meaning Global (entire object) selection. -**Interactive Objects** are the entities, which are visualized and selected. You can use classes of standard interactive objects for which all necessary functions have already been programmed, or you can implement your own classes of interactive objects, by respecting a certain number of rules and conventions described below. - -An Interactive Object is a "virtual" entity, which can be presented and selected. An Interactive Object can have a certain number of specific graphic attributes, such as visualization mode, color and material. -When an Interactive Object is visualized, the required graphic attributes are taken from its own **Drawer** (*Prs3d_Drawer*) if it has the required custom attributes or otherwise from the context drawer. +**Interactive Objects** (*AIS_InteractiveObject*) are the entities, which are visualized and selected. +You can use classes of standard interactive objects for which all necessary functions have already been programmed, +or you can implement your own classes of interactive objects, by respecting a certain number of rules and conventions described below. + +An Interactive Object is a "virtual" entity, which can be presented and selected. +An Interactive Object can have a certain number of specific graphic attributes, such as visualization mode, color and material. +When an Interactive Object is visualized, the required graphic attributes are taken from its own **Drawer** (*Prs3d_Drawer*) +if it has the required custom attributes or otherwise from the context drawer. @figure{visualization_image017.png,"",360} -It can be necessary to filter the entities to be selected. Consequently there are **Filter** entities, which allow refining the dynamic detection context. Some of these filters can be used only within at the Neutral Point, others only within Local Selection. It is possible to program custom filters and load them into the interactive context. +It can be necessary to filter the entities to be selected. +Consequently there are **Filter** entities (*SelectMgr_Filter*), which allow refining the dynamic detection context. +Some of these filters can be used only within at the Neutral Point, others only within Local Selection. +It is possible to program custom filters and load them into the interactive context. @subsection occt_visu_3_2 Interactive objects -Entities which are visualized and selected in the AIS viewer are objects. They connect the underlying reference geometry of a model to its graphic representation in *AIS*. You can use the predefined OCCT classes of standard interactive objects, for which all necessary functions have already been programmed, or, if you are an advanced user, you can implement your own classes of interactive objects. +Entities which are visualized and selected in the AIS viewer are objects (*AIS_InteractiveObject*). +They connect the underlying reference geometry of a model to its graphic representation in *AIS*. +You can use the predefined OCCT classes of standard interactive objects, for which all necessary functions have already been programmed, +or, if you are an advanced user, you can implement your own classes of interactive objects. @subsubsection occt_visu_3_2_1 Presentations An interactive object can have as many presentations as its creator wants to give it. -3D presentations are managed by **Presentation Manager** (*PrsMgr_PresentationManager*). As this is transparent in AIS, the user does not have to worry about it. +3D presentations are managed by **Presentation Manager** (*PrsMgr_PresentationManager*). +As this is transparent in AIS, the user does not have to worry about it. A presentation is identified by an index (*Display Mode*) and by the reference to the Presentation Manager, which it depends on. By convention, the default mode of representation for the Interactive Object has index 0. @figure{visualization_image018.png,"",360} -Calculation of different presentations of an interactive object is done by the *Compute* functions inheriting from *PrsMgr_PresentableObject::Compute* functions. They are automatically called by *PresentationManager* at a visualization or an update request. +Calculation of different presentations of an interactive object is done by the *Compute* functions inheriting from *PrsMgr_PresentableObject::Compute* functions. +They are automatically called by *PresentationManager* at a visualization or an update request. If you are creating your own type of interactive object, you must implement the Compute function in one of the following ways: #### For 3D: -~~~~~ +~~~~~{.cpp} void PackageName_ClassName::Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, const Handle(Prs3d_Presentation)& thePresentation, const Standard_Integer theMode); @@ -449,16 +558,19 @@ #### For hidden line removal (HLR) mode in 3D: -~~~~~ +~~~~~{.cpp} void PackageName_ClassName::Compute (const Handle(Prs3d_Projector)& theProjector, const Handle(Prs3d_Presentation)& thePresentation); ~~~~~ @subsubsection occt_visu_3_2_2 Hidden Line Removal -The view can have two states: the normal mode or the computed mode (Hidden Line Removal mode). When the latter is active, the view looks for all presentations displayed in the normal mode, which have been signalled as accepting HLR mode. An internal mechanism allows calling the interactive object's own *Compute*, that is projector function. +The view can have two states: the normal mode or the computed mode (Hidden Line Removal mode). +When the latter is active, the view looks for all presentations displayed in the normal mode, which have been signaled as accepting HLR mode. +An internal mechanism allows calling the interactive object's own *Compute*, that is projector function. -By convention, the Interactive Object accepts or rejects the representation of HLR mode. It is possible to make this declaration in one of two ways: +By convention, the Interactive Object accepts or rejects the representation of HLR mode. +It is possible to make this declaration in one of two ways: * Initially by using one of the values of the enumeration *PrsMgr_TypeOfPresentation3d*: * *PrsMgr_TOP_AllView*, @@ -467,7 +579,8 @@ * Later by using the function *PrsMgr_PresentableObject::SetTypeOfPresentation* *AIS_Shape* class is an example of an interactive object that supports HLR representation. -The type of the HLR algorithm is stored in *Prs3d_Drawer* of the shape. It is a value of the *Prs3d_TypeOfHLR* enumeration and can be set to: +The type of the HLR algorithm is stored in *Prs3d_Drawer* of the shape. +It is a value of the *Prs3d_TypeOfHLR* enumeration and can be set to: * *Prs3d_TOH_PolyAlgo* for a polygonal algorithm based on the shape's triangulation; * *Prs3d_TOH_Algo* for an exact algorithm that works with the shape's real geometry; * *Prs3d_TOH_NotSet* if the type of algorithm is not set for the given interactive object instance. @@ -475,8 +588,11 @@ The type of the HLR algorithm used for *AIS_Shape* can be changed by calling the *AIS_Shape::SetTypeOfHLR()* method. The current HLR algorithm type can be obtained using *AIS_Shape::TypeOfHLR()* method is to be used. -These methods get the value from the drawer of *AIS_Shape*. If the HLR algorithm type in the *Prs3d_Drawer* is set to *Prs3d_TOH_NotSet*, the *Prs3d_Drawer* gets the value from the default drawer of *AIS_InteractiveContext*. -So it is possible to change the default HLR algorithm used by all newly displayed interactive objects. The value of the HLR algorithm type stored in the context drawer can be *Prs3d_TOH_Algo* or *Prs3d_TOH_PolyAlgo*. The polygonal algorithm is the default one. +These methods get the value from the drawer of *AIS_Shape*. +If the HLR algorithm type in the *Prs3d_Drawer* is set to *Prs3d_TOH_NotSet*, the *Prs3d_Drawer* gets the value from the default drawer of *AIS_InteractiveContext*. +So it is possible to change the default HLR algorithm used by all newly displayed interactive objects. +The value of the HLR algorithm type stored in the context drawer can be *Prs3d_TOH_Algo* or *Prs3d_TOH_PolyAlgo*. +The polygonal algorithm is the default one. @subsubsection occt_visu_3_2_3 Presentation modes @@ -486,36 +602,46 @@ * the Object * the None type (when the object is of an unknown type). -Inside these categories, additional characterization is available by means of a signature (an index.) By default, the interactive object has a NONE type and a signature of 0 (equivalent to NONE). If you want to give a particular type and signature to your interactive object, you must redefine two virtual functions: +Inside these categories, additional characterization is available by means of a signature (an index). +By default, the interactive object has a NONE type and a signature of 0 (equivalent to NONE). +If you want to give a particular type and signature to your interactive object, you must redefine two virtual functions: * *AIS_InteractiveObject::Type* * *AIS_InteractiveObject::Signature*. **Note** that some signatures are already used by "standard" objects provided in AIS (see the @ref occt_visu_3_5 "List of Standard Interactive Object Classes"). -The interactive context can have a default mode of representation for the set of interactive objects. This mode may not be accepted by a given class of objects. +The interactive context can have a default mode of representation for the set of interactive objects. +This mode may not be accepted by a given class of objects. Consequently, to get information about this class it is necessary to use virtual function *AIS_InteractiveObject::AcceptDisplayMode*. #### Display Mode -The functions *AIS_InteractiveContext::SetDisplayMode* and *AIS_InteractiveContext::UnsetDisplayMode* allow setting a custom display mode for an objects, which can be different from that proposed by the interactive context. +The functions *AIS_InteractiveContext::SetDisplayMode* and *AIS_InteractiveContext::UnsetDisplayMode* allow setting a custom display mode for an objects, +which can be different from that proposed by the interactive context. #### Highlight Mode At dynamic detection, the presentation echoed by the Interactive Context, is by default the presentation already on the screen. -The functions *AIS_InteractiveObject::SetHilightMode* and *AIS_InteractiveObject::UnsetHilightMode* allow specifying the display mode used for highlighting (so called highlight mode), which is valid independently from the active representation of the object. It makes no difference whether this choice is temporary or definitive. - -Note that the same presentation (and consequently the same highlight mode) is used for highlighting *detected* objects and for highlighting *selected* objects, the latter being drawn with a special *selection color* (refer to the section related to *Interactive Context* services). - -For example, you want to systematically highlight the wireframe presentation of a shape - non regarding if it is visualized in wireframe presentation or with shading. Thus, you set the highlight mode to *0* in the constructor of the interactive object. Do not forget to implement this representation mode in the *Compute* functions. +The functions *AIS_InteractiveObject::SetHilightMode* and *AIS_InteractiveObject::UnsetHilightMode* allow specifying the display mode used for highlighting (so called highlight mode), +which is valid independently from the active representation of the object. +It makes no difference whether this choice is temporary or definitive. + +Note that the same presentation (and consequently the same highlight mode) is used for highlighting *detected* objects and for highlighting *selected* objects, +the latter being drawn with a special *selection color* (refer to the section related to *Interactive Context* services). + +For example, you want to systematically highlight the wireframe presentation of a shape - non regarding if it is visualized in wireframe presentation or with shading. +Thus, you set the highlight mode to *0* in the constructor of the interactive object. +Do not forget to implement this representation mode in the *Compute* functions. #### Infinite Status -If you do not want an object to be affected by a *FitAll* view, you must declare it infinite; you can cancel its "infinite" status using *AIS_InteractiveObject::SetInfiniteState* and *AIS_InteractiveObject::IsInfinite* functions. +If you do not want an object to be affected by a *FitAll* view, you must declare it infinite; +you can cancel its "infinite" status using *AIS_InteractiveObject::SetInfiniteState* and *AIS_InteractiveObject::IsInfinite* functions. Let us take for example the class called *IShape* representing an interactive object: -~~~~~ +~~~~~{.cpp} myPk_IShape::myPk_IShape (const TopoDS_Shape& theShape, PrsMgr_TypeOfPresentation theType) : AIS_InteractiveObject (theType), myShape (theShape) { SetHilightMode (0); } @@ -547,16 +673,21 @@ @subsubsection occt_visu_3_2_4 Selection -An interactive object can have an indefinite number of selection modes, each representing a "decomposition" into sensitive primitives. Each primitive has an **Owner** (*SelectMgr_EntityOwner*) which allows identifying the exact interactive object or shape which has been detected (see @ref occt_visu_2_2 "Selection" chapter). +An interactive object can have an indefinite number of selection modes, each representing a "decomposition" into sensitive primitives. +Each primitive has an **Owner** (*SelectMgr_EntityOwner*) which allows identifying the exact interactive object or shape which has been detected (see @ref occt_visu_2_2 "Selection" chapter). The set of sensitive primitives, which correspond to a given mode, is stocked in a **Selection** (*SelectMgr_Selection*). -Each selection mode is identified by an index. By convention, the default selection mode that allows us to grasp the interactive object in its entirety is mode *0*. However, it can be modified in the custom interactive objects using method *SelectMgr_SelectableObject::setGlobalSelMode()*. +Each selection mode is identified by an index. +By convention, the default selection mode that allows us to grasp the interactive object in its entirety is mode *0*. +However, it can be modified in the custom interactive objects using method *SelectMgr_SelectableObject::setGlobalSelMode()*. -The calculation of selection primitives (or sensitive entities) is done in a virtual function *ComputeSelection*. It should be implemented for each type of interactive object that is assumed to have different selection modes using the function *AIS_InteractiveObject::ComputeSelection*. +The calculation of selection primitives (or sensitive entities) is done in a virtual function *ComputeSelection*. +It should be implemented for each type of interactive object that is assumed to have different selection modes using the function *AIS_InteractiveObject::ComputeSelection*. A detailed explanation of the mechanism and the manner of implementing this function has been given in @ref occt_visu_2_2 "Selection" chapter. -There are some examples of selection mode calculation for the most widely used interactive object in OCCT -- *AIS_Shape* (selection by vertex, by edges, etc). To create new classes of interactive objects with the same selection behavior as *AIS_Shape* -- such as vertices and edges -- you must redefine the virtual function *AIS_InteractiveObject::AcceptShapeDecomposition*. +There are some examples of selection mode calculation for the most widely used interactive object in OCCT -- *AIS_Shape* (selection by vertex, by edges, etc). +To create new classes of interactive objects with the same selection behavior as *AIS_Shape* -- such as vertices and edges -- you must redefine the virtual function *AIS_InteractiveObject::AcceptShapeDecomposition*. @subsubsection occt_visu_3_2_5 Graphic attributes @@ -567,8 +698,11 @@ Keep in mind the following points concerning graphic attributes: * Each interactive object can have its own visualization attributes. - * By default, the interactive object takes the graphic attributes of the context in which it is visualized (visualization mode, deflection values for the calculation of presentations, number of isoparameters, color, type of line, material, etc.) - * In the *AIS_InteractiveObject* abstract class, standard attributes including color, line thickness, material, and transparency have been privileged. Consequently, there is a certain number of virtual functions, which allow acting on these attributes. Each new class of interactive object can redefine these functions and change the behavior of the class. + * By default, the interactive object takes the graphic attributes of the context in which it is visualized + (visualization mode, deflection values for the calculation of presentations, number of isoparameters, color, type of line, material, etc.) + * In the *AIS_InteractiveObject* abstract class, standard attributes including color, line thickness, material, and transparency have been privileged. + Consequently, there is a certain number of virtual functions, which allow acting on these attributes. + Each new class of interactive object can redefine these functions and change the behavior of the class. @figure{visualization_image020.svg,"Redefinition of virtual functions for changes in AIS_Shape and AIS_TextLabel.",360} @@ -616,14 +750,18 @@ Due to the fact that the accuracy of three-dimensional graphics coordinates has a finite resolution the elements of topological objects can coincide producing the effect of "popping" some elements one over another. -To the problem when the elements of two or more Interactive Objects are coincident you can apply the polygon offset. It is a sort of graphics computational offset, or depth buffer offset, that allows you to arrange elements (by modifying their depth value) without changing their coordinates. The graphical elements that accept this kind of offsets are solid polygons or displayed as boundary lines and points. The polygons could be displayed as lines or points by setting the appropriate interior style. +To the problem when the elements of two or more Interactive Objects are coincident you can apply the polygon offset. +It is a sort of graphics computational offset, or depth buffer offset, that allows you to arrange elements (by modifying their depth value) without changing their coordinates. +The graphical elements that accept this kind of offsets are solid polygons or displayed as boundary lines and points. +The polygons could be displayed as lines or points by setting the appropriate interior style. The methods *AIS_InteractiveObject::SetPolygonOffsets* and *AIS_InteractiveContext::SetPolygonOffsets* allow setting up the polygon offsets. @subsubsection occt_visu_3_2_7 Object hierarchy Each *PrsMgr_PresentableObject* has a list of objects called *myChildren*. -Any transformation of *PrsMgr_PresentableObject* is also applied to its children. This hierarchy does not propagate to *Graphic3d* level and below. +Any transformation of *PrsMgr_PresentableObject* is also applied to its children. +This hierarchy does not propagate to *Graphic3d* level and below. *PrsMgr_PresentableObject* sends its combined (according to the hierarchy) transformation down to *Graphic3d_Structure*. The materials of structures are not affected by the hierarchy. @@ -640,15 +778,23 @@ Classes *AIS_ConnectedInteractive* and *AIS_MultipleConnectedInteractive* are used to implement this conception. -*AIS_ConnectedInteractive* is an object instance, which reuses the geometry of the connected object but has its own transformation and visibility flag. This connection is propagated down to *OpenGl* level, namely to *OpenGl_Structure*. *OpenGl_Structure* can be connected only to a single other structure. +*AIS_ConnectedInteractive* is an object instance, which reuses the geometry of the connected object but has its own transformation and visibility flag. +This connection is propagated down to *OpenGl* level, namely to *OpenGl_Structure*. +*OpenGl_Structure* can be connected only to a single other structure. + +*AIS_ConnectedInteractive* can be referenced to any *AIS_InteractiveObject* in general. +When it is referenced to another *AIS_ConnectedInteractive*, it just copies the reference. + +*AIS_MultipleConnectedInteractive* represents an assembly, which does not have its own presentation. +The assemblies are able to participate in the object hierarchy and are intended to handle a grouped set of instanced objects. +It behaves as a single object in terms of selection. +It applies high level transformation to all sub-elements since it is located above in the hierarchy. -*AIS_ConnectedInteractive* can be referenced to any *AIS_InteractiveObject* in general. When it is referenced to another *AIS_ConnectedInteractive*, it just copies the reference. +All *AIS_MultipleConnectedInteractive* are able to have child assemblies. +Deep copy of object instances tree is performed if one assembly is attached to another. -*AIS_MultipleConnectedInteractive* represents an assembly, which does not have its own presentation. The assemblies are able to participate in the object hierarchy and are intended to handle a grouped set of instanced objects. It behaves as a single object in terms of selection. It applies high level transformation to all sub-elements since it is located above in the hierarchy. - -All *AIS_MultipleConnectedInteractive* are able to have child assemblies. Deep copy of object instances tree is performed if one assembly is attached to another. - -Note that *AIS_ConnectedInteractive* cannot reference *AIS_MultipleConnectedInteractive*. *AIS_ConnectedInteractive* copies sensitive entities of the origin object for selection, unlike *AIS_MultipleConnectedInteractive* that re-uses the entities of the origin object. +Note that *AIS_ConnectedInteractive* cannot reference *AIS_MultipleConnectedInteractive*. +*AIS_ConnectedInteractive* copies sensitive entities of the origin object for selection, unlike *AIS_MultipleConnectedInteractive* that re-uses the entities of the origin object. Instances can be controlled by the following DRAW commands: * *vconnect* : Creates and displays *AIS_MultipleConnectedInteractive* object from input objects and location. @@ -659,7 +805,7 @@ Have a look at the examples below: ~~~~~ -pload ALL +pload MODELING VISUALIZATION vinit psphere s 1 vdisplay s @@ -671,10 +817,11 @@ @figure{/user_guides/visualization/images/visualization_image029.png,"",240} -The original object does not have to be displayed in order to make instance. Also selection handles transformations of instances correctly: +The original object does not have to be displayed in order to make instance. +Also selection handles transformations of instances correctly: ~~~~~ -pload ALL +pload MODELING VISUALIZATION vinit psphere s 1 psphere p 0.5 @@ -689,7 +836,7 @@ Here is the example of a more complex hierarchy involving sub-assemblies: ~~~~~ -pload ALL +pload MODELING VISUALIZATION vinit box b 1 1 1 psphere s 0.5 @@ -710,11 +857,13 @@ @subsubsection occt_visu_3_3_1 Rules -The Interactive Context allows managing in a transparent way the graphic and **selectable** behavior of interactive objects in one or more viewers. Most functions which allow modifying the attributes of interactive objects, and which were presented in the preceding chapter, will be looked at again here. +The Interactive Context allows managing in a transparent way the graphic and **selectable** behavior of interactive objects in one or more viewers. +Most functions which allow modifying the attributes of interactive objects, and which were presented in the preceding chapter, will be looked at again here. -There is one essential rule to follow: the modification of an interactive object, which is already known by the Context, must be done using Context functions. You can only directly call the functions available for an interactive object if it has not been loaded into an Interactive Context. +There is one essential rule to follow: the modification of an interactive object, which is already known by the Context, must be done using Context functions. +You can only directly call the functions available for an interactive object if it has not been loaded into an Interactive Context. -~~~~~ +~~~~~{.cpp} Handle(AIS_Shape) aShapePrs = new AIS_Shape (theShape); myIntContext->Display (aShapePrs, AIS_Shaded, 0, false, aShapePrs->AcceptShapeDecomposition()); myIntContext->SetColor(aShapePrs, Quantity_NOC_RED); @@ -722,7 +871,7 @@ You can also write -~~~~~ +~~~~~{.cpp} Handle(AIS_Shape) aShapePrs = new AIS_Shape (theShape); aShapePrs->SetColor (Quantity_NOC_RED); aShapePrs->SetDisplayMode (AIS_Shaded); @@ -731,13 +880,15 @@ @subsubsection occt_visu_3_3_2 Groups of functions -**Neutral Point** and **Local Selection** constitute the two operating modes or states of the **Interactive Context**, which is the central entity which pilots visualizations and selections. +**Neutral Point** and **Local Selection** constitute the two operating modes or states of the **Interactive Context**, +which is the central entity which pilots visualizations and selections. The **Neutral Point**, which is the default mode, allows easily visualizing and selecting interactive objects, which have been loaded into the context. Activating **Local Selection** for specific Objects allows selecting of their sub-parts. @subsubsection occt_visu_3_3_3 Management of the Interactive Context -An interactive object can have a certain number of specific graphic attributes, such as visualization mode, color, and material. Correspondingly, the interactive context has a set of graphic attributes, the *Drawer*, which is valid by default for the objects it controls. +An interactive object can have a certain number of specific graphic attributes, such as visualization mode, color, and material. +Correspondingly, the interactive context has a set of graphic attributes, the *Drawer*, which is valid by default for the objects it controls. When an interactive object is visualized, the required graphic attributes are first taken from the object's own *Drawer* if it exists, or from the context drawer if otherwise. The following adjustable settings allow personalizing the behavior of presentations and selections: @@ -747,21 +898,21 @@ * Pre-selection color. By default: *Quantity_NOC_GREEN*; * Selection color (when you click on a detected object). By default: *Quantity_NOC_GRAY80*; -All of these settings can be modified by functions proper to the Context. +All of these settings can be modified by functions proper to the AIS_InteractiveContext. When you change a graphic attribute pertaining to the Context (visualization mode, for example), all interactive objects, which do not have the corresponding appropriate attribute, are updated. Let us examine the case of two interactive objects: *theObj1* and *theObj2*: -~~~~~ +~~~~~{.cpp} theCtx->Display (theObj1, false); theCtx->Display (theObj2, true); // TRUE for viewer update theCtx->SetDisplayMode (theObj1, 3, false); theCtx->SetDisplayMode (2, true); -// theObj2 is visualised in mode 2 (if it accepts this mode) -// theObj1 stays visualised in its mode 3 +// theObj2 is visualized in mode 2 (if it accepts this mode) +// theObj1 stays visualized in its mode 3 ~~~~~ -*PresentationManager* and *Selector3D*, which manage the presentation and selection of present interactive objects, are associated to the main Viewer. +*PrsMgr_PresentationManager* and *SelectMgr_ViewerSelector3d*, which manage the presentation and selection of present interactive objects, are associated to the main Viewer. *WARNING!* Do NOT use integer values (like in sample above) in real code - use appropriate enumerations instead! Each presentable object has independent list of supported display and selection modes; for instance, *AIS_DisplayMode* enumeration is applicable only to *AIS_Shape* presentations. @@ -770,10 +921,13 @@ @subsubsection occt_visu_3_4_1 Selection Modes -The Local Selection is defined by index (Selection Mode). The Selection Modes implemented by a specific interactive object and their meaning should be checked within the documentation of this class. +The Local Selection is defined by index (Selection Mode). +The Selection Modes implemented by a specific interactive object and their meaning should be checked within the documentation of this class. See, for example, *MeshVS_SelectionModeFlags* for *MeshVS_Mesh* object. -*AIS_Shape* is the most used interactive object. It provides API to manage selection operations on the constituent elements of shapes (selection of vertices, edges, faces, etc.). The Selection Mode for a specific shape type (*TopAbs_ShapeEnum*) is returned by method *AIS_Shape::SelectionMode()*. +*AIS_Shape* is the most used interactive object. +It provides API to manage selection operations on the constituent elements of shapes (selection of vertices, edges, faces, etc.). +The Selection Mode for a specific shape type (*TopAbs_ShapeEnum*) is returned by method *AIS_Shape::SelectionMode()*. The method *AIS_InteractiveContext::Display()* without a Selection Mode argument activates the default Selection Mode of the object. The methods *AIS_InteractiveContext::Activate()* and *AIS_InteractiveContext::Deactivate()* activate and deactivate a specific Selection Mode. @@ -784,12 +938,16 @@ @subsubsection occt_visu_3_4_2 Filters To define an environment of dynamic detection, you can use standard filter classes or create your own. -A filter questions the owner of the sensitive primitive to determine if it has the desired qualities. If it answers positively, it is kept. If not, it is rejected. +A filter questions the owner of the sensitive primitive to determine if it has the desired qualities. +If it answers positively, it is kept. If not, it is rejected. -The root class of objects is *SelectMgr_Filter*. The principle behind it is straightforward: a filter tests to see whether the owners (*SelectMgr_EntityOwner*) detected in mouse position by selector answer *OK*. If so, it is kept, otherwise it is rejected. +The root class of objects is *SelectMgr_Filter*. +The principle behind it is straightforward: a filter tests to see whether the owners (*SelectMgr_EntityOwner*) detected in mouse position by selector answer *OK*. +If so, it is kept, otherwise it is rejected. You can create a custom class of filter objects by implementing the deferred function *SelectMgr_Filter::IsOk()*. -In *SelectMgr*, there are also Composition filters (AND Filters, OR Filters), which allow combining several filters. In Interactive Context, all filters that you add are stored in an OR filter (which answers *OK* if at least one filter answers *OK*). +In *SelectMgr*, there are also Composition filters (AND Filters, OR Filters), which allow combining several filters. +In Interactive Context, all filters that you add are stored in an OR filter (which answers *OK* if at least one filter answers *OK*). There are Standard filters, which have already been implemented in several packages: * *StdSelect_EdgeFilter* -- for edges, such as lines and circles; @@ -807,7 +965,7 @@ #### Example -~~~~~ +~~~~~{.cpp} // shading visualization mode, no specific mode, authorization for decomposition into sub-shapes const TopoDS_Shape theShape; Handle(AIS_Shape) aShapePrs = new AIS_Shape (theShape); @@ -828,24 +986,31 @@ @subsubsection occt_visu_3_4_6 Selection -Dynamic detection and selection are put into effect in a straightforward way. There are only a few conventions and functions to be familiar with: +Dynamic detection and selection are put into effect in a straightforward way. +There are only a few conventions and functions to be familiar with: * *AIS_InteractiveContext::MoveTo* -- passes mouse position to Interactive Context selectors. - * *AIS_InteractiveContext::Select* -- stores what has been detected at the last *MoveTo*. Replaces the previously selected object. Empties the stack if nothing has been detected at the last move. - * *AIS_InteractiveContext::ShiftSelect* -- if the object detected at the last move was not already selected, it is added to the list of the selected objects. If not, it is withdrawn. Nothing happens if you click on an empty area. + * *AIS_InteractiveContext::Select* -- stores what has been detected at the last *MoveTo*. + Replaces the previously selected object. + Empties the stack if nothing has been detected at the last move. + * *AIS_InteractiveContext::ShiftSelect* -- if the object detected at the last move was not already selected, it is added to the list of the selected objects. + If not, it is withdrawn. Nothing happens if you click on an empty area. * *AIS_InteractiveContext::Select* -- selects everything found in the surrounding area. * *AIS_InteractiveContext::ShiftSelect* -- selects what was not previously in the list of selected, deselects those already present. -Highlighting of detected and selected entities is automatically managed by the Interactive Context. The Highlight colors are those dealt with above. You can nonetheless disconnect this automatic mode if you want to manage this part yourself: -~~~~~ +Highlighting of detected and selected entities is automatically managed by the Interactive Context. +The Highlight colors are those dealt with above. You can nonetheless disconnect this automatic mode if you want to manage this part yourself: +~~~~~{.cpp} AIS_InteractiveContext::SetAutomaticHilight AIS_InteractiveContext::AutomaticHilight ~~~~~ -You can question the Interactive context by moving the mouse. The following functions can be used: +You can question the Interactive context by moving the mouse. +The following functions can be used: * *AIS_InteractiveContext::HasDetected* -- checks if there is a detected entity; * *AIS_InteractiveContext::DetectedOwner* -- returns the (currently highlighted) detected entity. -After using the *Select* and *ShiftSelect* functions, you can explore the list of selections. The following functions can be used: +After using the *Select* and *ShiftSelect* functions, you can explore the list of selections. +The following functions can be used: * *AIS_InteractiveContext::InitSelected* -- initializes an iterator; * *AIS_InteractiveContext::MoreSelected* -- checks if the iterator is valid; * *AIS_InteractiveContext::NextSelected* -- moves the iterator to the next position; @@ -857,7 +1022,7 @@ #### Example -~~~~~ +~~~~~{.cpp} for (myAISCtx->InitSelected(); myAISCtx->MoreSelected(); myAISCtx->NextSelected()) { Handle(SelectMgr_EntityOwner) anOwner = myAISCtx->SelectedOwner(); @@ -880,7 +1045,9 @@ * the **Object** -- a topological shape or connection between shapes; * **None** -- a token, that instead of eliminating the object, tells the application to look further until it finds an acceptable object definition in its generation. -Inside these categories, there is a possibility of additional characterization by means of a signature. The signature provides an index to the further characterization. By default, the **Interactive Object** has a *None* type and a signature of 0 (equivalent to *None*). +Inside these categories, there is a possibility of additional characterization by means of a signature. +The signature provides an index to the further characterization. +By default, the **Interactive Object** has a *None* type and a signature of 0 (equivalent to *None*). If you want to give a particular type and signature to your interactive object, you must redefine the two virtual methods: *Type* and *Signature*. @subsubsection occt_visu_3_5_1 Datum @@ -903,7 +1070,10 @@ * mode 1 : selection of the origin of the trihedron; * mode 2 : selection of the axes -- same remarks as for the Trihedron. -For the presentation of planes and trihedra, the default length unit is millimeter and the default value for the representation of axes is 10. To modify these dimensions, you must temporarily recover the object **Drawer**. From it, take the *DatumAspect()* and change the value *FirstAxisLength*. Finally, recalculate the presentation. +For the presentation of planes and trihedra, the default length unit is millimeter and the default value for the representation of axes is 10. +To modify these dimensions, you must temporarily recover the object **Drawer**. +From it, take the *DatumAspect()* and change the value *FirstAxisLength*. +Finally, recalculate the presentation. @subsubsection occt_visu_3_5_2 Object @@ -913,14 +1083,17 @@ * mode AIS_WireFrame : Line (default mode) * mode AIS_Shaded : Shading (depending on the type of shape) -*AIS_ConnectedInteractive* is an Interactive Object connecting to another interactive object reference, and located elsewhere in the viewer makes it possible not to calculate presentation and selection, but to deduce them from your object reference. -*AIS_MultipleConnectedInteractive* is an object connected to a list of interactive objects (which can also be Connected objects. It does not require memory-hungry presentation calculations). +*AIS_ConnectedInteractive* is an Interactive Object connecting to another interactive object reference, +and located elsewhere in the viewer makes it possible not to calculate presentation and selection, but to deduce them from your object reference. +*AIS_MultipleConnectedInteractive* is an object connected to a list of interactive objects +(which can also be Connected objects; it does not require memory-hungry presentation calculations). -*MeshVS_Mesh* is an Interactive Object that represents meshes, it has a data source that provides geometrical information (nodes, elements) and can be built up from the source data with a custom presentation builder. +*MeshVS_Mesh* is an Interactive Object that represents meshes, it has a data source that provides geometrical information (nodes, elements) +and can be built up from the source data with a custom presentation builder. The class *AIS_ColoredShape* allows using custom colors and line widths for *TopoDS_Shape* objects and their sub-shapes. -~~~~~ +~~~~~{.cpp} AIS_ColoredShape aColoredShape = new AIS_ColoredShape (theShape); // setup color of entire shape @@ -939,14 +1112,17 @@ aColoredShape->SetCustomWidth (theSubShape, 0.25); ~~~~~ -The presentation class *AIS_PointCloud* can be used for efficient drawing of large arbitrary sets of colored points. It uses *Graphic3d_ArrayOfPoints* to pass point data into OpenGl graphic driver to draw a set points as an array of "point sprites". The point data is packed into vertex buffer object for performance. +The presentation class *AIS_PointCloud* can be used for efficient drawing of large arbitrary sets of colored points. +It uses *Graphic3d_ArrayOfPoints* to pass point data into OpenGl graphic driver to draw a set points as an array of "point sprites". +The point data is packed into vertex buffer object for performance. - The type of point marker used to draw points can be specified as a presentation aspect. -- The presentation provides selection by a bounding box of the visualized set of points. It supports two display / highlighting modes: points or bounding box. +- The presentation provides selection by a bounding box of the visualized set of points. + It supports two display / highlighting modes: points or bounding box. @figure{point_cloud.png,"A random colored cloud of points",240} Example: -~~~~~ +~~~~~{.cpp} Handle(Graphic3d_ArrayOfPoints) aPoints = new Graphic3d_ArrayOfPoints (2000, Standard_True); aPoints->AddVertex (gp_Pnt(-40.0, -40.0, -40.0), Quantity_Color (Quantity_NOC_BLUE1)); aPoints->AddVertex (gp_Pnt (40.0, 40.0, 40.0), Quantity_Color (Quantity_NOC_BLUE2)); @@ -960,60 +1136,69 @@ @subsubsection occt_visu_3_5_3 Relations -The **Relation** is made up of constraints on one or more interactive shapes and the corresponding reference geometry. For example, you might want to constrain two edges in a parallel relation. This constraint is considered as an object in its own right, and is shown as a sensitive primitive. This takes the graphic form of a perpendicular arrow marked with the || symbol and lying between the two edges. - -The following relations are provided by *AIS*: - * *AIS_ConcentricRelation* - * *AIS_FixRelation* - * *AIS_IdenticRelation* - * *AIS_ParallelRelation* - * *AIS_PerpendicularRelation* - * *AIS_Relation* - * *AIS_SymmetricRelation* - * *AIS_TangentRelation* +The **Relation** is made up of constraints on one or more interactive shapes and the corresponding reference geometry. +For example, you might want to constrain two edges in a parallel relation. +This constraint is considered as an object in its own right, and is shown as a sensitive primitive. +This takes the graphic form of a perpendicular arrow marked with the || symbol and lying between the two edges. + +The following relations are provided by *PrsDim*: + * *PrsDim_ConcentricRelation* + * *PrsDim_FixRelation* + * *PrsDim_IdenticRelation* + * *PrsDim_ParallelRelation* + * *PrsDim_PerpendicularRelation* + * *PrsDim_Relation* + * *PrsDim_SymmetricRelation* + * *PrsDim_TangentRelation* The list of relations is not exhaustive. @subsubsection occt_visu_3_5_4 Dimensions - * *AIS_AngleDimension* - * *AIS_Chamf3dDimension* - * *AIS_DiameterDimension* - * *AIS_DimensionOwner* - * *AIS_LengthDimension* - * *AIS_OffsetDimension* - * *AIS_RadiusDimension* + * *PrsDim_AngleDimension* + * *PrsDim_Chamf3dDimension* + * *PrsDim_DiameterDimension* + * *PrsDim_DimensionOwner* + * *PrsDim_LengthDimension* + * *PrsDim_OffsetDimension* + * *PrsDim_RadiusDimension* @subsubsection occt_visu_3_5_5 MeshVS_Mesh -*MeshVS_Mesh* is an Interactive Object that represents meshes. This object differs from the *AIS_Shape* as its geometrical data is supported by the data source *MeshVS_DataSource* that describes nodes and elements of the object. As a result, you can provide your own data source. +*MeshVS_Mesh* is an Interactive Object that represents meshes. +This object differs from the *AIS_Shape* as its geometrical data is supported by the data source *MeshVS_DataSource* that describes nodes and elements of the object. +As a result, you can provide your own data source. However, the *DataSource* does not provide any information on attributes, for example nodal colors, but you can apply them in a special way -- by choosing the appropriate presentation builder. -The presentations of *MeshVS_Mesh* are built with the presentation builders *MeshVS_PrsBuilder*. You can choose between the builders to represent the object in a different way. Moreover, you can redefine the base builder class and provide your own presentation builder. +The presentations of *MeshVS_Mesh* are built with the presentation builders *MeshVS_PrsBuilder*. +You can choose between the builders to represent the object in a different way. +Moreover, you can redefine the base builder class and provide your own presentation builder. You can add/remove builders using the following methods: -~~~~~ +~~~~~{.cpp} MeshVS_Mesh::AddBuilder (const Handle(MeshVS_PrsBuilder)& theBuilder, Standard_Boolean theToTreatAsHilighter); MeshVS_Mesh::RemoveBuilder (const Standard_Integer theIndex); MeshVS_Mesh::RemoveBuilderById (const Standard_Integer theId); ~~~~~ -There is a set of reserved display and highlighting mode flags for *MeshVS_Mesh*. Mode value is a number of bits that allows selecting additional display parameters and combining the following mode flags, which allow displaying mesh in wireframe, shading and shrink modes: -~~~~~ +There is a set of reserved display and highlighting mode flags for *MeshVS_Mesh*. +Mode value is a number of bits that allows selecting additional display parameters and combining the following mode flags, +which allow displaying mesh in wireframe, shading and shrink modes: +~~~~~{.cpp} MeshVS_DMF_WireFrame MeshVS_DMF_Shading MeshVS_DMF_Shrink ~~~~~ -It is also possible to display deformed mesh in wireframe, shading or shrink modes usung: -~~~~~ +It is also possible to display deformed mesh in wireframe, shading or shrink modes using: +~~~~~{.cpp} MeshVS_DMF_DeformedPrsWireFrame MeshVS_DMF_DeformedPrsShading MeshVS_DMF_DeformedPrsShrink ~~~~~ The following methods represent different kinds of data: -~~~~~ +~~~~~{.cpp} MeshVS_DMF_VectorDataPrs MeshVS_DMF_NodalColorDataPrs MeshVS_DMF_ElementalColorDataPrs @@ -1022,7 +1207,7 @@ ~~~~~ The following methods provide selection and highlighting: -~~~~~ +~~~~~{.cpp} MeshVS_DMF_SelectionPrs MeshVS_DMF_HilightPrs ~~~~~ @@ -1043,7 +1228,7 @@ Such an object, for example, can be used for displaying the object and stored in the STL file format: -~~~~~ +~~~~~{.cpp} // read the data and create a data source Handle(Poly_Triangulation) aSTLMesh = RWStl::ReadFile (aFileName); Handle(XSDRAWSTLVRML_DataSource) aDataSource = new XSDRAWSTLVRML_DataSource (aSTLMesh); @@ -1061,7 +1246,7 @@ To do this you should define a color map for the color scale, pass this map to the presentation builder, and define an appropriate value in the range of 0.0 - 1.0 for every node. The following example demonstrates how you can do this (check if the view has been set up to display textures): -~~~~~ +~~~~~{.cpp} // assign nodal builder to the mesh Handle(MeshVS_NodalColorPrsBuilder) aBuilder = new MeshVS_NodalColorPrsBuilder (theMeshPrs, MeshVS_DMF_NodalColorDataPrs | MeshVS_DMF_OCCMask); aBuilder->UseTexture (true); @@ -1086,7 +1271,9 @@ @subsection occt_visu_3_6 Dynamic Selection -The dynamic selection represents the topological shape, which you want to select, by decomposition of *sensitive primitives* -- the sub-parts of the shape that will be detected and highlighted. The sets of these primitives are handled by the powerful three-level BVH tree selection algorithm. +The dynamic selection represents the topological shape, which you want to select, +by decomposition of *sensitive primitives* -- the sub-parts of the shape that will be detected and highlighted. +The sets of these primitives are handled by the powerful three-level BVH tree selection algorithm. For more details on the algorithm and examples of usage, refer to @ref occt_visu_2_2 "Selection" chapter. @@ -1094,19 +1281,41 @@ @subsection occt_visu_4_1 Glossary of 3D terms -* **Group** -- a set of primitives and attributes on those primitives. Primitives and attributes may be added to a group but cannot be removed from it, unless erased globally. A group can have a pick identity. -* **Light** There are five kinds of light source -- ambient, headlight, directional, positional and spot. The light is only activated in a shading context in a view. -* **Primitive** -- a drawable element. It has a definition in 3D space. Primitives can either be lines, faces, text, or markers. Once displayed markers and text remain the same size. Lines and faces can be modified e.g. zoomed. Primitives must be stored in a group. -* **Structure** -- manages a set of groups. The groups are mutually exclusive. A structure can be edited, adding or removing groups. A structure can reference other structures to form a hierarchy. It has a default (identity) transformation and other transformations may be applied to it (rotation, translation, scale, etc). It has no default attributes for the primitive lines, faces, markers, and text. Attributes may be set in a structure but they are overridden by the attributes in each group. Each structure has a display priority associated with it, which rules the order in which it is redrawn in a 3D viewer. If the visualization mode is incompatible with the view it is not displayed in that view, e.g. a shading-only object is not visualized in a wireframe view. +* **Group** -- a set of primitives and attributes on those primitives. + Primitives and attributes may be added to a group but cannot be removed from it, unless erased globally. + A group can have a pick identity. +* **Light** + There are five kinds of light source -- ambient, headlight, directional, positional and spot. +* **Primitive** -- a drawable element. + It has a definition in 3D space. + Primitives can either be lines, faces, text, or markers. + Once displayed markers and text remain the same size. + Lines and faces can be modified e.g. zoomed. + Attributes are set within the group. + Primitives must be stored in a group. +* **Structure** -- manages a set of groups. + The groups are mutually exclusive. + A structure can be edited, adding or removing groups. + A structure can reference other structures to form a hierarchy. + It has a default (identity) transformation and other transformations may be applied to it (rotation, translation, scale, etc). + Each structure has a display priority associated with it, which rules the order in which it is redrawn in a 3D viewer. * **View** -- is defined by a view orientation, a view mapping, and a context view. * **Viewer** -- manages a set of views. * **View orientation** -- defines the manner in which the observer looks at the scene in terms of View Reference Coordinates. -* **View mapping** -- defines the transformation from View Reference Coordinates to the Normalized Projection Coordinates. This follows the Phigs scheme. -* **Z-Buffering** -- a form of hidden surface removal in shading mode only. This is always active for a view in the shading mode. It cannot be suppressed. +* **View mapping** -- defines the transformation from View Reference Coordinates to the Normalized Projection Coordinates. + This follows the Phigs scheme. +* **Z-Buffering** -- a form of hidden surface removal in shading mode only. + This is always active for a view in the shading mode and cannot be suppressed. @subsection occt_visu_4_2 Graphic primitives -The *Graphic3d* package is used to create 3D graphic objects in a 3D viewer. These objects called **structures** are made up of groups of primitives and attributes, such as polylines, planar polygons with or without holes, text and markers, and attributes, such as color, transparency, reflection, line type, line width, and text font. A group is the smallest editable element of a structure. A transformation can be applied to a structure. Structures can be connected to form a tree of structures, composed by transformations. Structures are globally manipulated by the viewer. +The *Graphic3d* package is used to create 3D graphic objects in a 3D viewer. +These objects called **structures** are made up of groups of primitives, such as line segments, triangles, text and markers, +and attributes, such as color, transparency, reflection, line type, line width, and text font. +A group is the smallest editable element of a structure. +A transformation can be applied to a structure. +Structures can be connected to form a tree of structures, composed by transformations. +Structures are globally manipulated by the viewer. Graphic structures can be: * Displayed, @@ -1122,7 +1331,10 @@ @subsubsection occt_visu_4_2_2 Structure hierarchies -The root is the top of a structure hierarchy or structure network. The attributes of a parent structure are passed to its descendants. The attributes of the descendant structures do not affect the parent. Recursive structure networks are not supported. +The root is the top of a structure hierarchy or structure network. +The attributes of a parent structure are passed to its descendants. +The attributes of the descendant structures do not affect the parent. +Recursive structure networks are not supported. @subsubsection occt_visu_4_2_3 Graphic primitives * **Markers** @@ -1157,7 +1369,7 @@ The following example shows how to define an array of points: -~~~~~ +~~~~~{.cpp} // create an array Handle(Graphic3d_ArrayOfPoints) anArray = new Graphic3d_ArrayOfPoints (theVerticiesMaxCount); @@ -1172,17 +1384,15 @@ ~~~~~ If the primitives share the same vertices (polygons, triangles, etc.) then you can define them as indices of the vertices array. -The method *Graphic3d_ArrayOfPrimitives::AddEdge* allows defining the primitives by indices. This method adds an "edge" in the range *[1, VertexNumber()]* in the array. +The method *Graphic3d_ArrayOfPrimitives::AddEdge* allows defining the primitives by indices. +This method adds an "edge" in the range *[1, VertexNumber()]* in the array. It is also possible to query the vertex defined by an edge using method *Graphic3d_ArrayOfPrimitives::Edge*. The following example shows how to define an array of triangles: -~~~~~ +~~~~~{.cpp} // create an array -Standard_Boolean hasNormals = false; -Standard_Boolean hasColors = false; -Standard_Boolean hasTextureCrds = false; -Handle(Graphic3d_ArrayOfTriangles) anArray = new Graphic3d_ArrayOfTriangles (theVerticesMaxCount, theEdgesMaxCount, hasNormals, hasColors, hasTextureCrds); +Handle(Graphic3d_ArrayOfTriangles) anArray = new Graphic3d_ArrayOfTriangles (theVerticesMaxCount, theEdgesMaxCount, Graphic3d_ArrayFlags_None); // add vertices to the array anArray->AddVertex (-1.0, 0.0, 0.0); // vertex 1 anArray->AddVertex ( 1.0, 0.0, 0.0); // vertex 2 @@ -1190,12 +1400,8 @@ anArray->AddVertex ( 0.0,-1.0, 0.0); // vertex 4 // add edges to the array -anArray->AddEdge (1); // first triangle -anArray->AddEdge (2); -anArray->AddEdge (3); -anArray->AddEdge (1); // second triangle -anArray->AddEdge (2); -anArray->AddEdge (4); +anArray->AddEdges (1, 2, 3); // first triangle +anArray->AddEdges (1, 2, 4); // second triangle // add the array to the structure Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); @@ -1205,24 +1411,25 @@ @subsubsection occt_visu_4_2_5 Text primitive -*TKOpenGl* toolkit renders text labels using texture fonts. *Graphic3d* text primitives have the following features: +*TKOpenGl* toolkit renders text labels using texture fonts. +*Graphic3d* text primitives have the following features: * fixed size (non-zoomable) or zoomable, * can be rotated to any angle in the view plane, * support unicode charset. The text attributes for the group could be defined with the *Graphic3d_AspectText3d* attributes group. To add any text to the graphic structure you can use the following methods: -~~~~~ +~~~~~{.cpp} void Graphic3d_Group::AddText (const Handle(Graphic3d_Text)& theTextParams, const Standard_Boolean theToEvalMinMax); ~~~~~ -You can pass FALSE as *theToEvalMinMax* if you do not want the graphic3d structure boundaries to be affected by the text position. +You can pass FALSE as *theToEvalMinMax* if you do not want the Graphic3d structure boundaries to be affected by the text position. **Note** that the text orientation angle can be defined by *Graphic3d_AspectText3d* attributes. See the example: -~~~~~ +~~~~~{.cpp} // get the group Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); @@ -1241,12 +1448,11 @@ @subsubsection occt_visu_4_2_6 Materials -A *Graphic3d_MaterialAspect* is defined by: +A *Graphic3d_MaterialAspect* defines the following Common material properties: * Transparency; * Diffuse reflection -- a component of the object color; * Ambient reflection; - * Specular reflection -- a component of the color of the light source; - * Refraction index. + * Specular reflection -- a component of the color of the light source. The following items are required to determine the three colors of reflection: * Color; @@ -1254,6 +1460,14 @@ * Coefficient of ambient reflection; * Coefficient of specular reflection. +Common material properties are used within Gouraud and Phong shading models (Graphic3d_TOSM_FACET, Graphic3d_TOSM_VERTEX and Graphic3d_TOSM_FRAGMENT). +Within PBR shading model (Graphic3d_TOSM_PBR and Graphic3d_TOSM_PBR_FACET), material properties are defined by the following *Graphic3d_PBRMaterial* properties (Graphic3d_MaterialAspect::PBRMaterial()): + * Albedo (main color); + * Metallic factor; + * Roughness factor; + * Transparency; + * Index of refraction. + @subsubsection occt_visu_4_2_7 Textures A *texture* is defined by a name. @@ -1262,11 +1476,13 @@ * 2D; * Environment mapping. -@subsubsection occt_visu_4_2_8 Shaders +@subsubsection occt_visu_4_2_8 Custom shaders -OCCT visualization core supports GLSL shaders. Shaders can be assigned to a generic presentation by its drawer attributes (Graphic3d aspects). To enable custom shader for a specific AIS_Shape in your application, the following API functions can be used: +OCCT visualization core supports GLSL shaders. +Custom shaders can be assigned to a generic presentation by its drawer attributes (Graphic3d aspects). +To enable custom shader for a specific AIS_Shape in your application, the following API functions can be used: -~~~~~ +~~~~~{.cpp} // Create shader program Handle(Graphic3d_ShaderProgram) aProgram = new Graphic3d_ShaderProgram(); @@ -1298,39 +1514,38 @@ @subsubsection occt_visu_4_4_1 Overview -The *V3d* package provides the resources to define a 3D viewer and the views attached to this viewer (orthographic, perspective). This package provides the commands to manipulate the graphic scene of any 3D object visualized in a view on screen. +The *V3d* package provides the resources to define a 3D viewer and the views attached to this viewer (orthographic, perspective). +This package provides the commands to manipulate the graphic scene of any 3D object visualized in a view on screen. A set of high-level commands allows the separate manipulation of parameters and the result of a projection (Rotations, Zoom, Panning, etc.) as well as the visualization attributes (Mode, Lighting, Clipping, etc.) in any particular view. -The *V3d* package is basically a set of tools directed by commands from the viewer front-end. This tool set contains methods for creating and editing classes of the viewer such as: +The *V3d* package is basically a set of tools directed by commands from the viewer front-end. +This tool set contains methods for creating and editing classes of the viewer such as: * Default parameters of the viewer, * Views (orthographic, perspective), * Lighting (positional, directional, ambient, spot, headlight), * Clipping planes, - * Instantiated sequences of views, planes, light sources, graphic structures, and picks, + * Instantiated sequences of views, planes, light sources, graphic structures, and picks, * Various package methods. @subsubsection occt_visu_4_4_2 A programming example This sample TEST program for the *V3d* Package uses primary packages *Xw* and *Graphic3d* and secondary packages *Visual3d, Aspect, Quantity* and *math*. -~~~~~ +~~~~~{.cpp} // create a default display connection Handle(Aspect_DisplayConnection) aDispConnection = new Aspect_DisplayConnection(); // create a Graphic Driver Handle(OpenGl_GraphicDriver) aGraphicDriver = new OpenGl_GraphicDriver (aDispConnection); // create a Viewer to this Driver -Handle(V3d_Viewer) VM = new V3d_Viewer (aGraphicDriver); -VM->SetDefaultBackgroundColor (Quantity_NOC_DARKVIOLET); -VM->SetDefaultViewProj (V3d_Xpos); +Handle(V3d_Viewer) aViewer = new V3d_Viewer (aGraphicDriver); +aViewer->SetDefaultBackgroundColor (Quantity_NOC_DARKVIOLET); // Create a structure in this Viewer -Handle(Graphic3d_Structure) aStruct = new Graphic3d_Structure (VM->Viewer()); - -// Type of structure -aStruct->SetVisual (Graphic3d_TOS_SHADING); +Handle(Graphic3d_Structure) aStruct = new Graphic3d_Structure (aViewer->StructureManager()); +aStruct->SetVisual (Graphic3d_TOS_SHADING); // Type of structure // Create a group of primitives in this structure -Handle(Graphic3d_Group) aPrsGroup = new Graphic3d_Group (aStruct); +Handle(Graphic3d_Group) aPrsGroup = aStruct->NewGroup(); // Fill this group with one quad of size 100 Handle(Graphic3d_ArrayOfTriangleStrips) aTriangles = new Graphic3d_ArrayOfTriangleStrips (4); @@ -1338,59 +1553,61 @@ aTriangles->AddVertex (-100./2., 100./2., 0.0); aTriangles->AddVertex ( 100./2., -100./2., 0.0); aTriangles->AddVertex ( 100./2., 100./2., 0.0); + +Handle(Graphic3d_AspectFillArea3d) anAspects = new Graphic3d_AspectFillArea3d (Aspect_IS_SOLID, Quantity_NOC_RED, + Quantity_NOC_RED, Aspect_TOL_SOLID, 1.0f, + Graphic3d_NameOfMaterial_Gold, Graphic3d_NameOfMaterial_Gold); +aPrsGroup->SetGroupPrimitivesAspect (anAspects); aPrsGroup->AddPrimitiveArray (aTriangles); -aPrsGroup->SetGroupPrimitivesAspect (new Graphic3d_AspectFillArea3d()); // Create Ambient and Infinite Lights in this Viewer -Handle(V3d_AmbientLight) aLight1 = new V3d_AmbientLight (VM, Quantity_NOC_GRAY50); -Handle(V3d_DirectionalLight) aLight2 = new V3d_DirectionalLight (VM, V3d_XnegYnegZneg, Quantity_NOC_WHITE); +Handle(V3d_AmbientLight) aLight1 = new V3d_AmbientLight (Quantity_NOC_GRAY50); +Handle(V3d_DirectionalLight) aLight2 = new V3d_DirectionalLight (V3d_Zneg, Quantity_NOC_WHITE, true); +aViewer->AddLight (aLight1); +aViewer->AddLight (aLight2); +aViewer->SetLightOn(); // Create a 3D quality Window with the same DisplayConnection -Handle(Xw_Window) aWindow = new Xw_Window (aDispConnection, "Test V3d", 0.5, 0.5, 0.5, 0.5); - -// Map this Window to this screen -aWindow->Map(); +Handle(Xw_Window) aWindow = new Xw_Window (aDispConnection, "Test V3d", 100, 100, 500, 500); +aWindow->Map(); // Map this Window to this screen // Create a Perspective View in this Viewer -Handle(V3d_View) aView = new V3d_View (VM); +Handle(V3d_View) aView = new V3d_View (aViewer); aView->Camera()->SetProjectionType (Graphic3d_Camera::Projection_Perspective); // Associate this View with the Window -aView ->SetWindow (aWindow); -// Display ALL structures in this View -VM->Viewer()->Display(); +aView->SetWindow (aWindow); +// Display presentation in this View +aStruct->Display(); // Finally update the Visualization in this View aView->Update(); // Fit view to object size -V->FitAll(); +aView->FitAll(); ~~~~~ @subsubsection occt_visu_4_4_3 Define viewing parameters -View projection and orientation in OCCT *V3d_View* are driven by camera. The camera calculates and supplies projection and view orientation matrices for rendering by OpenGL. The allows to the user to control all projection parameters. The camera is defined by the following properties: - -* **Eye** -- defines the observer (camera) position. Make sure the Eye point never gets between the Front and Back clipping planes. - -* **Center** -- defines the origin of View Reference Coordinates (where camera is aimed at). - -* **Direction** -- defines the direction of camera view (from the Eye to the Center). - -* **Distance** -- defines the distance between the Eye and the Center. - -* **Front** Plane -- defines the position of the front clipping plane in View Reference Coordinates system. - -* **Back** Plane -- defines the position of the back clipping plane in View Reference Coordinates system. - -* **ZNear** -- defines the distance between the Eye and the Front plane. - -* **ZFar** -- defines the distance between the Eye and the Back plane. - -Most common view manipulations (panning, zooming, rotation) are implemented as convenience methods of *V3d_View* class, however *Graphic3d_Camera* class can also be used directly by application developers: +View projection and orientation in OCCT *V3d_View* are driven by camera. +The camera calculates and supplies projection and view orientation matrices for rendering by OpenGL. +The allows to the user to control all projection parameters. +The camera is defined by the following properties: + + * **Eye** -- defines the observer (camera) position. + Make sure the Eye point never gets between the Front and Back clipping planes. + * **Center** -- defines the origin of View Reference Coordinates (where camera is aimed at). + * **Direction** -- defines the direction of camera view (from the Eye to the Center). + * **Distance** -- defines the distance between the Eye and the Center. + * **Front** Plane -- defines the position of the front clipping plane in View Reference Coordinates system. + * **Back** Plane -- defines the position of the back clipping plane in View Reference Coordinates system. + * **ZNear** -- defines the distance between the Eye and the Front plane. + * **ZFar** -- defines the distance between the Eye and the Back plane. +Most common view manipulations (panning, zooming, rotation) are implemented as convenience methods of *V3d_View* class or by *AIS_ViewController* tool. +However *Graphic3d_Camera* class can also be used directly by application developers. Example: -~~~~~ +~~~~~{.cpp} // rotate camera by X axis on 30.0 degrees gp_Trsf aTrsf; -aTrsf.SetRotation (gp_Ax1 (gp_Pnt (0.0, 0.0, 0.0), gp_Dir (1.0, 0.0, 0.0)), 30.0); +aTrsf.SetRotation (gp_Ax1 (gp_Pnt (0.0, 0.0, 0.0), gp_Dir (1.0, 0.0, 0.0)), M_PI / 4.0); aView->Camera()->Transform (aTrsf); ~~~~~ @@ -1400,30 +1617,28 @@ The following code configures the camera for orthographic rendering: -~~~~~ +~~~~~{.cpp} // Create an orthographic View in this Viewer -Handle(V3d_View) aView = new V3d_View (VM); +Handle(V3d_View) aView = new V3d_View (theViewer); aView->Camera()->SetProjectionType (Graphic3d_Camera::Projection_Orthographic); -// update the Visualization in this View -aView->Update(); +aView->Update(); // update the Visualization in this View ~~~~~ @subsubsection occt_visu_4_4_5 Perspective Projection -**Field of view (FOVy)** -- defines the field of camera view by y axis in degrees (45° is default). +**Field of view (FOVy)** -- defines the field of camera view by y axis in degrees (45° is default). @figure{camera_perspective.png,"Perspective frustum",420} The following code configures the camera for perspective rendering: -~~~~~ +~~~~~{.cpp} // Create a perspective View in this Viewer -Handle(V3d_View) aView = new V3d_View(VM); +Handle(V3d_View) aView = new V3d_View (theViewer); aView->Camera()->SetProjectionType (Graphic3d_Camera::Projection_Perspective); aView->Update(); ~~~~~ - @subsubsection occt_visu_4_4_6 Stereographic Projection **IOD** -- defines the intraocular distance (in world space units). @@ -1432,23 +1647,25 @@ * _Graphic3d_Camera::IODType_Absolute_ : Intraocular distance is defined as an absolute value. * _Graphic3d_Camera::IODType_Relative_ : Intraocular distance is defined relative to the camera focal length (as its coefficient). -**Field of view (FOV)** -- defines the field of camera view by y axis in degrees (45° is default). +**Field of view (FOV)** -- defines the field of camera view by y axis in degrees (45° is default). **ZFocus** -- defines the distance to the point of stereographic focus. @figure{stereo.png,"Stereographic projection",420} -To enable stereo projection, your workstation should meet the following requirements: +To enable stereo projection for active (shutter) 3D glasses, your workstation should meet the following requirements: * The graphic card should support quad buffering. * You need active 3D glasses (LCD shutter glasses). -* The graphic driver needs to be configured to impose quad buffering for newly created OpenGl contexts; the viewer and the view should be created after that. +* The graphic driver needs to be configured to impose quad buffering for newly created OpenGl contexts; + the viewer and the view should be created after that. -In stereographic projection mode the camera prepares two projection matrices to display different stereo-pictures for the left and for the right eye. In a non-stereo camera this effect is not visible because only the same projection is used for both eyes. +In stereographic projection mode the camera prepares two projection matrices to display different stereo-pictures for the left and for the right eye. +In a non-stereo camera this effect is not visible because only the same projection is used for both eyes. To enable quad buffering support you should provide the following settings to the graphic driver *OpenGl_Caps*: -~~~~~ +~~~~~{.cpp} Handle(OpenGl_GraphicDriver) aDriver = new OpenGl_GraphicDriver(); OpenGl_Caps& aCaps = aDriver->ChangeOptions(); aCaps.contextStereo = Standard_True; @@ -1456,9 +1673,9 @@ The following code configures the camera for stereographic rendering: -~~~~~ +~~~~~{.cpp} // Create a Stereographic View in this Viewer -Handle(V3d_View) aView = new V3d_View(VM); +Handle(V3d_View) aView = new V3d_View (theViewer); aView->Camera()->SetProjectionType (Graphic3d_Camera::Projection_Stereo); // Change stereo parameters aView->Camera()->SetIOD (IODType_Absolute, 5.0); @@ -1466,24 +1683,37 @@ aView->Update(); ~~~~~ +Other 3D displays are also supported, including row-interlaced with passive glasses and anaglyph glasses - see *Graphic3d_StereoMode* enumeration. +Example to activate another stereoscopic display: +~~~~~{.cpp} +Handle(V3d_View) theView; +theView->Camera()->SetProjectionType (Graphic3d_Camera::Projection_Stereo); +theView->ChangeRenderingParams().StereoParams = Graphic3d_StereoMode_RowInterlaced; +~~~~~ + +Supporting of VR/AR headsets in application is more involving. +Class *Aspect_XRSession* defines a basic interface for working with extended reality. + @subsubsection occt_visu_4_4_7 View frustum culling -The algorithm of frustum culling on CPU-side is activated by default for 3D viewer. This algorithm allows skipping the presentation outside camera at the rendering stage, providing better performance. The following features support this method: +The algorithm of frustum culling on CPU-side is activated by default for 3D viewer. +This algorithm allows skipping the presentation outside camera at the rendering stage, providing better performance. +The following features support this method: * *Graphic3d_Structure::CalculateBoundBox()* is used to calculate axis-aligned bounding box of a presentation considering its transformation. * *V3d_View::SetFrustumCulling* enables or disables frustum culling for the specified view. * Classes *Graphic3d_BvhCStructureSet* and *Graphic3d_CullingTool* handle the detection of outer objects and usage of acceleration structure for frustum culling. * *BVH_BinnedBuilder* class splits several objects with null bounding box. @subsubsection occt_visu_4_4_9 View background styles -There are three types of background styles available for *V3d_View*: solid color, gradient color and image. +There are several types of background styles available for *V3d_View*: solid color, gradient color, image and environment cubemap. To set solid color for the background you can use the following method: -~~~~~ +~~~~~{.cpp} void V3d_View::SetBackgroundColor (const Quantity_Color& theColor); ~~~~~ The gradient background style could be set up with the following method: -~~~~~ +~~~~~{.cpp} void V3d_View::SetBgGradientColors (const Quantity_Color& theColor1, const Quantity_Color& theColor2, const Aspect_GradientFillMethod theFillStyle, @@ -1493,13 +1723,14 @@ The *theColor1* and *theColor2* parameters define the boundary colors of interpolation, the *theFillStyle* parameter defines the direction of interpolation. To set the image as a background and change the background image style you can use the following method: -~~~~~ +~~~~~{.cpp} void V3d_View::SetBackgroundImage (const Standard_CString theFileName, const Aspect_FillMethod theFillStyle, const Standard_Boolean theToUpdate = false); ~~~~~ -The *theFileName* parameter defines the image file name and the path to it, the *theFillStyle* parameter defines the method of filling the background with the image. The methods are: +The *theFileName* parameter defines the image file name and the path to it, the *theFillStyle* parameter defines the method of filling the background with the image. +The methods are: * *Aspect_FM_NONE* -- draws the image in the default position; * *Aspect_FM_CENTERED* -- draws the image at the center of the view; * *Aspect_FM_TILED* -- tiles the view with the image; @@ -1509,15 +1740,17 @@ The 3D scene displayed in the view can be dumped into image file with resolution independent from window size (using offscreen buffer). The *V3d_View* has the following methods for dumping the 3D scene: -~~~~ +~~~~{.cpp} Standard_Boolean V3d_View::Dump (const Standard_CString theFile, const Image_TypeOfImage theBufferType); ~~~~ Dumps the scene into an image file with the view dimensions. -The raster image data handling algorithm is based on the *Image_AlienPixMap* class. The supported extensions are ".png", ".bmp", ".jpg" and others supported by **FreeImage** library. -The value passed as *theBufferType* argument defines the type of the buffer for an output image (RGB, RGBA, floating-point, RGBF, RGBAF). Method returns TRUE if the scene has been successfully dumped. +The raster image data handling algorithm is based on the *Image_AlienPixMap* class. +The supported extensions are ".png", ".bmp", ".jpg" and others supported by **FreeImage** library. +The value passed as *theBufferType* argument defines the type of the buffer for an output image (RGB, RGBA, floating-point, RGBF, RGBAF). +Method returns TRUE if the scene has been successfully dumped. -~~~~ +~~~~{.cpp} Standard_Boolean V3d_View::ToPixMap (Image_PixMap& theImage, const V3d_ImageDumpOptions& theParams); ~~~~ @@ -1525,7 +1758,10 @@ @subsubsection occt_visu_4_4_13 Ray tracing support -OCCT visualization provides rendering by real-time ray tracing technique. It is allowed to switch easily between usual rasterization and ray tracing rendering modes. The core of OCCT ray tracing is written using GLSL shaders. The ray tracing has a wide list of features: +OCCT visualization provides rendering by real-time ray tracing technique. +It is allowed to switch easily between usual rasterization and ray tracing rendering modes. +The core of OCCT ray tracing is written using GLSL shaders. +The ray tracing has a wide list of features: * Hard shadows * Refractions * Reflection @@ -1534,7 +1770,11 @@ * Support of non-polygon objects, such as lines, text, highlighting, selection. * Performance optimization using 2-level bounding volume hierarchy (BVH). -The ray tracing algorithm is recursive (Whitted's algorithm). It uses BVH effective optimization structure. The structure prepares optimized data for a scene geometry for further displaying it in real-time. The time-consuming re-computation of the BVH is not necessary for view operations, selections, animation and even editing of the scene by transforming location of the objects. It is only necessary when the list of displayed objects or their geometry changes. +The ray tracing algorithm is recursive (Whitted's algorithm). +It uses BVH effective optimization structure. +The structure prepares optimized data for a scene geometry for further displaying it in real-time. +The time-consuming re-computation of the BVH is not necessary for view operations, selections, animation and even editing of the scene by transforming location of the objects. +It is only necessary when the list of displayed objects or their geometry changes. To make the BVH reusable it has been added into an individual reusable OCCT package *TKMath/BVH*. There are several ray-tracing options that user can switch on/off: @@ -1545,7 +1785,7 @@ * Transparency shadow effects Example: -~~~~~ +~~~~~{.cpp} Graphic3d_RenderingParams& aParams = aView->ChangeRenderingParams(); // specifies rendering mode aParams.Method = Graphic3d_RM_RAYTRACING; @@ -1553,11 +1793,11 @@ aParams.RaytracingDepth = 3; // enable shadows rendering aParams.IsShadowEnabled = true; -// enable specular reflections. +// enable specular reflections aParams.IsReflectionEnabled = true; // enable adaptive anti-aliasing aParams.IsAntialiasingEnabled = true; -// enable light propagation through transparent media. +// enable light propagation through transparent media aParams.IsTransparentShadowEnabled = true; // update the view aView->Update(); @@ -1565,19 +1805,26 @@ @subsubsection occt_visu_4_4_14 Display priorities -Structure display priorities control the order, in which structures are drawn. When you display a structure you specify its priority. The lower is the value, the lower is the display priority. When the display is regenerated, the structures with the lowest priority are drawn first. The structures with the same display priority are drawn in the same order as they have been displayed. OCCT supports eleven structure display priorities. +Structure display priorities control the order, in which structures are drawn. +When you display a structure you specify its priority. +The lower is the value, the lower is the display priority. +When the display is regenerated, the structures with the lowest priority are drawn first. +The structures with the same display priority are drawn in the same order as they have been displayed. +OCCT supports eleven structure display priorities within [0, 10] range. @subsubsection occt_visu_4_4_15 Z-layer support -OCCT features depth-arranging functionality called z-layer. A graphical presentation can be put into a z-layer. In general, this function can be used for implementing "bring to front" functionality in a graphical application. +OCCT features depth-arranging functionality called z-layer. +A graphical presentation can be put into a z-layer. +In general, this function can be used for implementing "bring to front" functionality in a graphical application. Example: -~~~~~ +~~~~~{.cpp} // set z-layer to an interactive object Handle(AIS_InteractiveContext) theContext; Handle(AIS_InteractiveObject) theInterObj; -Standard_Integer anId = 3; +Standard_Integer anId = -1; aViewer->AddZLayer (anId); theContext->SetZLayer (theInterObj, anId); ~~~~~ @@ -1588,10 +1835,11 @@ * Enable / disable depth buffer clearing. * Enable / disable polygon offset. -You can get the options using getter from *V3d_Viewer*. It returns *Graphic3d_ZLayerSettings* for a given *LayerId*. +You can get the options using getter from *V3d_Viewer*. +It returns *Graphic3d_ZLayerSettings* for a given *LayerId*. Example: -~~~~~ +~~~~~{.cpp} // change z-layer settings Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (anId); aSettings.SetEnableDepthTest (true); @@ -1631,7 +1879,7 @@ * Defines a Z-Layer for each spatial cell containing any object. * Defines the Local Origin property of the Z-Layer according to the center of the cell. -~~~~~ +~~~~~{.cpp} Graphic3d_ZLayerSettings aSettings = aViewer->ZLayerSettings (anId); aSettings.SetLocalOrigin (400.0, 0.0, 0.0); ~~~~~ @@ -1643,11 +1891,14 @@ @subsubsection occt_visu_4_4_16 Clipping planes -The ability to define custom clipping planes could be very useful for some tasks. OCCT provides such an opportunity. +The ability to define custom clipping planes could be very useful for some tasks. +OCCT provides such an opportunity. -The *Graphic3d_ClipPlane* class provides the services for clipping planes: it holds the plane equation coefficients and provides its graphical representation. To set and get plane equation coefficients you can use the following methods: +The *Graphic3d_ClipPlane* class provides the services for clipping planes: +it holds the plane equation coefficients and provides its graphical representation. +To set and get plane equation coefficients you can use the following methods: -~~~~~ +~~~~~{.cpp} Graphic3d_ClipPlane::Graphic3d_ClipPlane (const gp_Pln& thePlane) void Graphic3d_ClipPlane::SetEquation (const gp_Pln& thePlane) Graphic3d_ClipPlane::Graphic3d_ClipPlane (const Equation& theEquation) @@ -1656,26 +1907,24 @@ ~~~~~ The clipping planes can be activated with the following method: -~~~~~ +~~~~~{.cpp} void Graphic3d_ClipPlane::SetOn (const Standard_Boolean theIsOn) ~~~~~ -The number of clipping planes is limited. You can check the limit value via method *Graphic3d_GraphicDriver::InquireLimit()*; +The number of clipping planes is limited. +You can check the limit value via method *Graphic3d_GraphicDriver::InquireLimit()*; -~~~~~ +~~~~~{.cpp} // get the limit of clipping planes for the current view Standard_Integer aMaxClipPlanes = aView->Viewer()->Driver()->InquireLimit (Graphic3d_TypeOfLimit_MaxNbClipPlanes); ~~~~~ Let us see for example how to create a new clipping plane with custom parameters and add it to a view or to an object: -~~~~~ +~~~~~{.cpp} // create a new clipping plane -const Handle(Graphic3d_ClipPlane)& aClipPlane = new Graphic3d_ClipPlane(); +Handle(Graphic3d_ClipPlane) aClipPlane = new Graphic3d_ClipPlane(); // change equation of the clipping plane -Standard_Real aCoeffA = ... -Standard_Real aCoeffB = ... -Standard_Real aCoeffC = ... -Standard_Real aCoeffD = ... +Standard_Real aCoeffA, aCoeffB, aCoeffC, aCoeffD = ... aClipPlane->SetEquation (gp_Pln (aCoeffA, aCoeffB, aCoeffC, aCoeffD)); // set capping aClipPlane->SetCapping (aCappingArg == "on"); @@ -1696,15 +1945,16 @@ // or to the whole view aView->AddClipPlane (aClipPlane); // activate the clipping plane -aClipPlane->SetOn(Standard_True); +aClipPlane->SetOn (Standard_True); // update the view aView->Update(); ~~~~~ - @subsubsection occt_visu_4_4_17 Automatic back face culling -Back face culling reduces the rendered number of triangles (which improves the performance) and eliminates artifacts at shape boundaries. However, this option can be used only for solid objects, where the interior is actually invisible from any point of view. Automatic back-face culling mechanism is turned on by default, which is controlled by *V3d_View::SetBackFacingModel()*. +Back face culling reduces the rendered number of triangles (which improves the performance) and eliminates artifacts at shape boundaries. +However, this option can be used only for solid objects, where the interior is actually invisible from any point of view. +Automatic back-face culling mechanism is turned on by default, which is controlled by *V3d_View::SetBackFacingModel()*. The following features are applied in *StdPrs_ToolTriangulatedShape::IsClosed()*, which is used for definition of back face culling in *ShadingAspect*: * disable culling for free closed Shells (not inside the Solid) since reversed orientation of a free Shell is a valid case; @@ -1731,7 +1981,7 @@ Create colors. -~~~~~ +~~~~~{.cpp} Quantity_Color aBlack (Quantity_NOC_BLACK); Quantity_Color aBlue (Quantity_NOC_MATRABLUE); Quantity_Color aBrown (Quantity_NOC_BROWN4); @@ -1745,9 +1995,9 @@ Create line attributes. -~~~~~ +~~~~~{.cpp} Handle(Graphic3d_AspectLine3d) anAspectBrown = new Graphic3d_AspectLine3d(); -Handle(Graphic3d_AspectLine3d) anAspectBlue = new Graphic3d_AspectLine3d(); +Handle(Graphic3d_AspectLine3d) anAspectBlue = new Graphic3d_AspectLine3d(); Handle(Graphic3d_AspectLine3d) anAspectWhite = new Graphic3d_AspectLine3d(); anAspectBrown->SetColor (aBrown); anAspectBlue ->SetColor (aBlue); @@ -1755,22 +2005,21 @@ ~~~~~ Create marker attributes. -~~~~~ +~~~~~{.cpp} Handle(Graphic3d_AspectMarker3d aFirebrickMarker = new Graphic3d_AspectMarker3d(); // marker attributes aFirebrickMarker->SetColor (Firebrick); -aFirebrickMarker->SetScale (1.0); +aFirebrickMarker->SetScale (1.0f); aFirebrickMarker->SetType (Aspect_TOM_BALL); -// or this -// it is a preferred way (supports full-color images on modern hardware). +// or custom image aFirebrickMarker->SetMarkerImage (theImage) ~~~~~ Create facet attributes. -~~~~~ -Handle(Graphic3d_AspectFillArea3d) aFaceAspect = new Graphic3d_AspectFillArea3d(); -Graphic3d_MaterialAspect aBrassMaterial (Graphic3d_NOM_BRASS); -Graphic3d_MaterialAspect aGoldMaterial (Graphic3d_NOM_GOLD); +~~~~~{.cpp} +Handle(Graphic3d_AspectFillArea3d) aFaceAspect = new Graphic3d_AspectFillArea3d(); +Graphic3d_MaterialAspect aBrassMaterial (Graphic3d_NameOfMaterial_Brass); +Graphic3d_MaterialAspect aGoldMaterial (Graphic3d_NameOfMaterial_Gold); aFaceAspect->SetInteriorStyle (Aspect_IS_SOLID_WIREFRAME); aFaceAspect->SetInteriorColor (aMyColor); aFaceAspect->SetDistinguishOn (); @@ -1779,17 +2028,15 @@ ~~~~~ Create text attributes. -~~~~~ -Handle(Graphic3d_AspectText3d) aTextAspect = new Graphic3d_AspectText3d (aForest, Graphic3d_NOF_ASCII_MONO, 1.0, 0.0); +~~~~~{.cpp} +Handle(Graphic3d_AspectText3d) aTextAspect = new Graphic3d_AspectText3d (aForest, Font_NOF_MONOSPACE, 1.0, 0.0); ~~~~~ @subsubsection occt_visu_4_5_2 Create a 3D Viewer (a Windows example) -~~~~~ -// create a default connection -Handle(Aspect_DisplayConnection) aDisplayConnection; -// create a graphic driver from default connection -Handle(OpenGl_GraphicDriver) aGraphicDriver = new OpenGl_GraphicDriver (aDisplayConnection); +~~~~~{.cpp} +// create a graphic driver +Handle(OpenGl_GraphicDriver) aGraphicDriver = new OpenGl_GraphicDriver (Handle(Aspect_DisplayConnection)()); // create a viewer myViewer = new V3d_Viewer (aGraphicDriver); // set parameters for V3d_Viewer @@ -1805,11 +2052,10 @@ a3DViewer->SetDefaultBackgroundColor (Quantity_NOC_BLACK); ~~~~~ - @subsubsection occt_visu_4_5_3 Create a 3D view (a Windows example) It is assumed that a valid Windows window may already be accessed via the method *GetSafeHwnd()* (as in case of MFC sample). -~~~~~ +~~~~~{.cpp} Handle(WNT_Window) aWNTWindow = new WNT_Window (GetSafeHwnd()); myView = myViewer->CreateView(); myView->SetWindow (aWNTWindow); @@ -1817,16 +2063,16 @@ @subsubsection occt_visu_4_5_4 Create an interactive context -~~~~~ +~~~~~{.cpp} myAISContext = new AIS_InteractiveContext (myViewer); ~~~~~ You are now able to display interactive objects such as an *AIS_Shape*. -~~~~~ +~~~~~{.cpp} TopoDS_Shape aShape = BRepAPI_MakeBox (10, 20, 30).Solid(); Handle(AIS_Shape) anAISShape = new AIS_Shape (aShape); -myAISContext->Display (anAISShape); +myAISContext->Display (anAISShape, true); ~~~~~ @subsubsection occt_visu_4_5_5 Create your own interactive object @@ -1836,11 +2082,12 @@ 1. Build a presentable object inheriting from *AIS_InteractiveObject* (refer to the Chapter on @ref occt_visu_2_1 "Presentable Objects"). 2. Reuse the *Graphic3d_Structure* provided as an argument of the compute methods. -**Note** that there are two compute methods: one for a standard representation, and the other for a degenerated representation, i.e. in hidden line removal and wireframe modes. +**Note** that there are two compute methods: one for a standard representation, and the other for a degenerated representation, +i.e. in hidden line removal and wireframe modes. Let us look at the example of compute methods -~~~~~ +~~~~~{.cpp} void MyPresentableObject::Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsManager, const Handle(Graphic3d_Structure)& thePrs, const Standard_Integer theMode) @@ -1859,21 +2106,21 @@ Get the group used in *Graphic3d_Structure*. -~~~~~ +~~~~~{.cpp} Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); ~~~~~ Update the group attributes. -~~~~~ +~~~~~{.cpp} aGroup->SetGroupPrimitivesAspect (anAspectBlue); ~~~~~ Create two triangles in *aGroup*. -~~~~~ +~~~~~{.cpp} Standard_Integer aNbTria = 2; -Handle(Graphic3d_ArrayOfTriangles) aTriangles = new Graphic3d_ArrayOfTriangles (3 * aNbTria, 0, true); +Handle(Graphic3d_ArrayOfTriangles) aTriangles = new Graphic3d_ArrayOfTriangles (3 * aNbTria, 0, Graphic3d_ArrayFlags_VertexNormal); for (Standard_Integer aTriIter = 1; aTriIter <= aNbTria; ++aTriIter) { aTriangles->AddVertex (aTriIter * 5., 0., 0., 1., 1., 1.); @@ -1886,7 +2133,7 @@ Use the polyline function to create a boundary box for the *thePrs* structure in group *aGroup*. -~~~~~ +~~~~~{.cpp} Standard_Real Xm, Ym, Zm, XM, YM, ZM; thePrs->MinMaxValues (Xm, Ym, Zm, XM, YM, ZM); @@ -1918,8 +2165,8 @@ Create text and markers in group *aGroup*. -~~~~~ -static char* texte[3] = +~~~~~{.cpp} +static char* THE_TEXT[3] = { "Application title", "My company", @@ -1937,25 +2184,31 @@ aMarker.SetCoord (-(Standard_Real )i * 4 + 30, (Standard_Real )i * 4, -(Standard_Real )i * 4); - aGroup->Text (texte[i], Marker, 20.); + aGroup->Text (THE_TEXT[i], Marker, 20.); } - ~~~~~ @section occt_visu_5 Mesh Visualization Services -*MeshVS* (Mesh Visualization Service) component extends 3D visualization capabilities of Open CASCADE Technology. It provides flexible means of displaying meshes along with associated pre- and post-processor data. +*MeshVS* (Mesh Visualization Service) component extends 3D visualization capabilities of Open CASCADE Technology. +It provides flexible means of displaying meshes along with associated pre- and post-processor data. From a developer's point of view, it is easy to integrate the *MeshVS* component into any mesh-related application with the following guidelines: * Derive a data source class from the *MeshVS_DataSource* class. -* Re-implement its virtual methods, so as to give the *MeshVS* component access to the application data model. This is the most important part of the job, since visualization performance is affected by performance of data retrieval methods of your data source class. +* Re-implement its virtual methods, so as to give the *MeshVS* component access to the application data model. + This is the most important part of the job, since visualization performance is affected by performance of data retrieval methods of your data source class. * Create an instance of *MeshVS_Mesh* class. * Create an instance of your data source class and pass it to a *MeshVS_Mesh* object through the *SetDataSource()* method. * Create one or several objects of *MeshVS_PrsBuilder*-derived classes (standard, included in the *MeshVS* package, or your custom ones). -* Each *PrsBuilder* is responsible for drawing a *MeshVS_Mesh* presentation in a certain display mode(s) specified as a *PrsBuilder* constructor's argument. Display mode is treated by *MeshVS* classes as a combination of bit flags (two least significant bits are used to encode standard display modes: wireframe, shading and shrink). -* Pass these objects to the *MeshVS_Mesh::AddBuilder()* method. *MeshVS_Mesh* takes advantage of improved selection highlighting mechanism: it highlights its selected entities itself, with the help of so called "highlighter" object. You can set one of *PrsBuilder* objects to act as a highlighter with the help of a corresponding argument of the *AddBuilder()* method. +* Each *PrsBuilder* is responsible for drawing a *MeshVS_Mesh* presentation in a certain display mode(s) specified as a *PrsBuilder* constructor's argument. + Display mode is treated by *MeshVS* classes as a combination of bit flags (two least significant bits are used to encode standard display modes: wireframe, shading and shrink). +* Pass these objects to the *MeshVS_Mesh::AddBuilder()* method. + *MeshVS_Mesh* takes advantage of improved selection highlighting mechanism: it highlights its selected entities itself, with the help of so called "highlighter" object. + You can set one of *PrsBuilder* objects to act as a highlighter with the help of a corresponding argument of the *AddBuilder()* method. -Visual attributes of the *MeshVS_Mesh* object (such as shading color, shrink coefficient and so on) are controlled through *MeshVS_Drawer* object. It maintains a map "Attribute ID --> attribute value" and can be easily extended with any number of custom attributes. +Visual attributes of the *MeshVS_Mesh* object (such as shading color, shrink coefficient and so on) are controlled through *MeshVS_Drawer* object. +It maintains a map "Attribute ID --> attribute value" and can be easily extended with any number of custom attributes. -In all other respects, *MeshVS_Mesh* is very similar to any other class derived from *AIS_InteractiveObject* and it should be used accordingly (refer to the description of *AIS package* in the documentation). +In all other respects, *MeshVS_Mesh* is very similar to any other class derived from *AIS_InteractiveObject* +and it should be used accordingly (refer to the description of *AIS package* in the documentation). diff -Nru opencascade-7.4.1+dfsg1/dox/user_guides/xde/xde.md opencascade-7.5.1+dfsg1/dox/user_guides/xde/xde.md --- opencascade-7.4.1+dfsg1/dox/user_guides/xde/xde.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/dox/user_guides/xde/xde.md 2021-02-02 08:51:56.000000000 +0000 @@ -5,7 +5,7 @@ @section occt_xde_1 Introduction -This manual explains how to use the Extended Data Exchange (XDE). It provides basic documentation on setting up and using XDE. For advanced information on XDE and its applications, see our E-learning & Training offerings. +This manual explains how to use the Extended Data Exchange (XDE). It provides basic documentation on setting up and using XDE. The Extended Data Exchange (XDE) module allows extending the scope of exchange by translating additional data attached to geometric BREP data, thereby improving the interoperability with external software. diff -Nru opencascade-7.4.1+dfsg1/.gitignore opencascade-7.5.1+dfsg1/.gitignore --- opencascade-7.4.1+dfsg1/.gitignore 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/.gitignore 2021-02-02 08:51:56.000000000 +0000 @@ -12,12 +12,6 @@ win32 win64 -# standard names of directories for objects and binaries for samples -bin -obj -Debug -Release - # project files and artifacts /adm/msvc /adm/wnt diff -Nru opencascade-7.4.1+dfsg1/samples/CSharp/OCCTProxy/OCCTProxy.cpp opencascade-7.5.1+dfsg1/samples/CSharp/OCCTProxy/OCCTProxy.cpp --- opencascade-7.4.1+dfsg1/samples/CSharp/OCCTProxy/OCCTProxy.cpp 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/CSharp/OCCTProxy/OCCTProxy.cpp 2021-02-02 08:51:56.000000000 +0000 @@ -1,6 +1,7 @@ // include required OCCT headers #include #include +#include //for OCC graphic #include #include diff -Nru opencascade-7.4.1+dfsg1/samples/CSharp/OCCTProxy_D3D/OCCTProxyD3D.cpp opencascade-7.5.1+dfsg1/samples/CSharp/OCCTProxy_D3D/OCCTProxyD3D.cpp --- opencascade-7.4.1+dfsg1/samples/CSharp/OCCTProxy_D3D/OCCTProxyD3D.cpp 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/CSharp/OCCTProxy_D3D/OCCTProxyD3D.cpp 2021-02-02 08:51:56.000000000 +0000 @@ -4,6 +4,7 @@ // include required OCCT headers #include #include +#include //for OCC graphic #include #include @@ -747,7 +748,7 @@ } Handle(AIS_Shape) aPrs = new AIS_Shape (aShape); - myAISContext()->SetMaterial (aPrs, Graphic3d_NOM_GOLD, Standard_False); + myAISContext()->SetMaterial (aPrs, Graphic3d_NameOfMaterial_Gold, Standard_False); myAISContext()->SetDisplayMode(aPrs, AIS_Shaded, Standard_False); myAISContext()->Display (aPrs, Standard_True); return true; diff -Nru opencascade-7.4.1+dfsg1/samples/glfw/GlfwOcctView.cpp opencascade-7.5.1+dfsg1/samples/glfw/GlfwOcctView.cpp --- opencascade-7.4.1+dfsg1/samples/glfw/GlfwOcctView.cpp 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/glfw/GlfwOcctView.cpp 2021-02-02 08:51:56.000000000 +0000 @@ -35,13 +35,49 @@ #include +namespace +{ + //! Convert GLFW mouse button into Aspect_VKeyMouse. + static Aspect_VKeyMouse mouseButtonFromGlfw (int theButton) + { + switch (theButton) + { + case GLFW_MOUSE_BUTTON_LEFT: return Aspect_VKeyMouse_LeftButton; + case GLFW_MOUSE_BUTTON_RIGHT: return Aspect_VKeyMouse_RightButton; + case GLFW_MOUSE_BUTTON_MIDDLE: return Aspect_VKeyMouse_MiddleButton; + } + return Aspect_VKeyMouse_NONE; + } + + //! Convert GLFW key modifiers into Aspect_VKeyFlags. + static Aspect_VKeyFlags keyFlagsFromGlfw (int theFlags) + { + Aspect_VKeyFlags aFlags = Aspect_VKeyFlags_NONE; + if ((theFlags & GLFW_MOD_SHIFT) != 0) + { + aFlags |= Aspect_VKeyFlags_SHIFT; + } + if ((theFlags & GLFW_MOD_CONTROL) != 0) + { + aFlags |= Aspect_VKeyFlags_CTRL; + } + if ((theFlags & GLFW_MOD_ALT) != 0) + { + aFlags |= Aspect_VKeyFlags_ALT; + } + if ((theFlags & GLFW_MOD_SUPER) != 0) + { + aFlags |= Aspect_VKeyFlags_META; + } + return aFlags; + } +} + // ================================================================ // Function : GlfwOcctView // Purpose : // ================================================================ GlfwOcctView::GlfwOcctView() -: myCurAction3d (CurAction3d_Nothing), - myToRedraw (true) { } @@ -193,15 +229,7 @@ glfwWaitEvents(); if (!myView.IsNull()) { - if (myView->IsInvalidated()) - { - myView->Redraw(); - } - else if (myToRedraw) - { - myView->RedrawImmediate(); - } - myToRedraw = false; + FlushViewEvents (myContext, myView, true); } } } @@ -237,7 +265,6 @@ myView->MustBeResized(); myView->Invalidate(); myView->Redraw(); - //myToRedraw = true; } } @@ -247,13 +274,10 @@ // ================================================================ void GlfwOcctView::onMouseScroll (double theOffsetX, double theOffsetY) { - if (myView.IsNull()) { return; } - - const Graphic3d_Vec2i aPos = myOcctWindow->CursorPosition(); - myView->StartZoomAtPoint (aPos.x(), aPos.y()); - myView->ZoomAtPoint (0, 0, int(theOffsetY * 4.0), int(theOffsetY * 4.0)); - myView->Invalidate(); - myToRedraw = true; + if (!myView.IsNull()) + { + UpdateZoom (Aspect_ScrollDelta (myOcctWindow->CursorPosition(), int(theOffsetY * 8.0))); + } } // ================================================================ @@ -265,27 +289,13 @@ if (myView.IsNull()) { return; } const Graphic3d_Vec2i aPos = myOcctWindow->CursorPosition(); - if (theAction != GLFW_PRESS) + if (theAction == GLFW_PRESS) { - myCurAction3d = CurAction3d_Nothing; - return; + PressMouseButton (aPos, mouseButtonFromGlfw (theButton), keyFlagsFromGlfw (theMods), false); } - - myMouseMin = aPos; - myMouseMax = aPos; - switch (theButton) + else { - case GLFW_MOUSE_BUTTON_RIGHT: - { - myCurAction3d = CurAction3d_DynamicRoation; - myView->StartRotation (aPos.x(), aPos.y()); - break; - } - case GLFW_MOUSE_BUTTON_MIDDLE: - { - myCurAction3d = CurAction3d_DynamicPanning; - break; - } + ReleaseMouseButton (aPos, mouseButtonFromGlfw (theButton), keyFlagsFromGlfw (theMods), false); } } @@ -295,30 +305,9 @@ // ================================================================ void GlfwOcctView::onMouseMove (int thePosX, int thePosY) { - if (myView.IsNull()) { return; } - - switch (myCurAction3d) + const Graphic3d_Vec2i aNewPos (thePosX, thePosY); + if (!myView.IsNull()) { - case CurAction3d_DynamicRoation: - { - myView->Rotation (thePosX, thePosY); - myView->Invalidate(); - myToRedraw = true; - break; - } - case CurAction3d_DynamicPanning: - { - myView->Pan (thePosX - myMouseMax.x(), -(thePosY - myMouseMax.y())); - myView->Invalidate(); - myToRedraw = true; - myMouseMax.SetValues (thePosX, thePosY); - break; - } - default: - { - myContext->MoveTo (thePosX, thePosY, myView, false); - myToRedraw = true; - break; - } + UpdateMousePosition (aNewPos, PressedMouseButtons(), LastMouseFlags(), false); } } diff -Nru opencascade-7.4.1+dfsg1/samples/glfw/GlfwOcctView.h opencascade-7.5.1+dfsg1/samples/glfw/GlfwOcctView.h --- opencascade-7.4.1+dfsg1/samples/glfw/GlfwOcctView.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/glfw/GlfwOcctView.h 2021-02-02 08:51:56.000000000 +0000 @@ -25,21 +25,13 @@ #include "GlfwOcctWindow.h" #include +#include #include //! Sample class creating 3D Viewer within GLFW window. -class GlfwOcctView +class GlfwOcctView : protected AIS_ViewController { public: - enum CurAction3d - { - CurAction3d_Nothing, - CurAction3d_DynamicZooming, - CurAction3d_DynamicPanning, - CurAction3d_DynamicRoation - }; - -public: //! Default constructor. GlfwOcctView(); @@ -115,11 +107,6 @@ Handle(V3d_View) myView; Handle(AIS_InteractiveContext) myContext; - CurAction3d myCurAction3d; - Graphic3d_Vec2i myMouseMin; - Graphic3d_Vec2i myMouseMax; - bool myToRedraw; - }; #endif // _GlfwOcctView_Header diff -Nru opencascade-7.4.1+dfsg1/samples/glfw/GlfwOcctWindow.cpp opencascade-7.5.1+dfsg1/samples/glfw/GlfwOcctWindow.cpp --- opencascade-7.4.1+dfsg1/samples/glfw/GlfwOcctWindow.cpp 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/glfw/GlfwOcctWindow.cpp 2021-02-02 08:51:56.000000000 +0000 @@ -134,17 +134,17 @@ // Function : DoResize // Purpose : // ================================================================ -Aspect_TypeOfResize GlfwOcctWindow::DoResize() const +Aspect_TypeOfResize GlfwOcctWindow::DoResize() { if (glfwGetWindowAttrib (myGlfwWindow, GLFW_VISIBLE) == 1) { int anXPos = 0, anYPos = 0, aWidth = 0, aHeight = 0; glfwGetWindowPos (myGlfwWindow, &anXPos, &anYPos); glfwGetWindowSize(myGlfwWindow, &aWidth, &aHeight); - *const_cast(&myXLeft ) = anXPos; - *const_cast(&myXRight ) = anXPos + aWidth; - *const_cast(&myYTop ) = anYPos; - *const_cast(&myYBottom) = anYPos + aHeight; + myXLeft = anXPos; + myXRight = anXPos + aWidth; + myYTop = anYPos; + myYBottom = anYPos + aHeight; } return Aspect_TOR_UNKNOWN; } diff -Nru opencascade-7.4.1+dfsg1/samples/glfw/GlfwOcctWindow.h opencascade-7.5.1+dfsg1/samples/glfw/GlfwOcctWindow.h --- opencascade-7.4.1+dfsg1/samples/glfw/GlfwOcctWindow.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/glfw/GlfwOcctWindow.h 2021-02-02 08:51:56.000000000 +0000 @@ -65,7 +65,7 @@ virtual Aspect_Drawable NativeParentHandle() const Standard_OVERRIDE { return 0; } //! Applies the resizing to the window - virtual Aspect_TypeOfResize DoResize() const Standard_OVERRIDE; + virtual Aspect_TypeOfResize DoResize() Standard_OVERRIDE; //! Returns True if the window is opened and False if the window is closed. virtual Standard_Boolean IsMapped() const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/AndroidManifest.xml opencascade-7.5.1+dfsg1/samples/java/jniviewer/AndroidManifest.xml --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/AndroidManifest.xml 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/AndroidManifest.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/build.gradle opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/build.gradle --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/build.gradle 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/build.gradle 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,48 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 21 + buildToolsVersion "30.0.0" + + defaultConfig { + applicationId "com.opencascade.jnisample" + minSdkVersion 21 + targetSdkVersion 26 + + ndk { + abiFilters "arm64-v8a" + } + + externalNativeBuild { + cmake { + arguments "-DOCCT_ROOT=" + OCCT_ROOT, + "-DFREETYPE_ROOT=" + FREETYPE_ROOT, + "-DANDROID_STL=gnustl_shared" + } + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + } + + sourceSets { + main { + manifest.srcFile 'src/main/AndroidManifest.xml' + assets.srcDirs = [OCCT_ROOT + "/src"] + } + } + + externalNativeBuild { + cmake { + path "src/main/jni/CMakeLists.txt" + } + } +} + +dependencies { + implementation fileTree(dir: 'java/com/opencascade/jnisample', include: ['*.jar']) +} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/AndroidManifest.xml opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/AndroidManifest.xml --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/AndroidManifest.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/AndroidManifest.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniActivity.java opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniActivity.java --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniActivity.java 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniActivity.java 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,864 @@ +// Copyright (c) 2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +package com.opencascade.jnisample; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.List; + +import android.app.Activity; +import android.content.Context; + +import android.content.Intent; +import android.content.res.AssetManager; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Point; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; + +import android.text.Html; +import android.text.Html.ImageGetter; +import android.text.Spanned; +import android.util.TypedValue; +import android.view.Display; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.view.ViewGroup.LayoutParams; +import android.widget.TextView; +import android.widget.Toast; + +//! Main activity +public class OcctJniActivity extends Activity implements OnClickListener +{ + + //! Auxiliary method to print temporary info messages + public static void printShortInfo (Activity theActivity, + CharSequence theInfo) + { + Context aCtx = theActivity.getApplicationContext(); + Toast aToast = Toast.makeText (aCtx, theInfo, Toast.LENGTH_LONG); + aToast.show(); + } + + //! Load single native library + private static boolean loadLibVerbose (String theLibName, + StringBuilder theLoadedInfo, + StringBuilder theFailedInfo) + { + try + { + System.loadLibrary (theLibName); + theLoadedInfo.append ("Info: native library \""); + theLoadedInfo.append (theLibName); + theLoadedInfo.append ("\" has been loaded\n"); + return true; + } + catch (java.lang.UnsatisfiedLinkError theError) + { + theFailedInfo.append ("Error: native library \""); + theFailedInfo.append (theLibName); + theFailedInfo.append ("\" is unavailable:\n " + theError.getMessage()); + return false; + } + catch (SecurityException theError) + { + theFailedInfo.append ("Error: native library \""); + theFailedInfo.append (theLibName); + theFailedInfo.append ("\" can not be loaded for security reasons:\n " + theError.getMessage()); + return false; + } + } + + public static boolean wasNativesLoadCalled = false; + public static boolean areNativeLoaded = false; + public static String nativeLoaded = ""; + public static String nativeFailed = ""; + + //! Auxiliary method to load native libraries + public boolean loadNatives() + { + if (wasNativesLoadCalled) + { + return areNativeLoaded; + } + wasNativesLoadCalled = true; + StringBuilder aLoaded = new StringBuilder(); + StringBuilder aFailed = new StringBuilder(); + + // copy OCCT resources + String aResFolder = getFilesDir().getAbsolutePath(); + copyAssetFolder (getAssets(), "src/SHMessage", aResFolder + "/SHMessage"); + copyAssetFolder (getAssets(), "src/XSMessage", aResFolder + "/XSMessage"); + + // C++ runtime + loadLibVerbose ("gnustl_shared", aLoaded, aFailed); + + // 3rd-parties + loadLibVerbose ("freetype", aLoaded, aFailed); + loadLibVerbose ("freeimage", aLoaded, aFailed); + + if (// OCCT modeling + !loadLibVerbose ("TKernel", aLoaded, aFailed) + || !loadLibVerbose ("TKMath", aLoaded, aFailed) + || !loadLibVerbose ("TKG2d", aLoaded, aFailed) + || !loadLibVerbose ("TKG3d", aLoaded, aFailed) + || !loadLibVerbose ("TKGeomBase", aLoaded, aFailed) + || !loadLibVerbose ("TKBRep", aLoaded, aFailed) + || !loadLibVerbose ("TKGeomAlgo", aLoaded, aFailed) + || !loadLibVerbose ("TKTopAlgo", aLoaded, aFailed) + || !loadLibVerbose ("TKShHealing", aLoaded, aFailed) + || !loadLibVerbose ("TKMesh", aLoaded, aFailed) + // exchange + || !loadLibVerbose ("TKPrim", aLoaded, aFailed) + || !loadLibVerbose ("TKBO", aLoaded, aFailed) + || !loadLibVerbose ("TKBool", aLoaded, aFailed) + || !loadLibVerbose ("TKFillet", aLoaded, aFailed) + || !loadLibVerbose ("TKOffset", aLoaded, aFailed) + || !loadLibVerbose ("TKXSBase", aLoaded, aFailed) + || !loadLibVerbose ("TKIGES", aLoaded, aFailed) + || !loadLibVerbose ("TKSTEPBase", aLoaded, aFailed) + || !loadLibVerbose ("TKSTEPAttr", aLoaded, aFailed) + || !loadLibVerbose ("TKSTEP209", aLoaded, aFailed) + || !loadLibVerbose ("TKSTEP", aLoaded, aFailed) + // OCCT Visualization + || !loadLibVerbose ("TKService", aLoaded, aFailed) + || !loadLibVerbose ("TKHLR", aLoaded, aFailed) + || !loadLibVerbose ("TKV3d", aLoaded, aFailed) + || !loadLibVerbose ("TKOpenGl", aLoaded, aFailed) + // application code + || !loadLibVerbose ("TKJniSample", aLoaded, aFailed)) + { + nativeLoaded = aLoaded.toString(); + nativeFailed = aFailed.toString(); + areNativeLoaded = false; + //exitWithError (theActivity, "Broken apk?\n" + theFailedInfo); + return false; + } + nativeLoaded = aLoaded.toString(); + areNativeLoaded = true; + return true; + } + + //! Create activity + @Override protected void onCreate (Bundle theBundle) + { + super.onCreate (theBundle); + + boolean isLoaded = loadNatives(); + if (!isLoaded) + { + printShortInfo (this, nativeFailed); + OcctJniLogger.postMessage (nativeLoaded + "\n" + nativeFailed); + } + + setContentView (R.layout.activity_main); + + myOcctView = (OcctJniView )findViewById (R.id.custom_view); + myMessageTextView = (TextView )findViewById (R.id.message_view); + OcctJniLogger.setTextView (myMessageTextView); + + createViewAndButtons (Configuration.ORIENTATION_LANDSCAPE); + + myButtonPreferSize = defineButtonSize ((LinearLayout )findViewById (R.id.panel_menu)); + ImageButton aScrollBtn = (ImageButton )findViewById (R.id.scroll_btn); + aScrollBtn.setY (myButtonPreferSize); + aScrollBtn.setOnTouchListener (new View.OnTouchListener() + { + @Override + public boolean onTouch (View theView, MotionEvent theEvent) + { + return onScrollBtnTouch (theView, theEvent); + } + }); + + onConfigurationChanged (getResources().getConfiguration()); + + Intent anIntent = getIntent(); + Uri aDataUrl = anIntent != null ? anIntent.getData() : null; + String aDataPath = aDataUrl != null ? aDataUrl.getPath() : ""; + myOcctView.open (aDataPath); + myLastPath = aDataPath; + + myContext = new android.content.ContextWrapper (this); + myContext.getExternalFilesDir (null); + } + + //! Handle scroll events + private boolean onScrollBtnTouch (View theView, + MotionEvent theEvent) + { + switch (theEvent.getAction()) + { + case MotionEvent.ACTION_DOWN: + { + LinearLayout aPanelMenu = (LinearLayout )findViewById (R.id.panel_menu); + boolean isLandscape = (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE); + if (aPanelMenu.getVisibility() == View.VISIBLE) + { + aPanelMenu.setVisibility (View.GONE); + if (!isLandscape) + { + ((ImageButton )theView).setImageResource (R.drawable.open_p); + theView.setY (0); + } + else + { + ((ImageButton )theView).setImageResource (R.drawable.open_l); + theView.setX (0); + } + } + else + { + aPanelMenu.setVisibility (View.VISIBLE); + if (!isLandscape) + { + ((ImageButton )theView).setImageResource (R.drawable.close_p); + theView.setY (myButtonPreferSize); + } + else + { + ((ImageButton )theView).setImageResource (R.drawable.close_l); + theView.setX (myButtonPreferSize); + } + } + break; + } + } + return false; + } + + //! Initialize views and buttons + private void createViewAndButtons (int theOrientation) + { + // open button + ImageButton anOpenButton = (ImageButton )findViewById (R.id.open); + anOpenButton.setOnClickListener (this); + + // fit all + ImageButton aFitAllButton = (ImageButton )findViewById (R.id.fit); + aFitAllButton.setOnClickListener (this); + aFitAllButton.setOnTouchListener (new View.OnTouchListener() + { + @Override + public boolean onTouch (View theView, MotionEvent theEvent) + { + return onTouchButton (theView, theEvent); + } + }); + + // message + ImageButton aMessageButton = (ImageButton )findViewById (R.id.message); + aMessageButton.setOnClickListener (this); + + // info + ImageButton anInfoButton = (ImageButton )findViewById (R.id.info); + anInfoButton.setOnClickListener (this); + + // font for text view + TextView anInfoView = (TextView )findViewById (R.id.info_view); + anInfoView.setTextSize (TypedValue.COMPLEX_UNIT_SP, 18); + + // add submenu buttons + createSubmenuBtn (R.id.view, R.id.view_group, + Arrays.asList (R.id.proj_front, R.id.proj_top, R.id.proj_left, + R.id.proj_back, R.id.proj_bottom, R.id.proj_right), + Arrays.asList (R.drawable.proj_front, R.drawable.proj_top, R.drawable.proj_left, + R.drawable.proj_back, R.drawable.proj_bottom, R.drawable.proj_right), + 4); + } + + @Override protected void onNewIntent (Intent theIntent) + { + super.onNewIntent (theIntent); + setIntent (theIntent); + } + + @Override protected void onDestroy() + { + super.onDestroy(); + OcctJniLogger.setTextView (null); + } + + @Override protected void onPause() + { + super.onPause(); + myOcctView.onPause(); + } + + @Override protected void onResume() + { + super.onResume(); + myOcctView.onResume(); + + Intent anIntent = getIntent(); + Uri aDataUrl = anIntent != null ? anIntent.getData() : null; + String aDataPath = aDataUrl != null ? aDataUrl.getPath() : ""; + if (!aDataPath.equals (myLastPath)) + { + myOcctView.open (aDataPath); + myLastPath = aDataPath; + } + } + + //! Copy folder from assets + private boolean copyAssetFolder (AssetManager theAssetMgr, + String theAssetFolder, + String theFolderPathTo) + { + try + { + String[] aFiles = theAssetMgr.list (theAssetFolder); + File aFolder = new File (theFolderPathTo); + aFolder.mkdirs(); + boolean isOk = true; + for (String aFileIter : aFiles) + { + if (aFileIter.contains (".")) + { + isOk &= copyAsset (theAssetMgr, + theAssetFolder + "/" + aFileIter, + theFolderPathTo + "/" + aFileIter); + } + else + { + isOk &= copyAssetFolder (theAssetMgr, + theAssetFolder + "/" + aFileIter, + theFolderPathTo + "/" + aFileIter); + } + } + return isOk; + } + catch (Exception theError) + { + theError.printStackTrace(); + return false; + } + } + + //! Copy single file from assets + private boolean copyAsset (AssetManager theAssetMgr, + String thePathFrom, + String thePathTo) + { + try + { + InputStream aStreamIn = theAssetMgr.open (thePathFrom); + File aFileTo = new File (thePathTo); + aFileTo.createNewFile(); + OutputStream aStreamOut = new FileOutputStream (thePathTo); + copyStreamContent (aStreamIn, aStreamOut); + aStreamIn.close(); + aStreamIn = null; + aStreamOut.flush(); + aStreamOut.close(); + aStreamOut = null; + return true; + } + catch (Exception theError) + { + theError.printStackTrace(); + return false; + } + } + + //! Copy single file + private static void copyStreamContent (InputStream theIn, + OutputStream theOut) throws IOException + { + byte[] aBuffer = new byte[1024]; + int aNbReadBytes = 0; + while ((aNbReadBytes = theIn.read (aBuffer)) != -1) + { + theOut.write (aBuffer, 0, aNbReadBytes); + } + } + + //! Show/hide text view + private void switchTextView (TextView theTextView, + ImageButton theClickedBtn, + boolean theToSwitchOn) + { + if (theTextView != null + && theTextView.getVisibility() == View.GONE + && theToSwitchOn) + { + theTextView.setVisibility (View.VISIBLE); + theClickedBtn.setBackgroundColor (getResources().getColor(R.color.pressedBtnColor)); + setTextViewPosition (theTextView); + } + else + { + theTextView.setVisibility (View.GONE); + theClickedBtn.setBackgroundColor (getResources().getColor (R.color.btnColor)); + } + } + + //! Setup text view position + private void setTextViewPosition (TextView theTextView) + { + if (theTextView.getVisibility() != View.VISIBLE) + { + return; + } + + if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) + { + theTextView.setX (myButtonPreferSize); + theTextView.setY (0); + } + else + { + theTextView.setX (0); + theTextView.setY (myButtonPreferSize); + } + } + + @Override + public void onClick (View theButton) + { + ImageButton aClickedBtn = (ImageButton )theButton; + switch (aClickedBtn.getId()) + { + case R.id.message: + { + switchTextView ((TextView )findViewById (R.id.info_view), + (ImageButton )findViewById (R.id.info), false); + switchTextView (myMessageTextView, aClickedBtn, true); + return; + } + case R.id.info: + { + String aText = getString (R.string.info_html); + aText = String.format (aText, cppOcctMajorVersion(), cppOcctMinorVersion(), cppOcctMicroVersion()); + Spanned aSpanned = Html.fromHtml (aText, new ImageGetter() + { + @Override + public Drawable getDrawable (String theSource) + { + Resources aResources = getResources(); + int anId = aResources.getIdentifier (theSource, "drawable", getPackageName()); + Drawable aRes = aResources.getDrawable (anId); + aRes.setBounds (0, 0, aRes.getIntrinsicWidth(), aRes.getIntrinsicHeight()); + return aRes; + } + }, null); + + TextView anInfoView = (TextView )findViewById (R.id.info_view); + anInfoView.setText (aSpanned); + switchTextView (myMessageTextView, (ImageButton ) findViewById (R.id.message), false); + switchTextView (anInfoView, aClickedBtn, true); + return; + } + case R.id.fit: + { + myOcctView.fitAll(); + return; + } + case R.id.proj_front: + { + myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Xpos); + return; + } + case R.id.proj_left: + { + myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Yneg); + return; + } + case R.id.proj_top: + { + myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Zpos); + return; + } + case R.id.proj_back: + { + myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Xneg); + return; + } + case R.id.proj_right: + { + myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Ypos); + return; + } + case R.id.proj_bottom: + { + myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Zneg); + return; + } + case R.id.open: + { + File aPath = Environment.getExternalStorageDirectory(); + aClickedBtn.setBackgroundColor (getResources().getColor(R.color.pressedBtnColor)); + if (myFileOpenDialog == null) + { + // should be requested on runtime since API level 26 (Android 8) + askUserPermission (android.Manifest.permission.WRITE_EXTERNAL_STORAGE, null); // for accessing SD card + + myFileOpenDialog = new OcctJniFileDialog (this, aPath); + myFileOpenDialog.setFileEndsWith (".brep"); + myFileOpenDialog.setFileEndsWith (".rle"); + myFileOpenDialog.setFileEndsWith (".iges"); + myFileOpenDialog.setFileEndsWith (".igs"); + myFileOpenDialog.setFileEndsWith (".step"); + myFileOpenDialog.setFileEndsWith (".stp"); + myFileOpenDialog.addFileListener (new OcctJniFileDialog.FileSelectedListener() + { + public void fileSelected (File theFile) + { + if (theFile != null && myOcctView != null) + { + myOcctView.open (theFile.getPath()); + } + } + }); + myFileOpenDialog.addDialogDismissedListener (new OcctJniFileDialog.DialogDismissedListener() + { + @Override + public void dialogDismissed() + { + ImageButton openButton = (ImageButton )findViewById (R.id.open); + openButton.setBackgroundColor (getResources().getColor(R.color.btnColor)); + } + }); + } + myFileOpenDialog.showDialog(); + return; + } + } + } + + private void createSubmenuBtn (int theParentBtnId, + int theParentLayoutId, + final List theNewButtonIds, + final List theNewButtonImageIds, + int thePosition) + { + int aPosInList = 0; + final ImageButton aParentBtn = (ImageButton )findViewById (theParentBtnId); + + ViewGroup.LayoutParams aParams = null; + LinearLayout parentLayout = (LinearLayout ) findViewById (theParentLayoutId); + for (Integer newButtonId : theNewButtonIds) + { + ImageButton aNewButton = (ImageButton )findViewById (newButtonId); + if (aNewButton == null) + { + aNewButton = (ImageButton )new ImageButton (this); + aNewButton.setId (newButtonId); + aNewButton.setImageResource (theNewButtonImageIds.get (aPosInList)); + aNewButton.setLayoutParams (aParams); + parentLayout.addView (aNewButton); + } + + aNewButton.setOnClickListener (this); + aNewButton.setVisibility (View.GONE); + + aNewButton.setOnTouchListener (new View.OnTouchListener() + { + @Override + public boolean onTouch (View theView, MotionEvent theEvent) + { + return onTouchButton (theView, theEvent); + } + }); + ++aPosInList; + } + + if (aParentBtn != null) + { + aParentBtn.setOnTouchListener (null); + aParentBtn.setOnTouchListener (new View.OnTouchListener() + { + @Override + public boolean onTouch (View theView, MotionEvent theEvent) + { + if (theEvent.getAction () == MotionEvent.ACTION_DOWN) + { + Boolean isVisible = false; + for (Integer aNewButtonId : theNewButtonIds) + { + ImageButton anBtn = (ImageButton )findViewById (aNewButtonId); + if (anBtn != null) + { + if (anBtn.getVisibility() == View.GONE) + { + anBtn.setVisibility (View.VISIBLE); + isVisible = true; + } + else + { + anBtn.setVisibility (View.GONE); + } + } + } + aParentBtn.setBackgroundColor (!isVisible ? getResources().getColor(R.color.btnColor) : getResources().getColor(R.color.pressedBtnColor)); + } + return false; + } + }); + } + } + + //! Implements onTouch functionality + private boolean onTouchButton (View theView, + MotionEvent theEvent) + { + switch (theEvent.getAction()) + { + case MotionEvent.ACTION_DOWN: + ((ImageButton )theView).setBackgroundColor (getResources().getColor (R.color.pressedBtnColor)); + break; + case MotionEvent.ACTION_UP: + ((ImageButton )theView).setBackgroundColor (getResources().getColor (R.color.btnColor)); + break; + } + return false; + } + + //! Handle configuration change event + @Override + public void onConfigurationChanged (Configuration theNewConfig) + { + super.onConfigurationChanged (theNewConfig); + LinearLayout aLayoutPanelMenu = (LinearLayout )findViewById (R.id.panel_menu); + LayoutParams aPanelMenuLayoutParams = aLayoutPanelMenu.getLayoutParams(); + + LinearLayout aLayoutViewGroup = (LinearLayout )findViewById (R.id.view_group); + LayoutParams aViewGroupLayoutParams = aLayoutViewGroup.getLayoutParams(); + ImageButton aScrollBtn = (ImageButton )findViewById (R.id.scroll_btn); + LayoutParams aScrollBtnLayoutParams = aScrollBtn.getLayoutParams(); + + myButtonPreferSize = defineButtonSize ((LinearLayout )findViewById (R.id.panel_menu)); + defineButtonSize ((LinearLayout )findViewById (R.id.view_group)); + + switch (theNewConfig.orientation) + { + case Configuration.ORIENTATION_PORTRAIT: + { + setHorizontal (aLayoutPanelMenu, aPanelMenuLayoutParams); + setHorizontal (aLayoutViewGroup, aViewGroupLayoutParams); + aLayoutViewGroup.setGravity (Gravity.BOTTOM); + + aScrollBtnLayoutParams.height = LayoutParams.WRAP_CONTENT; + aScrollBtnLayoutParams.width = LayoutParams.MATCH_PARENT; + aScrollBtn.setLayoutParams (aScrollBtnLayoutParams); + if (aLayoutPanelMenu.getVisibility() == View.VISIBLE) + { + aScrollBtn.setImageResource (R.drawable.close_p); + aScrollBtn.setY (myButtonPreferSize); + aScrollBtn.setX (0); + } + else + { + aScrollBtn.setImageResource (R.drawable.open_p); + aScrollBtn.setY (0); + aScrollBtn.setX (0); + } + break; + } + case Configuration.ORIENTATION_LANDSCAPE: + { + setVertical (aLayoutPanelMenu, aPanelMenuLayoutParams); + setVertical (aLayoutViewGroup, aViewGroupLayoutParams); + aLayoutViewGroup.setGravity (Gravity.RIGHT); + + aScrollBtnLayoutParams.height = LayoutParams.MATCH_PARENT; + aScrollBtnLayoutParams.width = LayoutParams.WRAP_CONTENT; + aScrollBtn.setLayoutParams (aScrollBtnLayoutParams); + if (aLayoutPanelMenu.getVisibility() == View.VISIBLE) + { + aScrollBtn.setImageResource (R.drawable.close_l); + aScrollBtn.setX (myButtonPreferSize); + aScrollBtn.setY (0); + } + else + { + aScrollBtn.setImageResource (R.drawable.open_l); + aScrollBtn.setY (0); + aScrollBtn.setX (0); + } + break; + } + } + setTextViewPosition (myMessageTextView); + setTextViewPosition ((TextView )findViewById (R.id.info_view)); + } + + private void setHorizontal (LinearLayout theLayout, + LayoutParams theLayoutParams) + { + theLayout.setOrientation (LinearLayout.HORIZONTAL); + theLayoutParams.height = LayoutParams.WRAP_CONTENT; + theLayoutParams.width = LayoutParams.MATCH_PARENT; + theLayout.setLayoutParams (theLayoutParams); + } + + private void setVertical (LinearLayout theLayout, + LayoutParams theLayoutParams) + { + theLayout.setOrientation (LinearLayout.VERTICAL); + theLayoutParams.height = LayoutParams.MATCH_PARENT; + theLayoutParams.width = LayoutParams.WRAP_CONTENT; + theLayout.setLayoutParams (theLayoutParams); + } + + //! Define button size + private int defineButtonSize (LinearLayout theLayout) + { + boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; + Display aDisplay = getWindowManager().getDefaultDisplay(); + Point aDispPnt = new Point(); + aDisplay.getSize (aDispPnt); + + int aNbChildren = theLayout.getChildCount(); + int aHeight = aDispPnt.y / aNbChildren; + int aWidth = aDispPnt.x / aNbChildren; + int aResultSize = 0; + for (int aChildIter = 0; aChildIter < aNbChildren; ++aChildIter) + { + View aView = theLayout.getChildAt (aChildIter); + if (aView instanceof ImageButton) + { + ImageButton aButton = (ImageButton )aView; + if (isLandscape) + { + aButton.setMinimumWidth (aHeight); + } + else + { + aButton.setMinimumHeight (aWidth); + } + } + } + if (isLandscape) + { + aResultSize = aHeight; + } + else + { + aResultSize = aWidth; + } + return aResultSize; + } + + //! Request user permission. + private void askUserPermission (String thePermission, String theRationale) + { + // Dynamically load methods introduced by API level 23. + // On older system this permission is granted by user during application installation. + java.lang.reflect.Method aMetPtrCheckSelfPermission, aMetPtrRequestPermissions, aMetPtrShouldShowRequestPermissionRationale; + try + { + aMetPtrCheckSelfPermission = myContext.getClass().getMethod ("checkSelfPermission", String.class); + aMetPtrRequestPermissions = getClass().getMethod ("requestPermissions", String[].class, int.class); + aMetPtrShouldShowRequestPermissionRationale = getClass().getMethod ("shouldShowRequestPermissionRationale", String.class); + } + catch (SecurityException theError) + { + postMessage ("Unable to find permission methods:\n" + theError.getMessage(), Message_Trace); + return; + } + catch (NoSuchMethodException theError) + { + postMessage ("Unable to find permission methods:\n" + theError.getMessage(), Message_Trace); + return; + } + + try + { + int isAlreadyGranted = (Integer )aMetPtrCheckSelfPermission.invoke (myContext, thePermission); + if (isAlreadyGranted == android.content.pm.PackageManager.PERMISSION_GRANTED) + { + return; + } + + boolean toShowInfo = theRationale != null && (Boolean )aMetPtrShouldShowRequestPermissionRationale.invoke (this, thePermission); + if (toShowInfo) + { + postMessage (theRationale, Message_Info); + } + + // show dialog to user + aMetPtrRequestPermissions.invoke (this, new String[]{thePermission}, 0); + } + catch (IllegalArgumentException theError) + { + postMessage ("Internal error: Unable to call permission method:\n" + theError.getMessage(), Message_Fail); + return; + } + catch (IllegalAccessException theError) + { + postMessage ("Internal error: Unable to call permission method:\n" + theError.getMessage(), Message_Fail); + return; + } + catch (java.lang.reflect.InvocationTargetException theError) + { + postMessage ("Internal error: Unable to call permission method:\n" + theError.getMessage(), Message_Fail); + return; + } + } + + //! Message gravity. + private static final int Message_Trace = 0; + private static final int Message_Info = 1; + private static final int Message_Warning = 2; + private static final int Message_Alarm = 3; + private static final int Message_Fail = 4; + + //! Auxiliary method to show info message. + public void postMessage (String theMessage, int theGravity) + { + if (theGravity == Message_Trace) + { + return; + } + + final String aText = theMessage; + final Context aCtx = this; + this.runOnUiThread (new Runnable() { public void run() { + android.app.AlertDialog.Builder aBuilder = new android.app.AlertDialog.Builder (aCtx); + aBuilder.setMessage (aText).setNegativeButton ("OK", null); + android.app.AlertDialog aDialog = aBuilder.create(); + aDialog.show(); + }}); + } + + //! OCCT major version + private native long cppOcctMajorVersion(); + + //! OCCT minor version + private native long cppOcctMinorVersion(); + + //! OCCT micro version + private native long cppOcctMicroVersion(); + + private OcctJniView myOcctView; + private TextView myMessageTextView; + private String myLastPath; + private android.content.ContextWrapper myContext = null; + private OcctJniFileDialog myFileOpenDialog; + private int myButtonPreferSize = 65; + +} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniFileDialog.java opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniFileDialog.java --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniFileDialog.java 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniFileDialog.java 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,376 @@ +// Copyright (c) 2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +package com.opencascade.jnisample; + +import java.io.File; +import java.io.FilenameFilter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.opencascade.jnisample.ListenerList.FireHandler; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Environment; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.Spinner; + +//! Simple open file dialog +public class OcctJniFileDialog +{ + + public enum DialogMode + { + FileOpen, FileExport, FileSave + } + + private static final String PARENT_DIR = ".."; + private String[] myFileList; + private File myCurrentPath; + private DialogMode myDialogMode = DialogMode.FileOpen; + + private ListenerList myFileListenerList = new ListenerList(); + private ListenerList myDialogDismissedList = new ListenerList(); + private final Activity myActivity; + private List myFileEndsWith; + private EditText myFileNameInput; + private Spinner myFileExtSpinner; + int myCurrentExtPositionInList = 0; + + public interface FileSelectedListener + { + void fileSelected (File theFile); + } + + public interface DialogDismissedListener + { + void dialogDismissed(); + } + + //! Main constructor. + public OcctJniFileDialog (Activity theActivity, + File thePath) + { + myActivity = theActivity; + if (!thePath.exists()) + { + thePath = Environment.getExternalStorageDirectory(); + } + loadFileList (thePath); + } + + //! Create new dialog + public Dialog createFileDialog() + { + final Object[] anObjWrapper = new Object[1]; + Dialog aDialog = null; + AlertDialog.Builder aBuilder = new AlertDialog.Builder (myActivity); + + aBuilder.setTitle (myCurrentPath.getPath()); + LinearLayout aTitleLayout = new LinearLayout (myActivity); + aTitleLayout.setLayoutParams (new LinearLayout.LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + aTitleLayout.setOrientation (LinearLayout.VERTICAL); + + ListView list = new ListView (myActivity); + list.setScrollingCacheEnabled(false); + list.setBackgroundColor (Color.parseColor ("#33B5E5")); + + list.setAdapter (new ArrayAdapter (myActivity, android.R.layout.select_dialog_item, myFileList)); + list.setOnItemClickListener (new AdapterView.OnItemClickListener () + { + + public void onItemClick (AdapterView arg0, View view, int pos, long id) + { + String fileChosen = myFileList[pos]; + File aChosenFile = getChosenFile (fileChosen); + if (aChosenFile.isDirectory()) + { + loadFileList (aChosenFile); + ((Dialog )anObjWrapper[0]).cancel(); + ((Dialog )anObjWrapper[0]).dismiss(); + showDialog(); + } + else + { + if (myDialogMode == DialogMode.FileOpen) + { + ((Dialog )anObjWrapper[0]).cancel(); + ((Dialog )anObjWrapper[0]).dismiss(); + fireFileSelectedEvent (aChosenFile); + } + else + { + myFileNameInput.setText (aChosenFile.getName()); + } + } + } + }); + list.setLayoutParams (new LinearLayout.LayoutParams (LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 0.6f)); + aTitleLayout.addView (list); + + if (myDialogMode == DialogMode.FileSave + || myDialogMode == DialogMode.FileExport) + { + myFileNameInput = new EditText (myActivity); + myFileExtSpinner = new Spinner (myActivity); + ArrayAdapter adapter = null; + if (myDialogMode == DialogMode.FileExport) + { + adapter = ArrayAdapter.createFromResource (myActivity, R.array.ext_to_exp, + android.R.layout.simple_spinner_item); + } + else + { + adapter = ArrayAdapter.createFromResource (myActivity, R.array.ext_to_save, + android.R.layout.simple_spinner_item); + } + // Specify the layout to use when the list of choices appears + adapter.setDropDownViewResource (android.R.layout.simple_spinner_dropdown_item); + // Apply the adapter to the spinner + myFileExtSpinner.setAdapter (adapter); + myFileExtSpinner.setSelection (myCurrentExtPositionInList); + + myFileExtSpinner.setOnItemSelectedListener (new AdapterView.OnItemSelectedListener() + { + + @Override + public void onNothingSelected (AdapterView theParentView) + { + // your code here + } + + @Override + public void onItemSelected (AdapterView theParent, View theView, int thePosition, long theId) + { + if (myCurrentExtPositionInList != thePosition) + { + myCurrentExtPositionInList = thePosition; + setFileEndsWith (Arrays.asList (myFileExtSpinner.getSelectedItem().toString())); + loadFileList (myCurrentPath); + ((Dialog )anObjWrapper[0]).cancel(); + ((Dialog )anObjWrapper[0]).dismiss(); + showDialog(); + } + } + }); + + myFileExtSpinner.setLayoutParams (new LinearLayout.LayoutParams (LayoutParams.MATCH_PARENT, + LayoutParams.WRAP_CONTENT, 0.2f)); + // titleLayout.addView(fileExtSpinner); + myFileNameInput.setLayoutParams (new LinearLayout.LayoutParams (LayoutParams.MATCH_PARENT, + LayoutParams.WRAP_CONTENT, 0.2f)); + LinearLayout aControlsView = new LinearLayout (myActivity); + + aControlsView.addView (myFileNameInput); + aControlsView.addView (myFileExtSpinner); + + aTitleLayout.addView (aControlsView); + aBuilder.setView (aTitleLayout); + aBuilder.setPositiveButton ("OK", new DialogInterface.OnClickListener() + { + @Override + public void onClick (DialogInterface theDialog, int theWhich) + { + if (theWhich >= 0) + { + String aFileChosen = myFileList[theWhich]; + File aChosenFile = getChosenFile (aFileChosen); + fireFileSelectedEvent (aChosenFile); + } + } + }).setNegativeButton ("Cancel", null); + } + else + { + aBuilder.setNegativeButton ("Cancel", null); + } + + aBuilder.setView (aTitleLayout); + + aDialog = aBuilder.show(); + aDialog.setOnDismissListener (new DialogInterface.OnDismissListener() + { + @Override + public void onDismiss (DialogInterface theDialog) + { + fireDialogDismissedEvent(); + } + }); + anObjWrapper[0] = aDialog; + return aDialog; + } + + public void addFileListener (FileSelectedListener theListener) + { + myFileListenerList.add (theListener); + } + + public void addDialogDismissedListener (DialogDismissedListener theListener) + { + myDialogDismissedList.add (theListener); + } + + //! Show file dialog + public void showDialog() + { + createFileDialog().show(); + } + + private void fireFileSelectedEvent (final File theFile) + { + myFileListenerList.fireEvent (new FireHandler() + { + public void fireEvent (FileSelectedListener theListener) + { + theListener.fileSelected (theFile); + } + }); + } + + private void fireDialogDismissedEvent() + { + myDialogDismissedList.fireEvent (new FireHandler() + { + public void fireEvent (DialogDismissedListener theListener) + { + theListener.dialogDismissed(); + } + }); + } + + private void loadFileList (File thePath) + { + myCurrentPath = thePath; + List aList = new ArrayList(); + if (thePath.exists()) + { + if (thePath.getParentFile() != null) + { + aList.add (PARENT_DIR); + } + FilenameFilter aFilter = new FilenameFilter() + { + public boolean accept (File theDir, String theFilename) + { + File aSel = new File (theDir, theFilename); + if (!aSel.canRead()) + { + return false; + } + boolean isEndWith = false; + if (myFileEndsWith != null) + { + for (String aFileExtIter : myFileEndsWith) + { + if (theFilename.toLowerCase().endsWith (aFileExtIter)) + { + isEndWith = true; + break; + } + } + } + return isEndWith || aSel.isDirectory(); + } + }; + String[] aFileList1 = thePath.list (aFilter); + if (aFileList1 != null) + { + for (String aFileIter : aFileList1) + { + aList.add (aFileIter); + } + } + } + myFileList = (String[] )aList.toArray (new String[] {}); + } + + private File getChosenFile (String theFileChosen) + { + if (theFileChosen.equals (PARENT_DIR)) + return myCurrentPath.getParentFile(); + else + return new File (myCurrentPath, theFileChosen); + } + + public void setFileEndsWith (String fileEndsWith) + { + if (myFileEndsWith == null) + { + myFileEndsWith = new ArrayList(); + } + if (myFileEndsWith.indexOf (fileEndsWith) == -1) + { + myFileEndsWith.add (fileEndsWith); + } + } + + public void setFileEndsWith (List theFileEndsWith) + { + myFileEndsWith = theFileEndsWith; + } + + public DialogMode DialogMode() + { + return myDialogMode; + } + + public void DialogMode (DialogMode theMode) + { + myDialogMode = theMode; + } +} + +class ListenerList +{ + private List myListenerList = new ArrayList(); + + public interface FireHandler + { + void fireEvent (L theListener); + } + + public void add (L theListener) + { + myListenerList.add (theListener); + } + + public void fireEvent (FireHandler theFireHandler) + { + List aCopy = new ArrayList (myListenerList); + for (L anIter : aCopy) + { + theFireHandler.fireEvent (anIter); + } + } + + public void remove (L theListener) + { + myListenerList.remove (theListener); + } + + public List getListenerList() + { + return myListenerList; + } +} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniLogger.java opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniLogger.java --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniLogger.java 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniLogger.java 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,71 @@ +// Copyright (c) 2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +package com.opencascade.jnisample; + +import java.util.concurrent.locks.ReentrantLock; + +import android.util.Log; +import android.widget.TextView; + +//! Auxiliary class for logging messages +public class OcctJniLogger +{ + + //! Setup text view + public static void setTextView (TextView theTextView) + { + if (myTextView != null) + { + myLog = myTextView.getText().toString(); + } + + myTextView = theTextView; + if (myTextView != null) + { + myTextView.setText (myLog); + myLog = ""; + } + } + + //! Interface implementation + public static void postMessage (String theText) + { + final String aCopy = new String (theText); + Log.e (myTag, theText); + + myMutex.lock(); + final TextView aView = myTextView; + if (aView == null) + { + myLog += aCopy; + myMutex.unlock(); + return; + } + + aView.post (new Runnable() + { + public void run() + { + aView.setText (aView.getText() + aCopy + "\n"); + } + }); + myMutex.unlock(); + } + + private static final String myTag = "occtJniViewer"; + private static final ReentrantLock myMutex = new ReentrantLock (true); + private static TextView myTextView = null; + private static String myLog = ""; + +} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniRenderer.java opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniRenderer.java --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniRenderer.java 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniRenderer.java 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,210 @@ +// Copyright (c) 2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +package com.opencascade.jnisample; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLSurfaceView; + +//! Wrapper for C++ OCCT viewer. +public class OcctJniRenderer implements GLSurfaceView.Renderer +{ + + //! Wrapper for V3d_TypeOfOrientation + enum TypeOfOrientation + { + Xpos, // front + Ypos, // left + Zpos, // top + Xneg, // back + Yneg, // right + Zneg // bottom + }; + + //! Empty constructor. + OcctJniRenderer (GLSurfaceView theView, + float theScreenDensity) + { + myView = theView; // this makes cyclic dependency, but it is OK for JVM + if (OcctJniActivity.areNativeLoaded) + { + myCppViewer = cppCreate (theScreenDensity); + } + } + + //! Open file. + public void open (String thePath) + { + if (myCppViewer != 0) + { + cppOpen (myCppViewer, thePath); + } + } + + //! Update viewer. + public void onDrawFrame (GL10 theGl) + { + if (myCppViewer != 0) + { + if (cppRedraw (myCppViewer)) + { + myView.requestRender(); // this method is allowed from any thread + } + } + } + + //! (re)initialize viewer. + public void onSurfaceChanged (GL10 theGl, int theWidth, int theHeight) + { + if (myCppViewer != 0) + { + cppResize (myCppViewer, theWidth, theHeight); + } + } + + public void onSurfaceCreated (GL10 theGl, EGLConfig theEglConfig) + { + if (myCppViewer != 0) + { + cppInit (myCppViewer); + } + } + + //! Add touch point. + public void onAddTouchPoint (int theId, float theX, float theY) + { + if (myCppViewer != 0) + { + cppAddTouchPoint (myCppViewer, theId, theX, theY); + } + } + + //! Update touch point. + public void onUpdateTouchPoint (int theId, float theX, float theY) + { + if (myCppViewer != 0) + { + cppUpdateTouchPoint (myCppViewer, theId, theX, theY); + } + } + + //! Remove touch point. + public void onRemoveTouchPoint (int theId) + { + if (myCppViewer != 0) + { + cppRemoveTouchPoint (myCppViewer, theId); + } + } + + //! Select in 3D Viewer. + public void onSelectInViewer (float theX, float theY) + { + if (myCppViewer != 0) + { + cppSelectInViewer (myCppViewer, theX, theY); + } + } + + //! Fit All + public void fitAll() + { + if (myCppViewer != 0) + { + cppFitAll (myCppViewer); + } + } + + //! Move camera + public void setProj (TypeOfOrientation theProj) + { + if (myCppViewer == 0) + { + return; + } + + switch (theProj) + { + case Xpos: cppSetXposProj (myCppViewer); break; + case Ypos: cppSetYposProj (myCppViewer); break; + case Zpos: cppSetZposProj (myCppViewer); break; + case Xneg: cppSetXnegProj (myCppViewer); break; + case Yneg: cppSetYnegProj (myCppViewer); break; + case Zneg: cppSetZnegProj (myCppViewer); break; + } + } + + //! Post message to the text view. + public void postMessage (String theText) + { + OcctJniLogger.postMessage (theText); + } + + //! Create instance of C++ class + private native long cppCreate (float theDispDensity); + + //! Destroy instance of C++ class + private native void cppDestroy (long theCppPtr); + + //! Initialize OCCT viewer (steal OpenGL ES context bound to this thread) + private native void cppInit (long theCppPtr); + + //! Resize OCCT viewer + private native void cppResize (long theCppPtr, int theWidth, int theHeight); + + //! Open CAD file + private native void cppOpen (long theCppPtr, String thePath); + + //! Add touch point + private native void cppAddTouchPoint (long theCppPtr, int theId, float theX, float theY); + + //! Update touch point + private native void cppUpdateTouchPoint (long theCppPtr, int theId, float theX, float theY); + + //! Remove touch point + private native void cppRemoveTouchPoint (long theCppPtr, int theId); + + //! Select in 3D Viewer. + private native void cppSelectInViewer (long theCppPtr, float theX, float theY); + + //! Redraw OCCT viewer + //! Returns TRUE if more frames are requested. + private native boolean cppRedraw (long theCppPtr); + + //! Fit All + private native void cppFitAll (long theCppPtr); + + //! Move camera + private native void cppSetXposProj (long theCppPtr); + + //! Move camera + private native void cppSetYposProj (long theCppPtr); + + //! Move camera + private native void cppSetZposProj (long theCppPtr); + + //! Move camera + private native void cppSetXnegProj (long theCppPtr); + + //! Move camera + private native void cppSetYnegProj (long theCppPtr); + + //! Move camera + private native void cppSetZnegProj (long theCppPtr); + + private GLSurfaceView myView = null; //!< back reference to the View + private long myCppViewer = 0; //!< pointer to c++ class instance + +} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniView.java opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniView.java --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniView.java 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/java/com/opencascade/jnisample/OcctJniView.java 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,294 @@ +// Copyright (c) 2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +package com.opencascade.jnisample; + +import android.app.ActionBar.LayoutParams; +import android.content.Context; +import android.graphics.PointF; +import android.opengl.GLSurfaceView; +import android.util.AttributeSet; +import android.util.SparseArray; +import android.view.MotionEvent; +import android.widget.RelativeLayout; + +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.egl.EGLContext; +import javax.microedition.khronos.egl.EGLDisplay; + +//! OpenGL ES 2.0+ view. +//! Performs rendering in parallel thread. +class OcctJniView extends GLSurfaceView +{ + + // ! Default constructor. + public OcctJniView (Context theContext, + AttributeSet theAttrs) + { + super (theContext, theAttrs); + + android.util.DisplayMetrics aDispInfo = theContext.getResources().getDisplayMetrics(); + myScreenDensity = aDispInfo.density; + + setPreserveEGLContextOnPause (true); + setEGLContextFactory (new ContextFactory()); + setEGLConfigChooser (new ConfigChooser()); + + RelativeLayout.LayoutParams aLParams = new RelativeLayout.LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + aLParams.addRule (RelativeLayout.ALIGN_TOP); + + myRenderer = new OcctJniRenderer (this, myScreenDensity); + setRenderer (myRenderer); + setRenderMode (GLSurfaceView.RENDERMODE_WHEN_DIRTY); // render on request to spare battery + } + + //! Open file. + public void open (String thePath) + { + final String aPath = thePath; + queueEvent (new Runnable() { public void run() { myRenderer.open (aPath); }}); + requestRender(); + } + + //! Create OpenGL ES 2.0+ context + private static class ContextFactory implements GLSurfaceView.EGLContextFactory + { + private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098; + public EGLContext createContext (EGL10 theEgl, + EGLDisplay theEglDisplay, + EGLConfig theEglConfig) + { + if (theEglConfig == null) + { + return null; + } + + // reset EGL errors stack + int anError = EGL10.EGL_SUCCESS; + while ((anError = theEgl.eglGetError()) != EGL10.EGL_SUCCESS) {} + + int[] anAttribs = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE }; + EGLContext aEglContext = theEgl.eglCreateContext (theEglDisplay, theEglConfig, EGL10.EGL_NO_CONTEXT, anAttribs); + + while ((anError = theEgl.eglGetError()) != EGL10.EGL_SUCCESS) + { + OcctJniLogger.postMessage ("Error: eglCreateContext() " + String.format ("0x%x", anError)); + } + return aEglContext; + } + + public void destroyContext (EGL10 theEgl, + EGLDisplay theEglDisplay, + EGLContext theEglContext) + { + theEgl.eglDestroyContext (theEglDisplay, theEglContext); + } + } + + //! Search for RGB24 config with depth and stencil buffers + private static class ConfigChooser implements GLSurfaceView.EGLConfigChooser + { + //! Reset EGL errors stack + private void popEglErrors (EGL10 theEgl) + { + int anError = EGL10.EGL_SUCCESS; + while ((anError = theEgl.eglGetError()) != EGL10.EGL_SUCCESS) + { + OcctJniLogger.postMessage ("EGL Error: " + String.format ("0x%x", anError)); + } + } + + //! Auxiliary method to dump EGL configuration - for debugging purposes + @SuppressWarnings("unused") + private void printConfig (EGL10 theEgl, + EGLDisplay theEglDisplay, + EGLConfig theEglConfig) + { + int[] THE_ATTRIBS = + { + EGL10.EGL_BUFFER_SIZE, EGL10.EGL_ALPHA_SIZE, EGL10.EGL_BLUE_SIZE, EGL10.EGL_GREEN_SIZE, EGL10.EGL_RED_SIZE, EGL10.EGL_DEPTH_SIZE, EGL10.EGL_STENCIL_SIZE, + EGL10.EGL_CONFIG_CAVEAT, + EGL10.EGL_CONFIG_ID, + EGL10.EGL_LEVEL, + EGL10.EGL_MAX_PBUFFER_HEIGHT, EGL10.EGL_MAX_PBUFFER_PIXELS, EGL10.EGL_MAX_PBUFFER_WIDTH, + EGL10.EGL_NATIVE_RENDERABLE, EGL10.EGL_NATIVE_VISUAL_ID, EGL10.EGL_NATIVE_VISUAL_TYPE, + 0x3030, // EGL10.EGL_PRESERVED_RESOURCES, + EGL10.EGL_SAMPLES, EGL10.EGL_SAMPLE_BUFFERS, + EGL10.EGL_SURFACE_TYPE, + EGL10.EGL_TRANSPARENT_TYPE, EGL10.EGL_TRANSPARENT_RED_VALUE, EGL10.EGL_TRANSPARENT_GREEN_VALUE, EGL10.EGL_TRANSPARENT_BLUE_VALUE, + 0x3039, 0x303A, // EGL10.EGL_BIND_TO_TEXTURE_RGB, EGL10.EGL_BIND_TO_TEXTURE_RGBA, + 0x303B, 0x303C, // EGL10.EGL_MIN_SWAP_INTERVAL, EGL10.EGL_MAX_SWAP_INTERVAL + EGL10.EGL_LUMINANCE_SIZE, EGL10.EGL_ALPHA_MASK_SIZE, + EGL10.EGL_COLOR_BUFFER_TYPE, EGL10.EGL_RENDERABLE_TYPE, + 0x3042 // EGL10.EGL_CONFORMANT + }; + String[] THE_NAMES = + { + "EGL_BUFFER_SIZE", "EGL_ALPHA_SIZE", "EGL_BLUE_SIZE", "EGL_GREEN_SIZE", "EGL_RED_SIZE", "EGL_DEPTH_SIZE", "EGL_STENCIL_SIZE", + "EGL_CONFIG_CAVEAT", + "EGL_CONFIG_ID", + "EGL_LEVEL", + "EGL_MAX_PBUFFER_HEIGHT", "EGL_MAX_PBUFFER_PIXELS", "EGL_MAX_PBUFFER_WIDTH", + "EGL_NATIVE_RENDERABLE", "EGL_NATIVE_VISUAL_ID", "EGL_NATIVE_VISUAL_TYPE", + "EGL_PRESERVED_RESOURCES", + "EGL_SAMPLES", "EGL_SAMPLE_BUFFERS", + "EGL_SURFACE_TYPE", + "EGL_TRANSPARENT_TYPE", "EGL_TRANSPARENT_RED_VALUE", "EGL_TRANSPARENT_GREEN_VALUE", "EGL_TRANSPARENT_BLUE_VALUE", + "EGL_BIND_TO_TEXTURE_RGB", "EGL_BIND_TO_TEXTURE_RGBA", + "EGL_MIN_SWAP_INTERVAL", "EGL_MAX_SWAP_INTERVAL", + "EGL_LUMINANCE_SIZE", "EGL_ALPHA_MASK_SIZE", + "EGL_COLOR_BUFFER_TYPE", "EGL_RENDERABLE_TYPE", + "EGL_CONFORMANT" + }; + int[] aValue = new int[1]; + for (int anAttrIter = 0; anAttrIter < THE_ATTRIBS.length; ++anAttrIter) + { + int anAttr = THE_ATTRIBS[anAttrIter]; + String aName = THE_NAMES [anAttrIter]; + if (theEgl.eglGetConfigAttrib (theEglDisplay, theEglConfig, anAttr, aValue)) + { + OcctJniLogger.postMessage (String.format (" %s: %d\n", aName, aValue[0])); + } + else + { + popEglErrors (theEgl); + } + } + } + + //! Interface implementation + public EGLConfig chooseConfig (EGL10 theEgl, + EGLDisplay theEglDisplay) + { + int EGL_OPENGL_ES2_BIT = 4; + int[] aCfgAttribs = + { + EGL10.EGL_RED_SIZE, 8, + EGL10.EGL_GREEN_SIZE, 8, + EGL10.EGL_BLUE_SIZE, 8, + EGL10.EGL_ALPHA_SIZE, 0, + EGL10.EGL_DEPTH_SIZE, 24, + EGL10.EGL_STENCIL_SIZE, 8, + EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL10.EGL_NONE + }; + + EGLConfig aConfigs[] = new EGLConfig[1]; + int[] aNbConfigs = new int[1]; + if (!theEgl.eglChooseConfig (theEglDisplay, aCfgAttribs, aConfigs, 1, aNbConfigs) + || aConfigs[0] == null) + { + aCfgAttribs[4 * 2 + 1] = 16; // try config with smaller depth buffer + popEglErrors (theEgl); + if (!theEgl.eglChooseConfig (theEglDisplay, aCfgAttribs, aConfigs, 1, aNbConfigs) + || aConfigs[0] == null) + { + OcctJniLogger.postMessage ("Error: eglChooseConfig() has failed!"); + return null; + } + } + + //printConfig (theEgl, theEglDisplay, aConfigs[0]); + return aConfigs[0]; + } + } + + //! Callback to handle touch events + @Override public boolean onTouchEvent (MotionEvent theEvent) + { + final int aMaskedAction = theEvent.getActionMasked(); + switch (aMaskedAction) + { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + { + final int aPointerIndex = theEvent.getActionIndex(); + final int aPointerId = theEvent.getPointerId (aPointerIndex); + final PointF aPnt = new PointF (theEvent.getX (aPointerIndex), theEvent.getY (aPointerIndex)); + + if (theEvent.getPointerCount() == 1) + { + mySelectPoint = aPnt; + } + else + { + mySelectPoint = null; + } + + queueEvent (new Runnable() { public void run() { myRenderer.onAddTouchPoint (aPointerId, aPnt.x, aPnt.y); }}); + break; + } + case MotionEvent.ACTION_MOVE: + { + for (int aNbPointers = theEvent.getPointerCount(), aPntIter = 0; aPntIter < aNbPointers; ++aPntIter) + { + final int aPointerId = theEvent.getPointerId (aPntIter); + final PointF aPnt = new PointF (theEvent.getX (aPntIter), theEvent.getY (aPntIter)); + queueEvent (new Runnable() { public void run() { myRenderer.onUpdateTouchPoint (aPointerId, aPnt.x, aPnt.y); }}); + } + if (mySelectPoint != null) + { + final float aTouchThreshold = 5.0f * myScreenDensity; + final int aPointerIndex = theEvent.getActionIndex(); + final PointF aDelta = new PointF (theEvent.getX (aPointerIndex) - mySelectPoint.x, theEvent.getY (aPointerIndex) - mySelectPoint.y); + if (Math.abs (aDelta.x) > aTouchThreshold || Math.abs (aDelta.y) > aTouchThreshold) + { + mySelectPoint = null; + } + } + break; + } + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + case MotionEvent.ACTION_CANCEL: + { + if (mySelectPoint != null) + { + final float aSelX = mySelectPoint.x; + final float aSelY = mySelectPoint.y; + queueEvent (new Runnable() { public void run() { myRenderer.onSelectInViewer (aSelX, aSelY); }}); + mySelectPoint = null; + } + + final int aPointerIndex = theEvent.getActionIndex(); + final int aPointerId = theEvent.getPointerId (aPointerIndex); + final PointF aPnt = new PointF (theEvent.getX (aPointerIndex), theEvent.getY (aPointerIndex)); + queueEvent (new Runnable() { public void run() { myRenderer.onRemoveTouchPoint (aPointerId); }}); + } + } + requestRender(); + return true; + } + + //! Fit All + public void fitAll() + { + queueEvent (new Runnable() { public void run() { myRenderer.fitAll(); }}); + requestRender(); + } + + //! Move camera + public void setProj (final OcctJniRenderer.TypeOfOrientation theProj) + { + queueEvent (new Runnable() { public void run() { myRenderer.setProj (theProj); }}); + requestRender(); + } + + //! OCCT viewer + private OcctJniRenderer myRenderer = null; + private int mySelectId = -1; + private PointF mySelectPoint = null; + private float myScreenDensity = 1.0f; + +} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/jni/CMakeLists.txt opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/jni/CMakeLists.txt --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/jni/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/jni/CMakeLists.txt 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,43 @@ +cmake_minimum_required(VERSION 3.4.1) + +set(HEADER_FILES OcctJni_MsgPrinter.hxx OcctJni_Viewer.hxx) +set(SOURCE_FILES OcctJni_MsgPrinter.cxx OcctJni_Viewer.cxx) + +set (anOcctLibs + TKernel TKMath TKG2d TKG3d TKGeomBase TKBRep TKGeomAlgo TKTopAlgo TKShHealing TKMesh + # exchange + TKPrim TKBO TKBool TKFillet TKOffset + TKXSBase + TKIGES + TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP + # OCCT Visualization + TKService TKHLR TKV3d TKOpenGl +) + +set(aLibDeps "") + +# OCCT libraries +include_directories(${OCCT_ROOT}/inc) +foreach(anOcctLib ${anOcctLibs}) + add_library(lib_${anOcctLib} SHARED IMPORTED) + set_target_properties(lib_${anOcctLib} PROPERTIES IMPORTED_LOCATION ${OCCT_ROOT}/libs/${ANDROID_ABI}/lib${anOcctLib}.so) + list(APPEND aLibDeps lib_${anOcctLib}) +endforeach() + +# FreeType +add_library(lib_FreeType SHARED IMPORTED) +set_target_properties(lib_FreeType PROPERTIES IMPORTED_LOCATION ${FREETYPE_ROOT}/libs/${ANDROID_ABI}/libfreetype.so) +list(APPEND aLibDeps lib_FreeType) + +# FreeImage - uncomment, if OCCT was built with FreeImage +#add_library(lib_FreeImage SHARED IMPORTED) +#set_target_properties(lib_FreeImage PROPERTIES IMPORTED_LOCATION ${FREETYPE_ROOT}/libs/${ANDROID_ABI}/libfreeimage.so) +#list(APPEND aLibDeps lib_FreeImage) + +# system libraries +list(APPEND aLibDeps EGL GLESv2 log android) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -frtti -fexceptions -fpermissive") + +add_library(TKJniSample SHARED ${SOURCE_FILES}) +target_link_libraries(TKJniSample ${aLibDeps}) diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_MsgPrinter.cxx opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_MsgPrinter.cxx --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_MsgPrinter.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_MsgPrinter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,71 @@ +// Copyright (c) 2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include "OcctJni_MsgPrinter.hxx" + +#include +#include + +#include + +IMPLEMENT_STANDARD_RTTIEXT(OcctJni_MsgPrinter, Message_Printer) + +// ======================================================================= +// function : OcctJni_MsgPrinter +// purpose : +// ======================================================================= +OcctJni_MsgPrinter::OcctJni_MsgPrinter (JNIEnv* theJEnv, + jobject theJObj) +: myJEnv (theJEnv), + myJObj (theJEnv->NewGlobalRef (theJObj)), + myJMet (NULL) +{ + jclass aJClass = theJEnv->GetObjectClass (theJObj); + myJMet = theJEnv->GetMethodID (aJClass, "postMessage", "(Ljava/lang/String;)V"); + if (myJMet == NULL) + { + __android_log_write (ANDROID_LOG_FATAL, "jniSample", "Broken initialization of OcctJni_MsgPrinter!"); + } +} + +// ======================================================================= +// function : ~OcctJni_MsgPrinter +// purpose : +// ======================================================================= +OcctJni_MsgPrinter::~OcctJni_MsgPrinter() +{ + //myJEnv->DeleteGlobalRef (myJObj); +} + +// ======================================================================= +// function : send +// purpose : +// ======================================================================= +void OcctJni_MsgPrinter::send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const +{ + if (theGravity < myTraceLevel) + { + return; + } + + ///__android_log_write (ANDROID_LOG_DEBUG, "OcctJni_MsgPrinter", (TCollection_AsciiString(" @@ ") + theString).ToCString()); + if (myJMet == NULL) + { + return; + } + + jstring aJStr = myJEnv->NewStringUTF ((theString + "\n").ToCString()); + myJEnv->CallVoidMethod (myJObj, myJMet, aJStr); + myJEnv->DeleteLocalRef (aJStr); +} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_MsgPrinter.hxx opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_MsgPrinter.hxx --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_MsgPrinter.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_MsgPrinter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,53 @@ +// Copyright (c) 2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef OcctJni_MsgPrinter_H +#define OcctJni_MsgPrinter_H + +#include + +#include + +// Class providing connection between messenger interfaces in C++ and Java layers. +class OcctJni_MsgPrinter : public Message_Printer +{ +public: + + //! Default constructor + OcctJni_MsgPrinter (JNIEnv* theJEnv, + jobject theJObj); + + //! Destructor. + ~OcctJni_MsgPrinter(); + +protected: + + //! Main printing method + virtual void send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const override; + +private: + + JNIEnv* myJEnv; + jobject myJObj; + jmethodID myJMet; + +public: + + DEFINE_STANDARD_RTTIEXT(OcctJni_MsgPrinter,Message_Printer) + +}; + +DEFINE_STANDARD_HANDLE(OcctJni_MsgPrinter, Message_Printer) + +#endif // OcctJni_MsgPrinter_H diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_Viewer.cxx opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_Viewer.cxx --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_Viewer.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_Viewer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,834 @@ +// Copyright (c) 2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include "OcctJni_Viewer.hxx" +#include "OcctJni_MsgPrinter.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include + +#include +#include + +#include + +//! @return true if file exists +static bool isFileExist (const TCollection_AsciiString& thePath) +{ + struct stat64 aStatBuffer; + return stat64 (thePath.ToCString(), &aStatBuffer) == 0; +} + +//! Cut-off the last split character from the path and everything after it. +static TCollection_AsciiString getParentDir (const TCollection_AsciiString& thePath) +{ + TCollection_AsciiString aPath = thePath; + char* aSplitter = (char* )aPath.ToCString(); + for (char* anIter = aSplitter; *anIter != '\0'; ++anIter) + { + if (*anIter == '\\' + || *anIter == '/') + { + aSplitter = anIter; + } + } + *aSplitter = '\0'; // cut off file name or trailing folder + return TCollection_AsciiString (aPath.ToCString()); +} + +//! Set environment variable theVarName indicating location of resource +//! file theFile so as to correspond to actual location of this file. +//! +//! The resource file is searched in directory where Test.Draw.dll is located, +//! and if not found - also in subdirectory ../res from there. +//! If file is found, environment variable is set for C subsystem. +//! Otherwise, environment is not changed. +//! +//! If theToAddFileName is true, complete file name is set as value of the variable, +//! if theToAddFileName is false, only path is set. +Standard_Boolean setResourceEnv (const TCollection_AsciiString& theVarName, + const TCollection_AsciiString& theRoot, + const TCollection_AsciiString& theFile, + const Standard_Boolean theToAddFileName) +{ + // use location of current assembly to figure out possible location of resource + TCollection_AsciiString aBaseDir = theRoot; + + // check the same directory where binary is located + if (!isFileExist (aBaseDir + "/" + theFile)) + { + // check subdirectory ../res + aBaseDir = getParentDir (aBaseDir) + "/res"; + if (!isFileExist (aBaseDir + "/" + theFile)) + { + return Standard_False; + } + } + + // set C library environment + if (theToAddFileName) + { + aBaseDir = aBaseDir + "/" + theFile; + } + + OSD_Environment anEnv (theVarName, aBaseDir); + anEnv.Build(); + return Standard_True; +} + +// ======================================================================= +// function : OcctJni_Viewer +// purpose : +// ======================================================================= +OcctJni_Viewer::OcctJni_Viewer (float theDispDensity) +: myDevicePixelRatio (theDispDensity), + myIsJniMoreFrames (false) +{ + SetTouchToleranceScale (theDispDensity); +#ifndef NDEBUG + // Register printer for logging messages into global Android log. + // Should never be used in production (or specify higher gravity for logging only failures). + Handle(Message_Messenger) aMsgMgr = Message::DefaultMessenger(); + aMsgMgr->RemovePrinters (STANDARD_TYPE (Message_PrinterSystemLog)); + aMsgMgr->AddPrinter (new Message_PrinterSystemLog ("OcctJni_Viewer")); +#endif + + // prepare necessary environment + TCollection_AsciiString aResRoot = "/data/data/com.opencascade.jnisample/files"; + + setResourceEnv ("CSF_XSMessage", aResRoot + "/XSMessage", "XSTEP.us", Standard_False); + setResourceEnv ("CSF_SHMessage", aResRoot + "/XSMessage", "SHAPE.us", Standard_False); +} + +// ================================================================ +// Function : dumpGlInfo +// Purpose : +// ================================================================ +void OcctJni_Viewer::dumpGlInfo (bool theIsBasic) +{ + TColStd_IndexedDataMapOfStringString aGlCapsDict; + myView->DiagnosticInformation (aGlCapsDict, Graphic3d_DiagnosticInfo_Basic); //theIsBasic ? Graphic3d_DiagnosticInfo_Basic : Graphic3d_DiagnosticInfo_Complete); + if (theIsBasic) + { + TCollection_AsciiString aViewport; + aGlCapsDict.FindFromKey ("Viewport", aViewport); + aGlCapsDict.Clear(); + aGlCapsDict.Add ("Viewport", aViewport); + } + aGlCapsDict.Add ("Display scale", TCollection_AsciiString(myDevicePixelRatio)); + + // beautify output + { + TCollection_AsciiString* aGlVer = aGlCapsDict.ChangeSeek ("GLversion"); + TCollection_AsciiString* aGlslVer = aGlCapsDict.ChangeSeek ("GLSLversion"); + if (aGlVer != NULL + && aGlslVer != NULL) + { + *aGlVer = *aGlVer + " [GLSL: " + *aGlslVer + "]"; + aGlslVer->Clear(); + } + } + + TCollection_AsciiString anInfo; + for (TColStd_IndexedDataMapOfStringString::Iterator aValueIter (aGlCapsDict); aValueIter.More(); aValueIter.Next()) + { + if (!aValueIter.Value().IsEmpty()) + { + if (!anInfo.IsEmpty()) + { + anInfo += "\n"; + } + anInfo += aValueIter.Key() + ": " + aValueIter.Value(); + } + } + + Message::Send (anInfo, Message_Warning); +} + +// ======================================================================= +// function : init +// purpose : +// ======================================================================= +bool OcctJni_Viewer::init() +{ + EGLint aCfgId = 0; + int aWidth = 0, aHeight = 0; + EGLDisplay anEglDisplay = eglGetCurrentDisplay(); + EGLContext anEglContext = eglGetCurrentContext(); + EGLSurface anEglSurf = eglGetCurrentSurface (EGL_DRAW); + if (anEglDisplay == EGL_NO_DISPLAY + || anEglContext == EGL_NO_CONTEXT + || anEglSurf == EGL_NO_SURFACE) + { + Message::DefaultMessenger()->Send ("Error: No active EGL context!", Message_Fail); + release(); + return false; + } + + eglQuerySurface (anEglDisplay, anEglSurf, EGL_WIDTH, &aWidth); + eglQuerySurface (anEglDisplay, anEglSurf, EGL_HEIGHT, &aHeight); + eglQuerySurface (anEglDisplay, anEglSurf, EGL_CONFIG_ID, &aCfgId); + const EGLint aConfigAttribs[] = { EGL_CONFIG_ID, aCfgId, EGL_NONE }; + EGLint aNbConfigs = 0; + void* anEglConfig = NULL; + if (eglChooseConfig (anEglDisplay, aConfigAttribs, &anEglConfig, 1, &aNbConfigs) != EGL_TRUE) + { + Message::DefaultMessenger()->Send ("Error: EGL does not provide compatible configurations!", Message_Fail); + release(); + return false; + } + + if (!myViewer.IsNull()) + { + Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast (myViewer->Driver()); + Handle(Aspect_NeutralWindow) aWindow = Handle(Aspect_NeutralWindow)::DownCast (myView->Window()); + if (!aDriver->InitEglContext (anEglDisplay, anEglContext, anEglConfig)) + { + Message::DefaultMessenger()->Send ("Error: OpenGl_GraphicDriver can not be initialized!", Message_Fail); + release(); + return false; + } + + aWindow->SetSize (aWidth, aHeight); + myView->SetWindow (aWindow, (Aspect_RenderingContext )anEglContext); + dumpGlInfo (true); + return true; + } + + Handle(OpenGl_GraphicDriver) aDriver = new OpenGl_GraphicDriver (NULL, Standard_False); + aDriver->ChangeOptions().buffersNoSwap = Standard_True; +//aDriver->ChangeOptions().glslWarnings = Standard_True; /// for debug only! + if (!aDriver->InitEglContext (anEglDisplay, anEglContext, anEglConfig)) + { + Message::DefaultMessenger()->Send ("Error: OpenGl_GraphicDriver can not be initialized!", Message_Fail); + release(); + return false; + } + + myTextStyle = new Prs3d_TextAspect(); + myTextStyle->SetFont (Font_NOF_ASCII_MONO); + myTextStyle->SetHeight (12); + myTextStyle->Aspect()->SetColor (Quantity_NOC_GRAY95); + myTextStyle->Aspect()->SetColorSubTitle (Quantity_NOC_BLACK); + myTextStyle->Aspect()->SetDisplayType (Aspect_TODT_SHADOW); + myTextStyle->Aspect()->SetTextFontAspect (Font_FA_Bold); + myTextStyle->Aspect()->SetTextZoomable (false); + myTextStyle->SetHorizontalJustification (Graphic3d_HTA_LEFT); + myTextStyle->SetVerticalJustification (Graphic3d_VTA_BOTTOM); + + // create viewer + myViewer = new V3d_Viewer (aDriver); + myViewer->SetDefaultBackgroundColor (Quantity_NOC_BLACK); + myViewer->SetDefaultLights(); + myViewer->SetLightOn(); + + // create AIS context + myContext = new AIS_InteractiveContext (myViewer); + myContext->SetPixelTolerance (int(myDevicePixelRatio * 6.0)); // increase tolerance and adjust to hi-dpi screens + myContext->SetDisplayMode (AIS_Shaded, false); + + Handle(Aspect_NeutralWindow) aWindow = new Aspect_NeutralWindow(); + aWindow->SetSize (aWidth, aHeight); + myView = myViewer->CreateView(); + myView->SetImmediateUpdate (false); + myView->ChangeRenderingParams().Resolution = (unsigned int )(96.0 * myDevicePixelRatio + 0.5); + myView->ChangeRenderingParams().ToShowStats = true; + myView->ChangeRenderingParams().CollectedStats = (Graphic3d_RenderingParams::PerfCounters ) (Graphic3d_RenderingParams::PerfCounters_FrameRate | Graphic3d_RenderingParams::PerfCounters_Triangles); + myView->ChangeRenderingParams().StatsTextAspect = myTextStyle->Aspect(); + myView->ChangeRenderingParams().StatsTextHeight = (int )myTextStyle->Height(); + + myView->SetWindow (aWindow, (Aspect_RenderingContext )anEglContext); + dumpGlInfo (false); + //myView->TriedronDisplay (Aspect_TOTP_RIGHT_LOWER, Quantity_NOC_WHITE, 0.08 * myDevicePixelRatio, V3d_ZBUFFER); + + initContent(); + return true; +} + +// ======================================================================= +// function : release +// purpose : +// ======================================================================= +void OcctJni_Viewer::release() +{ + myContext.Nullify(); + myView.Nullify(); + myViewer.Nullify(); +} + +// ======================================================================= +// function : resize +// purpose : +// ======================================================================= +void OcctJni_Viewer::resize (int theWidth, + int theHeight) +{ + if (myContext.IsNull()) + { + Message::DefaultMessenger()->Send ("Resize failed - view is unavailable", Message_Fail); + return; + } + + Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast (myViewer->Driver()); + Handle(Aspect_NeutralWindow) aWindow = Handle(Aspect_NeutralWindow)::DownCast (myView->Window()); + aWindow->SetSize (theWidth, theHeight); + //myView->MustBeResized(); // can be used instead of SetWindow() when EGLsurface has not been changed + + EGLContext anEglContext = eglGetCurrentContext(); + myView->SetWindow (aWindow, (Aspect_RenderingContext )anEglContext); + dumpGlInfo (true); + //saveSnapshot ("/sdcard/Download/tt.png", theWidth, theHeight); +} + +// ======================================================================= +// function : initContent +// purpose : +// ======================================================================= +void OcctJni_Viewer::initContent() +{ + myContext->RemoveAll (Standard_False); + + if (myViewCube.IsNull()) + { + myViewCube = new AIS_ViewCube(); + { + // setup view cube size + static const double THE_CUBE_SIZE = 60.0; + myViewCube->SetSize (myDevicePixelRatio * THE_CUBE_SIZE, false); + myViewCube->SetBoxFacetExtension (myViewCube->Size() * 0.15); + myViewCube->SetAxesPadding (myViewCube->Size() * 0.10); + myViewCube->SetFontHeight (THE_CUBE_SIZE * 0.16); + } + // presentation parameters + myViewCube->SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_TriedronPers, Aspect_TOTP_RIGHT_LOWER, Graphic3d_Vec2i (200, 200))); + myViewCube->Attributes()->SetDatumAspect (new Prs3d_DatumAspect()); + myViewCube->Attributes()->DatumAspect()->SetTextAspect (myTextStyle); + // animation parameters + myViewCube->SetViewAnimation (myViewAnimation); + myViewCube->SetFixedAnimationLoop (false); + myViewCube->SetAutoStartAnimation (true); + } + myContext->Display (myViewCube, false); + + OSD_Timer aTimer; + aTimer.Start(); + if (!myShape.IsNull()) + { + Handle(AIS_Shape) aShapePrs = new AIS_Shape (myShape); + myContext->Display (aShapePrs, Standard_False); + } + else + { + BRepPrimAPI_MakeBox aBuilder (1.0, 2.0, 3.0); + Handle(AIS_Shape) aShapePrs = new AIS_Shape (aBuilder.Shape()); + myContext->Display (aShapePrs, Standard_False); + } + myView->FitAll(); + + aTimer.Stop(); + Message::DefaultMessenger()->Send (TCollection_AsciiString() + "Presentation computed in " + aTimer.ElapsedTime() + " seconds", Message_Info); +} + +//! Load shape from IGES file +static TopoDS_Shape loadIGES (const TCollection_AsciiString& thePath) +{ + TopoDS_Shape aShape; + IGESControl_Reader aReader; + IFSelect_ReturnStatus aReadStatus = IFSelect_RetFail; + try + { + aReadStatus = aReader.ReadFile (thePath.ToCString()); + } + catch (Standard_Failure) + { + Message::DefaultMessenger()->Send ("Error: IGES reader, computation error", Message_Fail); + return aShape; + } + + if (aReadStatus != IFSelect_RetDone) + { + Message::DefaultMessenger()->Send ("Error: IGES reader, bad file format", Message_Fail); + return aShape; + } + + // now perform the translation + aReader.TransferRoots(); + if (aReader.NbShapes() <= 0) + { + Handle(XSControl_WorkSession) aWorkSession = new XSControl_WorkSession(); + aWorkSession->SelectNorm ("IGES"); + aReader.SetWS (aWorkSession, Standard_True); + aReader.SetReadVisible (Standard_False); + aReader.TransferRoots(); + } + if (aReader.NbShapes() <= 0) + { + Message::DefaultMessenger()->Send ("Error: IGES reader, no shapes has been found", Message_Fail); + return aShape; + } + return aReader.OneShape(); + /*TopoDS_Shape anImportedShape = aReader.OneShape(); + + // apply sewing on the imported shape + BRepBuilderAPI_Sewing aTool (0.0); + aTool.SetNonManifoldMode (Standard_False); + aTool.SetFloatingEdgesMode(Standard_True); + aTool.Load (anImportedShape); + aTool.Perform(); + TopoDS_Shape aSewedShape = aTool.SewedShape(); + + if (aSewedShape.IsNull()) + { + Message::DefaultMessenger()->Send ("Error: Sewing result is empty", Message_Fail); + return aShape; + } + if (aSewedShape.IsSame(anImportedShape)) + { + aShape = anImportedShape; + } + else + { + // apply shape healing + ShapeFix_Shape aShapeFixer(aSewedShape); + aShapeFixer.FixSolidMode() = 1; + aShapeFixer.FixFreeShellMode() = 1; + aShapeFixer.FixFreeFaceMode() = 1; + aShapeFixer.FixFreeWireMode() = 0; + aShapeFixer.FixSameParameterMode() = 0; + aShapeFixer.FixVertexPositionMode() = 0; + aShape = aShapeFixer.Perform() ? aShapeFixer.Shape() : aSewedShape; + } + return aShape;*/ +} + +//! Load shape from STEP file +static TopoDS_Shape loadSTEP (const TCollection_AsciiString& thePath) +{ + STEPControl_Reader aReader; + IFSelect_ReturnStatus aReadStatus = IFSelect_RetFail; + try + { + aReadStatus = aReader.ReadFile (thePath.ToCString()); + } + catch (Standard_Failure) + { + Message::DefaultMessenger()->Send ("Error: STEP reader, computation error", Message_Fail); + return TopoDS_Shape(); + } + + if (aReadStatus != IFSelect_RetDone) + { + Message::DefaultMessenger()->Send ("Error: STEP reader, bad file format", Message_Fail); + return TopoDS_Shape(); + } + else if (aReader.NbRootsForTransfer() <= 0) + { + Message::DefaultMessenger()->Send ("Error: STEP reader, shape is empty", Message_Fail); + return TopoDS_Shape(); + } + + // now perform the translation + aReader.TransferRoots(); + return aReader.OneShape(); +} + +// ======================================================================= +// function : open +// purpose : +// ======================================================================= +bool OcctJni_Viewer::open (const TCollection_AsciiString& thePath) +{ + myShape.Nullify(); + if (!myContext.IsNull()) + { + myContext->RemoveAll (Standard_False); + if (!myViewCube.IsNull()) + { + myContext->Display (myViewCube, false); + } + } + if (thePath.IsEmpty()) + { + return false; + } + + OSD_Timer aTimer; + aTimer.Start(); + TCollection_AsciiString aFormatStr; + const Standard_Integer aLen = thePath.Length(); + if (aLen >= 5 + && thePath.Value (aLen - 4) == '.') + { + aFormatStr = thePath.SubString (aLen - 3, aLen); + } + else if (aLen >= 4 + && thePath.Value (aLen - 3) == '.') + { + aFormatStr = thePath.SubString (aLen - 2, aLen); + } + else if (aLen >= 3 + && thePath.Value (aLen - 2) == '.') + { + aFormatStr = thePath.SubString (aLen - 1, aLen); + } + aFormatStr.LowerCase(); + + TopoDS_Shape aShape; + if (aFormatStr == "stp" + || aFormatStr == "step") + { + aShape = loadSTEP (thePath); + } + else if (aFormatStr == "igs" + || aFormatStr == "iges") + { + aShape = loadIGES (thePath); + } + else + // if (aFormatStr == "brep" + // || aFormatStr == "rle") + { + BRep_Builder aBuilder; + if (!BRepTools::Read (aShape, thePath.ToCString(), aBuilder)) + { + Message::DefaultMessenger()->Send (TCollection_AsciiString() + "Error: file '" + thePath + "' can not be opened!", Message_Info); + return false; + } + } + if (aShape.IsNull()) + { + return false; + } + aTimer.Stop(); + Message::DefaultMessenger()->Send (TCollection_AsciiString() + "File '" + thePath + "' loaded in " + aTimer.ElapsedTime() + " seconds", Message_Info); + + myShape = aShape; + if (myContext.IsNull()) + { + return true; + } + + aTimer.Reset(); + aTimer.Start(); + + Handle(AIS_Shape) aShapePrs = new AIS_Shape (aShape); + myContext->Display (aShapePrs, Standard_False); + myView->FitAll(); + + aTimer.Stop(); + Message::DefaultMessenger()->Send (TCollection_AsciiString() + "Presentation computed in " + aTimer.ElapsedTime() + " seconds", Message_Info); + return true; +} + +// ======================================================================= +// function : saveSnapshot +// purpose : +// ======================================================================= +bool OcctJni_Viewer::saveSnapshot (const TCollection_AsciiString& thePath, + int theWidth, + int theHeight) +{ + if (myContext.IsNull() + || thePath.IsEmpty()) + { + Message::DefaultMessenger()->Send ("Image dump failed - view is unavailable", Message_Fail); + return false; + } + + if (theWidth < 1 + || theHeight < 1) + { + myView->Window()->Size (theWidth, theHeight); + } + if (theWidth < 1 + || theHeight < 1) + { + Message::DefaultMessenger()->Send ("Image dump failed - view is unavailable", Message_Fail); + return false; + } + + Image_AlienPixMap anAlienImage; + if (!anAlienImage.InitTrash (Image_PixMap::ImgBGRA, theWidth, theHeight)) + { + Message::DefaultMessenger()->Send (TCollection_AsciiString() + "RGBA image " + theWidth + "x" + theHeight + " allocation failed", Message_Fail); + return false; + } + + // OpenGL ES does not support fetching data in BGRA format + // while FreeImage does not support RGBA format. + Image_PixMap anImage; + anImage.InitWrapper (Image_PixMap::ImgRGBA, + anAlienImage.ChangeData(), + anAlienImage.SizeX(), + anAlienImage.SizeY(), + anAlienImage.SizeRowBytes()); + if (!myView->ToPixMap (anImage, theWidth, theHeight, Graphic3d_BT_RGBA)) + { + Message::DefaultMessenger()->Send (TCollection_AsciiString() + "View dump to the image " + theWidth + "x" + theHeight + " failed", Message_Fail); + } + + for (Standard_Size aRow = 0; aRow < anAlienImage.SizeY(); ++aRow) + { + for (Standard_Size aCol = 0; aCol < anAlienImage.SizeX(); ++aCol) + { + Image_ColorRGBA& aPixel = anAlienImage.ChangeValue (aRow, aCol); + std::swap (aPixel.r(), aPixel.b()); + //aPixel.a() = 1.0; + } + } + + if (!anAlienImage.Save (thePath)) + { + Message::DefaultMessenger()->Send (TCollection_AsciiString() + "Image saving to path '" + thePath + "' failed", Message_Fail); + return false; + } + Message::DefaultMessenger()->Send (TCollection_AsciiString() + "View " + theWidth + "x" + theHeight + " dumped to image '" + thePath + "'", Message_Info); + return true; +} + +// ================================================================ +// Function : handleViewRedraw +// Purpose : +// ================================================================ +void OcctJni_Viewer::handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) +{ + AIS_ViewController::handleViewRedraw (theCtx, theView); + myIsJniMoreFrames = myToAskNextFrame; +} + +// ======================================================================= +// function : redraw +// purpose : +// ======================================================================= +bool OcctJni_Viewer::redraw() +{ + if (myView.IsNull()) + { + return false; + } + + // handle user input + myIsJniMoreFrames = false; + myView->InvalidateImmediate(); + FlushViewEvents (myContext, myView, true); + return myIsJniMoreFrames; +} + +// ======================================================================= +// function : fitAll +// purpose : +// ======================================================================= +void OcctJni_Viewer::fitAll() +{ + if (myView.IsNull()) + { + return; + } + + myView->FitAll (0.01, Standard_False); + myView->Invalidate(); +} + +#define jexp extern "C" JNIEXPORT + +jexp jlong JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppCreate (JNIEnv* theEnv, + jobject theObj, + jfloat theDispDensity) +{ + return jlong(new OcctJni_Viewer (theDispDensity)); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppDestroy (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + delete (OcctJni_Viewer* )theCppPtr; + + Handle(Message_Messenger) aMsgMgr = Message::DefaultMessenger(); + aMsgMgr->RemovePrinters (STANDARD_TYPE (OcctJni_MsgPrinter)); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppRelease (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + ((OcctJni_Viewer* )theCppPtr)->release(); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppInit (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + Handle(Message_Messenger) aMsgMgr = Message::DefaultMessenger(); + aMsgMgr->RemovePrinters (STANDARD_TYPE (OcctJni_MsgPrinter)); + aMsgMgr->AddPrinter (new OcctJni_MsgPrinter (theEnv, theObj)); + ((OcctJni_Viewer* )theCppPtr)->init(); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppResize (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr, + jint theWidth, + jint theHeight) +{ + ((OcctJni_Viewer* )theCppPtr)->resize (theWidth, theHeight); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppOpen (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr, + jstring thePath) +{ + const char* aPathPtr = theEnv->GetStringUTFChars (thePath, 0); + const TCollection_AsciiString aPath (aPathPtr); + theEnv->ReleaseStringUTFChars (thePath, aPathPtr); + ((OcctJni_Viewer* )theCppPtr)->open (aPath); +} + +jexp jboolean JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppRedraw (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + return ((OcctJni_Viewer* )theCppPtr)->redraw() ? JNI_TRUE : JNI_FALSE; +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetAxoProj (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_XposYnegZpos); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetXposProj (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Xpos); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetYposProj (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Ypos); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetZposProj (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Zpos); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetXnegProj (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Xneg); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetYnegProj (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Yneg); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetZnegProj (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Zneg); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppFitAll (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr) +{ + ((OcctJni_Viewer* )theCppPtr)->fitAll(); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppAddTouchPoint (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr, + jint theId, + jfloat theX, + jfloat theY) +{ + ((OcctJni_Viewer* )theCppPtr)->AddTouchPoint (theId, Graphic3d_Vec2d (theX, theY)); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppUpdateTouchPoint (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr, + jint theId, + jfloat theX, + jfloat theY) +{ + ((OcctJni_Viewer* )theCppPtr)->UpdateTouchPoint (theId, Graphic3d_Vec2d (theX, theY)); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppRemoveTouchPoint (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr, + jint theId) +{ + ((OcctJni_Viewer* )theCppPtr)->RemoveTouchPoint (theId); +} + +jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSelectInViewer (JNIEnv* theEnv, + jobject theObj, + jlong theCppPtr, + jfloat theX, + jfloat theY) +{ + ((OcctJni_Viewer* )theCppPtr)->SelectInViewer (Graphic3d_Vec2i ((int )theX, (int )theY)); +} + +jexp jlong JNICALL Java_com_opencascade_jnisample_OcctJniActivity_cppOcctMajorVersion (JNIEnv* theEnv, + jobject theObj) +{ + return OCC_VERSION_MAJOR; +} + +jexp jlong JNICALL Java_com_opencascade_jnisample_OcctJniActivity_cppOcctMinorVersion (JNIEnv* theEnv, + jobject theObj) +{ + return OCC_VERSION_MINOR; +} + +jexp jlong JNICALL Java_com_opencascade_jnisample_OcctJniActivity_cppOcctMicroVersion (JNIEnv* theEnv, + jobject theObj) +{ + return OCC_VERSION_MAINTENANCE; +} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_Viewer.hxx opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_Viewer.hxx --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_Viewer.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/jni/OcctJni_Viewer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,91 @@ +// Copyright (c) 2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include +#include +#include + +class AIS_ViewCube; + +//! Main C++ back-end for activity. +class OcctJni_Viewer : public AIS_ViewController +{ + +public: + + //! Empty constructor + OcctJni_Viewer (float theDispDensity); + + //! Initialize the viewer + bool init(); + + //! Release the viewer + void release(); + + //! Resize the viewer + void resize (int theWidth, + int theHeight); + + //! Open CAD file + bool open (const TCollection_AsciiString& thePath); + + //! Take snapshot + bool saveSnapshot (const TCollection_AsciiString& thePath, + int theWidth = 0, + int theHeight = 0); + + //! Viewer update. + //! Returns TRUE if more frames should be requested. + bool redraw(); + + //! Move camera + void setProj (V3d_TypeOfOrientation theProj) + { + if (myView.IsNull()) + { + return; + } + + myView->SetProj (theProj); + myView->Invalidate(); + } + + //! Fit All. + void fitAll(); + +protected: + + //! Reset viewer content. + void initContent(); + + //! Print information about OpenGL ES context. + void dumpGlInfo (bool theIsBasic); + + //! Handle redraw. + virtual void handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) override; + +protected: + + Handle(V3d_Viewer) myViewer; + Handle(V3d_View) myView; + Handle(AIS_InteractiveContext) myContext; + Handle(Prs3d_TextAspect) myTextStyle; //!< text style for OSD elements + Handle(AIS_ViewCube) myViewCube; //!< view cube object + TopoDS_Shape myShape; + float myDevicePixelRatio; //!< device pixel ratio for handling high DPI displays + bool myIsJniMoreFrames; //!< need more frame flag + +}; Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/close_l.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/close_l.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/close_p.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/close_p.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/fit.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/fit.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/ic_launcher.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/ic_launcher.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/info_image.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/info_image.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/info.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/info.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/message.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/message.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/open_l.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/open_l.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/open.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/open.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/open_p.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/open_p.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_back.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_back.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_bottom.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_bottom.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_front.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_front.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_left.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_left.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_right.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_right.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_top.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_top.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/view.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-hdpi/view.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-mdpi/ic_launcher.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-mdpi/ic_launcher.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-xhdpi/ic_launcher.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-xhdpi/ic_launcher.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-xxhdpi/ic_launcher.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/drawable-xxhdpi/ic_launcher.png differ diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/layout/activity_main.xml opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/layout/activity_main.xml --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/layout/activity_main.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/layout/activity_main.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/values/id.xml opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/values/id.xml --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/values/id.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/values/id.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/values/strings.xml opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/values/strings.xml --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/app/src/main/res/values/strings.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/app/src/main/res/values/strings.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,35 @@ + + + OpenCASCADE JNI Java Sample + #484848 + #0099CC + #66252525 + + .png + .jpg + + + .brep + .rle + .iges + .igs + .step + .stp + + wireframe/shading + color + material + transparency + show/hide hidden lines + + OpenCASCADE JNI Java Sample

+

Simple viewer for BREP, STEP and IGES files.

+

Driven by Open CASCADE Technology %d.%d.%d.

+

Copyright 2014 OPEN CASCADE SAS.

+

+

http://www.opencascade.com

+

http://www.opencascade.org

+ ]]> +
+
diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/build.gradle opencascade-7.5.1+dfsg1/samples/java/jniviewer/build.gradle --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/build.gradle 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/build.gradle 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,17 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + jcenter() + google() + } + dependencies { + classpath 'com.android.tools.build:gradle:4.0.0' + } +} + +allprojects { + repositories { + jcenter() + google() + } +} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/.classpath opencascade-7.5.1+dfsg1/samples/java/jniviewer/.classpath --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/.classpath 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/.classpath 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - diff -Nru "/tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/.externalToolBuilders/C++ Builder.launch" "/tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/.externalToolBuilders/C++ Builder.launch" --- "/tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/.externalToolBuilders/C++ Builder.launch" 2020-04-01 13:52:54.000000000 +0000 +++ "/tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/.externalToolBuilders/C++ Builder.launch" 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/.gitattributes opencascade-7.5.1+dfsg1/samples/java/jniviewer/.gitattributes --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/.gitattributes 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/.gitattributes 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1 @@ +*.gradle eol=lf diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/.gitignore opencascade-7.5.1+dfsg1/samples/java/jniviewer/.gitignore --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/.gitignore 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/.gitignore 2021-02-02 08:51:56.000000000 +0000 @@ -1,4 +1,10 @@ -/assets -/bin -/gen -/libs +/.gradle +/.idea +/build +/gradle +gradlew +gradlew.bat +/app/.cxx +/app/build +gradle.properties +local.properties diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/gradle.properties.template opencascade-7.5.1+dfsg1/samples/java/jniviewer/gradle.properties.template --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/gradle.properties.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/gradle.properties.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,5 @@ +# customized paths +OCCT_ROOT=c\:/android/occt-dev-android +FREETYPE_ROOT=c\:/android/freetype-2.7.1-android +# in case if OCCT was built with FreeImage +#FREEIMAGE_ROOT=c\:/android/freeimage-3.17-android diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/Android.mk opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/Android.mk --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/Android.mk 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/Android.mk 1970-01-01 00:00:00.000000000 +0000 @@ -1,205 +0,0 @@ -LOCAL_PATH:= $(call my-dir) - -STL_INC := $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/include $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(TARGET_ARCH_ABI)/include -#STL_LIB := $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(TARGET_ARCH_ABI)/libgnustl_static.a -STL_LIB := $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(TARGET_ARCH_ABI)/libgnustl_shared.so - -OCCT_ROOT := $(LOCAL_PATH)/../../../.. - -FREETYPE_INC := $(OCCT_ROOT)/../freetype/include/freetype2 -FREETYPE_LIBS := $(OCCT_ROOT)/../freetype/libs - -FREEIMAGE_INC := $(OCCT_ROOT)/../FreeImage/include -FREEIMAGE_LIBS := $(OCCT_ROOT)/../FreeImage/libs - -OCCT_INC := $(OCCT_ROOT)/inc -OCCT_LIBS := $(OCCT_ROOT)/and/libs - -ASSETDIR := $(LOCAL_PATH)/../assets - -$(ASSETDIR)/Shaders: $(ASSETDIR) - -mkdir -p $(ASSETDIR) - -mkdir -p $(ASSETDIR)/Shaders - cp -f -r $(OCCT_ROOT)/src/Shaders/*.* $(ASSETDIR)/Shaders - -$(ASSETDIR)/SHMessage: $(ASSETDIR) - -mkdir -p $(ASSETDIR) - -mkdir -p $(ASSETDIR)/SHMessage - cp -f -r $(OCCT_ROOT)/src/SHMessage/*.* $(ASSETDIR)/SHMessage - -$(ASSETDIR)/XSMessage: $(ASSETDIR) - -mkdir -p $(ASSETDIR) - -mkdir -p $(ASSETDIR)/XSMessage - cp -f -r $(OCCT_ROOT)/src/XSMessage/*.* $(ASSETDIR)/XSMessage - -pre_all: $(ASSETDIR)/Shaders $(ASSETDIR)/SHMessage $(ASSETDIR)/XSMessage - -jniall: pre_all all - -# STL libs -include $(CLEAR_VARS) -LOCAL_MODULE := SharedStl -LOCAL_EXPORT_C_INCLUDES := $(STL_INC) -LOCAL_SRC_FILES := $(STL_LIB) -include $(PREBUILT_SHARED_LIBRARY) - -# 3rd-parties used in OCCT -include $(CLEAR_VARS) -LOCAL_MODULE := FreeType -LOCAL_EXPORT_C_INCLUDES := $(FREETYPE_INC) -LOCAL_SRC_FILES := $(FREETYPE_LIBS)/$(TARGET_ARCH_ABI)/libfreetype.so -include $(PREBUILT_SHARED_LIBRARY) - -#include $(CLEAR_VARS) -#LOCAL_MODULE := FreeImage -#LOCAL_EXPORT_C_INCLUDES := $(FREEIMAGE_INC) -#LOCAL_SRC_FILES := $(FREEIMAGE_LIBS)/$(TARGET_ARCH_ABI)/libfreeimage.so -#include $(PREBUILT_SHARED_LIBRARY) - -# OCCT core -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKernel -LOCAL_EXPORT_C_INCLUDES := $(OCCT_INC) -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKernel.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKMath -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKMath.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKG2d -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKG2d.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKG3d -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKG3d.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKGeomBase -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKGeomBase.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKBRep -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKBRep.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKGeomAlgo -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKGeomAlgo.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKTopAlgo -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKTopAlgo.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKShHealing -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKShHealing.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKMesh -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKMesh.so -include $(PREBUILT_SHARED_LIBRARY) - -# OCCT Exchange -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKPrim -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKPrim.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKBO -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKBO.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKBool -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKBool.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKFillet -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKFillet.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKOffset -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKOffset.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKXSBase -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKXSBase.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKIGES -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKIGES.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKSTEPBase -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKSTEPBase.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKSTEPAttr -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKSTEPAttr.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKSTEP209 -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKSTEP209.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKSTEP -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKSTEP.so -include $(PREBUILT_SHARED_LIBRARY) - -# OCCT visualization -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKService -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKService.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKHLR -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKHLR.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKV3d -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKV3d.so -include $(PREBUILT_SHARED_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OcctTKOpenGl -LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKOpenGl.so -include $(PREBUILT_SHARED_LIBRARY) - -# our sample -include $(CLEAR_VARS) -LOCAL_MODULE := libTKJniSample -LOCAL_C_INCLUDES := $(STL_INC) -#LOCAL_STATIC_LIBRARIES := $(STL_LIB) does not work -LOCAL_CFLAGS := -Wall -std=c++11 -LOCAL_CPP_EXTENSION := .cxx .cpp -LOCAL_CPP_FEATURES := rtti exceptions -LOCAL_SRC_FILES := OcctJni_Viewer.cxx OcctJni_Window.cxx OcctJni_MsgPrinter.cxx -LOCAL_SHARED_LIBRARIES := OcctTKernel OcctTKMath OcctTKG2d OcctTKG3d OcctTKGeomBase OcctTKBRep OcctTKGeomAlgo OcctTKTopAlgo OcctTKShHealing OcctTKMesh OcctTKPrim -LOCAL_SHARED_LIBRARIES += OcctTKIGES OcctTKSTEP OcctTKXSBase -LOCAL_SHARED_LIBRARIES += OcctTKService OcctTKHLR OcctTKV3d OcctTKOpenGl -LOCAL_SHARED_LIBRARIES += SharedStl -LOCAL_LDLIBS := -llog -lGLESv2 -lEGL - -#LOCAL_LDLIBS += $(STL_LIB) - -include $(BUILD_SHARED_LIBRARY) diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/Application.mk opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/Application.mk --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/Application.mk 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/Application.mk 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -NDK_TOOLCHAIN_VERSION := 4.8 -APP_PLATFORM := android-15 - -APP_ABI := armeabi-v7a -#APP_ABI := all - -#APP_STL := gnustl_static -#APP_STL := stlport_static diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_MsgPrinter.cxx opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_MsgPrinter.cxx --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_MsgPrinter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_MsgPrinter.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include - -#include - -IMPLEMENT_STANDARD_RTTIEXT(OcctJni_MsgPrinter, Message_Printer) - -// ======================================================================= -// function : OcctJni_MsgPrinter -// purpose : -// ======================================================================= -OcctJni_MsgPrinter::OcctJni_MsgPrinter (JNIEnv* theJEnv, - jobject theJObj) -: myJEnv (theJEnv), - myJObj (theJEnv->NewGlobalRef (theJObj)), - myJMet (NULL) -{ - jclass aJClass = theJEnv->GetObjectClass (theJObj); - myJMet = theJEnv->GetMethodID (aJClass, "postMessage", "(Ljava/lang/String;)V"); - if (myJMet == NULL) - { - __android_log_write (ANDROID_LOG_FATAL, "jniSample", "Broken initialization of OcctJni_MsgPrinter!"); - } -} - -// ======================================================================= -// function : ~OcctJni_MsgPrinter -// purpose : -// ======================================================================= -OcctJni_MsgPrinter::~OcctJni_MsgPrinter() -{ - //myJEnv->DeleteGlobalRef (myJObj); -} - -// ======================================================================= -// function : Send -// purpose : -// ======================================================================= -void OcctJni_MsgPrinter::Send (const TCollection_ExtendedString& theString, - const Message_Gravity theGravity, - const Standard_Boolean theToPutEndl) const -{ - if (theGravity >= myTraceLevel) - { - const TCollection_AsciiString aStr (theString); - OcctJni_MsgPrinter::Send (aStr, theGravity, theToPutEndl); - } -} - -// ======================================================================= -// function : Send -// purpose : -// ======================================================================= -void OcctJni_MsgPrinter::Send (const TCollection_AsciiString& theString, - const Message_Gravity theGravity, - const Standard_Boolean theToPutEndl) const -{ - if (theGravity < myTraceLevel) - { - return; - } - - ///__android_log_write (ANDROID_LOG_DEBUG, "OcctJni_MsgPrinter", (TCollection_AsciiString(" @@ ") + theString).ToCString()); - if (myJMet == NULL) - { - return; - } - - jstring aJStr = myJEnv->NewStringUTF ((theString + "\n").ToCString()); - myJEnv->CallObjectMethod (myJObj, myJMet, aJStr); - myJEnv->DeleteLocalRef (aJStr); -} - -// ======================================================================= -// function : Send -// purpose : -// ======================================================================= -void OcctJni_MsgPrinter::Send (const Standard_CString& theString, - const Message_Gravity theGravity, - const Standard_Boolean theToPutEndl) const -{ - if (theGravity >= myTraceLevel) - { - OcctJni_MsgPrinter::Send (TCollection_AsciiString (theString), theGravity, theToPutEndl); - } -} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_MsgPrinter.hxx opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_MsgPrinter.hxx --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_MsgPrinter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_MsgPrinter.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef OcctJni_MsgPrinter_H -#define OcctJni_MsgPrinter_H - -#include - -#include - -// Class providing connection between messenger interfaces in C++ and Java layers. -class OcctJni_MsgPrinter : public Message_Printer -{ -public: - - //! Default constructor - OcctJni_MsgPrinter (JNIEnv* theJEnv, - jobject theJObj); - - //! Destructor. - ~OcctJni_MsgPrinter(); - - //! Redirection to TCollection_AsciiString method - virtual void Send (const TCollection_ExtendedString& theString, - const Message_Gravity theGravity, - const Standard_Boolean theToPutEndl) const; - - //! Redirection to TCollection_AsciiString method - virtual void Send (const Standard_CString& theString, - const Message_Gravity theGravity, - const Standard_Boolean theToPutEndl) const; - - //! Main printing method - virtual void Send (const TCollection_AsciiString& theString, - const Message_Gravity theGravity, - const Standard_Boolean theToPutEndl) const; - -private: - - JNIEnv* myJEnv; - jobject myJObj; - jmethodID myJMet; - -public: - - DEFINE_STANDARD_RTTIEXT(OcctJni_MsgPrinter,Message_Printer) - -}; - -DEFINE_STANDARD_HANDLE(OcctJni_MsgPrinter, Message_Printer) - -#endif // OcctJni_MsgPrinter_H diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Viewer.cxx opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Viewer.cxx --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Viewer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Viewer.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,809 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include - -#include -#include - -#include - -//! @return true if file exists -static bool isFileExist (const TCollection_AsciiString& thePath) -{ - struct stat64 aStatBuffer; - return stat64 (thePath.ToCString(), &aStatBuffer) == 0; -} - -//! Cut-off the last split character from the path and everything after it. -static TCollection_AsciiString getParentDir (const TCollection_AsciiString& thePath) -{ - TCollection_AsciiString aPath = thePath; - char* aSplitter = (char* )aPath.ToCString(); - for (char* anIter = aSplitter; *anIter != '\0'; ++anIter) - { - if (*anIter == '\\' - || *anIter == '/') - { - aSplitter = anIter; - } - } - *aSplitter = '\0'; // cut off file name or trailing folder - return TCollection_AsciiString (aPath.ToCString()); -} - -//! Set environment variable theVarName indicating location of resource -//! file theFile so as to correspond to actual location of this file. -//! -//! The resource file is searched in directory where Test.Draw.dll is located, -//! and if not found - also in subdirectory ../res from there. -//! If file is found, environment variable is set for C subsystem. -//! Otherwise, environment is not changed. -//! -//! If theToAddFileName is true, complete file name is set as value of the variable, -//! if theToAddFileName is false, only path is set. -Standard_Boolean setResourceEnv (const TCollection_AsciiString& theVarName, - const TCollection_AsciiString& theRoot, - const TCollection_AsciiString& theFile, - const Standard_Boolean theToAddFileName) -{ - // use location of current assembly to figure out possible location of resource - TCollection_AsciiString aBaseDir = theRoot; - - // check the same directory where binary is located - if (!isFileExist (aBaseDir + "/" + theFile)) - { - // check subdirectory ../res - aBaseDir = getParentDir (aBaseDir) + "/res"; - if (!isFileExist (aBaseDir + "/" + theFile)) - { - return Standard_False; - } - } - - // set C library environment - if (theToAddFileName) - { - aBaseDir = aBaseDir + "/" + theFile; - } - - OSD_Environment anEnv (theVarName, aBaseDir); - anEnv.Build(); - return Standard_True; -} - -// ======================================================================= -// function : OcctJni_Viewer -// purpose : -// ======================================================================= -OcctJni_Viewer::OcctJni_Viewer() -{ - // prepare necessary environment - TCollection_AsciiString aResRoot = "/data/data/com.opencascade.jnisample/files"; - - setResourceEnv ("CSF_ShadersDirectory", aResRoot + "/Shaders", "Declarations.glsl", Standard_False); - setResourceEnv ("CSF_XSMessage", aResRoot + "/XSMessage", "XSTEP.us", Standard_False); - setResourceEnv ("CSF_SHMessage", aResRoot + "/XSMessage", "SHAPE.us", Standard_False); - //setResourceEnv ("CSF_PluginDefaults", "Plugin", Standard_False); - - // make sure OCCT loads the dictionary - //UnitsAPI::SetLocalSystem (UnitsAPI_SI); -} - -// ======================================================================= -// function : init -// purpose : -// ======================================================================= -bool OcctJni_Viewer::init() -{ - EGLint aCfgId = 0; - int aWidth = 0, aHeight = 0; - EGLDisplay anEglDisplay = eglGetCurrentDisplay(); - EGLContext anEglContext = eglGetCurrentContext(); - EGLSurface anEglSurf = eglGetCurrentSurface (EGL_DRAW); - if (anEglDisplay == EGL_NO_DISPLAY - || anEglContext == EGL_NO_CONTEXT - || anEglSurf == EGL_NO_SURFACE) - { - Message::DefaultMessenger()->Send ("Error: No active EGL context!", Message_Fail); - release(); - return false; - } - - eglQuerySurface (anEglDisplay, anEglSurf, EGL_WIDTH, &aWidth); - eglQuerySurface (anEglDisplay, anEglSurf, EGL_HEIGHT, &aHeight); - eglQuerySurface (anEglDisplay, anEglSurf, EGL_CONFIG_ID, &aCfgId); - const EGLint aConfigAttribs[] = { EGL_CONFIG_ID, aCfgId, EGL_NONE }; - EGLint aNbConfigs = 0; - void* anEglConfig = NULL; - if (eglChooseConfig (anEglDisplay, aConfigAttribs, &anEglConfig, 1, &aNbConfigs) != EGL_TRUE) - { - Message::DefaultMessenger()->Send ("Error: EGL does not provide compatible configurations!", Message_Fail); - release(); - return false; - } - - TCollection_AsciiString anEglInfo = TCollection_AsciiString() - + "\n EGLVersion: " + eglQueryString (anEglDisplay, EGL_VERSION) - + "\n EGLVendor: " + eglQueryString (anEglDisplay, EGL_VENDOR) - + "\n EGLClient APIs: " + eglQueryString (anEglDisplay, EGL_CLIENT_APIS) - + "\n GLvendor: " + (const char* )glGetString (GL_VENDOR) - + "\n GLdevice: " + (const char* )glGetString (GL_RENDERER) - + "\n GLversion: " + (const char* )glGetString (GL_VERSION) + " [GLSL: " + (const char* )glGetString (GL_SHADING_LANGUAGE_VERSION) + "]"; - ::Message::DefaultMessenger()->Send (anEglInfo, Message_Info); - - if (!myViewer.IsNull()) - { - Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast (myViewer->Driver()); - Handle(OcctJni_Window) aWindow = Handle(OcctJni_Window)::DownCast (myView->Window()); - if (!aDriver->InitEglContext (anEglDisplay, anEglContext, anEglConfig)) - { - Message::DefaultMessenger()->Send ("Error: OpenGl_GraphicDriver can not be initialized!", Message_Fail); - release(); - return false; - } - - aWindow->SetSize (aWidth, aHeight); - myView->SetWindow (aWindow, (Aspect_RenderingContext )anEglContext); - return true; - } - - Handle(OpenGl_GraphicDriver) aDriver = new OpenGl_GraphicDriver (NULL, Standard_False); - aDriver->ChangeOptions().buffersNoSwap = Standard_True; -//aDriver->ChangeOptions().glslWarnings = Standard_True; /// for debug only! - if (!aDriver->InitEglContext (anEglDisplay, anEglContext, anEglConfig)) - { - Message::DefaultMessenger()->Send ("Error: OpenGl_GraphicDriver can not be initialized!", Message_Fail); - release(); - return false; - } - - // create viewer - myViewer = new V3d_Viewer (aDriver); - myViewer->SetDefaultBackgroundColor (Quantity_NOC_BLACK); - myViewer->SetDefaultLights(); - myViewer->SetLightOn(); - - // create AIS context - myContext = new AIS_InteractiveContext (myViewer); - //myContext->SetDisplayMode (AIS_WireFrame, false); - myContext->SetDisplayMode (AIS_Shaded, false); - - Handle(OcctJni_Window) aWindow = new OcctJni_Window (aWidth, aHeight); - myView = myViewer->CreateView(); - - myView->SetWindow (aWindow, (Aspect_RenderingContext )anEglContext); - myView->TriedronDisplay (Aspect_TOTP_RIGHT_LOWER, Quantity_NOC_WHITE, 0.08, V3d_ZBUFFER); - - initContent(); - return true; -} - -// ======================================================================= -// function : release -// purpose : -// ======================================================================= -void OcctJni_Viewer::release() -{ - myContext.Nullify(); - myView.Nullify(); - myViewer.Nullify(); -} - -// ======================================================================= -// function : resize -// purpose : -// ======================================================================= -void OcctJni_Viewer::resize (int theWidth, - int theHeight) -{ - if (myContext.IsNull()) - { - Message::DefaultMessenger()->Send ("Resize failed - view is unavailable", Message_Fail); - return; - } - - Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast (myViewer->Driver()); - Handle(OcctJni_Window) aWindow = Handle(OcctJni_Window)::DownCast (myView->Window()); - aWindow->SetSize (theWidth, theHeight); - //myView->MustBeResized(); // can be used instead of SetWindow() when EGLsurface has not been changed - - EGLContext anEglContext = eglGetCurrentContext(); - myView->SetImmediateUpdate (Standard_False); - myView->SetWindow (aWindow, (Aspect_RenderingContext )anEglContext); - //saveSnapshot ("/sdcard/Download/tt.png", theWidth, theHeight); -} - -// ======================================================================= -// function : initContent -// purpose : -// ======================================================================= -void OcctJni_Viewer::initContent() -{ - myContext->RemoveAll (Standard_False); - - OSD_Timer aTimer; - aTimer.Start(); - if (!myShape.IsNull()) - { - Handle(AIS_Shape) aShapePrs = new AIS_Shape (myShape); - myContext->Display (aShapePrs, Standard_False); - } - else - { - BRepPrimAPI_MakeBox aBuilder (1.0, 2.0, 3.0); - Handle(AIS_Shape) aShapePrs = new AIS_Shape (aBuilder.Shape()); - myContext->Display (aShapePrs, Standard_False); - } - myView->FitAll(); - - aTimer.Stop(); - Message::DefaultMessenger()->Send (TCollection_AsciiString() + "Presentation computed in " + aTimer.ElapsedTime() + " seconds", Message_Info); -} - -//! Load shape from IGES file -static TopoDS_Shape loadIGES (const TCollection_AsciiString& thePath) -{ - TopoDS_Shape aShape; - IGESControl_Reader aReader; - IFSelect_ReturnStatus aReadStatus = IFSelect_RetFail; - try - { - aReadStatus = aReader.ReadFile (thePath.ToCString()); - } - catch (Standard_Failure) - { - Message::DefaultMessenger()->Send ("Error: IGES reader, computation error", Message_Fail); - return aShape; - } - - if (aReadStatus != IFSelect_RetDone) - { - Message::DefaultMessenger()->Send ("Error: IGES reader, bad file format", Message_Fail); - return aShape; - } - - // now perform the translation - aReader.TransferRoots(); - if (aReader.NbShapes() <= 0) - { - Handle(XSControl_WorkSession) aWorkSession = new XSControl_WorkSession(); - aWorkSession->SelectNorm ("IGES"); - aReader.SetWS (aWorkSession, Standard_True); - aReader.SetReadVisible (Standard_False); - aReader.TransferRoots(); - } - if (aReader.NbShapes() <= 0) - { - Message::DefaultMessenger()->Send ("Error: IGES reader, no shapes has been found", Message_Fail); - return aShape; - } - return aReader.OneShape(); - /*TopoDS_Shape anImportedShape = aReader.OneShape(); - - // apply sewing on the imported shape - BRepBuilderAPI_Sewing aTool (0.0); - aTool.SetNonManifoldMode (Standard_False); - aTool.SetFloatingEdgesMode(Standard_True); - aTool.Load (anImportedShape); - aTool.Perform(); - TopoDS_Shape aSewedShape = aTool.SewedShape(); - - if (aSewedShape.IsNull()) - { - Message::DefaultMessenger()->Send ("Error: Sewing result is empty", Message_Fail); - return aShape; - } - if (aSewedShape.IsSame(anImportedShape)) - { - aShape = anImportedShape; - } - else - { - // apply shape healing - ShapeFix_Shape aShapeFixer(aSewedShape); - aShapeFixer.FixSolidMode() = 1; - aShapeFixer.FixFreeShellMode() = 1; - aShapeFixer.FixFreeFaceMode() = 1; - aShapeFixer.FixFreeWireMode() = 0; - aShapeFixer.FixSameParameterMode() = 0; - aShapeFixer.FixVertexPositionMode() = 0; - aShape = aShapeFixer.Perform() ? aShapeFixer.Shape() : aSewedShape; - } - return aShape;*/ -} - -//! Load shape from STEP file -static TopoDS_Shape loadSTEP (const TCollection_AsciiString& thePath) -{ - STEPControl_Reader aReader; - IFSelect_ReturnStatus aReadStatus = IFSelect_RetFail; - try - { - aReadStatus = aReader.ReadFile (thePath.ToCString()); - } - catch (Standard_Failure) - { - Message::DefaultMessenger()->Send ("Error: STEP reader, computation error", Message_Fail); - return TopoDS_Shape(); - } - - if (aReadStatus != IFSelect_RetDone) - { - Message::DefaultMessenger()->Send ("Error: STEP reader, bad file format", Message_Fail); - return TopoDS_Shape(); - } - else if (aReader.NbRootsForTransfer() <= 0) - { - Message::DefaultMessenger()->Send ("Error: STEP reader, shape is empty", Message_Fail); - return TopoDS_Shape(); - } - - // now perform the translation - aReader.TransferRoots(); - return aReader.OneShape(); -} - -// ======================================================================= -// function : open -// purpose : -// ======================================================================= -bool OcctJni_Viewer::open (const TCollection_AsciiString& thePath) -{ - myShape.Nullify(); - if (!myContext.IsNull()) - { - myContext->RemoveAll (Standard_False); - } - if (thePath.IsEmpty()) - { - return false; - } - - OSD_Timer aTimer; - aTimer.Start(); - TCollection_AsciiString aFormatStr; - const Standard_Integer aLen = thePath.Length(); - if (aLen >= 5 - && thePath.Value (aLen - 4) == '.') - { - aFormatStr = thePath.SubString (aLen - 3, aLen); - } - else if (aLen >= 4 - && thePath.Value (aLen - 3) == '.') - { - aFormatStr = thePath.SubString (aLen - 2, aLen); - } - else if (aLen >= 3 - && thePath.Value (aLen - 2) == '.') - { - aFormatStr = thePath.SubString (aLen - 1, aLen); - } - aFormatStr.LowerCase(); - - TopoDS_Shape aShape; - if (aFormatStr == "stp" - || aFormatStr == "step") - { - aShape = loadSTEP (thePath); - } - else if (aFormatStr == "igs" - || aFormatStr == "iges") - { - aShape = loadIGES (thePath); - } - else - // if (aFormatStr == "brep" - // || aFormatStr == "rle") - { - BRep_Builder aBuilder; - if (!BRepTools::Read (aShape, thePath.ToCString(), aBuilder)) - { - Message::DefaultMessenger()->Send (TCollection_AsciiString() + "Error: file '" + thePath + "' can not be opened!", Message_Info); - return false; - } - } - if (aShape.IsNull()) - { - return false; - } - aTimer.Stop(); - Message::DefaultMessenger()->Send (TCollection_AsciiString() + "File '" + thePath + "' loaded in " + aTimer.ElapsedTime() + " seconds", Message_Info); - - myShape = aShape; - if (myContext.IsNull()) - { - return true; - } - - aTimer.Reset(); - aTimer.Start(); - - Handle(AIS_Shape) aShapePrs = new AIS_Shape (aShape); - myContext->Display (aShapePrs, Standard_False); - myView->FitAll(); - - aTimer.Stop(); - Message::DefaultMessenger()->Send (TCollection_AsciiString() + "Presentation computed in " + aTimer.ElapsedTime() + " seconds", Message_Info); - return true; -} - -// ======================================================================= -// function : saveSnapshot -// purpose : -// ======================================================================= -bool OcctJni_Viewer::saveSnapshot (const TCollection_AsciiString& thePath, - int theWidth, - int theHeight) -{ - if (myContext.IsNull() - || thePath.IsEmpty()) - { - Message::DefaultMessenger()->Send ("Image dump failed - view is unavailable", Message_Fail); - return false; - } - - if (theWidth < 1 - || theHeight < 1) - { - myView->Window()->Size (theWidth, theHeight); - } - if (theWidth < 1 - || theHeight < 1) - { - Message::DefaultMessenger()->Send ("Image dump failed - view is unavailable", Message_Fail); - return false; - } - - Image_AlienPixMap anAlienImage; - if (!anAlienImage.InitTrash (Image_PixMap::ImgBGRA, theWidth, theHeight)) - { - Message::DefaultMessenger()->Send (TCollection_AsciiString() + "RGBA image " + theWidth + "x" + theHeight + " allocation failed", Message_Fail); - return false; - } - - // OpenGL ES does not support fetching data in BGRA format - // while FreeImage does not support RGBA format. - Image_PixMap anImage; - anImage.InitWrapper (Image_PixMap::ImgRGBA, - anAlienImage.ChangeData(), - anAlienImage.SizeX(), - anAlienImage.SizeY(), - anAlienImage.SizeRowBytes()); - if (!myView->ToPixMap (anImage, theWidth, theHeight, Graphic3d_BT_RGBA)) - { - Message::DefaultMessenger()->Send (TCollection_AsciiString() + "View dump to the image " + theWidth + "x" + theHeight + " failed", Message_Fail); - } - - for (Standard_Size aRow = 0; aRow < anAlienImage.SizeY(); ++aRow) - { - for (Standard_Size aCol = 0; aCol < anAlienImage.SizeX(); ++aCol) - { - Image_ColorRGBA& aPixel = anAlienImage.ChangeValue (aRow, aCol); - std::swap (aPixel.r(), aPixel.b()); - //aPixel.a() = 1.0; - } - } - - if (!anAlienImage.Save (thePath)) - { - Message::DefaultMessenger()->Send (TCollection_AsciiString() + "Image saving to path '" + thePath + "' failed", Message_Fail); - return false; - } - Message::DefaultMessenger()->Send (TCollection_AsciiString() + "View " + theWidth + "x" + theHeight + " dumped to image '" + thePath + "'", Message_Info); - return true; -} - -// ======================================================================= -// function : redraw -// purpose : -// ======================================================================= -void OcctJni_Viewer::redraw() -{ - if (myView.IsNull()) - { - return; - } - - myView->Redraw(); -} - -// ======================================================================= -// function : fitAll -// purpose : -// ======================================================================= -void OcctJni_Viewer::fitAll() -{ - if (myView.IsNull()) - { - return; - } - - myView->FitAll (0.01, Standard_False); - myView->Invalidate(); -} - -// ======================================================================= -// function : startRotation -// purpose : -// ======================================================================= -void OcctJni_Viewer::startRotation (int theStartX, - int theStartY) -{ - if (myView.IsNull()) - { - return; - } - - myView->StartRotation (theStartX, theStartY, 0.45); - myView->Invalidate(); -} - -// ======================================================================= -// function : onRotation -// purpose : -// ======================================================================= -void OcctJni_Viewer::onRotation (int theX, - int theY) -{ - if (myView.IsNull()) - { - return; - } - - myView->Rotation (theX, theY); - myView->Invalidate(); -} - -// ======================================================================= -// function : onPanning -// purpose : -// ======================================================================= -void OcctJni_Viewer::onPanning (int theDX, - int theDY) -{ - if (myView.IsNull()) - { - return; - } - - myView->Pan (theDX, theDY); - myView->Invalidate(); -} - -// ======================================================================= -// function : onClick -// purpose : -// ======================================================================= -void OcctJni_Viewer::onClick (int theX, - int theY) -{ - if (myView.IsNull()) - { - return; - } - - myContext->MoveTo (theX, theY, myView, Standard_False); - myContext->Select (Standard_False); - myView->Invalidate(); -} - -// ======================================================================= -// function : stopAction -// purpose : -// ======================================================================= -void OcctJni_Viewer::stopAction() -{ - if (myView.IsNull()) - { - return; - } -} - -#define jexp extern "C" JNIEXPORT - -jexp jlong JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppCreate (JNIEnv* theEnv, - jobject theObj) -{ - return jlong(new OcctJni_Viewer()); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppDestroy (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - delete (OcctJni_Viewer* )theCppPtr; - - Handle(Message_Messenger) aMsgMgr = Message::DefaultMessenger(); - aMsgMgr->RemovePrinters (STANDARD_TYPE (OcctJni_MsgPrinter)); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppRelease (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->release(); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppInit (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - Handle(Message_Messenger) aMsgMgr = Message::DefaultMessenger(); - aMsgMgr->RemovePrinters (STANDARD_TYPE (OcctJni_MsgPrinter)); - aMsgMgr->AddPrinter (new OcctJni_MsgPrinter (theEnv, theObj)); - ((OcctJni_Viewer* )theCppPtr)->init(); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppResize (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr, - jint theWidth, - jint theHeight) -{ - ((OcctJni_Viewer* )theCppPtr)->resize (theWidth, theHeight); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppOpen (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr, - jstring thePath) -{ - const char* aPathPtr = theEnv->GetStringUTFChars (thePath, 0); - const TCollection_AsciiString aPath (aPathPtr); - theEnv->ReleaseStringUTFChars (thePath, aPathPtr); - ((OcctJni_Viewer* )theCppPtr)->open (aPath); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppRedraw (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->redraw(); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetAxoProj (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_XposYnegZpos); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetXposProj (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Xpos); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetYposProj (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Ypos); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetZposProj (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Zpos); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetXnegProj (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Xneg); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetYnegProj (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Yneg); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetZnegProj (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->setProj (V3d_Zneg); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppFitAll (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->fitAll(); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppStartRotation (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr, - jint theStartX, - jint theStartY) -{ - ((OcctJni_Viewer* )theCppPtr)->startRotation (theStartX, theStartY); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppOnRotation (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr, - jint theX, - jint theY) -{ - ((OcctJni_Viewer* )theCppPtr)->onRotation (theX, theY); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppOnPanning (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr, - jint theDX, - jint theDY) -{ - ((OcctJni_Viewer* )theCppPtr)->onPanning (theDX, theDY); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppOnClick (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr, - jint theX, - jint theY) -{ - ((OcctJni_Viewer* )theCppPtr)->onClick (theX, theY); -} - -jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppStopAction (JNIEnv* theEnv, - jobject theObj, - jlong theCppPtr) -{ - ((OcctJni_Viewer* )theCppPtr)->stopAction(); -} - -jexp jlong JNICALL Java_com_opencascade_jnisample_OcctJniActivity_cppOcctMajorVersion (JNIEnv* theEnv, - jobject theObj) -{ - return OCC_VERSION_MAJOR; -} - -jexp jlong JNICALL Java_com_opencascade_jnisample_OcctJniActivity_cppOcctMinorVersion (JNIEnv* theEnv, - jobject theObj) -{ - return OCC_VERSION_MINOR; -} - -jexp jlong JNICALL Java_com_opencascade_jnisample_OcctJniActivity_cppOcctMicroVersion (JNIEnv* theEnv, - jobject theObj) -{ - return OCC_VERSION_MAINTENANCE; -} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Viewer.hxx opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Viewer.hxx --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Viewer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Viewer.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - -//! Main C++ back-end for activity. -class OcctJni_Viewer -{ - -public: - - //! Empty constructor - OcctJni_Viewer(); - - //! Initialize the viewer - bool init(); - - //! Release the viewer - void release(); - - //! Resize the viewer - void resize (int theWidth, - int theHeight); - - //! Open CAD file - bool open (const TCollection_AsciiString& thePath); - - //! Take snapshot - bool saveSnapshot (const TCollection_AsciiString& thePath, - int theWidth = 0, - int theHeight = 0); - - //! Viewer update. - void redraw(); - - //! Move camera - void setProj (V3d_TypeOfOrientation theProj) { if (!myView.IsNull()) myView->SetProj (theProj); } - - //! Fit All. - void fitAll(); - - //! Start rotation (remember first point position) - void startRotation (int theStartX, - int theStartY); - - //! Perform rotation (relative to first point) - void onRotation (int theX, - int theY); - - //! Perform panning - void onPanning (int theDX, - int theDY); - - //! Perform selection - void onClick (int theX, - int theY); - - //! Stop previously started action - void stopAction(); - -protected: - - //! Reset viewer content. - void initContent(); - -protected: - - Handle(V3d_Viewer) myViewer; - Handle(V3d_View) myView; - Handle(AIS_InteractiveContext) myContext; - TopoDS_Shape myShape; - -}; diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Window.cxx opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Window.cxx --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Window.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Window.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -IMPLEMENT_STANDARD_RTTIEXT(OcctJni_Window, Aspect_Window) diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Window.hxx opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Window.hxx --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Window.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/jni/OcctJni_Window.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef OcctJni_Window_H -#define OcctJni_Window_H - -#include - -//! This class defines dummy window -class OcctJni_Window : public Aspect_Window -{ - -public: - - //! Creates a wrapper over existing Window handle - OcctJni_Window (const int theWidth, const int theHeight) - : myWidth (theWidth), myHeight(theHeight) {} - - //! Returns native Window handle - virtual Aspect_Drawable NativeHandle() const Standard_OVERRIDE { return 0; } - - //! Returns parent of native Window handle - virtual Aspect_Drawable NativeParentHandle() const Standard_OVERRIDE { return 0; } - - //! Returns nothing on Android - virtual Aspect_FBConfig NativeFBConfig() const Standard_OVERRIDE { return 0; } - - virtual void Destroy() {} - - //! Opens the window - virtual void Map() const Standard_OVERRIDE {} - - //! Closes the window - virtual void Unmap() const Standard_OVERRIDE {} - - //! Applies the resizing to the window - virtual Aspect_TypeOfResize DoResize() const Standard_OVERRIDE { return Aspect_TOR_UNKNOWN; } - - //! Apply the mapping change to the window - virtual Standard_Boolean DoMapping() const Standard_OVERRIDE { return Standard_True; } - - //! Returns True if the window is opened - virtual Standard_Boolean IsMapped() const Standard_OVERRIDE { return Standard_True; } - - //! Returns The Window RATIO equal to the physical WIDTH/HEIGHT dimensions - virtual Standard_Real Ratio() const Standard_OVERRIDE { return 1.0; } - - //! Returns The Window POSITION in PIXEL - virtual void Position (Standard_Integer& theX1, - Standard_Integer& theY1, - Standard_Integer& theX2, - Standard_Integer& theY2) const Standard_OVERRIDE - { - theX1 = 0; - theX2 = myWidth; - theY1 = 0; - theY2 = myHeight; - } - - //! Set The Window POSITION in PIXEL - void SetPosition (const Standard_Integer theX1, - const Standard_Integer theY1, - const Standard_Integer theX2, - const Standard_Integer theY2) - { - myWidth = theX2 - theX1; - myHeight = theY2 - theY1; - } - - //! Returns The Window SIZE in PIXEL - virtual void Size (Standard_Integer& theWidth, - Standard_Integer& theHeight) const Standard_OVERRIDE - { - theWidth = myWidth; - theHeight = myHeight; - } - - //! Set The Window SIZE in PIXEL - void SetSize (const Standard_Integer theWidth, - const Standard_Integer theHeight) - { - myWidth = theWidth; - myHeight = theHeight; - } - -private: - - int myWidth; - int myHeight; - -public: - - DEFINE_STANDARD_RTTIEXT(OcctJni_Window,Aspect_Window) - -}; - -DEFINE_STANDARD_HANDLE(OcctJni_Window, Aspect_Window) - -#endif // OcctJni_Window_H diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/.project opencascade-7.5.1+dfsg1/samples/java/jniviewer/.project --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/.project 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/.project 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ - - - occtJniActivity - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.ui.externaltools.ExternalToolBuilder - auto,full,incremental, - - - LaunchConfigHandle - <project>/.externalToolBuilders/C++ Builder.launch - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/project.properties opencascade-7.5.1+dfsg1/samples/java/jniviewer/project.properties --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/project.properties 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/project.properties 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-15 diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/ReadMe.md opencascade-7.5.1+dfsg1/samples/java/jniviewer/ReadMe.md --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/ReadMe.md 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/ReadMe.md 2021-02-02 08:51:56.000000000 +0000 @@ -11,36 +11,22 @@ Alternative method is available, wrapping individual OCCT classes to Java equivalents so that their full API is available to Java user and the code can be programmed on Java level similarly to C++ one. See description of OCCT Java Wrapper in Advanced Samples and Tools on OCCT web site at -http://www.opencascade.org/support/products/advsamples +https://www.opencascade.com/content/advanced-samples-and-tools -Run Eclipse from ADT (Android Developer Tools) for building the sample. To import sample project perform -~~~~ - File -> Import... -> Android -> Existing Android code into Workspace -~~~~ -and specify this directory. The project re-build will be started immediately right after importation if "Build automatically" option is turned on (default in Eclipse). -Proxy library compilation and packaging is performed by NDK build script, called by "C++ Builder" configured within Eclipse project. -The path to "ndk-build" tool from Android NDK (Native Development Kit) should be specified in Eclipse project properties: -~~~~ - Project -> Properties -> Builders -> C++ Builder -> Edit -> Location -~~~~ - -Now paths to OCCT C++ libraries and additional components should be specified in "jni/Android.mk" file: -~~~~ -OCCT_ROOT := $(LOCAL_PATH)/../../../.. - -FREETYPE_INC := $(OCCT_ROOT)/../freetype/include/freetype2 -FREETYPE_LIBS := $(OCCT_ROOT)/../freetype/libs - -FREEIMAGE_INC := $(OCCT_ROOT)/../FreeImage/include -FREEIMAGE_LIBS := $(OCCT_ROOT)/../FreeImage/libs - -OCCT_INC := $(OCCT_ROOT)/inc -OCCT_LIBS := $(OCCT_ROOT)/and/libs -~~~~ -The list of extra components (Freetype, FreeImage) depends on OCCT configuration. -Variable $(TARGET_ARCH_ABI) is used within this script to refer to active architecture. -E.g. for 32-bit ARM build (see variable *APP_ABI* in "jni/Application.mk") -the folder *OCCT_LIBS* should contain sub-folder "armeabi-v7a" with OCCT libraries. +Install Android Studio 4.0+ and install building tools (check Tools -> SDK Manager): +- Android SDK (API level 21 or higher). +- Android SDK build tools. +- Android NDK r16 or higher (coming with CMake toolchain). + Using NDK r18 or newer will require changing ANDROID_STL in project settings. +- CMake 3.10+. + +Specify this folder location in Android Studio for opening project. +You might need re-entering Android SDK explicitly in File -> Project Structure -> SDK Location settings (SDK, NDK, JDK locations). + +This sample expects OCCT to be already build - please refer to appropriate CMake building instructions in OCCT documentation. +The following variables should be added into file gradle.properties (see gradle.properties.template as template): +- `OCCT_ROOT` - path to OCCT installation folder. +- `FREETYPE_ROOT` - path to FreeType installation folder. FreeImage is optional and does not required for this sample, however you should include all extra libraries used for OCCT building and load the explicitly from Java code within OcctJniActivity::loadNatives() method, including toolkits from OCCT itself in proper order: @@ -49,10 +35,8 @@ || !loadLibVerbose ("TKMath", aLoaded, aFailed) || !loadLibVerbose ("TKG2d", aLoaded, aFailed) ~~~~ -Note that C++ STL library is not part of Android system. -Thus application must package this library as well as extra component. -"gnustl_shared" STL implementation is expected within this sample. +Note that C++ STL library is not part of Android system, and application must package this library as well as extra component ("gnustl_shared" by default - see also `ANDROID_STL`). -After successful build, the application can be packaged to Android: -- Deploy and run application on connected device or emulator directly from Eclipse using adb interface by menu items "Run" and "Debug". This would sign package with debug certificate. -- Prepare signed end-user package using wizard File -> Export -> Android -> Export Android Application. +After successful build via Build -> Rebuild Project, the application can be packaged to Android: +- Deploy and run application on connected device or emulator directly from Android Studio using adb interface by menu items "Run" and "Debug". This would sign package with debug certificate. +- Prepare signed end-user package using wizard Build -> Generate signed APK. Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/close_l.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/close_l.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/close_p.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/close_p.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/fit.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/fit.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/ic_launcher.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/ic_launcher.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/info_image.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/info_image.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/info.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/info.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/message.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/message.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/open_l.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/open_l.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/open.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/open.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/open_p.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/open_p.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_back.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_back.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_bottom.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_bottom.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_front.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_front.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_left.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_left.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_right.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_right.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_top.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/proj_top.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/view.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-hdpi/view.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-mdpi/ic_launcher.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-mdpi/ic_launcher.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-xhdpi/ic_launcher.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-xhdpi/ic_launcher.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/drawable-xxhdpi/ic_launcher.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/drawable-xxhdpi/ic_launcher.png differ diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/layout/activity_main.xml opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/layout/activity_main.xml --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/layout/activity_main.xml 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/layout/activity_main.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/values/id.xml opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/values/id.xml --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/values/id.xml 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/values/id.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/values/strings.xml opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/values/strings.xml --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/res/values/strings.xml 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/res/values/strings.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ - - - OpenCASCADE JNI Java Sample - #484848 - #0099CC - #66252525 - - .png - .jpg - - - .brep - .rle - .iges - .igs - .step - .stp - - wireframe/shading - color - material - transparency - show/hide hidden lines - - OpenCASCADE JNI Java Sample

-

Simple viewer for BREP, STEP and IGES files.

-

Driven by Open CASCADE Technology %d.%d.%d.

-

Copyright 2014 OPEN CASCADE SAS.

-

-

http://www.opencascade.com

-

http://www.opencascade.org

- ]]> -
-
diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/.settings/org.eclipse.jdt.core.prefs opencascade-7.5.1+dfsg1/samples/java/jniviewer/.settings/org.eclipse.jdt.core.prefs --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/.settings/org.eclipse.jdt.core.prefs 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/.settings/org.eclipse.jdt.core.prefs 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.source=1.6 diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/settings.gradle opencascade-7.5.1+dfsg1/samples/java/jniviewer/settings.gradle --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/settings.gradle 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/settings.gradle 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1 @@ +include ':app' diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniActivity.java opencascade-7.5.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniActivity.java --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniActivity.java 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniActivity.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,778 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -package com.opencascade.jnisample; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.List; - -import android.app.Activity; -import android.content.Context; - -import android.content.Intent; -import android.content.res.AssetManager; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.Point; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.os.Environment; - -import android.text.Html; -import android.text.Html.ImageGetter; -import android.text.Spanned; -import android.util.TypedValue; -import android.view.Display; -import android.view.Gravity; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.ImageButton; -import android.widget.LinearLayout; -import android.view.ViewGroup.LayoutParams; -import android.widget.TextView; -import android.widget.Toast; - -//! Main activity -public class OcctJniActivity extends Activity implements OnClickListener -{ - - //! Auxiliary method to print temporary info messages - public static void printShortInfo (Activity theActivity, - CharSequence theInfo) - { - Context aCtx = theActivity.getApplicationContext(); - Toast aToast = Toast.makeText (aCtx, theInfo, Toast.LENGTH_LONG); - aToast.show(); - } - - //! Load single native library - private static boolean loadLibVerbose (String theLibName, - StringBuilder theLoadedInfo, - StringBuilder theFailedInfo) - { - try - { - System.loadLibrary (theLibName); - theLoadedInfo.append ("Info: native library \""); - theLoadedInfo.append (theLibName); - theLoadedInfo.append ("\" has been loaded\n"); - return true; - } - catch (java.lang.UnsatisfiedLinkError theError) - { - theFailedInfo.append ("Error: native library \""); - theFailedInfo.append (theLibName); - theFailedInfo.append ("\" is unavailable:\n " + theError.getMessage()); - return false; - } - catch (SecurityException theError) - { - theFailedInfo.append ("Error: native library \""); - theFailedInfo.append (theLibName); - theFailedInfo.append ("\" can not be loaded for security reasons:\n " + theError.getMessage()); - return false; - } - } - - public static boolean wasNativesLoadCalled = false; - public static boolean areNativeLoaded = false; - public static String nativeLoaded = ""; - public static String nativeFailed = ""; - - //! Auxiliary method to load native libraries - public boolean loadNatives() - { - if (wasNativesLoadCalled) - { - return areNativeLoaded; - } - wasNativesLoadCalled = true; - StringBuilder aLoaded = new StringBuilder(); - StringBuilder aFailed = new StringBuilder(); - - // copy OCCT resources - String aResFolder = getFilesDir().getAbsolutePath(); - copyAssetFolder (getAssets(), "Shaders", aResFolder + "/Shaders"); - copyAssetFolder (getAssets(), "SHMessage", aResFolder + "/SHMessage"); - copyAssetFolder (getAssets(), "XSMessage", aResFolder + "/XSMessage"); - copyAssetFolder (getAssets(), "TObj", aResFolder + "/TObj"); - copyAssetFolder (getAssets(), "UnitsAPI", aResFolder + "/UnitsAPI"); - - // C++ runtime - loadLibVerbose ("gnustl_shared", aLoaded, aFailed); - - // 3rd-parties - loadLibVerbose ("freetype", aLoaded, aFailed); - loadLibVerbose ("freeimage", aLoaded, aFailed); - - if (// OCCT modeling - !loadLibVerbose ("TKernel", aLoaded, aFailed) - || !loadLibVerbose ("TKMath", aLoaded, aFailed) - || !loadLibVerbose ("TKG2d", aLoaded, aFailed) - || !loadLibVerbose ("TKG3d", aLoaded, aFailed) - || !loadLibVerbose ("TKGeomBase", aLoaded, aFailed) - || !loadLibVerbose ("TKBRep", aLoaded, aFailed) - || !loadLibVerbose ("TKGeomAlgo", aLoaded, aFailed) - || !loadLibVerbose ("TKTopAlgo", aLoaded, aFailed) - || !loadLibVerbose ("TKShHealing", aLoaded, aFailed) - || !loadLibVerbose ("TKMesh", aLoaded, aFailed) - // exchange - || !loadLibVerbose ("TKPrim", aLoaded, aFailed) - || !loadLibVerbose ("TKBO", aLoaded, aFailed) - || !loadLibVerbose ("TKBool", aLoaded, aFailed) - || !loadLibVerbose ("TKFillet", aLoaded, aFailed) - || !loadLibVerbose ("TKOffset", aLoaded, aFailed) - || !loadLibVerbose ("TKXSBase", aLoaded, aFailed) - || !loadLibVerbose ("TKIGES", aLoaded, aFailed) - || !loadLibVerbose ("TKSTEPBase", aLoaded, aFailed) - || !loadLibVerbose ("TKSTEPAttr", aLoaded, aFailed) - || !loadLibVerbose ("TKSTEP209", aLoaded, aFailed) - || !loadLibVerbose ("TKSTEP", aLoaded, aFailed) - // OCCT Visualization - || !loadLibVerbose ("TKService", aLoaded, aFailed) - || !loadLibVerbose ("TKHLR", aLoaded, aFailed) - || !loadLibVerbose ("TKV3d", aLoaded, aFailed) - || !loadLibVerbose ("TKOpenGl", aLoaded, aFailed) - // application code - || !loadLibVerbose ("TKJniSample", aLoaded, aFailed)) - { - nativeLoaded = aLoaded.toString(); - nativeFailed = aFailed.toString(); - areNativeLoaded = false; - //exitWithError (theActivity, "Broken apk?\n" + theFailedInfo); - return false; - } - nativeLoaded = aLoaded.toString(); - areNativeLoaded = true; - return true; - } - - //! Create activity - @Override protected void onCreate (Bundle theBundle) - { - super.onCreate (theBundle); - - boolean isLoaded = loadNatives(); - if (!isLoaded) - { - printShortInfo (this, nativeFailed); - OcctJniLogger.postMessage (nativeLoaded + "\n" + nativeFailed); - } - - setContentView (R.layout.activity_main); - - myOcctView = (OcctJniView )findViewById (R.id.custom_view); - myMessageTextView = (TextView )findViewById (R.id.message_view); - OcctJniLogger.setTextView (myMessageTextView); - - createViewAndButtons (Configuration.ORIENTATION_LANDSCAPE); - - myButtonPreferSize = defineButtonSize ((LinearLayout )findViewById (R.id.panel_menu)); - ImageButton aScrollBtn = (ImageButton )findViewById (R.id.scroll_btn); - aScrollBtn.setY (myButtonPreferSize); - aScrollBtn.setOnTouchListener (new View.OnTouchListener() - { - @Override - public boolean onTouch (View theView, MotionEvent theEvent) - { - return onScrollBtnTouch (theView, theEvent); - } - }); - - onConfigurationChanged (getResources().getConfiguration()); - - Intent anIntent = getIntent(); - Uri aDataUrl = anIntent != null ? anIntent.getData() : null; - String aDataPath = aDataUrl != null ? aDataUrl.getPath() : ""; - myOcctView.open (aDataPath); - myLastPath = aDataPath; - } - - //! Handle scroll events - private boolean onScrollBtnTouch (View theView, - MotionEvent theEvent) - { - switch (theEvent.getAction()) - { - case MotionEvent.ACTION_DOWN: - { - LinearLayout aPanelMenu = (LinearLayout )findViewById (R.id.panel_menu); - boolean isLandscape = (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE); - if (aPanelMenu.getVisibility() == View.VISIBLE) - { - aPanelMenu.setVisibility (View.GONE); - if (!isLandscape) - { - ((ImageButton )theView).setImageResource (R.drawable.open_p); - theView.setY (0); - } - else - { - ((ImageButton )theView).setImageResource (R.drawable.open_l); - theView.setX (0); - } - } - else - { - aPanelMenu.setVisibility (View.VISIBLE); - if (!isLandscape) - { - ((ImageButton )theView).setImageResource (R.drawable.close_p); - theView.setY (myButtonPreferSize); - } - else - { - ((ImageButton )theView).setImageResource (R.drawable.close_l); - theView.setX (myButtonPreferSize); - } - } - break; - } - } - return false; - } - - //! Initialize views and buttons - private void createViewAndButtons (int theOrientation) - { - // open button - ImageButton anOpenButton = (ImageButton )findViewById (R.id.open); - anOpenButton.setOnClickListener (this); - - // fit all - ImageButton aFitAllButton = (ImageButton )findViewById (R.id.fit); - aFitAllButton.setOnClickListener (this); - aFitAllButton.setOnTouchListener (new View.OnTouchListener() - { - @Override - public boolean onTouch (View theView, MotionEvent theEvent) - { - return onTouchButton (theView, theEvent); - } - }); - - // message - ImageButton aMessageButton = (ImageButton )findViewById (R.id.message); - aMessageButton.setOnClickListener (this); - - // info - ImageButton anInfoButton = (ImageButton )findViewById (R.id.info); - anInfoButton.setOnClickListener (this); - - // font for text view - TextView anInfoView = (TextView )findViewById (R.id.info_view); - anInfoView.setTextSize (TypedValue.COMPLEX_UNIT_SP, 18); - - // add submenu buttons - createSubmenuBtn (R.id.view, R.id.view_group, - Arrays.asList (R.id.proj_front, R.id.proj_top, R.id.proj_left, - R.id.proj_back, R.id.proj_bottom, R.id.proj_right), - Arrays.asList (R.drawable.proj_front, R.drawable.proj_top, R.drawable.proj_left, - R.drawable.proj_back, R.drawable.proj_bottom, R.drawable.proj_right), - 4); - } - - @Override protected void onNewIntent (Intent theIntent) - { - super.onNewIntent (theIntent); - setIntent (theIntent); - } - - @Override protected void onDestroy() - { - super.onDestroy(); - OcctJniLogger.setTextView (null); - } - - @Override protected void onPause() - { - super.onPause(); - myOcctView.onPause(); - } - - @Override protected void onResume() - { - super.onResume(); - myOcctView.onResume(); - - Intent anIntent = getIntent(); - Uri aDataUrl = anIntent != null ? anIntent.getData() : null; - String aDataPath = aDataUrl != null ? aDataUrl.getPath() : ""; - if (!aDataPath.equals (myLastPath)) - { - myOcctView.open (aDataPath); - myLastPath = aDataPath; - } - } - - //! Copy folder from assets - private boolean copyAssetFolder (AssetManager theAssetMgr, - String theAssetFolder, - String theFolderPathTo) - { - try - { - String[] aFiles = theAssetMgr.list (theAssetFolder); - File aFolder = new File (theFolderPathTo); - aFolder.mkdirs(); - boolean isOk = true; - for (String aFileIter : aFiles) - { - if (aFileIter.contains (".")) - { - isOk &= copyAsset (theAssetMgr, - theAssetFolder + "/" + aFileIter, - theFolderPathTo + "/" + aFileIter); - } - else - { - isOk &= copyAssetFolder (theAssetMgr, - theAssetFolder + "/" + aFileIter, - theFolderPathTo + "/" + aFileIter); - } - } - return isOk; - } - catch (Exception theError) - { - theError.printStackTrace(); - return false; - } - } - - //! Copy single file from assets - private boolean copyAsset (AssetManager theAssetMgr, - String thePathFrom, - String thePathTo) - { - try - { - InputStream aStreamIn = theAssetMgr.open (thePathFrom); - File aFileTo = new File (thePathTo); - aFileTo.createNewFile(); - OutputStream aStreamOut = new FileOutputStream (thePathTo); - copyStreamContent (aStreamIn, aStreamOut); - aStreamIn.close(); - aStreamIn = null; - aStreamOut.flush(); - aStreamOut.close(); - aStreamOut = null; - return true; - } - catch (Exception theError) - { - theError.printStackTrace(); - return false; - } - } - - //! Copy single file - private static void copyStreamContent (InputStream theIn, - OutputStream theOut) throws IOException - { - byte[] aBuffer = new byte[1024]; - int aNbReadBytes = 0; - while ((aNbReadBytes = theIn.read (aBuffer)) != -1) - { - theOut.write (aBuffer, 0, aNbReadBytes); - } - } - - //! Show/hide text view - private void switchTextView (TextView theTextView, - ImageButton theClickedBtn, - boolean theToSwitchOn) - { - if (theTextView != null - && theTextView.getVisibility() == View.GONE - && theToSwitchOn) - { - theTextView.setVisibility (View.VISIBLE); - theClickedBtn.setBackgroundColor (getResources().getColor(R.color.pressedBtnColor)); - setTextViewPosition (theTextView); - } - else - { - theTextView.setVisibility (View.GONE); - theClickedBtn.setBackgroundColor (getResources().getColor (R.color.btnColor)); - } - } - - //! Setup text view position - private void setTextViewPosition (TextView theTextView) - { - if (theTextView.getVisibility() != View.VISIBLE) - { - return; - } - - if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) - { - theTextView.setX (myButtonPreferSize); - theTextView.setY (0); - } - else - { - theTextView.setX (0); - theTextView.setY (myButtonPreferSize); - } - } - - @Override - public void onClick (View theButton) - { - ImageButton aClickedBtn = (ImageButton )theButton; - switch (aClickedBtn.getId()) - { - case R.id.message: - { - switchTextView ((TextView )findViewById (R.id.info_view), - (ImageButton )findViewById (R.id.info), false); - switchTextView (myMessageTextView, aClickedBtn, true); - return; - } - case R.id.info: - { - String aText = getString (R.string.info_html); - aText = String.format (aText, cppOcctMajorVersion(), cppOcctMinorVersion(), cppOcctMicroVersion()); - Spanned aSpanned = Html.fromHtml (aText, new ImageGetter() - { - @Override - public Drawable getDrawable (String theSource) - { - Resources aResources = getResources(); - int anId = aResources.getIdentifier (theSource, "drawable", getPackageName()); - Drawable aRes = aResources.getDrawable (anId); - aRes.setBounds (0, 0, aRes.getIntrinsicWidth(), aRes.getIntrinsicHeight()); - return aRes; - } - }, null); - - TextView anInfoView = (TextView )findViewById (R.id.info_view); - anInfoView.setText (aSpanned); - switchTextView (myMessageTextView, (ImageButton ) findViewById (R.id.message), false); - switchTextView (anInfoView, aClickedBtn, true); - return; - } - case R.id.fit: - { - myOcctView.fitAll(); - return; - } - case R.id.proj_front: - { - myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Xpos); - return; - } - case R.id.proj_left: - { - myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Yneg); - return; - } - case R.id.proj_top: - { - myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Zpos); - return; - } - case R.id.proj_back: - { - myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Xneg); - return; - } - case R.id.proj_right: - { - myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Ypos); - return; - } - case R.id.proj_bottom: - { - myOcctView.setProj (OcctJniRenderer.TypeOfOrientation.Zneg); - return; - } - case R.id.open: - { - File aPath = Environment.getExternalStorageDirectory(); - aClickedBtn.setBackgroundColor (getResources().getColor(R.color.pressedBtnColor)); - if (myFileOpenDialog == null) - { - myFileOpenDialog = new OcctJniFileDialog (this, aPath); - myFileOpenDialog.setFileEndsWith (".brep"); - myFileOpenDialog.setFileEndsWith (".rle"); - myFileOpenDialog.setFileEndsWith (".iges"); - myFileOpenDialog.setFileEndsWith (".igs"); - myFileOpenDialog.setFileEndsWith (".step"); - myFileOpenDialog.setFileEndsWith (".stp"); - myFileOpenDialog.addFileListener (new OcctJniFileDialog.FileSelectedListener() - { - public void fileSelected (File theFile) - { - if (theFile != null && myOcctView != null) - { - myOcctView.open (theFile.getPath()); - } - } - }); - myFileOpenDialog.addDialogDismissedListener (new OcctJniFileDialog.DialogDismissedListener() - { - @Override - public void dialogDismissed() - { - ImageButton openButton = (ImageButton )findViewById (R.id.open); - openButton.setBackgroundColor (getResources().getColor(R.color.btnColor)); - } - }); - } - myFileOpenDialog.showDialog(); - return; - } - } - } - - private void createSubmenuBtn (int theParentBtnId, - int theParentLayoutId, - final List theNewButtonIds, - final List theNewButtonImageIds, - int thePosition) - { - int aPosInList = 0; - final ImageButton aParentBtn = (ImageButton )findViewById (theParentBtnId); - - ViewGroup.LayoutParams aParams = null; - LinearLayout parentLayout = (LinearLayout ) findViewById (theParentLayoutId); - for (Integer newButtonId : theNewButtonIds) - { - ImageButton aNewButton = (ImageButton )findViewById (newButtonId); - if (aNewButton == null) - { - aNewButton = (ImageButton )new ImageButton (this); - aNewButton.setId (newButtonId); - aNewButton.setImageResource (theNewButtonImageIds.get (aPosInList)); - aNewButton.setLayoutParams (aParams); - parentLayout.addView (aNewButton); - } - - aNewButton.setOnClickListener (this); - aNewButton.setVisibility (View.GONE); - - aNewButton.setOnTouchListener (new View.OnTouchListener() - { - @Override - public boolean onTouch (View theView, MotionEvent theEvent) - { - return onTouchButton (theView, theEvent); - } - }); - ++aPosInList; - } - - if (aParentBtn != null) - { - aParentBtn.setOnTouchListener (null); - aParentBtn.setOnTouchListener (new View.OnTouchListener() - { - @Override - public boolean onTouch (View theView, MotionEvent theEvent) - { - if (theEvent.getAction () == MotionEvent.ACTION_DOWN) - { - Boolean isVisible = false; - for (Integer aNewButtonId : theNewButtonIds) - { - ImageButton anBtn = (ImageButton )findViewById (aNewButtonId); - if (anBtn != null) - { - if (anBtn.getVisibility() == View.GONE) - { - anBtn.setVisibility (View.VISIBLE); - isVisible = true; - } - else - { - anBtn.setVisibility (View.GONE); - } - } - } - aParentBtn.setBackgroundColor (!isVisible ? getResources().getColor(R.color.btnColor) : getResources().getColor(R.color.pressedBtnColor)); - } - return false; - } - }); - } - } - - //! Implements onTouch functionality - private boolean onTouchButton (View theView, - MotionEvent theEvent) - { - switch (theEvent.getAction()) - { - case MotionEvent.ACTION_DOWN: - ((ImageButton )theView).setBackgroundColor (getResources().getColor (R.color.pressedBtnColor)); - break; - case MotionEvent.ACTION_UP: - ((ImageButton )theView).setBackgroundColor (getResources().getColor (R.color.btnColor)); - break; - } - return false; - } - - //! Handle configuration change event - @Override - public void onConfigurationChanged (Configuration theNewConfig) - { - super.onConfigurationChanged (theNewConfig); - LinearLayout aLayoutPanelMenu = (LinearLayout )findViewById (R.id.panel_menu); - LayoutParams aPanelMenuLayoutParams = aLayoutPanelMenu.getLayoutParams(); - - LinearLayout aLayoutViewGroup = (LinearLayout )findViewById (R.id.view_group); - LayoutParams aViewGroupLayoutParams = aLayoutViewGroup.getLayoutParams(); - ImageButton aScrollBtn = (ImageButton )findViewById (R.id.scroll_btn); - LayoutParams aScrollBtnLayoutParams = aScrollBtn.getLayoutParams(); - - myButtonPreferSize = defineButtonSize ((LinearLayout )findViewById (R.id.panel_menu)); - defineButtonSize ((LinearLayout )findViewById (R.id.view_group)); - - switch (theNewConfig.orientation) - { - case Configuration.ORIENTATION_PORTRAIT: - { - setHorizontal (aLayoutPanelMenu, aPanelMenuLayoutParams); - setHorizontal (aLayoutViewGroup, aViewGroupLayoutParams); - aLayoutViewGroup.setGravity (Gravity.BOTTOM); - - aScrollBtnLayoutParams.height = LayoutParams.WRAP_CONTENT; - aScrollBtnLayoutParams.width = LayoutParams.MATCH_PARENT; - aScrollBtn.setLayoutParams (aScrollBtnLayoutParams); - if (aLayoutPanelMenu.getVisibility() == View.VISIBLE) - { - aScrollBtn.setImageResource (R.drawable.close_p); - aScrollBtn.setY (myButtonPreferSize); - aScrollBtn.setX (0); - } - else - { - aScrollBtn.setImageResource (R.drawable.open_p); - aScrollBtn.setY (0); - aScrollBtn.setX (0); - } - break; - } - case Configuration.ORIENTATION_LANDSCAPE: - { - setVertical (aLayoutPanelMenu, aPanelMenuLayoutParams); - setVertical (aLayoutViewGroup, aViewGroupLayoutParams); - aLayoutViewGroup.setGravity (Gravity.RIGHT); - - aScrollBtnLayoutParams.height = LayoutParams.MATCH_PARENT; - aScrollBtnLayoutParams.width = LayoutParams.WRAP_CONTENT; - aScrollBtn.setLayoutParams (aScrollBtnLayoutParams); - if (aLayoutPanelMenu.getVisibility() == View.VISIBLE) - { - aScrollBtn.setImageResource (R.drawable.close_l); - aScrollBtn.setX (myButtonPreferSize); - aScrollBtn.setY (0); - } - else - { - aScrollBtn.setImageResource (R.drawable.open_l); - aScrollBtn.setY (0); - aScrollBtn.setX (0); - } - break; - } - } - setTextViewPosition (myMessageTextView); - setTextViewPosition ((TextView )findViewById (R.id.info_view)); - } - - private void setHorizontal (LinearLayout theLayout, - LayoutParams theLayoutParams) - { - theLayout.setOrientation (LinearLayout.HORIZONTAL); - theLayoutParams.height = LayoutParams.WRAP_CONTENT; - theLayoutParams.width = LayoutParams.MATCH_PARENT; - theLayout.setLayoutParams (theLayoutParams); - } - - private void setVertical (LinearLayout theLayout, - LayoutParams theLayoutParams) - { - theLayout.setOrientation (LinearLayout.VERTICAL); - theLayoutParams.height = LayoutParams.MATCH_PARENT; - theLayoutParams.width = LayoutParams.WRAP_CONTENT; - theLayout.setLayoutParams (theLayoutParams); - } - - //! Define button size - private int defineButtonSize (LinearLayout theLayout) - { - boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; - Display aDisplay = getWindowManager().getDefaultDisplay(); - Point aDispPnt = new Point(); - aDisplay.getSize (aDispPnt); - - int aNbChildren = theLayout.getChildCount(); - int aHeight = aDispPnt.y / aNbChildren; - int aWidth = aDispPnt.x / aNbChildren; - int aResultSize = 0; - for (int aChildIter = 0; aChildIter < aNbChildren; ++aChildIter) - { - View aView = theLayout.getChildAt (aChildIter); - if (aView instanceof ImageButton) - { - ImageButton aButton = (ImageButton )aView; - if (isLandscape) - { - aButton.setMinimumWidth (aHeight); - } - else - { - aButton.setMinimumHeight (aWidth); - } - } - } - if (isLandscape) - { - aResultSize = aHeight; - } - else - { - aResultSize = aWidth; - } - return aResultSize; - } - - //! OCCT major version - private native long cppOcctMajorVersion(); - - //! OCCT minor version - private native long cppOcctMinorVersion(); - - //! OCCT micro version - private native long cppOcctMicroVersion(); - - private OcctJniView myOcctView; - private TextView myMessageTextView; - private String myLastPath; - private OcctJniFileDialog myFileOpenDialog; - private int myButtonPreferSize = 65; - -} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniFileDialog.java opencascade-7.5.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniFileDialog.java --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniFileDialog.java 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniFileDialog.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,376 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -package com.opencascade.jnisample; - -import java.io.File; -import java.io.FilenameFilter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import com.opencascade.jnisample.ListenerList.FireHandler; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; -import android.graphics.Color; -import android.os.Environment; -import android.view.View; -import android.view.ViewGroup.LayoutParams; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.EditText; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.Spinner; - -//! Simple open file dialog -public class OcctJniFileDialog -{ - - public enum DialogMode - { - FileOpen, FileExport, FileSave - } - - private static final String PARENT_DIR = ".."; - private String[] myFileList; - private File myCurrentPath; - private DialogMode myDialogMode = DialogMode.FileOpen; - - private ListenerList myFileListenerList = new ListenerList(); - private ListenerList myDialogDismissedList = new ListenerList(); - private final Activity myActivity; - private List myFileEndsWith; - private EditText myFileNameInput; - private Spinner myFileExtSpinner; - int myCurrentExtPositionInList = 0; - - public interface FileSelectedListener - { - void fileSelected (File theFile); - } - - public interface DialogDismissedListener - { - void dialogDismissed(); - } - - //! Main constructor. - public OcctJniFileDialog (Activity theActivity, - File thePath) - { - myActivity = theActivity; - if (!thePath.exists()) - { - thePath = Environment.getExternalStorageDirectory(); - } - loadFileList (thePath); - } - - //! Create new dialog - public Dialog createFileDialog() - { - final Object[] anObjWrapper = new Object[1]; - Dialog aDialog = null; - AlertDialog.Builder aBuilder = new AlertDialog.Builder (myActivity); - - aBuilder.setTitle (myCurrentPath.getPath()); - LinearLayout aTitleLayout = new LinearLayout (myActivity); - aTitleLayout.setLayoutParams (new LinearLayout.LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); - aTitleLayout.setOrientation (LinearLayout.VERTICAL); - - ListView list = new ListView (myActivity); - list.setScrollingCacheEnabled(false); - list.setBackgroundColor (Color.parseColor ("#33B5E5")); - - list.setAdapter (new ArrayAdapter (myActivity, android.R.layout.select_dialog_item, myFileList)); - list.setOnItemClickListener (new AdapterView.OnItemClickListener () - { - - public void onItemClick (AdapterView arg0, View view, int pos, long id) - { - String fileChosen = myFileList[pos]; - File aChosenFile = getChosenFile (fileChosen); - if (aChosenFile.isDirectory()) - { - loadFileList (aChosenFile); - ((Dialog )anObjWrapper[0]).cancel(); - ((Dialog )anObjWrapper[0]).dismiss(); - showDialog(); - } - else - { - if (myDialogMode == DialogMode.FileOpen) - { - ((Dialog )anObjWrapper[0]).cancel(); - ((Dialog )anObjWrapper[0]).dismiss(); - fireFileSelectedEvent (aChosenFile); - } - else - { - myFileNameInput.setText (aChosenFile.getName()); - } - } - } - }); - list.setLayoutParams (new LinearLayout.LayoutParams (LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 0.6f)); - aTitleLayout.addView (list); - - if (myDialogMode == DialogMode.FileSave - || myDialogMode == DialogMode.FileExport) - { - myFileNameInput = new EditText (myActivity); - myFileExtSpinner = new Spinner (myActivity); - ArrayAdapter adapter = null; - if (myDialogMode == DialogMode.FileExport) - { - adapter = ArrayAdapter.createFromResource (myActivity, R.array.ext_to_exp, - android.R.layout.simple_spinner_item); - } - else - { - adapter = ArrayAdapter.createFromResource (myActivity, R.array.ext_to_save, - android.R.layout.simple_spinner_item); - } - // Specify the layout to use when the list of choices appears - adapter.setDropDownViewResource (android.R.layout.simple_spinner_dropdown_item); - // Apply the adapter to the spinner - myFileExtSpinner.setAdapter (adapter); - myFileExtSpinner.setSelection (myCurrentExtPositionInList); - - myFileExtSpinner.setOnItemSelectedListener (new AdapterView.OnItemSelectedListener() - { - - @Override - public void onNothingSelected (AdapterView theParentView) - { - // your code here - } - - @Override - public void onItemSelected (AdapterView theParent, View theView, int thePosition, long theId) - { - if (myCurrentExtPositionInList != thePosition) - { - myCurrentExtPositionInList = thePosition; - setFileEndsWith (Arrays.asList (myFileExtSpinner.getSelectedItem().toString())); - loadFileList (myCurrentPath); - ((Dialog )anObjWrapper[0]).cancel(); - ((Dialog )anObjWrapper[0]).dismiss(); - showDialog(); - } - } - }); - - myFileExtSpinner.setLayoutParams (new LinearLayout.LayoutParams (LayoutParams.MATCH_PARENT, - LayoutParams.WRAP_CONTENT, 0.2f)); - // titleLayout.addView(fileExtSpinner); - myFileNameInput.setLayoutParams (new LinearLayout.LayoutParams (LayoutParams.MATCH_PARENT, - LayoutParams.WRAP_CONTENT, 0.2f)); - LinearLayout aControlsView = new LinearLayout (myActivity); - - aControlsView.addView (myFileNameInput); - aControlsView.addView (myFileExtSpinner); - - aTitleLayout.addView (aControlsView); - aBuilder.setView (aTitleLayout); - aBuilder.setPositiveButton ("OK", new DialogInterface.OnClickListener() - { - @Override - public void onClick (DialogInterface theDialog, int theWhich) - { - if (theWhich >= 0) - { - String aFileChosen = myFileList[theWhich]; - File aChosenFile = getChosenFile (aFileChosen); - fireFileSelectedEvent (aChosenFile); - } - } - }).setNegativeButton ("Cancel", null); - } - else - { - aBuilder.setNegativeButton ("Cancel", null); - } - - aBuilder.setView (aTitleLayout); - - aDialog = aBuilder.show(); - aDialog.setOnDismissListener (new DialogInterface.OnDismissListener() - { - @Override - public void onDismiss (DialogInterface theDialog) - { - fireDialogDismissedEvent(); - } - }); - anObjWrapper[0] = aDialog; - return aDialog; - } - - public void addFileListener (FileSelectedListener theListener) - { - myFileListenerList.add (theListener); - } - - public void addDialogDismissedListener (DialogDismissedListener theListener) - { - myDialogDismissedList.add (theListener); - } - - //! Show file dialog - public void showDialog() - { - createFileDialog().show(); - } - - private void fireFileSelectedEvent (final File theFile) - { - myFileListenerList.fireEvent (new FireHandler() - { - public void fireEvent (FileSelectedListener theListener) - { - theListener.fileSelected (theFile); - } - }); - } - - private void fireDialogDismissedEvent() - { - myDialogDismissedList.fireEvent (new FireHandler() - { - public void fireEvent (DialogDismissedListener theListener) - { - theListener.dialogDismissed(); - } - }); - } - - private void loadFileList (File thePath) - { - myCurrentPath = thePath; - List aList = new ArrayList(); - if (thePath.exists()) - { - if (thePath.getParentFile() != null) - { - aList.add (PARENT_DIR); - } - FilenameFilter aFilter = new FilenameFilter() - { - public boolean accept (File theDir, String theFilename) - { - File aSel = new File (theDir, theFilename); - if (!aSel.canRead()) - { - return false; - } - boolean isEndWith = false; - if (myFileEndsWith != null) - { - for (String aFileExtIter : myFileEndsWith) - { - if (theFilename.toLowerCase().endsWith (aFileExtIter)) - { - isEndWith = true; - break; - } - } - } - return isEndWith || aSel.isDirectory(); - } - }; - String[] aFileList1 = thePath.list (aFilter); - if (aFileList1 != null) - { - for (String aFileIter : aFileList1) - { - aList.add (aFileIter); - } - } - } - myFileList = (String[] )aList.toArray (new String[] {}); - } - - private File getChosenFile (String theFileChosen) - { - if (theFileChosen.equals (PARENT_DIR)) - return myCurrentPath.getParentFile(); - else - return new File (myCurrentPath, theFileChosen); - } - - public void setFileEndsWith (String fileEndsWith) - { - if (myFileEndsWith == null) - { - myFileEndsWith = new ArrayList(); - } - if (myFileEndsWith.indexOf (fileEndsWith) == -1) - { - myFileEndsWith.add (fileEndsWith); - } - } - - public void setFileEndsWith (List theFileEndsWith) - { - myFileEndsWith = theFileEndsWith; - } - - public DialogMode DialogMode() - { - return myDialogMode; - } - - public void DialogMode (DialogMode theMode) - { - myDialogMode = theMode; - } -} - -class ListenerList -{ - private List myListenerList = new ArrayList(); - - public interface FireHandler - { - void fireEvent (L theListener); - } - - public void add (L theListener) - { - myListenerList.add (theListener); - } - - public void fireEvent (FireHandler theFireHandler) - { - List aCopy = new ArrayList (myListenerList); - for (L anIter : aCopy) - { - theFireHandler.fireEvent (anIter); - } - } - - public void remove (L theListener) - { - myListenerList.remove (theListener); - } - - public List getListenerList() - { - return myListenerList; - } -} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniLogger.java opencascade-7.5.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniLogger.java --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniLogger.java 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniLogger.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -package com.opencascade.jnisample; - -import java.util.concurrent.locks.ReentrantLock; - -import android.util.Log; -import android.widget.TextView; - -//! Auxiliary class for logging messages -public class OcctJniLogger -{ - - //! Setup text view - public static void setTextView (TextView theTextView) - { - if (myTextView != null) - { - myLog = myTextView.getText().toString(); - } - - myTextView = theTextView; - if (myTextView != null) - { - myTextView.setText (myLog); - myLog = ""; - } - } - - //! Interface implementation - public static void postMessage (String theText) - { - final String aCopy = new String (theText); - Log.e (myTag, theText); - - myMutex.lock(); - final TextView aView = myTextView; - if (aView == null) - { - myLog += aCopy; - myMutex.unlock(); - return; - } - - aView.post (new Runnable() - { - public void run() - { - aView.setText (aView.getText() + aCopy + "\n"); - } - }); - myMutex.unlock(); - } - - private static final String myTag = "occtJniViewer"; - private static final ReentrantLock myMutex = new ReentrantLock (true); - private static TextView myTextView = null; - private static String myLog = ""; - -} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniRenderer.java opencascade-7.5.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniRenderer.java --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniRenderer.java 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniRenderer.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,218 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -package com.opencascade.jnisample; - -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.opengles.GL10; - -import android.opengl.GLSurfaceView; - -//! Wrapper for C++ OCCT viewer. -public class OcctJniRenderer implements GLSurfaceView.Renderer -{ - - //! Wrapper for V3d_TypeOfOrientation - enum TypeOfOrientation - { - Xpos, // front - Ypos, // left - Zpos, // top - Xneg, // back - Yneg, // right - Zneg // bottom - }; - - //! Empty constructor. - OcctJniRenderer() - { - if (OcctJniActivity.areNativeLoaded) - { - myCppViewer = cppCreate(); - } - } - - //! Open file. - public void open (String thePath) - { - if (myCppViewer != 0) - { - cppOpen (myCppViewer, thePath); - } - } - - //! Update viewer. - public void onDrawFrame (GL10 theGl) - { - if (myCppViewer != 0) - { - cppRedraw (myCppViewer); - } - } - - //! (re)initialize viewer. - public void onSurfaceChanged (GL10 theGl, int theWidth, int theHeight) - { - if (myCppViewer != 0) - { - cppResize (myCppViewer, theWidth, theHeight); - } - } - - public void onSurfaceCreated (GL10 theGl, EGLConfig theEglConfig) - { - if (myCppViewer != 0) - { - cppInit (myCppViewer); - } - } - - //! Initialize rotation (remember first point position) - public void onStartRotation (int theStartX, int theStartY) - { - if (myCppViewer != 0) - { - cppStartRotation (myCppViewer, theStartX, theStartY); - } - } - - //! Perform rotation (relative to first point) - public void onRotation (int theX, int theY) - { - if (myCppViewer != 0) - { - cppOnRotation (myCppViewer, theX, theY); - } - } - - //! Perform panning - public void onPanning (int theDX, int theDY) - { - if (myCppViewer != 0) - { - cppOnPanning (myCppViewer, theDX, theDY); - } - } - - //! Perform selection - public void onClick (int theX, int theY) - { - if (myCppViewer != 0) - { - cppOnClick (myCppViewer, theX, theY); - } - } - - //! Stop previously active action (e.g. discard first rotation point) - public void onStopAction() - { - if (myCppViewer != 0) - { - cppStopAction (myCppViewer); - } - } - - //! Fit All - public void fitAll() - { - if (myCppViewer != 0) - { - cppFitAll (myCppViewer); - } - } - - //! Move camera - public void setProj (TypeOfOrientation theProj) - { - if (myCppViewer == 0) - { - return; - } - - switch (theProj) - { - case Xpos: cppSetXposProj (myCppViewer); break; - case Ypos: cppSetYposProj (myCppViewer); break; - case Zpos: cppSetZposProj (myCppViewer); break; - case Xneg: cppSetXnegProj (myCppViewer); break; - case Yneg: cppSetYnegProj (myCppViewer); break; - case Zneg: cppSetZnegProj (myCppViewer); break; - } - } - - //! Post message to the text view. - public void postMessage (String theText) - { - OcctJniLogger.postMessage (theText); - } - - //! Create instance of C++ class - private native long cppCreate(); - - //! Destroy instance of C++ class - private native void cppDestroy (long theCppPtr); - - //! Initialize OCCT viewer (steal OpenGL ES context bound to this thread) - private native void cppInit (long theCppPtr); - - //! Resize OCCT viewer - private native void cppResize (long theCppPtr, int theWidth, int theHeight); - - //! Open CAD file - private native void cppOpen (long theCppPtr, String thePath); - - //! Handle detection in the viewer - private native void cppMoveTo (long theCppPtr, int theX, int theY); - - //! Redraw OCCT viewer - private native void cppRedraw (long theCppPtr); - - //! Fit All - private native void cppFitAll (long theCppPtr); - - //! Move camera - private native void cppSetXposProj (long theCppPtr); - - //! Move camera - private native void cppSetYposProj (long theCppPtr); - - //! Move camera - private native void cppSetZposProj (long theCppPtr); - - //! Move camera - private native void cppSetXnegProj (long theCppPtr); - - //! Move camera - private native void cppSetYnegProj (long theCppPtr); - - //! Move camera - private native void cppSetZnegProj (long theCppPtr); - - //! Initialize rotation - private native void cppStartRotation (long theCppPtr, int theStartX, int theStartY); - - //! Perform rotation - private native void cppOnRotation (long theCppPtr, int theX, int theY); - - //! Perform panning - private native void cppOnPanning (long theCppPtr, int theDX, int theDY); - - //! Perform selection - private native void cppOnClick (long theCppPtr, int theX, int theY); - - //! Stop action (rotation / panning / scaling) - private native void cppStopAction (long theCppPtr); - - private long myCppViewer = 0; //!< pointer to c++ class instance - -} diff -Nru opencascade-7.4.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniView.java opencascade-7.5.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniView.java --- opencascade-7.4.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniView.java 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/java/jniviewer/src/com/opencascade/jnisample/OcctJniView.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,332 +0,0 @@ -// Copyright (c) 2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -package com.opencascade.jnisample; - -import android.app.ActionBar.LayoutParams; -import android.content.Context; -import android.graphics.PointF; -import android.opengl.GLSurfaceView; -import android.util.AttributeSet; -import android.util.SparseArray; -import android.view.MotionEvent; -import android.widget.RelativeLayout; - -import javax.microedition.khronos.egl.EGL10; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.egl.EGLContext; -import javax.microedition.khronos.egl.EGLDisplay; - -//! OpenGL ES 2.0+ view. -//! Performs rendering in parallel thread. -class OcctJniView extends GLSurfaceView -{ - - // ! Default constructor. - public OcctJniView (Context theContext, - AttributeSet theAttrs) - { - super (theContext, theAttrs); - - setPreserveEGLContextOnPause (true); - setEGLContextFactory (new ContextFactory()); - setEGLConfigChooser (new ConfigChooser()); - - RelativeLayout.LayoutParams aLParams = new RelativeLayout.LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); - aLParams.addRule (RelativeLayout.ALIGN_TOP); - - myRenderer = new OcctJniRenderer(); - setRenderer (myRenderer); - } - - //! Open file. - public void open (String thePath) - { - final String aPath = thePath; - queueEvent (new Runnable() { public void run() { myRenderer.open (aPath); }}); - } - - //! Create OpenGL ES 2.0+ context - private static class ContextFactory implements GLSurfaceView.EGLContextFactory - { - private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098; - public EGLContext createContext (EGL10 theEgl, - EGLDisplay theEglDisplay, - EGLConfig theEglConfig) - { - if (theEglConfig == null) - { - return null; - } - - // reset EGL errors stack - int anError = EGL10.EGL_SUCCESS; - while ((anError = theEgl.eglGetError()) != EGL10.EGL_SUCCESS) {} - - int[] anAttribs = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE }; - EGLContext aEglContext = theEgl.eglCreateContext (theEglDisplay, theEglConfig, EGL10.EGL_NO_CONTEXT, anAttribs); - - while ((anError = theEgl.eglGetError()) != EGL10.EGL_SUCCESS) - { - OcctJniLogger.postMessage ("Error: eglCreateContext() " + String.format ("0x%x", anError)); - } - return aEglContext; - } - - public void destroyContext (EGL10 theEgl, - EGLDisplay theEglDisplay, - EGLContext theEglContext) - { - theEgl.eglDestroyContext (theEglDisplay, theEglContext); - } - } - - //! Search for RGB24 config with depth and stencil buffers - private static class ConfigChooser implements GLSurfaceView.EGLConfigChooser - { - //! Reset EGL errors stack - private void popEglErrors (EGL10 theEgl) - { - int anError = EGL10.EGL_SUCCESS; - while ((anError = theEgl.eglGetError()) != EGL10.EGL_SUCCESS) - { - OcctJniLogger.postMessage ("EGL Error: " + String.format ("0x%x", anError)); - } - } - - //! Auxiliary method to dump EGL configuration - for debugging purposes - @SuppressWarnings("unused") - private void printConfig (EGL10 theEgl, - EGLDisplay theEglDisplay, - EGLConfig theEglConfig) - { - int[] THE_ATTRIBS = - { - EGL10.EGL_BUFFER_SIZE, EGL10.EGL_ALPHA_SIZE, EGL10.EGL_BLUE_SIZE, EGL10.EGL_GREEN_SIZE, EGL10.EGL_RED_SIZE, EGL10.EGL_DEPTH_SIZE, EGL10.EGL_STENCIL_SIZE, - EGL10.EGL_CONFIG_CAVEAT, - EGL10.EGL_CONFIG_ID, - EGL10.EGL_LEVEL, - EGL10.EGL_MAX_PBUFFER_HEIGHT, EGL10.EGL_MAX_PBUFFER_PIXELS, EGL10.EGL_MAX_PBUFFER_WIDTH, - EGL10.EGL_NATIVE_RENDERABLE, EGL10.EGL_NATIVE_VISUAL_ID, EGL10.EGL_NATIVE_VISUAL_TYPE, - 0x3030, // EGL10.EGL_PRESERVED_RESOURCES, - EGL10.EGL_SAMPLES, EGL10.EGL_SAMPLE_BUFFERS, - EGL10.EGL_SURFACE_TYPE, - EGL10.EGL_TRANSPARENT_TYPE, EGL10.EGL_TRANSPARENT_RED_VALUE, EGL10.EGL_TRANSPARENT_GREEN_VALUE, EGL10.EGL_TRANSPARENT_BLUE_VALUE, - 0x3039, 0x303A, // EGL10.EGL_BIND_TO_TEXTURE_RGB, EGL10.EGL_BIND_TO_TEXTURE_RGBA, - 0x303B, 0x303C, // EGL10.EGL_MIN_SWAP_INTERVAL, EGL10.EGL_MAX_SWAP_INTERVAL - EGL10.EGL_LUMINANCE_SIZE, EGL10.EGL_ALPHA_MASK_SIZE, - EGL10.EGL_COLOR_BUFFER_TYPE, EGL10.EGL_RENDERABLE_TYPE, - 0x3042 // EGL10.EGL_CONFORMANT - }; - String[] THE_NAMES = - { - "EGL_BUFFER_SIZE", "EGL_ALPHA_SIZE", "EGL_BLUE_SIZE", "EGL_GREEN_SIZE", "EGL_RED_SIZE", "EGL_DEPTH_SIZE", "EGL_STENCIL_SIZE", - "EGL_CONFIG_CAVEAT", - "EGL_CONFIG_ID", - "EGL_LEVEL", - "EGL_MAX_PBUFFER_HEIGHT", "EGL_MAX_PBUFFER_PIXELS", "EGL_MAX_PBUFFER_WIDTH", - "EGL_NATIVE_RENDERABLE", "EGL_NATIVE_VISUAL_ID", "EGL_NATIVE_VISUAL_TYPE", - "EGL_PRESERVED_RESOURCES", - "EGL_SAMPLES", "EGL_SAMPLE_BUFFERS", - "EGL_SURFACE_TYPE", - "EGL_TRANSPARENT_TYPE", "EGL_TRANSPARENT_RED_VALUE", "EGL_TRANSPARENT_GREEN_VALUE", "EGL_TRANSPARENT_BLUE_VALUE", - "EGL_BIND_TO_TEXTURE_RGB", "EGL_BIND_TO_TEXTURE_RGBA", - "EGL_MIN_SWAP_INTERVAL", "EGL_MAX_SWAP_INTERVAL", - "EGL_LUMINANCE_SIZE", "EGL_ALPHA_MASK_SIZE", - "EGL_COLOR_BUFFER_TYPE", "EGL_RENDERABLE_TYPE", - "EGL_CONFORMANT" - }; - int[] aValue = new int[1]; - for (int anAttrIter = 0; anAttrIter < THE_ATTRIBS.length; ++anAttrIter) - { - int anAttr = THE_ATTRIBS[anAttrIter]; - String aName = THE_NAMES [anAttrIter]; - if (theEgl.eglGetConfigAttrib (theEglDisplay, theEglConfig, anAttr, aValue)) - { - OcctJniLogger.postMessage (String.format (" %s: %d\n", aName, aValue[0])); - } - else - { - popEglErrors (theEgl); - } - } - } - - //! Interface implementation - public EGLConfig chooseConfig (EGL10 theEgl, - EGLDisplay theEglDisplay) - { - int EGL_OPENGL_ES2_BIT = 4; - int[] aCfgAttribs = - { - EGL10.EGL_RED_SIZE, 8, - EGL10.EGL_GREEN_SIZE, 8, - EGL10.EGL_BLUE_SIZE, 8, - EGL10.EGL_ALPHA_SIZE, 0, - EGL10.EGL_DEPTH_SIZE, 24, - EGL10.EGL_STENCIL_SIZE, 8, - EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - EGL10.EGL_NONE - }; - - EGLConfig aConfigs[] = new EGLConfig[1]; - int[] aNbConfigs = new int[1]; - if (!theEgl.eglChooseConfig (theEglDisplay, aCfgAttribs, aConfigs, 1, aNbConfigs) - || aConfigs[0] == null) - { - aCfgAttribs[4 * 2 + 1] = 16; // try config with smaller depth buffer - popEglErrors (theEgl); - if (!theEgl.eglChooseConfig (theEglDisplay, aCfgAttribs, aConfigs, 1, aNbConfigs) - || aConfigs[0] == null) - { - OcctJniLogger.postMessage ("Error: eglChooseConfig() has failed!"); - return null; - } - } - - //printConfig (theEgl, theEglDisplay, aConfigs[0]); - return aConfigs[0]; - } - } - - //! Callback to handle touch events - @Override public boolean onTouchEvent (MotionEvent theEvent) - { - int aPointerIndex = theEvent.getActionIndex(); - int aPointerId = theEvent.getPointerId (aPointerIndex); - int aMaskedAction = theEvent.getActionMasked(); - switch (aMaskedAction) - { - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_POINTER_DOWN: - { - PointF aPntLast = null; - if (myActivePointers.size() >= 1) - { - aPntLast = myActivePointers.get (myActivePointers.keyAt (0)); - } - - final PointF aPnt = new PointF(); - aPnt.x = theEvent.getX (aPointerIndex); - aPnt.y = theEvent.getY (aPointerIndex); - myActivePointers.put (aPointerId, aPnt); - - switch (myActivePointers.size()) - { - case 1: - { - final int aStartX = (int )aPnt.x; - final int aStartY = (int )aPnt.y; - queueEvent (new Runnable() { public void run() { myRenderer.onStartRotation (aStartX, aStartY); }}); - break; - } - case 2: - { - myPanFrom.x = (aPntLast.x + aPnt.x) * 0.5f; - myPanFrom.y = (aPntLast.y + aPnt.y) * 0.5f; - break; - } - } - - break; - } - case MotionEvent.ACTION_MOVE: - { - for (int aNbPointers = theEvent.getPointerCount(), aPntIter = 0; aPntIter < aNbPointers; ++aPntIter) - { - PointF aPnt = myActivePointers.get (theEvent.getPointerId (aPntIter)); - if (aPnt != null) - { - aPnt.x = theEvent.getX (aPntIter); - aPnt.y = theEvent.getY (aPntIter); - } - } - - switch (myActivePointers.size()) - { - case 1: - { - PointF aPnt = myActivePointers.get (theEvent.getPointerId (0)); - final int anX = (int )aPnt.x; - final int anY = (int )aPnt.y; - queueEvent (new Runnable() { public void run() { myRenderer.onRotation (anX, anY); }}); - break; - } - case 2: - { - PointF aPnt1 = myActivePointers.get (myActivePointers.keyAt (0)); - PointF aPnt2 = myActivePointers.get (myActivePointers.keyAt (1)); - PointF aPntAver = new PointF ((aPnt1.x + aPnt2.x) * 0.5f, - (aPnt1.y + aPnt2.y) * 0.5f); - final int aDX = (int )(aPntAver.x - myPanFrom.x); - final int aDY = (int )(myPanFrom.y -aPntAver.y); - myPanFrom.x = aPntAver.x; - myPanFrom.y = aPntAver.y; - queueEvent (new Runnable() { public void run() { myRenderer.onPanning (aDX, aDY); }}); - } - } - break; - } - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_POINTER_UP: - case MotionEvent.ACTION_CANCEL: - { - myActivePointers.remove (aPointerId); - if (myActivePointers.size() == 0) - { - final int aPressX = (int )theEvent.getX (aPointerIndex); - final int aPressY = (int )theEvent.getY (aPointerIndex); - double aPressTimeMs = theEvent.getEventTime() - theEvent.getDownTime(); - if (aPressTimeMs < 100.0) - { - queueEvent (new Runnable() { public void run() { myRenderer.onClick (aPressX, aPressY); }}); - break; - } - } - else if (myActivePointers.size() == 1) - { - PointF aPnt = myActivePointers.get (myActivePointers.keyAt (0)); - final int aStartX = (int )aPnt.x; - final int aStartY = (int )aPnt.y; - queueEvent (new Runnable() { public void run() { myRenderer.onStartRotation (aStartX, aStartY); }}); - } - //queueEvent (new Runnable() { public void run() { myRenderer.onStopAction(); }}); - break; - } - } - ///invalidate(); - return true; - } - - //! Fit All - public void fitAll() - { - queueEvent (new Runnable() { public void run() { myRenderer.fitAll(); }}); - } - - //! Move camera - public void setProj (final OcctJniRenderer.TypeOfOrientation theProj) - { - queueEvent (new Runnable() { public void run() { myRenderer.setProj (theProj); }}); - } - - //! OCCT viewer - private OcctJniRenderer myRenderer = null; - - //! Touch events cache - private SparseArray myActivePointers = new SparseArray(); - - //! Starting point for panning event - private PointF myPanFrom = new PointF (0.0f, 0.0f); - -} diff -Nru opencascade-7.4.1+dfsg1/samples/ocafsamples/TDocStd_Sample.cxx opencascade-7.5.1+dfsg1/samples/ocafsamples/TDocStd_Sample.cxx --- opencascade-7.4.1+dfsg1/samples/ocafsamples/TDocStd_Sample.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/ocafsamples/TDocStd_Sample.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,6 @@ #include #include #include -#include // ==================================================================================== // This sample contains template for typical actions with OCAF document at application @@ -33,23 +32,7 @@ //...Creating application - Handle(TDocStd_Application) app; - - // the application is now handled by the CDF_Session variable - - - //...Retrieving the application - - - if (!CDF_Session::Exists()) { - Handle(CDF_Session) S = CDF_Session::CurrentSession(); - if (!S->HasCurrentApplication()) - Standard_DomainError::Raise("DDocStd::Find no applicative session"); - app = Handle(TDocStd_Application)::DownCast(S->CurrentApplication()); - } - else { - // none active application - } + Handle(TDocStd_Application) app = new TDocStd_Application; //...Creating the new document (document conatins a framework) diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve2d_AIS.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve2d_AIS.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve2d_AIS.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve2d_AIS.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,147 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "AdaptorCurve2d_AIS.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +AdaptorCurve2d_AIS::AdaptorCurve2d_AIS (const Handle(Geom2d_Curve)& theGeom2dCurve, + const Aspect_TypeOfLine theTypeOfLine, + const Aspect_WidthOfLine theWidthOfLine) +: myGeom2dCurve (theGeom2dCurve), + myTypeOfLine (theTypeOfLine), + myWidthOfLine (theWidthOfLine), + myDisplayPole (Standard_True), + myDisplayCurbure (Standard_False), + myDiscretisation (20), + myradiusmax (10), + myradiusratio (1) +{ + // +} + +void AdaptorCurve2d_AIS::Compute (const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) +{ + if (theMode != 0) + { + return; + } + + Geom2dAdaptor_Curve anAdaptor(myGeom2dCurve); + GCPnts_QuasiUniformDeflection anEdgeDistrib(anAdaptor, 1.e-2); + if (anEdgeDistrib.IsDone()) + { + Handle(Graphic3d_ArrayOfPolylines) aCurve = new Graphic3d_ArrayOfPolylines(anEdgeDistrib.NbPoints()); + for (Standard_Integer i = 1; i <= anEdgeDistrib.NbPoints(); ++i) + { + aCurve->AddVertex(anEdgeDistrib.Value(i)); + } + + Handle(Graphic3d_Group) aPrsGroup = thePrs->NewGroup(); + aPrsGroup->SetGroupPrimitivesAspect(myDrawer->LineAspect()->Aspect()); + aPrsGroup->AddPrimitiveArray(aCurve); + } + + if (myDisplayPole) + { + if (anAdaptor.GetType() == GeomAbs_BezierCurve) + { + Handle(Geom2d_BezierCurve) aBezier = anAdaptor.Bezier(); + Handle(Graphic3d_ArrayOfPolylines) anArrayOfVertex = new Graphic3d_ArrayOfPolylines(aBezier->NbPoles()); + for (int i = 1; i <= aBezier->NbPoles(); i++) + { + gp_Pnt2d CurrentPoint = aBezier->Pole(i); + anArrayOfVertex->AddVertex(CurrentPoint.X(), CurrentPoint.Y(), 0.); + } + + Handle(Graphic3d_Group) aPrsGroup = thePrs->NewGroup(); + aPrsGroup->SetGroupPrimitivesAspect(myDrawer->LineAspect()->Aspect()); + aPrsGroup->AddPrimitiveArray(anArrayOfVertex); + } + + if (anAdaptor.GetType() == GeomAbs_BSplineCurve) + { + Handle(Geom2d_BSplineCurve) aBSpline = anAdaptor.BSpline(); + Handle(Graphic3d_ArrayOfPolylines) anArrayOfVertex = new Graphic3d_ArrayOfPolylines(aBSpline->NbPoles()); + for (int i = 1; i <= aBSpline->NbPoles(); i++) + { + gp_Pnt2d CurrentPoint = aBSpline->Pole(i); + anArrayOfVertex->AddVertex(CurrentPoint.X(), CurrentPoint.Y(), 0.); + } + + Handle(Graphic3d_Group) aPrsGroup = thePrs->NewGroup(); + aPrsGroup->SetGroupPrimitivesAspect(myDrawer->LineAspect()->Aspect()); + aPrsGroup->AddPrimitiveArray(anArrayOfVertex); + } + } + + if (myDisplayCurbure && (anAdaptor.GetType() != GeomAbs_Line)) + { + const Standard_Integer nbintv = anAdaptor.NbIntervals(GeomAbs_CN); + TColStd_Array1OfReal TI(1, nbintv + 1); + anAdaptor.Intervals(TI, GeomAbs_CN); + Standard_Real Resolution = 1.0e-9, Curvature; + Geom2dLProp_CLProps2d LProp(myGeom2dCurve, 2, Resolution); + gp_Pnt2d P1, P2; + + Handle(Graphic3d_Group) aPrsGroup = thePrs->NewGroup(); + aPrsGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect()); + for (Standard_Integer intrv = 1; intrv <= nbintv; intrv++) + { + Standard_Real t = TI(intrv); + Standard_Real step = (TI(intrv + 1) - t) / GetDiscretisation(); + Standard_Real LRad, ratio; + for (Standard_Integer ii = 1; ii <= myDiscretisation; ii++) + { + LProp.SetParameter(t); + if (LProp.IsTangentDefined()) + { + Curvature = Abs(LProp.Curvature()); + if (Curvature > Resolution) + { + myGeom2dCurve->D0(t, P1); + LRad = 1. / Curvature; + ratio = ((LRad > myradiusmax) ? myradiusmax / LRad : 1); + ratio *= myradiusratio; + LProp.CentreOfCurvature(P2); + gp_Vec2d V(P1, P2); + gp_Pnt2d P3 = P1.Translated(ratio*V); + Handle(Graphic3d_ArrayOfPolylines) aSegment = new Graphic3d_ArrayOfPolylines(2); + aSegment->AddVertex(P1.X(), P1.Y(), 0.); + aSegment->AddVertex(P3.X(), P3.Y(), 0.); + aPrsGroup->AddPrimitiveArray(aSegment); + } + } + t += step; + } + } + } +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve2d_AIS.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve2d_AIS.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve2d_AIS.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve2d_AIS.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,77 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef ADAPTOR_CURVE2D_AIS_H +#define ADAPTOR_CURVE2D_AIS_H + +#include +#include +#include +#include + +//! AIS interactive Object for Geom2d_Curve +class AdaptorCurve2d_AIS : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTI_INLINE(AdaptorCurve2d_AIS, AIS_InteractiveObject) +public: + AdaptorCurve2d_AIS(const Handle(Geom2d_Curve)& theGeom2dCurve, + const Aspect_TypeOfLine theTypeOfline = Aspect_TOL_SOLID, + const Aspect_WidthOfLine theWidthOfLine = Aspect_WOL_MEDIUM); + + Standard_Integer NbPossibleSelection() const { return 1; } + Aspect_TypeOfLine GetTypeOfLine() const { return myTypeOfLine; } + void SetTypeOfLine(const Aspect_TypeOfLine aNewTypeOfLine) { myTypeOfLine = aNewTypeOfLine; } + Aspect_WidthOfLine GetWidthOfLine() const { return myWidthOfLine; } + void SetWidthOfLine(const Aspect_WidthOfLine aNewWidthOfLine) { myWidthOfLine = aNewWidthOfLine; } + Standard_Boolean GetDisplayPole() const { return myDisplayPole; } + void SetDisplayPole(const Standard_Boolean aNewDisplayPole) { myDisplayPole = aNewDisplayPole; } + Standard_Boolean GetDisplayCurbure() const { return myDisplayCurbure; } + void SetDisplayCurbure(const Standard_Boolean aNewDisplayCurbure) { myDisplayCurbure = aNewDisplayCurbure; } + Standard_Real GetDiscretisation() const { return myDiscretisation; } + void SetDiscretisation(const Standard_Real aNewDiscretisation) { myDiscretisation = aNewDiscretisation; } + +private: + //! Return TRUE for supported display modes (only 0 mode is supported). + virtual Standard_Boolean AcceptDisplayMode(const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; } + + //! Compute presentation. + virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) Standard_OVERRIDE; + + //! Compute selection (not implemented). + virtual void ComputeSelection (const Handle(SelectMgr_Selection)&, + const Standard_Integer) Standard_OVERRIDE {} + +private: + + Handle(Geom2d_Curve) myGeom2dCurve; + Aspect_TypeOfLine myTypeOfLine; + Aspect_WidthOfLine myWidthOfLine; + Standard_Boolean myDisplayPole; + Standard_Boolean myDisplayCurbure; + Standard_Real myDiscretisation; + Standard_Real myradiusmax; + Standard_Real myradiusratio; + +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve_AIS.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve_AIS.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve_AIS.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve_AIS.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,49 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "AdaptorCurve_AIS.h" + +#include +#include +#include +#include + +void AdaptorCurve_AIS::Compute (const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) +{ + GeomAdaptor_Curve anAdaptorCurve(myCurve); + switch (theMode) + { + case 1: + { + Handle(Prs3d_Drawer) aPoleDrawer = new Prs3d_Drawer(); + aPoleDrawer->SetLineAspect(new Prs3d_LineAspect(Quantity_NOC_RED, Aspect_TOL_SOLID, 1.0)); + StdPrs_PoleCurve::Add(thePrs, anAdaptorCurve, aPoleDrawer); + } + Standard_FALLTHROUGH + case 0: + { + StdPrs_Curve::Add(thePrs, anAdaptorCurve, myDrawer); + break; + } + } +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve_AIS.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve_AIS.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve_AIS.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorCurve_AIS.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,52 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef ADAPTOR_CURVE_AIS_H +#define ADAPTOR_CURVE_AIS_H + +#include +#include + +//! AIS interactive Object for Geom_Curve +class AdaptorCurve_AIS : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTI_INLINE(AdaptorCurve_AIS, AIS_InteractiveObject) +public: + AdaptorCurve_AIS (const Handle(Geom_Curve)& theCurve) : myCurve(theCurve) {} +private: + + //! Return TRUE for supported display modes (modes 0 and 1 are supported). + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0 || theMode == 1; } + + //! Compute presentation. + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) Standard_OVERRIDE; + + //! Compute selection (not implemented). + virtual void ComputeSelection (const Handle(SelectMgr_Selection)&, + const Standard_Integer) Standard_OVERRIDE {} + +private: + Handle(Geom_Curve) myCurve; +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorPnt2d_AIS.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorPnt2d_AIS.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorPnt2d_AIS.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorPnt2d_AIS.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,38 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "AdaptorPnt2d_AIS.h" + +#include +#include + +void AdaptorPnt2d_AIS::Compute (const Handle(PrsMgr_PresentationManager3d)& , + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) +{ + if (theMode != 0) + { + return; + } + + Handle(Geom_CartesianPoint) aGeomPoint = new Geom_CartesianPoint(myPoint); + StdPrs_Point::Add (thePrs, aGeomPoint, myDrawer); +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorPnt2d_AIS.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorPnt2d_AIS.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorPnt2d_AIS.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorPnt2d_AIS.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,57 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef ADAPTOR_PNT2D_AIS_H +#define ADAPTOR_PNT2D_AIS_H + +#include +#include + +//! AIS interactive Object for Geom2d_Point +class AdaptorPnt2d_AIS : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTI_INLINE(AdaptorPnt2d_AIS, AIS_InteractiveObject) +public: + AdaptorPnt2d_AIS (const Handle(Geom2d_Point)& thePoint, + Standard_Real theElevation = 0) + : myPoint(thePoint->X(), thePoint->Y(), theElevation) {} + +private: + + //! Return TRUE for supported display modes (only mode 0 is supported). + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; } + + //! Compute presentation. + virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) Standard_OVERRIDE; + + //! Compute selection (not implemented). + virtual void ComputeSelection (const Handle(SelectMgr_Selection)&, + const Standard_Integer) Standard_OVERRIDE {} + +private: + + gp_Pnt myPoint; + +}; + +#endif // ADAPTOR_PNT2D_AIS_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorVec_AIS.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorVec_AIS.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorVec_AIS.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorVec_AIS.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,77 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "AdaptorVec_AIS.h" + +#include +#include +#include +#include +#include + +AdaptorVec_AIS::AdaptorVec_AIS (const gp_Pnt2d& thePnt1, + const gp_Pnt2d& thePnt2, + Standard_Real theArrowLength) +: myPnt (gp_Pnt (thePnt1.X(), thePnt1.Y(), 0.0)), + myLength (0.0), + myArrowLength (theArrowLength) +{ + gp_Vec aVec (thePnt2.X() - thePnt1.X(), thePnt2.Y() - thePnt1.Y(), 0.0); + myDir = gp_Dir(aVec); + myLength = aVec.Magnitude(); +} + +void AdaptorVec_AIS::Compute (const Handle(PrsMgr_PresentationManager3d)& , + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) +{ + if (theMode != 0) + { + return; + } + + // Set style for arrow + Handle(Prs3d_ArrowAspect) anArrowAspect = myDrawer->ArrowAspect(); + anArrowAspect->SetLength(myArrowLength); + + gp_Pnt aLastPoint = myPnt; + aLastPoint.Translate(myLength*gp_Vec(myDir)); + + // Draw Line + { + Handle(Graphic3d_Group) aLineGroup = thePrs->NewGroup(); + aLineGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect()); + Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); + aPrims->AddVertex(myPnt); + aPrims->AddVertex(aLastPoint); + aLineGroup->AddPrimitiveArray(aPrims); + + // Draw arrow + Prs3d_Arrow::Draw (aLineGroup, aLastPoint, myDir, anArrowAspect->Angle(), anArrowAspect->Length()); + } + + // Draw text + if (!myText.IsEmpty()) + { + gp_Pnt aTextPosition = aLastPoint; + Prs3d_Text::Draw (thePrs->NewGroup(), myDrawer->TextAspect(), myText, aTextPosition); + } +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorVec_AIS.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorVec_AIS.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/AdaptorVec_AIS.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/AdaptorVec_AIS.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,121 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef ADAPTOR_VEC_AIS_H +#define ADAPTOR_VEC_AIS_H + +#include + +//! AIS interactive Object for vector with arrow and text +class AdaptorVec_AIS : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTI_INLINE(AdaptorVec_AIS, AIS_InteractiveObject) +public: + + AdaptorVec_AIS() + : myLength (1.0), + myArrowLength (1.0) + {} + + AdaptorVec_AIS (const gp_Pnt& thePnt, + const gp_Dir& theDir, + Standard_Real theLength = 1, + Standard_Real theArrowLength = 1) + : myPnt (thePnt), + myDir (theDir), + myLength (theLength), + myArrowLength (theArrowLength) + { + // + } + + AdaptorVec_AIS (const gp_Pnt& thePnt, + const gp_Vec& theVec, + Standard_Real theArrowLength = 1) + : myPnt (thePnt), + myDir (theVec), + myLength (theVec.Magnitude()), + myArrowLength (theArrowLength) + { + // + } + + AdaptorVec_AIS (const gp_Pnt2d& thePnt2d, + const gp_Dir2d& theDir2d, + Standard_Real theLength = 1, + Standard_Real theArrowLength = 1) + : myPnt (gp_Pnt(thePnt2d.X(), thePnt2d.Y(), 0.0)), + myDir (gp_Dir(theDir2d.X(), theDir2d.Y(), 0.0)), + myLength (theLength), + myArrowLength (theArrowLength) + { + // + } + + AdaptorVec_AIS (const gp_Pnt2d& thePnt2d, + const gp_Vec2d& theVec2d, + Standard_Real theArrowLength = 1) + : myPnt (gp_Pnt(thePnt2d.X(), thePnt2d.Y(), 0.0)), + myDir (gp_Dir(theVec2d.X(), theVec2d.Y(), 0.0)), + myLength (theVec2d.Magnitude()), + myArrowLength (theArrowLength) + { + // + } + + AdaptorVec_AIS (const gp_Pnt2d& thePnt1, + const gp_Pnt2d& thePnt2, + Standard_Real theArrowLength = 1); + + void SetText (const TCollection_AsciiString& theText) + { + myText = theText; + } + + void SetLineAspect (const Handle(Prs3d_LineAspect)& theAspect) + { + myDrawer->SetLineAspect(theAspect); + } + +private: + + //! Return TRUE for supported display modes (only mode 0 is supported). + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; } + + //! Compute presentation. + virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) Standard_OVERRIDE; + + //! Compute selection (not implemented). + virtual void ComputeSelection (const Handle(SelectMgr_Selection)&, + const Standard_Integer) Standard_OVERRIDE {} + +private: + + gp_Pnt myPnt; + gp_Dir myDir; + Standard_Real myLength; + Standard_Real myArrowLength; + TCollection_AsciiString myText; +}; + +#endif // ADAPTOR_VEC2D_AIS_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/BaseSample.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/BaseSample.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/BaseSample.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/BaseSample.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,185 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "BaseSample.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +const TCollection_AsciiString BaseSample::FILE_EXTENSION = "cxx"; + +void BaseSample::Clear() +{ + myObject3d.Clear(); + myObject2d.Clear(); + myCode.Clear(); + myResult.str(""); +} + +TCollection_AsciiString BaseSample::GetResult() +{ + TCollection_AsciiString aResult(myResult.str().c_str()); + myResult.str(""); + return aResult; +} + +void BaseSample::AppendCube() +{ + Handle(AIS_ViewCube) aViewCube = new AIS_ViewCube(); + myObject3d.Append(aViewCube); +} + +void BaseSample::Process (const TCollection_AsciiString& theSampleName) +{ + myObject3d.Clear(); + myObject2d.Clear(); + myCode.Clear(); + myIsProcessed = Standard_False; + try + { + ExecuteSample(theSampleName); + if (!myObject3d.IsEmpty()) + { + Handle(AIS_ViewCube) aViewCube = new AIS_ViewCube(); + myObject3d.Append(aViewCube); + } + } + catch (...) + { + TraceError(TCollection_AsciiString("Error in sample: ") + theSampleName); + } +} + +void BaseSample::TraceError (const TCollection_AsciiString& theErrorMessage) +{ + Message::SendFail() << "\nERROR: " << theErrorMessage.ToCString() << std::endl; + myResult << "\nERROR: " << theErrorMessage << std::endl; +} + +void BaseSample::FindSourceCode (const TCollection_AsciiString& theSampleName) +{ + TCollection_AsciiString aClassName = DynamicType()->Name(); + char aSeparator = QDir::separator().toLatin1(); + TCollection_AsciiString aCxxFilePach = myCodePath + aSeparator + aClassName + '.' + FILE_EXTENSION; + OSD_File aCxxFile(aCxxFilePach); + try + { + const Standard_Integer aFileBufferSize = 100 * 1024; + TCollection_AsciiString aReadedText(aFileBufferSize); + aCxxFile.Open(OSD_ReadOnly, OSD_Protection()); + aCxxFile.Read(aReadedText, aFileBufferSize); + TCollection_AsciiString aRegexpTemplate = aClassName + "::" + theSampleName + "[\\n\\s]*\\([\\n\\s]*\\)[\\n\\s]*\\{"; + Standard_Integer aOpeningBracketPosition = findEndOfPhrase (aReadedText, aRegexpTemplate); + Standard_Integer aClosingBracketPosition = findClosingBracket (aReadedText, aOpeningBracketPosition, '}'); + myCode = aReadedText.SubString(aOpeningBracketPosition + 1, aClosingBracketPosition - 1); + } + catch (...) + { + TraceError(TCollection_AsciiString("Cannot open file: ") + aCxxFilePach); + } +} + +Standard_Integer BaseSample::findEndOfPhrase (const TCollection_AsciiString& theText, + const TCollection_AsciiString& theRegexpTemplate) +{ + Standard_Integer aIndexOfLastFoundSymbol = -1; + std::string aStdText = theText.ToCString(); + std::string aRegexpTemplate = theRegexpTemplate.ToCString(); + + try + { + std::regex aRegex(theRegexpTemplate.ToCString()); + + std::sregex_iterator aDetectIterator = std::sregex_iterator(aStdText.begin(), aStdText.end(), aRegex); + if (aDetectIterator != std::sregex_iterator()) + { + std::smatch aMatch = *aDetectIterator; + std::string aFoundString = aMatch.str(); + aIndexOfLastFoundSymbol = static_cast(aStdText.find(aFoundString) + aFoundString.length()); + } + else + { + TraceError(TCollection_AsciiString("No code found for template: ") + theRegexpTemplate); + } + } + catch (const std::regex_error& aRegError) + { + TraceError(TCollection_AsciiString("regex_error: ") + aRegError.what()); + } + catch (const std::exception& aEx) + { + TraceError(TCollection_AsciiString("common error: ") + aEx.what()); + } + catch (...) + { + TraceError("unknown error!"); + } + return aIndexOfLastFoundSymbol; +} + +Standard_Integer BaseSample::findClosingBracket (const TCollection_AsciiString& theText, + const Standard_Integer theOpeningBracketIndex, + Standard_Character theClosingBracketSymbol) +{ + // TODO this function not implemented at least 2 cases: + // - brackets in strings & chars + // - brackets in comments + Standard_Integer aClosingBracketIndex = -1; + Standard_Character anOpeningBracketSymbol = theText.Value(theOpeningBracketIndex); + TCollection_AsciiString aBracketsSet(theClosingBracketSymbol); + aBracketsSet += anOpeningBracketSymbol; + Standard_Integer aBracketDepth = 1; + Standard_Integer aStartFindIndex = theOpeningBracketIndex + 1; + //Standard_Character aStartFindChar = theText.Value(aStartFindIndex-1); + while (aBracketDepth) + { + aStartFindIndex = theText.FirstLocationInSet(aBracketsSet, aStartFindIndex, theText.Length()); + if (!aStartFindIndex) + { + TraceError("No closing bracket found!"); + break; + } + TCollection_AsciiString aRSubstr = theText.SubString(aStartFindIndex, theText.Length()); + if (theText.Value(aStartFindIndex) == anOpeningBracketSymbol) + aBracketDepth++; + else if (theText.Value(aStartFindIndex) == theClosingBracketSymbol) + aBracketDepth--; + if (!aBracketDepth) + { + aClosingBracketIndex = aStartFindIndex; + break; + } + aStartFindIndex++; + } + return aClosingBracketIndex; +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/BaseSample.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/BaseSample.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/BaseSample.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/BaseSample.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,87 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef BASESAMPLE_H +#define BASESAMPLE_H + +#include + +#include +#include +#include + +//! Base class for specified category classes +class BaseSample: public Standard_Transient +{ + DEFINE_STANDARD_RTTI_INLINE(BaseSample, Standard_Transient) +public: + BaseSample (const TCollection_AsciiString& theSampleSourcePath, + const Handle(AIS_InteractiveContext)& theContext) + : myCodePath (theSampleSourcePath), + myContext (theContext) + { + // + } + + void Clear(); + void AppendCube(); + + Standard_Boolean IsProcessed() const { return myIsProcessed; } + + const NCollection_Vector& Get2dObjects() const { return myObject2d; } + + const NCollection_Vector& Get3dObjects() const { return myObject3d; } + + TCollection_AsciiString GetResult(); + + TCollection_AsciiString GetCode() const { return myCode; } + + virtual void Process (const TCollection_AsciiString& theSampleName); + +protected: + virtual void ExecuteSample (const TCollection_AsciiString& theSampleName) = 0; + + void FindSourceCode (const TCollection_AsciiString& theSampleName); + void TraceError (const TCollection_AsciiString& theErrorMessage); + +protected: + + Standard_Boolean myIsProcessed; + NCollection_Vector myObject2d; + NCollection_Vector myObject3d; + + std::ostringstream myResult; + TCollection_AsciiString myCode; + TCollection_AsciiString myCodePath; + Handle(AIS_InteractiveContext) myContext; + +protected: + static const TCollection_AsciiString FILE_EXTENSION; + +private: + Standard_Integer findEndOfPhrase (const TCollection_AsciiString& theText, + const TCollection_AsciiString& theRegexpTemplate); + Standard_Integer findClosingBracket (const TCollection_AsciiString& theText, + Standard_Integer theOpeningBracketIndex, + Standard_Character theClosingBracketSymbol); +}; + +#endif //BASESAMPLE_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/DataExchangeSamples.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/DataExchangeSamples.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/DataExchangeSamples.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/DataExchangeSamples.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,422 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "DataExchangeSamples.h" + +#include "MakeBottle.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void DataExchangeSamples::Process (const TCollection_AsciiString& theSampleName) +{ + if (IsImportSample(theSampleName)) + { + myObject3d.Clear(); + } + myObject2d.Clear(); + myCode.Clear(); + myIsProcessed = Standard_False; + try + { + ExecuteSample(theSampleName); + } + catch (...) + { + TraceError(TCollection_AsciiString("Error in sample: ") + theSampleName); + } +} + +void DataExchangeSamples::AppendBottle() +{ + TopoDS_Shape aBottle = MakeBottle(50, 70, 30); + Handle(AIS_InteractiveObject) aShape = new AIS_Shape(aBottle); + myObject3d.Append(aShape); + Handle(AIS_ViewCube) aViewCube = new AIS_ViewCube(); + myObject3d.Append(aViewCube); + myResult << "A bottle shape was created." << std::endl; +} + +void DataExchangeSamples::ExecuteSample (const TCollection_AsciiString& theSampleName) +{ + Standard_Boolean anIsSamplePresent = Standard_True; + FindSourceCode(theSampleName); + if (theSampleName == "BrepExportSample") + { + BrepExportSample(); + } + else if (theSampleName == "StepExportSample") + { + StepExportSample(); + } + else if (theSampleName == "IgesExportSample") + { + IgesExportSample(); + } + else if (theSampleName == "StlExportSample") + { + StlExportSample(); + } + else if (theSampleName == "VrmlExportSample") + { + VrmlExportSample(); + } + else if (theSampleName == "ImageExportSample") + { + ImageExportSample(); + } + else if (theSampleName == "BrepImportSample") + { + BrepImportSample(); + } + else if (theSampleName == "StepImportSample") + { + StepImportSample(); + } + else if (theSampleName == "IgesImportSample") + { + IgesImportSample(); + } + else + { + myResult << "No function found: " << theSampleName; + myCode += TCollection_AsciiString("No function found: ") + theSampleName; + anIsSamplePresent = Standard_False; + } + myIsProcessed = anIsSamplePresent; +} + +void DataExchangeSamples::BrepExportSample() +{ + Standard_Boolean anIsShapeExist = Standard_False; + for(NCollection_Vector::Iterator anIter(myObject3d); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anObject = anIter.Value(); + if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject)) + { + anIsShapeExist = Standard_True; + if (BRepTools::Write(aShape->Shape(), myFileName.ToCString())) + { + myResult << "A shape was successfully written" << std::endl; + } + else + { + myResult << "A shape was not written" << std::endl; + } + break; // write only one shape + } + } + if (!anIsShapeExist) + { + myResult << "A shape does not exist" << std::endl; + } +} + +void DataExchangeSamples::StepExportSample() +{ + if (myStepType < 0) + { + myResult << "Unknown step type" << std::endl; + return; + } + + IFSelect_ReturnStatus aStatus; + + if (myStepType == STEPControl_FacetedBrep && !CheckFacetedBrep()) + { + myResult << "At least one shape doesn't contain facets" << std::endl; + return; + } + + STEPControl_Writer aStepWriter; + for(NCollection_Vector::Iterator anIter(myObject3d); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anObject = anIter.Value(); + if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject)) + { + aStatus = aStepWriter.Transfer(aShape->Shape(), myStepType); + if (aStatus != IFSelect_RetDone) + { + myResult << "A shape was not transferred successfully" << std::endl; + return; + } + } + } + aStatus = aStepWriter.Write(myFileName.ToCString()); + + switch (aStatus) + { + case IFSelect_RetError: + myResult << "Incorrect Data." << std::endl; + break; + case IFSelect_RetFail: + myResult << "Writing error" << std::endl; + break; + case IFSelect_RetVoid: + myResult << "Nothing to transfer." << std::endl; + break; + case IFSelect_RetStop: + case IFSelect_RetDone: + myResult << "A STEP file was successfully written" << std::endl; + break; + } + +} + +void DataExchangeSamples::IgesExportSample() +{ + IGESControl_Controller::Init(); + IGESControl_Writer anIgesWriter(Interface_Static::CVal("XSTEP.iges.unit"), + Interface_Static::IVal("XSTEP.iges.writebrep.mode")); + + Standard_Boolean anIsShapeExist = Standard_False; + for(NCollection_Vector::Iterator anIter(myObject3d); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anObject = anIter.Value(); + if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject)) + { + anIsShapeExist = Standard_True; + anIgesWriter.AddShape(aShape->Shape()); + } + } + if (anIsShapeExist) + { + anIgesWriter.ComputeModel(); + if (anIgesWriter.Write(myFileName.ToCString())) + { + myResult << "A STEP file was successfully written" << std::endl; + } + else + { + myResult << "A STEP file was not written" << std::endl; + } + } + else + { + myResult << "Shapes do not exist" << std::endl; + } +} + +void DataExchangeSamples::StlExportSample() +{ + TopoDS_Compound aTopoCompound; + BRep_Builder aBuilder; + aBuilder.MakeCompound(aTopoCompound); + + Standard_Boolean anIsShapeExist = Standard_False; + for(NCollection_Vector::Iterator anIter(myObject3d); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anObject = anIter.Value(); + if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject)) + { + anIsShapeExist = Standard_True; + aBuilder.Add(aTopoCompound, aShape->Shape()); + } + } + if (anIsShapeExist) + { + StlAPI_Writer aStlWriter; + if (aStlWriter.Write(aTopoCompound, myFileName.ToCString())) + { + myResult << "A STL file was successfully written" << std::endl; + } + else + { + myResult << "A STL file was not written" << std::endl; + } + } + else + { + myResult << "Shapes do not exist" << std::endl; + } +} + +void DataExchangeSamples::VrmlExportSample() +{ + TopoDS_Compound aTopoCompound; + BRep_Builder aBrepBuilder; + aBrepBuilder.MakeCompound(aTopoCompound); + + Standard_Boolean anIsShapeExist = Standard_False; + for(NCollection_Vector::Iterator anIter(myObject3d); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anObject = anIter.Value(); + if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject)) + { + anIsShapeExist = Standard_True; + aBrepBuilder.Add(aTopoCompound, aShape->Shape()); + } + } + if (anIsShapeExist) + { + VrmlAPI_Writer aVrmlWriter; + if (aVrmlWriter.Write(aTopoCompound, myFileName.ToCString())) + { + myResult << "A VRML file was successfully written" << std::endl; + } + else + { + myResult << "A VRML file was not written" << std::endl; + } + } + else + { + myResult << "Shapes do not exist" << std::endl; + } +} + +void DataExchangeSamples::ImageExportSample() +{ + if (myView) + { + Standard_Boolean aResult = myView->Dump(myFileName.ToCString()); + if (aResult) + { + myResult << "An image file was successfully written" << std::endl; + } + else + { + myResult << "An image file was not written" << std::endl; + } + } +} + +void DataExchangeSamples::BrepImportSample() +{ + TopoDS_Shape aTopoShape; + BRep_Builder aBuilder; + Standard_Boolean aResult = BRepTools::Read(aTopoShape, myFileName.ToCString(), aBuilder); + if (aResult) + { + Handle(AIS_Shape) anAisShape = new AIS_Shape(aTopoShape); + myObject3d.Append(anAisShape); + myResult << "A BREP file was read successfully" << std::endl; + } + else + { + myResult << "A BREP file was not read successfully" << std::endl; + } +} + +void DataExchangeSamples::StepImportSample() +{ + Handle(TopTools_HSequenceOfShape) aSequence = new TopTools_HSequenceOfShape(); + STEPControl_Reader aReader; + const IFSelect_ReturnStatus aStatus = aReader.ReadFile(myFileName.ToCString()); + if (aStatus != IFSelect_RetDone) + { + myResult << "A BREP file was not read successfully" << std::endl; + return; + } + + bool anIsFailsOnly = false; + aReader.PrintCheckLoad(anIsFailsOnly, IFSelect_ItemsByEntity); + + int aRootsNumber = aReader.NbRootsForTransfer(); + aReader.PrintCheckTransfer(anIsFailsOnly, IFSelect_ItemsByEntity); + for (Standard_Integer i = 1; i <= aRootsNumber; i++) + { + aReader.TransferRoot(i); + } + + int aShapesNumber = aReader.NbShapes(); + for (int i = 1; i <= aShapesNumber; i++) + { + TopoDS_Shape aTopoShape = aReader.Shape(i); + Handle(AIS_Shape) anAisShape = new AIS_Shape(aTopoShape); + myObject3d.Append(anAisShape); + } + myResult << "A STEP file was read successfully" << std::endl; +} + +void DataExchangeSamples::IgesImportSample() +{ + IGESControl_Reader aReader; + int status = aReader.ReadFile (myFileName.ToCString()); + if (status != IFSelect_RetDone) + { + myResult << "A IGES file was not read successfully" << std::endl; + return; + } + aReader.TransferRoots(); + TopoDS_Shape aTopoShape = aReader.OneShape(); + Handle(AIS_Shape) anAisShape = new AIS_Shape (aTopoShape); + myObject3d.Append(anAisShape); + myResult << "A IGES file was read successfully" << std::endl; +} + +Standard_Boolean DataExchangeSamples::CheckFacetedBrep() +{ + Standard_Boolean anError = Standard_False; + for(NCollection_Vector::Iterator anIter (myObject3d); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anObject = anIter.Value(); + if (Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast(anObject)) + { + const TopoDS_Shape aTopoShape = aShape->Shape(); + for (TopExp_Explorer aFaceExplorer(aTopoShape, TopAbs_FACE); aFaceExplorer.More() && !anError; aFaceExplorer.Next()) + { + Handle(Geom_Surface) aSurface = BRep_Tool::Surface(TopoDS::Face(aFaceExplorer.Current())); + if (!aSurface->IsKind(STANDARD_TYPE(Geom_Plane))) + { + anError = Standard_True; + } + } + for (TopExp_Explorer anEdgeExplorer(aTopoShape, TopAbs_EDGE); anEdgeExplorer.More() && !anError; anEdgeExplorer.Next()) + { + Standard_Real fd, ld; + Handle(Geom_Curve) curve = BRep_Tool::Curve(TopoDS::Edge(anEdgeExplorer.Current()), fd, ld); + if (!curve->IsKind(STANDARD_TYPE(Geom_Line))) + { + anError = Standard_True; + } + } + } + } + return !anError; +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/DataExchangeSamples.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/DataExchangeSamples.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/DataExchangeSamples.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/DataExchangeSamples.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,90 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef DATAEXCHANGESAMPLES_H +#define DATAEXCHANGESAMPLES_H + +#include "BaseSample.h" + +#include +#include + +//! Implements Data Exchange samples +class DataExchangeSamples : public BaseSample +{ + DEFINE_STANDARD_RTTI_INLINE(DataExchangeSamples, BaseSample) +public: + + DataExchangeSamples (const TCollection_AsciiString& theSampleSourcePath, + const Handle(V3d_View)& theView, + const Handle(AIS_InteractiveContext)& theContext) + : BaseSample (theSampleSourcePath, theContext), + myStepType (STEPControl_AsIs), + myView (theView) + { + // + } + + virtual void Process (const TCollection_AsciiString& theSampleName) Standard_OVERRIDE; + + void AppendBottle(); + void SetFileName(TCollection_AsciiString theFileName) { myFileName = theFileName; }; + void SetStepType(STEPControl_StepModelType theStepType) { myStepType = theStepType; }; + + static Standard_Boolean IsExportSample(const TCollection_AsciiString& theSampleName) { return theSampleName == "BrepExportSample" + || theSampleName == "StepExportSample" + || theSampleName == "IgesExportSample" + || theSampleName == "StlExportSample" + || theSampleName == "VrmlExportSample" + || theSampleName == "ImageExportSample"; } + static Standard_Boolean IsImportSample(const TCollection_AsciiString& theSampleName) { return theSampleName == "BrepImportSample" + || theSampleName == "StepImportSample" + || theSampleName == "IgesImportSample"; } + static Standard_Boolean IsBrepSample (const TCollection_AsciiString& theSampleName) { return theSampleName == "BrepExportSample" || theSampleName == "BrepImportSample"; } + static Standard_Boolean IsStepSample (const TCollection_AsciiString& theSampleName) { return theSampleName == "StepExportSample" || theSampleName == "StepImportSample"; } + static Standard_Boolean IsIgesSample (const TCollection_AsciiString& theSampleName) { return theSampleName == "IgesExportSample" || theSampleName == "IgesImportSample"; } + static Standard_Boolean IsStlSample (const TCollection_AsciiString& theSampleName) { return theSampleName == "StlExportSample"; } + static Standard_Boolean IsVrmlSample (const TCollection_AsciiString& theSampleName) { return theSampleName == "VrmlExportSample"; } + static Standard_Boolean IsImageSample (const TCollection_AsciiString& theSampleName) { return theSampleName == "ImageExportSample"; } + +protected: + virtual void ExecuteSample (const TCollection_AsciiString& theSampleName) Standard_OVERRIDE; + +private: + TCollection_AsciiString myFileName; + STEPControl_StepModelType myStepType; + Handle(V3d_View) myView; + +private: + Standard_Boolean CheckFacetedBrep(); + // One function for every sample + void BrepExportSample(); + void StepExportSample(); + void IgesExportSample(); + void StlExportSample(); + void VrmlExportSample(); + void ImageExportSample(); + void BrepImportSample(); + void StepImportSample(); + void IgesImportSample(); +}; + +#endif //DATAEXCHANGESAMPLES_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/DataExchange.xml opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/DataExchange.xml --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/DataExchange.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/DataExchange.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/FILES opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/FILES --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/FILES 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,48 @@ +AdaptorCurve2d_AIS.cxx +AdaptorCurve2d_AIS.h +AdaptorCurve_AIS.cxx +AdaptorCurve_AIS.h +AdaptorPnt2d_AIS.cxx +AdaptorPnt2d_AIS.h +AdaptorVec_AIS.cxx +AdaptorVec_AIS.h +BaseSample.cxx +BaseSample.h +DataExchange.xml +DataExchangeSamples.cxx +DataExchangeSamples.h +Geometry.xml +GeometrySamples.cxx +GeometrySamples.h +MakeBottle.cxx +MakeBottle.h +Ocaf.xml +OcafSamples.cxx +OcafSamples.h +Sample2D_Face.cxx +Sample2D_Face.h +Sample2D_Image.cxx +Sample2D_Image.h +Sample2D_Markers.cxx +Sample2D_Markers.h +Samples.qrc +TOcafFunction_BoxDriver.cxx +TOcafFunction_BoxDriver.h +TOcafFunction_CutDriver.cxx +TOcafFunction_CutDriver.h +TOcafFunction_CylDriver.cxx +TOcafFunction_CylDriver.h +TOcaf_Application.cxx +TOcaf_Application.h +Topology.xml +TopologySamples.cxx +TopologySamples.h +Triangulation.xml +TriangulationSamples.cxx +TriangulationSamples.h +Viewer2d.xml +Viewer2dSamples.cxx +Viewer2dSamples.h +Viewer3d.xml +Viewer3dSamples.cxx +Viewer3dSamples.h diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/GeometrySamples.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/GeometrySamples.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/GeometrySamples.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/GeometrySamples.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2027 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "GeometrySamples.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "AdaptorPnt2d_AIS.h" +#include "AdaptorVec_AIS.h" +#include "AdaptorCurve_AIS.h" +#include "AdaptorCurve2d_AIS.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +void GeometrySamples::ExecuteSample (const TCollection_AsciiString& theSampleName) +{ + Standard_Boolean anIsSamplePresent = Standard_True; + FindSourceCode(theSampleName); + if (theSampleName == "ZeroDimensionObjects3dSample") + ZeroDimensionObjects3dSample(); + else if (theSampleName == "Vectors3dSample") + Vectors3dSample(); + else if (theSampleName == "InfinityLines3dSample") + InfinityLines3dSample(); + else if (theSampleName == "SecondOrderCurves3dSample") + SecondOrderCurves3dSample(); + else if (theSampleName == "PlaneSurfaces3dSample") + PlaneSurfaces3dSample(); + else if (theSampleName == "SecondOrderSurfaces3dSample") + SecondOrderSurfaces3dSample(); + else if (theSampleName == "ZeroDimensionObjects2dSample") + ZeroDimensionObjects2dSample(); + else if (theSampleName == "Vectors2dSample") + Vectors2dSample(); + else if (theSampleName == "InfinityLines2dSample") + InfinityLines2dSample(); + else if (theSampleName == "SecondOrderCurves2dSample") + SecondOrderCurves2dSample(); + else if (theSampleName == "BarycenterPoint3dSample") + BarycenterPoint3dSample(); + else if (theSampleName == "RotatedVector3dSample") + RotatedVector3dSample(); + else if (theSampleName == "MirroredLine3dSample") + MirroredLine3dSample(); + else if (theSampleName == "ScaledEllipse3dSample") + ScaledEllipse3dSample(); + else if (theSampleName == "TransformedCylinder3dSample") + TransformedCylinder3dSample(); + else if (theSampleName == "TranslatedTorus3dSample") + TranslatedTorus3dSample(); + else if (theSampleName == "ConjugateObjects3dSample") + ConjugateObjects3dSample(); + else if (theSampleName == "ProjectionOfPoint3dSample") + ProjectionOfPoint3dSample(); + else if (theSampleName == "MinimalDistance3dSample") + MinimalDistance3dSample(); + else if (theSampleName == "MirroredAxis2dSample") + MirroredAxis2dSample(); + else if (theSampleName == "TransformedEllipse2dSample") + TransformedEllipse2dSample(); + else if (theSampleName == "ConjugateObjects2dSample") + ConjugateObjects2dSample(); + else if (theSampleName == "Intersection3dSample") + Intersection3dSample(); + else if (theSampleName == "TranslatedPoint2dSample") + TranslatedPoint2dSample(); + else if (theSampleName == "RotatedDirection2dSample") + RotatedDirection2dSample(); + else if (theSampleName == "Tangent2dSample") + Tangent2dSample(); + else if (theSampleName == "ProjectionOfPoint2dSample") + ProjectionOfPoint2dSample(); + else if (theSampleName == "MinimalDistance2dSample") + MinimalDistance2dSample(); + else if (theSampleName == "Intersection2dSample") + Intersection2dSample(); + else if (theSampleName == "PointInfo3dSample") + PointInfo3dSample(); + else if (theSampleName == "EllipseInfo3dSample") + EllipseInfo3dSample(); + else if (theSampleName == "PointInfo2dSample") + PointInfo2dSample(); + else if (theSampleName == "CircleInfo2dSample") + CircleInfo2dSample(); + else if (theSampleName == "SecondOrderCurves3dSample") + SecondOrderCurves3dSample(); + else if (theSampleName == "FreeStyleCurves3dSample") + FreeStyleCurves3dSample(); + else if (theSampleName == "AnalyticalSurfaces3dSample") + AnalyticalSurfaces3dSample(); + else if (theSampleName == "FreeStyleSurfaces3dSample") + FreeStyleSurfaces3dSample(); + else if (theSampleName == "SecondOrderCurves2dSample") + SecondOrderCurves2dSample(); + else if (theSampleName == "FreeStyleCurves2dSample") + FreeStyleCurves2dSample(); + else if (theSampleName == "TrimmedCurve3dSample") + TrimmedCurve3dSample(); + else if (theSampleName == "OffsetCurve3dSample") + OffsetCurve3dSample(); + else if (theSampleName == "BSplineFromCircle3dSample") + BSplineFromCircle3dSample(); + else if (theSampleName == "TrimmedSurface3dSample") + TrimmedSurface3dSample(); + else if (theSampleName == "OffsetSurface3dSample") + OffsetSurface3dSample(); + else if (theSampleName == "ExtrusionSurface3dSample") + ExtrusionSurface3dSample(); + else if (theSampleName == "RevolutionSurface3dSample") + RevolutionSurface3dSample(); + else if (theSampleName == "TrimmedCurve2dSample") + TrimmedCurve2dSample(); + else if (theSampleName == "OffsetCurve2dSample") + OffsetCurve2dSample(); + else if (theSampleName == "BoundingBoxOfSurface3dSample") + BoundingBoxOfSurface3dSample(); + else if (theSampleName == "BoundingBoxOfCurves3dSample") + BoundingBoxOfCurves3dSample(); + else if (theSampleName == "BoundingBoxOfCurves2dSample") + BoundingBoxOfCurves2dSample(); + else if (theSampleName == "DumpCircleInfoSample") + DumpCircleInfoSample(); + else if (theSampleName == "DumpBSplineCurveInfoSample") + DumpBSplineCurveInfoSample(); + else + { + myResult << "No function found: " << theSampleName; + myCode += TCollection_AsciiString("No function found: ") + theSampleName; + anIsSamplePresent = Standard_False; + } + myIsProcessed = anIsSamplePresent; +} + +void GeometrySamples::DisplayPnt (const gp_Pnt2d& thePnt2d, const TCollection_AsciiString& theText, + Aspect_TypeOfMarker theMarker, Standard_Real theDistance) +{ + gp_Pnt aPnt(thePnt2d.X(), thePnt2d.Y(), 0.0); + Handle(Geom_CartesianPoint) aGeomPoint = new Geom_CartesianPoint(aPnt); + Handle(AIS_Point) anAisPoint = new AIS_Point(aGeomPoint); + anAisPoint->SetMarker(theMarker); + myObject2d.Append(anAisPoint); + Handle(AIS_TextLabel) aPntLabel = new AIS_TextLabel(); + aPntLabel->SetText(theText); + aPntLabel->SetPosition(gp_Pnt(aPnt.X(), aPnt.Y() + theDistance, aPnt.Z())); + myObject2d.Append(aPntLabel); +} +void GeometrySamples::DisplayPnt (const gp_Pnt& thePnt, const TCollection_AsciiString& theText, + Aspect_TypeOfMarker theMarker, Standard_Real theDistance) +{ + Handle(Geom_CartesianPoint) aPoint = new Geom_CartesianPoint(thePnt); + Handle(AIS_Point) anAisPoint = new AIS_Point(aPoint); + anAisPoint->SetMarker(theMarker); + myObject3d.Append(anAisPoint); + Handle(AIS_TextLabel) aPntLabel = new AIS_TextLabel(); + aPntLabel->SetText(theText); + aPntLabel->SetPosition(gp_Pnt(thePnt.X(), thePnt.Y(), thePnt.Z() + theDistance)); + myObject3d.Append(aPntLabel); +} + +void GeometrySamples::ZeroDimensionObjects3dSample() +{ + // gp_Pnt describes a point in 3D space. A Geom_CartesianPoint is defined by + // a gp_Pnt point, with its three Cartesian coordinates X, Y and Z. + gp_Pnt aCoordPnt(10.0, 20.0, 30.0); + Handle(Geom_CartesianPoint) aCoordGeomPoint = new Geom_CartesianPoint(aCoordPnt); + Handle(AIS_Point) aCoordAisPoint = new AIS_Point(aCoordGeomPoint); + myObject3d.Append(aCoordAisPoint); + + Handle(AIS_TextLabel) aPntLabel = new AIS_TextLabel(); + aPntLabel->SetText(" gp_Pnt"); + aPntLabel->SetPosition(gp_Pnt(aCoordPnt.X(), aCoordPnt.Y(), aCoordPnt.Z() + 5.0)); + myObject3d.Append(aPntLabel); + myResult << "gp_Pnt was created" << std::endl; + + // gp_XYZ class describes a Cartesian coordinate entity in 3D space (X,Y,Z). + // This entity is used for algebraic calculation. + // This entity can be transformed with a "Trsf" or a "GTrsf" from package "gp". + // It is used in vectorial computations or for holding this type of information + // in data structures. + gp_XYZ aXyz1(10.0, 20.0, 30.0); + gp_XYZ aXyz2(20.0, 10.0, 30.0); + gp_XYZ aXyzSum = aXyz1 + aXyz2; + gp_Pnt aSumPnt(aXyzSum); + Handle(Geom_CartesianPoint) aXyzGeomPoint = new Geom_CartesianPoint(aSumPnt); + Handle(AIS_Point) aSumAisPoint = new AIS_Point(aXyzGeomPoint); + myObject3d.Append(aSumAisPoint); + + Handle(AIS_TextLabel) aXyzLabel = new AIS_TextLabel(); + aXyzLabel->SetText(" gp_XYZ"); + aXyzLabel->SetPosition(gp_Pnt(aXyzSum.X(), aXyzSum.Y(), aXyzSum.Z() + 5.0)); + myObject3d.Append(aXyzLabel); + myResult << "gp_XYZ was created" << std::endl; +} + +void GeometrySamples::Vectors3dSample() +{ + gp_Pnt aPnt1(0.0, 0.0, 0.0); + gp_Pnt aPnt2(5.0, 0.0, 0.0); + + // gp_Vec defines a non-persistent vector in 3D space. + gp_Vec aVec(aPnt1, aPnt2); + Handle(AdaptorVec_AIS) aVecAIS = new AdaptorVec_AIS(aPnt1, aVec, 0.5); + aVecAIS->SetText(" gp_Vec"); + myObject3d.Append(aVecAIS); + myResult << "gp_Vec magnitude: " << aVec.Magnitude() << std::endl; + + // Describes a unit vector in 3D space. + // This unit vector is also called "Direction". + // See Also gce_MakeDir which provides functions for more complex unit vector + // constructions Geom_Direction which provides additional functions + // for constructing unit vectors and works, in particular, + // with the parametric equations of unit vectors. + gp_Dir aDir(aVec); + Handle(AdaptorVec_AIS) aDirAIS = new AdaptorVec_AIS(gp_Pnt(0.0, 0.0, 10.0), aDir, 1.0, 0.5); + aDirAIS->SetText(" gp_Dir"); + myObject3d.Append(aDirAIS); + myResult << "gp_Dir coordinates: X: " << aDir.X() << ", Y: " << aDir.Y() << ", Z: " << aDir.Z() << std::endl; +} + +void GeometrySamples::InfinityLines3dSample() +{ + gp_Pnt aBasePoint(0.0, 0.0, 0.0); + gp_Dir aX_Direction(1.0, 0.0, 0.0); + gp_Dir anY_Direction(0.0, 1.0, 0.0); + gp_Dir aZ_Direction(0.0, 0.0, 1.0); + + // Describes an axis in 3D space. + gp_Ax1 anAxis1(aBasePoint, aZ_Direction); + Handle(AdaptorVec_AIS) anAx1Ais = new AdaptorVec_AIS(anAxis1.Location(), anAxis1.Direction(), 1.0, 0.3); + anAx1Ais->SetText(" gp_Ax1"); + myObject3d.Append(anAx1Ais); + myResult << "gp_Ax1 was created" << std::endl << std::endl; + + // Describes a right - handed coordinate system in 3D space. + aBasePoint.SetCoord(0.0, 0.0, 3.0); + gp_Ax2 anAxis2(aBasePoint, aZ_Direction); + Handle(AdaptorVec_AIS) aAx2AisZ = new AdaptorVec_AIS(anAxis2.Location(), anAxis2.Direction(), 1.0, 0.3); + aAx2AisZ->SetText(" gp_Ax2 Z"); + myObject3d.Append(aAx2AisZ); + Handle(AdaptorVec_AIS) aAx2AisX = new AdaptorVec_AIS(anAxis2.Location(), anAxis2.XDirection(), 1.0, 0.3); + aAx2AisX->SetText(" gp_Ax2 X"); + myObject3d.Append(aAx2AisX); + Handle(AdaptorVec_AIS) aAx2AisY = new AdaptorVec_AIS(anAxis2.Location(), anAxis2.YDirection(), 1.0, 0.3); + aAx2AisY->SetText(" gp_Ax2 Y"); + myObject3d.Append(aAx2AisY); + myResult << "gp_Ax2 was created" << std::endl; + + // Describes a coordinate system in 3D space.Unlike a gp_Ax2 coordinate system, + // a gp_Ax3 can be right - handed("direct sense") or left - handed("indirect sense"). + gp_Ax3 anAxis3(gp_XYZ(0.0, 0.0, 6.0), aZ_Direction, aX_Direction); + anAxis3.YReverse(); + Handle(AdaptorVec_AIS) anAx3AisZ = new AdaptorVec_AIS(anAxis3.Location(), anAxis3.Direction(), 1.0, 0.3); + anAx3AisZ->SetText(" gp_Ax3 Z"); + myObject3d.Append(anAx3AisZ); + Handle(AdaptorVec_AIS) anAx3AisX = new AdaptorVec_AIS(anAxis3.Location(), anAxis3.XDirection(), 1.0, 0.3); + anAx3AisX->SetText(" gp_Ax3 X"); + myObject3d.Append(anAx3AisX); + Handle(AdaptorVec_AIS) anAx3AisY = new AdaptorVec_AIS(anAxis3.Location(), anAxis3.YDirection(), 1.0, 0.3); + anAx3AisY->SetText(" gp_Ax3 Y"); + myObject3d.Append(anAx3AisY); + + myResult << "gp_Ax3 was created" << std::endl; + const gp_Dir& anAxis3_xDir = anAxis3.XDirection(); + const gp_Dir& anAxis3_yDir = anAxis3.YDirection(); + myResult << "gp_Ax3 X direction: " << anAxis3_xDir.X() << " " << anAxis3_xDir.Y() << " " << anAxis3_xDir.Z() << std::endl; + myResult << "gp_Ax3 Y direction: " << anAxis3_yDir.X() << " " << anAxis3_yDir.Y() << " " << anAxis3_yDir.Z() << std::endl; + TCollection_AsciiString aDirectionDescription; + if (anAxis3.Direct()) + { + aDirectionDescription = "anAxis3 is a right-handed axis system"; + } + else + { + aDirectionDescription = "anAxis3 is a left-handed axis system"; + } + myResult << aDirectionDescription << std::endl << std::endl; + + // Describes a line in 3D space. A line is positioned in space with an axis + // (a gp_Ax1 object) which gives it an origin and a unit vector. + gp_Lin aLine(gp_Pnt(5.0, 0.0, 0.0), gp_Dir(0.0, 1.0, 0.0)); + Handle(AdaptorVec_AIS) anLineAis = new AdaptorVec_AIS(aLine.Location(), aLine.Direction(), 8.0); + anLineAis->SetText(" gp_Lin"); + myObject3d.Append(anLineAis); + myResult << "gp_Lin was created" << std::endl << std::endl; +} + +void GeometrySamples::SecondOrderCurves3dSample() +{ + gp_Ax2 anAxis2(gp_Pnt(0.0, 0.0, 0.0), gp_Dir(0.0, 0.0, 1.0)); + gp_Circ aCirc(anAxis2, 10.0); + Handle(Geom_Circle) aGeomCircle = new Geom_Circle(aCirc); + Handle(AIS_Circle) anAisCircle = new AIS_Circle(aGeomCircle); + myObject3d.Append(anAisCircle); + + // Describes an ellipse in 3D space. An ellipse is defined by its major and minor + // radii and positioned in space with a coordinate system (a gp_Ax2 object) + gp_Elips anElips(anAxis2.Translated(gp_Vec(0.0, 0.0, 10.0)), 20.0, 10.0); + Handle(Geom_Ellipse) aGeomEllipse = new Geom_Ellipse(anElips); + Handle(AdaptorCurve_AIS) anAisEllipce = new AdaptorCurve_AIS(aGeomEllipse); + myObject3d.Append(anAisEllipce); + + // Describes a parabola in 3D space. A parabola is defined by its focal length + // (that is, the distance between its focus and apex) and positioned in space with + // a coordinate system (a gp_Ax2 object) + gp_Parab aParab(anAxis2.Translated(gp_Vec(0.0, 0.0, 20.0)), 2.0); + Handle(Geom_Parabola) aGeomParabola = new Geom_Parabola(aParab); + Handle(Geom_TrimmedCurve) aTrimmedParabola = new Geom_TrimmedCurve(aGeomParabola, 20.0, -20.0); + Handle(AdaptorCurve_AIS) anAisParabola = new AdaptorCurve_AIS(aTrimmedParabola); + myObject3d.Append(anAisParabola); + + // Describes a branch of a hyperbola in 3D space. A hyperbola is defined by its major + // and minor radii and positioned in space with a coordinate system (a gp_Ax2 object) + gp_Hypr aHypr(anAxis2.Translated(gp_Vec(0.0, 0.0, 30.0)), 20.0, 10.0); + Handle(Geom_Hyperbola) aGeomHyperbola = new Geom_Hyperbola(aHypr); + Handle(Geom_TrimmedCurve) aTrimmedHyperbola = new Geom_TrimmedCurve(aGeomHyperbola, 2.0, -2.0); + Handle(AdaptorCurve_AIS) anAisHyperbola = new AdaptorCurve_AIS(aTrimmedHyperbola); + myObject3d.Append(anAisHyperbola); +} + +void GeometrySamples::PlaneSurfaces3dSample() +{ + // Describes a plane.A plane is positioned in space with a coordinate system(a gp_Ax3 object), + // such that the plane is defined by the origin, "X Direction" and "Y Direction" of this + // coordinate system, which is the "local coordinate system" of the plane.The "main Direction" + // of the coordinate system is a vector normal to the plane. + gp_Pln aPln(gp_Pnt(0.0, 0.0, 0.0), gp_Dir(0.0, 0.0, 1.0)); + Handle(Geom_Plane) aPlane = new Geom_Plane(aPln); + Handle(AIS_Plane) anAisPlane = new AIS_Plane(aPlane, aPln.Location(), + gp_Pnt(10.0, 10.0, 0.0), + gp_Pnt(-10.0, -10.0, 0.0), + Standard_False); + myObject3d.Append(anAisPlane); + + // Describes an infinite cylindrical surface.A cylinder is defined by its radius and positioned + // in space with a coordinate system(a gp_Ax3 object), the "main Axis" of which is the axis of + // the cylinder.This coordinate system is the "local coordinate system" of the cylinder. + gp_Cylinder aCylinder(gp_Ax3(gp_Pnt(0.0, 0.0, 10.0), gp_Dir(0.0, 0.0, 1.0)), 10.0); + Handle(Geom_CylindricalSurface) aCylindricalSurface = new Geom_CylindricalSurface(aCylinder); + Handle(AIS_Shape) anAisCylinder = new AIS_Shape(BRepBuilderAPI_MakeFace( + aCylindricalSurface, 0.0, 2.0*M_PI, 0.0, 10.0, Precision::Confusion()).Shape()); + myObject3d.Append(anAisCylinder); + + // Defines an infinite conical surface. A cone is defined by its half-angle (can be negative) at + // the apex and positioned in space with a coordinate system (a gp_Ax3 object) and a "reference radius" + gp_Cone aCone(gp_Ax3(gp_Pnt(0.0, 0.0, 30.0), gp_Dir(0.0, 0.0, 1.0)), 0.25*M_PI, 0.0); + Handle(Geom_ConicalSurface) aConicalSurface = new Geom_ConicalSurface(aCone); + Handle(AIS_Shape) anAisCone = new AIS_Shape(BRepBuilderAPI_MakeFace( + aConicalSurface, 0.0, 2.0*M_PI, 0.0, 20.0, Precision::Confusion()).Shape()); + myObject3d.Append(anAisCone); +} + +void GeometrySamples::SecondOrderSurfaces3dSample() +{ + gp_Sphere aSphere(gp_Ax3(gp_Pnt(0.0, 0.0, 0.0), gp_Dir(0.0, 0.0, 1.0)), 10.0); + Handle(Geom_SphericalSurface) aSphericalSurface = new Geom_SphericalSurface(aSphere); + Handle(AIS_Shape) anAisSphere = new AIS_Shape(BRepBuilderAPI_MakeFace( + aSphericalSurface, 0.0, 2.0*M_PI, 0.0, 2.0*M_PI, Precision::Confusion()).Shape()); + myObject3d.Append(anAisSphere); + + gp_Torus aTorus(gp_Ax3(gp_Pnt(0.0, 0.0, 20.0), gp_Dir(0.0, 0.0, 1.0)), 40.0, 10.0); + Handle(Geom_ToroidalSurface) aToroidalSurface = new Geom_ToroidalSurface(aTorus); + Handle(AIS_Shape) anAisTorus = new AIS_Shape(BRepBuilderAPI_MakeFace( + aToroidalSurface, 0.0, 2.0*M_PI, 0.0, 2.0*M_PI, Precision::Confusion()).Shape()); + myObject3d.Append(anAisTorus); +} + +void GeometrySamples::ZeroDimensionObjects2dSample() +{ + // Defines a non-persistent 2D Cartesian point. + gp_Pnt2d aCoordPnt(10.0, 20.0); + Handle(Geom2d_CartesianPoint) aCoordGeomPoint = new Geom2d_CartesianPoint(aCoordPnt); + Handle(AdaptorPnt2d_AIS) aCoordAisPoint = new AdaptorPnt2d_AIS(aCoordGeomPoint); + myObject2d.Append(aCoordAisPoint); + + Handle(AIS_TextLabel) aPntLabel = new AIS_TextLabel(); + aPntLabel->SetText("gp_Pnt2d"); + aPntLabel->SetPosition(gp_Pnt(aCoordPnt.X(), aCoordPnt.Y() + 0.5, 0.0)); + myObject2d.Append(aPntLabel); + myResult << "gp_Pnt was created" << std::endl; + + // This class describes a Cartesian coordinate entity in 2D space{ X,Y }. + // This class is non persistent.This entity used for algebraic calculation. + // An XY can be transformed with a Trsf2d or a GTrsf2d from package gp. + // It is used in vectorial computations or for holding this type of information in data structures. + gp_XY aXy(20.0, 10.0); + Handle(Geom2d_CartesianPoint) aXyGeomPoint = new Geom2d_CartesianPoint(aXy); + Handle(AdaptorPnt2d_AIS) aXyAisPoint = new AdaptorPnt2d_AIS(aXyGeomPoint); + myObject2d.Append(aXyAisPoint); + + Handle(AIS_TextLabel) aXyLabel = new AIS_TextLabel(); + aXyLabel->SetText(" gp_XY"); + aXyLabel->SetPosition(gp_Pnt(aXy.X(), aXy.Y() + 0.5, 0.0)); + myObject2d.Append(aXyLabel); + myResult << "gp_XY was created" << std::endl; +} + +void GeometrySamples::Vectors2dSample() +{ + // Describes a unit vector in the plane (2D space). + // This unit vector is also called "Direction". + gp_Dir2d aDir(3.0, 4.0); + Handle(AdaptorVec_AIS) anAisDir = new AdaptorVec_AIS(gp_Pnt2d(0.0, 0.0), aDir, 1.0, 0.3); + anAisDir->SetText(" gp_Dir2d"); + myObject2d.Append(anAisDir); + myResult << "gp_Dir2d coordinates: X: " << aDir.X() << ", Y: " << aDir.Y() << std::endl; + + // Defines a non-persistent vector in 2D space. + gp_Vec2d aVec(aDir); + aVec = aVec * 2; + Handle(AdaptorVec_AIS) anAisVec = new AdaptorVec_AIS(gp_Pnt2d(0.0, 5.0), aVec, 0.3); + anAisVec->SetText(" gp_Vec2d"); + myObject2d.Append(anAisVec); + myResult << "gp_Vec2d magnitude: " << aVec.Magnitude() << std::endl; +} + +void GeometrySamples::InfinityLines2dSample() +{ + // Describes an axis in the plane (2D space) + gp_Ax2d anAx2d(gp_Pnt2d(0.0, 0.0), gp_Dir2d(1.0, 0.0)); + Handle(AdaptorVec_AIS) anAisAx2d = new AdaptorVec_AIS(anAx2d.Location(), anAx2d.Direction(), 1.0, 0.3); + anAisAx2d->SetText(" gp_Ax2d"); + myObject2d.Append(anAisAx2d); + + // Describes a coordinate system in a plane (2D space). + gp_Ax22d anAx22d(gp_Pnt2d(0.0, 2.0), gp_Dir2d(1.0, 1.0), Standard_False); + Handle(AdaptorVec_AIS) anAisAx2d_X = new AdaptorVec_AIS(anAx22d.Location(), anAx22d.XDirection(), 1.0, 0.3); + anAisAx2d_X->SetText(" gp_Ax2d X"); + myObject2d.Append(anAisAx2d_X); + Handle(AdaptorVec_AIS) anAisAx2d_Y = new AdaptorVec_AIS(anAx22d.Location(), anAx22d.YDirection(), 1.0, 0.3); + anAisAx2d_Y->SetText(" gp_Ax2d Y"); + myObject2d.Append(anAisAx2d_Y); + + // Describes a line in 2D space. A line is positioned in the plane with an axis (a gp_Ax2d object) which gives + // the line its origin and unit vector. A line and an axis are similar objects, thus, + // we can convert one into the other. A line provides direct access to the majority of the edit and query + // functions available on its positioning axis. + gp_Lin2d aLin2d(gp_Pnt2d(2.0, 4.0), gp_Dir2d(0.0, -1.0)); + Handle(AdaptorVec_AIS) anAisLin = new AdaptorVec_AIS(aLin2d.Location(), aLin2d.Direction(), 1.0, 0.3); + anAisLin->SetText(" gp_Lin2d"); + myObject2d.Append(anAisLin); +} + +void GeometrySamples::SecondOrderCurves2dSample() +{ + // Describes a circle in the plane (2D space). A circle is defined by its radius + // and positioned in the plane with a coordinate system (a gp_Ax22d object) + gp_Circ2d aCirc2d; + aCirc2d.SetLocation(gp_Pnt2d(0.0, 0.0)); + aCirc2d.SetRadius(10.0); + Handle(Geom2d_Circle) aGeomCircle = new Geom2d_Circle(aCirc2d); + Handle(AdaptorCurve2d_AIS) anAisCirc = new AdaptorCurve2d_AIS(aGeomCircle, Aspect_TOL_SOLID); + myObject2d.Append(anAisCirc); + + // Describes an ellipse in the plane (2D space). An ellipse is defined by its major + // and minor radii and positioned in the plane with a coordinate system (a gp_Ax22d object) + gp_Elips2d anElips(gp_Ax2d(gp_Pnt2d(0.0, 30.0), gp_Dir2d(1.0, 0.0)), 20.0, 10.0); + Handle(Geom2d_Ellipse) aGeomEllipse = new Geom2d_Ellipse(anElips); + Handle(AdaptorCurve2d_AIS) anAisEllipse = new AdaptorCurve2d_AIS(aGeomEllipse, Aspect_TOL_DASH); + myObject2d.Append(anAisEllipse); + + // Describes a parabola in the plane (2D space). A parabola is defined by its focal length + // (that is, the distance between its focus and apex) and positioned in the plane with + // a coordinate system (a gp_Ax22d object) + gp_Parab2d aParab2d(gp_Ax2d(gp_Pnt2d(20.0, 0.0), gp_Dir2d(1.0, 0.0)), 10.0); + Handle(Geom2d_Parabola) aGeomParabola = new Geom2d_Parabola(aParab2d); + Handle(Geom2d_TrimmedCurve) aTrimmedParabola = new Geom2d_TrimmedCurve(aGeomParabola, 40.0, -40.0); + Handle(AdaptorCurve2d_AIS) anAisParabola = new AdaptorCurve2d_AIS(aTrimmedParabola, Aspect_TOL_DOT); + myObject2d.Append(anAisParabola); + + // Describes a branch of a hyperbola in the plane (2D space). A hyperbola is defined by its major and + // minor radii, and positioned in the plane with a coordinate system (a gp_Ax22d object) + gp_Hypr2d aHypr2d(gp_Ax2d(gp_Pnt2d(20.0, 0.0), gp_Dir2d(1.0, 0.0)), 20.0, 10.0); + Handle(Geom2d_Hyperbola) aGeomHyperbola = new Geom2d_Hyperbola(aHypr2d); + Handle(Geom2d_TrimmedCurve) aTrimmedHyperbola = new Geom2d_TrimmedCurve(aGeomHyperbola, 2.0, -2.0); + Handle(AdaptorCurve2d_AIS) anAisHyperbola = new AdaptorCurve2d_AIS(aTrimmedHyperbola, Aspect_TOL_DOTDASH); + myObject2d.Append(anAisHyperbola); +} + +void GeometrySamples::BarycenterPoint3dSample() +{ + // Barycenter of 2 points + gp_Pnt aPnt1(11, 2, 3); + gp_Pnt aPnt2(13, 4, 5); + gp_Pnt aBarycenterPnt2 = aPnt1; + Standard_Real anAlpha = 3; + Standard_Real anBeta = 7; + // Assigns the result of the following expression to this point: + // (Alpha*this + Beta*P) / (Alpha + Beta) + aBarycenterPnt2.BaryCenter(anAlpha, aPnt2, anBeta); + DisplayPnt(aPnt1, "Pnt1", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aPnt2, "Pnt2", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aBarycenterPnt2, "Barycenter Pnt", Aspect_TOM_O_PLUS, 0.5); + + // BaryCenter of an array of point + gp_Pnt aP1(0, 0, 5); + gp_Pnt aP2(1, 2, 3); + gp_Pnt aP3(2, 3, -2); + gp_Pnt aP4(4, 3, 5); + gp_Pnt aP5(5, 5, 4); + TColgp_Array1OfPnt aPntArray(1, 5); + aPntArray.SetValue(1, aP1); + aPntArray.SetValue(2, aP2); + aPntArray.SetValue(3, aP3); + aPntArray.SetValue(4, aP4); + aPntArray.SetValue(5, aP5); + + Standard_Real Tolerance = 8; + GProp_PEquation aPEquation(aPntArray, Tolerance); + + gp_Pnt aBarycenterPnt5; // P declaration + bool isPoint = false; + if (aPEquation.IsPoint()) + { + isPoint = true; + aBarycenterPnt5 = aPEquation.Point(); + myResult << "GProp_PEquation is a point" << std::endl; + } + else + { + isPoint = false; + myResult << "GProp_PEquation is not a point" << std::endl; + } + + if (aPEquation.IsLinear()) + { + /*... */ + } + if (aPEquation.IsPlanar()) + { + /*... */ + } + if (aPEquation.IsSpace()) + { + /*... */ + } + + const TCollection_AsciiString aPointName("P"); + for (Standard_Integer i = aPntArray.Lower(); i <= aPntArray.Upper(); i++) + { + TCollection_AsciiString aString(i); + aString = aPointName + aString; + DisplayPnt(aPntArray(i), aString, Aspect_TOM_STAR, 0.5); + } + + DisplayPnt(aBarycenterPnt5, "Barycenter of 5 points", Aspect_TOM_O_STAR, 0.5); + myResult << " IsPoint = "; + if (isPoint) + { + myResult << "True --> " << " P ( " << aBarycenterPnt5.X() << aBarycenterPnt5.Y() << aBarycenterPnt5.Z() << " );" << std::endl; + } + else + { + myResult << "False"; + } + myResult << std::endl << " IsLinear = " << (aPEquation.IsLinear() ? "True" : "False"); + myResult << std::endl << " IsPlanar = " << (aPEquation.IsPlanar() ? "True" : "False"); + myResult << std::endl << " IsSpace = " << (aPEquation.IsSpace() ? "True" : "False"); +} + +void GeometrySamples::RotatedVector3dSample() +{ + gp_Vec aBaseVec(0.0, 0.0, 10.0); + gp_Pnt aZeroPnt(0.0, 0.0, 0.0); + gp_Vec aRotatedVec = aBaseVec.Rotated(gp_Ax1(aZeroPnt, gp_Dir(1.0, 0.0, 0.0)), M_PI_4); + + Handle(AdaptorVec_AIS) aBaseVecAIS = new AdaptorVec_AIS(aZeroPnt, aBaseVec); + aBaseVecAIS->SetText(" Base vector"); + myObject3d.Append(aBaseVecAIS); + Handle(AdaptorVec_AIS) aRotatedVecAIS = new AdaptorVec_AIS(aZeroPnt, aRotatedVec); + aRotatedVecAIS->SetText(" Rotated vector"); + myObject3d.Append(aRotatedVecAIS); + Standard_Real anAdgle = aBaseVec.Angle(aRotatedVec)*180.0 / M_PI; + myResult << "An angle between vectors = " << anAdgle << std::endl; +} + +void GeometrySamples::MirroredLine3dSample() +{ + gp_Lin aBaseLin(gp_Pnt(0.0, 0.0, 0.0), gp_Dir(1.0, 1.0, 1.0)); + gp_Ax2 aXyzAxis; + gp_Lin aMirroredLin = aBaseLin.Mirrored(aXyzAxis); + + Handle(AdaptorVec_AIS) aBaseLineAis = new AdaptorVec_AIS(aBaseLin.Location(), aBaseLin.Direction(), 8.0); + aBaseLineAis->SetText(" Base Line"); + myObject3d.Append(aBaseLineAis); + Handle(AdaptorVec_AIS) aMirroredLineAis = new AdaptorVec_AIS(aMirroredLin.Location(), aMirroredLin.Direction(), 8.0); + aMirroredLineAis->SetText(" Mirrored Line"); + myObject3d.Append(aMirroredLineAis); + Handle(AIS_Plane) anAisPlane = new AIS_Plane (new Geom_Plane(gp_Ax3(aXyzAxis)), aXyzAxis.Location(), + gp_Pnt(10.0, 10.0, 0.0), gp_Pnt(-10.0, -10.0, 0.0), Standard_False); + myObject3d.Append(anAisPlane); + Standard_Real anAdgle = aBaseLin.Angle(aMirroredLin)*180.0 / M_PI; + myResult << "An angle between lines = " << anAdgle << std::endl; +} + +void GeometrySamples::ScaledEllipse3dSample() +{ + gp_Ax2 anAxis2(gp_Pnt(), gp_Dir(0.0, 0.0, 1.0)); + gp_Elips anBaseElips(anAxis2, 20.0, 10.0); + gp_Elips anScaledElips = anBaseElips.Scaled(gp_Pnt(), 2.5); + + Handle(Geom_Ellipse) aBaseGeomEllipse = new Geom_Ellipse(anBaseElips); + Handle(AdaptorCurve_AIS) anAisBaseEllipce = new AdaptorCurve_AIS(aBaseGeomEllipse); + myObject3d.Append(anAisBaseEllipce); + + Handle(Geom_Ellipse) aScaledGeomEllipse = new Geom_Ellipse(anScaledElips); + Handle(AdaptorCurve_AIS) anAisScaledEllipce = new AdaptorCurve_AIS(aScaledGeomEllipse); + myObject3d.Append(anAisScaledEllipce); +} + +void GeometrySamples::TransformedCylinder3dSample() +{ + gp_Cylinder aBaseCylinder(gp_Ax3(), 10.0); + gp_Trsf aRotTrsf; + aRotTrsf.SetRotation(gp_Ax1(gp_Pnt(), gp_Dir(1.0, 0.0, 0.0)), M_PI_2); + gp_Trsf aScaleTrsf; + aScaleTrsf.SetScale(gp_Pnt(), 1.5); + gp_Trsf aTranslTrsf; + aTranslTrsf.SetTranslation(gp_Vec(30.0, 0.0, 0.0)); + gp_Trsf aComplexTrsf = aRotTrsf * aScaleTrsf * aTranslTrsf; + gp_Cylinder aTransfCylinder = aBaseCylinder.Transformed(aComplexTrsf); + + Handle(Geom_CylindricalSurface) aBaseCylinderSurface = new Geom_CylindricalSurface(aBaseCylinder); + Handle(AIS_Shape) anAisBaseCylinder = new AIS_Shape(BRepBuilderAPI_MakeFace( + aBaseCylinderSurface, 0.0, 2.0*M_PI, 0.0, 2.0*M_PI, Precision::Confusion()).Shape()); + myObject3d.Append(anAisBaseCylinder); + Handle(Geom_CylindricalSurface) aTransfCylinderSurface = new Geom_CylindricalSurface(aTransfCylinder); + Handle(AIS_Shape) anAisTransfCylinder = new AIS_Shape(BRepBuilderAPI_MakeFace( + aTransfCylinderSurface, 0.0, 2.0*M_PI, 0.0, 2.0*M_PI, Precision::Confusion()).Shape()); + myObject3d.Append(anAisTransfCylinder); +} + +void GeometrySamples::TranslatedTorus3dSample() +{ + gp_Torus aBaseTorus(gp_Ax3(gp_Pnt(), gp_Dir(0.0, 0.0, 1.0)), 40.0, 10.0); + gp_Torus aTranslatedTorus = aBaseTorus.Translated(gp_Vec(70.0, 70.0, 70.0)); + + Handle(Geom_ToroidalSurface) aBaseSurface = new Geom_ToroidalSurface(aBaseTorus); + Handle(AIS_Shape) anAisBaseShape = new AIS_Shape(BRepBuilderAPI_MakeFace( + aBaseSurface, 0.0, 2.0*M_PI, 0.0, 2.0*M_PI, Precision::Confusion()).Shape()); + myObject3d.Append(anAisBaseShape); + Handle(Geom_ToroidalSurface) aTranslSurface = new Geom_ToroidalSurface(aTranslatedTorus); + Handle(AIS_Shape) anAisTranslShape = new AIS_Shape(BRepBuilderAPI_MakeFace( + aTranslSurface, 0.0, 2.0*M_PI, 0.0, 2.0*M_PI, Precision::Confusion()).Shape()); + myObject3d.Append(anAisTranslShape); +} + +void GeometrySamples::ConjugateObjects3dSample() +{ + gp_Hypr aHypr(gp_Ax2(), 20.0, 10.0); + gp_Ax1 anAsymptote1 = aHypr.Asymptote1(); + gp_Ax1 anAsymptote2 = aHypr.Asymptote2(); + gp_Ax1 aDirectrix1 = aHypr.Directrix1(); + gp_Ax1 aDirectrix2 = aHypr.Directrix2(); + gp_Pnt aFocus1 = aHypr.Focus1(); + gp_Pnt aFocus2 = aHypr.Focus2(); + gp_Pnt aLocation = aHypr.Location(); + + Handle(AdaptorVec_AIS) anAsy1AIS = new AdaptorVec_AIS(anAsymptote1.Location(), gp_Vec(anAsymptote1.Direction())*10.0); + anAsy1AIS->SetText(" Asymptote 1"); + myObject3d.Append(anAsy1AIS); + Handle(AdaptorVec_AIS) anAsy2AIS = new AdaptorVec_AIS(anAsymptote2.Location(), gp_Vec(anAsymptote2.Direction())*10.0); + anAsy2AIS->SetText(" Asymptote 2"); + myObject3d.Append(anAsy2AIS); + Handle(AdaptorVec_AIS) anDir1AIS = new AdaptorVec_AIS(aDirectrix1.Location(), gp_Vec(aDirectrix1.Direction())*10.0); + anDir1AIS->SetText(" Directrix 1"); + myObject3d.Append(anDir1AIS); + Handle(AdaptorVec_AIS) anDir2AIS = new AdaptorVec_AIS(aDirectrix2.Location(), gp_Vec(aDirectrix2.Direction())*10.0); + anDir2AIS->SetText(" Directrix 2"); + myObject3d.Append(anDir2AIS); + + DisplayPnt(aFocus1, "Focus 1", Aspect_TOM_PLUS, 2.0); + DisplayPnt(aFocus2, "Focus 2", Aspect_TOM_PLUS, 2.0); + DisplayPnt(aLocation, "Location", Aspect_TOM_O_STAR, 2.0); + + Handle(Geom_Hyperbola) aGeomHyperbola = new Geom_Hyperbola(aHypr); + Handle(Geom_TrimmedCurve) aTrimmedHyperbola = new Geom_TrimmedCurve(aGeomHyperbola, 2.0, -2.0); + Handle(AdaptorCurve_AIS) anAisHyperbola = new AdaptorCurve_AIS(aTrimmedHyperbola); + myObject3d.Append(anAisHyperbola); +} + +void GeometrySamples::ProjectionOfPoint3dSample() +{ + gp_Sphere aSphere(gp_Ax3(), 10.0); + gp_Pnt aBasePnt(20.0, 20.0, 20.0); + // A projection point in surface coordinate + gp_Pnt2d aPrjPnt2d = ProjLib::Project(aSphere, aBasePnt); + gp_Pnt aPrjPnt = ElSLib::Value(aPrjPnt2d.X(), aPrjPnt2d.Y(), aSphere); + + DisplayPnt(aBasePnt, "Base point", Aspect_TOM_PLUS, 2.0); + DisplayPnt(aPrjPnt, "Projection point", Aspect_TOM_O_STAR, 2.0); + Handle(Geom_SphericalSurface) aSphericalSurface = new Geom_SphericalSurface(aSphere); + Handle(AIS_Shape) anAisSphere = new AIS_Shape(BRepBuilderAPI_MakeFace( + aSphericalSurface, 0.0, 2.0*M_PI, 0.0, 2.0*M_PI, Precision::Confusion()).Shape()); + myObject3d.Append(anAisSphere); +} + +void GeometrySamples::MinimalDistance3dSample() +{ + gp_Cylinder aCylinder(gp_Ax3(gp_Pnt(), gp_Dir(0.0, 0.0, 1.0)), 10.0); + gp_Lin aLine(gp_Pnt(20.0, 0.0, 5.0), gp_Dir(0.0, 1.0, 0.0)); + Extrema_ExtElCS anExtrema_ExtElCS(aLine, aCylinder); + + if (anExtrema_ExtElCS.IsDone()) + { + NCollection_Array1 aVecArray(1, anExtrema_ExtElCS.NbExt()); + NCollection_Array1 aPntArray(1, anExtrema_ExtElCS.NbExt()); + for (Standard_Integer i = 1; i <= anExtrema_ExtElCS.NbExt(); i++) + { + Extrema_POnCurv aCurvPoint; + Extrema_POnSurf aSurfPoint; + anExtrema_ExtElCS.Points(i, aCurvPoint, aSurfPoint); + gp_Pnt aCurvPnt = aCurvPoint.Value(); + gp_Pnt aSurfPnt = aSurfPoint.Value(); + + DisplayPnt(aCurvPnt, TCollection_AsciiString(i), Aspect_TOM_O_PLUS, 2.0); + DisplayPnt(aSurfPnt, TCollection_AsciiString(i), Aspect_TOM_O_STAR, 2.0); + gp_Vec aVec(aCurvPnt, aSurfPnt); + aVecArray.SetValue(i, aVec); + aPntArray.SetValue(i, aCurvPnt); + } + Standard_Integer aMinDistIndex(0); + Standard_Real aMinDistance = std::numeric_limits::max(); + for (Standard_Integer i = 1; i <= anExtrema_ExtElCS.NbExt(); i++) + { + if (aMinDistance > aVecArray(i).Magnitude()) + { + aMinDistIndex = i; + aMinDistance = aVecArray(i).Magnitude(); + } + } + Handle(AdaptorVec_AIS) anMinDistanceAis = + new AdaptorVec_AIS(aPntArray(aMinDistIndex), aVecArray(aMinDistIndex)); + anMinDistanceAis->SetText(" Min distance"); + myObject3d.Append(anMinDistanceAis); + } + Handle(Geom_CylindricalSurface) aCylindricalSurface = new Geom_CylindricalSurface(aCylinder); + Handle(AIS_Shape) anAisCylinder = new AIS_Shape(BRepBuilderAPI_MakeFace( + aCylindricalSurface, 0.0, 2.0*M_PI, 0.0, 10.0, Precision::Confusion()).Shape()); + myObject3d.Append(anAisCylinder); + Handle(AdaptorVec_AIS) anLineAis = new AdaptorVec_AIS(aLine.Location(), aLine.Direction(), 8.0); + anLineAis->SetText(" gp_Lin"); + myObject3d.Append(anLineAis); +} + +void GeometrySamples::Intersection3dSample() +{ + gp_Lin aLine(gp_Pnt(0.0, 0.0, 10.0), gp_Dir(0.0, 1.0, 0.0)); + gp_Cone aCone(gp_Ax3(gp_Pnt(), gp_Dir(0.0, 0.0, 1.0)), 0.25*M_PI, 0.0); + IntAna_Quadric anIntAna_Quadric(aCone); + IntAna_IntConicQuad anIntAna_IntConicQuad(aLine, anIntAna_Quadric); + if (anIntAna_IntConicQuad.IsDone()) + { + for (int i = 1; i <= anIntAna_IntConicQuad.NbPoints(); i++) + { + const gp_Pnt& aIntersectionPnt = anIntAna_IntConicQuad.Point(i); + DisplayPnt(aIntersectionPnt, TCollection_AsciiString(i)); + } + } + Handle(AdaptorVec_AIS) aLineVecAIS = new AdaptorVec_AIS(aLine.Location(), gp_Vec(aLine.Direction())*5.0); + aLineVecAIS->SetText(" Base vector"); + myObject3d.Append(aLineVecAIS); + Handle(Geom_ConicalSurface) aConicalSurface = new Geom_ConicalSurface(aCone); + Handle(AIS_Shape) anAisCone = new AIS_Shape(BRepBuilderAPI_MakeFace( + aConicalSurface, 0.0, 2.0*M_PI, 0.0, 20.0, Precision::Confusion()).Shape()); + myObject3d.Append(anAisCone); +} + +void GeometrySamples::TranslatedPoint2dSample() +{ + gp_Pnt2d aPnt1; + gp_Pnt2d aPnt2 = aPnt1.Translated(gp_Vec2d(10.0, 10.0)); + DisplayPnt(aPnt1, "1", Aspect_TOM_PLUS, 1.0); + DisplayPnt(aPnt2, "2", Aspect_TOM_PLUS, 1.0); + gp_Vec2d aTranslationVec(aPnt1, aPnt2); + Handle(AdaptorVec_AIS) aVecAIS = new AdaptorVec_AIS(aPnt1, aTranslationVec); + aVecAIS->SetText(" Translation"); + myObject2d.Append(aVecAIS); +} + +void GeometrySamples::RotatedDirection2dSample() +{ + gp_Dir2d aBaseDir(1.0, 1.0); + gp_Dir2d aRotatedDir = aBaseDir.Rotated(M_PI_4); + + myResult << "An angle between directions: " << aBaseDir.Angle(aRotatedDir)*180.0 / M_PI << " grad"; + Handle(AdaptorVec_AIS) aBaseAIS = new AdaptorVec_AIS(gp_Pnt2d(), aBaseDir, 5.0); + aBaseAIS->SetText(" Base"); + myObject2d.Append(aBaseAIS); + Handle(AdaptorVec_AIS) aRotatedAIS = new AdaptorVec_AIS(gp_Pnt2d(), aRotatedDir, 5.0); + aRotatedAIS->SetText(" Rotated"); + myObject2d.Append(aRotatedAIS); +} + +void GeometrySamples::MirroredAxis2dSample() +{ + gp_Ax22d aBaseAx(gp_Pnt2d(10.0, 0.0), gp_Dir2d(1.0, 0.0), Standard_True); + gp_Ax22d aMirrorAx = aBaseAx.Mirrored(gp_Pnt2d()); + + DisplayPnt(gp_Pnt2d(), "Mirror point", Aspect_TOM_PLUS, 1.0); + Handle(AdaptorVec_AIS) aBaseX_AIS = new AdaptorVec_AIS(aBaseAx.Location(), aBaseAx.XDirection(), 5.0); + aBaseX_AIS->SetText(" X (Base)"); + myObject2d.Append(aBaseX_AIS); + Handle(AdaptorVec_AIS) aBaseY_AIS = new AdaptorVec_AIS(aBaseAx.Location(), aBaseAx.YDirection(), 5.0); + aBaseY_AIS->SetText("Y (Base)"); + myObject2d.Append(aBaseY_AIS); + Handle(AdaptorVec_AIS) aMirrorX_AIS = new AdaptorVec_AIS(aMirrorAx.Location(), aMirrorAx.XDirection(), 5.0); + aMirrorX_AIS->SetText("X (Mirror)"); + myObject2d.Append(aMirrorX_AIS); + Handle(AdaptorVec_AIS) aMirrorY_AIS = new AdaptorVec_AIS(aMirrorAx.Location(), aMirrorAx.YDirection(), 5.0); + aMirrorY_AIS->SetText(" Y (Mirror)"); + myObject2d.Append(aMirrorY_AIS); +} + +void GeometrySamples::TransformedEllipse2dSample() +{ + // Creates an ellipse with the major axis, the major and the minor radius. + // The location of the MajorAxis is the center of the ellipse.The sense of + // parametrization is given by Sense.Warnings : It is possible to create + // an ellipse with MajorRadius = MinorRadius.Raises + // ConstructionError if MajorRadius < MinorRadius or MinorRadius < 0.0. + gp_Elips2d aBaseEllips(gp_Ax2d(gp_Pnt2d(), gp_Dir2d(1.0, 0.0)), 20.0, 10.0); + gp_Trsf2d aRotTrsf; + aRotTrsf.SetRotation(gp_Pnt2d(), M_PI_4); + gp_Trsf2d aScaleTrsf; + aScaleTrsf.SetScale(gp_Pnt2d(), 1.5); + gp_Trsf2d aTranslTrsf; + aTranslTrsf.SetTranslation(gp_Vec2d(30.0, 0.0)); + gp_Trsf2d aComplexTrsf = aRotTrsf * aScaleTrsf * aTranslTrsf; + gp_Elips2d aTransfEllips = aBaseEllips.Transformed(aComplexTrsf); + + Handle(Geom2d_Ellipse) aBaseEllipse = new Geom2d_Ellipse(aBaseEllips); + Handle(AdaptorCurve2d_AIS) anAisBaseEllipse = new AdaptorCurve2d_AIS(aBaseEllipse, Aspect_TOL_DASH); + myObject2d.Append(anAisBaseEllipse); + Handle(Geom2d_Ellipse) aTransfEllipse = new Geom2d_Ellipse(aTransfEllips); + Handle(AdaptorCurve2d_AIS) anAisTransfEllipse = new AdaptorCurve2d_AIS(aTransfEllipse, Aspect_TOL_DASH); + myObject2d.Append(anAisTransfEllipse); +} + +void GeometrySamples::ConjugateObjects2dSample() +{ + gp_Parab2d aParab(gp_Ax2d(), 20.0); + gp_Ax2d aDirectrix = aParab.Directrix(); + gp_Pnt2d aFocus = aParab.Focus(); + gp_Pnt2d aLocation = aParab.Location(); + gp_Ax2d aMirror = aParab.MirrorAxis(); + + Handle(AdaptorVec_AIS) aDirectAIS = new AdaptorVec_AIS(aDirectrix.Location(), gp_Vec2d(aDirectrix.Direction())*10.0); + aDirectAIS->SetText(" Directrix"); + myObject2d.Append(aDirectAIS); + Handle(AdaptorVec_AIS) aMirrorAIS = new AdaptorVec_AIS(aMirror.Location(), gp_Vec2d(aMirror.Direction())*10.0); + aMirrorAIS->SetText(" Mirror Axis"); + myObject2d.Append(aMirrorAIS); + + DisplayPnt(aFocus, "Focus", Aspect_TOM_PLUS, -3.0); + DisplayPnt(aLocation, " Location", Aspect_TOM_O_STAR, 3.0); + Handle(Geom2d_Parabola) aGeomParabola = new Geom2d_Parabola(aParab); + Handle(Geom2d_TrimmedCurve) aTrimmedParabola = new Geom2d_TrimmedCurve(aGeomParabola, 40.0, -40.0); + Handle(AdaptorCurve2d_AIS) anAisParabola = new AdaptorCurve2d_AIS(aTrimmedParabola, Aspect_TOL_DOT); + myObject2d.Append(anAisParabola); +} + +void GeometrySamples::Tangent2dSample() +{ + gp_Circ2d aCirc1(gp_Ax2d(gp_Pnt2d(0.0, 0.0), gp_Vec2d(1.0, 0.0)), 10.0); + gp_Circ2d aCirc2 = aCirc1.Translated(gp_Vec2d(50.0, 0.0)); + aCirc2.SetRadius(20.0); + + GccEnt_QualifiedCirc aQaCirc1(aCirc1, GccEnt_outside); + GccEnt_QualifiedCirc aQaCirc2(aCirc2, GccEnt_outside); + + GccAna_Lin2d2Tan aLin2d2Tan(aQaCirc1, aQaCirc2, 1E-6); + if (aLin2d2Tan.IsDone()) + { + for (int i = 1; i <= aLin2d2Tan.NbSolutions(); i++) + { + const gp_Lin2d& aTangentLin = aLin2d2Tan.ThisSolution(i); + Handle(AdaptorVec_AIS) anAisLin = new AdaptorVec_AIS(aTangentLin.Location(), aTangentLin.Direction(), 20.0); + myObject2d.Append(anAisLin); + } + } + + Handle(Geom2d_Circle) aCircle1 = new Geom2d_Circle(aCirc1); + Handle(AdaptorCurve2d_AIS) anAisCirc1 = new AdaptorCurve2d_AIS(aCircle1, Aspect_TOL_SOLID); + myObject2d.Append(anAisCirc1); + Handle(Geom2d_Circle) aCircle2 = new Geom2d_Circle(aCirc2); + Handle(AdaptorCurve2d_AIS) anAisCirc2 = new AdaptorCurve2d_AIS(aCircle2, Aspect_TOL_SOLID); + myObject2d.Append(anAisCirc2); +} + +void GeometrySamples::ProjectionOfPoint2dSample() +{ + gp_Pnt2d aPntToProject(40.0, 40.0); + gp_Circ2d aCirc(gp_Ax2d(), 20.0); + Handle(Geom2d_Circle) aGeom_Circle = new Geom2d_Circle(aCirc); + Geom2dAPI_ProjectPointOnCurve aProjector(aPntToProject, aGeom_Circle); + gp_Pnt2d aProjectionPnt = aProjector.NearestPoint(); + + Handle(AdaptorCurve2d_AIS) anAisCirc = new AdaptorCurve2d_AIS(aGeom_Circle, Aspect_TOL_SOLID); + myObject2d.Append(anAisCirc); + DisplayPnt(aPntToProject, "Pnt to project"); + DisplayPnt(aProjectionPnt, "Projection Pnt", Aspect_TOM_O_STAR); +} + +void GeometrySamples::MinimalDistance2dSample() +{ + gp_Lin2d aLin(gp_Pnt2d(-40.0, 0.0), gp_Dir2d(1.0, 1.0)); + Handle(Geom2d_Line) aGeom_Line = new Geom2d_Line(aLin); + gp_Circ2d aCirc(gp_Ax2d(), 20.0); + Handle(Geom2d_Circle) aGeom_Circle = new Geom2d_Circle(aCirc); + + Geom2dAPI_ExtremaCurveCurve anExtremaFinder(aGeom_Line, aGeom_Circle, + std::numeric_limits::min(), + std::numeric_limits::max(), 0.0, M_PI*2.0); + if (anExtremaFinder.NbExtrema()) + { + gp_Pnt2d aPnt1, aPnt2; + anExtremaFinder.NearestPoints(aPnt1, aPnt2); + myResult << "Extrema found: " << anExtremaFinder.NbExtrema() << std::endl; + myResult << "Minimal distance: " << anExtremaFinder.LowerDistance() << std::endl; + DisplayPnt(aPnt1, "1"); + DisplayPnt(aPnt2, "2"); + } + else + { + myResult << "No Extrema found" << std::endl; + } + + Handle(AdaptorCurve2d_AIS) anAisCirc = new AdaptorCurve2d_AIS(aGeom_Circle, Aspect_TOL_SOLID); + myObject2d.Append(anAisCirc); + Handle(AdaptorVec_AIS) anAisLin = new AdaptorVec_AIS(aLin.Location(), aLin.Direction(), 60.0); + anAisLin->SetText(" gp_Lin2d"); + myObject2d.Append(anAisLin); +} + +void GeometrySamples::Intersection2dSample() +{ + gp_Lin2d aLin(gp_Pnt2d(-20.0, 20.0), gp_Dir2d(1.0, -1.5)); + Handle(Geom2d_Line) aGeom_Line = new Geom2d_Line(aLin); + gp_Parab2d aParab(gp_Ax2d(), 20.0); + Handle(Geom2d_Parabola) aGeom_Parabola = new Geom2d_Parabola(aParab); + + Geom2dAPI_InterCurveCurve anIntersectFinder(aGeom_Line, aGeom_Parabola); + for (Standard_Integer i = 1; i <= anIntersectFinder.NbPoints(); i++) + { + gp_Pnt2d aPnt = anIntersectFinder.Point(i); + DisplayPnt(aPnt, i); + } + + myResult << "Number of intersections : " << anIntersectFinder.NbPoints() << std::endl; + + Handle(Geom2d_Parabola) aGeomParabola = new Geom2d_Parabola(aParab); + Handle(Geom2d_TrimmedCurve) aTrimmedParabola = new Geom2d_TrimmedCurve(aGeomParabola, 60.0, -60.0); + Handle(AdaptorCurve2d_AIS) anAisParabola = new AdaptorCurve2d_AIS(aTrimmedParabola, Aspect_TOL_DOT); + myObject2d.Append(anAisParabola); + Handle(AdaptorVec_AIS) anAisLin = new AdaptorVec_AIS(aLin.Location(), aLin.Direction(), 90.0); + anAisLin->SetText(" gp_Lin2d"); + myObject2d.Append(anAisLin); +} + +void GeometrySamples::PointInfo3dSample() +{ + gp_Pnt aPnt1; + gp_Pnt aPnt2(10.0, 10.0, 10.0); + gp_Pnt aPnt3(10.0, -10.0, 0.0); + gp_Pnt aPnt4(10.0, 10.0, 10.0); + Standard_Boolean anIsEqual2_3 = aPnt2.IsEqual(aPnt3, 1E-6); + Standard_Boolean anIsEqual2_4 = aPnt2.IsEqual(aPnt4, 1E-6); + Standard_Real aDistance1_2 = aPnt1.Distance(aPnt2); + Standard_Real aDistance2_4 = aPnt2.Distance(aPnt4); + Standard_Real aSquareDistance1_2 = aPnt1.SquareDistance(aPnt2); + Standard_Real aSquareDistance2_4 = aPnt2.SquareDistance(aPnt4); + + myResult << "A coordinate of a point 1: X: " << aPnt1.X() << " Y: " << aPnt1.Y() << " Z: " << aPnt1.Z() << std::endl; + myResult << "A coordinate of a point 2: X: " << aPnt2.X() << " Y: " << aPnt2.Y() << " Z: " << aPnt2.Z() << std::endl; + myResult << "A coordinate of a point 3: X: " << aPnt3.X() << " Y: " << aPnt3.Y() << " Z: " << aPnt3.Z() << std::endl; + myResult << "A coordinate of a point 4: X: " << aPnt4.X() << " Y: " << aPnt4.Y() << " Z: " << aPnt4.Z() << std::endl; + + if (anIsEqual2_3) + { + myResult << "A point 2 is equal to a point 3" << std::endl; + } + else + { + myResult << "A point 2 is different from a point 3" << std::endl; + } + if (anIsEqual2_4) + { + myResult << "A point 2 is equal to a point 4" << std::endl; + } + else + { + myResult << "A point 2 is different from a point 4" << std::endl; + } + myResult << "A distance from a point 1 to a point 2 is: " << aDistance1_2 << std::endl; + myResult << "A distance from a point 2 to a point 4 is: " << aDistance2_4 << std::endl; + + myResult << "A square distance from a point 1 to a point 2 is: " << aSquareDistance1_2 << std::endl; + myResult << "A square distance from a point 2 to a point 4 is: " << aSquareDistance2_4 << std::endl; + + DisplayPnt(aPnt1, "1", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aPnt2, "2 & 4", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aPnt3, "3", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aPnt4, "", Aspect_TOM_PLUS, 0.5); +} + +void GeometrySamples::EllipseInfo3dSample() +{ + gp_Elips anElips(gp_Ax2(gp_Pnt(), gp_Dir(1.0, 0.0, 0.0)), 20.0, 10.0); + Standard_Real anArea = anElips.Area(); + // Returns the eccentricity of the ellipse between 0.0 and 1.0 + // If f is the distance between the center of the ellipse and the Focus1 then + // the eccentricity e = f / MajorRadius. Returns 0 if MajorRadius = 0. + Standard_Real anEccentricity = anElips.Eccentricity(); + // Returns the distance between the center of the ellipse and focus1 or focus2. + Standard_Real aFocal = anElips.Focal(); + // Returns p = (1 - e * e) * MajorRadius where e is the eccentricity + // of the ellipse. Returns 0 if MajorRadius = 0. + Standard_Real aParameter = anElips.Parameter(); + + myResult << "Ellipse area = " << anArea << " square units" << std::endl; + myResult << "Eccentricity = " << anEccentricity; + myResult << "Focal distance = " << aFocal; + myResult << "Ellipse parameter = " << aParameter; + + gp_Pnt aCenter = anElips.Location(); + gp_Pnt aFocus1 = anElips.Focus1(); + gp_Pnt aFocus2 = anElips.Focus2(); + DisplayPnt(aCenter, "Center", Aspect_TOM_PLUS, 2.0); + DisplayPnt(aFocus1, "focus 1", Aspect_TOM_PLUS, 2.0); + DisplayPnt(aFocus2, "focus 2", Aspect_TOM_PLUS, 2.0); + + Handle(Geom_Ellipse) aGeomEllipse = new Geom_Ellipse(anElips); + Handle(AdaptorCurve_AIS) anAisEllipce = new AdaptorCurve_AIS(aGeomEllipse); + myObject3d.Append(anAisEllipce); +} + +void GeometrySamples::PointInfo2dSample() +{ + gp_Pnt2d aPnt1; + gp_Pnt2d aPnt2(10.0, 10.0); + gp_Pnt2d aPnt3(10.0, -10.0); + gp_Pnt2d aPnt4(10.0, 10.0); + Standard_Boolean anIsEqual2_3 = aPnt2.IsEqual(aPnt3, 1E-6); + Standard_Boolean anIsEqual2_4 = aPnt2.IsEqual(aPnt4, 1E-6); + Standard_Real aDistance1_2 = aPnt1.Distance(aPnt2); + Standard_Real aDistance2_4 = aPnt2.Distance(aPnt4); + Standard_Real aSquareDistance1_2 = aPnt1.SquareDistance(aPnt2); + Standard_Real aSquareDistance2_4 = aPnt2.SquareDistance(aPnt4); + + myResult << "A coordinate of a point 1: X: " << aPnt1.X() << " Y: " << aPnt1.Y() << std::endl; + myResult << "A coordinate of a point 2: X: " << aPnt2.X() << " Y: " << aPnt2.Y() << std::endl; + myResult << "A coordinate of a point 3: X: " << aPnt3.X() << " Y: " << aPnt3.Y() << std::endl; + myResult << "A coordinate of a point 4: X: " << aPnt4.X() << " Y: " << aPnt4.Y() << std::endl; + if (anIsEqual2_3) + { + myResult << "A point 2 is equal to a point 3" << std::endl; + } + else + { + myResult << "A point 2 is different from a point 3" << std::endl; + } + if (anIsEqual2_4) + { + myResult << "A point 2 is equal to a point 4" << std::endl; + } + else + { + myResult << "A point 2 is different from a point 4" << std::endl; + } + + myResult << "A distance from a point 1 to a point 2 is: " << aDistance1_2 << std::endl; + myResult << "A distance from a point 2 to a point 4 is: " << aDistance2_4 << std::endl; + + myResult << "A square distance from a point 1 to a point 2 is: " << aSquareDistance1_2 << std::endl; + myResult << "A square distance from a point 2 to a point 4 is: " << aSquareDistance2_4 << std::endl; + + DisplayPnt(aPnt1, "1", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aPnt2, "2 & 4", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aPnt3, "3", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aPnt4, ""); +} + +void GeometrySamples::CircleInfo2dSample() +{ + gp_Circ2d aCirc(gp_Ax22d(gp_Pnt2d(10.0, 10.0), gp_Vec2d(1.0, 0.0)), 10.0); + gp_Pnt2d aPnt1(0.0, 10.0); + gp_Pnt2d aPnt2(10.0, 0.0); + gp_Pnt2d aPnt3(20.0, 20.0); + + if (aCirc.Contains(aPnt1, 1E-6)) + { + DisplayPnt(aPnt1, "1", Aspect_TOM_STAR, 3.0); + myResult << "A circle contains a point 1" << std::endl; + } + else + { + DisplayPnt(aPnt1, "1", Aspect_TOM_PLUS, 1.0); + myResult << "A circle does contain a point 1" << std::endl; + } + if (aCirc.Contains(aPnt2, 1E-6)) + { + DisplayPnt(aPnt2, "2", Aspect_TOM_STAR, 1.0); + myResult << "A circle contains a point 2" << std::endl; + } + else + { + DisplayPnt(aPnt2, "2", Aspect_TOM_PLUS, 1.0); + myResult << "A circle does contain a point 2" << std::endl; + } + if (aCirc.Contains(aPnt3, 1E-6)) + { + DisplayPnt(aPnt3, "3", Aspect_TOM_STAR, 1.0); + myResult << "A circle contains a point 3" << std::endl; + } + else + { + DisplayPnt(aPnt3, "3", Aspect_TOM_PLUS, 1.0); + myResult << "A circle does contain a point 3" << std::endl; + } + myResult << "Circle area = " << aCirc.Area() << "square units" << std::endl; + Handle(Geom2d_Circle) aGeomCircle = new Geom2d_Circle(aCirc); + Handle(AdaptorCurve2d_AIS) anAisCirc = new AdaptorCurve2d_AIS(aGeomCircle); + myObject2d.Append(anAisCirc); +} + +void GeometrySamples::FreeStyleCurves3dSample() +{ + // Define points. + gp_Pnt aPnt1(0.0, 0.0, 0.0); + gp_Pnt aPnt2(5.0, 5.0, 0.0); + gp_Pnt aPnt3(10.0, 5.0, 0.0); + gp_Pnt aPnt4(15.0, 0.0, 0.0); + + // Add points to the curve poles array. + TColgp_Array1OfPnt aPoles(1, 4); + aPoles.SetValue(1, aPnt1); + aPoles.SetValue(2, aPnt2); + aPoles.SetValue(3, aPnt3); + aPoles.SetValue(4, aPnt4); + + // Define BSpline weights. + TColStd_Array1OfReal aBSplineWeights(1, 4); + aBSplineWeights.SetValue(1, 1.0); + aBSplineWeights.SetValue(2, 0.5); + aBSplineWeights.SetValue(3, 0.5); + aBSplineWeights.SetValue(4, 1.0); + + // Define knots. + TColStd_Array1OfReal aKnots(1, 2); + aKnots.SetValue(1, 0.0); + aKnots.SetValue(2, 1.0); + + // Define multiplicities. + TColStd_Array1OfInteger aMults(1, 2); + aMults.SetValue(1, 4); + aMults.SetValue(2, 4); + + // Define BSpline degree and periodicity. + Standard_Integer aDegree = 3; + Standard_Boolean aPeriodic = Standard_False; + + // Create a BSpline curve. + Handle(Geom_BSplineCurve) aBSplineCurve = new Geom_BSplineCurve( + aPoles, aBSplineWeights, aKnots, aMults, aDegree, aPeriodic); + myResult << "Geom_BSplineCurve was created in red" << std::endl; + + // Define Bezier weights. + TColStd_Array1OfReal aBezierWeights(1, 4); + aBezierWeights.SetValue(1, 0.5); + aBezierWeights.SetValue(2, 1.5); + aBezierWeights.SetValue(3, 1.5); + aBezierWeights.SetValue(4, 0.5); + + // Create Bezier curve. + Handle(Geom_BezierCurve) aBezierCurve = new Geom_BezierCurve(aPoles, aBezierWeights); + myResult << "Geom_BezierCurve was created in green" << std::endl; + + Handle(AIS_ColoredShape) anAisBSplineCurve = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aBSplineCurve).Shape()); + Handle(AIS_ColoredShape) anAisBezierCurve = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aBezierCurve).Shape()); + anAisBSplineCurve->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisBezierCurve->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisBSplineCurve); + myObject3d.Append(anAisBezierCurve); + myObject3d.Append(new AIS_Point(new Geom_CartesianPoint(aPnt1))); + myObject3d.Append(new AIS_Point(new Geom_CartesianPoint(aPnt2))); + myObject3d.Append(new AIS_Point(new Geom_CartesianPoint(aPnt3))); + myObject3d.Append(new AIS_Point(new Geom_CartesianPoint(aPnt4))); +} + +void GeometrySamples::AnalyticalSurfaces3dSample() +{ + // Define a XY plane. + gp_Pln aPln(gp::Origin(), gp::DZ()); + // Create plane geometry. + Handle(Geom_Plane) aPlaneSurf = new Geom_Plane(aPln); + myResult << "Geom_Plane was created in red" << std::endl; + + // Define a cylinder. + gp_Cylinder aCyl(gp::XOY(), 2.5); + // Create cylindrical surface. + Handle(Geom_CylindricalSurface) aCylSurf = new Geom_CylindricalSurface(aCyl); + myResult << "Geom_CylindricalSurface was created in green" << std::endl; + + // Define a cone. + gp_Cone aCone(gp::XOY(), M_PI_4, 2.5); + // Create conical surface. + Handle(Geom_ConicalSurface) aConeSurf = new Geom_ConicalSurface(aCone); + myResult << "Geom_ConicalSurface was created in blue" << std::endl; + + // Define a sphere. + gp_Pnt aSphereCenter(15.0, 15.0, 15.0); + gp_Sphere aSphere(gp_Ax3(aSphereCenter, gp::DZ()), 8.0); + // Create conical surface. + Handle(Geom_SphericalSurface) aSphereSurf = new Geom_SphericalSurface(aSphere); + myResult << "Geom_SphericalSurface was created in cyan" << std::endl; + + // Define a sphere. + gp_Pnt aTorusCenter(-15.0, -15.0, 25.0); + gp_Torus aTorus(gp_Ax3(aTorusCenter, gp::DZ()), 15.0, 5.0); + // Create toroidal surface. + Handle(Geom_ToroidalSurface) aTorusSurf = new Geom_ToroidalSurface(aTorus); + myResult << "Geom_ToroidalSurface was created in yellow" << std::endl; + + Handle(AIS_ColoredShape) anAisPlane = new AIS_ColoredShape(BRepBuilderAPI_MakeFace( + aPlaneSurf, 0.0, 20.0, 0.0, 20.0, Precision::Confusion()).Shape()); + Handle(AIS_ColoredShape) anAisCylinder = new AIS_ColoredShape(BRepBuilderAPI_MakeFace( + aCylSurf, 0.0, 2.0 * M_PI, 5.0, 15.0, Precision::Confusion()).Shape()); + Handle(AIS_ColoredShape) anAisCone = new AIS_ColoredShape(BRepBuilderAPI_MakeFace( + aConeSurf, 0.0, 2.0 * M_PI, 0.0, 15.0, Precision::Confusion()).Shape()); + Handle(AIS_ColoredShape) anAisSphere = new AIS_ColoredShape(BRepBuilderAPI_MakeFace( + aSphereSurf, Precision::Confusion()).Shape()); + Handle(AIS_ColoredShape) anAisTorus = new AIS_ColoredShape(BRepBuilderAPI_MakeFace( + aTorusSurf, Precision::Confusion()).Shape()); + anAisPlane->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisCylinder->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + anAisCone->SetColor(Quantity_Color(Quantity_NOC_BLUE1)); + anAisSphere->SetColor(Quantity_Color(Quantity_NOC_CYAN1)); + anAisTorus->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + myObject3d.Append(anAisPlane); + myObject3d.Append(anAisCylinder); + myObject3d.Append(anAisCone); + myObject3d.Append(anAisSphere); + myObject3d.Append(anAisTorus); +} + +void GeometrySamples::FreeStyleSurfaces3dSample() +{ + // Define a 4x4 grid of points for BSpline surface. + TColgp_Array2OfPnt aBSplinePnts(1, 4, 1, 4); + for (Standard_Integer i = 1; i <= 4; ++i) + { + gp_Pnt aPnt; + aPnt.SetX(5.0 * i); + for (Standard_Integer j = 1; j <= 4; ++j) + { + aPnt.SetY(5.0 * j); + if (1 < i && i < 4 && 1 < j && j < 4) + { + aPnt.SetZ(5.0); + } + else + { + aPnt.SetZ(0.0); + } + aBSplinePnts.SetValue(i, j, aPnt); + } + } + + // Define a 4x4 grid of points for Bezier surface. + TColgp_Array2OfPnt aBezierPnts(1, 4, 1, 4); + for (Standard_Integer i = 1; i <= 4; ++i) + { + gp_Pnt aPnt; + aPnt.SetX(20.0 + 5.0 * i); + for (Standard_Integer j = 1; j <= 4; ++j) + { + aPnt.SetY(20.0 + 5.0 * j); + if (1 < i && i < 4 && 1 < j && j < 4) + { + aPnt.SetZ(5.0); + } + else + { + aPnt.SetZ(0.0); + } + aBezierPnts.SetValue(i, j, aPnt); + } + } + + // Define BSpline weights. + TColStd_Array2OfReal aBSplineWeights(1, 4, 1, 4); + for (Standard_Integer i = 1; i <= 4; ++i) + { + for (Standard_Integer j = 1; j <= 4; ++j) + { + if (1 < i && i < 4 && 1 < j && j < 4) + { + aBSplineWeights.SetValue(i, j, 0.5); + } + else + { + aBSplineWeights.SetValue(i, j, 1.0); + } + } + } + + // Define knots. + TColStd_Array1OfReal aUKnots(1, 2), aVKnots(1, 2); + aUKnots.SetValue(1, 0.0); + aUKnots.SetValue(2, 1.0); + aVKnots.SetValue(1, 0.0); + aVKnots.SetValue(2, 1.0); + + // Define multiplicities. + TColStd_Array1OfInteger aUMults(1, 2), aVMults(1, 2); + aUMults.SetValue(1, 4); + aUMults.SetValue(2, 4); + aVMults.SetValue(1, 4); + aVMults.SetValue(2, 4); + + // Define BSpline degree and periodicity. + Standard_Integer aUDegree = 3; + Standard_Integer aVDegree = 3; + Standard_Boolean aUPeriodic = Standard_False; + Standard_Boolean aVPeriodic = Standard_False; + + // Create a BSpline surface. + Handle(Geom_BSplineSurface) aBSplineSurf = new Geom_BSplineSurface( + aBSplinePnts, aBSplineWeights, aUKnots, aVKnots, + aUMults, aVMults, aUDegree, aVDegree, aUPeriodic, aVPeriodic); + myResult << "Geom_BSplineSurface was created in red" << std::endl; + + // Define BSpline weights. + TColStd_Array2OfReal aBezierWeights(1, 4, 1, 4); + for (Standard_Integer i = 1; i <= 4; ++i) + { + for (Standard_Integer j = 1; j <= 4; ++j) + { + if (1 < i && i < 4 && 1 < j && j < 4) + { + aBezierWeights.SetValue(i, j, 1.5); + } + else + { + aBezierWeights.SetValue(i, j, 0.5); + } + } + } + + // Create a Bezier surface. + Handle(Geom_BezierSurface) aBezierSurf = new Geom_BezierSurface(aBezierPnts, aBezierWeights); + myResult << "Geom_BezierSurface was created in green" << std::endl; + + Handle(AIS_ColoredShape) anAisBSplineSurf = new AIS_ColoredShape( + BRepBuilderAPI_MakeFace(aBSplineSurf, Precision::Confusion()).Shape()); + Handle(AIS_ColoredShape) anAisBezierSurf = new AIS_ColoredShape( + BRepBuilderAPI_MakeFace(aBezierSurf, Precision::Confusion()).Shape()); + anAisBSplineSurf->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisBezierSurf->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisBSplineSurf); + myObject3d.Append(anAisBezierSurf); + for (TColgp_Array2OfPnt::Iterator anIt(aBSplinePnts); anIt.More(); anIt.Next()) + { + myObject3d.Append(new AIS_Point(new Geom_CartesianPoint(anIt.Value()))); + } + for (TColgp_Array2OfPnt::Iterator anIt(aBezierPnts); anIt.More(); anIt.Next()) + { + myObject3d.Append(new AIS_Point(new Geom_CartesianPoint(anIt.Value()))); + } +} + +void GeometrySamples::FreeStyleCurves2dSample() +{ + + // Define points. + gp_Pnt2d aPnt1(0.0, 0.0); + gp_Pnt2d aPnt2(5.0, 5.0); + gp_Pnt2d aPnt3(10.0, 5.0); + gp_Pnt2d aPnt4(15.0, 0.0); + + // Add points to the curve poles array. + TColgp_Array1OfPnt2d aBSplinePoles(1, 4); + aBSplinePoles.SetValue(1, aPnt1); + aBSplinePoles.SetValue(2, aPnt2); + aBSplinePoles.SetValue(3, aPnt3); + aBSplinePoles.SetValue(4, aPnt4); + + // Define BSpline weights. + TColStd_Array1OfReal aBSplineWeights(1, 4); + aBSplineWeights.SetValue(1, 1.0); + aBSplineWeights.SetValue(2, 0.5); + aBSplineWeights.SetValue(3, 0.5); + aBSplineWeights.SetValue(4, 1.0); + + // Define knots. + TColStd_Array1OfReal aKnots(1, 2); + aKnots.SetValue(1, 0.0); + aKnots.SetValue(2, 1.0); + + // Define multiplicities. + TColStd_Array1OfInteger aMults(1, 2); + aMults.SetValue(1, 4); + aMults.SetValue(2, 4); + + // Define BSpline degree and periodicity. + Standard_Integer aDegree = 3; + Standard_Boolean aPeriodic = Standard_False; + + // Create a BSpline curve. + Handle(Geom2d_BSplineCurve) aBSplineCurve = + new Geom2d_BSplineCurve(aBSplinePoles, aBSplineWeights, aKnots, aMults, aDegree, aPeriodic); + + + TColgp_Array1OfPnt2d aBezierPoles(1, 4); + gp_Vec2d anUp10Vec(0.0, 10.0); + aBezierPoles.SetValue(1, aPnt1.Translated(anUp10Vec)); + aBezierPoles.SetValue(2, aPnt2.Translated(anUp10Vec)); + aBezierPoles.SetValue(3, aPnt3.Translated(anUp10Vec)); + aBezierPoles.SetValue(4, aPnt4.Translated(anUp10Vec)); + + // Define Bezier weights. + TColStd_Array1OfReal aBezierWeights(1, 4); + aBezierWeights.SetValue(1, 0.5); + aBezierWeights.SetValue(2, 1.5); + aBezierWeights.SetValue(3, 1.5); + aBezierWeights.SetValue(4, 0.5); + + // Create Bezier curve. + Handle(Geom2d_BezierCurve) aBezierCurve = new Geom2d_BezierCurve(aBezierPoles, aBezierWeights); + + Handle(AdaptorCurve2d_AIS) anAisBSpline = new AdaptorCurve2d_AIS(aBSplineCurve); + myObject2d.Append(anAisBSpline); + Handle(AdaptorCurve2d_AIS) anAisBezier = new AdaptorCurve2d_AIS(aBezierCurve); + myObject2d.Append(anAisBezier); + + DisplayPnt(aPnt1, "1", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aPnt2, "2", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aPnt3, "3", Aspect_TOM_PLUS, 0.5); + DisplayPnt(aPnt4, "4", Aspect_TOM_PLUS, 0.5); +} + +void GeometrySamples::TrimmedCurve3dSample() +{ + // Define a circle placed in the origin of XY coordinate + // plane and with the radius equal to 5. + gp_Circ aCirc(gp::XOY(), 5.0); + // Create a closed circular curve. + Handle(Geom_Circle) aCircCurve = new Geom_Circle(aCirc); + myResult << "Geom_Circle was created in yellow" << std::endl; + + // Cut off a quarter of the circle. + Handle(Geom_TrimmedCurve) aCircQuater = new Geom_TrimmedCurve(aCircCurve, 0.0, M_PI_2); + myResult << "Geom_TrimmedCurve was created in red" << std::endl; + + Handle(AIS_ColoredShape) anAisCirc = new AIS_ColoredShape (BRepBuilderAPI_MakeEdge(aCircCurve).Shape()); + Handle(AIS_ColoredShape) anAisCircQuater = new AIS_ColoredShape (BRepBuilderAPI_MakeEdge(aCircQuater).Shape()); + anAisCirc->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisCircQuater->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisCircQuater->SetWidth(2.5); + myObject3d.Append(anAisCirc); + myObject3d.Append(anAisCircQuater); +} + +void GeometrySamples::OffsetCurve3dSample() +{ + // Define a circle placed in the origin of XY coordinate + // plane and with the radius equal to 5. + gp_Circ aCirc(gp::XOY(), 5.0); + // Create a closed circular curve. + Handle(Geom_Circle) aCircCurve = new Geom_Circle(aCirc); + myResult << "Geom_Circle was created in yellow" << std::endl; + + // An offset curve is a curve at constant distance (Offset) from + // a basis curve in a reference direction V. + // The offset curve takes its parametrization from the basis curve. + // The Offset curve is in the direction of the normal N + // defined with the cross product T^V, where the vector T + // is given by the first derivative on the basis curve with non zero length. + // The distance offset may be positive or negative to indicate the + // preferred side of the curve: + // . distance offset >0 => the curve is in the direction of N + // . distance offset <0 => the curve is in the direction of - N + // On the Offset curve: + // Value (U) = BasisCurve.Value(U) + (Offset * (T ^ V)) / ||T ^ V|| + // At any point the Offset direction V must not be parallel to the + // vector T and the vector T must not have null length else the + // offset curve is not defined. + + // Expand the circle by Offset equal to a quarter of the radius + // with direction V equal to Z. + Standard_Real anExpandOffset = +aCirc.Radius() / 4.0; + gp_Dir anExpandDir = gp::DZ(); + Handle(Geom_OffsetCurve) anExpandCircCurve = new Geom_OffsetCurve( + aCircCurve, anExpandOffset, anExpandDir); + myResult << "Geom_OffsetCurve (expanded circle) was created in red" << std::endl; + + // Collapse the circle by Offset equal to a half of the radius with direction V equal to Z. + Standard_Real anCollapseOffset = -aCirc.Radius() / 2.0; + gp_Dir anCollapseDir = gp::DZ(); + Handle(Geom_OffsetCurve) anCollapseCircCurve = new Geom_OffsetCurve (aCircCurve, anCollapseOffset, anCollapseDir); + myResult << "Geom_OffsetCurve (collapsed circle) was created in green" << std::endl; + + Handle(AIS_ColoredShape) anAisCirc = new AIS_ColoredShape (BRepBuilderAPI_MakeEdge(aCircCurve).Shape()); + Handle(AIS_ColoredShape) anAisExpandCirc = new AIS_ColoredShape (BRepBuilderAPI_MakeEdge(anExpandCircCurve).Shape()); + Handle(AIS_ColoredShape) anAisCpllapsedCirc = new AIS_ColoredShape (BRepBuilderAPI_MakeEdge(anCollapseCircCurve).Shape()); + anAisCirc->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisExpandCirc->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisCpllapsedCirc->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisCirc); + myObject3d.Append(anAisExpandCirc); + myObject3d.Append(anAisCpllapsedCirc); +} + +void GeometrySamples::BSplineFromCircle3dSample() +{ + // Define a circle placed in the origin of XY coordinate + // plane and with the radius equal to 5. + gp_Circ aCirc(gp::XOY(), 5.0); + // Create a closed circular curve. + Handle(Geom_Circle) aCircCurve = new Geom_Circle(aCirc); + myResult << "Geom_Circle was created in yellow" << std::endl; + + // Convert the circle curve to a BSpline one. + Handle(Geom_BSplineCurve) aBSplineFromCirc = GeomConvert::CurveToBSplineCurve(aCircCurve); + myResult << "Geom_BSplineCurve was created in red:" << std::endl; + myResult << "Degree: " << aBSplineFromCirc->Degree() << std::endl; + myResult << "Periodic: " << (aBSplineFromCirc->IsPeriodic() ? "Yes" : "No") << std::endl; + myResult << "Poles: [" << aBSplineFromCirc->Poles().Size() << "]" << std::endl; + for (TColgp_Array1OfPnt::Iterator anIt(aBSplineFromCirc->Poles()); anIt.More(); anIt.Next()) + { + myResult << " (" << anIt.Value().X() << ", " << anIt.Value().Y() << ", " << anIt.Value().Z() << ")" << std::endl; + } + + Handle(AIS_ColoredShape) anAisCirc = new AIS_ColoredShape (BRepBuilderAPI_MakeEdge(aCircCurve).Shape()); + Handle(AIS_ColoredShape) anAisBSpline = new AIS_ColoredShape (BRepBuilderAPI_MakeEdge(aBSplineFromCirc).Shape()); + anAisCirc->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisBSpline->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisCirc); + myObject3d.Append(anAisBSpline); +} + +void GeometrySamples::TrimmedSurface3dSample() +{ + // Define a XY plane. + gp_Pln aPln(gp::XOY()); + // Create a plane surface. + Handle(Geom_Plane) aPlaneSurf = new Geom_Plane(aPln); + myResult << "Geom_Plane was created" << std::endl; + + // Trim [0 ... 30 X 0 ... 50] rectangular range. + Standard_Real aUMin = 0.0; + Standard_Real aUMax = 30.0; + Standard_Real aVMin = 0.0; + Standard_Real aVMax = 50.0; + Handle(Geom_RectangularTrimmedSurface) aTrimmedPlaneSurf + = new Geom_RectangularTrimmedSurface(aPlaneSurf, aUMin, aUMax, aVMin, aVMax); + myResult << "Geom_RectangularTrimmedSurface was created in red" << std::endl; + + Handle(AIS_Plane) anAisPlane = new AIS_Plane(aPlaneSurf); + Handle(AIS_ColoredShape) anAisTimmedPlane = new AIS_ColoredShape (BRepBuilderAPI_MakeFace (aTrimmedPlaneSurf, 0.001).Shape()); + anAisTimmedPlane->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisPlane); + myObject3d.Append(anAisTimmedPlane); +} + +void GeometrySamples::OffsetSurface3dSample() +{ + // Define a XY plane. + gp_Pln aPln(gp::XOY()); + // Create a plane surface. + Handle(Geom_Plane) aPlaneSurf = new Geom_Plane(aPln); + myResult << "Geom_Plane was created" << std::endl; + + // An offset surface is defined by: + // - the basis surface to which it is parallel, and + // - the distance between the offset surface and its basis surface. + // A point on the offset surface is built by measuring the + // offset value along the normal vector at a point on the + // basis surface. This normal vector is given by the cross + // product D1u^D1v, where D1u and D1v are the + // vectors tangential to the basis surface in the u and v + // parametric directions at this point. The side of the + // basis surface on which the offset is measured + // depends on the sign of the offset value. + + // Offset the plane in the normal direction. + Standard_Real aPosOffset = 10.0; + Handle(Geom_OffsetSurface) aPosOffsetSurf = new Geom_OffsetSurface(aPlaneSurf, aPosOffset); + myResult << "Geom_OffsetSurface with " << aPosOffset << " was created in red" << std::endl; + + // Offset the plane in direction opposite to the normal one. + Standard_Real aNegOffset = -15.0; + Handle(Geom_OffsetSurface) aNegOffsetSurf = new Geom_OffsetSurface(aPlaneSurf, aNegOffset); + myResult << "Geom_OffsetSurface with " << aNegOffset << " was created in green" << std::endl; + + Handle(AIS_ColoredShape) anAisPlane = new AIS_ColoredShape( + BRepBuilderAPI_MakeFace(aPlaneSurf, 0.0, 10.0, 0.0, 10.0, Precision::Confusion()).Shape()); + Handle(AIS_ColoredShape) anAisPosOffsetPlane = new AIS_ColoredShape( + BRepBuilderAPI_MakeFace(aPosOffsetSurf, 0.0, 10.0, 0.0, 10.0, Precision::Confusion()).Shape()); + Handle(AIS_ColoredShape) anAisNegOffsetPlane = new AIS_ColoredShape( + BRepBuilderAPI_MakeFace(aNegOffsetSurf, 0.0, 10.0, 0.0, 10.0, Precision::Confusion()).Shape()); + anAisPosOffsetPlane->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisNegOffsetPlane->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisPlane); + myObject3d.Append(anAisPosOffsetPlane); + myObject3d.Append(anAisNegOffsetPlane); +} + +void GeometrySamples::ExtrusionSurface3dSample() +{ + // Create an ellipse curve in XY plane. + Standard_Real aMinorRadius = 10.0; + Standard_Real aMajorRadius = 20.0; + Handle(Geom_Ellipse) anEllipseCurve = new Geom_Ellipse(gp::XOY(), aMajorRadius, aMinorRadius); + myResult << "Geom_Ellipse was created in yellow" << std::endl; + + // Make a linear extrusion of the ellipse at 45 degrees to Z axis + gp_Dir aDirOfExtr = gp::DZ(); + Handle(Geom_SurfaceOfLinearExtrusion) aLinExtrSurf + = new Geom_SurfaceOfLinearExtrusion(anEllipseCurve, aDirOfExtr); + myResult << "Geom_SurfaceOfLinearExtrusion was created in red" << std::endl; + + Handle(AIS_ColoredShape) anAisEllipse = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(anEllipseCurve).Shape()); + Handle(AIS_ColoredShape) anAisExtrSurf = new AIS_ColoredShape( + BRepBuilderAPI_MakeFace(aLinExtrSurf, 0.0, 2.0 * M_PI, 0.0, 30.0, + Precision::Confusion()).Shape()); + anAisEllipse->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisEllipse->SetWidth(2.5); + anAisExtrSurf->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisEllipse); + myObject3d.Append(anAisExtrSurf); +} + +void GeometrySamples::RevolutionSurface3dSample() +{ + // Create an ellipse curve in XY plane with + // the center at (-10, 0, 0). + Standard_Real aMinorRadius = 5.0; + Standard_Real aMajorRadius = 10.0; + gp_Pnt aCenter(-30.0, 0.0, 0.0); + Handle(Geom_Ellipse) anEllipseCurve = new Geom_Ellipse(gp_Ax2(aCenter, gp::DZ()), + aMajorRadius, aMinorRadius); + myResult << "Geom_Ellipse was created in yellow" << std::endl; + + // Make a revolution of the ellipse around Y axis + Handle(Geom_SurfaceOfRevolution) aRevolSurf = new Geom_SurfaceOfRevolution(anEllipseCurve, gp::OY()); + myResult << "Geom_SurfaceOfRevolution was created in red" << std::endl; + + Handle(AIS_ColoredShape) anAisEllipse = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(anEllipseCurve).Shape()); + Handle(AIS_ColoredShape) anAisRevolSurf = new AIS_ColoredShape( + BRepBuilderAPI_MakeFace(aRevolSurf, Precision::Confusion()).Shape()); + anAisEllipse->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisEllipse->SetWidth(2.5); + anAisRevolSurf->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisEllipse); + myObject3d.Append(anAisRevolSurf); +} + +void GeometrySamples::TrimmedCurve2dSample() +{ + // Create a closed circular curve. + Handle(Geom2d_Circle) aGeomCircle = new Geom2d_Circle(gp_Ax2d(gp_Pnt2d(), gp_Vec2d(1.0, 0.0)), 5.0); + Handle(AdaptorCurve2d_AIS) anAisCirc = new AdaptorCurve2d_AIS(aGeomCircle); + myObject2d.Append(anAisCirc); + + // Cut off a quarter of the circle. + Handle(Geom2d_TrimmedCurve) aCircQuater = new Geom2d_TrimmedCurve(aGeomCircle, 0.0, M_PI_2); + aCircQuater->Translate(gp_Vec2d(15.0, 0.0)); + Handle(AdaptorCurve2d_AIS) anAisCircQuater = new AdaptorCurve2d_AIS(aCircQuater); + myObject2d.Append(anAisCircQuater); +} + +void GeometrySamples::OffsetCurve2dSample() +{ + Handle(Geom2d_Circle) aGeomCircle = new Geom2d_Circle(gp_Ax2d(gp_Pnt2d(), gp_Vec2d(1.0, 0.0)), 5.0); + + Standard_Real anExpandOffset = aGeomCircle->Radius() / 4.0; + Handle(Geom2d_OffsetCurve) anExpandCircCurve = new Geom2d_OffsetCurve(aGeomCircle, anExpandOffset); + + Standard_Real anCollapseOffset = -aGeomCircle->Radius() / 2.0; + Handle(Geom2d_OffsetCurve) anCollapseCircCurve = new Geom2d_OffsetCurve(aGeomCircle, anCollapseOffset); + + Handle(AdaptorCurve2d_AIS) anAisCirc = new AdaptorCurve2d_AIS(aGeomCircle); + myObject2d.Append(anAisCirc); + Handle(AdaptorCurve2d_AIS) anAisExpand = new AdaptorCurve2d_AIS(anExpandCircCurve); + myObject2d.Append(anAisExpand); + Handle(AdaptorCurve2d_AIS) anAisCollapse = new AdaptorCurve2d_AIS(anCollapseCircCurve); + myObject2d.Append(anAisCollapse); +} + +void GeometrySamples::BoundingBoxOfSurface3dSample() +{ + // Define a 4x4 grid of points for BSpline surface. + TColgp_Array2OfPnt aPoints(1, 4, 1, 4); + for (Standard_Integer i = 1; i <= 4; ++i) + { + gp_Pnt aPnt; + aPnt.SetX(5.0 * i); + for (Standard_Integer j = 1; j <= 4; ++j) + { + aPnt.SetY(5.0 * j); + if (1 < i && i < 4 && 1 < j && j < 4) + { + aPnt.SetZ(5.0); + } + else + { + aPnt.SetZ(0.0); + } + aPoints.SetValue(i, j, aPnt); + } + } + + // Make a BSpline surface from the points array. + Handle(Geom_BSplineSurface) aBSplineSurf = GeomAPI_PointsToBSplineSurface(aPoints).Surface(); + myResult << "Geom_BSplineSurface was created" << std::endl; + + // Compute BSpline surface bounding box. + Bnd_Box aBndBox; + BndLib_AddSurface::AddOptimal(GeomAdaptor_Surface(aBSplineSurf), Precision::Confusion(), aBndBox); + myResult << "Bounding box:" << std::endl; + myResult << " Min corner = [ " + << aBndBox.CornerMin().X() << ", " + << aBndBox.CornerMin().Y() << ", " + << aBndBox.CornerMin().Z() << " ]" << std::endl; + myResult << " Max corner = [ " + << aBndBox.CornerMax().X() << ", " + << aBndBox.CornerMax().Y() << ", " + << aBndBox.CornerMax().Z() << " ]" << std::endl; + + Handle(AIS_ColoredShape) anAisBSplineSurf = new AIS_ColoredShape( + BRepBuilderAPI_MakeFace(aBSplineSurf, Precision::Confusion()).Shape()); + Handle(AIS_ColoredShape) anAisBndBox = new AIS_ColoredShape( + BRepPrimAPI_MakeBox(aBndBox.CornerMin(), aBndBox.CornerMax()).Shell()); + myObject3d.Append(anAisBSplineSurf); + myObject3d.Append(anAisBndBox); + myContext->SetDisplayMode(anAisBndBox, 0, Standard_True); +} + +void GeometrySamples::BoundingBoxOfCurves3dSample() +{ + // Define points. + gp_Pnt aPnt1(0.0, 0.0, 10.0); + gp_Pnt aPnt2(5.0, 5.0, 5.0); + gp_Pnt aPnt3(10.0, 10.0, 15.0); + gp_Pnt aPnt4(15.0, 5.0, 20.0); + + // Add points to the curve poles array. + TColgp_Array1OfPnt aPoles(1, 4); + aPoles.SetValue(1, aPnt1); + aPoles.SetValue(2, aPnt2); + aPoles.SetValue(3, aPnt3); + aPoles.SetValue(4, aPnt4); + + // Make a BSpline curve from the points array. + Handle(Geom_BSplineCurve) aBSplineCurve = GeomAPI_PointsToBSpline(aPoles).Curve(); + myResult << "aBSplineCurve was created" << std::endl; + + // Compute BSpline curve bounding box. + Bnd_Box aBndBox; + BndLib_Add3dCurve::AddOptimal(GeomAdaptor_Curve(aBSplineCurve), Precision::Confusion(), aBndBox); + myResult << "Bounding box:" << std::endl; + myResult << " Min corner = [ " + << aBndBox.CornerMin().X() << ", " + << aBndBox.CornerMin().Y() << ", " + << aBndBox.CornerMin().Z() << " ]" << std::endl; + myResult << " Max corner = [ " + << aBndBox.CornerMax().X() << ", " + << aBndBox.CornerMax().Y() << ", " + << aBndBox.CornerMax().Z() << " ]" << std::endl; + + Handle(AIS_ColoredShape) anAisBSplineCurve = new AIS_ColoredShape (BRepBuilderAPI_MakeEdge(aBSplineCurve).Shape()); + Handle(AIS_ColoredShape) anAisBndBox = new AIS_ColoredShape (BRepPrimAPI_MakeBox(aBndBox.CornerMin(), aBndBox.CornerMax()).Shell()); + myObject3d.Append(anAisBSplineCurve); + myObject3d.Append(anAisBndBox); + myContext->SetDisplayMode(anAisBndBox, 0, Standard_True); +} + +void GeometrySamples::BoundingBoxOfCurves2dSample() +{ + // Define points. + gp_Pnt2d aPnt1(0.0, 0.0); + gp_Pnt2d aPnt2(5.0, 5.0); + gp_Pnt2d aPnt3(10.0, 10.0); + gp_Pnt2d aPnt4(15.0, 5.0); + + // Add points to the curve poles array. + TColgp_Array1OfPnt2d aPoles(1, 4); + aPoles.SetValue(1, aPnt1); + aPoles.SetValue(2, aPnt2); + aPoles.SetValue(3, aPnt3); + aPoles.SetValue(4, aPnt4); + + // Make a BSpline curve from the points array. + Handle(Geom2d_BSplineCurve) aBSplineCurve = Geom2dAPI_PointsToBSpline(aPoles).Curve(); + + // Compute BSpline curve bounding box. + Bnd_Box2d aBndBox; + BndLib_Add2dCurve::AddOptimal(aBSplineCurve, 0.0, 1.0, Precision::PConfusion(), aBndBox); + Standard_Real aXmin, aYmin, aXmax, aYmax; + aBndBox.Get(aXmin, aYmin, aXmax, aYmax); + + myResult << "Bounding box:" << std::endl; + myResult << " Min corner = [ " << aXmin << ", " << aYmin << " ]" << std::endl; + myResult << " Max corner = [ " << aXmax << ", " << aYmax << " ]" << std::endl; + + Handle(AdaptorCurve2d_AIS) anAisBSpline = new AdaptorCurve2d_AIS(aBSplineCurve); + + Handle(AdaptorVec_AIS) anAisVec1 = new AdaptorVec_AIS(gp_Pnt2d(aXmin, aYmin), gp_Pnt2d(aXmin, aYmax)); + Handle(AdaptorVec_AIS) anAisVec2 = new AdaptorVec_AIS(gp_Pnt2d(aXmin, aYmax), gp_Pnt2d(aXmax, aYmax)); + Handle(AdaptorVec_AIS) anAisVec3 = new AdaptorVec_AIS(gp_Pnt2d(aXmax, aYmax), gp_Pnt2d(aXmax, aYmin)); + Handle(AdaptorVec_AIS) anAisVec4 = new AdaptorVec_AIS(gp_Pnt2d(aXmax, aYmin), gp_Pnt2d(aXmin, aYmin)); + + myObject2d.Append(anAisBSpline); + myObject2d.Append(anAisVec1); + myObject2d.Append(anAisVec2); + myObject2d.Append(anAisVec3); + myObject2d.Append(anAisVec4); +} + +void GeometrySamples::DumpCircleInfoSample() +{ + // Define a circle placed in the origin of XY coordinate + // plane and with the radius equal to 0.5. + gp_Circ aCirc(gp::XOY(), 0.5); + // Create a closed circular curve. + Handle(Geom_Circle) aCircCurve = new Geom_Circle(aCirc); + myResult << "Geom_Circle was created:" << std::endl; + myResult << " Center = [ " + << aCircCurve->Position().Location().X() << ", " + << aCircCurve->Position().Location().Y() << ", " + << aCircCurve->Position().Location().Z() << " ]" + << std::endl; + myResult << " Radius = " << aCircCurve->Radius() << std::endl; + myResult << " Plane normal = [ " + << aCircCurve->Position().Direction().X() << ", " + << aCircCurve->Position().Direction().Y() << ", " + << aCircCurve->Position().Direction().Z() << " ]" + << std::endl; + + Handle(AIS_Circle) anAisCircle = new AIS_Circle(aCircCurve); + Handle(AIS_TextLabel) anAisCenterLabel = new AIS_TextLabel(); + anAisCenterLabel->SetText(" Center"); + anAisCenterLabel->SetPosition(aCircCurve->Position().Location()); + Handle(AIS_Point) anAisCenter = new AIS_Point(new Geom_CartesianPoint(aCirc.Location())); + Handle(AIS_Axis) anAisAxis = new AIS_Axis(new Geom_Axis2Placement(aCircCurve->Position()), AIS_TOAX_ZAxis); + myObject3d.Append(anAisCircle); + myObject3d.Append(anAisCenterLabel); + myObject3d.Append(anAisAxis); +} + +void GeometrySamples::DumpBSplineCurveInfoSample() +{ + // Define points. + gp_Pnt aPnt1(0.0, 0.0, 10.0); + gp_Pnt aPnt2(5.0, 5.0, 5.0); + gp_Pnt aPnt3(10.0, 10.0, 15.0); + gp_Pnt aPnt4(15.0, 5.0, 20.0); + + // Add points to the curve poles array. + TColgp_Array1OfPnt aPoles(1, 4); + aPoles.SetValue(1, aPnt1); + aPoles.SetValue(2, aPnt2); + aPoles.SetValue(3, aPnt3); + aPoles.SetValue(4, aPnt4); + + // Make a BSpline curve from the points array + Handle(Geom_BSplineCurve) aBSplineCurve = GeomAPI_PointsToBSpline(aPoles).Curve(); + myResult << "aBSplineCurve was created:" << std::endl; + myResult << " Degree = " << aBSplineCurve->Degree() << std::endl; + myResult << " Parameter range = [ " + << aBSplineCurve->FirstParameter() << ", " + << aBSplineCurve->LastParameter() << " ]" + << std::endl; + NCollection_List aParams; + aParams.Append(0.75 * aBSplineCurve->FirstParameter() + 0.25 * aBSplineCurve->LastParameter()); + aParams.Append(0.50 * aBSplineCurve->FirstParameter() + 0.50 * aBSplineCurve->LastParameter()); + aParams.Append(0.25 * aBSplineCurve->FirstParameter() + 0.75 * aBSplineCurve->LastParameter()); + myResult << " Curve info:" << std::endl; + for (NCollection_List::Iterator anIt(aParams); anIt.More(); anIt.Next()) + { + Standard_Real aParam = anIt.Value(); + gp_Pnt aPnt; + gp_Vec aVec; + aBSplineCurve->D1(aParam, aPnt, aVec); + myResult << " Param = " << aParam << std::endl; + myResult << " P = [ " << aPnt.X() << ", " << aPnt.Y() << ", " << aPnt.Z() << " ]" << std::endl; + myResult << " D = [ " << aVec.X() << ", " << aVec.Y() << ", " << aVec.Z() << " ]" << std::endl; + myObject3d.Append(new AIS_Point(new Geom_CartesianPoint(aPnt))); + Handle(AIS_TextLabel) anAisCenterLabel = new AIS_TextLabel(); + Standard_SStream aSS; + aSS << "P [" << aPnt.X() << ", " << aPnt.Y() << ", " << aPnt.Z() << "]" << std::endl; + aSS << "D [" << aVec.X() << ", " << aVec.Y() << ", " << aVec.Z() << "]" << std::endl; + anAisCenterLabel->SetText(aSS.str().c_str()); + anAisCenterLabel->SetPosition(aPnt); + myObject3d.Append(anAisCenterLabel); + Handle(AIS_Axis) anAisD = new AIS_Axis(new Geom_Axis1Placement(gp_Ax1(aPnt, aVec))); + myObject3d.Append(anAisD); + } + + Handle(AIS_ColoredShape) anAisBSplineCurve = new AIS_ColoredShape (BRepBuilderAPI_MakeEdge(aBSplineCurve).Shape()); + anAisBSplineCurve->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisBSplineCurve); +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/GeometrySamples.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/GeometrySamples.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/GeometrySamples.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/GeometrySamples.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,102 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef GEOMETRYSAMPLES_H +#define GEOMETRYSAMPLES_H + +#include "BaseSample.h" + +//! Implements Geometry samples +class GeometrySamples : public BaseSample +{ + DEFINE_STANDARD_RTTI_INLINE(GeometrySamples, BaseSample) +public: + + GeometrySamples (const TCollection_AsciiString& theSampleSourcePath, + const Handle(AIS_InteractiveContext)& theContext) + : BaseSample(theSampleSourcePath, theContext) {} + +protected: + virtual void ExecuteSample (const TCollection_AsciiString& theSampleName) Standard_OVERRIDE; + +private: + void DisplayPnt (const gp_Pnt& thePnt, const TCollection_AsciiString& theText, + Aspect_TypeOfMarker theMarker = Aspect_TOM_PLUS, + Standard_Real theDistance = 5.0); + void DisplayPnt (const gp_Pnt2d& thePnt2d, const TCollection_AsciiString& theText, + Aspect_TypeOfMarker theMarker = Aspect_TOM_PLUS, + Standard_Real theDistance = 5.0); + + // One function for every sample + void ZeroDimensionObjects3dSample(); + void Vectors3dSample(); + void InfinityLines3dSample(); + void SecondOrderCurves3dSample(); + void PlaneSurfaces3dSample(); + void SecondOrderSurfaces3dSample(); + void ZeroDimensionObjects2dSample(); + void Vectors2dSample(); + void InfinityLines2dSample(); + void SecondOrderCurves2dSample(); + void BarycenterPoint3dSample(); + void RotatedVector3dSample(); + void MirroredLine3dSample(); + void ScaledEllipse3dSample(); + void TransformedCylinder3dSample(); + void TranslatedTorus3dSample(); + void ConjugateObjects3dSample(); + void ProjectionOfPoint3dSample(); + void MinimalDistance3dSample(); + void Intersection3dSample(); + void TranslatedPoint2dSample(); + void RotatedDirection2dSample(); + void MirroredAxis2dSample(); + void TransformedEllipse2dSample(); + void ConjugateObjects2dSample(); + void Tangent2dSample(); + void ProjectionOfPoint2dSample(); + void MinimalDistance2dSample(); + void Intersection2dSample(); + void PointInfo3dSample(); + void EllipseInfo3dSample(); + void PointInfo2dSample(); + void CircleInfo2dSample(); + void FreeStyleCurves3dSample(); + void AnalyticalSurfaces3dSample(); + void FreeStyleSurfaces3dSample(); + void FreeStyleCurves2dSample(); + void TrimmedCurve3dSample(); + void OffsetCurve3dSample(); + void BSplineFromCircle3dSample(); + void TrimmedSurface3dSample(); + void OffsetSurface3dSample(); + void ExtrusionSurface3dSample(); + void RevolutionSurface3dSample(); + void TrimmedCurve2dSample(); + void OffsetCurve2dSample(); + void BoundingBoxOfSurface3dSample(); + void BoundingBoxOfCurves3dSample(); + void BoundingBoxOfCurves2dSample(); + void DumpCircleInfoSample(); + void DumpBSplineCurveInfoSample(); +}; + +#endif //GEOMETRYSAMPLES_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Geometry.xml opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Geometry.xml --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Geometry.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Geometry.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/MakeBottle.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/MakeBottle.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/MakeBottle.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/MakeBottle.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,218 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "MakeBottle.h" + +#include + +#include + +#include +#include +#include +#include + +#include + +#include + +#include +#include + +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include + +TopoDS_Shape MakeBottle (const Standard_Real theWidth, + const Standard_Real theHeight, + const Standard_Real theThickness) +{ + // Profile : Define Support Points + gp_Pnt aPnt1(-theWidth / 2., 0, 0); + gp_Pnt aPnt2(-theWidth / 2., -theThickness / 4., 0); + gp_Pnt aPnt3(0, -theThickness / 2., 0); + gp_Pnt aPnt4(theWidth / 2., -theThickness / 4., 0); + gp_Pnt aPnt5(theWidth / 2., 0, 0); + + // Profile : Define the Geometry + Handle(Geom_TrimmedCurve) anArcOfCircle = GC_MakeArcOfCircle(aPnt2, aPnt3, aPnt4); + Handle(Geom_TrimmedCurve) aSegment1 = GC_MakeSegment(aPnt1, aPnt2); + Handle(Geom_TrimmedCurve) aSegment2 = GC_MakeSegment(aPnt4, aPnt5); + + // Profile : Define the Topology + TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(aSegment1); + TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(anArcOfCircle); + TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(aSegment2); + TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(anEdge1, anEdge2, anEdge3); + + // Complete Profile + gp_Ax1 xAxis = gp::OX(); + gp_Trsf aTrsf; + + aTrsf.SetMirror(xAxis); + BRepBuilderAPI_Transform aBRepTrsf(aWire, aTrsf); + TopoDS_Shape aMirroredShape = aBRepTrsf.Shape(); + TopoDS_Wire aMirroredWire = TopoDS::Wire(aMirroredShape); + + BRepBuilderAPI_MakeWire mkWire; + mkWire.Add(aWire); + mkWire.Add(aMirroredWire); + TopoDS_Wire myWireProfile = mkWire.Wire(); + + // Body : Prism the Profile + TopoDS_Face myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile); + gp_Vec aPrismVec(0, 0, theHeight); + TopoDS_Shape myBody = BRepPrimAPI_MakePrism(myFaceProfile, aPrismVec); + + // Body : Apply Fillets + BRepFilletAPI_MakeFillet mkFillet(myBody); + TopExp_Explorer anEdgeExplorer(myBody, TopAbs_EDGE); + while (anEdgeExplorer.More()) + { + TopoDS_Edge anEdge = TopoDS::Edge(anEdgeExplorer.Current()); + //Add edge to fillet algorithm + mkFillet.Add(theThickness / 12., anEdge); + anEdgeExplorer.Next(); + } + + myBody = mkFillet.Shape(); + + // Body : Add the Neck + gp_Pnt neckLocation(0, 0, theHeight); + gp_Dir neckAxis = gp::DZ(); + gp_Ax2 neckAx2(neckLocation, neckAxis); + + Standard_Real myNeckRadius = theThickness / 4.; + Standard_Real myNeckHeight = theHeight / 10.; + + BRepPrimAPI_MakeCylinder MKCylinder(neckAx2, myNeckRadius, myNeckHeight); + TopoDS_Shape myNeck = MKCylinder.Shape(); + + myBody = BRepAlgoAPI_Fuse(myBody, myNeck); + + // Body : Create a Hollowed Solid + TopoDS_Face faceToRemove; + Standard_Real zMax = -1; + + for (TopExp_Explorer aFaceExplorer(myBody, TopAbs_FACE); aFaceExplorer.More(); aFaceExplorer.Next()) + { + TopoDS_Face aFace = TopoDS::Face(aFaceExplorer.Current()); + // Check if is the top face of the bottle’s neck + Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace); + if (aSurface->DynamicType() == STANDARD_TYPE(Geom_Plane)) + { + Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurface); + gp_Pnt aPnt = aPlane->Location(); + Standard_Real aZ = aPnt.Z(); + if (aZ > zMax) + { + zMax = aZ; + faceToRemove = aFace; + } + } + } + + TopTools_ListOfShape facesToRemove; + facesToRemove.Append(faceToRemove); + BRepOffsetAPI_MakeThickSolid aSolidMaker; + aSolidMaker.MakeThickSolidByJoin(myBody, facesToRemove, -theThickness / 50, 1.e-3); + myBody = aSolidMaker.Shape(); + // Threading : Create Surfaces + Handle(Geom_CylindricalSurface) aCyl1 = new Geom_CylindricalSurface(neckAx2, myNeckRadius * 0.99); + Handle(Geom_CylindricalSurface) aCyl2 = new Geom_CylindricalSurface(neckAx2, myNeckRadius * 1.05); + + // Threading : Define 2D Curves + gp_Pnt2d aPnt(2. * M_PI, myNeckHeight / 2.); + gp_Dir2d aDir(2. * M_PI, myNeckHeight / 4.); + gp_Ax2d anAx2d(aPnt, aDir); + + Standard_Real aMajor = 2. * M_PI; + Standard_Real aMinor = myNeckHeight / 10; + + Handle(Geom2d_Ellipse) anEllipse1 = new Geom2d_Ellipse(anAx2d, aMajor, aMinor); + Handle(Geom2d_Ellipse) anEllipse2 = new Geom2d_Ellipse(anAx2d, aMajor, aMinor / 4); + Handle(Geom2d_TrimmedCurve) anArc1 = new Geom2d_TrimmedCurve(anEllipse1, 0, M_PI); + Handle(Geom2d_TrimmedCurve) anArc2 = new Geom2d_TrimmedCurve(anEllipse2, 0, M_PI); + gp_Pnt2d anEllipsePnt1 = anEllipse1->Value(0); + gp_Pnt2d anEllipsePnt2 = anEllipse1->Value(M_PI); + + Handle(Geom2d_TrimmedCurve) aSegment = GCE2d_MakeSegment(anEllipsePnt1, anEllipsePnt2); + // Threading : Build Edges and Wires + TopoDS_Edge anEdge1OnSurf1 = BRepBuilderAPI_MakeEdge(anArc1, aCyl1); + TopoDS_Edge anEdge2OnSurf1 = BRepBuilderAPI_MakeEdge(aSegment, aCyl1); + TopoDS_Edge anEdge1OnSurf2 = BRepBuilderAPI_MakeEdge(anArc2, aCyl2); + TopoDS_Edge anEdge2OnSurf2 = BRepBuilderAPI_MakeEdge(aSegment, aCyl2); + TopoDS_Wire threadingWire1 = BRepBuilderAPI_MakeWire(anEdge1OnSurf1, anEdge2OnSurf1); + TopoDS_Wire threadingWire2 = BRepBuilderAPI_MakeWire(anEdge1OnSurf2, anEdge2OnSurf2); + BRepLib::BuildCurves3d(threadingWire1); + BRepLib::BuildCurves3d(threadingWire2); + + // Create Threading + BRepOffsetAPI_ThruSections aTool(Standard_True); + aTool.AddWire(threadingWire1); + aTool.AddWire(threadingWire2); + aTool.CheckCompatibility(Standard_False); + + TopoDS_Shape myThreading = aTool.Shape(); + + // Building the Resulting Compound + TopoDS_Compound aRes; + BRep_Builder aBuilder; + aBuilder.MakeCompound(aRes); + aBuilder.Add(aRes, myBody); + aBuilder.Add(aRes, myThreading); + + return aRes; +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/MakeBottle.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/MakeBottle.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/MakeBottle.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/MakeBottle.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,33 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef MAKEBOTTLE_H +#define MAKEBOTTLE_H + +#include +#include + +//! Returns sample bottle TopoDS_Shape +TopoDS_Shape MakeBottle(const Standard_Real theWidth, + const Standard_Real theyHeight, + const Standard_Real theThickness); + +#endif // MAKEBOTTLE_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/OcafSamples.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/OcafSamples.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/OcafSamples.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/OcafSamples.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,629 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "OcafSamples.h" + +#include "TOcaf_Application.h" +#include "TOcafFunction_BoxDriver.h" +#include "TOcafFunction_CylDriver.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void OcafSamples::Process (const TCollection_AsciiString& theSampleName) +{ + if (IsImportSample(theSampleName)) + { + myObject3d.Clear(); + } + myObject2d.Clear(); + myCode.Clear(); + myIsProcessed = Standard_False; + try + { + ExecuteSample(theSampleName); + } + catch (...) + { + TraceError(TCollection_AsciiString("Error in sample: ") + theSampleName); + } +} + +void OcafSamples::ClearExtra() +{ + myOcafDoc = nullptr; + myContext->RemoveAll(Standard_True); +} + +void OcafSamples::ExecuteSample (const TCollection_AsciiString& theSampleName) +{ + Standard_Boolean anIsSamplePresent = Standard_True; + FindSourceCode(theSampleName); + if (theSampleName == "CreateOcafDocument") + CreateOcafDocument(); + else if (theSampleName == "CreateBoxOcafSample") + CreateBoxOcafSample(); + else if (theSampleName == "CreateCylinderOcafSample") + CreateCylinderOcafSample(); + else if (theSampleName == "ModifyBoxOcafSample") + ModifyBoxOcafSample(); + else if (theSampleName == "ModifyCylinderOcafSample") + ModifyCylinderOcafSample(); + else if (theSampleName == "UndoOcafSample") + UndoOcafSample(); + else if (theSampleName == "RedoOcafSample") + RedoOcafSample(); + else if (theSampleName == "DialogOpenOcafSample") + DialogOpenOcafSample(); + else if (theSampleName == "DialogSaveBinOcafSample") + DialogSaveBinOcafSample(); + else if (theSampleName == "DialogSaveXmlOcafSample") + DialogSaveXmlOcafSample(); + else + { + myResult << "No function found: " << theSampleName; + myCode += TCollection_AsciiString("No function found: ") + theSampleName; + anIsSamplePresent = Standard_False; + } + myIsProcessed = anIsSamplePresent; +} + +Standard_Boolean OcafSamples::IsExportSample (const TCollection_AsciiString& theSampleName) +{ + if (theSampleName == "DialogSaveBinOcafSample" || theSampleName == "DialogSaveXmlOcafSample") + { + return Standard_True; + } + else + { + return Standard_False; + } +} + +Standard_Boolean OcafSamples::IsImportSample (const TCollection_AsciiString& theSampleName) +{ + if (theSampleName == "DialogOpenOcafSample") + { + return Standard_True; + } + else + { + return Standard_False; + } +} + +Standard_Boolean OcafSamples::IsBinarySample (const TCollection_AsciiString& theSampleName) +{ + if (theSampleName == "DialogOpenOcafSample" || theSampleName == "DialogSaveBinOcafSample") + { + return Standard_True; + } + else + { + return Standard_False; + } +} + +Standard_Boolean OcafSamples::IsXmlSample (const TCollection_AsciiString& theSampleName) +{ + if (theSampleName == "DialogOpenOcafSample" || theSampleName == "DialogSaveXmlOcafSample") + { + return Standard_True; + } + else + { + return Standard_False; + } +} + +void OcafSamples::CreateOcafDocument() +{ + Handle(TOcaf_Application) anOcaf_Application = new TOcaf_Application; + anOcaf_Application->NewDocument("BinOcaf", myOcafDoc); + TPrsStd_AISViewer::New(myOcafDoc->Main(), myViewer); + + Handle(AIS_InteractiveContext) anAisContext; + TPrsStd_AISViewer::Find(myOcafDoc->Main(), anAisContext); + anAisContext->SetDisplayMode(AIS_Shaded, Standard_True); + myContext = anAisContext; + + // Set the maximum number of available "undo" actions + myOcafDoc->SetUndoLimit(10); +} + +void OcafSamples::CreateBoxOcafSample() +{ + // Open a new command (for undo) + myOcafDoc->NewCommand(); + + // A data structure for our box: + // the box itself is attached to the BoxLabel label (as his name and his function attribute) + // its arguments (dimensions: width, length and height; and position: x, y, z) + // are attached to the child labels of the box: + // 0:1 Box Label ---> Name ---> Named shape ---> Function + // 0:1:1 -- Width Label + // 0:1:2 -- Length Label + // 0:1:3 -- Height Label + // 0:1:4 -- X Label + // 0:1:5 -- Y Label + // 0:1:6 -- Z Label + + // Create a new label in the data structure for the box + TDF_Label aLabel = TDF_TagSource::NewChild(myOcafDoc->Main()); + + Standard_Real aBoxWidth(30.0), aBoxLength(20.0), aBoxHeight(10.0); + Standard_Real aBoxX(0.0), aBoxY(0.0), aBoxZ(0.0); + Standard_CString aBoxName("OcafBox"); + // Create the data structure : Set the dimensions, position and name attributes + TDataStd_Real::Set(aLabel.FindChild(1), aBoxWidth); + TDataStd_Real::Set(aLabel.FindChild(2), aBoxLength); + TDataStd_Real::Set(aLabel.FindChild(3), aBoxHeight); + TDataStd_Real::Set(aLabel.FindChild(4), aBoxX); + TDataStd_Real::Set(aLabel.FindChild(5), aBoxY); + TDataStd_Real::Set(aLabel.FindChild(6), aBoxZ); + TDataStd_Name::Set(aLabel, aBoxName); // Name + + // Instantiate a TFunction_Function attribute connected to the current box driver + // and attach it to the data structure as an attribute of the Box Label + Handle(TFunction_Function) myFunction = TFunction_Function::Set(aLabel, TOcafFunction_BoxDriver::GetID()); + + // Initialize and execute the box driver (look at the "Execute()" code) + Handle(TFunction_Logbook) aLogBook = TFunction_Logbook::Set(aLabel); + + Handle(TFunction_Driver) myBoxDriver; + // Find the TOcafFunction_BoxDriver in the TFunction_DriverTable using its GUID + if (!TFunction_DriverTable::Get()->FindDriver(TOcafFunction_BoxDriver::GetID(), myBoxDriver)) + { + myResult << "Ocaf Box driver not found" << std::endl; + } + + myBoxDriver->Init(aLabel); + if (myBoxDriver->Execute(aLogBook)) + { + myResult << "Create Box function execute failed" << std::endl; + } + + // Get the TPrsStd_AISPresentation of the new box TNaming_NamedShape + Handle(TPrsStd_AISPresentation) anAisPresentation = TPrsStd_AISPresentation::Set(aLabel, TNaming_NamedShape::GetID()); + // Display it + anAisPresentation->Display(1); + // Attach an integer attribute to aLabel to memorize it's displayed + TDataStd_Integer::Set(aLabel, 1); + myContext->UpdateCurrentViewer(); + + // Close the command (for undo) + myOcafDoc->CommitCommand(); + + myResult << "Created a box with name: " << aBoxName << std::endl; + myResult << "base coord X: " << aBoxX << " Y: " << aBoxY << " Z: " << aBoxZ << std::endl; + myResult << "width: " << aBoxWidth << " length: " << aBoxLength << " height: " << aBoxHeight << std::endl; +} + +void OcafSamples::CreateCylinderOcafSample() +{ + // Open a new command (for undo) + myOcafDoc->NewCommand(); + + // A data structure for our cylinder: + // the cylinder itself is attached to the CylinderLabel label (as his name and his function attribute) + // its arguments (dimensions: radius and height; and position: x, y, z) + // are attached to the child labels of the cylinder: + // 0:1 Cylinder Label ---> Name ---> Named shape ---> Function + // 0:1:1 -- Radius Label + // 0:1:2 -- Height Label + // 0:1:3 -- X Label + // 0:1:4 -- Y Label + // 0:1:5 -- Z Label + + // Create a new label in the data structure for the cylinder + TDF_Label aLabel = TDF_TagSource::NewChild(myOcafDoc->Main()); + + Standard_Real aCylRadius(10.0), aCylHeight(20.0); + Standard_Real aCylX(60.0), aCylY(40.0), aCylZ(0.0); + Standard_CString aCylName("OcafCylinder"); + // Create the data structure : Set the dimensions, position and name attributes + TDataStd_Real::Set(aLabel.FindChild(1), aCylRadius); + TDataStd_Real::Set(aLabel.FindChild(2), aCylHeight); + TDataStd_Real::Set(aLabel.FindChild(3), aCylX); + TDataStd_Real::Set(aLabel.FindChild(4), aCylY); + TDataStd_Real::Set(aLabel.FindChild(5), aCylZ); + TDataStd_Name::Set(aLabel, aCylName); + + // Instantiate a TFunction_Function attribute connected to the current cylinder driver + // and attach it to the data structure as an attribute of the Cylinder Label + Handle(TFunction_Function) myFunction = TFunction_Function::Set(aLabel, TOcafFunction_CylDriver::GetID()); + + // Initialize and execute the cylinder driver (look at the "Execute()" code) + Handle(TFunction_Logbook) aLogBook = TFunction_Logbook::Set(aLabel); + + Handle(TFunction_Driver) myCylDriver; + // Find the TOcafFunction_CylDriver in the TFunction_DriverTable using its GUID + if (!TFunction_DriverTable::Get()->FindDriver(TOcafFunction_CylDriver::GetID(), myCylDriver)) + { + myResult << "Ocaf Cylinder driver not found"; + } + myCylDriver->Init(aLabel); + if (myCylDriver->Execute(aLogBook)) + { + myResult << "Create Cylinder function execute failed"; + } + // Get the TPrsStd_AISPresentation of the new box TNaming_NamedShape + Handle(TPrsStd_AISPresentation) anAisPresentation = TPrsStd_AISPresentation::Set(aLabel, TNaming_NamedShape::GetID()); + // Display it + anAisPresentation->Display(1); + // Attach an integer attribute to aLabel to memorize it's displayed + TDataStd_Integer::Set(aLabel, 1); + myContext->UpdateCurrentViewer(); + + // Close the command (for undo) + myOcafDoc->CommitCommand(); + + myResult << "Created a cylinder with name: " << aCylName << std::endl; + myResult << "radius: " << aCylRadius << " height: " << aCylHeight << std::endl; + myResult << "base coord X: " << aCylX << " Y: " << aCylY << " Z: " << aCylZ << std::endl; +} + +void OcafSamples::ModifyBoxOcafSample() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + Standard_Integer aBoxCount(0); + for(AIS_ListOfInteractive::Iterator anIter(anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + + // Get the main label of the selected object + Handle(TPrsStd_AISPresentation) anAisPresentation = Handle(TPrsStd_AISPresentation)::DownCast(anAisObject->GetOwner()); + TDF_Label aLabel = anAisPresentation->Label(); + + // Get the TFunction_Function attribute of the selected object + Handle(TFunction_Function) aFunction; + if (!aLabel.FindAttribute(TFunction_Function::GetID(), aFunction)) + { + myResult << "Object cannot be modify."; + return; + } + // Get the Standard_GUID of the TFunction_FunctionDriver of the selected object TFunction_Function attribute + Standard_GUID aDriverID = aFunction->GetDriverGUID(); + + // Case of a box created with the box function driver + if (aDriverID == TOcafFunction_BoxDriver::GetID()) + { + aBoxCount++; + Standard_Real aBoxX, aBoxY, aBoxZ, aBoxWidth, aBoxLength, aBoxHeight; + + // Get the attributes values of the current box + Handle(TDataStd_Real) aCurrentReal; + aLabel.FindChild(1).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aBoxWidth = aCurrentReal->Get(); + aLabel.FindChild(2).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aBoxLength = aCurrentReal->Get(); + aLabel.FindChild(3).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aBoxHeight = aCurrentReal->Get(); + aLabel.FindChild(4).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aBoxX = aCurrentReal->Get(); + aLabel.FindChild(5).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aBoxY = aCurrentReal->Get(); + aLabel.FindChild(6).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aBoxZ = aCurrentReal->Get(); + Handle(TDataStd_Name) aBoxName; + aLabel.FindAttribute(TDataStd_Name::GetID(), aBoxName); + + myResult << "Current parameters of box with name: " << aBoxName->Get() << std::endl; + myResult << "width: " << aBoxWidth << " length: " << aBoxLength << " height: " << aBoxHeight << std::endl; + myResult << "base coord X: " << aBoxX << " Y: " << aBoxY << " Z: " << aBoxZ << std::endl; + + // Open a new command (for undo) + myOcafDoc->NewCommand(); + // Modify the box - 1.5 times increase + aBoxWidth *= 1.5; aBoxLength *= 1.5; aBoxHeight *= 1.5; + + TDataStd_Real::Set(aLabel.FindChild(1), aBoxWidth); + TDataStd_Real::Set(aLabel.FindChild(2), aBoxLength); + TDataStd_Real::Set(aLabel.FindChild(3), aBoxHeight); + TDataStd_Real::Set(aLabel.FindChild(4), aBoxX); + TDataStd_Real::Set(aLabel.FindChild(5), aBoxY); + TDataStd_Real::Set(aLabel.FindChild(6), aBoxZ); + + // Get the TFunction_FunctionDriver GUID used with the TFunction_Function + aDriverID = aFunction->GetDriverGUID(); + Handle(TFunction_Logbook) aLogBook = TFunction_Logbook::Set(aLabel); + Handle(TFunction_Driver) aBoxDriver; + // Find the TOcafFunction_BoxDriver in the TFunction_DriverTable using its GUID + TFunction_DriverTable::Get()->FindDriver(aDriverID, aBoxDriver); + // Execute the cut if it must be (if an attribute changes) + aBoxDriver->Init(aLabel); + + // Set the box touched, it will be useful to recompute an object which used this box as attribute + aLogBook->SetTouched(aLabel); + if (aBoxDriver->Execute(aLogBook)) + { + myResult << "Recompute failed" << std::endl; + } + + // Get the presentation of the box, display it and set it selected + anAisPresentation = TPrsStd_AISPresentation::Set(aLabel, TNaming_NamedShape::GetID()); + TDataStd_Integer::Set(aLabel, 1); + anAisPresentation->Display(1); + myContext->UpdateCurrentViewer(); + // Close the command (for undo) + myOcafDoc->CommitCommand(); + + myResult << std::endl; + myResult << "New box parameters: " << std::endl; + myResult << "base coord X: " << aBoxX << " Y: " << aBoxY << " Z: " << aBoxZ << std::endl; + myResult << "width: " << aBoxWidth << " length: " << aBoxLength << " height: " << aBoxHeight << std::endl; + } + } + if (aBoxCount) + { + myResult << "Number of modified boxes: " << aBoxCount << std::endl; + } + else + { + myResult << "No boxes to modify" << std::endl; + } +} + +void OcafSamples::ModifyCylinderOcafSample() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + Standard_Integer aCylCount(0); + for(AIS_ListOfInteractive::Iterator anIter (anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + // Get the main label of the selected object + Handle(TPrsStd_AISPresentation) anAisPresentation = Handle(TPrsStd_AISPresentation)::DownCast(anAisObject->GetOwner()); + TDF_Label aLabel = anAisPresentation->Label(); + + // Get the TFunction_Function attribute of the selected object + Handle(TFunction_Function) aFunction; + if (!aLabel.FindAttribute(TFunction_Function::GetID(), aFunction)) + { + myResult << "Object cannot be modify."; + return; + } + // Get the Standard_GUID of the TFunction_FunctionDriver of the selected object TFunction_Function attribute + Standard_GUID aDriverID = aFunction->GetDriverGUID(); + + // Case of a box created with the box function driver + if (aDriverID == TOcafFunction_CylDriver::GetID()) + { + aCylCount++; + Standard_Real aCylRadius, aCylHeight, aCylX, aCylY, aCylZ; + + // Get the attributes values of the current box + Handle(TDataStd_Real) aCurrentReal; + aLabel.FindChild(1).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aCylRadius = aCurrentReal->Get(); + aLabel.FindChild(2).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aCylHeight = aCurrentReal->Get(); + aLabel.FindChild(3).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aCylX = aCurrentReal->Get(); + aLabel.FindChild(4).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aCylY = aCurrentReal->Get(); + aLabel.FindChild(5).FindAttribute(TDataStd_Real::GetID(), aCurrentReal); + aCylZ = aCurrentReal->Get(); + + Handle(TDataStd_Name) aCylName; + aLabel.FindAttribute(TDataStd_Name::GetID(), aCylName); + + myResult << "Current parameters of box with name: " << aCylName->Get() << std::endl; + myResult << "radius: " << aCylRadius << " height: " << aCylHeight << std::endl; + myResult << "base coord X: " << aCylX << " Y: " << aCylY << " Z: " << aCylZ << std::endl; + + // Open a new command (for undo) + myOcafDoc->NewCommand(); + // Modify the cylinder - 2x increase + aCylRadius *= 2.0; aCylHeight *= 2.0; + // and move base point in XY plane + aCylX *= 2.0; aCylY *= 2.0; + + TDataStd_Real::Set(aLabel.FindChild(1), aCylRadius); + TDataStd_Real::Set(aLabel.FindChild(2), aCylHeight); + TDataStd_Real::Set(aLabel.FindChild(3), aCylX); + TDataStd_Real::Set(aLabel.FindChild(4), aCylY); + TDataStd_Real::Set(aLabel.FindChild(5), aCylZ); + + // Get the TFunction_FunctionDriver GUID used with the TFunction_Function + aDriverID = aFunction->GetDriverGUID(); + Handle(TFunction_Logbook) aLogBook = TFunction_Logbook::Set(aLabel); + Handle(TFunction_Driver) aCylDriver; + // Find the TOcafFunction_CylDriver in the TFunction_DriverTable using its GUID + TFunction_DriverTable::Get()->FindDriver(aDriverID, aCylDriver); + // Execute the cut if it must be (if an attribute changes) + aCylDriver->Init(aLabel); + + // Set the cylinder touched, it will be useful to recompute an object which used this box as attribute + aLogBook->SetTouched(aLabel); + if (aCylDriver->Execute(aLogBook)) + { + myResult << "Recompute failed" << std::endl; + } + // Get the presentation of the box, display it and set it selected + anAisPresentation = TPrsStd_AISPresentation::Set(aLabel, TNaming_NamedShape::GetID()); + TDataStd_Integer::Set(aLabel, 1); + anAisPresentation->Display(1); + myContext->UpdateCurrentViewer(); + // Close the command (for undo) + myOcafDoc->CommitCommand(); + + myResult << std::endl; + myResult << "New cylinder parameters: " << std::endl; + myResult << "radius: " << aCylRadius << " height: " << aCylHeight << std::endl; + myResult << "base coord X: " << aCylX << " Y: " << aCylY << " Z: " << aCylZ << std::endl; + } + } + if (aCylCount) + { + myResult << "Number of modified boxes: " << aCylCount << std::endl; + } + else + { + myResult << "No boxes to modify" << std::endl; + } +} + +void OcafSamples::UndoOcafSample() +{ + if (myOcafDoc->Undo()) + { + myOcafDoc->CommitCommand(); + myContext->UpdateCurrentViewer(); + myResult << "Undo was done successfully" << std::endl; + } + else + { + myResult << "Nothing to undo" << std::endl; + } +} + +void OcafSamples::RedoOcafSample() +{ + if (myOcafDoc->Redo()) + { + myOcafDoc->CommitCommand(); + myContext->UpdateCurrentViewer(); + myResult << "Redo was done successfully" << std::endl; + } + else + { + myResult << "Nothing to redo" << std::endl; + } +} + +void OcafSamples::DialogOpenOcafSample() +{ + Handle(TOcaf_Application) anOcaf_Application = new TOcaf_Application; + // load persistence + BinDrivers::DefineFormat(anOcaf_Application); + XmlDrivers::DefineFormat(anOcaf_Application); + // Look for already opened + if (anOcaf_Application->IsInSession(myFileName)) + { + myResult << "Document: " << myFileName << " is already in session" << std::endl; + return; + } + // Open the document in the current application + PCDM_ReaderStatus aReaderStatus = anOcaf_Application->Open(myFileName, myOcafDoc); + if (aReaderStatus == PCDM_RS_OK) + { + // Connect the document CAF (myDoc) with the AISContext (myAISContext) + TPrsStd_AISViewer::New(myOcafDoc->Main(), myViewer); + myOcafDoc->SetUndoLimit(10); + + myContext->RemoveAll(Standard_False); + Handle(AIS_InteractiveContext) aContext; + TPrsStd_AISViewer::Find(myOcafDoc->Main(), aContext); + aContext->SetDisplayMode(AIS_Shaded, Standard_True); + myContext = aContext; + + // Display the presentations (which was not stored in the document) + DisplayPresentation(); + myResult << "Open a document" << std::endl; + } + else + { + myResult << "Error! The file wasn't opened. PCDM_ReaderStatus: " << aReaderStatus << std::endl; + } +} + +void OcafSamples::DialogSaveBinOcafSample() +{ + Handle(TOcaf_Application) anOcaf_Application = new TOcaf_Application; + BinDrivers::DefineFormat(anOcaf_Application); + myOcafDoc->ChangeStorageFormat("BinOcaf"); + // Saves the document in the current application + PCDM_StoreStatus aStoreStatus = anOcaf_Application->SaveAs(myOcafDoc, myFileName); + if (aStoreStatus == PCDM_SS_OK) + { + myResult << "The file was saved successfully" << std::endl; + } + else + { + myResult << "Error! The file wasn't saved. PCDM_StoreStatus: " << aStoreStatus << std::endl; + } +} + +void OcafSamples::DialogSaveXmlOcafSample() +{ + Handle(TOcaf_Application) anOcaf_Application = new TOcaf_Application; + XmlDrivers::DefineFormat(anOcaf_Application); + myOcafDoc->ChangeStorageFormat("XmlOcaf"); + // Saves the document in the current application + PCDM_StoreStatus aStoreStatus = anOcaf_Application->SaveAs(myOcafDoc, myFileName); + if (aStoreStatus == PCDM_SS_OK) + { + myResult << "The file was saved successfully" << std::endl; + } + else + { + myResult << "Error! The file wasn't saved. PCDM_StoreStatus: " << aStoreStatus << std::endl; + } +} + +void OcafSamples::DisplayPresentation() +{ + TDF_Label aRootlabel = myOcafDoc->Main(); + + for (TDF_ChildIterator it(aRootlabel); it.More(); it.Next()) + { + TDF_Label aLabel = it.Value(); + Handle(TNaming_NamedShape) aNamedShape; + if (!aLabel.FindAttribute(TNaming_NamedShape::GetID(), aNamedShape)) + { + continue; + } + Handle(TDataStd_Integer) aDataInteger; + + // To know if the object was displayed + if (aLabel.FindAttribute(TDataStd_Integer::GetID(), aDataInteger)) + { + if (!aDataInteger->Get()) + { + continue; + } + } + Handle(TPrsStd_AISPresentation) anAisPresentation; + if (!aLabel.FindAttribute(TPrsStd_AISPresentation::GetID(), anAisPresentation)) + { + anAisPresentation = TPrsStd_AISPresentation::Set(aLabel, TNaming_NamedShape::GetID()); + } + anAisPresentation->SetColor(Quantity_NOC_ORANGE); + anAisPresentation->Display(1); + } + myContext->UpdateCurrentViewer(); +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/OcafSamples.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/OcafSamples.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/OcafSamples.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/OcafSamples.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,81 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef OCAFSAMPLES_H +#define OCAFSAMPLES_H + +#include "BaseSample.h" +#include "TOcaf_Application.h" + +#include +#include +#include + +//! Implements OCAF samples +class OcafSamples : public BaseSample +{ + DEFINE_STANDARD_RTTI_INLINE(OcafSamples, BaseSample) +public: + + OcafSamples (const TCollection_AsciiString& theSampleSourcePath, + const Handle(V3d_Viewer)& theViewer, + const Handle(AIS_InteractiveContext)& theContext) + : BaseSample (theSampleSourcePath, theContext), + myViewer (theViewer) + { + // + } + + virtual void Process (const TCollection_AsciiString& theSampleName) Standard_OVERRIDE; + + void ClearExtra(); + void SetFileName (const TCollection_AsciiString& theFileName) { myFileName = theFileName; }; + + static Standard_Boolean IsExportSample (const TCollection_AsciiString& theSampleName); + static Standard_Boolean IsImportSample (const TCollection_AsciiString& theSampleName); + static Standard_Boolean IsBinarySample (const TCollection_AsciiString& theSampleName); + static Standard_Boolean IsXmlSample (const TCollection_AsciiString& theSampleName); + +protected: + virtual void ExecuteSample (const TCollection_AsciiString& theSampleName) Standard_OVERRIDE; + +private: + // One function for every sample + void CreateOcafDocument(); + void CreateBoxOcafSample(); + void CreateCylinderOcafSample(); + void ModifyBoxOcafSample(); + void ModifyCylinderOcafSample(); + void UndoOcafSample(); + void RedoOcafSample(); + void DialogOpenOcafSample(); + void DialogSaveBinOcafSample(); + void DialogSaveXmlOcafSample(); + void DisplayPresentation(); + +private: + + TCollection_AsciiString myFileName; + Handle(V3d_Viewer) myViewer; + Handle(TDocStd_Document) myOcafDoc; +}; + +#endif //OCAFSAMPLES_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Ocaf.xml opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Ocaf.xml --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Ocaf.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Ocaf.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Face.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Face.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Face.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Face.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,486 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "Sample2D_Face.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Sample2D_Face::Sample2D_Face (const TopoDS_Shape& theFace) +: myFORWARDColor (Quantity_NOC_BLUE1), + myREVERSEDColor (Quantity_NOC_YELLOW), + myINTERNALColor (Quantity_NOC_RED1), + myEXTERNALColor (Quantity_NOC_MAGENTA1), + myWidthIndex (1), + myTypeIndex (1), + // + myshape (theFace), + myForwardNum (0), + myReversedNum (0), + myInternalNum (0), + myExternalNum (0), + // + myForwardBounds (0), + myReversedBounds (0), + myInternalBounds (0), + myExternalBounds (0) +{ + SetAutoHilight(Standard_False); + FillData(Standard_True); +} + +void Sample2D_Face::DrawMarker (const Handle(Geom2d_TrimmedCurve)& theCurve, + const Handle(Prs3d_Presentation)& thePresentation) +{ + Standard_Real aCenterParam = (theCurve->FirstParameter() + theCurve->LastParameter()) / 2; + gp_Pnt2d p; + gp_Vec2d v; + theCurve->D1(aCenterParam, p, v); + if (v.Magnitude() > gp::Resolution()) + { + gp_Vec aDir(v.X(), v.Y(), 0.); + gp_Pnt aPoint(p.X(), p.Y(), 0.); + aDir.Normalize(); + aDir.Reverse(); + gp_Dir aZ(0, 0, 1); + gp_Pnt aLeft (aPoint.Translated(aDir.Rotated(gp_Ax1(aPoint, aZ), M_PI / 6) * 5)); + gp_Pnt aRight(aPoint.Translated(aDir.Rotated(gp_Ax1(aPoint, aZ), M_PI * 11 / 6) * 5)); + + Handle(Graphic3d_ArrayOfPolylines) anArrow = new Graphic3d_ArrayOfPolylines(3); + anArrow->AddVertex(aLeft); + anArrow->AddVertex(aPoint); + anArrow->AddVertex(aRight); + + thePresentation->CurrentGroup()->AddPrimitiveArray(anArrow); + } +} + +void Sample2D_Face::FillData(Standard_Boolean isSizesRecompute) +{ + if (myshape.IsNull() || myshape.ShapeType() != TopAbs_FACE) + { + return; + } + + Standard_Real f, l; + TopoDS_Face aFace = TopoDS::Face(myshape); + + // count number of vertices and bounds in primitive arrays + if (isSizesRecompute) + { + mySeq_FORWARD.Clear(); + mySeq_REVERSED.Clear(); + mySeq_INTERNAL.Clear(); + mySeq_EXTERNAL.Clear(); + + myshape.Orientation(TopAbs_FORWARD); + for (TopExp_Explorer anEdgeIter (myshape, TopAbs_EDGE); anEdgeIter.More(); anEdgeIter.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge (anEdgeIter.Current()); + BRepAdaptor_Curve2d aCurveOnEdge (anEdge, aFace); + GCPnts_QuasiUniformDeflection anEdgeDistrib(aCurveOnEdge, 1.e-2); + if (!anEdgeDistrib.IsDone()) + { + continue; + } + + switch (anEdge.Orientation()) + { + case TopAbs_FORWARD: + { + myForwardNum += anEdgeDistrib.NbPoints(); + myForwardBounds++; + break; + } + case TopAbs_REVERSED: + { + myReversedNum += anEdgeDistrib.NbPoints(); + myReversedBounds++; + break; + } + case TopAbs_INTERNAL: + { + myInternalNum += anEdgeDistrib.NbPoints(); + myInternalBounds++; + break; + } + case TopAbs_EXTERNAL: + { + myExternalNum += anEdgeDistrib.NbPoints(); + myExternalBounds++; + break; + } + } + } + } + + myForwardArray = new Graphic3d_ArrayOfPolylines(myForwardNum, myForwardBounds); + myReversedArray = new Graphic3d_ArrayOfPolylines(myReversedNum, myReversedBounds); + myInternalArray = new Graphic3d_ArrayOfPolylines(myInternalNum, myInternalBounds); + myExternalArray = new Graphic3d_ArrayOfPolylines(myExternalNum, myExternalBounds); + + // fill primitive arrays + for (TopExp_Explorer anEdgeIter (myshape, TopAbs_EDGE); anEdgeIter.More(); anEdgeIter.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge (anEdgeIter.Current()); + const Handle(Geom2d_Curve) aCurve = BRep_Tool::CurveOnSurface (anEdge, aFace, f, l); + Handle(Geom2d_TrimmedCurve) aTrimmedCurve = new Geom2d_TrimmedCurve(aCurve, f, l); + if (!aTrimmedCurve.IsNull()) + { + Handle(Geom_Curve) aCurve3d = GeomLib::To3d(gp_Ax2(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1)), aTrimmedCurve); + BRepAdaptor_Curve2d aCurveOnEdge (anEdge, aFace); + GCPnts_QuasiUniformDeflection anEdgeDistrib (aCurveOnEdge, 1.e-2); + if (!anEdgeDistrib.IsDone()) + { + continue; + } + + switch (anEdge.Orientation()) + { + case TopAbs_FORWARD: + { + myForwardArray->AddBound(anEdgeDistrib.NbPoints()); + for (Standard_Integer i = 1; i <= anEdgeDistrib.NbPoints(); ++i) + { + myForwardArray->AddVertex(anEdgeDistrib.Value(i)); + } + if (isSizesRecompute) + { + mySeq_FORWARD.Append(aCurve3d); + } + break; + } + case TopAbs_REVERSED: + { + myReversedArray->AddBound(anEdgeDistrib.NbPoints()); + for (Standard_Integer i = 1; i <= anEdgeDistrib.NbPoints(); ++i) + { + myReversedArray->AddVertex(anEdgeDistrib.Value(i)); + } + if (isSizesRecompute) + { + mySeq_REVERSED.Append(aCurve3d); + } + break; + } + case TopAbs_INTERNAL: + { + myInternalArray->AddBound(anEdgeDistrib.NbPoints()); + for (Standard_Integer i = 1; i <= anEdgeDistrib.NbPoints(); ++i) + { + myInternalArray->AddVertex(anEdgeDistrib.Value(i)); + } + if (isSizesRecompute) + { + mySeq_INTERNAL.Append(aCurve3d); + } + break; + } + case TopAbs_EXTERNAL: + { + myExternalArray->AddBound(anEdgeDistrib.NbPoints()); + for (Standard_Integer i = 1; i <= anEdgeDistrib.NbPoints(); ++i) + { + myExternalArray->AddVertex(anEdgeDistrib.Value(i)); + } + if (isSizesRecompute) + { + mySeq_EXTERNAL.Append(aCurve3d); + } + break; + } + } + } + } +} + +void Sample2D_Face::Compute (const Handle(PrsMgr_PresentationManager3d)& , + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) +{ + if (theMode != 0) + { + return; + } + + thePresentation->Clear(); + myDrawer->SetWireDraw(1); + + if (myshape.IsNull() || myshape.ShapeType() != TopAbs_FACE) + { + return; + } + + Handle(Graphic3d_AspectLine3d) aLineAspect_FORWARD = new Graphic3d_AspectLine3d(myFORWARDColor, Aspect_TOL_SOLID, 1); + Handle(Graphic3d_AspectLine3d) aLineAspect_REVERSED = new Graphic3d_AspectLine3d(myREVERSEDColor, Aspect_TOL_SOLID, 1); + Handle(Graphic3d_AspectLine3d) aLineAspect_INTERNAL = new Graphic3d_AspectLine3d(myINTERNALColor, Aspect_TOL_SOLID, 1); + Handle(Graphic3d_AspectLine3d) aLineAspect_EXTERNAL = new Graphic3d_AspectLine3d(myEXTERNALColor, Aspect_TOL_SOLID, 1); + + Standard_Real f, l; + TopoDS_Face aFace = TopoDS::Face(myshape); + // estimating number of vertices in primitive arrays + for (TopExp_Explorer anEdgeIter (myshape, TopAbs_EDGE); anEdgeIter.More(); anEdgeIter.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge(anEdgeIter.Current()); + const Handle(Geom2d_Curve) aCurve = BRep_Tool::CurveOnSurface (anEdge, aFace, f, l); + + Handle(Geom2d_TrimmedCurve) aTrimmedCurve = new Geom2d_TrimmedCurve(aCurve, f, l); + // make a 3D curve from 2D trimmed curve to display it + Handle(Geom_Curve) aCurve3d = GeomLib::To3d(gp_Ax2(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1)), aTrimmedCurve); + // make distribution of points + BRepAdaptor_Curve2d aCurveOnEdge (anEdge, aFace); + GCPnts_QuasiUniformDeflection anEdgeDistrib(aCurveOnEdge, 1.e-2); + if (anEdgeDistrib.IsDone()) + { + switch (anEdge.Orientation()) + { + case TopAbs_FORWARD: + { + thePresentation->CurrentGroup()->SetPrimitivesAspect(aLineAspect_FORWARD); + DrawMarker(aTrimmedCurve, thePresentation); + break; + } + case TopAbs_REVERSED: + { + thePresentation->CurrentGroup()->SetPrimitivesAspect(aLineAspect_REVERSED); + DrawMarker(aTrimmedCurve, thePresentation); + break; + } + case TopAbs_INTERNAL: + { + thePresentation->CurrentGroup()->SetPrimitivesAspect(aLineAspect_INTERNAL); + DrawMarker(aTrimmedCurve, thePresentation); + + mySeq_INTERNAL.Append(aCurve3d); + break; + } + case TopAbs_EXTERNAL: + { + thePresentation->CurrentGroup()->SetPrimitivesAspect(aLineAspect_EXTERNAL); + DrawMarker(aTrimmedCurve, thePresentation); + break; + } + } + } + } + + // add all primitives to the presentation + thePresentation->CurrentGroup()->SetPrimitivesAspect(aLineAspect_FORWARD); + thePresentation->CurrentGroup()->AddPrimitiveArray(myForwardArray); + + thePresentation->CurrentGroup()->SetPrimitivesAspect(aLineAspect_REVERSED); + thePresentation->CurrentGroup()->AddPrimitiveArray(myReversedArray); + + thePresentation->CurrentGroup()->SetPrimitivesAspect(aLineAspect_INTERNAL); + thePresentation->CurrentGroup()->AddPrimitiveArray(myInternalArray); + + thePresentation->CurrentGroup()->SetPrimitivesAspect(aLineAspect_EXTERNAL); + thePresentation->CurrentGroup()->AddPrimitiveArray(myExternalArray); +} + +void Sample2D_Face::HilightSelected (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, + const SelectMgr_SequenceOfOwner& theOwners) +{ + Handle(Prs3d_Presentation) aSelectionPrs = GetSelectPresentation (thePrsMgr); + + Handle(Graphic3d_AspectLine3d) aLineAspect = new Graphic3d_AspectLine3d(Quantity_NOC_ANTIQUEWHITE, Aspect_TOL_SOLID, 2); + if (HasPresentation()) + { + aSelectionPrs->SetTransformPersistence(Presentation()->TransformPersistence()); + } + + const Standard_Integer aLength = theOwners.Length(); + aSelectionPrs->Clear(); + FillData(); + + Handle(Graphic3d_Group) aSelectGroup = aSelectionPrs->NewGroup(); + + for (Standard_Integer i = 1; i <= aLength; ++i) + { + Handle(SelectMgr_EntityOwner) anOwner = theOwners.Value(i); + // check priority of owner to add primitives in one of array + // containing primitives with certain type of orientation + switch (anOwner->Priority()) + { + case 7: + { + // add to objects with forward orientation + aSelectGroup->SetGroupPrimitivesAspect(aLineAspect); + aSelectGroup->AddPrimitiveArray(myForwardArray); + break; + } + case 6: + { + // add to objects with reversed orientation + aSelectGroup->SetGroupPrimitivesAspect(aLineAspect); + aSelectGroup->AddPrimitiveArray(myReversedArray); + break; + } + case 5: + { + // add to objects with internal orientation + aSelectGroup->SetGroupPrimitivesAspect(aLineAspect); + aSelectGroup->AddPrimitiveArray(myInternalArray); + break; + } + case 4: + { + // add to objects with external orientation + aSelectGroup->SetGroupPrimitivesAspect(aLineAspect); + aSelectGroup->AddPrimitiveArray(myExternalArray); + break; + } + } + } + aSelectionPrs->Display(); +} + +void Sample2D_Face::ClearSelected() +{ + if (Handle(Prs3d_Presentation) aSelectionPrs = GetSelectPresentation(NULL)) + { + aSelectionPrs->Clear(); + } +} + +void Sample2D_Face::HilightOwnerWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, + const Handle(Prs3d_Drawer)& theStyle, + const Handle(SelectMgr_EntityOwner)& theOwner) +{ + Handle(Prs3d_Presentation) aHighlightPrs = GetHilightPresentation(thePM); + if (HasPresentation()) + { + aHighlightPrs->SetTransformPersistence(Presentation()->TransformPersistence()); + } + if (theOwner.IsNull()) + { + return; + } + + aHighlightPrs->Clear(); + FillData(); + + // Direct highlighting + aHighlightPrs->NewGroup(); + Handle(Graphic3d_Group) aHilightGroup = aHighlightPrs->CurrentGroup(); + Handle(Graphic3d_AspectLine3d) aLineAspect = new Graphic3d_AspectLine3d(theStyle->Color(), Aspect_TOL_SOLID, 2); + switch (theOwner->Priority()) + { + case 7: + { + aHilightGroup->SetGroupPrimitivesAspect(aLineAspect); + aHilightGroup->AddPrimitiveArray(myForwardArray); + break; + } + case 6: + { + aHilightGroup->SetGroupPrimitivesAspect(aLineAspect); + aHilightGroup->AddPrimitiveArray(myReversedArray); + break; + } + case 5: + { + aHilightGroup->SetGroupPrimitivesAspect(aLineAspect); + aHilightGroup->AddPrimitiveArray(myInternalArray); + break; + } + case 4: + { + aHilightGroup->SetGroupPrimitivesAspect(aLineAspect); + aHilightGroup->AddPrimitiveArray(myExternalArray); + break; + } + } + if (thePM->IsImmediateModeOn()) + { + thePM->AddToImmediateList(aHighlightPrs); + } +} + +void Sample2D_Face::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, + const Standard_Integer theMode) +{ + if (myshape.IsNull() + || theMode != 0) + { + return; + } + + if (mySeq_FORWARD.IsEmpty() + && mySeq_REVERSED.IsEmpty() + && mySeq_INTERNAL.IsEmpty() + && mySeq_EXTERNAL.IsEmpty()) + { + return; + } + + // create entity owner for every part of the face + // set different priorities for primitives of different orientation + Handle(SelectMgr_EntityOwner) anOwner_Forward = new SelectMgr_EntityOwner(this, 7); + Handle(SelectMgr_EntityOwner) anOwner_Reversed = new SelectMgr_EntityOwner(this, 6); + Handle(SelectMgr_EntityOwner) anOwner_Internal = new SelectMgr_EntityOwner(this, 5); + Handle(SelectMgr_EntityOwner) anOwner_External = new SelectMgr_EntityOwner(this, 4); + + // create a sensitive for every part + Handle(Select3D_SensitiveGroup) aForwardGroup = new Select3D_SensitiveGroup(anOwner_Forward); + Handle(Select3D_SensitiveGroup) aReversedGroup = new Select3D_SensitiveGroup(anOwner_Reversed); + Handle(Select3D_SensitiveGroup) aInternalGroup = new Select3D_SensitiveGroup(anOwner_Internal); + Handle(Select3D_SensitiveGroup) aExternalGroup = new Select3D_SensitiveGroup(anOwner_External); + + Standard_Integer aLength = mySeq_FORWARD.Length(); + for (Standard_Integer i = 1; i <= aLength; ++i) + { + Handle(Select3D_SensitiveCurve) aSensitveCurve = new Select3D_SensitiveCurve(anOwner_Forward, mySeq_FORWARD(i)); + aForwardGroup->Add(aSensitveCurve); + } + theSelection->Add(aForwardGroup); + + aLength = mySeq_REVERSED.Length(); + for (Standard_Integer i = 1; i <= aLength; ++i) + { + Handle(Select3D_SensitiveCurve) aSensitveCurve = new Select3D_SensitiveCurve(anOwner_Reversed, mySeq_REVERSED(i)); + aReversedGroup->Add(aSensitveCurve); + } + theSelection->Add(aReversedGroup); + + aLength = mySeq_INTERNAL.Length(); + for (Standard_Integer i = 1; i <= aLength; ++i) + { + Handle(Select3D_SensitiveCurve) aSensitveCurve = new Select3D_SensitiveCurve(anOwner_Internal, mySeq_INTERNAL(i)); + aInternalGroup->Add(aSensitveCurve); + } + theSelection->Add(aInternalGroup); + + aLength = mySeq_EXTERNAL.Length(); + for (Standard_Integer i = 1; i <= aLength; ++i) + { + Handle(Select3D_SensitiveCurve) aSensitveCurve = new Select3D_SensitiveCurve(anOwner_External, mySeq_EXTERNAL(i)); + aExternalGroup->Add(aSensitveCurve); + } + theSelection->Add(aExternalGroup); +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Face.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Face.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Face.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Face.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,107 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef _Sample2D_Face_HeaderFile +#define _Sample2D_Face_HeaderFile + +#include +#include +#include +#include +#include + +//! AIS interactive Object for sample 2D face +class Sample2D_Face : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTI_INLINE(Sample2D_Face, AIS_InteractiveObject) +public: + + Standard_EXPORT Sample2D_Face (const TopoDS_Shape& theFace); + +public: + + TopoDS_Shape& Shape() { return myshape; } + void SetFace (const TopoDS_Shape& theFace) { myshape = theFace; } + +public: + + Quantity_Color myFORWARDColor; + Quantity_Color myREVERSEDColor; + Quantity_Color myINTERNALColor; + Quantity_Color myEXTERNALColor; + Standard_Integer myWidthIndex; + Standard_Integer myTypeIndex; + +private: + + //! Return TRUE for supported display modes (only mode 0 is supported). + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; } + + //! Compute presentation. + virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) Standard_OVERRIDE; + + //! Compute selection. + virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, + const Standard_Integer theMode) Standard_OVERRIDE; + + virtual void ClearSelected() Standard_OVERRIDE; + + //! Method for advanced customizable selection of picked object + virtual void HilightSelected (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, + const SelectMgr_SequenceOfOwner& theOwners) Standard_OVERRIDE; + + //! Method for advanced customizable highlighting of picked object. + virtual void HilightOwnerWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, + const Handle(Prs3d_Drawer)& theStyle, + const Handle(SelectMgr_EntityOwner)& theOwner) Standard_OVERRIDE; + + void DrawMarker (const Handle(Geom2d_TrimmedCurve)& theCurve, + const Handle(Prs3d_Presentation)& thePresentation); + + void FillData(Standard_Boolean isSizesRecomputed = Standard_False); + +private: + + TopoDS_Shape myshape; + TColGeom_SequenceOfCurve mySeq_FORWARD; + TColGeom_SequenceOfCurve mySeq_REVERSED; + TColGeom_SequenceOfCurve mySeq_INTERNAL; + TColGeom_SequenceOfCurve mySeq_EXTERNAL; + + Handle(Graphic3d_ArrayOfPolylines) myForwardArray; + Handle(Graphic3d_ArrayOfPolylines) myReversedArray; + Handle(Graphic3d_ArrayOfPolylines) myInternalArray; + Handle(Graphic3d_ArrayOfPolylines) myExternalArray; + + Standard_Integer myForwardNum; + Standard_Integer myReversedNum; + Standard_Integer myInternalNum; + Standard_Integer myExternalNum; + Standard_Integer myForwardBounds; + Standard_Integer myReversedBounds; + Standard_Integer myInternalBounds; + Standard_Integer myExternalBounds; + +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Image.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Image.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Image.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Image.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,88 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "Sample2D_Image.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Sample2D_Image::Sample2D_Image (const TCollection_AsciiString& theFileName, + const Standard_Real theX, + const Standard_Real theY, + const Standard_Real theScale) +: AIS_Shape (TopoDS_Shape()), + myFilename (theFileName), + myX (theX), + myY (theY), + myScale (theScale) +{ + // +} + +void Sample2D_Image::MakeShape() +{ + Standard_Real coeff = 1.0; + Handle(Image_AlienPixMap) anImage = new Image_AlienPixMap(); + if (anImage->Load (myFilename)) + { + coeff = Standard_Real(anImage->Height()) / Standard_Real(anImage->Width()) * myScale; + } + + TopoDS_Edge E1 = BRepBuilderAPI_MakeEdge (gp_Pnt(myX, myY, 0.), + gp_Pnt(100 * myScale + myX, myY, 0.)); + TopoDS_Edge E2 = BRepBuilderAPI_MakeEdge (gp_Pnt(100 * myScale + myX, myY, 0.), + gp_Pnt(100 * myScale + myX, 100 * coeff + myY, 0.)); + TopoDS_Edge E3 = BRepBuilderAPI_MakeEdge (gp_Pnt(100 * myScale + myX, 100 * coeff + myY, 0.), + gp_Pnt(myX, 100 * coeff + myY, 0.)); + TopoDS_Edge E4 = BRepBuilderAPI_MakeEdge (gp_Pnt(myX, 100 * coeff + myY, 0.), + gp_Pnt(myX, myY, 0.)); + TopoDS_Wire anImageBounds = BRepBuilderAPI_MakeWire(E1, E2, E3, E4); + myFace = BRepBuilderAPI_MakeFace(gp_Pln(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1)), anImageBounds); +} + +void Sample2D_Image::SetContext (const Handle(AIS_InteractiveContext)& theContext) +{ + if (theContext.IsNull() || theContext->CurrentViewer().IsNull()) + { + AIS_InteractiveObject::SetContext (theContext); + return; + } + + AIS_InteractiveObject::SetContext (theContext); + MakeShape(); + this->Set(TopoDS_Shape(myFace)); + + myDrawer->SetShadingAspect(new Prs3d_ShadingAspect()); + Handle(Graphic3d_Texture2Dmanual) aTexture = new Graphic3d_Texture2Dmanual(myFilename); + aTexture->DisableModulate(); + myDrawer->ShadingAspect()->Aspect()->SetTextureMap (aTexture); + myDrawer->ShadingAspect()->Aspect()->SetTextureMapOn(); +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Image.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Image.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Image.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Image.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,86 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef _Sample2D_Image_HeaderFile +#define _Sample2D_Image_HeaderFile +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//! AIS shape for sample 2D image +class Sample2D_Image : public AIS_Shape +{ + DEFINE_STANDARD_RTTI_INLINE(Sample2D_Image, AIS_Shape) +public: + + //! Constructor. + Standard_EXPORT Sample2D_Image (const TCollection_AsciiString& theFileName, + const Standard_Real theX = 0.0, + const Standard_Real theY = 0.0, + const Standard_Real theScale = 1.0); + + //! Return image coordinates. + void GetCoord (Standard_Real& theX, Standard_Real& theY) const + { + theX = myX; + theY = myY; + } + + //! Return image coordinates. + void SetCoord (const Standard_Real theX, const Standard_Real theY) + { + myX = theX; + myY = theY; + } + + //! Return image scale factor. + Standard_Real GetScale() const { return myScale; } + + //! Set image scale factor. + void SetScale(const Standard_Real theNewScale) { myScale = theNewScale; } + + //! Assign new interactive context to the object. + Standard_EXPORT virtual void SetContext (const Handle(AIS_InteractiveContext)& theContext) Standard_OVERRIDE; + +private: + + void MakeShape(); + +protected: + + TopoDS_Face myFace; + TCollection_AsciiString myFilename; + Standard_Real myX; + Standard_Real myY; + Standard_Real myScale; + +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Markers.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Markers.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Markers.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Markers.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,80 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "Sample2D_Markers.h" + +#include + +// generic marker +Sample2D_Markers::Sample2D_Markers (const Standard_Real theXPosition, + const Standard_Real theYPosition, + const Aspect_TypeOfMarker theMarkerType, + const Quantity_Color theColor, + const Standard_Real theScaleOrId) +: myArrayOfPoints (new Graphic3d_ArrayOfPoints(1)) +{ + myXPosition = theXPosition; + myYPosition = theYPosition; + myMarkerType = theMarkerType; + myColor = theColor; + myIndex = theScaleOrId; +} + +Sample2D_Markers::Sample2D_Markers (const Standard_Real theXPosition, + const Standard_Real theYPosition, + const Handle(Graphic3d_ArrayOfPoints)& theArrayOfPoints, + const Aspect_TypeOfMarker theMarkerType, + const Quantity_Color theColor, + const Standard_Real theScaleOrId) +: myArrayOfPoints (new Graphic3d_ArrayOfPoints(6)) +{ + myXPosition = theXPosition; + myYPosition = theYPosition; + myMarkerType = theMarkerType; + myColor = theColor; + myIndex = theScaleOrId; + myArrayOfPoints = theArrayOfPoints; +} + +void Sample2D_Markers::Compute (const Handle(PrsMgr_PresentationManager3d)& , + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) +{ + if (theMode != 0) + { + return; + } + + if (myMarkerType == Aspect_TOM_USERDEFINED) + { + Handle(Graphic3d_AspectMarker3d) aMarker = new Graphic3d_AspectMarker3d(Aspect_TOM_POINT, myColor, myIndex); + thePrs->CurrentGroup()->SetGroupPrimitivesAspect(aMarker); + thePrs->CurrentGroup()->AddPrimitiveArray(myArrayOfPoints); + } + else + { + Handle(Graphic3d_AspectMarker3d) aMarker = new Graphic3d_AspectMarker3d(myMarkerType, myColor, myIndex); + thePrs->CurrentGroup()->SetPrimitivesAspect(aMarker); + Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints(1); + anArrayOfPoints->AddVertex(myXPosition, myYPosition, 0); + thePrs->CurrentGroup()->AddPrimitiveArray(anArrayOfPoints); + } +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Markers.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Markers.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Sample2D_Markers.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Sample2D_Markers.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,88 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef _Sample2D_Markers_HeaderFile +#define _Sample2D_Markers_HeaderFile + +#include +#include + +//! AIS AIS interactive object for sample 2D marker +class Sample2D_Markers : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTI_INLINE(Sample2D_Markers, AIS_InteractiveObject) +private: + enum Sample2D_CurrentTypeOfMarker + { + Sample2D_CTOM_Generic, + Sample2D_CTOM_Polyline, + Sample2D_CTOM_Circle, + Sample2D_CTOM_Ellips + }; + +public: + + //! Generic marker + Standard_EXPORT Sample2D_Markers (const Standard_Real theXPosition, + const Standard_Real theYPosition, + const Aspect_TypeOfMarker theMarkerType, + const Quantity_Color theColor, + const Standard_Real theScaleOrId=5.0); + + //! Polyline marker + Standard_EXPORT Sample2D_Markers (const Standard_Real theXPosition, + const Standard_Real theYPosition, + const Handle(Graphic3d_ArrayOfPoints)& theArrayOfPoints, + const Aspect_TypeOfMarker theMarkerType, + const Quantity_Color theColor, + const Standard_Real theScaleOrId=2.0); + +private: + + //! Return TRUE for supported display modes (only mode 0 is supported). + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; } + + //! Compute presentation. + virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/, + const Handle(Prs3d_Presentation)& /*aPresentation*/, + const Standard_Integer theMode) Standard_OVERRIDE; + + //! Compute selection (not implemented). + virtual void ComputeSelection (const Handle(SelectMgr_Selection)& , + const Standard_Integer ) Standard_OVERRIDE {} + + virtual void SetContext(const Handle(AIS_InteractiveContext)& ) Standard_OVERRIDE {} + +private: + + Sample2D_CurrentTypeOfMarker myCurrentTypeOfMarker; + Standard_Real myXPosition; + Standard_Real myYPosition; + Aspect_TypeOfMarker myMarkerType; + Quantity_Color myColor; + Standard_Real myWidth; + Standard_Real myHeight; + Standard_Real myIndex; + //! specific polyline marker + Handle(Graphic3d_ArrayOfPoints) myArrayOfPoints; +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Samples.qrc opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Samples.qrc --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Samples.qrc 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Samples.qrc 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,11 @@ + + + Geometry.xml + Topology.xml + Triangulation.xml + DataExchange.xml + Viewer3d.xml + Viewer2d.xml + Ocaf.xml + + diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcaf_Application.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcaf_Application.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcaf_Application.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcaf_Application.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,52 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "TOcaf_Application.h" + +#include +#include +#include +#include +#include + +#include "TOcafFunction_BoxDriver.h" +#include "TOcafFunction_CylDriver.h" +#include "TOcafFunction_CutDriver.h" + +//======================================================================= +//function : TOcaf_Application +//purpose : +//======================================================================= +TOcaf_Application::TOcaf_Application() +{ + // Instantiate a TOcafFunction_BoxDriver and add it to the TFunction_DriverTable + TFunction_DriverTable::Get()->AddDriver (TOcafFunction_BoxDriver::GetID(), + new TOcafFunction_BoxDriver()); + + // Instantiate a TOcafFunction_Cyl Driver and add it to the TFunction_DriverTable + TFunction_DriverTable::Get()->AddDriver (TOcafFunction_CylDriver::GetID(), + new TOcafFunction_CylDriver()); + + // Instantiate a TOcafFunction_CutDriver and add it to the TFunction_DriverTable + Handle(TOcafFunction_CutDriver) myCutDriver = new TOcafFunction_CutDriver(); + TFunction_DriverTable::Get()->AddDriver (TOcafFunction_CutDriver::GetID(), + new TOcafFunction_CutDriver()); +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcaf_Application.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcaf_Application.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcaf_Application.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcaf_Application.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,37 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef _TOcaf_Application_HeaderFile +#define _TOcaf_Application_HeaderFile + +#include +#include + +//! Sample OCAF application +class TOcaf_Application : public TDocStd_Application +{ + DEFINE_STANDARD_RTTI_INLINE(TOcaf_Application, TDocStd_Application) +public: + + Standard_EXPORT TOcaf_Application(); +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_BoxDriver.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_BoxDriver.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_BoxDriver.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_BoxDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,148 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "TOcafFunction_BoxDriver.h" + +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& TOcafFunction_BoxDriver::GetID() +{ + static const Standard_GUID anID("22D22E51-D69A-11d4-8F1A-0060B0EE18E8"); + return anID; +} + +//======================================================================= +//function : Validate +//purpose : +//======================================================================= +void TOcafFunction_BoxDriver::Validate(Handle(TFunction_Logbook)& log) const +{ + // We validate the object label ( Label() ), all the arguments and the results of the object: + log->SetValid(Label(), Standard_True); +} + +//======================================================================= +//function : MustExecute +//purpose : +//======================================================================= +Standard_Boolean TOcafFunction_BoxDriver::MustExecute(const Handle(TFunction_Logbook)& log) const +{ + // If the object's label is modified: + if (log->IsModified(Label())) return Standard_True; + + // Cut (in our simple case) has two arguments: The original shape, and the tool shape. + // They are on the child labels of the box's label: + // So, OriginalNShape - is attached to the first child label + // ToolNShape - is attached to the second child label. + // + // Let's check them: + if (log->IsModified(Label().FindChild(1))) + { + return Standard_True; // width. + } + if (log->IsModified(Label().FindChild(2))) + { + return Standard_True; // length, + } + if (log->IsModified(Label().FindChild(3))) + { + return Standard_True; // width. + } + if (log->IsModified(Label().FindChild(4))) + { + return Standard_True; // length, + } + if (log->IsModified(Label().FindChild(5))) + { + return Standard_True; // width. + } + if (log->IsModified(Label().FindChild(6))) + { + return Standard_True; // length, + } + // if there are no any modifications concerned the box, + // it's not necessary to recompute (to call the method Execute()): + return Standard_False; +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer TOcafFunction_BoxDriver::Execute(Handle(TFunction_Logbook)& /*log*/) const +{ + // Get the values of dimension and position attributes + Handle(TDataStd_Real) TSR; + Standard_Real x, y, z, l, h, w; + if (!Label().FindChild(1).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + l = TSR->Get(); + + if (!Label().FindChild(2).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + h = TSR->Get(); + + if (!Label().FindChild(3).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + w = TSR->Get(); + + if (!Label().FindChild(4).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + x = TSR->Get(); + + if (!Label().FindChild(5).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + y = TSR->Get(); + + if (!Label().FindChild(6).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + z = TSR->Get(); + + // Build a box using the dimension and position attributes + BRepPrimAPI_MakeBox mkBox(gp_Pnt(x, y, z), l, h, w); + TopoDS_Shape ResultShape = mkBox.Shape(); + + // Build a TNaming_NamedShape using built box + TNaming_Builder B(Label()); + B.Generated(ResultShape); + // That's all: + // If there are no any mistakes we return 0: + return 0; +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_BoxDriver.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_BoxDriver.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_BoxDriver.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_BoxDriver.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,57 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef _TOcafFunction_BoxDriver_HeaderFile +#define _TOcafFunction_BoxDriver_HeaderFile + +#include +#include + +//! Creation of an instance of the box driver. It's possible (and recommended) +//! to have only one instance of a driver for the whole session. +class TOcafFunction_BoxDriver : public TFunction_Driver +{ + DEFINE_STANDARD_RTTI_INLINE(TOcafFunction_BoxDriver, TFunction_Driver) +public: + Standard_EXPORT static const Standard_GUID& GetID(); +public: + + TOcafFunction_BoxDriver() {} + + //! Validation of the object label, its arguments and its results. + Standard_EXPORT virtual void Validate (Handle(TFunction_Logbook)& theLog) const Standard_OVERRIDE; + + //! We call this method to check if the object was modified to be invoked. + //! If the object label or an argument is modified, we must recompute the object - to call the method Execute(). + Standard_EXPORT virtual Standard_Boolean MustExecute (const Handle(TFunction_Logbook)& theLog) const Standard_OVERRIDE; + + //! We compute the object and topologically name it. + //! If during the execution we found something wrong, we return the number of the failure. + //! For example: + //! 1 - an attribute hasn't been found, + //! 2 - algorithm failed, + //! if there are no any mistakes occurred we return 0: + //! 0 - no mistakes were found. + Standard_EXPORT virtual Standard_Integer Execute (Handle(TFunction_Logbook)& theLog) const Standard_OVERRIDE; + +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CutDriver.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CutDriver.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CutDriver.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CutDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,152 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "TOcafFunction_CutDriver.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& TOcafFunction_CutDriver::GetID() +{ + static const Standard_GUID anID("22D22E52-D69A-11d4-8F1A-0060B0EE18E8"); + return anID; +} + +//======================================================================= +//function : Validate +//purpose : +//======================================================================= +void TOcafFunction_CutDriver::Validate (Handle(TFunction_Logbook)& log) const +{ + // We validate the object label ( Label() ), all the arguments and the results of the object: + log->SetValid(Label(), Standard_True); +} + +//======================================================================= +//function : MustExecute +//purpose : +//======================================================================= +Standard_Boolean TOcafFunction_CutDriver::MustExecute(const Handle(TFunction_Logbook)& log) const +{ + // If the object's label is modified: + if (log->IsModified(Label())) return Standard_True; + + // Cut (in our simple case) has two arguments: The original shape, and the tool shape. + // They are on the child labels of the cut's label: + // So, OriginalNShape - is attached to the first child label + // ToolNShape - is attached to the second child label, + // . + // Let's check them: + Handle(TDF_Reference) OriginalRef; + //TDF_Label aLabel = Label().FindChild(1); +/* + BOOL f = Label().IsNull(); + int a = Label().NbChildren(); +*/ + TCollection_AsciiString aEntry; + TDF_Tool::Entry(Label(), aEntry); + std::cout << "Entry: " << aEntry.ToCString() << std::endl; + Label().FindChild(1).FindAttribute(TDF_Reference::GetID(), OriginalRef); + if (log->IsModified(OriginalRef->Get())) return Standard_True; // Original shape. + + Handle(TDF_Reference) ToolRef; + Label().FindChild(2).FindAttribute(TDF_Reference::GetID(), ToolRef); + if (log->IsModified(ToolRef->Get())) return Standard_True; // Tool shape. + + // if there are no any modifications concerned the cut, + // it's not necessary to recompute (to call the method Execute()): + return Standard_False; +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer TOcafFunction_CutDriver::Execute(Handle(TFunction_Logbook)& /*log*/) const +{ + // Let's get the arguments (OriginalNShape, ToolNShape of the object): + + // First, we have to retrieve the TDF_Reference attributes to obtain + // the root labels of the OriginalNShape and the ToolNShape: + Handle(TDF_Reference) OriginalRef, ToolRef; + if (!Label().FindChild(1).FindAttribute(TDF_Reference::GetID(), OriginalRef)) + { + return 1; + } + TDF_Label OriginalLab = OriginalRef->Get(); + if (!Label().FindChild(2).FindAttribute(TDF_Reference::GetID(), ToolRef)) + { + return 1; + } + TDF_Label ToolLab = ToolRef->Get(); + + // Get the TNaming_NamedShape attributes of these labels + Handle(TNaming_NamedShape) OriginalNShape, ToolNShape; + if (!(OriginalLab.FindAttribute(TNaming_NamedShape::GetID(), OriginalNShape))) + { + throw Standard_Failure("TOcaf_Commands::CutObjects"); + } + if (!(ToolLab.FindAttribute(TNaming_NamedShape::GetID(), ToolNShape))) + { + throw Standard_Failure("TOcaf_Commands::CutObjects"); + } + + // Now, let's get the TopoDS_Shape of these TNaming_NamedShape: + TopoDS_Shape OriginalShape = OriginalNShape->Get(); + TopoDS_Shape ToolShape = ToolNShape->Get(); + + // STEP 2: + // Let's call for algorithm computing a cut operation: + BRepAlgoAPI_Cut mkCut(OriginalShape, ToolShape); + // Let's check if the Cut has been successful: + if (!mkCut.IsDone()) + { + QMessageBox::critical(qApp->activeWindow(), + QObject::tr("Cut Function Driver"), + QObject::tr("Cut not done.")); + return 2; + } + TopoDS_Shape ResultShape = mkCut.Shape(); + + // Build a TNaming_NamedShape using built cut + TNaming_Builder B(Label()); + B.Modify(OriginalShape, ResultShape); + // That's all: + // If there are no any mistakes we return 0: + return 0; +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CutDriver.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CutDriver.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CutDriver.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CutDriver.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,57 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef _TOcafFunction_CutDriver_HeaderFile +#define _TOcafFunction_CutDriver_HeaderFile + +#include +#include + +//! Creation of an instance of the cut driver. It's possible (and recommended) +//! to have only one instance of a driver for the whole session. +class TOcafFunction_CutDriver : public TFunction_Driver +{ + DEFINE_STANDARD_RTTI_INLINE(TOcafFunction_CutDriver, TFunction_Driver) +public: + Standard_EXPORT static const Standard_GUID& GetID(); +public: + + TOcafFunction_CutDriver() {} + + //! Validation of the object label, its arguments and its results. + Standard_EXPORT virtual void Validate (Handle(TFunction_Logbook)& theLog) const Standard_OVERRIDE; + + //! We call this method to check if the object was modified to be invoked. + //! If the object label or an argument is modified, we must recompute the object - to call the method Execute(). + Standard_EXPORT virtual Standard_Boolean MustExecute (const Handle(TFunction_Logbook)& theLog) const Standard_OVERRIDE; + + //! We compute the object and topologically name it. + //! If during the execution we found something wrong, we return the number of the failure. + //! For example: + //! 1 - an attribute hasn't been found, + //! 2 - algorithm failed, + //! if there are no any mistakes occurred we return 0: + //! 0 - no mistakes were found. + Standard_EXPORT virtual Standard_Integer Execute (Handle(TFunction_Logbook)& theLog) const Standard_OVERRIDE; + +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CylDriver.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CylDriver.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CylDriver.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CylDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,147 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "TOcafFunction_CylDriver.h" + +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& TOcafFunction_CylDriver::GetID() +{ + static const Standard_GUID anID("22D22E53-D69A-11d4-8F1A-0060B0EE18E8"); + return anID; +} + +//======================================================================= +//function : TPartStd_CylDriver +//purpose : +//======================================================================= +TOcafFunction_CylDriver::TOcafFunction_CylDriver() +{ + // +} + +//======================================================================= +//function : Validate +//purpose : +//======================================================================= +void TOcafFunction_CylDriver::Validate (Handle(TFunction_Logbook)& log) const +{ + // We validate the object label ( Label() ), all the arguments and the results of the object: + log->SetValid(Label(), Standard_True); +} + +//======================================================================= +//function : MustExecute +//purpose : +//======================================================================= +Standard_Boolean TOcafFunction_CylDriver::MustExecute(const Handle(TFunction_Logbook)& log) const +{ + // If the object's label is modified: + if (log->IsModified(Label())) return Standard_True; + + // Cylinder (in our simple case) has 5 arguments: + // + // Let's check them: + if (log->IsModified(Label().FindChild(1))) + { + return Standard_True; // radius. + } + if (log->IsModified(Label().FindChild(2))) + { + return Standard_True; // height, + } + if (log->IsModified(Label().FindChild(3))) + { + return Standard_True; // x. + } + if (log->IsModified(Label().FindChild(4))) + { + return Standard_True; // y, + } + if (log->IsModified(Label().FindChild(5))) + { + return Standard_True; // z. + } + // if there are no any modifications concerned the Cyl, + // it's not necessary to recompute (to call the method Execute()): + return Standard_False; +} + +//======================================================================= +//function : Execute +//purpose : +//======================================================================= +Standard_Integer TOcafFunction_CylDriver::Execute(Handle(TFunction_Logbook)& /*log*/) const +{ + // Get the values of dimension and position attributes + Handle(TDataStd_Real) TSR; + Standard_Real x, y, z, r, h; + if (!Label().FindChild(1).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + r = TSR->Get(); + + if (!Label().FindChild(2).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + h = TSR->Get(); + + if (!Label().FindChild(3).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + x = TSR->Get(); + + if (!Label().FindChild(4).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + y = TSR->Get(); + + if (!Label().FindChild(5).FindAttribute(TDataStd_Real::GetID(), TSR)) + { + return 1; + } + z = TSR->Get(); + + // Build a Cyl using the dimension and position attributes + BRepPrimAPI_MakeCylinder mkCyl(gp_Ax2(gp_Pnt(x, y, z), gp_Dir(0, 0, 1)), r, h); + TopoDS_Shape ResultShape = mkCyl.Shape(); + + + // Build a TNaming_NamedShape using built Cyl + TNaming_Builder B(Label()); + B.Generated(ResultShape); + // That's all: + // If there are no any mistakes we return 0: + return 0; +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CylDriver.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CylDriver.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CylDriver.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TOcafFunction_CylDriver.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,59 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef _TOcafFunction_CylDriver_HeaderFile +#define _TOcafFunction_CylDriver_HeaderFile + +#include +#include + +//! Creation of an instance of the cylinder driver. It's possible (and recommended) +//! to have only one instance of a driver for the whole session. +class TOcafFunction_CylDriver : public TFunction_Driver +{ + DEFINE_STANDARD_RTTI_INLINE(TOcafFunction_CylDriver, TFunction_Driver) +public: + Standard_EXPORT static const Standard_GUID& GetID(); +public: + + //! Creation of an instance of the driver. It's possible (and recommended) + //! to have only one instance of a driver for the whole session. + Standard_EXPORT TOcafFunction_CylDriver(); + + //! Validation of the object label, its arguments and its results. + Standard_EXPORT virtual void Validate (Handle(TFunction_Logbook)& theLog) const Standard_OVERRIDE; + + //! We call this method to check if the object was modified to be invoked. + //! If the object label or an argument is modified, we must recompute the object - to call the method Execute(). + Standard_EXPORT virtual Standard_Boolean MustExecute (const Handle(TFunction_Logbook)& theLog) const Standard_OVERRIDE; + + //! We compute the object and topologically name it. + //! If during the execution we found something wrong, + //! we return the number of the failure. For example: + //! 1 - an attribute hasn't been found, + //! 2 - algorithm failed, + //! if there are no any mistakes occurred we return 0: + //! 0 - no mistakes were found. + Standard_EXPORT virtual Standard_Integer Execute (Handle(TFunction_Logbook)& theLog) const Standard_OVERRIDE; + +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TopologySamples.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TopologySamples.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TopologySamples.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TopologySamples.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1884 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "TopologySamples.h" + +#include "AdaptorVec_AIS.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +void TopologySamples::ExecuteSample (const TCollection_AsciiString& theSampleName) +{ + Standard_Boolean anIsSamplePresent = Standard_True; + FindSourceCode(theSampleName); + if (theSampleName == "Vertex3dSample") + Vertex3dSample(); + else if (theSampleName == "Edge3dSample") + Edge3dSample(); + else if (theSampleName == "Face3dSample") + Face3dSample(); + else if (theSampleName == "Wire3dSample") + Wire3dSample(); + else if (theSampleName == "Shell3dSample") + Shell3dSample(); + else if (theSampleName == "Solid3dSample") + Solid3dSample(); + else if (theSampleName == "Edge2dSample") + Edge2dSample(); + else if (theSampleName == "Box3dSample") + Box3dSample(); + else if (theSampleName == "Cylinder3dSample") + Cylinder3dSample(); + else if (theSampleName == "Revolution3dSample") + Revolution3dSample(); + else if (theSampleName == "TopologyIterator3dSample") + TopologyIterator3dSample(); + else if (theSampleName == "TopologyExplorer3dSample") + TopologyExplorer3dSample(); + else if (theSampleName == "AssessToCurve3dSample") + AssessToCurve3dSample(); + else if (theSampleName == "AssessToCompositeCurve3dSample") + AssessToCompositeCurve3dSample(); + else if (theSampleName == "AssessToSurface3dSample") + AssessToSurface3dSample(); + else if (theSampleName == "Common3dSample") + Common3dSample(); + else if (theSampleName == "Cut3dSample") + Cut3dSample(); + else if (theSampleName == "Cut3dSample") + Cut3dSample(); + else if (theSampleName == "Fuse3dSample") + Fuse3dSample(); + else if (theSampleName == "Section3dSample") + Section3dSample(); + else if (theSampleName == "Splitter3dSample") + Splitter3dSample(); + else if (theSampleName == "Defeaturing3dSample") + Defeaturing3dSample(); + else if (theSampleName == "Fillet3dSample") + Fillet3dSample(); + else if (theSampleName == "Chamfer3dSample") + Chamfer3dSample(); + else if (theSampleName == "Offset3dSample") + Offset3dSample(); + else if (theSampleName == "Evolved3dSample") + Evolved3dSample(); + else if (theSampleName == "Copy3dSample") + Copy3dSample(); + else if (theSampleName == "Transform3dSample") + Transform3dSample(); + else if (theSampleName == "ConvertToNurbs3dSample") + ConvertToNurbs3dSample(); + else if (theSampleName == "SewContiguousFaces3dSample") + SewContiguousFaces3dSample(); + else if (theSampleName == "CheckValidity3dSample") + CheckValidity3dSample(); + else if (theSampleName == "ComputeLinearProperties3dSample") + ComputeLinearProperties3dSample(); + else if (theSampleName == "ComputeSurfaceProperties3dSample") + ComputeSurfaceProperties3dSample(); + else if (theSampleName == "ComputeVolumeProperties3dSample") + ComputeVolumeProperties3dSample(); + else + { + myResult << "No function found: " << theSampleName; + myCode += TCollection_AsciiString("No function found: ") + theSampleName; + anIsSamplePresent = Standard_False; + } + myIsProcessed = anIsSamplePresent; +} + +void TopologySamples::Vertex3dSample() +{ + // Make a vertex from a 3D point. + gp_Pnt aPnt(0.0, 0.0, 10.0); + TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(aPnt); + myResult << "TopoDS_Vertex was created at [ " + << aPnt.X() << ", " << aPnt.Y() << ", " << aPnt.Z() + << " ]" << std::endl; + + Handle(AIS_Shape) aAisVertex = new AIS_Shape(aVertex); + Handle(AIS_TextLabel) anAisLabel = new AIS_TextLabel(); + Standard_SStream aSS; + aSS << "TopoDS_Vertex [" << aPnt.X() << ", " << aPnt.Y() << ", " << aPnt.Z() << "]" << std::endl; + anAisLabel->SetText(aSS.str().c_str()); + anAisLabel->SetPosition(aPnt); + myObject3d.Append(aAisVertex); + myObject3d.Append(anAisLabel); +} + +void TopologySamples::Edge3dSample() +{ + // Make an edge from two 3D points. + gp_Pnt aPnt1(0.0, 10.0, 0.0); + gp_Pnt aPnt2(10.0, 10.0, 0.0); + TopoDS_Edge anEdgeP12 = BRepBuilderAPI_MakeEdge(aPnt1, aPnt2); + myResult << "TopoDS_Edge between [ " + << aPnt1.X() << ", " << aPnt1.Y() << ", " << aPnt1.Z() + << " ] and [ " + << aPnt2.X() << ", " << aPnt2.Y() << ", " << aPnt2.Z() + << " ] was created in yellow" << std::endl + << std::endl; + + // Make an edge from a circular segment. + // Create a circle in XY plane of the radius 5.0. + gp_Circ aCirc(gp::XOY(), 5.0); + // Make a circular edge from the 1st quoter in the parametric space. + TopoDS_Edge anEdgeCirc = BRepBuilderAPI_MakeEdge(aCirc, 0.0, M_PI_2); + myResult << "TopoDS_Edge on the circle's 1st quoter" << std::endl + << "with the center at [ " + << aCirc.Location().X() << ", " << aCirc.Location().Y() << ", " << aCirc.Location().Z() + << " ] and R = " << aCirc.Radius() << " was created in red" << std::endl + << std::endl; + + // Make an edge from a 3D curve (BSpline). + // Define points. + gp_Pnt aPole1(0.0, 0.0, 10.0); + gp_Pnt aPole2(5.0, 5.0, 5.0); + gp_Pnt aPole3(10.0, 10.0, 15.0); + gp_Pnt aPole4(15.0, 5.0, 20.0); + // Add points to the curve poles array. + TColgp_Array1OfPnt aPoles(1, 4); + aPoles.SetValue(1, aPole1); + aPoles.SetValue(2, aPole2); + aPoles.SetValue(3, aPole3); + aPoles.SetValue(4, aPole4); + // Make a BSpline curve from the points array + Handle(Geom_BSplineCurve) aBSplineCurve = GeomAPI_PointsToBSpline(aPoles).Curve(); + // Make an edge between two point on the BSpline curve. + gp_Pnt aPntOnCurve1, aPntOnCurve2; + aBSplineCurve->D0 (0.75 * aBSplineCurve->FirstParameter() + + 0.25 * aBSplineCurve->LastParameter(), + aPntOnCurve1); + aBSplineCurve->D0 (0.25 * aBSplineCurve->FirstParameter() + + 0.75 * aBSplineCurve->LastParameter(), + aPntOnCurve2); + TopoDS_Edge anEdgeBSpline = BRepBuilderAPI_MakeEdge(aBSplineCurve, aPntOnCurve1, aPntOnCurve2); + myResult << "TopoDS_Edge on the BSpline curve" << std::endl + << "between [ " + << aPntOnCurve1.X() << ", " << aPntOnCurve1.Y() << ", " << aPntOnCurve1.Z() + << " ] and [ " + << aPntOnCurve2.X() << ", " << aPntOnCurve2.Y() << ", " << aPntOnCurve2.Z() + << " ]" << std::endl + << "was created in green" << std::endl; + + Handle(AIS_ColoredShape) anAisEdgeP12 = new AIS_ColoredShape(anEdgeP12); + Handle(AIS_ColoredShape) anAisEdgeCirc = new AIS_ColoredShape(anEdgeCirc); + Handle(AIS_ColoredShape) anAisEdgeBSpline = new AIS_ColoredShape(anEdgeBSpline); + anAisEdgeP12->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisEdgeCirc->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisEdgeBSpline->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisEdgeP12); + myObject3d.Append(anAisEdgeCirc); + myObject3d.Append(anAisEdgeBSpline); + Handle(AIS_TextLabel) anAisEdgeP12Label = new AIS_TextLabel(); + anAisEdgeP12Label->SetText("Edge between two points"); + anAisEdgeP12Label->SetPosition(0.5 * (aPnt1.XYZ() + aPnt2.XYZ())); + anAisEdgeP12Label->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + myObject3d.Append(anAisEdgeP12Label); + Handle(AIS_TextLabel) anAisEdgeCircLabel = new AIS_TextLabel(); + anAisEdgeCircLabel->SetText("Circular edge"); + anAisEdgeCircLabel->SetPosition(aCirc.Location()); + anAisEdgeCircLabel->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisEdgeCircLabel); + Handle(AIS_TextLabel) anAisEdgeBSplineLabel = new AIS_TextLabel(); + anAisEdgeBSplineLabel->SetText("BSpline edge"); + anAisEdgeBSplineLabel->SetPosition(aPole3); + anAisEdgeBSplineLabel->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisEdgeBSplineLabel); + TopoDS_Vertex anEdgeP12_V1, anEdgeP12_V2; + TopExp::Vertices(anEdgeP12, anEdgeP12_V1, anEdgeP12_V2); + myObject3d.Append(new AIS_Shape(anEdgeP12_V1)); + myObject3d.Append(new AIS_Shape(anEdgeP12_V2)); + TopoDS_Vertex anEdgeCirc_V1, anEdgeCirc_V2; + TopExp::Vertices(anEdgeCirc, anEdgeCirc_V1, anEdgeCirc_V2); + myObject3d.Append(new AIS_Shape(anEdgeCirc_V1)); + myObject3d.Append(new AIS_Shape(anEdgeCirc_V2)); + TopoDS_Vertex anEdgeBSpline_V1, anEdgeBSpline_V2; + TopExp::Vertices(anEdgeBSpline, anEdgeBSpline_V1, anEdgeBSpline_V2); + myObject3d.Append(new AIS_Shape(anEdgeBSpline_V1)); + myObject3d.Append(new AIS_Shape(anEdgeBSpline_V2)); +} + +void TopologySamples::Face3dSample() +{ + // Make a face from a sphere with the center + // at [0.0, 0.0, 10.0] and R = 5. + gp_Sphere aSphere(gp_Ax3(gp_Pnt(0.0, 0.0, 10.0), gp::DZ()), 5.0); + TopoDS_Face aFaceSphere = BRepBuilderAPI_MakeFace(aSphere); + myResult << "TopoDS_Face on the sphere with" << std::endl + << "the center at [ " + << aSphere.Location().X() << ", " << aSphere.Location().Y() << ", " << aSphere.Location().Z() + << " ] and R = " << aSphere.Radius() << " was created in yellow" << std::endl + << std::endl; + + // Make a flat rectangular face on XY plane. + gp_Pln aPln(gp::XOY()); + TopoDS_Face aFaceRect = BRepBuilderAPI_MakeFace(aPln, -10.0, +10.0, -20.0, +20.0); + myResult << "TopoDS_Face on the rectangle was created in red" << std::endl + << std::endl; + + // Make a face from a BSpline surface. + // Define a 4x4 grid of points for BSpline surface. + TColgp_Array2OfPnt aPoints(1, 4, 1, 4); + for (Standard_Integer i = 1; i <= 4; ++i) + { + gp_Pnt aPnt; + aPnt.SetX(5.0 * i); + for (Standard_Integer j = 1; j <= 4; ++j) + { + aPnt.SetY(5.0 * j); + if (1 < i && i < 4 && 1 < j && j < 4) + { + aPnt.SetZ(15.0); + } + else + { + aPnt.SetZ(10.0); + } + aPoints.SetValue(i, j, aPnt); + } + } + // Make a BSpline surface from the points array. + Handle(Geom_BSplineSurface) aBSplineSurf = GeomAPI_PointsToBSplineSurface(aPoints).Surface(); + Standard_Real aU1, aU2, aV1, aV2; + aBSplineSurf->Bounds(aU1, aU2, aV1, aV2); + TopoDS_Face aFaceBSpline = BRepBuilderAPI_MakeFace(aBSplineSurf, aU1, aU2, aV1, aV2, Precision::Confusion()); + myResult << "TopoDS_Face on the BSpline surface was created in green" << std::endl << std::endl; + + Handle(AIS_ColoredShape) anAisFaceSphere = new AIS_ColoredShape(aFaceSphere); + Handle(AIS_ColoredShape) anAisFaceRect = new AIS_ColoredShape(aFaceRect); + Handle(AIS_ColoredShape) anAisFaceBSpline = new AIS_ColoredShape(aFaceBSpline); + anAisFaceSphere->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisFaceRect->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisFaceBSpline->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisFaceSphere); + myObject3d.Append(anAisFaceRect); + myObject3d.Append(anAisFaceBSpline); + Handle(AIS_TextLabel) anAisFaceSphereLabel = new AIS_TextLabel(); + anAisFaceSphereLabel->SetText("Spherical face"); + anAisFaceSphereLabel->SetPosition(aSphere.Location().XYZ() + aSphere.Radius() * gp::DZ().XYZ()); + anAisFaceSphereLabel->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + myObject3d.Append(anAisFaceSphereLabel); + Handle(AIS_TextLabel) anAisFaceRectLabel = new AIS_TextLabel(); + anAisFaceRectLabel->SetText("Flat rectangular face"); + anAisFaceRectLabel->SetPosition(aPln.Location().XYZ() + 2.5 * gp::DZ().XYZ()); + anAisFaceRectLabel->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisFaceRectLabel); + Handle(AIS_TextLabel) anAisFaceBSplineLabel = new AIS_TextLabel(); + anAisFaceBSplineLabel->SetText("BSpline face"); + anAisFaceBSplineLabel->SetPosition(aPoints(4, 4)); + anAisFaceBSplineLabel->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisFaceBSplineLabel); +} + +void TopologySamples::Wire3dSample() +{ + // Make a wire from edges created on a set of points. + // Add points to the curve poles array. + TColgp_Array1OfPnt aPoints(1, 4); + aPoints.SetValue(1, gp_Pnt(0.0, 0.0, 0.0)); + aPoints.SetValue(2, gp_Pnt(20.0, 0.0, 0.0)); + aPoints.SetValue(3, gp_Pnt(20.0, 10.0, 0.0)); + aPoints.SetValue(4, gp_Pnt(0.0, 10.0, 0.0)); + // A wire maker contains an empty wire. + BRepBuilderAPI_MakeWire aMakeWire; + for (Standard_Integer i = 1; i <= 4; ++i) + { + Standard_Integer i1 = i; + Standard_Integer i2 = i1 < 4 ? i1 + 1 : 1; + const gp_Pnt& aPnt1 = aPoints.Value(i1); + const gp_Pnt& aPnt2 = aPoints.Value(i2); + TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(aPnt1, aPnt2); + // Add an edge to the wire under construction. + // The edge must be connectible to the wire under construction, and, + // unless it is the first edge of the wire, must satisfy the following + // condition: one of its vertices must be geometrically coincident + // with one of the vertices of the wire (provided that the highest + // tolerance factor is assigned to the two vertices). + // It could also be the same vertex. + // Warning + // If the edge is not connectible to the wire under construction it is not added. + // The function IsDone will return false and the function + // Wire will raise an error, until a new connectible edge is added. + aMakeWire.Add(anEdge); + Standard_ASSERT_VOID(aMakeWire.IsDone(), "Added edge isn't connectible!"); + } + // Retrieve a constructed wire. + TopoDS_Wire aWire = aMakeWire.Wire(); + myResult << "TopoDS_Wire was created. Vertices :" << std::endl; + // Retrieve wire vertices. 4 vertices are expected, because of + // edges connecting during wire constructing. + TopTools_IndexedMapOfShape aVertices; + TopExp::MapShapes(aWire, TopAbs_VERTEX, aVertices); + for (TopTools_IndexedMapOfShape::Iterator anIt(aVertices); anIt.More(); anIt.Next()) + { + TopoDS_Vertex aVertex = TopoDS::Vertex(anIt.Value()); + gp_Pnt aPnt = BRep_Tool::Pnt(aVertex); + myResult << "[ " << aPnt.X() << ", " << aPnt.Y() << ", " << aPnt.Z() << " ]" << std::endl; + Handle(AIS_Shape) anAisVertex = new AIS_Shape(aVertex); + myObject3d.Append(anAisVertex); + } + + Handle(AIS_Shape) anAisWire = new AIS_Shape(aWire); + myObject3d.Append(anAisWire); +} + +void TopologySamples::Shell3dSample() +{ + // Make a shell from a cylinder with R = 5 and directed along Z axis + gp_Cylinder aCyl(gp::XOY(), 5.0); + Handle(Geom_Surface) aCylSurf = new Geom_CylindricalSurface(aCyl); + TopoDS_Shell aCylShell = BRepBuilderAPI_MakeShell(aCylSurf, 0.0, 2.0 * M_PI, -10.0, +10.0); + myResult << "TopoDS_Shell on the cylinder R = " << aCyl.Radius() << std::endl + << "with axis [ " + << aCyl.Position().Direction().X() << ", " + << aCyl.Position().Direction().Y() << ", " + << aCyl.Position().Direction().Z() << " ]" << std::endl + << "limited in length [-10 ... +10] was created" << std::endl; + + Handle(AIS_Shape) anAisShell = new AIS_Shape(aCylShell); + myObject3d.Append(anAisShell); +} + +void TopologySamples::Solid3dSample() +{ + // Make a torus from a shell. + gp_Torus aTorus(gp::XOY(), 20.0, 7.5); + Handle(Geom_Surface) aTorusSurf = new Geom_ToroidalSurface(aTorus); + TopoDS_Shell aTorusShell = BRepBuilderAPI_MakeShell(aTorusSurf, 0.0, 2.0 * M_PI, 0.0, 2.0 * M_PI); + // Make a solid on the torus shell. + TopoDS_Solid aTorusSolid = BRepBuilderAPI_MakeSolid(aTorusShell); + myResult << "TopoDS_Solid on the torus with" << std::endl + << "R major = " << aTorus.MajorRadius() << std::endl + << "R minor = " << aTorus.MinorRadius() << std::endl + << "was created" << std::endl; + + Handle(AIS_Shape) anAisSolid = new AIS_Shape(aTorusSolid); + myObject3d.Append(anAisSolid); +} + +void TopologySamples::Edge2dSample() +{ + // Make an edge from two 2D points. + gp_Pnt2d aPnt1(0.0, 10.0); + gp_Pnt2d aPnt2(10.0, 10.0); + TopoDS_Edge anEdgeP12 = BRepBuilderAPI_MakeEdge2d(aPnt1, aPnt2); + myResult << "TopoDS_Edge between [ " + << aPnt1.X() << ", " << aPnt1.Y() << " ] and [ " + << aPnt2.X() << ", " << aPnt2.Y() << " ] was created in yellow" << std::endl + << std::endl; + + // Make an edge from a circular segment. + // Create a circle of the radius 5.0. + gp_Circ2d aCirc(gp::OX2d(), 5.0); + // Make a circular edge from the 1st quoter in the parametric space. + TopoDS_Edge anEdgeCirc = BRepBuilderAPI_MakeEdge2d(aCirc, 0.0, M_PI_2); + myResult << "TopoDS_Edge on the 2D circle's 1st quoter" << std::endl + << "with the center at [ " << aCirc.Location().X() << ", " << aCirc.Location().Y() + << " ] and R = " << aCirc.Radius() << " was created in red" << std::endl + << std::endl; + + // Make an edge from a 2D curve (BSpline). + // Define points. + gp_Pnt2d aPole1(0.0, 0.0); + gp_Pnt2d aPole2(5.0, 5.0); + gp_Pnt2d aPole3(10.0, 10.0); + gp_Pnt2d aPole4(15.0, 5.0); + // Add points to the curve poles array. + TColgp_Array1OfPnt2d aPoles(1, 4); + aPoles.SetValue(1, aPole1); + aPoles.SetValue(2, aPole2); + aPoles.SetValue(3, aPole3); + aPoles.SetValue(4, aPole4); + // Make a BSpline curve from the points array + Handle(Geom2d_BSplineCurve) aBSplineCurve = Geom2dAPI_PointsToBSpline(aPoles).Curve(); + // Make an edge between two point on the BSpline curve. + gp_Pnt2d aPntOnCurve1, aPntOnCurve2; + aBSplineCurve->D0 (0.75 * aBSplineCurve->FirstParameter() + + 0.25 * aBSplineCurve->LastParameter(), + aPntOnCurve1); + aBSplineCurve->D0 (0.25 * aBSplineCurve->FirstParameter() + + 0.75 * aBSplineCurve->LastParameter(), + aPntOnCurve2); + TopoDS_Edge anEdgeBSpline = BRepBuilderAPI_MakeEdge2d(aBSplineCurve, aPntOnCurve1, aPntOnCurve2); + myResult << "TopoDS_Edge on the 2D BSpline curve" << std::endl + << "between [ " << aPntOnCurve1.X() << ", " << aPntOnCurve1.Y() + << " ] and [ " << aPntOnCurve2.X() << ", " << aPntOnCurve2.Y() << " ]" << std::endl + << "was created in green" << std::endl; + + Handle(AIS_ColoredShape) anAisEdgeP12 = new AIS_ColoredShape(anEdgeP12); + Handle(AIS_ColoredShape) anAisEdgeCirc = new AIS_ColoredShape(anEdgeCirc); + Handle(AIS_ColoredShape) anAisEdgeBSpline = new AIS_ColoredShape(anEdgeBSpline); + anAisEdgeP12->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisEdgeCirc->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisEdgeBSpline->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject2d.Append(anAisEdgeP12); + myObject2d.Append(anAisEdgeCirc); + myObject2d.Append(anAisEdgeBSpline); + Handle(AIS_TextLabel) anAisEdgeP12Label = new AIS_TextLabel(); + anAisEdgeP12Label->SetText("Edge between two 2d points"); + anAisEdgeP12Label->SetPosition(0.5 * (gp_XYZ(aPnt1.X(), aPnt1.Y() + 0.5, 0.0) + gp_XYZ(aPnt2.X(), aPnt2.Y() + 0.5, 0.0))); + anAisEdgeP12Label->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + myObject2d.Append(anAisEdgeP12Label); + Handle(AIS_TextLabel) anAisEdgeCircLabel = new AIS_TextLabel(); + anAisEdgeCircLabel->SetText("Circular edge"); + anAisEdgeCircLabel->SetPosition(gp_XYZ(aCirc.Location().X(), aCirc.Location().Y() + 0.5, 0.0)); + anAisEdgeCircLabel->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject2d.Append(anAisEdgeCircLabel); + Handle(AIS_TextLabel) anAisEdgeBSplineLabel = new AIS_TextLabel(); + anAisEdgeBSplineLabel->SetText("BSpline edge"); + anAisEdgeBSplineLabel->SetPosition(gp_XYZ(aPole3.X(), aPole3.Y() + 0.5, 0.0)); + anAisEdgeBSplineLabel->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject2d.Append(anAisEdgeBSplineLabel); + TopoDS_Vertex anEdgeP12_V1, anEdgeP12_V2; + TopExp::Vertices(anEdgeP12, anEdgeP12_V1, anEdgeP12_V2); + myObject2d.Append(new AIS_Shape(anEdgeP12_V1)); + myObject2d.Append(new AIS_Shape(anEdgeP12_V2)); + TopoDS_Vertex anEdgeCirc_V1, anEdgeCirc_V2; + TopExp::Vertices(anEdgeCirc, anEdgeCirc_V1, anEdgeCirc_V2); + myObject2d.Append(new AIS_Shape(anEdgeCirc_V1)); + myObject2d.Append(new AIS_Shape(anEdgeCirc_V2)); + TopoDS_Vertex anEdgeBSpline_V1, anEdgeBSpline_V2; + TopExp::Vertices(anEdgeBSpline, anEdgeBSpline_V1, anEdgeBSpline_V2); + myObject2d.Append(new AIS_Shape(anEdgeBSpline_V1)); + myObject2d.Append(new AIS_Shape(anEdgeBSpline_V2)); +} + +void TopologySamples::Box3dSample() +{ + // Make a box with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 5.0; + Standard_Real aSizeY = 10.0; + Standard_Real aSizeZ = 15.0; + TopoDS_Shape aBox1 = BRepPrimAPI_MakeBox(aSizeX, aSizeY, aSizeZ); + myResult << "Box at corner [0, 0, 0] and sizes [" + << aSizeX << ", " << aSizeY << ", " << aSizeZ + << "] was created in yellow" << std::endl; + + // Make a box by two points. + gp_Pnt aPnt1(10.0, 0.0, 0.0); + gp_Pnt aPnt2(20.0, 10.0, 15.0); + TopoDS_Shape aBox2 = BRepPrimAPI_MakeBox(aPnt1, aPnt2); + myResult << "Box with corners [" + << aPnt1.X() << ", " << aPnt1.Y() << ", " << aPnt1.Z() + << "] and [" + << aPnt2.X() << ", " << aPnt2.Y() << ", " << aPnt2.Z() + << "] was created in red" << std::endl; + + Handle(AIS_ColoredShape) anAisBox1 = new AIS_ColoredShape(aBox1); + Handle(AIS_ColoredShape) anAisBox2 = new AIS_ColoredShape(aBox2); + anAisBox1->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisBox2->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisBox1); + myObject3d.Append(anAisBox2); +} + +void TopologySamples::Cylinder3dSample() +{ + // Make a cylinder of the specified radius and length. + Standard_Real aRadius1 = 5.0; + Standard_Real aLength1 = 15.0; + TopoDS_Shape aCyl1 = BRepPrimAPI_MakeCylinder(aRadius1, aLength1); + myResult << "Cylinder with Radius = " << aRadius1 + << " and Length = " << aLength1 + << " was created in yellow" << std::endl; + + // Make a cylinder of the specified radius, length and sector angle. + Standard_Real aRadius2 = 8.0; + Standard_Real aLength2 = 25.0; + Standard_Real anAngle = M_PI_2; + TopoDS_Shape aCyl2 = BRepPrimAPI_MakeCylinder(aRadius2, aLength2, anAngle); + myResult << "Cylinder with Radius = " << aRadius2 + << " , Length = " << aLength2 + << " and Angle = " << anAngle + << " was created in red" << std::endl; + + Handle(AIS_ColoredShape) anAisCyl1 = new AIS_ColoredShape(aCyl1); + Handle(AIS_ColoredShape) anAisCyl2 = new AIS_ColoredShape(aCyl2); + anAisCyl1->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisCyl2->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisCyl1); + myObject3d.Append(anAisCyl2); +} + +void TopologySamples::Revolution3dSample() +{ + // Make a toroidal face by a series of shape revolves. + // Make a starting vertex at [-1.0, 0, 0]. + TopoDS_Shape aVertex = BRepBuilderAPI_MakeVertex(gp_Pnt(-1.0, 0.0, 0.0)); + + // Make a circular edge by revolting aVertex around + // an axis Y positioned at [-1.5, 0.0, 0.0] on 2*Pi angle + gp_Ax1 anAxis1(gp_Pnt(-1.5, 0.0, 0.0), gp::DY()); + TopoDS_Shape anEdge = BRepPrimAPI_MakeRevol(aVertex, anAxis1); + myResult << "Circular edge was created in yellow" << std::endl; + + // Make a toroidal face by revolting anEdge around + // Z axis on 2*Pi angle. + TopoDS_Shape aFace = BRepPrimAPI_MakeRevol(anEdge, gp::OZ()); + myResult << "Toroidal face was created in red" << std::endl; + + Handle(AIS_Axis) anAisAxis1 = new AIS_Axis(new Geom_Axis1Placement(anAxis1)); + Handle(AIS_Axis) anAisAxis2 = new AIS_Axis(new Geom_Axis1Placement(gp::OZ())); + Handle(AIS_Shape) anAisVertex = new AIS_Shape(aVertex); + Handle(AIS_ColoredShape) anAisEdge = new AIS_ColoredShape(anEdge); + Handle(AIS_ColoredShape) anAisFace = new AIS_ColoredShape(aFace); + anAisEdge->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + anAisEdge->SetWidth(1.5); + anAisAxis1->SetColor(Quantity_NOC_GREEN); + anAisFace->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisAxis2->SetColor(Quantity_NOC_RED); + myObject3d.Append(anAisVertex); + myObject3d.Append(anAisEdge); + myObject3d.Append(anAisFace); +} + +void TopologySamples::TopologyIterator3dSample() +{ + // Make a compound shape. + TopoDS_Compound aComp; + BRep_Builder aBuilder; + aBuilder.MakeCompound(aComp); + // Add shapes to the compound. + aBuilder.Add(aComp, BRepBuilderAPI_MakeVertex(gp::Origin())); + aBuilder.Add(aComp, BRepBuilderAPI_MakeEdge(gp_Pnt(5.0, 0.0, 0.0), gp_Pnt(10.0, 0.0, 0.0))); + aBuilder.Add(aComp, BRepBuilderAPI_MakeFace(gp_Sphere(gp::XOY(), 10.0))); + aBuilder.Add(aComp, BRepBuilderAPI_MakeWire( + BRepBuilderAPI_MakeEdge(gp_Pnt(15.0, 0.0, 0.0), gp_Pnt(20.0, 0.0, 0.0)), + BRepBuilderAPI_MakeEdge(gp_Pnt(20.0, 0.0, 0.0), gp_Pnt(25.0, 10.0, 5.0)) + )); + aBuilder.Add(aComp, BRepPrimAPI_MakeBox(5.0, 6.0, 7.0).Shell()); + aBuilder.Add(aComp, BRepPrimAPI_MakeBox(5.0, 6.0, 7.0).Solid()); + TopoDS_Compound aComp1; + aBuilder.MakeCompound(aComp1); + aBuilder.Add(aComp, aComp1); + + // Iterate over compound components. + myResult << "Compound components:" << std::endl; + Standard_Integer anI = 1; + for (TopoDS_Iterator anIt(aComp); anIt.More(); anIt.Next(), ++anI) + { + const TopoDS_Shape& aShape = anIt.Value(); + myResult << "#" << anI << " : "; + Handle(AIS_ColoredShape) anAisShape; + switch (aShape.ShapeType()) + { + case TopAbs_VERTEX: + myResult << "TopAbs_VERTEX"; + anAisShape = new AIS_ColoredShape(aShape); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + break; + case TopAbs_EDGE: + anAisShape = new AIS_ColoredShape(aShape); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myResult << "TopAbs_EDGE"; + break; + case TopAbs_WIRE: + myResult << "TopAbs_WIRE"; + break; + case TopAbs_FACE: + anAisShape = new AIS_ColoredShape(aShape); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_RED)); + myResult << "TopAbs_FACE"; + break; + case TopAbs_SHELL: + myResult << "TopAbs_SHELL"; + break; + case TopAbs_SOLID: + myResult << "TopAbs_SOLID"; + break; + case TopAbs_COMPOUND: + myResult << "TopAbs_COMPOUND"; + break; + case TopAbs_COMPSOLID: + myResult << "TopAbs_COMPSOLID"; + break; + case TopAbs_SHAPE: + myResult << "TopAbs_SHAPE"; + break; + } + myResult << std::endl; + if (anAisShape) + { + myObject3d.Append(anAisShape); + } + } +} + +void TopologySamples::TopologyExplorer3dSample() +{ + // Make a box with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 5.0; + Standard_Real aSizeY = 10.0; + Standard_Real aSizeZ = 15.0; + TopoDS_Shape aBox = BRepPrimAPI_MakeBox(aSizeX, aSizeY, aSizeZ); + + // Explore vertex references. + myResult << "Vertex refs. : "; + Standard_Integer nbVertices = 0; + for (TopExp_Explorer anExp(aBox, TopAbs_VERTEX); anExp.More(); anExp.Next(), ++nbVertices) + { + const TopoDS_Shape& aShape = anExp.Current(); + Handle(AIS_ColoredShape) anAisShape = new AIS_ColoredShape(aShape); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + myObject3d.Append(anAisShape); + } + myResult << nbVertices << std::endl; + + // Explore edge references. + myResult << "Edge refs. : "; + Standard_Integer nbEdges = 0; + for (TopExp_Explorer anExp(aBox, TopAbs_EDGE); anExp.More(); anExp.Next(), ++nbEdges) + { + const TopoDS_Shape& aShape = anExp.Current(); + Handle(AIS_ColoredShape) anAisShape = new AIS_ColoredShape(aShape); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + anAisShape->SetWidth(2.5); + myObject3d.Append(anAisShape); + } + myResult << nbEdges << std::endl; + + // Explore face references. + myResult << "Face refs. : "; + Standard_Integer nbFaces = 0; + for (TopExp_Explorer anExp(aBox, TopAbs_FACE); anExp.More(); anExp.Next(), ++nbFaces) + { + const TopoDS_Shape& aShape = anExp.Current(); + Handle(AIS_ColoredShape) anAisShape = new AIS_ColoredShape(aShape); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + anAisShape->SetWidth(2.5); + myObject3d.Append(anAisShape); + } + myResult << nbFaces << std::endl; + + // Explore shell references. + myResult << "Wire refs. : "; + Standard_Integer nbWires = 0; + for (TopExp_Explorer anExp(aBox, TopAbs_WIRE); anExp.More(); anExp.Next(), ++nbWires) + { + } + myResult << nbWires << std::endl; + + // Explore shell references. + myResult << "Shell refs. : "; + Standard_Integer nbShells = 0; + for (TopExp_Explorer anExp(aBox, TopAbs_SHELL); anExp.More(); anExp.Next(), ++nbShells) + { + } + myResult << nbShells << std::endl; + + // Explore solid references. + myResult << "Solid refs. : "; + Standard_Integer nbSolids = 0; + for (TopExp_Explorer anExp(aBox, TopAbs_SOLID); anExp.More(); anExp.Next(), ++nbSolids) + { + } + myResult << nbSolids << std::endl; +} + +void TopologySamples::AssessToCurve3dSample() +{ + // Make a face from a sphere. + gp_Sphere aSphere(gp::XOY(), 1.0); + TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aSphere); + myResult << "TopoDS_Face on the sphere with" << std::endl + << "the center at [ " + << aSphere.Location().X() << ", " << aSphere.Location().Y() << ", " << aSphere.Location().Z() + << " ] and R = " << aSphere.Radius() << " was created in yellow" << std::endl + << std::endl; + + Handle(AIS_ColoredShape) anAisFace = new AIS_ColoredShape(aFace); + anAisFace->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + myObject3d.Append(anAisFace); + + // Retrieve the first not degenerated edge. + TopoDS_Edge aCurveEdge; + for (TopExp_Explorer anExp(aFace, TopAbs_EDGE); anExp.More(); anExp.Next()) + { + TopoDS_Edge anEdge = TopoDS::Edge(anExp.Current()); + if (!BRep_Tool::Degenerated(anEdge)) + { + aCurveEdge = anEdge; + break; + } + } + if (!aCurveEdge.IsNull()) + { + // Make a curve on edge adaptor. + BRepAdaptor_Curve aCurveAdaptor(aCurveEdge); + myResult << "Curve adaptor for edge was built in red" << std::endl; + + Handle(AIS_ColoredShape) anAisCurveEdge = new AIS_ColoredShape(aCurveEdge); + anAisCurveEdge->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisCurveEdge->SetWidth(1.5); + myObject3d.Append(anAisCurveEdge); + + // Use the curve adaptor for some calculations, e.g. compute + // a set of points using GCPnts_QuasiUniformDeflection algo. + Standard_Real aDeflection = 0.1; + GCPnts_QuasiUniformDeflection anAlgo(aCurveAdaptor, aDeflection); + Standard_ASSERT_VOID(anAlgo.IsDone(), "Success is expected!"); + myResult << "Distribution of point on the curve with " << aDeflection + << " deflection was performed:" << std::endl; + for (Standard_Integer i = 1; i <= anAlgo.NbPoints(); ++i) + { + gp_Pnt aPnt = anAlgo.Value(i); + myResult << "Point #" << i << " : [ " + << aPnt.X() << ", " << aPnt.Y() << ", " << aPnt.Z() << " ]" << std::endl; + Handle(AIS_Point) anAisPnt = new AIS_Point(new Geom_CartesianPoint(aPnt)); + myObject3d.Append(anAisPnt); + } + } +} + +void TopologySamples::AssessToCompositeCurve3dSample() +{ + // Make a wire containing two BSpline curves. + // Define points. + gp_Pnt aPole1(0.0, 0.0, 10.0); + gp_Pnt aPole2(5.0, 5.0, 5.0); + gp_Pnt aPole3(10.0, 10.0, 15.0); + gp_Pnt aPole4(15.0, 5.0, 20.0); + gp_Pnt aPole5(25.0, 15.0, 20.0); + gp_Pnt aPole6(35.0, 15.0, 15.0); + gp_Pnt aPole7(45.0, 25.0, 10.0); + // Add points to the curve poles array. + TColgp_Array1OfPnt aPoles1(1, 4), aPoles2(1, 4); + aPoles1.SetValue(1, aPole1); + aPoles1.SetValue(2, aPole2); + aPoles1.SetValue(3, aPole3); + aPoles1.SetValue(4, aPole4); + aPoles2.SetValue(1, aPole4); + aPoles2.SetValue(2, aPole5); + aPoles2.SetValue(3, aPole6); + aPoles2.SetValue(4, aPole7); + // Make a BSpline curves from the point arrays + Handle(Geom_BSplineCurve) aBSplineCurve1 = GeomAPI_PointsToBSpline(aPoles1).Curve(); + Handle(Geom_BSplineCurve) aBSplineCurve2 = GeomAPI_PointsToBSpline(aPoles2).Curve(); + // Make edges + TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(aBSplineCurve1); + TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(aBSplineCurve2); + // Make a wire + BRepBuilderAPI_MakeWire aMakeWire; + aMakeWire.Add(anEdge1); + aMakeWire.Add(anEdge2); + Standard_ASSERT_VOID(aMakeWire.IsDone(), "Added edge isn't connectible!"); + TopoDS_Wire aWire = aMakeWire.Wire(); + myResult << "Wire of two BSpline curves was created" << std::endl; + + Handle(AIS_ColoredShape) anAisWire = new AIS_ColoredShape(aWire); + myObject3d.Append(anAisWire); + + // Make an adaptor. + BRepAdaptor_CompCurve aCurveAdaptor(aWire); + + // Use the curve adaptor for some calculations, e.g. compute + // a set of points using GCPnts_QuasiUniformDeflection algo. + Standard_Real aDeflection = 0.5; + GCPnts_QuasiUniformDeflection anAlgo(aCurveAdaptor, aDeflection); + Standard_ASSERT_VOID(anAlgo.IsDone(), "Success is expected!"); + myResult << "Distribution of point on the curve with " << aDeflection + << " deflection was performed:" << std::endl; + for (Standard_Integer i = 1; i <= anAlgo.NbPoints(); ++i) + { + gp_Pnt aPnt = anAlgo.Value(i); + myResult << "Point #" << i << " : [ " + << aPnt.X() << ", " << aPnt.Y() << ", " << aPnt.Z() << " ]" << std::endl; + Handle(AIS_Point) anAisPnt = new AIS_Point(new Geom_CartesianPoint(aPnt)); + myObject3d.Append(anAisPnt); + } +} + +void TopologySamples::AssessToSurface3dSample() +{ + // Make a face from a sphere. + gp_Sphere aSphere(gp::XOY(), 4.0); + TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aSphere); + myResult << "TopoDS_Face on the sphere with" << std::endl + << "the center at [ " + << aSphere.Location().X() << ", " << aSphere.Location().Y() << ", " << aSphere.Location().Z() + << " ] and R = " << aSphere.Radius() << " was created in yellow" << std::endl + << std::endl; + + // Make a surface adaptor. + BRepAdaptor_Surface aSurfAdaptor(aFace); + + // Use the surface adaptor for some calculations, e.g. compute + // a normal vector at a surface point. + Standard_Real anU = 0.0, aV = 0.0; + gp_Pnt aPnt; + gp_Vec aDU, aDV; + aSurfAdaptor.D1(anU, aV, aPnt, aDU, aDV); + gp_Vec aNorm = aDU.Crossed(aDV); + Standard_ASSERT_VOID(aNorm.Magnitude() > Precision::Confusion(), "Non zero vector is expected!"); + aNorm.Normalize(); + myResult << "Normal vector at ( " << anU << ", " << aV << " )" << std::endl + << " = " << aNorm.X() << ", " << aNorm.Y() << ", " << aNorm.Z() << " ] is in red" << std::endl; + + Handle(AIS_ColoredShape) anAisFace = new AIS_ColoredShape(aFace); + anAisFace->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + Handle(AIS_Point) anAisPnt = new AIS_Point(new Geom_CartesianPoint(aPnt)); + Handle(AIS_ColoredShape) anAisNorm = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aPnt, aPnt.XYZ() + aNorm.XYZ())); + myObject3d.Append(anAisFace); + myObject3d.Append(anAisNorm); + myObject3d.Append(anAisPnt); +} + +void TopologySamples::Common3dSample() +{ + // Make a box #1 with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 10.0; + Standard_Real aSizeY = 15.0; + Standard_Real aSizeZ = 20.0; + TopoDS_Shape aShape1 = BRepPrimAPI_MakeBox(aSizeX, aSizeY, aSizeZ); + myResult << "Box at corner [0, 0, 0] and sizes [" + << aSizeX << ", " << aSizeY << ", " << aSizeZ + << "] was created in yellow wireframe" << std::endl; + + // Make a box #2 by two points. + gp_Pnt aPnt1(5.0, 7.5, 10.0); + gp_Pnt aPnt2(20.0, 25.0, 30.0); + TopoDS_Shape aShape2 = BRepPrimAPI_MakeBox(aPnt1, aPnt2); + myResult << "Box with corners [" + << aPnt1.X() << ", " << aPnt1.Y() << ", " << aPnt1.Z() + << "] and [" + << aPnt2.X() << ", " << aPnt2.Y() << ", " << aPnt2.Z() + << "] was created in green wirefreme" << std::endl; + + // Create a boolean algo. + BRepAlgoAPI_Common anAlgo(aShape1, aShape2); + + // Make operation. + anAlgo.Build(); + + if (!anAlgo.IsDone()) // Process errors + { + myResult << "Errors : " << std::endl; + anAlgo.DumpErrors(myResult); + } + if (anAlgo.HasWarnings()) // Process warnings + { + myResult << "Warnings : " << std::endl; + anAlgo.DumpErrors(myResult); + } + + if (anAlgo.IsDone()) + { + // Get result. + TopoDS_Shape aResultShape = anAlgo.Shape(); + myResult << "Result shape was created in red shading" << std::endl; + + Handle(AIS_ColoredShape) anAisShape1 = new AIS_ColoredShape(aShape1); + Handle(AIS_ColoredShape) anAisShape2 = new AIS_ColoredShape(aShape2); + anAisShape1->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisShape2->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + Handle(AIS_ColoredShape) anAisResult = new AIS_ColoredShape(aResultShape); + anAisResult->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisShape1); + myObject3d.Append(anAisShape2); + myObject3d.Append(anAisResult); + myContext->SetDisplayMode(anAisShape1, 0, Standard_True); + myContext->SetDisplayMode(anAisShape2, 0, Standard_True); + myContext->SetDisplayMode(anAisResult, 1, Standard_True); + } +} + +void TopologySamples::Cut3dSample() +{ + // Make a box #1 with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 10.0; + Standard_Real aSizeY = 15.0; + Standard_Real aSizeZ = 20.0; + TopoDS_Shape aShape1 = BRepPrimAPI_MakeBox(aSizeX, aSizeY, aSizeZ); + myResult << "Box at corner [0, 0, 0] and sizes [" + << aSizeX << ", " << aSizeY << ", " << aSizeZ + << "] was created in yellow wireframe" << std::endl; + + // Make a box #2 by two points as a cutting tool. + gp_Pnt aPnt1(5.0, 7.5, 10.0); + gp_Pnt aPnt2(20.0, 25.0, 30.0); + TopoDS_Shape aShape2 = BRepPrimAPI_MakeBox(aPnt1, aPnt2); + myResult << "Box with corners [" + << aPnt1.X() << ", " << aPnt1.Y() << ", " << aPnt1.Z() + << "] and [" + << aPnt2.X() << ", " << aPnt2.Y() << ", " << aPnt2.Z() + << "] was created in green wireframe" << std::endl; + + // Create a boolean algo. + BRepAlgoAPI_Cut anAlgo(aShape1, aShape2); + + // Make operation. + anAlgo.Build(); + + if (!anAlgo.IsDone()) // Process errors + { + myResult << "Errors : " << std::endl; + anAlgo.DumpErrors(myResult); + } + if (anAlgo.HasWarnings()) // Process warnings + { + myResult << "Warnings : " << std::endl; + anAlgo.DumpErrors(myResult); + } + + if (anAlgo.IsDone()) + { + // Get result. + TopoDS_Shape aResultShape = anAlgo.Shape(); + myResult << "Result shape was created in red shading" << std::endl; + Handle(AIS_ColoredShape) anAisShape1 = new AIS_ColoredShape(aShape1); + Handle(AIS_ColoredShape) anAisShape2 = new AIS_ColoredShape(aShape2); + anAisShape1->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisShape2->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + Handle(AIS_ColoredShape) anAisResult = new AIS_ColoredShape(aResultShape); + anAisResult->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisShape1); + myObject3d.Append(anAisShape2); + myObject3d.Append(anAisResult); + myContext->SetDisplayMode(anAisShape1, 0, Standard_True); + myContext->SetDisplayMode(anAisShape2, 0, Standard_True); + myContext->SetDisplayMode(anAisResult, 1, Standard_True); + } +} + +void TopologySamples::Fuse3dSample() +{ + // Make a box #1 with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 10.0; + Standard_Real aSizeY = 15.0; + Standard_Real aSizeZ = 20.0; + TopoDS_Shape aShape1 = BRepPrimAPI_MakeBox(aSizeX, aSizeY, aSizeZ); + myResult << "Box at corner [0, 0, 0] and sizes [" + << aSizeX << ", " << aSizeY << ", " << aSizeZ + << "] was created in yellow wireframe" << std::endl; + + // Make a box #2 by two points. + gp_Pnt aPnt1(5.0, 7.5, 10.0); + gp_Pnt aPnt2(20.0, 25.0, 30.0); + TopoDS_Shape aShape2 = BRepPrimAPI_MakeBox(aPnt1, aPnt2); + myResult << "Box with corners [" + << aPnt1.X() << ", " << aPnt1.Y() << ", " << aPnt1.Z() + << "] and [" + << aPnt2.X() << ", " << aPnt2.Y() << ", " << aPnt2.Z() + << "] was created in green wireframe" << std::endl; + + // Create a boolean algo. + BRepAlgoAPI_Fuse anAlgo(aShape1, aShape2); + + // Make operation. + anAlgo.Build(); + + if (!anAlgo.IsDone()) // Process errors + { + myResult << "Errors : " << std::endl; + anAlgo.DumpErrors(myResult); + } + if (anAlgo.HasWarnings()) // Process warnings + { + myResult << "Warnings : " << std::endl; + anAlgo.DumpErrors(myResult); + } + + if (anAlgo.IsDone()) + { + // Get result. + TopoDS_Shape aResultShape = anAlgo.Shape(); + myResult << "Result shape was created in red shading" << std::endl; + Handle(AIS_ColoredShape) anAisShape1 = new AIS_ColoredShape(aShape1); + Handle(AIS_ColoredShape) anAisShape2 = new AIS_ColoredShape(aShape2); + anAisShape1->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisShape2->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + Handle(AIS_ColoredShape) anAisResult = new AIS_ColoredShape(aResultShape); + anAisResult->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisShape1); + myObject3d.Append(anAisShape2); + myObject3d.Append(anAisResult); + myContext->SetDisplayMode(anAisShape1, 0, Standard_True); + myContext->SetDisplayMode(anAisShape2, 0, Standard_True); + myContext->SetDisplayMode(anAisResult, 1, Standard_True); + } +} + +void TopologySamples::Section3dSample() +{ + // Make a box #1 with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 10.0; + Standard_Real aSizeY = 15.0; + Standard_Real aSizeZ = 20.0; + TopoDS_Shape aShape = BRepPrimAPI_MakeBox(aSizeX, aSizeY, aSizeZ); + myResult << "Box at corner [0, 0, 0] and sizes [" + << aSizeX << ", " << aSizeY << ", " << aSizeZ + << "] was created in yellow wireframe" << std::endl; + + // Create a boolean algo. + // Make a section by a plane. + gp_Pln aPln(gp_Pnt(aSizeX / 2.0, aSizeY / 2.0, aSizeZ / 2.0), gp::DZ()); + BRepAlgoAPI_Section anAlgo(aShape, aPln, Standard_False); + + // Make operation. + anAlgo.Build(); + + if (!anAlgo.IsDone()) // Process errors + { + myResult << "Errors : " << std::endl; + anAlgo.DumpErrors(myResult); + } + if (anAlgo.HasWarnings()) // Process warnings + { + myResult << "Warnings : " << std::endl; + anAlgo.DumpErrors(myResult); + } + + if (anAlgo.IsDone()) + { + // Get result. + TopoDS_Shape aResultShape = anAlgo.Shape(); + myResult << "Result shape was created in red" << std::endl; + Handle(AIS_ColoredShape) anAisShape = new AIS_ColoredShape(aShape); + Handle(AIS_Plane) anAisPlane = new AIS_Plane(new Geom_Plane(aPln)); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + Handle(AIS_ColoredShape) anAisResult = new AIS_ColoredShape(aResultShape); + anAisResult->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisShape); + myObject3d.Append(anAisPlane); + myObject3d.Append(anAisResult); + myContext->SetDisplayMode(anAisShape, 0, Standard_True); + } +} + +void TopologySamples::Splitter3dSample() +{ + // Make a box by two points. + gp_Pnt aPnt1(-5.0, -7.5, -10.0); + gp_Pnt aPnt2(10.0, 15.0, 10.0); + TopoDS_Shape aBox = BRepPrimAPI_MakeBox(aPnt1, aPnt2); + myResult << "Box with corners [" + << aPnt1.X() << ", " << aPnt1.Y() << ", " << aPnt1.Z() + << "] and [" + << aPnt2.X() << ", " << aPnt2.Y() << ", " << aPnt2.Z() + << "] was created in yellow" << std::endl; + + // Make a splitting tool as XY plane. + TopoDS_Shape aTool = BRepBuilderAPI_MakeFace(gp_Pln(gp::XOY())); + + // Create a splitter algo. + BRepAlgoAPI_Splitter aSplitter; + + // Add shapes to be split. + TopTools_ListOfShape anArguments; + anArguments.Append(aBox); + aSplitter.SetArguments(anArguments); + + // Add tool shapes. + TopTools_ListOfShape aTools; + aTools.Append(aTool); + aSplitter.SetTools(aTools); + + // Perform splitting. + aSplitter.Build(); + + if (!aSplitter.IsDone()) // Process errors + { + myResult << "Errors : " << std::endl; + aSplitter.DumpErrors(myResult); + } + if (aSplitter.HasWarnings()) // Process warnings + { + myResult << "Warnings : " << std::endl; + aSplitter.DumpErrors(myResult); + } + + Handle(AIS_ColoredShape) anAisBox = new AIS_ColoredShape(aBox); + anAisBox->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + myObject3d.Append(anAisBox); + + if (aSplitter.IsDone()) // Process results + { + // Simplification of the result shape is performed by the means of + // ShapeUpgrade_UnifySameDomain algorithm. The result of the operation will + // be overwritten with the simplified result. + // The simplification is performed without creation of the Internal shapes, + // i.e. shapes connections will never be broken. + // Simplification is performed on the whole result shape. Thus, if the input + // shapes contained connected tangent edges or faces unmodified during the operation + // they will also be unified. + aSplitter.SimplifyResult(); + + // Get result of splitting. + TopoDS_Shape aResult = aSplitter.Shape(); + myResult << "Splitting result (shapes are moved apart for illustativeness) is in red" << std::endl; + + // In this particular sample two shapes in the result are expected. + // Lets move apart them for illustrative purposes. + TopoDS_Iterator anIt(aResult); + Standard_ASSERT_VOID(anIt.More(), "Not empty result is expected!"); + TopoDS_Shape aBox1 = anIt.Value(); anIt.Next(); + Standard_ASSERT_VOID(anIt.More(), "Two shapes in the result are expected!"); + TopoDS_Shape aBox2 = anIt.Value(); + gp_Trsf aTrsf1; aTrsf1.SetTranslation(gp_Vec(0.0, 0.0, -15.0)); + aBox1.Move(aTrsf1); + gp_Trsf aTrsf2; aTrsf2.SetTranslation(gp_Vec(0.0, 0.0, +15.0)); + aBox2.Move(aTrsf2); + + Handle(AIS_ColoredShape) anAisBox1 = new AIS_ColoredShape(aBox1); + Handle(AIS_ColoredShape) anAisBox2 = new AIS_ColoredShape(aBox2); + anAisBox1->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisBox2->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisBox1); + myObject3d.Append(anAisBox2); + } +} + +void TopologySamples::Defeaturing3dSample() +{ + // Prepare a box with a chamfer. + // Make a box with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 8.0; + Standard_Real aSizeY = 10.0; + Standard_Real aSizeZ = 15.0; + TopoDS_Shape aBox = BRepPrimAPI_MakeBox(aSizeX, aSizeY, aSizeZ); + // Initialize chamfer algo. + BRepFilletAPI_MakeChamfer anAlgo(aBox); + // Set edge to apply a chamfer with specified distance from it. + // Select the 5th edge in the map returned by TopExp::MapShapes method. + TopTools_IndexedMapOfShape anEdges; + TopExp::MapShapes(aBox, TopAbs_EDGE, anEdges); + TopoDS_Edge anEdge = TopoDS::Edge(anEdges.FindKey(5)); + Standard_Real aDist = 4.0; + anAlgo.Add(aDist, anEdge); + // Make a chamfer. + anAlgo.Build(); + Standard_ASSERT_VOID(anAlgo.IsDone(), "Couldn't prepare a box with a chamfer!"); + // Get a box with a chamfer. + TopoDS_Shape aBoxWithChamfer = anAlgo.Shape(); + myResult << "Box with a chamfer is in yellow shading" << std::endl; + + Handle(AIS_ColoredShape) anAisBoxWithChamfer = new AIS_ColoredShape(aBoxWithChamfer); + anAisBoxWithChamfer->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + myObject3d.Append(anAisBoxWithChamfer); + myContext->SetDisplayMode(anAisBoxWithChamfer, 1, Standard_True); + + // Retrieve chamfer faces generated from the edge + const TopTools_ListOfShape& aGenShapes = anAlgo.Generated(anEdge); + Standard_ASSERT_VOID(!aGenShapes.IsEmpty(), "Chamfer face is expected!"); + for (TopTools_ListOfShape::Iterator anIt(aGenShapes); anIt.More(); anIt.Next()) + { + Handle(AIS_ColoredShape) anAisShape = new AIS_ColoredShape(anIt.Value()); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + anAisShape->SetWidth(2.5); + myObject3d.Append(anAisShape); + myContext->SetDisplayMode(anAisBoxWithChamfer, 1, Standard_True); + } + myResult << "Chamfer faces : " << aGenShapes.Size() << std::endl; + myResult << "The first one is using to remove" << std::endl; + myResult << "The removed face is in green" << std::endl; + + // Initialize defeaturing algo. + BRepAlgoAPI_Defeaturing aDefeatAlgo; + aDefeatAlgo.SetShape(aBoxWithChamfer); + aDefeatAlgo.AddFaceToRemove(aGenShapes.First()); + + // Remove the chamfer. + aDefeatAlgo.Build(); + + if (aDefeatAlgo.IsDone()) + { + // Get result. + TopoDS_Shape aResult = aDefeatAlgo.Shape(); + myResult << "Defeatured box is in red wireframe" << std::endl; + + Handle(AIS_ColoredShape) anAisResult = new AIS_ColoredShape(aResult); + anAisResult->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisResult); + myContext->SetDisplayMode(anAisResult, 0, Standard_True); + } +} + +void TopologySamples::Fillet3dSample() +{ + // Make a box with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 8.0; + Standard_Real aSizeY = 10.0; + Standard_Real aSizeZ = 15.0; + TopoDS_Shape aBox = BRepPrimAPI_MakeBox(aSizeX, aSizeY, aSizeZ); + myResult << "Box at corner [0, 0, 0] and sizes [" + << aSizeX << ", " << aSizeY << ", " << aSizeZ + << "] was created in yellow wireframe" << std::endl; + + // Initialize fillet algo. + BRepFilletAPI_MakeFillet anAlgo(aBox); + + // Set edge to apply a fillet with specified radius. + // Select the first edge in the map returned by TopExp::MapShapes method. + TopTools_IndexedMapOfShape anEdges; + TopExp::MapShapes(aBox, TopAbs_EDGE, anEdges); + TopoDS_Edge anEdge = TopoDS::Edge(anEdges.FindKey(1)); + Standard_Real aRadius = 3.0; + anAlgo.Add(aRadius, anEdge); + myResult << "Make a fillet of " << aRadius << " radius on an edge in green" << std::endl; + + Handle(AIS_ColoredShape) anAisBox = new AIS_ColoredShape(aBox); + Handle(AIS_ColoredShape) anAisEdge = new AIS_ColoredShape(anEdge); + anAisBox->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisEdge->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + anAisEdge->SetWidth(2.5); + myObject3d.Append(anAisBox); + myObject3d.Append(anAisEdge); + myContext->SetDisplayMode(anAisBox, 0, Standard_True); + + // Make a fillet. + anAlgo.Build(); + + if (anAlgo.IsDone()) + { + // Get result. + TopoDS_Shape aResult = anAlgo.Shape(); + myResult << "Fillet was built. Result shape is in red shading" << std::endl; + + Handle(AIS_ColoredShape) anAisResult = new AIS_ColoredShape(aResult); + anAisResult->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisResult); + myContext->SetDisplayMode(anAisResult, 1, Standard_True); + } +} + +void TopologySamples::Chamfer3dSample() +{ + // Make a box with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 8.0; + Standard_Real aSizeY = 10.0; + Standard_Real aSizeZ = 15.0; + TopoDS_Shape aBox = BRepPrimAPI_MakeBox(aSizeX, aSizeY, aSizeZ); + myResult << "Box at corner [0, 0, 0] and sizes [" + << aSizeX << ", " << aSizeY << ", " << aSizeZ + << "] was created in yellow wirewrame" << std::endl; + + // Initialize chamfer algo. + BRepFilletAPI_MakeChamfer anAlgo(aBox); + + // Set edge to apply a chamfer with specified distance from it. + // Select the 5th edge in the map returned by TopExp::MapShapes method. + TopTools_IndexedMapOfShape anEdges; + TopExp::MapShapes(aBox, TopAbs_EDGE, anEdges); + TopoDS_Edge anEdge = TopoDS::Edge(anEdges.FindKey(5)); + Standard_Real aDist = 4.0; + anAlgo.Add(aDist, anEdge); + myResult << "Make a chamfer of " << aDist << " size on an edge in green" << std::endl; + + Handle(AIS_ColoredShape) anAisBox = new AIS_ColoredShape(aBox); + Handle(AIS_ColoredShape) anAisEdge = new AIS_ColoredShape(anEdge); + anAisBox->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisEdge->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + anAisEdge->SetWidth(2.5); + myObject3d.Append(anAisBox); + myObject3d.Append(anAisEdge); + myContext->SetDisplayMode(anAisBox, 0, Standard_True); + + // Make a chamfer. + anAlgo.Build(); + if (anAlgo.IsDone()) + { + // Get result. + TopoDS_Shape aResult = anAlgo.Shape(); + myResult << "Fillet was built. Result shape is in red shading" << std::endl; + + Handle(AIS_ColoredShape) anAisResult = new AIS_ColoredShape(aResult); + anAisResult->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisResult); + myContext->SetDisplayMode(anAisResult, 1, Standard_True); + + const TopTools_ListOfShape& aGenShapes = anAlgo.Generated(anEdge); + for (TopTools_ListOfShape::Iterator anIt(aGenShapes); anIt.More(); anIt.Next()) + { + Handle(AIS_ColoredShape) anAisShape = new AIS_ColoredShape(anIt.Value()); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_RED)); + anAisShape->SetWidth(2.5); + myObject3d.Append(anAisShape); + } + } +} + +void TopologySamples::Offset3dSample() +{ + // Make a triangle wire. + BRepBuilderAPI_MakePolygon aTria; + TopoDS_Vertex aVertA = BRepBuilderAPI_MakeVertex(gp_Pnt(-0.5, 0.0, 0.0)); + TopoDS_Vertex aVertB = BRepBuilderAPI_MakeVertex(gp_Pnt(0.0, 0.0, +1.0)); + TopoDS_Vertex aVertC = BRepBuilderAPI_MakeVertex(gp_Pnt(+0.5, 0.0, 0.0)); + aTria.Add(aVertA); + aTria.Add(aVertB); + aTria.Add(aVertC); + aTria.Close(); + TopoDS_Wire aWire = aTria.Wire(); + myResult << "Trianglular wire was created in yellow" << std::endl; + + Handle(AIS_ColoredShape) anAisWire = new AIS_ColoredShape(aWire); + anAisWire->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + myObject3d.Append(anAisWire); + + // Initialize offset algo. + BRepOffsetAPI_MakeOffset anAlgo(aWire); + + // Perform a series of offsets with linearly increasing value and altitude. + Standard_Real anOffsetStep = 0.2; + Standard_Real anAltitudeStep = 0.1; + for (Standard_Integer i = 1; i <= 4; ++i) + { + Standard_Real anOffset = anOffsetStep * i; + Standard_Real anAltitude = anAltitudeStep * i; + anAlgo.Perform(anOffset, anAltitude); + if (anAlgo.IsDone()) + { + // Get result. + TopoDS_Shape aResult = anAlgo.Shape(); + myResult << "#" << i << " : Offest = " << anOffset << " Altitude = " << anAltitude + << ". Result is in red." << std::endl; + + Handle(AIS_ColoredShape) anAisResult = new AIS_ColoredShape(aResult); + anAisResult->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisResult); + } + } +} + +void TopologySamples::Evolved3dSample() +{ + // Make a triangle wire as a spine. + BRepBuilderAPI_MakePolygon aTria; + TopoDS_Vertex aVertA = BRepBuilderAPI_MakeVertex(gp_Pnt(-0.5, 0.0, 0.0)); + TopoDS_Vertex aVertB = BRepBuilderAPI_MakeVertex(gp_Pnt(0.0, +1.0, 0.0)); + TopoDS_Vertex aVertC = BRepBuilderAPI_MakeVertex(gp_Pnt(+0.5, 0.0, 0.0)); + aTria.Add(aVertA); + aTria.Add(aVertB); + aTria.Add(aVertC); + aTria.Close(); + TopoDS_Wire aSpine = aTria.Wire(); + myResult << "Profile wire was created in yellow" << std::endl; + + // Make a wire as a profile. + BRepBuilderAPI_MakePolygon aPoly; + TopoDS_Vertex aVert1 = BRepBuilderAPI_MakeVertex(gp_Pnt(-0.5, 0.0, 0.0)); + TopoDS_Vertex aVert2 = BRepBuilderAPI_MakeVertex(gp_Pnt(-0.5, -0.1, 0.5)); + TopoDS_Vertex aVert3 = BRepBuilderAPI_MakeVertex(gp_Pnt(-0.5, -0.2, 1.0)); + aPoly.Add(aVert1); + aPoly.Add(aVert2); + aPoly.Add(aVert3); + TopoDS_Wire aProfile = aPoly.Wire(); + myResult << "Spine wire was created in greed" << std::endl; + + Handle(AIS_ColoredShape) anAisSpine = new AIS_ColoredShape(aSpine); + Handle(AIS_ColoredShape) anAisProfile = new AIS_ColoredShape(aProfile); + anAisSpine->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisSpine->SetWidth(2.5); + anAisProfile->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + anAisProfile->SetWidth(2.5); + myObject3d.Append(anAisSpine); + myObject3d.Append(anAisProfile); + + // Initialize evolving algo. + GeomAbs_JoinType aJoinType = GeomAbs_Arc; + Standard_Boolean aIsGlobalCS = Standard_False; + Standard_Boolean aIsSolid = Standard_True; + BRepOffsetAPI_MakeEvolved anAlgo(aSpine, aProfile, aJoinType, aIsGlobalCS, aIsSolid); + + // Perform evolving. + anAlgo.Build(); + + if (anAlgo.IsDone()) + { + // Get result. + TopoDS_Shape aResult = anAlgo.Shape(); + myResult << "Evolving result is in red" << std::endl; + + Handle(AIS_ColoredShape) anAisResult = new AIS_ColoredShape(aResult); + anAisResult->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisResult); + } +} + +void TopologySamples::Copy3dSample() +{ + // Make a box with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 10.0; + Standard_Real aSizeY = 15.0; + Standard_Real aSizeZ = 20.0; + BRepPrimAPI_MakeBox aBoxMake(aSizeX, aSizeY, aSizeZ); + TopoDS_Shape aBox = aBoxMake.Shape(); + myResult << "Box at corner [0, 0, 0] and sizes [" + << aSizeX << ", " << aSizeY << ", " << aSizeZ + << "] was created in yellow" << std::endl; + + // Make a box copy. + TopoDS_Shape aBoxCopy = BRepBuilderAPI_Copy(aBox); + myResult << "Box copy was created in red" << std::endl; + + gp_Trsf aTrsf1; aTrsf1.SetTranslation(gp_Vec(15.0, 0.0, 0.0)); + aBoxCopy.Move(aTrsf1); + myResult << "Box copy shape is moved apart for illustativeness" << std::endl; + + Handle(AIS_ColoredShape) anAisBox = new AIS_ColoredShape(aBox); + anAisBox->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisBox->SetWidth(2.5); + Handle(AIS_ColoredShape) anAisBoxCopy = new AIS_ColoredShape(aBoxCopy); + anAisBoxCopy->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisBox); + myObject3d.Append(anAisBoxCopy); +} + +void TopologySamples::Transform3dSample() +{ + // Make a box with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 10.0; + Standard_Real aSizeY = 15.0; + Standard_Real aSizeZ = 20.0; + BRepPrimAPI_MakeBox aBoxMake(aSizeX, aSizeY, aSizeZ); + TopoDS_Shape aBox = aBoxMake.Shape(); + myResult << "Box at corner [0, 0, 0] and sizes [" + << aSizeX << ", " << aSizeY << ", " << aSizeZ + << "] was created in yellow" << std::endl; + + // Move the box. + gp_Trsf aTrMove; aTrMove.SetTranslation(gp_Vec(15.0, 20.0, 25.0)); + TopoDS_Shape aMovedBox = BRepBuilderAPI_Transform(aBox, aTrMove, Standard_True); + myResult << "Moved box in green" << std::endl; + + // Rotate the moved box + gp_Trsf aTrRot; aTrRot.SetRotation(gp_Ax1(gp_Pnt(15.0, 20.0, 25.0), gp::DZ()), 3.0*M_PI_4); + TopoDS_Shape aRotatedBox = BRepBuilderAPI_Transform(aBox, aTrRot, Standard_True); + myResult << "Rotated box in red" << std::endl; + + Handle(AIS_ColoredShape) anAisBox = new AIS_ColoredShape(aBox); + Handle(AIS_ColoredShape) anAisMovedBox = new AIS_ColoredShape(aMovedBox); + Handle(AIS_ColoredShape) anAisRotatedBox = new AIS_ColoredShape(aRotatedBox); + anAisBox->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisMovedBox->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + anAisRotatedBox->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisBox); + myObject3d.Append(anAisMovedBox); + myObject3d.Append(anAisRotatedBox); +} + +void TopologySamples::ConvertToNurbs3dSample() +{ + // Make a torus face. + gp_Torus aTorus(gp::XOY(), 20.0, 7.5); + TopoDS_Shape aTorusFace = BRepBuilderAPI_MakeFace(aTorus); + myResult << "TopoDS_Solid on the torus with" << std::endl + << "R major = " << aTorus.MajorRadius() << std::endl + << "R minor = " << aTorus.MinorRadius() << std::endl + << "was created in yellow" << std::endl; + + // Convert faces/edges from analytic to NURBS geometry. + TopoDS_Shape aNurbsFace = BRepBuilderAPI_NurbsConvert(aTorusFace); + myResult << "Converted torus in red" << std::endl; + gp_Trsf aTrsf1; aTrsf1.SetTranslation(gp_Vec(60.0, 0.0, 0.0)); + aNurbsFace.Move(aTrsf1); + myResult << "Converted torus is moved apart for illustativeness" << std::endl; + + Handle(AIS_ColoredShape) anAisTorus = new AIS_ColoredShape(aTorusFace); + Handle(AIS_ColoredShape) anAisNurbs = new AIS_ColoredShape(aNurbsFace); + anAisTorus->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisTorus->SetWidth(2.5); + anAisNurbs->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisTorus); + myObject3d.Append(anAisNurbs); +} + +void TopologySamples::SewContiguousFaces3dSample() +{ + // Make a sphere. + gp_Sphere aSphere(gp::XOY(), 1.0); + // South hemisphere. + TopoDS_Face aFace1 = BRepBuilderAPI_MakeFace(aSphere, 0.0, 2.0 * M_PI, -M_PI_2, 0.0); + // North hemisphere. + TopoDS_Face aFace2 = BRepBuilderAPI_MakeFace(aSphere, 0.0, 2.0 * M_PI, 0.0, +M_PI_2); + + // Make a default tailor. + BRepBuilderAPI_Sewing aTailor; + + // Add hemisphere faces. + aTailor.Add(aFace1); + aTailor.Add(aFace2); + + // Perform sewing. + aTailor.Perform(); + + // Get result. + const TopoDS_Shape& aSewedSphere = aTailor.SewedShape(); + myResult << "Two hemispheres were sewed : " << aTailor.NbFreeEdges() << " free edges" << std::endl; + + Handle(AIS_ColoredShape) anAisSewedSphere = new AIS_ColoredShape(aSewedSphere); + anAisSewedSphere->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisSewedSphere); +} + +void TopologySamples::CheckValidity3dSample() +{ + // Make a box with a corner at [0, 0, 0] and the specified sizes. + Standard_Real aSizeX = 10.0; + Standard_Real aSizeY = 15.0; + Standard_Real aSizeZ = 20.0; + BRepPrimAPI_MakeBox aBoxMake(aSizeX, aSizeY, aSizeZ); + TopoDS_Shape aBox = aBoxMake.Shape(); + myResult << "Box at corner [0, 0, 0] and sizes [" + << aSizeX << ", " << aSizeY << ", " << aSizeZ + << "] was created in yellow" << std::endl; + + // Analyze the box. + BRepCheck_Analyzer anAnalyzer(aBox); + myResult << "Box is " << (anAnalyzer.IsValid() ? "valid" : "invalid") << std::endl; + + // Make the box invalid manually. + Handle(BRepTools_ReShape) aReShape = new BRepTools_ReShape(); + myResult << "Remove the top face from the box (red)" << std::endl; + aReShape->Remove(aBoxMake.TopFace()); + TopoDS_Shape aBox1 = aReShape->Apply(aBox); + myResult << "The top face was removed" << std::endl; + + // Analyze the modified box. + BRepCheck_Analyzer anAnalyzer1(aBox1); + myResult << "Modified box is " << (anAnalyzer1.IsValid() ? "valid" : "invalid") << std::endl; + + Handle(AIS_ColoredShape) anAisBox = new AIS_ColoredShape(aBox); + Handle(AIS_ColoredShape) anAisTopFace = new AIS_ColoredShape(aBoxMake.TopFace()); + anAisBox->SetColor(Quantity_Color(Quantity_NOC_YELLOW)); + anAisTopFace->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject3d.Append(anAisBox); + myObject3d.Append(anAisTopFace); +} + +void TopologySamples::ComputeLinearProperties3dSample() +{ + // Make an edge from a circular segment. + // Create a circle in XY plane of the radius 1.0. + gp_Circ aCirc(gp::XOY(), 1.0); + // Make a circular edge from the 1st quoter in the parametric space. + TopoDS_Edge aShape = BRepBuilderAPI_MakeEdge(aCirc, 0.0, M_PI); + myResult << "TopoDS_Edge on the circle's 1st quoter" << std::endl + << "with the center at [ " + << aCirc.Location().X() << ", " << aCirc.Location().Y() << ", " << aCirc.Location().Z() + << " ] and R = " << aCirc.Radius() << " was created in red" << std::endl + << std::endl; + + // Retrieve linear properties from the edge. + GProp_GProps aGProps; + BRepGProp::LinearProperties(aShape, aGProps); + Standard_Real aLength = aGProps.Mass(); + gp_Pnt aCOM = aGProps.CentreOfMass(); + Standard_Real anIx, anIy, anIz; + aGProps.StaticMoments(anIx, anIy, anIz); + gp_Mat aMOI = aGProps.MatrixOfInertia(); + myResult << "Linear properties:" << std::endl + << " Length = " << aLength << std::endl + << " Center of mass = [ " << aCOM.X() << ", " << aCOM.Y() << ", " << aCOM.Z() << " ]" << std::endl + << " Static moments = [ " << anIx << ", " << anIy << ", " << anIz << " ]" << std::endl + << " Matrix of inertia = [ " + << aMOI(1, 1) << ", " << aMOI(1, 2) << ", " << aMOI(1, 3) << std::endl + << std::setw(33) << aMOI(2, 1) << ", " << aMOI(2, 2) << ", " << aMOI(2, 3) << std::endl + << std::setw(33) << aMOI(3, 1) << ", " << aMOI(3, 2) << ", " << aMOI(3, 3) << " ]" << std::endl; + GProp_PrincipalProps aPProps = aGProps.PrincipalProperties(); + Standard_Real anIxx, anIyy, anIzz; + aPProps.Moments(anIxx, anIyy, anIzz); + Standard_Real aRxx, aRyy, aRzz; + aPProps.RadiusOfGyration(aRxx, aRyy, aRzz); + myResult << "Principal properties:" << std::endl + << " Has symmetric axis : " << (aPProps.HasSymmetryAxis() ? "YES" : "NO") << std::endl + << " Has symmetric point : " << (aPProps.HasSymmetryPoint() ? "YES" : "NO") << std::endl + << " Moments of inertia = [ " << anIxx << ", " << anIyy << ", " << anIzz << " ]" << std::endl + << " Radius of gyration = [ " << aRxx << ", " << aRyy << ", " << aRzz << " ]" << std::endl; + if (!aPProps.HasSymmetryPoint()) + { + const gp_Vec& anAxis1 = aPProps.FirstAxisOfInertia(); + myResult << " 1st axis of inertia = [ " << anAxis1.X() << ", " << anAxis1.Y() << ", " << anAxis1.Z() << " ]" << std::endl; + Handle(AIS_ColoredShape) anAisAxis1 = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aCOM, aCOM.XYZ() + anAxis1.XYZ())); + anAisAxis1->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisAxis1); + if (!aPProps.HasSymmetryPoint()) + { + const gp_Vec& anAxis2 = aPProps.SecondAxisOfInertia(); + myResult << " 2nd axis of inertia = [ " << anAxis2.X() << ", " << anAxis2.Y() << ", " << anAxis2.Z() << " ]" << std::endl; + Handle(AIS_ColoredShape) anAisAxis2 = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aCOM, aCOM.XYZ() + anAxis2.XYZ())); + anAisAxis2->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisAxis2); + const gp_Vec& anAxis3 = aPProps.ThirdAxisOfInertia(); + myResult << " 3rd axis of inertia = [ " << anAxis3.X() << ", " << anAxis3.Y() << ", " << anAxis3.Z() << " ]" << std::endl; + Handle(AIS_ColoredShape) anAisAxis3 = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aCOM, aCOM.XYZ() + anAxis3.XYZ())); + anAisAxis3->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisAxis3); + } + } + + Handle(AIS_ColoredShape) anAisShape = new AIS_ColoredShape(aShape); + Handle(AIS_Point) anAisCOM = new AIS_Point(new Geom_CartesianPoint(aCOM)); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_RED)); + Handle(AIS_TextLabel) aCOMLabel = new AIS_TextLabel(); + aCOMLabel->SetText("Center of mass"); + aCOMLabel->SetPosition(aCOM); + Handle(AIS_Axis) anAisAxisX = new AIS_Axis(new Geom_Axis2Placement(gp::YOZ()), AIS_TOAX_XAxis); + Handle(AIS_Axis) anAisAxisY = new AIS_Axis(new Geom_Axis2Placement(gp::ZOX()), AIS_TOAX_YAxis); + Handle(AIS_Axis) anAisAxisZ = new AIS_Axis(new Geom_Axis2Placement(gp::XOY()), AIS_TOAX_ZAxis); + myObject3d.Append(anAisAxisX); + myObject3d.Append(anAisAxisY); + myObject3d.Append(anAisAxisZ); + myObject3d.Append(anAisShape); + myObject3d.Append(anAisCOM); + myObject3d.Append(aCOMLabel); +} + +void TopologySamples::ComputeSurfaceProperties3dSample() +{ + // Make a face from a cylinder with R = 1 + // and directed along Z axis + gp_Cylinder aCyl(gp::XOY(), 1.0); + TopoDS_Face aShape = BRepBuilderAPI_MakeFace(aCyl, 0.0, M_PI, -1.0, +1.0).Face(); + myResult << "TopoDS_Face on the cylinder R = " << aCyl.Radius() << std::endl + << "with axis [ " << aCyl.Position().Direction().X() << ", " << aCyl.Position().Direction().Y() << ", " << aCyl.Position().Direction().Z() << " ]" << std::endl + << "limited in length [-1 ... +1] was created in red" << std::endl; + + // Retrieve surface properties from the face. + GProp_GProps aGProps; + BRepGProp::SurfaceProperties(aShape, aGProps); + Standard_Real aArea = aGProps.Mass(); + gp_Pnt aCOM = aGProps.CentreOfMass(); + Standard_Real anIx, anIy, anIz; + aGProps.StaticMoments(anIx, anIy, anIz); + gp_Mat aMOI = aGProps.MatrixOfInertia(); + myResult << "Linear properties:" << std::endl + << " Area = " << aArea << std::endl + << " Center of mass = [ " << aCOM.X() << ", " << aCOM.Y() << ", " << aCOM.Z() << " ]" << std::endl + << " Static moments = [ " << anIx << ", " << anIy << ", " << anIz << " ]" << std::endl + << " Matrix of inertia = [ " + << aMOI(1, 1) << ", " << aMOI(1, 2) << ", " << aMOI(1, 3) << std::endl + << std::setw(33) << aMOI(2, 1) << ", " << aMOI(2, 2) << ", " << aMOI(2, 3) << std::endl + << std::setw(33) << aMOI(3, 1) << ", " << aMOI(3, 2) << ", " << aMOI(3, 3) << " ]" << std::endl; + GProp_PrincipalProps aPProps = aGProps.PrincipalProperties(); + Standard_Real anIxx, anIyy, anIzz; + aPProps.Moments(anIxx, anIyy, anIzz); + Standard_Real aRxx, aRyy, aRzz; + aPProps.RadiusOfGyration(aRxx, aRyy, aRzz); + myResult << "Principal properties:" << std::endl + << " Has symmetric axis : " << (aPProps.HasSymmetryAxis() ? "YES" : "NO") << std::endl + << " Has symmetric point : " << (aPProps.HasSymmetryPoint() ? "YES" : "NO") << std::endl + << " Moments of inertia = [ " << anIxx << ", " << anIyy << ", " << anIzz << " ]" << std::endl + << " Radius of gyration = [ " << aRxx << ", " << aRyy << ", " << aRzz << " ]" << std::endl; + if (!aPProps.HasSymmetryPoint()) + { + const gp_Vec& anAxis1 = aPProps.FirstAxisOfInertia(); + myResult << " 1st axis of inertia = [ " << anAxis1.X() << ", " << anAxis1.Y() << ", " << anAxis1.Z() << " ]" << std::endl; + Handle(AIS_ColoredShape) anAisAxis1 = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aCOM, aCOM.XYZ() + anAxis1.XYZ())); + anAisAxis1->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisAxis1); + if (!aPProps.HasSymmetryPoint()) + { + const gp_Vec& anAxis2 = aPProps.SecondAxisOfInertia(); + myResult << " 2nd axis of inertia = [ " << anAxis2.X() << ", " << anAxis2.Y() << ", " << anAxis2.Z() << " ]" << std::endl; + Handle(AIS_ColoredShape) anAisAxis2 = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aCOM, aCOM.XYZ() + anAxis2.XYZ())); + anAisAxis2->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisAxis2); + const gp_Vec& anAxis3 = aPProps.ThirdAxisOfInertia(); + myResult << " 3rd axis of inertia = [ " << anAxis3.X() << ", " << anAxis3.Y() << ", " << anAxis3.Z() << " ]" << std::endl; + Handle(AIS_ColoredShape) anAisAxis3 = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aCOM, aCOM.XYZ() + anAxis3.XYZ())); + anAisAxis3->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisAxis3); + } + } + + Handle(AIS_ColoredShape) anAisShape = new AIS_ColoredShape(aShape); + Handle(AIS_Point) anAisCOM = new AIS_Point(new Geom_CartesianPoint(aCOM)); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_RED)); + Handle(AIS_TextLabel) aCOMLabel = new AIS_TextLabel(); + aCOMLabel->SetText("Center of mass"); + aCOMLabel->SetPosition(aCOM); + Handle(AIS_Axis) anAisAxisX = new AIS_Axis(new Geom_Axis2Placement(gp::YOZ()), AIS_TOAX_XAxis); + Handle(AIS_Axis) anAisAxisY = new AIS_Axis(new Geom_Axis2Placement(gp::ZOX()), AIS_TOAX_YAxis); + Handle(AIS_Axis) anAisAxisZ = new AIS_Axis(new Geom_Axis2Placement(gp::XOY()), AIS_TOAX_ZAxis); + myObject3d.Append(anAisAxisX); + myObject3d.Append(anAisAxisY); + myObject3d.Append(anAisAxisZ); + myObject3d.Append(anAisShape); + myObject3d.Append(anAisCOM); + myObject3d.Append(aCOMLabel); +} + +void TopologySamples::ComputeVolumeProperties3dSample() +{ + // Make a box by two points. + gp_Pnt aPnt1(-0.5, -0.6, -0.7); + gp_Pnt aPnt2(+0.8, +0.9, +1.0); + TopoDS_Shape aShape = BRepPrimAPI_MakeBox(aPnt1, aPnt2); + myResult << "Box with corners [" << aPnt1.X() << ", " << aPnt1.Y() << ", " << aPnt1.Z() + << "] and [" << aPnt2.X() << ", " << aPnt2.Y() << ", " << aPnt2.Z() + << "] was created in red" << std::endl; + + // Retrieve volume properties from the face. + GProp_GProps aGProps; + BRepGProp::VolumeProperties(aShape, aGProps); + Standard_Real aVolume = aGProps.Mass(); + gp_Pnt aCOM = aGProps.CentreOfMass(); + Standard_Real anIx, anIy, anIz; + aGProps.StaticMoments(anIx, anIy, anIz); + gp_Mat aMOI = aGProps.MatrixOfInertia(); + myResult << "Linear properties:" << std::endl + << " Volume = " << aVolume << std::endl + << " Center of mass = [ " << aCOM.X() << ", " << aCOM.Y() << ", " << aCOM.Z() << " ]" << std::endl + << " Static moments = [ " << anIx << ", " << anIy << ", " << anIz << " ]" << std::endl + << " Matrix of inertia = [ " + << aMOI(1, 1) << ", " << aMOI(1, 2) << ", " << aMOI(1, 3) << std::endl + << std::setw(33) << aMOI(2, 1) << ", " << aMOI(2, 2) << ", " << aMOI(2, 3) << std::endl + << std::setw(33) << aMOI(3, 1) << ", " << aMOI(3, 2) << ", " << aMOI(3, 3) << " ]" << std::endl; + GProp_PrincipalProps aPProps = aGProps.PrincipalProperties(); + Standard_Real anIxx, anIyy, anIzz; + aPProps.Moments(anIxx, anIyy, anIzz); + Standard_Real aRxx, aRyy, aRzz; + aPProps.RadiusOfGyration(aRxx, aRyy, aRzz); + myResult << "Principal properties:" << std::endl + << " Has symmetric axis : " << (aPProps.HasSymmetryAxis() ? "YES" : "NO") << std::endl + << " Has symmetric point : " << (aPProps.HasSymmetryPoint() ? "YES" : "NO") << std::endl + << " Moments of inertia = [ " << anIxx << ", " << anIyy << ", " << anIzz << " ]" << std::endl + << " Radius of gyration = [ " << aRxx << ", " << aRyy << ", " << aRzz << " ]" << std::endl; + if (!aPProps.HasSymmetryPoint()) + { + const gp_Vec& anAxis1 = aPProps.FirstAxisOfInertia(); + myResult << " 1st axis of inertia = [ " << anAxis1.X() << ", " << anAxis1.Y() << ", " << anAxis1.Z() << " ]" << std::endl; + Handle(AIS_ColoredShape) anAisAxis1 = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aCOM, aCOM.XYZ() + anAxis1.XYZ())); + anAisAxis1->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisAxis1); + if (!aPProps.HasSymmetryPoint()) + { + const gp_Vec& anAxis2 = aPProps.SecondAxisOfInertia(); + myResult << " 2nd axis of inertia = [ " << anAxis2.X() << ", " << anAxis2.Y() << ", " << anAxis2.Z() << " ]" << std::endl; + Handle(AIS_ColoredShape) anAisAxis2 = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aCOM, aCOM.XYZ() + anAxis2.XYZ())); + anAisAxis2->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisAxis2); + const gp_Vec& anAxis3 = aPProps.ThirdAxisOfInertia(); + myResult << " 3rd axis of inertia = [ " << anAxis3.X() << ", " << anAxis3.Y() << ", " << anAxis3.Z() << " ]" << std::endl; + Handle(AIS_ColoredShape) anAisAxis3 = new AIS_ColoredShape( + BRepBuilderAPI_MakeEdge(aCOM, aCOM.XYZ() + anAxis3.XYZ())); + anAisAxis3->SetColor(Quantity_Color(Quantity_NOC_GREEN)); + myObject3d.Append(anAisAxis3); + } + } + + Handle(AIS_ColoredShape) anAisShape = new AIS_ColoredShape(aShape); + Handle(AIS_Point) anAisCOM = new AIS_Point(new Geom_CartesianPoint(aCOM)); + anAisShape->SetColor(Quantity_Color(Quantity_NOC_RED)); + Handle(AIS_TextLabel) aCOMLabel = new AIS_TextLabel(); + aCOMLabel->SetText("Center of mass"); + aCOMLabel->SetPosition(aCOM); + Handle(AIS_Axis) anAisAxisX = new AIS_Axis(new Geom_Axis2Placement(gp::YOZ()), AIS_TOAX_XAxis); + Handle(AIS_Axis) anAisAxisY = new AIS_Axis(new Geom_Axis2Placement(gp::ZOX()), AIS_TOAX_YAxis); + Handle(AIS_Axis) anAisAxisZ = new AIS_Axis(new Geom_Axis2Placement(gp::XOY()), AIS_TOAX_ZAxis); + myObject3d.Append(anAisAxisX); + myObject3d.Append(anAisAxisY); + myObject3d.Append(anAisAxisZ); + myObject3d.Append(anAisShape); + myObject3d.Append(anAisCOM); + myObject3d.Append(aCOMLabel); +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TopologySamples.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TopologySamples.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TopologySamples.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TopologySamples.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,80 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef TOPOLOGYSAMPLES_H +#define TOPOLOGYSAMPLES_H + +#include "BaseSample.h" + +#include + +//! Implements Topology samples +class TopologySamples : public BaseSample +{ + DEFINE_STANDARD_RTTI_INLINE(TopologySamples, BaseSample) +public: + + TopologySamples (const TCollection_AsciiString& theSampleSourcePath, + const Handle(AIS_InteractiveContext)& theContext) + : BaseSample(theSampleSourcePath, theContext) + {} + +protected: + virtual void ExecuteSample (const TCollection_AsciiString& theSampleName) Standard_OVERRIDE; + +private: + // One function for every sample + void Vertex3dSample(); + void Edge3dSample(); + void Face3dSample(); + void Wire3dSample(); + void Shell3dSample(); + void Solid3dSample(); + void Edge2dSample(); + void Box3dSample(); + void Cylinder3dSample(); + void Revolution3dSample(); + void TopologyIterator3dSample(); + void TopologyExplorer3dSample(); + void AssessToCurve3dSample(); + void AssessToCompositeCurve3dSample(); + void AssessToSurface3dSample(); + void Common3dSample(); + void Cut3dSample(); + void Fuse3dSample(); + void Section3dSample(); + void Splitter3dSample(); + void Defeaturing3dSample(); + void Fillet3dSample(); + void Chamfer3dSample(); + void Offset3dSample(); + void Evolved3dSample(); + void Copy3dSample(); + void Transform3dSample(); + void ConvertToNurbs3dSample(); + void SewContiguousFaces3dSample(); + void CheckValidity3dSample(); + void ComputeLinearProperties3dSample(); + void ComputeSurfaceProperties3dSample(); + void ComputeVolumeProperties3dSample(); +}; + +#endif //TOPOLOGYSAMPLES_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Topology.xml opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Topology.xml --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Topology.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Topology.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TriangulationSamples.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TriangulationSamples.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TriangulationSamples.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TriangulationSamples.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,118 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "TriangulationSamples.h" + +#include "MakeBottle.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void TriangulationSamples::ExecuteSample (const TCollection_AsciiString& theSampleName) +{ + Standard_Boolean anIsSamplePresent = Standard_True; + FindSourceCode(theSampleName); + if (theSampleName == "Triangulation3dSample") + { + Triangulation3dSample(); + } + else + { + myResult << "No function found: " << theSampleName; + myCode += TCollection_AsciiString("No function found: ") + theSampleName; + anIsSamplePresent = Standard_False; + } + myIsProcessed = anIsSamplePresent; +} + +void TriangulationSamples::Triangulation3dSample() +{ + TopoDS_Shape aBottle = MakeBottle(50, 70, 30); + BRepMesh_IncrementalMesh(aBottle, 1); + + BRep_Builder aBuilder; + TopoDS_Compound aCompound; + aBuilder.MakeCompound(aCompound); + + Standard_Integer aNbTriangles(0); + for (TopExp_Explorer anExplorer(aBottle, TopAbs_FACE); anExplorer.More(); anExplorer.Next()) + { + TopoDS_Face aFace = TopoDS::Face(anExplorer.Current()); + TopLoc_Location aLocation; + Handle(Poly_Triangulation) aTriangulation = BRep_Tool::Triangulation(aFace, aLocation); + + TColgp_Array1OfPnt aTriangNodes(1, (aTriangulation->NbNodes())); + aTriangNodes = aTriangulation->Nodes(); + Poly_Array1OfTriangle aTriangles(1, aTriangulation->NbTriangles()); + aTriangles = aTriangulation->Triangles(); + + for (Standard_Integer i = 1; i <= (aTriangulation->NbTriangles()); i++) + { + Poly_Triangle trian = aTriangles.Value(i); + Standard_Integer index1, index2, index3, M = 0, N = 0; + trian.Get(index1, index2, index3); + + for (Standard_Integer j = 1; j <= 3; j++) + { + switch (j) + { + case 1: + M = index1; + N = index2; + break; + case 2: + N = index3; + break; + case 3: + M = index2; + } + + BRepBuilderAPI_MakeEdge anEdgeMaker(aTriangNodes.Value(M), aTriangNodes.Value(N)); + if (anEdgeMaker.IsDone()) + { + aBuilder.Add(aCompound, anEdgeMaker.Edge()); + } + } + } + Handle(AIS_Triangulation) anAisTriangulation = new AIS_Triangulation(aTriangulation); + aNbTriangles += aTriangulation->NbTriangles(); + myObject3d.Append(anAisTriangulation); + } + + Handle(AIS_Shape) anAisCompound = new AIS_Shape(aCompound); + myObject3d.Append(anAisCompound); + + Handle(AIS_Shape) AISBottle = new AIS_Shape(aBottle); + myObject3d.Append(AISBottle); + + myResult << "Compute the triangulation on a shape: " << aNbTriangles; +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TriangulationSamples.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TriangulationSamples.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/TriangulationSamples.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/TriangulationSamples.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,49 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef TRIANGULATIONSAMPLES_H +#define TRIANGULATIONSAMPLES_H + +#include "BaseSample.h" + +//! Implements Triangulation sample +class TriangulationSamples : public BaseSample +{ + DEFINE_STANDARD_RTTI_INLINE(TriangulationSamples, BaseSample) +public: + + TriangulationSamples (const TCollection_AsciiString& theSampleSourcePath, + const Handle(AIS_InteractiveContext)& theContext) + : BaseSample (theSampleSourcePath, theContext) + { + // + } + +protected: + virtual void ExecuteSample (const TCollection_AsciiString& theSampleName) Standard_OVERRIDE; + +private: + // One function for every sample + void Triangulation3dSample(); + +}; + +#endif //TRIANGULATIONSAMPLES_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Triangulation.xml opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Triangulation.xml --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Triangulation.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Triangulation.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,7 @@ + + + + + + + diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer2dSamples.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer2dSamples.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer2dSamples.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer2dSamples.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,282 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "Viewer2dSamples.h" + +#include "Sample2D_Markers.h" +#include "Sample2D_Face.h" +#include "Sample2D_Image.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void Viewer2dSamples::ExecuteSample (const TCollection_AsciiString& theSampleName) +{ + Standard_Boolean anIsSamplePresent = Standard_True; + FindSourceCode(theSampleName); + if (theSampleName == "TextView2dSample") + TextView2dSample(); + else if (theSampleName == "MarkerView2dSample") + MarkerView2dSample(); + else if (theSampleName == "FillAreaView2dSample") + FillAreaView2dSample(); + else if (theSampleName == "LoopOnFaceView2dSample") + LoopOnFaceView2dSample(); + else if (theSampleName == "RectagularLineGrid2dSample") + RectagularLineGrid2dSample(); + else if (theSampleName == "RectagularPointGrid2dSample") + RectagularPointGrid2dSample(); + else if (theSampleName == "CircularLineGrid2dSample") + CircularLineGrid2dSample(); + else if (theSampleName == "CircularPointGrid2dSample") + CircularPointGrid2dSample(); + else if (theSampleName == "ClearGrid2dSample") + ClearGrid2dSample(); + else if (theSampleName == "BackgroungImage2dSample") + BackgroungImage2dSample(); + else { + myResult << "No function found: " << theSampleName; + myCode += TCollection_AsciiString("No function found: ") + theSampleName; + anIsSamplePresent = Standard_False; + } + myIsProcessed = anIsSamplePresent; +} + +void Viewer2dSamples::ClearExtra() +{ + myContext->RemoveAll(Standard_True); + myViewer->DeactivateGrid(); +} + +void Viewer2dSamples::TextView2dSample() +{ + Standard_Integer aColor = Quantity_NOC_MATRABLUE; + for (Standard_Integer j = 15; j <= 20; j++) + { + Handle(AIS_TextLabel) aText = new AIS_TextLabel(); + aText->SetText(TCollection_AsciiString("font 0 scale ") + (j / 20.0)); + aText->SetPosition(gp_Pnt(0.0, 15.0 * (j - 15.0), 0.0)); + aText->SetAngle(30.0 * M_PI / 180.0); + aText->SetColor(Quantity_NameOfColor(aColor++)); + aText->SetFontAspect(Font_FA_Regular); + aText->SetFont("Courier"); + aText->SetHeight(j); + aText->SetHJustification(Graphic3d_HTA_LEFT); + aText->SetVJustification(Graphic3d_VTA_BOTTOM); + aText->SetZoomable(Standard_False); + myObject2d.Append(aText); + } + + for (Standard_Real j = 10; j <= 15; j++) + { + Handle(AIS_TextLabel) aText = new AIS_TextLabel(); + aText->SetText(TCollection_AsciiString("font 1 scale ") + (j / 10.0)); + aText->SetPosition(gp_Pnt(80.0, 15.0 * (j - 10.0), 0.0)); + aText->SetAngle(0.0); + aText->SetColor(Quantity_NameOfColor(aColor++)); + aText->SetFontAspect(Font_FA_BoldItalic); + aText->SetFont("Cambria"); + aText->SetHeight(j * 2); + aText->SetHJustification(Graphic3d_HTA_LEFT); + aText->SetVJustification(Graphic3d_VTA_BOTTOM); + aText->SetZoomable(Standard_False); + myObject2d.Append(aText); + } + + aColor = Quantity_NOC_MATRABLUE; + for (Standard_Real j = 5; j <= 10; j++) + { + Handle(AIS_TextLabel) aText = new AIS_TextLabel(); + aText->SetText(TCollection_AsciiString("font 2 scale ") + (j / 10.0)); + aText->SetPosition(gp_Pnt(140.0, 15.0 * (j - 5.0), 0.0)); + aText->SetAngle(0.0); + aText->SetColor(Quantity_NameOfColor(aColor++)); + aText->SetFontAspect(Font_FA_Bold); + aText->SetFont("Arial"); + aText->SetHeight(j * 2); + aText->SetHJustification(Graphic3d_HTA_LEFT); + aText->SetVJustification(Graphic3d_VTA_BOTTOM); + aText->SetZoomable(Standard_False); + myObject2d.Append(aText); + } + for (Standard_Real j = 10; j <= 15; j++) + { + Handle(AIS_TextLabel) aText = new AIS_TextLabel(); + aText->SetText(TCollection_AsciiString("font 3 scale ") + (j / 10.0)); + aText->SetPosition(gp_Pnt(200.0, 15.0 * (j - 10.0), 0.0)); + aText->SetAngle(0.0); + aText->SetColor(Quantity_NameOfColor(aColor++)); + aText->SetFontAspect(Font_FA_Italic); + aText->SetFont("Georgia"); + aText->SetHeight(j * 2); + aText->SetHJustification(Graphic3d_HTA_LEFT); + aText->SetVJustification(Graphic3d_VTA_BOTTOM); + aText->SetZoomable(Standard_False); + myObject2d.Append(aText); + } +} + +void Viewer2dSamples::MarkerView2dSample() +{ + // generic Markers + Standard_Integer aColor = 20; + for (int i = 1; i <= 2; i++) + { + Handle(Sample2D_Markers) aMarker = new Sample2D_Markers(10 + 5, 5 * i, Aspect_TOM_POINT, Quantity_NOC_YELLOW, 2.0); + myObject2d.Append(aMarker); + } + for (int i = 1; i <= 2; i++) + { + Handle(Sample2D_Markers) aMarker = new Sample2D_Markers(10 + 10, 5 * i, Aspect_TOM_O, (Quantity_NameOfColor)(aColor++)); + myObject2d.Append(aMarker); + } + for (int i = 1; i <= 2; i++) + { + Handle(Sample2D_Markers) aMarker = new Sample2D_Markers(10 + 15, 5 * i, Aspect_TOM_O_PLUS, (Quantity_NameOfColor)(aColor++)); + myObject2d.Append(aMarker); + } + for (int i = 1; i <= 2; i++) + { + Handle(Sample2D_Markers) aMarker = new Sample2D_Markers(10 + 20, 5 * i, Aspect_TOM_RING1, (Quantity_NameOfColor)(aColor++)); + myObject2d.Append(aMarker); + } + for (int i = 1; i <= 2; i++) + { + Handle(Sample2D_Markers) aMarker = new Sample2D_Markers(10 + 25, 5 * i, Aspect_TOM_STAR, (Quantity_NameOfColor)(aColor++)); + myObject2d.Append(aMarker); + } + for (int i = 1; i <= 2; i++) + { + Handle(Sample2D_Markers) aMarker = new Sample2D_Markers(10 + 30, 5 * i, Aspect_TOM_O_X, (Quantity_NameOfColor)(aColor++)); + myObject2d.Append(aMarker); + } +} + +void Viewer2dSamples::FillAreaView2dSample() +{ + for (int i = 0; i <= 13; ++i) + { + for (int j = 0; j <= 5; ++j) + { + // set of rectangles here + TopoDS_Edge E1 = BRepBuilderAPI_MakeEdge(gp_Pnt(10 * i, 10 * j, 0.), gp_Pnt(10 * i + 7, 10 * j, 0.)); + TopoDS_Edge E2 = BRepBuilderAPI_MakeEdge(gp_Pnt(10 * i + 7, 10 * j, 0.), gp_Pnt(10 * i + 7, 10 * j + 5, 0.)); + TopoDS_Edge E3 = BRepBuilderAPI_MakeEdge(gp_Pnt(10 * i + 7, 10 * j + 5, 0.), gp_Pnt(10 * i, 10 * j + 5, 0.)); + TopoDS_Edge E4 = BRepBuilderAPI_MakeEdge(gp_Pnt(10 * i, 10 * j + 5, 0.), gp_Pnt(10 * i, 10 * j, 0.)); + TopoDS_Wire W = BRepBuilderAPI_MakeWire(E1, E2, E3, E4); + TopoDS_Face F = BRepBuilderAPI_MakeFace(W); + Handle(AIS_Shape) aRect = new AIS_Shape(F); + // set attributes of boundaries + Handle(Prs3d_Drawer) aDrawer = new Prs3d_Drawer(); + Handle(Prs3d_LineAspect) aLineAttrib = new Prs3d_LineAspect (Quantity_NOC_YELLOW, + (Aspect_TypeOfLine)(Aspect_TOL_SOLID + j), 1); + aDrawer->SetFaceBoundaryAspect(aLineAttrib); + aDrawer->SetFaceBoundaryDraw(Standard_True); + aRect->SetAttributes(aDrawer); + + myContext->SetDisplayMode(aRect, 1, Standard_False); + myContext->SetColor(aRect, (Quantity_NameOfColor)(Quantity_NOC_CADETBLUE + 2 * i), Standard_False); + myContext->SetMaterial(aRect, Graphic3d_NOM_PLASTIC, Standard_False); + myObject2d.Append(aRect); + + } + } +} + +void Viewer2dSamples::LoopOnFaceView2dSample() +{ + // Make a flat rectangular face on XY plane. + gp_Pln aPln(gp::XOY()); + TopoDS_Face aFaceRect = BRepBuilderAPI_MakeFace(aPln, -10.0, +10.0, -20.0, +20.0); + + Handle(AIS_ColoredShape) anAisFaceRect = new AIS_ColoredShape(aFaceRect); + anAisFaceRect->SetColor(Quantity_Color(Quantity_NOC_RED)); + myObject2d.Append(anAisFaceRect); + + TopoDS_Shape aFaceShape; + Handle(Sample2D_Face) anAISFace = new Sample2D_Face(aFaceRect); + myObject2d.Append(anAISFace); +} + +void Viewer2dSamples::RectagularLineGrid2dSample() +{ + Handle(Graphic3d_AspectMarker3d) aGridAspect = new Graphic3d_AspectMarker3d(Aspect_TOM_RING1, Quantity_NOC_WHITE, 2); + myViewer->SetGridEcho(aGridAspect); + Standard_Integer aWidth = 0, aHeight = 0, anOffset = 0; + myView->Window()->Size(aWidth, aHeight); + myViewer->SetRectangularGridGraphicValues(aWidth, aHeight, anOffset); + myViewer->ActivateGrid(Aspect_GT_Rectangular, Aspect_GDM_Lines); + myViewer->Redraw(); +} + +void Viewer2dSamples::RectagularPointGrid2dSample() +{ + Handle(Graphic3d_AspectMarker3d) aGridAspect = new Graphic3d_AspectMarker3d(Aspect_TOM_RING1, Quantity_NOC_WHITE, 2); + myViewer->SetGridEcho(aGridAspect); + Standard_Integer aWidth = 0, aHeight = 0, anOffset = 0; + myView->Window()->Size(aWidth, aHeight); + myViewer->SetRectangularGridGraphicValues(aWidth, aHeight, anOffset); + myViewer->ActivateGrid(Aspect_GT_Rectangular, Aspect_GDM_Points); + myViewer->Redraw(); +} + +void Viewer2dSamples::CircularLineGrid2dSample() +{ + Handle(Graphic3d_AspectMarker3d) aGridAspect = new Graphic3d_AspectMarker3d(Aspect_TOM_RING1, Quantity_NOC_WHITE, 2); + myViewer->SetGridEcho(aGridAspect); + Standard_Integer aWidth = 0, aHeight = 0, anOffset = 0; + myView->Window()->Size(aWidth, aHeight); + myViewer->SetRectangularGridGraphicValues(aWidth, aHeight, anOffset); + myViewer->ActivateGrid(Aspect_GT_Circular, Aspect_GDM_Lines); + myViewer->Redraw(); +} + +void Viewer2dSamples::CircularPointGrid2dSample() +{ + Handle(Graphic3d_AspectMarker3d) aGridAspect = new Graphic3d_AspectMarker3d(Aspect_TOM_RING1, Quantity_NOC_WHITE, 2); + myViewer->SetGridEcho(aGridAspect); + Standard_Integer aWidth = 0, aHeight = 0, anOffset = 0; + myView->Window()->Size(aWidth, aHeight); + myViewer->SetRectangularGridGraphicValues(aWidth, aHeight, anOffset); + myViewer->ActivateGrid(Aspect_GT_Circular, Aspect_GDM_Points); + myViewer->Redraw(); +} + +void Viewer2dSamples::ClearGrid2dSample() +{ + myViewer->DeactivateGrid(); + myViewer->Redraw(); +} + +void Viewer2dSamples::BackgroungImage2dSample() +{ + Handle(Sample2D_Image) anImage = new Sample2D_Image(myFileName); + anImage->SetCoord(40, 50); + anImage->SetScale(1.0); + myObject2d.Append(anImage); +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer2dSamples.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer2dSamples.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer2dSamples.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer2dSamples.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,76 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef VIEWER2DSAMPLES_H +#define VIEWER2DSAMPLES_H + +#include "BaseSample.h" + +#include +#include + +//! Implements viewer 2D samples. +class Viewer2dSamples : public BaseSample +{ + DEFINE_STANDARD_RTTI_INLINE(Viewer2dSamples, BaseSample) +public: + + Viewer2dSamples(const TCollection_AsciiString& theSampleSourcePath, + const Handle(V3d_View)& theView, + const Handle(V3d_Viewer)& theViewer, + const Handle(AIS_InteractiveContext)& theContext) + : BaseSample (theSampleSourcePath, theContext), + myView (theView), + myViewer (theViewer) + {} + + void SetFileName (const TCollection_AsciiString& theFileName) { myFileName = theFileName; } + void ClearExtra(); + + static Standard_Boolean IsFileSample (const TCollection_AsciiString& theSampleName) { return theSampleName == "BackgroungImage2dSample"; } + static Standard_Boolean IsShadedSample(const TCollection_AsciiString& theSampleName) { return theSampleName == "BackgroungImage2dSample"; } + +protected: + virtual void ExecuteSample (const TCollection_AsciiString& theSampleName) Standard_OVERRIDE; + +private: + + // One function for every sample + void TextView2dSample(); + void MarkerView2dSample(); + void FillAreaView2dSample(); + void LoopOnFaceView2dSample(); + void RectagularLineGrid2dSample(); + void RectagularPointGrid2dSample(); + void CircularLineGrid2dSample(); + void CircularPointGrid2dSample(); + void ClearGrid2dSample(); + void BackgroungImage2dSample(); + +private: + + TCollection_AsciiString myFileName; + Handle(V3d_View) myView; + Handle(V3d_Viewer) myViewer; + +}; + +#endif // VIEWER2DSAMPLES_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer2d.xml opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer2d.xml --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer2d.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer2d.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer3dSamples.cxx opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer3dSamples.cxx --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer3dSamples.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer3dSamples.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,342 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "Viewer3dSamples.h" + +#include "MakeBottle.h" + +#include +#include +#include +#include +#include +#include +#include + +void Viewer3dSamples::ExecuteSample (const TCollection_AsciiString& theSampleName) +{ + Standard_Boolean anIsSamplePresent = Standard_True; + FindSourceCode(theSampleName); + if (theSampleName == "SpotLight3dSample") + SpotLight3dSample(); + else if (theSampleName == "PositionalLight3dSample") + PositionalLight3dSample(); + else if (theSampleName == "DirectionalLight3dSample") + DirectionalLight3dSample(); + else if (theSampleName == "AmbientLight3dSample") + AmbientLight3dSample(); + else if (theSampleName == "ClearLight3dSample") + ClearLight3dSample(); + else if (theSampleName == "VerticesSelect3dSample") + VerticesSelect3dSample(); + else if (theSampleName == "EdgesSelect3dSample") + EdgesSelect3dSample(); + else if (theSampleName == "FacesSelect3dSample") + FacesSelect3dSample(); + else if (theSampleName == "NeutralPointSelect3dSample") + NeutralPointSelect3dSample(); + else if (theSampleName == "WireFramePresentation3dSample") + WireFramePresentation3dSample(); + else if (theSampleName == "ShadingPresentation3dSample") + ShadingPresentation3dSample(); + else if (theSampleName == "RedColorPresentation3dSample") + RedColorPresentation3dSample(); + else if (theSampleName == "GrayColorPresentation3dSample") + GrayColorPresentation3dSample(); + else if (theSampleName == "PlasticPresentation3dSample") + PlasticPresentation3dSample(); + else if (theSampleName == "BronzePresentation3dSample") + BronzePresentation3dSample(); + else if (theSampleName == "OpaquePresentation3dSample") + OpaquePresentation3dSample(); + else if (theSampleName == "HalfTransparencyPresentation3dSample") + HalfTransparencyPresentation3dSample(); + else if (theSampleName == "VboOn3dSample") + VboOn3dSample(); + else if (theSampleName == "VboOff3dSample") + VboOff3dSample(); + else + { + myResult << "No function found: " << theSampleName; + myCode += TCollection_AsciiString("No function found: ") + theSampleName; + anIsSamplePresent = Standard_False; + } + myIsProcessed = anIsSamplePresent; +} + +void Viewer3dSamples::AppendBottle() +{ + TopoDS_Shape aBottle = MakeBottle(50, 70, 30); + Handle(AIS_InteractiveObject) aShape = new AIS_Shape(aBottle); + myObject3d.Append(aShape); + Handle(AIS_ViewCube) aViewCube = new AIS_ViewCube(); + myObject3d.Append(aViewCube); + myResult << "A bottle shape was created." << std::endl; +} + +void Viewer3dSamples::ClearExtra() +{ + NeutralPointSelect3dSample(); + VboOff3dSample(); + ClearLight3dSample(); + // Delete Lights + V3d_ListOfLight aLights; + for(V3d_ListOfLightIterator anIter = myView->Viewer()->DefinedLightIterator(); + anIter.More(); anIter.Next()) + { + aLights.Append(anIter.Value()); + } + + for(V3d_ListOfLightIterator aLightIter (aLights); + aLightIter.More(); aLightIter.Next()) + { + myView->Viewer()->DelLight (aLightIter.Value()); + } + myView->Viewer()->SetDefaultLights(); // Setting the default lights on + myView->Update(); + + myContext->RemoveAll (Standard_True); +} + +void Viewer3dSamples::SpotLight3dSample() +{ + // Spot light source creation + Handle(V3d_SpotLight) aSpotLight = + new V3d_SpotLight(gp_Pnt(100.0, 0.0, 0.0), gp_Dir(-1.0, 0.0, 0.0), Quantity_NOC_RED); + aSpotLight->SetIntensity(5000); + myView->SetLightOn(aSpotLight); +} + +void Viewer3dSamples::PositionalLight3dSample() +{ + Handle(V3d_PositionalLight) aPositionalLight = + new V3d_PositionalLight(gp_Pnt(0.0, -100.0, 5.0), Quantity_NOC_GREEN); + aPositionalLight->SetAttenuation(1, 0); + myView->SetLightOn(aPositionalLight); +} + +void Viewer3dSamples::DirectionalLight3dSample() +{ + Handle(V3d_DirectionalLight) aDirectionalLight = + new V3d_DirectionalLight(gp_Dir(-1.0, 0.0, -1.0), Quantity_NOC_BLUE1); + myView->SetLightOn(aDirectionalLight); +} + +void Viewer3dSamples::AmbientLight3dSample() +{ + Handle(V3d_AmbientLight) aAmbientLight = + new V3d_AmbientLight(Quantity_NOC_MAGENTA1); + myView->SetLightOn(aAmbientLight); +} + +void Viewer3dSamples::ClearLight3dSample() +{ + // Setting Off all viewer active lights + V3d_ListOfLight aLights; + for(V3d_ListOfLightIterator anIter = myView->Viewer()->ActiveLightIterator(); + anIter.More(); anIter.Next()) + { + aLights.Append(anIter.Value()); + } + + for(V3d_ListOfLightIterator aLightIter(aLights); + aLightIter.More(); aLightIter.Next()) + { + myView->Viewer()->SetLightOff (aLightIter.Value()); + } + // Setting Off all view active lights + aLights.Clear(); + for(V3d_ListOfLightIterator anIter = myView->ActiveLightIterator(); + anIter.More(); anIter.Next()) + { + aLights.Append(anIter.Value()); + } + + for(V3d_ListOfLightIterator aLightIter (aLights); + aLightIter.More(); aLightIter.Next()) + { + myView->SetLightOff (aLightIter.Value()); + } + myView->Viewer()->SetDefaultLights(); // Setting the default lights on + myView->Update(); +} + +void Viewer3dSamples::VerticesSelect3dSample() +{ + myContext->Deactivate(); + myContext->Activate(AIS_Shape::SelectionMode(TopAbs_VERTEX)); +} + +void Viewer3dSamples::EdgesSelect3dSample() +{ + myContext->Deactivate(); + myContext->Activate(AIS_Shape::SelectionMode(TopAbs_EDGE)); +} + +void Viewer3dSamples::FacesSelect3dSample() +{ + myContext->Deactivate(); + myContext->Activate(AIS_Shape::SelectionMode(TopAbs_FACE)); +} + +void Viewer3dSamples::NeutralPointSelect3dSample() +{ + myContext->Deactivate(); + myContext->Activate(0); +} + +void Viewer3dSamples::WireFramePresentation3dSample() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + for(AIS_ListOfInteractive::Iterator anIter(anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + myContext->SetDisplayMode(anAisObject, 0, false); // set wireframe + } + myContext->UpdateCurrentViewer(); +} + +void Viewer3dSamples::ShadingPresentation3dSample() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + for(AIS_ListOfInteractive::Iterator anIter(anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + myContext->SetDisplayMode(anAisObject, 1, false); // set shading + } + myContext->UpdateCurrentViewer(); +} + +void Viewer3dSamples::RedColorPresentation3dSample() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + for(AIS_ListOfInteractive::Iterator anIter(anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + Quantity_Color aShapeColor; + myContext->Color(anAisObject, aShapeColor); + myResult << "A Current shape color: Red = " << aShapeColor.Red() + << " Green = " << aShapeColor.Green() << " Blue = " << aShapeColor.Blue() << std::endl; + aShapeColor.SetValues(0.8, 0.1, 0.1, Quantity_TOC_RGB); + myContext->SetColor(anAisObject, aShapeColor, Standard_False); + myResult << "A New shape color: Red = " << aShapeColor.Red() + << " Green = " << aShapeColor.Green() << " Blue = " << aShapeColor.Blue() << std::endl; + } +} + +void Viewer3dSamples::GrayColorPresentation3dSample() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + for(AIS_ListOfInteractive::Iterator anIter(anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + Quantity_Color aShapeColor; + myContext->Color(anAisObject, aShapeColor); + myResult << "A Current shape color: Hue = " << aShapeColor.Hue() + << " Light = " << aShapeColor.Light() + << " Saturation = " << aShapeColor.Saturation() << std::endl; + aShapeColor.SetValues(0.0, 0.3, 0.1, Quantity_TOC_HLS); + myContext->SetColor(anAisObject, aShapeColor, Standard_False); + myResult << "A New shape color: Hue = " << aShapeColor.Hue() + << " Light = " << aShapeColor.Light() + << " Saturation = " << aShapeColor.Saturation() << std::endl; + } +} + +void Viewer3dSamples::PlasticPresentation3dSample() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + Graphic3d_NameOfMaterial aMaterial = Graphic3d_NOM_PLASTIC; + for(AIS_ListOfInteractive::Iterator anIter (anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + myContext->SetMaterial(anAisObject, aMaterial, Standard_False); + } + myContext->UpdateCurrentViewer(); +} + +void Viewer3dSamples::BronzePresentation3dSample() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + Graphic3d_NameOfMaterial aMaterial = Graphic3d_NOM_BRONZE; + for(AIS_ListOfInteractive::Iterator anIter (anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + myContext->SetMaterial(anAisObject, aMaterial, Standard_False); + } + myContext->UpdateCurrentViewer(); +} + +void Viewer3dSamples::OpaquePresentation3dSample() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + for(AIS_ListOfInteractive::Iterator anIter (anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + myContext->SetTransparency(anAisObject, 0.0, Standard_False); + } + myContext->UpdateCurrentViewer(); +} + +void Viewer3dSamples::HalfTransparencyPresentation3dSample() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + for(AIS_ListOfInteractive::Iterator anIter (anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + myContext->SetTransparency(anAisObject, 0.5, Standard_False); + } + myContext->UpdateCurrentViewer(); +} + +void Viewer3dSamples::VboOn3dSample() +{ + if(Handle(OpenGl_GraphicDriver) aDriver = + Handle(OpenGl_GraphicDriver)::DownCast(myContext->CurrentViewer()->Driver())) + { + aDriver->ChangeOptions().vboDisable = Standard_False; + } +} + +void Viewer3dSamples::VboOff3dSample() +{ + if(Handle(OpenGl_GraphicDriver) aDriver = + Handle(OpenGl_GraphicDriver)::DownCast(myContext->CurrentViewer()->Driver())) + { + aDriver->ChangeOptions().vboDisable = Standard_True; + } +} diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer3dSamples.h opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer3dSamples.h --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer3dSamples.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer3dSamples.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,78 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef VIEWER3DSAMPLES_H +#define VIEWER3DSAMPLES_H + +#include "BaseSample.h" + +#include +#include + +//! Implements viewer 3D samples. +class Viewer3dSamples : public BaseSample +{ + DEFINE_STANDARD_RTTI_INLINE(Viewer3dSamples, BaseSample) +public: + + Viewer3dSamples (const TCollection_AsciiString& theSampleSourcePath, + const Handle(V3d_View)& theView, + const Handle(AIS_InteractiveContext)& theContext) + : BaseSample (theSampleSourcePath, theContext), + myView (theView) + {} + + void AppendBottle(); + void ClearExtra(); + +protected: + virtual void ExecuteSample (const TCollection_AsciiString& theSampleName) Standard_OVERRIDE; + +private: + + // One function for every sample + void SpotLight3dSample(); + void PositionalLight3dSample(); + void DirectionalLight3dSample(); + void AmbientLight3dSample(); + void ClearLight3dSample(); + void VerticesSelect3dSample(); + void EdgesSelect3dSample(); + void FacesSelect3dSample(); + void NeutralPointSelect3dSample(); + void WireFramePresentation3dSample(); + void ShadingPresentation3dSample(); + void RedColorPresentation3dSample(); + void GrayColorPresentation3dSample(); + void PlasticPresentation3dSample(); + void BronzePresentation3dSample(); + void OpaquePresentation3dSample(); + void HalfTransparencyPresentation3dSample(); + void VboOn3dSample(); + void VboOff3dSample(); + +private: + + Handle(V3d_View) myView; + +}; + +#endif //VIEWER3DSAMPLES_H diff -Nru opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer3d.xml opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer3d.xml --- opencascade-7.4.1+dfsg1/samples/OCCTOverview/code/Viewer3d.xml 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/OCCTOverview/code/Viewer3d.xml 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/samples/qt/AndroidQt/src/AndroidQt_Window.h opencascade-7.5.1+dfsg1/samples/qt/AndroidQt/src/AndroidQt_Window.h --- opencascade-7.4.1+dfsg1/samples/qt/AndroidQt/src/AndroidQt_Window.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/AndroidQt/src/AndroidQt_Window.h 2021-02-02 08:51:56.000000000 +0000 @@ -44,7 +44,7 @@ virtual void Unmap() const {} //! Applies the resizing to the window - virtual Aspect_TypeOfResize DoResize() const { return Aspect_TOR_UNKNOWN; } + virtual Aspect_TypeOfResize DoResize() { return Aspect_TOR_UNKNOWN; } //! Apply the mapping change to the window virtual Standard_Boolean DoMapping() const { return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Common/src/OcctWindow.cxx opencascade-7.5.1+dfsg1/samples/qt/Common/src/OcctWindow.cxx --- opencascade-7.4.1+dfsg1/samples/qt/Common/src/OcctWindow.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Common/src/OcctWindow.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -81,7 +81,7 @@ // function : DoResize // purpose : // ======================================================================= -Aspect_TypeOfResize OcctWindow::DoResize() const +Aspect_TypeOfResize OcctWindow::DoResize() { int aMask = 0; Aspect_TypeOfResize aMode = Aspect_TOR_UNKNOWN; @@ -126,10 +126,10 @@ break; } // end switch - *( ( Standard_Integer* )&myXLeft ) = myWidget->rect().left(); - *( ( Standard_Integer* )&myXRight ) = myWidget->rect().right(); - *( ( Standard_Integer* )&myYTop ) = myWidget->rect().top(); - *( ( Standard_Integer* )&myYBottom) = myWidget->rect().bottom(); + myXLeft = myWidget->rect().left(); + myXRight = myWidget->rect().right(); + myYTop = myWidget->rect().top(); + myYBottom = myWidget->rect().bottom(); } return aMode; @@ -152,8 +152,8 @@ void OcctWindow::Size ( Standard_Integer& theWidth, Standard_Integer& theHeight ) const { QRect aRect = myWidget->rect(); - theWidth = aRect.right(); - theHeight = aRect.bottom(); + theWidth = aRect.width(); + theHeight = aRect.height(); } // ======================================================================= diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Common/src/OcctWindow.h opencascade-7.5.1+dfsg1/samples/qt/Common/src/OcctWindow.h --- opencascade-7.4.1+dfsg1/samples/qt/Common/src/OcctWindow.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Common/src/OcctWindow.h 2021-02-02 08:51:56.000000000 +0000 @@ -51,7 +51,7 @@ virtual Aspect_Drawable NativeParentHandle() const; //! Applies the resizing to the window - virtual Aspect_TypeOfResize DoResize() const; + virtual Aspect_TypeOfResize DoResize(); //! Returns True if the window is opened //! and False if the window is closed. diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Common/src/View.cxx opencascade-7.5.1+dfsg1/samples/qt/Common/src/View.cxx --- opencascade-7.4.1+dfsg1/samples/qt/Common/src/View.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Common/src/View.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,14 +29,46 @@ #include #include -// the key for multi selection : -#define MULTISELECTIONKEY Qt::ShiftModifier - -// the key for shortcut ( use to activate dynamic rotation, panning ) -#define CASCADESHORTCUTKEY Qt::ControlModifier +namespace +{ + //! Map Qt buttons bitmask to virtual keys. + Aspect_VKeyMouse qtMouseButtons2VKeys (Qt::MouseButtons theButtons) + { + Aspect_VKeyMouse aButtons = Aspect_VKeyMouse_NONE; + if ((theButtons & Qt::LeftButton) != 0) + { + aButtons |= Aspect_VKeyMouse_LeftButton; + } + if ((theButtons & Qt::MiddleButton) != 0) + { + aButtons |= Aspect_VKeyMouse_MiddleButton; + } + if ((theButtons & Qt::RightButton) != 0) + { + aButtons |= Aspect_VKeyMouse_RightButton; + } + return aButtons; + } -// for elastic bean selection -#define ValZWMin 1 + //! Map Qt mouse modifiers bitmask to virtual keys. + Aspect_VKeyFlags qtMouseModifiers2VKeys (Qt::KeyboardModifiers theModifiers) + { + Aspect_VKeyFlags aFlags = Aspect_VKeyFlags_NONE; + if ((theModifiers & Qt::ShiftModifier) != 0) + { + aFlags |= Aspect_VKeyFlags_SHIFT; + } + if ((theModifiers & Qt::ControlModifier) != 0) + { + aFlags |= Aspect_VKeyFlags_CTRL; + } + if ((theModifiers & Qt::AltModifier) != 0) + { + aFlags |= Aspect_VKeyFlags_ALT; + } + return aFlags; + } +} static QCursor* defCursor = NULL; static QCursor* handCursor = NULL; @@ -60,18 +92,12 @@ #endif myContext = theContext; - myXmin = 0; - myYmin = 0; - myXmax = 0; - myYmax = 0; myCurZoom = 0; - myRectBand = 0; - setAttribute(Qt::WA_PaintOnScreen); setAttribute(Qt::WA_NoSystemBackground); + myDefaultGestures = myMouseGestureMap; myCurrentMode = CurAction3d_Nothing; - myHlrModeIsOn = Standard_False; setMouseTracking( true ); initViewActions(); @@ -111,7 +137,8 @@ void View::paintEvent( QPaintEvent * ) { // QApplication::syncX(); - myView->Redraw(); + myView->InvalidateImmediate(); + FlushViewEvents (myContext, myView, true); } void View::resizeEvent( QResizeEvent * ) @@ -123,6 +150,12 @@ } } +void View::OnSelectionChanged (const Handle(AIS_InteractiveContext)& , + const Handle(V3d_View)& ) +{ + ApplicationCommonWindow::getApplication()->onSelectionChanged(); +} + void View::fitAll() { myView->FitAll(); @@ -132,22 +165,22 @@ void View::fitArea() { - myCurrentMode = CurAction3d_WindowZooming; + setCurrentAction (CurAction3d_WindowZooming); } void View::zoom() { - myCurrentMode = CurAction3d_DynamicZooming; + setCurrentAction (CurAction3d_DynamicZooming); } void View::pan() { - myCurrentMode = CurAction3d_DynamicPanning; + setCurrentAction (CurAction3d_DynamicPanning); } void View::rotation() { - myCurrentMode = CurAction3d_DynamicRotation; + setCurrentAction (CurAction3d_DynamicRotation); } void View::globalPan() @@ -157,7 +190,7 @@ // Do a Global Zoom myView->FitAll(); // Set the mode - myCurrentMode = CurAction3d_GlobalPanning; + setCurrentAction (CurAction3d_GlobalPanning); } void View::front() @@ -203,8 +236,7 @@ void View::hlrOff() { QApplication::setOverrideCursor( Qt::WaitCursor ); - myHlrModeIsOn = Standard_False; - myView->SetComputedMode (myHlrModeIsOn); + myView->SetComputedMode (false); myView->Redraw(); QApplication::restoreOverrideCursor(); } @@ -212,8 +244,7 @@ void View::hlrOn() { QApplication::setOverrideCursor( Qt::WaitCursor ); - myHlrModeIsOn = Standard_True; - myView->SetComputedMode (myHlrModeIsOn); + myView->SetComputedMode (true); myView->Redraw(); QApplication::restoreOverrideCursor(); } @@ -548,31 +579,6 @@ myRaytraceActions->insert( ToolAntialiasingId, a ); } -void View::mousePressEvent( QMouseEvent* e ) -{ - if ( e->button() == Qt::LeftButton ) - onLButtonDown( ( e->buttons() | e->modifiers() ), e->pos() ); - else if ( e->button() == Qt::MidButton ) - onMButtonDown( e->buttons() | e->modifiers(), e->pos() ); - else if ( e->button() == Qt::RightButton ) - onRButtonDown( e->buttons() | e->modifiers(), e->pos() ); -} - -void View::mouseReleaseEvent(QMouseEvent* e) -{ - if ( e->button() == Qt::LeftButton ) - onLButtonUp( e->buttons(), e->pos() ); - else if ( e->button() == Qt::MidButton ) - onMButtonUp( e->buttons(), e->pos() ); - else if( e->button() == Qt::RightButton ) - onRButtonUp( e->buttons(), e->pos() ); -} - -void View::mouseMoveEvent(QMouseEvent* e) -{ - onMouseMove( e->buttons(), e->pos() ); -} - void View::activateCursor( const CurrentAction3d mode ) { switch( mode ) @@ -599,276 +605,124 @@ } } -void View::onLButtonDown( const int/*Qt::MouseButtons*/ nFlags, const QPoint point ) +void View::mousePressEvent (QMouseEvent* theEvent) { - // save the current mouse coordinate in min - myXmin = point.x(); - myYmin = point.y(); - myXmax = point.x(); - myYmax = point.y(); - - if ( nFlags & CASCADESHORTCUTKEY ) + const Graphic3d_Vec2i aPnt (theEvent->pos().x(), theEvent->pos().y()); + const Aspect_VKeyFlags aFlags = qtMouseModifiers2VKeys (theEvent->modifiers()); + if (!myView.IsNull() + && UpdateMouseButtons (aPnt, + qtMouseButtons2VKeys (theEvent->buttons()), + aFlags, + false)) { - myCurrentMode = CurAction3d_DynamicZooming; + updateView(); } - else - { - switch ( myCurrentMode ) - { - case CurAction3d_Nothing: - if ( nFlags & MULTISELECTIONKEY ) - MultiDragEvent( myXmax, myYmax, -1 ); - else - DragEvent( myXmax, myYmax, -1 ); - break; - case CurAction3d_DynamicZooming: - break; - case CurAction3d_WindowZooming: - break; - case CurAction3d_DynamicPanning: - break; - case CurAction3d_GlobalPanning: - break; - case CurAction3d_DynamicRotation: - if (myHlrModeIsOn) - { - myView->SetComputedMode (Standard_False); - } - myView->StartRotation( point.x(), point.y() ); - break; - default: - throw Standard_Failure( "incompatible Current Mode" ); - break; - } - } - activateCursor( myCurrentMode ); + myClickPos = aPnt; } -void View::onMButtonDown( const int/*Qt::MouseButtons*/ nFlags, const QPoint /*point*/ ) +void View::mouseReleaseEvent (QMouseEvent* theEvent) { - if ( nFlags & CASCADESHORTCUTKEY ) - myCurrentMode = CurAction3d_DynamicPanning; - activateCursor( myCurrentMode ); -} + const Graphic3d_Vec2i aPnt (theEvent->pos().x(), theEvent->pos().y()); + const Aspect_VKeyFlags aFlags = qtMouseModifiers2VKeys (theEvent->modifiers()); + if (!myView.IsNull() + && UpdateMouseButtons (aPnt, + qtMouseButtons2VKeys (theEvent->buttons()), + aFlags, + false)) + { + updateView(); + } -void View::onRButtonDown( const int/*Qt::MouseButtons*/ nFlags, const QPoint point ) -{ - if ( nFlags & CASCADESHORTCUTKEY ) + if (myCurrentMode == CurAction3d_GlobalPanning) { - if (myHlrModeIsOn) - { - myView->SetComputedMode (Standard_False); - } - myCurrentMode = CurAction3d_DynamicRotation; - myView->StartRotation( point.x(), point.y() ); + myView->Place (aPnt.x(), aPnt.y(), myCurZoom); } - else + if (myCurrentMode != CurAction3d_Nothing) + { + setCurrentAction (CurAction3d_Nothing); + } + if (theEvent->button() == Qt::RightButton + && (aFlags & Aspect_VKeyFlags_CTRL) == 0 + && (myClickPos - aPnt).cwiseAbs().maxComp() <= 4) { - Popup( point.x(), point.y() ); + Popup (aPnt.x(), aPnt.y()); } - activateCursor( myCurrentMode ); } -void View::onLButtonUp( Qt::MouseButtons nFlags, const QPoint point ) +void View::mouseMoveEvent (QMouseEvent* theEvent) { - switch( myCurrentMode ) - { - case CurAction3d_Nothing: - if ( point.x() == myXmin && point.y() == myYmin ) - { - // no offset between down and up --> selectEvent - myXmax = point.x(); - myYmax = point.y(); - if ( nFlags & MULTISELECTIONKEY ) - MultiInputEvent( point.x(), point.y() ); - else - InputEvent( point.x(), point.y() ); - } - else - { - DrawRectangle( myXmin, myYmin, myXmax, myYmax, Standard_False ); - myXmax = point.x(); - myYmax = point.y(); - if ( nFlags & MULTISELECTIONKEY ) - MultiDragEvent( point.x(), point.y(), 1 ); - else - DragEvent( point.x(), point.y(), 1 ); - } - break; - case CurAction3d_DynamicZooming: - myCurrentMode = CurAction3d_Nothing; - noActiveActions(); - break; - case CurAction3d_WindowZooming: - DrawRectangle( myXmin, myYmin, myXmax, myYmax, Standard_False );//,LongDash); - myXmax = point.x(); - myYmax = point.y(); - if ( (abs( myXmin - myXmax ) > ValZWMin ) || - (abs( myYmin - myYmax ) > ValZWMin ) ) - myView->WindowFitAll( myXmin, myYmin, myXmax, myYmax ); - myCurrentMode = CurAction3d_Nothing; - noActiveActions(); - break; - case CurAction3d_DynamicPanning: - myCurrentMode = CurAction3d_Nothing; - noActiveActions(); - break; - case CurAction3d_GlobalPanning : - myView->Place( point.x(), point.y(), myCurZoom ); - myCurrentMode = CurAction3d_Nothing; - noActiveActions(); - break; - case CurAction3d_DynamicRotation: - myCurrentMode = CurAction3d_Nothing; - noActiveActions(); - break; - default: - throw Standard_Failure(" incompatible Current Mode "); - break; - } - activateCursor( myCurrentMode ); - ApplicationCommonWindow::getApplication()->onSelectionChanged(); + const Graphic3d_Vec2i aNewPos (theEvent->pos().x(), theEvent->pos().y()); + if (!myView.IsNull() + && UpdateMousePosition (aNewPos, + qtMouseButtons2VKeys (theEvent->buttons()), + qtMouseModifiers2VKeys (theEvent->modifiers()), + false)) + { + updateView(); + } } -void View::onMButtonUp( Qt::MouseButtons /*nFlags*/, const QPoint /*point*/ ) +//============================================================================== +//function : wheelEvent +//purpose : +//============================================================================== +void View::wheelEvent (QWheelEvent* theEvent) { - myCurrentMode = CurAction3d_Nothing; - activateCursor( myCurrentMode ); + const Graphic3d_Vec2i aPos (theEvent->pos().x(), theEvent->pos().y()); + if (!myView.IsNull() + && UpdateZoom (Aspect_ScrollDelta (aPos, theEvent->delta() / 8))) + { + updateView(); + } } -void View::onRButtonUp( Qt::MouseButtons /*nFlags*/, const QPoint point ) +// ======================================================================= +// function : updateView +// purpose : +// ======================================================================= +void View::updateView() { - if ( myCurrentMode == CurAction3d_Nothing ) - Popup( point.x(), point.y() ); - else - { - QApplication::setOverrideCursor( Qt::WaitCursor ); - // reset tyhe good Degenerated mode according to the strored one - // --> dynamic rotation may have change it - if (myHlrModeIsOn) - { - myView->SetComputedMode (myHlrModeIsOn); - myView->Redraw(); - } - QApplication::restoreOverrideCursor(); - myCurrentMode = CurAction3d_Nothing; - } - activateCursor( myCurrentMode ); + update(); } -void View::onMouseMove( Qt::MouseButtons nFlags, const QPoint point ) +void View::defineMouseGestures() { - if ( nFlags & Qt::LeftButton || nFlags & Qt::RightButton || nFlags & Qt::MidButton ) - { - switch ( myCurrentMode ) + myMouseGestureMap.Clear(); + AIS_MouseGesture aRot = AIS_MouseGesture_RotateOrbit; + activateCursor (myCurrentMode); + switch (myCurrentMode) + { + case CurAction3d_Nothing: { - case CurAction3d_Nothing: - myXmax = point.x(); - myYmax = point.y(); - DrawRectangle( myXmin, myYmin, myXmax, myYmax, Standard_False ); - if ( nFlags & MULTISELECTIONKEY ) - MultiDragEvent( myXmax, myYmax, 0 ); - else - DragEvent( myXmax, myYmax, 0 ); - DrawRectangle( myXmin, myYmin, myXmax, myYmax, Standard_True ); - break; - case CurAction3d_DynamicZooming: - myView->Zoom( myXmax, myYmax, point.x(), point.y() ); - myXmax = point.x(); - myYmax = point.y(); - break; - case CurAction3d_WindowZooming: - myXmax = point.x(); - myYmax = point.y(); - DrawRectangle( myXmin, myYmin, myXmax, myYmax, Standard_False ); - DrawRectangle( myXmin, myYmin, myXmax, myYmax, Standard_True ); - break; - case CurAction3d_DynamicPanning: - myView->Pan( point.x() - myXmax, myYmax - point.y() ); - myXmax = point.x(); - myYmax = point.y(); - break; - case CurAction3d_GlobalPanning: - break; - case CurAction3d_DynamicRotation: - myView->Rotation( point.x(), point.y() ); - myView->Redraw(); - break; - default: - throw Standard_Failure( "incompatible Current Mode" ); - break; - } + noActiveActions(); + myMouseGestureMap = myDefaultGestures; + break; } - else + case CurAction3d_DynamicZooming: { - myXmax = point.x(); - myYmax = point.y(); - if ( nFlags & MULTISELECTIONKEY ) - MultiMoveEvent( point.x(), point.y() ); - else - MoveEvent( point.x(), point.y() ); + myMouseGestureMap.Bind (Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_Zoom); + break; } -} - -void View::DragEvent( const int x, const int y, const int TheState ) -{ - // TheState == -1 button down - // TheState == 0 move - // TheState == 1 button up - - static Standard_Integer theButtonDownX = 0; - static Standard_Integer theButtonDownY = 0; - - if ( TheState == -1 ) + case CurAction3d_GlobalPanning: { - theButtonDownX = x; - theButtonDownY = y; + break; } - - if ( TheState == 1 ) + case CurAction3d_WindowZooming: { - myContext->Select( theButtonDownX, theButtonDownY, x, y, myView, Standard_True ); - emit selectionChanged(); + myMouseGestureMap.Bind (Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_ZoomWindow); + break; } -} - -void View::InputEvent( const int /*x*/, const int /*y*/ ) -{ - myContext->Select (Standard_True); - emit selectionChanged(); -} - -void View::MoveEvent( const int x, const int y ) -{ - myContext->MoveTo( x, y, myView, Standard_True ); -} - -void View::MultiMoveEvent( const int x, const int y ) -{ - myContext->MoveTo( x, y, myView, Standard_True ); -} - -void View::MultiDragEvent( const int x, const int y, const int TheState ) -{ - static Standard_Integer theButtonDownX = 0; - static Standard_Integer theButtonDownY = 0; - - if ( TheState == -1 ) + case CurAction3d_DynamicPanning: { - theButtonDownX = x; - theButtonDownY = y; + myMouseGestureMap.Bind (Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_Pan); + break; } - if ( TheState == 0 ) + case CurAction3d_DynamicRotation: { - myContext->ShiftSelect( theButtonDownX, theButtonDownY, x, y, myView, Standard_True ); - emit selectionChanged(); + myMouseGestureMap.Bind (Aspect_VKeyMouse_LeftButton, aRot); + break; } -} - -void View::MultiInputEvent( const int /*x*/, const int /*y*/ ) -{ - myContext->ShiftSelect (Standard_True); - emit selectionChanged(); + } } void View::Popup( const int /*x*/, const int /*y*/ ) @@ -930,49 +784,6 @@ { } -void View::DrawRectangle(const int MinX, const int MinY, - const int MaxX, const int MaxY, const bool Draw) -{ - static Standard_Integer StoredMinX, StoredMaxX, StoredMinY, StoredMaxY; - static Standard_Boolean m_IsVisible; - - StoredMinX = (MinX < MaxX) ? MinX: MaxX ; - StoredMinY = (MinY < MaxY) ? MinY: MaxY ; - StoredMaxX = (MinX > MaxX) ? MinX: MaxX ; - StoredMaxY = (MinY > MaxY) ? MinY: MaxY ; - - QRect aRect; - aRect.setRect( StoredMinX, StoredMinY, abs(StoredMaxX-StoredMinX), abs(StoredMaxY-StoredMinY)); - - if ( !myRectBand ) - { - myRectBand = new QRubberBand( QRubberBand::Rectangle, this ); - myRectBand->setStyle( QStyleFactory::create("windows") ); - myRectBand->setGeometry( aRect ); - myRectBand->show(); - - /*QPalette palette; - palette.setColor(myRectBand->foregroundRole(), Qt::white); - myRectBand->setPalette(palette);*/ - } - - if ( m_IsVisible && !Draw ) // move or up : erase at the old position - { - myRectBand->hide(); - delete myRectBand; - myRectBand = 0; - m_IsVisible = false; - } - - if (Draw) // move : draw - { - //aRect.setRect( StoredMinX, StoredMinY, abs(StoredMaxX-StoredMinX), abs(StoredMaxY-StoredMinY)); - m_IsVisible = true; - myRectBand->setGeometry( aRect ); - //myRectBand->show(); - } -} - void View::noActiveActions() { for ( int i = ViewFitAllId; i < ViewHlrOffId ; i++ ) @@ -1052,6 +863,3 @@ { return myCurrentMode; } - - - diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Common/src/View.h opencascade-7.5.1+dfsg1/samples/qt/Common/src/View.h --- opencascade-7.4.1+dfsg1/samples/qt/Common/src/View.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Common/src/View.h 2021-02-02 08:51:56.000000000 +0000 @@ -8,13 +8,14 @@ #include #include +#include #include class TopoDS_Shape; class QRubberBand; //class COMMONSAMPLE_EXPORT View: public QWidget -class View: public QWidget +class View: public QWidget, protected AIS_ViewController { Q_OBJECT protected: @@ -95,6 +96,7 @@ virtual void mousePressEvent( QMouseEvent* ); virtual void mouseReleaseEvent(QMouseEvent* ); virtual void mouseMoveEvent( QMouseEvent* ); + virtual void wheelEvent (QWheelEvent* ); virtual void addItemInPopup( QMenu* ); @@ -103,48 +105,41 @@ void activateCursor( const CurrentAction3d ); void Popup( const int x, const int y ); CurrentAction3d getCurrentMode(); + void updateView(); - virtual void onLButtonDown( const int nFlags, const QPoint point ); - virtual void onMButtonDown( const int nFlags, const QPoint point ); - virtual void onRButtonDown( const int nFlags, const QPoint point ); - virtual void onLButtonUp( Qt::MouseButtons nFlags, const QPoint point ); - virtual void onMButtonUp( Qt::MouseButtons nFlags, const QPoint point ); - virtual void onRButtonUp( Qt::MouseButtons nFlags, const QPoint point ); - virtual void onMouseMove( Qt::MouseButtons nFlags, const QPoint point ); + //! Setup mouse gestures. + void defineMouseGestures(); + + //! Set current action. + void setCurrentAction (CurrentAction3d theAction) + { + myCurrentMode = theAction; + defineMouseGestures(); + } + + //! Handle selection changed event. + void OnSelectionChanged (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) Standard_OVERRIDE; private: void initCursors(); void initViewActions(); void initRaytraceActions(); - void DragEvent( const int x, const int y, const int TheState ); - void InputEvent( const int x, const int y ); - void MoveEvent( const int x, const int y ); - void MultiMoveEvent( const int x, const int y ); - void MultiDragEvent( const int x, const int y, const int TheState ); - void MultiInputEvent( const int x, const int y ); - void DrawRectangle( const int MinX, const int MinY, - const int MaxX, const int MaxY, const bool Draw ); - private: bool myIsRaytracing; bool myIsShadowsEnabled; bool myIsReflectionsEnabled; bool myIsAntialiasingEnabled; - bool myDrawRect; // set when a rect is used for selection or magnify Handle(V3d_View) myView; Handle(AIS_InteractiveContext) myContext; + AIS_MouseGestureMap myDefaultGestures; + Graphic3d_Vec2i myClickPos; CurrentAction3d myCurrentMode; - Standard_Integer myXmin; - Standard_Integer myYmin; - Standard_Integer myXmax; - Standard_Integer myYmax; Standard_Real myCurZoom; - Standard_Boolean myHlrModeIsOn; QList* myViewActions; QList* myRaytraceActions; QMenu* myBackMenu; - QRubberBand* myRectBand; //!< selection rectangle rubber band }; #endif diff -Nru opencascade-7.4.1+dfsg1/samples/qt/IESample/custom.bat opencascade-7.5.1+dfsg1/samples/qt/IESample/custom.bat --- opencascade-7.4.1+dfsg1/samples/qt/IESample/custom.bat 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/IESample/custom.bat 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -@echo off -rem Define QTDIR variable - -set "QTDIR=" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/IESample/custom.bat.template opencascade-7.5.1+dfsg1/samples/qt/IESample/custom.bat.template --- opencascade-7.4.1+dfsg1/samples/qt/IESample/custom.bat.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/IESample/custom.bat.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,5 @@ +@echo off +rem Rename this file to custom.bat, +rem and define QTDIR variable. + +set "QTDIR=" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/IESample/custom.sh opencascade-7.5.1+dfsg1/samples/qt/IESample/custom.sh --- opencascade-7.4.1+dfsg1/samples/qt/IESample/custom.sh 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/IESample/custom.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -#!/bin/bash -#Define QTDIR variable - -export QTDIR="" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/IESample/custom.sh.template opencascade-7.5.1+dfsg1/samples/qt/IESample/custom.sh.template --- opencascade-7.4.1+dfsg1/samples/qt/IESample/custom.sh.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/IESample/custom.sh.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,5 @@ +#!/bin/bash +# Rename this file to custom.sh, +# and define QTDIR variable. + +export QTDIR="" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/IESample/env.bat opencascade-7.5.1+dfsg1/samples/qt/IESample/env.bat --- opencascade-7.4.1+dfsg1/samples/qt/IESample/env.bat 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/IESample/env.bat 2021-02-02 08:51:56.000000000 +0000 @@ -1,8 +1,10 @@ @echo off -call "%~dp0..\..\..\env.bat" %1 %2 %3 +if exist "%~dp0custom.bat" ( + call "%~dp0custom.bat" %1 %2 %3 +) -call "custom.bat" %1 %2 %3 +call "%~dp0..\..\..\env.bat" %1 %2 %3 set "RES_DIR=%~dp0win%ARCH%\%VCVER%\res" set "CSF_ResourcesDefaults=%RES_DIR%" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/IESample/.gitignore opencascade-7.5.1+dfsg1/samples/qt/IESample/.gitignore --- opencascade-7.4.1+dfsg1/samples/qt/IESample/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/IESample/.gitignore 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,7 @@ +/debug +/release +*.sln +*.vcxproj* +.qmake.stash +/custom.bat +/custom.sh diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/CMakeLists.txt opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/CMakeLists.txt --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/CMakeLists.txt 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,8 @@ +project(OCCTOverview) + +OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_sample) +include_directories("${CMAKE_SOURCE_DIR}/${RELATIVE_DIR}/../OCCTOverview/code") +OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit) +OCCT_INCLUDE_CMAKE_FILE (adm/cmake/occt_toolkit_prepare_sample) + +ADD_DEFINITIONS(-DNO_COMMONSAMPLE_EXPORTS -DNO_IESAMPLE_EXPORTS) diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/custom.bat.template opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/custom.bat.template --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/custom.bat.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/custom.bat.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,7 @@ +@echo off +rem Rename this file to custom.bat, +rem define QTDIR variable - path to Qt directory +rem and CASROOT variable - path to Open CASCADE installation directory. + +set "CASROOT=%~dp0../../.." +set "QTDIR=" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/custom.sh.template opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/custom.sh.template --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/custom.sh.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/custom.sh.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,9 @@ +#!/bin/bash +# Rename this file to custom.sh, +# define QTDIR variable - path to QT directory +# and CASROOT variable - path to CasCade installation directory. + +aScriptPath=${BASH_SOURCE%/*} + +export CASROOT=${aScriptPath}/../../.. +export QTDIR= diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/env.bat opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/env.bat --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/env.bat 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/env.bat 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,31 @@ +@echo off + +if exist "%~dp0custom.bat" ( + call "%~dp0custom.bat" %1 %2 %3 +) + +call "%CASROOT%\env.bat" %1 %2 %3 +if /I ["%1"] == ["vc141"] set "VCVER=vc141" +if /I ["%1"] == ["vc142"] set "VCVER=vc142" +set "BIN_DIR=win%ARCH%\%VCVER%\bind" +set "LIB_DIR=win%ARCH%\%VCVER%\libd" + +if ["%CASDEB%"] == [""] ( + set "BIN_DIR=win%ARCH%\%VCVER%\bin" + set "LIB_DIR=win%ARCH%\%VCVER%\lib" +) + +set "PATH=%~dp0%BIN_DIR%;%PATH%" + +if not "%QTDIR%" == "" ( + set "RES_DIR=%~dp0win%ARCH%\%VCVER%\res" + + set "CSF_ResourcesDefaults=!RES_DIR!" + set "CSF_TutorialResourcesDefaults=!RES_DIR!" + set "CSF_IEResourcesDefaults=!RES_DIR!" + + set "PATH=%QTDIR%/bin;%PATH%" + set "QT_QPA_PLATFORM_PLUGIN_PATH=%QTDIR%\plugins\platforms" +) + +set "CSF_OCCTOverviewSampleCodePath=%~dp0..\..\OCCTOverview\code" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/env.sh opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/env.sh --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/env.sh 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/env.sh 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,25 @@ +#!/bin/bash + +export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +if [ -e "custom.sh" ]; then + source "custom.sh" $*; +fi + +source ${CASROOT}/bin/env.sh $* + +if [ "${QTDIR}" != "" ]; then + export PATH=${QTDIR}/bin:${PATH} +else + aQMakePath=`which qmake` + echo "Environment variable \"QTDIR\" not defined.. Define it in \"custom.sh\" script." + if [ -x "$aQMakePath" ]; then + echo "qmake from PATH will be used instead." + else + exit 1 + fi +fi + +host=`uname -s` +export STATION=$host +export RES_DIR=${aSamplePath}/${STATION}/res diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/EXTERNLIB opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/EXTERNLIB --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/EXTERNLIB 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/EXTERNLIB 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,33 @@ +TKBRep +TKBin +TKBool +TKBO +TKCDF +TKFillet +TKG2d +TKG3d +TKGeomAlgo +TKGeomBase +TKernel +TKHLR +TKIGES +TKMath +TKMesh +TKOffset +TKOpenGl +TKPrim +TKService +TKShHealing +TKSTEP +TKSTEP209 +TKSTEPAttr +TKSTEPBase +TKSTL +TKTopAlgo +TKV3d +TKVRML +TKXSBase +TKLCAF +TKCAF +TKVCAF +TKXml diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/FILES opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/FILES --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/FILES 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2 @@ +EXTERNLIB +PACKAGES diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/genproj.bat opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/genproj.bat --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/genproj.bat 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/genproj.bat 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,17 @@ +@echo off +REM Generation of vcproj files with qmake utilite +REM Variable QTDIR and PATH to qmake executable must be defined without fail + +REM Use first argument to specify version of Visual Studio (vc10, vc11, vc12 or vc14), +REM second argument specifies architecture) (win32 or win64) +REM third argument specifies Debug or Release mode + +call "%~dp0env.bat" %1 %2 %3 + +if ["%VCARCH%"] == [""] set "VCARCH=%ARCH%" +if ["%VCARCH%"] == ["64"] set "VCARCH=amd64" +if ["%VCARCH%"] == ["32"] set "VCARCH=x86" + +call "%VCVARS%" %VCARCH% + +qmake -tp vc -r -o OCCTOverview.sln OCCTOverview0.pro diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/.gitignore opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/.gitignore --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/.gitignore 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,7 @@ +/debug +/release +*.sln +*.vcxproj* +.qmake.stash +/custom.bat +/custom.sh diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/make.sh opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/make.sh --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/make.sh 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/make.sh 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,16 @@ +#!/bin/bash + +export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh" $*; fi + +cd $aSamplePath +qmake OCCTOverview.pro +if [ "$(uname -s)" != "Darwin" ] || [ "$MACOSX_USE_GLX" == "true" ]; then + aNbJobs="$(getconf _NPROCESSORS_ONLN)" + if [ "${CASDEB}" == "d" ]; then + make -j $aNbJobs debug + else + make -j $aNbJobs release + fi +fi diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/msvc.bat opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/msvc.bat --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/msvc.bat 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/msvc.bat 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,19 @@ +@echo off + +Setlocal EnableDelayedExpansion + +rem Setup environment +call "%~dp0env.bat" %1 %2 %3 + +rem Define path to project file +set "PRJFILE=%~dp0OCCTOverview.sln" + +rem Launch Visual Studio - either professional (devenv) or Express, as available +if exist "%DevEnvDir%\devenv.exe" ( + start "" "%DevEnvDir%\devenv.exe" "%PRJFILE%" +) else if exist "%DevEnvDir%\%VisualStudioExpressName%.exe" ( + start "" "%DevEnvDir%\%VisualStudioExpressName%.exe" "%PRJFILE%" +) else ( + echo Error: Could not find MS Visual Studio ^(%VCVER%^) + echo Check relevant environment variable ^(e.g. VS100COMNTOOLS for vc10^) +) diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/OCCTOverview0.pro opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/OCCTOverview0.pro --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/OCCTOverview0.pro 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/OCCTOverview0.pro 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,5 @@ +TEMPLATE=subdirs + +SUBDIRS=OCCTOverview0 + +OCCTOverview0.file=OCCTOverview.pro diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/OCCTOverview.pro opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/OCCTOverview.pro --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/OCCTOverview.pro 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/OCCTOverview.pro 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,90 @@ +TEMPLATE = app +CONFIG += debug_and_release qt +CONFIG += lrelease +CONFIG += embed_translations +QT += xml +greaterThan(QT_MAJOR_VERSION, 4) { + QT += widgets +} + +TARGET = OCCTOverview + +SAMPLESROOT = $$quote($$(CSF_OCCTSamplesPath)/qt) + + +HEADERS = ./src/*.h \ + $${SAMPLESROOT}/../OCCTOverview/code/*.h + +SOURCES = ./src/*.cxx \ + $${SAMPLESROOT}/../OCCTOverview/code/*.cxx + +RESOURCES += $${SAMPLESROOT}/../OCCTOverview/code/Samples.qrc +RESOURCES += ./src/OCCTOverview.qrc + +RES_DIR = $$quote($$(RES_DIR)) + +INCLUDEPATH += $$quote($$(CSF_SampleSources)) +INCLUDEPATH += $$quote($$(CSF_OCCTIncludePath)) \ + $${SAMPLESROOT}/../OCCTOverview/code + + +OCCT_DEFINES = $$(CSF_DEFINES) + +DEFINES = $$split(OCCT_DEFINES, ;) + +unix { + UNAME = $$system(uname -s) + LIBLIST = $$(LD_LIBRARY_PATH) + LIBPATHS = $$split(LIBLIST,":") + for(lib, LIBPATHS):LIBS += -L$${lib} + + CONFIG(debug, debug|release) { + DESTDIR = ./$$UNAME/bind + OBJECTS_DIR = ./$$UNAME/objd + MOC_DIR = ./$$UNAME/mocd + } else { + DESTDIR = ./$$UNAME/bin + OBJECTS_DIR = ./$$UNAME/obj + MOC_DIR = ./$$UNAME/moc + } + + MACOSX_USE_GLX = $$(MACOSX_USE_GLX) + + !macx | equals(MACOSX_USE_GLX, true): INCLUDEPATH += $$QMAKE_INCDIR_X11 $$QMAKE_INCDIR_OPENGL $$QMAKE_INCDIR_THREAD + equals(MACOSX_USE_GLX, true): DEFINES += MACOSX_USE_GLX + DEFINES += OCC_CONVERT_SIGNALS QT_NO_STL + !macx | equals(MACOSX_USE_GLX, true): LIBS += -L$$QMAKE_LIBDIR_X11 $$QMAKE_LIBS_X11 -L$$QMAKE_LIBDIR_OPENGL $$QMAKE_LIBS_OPENGL $$QMAKE_LIBS_THREAD + + QMAKE_CXXFLAGS += -std=gnu++11 +} + +win32 { + CONFIG(debug, debug|release) { + DEFINES += _DEBUG + DESTDIR = ./win$$(ARCH)/$$(VCVER)/bind + OBJECTS_DIR = ./win$$(ARCH)/$$(VCVER)/objd + MOC_DIR = ./win$$(ARCH)/$$(VCVER)/mocd + } else { + DEFINES += NDEBUG + DESTDIR = ./win$$(ARCH)/$$(VCVER)/bin + OBJECTS_DIR = ./win$$(ARCH)/$$(VCVER)/obj + MOC_DIR = ./win$$(ARCH)/$$(VCVER)/moc + } + LIBS = -L$$(QTDIR)/lib;$$(CSF_OCCTLibPath) + DEFINES += NO_COMMONSAMPLE_EXPORTS NO_IESAMPLE_EXPORTS +} + +LIBS += -lTKernel -lTKMath -lTKService -lTKV3d -lTKOpenGl \ + -lTKBRep -lTKIGES -lTKSTL -lTKVRML -lTKSTEP -lTKSTEPAttr -lTKSTEP209 \ + -lTKSTEPBase -lTKGeomBase -lTKGeomAlgo -lTKG3d -lTKG2d \ + -lTKXSBase -lTKShHealing -lTKHLR -lTKTopAlgo -lTKMesh -lTKPrim \ + -lTKCDF -lTKBool -lTKBO -lTKFillet -lTKOffset -lTKLCAF -lTKCAF -lTKVCAF \ + -lTKBin -lTKXml + +!exists($${RES_DIR}) { + win32 { + system(mkdir $${RES_DIR}) + } else { + system(mkdir -p $${RES_DIR}) + } +} diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/PACKAGES opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/PACKAGES --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/PACKAGES 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/PACKAGES 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2 @@ +OCCTOverview/src +/../OCCTOverview/code diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/ReadMe.md opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/ReadMe.md --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/ReadMe.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/ReadMe.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,58 @@ +Qt OCCT Overview samples {#samples_qt_overview} +========== + +1. Contents +----------------------- + +The directory samples/qt/OCCTOverview contains the folders and files of the Qt OCCT Overview application: + +* Files **OCCTOverview.pro** and **OCCTOverview0.pro** are Qt project files. +* File **genproj.bat** to denerate MS Visual Studio project. +* File **msvc.bat** to run MS Visual Studio project. +* File **make.sh** to build of the application on Linux. +* Files **run.bat** and **run.sh** to runn the application. +* Files **env.bat** and **custom.bat** are called from *genproj.bat*, *msvc.bat*, *run.bat*. + File *custom.bat* should be defined by user to provide paths to QT directory and OCCT installation directory (see *custom.bat.template*). +* **src** and **res** directories provide source and resources files. + +The directory samples/OCCTOverview/code contains the source code of samples. + +2. How to build Qt OCCT Overview application +--------------------------------- + +* Edit custom.bat file. It is necessary to define following variables: + * **QTDIR** path to where Qt is installed + * **CASROOT** path to where Open CASCADE binaries are installed. + +* Build the application: + + * On Windows: + * Generate project files: `> genproj.bat vc141 win64 Debug` + * Launch MS Visual Studio: `> msvc.bat vc141 win64 Debug` + * Build the application using MS Visual Studio. + + * On Linux: Launch building of the application by make.sh script + +3. Running the application +-------------------------- + +* On Windows: +~~~~ + > run.bat vc141 win64 Debug +~~~~ + +* On Linux: +~~~~ + > run.sh +~~~~ + +4. How to use the OCCT Overview application: +--------------------------------- + +* To select a samples categogy use the *Category* menu. +* To run concrete sample using the menu to the right of the category menu. +* See on a souce code in the *Sample code* window. Сopy the code if needed. +* See on a sample output in the *Output* window if it exist. +* Zoom, pan and rotate a geometry in the mail window using the mouse. + +See hints how to use the mouse in down hints panel. Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/antialiasing.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/antialiasing.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/cursor_rotate.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/cursor_rotate.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/cursor_zoom.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/cursor_zoom.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/help.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/help.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/lamp.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/lamp.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/raytracing.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/raytracing.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/reflections.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/reflections.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/shadows.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/shadows.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/tool_color.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/tool_color.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/tool_delete.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/tool_delete.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/tool_material.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/tool_material.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/tool_shading.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/tool_shading.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/tool_transparency.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/tool_transparency.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/tool_wireframe.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/tool_wireframe.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_axo.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_axo.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_back.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_back.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_bottom.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_bottom.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_comp_off.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_comp_off.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_comp_on.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_comp_on.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_fitall.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_fitall.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_front.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_front.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_left.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_left.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_reset.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_reset.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_right.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_right.png differ Binary files /tmp/tmp0FJ9aT/VUukmq1AGi/opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/res/view_top.png and /tmp/tmp0FJ9aT/iargJRyqpJ/opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/res/view_top.png differ diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/run.bat opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/run.bat --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/run.bat 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/run.bat 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,23 @@ +Setlocal EnableDelayedExpansion + +call "%~dp0env.bat" %1 %2 %3 %4 + +set "BIN_DIR=win%ARCH%\%VCVER%\bind" +if ["%CASDEB%"] == [""] ( + set "BIN_DIR=win%ARCH%\%VCVER%\bin" +) + +if not exist "%~dp0%BIN_DIR%\OCCTOverview.exe" goto ERR_EXE + +echo Starting OCCTOverview ..... +"%~dp0%BIN_DIR%\OCCTOverview.exe" %4 + +goto END + +:ERR_EXE +echo Executable %~dp0%BIN_DIR%\OCCTOverview.exe not found. +echo Probably you didn't compile the application. +pause +goto END + +:END \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/run.sh opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/run.sh --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/run.sh 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/run.sh 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,37 @@ +#!/bin/bash + +export aSamplePath="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +if [ -e "${aSamplePath}/env.sh" ]; then source "${aSamplePath}/env.sh" $*; fi +cd $aSamplePath + +aSystem=`uname -s` +if [ "$aSystem" == "Darwin" ] && [ "$MACOSX_USE_GLX" != "true" ]; then + if [ "${CASDEB}" == "d" ]; then + BIN_DIR="${aSamplePath}/build/Debug/OCCTOverview.app/Contents/MacOS" + else + BIN_DIR="${aSamplePath}/build/Release/OCCTOverview.app/Contents/MacOS" + fi +else + BIN_DIR="${aSamplePath}/${STATION}/bin${CASDEB}" +fi + +CSF_ResourcesDefaults="${RES_DIR}" +CSF_TutorialResourcesDefaults="${RES_DIR}" + +PATH="${BIN_DIR}:${PATH}" + +export CSF_TutorialResourcesDefaults CSF_ResourcesDefaults +export PATH + +if test ! -r "${BIN_DIR}/OCCTOverview"; then + echo "Executable \"${BIN_DIR}/OCCTOverview\" not found." + if [ "$aSystem" == "Darwin" ] && [ "$MACOSX_USE_GLX" != "true" ]; then + echo "Probably you don't compile the application. Build it with Xcode." + else + echo "Probably you don't compile the application. Execute \"make\"." + fi + exit 1 +fi + +${BIN_DIR}/OCCTOverview diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/ApplicationCommon.cxx opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/ApplicationCommon.cxx --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/ApplicationCommon.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/ApplicationCommon.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,692 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "ApplicationCommon.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +ApplicationCommonWindow::ApplicationCommonWindow (ApplicationType theCategory) +: QMainWindow (nullptr), + myAppType(theCategory), + myStdToolBar (nullptr), + myViewBar (nullptr), + myCasCadeBar (nullptr), + myFilePopup (nullptr), + myCategoryPopup (nullptr) +{ + ALL_CATEGORIES[AppType_Geometry] = "Geometry"; + ALL_CATEGORIES[AppType_Topology] = "Topology"; + ALL_CATEGORIES[AppType_Triangulation] = "Triangulation"; + ALL_CATEGORIES[AppType_DataExchange] = "DataExchange"; + ALL_CATEGORIES[AppType_Ocaf] = "OCAF"; + ALL_CATEGORIES[AppType_Viewer3d] = "3D viewer"; + ALL_CATEGORIES[AppType_Viewer2d] = "2D Viewer"; + + mySampleMapper = new QSignalMapper(this); + myExchangeMapper = new QSignalMapper(this); + myOcafMapper = new QSignalMapper(this); + myViewer3dMapper = new QSignalMapper(this); + myViewer2dMapper = new QSignalMapper(this); + + myCategoryMapper = new QSignalMapper(this); + + connect(mySampleMapper, SIGNAL(mapped(const QString &)), this, SLOT(onProcessSample(const QString &))); + connect(myExchangeMapper, SIGNAL(mapped(const QString &)), this, SLOT(onProcessExchange(const QString &))); + connect(myOcafMapper, SIGNAL(mapped(const QString &)), this, SLOT(onProcessOcaf(const QString &))); + connect(myViewer3dMapper, SIGNAL(mapped(const QString &)), this, SLOT(onProcessViewer3d(const QString &))); + connect(myViewer2dMapper, SIGNAL(mapped(const QString &)), this, SLOT(onProcessViewer2d(const QString &))); + + connect(myCategoryMapper, SIGNAL(mapped(const QString &)), this, SLOT(onChangeCategory(const QString &))); + + setFocusPolicy(Qt::StrongFocus); + + QFont aCodeViewFont; + aCodeViewFont.setFamily("Courier"); + aCodeViewFont.setFixedPitch(true); + aCodeViewFont.setPointSize(10); + + QGroupBox* aCodeFrame = new QGroupBox(tr("Sample code")); + QVBoxLayout* aCodeLayout = new QVBoxLayout(aCodeFrame); + aCodeLayout->setContentsMargins(3, 3, 3, 3); + myCodeView = new QTextEdit(aCodeFrame); + aCodeLayout->addWidget(myCodeView); + myCodeView->setDocumentTitle("Code"); + myCodeView->setLineWrapMode(QTextEdit::NoWrap); + myCodeView->setReadOnly(true); + myCodeView->setFont(aCodeViewFont); + myCodeViewHighlighter = new OcctHighlighter(myCodeView->document()); + + QGroupBox* aResultFrame = new QGroupBox(tr("Output")); + QVBoxLayout* aResultLayout = new QVBoxLayout(aResultFrame); + aResultLayout->setContentsMargins(3, 3, 3, 3); + myResultView = new QTextEdit(aResultFrame); + aResultLayout->addWidget(myResultView); + myResultView->setDocumentTitle("Output"); + myResultView->setReadOnly(true); + myResultView->setFont(aCodeViewFont); + + QSplitter* aCodeResultSplitter = new QSplitter(Qt::Vertical); + aCodeResultSplitter->addWidget(aCodeFrame); + aCodeResultSplitter->addWidget(aResultFrame); + + myDocument3d = createNewDocument(); + myDocument2d = createNewDocument(); + + QFrame* aViewFrame = new QFrame; + aViewFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken); + aViewFrame->setLineWidth(3); + QVBoxLayout* aViewLayout = new QVBoxLayout(aViewFrame); + aViewLayout->setContentsMargins(0, 0, 0, 0); + myGeomWidget = new GeomWidget(myDocument3d, myDocument2d, aViewFrame); + aViewLayout->addWidget(myGeomWidget); + + myGeomWidget->setContentsMargins(0, 0, 0, 0); + QSplitter* aGeomTextSplitter = new QSplitter(Qt::Horizontal); + + aGeomTextSplitter->addWidget(aViewFrame); + aGeomTextSplitter->addWidget(aCodeResultSplitter); + aGeomTextSplitter->setStretchFactor(0, 1); + aGeomTextSplitter->setStretchFactor(1, 1); + QList aSizeList; + aSizeList.append(640); + aSizeList.append(640); + aGeomTextSplitter->setSizes(aSizeList); + setCentralWidget(aGeomTextSplitter); + +#include + Q_INIT_RESOURCE(Samples); +#include + + TCollection_AsciiString aSampleSourcePach = getSampleSourceDir(); + myGeometrySamples = new GeometrySamples(aSampleSourcePach, + myDocument3d->getContext()); + myTopologySamples = new TopologySamples(aSampleSourcePach, + myDocument3d->getContext()); + myTriangulationSamples = new TriangulationSamples(aSampleSourcePach, + myDocument3d->getContext()); + myDataExchangeSamples = new DataExchangeSamples(aSampleSourcePach, + myGeomWidget->Get3dView(), + myDocument3d->getContext()); + myOcafSamples = new OcafSamples(aSampleSourcePach, + myDocument3d->getViewer(), + myDocument3d->getContext()); + myViewer3dSamples = new Viewer3dSamples(aSampleSourcePach, + myGeomWidget->Get3dView(), + myDocument3d->getContext()); + myViewer2dSamples = new Viewer2dSamples(aSampleSourcePach, + myGeomWidget->Get2dView(), + myDocument2d->getViewer(), + myDocument2d->getContext()); + + + MenuFormXml(":/menus/Geometry.xml", mySampleMapper, myGeometryMenus); + MenuFormXml(":/menus/Topology.xml", mySampleMapper, myTopologyMenus); + MenuFormXml(":/menus/Triangulation.xml", mySampleMapper, myTriangulationMenus); + MenuFormXml(":/menus/DataExchange.xml", myExchangeMapper, myDataExchangeMenus); + MenuFormXml(":/menus/Ocaf.xml", myOcafMapper, myOcafMenus); + MenuFormXml(":/menus/Viewer3d.xml", myViewer3dMapper, myViewer3dMenus); + MenuFormXml(":/menus/Viewer2d.xml", myViewer2dMapper, myViewer2dMenus); + + onChangeCategory(ALL_CATEGORIES[myAppType]); + + resize(1280, 560); +} + +void ApplicationCommonWindow::RebuildMenu() +{ + menuBar()->clear(); + + myStdActions[StdActions_FileQuit] = CreateAction("Quit", "CTRL+Q"); + connect(myStdActions[StdActions_FileQuit], SIGNAL(triggered()), this, SLOT(onCloseAllWindows())); + myStdActions[StdActions_HelpAbout] = CreateAction("About", "F1", ":/icons/help.png"); + connect(myStdActions[StdActions_HelpAbout], SIGNAL(triggered()), this, SLOT(onAbout())); + + // populate a menu with all actions + myFilePopup = new QMenu(this); + myFilePopup = menuBar()->addMenu(tr("&File")); + myFilePopup->addAction(myStdActions[StdActions_FileQuit]); + + myCategoryPopup = new QMenu(this); + myCategoryPopup = menuBar()->addMenu(tr("&Category")); + + foreach (ApplicationType aCategory, ALL_CATEGORIES.keys()) + { + QString aCategoryName = ALL_CATEGORIES.value(aCategory); + QAction* anAction = myCategoryPopup->addAction(aCategoryName); + anAction->setText(aCategoryName); + myCategoryMapper->setMapping(anAction, aCategoryName); + connect(anAction, SIGNAL(triggered()), myCategoryMapper, SLOT(map())); + myCategoryPopup->addAction(anAction); + myCategoryActions.insert(aCategory, anAction); + } + + foreach (QMenu* aSampleMenu, GetCurrentMenus()) + { + menuBar()->addMenu(aSampleMenu); + } + + // add a help menu + QMenu* aHelp = new QMenu(this); + menuBar()->addSeparator(); + aHelp = menuBar()->addMenu(tr("&Help")); + aHelp->addAction(myStdActions[StdActions_HelpAbout]); +} + +Handle(BaseSample) ApplicationCommonWindow::GetCurrentSamples() +{ + switch (myAppType) + { + case AppType_Geometry: return myGeometrySamples; + case AppType_Topology: return myTopologySamples; + case AppType_Triangulation: return myTriangulationSamples; + case AppType_DataExchange: return myDataExchangeSamples; + case AppType_Ocaf: return myOcafSamples; + case AppType_Viewer2d: return myViewer2dSamples; + case AppType_Viewer3d: return myViewer3dSamples; + case AppType_Unknown: + break; + } + throw QString("Unknown Application type"); +} + +const QList& ApplicationCommonWindow::GetCurrentMenus() +{ + switch (myAppType) + { + case AppType_Geometry: return myGeometryMenus; + case AppType_Topology: return myTopologyMenus; + case AppType_Triangulation: return myTriangulationMenus; + case AppType_DataExchange: return myDataExchangeMenus; + case AppType_Ocaf: return myOcafMenus; + case AppType_Viewer2d: return myViewer2dMenus; + case AppType_Viewer3d: return myViewer3dMenus; + case AppType_Unknown: + break; + } + throw QString("Unknown Application type"); +} + +DocumentCommon* ApplicationCommonWindow::createNewDocument() +{ + return new DocumentCommon(this); +} + +void ApplicationCommonWindow::onChangeCategory(const QString& theCategory) +{ + myAppType = ALL_CATEGORIES.key(theCategory); + setWindowTitle(ALL_CATEGORIES[myAppType]); + + myOcafSamples->ClearExtra(); + myViewer3dSamples->ClearExtra(); + myViewer2dSamples->ClearExtra(); + + GetCurrentSamples()->Clear(); + myDocument3d->Clear(); + myDocument2d->Clear(); + + myCodeView->setPlainText(""); + myResultView->setPlainText(""); + GetCurrentSamples()->AppendCube(); + myDocument3d->SetObjects(GetCurrentSamples()->Get3dObjects()); + myGeomWidget->FitAll(); + + RebuildMenu(); + + switch (myAppType) + { + case AppType_DataExchange: + { + myDataExchangeSamples->AppendBottle(); + myDocument3d->SetObjects(GetCurrentSamples()->Get3dObjects()); + myGeomWidget->Show3d(); + break; + } + case AppType_Ocaf: + { + onProcessOcaf("CreateOcafDocument"); + myGeomWidget->Show3d(); + break; + } + case AppType_Viewer2d: + { + myGeomWidget->Show2d(); + break; + } + case AppType_Viewer3d: + { + myViewer3dSamples->AppendBottle(); + myDocument3d->SetObjects(GetCurrentSamples()->Get3dObjects()); + myGeomWidget->Show3d(); + break; + } + case AppType_Geometry: + case AppType_Topology: + case AppType_Triangulation: + case AppType_Unknown: + { + break; + } + } +} + +void ApplicationCommonWindow::onAbout() +{ + QMessageBox::information(this, tr("OCCT Overview"), + tr("Qt based application to study OpenCASCADE Technology"), + tr("Ok"), QString::null, QString::null, 0, 0); +} + +TCollection_AsciiString ApplicationCommonWindow::getSampleSourceDir() +{ + TCollection_AsciiString aSampleSourceDir = OSD_Environment("CSF_OCCTOverviewSampleCodePath").Value(); + if (aSampleSourceDir.IsEmpty()) + { + TCollection_AsciiString aCasRoot = OSD_Environment("CASROOT").Value(); + if (!aCasRoot.IsEmpty()) + { + aSampleSourceDir = aCasRoot + "/samples/OCCTOverview/code"; + } + } + return aSampleSourceDir; +} + +QAction* ApplicationCommonWindow::CreateAction (const QString& theActionName, + const QString& theShortcut, + const QString& theIconName) +{ + QAction* aAction(NULL); + if (theIconName.isEmpty()) + { + aAction = new QAction(theActionName, this); + } + else + { + QPixmap aIcon = QPixmap(theIconName); + aAction = new QAction(aIcon, theActionName, this); + } + aAction->setToolTip(theActionName); + aAction->setStatusTip(theActionName); + aAction->setShortcut(theShortcut); + + return aAction; +} + +template +QAction* ApplicationCommonWindow::CreateSample (PointerToMemberFunction theHandlerMethod, + const char* theActionName) +{ + QAction* anAction = new QAction(QObject::tr(theActionName), this); + connect(anAction, SIGNAL(triggered()), this, SLOT(theHandlerMethod())); + return anAction; +} + +void ApplicationCommonWindow::resizeEvent(QResizeEvent* e) +{ + QMainWindow::resizeEvent(e); + statusBar()->setSizeGripEnabled(!isMaximized()); +} + +void ApplicationCommonWindow::onProcessSample(const QString& theSampleName) +{ + QApplication::setOverrideCursor(Qt::WaitCursor); + setWindowTitle(ALL_CATEGORIES[myAppType] + " - " + theSampleName); + GetCurrentSamples()->Process(theSampleName.toUtf8().data()); + myDocument3d->SetObjects(GetCurrentSamples()->Get3dObjects()); + myDocument2d->SetObjects(GetCurrentSamples()->Get2dObjects()); + myCodeView->setPlainText(GetCurrentSamples()->GetCode().ToCString()); + myResultView->setPlainText(GetCurrentSamples()->GetResult().ToCString()); + myGeomWidget->FitAll(); + QApplication::restoreOverrideCursor(); +} + +void ApplicationCommonWindow::onProcessExchange(const QString& theSampleName) +{ + setWindowTitle(ALL_CATEGORIES[myAppType] + " - " + theSampleName); + int aMode = 0; + QString aFileName = selectFileName(theSampleName, getDataExchangeDialog(theSampleName), aMode); + if (aFileName.isEmpty()) + { + return; + } + + QApplication::setOverrideCursor(Qt::WaitCursor); + myDataExchangeSamples->SetFileName(aFileName.toUtf8().data()); + myDataExchangeSamples->SetStepType(static_cast(aMode)); + myDataExchangeSamples->Process(theSampleName.toUtf8().data()); + myDocument3d->SetObjects(myDataExchangeSamples->Get3dObjects()); + myDocument2d->SetObjects(myDataExchangeSamples->Get2dObjects()); + myCodeView->setPlainText(myDataExchangeSamples->GetCode().ToCString()); + myResultView->setPlainText(myDataExchangeSamples->GetResult().ToCString()); + myGeomWidget->FitAll(); + QApplication::restoreOverrideCursor(); +} + +void ApplicationCommonWindow::onProcessOcaf(const QString& theSampleName) +{ + setWindowTitle(ALL_CATEGORIES[myAppType] + " - " + theSampleName); + + if (theSampleName.indexOf("Dialog") == 0) + { + int aMode = 0; // not used + QString aFileName = selectFileName(theSampleName, getOcafDialog(theSampleName), aMode); + if (aFileName.isEmpty()) + { + return; + } + myOcafSamples->SetFileName(aFileName.toUtf8().data()); + } + QApplication::setOverrideCursor(Qt::WaitCursor); + myOcafSamples->Process(theSampleName.toUtf8().data()); + myDocument2d->SetObjects(myOcafSamples->Get2dObjects()); + myCodeView->setPlainText(myOcafSamples->GetCode().ToCString()); + myResultView->setPlainText(myOcafSamples->GetResult().ToCString()); + QApplication::restoreOverrideCursor(); +} + +void ApplicationCommonWindow::onProcessViewer3d(const QString& theSampleName) +{ + setWindowTitle(ALL_CATEGORIES[myAppType] + " - " + theSampleName); + + QApplication::setOverrideCursor(Qt::WaitCursor); + myViewer3dSamples->Process(theSampleName.toUtf8().data()); + myCodeView->setPlainText(myViewer3dSamples->GetCode().ToCString()); + myResultView->setPlainText(myViewer3dSamples->GetResult().ToCString()); + myGeomWidget->FitAll(); + QApplication::restoreOverrideCursor(); +} + +void ApplicationCommonWindow::onProcessViewer2d(const QString& theSampleName) +{ + setWindowTitle(ALL_CATEGORIES[myAppType] + " - " + theSampleName); + + Standard_Boolean anIsFileSample = Viewer2dSamples::IsFileSample(theSampleName.toUtf8().data()); + QString aFileName; + if (anIsFileSample) + { + int aMode = 0; // not used + aFileName = selectFileName(theSampleName, getOcafDialog(theSampleName), aMode); + if (aFileName.isEmpty()) + { + return; + } + + myViewer2dSamples->SetFileName(aFileName.toUtf8().data()); + } + if (!anIsFileSample || (anIsFileSample && !aFileName.isEmpty())) + { + QApplication::setOverrideCursor(Qt::WaitCursor); + myViewer2dSamples->Process(theSampleName.toUtf8().data()); + if (!Viewer2dSamples::IsShadedSample(theSampleName.toUtf8().data())) + { + myDocument2d->SetObjects(myViewer2dSamples->Get2dObjects(), Standard_False); + } + else + { + myDocument2d->SetObjects(myViewer2dSamples->Get2dObjects(), Standard_True); + } + myCodeView->setPlainText(myViewer2dSamples->GetCode().ToCString()); + myResultView->setPlainText(myViewer2dSamples->GetResult().ToCString()); + myGeomWidget->Show2d(); + QApplication::restoreOverrideCursor(); + } + else + { + myResultView->setPlainText("No file selected!"); + } +} + +QString ApplicationCommonWindow::selectFileName(const QString& theSampleName, + TranslateDialog* theDialog, int& theMode) +{ + Q_UNUSED(theSampleName) + + std::shared_ptr aDialog(theDialog); + + int ret = aDialog->exec(); + theMode = aDialog->getMode(); + + qApp->processEvents(); + + QString aFilename; + QStringList aFileNameList; + if (ret != QDialog::Accepted) + { + return aFilename; + } + aFileNameList = aDialog->selectedFiles(); + if (!aFileNameList.isEmpty()) + { + aFilename = aFileNameList[0]; + } + + if (!QFileInfo(aFilename).completeSuffix().length()) + { + QString selFilter = aDialog->selectedNameFilter(); + int idx = selFilter.indexOf("(*."); + if (idx != -1) + { + QString tail = selFilter.mid(idx + 3); + idx = tail.indexOf(" "); + if (idx == -1) + { + idx = tail.indexOf(")"); + } + QString ext = tail.left(idx); + if (ext.length()) + { + aFilename += QString(".") + ext; + } + } + } + + return aFilename; +} + +TranslateDialog* ApplicationCommonWindow::getDataExchangeDialog(const QString& theSampleName) +{ + TranslateDialog* aTranslateDialog = new TranslateDialog(this, 0, true); + TCollection_AsciiString aSampleName(theSampleName.toUtf8().data()); + + if (DataExchangeSamples::IsExportSample(aSampleName)) + { + aTranslateDialog->setWindowTitle("Export file"); + aTranslateDialog->setFileMode(QFileDialog::AnyFile); + aTranslateDialog->setAcceptMode(QFileDialog::AcceptSave); + } + else if (DataExchangeSamples::IsImportSample(aSampleName)) + { + aTranslateDialog->setWindowTitle("Import file"); + aTranslateDialog->setFileMode(QFileDialog::ExistingFile); + aTranslateDialog->setAcceptMode(QFileDialog::AcceptOpen); + } + QString aFormatFilter; + if (DataExchangeSamples::IsBrepSample(aSampleName)) + { + aFormatFilter = "BREP Files(*.brep *.rle)"; + } + else if (DataExchangeSamples::IsStepSample(aSampleName)) + { + aFormatFilter = "STEP Files (*.stp *.step)"; + aTranslateDialog->addMode(STEPControl_ManifoldSolidBrep, "Manifold Solid Brep"); + aTranslateDialog->addMode(STEPControl_FacetedBrep, "Faceted Brep"); + aTranslateDialog->addMode(STEPControl_ShellBasedSurfaceModel, "Shell Based Surface Model"); + aTranslateDialog->addMode(STEPControl_GeometricCurveSet, "Geometric Curve Set"); + } + else if (DataExchangeSamples::IsIgesSample(aSampleName)) + { + aFormatFilter = "IGES Files (*.igs *.iges)"; + } + else if (DataExchangeSamples::IsStlSample(aSampleName)) + { + aFormatFilter = "STL Files (*.stl)"; + } + else if (DataExchangeSamples::IsVrmlSample(aSampleName)) + { + aFormatFilter = "VRML Files (*.vrml)"; + } + else if (DataExchangeSamples::IsImageSample(aSampleName)) + { + aFormatFilter = "All Image Files (*.bmp *.gif *.jpg *.jpeg *.png *.tga)"; + } + QStringList aFilters; + aFilters.append(aFormatFilter); + aFilters.append("All Files(*.*)"); + + aTranslateDialog->setNameFilters(aFilters); + aTranslateDialog->clear(); + return aTranslateDialog; +} + +TranslateDialog* ApplicationCommonWindow::getOcafDialog(const QString& theSampleName) +{ + TranslateDialog* aTranslateDialog = new TranslateDialog(this, 0, true); + TCollection_AsciiString aSampleName(theSampleName.toUtf8().data()); + + if (OcafSamples::IsExportSample(aSampleName)) + { + aTranslateDialog->setWindowTitle("Export file"); + aTranslateDialog->setFileMode(QFileDialog::AnyFile); + aTranslateDialog->setAcceptMode(QFileDialog::AcceptSave); + } + else if (OcafSamples::IsImportSample(aSampleName)) + { + aTranslateDialog->setWindowTitle("Import file"); + aTranslateDialog->setFileMode(QFileDialog::ExistingFile); + aTranslateDialog->setAcceptMode(QFileDialog::AcceptOpen); + } + QStringList aFilters; + if (OcafSamples::IsBinarySample(aSampleName)) + { + aFilters.append("Binary OCAF Sample (*.cbf)"); + } + if (OcafSamples::IsXmlSample(aSampleName)) + { + aFilters.append("XML OCAF Sample (*.xml)"); + } + aFilters.append("All Files(*.*)"); + + aTranslateDialog->setNameFilters(aFilters); + aTranslateDialog->clear(); + return aTranslateDialog; +} + +QMenu* ApplicationCommonWindow::MenuFromDomNode(QDomElement& theItemElement, + QWidget* theParent, + QSignalMapper* theMapper) +{ + QString anItemName = theItemElement.attribute("name"); + QMenu* aMenu = new QMenu(anItemName, theParent); + QDomElement anChildItemElement = theItemElement.firstChildElement("MenuItem"); + QDomElement anSampleElement = theItemElement.firstChildElement("Sample"); + + while(anChildItemElement.isElement()) + { + aMenu->addMenu(MenuFromDomNode(anChildItemElement, aMenu, theMapper)); + anChildItemElement = anChildItemElement.nextSibling().toElement(); + } + + while(anSampleElement.isElement()) + { + QString aSampleName = anSampleElement.attribute("name"); + QString aSampleFunction = anSampleElement.attribute("function"); + QAction* anAction = aMenu->addAction(aSampleFunction); + anAction->setText(aSampleName); + theMapper->setMapping(anAction, aSampleFunction); + connect(anAction, SIGNAL(triggered()), theMapper, SLOT(map())); + anSampleElement = anSampleElement.nextSibling().toElement(); + } + return aMenu; +} + +void ApplicationCommonWindow::MenuFormXml(const QString& thePath, + QSignalMapper* theMapper, + QList& theMunusList) +{ + QDomDocument aDomDocument; + theMunusList.clear(); + QFile aXmlFile(thePath); + QString anErrorMessage; + if (aXmlFile.error() != QFile::NoError) + { + anErrorMessage = aXmlFile.errorString(); + Message::SendFail() << "QFile creating error: " << anErrorMessage.toUtf8().constData(); + aXmlFile.close(); + return; + } + if (!aXmlFile.open(QIODevice::ReadOnly | QIODevice::Text)) + { + Message::SendFail() << "File " << thePath.toUtf8().constData() << " could not open"; + if (aXmlFile.error() != QFile::NoError) + { + anErrorMessage = aXmlFile.errorString(); + Message::SendFail() << "QFile opening error: " << anErrorMessage.toUtf8().constData(); + } + aXmlFile.close(); + return; + } + bool aNamespaceProcessing(false); + QString anErrorMsg; + int anErrorLine(0); + int anErrorColumn(0); + if (!aDomDocument.setContent(&aXmlFile, aNamespaceProcessing, &anErrorMsg, &anErrorLine, &anErrorColumn)) + { + Message::SendFail() << "XML file parsing error: " << anErrorMsg.toStdString() + << " at line: " << anErrorLine << " column: " << anErrorColumn; + aXmlFile.close(); + return; + } + aXmlFile.close(); + + QDomElement aRootElement = aDomDocument.documentElement(); + QDomElement anItemElement = aRootElement.firstChildElement("MenuItem"); + while(!anItemElement.isNull()) + { + theMunusList.push_back(MenuFromDomNode(anItemElement, this, theMapper)); + anItemElement = anItemElement.nextSiblingElement("MenuItem"); + } +} diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/ApplicationCommon.h opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/ApplicationCommon.h --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/ApplicationCommon.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/ApplicationCommon.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,181 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef APPLICATION_COMMON_OVERVIEW_H +#define APPLICATION_COMMON_OVERVIEW_H + +#include "BaseSample.h" +#include "CommonSample.h" +#include "DataExchangeSamples.h" +#include "DocumentCommon.h" +#include "GeometrySamples.h" +#include "GeomWidget.h" +#include "OcafSamples.h" +#include "OcctHighlighter.h" +#include "TopologySamples.h" +#include "TranslateDialog.h" +#include "TriangulationSamples.h" +#include "View.h" +#include "Viewer2dSamples.h" +#include "Viewer3dSamples.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum StdActions +{ + StdActions_FileQuit, + StdActions_HelpAbout +}; + +enum ApplicationType +{ + AppType_Geometry, + AppType_Topology, + AppType_Triangulation, + AppType_DataExchange, + AppType_Ocaf, + AppType_Viewer2d, + AppType_Viewer3d, + AppType_Unknown +}; + + +//! Main application window +class ApplicationCommonWindow: public QMainWindow +{ + Q_OBJECT + +public: + ApplicationCommonWindow(ApplicationType theCategory); + + ApplicationType GetApplicationType() const { return myAppType; } + void SetApplicationType(ApplicationType theApplicationType) { myAppType = theApplicationType; } + + static TCollection_AsciiString getSampleSourceDir(); + +protected: + virtual DocumentCommon* createNewDocument(); + +public slots: + virtual void onAbout(); + virtual void onChangeCategory(const QString& theCategory); + +protected: + QAction* CreateAction(const QString& theActionName, + const QString& theShortcut = "", + const QString& theIconName = ""); + + template + QAction* CreateSample(PointerToMemberFunction theHandlerMethod, + const char* theActionName); + + virtual void resizeEvent( QResizeEvent* ); + QMenu* getFilePopup() { return myFilePopup; } + QToolBar* getCasCadeBar() { return myCasCadeBar; } + + void MenuFormXml (const QString& thePath, + QSignalMapper* theMapper, + QList& theMunusList); + QMenu* MenuFromDomNode(QDomElement& theItemElement, + QWidget* theParent, + QSignalMapper* theMapper); + + +private slots: + void onCloseAllWindows() { qApp->closeAllWindows(); } + + void onProcessSample(const QString& theSampleName); + void onProcessExchange(const QString& theSampleName); + void onProcessOcaf(const QString& theSampleName); + void onProcessViewer3d(const QString& theSampleName); + void onProcessViewer2d(const QString& theSampleName); + +private: + + void RebuildMenu(); + Handle(BaseSample) GetCurrentSamples(); + const QList& GetCurrentMenus(); + + QString selectFileName(const QString& theSampleName, TranslateDialog* theDialog, int& theMode); + TranslateDialog* getDataExchangeDialog(const QString& theSampleName); + TranslateDialog* getOcafDialog(const QString& theSampleName); + +private: + ApplicationType myAppType; + QMap ALL_CATEGORIES; + + Handle(GeometrySamples) myGeometrySamples; + Handle(TopologySamples) myTopologySamples; + Handle(TriangulationSamples) myTriangulationSamples; + Handle(DataExchangeSamples) myDataExchangeSamples; + Handle(OcafSamples) myOcafSamples; + Handle(Viewer3dSamples) myViewer3dSamples; + Handle(Viewer2dSamples) myViewer2dSamples; + + QMap myStdActions; + QMap myCategoryActions; + QMap myMaterialActions; + + QToolBar* myStdToolBar; + QToolBar* myViewBar; + QToolBar* myCasCadeBar; + QMenu* myFilePopup; + QMenu* myCategoryPopup; + + QList myGeometryMenus; + QList myTopologyMenus; + QList myTriangulationMenus; + QList myDataExchangeMenus; + QList myOcafMenus; + QList myViewer3dMenus; + QList myViewer2dMenus; + + QSignalMapper* mySampleMapper; + QSignalMapper* myExchangeMapper; + QSignalMapper* myOcafMapper; + QSignalMapper* myViewer3dMapper; + QSignalMapper* myViewer2dMapper; + + QSignalMapper* myCategoryMapper; + + QTextEdit* myCodeView; + QTextEdit* myResultView; + OcctHighlighter* myCodeViewHighlighter; + + GeomWidget* myGeomWidget; + + DocumentCommon* myDocument3d; + DocumentCommon* myDocument2d; +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/CommonSample.h opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/CommonSample.h --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/CommonSample.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/CommonSample.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,43 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef COMMONSAMPLE_H +#define COMMONSAMPLE_H + +#ifndef NO_COMMONSAMPLE_EXPORTS +#ifdef COMMONSAMPLE_EXPORTS +#ifdef _WIN32 +#define COMMONSAMPLE_EXPORT __declspec( dllexport ) +#else +#define COMMONSAMPLE_EXPORT +#endif +#else +#ifdef _WIN32 +#define COMMONSAMPLE_EXPORT __declspec( dllimport ) +#else +#define COMMONSAMPLE_EXPORT +#endif +#endif +#else +#define COMMONSAMPLE_EXPORT +#endif + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/DocumentCommon.cxx opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/DocumentCommon.cxx --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/DocumentCommon.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/DocumentCommon.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,111 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "DocumentCommon.h" + +#include "ApplicationCommon.h" +#include "Transparency.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +// ======================================================================= +// function : Viewer +// purpose : +// ======================================================================= +Handle(V3d_Viewer) DocumentCommon::Viewer(const Standard_ExtString, + const Standard_CString, + const Standard_Real theViewSize, + const V3d_TypeOfOrientation theViewProj, + const Standard_Boolean theComputedMode, + const Standard_Boolean theDefaultComputedMode) +{ + static Handle(OpenGl_GraphicDriver) aGraphicDriver; + if (aGraphicDriver.IsNull()) + { + Handle(Aspect_DisplayConnection) aDisplayConnection; +#if !defined(_WIN32) && !defined(__WIN32__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) + aDisplayConnection = new Aspect_DisplayConnection(OSD_Environment("DISPLAY").Value()); +#endif + aGraphicDriver = new OpenGl_GraphicDriver(aDisplayConnection); + } + + Handle(V3d_Viewer) aViewer = new V3d_Viewer(aGraphicDriver); + aViewer->SetDefaultViewSize(theViewSize); + aViewer->SetDefaultViewProj(theViewProj); + aViewer->SetComputedMode(theComputedMode); + aViewer->SetDefaultComputedMode(theDefaultComputedMode); + return aViewer; +} + +DocumentCommon::DocumentCommon(ApplicationCommonWindow* theApp) +: QObject (theApp), + myContextIsEmpty(true) +{ + TCollection_ExtendedString a3DName("Visu3D"); + + myViewer = Viewer(a3DName.ToExtString(), "", 1000.0, V3d_XposYnegZpos, Standard_True, Standard_True); + + myViewer->SetDefaultLights(); + myViewer->SetLightOn(); + + myContext = new AIS_InteractiveContext(myViewer); +} + +void DocumentCommon::SetObjects (const NCollection_Vector& theObjects, + Standard_Boolean theDisplayShaded) +{ + myContext->RemoveAll(Standard_False); + myContextIsEmpty = theObjects.IsEmpty(); + + for(NCollection_Vector::Iterator anIter(theObjects); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anObject = anIter.Value(); + if (!theDisplayShaded) + { + myContext->Display(anObject, Standard_False); + } + else + { + myContext->Display(anObject, AIS_Shaded, 0, Standard_False); + } + } + myViewer->Redraw(); +} + +void DocumentCommon::Clear() +{ + myContext->RemoveAll(Standard_True); + myContextIsEmpty = true; +} diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/DocumentCommon.h opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/DocumentCommon.h --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/DocumentCommon.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/DocumentCommon.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,75 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef DOCUMENT_COMMON_OVERVIEW_H +#define DOCUMENT_COMMON_OVERVIEW_H + +#include "CommonSample.h" + +#include +#include +#include +#include + +#include +#include + +class ApplicationCommonWindow; + +//! Implements visualization of samples content +class DocumentCommon : public QObject +{ + Q_OBJECT +public: + + DocumentCommon(ApplicationCommonWindow* ); + ~DocumentCommon() { } + + const Handle(AIS_InteractiveContext)& getContext() { return myContext; } + + const Handle(V3d_Viewer)& getViewer() { return myViewer; } + + void setViewer (const Handle(V3d_Viewer)& theViewer) { myViewer = theViewer; } + + void SetObjects(const NCollection_Vector& theObjects, + Standard_Boolean theDisplayShaded = Standard_False); + void Clear(); + bool IsEmpty() const { return myContextIsEmpty; } + +signals: + void selectionChanged(); + void sendCloseDocument( DocumentCommon* ); + +private: + Handle(V3d_Viewer) Viewer (const Standard_ExtString theName, + const Standard_CString theDomain, + const Standard_Real theViewSize, + const V3d_TypeOfOrientation theViewProj, + const Standard_Boolean theComputedMode, + const Standard_Boolean theDefaultComputedMode ); + +private: + Handle(V3d_Viewer) myViewer; + Handle(AIS_InteractiveContext) myContext; + bool myContextIsEmpty; +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/FILES opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/FILES --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/FILES 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,19 @@ +ApplicationCommon.cxx +ApplicationCommon.h +CommonSample.h +DocumentCommon.cxx +DocumentCommon.h +GeomWidget.cxx +GeomWidget.h +Main.cxx +OcctHighlighter.cxx +OcctHighlighter.h +OcctWindow.cxx +OcctWindow.h +OCCTOverview.qrc +TranslateDialog.h +TranslateDialog.cxx +Transparency.cxx +Transparency.h +View.cxx +View.h diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/GeomWidget.cxx opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/GeomWidget.cxx --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/GeomWidget.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/GeomWidget.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,100 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "GeomWidget.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +GeomWidget::GeomWidget (DocumentCommon* theDocument3d, + DocumentCommon* theDocument2d, + QWidget* theParent) +: QWidget (theParent), + myDocument3d(theDocument3d), + myDocument2d(theDocument2d) +{ + QVBoxLayout* aMainLayout = new QVBoxLayout(this); + aMainLayout->setContentsMargins(0, 0, 0, 0); + + my2dVidget = new QWidget; + QVBoxLayout* a2dLayout = new QVBoxLayout(my2dVidget); + a2dLayout->setContentsMargins(0, 0, 0, 0); + a2dLayout->setSpacing(0); + myView2d = new View(myDocument2d->getContext(), false, my2dVidget); + QToolBar* aToolBar2d = new QToolBar; + aToolBar2d->addActions(myView2d->getViewActions()); + a2dLayout->addWidget(aToolBar2d); + a2dLayout->addWidget(myView2d); + + my3dVidget = new QWidget; + QVBoxLayout* a3dLayout = new QVBoxLayout(my3dVidget); + a3dLayout->setContentsMargins(0, 0, 0, 0); + a3dLayout->setSpacing(0); + myView3d = new View(myDocument3d->getContext(), true, my3dVidget); + QToolBar* aToolBar3d = new QToolBar; + aToolBar3d->addActions(myView3d->getViewActions()); + aToolBar3d->addSeparator(); + aToolBar3d->addActions(myView3d->getRaytraceActions()); + a3dLayout->addWidget(aToolBar3d); + a3dLayout->addWidget(myView3d); + + myStackWidget = new QStackedWidget(this); + aMainLayout->addWidget(myStackWidget); + myStackWidget->addWidget(my2dVidget); + myStackWidget->addWidget(my3dVidget); + + FitAll(); +} + +void GeomWidget::FitAll() +{ + if (myDocument2d->IsEmpty()) + Show3d(); + else + Show2d(); +} + +void GeomWidget::Show3d() +{ + myView3d->axo(); + myView3d->fitAll(); + QAction* aShadingAction = myView3d->getViewAction(ViewAction_Shading); + aShadingAction->trigger(); + aShadingAction->setChecked(true); + QAction* aHlrOffAction = myView3d->getViewAction(ViewAction_HlrOff); + aHlrOffAction->trigger(); + aHlrOffAction->setChecked(true); + myStackWidget->setCurrentWidget(my3dVidget); + setStatusTip("Mouse buttons: Right-Zoom, Middle-Pan, Left-Rotate"); +} + +void GeomWidget::Show2d() +{ + myView2d->fitAll(); + myStackWidget->setCurrentWidget(my2dVidget); + setStatusTip("Mouse buttons: Right-Zoom, Middle-Pan"); +} diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/GeomWidget.h opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/GeomWidget.h --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/GeomWidget.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/GeomWidget.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,65 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef GEOMWIDGET_H +#define GEOMWIDGET_H + +#include "View.h" +#include "DocumentCommon.h" + +#include +#include +#include + +class ApplicationCommon; +class QStackedWidget; + +//! Qt widget for organize 3D & 2D documents +class GeomWidget : public QWidget +{ + Q_OBJECT +public: + GeomWidget(DocumentCommon* theDocument3d, + DocumentCommon* theDocument2d, + QWidget* theParent = nullptr); + + void FitAll(); + + Handle(V3d_View) Get3dView() { return myView3d->getView(); } + + Handle(V3d_View) Get2dView() { return myView2d->getView(); } + + void Show3d(); + void Show2d(); + +private: + View* myView3d; + View* myView2d; + + QWidget* my3dVidget; + QWidget* my2dVidget; + QStackedWidget* myStackWidget; + + DocumentCommon* myDocument3d; + DocumentCommon* myDocument2d; +}; + +#endif //GEOMWIDGET_H diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/Main.cxx opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/Main.cxx --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/Main.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/Main.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,79 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "ApplicationCommon.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +int main ( int argc, char* argv[] ) +{ + QApplication aQApp( argc, argv ); + +#include + Q_INIT_RESOURCE(OCCTOverview); +#include + + QSettings settings("OCCTOverview.conf", QSettings::IniFormat); + settings.beginGroup("ApplicationSetting"); + ApplicationType aCategory = static_cast(settings.value("ApplicationType", "").toInt()); + settings.endGroup(); + + ApplicationCommonWindow* aWindow = new ApplicationCommonWindow(aCategory); + QString aResName(":/icons/lamp.png"); + aWindow->setWindowIcon(QPixmap(aResName)); + + settings.beginGroup("WindowPosition"); + int x = settings.value("x", -1).toInt(); + int y = settings.value("y", -1).toInt(); + int width = settings.value("width", -1).toInt(); + int height = settings.value("height", -1).toInt(); + settings.endGroup(); + + if (x > 0 && y > 0 && width > 0 && height > 0) + { + aWindow->setGeometry(x, y, width, height); + } + aWindow->SetApplicationType(aCategory); + + aWindow->show(); + int aResult = aQApp.exec(); + + settings.beginGroup("WindowPosition"); + settings.setValue("x", aWindow->x()); + settings.setValue("y", aWindow->y()); + settings.setValue("width", aWindow->width()); + settings.setValue("height", aWindow->height()); + settings.endGroup(); + + settings.beginGroup("ApplicationSetting"); + settings.setValue("ApplicationType", aWindow->GetApplicationType()); + settings.endGroup(); + + return aResult; +} diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/OcctHighlighter.cxx opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/OcctHighlighter.cxx --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/OcctHighlighter.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/OcctHighlighter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,224 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "OcctHighlighter.h" + +#include +#include +#include +#include + + + + + +OcctHighlighter::OcctHighlighter(QTextDocument* theParent) +: QSyntaxHighlighter (theParent) +{ + QStringList aKeywordPatterns; + aKeywordPatterns + << "\\balignas\\b" << "\\balignof\\b" << "\\band\\b" << "\\band_eq\\b" << "\\basm\\b" + << "\\bauto\\b" << "\\bbitand\\b" << "\\bbitor\\b" << "\\bbool\\b" << "\\bbreak\\b" + << "\\bcase\\b" << "\\bcatch\\b" << "\\bchar\\b" << "\\bchar16_t\\b" << "\\bchar32_t\\b" + << "\\bclass\\b" << "\\bcompl\\b" << "\\bconst\\b" << "\\bconstexpr\\b" << "\\bconst_cast\\b" + << "\\bcontinue\\b" << "\\bdecltype\\b" << "\\bdefault\\b" << "\\bdelete\\b" << "\\bdo\\b" + << "\\bdouble\\b" << "\\bdynamic_cast\\b" << "\\belse\\b" << "\\benum\\b" << "\\bexplicit\\b" + << "\\bexport\\b" << "\\bextern\\b" << "\\bfalse\\b" << "\\bfloat\\b" << "\\bfor\\b" + << "\\bfriend\\b" << "\\bgoto\\b" << "\\bif\\b" << "\\binline\\b" << "\\bint\\b" << "\\blong\\b" + << "\\bmutable\\b" << "\\bnamespace\\b" << "\\bnew\\b" << "\\bnoexcept\\b" << "\\bnot\\b" + << "\\bnot_eq\\b" << "\\bnullptr\\b" << "\\boperator\\b" << "\\bor\\b" << "\\bor_eq\\b" + << "\\bprivate\\b" << "\\bprotected\\b" << "\\bpublic\\b" << "\\bregister\\b" + << "\\breinterpret_cast\\b" << "\\breturn\\b" << "\\bshort\\b" << "\\bsigned\\b" << "\\bsizeof\\b" + << "\\bstatic\\b" << "\\bstatic_assert\\b" << "\\bstatic_cast\\b" << "\\bstruct\\b" + << "\\bswitch\\b" << "\\btemplate\\b" << "\\bthis\\b" << "\\bthread_local\\b" << "\\bthrow\\b" + << "\\btrue\\b" << "\\btry\\b" << "\\btypedef\\b" << "\\btypeid\\b" << "\\btypename\\b" + << "\\bunion\\b" << "\\bunsigned\\b" << "\\busing\\b" << "\\bvirtual\\b" << "\\bvoid\\b" + << "\\bvolatile\\b" << "\\bwchar_t\\b" << "\\bwhile\\b" << "\\bxor\\b" << "\\bxor_eq\\b" + << "\\boverride\\b" << "\\bfinal\\b"; + + QStringList anOcctPatterns; + anOcctPatterns + << "gp_Pnt" << "gp_XYZ" << "gp_Vec" << "gp_Dir" << "gp_Ax1" << "gp_Ax2" << "gp_Ax3" << "gp_Lin" + << "gp_Circ" << "gp_Elips" << "gp_Parab" << "gp_Hypr" << "gp_Cylinder" << "gp_Cone" << "gp_Sphere" + << "gp_Torus" << "gp_Pnt2d" << "gp_XY" << "gp_Ax2d" << "gp_Ax22d" << "gp_Lin2d" << "gp_Circ2d" + << "gp_Elips2d" << "gp_Parab2d" << "gp_Hypr2d" << "Geom2d_BSplineCurve" << "Geom2d_BezierCurve" + << "Geom2d_OffsetCurve" << "ProjLib" << "ElSLib" << "IntAna_IntConicQuad" << "GccAna_Lin2d2Tan" + << "GccEnt_QualifiedCirc" << "Geom2dAPI_ProjectPointOnCurve" << "Geom2dAPI_ExtremaCurveCurve" + << "Geom2dAPI_InterCurveCurve" << "Geom2dAPI_PointsToBSpline" << "Geom_CartesianPoint" + << "Geom_VectorWithMagnitude" << "Geom_Axis1Placement" << "Geom_Axis2Placement" << "Geom_Line" + << "Geom_Circle" << "Geom_Ellipse" << "Geom_Parabola" << "Geom_Hyperbola" << "Geom_BSplineCurve" + << "Geom_BezierCurve" << "Geom_TrimmedCurve" << "Geom_OffsetCurve" << "Geom_BSplineSurface" + << "Geom_BezierSurface" << "Geom_Plane" << "Geom_CylindricalSurface" << "Geom_ConicalSurface" + << "Geom_SphericalSurface" << "Geom_ToroidalSurface" << "Geom_RectangularTrimmedSurface" + << "Geom_OffsetSurface" << "Geom_SurfaceOfLinearExtrusion" << "Geom_SurfaceOfRevolution" + << "BndLib_Add3dCurve" << "BndLib_AddSurface" << "GeomAdaptor_Curve" << "GeomAdaptor_Surface" + << "GeomAPI_PointsToBSpline" << "GeomAPI_PointsToBSplineSurface" << "GeomConvert" + << "Geom2d_CartesianPoint" << "Geom2d_VectorWithMagnitude" << "Geom2d_Line" << "Geom2d_Circle" + << "Geom2d_Ellipse" << "Geom2d_Parabola" << "Geom2d_Hyperbola" << "Geom2d_TrimmedCurve" + << "Geom2dAdaptor_Curve" << "Bnd_Box2d" << "BndLib_Add2dCurve" << "Adaptor2d_Curve2d" + << "BRepBuilderAPI_MakeEdge" << "BRepBuilderAPI_MakeFace" << "BRepPrimAPI_MakeBox" << "AIS_Point" + << "AIS_TextLabel" << "AIS_Axis" << "AIS_Circle" << "AIS_Plane" << "AIS_Shape" + << "AIS_ColoredShape" << "GProp_PEquation" << "Extrema_ExtCS" << "GCPnts_QuasiUniformDeflection" + << "GProp_GProps" << "GProp_PrincipalProps" << "TopoDS" << "TopoDS_Iterator" << "TopoDS_Compound" + << "TopoDS_Edge" << "TopoDS_Face" << "TopoDS_Shell" << "TopoDS_Solid" << "TopoDS_Vertex" + << "TopoDS_Wire" << "TopExp" << "TopExp_Explorer" << "TColgp_Array2OfPnt" << "BRep_Builder" + << "BRepGProp" << "BRep_Tool" << "BRepTools" << "BRepTools_ReShape" << "BRepAdaptor_Curve" + << "BRepAdaptor_CompCurve" << "BRepAdaptor_Surface" << "BRepAlgoAPI_Common" << "BRepAlgoAPI_Cut" + << "BRepAlgoAPI_Fuse" << "BRepAlgoAPI_Section" << "BRepAlgoAPI_Splitter" << "BRepAlgoAPI_Defeaturing" + << "BRepBuilderAPI_Copy" << "BRepBuilderAPI_MakeVertex" << "BRepBuilderAPI_MakeEdge" + << "BRepBuilderAPI_MakeFace" << "BRepBuilderAPI_MakePolygon" << "BRepBuilderAPI_MakeShell" + << "BRepBuilderAPI_MakeSolid" << "BRepBuilderAPI_MakeWire" << "BRepBuilderAPI_NurbsConvert" + << "BRepBuilderAPI_Sewing" << "BRepBuilderAPI_Transform" << "BRepCheck_Analyzer" + << "BRepPrimAPI_MakeBox" << "BRepPrimAPI_MakeCylinder" << "BRepPrimAPI_MakeRevol" + << "BRepFilletAPI_MakeChamfer" << "BRepFilletAPI_MakeFillet" << "BRepOffsetAPI_MakeOffset" + << "BRepOffsetAPI_MakeEvolved.hxx" << "Standard_Integer" << "Standard_Real" << "Standard_Boolean" + << "Standard_ShortReal" << "Standard_Character" << "Standard_Byte" << "Standard_Address" + << "Standard_Size" << "Standard_Time" << "Standard_Utf8Char" << "Standard_Utf8UChar" + << "Standard_ExtCharacter" << "Standard_Utf16Char" << "Standard_Utf32Char" << "Standard_WideChar" + << "Standard_CString" << "Standard_ExtString" << "NCollection_Vector" << "TCollection_AsciiString" + << "TCollection_BaseSequence"<< "TCollection_BasicMap" << "TCollection_BasicMapIterator" + << "TCollection_ExtendedString" << "TCollection_HAsciiString" << "TCollection_HExtendedString" + << "TCollection_MapNode" << "TCollection_MapNodePtr" << "TCollection_SeqNode" + << "TCollection_SeqNodePtr" << "TCollection_Side" << "Standard_False" << "Standard_True" + << "TCollection" << "NCollection" << "gp_Trsf" << "Handle" << "Aspect_TOL_DASH" + << "Aspect_TOM_O_STAR" << "Aspect_TOL_SOLID" << "Aspect_TOM_O_STAR" << "AIS_InteractiveObject" + << "AIS_ListOfInteractive" << "Aspect_GDM_Lines" << "Aspect_GDM_Points" << "Aspect_TOM_POINT" + << "Aspect_TOM_RING1" << "Aspect_TOM_O" << "BinDrivers" << "DefineFormat" << "Font_FA_Bold" + << "Font_FA_BoldItalic" << "Font_FA_Italic" << "Font_FA_Regular" << "DownCast" << "gp_Pln" + << "Graphic3d_AspectMarker3d" << "Graphic3d_HTA_LEFT" << "Graphic3d_NameOfMaterial" + << "Graphic3d_NOM_BRONZE" << "Graphic3d_NOM_PLASTIC" << "Graphic3d_VTA_BOTTOM" + << "OpenGl_GraphicDriver" << "PCDM_RS_OK" << "PCDM_SS_OK" << "PCDM_ReaderStatus" + << "PCDM_StoreStatus" << "Prs3d_Drawer" << "TPrsStd_AISPresentation" << "Quantity_Color" + << "Quantity_NameOfColor" << "Quantity_NOC_BLUE1" << "Quantity_NOC_CADETBLUE" + << "Quantity_NOC_GREEN" << "Quantity_NOC_MAGENTA1" << "Quantity_NOC_RED" << "Quantity_NOC_YELLOW" + << "Quantity_NOC_WHITE" << "Quantity_NOC_MATRABLUE" << "Quantity_TOC_RGB" << "Quantity_TOC_HLS" + << "Standard_GUID" << "TColStd_ListIteratorOfListOfTransient" << "TColStd_ListOfTransient" + << "TDataStd_Integer" << "TDataStd_Name" << "TDataStd_Real" << "TFunction_Driver" + << "TFunction_DriverTable" << "TFunction_Function" << "TFunction_Logbook" << "TDF_Label" + << "TDF_TagSource" << "TNaming_NamedShape" << "TopAbs_EDGE" << "TopAbs_FACE" << "TopAbs_VERTEX" + << "TPrsStd_AISPresentation" << "TPrsStd_AISViewer" << "V3d_AmbientLight" + << "V3d_DirectionalLight" << "V3d_PositionalLight" << "V3d_SpotLight" << "XmlDrivers"; + + QStringList aHelperPatterns; + aHelperPatterns + << "AdaptorCurve_AIS" << "AdaptorVec_AIS" << "AdaptorCurve2d_AIS" << "AdaptorPnt2d_AIS" + << "Sample2D_Image" << "Sample2D_Markers" << "Sample2D_Face" << "TOcafFunction_BoxDriver" + << "TOcafFunction_CylDriver" << "DisplayPresentation"; + + HighlightingRule aRule; + + myOcctFormat.setForeground(Qt::darkCyan); + + foreach (const QString& aPattern, anOcctPatterns) + { + aRule.myPattern = QRegExp(aPattern); + aRule.myFormat = myOcctFormat; + myHighlightingRules.append(aRule); + } + + myHelperFormat.setForeground(Qt::red); + foreach (const QString& aPattern, aHelperPatterns) + { + aRule.myPattern = QRegExp(aPattern); + aRule.myFormat = myHelperFormat; + myHighlightingRules.append(aRule); + } + + + myKeywordFormat.setForeground(Qt::darkBlue); + myKeywordFormat.setFontWeight(QFont::Bold); + foreach (const QString& aPattern, aKeywordPatterns) + { + aRule.myPattern = QRegExp(aPattern); + aRule.myFormat = myKeywordFormat; + myHighlightingRules.append(aRule); + } + + myMemberFormat.setFontWeight(QFont::Bold); + aRule.myPattern = QRegExp(QLatin1String("\\bmy[0-9A-Za-z]+\\b")); + aRule.myFormat = myMemberFormat; + myHighlightingRules.append(aRule); + + myLocalFormat.setForeground(Qt::darkMagenta); + aRule.myPattern = QRegExp(QLatin1String("\\ba[0-9A-Za-z]+\\b")); + aRule.myFormat = myLocalFormat; + myHighlightingRules.append(aRule); + + myQuotationFormat.setForeground(Qt::darkRed); + aRule.myPattern = QRegExp(QLatin1String("\".*\"")); + aRule.myFormat = myQuotationFormat; + myHighlightingRules.append(aRule); + + myFunctionFormat.setFontItalic(true); + myFunctionFormat.setForeground(Qt::blue); + aRule.myPattern = QRegExp(QLatin1String("\\b[A-Za-z0-9_]+(?=\\()")); + aRule.myFormat = myFunctionFormat; + myHighlightingRules.append(aRule); + + mySingleLineCommentFormat.setForeground(Qt::darkGreen); + aRule.myPattern = QRegExp(QLatin1String("//[^\n]*")); + aRule.myFormat = mySingleLineCommentFormat; + myHighlightingRules.append(aRule); + + myMultiLineCommentFormat.setForeground(Qt::darkGreen); + + myCommentStartExpression = QRegExp(QLatin1String("/\\*")); + myCommentEndExpression = QRegExp(QLatin1String("\\*/")); +} + +void OcctHighlighter::highlightBlock (const QString& theText) +{ + foreach (const HighlightingRule &rule, myHighlightingRules) + { + QRegExp expression(rule.myPattern); + int index = expression.indexIn(theText); + while (index >= 0) + { + int length = expression.matchedLength(); + setFormat(index, length, rule.myFormat); + index = expression.indexIn(theText, index + length); + } + } + + setCurrentBlockState(0); + + int startIndex = 0; + if (previousBlockState() != 1) + startIndex = theText.indexOf(myCommentStartExpression); + + while (startIndex >= 0) + { + int endIndex = myCommentEndExpression.indexIn(theText, startIndex); + int commentLength; + if (endIndex == -1) + { + setCurrentBlockState(1); + commentLength = theText.length() - startIndex; + } + else + { + commentLength = endIndex - startIndex + + myCommentEndExpression.matchedLength(); + } + setFormat(startIndex, commentLength, myMultiLineCommentFormat); + startIndex = myCommentEndExpression.indexIn(theText, startIndex + commentLength); + } +} diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/OcctHighlighter.h opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/OcctHighlighter.h --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/OcctHighlighter.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/OcctHighlighter.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,77 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef OCCTHIGHLIGHTER_H +#define OCCTHIGHLIGHTER_H + +#include + +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE +class QTextDocument; +QT_END_NAMESPACE + +//! Implements C++ and OCCT objects syntax +//! highlighting for sample code window +class OcctHighlighter: public QSyntaxHighlighter +{ + Q_OBJECT +public: + + OcctHighlighter(QTextDocument* theParent = 0); + +protected: + void highlightBlock(const QString& theText) Standard_OVERRIDE; + +private: + struct HighlightingRule + { + QRegExp myPattern; + QTextCharFormat myFormat; + }; + +private: + QVector myHighlightingRules; + // QRegExp (Qt4+) introduced by the patch as alternative to QRegularExpression + // (Qt5+) for compatibility reasons. QRegExp will be moved in future Qt6 to + // a qt5compat module: QRegExp -> Qt5::QRegExp + QRegExp myCommentStartExpression; + QRegExp myCommentEndExpression; + + QTextCharFormat myKeywordFormat; + QTextCharFormat mySingleLineCommentFormat; + QTextCharFormat myMultiLineCommentFormat; + QTextCharFormat myQuotationFormat; + QTextCharFormat myFunctionFormat; + QTextCharFormat myOcctFormat; + QTextCharFormat myMemberFormat; + QTextCharFormat myLocalFormat; + QTextCharFormat myHelperFormat; +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/OCCTOverview.qrc opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/OCCTOverview.qrc --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/OCCTOverview.qrc 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/OCCTOverview.qrc 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,29 @@ + + + ../res/lamp.png + ../res/view_axo.png + ../res/view_back.png + ../res/view_bottom.png + ../res/view_comp_off.png + ../res/view_comp_on.png + ../res/view_fitall.png + ../res/view_front.png + ../res/view_left.png + ../res/view_reset.png + ../res/view_top.png + ../res/antialiasing.png + ../res/raytracing.png + ../res/reflections.png + ../res/shadows.png + ../res/view_right.png + ../res/tool_material.png + ../res/tool_color.png + ../res/tool_delete.png + ../res/tool_shading.png + ../res/tool_transparency.png + ../res/tool_wireframe.png + ../res/help.png + ../res/cursor_rotate.png + ../res/cursor_zoom.png + + diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/OcctWindow.cxx opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/OcctWindow.cxx --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/OcctWindow.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/OcctWindow.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,179 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "OcctWindow.h" + +IMPLEMENT_STANDARD_RTTIEXT(OcctWindow, Aspect_Window) + +// ======================================================================= +// function : OcctWindow +// purpose : +// ======================================================================= +OcctWindow::OcctWindow(QWidget* theWidget, const Quantity_NameOfColor theBackColor) +: myWidget (theWidget) +{ + SetBackground(theBackColor); + myXLeft = myWidget->rect().left(); + myYTop = myWidget->rect().top(); + myXRight = myWidget->rect().right(); + myYBottom = myWidget->rect().bottom(); +} + +// ======================================================================= +// function : NativeParentHandle +// purpose : +// ======================================================================= +Aspect_Drawable OcctWindow::NativeParentHandle() const +{ + QWidget* aParentWidget = myWidget->parentWidget(); + if (aParentWidget != NULL) + { + return (Aspect_Drawable)aParentWidget->winId(); + } + else + { + return 0; + } +} + +// ======================================================================= +// function : Map +// purpose : +// ======================================================================= +void OcctWindow::Map() const +{ + myWidget->show(); + myWidget->update(); +} + +// ======================================================================= +// function : Unmap +// purpose : +// ======================================================================= +void OcctWindow::Unmap() const +{ + myWidget->hide(); + myWidget->update(); +} + +// ======================================================================= +// function : DoResize +// purpose : +// ======================================================================= +Aspect_TypeOfResize OcctWindow::DoResize() +{ + int aMask = 0; + Aspect_TypeOfResize aMode = Aspect_TOR_UNKNOWN; + + if (!myWidget->isMinimized()) + { + if (Abs(myWidget->rect().left() - myXLeft) > 2) + { + aMask |= 1; + } + if (Abs(myWidget->rect().right() - myXRight) > 2) + { + aMask |= 2; + } + if (Abs(myWidget->rect().top() - myYTop) > 2) + { + aMask |= 4; + } + if (Abs(myWidget->rect().bottom() - myYBottom) > 2) + { + aMask |= 8; + } + + switch (aMask) + { + case 0: + aMode = Aspect_TOR_NO_BORDER; + break; + case 1: + aMode = Aspect_TOR_LEFT_BORDER; + break; + case 2: + aMode = Aspect_TOR_RIGHT_BORDER; + break; + case 4: + aMode = Aspect_TOR_TOP_BORDER; + break; + case 5: + aMode = Aspect_TOR_LEFT_AND_TOP_BORDER; + break; + case 6: + aMode = Aspect_TOR_TOP_AND_RIGHT_BORDER; + break; + case 8: + aMode = Aspect_TOR_BOTTOM_BORDER; + break; + case 9: + aMode = Aspect_TOR_BOTTOM_AND_LEFT_BORDER; + break; + case 10: + aMode = Aspect_TOR_RIGHT_AND_BOTTOM_BORDER; + break; + default: + break; + } // end switch + + myXLeft = myWidget->rect().left(); + myXRight = myWidget->rect().right(); + myYTop = myWidget->rect().top(); + myYBottom = myWidget->rect().bottom(); + } + + return aMode; +} + +// ======================================================================= +// function : Ratio +// purpose : +// ======================================================================= +Standard_Real OcctWindow::Ratio() const +{ + QRect aRect = myWidget->rect(); + return Standard_Real(aRect.right() - aRect.left()) / Standard_Real(aRect.bottom() - aRect.top()); +} + +// ======================================================================= +// function : Size +// purpose : +// ======================================================================= +void OcctWindow::Size(Standard_Integer& theWidth, Standard_Integer& theHeight) const +{ + QRect aRect = myWidget->rect(); + theWidth = aRect.width(); + theHeight = aRect.height(); +} + +// ======================================================================= +// function : Position +// purpose : +// ======================================================================= +void OcctWindow::Position(Standard_Integer& theX1, Standard_Integer& theY1, + Standard_Integer& theX2, Standard_Integer& theY2) const +{ + theX1 = myWidget->rect().left(); + theX2 = myWidget->rect().right(); + theY1 = myWidget->rect().top(); + theY2 = myWidget->rect().bottom(); +} diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/OcctWindow.h opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/OcctWindow.h --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/OcctWindow.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/OcctWindow.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,111 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef OcctWindow_H +#define OcctWindow_H + +#include + +#include +#include +#include + +//! OcctWindow class implements Aspect_Window interface using Qt API +//! as a platform-independent source of window geometry information. +//! A similar class should be used instead of platform-specific OCCT +//! classes (WNT_Window, Xw_Window) in any Qt 5 application using OCCT +//! 3D visualization. +//! +//! With Qt 5, the requirement for a Qt-based application to rely fully +//! on Qt public API and stop using platform-specific APIs looks mandatory. +//! An example of this is changed QWidget event sequence: when a widget is +//! first shown on the screen, a resize event is generated before the +//! underlying native window is resized correctly, however the QWidget instance +//! already holds correct size information at that moment. The OCCT classes +//! acting as a source of window geometry for V3d_View class (WNT_Window, Xw_Window) +//! are no longer compatible with changed Qt behavior because they rely on +//! platform-specific API that cannot return correct window geometry information +//! in some cases. A reasonable solution is to provide a Qt-based implementation +//! of Aspect_Window interface at application level. +class OcctWindow : public Aspect_Window +{ + DEFINE_STANDARD_RTTIEXT(OcctWindow,Aspect_Window) +public: + + //! Constructor + OcctWindow( QWidget* theWidget, const Quantity_NameOfColor theBackColor = Quantity_NOC_MATRAGRAY ); + + //! Destructor + virtual ~OcctWindow() + { + myWidget = NULL; + } + + //! Returns native Window handle + virtual Aspect_Drawable NativeHandle() const Standard_OVERRIDE + { + return (Aspect_Drawable)myWidget->winId(); + } + + //! Returns parent of native Window handle. + virtual Aspect_Drawable NativeParentHandle() const Standard_OVERRIDE; + + //! Applies the resizing to the window + virtual Aspect_TypeOfResize DoResize() Standard_OVERRIDE; + + //! Returns True if the window is opened + //! and False if the window is closed. + virtual Standard_Boolean IsMapped() const Standard_OVERRIDE + { + return !(myWidget->isMinimized() || myWidget->isHidden()); + } + + //! Apply the mapping change to the window + //! and returns TRUE if the window is mapped at screen. + virtual Standard_Boolean DoMapping() const Standard_OVERRIDE { return Standard_True; } + + //! Opens the window . + virtual void Map() const Standard_OVERRIDE; + + //! Closes the window . + virtual void Unmap() const Standard_OVERRIDE; + + virtual void Position( Standard_Integer& theX1, Standard_Integer& theY1, + Standard_Integer& theX2, Standard_Integer& theY2 ) const Standard_OVERRIDE; + + //! Returns The Window RATIO equal to the physical + //! WIDTH/HEIGHT dimensions. + virtual Standard_Real Ratio() const Standard_OVERRIDE; + + virtual void Size( Standard_Integer& theWidth, Standard_Integer& theHeight ) const Standard_OVERRIDE; + + virtual Aspect_FBConfig NativeFBConfig() const Standard_OVERRIDE { return NULL; } + +protected: + Standard_Integer myXLeft; + Standard_Integer myYTop; + Standard_Integer myXRight; + Standard_Integer myYBottom; + QWidget* myWidget; +}; + + +#endif // OcctWindow_H \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/TranslateDialog.cxx opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/TranslateDialog.cxx --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/TranslateDialog.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/TranslateDialog.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,113 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "TranslateDialog.h" + +#include +#include +#include + +TranslateDialog::TranslateDialog(QWidget* parent, Qt::WindowFlags flags, bool modal) +: QFileDialog(parent, flags) +{ + setOption(QFileDialog::DontUseNativeDialog); + setModal(modal); + + QGridLayout* grid = ::qobject_cast(layout()); + + if (grid) + { + QVBoxLayout *vbox = new QVBoxLayout; + + QWidget* paramGroup = new QWidget(this); + paramGroup->setLayout(vbox); + + myBox = new QComboBox(paramGroup); + vbox->addWidget(myBox); + + int row = grid->rowCount(); + grid->addWidget(paramGroup, row, 1, 1, 3); // make combobox occupy 1 row and 3 columns starting from 1 + } +} + +TranslateDialog::~TranslateDialog() +{ +} + +int TranslateDialog::getMode() const +{ + if (myBox->currentIndex() < 0 || myBox->currentIndex() > (int)myList.count() - 1) + { + return -1; + } + else + { + return myList.at(myBox->currentIndex()); + } +} + +void TranslateDialog::setMode(const int mode) +{ + int idx = myList.indexOf(mode); + if (idx >= 0) + { + myBox->setCurrentIndex(idx); + } +} + +void TranslateDialog::addMode(const int mode, const QString& name) +{ + myBox->show(); + myBox->addItem(name); + myList.append(mode); + myBox->updateGeometry(); + updateGeometry(); +} + +void TranslateDialog::clear() +{ + myList.clear(); + myBox->clear(); + myBox->hide(); + myBox->updateGeometry(); + updateGeometry(); +} + +QListView* TranslateDialog::findListView(const QObjectList & childList) +{ + QListView* listView = 0; + for (int i = 0, n = childList.count(); i < n && !listView; i++) + { + listView = qobject_cast(childList.at(i)); + if (!listView && childList.at(i)) + { + listView = findListView(childList.at(i)->children()); + } + } + return listView; +} + +void TranslateDialog::showEvent(QShowEvent* event) +{ + QFileDialog::showEvent(event); + QListView* aListView = findListView(children()); + aListView->setViewMode(QListView::ListMode); +} diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/TranslateDialog.h opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/TranslateDialog.h --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/TranslateDialog.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/TranslateDialog.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,56 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef TRANSLATEDIALOG_H +#define TRANSLATEDIALOG_H + +#include +#include +#include +#include +#include +#include +#include +#include + +//! Qt file dialog for save and restore sample files +class TranslateDialog : public QFileDialog +{ +public: + TranslateDialog(QWidget* = 0, Qt::WindowFlags flags = 0, bool = true); + ~TranslateDialog(); + int getMode() const; + void setMode(const int); + void addMode(const int, const QString&); + void clear(); + +protected: + void showEvent(QShowEvent* event); + +private: + QListView* findListView(const QObjectList&); + +private: + QComboBox* myBox; + QList myList; +}; + +#endif // TRANSLATEDIALOG_H diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/Transparency.cxx opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/Transparency.cxx --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/Transparency.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/Transparency.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,46 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "Transparency.h" + +#include +#include +#include +#include + +DialogTransparency::DialogTransparency(QWidget* parent) +: QDialog(parent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) +{ + setWindowTitle(tr("Transparency")); + QHBoxLayout* base = new QHBoxLayout(this); + + base->addWidget(new QLabel("0", this)); + + mySlider = new QSlider(Qt::Horizontal, this); + mySlider->setRange(0, 10); + mySlider->setTickPosition(QSlider::TicksBelow); + mySlider->setTickInterval(1); + mySlider->setPageStep(2); + base->addWidget(mySlider); + connect(mySlider, SIGNAL(valueChanged(int)), this, SIGNAL(sendTransparencyChanged(int))); + + base->addWidget(new QLabel("10", this)); +} diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/Transparency.h opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/Transparency.h --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/Transparency.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/Transparency.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,55 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include +#include +#include +#include +#include + +#include + +class QSlider; + +//! Qt dialog with slider for change shapes transparency +class DialogTransparency : public QDialog +{ + Q_OBJECT +public: + DialogTransparency ( QWidget * parent=0 ); + ~DialogTransparency() { } + + int value() const + { + return mySlider->value(); + } + + void setValue(int theVal) const + { + mySlider->setValue(theVal); + } + +signals: + void sendTransparencyChanged(int value); + +private: + QSlider* mySlider; +}; diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/View.cxx opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/View.cxx --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/View.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/View.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,679 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#if !defined _WIN32 +#define QT_CLEAN_NAMESPACE /* avoid definition of INT32 and INT8 */ +#endif + +#include "View.h" + +#include "ApplicationCommon.h" +#include "OcctWindow.h" +#include "Transparency.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && QT_VERSION < 0x050000 +#include +#endif + +#include +#include +#include + +namespace +{ + //! Map Qt buttons bitmask to virtual keys. + static Aspect_VKeyMouse qtMouseButtons2VKeys(Qt::MouseButtons theButtons) + { + Aspect_VKeyMouse aButtons = Aspect_VKeyMouse_NONE; + if ((theButtons & Qt::LeftButton) != 0) + { + aButtons |= Aspect_VKeyMouse_LeftButton; + } + if ((theButtons & Qt::MiddleButton) != 0) + { + aButtons |= Aspect_VKeyMouse_MiddleButton; + } + if ((theButtons & Qt::RightButton) != 0) + { + aButtons |= Aspect_VKeyMouse_RightButton; + } + return aButtons; + } + + //! Map Qt mouse modifiers bitmask to virtual keys. + static Aspect_VKeyFlags qtMouseModifiers2VKeys(Qt::KeyboardModifiers theModifiers) + { + Aspect_VKeyFlags aFlags = Aspect_VKeyFlags_NONE; + if ((theModifiers & Qt::ShiftModifier) != 0) + { + aFlags |= Aspect_VKeyFlags_SHIFT; + } + if ((theModifiers & Qt::ControlModifier) != 0) + { + aFlags |= Aspect_VKeyFlags_CTRL; + } + if ((theModifiers & Qt::AltModifier) != 0) + { + aFlags |= Aspect_VKeyFlags_ALT; + } + return aFlags; + } + + static QCursor* defCursor = NULL; + static QCursor* handCursor = NULL; + static QCursor* panCursor = NULL; + static QCursor* globPanCursor = NULL; + static QCursor* zoomCursor = NULL; + static QCursor* rotCursor = NULL; + +} + +View::View (const Handle(AIS_InteractiveContext)& theContext, bool theIs3dView, QWidget* theParent) +: QWidget(theParent), + myIsRaytracing(false), + myIsShadowsEnabled(true), + myIsReflectionsEnabled(false), + myIsAntialiasingEnabled(false), + myIs3dView (theIs3dView), + myBackMenu(NULL) +{ +#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && QT_VERSION < 0x050000 + XSynchronize(x11Info().display(), true); +#endif + myContext = theContext; + myCurZoom = 0; + + setAttribute(Qt::WA_PaintOnScreen); + setAttribute(Qt::WA_NoSystemBackground); + + myDefaultGestures = myMouseGestureMap; + myCurrentMode = CurrentAction3d_Nothing; + setMouseTracking(true); + + initViewActions(); + initCursors(); + + setBackgroundRole(QPalette::NoRole);//NoBackground ); + // set focus policy to threat QContextMenuEvent from keyboard + setFocusPolicy(Qt::StrongFocus); + setAttribute(Qt::WA_PaintOnScreen); + setAttribute(Qt::WA_NoSystemBackground); + init(); +} + +void View::init() +{ + if (myV3dView.IsNull()) + { + myV3dView = myContext->CurrentViewer()->CreateView(); + } + + Handle(OcctWindow) hWnd = new OcctWindow(this); + myV3dView->SetWindow(hWnd); + if (!hWnd->IsMapped()) + { + hWnd->Map(); + } + + if (myIs3dView) + { + SetAllowRotation(Standard_True); + myV3dView->SetBackgroundColor(Quantity_Color(0.0, 0.0, 0.3, Quantity_TOC_RGB)); + } + else + { + SetAllowRotation(Standard_False); + myV3dView->SetBackgroundColor(Quantity_Color(0.0, 0.2, 0.0, Quantity_TOC_RGB)); + myV3dView->SetProj(V3d_Zpos); + } + + myV3dView->MustBeResized(); + + if (myIsRaytracing) + { + myV3dView->ChangeRenderingParams().Method = Graphic3d_RM_RAYTRACING; + } +} + +void View::paintEvent(QPaintEvent *) +{ + myV3dView->InvalidateImmediate(); + FlushViewEvents(myContext, myV3dView, true); +} + +void View::resizeEvent(QResizeEvent *) +{ + if (!myV3dView.IsNull()) + { + myV3dView->MustBeResized(); + } +} + +void View::OnSelectionChanged(const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) +{ + Q_UNUSED(theCtx) + Q_UNUSED(theView) +} + +void View::fitAll() +{ + myV3dView->FitAll(); + myV3dView->ZFitAll(); + myV3dView->Redraw(); +} + +void View::axo() +{ + if (myIs3dView) + { + myV3dView->SetProj(V3d_XposYnegZpos); + } +} + +void View::hlrOff() +{ + QApplication::setOverrideCursor(Qt::WaitCursor); + myV3dView->SetComputedMode(Standard_False); + myV3dView->Redraw(); + QAction* aShadingAction = getViewAction(ViewAction_Shading); + aShadingAction->setEnabled(true); + QAction* aWireframeAction = getViewAction(ViewAction_Wireframe); + aWireframeAction->setEnabled(true); + QApplication::restoreOverrideCursor(); +} + +void View::hlrOn() +{ + QApplication::setOverrideCursor(Qt::WaitCursor); + myV3dView->SetComputedMode(Standard_True); + myV3dView->Redraw(); + QAction* aShadingAction = getViewAction(ViewAction_Shading); + aShadingAction->setEnabled(false); + QAction* aWireframeAction = getViewAction(ViewAction_Wireframe); + aWireframeAction->setEnabled(false); + QApplication::restoreOverrideCursor(); +} + +void View::shading() +{ + myContext->SetDisplayMode(1, Standard_True); +} + +void View::wireframe() +{ + myContext->SetDisplayMode(0, Standard_True); +} + +void View::SetRaytracedShadows(bool theState) +{ + myV3dView->ChangeRenderingParams().IsShadowEnabled = theState; + myIsShadowsEnabled = theState; + myContext->UpdateCurrentViewer(); +} + +void View::SetRaytracedReflections(bool theState) +{ + myV3dView->ChangeRenderingParams().IsReflectionEnabled = theState; + myIsReflectionsEnabled = theState; + myContext->UpdateCurrentViewer(); +} + +void View::onRaytraceAction() +{ + QAction* aSentBy = (QAction*)sender(); + + if (aSentBy == myRaytraceActions.value(RaytraceAction_Raytracing)) + { + bool aState = myRaytraceActions.value(RaytraceAction_Raytracing)->isChecked(); + + QApplication::setOverrideCursor(Qt::WaitCursor); + if (aState) + EnableRaytracing(); + else + DisableRaytracing(); + QApplication::restoreOverrideCursor(); + } + + if (aSentBy == myRaytraceActions.value(RaytraceAction_Shadows)) + { + bool aState = myRaytraceActions.value(RaytraceAction_Shadows)->isChecked(); + SetRaytracedShadows(aState); + } + + if (aSentBy == myRaytraceActions.value(RaytraceAction_Reflections)) + { + bool aState = myRaytraceActions.value(RaytraceAction_Reflections)->isChecked(); + SetRaytracedReflections(aState); + } + + if (aSentBy == myRaytraceActions.value(RaytraceAction_Antialiasing)) + { + bool aState = myRaytraceActions.value(RaytraceAction_Antialiasing)->isChecked(); + SetRaytracedAntialiasing(aState); + } +} + +void View::SetRaytracedAntialiasing(bool theState) +{ + myV3dView->ChangeRenderingParams().IsAntialiasingEnabled = theState; + myIsAntialiasingEnabled = theState; + myContext->UpdateCurrentViewer(); +} + +void View::EnableRaytracing() +{ + if (!myIsRaytracing) + { + myV3dView->ChangeRenderingParams().Method = Graphic3d_RM_RAYTRACING; + } + myIsRaytracing = true; + myContext->UpdateCurrentViewer(); +} + +void View::DisableRaytracing() +{ + if (myIsRaytracing) + { + myV3dView->ChangeRenderingParams().Method = Graphic3d_RM_RASTERIZATION; + } + myIsRaytracing = false; + myContext->UpdateCurrentViewer(); +} + +void View::updateToggled(bool isOn) +{ + QAction* sentBy = (QAction*)sender(); + if (!isOn) + { + return; + } + + foreach (QAction* anAction, myViewActions) + { + if (anAction && (anAction != sentBy)) + { + anAction->setCheckable(true); + anAction->setChecked(false); + } + else + { + if (sentBy == myViewActions.value(ViewAction_FitArea)) + setCursor(*handCursor); + else if (sentBy == myViewActions.value(ViewAction_Zoom)) + setCursor(*zoomCursor); + else if (sentBy == myViewActions.value(ViewAction_Pan)) + setCursor(*panCursor); + else if (sentBy == myViewActions.value(ViewAction_GlobalPan)) + setCursor(*globPanCursor); + else if (sentBy == myViewActions.value(ViewAction_Rotation)) + setCursor(*rotCursor); + else + setCursor(*defCursor); + + sentBy->setCheckable(false); + } + } +} + +void View::initCursors() +{ + if (!defCursor) + defCursor = new QCursor(Qt::ArrowCursor); + if (!handCursor) + handCursor = new QCursor(Qt::PointingHandCursor); + if (!panCursor) + panCursor = new QCursor(Qt::SizeAllCursor); + if (!globPanCursor) + globPanCursor = new QCursor(Qt::CrossCursor); + if (!zoomCursor) + zoomCursor = new QCursor(QPixmap(":/icons/cursor_zoom.png")); + if (!rotCursor) + rotCursor = new QCursor(QPixmap(":/icons/cursor_rotate.png")); +} + +QList View::getViewActions() +{ + initViewActions(); + return myViewActions.values(); +} + +QList View::getRaytraceActions() +{ + initRaytraceActions(); + return myRaytraceActions.values(); +} + +QAction* View::getViewAction(ViewAction theAction) +{ + return myViewActions.value(theAction); +} + +QAction* View::getRaytraceAction(RaytraceAction theAction) +{ + return myRaytraceActions.value(theAction); +} + +/*! + Get paint engine for the OpenGL viewer. [ virtual public ] +*/ +QPaintEngine* View::paintEngine() const +{ + return 0; +} + +QAction* View::RegisterAction(QString theIconPath, QString thePromt) +{ + QAction* anAction = new QAction(QPixmap(theIconPath), thePromt, this); + anAction->setToolTip(thePromt); + anAction->setStatusTip(thePromt); + return anAction; +} + +void View::initViewActions() +{ + if (!myViewActions.empty()) + return; + myViewActions[ViewAction_FitAll] = RegisterAction(":/icons/view_fitall.png", tr("Fit all")); + connect(myViewActions[ViewAction_FitAll], SIGNAL(triggered()), this, SLOT(fitAll())); + if (myIs3dView) + { + myViewActions[ViewAction_Axo] = RegisterAction(":/icons/view_axo.png", tr("Isometric")); + connect(myViewActions[ViewAction_Axo], SIGNAL(triggered()), this, SLOT(axo())); + + QActionGroup* aShadingActionGroup = new QActionGroup(this); + QAction* aShadingAction = RegisterAction(":/icons/tool_shading.png", tr("Shading")); + connect(aShadingAction, SIGNAL(triggered()), this, SLOT(shading())); + aShadingAction->setCheckable(true); + aShadingActionGroup->addAction(aShadingAction); + myViewActions[ViewAction_Shading] = aShadingAction; + + QAction* aWireframeAction = RegisterAction(":/icons/tool_wireframe.png", tr("Wireframe")); + connect(aWireframeAction, SIGNAL(triggered()), this, SLOT(wireframe())); + aWireframeAction->setCheckable(true); + aShadingActionGroup->addAction(aWireframeAction); + myViewActions[ViewAction_Wireframe] = aWireframeAction; + + QActionGroup* aHlrActionGroup = new QActionGroup(this); + QAction* aHlrOffAction = RegisterAction(":/icons/view_comp_off.png", tr("HLR off")); + connect(aHlrOffAction, SIGNAL(triggered()), this, SLOT(hlrOff())); + aHlrOffAction->setCheckable(true); + aHlrActionGroup->addAction(aHlrOffAction); + myViewActions[ViewAction_HlrOff] = aHlrOffAction; + + QAction* aHlrOnAction = RegisterAction(":/icons/view_comp_on.png", tr("HLR on")); + connect(aHlrOnAction, SIGNAL(triggered()), this, SLOT(hlrOn())); + aHlrOnAction->setCheckable(true); + aHlrActionGroup->addAction(aHlrOnAction); + myViewActions[ViewAction_HlrOn] = aHlrOnAction; + + QAction* aTransparencyAction = RegisterAction(":/icons/tool_transparency.png", tr("Transparency")); + connect(aTransparencyAction, SIGNAL(triggered()), this, SLOT(onTransparency())); + myViewActions[ViewAction_Transparency] = aTransparencyAction; + } +} + +void View::initRaytraceActions() +{ + if (!myRaytraceActions.empty()) + { + return; + } + + QAction* aRayTraceAction = RegisterAction(":/icons/raytracing.png", tr("Ray-tracing")); + connect(aRayTraceAction, SIGNAL(triggered()), this, SLOT(onRaytraceAction())); + myRaytraceActions[RaytraceAction_Raytracing] = aRayTraceAction; + aRayTraceAction->setCheckable(true); + aRayTraceAction->setChecked(false); + + QAction* aShadowAction = RegisterAction(":/icons/shadows.png", tr("Shadows")); + connect(aShadowAction, SIGNAL(triggered()), this, SLOT(onRaytraceAction())); + myRaytraceActions[RaytraceAction_Shadows] = aShadowAction; + aShadowAction->setCheckable(true); + aShadowAction->setChecked(true); + + QAction* aReflectAction = RegisterAction(":/icons/reflections.png", tr("Reflections")); + connect(aReflectAction, SIGNAL(triggered()), this, SLOT(onRaytraceAction())); + myRaytraceActions[RaytraceAction_Reflections] = aReflectAction; + aReflectAction->setCheckable(true); + aReflectAction->setChecked(false); + + QAction* anAntiAliasingAction = RegisterAction(":/icons/antialiasing.png", tr("Anti-aliasing")); + connect(anAntiAliasingAction, SIGNAL(triggered()), this, SLOT(onRaytraceAction())); + myRaytraceActions[RaytraceAction_Antialiasing] = anAntiAliasingAction; + anAntiAliasingAction->setCheckable(true); + anAntiAliasingAction->setChecked(false); +} + +void View::activateCursor(const CurrentAction3d theMode) +{ + QCursor* aCursor = defCursor; + switch (theMode) + { + case CurrentAction3d_DynamicPanning: aCursor = panCursor; break; + case CurrentAction3d_DynamicZooming: aCursor = zoomCursor; break; + case CurrentAction3d_DynamicRotation: aCursor = rotCursor; break; + case CurrentAction3d_GlobalPanning: aCursor = globPanCursor; break; + case CurrentAction3d_WindowZooming: aCursor = handCursor; break; + case CurrentAction3d_Nothing: aCursor = defCursor; break; + default: + break; + } + setCursor(*aCursor); +} + +void View::mousePressEvent(QMouseEvent* theEvent) +{ + Qt::MouseButtons aMouseButtons = theEvent->buttons(); + const Graphic3d_Vec2i aPnt(theEvent->pos().x(), theEvent->pos().y()); + const Aspect_VKeyFlags aFlags = qtMouseModifiers2VKeys(theEvent->modifiers()); + if (!myV3dView.IsNull() + && UpdateMouseButtons(aPnt, qtMouseButtons2VKeys(aMouseButtons), aFlags, false)) + { + updateView(); + } + myClickPos = aPnt; +} + +void View::mouseReleaseEvent(QMouseEvent* theEvent) +{ + Qt::MouseButtons aMouseButtons = theEvent->buttons(); + const Graphic3d_Vec2i aPnt(theEvent->pos().x(), theEvent->pos().y()); + const Aspect_VKeyFlags aFlags = qtMouseModifiers2VKeys(theEvent->modifiers()); + if (!myV3dView.IsNull() + && UpdateMouseButtons(aPnt, qtMouseButtons2VKeys(aMouseButtons), aFlags, false)) + { + updateView(); + } + + if (myCurrentMode == CurrentAction3d_GlobalPanning) + { + myV3dView->Place(aPnt.x(), aPnt.y(), myCurZoom); + } + if (myCurrentMode != CurrentAction3d_Nothing) + { + setCurrentAction(CurrentAction3d_Nothing); + } +} + +void View::mouseMoveEvent(QMouseEvent* theEvent) +{ + Qt::MouseButtons aMouseButtons = theEvent->buttons(); + const Graphic3d_Vec2i aNewPos(theEvent->pos().x(), theEvent->pos().y()); + if (!myV3dView.IsNull() + && UpdateMousePosition(aNewPos, qtMouseButtons2VKeys(aMouseButtons), qtMouseModifiers2VKeys(theEvent->modifiers()), false)) + { + updateView(); + } +} + +//============================================================================== +//function : wheelEvent +//purpose : +//============================================================================== +void View::wheelEvent(QWheelEvent* theEvent) +{ + const Graphic3d_Vec2i aPos(theEvent->pos().x(), theEvent->pos().y()); + if (!myV3dView.IsNull() + && UpdateZoom(Aspect_ScrollDelta(aPos, theEvent->delta() / 8))) + { + updateView(); + } +} + +// ======================================================================= +// function : updateView +// purpose : +// ======================================================================= +void View::updateView() +{ + update(); +} + +void View::defineMouseGestures() +{ + myMouseGestureMap.Clear(); + AIS_MouseGesture aRot = AIS_MouseGesture_RotateOrbit; + activateCursor(myCurrentMode); + switch (myCurrentMode) + { + case CurrentAction3d_Nothing: + { + myMouseGestureMap = myDefaultGestures; + break; + } + case CurrentAction3d_DynamicZooming: + { + myMouseGestureMap.Bind(Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_Zoom); + break; + } + case CurrentAction3d_GlobalPanning: + { + break; + } + case CurrentAction3d_WindowZooming: + { + myMouseGestureMap.Bind(Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_ZoomWindow); + break; + } + case CurrentAction3d_DynamicPanning: + { + myMouseGestureMap.Bind(Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_Pan); + break; + } + case CurrentAction3d_DynamicRotation: + { + myMouseGestureMap.Bind(Aspect_VKeyMouse_LeftButton, aRot); + break; + } + default: + { + break; + } + } +} + +void View::addItemInPopup(QMenu* theMenu) +{ + Q_UNUSED(theMenu) +} + +void View::onBackground() +{ + QColor aColor; + Standard_Real R1; + Standard_Real G1; + Standard_Real B1; + myV3dView->BackgroundColor(Quantity_TOC_RGB, R1, G1, B1); + aColor.setRgb((Standard_Integer)(R1 * 255), (Standard_Integer)(G1 * 255), (Standard_Integer)(B1 * 255)); + + QColor aRetColor = QColorDialog::getColor(aColor); + if (aRetColor.isValid()) + { + R1 = aRetColor.red() / 255.; + G1 = aRetColor.green() / 255.; + B1 = aRetColor.blue() / 255.; + myV3dView->SetBackgroundColor(Quantity_TOC_RGB, R1, G1, B1); + } + myV3dView->Redraw(); +} + +void View::onEnvironmentMap() +{ + if (myBackMenu->actions().at(1)->isChecked()) + { + QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", + tr("All Image Files (*.bmp *.gif *.jpg *.jpeg *.png *.tga)")); + + const TCollection_AsciiString anUtf8Path(fileName.toUtf8().data()); + Handle(Graphic3d_TextureEnv) aTexture = new Graphic3d_TextureEnv(anUtf8Path); + myV3dView->SetTextureEnv(aTexture); + } + else + { + myV3dView->SetTextureEnv(Handle(Graphic3d_TextureEnv)()); + } + + myV3dView->Redraw(); +} + +void View::onTransparency() +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + if (anAisObjectsList.Extent() == 0) + { + return; + } + + double aTranspValue = anAisObjectsList.First()->Transparency(); + DialogTransparency aDlg(this); + aDlg.setValue(int(aTranspValue * 10)); + connect(&aDlg, SIGNAL(sendTransparencyChanged(int)), SLOT(onTransparencyChanged(int))); + aDlg.exec(); +} + +void View::onTransparencyChanged(int theVal) +{ + AIS_ListOfInteractive anAisObjectsList; + myContext->DisplayedObjects(anAisObjectsList); + double aTranspValue = theVal / 10.; + for(AIS_ListOfInteractive::Iterator anIter(anAisObjectsList); + anIter.More(); anIter.Next()) + { + const Handle(AIS_InteractiveObject)& anAisObject = anIter.Value(); + myContext->SetTransparency(anAisObject, aTranspValue, Standard_False); + } + myContext->UpdateCurrentViewer(); +} diff -Nru opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/View.h opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/View.h --- opencascade-7.4.1+dfsg1/samples/qt/OCCTOverview/src/View.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/OCCTOverview/src/View.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,203 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef VIEW_H +#define VIEW_H + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +class TopoDS_Shape; + +enum CurrentAction3d +{ + CurrentAction3d_Nothing, + CurrentAction3d_DynamicZooming, + CurrentAction3d_WindowZooming, + CurrentAction3d_DynamicPanning, + CurrentAction3d_GlobalPanning, + CurrentAction3d_DynamicRotation, + CurrentAction3d_ObjectDececting +}; +enum ViewAction +{ + ViewAction_FitAll, + ViewAction_FitArea, + ViewAction_Zoom, + ViewAction_Pan, + ViewAction_GlobalPan, + ViewAction_Front, + ViewAction_Back, + ViewAction_Top, + ViewAction_Bottom, + ViewAction_Left, + ViewAction_Right, + ViewAction_Axo, + ViewAction_Rotation, + ViewAction_Reset, + ViewAction_HlrOff, + ViewAction_HlrOn, + ViewAction_Shading, + ViewAction_Wireframe, + ViewAction_Transparency +}; +enum RaytraceAction +{ + RaytraceAction_Raytracing, + RaytraceAction_Shadows, + RaytraceAction_Reflections, + RaytraceAction_Antialiasing +}; + +//! Qt widget containing V3d_View and toolbar with view manipulation buttons. +//! Also use AIS_ViewController for redirecting user input (mouse, keyboard) +//! into 3D viewer events (rotation, panning, zooming) +class View: public QWidget, protected AIS_ViewController +{ + Q_OBJECT +public: + View (const Handle(AIS_InteractiveContext)& theContext, bool theIs3dView, QWidget* theParent); + + ~View() + { + delete myBackMenu; + } + + virtual void init(); + QList getViewActions(); + QAction* getViewAction(ViewAction theAction); + QList getRaytraceActions(); + QAction* getRaytraceAction(RaytraceAction theAction); + + void EnableRaytracing(); + void DisableRaytracing(); + + void SetRaytracedShadows (bool theState); + void SetRaytracedReflections (bool theState); + void SetRaytracedAntialiasing (bool theState); + + bool IsRaytracingMode() const { return myIsRaytracing; } + bool IsShadowsEnabled() const { return myIsShadowsEnabled; } + bool IsReflectionsEnabled() const { return myIsReflectionsEnabled; } + bool IsAntialiasingEnabled() const { return myIsAntialiasingEnabled; } + + static QString GetMessages(int type,TopAbs_ShapeEnum aSubShapeType, TopAbs_ShapeEnum aShapeType); + static QString GetShapeType(TopAbs_ShapeEnum aShapeType); + + Standard_EXPORT static void OnButtonuseraction(int ExerciceSTEP, Handle(AIS_InteractiveContext)& ); + Standard_EXPORT static void DoSelection(int Id, Handle(AIS_InteractiveContext)& ); + Standard_EXPORT static void OnSetSelectionMode(Handle(AIS_InteractiveContext)&, + Standard_Integer&, + TopAbs_ShapeEnum& SelectionMode, + Standard_Boolean& ); + virtual QPaintEngine* paintEngine() const; + const Handle(V3d_View)& getView() const { return myV3dView; } +signals: + void selectionChanged(); + +public slots: + void fitAll(); + void axo(); + void hlrOn(); + void hlrOff(); + void shading(); + void wireframe(); + void onTransparency(); + + void updateToggled( bool ); + void onBackground(); + void onEnvironmentMap(); + void onRaytraceAction(); + +private slots: +void onTransparencyChanged(int theVal); + +protected: + virtual void paintEvent( QPaintEvent* ) Standard_OVERRIDE; + virtual void resizeEvent( QResizeEvent* ) Standard_OVERRIDE; + virtual void mousePressEvent( QMouseEvent* ) Standard_OVERRIDE; + virtual void mouseReleaseEvent(QMouseEvent* ) Standard_OVERRIDE; + virtual void mouseMoveEvent( QMouseEvent* ) Standard_OVERRIDE; + virtual void wheelEvent(QWheelEvent*) Standard_OVERRIDE; + + virtual void addItemInPopup( QMenu* ); + + Handle(AIS_InteractiveContext)& getContext() { return myContext; } + + void activateCursor( const CurrentAction3d ); + + CurrentAction3d getCurrentMode() const { return myCurrentMode; } + +private: + void initCursors(); + void initViewActions(); + void initRaytraceActions(); + + QAction* RegisterAction(QString theIconPath, QString thePromt); + +private: + bool myIsRaytracing; + bool myIsShadowsEnabled; + bool myIsReflectionsEnabled; + bool myIsAntialiasingEnabled; + + bool myIs3dView; + + Handle(V3d_View) myV3dView; + Handle(AIS_InteractiveContext) myContext; + AIS_MouseGestureMap myDefaultGestures; + Graphic3d_Vec2i myClickPos; + + void updateView(); + + //! Setup mouse gestures. + void defineMouseGestures(); + + //! Set current action. + void setCurrentAction (CurrentAction3d theAction) + { + myCurrentMode = theAction; + defineMouseGestures(); + } + + //! Handle selection changed event. + void OnSelectionChanged(const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) Standard_OVERRIDE; + CurrentAction3d myCurrentMode; + Standard_Real myCurZoom; + QMap myViewActions; + QMap myRaytraceActions; + QMenu* myBackMenu; + QToolBar* myViewBar; +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Tutorial/custom.bat opencascade-7.5.1+dfsg1/samples/qt/Tutorial/custom.bat --- opencascade-7.4.1+dfsg1/samples/qt/Tutorial/custom.bat 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Tutorial/custom.bat 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -@echo off -rem Define QTDIR variable - -set "QTDIR=" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Tutorial/custom.bat.template opencascade-7.5.1+dfsg1/samples/qt/Tutorial/custom.bat.template --- opencascade-7.4.1+dfsg1/samples/qt/Tutorial/custom.bat.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Tutorial/custom.bat.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,5 @@ +@echo off +rem Rename this file to custom.bat, +rem and define QTDIR variable. + +set "QTDIR=" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Tutorial/custom.sh opencascade-7.5.1+dfsg1/samples/qt/Tutorial/custom.sh --- opencascade-7.4.1+dfsg1/samples/qt/Tutorial/custom.sh 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Tutorial/custom.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -#!/bin/bash -#Define QTDIR variable - -export QTDIR="" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Tutorial/custom.sh.template opencascade-7.5.1+dfsg1/samples/qt/Tutorial/custom.sh.template --- opencascade-7.4.1+dfsg1/samples/qt/Tutorial/custom.sh.template 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Tutorial/custom.sh.template 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,5 @@ +#!/bin/bash +# Rename this file to custom.sh, +# and define QTDIR variable. + +export QTDIR="" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Tutorial/env.bat opencascade-7.5.1+dfsg1/samples/qt/Tutorial/env.bat --- opencascade-7.4.1+dfsg1/samples/qt/Tutorial/env.bat 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Tutorial/env.bat 2021-02-02 08:51:56.000000000 +0000 @@ -1,8 +1,10 @@ @echo off -call "%~dp0..\..\..\env.bat" %1 %2 %3 +if exist "%~dp0custom.bat" ( + call "%~dp0custom.bat" %1 %2 %3 +) -call "custom.bat" %1 %2 %3 +call "%~dp0..\..\..\env.bat" %1 %2 %3 set "RES_DIR=%~dp0win%ARCH%\%VCVER%\res" set "CSF_ResourcesDefaults=%RES_DIR%" diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Tutorial/.gitignore opencascade-7.5.1+dfsg1/samples/qt/Tutorial/.gitignore --- opencascade-7.4.1+dfsg1/samples/qt/Tutorial/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Tutorial/.gitignore 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,7 @@ +/debug +/release +*.sln +*.vcxproj* +.qmake.stash +/custom.bat +/custom.sh diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Tutorial/src/DocumentTut.cxx opencascade-7.5.1+dfsg1/samples/qt/Tutorial/src/DocumentTut.cxx --- opencascade-7.4.1+dfsg1/samples/qt/Tutorial/src/DocumentTut.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Tutorial/src/DocumentTut.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,7 +26,7 @@ QApplication::setOverrideCursor( Qt::WaitCursor ); TopoDS_Shape aBottle=MakeBottle(50,70,30); Handle(AIS_Shape) AISBottle=new AIS_Shape(aBottle); - getContext()->SetMaterial (AISBottle, Graphic3d_NOM_GOLD, Standard_False); + getContext()->SetMaterial (AISBottle, Graphic3d_NameOfMaterial_Gold, Standard_False); getContext()->SetDisplayMode(AISBottle, 1, Standard_False); getContext()->Display(AISBottle, Standard_False); const Handle(AIS_InteractiveObject)& anIOAISBottle = AISBottle; diff -Nru opencascade-7.4.1+dfsg1/samples/qt/Tutorial/Tutorial.pro opencascade-7.5.1+dfsg1/samples/qt/Tutorial/Tutorial.pro --- opencascade-7.4.1+dfsg1/samples/qt/Tutorial/Tutorial.pro 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/qt/Tutorial/Tutorial.pro 2021-02-02 08:51:56.000000000 +0000 @@ -53,8 +53,6 @@ equals(MACOSX_USE_GLX, true): DEFINES += MACOSX_USE_GLX DEFINES += OCC_CONVERT_SIGNALS QT_NO_STL !macx | equals(MACOSX_USE_GLX, true): LIBS += -L$$QMAKE_LIBDIR_X11 $$QMAKE_LIBS_X11 -L$$QMAKE_LIBDIR_OPENGL $$QMAKE_LIBS_OPENGL $$QMAKE_LIBS_THREAD - LIBS += -lfreeimageplus - LIBS += -ltbb -ltbbmalloc QMAKE_CXXFLAGS += -std=gnu++11 } diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/ANC101.tcl opencascade-7.5.1+dfsg1/samples/tcl/ANC101.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/ANC101.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/ANC101.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -276,7 +276,7 @@ # Show result pload VISUALIZATION vinit Driver1/Viewer1/View1 -vbackground -color 0.784314 0.784314 1 +vbackground -color C8C8FF vdisplay -dispMode 1 result vfit vaspects result -setFaceBoundaryDraw 1 -mostContinuity c2 diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/cpu.tcl opencascade-7.5.1+dfsg1/samples/tcl/cpu.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/cpu.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/cpu.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -255,27 +255,27 @@ vlight add directional direction 1 -1 -2 head 1 vdisplay case - vsetcolor case 0.7 0.7 0.7 + vsetcolor case GRAY70 vdisplay title - vsetcolor title 0.1 0.1 0.1 + vsetcolor title GRAY10 # board is mostly yellow (edges, triangle markers) - foreach f [explode board f] { vdisplay $f; vsetcolor $f 0.7 0.5 0.3 } + foreach f [explode board f] { vdisplay $f; vsetcolor $f B3803D } # top and bottom faces are light-green (outside) and dark-green (inside) - vsetcolor board_4 0 0.6 0.55 - vsetcolor board_5 0 0.6 0.55 - vsetcolor board_12 0 0.3 0.33 - vsetcolor board_14 0 0.3 0.33 + vsetcolor board_4 00998C + vsetcolor board_5 00998C + vsetcolor board_12 004D54 + vsetcolor board_14 004D54 vdisplay rpads - vsetcolor rpads 0.7 0.6 0.4 + vsetcolor rpads B39966 vdisplay bpads - vsetcolor bpads 0.7 0.6 0.4 + vsetcolor bpads B39966 vdisplay brpk - vsetcolor brpk 0.5 0.4 0.3 + vsetcolor brpk 80664D donly board case rpads brpk; fit } @@ -287,17 +287,17 @@ NewDocument D MDTV-XCAF SetName D [XAddShape D board 0] "Board" -foreach f [explode board f] { XSetColor D $f 0.7 0.5 0.3 } -XSetColor D board_4 0 0.6 0.55 -XSetColor D board_5 0 0.6 0.55 -XSetColor D board_12 0 0.3 0.33 -XSetColor D board_14 0 0.3 0.33 +foreach f [explode board f] { XSetColor D $f B3803D } +XSetColor D board_4 00998C +XSetColor D board_5 00998C +XSetColor D board_12 004D54 +XSetColor D board_14 004D54 SetName D [XAddShape D case 0] "Case" -XSetColor D case 0.7 0.7 0.7 +XSetColor D case GRAY70 SetName D [XAddShape D title 0] "Case title" -XSetColor D title 0.1 0.1 0.1 +XSetColor D title GRAY10 SetName D [XAddShape D rpads 1] "Top side contact pads" SetName D [XAddShape D bpads 1] "Bottom contact pads" @@ -306,17 +306,17 @@ SetName D [XFindShape D Rpad] "Big round pad" SetName D [XFindShape D spad_1] "Square pad 1" SetName D [XFindShape D spad_2] "Square pad 2" -XSetColor D rpad 0.7 0.6 0.4 -XSetColor D Rpad 0.7 0.6 0.4 -XSetColor D bpad 0.7 0.6 0.4 -XSetColor D spad_1 0.7 0.6 0.4 -XSetColor D spad_2 0.7 0.6 0.4 +XSetColor D rpad B39966 +XSetColor D Rpad B39966 +XSetColor D bpad B39966 +XSetColor D spad_1 B39966 +XSetColor D spad_2 B39966 SetName D [XAddShape D brpk 1] "Bottom packages" SetName D [XFindShape D rpk] "Bottom package" -XSetColor D rpk1 0.7 0.7 0.7 -XSetColor D rpk2 0.5 0.4 0.3 -XSetColor D rpk3 0.7 0.7 0.7 +XSetColor D rpk1 GRAY70 +XSetColor D rpk2 80664D +XSetColor D rpk3 GRAY70 XShow D vlight clear diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/dimensions.tcl opencascade-7.5.1+dfsg1/samples/tcl/dimensions.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/dimensions.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/dimensions.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -36,9 +36,7 @@ # Form dimension names list to set parameters with vdimparam command set aList {rd_1 rd_2 ad_1 ad_2 ad_3} -for {set i 1} {$i <= 10} {incr i} { -lappend aList ld_$i -} +for {set i 1} {$i <= 10} {incr i} { lappend aList ld_$i } puts "Creating dimensions..." vdimension ld_1 -length -shapes bs_27 -plane xoy -color black -flyout -15 @@ -48,7 +46,7 @@ vdimension ld_5 -length -shapes as_28 -plane xoy -color black -flyout -15 vdimension ld_6 -length -shapes as_18 -plane xoy -color black -flyout 30 vdimension ld_7 -length -shapes bs_20 -plane xoy -color black -flyout -20 -vdimension ld_8 -length -shapes as_43 -plane xoy -color black -flyout 55 -label right +vdimension ld_8 -length -shapes as_42 -plane xoy -color black -flyout 55 -label right vdimension ld_9 -length -shapes as_12 -plane xoy -color black -flyout 35 -label right vdimension ld_10 -length -shapes as_40 -plane xoy -color black -flyout 15 @@ -57,7 +55,7 @@ vdimension ad_1 -angle -shapes as_38 as_49 -color black vdimension ad_2 -angle -shapes bs_24 bs_25 -color black -vdimension ad_3 -angle -shapes as_48 as_43 -color black +vdimension ad_3 -angle -shapes as_48 as_42 -color black puts "Changing text and arrow parameters of dimensions..." foreach i $aList { @@ -67,29 +65,14 @@ vfit puts "Displaying exported shapes..." -vdisplay a b -vsetdispmode a 1 -vsetdispmode b 1 +vdisplay -dispMode 1 a b vaspects a -setmaterial steel vaspects b -setmaterial bronze puts "Clipping shapes for better view..." -vclipplane create pa -vclipplane change pa equation 0 0 1 0 -vclipplane change pa capping on -vclipplane change pa capping color 0.9 0.9 0.9 -vclipplane set pa object a - -vclipplane create pb -vclipplane change pb equation 0 0 1 0 -vclipplane change pb capping on -vclipplane change pb capping color 1.0 0.8 0.0 -vclipplane set pb object b - -vclipplane change pa capping texname $aHatch -vclipplane change pa capping texscale 0.05 -0.05 -vclipplane change pb capping texname $aHatch -vclipplane change pb capping texscale 0.05 0.05 + +vclipplane pa -set a -equation 0 0 1 0 -capping on -color GRAY90 -texName $aHatch -texScale 0.05 -0.05 +vclipplane pb -set b -equation 0 0 1 0 -capping on -color GOLD -texName $aHatch -texScale 0.05 -0.05 vbottom vrotate -0.3 -0.3 0 diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/logo2019.tcl opencascade-7.5.1+dfsg1/samples/tcl/logo2019.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/logo2019.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/logo2019.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -77,14 +77,13 @@ SetName D [XFindShape D sb] "Core" SetName D [XFindShape D tp] "Loop" SetName D [XFindShape D rs] "Connector" -XSetColor D sb 1 0.21 0.32 -XSetColor D tp 0 0.667 0.855 -XSetColor D rs 0 0.45 0.69 +XSetColor D sb FF3652 +XSetColor D tp 00AADA +XSetColor D rs 0073B0 # display -vinit -vsetcolorbg 1 1 1 -vsetdispmode 1 -XDisplay D +vinit View1 +vbackground -color WHITE +XDisplay -dispMode 1 D vtop vfit diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/markers.tcl opencascade-7.5.1+dfsg1/samples/tcl/markers.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/markers.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/markers.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -56,7 +56,7 @@ set aRow [expr $aMarkerType - 7] set aCol 5 set aName [lindex $aMarkerTypeNames $aMarkerType] - vdrawtext "$aName" "$aName" -pos 0 [expr $aRow + 0.5] 0 -color 0.5 1.0 1.0 -halign center -valign center -angle 000 -zoom 0 -height 12 -aspect bold -font $aLabelFont -noupdate + vdrawtext "$aName" "$aName" -pos 0 [expr $aRow + 0.5] 0 -color 7FFFFF -halign center -valign center -angle 000 -zoom 0 -height 12 -aspect bold -font $aLabelFont -noupdate vdisplay -top -noupdate "$aName" if { $aMarkerType == 13 } { vmarkerstest m${aMarkerType}_${aCol} $aCol $aRow 0 PointsOnSide=1 FileName=$aCustom1 diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/materials.tcl opencascade-7.5.1+dfsg1/samples/tcl/materials.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/materials.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/materials.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -4,36 +4,22 @@ #Title: Material properties in viewer set THE_MATERIALS {brass bronze copper gold jade neon_phc pewter obsidian plaster plastic satin silver steel stone chrome aluminium water glass diamond charcoal} -set THE_COLORS {default red green blue1} +set THE_COLORS {default red green blue} set THE_ROW_DIST 35 proc drawLabels {} { set x 20 set y 15 - set r 0.098 - set g 0.098 - set b 0.098 foreach aMatIter $::THE_MATERIALS { - vdrawtext "$aMatIter" "$aMatIter" -pos $x $y 0 -color $r $g $b -halign right -valign center -angle 000 -zoom 0 -height 14 -aspect regular -font Arial + vdrawtext "$aMatIter" "$aMatIter" -pos $x $y 0 -color GRAY10 -halign right -valign center -angle 000 -zoom 0 -height 14 -aspect regular -font Arial incr y 10 } set x 40 set y 5 foreach aColIter $::THE_COLORS { - if { $aColIter == "red" } { - set r 1.0 - set g 0.0 - set b 0 - } elseif { $aColIter == "green" } { - set r 0.0 - set g 1.0 - set b 0.0 - } elseif { $aColIter == "blue1" } { - set r 0.0 - set g 0.0 - set b 1.0 - } - vdrawtext "$aColIter" "$aColIter" -pos $x $y 0 -color $r $g $b -halign center -valign center -angle 000 -zoom 0 -height 14 -aspect regular -font Arial + set aLabColor "$aColIter" + if { "$aColIter" == "default" } { set aLabColor BLACK } + vdrawtext "$aColIter" "$aColIter" -pos $x $y 0 -color "$aLabColor" -halign center -valign center -angle 000 -zoom 0 -height 14 -aspect regular -font Arial incr x $::THE_ROW_DIST } } @@ -69,7 +55,7 @@ vinit View1 w=768 h=768 vtop vglinfo -vbackground -gradient 0.705882 0.784314 1 0.705882 0.705882 0.705882 -gradientMode VERTICAL +vbackground -gradient B4C8FF B4B4B4 -gradientMode VERTICAL vlight -change 0 -dir 0.577 -0.577 -0.577 vrenderparams -msaa 8 diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/MBBGehauseRohteil.tcl opencascade-7.5.1+dfsg1/samples/tcl/MBBGehauseRohteil.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/MBBGehauseRohteil.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/MBBGehauseRohteil.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -262,7 +262,7 @@ # Show result pload VISUALIZATION vinit Driver1/Viewer1/View1 -vbackground -color 0.784314 0.784314 1 +vbackground -color C8C8FF vdisplay -dispMode 1 result vfit vaspects result -setFaceBoundaryDraw 1 diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/ModelingDemo.tcl opencascade-7.5.1+dfsg1/samples/tcl/ModelingDemo.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/ModelingDemo.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/ModelingDemo.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -86,7 +86,7 @@ sage " fuse result rr result" sage " " fuse result rr result -donl result +donly result nexplode result f erase result fit @@ -108,13 +108,13 @@ sage " Display the Shape on Hidden Line Mode " sage " hlr hid r" sage "" -donl r +donly r hlr hid r sage " Display the Shape on HLR Mode " sage " hlr nohid r" sage " hlr hlr r" sage "" -donl r +donly r hlr nohid r hlr hlr r sage "Demo completed" diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/pathtrace_ball.tcl opencascade-7.5.1+dfsg1/samples/tcl/pathtrace_ball.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/pathtrace_ball.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/pathtrace_ball.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -57,11 +57,10 @@ } # Configure light sources -vlight del 1 -vlight change 0 head 0 -vlight change 0 direction -0.25 -1 -1 -vlight change 0 sm 0.3 -vlight change 0 int 10 +vlight -change 0 -head 0 +vlight -change 0 -direction -0.25 -1 -1 +vlight -change 0 -sm 0.3 +vlight -change 0 -int 10.0 # Load environment map vtextureenv on 1 diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/pathtrace_cube.tcl opencascade-7.5.1+dfsg1/samples/tcl/pathtrace_cube.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/pathtrace_cube.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/pathtrace_cube.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -12,11 +12,8 @@ vglinfo # setup light sources -vlight del 0 -vlight del 1 -vlight add positional head 0 pos 0.5 0.5 0.85 -vlight change 0 sm 0.06 -vlight change 0 int 30.0 +vlight -clear +vlight -add positional -head 0 -pos 0.5 0.5 0.85 -sm 0.06 -int 30.0 vvbo 0 vsetdispmode 1 @@ -57,16 +54,14 @@ # setup first inner box box c 0.3 0.3 0.2 vdisplay -noupdate c -vlocation -noupdate c -setLocation 0.55 0.3 0.0 -vlocation -noupdate c -rotate 0 0 0 0 0 1 -30 +vlocation -noupdate c -reset -rotate 0 0 0 0 0 1 -30 -translate 0.55 0.3 0.0 vsetmaterial -noupdate c plastic vbsdf c -kd 1.0 0.8 0.2 -ks 0.3 -n # setup second inner box box g 0.15 0.15 0.3 vdisplay -noupdate g -vlocation -noupdate g -setLocation 0.7 0.25 0.2 -vlocation -noupdate g -rotate 0 0 0 0 0 1 10 +vlocation -noupdate g -reset -rotate 0 0 0 0 0 1 10 -translate 0.7 0.25 0.2 vsetmaterial -noupdate g glass vbsdf g -absorpColor 0.8 1.0 0.8 vbsdf g -absorpCoeff 6 diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/pathtrace_materials.tcl opencascade-7.5.1+dfsg1/samples/tcl/pathtrace_materials.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/pathtrace_materials.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/pathtrace_materials.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -208,8 +208,9 @@ vviewparams -size 170.508 # Restore light source parameters -vlight clear -vlight add directional direction -0.303949 -0.434084 -0.848048 smoothness 0.3 intensity 12 +vlight -clear +vlight -add ambient +vlight -add directional -direction -0.303949 -0.434084 -0.848048 -smoothness 0.3 -intensity 12 # Load environment map vtextureenv on 1 diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/pencil.tcl opencascade-7.5.1+dfsg1/samples/tcl/pencil.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/pencil.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/pencil.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -46,18 +46,17 @@ XAddShape D body_1 XAddShape D core_1 -#XSetColor D body_1 0. 0. 1. -for {set i 1} {$i <= 26} {incr i} {XSetColor D body_1_$i 0. 0. 1.} -XSetColor D body_1_1 0.9 0.5 0.4 -XSetColor D body_1_9 0.9 0.5 0.4 -for {set i 10} {$i <= 22} {incr i} {XSetColor D body_1_$i 0.6 0.7 0.0} -XSetColor D core_1 0.1 0.1 1. -foreach ff [explode core_1 f] { XSetColor D $ff 0.1 0.1 1. ; puts "set color $ff" } - -XShow D +for {set i 1} {$i <= 26} {incr i} {XSetColor D body_1_$i BLUE} +XSetColor D body_1_1 E68066 +XSetColor D body_1_9 E68066 +for {set i 10} {$i <= 22} {incr i} {XSetColor D body_1_$i 99B300} +XSetColor D core_1 1A1AFF +foreach ff [explode core_1 f] { XSetColor D $ff 1A1AFF ; puts "set color $ff" } +vclear +vinit View1 +XDisplay -dispMode 1 D -explore vfit -vsetdispmode 1 vrenderparams -msaa 8 vbackground -color WHITE diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/Penrose.tcl opencascade-7.5.1+dfsg1/samples/tcl/Penrose.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/Penrose.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/Penrose.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -68,18 +68,18 @@ vdisplay b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 # set colors like in boxes of on OCC logo -vsetcolor b1 0.8671875 0 0.16015625 -vsetcolor b2 0.96484375 0.8671875 0 -vsetcolor b3 0.609375 0.97734375 0.09375 -vsetcolor b4 0.90234375 0 0.48046875 -vsetcolor b5 0 0.48046875 0.73828125 -vsetcolor b6 0.578125 0 0.48046875 -vsetcolor b7 0.93359375 0.609375 0 -vsetcolor b8 0 0.70703125 0.9296875 -vsetcolor b9 0 0.64453125 0.48046875 -vsetcolor b10 0 0.48046875 0.73828125 +vsetcolor b1 DD0029 +vsetcolor b2 F6DD00 +vsetcolor b3 98F918 +vsetcolor b4 E9007A +vsetcolor b5 007ABC +vsetcolor b6 93007A +vsetcolor b7 EE9800 +vsetcolor b8 00B489 +vsetcolor b9 00A47A +vsetcolor b10 007ABC # set material to plastic for better look for {set i 1} {$i <= 10} {incr i} {vsetmaterial b$i plastic} -vdrawtext label "Which\nbox\nis\ncloser\nto\nyou?" -pos 0 -6 -2 -color 0 0 0 -halign left -valign bottom -angle 0 -zoom 0 -height 40 +vdrawtext label "Which\nbox\nis\ncloser\nto\nyou?" -pos 0 -6 -2 -color BLACK -halign left -valign bottom -angle 0 -zoom 0 -height 40 diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/snowflake.tcl opencascade-7.5.1+dfsg1/samples/tcl/snowflake.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/snowflake.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/snowflake.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -121,21 +121,21 @@ compound sample occ name material sheets scale mass text compound snowflake lines text drawing +bounding snowflake -save x1 y1 z1 x2 y2 z2 # display in 3d view vinit Driver1/Viewer1/View1 w=1024 h=768 vdisplay snowflake lines text vrenderparams -msaa 8 -vsetcolor snowflake 0 0 0 -vsetcolor lines 0 0 0 -vsetcolor text 0 0 0 +vsetcolor snowflake BLACK +vsetcolor lines BLACK +vsetcolor text BLACK vbackground -color WHITE vtop vfit # add dimension: # detect vertices extremal in X direction -bounding snowflake -save x1 y1 z1 x2 y2 z2 plane f1 x1 0 0 1 0 0 plane f2 x2 0 0 1 0 0 mkface f1 f1 @@ -159,7 +159,3 @@ } } vdimension length -length -shapes $v1 $v2 -plane xoy -value 0.001 -dispunits mm -showunits -flyout 70 -label above -color black -text 5 3d sh - -if { [regexp HAVE_GL2PS [dversion]] } { - puts "You can use command vexport to generate PDF: vexport your_file_path.pdf" -} diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/vis_pbr_spheres.tcl opencascade-7.5.1+dfsg1/samples/tcl/vis_pbr_spheres.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/vis_pbr_spheres.tcl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/vis_pbr_spheres.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,91 @@ +# Script demonstrating PBR metallic-roughness material properties +#Category: Visualization +#Title: PBR metallic-rougness spheres + +pload XDE OCAF MODELING VISUALIZATION +psphere s 0.35 + +catch { Close D } +XNewDoc D + +# grid of spheres +set THE_UPPER 6 +foreach i [list 0 3] { + set aPrefix "" + set aColor "GRAY80" + if { $i != 0 } { + set aPrefix "g_"; + set aColor "CCB11D" + } + set aColShapes {} + for { set m 0 } { $m <= $THE_UPPER } { incr m } { + set aRowShapes {} + for { set r 0 } { $r <= $THE_UPPER } { incr r } { + set aName ${aPrefix}m${m}r${r} + copy s $aName + lappend aRowShapes $aName + ttranslate $aName ${r} ${i} ${m} + } + set aName ${aPrefix}m${m} + compound {*}$aRowShapes $aName + lappend aColShapes $aName + } + set aName ${aPrefix}spheres + compound {*}$aColShapes $aName + set aLabName "Gray Spheres" + if { $i != 0 } { set aLabName "Golden Spheres" } + set aLabComp [XAddShape D $aName 0] + SetName D $aLabComp $aLabName + + for { set m 0 } { $m <= $THE_UPPER } { incr m } { + set aMet [expr 100 * ${m}/$THE_UPPER] + set aName ${aPrefix}m${m} + XAddComponent D $aLabComp $aName + set aLabCompCol [XFindShape D $aName] + SetName D $aLabCompCol "${aPrefix}m${aMet}%" + SetName D {*}[XFindComponent D $aName] "${aPrefix}m${aMet}%" + for { set r 0 } { $r <= $THE_UPPER } { incr r } { + set aRoug [expr 100 * ${r}/$THE_UPPER] + set aName ${aPrefix}m${m}r${r} + XAddComponent D $aLabCompCol $aName + set aLab [XFindComponent D $aName] + SetName D {*}$aLab "${aPrefix}m${aMet}%_r${aRoug}%" + XAddVisMaterial D $aName -baseColor $aColor -metallic ${m}/$THE_UPPER -roughness ${r}/$THE_UPPER + XSetVisMaterial D {*}$aLab $aName + } + } +} +set aLab [XFindShape D s] +SetName D {*}$aLab "Sphere" + +XGetAllVisMaterials D + +# labels +text2brep tm "Metal" -plane 0 -1 0 0 0 -1 -height 0.5 -pos -0.5 0 6.5 -halign left -valign top -font monospace +text2brep tnm "Non-metal" -plane 0 -1 0 0 0 -1 -height 0.5 -pos -0.5 0 -0.5 -halign right -valign top -font monospace +text2brep ts "Smooth" -plane 0 -1 0 1 0 0 -height 0.5 -pos -0.5 0 -0.5 -halign left -valign top -font monospace +text2brep tr "Rough" -plane 0 -1 0 1 0 0 -height 0.5 -pos 6.5 0 -0.5 -halign right -valign top -font monospace +compound tm tnm ts tr labs +set aLab [XAddShape D labs 0] +SetName D $aLab "Labels" +XAddComponent D $aLab tm +XAddComponent D $aLab tnm +XAddComponent D $aLab ts +XAddComponent D $aLab tr +SetName D {*}[XFindComponent D tm] "Metal" +SetName D [XFindShape D tm] "Metal" +SetName D {*}[XFindComponent D tnm] "Non-metal" +SetName D [XFindShape D tnm] "Non-metal" +SetName D {*}[XFindComponent D ts] "Smooth" +SetName D [XFindShape D ts] "Smooth" +SetName D {*}[XFindComponent D tr] "Rough" +SetName D [XFindShape D tr] "Rough" + +vclear +vinit View1 -width 768 -height 768 +vfront +vrenderparams -shadingModel PBR +vlight -change 0 -intensity 2.5 +XDisplay -dispMode 1 D +vcamera -ortho +vfit diff -Nru opencascade-7.4.1+dfsg1/samples/tcl/xde.tcl opencascade-7.5.1+dfsg1/samples/tcl/xde.tcl --- opencascade-7.4.1+dfsg1/samples/tcl/xde.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/tcl/xde.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -28,19 +28,20 @@ SetName D [XFindShape D link]:3 "Nut instance 2" puts "- Pin will be white" -XSetColor D [XFindShape D pin] 1 1 1 +XSetColor D [XFindShape D pin] WHITE puts "- Nut itself will be dark gray" -XSetColor D [XFindShape D nut] 0.1 0.1 0.1 +XSetColor D [XFindShape D nut] GRAY10 puts "- Nut instance #1 will be red" -XSetColor D [XFindShape D link]:2 1 0 0 +XSetColor D [XFindShape D link]:2 RED puts "- Nut instance #2 will be green" -XSetColor D [XFindShape D link]:3 0 1 0 +XSetColor D [XFindShape D link]:3 GREEN puts "Starting DF browser..." DFBrowse D puts "Expand the document tree to see its structure and assigned names" puts "Showing assembly in 3d view..." -XShow D +vclear +vinit View1 +XDisplay -dispMode 1 D -explore vfit -vsetdispmode 1 diff -Nru opencascade-7.4.1+dfsg1/samples/webgl/CMakeLists.txt opencascade-7.5.1+dfsg1/samples/webgl/CMakeLists.txt --- opencascade-7.4.1+dfsg1/samples/webgl/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/webgl/CMakeLists.txt 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,66 @@ +cmake_minimum_required(VERSION 3.2) + +project(occt-webgl-sample) + +set(CMAKE_CXX_STANDARD 11) +set(APP_VERSION_MAJOR 1) +set(APP_VERSION_MINOR 0) +set(APP_TARGET occt-webgl-sample) + +# customize build +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s USE_WEBGL2=1") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ALLOW_MEMORY_GROWTH=1") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s SAFE_HEAP=1") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s NO_EXIT_RUNTIME=1") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s TOTAL_MEMORY=16MB") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ABORTING_MALLOC=0") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s FORCE_FILESYSTEM=1") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --preload-file myFile") + +INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}) +file(GLOB SOURCES + *.h + *.cpp +) +source_group ("Headers" FILES + WasmOcctView.h) +source_group ("Sources" FILES + WasmOcctView.cpp + main.cpp) + +# FreeType +find_package(freetype REQUIRED NO_DEFAULT_PATH) +if(freetype_FOUND) + message (STATUS "Using FreeType from \"${freetype_DIR}\"" ) +else() + message(WARNING "Could not find FreeType, please set freetype_DIR variable." ) +endif() + +# Open CASCADE Technology +find_package(OpenCASCADE REQUIRED NO_DEFAULT_PATH) +if(OpenCASCADE_FOUND) + message (STATUS "Using OpenCASCADE from \"${OpenCASCADE_DIR}\"" ) + INCLUDE_DIRECTORIES(${OpenCASCADE_INCLUDE_DIR}) + LINK_DIRECTORIES(${OpenCASCADE_LIBRARY_DIR}) +else() + message(WARNING "Could not find OpenCASCADE, please set OpenCASCADE_DIR variable." ) + set(OCCT_LIBRARY_DIR) + set(OCCT_BIN_DIR) +endif() + +set(OpenCASCADE_LIBS TKRWMesh TKBinXCAF TKBin TKBinL TKOpenGl TKXCAF TKVCAF TKCAF TKV3d TKHLR TKMesh TKService TKShHealing TKPrim TKTopAlgo TKGeomAlgo TKBRep TKGeomBase TKG3d TKG2d TKMath TKLCAF TKCDF TKernel) + +add_executable(${APP_TARGET} ${SOURCES}) +target_link_libraries( + ${APP_TARGET} + ${OpenCASCADE_LIBS} + freetype +) +set_target_properties(${APP_TARGET} PROPERTIES LINK_FLAGS "-s EXPORTED_FUNCTIONS=['_main','_onFileDataRead'] -s EXTRA_EXPORTED_RUNTIME_METHODS=['ccall','cwrap']") + +install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" LIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}") +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.wasm DESTINATION ${CMAKE_INSTALL_PREFIX}) +install(FILES occt-webgl-sample.html DESTINATION ${CMAKE_INSTALL_PREFIX}) +install(FILES ${OpenCASCADE_RESOURCE_DIR}/DrawResources/OCC_logo.png DESTINATION ${CMAKE_INSTALL_PREFIX}) +install(FILES ${OpenCASCADE_RESOURCE_DIR}/DrawResources/lamp.ico DESTINATION ${CMAKE_INSTALL_PREFIX}) diff -Nru opencascade-7.4.1+dfsg1/samples/webgl/.gitignore opencascade-7.5.1+dfsg1/samples/webgl/.gitignore --- opencascade-7.4.1+dfsg1/samples/webgl/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/webgl/.gitignore 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2 @@ +/build +/work diff -Nru opencascade-7.4.1+dfsg1/samples/webgl/main.cpp opencascade-7.5.1+dfsg1/samples/webgl/main.cpp --- opencascade-7.4.1+dfsg1/samples/webgl/main.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/webgl/main.cpp 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,80 @@ +#include + +#include "WasmOcctView.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +//! Global viewer instance. +static WasmOcctView aViewer; + +//! Dummy main loop callback for a single shot. +extern "C" void onMainLoop() +{ + // do nothing here - viewer updates are handled on demand + emscripten_cancel_main_loop(); +} + +//! File data read event. +extern "C" void onFileDataRead (void* theOpaque, void* theBuffer, int theDataLen) +{ + const char* aName = theOpaque != NULL ? (const char* )theOpaque : ""; + { + AIS_ListOfInteractive aShapes; + aViewer.Context()->DisplayedObjects (AIS_KOI_Shape, -1, aShapes); + for (AIS_ListOfInteractive::Iterator aShapeIter (aShapes); aShapeIter.More(); aShapeIter.Next()) + { + aViewer.Context()->Remove (aShapeIter.Value(), false); + } + } + + Standard_ArrayStreamBuffer aStreamBuffer ((const char* )theBuffer, theDataLen); + std::istream aStream (&aStreamBuffer); + TopoDS_Shape aShape; + BRep_Builder aBuilder; + BRepTools::Read (aShape, aStream, aBuilder); + + Handle(AIS_Shape) aShapePrs = new AIS_Shape (aShape); + aShapePrs->SetMaterial (Graphic3d_NameOfMaterial_Silver); + aViewer.Context()->Display (aShapePrs, AIS_Shaded, 0, false); + aViewer.View()->FitAll (0.01, false); + aViewer.View()->Redraw(); + Message::DefaultMessenger()->Send (TCollection_AsciiString("Loaded file ") + aName, Message_Info); + Message::DefaultMessenger()->Send (OSD_MemInfo::PrintInfo(), Message_Trace); +} + +//! File read error event. +static void onFileReadFailed (void* theOpaque) +{ + const char* aName = (const char* )theOpaque; + Message::DefaultMessenger()->Send (TCollection_AsciiString("Error: unable to load file ") + aName, Message_Fail); +} + +int main() +{ + Message::DefaultMessenger()->Printers().First()->SetTraceLevel (Message_Trace); + Handle(Message_PrinterSystemLog) aJSConsolePrinter = new Message_PrinterSystemLog ("webgl-sample", Message_Trace); + Message::DefaultMessenger()->AddPrinter (aJSConsolePrinter); // open JavaScript console within the Browser to see this output + Message::DefaultMessenger()->Send (TCollection_AsciiString("NbLogicalProcessors: ") + OSD_Parallel::NbLogicalProcessors(), Message_Trace); + + // setup a dummy single-shot main loop callback just to shut up a useless Emscripten error message on calling eglSwapInterval() + emscripten_set_main_loop (onMainLoop, -1, 0); + + aViewer.run(); + Message::DefaultMessenger()->Send (OSD_MemInfo::PrintInfo(), Message_Trace); + + // load some file + emscripten_async_wget_data ("samples/Ball.brep", (void* )"samples/Ball.brep", onFileDataRead, onFileReadFailed); + return 0; +} diff -Nru opencascade-7.4.1+dfsg1/samples/webgl/occt-webgl-sample.html opencascade-7.5.1+dfsg1/samples/webgl/occt-webgl-sample.html --- opencascade-7.4.1+dfsg1/samples/webgl/occt-webgl-sample.html 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/webgl/occt-webgl-sample.html 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,106 @@ + + + + + +OCCT WebGL Viewer Sample + + + +

OCCT WebGL Viewer Sample

+
+ + +
+ +
+

Console output:

+

+ + + + diff -Nru opencascade-7.4.1+dfsg1/samples/webgl/ReadMe.md opencascade-7.5.1+dfsg1/samples/webgl/ReadMe.md --- opencascade-7.4.1+dfsg1/samples/webgl/ReadMe.md 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/webgl/ReadMe.md 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,28 @@ +OCCT WebGL Viewer sample {#occt_samples_webgl} +================== + +This sample demonstrates simple way of using OCCT libraries in Web application written in C++ and translated into WebAssembly module using Emscripten SDK (emsdk): +https://emscripten.org/ + +Sample consists of the Open CASCADE 3D Viewer with a button for opening a model in BREP format. +The sample requires a WebGL 2.0 capable browser supporting WebAssembly 1.0 (Wasm). + +Installation and configuration: + 1. Install Emscripten SDK and activate minimal configuration (Python, Java and CLang) following *emsdk* documentation. Activate also MinGW when building sample on Windows host. + 2. Build (using *emsdk*) or download FreeType static library. + 3. Configure CMake for building Open CASCADE Technology (OCCT) static libraries (BUILD_LIBRARY_TYPE="Static"). + For this, activate *emsdk* command prompt, configure CMake for building OCCT using cross-compilation toolchain, disable *BUILD_MODULE_Draw*. + 4. Perform building and installation steps. +~~~~~ + > ${EMSDK}/fastcomp/emscripten/cmake/Modules/Platform/Emscripten.cmake +~~~~~ + 5. Configure CMake for building this WebGL sample using *emsdk* with paths to OCCT and FreeType. Perform building and installation steps. + 6. Copy data/occ/Ball.brep from OCCT into "samples" folder within WebGL sample installation path. + 7. Navigate to installation folder and start web server from it; Python coming with *emsdk* can be used for this purpose: +~~~~~ + > python -m SimpleHTTPServer 8080 +~~~~~ + 8. Open compatible browser and enter path taking into account your web server settings: +~~~~~ + > http://localhost:8080/occt-webgl-sample.html +~~~~~ diff -Nru opencascade-7.4.1+dfsg1/samples/webgl/WasmOcctView.cpp opencascade-7.5.1+dfsg1/samples/webgl/WasmOcctView.cpp --- opencascade-7.4.1+dfsg1/samples/webgl/WasmOcctView.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/webgl/WasmOcctView.cpp 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,678 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#include "WasmOcctView.h" + +#include "WasmVKeys.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define THE_CANVAS_ID "canvas" + +namespace +{ + EM_JS(int, jsCanvasGetWidth, (), { + return canvas.width; + }); + + EM_JS(int, jsCanvasGetHeight, (), { + return canvas.height; + }); + + EM_JS(float, jsDevicePixelRatio, (), { + var aDevicePixelRatio = window.devicePixelRatio || 1; + return aDevicePixelRatio; + }); + + //! Return cavas size in pixels. + static Graphic3d_Vec2i jsCanvasSize() + { + return Graphic3d_Vec2i (jsCanvasGetWidth(), jsCanvasGetHeight()); + } +} + +// ================================================================ +// Function : WasmOcctView +// Purpose : +// ================================================================ +WasmOcctView::WasmOcctView() +: myDevicePixelRatio (1.0f), + myUpdateRequests (0) +{ +} + +// ================================================================ +// Function : ~WasmOcctView +// Purpose : +// ================================================================ +WasmOcctView::~WasmOcctView() +{ +} + +// ================================================================ +// Function : run +// Purpose : +// ================================================================ +void WasmOcctView::run() +{ + initWindow(); + initViewer(); + initDemoScene(); + if (myView.IsNull()) + { + return; + } + + myView->MustBeResized(); + myView->Redraw(); + + // There is no inifinite message loop, main() will return from here immediately. + // Tell that our Module should be left loaded and handle events through callbacks. + //emscripten_set_main_loop (redrawView, 60, 1); + //emscripten_set_main_loop (redrawView, -1, 1); + EM_ASM(Module['noExitRuntime'] = true); +} + +// ================================================================ +// Function : initWindow +// Purpose : +// ================================================================ +void WasmOcctView::initWindow() +{ + myDevicePixelRatio = jsDevicePixelRatio(); + myCanvasId = THE_CANVAS_ID; + const char* aTargetId = !myCanvasId.IsEmpty() ? myCanvasId.ToCString() : EMSCRIPTEN_EVENT_TARGET_WINDOW; + const EM_BOOL toUseCapture = EM_TRUE; + emscripten_set_resize_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, this, toUseCapture, onResizeCallback); + + emscripten_set_mousedown_callback (aTargetId, this, toUseCapture, onMouseCallback); + emscripten_set_mouseup_callback (aTargetId, this, toUseCapture, onMouseCallback); + emscripten_set_mousemove_callback (aTargetId, this, toUseCapture, onMouseCallback); + emscripten_set_dblclick_callback (aTargetId, this, toUseCapture, onMouseCallback); + emscripten_set_click_callback (aTargetId, this, toUseCapture, onMouseCallback); + emscripten_set_mouseenter_callback (aTargetId, this, toUseCapture, onMouseCallback); + emscripten_set_mouseleave_callback (aTargetId, this, toUseCapture, onMouseCallback); + emscripten_set_wheel_callback (aTargetId, this, toUseCapture, onWheelCallback); + + emscripten_set_touchstart_callback (aTargetId, this, toUseCapture, onTouchCallback); + emscripten_set_touchend_callback (aTargetId, this, toUseCapture, onTouchCallback); + emscripten_set_touchmove_callback (aTargetId, this, toUseCapture, onTouchCallback); + emscripten_set_touchcancel_callback(aTargetId, this, toUseCapture, onTouchCallback); + + //emscripten_set_keypress_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, this, toUseCapture, onKeyCallback); + emscripten_set_keydown_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, this, toUseCapture, onKeyDownCallback); + emscripten_set_keyup_callback (EMSCRIPTEN_EVENT_TARGET_WINDOW, this, toUseCapture, onKeyUpCallback); +} + +// ================================================================ +// Function : dumpGlInfo +// Purpose : +// ================================================================ +void WasmOcctView::dumpGlInfo (bool theIsBasic) +{ + TColStd_IndexedDataMapOfStringString aGlCapsDict; + myView->DiagnosticInformation (aGlCapsDict, theIsBasic ? Graphic3d_DiagnosticInfo_Basic : Graphic3d_DiagnosticInfo_Complete); + if (theIsBasic) + { + TCollection_AsciiString aViewport; + aGlCapsDict.FindFromKey ("Viewport", aViewport); + aGlCapsDict.Clear(); + aGlCapsDict.Add ("Viewport", aViewport); + } + aGlCapsDict.Add ("Display scale", TCollection_AsciiString(myDevicePixelRatio)); + + // beautify output + { + TCollection_AsciiString* aGlVer = aGlCapsDict.ChangeSeek ("GLversion"); + TCollection_AsciiString* aGlslVer = aGlCapsDict.ChangeSeek ("GLSLversion"); + if (aGlVer != NULL + && aGlslVer != NULL) + { + *aGlVer = *aGlVer + " [GLSL: " + *aGlslVer + "]"; + aGlslVer->Clear(); + } + } + + TCollection_AsciiString anInfo; + for (TColStd_IndexedDataMapOfStringString::Iterator aValueIter (aGlCapsDict); aValueIter.More(); aValueIter.Next()) + { + if (!aValueIter.Value().IsEmpty()) + { + if (!anInfo.IsEmpty()) + { + anInfo += "\n"; + } + anInfo += aValueIter.Key() + ": " + aValueIter.Value(); + } + } + + ::Message::DefaultMessenger()->Send (anInfo, Message_Warning); +} + +// ================================================================ +// Function : initPixelScaleRatio +// Purpose : +// ================================================================ +void WasmOcctView::initPixelScaleRatio() +{ + SetTouchToleranceScale (myDevicePixelRatio); + if (!myView.IsNull()) + { + myView->ChangeRenderingParams().Resolution = (unsigned int )(96.0 * myDevicePixelRatio + 0.5); + } + if (!myContext.IsNull()) + { + myContext->SetPixelTolerance (int(myDevicePixelRatio * 6.0)); + if (!myViewCube.IsNull()) + { + static const double THE_CUBE_SIZE = 60.0; + myViewCube->SetSize (myDevicePixelRatio * THE_CUBE_SIZE, false); + myViewCube->SetBoxFacetExtension (myViewCube->Size() * 0.15); + myViewCube->SetAxesPadding (myViewCube->Size() * 0.10); + myViewCube->SetFontHeight (THE_CUBE_SIZE * 0.16); + if (myViewCube->HasInteractiveContext()) + { + myContext->Redisplay (myViewCube, false); + } + } + } +} + +// ================================================================ +// Function : initViewer +// Purpose : +// ================================================================ +bool WasmOcctView::initViewer() +{ + // Build with "--preload-file MyFontFile.ttf" option + // and register font in Font Manager to use custom font(s). + /*const char* aFontPath = "MyFontFile.ttf"; + if (Handle(Font_SystemFont) aFont = Font_FontMgr::GetInstance()->CheckFont (aFontPath)) + { + Font_FontMgr::GetInstance()->RegisterFont (aFont, true); + } + else + { + Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: font '") + aFontPath + "' is not found", Message_Fail); + }*/ + + Handle(Aspect_DisplayConnection) aDisp; + Handle(OpenGl_GraphicDriver) aDriver = new OpenGl_GraphicDriver (aDisp, false); + aDriver->ChangeOptions().buffersNoSwap = true; // swap has no effect in WebGL + if (!aDriver->InitContext()) + { + Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: EGL initialization failed"), Message_Fail); + return false; + } + + Handle(V3d_Viewer) aViewer = new V3d_Viewer (aDriver); + aViewer->SetComputedMode (false); + aViewer->SetDefaultShadingModel (Graphic3d_TOSM_FRAGMENT); + aViewer->SetDefaultLights(); + aViewer->SetLightOn(); + + Handle(Aspect_NeutralWindow) aWindow = new Aspect_NeutralWindow(); + Graphic3d_Vec2i aWinSize = jsCanvasSize(); + if (aWinSize.x() < 10 || aWinSize.y() < 10) + { + Message::DefaultMessenger()->Send (TCollection_AsciiString ("Warning: invalid canvas size"), Message_Warning); + } + aWindow->SetSize (aWinSize.x(), aWinSize.y()); + + myTextStyle = new Prs3d_TextAspect(); + myTextStyle->SetFont (Font_NOF_ASCII_MONO); + myTextStyle->SetHeight (12); + myTextStyle->Aspect()->SetColor (Quantity_NOC_GRAY95); + myTextStyle->Aspect()->SetColorSubTitle (Quantity_NOC_BLACK); + myTextStyle->Aspect()->SetDisplayType (Aspect_TODT_SHADOW); + myTextStyle->Aspect()->SetTextFontAspect (Font_FA_Bold); + myTextStyle->Aspect()->SetTextZoomable (false); + myTextStyle->SetHorizontalJustification (Graphic3d_HTA_LEFT); + myTextStyle->SetVerticalJustification (Graphic3d_VTA_BOTTOM); + + myView = new V3d_View (aViewer); + myView->SetImmediateUpdate (false); + myView->ChangeRenderingParams().Resolution = (unsigned int )(96.0 * myDevicePixelRatio + 0.5); + myView->ChangeRenderingParams().ToShowStats = true; + myView->ChangeRenderingParams().StatsTextAspect = myTextStyle->Aspect(); + myView->ChangeRenderingParams().StatsTextHeight = (int )myTextStyle->Height(); + myView->SetWindow (aWindow); + dumpGlInfo (false); + + myContext = new AIS_InteractiveContext (aViewer); + initPixelScaleRatio(); + return true; +} + +// ================================================================ +// Function : initDemoScene +// Purpose : +// ================================================================ +void WasmOcctView::initDemoScene() +{ + if (myContext.IsNull()) + { + return; + } + + //myView->TriedronDisplay (Aspect_TOTP_LEFT_LOWER, Quantity_NOC_GOLD, 0.08, V3d_WIREFRAME); + + myViewCube = new AIS_ViewCube(); + // presentation parameters + initPixelScaleRatio(); + myViewCube->SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_TriedronPers, Aspect_TOTP_RIGHT_LOWER, Graphic3d_Vec2i (100, 100))); + myViewCube->Attributes()->SetDatumAspect (new Prs3d_DatumAspect()); + myViewCube->Attributes()->DatumAspect()->SetTextAspect (myTextStyle); + // animation parameters + myViewCube->SetViewAnimation (myViewAnimation); + myViewCube->SetFixedAnimationLoop (false); + myViewCube->SetAutoStartAnimation (true); + myContext->Display (myViewCube, false); + + // Build with "--preload-file MySampleFile.brep" option to load some shapes here. +} + + +// ================================================================ +// Function : updateView +// Purpose : +// ================================================================ +void WasmOcctView::updateView() +{ + if (!myView.IsNull()) + { + if (++myUpdateRequests == 1) + { + emscripten_async_call (onRedrawView, this, 0); + } + } +} + +// ================================================================ +// Function : redrawView +// Purpose : +// ================================================================ +void WasmOcctView::redrawView() +{ + if (!myView.IsNull()) + { + FlushViewEvents (myContext, myView, true); + } +} + +// ================================================================ +// Function : handleViewRedraw +// Purpose : +// ================================================================ +void WasmOcctView::handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) +{ + myUpdateRequests = 0; + AIS_ViewController::handleViewRedraw (theCtx, theView); + if (myToAskNextFrame) + { + // ask more frames + ++myUpdateRequests; + emscripten_async_call (onRedrawView, this, 0); + } +} + +// ================================================================ +// Function : onResizeEvent +// Purpose : +// ================================================================ +EM_BOOL WasmOcctView::onResizeEvent (int theEventType, const EmscriptenUiEvent* theEvent) +{ + (void )theEventType; // EMSCRIPTEN_EVENT_RESIZE or EMSCRIPTEN_EVENT_CANVASRESIZED + (void )theEvent; + if (myView.IsNull()) + { + return EM_FALSE; + } + + Handle(Aspect_NeutralWindow) aWindow = Handle(Aspect_NeutralWindow)::DownCast (myView->Window()); + Graphic3d_Vec2i aWinSizeOld, aWinSizeNew (jsCanvasSize()); + if (aWinSizeNew.x() < 10 || aWinSizeNew.y() < 10) + { + Message::DefaultMessenger()->Send (TCollection_AsciiString ("Warning: invalid canvas size"), Message_Warning); + } + aWindow->Size (aWinSizeOld.x(), aWinSizeOld.y()); + const float aPixelRatio = jsDevicePixelRatio(); + if (aWinSizeNew != aWinSizeOld + || aPixelRatio != myDevicePixelRatio) + { + if (myDevicePixelRatio != aPixelRatio) + { + myDevicePixelRatio = aPixelRatio; + initPixelScaleRatio(); + } + aWindow->SetSize (aWinSizeNew.x(), aWinSizeNew.y()); + myView->MustBeResized(); + myView->Invalidate(); + myView->Redraw(); + dumpGlInfo (true); + } + return EM_TRUE; +} + +// ================================================================ +// Function : onMouseEvent +// Purpose : +// ================================================================ +EM_BOOL WasmOcctView::onMouseEvent (int theEventType, const EmscriptenMouseEvent* theEvent) +{ + if (myView.IsNull()) + { + return EM_FALSE; + } + + Graphic3d_Vec2i aWinSize; + myView->Window()->Size (aWinSize.x(), aWinSize.y()); + const Graphic3d_Vec2i aNewPos = convertPointToBacking (Graphic3d_Vec2i (theEvent->targetX, theEvent->targetY)); + Aspect_VKeyFlags aFlags = 0; + if (theEvent->ctrlKey == EM_TRUE) { aFlags |= Aspect_VKeyFlags_CTRL; } + if (theEvent->shiftKey == EM_TRUE) { aFlags |= Aspect_VKeyFlags_SHIFT; } + if (theEvent->altKey == EM_TRUE) { aFlags |= Aspect_VKeyFlags_ALT; } + if (theEvent->metaKey == EM_TRUE) { aFlags |= Aspect_VKeyFlags_META; } + + const bool isEmulated = false; + const Aspect_VKeyMouse aButtons = WasmVKeys_MouseButtonsFromNative (theEvent->buttons); + switch (theEventType) + { + case EMSCRIPTEN_EVENT_MOUSEMOVE: + { + if ((aNewPos.x() < 0 || aNewPos.x() > aWinSize.x() + || aNewPos.y() < 0 || aNewPos.y() > aWinSize.y()) + && PressedMouseButtons() == Aspect_VKeyMouse_NONE) + { + return EM_FALSE; + } + if (UpdateMousePosition (aNewPos, aButtons, aFlags, isEmulated)) + { + updateView(); + } + break; + } + case EMSCRIPTEN_EVENT_MOUSEDOWN: + case EMSCRIPTEN_EVENT_MOUSEUP: + { + if (aNewPos.x() < 0 || aNewPos.x() > aWinSize.x() + || aNewPos.y() < 0 || aNewPos.y() > aWinSize.y()) + { + return EM_FALSE; + } + if (UpdateMouseButtons (aNewPos, aButtons, aFlags, isEmulated)) + { + updateView(); + } + break; + } + case EMSCRIPTEN_EVENT_CLICK: + case EMSCRIPTEN_EVENT_DBLCLICK: + { + if (aNewPos.x() < 0 || aNewPos.x() > aWinSize.x() + || aNewPos.y() < 0 || aNewPos.y() > aWinSize.y()) + { + return EM_FALSE; + } + break; + } + case EMSCRIPTEN_EVENT_MOUSEENTER: + { + break; + } + case EMSCRIPTEN_EVENT_MOUSELEAVE: + { + // there is no SetCapture() support, so that mouse unclick events outside canvas will not arrive, + // so we have to forget current state... + if (UpdateMouseButtons (aNewPos, Aspect_VKeyMouse_NONE, aFlags, isEmulated)) + { + updateView(); + } + break; + } + } + return EM_TRUE; +} + +// ================================================================ +// Function : onWheelEvent +// Purpose : +// ================================================================ +EM_BOOL WasmOcctView::onWheelEvent (int theEventType, const EmscriptenWheelEvent* theEvent) +{ + if (myView.IsNull() + || theEventType != EMSCRIPTEN_EVENT_WHEEL) + { + return EM_FALSE; + } + + Graphic3d_Vec2i aWinSize; + myView->Window()->Size (aWinSize.x(), aWinSize.y()); + const Graphic3d_Vec2i aNewPos = convertPointToBacking (Graphic3d_Vec2i (theEvent->mouse.targetX, theEvent->mouse.targetY)); + if (aNewPos.x() < 0 || aNewPos.x() > aWinSize.x() + || aNewPos.y() < 0 || aNewPos.y() > aWinSize.y()) + { + return EM_FALSE; + } + + double aDelta = 0.0; + switch (theEvent->deltaMode) + { + case DOM_DELTA_PIXEL: + { + aDelta = theEvent->deltaY / (5.0 * myDevicePixelRatio); + break; + } + case DOM_DELTA_LINE: + { + aDelta = theEvent->deltaY * 8.0; + break; + } + case DOM_DELTA_PAGE: + { + aDelta = theEvent->deltaY >= 0.0 ? 24.0 : -24.0; + break; + } + } + + if (UpdateZoom (Aspect_ScrollDelta (aNewPos, -aDelta))) + { + updateView(); + } + return EM_TRUE; +} + +// ================================================================ +// Function : onTouchEvent +// Purpose : +// ================================================================ +EM_BOOL WasmOcctView::onTouchEvent (int theEventType, const EmscriptenTouchEvent* theEvent) +{ + const double aClickTolerance = 5.0; + if (myView.IsNull()) + { + return EM_FALSE; + } + + Graphic3d_Vec2i aWinSize; + myView->Window()->Size (aWinSize.x(), aWinSize.y()); + bool hasUpdates = false; + for (int aTouchIter = 0; aTouchIter < theEvent->numTouches; ++aTouchIter) + { + const EmscriptenTouchPoint& aTouch = theEvent->touches[aTouchIter]; + if (!aTouch.isChanged) + { + continue; + } + + const Standard_Size aTouchId = (Standard_Size )aTouch.identifier; + const Graphic3d_Vec2i aNewPos = convertPointToBacking (Graphic3d_Vec2i (aTouch.canvasX, aTouch.canvasY)); + switch (theEventType) + { + case EMSCRIPTEN_EVENT_TOUCHSTART: + { + if (aNewPos.x() >= 0 && aNewPos.x() < aWinSize.x() + && aNewPos.y() >= 0 && aNewPos.y() < aWinSize.y()) + { + hasUpdates = true; + AddTouchPoint (aTouchId, Graphic3d_Vec2d (aNewPos)); + myClickTouch.From.SetValues (-1.0, -1.0); + if (myTouchPoints.Extent() == 1) + { + myClickTouch.From = Graphic3d_Vec2d (aNewPos); + } + } + break; + } + case EMSCRIPTEN_EVENT_TOUCHMOVE: + { + const int anOldIndex = myTouchPoints.FindIndex (aTouchId); + if (anOldIndex != 0) + { + hasUpdates = true; + UpdateTouchPoint (aTouchId, Graphic3d_Vec2d (aNewPos)); + if (myTouchPoints.Extent() == 1 + && (myClickTouch.From - Graphic3d_Vec2d (aNewPos)).cwiseAbs().maxComp() > aClickTolerance) + { + myClickTouch.From.SetValues (-1.0, -1.0); + } + } + break; + } + case EMSCRIPTEN_EVENT_TOUCHEND: + case EMSCRIPTEN_EVENT_TOUCHCANCEL: + { + if (RemoveTouchPoint (aTouchId)) + { + if (myTouchPoints.IsEmpty() + && myClickTouch.From.minComp() >= 0.0) + { + if (myDoubleTapTimer.IsStarted() + && myDoubleTapTimer.ElapsedTime() <= myMouseDoubleClickInt) + { + myView->FitAll (0.01, false); + myView->Invalidate(); + } + else + { + myDoubleTapTimer.Stop(); + myDoubleTapTimer.Reset(); + myDoubleTapTimer.Start(); + SelectInViewer (Graphic3d_Vec2i (myClickTouch.From), false); + } + } + hasUpdates = true; + } + break; + } + } + } + if (hasUpdates) + { + updateView(); + } + return hasUpdates || !myTouchPoints.IsEmpty() ? EM_TRUE : EM_FALSE; +} + +// ================================================================ +// Function : onKeyDownEvent +// Purpose : +// ================================================================ +EM_BOOL WasmOcctView::onKeyDownEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent) +{ + if (myView.IsNull() + || theEventType != EMSCRIPTEN_EVENT_KEYDOWN) // EMSCRIPTEN_EVENT_KEYPRESS + { + return EM_FALSE; + } + + const double aTimeStamp = EventTime(); + const Aspect_VKey aVKey = WasmVKeys_VirtualKeyFromNative (theEvent->keyCode); + if (aVKey == Aspect_VKey_UNKNOWN) + { + return EM_FALSE; + } + + if (theEvent->repeat == EM_FALSE) + { + myKeys.KeyDown (aVKey, aTimeStamp); + } + + if (Aspect_VKey2Modifier (aVKey) == 0) + { + // normal key + } + return EM_FALSE; +} + +// ================================================================ +// Function : onKeyUpEvent +// Purpose : +// ================================================================ +EM_BOOL WasmOcctView::onKeyUpEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent) +{ + if (myView.IsNull() + || theEventType != EMSCRIPTEN_EVENT_KEYUP) + { + return EM_FALSE; + } + + const double aTimeStamp = EventTime(); + const Aspect_VKey aVKey = WasmVKeys_VirtualKeyFromNative (theEvent->keyCode); + if (aVKey == Aspect_VKey_UNKNOWN) + { + return EM_FALSE; + } + + if (theEvent->repeat == EM_TRUE) + { + return EM_FALSE; + } + + const unsigned int aModif = myKeys.Modifiers(); + myKeys.KeyUp (aVKey, aTimeStamp); + if (Aspect_VKey2Modifier (aVKey) == 0) + { + // normal key released + switch (aVKey | aModif) + { + case Aspect_VKey_F: + { + myView->FitAll (0.01, false); + myView->Invalidate(); + updateView(); + return EM_TRUE; + } + } + } + return EM_FALSE; +} diff -Nru opencascade-7.4.1+dfsg1/samples/webgl/WasmOcctView.h opencascade-7.5.1+dfsg1/samples/webgl/WasmOcctView.h --- opencascade-7.4.1+dfsg1/samples/webgl/WasmOcctView.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/webgl/WasmOcctView.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,157 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef _WasmOcctView_HeaderFile +#define _WasmOcctView_HeaderFile + +#include +#include +#include + +#include +#include + +class AIS_ViewCube; + +//! Sample class creating 3D Viewer within Emscripten canvas. +class WasmOcctView : protected AIS_ViewController +{ +public: + //! Default constructor. + WasmOcctView(); + + //! Destructor. + virtual ~WasmOcctView(); + + //! Main application entry point. + void run(); + + //! Return interactive context. + const Handle(AIS_InteractiveContext)& Context() const { return myContext; } + + //! Return view. + const Handle(V3d_View)& View() const { return myView; } + + //! Return device pixel ratio for handling high DPI displays. + float DevicePixelRatio() const { return myDevicePixelRatio; } + +private: + + //! Create window. + void initWindow(); + + //! Create 3D Viewer. + bool initViewer(); + + //! Fill 3D Viewer with a DEMO items. + void initDemoScene(); + + //! Application event loop. + void mainloop(); + + //! Request view redrawing. + void updateView(); + + //! Flush events and redraw view. + void redrawView(); + + //! Handle view redraw. + virtual void handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) override; + + //! Dump WebGL context information. + void dumpGlInfo (bool theIsBasic); + + //! Initialize pixel scale ratio. + void initPixelScaleRatio(); + + //! Return point from logical units to backing store. + Graphic3d_Vec2d convertPointToBacking (const Graphic3d_Vec2d& thePnt) const + { + return thePnt * myDevicePixelRatio; + } + + //! Return point from logical units to backing store. + Graphic3d_Vec2i convertPointToBacking (const Graphic3d_Vec2i& thePnt) const + { + Graphic3d_Vec2d aPnt = Graphic3d_Vec2d (thePnt) * myDevicePixelRatio + Graphic3d_Vec2d (0.5); + return Graphic3d_Vec2i (aPnt); + } + +//! @name Emscripten callbacks +private: + //! Window resize event. + EM_BOOL onResizeEvent (int theEventType, const EmscriptenUiEvent* theEvent); + + //! Mouse event. + EM_BOOL onMouseEvent (int theEventType, const EmscriptenMouseEvent* theEvent); + + //! Scroll event. + EM_BOOL onWheelEvent (int theEventType, const EmscriptenWheelEvent* theEvent); + + //! Touch event. + EM_BOOL onTouchEvent (int theEventType, const EmscriptenTouchEvent* theEvent); + + //! Key down event. + EM_BOOL onKeyDownEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent); + + //! Key up event. + EM_BOOL onKeyUpEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent); + +//! @name Emscripten callbacks (static functions) +private: + + static EM_BOOL onResizeCallback (int theEventType, const EmscriptenUiEvent* theEvent, void* theView) + { return ((WasmOcctView* )theView)->onResizeEvent (theEventType, theEvent); } + + static void onRedrawView (void* theView) + { return ((WasmOcctView* )theView)->redrawView(); } + + static EM_BOOL onMouseCallback (int theEventType, const EmscriptenMouseEvent* theEvent, void* theView) + { return ((WasmOcctView* )theView)->onMouseEvent (theEventType, theEvent); } + + static EM_BOOL onWheelCallback (int theEventType, const EmscriptenWheelEvent* theEvent, void* theView) + { return ((WasmOcctView* )theView)->onWheelEvent (theEventType, theEvent); } + + static EM_BOOL onTouchCallback (int theEventType, const EmscriptenTouchEvent* theEvent, void* theView) + { return ((WasmOcctView* )theView)->onTouchEvent (theEventType, theEvent); } + + static EM_BOOL onKeyDownCallback (int theEventType, const EmscriptenKeyboardEvent* theEvent, void* theView) + { return ((WasmOcctView* )theView)->onKeyDownEvent (theEventType, theEvent); } + + static EM_BOOL onKeyUpCallback (int theEventType, const EmscriptenKeyboardEvent* theEvent, void* theView) + { return ((WasmOcctView* )theView)->onKeyUpEvent (theEventType, theEvent); } + +private: + + Handle(AIS_InteractiveContext) myContext; //!< interactive context + Handle(V3d_View) myView; //!< 3D view + Handle(Prs3d_TextAspect) myTextStyle; //!< text style for OSD elements + Handle(AIS_ViewCube) myViewCube; //!< view cube object + TCollection_AsciiString myCanvasId; //!< canvas element id on HTML page + Aspect_Touch myClickTouch; //!< single touch position for handling clicks + OSD_Timer myDoubleTapTimer; //!< timer for handling double tap + float myDevicePixelRatio; //!< device pixel ratio for handling high DPI displays + unsigned int myUpdateRequests; //!< counter for unhandled update requests + +}; + +#endif // _WasmOcctView_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/samples/webgl/WasmVKeys.h opencascade-7.5.1+dfsg1/samples/webgl/WasmVKeys.h --- opencascade-7.4.1+dfsg1/samples/webgl/WasmVKeys.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/samples/webgl/WasmVKeys.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,264 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of the examples of the Open CASCADE Technology software library. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + +#ifndef _WasmVKeys_HeaderFile +#define _WasmVKeys_HeaderFile + +#include + +#include + +//! Convert Emscripten mouse buttons into Aspect_VKeyMouse. +inline Aspect_VKeyMouse WasmVKeys_MouseButtonsFromNative (unsigned short theButtons) +{ + Aspect_VKeyMouse aButtons = Aspect_VKeyMouse_NONE; + if ((theButtons & 0x1) != 0) + { + aButtons |= Aspect_VKeyMouse_LeftButton; + } + if ((theButtons & 0x2) != 0) + { + aButtons |= Aspect_VKeyMouse_RightButton; + } + if ((theButtons & 0x4) != 0) + { + aButtons |= Aspect_VKeyMouse_MiddleButton; + } + return aButtons; +} + +//! Convert DOM virtual key into Aspect_VKey. +inline Aspect_VKey WasmVKeys_VirtualKeyFromNative (Standard_Integer theKey) +{ + if (theKey >= DOM_VK_0 + && theKey <= DOM_VK_9) + { + // numpad keys + return Aspect_VKey((theKey - DOM_VK_0) + Aspect_VKey_0); + } + if (theKey >= DOM_VK_A + && theKey <= DOM_VK_Z) + { + // main latin alphabet keys + return Aspect_VKey((theKey - DOM_VK_A) + Aspect_VKey_A); + } + if (theKey >= DOM_VK_F1 + && theKey <= DOM_VK_F24) + { + // special keys + if (theKey <= DOM_VK_F12) + { + return Aspect_VKey((theKey - DOM_VK_F1) + Aspect_VKey_F1); + } + return Aspect_VKey_UNKNOWN; + } + if (theKey >= DOM_VK_NUMPAD0 + && theKey <= DOM_VK_NUMPAD9) + { + // numpad keys + return Aspect_VKey((theKey - DOM_VK_NUMPAD0) + Aspect_VKey_Numpad0); + } + + switch (theKey) + { + case DOM_VK_CANCEL: + case DOM_VK_HELP: + return Aspect_VKey_UNKNOWN; + case DOM_VK_BACK_SPACE: + return Aspect_VKey_Backspace; + case DOM_VK_TAB: + return Aspect_VKey_Tab; + case DOM_VK_CLEAR: + return Aspect_VKey_UNKNOWN; + case DOM_VK_RETURN: + case DOM_VK_ENTER: + return Aspect_VKey_Enter; + case DOM_VK_SHIFT: + return Aspect_VKey_Shift; + case DOM_VK_CONTROL: + return Aspect_VKey_Control; + case DOM_VK_ALT: + return Aspect_VKey_Alt; + case DOM_VK_PAUSE: + case DOM_VK_CAPS_LOCK: + case DOM_VK_KANA: + //case DOM_VK_HANGUL: + case DOM_VK_EISU: + case DOM_VK_JUNJA: + case DOM_VK_FINAL: + case DOM_VK_HANJA: + //case DOM_VK_KANJI: + return Aspect_VKey_UNKNOWN; + case DOM_VK_ESCAPE: + return Aspect_VKey_Escape; + case DOM_VK_CONVERT: + case DOM_VK_NONCONVERT: + case DOM_VK_ACCEPT: + case DOM_VK_MODECHANGE: + return Aspect_VKey_UNKNOWN; + case DOM_VK_SPACE: + return Aspect_VKey_Space; + case DOM_VK_PAGE_UP: + return Aspect_VKey_PageUp; + case DOM_VK_PAGE_DOWN: + return Aspect_VKey_PageDown; + case DOM_VK_END: + return Aspect_VKey_End; + case DOM_VK_HOME: + return Aspect_VKey_Home; + case DOM_VK_LEFT: + return Aspect_VKey_Left; + case DOM_VK_UP: + return Aspect_VKey_Up; + case DOM_VK_RIGHT: + return Aspect_VKey_Right; + case DOM_VK_DOWN: + return Aspect_VKey_Down; + case DOM_VK_SELECT: + case DOM_VK_PRINT: + case DOM_VK_EXECUTE: + case DOM_VK_PRINTSCREEN: + case DOM_VK_INSERT: + return Aspect_VKey_UNKNOWN; + case DOM_VK_DELETE: + return Aspect_VKey_Delete; + case DOM_VK_COLON: + return Aspect_VKey_Comma; + case DOM_VK_SEMICOLON: + return Aspect_VKey_Semicolon; + case DOM_VK_LESS_THAN: + return Aspect_VKey_UNKNOWN; + case DOM_VK_EQUALS: + return Aspect_VKey_Equal; + case DOM_VK_GREATER_THAN: + return Aspect_VKey_UNKNOWN; + case DOM_VK_QUESTION_MARK: + return Aspect_VKey_Slash; + case DOM_VK_AT: // @ key + return Aspect_VKey_UNKNOWN; + case DOM_VK_WIN: + return Aspect_VKey_Meta; + case DOM_VK_CONTEXT_MENU: + case DOM_VK_SLEEP: + return Aspect_VKey_UNKNOWN; + case DOM_VK_MULTIPLY: + return Aspect_VKey_NumpadMultiply; + case DOM_VK_ADD: + return Aspect_VKey_NumpadAdd; + case DOM_VK_SEPARATOR: + return Aspect_VKey_UNKNOWN; + case DOM_VK_SUBTRACT: + return Aspect_VKey_NumpadSubtract; + case DOM_VK_DECIMAL: + return Aspect_VKey_UNKNOWN; + case DOM_VK_DIVIDE: + return Aspect_VKey_NumpadDivide; + case DOM_VK_NUM_LOCK: + return Aspect_VKey_Numlock; + case DOM_VK_SCROLL_LOCK: + return Aspect_VKey_Scroll; + case DOM_VK_WIN_OEM_FJ_JISHO: + case DOM_VK_WIN_OEM_FJ_MASSHOU: + case DOM_VK_WIN_OEM_FJ_TOUROKU: + case DOM_VK_WIN_OEM_FJ_LOYA: + case DOM_VK_WIN_OEM_FJ_ROYA: + case DOM_VK_CIRCUMFLEX: + return Aspect_VKey_UNKNOWN; + case DOM_VK_EXCLAMATION: + case DOM_VK_DOUBLE_QUOTE: + //case DOM_VK_HASH: + case DOM_VK_DOLLAR: + case DOM_VK_PERCENT: + case DOM_VK_AMPERSAND: + case DOM_VK_UNDERSCORE: + case DOM_VK_OPEN_PAREN: + case DOM_VK_CLOSE_PAREN: + case DOM_VK_ASTERISK: + return Aspect_VKey_UNKNOWN; + case DOM_VK_PLUS: + return Aspect_VKey_Plus; + case DOM_VK_PIPE: + case DOM_VK_HYPHEN_MINUS: + return Aspect_VKey_UNKNOWN; + case DOM_VK_OPEN_CURLY_BRACKET: + return Aspect_VKey_BracketLeft; + case DOM_VK_CLOSE_CURLY_BRACKET: + return Aspect_VKey_BracketRight; + case DOM_VK_TILDE: + return Aspect_VKey_Tilde; + case DOM_VK_VOLUME_MUTE: + return Aspect_VKey_VolumeMute; + case DOM_VK_VOLUME_DOWN: + return Aspect_VKey_VolumeDown; + case DOM_VK_VOLUME_UP: + return Aspect_VKey_VolumeUp; + case DOM_VK_COMMA: + return Aspect_VKey_Comma; + case DOM_VK_PERIOD: + return Aspect_VKey_Period; + case DOM_VK_SLASH: + return Aspect_VKey_Slash; + case DOM_VK_BACK_QUOTE: + return Aspect_VKey_UNKNOWN; + case DOM_VK_OPEN_BRACKET: + return Aspect_VKey_BracketLeft; + case DOM_VK_BACK_SLASH: + return Aspect_VKey_Backslash; + case DOM_VK_CLOSE_BRACKET: + return Aspect_VKey_BracketRight; + case DOM_VK_QUOTE: + return Aspect_VKey_UNKNOWN; + case DOM_VK_META: + return Aspect_VKey_Meta; + case DOM_VK_ALTGR: + return Aspect_VKey_Alt; + case DOM_VK_WIN_ICO_HELP: + case DOM_VK_WIN_ICO_00: + case DOM_VK_WIN_ICO_CLEAR: + case DOM_VK_WIN_OEM_RESET: + case DOM_VK_WIN_OEM_JUMP: + case DOM_VK_WIN_OEM_PA1: + case DOM_VK_WIN_OEM_PA2: + case DOM_VK_WIN_OEM_PA3: + case DOM_VK_WIN_OEM_WSCTRL: + case DOM_VK_WIN_OEM_CUSEL: + case DOM_VK_WIN_OEM_ATTN: + case DOM_VK_WIN_OEM_FINISH: + case DOM_VK_WIN_OEM_COPY: + case DOM_VK_WIN_OEM_AUTO: + case DOM_VK_WIN_OEM_ENLW: + case DOM_VK_WIN_OEM_BACKTAB: + case DOM_VK_ATTN: + case DOM_VK_CRSEL: + case DOM_VK_EXSEL: + case DOM_VK_EREOF: + return Aspect_VKey_UNKNOWN; + case DOM_VK_PLAY: + return Aspect_VKey_MediaPlayPause; + case DOM_VK_ZOOM: + case DOM_VK_PA1: + case DOM_VK_WIN_OEM_CLEAR: + return Aspect_VKey_UNKNOWN; + } + return Aspect_VKey_UNKNOWN; +} + +#endif // _WasmVKeys_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Adaptor2d/Adaptor2d_OffsetCurve.cxx opencascade-7.5.1+dfsg1/src/Adaptor2d/Adaptor2d_OffsetCurve.cxx --- opencascade-7.4.1+dfsg1/src/Adaptor2d/Adaptor2d_OffsetCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Adaptor2d/Adaptor2d_OffsetCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -33,7 +34,6 @@ #include #include #include -#include #include //======================================================================= @@ -112,7 +112,6 @@ myOffset = Offset; myFirst = myCurve->FirstParameter(); myLast = myCurve->LastParameter(); - } //======================================================================= @@ -299,18 +298,11 @@ gp_Pnt2d Adaptor2d_OffsetCurve::Value(const Standard_Real U) const { if ( myOffset != 0.) { - gp_Pnt2d P; - gp_Vec2d V; - Standard_Real Norme; - myCurve->D1(U, P, V); - Norme = V.Magnitude(); - V.SetCoord(-V.Y(),V.X()); - if (Norme >= gp::Resolution()) { - return gp_Pnt2d(P.XY()+myOffset*V.XY()/Norme); - } - else { - throw gp_VectorWithNullMagnitude("Adaptor2d_OffsetCurve::Value"); - } + gp_Pnt2d aP; + gp_Vec2d aV; + myCurve->D1(U, aP, aV); + Geom2dEvaluator::CalculateD0(aP, aV, myOffset); + return aP; } else { return myCurve->Value(U); @@ -333,28 +325,15 @@ //======================================================================= void Adaptor2d_OffsetCurve::D1 - (const Standard_Real U, gp_Pnt2d& P, gp_Vec2d& V) const +(const Standard_Real U, gp_Pnt2d& P, gp_Vec2d& V) const { - gp_Vec2d V1,V2,V3; - gp_Pnt2d PP; - Standard_Real Norme; - if ( myOffset != 0. ) { - myCurve->D2(U,PP,V1,V2); - Norme = V1.Magnitude(); - V3.SetCoord( -V1.Y(),V1.X()); - V2.SetCoord( -V2.Y(),V2.X()); - if ( Norme >= gp::Resolution()) { - P = gp_Pnt2d( PP.XY()+myOffset*V3.XY()/Norme); - V = gp_Vec2d( V1.XY()+ - (myOffset/Norme)*(V2.XY()-V3.XY()* - (V2.XY()*V3.XY())/(Norme*Norme))); - } - else { - throw gp_VectorWithNullMagnitude("Adaptor2d_OffsetCurve::D1"); - } + if (myOffset != 0.) { + gp_Vec2d aV2; + myCurve->D2(U, P, V, aV2); + Geom2dEvaluator::CalculateD1( P, V, aV2, myOffset); } else { - myCurve->D1(U,P,V); + myCurve->D1(U, P, V); } } @@ -364,38 +343,15 @@ //======================================================================= void Adaptor2d_OffsetCurve::D2 - (const Standard_Real U, gp_Pnt2d& P, gp_Vec2d& V1, gp_Vec2d& V2) const +(const Standard_Real U, gp_Pnt2d& P, gp_Vec2d& V1, gp_Vec2d& V2) const { - if ( myOffset != 0.) { - gp_Vec2d T1,T2,T3; - gp_Pnt2d PP; - Standard_Real Norme; - myCurve->D3(U,PP,T1,T2,T3); - - Norme = T1.Magnitude(); - if ( Norme >= gp::Resolution()) { - gp_Vec2d N1,N2,N3; // Ni = Z ^ Ti - N1.SetCoord( -T1.Y(), T1.X()); - N2.SetCoord( -T2.Y(), T2.X()); - N3.SetCoord( -T3.Y(), T3.X()); - Standard_Real d12,d13,d22,Nor3,Nor11; - d12 = T1*T2; - d22 = T2*T2; - d13 = T1*T3; - Nor3 = Norme*Norme*Norme; - Nor11 = Nor3*Nor3*Nor3*Norme*Norme; - V2 = gp_Vec2d( -1 * ( (d22+d13)/Nor3 + 3*d12*d12/Nor11) * N1.XY()); - V2 = gp_Vec2d( V2.XY() - (2*d12/Nor3)*N2.XY() + N3.XY()/Norme); - V2 = gp_Vec2d( myOffset*V2.XY() + T2.XY()); - - D1( U,P,V1); - } - else { - throw gp_VectorWithNullMagnitude("Adaptor2d_OffsetCurve::D2"); - } + if (myOffset != 0.) { + gp_Vec2d aV3; + myCurve->D3(U, P, V1, V2, aV3); + Geom2dEvaluator::CalculateD2(P, V1, V2, aV3, Standard_False, myOffset); } else { - myCurve->D2(U,P,V1,V2); + myCurve->D2(U, P, V1, V2); } } @@ -404,14 +360,18 @@ //purpose : //======================================================================= -//void Adaptor2d_OffsetCurve::D3 -// (const Standard_Real T, -// gp_Pnt2d& P, gp_Vec2d& V1, gp_Vec2d& V2, gp_Vec2d& V3) const void Adaptor2d_OffsetCurve::D3 - (const Standard_Real , - gp_Pnt2d& , gp_Vec2d& , gp_Vec2d& , gp_Vec2d& ) const + (const Standard_Real U, + gp_Pnt2d& P, gp_Vec2d& V1, gp_Vec2d& V2, gp_Vec2d& V3) const { - throw Standard_NotImplemented("Adaptor2d_OffsetCurve::D3"); + if (myOffset != 0.) { + gp_Vec2d aV4 = myCurve->DN(U, 4); + myCurve->D3(U, P, V1, V2, V3); + Geom2dEvaluator::CalculateD3(P, V1, V2, V3, aV4, Standard_False, myOffset); + } + else { + myCurve->D3(U, P, V1, V2, V3); + } } //======================================================================= @@ -420,7 +380,6 @@ //======================================================================= gp_Vec2d Adaptor2d_OffsetCurve::DN -// (const Standard_Real T, const Standard_Integer N) const (const Standard_Real , const Standard_Integer ) const { throw Standard_NotImplemented("Adaptor2d_OffsetCurve::DN"); @@ -530,7 +489,7 @@ gp_Elips2d Adaptor2d_OffsetCurve::Ellipse() const { if (myCurve->GetType() == GeomAbs_Ellipse && myOffset == 0.) { - return myCurve->Ellipse();; + return myCurve->Ellipse(); } else { throw Standard_NoSuchObject("Adaptor2d_OffsetCurve:Ellipse"); @@ -656,19 +615,16 @@ Standard_Integer nbs = 20; - if (theCurve->GetType() == GeomAbs_Line) - nbs = 2; - else if (theCurve->GetType() == GeomAbs_BezierCurve) + if (theCurve->GetType() == GeomAbs_BezierCurve) { - nbs = 3 + theCurve->NbPoles(); + nbs = Max(nbs, 3 + theCurve->NbPoles()); } else if (theCurve->GetType() == GeomAbs_BSplineCurve) { - nbs = theCurve->NbKnots(); - nbs *= theCurve->Degree(); + nbs = Max(nbs, theCurve->NbKnots() * theCurve->Degree()); } - if (nbs > 200) - nbs = 200; + if (nbs > 300) + nbs = 300; return nbs; } diff -Nru opencascade-7.4.1+dfsg1/src/Adaptor2d/Adaptor2d_OffsetCurve.hxx opencascade-7.5.1+dfsg1/src/Adaptor2d/Adaptor2d_OffsetCurve.hxx --- opencascade-7.4.1+dfsg1/src/Adaptor2d/Adaptor2d_OffsetCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Adaptor2d/Adaptor2d_OffsetCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -193,7 +193,6 @@ Standard_Real myFirst; Standard_Real myLast; - }; diff -Nru opencascade-7.4.1+dfsg1/src/Adaptor3d/Adaptor3d_HVertex.cxx opencascade-7.5.1+dfsg1/src/Adaptor3d/Adaptor3d_HVertex.cxx --- opencascade-7.4.1+dfsg1/src/Adaptor3d/Adaptor3d_HVertex.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Adaptor3d/Adaptor3d_HVertex.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,7 +22,9 @@ IMPLEMENT_STANDARD_RTTIEXT(Adaptor3d_HVertex,Standard_Transient) Adaptor3d_HVertex::Adaptor3d_HVertex () -{} +: myTol(0.0) +{ +} Adaptor3d_HVertex::Adaptor3d_HVertex (const gp_Pnt2d& P, diff -Nru opencascade-7.4.1+dfsg1/src/Adaptor3d/Adaptor3d_TopolTool.cxx opencascade-7.5.1+dfsg1/src/Adaptor3d/Adaptor3d_TopolTool.cxx --- opencascade-7.4.1+dfsg1/src/Adaptor3d/Adaptor3d_TopolTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Adaptor3d/Adaptor3d_TopolTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -60,8 +60,17 @@ } -Adaptor3d_TopolTool::Adaptor3d_TopolTool () : myNbSamplesU(-1),nbRestr(0),idRestr(0) - +Adaptor3d_TopolTool::Adaptor3d_TopolTool () +: myNbSamplesU(-1), + myNbSamplesV(-1), + nbRestr(0), + idRestr(0), + Uinf(0.0), + Usup(0.0), + Vinf(0.0), + Vsup(0.0), + nbVtx(0), + idVtx(0) { } @@ -540,7 +549,7 @@ if (surumin || survmin || surumax || survmax) { return(Standard_True); } - return(Standard_False);; + return Standard_False; } } @@ -654,7 +663,10 @@ } -void Adaptor3d_TopolTool::ComputeSamplePoints() { +void Adaptor3d_TopolTool::ComputeSamplePoints() +{ + const Standard_Integer aMaxNbSample = 50; + Standard_Real uinf,usup,vinf,vsup; uinf = myS->FirstUParameter(); usup = myS->LastUParameter(); vinf = myS->FirstVParameter(); vsup = myS->LastVParameter(); @@ -692,31 +704,49 @@ //-- if(nbsu<6) nbsu=6; - if(nbsv<6) nbsv=6; - - myNbSamplesU = nbsu; - myNbSamplesV = nbsv; + if(nbsv<6) nbsv=6; - if(nbsu>8 || nbsv>8) { - if(typS == GeomAbs_BSplineSurface) { + if (typS == GeomAbs_BSplineSurface) { + if (nbsu > 8 || nbsv>8) { const Handle(Geom_BSplineSurface)& Bspl = myS->BSpline(); Standard_Integer nbup = Bspl->NbUPoles(); Standard_Integer nbvp = Bspl->NbVPoles(); - TColgp_Array2OfPnt array2(1,nbup,1,nbvp); + TColgp_Array2OfPnt array2(1, nbup, 1, nbvp); Bspl->Poles(array2); - Analyse(array2,nbup,nbvp,myNbSamplesU,myNbSamplesV); + Analyse(array2, nbup, nbvp, nbsu, nbsv); } - else if(typS == GeomAbs_BezierSurface) { + // Check anisotropy + Standard_Real anULen = (usup - uinf) / myS->UResolution(1.); + Standard_Real anVLen = (vsup - vinf) / myS->VResolution(1.); + Standard_Real aRatio = anULen / anVLen; + if (aRatio >= 10.) + { + nbsu *= 2; + nbsu = Min(nbsu, aMaxNbSample); + } + else if (aRatio <= 0.1) + { + nbsv *= 2; + nbsv = Min(nbsv, aMaxNbSample); + } + } + else if (typS == GeomAbs_BezierSurface) { + if (nbsu > 8 || nbsv > 8) { const Handle(Geom_BezierSurface)& Bez = myS->Bezier(); Standard_Integer nbup = Bez->NbUPoles(); Standard_Integer nbvp = Bez->NbVPoles(); - TColgp_Array2OfPnt array2(1,nbup,1,nbvp); + TColgp_Array2OfPnt array2(1, nbup, 1, nbvp); Bez->Poles(array2); - Analyse(array2,nbup,nbvp,myNbSamplesU,myNbSamplesV); + Analyse(array2, nbup, nbvp, nbsu, nbsv); } } + + myNbSamplesU = nbsu; + myNbSamplesV = nbsv; + } + Standard_Integer Adaptor3d_TopolTool::NbSamplesU() { if(myNbSamplesU <0) { @@ -933,6 +963,7 @@ const Standard_Integer theNUmin, const Standard_Integer theNVmin) { + const Standard_Integer aMaxPnts = 1001; const Handle(Geom_BSplineSurface)& aBS = myS->BSpline(); Standard_Real uinf,usup,vinf,vsup; uinf = myS->FirstUParameter(); usup = myS->LastUParameter(); @@ -999,11 +1030,20 @@ nbsu = theNUmin; bUuniform = Standard_True; } - + else if (nbsu > aMaxPnts) + { + nbsu = aMaxPnts; + bUuniform = Standard_True; + } if(nbsv < theNVmin) { nbsv = theNVmin; bVuniform = Standard_True; } + else if (nbsv > aMaxPnts) + { + nbsv = aMaxPnts; + bVuniform = Standard_True; + } TColStd_Array1OfReal anUPars(1, nbsu); TColStd_Array1OfBoolean anUFlg(1, nbsu); diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_ApproxAFunc2Var.cxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_ApproxAFunc2Var.cxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_ApproxAFunc2Var.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_ApproxAFunc2Var.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -244,7 +244,7 @@ { Standard_Integer iu=myConditions.UOrder(),iv=myConditions.VOrder(),iint; - AdvApp2Var_Patch M0(myFirstParInU,myLastParInU,myFirstParInV,myLastParInV,iu,iv); + Handle(AdvApp2Var_Patch) M0 = new AdvApp2Var_Patch (myFirstParInU,myLastParInU,myFirstParInV,myLastParInV,iu,iv); AdvApp2Var_SequenceOfPatch Net; Net.Append(M0); @@ -259,29 +259,29 @@ gp_XY UV1(myFirstParInU,myFirstParInV); - AdvApp2Var_Node C1(UV1,iu,iv); + Handle(AdvApp2Var_Node) C1 = new AdvApp2Var_Node (UV1,iu,iv); gp_XY UV2(myLastParInU,myFirstParInV); - AdvApp2Var_Node C2(UV2,iu,iv); + Handle(AdvApp2Var_Node) C2 = new AdvApp2Var_Node (UV2,iu,iv); gp_XY UV4(myLastParInU,myLastParInV); - AdvApp2Var_Node C4(UV4,iu,iv); + Handle(AdvApp2Var_Node) C4 = new AdvApp2Var_Node (UV4,iu,iv); gp_XY UV3(myFirstParInU,myLastParInV); - AdvApp2Var_Node C3(UV3,iu,iv); + Handle(AdvApp2Var_Node) C3 = new AdvApp2Var_Node (UV3,iu,iv); AdvApp2Var_SequenceOfNode Bag; Bag.Append(C1); Bag.Append(C2); Bag.Append(C3); Bag.Append(C4); - AdvApp2Var_Iso V0(GeomAbs_IsoV,myFirstParInV, + Handle(AdvApp2Var_Iso) V0 = new AdvApp2Var_Iso (GeomAbs_IsoV,myFirstParInV, myFirstParInU,myLastParInU,myFirstParInV,myLastParInV, 1,iu,iv); - AdvApp2Var_Iso V1(GeomAbs_IsoV,myLastParInV, + Handle(AdvApp2Var_Iso) V1 = new AdvApp2Var_Iso (GeomAbs_IsoV,myLastParInV, myFirstParInU,myLastParInU,myFirstParInV,myLastParInV, 2,iu,iv); - AdvApp2Var_Iso U0(GeomAbs_IsoU,myFirstParInU, + Handle(AdvApp2Var_Iso) U0 = new AdvApp2Var_Iso (GeomAbs_IsoU,myFirstParInU, myFirstParInU,myLastParInU,myFirstParInV,myLastParInV, 3,iu,iv); - AdvApp2Var_Iso U1(GeomAbs_IsoU,myLastParInU, + Handle(AdvApp2Var_Iso) U1 = new AdvApp2Var_Iso (GeomAbs_IsoU,myLastParInU, myFirstParInU,myLastParInU,myFirstParInV,myLastParInV, 4,iu,iv); @@ -557,68 +557,74 @@ Standard_Real dec; Standard_Boolean more; Standard_Integer ind1, ind2, NbPatch, NbU, NbV; - AdvApp2Var_Iso Is; - Standard_Integer indN1, indN2; Standard_Integer iu = myConditions.UOrder(), iv = myConditions.VOrder(); AdvApp2Var_Node N1(iu,iv), N2(iu,iv); - while ( myConstraints.FirstNotApprox(ind1, ind2, Is) ) { - -// approximation of iso and calculation of constraints at extremities - indN1 = myConstraints.FirstNode(Is.Type(),ind1,ind2); - N1 = myConstraints.Node(indN1); - indN2 = myConstraints.LastNode(Is.Type(),ind1,ind2); - N2 = myConstraints.Node(indN2); - - Is.MakeApprox(myConditions, - myFirstParInU, myLastParInU, - myFirstParInV, myLastParInV, - Func, N1 , N2); - - if (Is.IsApproximated()) { -// iso is approached at the required tolerance - myConstraints.ChangeIso(ind1,ind2,Is); - myConstraints.ChangeNode(indN1) = N1; - myConstraints.ChangeNode(indN2) = N2; - } - - else { -// Approximation is not satisfactory + for (Handle(AdvApp2Var_Iso) anIso = myConstraints.FirstNotApprox(ind1, ind2); !anIso.IsNull(); anIso = myConstraints.FirstNotApprox(ind1, ind2)) + { + // approximation of iso and calculation of constraints at extremities + const Standard_Integer indN1 = myConstraints.FirstNode(anIso->Type(),ind1,ind2); + N1 = *myConstraints.Node(indN1); + const Standard_Integer indN2 = myConstraints.LastNode(anIso->Type(),ind1,ind2); + N2 = *myConstraints.Node(indN2); + + // note that old code attempted to make copy of anIso here (but copy was incomplete) + anIso->MakeApprox (myConditions, + myFirstParInU, myLastParInU, + myFirstParInV, myLastParInV, + Func, N1 , N2); + if (anIso->IsApproximated()) + { + // iso is approached at the required tolerance + myConstraints.ChangeIso(ind1,ind2,anIso); + *myConstraints.Node(indN1) = N1; + *myConstraints.Node(indN2) = N2; + } + else + { + // Approximation is not satisfactory NbU = myResult.NbPatchInU(); NbV = myResult.NbPatchInV(); - if (Is.Type()==GeomAbs_IsoV) { - NbPatch = (NbU+1)*NbV; - more = UChoice.Value(Is.T0(),Is.T1(),dec); + if (anIso->Type()==GeomAbs_IsoV) + { + NbPatch = (NbU+1)*NbV; + more = UChoice.Value(anIso->T0(), anIso->T1(), dec); } - else { - NbPatch = (NbV+1)*NbU; - more = VChoice.Value(Is.T0(),Is.T1(),dec); + else + { + NbPatch = (NbV+1)*NbU; + more = VChoice.Value(anIso->T0(),anIso->T1(),dec); } - if (NbPatch<=myMaxPatches && more) { -// It is possible to cut iso - if (Is.Type()==GeomAbs_IsoV) { - myResult.UpdateInU(dec); - myConstraints.UpdateInU(dec); - } - else { - myResult.UpdateInV(dec); - myConstraints.UpdateInV(dec); - } + if (NbPatch<=myMaxPatches && more) + { + // It is possible to cut iso + if (anIso->Type()==GeomAbs_IsoV) + { + myResult.UpdateInU(dec); + myConstraints.UpdateInU(dec); + } + else + { + myResult.UpdateInV(dec); + myConstraints.UpdateInV(dec); + } } - - else { -// It is not possible to cut : the result is preserved - if (Is.HasResult()) { - Is.OverwriteApprox(); - myConstraints.ChangeIso(ind1,ind2,Is); - myConstraints.ChangeNode(indN1) = N1; - myConstraints.ChangeNode(indN2) = N2; - } - else { - myHasResult = myDone = Standard_False; - throw Standard_ConstructionError("AdvApp2Var_ApproxAFunc2Var : Curve Approximation Error"); - } + else + { + // It is not possible to cut : the result is preserved + if (anIso->HasResult()) + { + anIso->OverwriteApprox(); + myConstraints.ChangeIso(ind1,ind2,anIso); + *myConstraints.Node(indN1) = N1; + *myConstraints.Node(indN2) = N2; + } + else + { + myHasResult = myDone = Standard_False; + throw Standard_ConstructionError("AdvApp2Var_ApproxAFunc2Var : Curve Approximation Error"); + } } } } @@ -638,74 +644,82 @@ Standard_Real dec; Standard_Boolean more, CritRel = (Crit.Type() == AdvApp2Var_Relative); Standard_Integer ind1, ind2, NbPatch, NbU, NbV; - AdvApp2Var_Iso Is; Standard_Integer indN1, indN2; Standard_Integer iu = myConditions.UOrder(), iv = myConditions.VOrder(); AdvApp2Var_Node N1(iu,iv), N2(iu,iv); - while ( myConstraints.FirstNotApprox(ind1, ind2, Is) ) { - -// approximation of the iso and calculation of constraints at the extremities - indN1 = myConstraints.FirstNode(Is.Type(),ind1,ind2); - N1 = myConstraints.Node(indN1); - indN2 = myConstraints.LastNode(Is.Type(),ind1,ind2); - N2 = myConstraints.Node(indN2); - - Is.MakeApprox(myConditions, - myFirstParInU, myLastParInU, - myFirstParInV, myLastParInV, - Func, N1 , N2); - - if (Is.IsApproximated()) { -// iso is approached at the required tolerance - myConstraints.ChangeIso(ind1,ind2,Is); - myConstraints.ChangeNode(indN1) = N1; - myConstraints.ChangeNode(indN2) = N2; + for (Handle(AdvApp2Var_Iso) anIso = myConstraints.FirstNotApprox(ind1, ind2); !anIso.IsNull(); anIso = myConstraints.FirstNotApprox(ind1, ind2)) + { + // approximation of the iso and calculation of constraints at the extremities + indN1 = myConstraints.FirstNode(anIso->Type(),ind1,ind2); + N1 = *myConstraints.Node(indN1); + indN2 = myConstraints.LastNode(anIso->Type(),ind1,ind2); + N2 = *myConstraints.Node(indN2); + + // note that old code attempted to make copy of anIso here (but copy was incomplete) + anIso->MakeApprox (myConditions, + myFirstParInU, myLastParInU, + myFirstParInV, myLastParInV, + Func, N1 , N2); + + if (anIso->IsApproximated()) + { + // iso is approached at the required tolerance + myConstraints.ChangeIso(ind1,ind2,anIso); + *myConstraints.Node(indN1) = N1; + *myConstraints.Node(indN2) = N2; + } + else + { + // Approximation is not satisfactory + NbU = myResult.NbPatchInU(); + NbV = myResult.NbPatchInV(); + if (anIso->Type()==GeomAbs_IsoV) + { + NbPatch = (NbU+1)*NbV; + more = UChoice.Value(anIso->T0(),anIso->T1(),dec); + } + else + { + NbPatch = (NbV+1)*NbU; + more = VChoice.Value(anIso->T0(),anIso->T1(),dec); } - else { -// Approximation is not satisfactory - NbU = myResult.NbPatchInU(); - NbV = myResult.NbPatchInV(); - if (Is.Type()==GeomAbs_IsoV) { - NbPatch = (NbU+1)*NbV; - more = UChoice.Value(Is.T0(),Is.T1(),dec); - } - else { - NbPatch = (NbV+1)*NbU; - more = VChoice.Value(Is.T0(),Is.T1(),dec); - } - -// To force Overwrite if the criterion is Absolute - more = more && (CritRel); - - if (NbPatch<=myMaxPatches && more) { -// It is possible to cut iso - if (Is.Type()==GeomAbs_IsoV) { - myResult.UpdateInU(dec); - myConstraints.UpdateInU(dec); - } - else { - myResult.UpdateInV(dec); - myConstraints.UpdateInV(dec); - } - } + // To force Overwrite if the criterion is Absolute + more = more && (CritRel); - else { -// It is not possible to cut: the result is preserved - if (Is.HasResult()) { - Is.OverwriteApprox(); - myConstraints.ChangeIso(ind1,ind2,Is); - myConstraints.ChangeNode(indN1) = N1; - myConstraints.ChangeNode(indN2) = N2; - } - else { - myHasResult = myDone = Standard_False; - throw Standard_ConstructionError("AdvApp2Var_ApproxAFunc2Var : Curve Approximation Error"); - } - } + if (NbPatch<=myMaxPatches && more) + { + // It is possible to cut iso + if (anIso->Type()==GeomAbs_IsoV) + { + myResult.UpdateInU(dec); + myConstraints.UpdateInU(dec); + } + else + { + myResult.UpdateInV(dec); + myConstraints.UpdateInV(dec); + } + } + else + { + // It is not possible to cut: the result is preserved + if (anIso->HasResult()) + { + anIso->OverwriteApprox(); + myConstraints.ChangeIso(ind1,ind2,anIso); + *myConstraints.Node(indN1) = N1; + *myConstraints.Node(indN2) = N2; + } + else + { + myHasResult = myDone = Standard_False; + throw Standard_ConstructionError("AdvApp2Var_ApproxAFunc2Var : Curve Approximation Error"); + } } } + } } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Context.cxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Context.cxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Context.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Context.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -62,6 +62,18 @@ AdvApp2Var_Context:: AdvApp2Var_Context() +: myFav(0), + myOrdU(0), + myOrdV(0), + myLimU(0), + myLimV(0), + myNb1DSS(0), + myNb2DSS(0), + myNb3DSS(0), + myNbURoot(0), + myNbVRoot(0), + myJDegU(0), + myJDegV(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.cxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.cxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,43 +57,30 @@ //purpose : return the first Iso not approximated //========================================================================================== -Standard_Boolean AdvApp2Var_Framework::FirstNotApprox(Standard_Integer& IndexIso, - Standard_Integer& IndexStrip, - AdvApp2Var_Iso& anIso) const +Handle(AdvApp2Var_Iso) AdvApp2Var_Framework::FirstNotApprox(Standard_Integer& IndexIso, + Standard_Integer& IndexStrip) const { - Standard_Boolean good = Standard_True; - Standard_Integer i,j; - AdvApp2Var_Strip S; - - for (i = 1; i <= myUConstraints.Length() && good ; i++) { - S = myUConstraints.Value(i); - for (j = 1; j <= S.Length() && good ; j++) { - good = (S.Value(j)).IsApproximated(); - if (!good) { - IndexIso = j; - IndexStrip = i; - anIso = S.Value(j); + for (int anUVIter = 0; anUVIter < 2; ++anUVIter) + { + const AdvApp2Var_SequenceOfStrip& aSeq = anUVIter == 0 ? myUConstraints : myVConstraints; + Standard_Integer i = 1; + for (AdvApp2Var_SequenceOfStrip::Iterator aConstIter (aSeq); aConstIter.More(); aConstIter.Next(), i++) + { + const AdvApp2Var_Strip& S = aConstIter.Value(); + Standard_Integer j = 1; + for (AdvApp2Var_Strip::Iterator anIsoIter (S); anIsoIter.More(); anIsoIter.Next(), j++) + { + const Handle(AdvApp2Var_Iso)& anIso = anIsoIter.Value(); + if (!anIso->IsApproximated()) + { + IndexIso = j; + IndexStrip = i; + return anIso; + } } } } - if (!good) { - goto FINISH; - } - - for (i = 1; i <= myVConstraints.Length() && good; i++) { - S = myVConstraints.Value(i); - for (j = 1; j <= S.Length() && good ; j++) { - good = (S.Value(j)).IsApproximated(); - if (!good) { - IndexIso = j; - IndexStrip = i; - anIso = S.Value(j); - } - } - } - - FINISH: - return !good; + return Handle(AdvApp2Var_Iso)(); } //========================================================================================== @@ -145,19 +132,12 @@ void AdvApp2Var_Framework::ChangeIso(const Standard_Integer IndexIso, const Standard_Integer IndexStrip, - const AdvApp2Var_Iso& anIso) + const Handle(AdvApp2Var_Iso)& theIso) { - AdvApp2Var_Strip S0; - if (anIso.Type()==GeomAbs_IsoV) { - S0 = myUConstraints.Value(IndexStrip); - S0.SetValue(IndexIso,anIso); - myUConstraints.SetValue(IndexStrip,S0); - } - else { - S0 = myVConstraints.Value(IndexStrip); - S0.SetValue(IndexIso,anIso); - myVConstraints.SetValue(IndexStrip,S0); - } + AdvApp2Var_Strip& S0 = theIso->Type() == GeomAbs_IsoV + ? myUConstraints.ChangeValue (IndexStrip) + : myVConstraints.ChangeValue (IndexStrip); + S0.SetValue (IndexIso, theIso); } //========================================================================================== @@ -165,16 +145,19 @@ //purpose : return the node of coordinates (U,V) //========================================================================================== -const AdvApp2Var_Node& AdvApp2Var_Framework::Node(const Standard_Real U, +const Handle(AdvApp2Var_Node)& AdvApp2Var_Framework::Node(const Standard_Real U, const Standard_Real V) const { - Standard_Integer Index=1; - while ( ( ((myNodeConstraints.Value(Index)).Coord()).X() != U - || ((myNodeConstraints.Value(Index)).Coord()).Y() != V ) - && (IndexCoord().X() == U + && aNode->Coord().Y() == V) + { + return aNode; + } } - return myNodeConstraints.Value(Index); + return myNodeConstraints.Last(); } //========================================================================================== @@ -187,17 +170,20 @@ const Standard_Real V0, const Standard_Real V1) const { - Standard_Integer IndexStrip=1,IndexIso=1; - while ( ( ((myVConstraints.Value(IndexStrip)).Value(1)).T0() != V0 - || ((myVConstraints.Value(IndexStrip)).Value(1)).T1() != V1 ) - && (IndexStripT0() != V0 + || myVConstraints.Value(IndexStrip).First()->T1() != V1)) + { IndexStrip++; } - while ( ( ((myVConstraints.Value(IndexStrip)).Value(IndexIso)).Constante() != U) - && (IndexIso<=myUConstraints.Length()) ) { + Standard_Integer IndexIso = 1; + while (IndexIso<=myUConstraints.Length() + && myVConstraints.Value(IndexStrip).Value(IndexIso)->Constante() != U) + { IndexIso++; } - return (myVConstraints.Value(IndexStrip)).Value(IndexIso); + return *(myVConstraints.Value(IndexStrip).Value(IndexIso)); } //========================================================================================== @@ -210,17 +196,20 @@ const Standard_Real U1, const Standard_Real V) const { - Standard_Integer IndexStrip=1,IndexIso=1; - while ( ( ((myUConstraints.Value(IndexStrip)).Value(1)).T0() != U0 - || ((myUConstraints.Value(IndexStrip)).Value(1)).T1() != U1 ) - && (IndexStripT0() != U0 + || myUConstraints.Value(IndexStrip).First()->T1() != U1)) + { IndexStrip++; } - while ( ( ((myUConstraints.Value(IndexStrip)).Value(IndexIso)).Constante() != V) - && (IndexIso<=myVConstraints.Length()) ) { + Standard_Integer IndexIso = 1; + while (IndexIso<=myVConstraints.Length() + && myUConstraints.Value(IndexStrip).Value(IndexIso)->Constante() != V) + { IndexIso++; } - return (myUConstraints.Value(IndexStrip)).Value(IndexIso); + return *(myUConstraints.Value(IndexStrip).Value(IndexIso)); } //========================================================================================== @@ -230,65 +219,74 @@ void AdvApp2Var_Framework::UpdateInU(const Standard_Real CuttingValue) { - Standard_Integer i=1,j; - while (((myUConstraints.Value(i)).Value(1)).U0()>CuttingValue - || ((myUConstraints.Value(i)).Value(1)).U1()U0() <= CuttingValue + && anUConstIter.Value().First()->U1() >= CuttingValue) + { + break; + } + } + + { + const AdvApp2Var_Strip& S0 = myUConstraints.Value(i); + const Standard_Real Udeb = S0.First()->U0(), Ufin = S0.First()->U1(); + + // modification des Isos V de la bande en U d'indice i + for (AdvApp2Var_Strip::Iterator aStripIter (S0); aStripIter.More(); aStripIter.Next()) + { + const Handle(AdvApp2Var_Iso)& anIso = aStripIter.Value(); + anIso->ChangeDomain (Udeb, CuttingValue); + anIso->ResetApprox(); + } + + // insertion d'une nouvelle bande en U apres l'indice i + AdvApp2Var_Strip aNewStrip; + for (AdvApp2Var_Strip::Iterator aStripIter (S0); aStripIter.More(); aStripIter.Next()) + { + const Handle(AdvApp2Var_Iso)& anIso = aStripIter.Value(); + Handle(AdvApp2Var_Iso) aNewIso = new AdvApp2Var_Iso (anIso->Type(), anIso->Constante(), + CuttingValue, Ufin, anIso->V0(), anIso->V1(), + 0, anIso->UOrder(), anIso->VOrder()); + aNewIso->ResetApprox(); + aNewStrip.Append (aNewIso); + } + myUConstraints.InsertAfter (i, aNewStrip); } - myUConstraints.InsertAfter(i,NewStrip); // insertion d'une nouvelle Iso U=U* dans chaque bande en V apres l'indice i // et restriction des paves des Isos adjacentes - for (j=1;j<=myVConstraints.Length();j++) { - S0 = myVConstraints.Value(j); - Is = S0.Value(i); - Is.ChangeDomain(Is.U0(),CuttingValue,Is.V0(),Is.V1()); - S0.SetValue(i,Is); - AdvApp2Var_Iso NewIso(Is.Type(),CuttingValue,Is.U0(),CuttingValue,Is.V0(),Is.V1(), - 0,Is.UOrder(),Is.VOrder()); - NewIso.ResetApprox(); - S0.InsertAfter(i,NewIso); - Is = S0.Value(i+2); - Is.ChangeDomain(CuttingValue,Is.U1(),Is.V0(),Is.V1()); - S0.SetValue(i+2,Is); - myVConstraints.SetValue(j,S0); + for (Standard_Integer j = 1; j <= myVConstraints.Length(); j++) + { + AdvApp2Var_Strip& S0 = myVConstraints.ChangeValue(j); + Handle(AdvApp2Var_Iso) anIso = S0.Value(i); + anIso->ChangeDomain (anIso->U0(), CuttingValue, anIso->V0(), anIso->V1()); + + Handle(AdvApp2Var_Iso) aNewIso = new AdvApp2Var_Iso (anIso->Type(), CuttingValue, anIso->U0(), CuttingValue, anIso->V0(), anIso->V1(), + 0, anIso->UOrder(), anIso->VOrder()); + aNewIso->ResetApprox(); + S0.InsertAfter (i, aNewIso); + + anIso = S0.Value(i+2); + anIso->ChangeDomain (CuttingValue, anIso->U1(), anIso->V0(), anIso->V1()); } // insertion des nouveaux noeuds (U*,Vj) - AdvApp2Var_Node Prev, Next; - Prev=myNodeConstraints.Value(1); - for (j=1;jCuttingValue) - && ((Prev.Coord()).Y()==(Next.Coord()).Y())) { - gp_XY NewUV(CuttingValue,(Prev.Coord()).Y()); - AdvApp2Var_Node NewNode(NewUV,Prev.UOrder(),Prev.VOrder()); - myNodeConstraints.InsertAfter(j,NewNode); + Handle(AdvApp2Var_Node) aNext; + Handle(AdvApp2Var_Node) aPrev = myNodeConstraints.First(); + for (Standard_Integer j = 1; j < myNodeConstraints.Length(); j++) + { + aNext = myNodeConstraints.Value(j+1); + if (aPrev->Coord().X() < CuttingValue + && aNext->Coord().X() > CuttingValue + && aPrev->Coord().Y() == aNext->Coord().Y()) + { + gp_XY aNewUV (CuttingValue, aPrev->Coord().Y()); + Handle(AdvApp2Var_Node) aNewNode = new AdvApp2Var_Node (aNewUV, aPrev->UOrder(), aPrev->VOrder()); + myNodeConstraints.InsertAfter (j, aNewNode); } - Prev=Next; + aPrev = aNext; } } @@ -299,65 +297,69 @@ void AdvApp2Var_Framework::UpdateInV(const Standard_Real CuttingValue) { - Standard_Integer i,j=1; - while (((myVConstraints.Value(j)).Value(1)).V0()>CuttingValue - || ((myVConstraints.Value(j)).Value(1)).V1()V0() > CuttingValue + || myVConstraints.Value(j).First()->V1() < CuttingValue) + { j++; } - AdvApp2Var_Strip S0; - AdvApp2Var_Iso Is; - S0 = myVConstraints.Value(j); - Standard_Real Vdeb = (S0.Value(1)).V0(), Vfin = (S0.Value(1)).V1(); - -// modification des Isos U de la bande en V d'indice j - for (i=1;i<=S0.Length();i++) { - Is = S0.Value(i); - Is.ChangeDomain(Vdeb,CuttingValue); - Is.ResetApprox(); - S0.SetValue(i,Is); - } - myVConstraints.SetValue(j,S0); - -// insertion d'une nouvelle bande en V apres l'indice j - AdvApp2Var_Strip NewStrip; - for (i=1;i<=S0.Length();i++) { - AdvApp2Var_Iso NewIso((S0.Value(i)).Type(),(S0.Value(i)).Constante(), - (S0.Value(i)).U0(),(S0.Value(i)).U1(),CuttingValue,Vfin, - 0,(S0.Value(i)).UOrder(),(S0.Value(i)).VOrder()); - NewIso.ResetApprox(); - NewStrip.Append(NewIso); + + { + AdvApp2Var_Strip& S0 = myVConstraints.ChangeValue(j); + const Standard_Real Vdeb = S0.First()->V0(), Vfin = S0.First()->V1(); + + // modification des Isos U de la bande en V d'indice j + for (AdvApp2Var_Strip::Iterator anIsoIter (S0); anIsoIter.More(); anIsoIter.Next()) + { + const Handle(AdvApp2Var_Iso)& anIso = anIsoIter.Value(); + anIso->ChangeDomain (Vdeb, CuttingValue); + anIso->ResetApprox(); + } + + // insertion d'une nouvelle bande en V apres l'indice j + AdvApp2Var_Strip aNewStrip; + for (AdvApp2Var_Strip::Iterator anIsoIter (S0); anIsoIter.More(); anIsoIter.Next()) + { + const Handle(AdvApp2Var_Iso)& anIso = anIsoIter.Value(); + Handle(AdvApp2Var_Iso) aNewIso = new AdvApp2Var_Iso (anIso->Type(), anIso->Constante(), + anIso->U0(), anIso->U1(), CuttingValue, Vfin, + 0, anIso->UOrder(), anIso->VOrder()); + aNewIso->ResetApprox(); + aNewStrip.Append (aNewIso); + } + myVConstraints.InsertAfter(j, aNewStrip); } - myVConstraints.InsertAfter(j,NewStrip); -// insertion d'une nouvelle Iso V=V* dans chaque bande en U apres l'indice j -// et restriction des paves des Isos adjacentes - for (i=1;i<=myUConstraints.Length();i++) { - S0 = myUConstraints.Value(i); - Is = S0.Value(j); - Is.ChangeDomain(Is.U0(),Is.U1(),Is.V0(),CuttingValue); - S0.SetValue(j,Is); - AdvApp2Var_Iso NewIso(Is.Type(),CuttingValue,Is.U0(),Is.U1(),Is.V0(),CuttingValue, - 0,Is.UOrder(),Is.VOrder()); - NewIso.ResetApprox(); - S0.InsertAfter(j,NewIso); - Is = S0.Value(j+2); - Is.ChangeDomain(Is.U0(),Is.U1(),CuttingValue,Is.V1()); - S0.SetValue(j+2,Is); - myUConstraints.SetValue(i,S0); + // insertion d'une nouvelle Iso V=V* dans chaque bande en U apres l'indice j + // et restriction des paves des Isos adjacentes + for (AdvApp2Var_SequenceOfStrip::Iterator anUConstIter (myUConstraints); anUConstIter.More(); anUConstIter.Next()) + { + AdvApp2Var_Strip& S0 = anUConstIter.ChangeValue(); + Handle(AdvApp2Var_Iso) anIso = S0.Value(j); + anIso->ChangeDomain (anIso->U0(), anIso->U1(), anIso->V0(), CuttingValue); + + Handle(AdvApp2Var_Iso) aNewIso = new AdvApp2Var_Iso (anIso->Type(), CuttingValue, anIso->U0(), anIso->U1(), anIso->V0(), CuttingValue, + 0, anIso->UOrder(), anIso->VOrder()); + aNewIso->ResetApprox(); + S0.InsertAfter (j, aNewIso); + + anIso = S0.Value (j + 2); + anIso->ChangeDomain (anIso->U0(), anIso->U1(), CuttingValue, anIso->V1()); } // insertion des nouveaux noeuds (Ui,V*) - i = 1; - while ( i<=myNodeConstraints.Length() - && ( ((myNodeConstraints.Value(i)).Coord()).Y()) < CuttingValue) { - i+=myUConstraints.Length()+1; - } - for (j=1;j<=myUConstraints.Length()+1;j++) { - gp_XY NewUV(((myNodeConstraints.Value(j)).Coord()).X(),CuttingValue); - AdvApp2Var_Node NewNode(NewUV, - (myNodeConstraints.Value(j)).UOrder(), - (myNodeConstraints.Value(j)).VOrder()); - myNodeConstraints.InsertAfter(i+j-2,NewNode); + Standard_Integer i = 1; + while (i <= myNodeConstraints.Length() + && myNodeConstraints.Value(i)->Coord().Y() < CuttingValue) + { + i += myUConstraints.Length() + 1; + } + for (j = 1; j <= myUConstraints.Length() + 1; j++) + { + const Handle(AdvApp2Var_Node)& aJNode = myNodeConstraints.Value(j); + gp_XY NewUV (aJNode->Coord().X(), CuttingValue); + Handle(AdvApp2Var_Node) aNewNode = new AdvApp2Var_Node (NewUV, aJNode->UOrder(), aJNode->VOrder()); + myNodeConstraints.InsertAfter (i+j-2, aNewNode); } } @@ -370,7 +372,7 @@ AdvApp2Var_Framework::UEquation(const Standard_Integer IndexIso, const Standard_Integer IndexStrip) const { - return ((myVConstraints.Value(IndexStrip)).Value(IndexIso)).Polynom(); + return myVConstraints.Value(IndexStrip).Value(IndexIso)->Polynom(); } //========================================================================================== @@ -382,6 +384,6 @@ AdvApp2Var_Framework::VEquation(const Standard_Integer IndexIso, const Standard_Integer IndexStrip) const { - return myUConstraints.Value(IndexStrip).Value(IndexIso).Polynom(); + return myUConstraints.Value(IndexStrip).Value(IndexIso)->Polynom(); } diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.hxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.hxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,27 +44,25 @@ Standard_EXPORT AdvApp2Var_Framework(); Standard_EXPORT AdvApp2Var_Framework(const AdvApp2Var_SequenceOfNode& Frame, const AdvApp2Var_SequenceOfStrip& UFrontier, const AdvApp2Var_SequenceOfStrip& VFrontier); - + //! search the Index of the first Iso not approximated, - //! if all Isos are approximated Standard_False is returned. - Standard_EXPORT Standard_Boolean FirstNotApprox (Standard_Integer& IndexIso, Standard_Integer& IndexStrip, AdvApp2Var_Iso& anIso) const; + //! if all Isos are approximated NULL is returned. + Standard_EXPORT Handle(AdvApp2Var_Iso) FirstNotApprox (Standard_Integer& IndexIso, Standard_Integer& IndexStrip) const; Standard_EXPORT Standard_Integer FirstNode (const GeomAbs_IsoType Type, const Standard_Integer IndexIso, const Standard_Integer IndexStrip) const; Standard_EXPORT Standard_Integer LastNode (const GeomAbs_IsoType Type, const Standard_Integer IndexIso, const Standard_Integer IndexStrip) const; - Standard_EXPORT void ChangeIso (const Standard_Integer IndexIso, const Standard_Integer IndexStrip, const AdvApp2Var_Iso& anIso); + Standard_EXPORT void ChangeIso (const Standard_Integer IndexIso, const Standard_Integer IndexStrip, const Handle(AdvApp2Var_Iso)& anIso); - const AdvApp2Var_Node& Node (const Standard_Integer IndexNode) const; + const Handle(AdvApp2Var_Node)& Node (const Standard_Integer IndexNode) const { return myNodeConstraints.Value(IndexNode); } - Standard_EXPORT const AdvApp2Var_Node& Node (const Standard_Real U, const Standard_Real V) const; + Standard_EXPORT const Handle(AdvApp2Var_Node)& Node (const Standard_Real U, const Standard_Real V) const; Standard_EXPORT const AdvApp2Var_Iso& IsoU (const Standard_Real U, const Standard_Real V0, const Standard_Real V1) const; Standard_EXPORT const AdvApp2Var_Iso& IsoV (const Standard_Real U0, const Standard_Real U1, const Standard_Real V) const; - AdvApp2Var_Node& ChangeNode (const Standard_Integer IndexNode); - Standard_EXPORT void UpdateInU (const Standard_Real CuttingValue); Standard_EXPORT void UpdateInV (const Standard_Real CuttingValue); @@ -73,31 +71,12 @@ Standard_EXPORT const Handle(TColStd_HArray1OfReal)& VEquation (const Standard_Integer IndexIso, const Standard_Integer IndexStrip) const; - - - -protected: - - - - - private: - - AdvApp2Var_SequenceOfNode myNodeConstraints; AdvApp2Var_SequenceOfStrip myUConstraints; AdvApp2Var_SequenceOfStrip myVConstraints; - }; - -#include - - - - - #endif // _AdvApp2Var_Framework_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.lxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.lxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Framework.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -// Created on: 1996-06-17 -// Created by: Philippe MANGIN -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -inline const AdvApp2Var_Node& AdvApp2Var_Framework::Node( - const Standard_Integer IndexNode) const -{ - return myNodeConstraints.Value(IndexNode); -} - -inline AdvApp2Var_Node& AdvApp2Var_Framework::ChangeNode( - const Standard_Integer IndexNode) -{ - return myNodeConstraints.ChangeValue(IndexNode); -} diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Iso.cxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Iso.cxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Iso.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Iso.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,16 +14,18 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include -#include #include #include #include #include #include +IMPLEMENT_STANDARD_RTTIEXT(AdvApp2Var_Iso, Standard_Transient) + //======================================================================= //function : AdvApp2Var_Iso //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Iso.hxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Iso.hxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Iso.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Iso.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,16 +31,12 @@ class AdvApp2Var_Context; class AdvApp2Var_Node; - - //! used to store constraints on a line U = Ui or V = Vj -class AdvApp2Var_Iso +class AdvApp2Var_Iso : public Standard_Transient { + DEFINE_STANDARD_RTTIEXT(AdvApp2Var_Iso, Standard_Transient) public: - DEFINE_STANDARD_ALLOC - - Standard_EXPORT AdvApp2Var_Iso(); Standard_EXPORT AdvApp2Var_Iso(const GeomAbs_IsoType type, const Standard_Integer iu, const Standard_Integer iv); @@ -99,20 +95,12 @@ Standard_EXPORT Handle(TColStd_HArray2OfReal) MoyErrors() const; - - - -protected: - - - - - private: - - Standard_EXPORT AdvApp2Var_Iso(const AdvApp2Var_Iso& Other); + AdvApp2Var_Iso(const AdvApp2Var_Iso& Other); + AdvApp2Var_Iso& operator= (const AdvApp2Var_Iso& theOther); +private: GeomAbs_IsoType myType; Standard_Real myConstPar; @@ -132,13 +120,6 @@ Handle(TColStd_HArray1OfReal) mySomTab; Handle(TColStd_HArray1OfReal) myDifTab; - }; - - - - - - #endif // _AdvApp2Var_Iso_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.cxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.cxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -52,15 +52,19 @@ //purpose : return the first Patch not approximated //========================================================================================== -Standard_Boolean AdvApp2Var_Network::FirstNotApprox(Standard_Integer& Index) const +Standard_Boolean AdvApp2Var_Network::FirstNotApprox(Standard_Integer& theIndex) const { - Standard_Boolean good = Standard_True; - Standard_Integer i; - for (i = 1; i <= myNet.Length() && good; i++) { - good = myNet.Value(i).IsApproximated(); - if (!good) {Index = i;} + Standard_Integer anIndex = 1; + for (AdvApp2Var_SequenceOfPatch::Iterator aPatchIter (myNet); aPatchIter.More(); aPatchIter.Next(), ++anIndex) + { + const Handle(AdvApp2Var_Patch)& aPatch = aPatchIter.Value(); + if (!aPatch->IsApproximated()) + { + theIndex = anIndex; + return true; + } } - return !good; + return false; } //========================================================================================== @@ -78,23 +82,20 @@ } myUParameters.InsertBefore(i,CuttingValue); - Standard_Integer indice; - for (j=1; j< myVParameters.Length() ; j++){ - + for (j=1; j< myVParameters.Length() ; j++) + { // modification des patches concernes par la decoupe - AdvApp2Var_Patch Pat; - indice = (myUParameters.Length()-1) * (j-1) + i - 1; - Pat = myNet.Value(indice); - Pat.ChangeDomain(Pat.U0(), CuttingValue, Pat.V0(), Pat.V1()); - Pat.ResetApprox(); - myNet.SetValue(indice, Pat); + Standard_Integer indice = (myUParameters.Length()-1) * (j-1) + i - 1; + const Handle(AdvApp2Var_Patch)& aPat = myNet.Value(indice); + aPat->ChangeDomain (aPat->U0(), CuttingValue, aPat->V0(), aPat->V1()); + aPat->ResetApprox(); // insertion des nouveaux patches - AdvApp2Var_Patch NewPat(CuttingValue,myUParameters.Value(i+1), + Handle(AdvApp2Var_Patch) aNewPat = new AdvApp2Var_Patch (CuttingValue,myUParameters.Value(i+1), myVParameters.Value(j),myVParameters.Value(j+1), - Pat.UOrder(),Pat.VOrder()); - NewPat.ResetApprox(); - myNet.InsertAfter(indice, NewPat); + aPat->UOrder(), aPat->VOrder()); + aNewPat->ResetApprox(); + myNet.InsertAfter(indice, aNewPat); } } @@ -108,31 +109,32 @@ { // insertion du nouveau parametre de decoupe - Standard_Integer i,j=1; - AdvApp2Var_Patch Pat; - while (myVParameters.Value(j)ChangeDomain(Pat->U0(), Pat->U1(), Pat->V0(), CuttingValue); + Pat->ResetApprox(); } // insertion des nouveaux patches - for (i=1; i< myUParameters.Length() ; i++){ - indice = (myUParameters.Length()-1) * (j-1) + i-1; - AdvApp2Var_Patch NewPat(myUParameters.Value(i), myUParameters.Value(i+1), + for (Standard_Integer i = 1; i < myUParameters.Length(); i++) + { + const Standard_Integer indice = (myUParameters.Length()-1) * (j-1) + i-1; + Handle(AdvApp2Var_Patch) aNewPat = new AdvApp2Var_Patch (myUParameters.Value(i), myUParameters.Value(i+1), CuttingValue,myVParameters.Value(j+1), - Pat.UOrder(),Pat.VOrder()); - NewPat.ResetApprox(); - myNet.InsertAfter(indice,NewPat); + Pat->UOrder(),Pat->VOrder()); + aNewPat->ResetApprox(); + myNet.InsertAfter (indice, aNewPat); } } @@ -146,22 +148,21 @@ Standard_Integer& ncfu, Standard_Integer& ncfv) { - // calcul des coeff. max avec init selon l'ordre de continuite - Standard_Integer IndPat; ncfu = 2*iu+2; ncfv = 2*iv+2; - for (IndPat=1;IndPat<=myNet.Length();IndPat++) { - ncfu = Max(ncfu,myNet.Value(IndPat).NbCoeffInU()); - ncfv = Max(ncfv,myNet.Value(IndPat).NbCoeffInV()); + for (AdvApp2Var_SequenceOfPatch::Iterator aPatIter (myNet); aPatIter.More(); aPatIter.Next()) + { + const Handle(AdvApp2Var_Patch)& aPat = aPatIter.Value(); + ncfu = Max(ncfu, aPat->NbCoeffInU()); + ncfv = Max(ncfv, aPat->NbCoeffInV()); } // augmentation des nombres de coeff. - AdvApp2Var_Patch Pat; - for (IndPat=1;IndPat<=myNet.Length();IndPat++) { - Pat = myNet.Value(IndPat); - Pat.ChangeNbCoeff(ncfu,ncfv); - myNet.SetValue(IndPat,Pat); + for (AdvApp2Var_SequenceOfPatch::Iterator aPatIter (myNet); aPatIter.More(); aPatIter.Next()) + { + const Handle(AdvApp2Var_Patch)& aPat = aPatIter.Value(); + aPat->ChangeNbCoeff (ncfu, ncfv); } } diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.hxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.hxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,11 +46,8 @@ //! if all Patches are approximated Standard_False is returned Standard_EXPORT Standard_Boolean FirstNotApprox (Standard_Integer& Index) const; - AdvApp2Var_Patch& ChangePatch (const Standard_Integer Index); - AdvApp2Var_Patch& operator() (const Standard_Integer Index) -{ - return ChangePatch(Index); -} + AdvApp2Var_Patch& ChangePatch (const Standard_Integer Index) { return *myNet.Value(Index); } + AdvApp2Var_Patch& operator() (const Standard_Integer Index) { return ChangePatch(Index); } Standard_EXPORT void UpdateInU (const Standard_Real CuttingValue); @@ -67,38 +64,23 @@ Standard_EXPORT Standard_Real UParameter (const Standard_Integer Index) const; Standard_EXPORT Standard_Real VParameter (const Standard_Integer Index) const; - - const AdvApp2Var_Patch& Patch (const Standard_Integer UIndex, const Standard_Integer VIndex) const; - const AdvApp2Var_Patch& operator() (const Standard_Integer UIndex, const Standard_Integer VIndex) const -{ - return Patch(UIndex,VIndex); -} - - - - -protected: - - + const AdvApp2Var_Patch& Patch (const Standard_Integer UIndex, const Standard_Integer VIndex) const + { + return *myNet.Value ((VIndex-1)*(myUParameters.Length()-1) + UIndex); + } + const AdvApp2Var_Patch& operator() (const Standard_Integer UIndex, const Standard_Integer VIndex) const + { + return Patch(UIndex,VIndex); + } private: - - AdvApp2Var_SequenceOfPatch myNet; TColStd_SequenceOfReal myUParameters; TColStd_SequenceOfReal myVParameters; - }; - -#include - - - - - #endif // _AdvApp2Var_Network_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.lxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.lxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Network.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -// Created on: 1996-06-13 -// Created by: Philippe MANGIN -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//#include - -inline AdvApp2Var_Patch& AdvApp2Var_Network::ChangePatch(const Standard_Integer Index) -{ - return myNet(Index); -} - -inline const AdvApp2Var_Patch& AdvApp2Var_Network::Patch(const Standard_Integer UIndex, - const Standard_Integer VIndex) const -{ - return myNet( (VIndex-1)*(myUParameters.Length()-1) + UIndex); -} - diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Node.cxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Node.cxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Node.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Node.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,26 +14,23 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #include -#include -#include -#include -#include + +IMPLEMENT_STANDARD_RTTIEXT(AdvApp2Var_Node, Standard_Transient) //======================================================================= //function : AdvApp2Var_Node //purpose : //======================================================================= -AdvApp2Var_Node::AdvApp2Var_Node() : -myOrdInU(2), -myOrdInV(2) +AdvApp2Var_Node::AdvApp2Var_Node() +: myTruePoints(0, 2, 0, 2), + myErrors (0, 2, 0, 2), + myOrdInU (2), + myOrdInV (2) { - myTruePoints = new TColgp_HArray2OfPnt ( 0, 2, 0, 2); gp_Pnt P0(0.,0.,0.); - myTruePoints->Init(P0); - myErrors = new TColStd_HArray2OfReal( 0, 2, 0, 2); - myErrors->Init(0.); + myTruePoints.Init(P0); + myErrors.Init(0.); } //======================================================================= @@ -42,15 +39,15 @@ //======================================================================= AdvApp2Var_Node::AdvApp2Var_Node(const Standard_Integer iu, - const Standard_Integer iv) : -myOrdInU(iu), -myOrdInV(iv) + const Standard_Integer iv) +: myTruePoints(0, Max(0,iu), 0, Max(0,iv)), + myErrors (0, Max(0,iu), 0, Max(0,iv)), + myOrdInU (iu), + myOrdInV (iv) { - myTruePoints = new TColgp_HArray2OfPnt ( 0, Max(0,iu), 0, Max(0,iv)); gp_Pnt P0(0.,0.,0.); - myTruePoints->Init(P0); - myErrors = new TColStd_HArray2OfReal( 0, Max(0,iu), 0, Max(0,iv)); - myErrors->Init(0.); + myTruePoints.Init(P0); + myErrors.Init(0.); } //======================================================================= @@ -60,118 +57,14 @@ AdvApp2Var_Node::AdvApp2Var_Node(const gp_XY& UV, const Standard_Integer iu, - const Standard_Integer iv) : -myCoord(UV), -myOrdInU(iu), -myOrdInV(iv) + const Standard_Integer iv) +: myTruePoints(0, iu, 0, iv), + myErrors (0, iu, 0, iv), + myCoord (UV), + myOrdInU(iu), + myOrdInV(iv) { - myTruePoints = new TColgp_HArray2OfPnt ( 0, iu, 0, iv); gp_Pnt P0(0.,0.,0.); - myTruePoints->Init(P0); - myErrors = new TColStd_HArray2OfReal( 0, iu, 0, iv); - myErrors->Init(0.); -} - - -//======================================================================= -//function : Coord -//purpose : returns the coordinates (U,V) of the node -//======================================================================= - -gp_XY AdvApp2Var_Node::Coord() const -{ - return myCoord; -} - -//======================================================================= -//function : SetCoord -//purpose : changes the coordinates (U,V) to (x1,x2) -//======================================================================= - -void AdvApp2Var_Node::SetCoord(const Standard_Real x1, - const Standard_Real x2) -{ - myCoord.SetX(x1); - myCoord.SetY(x2); -} - -//======================================================================= -//function : UOrder -//purpose : returns the continuity order in U of the node -//======================================================================= - -Standard_Integer AdvApp2Var_Node::UOrder() const -{ - return myOrdInU; -} - -//======================================================================= -//function : VOrder -//purpose : returns the continuity order in V of the node -//======================================================================= - -Standard_Integer AdvApp2Var_Node::VOrder() const -{ - return myOrdInV; -} - - -//======================================================================= -//function : SetPoint -//purpose : affects the value F(U,V) or its derivates on the node (U,V) -//======================================================================= - -void AdvApp2Var_Node::SetPoint(const Standard_Integer iu, - const Standard_Integer iv, - const gp_Pnt& Pt) -{ - myTruePoints->SetValue(iu, iv, Pt); + myTruePoints.Init(P0); + myErrors.Init(0.); } - - -//======================================================================= -//function : Point -//purpose : returns the value F(U,V) or its derivates on the node (U,V) -//======================================================================= - -gp_Pnt AdvApp2Var_Node::Point(const Standard_Integer iu, - const Standard_Integer iv) const -{ - return myTruePoints->Value(iu, iv); -} - - -//======================================================================= -//function : SetError -//purpose : affects the error between F(U,V) and its approximation -//======================================================================= - -void AdvApp2Var_Node::SetError(const Standard_Integer iu, - const Standard_Integer iv, - const Standard_Real error) -{ - myErrors->SetValue(iu, iv, error); -} - - -//======================================================================= -//function : Error -//purpose : returns the error between F(U,V) and its approximation -//======================================================================= - -Standard_Real AdvApp2Var_Node::Error(const Standard_Integer iu, - const Standard_Integer iv) const -{ - return myErrors->Value(iu, iv); -} - - - - - - - - - - - diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Node.hxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Node.hxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Node.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Node.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,78 +17,85 @@ #ifndef _AdvApp2Var_Node_HeaderFile #define _AdvApp2Var_Node_HeaderFile +#include #include -#include #include - -#include -#include -#include -#include -#include -class gp_XY; -class gp_Pnt; - - +#include +#include +#include //! used to store constraints on a (Ui,Vj) point -class AdvApp2Var_Node +class AdvApp2Var_Node : public Standard_Transient { + DEFINE_STANDARD_RTTIEXT(AdvApp2Var_Node, Standard_Transient) public: - DEFINE_STANDARD_ALLOC - - Standard_EXPORT AdvApp2Var_Node(); Standard_EXPORT AdvApp2Var_Node(const Standard_Integer iu, const Standard_Integer iv); Standard_EXPORT AdvApp2Var_Node(const gp_XY& UV, const Standard_Integer iu, const Standard_Integer iv); - - Standard_EXPORT gp_XY Coord() const; - - Standard_EXPORT void SetCoord (const Standard_Real x1, const Standard_Real x2); - - Standard_EXPORT Standard_Integer UOrder() const; - - Standard_EXPORT Standard_Integer VOrder() const; - - Standard_EXPORT void SetPoint (const Standard_Integer iu, const Standard_Integer iv, const gp_Pnt& Cte); - - Standard_EXPORT gp_Pnt Point (const Standard_Integer iu, const Standard_Integer iv) const; - - Standard_EXPORT void SetError (const Standard_Integer iu, const Standard_Integer iv, const Standard_Real error); - - Standard_EXPORT Standard_Real Error (const Standard_Integer iu, const Standard_Integer iv) const; - - - - -protected: - - + //! Returns the coordinates (U,V) of the node + const gp_XY& Coord() const { return myCoord; } + //! changes the coordinates (U,V) to (x1,x2) + void SetCoord (const Standard_Real x1, const Standard_Real x2) + { + myCoord.SetX(x1); + myCoord.SetY(x2); + } + + //! returns the continuity order in U of the node + Standard_Integer UOrder() const { return myOrdInU; } + + //! returns the continuity order in V of the node + Standard_Integer VOrder() const { return myOrdInV; } + + //! affects the value F(U,V) or its derivates on the node (U,V) + void SetPoint (const Standard_Integer iu, const Standard_Integer iv, const gp_Pnt& Pt) + { + myTruePoints.SetValue(iu, iv, Pt); + } + + //! returns the value F(U,V) or its derivates on the node (U,V) + const gp_Pnt& Point (const Standard_Integer iu, const Standard_Integer iv) const + { + return myTruePoints.Value(iu, iv); + } + + //! affects the error between F(U,V) and its approximation + void SetError (const Standard_Integer iu, const Standard_Integer iv, const Standard_Real error) + { + myErrors.SetValue(iu, iv, error); + } + + //! returns the error between F(U,V) and its approximation + Standard_Real Error (const Standard_Integer iu, const Standard_Integer iv) const { return myErrors.Value(iu, iv); } + + //! Assign operator. + AdvApp2Var_Node& operator= (const AdvApp2Var_Node& theOther) + { + myTruePoints = theOther.myTruePoints; + myErrors = theOther.myErrors; + myCoord = theOther.myCoord; + myOrdInU = theOther.myOrdInU; + myOrdInV = theOther.myOrdInV; + return *this; + } private: - - Standard_EXPORT AdvApp2Var_Node(const AdvApp2Var_Node& Other); + AdvApp2Var_Node (const AdvApp2Var_Node& theOther); +private: + TColgp_Array2OfPnt myTruePoints; + TColStd_Array2OfReal myErrors; gp_XY myCoord; Standard_Integer myOrdInU; Standard_Integer myOrdInV; - Handle(TColgp_HArray2OfPnt) myTruePoints; - Handle(TColStd_HArray2OfReal) myErrors; - }; - - - - - - #endif // _AdvApp2Var_Node_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Patch.cxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Patch.cxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Patch.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Patch.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,6 +40,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(AdvApp2Var_Patch, Standard_Transient) + //============================================================================ //function : AdvApp2Var_Patch //purpose : @@ -144,35 +146,35 @@ rho = pow(du,iu)*pow(dv,iv); // F(U0,V0) and its derivatives normalized on (-1,1) - valnorm = rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).X(); + valnorm = rho * ((Constraints.Node(myU0,myV0))->Point(iu,iv)).X(); HCOINS->SetValue( 1+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv , valnorm ); - valnorm = rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).Y(); + valnorm = rho * ((Constraints.Node(myU0,myV0))->Point(iu,iv)).Y(); HCOINS->SetValue( 2+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); - valnorm = rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).Z(); + valnorm = rho * ((Constraints.Node(myU0,myV0))->Point(iu,iv)).Z(); HCOINS->SetValue( 3+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); // F(U1,V0) and its derivatives normalized on (-1,1) - valnorm = rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).X(); + valnorm = rho * ((Constraints.Node(myU1,myV0))->Point(iu,iv)).X(); HCOINS->SetValue( SIZE+1+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); - valnorm = rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).Y(); + valnorm = rho * ((Constraints.Node(myU1,myV0))->Point(iu,iv)).Y(); HCOINS->SetValue( SIZE+2+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); - valnorm = rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).Z(); + valnorm = rho * ((Constraints.Node(myU1,myV0))->Point(iu,iv)).Z(); HCOINS->SetValue( SIZE+3+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); // F(U0,V1) and its derivatives normalized on (-1,1) - valnorm = rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).X(); + valnorm = rho * ((Constraints.Node(myU0,myV1))->Point(iu,iv)).X(); HCOINS->SetValue( 2*SIZE+1+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); - valnorm = rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).Y(); + valnorm = rho * ((Constraints.Node(myU0,myV1))->Point(iu,iv)).Y(); HCOINS->SetValue( 2*SIZE+2+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); - valnorm = rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).Z(); + valnorm = rho * ((Constraints.Node(myU0,myV1))->Point(iu,iv)).Z(); HCOINS->SetValue( 2*SIZE+3+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); // F(U1,V1) and its derivatives normalized on (-1,1) - valnorm = rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).X(); + valnorm = rho * ((Constraints.Node(myU1,myV1))->Point(iu,iv)).X(); HCOINS->SetValue( 3*SIZE+1+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); - valnorm = rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).Y(); + valnorm = rho * ((Constraints.Node(myU1,myV1))->Point(iu,iv)).Y(); HCOINS->SetValue( 3*SIZE+2+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); - valnorm = rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).Z(); + valnorm = rho * ((Constraints.Node(myU1,myV1))->Point(iu,iv)).Z(); HCOINS->SetValue( 3*SIZE+3+NDIMEN*iu+NDIMEN*(IORDRU+2)*iv, valnorm ); } } @@ -543,38 +545,38 @@ // -F(U0,V0) and its derivatives normalized on (-1,1) ideb = HCOINS->Lower() + NDIMEN*iu+NDIMEN*(IORDRU+2)*iv - 1; - valnorm = -rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).X(); + valnorm = -rho * ((Constraints.Node(myU0,myV0))->Point(iu,iv)).X(); HCOINS->SetValue( 1+ideb , valnorm ); - valnorm = -rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).Y(); + valnorm = -rho * ((Constraints.Node(myU0,myV0))->Point(iu,iv)).Y(); HCOINS->SetValue( 2+ideb , valnorm ); - valnorm = -rho * ((Constraints.Node(myU0,myV0)).Point(iu,iv)).Z(); + valnorm = -rho * ((Constraints.Node(myU0,myV0))->Point(iu,iv)).Z(); HCOINS->SetValue( 3+ideb , valnorm ); // -F(U1,V0) and its derivatives normalized on (-1,1) ideb += SIZE; - valnorm = -rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).X(); + valnorm = -rho * ((Constraints.Node(myU1,myV0))->Point(iu,iv)).X(); HCOINS->SetValue( 1+ideb , valnorm ); - valnorm = -rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).Y(); + valnorm = -rho * ((Constraints.Node(myU1,myV0))->Point(iu,iv)).Y(); HCOINS->SetValue( 2+ideb , valnorm ); - valnorm = -rho * ((Constraints.Node(myU1,myV0)).Point(iu,iv)).Z(); + valnorm = -rho * ((Constraints.Node(myU1,myV0))->Point(iu,iv)).Z(); HCOINS->SetValue( 3+ideb , valnorm ); // -F(U0,V1) and its derivatives normalized on (-1,1) ideb += SIZE; - valnorm = -rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).X(); + valnorm = -rho * ((Constraints.Node(myU0,myV1))->Point(iu,iv)).X(); HCOINS->SetValue( 1+ideb , valnorm ); - valnorm = -rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).Y(); + valnorm = -rho * ((Constraints.Node(myU0,myV1))->Point(iu,iv)).Y(); HCOINS->SetValue( 2+ideb , valnorm ); - valnorm = -rho * ((Constraints.Node(myU0,myV1)).Point(iu,iv)).Z(); + valnorm = -rho * ((Constraints.Node(myU0,myV1))->Point(iu,iv)).Z(); HCOINS->SetValue( 3+ideb , valnorm ); // -F(U1,V1) and its derivatives normalized on (-1,1) ideb += SIZE; - valnorm = -rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).X(); + valnorm = -rho * ((Constraints.Node(myU1,myV1))->Point(iu,iv)).X(); HCOINS->SetValue( 1+ideb , valnorm ); - valnorm = -rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).Y(); + valnorm = -rho * ((Constraints.Node(myU1,myV1))->Point(iu,iv)).Y(); HCOINS->SetValue( 2+ideb , valnorm ); - valnorm = -rho * ((Constraints.Node(myU1,myV1)).Point(iu,iv)).Z(); + valnorm = -rho * ((Constraints.Node(myU1,myV1))->Point(iu,iv)).Z(); HCOINS->SetValue( 3+ideb , valnorm ); } } @@ -721,13 +723,13 @@ Standard_Real emax1=0.,emax2=0.,emax3=0.,emax4=0.,err1,err2,err3,err4; for (iu=0;iu<=myOrdInU;iu++) { for (iv=0;iv<=myOrdInV;iv++) { - error = (Constraints.Node(myU0,myV0)).Error(iu,iv); + error = (Constraints.Node(myU0,myV0))->Error(iu,iv); emax1 = Max(emax1,error); - error = (Constraints.Node(myU1,myV0)).Error(iu,iv); + error = (Constraints.Node(myU1,myV0))->Error(iu,iv); emax2 = Max(emax2,error); - error = (Constraints.Node(myU0,myV1)).Error(iu,iv); + error = (Constraints.Node(myU0,myV1))->Error(iu,iv); emax3 = Max(emax3,error); - error = (Constraints.Node(myU1,myV1)).Error(iu,iv); + error = (Constraints.Node(myU1,myV1))->Error(iu,iv); emax4 = Max(emax4,error); } } diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Patch.hxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Patch.hxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Patch.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Patch.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,12 +35,10 @@ //! used to store results on a domain [Ui,Ui+1]x[Vj,Vj+1] -class AdvApp2Var_Patch +class AdvApp2Var_Patch : public Standard_Transient { + DEFINE_STANDARD_RTTIEXT(AdvApp2Var_Patch, Standard_Transient) public: - - DEFINE_STANDARD_ALLOC - Standard_EXPORT AdvApp2Var_Patch(); @@ -102,20 +100,12 @@ Standard_EXPORT void SetCritValue (const Standard_Real dist); - - - -protected: - - - - - private: - - Standard_EXPORT AdvApp2Var_Patch(const AdvApp2Var_Patch& P); + AdvApp2Var_Patch(const AdvApp2Var_Patch& P); + AdvApp2Var_Patch& operator= (const AdvApp2Var_Patch& theOther); +private: Standard_Real myU0; Standard_Real myU1; diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SequenceOfNode.hxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SequenceOfNode.hxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SequenceOfNode.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SequenceOfNode.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,6 @@ #include #include -typedef NCollection_Sequence AdvApp2Var_SequenceOfNode; - +typedef NCollection_Sequence AdvApp2Var_SequenceOfNode; #endif diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SequenceOfPatch.hxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SequenceOfPatch.hxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SequenceOfPatch.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SequenceOfPatch.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,7 @@ #include #include -typedef NCollection_Sequence AdvApp2Var_SequenceOfPatch; +typedef NCollection_Sequence AdvApp2Var_SequenceOfPatch; #endif diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Strip.hxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Strip.hxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Strip.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_Strip.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,6 @@ //! Set of constraints along a same type of Iso on the same level -typedef NCollection_Sequence AdvApp2Var_Strip; +typedef NCollection_Sequence AdvApp2Var_Strip; #endif diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SysBase.hxx opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SysBase.hxx --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SysBase.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/AdvApp2Var_SysBase.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,12 +16,8 @@ #define AdvApp2Var_SysBase_HeaderFile #include +#include #include -#if _MSC_VER -#include -#else -#include -#endif class AdvApp2Var_SysBase { public: diff -Nru opencascade-7.4.1+dfsg1/src/AdvApp2Var/FILES opencascade-7.5.1+dfsg1/src/AdvApp2Var/FILES --- opencascade-7.4.1+dfsg1/src/AdvApp2Var/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AdvApp2Var/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -22,7 +22,6 @@ AdvApp2Var_EvaluatorFunc2Var.hxx AdvApp2Var_Framework.cxx AdvApp2Var_Framework.hxx -AdvApp2Var_Framework.lxx AdvApp2Var_Iso.cxx AdvApp2Var_Iso.hxx AdvApp2Var_MathBase.cxx @@ -30,7 +29,6 @@ AdvApp2Var_MathBase_mathinit.cxx AdvApp2Var_Network.cxx AdvApp2Var_Network.hxx -AdvApp2Var_Network.lxx AdvApp2Var_Node.cxx AdvApp2Var_Node.hxx AdvApp2Var_Patch.cxx diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_AngleDimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_AngleDimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_AngleDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_AngleDimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,1478 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Arnaud BOUZY/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -IMPLEMENT_STANDARD_RTTIEXT(AIS_AngleDimension,AIS_Dimension) - -namespace -{ - static const TCollection_ExtendedString THE_EMPTY_LABEL_STRING; - static const Standard_Real THE_EMPTY_LABEL_WIDTH = 0.0; - static const Standard_ExtCharacter THE_DEGREE_SYMBOL (0x00B0); - static const Standard_Real THE_3D_TEXT_MARGIN = 0.1; - - //! Returns true if the given points lie on a same line. - static Standard_Boolean isSameLine (const gp_Pnt& theFirstPoint, - const gp_Pnt& theCenterPoint, - const gp_Pnt& theSecondPoint) - { - gp_Vec aVec1 (theFirstPoint, theCenterPoint); - gp_Vec aVec2 (theCenterPoint, theSecondPoint); - - return aVec1.IsParallel (aVec2, Precision::Angular()); - } -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theFirstEdge, theSecondEdge); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pnt& theThirdPoint) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theFirstPoint, theSecondPoint, theThirdPoint); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const TopoDS_Vertex& theFirstVertex, - const TopoDS_Vertex& theSecondVertex, - const TopoDS_Vertex& theThirdVertex) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theFirstVertex, theSecondVertex, theThirdVertex); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const TopoDS_Face& theCone) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theCone); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theFirstFace, theSecondFace); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_AngleDimension::AIS_AngleDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - const gp_Pnt& thePoint) -: AIS_Dimension (AIS_KOD_PLANEANGLE) -{ - Init(); - SetMeasuredGeometry (theFirstFace, theSecondFace, thePoint); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge) -{ - gp_Pln aComputedPlane; - - myFirstShape = theFirstEdge; - mySecondShape = theSecondEdge; - myThirdShape = TopoDS_Shape(); - myGeometryType = GeometryType_Edges; - myIsGeometryValid = InitTwoEdgesAngle (aComputedPlane); - - if (myIsGeometryValid && !myIsPlaneCustom) - { - myPlane = aComputedPlane; - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pnt& theThirdPoint) -{ - myFirstPoint = theFirstPoint; - myCenterPoint = theSecondPoint; - mySecondPoint = theThirdPoint; - myFirstShape = BRepLib_MakeVertex (myFirstPoint); - mySecondShape = BRepLib_MakeVertex (myCenterPoint); - myThirdShape = BRepLib_MakeVertex (mySecondPoint); - myGeometryType = GeometryType_Points; - myIsGeometryValid = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); - - Standard_Boolean anIsSameLine = isSameLine (myFirstPoint, myCenterPoint, mySecondPoint); - if (myIsGeometryValid && !myIsPlaneCustom && !anIsSameLine) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Vertex& theFirstVertex, - const TopoDS_Vertex& theSecondVertex, - const TopoDS_Vertex& theThirdVertex) -{ - myFirstShape = theFirstVertex; - mySecondShape = theSecondVertex; - myThirdShape = theThirdVertex; - myFirstPoint = BRep_Tool::Pnt (theFirstVertex); - myCenterPoint = BRep_Tool::Pnt (theSecondVertex); - mySecondPoint = BRep_Tool::Pnt (theThirdVertex); - myGeometryType = GeometryType_Points; - myIsGeometryValid = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); - - Standard_Boolean anIsSameLine = isSameLine (myFirstPoint, myCenterPoint, mySecondPoint); - if (myIsGeometryValid && !myIsPlaneCustom && !anIsSameLine) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theCone) -{ - myFirstShape = theCone; - mySecondShape = TopoDS_Shape(); - myThirdShape = TopoDS_Shape(); - myGeometryType = GeometryType_Face; - myIsGeometryValid = InitConeAngle(); - - if (myIsGeometryValid && !myIsPlaneCustom) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace) -{ - myFirstShape = theFirstFace; - mySecondShape = theSecondFace; - myThirdShape = TopoDS_Shape(); - myGeometryType = GeometryType_Faces; - myIsGeometryValid = InitTwoFacesAngle(); - - if (myIsGeometryValid && !myIsPlaneCustom) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - const gp_Pnt& thePoint) -{ - myFirstShape = theFirstFace; - mySecondShape = theSecondFace; - myThirdShape = TopoDS_Shape(); - myGeometryType = GeometryType_Faces; - myIsGeometryValid = InitTwoFacesAngle (thePoint); - - if (myIsGeometryValid && !myIsPlaneCustom) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : Init -//purpose : -//======================================================================= -void AIS_AngleDimension::Init() -{ - SetType (AIS_TOA_Interior); - SetArrowsVisibility (AIS_TOAV_Both); - SetSpecialSymbol (THE_DEGREE_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_After); - SetFlyout (15.0); -} - -//======================================================================= -//function: GetCenterOnArc -//purpose : -//======================================================================= -gp_Pnt AIS_AngleDimension::GetCenterOnArc (const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter) const -{ - // construct plane where the circle and the arc are located - gce_MakePln aConstructPlane (theFirstAttach, theSecondAttach, theCenter); - if (!aConstructPlane.IsDone()) - { - return gp::Origin(); - } - - gp_Pln aPlane = aConstructPlane.Value(); - // to have an exterior angle presentation, a plane for further constructed circle should be reversed - if (myType == AIS_TOA_Exterior) - { - gp_Ax1 anAxis = aPlane.Axis(); - gp_Dir aDir = anAxis.Direction(); - aDir.Reverse(); - aPlane.SetAxis(gp_Ax1(anAxis.Location(), aDir)); - } - - Standard_Real aRadius = theFirstAttach.Distance (theCenter); - - // construct circle forming the arc - gce_MakeCirc aConstructCircle (theCenter, aPlane, aRadius); - if (!aConstructCircle.IsDone()) - { - return gp::Origin(); - } - - gp_Circ aCircle = aConstructCircle.Value(); - - // compute angle parameters of arc end-points on circle - Standard_Real aParamBeg = ElCLib::Parameter (aCircle, theFirstAttach); - Standard_Real aParamEnd = ElCLib::Parameter (aCircle, theSecondAttach); - ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); - - return ElCLib::Value ((aParamBeg + aParamEnd) * 0.5, aCircle); -} - -//======================================================================= -//function : GetNormalForMinAngle -//purpose : -//======================================================================= -gp_Dir AIS_AngleDimension::GetNormalForMinAngle() const -{ - const gp_Dir& aNormal = myPlane.Axis().Direction(); - gp_Dir aFirst (gp_Vec (myCenterPoint, myFirstPoint) ); - gp_Dir aSecond (gp_Vec (myCenterPoint, mySecondPoint) ); - - return aFirst.AngleWithRef (aSecond, aNormal) < 0.0 - ? aNormal.Reversed() - : aNormal; -} - -//======================================================================= -//function : DrawArc -//purpose : draws the arc between two attach points -//======================================================================= -void AIS_AngleDimension::DrawArc (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter, - const Standard_Real theRadius, - const Standard_Integer theMode) -{ - gp_Pln aPlane (myCenterPoint, GetNormalForMinAngle()); - - // to have an exterior angle presentation, a plane for further constructed circle should be reversed - if (myType == AIS_TOA_Exterior) - { - gp_Ax1 anAxis = aPlane.Axis(); - gp_Dir aDir = anAxis.Direction(); - aDir.Reverse(); - aPlane.SetAxis(gp_Ax1(anAxis.Location(), aDir)); - } - - // construct circle forming the arc - gce_MakeCirc aConstructCircle (theCenter, aPlane, theRadius); - if (!aConstructCircle.IsDone()) - { - return; - } - - gp_Circ aCircle = aConstructCircle.Value(); - - // construct the arc - GC_MakeArcOfCircle aConstructArc (aCircle, theFirstAttach, theSecondAttach, Standard_True); - if (!aConstructArc.IsDone()) - { - return; - } - - // generate points with specified deflection - const Handle(Geom_TrimmedCurve)& anArcCurve = aConstructArc.Value(); - - GeomAdaptor_Curve anArcAdaptor (anArcCurve, anArcCurve->FirstParameter(), anArcCurve->LastParameter()); - - // compute number of discretization elements in old-fanshioned way - gp_Vec aCenterToFirstVec (theCenter, theFirstAttach); - gp_Vec aCenterToSecondVec (theCenter, theSecondAttach); - Standard_Real anAngle = aCenterToFirstVec.Angle (aCenterToSecondVec); - if (myType == AIS_TOA_Exterior) - anAngle = 2.0 * M_PI - anAngle; - // it sets 50 points on PI, and a part of points if angle is less - const Standard_Integer aNbPoints = Max (4, Standard_Integer (50.0 * anAngle / M_PI)); - - GCPnts_UniformAbscissa aMakePnts (anArcAdaptor, aNbPoints); - if (!aMakePnts.IsDone()) - { - return; - } - - // init data arrays for graphical and selection primitives - Handle(Graphic3d_ArrayOfPolylines) aPrimSegments = new Graphic3d_ArrayOfPolylines (aNbPoints); - - SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); - - // load data into arrays - for (Standard_Integer aPntIt = 1; aPntIt <= aMakePnts.NbPoints(); ++aPntIt) - { - gp_Pnt aPnt = anArcAdaptor.Value (aMakePnts.Parameter (aPntIt)); - - aPrimSegments->AddVertex (aPnt); - - aSensitiveCurve.Append (aPnt); - } - - // add display presentation - if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) - { - Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_True); - } - Handle(Graphic3d_AspectLine3d) aDimensionLineStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); - Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aDimensionLineStyle); - Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments); - if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) - { - Prs3d_Root::CurrentGroup (thePresentation)->SetStencilTestOptions (Standard_False); - } -} - -//======================================================================= -//function: DrawArcWithText -//purpose : -//======================================================================= -void AIS_AngleDimension::DrawArcWithText (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter, - const TCollection_ExtendedString& theText, - const Standard_Real theTextWidth, - const Standard_Integer theMode, - const Standard_Integer theLabelPosition) -{ - gp_Pln aPlane (myCenterPoint, GetNormalForMinAngle()); - - Standard_Real aRadius = theFirstAttach.Distance (myCenterPoint); - - // construct circle forming the arc - gce_MakeCirc aConstructCircle (theCenter, aPlane, aRadius); - if (!aConstructCircle.IsDone()) - { - return; - } - - gp_Circ aCircle = aConstructCircle.Value(); - - // compute angle parameters of arc end-points on circle - Standard_Real aParamBeg = ElCLib::Parameter (aCircle, theFirstAttach); - Standard_Real aParamEnd = ElCLib::Parameter (aCircle, theSecondAttach); - ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); - - // middle point of arc parameter on circle - Standard_Real aParamMid = (aParamBeg + aParamEnd) * 0.5; - - // add text graphical primitives - if (theMode == ComputeMode_All || theMode == ComputeMode_Text) - { - gp_Pnt aTextPos = ElCLib::Value (aParamMid, aCircle); - gp_Dir aTextDir = gce_MakeDir (theFirstAttach, theSecondAttach); - - // Drawing text - drawText (thePresentation, - aTextPos, - aTextDir, - theText, - theLabelPosition); - } - - if (theMode != ComputeMode_All && theMode != ComputeMode_Line) - { - return; - } - - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center - && aDimensionAspect->IsText3d(); - - if (isLineBreak) - { - // compute gap for label as parameteric size of sector on circle segment - Standard_Real aSectorOfText = theTextWidth / aRadius; - Standard_Real aTextBegin = aParamMid - aSectorOfText * 0.5; - Standard_Real aTextEnd = aParamMid + aSectorOfText * 0.5; - gp_Pnt aTextPntBeg = ElCLib::Value (aTextBegin, aCircle); - gp_Pnt aTextPntEnd = ElCLib::Value (aTextEnd, aCircle); - - // Drawing arcs - if (aTextBegin > aParamBeg) - { - DrawArc (thePresentation, theFirstAttach, aTextPntBeg, theCenter, aRadius, theMode); - } - if (aTextEnd < aParamEnd) - { - DrawArc (thePresentation, aTextPntEnd, theSecondAttach, theCenter, aRadius, theMode); - } - } - else - { - DrawArc (thePresentation, theFirstAttach, theSecondAttach, theCenter, aRadius, theMode); - } -} - -//======================================================================= -//function : CheckPlane -//purpose : -//======================================================================= -Standard_Boolean AIS_AngleDimension::CheckPlane (const gp_Pln& thePlane)const -{ - if (!thePlane.Contains (myFirstPoint, Precision::Confusion()) && - !thePlane.Contains (mySecondPoint, Precision::Confusion()) && - !thePlane.Contains (myCenterPoint, Precision::Confusion())) - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputePlane -//purpose : -//======================================================================= -void AIS_AngleDimension::ComputePlane() -{ - if (!myIsGeometryValid) - { - return; - } - - // Compute working plane so that Y axis is codirectional - // with Y axis of text coordinate system (necessary for text alignment) - gp_Vec aFirstVec = gp_Vec (myCenterPoint, myFirstPoint); - gp_Vec aSecondVec = gp_Vec (myCenterPoint, mySecondPoint); - gp_Vec aDirectionN = aSecondVec ^ aFirstVec; - gp_Vec aDirectionY = aFirstVec + aSecondVec; - gp_Vec aDirectionX = aDirectionY ^ aDirectionN; - - myPlane = gp_Pln (gp_Ax3 (myCenterPoint, gp_Dir (aDirectionN), gp_Dir (aDirectionX))); -} - -//======================================================================= -//function : GetModelUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_AngleDimension::GetModelUnits() const -{ - return myDrawer->DimAngleModelUnits(); -} - -//======================================================================= -//function : GetDisplayUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_AngleDimension::GetDisplayUnits() const -{ - return myDrawer->DimAngleDisplayUnits(); -} - -//======================================================================= -//function : SetModelUnits -//purpose : -//======================================================================= -void AIS_AngleDimension::SetModelUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimAngleModelUnits (theUnits); -} - -//======================================================================= -//function : SetDisplayUnits -//purpose : -//======================================================================= -void AIS_AngleDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimAngleDisplayUnits (theUnits); -} - -//======================================================================= -//function : ComputeValue -//purpose : -//======================================================================= -Standard_Real AIS_AngleDimension::ComputeValue() const -{ - if (!IsValid()) - { - return 0.0; - } - - gp_Vec aVec1 (myCenterPoint, myFirstPoint); - gp_Vec aVec2 (myCenterPoint, mySecondPoint); - - Standard_Real anAngle = aVec1.AngleWithRef (aVec2, GetNormalForMinAngle()); - - return anAngle > 0.0 ? anAngle : (2.0 * M_PI + anAngle); -} - -//======================================================================= -//function : Compute -//purpose : Having three gp_Pnt points compute presentation -//======================================================================= -void AIS_AngleDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) -{ - mySelectionGeom.Clear (theMode); - - if (!IsValid()) - { - return; - } - - // Parameters for presentation - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - Prs3d_Root::CurrentGroup(thePresentation)->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); - - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - - // prepare label string and compute its geometrical width - Standard_Real aLabelWidth; - TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); - - // add margins to label width - if (aDimensionAspect->IsText3d()) - { - aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; - } - - // Get parameters from aspect or adjust it according with custom text position - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - Prs3d_DimensionTextHorizontalPosition aHorisontalTextPos = aDimensionAspect->TextHorizontalPosition(); - - if (IsTextPositionCustom()) - { - AdjustParameters (myFixedTextPosition,anExtensionSize, aHorisontalTextPos, myFlyout); - } - - // Handle user-defined and automatic arrow placement - Standard_Boolean isArrowsExternal = Standard_False; - Standard_Integer aLabelPosition = LabelPosition_None; - - FitTextAlignment (aHorisontalTextPos, aLabelPosition, isArrowsExternal); - - gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); - gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); - - //Arrows positions and directions - gp_Vec aWorkingPlaneDir (GetNormalForMinAngle()); - - gp_Dir aFirstExtensionDir = aWorkingPlaneDir.Reversed() ^ gp_Vec (myCenterPoint, aFirstAttach); - gp_Dir aSecondExtensionDir = aWorkingPlaneDir ^ gp_Vec (myCenterPoint, aSecondAttach); - - gp_Vec aFirstArrowVec = gp_Vec (aFirstExtensionDir) * anArrowLength; - gp_Vec aSecondArrowVec = gp_Vec (aSecondExtensionDir) * anArrowLength; - - if (isArrowsExternal) - { - aFirstArrowVec.Reverse(); - aSecondArrowVec.Reverse(); - } - - gp_Pnt aFirstArrowBegin (0.0, 0.0, 0.0); - gp_Pnt aFirstArrowEnd (0.0, 0.0, 0.0); - gp_Pnt aSecondArrowBegin (0.0, 0.0, 0.0); - gp_Pnt aSecondArrowEnd (0.0, 0.0, 0.0); - - aFirstArrowBegin = aFirstAttach; - aSecondArrowBegin = aSecondAttach; - aFirstArrowEnd = aFirstAttach.Translated (-aFirstArrowVec); - aSecondArrowEnd = aSecondAttach.Translated (-aSecondArrowVec); - - // Group1: stenciling text and the angle dimension arc - Prs3d_Root::NewGroup (thePresentation); - - Standard_Integer aHPosition = aLabelPosition & LabelPosition_HMask; - - // draw text label - switch (aHPosition) - { - case LabelPosition_HCenter : - { - Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center - && aDimensionAspect->IsText3d(); - - if (isLineBreak) - { - DrawArcWithText (thePresentation, - aFirstAttach, - aSecondAttach, - myCenterPoint, - aLabelString, - aLabelWidth, - theMode, - aLabelPosition); - break; - } - - // compute text primitives - if (theMode == ComputeMode_All || theMode == ComputeMode_Text) - { - gp_Vec aDimensionDir (aFirstAttach, aSecondAttach); - gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition - : GetCenterOnArc (aFirstAttach, aSecondAttach, myCenterPoint); - gp_Dir aTextDir = aDimensionDir; - - drawText (thePresentation, - aTextPos, - aTextDir, - aLabelString, - aLabelPosition); - } - - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - DrawArc (thePresentation, - (isArrowsExternal || !isArrowVisible(AIS_TOAV_First)) ? aFirstAttach : aFirstArrowEnd, - (isArrowsExternal || !isArrowVisible(AIS_TOAV_Second)) ? aSecondAttach : aSecondArrowEnd, - myCenterPoint, - Abs (GetFlyout()), - theMode); - } - } - break; - - case LabelPosition_Left : - { - DrawExtension (thePresentation, - anExtensionSize, - (isArrowsExternal && isArrowVisible(AIS_TOAV_First)) ? aFirstArrowEnd : aFirstAttach, - aFirstExtensionDir, - aLabelString, - aLabelWidth, - theMode, - aLabelPosition); - } - break; - - case LabelPosition_Right : - { - DrawExtension (thePresentation, - anExtensionSize, - (isArrowsExternal && isArrowVisible(AIS_TOAV_Second)) ? aSecondArrowEnd : aSecondAttach, - aSecondExtensionDir, - aLabelString, - aLabelWidth, - theMode, - aLabelPosition); - } - break; - } - - // dimension arc without text - if ((theMode == ComputeMode_All || theMode == ComputeMode_Line) && aHPosition != LabelPosition_HCenter) - { - Prs3d_Root::NewGroup (thePresentation); - - DrawArc (thePresentation, - (isArrowsExternal || !isArrowVisible(AIS_TOAV_First)) ? aFirstAttach : aFirstArrowEnd, - (isArrowsExternal || !isArrowVisible(AIS_TOAV_Second)) ? aSecondAttach : aSecondArrowEnd, - myCenterPoint, - Abs(GetFlyout ()), - theMode); - } - - // arrows and arrow extensions - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - Prs3d_Root::NewGroup (thePresentation); - - if (isArrowVisible(AIS_TOAV_First)) - DrawArrow (thePresentation, aFirstArrowBegin, gp_Dir (aFirstArrowVec)); - if (isArrowVisible(AIS_TOAV_Second)) - DrawArrow (thePresentation, aSecondArrowBegin, gp_Dir (aSecondArrowVec)); - } - - if ((theMode == ComputeMode_All || theMode == ComputeMode_Line) && isArrowsExternal) - { - Prs3d_Root::NewGroup (thePresentation); - - if (aHPosition != LabelPosition_Left && isArrowVisible(AIS_TOAV_First)) - { - DrawExtension (thePresentation, - aDimensionAspect->ArrowTailSize(), - aFirstArrowEnd, - aFirstExtensionDir, - THE_EMPTY_LABEL_STRING, - THE_EMPTY_LABEL_WIDTH, - theMode, - LabelPosition_None); - } - - if (aHPosition != LabelPosition_Right && isArrowVisible(AIS_TOAV_Second)) - { - DrawExtension (thePresentation, - aDimensionAspect->ArrowTailSize(), - aSecondArrowEnd, - aSecondExtensionDir, - THE_EMPTY_LABEL_STRING, - THE_EMPTY_LABEL_WIDTH, - theMode, - LabelPosition_None); - } - } - - // flyouts - if (theMode == ComputeMode_All) - { - Prs3d_Root::NewGroup (thePresentation); - - Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (4); - aPrimSegments->AddVertex (myCenterPoint); - aPrimSegments->AddVertex (aFirstAttach); - aPrimSegments->AddVertex (myCenterPoint); - aPrimSegments->AddVertex (aSecondAttach); - - Handle(Graphic3d_AspectLine3d) aFlyoutStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); - Prs3d_Root::CurrentGroup (thePresentation)->SetPrimitivesAspect (aFlyoutStyle); - Prs3d_Root::CurrentGroup (thePresentation)->AddPrimitiveArray (aPrimSegments); - } - - mySelectionGeom.IsComputed = Standard_True; -} - -//======================================================================= -//function : ComputeFlyoutSelection -//purpose : computes selection for flyouts -//======================================================================= -void AIS_AngleDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theOwner) -{ - gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); - gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); - - Handle(Select3D_SensitiveGroup) aSensitiveEntity = new Select3D_SensitiveGroup (theOwner); - aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, myCenterPoint, aFirstAttach)); - aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, myCenterPoint, aSecondAttach)); - - theSelection->Add (aSensitiveEntity); -} - -//======================================================================= -//function : InitTwoEdgesAngle -//purpose : -//======================================================================= -Standard_Boolean AIS_AngleDimension::InitTwoEdgesAngle (gp_Pln& theComputedPlane) -{ - TopoDS_Edge aFirstEdge = TopoDS::Edge (myFirstShape); - TopoDS_Edge aSecondEdge = TopoDS::Edge (mySecondShape); - - BRepAdaptor_Curve aMakeFirstLine (aFirstEdge); - BRepAdaptor_Curve aMakeSecondLine (aSecondEdge); - - if (aMakeFirstLine.GetType() != GeomAbs_Line || aMakeSecondLine.GetType() != GeomAbs_Line) - { - return Standard_False; - } - - Handle(Geom_Line) aFirstLine = new Geom_Line (aMakeFirstLine.Line()); - Handle(Geom_Line) aSecondLine = new Geom_Line (aMakeSecondLine.Line()); - - gp_Lin aFirstLin = aFirstLine->Lin(); - gp_Lin aSecondLin = aSecondLine->Lin(); - - Standard_Boolean isParallelLines = aFirstLin.Direction().IsParallel (aSecondLin.Direction(), Precision::Angular()); - - theComputedPlane = isParallelLines ? gp_Pln(gp::XOY()) - : gp_Pln (aSecondLin.Location(), gp_Vec (aFirstLin.Direction()) ^ gp_Vec (aSecondLin.Direction())); - - // Compute geometry for this plane and edges - Standard_Boolean isInfinite1,isInfinite2; - gp_Pnt aFirstPoint1, aLastPoint1, aFirstPoint2, aLastPoint2; - Handle(Geom_Curve) aFirstCurve = aFirstLine, aSecondCurve = aSecondLine; - if (!AIS::ComputeGeometry (aFirstEdge, aSecondEdge, - aFirstCurve, aSecondCurve, - aFirstPoint1, aLastPoint1, - aFirstPoint2, aLastPoint2, - isInfinite1, isInfinite2)) - { - return Standard_False; - } - - Standard_Boolean isSameLines = aFirstLin.Direction().IsEqual (aSecondLin.Direction(), Precision::Angular()) - && aFirstLin.Location().IsEqual (aSecondLin.Location(),Precision::Confusion()); - - // It can be the same gp_Lin geometry but the different begin and end parameters - Standard_Boolean isSameEdges = - (aFirstPoint1.IsEqual (aFirstPoint2, Precision::Confusion()) && aLastPoint1.IsEqual (aLastPoint2, Precision::Confusion())) - || (aFirstPoint1.IsEqual (aLastPoint2, Precision::Confusion()) && aLastPoint1.IsEqual (aFirstPoint2, Precision::Confusion())); - - if (isParallelLines) - { - // Zero angle, it could not handle this geometry - if (isSameLines && isSameEdges) - { - return Standard_False; - } - - // Handle the case of Pi angle - const Standard_Real aParam11 = ElCLib::Parameter (aFirstLin, aFirstPoint1); - const Standard_Real aParam12 = ElCLib::Parameter (aFirstLin, aLastPoint1); - const Standard_Real aParam21 = ElCLib::Parameter (aFirstLin, aFirstPoint2); - const Standard_Real aParam22 = ElCLib::Parameter (aFirstLin, aLastPoint2); - myCenterPoint = ElCLib::Value ( (Min (aParam11, aParam12) + Max (aParam21, aParam22)) * 0.5, aFirstLin); - myFirstPoint = myCenterPoint.Translated (gp_Vec (aFirstLin.Direction()) * Abs (GetFlyout())); - mySecondPoint = myCenterPoint.XYZ() + (aFirstLin.Direction().IsEqual (aSecondLin.Direction(), Precision::Angular()) - ? aFirstLin.Direction().Reversed().XYZ() * Abs (GetFlyout()) - : aSecondLin.Direction().XYZ() * Abs (GetFlyout())); - } - else - { - // Find intersection - gp_Lin2d aFirstLin2d = ProjLib::Project (theComputedPlane, aFirstLin); - gp_Lin2d aSecondLin2d = ProjLib::Project (theComputedPlane, aSecondLin); - - IntAna2d_AnaIntersection anInt2d (aFirstLin2d, aSecondLin2d); - gp_Pnt2d anIntersectPoint; - if (!anInt2d.IsDone() || anInt2d.IsEmpty()) - { - return Standard_False; - } - - anIntersectPoint = gp_Pnt2d (anInt2d.Point(1).Value()); - myCenterPoint = ElCLib::To3d (theComputedPlane.Position().Ax2(), anIntersectPoint); - - if (isInfinite1 || isInfinite2) - { - myFirstPoint = myCenterPoint.Translated (gp_Vec (aFirstLin.Direction()) * Abs (GetFlyout())); - mySecondPoint = myCenterPoint.Translated (gp_Vec (aSecondLin.Direction()) * Abs (GetFlyout())); - - return IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); - } - - // | - // | <- dimension should be here - // *---- - myFirstPoint = myCenterPoint.Distance (aFirstPoint1) > myCenterPoint.Distance (aLastPoint1) - ? aFirstPoint1 - : aLastPoint1; - - mySecondPoint = myCenterPoint.Distance (aFirstPoint2) > myCenterPoint.Distance (aLastPoint2) - ? aFirstPoint2 - : aLastPoint2; - } - - return IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); -} - -//======================================================================= -//function : InitTwoFacesAngle -//purpose : initialization of angle dimension between two faces -//======================================================================= -Standard_Boolean AIS_AngleDimension::InitTwoFacesAngle() -{ - TopoDS_Face aFirstFace = TopoDS::Face (myFirstShape); - TopoDS_Face aSecondFace = TopoDS::Face (mySecondShape); - - gp_Dir aFirstDir, aSecondDir; - gp_Pln aFirstPln, aSecondPln; - Handle(Geom_Surface) aFirstBasisSurf, aSecondBasisSurf; - AIS_KindOfSurface aFirstSurfType, aSecondSurfType; - Standard_Real aFirstOffset, aSecondOffset; - - AIS::GetPlaneFromFace (aFirstFace, aFirstPln, - aFirstBasisSurf,aFirstSurfType,aFirstOffset); - - AIS::GetPlaneFromFace (aSecondFace, aSecondPln, - aSecondBasisSurf, aSecondSurfType, aSecondOffset); - - if (aFirstSurfType == AIS_KOS_Plane && aSecondSurfType == AIS_KOS_Plane) - { - //Planar faces angle - Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (aFirstBasisSurf); - Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (aSecondBasisSurf); - return AIS::InitAngleBetweenPlanarFaces (aFirstFace, - aSecondFace, - myCenterPoint, - myFirstPoint, - mySecondPoint) - && IsValidPoints (myFirstPoint, - myCenterPoint, - mySecondPoint); - } - else - { - // Curvilinear faces angle - return AIS::InitAngleBetweenCurvilinearFaces (aFirstFace, - aSecondFace, - aFirstSurfType, - aSecondSurfType, - myCenterPoint, - myFirstPoint, - mySecondPoint) - && IsValidPoints (myFirstPoint, - myCenterPoint, - mySecondPoint); - } -} - -//======================================================================= -//function : InitTwoFacesAngle -//purpose : initialization of angle dimension between two faces -//======================================================================= -Standard_Boolean AIS_AngleDimension::InitTwoFacesAngle (const gp_Pnt thePointOnFirstFace) -{ - TopoDS_Face aFirstFace = TopoDS::Face (myFirstShape); - TopoDS_Face aSecondFace = TopoDS::Face (mySecondShape); - - gp_Dir aFirstDir, aSecondDir; - gp_Pln aFirstPln, aSecondPln; - Handle(Geom_Surface) aFirstBasisSurf, aSecondBasisSurf; - AIS_KindOfSurface aFirstSurfType, aSecondSurfType; - Standard_Real aFirstOffset, aSecondOffset; - - AIS::GetPlaneFromFace (aFirstFace, aFirstPln, - aFirstBasisSurf,aFirstSurfType,aFirstOffset); - - AIS::GetPlaneFromFace (aSecondFace, aSecondPln, - aSecondBasisSurf, aSecondSurfType, aSecondOffset); - - myFirstPoint = thePointOnFirstFace; - if (aFirstSurfType == AIS_KOS_Plane && aSecondSurfType == AIS_KOS_Plane) - { - //Planar faces angle - Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (aFirstBasisSurf); - Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (aSecondBasisSurf); - return AIS::InitAngleBetweenPlanarFaces (aFirstFace, - aSecondFace, - myCenterPoint, - myFirstPoint, - mySecondPoint, - Standard_True) - && IsValidPoints (myFirstPoint, - myCenterPoint, - mySecondPoint); - } - else - { - // Curvilinear faces angle - return AIS::InitAngleBetweenCurvilinearFaces (aFirstFace, - aSecondFace, - aFirstSurfType, - aSecondSurfType, - myCenterPoint, - myFirstPoint, - mySecondPoint, - Standard_True) - && IsValidPoints (myFirstPoint, - myCenterPoint, - mySecondPoint); - } -} - -//======================================================================= -//function : InitConeAngle -//purpose : initialization of the cone angle -//======================================================================= -Standard_Boolean AIS_AngleDimension::InitConeAngle() -{ - if (myFirstShape.IsNull()) - { - return Standard_False; - } - - TopoDS_Face aConeShape = TopoDS::Face (myFirstShape); - gp_Pln aPln; - gp_Cone aCone; - gp_Circ aCircle; - // A surface from the Face - Handle(Geom_Surface) aSurf; - Handle(Geom_OffsetSurface) aOffsetSurf; - Handle(Geom_ConicalSurface) aConicalSurf; - Handle(Geom_SurfaceOfRevolution) aRevSurf; - Handle(Geom_Line) aLine; - BRepAdaptor_Surface aConeAdaptor (aConeShape); - TopoDS_Face aFace; - AIS_KindOfSurface aSurfType; - Standard_Real anOffset = 0.; - Handle(Standard_Type) aType; - - Standard_Real aMaxV = aConeAdaptor.FirstVParameter(); - Standard_Real aMinV = aConeAdaptor.LastVParameter(); - - AIS::GetPlaneFromFace (aConeShape, aPln, aSurf, aSurfType, anOffset); - - if (aSurfType == AIS_KOS_Revolution) - { - // Surface of revolution - aRevSurf = Handle(Geom_SurfaceOfRevolution)::DownCast(aSurf); - gp_Lin aLin (aRevSurf->Axis()); - Handle(Geom_Curve) aBasisCurve = aRevSurf->BasisCurve(); - //Must be a part of line (basis curve should be linear) - if (aBasisCurve ->DynamicType() != STANDARD_TYPE(Geom_Line)) - return Standard_False; - - gp_Pnt aFirst1 = aConeAdaptor.Value (0., aMinV); - gp_Pnt aLast1 = aConeAdaptor.Value (0., aMaxV); - gp_Vec aVec1 (aFirst1, aLast1); - - //Projection on - gp_Pnt aFirst2 = ElCLib::Value (ElCLib::Parameter (aLin, aFirst1), aLin); - // Projection on - gp_Pnt aLast2 = ElCLib::Value (ElCLib::Parameter (aLin, aLast1), aLin); - - gp_Vec aVec2 (aFirst2, aLast2); - - // Check if two parts of revolution are parallel (it's a cylinder) or normal (it's a circle). - if (aVec1.IsParallel (aVec2, Precision::Angular()) - || aVec1.IsNormal (aVec2,Precision::Angular())) - return Standard_False; - - gce_MakeCone aMkCone (aRevSurf->Axis(), aFirst1, aLast1); - aCone = aMkCone.Value(); - myCenterPoint = aCone.Apex(); - } - else - { - aType = aSurf->DynamicType(); - if (aType == STANDARD_TYPE(Geom_OffsetSurface) || anOffset > 0.01) - { - // Offset surface - aOffsetSurf = new Geom_OffsetSurface (aSurf, anOffset); - aSurf = aOffsetSurf->Surface(); - BRepBuilderAPI_MakeFace aMkFace(aSurf, Precision::Confusion()); - aMkFace.Build(); - if (!aMkFace.IsDone()) - return Standard_False; - aConeAdaptor.Initialize (aMkFace.Face()); - } - aCone = aConeAdaptor.Cone(); - aConicalSurf = Handle(Geom_ConicalSurface)::DownCast (aSurf); - myCenterPoint = aConicalSurf->Apex(); - } - - // A circle where the angle is drawn - Handle(Geom_Curve) aCurve; - Standard_Real aMidV = ( aMinV + aMaxV ) / 2.5; - aCurve = aSurf->VIso (aMidV); - aCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); - - aCurve = aSurf->VIso(aMaxV); - gp_Circ aCircVmax = Handle(Geom_Circle)::DownCast(aCurve)->Circ(); - aCurve = aSurf->VIso(aMinV); - gp_Circ aCircVmin = Handle(Geom_Circle)::DownCast(aCurve)->Circ(); - - if (aCircVmax.Radius() < aCircVmin.Radius()) - { - gp_Circ aTmpCirc = aCircVmax; - aCircVmax = aCircVmin; - aCircVmin = aTmpCirc; - } - - myFirstPoint = ElCLib::Value (0, aCircle); - mySecondPoint = ElCLib::Value (M_PI, aCircle); - return Standard_True; -} - -//======================================================================= -//function : IsValidPoints -//purpose : -//======================================================================= -Standard_Boolean AIS_AngleDimension::IsValidPoints (const gp_Pnt& theFirstPoint, - const gp_Pnt& theCenterPoint, - const gp_Pnt& theSecondPoint) const -{ - return theFirstPoint.Distance (theCenterPoint) > Precision::Confusion() - && theSecondPoint.Distance (theCenterPoint) > Precision::Confusion() - && gp_Vec (theCenterPoint, theFirstPoint).Angle ( - gp_Vec (theCenterPoint, theSecondPoint)) > Precision::Angular(); -} - -//======================================================================= -//function : isArrowVisible -//purpose : compares given and internal arrows types, returns true if the the type should be shown -//======================================================================= -Standard_Boolean AIS_AngleDimension::isArrowVisible(const AIS_TypeOfAngleArrowVisibility& theArrowType) const -{ - switch (theArrowType) - { - case AIS_TOAV_Both: - return myArrowsVisibility == AIS_TOAV_Both; - case AIS_TOAV_First: - return myArrowsVisibility == AIS_TOAV_Both || myArrowsVisibility == AIS_TOAV_First; - case AIS_TOAV_Second: - return myArrowsVisibility == AIS_TOAV_Both || myArrowsVisibility == AIS_TOAV_Second; - case AIS_TOAV_None: - return false; - } - return false; -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -const gp_Pnt AIS_AngleDimension::GetTextPosition() const -{ - if (!IsValid()) - { - return gp::Origin(); - } - - if (IsTextPositionCustom()) - { - return myFixedTextPosition; - } - - // Counts text position according to the dimension parameters - gp_Pnt aTextPosition (gp::Origin()); - - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - // Prepare label string and compute its geometrical width - Standard_Real aLabelWidth; - TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); - - gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); - gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); - - // Handle user-defined and automatic arrow placement - Standard_Boolean isArrowsExternal = Standard_False; - Standard_Integer aLabelPosition = LabelPosition_None; - FitTextAlignment (aDimensionAspect->TextHorizontalPosition(), - aLabelPosition, isArrowsExternal); - - // Get text position - switch (aLabelPosition & LabelPosition_HMask) - { - case LabelPosition_HCenter: - { - aTextPosition = GetCenterOnArc (aFirstAttach, aSecondAttach, myCenterPoint); - } - break; - case LabelPosition_Left: - { - gp_Dir aPlaneNormal = gp_Vec (aFirstAttach, aSecondAttach) ^ gp_Vec (myCenterPoint, aFirstAttach); - gp_Dir anExtensionDir = aPlaneNormal ^ gp_Vec (myCenterPoint, aFirstAttach); - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - Standard_Real anOffset = isArrowsExternal - ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() - : anExtensionSize; - gp_Vec anExtensionVec = gp_Vec (anExtensionDir) * -anOffset; - aTextPosition = aFirstAttach.Translated (anExtensionVec); - } - break; - case LabelPosition_Right: - { - gp_Dir aPlaneNormal = gp_Vec (aFirstAttach, aSecondAttach) ^ gp_Vec (myCenterPoint, aFirstAttach); - gp_Dir anExtensionDir = aPlaneNormal ^ gp_Vec (myCenterPoint, aSecondAttach); - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - Standard_Real anOffset = isArrowsExternal - ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() - : anExtensionSize; - gp_Vec anExtensionVec = gp_Vec (anExtensionDir) * anOffset; - aTextPosition = aSecondAttach.Translated (anExtensionVec); - } - break; - } - - return aTextPosition; -} - -//======================================================================= -//function : SetTextPosition -//purpose : -//======================================================================= -void AIS_AngleDimension::SetTextPosition (const gp_Pnt& theTextPos) -{ - if (!IsValid()) - { - return; - } - - // The text position point for angle dimension should belong to the working plane. - if (!GetPlane().Contains (theTextPos, Precision::Confusion())) - { - throw Standard_ProgramError("The text position point for angle dimension doesn't belong to the working plane."); - } - - myIsTextPositionFixed = Standard_True; - myFixedTextPosition = theTextPos; -} - -//======================================================================= -//function : AdjustParameters -//purpose : -//======================================================================= -void AIS_AngleDimension::AdjustParameters (const gp_Pnt& theTextPos, - Standard_Real& theExtensionSize, - Prs3d_DimensionTextHorizontalPosition& theAlignment, - Standard_Real& theFlyout) const -{ - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - - // Build circle with radius that is equal to distance from text position to the center point. - Standard_Real aRadius = gp_Vec (myCenterPoint, theTextPos).Magnitude(); - - // Set attach points in positive direction of the flyout. - gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * aRadius); - gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * aRadius); - - gce_MakeCirc aConstructCircle (myCenterPoint, GetPlane(), aRadius); - if (!aConstructCircle.IsDone()) - { - return; - } - gp_Circ aCircle = aConstructCircle.Value(); - - // Default values - theExtensionSize = aDimensionAspect->ArrowAspect()->Length(); - theAlignment = Prs3d_DTHP_Center; - - Standard_Real aParamBeg = ElCLib::Parameter (aCircle, aFirstAttach); - Standard_Real aParamEnd = ElCLib::Parameter (aCircle, aSecondAttach); - if (aParamEnd < aParamBeg) - { - Standard_Real aParam = aParamEnd; - aParamEnd = aParamBeg; - aParamBeg = aParam; - } - - ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); - Standard_Real aTextPar = ElCLib::Parameter (aCircle , theTextPos); - - // Horizontal center - if (aTextPar > aParamBeg && aTextPar < aParamEnd) - { - theFlyout = aRadius; - return; - } - - aParamBeg += M_PI; - aParamEnd += M_PI; - ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); - - if (aTextPar > aParamBeg && aTextPar < aParamEnd) - { - theFlyout = -aRadius; - return; - } - - // Text on the extensions - gp_Lin aFirstLine = gce_MakeLin (myCenterPoint, myFirstPoint); - gp_Lin aSecondLine = gce_MakeLin (myCenterPoint, mySecondPoint); - gp_Pnt aFirstTextProj = AIS::Nearest (aFirstLine, theTextPos); - gp_Pnt aSecondTextProj = AIS::Nearest (aSecondLine, theTextPos); - Standard_Real aFirstDist = aFirstTextProj.Distance (theTextPos); - Standard_Real aSecondDist = aSecondTextProj.Distance (theTextPos); - - if (aFirstDist <= aSecondDist) - { - aRadius = myCenterPoint.Distance (aFirstTextProj); - Standard_Real aNewExtensionSize = aFirstDist - anArrowLength; - theExtensionSize = aNewExtensionSize < 0.0 ? 0.0 : aNewExtensionSize; - - theAlignment = Prs3d_DTHP_Left; - - gp_Vec aPosFlyoutDir = gp_Vec (myCenterPoint, myFirstPoint).Normalized().Scaled (aRadius); - - theFlyout = aFirstTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion() - ? -aRadius : aRadius; - } - else - { - aRadius = myCenterPoint.Distance (aSecondTextProj); - - Standard_Real aNewExtensionSize = aSecondDist - anArrowLength; - - theExtensionSize = aNewExtensionSize < 0.0 ? 0.0 : aNewExtensionSize; - - theAlignment = Prs3d_DTHP_Right; - - gp_Vec aPosFlyoutDir = gp_Vec (myCenterPoint, mySecondPoint).Normalized().Scaled (aRadius); - - theFlyout = aSecondTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion() - ? -aRadius : aRadius; - } -} - -//======================================================================= -//function : FitTextAlignment -//purpose : -//======================================================================= -void AIS_AngleDimension::FitTextAlignment (const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, - Standard_Integer& theLabelPosition, - Standard_Boolean& theIsArrowsExternal) const -{ - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - - // Prepare label string and compute its geometrical width - Standard_Real aLabelWidth; - TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); - - // add margins to label width - if (aDimensionAspect->IsText3d()) - { - aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; - } - - gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); - gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); - - // Handle user-defined and automatic arrow placement - switch (aDimensionAspect->ArrowOrientation()) - { - case Prs3d_DAO_External: theIsArrowsExternal = true; break; - case Prs3d_DAO_Internal: theIsArrowsExternal = false; break; - case Prs3d_DAO_Fit: - { - gp_Vec anAttachVector (aFirstAttach, aSecondAttach); - Standard_Real aDimensionWidth = anAttachVector.Magnitude(); - - // Add margin to ensure a small tail between text and arrow - Standard_Real anArrowMargin = aDimensionAspect->IsText3d() - ? aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN - : 0.0; - - Standard_Real anArrowsWidth = (anArrowLength + anArrowMargin) * 2.0; - - theIsArrowsExternal = aDimensionWidth < aLabelWidth + anArrowsWidth; - break; - } - } - - // Handle user-defined and automatic text placement - switch (theHorizontalTextPos) - { - case Prs3d_DTHP_Left : theLabelPosition |= LabelPosition_Left; break; - case Prs3d_DTHP_Right : theLabelPosition |= LabelPosition_Right; break; - case Prs3d_DTHP_Center: theLabelPosition |= LabelPosition_HCenter; break; - case Prs3d_DTHP_Fit: - { - gp_Vec anAttachVector (aFirstAttach, aSecondAttach); - Standard_Real aDimensionWidth = anAttachVector.Magnitude(); - Standard_Real anArrowsWidth = anArrowLength * 2.0; - Standard_Real aContentWidth = theIsArrowsExternal ? aLabelWidth : aLabelWidth + anArrowsWidth; - - theLabelPosition |= aDimensionWidth < aContentWidth ? LabelPosition_Left : LabelPosition_HCenter; - break; - } - } - - switch (aDimensionAspect->TextVerticalPosition()) - { - case Prs3d_DTVP_Above : theLabelPosition |= LabelPosition_Above; break; - case Prs3d_DTVP_Below : theLabelPosition |= LabelPosition_Below; break; - case Prs3d_DTVP_Center : theLabelPosition |= LabelPosition_VCenter; break; - } -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_AngleDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_AngleDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_AngleDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_AngleDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,5 +1,4 @@ -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2013 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -15,376 +14,9 @@ #ifndef _AIS_AngleDimension_HeaderFile #define _AIS_AngleDimension_HeaderFile -#include -#include -#include +#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class AIS_AngleDimension; -DEFINE_STANDARD_HANDLE (AIS_AngleDimension, AIS_Dimension) - -//! Angle dimension. Can be constructed: -//! - on two intersected edges. -//! - on three points or vertices. -//! - on conical face. -//! - between two intersected faces. -//! -//! In case of three points or two intersected edges the dimension plane -//! (on which dimension presentation is built) can be computed uniquely -//! as through three defined points can be built only one plane. -//! Therefore, if user-defined plane differs from this one, the dimension can't be built. -//! -//! In cases of two planes automatic plane by default is built on point of the -//! origin of parametric space of the first face (the basis surface) so, that -//! the working plane and two faces intersection forms minimal angle between the faces. -//! User can define the other point which the dimension plane should pass through -//! using the appropriate constructor. This point can lay on the one of the faces or not. -//! Also user can define his own plane but it should pass through the three points -//! computed on the geometry initialization step (when the constructor or SetMeasuredGeometry() method -//! is called). -//! -//! In case of the conical face the center point of the angle is the apex of the conical surface. -//! The attachment points are points of the first and the last parameter of the basis circle of the cone. -//! -class AIS_AngleDimension : public AIS_Dimension -{ -public: - - //! Constructs minimum angle dimension between two linear edges (where possible). - //! These two edges should be intersected by each other. Otherwise the geometry is not valid. - //! @param theFirstEdge [in] the first edge. - //! @param theSecondEdge [in] the second edge. - Standard_EXPORT AIS_AngleDimension (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge); - - //! Constructs the angle display object defined by three points. - //! @param theFirstPoint [in] the first point (point on first angle flyout). - //! @param theSecondPoint [in] the center point of angle dimension. - //! @param theThirdPoint [in] the second point (point on second angle flyout). - Standard_EXPORT AIS_AngleDimension (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pnt& theThirdPoint); - - //! Constructs the angle display object defined by three vertices. - //! @param theFirstVertex [in] the first vertex (vertex for first angle flyout). - //! @param theSecondVertex [in] the center vertex of angle dimension. - //! @param theThirdPoint [in] the second vertex (vertex for second angle flyout). - Standard_EXPORT AIS_AngleDimension (const TopoDS_Vertex& theFirstVertex, - const TopoDS_Vertex& theSecondVertex, - const TopoDS_Vertex& theThirdVertex); - - //! Constructs angle dimension for the cone face. - //! @param theCone [in] the conical face. - Standard_EXPORT AIS_AngleDimension (const TopoDS_Face& theCone); - - //! Constructs angle dimension between two planar faces. - //! @param theFirstFace [in] the first face. - //! @param theSecondFace [in] the second face. - Standard_EXPORT AIS_AngleDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace); - - //! Constructs angle dimension between two planar faces. - //! @param theFirstFace [in] the first face. - //! @param theSecondFace [in] the second face. - //! @param thePoint [in] the point which the dimension plane should pass through. - //! This point can lay on the one of the faces or not. - Standard_EXPORT AIS_AngleDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - const gp_Pnt& thePoint); - -public: - - //! @return first point forming the angle. - const gp_Pnt& FirstPoint() const - { - return myFirstPoint; - } - - //! @return second point forming the angle. - const gp_Pnt& SecondPoint() const - { - return mySecondPoint; - } - - //! @return center point forming the angle. - const gp_Pnt& CenterPoint() const - { - return myCenterPoint; - } - - //! @return first argument shape. - const TopoDS_Shape& FirstShape() const - { - return myFirstShape; - } - - //! @return second argument shape. - const TopoDS_Shape& SecondShape() const - { - return mySecondShape; - } - - //! @return third argument shape. - const TopoDS_Shape& ThirdShape() const - { - return myThirdShape; - } - -public: - - //! Measures minimum angle dimension between two linear edges. - //! These two edges should be intersected by each other. Otherwise the geometry is not valid. - //! @param theFirstEdge [in] the first edge. - //! @param theSecondEdge [in] the second edge. - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge); - - //! Measures angle defined by three points. - //! @param theFirstPoint [in] the first point (point on first angle flyout). - //! @param theSecondPoint [in] the center point of angle dimension. - //! @param theThirdPoint [in] the second point (point on second angle flyout). - Standard_EXPORT void SetMeasuredGeometry (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pnt& theThridPoint); - - //! Measures angle defined by three vertices. - //! @param theFirstVertex [in] the first vertex (vertex for first angle flyout). - //! @param theSecondVertex [in] the center vertex of angle dimension. - //! @param theThirdPoint [in] the second vertex (vertex for second angle flyout). - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Vertex& theFirstVertex, - const TopoDS_Vertex& theSecondVertex, - const TopoDS_Vertex& theThirdVertex); - - //! Measures angle of conical face. - //! @param theCone [in] the shape to measure. - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theCone); - - //! Measures angle between two planar faces. - //! @param theFirstFace [in] the first face. - //! @param theSecondFace [in] the second face.. - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace); - - //! Measures angle between two planar faces. - //! @param theFirstFace [in] the first face. - //! @param theSecondFace [in] the second face. - //! @param thePoint [in] the point which the dimension plane should pass through. - //! This point can lay on the one of the faces or not. - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - const gp_Pnt& thePoint); - - //! @return the display units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; - - //! @return the model units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; - - Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - //! Principle of horizontal text alignment settings: - //! - divide circle into two halves according to attachment points - //! - if aTextPos is between attach points -> Center + positive flyout - //! - if aTextPos is not between attach points but in this half -> Left or Right + positive flyout - //! - if aTextPos is between reflections of attach points -> Center + negative flyout - //! - if aTextPos is not between reflections of attach points -> Left or Right + negative flyout - Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; - - Standard_EXPORT virtual const gp_Pnt GetTextPosition () const Standard_OVERRIDE; - - //! Sets angle type. - //! @param theType [in] the type value. - void SetType(const AIS_TypeOfAngle theType) - { - myType = theType; - } - - //! @return the current angle type. - AIS_TypeOfAngle GetType() const - { - return myType; - } - - //! Sets visible arrows type - //! @param theType [in] the type of visibility of arrows. - void SetArrowsVisibility(const AIS_TypeOfAngleArrowVisibility& theType) - { - myArrowsVisibility = theType; - } - - //! @return the type of visibility of arrows. - AIS_TypeOfAngleArrowVisibility GetArrowsVisibility() const - { - return myArrowsVisibility; - } - -public: - - DEFINE_STANDARD_RTTIEXT(AIS_AngleDimension,AIS_Dimension) - -protected: - - //! Initialization of fields that is common to all constructors. - Standard_EXPORT void Init(); - - //! Gets plane normal for minimal angle. - //! Dimension computation is based on three attach points and plane normal. - //! Based on this normal angle arc, arrows and extensions are constructed. - gp_Dir GetNormalForMinAngle() const; - - //! @param theFirstAttach [in] the first attachment point. - //! @param theSecondAttach [in] the second attachment point. - //! @param theCenter [in] the center point (center point of the angle). - //! @return the center of the dimension arc (the main dimension line in case of angle). - Standard_EXPORT gp_Pnt GetCenterOnArc (const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter) const; - - //! Draws main dimension line (arc). - //! @param thePresentation [in] the dimension presentation. - //! @param theFirstAttach [in] the first attachment point. - //! @param theSecondAttach [in] the second attachment point. - //! @param theCenter [in] the center point (center point of the angle). - //! @param theRadius [in] the radius of the dimension arc. - //! @param theMode [in] the display mode. - Standard_EXPORT void DrawArc (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter, - const Standard_Real theRadius, - const Standard_Integer theMode); - - //! Draws main dimension line (arc) with text. - //! @param thePresentation [in] the dimension presentation. - //! @param theFirstAttach [in] the first attachment point. - //! @param theSecondAttach [in] the second attachment point. - //! @param theCenter [in] the center point (center point of the angle). - //! @param theText [in] the text label string. - //! @param theTextWidth [in] the text label width. - //! @param theMode [in] the display mode. - //! @param theLabelPosition [in] the text label vertical and horizontal positioning option - //! respectively to the main dimension line. - Standard_EXPORT void DrawArcWithText (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theFirstAttach, - const gp_Pnt& theSecondAttach, - const gp_Pnt& theCenter, - const TCollection_ExtendedString& theText, - const Standard_Real theTextWidth, - const Standard_Integer theMode, - const Standard_Integer theLabelPosition); - - //! Fits text alignment relatively to the dimension line; - //! it computes the value of label position and arrow orientation - //! according set in the aspect and dimension properties. - //! @param theHorizontalTextPos [in] the horizontal alignment for text position. - //! @param theLabelPosition [out] the label position, contains bits that defines - //! vertical and horizontal alignment. (for internal usage in count text position). - //! @param theIsArrowExternal [out] is the arrows external, - //! if arrow orientation in the dimension aspect is Prs3d_DAO_Fit, it fits arrow - //! orientation automatically. - Standard_EXPORT void FitTextAlignment (const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, - Standard_Integer& theLabelPosition, - Standard_Boolean& theIsArrowsExternal) const; - - //! Adjusts aspect parameters according the text position: - //! extension size, vertical text alignment and flyout. - //! @param theTextPos [in] the user defined 3d point of text position. - //! @param theExtensionSize [out] the adjusted extension size. - //! @param theAlignment [out] the horizontal label alignment. - //! @param theFlyout [out] the adjusted value of flyout. - Standard_EXPORT void AdjustParameters (const gp_Pnt& theTextPos, - Standard_Real& theExtensionSize, - Prs3d_DimensionTextHorizontalPosition& theAlignment, - Standard_Real& theFlyout) const; - -protected: - - Standard_EXPORT virtual void ComputePlane(); - - //! Checks if the plane includes three angle points to build dimension. - Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePM, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theOwner) Standard_OVERRIDE; - -protected: - - //! Init angular dimension to measure angle between two linear edges. - //! @return TRUE if the angular dimension can be constructured - //! for the passed edges. - Standard_EXPORT Standard_Boolean InitTwoEdgesAngle (gp_Pln& theComputedPlane); - - //! Init angular dimension to measure angle between two planar faces. - //! there is no user-defined poisitoning. So attach points are set - //! according to faces geometry (in origin of the first face basis surface). - //! @return TRUE if the angular dimension can be constructed - //! for the passed faces. - Standard_EXPORT Standard_Boolean InitTwoFacesAngle(); - - //! Init angular dimension to measure angle between two planar faces. - //! @param thePointOnFirstFace [in] the point which the dimension plane should pass through. - //! This point can lay on the one of the faces or not. - //! It will be projected on the first face and this point will be set - //! as the first point attach point. - //! It defines some kind of dimension positioning over the faces. - //! @return TRUE if the angular dimension can be constructed - //! for the passed faces. - Standard_EXPORT Standard_Boolean InitTwoFacesAngle (const gp_Pnt thePointOnFirstFace); - - //! Init angular dimension to measure cone face. - //! @return TRUE if the angular dimension can be constructed - //! for the passed cone. - Standard_EXPORT Standard_Boolean InitConeAngle(); - - //! Check that the points forming angle are valid. - //! @return TRUE if the points met the following requirements: - //! The (P1, Center), (P2, Center) can be built. - //! The angle between the vectors > Precision::Angular(). - Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint, - const gp_Pnt& theCenterPoint, - const gp_Pnt& theSecondPoint) const; - - - //! Returns true if the arrow should be visible - //! @param theArrowType an arrow type - //! @return TRUE if the arrow should be visible - Standard_EXPORT Standard_Boolean isArrowVisible(const AIS_TypeOfAngleArrowVisibility& theArrowType) const; - -private: - AIS_TypeOfAngle myType; //!< type of angle - AIS_TypeOfAngleArrowVisibility myArrowsVisibility; //!< type of arrows visibility - - gp_Pnt myFirstPoint; - gp_Pnt mySecondPoint; - gp_Pnt myCenterPoint; - TopoDS_Shape myFirstShape; - TopoDS_Shape mySecondShape; - TopoDS_Shape myThirdShape; -}; +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_AngleDimension AIS_AngleDimension; #endif // _AIS_AngleDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Axis.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Axis.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Axis.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Axis.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -31,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -183,12 +181,6 @@ } -void AIS_Axis::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_Axis::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - //======================================================================= //function : ComputeSelection //purpose : @@ -239,16 +231,6 @@ SynchronizeAspects(); } - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= -void AIS_Axis::Compute(const Handle(Prs3d_Projector)&, - const Handle(Prs3d_Presentation)&) -{ -} - //======================================================================= //function : ComputeFields //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Axis.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Axis.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Axis.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Axis.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -83,15 +83,6 @@ //! Returns true if the interactive object accepts the display mode aMode. Standard_EXPORT Standard_Boolean AcceptDisplayMode (const Standard_Integer aMode) const Standard_OVERRIDE; - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; virtual Standard_Integer Signature() const Standard_OVERRIDE { return 2; } @@ -109,8 +100,6 @@ Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; Standard_EXPORT void ComputeFields(); diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_CameraFrustum.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_CameraFrustum.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_CameraFrustum.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_CameraFrustum.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,7 +43,7 @@ myDrawer->SetLineAspect (new Prs3d_LineAspect (THE_DEFAULT_COLOR, Aspect_TOL_SOLID, 1.0)); Handle(Prs3d_ShadingAspect) aShadingAspect = new Prs3d_ShadingAspect(); - aShadingAspect->SetMaterial (Graphic3d_NOM_PLASTIC); + aShadingAspect->SetMaterial (Graphic3d_NameOfMaterial_Plastified); aShadingAspect->Aspect()->SetAlphaMode (Graphic3d_AlphaMode_Blend); aShadingAspect->SetTransparency (THE_DEFAULT_TRANSPARENCY); aShadingAspect->SetColor (THE_DEFAULT_COLOR); diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf2dDimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf2dDimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf2dDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf2dDimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,248 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_Chamf2dDimension,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_Chamf2dDimension::AIS_Chamf2dDimension(const TopoDS_Shape& aFShape, - const Handle(Geom_Plane)& aPlane, - const Standard_Real aVal, - const TCollection_ExtendedString& aText) -:AIS_Relation() -{ - myFShape = aFShape; - myPlane = aPlane; - myVal = aVal; - myText = aText; - mySymbolPrs = DsgPrs_AS_LASTAR; - myAutomaticPosition = Standard_True; - - myArrowSize = myVal / 100.; -} -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_Chamf2dDimension::AIS_Chamf2dDimension(const TopoDS_Shape& aFShape, - const Handle(Geom_Plane)& aPlane, - const Standard_Real aVal, - const TCollection_ExtendedString& aText, - const gp_Pnt& aPosition, - const DsgPrs_ArrowSide aSymbolPrs , - const Standard_Real anArrowSize) -:AIS_Relation() -{ - myFShape = aFShape; - myPlane = aPlane; - myVal = aVal; - myText = aText; - myPosition = aPosition; - mySymbolPrs = aSymbolPrs; - SetArrowSize( anArrowSize ); - myAutomaticPosition = Standard_False; -} - - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_Chamf2dDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& , - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - Handle(Geom_Curve) gcurv; - gp_Pnt pfirst,plast; - const TopoDS_Edge& thechamfedge = TopoDS::Edge(myFShape); - if (!AIS::ComputeGeometry (thechamfedge, gcurv, pfirst, plast)) - return; - - Handle(Geom_Line) glin = Handle(Geom_Line)::DownCast (gcurv); - gp_Dir dir1 (glin->Position().Direction()); - gp_Dir norm1 = myPlane->Pln().Axis().Direction(); - myDir = norm1.Crossed(dir1); - - - //------------------------------------------------- - // calcul d'une direction orthogonale a l'edge du - // chanfrein et dirigee vers l'ext. du contour - //------------------------------------------------- - - - // recup. d'une edge adjacente a l'edge du chanfrein - /*TopoDS_Edge nextedge = TopoDS::Edge(mySShape); - - gp_Pnt pfirstnext,plastnext; - Handle(Geom_Line) glinnext; - if (!AIS::ComputeGeometry(nextedge,glinnext,pfirstnext,plastnext) ) - return; - - gp_Vec v1(pfirst,plast); - gp_Vec v2; - if (pfirst.IsEqual(plastnext, Precision::Confusion())) - v2.SetXYZ(pfirstnext.XYZ() - pfirst.XYZ()); - else - v2.SetXYZ(plastnext.XYZ() - pfirst.XYZ()); - gp_Vec crossvec = v1.Crossed(v2); - - myDir = dimserv.GetDirection().Crossed(glin->Position().Direction()); - if (crossvec.Dot(dimserv.GetDirection()) > 0 ) - myDir.Reverse();*/ // myDir => donne a la creation - - //-------------------------------------------- - //Calcul du point de positionnement du texte - //-------------------------------------------- - gp_Pnt curpos; - if (myAutomaticPosition) { - myPntAttach.SetXYZ((pfirst.XYZ()+plast.XYZ())/2); - gp_Vec transVec(myDir); - transVec*=myVal; - curpos = myPntAttach.Translated(transVec); - - if (myIsSetBndBox) - curpos = AIS::TranslatePointToBound( curpos, myDir, myBndBox ); - - myPosition = curpos; - } - else { - - myPntAttach.SetXYZ((pfirst.XYZ()+plast.XYZ())/2); - Handle(Geom_Line) dimLin = new Geom_Line(myPntAttach, myDir); - Standard_Real parcurpos = ElCLib::Parameter(dimLin->Lin(),myPosition); - curpos = ElCLib::Value(parcurpos,dimLin->Lin()); - //static Standard_Real minlength = 0.005; - //taille minimale de la dimension - - if ( curpos.Distance(myPntAttach) < 5. ) { - gp_Vec transVec(myDir); - transVec*=5.; - curpos = myPntAttach.Translated(transVec); - } - myPosition = curpos; - } - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - - //------------------------------------------------- - //Calcul de la boite englobante du component pour - //determiner la taille de la fleche - //------------------------------------------------- - - if( !myArrowSizeIsDefined ) { - Standard_Real arrsize = myArrowSize; - if ( (myVal/4) < arrsize) - arrsize = myVal/4; - if (arrsize > 30.) - arrsize = 30.; - else if (arrsize < 8.) - arrsize = 8.; - myArrowSize = arrsize; - } - arr->SetLength(myArrowSize); - - //Calcul de la presentation - DsgPrs_Chamf2dPresentation::Add(aPresentation, - myDrawer, - myPntAttach, - curpos, - myText, - mySymbolPrs); - - } - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= - -void AIS_Chamf2dDimension::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_Chamf2dDimension::Compute(const Handle(Prs3d_Projector)&,const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -void AIS_Chamf2dDimension::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_Chamf2dDimension::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_Chamf2dDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,myPntAttach,myPosition); - aSelection->Add(seg); - - // Text - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X() + size, - myPosition.Y() + size, - myPosition.Z() + size); - aSelection->Add(box); -} - diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf2dDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf2dDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf2dDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf2dDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,64 +14,9 @@ #ifndef _AIS_Chamf2dDimension_HeaderFile #define _AIS_Chamf2dDimension_HeaderFile -#include -#include -#include -#include +#include -class Geom_Plane; - -DEFINE_STANDARD_HANDLE(AIS_Chamf2dDimension, AIS_Relation) - -//! A framework to define display of 2D chamfers. -//! A chamfer is displayed with arrows and text. The text -//! gives the length of the chamfer if it is a symmetrical -//! chamfer, or the angle if it is not. -class AIS_Chamf2dDimension : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_Chamf2dDimension, AIS_Relation) -public: - - //! Constructs the display object for 2D chamfers. - //! This object is defined by the face aFShape, the - //! dimension aVal, the plane aPlane and the text aText. - Standard_EXPORT AIS_Chamf2dDimension(const TopoDS_Shape& aFShape, const Handle(Geom_Plane)& aPlane, const Standard_Real aVal, const TCollection_ExtendedString& aText); - - //! Constructs the display object for 2D chamfers. - //! This object is defined by the face aFShape, the plane - //! aPlane, the dimension aVal, the position aPosition, - //! the type of arrow aSymbolPrs with the size - //! anArrowSize, and the text aText. - Standard_EXPORT AIS_Chamf2dDimension(const TopoDS_Shape& aFShape, const Handle(Geom_Plane)& aPlane, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); - - //! Indicates that we are concerned with a 2d length. - virtual AIS_KindOfDimension KindOfDimension() const Standard_OVERRIDE; - - //! Returns true if the 2d chamfer dimension is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - gp_Pnt myPntAttach; - gp_Dir myDir; - -}; - -#include +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_Chamf2dDimension AIS_Chamf2dDimension; #endif // _AIS_Chamf2dDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf2dDimension.lxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf2dDimension.lxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf2dDimension.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf2dDimension.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -// Created on: 1997-02-28 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : KindOfDimension -//purpose : -//======================================================================= -inline AIS_KindOfDimension AIS_Chamf2dDimension::KindOfDimension() const -{ - return AIS_KOD_LENGTH; -} - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_Chamf2dDimension::IsMovable() const -{ - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf3dDimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf3dDimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf3dDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf3dDimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,222 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_Chamf3dDimension,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_Chamf3dDimension::AIS_Chamf3dDimension(const TopoDS_Shape& aFShape, - const Standard_Real aVal, - const TCollection_ExtendedString& aText) -:AIS_Relation() -{ - myFShape = aFShape; - myVal = aVal; - myText = aText; - mySymbolPrs = DsgPrs_AS_LASTAR; - myAutomaticPosition = Standard_True; - - myArrowSize = myVal / 100.; -} -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_Chamf3dDimension::AIS_Chamf3dDimension(const TopoDS_Shape& aFShape, - const Standard_Real aVal, - const TCollection_ExtendedString& aText, - const gp_Pnt& aPosition, - const DsgPrs_ArrowSide aSymbolPrs , - const Standard_Real anArrowSize) -:AIS_Relation() -{ - myFShape = aFShape; - myVal = aVal; - myText = aText; - myPosition = aPosition; - mySymbolPrs = aSymbolPrs; - SetArrowSize( anArrowSize ); - myAutomaticPosition = Standard_False; -} - - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_Chamf3dDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& , - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - //---------------------------- - // Calcul du centre de la face - //---------------------------- - BRepAdaptor_Surface surfAlgo (TopoDS::Face(myFShape)); - Standard_Real uFirst, uLast, vFirst, vLast; - uFirst = surfAlgo.FirstUParameter(); - uLast = surfAlgo.LastUParameter(); - vFirst = surfAlgo.FirstVParameter(); - vLast = surfAlgo.LastVParameter(); - Standard_Real uMoy = (uFirst + uLast)/2; - Standard_Real vMoy = (vFirst + vLast)/2; - gp_Pnt apos ; - gp_Vec d1u, d1v; - surfAlgo.D1(uMoy, vMoy, apos, d1u, d1v); - myPntAttach = apos; - - myDir = d1u ^ d1v; -// myDir = surfAlgo.Plane().Axis().Direction(); - - - - - //-------------------------------------------- - //Calcul du point de positionnement du texte - //-------------------------------------------- - gp_Pnt curpos; - if (myAutomaticPosition) { - gp_Vec transVec(myDir); - transVec*=myVal; - curpos = myPntAttach.Translated(transVec); - - if (myIsSetBndBox) - curpos = AIS::TranslatePointToBound( curpos, myDir, myBndBox ); - - myPosition = curpos; - } - else { - - Handle(Geom_Line) dimLin = new Geom_Line(myPntAttach, myDir); - Standard_Real parcurpos = ElCLib::Parameter(dimLin->Lin(),myPosition); - curpos = ElCLib::Value(parcurpos,dimLin->Lin()); - - if ( curpos.Distance(myPntAttach) < 5. ) { - gp_Vec transVec(myDir); - transVec*=5.; - curpos = myPntAttach.Translated(transVec); - } - myPosition = curpos; - } - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - - //------------------------------------------------- - //Calcul de la boite englobante du component pour - //determiner la taille de la fleche - //------------------------------------------------- - if( !myArrowSizeIsDefined ) { - Standard_Real arrsize = myArrowSize; - if ( (myVal/4) < arrsize) - arrsize = myVal/4; - if (arrsize > 30.) - arrsize = 30.; - else if (arrsize < 8.) - arrsize = 8.; - myArrowSize = arrsize; - } - arr->SetLength(myArrowSize); - - //Calcul de la presentation - DsgPrs_Chamf2dPresentation::Add(aPresentation, - myDrawer, - myPntAttach, - curpos, - myText, - mySymbolPrs); - -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= - -void AIS_Chamf3dDimension::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_Chamf3dDimension::Compute(const Handle(Prs3d_Projector)&,const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -void AIS_Chamf3dDimension::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_Chamf3dDimension::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_Chamf3dDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,myPntAttach,myPosition); - aSelection->Add(seg); - - // Text - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X() + size, - myPosition.Y() + size, - myPosition.Z() + size); - aSelection->Add(box); -} - diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf3dDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf3dDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf3dDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf3dDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1996-12-05 -// Created by: Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,62 +14,9 @@ #ifndef _AIS_Chamf3dDimension_HeaderFile #define _AIS_Chamf3dDimension_HeaderFile -#include -#include -#include -#include +#include -DEFINE_STANDARD_HANDLE(AIS_Chamf3dDimension, AIS_Relation) - -//! A framework to define display of 3D chamfers. -//! A chamfer is displayed with arrows and text. The text -//! gives the length of the chamfer if it is a symmetrical -//! chamfer, or the angle if it is not. -class AIS_Chamf3dDimension : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_Chamf3dDimension, AIS_Relation) -public: - - //! Constructs a display object for 3D chamfers. - //! This object is defined by the shape aFShape, the - //! dimension aVal and the text aText. - Standard_EXPORT AIS_Chamf3dDimension(const TopoDS_Shape& aFShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); - - //! Constructs a display object for 3D chamfers. - //! This object is defined by the shape aFShape, the - //! dimension aVal, the text aText, the point of origin of - //! the chamfer aPosition, the type of arrow aSymbolPrs - //! with the size anArrowSize. - Standard_EXPORT AIS_Chamf3dDimension(const TopoDS_Shape& aFShape, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); - - //! Indicates that we are concerned with a 3d length. - virtual AIS_KindOfDimension KindOfDimension() const Standard_OVERRIDE; - - //! Returns true if the 3d chamfer dimension is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - gp_Pnt myPntAttach; - gp_Dir myDir; - -}; - -#include +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_Chamf3dDimension AIS_Chamf3dDimension; #endif // _AIS_Chamf3dDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf3dDimension.lxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf3dDimension.lxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Chamf3dDimension.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Chamf3dDimension.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -// Created on: 1997-02-28 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : KindOfDimension -//purpose : -//======================================================================= -inline AIS_KindOfDimension AIS_Chamf3dDimension::KindOfDimension() const -{ - return AIS_KOD_LENGTH; -} - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_Chamf3dDimension::IsMovable() const -{ - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Circle.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Circle.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Circle.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Circle.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,14 +20,12 @@ #include #include #include -#include #include #include #include #include #include #include -#include #include #include #include @@ -86,19 +84,6 @@ } //======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_Circle::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Geom_Transformation)& aTransformation, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_Circle::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= //function : ComputeSelection //purpose : //======================================================================= @@ -197,7 +182,7 @@ } else { - Quantity_Color CC = Quantity_NOC_YELLOW;; + Quantity_Color CC = Quantity_NOC_YELLOW; if( HasColor() ) CC = myDrawer->Color(); else if (myDrawer->HasLink()) AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC); myDrawer->LineAspect()->SetColor(CC); @@ -262,7 +247,7 @@ { Handle(SelectMgr_EntityOwner) eown = new SelectMgr_EntityOwner(this); Handle(Select3D_SensitiveCircle) seg = new Select3D_SensitiveCircle (eown, - myComponent, + myComponent->Circ(), myIsFilledCircleSens); aSelection->Add(seg); } @@ -277,17 +262,8 @@ Handle(SelectMgr_EntityOwner) eown = new SelectMgr_EntityOwner(this); Handle(Select3D_SensitiveCircle) seg = new Select3D_SensitiveCircle (eown, - myComponent, + myComponent->Circ(), myUStart, myUEnd, myIsFilledCircleSens); aSelection->Add(seg); } - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= -void AIS_Circle::Compute(const Handle(Prs3d_Projector)&, - const Handle(Prs3d_Presentation)&) -{ -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Circle.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Circle.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Circle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Circle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,16 +37,7 @@ //! starting point theUStart, the arc ending point theUEnd, //! and the type of sensitivity theIsFilledCircleSens. Standard_EXPORT AIS_Circle(const Handle(Geom_Circle)& theCircle, const Standard_Real theUStart, const Standard_Real theUEnd, const Standard_Boolean theIsFilledCircleSens = Standard_False); - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - + //! Returns index 6 by default. virtual Standard_Integer Signature() const Standard_OVERRIDE { return 6; } @@ -103,8 +94,6 @@ Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; Standard_EXPORT void ComputeCircle (const Handle(Prs3d_Presentation)& aPresentation); diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ColoredDrawer.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ColoredDrawer.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ColoredDrawer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ColoredDrawer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,7 @@ //! Default constructor. AIS_ColoredDrawer (const Handle(Prs3d_Drawer)& theLink) : myIsHidden (false), + myHasOwnMaterial(false), myHasOwnColor (false), myHasOwnTransp(false), myHasOwnWidth (false) @@ -36,6 +37,10 @@ bool IsHidden() const { return myIsHidden; } void SetHidden (const bool theToHide) { myIsHidden = theToHide;} + bool HasOwnMaterial() const { return myHasOwnMaterial; } + void UnsetOwnMaterial() { myHasOwnMaterial = false; } + void SetOwnMaterial() { myHasOwnMaterial = true; } + bool HasOwnColor() const { return myHasOwnColor; } void UnsetOwnColor() { myHasOwnColor = false; } void SetOwnColor (const Quantity_Color& /*theColor*/) { myHasOwnColor = true; } @@ -51,6 +56,7 @@ public: //! @name list of overridden properties bool myIsHidden; + bool myHasOwnMaterial; bool myHasOwnColor; bool myHasOwnTransp; bool myHasOwnWidth; diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ColoredShape.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ColoredShape.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ColoredShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ColoredShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -333,7 +332,11 @@ for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next()) { const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value(); - //if (aDrawer->HasOwnMaterial()) continue; + if (aDrawer->HasOwnMaterial()) + { + continue; + } + if (aDrawer->HasOwnShadingAspect()) { setMaterial (aDrawer, theMaterial, aDrawer->HasOwnColor(), aDrawer->HasOwnTransparency()); @@ -368,7 +371,7 @@ // After this call if type of deflection is relative // computed deflection coefficient is stored as absolute. - Prs3d::GetDeflection (myshape, myDrawer); + StdPrs_ToolTriangulatedShape::GetDeflection (myshape, myDrawer); break; } case AIS_Shaded: @@ -486,8 +489,8 @@ } const TopAbs_ShapeEnum aTypOfSel = AIS_Shape::SelectionType (theMode); - const Standard_Real aDeflection = Prs3d::GetDeflection (myshape, myDrawer); - const Standard_Real aDeviationAngle = myDrawer->HLRAngle(); + const Standard_Real aDeflection = StdPrs_ToolTriangulatedShape::GetDeflection (myshape, myDrawer); + const Standard_Real aDeviationAngle = myDrawer->DeviationAngle(); const Standard_Integer aPriority = StdSelect_BRepSelectionTool::GetStandardPriority (myshape, aTypOfSel); if (myDrawer->IsAutoTriangulation() && !BRepTools::Triangulation (myshape, Precision::Infinite())) @@ -515,8 +518,6 @@ const Handle(SelectMgr_EntityOwner)& anOwner = aSelEntIter.Value()->BaseSensitive()->OwnerId(); anOwner->SetSelectable (aThis); } - - StdSelect_BRepSelectionTool::PreBuildBVH (theSelection); } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ColorScale.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ColorScale.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ColorScale.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ColorScale.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -290,6 +289,100 @@ } //======================================================================= +//function : MakeUniformColors +//purpose : +//======================================================================= +Aspect_SequenceOfColor AIS_ColorScale::MakeUniformColors (Standard_Integer theNbColors, + Standard_Real theLightness, + Standard_Real theHueFrom, + Standard_Real theHueTo) +{ + Aspect_SequenceOfColor aResult; + + // adjust range to be within (0, 360], with sign according to theHueFrom and theHueTo + Standard_Real aHueRange = std::fmod (theHueTo - theHueFrom, 360.); + const Standard_Real aHueEps = Precision::Angular() * 180. / M_PI; + if (Abs (aHueRange) <= aHueEps) + { + aHueRange = (aHueRange < 0 ? -360. : 360.); + } + + // treat limit cases + if (theNbColors < 1) + { + return aResult; + } + if (theNbColors == 1) + { + Standard_Real aHue = std::fmod (theHueFrom, 360.); + if (aHue < 0.) + { + aHue += 360.; + } + Quantity_Color aColor (theLightness, 130., aHue, Quantity_TOC_CIELch); + aResult.Append (aColor); + return aResult; + } + + // discretize the range with 1 degree step + const int NBCOLORS = 2 + (int)Abs (aHueRange / 1.); + Standard_Real aHueStep = aHueRange / (NBCOLORS - 1); + NCollection_Array1 aGrid (0, NBCOLORS - 1); + for (Standard_Integer i = 0; i < NBCOLORS; i++) + { + Standard_Real aHue = std::fmod (theHueFrom + i * aHueStep, 360.); + if (aHue < 0.) + { + aHue += 360.; + } + aGrid(i).SetValues (theLightness, 130., aHue, Quantity_TOC_CIELch); + } + + // and compute distances between each two colors in a grid + TColStd_Array1OfReal aMetric (0, NBCOLORS - 1); + Standard_Real aLength = 0.; + for (Standard_Integer i = 0, j = NBCOLORS - 1; i < NBCOLORS; j = i++) + { + aLength += (aMetric(i) = aGrid(i).DeltaE2000 (aGrid(j))); + } + + // determine desired step by distance; + // normally we aim to distribute colors from start to end + // of the range, but if distance between first and last points of the range + // is less than that step (e.g. range is full 360 deg), + // then distribute by the whole 360 deg scope to ensure that first + // and last colors are sufficiently distanced + Standard_Real aDStep = (aLength - aMetric.First()) / (theNbColors - 1); + if (aMetric.First() < aDStep) + { + aDStep = aLength / theNbColors; + } + + // generate sequence + aResult.Append(aGrid(0)); + Standard_Real aParam = 0., aPrev = 0., aTarget = aDStep; + for (int i = 1; i < NBCOLORS; i++) + { + aParam = aPrev + aMetric(i); + while (aTarget <= aParam) + { + float aCoefPrev = float((aParam - aTarget) / (aParam - aPrev)); + float aCoefCurr = float((aTarget - aPrev) / (aParam - aPrev)); + Quantity_Color aColor (aGrid(i).Rgb() * aCoefCurr + aGrid(i-1).Rgb() * aCoefPrev); + aResult.Append (aColor); + aTarget += aDStep; + } + aPrev = aParam; + } + if (aResult.Length() < theNbColors) + { + aResult.Append (aGrid.Last()); + } + Standard_ASSERT_VOID (aResult.Length() == theNbColors, "Failed to generate requested nb of colors"); + return aResult; +} + +//======================================================================= //function : SizeHint //purpose : //======================================================================= @@ -415,11 +508,6 @@ //======================================================================= Standard_Integer AIS_ColorScale::computeMaxLabelWidth (const TColStd_SequenceOfExtendedString& theLabels) const { - { - Handle(V3d_Viewer) aViewer = GetContext()->CurrentViewer(); - aViewer->InitActiveViews(); // for AIS_ColorScale::TextSize() - } - Standard_Integer aWidthMax = 0; for (TColStd_SequenceOfExtendedString::Iterator aLabIter (theLabels); aLabIter.More(); aLabIter.Next()) { diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ColorScale.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ColorScale.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ColorScale.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ColorScale.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -228,6 +228,36 @@ //! The length of the sequence should be equal to GetNumberOfIntervals(). Standard_EXPORT void SetColors (const Aspect_SequenceOfColor& theSeq); + //! Populates colors scale by colors of the same lightness value in CIE Lch + //! color space, distributed by hue, with perceptually uniform differences + //! between consequent colors. + //! See MakeUniformColors() for description of parameters. + void SetUniformColors (Standard_Real theLightness, + Standard_Real theHueFrom, Standard_Real theHueTo) + { + SetColors (MakeUniformColors (myNbIntervals, theLightness, theHueFrom, theHueTo)); + SetColorType (Aspect_TOCSD_USER); + } + + //! Generates sequence of colors of the same lightness value in CIE Lch + //! color space (see #Quantity_TOC_CIELch), with hue values in the specified range. + //! The colors are distributed across the range such as to have perceptually + //! same difference between neighbour colors. + //! For each color, maximal chroma value fitting in sRGB gamut is used. + //! + //! @param theNbColors - number of colors to generate + //! @param theLightness - lightness to be used (0 is black, 100 is white, 32 is + //! lightness of pure blue) + //! @param theHueFrom - hue value at the start of the scale + //! @param theHueTo - hue value defining the end of the scale + //! + //! Hue value can be out of the range [0, 360], interpreted as modulo 360. + //! The colors of the scale will be in the order of increasing hue if + //! theHueTo > theHueFrom, and decreasing otherwise. + Standard_EXPORT static Aspect_SequenceOfColor + MakeUniformColors (Standard_Integer theNbColors, Standard_Real theLightness, + Standard_Real theHueFrom, Standard_Real theHueTo); + //! Returns the position of labels concerning color filled rectangles, Aspect_TOCSP_RIGHT by default. Aspect_TypeOfColorScalePosition GetLabelPosition() const { return myLabelPos; } diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ConcentricRelation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ConcentricRelation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ConcentricRelation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ConcentricRelation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,277 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_ConcentricRelation,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_ConcentricRelation::AIS_ConcentricRelation( - const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape, - const Handle(Geom_Plane)& aPlane) -{ - myFShape = aFShape; - mySShape = aSShape; - myPlane = aPlane; - myDir = aPlane->Pln().Axis().Direction(); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_ConcentricRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - TopAbs_ShapeEnum type2(mySShape.ShapeType()); - aPresentation->SetInfiniteState(Standard_True); - switch (myFShape.ShapeType()) { - case TopAbs_EDGE: - { - if (type2 == TopAbs_EDGE) ComputeTwoEdgesConcentric(aPresentation); - else if (type2 == TopAbs_VERTEX) ComputeEdgeVertexConcentric(aPresentation); - } - break; - - case TopAbs_VERTEX: - { - if (type2 == TopAbs_VERTEX) ComputeTwoVerticesConcentric(aPresentation); - else if (type2 == TopAbs_EDGE) ComputeEdgeVertexConcentric(aPresentation); - } - break; - default: {return;} - } -} - -void AIS_ConcentricRelation::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_ConcentricRelation::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeTwoEdgesConcentric -//purpose : -//======================================================================= -void AIS_ConcentricRelation::ComputeEdgeVertexConcentric(const Handle(Prs3d_Presentation)& aPresentation) -{ - TopoDS_Edge E; - TopoDS_Vertex V; - if (myFShape.ShapeType() == TopAbs_EDGE) { - E = TopoDS::Edge(myFShape); - V = TopoDS::Vertex(mySShape); - } - else { - E = TopoDS::Edge(mySShape); - V = TopoDS::Vertex(myFShape); - } - gp_Pnt p1,p2; - Handle(Geom_Curve) C; - Handle(Geom_Curve) extCurv; - Standard_Boolean isInfinite; - Standard_Boolean isOnPlanEdge, isOnPlanVertex; - if (!AIS::ComputeGeometry(E,C,p1,p2,extCurv,isInfinite,isOnPlanEdge,myPlane)) return; - gp_Pnt P; - AIS::ComputeGeometry(V,P, myPlane, isOnPlanVertex); - - Handle(Geom_Circle) CIRCLE (Handle(Geom_Circle)::DownCast (C)); - myCenter = CIRCLE->Location(); - myRad = Min(CIRCLE->Radius()/5.,15.); - gp_Dir vec(p1.XYZ() - myCenter.XYZ() ); - gp_Vec vectrans(vec); - myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); - DsgPrs_ConcentricPresentation::Add(aPresentation,myDrawer,myCenter,myRad,myDir,myPnt); - if (!isOnPlanEdge) AIS::ComputeProjEdgePresentation(aPresentation,myDrawer,E,CIRCLE,p1,p2); - if (!isOnPlanVertex) AIS::ComputeProjVertexPresentation(aPresentation,myDrawer,V,P); -} - -//======================================================================= -//function : ComputeTwoEdgesConcentric -//purpose : -//======================================================================= -void AIS_ConcentricRelation::ComputeTwoVerticesConcentric(const Handle(Prs3d_Presentation)& aPresentation) -{ - TopoDS_Vertex V1,V2; - V1 = TopoDS::Vertex(myFShape); - V2 = TopoDS::Vertex(myFShape); - Standard_Boolean isOnPlanVertex1(Standard_True),isOnPlanVertex2(Standard_True); - gp_Pnt P1,P2; - AIS::ComputeGeometry(V1,P1, myPlane,isOnPlanVertex1); - AIS::ComputeGeometry(V2,P2, myPlane,isOnPlanVertex2); - myCenter = P1; - myRad = 15.; - gp_Dir vec(myPlane->Pln().Position().XDirection()); - gp_Vec vectrans(vec); - myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); - DsgPrs_ConcentricPresentation::Add(aPresentation,myDrawer,myCenter,myRad,myDir,myPnt); - if (!isOnPlanVertex1) AIS::ComputeProjVertexPresentation(aPresentation,myDrawer,V1,P1); - if (!isOnPlanVertex2) AIS::ComputeProjVertexPresentation(aPresentation,myDrawer,V2,P2); -} - -//======================================================================= -//function : ComputeTwoEdgesConcentric -//purpose : -//======================================================================= -void AIS_ConcentricRelation::ComputeTwoEdgesConcentric(const Handle(Prs3d_Presentation)& aPresentation) -{ - BRepAdaptor_Curve curv1(TopoDS::Edge(myFShape)); - BRepAdaptor_Curve curv2(TopoDS::Edge(mySShape)); - - gp_Pnt ptat11,ptat12,ptat21,ptat22; - Handle(Geom_Curve) geom1,geom2; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape), - TopoDS::Edge(mySShape), - myExtShape, - geom1, - geom2, - ptat11, - ptat12, - ptat21, - ptat22, - extCurv, - isInfinite1,isInfinite2, - myPlane)) { - return; - } - - Handle(Geom_Circle) gcirc1 (Handle(Geom_Circle)::DownCast (geom1)); - Handle(Geom_Circle) gcirc2 (Handle(Geom_Circle)::DownCast (geom2)); - - myCenter = gcirc1->Location(); - - // choose the radius equal to 1/5 of the smallest radius of - // 2 circles. Limit is imposed ( 0.02 by chance) - Standard_Real aRad1 = gcirc1->Radius(); - Standard_Real aRad2 = gcirc2->Radius(); - myRad = (aRad1 > aRad2 ) ? aRad2 : aRad1; - myRad /= 5; - if (myRad > 15.) myRad =15.; - - - //Calculate a point of circle of radius myRad - gp_Dir vec(ptat11.XYZ() - myCenter.XYZ() ); - gp_Vec vectrans(vec); - myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); - - DsgPrs_ConcentricPresentation::Add(aPresentation, - myDrawer, - myCenter, - myRad, - myDir, - myPnt); - if ( (myExtShape != 0) && !extCurv.IsNull()) { - gp_Pnt pf, pl; - if ( myExtShape == 1 ) { - if (!isInfinite1) { - pf = ptat11; - pl = ptat12; - } - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),gcirc1,pf,pl); - } - else { - if (!isInfinite2) { - pf = ptat21; - pl = ptat22; - } - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),gcirc2,pf,pl); - } - } -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= - -void AIS_ConcentricRelation::Compute(const Handle(Prs3d_Projector)&, - const Handle(Prs3d_Presentation)&) -{ -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_ConcentricRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - - //Creation of 2 sensitive circles - // the greater - gp_Ax2 ax(myCenter, myDir); - Handle(Geom_Circle) Circ = new Geom_Circle(ax, myRad) ; - Handle(Select3D_SensitiveCircle) - sensit = new Select3D_SensitiveCircle (own, - Circ); - aSelection->Add(sensit); - // the smaller - Circ->SetRadius(myRad/2); - sensit = new Select3D_SensitiveCircle (own, - Circ); - aSelection->Add(sensit); - - //Creation of 2 segments sensitive for the cross - Handle(Select3D_SensitiveSegment) seg; - gp_Pnt otherPnt = myPnt.Mirrored(myCenter); - seg = new Select3D_SensitiveSegment(own, - otherPnt, - myPnt); - aSelection->Add(seg); - - gp_Ax1 RotateAxis(myCenter, myDir); - gp_Pnt FPnt = myCenter.Rotated(RotateAxis, M_PI/2); - gp_Pnt SPnt = myCenter.Rotated(RotateAxis, -M_PI/2); - seg = new Select3D_SensitiveSegment(own, - FPnt, - SPnt); - aSelection->Add(seg); - -} - diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ConcentricRelation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ConcentricRelation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ConcentricRelation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ConcentricRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,59 +14,9 @@ #ifndef _AIS_ConcentricRelation_HeaderFile #define _AIS_ConcentricRelation_HeaderFile -#include -#include +#include -class Geom_Plane; - -DEFINE_STANDARD_HANDLE(AIS_ConcentricRelation, AIS_Relation) - -//! A framework to define a constraint by a relation of -//! concentricity between two or more interactive datums. -//! The display of this constraint is also defined. -//! A plane is used to create an axis along which the -//! relation of concentricity can be extended. -class AIS_ConcentricRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_ConcentricRelation, AIS_Relation) -public: - - //! Constructs the display object for concentric relations - //! between shapes. - //! This object is defined by the two shapes, aFShape - //! and aSShape and the plane aPlane. - //! aPlane is provided to create an axis along which the - //! relation of concentricity can be extended. - Standard_EXPORT AIS_ConcentricRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoEdgesConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); - - Standard_EXPORT void ComputeEdgeVertexConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); - - Standard_EXPORT void ComputeTwoVerticesConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - gp_Pnt myCenter; - Standard_Real myRad; - gp_Dir myDir; - gp_Pnt myPnt; - -}; +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_ConcentricRelation AIS_ConcentricRelation; #endif // _AIS_ConcentricRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ConnectedInteractive.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ConnectedInteractive.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ConnectedInteractive.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ConnectedInteractive.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include @@ -55,7 +55,7 @@ //purpose : //======================================================================= void AIS_ConnectedInteractive::connect (const Handle(AIS_InteractiveObject)& theAnotherObj, - const Handle(Geom_Transformation)& theLocation) + const Handle(TopLoc_Datum3D)& theLocation) { if (myReference == theAnotherObj) { @@ -79,6 +79,12 @@ if (!myReference.IsNull()) { + if (myReference->HasInteractiveContext() + && myReference->GetContext()->DisplayStatus (myReference) != AIS_DS_None) + { + myReference.Nullify(); + throw Standard_ProgramError("AIS_ConnectedInteractive::Connect() - connected object should NOT be displayed in context"); + } myTypeOfPresentation3d = myReference->TypeOfPresentation3d(); } setLocalTransformation (theLocation); @@ -131,42 +137,30 @@ } //======================================================================= -//function : Compute +//function : computeHLR //purpose : //======================================================================= -void AIS_ConnectedInteractive::Compute (const Handle(Prs3d_Projector)& theProjector, - const Handle(Geom_Transformation)& theTransformation, - const Handle(Prs3d_Presentation)& thePresentation) +void AIS_ConnectedInteractive::computeHLR (const Handle(Graphic3d_Camera)& theProjector, + const Handle(TopLoc_Datum3D)& theTransformation, + const Handle(Prs3d_Presentation)& thePresentation) { - updateShape (Standard_False); + const bool hasTrsf = !theTransformation.IsNull() + && theTransformation->Form() != gp_Identity; + updateShape (!hasTrsf); if (myShape.IsNull()) { return; } - const TopLoc_Location& aLocation = myShape.Location(); - TopoDS_Shape aShape = myShape.Located (TopLoc_Location (theTransformation->Trsf()) * aLocation); - Compute (theProjector, thePresentation, aShape); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_ConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) -{ - updateShape (Standard_True); - Compute (aProjector, aPresentation, myShape); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_ConnectedInteractive::Compute (const Handle(Prs3d_Projector)& theProjector, - const Handle(Prs3d_Presentation)& thePrs, - const TopoDS_Shape& theShape) -{ - AIS_Shape::computeHlrPresentation (theProjector, thePrs, theShape, myDrawer); + if (hasTrsf) + { + const TopLoc_Location& aLocation = myShape.Location(); + TopoDS_Shape aShape = myShape.Located (TopLoc_Location (theTransformation->Trsf()) * aLocation); + AIS_Shape::computeHlrPresentation (theProjector, thePresentation, aShape, myDrawer); + } + else + { + AIS_Shape::computeHlrPresentation (theProjector, thePresentation, myShape, myDrawer); + } } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ConnectedInteractive.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ConnectedInteractive.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ConnectedInteractive.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ConnectedInteractive.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -52,19 +52,19 @@ //! Establishes the connection between the Connected //! Interactive Object, anotherIobj, and its reference. - void Connect (const Handle(AIS_InteractiveObject)& theAnotherObj) { connect (theAnotherObj, Handle(Geom_Transformation)()); } + void Connect (const Handle(AIS_InteractiveObject)& theAnotherObj) { connect (theAnotherObj, Handle(TopLoc_Datum3D)()); } //! Establishes the connection between the Connected //! Interactive Object, anotherIobj, and its reference. //! Locates instance in aLocation. void Connect (const Handle(AIS_InteractiveObject)& theAnotherObj, - const gp_Trsf& theLocation) { connect (theAnotherObj, new Geom_Transformation (theLocation)); } + const gp_Trsf& theLocation) { connect (theAnotherObj, new TopLoc_Datum3D (theLocation)); } //! Establishes the connection between the Connected //! Interactive Object, anotherIobj, and its reference. //! Locates instance in aLocation. void Connect (const Handle(AIS_InteractiveObject)& theAnotherObj, - const Handle(Geom_Transformation)& theLocation) { connect (theAnotherObj, theLocation); } + const Handle(TopLoc_Datum3D)& theLocation) { connect (theAnotherObj, theLocation); } //! Returns true if there is a connection established //! between the presentation and its source reference. @@ -105,18 +105,10 @@ //! a transformation if there's one stored. Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode) Standard_OVERRIDE; - //! Computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - //! Computes the presentation according to a point of view - //! given by . - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; + //! Computes the presentation according to a point of view. + Standard_EXPORT virtual void computeHLR (const Handle(Graphic3d_Camera)& theProjector, + const Handle(TopLoc_Datum3D)& theTrsf, + const Handle(Prs3d_Presentation)& thePrs) Standard_OVERRIDE; //! Generates sensitive entities by copying //! them from myReference selection, creates and sets an entity @@ -130,12 +122,8 @@ Standard_EXPORT void updateShape (const Standard_Boolean WithLocation = Standard_True); - //! Computes the presentation according to a point of view - //! given by . - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation, const TopoDS_Shape& aShape); - Standard_EXPORT void connect (const Handle(AIS_InteractiveObject)& theAnotherObj, - const Handle(Geom_Transformation)& theLocation); + const Handle(TopLoc_Datum3D)& theLocation); protected: diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,1535 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const Standard_Real SquareTolerance = Precision::SquareConfusion(); - -//======================================================================= -//function : Nearest -//purpose : -//======================================================================= -gp_Pnt AIS::Nearest(const TopoDS_Shape& ashape, const gp_Pnt& apoint) -{ - Standard_Real dist2 = RealLast(); - Standard_Real curdist2; - gp_Pnt result(0.0,0.0,0.0); - gp_Pnt curpnt(0.0,0.0,0.0); - TopExp_Explorer explo(ashape,TopAbs_VERTEX); - while (explo.More()) - { - curpnt = BRep_Tool::Pnt(TopoDS::Vertex(explo.Current())); - curdist2 = apoint.SquareDistance(curpnt); - if (curdist2 < dist2) - { - result = curpnt; - dist2 = curdist2; - } - explo.Next(); - } - return result; -} - -//======================================================================= -//function : Nearest -//purpose : For finds the nearest point on . -//======================================================================= -gp_Pnt AIS::Nearest (const gp_Lin& theLine, const gp_Pnt& thePoint) -{ - Handle(Geom_Line) aLine = new Geom_Line (theLine); - - GeomAPI_ProjectPointOnCurve aPointProj (thePoint, aLine); - return aPointProj.Point (1); -} - -//======================================================================= -//function : Nearest -//purpose : For the given point finds nearest point on the curve, -// return TRUE if found point is belongs to curve -// and FALSE otherwise. -//======================================================================= -Standard_Boolean AIS::Nearest (const Handle(Geom_Curve)& theCurve, - const gp_Pnt& thePoint, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theLastPoint, - gp_Pnt& theNearestPoint) -{ - GeomAPI_ProjectPointOnCurve aPointProj (thePoint, theCurve); - theNearestPoint = theCurve->Value (aPointProj.LowerDistanceParameter()); - - Standard_Real aLength = theFirstPoint.Distance (theLastPoint); - - if (theNearestPoint.Distance (theFirstPoint) > aLength - || theNearestPoint.Distance (theLastPoint) >aLength) - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : Farest -//purpose : -//======================================================================= -gp_Pnt AIS::Farest( const TopoDS_Shape& aShape, const gp_Pnt& aPoint ) -{ - Standard_Real MaxDist2 = 0.0e0, curdist2; - gp_Pnt Result(0.0,0.0,0.0); - gp_Pnt curpnt(0.0,0.0,0.0); - TopExp_Explorer Explo( aShape, TopAbs_VERTEX ); - for (; Explo.More(); Explo.Next()) - { - curpnt = BRep_Tool::Pnt( TopoDS::Vertex( Explo.Current() ) ); - curdist2 = aPoint.SquareDistance( curpnt ); - if (curdist2 > MaxDist2) - { - MaxDist2 = curdist2; - Result = curpnt; - } - } - return Result; -} - - -//======================================================================= -//function : ComputeGeometry -//purpose : for line, circle, ellipse. -//======================================================================= -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theEdge, - Handle(Geom_Curve)& theCurve, - gp_Pnt& theFirstPnt, - gp_Pnt& theLastPnt) -{ - TopLoc_Location anEdgeLoc; - Standard_Real aFirst, aLast; - theCurve = BRep_Tool::Curve (theEdge, anEdgeLoc, aFirst, aLast); - if (theCurve.IsNull()) - { - return Standard_False; - } - - if (!anEdgeLoc.IsIdentity()) - { - Handle(Geom_Geometry) aGeometry = theCurve->Transformed (anEdgeLoc.Transformation()); - theCurve = Handle(Geom_Curve)::DownCast (aGeometry); - } - - if (theCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theCurve = Handle(Geom_TrimmedCurve)::DownCast (theCurve)->BasisCurve(); - } - - if (theCurve->IsInstance (STANDARD_TYPE (Geom_Line))) - { - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theCurve); - theFirstPnt = ElCLib::Value (aFirst, aLine->Lin()); - theLastPnt = ElCLib::Value (aLast, aLine->Lin()); - } - else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) - { - Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theCurve); - - theFirstPnt = ElCLib::Value (aFirst, aCirc->Circ()); - theLastPnt = ElCLib::Value (aLast, aCirc->Circ()); - } - else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Ellipse))) - { - Handle(Geom_Ellipse) anEllipse = Handle(Geom_Ellipse)::DownCast (theCurve); - theFirstPnt = ElCLib::Value (aFirst, anEllipse->Elips()); - theLastPnt = ElCLib::Value (aLast, anEllipse->Elips()); - } - else - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : for line, circle, ellipse. -//======================================================================= -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theEdge, - Handle(Geom_Curve)& theCurve, - gp_Pnt& theFirstPnt, - gp_Pnt& theLastPnt, - Standard_Boolean& theIsInfinite) -{ - Standard_Real aFirst, aLast; - - BRepAdaptor_Curve anAdaptor (theEdge); - - theCurve = Handle(Geom_Curve)::DownCast - (anAdaptor.Curve().Curve()->Transformed (anAdaptor.Trsf())); - - if (theCurve.IsNull()) - { - return Standard_False; - } - - aFirst = anAdaptor.FirstParameter(); - aLast = anAdaptor.LastParameter(); - - theIsInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); - - if (theCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theCurve = Handle(Geom_TrimmedCurve)::DownCast (theCurve)->BasisCurve(); - } - - if (!theIsInfinite) - { - theFirstPnt = theCurve->Value (aFirst); - theLastPnt = theCurve->Value (aLast); - } - else - { - theFirstPnt = gp::Origin(); - theLastPnt = gp::Origin(); - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : -//======================================================================= - -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theEdge, - Handle(Geom_Curve)& theCurve, - gp_Pnt& theFirstPnt, - gp_Pnt& theLastPnt, - Handle(Geom_Curve)& theExtCurve, - Standard_Boolean& theIsInfinite, - Standard_Boolean& theIsOnPlane, - const Handle(Geom_Plane)& thePlane) -{ - if (thePlane.IsNull()) - { - return Standard_False; - } - - Standard_Real aFirst, aLast; - BRepAdaptor_Curve aCurveAdaptor (theEdge); - theCurve = Handle(Geom_Curve)::DownCast (aCurveAdaptor.Curve().Curve()->Transformed (aCurveAdaptor.Trsf())); - aFirst = aCurveAdaptor.FirstParameter(); - aLast = aCurveAdaptor.LastParameter(); - - if (theCurve.IsNull()) - { - return Standard_False; - } - - theExtCurve = theCurve; - theIsInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); - - // Checks that the projected curve is not in the plane. - theIsOnPlane = Standard_True; - if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theExtCurve = Handle(Geom_TrimmedCurve)::DownCast (theExtCurve)->BasisCurve(); - } - - if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_Line))) - { - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theExtCurve); - theIsOnPlane = thePlane->Pln().Contains (aLine->Lin(), - Precision::Confusion(), - Precision::Angular()); - } - else if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) - { - Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast (theExtCurve); - - gp_Ax3 aCircPos (aCircle->Position()); - theIsOnPlane = aCircPos.IsCoplanar (thePlane->Pln().Position(), - Precision::Confusion(), - Precision::Angular()); - } - - if (theIsOnPlane) - { - theExtCurve.Nullify(); - } - - theCurve = GeomProjLib::ProjectOnPlane (theCurve, thePlane, - thePlane->Pln().Axis().Direction(), - Standard_False); - - if (theCurve->IsInstance (STANDARD_TYPE (Geom_Line))) - { - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theCurve); - if (!theIsInfinite) - { - theFirstPnt = ElCLib::Value (aFirst, aLine->Lin()); - theLastPnt = ElCLib::Value (aLast, aLine->Lin()); - } - } - else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) - { - Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theCurve); - - theFirstPnt = ElCLib::Value (aFirst, aCirc->Circ()); - theLastPnt = ElCLib::Value (aLast, aCirc->Circ()); - } - else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Ellipse))) - { - Handle(Geom_Ellipse) anEllipse = Handle(Geom_Ellipse)::DownCast (theCurve); - - theFirstPnt = ElCLib::Value (aFirst, anEllipse->Elips()); - theLastPnt = ElCLib::Value (aLast, anEllipse->Elips()); - } - else - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : -//======================================================================= -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge, - Handle(Geom_Curve)& theFirstCurve, - Handle(Geom_Curve)& theSecondCurve, - gp_Pnt& theFirstPnt1, - gp_Pnt& theLastPnt1, - gp_Pnt& theFirstPnt2, - gp_Pnt& theLastPnt2, - const Handle(Geom_Plane)& thePlane) -{ - if (thePlane.IsNull()) - { - return Standard_False; - } - - TopLoc_Location aFirstEdgeLoc, aSecondEdgeLoc; - Standard_Real aFirst1, aLast1, aFirst2, aLast2; - - theFirstCurve = BRep_Tool::Curve (theFirstEdge, aFirstEdgeLoc, aFirst1, aLast1); - theSecondCurve = BRep_Tool::Curve (theSecondEdge, aSecondEdgeLoc, aFirst2, aLast2); - - if (theFirstCurve.IsNull()) - { - return Standard_False; - } - - if (theSecondCurve.IsNull()) - { - return Standard_False; - } - - if (!aFirstEdgeLoc.IsIdentity()) - { - Handle(Geom_Geometry) aGeomGeometry = theFirstCurve->Transformed (aFirstEdgeLoc.Transformation()); - theFirstCurve = Handle(Geom_Curve)::DownCast (aGeomGeometry); - } - - if (!aSecondEdgeLoc.IsIdentity()) - { - Handle(Geom_Geometry) aGeomGeometry = theSecondCurve->Transformed (aSecondEdgeLoc.Transformation()); - theSecondCurve = Handle(Geom_Curve)::DownCast (aGeomGeometry); - } - - theFirstCurve = GeomProjLib::ProjectOnPlane (theFirstCurve, thePlane, - thePlane->Pln().Axis().Direction(), - Standard_False); - - - theSecondCurve = GeomProjLib::ProjectOnPlane (theSecondCurve, thePlane, - thePlane->Pln().Axis().Direction(), - Standard_False); - - - if (theFirstCurve->IsInstance (STANDARD_TYPE(Geom_TrimmedCurve))) - { - theFirstCurve = Handle(Geom_TrimmedCurve)::DownCast (theFirstCurve)->BasisCurve(); - } - - if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theSecondCurve = Handle(Geom_TrimmedCurve)::DownCast (theSecondCurve)->BasisCurve(); - } - - if (theFirstCurve->IsInstance(STANDARD_TYPE(Geom_Line))) - { - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theFirstCurve); - - theFirstPnt1 = ElCLib::Value (aFirst1, aLine->Lin()); - theLastPnt1 = ElCLib::Value (aLast1, aLine->Lin()); - } - else if (theFirstCurve->IsInstance(STANDARD_TYPE(Geom_Circle))) - { - Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theFirstCurve); - - theFirstPnt1 = ElCLib::Value (aFirst1, aCirc->Circ()); - theLastPnt1 = ElCLib::Value (aLast1, aCirc->Circ()); - } - else - { - return Standard_False; - } - - if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_Line))) -{ - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theSecondCurve); - - theFirstPnt2 = ElCLib::Value (aFirst2, aLine->Lin()); - theLastPnt2 = ElCLib::Value (aLast2, aLine->Lin()); - } - else if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) - { - Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theSecondCurve); - - theFirstPnt2 = ElCLib::Value (aFirst2, aCirc->Circ()); - theLastPnt2 = ElCLib::Value (aLast2, aCirc->Circ()); - } - else - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : Computes the geometry of the 2 edges. -//======================================================================= -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge, - Handle(Geom_Curve)& theFirstCurve, - Handle(Geom_Curve)& theSecondCurve, - gp_Pnt& theFirstPnt1, - gp_Pnt& theLastPnt1, - gp_Pnt& theFirstPnt2, - gp_Pnt& theLastPnt2, - Standard_Boolean& theIsInfinite1, - Standard_Boolean& theIsInfinite2) -{ - theIsInfinite1 = theIsInfinite2 = Standard_False; - - if (!AIS::ComputeGeometry (theFirstEdge, theFirstCurve,theFirstPnt1, theLastPnt1, theIsInfinite1)) - { - return Standard_False; - } - - if (!AIS::ComputeGeometry (theSecondEdge, theSecondCurve,theFirstPnt2, theLastPnt2, theIsInfinite2)) - { - return Standard_False; - } - - if (theIsInfinite1 || theIsInfinite2) - { - if (theFirstCurve->DynamicType() == theSecondCurve->DynamicType()) - { - gp_Lin aLin1 = Handle(Geom_Line)::DownCast (theFirstCurve)->Lin(); - gp_Lin aLin2 = Handle(Geom_Line)::DownCast (theSecondCurve)->Lin(); - - if (theIsInfinite1) - { - theFirstPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theFirstPnt2), aLin1); - theLastPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theLastPnt2), aLin1); - } - else if (theIsInfinite2) - { - theFirstPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theFirstPnt1), aLin2); - theLastPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theLastPnt1), aLin2); - } - } - else - { - if (theIsInfinite1 && !theIsInfinite2) - { - GeomAPI_ProjectPointOnCurve aProjector (theFirstPnt2, theFirstCurve); - theFirstPnt1 = theFirstCurve->Value (aProjector.LowerDistanceParameter ()); - - aProjector.Init (theLastPnt2, theFirstCurve); - theLastPnt1 = theFirstCurve->Value (aProjector.LowerDistanceParameter ()); - } - else if (!theIsInfinite1 && theIsInfinite2) - { - GeomAPI_ProjectPointOnCurve aProjector (theFirstPnt1, theSecondCurve); - theFirstPnt2 = theSecondCurve->Value (aProjector.LowerDistanceParameter ()); - - aProjector.Init (theLastPnt1, theSecondCurve); - theLastPnt2 = theSecondCurve->Value (aProjector.LowerDistanceParameter ()); - } - else - { - return Standard_False; - } - } - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : Computes the geometry of the 2 edges in the current wp -// and the 'right' geometry of the edges if one doesn't -// belong to the current working plane. -// There may be only one curve that can't belong to the -// current working plane ( attachement constraint) -// if the 2 edges belong to the current WP, = 0 -// -// indexExt = 0 2 edges are in the current wp -// indexExt = 1 first edge is not in the current wp -// indexExt = 2 second edge is not in the current wp -// if none of the two edges is in the current wp , -// it returns Standard_False -//======================================================================= -Standard_Boolean AIS::ComputeGeometry (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge, - Standard_Integer& theExtIndex, - Handle(Geom_Curve)& theFirstCurve, - Handle(Geom_Curve)& theSecondCurve, - gp_Pnt& theFirstPnt1, - gp_Pnt& theLastPnt1, - gp_Pnt& theFirstPnt2, - gp_Pnt& theLastPnt2, - Handle(Geom_Curve)& theExtCurve, - Standard_Boolean& theIsInfinite1, - Standard_Boolean& theIsInfinite2, - const Handle(Geom_Plane)& thePlane) -{ - if (thePlane.IsNull()) - { - return Standard_False; - } - - theExtCurve.Nullify(); - theExtIndex = 0; - - Standard_Real aFirst1, aLast1, aFirst2, aLast2; - theIsInfinite1 = theIsInfinite2 = Standard_False; - - BRepAdaptor_Curve aFirstAdaptor (theFirstEdge); - BRepAdaptor_Curve aSecondAdaptor (theSecondEdge); - - theFirstCurve = Handle(Geom_Curve)::DownCast - (aFirstAdaptor.Curve().Curve()->Transformed (aFirstAdaptor.Trsf())); - theSecondCurve = Handle(Geom_Curve)::DownCast - (aSecondAdaptor.Curve().Curve()->Transformed (aSecondAdaptor.Trsf())); - - if (theFirstCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theFirstCurve = Handle(Geom_TrimmedCurve)::DownCast (theFirstCurve)->BasisCurve(); - } - if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) - { - theSecondCurve = Handle(Geom_TrimmedCurve)::DownCast (theSecondCurve)->BasisCurve(); - } - - aFirst1 = aFirstAdaptor.FirstParameter(); - aLast1 = aFirstAdaptor.LastParameter(); - - aFirst2 = aSecondAdaptor.FirstParameter(); - aLast2 = aSecondAdaptor.LastParameter(); - - if (theFirstCurve.IsNull() || theSecondCurve.IsNull()) - { - return Standard_False; - } - - Handle(Geom_Curve) aFirstSaved = theFirstCurve; - Handle(Geom_Curve) aSecondSaved = theSecondCurve; - - // Checks that the projected curve is not in the plane - Standard_Boolean isFirstOnPlane,isSecondOnPlane; - - if ((!ComputeGeomCurve (theFirstCurve, aFirst1, aLast1, theFirstPnt1, theLastPnt1, thePlane, isFirstOnPlane)) - || (!ComputeGeomCurve( theSecondCurve, aFirst2, aLast2, theFirstPnt2, theLastPnt2, thePlane,isSecondOnPlane))) - { - return Standard_False; - } - - if (Precision::IsInfinite (aFirst1) || Precision::IsInfinite (aLast1)) - { - theIsInfinite1 = Standard_True; - theExtIndex = 1; - } - if (Precision::IsInfinite (aFirst2) || Precision::IsInfinite (aLast2)) - { - theIsInfinite2 = Standard_True; - theExtIndex = 2; - } - if (theIsInfinite1 && theIsInfinite2) - { - theExtIndex = 0; - } - - if (theIsInfinite1 || theIsInfinite2) - { - if (theFirstCurve->DynamicType() == theSecondCurve->DynamicType()) - { - gp_Lin aLin1 = Handle(Geom_Line)::DownCast (theFirstCurve)->Lin(); - gp_Lin aLin2 = Handle(Geom_Line)::DownCast (theSecondCurve)->Lin(); - - if (theExtIndex == 1) - { - theFirstPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theFirstPnt2), aLin1); - theLastPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theLastPnt2), aLin1); - } - else if (theExtIndex == 2) - { - theFirstPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theFirstPnt1), aLin2); - theLastPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theLastPnt1), aLin2); - } - } - } - - if (isFirstOnPlane && isSecondOnPlane) - { - return Standard_True; - } - - if (!isFirstOnPlane && isSecondOnPlane) - {// curve 2 only in the plane - theExtIndex = 1; - theExtCurve = aFirstSaved; - } - else if (isFirstOnPlane && !isSecondOnPlane) - {// curve 1 only in the plane - theExtIndex = 2; - theExtCurve = aSecondSaved; - } - else - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeGeomCurve -//purpose : Checks if aCurve belongs to aPlane; if not, projects aCurve in aPlane -// and returns aCurveproj; -// Return TRUE if ok -//======================================================================= -Standard_Boolean AIS::ComputeGeomCurve (Handle(Geom_Curve)& aCurve, - const Standard_Real first1, - const Standard_Real last1, - gp_Pnt& FirstPnt1, - gp_Pnt& LastPnt1, - const Handle(Geom_Plane)& aPlane, - Standard_Boolean& isOnPlane) -{ - isOnPlane = Standard_True; - const Standard_Integer NodeNumber = 20; - Standard_Real Delta = (last1 - first1) / (NodeNumber - 1); - if (Delta <= Precision::PConfusion()) - { - Delta = last1 - first1; - } - - gp_Pnt CurPnt(0.0, 0.0, 0.0); - Standard_Real CurPar = first1; - for (Standard_Integer i = 1; i <= NodeNumber; i++) - { - CurPnt = aCurve->Value( CurPar ); - if (aPlane->Pln().SquareDistance( CurPnt ) > SquareTolerance) - { - isOnPlane = Standard_False; - break; - } - CurPar += Delta; - } - - if (!Precision::IsInfinite(first1) && !Precision::IsInfinite(last1)) - { - FirstPnt1 = aCurve->Value (first1); - LastPnt1 = aCurve->Value (last1); - } - - if (!isOnPlane) - { - Handle(Geom_Curve) aGeomCurve = GeomProjLib::ProjectOnPlane (aCurve, - aPlane, - aPlane->Pln().Axis().Direction(), - Standard_False); - aCurve = aGeomCurve; - if (aCurve->IsInstance(STANDARD_TYPE(Geom_TrimmedCurve))) - { - aCurve = Handle(Geom_TrimmedCurve)::DownCast (aCurve)->BasisCurve(); - } - if (! Precision::IsInfinite(first1) && ! Precision::IsInfinite(last1)) - { - FirstPnt1 = AIS::ProjectPointOnPlane( FirstPnt1, aPlane->Pln() ); - LastPnt1 = AIS::ProjectPointOnPlane( LastPnt1, aPlane->Pln() ); - } - } - return Standard_True; -} - -//======================================================================= -//function : ComputeGeometry -//purpose : computes the point corresponding to the vertex -// in the plane . If the vertex is already in the plane -// , = true. -// is the projected vertex in the plane. -//======================================================================= -Standard_Boolean AIS::ComputeGeometry(const TopoDS_Vertex& aVertex, - gp_Pnt& point, - const Handle(Geom_Plane)& aPlane, - Standard_Boolean& isOnPlane) -{ - point = BRep_Tool::Pnt(aVertex); - isOnPlane = aPlane->Pln().Contains(point, Precision::Confusion()); - if ( !isOnPlane) { - point = AIS::ProjectPointOnPlane( point, aPlane->Pln() ); - } - return Standard_True; -} - -//======================================================================= -//function : GetPlaneFromFace -//purpose : -// Returns type of surface which can be Plane or OtherSurface -//======================================================================= -Standard_Boolean AIS::GetPlaneFromFace(const TopoDS_Face& aFace, - gp_Pln & aPlane, - Handle( Geom_Surface )& aSurf, - AIS_KindOfSurface & aSurfType, - Standard_Real & Offset) - -{ - Standard_Boolean Result = Standard_False; - BRepAdaptor_Surface surf1( aFace ); - Handle( Adaptor3d_HSurface ) surf2; - Standard_Boolean isOffset = Standard_False; - Offset = 0.0; - - if (surf1.GetType() == GeomAbs_OffsetSurface) - { - // Extracting Basis Surface - surf2 = surf1.BasisSurface(); - isOffset = Standard_True; - } - else - surf2 = new BRepAdaptor_HSurface( surf1 ); - - aSurf = surf1.Surface().Surface(); - // aSurf->Transform(surf1.Trsf()) ; - aSurf = Handle( Geom_Surface )::DownCast( aSurf->Transformed( surf1.Trsf() ) ); - - if (surf2->GetType() == GeomAbs_Plane) - { - aPlane = surf2->Plane(); - aSurfType = AIS_KOS_Plane; - Result = Standard_True; - } - - else if (surf2->GetType() == GeomAbs_SurfaceOfExtrusion) - { - Handle( Adaptor3d_HCurve ) BasisCurve = surf2->BasisCurve(); - gp_Dir ExtrusionDir = surf2->Direction(); - if (BasisCurve->GetType() == GeomAbs_Line) - { - gp_Lin BasisLine = BasisCurve->Line(); - gp_Dir LineDir = BasisLine.Direction(); - gp_Pnt LinePos = BasisLine.Location(); - gp_Pln thePlane( LinePos, LineDir ^ ExtrusionDir); - aPlane = thePlane; - aSurfType = AIS_KOS_Plane; - Result = Standard_True; - } - } - - if (Result == Standard_True && isOffset) - { - aSurf = (Handle( Geom_OffsetSurface )::DownCast( aSurf ))->Surface(); - aPlane = (Handle( Geom_Plane )::DownCast( aSurf ))->Pln(); - } - if (Result == Standard_False) - { - if (isOffset) - { - Handle( Standard_Type ) TheType = aSurf->DynamicType(); - if (TheType == STANDARD_TYPE(Geom_CylindricalSurface) || - TheType == STANDARD_TYPE(Geom_ConicalSurface) || - TheType == STANDARD_TYPE(Geom_SphericalSurface) || - TheType == STANDARD_TYPE(Geom_ToroidalSurface)) - { - aSurf = (Handle( Geom_OffsetSurface )::DownCast( aSurf ))->Surface(); - } - else - { - Offset = (Handle( Geom_OffsetSurface )::DownCast( aSurf ))->Offset(); - aSurf = (Handle( Geom_OffsetSurface )::DownCast( aSurf ))->BasisSurface(); - } - } - Handle( Standard_Type ) TheType = aSurf->DynamicType(); - if (TheType == STANDARD_TYPE(Geom_CylindricalSurface)) - aSurfType = AIS_KOS_Cylinder; - else if (TheType == STANDARD_TYPE(Geom_ConicalSurface)) - aSurfType = AIS_KOS_Cone; - else if (TheType == STANDARD_TYPE(Geom_SphericalSurface)) - aSurfType = AIS_KOS_Sphere; - else if (TheType == STANDARD_TYPE(Geom_ToroidalSurface)) - aSurfType = AIS_KOS_Torus; - else if (TheType == STANDARD_TYPE(Geom_SurfaceOfRevolution)) - aSurfType = AIS_KOS_Revolution; - else if (TheType == STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion)) - aSurfType = AIS_KOS_Extrusion; - else - aSurfType = AIS_KOS_OtherSurface; - } - return Result; -} - - -//======================================================================= -//function : ProjectPointOnPlane -//purpose : -//======================================================================= - -gp_Pnt AIS::ProjectPointOnPlane( const gp_Pnt & aPoint, const gp_Pln & aPlane ) -{ - gp_Vec aVec( aPlane.Location(), aPoint ); - gp_Vec Normal = aPlane.Axis().Direction(); - Normal = (aVec * Normal) * Normal; - - return ( aPoint.Translated( -Normal ) ); -} - -//======================================================================= -//function : ProjectPointOnLine -//purpose : -//======================================================================= - -gp_Pnt AIS::ProjectPointOnLine( const gp_Pnt & aPoint, const gp_Lin & aLine ) -{ - gp_XYZ LinLoc = aLine.Location().XYZ(); - gp_XYZ LinDir = aLine.Direction().XYZ(); - Standard_Real Parameter = (aPoint.XYZ() - LinLoc) * LinDir; - gp_Pnt Result( LinLoc + Parameter * LinDir ); - return Result; -} - -//======================================================================= -//function : InitFaceLength -//purpose : -//======================================================================= -void AIS::InitFaceLength (const TopoDS_Face& theFace, - gp_Pln& thePlane, - Handle(Geom_Surface)& theSurface, - AIS_KindOfSurface& theSurfaceType, - Standard_Real& theOffset) -{ - if (AIS::GetPlaneFromFace (theFace, thePlane, theSurface, theSurfaceType, theOffset) - && Abs (theOffset) > Precision::Confusion()) - { - theSurface = new Geom_OffsetSurface (theSurface, theOffset); - theOffset = 0.0e0; - } -} - -//======================================================================= -//function : InitAngleBetweenPlanarFaces -//purpose : -//======================================================================= -Standard_Boolean AIS::InitAngleBetweenPlanarFaces (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - gp_Pnt & theCenter, - gp_Pnt & theFirstAttach, - gp_Pnt & theSecondAttach, - const Standard_Boolean theIsFirstPointSet) -{ - Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (BRep_Tool::Surface (theFirstFace)); - Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (BRep_Tool::Surface (theSecondFace)); - - GeomAPI_IntSS aPlaneIntersector (aFirstPlane, aSecondPlane, Precision::Confusion()); - - // Fails if two planes haven't only one intersection line. - if (!aPlaneIntersector.IsDone()) - { - return Standard_False; - } - - if (aPlaneIntersector.NbLines() != 1) - { - return Standard_False; - } - - // Get intersect line. - Handle(Geom_Curve) anIntersectCurve = aPlaneIntersector.Line (1); - - Handle(Geom_Line) anIntersectLine = Handle(Geom_Line)::DownCast (anIntersectCurve); - - if (anIntersectLine.IsNull()) - { - return Standard_False; - } - - gp_Lin anIntersectLin = anIntersectLine->Lin(); - - gp_Pnt aFirstCenter, aSecondCenter; - Standard_Real anU1Min, anU1Max, aV1Min, aV1Max; - Standard_Real anU2Min, anU2Max, aV2Min, aV2Max; - - BRepTools::UVBounds (theFirstFace, anU1Min, anU1Max, aV1Min, aV1Max); - BRepTools::UVBounds (theSecondFace, anU2Min, anU2Max, aV2Min, aV2Max); - - // Get first and second attach. - if (theIsFirstPointSet) - { - GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aFirstPlane); - if (!aProjector.IsDone()) - { - return Standard_False; - } - - aFirstCenter = aProjector.Point (1); - } - else - { - aFirstCenter = aFirstPlane->Value ((anU1Min + anU1Max) * 0.5, (aV1Min + aV1Max) * 0.5); - } - - aSecondCenter = aSecondPlane->Value ((anU2Min + anU2Max) * 0.5, (aV2Min + aV2Max) * 0.5); - - GeomAPI_ProjectPointOnCurve aProj (aFirstCenter, anIntersectCurve); - theCenter = aProj.NearestPoint(); - - gp_Vec aFirstNormal = anIntersectLin.Direction() ^ aFirstPlane->Pln().Axis().Direction(); - if (aFirstNormal * gp_Vec (theCenter, aFirstCenter) < 0.0) - { - aFirstNormal.Reverse(); - } - theFirstAttach = theCenter.Translated (aFirstNormal); - - gp_Vec aSecondNormal = anIntersectLin.Direction() ^ aSecondPlane->Pln().Axis().Direction(); - if (aSecondNormal * gp_Vec (theCenter, aSecondCenter) < 0.0) - { - aSecondNormal.Reverse(); - } - theSecondAttach = theCenter.Translated (aSecondNormal); - - return Standard_True; -} - -//======================================================================= -//function : InitAngleBetweenCurvilinearFaces -//purpose : -//======================================================================= -Standard_Boolean AIS::InitAngleBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - const AIS_KindOfSurface theFirstSurfType, - const AIS_KindOfSurface theSecondSurfType, - gp_Pnt& theCenter, - gp_Pnt& theFirstAttach, - gp_Pnt& theSecondAttach, - const Standard_Boolean theIsFirstPointSet) -{ - Handle(Geom_Surface) aFirstSurf = BRep_Tool::Surface (theFirstFace); - Handle(Geom_Surface) aSecondSurf = BRep_Tool::Surface (theSecondFace); - - // Find intersection curve between two surfaces. - GeomAPI_IntSS aSurfaceIntersector (aFirstSurf, aSecondSurf, Precision::Confusion()); - - // Fails if two planes haven't only one intersection line. - if (!aSurfaceIntersector.IsDone()) - { - return Standard_False; - } - - if (aSurfaceIntersector.NbLines() != 1) - { - return Standard_False; - } - - // Get intersect line. - Handle(Geom_Curve) anIntersectCurve = aSurfaceIntersector.Line (1); - - Handle(Geom_Line) aFirstLine, aSecondLine; - Standard_Real aFirstU = 0.0; - Standard_Real aFirstV = 0.0; - - if (theIsFirstPointSet) - { - GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aFirstSurf); - if (!aProjector.IsDone()) - { - return Standard_False; - } - - theFirstAttach = aProjector.Point (1); - } - else - { - theFirstAttach = aFirstSurf->Value (aFirstU, aFirstV); - } - - aFirstLine = Handle(Geom_Line)::DownCast (aFirstSurf->UIso (aFirstU)); - - if (theSecondSurfType == AIS_KOS_Cylinder) - { - Handle(Geom_CylindricalSurface) aCylinder = Handle(Geom_CylindricalSurface)::DownCast (aSecondSurf); - - Standard_Real aSecondU = aCylinder->Cylinder().XAxis().Direction().Angle( - gce_MakeDir (ProjectPointOnLine (theFirstAttach, - gp_Lin (aCylinder->Cylinder().Axis())), - theFirstAttach)); - - aSecondLine = Handle(Geom_Line)::DownCast (aCylinder->UIso (aSecondU)); - } - else if (theSecondSurfType == AIS_KOS_Cone) - { - Handle(Geom_ConicalSurface) aCone = Handle(Geom_ConicalSurface)::DownCast (aSecondSurf); - - gp_Dir anXdirection = aCone->Cone().XAxis().Direction(); - - gp_Dir aToFirstAttach = gce_MakeDir (ProjectPointOnLine (theFirstAttach, - gp_Lin (aCone->Cone().Axis())), - theFirstAttach); - - Standard_Real aSecondU = anXdirection.Angle (aToFirstAttach); - - // Check sign - if (!anXdirection.IsEqual (aToFirstAttach, Precision::Angular()) && - !anXdirection.IsOpposite (aToFirstAttach, Precision::Angular()) && - (anXdirection ^ aToFirstAttach) * aCone->Cone().Axis().Direction() < 0.0) - { - aSecondU = 2*M_PI - aSecondU; - } - aSecondLine = Handle( Geom_Line )::DownCast (aCone->UIso(aSecondU)); - } - else - { - return Standard_False; - } - - // If angle can be computed between two lines. - if (!(aFirstLine->Lin().Direction().IsEqual (aSecondLine->Lin().Direction(), Precision::Angular() )) && - !(aFirstLine->Lin().Direction().IsOpposite (aSecondLine->Lin().Direction(), Precision::Angular()))) - { - GeomAPI_ExtremaCurveCurve anIntersector (aFirstLine, aSecondLine); - anIntersector.Points (1, theCenter, theCenter); - - // Move theFirstAttach on aFirstLine if it is on theCenter. - if (theCenter.SquareDistance(theFirstAttach ) <= SquareTolerance) - { - gp_Vec aDir (aFirstLine->Lin().Direction()); - theFirstAttach = theCenter.Translated (aDir); - - // theFirstAttach should be on theFirstSurf. - Standard_Real anU, aV; - if (theFirstSurfType == AIS_KOS_Cylinder) - { - ElSLib::Parameters ((Handle(Geom_CylindricalSurface)::DownCast (aFirstSurf))->Cylinder(), - theFirstAttach, anU, aV); - - theFirstAttach = ElSLib::Value (aFirstU, aV, - (Handle( Geom_CylindricalSurface )::DownCast (aFirstSurf))->Cylinder() ); - } - else if (theFirstSurfType == AIS_KOS_Cone) - { - ElSLib::Parameters ((Handle(Geom_ConicalSurface)::DownCast (aFirstSurf))->Cone(), - theFirstAttach, anU, aV); - theFirstAttach = ElSLib::Value (aFirstU, aV, - (Handle(Geom_ConicalSurface)::DownCast (aFirstSurf))->Cone()); - } - else - { - return Standard_False; - } - } - - // Find theSecondAttach - GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aSecondSurf); - if (!aProjector.IsDone()) - { - return Standard_False; - } - Standard_Real anU, aV; - aProjector.LowerDistanceParameters (anU, aV); - theSecondAttach = aSecondSurf->Value (anU, aV); - } - else // aFirstLine and aSecondLine are coincident - { - gp_Vec aDir (aFirstLine->Lin().Direction()); - theFirstAttach = theCenter.Translated (aDir); - theSecondAttach = theCenter.Translated (-aDir); - } - return Standard_True; -} - -//======================================================================= -//function : ComputeLengthBetweenCurvilinearFaces -//purpose : -//======================================================================= -void AIS::InitLengthBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace, - Handle(Geom_Surface)& theFirstSurf, - Handle(Geom_Surface)& theSecondSurf, - gp_Pnt& theFirstAttach, - gp_Pnt& theSecondAttach, - gp_Dir& theDirOnPlane) -{ - GeomAPI_ProjectPointOnSurf aProjector; - Standard_Real aPU, aPV; - - TopExp_Explorer anExplorer (theFirstFace, TopAbs_VERTEX); - - theFirstAttach = BRep_Tool::Pnt (TopoDS::Vertex (anExplorer.Current())); - aProjector.Init (theFirstAttach, theFirstSurf); - - theFirstAttach = aProjector.NearestPoint(); - aProjector.LowerDistanceParameters (aPU, aPV); - - gp_Vec aD1U, aD1V; - theFirstSurf->D1 (aPU, aPV, theFirstAttach, aD1U, aD1V); - - if (aD1U.SquareMagnitude() <= SquareTolerance || aD1V.SquareMagnitude() <= SquareTolerance) - { - theFirstAttach = AIS::Farest (theFirstFace, theFirstAttach); - aProjector.Init (theFirstAttach, theFirstSurf); - aProjector.LowerDistanceParameters (aPU, aPV); - theFirstSurf->D1 (aPU, aPV, theFirstAttach, aD1U, aD1V); - } - - aD1U.Normalize(); - aD1V.Normalize(); - - theDirOnPlane = gp_Dir (aD1U); - - gp_Dir aFirstSurfN = gp_Dir (aD1U ^ aD1V); - - aProjector.Init (theFirstAttach, theSecondSurf); - - Standard_Integer aBestPointIndex = 0; - Standard_Real aMinDist = RealLast(); - gp_Dir aLocalDir; - - for (Standard_Integer aPointIt = 1; aPointIt <= aProjector.NbPoints(); aPointIt++) - { - aProjector.Parameters (aPointIt, aPU, aPV); - - theSecondSurf->D1 (aPU, aPV, theSecondAttach, aD1U, aD1V); - - aLocalDir = aD1U.SquareMagnitude() <= SquareTolerance || aD1V.SquareMagnitude() <= SquareTolerance - ? gp_Dir (gp_Vec (theFirstAttach, aProjector.Point (aPointIt))) - : gp_Dir (aD1U ^ aD1V); - - if (aFirstSurfN.IsParallel (aLocalDir, Precision::Angular()) && aProjector.Distance (aPointIt) < aMinDist) - { - aBestPointIndex = aPointIt; - aMinDist = aProjector.Distance (aPointIt); - } - } - - if (aBestPointIndex == 0) - { - theSecondAttach = theFirstAttach; - } - else - { - theSecondAttach = aProjector.Point (aBestPointIndex); - aProjector.Parameters (aBestPointIndex, aPU, aPV); - - // Now there is projection of FirstAttach onto SecondSurf in aProjector - BRepTopAdaptor_FClass2d aClassifier (theSecondFace, Precision::Confusion()); - - TopAbs_State aState = - aClassifier.Perform (gp_Pnt2d (aPU, aPV), theSecondSurf->IsUPeriodic() || theSecondSurf->IsVPeriodic()); - - if (aState == TopAbs_OUT || aState == TopAbs_UNKNOWN) - { - theSecondAttach = AIS::Nearest (theSecondFace, theSecondAttach); - } - } -} - -gp_Pnt AIS::TranslatePointToBound( const gp_Pnt & aPoint, const gp_Dir & aDir, const Bnd_Box & aBndBox ) -{ - if (aBndBox.IsOut( aPoint )) - return aPoint; - else - { - gp_Pnt Result(0.0,0.0,0.0); - TColStd_Array2OfReal Bound( 1, 3, 1, 2 ); - TColStd_Array1OfReal Origin( 1, 3 ); - TColStd_Array1OfReal Dir( 1, 3 ); - Standard_Real t; - - aBndBox.Get( Bound(1,1), Bound(2,1), Bound(3,1), Bound(1,2), Bound(2,2), Bound(3,2) ); - aPoint.Coord( Origin(1), Origin(2), Origin(3) ); - aDir.Coord( Dir(1), Dir(2), Dir(3) ); - - Bnd_Box EnlargedBox = aBndBox; - EnlargedBox.Enlarge( aBndBox.GetGap() + Precision::Confusion() ); - - Standard_Boolean IsFound = Standard_False; - for (Standard_Integer i = 1; i <= 3; i++) - { - if (Abs( Dir( i ) ) <= gp::Resolution()) - continue; - for (Standard_Integer j = 1; j <= 2; j++) - { - t = (Bound( i, j ) - Origin( i )) / Dir( i ); - if (t < 0.0e0) - continue; - Result = aPoint.Translated( gp_Vec( aDir ) * t ); - if (! EnlargedBox.IsOut( Result )) - { - IsFound = Standard_True; - break; - } - } - if (IsFound) break; - } - return Result; - } -} - - -//======================================================================= -//function : InDomain -//purpose : -//======================================================================= - -Standard_Boolean AIS::InDomain(const Standard_Real fpar, - const Standard_Real lpar, - const Standard_Real para) -{ - if (fpar >= 0.) { - if(lpar > fpar) - return ((para >= fpar) && (para <= lpar)); - else { // fpar > lpar - Standard_Real delta = 2*M_PI-fpar; - Standard_Real lp, par, fp; - lp = lpar + delta; - par = para + delta; - while(lp > 2*M_PI) lp-=2*M_PI; - while(par > 2*M_PI) par-=2*M_PI; - fp = 0.; - return ((par >= fp) && (par <= lp)); - } - - } - if (para >= (fpar+2*M_PI)) return Standard_True; - if (para <= lpar) return Standard_True; - return Standard_False; -} - -//======================================================================= -//function : DistanceFromApex -//purpose : calculates parametric length arc of ellipse -//======================================================================= - -Standard_Real AIS::DistanceFromApex(const gp_Elips & elips, - const gp_Pnt & Apex, - const Standard_Real par) -{ - Standard_Real dist; - Standard_Real parApex = ElCLib::Parameter ( elips, Apex ); - if(parApex == 0.0 || parApex == M_PI) - {//Major case - if(parApex == 0.0) //pos Apex - dist = (par < M_PI) ? par : (2*M_PI - par); - else //neg Apex - dist = (par < M_PI) ? ( M_PI - par) : ( par - M_PI ); - } - else - {// Minor case - if(parApex == M_PI / 2) //pos Apex - { - if(par <= parApex + M_PI && par > parApex) // 3/2*M_PI < par < M_PI/2 - dist = par - parApex; - else - { - if(par > parApex + M_PI) // 3/2*M_PI < par < 2*M_PI - dist = 2*M_PI - par + parApex; - else - dist = parApex - par; - } - } - else //neg Apex == 3/2*M_PI - { - if(par <= parApex && par >= M_PI/2) // M_PI/2 < par < 3/2*M_PI - dist = parApex - par; - else - { - if(par > parApex) // 3/2*M_PI < par < 2*M_PI - dist = par - parApex; - else - dist = par + M_PI/2; // 0 < par < M_PI/2 - } - } - } - return dist; -} - -//======================================================================= -//function : NearestApex -//purpose : -//======================================================================= - -gp_Pnt AIS::NearestApex(const gp_Elips & elips, - const gp_Pnt & pApex, - const gp_Pnt & nApex, - const Standard_Real fpara, - const Standard_Real lpara, - Standard_Boolean & IsInDomain) -{ - Standard_Real parP, parN; - gp_Pnt EndOfArrow(0.0,0.0,0.0); - IsInDomain = Standard_True; - parP = ElCLib::Parameter ( elips, pApex ); - if(InDomain(fpara, lpara, parP)) EndOfArrow = pApex; - else - { - parN = ElCLib::Parameter ( elips, nApex ); - if(InDomain(fpara, lpara, parN)) EndOfArrow = nApex; - else { - IsInDomain = Standard_False; - Standard_Real posd = Min(DistanceFromApex (elips,pApex, fpara), - DistanceFromApex (elips,pApex, lpara)); - Standard_Real negd = Min(DistanceFromApex (elips,nApex, fpara), - DistanceFromApex (elips,nApex, lpara)); - if( posd < negd ) - EndOfArrow = pApex; - else - EndOfArrow = nApex; - } - } - return EndOfArrow; -} - -//======================================================================= -//function : ComputeProjEdgePresentation -//purpose : -//======================================================================= - -void AIS::ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPresentation, - const Handle(Prs3d_Drawer)& aDrawer, - const TopoDS_Edge& anEdge, - const Handle(Geom_Curve)& ProjCurve, - const gp_Pnt& FirstP, - const gp_Pnt& LastP, - const Quantity_NameOfColor aColor, - const Standard_Real aWidth, - const Aspect_TypeOfLine aProjTOL, - const Aspect_TypeOfLine aCallTOL) -{ - if (!aDrawer->HasOwnWireAspect()){ - aDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));} - else { - // CLE - // const Handle(Prs3d_LineAspect)& li = aDrawer->WireAspect(); - Handle(Prs3d_LineAspect) li = aDrawer->WireAspect(); - // ENDCLE - li->SetColor(aColor); - li->SetTypeOfLine(aProjTOL); - li->SetWidth(aWidth); - } - - Standard_Real pf, pl; - TopLoc_Location loc; - Handle(Geom_Curve) curve; - Standard_Boolean isInfinite; - curve = BRep_Tool::Curve(anEdge,loc,pf,pl); - isInfinite = (Precision::IsInfinite(pf) || Precision::IsInfinite(pl)); - - TopoDS_Edge E; - - // Calculate presentation of the edge - if (ProjCurve->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - // CLE - // Handle(Geom_Line) gl (Handle(Geom_Line)::DownCast (ProjCurve)); - Handle(Geom_Line) gl = Handle(Geom_Line)::DownCast (ProjCurve); - // ENDCLE - if ( !isInfinite) { - pf = ElCLib::Parameter(gl->Lin(),FirstP); - pl = ElCLib::Parameter(gl->Lin(),LastP); - BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl); - E = MakEd.Edge(); - } - else { - BRepBuilderAPI_MakeEdge MakEd(gl->Lin()); - E = MakEd.Edge(); - } - } - else if (ProjCurve->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - // CLE - // Handle(Geom_Circle) gc (Handle(Geom_Circle)::DownCast (ProjCurve)); - Handle(Geom_Circle) gc = Handle(Geom_Circle)::DownCast (ProjCurve); - // ENDCLE - pf = ElCLib::Parameter(gc->Circ(),FirstP); - pl = ElCLib::Parameter(gc->Circ(),LastP); - BRepBuilderAPI_MakeEdge MakEd(gc->Circ(),pf, pl); - E = MakEd.Edge(); - } - StdPrs_WFShape::Add (aPresentation, E, aDrawer); - - //Calculate the presentation of line connections - aDrawer->WireAspect()->SetTypeOfLine(aCallTOL); - if (!isInfinite) { - gp_Pnt ppf(0.0,0.0,0.0), ppl(0.0,0.0,0.0); - ppf = BRep_Tool::Pnt( TopExp::FirstVertex(TopoDS::Edge(anEdge))); - ppl = BRep_Tool::Pnt( TopExp::LastVertex(TopoDS::Edge(anEdge))); - - // it is patch! - if (FirstP.SquareDistance (ppf) > SquareTolerance) - { - BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); - StdPrs_WFShape::Add (aPresentation, MakEd1.Edge(), aDrawer); - } - else - { - BRepBuilderAPI_MakeVertex MakVert1 (FirstP); - StdPrs_WFShape::Add (aPresentation, MakVert1.Vertex(), aDrawer); - } - if (LastP.SquareDistance (ppl) > SquareTolerance) - { - BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); - StdPrs_WFShape::Add (aPresentation, MakEd2.Edge(), aDrawer); - } - else - { - BRepBuilderAPI_MakeVertex MakVert2 (LastP); - StdPrs_WFShape::Add (aPresentation, MakVert2.Vertex(), aDrawer); - } -/* - BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); - StdPrs_WFShape::Add (aPresentation, MakEd1.Edge(), aDrawer); - BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); - StdPrs_WFShape::Add (aPresentation, MakEd2.Edge(), aDrawer); -*/ - } -} - -//======================================================================= -//function : ComputeProjVertexPresentation -//purpose : -//======================================================================= - -void AIS::ComputeProjVertexPresentation (const Handle( Prs3d_Presentation )& aPresentation, - const Handle( Prs3d_Drawer )& aDrawer, - const TopoDS_Vertex& aVertex, - const gp_Pnt& ProjPoint, - const Quantity_NameOfColor aColor, - const Standard_Real aWidth, - const Aspect_TypeOfMarker aProjTOM, - const Aspect_TypeOfLine aCallTOL) -{ - if (!aDrawer->HasOwnPointAspect()){ - aDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));} - else { - // CLE - // const Handle(Prs3d_PointAspect)& pa = aDrawer->PointAspect(); - Handle(Prs3d_PointAspect) pa = aDrawer->PointAspect(); - // ENDCLE - pa->SetColor(aColor); - pa->SetTypeOfMarker(aProjTOM); - } - - // calculate the projection - StdPrs_Point::Add(aPresentation, new Geom_CartesianPoint(ProjPoint), aDrawer); - - if (!aDrawer->HasOwnWireAspect()){ - aDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));} - else { - // CLE - // const Handle(Prs3d_LineAspect)& li = aDrawer->WireAspect(); - Handle(Prs3d_LineAspect) li = aDrawer->WireAspect(); - // ENDCLE - li->SetColor(aColor); - li->SetTypeOfLine(aCallTOL); - li->SetWidth(aWidth); - } - - // If the points are not mixed... - if (!ProjPoint.IsEqual (BRep_Tool::Pnt (aVertex), Precision::Confusion())) - { - // calculate the lines of recall - BRepBuilderAPI_MakeEdge MakEd (ProjPoint, BRep_Tool::Pnt (aVertex)); - StdPrs_WFShape::Add (aPresentation, MakEd.Edge(), aDrawer); - } -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_DiameterDimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_DiameterDimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_DiameterDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_DiameterDimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,386 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jacques MINOT/Odile Olivier/Sergey ZARITCHNY -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - - -IMPLEMENT_STANDARD_RTTIEXT(AIS_DiameterDimension,AIS_Dimension) - -namespace -{ - static const Standard_ExtCharacter THE_DIAMETER_SYMBOL (0x00D8); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_DiameterDimension::AIS_DiameterDimension (const gp_Circ& theCircle) -: AIS_Dimension (AIS_KOD_DIAMETER) -{ - SetMeasuredGeometry (theCircle); - SetSpecialSymbol (THE_DIAMETER_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_DiameterDimension::AIS_DiameterDimension (const gp_Circ& theCircle, - const gp_Pln& thePlane) -: AIS_Dimension (AIS_KOD_DIAMETER) -{ - SetCustomPlane (thePlane); - SetMeasuredGeometry (theCircle); - SetSpecialSymbol (THE_DIAMETER_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_DiameterDimension::AIS_DiameterDimension (const TopoDS_Shape& theShape) -: AIS_Dimension (AIS_KOD_DIAMETER) -{ - SetMeasuredGeometry (theShape); - SetSpecialSymbol (THE_DIAMETER_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_DiameterDimension::AIS_DiameterDimension (const TopoDS_Shape& theShape, - const gp_Pln& thePlane) -: AIS_Dimension (AIS_KOD_DIAMETER) -{ - SetCustomPlane (thePlane); - SetMeasuredGeometry (theShape); - SetSpecialSymbol (THE_DIAMETER_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : AnchorPoint -//purpose : -//======================================================================= -gp_Pnt AIS_DiameterDimension::AnchorPoint() -{ - if (!IsValid()) - { - return gp::Origin(); - } - - return myAnchorPoint; -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_DiameterDimension::SetMeasuredGeometry (const gp_Circ& theCircle) -{ - myCircle = theCircle; - myGeometryType = GeometryType_Edge; - myShape = BRepLib_MakeEdge (theCircle); - myAnchorPoint = gp::Origin(); - myIsGeometryValid = IsValidCircle (myCircle); - - if (myIsGeometryValid && myIsPlaneCustom) - { - ComputeAnchorPoint(); - } - else if (!myIsPlaneCustom) - { - ComputePlane(); - myAnchorPoint = ElCLib::Value (0.0, myCircle); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_DiameterDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape) -{ - gp_Pnt aDummyPnt (gp::Origin()); - Standard_Boolean isClosed = Standard_False; - - myGeometryType = GeometryType_UndefShapes; - myShape = theShape; - myAnchorPoint = gp::Origin(); - myIsGeometryValid = InitCircularDimension (theShape, myCircle, aDummyPnt, isClosed) - && IsValidCircle (myCircle) - && isClosed; - - if (myIsGeometryValid && myIsPlaneCustom) - { - ComputeAnchorPoint(); - } - else if (!myIsPlaneCustom) - { - ComputePlane(); - myAnchorPoint = ElCLib::Value (0.0, myCircle); - } - - SetToUpdate(); -} - -//======================================================================= -//function : CheckPlane -//purpose : -//======================================================================= -Standard_Boolean AIS_DiameterDimension::CheckPlane (const gp_Pln& thePlane) const -{ - // Check if the circle center point belongs to plane. - if (!thePlane.Contains (myCircle.Location(), Precision::Confusion())) - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputePlane -//purpose : -//======================================================================= -void AIS_DiameterDimension::ComputePlane() -{ - if (!myIsGeometryValid) - { - return; - } - - myPlane = gp_Pln (gp_Ax3 (myCircle.Position())); -} - -//======================================================================= -//function : ComputeAnchorPoint -//purpose : -//======================================================================= -void AIS_DiameterDimension::ComputeAnchorPoint() -{ - // Anchor point is an intersection of dimension plane and circle. - Handle(Geom_Circle) aCircle = new Geom_Circle (myCircle); - Handle(Geom_Plane) aPlane = new Geom_Plane (myPlane); - GeomAPI_IntCS anIntersector (aCircle, aPlane); - if (!anIntersector.IsDone()) - { - myIsGeometryValid = Standard_False; - return; - } - - // The circle lays on the plane. - if (anIntersector.NbPoints() != 2) - { - myAnchorPoint = ElCLib::Value (0.0, myCircle); - myIsGeometryValid = Standard_True; - return; - } - - gp_Pnt aFirstPoint = anIntersector.Point (1); - gp_Pnt aSecondPoint = anIntersector.Point (2); - - // Choose one of two intersection points that stands with - // positive direction of flyout. - // An anchor point is supposed to be the left attachment point. - gp_Dir aFirstDir = gce_MakeDir (aFirstPoint, myCircle.Location()); - gp_Dir aDir = myPlane.Axis().Direction() ^ aFirstDir; - myAnchorPoint = (gp_Vec (aDir) * gp_Vec(myCircle.Position().Direction()) > 0.0) - ? aFirstPoint - : aSecondPoint; - -} - -//======================================================================= -//function : GetModelUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_DiameterDimension::GetModelUnits() const -{ - return myDrawer->DimLengthModelUnits(); -} - -//======================================================================= -//function : GetDisplayUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_DiameterDimension::GetDisplayUnits() const -{ - return myDrawer->DimLengthDisplayUnits(); -} - -//======================================================================= -//function : SetModelUnits -//purpose : -//======================================================================= -void AIS_DiameterDimension::SetModelUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthModelUnits (theUnits); -} - -//======================================================================= -//function : SetDisplayUnits -//purpose : -//======================================================================= -void AIS_DiameterDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthDisplayUnits (theUnits); -} - -//======================================================================= -//function : ComputeValue -//purpose : -//======================================================================= -Standard_Real AIS_DiameterDimension::ComputeValue() const -{ - if (!IsValid()) - { - return 0.0; - } - - return myCircle.Radius() * 2.0; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_DiameterDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) -{ - mySelectionGeom.Clear (theMode); - - if (!IsValid()) - { - return; - } - - gp_Pnt aFirstPnt (gp::Origin()); - gp_Pnt aSecondPnt (gp::Origin()); - ComputeSidePoints (myCircle, aFirstPnt, aSecondPnt); - - DrawLinearDimension (thePresentation, theMode, aFirstPnt, aSecondPnt); -} - -//======================================================================= -//function : ComputeFlyoutSelection -//purpose : -//======================================================================= -void AIS_DiameterDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theEntityOwner) -{ - if (!IsValid()) - { - return; - } - - gp_Pnt aFirstPnt (gp::Origin()); - gp_Pnt aSecondPnt (gp::Origin()); - ComputeSidePoints (myCircle, aFirstPnt, aSecondPnt); - - ComputeLinearFlyouts (theSelection, theEntityOwner, aFirstPnt, aSecondPnt); -} - -//======================================================================= -//function : ComputeSidePoints -//purpose : -//======================================================================= -void AIS_DiameterDimension::ComputeSidePoints (const gp_Circ& theCircle, - gp_Pnt& theFirstPnt, - gp_Pnt& theSecondPnt) -{ - theFirstPnt = AnchorPoint(); - - gp_Vec aRadiusVector (theCircle.Location(), theFirstPnt); - theSecondPnt = theCircle.Location().Translated (-aRadiusVector); -} - -//======================================================================= -//function : IsValidCircle -//purpose : -//======================================================================= -Standard_Boolean AIS_DiameterDimension::IsValidCircle (const gp_Circ& theCircle) const -{ - return (theCircle.Radius() * 2.0) > Precision::Confusion(); -} - -//======================================================================= -//function : IsValidAnchor -//purpose : -//======================================================================= -Standard_Boolean AIS_DiameterDimension::IsValidAnchor (const gp_Circ& theCircle, - const gp_Pnt& theAnchor) const -{ - gp_Pln aCirclePlane (theCircle.Location(), theCircle.Axis().Direction()); - Standard_Real anAnchorDist = theAnchor.Distance (theCircle.Location()); - Standard_Real aRadius = myCircle.Radius(); - - return Abs (anAnchorDist - aRadius) > Precision::Confusion() - && aCirclePlane.Contains (theAnchor, Precision::Confusion()); -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -const gp_Pnt AIS_DiameterDimension::GetTextPosition() const -{ - if (IsTextPositionCustom()) - { - return myFixedTextPosition; - } - - // Counts text position according to the dimension parameters - return GetTextPositionForLinear (myAnchorPoint, myCircle.Location()); -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -void AIS_DiameterDimension::SetTextPosition (const gp_Pnt& theTextPos) -{ - if (!IsValid()) - { - return; - } - - myIsTextPositionFixed = Standard_True; - myFixedTextPosition = theTextPos; - - SetToUpdate(); -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_DiameterDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_DiameterDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_DiameterDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_DiameterDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,5 +1,4 @@ -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -12,174 +11,12 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #ifndef _AIS_DiameterDimension_HeaderFile #define _AIS_DiameterDimension_HeaderFile -#include -#include -#include -#include -#include -#include -#include - -class AIS_DiameterDimension; -DEFINE_STANDARD_HANDLE (AIS_DiameterDimension, AIS_Dimension) - -//! Diameter dimension. Can be constructued: -//! - On generic circle. -//! - On generic circle with user-defined anchor point on that circle -//! (dimension plane is oriented to follow the anchor point). -//! - On generic circle in the specified plane. -//! - On generic shape containing geometry that can be measured -//! by diameter dimension: circle wire, circular face, etc. -//! The anchor point is the location of the left attachement point of -//! dimension on the circle. -//! The anchor point computation is processed after dimension plane setting -//! so that positive flyout direction stands with normal of the circle and -//! the normal of the plane. -//! If the plane is user-defined the anchor point was computed as intersection -//! of the plane and the basis circle. Among two intersection points -//! the one is selected so that positive flyout direction vector and -//! the circle normal on the one side form the circle plane. -//! (corner between positive flyout directio nand the circle normal is acute.) -//! If the plane is computed automatically (by default it is the circle plane), -//! the anchor point is the zero parameter point of the circle. -//! -//! The dimension is considered as invalid if the user-defined plane -//! does not include th enachor point and th ecircle center, -//! if the diameter of the circle is less than Precision::Confusion(). -//! In case if the dimension is built on the arbitrary shape, it can be considered -//! as invalid if the shape does not contain circle geometry. -//! -class AIS_DiameterDimension : public AIS_Dimension -{ -public: - - //! Construct diameter dimension for the circle. - //! @param theCircle [in] the circle to measure. - Standard_EXPORT AIS_DiameterDimension (const gp_Circ& theCircle); - - //! Construct diameter dimension for the circle and orient it correspondingly - //! to the passed plane. - //! @param theCircle [in] the circle to measure. - //! @param thePlane [in] the plane defining preferred orientation - //! for dimension. - Standard_EXPORT AIS_DiameterDimension (const gp_Circ& theCircle, - const gp_Pln& thePlane); - - //! Construct diameter on the passed shape, if applicable. - //! @param theShape [in] the shape to measure. - Standard_EXPORT AIS_DiameterDimension (const TopoDS_Shape& theShape); - - //! Construct diameter on the passed shape, if applicable - and - //! define the preferred plane to orient the dimension. - //! @param theShape [in] the shape to measure. - //! @param thePlane [in] the plane defining preferred orientation - //! for dimension. - Standard_EXPORT AIS_DiameterDimension (const TopoDS_Shape& theShape, - const gp_Pln& thePlane); - -public: - - //! @return measured geometry circle. - const gp_Circ& Circle() const - { - return myCircle; - } - - //! @return anchor point on circle for diameter dimension. - Standard_EXPORT gp_Pnt AnchorPoint(); - - //! @return the measured shape. - const TopoDS_Shape& Shape() const - { - return myShape; - } - -public: - - //! Measure diameter of the circle. - //! The actual dimension plane is used for determining anchor points - //! on the circle to attach the dimension lines to. - //! The dimension will become invalid if the diameter of the circle - //! is less than Precision::Confusion(). - //! @param theCircle [in] the circle to measure. - Standard_EXPORT void SetMeasuredGeometry (const gp_Circ& theCircle); - - //! Measure diameter on the passed shape, if applicable. - //! The dimension will become invalid if the passed shape is not - //! measurable or if measured diameter value is less than Precision::Confusion(). - //! @param theShape [in] the shape to measure. - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Shape& theShape); - - //! @return the display units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; - - //! @return the model units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; - - Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; - - Standard_EXPORT virtual const gp_Pnt GetTextPosition() const Standard_OVERRIDE; - -public: - - DEFINE_STANDARD_RTTIEXT(AIS_DiameterDimension,AIS_Dimension) - -protected: - - //! Override this method to change logic of anchor point computation. - //! Computes anchor point. Its computation is based on the current - //! dimension plane. Therfore, anchor point is an intersection of plane - //! and circle. - //! ATTENTION! - //! 1) The plane should be set or computed before. - //! 2) The plane should inclide th ecircle center to be valid. - Standard_EXPORT virtual void ComputeAnchorPoint(); - - Standard_EXPORT virtual void ComputePlane(); - - //! Checks if the center of the circle is on the plane. - Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode = 0) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theEntityOwner) Standard_OVERRIDE; - -protected: - - //! Compute points on the circle sides for the dimension plane. - //! Program error exception is raised if the dimension plane "x" direction - //! is orthogonal to plane (the "impossible" case). The passed dimension plane - //! is the one specially computed to locate dimension presentation in circle. - //! @param theCircle [in] the circle. - //! @param theFirstPnt [out] the first point. - //! @param theSecondPnt [out] the second point. - Standard_EXPORT void ComputeSidePoints (const gp_Circ& theCircle, - gp_Pnt& theFirstPnt, - gp_Pnt& theSecondPnt); - - Standard_EXPORT Standard_Boolean IsValidCircle (const gp_Circ& theCircle) const; - - Standard_EXPORT Standard_Boolean IsValidAnchor (const gp_Circ& theCircle, - const gp_Pnt& thePnt) const; - -private: +#include - gp_Circ myCircle; - gp_Pnt myAnchorPoint; - TopoDS_Shape myShape; -}; +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_DiameterDimension AIS_DiameterDimension; #endif // _AIS_DiameterDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Dimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Dimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Dimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Dimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,1704 +0,0 @@ -// Created on: 2013-11-11 -// Created by: Anastasia BORISOVA -// Copyright (c) 2013-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -IMPLEMENT_STANDARD_RTTIEXT(AIS_Dimension,AIS_InteractiveObject) - -namespace -{ - // default text strings - static const TCollection_ExtendedString THE_EMPTY_LABEL; - static const TCollection_AsciiString THE_UNDEFINED_UNITS; - - // default text margin and resolution - static const Standard_Real THE_3D_TEXT_MARGIN = 0.1; - static const unsigned int THE_2D_TEXT_RESOLUTION = 72; - - // default selection priorities - static const Standard_Integer THE_NEUTRAL_SEL_PRIORITY = 5; - static const Standard_Integer THE_LOCAL_SEL_PRIORITY = 6; -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_Dimension::AIS_Dimension (const AIS_KindOfDimension theType) -: AIS_InteractiveObject (), - mySelToleranceForText2d(0.0), - myValueType (ValueType_Computed), - myCustomValue (0.0), - myCustomStringValue (), - myIsTextPositionFixed (Standard_False), - mySpecialSymbol (' '), - myDisplaySpecialSymbol (AIS_DSS_No), - myGeometryType (GeometryType_UndefShapes), - myIsPlaneCustom (Standard_False), - myFlyout (0.0), - myIsGeometryValid (Standard_False), - myKindOfDimension (theType) -{ -} - -//======================================================================= -//function : SetCustomValue -//purpose : -//======================================================================= -void AIS_Dimension::SetCustomValue (const Standard_Real theValue) -{ - if (myValueType == ValueType_CustomReal && myCustomValue == theValue) - { - return; - } - - myValueType = ValueType_CustomReal; - myCustomValue = theValue; - - SetToUpdate(); -} - -//======================================================================= -//function : SetCustomValue -//purpose : -//======================================================================= -void AIS_Dimension::SetCustomValue (const TCollection_ExtendedString& theValue) -{ - if (myValueType == ValueType_CustomText && myCustomStringValue == theValue) - { - return; - } - - myValueType = ValueType_CustomText; - myCustomStringValue = theValue; - - SetToUpdate(); -} - -//======================================================================= -//function : GetCustomValue -//purpose : -//======================================================================= -const TCollection_ExtendedString& AIS_Dimension::GetCustomValue () const -{ - return myCustomStringValue; -} - -//======================================================================= -//function : GetPlane -//purpose : -//======================================================================= -const gp_Pln& AIS_Dimension::GetPlane() const -{ - return myPlane; -} - -//======================================================================= -//function : SetUserPlane -//purpose : -//======================================================================= -void AIS_Dimension::SetCustomPlane (const gp_Pln& thePlane) -{ - myPlane = thePlane; - myIsPlaneCustom = Standard_True; - - // Disable fixed (custom) text position - UnsetFixedTextPosition(); - - // Check validity if geometry has been set already. - if (IsValid()) - { - SetToUpdate(); - } -} - -//======================================================================= -//function : SetDimensionAspect -//purpose : -//======================================================================= -void AIS_Dimension::SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theDimensionAspect) -{ - myDrawer->SetDimensionAspect (theDimensionAspect); - - SetToUpdate(); -} - -//======================================================================= -//function : SetDisplaySpecialSymbol -//purpose : -//======================================================================= -void AIS_Dimension::SetDisplaySpecialSymbol (const AIS_DisplaySpecialSymbol theDisplaySpecSymbol) -{ - if (myDisplaySpecialSymbol == theDisplaySpecSymbol) - { - return; - } - - myDisplaySpecialSymbol = theDisplaySpecSymbol; - - SetToUpdate(); -} - -//======================================================================= -//function : SetSpecialSymbol -//purpose : -//======================================================================= -void AIS_Dimension::SetSpecialSymbol (const Standard_ExtCharacter theSpecialSymbol) -{ - if (mySpecialSymbol == theSpecialSymbol) - { - return; - } - - mySpecialSymbol = theSpecialSymbol; - - SetToUpdate(); -} - -//======================================================================= -//function : SetSelToleranceForText2d -//purpose : -//======================================================================= -void AIS_Dimension::SetSelToleranceForText2d (const Standard_Real theTol) -{ - if (mySelToleranceForText2d == theTol) - { - return; - } - - mySelToleranceForText2d = theTol; - - SetToUpdate(); -} - -//======================================================================= -//function : SetFlyout -//purpose : -//======================================================================= -void AIS_Dimension::SetFlyout (const Standard_Real theFlyout) -{ - if (myFlyout == theFlyout) - { - return; - } - - myFlyout = theFlyout; - - // Disable fixed text position - UnsetFixedTextPosition(); - - SetToUpdate(); -} - -//======================================================================= -//function : GetDisplayUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_Dimension::GetDisplayUnits() const -{ - return THE_UNDEFINED_UNITS; -} - -//======================================================================= -//function : GetModelUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_Dimension::GetModelUnits() const -{ - return THE_UNDEFINED_UNITS; -} - -//======================================================================= -//function : ValueToDisplayUnits -//purpose : -//======================================================================= -Standard_Real AIS_Dimension::ValueToDisplayUnits() const -{ - return UnitsAPI::AnyToAny (GetValue(), - GetModelUnits().ToCString(), - GetDisplayUnits().ToCString()); -} - -//======================================================================= -//function : GetValueString -//purpose : -//======================================================================= -TCollection_ExtendedString AIS_Dimension::GetValueString (Standard_Real& theWidth) const -{ - TCollection_ExtendedString aValueStr; - if (myValueType == ValueType_CustomText) - { - aValueStr = myCustomStringValue; - } - else - { - // format value string using "sprintf" - TCollection_AsciiString aFormatStr = myDrawer->DimensionAspect()->ValueStringFormat(); - - char aFmtBuffer[256]; - sprintf (aFmtBuffer, aFormatStr.ToCString(), ValueToDisplayUnits()); - aValueStr = TCollection_ExtendedString (aFmtBuffer); - } - - // add units to values string - if (myDrawer->DimensionAspect()->IsUnitsDisplayed()) - { - aValueStr += " "; - aValueStr += TCollection_ExtendedString (GetDisplayUnits()); - } - - switch (myDisplaySpecialSymbol) - { - case AIS_DSS_Before : aValueStr.Insert (1, mySpecialSymbol); break; - case AIS_DSS_After : aValueStr.Insert (aValueStr.Length() + 1, mySpecialSymbol); break; - case AIS_DSS_No : break; - } - - // Get text style parameters - Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect(); - NCollection_Utf8String anUTFString (aValueStr.ToExtString()); - - theWidth = 0.0; - - if (myDrawer->DimensionAspect()->IsText3d()) - { - // text width produced by BRepFont - Font_BRepFont aFont; - if (aFont.FindAndInit (aTextAspect->Aspect()->Font(), aTextAspect->Aspect()->GetTextFontAspect(), aTextAspect->Height(), Font_StrictLevel_Any)) - { - for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) - { - Standard_Utf32Char aCurrChar = *anIter; - Standard_Utf32Char aNextChar = *(++anIter); - theWidth += aFont.AdvanceX (aCurrChar, aNextChar); - } - } - } - else - { - // Text width for 1:1 scale 2D case - Font_FTFontParams aFontParams; - aFontParams.PointSize = (unsigned int )aTextAspect->Height(); - aFontParams.Resolution = THE_2D_TEXT_RESOLUTION; - if (Handle(Font_FTFont) aFont = Font_FTFont::FindAndCreate (aTextAspect->Aspect()->Font(), aTextAspect->Aspect()->GetTextFontAspect(), aFontParams, Font_StrictLevel_Any)) - { - for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) - { - Standard_Utf32Char aCurrChar = *anIter; - Standard_Utf32Char aNextChar = *(++anIter); - theWidth += (Standard_Real) aFont->AdvanceX (aCurrChar, aNextChar); - } - } - } - - return aValueStr; -} - -//======================================================================= -//function : DrawArrow -//purpose : -//======================================================================= -void AIS_Dimension::DrawArrow (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theLocation, - const gp_Dir& theDirection) -{ - Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePresentation); - - Standard_Real aLength = myDrawer->DimensionAspect()->ArrowAspect()->Length(); - Standard_Real anAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle(); - - if (myDrawer->DimensionAspect()->IsArrows3d()) - { - Prs3d_Arrow::Draw (aGroup, - theLocation, - theDirection, - anAngle, - aLength); - aGroup->SetGroupPrimitivesAspect (myDrawer->DimensionAspect()->ArrowAspect()->Aspect()); - } - else - { - gp_Pnt aLeftPoint (gp::Origin()); - gp_Pnt aRightPoint (gp::Origin()); - const gp_Dir& aPlane = GetPlane().Axis().Direction(); - - PointsForArrow (theLocation, theDirection, aPlane, aLength, anAngle, aLeftPoint, aRightPoint); - - Handle(Graphic3d_ArrayOfTriangles) anArrow = new Graphic3d_ArrayOfTriangles(3); - - anArrow->AddVertex (aLeftPoint); - anArrow->AddVertex (theLocation); - anArrow->AddVertex (aRightPoint); - - // Set aspect for arrow triangles - Graphic3d_PolygonOffset aPolOffset; - aPolOffset.Mode = Aspect_POM_Off; - aPolOffset.Factor = 0.0f; - aPolOffset.Units = 0.0f; - Handle(Graphic3d_AspectFillArea3d) aShadingStyle = new Graphic3d_AspectFillArea3d(); - aShadingStyle->SetInteriorStyle (Aspect_IS_SOLID); - aShadingStyle->SetColor (myDrawer->DimensionAspect()->ArrowAspect()->Aspect()->Color()); - aShadingStyle->SetShadingModel (Graphic3d_TOSM_UNLIT); - aShadingStyle->SetPolygonOffset (aPolOffset); - - aGroup->SetPrimitivesAspect (aShadingStyle); - aGroup->AddPrimitiveArray (anArrow); - } - - SelectionGeometry::Arrow& aSensitiveArrow = mySelectionGeom.NewArrow(); - aSensitiveArrow.Position = theLocation; - aSensitiveArrow.Direction = theDirection; -} - -//======================================================================= -//function : drawText -//purpose : -//======================================================================= -void AIS_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theTextPos, - const gp_Dir& theTextDir, - const TCollection_ExtendedString& theText, - const Standard_Integer theLabelPosition) -{ - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - if (myDrawer->DimensionAspect()->IsText3d()) - { - // getting font parameters - Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect(); - Quantity_Color aColor = aTextAspect->Aspect()->Color(); - Font_FontAspect aFontAspect = aTextAspect->Aspect()->GetTextFontAspect(); - Standard_Real aFontHeight = aTextAspect->Height(); - - // creating TopoDS_Shape for text - Font_BRepFont aFont (aTextAspect->Aspect()->Font().ToCString(), - aFontAspect, aFontHeight); - NCollection_Utf8String anUTFString (theText.ToExtString()); - - Font_BRepTextBuilder aBuilder; - TopoDS_Shape aTextShape = aBuilder.Perform (aFont, anUTFString); - - // compute text width with kerning - Standard_Real aTextWidth = 0.0; - Standard_Real aTextHeight = aFont.Ascender() + aFont.Descender(); - - for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) - { - Standard_Utf32Char aCurrChar = *anIter; - Standard_Utf32Char aNextChar = *(++anIter); - aTextWidth += aFont.AdvanceX (aCurrChar, aNextChar); - } - - // formating text position in XOY plane - Standard_Integer aHLabelPos = theLabelPosition & LabelPosition_HMask; - Standard_Integer aVLabelPos = theLabelPosition & LabelPosition_VMask; - - gp_Dir aTextDir (aHLabelPos == LabelPosition_Left ? -theTextDir : theTextDir); - - // compute label offsets - Standard_Real aMarginSize = aFontHeight * THE_3D_TEXT_MARGIN; - Standard_Real aCenterHOffset = 0.0; - Standard_Real aCenterVOffset = 0.0; - switch (aHLabelPos) - { - case LabelPosition_HCenter : aCenterHOffset = 0.0; break; - case LabelPosition_Right : aCenterHOffset = aTextWidth / 2.0 + aMarginSize; break; - case LabelPosition_Left : aCenterHOffset = -aTextWidth / 2.0 - aMarginSize; break; - } - switch (aVLabelPos) - { - case LabelPosition_VCenter : aCenterVOffset = 0.0; break; - case LabelPosition_Above : aCenterVOffset = aTextHeight / 2.0 + aMarginSize; break; - case LabelPosition_Below : aCenterVOffset = -aTextHeight / 2.0 - aMarginSize; break; - } - - // compute shape offset transformation - Standard_Real aShapeHOffset = aCenterHOffset - aTextWidth / 2.0; - Standard_Real aShapeVOffset = aCenterVOffset - aTextHeight / 2.0; - - // center shape in its bounding box (suppress border spacing added by FT_Font) - Bnd_Box aShapeBnd; - BRepBndLib::AddClose (aTextShape, aShapeBnd); - - Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; - aShapeBnd.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); - - Standard_Real aXalign = aTextWidth * 0.5 - (aXmax + aXmin) * 0.5; - Standard_Real aYalign = aTextHeight * 0.5 - (aYmax + aYmin) * 0.5; - aShapeHOffset += aXalign; - aShapeVOffset += aYalign; - - gp_Trsf anOffsetTrsf; - anOffsetTrsf.SetTranslation (gp::Origin(), gp_Pnt (aShapeHOffset, aShapeVOffset, 0.0)); - aTextShape.Move (anOffsetTrsf); - - // transform text to myWorkingPlane coordinate system - gp_Ax3 aTextCoordSystem (theTextPos, GetPlane().Axis().Direction(), aTextDir); - gp_Trsf aTextPlaneTrsf; - aTextPlaneTrsf.SetTransformation (aTextCoordSystem, gp_Ax3 (gp::XOY())); - aTextShape.Move (aTextPlaneTrsf); - - // set text flipping anchors - gp_Trsf aCenterOffsetTrsf; - gp_Pnt aCenterOffset (aCenterHOffset, aCenterVOffset, 0.0); - aCenterOffsetTrsf.SetTranslation (gp::Origin(), aCenterOffset); - - gp_Pnt aCenterOfLabel (gp::Origin()); - aCenterOfLabel.Transform (aCenterOffsetTrsf); - aCenterOfLabel.Transform (aTextPlaneTrsf); - - gp_Ax2 aFlippingAxes (aCenterOfLabel, GetPlane().Axis().Direction(), aTextDir); - aGroup->SetFlippingOptions (Standard_True, aFlippingAxes); - - // draw text - if (myDrawer->DimensionAspect()->IsTextShaded()) - { - // Setting text shading and color parameters - if (!myDrawer->HasOwnShadingAspect()) - { - myDrawer->SetShadingAspect (new Prs3d_ShadingAspect()); - } - - Graphic3d_MaterialAspect aShadeMat (Graphic3d_NOM_DEFAULT); - aShadeMat.SetAmbientColor (Quantity_NOC_BLACK); - aShadeMat.SetDiffuseColor (Quantity_NOC_BLACK); - aShadeMat.SetSpecularColor(Quantity_NOC_BLACK); - myDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aColor); - myDrawer->ShadingAspect()->Aspect()->SetBackInteriorColor (aColor); - myDrawer->ShadingAspect()->SetMaterial (aShadeMat); - - // drawing text - StdPrs_ShadedShape::Add (thePresentation, aTextShape, myDrawer); - } - else - { - // Setting color for text - if (!myDrawer->HasOwnFreeBoundaryAspect()) - { - myDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (aColor, Aspect_TOL_SOLID, 1.0)); - } - myDrawer->FreeBoundaryAspect()->Aspect()->SetColor (aColor); - - // drawing text - if (Handle(Graphic3d_ArrayOfPrimitives) anEdges = StdPrs_WFShape::AddAllEdges (aTextShape, myDrawer)) - { - aGroup->SetGroupPrimitivesAspect (myDrawer->FreeBoundaryAspect()->Aspect()); - aGroup->AddPrimitiveArray (anEdges); - } - } - Prs3d_Root::CurrentGroup (thePresentation)->SetFlippingOptions (Standard_False, gp_Ax2()); - - mySelectionGeom.TextPos = aCenterOfLabel; - mySelectionGeom.TextDir = aTextDir; - mySelectionGeom.TextWidth = aTextWidth + aMarginSize * 2.0; - mySelectionGeom.TextHeight = aTextHeight; - - return; - } - - // generate primitives for 2D text - myDrawer->DimensionAspect()->TextAspect()->Aspect()->SetDisplayType (Aspect_TODT_DIMENSION); - - Prs3d_Text::Draw (aGroup, - myDrawer->DimensionAspect()->TextAspect(), - theText, - theTextPos); - - mySelectionGeom.TextPos = theTextPos; - mySelectionGeom.TextDir = theTextDir; - mySelectionGeom.TextWidth = 0.0; - mySelectionGeom.TextHeight = 0.0; -} - -//======================================================================= -//function : DrawExtension -//purpose : -//======================================================================= -void AIS_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Real theExtensionSize, - const gp_Pnt& theExtensionStart, - const gp_Dir& theExtensionDir, - const TCollection_ExtendedString& theLabelString, - const Standard_Real theLabelWidth, - const Standard_Integer theMode, - const Standard_Integer theLabelPosition) -{ - // reference line for extension starting at its connection point - gp_Lin anExtensionLine (theExtensionStart, theExtensionDir); - - Standard_Boolean hasLabel = theLabelString.Length() > 0; - if (hasLabel && (theMode == ComputeMode_All || theMode == ComputeMode_Text)) - { - // compute text primitives; get its model width - gp_Pnt aTextPos = ElCLib::Value (theExtensionSize, anExtensionLine); - gp_Dir aTextDir = theExtensionDir; - - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - drawText (thePresentation, - aTextPos, - aTextDir, - theLabelString, - theLabelPosition); - } - - if (theMode != ComputeMode_All && theMode != ComputeMode_Line) - { - return; - } - - Standard_Boolean isShortLine = !myDrawer->DimensionAspect()->IsText3d() - || theLabelPosition & LabelPosition_VCenter; - - // compute graphical primitives and sensitives for extension line - gp_Pnt anExtStart = theExtensionStart; - gp_Pnt anExtEnd = !hasLabel || isShortLine - ? ElCLib::Value (theExtensionSize, anExtensionLine) - : ElCLib::Value (theExtensionSize + theLabelWidth, anExtensionLine); - - // add graphical primitives - Handle(Graphic3d_ArrayOfSegments) anExtPrimitive = new Graphic3d_ArrayOfSegments (2); - anExtPrimitive->AddVertex (anExtStart); - anExtPrimitive->AddVertex (anExtEnd); - - // add selection primitives - SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); - aSensitiveCurve.Append (anExtStart); - aSensitiveCurve.Append (anExtEnd); - - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) - { - aGroup->SetStencilTestOptions (Standard_True); - } - Handle(Graphic3d_AspectLine3d) aDimensionLineStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); - aGroup->SetPrimitivesAspect (aDimensionLineStyle); - aGroup->AddPrimitiveArray (anExtPrimitive); - if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) - { - aGroup->SetStencilTestOptions (Standard_False); - } -} - -//======================================================================= -//function : DrawLinearDimension -//purpose : -//======================================================================= -void AIS_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide) -{ - // do not build any dimension for equal points - if (theFirstPoint.IsEqual (theSecondPoint, Precision::Confusion())) - { - throw Standard_ProgramError("Can not build presentation for equal points."); - } - - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - // For extensions we need to know arrow size, text size and extension size: get it from aspect - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - // prepare label string and compute its geometrical width - Standard_Real aLabelWidth; - TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); - - // add margins to cut dimension lines for 3d text - if (aDimensionAspect->IsText3d()) - { - aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; - } - - // handle user-defined and automatic arrow placement - Standard_Boolean isArrowsExternal = Standard_False; - Standard_Integer aLabelPosition = LabelPosition_None; - - Prs3d_DimensionTextHorizontalPosition aHorisontalTextPos = aDimensionAspect->TextHorizontalPosition(); - if (IsTextPositionCustom()) - { - if (!AdjustParametersForLinear (myFixedTextPosition, theFirstPoint, theSecondPoint, - anExtensionSize, aHorisontalTextPos, myFlyout, myPlane, myIsPlaneCustom)) - { - throw Standard_ProgramError("Can not adjust plane to the custom label position."); - } - } - - FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide, aHorisontalTextPos, - aLabelPosition, isArrowsExternal); - - // compute dimension line points - gp_Pnt aLineBegPoint, aLineEndPoint; - ComputeFlyoutLinePoints (theFirstPoint, theSecondPoint, aLineBegPoint, aLineEndPoint); - gp_Lin aDimensionLine = gce_MakeLin (aLineBegPoint, aLineEndPoint); - - // compute arrows positions and directions - gp_Dir aFirstArrowDir = aDimensionLine.Direction().Reversed(); - gp_Dir aSecondArrowDir = aDimensionLine.Direction(); - gp_Dir aFirstExtensionDir = aDimensionLine.Direction().Reversed(); - gp_Dir aSecondExtensionDir = aDimensionLine.Direction(); - - gp_Pnt aFirstArrowBegin (0.0, 0.0, 0.0); - gp_Pnt aFirstArrowEnd (0.0, 0.0, 0.0); - gp_Pnt aSecondArrowBegin (0.0, 0.0, 0.0); - gp_Pnt aSecondArrowEnd (0.0, 0.0, 0.0); - - if (isArrowsExternal) - { - aFirstArrowDir.Reverse(); - aSecondArrowDir.Reverse(); - } - - aFirstArrowBegin = aLineBegPoint; - aSecondArrowBegin = aLineEndPoint; - aFirstArrowEnd = aLineBegPoint.Translated (-gp_Vec (aFirstArrowDir).Scaled (anArrowLength)); - aSecondArrowEnd = aLineEndPoint.Translated (-gp_Vec (aSecondArrowDir).Scaled (anArrowLength)); - - gp_Pnt aCenterLineBegin = isArrowsExternal - ? aLineBegPoint : aFirstArrowEnd; - - gp_Pnt aCenterLineEnd = isArrowsExternal || theIsOneSide - ? aLineEndPoint : aSecondArrowEnd; - - - switch (aLabelPosition & LabelPosition_HMask) - { - // ------------------------------------------------------------------------ // - // CENTER // - // -------------------------------------------------------------------------// - case LabelPosition_HCenter: - { - // add label on dimension or extension line to presentation - gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition - : (aCenterLineBegin.XYZ() + aCenterLineEnd.XYZ()) * 0.5; - gp_Dir aTextDir = aDimensionLine.Direction(); - - // add text primitives - if (theMode == ComputeMode_All || theMode == ComputeMode_Text) - { - thePresentation->NewGroup(); - drawText (thePresentation, - aTextPos, - aTextDir, - aLabelString, - aLabelPosition); - } - - // add dimension line primitives - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center - && aDimensionAspect->IsText3d(); - - Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (isLineBreak ? 4 : 2); - - // compute continuous or sectioned main line segments - if (isLineBreak) - { - Standard_Real aPTextPosition = ElCLib::Parameter (aDimensionLine, aTextPos); - gp_Pnt aSection1Beg = aCenterLineBegin; - gp_Pnt aSection1End = ElCLib::Value (aPTextPosition - (aLabelWidth * 0.5), aDimensionLine); - gp_Pnt aSection2Beg = ElCLib::Value (aPTextPosition + (aLabelWidth * 0.5), aDimensionLine); - gp_Pnt aSection2End = aCenterLineEnd; - - aPrimSegments->AddVertex (aSection1Beg); - aPrimSegments->AddVertex (aSection1End); - aPrimSegments->AddVertex (aSection2Beg); - aPrimSegments->AddVertex (aSection2End); - - SelectionGeometry::Curve& aLeftSensitiveCurve = mySelectionGeom.NewCurve(); - SelectionGeometry::Curve& aRightSensitiveCurve = mySelectionGeom.NewCurve(); - aLeftSensitiveCurve.Append (aSection1Beg); - aLeftSensitiveCurve.Append (aSection1End); - aRightSensitiveCurve.Append (aSection2Beg); - aRightSensitiveCurve.Append (aSection2End); - } - else - { - aPrimSegments->AddVertex (aCenterLineBegin); - aPrimSegments->AddVertex (aCenterLineEnd); - - SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); - aSensitiveCurve.Append (aCenterLineBegin); - aSensitiveCurve.Append (aCenterLineEnd); - } - - // set text label justification - Graphic3d_VerticalTextAlignment aTextJustificaton = Graphic3d_VTA_BOTTOM; - switch (aLabelPosition & LabelPosition_VMask) - { - case LabelPosition_Above : - case LabelPosition_VCenter : aTextJustificaton = Graphic3d_VTA_BOTTOM; break; - case LabelPosition_Below : aTextJustificaton = Graphic3d_VTA_TOP; break; - } - aDimensionAspect->TextAspect()->SetVerticalJustification (aTextJustificaton); - - // main dimension line, short extension - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All) - { - aGroup->SetStencilTestOptions (Standard_True); - } - aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); - aGroup->AddPrimitiveArray (aPrimSegments); - if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All) - { - aGroup->SetStencilTestOptions (Standard_False); - } - } - - // add arrows to presentation - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); - if (!theIsOneSide) - { - DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); - } - } - - if (!isArrowsExternal) - { - break; - } - - // add arrow extension lines to presentation - { - DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), - aFirstArrowEnd, aFirstExtensionDir, - THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); - if (!theIsOneSide) - { - DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), - aSecondArrowEnd, aSecondExtensionDir, - THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); - } - } - } - break; - } - // ------------------------------------------------------------------------ // - // LEFT // - // -------------------------------------------------------------------------// - - case LabelPosition_Left: - { - // add label on dimension or extension line to presentation - { - // Left extension with the text - DrawExtension (thePresentation, anExtensionSize, - isArrowsExternal - ? aFirstArrowEnd - : aFirstArrowBegin, - aFirstExtensionDir, - aLabelString, - aLabelWidth, - theMode, - aLabelPosition); - } - - // add dimension line primitives - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - // add central dimension line - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - - // add graphical primitives - Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2); - aPrimSegments->AddVertex (aCenterLineBegin); - aPrimSegments->AddVertex (aCenterLineEnd); - - aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); - aGroup->AddPrimitiveArray (aPrimSegments); - - // add selection primitives - SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); - aSensitiveCurve.Append (aCenterLineBegin); - aSensitiveCurve.Append (aCenterLineEnd); - } - - // add arrows to presentation - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); - if (!theIsOneSide) - { - DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); - } - } - - if (!isArrowsExternal || theIsOneSide) - { - break; - } - - // add extension lines for external arrows - { - DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), - aSecondArrowEnd, aSecondExtensionDir, - THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); - } - } - - break; - } - // ------------------------------------------------------------------------ // - // RIGHT // - // -------------------------------------------------------------------------// - - case LabelPosition_Right: - { - // add label on dimension or extension line to presentation - - // Right extension with text - DrawExtension (thePresentation, anExtensionSize, - isArrowsExternal - ? aSecondArrowEnd - : aSecondArrowBegin, - aSecondExtensionDir, - aLabelString, aLabelWidth, - theMode, - aLabelPosition); - - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - // add central dimension line - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - - // add graphical primitives - Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2); - aPrimSegments->AddVertex (aCenterLineBegin); - aPrimSegments->AddVertex (aCenterLineEnd); - aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); - aGroup->AddPrimitiveArray (aPrimSegments); - - // add selection primitives - SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); - aSensitiveCurve.Append (aCenterLineBegin); - aSensitiveCurve.Append (aCenterLineEnd); - } - - // add arrows to presentation - { - thePresentation->NewGroup(); - DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); - if (!theIsOneSide) - { - DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); - } - } - - if (!isArrowsExternal || theIsOneSide) - { - break; - } - - // add extension lines for external arrows - { - DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), - aFirstArrowEnd, aFirstExtensionDir, - THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); - } - } - - break; - } - } - - // add flyout lines to presentation - if (theMode == ComputeMode_All) - { - Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); - - Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments(4); - aPrimSegments->AddVertex (theFirstPoint); - aPrimSegments->AddVertex (aLineBegPoint); - - aPrimSegments->AddVertex (theSecondPoint); - aPrimSegments->AddVertex (aLineEndPoint); - - aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); - aGroup->AddPrimitiveArray (aPrimSegments); - } - - mySelectionGeom.IsComputed = Standard_True; -} - -//======================================================================= -//function : ComputeFlyoutLinePoints -//purpose : -//======================================================================= -void AIS_Dimension::ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, - gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) -{ - // compute dimension line points - gp_Ax1 aPlaneNormal = GetPlane().Axis(); - // compute flyout direction vector - gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); - gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; - // create lines for layouts - gp_Lin aLine1 (theFirstPoint, aFlyoutVector); - gp_Lin aLine2 (theSecondPoint, aFlyoutVector); - - // Get flyout end points - theLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); - theLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); -} - -//======================================================================= -//function : ComputeLinearFlyouts -//purpose : -//======================================================================= -void AIS_Dimension::ComputeLinearFlyouts (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theOwner, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint) -{ - // count flyout direction - gp_Ax1 aPlaneNormal = GetPlane().Axis(); - gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); - - // count a flyout direction vector. - gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; - - // create lines for layouts - gp_Lin aLine1 (theFirstPoint, aFlyoutVector); - gp_Lin aLine2 (theSecondPoint, aFlyoutVector); - - // get flyout end points - gp_Pnt aFlyoutEnd1 = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); - gp_Pnt aFlyoutEnd2 = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); - - // fill sensitive entity for flyouts - Handle(Select3D_SensitiveGroup) aSensitiveEntity = new Select3D_SensitiveGroup (theOwner); - aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, theFirstPoint, aFlyoutEnd1)); - aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, theSecondPoint, aFlyoutEnd2)); - theSelection->Add (aSensitiveEntity); -} - -//======================================================================= -//function : CircleFromPlanarFace -//purpose : if possible computes circle from planar face -//======================================================================= -Standard_Boolean AIS_Dimension::CircleFromPlanarFace (const TopoDS_Face& theFace, - Handle(Geom_Curve)& theCurve, - gp_Pnt& theFirstPoint, - gp_Pnt& theLastPoint) -{ - TopExp_Explorer anIt (theFace, TopAbs_EDGE); - for ( ; anIt.More(); anIt.Next()) - { - TopoDS_Edge aCurEdge = TopoDS::Edge (anIt.Current()); - if (AIS::ComputeGeometry (aCurEdge, theCurve, theFirstPoint, theLastPoint)) - { - if (theCurve->IsInstance (STANDARD_TYPE(Geom_Circle))) - { - return Standard_True; - } - } - } - return Standard_False; -} - -//======================================================================= -//function : CircleFromEdge -//purpose : if possible computes circle from edge -//======================================================================= -Standard_Boolean AIS_Dimension::CircleFromEdge (const TopoDS_Edge& theEdge, - gp_Circ& theCircle, - gp_Pnt& theFirstPoint, - gp_Pnt& theLastPoint) -{ - BRepAdaptor_Curve anAdaptedCurve (theEdge); - switch (anAdaptedCurve.GetType()) - { - case GeomAbs_Circle: - { - theCircle = anAdaptedCurve.Circle(); - break; - } - case GeomAbs_Ellipse: - { - gp_Elips anEll = anAdaptedCurve.Ellipse(); - if ((anEll.MinorRadius() - anEll.MajorRadius()) >= Precision::Confusion()) - { - return Standard_False; - } - theCircle = gp_Circ(anEll.Position(),anEll.MinorRadius()); - break; - } - case GeomAbs_Line: - case GeomAbs_Hyperbola: - case GeomAbs_Parabola: - case GeomAbs_BezierCurve: - case GeomAbs_BSplineCurve: - case GeomAbs_OtherCurve: - default: - return Standard_False; - } - - theFirstPoint = anAdaptedCurve.Value (anAdaptedCurve.FirstParameter()); - theLastPoint = anAdaptedCurve.Value (anAdaptedCurve.LastParameter()); - return Standard_True; -} - -//======================================================================= -//function : InitCircularDimension -//purpose : -//======================================================================= -Standard_Boolean AIS_Dimension::InitCircularDimension (const TopoDS_Shape& theShape, - gp_Circ& theCircle, - gp_Pnt& theMiddleArcPoint, - Standard_Boolean& theIsClosed) -{ - gp_Pln aPln; - Handle(Geom_Surface) aBasisSurf; - AIS_KindOfSurface aSurfType = AIS_KOS_OtherSurface; - gp_Pnt aFirstPoint, aLastPoint; - Standard_Real anOffset = 0.0; - Standard_Real aFirstParam = 0.0; - Standard_Real aLastParam = 0.0; - - // Discover circular geometry - switch (theShape.ShapeType()) - { - case TopAbs_FACE: - { - AIS::GetPlaneFromFace (TopoDS::Face (theShape), aPln, aBasisSurf, aSurfType, anOffset); - - if (aSurfType == AIS_KOS_Plane) - { - Handle(Geom_Curve) aCurve; - if (!CircleFromPlanarFace (TopoDS::Face (theShape), aCurve, aFirstPoint, aLastPoint)) - { - return Standard_False; - } - - theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); - } - else - { - gp_Pnt aCurPos; - BRepAdaptor_Surface aSurf1 (TopoDS::Face (theShape)); - Standard_Real aFirstU = aSurf1.FirstUParameter(); - Standard_Real aLastU = aSurf1.LastUParameter(); - Standard_Real aFirstV = aSurf1.FirstVParameter(); - Standard_Real aLastV = aSurf1.LastVParameter(); - Standard_Real aMidU = (aFirstU + aLastU) * 0.5; - Standard_Real aMidV = (aFirstV + aLastV) * 0.5; - aSurf1.D0 (aMidU, aMidV, aCurPos); - Handle (Adaptor3d_HCurve) aBasisCurve; - Standard_Boolean isExpectedType = Standard_False; - if (aSurfType == AIS_KOS_Cylinder) - { - isExpectedType = Standard_True; - } - else - { - if (aSurfType == AIS_KOS_Revolution) - { - aBasisCurve = aSurf1.BasisCurve(); - if (aBasisCurve->GetType() == GeomAbs_Line) - { - isExpectedType = Standard_True; - } - } - else if (aSurfType == AIS_KOS_Extrusion) - { - aBasisCurve = aSurf1.BasisCurve(); - if (aBasisCurve->GetType() == GeomAbs_Circle) - { - isExpectedType = Standard_True; - } - } - } - - if (!isExpectedType) - { - return Standard_False; - } - - Handle(Geom_Curve) aCurve = aBasisSurf->VIso(aMidV); - if (aCurve->DynamicType() == STANDARD_TYPE (Geom_Circle)) - { - theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); - } - else if (aCurve->DynamicType() == STANDARD_TYPE (Geom_TrimmedCurve)) - { - Handle(Geom_TrimmedCurve) aTrimmedCurve = Handle(Geom_TrimmedCurve)::DownCast (aCurve); - aFirstU = aTrimmedCurve->FirstParameter(); - aLastU = aTrimmedCurve->LastParameter(); - if (aTrimmedCurve->BasisCurve()->DynamicType() == STANDARD_TYPE (Geom_Circle)) - { - theCircle = Handle(Geom_Circle)::DownCast(aTrimmedCurve->BasisCurve())->Circ(); - } - } - else - { - // Compute a circle from 3 points on "aCurve" - gp_Pnt aP1, aP2; - aSurf1.D0 (aFirstU, aMidV, aP1); - aSurf1.D0 (aLastU, aMidV, aP2); - GC_MakeCircle aMkCirc (aP1, aCurPos, aP2); - theCircle = aMkCirc.Value()->Circ(); - } - - aFirstPoint = ElCLib::Value (aFirstU, theCircle); - aLastPoint = ElCLib::Value (aLastU, theCircle); - } - break; - } - case TopAbs_WIRE: - { - TopoDS_Edge anEdge; - TopExp_Explorer anIt (theShape, TopAbs_EDGE); - if (anIt.More()) - { - anEdge = TopoDS::Edge (anIt.Current()); - } - if (!AIS_Dimension::CircleFromEdge (anEdge, theCircle, aFirstPoint, aLastPoint)) - { - return Standard_False; - } - break; - } - case TopAbs_EDGE: - { - TopoDS_Edge anEdge = TopoDS::Edge (theShape); - if (!AIS_Dimension::CircleFromEdge (anEdge, theCircle, aFirstPoint, aLastPoint)) - { - return Standard_False; - } - break; - } - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: - case TopAbs_SOLID: - case TopAbs_SHELL: - case TopAbs_VERTEX: - case TopAbs_SHAPE: - default: - return Standard_False; - } - - theIsClosed = aFirstPoint.IsEqual (aLastPoint, Precision::Confusion()); - - gp_Pnt aCenter = theCircle.Location(); - - if (theIsClosed) // Circle - { - gp_Dir anXDir = theCircle.XAxis().Direction(); - theMiddleArcPoint = aCenter.Translated (gp_Vec (anXDir) * theCircle.Radius()); - } - else // Arc - { - aFirstParam = ElCLib::Parameter (theCircle, aFirstPoint); - aLastParam = ElCLib::Parameter (theCircle, aLastPoint); - if (aFirstParam > aLastParam) - { - aFirstParam -= 2.0 * M_PI; - } - - Standard_Real aParCurPos = (aFirstParam + aLastParam) * 0.5; - gp_Vec aVec = gp_Vec (aCenter, ElCLib::Value (aParCurPos, theCircle)).Normalized () * theCircle.Radius (); - theMiddleArcPoint = aCenter.Translated (aVec); - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_Dimension::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, - const Standard_Integer theMode) -{ - if (!mySelectionGeom.IsComputed) - { - return; - } - - AIS_DimensionSelectionMode aSelectionMode = (AIS_DimensionSelectionMode)theMode; - - // init appropriate entity owner - Handle(SelectMgr_EntityOwner) aSensitiveOwner; - - switch (aSelectionMode) - { - // neutral selection owner - case AIS_DSM_All : - aSensitiveOwner = new SelectMgr_EntityOwner (this, THE_NEUTRAL_SEL_PRIORITY); - break; - - // local selection owners - case AIS_DSM_Line : - case AIS_DSM_Text : - aSensitiveOwner = new AIS_DimensionOwner (this, aSelectionMode, THE_LOCAL_SEL_PRIORITY); - break; - } - - if (aSelectionMode == AIS_DSM_All || aSelectionMode == AIS_DSM_Line) - { - // sensitives for dimension line segments - Handle(Select3D_SensitiveGroup) aGroupOfSensitives = new Select3D_SensitiveGroup (aSensitiveOwner); - - SelectionGeometry::SeqOfCurves::Iterator aCurveIt (mySelectionGeom.DimensionLine); - for (; aCurveIt.More(); aCurveIt.Next()) - { - const SelectionGeometry::HCurve& aCurveData = aCurveIt.Value(); - - TColgp_Array1OfPnt aSensitivePnts (1, aCurveData->Length()); - for (Standard_Integer aPntIt = 1; aPntIt <= aCurveData->Length(); ++aPntIt) - { - aSensitivePnts.ChangeValue (aPntIt) = aCurveData->Value (aPntIt); - } - - aGroupOfSensitives->Add (new Select3D_SensitiveCurve (aSensitiveOwner, aSensitivePnts)); - } - - Standard_Real anArrowLength = myDrawer->DimensionAspect()->ArrowAspect()->Length(); - Standard_Real anArrowAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle(); - - // sensitives for arrows - SelectionGeometry::SeqOfArrows::Iterator anArrowIt (mySelectionGeom.Arrows); - for (; anArrowIt.More(); anArrowIt.Next()) - { - const SelectionGeometry::HArrow& anArrow = anArrowIt.Value(); - - gp_Pnt aSidePnt1 (gp::Origin()); - gp_Pnt aSidePnt2 (gp::Origin()); - const gp_Dir& aPlane = GetPlane().Axis().Direction(); - const gp_Pnt& aPeak = anArrow->Position; - const gp_Dir& aDir = anArrow->Direction; - - // compute points for arrow in plane - PointsForArrow (aPeak, aDir, aPlane, anArrowLength, anArrowAngle, aSidePnt1, aSidePnt2); - - aGroupOfSensitives->Add (new Select3D_SensitiveTriangle (aSensitiveOwner, aPeak, aSidePnt1, aSidePnt2)); - - if (!myDrawer->DimensionAspect()->IsArrows3d()) - { - continue; - } - - // compute points for orthogonal sensitive plane - gp_Dir anOrthoPlane = anArrow->Direction.Crossed (aPlane); - - PointsForArrow (aPeak, aDir, anOrthoPlane, anArrowLength, anArrowAngle, aSidePnt1, aSidePnt2); - - aGroupOfSensitives->Add (new Select3D_SensitiveTriangle (aSensitiveOwner, aPeak, aSidePnt1, aSidePnt2)); - } - - theSelection->Add (aGroupOfSensitives); - } - - // sensitives for text element - if (aSelectionMode == AIS_DSM_All || aSelectionMode == AIS_DSM_Text) - { - Handle(Select3D_SensitiveEntity) aTextSensitive; - - gp_Ax2 aTextAxes (mySelectionGeom.TextPos, - GetPlane().Axis().Direction(), - mySelectionGeom.TextDir); - - if (myDrawer->DimensionAspect()->IsText3d()) - { - // sensitive planar rectangle for text - Standard_Real aDx = mySelectionGeom.TextWidth * 0.5; - Standard_Real aDy = mySelectionGeom.TextHeight * 0.5; - - gp_Trsf aLabelPlane; - aLabelPlane.SetTransformation (aTextAxes, gp::XOY()); - - TColgp_Array1OfPnt aRectanglePoints(1, 4); - aRectanglePoints.ChangeValue(1) = gp_Pnt (-aDx, -aDy, 0.0).Transformed (aLabelPlane); - aRectanglePoints.ChangeValue(2) = gp_Pnt (-aDx, aDy, 0.0).Transformed (aLabelPlane); - aRectanglePoints.ChangeValue(3) = gp_Pnt ( aDx, aDy, 0.0).Transformed (aLabelPlane); - aRectanglePoints.ChangeValue(4) = gp_Pnt ( aDx, -aDy, 0.0).Transformed (aLabelPlane); - - Poly_Array1OfTriangle aTriangles(1, 2); - aTriangles.ChangeValue(1) = Poly_Triangle(1, 2, 3); - aTriangles.ChangeValue(2) = Poly_Triangle(1, 3, 4); - - Handle(Poly_Triangulation) aRectanglePoly = - new Poly_Triangulation(aRectanglePoints, aTriangles); - - aTextSensitive = - new Select3D_SensitiveTriangulation (aSensitiveOwner, aRectanglePoly, TopLoc_Location(), Standard_True); - } - else - { - gp_Circ aTextGeom (aTextAxes, mySelToleranceForText2d != 0.0 - ? mySelToleranceForText2d : 1.0); - - Handle(Geom_Circle) aSensGeom = new Geom_Circle (aTextGeom); - - aTextSensitive = new Select3D_SensitiveCircle (aSensitiveOwner, aSensGeom, Standard_True); - } - - theSelection->Add (aTextSensitive); - } - - // callback for flyout sensitive calculation - if (aSelectionMode == AIS_DSM_All) - { - ComputeFlyoutSelection (theSelection, aSensitiveOwner); - } -} - -//======================================================================= -//function : PointsForArrow -//purpose : -//======================================================================= -void AIS_Dimension::PointsForArrow (const gp_Pnt& thePeakPnt, - const gp_Dir& theDirection, - const gp_Dir& thePlane, - const Standard_Real theArrowLength, - const Standard_Real theArrowAngle, - gp_Pnt& theSidePnt1, - gp_Pnt& theSidePnt2) -{ - gp_Lin anArrowLin (thePeakPnt, theDirection.Reversed()); - gp_Pnt anArrowEnd = ElCLib::Value (theArrowLength, anArrowLin); - gp_Lin anEdgeLin (anArrowEnd, theDirection.Crossed (thePlane)); - - Standard_Real anEdgeLength = Tan (theArrowAngle) * theArrowLength; - - theSidePnt1 = ElCLib::Value ( anEdgeLength, anEdgeLin); - theSidePnt2 = ElCLib::Value (-anEdgeLength, anEdgeLin); -} - -//======================================================================= -//function : GetTextPositionForLinear -//purpose : -//======================================================================= -gp_Pnt AIS_Dimension::GetTextPositionForLinear (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide) const -{ - if (!IsValid()) - { - return gp::Origin(); - } - - gp_Pnt aTextPosition (gp::Origin()); - - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - // Get label alignment and arrow orientation. - Standard_Integer aLabelPosition = 0; - Standard_Boolean isArrowsExternal = Standard_False; - FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide, - aDimensionAspect->TextHorizontalPosition(), - aLabelPosition, isArrowsExternal); - - // Compute dimension line points. - gp_Dir aPlaneNormal = GetPlane().Axis().Direction(); - gp_Vec aTargetPointsVec (theFirstPoint, theSecondPoint); - - // Compute flyout direction vector - gp_Dir aFlyoutVector = aPlaneNormal ^ gp_Dir (aTargetPointsVec); - - // create lines for layouts - gp_Lin aLine1 (theFirstPoint, aFlyoutVector); - gp_Lin aLine2 (theSecondPoint, aFlyoutVector); - // Get flyout end points - gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); - gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); - - // Get text position. - switch (aLabelPosition & LabelPosition_HMask) - { - case LabelPosition_Left: - { - gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - - Standard_Real anOffset = isArrowsExternal - ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() - : anExtensionSize; - gp_Vec anExtensionVec = gp_Vec (aTargetPointsDir) * -anOffset; - aTextPosition = aLineEndPoint.Translated (anExtensionVec); - } - break; - case LabelPosition_Right: - { - gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); - Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); - - Standard_Real anOffset = isArrowsExternal - ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() - : anExtensionSize; - gp_Vec anExtensionVec = gp_Vec (aTargetPointsDir) * anOffset; - aTextPosition = aLineBegPoint.Translated (anExtensionVec); - } - break; - case LabelPosition_HCenter: - { - aTextPosition = (aLineBegPoint.XYZ() + aLineEndPoint.XYZ()) * 0.5; - } - break; - } - - return aTextPosition; -} - -//======================================================================= -//function : AdjustParametersForLinear -//purpose : -//======================================================================= -Standard_Boolean AIS_Dimension::AdjustParametersForLinear (const gp_Pnt& theTextPos, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - Standard_Real& theExtensionSize, - Prs3d_DimensionTextHorizontalPosition& theAlignment, - Standard_Real& theFlyout, - gp_Pln& thePlane, - Standard_Boolean& theIsPlaneOld) const -{ - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - - gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); - gp_Vec aTargetPointsVec (theFirstPoint, theSecondPoint); - - // Don't set new plane if the text position lies on the attachment points line. - gp_Lin aTargetPointsLin (theFirstPoint, aTargetPointsDir); - if (!aTargetPointsLin.Contains (theTextPos, Precision::Confusion())) - { - //Set new automatic plane. - thePlane = gce_MakePln (theTextPos, theFirstPoint, theSecondPoint); - theIsPlaneOld = Standard_False; - } - - // Compute flyout direction vector. - gp_Dir aPlaneNormal = GetPlane().Axis().Direction(); - gp_Dir aPositiveFlyout = aPlaneNormal ^ aTargetPointsDir; - - // Additional check of collinearity of the plane normal and attachment points vector. - if (aPlaneNormal.IsParallel (aTargetPointsDir, Precision::Angular())) - { - return Standard_False; - } - - // Set flyout. - gp_Vec aFirstToTextVec (theFirstPoint, theTextPos); - - Standard_Real aCos = aFirstToTextVec.Normalized() * gp_Vec (aTargetPointsDir); - - gp_Pnt aTextPosProj = theFirstPoint.Translated - (gp_Vec (aTargetPointsDir) * aFirstToTextVec.Magnitude() * aCos); - - // Compute flyout value and direction. - gp_Vec aFlyoutVector = gp_Vec (aTextPosProj, theTextPos); - - theFlyout = 0.0; - if (aFlyoutVector.Magnitude() > Precision::Confusion()) - { - theFlyout = gp_Dir (aFlyoutVector).IsOpposite (aPositiveFlyout, Precision::Angular()) - ? -aFlyoutVector.Magnitude() - : aFlyoutVector.Magnitude(); - } - - // Compute attach points (through which main dimension line passes). - gp_Pnt aFirstAttach = theFirstPoint.Translated (aFlyoutVector); - gp_Pnt aSecondAttach = theSecondPoint.Translated (aFlyoutVector); - - // Set horizontal text alignment. - if (aCos < 0.0) - { - theAlignment = Prs3d_DTHP_Left; - - Standard_Real aNewExtSize = theTextPos.Distance (aFirstAttach) - anArrowLength; - theExtensionSize = aNewExtSize < 0.0 ? 0.0 : aNewExtSize; - } - else if (aTextPosProj.Distance (theFirstPoint) > theFirstPoint.Distance (theSecondPoint)) - { - theAlignment = Prs3d_DTHP_Right; - - Standard_Real aNewExtSize = theTextPos.Distance (aSecondAttach) - anArrowLength; - theExtensionSize = aNewExtSize < 0.0 ? 0.0 : aNewExtSize; - } - else - { - theAlignment = Prs3d_DTHP_Center; - } - return Standard_True; -} - -//======================================================================= -//function : FitTextAlignmentForLinear -//purpose : -//======================================================================= -void AIS_Dimension::FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide, - const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, - Standard_Integer& theLabelPosition, - Standard_Boolean& theIsArrowsExternal) const -{ - theLabelPosition = LabelPosition_None; - theIsArrowsExternal = Standard_False; - - // Compute dimension line points - gp_Ax1 aPlaneNormal = GetPlane().Axis(); - gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); - - // compute flyout direction vector - gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; - - // create lines for layouts - gp_Lin aLine1 (theFirstPoint, aFlyoutVector); - gp_Lin aLine2 (theSecondPoint, aFlyoutVector); - - // Get flyout end points - gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); - gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); - - Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); - - // For extensions we need to know arrow size, text size and extension size: get it from aspect - Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); - - // prepare label string and compute its geometrical width - Standard_Real aLabelWidth; - TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); - - // Add margins to cut dimension lines for 3d text - if (aDimensionAspect->IsText3d()) - { - aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; - } - - // Handle user-defined and automatic arrow placement - switch (aDimensionAspect->ArrowOrientation()) - { - case Prs3d_DAO_External: theIsArrowsExternal = true; break; - case Prs3d_DAO_Internal: theIsArrowsExternal = false; break; - case Prs3d_DAO_Fit: - { - // Add margin to ensure a small tail between text and arrow - Standard_Real anArrowMargin = aDimensionAspect->IsText3d() - ? aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN - : 0.0; - - Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint); - Standard_Real anArrowsWidth = theIsOneSide - ? anArrowLength + anArrowMargin - : (anArrowLength + anArrowMargin) * 2.0; - - theIsArrowsExternal = aDimensionWidth < aLabelWidth + anArrowsWidth; - break; - } - } - - // Handle user-defined and automatic text placement - switch (theHorizontalTextPos) - { - case Prs3d_DTHP_Left : theLabelPosition |= LabelPosition_Left; break; - case Prs3d_DTHP_Right : theLabelPosition |= LabelPosition_Right; break; - case Prs3d_DTHP_Center: theLabelPosition |= LabelPosition_HCenter; break; - case Prs3d_DTHP_Fit: - { - Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint); - Standard_Real anArrowsWidth = theIsOneSide ? anArrowLength : 2.0 * anArrowLength; - Standard_Real aContentWidth = theIsArrowsExternal ? aLabelWidth : aLabelWidth + anArrowsWidth; - - theLabelPosition |= aDimensionWidth < aContentWidth ? LabelPosition_Left : LabelPosition_HCenter; - break; - } - } - - // Handle vertical text placement options - switch (aDimensionAspect->TextVerticalPosition()) - { - case Prs3d_DTVP_Above : theLabelPosition |= LabelPosition_Above; break; - case Prs3d_DTVP_Below : theLabelPosition |= LabelPosition_Below; break; - case Prs3d_DTVP_Center : theLabelPosition |= LabelPosition_VCenter; break; - } -} - -//======================================================================= -//function : UnsetFixedTextPosition -//purpose : -//======================================================================= -void AIS_Dimension::UnsetFixedTextPosition() -{ - myIsTextPositionFixed = Standard_False; - myFixedTextPosition = gp::Origin(); -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Dimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Dimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Dimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Dimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,6 +1,4 @@ -// Created on: 2013-11-11 -// Created by: Anastasia BORISOVA -// Copyright (c) 2013-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -16,696 +14,9 @@ #ifndef _AIS_Dimension_HeaderFile #define _AIS_Dimension_HeaderFile -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include -class AIS_Dimension; -DEFINE_STANDARD_HANDLE(AIS_Dimension, AIS_InteractiveObject) - -//! AIS_Dimension is a base class for 2D presentations of linear (length, diameter, radius) -//! and angular dimensions. -//! -//! The dimensions provide measurement of quantities, such as lengths or plane angles. -//! The measurement of dimension "value" is done in model space "as is". -//! These "value" are said to be represented in "model units", which can be specified by user. -//! During the display the measured value converted from "model units" to "display units". -//! The display and model units are stored in common Prs3d_Drawer (drawer of the context) -//! to share it between all dimensions. -//! The specified by user units are stored in the dimension's drawer. -//! -//! As a drawing, the dimension is composed from the following components: -//! - Attachment (binding) points. The points where the dimension lines attaches to, for -//! length dimensions the distances are measured between these points. -//! - Main dimension line. The which extends from the attachment points in "up" direction, -//! and which contains text label on it with value string. -//! - Flyouts. The lines connecting the attachment points with main dimension line. -//! - Extension. The lines used to extend the main dimension line in the cases when text -//! or arrows do not fit into the main dimension line due to their size. -//! - Arrows. -//! -//!
-//!  Linear dimensions:
-//!
-//!  extension
-//!   line                                     arrow
-//!       -->|------- main dimension line -------|<--
-//!          |                                   |
-//!          |flyout                       flyout|
-//!          |                                   |
-//!          +-----------------------------------+
-//! attachment                                attachment
-//!  point                                       point
-//!
-//!  Angular dimensions:
-//!
-//!                  extension
-//!                     line
-//!                        -->|+++++
-//!                     arrow |     +++
-//!                           |        90(deg) - main dimension line
-//!                    flyout |         +++
-//!                           |           +
-//!                           o---flyout---
-//!                         center         ^ 
-//!                         point          | extension
-//!                                          line
-//! 
-//! -//! Being a 2D drawings, the dimensions are created on imaginary plane, called "dimension plane", -//! which can be thought of as reference system of axes (X,Y,N) for constructing the presentation. -//! -//! The role of axes of the dimension plane is to guide you through the encapsualted automations -//! of presentation building to help you understand how is the presentation will look and how it -//! will be oriented in model space during construction. -//! -//! Orientation of dimension line in model space relatively to the base shapes is defined -//! with the flyouts. Flyouts specify length of flyout lines and their orientation relatively -//! to the attachment points on the working plane. -//! For linear dimensions: -//! Direction of flyouts is specified with direction of main dimension line -//! (vector from the first attachment to the second attachment) and the normal of the dimension plane. -//! Positive direction of flyouts is defined by vector multiplication: AttachVector * PlaneNormal. -//! For angular dimensions: -//! Flyouts are defined by vectors from the center point to the attachment points. -//! These vectors directions are supposed to be the positive directions of flyouts. -//! Negative flyouts directions means that these vectors should be reversed -//! (and dimension will be built out of the angle constructed with center and two attach points). -//! -//! The dimension plane can be constructed automatically by application (where possible, -//! it depends on the measured geometry). -//! It can be also set by user. However, if the user-defined plane does not fit the -//! geometry of the dimension (attach points do not belong to it), the dimension could not -//! be built. -//! If it is not possible to compute automatic plane (for example, in case of length between -//! two points) the user is supposed to specify the custom plane. -//! -//! Since the dimensions feature automated construction procedures from an arbitrary shapes, -//! the interfaces to check the validness are also implemented. Once the measured geometry is -//! specified, the one can inquire the validness status by calling "IsValid()" method. If the result -//! is TRUE, then all of public parameters should be pre-computed and ready. The presentation -//! should be also computable. Otherwise, the parameters may return invalid values. In this case, -//! the presentation will not be computed and displayed. -//! -//! The dimension support two local selection modes: main dimension line selection and text label -//! selection. These modes can be used to develop interactive modification of dimension presentations. -//! The component highlighting in these selection modes is provided by AIS_DimensionOwner class. -//! Please note that selection is unavailable until the presentation is computed. -//! -//! The specific drawing attributes are controlled through Prs3d_DimensionAspect. The one can change -//! color, arrows, text and arrow style and specify positioning of value label by setting corresponding -//! values to the aspect. -//! -//! Such set of parameters that consists of: -//! - flyout size and direction, -//! - user-defined dimension plane, -//! - horizontal and vertical text alignment -//! can be uniquely replaced with text position in 3d space. Therefore, there are methods to convert -//! this set of parameters to the text position and vice versa: -//! -//! - If the fixed text position is defined by user, called SetTextPosition (theTextPos) method converts -//! this 3d point to the set of parameters including adjusting of the dimension plane (this plane will be -//! automatic plane, NOT user-defined one). -//! If the fixed text position is set, the flag myIsFixedTextPosition is set to TRUE. -//! ATTENSION! myIsFixedTextPosition fixes all parameters of the set from recomputing inside -//! SetMeasureGeometry() methods. Parameters in dimension aspect (they are horizontal text position -//! and extension size) are adjusted on presentation computing step, user-defined values in -//! dimension aspect are not changed. -//! But plane and flyout as dimension position parameters are changed by SetTextPosition() method -//! according with user-defined text position. -//! If parameters from the set are changed by user with calls of setters, it leads to disabling of -//! fixed text position (myIsFixedTextPosition is set to FALSE). -//! If the fixed text position is set and geometry is changed by user (SetMeasureGeometry() method -//! is called) and the geometry doesn't satisfy computed dimension plane, the dimension is not valid. -//! -//! - If the set of parameters was set by user (may be without the user-defined plane or with it), -//! it can be converted to the text position by calling the method GetTextPosition(). In this case -//! the text position is NOT fixed, and SetMeasureGeometry() without user-defined plane adjusts -//! the automatic plane according input geometry (if it is possible). -//! -class AIS_Dimension : public AIS_InteractiveObject -{ -protected: - - //! Geometry type defines type of shapes on which the dimension is to be built. - //! Some type of geometry allows automatic plane computing and - //! can be built without user-defined plane - //! Another types can't be built without user-defined plane. - enum GeometryType - { - GeometryType_UndefShapes, - GeometryType_Edge, - GeometryType_Face, - GeometryType_Points, - GeometryType_Edges, - GeometryType_Faces, - GeometryType_EdgeFace, - GeometryType_EdgeVertex - }; - - //! Specifies supported at base level horizontal and vertical - //! label positions for drawing extension lines and centered text. - enum LabelPosition - { - LabelPosition_None = 0x00, - - LabelPosition_Left = 0x01, - LabelPosition_Right = 0x02, - LabelPosition_HCenter = 0x04, - LabelPosition_HMask = LabelPosition_Left | LabelPosition_Right | LabelPosition_HCenter, - - LabelPosition_Above = 0x10, - LabelPosition_Below = 0x20, - LabelPosition_VCenter = 0x40, - LabelPosition_VMask = LabelPosition_Above | LabelPosition_Below | LabelPosition_VCenter - }; - - enum ValueType - { - ValueType_Computed, - ValueType_CustomReal, - ValueType_CustomText - }; - -public: - - //! Specifies supported presentation compute modes. - //! Used to compute only parts of presentation for - //! advanced highlighting. - enum ComputeMode - { - ComputeMode_All = 0, //!< "0" is reserved as neutral mode - ComputeMode_Line = 1, //!< corresponds to selection mode - ComputeMode_Text = 2 //!< corresponds to selection mode - }; - -public: - - //! Constructor with default parameters values. - //! @param theType [in] the type of dimension. - Standard_EXPORT AIS_Dimension (const AIS_KindOfDimension theType); - - //! Gets dimension measurement value. If the value to display is not - //! specified by user, then the dimension object is responsible to - //! compute it on its own in model space coordinates. - //! @return the dimension value (in model units) which is used - //! during display of the presentation. - Standard_Real GetValue() const - { - return myValueType == ValueType_CustomReal ? myCustomValue : ComputeValue(); - } - - //! Sets computed dimension value. Resets custom value mode if it was set. - void SetComputedValue () - { - myValueType = ValueType_Computed; - } - - //! Sets user-defined dimension value. - //! The user-defined dimension value is specified in model space, - //! and affect by unit conversion during the display. - //! @param theValue [in] the user-defined value to display. - Standard_EXPORT void SetCustomValue (const Standard_Real theValue); - - //! Sets user-defined dimension value. - //! Unit conversion during the display is not applyed. - //! @param theValue [in] the user-defined value to display. - Standard_EXPORT void SetCustomValue (const TCollection_ExtendedString& theValue); - - //! Gets user-defined dimension value. - //! @return dimension value string. - Standard_EXPORT const TCollection_ExtendedString& GetCustomValue () const; - - //! Get the dimension plane in which the 2D dimension presentation is computed. - //! By default, if plane is not defined by user, it is computed automatically - //! after dimension geometry is computed. - //! If computed dimension geometry (points) can't be placed on the user-defined - //! plane, dimension geometry was set as invalid (validity flag is set to false) - //! and dimension presentation will not be computed. - //! If user-defined plane allow geometry placement on it, it will be used for - //! computing of the dimension presentation. - //! @return dimension plane used for presentation computing. - Standard_EXPORT const gp_Pln& GetPlane() const; - - //! Geometry type defines type of shapes on which the dimension is to be built. - //! @return type of geometry on which the dimension will be built. - Standard_Integer GetGeometryType () const { return myGeometryType; } - - //! Sets user-defined plane where the 2D dimension presentation will be placed. - //! Checks validity of this plane if geometry has been set already. - //! Validity of the plane is checked according to the geometry set - //! and has different criteria for different kinds of dimensions. - Standard_EXPORT virtual void SetCustomPlane (const gp_Pln& thePlane); - - //! Unsets user-defined plane. Therefore the plane for dimension will be - //! computed automatically. - void UnsetCustomPlane() { myIsPlaneCustom = Standard_False; } - - //! @return TRUE if text position is set by user with method SetTextPosition(). - Standard_Boolean IsTextPositionCustom() const - { - return myIsTextPositionFixed; - } - - //! Fixes the absolute text position and adjusts flyout, plane and text alignment - //! according to it. Updates presentation if the text position is valid. - //! ATTENTION! It does not change vertical text alignment. - //! @param theTextPos [in] the point of text position. - virtual void SetTextPosition (const gp_Pnt& /*theTextPos*/) { } - - //! Computes absolute text position from dimension parameters - //! (flyout, plane and text alignment). - virtual const gp_Pnt GetTextPosition () const { return gp_Pnt(); } - -public: - - //! Gets the dimension aspect from AIS object drawer. - //! Dimension aspect contains aspects of line, text and arrows for dimension presentation. - Handle(Prs3d_DimensionAspect) DimensionAspect() const - { - return myDrawer->DimensionAspect(); - } - - //! Sets new dimension aspect for the interactive object drawer. - //! The dimension aspect provides dynamic properties which are generally - //! used during computation of dimension presentations. - Standard_EXPORT void SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theDimensionAspect); - - //! @return the kind of dimension. - AIS_KindOfDimension KindOfDimension() const - { - return myKindOfDimension; - } - - //! @return the kind of interactive. - virtual AIS_KindOfInteractive Type() const Standard_OVERRIDE - { - return AIS_KOI_Dimension; - } - - //! Returns true if the class of objects accepts the display mode theMode. - //! The interactive context can have a default mode of representation for - //! the set of Interactive Objects. This mode may not be accepted by object. - virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE - { - return theMode == ComputeMode_All; - } - -public: - - //! @return dimension special symbol display options. - AIS_DisplaySpecialSymbol DisplaySpecialSymbol() const - { - return myDisplaySpecialSymbol; - } - - //! Specifies whether to display special symbol or not. - Standard_EXPORT void SetDisplaySpecialSymbol (const AIS_DisplaySpecialSymbol theDisplaySpecSymbol); - - //! @return special symbol. - Standard_ExtCharacter SpecialSymbol() const - { - return mySpecialSymbol; - } - - //! Specifies special symbol. - Standard_EXPORT void SetSpecialSymbol (const Standard_ExtCharacter theSpecialSymbol); - - Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const; - - Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const; - - virtual void SetDisplayUnits (const TCollection_AsciiString& /*theUnits*/) { } - - virtual void SetModelUnits (const TCollection_AsciiString& /*theUnits*/) { } - - //! Unsets user defined text positioning and enables text positioning - //! by other parameters: text alignment, extension size, flyout and custom plane. - Standard_EXPORT void UnsetFixedTextPosition(); - -public: - - //! Returns selection tolerance for text2d: - //! For 2d text selection detection sensitive point with tolerance is used - //! Important! Only for 2d text. - Standard_Real SelToleranceForText2d() const - { - return mySelToleranceForText2d; - } - - //! Sets selection tolerance for text2d: - //! For 2d text selection detection sensitive point with tolerance is used - //! to change this tolerance use this method - //! Important! Only for 2d text. - Standard_EXPORT void SetSelToleranceForText2d (const Standard_Real theTol); - - //! @return flyout value for dimension. - Standard_Real GetFlyout() const - { - return myFlyout; - } - - //! Sets flyout value for dimension. - Standard_EXPORT void SetFlyout (const Standard_Real theFlyout); - - //! Check that the input geometry for dimension is valid and the - //! presentation can be successfully computed. - //! @return TRUE if dimension geometry is ok. - virtual Standard_Boolean IsValid() const - { - return myIsGeometryValid && CheckPlane (GetPlane()); - } - -public: - - DEFINE_STANDARD_RTTIEXT(AIS_Dimension,AIS_InteractiveObject) - -protected: - - Standard_EXPORT Standard_Real ValueToDisplayUnits() const; - - //! Get formatted value string and its model space width. - //! @param theWidth [out] the model space with of the string. - //! @return formatted dimension value string. - Standard_EXPORT TCollection_ExtendedString GetValueString (Standard_Real& theWidth) const; - - //! Performs drawing of 2d or 3d arrows on the working plane - //! @param theLocation [in] the location of the arrow tip. - //! @param theDirection [in] the direction from the tip to the bottom of the arrow. - Standard_EXPORT void DrawArrow (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theLocation, - const gp_Dir& theDirection); - - //! Performs drawing of 2d or 3d text on the working plane - //! @param theTextPos [in] the position of the text label. - //! @param theTestDir [in] the direction of the text label. - //! @param theText [in] the text label string. - //! @param theLabelPosition [in] the text label vertical and horizontal positioning option - //! respectively to the main dimension line. - //! @return text width relative to the dimension working plane. For 2d text this value will be zero. - Standard_EXPORT void drawText (const Handle(Prs3d_Presentation)& thePresentation, - const gp_Pnt& theTextPos, - const gp_Dir& theTextDir, - const TCollection_ExtendedString& theText, - const Standard_Integer theLabelPosition); - - //! Performs computing of dimension linear extension with text - //! @param thePresentation [in] the presentation to fill with graphical primitives. - //! @param theExtensionSize [in] the size of extension line. - //! @param theExtensionStart [in] the point where extension line connects to dimension. - //! @param theExtensionDir [in] the direction of extension line. - //! @param theLabelString [in] the string with value. - //! @param theLabelWidth [in] the geometrical width computed for value string. - //! @param theMode [in] the display mode. - //! @param theLabelPosition [in] position flags for the text label. - Standard_EXPORT void DrawExtension (const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Real theExtensionSize, - const gp_Pnt& theExtensionStart, - const gp_Dir& theExtensionDir, - const TCollection_ExtendedString& theLabelString, - const Standard_Real theLabelWidth, - const Standard_Integer theMode, - const Standard_Integer theLabelPosition); - - //! Performs computing of linear dimension (for length, diameter, radius and so on). - //! Please note that this method uses base dimension properties, like working plane - //! flyout length, drawer attributes. - //! @param thePresentation [in] the presentation to fill with primitives. - //! @param theMode [in] the presentation compute mode. - //! @param theFirstPoint [in] the first attach point of linear dimension. - //! @param theSecondPoint [in] the second attach point of linear dimension. - //! @param theIsOneSide [in] specifies whether the dimension has only one flyout line. - Standard_EXPORT void DrawLinearDimension (const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide = Standard_False); - - //! Computes points bounded the flyout line for linear dimension. - //! @param theFirstPoint [in] the first attach point of linear dimension. - //! @param theSecondPoint [in] the second attach point of linear dimension. - //! @param theLineBegPoint [out] the first attach point of linear dimension. - //! @param theLineEndPoint [out] the second attach point of linear dimension. - Standard_EXPORT virtual void ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, - gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint); - - //! Compute selection sensitives for linear dimension flyout lines (length, diameter, radius). - //! Please note that this method uses base dimension properties: working plane and flyout length. - //! @param theSelection [in] the selection structure to fill with selection primitives. - //! @param theOwner [in] the selection entity owner. - //! @param theFirstPoint [in] the first attach point of linear dimension. - //! @param theSecondPoint [in] the second attach point of linear dimension. - Standard_EXPORT void ComputeLinearFlyouts (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theOwner, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint); - - - //! Performs initialization of circle and middle arc point from the passed - //! shape which is assumed to contain circular geometry. - //! @param theShape [in] the shape to explore. - //! @param theCircle [out] the circle geometry. - //! @param theMiddleArcPoint [out] the middle point of the arc. - //! @param theIsClosed [out] returns TRUE if the geometry is closed circle. - //! @return TRUE if the the circle is successfully got from the input shape. - Standard_EXPORT Standard_Boolean InitCircularDimension (const TopoDS_Shape& theShape, - gp_Circ& theCircle, - gp_Pnt& theMiddleArcPoint, - Standard_Boolean& theIsClosed); - - //! Produce points for triangular arrow face. - //! @param thePeakPnt [in] the arrow peak position. - //! @param theDirection [in] the arrow direction. - //! @param thePlane [in] the face plane. - //! @param theArrowLength [in] the length of arrow. - //! @param theArrowAngle [in] the angle of arrow. - //! @param theSidePnt1 [out] the first side point. - //! @param theSidePnt2 [out] the second side point. - Standard_EXPORT void PointsForArrow (const gp_Pnt& thePeakPnt, - const gp_Dir& theDirection, - const gp_Dir& thePlane, - const Standard_Real theArrowLength, - const Standard_Real theArrowAngle, - gp_Pnt& theSidePnt1, - gp_Pnt& theSidePnt2); - - //! Compute point of text position for dimension parameters - //! for linear kinds of dimensions (length, radius, diameter). - Standard_EXPORT gp_Pnt GetTextPositionForLinear (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide = Standard_False) const; - - //! Fits text alignment relatively to the dimension line. - //! @param theFirstPoint [in] the first attachment point. - //! @param theSecondPoint [in] the second attachment point. - //! @param theIsOneSide [in] is the arrow displayed only on the one side of the dimension. - //! @param theHorizontalTextPos [in] the text horizontal position (alignment). - //! @param theLabelPosition [out] the label position, contains bits that defines - //! vertical and horizontal alignment. (for internal usage in count text position) - //! @param theIsArrowExternal [out] is the arrows external, - //! if arrow orientation in the dimension aspect is Prs3d_DAO_Fit, it fits arrow - //! orientation automatically. - Standard_EXPORT void FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const Standard_Boolean theIsOneSide, - const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, - Standard_Integer& theLabelPosition, - Standard_Boolean& theIsArrowsExternal) const; - - //! Adjusts aspect parameters according the text position: - //! extension size, vertical text alignment and flyout. - //! @param theTextPos [in] the user defined 3d point of text position - //! @param theFirstPoint [in] the first point of linear measurement. - //! @param theSecondPoint [in] the second point of linear measurement. - //! @param theExtensionSize [out] the adjusted extension size - //! @param theAlignment [out] the horizontal label alignment. - //! @param theFlyout [out] the adjusted value of flyout. - //! @param thePlane [out] the new plane that contains theTextPos and attachment points. - //! @param theIsPlaneOld [out] shows if new plane is computed. - Standard_EXPORT Standard_Boolean AdjustParametersForLinear (const gp_Pnt& theTextPos, - const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - Standard_Real& theExtensionSize, - Prs3d_DimensionTextHorizontalPosition& theAlignment, - Standard_Real& theFlyout, - gp_Pln& thePlane, - Standard_Boolean& theIsPlaneOld) const; - -protected: //! @name Static auxilliary methods for geometry extraction - - //! If it is possible extracts circle from planar face. - //! @param theFace [in] the planar face - //! @param theCurve [out] the circular curve - //! @param theFirstPoint [out] the point of the first parameter of the circlular curve - //! @param theSecondPoint [out] the point of the last parameter of the circlular curve - //! @return TRUE in case of successful circle extraction - static Standard_Boolean CircleFromPlanarFace (const TopoDS_Face& theFace, - Handle(Geom_Curve)& theCurve, - gp_Pnt& theFirstPoint, - gp_Pnt& theLastPoint); - - //! If it is possible extracts circle from the edge. - //! @param theEdge [in] input edge to extract circle from - //! @param theCircle [out] circle - //! @param theFirstPoint [out] the point of the first parameter of the circlular curve - //! @param theSecondPoint [out] the point of the last parameter of the circlular curve - //! @return TRUE in case of successful circle extraction. - static Standard_Boolean CircleFromEdge (const TopoDS_Edge& theEdge, - gp_Circ& theCircle, - gp_Pnt& theFirstPoint, - gp_Pnt& theLastPoint); - -protected: //! @name Behavior to implement - - //! Override this method to check if user-defined plane - //! is valid for the dimension geometry. - //! @param thePlane [in] the working plane for positioning every - //! dimension in the application. - //! @return true is the plane is suitable for building dimension - //! with computed dimension geometry. - virtual Standard_Boolean CheckPlane (const gp_Pln& /*thePlane*/) const { return Standard_True; } - - //! Override this method to computed value of dimension. - //! @return value from the measured geometry. - virtual Standard_Real ComputeValue() const - { - return 0.0; - } - - //! Override this method to compute selection primitives for - //! flyout lines (if the dimension provides it). - //! This callback is a only a part of base selection - //! computation routine. - virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)&, - const Handle(SelectMgr_EntityOwner)&) {} - - - //! Base procedure of computing selection (based on selection geometry data). - //! @param theSelection [in] the selection structure to will with primitives. - //! @param theMode [in] the selection mode. - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, - const Standard_Integer theMode) Standard_OVERRIDE; - -protected: //! @name Selection geometry - - //! Selection geometry of dimension presentation. The structure is filled with data - //! during compute of presentation, then this data is used to generate selection - //! sensitives when computing selection. - struct SelectionGeometry - { - //! Arrows are represented by directed triangles. - struct Arrow - { - gp_Pnt Position; - gp_Dir Direction; - }; - typedef NCollection_Sequence Curve; - typedef NCollection_Handle HCurve; - typedef NCollection_Handle HArrow; - typedef NCollection_Sequence SeqOfCurves; - typedef NCollection_Sequence SeqOfArrows; - - gp_Pnt TextPos; //!< Center of text label. - gp_Dir TextDir; //!< Direction of text label. - Standard_Real TextWidth; //!< Width of text label. - Standard_Real TextHeight; //!< Height of text label. - SeqOfCurves DimensionLine; //!< Sequence of points for composing the segments of dimension line. - SeqOfArrows Arrows; //!< Sequence of arrow geometries. - Standard_Boolean IsComputed; //!< Shows if the selection geometry was filled. - - public: - - //! Clear geometry of sensitives for the specified compute mode. - //! @param theMode [in] the compute mode to clear. - void Clear (const Standard_Integer theMode) - { - if (theMode == ComputeMode_All || theMode == ComputeMode_Line) - { - DimensionLine.Clear(); - Arrows.Clear(); - } - - if (theMode == ComputeMode_All || theMode == ComputeMode_Text) - { - TextPos = gp::Origin(); - TextDir = gp::DX(); - TextWidth = 0.0; - TextHeight = 0.0; - } - - IsComputed = Standard_False; - } - - //! Add new curve entry and return the reference to populate it. - Curve& NewCurve() - { - DimensionLine.Append( new Curve ); - HCurve& aLastCurve = DimensionLine.ChangeLast(); - return *aLastCurve; - } - - //! Add new arrow entry and return the reference to populate it. - Arrow& NewArrow() - { - Arrows.Append( new Arrow ); - HArrow& aLastArrow = Arrows.ChangeLast(); - return *aLastArrow; - } - } mySelectionGeom; - - Standard_Real mySelToleranceForText2d; //!< Sensitive point tolerance for 2d text selection. - -protected: //! @name Value properties - - ValueType myValueType; //! type of value (computed or user-defined) - Standard_Real myCustomValue; //!< Value of the dimension (computed or user-defined). - - TCollection_ExtendedString myCustomStringValue; //!< Value of the dimension (computed or user-defined). - -protected: //! @name Fixed text position properties - - gp_Pnt myFixedTextPosition; //!< Stores text position fixed by user. - Standard_Boolean myIsTextPositionFixed; //!< Is the text label position fixed by user. - -protected: //! @name Units properties - - Standard_ExtCharacter mySpecialSymbol; //!< Special symbol. - AIS_DisplaySpecialSymbol myDisplaySpecialSymbol; //!< Special symbol display options. - -protected: //! @name Geometrical properties - - GeometryType myGeometryType; //!< defines type of shapes on which the dimension is to be built. - - gp_Pln myPlane; //!< Plane where dimension will be built (computed or user defined). - Standard_Boolean myIsPlaneCustom; //!< Is plane defined by user (otherwise it will be computed automatically). - Standard_Real myFlyout; //!< Flyout distance. - Standard_Boolean myIsGeometryValid; //!< Is dimension geometry properly defined. - -private: - - AIS_KindOfDimension myKindOfDimension; -}; +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_Dimension AIS_Dimension; #endif // _AIS_Dimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_DimensionOwner.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_DimensionOwner.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_DimensionOwner.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_DimensionOwner.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_DimensionOwner,SelectMgr_EntityOwner) - -namespace -{ - //======================================================================= - //function : HighlightMode - //purpose : Return corresponding compute mode for selection type. - //======================================================================= - static AIS_Dimension::ComputeMode HighlightMode (const Standard_Integer theSelMode) - { - switch (theSelMode) - { - case AIS_DSM_Line : return AIS_Dimension::ComputeMode_Line; - case AIS_DSM_Text : return AIS_Dimension::ComputeMode_Text; - default: - return AIS_Dimension::ComputeMode_All; - } - } -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_DimensionOwner::AIS_DimensionOwner (const Handle(SelectMgr_SelectableObject)& theSelObject, - const AIS_DimensionSelectionMode theMode, - const Standard_Integer thePriority) -: SelectMgr_EntityOwner(theSelObject, thePriority), - mySelectionMode (theMode) -{ -} - -//======================================================================= -//function : AIS_DimensionSelectionMode -//purpose : -//======================================================================= -AIS_DimensionSelectionMode AIS_DimensionOwner::SelectionMode () const -{ - return mySelectionMode; -} - -//======================================================================= -//function : IsHilighted -//purpose : -//======================================================================= -Standard_Boolean AIS_DimensionOwner::IsHilighted (const Handle(PrsMgr_PresentationManager)& thePM, - const Standard_Integer /*theMode*/) const -{ - if (!HasSelectable()) - { - return Standard_False; - } - - return thePM->IsHighlighted (Selectable(), HighlightMode (mySelectionMode)); -} - -//======================================================================= -//function : Unhilight -//purpose : -//======================================================================= -void AIS_DimensionOwner::Unhilight (const Handle(PrsMgr_PresentationManager)& thePM, - const Standard_Integer /*theMode*/) -{ - if (!HasSelectable()) - { - return; - } - - thePM->Unhighlight (Selectable()); -} - -//======================================================================= -//function : HilightWithColor -//purpose : -//======================================================================= -void AIS_DimensionOwner::HilightWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, - const Handle(Prs3d_Drawer)& theStyle, - const Standard_Integer /*theMode*/) -{ - thePM->Color (Selectable(), theStyle, HighlightMode (mySelectionMode)); -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_DimensionOwner.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_DimensionOwner.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_DimensionOwner.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_DimensionOwner.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1996-12-05 -// Created by: Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,58 +14,9 @@ #ifndef _AIS_DimensionOwner_HeaderFile #define _AIS_DimensionOwner_HeaderFile -#include -#include +#include -#include -#include -#include -#include -#include -#include - -class SelectMgr_SelectableObject; -class PrsMgr_PresentationManager; - -DEFINE_STANDARD_HANDLE(AIS_DimensionOwner, SelectMgr_EntityOwner) - -//! The owner is the entity which makes it possible to link -//! the sensitive primitives and the reference shapes that -//! you want to detect. It stocks the various pieces of -//! information which make it possible to find objects. An -//! owner has a priority which you can modulate, so as to -//! make one entity more selectable than another. You -//! might want to make edges more selectable than -//! faces, for example. In that case, you could attribute sa -//! higher priority to the one compared to the other. An -//! edge, could have priority 5, for example, and a face, -//! priority 4. The default priority is 5. -class AIS_DimensionOwner : public SelectMgr_EntityOwner -{ - DEFINE_STANDARD_RTTIEXT(AIS_DimensionOwner, SelectMgr_EntityOwner) -public: - - //! Initializes the dimension owner, theSO, and attributes it - //! the priority, thePriority. - Standard_EXPORT AIS_DimensionOwner(const Handle(SelectMgr_SelectableObject)& theSelObject, const AIS_DimensionSelectionMode theSelMode, const Standard_Integer thePriority = 0); - - Standard_EXPORT AIS_DimensionSelectionMode SelectionMode() const; - - Standard_EXPORT virtual void HilightWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, - const Handle(Prs3d_Drawer)& theStyle, - const Standard_Integer theMode = 0) Standard_OVERRIDE; - - //! Returns true if an object with the selection mode - //! aMode is highlighted in the presentation manager aPM. - Standard_EXPORT virtual Standard_Boolean IsHilighted (const Handle(PrsMgr_PresentationManager)& thePM, const Standard_Integer theMode = 0) const Standard_OVERRIDE; - - //! Removes highlighting from the selected part of dimension. - Standard_EXPORT virtual void Unhilight (const Handle(PrsMgr_PresentationManager)& thePM, const Standard_Integer theMode = 0) Standard_OVERRIDE; - -private: - - AIS_DimensionSelectionMode mySelectionMode; - -}; +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_DimensionOwner AIS_DimensionOwner; #endif // _AIS_DimensionOwner_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_DimensionSelectionMode.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_DimensionSelectionMode.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_DimensionSelectionMode.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_DimensionSelectionMode.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _AIS_DimensionSelectionMode_HeaderFile -#define _AIS_DimensionSelectionMode_HeaderFile - -//! Specifies dimension selection modes. -enum AIS_DimensionSelectionMode -{ -AIS_DSM_All, -AIS_DSM_Line, -AIS_DSM_Text -}; - -#endif // _AIS_DimensionSelectionMode_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_DisplaySpecialSymbol.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_DisplaySpecialSymbol.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_DisplaySpecialSymbol.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_DisplaySpecialSymbol.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _AIS_DisplaySpecialSymbol_HeaderFile -#define _AIS_DisplaySpecialSymbol_HeaderFile - -//! Specifies dimension special symbol display options -enum AIS_DisplaySpecialSymbol -{ -AIS_DSS_No, -AIS_DSS_Before, -AIS_DSS_After -}; - -#endif // _AIS_DisplaySpecialSymbol_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_EllipseRadiusDimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_EllipseRadiusDimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_EllipseRadiusDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_EllipseRadiusDimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,293 +0,0 @@ -// Created on: 1998-01-22 -// Created by: Sergey ZARITCHNY -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_EllipseRadiusDimension,AIS_Relation) - -//======================================================================= -//function : AIS_EllipseRadiusDimension -//purpose : -//======================================================================= -AIS_EllipseRadiusDimension::AIS_EllipseRadiusDimension(const TopoDS_Shape& aShape, - const TCollection_ExtendedString& aText) -:AIS_Relation() -{ - myFShape = aShape; - myText = aText; -// ComputeGeometry( ); -} - -//======================================================================= -//function : ComputeGeometry -//purpose : -//======================================================================= - -void AIS_EllipseRadiusDimension::ComputeGeometry() -{ - - switch (myFShape.ShapeType()) { - case TopAbs_FACE : - { - // compute one face case - ComputeFaceGeometry (); - break; - } - case TopAbs_EDGE: - { - ComputeEdgeGeometry (); - break; - } - default: - break; - } - while (myFirstPar > 2*M_PI) myFirstPar -= 2*M_PI; - while (myLastPar > 2*M_PI) myLastPar -= 2*M_PI; - while (myFirstPar < 0.0) myFirstPar += 2*M_PI; - while (myLastPar < 0.0) myLastPar += 2*M_PI; -} - -//======================================================================= -//function : ComputeFaceGeometry -//purpose : -//======================================================================= - -void AIS_EllipseRadiusDimension::ComputeFaceGeometry() -{ - - gp_Pln aPln; - Handle( Geom_Surface ) aBasisSurf; - AIS_KindOfSurface aSurfType; - Standard_Real Offset; - AIS::GetPlaneFromFace( TopoDS::Face( myFShape), - aPln, - aBasisSurf, - aSurfType, - Offset ) ; - - if ( aSurfType == AIS_KOS_Plane ) - ComputePlanarFaceGeometry( ); - else - ComputeCylFaceGeometry( aSurfType, aBasisSurf, Offset ); - -} - -//======================================================================= -//function : ComputeCylFaceGeometry -//purpose : defines Ellipse and plane of dimension -//======================================================================= - -void AIS_EllipseRadiusDimension::ComputeCylFaceGeometry(const AIS_KindOfSurface aSurfType, - const Handle( Geom_Surface )& aBasisSurf, - const Standard_Real Offset) -{ - - BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); - Standard_Real vFirst, vLast; - vFirst = surf1.FirstVParameter(); - vLast = surf1.LastVParameter(); - Standard_Real vMid = (vFirst + vLast)*0.5; - gp_Pln aPlane; - gp_Ax1 Axis; -// Standard_Real Param; - if (aSurfType == AIS_KOS_Extrusion) - { - Axis.SetDirection((Handle( Geom_SurfaceOfLinearExtrusion )::DownCast( aBasisSurf )) - ->Direction() ); - Axis.SetLocation( gp_Pnt((Handle( Geom_SurfaceOfLinearExtrusion )::DownCast( aBasisSurf )) - ->Direction().XYZ() ) ); - - aPlane.SetAxis(Axis); - aPlane.SetLocation(myEllipse.Location()); - myPlane = new Geom_Plane(aPlane); - - Handle(Geom_Curve) aCurve; - aCurve = aBasisSurf->VIso(vMid); - if (aCurve->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) - { - myEllipse = Handle(Geom_Ellipse)::DownCast(aCurve)-> Elips();//gp_Elips - myIsAnArc = Standard_False; - } - else if (aCurve->DynamicType() == STANDARD_TYPE(Geom_TrimmedCurve)) { - Handle(Geom_TrimmedCurve) tCurve = Handle(Geom_TrimmedCurve)::DownCast(aCurve); - aCurve = tCurve->BasisCurve(); - myFirstPar = tCurve->FirstParameter(); - myLastPar = tCurve->LastParameter(); - myIsAnArc = Standard_True; - if (aCurve->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) - { - myEllipse = Handle(Geom_Ellipse)::DownCast(aCurve)->Elips();//gp_Elips - } - } - else - { - throw Standard_ConstructionError("AIS:: Not expected type of surface") ; - return; - } - -// Offset - - if(surf1.GetType() == GeomAbs_OffsetSurface) - { - if(Offset <0.0 && Abs(Offset) > myEllipse.MinorRadius ()) - { - throw Standard_ConstructionError("AIS:: Absolute value of negative offset is larger than MinorRadius"); - return; - } - - myOffsetCurve = new Geom_OffsetCurve(new Geom_Ellipse(myEllipse), Offset, - myPlane->Pln().Axis().Direction()); - myOffset = Offset; - myIsOffset = Standard_True; - gp_Elips elips = myEllipse; - Standard_Real Val = Offset + elips.MajorRadius ();//simulation - myEllipse.SetMajorRadius (Val); - Val = Offset + elips.MinorRadius (); - myEllipse.SetMinorRadius (Val); - } - else - myIsOffset = Standard_False; - } -} - - -//======================================================================= -//function : ComputePlanarFaceGeometry -//purpose : -//======================================================================= - -void AIS_EllipseRadiusDimension::ComputePlanarFaceGeometry() -{ - - Standard_Boolean find = Standard_False; - gp_Pnt ptfirst,ptend; - TopExp_Explorer ExploEd( TopoDS::Face(myFShape), TopAbs_EDGE ); - for ( ; ExploEd.More(); ExploEd.Next()) - { - TopoDS_Edge curedge = TopoDS::Edge( ExploEd.Current() ); - Handle(Geom_Curve) curv; - Handle(Geom_Ellipse) ellips; - if (AIS::ComputeGeometry(curedge,curv,ptfirst,ptend)) - { - if (curv->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) - { - ellips = Handle(Geom_Ellipse)::DownCast(curv); - if ( !ellips.IsNull() ) { - myEllipse = ellips->Elips(); - find = Standard_True; - break; - } - } - } - } - if( !find ) - { - throw Standard_ConstructionError("AIS:: Curve is not an ellipsee or is Null") ; - return; - } - - if ( !ptfirst.IsEqual(ptend, Precision::Confusion()) ) - { - myIsAnArc = Standard_True; - myFirstPar = ElCLib::Parameter(myEllipse, ptfirst); - myLastPar = ElCLib::Parameter(myEllipse, ptend); - } - else - myIsAnArc = Standard_False; - - BRepAdaptor_Surface surfAlgo (TopoDS::Face(myFShape)); - myPlane = new Geom_Plane( surfAlgo.Plane() ); - -} - - - -//======================================================================= -//function : ComputeEdgeGeometry -//purpose : -//======================================================================= - -void AIS_EllipseRadiusDimension::ComputeEdgeGeometry() -{ - gp_Pnt ptfirst,ptend; - Handle(Geom_Curve) curv; - if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape),curv,ptfirst,ptend)) return; - - Handle(Geom_Ellipse) elips = Handle(Geom_Ellipse)::DownCast(curv); - if ( elips.IsNull()) return; - - myEllipse = elips->Elips(); - gp_Pln aPlane; - aPlane.SetPosition(gp_Ax3(myEllipse.Position())); - myPlane = new Geom_Plane(aPlane); - - - if ( ptfirst.IsEqual(ptend, Precision::Confusion()) ) { - myIsAnArc = Standard_False; - } - else { - myIsAnArc = Standard_True; - myFirstPar = ElCLib::Parameter(myEllipse, ptfirst); - myLastPar = ElCLib::Parameter(myEllipse, ptend); - } -} -//======================================================================= -//function : KindOfDimension -//purpose : -//======================================================================= - AIS_KindOfDimension AIS_EllipseRadiusDimension::KindOfDimension() const -{ - return AIS_KOD_ELLIPSERADIUS; -} - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= - Standard_Boolean AIS_EllipseRadiusDimension::IsMovable() const -{ - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_EllipseRadiusDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_EllipseRadiusDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_EllipseRadiusDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_EllipseRadiusDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1998-01-22 -// Created by: Sergey ZARITCHNY -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,78 +14,9 @@ #ifndef _AIS_EllipseRadiusDimension_HeaderFile #define _AIS_EllipseRadiusDimension_HeaderFile -#include -#include - -#include -#include -#include -#include -#include -#include -class Geom_OffsetCurve; -class TopoDS_Shape; -class TCollection_ExtendedString; -class Geom_Surface; - - -class AIS_EllipseRadiusDimension; -DEFINE_STANDARD_HANDLE(AIS_EllipseRadiusDimension, AIS_Relation) - - -//! Computes geometry ( basis curve and plane of dimension) -//! for input shape aShape from TopoDS -//! Root class for MinRadiusDimension and MaxRadiusDimension -class AIS_EllipseRadiusDimension : public AIS_Relation -{ - -public: - - - Standard_EXPORT virtual AIS_KindOfDimension KindOfDimension() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - Standard_EXPORT void ComputeGeometry(); - - - - - DEFINE_STANDARD_RTTIEXT(AIS_EllipseRadiusDimension,AIS_Relation) - -protected: - - - Standard_EXPORT AIS_EllipseRadiusDimension(const TopoDS_Shape& aShape, const TCollection_ExtendedString& aText); - - gp_Elips myEllipse; - Standard_Real myFirstPar; - Standard_Real myLastPar; - Standard_Boolean myIsAnArc; - Handle(Geom_OffsetCurve) myOffsetCurve; - Standard_Real myOffset; - Standard_Boolean myIsOffset; - - -private: - - - Standard_EXPORT void ComputeFaceGeometry(); - - Standard_EXPORT void ComputeCylFaceGeometry (const AIS_KindOfSurface aSurfType, const Handle(Geom_Surface)& aSurf, const Standard_Real Offset); - - Standard_EXPORT void ComputePlanarFaceGeometry(); - - Standard_EXPORT void ComputeEdgeGeometry(); - - - -}; - - - - - +#include +Standard_DEPRECATED("Alias to moved class") +typedef PrsDim_EllipseRadiusDimension AIS_EllipseRadiusDimension; #endif // _AIS_EllipseRadiusDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,831 +0,0 @@ -// Created on: 1998-01-24 -// Created by: Julia GERASIMOVA -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_EqualDistanceRelation,AIS_Relation) - -//======================================================================= -//function : AIS_EqualDistanceRelation -//purpose : -//======================================================================= -AIS_EqualDistanceRelation::AIS_EqualDistanceRelation( const TopoDS_Shape& aShape1, - const TopoDS_Shape& aShape2, - const TopoDS_Shape& aShape3, - const TopoDS_Shape& aShape4, - const Handle( Geom_Plane )& aPlane ) - :AIS_Relation() -{ - myFShape = aShape1; - mySShape = aShape2; - myShape3 = aShape3; - myShape4 = aShape4; - myPlane = aPlane; - - //Temporary - myArrowSize = 3.0; //set the concrete value - mySymbolPrs = DsgPrs_AS_BOTHAR; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_EqualDistanceRelation::Compute( const Handle( PrsMgr_PresentationManager3d )&, - const Handle( Prs3d_Presentation )& aPresentation, - const Standard_Integer ) -{ - gp_Pnt Position12 = myPosition, Position34 = myPosition; - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); -// -- ota -- begin - if (!myAutomaticPosition ){ - gp_Pnt aMiddle12 ((myPoint1.XYZ() + myPoint2.XYZ())*0.5); - gp_Pnt aMiddle34 ((myPoint3.XYZ() + myPoint4.XYZ())*0.5); - - if (myPosition.Distance(aMiddle12) > myPosition.Distance(aMiddle34)) - Position12.SetXYZ((myPoint1.XYZ() + myPoint2.XYZ())*0.5); - else - Position34.SetXYZ((myPoint3.XYZ() + myPoint4.XYZ())*0.5); - - } - - if (myFShape.ShapeType() == TopAbs_EDGE && mySShape.ShapeType() == TopAbs_EDGE) - AIS_EqualDistanceRelation::ComputeTwoEdgesLength(aPresentation, - myDrawer, - myArrowSize, - TopoDS::Edge(myFShape), - TopoDS::Edge(mySShape), - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - Position12, - myAttachPoint1, - myAttachPoint2, - myPoint1, - myPoint2, - mySymbolPrs ); - - - else if (myFShape.ShapeType() == TopAbs_VERTEX && mySShape.ShapeType() == TopAbs_VERTEX) - AIS_EqualDistanceRelation::ComputeTwoVerticesLength( aPresentation, - myDrawer, - myArrowSize, - TopoDS::Vertex(myFShape), - TopoDS::Vertex(mySShape), - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - AIS_TOD_Unknown, - Position12, - myAttachPoint1, - myAttachPoint2, - myPoint1, - myPoint2, - mySymbolPrs ); - else - AIS_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( aPresentation, - myDrawer, - myArrowSize, - myFShape, - mySShape, - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - Position12, - myAttachPoint1, - myAttachPoint2, - myPoint1, - myPoint2, - mySymbolPrs ); - - if (myShape3.ShapeType() == TopAbs_EDGE && myShape4.ShapeType() == TopAbs_EDGE) - AIS_EqualDistanceRelation::ComputeTwoEdgesLength(aPresentation, - myDrawer, - myArrowSize, - TopoDS::Edge(myShape3), - TopoDS::Edge(myShape4), - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - Position34, - myAttachPoint3, - myAttachPoint4, - myPoint3, - myPoint4, - mySymbolPrs ); - - else if (myShape3.ShapeType() == TopAbs_VERTEX && myShape4.ShapeType() == TopAbs_VERTEX) - AIS_EqualDistanceRelation::ComputeTwoVerticesLength( aPresentation, - myDrawer, - myArrowSize, - TopoDS::Vertex(myShape3), - TopoDS::Vertex(myShape4), - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - AIS_TOD_Unknown, - Position34, - myAttachPoint3, - myAttachPoint4, - myPoint3, - myPoint4, - mySymbolPrs ); - - else - AIS_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( aPresentation, - myDrawer, - myArrowSize, - myShape3, - myShape4, - myPlane, - myAutomaticPosition, - myIsSetBndBox, - myBndBox, - Position34, - myAttachPoint3, - myAttachPoint4, - myPoint3, - myPoint4, - mySymbolPrs ); - - DsgPrs_EqualDistancePresentation::Add( aPresentation, myDrawer, - myPoint1, myPoint2, myPoint3, myPoint4, myPlane ); -} - - -//======================================================================= -//function : Compute -//purpose : to avoid warning at compilation (SUN) -//======================================================================= - -void AIS_EqualDistanceRelation::Compute( const Handle( Prs3d_Projector )& /*aProjector*/, - const Handle( Prs3d_Presentation )& /*aPresentation*/) -{ -// throw Standard_NotImplemented("AIS_EqualDistanceRelation::Compute( const Handle( Prs3d_Projector )&, - // const Handle( Prs3d_Presentation )& )"); -// PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning at compilation (SUN) -//======================================================================= -void AIS_EqualDistanceRelation::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Geom_Transformation)& aTransformation, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_EqualDistanceRelation::Compute(const Handle(Prs3d_Projector)&, -// const Handle(Geom_Transformation)&,const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_EqualDistanceRelation::ComputeSelection( const Handle( SelectMgr_Selection )& aSelection, - const Standard_Integer ) -{ - Handle( SelectMgr_EntityOwner ) own = new SelectMgr_EntityOwner( this, 7 ); - Handle( Select3D_SensitiveSegment ) seg; - - seg = new Select3D_SensitiveSegment( own, myPoint1, myPoint2 ); - aSelection->Add( seg ); - - seg = new Select3D_SensitiveSegment( own, myPoint3, myPoint4 ); - aSelection->Add( seg ); - - // Line between two middles - gp_Pnt Middle12( (myPoint1.XYZ() + myPoint2.XYZ()) * 0.5 ), - Middle34( (myPoint3.XYZ() + myPoint4.XYZ()) *0.5 ); - seg = new Select3D_SensitiveSegment( own, Middle12, Middle34 ); - aSelection->Add( seg ); - - gp_Pnt Middle((Middle12.XYZ() + Middle34.XYZ())*0.5); - Standard_Real SmallDist = .001; - Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, - Middle.X() - SmallDist, - Middle.Y() - SmallDist, - Middle.Z() - SmallDist, - Middle.X() + SmallDist, - Middle.Y() + SmallDist, - Middle.Z() + SmallDist ); - aSelection->Add(box); - - if (myFShape.ShapeType() == TopAbs_EDGE){ - BRepAdaptor_Curve aCurve(TopoDS::Edge(myFShape)); - if (aCurve.GetType() == GeomAbs_Line){ - //add sensetive element - line - seg = new Select3D_SensitiveSegment( own, myAttachPoint1, myPoint1); - aSelection->Add( seg ); - } - else if (aCurve.GetType() == GeomAbs_Circle){ - Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); - Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint1), - LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint1); - if (LastPar < FirstPar ) LastPar+=M_PI*2; - //add sensetive arc - Handle(Select3D_SensitiveCircle) circ = - new Select3D_SensitiveCircle( own, aCircle, FirstPar, LastPar); - aSelection->Add( circ ); - } - } - else { - seg = new Select3D_SensitiveSegment( own, myAttachPoint1, myPoint1); - aSelection->Add( seg ); - } - - if (mySShape.ShapeType() == TopAbs_EDGE){ - BRepAdaptor_Curve aCurve(TopoDS::Edge(mySShape)); - if (aCurve.GetType() == GeomAbs_Line) { - //add sensetive element - line - seg = new Select3D_SensitiveSegment( own, myAttachPoint2, myPoint2); - aSelection->Add( seg ); - } - else if (aCurve.GetType() == GeomAbs_Circle){ - Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); - Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint2), - LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint2); - if (LastPar < FirstPar ) LastPar+=M_PI*2; - //add sensetive arc - Handle(Select3D_SensitiveCircle) circ = - new Select3D_SensitiveCircle( own,aCircle, FirstPar, LastPar); - aSelection->Add( circ ); - } - } - else { - seg = new Select3D_SensitiveSegment( own, myAttachPoint2, myPoint2); - aSelection->Add( seg ); - } - - if (myShape3.ShapeType() == TopAbs_EDGE){ - BRepAdaptor_Curve aCurve(TopoDS::Edge(myShape3)); - if (aCurve.GetType() == GeomAbs_Line) { - //add sensetive element - line - seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); - aSelection->Add( seg ); - } - else if (aCurve.GetType() == GeomAbs_Circle){ - Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); - Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint3), - LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint3); - if (LastPar < FirstPar ) LastPar+=M_PI*2; - Handle(Select3D_SensitiveCircle) circ = - new Select3D_SensitiveCircle( own, aCircle, FirstPar, LastPar); - aSelection->Add( circ ); - } - else { - seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); - aSelection->Add( seg ); - } - } - else { - seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); - aSelection->Add( seg ); - } - - if (myShape4.ShapeType() == TopAbs_EDGE){ - BRepAdaptor_Curve aCurve(TopoDS::Edge(myShape4)); - if (aCurve.GetType() == GeomAbs_Line) { - //add sensetive element - line - seg = new Select3D_SensitiveSegment( own, myAttachPoint4, myPoint4); - aSelection->Add( seg ); - } - else if (aCurve.GetType() == GeomAbs_Circle){ - Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); - Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint4), - LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint4); - if (LastPar < FirstPar ) LastPar+=M_PI*2; - //add sensetive arc - Handle(Select3D_SensitiveCircle) circ = - new Select3D_SensitiveCircle( own,aCircle, FirstPar, LastPar); - aSelection->Add( circ ); - } - } - else { - seg = new Select3D_SensitiveSegment( own, myAttachPoint4, myPoint4); - aSelection->Add( seg ); - } -} - -//======================================================================= -//function : ComputeTwoEdgesLength -//purpose : -//======================================================================= -void AIS_EqualDistanceRelation::ComputeTwoEdgesLength( const Handle( Prs3d_Presentation )& aPresentation, - const Handle( Prs3d_Drawer )& aDrawer, - const Standard_Real ArrowSize, - const TopoDS_Edge & FirstEdge, - const TopoDS_Edge & SecondEdge, - const Handle( Geom_Plane )& Plane, - const Standard_Boolean AutomaticPos, - const Standard_Boolean IsSetBndBox, - const Bnd_Box & BndBox, - gp_Pnt& Position, - gp_Pnt& FirstAttach, - gp_Pnt& SecondAttach, - gp_Pnt& FirstExtreme, - gp_Pnt& SecondExtreme, - DsgPrs_ArrowSide & SymbolPrs ) -{ - gp_Dir DirAttach; - BRepAdaptor_Curve cu1( FirstEdge ); - BRepAdaptor_Curve cu2( SecondEdge ); - - // 3d lines - Handle(Geom_Curve) geom1,geom2; - gp_Pnt ptat11,ptat12,ptat21,ptat22; - - Standard_Boolean isInfinite1(Standard_False),isInfinite2(Standard_False); - Handle(Geom_Curve) extCurv; - Standard_Real arrsize = ArrowSize;// size - Standard_Real Val=0.; - Standard_Boolean isInPlane1, isInPlane2; - - if(!AIS::ComputeGeometry(FirstEdge,geom1, ptat11, ptat12,extCurv,isInfinite1,isInPlane1, Plane )) - return; - if(!AIS::ComputeGeometry(SecondEdge, geom2, ptat21, ptat22, extCurv, isInfinite2,isInPlane2, Plane)) - return; - - aPresentation->SetInfiniteState(isInfinite1 || isInfinite2); - - if (cu1.GetType() == GeomAbs_Line && cu2.GetType() == GeomAbs_Line) - { - Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); - Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); - const gp_Lin& l1 = geom_lin1->Lin(); - const gp_Lin& l2 = geom_lin2->Lin(); - - //Get Val value - Val = l1.Distance( l2 ); - - DirAttach = l1.Direction(); - - if (AutomaticPos) { - // compute position of offset point - gp_Pnt curpos; - Standard_Real par1=0., par2=0.; - if(!(isInfinite1 || isInfinite2)) - { - par1 = ElCLib::Parameter(l1,ptat11); - par2 = ElCLib::Parameter(l1,ptat21); - if (par1 Pln() ); - } - - // find attach points - if (!isInfinite1) { - if (Position.Distance(ptat11) > Position.Distance(ptat12)) FirstAttach = ptat12; - else FirstAttach = ptat11; - } - else { - FirstAttach = ElCLib::Value(ElCLib::Parameter(l1,Position),l1); - } - - if (!isInfinite2) { - if (Position.Distance(ptat21) > Position.Distance(ptat22)) SecondAttach = ptat22; - else SecondAttach = ptat21; - } - else { - SecondAttach = ElCLib::Value(ElCLib::Parameter(l2,Position),l2); - } - - Standard_Real confusion(Precision::Confusion()); - if (arrsize < confusion) arrsize = Val*0.1; - if (Abs(Val) <= confusion) {arrsize = 0.;} - - Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(arrsize); - arr = la->ArrowAspect(); - arr->SetLength(arrsize); - - if (AutomaticPos && IsSetBndBox) - Position = AIS::TranslatePointToBound( Position, DirAttach, BndBox ); - - DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, - aDrawer, - FirstAttach, - SecondAttach, - DirAttach, - Position, - SymbolPrs, - FirstExtreme, - SecondExtreme); - - -} - if (cu1.GetType() == GeomAbs_Circle && cu2.GetType() == GeomAbs_Circle){ - //Get first and last points of circles - Handle(Geom_Circle) aCir1 (Handle(Geom_Circle)::DownCast(geom1)); - Handle(Geom_Circle) aCir2 (Handle(Geom_Circle)::DownCast(geom2)); - gp_Circ aCirc1 = aCir1->Circ(); - gp_Circ aCirc2 = aCir2->Circ(); - - //To avoid circles with different orientaion - Standard_Real aTol = Precision::Confusion(); - if(aCirc2.Axis().IsOpposite(aCirc1.Axis(), aTol) || - aCirc2.XAxis().IsOpposite(aCirc1.XAxis(), aTol) || - aCirc2.YAxis().IsOpposite(aCirc1.YAxis(), aTol) ) - { - aCirc2.SetPosition(aCirc1.Position()); - aCirc2.SetAxis(aCirc1.Axis()); - } - - if (AutomaticPos){ - Standard_Real par1 = 0, par2 = 0; - gp_Pln aPln = Plane->Pln(); - //Project ptat12 and ptat22 on constraint plane - gp_Pnt PrPnt12 = AIS::ProjectPointOnPlane(ptat12, aPln); - gp_Pnt PrPnt22 = AIS::ProjectPointOnPlane(ptat22, aPln); - //Project circles center on constraint plane - gp_Pnt PrCenter = AIS::ProjectPointOnPlane(aCirc1.Location(), aPln); - - gp_Dir XDir = aPln.XAxis().Direction(); - gp_Dir YDir = aPln.YAxis().Direction(); - - - if (PrPnt12.Distance(PrCenter) >Precision::Confusion()) - { - gp_Dir aDir1(PrPnt12.XYZ() - PrCenter.XYZ()); - Standard_Real anAngle = aDir1.Angle(XDir); //Get the angle in range [0, M_PI] - if (aDir1.Dot(YDir) < 0) - anAngle = 2 * M_PI - anAngle; - par1 = anAngle; - } - - if (PrPnt22.Distance(PrCenter) >Precision::Confusion()) - { - gp_Dir aDir2(PrPnt22.XYZ() - PrCenter.XYZ()); - Standard_Real anAngle = aDir2.Angle(XDir); //Get the angle in range [0, M_PI] - if (aDir2.Dot(YDir) < 0) - anAngle = 2 * M_PI - anAngle; - par2 = anAngle; - } - - - if(par1 > par2 ){ - FirstExtreme = ptat12; - Standard_Real aPar1 = ElCLib::Parameter(aCirc2, ptat12); - SecondExtreme = ElCLib::Value(aPar1, aCirc2); - } - else { - Standard_Real aPar2 = ElCLib::Parameter(aCirc1, ptat22); - FirstExtreme = ElCLib::Value(aPar2, aCirc1); - SecondExtreme = ptat22; - } - } - else { - Standard_Real pospar = ElCLib::Parameter(aCirc1, Position); - FirstExtreme = ElCLib::Value(pospar, aCirc1); - pospar = ElCLib::Parameter(aCirc2, Position); - SecondExtreme = ElCLib::Value(pospar, aCirc2); - } - - DsgPrs_EqualDistancePresentation::AddIntervalBetweenTwoArcs(aPresentation, - aDrawer, - aCirc1, - aCirc2, - ptat12, - FirstExtreme, - ptat22, - SecondExtreme, - SymbolPrs); - - FirstAttach = ptat12; SecondAttach = ptat22; //assign attach points - Position.SetXYZ( (FirstAttach.XYZ() + SecondAttach.XYZ())*0.5); - } - - if (arrsize < Precision::Confusion()) arrsize = Val*0.1; - if (Abs(Val) <= Precision::Confusion()) {arrsize = 0.;} - -// gp_Pnt pf, pl; - if (!isInPlane1) { - AIS::ComputeProjEdgePresentation( aPresentation, aDrawer, FirstEdge, geom1, ptat11, ptat12); - } - if(!isInPlane2) { - AIS::ComputeProjEdgePresentation( aPresentation, aDrawer, SecondEdge, geom2, ptat21, ptat22); - } -} - -//======================================================================= -//function : ComputeTwoVerticesLength -//purpose : -//======================================================================= - -void AIS_EqualDistanceRelation::ComputeTwoVerticesLength( const Handle( Prs3d_Presentation )& aPresentation, - const Handle( Prs3d_Drawer )& aDrawer, - const Standard_Real ArrowSize, - const TopoDS_Vertex& FirstVertex, - const TopoDS_Vertex& SecondVertex, - const Handle( Geom_Plane )& Plane, - const Standard_Boolean AutomaticPos, - const Standard_Boolean IsSetBndBox, - const Bnd_Box& BndBox, - const AIS_TypeOfDist TypeDist, - gp_Pnt& Position, - gp_Pnt& FirstAttach, - gp_Pnt& SecondAttach, - gp_Pnt& FirstExtreme, - gp_Pnt& SecondExtreme, - DsgPrs_ArrowSide& SymbolPrs ) -{ - Standard_Boolean isOnPlane1, isOnPlane2; - gp_Dir DirAttach; - AIS::ComputeGeometry( FirstVertex, FirstAttach, Plane, isOnPlane1); - AIS::ComputeGeometry( SecondVertex, SecondAttach, Plane, isOnPlane2); - - Standard_Real confusion(Precision::Confusion()); - Standard_Boolean samePoint(FirstAttach.IsEqual(SecondAttach,confusion)); - - if (TypeDist == AIS_TOD_Vertical) DirAttach = Plane->Pln().XAxis().Direction(); - else if (TypeDist == AIS_TOD_Horizontal) DirAttach = Plane->Pln().YAxis().Direction(); - else { - if (!samePoint) { - DirAttach.SetXYZ(SecondAttach.XYZ() - FirstAttach.XYZ()); - DirAttach.Rotate(Plane->Pln().Axis(),M_PI/2.); - } - } - - // size - if (AutomaticPos) { - if (!samePoint) { - gp_Pnt curpos((FirstAttach.XYZ()+SecondAttach.XYZ())*0.5); - // make offset of curpos - gp_Vec offset(DirAttach); - offset = offset*ArrowSize*(-10.); - curpos.Translate(offset); - Position = curpos; - } - else { - gp_Dir aDir = Plane->Pln().Axis().Direction(); - gp_Vec aVec (aDir.XYZ()*10*ArrowSize); - //Position = gp_Pnt(FirstAttach.XYZ()+gp_XYZ(1.,1.,1.)); // not correct - Position = FirstAttach.Translated(aVec); - Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() );//not needed really - DirAttach.SetXYZ(Position.XYZ() - FirstAttach.XYZ()); - } - } - else { - Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() ); - } - - - Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(ArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(ArrowSize); - - if (AutomaticPos && IsSetBndBox) - Position = AIS::TranslatePointToBound( Position, DirAttach, BndBox ); - - DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, - aDrawer, - FirstAttach, - SecondAttach, - DirAttach, - Position, - SymbolPrs, - FirstExtreme, //returned - SecondExtreme); //returned - - // Compute projection - if ( !isOnPlane1) - AIS::ComputeProjVertexPresentation(aPresentation, aDrawer, FirstVertex, FirstAttach); - if ( !isOnPlane2) - AIS::ComputeProjVertexPresentation(aPresentation, aDrawer, SecondVertex, SecondAttach); - -} - - -//======================================================================= -//function : ComputeOneEdgeOneVertexLength -//purpose : -//======================================================================= - -void AIS_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( const Handle( Prs3d_Presentation )& aPresentation, - const Handle( Prs3d_Drawer )& aDrawer, - const Standard_Real ArrowSize, - const TopoDS_Shape & FirstShape, - const TopoDS_Shape & SecondShape, - const Handle( Geom_Plane )& Plane, - const Standard_Boolean AutomaticPos, - const Standard_Boolean IsSetBndBox, - const Bnd_Box & BndBox, - gp_Pnt & Position, - gp_Pnt & FirstAttach, - gp_Pnt & SecondAttach, - gp_Pnt& FirstExtreme, - gp_Pnt& SecondExtreme, - DsgPrs_ArrowSide & SymbolPrs ) -{ - TopoDS_Vertex thevertex; - TopoDS_Edge theedge; - - gp_Pnt ptonedge1,ptonedge2; - Handle(Geom_Curve) aCurve; - Handle(Geom_Curve) extCurv; - Standard_Boolean isInfinite; - Standard_Real Val; - Standard_Boolean isOnPlanEdge, isOnPlanVertex; - Standard_Integer edgenum ; - - if (FirstShape.ShapeType() == TopAbs_VERTEX) { - thevertex = TopoDS::Vertex(FirstShape); - theedge = TopoDS::Edge(SecondShape); - edgenum = 2; //edge is the second shape - } - else { - thevertex = TopoDS::Vertex(SecondShape); - theedge = TopoDS::Edge(FirstShape); - edgenum = 1;//edge is the first shape - } - if (!AIS::ComputeGeometry(theedge,aCurve,ptonedge1,ptonedge2,extCurv,isInfinite,isOnPlanEdge,Plane)) - return; - aPresentation->SetInfiniteState(isInfinite); - AIS::ComputeGeometry(thevertex, FirstAttach, Plane, isOnPlanVertex); - - if ( aCurve->IsInstance(STANDARD_TYPE(Geom_Line)) ) - { - Handle(Geom_Line) geom_lin (Handle(Geom_Line)::DownCast (aCurve)); - const gp_Lin& l = geom_lin->Lin(); - - // computation of Val - Val = l.Distance( FirstAttach ); - - gp_Dir DirAttach = l.Direction(); - // size - Standard_Real arrsize = ArrowSize; - if (Abs(Val) <= Precision::Confusion()) {arrsize = 0.;} - - if (AutomaticPos) { - gp_Pnt p = ElCLib::Value(ElCLib::Parameter(l,FirstAttach),l); - gp_Pnt curpos((FirstAttach.XYZ()+p.XYZ())*0.5); - // make offset - gp_Vec offset(DirAttach); - offset = offset*ArrowSize*(-10.); - curpos.Translate(offset); - Position = curpos; - } - else { // project point on the plane - Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() ); - } - - if (!isInfinite) { - if (Position.Distance(ptonedge1) > Position.Distance(ptonedge2)) SecondAttach = ptonedge2; - else SecondAttach = ptonedge1; - } - else { - SecondAttach = ElCLib::Value(ElCLib::Parameter(l,Position),l); - } - - Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(arrsize); - arr = la->ArrowAspect(); - arr->SetLength(arrsize); - - if (AutomaticPos && IsSetBndBox) - Position = AIS::TranslatePointToBound( Position, DirAttach, BndBox ); - DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, - aDrawer, - FirstAttach, - SecondAttach, - DirAttach, - Position, - SymbolPrs, - FirstExtreme, - SecondExtreme); - -} - if (aCurve->IsInstance(STANDARD_TYPE(Geom_Circle))){ - gp_Circ aCirc1 = (Handle(Geom_Circle)::DownCast(aCurve))->Circ(); - gp_Circ aCirc2(aCirc1); aCirc2.SetRadius(0); //create the second formal circle - if(AutomaticPos) - { - SecondAttach = ptonedge2; //a vertex - Position.SetXYZ((SecondAttach.XYZ() + aCirc1.Location().XYZ())*0.5); - } - else { - Standard_Real aPar = ElCLib::Parameter(aCirc1, Position); - SecondAttach = ElCLib::Value(aPar, aCirc1); - } - - Handle(Geom_Circle) aCurve2 = new Geom_Circle(aCirc2); - DsgPrs_EqualDistancePresentation::AddIntervalBetweenTwoArcs(aPresentation, - aDrawer, - aCirc1, //circle or arc - aCirc2, //really vertex - ptonedge2, //last point of aCirc1 - SecondAttach, - FirstAttach, //vertex really - FirstAttach, - SymbolPrs); - - //Assign arc points - if (edgenum == 1){ - FirstExtreme = SecondAttach; SecondExtreme = FirstAttach; - SecondAttach = FirstAttach; FirstAttach = ptonedge2; - } else { //vertex is the first shape, circle is sthe last. - FirstExtreme = FirstAttach; SecondExtreme = SecondAttach; - SecondAttach = ptonedge2; - } - } - - // computation of Val - Val = FirstAttach.Distance(SecondAttach); - - //Display the pieces of attached to the curve if it is not - // in the WP - if (!isOnPlanEdge) { // add presentation of projection of the edge in WP - AIS::ComputeProjEdgePresentation(aPresentation,aDrawer,theedge,aCurve,ptonedge1,ptonedge2); - } - if (!isOnPlanVertex) { // add presentation of projection of the vertex in WP - AIS::ComputeProjVertexPresentation(aPresentation,aDrawer,thevertex,FirstAttach); - } - -} -// -- ota -- end diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1998-01-24 -// Created by: Julia GERASIMOVA -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,94 +14,9 @@ #ifndef _AIS_EqualDistanceRelation_HeaderFile #define _AIS_EqualDistanceRelation_HeaderFile -#include -#include -#include +#include -class Geom_Plane; - -DEFINE_STANDARD_HANDLE(AIS_EqualDistanceRelation, AIS_Relation) - -//! A framework to display equivalent distances between -//! shapes and a given plane. -//! The distance is the length of a projection from the -//! shape to the plane. -//! These distances are used to compare shapes by this vector alone. -class AIS_EqualDistanceRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_EqualDistanceRelation,AIS_Relation) -public: - - //! Constructs a framework to display equivalent - //! distances between the shapes aShape1, aShape2, - //! aShape3, aShape4 and the plane aPlane. - //! The distance is the length of a projection from the - //! shape to the plane. - Standard_EXPORT AIS_EqualDistanceRelation(const TopoDS_Shape& aShape1, const TopoDS_Shape& aShape2, const TopoDS_Shape& aShape3, const TopoDS_Shape& aShape4, const Handle(Geom_Plane)& aPlane); - - - //! Sets the shape aShape to be used as the shape - //! aShape3 in the framework created at construction time. - void SetShape3 (const TopoDS_Shape& aShape); - - - //! Returns the shape aShape3 from the framework - //! created at construction time. - const TopoDS_Shape& Shape3() const; - - - //! Sets the shape aShape to be used as the shape - //! aShape4 in the framework created at construction time. - void SetShape4 (const TopoDS_Shape& aShape); - - - //! Returns the shape aShape4 from the framework - //! created at construction time. - const TopoDS_Shape& Shape4() const; - - //! Computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - //! Computes the location of an intreval between - //! between two edges. FirstAttach , SecondAttach - //! are the returned extreme points of the interval. - Standard_EXPORT static void ComputeTwoEdgesLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Edge& FirstEdge, const TopoDS_Edge& SecondEdge, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); - - //! Computes the interval position between two vertexs. FirstAttach, - //! SecondAttach are the returned extreme points of the interval. - Standard_EXPORT static void ComputeTwoVerticesLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Vertex& FirstVertex, const TopoDS_Vertex& SecondVertex, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, const AIS_TypeOfDist TypeDist, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); - - //! Compute the interval location between a vertex and an edge. Edge may be - //! a line or a circle. - Standard_EXPORT static void ComputeOneEdgeOneVertexLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - TopoDS_Shape myShape3; - TopoDS_Shape myShape4; - gp_Pnt myAttachPoint1; - gp_Pnt myAttachPoint2; - gp_Pnt myAttachPoint3; - gp_Pnt myAttachPoint4; - gp_Pnt myPoint1; - gp_Pnt myPoint2; - gp_Pnt myPoint3; - gp_Pnt myPoint4; - -}; - -#include +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_EqualDistanceRelation AIS_EqualDistanceRelation; #endif // _AIS_EqualDistanceRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.lxx opencascade-7.5.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.lxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_EqualDistanceRelation.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -// Created on: 1998-01-24 -// Created by: Julia GERASIMOVA -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : SetShape3 -//purpose : -//======================================================================= - -inline void AIS_EqualDistanceRelation::SetShape3( const TopoDS_Shape& aShape ) -{ - myShape3 = aShape; -} - -//======================================================================= -//function : Shape3 -//purpose : -//======================================================================= - -inline const TopoDS_Shape& AIS_EqualDistanceRelation::Shape3() const -{ - return myShape3; -} - - -//======================================================================= -//function : SetShape4 -//purpose : -//======================================================================= - -inline void AIS_EqualDistanceRelation::SetShape4( const TopoDS_Shape& aShape ) -{ - myShape4 = aShape; -} - -//======================================================================= -//function : Shape4 -//purpose : -//======================================================================= - -inline const TopoDS_Shape& AIS_EqualDistanceRelation::Shape4() const -{ - return myShape4; -} - diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_EqualRadiusRelation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_EqualRadiusRelation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_EqualRadiusRelation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_EqualRadiusRelation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,249 +0,0 @@ -// Created on: 1998-01-20 -// Created by: Julia GERASIMOVA -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_EqualRadiusRelation,AIS_Relation) - -//======================================================================= -//function : AIS_EqualRadiusRelation -//purpose : -//======================================================================= -AIS_EqualRadiusRelation::AIS_EqualRadiusRelation( const TopoDS_Edge& aFirstEdge, - const TopoDS_Edge& aSecondEdge, - const Handle( Geom_Plane )& aPlane ) - :AIS_Relation() -{ - myFShape = aFirstEdge; - mySShape = aSecondEdge; - myPlane = aPlane; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_EqualRadiusRelation::Compute( const Handle( PrsMgr_PresentationManager3d )&, - const Handle( Prs3d_Presentation )& aPresentation, - const Standard_Integer ) -{ - BRepAdaptor_Curve FirstCurve( TopoDS::Edge( myFShape ) ), SecondCurve( TopoDS::Edge( mySShape ) ); - - Standard_Real FirstPar1 = FirstCurve.FirstParameter(), LastPar1 = FirstCurve.LastParameter(), - FirstPar2 = SecondCurve.FirstParameter(), LastPar2 = SecondCurve.LastParameter(); - - Handle( Geom_Curve ) FirstProjCurve = FirstCurve.Curve().Curve(), - SecondProjCurve = SecondCurve.Curve().Curve(); - gp_Pnt FirstPoint1, LastPoint1, FirstPoint2, LastPoint2; - Standard_Boolean isFirstOnPlane, isSecondOnPlane; - - AIS::ComputeGeomCurve( FirstProjCurve, FirstPar1, LastPar1, FirstPoint1, LastPoint1, myPlane, isFirstOnPlane ); - AIS::ComputeGeomCurve( SecondProjCurve, FirstPar2, LastPar2, FirstPoint2, LastPoint2, myPlane, isSecondOnPlane ); - - if (!isFirstOnPlane) - ComputeProjEdgePresentation( aPresentation, TopoDS::Edge( myFShape ), FirstProjCurve, FirstPoint1, LastPoint1 ); - if (! isSecondOnPlane) - ComputeProjEdgePresentation( aPresentation, TopoDS::Edge( mySShape ), SecondProjCurve, FirstPoint2, LastPoint2 ); - - gp_Circ FirstCirc = (Handle( Geom_Circle )::DownCast( FirstProjCurve ))->Circ(); - gp_Circ SecondCirc = (Handle( Geom_Circle )::DownCast( SecondProjCurve ))->Circ(); - - myFirstCenter = FirstCirc.Location(); - mySecondCenter = SecondCirc.Location(); - - //ota -- begin -- - if (myAutomaticPosition) - { - myFirstPoint = ElCLib::Value( (FirstPar1 + LastPar1)*0.5, FirstCirc ); - mySecondPoint = ElCLib::Value( (FirstPar2 + LastPar2)*0.5, SecondCirc ); - } - else { - Standard_Real aPar = ElCLib::Parameter(FirstCirc, myFirstPoint); - if (IntegerPart(0.5*LastPar1/M_PI) != 0 && aPar < FirstPar1 ) - aPar +=2*M_PI*IntegerPart(0.5*LastPar1/M_PI); - Standard_Real aRadius = FirstCirc.Radius(); - - if (Abs(myFirstPoint.Distance(myFirstCenter) - aRadius) >= Precision::Confusion()) - myFirstPoint = ElCLib::Value(aPar, FirstCirc); - if ( FirstPoint1.Distance(LastPoint1) > Precision::Confusion()){ - //check where is myFirstPoint - if (aPar > LastPar1 || aPar < FirstPar1) - { - //myFirstPoint is out of Arc of FirstCircle - if (FirstPoint1.Distance(myFirstPoint)< LastPoint1.Distance(myFirstPoint)) - myFirstPoint = FirstPoint1; - else - myFirstPoint = LastPoint1; - } - } - - - aPar = ElCLib::Parameter(SecondCirc, mySecondPoint); - if (IntegerPart(0.5*LastPar2/M_PI) != 0 && aPar < FirstPar2 ) - aPar +=2*M_PI*IntegerPart(0.5*LastPar2/M_PI); - - aRadius = SecondCirc.Radius(); - if (Abs(mySecondPoint.Distance(mySecondCenter) - aRadius) >= Precision::Confusion()) - mySecondPoint = ElCLib::Value(aPar, SecondCirc); - if (FirstPoint2.Distance(LastPoint2) > Precision::Confusion()){ - if (aPar > LastPar2 || aPar < FirstPar2) - { //mySecondPoint is out of Arc of mySecondCircle - if (FirstPoint2.Distance(mySecondPoint)< LastPoint2.Distance(mySecondPoint)) - mySecondPoint = FirstPoint2; - else - mySecondPoint = LastPoint2; - } - } - } - if( !myArrowSizeIsDefined ) - myArrowSize = (Min(myFirstCenter.Distance(myFirstPoint), - mySecondCenter.Distance(mySecondPoint)))*0.05; - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - - //ota -- end -- - - DsgPrs_EqualRadiusPresentation::Add(aPresentation, myDrawer, - myFirstCenter, mySecondCenter, myFirstPoint, mySecondPoint, myPlane ); -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning at compilation (SUN) -//======================================================================= - -void AIS_EqualRadiusRelation::Compute( const Handle( Prs3d_Projector )& /*aProjector*/, - const Handle( Prs3d_Presentation )& /*aPresentation*/) -{ -// throw Standard_NotImplemented("AIS_EqualRadiusRelation::Compute( const Handle( Prs3d_Projector )&,const Handle( Prs3d_Presentation )& )"); -// PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_EqualRadiusRelation::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Geom_Transformation)& aTransformation, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_EqualRadiusRelation::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_EqualRadiusRelation::ComputeSelection( const Handle( SelectMgr_Selection )& aSelection, - const Standard_Integer ) -{ - Handle( SelectMgr_EntityOwner ) own = new SelectMgr_EntityOwner( this, 7 ); - Handle( Select3D_SensitiveSegment ) seg; - - seg = new Select3D_SensitiveSegment( own, myFirstCenter, myFirstPoint ); - aSelection->Add( seg ); - - if(!myAutomaticPosition) - ComputeRadiusPosition(); - - seg = new Select3D_SensitiveSegment( own, mySecondCenter, mySecondPoint ); - aSelection->Add( seg ); - - seg = new Select3D_SensitiveSegment( own, myFirstCenter, mySecondCenter ); - aSelection->Add( seg ); - - - // Two small lines - gp_Pnt Middle( (myFirstCenter.XYZ() + mySecondCenter.XYZ())*0.5 ); - - Standard_Real SmallDist = .001; - //Should be changed as the domain of small lines could be changed. - Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox(own, - Middle.X() - SmallDist, - Middle.Y() - SmallDist, - Middle.Z() - SmallDist, - Middle.X() + SmallDist, - Middle.Y() + SmallDist, - Middle.Z() + SmallDist ); - aSelection->Add(box); -} - -//================================================================= -//function : ComputeRadiusPosition -//purpose : -//================================================================= -void AIS_EqualRadiusRelation::ComputeRadiusPosition() -{ - if (myAutomaticPosition || - myFirstCenter.Distance(myPosition) < Precision::Confusion() || - mySecondCenter.Distance(myPosition) < Precision::Confusion()) - return; - - gp_Pnt aPosition; - - //project myPosition to the plane of constraint - GeomAPI_ProjectPointOnSurf aProj(myPosition, myPlane); - aPosition = aProj.NearestPoint(); - - Standard_Real aDist1 = myFirstPoint.Distance(aPosition); - Standard_Real aDist2 = mySecondPoint.Distance(aPosition); - - if(aDist1 +#include -class Geom_Plane; - -DEFINE_STANDARD_HANDLE(AIS_EqualRadiusRelation, AIS_Relation) - -class AIS_EqualRadiusRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_EqualRadiusRelation, AIS_Relation) -public: - - //! Creates equal relation of two arc's radiuses. - //! If one of edges is not in the given plane, - //! the presentation method projects it onto the plane. - Standard_EXPORT AIS_EqualRadiusRelation(const TopoDS_Edge& aFirstEdge, const TopoDS_Edge& aSecondEdge, const Handle(Geom_Plane)& aPlane); - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeRadiusPosition(); - - gp_Pnt myFirstCenter; - gp_Pnt mySecondCenter; - gp_Pnt myFirstPoint; - gp_Pnt mySecondPoint; - -}; +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_EqualRadiusRelation AIS_EqualRadiusRelation; #endif // _AIS_EqualRadiusRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_FixRelation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_FixRelation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_FixRelation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_FixRelation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,604 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_FixRelation,AIS_Relation) - -static Standard_Boolean InDomain(const Standard_Real fpar, - const Standard_Real lpar, - const Standard_Real para) -{ - if (fpar >= 0.) { - return ((para >= fpar) && (para <= lpar)); - } - if (para >= (fpar+2*M_PI)) return Standard_True; - if (para <= lpar) return Standard_True; - return Standard_False; -} - -//======================================================================= -//function : Constructor -//purpose : vertex Fix Relation -//======================================================================= - -AIS_FixRelation::AIS_FixRelation(const TopoDS_Shape& aShape, - const Handle(Geom_Plane)& aPlane, - const TopoDS_Wire& aWire) -:AIS_Relation(), - myWire(aWire) -{ - myFShape = aShape; - myPlane = aPlane; - myAutomaticPosition = Standard_True; - myArrowSize = 5.; -} - -//======================================================================= -//function : Constructor -//purpose : vertex Fix Relation -//======================================================================= - -AIS_FixRelation::AIS_FixRelation(const TopoDS_Shape& aShape, - const Handle(Geom_Plane)& aPlane, - const TopoDS_Wire& aWire, - const gp_Pnt& aPosition, - const Standard_Real anArrowSize) -:AIS_Relation(), - myWire(aWire) -{ - myFShape = aShape; - myPlane = aPlane; - myPosition = aPosition; - SetArrowSize( anArrowSize ); - myAutomaticPosition = Standard_False; -} - - -//======================================================================= -//function : Constructor -//purpose : edge (line or circle) Fix Relation -//======================================================================= - -AIS_FixRelation::AIS_FixRelation(const TopoDS_Shape& aShape, - const Handle(Geom_Plane)& aPlane) -{ - myFShape = aShape; - myPlane = aPlane; - myAutomaticPosition = Standard_True; - myArrowSize = 5.; -} - -//======================================================================= -//function : Constructor -//purpose : edge (line or circle) Fix Relation -//======================================================================= - -AIS_FixRelation::AIS_FixRelation( - const TopoDS_Shape& aShape, - const Handle(Geom_Plane)& aPlane, - const gp_Pnt& aPosition, - const Standard_Real anArrowSize) -{ - myFShape = aShape; - myPlane = aPlane; - myPosition = aPosition; - SetArrowSize( anArrowSize ); - myAutomaticPosition = Standard_False; -} - -//======================================================================= -//function : Wire -//purpose : -//======================================================================= - -TopoDS_Wire AIS_FixRelation::Wire() -{ - return myWire; -} - -//======================================================================= -//function : SetWire -//purpose : -//======================================================================= - -void AIS_FixRelation::SetWire(const TopoDS_Wire& aWire) -{ - myWire = aWire; -} - - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_FixRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - // Calculate position of the symbol and - // point of attach of the segment on the shape - gp_Pnt curpos; - if (myFShape.ShapeType() == TopAbs_VERTEX) - ComputeVertex(TopoDS::Vertex(myFShape), curpos); - else if (myFShape.ShapeType() == TopAbs_EDGE) - ComputeEdge(TopoDS::Edge(myFShape), curpos); - - const gp_Dir& nor = myPlane->Axis().Direction(); - - - // calculate presentation - // definition of the symbol size - if( !myArrowSizeIsDefined ) - myArrowSize = 5.; - - //creation of the presentation - DsgPrs_FixPresentation::Add(aPresentation, - myDrawer, - myPntAttach, - curpos, - nor, - myArrowSize); -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= - -void AIS_FixRelation::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_FixRelation::Compute(const Handle(Prs3d_Projector)&,const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_FixRelation::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Geom_Transformation)& aTransformation, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_FixRelation::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_FixRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - - // creation of segment sensible for the linked segment - // of the shape fixed to symbol 'Fix' - Handle(Select3D_SensitiveSegment) seg; - seg = new Select3D_SensitiveSegment(own, - myPntAttach, - myPosition); - aSelection->Add(seg); - - // Creation of the sensible zone of symbol 'Fix' - gp_Dir norm = myPlane->Axis().Direction(); - - gp_Vec dirac(myPntAttach,myPosition); - dirac.Normalize(); - gp_Vec norac = dirac.Crossed(gp_Vec(norm)); - gp_Ax1 ax(myPosition, norm); - norac.Rotate(ax, M_PI/8); - - norac*=(myArrowSize/2); - gp_Pnt P1 = myPosition.Translated(norac); - gp_Pnt P2 = myPosition.Translated(-norac); - seg = new Select3D_SensitiveSegment(own, - P1, - P2); - aSelection->Add(seg); - - norac*=0.8; - P1 = myPosition.Translated(norac); - P2 = myPosition.Translated(-norac); - dirac*=(myArrowSize/2); - gp_Pnt PF(P1.XYZ()); - gp_Pnt PL = PF.Translated(dirac); - PL.Translate(norac); - seg = new Select3D_SensitiveSegment(own, - PF, - PL); - aSelection->Add(seg); - - - PF.SetXYZ(P2.XYZ()); - PL = PF.Translated(dirac); - PL.Translate(norac); - seg = new Select3D_SensitiveSegment(own, - PF, - PL); - aSelection->Add(seg); - - PF.SetXYZ( (P1.XYZ() + P2.XYZ()) /2 ); - PL = PF.Translated(dirac); - PL.Translate(norac); - seg = new Select3D_SensitiveSegment(own, - PF, - PL); -} - -//======================================================================= -//function : ComputeVertex -//purpose : computes myPntAttach and the position of the presentation -// when you fix a vertex -//======================================================================= - -void AIS_FixRelation::ComputeVertex(const TopoDS_Vertex& /*FixVertex*/, - gp_Pnt& curpos) -{ - myPntAttach = BRep_Tool::Pnt(TopoDS::Vertex(myFShape)); - curpos = myPosition; - if (myAutomaticPosition) { - gp_Pln pln(myPlane->Pln()); - gp_Dir dir(pln.XAxis().Direction()); - gp_Vec transvec = gp_Vec(dir)*myArrowSize; - curpos = myPntAttach.Translated(transvec);; - myPosition = curpos; - myAutomaticPosition = Standard_True; - } -} - -//======================================================================= -//function : ComputePosition -//purpose : -//======================================================================= - -gp_Pnt AIS_FixRelation::ComputePosition(const Handle(Geom_Curve)& curv1, - const Handle(Geom_Curve)& curv2, - const gp_Pnt& firstp1, - const gp_Pnt& lastp1, - const gp_Pnt& firstp2, - const gp_Pnt& lastp2) const -{ - //--------------------------------------------------------- - // calculate the point of attach - //--------------------------------------------------------- - gp_Pnt curpos; - - if (curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) || curv2->IsInstance(STANDARD_TYPE(Geom_Circle))) { - Handle(Geom_Circle) gcirc = Handle(Geom_Circle)::DownCast(curv1); - if (gcirc.IsNull()) gcirc = Handle(Geom_Circle)::DownCast(curv2); - gp_Dir dir( gcirc->Location().XYZ() + myPntAttach.XYZ() ); - gp_Vec transvec = gp_Vec(dir)*myArrowSize; - curpos = myPntAttach.Translated(transvec); - } - - else { - gp_Vec vec1(firstp1,lastp1); - gp_Vec vec2(firstp2,lastp2); - - if (!vec1.IsParallel(vec2, Precision::Angular()) ) { - gp_Dir dir; - Standard_Real conf =Precision::Confusion(); - if (lastp1.IsEqual(firstp2,conf) || firstp1.IsEqual(lastp2,conf)) dir.SetXYZ(vec1.XYZ() - vec2.XYZ()); - else dir.SetXYZ(vec1.XYZ() + vec2.XYZ()); - gp_Vec transvec = gp_Vec(dir)*myArrowSize; - curpos = myPntAttach.Translated(transvec); - } - else { - gp_Vec crossvec = vec1.Crossed(vec2); - vec1.Cross(crossvec); - gp_Dir dir(vec1); - curpos = myPntAttach.Translated(gp_Vec(dir)*myArrowSize); - } - } - - return curpos; -} - -//======================================================================= -//function : ComputePosition -//purpose : Computes the position of the "fix dimension" when the -// fixed object is a vertex which is set at the intersection -// of two curves. -// The "dimension" is in the "middle" of the two edges. -//======================================================================= - -gp_Pnt AIS_FixRelation::ComputePosition(const Handle(Geom_Curve)& curv, - const gp_Pnt& firstp, - const gp_Pnt& lastp) const -{ - //--------------------------------------------------------- - // calculate the point of attach - //--------------------------------------------------------- - gp_Pnt curpos; - - if (curv->IsKind(STANDARD_TYPE(Geom_Circle))) { - - Handle(Geom_Circle) gcirc = Handle(Geom_Circle)::DownCast(curv); - gp_Dir dir( gcirc->Location().XYZ() + myPntAttach.XYZ() ); - gp_Vec transvec = gp_Vec(dir)*myArrowSize; - curpos = myPntAttach.Translated(transvec); - - } //if (curv->IsKind(STANDARD_TYPE(Geom_Circle)) - - else { -// gp_Pln pln(Component()->WorkingPlane()->Plane()->GetValue()->Pln()); - gp_Pln pln(myPlane->Pln()); - gp_Dir NormPln = pln.Axis().Direction(); - gp_Vec vec(firstp,lastp); - vec.Cross( gp_Vec(NormPln)); - vec.Normalize(); - gp_Vec transvec = vec*myArrowSize; - curpos = myPntAttach.Translated(transvec); - gp_Ax1 RotAx( myPntAttach, NormPln); - curpos.Rotate(RotAx, M_PI/10); - } - - return curpos; - } - -//======================================================================= -//function : ComputeEdge -//purpose : computes myPntAttach and the position of the presentation -// when you fix an edge -//======================================================================= - -void AIS_FixRelation::ComputeEdge(const TopoDS_Edge& FixEdge, gp_Pnt& curpos) -{ - Handle(Geom_Curve) curEdge; - gp_Pnt ptbeg,ptend; - if (!AIS::ComputeGeometry(FixEdge,curEdge,ptbeg,ptend)) return; - - //--------------------------------------------------------- - // calcul du point de positionnement du symbole 'fix' - //--------------------------------------------------------- - //--> In case of a straight line - if (curEdge->IsKind(STANDARD_TYPE(Geom_Line))){ - gp_Lin glin = Handle(Geom_Line)::DownCast(curEdge)->Lin(); - Standard_Real pfirst(ElCLib::Parameter(glin,ptbeg)); - Standard_Real plast(ElCLib::Parameter(glin,ptend)); - ComputeLinePosition(glin, curpos, pfirst, plast); - } - - //--> In case of a circle - else if (curEdge->IsKind(STANDARD_TYPE(Geom_Circle))) { - gp_Circ gcirc = Handle(Geom_Circle)::DownCast(curEdge)->Circ(); - Standard_Real pfirst, plast; - BRepAdaptor_Curve cu(FixEdge); - pfirst = cu.FirstParameter(); - plast = cu.LastParameter(); - ComputeCirclePosition(gcirc, curpos, pfirst, plast); - } - - else - return; - -} - -//======================================================================= -//function : ComputeLinePosition -//purpose : compute the values of myPntAttach and the position of -// the symbol when the fixed edge has a geometric support equal -// to a line. -//======================================================================= - -void AIS_FixRelation::ComputeLinePosition(const gp_Lin& glin, - gp_Pnt& pos, - Standard_Real& pfirst, - Standard_Real& plast) -{ - if (myAutomaticPosition) { - // point of attach is chosen as middle of the segment - myPntAttach = ElCLib::Value((pfirst+ plast)/2, glin); - - gp_Dir norm = myPlane ->Axis().Direction(); - - norm.Cross(glin.Position().Direction()); - pos = myPntAttach.Translated(gp_Vec(norm)*myArrowSize); - myAutomaticPosition = Standard_True; - } // if (myAutomaticPosition) - - else { - pos = myPosition; - Standard_Real linparam = ElCLib::Parameter(glin, pos); - - // case if the projection of position is located between 2 vertices - // de l'edge - if ( (linparam >= pfirst) && (linparam <= plast) ) - myPntAttach = ElCLib::Value(linparam,glin); - - // case if the projection of Position is outside of the limits - // of the edge : the point closest to the projection is chosen - // as the attach point - else { - Standard_Real pOnLin; - if (linparam > plast) - pOnLin = plast; - else - pOnLin = pfirst; - myPntAttach = ElCLib::Value(pOnLin,glin); - gp_Dir norm = myPlane->Axis().Direction(); - - norm.Cross(glin.Position().Direction()); - gp_Lin lsup(myPntAttach, norm); - Standard_Real parpos = ElCLib::Parameter(lsup,myPosition); - pos = ElCLib::Value(parpos,lsup); - } - - } - myPosition = pos; -} - -//======================================================================= -//function : ComputeCirclePosition -//purpose : compute the values of myPntAttach and the position of -// the symbol when the fixed edge has a geometric support equal -// to a circle. -//======================================================================= - -void AIS_FixRelation::ComputeCirclePosition( - const gp_Circ& gcirc, - gp_Pnt& pos, - Standard_Real& pfirst, - Standard_Real& plast) -{ - // readjust parametres on the circle - if (plast > 2*M_PI ) { - Standard_Real nbtours = Floor(plast / (2*M_PI)); - plast -= nbtours*2*M_PI; - pfirst -= nbtours*2*M_PI; - } - - if (myAutomaticPosition) { - // the point attach is the "middle" of the segment (relatively - // to the parametres of start and end vertices of the edge - - Standard_Real circparam = (pfirst + plast)/2.; - - if ( !InDomain(pfirst,plast,circparam)) { - Standard_Real otherpar = circparam + M_PI; - if (otherpar > 2*M_PI) otherpar -= 2*M_PI; - circparam = otherpar; - } - - myPntAttach = ElCLib::Value(circparam, gcirc ); - - gp_Vec dir( gcirc.Location().XYZ(), myPntAttach.XYZ() ); - dir.Normalize(); - gp_Vec transvec = dir*myArrowSize; - pos = myPntAttach.Translated(transvec); - myPosition = pos; - myAutomaticPosition = Standard_True; - } // if (myAutomaticPosition) - - else { - // case if the projection of myPosition is outside of 2 - // vertices of the edge. In this case the parameter is readjusted - // in the valid part of the circle - pos = myPosition; - - Standard_Real circparam = ElCLib::Parameter(gcirc, pos); - - if ( !InDomain(pfirst,plast,circparam)) { - Standard_Real otherpar = circparam + M_PI; - if (otherpar > 2*M_PI) otherpar -= 2*M_PI; - circparam = otherpar; - } - - myPntAttach = ElCLib::Value(circparam,gcirc); - } -} - -//======================================================================= -//function : ConnectedEdges -//purpose : -//======================================================================= -Standard_Boolean AIS_FixRelation::ConnectedEdges(const TopoDS_Wire& WIRE, - const TopoDS_Vertex& V, - TopoDS_Edge& E1, - TopoDS_Edge& E2) -{ - TopTools_IndexedDataMapOfShapeListOfShape vertexMap; - TopExp::MapShapesAndAncestors (WIRE,TopAbs_VERTEX,TopAbs_EDGE,vertexMap); - - Standard_Boolean found(Standard_False); - TopoDS_Vertex theVertex; - for (Standard_Integer i=1; i<=vertexMap.Extent() && !found; i++) { - if (vertexMap.FindKey(i).IsSame(V)) { - theVertex = TopoDS::Vertex(vertexMap.FindKey(i)); - found = Standard_True; - } - } - if (!found) { - E1.Nullify(); - E2.Nullify(); - return Standard_False; - } - - TopTools_ListIteratorOfListOfShape iterator(vertexMap.FindFromKey(theVertex)); - if (iterator.More()) { - E1 = TopoDS::Edge(iterator.Value()); - BRepAdaptor_Curve curv(E1); - iterator.Next(); - } - else { - E1.Nullify(); - return Standard_False; - } - - if (iterator.More()) { - E2 = TopoDS::Edge(iterator.Value()); - BRepAdaptor_Curve curv(E2); - iterator.Next(); - } - else { - E2.Nullify(); - return Standard_False; - } - - if (iterator.More()) { - E1.Nullify(); - E2.Nullify(); - return Standard_False; - } - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_FixRelation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_FixRelation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_FixRelation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_FixRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1996-12-05 -// Created by: Flore Lantheaume/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,98 +14,9 @@ #ifndef _AIS_FixRelation_HeaderFile #define _AIS_FixRelation_HeaderFile -#include -#include +#include -class Geom_Plane; - -DEFINE_STANDARD_HANDLE(AIS_FixRelation, AIS_Relation) - -//! Constructs and manages a constraint by a fixed -//! relation between two or more interactive datums. This -//! constraint is represented by a wire from a shape - -//! point, vertex, or edge - in the first datum and a -//! corresponding shape in the second. -//! Warning: This relation is not bound with any kind of parametric -//! constraint : it represents the "status" of an parametric -//! object. -class AIS_FixRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_FixRelation, AIS_Relation) -public: - - //! initializes the vertex aShape, the - //! plane aPlane and the wire aWire, which connects - //! the two vertices in a fixed relation. - Standard_EXPORT AIS_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const TopoDS_Wire& aWire); - - //! initializes the vertex aShape, the - //! plane aPlane and the wire aWire, the position - //! aPosition, the arrow size anArrowSize and the - //! wire aWire, which connects the two vertices in a fixed relation. - Standard_EXPORT AIS_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const TopoDS_Wire& aWire, const gp_Pnt& aPosition, const Standard_Real anArrowSize = 0.01); - - //! initializes the edge aShape and the plane aPlane. - Standard_EXPORT AIS_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane); - - //! initializes the edge aShape, the - //! plane aPlane, the position aPosition and the arrow - //! size anArrowSize. - Standard_EXPORT AIS_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const gp_Pnt& aPosition, const Standard_Real anArrowSize = 0.01); - - //! Returns the wire which connects vertices in a fixed relation. - Standard_EXPORT TopoDS_Wire Wire(); - - //! Constructs the wire aWire. This connects vertices - //! which are in a fixed relation. - Standard_EXPORT void SetWire (const TopoDS_Wire& aWire); - - //! Returns true if the Interactive Objects in the relation - //! are movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - //! computes the presentation for if it's a - //! vertex. - Standard_EXPORT void ComputeVertex (const TopoDS_Vertex& FixVertex, gp_Pnt& curpos); - - Standard_EXPORT gp_Pnt ComputePosition (const Handle(Geom_Curve)& curv1, const Handle(Geom_Curve)& curv2, const gp_Pnt& firstp1, const gp_Pnt& lastp1, const gp_Pnt& firstp2, const gp_Pnt& lastp2) const; - - Standard_EXPORT gp_Pnt ComputePosition (const Handle(Geom_Curve)& curv, const gp_Pnt& firstp, const gp_Pnt& lastp) const; - - //! computes the presentation for if it's a - //! edge. - Standard_EXPORT void ComputeEdge (const TopoDS_Edge& FixEdge, gp_Pnt& curpos); - - Standard_EXPORT void ComputeLinePosition (const gp_Lin& glin, gp_Pnt& pos, Standard_Real& pfirst, Standard_Real& plast); - - Standard_EXPORT void ComputeCirclePosition (const gp_Circ& gcirc, gp_Pnt& pos, Standard_Real& pfirst, Standard_Real& plast); - - Standard_EXPORT static Standard_Boolean ConnectedEdges (const TopoDS_Wire& aWire, const TopoDS_Vertex& aVertex, TopoDS_Edge& Edge1, TopoDS_Edge& Edge2); - - TopoDS_Wire myWire; - gp_Pnt myPntAttach; - - -}; - -#include +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_FixRelation AIS_FixRelation; #endif // _AIS_FixRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_FixRelation.lxx opencascade-7.5.1+dfsg1/src/AIS/AIS_FixRelation.lxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_FixRelation.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_FixRelation.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Created on: 1997-02-28 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_FixRelation::IsMovable() const -{ - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_GraphicTool.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_GraphicTool.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_GraphicTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_GraphicTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -92,7 +92,7 @@ const AIS_TypeOfAttribute Att) { Handle(Prs3d_LineAspect) LA = GetLineAspect(Dr,Att); - return LA->Aspect()->Type();; + return LA->Aspect()->Type(); } diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,26 +17,9 @@ #ifndef _AIS_HeaderFile #define _AIS_HeaderFile -#include -#include -#include -#include -#include -#include -#include #include #include #include -#include - -class Bnd_Box; -class Geom_Curve; -class Geom_Plane; -class Geom_Surface; -class TopoDS_Edge; -class TopoDS_Face; -class TopoDS_Shape; -class TopoDS_Vertex; //! Application Interactive Services provide the means to create links between an application GUI viewer and //! the packages which are used to manage selection and presentation. @@ -90,119 +73,6 @@ DEFINE_STANDARD_ALLOC - - - //! Returns the nearest point in a shape. This is used by - //! several classes in calculation of dimensions. - Standard_EXPORT static gp_Pnt Nearest (const TopoDS_Shape& aShape, const gp_Pnt& aPoint); - - - //! @return the nearest point on the line. - Standard_EXPORT static gp_Pnt Nearest (const gp_Lin& theLine, const gp_Pnt& thePoint); - - - //! For the given point finds nearest point on the curve, - //! @return TRUE if found point is belongs to the curve - //! and FALSE otherwise. - Standard_EXPORT static Standard_Boolean Nearest (const Handle(Geom_Curve)& theCurve, const gp_Pnt& thePoint, const gp_Pnt& theFirstPoint, const gp_Pnt& theLastPoint, gp_Pnt& theNearestPoint); - - Standard_EXPORT static gp_Pnt Farest (const TopoDS_Shape& aShape, const gp_Pnt& aPoint); - - //! Used by 2d Relation only - //! Computes the 3d geometry of in the current WorkingPlane - //! and the extremities if any - //! Return TRUE if ok. - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt); - - //! Used by dimensions only. - //! Computes the 3d geometry of . - //! Return TRUE if ok. - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt, Standard_Boolean& theIsInfinite); - - //! Used by 2d Relation only - //! Computes the 3d geometry of in the current WorkingPlane - //! and the extremities if any. - //! If is not in the current plane, contains - //! the not projected curve associated to . - //! If is infinite, = true and the 2 - //! parameters and have no signification. - //! Return TRUE if ok. - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt, Handle(Geom_Curve)& theExtCurve, Standard_Boolean& theIsInfinite, Standard_Boolean& theIsOnPlane, const Handle(Geom_Plane)& thePlane); - - //! Used by 2d Relation only - //! Computes the 3d geometry of in the current WorkingPlane - //! and the extremities if any - //! Return TRUE if ok. - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, const Handle(Geom_Plane)& thePlane); - - //! Used by dimensions only.Computes the 3d geometry - //! of and and checks if they are infinite. - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, Standard_Boolean& theIsinfinite1, Standard_Boolean& theIsinfinite2); - - //! Used by 2d Relation only Computes the 3d geometry - //! of and in the current Plane and the - //! extremities if any. Return in ExtCurve the 3d curve - //! (not projected in the plane) of the first edge if - //! =1 or of the 2nd edge if = 2. If - //! = 0, ExtCurve is Null. if there is an edge - //! external to the plane, is true if this - //! edge is infinite. So, the extremities of it are not - //! significant. Return TRUE if ok - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Standard_Integer& theExtIndex, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, Handle(Geom_Curve)& theExtCurve, Standard_Boolean& theIsinfinite1, Standard_Boolean& theIsinfinite2, const Handle(Geom_Plane)& thePlane); - - //! Checks if aCurve belongs to aPlane; if not, projects aCurve in aPlane - //! and returns aCurve; - //! Return TRUE if ok - Standard_EXPORT static Standard_Boolean ComputeGeomCurve (Handle(Geom_Curve)& aCurve, const Standard_Real first1, const Standard_Real last1, gp_Pnt& FirstPnt1, gp_Pnt& LastPnt1, const Handle(Geom_Plane)& aPlane, Standard_Boolean& isOnPlane); - - Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Vertex& aVertex, gp_Pnt& point, const Handle(Geom_Plane)& aPlane, Standard_Boolean& isOnPlane); - - //! Tryes to get Plane from Face. Returns Surface of Face - //! in aSurf. Returns Standard_True and Plane of Face in - //! aPlane in following cases: - //! Face is Plane, Offset of Plane, - //! Extrusion of Line and Offset of Extrusion of Line - //! Returns pure type of Surface which can be: - //! Plane, Cylinder, Cone, Sphere, Torus, - //! SurfaceOfRevolution, SurfaceOfExtrusion - Standard_EXPORT static Standard_Boolean GetPlaneFromFace (const TopoDS_Face& aFace, gp_Pln& aPlane, Handle(Geom_Surface)& aSurf, AIS_KindOfSurface& aSurfType, Standard_Real& Offset); - - Standard_EXPORT static void InitFaceLength (const TopoDS_Face& aFace, gp_Pln& aPlane, Handle(Geom_Surface)& aSurface, AIS_KindOfSurface& aSurfaceType, Standard_Real& anOffset); - - //! Finds attachment points on two curvilinear faces for length dimension. - //! @param thePlaneDir [in] the direction on the dimension plane to - //! compute the plane automatically. It will not be taken into account if - //! plane is defined by user. - Standard_EXPORT static void InitLengthBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, Handle(Geom_Surface)& theFirstSurf, Handle(Geom_Surface)& theSecondSurf, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, gp_Dir& theDirOnPlane); - - //! Finds three points for the angle dimension between - //! two planes. - Standard_EXPORT static Standard_Boolean InitAngleBetweenPlanarFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, gp_Pnt& theCenter, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, const Standard_Boolean theIsFirstPointSet = Standard_False); - - //! Finds three points for the angle dimension between - //! two curvilinear surfaces. - Standard_EXPORT static Standard_Boolean InitAngleBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, const AIS_KindOfSurface theFirstSurfType, const AIS_KindOfSurface theSecondSurfType, gp_Pnt& theCenter, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, const Standard_Boolean theIsFirstPointSet = Standard_False); - - Standard_EXPORT static gp_Pnt ProjectPointOnPlane (const gp_Pnt& aPoint, const gp_Pln& aPlane); - - Standard_EXPORT static gp_Pnt ProjectPointOnLine (const gp_Pnt& aPoint, const gp_Lin& aLine); - - Standard_EXPORT static gp_Pnt TranslatePointToBound (const gp_Pnt& aPoint, const gp_Dir& aDir, const Bnd_Box& aBndBox); - - //! returns True if point with anAttachPar is - //! in domain of arc - Standard_EXPORT static Standard_Boolean InDomain (const Standard_Real aFirstPar, const Standard_Real aLastPar, const Standard_Real anAttachPar); - - //! computes nearest to ellipse arc apex - Standard_EXPORT static gp_Pnt NearestApex (const gp_Elips& elips, const gp_Pnt& pApex, const gp_Pnt& nApex, const Standard_Real fpara, const Standard_Real lpara, Standard_Boolean& IsInDomain); - - //! computes length of ellipse arc in parametric units - Standard_EXPORT static Standard_Real DistanceFromApex (const gp_Elips& elips, const gp_Pnt& Apex, const Standard_Real par); - - Standard_EXPORT static void ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPres, const Handle(Prs3d_Drawer)& aDrawer, const TopoDS_Edge& anEdge, const Handle(Geom_Curve)& ProjCurve, const gp_Pnt& FirstP, const gp_Pnt& LastP, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfLine aProjTOL = Aspect_TOL_DASH, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT); - - Standard_EXPORT static void ComputeProjVertexPresentation (const Handle(Prs3d_Presentation)& aPres, const Handle(Prs3d_Drawer)& aDrawer, const TopoDS_Vertex& aVertex, const gp_Pnt& ProjPoint, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfMarker aProjTOM = Aspect_TOM_PLUS, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT); - }; #endif // _AIS_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_IdenticRelation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_IdenticRelation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_IdenticRelation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_IdenticRelation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,1731 +0,0 @@ -// Created on: 1997-03-03 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_IdenticRelation,AIS_Relation) - -// jfa 15/10/2000 -static Standard_Real Modulo2PI(const Standard_Real ANGLE) -{ - if ( ANGLE < 0 ) return Modulo2PI(ANGLE + 2*M_PI); - else if ( ANGLE >= 2*M_PI ) return Modulo2PI(ANGLE - 2*M_PI); - return ANGLE; -} - -static Standard_Boolean IsEqual2PI(const Standard_Real angle1, - const Standard_Real angle2, const Standard_Real precision) -{ - Standard_Real diff = Abs(angle1-angle2); - if ( diff < precision ) return Standard_True; - else if ( Abs(diff-2*M_PI) < precision ) return Standard_True; - return Standard_False; -} -// jfa 15/10/2000 end - -//======================================================================= -//function : AIS_Sort -//purpose : sort an array of parameters in increasing order -// updates and according to -//======================================================================= -static void AIS_Sort(Standard_Real tab1[4], - gp_Pnt tab2[4], - Standard_Integer tab3[4]) -{ - Standard_Boolean found = Standard_True; - Standard_Real cur; gp_Pnt cur1; Standard_Integer cur2; - - while (found) { - found = Standard_False; - for (Standard_Integer i=0; i< 3; i++) { - if (tab1[i+1] < tab1[i]) { - found = Standard_True; - cur = tab1[i]; cur1 = tab2[i]; cur2 = tab3[i]; - tab1[i] = tab1[i+1]; tab2[i] = tab2[i+1]; tab3[i] = tab3[i+1]; - tab1[i+1] = cur; tab2[i+1] = cur1; tab3[i+1] = cur2; - } - } - } -} - -//======================================================================= -//function : ConnectedEdges -//purpose : -//======================================================================= -static Standard_Boolean ConnectedEdges(const TopoDS_Wire& WIRE, - const TopoDS_Vertex& V, - TopoDS_Edge& E1, - TopoDS_Edge& E2) -{ - TopTools_IndexedDataMapOfShapeListOfShape vertexMap; - TopExp::MapShapesAndAncestors (WIRE,TopAbs_VERTEX,TopAbs_EDGE,vertexMap); - - Standard_Boolean found(Standard_False); - TopoDS_Vertex theVertex; - for (Standard_Integer i=1; i<=vertexMap.Extent() && !found; i++) { - if (vertexMap.FindKey(i).IsSame(V)) { - theVertex = TopoDS::Vertex(vertexMap.FindKey(i)); - found = Standard_True; - } - } - if (!found) { - E1.Nullify(); - E2.Nullify(); - return Standard_False; - } - - TopTools_ListIteratorOfListOfShape iterator(vertexMap.FindFromKey(theVertex)); - if (iterator.More()) { - E1 = TopoDS::Edge(iterator.Value()); - iterator.Next(); - } - else { - E1.Nullify(); - return Standard_False; - } - - if (iterator.More()) { - E2 = TopoDS::Edge(iterator.Value()); - iterator.Next(); - } - else { - E2.Nullify(); - return Standard_False; - } - - if (iterator.More()) { - E1.Nullify(); - E2.Nullify(); - return Standard_False; - } - return Standard_True; -} - -// jfa 16/10/2000 -//======================================================================= -//function : ComputeAttach -//purpose : Compute a point on the arc of -// between and -// corresponding to -// Returns result into -// Note : This function is to be used only in the case of circles. -// The parameter is in/out. -//======================================================================= -static Standard_Boolean ComputeAttach(const gp_Circ& thecirc, - const gp_Pnt& aFAttach, - const gp_Pnt& aSAttach, - gp_Pnt& aPosition) -{ - gp_Pnt curpos = aPosition; - - // Case of confusion between the current position and the center - // of the circle -> we move the current position - Standard_Real confusion (Precision::Confusion()); - gp_Pnt aCenter = thecirc.Location(); - if ( aCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(aCenter, aFAttach); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - - Standard_Real pcurpos = ElCLib::Parameter(thecirc,curpos); - Standard_Real pFAttach = ElCLib::Parameter(thecirc,aFAttach); - Standard_Real pSAttach = ElCLib::Parameter(thecirc,aSAttach); - - Standard_Real pSAttachM = pSAttach; - Standard_Real deltap = pSAttachM - pFAttach; - if ( deltap < 0 ) - { - deltap += 2 * M_PI; - pSAttachM += 2 * M_PI; - } - pSAttachM -= pFAttach; - - Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; - - Standard_Real pcurpos1 = pcurpos; - // define where curpos lays - if ( pcurpos1 < pFAttach ) - { - pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; - if ( pcurpos1 > pSAttachM ) // out - { - if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; - else pcurpos = pSAttach; - } - } - else if ( pcurpos1 > (pFAttach + deltap) ) // out - { - pcurpos1 -= pFAttach; - if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; - else pcurpos = pSAttach; - } - - aPosition = ElCLib::Value(pcurpos,thecirc); - return Standard_True; -} - -//======================================================================= -//function : ComputeAttach -//purpose : Compute a point on the arc of ellipse -// between and -// corresponding to -// Returns result into -// Note : This function is to be used only in the case of ellipses. -// The parameter is in/out. -//======================================================================= -static Standard_Boolean ComputeAttach(const gp_Elips& theEll, - const gp_Pnt& aFAttach, - const gp_Pnt& aSAttach, - gp_Pnt& aPosition) -{ - gp_Pnt curpos = aPosition; - - // Case of confusion between the current position and the center - // of the circle -> we move the current position - Standard_Real confusion (Precision::Confusion()); - gp_Pnt aCenter = theEll.Location(); - if ( aCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(aCenter, aFAttach); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - -// for ellipses it's not good Standard_Real pcurpos = ElCLib::Parameter(theEll,curpos); - Handle(Geom_Ellipse) theEllg = new Geom_Ellipse(theEll); - GeomAPI_ProjectPointOnCurve aProj (curpos, theEllg); - Standard_Real pcurpos = aProj.LowerDistanceParameter(); - - Standard_Real pFAttach = ElCLib::Parameter(theEll,aFAttach); - Standard_Real pSAttach = ElCLib::Parameter(theEll,aSAttach); - - Standard_Real pSAttachM = pSAttach; - Standard_Real deltap = pSAttachM - pFAttach; - if ( deltap < 0 ) - { - deltap += 2 * M_PI; - pSAttachM += 2 * M_PI; - } - pSAttachM -= pFAttach; - - Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; - - Standard_Real pcurpos1 = pcurpos; - // define where curpos lays - if ( pcurpos1 < pFAttach ) - { - pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; - if ( pcurpos1 > pSAttachM ) // out - { - if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; - else pcurpos = pSAttach; - } - } - else if ( pcurpos1 > (pFAttach + deltap) ) // out - { - pcurpos1 -= pFAttach; - if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; - else pcurpos = pSAttach; - } - - aPosition = ElCLib::Value(pcurpos,theEll); - return Standard_True; -} -// jfa 16/10/2000 end - -//======================================================================= -//function : AIS_IdenticRelation -//purpose : -//======================================================================= -AIS_IdenticRelation::AIS_IdenticRelation(const TopoDS_Shape& FirstShape, - const TopoDS_Shape& SecondShape, - const Handle(Geom_Plane)& aPlane) - :isCircle(Standard_False) -{ - myFShape = FirstShape; - mySShape = SecondShape; - myPlane = aPlane; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_IdenticRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aprs, - const Standard_Integer) -{ - switch ( myFShape.ShapeType() ) { - - case TopAbs_VERTEX: - { - switch ( mySShape.ShapeType() ) { - case TopAbs_VERTEX: - { - ComputeTwoVerticesPresentation(aprs); - } - break; - case TopAbs_EDGE: - { - ComputeOneEdgeOVertexPresentation(aprs); - } - break; - default: - break; - } - } - break; - - case TopAbs_EDGE: - { - switch ( mySShape.ShapeType() ) { - case TopAbs_VERTEX: - { - ComputeOneEdgeOVertexPresentation(aprs); - } - break; - case TopAbs_EDGE: - { - ComputeTwoEdgesPresentation(aprs); - } - break; - default: - break; - } - } - break; - default: break; - } -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_IdenticRelation::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_IdenticRelation::Compute(const Handle(Prs3d_Projector)&,const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -void AIS_IdenticRelation::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_IdenticRelation::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : function used to compute the selection associated to the -// "identic" presentation -// note : if we are in the case of lines, we create a segment between -// myFAttach and mySAttach. In the case of Circles, we create -// an arc of circle between the sames points. We Add a segment -// to link Position to its projection on the curve described -// before. -//======================================================================= - -void AIS_IdenticRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - - Handle(Select3D_SensitiveSegment) seg; - // attachement point of the segment linking position to the curve - gp_Pnt attach; - Standard_Real confusion (Precision::Confusion()); - - if ( myFAttach.IsEqual(mySAttach, confusion) ) - { - attach = myFAttach; - } - else - { -// jfa 24/10/2000 - if ( myFShape.ShapeType() == TopAbs_EDGE ) - { - Handle(Geom_Curve) curv1,curv2; - gp_Pnt firstp1,lastp1,firstp2,lastp2; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if ( !AIS::ComputeGeometry(TopoDS::Edge(myFShape),TopoDS::Edge(mySShape), - myExtShape,curv1,curv2, - firstp1,lastp1,firstp2,lastp2, - extCurv,isInfinite1,isInfinite2,myPlane) ) return; - - if ( isCircle ) // case of Circles - { - Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv1); - Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),myFAttach); - Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),mySAttach); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); - - Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecu); - aSelection->Add(scurv); - - attach = myPosition; - ComputeAttach(thecirc->Circ(),myFAttach,mySAttach,attach); - } - else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipses - { - Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv1); - - Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),myFAttach); - Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),mySAttach); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); - - Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecu); - aSelection->Add(scurv); - - attach = myPosition; - ComputeAttach(theEll->Elips(),myFAttach,mySAttach,attach); - } - else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of Lines - { - seg = new Select3D_SensitiveSegment(own, myFAttach, mySAttach); - aSelection->Add(seg); - - //attach = projection of Position() on the curve; - gp_Vec v1 (myFAttach, mySAttach); - gp_Vec v2 (myFAttach, myPosition); - if ( v1.IsParallel(v2, Precision::Angular()) ) - { - attach = mySAttach; - } - else - { - gp_Lin ll (myFAttach, gp_Dir(v1)); - attach = ElCLib::Value(ElCLib::Parameter(ll,myPosition), ll); - } - } - else return; - } -// else if ( myFShape.ShapeType() == TopAbs_VERTEX ) -// { -// } -// jfa 24/10/2000 end - } - - // Creation of the segment linking the attachement point with the - // position - if ( !attach.IsEqual(myPosition, confusion) ) - { - seg = new Select3D_SensitiveSegment(own, attach, myPosition); - aSelection->Add(seg); - } -} - -//======================================================================= -//function : ComputeTwoEdgesPresentation -//purpose : -//======================================================================= -void AIS_IdenticRelation::ComputeTwoEdgesPresentation(const Handle(Prs3d_Presentation)& aPrs) -{ - Handle(Geom_Curve) curv1,curv2; - gp_Pnt firstp1,lastp1,firstp2,lastp2; - Standard_Boolean isInfinite1,isInfinite2; - - Handle(Geom_Curve) extCurv; - if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape), - TopoDS::Edge(mySShape), - myExtShape, - curv1, - curv2, - firstp1, - lastp1, - firstp2, - lastp2, - extCurv, - isInfinite1,isInfinite2, - myPlane)) - return; - aPrs->SetInfiniteState((isInfinite1 || isInfinite2) && myExtShape != 0); - - // Treatement of the case of lines - if ( curv1->IsInstance(STANDARD_TYPE(Geom_Line)) && curv2->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - // we take the line curv1 like support - Handle(Geom_Line) thelin; - if (isInfinite1 && !isInfinite2) thelin = Handle(Geom_Line)::DownCast (curv2); - else if (!isInfinite1 && isInfinite2) thelin = Handle(Geom_Line)::DownCast (curv1); - else thelin = Handle(Geom_Line)::DownCast (curv1); - ComputeTwoLinesPresentation(aPrs, thelin, firstp1, lastp1, firstp2, lastp2, isInfinite1, isInfinite2); - } - - // Treatement of the case of circles - else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) && curv2->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - //gp_Pnt curpos; - isCircle = Standard_True; // useful for ComputeSelection - Handle(Geom_Circle) thecirc (Handle(Geom_Circle)::DownCast (curv1)); - ComputeTwoCirclesPresentation(aPrs, thecirc, firstp1, lastp1, firstp2, lastp2); - } - - // jfa 10/10/2000 - // Treatement of the case of ellipses - else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) && curv2->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) - { - Handle(Geom_Ellipse) theEll (Handle(Geom_Ellipse)::DownCast (curv1)); - ComputeTwoEllipsesPresentation(aPrs, theEll, firstp1, lastp1, firstp2, lastp2); - } - // jfa 10/10/2000 end - else - return; - - // Calculate presentation of projected edges - if ( (myExtShape != 0) && !extCurv.IsNull()) { - if (myExtShape == 1 ) - ComputeProjEdgePresentation(aPrs, TopoDS::Edge(myFShape), curv1, firstp1, lastp1); - else - ComputeProjEdgePresentation(aPrs, TopoDS::Edge(mySShape), curv2, firstp2, lastp2); - } -} - -//======================================================================= -//function : ComputeTwoLinesPresentation -//purpose : Compute the presentation of the 'identic' constraint -// between two lines ( which are equal) -//input : : the -// : first extremity of the 1st curve of the constraint -// : last extremity of the 1st curve of the constraint -// : first extremity of the 2nd curve of the constraint -// :last extremity of the 2nd curve of the constraint -//======================================================================= -void AIS_IdenticRelation::ComputeTwoLinesPresentation(const Handle(Prs3d_Presentation)& aPrs, - const Handle(Geom_Line)& thelin, - gp_Pnt& firstp1, - gp_Pnt& lastp1, - gp_Pnt& firstp2, - gp_Pnt& lastp2, - const Standard_Boolean isInfinite1, - const Standard_Boolean isInfinite2) -{ - if (isInfinite1 && isInfinite2) { - if ( myAutomaticPosition ) { - myFAttach = mySAttach = thelin->Lin().Location(); - gp_Pnt curpos; - gp_Pln pln(myPlane->Pln()); - gp_Dir dir(pln.XAxis().Direction()); - gp_Vec transvec = gp_Vec(dir)*myArrowSize; - curpos = myFAttach.Translated(transvec);; - myPosition = curpos; - myAutomaticPosition = Standard_True; - } - else { - myFAttach = mySAttach = ElCLib::Value(ElCLib::Parameter(thelin->Lin(),myPosition),thelin->Lin()); - } - TCollection_ExtendedString vals(" =="); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - myFAttach, - myPosition); - } - else { - // Computation of the parameters of the 4 points on the line - Standard_Real pf1, pf2, pl1, pl2; - - pf1 = ElCLib::Parameter(thelin->Lin(), firstp1); - pl1 = ElCLib::Parameter(thelin->Lin(), lastp1); - - pf2 = ElCLib::Parameter(thelin->Lin(), firstp2); - pl2 = ElCLib::Parameter(thelin->Lin(), lastp2); - - if (isInfinite1) { - pf1 = pf2; - pl1 = pl2; - firstp1 = firstp2; - lastp1 = lastp2; - } - else if (isInfinite2) { - pf2 = pf1; - pl2 = pl1; - firstp2 = firstp1; - lastp2 = lastp1; - } - - Standard_Real tabRang1[4]; // array taht contains the parameters of the 4 points - // ordered by increasing abscisses. - - gp_Pnt tabRang2[4]; // array containing the points corresponding to the - // parameters in tabRang1 - - Standard_Integer tabRang3[4]; // array containing the number of the curve( 1 or 2) - // of which belongs each point of tabRang2 - - // Filling of the arrays - tabRang1[0] = pf1; tabRang2[0] = firstp1; tabRang3[0] = 1; - tabRang1[1] = pf2; tabRang2[1] = firstp2; tabRang3[1] = 2; - tabRang1[2] = pl1; tabRang2[2] = lastp1; tabRang3[2] = 1; - tabRang1[3] = pl2; tabRang2[3] = lastp2; tabRang3[3] = 2; - - // Sort of the array of parameters (tabRang1) - AIS_Sort(tabRang1, tabRang2, tabRang3); - - // Computation of myFAttach and mySAttach according to the - // position of the 2 linear edges - gp_Pnt curpos; - gp_Pnt middle; - - if ( (tabRang1[0] == tabRang1[1]) && (tabRang1[2] == tabRang1[3]) ) { - middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); - Standard_Real pmiddle = (tabRang1[1] + tabRang1[2]) / 2.; - Standard_Real delta = (tabRang1[3] - tabRang1[0])/ 5.; - myFAttach = ElCLib::Value(pmiddle-delta, thelin->Lin()); - mySAttach = ElCLib::Value(pmiddle+delta, thelin->Lin()); - } - - else if ( tabRang1[1] == tabRang1[2] ) { - middle = tabRang2[1]; - Standard_Real delta1 = tabRang1[1] - tabRang1[0]; - Standard_Real delta2 = tabRang1[3] - tabRang1[2]; - if ( delta1 > delta2 ) delta1 = delta2; - myFAttach = ElCLib::Value(tabRang1[1]-delta1/2., thelin->Lin()); - mySAttach = ElCLib::Value(tabRang1[1]+delta1/2., thelin->Lin()); - } - - // Case of 2 disconnected segments -> the symbol completes the gap - // between the 2 edges - //-------------------------------- - else if ( (tabRang3[0] == tabRang3[1]) && (tabRang1[1] != tabRang1[2])) { - middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); - myFAttach = tabRang2[1]; - mySAttach = tabRang2[2]; - } - else if ( (tabRang3[0] != tabRang3[1]) - && (tabRang3[1] != tabRang3[2]) // Intersection - && (tabRang1[1] != tabRang1[2]) ) { - middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); - myFAttach = tabRang2[1]; - mySAttach = tabRang2[2]; - } - else { // Inclusion - myFAttach.SetXYZ((tabRang2[0].XYZ() + tabRang2[1].XYZ())/2. ); - mySAttach.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); - middle.SetXYZ( (myFAttach.XYZ() + mySAttach.XYZ() )/2.); - } - - - if ( myAutomaticPosition ) { - - gp_Vec vtrans(myFAttach, mySAttach); - vtrans.Normalize(); - vtrans.Cross(gp_Vec(myPlane->Pln().Axis().Direction())); - vtrans *= ComputeSegSize(); - curpos = middle.Translated(vtrans); - myPosition = curpos; - myAutomaticPosition = Standard_True; - } - - else { - - curpos = myPosition; - Standard_Real pcurpos = ElCLib::Parameter(thelin->Lin() ,curpos); - Standard_Real dist = thelin->Lin().Distance(curpos); - gp_Pnt proj = ElCLib::Value( pcurpos, thelin->Lin()); - gp_Vec trans; - Standard_Real confusion(Precision::Confusion()); - if ( dist >= confusion ) { - trans = gp_Vec(proj, curpos); - trans.Normalize(); - } - Standard_Real pf = ElCLib::Parameter(thelin->Lin() ,myFAttach); - Standard_Real pl = ElCLib::Parameter(thelin->Lin() ,mySAttach); - if ( pcurpos <= pf ) { - pcurpos = pf + 1e-5; - curpos = ElCLib::Value( pcurpos, thelin->Lin()); - if ( dist >= confusion ) curpos.Translate(trans*dist); - } - else if ( pcurpos >= pl ) { - pcurpos = pl - 1e-5; - curpos = ElCLib::Value( pcurpos, thelin->Lin()); - if ( dist >= confusion ) curpos.Translate(trans*dist); - } - SetPosition(curpos); - } - - // Display of the presentation - TCollection_ExtendedString vals(" =="); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - myFAttach, - mySAttach, - curpos); - } -} - -// jfa 17/10/2000 -//======================================================================= -//function : ComputeTwoCirclesPresentation -//purpose : Compute the presentation of the 'identic' constraint -// between two circles ( which are equal) -//input : : the circle -// : first extremity of the 1st curve of the constraint -// : last extremity of the 1st curve of the constraint -// : first extremity of the 2nd curve of the constraint -// :last extremity of the 2nd curve of the constraint -//======================================================================= -void AIS_IdenticRelation::ComputeTwoCirclesPresentation(const Handle(Prs3d_Presentation)& aPrs, - const Handle(Geom_Circle)& thecirc, - const gp_Pnt& firstp1, - const gp_Pnt& lastp1, - const gp_Pnt& firstp2, - const gp_Pnt& lastp2) -{ - Standard_Real confusion (Precision::Confusion()); - - // Searching of complete circles - Standard_Boolean circ1complete = (firstp1.IsEqual(lastp1, confusion)); - Standard_Boolean circ2complete = (firstp2.IsEqual(lastp2, confusion)); - - myCenter = thecirc->Location(); - Standard_Real aSegSize = thecirc->Radius()/5.0; - Standard_Real rad = M_PI / 5.0; - - // I. Case of 2 complete circles - if ( circ1complete && circ2complete ) - { - if (myAutomaticPosition) - { - Standard_Real pfirst1 = ElCLib::Parameter(thecirc->Circ(), firstp1); - myFAttach = ElCLib::Value(Modulo2PI(pfirst1-rad), thecirc->Circ()); - mySAttach = ElCLib::Value(Modulo2PI(pfirst1+rad), thecirc->Circ()); - - gp_Pnt curpos = ElCLib::Value(pfirst1,thecirc->Circ()); - gp_Vec vtrans(myCenter, curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - curpos.Translate(vtrans); - myPosition = curpos; - } - else ComputeNotAutoCircPresentation(thecirc); - } - - // II. Case of one complete circle and one arc - else if ( (circ1complete && !circ2complete) || (!circ1complete && circ2complete) ) - { - gp_Pnt firstp, lastp; - if ( circ1complete && !circ2complete) - { - firstp = firstp2; - lastp = lastp2; - } - else - { - firstp = firstp1; - lastp = lastp1; - } - - if (myAutomaticPosition) - { - ComputeAutoArcPresentation(thecirc, firstp, lastp); - } - else - { - ComputeNotAutoArcPresentation(thecirc, firstp, lastp); - } - } - - // III and IV. Case of two arcs - else if ( !circ1complete && !circ2complete ) - { - // We project all the points on the circle - Standard_Real pf1, pf2, pl1, pl2; - pf1 = ElCLib::Parameter(thecirc->Circ(), firstp1); - pf2 = ElCLib::Parameter(thecirc->Circ(), firstp2); - pl1 = ElCLib::Parameter(thecirc->Circ(), lastp1); - pl2 = ElCLib::Parameter(thecirc->Circ(), lastp2); - - // III. Arcs with common ends - // III.1. First of one and last of another - if ( IsEqual2PI(pl1,pf2,confusion) || IsEqual2PI(pf1,pl2,confusion) ) - { - gp_Pnt curpos(0.,0.,0.); - Standard_Real att=0.; - if ( IsEqual2PI(pl1,pf2,confusion) ) - { - att = pl1; - curpos = lastp1; - } - else if ( IsEqual2PI(pf1,pl2,confusion) ) - { - att = pf1; - curpos = firstp1; - } - Standard_Real maxrad = Min(Modulo2PI(pl1 - pf1),Modulo2PI(pl2 - pf2))*3/4; - if ( rad > maxrad ) rad = maxrad; - Standard_Real pFAttach = Modulo2PI(att - rad); - Standard_Real pSAttach = Modulo2PI(att + rad); - myFAttach = ElCLib::Value(pFAttach, thecirc->Circ()); - mySAttach = ElCLib::Value(pSAttach, thecirc->Circ()); - if ( myAutomaticPosition ) - { - gp_Vec vtrans(myCenter,curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - curpos.Translate(vtrans); - myPosition = curpos; - } - } - // III.2. Two first or two last - else if ( IsEqual2PI(pf1,pf2,confusion) || IsEqual2PI(pl1,pl2,confusion) ) - { - Standard_Real l1 = Modulo2PI(pl1 - pf1); - Standard_Real l2 = Modulo2PI(pl2 - pf2); - gp_Pnt firstp,lastp; - if ( l1 < l2 ) - { - firstp = firstp1; - lastp = lastp1; - } - else - { - firstp = firstp2; - lastp = lastp2; - } - - if ( myAutomaticPosition ) - { - ComputeAutoArcPresentation(thecirc, firstp, lastp); - } - else - { - ComputeNotAutoArcPresentation(thecirc, firstp, lastp); - } - } - // IV. All others arcs (without common ends) - else - { - // order the parameters; first will be pf1 - Standard_Real pl1m = Modulo2PI(pl1 - pf1); - Standard_Real pf2m = Modulo2PI(pf2 - pf1); - Standard_Real pl2m = Modulo2PI(pl2 - pf1); - - Standard_Boolean case1 = Standard_False; - // 1 - not intersecting arcs - // 2 - intersecting arcs, but one doesn't contain another - // 3a - first arc contains the second one - // 3b - second arc contains the first one - // 4 - two intersections - - gp_Pnt firstp, lastp; - - if ( pl1m < pf2m ) // 1 or 2b or 3b - { - if ( pl1m < pl2m ) // 1 or 3b - { - if ( pl2m < pf2m ) // 3b - { - firstp = firstp1; - lastp = lastp1; - } - else // 1 - { - case1 = Standard_True; - Standard_Real deltap1 = Modulo2PI(pf1 - pl2); - Standard_Real deltap2 = Modulo2PI(pf2 - pl1); - if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || - ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 - { - firstp = lastp1; - lastp = firstp2; - } - else // deltap1 - { - firstp = lastp2; - lastp = firstp1; - } - } - } - else // 2b - { - firstp = firstp1; - lastp = lastp2; - } - } - else // 2a or 3a or 4 - { - if ( pl1m < pl2m ) // 2a - { - firstp = firstp2; - lastp = lastp1; - } - else // 3a or 4 - { - if ( pl2m > pf2m ) // 3a - { - firstp = firstp2; - lastp = lastp2; - } - else // 4 - { - Standard_Real deltap1 = Modulo2PI(pl1 - pf2); - Standard_Real deltap2 = Modulo2PI(pl2 - pf1); - if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || - ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 - { - firstp = firstp1; - lastp = lastp2; - } - else // deltap1 - { - firstp = firstp2; - lastp = lastp1; - } - } - } - } - - if ( myAutomaticPosition ) - { - ComputeAutoArcPresentation(thecirc,firstp,lastp,case1); - } - else - { - if ( case1 ) - { - myFAttach = firstp; - mySAttach = lastp; - } - else ComputeNotAutoArcPresentation(thecirc, firstp, lastp); - } - } - } - - // Display of the presentation - TCollection_ExtendedString vals(" =="); - gp_Pnt attach = myPosition; - ComputeAttach(thecirc->Circ(),myFAttach,mySAttach,attach); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - myPlane->Pln().Position().Ax2(), - myCenter, - myFAttach, - mySAttach, - myPosition, - attach); -} - -//======================================================================= -//function : ComputeAutoArcPresentation -//purpose : Compute the presentation of the constraint where we are -// not in the case of dragging. -//======================================================================= -void AIS_IdenticRelation::ComputeAutoArcPresentation(const Handle(Geom_Circle)& thecirc, - const gp_Pnt& firstp, - const gp_Pnt& lastp, - const Standard_Boolean isstatic) -{ - Standard_Real aSegSize = thecirc->Radius()/5.0; - Standard_Real rad = M_PI / 5.0; - - Standard_Real pFA = ElCLib::Parameter(thecirc->Circ(),firstp); - Standard_Real pSA = ElCLib::Parameter(thecirc->Circ(),lastp); - Standard_Real maxrad = Modulo2PI(pSA - pFA)/2.0; - - if ( (rad > maxrad) || isstatic ) rad = maxrad; - Standard_Real pmiddle = Modulo2PI(pFA + Modulo2PI(pSA - pFA)/2.0); - - myFAttach = ElCLib::Value(Modulo2PI(pmiddle - rad),thecirc->Circ()); - mySAttach = ElCLib::Value(Modulo2PI(pmiddle + rad),thecirc->Circ()); - - gp_Pnt curpos = ElCLib::Value(pmiddle,thecirc->Circ()); - gp_Vec vtrans(myCenter, curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - myPosition = curpos.Translated(vtrans); -} - -//======================================================================= -//function : ComputeNotAutoCircPresentation -//purpose : Compute the presentation of the constraint where we are -// in the case of dragging. -// Note : This function is to be used only in the case of full circles. -// The symbol of the constraint moves together with arc -// representing the constraint around all the circle. -//======================================================================= -void AIS_IdenticRelation::ComputeNotAutoCircPresentation(const Handle(Geom_Circle)& thecirc) -{ - gp_Pnt curpos = myPosition; - - Handle(Geom_Circle) cirNotAuto = new Geom_Circle(thecirc->Circ()); - - // Case of confusion between the current position and the center - // of the circle -> we move the current position - Standard_Real confusion (Precision::Confusion()); - if ( myCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(myCenter, myFAttach); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - - Standard_Real rad = M_PI / 5.0; - Standard_Real pcurpos = ElCLib::Parameter(cirNotAuto->Circ(),curpos); - Standard_Real pFAttach = pcurpos - rad; - Standard_Real pSAttach = pcurpos + rad; - myFAttach = ElCLib::Value(pFAttach,cirNotAuto->Circ()); - mySAttach = ElCLib::Value(pSAttach,cirNotAuto->Circ()); -} - -//======================================================================= -//function : ComputeNotAutoArcPresentation -//purpose : Compute the presentation of the constraint where we are -// in the case of dragging. -// Note : This function is to be used only in the case of circles. -// The symbol of the constraint moves only between myFAttach -// and mySAttach. -//======================================================================= -void AIS_IdenticRelation::ComputeNotAutoArcPresentation(const Handle(Geom_Circle)& thecirc, - const gp_Pnt& pntfirst, - const gp_Pnt& pntlast) -{ - gp_Pnt curpos = myPosition; - - gp_Circ cirNotAuto = thecirc->Circ(); - - Standard_Real pFPnt = ElCLib::Parameter(cirNotAuto, pntfirst); - Standard_Real pSPnt = ElCLib::Parameter(cirNotAuto, pntlast); - Standard_Real deltap = Modulo2PI(pSPnt - pFPnt)/2.0; - - Standard_Real rad = M_PI / 5; - if ( deltap < rad ) - { - myFAttach = pntfirst; - mySAttach = pntlast; - } - else - { - gp_Pnt aFPnt = ElCLib::Value(Modulo2PI(pFPnt + rad), cirNotAuto); - gp_Pnt aSPnt = ElCLib::Value(Modulo2PI(pSPnt - rad), cirNotAuto); - - ComputeAttach(cirNotAuto,aFPnt,aSPnt,curpos); - - Standard_Real pcurpos = ElCLib::Parameter(cirNotAuto,curpos); - myFAttach = ElCLib::Value(pcurpos - rad, cirNotAuto); - mySAttach = ElCLib::Value(pcurpos + rad, cirNotAuto); - } -} -// jfa 17/10/2000 end - -// jfa 18/10/2000 -//======================================================================= -//function : ComputeTwoEllipsesPresentation -//purpose : Compute the presentation of the 'identic' constraint -// between two ellipses (which are equal) -//input : : the ellipse -// : first extremity of the 1st curve of the constraint -// : last extremity of the 1st curve of the constraint -// : first extremity of the 2nd curve of the constraint -// :last extremity of the 2nd curve of the constraint -//======================================================================= -void AIS_IdenticRelation::ComputeTwoEllipsesPresentation(const Handle(Prs3d_Presentation)& aPrs, - const Handle(Geom_Ellipse)& theEll, - const gp_Pnt& firstp1, - const gp_Pnt& lastp1, - const gp_Pnt& firstp2, - const gp_Pnt& lastp2) -{ - Standard_Real confusion (Precision::Confusion()); - - // Searching of complete ellipses - Standard_Boolean circ1complete = (firstp1.IsEqual(lastp1, confusion)); - Standard_Boolean circ2complete = (firstp2.IsEqual(lastp2, confusion)); - - myCenter = theEll->Location(); - Standard_Real aSegSize = theEll->MajorRadius()/5.0; - Standard_Real rad = M_PI / 5.0; - - // I. Case of 2 complete ellipses - if ( circ1complete && circ2complete ) - { - if (myAutomaticPosition) - { - Standard_Real pfirst1 = ElCLib::Parameter(theEll->Elips(), firstp1); - myFAttach = ElCLib::Value(Modulo2PI(pfirst1-rad), theEll->Elips()); - mySAttach = ElCLib::Value(Modulo2PI(pfirst1+rad), theEll->Elips()); - - gp_Pnt curpos = ElCLib::Value(pfirst1,theEll->Elips()); - gp_Vec vtrans(myCenter, curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - curpos.Translate(vtrans); - myPosition = curpos; - } - else ComputeNotAutoElipsPresentation(theEll); - } - - // II. Case of one complete circle and one arc - else if ( (circ1complete && !circ2complete) || (!circ1complete && circ2complete) ) - { - gp_Pnt firstp, lastp; - if ( circ1complete && !circ2complete) - { - firstp = firstp2; - lastp = lastp2; - } - else - { - firstp = firstp1; - lastp = lastp1; - } - - if (myAutomaticPosition) - { - ComputeAutoArcPresentation(theEll, firstp, lastp); - } - else - { - ComputeNotAutoArcPresentation(theEll, firstp, lastp); - } - } - - // III and IV. Case of two arcs - else if ( !circ1complete && !circ2complete ) - { - // We project all the points on the circle - Standard_Real pf1, pf2, pl1, pl2; - pf1 = ElCLib::Parameter(theEll->Elips(), firstp1); - pf2 = ElCLib::Parameter(theEll->Elips(), firstp2); - pl1 = ElCLib::Parameter(theEll->Elips(), lastp1); - pl2 = ElCLib::Parameter(theEll->Elips(), lastp2); - - // III. Arcs with common ends - // III.1. First of one and last of another - if ( IsEqual2PI(pl1,pf2,confusion) || IsEqual2PI(pf1,pl2,confusion) ) - { - gp_Pnt curpos; - Standard_Real att=0.; - if ( IsEqual2PI(pl1,pf2,confusion) ) - { - att = pl1; - curpos = lastp1; - } - else if ( IsEqual2PI(pf1,pl2,confusion) ) - { - att = pf1; - curpos = firstp1; - } - Standard_Real maxrad = Min(Modulo2PI(pl1 - pf1),Modulo2PI(pl2 - pf2))*3/4; - if ( rad > maxrad ) rad = maxrad; - Standard_Real pFAttach = Modulo2PI(att - rad); - Standard_Real pSAttach = Modulo2PI(att + rad); - myFAttach = ElCLib::Value(pFAttach, theEll->Elips()); - mySAttach = ElCLib::Value(pSAttach, theEll->Elips()); - if ( myAutomaticPosition ) - { - gp_Vec vtrans(myCenter,curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - curpos.Translate(vtrans); - myPosition = curpos; - } - } - // III.2. Two first or two last - else if ( IsEqual2PI(pf1,pf2,confusion) || IsEqual2PI(pl1,pl2,confusion) ) - { - Standard_Real l1 = Modulo2PI(pl1 - pf1); - Standard_Real l2 = Modulo2PI(pl2 - pf2); - gp_Pnt firstp,lastp; - if ( l1 < l2 ) - { - firstp = firstp1; - lastp = lastp1; - } - else - { - firstp = firstp2; - lastp = lastp2; - } - - if ( myAutomaticPosition ) - { - ComputeAutoArcPresentation(theEll, firstp, lastp); - } - else - { - ComputeNotAutoArcPresentation(theEll, firstp, lastp); - } - } - // IV. All others arcs (without common ends) - else - { - // order the parameters; first will be pf1 - Standard_Real pl1m = Modulo2PI(pl1 - pf1); - Standard_Real pf2m = Modulo2PI(pf2 - pf1); - Standard_Real pl2m = Modulo2PI(pl2 - pf1); - - Standard_Boolean case1 = Standard_False; - // 1 - not intersecting arcs - // 2 - intersecting arcs, but one doesn't contain another - // 3a - first arc contains the second one - // 3b - second arc contains the first one - // 4 - two intersections - - gp_Pnt firstp, lastp; - - if ( pl1m < pf2m ) // 1 or 2b or 3b - { - if ( pl1m < pl2m ) // 1 or 3b - { - if ( pl2m < pf2m ) // 3b - { - firstp = firstp1; - lastp = lastp1; - } - else // 1 - { - case1 = Standard_True; - Standard_Real deltap1 = Modulo2PI(pf1 - pl2); - Standard_Real deltap2 = Modulo2PI(pf2 - pl1); - if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || - ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 - { - firstp = lastp1; - lastp = firstp2; - } - else // deltap1 - { - firstp = lastp2; - lastp = firstp1; - } - } - } - else // 2b - { - firstp = firstp1; - lastp = lastp2; - } - } - else // 2a or 3a or 4 - { - if ( pl1m < pl2m ) // 2a - { - firstp = firstp2; - lastp = lastp1; - } - else // 3a or 4 - { - if ( pl2m > pf2m ) // 3a - { - firstp = firstp2; - lastp = lastp2; - } - else // 4 - { - Standard_Real deltap1 = Modulo2PI(pl1 - pf2); - Standard_Real deltap2 = Modulo2PI(pl2 - pf1); - if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || - ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 - { - firstp = firstp1; - lastp = lastp2; - } - else // deltap1 - { - firstp = firstp2; - lastp = lastp1; - } - } - } - } - - if ( myAutomaticPosition ) - { - ComputeAutoArcPresentation(theEll,firstp,lastp,case1); - } - else - { - if ( case1 ) - { - myFAttach = firstp; - mySAttach = lastp; - } - else ComputeNotAutoArcPresentation(theEll, firstp, lastp); - } - } - } - - // Display of the presentation - TCollection_ExtendedString vals(" =="); - gp_Pnt attach = myPosition; - ComputeAttach(theEll->Elips(),myFAttach,mySAttach,attach); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - theEll->Elips(), - myFAttach, - mySAttach, - myPosition, - attach); -} - -//======================================================================= -//function : ComputeAutoArcPresentation -//purpose : Compute the presentation of the constraint where we are -// not in the case of dragging. -//======================================================================= -void AIS_IdenticRelation::ComputeAutoArcPresentation(const Handle(Geom_Ellipse)& theEll, - const gp_Pnt& firstp, - const gp_Pnt& lastp, - const Standard_Boolean isstatic) -{ - Standard_Real aSegSize = theEll->MajorRadius()/5.0; - Standard_Real rad = M_PI / 5.0; - - gp_Elips anEll = theEll->Elips(); - - Standard_Real pFA = ElCLib::Parameter(anEll,firstp); - Standard_Real pSA = ElCLib::Parameter(anEll,lastp); - Standard_Real maxrad = Modulo2PI(pSA - pFA)/2.0; - - if ( (rad > maxrad) || isstatic ) rad = maxrad; - Standard_Real pmiddle = Modulo2PI(pFA + Modulo2PI(pSA - pFA)/2.0); - - myFAttach = ElCLib::Value(Modulo2PI(pmiddle - rad),anEll); - mySAttach = ElCLib::Value(Modulo2PI(pmiddle + rad),anEll); - - gp_Pnt curpos = ElCLib::Value(pmiddle,anEll); - gp_Vec vtrans(myCenter, curpos); - vtrans.Normalize(); - vtrans *= aSegSize; - myPosition = curpos.Translated(vtrans); -} - -//======================================================================= -//function : ComputeNotAutoElipsPresentation -//purpose : Compute the presentation of the constraint where we are -// in the case of dragging. -// Note : This function is to be used only in the case of ellipses. -// The symbol of the constraint moves only between myFAttach -// and mySAttach. -//======================================================================= -void AIS_IdenticRelation::ComputeNotAutoElipsPresentation(const Handle(Geom_Ellipse)& theEll) -{ - gp_Pnt curpos = myPosition; - - gp_Elips anEll = theEll->Elips(); - - // Case of confusion between the current position and the center - // of the ellipse -> we move the current position - Standard_Real confusion (Precision::Confusion()); - if ( myCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(myCenter, myFAttach); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - - Standard_Real rad = M_PI / 5.0; -// Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); - GeomAPI_ProjectPointOnCurve aProj (curpos, theEll); - Standard_Real pcurpos = aProj.LowerDistanceParameter(); - - Standard_Real pFAttach = pcurpos - rad; - Standard_Real pSAttach = pcurpos + rad; - myFAttach = ElCLib::Value(pFAttach,anEll); - mySAttach = ElCLib::Value(pSAttach,anEll); -} - -//======================================================================= -//function : ComputeNotAutoArcPresentation -//purpose : Compute the presentation of the constraint where we are -// in the case of dragging. -// Note : This function is to be used only in the case of ellipses. -// The symbol of the constraint moves only between myFAttach -// and mySAttach. -//======================================================================= -void AIS_IdenticRelation::ComputeNotAutoArcPresentation(const Handle(Geom_Ellipse)& theEll, - const gp_Pnt& pntfirst, - const gp_Pnt& pntlast) -{ - gp_Pnt curpos = myPosition; - - gp_Elips anEll = theEll->Elips(); - - Standard_Real pFPnt = ElCLib::Parameter(anEll, pntfirst); - Standard_Real pSPnt = ElCLib::Parameter(anEll, pntlast); - Standard_Real deltap = Modulo2PI(pSPnt - pFPnt)/2.0; - - Standard_Real rad = M_PI / 5; - if ( deltap < rad ) - { - myFAttach = pntfirst; - mySAttach = pntlast; - } - else - { - gp_Pnt aFPnt = ElCLib::Value(Modulo2PI(pFPnt + rad), anEll); - gp_Pnt aSPnt = ElCLib::Value(Modulo2PI(pSPnt - rad), anEll); - - ComputeAttach(anEll,aFPnt,aSPnt,curpos); - -// Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); - GeomAPI_ProjectPointOnCurve aProj (curpos, theEll); - Standard_Real pcurpos = aProj.LowerDistanceParameter(); - - myFAttach = ElCLib::Value(pcurpos - rad, anEll); - mySAttach = ElCLib::Value(pcurpos + rad, anEll); - } -} -// jfa 18/10/2000 end - -//======================================================================= -//function : ComputeTwoVerticesPresentation -//purpose : -//======================================================================= -void AIS_IdenticRelation::ComputeTwoVerticesPresentation(const Handle(Prs3d_Presentation)& aPrs) -{ - Standard_Boolean isOnPlane1, isOnPlane2; - const TopoDS_Vertex& FVertex = TopoDS::Vertex(myFShape); - const TopoDS_Vertex& SVertex = TopoDS::Vertex(mySShape); - - AIS::ComputeGeometry(FVertex, myFAttach, myPlane, isOnPlane1); - AIS::ComputeGeometry(SVertex, mySAttach, myPlane, isOnPlane2); - - if (isOnPlane1 && isOnPlane2) - myExtShape = 0; - else if ( isOnPlane1 && !isOnPlane2) - myExtShape = 2; - else if (!isOnPlane1 && isOnPlane2) - myExtShape = 1; - else - return ; - - - // The attachement points are the points themselves that must be - //identical - myFAttach = BRep_Tool::Pnt(FVertex); - mySAttach = myFAttach; - - gp_Pnt curpos; - if (myAutomaticPosition) - { - //Computation of the size of the symbol - Standard_Real symbsize = ComputeSegSize(); - if (symbsize <= Precision::Confusion()) symbsize = 1.; - symbsize*=5; - // Computation of the direction of the segment of the presentation - // we take the median of the edges connected to vertices - gp_Dir dF, dS; - gp_Dir myDir; - TColStd_ListIteratorOfListOfTransient it(Users()); - if (it.More()) - { - Handle(AIS_Shape) USER (Handle(AIS_Shape)::DownCast(it.Value())); - if (!USER.IsNull()) - { - const TopoDS_Shape& SH =USER->Shape(); - if ( (!SH.IsNull()) && (SH.ShapeType() == TopAbs_WIRE) ) - { - const TopoDS_Wire& WIRE = TopoDS::Wire(USER->Shape()); - Standard_Boolean done = ComputeDirection(WIRE,FVertex,dF); - if (!done) return; - done = ComputeDirection(WIRE,SVertex,dS); - if (!done) return; - } - else return; - } - else return; - - // computation of the segment direction like average - // of the 2 computed directions. - if ( dF.IsParallel(dS, Precision::Angular()) ) - { - myDir = dF.Crossed(myPlane->Pln().Axis().Direction()); - } - else - { - myDir.SetXYZ(dF.XYZ() + dS.XYZ()); - } - curpos = myFAttach.Translated(gp_Vec(myDir)*symbsize) ; - } -// jfa 11/10/2000 - else - { - curpos = myFAttach; - } -// jfa 11/10/2000 end - - myPosition = curpos; - myAutomaticPosition = Standard_False; - } - else - { - curpos = myPosition; - } - - // Presentation computation - TCollection_ExtendedString vals(" ++"); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - myFAttach, - curpos); - // Calculate the projection of vertex - if ( myExtShape == 1) - ComputeProjVertexPresentation(aPrs,FVertex,myFAttach); - else if ( myExtShape == 2) - ComputeProjVertexPresentation(aPrs,SVertex,mySAttach); -} - - - -//======================================================================= -//function : ComputeSegSize -//purpose : -//======================================================================= -Standard_Real AIS_IdenticRelation::ComputeSegSize() const -{ - return 1.; -} - -//======================================================================= -//function : ComputeDirection -//purpose : Compute a direction according to the different geometric -// elements connected to the vertex , in way to not have -// overlap between the symbol and them. -//======================================================================= -Standard_Boolean AIS_IdenticRelation::ComputeDirection(const TopoDS_Wire& aWire, - const TopoDS_Vertex& VERT, - gp_Dir& dF) const -{ - // we take the median of the edges connected to vertices - TopoDS_Edge edg1,edg2; - ConnectedEdges(aWire,VERT,edg1,edg2); - - if ( edg1.IsNull() && edg2.IsNull() ) { - return Standard_False; - } - - Handle(Geom_Curve) curv1,curv2; - gp_Pnt firstp1,lastp1,firstp2,lastp2; - - // Case with 2 edges connected to the vertex - if ( !edg1.IsNull() && !edg2.IsNull() ) { - if ( !AIS::ComputeGeometry(edg1,edg2, - curv1,curv2, - firstp1, lastp1, - firstp2, lastp2,myPlane)) - return Standard_False; - - gp_Dir d1, d2; - if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - d1 = ComputeCircleDirection(Handle(Geom_Circle)::DownCast (curv1), VERT); - } - else if (curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - d1 = ComputeLineDirection(Handle(Geom_Line)::DownCast (curv1), firstp1); - } - else - return Standard_False; - - if ( curv2->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - d2 = ComputeCircleDirection( Handle(Geom_Circle)::DownCast (curv2), VERT); - } - else if (curv2->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - d2 =ComputeLineDirection( Handle(Geom_Line)::DownCast (curv2), firstp2); - } - else - return Standard_False; - - if ( !d1.IsParallel(d2, Precision::Angular() )) - dF.SetXYZ( (d1.XYZ() + d2.XYZ())/2 ); - else { - dF= d1.Crossed(myPlane->Pln().Axis().Direction()); - } - } - - // Case where is at an extremity of a wire. - else { - TopoDS_Edge VEdge; - if ( !edg1.IsNull() ) - VEdge = edg1; - else if (!edg2.IsNull() ) - VEdge = edg2; - else - return Standard_False; - - if ( !AIS::ComputeGeometry(VEdge, curv1, firstp1, lastp1) ) - return Standard_False; - if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - dF = ComputeCircleDirection( Handle(Geom_Circle)::DownCast (curv1), VERT); - } - else if (curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - dF = ComputeLineDirection( Handle(Geom_Line)::DownCast (curv1), firstp1); - } - else - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputeLineDirection -//purpose : -//======================================================================= -gp_Dir AIS_IdenticRelation::ComputeLineDirection(const Handle(Geom_Line)& lin, - const gp_Pnt& firstP) const -{ - gp_Dir dir; - dir = lin->Lin().Direction(); - if ( !myFAttach.IsEqual(firstP, Precision::Confusion()) ) - dir.Reverse(); - return dir; -} - -//======================================================================= -//function : ComputeCircleDirection -//purpose : -//======================================================================= -gp_Dir AIS_IdenticRelation::ComputeCircleDirection(const Handle(Geom_Circle)& circ, - const TopoDS_Vertex& VERT) const -{ - gp_Vec V(circ->Location(),BRep_Tool::Pnt(VERT)); - return gp_Dir(V); -} - -//======================================================================= -//function : ComputeOneEdgeOVertexPresentation -//purpose : -//======================================================================= -void AIS_IdenticRelation::ComputeOneEdgeOVertexPresentation(const Handle(Prs3d_Presentation)& aPrs) -{ - TopoDS_Vertex V; - TopoDS_Edge E; - Standard_Integer numedge; - - if (myFShape.ShapeType() == TopAbs_VERTEX) { - V = TopoDS::Vertex(myFShape); - E = TopoDS::Edge(mySShape); - numedge = 2;// edge = 2nd shape - } - else { - V = TopoDS::Vertex(mySShape); - E = TopoDS::Edge(myFShape); - numedge = 1; // edge = 1st shape - } - gp_Pnt ptonedge1,ptonedge2; - Handle(Geom_Curve) aCurve; - Handle(Geom_Curve) extCurv; - Standard_Boolean isInfinite; - Standard_Boolean isOnPlanEdge, isOnPlanVertex; - if (!AIS::ComputeGeometry(E,aCurve,ptonedge1,ptonedge2,extCurv,isInfinite,isOnPlanEdge,myPlane)) - return; - aPrs->SetInfiniteState(isInfinite); - AIS::ComputeGeometry(V, myFAttach, myPlane, isOnPlanVertex); - - // only the curve can be projected - if (!isOnPlanEdge && !isOnPlanVertex) return; - - if (!isOnPlanEdge) { - if (numedge == 1) myExtShape = 1; - else myExtShape = 2; - } - else if (!isOnPlanVertex) { - if (numedge == 1) myExtShape = 2; - else myExtShape = 1; - } - // The attachement points are the point - myFAttach = BRep_Tool::Pnt(V); - mySAttach = myFAttach; - - gp_Pnt curpos; - if (myAutomaticPosition) { - //Computation of the size of the symbol - Standard_Real symbsize = ComputeSegSize(); - symbsize*=5; - // Computation of the direction of the segment of the presentation - // we take the median of the edges connected to vertices - gp_Dir myDir; - if ( aCurve->IsKind(STANDARD_TYPE(Geom_Line))) { - myDir = Handle(Geom_Line)::DownCast (aCurve)->Lin().Direction(); - myDir.Cross(myPlane->Pln().Axis().Direction()); - } - else if (aCurve->IsKind(STANDARD_TYPE(Geom_Circle))) { - Handle(Geom_Circle) CIR = Handle(Geom_Circle)::DownCast (aCurve); - myDir.SetXYZ(myFAttach.XYZ() - CIR->Location().XYZ()); - } - // jfa 10/10/2000 - else if (aCurve->IsKind(STANDARD_TYPE(Geom_Ellipse))) { - Handle(Geom_Ellipse) CIR = Handle(Geom_Ellipse)::DownCast (aCurve); - myDir.SetXYZ(myFAttach.XYZ() - CIR->Location().XYZ()); - } - // jfa 10/10/2000 end - - curpos = myFAttach.Translated(gp_Vec(myDir)*symbsize) ; - myPosition = curpos; - myAutomaticPosition = Standard_True; - } - else { - curpos = myPosition; - } - - // Presentation computation - TCollection_ExtendedString vals(" -+-"); - DsgPrs_IdenticPresentation::Add(aPrs, - myDrawer, - vals, - myFAttach, - curpos); - if (myExtShape != 0) { - if (!extCurv.IsNull()) { // the edge is not in the WP - ComputeProjEdgePresentation(aPrs,E,Handle(Geom_Line)::DownCast (aCurve),ptonedge1,ptonedge2); - } - } -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_IdenticRelation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_IdenticRelation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_IdenticRelation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_IdenticRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1997-03-03 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,128 +14,9 @@ #ifndef _AIS_IdenticRelation_HeaderFile #define _AIS_IdenticRelation_HeaderFile -#include -#include -#include -#include -#include - -class TopoDS_Shape; -class Geom_Plane; -class Geom_Line; -class gp_Pnt; -class Geom_Circle; -class Geom_Ellipse; -class TopoDS_Wire; -class TopoDS_Vertex; -class gp_Dir; - -DEFINE_STANDARD_HANDLE(AIS_IdenticRelation, AIS_Relation) - -//! Constructs a constraint by a relation of identity -//! between two or more datums figuring in shape -//! Interactive Objects. -class AIS_IdenticRelation : public AIS_Relation -{ - -public: - - //! Initializes the relation of identity between the two - //! entities, FirstShape and SecondShape. The plane - //! aPlane is initialized in case a visual reference is - //! needed to show identity. - Standard_EXPORT AIS_IdenticRelation(const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); - - Standard_Boolean HasUsers() const { return !myUsers.IsEmpty(); } - - const TColStd_ListOfTransient& Users() const { return myUsers; } - - void AddUser (const Handle(Standard_Transient)& theUser) { myUsers.Append (theUser); } - - void ClearUsers() { myUsers.Clear(); } - - //! Returns true if the interactive object is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - DEFINE_STANDARD_RTTIEXT(AIS_IdenticRelation,AIS_Relation) - -private: - - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeOneEdgeOVertexPresentation (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeTwoEdgesPresentation (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeTwoLinesPresentation (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Geom_Line)& aLin, gp_Pnt& Pnt1On1, gp_Pnt& Pnt2On1, gp_Pnt& Pnt1On2, gp_Pnt& Pnt2On2, const Standard_Boolean isInf1, const Standard_Boolean isInf2); - - Standard_EXPORT void ComputeTwoCirclesPresentation (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Geom_Circle)& aCircle, const gp_Pnt& Pnt1On1, const gp_Pnt& Pnt2On1, const gp_Pnt& Pnt1On2, const gp_Pnt& Pnt2On2); - - //! Computes the presentation of the identic constraint - //! between 2 arcs in the case of automatic presentation - Standard_EXPORT void ComputeAutoArcPresentation (const Handle(Geom_Circle)& aCircle, const gp_Pnt& firstp, const gp_Pnt& lastp, const Standard_Boolean isstatic = Standard_False); - - //! Computes the presentation of the identic constraint - //! between 2 circles in the case of non automatic presentation - Standard_EXPORT void ComputeNotAutoCircPresentation (const Handle(Geom_Circle)& aCircle); - - //! Computes the presentation of the identic constraint - //! between 2 arcs in the case of non automatic presentation - Standard_EXPORT void ComputeNotAutoArcPresentation (const Handle(Geom_Circle)& aCircle, const gp_Pnt& pntfirst, const gp_Pnt& pntlast); - - Standard_EXPORT void ComputeTwoEllipsesPresentation (const Handle(Prs3d_Presentation)& aPrs, const Handle(Geom_Ellipse)& anEll, const gp_Pnt& Pnt1On1, const gp_Pnt& Pnt2On1, const gp_Pnt& Pnt1On2, const gp_Pnt& Pnt2On2); - - //! Computes the presentation of the identic constraint - //! between 2 arcs in the case of automatic presentation - Standard_EXPORT void ComputeAutoArcPresentation (const Handle(Geom_Ellipse)& theEll, const gp_Pnt& firstp, const gp_Pnt& lastp, const Standard_Boolean isstatic = Standard_False); - - //! Computes the presentation of the identic constraint - //! between 2 ellipses in the case of non automatic presentation - Standard_EXPORT void ComputeNotAutoElipsPresentation (const Handle(Geom_Ellipse)& theEll); - - //! Computes the presentation of the identic constraint - //! between 2 arcs in the case of non automatic presentation - Standard_EXPORT void ComputeNotAutoArcPresentation (const Handle(Geom_Ellipse)& theEll, const gp_Pnt& pntfirst, const gp_Pnt& pntlast); - - Standard_EXPORT void ComputeTwoVerticesPresentation (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT Standard_Real ComputeSegSize() const; - - Standard_EXPORT Standard_Boolean ComputeDirection (const TopoDS_Wire& aWire, const TopoDS_Vertex& aVertex, gp_Dir& aDir) const; - - Standard_EXPORT gp_Dir ComputeLineDirection (const Handle(Geom_Line)& aLin, const gp_Pnt& anExtremity) const; - - Standard_EXPORT gp_Dir ComputeCircleDirection (const Handle(Geom_Circle)& aCirc, const TopoDS_Vertex& ConnectedVertex) const; - -private: - - TColStd_ListOfTransient myUsers; - Standard_Boolean isCircle; - gp_Pnt myFAttach; - gp_Pnt mySAttach; - gp_Pnt myCenter; - -}; - - -#include - - - +#include +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_IdenticRelation AIS_IdenticRelation; #endif // _AIS_IdenticRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_IdenticRelation.lxx opencascade-7.5.1+dfsg1/src/AIS/AIS_IdenticRelation.lxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_IdenticRelation.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_IdenticRelation.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Created on: 1997-03-04 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_IdenticRelation::IsMovable() const -{ - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveContext_1.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveContext_1.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveContext_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveContext_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -172,8 +172,8 @@ { const Handle(SelectMgr_EntityOwner) anOwner = aSelIter.Value(); const Handle(AIS_InteractiveObject) anInteractive = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable()); - Handle(AIS_GlobalStatus) aStatus; - if (!myObjects.Find (anInteractive, aStatus)) + Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (anInteractive); + if (!aStatusPtr) { continue; } @@ -183,9 +183,9 @@ anOwner->Unhilight (myMainPM); if (theIsToHilightSubIntensity) { - if (aStatus->IsSubIntensityOn()) + if ((*aStatusPtr)->IsSubIntensityOn()) { - const Standard_Integer aHiMode = getHilightMode (anInteractive, aStatus->HilightStyle(), aStatus->DisplayMode()); + const Standard_Integer aHiMode = getHilightMode (anInteractive, (*aStatusPtr)->HilightStyle(), (*aStatusPtr)->DisplayMode()); highlightWithSubintensity (anOwner, aHiMode); } } @@ -196,7 +196,7 @@ } if (anOwner == anInteractive->GlobalSelOwner()) { - aStatus->SetHilightStatus (Standard_False); + (*aStatusPtr)->SetHilightStatus (Standard_False); } } for (NCollection_IndexedMap::Iterator anIter (anObjToClear); anIter.More(); anIter.Next()) @@ -746,11 +746,15 @@ continue; const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (anObj, anOwner); - Handle(AIS_GlobalStatus)& aState = myObjects.ChangeFind(anObj); + Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (anObj); + if (!aStatusPtr) + { + continue; + } if (anOwner == anObj->GlobalSelOwner()) { - aState->SetHilightStatus (Standard_True); - aState->SetHilightStyle (anObjSelStyle); + (*aStatusPtr)->SetHilightStatus (Standard_True); + (*aStatusPtr)->SetHilightStyle (anObjSelStyle); } if (!anOwner->IsAutoHilight()) { @@ -768,7 +772,7 @@ } else { - const Standard_Integer aHiMode = getHilightMode (anObj, anObjSelStyle, aState->DisplayMode()); + const Standard_Integer aHiMode = getHilightMode (anObj, anObjSelStyle, (*aStatusPtr)->DisplayMode()); anOwner->HilightWithColor (myMainPM, anObjSelStyle, aHiMode); } } @@ -872,7 +876,10 @@ } if (aSelOwner == aSelectable->GlobalSelOwner()) { - myObjects.ChangeFind (aSelectable)->SetHilightStatus (Standard_False); + if (Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (aSelectable)) + { + (*aStatusPtr)->SetHilightStatus (Standard_False); + } } } @@ -990,7 +997,12 @@ if (myAutoHilight) { const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()); - Handle(AIS_GlobalStatus)& aStatus = myObjects.ChangeFind (anObj); + Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (anObj); + if (!aStatusPtr) + { + return; + } + if (theOwner->IsSelected()) { highlightSelected (theOwner); @@ -1001,7 +1013,7 @@ anOwners.Append (theOwner); unhighlightOwners (anOwners); - aStatus->SetHilightStyle (Handle(Prs3d_Drawer)()); + (*aStatusPtr)->SetHilightStyle (Handle(Prs3d_Drawer)()); } } diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveContext_3.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveContext_3.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveContext_3.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveContext_3.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -86,3 +85,42 @@ anObj->PolygonOffsets( aMode, aFactor, aUnits ); } // OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void AIS_InteractiveContext::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myObjects.Size()) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, mgrSelector.get()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myMainPM.get()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myMainVwr.get()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myMainSel.get()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myLastActiveView) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myLastPicked.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToHilightSelected) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, mySelection.get()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myFilters.get()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myDefaultDrawer.get()) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myStyles[Prs3d_TypeOfHighlight_Selected]) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myStyles[Prs3d_TypeOfHighlight_Dynamic]) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myStyles[Prs3d_TypeOfHighlight_LocalSelected]) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myStyles[Prs3d_TypeOfHighlight_LocalDynamic]) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myStyles[Prs3d_TypeOfHighlight_SubIntensity]) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDetectedSeq.Size()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCurDetected) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCurHighlighted) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPickingStrategy) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAutoHilight) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsAutoActivateSelMode) +} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveContext.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveContext.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveContext.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveContext.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -128,7 +128,7 @@ myMainSel(new StdSelect_ViewerSelector3d()), myToHilightSelected(Standard_True), mySelection(new AIS_Selection()), -myFilters(new SelectMgr_OrFilter()), +myFilters (new SelectMgr_AndOrFilter(SelectMgr_FilterType_OR)), myDefaultDrawer(new Prs3d_Drawer()), myCurDetected(0), myCurHighlighted(0), @@ -1174,57 +1174,6 @@ } //======================================================================= -//function : SetHLRDeviationCoefficient -//purpose : -//======================================================================= -void AIS_InteractiveContext::SetHLRDeviationCoefficient (const Standard_Real theCoefficient) -{ - myDefaultDrawer->SetHLRDeviationCoefficient (theCoefficient); -} - -//======================================================================= -//function : HLRDeviationCoefficient -//purpose : -//======================================================================= -Standard_Real AIS_InteractiveContext::HLRDeviationCoefficient() const -{ - return myDefaultDrawer->HLRDeviationCoefficient(); -} - -//======================================================================= -//function : SetHLRAngle -//purpose : -//======================================================================= -void AIS_InteractiveContext::SetHLRAngle (const Standard_Real theAngle) -{ - myDefaultDrawer->SetHLRAngle (theAngle); -} - -//======================================================================= -//function : SetHLRAngleAndDeviation -//purpose : compute with anangle a HLRAngle and a HLRDeviationCoefficient -// and set them in myHLRAngle and in myHLRDeviationCoefficient -// of myDefaultDrawer -//======================================================================= -void AIS_InteractiveContext::SetHLRAngleAndDeviation (const Standard_Real theAngle) -{ - Standard_Real anOutAngl, anOutDefl; - HLRBRep::PolyHLRAngleAndDeflection (theAngle, anOutAngl, anOutDefl); - - myDefaultDrawer->SetHLRAngle (anOutAngl); - myDefaultDrawer->SetHLRDeviationCoefficient (anOutDefl); -} - -//======================================================================= -//function : HLRAngle -//purpose : -//======================================================================= -Standard_Real AIS_InteractiveContext::HLRAngle() const -{ - return myDefaultDrawer->HLRAngle(); -} - -//======================================================================= //function : SetDisplayMode //purpose : //======================================================================= @@ -1473,40 +1422,6 @@ } //======================================================================= -//function : SetHLRDeviationCoefficient -//purpose : -//======================================================================= -void AIS_InteractiveContext::SetHLRDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj, - const Standard_Real theCoefficient, - const Standard_Boolean theToUpdateViewer) -{ - if (theIObj.IsNull()) - { - return; - } - - // To be modified after the related methods of AIS_Shape are passed to InteractiveObject - setContextToObject (theIObj); - if (theIObj->Type() != AIS_KOI_Object - && theIObj->Type() != AIS_KOI_Shape) - { - return; - } - else if (theIObj->Signature() != 0) - { - return; - } - - Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj); - aShape->SetOwnHLRDeviationCoefficient (theCoefficient); - aShape->UpdatePresentations(); - if (theToUpdateViewer) - { - UpdateCurrentViewer(); - } -} - -//======================================================================= //function : SetDeviationAngle //purpose : //======================================================================= @@ -1573,70 +1488,6 @@ } //======================================================================= -//function : SetHLRAngleAndDeviation -//purpose : -//======================================================================= -void AIS_InteractiveContext::SetHLRAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj, - const Standard_Real theAngle, - const Standard_Boolean theToUpdateViewer) -{ - if (theIObj.IsNull()) - { - return; - } - - // To be modified after the related methods of AIS_Shape are passed to InteractiveObject - setContextToObject (theIObj); - if (theIObj->Type() != AIS_KOI_Shape) - { - return; - } - if (theIObj->Signature() != 0) - { - return; - } - Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj); - aShape->SetHLRAngleAndDeviation (theAngle); - aShape->UpdatePresentations(); - if (theToUpdateViewer) - { - UpdateCurrentViewer(); - } -} - -//======================================================================= -//function : SetHLRDeviationAngle -//purpose : -//======================================================================= -void AIS_InteractiveContext::SetHLRDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj, - const Standard_Real theAngle, - const Standard_Boolean theToUpdateViewer) -{ - if (theIObj.IsNull()) - { - return; - } - - // To be modified after the related methods of AIS_Shape are passed to InteractiveObject - setContextToObject (theIObj); - if (theIObj->Type() != AIS_KOI_Shape) - { - return; - } - if (theIObj->Signature() != 0) - { - return; - } - Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj); - aShape->SetOwnHLRDeviationAngle (theAngle); - aShape->UpdatePresentations(); - if (theToUpdateViewer) - { - UpdateCurrentViewer(); - } -} - -//======================================================================= //function : UnsetColor //purpose : //======================================================================= @@ -2329,7 +2180,7 @@ //======================================================================= void AIS_InteractiveContext::InitAttributes() { - Graphic3d_MaterialAspect aMat (Graphic3d_NOM_BRASS); + Graphic3d_MaterialAspect aMat (Graphic3d_NameOfMaterial_Brass); myDefaultDrawer->ShadingAspect()->SetMaterial (aMat); // myDefaultDrawer->ShadingAspect()->SetColor(Quantity_NOC_GRAY70); diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveContext.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveContext.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveContext.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveContext.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -46,7 +47,6 @@ class SelectMgr_SelectionManager; class V3d_Viewer; -class SelectMgr_OrFilter; class V3d_View; class TopLoc_Location; class TCollection_ExtendedString; @@ -736,6 +736,15 @@ public: //! @name Selection Filters management + //! @return the context selection filter type. + SelectMgr_FilterType FilterType() const { return myFilters->FilterType(); } + + //! Sets the context selection filter type. + //! SelectMgr_TypeFilter_OR selection filter is used by default. + //! @param theFilterType the filter type. + void SetFilterType (const SelectMgr_FilterType theFilterType) + { myFilters->SetFilterType (theFilterType); } + //! Returns the list of filters active in a local context. Standard_EXPORT const SelectMgr_ListOfFilter& Filters() const; @@ -971,23 +980,6 @@ Standard_EXPORT void SetAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj, const Standard_Real theAngle, const Standard_Boolean theToUpdateViewer); - - - //! Sets the deviation coefficient aCoefficient for removal of hidden lines created by different viewpoints in different presentations. - //! The Default value is 0.02. - Standard_EXPORT void SetHLRDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj, - const Standard_Real theCoefficient, - const Standard_Boolean theToUpdateViewer); - - Standard_EXPORT void SetHLRDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj, - const Standard_Real theAngle, - const Standard_Boolean theToUpdateViewer); - - //! Computes a HLRAngle and a HLRDeviationCoefficient by means of the angle anAngle - //! and sets the corresponding methods in the default drawing tool with these values. - Standard_EXPORT void SetHLRAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj, - const Standard_Real theAngle, - const Standard_Boolean theToUpdateViewer); //! Sets the deviation coefficient theCoefficient. //! Drawings of curves or patches are made with respect to a maximal chordal deviation. @@ -1017,40 +1009,10 @@ //! This deviation will be: SizeOfObject * DeviationCoefficient. Standard_EXPORT Standard_Real DeviationCoefficient() const; - //! default 12 degrees + //! default 20 degrees Standard_EXPORT void SetDeviationAngle (const Standard_Real anAngle); Standard_EXPORT Standard_Real DeviationAngle() const; - - //! Sets the deviation coefficient aCoefficient for removal of hidden lines created by different viewpoints in different presentations. - //! The Default value is 0.02. - Standard_EXPORT void SetHLRDeviationCoefficient (const Standard_Real aCoefficient); - - //! Returns the real number value of the hidden line removal deviation coefficient. - //! A Deviation coefficient is used in the shading display mode. - //! The shape is seen decomposed into triangles. - //! These are used to calculate reflection of light from the surface of the object. - //! The triangles are formed from chords of the curves in the shape. - //! The deviation coefficient give the highest value of the angle with which a chord can deviate from a tangent to a curve. - //! If this limit is reached, a new triangle is begun. - //! To find the hidden lines, hidden line display mode entails recalculation of the view at each different projector perspective. - //! Because hidden lines entail calculations of more than usual complexity to decompose them into these triangles, - //! a deviation coefficient allowing greater tolerance is used. - //! This increases efficiency in calculation. - //! The Default value is 0.02. - Standard_EXPORT Standard_Real HLRDeviationCoefficient() const; - - //! Sets the HLR angle. - Standard_EXPORT void SetHLRAngle (const Standard_Real theAngle); - - //! Returns the real number value of the deviation angle in hidden line removal views in this interactive context. - //! The default value is 20*PI/180. - Standard_EXPORT Standard_Real HLRAngle() const; - - //! compute with theAngle a HLRAngle and a HLRDeviationCoefficient - //! and set them in myHLRAngle and in myHLRDeviationCoefficient of myDefaultDrawer; - //! theAngle is in radian; ( 1 deg < angle in deg < 20 deg) - Standard_EXPORT void SetHLRAngleAndDeviation (const Standard_Real theAngle); public: //! @name HLR (Hidden Line Removal) display attributes @@ -1216,6 +1178,9 @@ //! @param theSelection an instance of the selection void SetSelection (const Handle(AIS_Selection)& theSelection) { mySelection = theSelection; } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: //! @name internal methods Standard_EXPORT void GetDefModes (const Handle(AIS_InteractiveObject)& anIobj, Standard_Integer& Dmode, Standard_Integer& HiMod, Standard_Integer& SelMode) const; @@ -1376,14 +1341,7 @@ if (myLastPicked.IsNull()) return; - if (myLastPicked->IsAutoHilight()) - { - myMainPM->ClearImmediateDraw(); - } - else - { - myLastPicked->Selectable()->ClearDynamicHighlight (myMainPM); - } + myLastPicked->Selectable()->ClearDynamicHighlight (myMainPM); } //! Bind/Unbind status to object and its children @@ -1405,7 +1363,8 @@ Handle(SelectMgr_EntityOwner) myLastPicked; Standard_Boolean myToHilightSelected; Handle(AIS_Selection) mySelection; - Handle(SelectMgr_OrFilter) myFilters; + Handle(SelectMgr_AndOrFilter) myFilters; //!< context filter (the content active filters + //! can be applied with AND or OR operation) Handle(Prs3d_Drawer) myDefaultDrawer; Handle(Prs3d_Drawer) myStyles[Prs3d_TypeOfHighlight_NB]; TColStd_SequenceOfInteger myDetectedSeq; diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveObject.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveObject.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveObject.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveObject.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,6 +57,20 @@ } //======================================================================= +//function : ProcessDragging +//purpose : +//======================================================================= +Standard_Boolean AIS_InteractiveObject::ProcessDragging (const Handle(AIS_InteractiveContext)&, + const Handle(V3d_View)&, + const Handle(SelectMgr_EntityOwner)&, + const Graphic3d_Vec2i&, + const Graphic3d_Vec2i&, + const AIS_DragAction) +{ + return Standard_False; +} + +//======================================================================= //function : //purpose : //======================================================================= @@ -148,11 +162,11 @@ //function : DumpJson //purpose : //======================================================================= -void AIS_InteractiveObject::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void AIS_InteractiveObject::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, AIS_InteractiveObject); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_BASE_CLASS (theOStream, theDepth, SelectMgr_SelectableObject); - OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myCTXPtr); - OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myOwner); + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, SelectMgr_SelectableObject) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myCTXPtr) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myOwner) } diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveObject.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveObject.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_InteractiveObject.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_InteractiveObject.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,12 +18,14 @@ #define _AIS_InteractiveObject_HeaderFile #include +#include #include class AIS_InteractiveContext; class Graphic3d_MaterialAspect; class Prs3d_BasicAspect; class Bnd_Box; +class V3d_View; //! Defines a class of objects with display and selection services. //! Entities which are visualized and selected are Interactive Objects. @@ -103,6 +105,21 @@ //! This method removes the owner from the graphic entity. void ClearOwner() { myOwner.Nullify(); } + //! Drag object in the viewer. + //! @param theCtx [in] interactive context + //! @param theView [in] active View + //! @param theOwner [in] the owner of detected entity + //! @param theDragFrom [in] drag start point + //! @param theDragTo [in] drag end point + //! @param theAction [in] drag action + //! @return FALSE if object rejects dragging action (e.g. AIS_DragAction_Start) + Standard_EXPORT virtual Standard_Boolean ProcessDragging (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView, + const Handle(SelectMgr_EntityOwner)& theOwner, + const Graphic3d_Vec2i& theDragFrom, + const Graphic3d_Vec2i& theDragTo, + const AIS_DragAction theAction); + public: //! Returns the context pointer to the interactive context. @@ -119,7 +136,7 @@ Standard_EXPORT void SetAspect (const Handle(Prs3d_BasicAspect)& anAspect); //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: //! The TypeOfPresention3d means that the interactive object diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_KindOfDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_KindOfDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_KindOfDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_KindOfDimension.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _AIS_KindOfDimension_HeaderFile -#define _AIS_KindOfDimension_HeaderFile - -//! Declares the kinds of dimensions needed in the -//! display of Interactive Objects. -enum AIS_KindOfDimension -{ -AIS_KOD_NONE, -AIS_KOD_LENGTH, -AIS_KOD_PLANEANGLE, -AIS_KOD_SOLIDANGLE, -AIS_KOD_AREA, -AIS_KOD_VOLUME, -AIS_KOD_MASS, -AIS_KOD_TIME, -AIS_KOD_RADIUS, -AIS_KOD_DIAMETER, -AIS_KOD_CHAMF2D, -AIS_KOD_CHAMF3D, -AIS_KOD_OFFSET, -AIS_KOD_ELLIPSERADIUS -}; - -#endif // _AIS_KindOfDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_KindOfRelation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_KindOfRelation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_KindOfRelation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_KindOfRelation.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -// Created on: 2016-11-25 -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _AIS_KindOfRelation_HeaderFile -#define _AIS_KindOfRelation_HeaderFile - -enum AIS_KindOfRelation -{ - AIS_KOR_NONE = 0, - AIS_KOR_CONCENTRIC, - AIS_KOR_EQUALDISTANCE, - AIS_KOR_EQUALRADIUS, - AIS_KOR_FIX, - AIS_KOR_IDENTIC, - AIS_KOR_OFFSET, - AIS_KOR_PARALLEL, - AIS_KOR_PERPENDICULAR, - AIS_KOR_TANGENT, - AIS_KOR_SYMMETRIC -}; - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_KindOfSurface.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_KindOfSurface.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_KindOfSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_KindOfSurface.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _AIS_KindOfSurface_HeaderFile -#define _AIS_KindOfSurface_HeaderFile - - -enum AIS_KindOfSurface -{ -AIS_KOS_Plane, -AIS_KOS_Cylinder, -AIS_KOS_Cone, -AIS_KOS_Sphere, -AIS_KOS_Torus, -AIS_KOS_Revolution, -AIS_KOS_Extrusion, -AIS_KOS_OtherSurface -}; - -#endif // _AIS_KindOfSurface_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_KindOfUnit.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_KindOfUnit.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_KindOfUnit.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_KindOfUnit.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _AIS_KindOfUnit_HeaderFile -#define _AIS_KindOfUnit_HeaderFile - -//! Declares the type of Interactive Object unit. -enum AIS_KindOfUnit -{ -AIS_TOU_LENGTH, -AIS_TOU_SURFACE, -AIS_TOU_VOLUME, -AIS_TOU_PLANE_ANGLE, -AIS_TOU_SOLID_ANGLE, -AIS_TOU_MASS, -AIS_TOU_FORCE, -AIS_TOU_TIME -}; - -#endif // _AIS_KindOfUnit_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_LengthDimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_LengthDimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_LengthDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_LengthDimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,826 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Arnaud BOUZY/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2013 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -IMPLEMENT_STANDARD_RTTIEXT(AIS_LengthDimension,AIS_Dimension) - -//======================================================================= -//function : Constructor -//purpose : Dimension between two faces -//======================================================================= -AIS_LengthDimension::AIS_LengthDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace) -: AIS_Dimension (AIS_KOD_LENGTH), - myHasCustomDirection (Standard_False) -{ - SetMeasuredGeometry (theFirstFace, theSecondFace); - SetFlyout (15.0); -} - -//======================================================================= -//function : Constructor -//purpose : Dimension between two shape -//======================================================================= -AIS_LengthDimension::AIS_LengthDimension (const TopoDS_Face& theFace, - const TopoDS_Edge& theEdge) -: AIS_Dimension (AIS_KOD_LENGTH), - myHasCustomDirection (Standard_False) -{ - SetMeasuredGeometry (theFace, theEdge); - SetFlyout (15.0); -} - -//======================================================================= -//function : Constructor -//purpose : Dimension between two points -//======================================================================= -AIS_LengthDimension::AIS_LengthDimension (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pln& thePlane) -: AIS_Dimension (AIS_KOD_LENGTH), - myHasCustomDirection (Standard_False) -{ - SetMeasuredGeometry (theFirstPoint, theSecondPoint, thePlane); - SetFlyout (15.0); -} - -//======================================================================= -//function : Constructor -//purpose : Dimension between two shape -//======================================================================= -AIS_LengthDimension::AIS_LengthDimension (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape, - const gp_Pln& thePlane) -: AIS_Dimension (AIS_KOD_LENGTH), - myHasCustomDirection (Standard_False) -{ - SetCustomPlane (thePlane); - SetMeasuredShapes (theFirstShape, theSecondShape); - SetFlyout (15.0); -} - -//======================================================================= -//function : Constructor -//purpose : Dimension of one edge -//======================================================================= -AIS_LengthDimension::AIS_LengthDimension (const TopoDS_Edge& theEdge, - const gp_Pln& thePlane) -: AIS_Dimension (AIS_KOD_LENGTH), - myHasCustomDirection (Standard_False) -{ - SetMeasuredGeometry (theEdge, thePlane); - SetFlyout (15.0); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_LengthDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pln& thePlane) -{ - myFirstPoint = theFirstPoint; - mySecondPoint = theSecondPoint; - myFirstShape = BRepLib_MakeVertex (myFirstPoint); - mySecondShape = BRepLib_MakeVertex (mySecondPoint); - myGeometryType = GeometryType_Points; - SetCustomPlane (thePlane); - myIsGeometryValid = IsValidPoints (theFirstPoint, theSecondPoint); - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_LengthDimension::SetMeasuredGeometry (const TopoDS_Edge& theEdge, - const gp_Pln& thePlane) -{ - myFirstShape = theEdge; - mySecondShape = TopoDS_Shape(); - myGeometryType = GeometryType_Edge; - SetCustomPlane (thePlane); - myIsGeometryValid = InitOneShapePoints (myFirstShape); - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_LengthDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace) -{ - SetMeasuredShapes (theFirstFace, theSecondFace); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_LengthDimension::SetMeasuredGeometry (const TopoDS_Face& theFace, - const TopoDS_Edge& theEdge) -{ - SetMeasuredShapes (theFace, theEdge); -} - -//======================================================================= -//function : SetMeasuredShapes -//purpose : -//======================================================================= -void AIS_LengthDimension::SetMeasuredShapes (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape) -{ - gp_Pln aComputedPlane; - Standard_Boolean isPlaneReturned = Standard_False; - - myFirstShape = theFirstShape; - mySecondShape = theSecondShape; - myIsGeometryValid = InitTwoShapesPoints (myFirstShape, mySecondShape, aComputedPlane, isPlaneReturned); - - if (myIsGeometryValid && !myIsPlaneCustom) - { - if (isPlaneReturned) - { - myPlane = aComputedPlane; - } - else - { - myIsGeometryValid = Standard_False; - } - } - - SetToUpdate(); -} - -//======================================================================= -//function : CheckPlane -//purpose : -//======================================================================= -Standard_Boolean AIS_LengthDimension::CheckPlane (const gp_Pln& thePlane) const -{ - Standard_Boolean anIsFaultyNormal = - thePlane.Axis().Direction().IsParallel(gce_MakeDir (myFirstPoint, mySecondPoint), Precision::Angular()); - - if ((!thePlane.Contains (myFirstPoint, Precision::Confusion()) && !thePlane.Contains (mySecondPoint, Precision::Confusion())) - || anIsFaultyNormal) - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputePlane -//purpose : -//======================================================================= -gp_Pln AIS_LengthDimension::ComputePlane (const gp_Dir& theAttachDir) const -{ - if (!IsValidPoints (myFirstPoint, mySecondPoint)) - { - return gp_Pln(); - } - - gp_Pnt aThirdPoint (myFirstPoint.Translated (gp_Vec(theAttachDir))); - gce_MakePln aPlaneConstrustor (myFirstPoint, mySecondPoint, aThirdPoint); - return aPlaneConstrustor.Value(); -} - -//======================================================================= -//function : GetModelUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_LengthDimension::GetModelUnits() const -{ - return myDrawer->DimLengthModelUnits(); -} - -//======================================================================= -//function : GetDisplayUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_LengthDimension::GetDisplayUnits() const -{ - return myDrawer->DimLengthDisplayUnits(); -} - -//======================================================================= -//function : SetModelUnits -//purpose : -//======================================================================= -void AIS_LengthDimension::SetModelUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthModelUnits (theUnits); -} - -//======================================================================= -//function : SetDisplayUnits -//purpose : -//======================================================================= -void AIS_LengthDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthDisplayUnits (theUnits); -} - -//======================================================================= -//function : ComputeValue -//purpose : -//======================================================================= -Standard_Real AIS_LengthDimension::ComputeValue() const -{ - if (!IsValid()) - return 0.0; - - if (!myHasCustomDirection) - return myFirstPoint.Distance (mySecondPoint); - - return fabs (gp_Vec(myFirstPoint, mySecondPoint).Dot (myDirection)); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_LengthDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) -{ - mySelectionGeom.Clear (theMode); - - if (!IsValid()) - { - return; - } - - DrawLinearDimension (thePresentation, theMode, myFirstPoint, mySecondPoint); -} - - //======================================================================= -//function : ComputeFlyoutLinePoints -//purpose : -//======================================================================= -void AIS_LengthDimension::ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, - gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) -{ - if (!myHasCustomDirection) - { - AIS_Dimension::ComputeFlyoutLinePoints (theFirstPoint, theSecondPoint, theLineBegPoint, theLineEndPoint); - return; - } - - // find scalar of projection target vector (from start to second point) to flyout vector - gp_Ax1 aPlaneNormal = GetPlane().Axis(); - gp_Vec aFlyoutNormalizedDir(aPlaneNormal.Direction() ^ myDirection); - aFlyoutNormalizedDir.Normalize(); - Standard_Real aTargetProjectedToFlyout = gp_Vec(theFirstPoint, theSecondPoint).Dot (aFlyoutNormalizedDir); - - gp_Dir aFlyoutVector = aFlyoutNormalizedDir; - // create lines for layouts - gp_Lin aLine1 (theFirstPoint, aFlyoutVector); - gp_Lin aLine2 (theSecondPoint, aFlyoutVector); - - // Get flyout end points - theLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout() + aTargetProjectedToFlyout, aLine1); - theLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); -} - -//======================================================================= -//function : ComputeFlyoutSelection -//purpose : -//======================================================================= -void AIS_LengthDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theEntityOwner) -{ - if (!IsValid()) - { - return; - } - - ComputeLinearFlyouts (theSelection, theEntityOwner, myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : IsValidPoints -//purpose : -//======================================================================= -Standard_Boolean AIS_LengthDimension::IsValidPoints (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint) const -{ - return theFirstPoint.Distance (theSecondPoint) > Precision::Confusion(); -} - -//======================================================================= -//function : InitTwoEdgesLength -//purpose : Initialization of dimension between two linear edges -//======================================================================= -Standard_Boolean AIS_LengthDimension::InitTwoEdgesLength (const TopoDS_Edge& theFirstEdge, - const TopoDS_Edge& theSecondEdge, - gp_Dir& theDirAttach) -{ - BRepAdaptor_Curve aFirstCurveAdapt (theFirstEdge); - if (aFirstCurveAdapt.GetType() != GeomAbs_Line) - { - return Standard_False; - } - - BRepAdaptor_Curve aSecondCurveAdapt (theSecondEdge); - if (aSecondCurveAdapt.GetType() != GeomAbs_Line) - { - return Standard_False; - } - - Handle(Geom_Curve) aFirstCurve; - Handle(Geom_Curve) aSecondCurve; - - gp_Pnt aPoint11 (gp::Origin()); - gp_Pnt aPoint12 (gp::Origin()); - gp_Pnt aPoint21 (gp::Origin()); - gp_Pnt aPoint22 (gp::Origin()); - Standard_Boolean isFirstInfinite = Standard_False; - Standard_Boolean isSecondInfinite = Standard_False; - - if (!AIS::ComputeGeometry (theFirstEdge, theSecondEdge, - aFirstCurve, aSecondCurve, - aPoint11, aPoint12, - aPoint21, aPoint22, - isFirstInfinite, - isSecondInfinite)) - { - return Standard_False; - } - - const Handle(Geom_Line) aFirstLine = Handle(Geom_Line)::DownCast (aFirstCurve); - const Handle(Geom_Line) aSecondLine = Handle(Geom_Line)::DownCast (aSecondCurve); - - if (!aFirstLine->Lin().Direction().IsParallel (aSecondLine->Lin().Direction(),Precision::Angular())) - { - return Standard_False; - } - - theDirAttach = aFirstLine->Lin().Direction(); - - gp_Pnt aPoint; - - if (!isFirstInfinite) - { - if (AIS::Nearest (aSecondCurve, aPoint11, aPoint21, aPoint22, aPoint)) - { - myFirstPoint = aPoint11; - mySecondPoint = aPoint; - return IsValidPoints (myFirstPoint, mySecondPoint); - } - else if (AIS::Nearest (aSecondCurve, aPoint12, aPoint21, aPoint22, aPoint)) - { - myFirstPoint = aPoint12; - mySecondPoint = aPoint; - return IsValidPoints (myFirstPoint, mySecondPoint); - } - } - - if (!isSecondInfinite) - { - if (AIS::Nearest (aFirstCurve, aPoint21, aPoint11, aPoint12, aPoint)) - { - myFirstPoint = aPoint; - mySecondPoint = aPoint21; - return IsValidPoints (myFirstPoint, mySecondPoint); - } - if (AIS::Nearest (aFirstCurve, aPoint22, aPoint11, aPoint12, aPoint)) - { - myFirstPoint = aPoint; - mySecondPoint = aPoint22; - return IsValidPoints (myFirstPoint, mySecondPoint); - } - } - - GeomAPI_ExtremaCurveCurve anExtrema (aFirstCurve, aSecondCurve); - anExtrema.NearestPoints (myFirstPoint, mySecondPoint); - return IsValidPoints (myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : InitEdgeVertexLength -//purpose : for first edge and second vertex shapes -//======================================================================= -Standard_Boolean AIS_LengthDimension::InitEdgeVertexLength (const TopoDS_Edge& theEdge, - const TopoDS_Vertex& theVertex, - gp_Dir& theEdgeDir, - Standard_Boolean isInfinite) -{ - gp_Pnt anEdgePoint1 (gp::Origin()); - gp_Pnt anEdgePoint2 (gp::Origin()); - Handle(Geom_Curve) aCurve; - - if (!AIS::ComputeGeometry (theEdge, aCurve, anEdgePoint1, anEdgePoint2, isInfinite)) - { - return Standard_False; - } - - myFirstPoint = BRep_Tool::Pnt (theVertex); - - Handle(Geom_Line) aGeomLine (Handle(Geom_Line)::DownCast (aCurve)); - const gp_Lin& aLin = aGeomLine->Lin(); - - // Get direction of edge to build plane automatically. - theEdgeDir = aLin.Direction(); - - mySecondPoint = AIS::Nearest (aLin, myFirstPoint); - - return IsValidPoints (myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : InitEdgeFaceLength -//purpose : -//======================================================================= -Standard_Boolean AIS_LengthDimension::InitEdgeFaceLength (const TopoDS_Edge& theEdge, - const TopoDS_Face& theFace, - gp_Dir& theEdgeDir) -{ - theEdgeDir = gp::DX(); - - // Find attachment points (closest distance between the edge and the face) - BRepExtrema_DistShapeShape aDistAdaptor (theEdge, theFace, Extrema_ExtFlag_MIN); - if (!aDistAdaptor.IsDone() || aDistAdaptor.NbSolution() <1) - { - return Standard_False; - } - myFirstPoint = aDistAdaptor.PointOnShape1 (1); - mySecondPoint = aDistAdaptor.PointOnShape2 (1); - - // Take direction for dimension line (will be orthogonalized later) parallel to edge - BRepAdaptor_Curve aCurveAdaptor (theEdge); - Standard_Real aParam; - if (aDistAdaptor.SupportOnShape1 (1).ShapeType() == TopAbs_EDGE) - { - aDistAdaptor.ParOnEdgeS1 (1, aParam); - } - else - { - Standard_Real aD1 = aCurveAdaptor.Value(aCurveAdaptor.FirstParameter()).SquareDistance (myFirstPoint); - Standard_Real aD2 = aCurveAdaptor.Value(aCurveAdaptor.LastParameter()).SquareDistance (myFirstPoint); - aParam = (aD1 < aD2 ? aCurveAdaptor.FirstParameter() : aCurveAdaptor.LastParameter()); - } - gp_Pnt aP; - gp_Vec aV; - aCurveAdaptor.D1 (aParam, aP, aV); - if (aV.SquareMagnitude() > gp::Resolution()) - { - theEdgeDir = aV; - } - - // reverse direction if parameter is close to the end of the curve, - // to reduce chances to have overlapping between dimension line and edge - if (Abs (aParam - aCurveAdaptor.FirstParameter()) < Abs (aParam - aCurveAdaptor.LastParameter())) - { - theEdgeDir.Reverse(); - } - - return IsValidPoints (myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : InitTwoShapesPoints -//purpose : Initialization of two points where dimension layouts -// will be attached -//======================================================================= -Standard_Boolean AIS_LengthDimension::InitTwoShapesPoints (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape, - gp_Pln& theComputedPlane, - Standard_Boolean& theIsPlaneComputed) -{ - theIsPlaneComputed = Standard_False; - gp_Dir aDirAttach; - Standard_Boolean isInfinite = Standard_False; - Standard_Boolean isSuccess = Standard_False; - switch (theFirstShape.ShapeType()) - { - case TopAbs_FACE: - { - // Initialization for face - gp_Pln aFirstPlane; - Handle(Geom_Surface) aFirstSurface; - AIS_KindOfSurface aFirstSurfKind; - Standard_Real aFirstOffset; - - TopoDS_Face aFirstFace = TopoDS::Face (theFirstShape); - - AIS::InitFaceLength (TopoDS::Face (theFirstShape), - aFirstPlane, - aFirstSurface, - aFirstSurfKind, - aFirstOffset); - - if (theSecondShape.ShapeType() == TopAbs_FACE) - { - // Initialization for face - myGeometryType = GeometryType_Faces; - gp_Pln aSecondPlane; - Handle(Geom_Surface) aSecondSurface; - AIS_KindOfSurface aSecondSurfKind; - Standard_Real aSecondOffset; - - TopoDS_Face aSecondFace = TopoDS::Face (theSecondShape); - - AIS::InitFaceLength (aSecondFace, - aSecondPlane, - aSecondSurface, - aSecondSurfKind, - aSecondOffset); - - if (aFirstSurfKind == AIS_KOS_Plane) - { - if (!aFirstPlane.Axis().Direction().IsParallel (aSecondPlane.Axis().Direction(), Precision::Angular())) - { - return Standard_False; - } - - TopExp_Explorer anExplorer (theFirstShape, TopAbs_VERTEX); - - // In case of infinite planes - if (!anExplorer.More()) - { - myFirstPoint = aFirstPlane.Location(); - } - else - { - myFirstPoint = BRep_Tool::Pnt (TopoDS::Vertex (anExplorer.Current())); - } - - mySecondPoint = AIS::ProjectPointOnPlane (myFirstPoint, aSecondPlane); - - Standard_Real anU, aV; - ElSLib::Parameters (aSecondPlane, mySecondPoint, anU, aV); - - BRepTopAdaptor_FClass2d aClassifier (aSecondFace, Precision::Confusion()); - TopAbs_State aState = aClassifier.Perform (gp_Pnt2d (anU, aV), Standard_False); - - if (aState == TopAbs_OUT || aState == TopAbs_UNKNOWN) - { - mySecondPoint = AIS::Nearest (aSecondFace, myFirstPoint); - } - - isSuccess = IsValidPoints (myFirstPoint, mySecondPoint); - if (isSuccess) - { - theComputedPlane = ComputePlane (aFirstPlane.Position().XDirection()); - theIsPlaneComputed = Standard_True; - } - } - else // curvilinear faces - { - Standard_Real aU1Min, aV1Min, aU1Max, aV1Max; - Standard_Real aU2Min, aV2Min, aU2Max, aV2Max; - BRepTools::UVBounds (aFirstFace, aU1Min, aU1Max, aV1Min, aV1Max); - BRepTools::UVBounds (aSecondFace, aU2Min, aU2Max, aV2Min, aV2Max); - - GeomAPI_ExtremaSurfaceSurface anExtrema (aFirstSurface, aSecondSurface, - aU1Min, aU1Max, aV1Min, aV1Max, - aU2Min, aU2Max, aV2Min, aV2Max); - - Standard_Real aU1, aV1, aU2, aV2; - anExtrema.LowerDistanceParameters (aU1, aV1, aU2, aV2); - myFirstPoint = BRep_Tool::Surface (aFirstFace)->Value (aU1, aV1); - mySecondPoint = BRep_Tool::Surface (aSecondFace)->Value (aU2, aV2); - - // Adjust automatic plane - gp_Ax2 aLocalAxes (myFirstPoint, gce_MakeDir (myFirstPoint, mySecondPoint)); - aDirAttach = gce_MakeDir (aLocalAxes.XDirection ()); - - // Check points - isSuccess = IsValidPoints (myFirstPoint, mySecondPoint); - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - } - - return isSuccess && IsValidPoints (myFirstPoint, mySecondPoint); - } - else if (theSecondShape.ShapeType() == TopAbs_EDGE) - { - myGeometryType = GeometryType_EdgeFace; - isSuccess = InitEdgeFaceLength (TopoDS::Edge (theSecondShape), - TopoDS::Face (theFirstShape), - aDirAttach); - - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - - return isSuccess; - } - } - break; - - case TopAbs_EDGE: - { - if (theSecondShape.ShapeType() == TopAbs_VERTEX) - { - myGeometryType = GeometryType_EdgeVertex; - isSuccess = InitEdgeVertexLength (TopoDS::Edge (theFirstShape), - TopoDS::Vertex (theSecondShape), - aDirAttach, - isInfinite); - - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - - return isSuccess; - } - else if (theSecondShape.ShapeType() == TopAbs_EDGE) - { - myGeometryType = GeometryType_Edges; - isSuccess = InitTwoEdgesLength (TopoDS::Edge (theFirstShape), - TopoDS::Edge (theSecondShape), - aDirAttach); - - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - - return isSuccess; - } - else if (theSecondShape.ShapeType() == TopAbs_FACE) - { - myGeometryType = GeometryType_EdgeFace; - isSuccess = InitEdgeFaceLength (TopoDS::Edge (theFirstShape), - TopoDS::Face (theSecondShape), - aDirAttach); - - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - - return isSuccess; - } - } - break; - - case TopAbs_VERTEX: - { - if (theSecondShape.ShapeType() == TopAbs_VERTEX) - { - myGeometryType = GeometryType_Points; - myFirstPoint = BRep_Tool::Pnt (TopoDS::Vertex (theFirstShape)); - mySecondPoint = BRep_Tool::Pnt (TopoDS::Vertex (theSecondShape)); - - return IsValidPoints (myFirstPoint, mySecondPoint); - } - else if (theSecondShape.ShapeType() == TopAbs_EDGE) - { - myGeometryType = GeometryType_EdgeVertex; - isSuccess = InitEdgeVertexLength (TopoDS::Edge(theSecondShape), - TopoDS::Vertex(theFirstShape), - aDirAttach, - isInfinite); - if (isSuccess) - { - theComputedPlane = ComputePlane (aDirAttach); - theIsPlaneComputed = Standard_True; - } - - return isSuccess; - } - } - break; - - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: - case TopAbs_SOLID: - case TopAbs_SHELL: - case TopAbs_WIRE: - case TopAbs_SHAPE: - break; - } - - return Standard_False; -} - -//======================================================================= -//function : InitOneShapePoints -//purpose : Initialization of two points where dimension layouts -// will be attached -// Attention: 1) can be only the edge in currect implementation -// 2) No length for infinite edge -//======================================================================= -Standard_Boolean AIS_LengthDimension::InitOneShapePoints (const TopoDS_Shape& theShape) -{ - if (theShape.ShapeType() != TopAbs_EDGE) - { - return Standard_False; - } - - TopoDS_Edge anEdge = TopoDS::Edge (theShape); - - BRepAdaptor_Curve aBrepCurve(anEdge); - Standard_Real aFirst = aBrepCurve.FirstParameter(); - Standard_Real aLast = aBrepCurve.LastParameter(); - - if (aBrepCurve.GetType() != GeomAbs_Line) - { - return Standard_False; - } - - Standard_Boolean isInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); - if (isInfinite) - { - return Standard_False; - } - - myFirstPoint = aBrepCurve.Value (aBrepCurve.FirstParameter()); - mySecondPoint = aBrepCurve.Value (aBrepCurve.LastParameter()); - - return IsValidPoints (myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -const gp_Pnt AIS_LengthDimension::GetTextPosition() const -{ - if (IsTextPositionCustom()) - { - return myFixedTextPosition; - } - - // Counts text position according to the dimension parameters - return GetTextPositionForLinear (myFirstPoint, mySecondPoint); -} - -//======================================================================= -//function : SetTextPosition -//purpose : -//======================================================================= -void AIS_LengthDimension::SetTextPosition (const gp_Pnt& theTextPos) -{ - if (!IsValid()) - { - return; - } - - myIsTextPositionFixed = Standard_True; - myFixedTextPosition = theTextPos; - - SetToUpdate(); -} - -//======================================================================= -//function : SetDirection -//purpose : -//======================================================================= -void AIS_LengthDimension::SetDirection (const gp_Dir& theDirection, const Standard_Boolean theUseDirection) -{ - myHasCustomDirection = theUseDirection; - if (myHasCustomDirection) - myDirection = theDirection; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_LengthDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_LengthDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_LengthDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_LengthDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,4 +1,4 @@ -// Copyright (c) 1999-2013 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -14,253 +14,9 @@ #ifndef _AIS_LengthDimension_HeaderFile #define _AIS_LengthDimension_HeaderFile -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include -DEFINE_STANDARD_HANDLE (AIS_LengthDimension, AIS_Dimension) - -//! Length dimension. Can be constructued: -//! - Between two generic points. -//! - Between two vertices. -//! - Between two faces. -//! - Between two parallel edges. -//! - Between face and edge. -//! -//! In case of two points (vertices) or one linear edge the user-defined plane -//! that includes this geometry is necessary to be set. -//! -//! In case of face-edge, edge-vertex or face-face lengthes the automatic plane -//! computing is allowed. For this plane the third point is found on the -//! edge or on the face. -//! -//! Please note that if the inappropriate geometry is defined -//! or the distance between measured points is less than -//! Precision::Confusion(), the dimension is invalid and its -//! presentation can not be computed. -class AIS_LengthDimension : public AIS_Dimension -{ -public: - - //! Construct length dimension between face and edge. - //! Here dimension can be built without user-defined plane. - //! @param theFace [in] the face (first shape). - //! @param theEdge [in] the edge (second shape). - Standard_EXPORT AIS_LengthDimension (const TopoDS_Face& theFace, - const TopoDS_Edge& theEdge); - - //! Construct length dimension between two faces. - //! @param theFirstFace [in] the first face (first shape). - //! @param theSecondFace [in] the second face (second shape). - Standard_EXPORT AIS_LengthDimension (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace); - - //! Construct length dimension between two points in - //! the specified plane. - //! @param theFirstPoint [in] the first point. - //! @param theSecondPoint [in] the second point. - //! @param thePlane [in] the plane to orient dimension. - Standard_EXPORT AIS_LengthDimension (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pln& thePlane); - - //! Construct length dimension between two arbitrary shapes in - //! the specified plane. - //! @param theFirstShape [in] the first shape. - //! @param theSecondShape [in] the second shape. - //! @param thePlane [in] the plane to orient dimension. - Standard_EXPORT AIS_LengthDimension (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape, - const gp_Pln& thePlane); - - //! Construct length dimension of linear edge. - //! @param theEdge [in] the edge to measure. - //! @param thePlane [in] the plane to orient dimension. - Standard_EXPORT AIS_LengthDimension (const TopoDS_Edge& theEdge, - const gp_Pln& thePlane); - -public: - - //! @return first attachement point. - const gp_Pnt& FirstPoint() const - { - return myFirstPoint; - } - - //! @return second attachement point. - const gp_Pnt& SecondPoint() const - { - return mySecondPoint; - } - - //! @return first attachement shape. - const TopoDS_Shape& FirstShape() const - { - return myFirstShape; - } - - //! @return second attachement shape. - const TopoDS_Shape& SecondShape() const - { - return mySecondShape; - } - -public: - - //! Measure distance between two points. - //! The dimension will become invalid if the new distance between - //! attachement points is less than Precision::Confusion(). - //! @param theFirstPoint [in] the first point. - //! @param theSecondPoint [in] the second point. - //! @param thePlane [in] the user-defined plane - Standard_EXPORT void SetMeasuredGeometry (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint, - const gp_Pln& thePlane); - - //! Measure length of edge. - //! The dimension will become invalid if the new length of edge - //! is less than Precision::Confusion(). - //! @param theEdge [in] the edge to measure. - //! @param thePlane [in] the user-defined plane - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Edge& theEdge, - const gp_Pln& thePlane); - - //! Measure distance between two faces. - //! The dimension will become invalid if the distance can not - //! be measured or it is less than Precision::Confusion(). - //! @param theFirstFace [in] the first face (first shape). - //! @param theSecondFace [in] the second face (second shape). - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, - const TopoDS_Face& theSecondFace); - - //! Measure distance between face and edge. - //! The dimension will become invalid if the distance can not - //! be measured or it is less than Precision::Confusion(). - //! @param theFace [in] the face (first shape). - //! @param theEdge [in] the edge (second shape). - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFace, - const TopoDS_Edge& theEdge); - - //! Measure distance between generic pair of shapes (edges, vertices, length), - //! where measuring is applicable. - //! @param theFirstShape [in] the first shape. - //! @param theSecondShape [in] the second shape. - Standard_EXPORT void SetMeasuredShapes (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape); - - //! @return the display units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; - - //! @return the model units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; - - Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; - - Standard_EXPORT virtual const gp_Pnt GetTextPosition() const Standard_OVERRIDE; - - //! Set custom direction for dimension. If it is not set, the direction is obtained - //! from the measured geometry (e.g. line between points of dimension) - //! The direction does not change flyout direction of dimension. - //! @param theDirection [in] the dimension direction. - //! @param theUseDirection [in] boolean value if custom direction should be used. - Standard_EXPORT void SetDirection (const gp_Dir& theDirection, const Standard_Boolean theUseDirection = Standard_True); - -public: - - DEFINE_STANDARD_RTTIEXT(AIS_LengthDimension,AIS_Dimension) - -protected: - - //! Checks if the plane includes first and second points to build dimension. - Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; - - Standard_EXPORT virtual gp_Pln ComputePlane(const gp_Dir& theAttachDir) const; - - //! Computes distance between dimension points. If custom direction is defined, the distance - //! is a projection value of the distance between points to this direction - //! @return dimension value - Standard_EXPORT Standard_Real ComputeValue() const Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode = 0) Standard_OVERRIDE; - - //! Computes points bounded the flyout line for linear dimension. - //! Direction of flyout line equal to the custom direction of dimension if defined or - //! parallel to the main direction line - //! @param theFirstPoint [in] the first attach point of linear dimension. - //! @param theSecondPoint [in] the second attach point of linear dimension. - //! @param theLineBegPoint [out] the first attach point of linear dimension. - //! @param theLineEndPoint [out] the second attach point of linear dimension. - Standard_EXPORT virtual void ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, - gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, - const Handle(SelectMgr_EntityOwner)& theEntityOwner) Standard_OVERRIDE; - -protected: - - //! Checks that distance between two points is valid. - //! @param theFirstPoint [in] the first point. - //! @param theSecondPoint [in] the second point. - Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint, - const gp_Pnt& theSecondPoint) const; - - Standard_EXPORT Standard_Boolean InitTwoEdgesLength (const TopoDS_Edge & theFirstEdge, - const TopoDS_Edge& theSecondEdge, - gp_Dir& theEdgeDir); - - //! Auxiliary method for InitTwoShapesPoints() - //! in case of the distance between edge and vertex. - //! Finds the point on the edge that is the closest one to . - //! @param theEdgeDir [out] is the direction on the edge to build - //! automatical plane. - Standard_EXPORT Standard_Boolean InitEdgeVertexLength (const TopoDS_Edge& theEdge, - const TopoDS_Vertex& theVertex, - gp_Dir& theEdgeDir, - Standard_Boolean isInfinite); - - //! Auxiliary method for InitTwoShapesPoints() - //! in case of the distance between face and edge. - //! The first attachment point is first parameter point from . - //! Find the second attachment point which belongs to - //! Iterate over the edges of the face and find the closest point according - //! to finded point on edge. - //! @param theEdgeDir [out] is the direction on the edge to build - //! automatical plane. - Standard_EXPORT Standard_Boolean InitEdgeFaceLength (const TopoDS_Edge& theEdge, - const TopoDS_Face& theFace, - gp_Dir& theEdgeDir); - - //! Initialization of two attach points in case of two owner shapes. - Standard_EXPORT Standard_Boolean InitTwoShapesPoints (const TopoDS_Shape& theFirstShape, - const TopoDS_Shape& theSecondShape, - gp_Pln& theComputedPlane, - Standard_Boolean& theIsPlaneComputed); - - //! Initialization of two attach points in case of one owner shape. - Standard_EXPORT Standard_Boolean InitOneShapePoints (const TopoDS_Shape& theShape); - -private: - - gp_Pnt myFirstPoint; - gp_Pnt mySecondPoint; - TopoDS_Shape myFirstShape; - TopoDS_Shape mySecondShape; - gp_Dir myDirection; - Standard_Boolean myHasCustomDirection; -}; +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_LengthDimension AIS_LengthDimension; #endif // _AIS_LengthDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Line.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Line.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Line.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Line.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -29,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -78,11 +76,6 @@ } -void AIS_Line::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation) -{ - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation) ; -} - //======================================================================= //function : ComputeSelection //purpose : @@ -288,16 +281,3 @@ myEndPoint->Pnt()); aSelection->Add(seg); } - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= -void AIS_Line::Compute(const Handle(Prs3d_Projector)&, - const Handle(Prs3d_Presentation)&) -{ -} - - - - diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Line.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Line.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Line.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Line.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,15 +37,6 @@ //! and a finishing point aEndPoint for the line. Standard_EXPORT AIS_Line(const Handle(Geom_Point)& aStartPoint, const Handle(Geom_Point)& aEndPoint); - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - //! Returns the signature 5. virtual Standard_Integer Signature() const Standard_OVERRIDE { return 5; } @@ -95,8 +86,6 @@ Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; Standard_EXPORT void ComputeInfiniteLine (const Handle(Prs3d_Presentation)& aPresentation); diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Manipulator.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Manipulator.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Manipulator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Manipulator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,11 +19,8 @@ #include #include #include -#include -#include #include #include -#include #include #include #include @@ -86,10 +83,10 @@ public: //! Main constructor. ManipSensCircle (const Handle(SelectMgr_EntityOwner)& theOwnerId, - const Handle(Geom_Circle)& theCircle, + const gp_Circ& theCircle, const Standard_Integer theNbPnts) : Select3D_SensitiveCircle (theOwnerId, theCircle, Standard_False, theNbPnts), - ManipSensRotation (theCircle->Position().Direction()) {} + ManipSensRotation (theCircle.Position().Direction()) {} //! Checks whether the circle overlaps current selecting volume virtual Standard_Boolean Matches (SelectBasics_SelectingVolumeManager& theMgr, @@ -643,6 +640,44 @@ } //======================================================================= +//function : ProcessDragging +//purpose : +//======================================================================= +Standard_Boolean AIS_Manipulator::ProcessDragging (const Handle(AIS_InteractiveContext)&, + const Handle(V3d_View)& theView, + const Handle(SelectMgr_EntityOwner)&, + const Graphic3d_Vec2i& theDragFrom, + const Graphic3d_Vec2i& theDragTo, + const AIS_DragAction theAction) +{ + switch (theAction) + { + case AIS_DragAction_Start: + { + if (HasActiveMode()) + { + StartTransform (theDragFrom.x(), theDragFrom.y(), theView); + return Standard_True; + } + break; + } + case AIS_DragAction_Update: + { + Transform (theDragTo.x(), theDragTo.y(), theView); + return Standard_True; + } + case AIS_DragAction_Abort: + { + StopTransform (false); + return Standard_True; + } + case AIS_DragAction_Stop: + break; + } + return Standard_False; +} + +//======================================================================= //function : StartTransform //purpose : //======================================================================= @@ -703,7 +738,7 @@ { const Handle(AIS_InteractiveObject)& anObj = anObjIter.ChangeValue(); const gp_Trsf& anOldTrsf = aTrsfIter.Value(); - const Handle(Geom_Transformation)& aParentTrsf = anObj->CombinedParentTransformation(); + const Handle(TopLoc_Datum3D)& aParentTrsf = anObj->CombinedParentTransformation(); if (!aParentTrsf.IsNull() && aParentTrsf->Form() != gp_Identity) { @@ -782,7 +817,7 @@ aTrsf.SetTransformation (gp_Ax2 (gp::Origin(), aVDir, aXDir), gp::XOY()); } - Handle(Geom_Transformation) aGeomTrsf = new Geom_Transformation (aTrsf); + Handle(TopLoc_Datum3D) aGeomTrsf = new TopLoc_Datum3D (aTrsf); // we explicitly call here setLocalTransformation() of the base class // since AIS_Manipulator::setLocalTransformation() implementation throws exception // as protection from external calls @@ -920,7 +955,7 @@ //function : setLocalTransformation //purpose : //======================================================================= -void AIS_Manipulator::setLocalTransformation (const Handle(Geom_Transformation)& /*theTrsf*/) +void AIS_Manipulator::setLocalTransformation (const Handle(TopLoc_Datum3D)& /*theTrsf*/) { Standard_ASSERT_INVOKE ("AIS_Manipulator::setLocalTransformation: " "Custom transformation is not supported by this class"); @@ -1131,7 +1166,7 @@ anOwner = new AIS_ManipulatorOwner (this, anIt, AIS_MM_Rotation, 9); } // define sensitivity by circle - Handle(Geom_Circle) aGeomCircle = new Geom_Circle (gp_Ax2 (gp::Origin(), anAxis.ReferenceAxis().Direction()), anAxis.RotatorDiskRadius()); + const gp_Circ aGeomCircle (gp_Ax2 (gp::Origin(), anAxis.ReferenceAxis().Direction()), anAxis.RotatorDiskRadius()); Handle(Select3D_SensitiveCircle) aCircle = new ManipSensCircle (anOwner, aGeomCircle, anAxis.FacettesNumber()); aCircle->SetSensitivityFactor (15); theSelection->Add (aCircle); @@ -1215,7 +1250,8 @@ gp_Ax3 aSystem (myPosition.Location(), myPosition.Direction()); gp_Trsf aTrsf; aTrsf.SetTransformation (aSystem, gp_Ax3()); - aTool.FillArray (myArray, myTriangulation, aTrsf); + myArray = aTool.CreateTriangulation (aTrsf); + myTriangulation = aTool.CreatePolyTriangulation (aTrsf); } //======================================================================= @@ -1234,7 +1270,8 @@ Prs3d_ToolSphere aTool (theRadius, theSlicesNb, theStacksNb); gp_Trsf aTrsf; aTrsf.SetTranslation (gp_Vec(gp::Origin(), thePosition)); - aTool.FillArray (myArray, myTriangulation, aTrsf); + myArray = aTool.CreateTriangulation (aTrsf); + myTriangulation = aTool.CreatePolyTriangulation (aTrsf); } //======================================================================= @@ -1270,24 +1307,24 @@ addTriangle (1, aBottomLeft, aV3, aV4, -thePosition.Direction()); // Front - addTriangle (2, aV3, aV4, aV5, aFront); - addTriangle (3, aV3, aV5, aTopRight, aFront); + addTriangle (2, aV3, aV5, aV4, -aFront); + addTriangle (3, aV3, aTopRight, aV5, -aFront); // Back - addTriangle (4, aBottomLeft, aV2, aV7, -aFront); - addTriangle (5, aBottomLeft, aV7, aV6, -aFront); + addTriangle (4, aBottomLeft, aV7, aV2, aFront); + addTriangle (5, aBottomLeft, aV6, aV7, aFront); // aTop addTriangle (6, aV7, aV6, aV5, thePosition.Direction()); addTriangle (7, aTopRight, aV7, aV5, thePosition.Direction()); - //Left - addTriangle (8, aV6, aV5, aV4, -aRight); - addTriangle (9, aBottomLeft, aV6, aV4, -aRight); + // Left + addTriangle (8, aV6, aV4, aV5, aRight); + addTriangle (9, aBottomLeft, aV4, aV6, aRight); // Right - addTriangle (10, aV3, aTopRight, aV7, aRight); - addTriangle (11, aV3, aV7, aV2, aRight); + addTriangle (10, aV3, aV7, aTopRight, -aRight); + addTriangle (11, aV3, aV2, aV7, -aRight); } //======================================================================= @@ -1324,7 +1361,8 @@ gp_Ax3 aSystem(thePosition.Location(), thePosition.Direction(), theXDirection); gp_Trsf aTrsf; aTrsf.SetTransformation(aSystem, gp_Ax3()); - aTool.FillArray(myArray, myTriangulation, aTrsf); + myArray = aTool.CreateTriangulation (aTrsf); + myTriangulation = aTool.CreatePolyTriangulation (aTrsf); } //======================================================================= @@ -1376,7 +1414,8 @@ myAxisRadius * 1.5, anArrowLength, myFacettesNumber); - myTranslatorGroup = thePrs->NewGroup (); + myTranslatorGroup = thePrs->NewGroup(); + myTranslatorGroup->SetClosed (true); myTranslatorGroup->SetGroupPrimitivesAspect (theAspect->Aspect()); myTranslatorGroup->AddPrimitiveArray (myTriangleArray); @@ -1389,7 +1428,7 @@ myHighlightTranslator->Clear(); } { - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (myHighlightTranslator); + Handle(Graphic3d_Group) aGroup = myHighlightTranslator->CurrentGroup(); aGroup->SetGroupPrimitivesAspect (theAspect->Aspect()); aGroup->AddPrimitiveArray (myTriangleArray); } @@ -1400,7 +1439,8 @@ myCubePos = myReferenceAxis.Direction().XYZ() * (myLength + myIndent); myCube.Init (gp_Ax1 (myCubePos, myReferenceAxis.Direction()), myBoxSize); - myScalerGroup = thePrs->NewGroup (); + myScalerGroup = thePrs->NewGroup(); + myScalerGroup->SetClosed (true); myScalerGroup->SetGroupPrimitivesAspect (theAspect->Aspect()); myScalerGroup->AddPrimitiveArray (myCube.Array()); @@ -1413,7 +1453,7 @@ myHighlightScaler->Clear(); } { - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (myHighlightScaler); + Handle(Graphic3d_Group) aGroup = myHighlightScaler->CurrentGroup(); aGroup->SetGroupPrimitivesAspect (theAspect->Aspect()); aGroup->AddPrimitiveArray (myCube.Array()); } @@ -1436,7 +1476,7 @@ myHighlightRotator->Clear(); } { - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (myHighlightRotator); + Handle(Graphic3d_Group) aGroup = myHighlightRotator->CurrentGroup(); aGroup->SetGroupPrimitivesAspect (theAspect->Aspect()); aGroup->AddPrimitiveArray (myCircle.Array()); } @@ -1468,7 +1508,7 @@ myHighlightDragger->Clear(); } { - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup(myHighlightDragger); + Handle(Graphic3d_Group) aGroup = myHighlightDragger->CurrentGroup(); aGroup->SetGroupPrimitivesAspect(aFillArea); aGroup->AddPrimitiveArray(mySector.Array()); } diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Manipulator.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Manipulator.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Manipulator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Manipulator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,8 @@ #include #include #include -NCOLLECTION_HSEQUENCE(AIS_ManipulatorObjectSequence, Handle(AIS_InteractiveObject)); + +NCOLLECTION_HSEQUENCE(AIS_ManipulatorObjectSequence, Handle(AIS_InteractiveObject)) DEFINE_STANDARD_HANDLE (AIS_Manipulator, AIS_InteractiveObject) @@ -92,10 +93,6 @@ //! aManipulator->Detach(); //! @endcode //! The last method erases manipulator object. -//! @warning -//! On construction an instance of AIS_Manipulator object is bound to Graphic3d_ZLayerId_Topmost layer, -//! so make sure to call for your AIS_InteractiveContext the method MainSelector()->SetPickClosest (Standard_False) -//! otherwise you may notice issues with activation of modes. class AIS_Manipulator : public AIS_InteractiveObject { public: @@ -162,6 +159,20 @@ } public: + //! Drag object in the viewer. + //! @param theCtx [in] interactive context + //! @param theView [in] active View + //! @param theOwner [in] the owner of detected entity + //! @param theDragFrom [in] drag start point + //! @param theDragTo [in] drag end point + //! @param theAction [in] drag action + //! @return FALSE if object rejects dragging action (e.g. AIS_DragAction_Start) + Standard_EXPORT virtual Standard_Boolean ProcessDragging (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView, + const Handle(SelectMgr_EntityOwner)& theOwner, + const Graphic3d_Vec2i& theDragFrom, + const Graphic3d_Vec2i& theDragTo, + const AIS_DragAction theAction) Standard_OVERRIDE; //! Init start (reference) transformation. //! @warning It is used in chain with StartTransform-Transform(gp_Trsf)-StopTransform @@ -259,6 +270,8 @@ AIS_ManipulatorMode ActiveMode() const { return myCurrentMode; } + Standard_Integer ActiveAxisIndex() const { return myCurrentIndex; } + //! @return poition of manipulator interactive object. const gp_Ax2& Position() const { return myPosition; } @@ -354,7 +367,7 @@ //! without need for recomputing presentation. //! @warning Invokes debug assertion in debug to catch incompatible usage of the //! method, silently does nothing in release mode. - Standard_EXPORT virtual void setLocalTransformation (const Handle(Geom_Transformation)& theTrsf) Standard_OVERRIDE; + Standard_EXPORT virtual void setLocalTransformation (const Handle(TopLoc_Datum3D)& theTrsf) Standard_OVERRIDE; using AIS_InteractiveObject::SetLocalTransformation; // hide visibility protected: //! @name Auxiliary classes to fill presentation with proper primitives @@ -517,7 +530,7 @@ } } - void Transform (const Handle(Geom_Transformation)& theTransformation) + void Transform (const Handle(TopLoc_Datum3D)& theTransformation) { if (!myHighlightTranslator.IsNull()) { diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_MaxRadiusDimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_MaxRadiusDimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_MaxRadiusDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_MaxRadiusDimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,339 +0,0 @@ -// Created on: 1998-01-23 -// Created by: Sergey ZARITCHNY -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_MaxRadiusDimension,AIS_EllipseRadiusDimension) - -//======================================================================= -//function : AIS_MaxRadiusDimension -//purpose : -//======================================================================= -AIS_MaxRadiusDimension::AIS_MaxRadiusDimension(const TopoDS_Shape& aShape, - const Standard_Real aVal, - const TCollection_ExtendedString& aText) -:AIS_EllipseRadiusDimension(aShape, aText) -{ - myVal = aVal; - mySymbolPrs = DsgPrs_AS_LASTAR; - myAutomaticPosition = Standard_True; - myArrowSize = myVal / 100.; -} - -//======================================================================= -//function : AIS_MaxRadiusDimension -//purpose : -//======================================================================= - -AIS_MaxRadiusDimension::AIS_MaxRadiusDimension(const TopoDS_Shape& aShape, - const Standard_Real aVal, - const TCollection_ExtendedString& aText, - const gp_Pnt& aPosition, - const DsgPrs_ArrowSide aSymbolPrs, - const Standard_Real anArrowSize) -:AIS_EllipseRadiusDimension(aShape, aText) -{ - myVal = aVal; - mySymbolPrs = aSymbolPrs; - myPosition = aPosition; - myAutomaticPosition = Standard_False; - SetArrowSize( anArrowSize ); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_MaxRadiusDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer /*aMode*/) -{ -// if( myAutomaticPosition ) - {//ota : recompute in any case - ComputeGeometry(); - myEllipse.SetMajorRadius(myVal); - gp_Vec v1(myEllipse.XAxis().Direction()); - v1 *=myVal; - myApexP = myEllipse.Location().Translated(v1); - myApexN = myEllipse.Location().Translated(-v1); - } - if(myIsAnArc) ComputeArcOfEllipse(aPresentation); - else - ComputeEllipse(aPresentation); -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= - -void AIS_MaxRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_MaxRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation)"); - PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_MaxRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Geom_Transformation)& aTransformation, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_MaxRadiusDimension::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - - -//======================================================================= -//function : ComputeEllipse -//purpose : -//======================================================================= - -void AIS_MaxRadiusDimension::ComputeEllipse(const Handle(Prs3d_Presentation)& aPresentation) -{ - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - - // size - if( !myArrowSizeIsDefined ) { - myArrowSize = Min(myArrowSize,myVal / 5.); - } - arr->SetLength(myArrowSize); - - Standard_Real U;//,V; - gp_Pnt curPos, Center; - Center = myEllipse.Location(); - if( myAutomaticPosition ) - { - myPosition = Center; - myEndOfArrow = myApexP; - myAutomaticPosition = Standard_True; - - if ( myIsSetBndBox ) - myPosition = AIS::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )), - myBndBox ); - curPos = myPosition; - } - else //!AutomaticPosition - { - curPos = myPosition; - gp_Lin L1(myEllipse.XAxis()); - U = ElCLib::Parameter ( L1, curPos ); - curPos = ElCLib::Value (U, L1); - if (curPos.Distance(myApexP) < curPos.Distance(myApexN)) - myEndOfArrow = myApexP ; - else - myEndOfArrow = myApexN ; - } - - // Presenatation - DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, curPos, - myEndOfArrow, Center, Standard_True, mySymbolPrs); - -} - -//======================================================================= -//function : ComputeArcOfEllipse -//purpose : -//======================================================================= - -void AIS_MaxRadiusDimension::ComputeArcOfEllipse(const Handle(Prs3d_Presentation)& aPresentation) -{ - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - - // size - if( !myArrowSizeIsDefined ) { - myArrowSize = Min(myArrowSize,myVal / 5.); - } - arr->SetLength(myArrowSize); - - Standard_Real par; - gp_Pnt curPos, Center; - Center = myEllipse.Location(); - Standard_Boolean IsInDomain = Standard_True; - if( myAutomaticPosition ) - { - myEndOfArrow = AIS::NearestApex(myEllipse, myApexP, myApexN, - myFirstPar, myLastPar, IsInDomain); - myPosition = Center; - myAutomaticPosition = Standard_True; - if ( myIsSetBndBox ) - myPosition = AIS::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )), - myBndBox ); - curPos = myPosition; - } - else //!AutomaticPosition - { - curPos = myPosition; -// ElSLib::Parameters ( myPlane->Pln(), curPos, U, V ); -// curPos = ElSLib::Value (U, V, myPlane->Pln()); - gp_Lin L1(myEllipse.XAxis()); - par = ElCLib::Parameter ( L1, curPos ); - curPos = ElCLib::Value (par, L1); - if (curPos.Distance(myApexP) < curPos.Distance(myApexN)) - myEndOfArrow = myApexP ; - else - myEndOfArrow = myApexN ; - par = ElCLib::Parameter ( myEllipse, myEndOfArrow ); - IsInDomain = AIS::InDomain( myFirstPar, myLastPar, par ); - myPosition = curPos; - } - -// Standard_Real parEnd = ElCLib::Parameter ( myEllipse, myEndOfArrow ); - Standard_Real parStart = 0.; - if( !IsInDomain ) - { - if(AIS::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < - AIS::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar)) - parStart = myFirstPar; - else - parStart = myLastPar; - } - if(!myIsOffset) - DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myEllipse, - curPos, myEndOfArrow, Center, parStart, IsInDomain, - Standard_True, mySymbolPrs); - else - DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myOffsetCurve, - curPos, myEndOfArrow, Center, parStart, IsInDomain, - Standard_True, mySymbolPrs); -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_MaxRadiusDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer /*aMode*/) -{ - - gp_Pnt center = myEllipse.Location(); - gp_Pnt AttachmentPoint = myPosition; - Standard_Real dist = center.Distance(AttachmentPoint); - Standard_Real aRadius = myVal; - //Standard_Real inside = Standard_False; - gp_Pnt pt1; - if (dist > aRadius) pt1 = AttachmentPoint; - else - pt1 = myEndOfArrow; - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - Handle(Select3D_SensitiveSegment) - seg = new Select3D_SensitiveSegment(own, center , pt1); - aSelection->Add(seg); - - // Text - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, - AttachmentPoint.X(), - AttachmentPoint.Y(), - AttachmentPoint.Z(), - AttachmentPoint.X()+size, - AttachmentPoint.Y()+size, - AttachmentPoint.Z()+size); - aSelection->Add(box); - - // Arc of Ellipse - if(myIsAnArc) - { - - Standard_Real parEnd = ElCLib::Parameter ( myEllipse, myEndOfArrow ); - if(!AIS::InDomain(myFirstPar, myLastPar, parEnd)) - { - Standard_Real parStart, par; - if(AIS::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < - AIS::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar)) - par = myFirstPar; - else - par = myLastPar; - gp_Vec Vapex(center, ElCLib::Value( parEnd, myEllipse )) ; - gp_Vec Vpnt (center, ElCLib::Value( par, myEllipse )) ; - gp_Dir dir(Vpnt ^ Vapex); - if(myEllipse.Position().Direction().IsOpposite( dir, Precision::Angular())) { - parStart = parEnd; - parEnd = par; - } - else - parStart = par; - - Handle(Geom_Curve)TrimCurve; - if(myIsOffset) - { - Handle(Geom_Curve) aCurve = myOffsetCurve; - TrimCurve = new Geom_TrimmedCurve( aCurve, parStart, parEnd ); - } - else - { - Handle(Geom_Ellipse) Ellipse = new Geom_Ellipse( myEllipse ); - TrimCurve = new Geom_TrimmedCurve( Ellipse, parStart, parEnd ); - } - Handle( Select3D_SensitiveCurve ) SensArc; - SensArc = new Select3D_SensitiveCurve( own, TrimCurve ); - aSelection->Add( SensArc ); - } - } - -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_MaxRadiusDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_MaxRadiusDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_MaxRadiusDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_MaxRadiusDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1998-01-22 -// Created by: Sergey ZARITCHNY -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,52 +14,9 @@ #ifndef _AIS_MaxRadiusDimension_HeaderFile #define _AIS_MaxRadiusDimension_HeaderFile -#include -#include +#include -DEFINE_STANDARD_HANDLE(AIS_MaxRadiusDimension, AIS_EllipseRadiusDimension) - -//! Ellipse Max radius dimension of a Shape which can be Edge -//! or Face (planar or cylindrical(surface of extrusion or -//! surface of offset)) -class AIS_MaxRadiusDimension : public AIS_EllipseRadiusDimension -{ - DEFINE_STANDARD_RTTIEXT(AIS_MaxRadiusDimension, AIS_EllipseRadiusDimension) -public: - - //! Max Ellipse radius dimension - //! Shape can be edge , planar face or cylindrical face - Standard_EXPORT AIS_MaxRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); - - //! Max Ellipse radius dimension with position - //! Shape can be edge , planar face or cylindrical face - Standard_EXPORT AIS_MaxRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeEllipse (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeArcOfEllipse (const Handle(Prs3d_Presentation)& aPresentation); - - gp_Pnt myApexP; - gp_Pnt myApexN; - gp_Pnt myEndOfArrow; - -}; +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_MaxRadiusDimension AIS_MaxRadiusDimension; #endif // _AIS_MaxRadiusDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_MidPointRelation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_MidPointRelation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_MidPointRelation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_MidPointRelation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,715 +0,0 @@ -// Created on: 2000-10-20 -// Created by: Julia DOROVSKIKH -// Copyright (c) 2000-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_MidPointRelation,AIS_Relation) - -//======================================================================= -//function : AIS_MidPointRelation -//purpose : -//======================================================================= -AIS_MidPointRelation::AIS_MidPointRelation(const TopoDS_Shape& aMidPointTool, - const TopoDS_Shape& FirstShape, - const TopoDS_Shape& SecondShape, - const Handle(Geom_Plane)& aPlane) -:AIS_Relation(), - myTool(aMidPointTool) -{ - SetFirstShape(FirstShape); - SetSecondShape(SecondShape); - SetPlane(aPlane); - myPosition = aPlane->Pln().Location(); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_MidPointRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aprs, - const Standard_Integer) -{ - if (myTool.ShapeType() == TopAbs_VERTEX) - { - gp_Pnt pp; - Standard_Boolean isonplane; - if ( AIS::ComputeGeometry(TopoDS::Vertex(myTool),pp,myPlane,isonplane) ) - { - if ( !isonplane ) ComputeProjVertexPresentation(aprs,TopoDS::Vertex(myTool),pp); - } - myMidPoint = pp; - } - else return; - - if ( myAutomaticPosition ) myPosition = myMidPoint; - - switch (myFShape.ShapeType()) - { - case TopAbs_FACE : - { - ComputeFaceFromPnt(aprs, Standard_True); - } - break; - case TopAbs_EDGE : - { - ComputeEdgeFromPnt(aprs, Standard_True); - } - break; - case TopAbs_VERTEX : - { - ComputeVertexFromPnt(aprs, Standard_True); - } - break; - default: - break; - } - - switch (mySShape.ShapeType()) - { - case TopAbs_FACE : - { - ComputeFaceFromPnt(aprs, Standard_False); - } - break; - case TopAbs_EDGE : - { - ComputeEdgeFromPnt(aprs, Standard_False); - } - break; - case TopAbs_VERTEX : - { - ComputeVertexFromPnt(aprs, Standard_False); - } - break; - default: - break; - } -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning at compilation (SUN) -//======================================================================= -void AIS_MidPointRelation::Compute(const Handle(Prs3d_Projector)& /*aProjector*/, - const Handle(Prs3d_Presentation)& /*aPresentation*/) -{ -// throw Standard_NotImplemented("AIS_MidPointRelation::Compute(const Handle(Prs3d_Projector)&,const Handle(Prs3d_Presentation)&)"); -// PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -void AIS_MidPointRelation::Compute(const Handle(Prs3d_Projector)&, - const Handle(Geom_Transformation)&, - const Handle(Prs3d_Presentation)&) -{ - throw Standard_NotImplemented("AIS_MidPointRelation::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); -// PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSel, - const Standard_Integer) -{ - Handle(Select3D_SensitiveSegment) seg; - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - - if ( !myMidPoint.IsEqual(myFAttach,Precision::Confusion()) ) - { - // segment from mid point to the first geometry - seg = new Select3D_SensitiveSegment(own,myFAttach,myMidPoint); - aSel->Add(seg); - // segment from mid point to the second geometry - seg = new Select3D_SensitiveSegment(own,mySAttach,myMidPoint); - aSel->Add(seg); - } - if ( !myMidPoint.IsEqual(myPosition,Precision::Confusion()) ) - { - // segment from mid point to the text position - seg = new Select3D_SensitiveSegment(own,myMidPoint,myPosition); - aSel->Add(seg); - } - - // center of the symmetry - circle around the MidPoint - gp_Ax2 ax = myPlane->Pln().Position().Ax2(); - ax.SetLocation(myMidPoint); - Standard_Real rad = myFAttach.Distance(myMidPoint)/20.0; - gp_Circ aCircleM (ax,rad); - Handle(Geom_Curve) thecir = new Geom_Circle(aCircleM); - Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecir); - aSel->Add(scurv); - - Handle(Geom_Curve) curv; - gp_Pnt firstp,lastp; - Standard_Boolean isInfinite,isOnPlane; - Handle(Geom_Curve) extCurv; - - // segment on first curve - if ( myFShape.ShapeType() == TopAbs_EDGE ) - { - TopoDS_Edge E = TopoDS::Edge(myFShape); - if ( !AIS::ComputeGeometry(E,curv,firstp,lastp,extCurv,isInfinite,isOnPlane,myPlane) ) return; - if ( curv->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of line - { - // segment on line - seg = new Select3D_SensitiveSegment(own,myFirstPnt1,myFirstPnt2); - aSel->Add(seg); - } - else if ( curv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) // case of circle - { - // segment on circle - Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv); - Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),myFirstPnt1); - Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),myFirstPnt2); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); - - scurv = new Select3D_SensitiveCurve(own, thecu); - aSel->Add(scurv); - } - else if ( curv->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipse - { - // segment on ellipse - Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv); - Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),myFirstPnt1); - Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),myFirstPnt2); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); - - scurv = new Select3D_SensitiveCurve(own, thecu); - aSel->Add(scurv); - } - } - - // segment on second curve - if ( mySShape.ShapeType() == TopAbs_EDGE ) - { - TopoDS_Edge E = TopoDS::Edge(mySShape); - if ( !AIS::ComputeGeometry(E,curv,firstp,lastp,extCurv,isInfinite,isOnPlane,myPlane) ) return; - if ( curv->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of line - { - // segment on line - seg = new Select3D_SensitiveSegment(own,mySecondPnt1,mySecondPnt2); - aSel->Add(seg); - } - else if ( curv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) // case of circle - { - // segment on circle - Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv); - Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),mySecondPnt1); - Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),mySecondPnt2); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); - - scurv = new Select3D_SensitiveCurve(own, thecu); - aSel->Add(scurv); - } - else if ( curv->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipse - { - // segment on ellipse - Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv); - Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),mySecondPnt1); - Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),mySecondPnt2); - Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); - - scurv = new Select3D_SensitiveCurve(own, thecu); - aSel->Add(scurv); - } - } -} - -//======================================================================= -//function : ComputeFaceFromPnt -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputeFaceFromPnt(const Handle(Prs3d_Presentation)&, - const Standard_Boolean /*first*/) -{ -} - -//======================================================================= -//function : ComputeEdgeFromPnt -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputeEdgeFromPnt(const Handle(Prs3d_Presentation)& aprs, - const Standard_Boolean first) -{ - TopoDS_Edge E; - if ( first ) E = TopoDS::Edge(myFShape); - else E = TopoDS::Edge(mySShape); - - Handle(Geom_Curve) geom; - gp_Pnt ptat1,ptat2; - Handle(Geom_Curve) extCurv; - Standard_Boolean isInfinite,isOnPlane; - if ( !AIS::ComputeGeometry(E, geom, ptat1, ptat2, extCurv, isInfinite, isOnPlane, myPlane) ) return; - - gp_Ax2 ax = myPlane->Pln().Position().Ax2(); - - if ( geom->IsInstance(STANDARD_TYPE(Geom_Line)) ) - { - if ( !isInfinite ) ComputePointsOnLine(ptat1,ptat2,first); - else - { - const gp_Lin& line = Handle(Geom_Line)::DownCast (geom)->Lin(); - ComputePointsOnLine(line,first); - } - if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition, - myFAttach,myFirstPnt1,myFirstPnt2,first); - else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition, - mySAttach,mySecondPnt1,mySecondPnt2,first); - } - else if ( geom->IsInstance(STANDARD_TYPE(Geom_Circle)) ) - { - Handle(Geom_Circle) geom_cir (Handle(Geom_Circle)::DownCast (geom)); - gp_Circ circ (geom_cir->Circ()); - ComputePointsOnCirc(circ,ptat1,ptat2,first); - if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,circ,myMidPoint,myPosition, - myFAttach,myFirstPnt1,myFirstPnt2,first); - else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,circ,myMidPoint,myPosition, - mySAttach,mySecondPnt1,mySecondPnt2,first); - } - else if ( geom->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) - { - Handle(Geom_Ellipse) geom_ell (Handle(Geom_Ellipse)::DownCast (geom)); - gp_Elips elips (geom_ell->Elips()); - ComputePointsOnElips(elips,ptat1,ptat2,first); - if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,elips,myMidPoint,myPosition, - myFAttach,myFirstPnt1,myFirstPnt2,first); - else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,elips,myMidPoint,myPosition, - mySAttach,mySecondPnt1,mySecondPnt2,first); - } - else return; - - // projection on myPlane - if ( !isOnPlane ) ComputeProjEdgePresentation(aprs,E,geom,ptat1,ptat2); -} - -//======================================================================= -//function : ComputeVertexFromPnt -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputeVertexFromPnt(const Handle(Prs3d_Presentation)& aprs, - const Standard_Boolean first) -{ - gp_Ax2 ax = myPlane->Pln().Position().Ax2(); - if ( first ) - { - Standard_Boolean isOnPlane; - TopoDS_Vertex V = TopoDS::Vertex(myFShape); - AIS::ComputeGeometry(V, myFAttach, myPlane, isOnPlane); - DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition,myFAttach,first); - if ( !isOnPlane ) ComputeProjVertexPresentation(aprs,V,myFAttach); - } - else - { - Standard_Boolean isOnPlane; - TopoDS_Vertex V = TopoDS::Vertex(mySShape); - AIS::ComputeGeometry(V, mySAttach, myPlane, isOnPlane); - DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition,mySAttach,first); - if ( !isOnPlane ) ComputeProjVertexPresentation(aprs,V,mySAttach); - } -} - -//======================================================================= -//function : ComputePointsOnLine -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputePointsOnLine(const gp_Lin& aLin, - const Standard_Boolean first) -{ - Standard_Real ppar = ElCLib::Parameter(aLin,myMidPoint); - gp_Pnt anAttach = ElCLib::Value(ppar,aLin); - - Standard_Real dist = anAttach.Distance(myMidPoint)/10.0; - if ( dist < Precision::Confusion() ) dist = 10.0; - - Standard_Real fpar = ppar + dist; - Standard_Real spar = ppar - dist; - - gp_Pnt aPnt1 = ElCLib::Value(fpar,aLin); - gp_Pnt aPnt2 = ElCLib::Value(spar,aLin); - - if ( first ) - { - myFAttach = anAttach; - myFirstPnt1 = aPnt1; - myFirstPnt2 = aPnt2; - } - else - { - mySAttach = anAttach; - mySecondPnt1 = aPnt1; - mySecondPnt2 = aPnt2; - } -} - -//======================================================================= -//function : ComputePointsOnLine -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputePointsOnLine(const gp_Pnt& pnt1, const gp_Pnt& pnt2, - const Standard_Boolean first) -{ - gp_Vec aVec (pnt1,pnt2); - gp_Lin aLin (pnt1,gp_Dir(aVec)); - - Standard_Real fpar = ElCLib::Parameter(aLin,pnt1); - Standard_Real spar = ElCLib::Parameter(aLin,pnt2); - Standard_Real ppar = ElCLib::Parameter(aLin,myMidPoint); - - gp_Pnt aProjPnt = ElCLib::Value(ppar,aLin); - Standard_Real dist = myMidPoint.Distance(aProjPnt); - Standard_Real ll = pnt1.Distance(pnt2); - Standard_Real segm = Min(dist,ll)*0.75; - if ( dist < Precision::Confusion() ) segm = ll*0.75; - - gp_Pnt anAttach,aPnt1,aPnt2; - anAttach = aProjPnt; - gp_Vec aVecTr; - if ( ppar <= fpar ) - { - aPnt2 = pnt1; - aVecTr = gp_Vec(pnt2,pnt1); - aVecTr.Normalize(); - aPnt1 = aProjPnt.Translated(aVecTr*segm); - } - else if ( ppar >= spar ) - { - aPnt1 = pnt2; - aVecTr = gp_Vec(pnt1,pnt2); - aVecTr.Normalize(); - aPnt2 = aProjPnt.Translated(aVecTr*segm); - } - else - { - Standard_Real dp1 = aProjPnt.Distance(pnt1); - Standard_Real dp2 = aProjPnt.Distance(pnt2); - - segm = Min(dist,dp1)*0.75; - aVecTr = gp_Vec(aProjPnt,pnt1); - aVecTr.Normalize(); - aPnt1 = aProjPnt.Translated(aVecTr*segm); - - segm = Min(dist,dp2)*0.75; - aVecTr = gp_Vec(aProjPnt,pnt2); - aVecTr.Normalize(); - aPnt2 = aProjPnt.Translated(aVecTr*segm); - } - - if ( first ) - { - myFAttach = anAttach; - myFirstPnt1 = aPnt1; - myFirstPnt2 = aPnt2; - } - else - { - mySAttach = anAttach; - mySecondPnt1 = aPnt1; - mySecondPnt2 = aPnt2; - } -} - -//======================================================================= -//function : ComputePointsOnCirc -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputePointsOnCirc(const gp_Circ& aCirc, - const gp_Pnt& pnt1, const gp_Pnt& pnt2, - const Standard_Boolean first) -{ - gp_Pnt curpos = myMidPoint; - - // Case of confusion between the current position and the center - // of the circle -> we move the current position - Standard_Real confusion (Precision::Confusion()); - gp_Pnt aCenter = aCirc.Location(); - if ( aCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(aCenter, pnt1); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - - Standard_Real pcurpos = ElCLib::Parameter(aCirc,curpos); - - Standard_Real rad = M_PI / 5.0; - Standard_Real segm; - - Standard_Real pFPnt; - Standard_Real pSPnt; - - if ( pnt1.IsEqual(pnt2,confusion) ) // full circle - { - pFPnt = pcurpos - rad; - pSPnt = pcurpos + rad; - } - else - { - Standard_Real pFAttach = ElCLib::Parameter(aCirc,pnt1); - Standard_Real pSAttach = ElCLib::Parameter(aCirc,pnt2); - - Standard_Real pSAttachM = pSAttach; - Standard_Real deltap = pSAttachM - pFAttach; - if ( deltap < 0 ) - { - deltap += 2 * M_PI; - pSAttachM += 2 * M_PI; - } - pSAttachM -= pFAttach; - - Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; - - Standard_Real pcurpos1 = pcurpos; - // define where curpos lays - if ( pcurpos1 < pFAttach ) - { - pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; - if ( pcurpos1 > pSAttachM ) // out - { - segm = Min(rad,deltap*0.75); - if ( pcurpos1 > pmiddleout ) - { - pcurpos = pFAttach; - pFPnt = pFAttach; - pSPnt = pFAttach + segm; - } - else - { - pcurpos = pSAttach; - pFPnt = pSAttach - segm; - pSPnt = pSAttach; - } - } - else // on arc - { - Standard_Real dp1 = pcurpos1 - pFAttach; - Standard_Real dp2 = pSAttachM - pcurpos1; - - segm = Min(rad,dp1*0.75); - pFPnt = pcurpos - segm; - - segm = Min(rad,dp2*0.75); - pSPnt = pcurpos + segm; - } - } - else if ( pcurpos1 > (pFAttach + deltap) ) // out - { - pcurpos1 -= pFAttach; - segm = Min(rad,deltap*0.75); - if ( pcurpos1 > pmiddleout ) - { - pcurpos = pFAttach; - pFPnt = pFAttach; - pSPnt = pFAttach + segm; - } - else - { - pcurpos = pSAttach; - pFPnt = pSAttach - segm; - pSPnt = pSAttach; - } - } - else // on arc - { - Standard_Real dp1 = pcurpos1 - pFAttach; - Standard_Real dp2 = pSAttach - pcurpos1; - - segm = Min(rad,dp1*0.75); - pFPnt = pcurpos - segm; - - segm = Min(rad,dp2*0.75); - pSPnt = pcurpos + segm; - } - } - - if ( first ) - { - myFAttach = ElCLib::Value(pcurpos,aCirc); - myFirstPnt1 = ElCLib::Value(pFPnt,aCirc); - myFirstPnt2 = ElCLib::Value(pSPnt,aCirc); - } - else - { - mySAttach = ElCLib::Value(pcurpos,aCirc); - mySecondPnt1 = ElCLib::Value(pFPnt,aCirc); - mySecondPnt2 = ElCLib::Value(pSPnt,aCirc); - } -} - -//======================================================================= -//function : ComputePointsOnElips -//purpose : -//======================================================================= -void AIS_MidPointRelation::ComputePointsOnElips(const gp_Elips& anEll, - const gp_Pnt& pnt1, const gp_Pnt& pnt2, - const Standard_Boolean first) -{ - gp_Pnt curpos = myMidPoint; - - // Case of confusion between the current position and the center - // of the circle -> we move the current position - Standard_Real confusion (Precision::Confusion()); - gp_Pnt aCenter = anEll.Location(); - if ( aCenter.Distance(curpos) <= confusion ) - { - gp_Vec vprec(aCenter, pnt1); - vprec.Normalize(); - curpos.Translate(vprec*1e-5); - } - - Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); - - Standard_Real rad = M_PI / 5.0; - Standard_Real segm; - - Standard_Real pFPnt; - Standard_Real pSPnt; - - if ( pnt1.IsEqual(pnt2,confusion) ) // full circle - { - pFPnt = pcurpos - rad; - pSPnt = pcurpos + rad; - } - else - { - Standard_Real pFAttach = ElCLib::Parameter(anEll,pnt1); - Standard_Real pSAttach = ElCLib::Parameter(anEll,pnt2); - - Standard_Real pSAttachM = pSAttach; - Standard_Real deltap = pSAttachM - pFAttach; - if ( deltap < 0 ) - { - deltap += 2 * M_PI; - pSAttachM += 2 * M_PI; - } - pSAttachM -= pFAttach; - - Standard_Real pmiddleout = pSAttachM / 2.0 + M_PI; - - Standard_Real pcurpos1 = pcurpos; - // define where curpos lays - if ( pcurpos1 < pFAttach ) - { - pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; - if ( pcurpos1 > pSAttachM ) // out - { - segm = Min(rad,deltap*0.75); - if ( pcurpos1 > pmiddleout ) - { - pcurpos = pFAttach; - pFPnt = pFAttach; - pSPnt = pFAttach + segm; - } - else - { - pcurpos = pSAttach; - pFPnt = pSAttach - segm; - pSPnt = pSAttach; - } - } - else // on arc - { - Standard_Real dp1 = pcurpos1 - pFAttach; - Standard_Real dp2 = pSAttachM - pcurpos1; - - segm = Min(rad,dp1*0.75); - pFPnt = pcurpos - segm; - - segm = Min(rad,dp2*0.75); - pSPnt = pcurpos + segm; - } - } - else if ( pcurpos1 > (pFAttach + deltap) ) // out - { - pcurpos1 -= pFAttach; - segm = Min(rad,deltap*0.75); - if ( pcurpos1 > pmiddleout ) - { - pcurpos = pFAttach; - pFPnt = pFAttach; - pSPnt = pFAttach + segm; - } - else - { - pcurpos = pSAttach; - pFPnt = pSAttach - segm; - pSPnt = pSAttach; - } - } - else // on arc - { - Standard_Real dp1 = pcurpos1 - pFAttach; - Standard_Real dp2 = pSAttach - pcurpos1; - - segm = Min(rad,dp1*0.75); - pFPnt = pcurpos - segm; - - segm = Min(rad,dp2*0.75); - pSPnt = pcurpos + segm; - } - } - - if ( first ) - { - myFAttach = ElCLib::Value(pcurpos,anEll); - myFirstPnt1 = ElCLib::Value(pFPnt,anEll); - myFirstPnt2 = ElCLib::Value(pSPnt,anEll); - } - else - { - mySAttach = ElCLib::Value(pcurpos,anEll); - mySecondPnt1 = ElCLib::Value(pFPnt,anEll); - mySecondPnt2 = ElCLib::Value(pSPnt,anEll); - } -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_MidPointRelation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_MidPointRelation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_MidPointRelation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_MidPointRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,6 +1,4 @@ -// Created on: 2000-10-20 -// Created by: Julia DOROVSKIKH -// Copyright (c) 2000-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -16,84 +14,9 @@ #ifndef _AIS_MidPointRelation_HeaderFile #define _AIS_MidPointRelation_HeaderFile -#include +#include -class Geom_Plane; -class gp_Lin; -class gp_Pnt; -class gp_Circ; -class gp_Elips; - -DEFINE_STANDARD_HANDLE(AIS_MidPointRelation, AIS_Relation) - -//! presentation of equal distance to point myMidPoint -class AIS_MidPointRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_MidPointRelation, AIS_Relation) -public: - - Standard_EXPORT AIS_MidPointRelation(const TopoDS_Shape& aSymmTool, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); - - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - void SetTool (const TopoDS_Shape& aMidPointTool); - - const TopoDS_Shape& GetTool() const; - - //! Computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeFaceFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); - - Standard_EXPORT void ComputeEdgeFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); - - Standard_EXPORT void ComputeVertexFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); - - Standard_EXPORT void ComputePointsOnLine (const gp_Lin& aLin, const Standard_Boolean first); - - Standard_EXPORT void ComputePointsOnLine (const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); - - Standard_EXPORT void ComputePointsOnCirc (const gp_Circ& aCirc, const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); - - //! ComputePointsOn... methods set myFAttach, myFirstPnt and myLastPnt - //! from the following initial data: curve, end points, myMidPoint. - //! End points (pnt1 & pnt2) and curve define the trimmed curve. - //! If end points are equal, curve is not trimmed (line - special case). - //! - //! .------. pnt2 - //! / - //! . circle . myLastPnt - //! | | - //! . pnt1 . myFAttach - //! \ arc / . myMidPoint - //! .______. myFirstPnt - Standard_EXPORT void ComputePointsOnElips (const gp_Elips& anEll, const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); - - TopoDS_Shape myTool; - gp_Pnt myMidPoint; - gp_Pnt myFAttach; - gp_Pnt myFirstPnt1; - gp_Pnt myFirstPnt2; - gp_Pnt mySAttach; - gp_Pnt mySecondPnt1; - gp_Pnt mySecondPnt2; - -}; - -#include +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_MidPointRelation AIS_MidPointRelation; #endif // _AIS_MidPointRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_MidPointRelation.lxx opencascade-7.5.1+dfsg1/src/AIS/AIS_MidPointRelation.lxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_MidPointRelation.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_MidPointRelation.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -// Created on: 2000-10-20 -// Created by: Julia DOROVSKIKH -// Copyright (c) 2000-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : SetTool -//purpose : -//======================================================================= -inline void AIS_MidPointRelation::SetTool(const TopoDS_Shape& aMidPointTool) -{ - myTool = aMidPointTool; -} - -//======================================================================= -//function : GetTool -//purpose : -//======================================================================= -inline const TopoDS_Shape& AIS_MidPointRelation::GetTool() const -{ - return myTool; -} - - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_MidPointRelation::IsMovable() const -{ - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_MinRadiusDimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_MinRadiusDimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_MinRadiusDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_MinRadiusDimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,339 +0,0 @@ -// Created on: 1998-01-27 -// Created by: Sergey ZARITCHNY -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_MinRadiusDimension,AIS_EllipseRadiusDimension) - -//======================================================================= -//function : AIS_MinRadiusDimension -//purpose : -//======================================================================= -AIS_MinRadiusDimension::AIS_MinRadiusDimension(const TopoDS_Shape& aShape, - const Standard_Real aVal, - const TCollection_ExtendedString& aText) -:AIS_EllipseRadiusDimension(aShape, aText) -{ - myVal = aVal; - mySymbolPrs = DsgPrs_AS_LASTAR; - myAutomaticPosition = Standard_True; - myArrowSize = myVal / 100.; -} - -//======================================================================= -//function : AIS_MinRadiusDimension -//purpose : -//======================================================================= - -AIS_MinRadiusDimension::AIS_MinRadiusDimension(const TopoDS_Shape& aShape, - const Standard_Real aVal, - const TCollection_ExtendedString& aText, - const gp_Pnt& aPosition, - const DsgPrs_ArrowSide aSymbolPrs, - const Standard_Real anArrowSize) -:AIS_EllipseRadiusDimension(aShape, aText) -{ - myVal = aVal; - mySymbolPrs = aSymbolPrs; - myPosition = aPosition; - myAutomaticPosition = Standard_False; - SetArrowSize( anArrowSize ); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_MinRadiusDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer /*aMode*/) -{ -// if( myAutomaticPosition ) - //{ //ota : recompute ellipse always - ComputeGeometry(); - myEllipse.SetMinorRadius(myVal); - gp_Vec v1(myEllipse.YAxis().Direction()); - v1 *=myVal; - myApexP = myEllipse.Location().Translated(v1); - myApexN = myEllipse.Location().Translated(-v1); -// } - if(myIsAnArc) ComputeArcOfEllipse(aPresentation); - else - ComputeEllipse(aPresentation); -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= - -void AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation)"); - PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Geom_Transformation)& aTransformation, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_MinRadiusDimension::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeEllipse -//purpose : -//======================================================================= - -void AIS_MinRadiusDimension::ComputeEllipse(const Handle(Prs3d_Presentation)& aPresentation) -{ - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - - // size - if( !myArrowSizeIsDefined ) { - myArrowSize = Min(myArrowSize,myVal/5.); - } - arr->SetLength(myArrowSize); - - Standard_Real U;//,V; - gp_Pnt curPos, Center; - Center = myEllipse.Location(); - if( myAutomaticPosition ) - { - myPosition = Center; - myEndOfArrow = myApexP; - myAutomaticPosition = Standard_True; - - if ( myIsSetBndBox ) - myPosition = AIS::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )), - myBndBox ); - curPos = myPosition; - } - else //!AutomaticPosition - { - curPos = myPosition; - gp_Lin L1(myEllipse.YAxis()); - U = ElCLib::Parameter ( L1, curPos ); - curPos = ElCLib::Value (U, L1); - if (curPos.Distance(myApexP) < curPos.Distance(myApexN)) - myEndOfArrow = myApexP ; - else - myEndOfArrow = myApexN ; - myPosition = curPos; - } - - // Presenatation - DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, curPos, - myEndOfArrow, Center, Standard_False, mySymbolPrs); - -} - -//======================================================================= -//function : ComputeArcOfEllipse -//purpose : -//======================================================================= - -void AIS_MinRadiusDimension::ComputeArcOfEllipse(const Handle(Prs3d_Presentation)& aPresentation) -{ - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - - // size - if( !myArrowSizeIsDefined ) { - myArrowSize = Min(myArrowSize,myVal/5.); - } - arr->SetLength(myArrowSize); - - Standard_Real par; - gp_Pnt curPos, Center; - Center = myEllipse.Location(); - Standard_Boolean IsInDomain = Standard_True; - if( myAutomaticPosition ) - { - myEndOfArrow = AIS::NearestApex(myEllipse, myApexP, myApexN, - myFirstPar, myLastPar, IsInDomain); - myPosition = Center; - myAutomaticPosition = Standard_True; - if ( myIsSetBndBox ) - myPosition = AIS::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )), - myBndBox ); - curPos = myPosition; - - } - else //!AutomaticPosition - { - curPos = myPosition; - gp_Lin L1(myEllipse.YAxis()); - par = ElCLib::Parameter ( L1, curPos ); - curPos = ElCLib::Value (par, L1); - if (curPos.Distance(myApexP) < curPos.Distance(myApexN)) - myEndOfArrow = myApexP ; - else - myEndOfArrow = myApexN ; - par = ElCLib::Parameter ( myEllipse, myEndOfArrow ); - IsInDomain = AIS::InDomain(myFirstPar, myLastPar, par); - myPosition = curPos; - } - - Standard_Real parStart =0.; - if( !IsInDomain ) - { - if(AIS::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < - AIS::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar)) - parStart = myFirstPar; - else - parStart = myLastPar; - - } - - if(!myIsOffset) - DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myEllipse, - curPos, myEndOfArrow, Center, parStart, IsInDomain, - Standard_True, mySymbolPrs); - else - DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myOffsetCurve, - curPos, myEndOfArrow, Center, parStart, IsInDomain, - Standard_True, mySymbolPrs); -} - - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= - -void AIS_MinRadiusDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer /*aMode*/) -{ - - gp_Pnt center = myEllipse.Location(); - gp_Pnt AttachmentPoint = myPosition; - Standard_Real dist = center.Distance(AttachmentPoint); - Standard_Real aRadius = myVal; - //Standard_Real inside = Standard_False; - gp_Pnt pt1; - if (dist > aRadius) pt1 = AttachmentPoint; - else - pt1 = myEndOfArrow; - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - Handle(Select3D_SensitiveSegment) - seg = new Select3D_SensitiveSegment(own, center , pt1); - aSelection->Add(seg); - - // Text - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, - AttachmentPoint.X(), - AttachmentPoint.Y(), - AttachmentPoint.Z(), - AttachmentPoint.X()+size, - AttachmentPoint.Y()+size, - AttachmentPoint.Z()+size); - aSelection->Add(box); - - // Arc of Ellipse - if(myIsAnArc) - { - - Standard_Real parEnd = ElCLib::Parameter ( myEllipse, myEndOfArrow ); - if(!AIS::InDomain(myFirstPar, myLastPar, parEnd)) - { - Standard_Real parStart, par; - if(AIS::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < - AIS::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar)) - par = myFirstPar; - else - par = myLastPar; - gp_Vec Vapex(center, ElCLib::Value( parEnd, myEllipse )) ; - gp_Vec Vpnt (center, ElCLib::Value( par, myEllipse )) ; - gp_Dir dir(Vpnt ^ Vapex); - if(myEllipse.Position().Direction().IsOpposite( dir, Precision::Angular())) { - parStart = parEnd; - parEnd = par; - } - else - parStart = par; - Handle(Geom_Curve)TrimCurve; - if(myIsOffset) - { - Handle(Geom_Curve) aCurve = myOffsetCurve; - TrimCurve = new Geom_TrimmedCurve( aCurve, parStart, parEnd ); - } - else - { - Handle(Geom_Ellipse) Ellipse = new Geom_Ellipse( myEllipse ); - TrimCurve = new Geom_TrimmedCurve( Ellipse, parStart, parEnd ); - } - Handle( Select3D_SensitiveCurve ) SensArc; - SensArc = new Select3D_SensitiveCurve( own, TrimCurve ); - aSelection->Add( SensArc ); - } - } - -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_MinRadiusDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_MinRadiusDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_MinRadiusDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_MinRadiusDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1998-01-22 -// Created by: Sergey ZARITCHNY -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,52 +14,9 @@ #ifndef _AIS_MinRadiusDimension_HeaderFile #define _AIS_MinRadiusDimension_HeaderFile -#include -#include +#include -DEFINE_STANDARD_HANDLE(AIS_MinRadiusDimension, AIS_EllipseRadiusDimension) - -//! -- Ellipse Min radius dimension of a Shape which -//! can be Edge or Face (planar or cylindrical(surface of -//! extrusion or surface of offset)) -class AIS_MinRadiusDimension : public AIS_EllipseRadiusDimension -{ - DEFINE_STANDARD_RTTIEXT(AIS_MinRadiusDimension, AIS_EllipseRadiusDimension) -public: - - //! Max Ellipse radius dimension - //! Shape can be edge , planar face or cylindrical face - Standard_EXPORT AIS_MinRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); - - //! Max Ellipse radius dimension with position - //! Shape can be edge , planar face or cylindrical face - Standard_EXPORT AIS_MinRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeEllipse (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeArcOfEllipse (const Handle(Prs3d_Presentation)& aPresentation); - - gp_Pnt myApexP; - gp_Pnt myApexN; - gp_Pnt myEndOfArrow; - -}; +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_MinRadiusDimension AIS_MinRadiusDimension; #endif // _AIS_MinRadiusDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_MouseGesture.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_MouseGesture.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_MouseGesture.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_MouseGesture.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,10 +21,15 @@ { AIS_MouseGesture_NONE, //!< no active gesture // - AIS_MouseGesture_SelectRectangle, //!< rectangular selection - AIS_MouseGesture_SelectLasso, //!< polygonal selection + AIS_MouseGesture_SelectRectangle, //!< rectangular selection; + //! press button to start, move mouse to define rectangle, release to finish + AIS_MouseGesture_SelectLasso, //!< polygonal selection; + //! press button to start, move mouse to define polygonal path, release to finish // - AIS_MouseGesture_Zoom, //!< view zoom gesture + AIS_MouseGesture_Zoom, //!< view zoom gesture; + //! move mouse left to zoom-out, and to the right to zoom-in + AIS_MouseGesture_ZoomWindow, //!< view zoom by window gesture; + //! press button to start, move mouse to define rectangle, release to finish AIS_MouseGesture_Pan, //!< view panning gesture AIS_MouseGesture_RotateOrbit, //!< orbit rotation gesture AIS_MouseGesture_RotateView, //!< view rotation gesture diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_MultipleConnectedInteractive.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_MultipleConnectedInteractive.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_MultipleConnectedInteractive.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_MultipleConnectedInteractive.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -61,7 +60,7 @@ //purpose : //======================================================================= Handle(AIS_InteractiveObject) AIS_MultipleConnectedInteractive::connect (const Handle(AIS_InteractiveObject)& theAnotherObj, - const Handle(Geom_Transformation)& theTrsf, + const Handle(TopLoc_Datum3D)& theTrsf, const Handle(Graphic3d_TransformPers)& theTrsfPers) { if (myAssemblyOwner.IsNull()) @@ -160,29 +159,6 @@ } //======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_MultipleConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ - PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_MultipleConnectedInteractive::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Geom_Transformation)& aTransformation, - const Handle(Prs3d_Presentation)& aPresentation) -{ - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= //function : AcceptShapeDecomposition //purpose : //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_MultipleConnectedInteractive.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_MultipleConnectedInteractive.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_MultipleConnectedInteractive.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_MultipleConnectedInteractive.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,7 @@ //! Locates instance in theLocation and applies specified transformation persistence mode. //! @return created instance object (AIS_ConnectedInteractive or AIS_MultipleConnectedInteractive) Handle(AIS_InteractiveObject) Connect (const Handle(AIS_InteractiveObject)& theAnotherObj, - const Handle(Geom_Transformation)& theLocation, + const Handle(TopLoc_Datum3D)& theLocation, const Handle(Graphic3d_TransformPers)& theTrsfPers) { return connect (theAnotherObj, theLocation, theTrsfPers); @@ -57,17 +57,6 @@ //! Clears all the connections to objects. Standard_EXPORT void DisconnectAll(); - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - //! Informs the graphic context that the interactive Object //! may be decomposed into sub-shapes for dynamic selection. Standard_EXPORT virtual Standard_Boolean AcceptShapeDecomposition() const Standard_OVERRIDE; @@ -97,7 +86,7 @@ Handle(AIS_InteractiveObject) Connect (const Handle(AIS_InteractiveObject)& theAnotherObj, const gp_Trsf& theLocation) { - return connect (theAnotherObj, new Geom_Transformation (theLocation), theAnotherObj->TransformPersistence()); + return connect (theAnotherObj, new TopLoc_Datum3D (theLocation), theAnotherObj->TransformPersistence()); } //! Establishes the connection between the Connected Interactive Object, theInteractive, and its reference. @@ -107,7 +96,7 @@ const gp_Trsf& theLocation, const Handle(Graphic3d_TransformPers)& theTrsfPers) { - return connect (theAnotherObj, new Geom_Transformation (theLocation), theTrsfPers); + return connect (theAnotherObj, new TopLoc_Datum3D (theLocation), theTrsfPers); } Standard_DEPRECATED("This method is deprecated - Connect() taking Graphic3d_TransformPers should be called instead") @@ -116,7 +105,7 @@ const Graphic3d_TransModeFlags& theTrsfPersFlag, const gp_Pnt& theTrsfPersPoint) { - return connect (theInteractive, new Geom_Transformation (theLocation), Graphic3d_TransformPers::FromDeprecatedParams (theTrsfPersFlag, theTrsfPersPoint)); + return connect (theInteractive, new TopLoc_Datum3D (theLocation), Graphic3d_TransformPers::FromDeprecatedParams (theTrsfPersFlag, theTrsfPersPoint)); } protected: @@ -133,7 +122,7 @@ //! Locates instance in theLocation and applies specified transformation persistence mode. //! @return created instance object (AIS_ConnectedInteractive or AIS_MultipleConnectedInteractive) Standard_EXPORT virtual Handle(AIS_InteractiveObject) connect (const Handle(AIS_InteractiveObject)& theInteractive, - const Handle(Geom_Transformation)& theLocation, + const Handle(TopLoc_Datum3D)& theLocation, const Handle(Graphic3d_TransformPers)& theTrsfPers); private: diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_OffsetDimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_OffsetDimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_OffsetDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_OffsetDimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,486 +0,0 @@ -// Created on: 1997-03-04 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_OffsetDimension,AIS_Relation) - -//======================================================================= -//function : AIS_OffsetDimension -//purpose : -//======================================================================= -AIS_OffsetDimension::AIS_OffsetDimension(const TopoDS_Shape& FistShape, - const TopoDS_Shape& SecondShape, - const Standard_Real aVal, - const TCollection_ExtendedString& aText) -:AIS_Relation(), -myFAttach(0.,0.,0.), -mySAttach(0.,0.,0.) -{ - myFShape = FistShape; - mySShape = SecondShape; - mySymbolPrs = DsgPrs_AS_BOTHAR; - myVal = aVal; - myText = aText; - //myArrowSize = fabs (myVal/5.); - myArrowSize = fabs (myVal/10.0); - if (myArrowSize > 30.) myArrowSize = 30.; - if (myArrowSize < 15.) myArrowSize = 15.; - //std::cout<<"AIS_OffsetDimension::AIS_OffsetDimension " << myArrowSize << " myArrowSize"< 30.) myArrowSize = 30.; - if (myArrowSize < 15.) myArrowSize = 15.; - //std::cout<<"AIS_OffsetDimension::AIS_OffsetDimension " << myArrowSize << " myArrowSize"< 30.) myArrowSize = 30.; - if (myArrowSize < 15.) myArrowSize = 15.; - //std::cout<<"AIS_OffsetDimension::AIS_OffsetDimension " << myArrowSize << " myArrowSize"<Add(box); - } - - Standard_Real parmin,parmax,parcur; - parmin = ElCLib::Parameter(L3,Proj1); - parmax = parmin; - - parcur = ElCLib::Parameter(L3,Proj2); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - parcur = ElCLib::Parameter(L3,Tcurpos); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - gp_Pnt PointMin = ElCLib::Value(parmin,L3); - gp_Pnt PointMax = ElCLib::Value(parmax,L3); - - Handle(Select3D_SensitiveSegment) seg; - if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - PointMin, - PointMax); - aSel->Add(seg); - } - - if (!myTFAttach.IsEqual(Proj1,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - myTFAttach, - Proj1); - aSel->Add(seg); - } - if (!myTSAttach.IsEqual(Proj2,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - myTSAttach, - Proj2); - aSel->Add(seg); - } -} - -//======================================================================= -//function : ComputeTwoAxesOffset -//purpose : -//======================================================================= -void AIS_OffsetDimension::ComputeTwoAxesOffset(const Handle(Prs3d_Presentation)& aprs, - const gp_Trsf& aTrsf) -{ - BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); - BRepAdaptor_Surface surf2(TopoDS::Face(mySShape)); - - gp_Ax1 Ax1Surf1, Ax1Surf2; - - if (surf1.GetType() == GeomAbs_Cylinder) { - gp_Cylinder aCyl= surf1.Cylinder(); - Ax1Surf1 = aCyl.Axis(); - } else if (surf1.GetType() == GeomAbs_Cone) { - gp_Cone aCone= surf1.Cone(); - Ax1Surf1 = aCone.Axis(); - } else if (surf1.GetType() == GeomAbs_Torus) { - gp_Torus aTore= surf1.Torus(); - Ax1Surf1 = aTore.Axis(); - } - Standard_Real FirstUParam = surf1.FirstUParameter(); - Standard_Real FirstVParam = surf1.FirstVParameter(); - Standard_Real LastVParam = surf1.LastVParameter(); - gp_Pnt P1First = surf1.Value(FirstUParam,FirstVParam); - gp_Pnt P1Last = surf1.Value(FirstUParam,LastVParam); - - - if (surf2.GetType() == GeomAbs_Cylinder) { - gp_Cylinder aCyl= surf2.Cylinder(); - Ax1Surf2 = aCyl.Axis(); - } else if (surf2.GetType() == GeomAbs_Cone) { - gp_Cone aCone= surf2.Cone(); - Ax1Surf2 = aCone.Axis(); - } else if (surf2.GetType() == GeomAbs_Torus) { - gp_Torus aTore= surf2.Torus(); - Ax1Surf2 = aTore.Axis(); - } - FirstUParam = surf2.FirstUParameter(); - FirstVParam = surf2.FirstVParameter(); - LastVParam = surf2.LastVParameter(); - gp_Pnt P2First = surf2.Value(FirstUParam,FirstVParam); - gp_Pnt P2Last = surf2.Value(FirstUParam,LastVParam); - - - - myFAttach = Ax1Surf1.Location(); - mySAttach = Ax1Surf2.Location(); - myDirAttach = Ax1Surf1.Direction(); - myDirAttach2 = myDirAttach; - gp_Pnt curpos; - gp_Lin aProjLine = gce_MakeLin(myFAttach,myDirAttach); - - if (myAutomaticPosition) { - curpos.SetX ( (myFAttach.X() + mySAttach.X()) /2. + 0.01); - curpos.SetY ( (myFAttach.Y() + mySAttach.Y()) /2. + 0.01); - curpos.SetZ ( (myFAttach.Z() + mySAttach.Z()) /2. + 0.01); - // + 0.01 pour eviter un raise de ComputeSelection... - - myPosition = curpos; - } - else { - curpos = myPosition; - } - - curpos = ElCLib::Value(ElCLib::Parameter(aProjLine,curpos),aProjLine); - // on projette pour la presentation - - gp_Pnt P1FirstProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P1First),aProjLine); - gp_Pnt P1LastProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P1Last),aProjLine); - if (P1FirstProj.Distance(curpos) > P1LastProj.Distance(curpos)) - myFAttach = P1FirstProj; - else - myFAttach = P1LastProj; - - gp_Pnt P2FirstProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P2First),aProjLine); - gp_Pnt P2LastProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P2Last),aProjLine); - if (P2FirstProj.Distance(curpos) > P2LastProj.Distance(curpos)) - mySAttach = P2FirstProj; - else - mySAttach = P2LastProj; - - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - //std::cout<<"AIS_OffsetDimension::AIS_OffsetDimension " << myArrowSize << " myArrowSize"<SetLength(myArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - - gp_Pnt myTFAttach = myFAttach.Transformed (aTrsf); - gp_Pnt myTSAttach = mySAttach.Transformed (aTrsf); - gp_Dir myTDirAttach = myDirAttach.Transformed (aTrsf); - gp_Dir myTDirAttach2 = myTDirAttach; - gp_Pnt Tcurpos = curpos.Transformed (aTrsf); - - if (myIsSetBndBox) - Tcurpos = AIS::TranslatePointToBound( Tcurpos, myDirAttach, myBndBox ); - - DsgPrs_OffsetPresentation::AddAxes(aprs, - myDrawer, - myText, - myTFAttach, - myTSAttach, - myTDirAttach, - myTDirAttach2, - Tcurpos); - - BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); - TopoDS_Shape myTFShape = transform1.Shape(); - BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); - TopoDS_Shape myTSShape = transform2.Shape(); - - StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); - StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); -} - -//======================================================================= -//function : ComputeTwoFacesOffset -//purpose : -//======================================================================= -void AIS_OffsetDimension::ComputeTwoFacesOffset(const Handle(Prs3d_Presentation)& aprs, - const gp_Trsf& aTrsf) -{ - gp_Dir norm1 = myDirAttach; - gp_Pnt curpos; - gp_Ax2 myax2; - if (myAutomaticPosition && ! myIsSetBndBox) { - TopExp_Explorer explo(myFShape,TopAbs_VERTEX); - if (explo.More()) { - TopoDS_Vertex vertref = TopoDS::Vertex(explo.Current()); - myFAttach = BRep_Tool::Pnt(vertref); - gp_Vec trans = norm1.XYZ()*fabs(myVal/2); - gp_Ax2 ax2(myFAttach,norm1); - myDirAttach = ax2.XDirection(); - curpos = myFAttach.Translated(trans); - if (myVal <= Precision::Confusion()) { - gp_Vec vecnorm1 = norm1.XYZ()*.001; - curpos.Translate(vecnorm1); - } - myPosition = curpos; - myax2 = ax2; - } - } - else { - if (myAutomaticPosition && myIsSetBndBox) - { - Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; - myBndBox.Get( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax ); - myPosition.SetCoord( aXmax, aYmax, aZmax ); - } - - curpos = myPosition; - myFAttach = AIS::Nearest(myFShape,curpos); - if (myFAttach.Distance(curpos) <= Precision::Confusion()) { - gp_Ax2 ax2(myFAttach,norm1); - myDirAttach = ax2.XDirection(); - myax2 = ax2; - } - else { - gp_Dir orient(myFAttach.XYZ()-curpos.XYZ()); - gp_Ax2 ax2(myFAttach,norm1); - if (orient.Angle(norm1) <= Precision::Angular()) { - myDirAttach = ax2.XDirection(); - } - else { - gp_Dir adir = norm1 ^ orient; - myDirAttach = adir ^ norm1; - } - myax2 = ax2; - } - } - // en attendant mieux - mySAttach = AIS::Nearest(mySShape,curpos); - gp_Ax3 anax3 (myax2); - gp_Pln apln (anax3); - - //gp_Pnt proj2; - Standard_Real u2,v2, uatt, vatt; - ElSLib::Parameters (apln , mySAttach, uatt,vatt); - ElSLib::Parameters (apln , curpos , u2,v2); - - if (uatt== u2 && vatt == v2) { - myDirAttach2 = myDirAttach; - } else { - gp_Vec avec (ElSLib::Value (uatt,vatt, apln) , ElSLib::Value (u2,v2, apln)); - myDirAttach2.SetCoord (avec.X(),avec.Y(),avec.Z()); - } - - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - //std::cout<<"AIS_OffsetDimension::AIS_OffsetDimension " << myArrowSize << " myArrowSize"<SetLength(myArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - - gp_Pnt myTFAttach = myFAttach.Transformed (aTrsf); - gp_Pnt myTSAttach = mySAttach.Transformed (aTrsf); - gp_Dir myTDirAttach = myDirAttach.Transformed (aTrsf); - gp_Dir myTDirAttach2 = myDirAttach2.Transformed (aTrsf); - gp_Pnt Tcurpos = curpos.Transformed (aTrsf); - -/* - if (myIsSetBndBox) - { - BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); - Tcurpos = AIS::TranslatePointToBound( Tcurpos, surf1.Plane().XAxis().Direction(), myBndBox ); - } -*/ - DsgPrs_OffsetPresentation::Add(aprs, - myDrawer, - myText, - myTFAttach, - myTSAttach, - myTDirAttach, - myTDirAttach2, - Tcurpos); - - - BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); - TopoDS_Shape myTFShape = transform1.Shape(); - BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); - TopoDS_Shape myTSShape = transform2.Shape(); - - StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); - StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); -} - -//======================================================================= -//function : ComputeAxeFaceOffset -//purpose : -//======================================================================= -void AIS_OffsetDimension::ComputeAxeFaceOffset(const Handle(Prs3d_Presentation)& aprs, - const gp_Trsf& aTrsf) -{ - BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); - TopoDS_Shape myTFShape = transform1.Shape(); - BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); - TopoDS_Shape myTSShape = transform2.Shape(); - - StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); - StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); -} - diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_OffsetDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_OffsetDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_OffsetDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_OffsetDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1997-03-04 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,68 +14,9 @@ #ifndef _AIS_OffsetDimension_HeaderFile #define _AIS_OffsetDimension_HeaderFile -#include -#include +#include -DEFINE_STANDARD_HANDLE(AIS_OffsetDimension, AIS_Relation) - -//! A framework to display dimensions of offsets. -//! The relation between the offset and the basis shape -//! is indicated. This relation is displayed with arrows and -//! text. The text gives the dsitance between the offset -//! and the basis shape. -class AIS_OffsetDimension : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_OffsetDimension, AIS_Relation) -public: - - //! Constructs the offset display object defined by the - //! first shape aFShape, the second shape aSShape, the - //! dimension aVal, and the text aText. - Standard_EXPORT AIS_OffsetDimension(const TopoDS_Shape& FistShape, const TopoDS_Shape& SecondShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - - //! Indicates that the dimension we are concerned with is an offset. - virtual AIS_KindOfDimension KindOfDimension() const Standard_OVERRIDE; - - //! Returns true if the offset datum is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - //! Sets a transformation aTrsf for presentation and - //! selection to a relative position. - void SetRelativePos (const gp_Trsf& aTrsf); - -private: - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoFacesOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); - - Standard_EXPORT void ComputeTwoAxesOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); - - Standard_EXPORT void ComputeAxeFaceOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); - - gp_Pnt myFAttach; - gp_Pnt mySAttach; - gp_Dir myDirAttach; - gp_Dir myDirAttach2; - gp_Trsf myRelativePos; - -}; - -#include +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_OffsetDimension AIS_OffsetDimension; #endif // _AIS_OffsetDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_OffsetDimension.lxx opencascade-7.5.1+dfsg1/src/AIS/AIS_OffsetDimension.lxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_OffsetDimension.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_OffsetDimension.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -// Created on: 1997-03-04 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : KindOfDimension -//purpose : -//======================================================================= -inline AIS_KindOfDimension AIS_OffsetDimension::KindOfDimension() const -{ - return AIS_KOD_OFFSET; -} - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_OffsetDimension::IsMovable() const -{ - return Standard_True; -} - -//======================================================================= -//function : SetRelativePos -//purpose : -//======================================================================= -inline void AIS_OffsetDimension::SetRelativePos(const gp_Trsf& aTrsf) -{ - myRelativePos = aTrsf; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ParallelRelation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ParallelRelation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ParallelRelation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ParallelRelation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,400 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_ParallelRelation,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_ParallelRelation::AIS_ParallelRelation(const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape, - const Handle(Geom_Plane)& aPlane) -{ - myFShape = aFShape; - mySShape = aSShape; - myPlane = aPlane; - myAutomaticPosition = Standard_True; - myArrowSize = 0.01; - mySymbolPrs = DsgPrs_AS_BOTHAR; -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_ParallelRelation::AIS_ParallelRelation(const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape, - const Handle(Geom_Plane)& aPlane, - const gp_Pnt& aPosition, - const DsgPrs_ArrowSide aSymbolPrs, - const Standard_Real anArrowSize) -{ - myFShape = aFShape; - mySShape = aSShape; - myPlane = aPlane; - myAutomaticPosition = Standard_False; - SetArrowSize( anArrowSize ); - myPosition = aPosition; - mySymbolPrs = aSymbolPrs; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_ParallelRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - switch (myFShape.ShapeType()) - { - case TopAbs_FACE : - { - // cas longueur entre deux faces - ComputeTwoFacesParallel(aPresentation); - } - break; - case TopAbs_EDGE : - { - // cas longueur entre deux edges - ComputeTwoEdgesParallel(aPresentation); - } - break; - default: - break; - } -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= -void AIS_ParallelRelation::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_ParallelRelation::Compute(const Handle(Prs3d_Projector)&,const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -void AIS_ParallelRelation::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_ParallelRelation::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_ParallelRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - gp_Lin L1 (myFAttach,myDirAttach); - gp_Lin L2 (mySAttach,myDirAttach); - gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,myPosition),L1); - gp_Pnt Proj2 = ElCLib::Value(ElCLib::Parameter(L2,myPosition),L2); - - gp_Lin L3; - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - - if (!Proj1.IsEqual(Proj2,Precision::Confusion())) - { - L3 = gce_MakeLin(Proj1,Proj2); - } - else - { - L3 = gce_MakeLin(Proj1,myDirAttach); - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle(Select3D_SensitiveBox) box = - new Select3D_SensitiveBox(own, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X()+size, - myPosition.Y()+size, - myPosition.Z()+size); - aSelection->Add(box); - } - Standard_Real parmin,parmax,parcur; - parmin = ElCLib::Parameter(L3,Proj1); - parmax = parmin; - - parcur = ElCLib::Parameter(L3,Proj2); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - parcur = ElCLib::Parameter(L3,myPosition); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - gp_Pnt PointMin = ElCLib::Value(parmin,L3); - gp_Pnt PointMax = ElCLib::Value(parmax,L3); - - Handle(Select3D_SensitiveSegment) seg; - - if (!PointMin.IsEqual(PointMax,Precision::Confusion())) - { - seg = new Select3D_SensitiveSegment(own, - PointMin, - PointMax); - aSelection->Add(seg); - } - if (!myFAttach.IsEqual(Proj1,Precision::Confusion())) - { - seg = new Select3D_SensitiveSegment(own, myFAttach, Proj1); - aSelection->Add(seg); - } - if (!mySAttach.IsEqual(Proj2,Precision::Confusion())) - { - seg = new Select3D_SensitiveSegment(own, mySAttach, Proj2); - aSelection->Add(seg); - } -} - -//======================================================================= -//function : ComputeTwoFacesParallel -//purpose : -//======================================================================= -void AIS_ParallelRelation::ComputeTwoFacesParallel(const Handle(Prs3d_Presentation)&) -{ - throw Standard_NotImplemented("AIS_ParallelRelation::ComputeTwoFacesParallel not implemented"); -} - -//======================================================================= -//function : ComputeTwoEdgesParallel -//purpose : -//======================================================================= -void AIS_ParallelRelation::ComputeTwoEdgesParallel(const Handle(Prs3d_Presentation)& aPresentation) -{ - TopoDS_Edge E1 = TopoDS::Edge(myFShape); - TopoDS_Edge E2 = TopoDS::Edge(mySShape); - - gp_Pnt ptat11,ptat12,ptat21,ptat22;//,pint3d; - Handle(Geom_Curve) geom1,geom2; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if (!AIS::ComputeGeometry(E1,E2,myExtShape, - geom1,geom2, - ptat11,ptat12,ptat21,ptat22, - extCurv, - isInfinite1,isInfinite2, - myPlane)) - { - return; - } - - aPresentation->SetInfiniteState((isInfinite1 || isInfinite2) && (myExtShape != 0)); - - gp_Lin l1; - gp_Lin l2; - Standard_Boolean isEl1 = Standard_False, isEl2 = Standard_False; - - if (geom1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - Handle(Geom_Ellipse) geom_el1 (Handle(Geom_Ellipse)::DownCast (geom1)); - // construct lines through focuses - gp_Ax1 elAx = geom_el1->XAxis(); - l1 = gp_Lin(elAx); - Standard_Real focex = geom_el1->MajorRadius() - geom_el1->Focal()/2.0; - gp_Vec transvec = gp_Vec(elAx.Direction())*focex; - ptat11 = geom_el1->Focus1().Translated(transvec); - ptat12 = geom_el1->Focus2().Translated(-transvec); - isEl1 = Standard_True; - } - else if (geom1->IsInstance(STANDARD_TYPE(Geom_Line))) - { - Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); - l1 = geom_lin1->Lin(); - } - else return; - - if (geom2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - Handle(Geom_Ellipse) geom_el2 (Handle(Geom_Ellipse)::DownCast (geom2)); - // construct lines through focuses - gp_Ax1 elAx = geom_el2->XAxis(); - l2 = gp_Lin(elAx); - Standard_Real focex = geom_el2->MajorRadius() - geom_el2->Focal()/2.0; - gp_Vec transvec = gp_Vec(elAx.Direction())*focex; - ptat21 = geom_el2->Focus1().Translated(transvec); - ptat22 = geom_el2->Focus2().Translated(-transvec); - isEl2 = Standard_True; - } - else if (geom2->IsInstance(STANDARD_TYPE(Geom_Line))) - { - Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); - l2 = geom_lin2->Lin(); - } - else return; - - const Handle(Geom_Line)& geom_lin1 = new Geom_Line(l1); - const Handle(Geom_Line)& geom_lin2 = new Geom_Line(l2); - - myDirAttach = l1.Direction(); - // size - if( !myArrowSizeIsDefined ) { - Standard_Real arrSize1 (myArrowSize), arrSize2 (myArrowSize); - if (!isInfinite1) arrSize1 = ptat11.Distance(ptat12)/50.; - if (!isInfinite2) arrSize2 = ptat21.Distance(ptat22)/50.; - myArrowSize = Max(myArrowSize,Max(arrSize1,arrSize2)); -// myArrowSize = Min(myArrowSize,Min(arrSize1,arrSize2)); - } - - if ( myAutomaticPosition ) - { - gp_Pnt curpos; - if ( !isInfinite1 ) - { - gp_Pnt p2 = ElCLib::Value(ElCLib::Parameter(l2,ptat11),l2); - curpos.SetXYZ((ptat11.XYZ() + p2.XYZ())/2.); - } - else if ( !isInfinite2 ) - { - gp_Pnt p2 = ElCLib::Value(ElCLib::Parameter(l1,ptat21),l1); - curpos.SetXYZ((ptat21.XYZ()+p2.XYZ())/2.); - } - else - { - curpos.SetXYZ((l1.Location().XYZ()+l2.Location().XYZ())/2.); - } - // offset pour eviter confusion Edge et Dimension - gp_Vec offset (myDirAttach); - offset = offset*myArrowSize*(-10.); - curpos.Translate(offset); - myPosition = curpos; - } - - // recherche points attache - if (!isInfinite1) - { - if ( isEl1 ) - { - if (myPosition.Distance(ptat11) < myPosition.Distance(ptat12)) myFAttach = ptat12; - else myFAttach = ptat11; - } - else - { - if (myPosition.Distance(ptat11) > myPosition.Distance(ptat12)) myFAttach = ptat12; - else myFAttach = ptat11; - } - } - else - { - myFAttach = ElCLib::Value(ElCLib::Parameter(l1,myPosition),l1); - } - - if (!isInfinite2) - { - if ( isEl2 ) - { - if (myPosition.Distance(ptat21) < myPosition.Distance(ptat22)) mySAttach = ptat22; - else mySAttach = ptat21; - } - else - { - if (myPosition.Distance(ptat21) > myPosition.Distance(ptat22)) mySAttach = ptat22; - else mySAttach = ptat21; - } - } - else - { - mySAttach = ElCLib::Value(ElCLib::Parameter(l2,myPosition),l2); - } - TCollection_ExtendedString aText (" //"); - - if (l1.Distance(l2) <= Precision::Confusion()) - { - myArrowSize = 0.; - } - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - if ( myExtShape == 1) - mySymbolPrs = DsgPrs_AS_FIRSTPT_LASTAR; - else if ( myExtShape == 2) - mySymbolPrs = DsgPrs_AS_FIRSTAR_LASTPT; - - DsgPrs_LengthPresentation::Add(aPresentation, - myDrawer, - aText, - myFAttach, - mySAttach, - myDirAttach, - myPosition, - mySymbolPrs); - if ( (myExtShape != 0) && !extCurv.IsNull()) - { - gp_Pnt pf, pl; - if ( myExtShape == 1 ) - { - if (!isInfinite1) - { - pf = ptat11; - pl = ptat12; - } - ComputeProjEdgePresentation(aPresentation,E1,geom_lin1,pf,pl); - } - else - { - if (!isInfinite2) - { - pf = ptat21; - pl = ptat22; - } - ComputeProjEdgePresentation(aPresentation,E2,geom_lin2,pf,pl); - } - } -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ParallelRelation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ParallelRelation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ParallelRelation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ParallelRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,62 +14,9 @@ #ifndef _AIS_ParallelRelation_HeaderFile #define _AIS_ParallelRelation_HeaderFile -#include -#include +#include -DEFINE_STANDARD_HANDLE(AIS_ParallelRelation, AIS_Relation) - -//! A framework to display constraints of parallelism -//! between two or more Interactive Objects. These -//! entities can be faces or edges. -class AIS_ParallelRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_ParallelRelation, AIS_Relation) -public: - - - //! Constructs an object to display parallel constraints. - //! This object is defined by the first shape aFShape and - //! the second shape aSShape and the plane aPlane. - Standard_EXPORT AIS_ParallelRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); - - //! Constructs an object to display parallel constraints. - //! This object is defined by the first shape aFShape and - //! the second shape aSShape the plane aPlane, the - //! position aPosition, the type of arrow, aSymbolPrs and - //! its size anArrowSize. - Standard_EXPORT AIS_ParallelRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.01); - - //! Returns true if the parallelism is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoFacesParallel (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeTwoEdgesParallel (const Handle(Prs3d_Presentation)& aPresentation); - - gp_Pnt myFAttach; - gp_Pnt mySAttach; - gp_Dir myDirAttach; - -}; - -#include +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_ParallelRelation AIS_ParallelRelation; #endif // _AIS_ParallelRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ParallelRelation.lxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ParallelRelation.lxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ParallelRelation.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ParallelRelation.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Created on: 1997-02-28 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_ParallelRelation::IsMovable() const -{ - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_PerpendicularRelation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_PerpendicularRelation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_PerpendicularRelation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_PerpendicularRelation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,366 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_PerpendicularRelation,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : TwoEdgesPerpendicular -//======================================================================= -AIS_PerpendicularRelation::AIS_PerpendicularRelation(const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape, - const Handle(Geom_Plane)& aPlane) -:AIS_Relation() -{ - myFShape = aFShape; - mySShape = aSShape; - myPlane = aPlane; -} - -//======================================================================= -//function : Constructor -//purpose : TwoFacesPerpendicular -//======================================================================= -AIS_PerpendicularRelation::AIS_PerpendicularRelation(const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape) -:AIS_Relation() -{ - myFShape = aFShape; - mySShape = aSShape; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_PerpendicularRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - if (myFShape.ShapeType() == mySShape.ShapeType()) { - switch (myFShape.ShapeType()) { - case TopAbs_FACE : - { - // cas perpendiculaire entre deux faces - ComputeTwoFacesPerpendicular(aPresentation); - } - break; - case TopAbs_EDGE : - { - // cas perpendiculaire entre deux edges - ComputeTwoEdgesPerpendicular(aPresentation); - } - break; - default: - break; - } - } - // Cas pas traite - Edge/Face -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= -void AIS_PerpendicularRelation::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_PerpendicularRelation::Compute(const Handle(Prs3d_Projector)&,const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -void AIS_PerpendicularRelation::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_PerpendicularRelation::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_PerpendicularRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - const gp_Pnt& pos = myPosition; - Handle(Select3D_SensitiveSegment) seg; - Standard_Boolean ok1(Standard_False),ok2(Standard_False); - - if (!myFAttach.IsEqual(pos,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - myFAttach, - pos); - aSelection->Add(seg); - ok1 = Standard_True; - } - if (!mySAttach.IsEqual(myPosition,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - mySAttach, - pos); - aSelection->Add(seg); - ok2 = Standard_True; - } - - if (ok1 && ok2) { - gp_Vec vec1(gce_MakeDir(pos,myFAttach)); - gp_Vec vec2(gce_MakeDir(pos,mySAttach)); - Standard_Real dist1(pos.Distance(myFAttach)); - Standard_Real dist2(pos.Distance(mySAttach)); - vec1 *= dist1; - vec1 *= .2; - vec2 *= dist2; - vec2 *= .2; - - gp_Pnt pAx11 = pos.Translated(vec1); - gp_Pnt pAx22 = pos.Translated(vec2); - gp_Pnt p_symb = pAx22.Translated(vec1); - seg = new Select3D_SensitiveSegment(own,pAx11,p_symb); - aSelection->Add(seg); - seg = new Select3D_SensitiveSegment(own,p_symb,pAx22); - aSelection->Add(seg); - } -} - -//======================================================================= -//function : ComputeTwoFacesPerpendicular -//purpose : -//======================================================================= -void AIS_PerpendicularRelation::ComputeTwoFacesPerpendicular - (const Handle(Prs3d_Presentation)& /*aPresentation*/) -{ -} - -//======================================================================= -//function : ComputeTwoEdgesPerpendicular -//purpose : -//======================================================================= -void AIS_PerpendicularRelation::ComputeTwoEdgesPerpendicular(const Handle(Prs3d_Presentation)& aPresentation) -{ - // 3d lines - Handle(Geom_Curve) geom1,geom2; - gp_Pnt pint3d,p1,p2,pAx1,pAx2,ptat11,ptat12,ptat21,ptat22; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if ( !AIS::ComputeGeometry(TopoDS::Edge(myFShape),TopoDS::Edge(mySShape), - myExtShape, - geom1,geom2, - ptat11,ptat12,ptat21,ptat22, - extCurv, - isInfinite1,isInfinite2, - myPlane) ) return; - - Standard_Boolean interOut1(Standard_False),interOut2(Standard_False); - - Handle(Geom_Line) geom_lin1; - Handle(Geom_Line) geom_lin2; - if ( geom1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) - { - Handle(Geom_Ellipse) geom_el (Handle(Geom_Ellipse)::DownCast (geom1)); - // construct lines through focuses - gp_Ax1 elAx = geom_el->XAxis(); - gp_Lin ll (elAx); - geom_lin1 = new Geom_Line(ll); - Standard_Real focex = geom_el->MajorRadius() - geom_el->Focal()/2.0; - gp_Vec transvec = gp_Vec(elAx.Direction())*focex; - ptat11 = geom_el->Focus1().Translated(transvec); - ptat12 = geom_el->Focus2().Translated(-transvec); - interOut1 = Standard_True; - } - else if ( geom1->IsInstance(STANDARD_TYPE(Geom_Line)) ) - { - geom_lin1 = Handle(Geom_Line)::DownCast (geom1); - } - else return; - - if (geom2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - Handle(Geom_Ellipse) geom_el (Handle(Geom_Ellipse)::DownCast (geom2)); - // construct lines through focuses - gp_Ax1 elAx = geom_el->XAxis(); - gp_Lin ll (elAx); - geom_lin2 = new Geom_Line(ll); - Standard_Real focex = geom_el->MajorRadius() - geom_el->Focal()/2.0; - gp_Vec transvec = gp_Vec(elAx.Direction())*focex; - ptat21 = geom_el->Focus1().Translated(transvec); - ptat22 = geom_el->Focus2().Translated(-transvec); - interOut2 = Standard_True; - } - else if ( geom2->IsInstance(STANDARD_TYPE(Geom_Line)) ) - { - geom_lin2 = Handle(Geom_Line)::DownCast (geom2); - } - else return; - - // current face - BRepBuilderAPI_MakeFace makeface (myPlane->Pln()); - TopoDS_Face face (makeface.Face()); - BRepAdaptor_Surface adp (makeface.Face()); - - // 2d lines => projection of 3d on current plane - Handle(Geom2d_Curve) aGeom2dCurve = GeomAPI::To2d(geom_lin1,myPlane->Pln()); - Handle(Geom2d_Line) lin1_2d = Handle(Geom2d_Line)::DownCast (aGeom2dCurve) ; - aGeom2dCurve = GeomAPI::To2d(geom_lin2,myPlane->Pln()); - Handle(Geom2d_Line) lin2_2d = Handle(Geom2d_Line)::DownCast (aGeom2dCurve) ; - IntAna2d_AnaIntersection inter(lin1_2d->Lin2d(),lin2_2d->Lin2d()); - if (!inter.IsDone()) return; - if (!inter.NbPoints()) return; - - gp_Pnt2d pint(inter.Point(1).Value()); - pint3d = adp.Value(pint.X(),pint.Y()); - - myPosition = pint3d; - // recherche points attache - Standard_Real par1,par2,curpar,pmin,pmax;//,dist,sign; - Standard_Real length(0.); - - if ( isInfinite1 && isInfinite2 ) - { - Standard_Real curpar1 = ElCLib::Parameter(geom_lin1->Lin(),pint3d); - Standard_Real curpar2 = ElCLib::Parameter(geom_lin2->Lin(),pint3d); - par1 = par2 = 50.; - p1 = p2 = pint3d; - myFAttach = ElCLib::Value(curpar1+par1,geom_lin1->Lin()); - mySAttach = ElCLib::Value(curpar2+par2,geom_lin2->Lin()); - } - else - { - Standard_Boolean lengthComputed (Standard_False); - if ( !isInfinite1 ) - { - curpar = ElCLib::Parameter(geom_lin1->Lin(),pint3d); - par1 = ElCLib::Parameter(geom_lin1->Lin(),ptat11); - par2 = ElCLib::Parameter(geom_lin1->Lin(),ptat12); - pmin = Min(par1,par2); - pmax = Max(par1,par2); - - if ( myPosition.SquareDistance(ptat11) > myPosition.SquareDistance(ptat12) ) - p1 = ptat11; - else - p1 = ptat12; - if ( (curpar < pmin) || (curpar > pmax) ) - { - interOut1 = Standard_True; - } - if ( !isInfinite2 ) length = 2.*Min(ptat11.Distance(ptat12),ptat21.Distance(ptat22))/5.; - else length = 2.*ptat11.Distance(ptat12)/5.; - lengthComputed = Standard_True; - gp_Vec vec1 (gce_MakeDir(myPosition,p1)); - vec1.Multiply(length); - pAx1 = myPosition.Translated(vec1); - myFAttach = pAx1; - } - if ( !isInfinite2 ) - { - curpar = ElCLib::Parameter(geom_lin2->Lin(),pint3d); - par1 = ElCLib::Parameter(geom_lin2->Lin(),ptat21); - par2 = ElCLib::Parameter(geom_lin2->Lin(),ptat22); - pmin = Min(par1,par2); - pmax = Max(par1,par2); - - if ( myPosition.SquareDistance(ptat21) > myPosition.SquareDistance(ptat22) ) p2 = ptat21; - else p2 = ptat22; - if ( (curpar < pmin) || (curpar > pmax) ) - { - interOut2 = Standard_True; - } - gp_Vec vec2 (gce_MakeDir(myPosition,p2)); - if ( !lengthComputed ) - { - if ( !isInfinite1 ) length = 2.*Min(ptat11.Distance(ptat12),ptat21.Distance(ptat22))/5.; - else length = 2.*ptat21.Distance(ptat22)/5.; - } - vec2.Multiply(length); - pAx2 = myPosition.Translated(vec2); - mySAttach = pAx2; - } - if ( isInfinite1 ) - { - p1 = myPosition; - gp_Vec vec1(geom_lin1->Lin().Direction()); - vec1.Multiply(length); - myFAttach = myPosition.Translated(vec1); - } - if ( isInfinite2 ) - { - p2 = myPosition; - gp_Vec vec2(geom_lin2->Lin().Direction()); - vec2.Multiply(length); - mySAttach = myPosition.Translated(vec2); - } - } - DsgPrs_PerpenPresentation::Add(aPresentation,myDrawer, - myFAttach,mySAttach, - p1,p2, - myPosition, - interOut1,interOut2); - - if ( (myExtShape != 0) && !extCurv.IsNull()) { - gp_Pnt pf,pl; - if ( myExtShape == 1 ) { - if (!isInfinite1) { - pf = ptat11; - pl = ptat12; - } - aPresentation->SetInfiniteState(isInfinite1); - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),geom_lin1,pf,pl); - } - else { - if (!isInfinite2) { - pf = ptat21; - pl = ptat22; - } - aPresentation->SetInfiniteState(isInfinite2); - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),geom_lin2,pf,pl); - } - } -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_PerpendicularRelation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_PerpendicularRelation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_PerpendicularRelation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_PerpendicularRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,58 +14,9 @@ #ifndef _AIS_PerpendicularRelation_HeaderFile #define _AIS_PerpendicularRelation_HeaderFile -#include +#include -DEFINE_STANDARD_HANDLE(AIS_PerpendicularRelation, AIS_Relation) - -//! A framework to display constraints of perpendicularity -//! between two or more interactive datums. These -//! datums can be edges or faces. -class AIS_PerpendicularRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_PerpendicularRelation, AIS_Relation) -public: - - //! Constructs an object to display constraints of - //! perpendicularity on shapes. - //! This object is defined by a first shape aFShape, a - //! second shape aSShape, and a plane aPlane. - //! aPlane is the plane of reference to show and test the - //! perpendicular relation between two shapes, at least - //! one of which has a revolved surface. - Standard_EXPORT AIS_PerpendicularRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); - - //! Constructs an object to display constraints of - //! perpendicularity on shapes. - //! This object is defined by a first shape aFShape and a - //! second shape aSShape. - Standard_EXPORT AIS_PerpendicularRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape); - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoFacesPerpendicular (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeTwoEdgesPerpendicular (const Handle(Prs3d_Presentation)& aPresentation); - - gp_Pnt myFAttach; - gp_Pnt mySAttach; - -}; +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_PerpendicularRelation AIS_PerpendicularRelation; #endif // _AIS_PerpendicularRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Plane.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Plane.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Plane.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Plane.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -39,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -260,7 +258,7 @@ { ComputeFrame(); Handle(Prs3d_PlaneAspect) theaspect = myDrawer->PlaneAspect(); - Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation); + Handle(Graphic3d_Group) TheGroup = aPresentation->CurrentGroup(); TheGroup->SetPrimitivesAspect(myDrawer->ShadingAspect()->Aspect()); gp_Pnt p1; const Standard_Real Xmax = 0.5*Standard_Real(theaspect->PlaneXLength()); @@ -286,11 +284,6 @@ } } -void AIS_Plane::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation) -{ - PrsMgr_PresentableObject::Compute(aProjector, aTransformation, aPresentation); -} - //======================================================================= //function : ComputeSelection //purpose : @@ -530,15 +523,6 @@ } //======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= -void AIS_Plane::Compute(const Handle(Prs3d_Projector)&, - const Handle(Prs3d_Presentation)&) -{ -} - -//======================================================================= //function : ComputeFields //purpose : //======================================================================= @@ -604,7 +588,7 @@ void AIS_Plane::InitDrawerAttributes() { Handle(Prs3d_ShadingAspect) shasp = new Prs3d_ShadingAspect(); - shasp->SetMaterial(Graphic3d_NOM_PLASTIC); + shasp->SetMaterial(Graphic3d_NameOfMaterial_Plastified); shasp->SetColor(Quantity_NOC_GRAY40); myDrawer->SetShadingAspect(shasp); Handle(Graphic3d_AspectFillArea3d) asf = shasp->Aspect(); diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Plane.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Plane.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Plane.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Plane.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -132,15 +132,6 @@ //! Sets the type of sensitivity for the plane. void SetTypeOfSensitivity (Select3D_TypeOfSensitivity theTypeOfSensitivity) { myTypeOfSensitivity = theTypeOfSensitivity; } - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, const Standard_Integer theMode) Standard_OVERRIDE; Standard_EXPORT void SetColor (const Quantity_Color& aColor) Standard_OVERRIDE; @@ -151,8 +142,6 @@ Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - Standard_EXPORT void ComputeFrame(); Standard_EXPORT void ComputeFields(); diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_PlaneTrihedron.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_PlaneTrihedron.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_PlaneTrihedron.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_PlaneTrihedron.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -42,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -181,12 +179,6 @@ aPresentation->SetInfiniteState (Standard_True); } -void AIS_PlaneTrihedron::Compute(const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTransformation, const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_PlaneTrihedron::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation) ; -} - //======================================================================= //function : ComputeSelection //purpose : @@ -251,13 +243,6 @@ SynchronizeAspects(); } - -void AIS_PlaneTrihedron::Compute(const Handle(Prs3d_Projector)&, - const Handle(Prs3d_Presentation)&) -{ -} - - //======================================================================= //function : ExtremityPoints //purpose : to avoid warning diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_PlaneTrihedron.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_PlaneTrihedron.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_PlaneTrihedron.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_PlaneTrihedron.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -73,16 +73,7 @@ //! Returns true if the display mode selected, aMode, is valid. Standard_EXPORT Standard_Boolean AcceptDisplayMode (const Standard_Integer aMode) const Standard_OVERRIDE; - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - + virtual Standard_Integer Signature() const Standard_OVERRIDE { return 4; } //! Returns datum as the type of Interactive Object. @@ -101,8 +92,6 @@ private: - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; private: diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_PointCloud.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_PointCloud.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_PointCloud.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_PointCloud.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,14 +22,13 @@ #include #include #include -#include #include #include #include #include #include #include -#include +#include IMPLEMENT_STANDARD_RTTIEXT(AIS_PointCloudOwner, SelectMgr_EntityOwner) IMPLEMENT_STANDARD_RTTIEXT(AIS_PointCloud, AIS_InteractiveObject) @@ -298,7 +297,7 @@ AIS_InteractiveObject::UnsetColor(); { - Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NOM_BRASS); + Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NameOfMaterial_Brass); Graphic3d_MaterialAspect aMat = aDefaultMat; Quantity_Color aColor = aDefaultMat.Color(); if (myDrawer->HasLink()) @@ -354,7 +353,7 @@ } { - Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NOM_BRASS); + Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NameOfMaterial_Brass); myDrawer->ShadingAspect()->SetMaterial (myDrawer->HasLink() ? myDrawer->Link()->ShadingAspect()->Material (myCurrentFacingModel) : aDefaultMat, @@ -400,7 +399,7 @@ return; } - StdPrs_BndBox::Add (thePrs, aBndBox, myDrawer); + Prs3d_BndBox::Add (thePrs, aBndBox, myDrawer); break; } } diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Point.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Point.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Point.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Point.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -28,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -93,7 +91,7 @@ StdPrs_Point::Add(aPresentation,myComponent,myDrawer); else if (aMode== -99) { - Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation); + Handle(Graphic3d_Group) TheGroup = aPresentation->CurrentGroup(); TheGroup->SetPrimitivesAspect (myHilightDrawer->PointAspect()->Aspect()); Handle(Graphic3d_ArrayOfPoints) aPoint = new Graphic3d_ArrayOfPoints (1); aPoint->AddVertex (myComponent->X(),myComponent->Y(),myComponent->Z()); @@ -103,19 +101,6 @@ } //======================================================================= -//function : Compute -//purpose : -//======================================================================= - -void AIS_Point::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Geom_Transformation)& aTransformation, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_Point::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation) ; -} - -//======================================================================= //function : ComputeSelection //purpose : //======================================================================= @@ -160,16 +145,6 @@ return BRepBuilderAPI_MakeVertex(P); } - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= -void AIS_Point::Compute(const Handle(Prs3d_Projector)&, - const Handle(Prs3d_Presentation)&) -{ -} - //======================================================================= //function : SetMarker //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Point.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Point.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Point.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Point.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,15 +48,6 @@ //! Returns true if the display mode selected is valid for point datums. Standard_EXPORT Standard_Boolean AcceptDisplayMode (const Standard_Integer aMode) const Standard_OVERRIDE; - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; //! Allows you to provide settings for the Color. Standard_EXPORT virtual void SetColor (const Quantity_Color& theColor) Standard_OVERRIDE; @@ -84,8 +75,6 @@ Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; private: - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_RadiusDimension.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_RadiusDimension.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_RadiusDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_RadiusDimension.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,276 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier/Serguei Zaritchny -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include - - -IMPLEMENT_STANDARD_RTTIEXT(AIS_RadiusDimension,AIS_Dimension) - -namespace -{ - static const Standard_ExtCharacter THE_RADIUS_SYMBOL ('R'); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_RadiusDimension::AIS_RadiusDimension (const gp_Circ& theCircle) -: AIS_Dimension (AIS_KOD_RADIUS) -{ - SetMeasuredGeometry (theCircle); - SetSpecialSymbol (THE_RADIUS_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_RadiusDimension::AIS_RadiusDimension (const gp_Circ& theCircle, - const gp_Pnt& theAttachPoint) -: AIS_Dimension (AIS_KOD_RADIUS) -{ - SetMeasuredGeometry (theCircle, theAttachPoint); - SetSpecialSymbol (THE_RADIUS_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_RadiusDimension::AIS_RadiusDimension (const TopoDS_Shape& theShape) -: AIS_Dimension (AIS_KOD_RADIUS) -{ - SetMeasuredGeometry (theShape); - SetSpecialSymbol (THE_RADIUS_SYMBOL); - SetDisplaySpecialSymbol (AIS_DSS_Before); - SetFlyout (0.0); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_RadiusDimension::SetMeasuredGeometry (const gp_Circ& theCircle, - const gp_Pnt& theAnchorPoint, - const Standard_Boolean theHasAnchor) -{ - myCircle = theCircle; - myGeometryType = GeometryType_Edge; - myShape = BRepLib_MakeEdge (theCircle); - myAnchorPoint = theHasAnchor ? theAnchorPoint : ElCLib::Value (0, myCircle); - myIsGeometryValid = IsValidCircle (myCircle) && IsValidAnchor (myCircle, myAnchorPoint); - - if (myIsGeometryValid) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : SetMeasuredGeometry -//purpose : -//======================================================================= -void AIS_RadiusDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape, - const gp_Pnt& theAnchorPoint, - const Standard_Boolean theHasAnchor) -{ - Standard_Boolean isClosed = Standard_False; - myShape = theShape; - myGeometryType = GeometryType_UndefShapes; - myIsGeometryValid = InitCircularDimension (theShape, myCircle, myAnchorPoint, isClosed) - && IsValidCircle (myCircle); - if (theHasAnchor) - { - myAnchorPoint = theAnchorPoint; - myIsGeometryValid = myIsGeometryValid && IsValidAnchor (myCircle, myAnchorPoint); - } - - if (myIsGeometryValid) - { - ComputePlane(); - } - - SetToUpdate(); -} - -//======================================================================= -//function : CheckPlane -//purpose : -//======================================================================= -Standard_Boolean AIS_RadiusDimension::CheckPlane (const gp_Pln& thePlane) const -{ - // Check if anchor point and circle center point belong to plane. - if (!thePlane.Contains (myAnchorPoint, Precision::Confusion()) && - !thePlane.Contains (myCircle.Location(), Precision::Confusion())) - { - return Standard_False; - } - - return Standard_True; -} - -//======================================================================= -//function : ComputePlane -//purpose : -//======================================================================= -void AIS_RadiusDimension::ComputePlane() -{ - if (!myIsGeometryValid) - { - return; - } - - gp_Dir aDimensionX = gce_MakeDir (myAnchorPoint, myCircle.Location()); - - myPlane = gp_Pln (gp_Ax3 (myCircle.Location(), - myCircle.Axis().Direction(), - aDimensionX)); -} - -//======================================================================= -//function : GetModelUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_RadiusDimension::GetModelUnits() const -{ - return myDrawer->DimLengthModelUnits(); -} - -//======================================================================= -//function : GetDisplayUnits -//purpose : -//======================================================================= -const TCollection_AsciiString& AIS_RadiusDimension::GetDisplayUnits() const -{ - return myDrawer->DimLengthDisplayUnits(); -} - -//======================================================================= -//function : SetModelUnits -//purpose : -//======================================================================= -void AIS_RadiusDimension::SetModelUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthModelUnits (theUnits); -} - -//======================================================================= -//function : SetDisplayUnits -//purpose : -//======================================================================= -void AIS_RadiusDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) -{ - myDrawer->SetDimLengthDisplayUnits(theUnits); -} - -//======================================================================= -//function : ComputeValue -//purpose : -//======================================================================= -Standard_Real AIS_RadiusDimension::ComputeValue() const -{ - if (!IsValid()) - { - return 0.0; - } - - return myCircle.Radius(); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_RadiusDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode) -{ - mySelectionGeom.Clear (theMode); - - if (!IsValid()) - { - return; - } - - DrawLinearDimension (thePresentation, theMode, myAnchorPoint, myCircle.Location(), Standard_True); -} - -//======================================================================= -//function : IsValidCircle -//purpose : -//======================================================================= -Standard_Boolean AIS_RadiusDimension::IsValidCircle (const gp_Circ& theCircle) const -{ - return theCircle.Radius() > Precision::Confusion(); -} - -//======================================================================= -//function : IsValidAnchor -//purpose : -//======================================================================= -Standard_Boolean AIS_RadiusDimension::IsValidAnchor (const gp_Circ& theCircle, - const gp_Pnt& theAnchor) const -{ - gp_Pln aCirclePlane (theCircle.Location(), theCircle.Axis().Direction()); - Standard_Real anAnchorDist = theAnchor.Distance (theCircle.Location()); - - return anAnchorDist > Precision::Confusion() - && aCirclePlane.Contains (theAnchor, Precision::Confusion()); -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -const gp_Pnt AIS_RadiusDimension::GetTextPosition() const -{ - if (IsTextPositionCustom()) - { - return myFixedTextPosition; - } - - // Counts text position according to the dimension parameters - return GetTextPositionForLinear (myAnchorPoint, myCircle.Location(), Standard_True); -} - -//======================================================================= -//function : GetTextPosition -//purpose : -//======================================================================= -void AIS_RadiusDimension::SetTextPosition (const gp_Pnt& theTextPos) -{ - if (!myIsGeometryValid) - { - return; - } - - myIsTextPositionFixed = Standard_True; - myFixedTextPosition = theTextPos; - - SetToUpdate(); -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_RadiusDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_RadiusDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_RadiusDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_RadiusDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,5 +1,4 @@ -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -15,148 +14,9 @@ #ifndef _AIS_RadiusDimension_HeaderFile #define _AIS_RadiusDimension_HeaderFile -#include -#include -#include -#include -#include -#include +#include -class AIS_RadiusDimension; -DEFINE_STANDARD_HANDLE (AIS_RadiusDimension,AIS_Dimension) - -//! Radius dimension. Can be constructued: -//! - On generic circle. -//! - On generic circle with user-defined anchor point on that circle. -//! - On generic shape containing geometry that can be measured -//! by diameter dimension: circle wire, arc, circular face, etc. -//! The anchor point is the location of left attachement point of -//! dimension on the circle. It can be user-specified, or computed as -//! middle point on the arc. The radius dimension always lies in the -//! plane of the measured circle. The dimension is considered as -//! invalid if the user-specified anchor point is not lying on the circle, -//! if the radius of the circle is less than Precision::Confusion(). -//! In case if the dimension is built on the arbitrary shape, -//! it can be considered as invalid if the shape does not contain -//! circle geometry. -class AIS_RadiusDimension : public AIS_Dimension -{ -public: - - //! Create radius dimension for the circle geometry. - //! @param theCircle [in] the circle to measure. - Standard_EXPORT AIS_RadiusDimension (const gp_Circ& theCircle); - - //! Create radius dimension for the circle geometry and define its - //! orientation by location of the first point on that circle. - //! @param theCircle [in] the circle to measure. - //! @param theAnchorPoint [in] the point to define the position - //! of the dimension attachment on the circle. - Standard_EXPORT AIS_RadiusDimension (const gp_Circ& theCircle, - const gp_Pnt& theAnchorPoint); - - //! Create radius dimension for the arbitrary shape (if possible). - //! @param theShape [in] the shape to measure. - Standard_EXPORT AIS_RadiusDimension (const TopoDS_Shape& theShape); - -public: - - //! @return measured geometry circle. - const gp_Circ& Circle() const - { - return myCircle; - } - - //! @return anchor point on circle for radius dimension. - const gp_Pnt& AnchorPoint() const - { - return myAnchorPoint; - } - - //! @return the measured shape. - const TopoDS_Shape& Shape() const - { - return myShape; - } - -public: - - //! Measure radius of the circle. - //! The dimension will become invalid if the radius of the circle - //! is less than Precision::Confusion(). - //! @param theCircle [in] the circle to measure. - void SetMeasuredGeometry (const gp_Circ& theCircle) { SetMeasuredGeometry (theCircle, gp_Pnt(), Standard_False); } - - //! Measure radius of the circle and orient the dimension so - //! the dimension lines attaches to anchor point on the circle. - //! The dimension will become invalid if the radius of the circle - //! is less than Precision::Confusion(). - //! @param theCircle [in] the circle to measure. - //! @param theAnchorPoint [in] the point to attach the dimension lines, should be on the circle - //! @param theHasAnchor [in] should be set TRUE if theAnchorPoint should be used - Standard_EXPORT void SetMeasuredGeometry (const gp_Circ& theCircle, - const gp_Pnt& theAnchorPoint, - const Standard_Boolean theHasAnchor = Standard_True); - - //! Measure radius on the passed shape, if applicable. - //! The dimension will become invalid if the passed shape is not - //! measurable or if measured diameter value is less than Precision::Confusion(). - //! @param theShape [in] the shape to measure. - void SetMeasuredGeometry (const TopoDS_Shape& theShape) { SetMeasuredGeometry (theShape, gp_Pnt(), Standard_False); } - - //! Measure radius on the passed shape, if applicable. - //! The dimension will become invalid if the passed shape is not - //! measurable or if measured diameter value is less than Precision::Confusion(). - //! @param theShape [in] the shape to measure. - //! @param theAnchorPoint [in] the point to attach the dimension lines, should be on the circle - //! @param theHasAnchor [in] should be set TRUE if theAnchorPoint should be used - Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Shape& theShape, - const gp_Pnt& theAnchorPoint, - const Standard_Boolean theHasAnchor = Standard_True); - - //! @return the display units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; - - //! @return the model units string. - Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; - - Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; - - Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; - - Standard_EXPORT virtual const gp_Pnt GetTextPosition() const Standard_OVERRIDE; - -public: - - DEFINE_STANDARD_RTTIEXT(AIS_RadiusDimension,AIS_Dimension) - -protected: - - Standard_EXPORT virtual void ComputePlane(); - - //! Checks if anchor point and the center of the circle are on the plane. - Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, - const Handle(Prs3d_Presentation)& thePresentation, - const Standard_Integer theMode = 0) Standard_OVERRIDE; - -protected: - - Standard_EXPORT Standard_Boolean IsValidCircle (const gp_Circ& theCircle) const; - - Standard_EXPORT Standard_Boolean IsValidAnchor (const gp_Circ& theCircle, - const gp_Pnt& thePnt) const; - -private: - - gp_Circ myCircle; - gp_Pnt myAnchorPoint; - TopoDS_Shape myShape; -}; +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_RadiusDimension AIS_RadiusDimension; #endif // _AIS_RadiusDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Relation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Relation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Relation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Relation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,312 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_Relation,AIS_InteractiveObject) - -//======================================================================= -//function : AIS_Relation -//purpose : -//======================================================================= -AIS_Relation::AIS_Relation(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d) -:AIS_InteractiveObject(aTypeOfPresentation3d), - myVal(1.), - myPosition(0.,0.,0.), - myArrowSize( myVal / 10. ), - myAutomaticPosition(Standard_True), - myExtShape(0), - myFirstOffset(0.),mySecondOffset(0.), - myIsSetBndBox( Standard_False ), - myArrowSizeIsDefined( Standard_False) -{ -} - - - -//======================================================================= -//function : ComputeProjEdgePresentation -//purpose : -//======================================================================= - -void AIS_Relation::ComputeProjEdgePresentation(const Handle(Prs3d_Presentation)& aPrs, - const TopoDS_Edge& anEdge, - const Handle(Geom_Curve)& ProjCurv, - const gp_Pnt& FirstP, - const gp_Pnt& LastP, - const Quantity_NameOfColor aColor, - const Standard_Real width, - const Aspect_TypeOfLine aProjTOL, - const Aspect_TypeOfLine aCallTOL) const -{ - if (!myDrawer->HasOwnWireAspect()){ - myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));} - else { - const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect(); - li->SetColor(aColor); - li->SetTypeOfLine(aProjTOL); - li->SetWidth(width); - } - - Standard_Real pf, pl; - TopLoc_Location loc; - Handle(Geom_Curve) curve; - Standard_Boolean isInfinite; - curve = BRep_Tool::Curve(anEdge,loc,pf,pl); - isInfinite = (Precision::IsInfinite(pf) || Precision::IsInfinite(pl)); - - TopoDS_Edge E; - - // Calcul de la presentation de l'edge - if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Line)) ) { - Handle(Geom_Line) gl (Handle(Geom_Line)::DownCast (ProjCurv)); - if ( !isInfinite) { - pf = ElCLib::Parameter(gl->Lin(),FirstP); - pl = ElCLib::Parameter(gl->Lin(),LastP); - BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl); - E = MakEd.Edge(); - } - else { - BRepBuilderAPI_MakeEdge MakEd(gl->Lin()); - E = MakEd.Edge(); - } - } - else if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { - Handle(Geom_Circle) gc (Handle(Geom_Circle)::DownCast (ProjCurv)); - pf = ElCLib::Parameter(gc->Circ(),FirstP); - pl = ElCLib::Parameter(gc->Circ(),LastP); - BRepBuilderAPI_MakeEdge MakEd(gc->Circ(),pf, pl); - E = MakEd.Edge(); - } - StdPrs_WFShape::Add (aPrs, E, myDrawer); - - //Calcul de la presentation des lignes de raccord - myDrawer->WireAspect()->SetTypeOfLine(aCallTOL); - if (!isInfinite) { - gp_Pnt ppf, ppl; - ppf = BRep_Tool::Pnt( TopExp::FirstVertex(TopoDS::Edge(anEdge))); - ppl = BRep_Tool::Pnt( TopExp::LastVertex(TopoDS::Edge(anEdge))); - if (FirstP.Distance (ppf) > gp::Resolution()) - { - BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); - StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer); - } - else - { - BRepBuilderAPI_MakeVertex MakVert1 (FirstP); - StdPrs_WFShape::Add (aPrs, MakVert1.Vertex(), myDrawer); - } - if (LastP.Distance (ppl) > gp::Resolution()) - { - BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); - StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer); - } - else - { - BRepBuilderAPI_MakeVertex MakVert2 (LastP); - StdPrs_WFShape::Add (aPrs, MakVert2.Vertex(), myDrawer); - } -/* - BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); - StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer); - BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); - StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer); -*/ - } -} - - -//======================================================================= -//function : ComputeProjVertexPresentation -//purpose : -//======================================================================= - -void AIS_Relation::ComputeProjVertexPresentation(const Handle(Prs3d_Presentation)& aPrs, - const TopoDS_Vertex& aVertex, - const gp_Pnt& ProjPoint, - const Quantity_NameOfColor aColor, - const Standard_Real width, - const Aspect_TypeOfMarker aProjTOM, - const Aspect_TypeOfLine aCallTOL) const -{ - if (!myDrawer->HasOwnPointAspect()){ - myDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));} - else { - const Handle(Prs3d_PointAspect)& pa = myDrawer->PointAspect(); - pa->SetColor(aColor); - pa->SetTypeOfMarker(aProjTOM); - } - - { - Handle(Graphic3d_Group) aGroup = aPrs->NewGroup(); - Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); - anArrayOfPoints->AddVertex (ProjPoint); - aGroup->SetGroupPrimitivesAspect (myDrawer->PointAspect()->Aspect()); - aGroup->AddPrimitiveArray (anArrayOfPoints); - } - - if (!myDrawer->HasOwnWireAspect()){ - myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));} - else { - const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect(); - li->SetColor(aColor); - li->SetTypeOfLine(aCallTOL); - li->SetWidth(width); - } - - // Si les points ne sont pas confondus... - if (!ProjPoint.IsEqual (BRep_Tool::Pnt(aVertex),Precision::Confusion())) - { - Handle(Graphic3d_Group) aGroup = aPrs->NewGroup(); - Handle(Graphic3d_ArrayOfSegments) anArrayOfLines = new Graphic3d_ArrayOfSegments (2); - anArrayOfLines->AddVertex (ProjPoint); - anArrayOfLines->AddVertex (BRep_Tool::Pnt(aVertex)); - aGroup->SetGroupPrimitivesAspect (myDrawer->WireAspect()->Aspect()); - aGroup->AddPrimitiveArray (anArrayOfLines); - } -} - -//======================================================================= -//function : SetColor -//purpose : -//======================================================================= -void AIS_Relation::SetColor(const Quantity_Color &aCol) -{ - if(hasOwnColor && myDrawer->Color() == aCol) return; - - if (!myDrawer->HasOwnTextAspect()) myDrawer->SetTextAspect(new Prs3d_TextAspect()); - hasOwnColor=Standard_True; - myDrawer->SetColor (aCol); - myDrawer->TextAspect()->SetColor(aCol); - - Standard_Real WW = HasWidth()? Width(): myDrawer->HasLink() ? - AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Line) : 1.; - if (!myDrawer->HasOwnLineAspect()) { - myDrawer->SetLineAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW)); - } - if (!myDrawer->HasOwnDimensionAspect()) { - myDrawer->SetDimensionAspect(new Prs3d_DimensionAspect); - } - - myDrawer->LineAspect()->SetColor(aCol); - const Handle(Prs3d_DimensionAspect)& DIMENSION = myDrawer->DimensionAspect(); - const Handle(Prs3d_LineAspect)& LINE = myDrawer->LineAspect(); - const Handle(Prs3d_TextAspect)& TEXT = myDrawer->TextAspect(); - - DIMENSION->SetLineAspect(LINE); - DIMENSION->SetTextAspect(TEXT); -} - -//======================================================================= -//function : UnsetColor -//purpose : -//======================================================================= -void AIS_Relation::UnsetColor() -{ - if (!hasOwnColor) return; - hasOwnColor = Standard_False; - const Handle(Prs3d_LineAspect)& LA = myDrawer->LineAspect(); - Quantity_Color CC = Quantity_NOC_YELLOW; - if (myDrawer->HasLink()) - { - AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC); - myDrawer->SetTextAspect(myDrawer->Link()->TextAspect()); - } - LA->SetColor(CC); - myDrawer->DimensionAspect()->SetLineAspect(LA); -} - -//======================================================================= -//function : AcceptDisplayMode -//purpose : -//======================================================================= - - Standard_Boolean AIS_Relation:: -AcceptDisplayMode(const Standard_Integer aMode) const -{return aMode == 0;} - - -//======================================================================= -//function : SetFirstShape -//purpose : -//======================================================================= - -void AIS_Relation::SetFirstShape(const TopoDS_Shape& aFShape) -{ - myFShape = aFShape; -} - - -//======================================================================= -//function : SetSecondShape -//purpose : -//======================================================================= - -void AIS_Relation::SetSecondShape(const TopoDS_Shape& aSShape) -{ - mySShape = aSShape; -} - -//======================================================================= -//function : KindOfDimension -//purpose : -//======================================================================= -AIS_KindOfDimension AIS_Relation::KindOfDimension() const -{return AIS_KOD_NONE;} - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -Standard_Boolean AIS_Relation::IsMovable() const -{return Standard_False;} - - diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Relation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Relation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Relation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Relation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1997-02-27 -// Created by: Odile Olivier -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,206 +14,9 @@ #ifndef _AIS_Relation_HeaderFile #define _AIS_Relation_HeaderFile -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include -class Geom_Curve; -class Geom_Plane; -class Geom_Surface; -class TopoDS_Edge; -class TopoDS_Vertex; - -//! One of the four types of interactive object in -//! AIS,comprising dimensions and constraints. Serves -//! as the abstract class for the seven relation classes as -//! well as the seven dimension classes. -//! The statuses available for relations between shapes are as follows: -//! - 0 - there is no connection to a shape; -//! - 1 - there is a connection to the first shape; -//! - 2 - there is a connection to the second shape. -//! The connection takes the form of an edge between the two shapes. -class AIS_Relation : public AIS_InteractiveObject -{ - DEFINE_STANDARD_RTTIEXT(AIS_Relation, AIS_InteractiveObject) -public: - - //! Allows you to provide settings for the color theColor - //! of the lines representing the relation between the two shapes. - Standard_EXPORT void SetColor (const Quantity_Color& theColor) Standard_OVERRIDE; - - //! Allows you to remove settings for the color of the - //! lines representing the relation between the two shapes. - Standard_EXPORT void UnsetColor() Standard_OVERRIDE; - - virtual AIS_KindOfInteractive Type() const Standard_OVERRIDE { return AIS_KOI_Relation; } - - //! Indicates that the type of dimension is unknown. - Standard_EXPORT virtual AIS_KindOfDimension KindOfDimension() const; - - //! Returns true if the interactive object is movable. - Standard_EXPORT virtual Standard_Boolean IsMovable() const; - - const TopoDS_Shape& FirstShape() const { return myFShape; } - - Standard_EXPORT virtual void SetFirstShape (const TopoDS_Shape& aFShape); - - //! Returns the second shape. - const TopoDS_Shape& SecondShape() const { return mySShape; } - - //! Allows you to identify the second shape aSShape - //! relative to the first. - Standard_EXPORT virtual void SetSecondShape (const TopoDS_Shape& aSShape); - - void SetBndBox (const Standard_Real theXmin, const Standard_Real theYmin, const Standard_Real theZmin, - const Standard_Real theXmax, const Standard_Real theYmax, const Standard_Real theZmax) - { - myBndBox.Update (theXmin, theYmin, theZmin, theXmax, theYmax, theZmax); - myIsSetBndBox = Standard_True; - } - - void UnsetBndBox() { myIsSetBndBox = Standard_False; } - - //! Returns the plane. - const Handle(Geom_Plane)& Plane() const { return myPlane; } - - //! Allows you to set the plane thePlane. This is used to - //! define relations and dimensions in several daughter classes. - void SetPlane (const Handle(Geom_Plane)& thePlane) { myPlane = thePlane; } - - //! Returns the value of each object in the relation. - Standard_Real Value() const { return myVal; } - - //! Allows you to provide settings for the value theVal for each object in the relation. - void SetValue (const Standard_Real theVal) { myVal = theVal; } - - //! Returns the position set using SetPosition. - const gp_Pnt& Position() const { return myPosition; } - - //! Allows you to provide the objects in the relation with - //! settings for a non-default position. - void SetPosition (const gp_Pnt& thePosition) - { - myPosition = thePosition; - myAutomaticPosition = Standard_False; - } - - //! Returns settings for text aspect. - const TCollection_ExtendedString& Text() const { return myText; } - - //! Allows you to provide the settings theText for text aspect. - void SetText (const TCollection_ExtendedString& theText) { myText = theText; } - - //! Returns the value for the size of the arrow identifying - //! the relation between the two shapes. - Standard_Real ArrowSize() const { return myArrowSize; } - - //! Allows you to provide settings for the size of the - //! arrow theArrowSize identifying the relation between the two shapes. - void SetArrowSize (const Standard_Real theArrowSize) - { - myArrowSize = theArrowSize; - myArrowSizeIsDefined = Standard_True; - } - - //! Returns the value of the symbol presentation. This will be one of: - //! - AS_NONE - none - //! - AS_FIRSTAR - first arrow - //! - AS_LASTAR - last arrow - //! - AS_BOTHAR - both arrows - //! - AS_FIRSTPT - first point - //! - AS_LASTPT - last point - //! - AS_BOTHPT - both points - //! - AS_FIRSTAR_LASTPT - first arrow, last point - //! - AS_FIRSTPT_LASTAR - first point, last arrow - DsgPrs_ArrowSide SymbolPrs() const { return mySymbolPrs; } - - //! Allows you to provide settings for the symbol presentation. - void SetSymbolPrs (const DsgPrs_ArrowSide theSymbolPrs) { mySymbolPrs = theSymbolPrs; } - - //! Allows you to set the status of the extension shape by - //! the index aIndex. - //! The status will be one of the following: - //! - 0 - there is no connection to a shape; - //! - 1 - there is a connection to the first shape; - //! - 2 - there is a connection to the second shape. - void SetExtShape (const Standard_Integer theIndex) { myExtShape = theIndex; } - - //! Returns the status index of the extension shape. - Standard_Integer ExtShape() const { return myExtShape; } - - //! Returns true if the display mode aMode is accepted - //! for the Interactive Objects in the relation. - //! ComputeProjPresentation(me; - //! aPres : Presentation from Prs3d; - //! Curve1 : Curve from Geom; - //! Curve2 : Curve from Geom; - //! FirstP1 : Pnt from gp; - //! LastP1 : Pnt from gp; - //! FirstP2 : Pnt from gp; - //! LastP2 : Pnt from gp; - //! aColor : NameOfColor from Quantity = Quantity_NOC_PURPLE; - //! aWidth : Real from Standard = 2; - //! aProjTOL : TypeOfLine from Aspect = Aspect_TOL_DASH; - //! aCallTOL : TypeOfLine from Aspect = Aspect_TOL_DOT) - Standard_EXPORT virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer aMode) const Standard_OVERRIDE; - - void SetAutomaticPosition (const Standard_Boolean theStatus) { myAutomaticPosition = theStatus; } - - Standard_Boolean AutomaticPosition() const { return myAutomaticPosition; } - -protected: - - Standard_EXPORT AIS_Relation(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d = PrsMgr_TOP_AllView); - - //! Calculates the presentation aPres of the the edge - //! anEdge and the curve it defines, ProjCurve. The later - //! is also specified by the first point FirstP and the last point LastP. - //! The presentation includes settings for color aColor, - //! type - aProjTOL and aCallTOL - and width of line, aWidth. - Standard_EXPORT void ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPres, const TopoDS_Edge& anEdge, const Handle(Geom_Curve)& ProjCurve, const gp_Pnt& FirstP, const gp_Pnt& LastP, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfLine aProjTOL = Aspect_TOL_DASH, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT) const; - - //! Calculates the presentation aPres of the the vertex - //! aVertex and the point it defines, ProjPoint. - //! The presentation includes settings for color aColor, - //! type - aProjTOM and aCallTOL - and width of line, aWidth. - Standard_EXPORT void ComputeProjVertexPresentation (const Handle(Prs3d_Presentation)& aPres, const TopoDS_Vertex& aVertex, const gp_Pnt& ProjPoint, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfMarker aProjTOM = Aspect_TOM_PLUS, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT) const; - -protected: - - TopoDS_Shape myFShape; - TopoDS_Shape mySShape; - Handle(Geom_Plane) myPlane; - Standard_Real myVal; - gp_Pnt myPosition; - TCollection_ExtendedString myText; - Standard_Real myArrowSize; - Standard_Boolean myAutomaticPosition; - DsgPrs_ArrowSide mySymbolPrs; - Standard_Integer myExtShape; - gp_Pln myFirstPlane; - gp_Pln mySecondPlane; - Handle(Geom_Surface) myFirstBasisSurf; - Handle(Geom_Surface) mySecondBasisSurf; - AIS_KindOfSurface myFirstSurfType; - AIS_KindOfSurface mySecondSurfType; - Standard_Real myFirstOffset; - Standard_Real mySecondOffset; - Bnd_Box myBndBox; - Standard_Boolean myIsSetBndBox; - Standard_Boolean myArrowSizeIsDefined; - -}; - -DEFINE_STANDARD_HANDLE(AIS_Relation, AIS_InteractiveObject) +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_Relation AIS_Relation; #endif // _AIS_Relation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_RubberBand.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_RubberBand.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_RubberBand.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_RubberBand.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -43,7 +42,8 @@ { myDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0)); myDrawer->SetShadingAspect (new Prs3d_ShadingAspect()); - myDrawer->ShadingAspect()->SetMaterial (Graphic3d_NOM_PLASTIC); + myDrawer->ShadingAspect()->SetMaterial (Graphic3d_NameOfMaterial_Plastified); + myDrawer->ShadingAspect()->Aspect()->SetShadingModel (Graphic3d_TOSM_UNLIT); myDrawer->ShadingAspect()->Aspect()->SetInteriorStyle (Aspect_IS_EMPTY); myDrawer->ShadingAspect()->Aspect()->SetAlphaMode (Graphic3d_AlphaMode_Blend); myDrawer->ShadingAspect()->SetTransparency (1.0); @@ -65,7 +65,8 @@ { myDrawer->SetLineAspect (new Prs3d_LineAspect (theLineColor, theLineType, theWidth)); myDrawer->SetShadingAspect (new Prs3d_ShadingAspect()); - myDrawer->ShadingAspect()->SetMaterial (Graphic3d_NOM_PLASTIC); + myDrawer->ShadingAspect()->SetMaterial (Graphic3d_NameOfMaterial_Plastified); + myDrawer->ShadingAspect()->Aspect()->SetShadingModel (Graphic3d_TOSM_UNLIT); myDrawer->ShadingAspect()->Aspect()->SetInteriorStyle (Aspect_IS_EMPTY); myDrawer->ShadingAspect()->Aspect()->SetAlphaMode (Graphic3d_AlphaMode_Blend); myDrawer->ShadingAspect()->SetTransparency (1.0); @@ -89,8 +90,9 @@ { myDrawer->SetLineAspect (new Prs3d_LineAspect (theLineColor, theLineType, theLineWidth)); myDrawer->SetShadingAspect (new Prs3d_ShadingAspect()); - myDrawer->ShadingAspect()->SetMaterial (Graphic3d_NOM_PLASTIC); + myDrawer->ShadingAspect()->SetMaterial (Graphic3d_NameOfMaterial_Plastified); myDrawer->ShadingAspect()->SetColor (theFillColor); + myDrawer->ShadingAspect()->Aspect()->SetShadingModel (Graphic3d_TOSM_UNLIT); myDrawer->ShadingAspect()->Aspect()->SetInteriorStyle (Aspect_IS_SOLID); myDrawer->ShadingAspect()->Aspect()->SetAlphaMode (Graphic3d_AlphaMode_Blend); myDrawer->ShadingAspect()->SetTransparency (theTransparency); diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_SequenceOfDimension.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_SequenceOfDimension.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_SequenceOfDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_SequenceOfDimension.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef AIS_SequenceOfDimension_HeaderFile -#define AIS_SequenceOfDimension_HeaderFile - -#include -#include - -typedef NCollection_Sequence AIS_SequenceOfDimension; - - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Shape.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Shape.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Shape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Shape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -43,10 +42,8 @@ #include #include #include -#include -#include #include -#include +#include #include #include #include @@ -61,7 +58,6 @@ #include #include #include -#include #include #include @@ -156,9 +152,8 @@ } catch (Standard_Failure const& anException) { - Message::DefaultMessenger()->Send (TCollection_AsciiString() - + "Error: AIS_Shape::Compute() wireframe presentation builder has failed (" - + anException.GetMessageString() + ")", Message_Fail); + Message::SendFail (TCollection_AsciiString("Error: AIS_Shape::Compute() wireframe presentation builder has failed (") + + anException.GetMessageString() + ")"); } break; } @@ -187,9 +182,8 @@ } catch (Standard_Failure const& anException) { - Message::DefaultMessenger()->Send (TCollection_AsciiString() - + "Error: AIS_Shape::Compute() shaded presentation builder has failed (" - + anException.GetMessageString() + ")", Message_Fail); + Message::SendFail (TCollection_AsciiString("Error: AIS_Shape::Compute() shaded presentation builder has failed (") + + anException.GetMessageString() + ")"); StdPrs_WFShape::Add (aPrs, myshape, myDrawer); } } @@ -211,7 +205,7 @@ } else { - StdPrs_BndBox::Add (aPrs, BoundingBox(), myDrawer); + Prs3d_BndBox::Add (aPrs, BoundingBox(), myDrawer); } } } @@ -224,7 +218,7 @@ //function : computeHlrPresentation //purpose : //======================================================================= -void AIS_Shape::computeHlrPresentation (const Handle(Prs3d_Projector)& theProjector, +void AIS_Shape::computeHlrPresentation (const Handle(Graphic3d_Camera)& theProjector, const Handle(Prs3d_Presentation)& thePrs, const TopoDS_Shape& theShape, const Handle(Prs3d_Drawer)& theDrawer) @@ -282,19 +276,24 @@ switch (theDrawer->TypeOfHLR()) { case Prs3d_TOH_Algo: - StdPrs_HLRShape::Add (thePrs, theShape, theDrawer, theProjector); + { + StdPrs_HLRShape aBuilder; + aBuilder.ComputeHLR (thePrs, theShape, theDrawer, theProjector); break; + } case Prs3d_TOH_PolyAlgo: - default: - StdPrs_HLRPolyShape::Add (thePrs, theShape, theDrawer, theProjector); + case Prs3d_TOH_NotSet: + { + StdPrs_HLRPolyShape aBuilder; + aBuilder.ComputeHLR (thePrs, theShape, theDrawer, theProjector); break; + } } } catch (Standard_Failure const& anException) { - Message::DefaultMessenger()->Send (TCollection_AsciiString() - + "Error: AIS_Shape::Compute() HLR Algorithm has failed (" - + anException.GetMessageString() + ")", Message_Fail); + Message::SendFail (TCollection_AsciiString("Error: AIS_Shape::Compute() HLR Algorithm has failed (") + + anException.GetMessageString() + ")"); StdPrs_WFShape::Add (thePrs, theShape, theDrawer); } } @@ -322,7 +321,7 @@ // POP protection against crash in low layers - Standard_Real aDeflection = Prs3d::GetDeflection(shape, myDrawer); + Standard_Real aDeflection = StdPrs_ToolTriangulatedShape::GetDeflection(shape, myDrawer); try { OCC_CATCH_SIGNALS @@ -331,14 +330,13 @@ shape, TypOfSel, aDeflection, - myDrawer->HLRAngle(), + myDrawer->DeviationAngle(), myDrawer->IsAutoTriangulation()); } catch (Standard_Failure const& anException) { - Message::DefaultMessenger()->Send (TCollection_AsciiString() - + "Error: AIS_Shape::ComputeSelection(" + aMode + ") has failed (" - + anException.GetMessageString() + ")", Message_Fail); + Message::SendFail (TCollection_AsciiString("Error: AIS_Shape::ComputeSelection(") + aMode + ") has failed (" + + anException.GetMessageString() + ")"); if (aMode == 0) { aSelection->Clear(); @@ -491,7 +489,7 @@ || IsTransparent() || myDrawer->ShadingAspect()->Aspect()->ToMapTexture()) { - const Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NOM_BRASS); + const Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NameOfMaterial_Brass); Graphic3d_MaterialAspect mat = aDefaultMat; Quantity_Color anInteriorColors[2] = {Quantity_NOC_CYAN1, Quantity_NOC_CYAN1}; if (myDrawer->HasLink()) @@ -815,20 +813,6 @@ } //======================================================================= -//function : SetHLROwnDeviationCoefficient -//purpose : resets myhasOwnHLRDeviationCoefficient to Standard_False and -// returns Standard_True if it change -//======================================================================= - -Standard_Boolean AIS_Shape::SetOwnHLRDeviationCoefficient () -{ - Standard_Boolean itSet = myDrawer->HasOwnHLRDeviationCoefficient(); - if(itSet) myDrawer->SetHLRDeviationCoefficient(); - return itSet; - -} - -//======================================================================= //function : SetOwnDeviationAngle //purpose : resets myhasOwnDeviationAngle to Standard_False and // returns Standard_True if it change @@ -843,20 +827,6 @@ } //======================================================================= -//function : SetOwnHLRDeviationAngle -//purpose : resets myhasOwnHLRDeviationAngle to Standard_False and -// returns Standard_True if it change -//======================================================================= - -Standard_Boolean AIS_Shape::SetOwnHLRDeviationAngle () -{ - Standard_Boolean itSet = myDrawer->HasOwnHLRDeviationAngle(); - if(itSet) myDrawer->SetHLRAngle(); - return itSet; - -} -//***** SetOwn -//======================================================================= //function : SetOwnDeviationCoefficient //purpose : //======================================================================= @@ -868,17 +838,6 @@ } //======================================================================= -//function : SetOwnHLRDeviationCoefficient -//purpose : -//======================================================================= - -void AIS_Shape::SetOwnHLRDeviationCoefficient ( const Standard_Real aCoefficient ) -{ - myDrawer->SetHLRDeviationCoefficient( aCoefficient ); - -} - -//======================================================================= //function : SetOwnDeviationAngle //purpose : //======================================================================= @@ -913,31 +872,6 @@ return myInitAng ==0. ? GetContext()->DeviationAngle(): myInitAng; } - -//======================================================================= -//function : SetHLRAngleAndDeviation -//purpose : -//======================================================================= - -void AIS_Shape::SetHLRAngleAndDeviation ( const Standard_Real anAngle ) -{ - Standard_Real OutAngl,OutDefl; - HLRBRep::PolyHLRAngleAndDeflection(anAngle,OutAngl,OutDefl); - SetOwnHLRDeviationAngle( OutAngl ); - SetOwnHLRDeviationCoefficient(OutDefl); - -} -//======================================================================= -//function : SetOwnHLRDeviationAngle -//purpose : -//======================================================================= - -void AIS_Shape::SetOwnHLRDeviationAngle ( const Standard_Real anAngle ) -{ - myDrawer->SetHLRAngle( anAngle ); -} - -//***** GetOwn //======================================================================= //function : OwnDeviationCoefficient //purpose : @@ -952,20 +886,6 @@ } //======================================================================= -//function : OwnHLRDeviationCoefficient -//purpose : -//======================================================================= - -Standard_Boolean AIS_Shape::OwnHLRDeviationCoefficient ( Standard_Real & aCoefficient, - Standard_Real & aPreviousCoefficient ) const -{ - aCoefficient = myDrawer->HLRDeviationCoefficient(); - aPreviousCoefficient = myDrawer->PreviousHLRDeviationCoefficient (); - return myDrawer->HasOwnHLRDeviationCoefficient(); - -} - -//======================================================================= //function : OwnDeviationAngle //purpose : //======================================================================= @@ -979,14 +899,17 @@ } //======================================================================= -//function : OwnHLRDeviationAngle +//function : DumpJson //purpose : //======================================================================= - -Standard_Boolean AIS_Shape::OwnHLRDeviationAngle ( Standard_Real & anAngle, - Standard_Real & aPreviousAngle ) const +void AIS_Shape::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - anAngle = myDrawer->HLRAngle(); - aPreviousAngle = myDrawer->PreviousHLRDeviationAngle (); - return myDrawer->HasOwnHLRDeviationAngle(); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, AIS_InteractiveObject) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myshape) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBB) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myInitAng) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCompBB) } diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Shape.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Shape.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Shape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Shape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -92,23 +92,13 @@ //! Sets a local value for deviation coefficient for this specific shape. Standard_EXPORT Standard_Boolean SetOwnDeviationCoefficient(); - - //! Sets a local value for HLR deviation coefficient for this specific shape. - Standard_EXPORT Standard_Boolean SetOwnHLRDeviationCoefficient(); - + //! Sets a local value for deviation angle for this specific shape. Standard_EXPORT Standard_Boolean SetOwnDeviationAngle(); - //! Sets a local value for HLR deviation angle for this specific shape. - Standard_EXPORT Standard_Boolean SetOwnHLRDeviationAngle(); - //! Sets a local value for deviation coefficient for this specific shape. Standard_EXPORT void SetOwnDeviationCoefficient (const Standard_Real aCoefficient); - - //! sets myOwnHLRDeviationCoefficient field in Prs3d_Drawer & - //! recomputes presentation - Standard_EXPORT void SetOwnHLRDeviationCoefficient (const Standard_Real aCoefficient); - + //! this compute a new angle and Deviation from the value anAngle //! and set the values stored in myDrawer with these that become local to the shape Standard_EXPORT void SetAngleAndDeviation (const Standard_Real anAngle); @@ -119,36 +109,17 @@ //! sets myOwnDeviationAngle field in Prs3d_Drawer & recomputes presentation Standard_EXPORT void SetOwnDeviationAngle (const Standard_Real anAngle); - //! this compute a new Angle and Deviation from the value anAngle for HLR - //! and set the values stored in myDrawer for with these that become local to the shape - Standard_EXPORT void SetHLRAngleAndDeviation (const Standard_Real anAngle); - - //! sets myOwnHLRDeviationAngle field in Prs3d_Drawer & recomputes presentation - Standard_EXPORT void SetOwnHLRDeviationAngle (const Standard_Real anAngle); - //! Returns true and the values of the deviation //! coefficient aCoefficient and the previous deviation //! coefficient aPreviousCoefficient. If these values are //! not already set, false is returned. Standard_EXPORT Standard_Boolean OwnDeviationCoefficient (Standard_Real& aCoefficient, Standard_Real& aPreviousCoefficient) const; - //! Returns true and the values of the HLR deviation - //! coefficient aCoefficient and the previous HLR - //! deviation coefficient aPreviousCoefficient. If these - //! values are not already set, false is returned. - Standard_EXPORT Standard_Boolean OwnHLRDeviationCoefficient (Standard_Real& aCoefficient, Standard_Real& aPreviousCoefficient) const; - //! Returns true and the values of the deviation angle //! anAngle and the previous deviation angle aPreviousAngle. //! If these values are not already set, false is returned. Standard_EXPORT Standard_Boolean OwnDeviationAngle (Standard_Real& anAngle, Standard_Real& aPreviousAngle) const; - //! Returns true and the values of the HLR deviation - //! angle anAngle and of the previous HLR deviation - //! angle aPreviousAngle. If these values are not - //! already set, false is returned. - Standard_EXPORT Standard_Boolean OwnHLRDeviationAngle (Standard_Real& anAngle, Standard_Real& aPreviousAngle) const; - //! Sets the type of HLR algorithm used by the shape void SetTypeOfHLR (const Prs3d_TypeOfHLR theTypeOfHLR) { myDrawer->SetTypeOfHLR (theTypeOfHLR); } @@ -282,20 +253,21 @@ const Standard_Integer theMode) Standard_OVERRIDE; //! Compute projected presentation. - virtual void Compute (const Handle(Prs3d_Projector)& theProjector, - const Handle(Prs3d_Presentation)& thePrs) Standard_OVERRIDE + virtual void computeHLR (const Handle(Graphic3d_Camera)& theProjector, + const Handle(TopLoc_Datum3D)& theTrsf, + const Handle(Prs3d_Presentation)& thePrs) Standard_OVERRIDE { - computeHlrPresentation (theProjector, thePrs, myshape, myDrawer); - } - - //! Compute projected presentation with transformation. - virtual void Compute (const Handle(Prs3d_Projector)& theProjector, - const Handle(Geom_Transformation)& theTrsf, - const Handle(Prs3d_Presentation)& thePrs) Standard_OVERRIDE - { - const TopLoc_Location& aLoc = myshape.Location(); - const TopoDS_Shape aShape = myshape.Located (TopLoc_Location (theTrsf->Trsf()) * aLoc); - computeHlrPresentation (theProjector, thePrs, aShape, myDrawer); + if (!theTrsf.IsNull() + && theTrsf->Form() != gp_Identity) + { + const TopLoc_Location& aLoc = myshape.Location(); + const TopoDS_Shape aShape = myshape.Located (TopLoc_Location (theTrsf->Trsf()) * aLoc); + computeHlrPresentation (theProjector, thePrs, aShape, myDrawer); + } + else + { + computeHlrPresentation (theProjector, thePrs, myshape, myDrawer); + } } //! Compute selection. @@ -320,11 +292,14 @@ public: //! Compute HLR presentation for specified shape. - Standard_EXPORT static void computeHlrPresentation (const Handle(Prs3d_Projector)& theProjector, + Standard_EXPORT static void computeHlrPresentation (const Handle(Graphic3d_Camera)& theProjector, const Handle(Prs3d_Presentation)& thePrs, const TopoDS_Shape& theShape, const Handle(Prs3d_Drawer)& theDrawer); + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: TopoDS_Shape myshape; //!< shape to display diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_StandardDatum.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_StandardDatum.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_StandardDatum.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_StandardDatum.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _AIS_StandardDatum_HeaderFile -#define _AIS_StandardDatum_HeaderFile - -//! Declares the type of standard datum of an Interactive Object. -enum AIS_StandardDatum -{ -AIS_SD_None, -AIS_SD_Point, -AIS_SD_Axis, -AIS_SD_Trihedron, -AIS_SD_PlaneTrihedron, -AIS_SD_Line, -AIS_SD_Circle, -AIS_SD_Plane -}; - -#endif // _AIS_StandardDatum_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_SymmetricRelation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_SymmetricRelation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_SymmetricRelation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_SymmetricRelation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,644 +0,0 @@ -// Created on: 1997-03-03 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_SymmetricRelation,AIS_Relation) - -//======================================================================= -//function : AIS_SymmetricRelation -//purpose : -//======================================================================= -AIS_SymmetricRelation::AIS_SymmetricRelation(const TopoDS_Shape& aSymmTool, - const TopoDS_Shape& FirstShape, - const TopoDS_Shape& SecondShape, - const Handle(Geom_Plane)& aPlane) -:AIS_Relation(), - myTool(aSymmTool) -{ - SetFirstShape(FirstShape); - SetSecondShape(SecondShape); - SetPlane(aPlane); - myPosition = aPlane->Pln().Location(); -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_SymmetricRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aprs, - const Standard_Integer) -{ - switch (myFShape.ShapeType()) { - case TopAbs_FACE : - { - // cas symetrie entre deux faces - ComputeTwoFacesSymmetric(aprs); - } - break; - case TopAbs_EDGE : - { - // cas symetrie entre deux edges - ComputeTwoEdgesSymmetric(aprs); - } - break; - case TopAbs_VERTEX : - { - // cas symetrie entre deux vertexs - ComputeTwoVerticesSymmetric(aprs); - } - break; - default: - break; - } - if (myTool.ShapeType() == TopAbs_EDGE) { - Handle(Geom_Curve) aCurve,extcurve; - gp_Pnt p1,p2; - Standard_Boolean isinfinite,isonplane; - if (AIS::ComputeGeometry(TopoDS::Edge(myTool), - aCurve,p1,p2, - extcurve, - isinfinite, - isonplane, - myPlane)) { - if (!extcurve.IsNull()) { - gp_Pnt pf, pl; - if (!isinfinite) { - pf = p1; - pl = p2; - } - if (isinfinite) aprs->SetInfiniteState(Standard_True); - ComputeProjEdgePresentation(aprs,TopoDS::Edge(myTool),aCurve,pf,pl); - } - } - } -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning at compilation (SUN) -//======================================================================= -void AIS_SymmetricRelation::Compute(const Handle(Prs3d_Projector)& /*aProjector*/, - const Handle(Prs3d_Presentation)& /*aPresentation*/) -{ -// throw Standard_NotImplemented("AIS_SymmetricRelation::Compute(const Handle(Prs3d_Projector)&,const Handle(Prs3d_Presentation)&)"); -// PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -void AIS_SymmetricRelation::Compute(const Handle(Prs3d_Projector)&, - const Handle(Geom_Transformation)&, - const Handle(Prs3d_Presentation)&) -{ - throw Standard_NotImplemented("AIS_SymmetricRelation::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); -// PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_SymmetricRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSel, - const Standard_Integer) -{ - Handle(Select3D_SensitiveSegment) seg; - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - Standard_Real F,L; - - Handle(Geom_Curve) geom_axis, extcurve; - gp_Pnt p1,p2; - Standard_Boolean isinfinite,isonplane; - if (!AIS::ComputeGeometry(TopoDS::Edge(myTool), - geom_axis,p1,p2, - extcurve, - isinfinite, - isonplane, - myPlane)) return; - - Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); - gp_Lin laxis (geom_line->Lin()); - - if(myFShape.ShapeType() != TopAbs_VERTEX){ - BRepAdaptor_Curve cu1(TopoDS::Edge(myFShape)); - - if(cu1.GetType() == GeomAbs_Line) { -// gp_Lin L1 (myFAttach,myFDirAttach); - gp_Pnt PjAttachPnt1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - gp_Pnt PjOffSetPnt = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); - Standard_Real h = fabs(PjOffSetPnt.Distance(PjAttachPnt1)/cos(myAxisDirAttach.Angle(myFDirAttach))); - gp_Vec VL1(myFDirAttach); - gp_Vec VLa(PjAttachPnt1,PjOffSetPnt); - Standard_Real scal = VL1.Dot(VLa); - if(scal < 0) VL1.Reverse(); - VL1.Multiply(h); - gp_Pnt P1 = myFAttach.Translated(VL1); - gp_Pnt ProjAxis = ElCLib::Value(ElCLib::Parameter(laxis,P1),laxis); - gp_Vec v(P1,ProjAxis); - gp_Pnt P2 = ProjAxis.Translated(v); - - gp_Lin L3; - - if (!P1.IsEqual(P2,Precision::Confusion())) { - L3 = gce_MakeLin(P1,P2); - } - else { - L3 = gce_MakeLin(P1,myFDirAttach); - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle(Select3D_SensitiveBox) box = - new Select3D_SensitiveBox(own, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X()+size, - myPosition.Y()+size, - myPosition.Z()+size); - aSel->Add(box); - } - Standard_Real parmin,parmax,parcur; - parmin = ElCLib::Parameter(L3,P1); - parmax = parmin; - - parcur = ElCLib::Parameter(L3,P2); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - parcur = ElCLib::Parameter(L3,myPosition); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - gp_Pnt PointMin = ElCLib::Value(parmin,L3); - gp_Pnt PointMax = ElCLib::Value(parmax,L3); - - if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - PointMin, - PointMax); - aSel->Add(seg); - } - if (!myFAttach.IsEqual(P1,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - myFAttach, - P1); - aSel->Add(seg); - } - if (!mySAttach.IsEqual(P2,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - mySAttach, - P2); - aSel->Add(seg); - } - } - - //=======================Pour les arcs====================== - if(cu1.GetType() == GeomAbs_Circle) { - Handle(Geom_Curve) aGeomCurve = BRep_Tool::Curve(TopoDS::Edge(myFShape),F,L); - Handle(Geom_Circle) geom_circ1 = Handle(Geom_Circle)::DownCast (aGeomCurve) ; -// Handle(Geom_Circle) geom_circ1 = (const Handle(Geom_Circle)&) BRep_Tool::Curve(TopoDS::Edge(myFShape),F,L); - gp_Circ circ1(geom_circ1->Circ()); - gp_Pnt OffsetPnt(myPosition.X(),myPosition.Y(),myPosition.Z()); - gp_Pnt Center1 = circ1.Location(); - gp_Pnt ProjOffsetPoint = ElCLib::Value(ElCLib::Parameter(laxis,OffsetPnt),laxis); - gp_Pnt ProjCenter1 = ElCLib::Value(ElCLib::Parameter(laxis,Center1),laxis); - gp_Vec Vp(ProjCenter1,Center1); - if (Vp.Magnitude() <= Precision::Confusion()) Vp = gp_Vec(laxis.Direction())^myPlane->Pln().Position().Direction(); - Standard_Real Dt,R,h; - Dt = ProjCenter1.Distance(ProjOffsetPoint); - R = circ1.Radius(); - if (Dt > .999*R) { - Dt = .999*R; - gp_Vec Vout(ProjCenter1,ProjOffsetPoint); - ProjOffsetPoint = ProjCenter1.Translated(Vout.Divided(Vout.Magnitude()).Multiplied(Dt)); - OffsetPnt = ProjOffsetPoint; - } - h = Sqrt(R*R - Dt*Dt); - gp_Pnt P1 = ProjOffsetPoint.Translated(Vp.Added(Vp.Divided(Vp.Magnitude()).Multiplied(h))); - gp_Vec v(P1,ProjOffsetPoint); - gp_Pnt P2 = ProjOffsetPoint.Translated(v); - - gp_Lin L3; - if (!P1.IsEqual(P2,Precision::Confusion())) { - L3 = gce_MakeLin(P1,P2); - } - else { - L3 = gce_MakeLin(P1,laxis.Direction()); - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle(Select3D_SensitiveBox) box = - new Select3D_SensitiveBox(own, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X()+size, - myPosition.Y()+size, - myPosition.Z()+size); - aSel->Add(box); - } - Standard_Real parmin,parmax,parcur; - parmin = ElCLib::Parameter(L3,P1); - parmax = parmin; - - parcur = ElCLib::Parameter(L3,P2); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - parcur = ElCLib::Parameter(L3,myPosition); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - gp_Pnt PointMin = ElCLib::Value(parmin,L3); - gp_Pnt PointMax = ElCLib::Value(parmax,L3); - - if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own, - PointMin, - PointMax); - aSel->Add(seg); - } - } - } - //=======================Pour les points====================== - else { - if (myFAttach.IsEqual(mySAttach,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own,myPosition,myFAttach); - aSel->Add(seg); - } - else{ - gp_Pnt ProjOffsetPoint = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); - gp_Pnt ProjAttachmentPoint1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - gp_Vec PjAtt1_Att1(ProjAttachmentPoint1,myFAttach); - gp_Pnt P1 = ProjOffsetPoint.Translated(PjAtt1_Att1); - gp_Pnt P2 = ProjOffsetPoint.Translated(PjAtt1_Att1.Reversed()); - gp_Lin L3; - - if (!P1.IsEqual(P2,Precision::Confusion())) { - L3 = gce_MakeLin(P1,P2); - } - else { - L3 = gce_MakeLin(P1,myFDirAttach); - Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); - Handle(Select3D_SensitiveBox) box = - new Select3D_SensitiveBox(own, - myPosition.X(), - myPosition.Y(), - myPosition.Z(), - myPosition.X()+size, - myPosition.Y()+size, - myPosition.Z()+size); - aSel->Add(box); - } - Standard_Real parmin,parmax,parcur; - parmin = ElCLib::Parameter(L3,P1); - parmax = parmin; - - parcur = ElCLib::Parameter(L3,P2); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - parcur = ElCLib::Parameter(L3,myPosition); - parmin = Min(parmin,parcur); - parmax = Max(parmax,parcur); - - gp_Pnt PointMin = ElCLib::Value(parmin,L3); - gp_Pnt PointMax = ElCLib::Value(parmax,L3); - - if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own,PointMin,PointMax); - aSel->Add(seg); - } - if (!myFAttach.IsEqual(P1,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own,myFAttach,P1); - aSel->Add(seg); - } - if (!mySAttach.IsEqual(P2,Precision::Confusion())) { - seg = new Select3D_SensitiveSegment(own,mySAttach,P2); - aSel->Add(seg); - } - } - } -} - -//======================================================================= -//function : ComputeTwoFacesSymmetric -//purpose : -//======================================================================= -void AIS_SymmetricRelation::ComputeTwoFacesSymmetric(const Handle(Prs3d_Presentation)&) -{ -} - -//======================================================================= -//function : ComputeTwoEdgesSymmetric -//purpose : -//======================================================================= -void AIS_SymmetricRelation::ComputeTwoEdgesSymmetric(const Handle(Prs3d_Presentation)& aprs) -{ - BRepAdaptor_Curve cu1(TopoDS::Edge(myFShape)); - if (cu1.GetType() != GeomAbs_Line && cu1.GetType() != GeomAbs_Circle) return; - BRepAdaptor_Curve cu2(TopoDS::Edge(mySShape)); - if (cu2.GetType() != GeomAbs_Line && cu2.GetType() != GeomAbs_Circle) return; -// gp_Pnt pint3d,ptat11,ptat12,ptat21,ptat22; - gp_Pnt ptat11,ptat12,ptat21,ptat22; - Handle(Geom_Curve) geom1,geom2; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape), - TopoDS::Edge(mySShape), - myExtShape, - geom1, - geom2, - ptat11, - ptat12, - ptat21, - ptat22, - extCurv, - isInfinite1,isInfinite2, - myPlane)) { - return; - } - aprs->SetInfiniteState((isInfinite1 || isInfinite2) && (myExtShape !=0)); - Handle(Geom_Curve) geom_axis,extcurve; - gp_Pnt p1,p2; - Standard_Boolean isinfinite,isonplane; - if (!AIS::ComputeGeometry(TopoDS::Edge(myTool), - geom_axis,p1,p2, - extcurve, - isinfinite, - isonplane, - myPlane)) return; - - Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); - gp_Lin laxis (geom_line->Lin()); - myAxisDirAttach = laxis.Direction(); - - if(cu1.GetType() == GeomAbs_Line){ - Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); - gp_Lin l1(geom_lin1->Lin()); - myFDirAttach = l1.Direction(); - } - gp_Circ circ; - if(cu1.GetType() == GeomAbs_Circle){ - Handle(Geom_Circle) geom_cir1 (Handle(Geom_Circle)::DownCast (geom1)); - gp_Circ c(geom_cir1->Circ()); - circ = c; - } - - // recherche points attache - gp_Pnt ProjOffset = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); - -/*//---------------------------------------------------- - //Quand on fait la symetrie de 2 edges consecutifs: - // - // :<-- Axe - // : - // /:\ - // Edge n --->/ : \ - // / : \<-- Edge n+1 - // : - //---------------------------------------------------- -*/ - Standard_Boolean idem = Standard_False; - if (isInfinite1 && isInfinite2) { // geom1 et geom2 sont des lignes - const gp_Lin& line2 = Handle(Geom_Line)::DownCast (geom2)->Lin(); - if (myAutomaticPosition) { - myFAttach = Handle(Geom_Line)::DownCast (geom1)->Lin().Location(); - mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); - } - else { - const gp_Lin& line1 = Handle(Geom_Line)::DownCast (geom1)->Lin(); - myFAttach = ElCLib::Value(ElCLib::Parameter(line1,myPosition),line1); - mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); - } - } - else if (!isInfinite1 && !isInfinite2) { - if (ptat11.IsEqual(ptat21,Precision::Confusion())) { - myFAttach = ptat12; - mySAttach = ptat22; - idem = Standard_True; - } - if (ptat11.IsEqual(ptat22,Precision::Confusion())) { - myFAttach = ptat12; - mySAttach = ptat21; - idem = Standard_True; - } - if (ptat12.IsEqual(ptat21,Precision::Confusion())) { - myFAttach = ptat11; - mySAttach = ptat22; - idem = Standard_True; - } - if (ptat12.IsEqual(ptat22,Precision::Confusion())) { - myFAttach = ptat11; - mySAttach = ptat21; - idem = Standard_True; - } - if(!idem){ - if( ProjOffset.SquareDistance(ptat11) > ProjOffset.SquareDistance(ptat12)) myFAttach = ptat12; - else myFAttach = ptat11; - - if (ProjOffset.SquareDistance(ptat21) > ProjOffset.SquareDistance(ptat22)) mySAttach = ptat22; - else mySAttach = ptat21; - } - } - else if (isInfinite1) {// geom1 et geom2 sont des lignes - mySAttach = ptat21; - const gp_Lin& line1 = Handle(Geom_Line)::DownCast (geom1)->Lin(); - myFAttach = ElCLib::Value(ElCLib::Parameter(line1,mySAttach),line1); - } - else if (isInfinite2) {// geom1 et geom2 sont des lignes - myFAttach = ptat11; - const gp_Lin& line2 = Handle(Geom_Line)::DownCast (geom2)->Lin(); - mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); - } - - if( !myArrowSizeIsDefined ) - myArrowSize = myFAttach.Distance(mySAttach)/50.; - //---------------------------------------------------- - - //---------------------------------------------------- - // Si myFAttach <> mySAttach et PjFAttach = myFAttach - //---------------------------------------------------- - gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - - if (PjFAttach.IsEqual(myFAttach,Precision::Confusion())){ - Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); - gp_Lin l2(geom_lin2->Lin()); - myFDirAttach = l2.Direction(); - gp_Pnt PntTempo; - PntTempo = myFAttach; - myFAttach = mySAttach; - mySAttach = PntTempo; - PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - } - - //---------------------------------------------------- -// gp_Pnt curpos; - - if (myAutomaticPosition) { - //gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - // offset pour eviter confusion Edge et Dimension - gp_Vec offset(myAxisDirAttach); - offset = offset * myArrowSize * (-5); - gp_Vec Vt(myFAttach, PjFAttach); - gp_Pnt curpos = PjFAttach.Translated(offset.Added(Vt.Multiplied(.15))); - myPosition = curpos; - } - - gp_Pnt Pj1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - gp_Pnt Pj2 = ElCLib::Value(ElCLib::Parameter(laxis,mySAttach),laxis); - if ((myFAttach.SquareDistance(Pj1)+mySAttach.SquareDistance(Pj2)) <= Precision::Confusion()) myArrowSize = 0.; - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - if(cu1.GetType() == GeomAbs_Line) - DsgPrs_SymmetricPresentation::Add(aprs, - myDrawer, - myFAttach, - mySAttach, - myFDirAttach, - laxis, - myPosition); - - if(cu1.GetType() == GeomAbs_Circle) - DsgPrs_SymmetricPresentation::Add(aprs, - myDrawer, - myFAttach, - mySAttach, - circ, - laxis, - myPosition); - if ( (myExtShape != 0) && !extCurv.IsNull()) { - gp_Pnt pf, pl; - if ( myExtShape == 1 ) { - if (!isInfinite1) { - pf = ptat11; - pl = ptat12; - } - ComputeProjEdgePresentation(aprs,TopoDS::Edge(myFShape),geom1,pf,pl); - } - else { - if (!isInfinite2) { - pf = ptat21; - pl = ptat22; - } - ComputeProjEdgePresentation(aprs,TopoDS::Edge(mySShape),geom2,pf,pl); - } - } -} - -//======================================================================= -//function : ComputeTwoVertexsSymmetric -//purpose : -//======================================================================= -void AIS_SymmetricRelation::ComputeTwoVerticesSymmetric(const Handle(Prs3d_Presentation)& aprs) -{ - if(myFShape.ShapeType() != TopAbs_VERTEX || mySShape.ShapeType() != TopAbs_VERTEX) return; - Handle(Geom_Curve) geom_axis,extcurve; - gp_Pnt p1,p2; - Standard_Boolean isinfinite,isonplane; - if (!AIS::ComputeGeometry(TopoDS::Edge(myTool), - geom_axis,p1,p2, - extcurve, - isinfinite, - isonplane, - myPlane)) return; - - Standard_Boolean isOnPlane1, isOnPlane2; - - AIS::ComputeGeometry(TopoDS::Vertex(myFShape), myFAttach, myPlane, isOnPlane1); - AIS::ComputeGeometry(TopoDS::Vertex(mySShape), mySAttach, myPlane, isOnPlane2); - - if( !myArrowSizeIsDefined ) - myArrowSize = myFAttach.Distance(mySAttach)/50.; - - if (isOnPlane1 && isOnPlane2) - myExtShape = 0; - else if ( isOnPlane1 && !isOnPlane2) - myExtShape = 2; - else if (!isOnPlane1 && isOnPlane2) - myExtShape = 1; - else - return ; - - Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); - gp_Lin laxis (geom_line->Lin()); - myAxisDirAttach = laxis.Direction(); - - // recherche points attache -// gp_Pnt curpos; - if (myAutomaticPosition) { - gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); - // offset pour eviter confusion Edge et Dimension - gp_Vec offset(myAxisDirAttach); - offset = offset * myArrowSize * (-5); - gp_Vec Vt(myFAttach, PjFAttach); - gp_Pnt curpos = PjFAttach.Translated(offset.Added(Vt.Multiplied(.15))); - myPosition = curpos; - } - if (2*(myFAttach.Distance(mySAttach)) <= Precision::Confusion()) myArrowSize = 0.; - Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); - Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - arr = la->ArrowAspect(); - arr->SetLength(myArrowSize); - DsgPrs_SymmetricPresentation::Add(aprs, - myDrawer, - myFAttach, - mySAttach, - laxis, - myPosition); - if ( myExtShape == 1) - ComputeProjVertexPresentation(aprs,TopoDS::Vertex(myFShape),myFAttach); - else if ( myExtShape == 2) - ComputeProjVertexPresentation(aprs,TopoDS::Vertex(mySShape),mySAttach); -} - - - - - - diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_SymmetricRelation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_SymmetricRelation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_SymmetricRelation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_SymmetricRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1997-03-03 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,75 +14,9 @@ #ifndef _AIS_SymmetricRelation_HeaderFile #define _AIS_SymmetricRelation_HeaderFile -#include -#include -#include -#include +#include -DEFINE_STANDARD_HANDLE(AIS_SymmetricRelation, AIS_Relation) - -//! A framework to display constraints of symmetricity -//! between two or more datum Interactive Objects. -//! A plane serves as the axis of symmetry between the -//! shapes of which the datums are parts. -class AIS_SymmetricRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_SymmetricRelation, AIS_Relation) -public: - - //! Constructs an object to display constraints of symmetricity. - //! This object is defined by a tool aSymmTool, a first - //! shape FirstShape, a second shape SecondShape, and a plane aPlane. - //! aPlane serves as the axis of symmetry. - //! aSymmTool is the shape composed of FirstShape - //! SecondShape and aPlane. It may be queried and - //! edited using the functions GetTool and SetTool. - //! The two shapes are typically two edges, two vertices or two points. - Standard_EXPORT AIS_SymmetricRelation(const TopoDS_Shape& aSymmTool, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); - - //! Returns true if the symmetric constraint display is movable. - virtual Standard_Boolean IsMovable() const Standard_OVERRIDE; - - //! Sets the tool aSymmetricTool composed of a first - //! shape, a second shape, and a plane. - //! This tool is initially created at construction time. - void SetTool (const TopoDS_Shape& aSymmetricTool); - - //! Returns the tool composed of a first shape, a second - //! shape, and a plane. This tool is created at construction time. - const TopoDS_Shape& GetTool() const; - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoFacesSymmetric (const Handle(Prs3d_Presentation)& aprs); - - Standard_EXPORT void ComputeTwoEdgesSymmetric (const Handle(Prs3d_Presentation)& aprs); - - Standard_EXPORT void ComputeTwoVerticesSymmetric (const Handle(Prs3d_Presentation)& aprs); - - TopoDS_Shape myTool; - gp_Pnt myFAttach; - gp_Pnt mySAttach; - gp_Dir myFDirAttach; - gp_Dir myAxisDirAttach; - -}; - -#include +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_SymmetricRelation AIS_SymmetricRelation; #endif // _AIS_SymmetricRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_SymmetricRelation.lxx opencascade-7.5.1+dfsg1/src/AIS/AIS_SymmetricRelation.lxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_SymmetricRelation.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_SymmetricRelation.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -// Created on: 1997-03-03 -// Created by: Jean-Pierre COMBE -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : SetTool -//purpose : -//======================================================================= -inline void AIS_SymmetricRelation::SetTool(const TopoDS_Shape& aSymmetricTool) -{ - myTool = aSymmetricTool; -} - -//======================================================================= -//function : GetTool -//purpose : -//======================================================================= -inline const TopoDS_Shape& AIS_SymmetricRelation::GetTool() const -{ - return myTool; -} - - -//======================================================================= -//function : IsMovable -//purpose : -//======================================================================= -inline Standard_Boolean AIS_SymmetricRelation::IsMovable() const -{ - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_TangentRelation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_TangentRelation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_TangentRelation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_TangentRelation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,585 +0,0 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(AIS_TangentRelation,AIS_Relation) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -AIS_TangentRelation::AIS_TangentRelation(const TopoDS_Shape& aFShape, - const TopoDS_Shape& aSShape, - const Handle(Geom_Plane)& aPlane, - const Standard_Integer anExternRef) - :myExternRef(anExternRef) -{ - myFShape = aFShape; - mySShape = aSShape; - myPlane = aPlane; - myAutomaticPosition = Standard_False; -} - -//======================================================================= -//function : ExternRef -//purpose : -//======================================================================= -Standard_Integer AIS_TangentRelation::ExternRef() -{ - return myExternRef; -} - -//======================================================================= -//function : SetExternRef -//purpose : -//======================================================================= -void AIS_TangentRelation::SetExternRef(const Standard_Integer aRef) -{ - myExternRef = aRef; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_TangentRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, - const Handle(Prs3d_Presentation)& aPresentation, - const Standard_Integer) -{ - switch (myFShape.ShapeType()) - { - case TopAbs_FACE : - { - ComputeTwoFacesTangent(aPresentation); - } - break; - case TopAbs_EDGE : - { - ComputeTwoEdgesTangent(aPresentation); - } - break; - default: - break; - } -} - -//======================================================================= -//function : Compute -//purpose : to avoid warning -//======================================================================= -void AIS_TangentRelation::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_TangentRelation::Compute(const Handle(Prs3d_Projector)&,const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aPresentation ) ; -} - -void AIS_TangentRelation::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Geom_Transformation)& aTransformation, - const Handle(Prs3d_Presentation)& aPresentation) -{ -// throw Standard_NotImplemented("AIS_TangentRelation::Compute(const Handle(Prs3d_Projector)&, const Handle(Geom_Transformation)&, const Handle(Prs3d_Presentation)&)"); - PrsMgr_PresentableObject::Compute( aProjector , aTransformation , aPresentation ) ; -} - -//======================================================================= -//function : ComputeSelection -//purpose : -//======================================================================= -void AIS_TangentRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, - const Standard_Integer) -{ - gp_Vec vec(myDir); - gp_Vec vec1 = vec.Multiplied(myLength); - gp_Vec vec2 = vec.Multiplied(-myLength); - gp_Pnt p1 = myPosition.Translated(vec1); - gp_Pnt p2 = myPosition.Translated(vec2); - - Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); - Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,p1,p2); - aSelection->Add(seg); -} - -//======================================================================= -//function : ComputeTwoFacesTangent -//purpose : -//======================================================================= -void AIS_TangentRelation::ComputeTwoFacesTangent - (const Handle(Prs3d_Presentation)& /*aPresentation*/) -{ -} - -// jfa 19/10/2000 begin -//======================================================================= -//function : ComputeTangencyPoint -//purpose : -//======================================================================= -static Standard_Boolean ComputeTangencyPoint(const Handle(Geom_Curve)& GC1, - const Handle(Geom_Curve)& GC2, - gp_Pnt& aPoint) -{ - Standard_Real U1f = GC1->FirstParameter(); - Standard_Real U1l = GC1->LastParameter(); - Standard_Real U2f = GC2->FirstParameter(); - Standard_Real U2l = GC2->LastParameter(); - - gp_Pnt PC1; - Standard_Real mindist=0; - GeomAPI_ExtremaCurveCurve Ex(GC1,GC2,U1f,U1l,U2f,U2l); - for ( Standard_Integer i = 1; i <= Ex.NbExtrema(); i++) - { - gp_Pnt P1,P2; - Ex.Points(i,P1,P2); - Standard_Real dist = P1.Distance(P2); - if ( i == 1 ) - { - mindist = dist; - PC1 = P1; - } - else - { - if ( (dist < mindist) || (dist < Precision::Confusion()) ) - { - mindist = dist; - PC1 = P1; - } - } - if ( dist < Precision::Confusion() ) - { - if (GC1->IsInstance(STANDARD_TYPE(Geom_Line))) - { - continue; // tangent line and conic can have only one point with zero distance - } - gp_Vec aVector1,aVector2; - if (GC1->IsInstance(STANDARD_TYPE(Geom_Circle))) - { - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (GC1)); - Standard_Real par_inter = ElCLib::Parameter(circle->Circ(), P1); - ElCLib::D1(par_inter,circle->Circ(),P1,aVector1); - } - else if (GC1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (GC1)); - Standard_Real par_inter = ElCLib::Parameter(ellipse->Elips(), P1); - ElCLib::D1(par_inter,ellipse->Elips(),P1,aVector1); - } - if (GC2->IsInstance(STANDARD_TYPE(Geom_Circle))) - { - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (GC2)); - Standard_Real par_inter = ElCLib::Parameter(circle->Circ(), P2); - ElCLib::D1(par_inter,circle->Circ(),P2,aVector2); - } - else if (GC2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (GC2)); - Standard_Real par_inter = ElCLib::Parameter(ellipse->Elips(), P2); - ElCLib::D1(par_inter,ellipse->Elips(),P2,aVector2); - } -// if ( aVector1.IsParallel(aVector2, 100*Precision::Angular()) ) break; - if ( aVector1.IsParallel(aVector2, M_PI / 360.0) ) break; // 0.5 graduce - } - } - aPoint = PC1; - return Standard_True; -} -// jfa 19/10/2000 end - -//======================================================================= -//function : ComputeTwoEdgesTangent -//purpose : -//======================================================================= -void AIS_TangentRelation::ComputeTwoEdgesTangent(const Handle(Prs3d_Presentation)& aPresentation) -{ - Handle(Geom_Curve) copy1,copy2; - gp_Pnt ptat11,ptat12,ptat21,ptat22; - Standard_Boolean isInfinite1,isInfinite2; - Handle(Geom_Curve) extCurv; - if (!AIS::ComputeGeometry(TopoDS::Edge(myFShape), - TopoDS::Edge(mySShape), - myExtShape, - copy1, - copy2, - ptat11, - ptat12, - ptat21, - ptat22, - extCurv, - isInfinite1,isInfinite2, - myPlane)) - { - return; - } - - aPresentation->SetInfiniteState(isInfinite1 || isInfinite2); - // current face - BRepBuilderAPI_MakeFace makeface(myPlane->Pln()); - TopoDS_Face face(makeface.Face()); - BRepAdaptor_Surface adp(makeface.Face()); - - Standard_Integer typArg(0); - - if (copy1->IsInstance(STANDARD_TYPE(Geom_Line))) - { - typArg = 10; - } - else if (copy1->IsInstance(STANDARD_TYPE(Geom_Circle))) - { - typArg = 20; - } - else if (copy1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - typArg = 30; - } - else return; - - if (copy2->IsInstance(STANDARD_TYPE(Geom_Line))) - { - typArg += 1; - } - else if (copy2->IsInstance(STANDARD_TYPE(Geom_Circle))) - { - typArg += 2; - } - else if (copy2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) - { - typArg += 3; - } - else return; - - //First find the tangengy vector if exists - TopoDS_Vertex VCom; - TopExp_Explorer expF(TopoDS::Edge(myFShape),TopAbs_VERTEX); - TopExp_Explorer expS(TopoDS::Edge(mySShape),TopAbs_VERTEX); - TopoDS_Shape tab[2]; - Standard_Integer p ; - for (p = 0; expF.More(); expF.Next(),p++) - { - tab[p] = TopoDS::Vertex(expF.Current()); - } - Standard_Boolean found(Standard_False); - for ( ; expS.More() && !found; expS.Next()) - { - for ( Standard_Integer l = 0; l<=p && !found; l++) - { - found = ( expS.Current().IsSame(tab[l])); - if (found) VCom = TopoDS::Vertex(expS.Current()); - } - } - - gp_Vec theVector; - gp_Pnt pint3d; // tangency point - gp_Dir theDir; // tangency direction - Standard_Real par_inter = 0.0; // parameter of tangency point - - if (found) - { - pint3d = BRep_Tool::Pnt(VCom); - } - - // Otherwise it is found as if it was known that 2 curves - // are tangents (which must be the cases) - switch (typArg) - { - case 12: // circle line - { - Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy1)); - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy2)); - - if ( !found ) - { - // it is enough to project the circus center on the straight line - par_inter = ElCLib::Parameter(line->Lin(), circle->Location()); - pint3d = ElCLib::Value(par_inter, line->Lin()); - } - - theDir = line->Lin().Direction(); - myLength = circle->Radius()/5.; - if ( !isInfinite1 ) - { - Standard_Real copy1Length = ptat12.Distance(ptat11); - if ( copy1Length < myLength ) - myLength = copy1Length/3.; - } - } - break; - case 21: // circle line - { - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy1)); - Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy2)); - - if (!found) - { - // it is enough to project the circus center on the straight line - par_inter = ElCLib::Parameter(line->Lin(), circle->Location()); - pint3d = ElCLib::Value(par_inter, line->Lin()); - } - - theDir = line->Lin().Direction(); - myLength = circle->Radius()/5.; - if (!isInfinite2) - { - Standard_Real copy2Length = ptat21.Distance(ptat22); - if ( copy2Length < myLength ) - myLength = copy2Length/3.; - } - } - break; - // jfa 19/10/2000 begin - case 13: // line ellipse - { - Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy1)); - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy2)); - - if (!found) - { - ComputeTangencyPoint(line,ellipse,pint3d); - } - - theDir = line->Lin().Direction(); - myLength = ellipse->MajorRadius()/5.; - - if (!isInfinite1) - { - Standard_Real copy1Length = ptat12.Distance(ptat11); - if ( copy1Length < myLength ) - myLength = copy1Length/3.; - } - } - break; - case 31: // ellipse line - { - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy1)); - Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy2)); - - if (!found) - { - ComputeTangencyPoint(line,ellipse,pint3d); - } - - theDir = line->Lin().Direction(); - myLength = ellipse->MajorRadius()/5.; - - if (!isInfinite2) - { - Standard_Real copy2Length = ptat21.Distance(ptat22); - if ( copy2Length < myLength ) - myLength = copy2Length/3.; - } - } - break; - case 22: // circle circle - { - Handle(Geom_Circle) circle1 (Handle(Geom_Circle)::DownCast (copy1)); - Handle(Geom_Circle) circle2 (Handle(Geom_Circle)::DownCast (copy2)); - Standard_Real R1 = circle1->Radius(); - Standard_Real R2 = circle2->Radius(); - myLength = Max(R1,R2)/5.0; - if ( !found ) - { - if ( (circle1->Location()).IsEqual(circle2->Location(),Precision::Confusion()) ) - { - if ( R1 >= R2 ) - { - ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); - } - else - { - ElCLib::D1(par_inter,circle2->Circ(),pint3d,theVector); - } - } - else - { - if ( R1 >= R2 ) - { - par_inter = ElCLib::Parameter(circle1->Circ(), circle2->Location()); - ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); - } - else - { - par_inter = ElCLib::Parameter(circle2->Circ(), circle1->Location()); - ElCLib::D1(par_inter,circle2->Circ(),pint3d,theVector); - } - } - } - else - { - par_inter = ElCLib::Parameter(circle1->Circ(), pint3d); - ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); - } - theDir = gp_Dir(theVector); - } - break; - case 23: // circle ellipse - { - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy1)); - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy2)); - Standard_Real R1 = circle->Radius(); - Standard_Real R2 = ellipse->MajorRadius(); - myLength = Max(R1,R2)/5.0; - if (!found) - { - if ( R1 >= R2 ) - { - ComputeTangencyPoint(circle,ellipse,pint3d); - par_inter = ElCLib::Parameter(circle->Circ(), pint3d); - ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); - } - else - { - ComputeTangencyPoint(ellipse,circle,pint3d); - par_inter = ElCLib::Parameter(ellipse->Elips(), pint3d); - ElCLib::D1(par_inter,ellipse->Elips(),pint3d,theVector); - } - } - else - { - par_inter = ElCLib::Parameter(circle->Circ(), pint3d); - ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); - } - theDir = gp_Dir(theVector); - } - break; - case 32: // ellipse circle - { - Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy1)); - Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy2)); - Standard_Real R1 = ellipse->MajorRadius(); - Standard_Real R2 = circle->Radius(); - myLength = Max(R1,R2)/5.0; - if (!found) - { - if ( R1 >= R2 ) - { - ComputeTangencyPoint(ellipse,circle,pint3d); - par_inter = ElCLib::Parameter( ellipse->Elips(), pint3d); - ElCLib::D1(par_inter,ellipse->Elips(),pint3d,theVector); - } - else - { - ComputeTangencyPoint(circle,ellipse,pint3d); - par_inter = ElCLib::Parameter( circle->Circ(), pint3d); - ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); - } - } - else - { - par_inter = ElCLib::Parameter(circle->Circ(), pint3d); - ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); - } - theDir = gp_Dir(theVector); - } - break; - case 33: // ellipse ellipse - { - Handle(Geom_Ellipse) ellipse1 (Handle(Geom_Ellipse)::DownCast (copy1)); - Handle(Geom_Ellipse) ellipse2 (Handle(Geom_Ellipse)::DownCast (copy2)); - Standard_Real R1 = ellipse1->MajorRadius(); - Standard_Real R2 = ellipse2->MajorRadius(); - myLength = Max(R1,R2)/5.0; - if (!found) - { - if ( R1 > R2 ) - { - ComputeTangencyPoint(ellipse1,ellipse2,pint3d); - par_inter = ElCLib::Parameter( ellipse1->Elips(), pint3d); - ElCLib::D1(par_inter,ellipse1->Elips(),pint3d,theVector); - } - else - { - ComputeTangencyPoint(ellipse2,ellipse1,pint3d); - par_inter = ElCLib::Parameter( ellipse2->Elips(), pint3d); - ElCLib::D1(par_inter,ellipse2->Elips(),pint3d,theVector); - } - } - else - { - par_inter = ElCLib::Parameter(ellipse1->Elips(), pint3d); - ElCLib::D1(par_inter,ellipse1->Elips(),pint3d,theVector); - } - theDir = gp_Dir(theVector); - } - break; - // jfa 19/10/2000 end - default: - return; - } - - myAttach = pint3d; - myDir = theDir; - myPosition = pint3d; - myLength = Min(myLength,myArrowSize); - - DsgPrs_TangentPresentation::Add(aPresentation,myDrawer,myAttach,myDir,myLength); - if ( (myExtShape != 0) && !extCurv.IsNull()) - { - gp_Pnt pf, pl; - if ( myExtShape == 1 ) - { - if (!isInfinite1) - { - pf = ptat11; - pl = ptat12; - } - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),copy1,pf,pl); - } - else - { - if (!isInfinite2) - { - pf = ptat21; - pl = ptat22; - } - ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),copy2,pf,pl); - } - } -} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_TangentRelation.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_TangentRelation.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_TangentRelation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_TangentRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1996-12-05 -// Created by: Jean-Pierre COMBE/Odile Olivier -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,68 +14,9 @@ #ifndef _AIS_TangentRelation_HeaderFile #define _AIS_TangentRelation_HeaderFile -#include +#include -DEFINE_STANDARD_HANDLE(AIS_TangentRelation, AIS_Relation) - -//! A framework to display tangency constraints between -//! two or more Interactive Objects of the datum type. -//! The datums are normally faces or edges. -class AIS_TangentRelation : public AIS_Relation -{ - DEFINE_STANDARD_RTTIEXT(AIS_TangentRelation, AIS_Relation) -public: - - //! TwoFacesTangent or TwoEdgesTangent relation - //! Constructs an object to display tangency constraints. - //! This object is defined by the first shape aFShape, the - //! second shape aSShape, the plane aPlane and the index anExternRef. - //! aPlane serves as an optional axis. - //! anExternRef set to 0 indicates that there is no relation. - Standard_EXPORT AIS_TangentRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane, const Standard_Integer anExternRef = 0); - - //! Returns the external reference for tangency. - //! The values are as follows: - //! - 0 - there is no connection; - //! - 1 - there is a connection to the first shape; - //! - 2 - there is a connection to the second shape. - //! This reference is defined at construction time. - Standard_EXPORT Standard_Integer ExternRef(); - - //! Sets the external reference for tangency, aRef. - //! The values are as follows: - //! - 0 - there is no connection; - //! - 1 - there is a connection to the first shape; - //! - 2 - there is a connection to the second shape. - //! This reference is initially defined at construction time. - Standard_EXPORT void SetExternRef (const Standard_Integer aRef); - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - -private: - - Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; - - Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; - - Standard_EXPORT void ComputeTwoFacesTangent (const Handle(Prs3d_Presentation)& aPresentation); - - Standard_EXPORT void ComputeTwoEdgesTangent (const Handle(Prs3d_Presentation)& aPresentation); - - gp_Pnt myAttach; - gp_Dir myDir; - Standard_Real myLength; - Standard_Integer myExternRef; - -}; +Standard_DEPRECATED("Deprecated alias to moved class") +typedef PrsDim_TangentRelation AIS_TangentRelation; #endif // _AIS_TangentRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_TextLabel.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_TextLabel.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_TextLabel.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_TextLabel.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,10 +20,12 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -37,15 +39,13 @@ //purpose : //======================================================================= AIS_TextLabel::AIS_TextLabel() -: myText ("?"), - myFont ("Courier"), - myFontAspect (Font_FA_Regular), - myHasOrientation3D (Standard_False), - myHasFlipping (Standard_False) +: myText ("?"), + myHasOrientation3D (Standard_False), + myHasOwnAnchorPoint (Standard_True), + myHasFlipping (Standard_False) { myDrawer->SetTextAspect (new Prs3d_TextAspect()); - - SetDisplayMode (0); + myDrawer->SetDisplayMode (0); } //======================================================================= @@ -156,8 +156,7 @@ //======================================================================= void AIS_TextLabel::SetFont (Standard_CString theFont) { - myFont = theFont; - myDrawer->TextAspect()->SetFont (myFont.ToCString()); + myDrawer->TextAspect()->SetFont (theFont); } //======================================================================= @@ -189,6 +188,24 @@ } //======================================================================= +//function : FontName +//purpose : +//======================================================================= +const TCollection_AsciiString& AIS_TextLabel::FontName() const +{ + return myDrawer->TextAspect()->Aspect()->Font(); +} + +//======================================================================= +//function : FontAspect +//purpose : +//======================================================================= +Font_FontAspect AIS_TextLabel::FontAspect() const +{ + return myDrawer->TextAspect()->Aspect()->GetTextFontAspect(); +} + +//======================================================================= //function : Orientation3D //purpose : //======================================================================= @@ -257,66 +274,68 @@ Handle(Prs3d_TextAspect) anAsp = myDrawer->TextAspect(); gp_Pnt aPosition = Position(); + const Standard_Boolean isTextZoomable = anAsp->Aspect()->GetTextZoomable(); + if (myHasOrientation3D) + { + anAsp->Aspect()->SetTextZoomable (myHasFlipping ? Standard_True : Standard_False); + SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_ZoomPers, aPosition)); + aPosition = gp::Origin(); + } + else if (isTextZoomable + || TransformPersistence().IsNull() + || TransformPersistence()->Mode() != Graphic3d_TMF_2d) + { + Handle(Graphic3d_TransformPers) aTrsfPers = + new Graphic3d_TransformPers (isTextZoomable ? Graphic3d_TMF_RotatePers : Graphic3d_TMF_ZoomRotatePers, aPosition); + SetTransformPersistence (aTrsfPers); + aPosition = gp::Origin(); + } + + gp_Pnt aCenterOfLabel; + Standard_Real aWidth, aHeight; + + Standard_Boolean isInit = calculateLabelParams (aPosition, aCenterOfLabel, aWidth, aHeight); if (myHasOrientation3D) { - Standard_Boolean isInit = Standard_False; if (myHasFlipping) { - // Get width and height of text - Font_FTFontParams aFontParams; - aFontParams.PointSize = (unsigned int )anAsp->Height(); - aFontParams.Resolution = GetContext()->CurrentViewer()->DefaultRenderingParams().Resolution; - if (Handle(Font_FTFont) aFont = Font_FTFont::FindAndCreate (anAsp->Aspect()->Font(), anAsp->Aspect()->GetTextFontAspect(), aFontParams)) - { - isInit = Standard_True; - const NCollection_String aText (myText.ToExtString()); - Font_Rect aBndBox = aFont->BoundingBox (aText, anAsp->HorizontalJustification(), anAsp->VerticalJustification()); - Standard_Real aWidth = Abs (aBndBox.Width()); - Standard_Real aHeight = Abs (aBndBox.Height()); - gp_Pnt aCenterOfLabel = aPosition; - - if (anAsp->VerticalJustification() == Graphic3d_VTA_BOTTOM) - { - aCenterOfLabel.ChangeCoord() += myOrientation3D.YDirection().XYZ() * aHeight * 0.5; - } - else if (anAsp->VerticalJustification() == Graphic3d_VTA_TOP) - { - aCenterOfLabel.ChangeCoord() -= myOrientation3D.YDirection().XYZ() * aHeight * 0.5; - } - if (anAsp->HorizontalJustification() == Graphic3d_HTA_LEFT) - { - aCenterOfLabel.ChangeCoord() += myOrientation3D.XDirection().XYZ() * aWidth * 0.5; - } - else if (anAsp->HorizontalJustification() == Graphic3d_HTA_RIGHT) - { - aCenterOfLabel.ChangeCoord() -= myOrientation3D.XDirection().XYZ() * aWidth * 0.5; - } - - if (!anAsp->Aspect()->GetTextZoomable() - && (TransformPersistence().IsNull() - || TransformPersistence()->Mode() == Graphic3d_TMF_ZoomPers)) - { - anAsp->Aspect()->SetTextZoomable (Standard_True); - SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_ZoomPers, aPosition)); - aPosition = gp::Origin(); - } - - gp_Ax2 aFlippingAxes (aCenterOfLabel, myOrientation3D.Direction(), myOrientation3D.XDirection()); - Prs3d_Root::CurrentGroup (thePrs)->SetFlippingOptions (Standard_True, aFlippingAxes); - } + gp_Ax2 aFlippingAxes (aCenterOfLabel, myOrientation3D.Direction(), myOrientation3D.XDirection()); + thePrs->CurrentGroup()->SetFlippingOptions (Standard_True, aFlippingAxes); } - gp_Ax2 anOrientation = myOrientation3D; anOrientation.SetLocation (aPosition); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (thePrs), anAsp, myText, myOrientation3D, !myHasFlipping); + Standard_Boolean aHasOwnAnchor = HasOwnAnchorPoint(); + if (myHasFlipping) + { + aHasOwnAnchor = Standard_False; // always not using own anchor if flipping + } + Handle(Graphic3d_Text) aText = + Prs3d_Text::Draw (thePrs->CurrentGroup(), anAsp, myText, anOrientation, aHasOwnAnchor); + aText->SetTextFormatter (myFormatter); if (myHasFlipping && isInit) { - Prs3d_Root::CurrentGroup (thePrs)->SetFlippingOptions (Standard_False, gp_Ax2()); + thePrs->CurrentGroup()->SetFlippingOptions (Standard_False, gp_Ax2()); } } else { - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (thePrs), anAsp, myText, Position()); + Handle(Graphic3d_Text) aText = + Prs3d_Text::Draw (thePrs->CurrentGroup(), anAsp, myText, aPosition); + aText->SetTextFormatter (myFormatter); + } + + if (isInit) + { + const Standard_Real aDx = aWidth * 0.5; + const Standard_Real aDy = aHeight * 0.5; + gp_Trsf aLabelPlane = calculateLabelTrsf (aPosition, aCenterOfLabel); + + gp_Pnt aMinPnt = gp_Pnt (-aDx, -aDy, 0.0).Transformed (aLabelPlane); + gp_Pnt aMaxPnt = gp_Pnt ( aDx, aDy, 0.0).Transformed (aLabelPlane); + + Graphic3d_BndBox4f& aBox = thePrs->CurrentGroup()->ChangeBoundingBox(); + aBox.Add (Graphic3d_Vec4 ((float) aMinPnt.X(), (float) aMinPnt.Y(), (float) aMinPnt.Z(), 1.0)); + aBox.Add (Graphic3d_Vec4 ((float) aMaxPnt.X(), (float) aMaxPnt.Y(), (float) aMaxPnt.Z(), 1.0)); } break; @@ -335,10 +354,110 @@ { case 0: { - Handle(SelectMgr_EntityOwner) anEntityOwner = new SelectMgr_EntityOwner (this, 10); - Handle(Select3D_SensitivePoint) aSensitivePoint = new Select3D_SensitivePoint (anEntityOwner, Position()); - theSelection->Add (aSensitivePoint); + Handle(SelectMgr_EntityOwner) anEntityOwner = new SelectMgr_EntityOwner (this, 10); + + gp_Pnt aPosition = Position(); + if (!TransformPersistence().IsNull() && TransformPersistence()->Mode() != Graphic3d_TMF_2d) + { + aPosition = gp::Origin(); + } + + gp_Pnt aCenterOfLabel; + Standard_Real aWidth, aHeight; + + if (!calculateLabelParams (aPosition, aCenterOfLabel, aWidth, aHeight)) + { + Handle(Select3D_SensitivePoint) aTextSensitive = new Select3D_SensitivePoint (anEntityOwner, aPosition); + theSelection->Add (aTextSensitive); + break; + } + + const Standard_Real aDx = aWidth * 0.5; + const Standard_Real aDy = aHeight * 0.5; + gp_Trsf aLabelPlane = calculateLabelTrsf (aPosition, aCenterOfLabel); + + // sensitive planar rectangle for text + TColgp_Array1OfPnt aRectanglePoints (1, 5); + aRectanglePoints.ChangeValue (1) = gp_Pnt (-aDx, -aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue (2) = gp_Pnt (-aDx, aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue (3) = gp_Pnt ( aDx, aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue (4) = gp_Pnt ( aDx, -aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue (5) = aRectanglePoints.Value (1); + + Handle(Select3D_SensitiveFace) aTextSensitive = + new Select3D_SensitiveFace (anEntityOwner, aRectanglePoints, Select3D_TOS_INTERIOR); + theSelection->Add (aTextSensitive); + break; } } } + +//======================================================================= +//function : calculateLabelParams +//purpose : +//======================================================================= +Standard_Boolean AIS_TextLabel::calculateLabelParams (const gp_Pnt& thePosition, + gp_Pnt& theCenterOfLabel, + Standard_Real& theWidth, + Standard_Real& theHeight) const +{ + // Get width and height of text + Handle(Prs3d_TextAspect) anAsp = myDrawer->TextAspect(); + Font_FTFontParams aFontParams; + aFontParams.PointSize = (unsigned int) anAsp->Height(); + aFontParams.Resolution = GetContext()->CurrentViewer()->DefaultRenderingParams().Resolution; + + Handle(Font_FTFont) aFont = Font_FTFont::FindAndCreate (anAsp->Aspect()->Font(), + anAsp->Aspect()->GetTextFontAspect(), + aFontParams); + if (aFont.IsNull()) + { + return Standard_False; + } + + const NCollection_String aText (myText.ToExtString()); + Font_Rect aBndBox = aFont->BoundingBox (aText, anAsp->HorizontalJustification(), anAsp->VerticalJustification()); + theWidth = Abs (aBndBox.Width()); + theHeight = Abs (aBndBox.Height()); + + theCenterOfLabel = thePosition; + if (anAsp->VerticalJustification() == Graphic3d_VTA_BOTTOM) + { + theCenterOfLabel.ChangeCoord() += myOrientation3D.YDirection().XYZ() * theHeight * 0.5; + } + else if (anAsp->VerticalJustification() == Graphic3d_VTA_TOP) + { + theCenterOfLabel.ChangeCoord() -= myOrientation3D.YDirection().XYZ() * theHeight * 0.5; + } + if (anAsp->HorizontalJustification() == Graphic3d_HTA_LEFT) + { + theCenterOfLabel.ChangeCoord() += myOrientation3D.XDirection().XYZ() * theWidth * 0.5; + } + else if (anAsp->HorizontalJustification() == Graphic3d_HTA_RIGHT) + { + theCenterOfLabel.ChangeCoord() -= myOrientation3D.XDirection().XYZ() * theWidth * 0.5; + } + + return Standard_True; +} + +//======================================================================= +//function : calculateLabelTrsf +//purpose : +//======================================================================= +gp_Trsf AIS_TextLabel::calculateLabelTrsf (const gp_Pnt& thePosition, gp_Pnt& theCenterOfLabel) const +{ + const Standard_Real anAngle = myDrawer->TextAspect()->Aspect()->TextAngle() * M_PI / 180.0; + const gp_Ax1 aRotAxis (thePosition, gp_Dir (0.0, 0.0, 1.0)); + + gp_Ax2 anOrientation = myOrientation3D; + anOrientation.Rotate (aRotAxis, anAngle); + theCenterOfLabel.Rotate (aRotAxis, anAngle); + + gp_Trsf aLabelPlane; + aLabelPlane.SetTransformation (anOrientation, gp::XOY()); + aLabelPlane.SetTranslationPart (theCenterOfLabel.XYZ()); + + return aLabelPlane; +} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_TextLabel.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_TextLabel.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_TextLabel.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_TextLabel.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ #include #include +class Font_TextFormatter; + //! Presentation of the text. class AIS_TextLabel : public AIS_InteractiveObject { @@ -32,6 +34,9 @@ //! Default constructor Standard_EXPORT AIS_TextLabel(); + //! Return TRUE for supported display mode. + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; } + //! Setup color of entire text. Standard_EXPORT virtual void SetColor (const Quantity_Color& theColor) Standard_OVERRIDE; @@ -80,6 +85,15 @@ //! Returns position. Standard_EXPORT const gp_Pnt& Position() const; + //! Returns the label text. + const TCollection_ExtendedString& Text() const { return myText; } + + //! Returns the font of the label text. + Standard_EXPORT const TCollection_AsciiString& FontName() const; + + //! Returns the font aspect of the label text. + Standard_EXPORT Font_FontAspect FontAspect() const; + //! Returns label orientation in the model 3D space. Standard_EXPORT const gp_Ax2& Orientation3D() const; @@ -90,6 +104,12 @@ Standard_EXPORT Standard_Boolean HasFlipping() const; + //! Returns flag if text uses position as point of attach + Standard_Boolean HasOwnAnchorPoint() const { return myHasOwnAnchorPoint; } + + //! Set flag if text uses position as point of attach + void SetOwnAnchorPoint (const Standard_Boolean theOwnAnchorPoint) { myHasOwnAnchorPoint = theOwnAnchorPoint; } + //! Define the display type of the text. //! //! TODT_NORMAL Default display. Text only. @@ -103,7 +123,13 @@ //! and the colour of backgroubd for the TODT_DEKALE TextDisplayType. Standard_EXPORT void SetColorSubTitle (const Quantity_Color& theColor); -private: + //! Returns text presentation formatter; NULL by default, which means standard text formatter will be used. + const Handle(Font_TextFormatter)& TextFormatter() const { return myFormatter; } + + //! Setup text formatter for presentation. It's empty by default. + void SetTextFormatter (const Handle(Font_TextFormatter)& theFormatter) { myFormatter = theFormatter; } + +protected: //! Compute Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, @@ -114,13 +140,24 @@ Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, const Standard_Integer theMode) Standard_OVERRIDE; + //! Calculate label center, width and height + Standard_EXPORT Standard_Boolean calculateLabelParams (const gp_Pnt& thePosition, + gp_Pnt& theCenterOfLabel, + Standard_Real& theWidth, + Standard_Real& theHeight) const; + + //! Calculate label transformation + Standard_EXPORT gp_Trsf calculateLabelTrsf (const gp_Pnt& thePosition, + gp_Pnt& theCenterOfLabel) const; + protected: + Handle(Font_TextFormatter) myFormatter; + TCollection_ExtendedString myText; - TCollection_AsciiString myFont; - Font_FontAspect myFontAspect; gp_Ax2 myOrientation3D; Standard_Boolean myHasOrientation3D; + Standard_Boolean myHasOwnAnchorPoint; Standard_Boolean myHasFlipping; public: diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_TexturedShape.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_TexturedShape.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_TexturedShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_TexturedShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,12 +28,11 @@ #include #include #include -#include #include #include #include #include -#include +#include #include #include #include @@ -76,8 +75,8 @@ } else { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: texture with ID ") + theTextureFileName - + " is undefined! Texture 0 will be used instead.", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: texture with ID ") + theTextureFileName + + " is undefined. Texture 0 will be used instead."); myPredefTexture = Graphic3d_NameOfTexture2D (0); } myTextureFile = ""; @@ -311,7 +310,7 @@ } else { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: texture can not be loaded ") + aTextureDesc, Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: texture can not be loaded ") + aTextureDesc); } } @@ -433,7 +432,7 @@ } else { - StdPrs_BndBox::Add (thePrs, BoundingBox(), myDrawer); + Prs3d_BndBox::Add (thePrs, BoundingBox(), myDrawer); } break; } diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Triangulation.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Triangulation.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Triangulation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Triangulation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -11,14 +11,14 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -#include #include + +#include #include #include #include #include #include -#include #include #include #include @@ -131,7 +131,7 @@ Handle(Graphic3d_ArrayOfTriangles) anArray = new Graphic3d_ArrayOfTriangles (myNbNodes, myNbTriangles * 3, hasVNormals, hasVColors, Standard_False); - Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation); + Handle(Graphic3d_Group) TheGroup = aPresentation->CurrentGroup(); Handle(Graphic3d_AspectFillArea3d) aspect = myDrawer->ShadingAspect()->Aspect(); Standard_Integer i; diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Trihedron.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Trihedron.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Trihedron.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Trihedron.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -34,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -201,17 +199,6 @@ } //======================================================================= -//function : Compute -//purpose : -//======================================================================= -void AIS_Trihedron::Compute (const Handle(Prs3d_Projector)& theProjector, - const Handle(Geom_Transformation)& theTrsf, - const Handle(Prs3d_Presentation)& thePrs) -{ - PrsMgr_PresentableObject::Compute (theProjector, theTrsf, thePrs); -} - -//======================================================================= //function : ComputeSelection //purpose : //======================================================================= @@ -311,7 +298,7 @@ aPresentation->Clear(); const Prs3d_DatumParts aPart = anOwner->DatumPart(); - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (aPresentation); + Handle(Graphic3d_Group) aGroup = aPresentation->CurrentGroup(); if (aPart >= Prs3d_DP_XOYAxis && aPart <= Prs3d_DP_XOZAxis) { // planes selection is equal in both shading and wireframe mode @@ -456,7 +443,7 @@ // display origin { // Origin is visualized only in shading mode - Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePrs); + Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); const Prs3d_DatumParts aPart = Prs3d_DP_Origin; if (anAspect->DrawDatumPart(aPart)) { @@ -483,7 +470,7 @@ continue; } - Handle(Graphic3d_Group) anAxisGroup = Prs3d_Root::NewGroup (thePrs); + Handle(Graphic3d_Group) anAxisGroup = thePrs->NewGroup(); myPartToGroup.Bind (aPart, anAxisGroup); if (isShadingMode) { @@ -502,7 +489,7 @@ continue; } - Handle(Graphic3d_Group) anArrowGroup = Prs3d_Root::NewGroup (thePrs); + Handle(Graphic3d_Group) anArrowGroup = thePrs->NewGroup(); anArrowGroup->SetGroupPrimitivesAspect (anAspect->ArrowAspect()->Aspect()); anArrowGroup->AddPrimitiveArray (arrayOfPrimitives (anArrowPart)); } @@ -531,7 +518,7 @@ case Prs3d_DP_ZAxis: aDir = aComponent->Direction(); break; default: break; } - Handle(Graphic3d_Group) aLabelGroup = Prs3d_Root::NewGroup (thePrs); + Handle(Graphic3d_Group) aLabelGroup = thePrs->NewGroup(); const gp_Pnt aPoint = anOrigin.XYZ() + aDir.XYZ() * anAxisLength; Prs3d_Text::Draw (aLabelGroup, anAspect->TextAspect(), aLabel, aPoint); } @@ -546,7 +533,7 @@ continue; } - Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePrs); + Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); myPartToGroup.Bind (aPart, aGroup); aGroup->AddPrimitiveArray (arrayOfPrimitives (aPart)); @@ -926,3 +913,20 @@ myPrimitives.Bind(aPart, aPrims); } } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void AIS_Trihedron::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, AIS_InteractiveObject) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnSize) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnTextColor) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnArrowColor) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDatumAspect) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTrihDispMode) +} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_Trihedron.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_Trihedron.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_Trihedron.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_Trihedron.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,11 +33,6 @@ #include class Geom_Axis2Placement; -class AIS_Axis; -class AIS_Point; -class AIS_Plane; -class Geom_Transformation; -class gp_Trsf; //! Create a selectable trihedron //! The trihedron includes 1 origin, 3 axes and 3 labels. @@ -207,18 +202,13 @@ const Handle(Prs3d_Presentation)& thePrs, const Standard_Integer theMode) Standard_OVERRIDE; - //! This compute is unavailable for trihedron presentation. - void Compute (const Handle(Prs3d_Projector)& , const Handle(Prs3d_Presentation)& ) Standard_OVERRIDE {} - - //! This compute is unavailable for trihedron presentation. - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& theProjector, - const Handle(Geom_Transformation)& theTrsf, - const Handle(Prs3d_Presentation)& thePrs) Standard_OVERRIDE; - //! Compute selection. Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, const Standard_Integer theMode) Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: //! Creates a sensitive entity for the datum part that will be used in selection owner creation. diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_TypeOfAngleArrowVisibility.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_TypeOfAngleArrowVisibility.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_TypeOfAngleArrowVisibility.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_TypeOfAngleArrowVisibility.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _AIS_TypeOfAngleArrowVisibility_HeaderFile -#define _AIS_TypeOfAngleArrowVisibility_HeaderFile - -//! Declares what arrows are visible on angle presentation -enum AIS_TypeOfAngleArrowVisibility -{ -AIS_TOAV_Both, //!< both arrows of the first and the second angle tips -AIS_TOAV_First, //!< only first point arrow -AIS_TOAV_Second, //!< only second point arrow -AIS_TOAV_None //!< arrows are not visible -}; - -#endif // _AIS_TypeOfAngleArrowVisibility_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_TypeOfAngle.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_TypeOfAngle.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_TypeOfAngle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_TypeOfAngle.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _AIS_TypeOfAngle_HeaderFile -#define _AIS_TypeOfAngle_HeaderFile - -//! Declares the type of angle. -enum AIS_TypeOfAngle -{ -AIS_TOA_Interior, //!< the angle between two lines built on geometry parameters -AIS_TOA_Exterior //!< the angle equal 2 PI minus the interior angle -}; - -#endif // _AIS_TypeOfAngle_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_TypeOfDist.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_TypeOfDist.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_TypeOfDist.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_TypeOfDist.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -// Created on: 1996-12-11 -// Created by: Robert COUBLANC -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _AIS_TypeOfDist_HeaderFile -#define _AIS_TypeOfDist_HeaderFile - -//! To declare the type of distance. -enum AIS_TypeOfDist -{ -AIS_TOD_Unknown, -AIS_TOD_Horizontal, -AIS_TOD_Vertical -}; - -#endif // _AIS_TypeOfDist_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ViewController.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ViewController.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ViewController.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ViewController.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,15 +15,19 @@ #include #include -#include #include #include +#include +#include #include #include +#include +#include #include #include #include #include +#include // ======================================================================= // function : AIS_ViewController @@ -60,6 +64,17 @@ myPrevMoveTo (-1, -1), myHasHlrOnBeforeRotation (false), // + myXRPrsDevices (0, 0), + myXRLaserTeleColor (Quantity_NOC_GREEN), + myXRLaserPickColor (Quantity_NOC_BLUE), + myXRLastTeleportHand(Aspect_XRTrackedDeviceRole_Other), + myXRLastPickingHand (Aspect_XRTrackedDeviceRole_Other), + myXRLastPickDepthLeft (Precision::Infinite()), + myXRLastPickDepthRight(Precision::Infinite()), + myXRTurnAngle (M_PI_4), + myToDisplayXRAuxDevices (false), + myToDisplayXRHands (true), + // myMouseClickThreshold (3.0), myMouseDoubleClickInt (0.4), myScrollZoomRatio (15.0f), @@ -69,6 +84,7 @@ myMousePressed (Aspect_VKeyMouse_NONE), myMouseModifiers (Aspect_VKeyFlags_NONE), myMouseSingleButton (-1), + myMouseStopDragOnUnclick (false), // myTouchToleranceScale (1.0f), myTouchRotationThresholdPx (6.0f), @@ -82,9 +98,17 @@ myUpdateStartPointRot (true), myUpdateStartPointZRot (true), // + my3dMouseNoRotate (false, false, false), + my3dMouseToReverse (true, false, false), + my3dMouseAccelTrans (2.0f), + my3dMouseAccelRotate (4.0f), + my3dMouseIsQuadric (true), + // myPanPnt3d (Precision::Infinite(), 0.0, 0.0) { + memset(my3dMouseButtonState, 0, sizeof(my3dMouseButtonState)); myEventTimer.Start(); + myViewAnimation->SetOwnDuration (0.5); myAnchorPointPrs1 = new AIS_Point (new Geom_CartesianPoint (0.0, 0.0, 0.0)); myAnchorPointPrs1->SetZLayer (Graphic3d_ZLayerId_Top); @@ -94,7 +118,7 @@ myAnchorPointPrs2->SetZLayer (Graphic3d_ZLayerId_Topmost); myAnchorPointPrs2->SetMutable (true); - myRubberBand = new AIS_RubberBand (Quantity_NOC_LIGHTBLUE, Aspect_TOL_SOLID, Quantity_NOC_LIGHTBLUE, 0.4, 1.0); + myRubberBand = new AIS_RubberBand (Quantity_NOC_LIGHTBLUE, Aspect_TOL_SOLID, Quantity_NOC_LIGHTBLUE4, 0.5, 1.0); myRubberBand->SetZLayer (Graphic3d_ZLayerId_TopOSD); myRubberBand->SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_UPPER)); myRubberBand->SetDisplayMode (0); @@ -110,6 +134,27 @@ myMouseGestureMap.Bind (Aspect_VKeyMouse_MiddleButton, AIS_MouseGesture_Pan); myMouseGestureMap.Bind (Aspect_VKeyMouse_MiddleButton | Aspect_VKeyFlags_CTRL, AIS_MouseGesture_Pan); + + myXRTeleportHaptic.Duration = 3600.0f; + myXRTeleportHaptic.Frequency = 0.1f; + myXRTeleportHaptic.Amplitude = 0.2f; + + myXRPickingHaptic.Duration = 0.1f; + myXRPickingHaptic.Frequency = 4.0f; + myXRPickingHaptic.Amplitude = 0.1f; + + myXRSelectHaptic.Duration = 0.2f; + myXRSelectHaptic.Frequency = 4.0f; + myXRSelectHaptic.Amplitude = 0.5f; +} + +// ======================================================================= +// function : ~AIS_ViewController +// purpose : +// ======================================================================= +AIS_ViewController::~AIS_ViewController() +{ + // } // ======================================================================= @@ -611,6 +656,7 @@ { myMouseClickTimer.Stop(); myMouseClickCounter = 0; + myMouseStopDragOnUnclick = false; myUI.Dragging.ToStop = true; toUpdateView = true; } @@ -619,6 +665,12 @@ else if (theButtons == Aspect_VKeyMouse_NONE) { myMouseSingleButton = -1; + if (myMouseStopDragOnUnclick) + { + myMouseStopDragOnUnclick = false; + myUI.Dragging.ToStop = true; + toUpdateView = true; + } } else if (myMouseSingleButton == -1) { @@ -704,6 +756,7 @@ break; } case AIS_MouseGesture_Zoom: + case AIS_MouseGesture_ZoomWindow: { if (!myToAllowZooming) { @@ -739,7 +792,8 @@ if (aPrevGesture != myMouseActiveGesture) { if (aPrevGesture == AIS_MouseGesture_SelectRectangle - || aPrevGesture == AIS_MouseGesture_SelectLasso) + || aPrevGesture == AIS_MouseGesture_SelectLasso + || aPrevGesture == AIS_MouseGesture_ZoomWindow) { myUI.Selection.ToApplyTool = true; } @@ -769,6 +823,7 @@ myMouseClickTimer.Stop(); myMouseClickCounter = 0; myMouseSingleButton = -1; + myMouseStopDragOnUnclick = true; } } @@ -810,8 +865,13 @@ switch (myMouseActiveGesture) { case AIS_MouseGesture_SelectRectangle: + case AIS_MouseGesture_ZoomWindow: { UpdateRubberBand (myMousePressPoint, thePoint); + if (myMouseActiveGesture == AIS_MouseGesture_ZoomWindow) + { + myUI.Selection.Tool = AIS_ViewSelectionTool_ZoomWindow; + } toUpdateView = true; break; } @@ -1041,6 +1101,112 @@ } // ======================================================================= +// function : Update3dMouse +// purpose : +// ======================================================================= +bool AIS_ViewController::Update3dMouse (const WNT_HIDSpaceMouse& theEvent) +{ + bool toUpdate = false; + toUpdate = update3dMouseTranslation (theEvent) || toUpdate; + toUpdate = update3dMouseRotation (theEvent) || toUpdate; + toUpdate = update3dMouseKeys (theEvent) || toUpdate; + return toUpdate; +} + +// ======================================================================= +// function : update3dMouseTranslation +// purpose : +// ======================================================================= +bool AIS_ViewController::update3dMouseTranslation (const WNT_HIDSpaceMouse& theEvent) +{ + if (!theEvent.IsTranslation()) + { + return false; + } + + bool isIdle = true; + const double aTimeStamp = EventTime(); + const Graphic3d_Vec3d aTrans = theEvent.Translation (isIdle, my3dMouseIsQuadric) * my3dMouseAccelTrans; + myKeys.KeyFromAxis (Aspect_VKey_NavSlideLeft, Aspect_VKey_NavSlideRight, aTimeStamp, aTrans.x()); + myKeys.KeyFromAxis (Aspect_VKey_NavForward, Aspect_VKey_NavBackward, aTimeStamp, aTrans.y()); + myKeys.KeyFromAxis (Aspect_VKey_NavSlideUp, Aspect_VKey_NavSlideDown, aTimeStamp, aTrans.z()); + return true; +} + +// ======================================================================= +// function : update3dMouseRotation +// purpose : +// ======================================================================= +bool AIS_ViewController::update3dMouseRotation (const WNT_HIDSpaceMouse& theEvent) +{ + if (!theEvent.IsRotation() + || !myToAllowRotation) + { + return false; + } + + bool isIdle = true, toUpdate = false; + const double aTimeStamp = EventTime(); + const Graphic3d_Vec3d aRot3 = theEvent.Rotation (isIdle, my3dMouseIsQuadric) * my3dMouseAccelRotate; + if (!my3dMouseNoRotate.x()) + { + KeyFromAxis (Aspect_VKey_NavLookUp, Aspect_VKey_NavLookDown, aTimeStamp, !my3dMouseToReverse.x() ? aRot3.x() : -aRot3.x()); + toUpdate = true; + } + if (!my3dMouseNoRotate.y()) + { + KeyFromAxis (Aspect_VKey_NavRollCW, Aspect_VKey_NavRollCCW, aTimeStamp, !my3dMouseToReverse.y() ? aRot3.y() : -aRot3.y()); + toUpdate = true; + } + if (!my3dMouseNoRotate.z()) + { + KeyFromAxis (Aspect_VKey_NavLookLeft, Aspect_VKey_NavLookRight, aTimeStamp, !my3dMouseToReverse.z() ? aRot3.z() : -aRot3.z()); + toUpdate = true; + } + return toUpdate; +} + +// ======================================================================= +// function : update3dMouseKeys +// purpose : +// ======================================================================= +bool AIS_ViewController::update3dMouseKeys (const WNT_HIDSpaceMouse& theEvent) +{ + bool toUpdate = false; + const double aTimeStamp = EventTime(); + if (theEvent.IsKeyState()) + { + const uint32_t aKeyState = theEvent.KeyState(); + for (unsigned short aKeyBit = 0; aKeyBit < 32; ++aKeyBit) + { + const bool isPressed = (aKeyState & (1 << aKeyBit)) != 0; + const bool isReleased = my3dMouseButtonState[aKeyBit] && !isPressed; + //const bool isRepeated = my3dMouseButtonState[aKeyBit] && isPressed; + my3dMouseButtonState[aKeyBit] = isPressed; + if (!isReleased && !isPressed) + { + continue; + } + + const Aspect_VKey aVKey = theEvent.HidToSpaceKey (aKeyBit); + if (aVKey != Aspect_VKey_UNKNOWN) + { + toUpdate = true; + if (isPressed) + { + KeyDown (aVKey, aTimeStamp); + } + else + { + KeyUp (aVKey, aTimeStamp); + } + } + } + } + return toUpdate; +} + +// ======================================================================= // function : SetNavigationMode // purpose : // ======================================================================= @@ -1262,6 +1428,7 @@ { theView->Pan (myGL.Panning.Delta.x(), myGL.Panning.Delta.y()); theView->Invalidate(); + theView->View()->SynchronizeXRPosedToBaseCamera(); return; } @@ -1282,6 +1449,7 @@ aPanTrsf.SetTranslation (aCameraPan); aCam->Transform (aPanTrsf); theView->Invalidate(); + theView->View()->SynchronizeXRPosedToBaseCamera(); } // ======================================================================= @@ -1306,6 +1474,7 @@ aRotPnt.y() += myGL.ZRotate.Angle * aViewPort.y(); theView->Rotation (int(aRotPnt.x()), int(aRotPnt.y())); theView->Invalidate(); + theView->View()->SynchronizeXRPosedToBaseCamera(); } // ======================================================================= @@ -1336,6 +1505,7 @@ aCoeff = theParams.Delta > 0.0 ? aCoeff : 1.0 / aCoeff; theView->SetZoom (aCoeff, true); theView->Invalidate(); + theView->View()->SynchronizeXRPosedToBaseCamera(); return; } @@ -1407,6 +1577,7 @@ aPanTrsf.SetTranslation (aCameraPan); aCam->Transform (aPanTrsf); theView->Invalidate(); + theView->View()->SynchronizeXRPosedToBaseCamera(); } // ======================================================================= @@ -1427,7 +1598,7 @@ && aFocus < 2.0) { theView->Camera()->SetZFocus (theView->Camera()->ZFocusType(), aFocus); - theView->Redraw(); + theView->Invalidate(); } } @@ -1444,7 +1615,9 @@ return; } - const Handle(Graphic3d_Camera)& aCam = theView->Camera(); + const Handle(Graphic3d_Camera)& aCam = theView->View()->IsActiveXR() + ? theView->View()->BaseXRCamera() + : theView->Camera(); if (myGL.OrbitRotation.ToStart) { // default alternatives @@ -1483,9 +1656,13 @@ theView->Window()->Size (aWinXY.x(), aWinXY.y()); double aYawAngleDelta = ((myGL.OrbitRotation.PointStart.x() - myGL.OrbitRotation.PointTo.x()) / double (aWinXY.x())) * (M_PI * 0.5); double aPitchAngleDelta = -((myGL.OrbitRotation.PointStart.y() - myGL.OrbitRotation.PointTo.y()) / double (aWinXY.y())) * (M_PI * 0.5); - const double aPitchAngleNew = Max (Min (myRotateStartYawPitchRoll[1] + aPitchAngleDelta, M_PI * 0.5 - M_PI / 180.0), -M_PI * 0.5 + M_PI / 180.0); - const double aYawAngleNew = myRotateStartYawPitchRoll[0] + aYawAngleDelta; - const double aRoll = 0.0; + double aPitchAngleNew = 0.0, aRoll = 0.0; + const double aYawAngleNew = myRotateStartYawPitchRoll[0] + aYawAngleDelta; + if (!theView->View()->IsActiveXR()) + { + aPitchAngleNew = Max (Min (myRotateStartYawPitchRoll[1] + aPitchAngleDelta, M_PI * 0.5 - M_PI / 180.0), -M_PI * 0.5 + M_PI / 180.0); + aRoll = 0.0; + } gp_Quaternion aRot; aRot.SetEulerAngles (gp_YawPitchRoll, aYawAngleNew, aPitchAngleNew, aRoll); @@ -1539,6 +1716,7 @@ } theView->Invalidate(); + theView->View()->SynchronizeXRBaseToPosedCamera(); } // ======================================================================= @@ -1692,6 +1870,262 @@ } // ======================================================================= +// function : FitAllAuto +// purpose : +// ======================================================================= +void AIS_ViewController::FitAllAuto (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) +{ + const Bnd_Box aBoxSel = theCtx->BoundingBoxOfSelection(); + const double aFitMargin = 0.01; + if (aBoxSel.IsVoid()) + { + theView->FitAll (aFitMargin, false); + return; + } + + // fit all algorithm is not 100% stable - so compute some precision to compare equal camera values + const double aFitTol = (aBoxSel.CornerMax().XYZ() - aBoxSel.CornerMin().XYZ()).Modulus() * 0.000001; + const Bnd_Box aBoxAll = theView->View()->MinMaxValues(); + + const Handle(Graphic3d_Camera)& aCam = theView->Camera(); + Handle(Graphic3d_Camera) aCameraSel = new Graphic3d_Camera (aCam); + Handle(Graphic3d_Camera) aCameraAll = new Graphic3d_Camera (aCam); + theView->FitMinMax (aCameraSel, aBoxSel, aFitMargin); + theView->FitMinMax (aCameraAll, aBoxAll, aFitMargin); + if (aCameraSel->Center().IsEqual (aCam->Center(), aFitTol) + && Abs (aCameraSel->Scale() - aCam->Scale()) < aFitTol + && Abs (aCameraSel->Distance() - aCam->Distance()) < aFitTol) + { + // fit all entire view on second FitALL request + aCam->Copy (aCameraAll); + } + else + { + aCam->Copy (aCameraSel); + } +} + +// ======================================================================= +// function : handleViewOrientationKeys +// purpose : +// ======================================================================= +void AIS_ViewController::handleViewOrientationKeys (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) +{ + if (myNavigationMode == AIS_NavigationMode_FirstPersonWalk) + { + return; + } + + Handle(Graphic3d_Camera) aCameraBack; + struct ViewKeyAction + { + Aspect_VKey Key; + V3d_TypeOfOrientation Orientation; + }; + static const ViewKeyAction THE_VIEW_KEYS[] = + { + { Aspect_VKey_ViewTop, V3d_TypeOfOrientation_Zup_Top }, + { Aspect_VKey_ViewBottom, V3d_TypeOfOrientation_Zup_Bottom }, + { Aspect_VKey_ViewLeft, V3d_TypeOfOrientation_Zup_Left }, + { Aspect_VKey_ViewRight, V3d_TypeOfOrientation_Zup_Right }, + { Aspect_VKey_ViewFront, V3d_TypeOfOrientation_Zup_Front }, + { Aspect_VKey_ViewBack, V3d_TypeOfOrientation_Zup_Back }, + { Aspect_VKey_ViewAxoLeftProj, V3d_TypeOfOrientation_Zup_AxoLeft }, + { Aspect_VKey_ViewAxoRightProj, V3d_TypeOfOrientation_Zup_AxoRight }, + { Aspect_VKey_ViewRoll90CW, (V3d_TypeOfOrientation )-1}, + { Aspect_VKey_ViewRoll90CCW, (V3d_TypeOfOrientation )-1}, + { Aspect_VKey_ViewFitAll, (V3d_TypeOfOrientation )-1} + }; + { + Standard_Mutex::Sentry aLock (myKeys.Mutex()); + const size_t aNbKeys = sizeof(THE_VIEW_KEYS) / sizeof(*THE_VIEW_KEYS); + const double anEventTime = EventTime(); + for (size_t aKeyIter = 0; aKeyIter < aNbKeys; ++aKeyIter) + { + const ViewKeyAction& aKeyAction = THE_VIEW_KEYS[aKeyIter]; + if (!myKeys.IsKeyDown (aKeyAction.Key)) + { + continue; + } + + myKeys.KeyUp (aKeyAction.Key, anEventTime); + if (aCameraBack.IsNull()) + { + aCameraBack = theView->Camera(); + theView->SetCamera (new Graphic3d_Camera (aCameraBack)); + } + if (aKeyAction.Orientation != (V3d_TypeOfOrientation )-1) + { + theView->SetProj (aKeyAction.Orientation); + FitAllAuto (theCtx, theView); + } + else if (aKeyAction.Key == Aspect_VKey_ViewRoll90CW) + { + const double aTwist = theView->Twist() + M_PI / 2.0; + theView->SetTwist (aTwist); + } + else if (aKeyAction.Key == Aspect_VKey_ViewRoll90CCW) + { + const double aTwist = theView->Twist() - M_PI / 2.0; + theView->SetTwist (aTwist); + } + else if (aKeyAction.Key == Aspect_VKey_ViewFitAll) + { + FitAllAuto (theCtx, theView); + } + } + } + + if (aCameraBack.IsNull()) + { + return; + } + + Handle(Graphic3d_Camera) aCameraNew = theView->Camera(); + theView->SetCamera (aCameraBack); + const Graphic3d_Mat4d anOrientMat1 = aCameraBack->OrientationMatrix(); + const Graphic3d_Mat4d anOrientMat2 = aCameraNew ->OrientationMatrix(); + if (anOrientMat1 != anOrientMat2) + { + const Handle(AIS_AnimationCamera)& aCamAnim = myViewAnimation; + aCamAnim->SetView (theView); + aCamAnim->SetStartPts (0.0); + aCamAnim->SetCameraStart (new Graphic3d_Camera (aCameraBack)); + aCamAnim->SetCameraEnd (new Graphic3d_Camera (aCameraNew)); + aCamAnim->StartTimer (0.0, 1.0, true, false); + } +} + +// ======================================================================= +// function : handleNavigationKeys +// purpose : +// ======================================================================= +AIS_WalkDelta AIS_ViewController::handleNavigationKeys (const Handle(AIS_InteractiveContext)& , + const Handle(V3d_View)& theView) +{ + // navigation keys + double aCrouchRatio = 1.0, aRunRatio = 1.0; + if (myNavigationMode == AIS_NavigationMode_FirstPersonFlight) + { + aRunRatio = 3.0; + } + + const double aRotSpeed = 0.5; + const double aWalkSpeedCoef = WalkSpeedRelative(); + AIS_WalkDelta aWalk = FetchNavigationKeys (aCrouchRatio, aRunRatio); + if (aWalk.IsJumping()) + { + // ask more frames + setAskNextFrame(); + theView->Invalidate(); + } + if (aWalk.IsEmpty()) + { + return aWalk; + } + else if (myGL.OrbitRotation.ToRotate + || myGL.OrbitRotation.ToStart) + { + return aWalk; + } + + gp_XYZ aMin, aMax; + const Bnd_Box aBndBox = theView->View()->MinMaxValues(); + if (!aBndBox.IsVoid()) + { + aMin = aBndBox.CornerMin().XYZ(); + aMax = aBndBox.CornerMax().XYZ(); + } + double aBndDiam = Max (Max (aMax.X() - aMin.X(), aMax.Y() - aMin.Y()), aMax.Z() - aMin.Z()); + if (aBndDiam <= gp::Resolution()) + { + aBndDiam = 0.001; + } + + const double aWalkSpeed = myNavigationMode != AIS_NavigationMode_Orbit + && myNavigationMode != AIS_NavigationMode_FirstPersonFlight + ? theView->View()->UnitFactor() * WalkSpeedAbsolute() + : aWalkSpeedCoef * aBndDiam; + const Handle(Graphic3d_Camera)& aCam = theView->View()->IsActiveXR() + ? theView->View()->BaseXRCamera() + : theView->Camera(); + + // move forward in plane XY and up along Z + const gp_Dir anUp = ToLockOrbitZUp() ? gp::DZ() : aCam->OrthogonalizedUp(); + if (aWalk.ToMove() + && myToAllowPanning) + { + const gp_Vec aSide = -aCam->SideRight(); + gp_XYZ aFwd = aCam->Direction().XYZ(); + aFwd -= anUp.XYZ() * (anUp.XYZ() * aFwd); + + gp_XYZ aMoveVec; + if (!aWalk[AIS_WalkTranslation_Forward].IsEmpty()) + { + if (!aCam->IsOrthographic()) + { + aMoveVec += aFwd * aWalk[AIS_WalkTranslation_Forward].Value * aWalk[AIS_WalkTranslation_Forward].Pressure * aWalkSpeed; + } + } + if (!aWalk[AIS_WalkTranslation_Side].IsEmpty()) + { + aMoveVec += aSide.XYZ() * aWalk[AIS_WalkTranslation_Side].Value * aWalk[AIS_WalkTranslation_Side].Pressure * aWalkSpeed; + } + if (!aWalk[AIS_WalkTranslation_Up].IsEmpty()) + { + aMoveVec += anUp.XYZ() * aWalk[AIS_WalkTranslation_Up].Value * aWalk[AIS_WalkTranslation_Up].Pressure * aWalkSpeed; + } + { + if (aCam->IsOrthographic()) + { + if (!aWalk[AIS_WalkTranslation_Forward].IsEmpty()) + { + const double aZoomDelta = aWalk[AIS_WalkTranslation_Forward].Value * aWalk[AIS_WalkTranslation_Forward].Pressure * aWalkSpeedCoef; + handleZoom (theView, Aspect_ScrollDelta (aZoomDelta * 100.0), NULL); + } + } + + gp_Trsf aTrsfTranslate; + aTrsfTranslate.SetTranslation (aMoveVec); + aCam->Transform (aTrsfTranslate); + } + } + + if (myNavigationMode == AIS_NavigationMode_Orbit + && myToAllowRotation) + { + if (!aWalk[AIS_WalkRotation_Yaw].IsEmpty()) + { + gp_Trsf aTrsfRot; + aTrsfRot.SetRotation (gp_Ax1 (aCam->Eye(), anUp), aWalk[AIS_WalkRotation_Yaw].Value * aRotSpeed); + aCam->Transform (aTrsfRot); + } + if (!aWalk[AIS_WalkRotation_Pitch].IsEmpty()) + { + const gp_Vec aSide = -aCam->SideRight(); + gp_Trsf aTrsfRot; + aTrsfRot.SetRotation (gp_Ax1 (aCam->Eye(), aSide), -aWalk[AIS_WalkRotation_Pitch].Value * aRotSpeed); + aCam->Transform (aTrsfRot); + } + if (!aWalk[AIS_WalkRotation_Roll].IsEmpty() + && !ToLockOrbitZUp()) + { + gp_Trsf aTrsfRot; + aTrsfRot.SetRotation (gp_Ax1 (aCam->Center(), aCam->Direction()), aWalk[AIS_WalkRotation_Roll].Value * aRotSpeed); + aCam->Transform (aTrsfRot); + } + } + + // ask more frames + setAskNextFrame(); + theView->Invalidate(); + theView->View()->SynchronizeXRBaseToPosedCamera(); + return aWalk; +} + +// ======================================================================= // function : handleCameraActions // purpose : // ======================================================================= @@ -1909,6 +2343,251 @@ } // ======================================================================= +// function : handleXRInput +// purpose : +// ======================================================================= +void AIS_ViewController::handleXRInput (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView, + const AIS_WalkDelta& ) +{ + theView->View()->ProcessXRInput(); + if (!theView->View()->IsActiveXR()) + { + return; + } + if (myXRCameraTmp.IsNull()) + { + myXRCameraTmp = new Graphic3d_Camera(); + } + handleXRTurnPad (theCtx, theView); + handleXRTeleport(theCtx, theView); + handleXRPicking (theCtx, theView); +} + +// ======================================================================= +// function : handleXRTurnPad +// purpose : +// ======================================================================= +void AIS_ViewController::handleXRTurnPad (const Handle(AIS_InteractiveContext)& , + const Handle(V3d_View)& theView) +{ + if (myXRTurnAngle <= 0.0 + || !theView->View()->IsActiveXR()) + { + return; + } + + // turn left/right at 45 degrees on left/right trackpad clicks + for (int aHand = 0; aHand < 2; ++aHand) + { + const Aspect_XRTrackedDeviceRole aRole = aHand == 0 ? Aspect_XRTrackedDeviceRole_RightHand : Aspect_XRTrackedDeviceRole_LeftHand; + const Handle(Aspect_XRAction)& aPadClickAct = theView->View()->XRSession()->GenericAction (aRole, Aspect_XRGenericAction_InputTrackPadClick); + const Handle(Aspect_XRAction)& aPadPosAct = theView->View()->XRSession()->GenericAction (aRole, Aspect_XRGenericAction_InputTrackPadPosition); + if (aPadClickAct.IsNull() + || aPadPosAct.IsNull()) + { + continue; + } + + const Aspect_XRDigitalActionData aPadClick = theView->View()->XRSession()->GetDigitalActionData (aPadClickAct); + const Aspect_XRAnalogActionData aPadPos = theView->View()->XRSession()->GetAnalogActionData (aPadPosAct); + if (aPadClick.IsActive + && aPadClick.IsPressed + && aPadClick.IsChanged + && aPadPos.IsActive + && Abs (aPadPos.VecXYZ.y()) < 0.5f + && Abs (aPadPos.VecXYZ.x()) > 0.7f) + { + gp_Trsf aTrsfTurn; + aTrsfTurn.SetRotation (gp_Ax1 (gp::Origin(), theView->View()->BaseXRCamera()->Up()), aPadPos.VecXYZ.x() < 0.0f ? myXRTurnAngle : -myXRTurnAngle); + theView->View()->TurnViewXRCamera (aTrsfTurn); + break; + } + } +} + +// ======================================================================= +// function : handleXRTeleport +// purpose : +// ======================================================================= +void AIS_ViewController::handleXRTeleport (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) +{ + if (!theView->View()->IsActiveXR()) + { + return; + } + + // teleport on forward trackpad unclicks + const Aspect_XRTrackedDeviceRole aTeleOld = myXRLastTeleportHand; + myXRLastTeleportHand = Aspect_XRTrackedDeviceRole_Other; + for (int aHand = 0; aHand < 2; ++aHand) + { + const Aspect_XRTrackedDeviceRole aRole = aHand == 0 ? Aspect_XRTrackedDeviceRole_RightHand : Aspect_XRTrackedDeviceRole_LeftHand; + const Standard_Integer aDeviceId = theView->View()->XRSession()->NamedTrackedDevice (aRole); + if (aDeviceId == -1) + { + continue; + } + + const Handle(Aspect_XRAction)& aPadClickAct = theView->View()->XRSession()->GenericAction (aRole, Aspect_XRGenericAction_InputTrackPadClick); + const Handle(Aspect_XRAction)& aPadPosAct = theView->View()->XRSession()->GenericAction (aRole, Aspect_XRGenericAction_InputTrackPadPosition); + if (aPadClickAct.IsNull() + || aPadPosAct.IsNull()) + { + continue; + } + + const Aspect_XRDigitalActionData aPadClick = theView->View()->XRSession()->GetDigitalActionData (aPadClickAct); + const Aspect_XRAnalogActionData aPadPos = theView->View()->XRSession()->GetAnalogActionData (aPadPosAct); + const bool isPressed = aPadClick.IsPressed; + const bool isClicked = !aPadClick.IsPressed + && aPadClick.IsChanged; + if (aPadClick.IsActive + && (isPressed || isClicked) + && aPadPos.IsActive + && aPadPos.VecXYZ.y() > 0.6f + && Abs (aPadPos.VecXYZ.x()) < 0.5f) + { + const Aspect_TrackedDevicePose& aPose = theView->View()->XRSession()->TrackedPoses()[aDeviceId]; + if (!aPose.IsValidPose) + { + continue; + } + + myXRLastTeleportHand = aRole; + Standard_Real& aPickDepth = aRole == Aspect_XRTrackedDeviceRole_LeftHand ? myXRLastPickDepthLeft : myXRLastPickDepthRight; + aPickDepth = Precision::Infinite(); + Graphic3d_Vec3 aPickNorm; + const gp_Trsf aHandBase = theView->View()->PoseXRToWorld (aPose.Orientation); + const Standard_Real aHeadHeight = theView->View()->XRSession()->HeadPose().TranslationPart().Y(); + { + const Standard_Integer aPickedId = handleXRMoveTo (theCtx, theView, aPose.Orientation, false); + if (aPickedId >= 1) + { + const SelectMgr_SortCriterion& aPickedData = theCtx->MainSelector()->PickedData (aPickedId); + aPickNorm = aPickedData.Normal; + if (aPickNorm.SquareModulus() > ShortRealEpsilon()) + { + aPickDepth = aPickedData.Point.Distance (aHandBase.TranslationPart()); + } + } + } + if (isClicked) + { + myXRLastTeleportHand = Aspect_XRTrackedDeviceRole_Other; + if (!Precision::IsInfinite (aPickDepth)) + { + const gp_Dir aTeleDir = -gp::DZ().Transformed (aHandBase); + const gp_Dir anUpDir = theView->View()->BaseXRCamera()->Up(); + + bool isHorizontal = false; + gp_Dir aPickNormDir (aPickNorm.x(), aPickNorm.y(), aPickNorm.z()); + if (anUpDir.IsEqual ( aPickNormDir, M_PI_4) + || anUpDir.IsEqual (-aPickNormDir, M_PI_4)) + { + isHorizontal = true; + } + + gp_Pnt aNewEye = aHandBase.TranslationPart(); + if (isHorizontal) + { + aNewEye = aHandBase.TranslationPart() + + aTeleDir.XYZ() * aPickDepth + + anUpDir.XYZ() * aHeadHeight; + } + else + { + if (aPickNormDir.Dot (aTeleDir) < 0.0) + { + aPickNormDir.Reverse(); + } + aNewEye = aHandBase.TranslationPart() + + aTeleDir.XYZ() * aPickDepth + - aPickNormDir.XYZ() * aHeadHeight / 4; + } + + theView->View()->PosedXRCamera()->MoveEyeTo (aNewEye); + theView->View()->ComputeXRBaseCameraFromPosed (theView->View()->PosedXRCamera(), theView->View()->XRSession()->HeadPose()); + } + } + break; + } + } + + if (myXRLastTeleportHand != aTeleOld) + { + if (aTeleOld != Aspect_XRTrackedDeviceRole_Other) + { + if (const Handle(Aspect_XRAction)& aHaptic = theView->View()->XRSession()->GenericAction (aTeleOld, Aspect_XRGenericAction_OutputHaptic)) + { + theView->View()->XRSession()->AbortHapticVibrationAction (aHaptic); + } + } + if (myXRLastTeleportHand != Aspect_XRTrackedDeviceRole_Other) + { + if (const Handle(Aspect_XRAction)& aHaptic = theView->View()->XRSession()->GenericAction (myXRLastTeleportHand, Aspect_XRGenericAction_OutputHaptic)) + { + theView->View()->XRSession()->TriggerHapticVibrationAction (aHaptic, myXRTeleportHaptic); + } + } + } +} + +// ======================================================================= +// function : handleXRPicking +// purpose : +// ======================================================================= +void AIS_ViewController::handleXRPicking (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) +{ + if (!theView->View()->IsActiveXR()) + { + return; + } + + // handle selection on trigger clicks + Aspect_XRTrackedDeviceRole aPickDevOld = myXRLastPickingHand; + myXRLastPickingHand = Aspect_XRTrackedDeviceRole_Other; + for (int aHand = 0; aHand < 2; ++aHand) + { + const Aspect_XRTrackedDeviceRole aRole = aHand == 0 ? Aspect_XRTrackedDeviceRole_RightHand : Aspect_XRTrackedDeviceRole_LeftHand; + const Handle(Aspect_XRAction)& aTrigClickAct = theView->View()->XRSession()->GenericAction (aRole, Aspect_XRGenericAction_InputTriggerClick); + const Handle(Aspect_XRAction)& aTrigPullAct = theView->View()->XRSession()->GenericAction (aRole, Aspect_XRGenericAction_InputTriggerPull); + if (aTrigClickAct.IsNull() + || aTrigPullAct.IsNull()) + { + continue; + } + + const Aspect_XRDigitalActionData aTrigClick = theView->View()->XRSession()->GetDigitalActionData (aTrigClickAct); + const Aspect_XRAnalogActionData aTrigPos = theView->View()->XRSession()->GetAnalogActionData (aTrigPullAct); + if (aTrigPos.IsActive + && Abs (aTrigPos.VecXYZ.x()) > 0.1f) + { + myXRLastPickingHand = aRole; + handleXRHighlight (theCtx, theView); + if (aTrigClick.IsActive + && aTrigClick.IsPressed + && aTrigClick.IsChanged) + { + theCtx->Select (false); + OnSelectionChanged (theCtx, theView); + if (const Handle(Aspect_XRAction)& aHaptic = theView->View()->XRSession()->GenericAction (myXRLastPickingHand, Aspect_XRGenericAction_OutputHaptic)) + { + theView->View()->XRSession()->TriggerHapticVibrationAction (aHaptic, myXRSelectHaptic); + } + } + break; + } + } + if (myXRLastPickingHand != aPickDevOld) + { + theCtx->ClearDetected(); + } +} + +// ======================================================================= // function : OnSelectionChanged // purpose : // ======================================================================= @@ -1931,19 +2610,20 @@ case AIS_DragAction_Start: { myDragObject.Nullify(); + myDragOwner.Nullify(); if (!theCtx->HasDetected()) { return; } - Handle(AIS_InteractiveObject) aPrs = theCtx->DetectedInteractive(); - if (Handle(AIS_Manipulator) aManip = Handle(AIS_Manipulator)::DownCast (aPrs)) + const Handle(SelectMgr_EntityOwner)& aDetectedOwner = theCtx->DetectedOwner(); + Handle(AIS_InteractiveObject) aDetectedPrs = Handle(AIS_InteractiveObject)::DownCast (aDetectedOwner->Selectable()); + + if (aDetectedPrs->ProcessDragging (theCtx, theView, aDetectedOwner, myGL.Dragging.PointStart, + myGL.Dragging.PointTo, theAction)) { - if (aManip->HasActiveMode()) - { - myDragObject = aManip; - aManip->StartTransform (myGL.Dragging.PointStart.x(), myGL.Dragging.PointStart.y(), theView); - } + myDragObject = aDetectedPrs; + myDragOwner = aDetectedOwner; } return; } @@ -1958,10 +2638,9 @@ { theCtx->SetSelectedState (aGlobOwner, true); } - if (Handle(AIS_Manipulator) aManip = Handle(AIS_Manipulator)::DownCast (myDragObject)) - { - aManip->Transform (myGL.Dragging.PointTo.x(), myGL.Dragging.PointTo.y(), theView); - } + + myDragObject->ProcessDragging (theCtx, theView, myDragOwner, myGL.Dragging.PointStart, + myGL.Dragging.PointTo, theAction); theView->Invalidate(); return; } @@ -1975,10 +2654,8 @@ myGL.Dragging.PointTo = myGL.Dragging.PointStart; OnObjectDragged (theCtx, theView, AIS_DragAction_Update); - if (Handle(AIS_Manipulator) aManip = Handle(AIS_Manipulator)::DownCast (myDragObject)) - { - aManip->StopTransform (false); - } + myDragObject->ProcessDragging (theCtx, theView, myDragOwner, myGL.Dragging.PointStart, + myGL.Dragging.PointTo, theAction); Standard_FALLTHROUGH } case AIS_DragAction_Stop: @@ -1993,8 +2670,11 @@ theCtx->SetSelectedState (aGlobOwner, false); } + myDragObject->ProcessDragging (theCtx, theView, myDragOwner, myGL.Dragging.PointStart, + myGL.Dragging.PointTo, theAction); theView->Invalidate(); myDragObject.Nullify(); + myDragOwner.Nullify(); return; } } @@ -2008,7 +2688,8 @@ const Handle(V3d_View)& theView, const Graphic3d_Vec2i& thePnt) { - if (myPrevMoveTo == thePnt) + if (myPrevMoveTo == thePnt + || myHasHlrOnBeforeRotation) // ignore highlighting in-between rotation of HLR view { return; } @@ -2016,7 +2697,14 @@ myPrevMoveTo = thePnt; Handle(SelectMgr_EntityOwner) aLastPicked = theCtx->DetectedOwner(); + + // Picking relies on the camera frustum (including Z-range) - so make temporary AutoZFit() + // and then restore previous frustum to avoid immediate layer rendering issues if View has not been invalidated. + const Standard_Real aZNear = theView->Camera()->ZNear(), aZFar = theView->Camera()->ZFar(); + theView->AutoZFit(); theCtx->MoveTo (thePnt.x(), thePnt.y(), theView, false); + theView->Camera()->SetZRange (aZNear, aZFar); + Handle(SelectMgr_EntityOwner) aNewPicked = theCtx->DetectedOwner(); if (theView->Viewer()->Grid()->IsActive() @@ -2095,14 +2783,16 @@ { // rubber-band & window polygon selection if (myGL.Selection.Tool == AIS_ViewSelectionTool_RubberBand - || myGL.Selection.Tool == AIS_ViewSelectionTool_Polygon) + || myGL.Selection.Tool == AIS_ViewSelectionTool_Polygon + || myGL.Selection.Tool == AIS_ViewSelectionTool_ZoomWindow) { if (!myGL.Selection.Points.IsEmpty()) { myRubberBand->ClearPoints(); myRubberBand->SetToUpdate(); - const bool anIsRubber = myGL.Selection.Tool == AIS_ViewSelectionTool_RubberBand; + const bool anIsRubber = myGL.Selection.Tool == AIS_ViewSelectionTool_RubberBand + || myGL.Selection.Tool == AIS_ViewSelectionTool_ZoomWindow; if (anIsRubber) { myRubberBand->SetRectangle (myGL.Selection.Points.First().x(), -myGL.Selection.Points.First().y(), @@ -2129,8 +2819,8 @@ } catch (const Standard_Failure& theEx) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Internal error while displaying rubber-band: ") - + theEx.DynamicType()->Name() + ", " + theEx.GetMessageString(), Message_Warning); + Message::SendWarning (TCollection_AsciiString ("Internal error while displaying rubber-band: ") + + theEx.DynamicType()->Name() + ", " + theEx.GetMessageString()); myRubberBand->ClearPoints(); } if (!theView->Viewer()->ZLayerSettings (myRubberBand->ZLayer()).IsImmediate()) @@ -2166,20 +2856,28 @@ { const Graphic3d_Vec2i aPnt1 (aPoints.Value (1).x(), -aPoints.Value (1).y()); const Graphic3d_Vec2i aPnt2 (aPoints.Value (3).x(), -aPoints.Value (3).y()); - theCtx->MainSelector()->AllowOverlapDetection (aPnt1.y() != Min (aPnt1.y(), aPnt2.y())); - if (myGL.Selection.IsXOR) + if (myGL.Selection.Tool == AIS_ViewSelectionTool_ZoomWindow) { - theCtx->ShiftSelect (Min (aPnt1.x(), aPnt2.x()), Min (aPnt1.y(), aPnt2.y()), - Max (aPnt1.x(), aPnt2.x()), Max (aPnt1.y(), aPnt2.y()), - theView, false); + theView->WindowFitAll (aPnt1.x(), aPnt1.y(), aPnt2.x(), aPnt2.y()); + theView->Invalidate(); } else { - theCtx->Select (Min (aPnt1.x(), aPnt2.x()), Min (aPnt1.y(), aPnt2.y()), - Max (aPnt1.x(), aPnt2.x()), Max (aPnt1.y(), aPnt2.y()), - theView, false); + theCtx->MainSelector()->AllowOverlapDetection (aPnt1.y() != Min (aPnt1.y(), aPnt2.y())); + if (myGL.Selection.IsXOR) + { + theCtx->ShiftSelect (Min (aPnt1.x(), aPnt2.x()), Min (aPnt1.y(), aPnt2.y()), + Max (aPnt1.x(), aPnt2.x()), Max (aPnt1.y(), aPnt2.y()), + theView, false); + } + else + { + theCtx->Select (Min (aPnt1.x(), aPnt2.x()), Min (aPnt1.y(), aPnt2.y()), + Max (aPnt1.x(), aPnt2.x()), Max (aPnt1.y(), aPnt2.y()), + theView, false); + } + theCtx->MainSelector()->AllowOverlapDetection (false); } - theCtx->MainSelector()->AllowOverlapDetection (false); } else if (aPoints.Length() >= 3) { @@ -2192,7 +2890,6 @@ aPolyIter.ChangeValue() = gp_Pnt2d (aNewPnt.x(), -aNewPnt.y()); } - theCtx->MainSelector()->AllowOverlapDetection (false); if (myGL.Selection.IsXOR) { theCtx->ShiftSelect (aPolyline, theView, false); @@ -2201,14 +2898,17 @@ { theCtx->Select (aPolyline, theView, false); } + theCtx->MainSelector()->AllowOverlapDetection (false); } } - // selection affects all Views - theView->Viewer()->Invalidate(); - myRubberBand->ClearPoints(); - OnSelectionChanged (theCtx, theView); + if (myGL.Selection.Tool != AIS_ViewSelectionTool_ZoomWindow) + { + // selection affects all Views + theView->Viewer()->Invalidate(); + OnSelectionChanged (theCtx, theView); + } } } } @@ -2235,9 +2935,10 @@ else if (myToAllowHighlight) { if (myPrevMoveTo != aMoveToPnt - || myGL.OrbitRotation.ToRotate - || myGL.ViewRotation.ToRotate - || theView->IsInvalidated()) + || (!theView->View()->IsActiveXR() + && (myGL.OrbitRotation.ToRotate + || myGL.ViewRotation.ToRotate + || theView->IsInvalidated()))) { ResetPreviousMoveTo(); contextLazyMoveTo (theCtx, theView, aMoveToPnt); @@ -2303,11 +3004,17 @@ setAskNextFrame(); } + if (theView->View()->IsActiveXR()) + { + // VR requires continuous rendering + myToAskNextFrame = true; + } + for (V3d_ListOfViewIterator aViewIter (theView->Viewer()->ActiveViewIterator()); aViewIter.More(); aViewIter.Next()) { const Handle(V3d_View)& aView = aViewIter.Value(); if (aView->IsInvalidated() - || myToAskNextFrame) + || (myToAskNextFrame && aView == theView)) { if (aView->ComputedMode()) { @@ -2332,17 +3039,290 @@ } // ======================================================================= +// function : handleXRMoveTo +// purpose : +// ======================================================================= +Standard_Integer AIS_ViewController::handleXRMoveTo (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView, + const gp_Trsf& thePose, + const Standard_Boolean theToHighlight) +{ + //ResetPreviousMoveTo(); + Standard_Integer aPickResult = 0; + + Handle(Graphic3d_Camera) aCamBack = theView->Camera(); + myXRCameraTmp->Copy (aCamBack); + theView->View()->ComputeXRPosedCameraFromBase (*myXRCameraTmp, thePose); + theView->SetCamera (myXRCameraTmp); + Graphic3d_Vec2i aPickPixel; + theView->Window()->Size (aPickPixel.x(), aPickPixel.y()); + aPickPixel /= 2; + const Standard_Integer aSelTolerBack = theCtx->MainSelector()->CustomPixelTolerance(); + theCtx->MainSelector()->SetPixelTolerance (1); + theView->AutoZFit(); + if (theToHighlight) + { + theCtx->MoveTo (aPickPixel.x(), aPickPixel.y(), theView, false); + if (!theCtx->DetectedOwner().IsNull()) + { + // ignore 2D objects + for (aPickResult = 1; !theCtx->DetectedOwner()->Selectable()->TransformPersistence().IsNull(); ++aPickResult) + { + if (theCtx->HilightNextDetected (theView, false) <= 1) + { + theCtx->ClearDetected(); + aPickResult = 0; + break; + } + } + } + } + else + { + theCtx->MainSelector()->Pick (aPickPixel.x(), aPickPixel.y(), theView); + for (Standard_Integer aPickIter = 1; aPickIter <= theCtx->MainSelector()->NbPicked(); ++aPickIter) + { + const SelectMgr_SortCriterion& aPickedData = theCtx->MainSelector()->PickedData (aPickIter); + if (!aPickedData.Entity->OwnerId()->Selectable()->TransformPersistence().IsNull()) + { + // skip 2d objects + continue; + } + + aPickResult = aPickIter; + break; + } + } + theCtx->MainSelector()->SetPixelTolerance (aSelTolerBack); + theView->SetCamera (aCamBack); + return aPickResult; +} + +// ======================================================================= +// function : handleXRHighlight +// purpose : +// ======================================================================= +void AIS_ViewController::handleXRHighlight (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) +{ + if (myXRLastPickingHand != Aspect_XRTrackedDeviceRole_LeftHand + && myXRLastPickingHand != Aspect_XRTrackedDeviceRole_RightHand) + { + return; + } + + const Standard_Integer aDeviceId = theView->View()->XRSession()->NamedTrackedDevice (myXRLastPickingHand); + if (aDeviceId == -1) + { + return; + } + + const Aspect_TrackedDevicePose& aPose = theView->View()->XRSession()->TrackedPoses()[aDeviceId]; + if (!aPose.IsValidPose) + { + return; + } + + Handle(SelectMgr_EntityOwner) aDetOld = theCtx->DetectedOwner(); + handleXRMoveTo (theCtx, theView, aPose.Orientation, true); + if (!theCtx->DetectedOwner().IsNull() + && theCtx->DetectedOwner() != aDetOld) + { + if (const Handle(Aspect_XRAction)& aHaptic = theView->View()->XRSession()->GenericAction (myXRLastPickingHand, Aspect_XRGenericAction_OutputHaptic)) + { + theView->View()->XRSession()->TriggerHapticVibrationAction (aHaptic, myXRPickingHaptic); + } + } + + Standard_Real& aPickDepth = myXRLastPickingHand == Aspect_XRTrackedDeviceRole_LeftHand ? myXRLastPickDepthLeft : myXRLastPickDepthRight; + aPickDepth = Precision::Infinite(); + if (theCtx->MainSelector()->NbPicked() > 0) + { + const gp_Trsf aHandBase = theView->View()->PoseXRToWorld (aPose.Orientation); + const SelectMgr_SortCriterion& aPicked = theCtx->MainSelector()->PickedData (1); + aPickDepth = aPicked.Point.Distance (aHandBase.TranslationPart()); + } +} + +// ======================================================================= +// function : handleXRPresentations +// purpose : +// ======================================================================= +void AIS_ViewController::handleXRPresentations (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView) +{ + if (!theView->View()->IsActiveXR() + || (!myToDisplayXRAuxDevices + && !myToDisplayXRHands)) + { + for (NCollection_Array1::Iterator aPrsIter (myXRPrsDevices); aPrsIter.More(); aPrsIter.Next()) + { + if (!aPrsIter.Value().IsNull() + && aPrsIter.Value()->HasInteractiveContext()) + { + theCtx->Remove (aPrsIter.Value(), false); + } + aPrsIter.ChangeValue().Nullify(); + } + return; + } + + if (myXRPrsDevices.Length() != theView->View()->XRSession()->TrackedPoses().Length()) + { + for (NCollection_Array1::Iterator aPrsIter (myXRPrsDevices); aPrsIter.More(); aPrsIter.Next()) + { + if (!aPrsIter.Value().IsNull()) + { + theCtx->Remove (aPrsIter.Value(), false); + } + } + myXRPrsDevices.Resize (theView->View()->XRSession()->TrackedPoses().Lower(), theView->View()->XRSession()->TrackedPoses().Upper(), false); + } + + const Standard_Integer aHeadDevice = theView->View()->XRSession()->NamedTrackedDevice (Aspect_XRTrackedDeviceRole_Head); + const Standard_Integer aLeftDevice = theView->View()->XRSession()->NamedTrackedDevice (Aspect_XRTrackedDeviceRole_LeftHand); + const Standard_Integer aRightDevice = theView->View()->XRSession()->NamedTrackedDevice (Aspect_XRTrackedDeviceRole_RightHand); + for (Standard_Integer aDeviceIter = theView->View()->XRSession()->TrackedPoses().Lower(); aDeviceIter <= theView->View()->XRSession()->TrackedPoses().Upper(); ++aDeviceIter) + { + const Aspect_TrackedDevicePose& aPose = theView->View()->XRSession()->TrackedPoses()[aDeviceIter]; + Handle(AIS_XRTrackedDevice)& aPosePrs = myXRPrsDevices[aDeviceIter]; + if (!aPose.IsValidPose) + { + continue; + } + + const bool isHand = aDeviceIter == aLeftDevice + || aDeviceIter == aRightDevice; + if ((!myToDisplayXRHands && isHand) + || (!myToDisplayXRAuxDevices && !isHand)) + { + if (!aPosePrs.IsNull() + && aPosePrs->HasInteractiveContext()) + { + theCtx->Remove (aPosePrs, false); + } + continue; + } + + Aspect_XRTrackedDeviceRole aRole = Aspect_XRTrackedDeviceRole_Other; + if (aDeviceIter == aLeftDevice) + { + aRole = Aspect_XRTrackedDeviceRole_LeftHand; + } + else if (aDeviceIter == aRightDevice) + { + aRole = Aspect_XRTrackedDeviceRole_RightHand; + } + + if (!aPosePrs.IsNull() + && aPosePrs->UnitFactor() != (float )theView->View()->UnitFactor()) + { + theCtx->Remove (aPosePrs, false); + aPosePrs.Nullify(); + } + + if (aPosePrs.IsNull()) + { + Handle(Image_Texture) aTexture; + Handle(Graphic3d_ArrayOfTriangles) aTris; + if (aDeviceIter != aHeadDevice) + { + aTris = theView->View()->XRSession()->LoadRenderModel (aDeviceIter, aTexture); + } + if (!aTris.IsNull()) + { + aPosePrs = new AIS_XRTrackedDevice (aTris, aTexture); + } + else + { + aPosePrs = new AIS_XRTrackedDevice(); + } + aPosePrs->SetUnitFactor ((float )theView->View()->UnitFactor()); + aPosePrs->SetMutable (true); + aPosePrs->SetInfiniteState (true); + } + aPosePrs->SetRole (aRole); + + if (!aPosePrs->HasInteractiveContext()) + { + theCtx->Display (aPosePrs, 0, -1, false); + } + + gp_Trsf aPoseLocal = aPose.Orientation; + if (aDeviceIter == aHeadDevice) + { + // show headset position on floor level + aPoseLocal.SetTranslationPart (gp_Vec (aPoseLocal.TranslationPart().X(), 0.0, aPoseLocal.TranslationPart().Z())); + } + const gp_Trsf aPoseWorld = theView->View()->PoseXRToWorld (aPoseLocal); + theCtx->SetLocation (aPosePrs, aPoseWorld); + + Standard_Real aLaserLen = 0.0; + if (isHand + && aPosePrs->Role() == myXRLastPickingHand) + { + aLaserLen = myXRLastPickingHand == Aspect_XRTrackedDeviceRole_LeftHand ? myXRLastPickDepthLeft : myXRLastPickDepthRight; + if (Precision::IsInfinite (aLaserLen)) + { + const Bnd_Box aViewBox = theView->View()->MinMaxValues (true); + if (!aViewBox.IsVoid()) + { + aLaserLen = Sqrt (aViewBox.SquareExtent()); + } + else + { + aLaserLen = 100.0; + } + } + aPosePrs->SetLaserColor (myXRLaserPickColor); + } + else if (isHand + && aPosePrs->Role() == myXRLastTeleportHand) + { + aLaserLen = myXRLastTeleportHand == Aspect_XRTrackedDeviceRole_LeftHand ? myXRLastPickDepthLeft : myXRLastPickDepthRight; + if (Precision::IsInfinite (aLaserLen)) + { + const Bnd_Box aViewBox = theView->View()->MinMaxValues (true); + if (!aViewBox.IsVoid()) + { + aLaserLen = Sqrt (aViewBox.SquareExtent()); + } + else + { + aLaserLen = 100.0; + } + } + aPosePrs->SetLaserColor (myXRLaserTeleColor); + } + aPosePrs->SetLaserLength ((float )aLaserLen); + } +} + +// ======================================================================= // function : HandleViewEvents // purpose : // ======================================================================= void AIS_ViewController::HandleViewEvents (const Handle(AIS_InteractiveContext)& theCtx, const Handle(V3d_View)& theView) { - handleMoveTo (theCtx, theView); + const bool wasImmediateUpdate = theView->SetImmediateUpdate (false); - const AIS_WalkDelta aWalk = FetchNavigationKeys (1.0, 1.0); + handleViewOrientationKeys (theCtx, theView); + const AIS_WalkDelta aWalk = handleNavigationKeys (theCtx, theView); + handleXRInput (theCtx, theView, aWalk); + if (theView->View()->IsActiveXR()) + { + theView->View()->SetupXRPosedCamera(); + } + handleMoveTo (theCtx, theView); handleCameraActions (theCtx, theView, aWalk); + theView->View()->SynchronizeXRPosedToBaseCamera(); // handleCameraActions() may modify posed camera position - copy this modifications also to the base camera + handleXRPresentations (theCtx, theView); + handleViewRedraw (theCtx, theView); + theView->View()->UnsetXRPosedCamera(); + + theView->SetImmediateUpdate (wasImmediateUpdate); // make sure to not process the same events twice myGL.Reset(); diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ViewController.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ViewController.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ViewController.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ViewController.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,8 @@ #include #include +#include +#include #include #include #include @@ -28,6 +30,7 @@ #include #include #include +#include #include class AIS_AnimationCamera; @@ -35,7 +38,11 @@ class AIS_InteractiveContext; class AIS_Point; class AIS_RubberBand; +class AIS_XRTrackedDevice; +class Graphic3d_Camera; +class SelectMgr_EntityOwner; class V3d_View; +class WNT_HIDSpaceMouse; //! Auxiliary structure for handling viewer events between GUI and Rendering threads. //! @@ -51,6 +58,9 @@ //! Empty constructor. Standard_EXPORT AIS_ViewController(); + //! Destructor. + Standard_EXPORT virtual ~AIS_ViewController(); + //! Return input buffer. const AIS_ViewInputBuffer& InputBuffer (AIS_ViewInputBufferType theType) const { return theType == AIS_ViewInputBufferType_UI ? myUI : myGL; } @@ -197,6 +207,18 @@ //! Reset previous position of MoveTo. void ResetPreviousMoveTo() { myPrevMoveTo = Graphic3d_Vec2i (-1); } + //! Return TRUE to display auxiliary tracked XR devices (like tracking stations). + bool ToDisplayXRAuxDevices() const { return myToDisplayXRAuxDevices; } + + //! Set if auxiliary tracked XR devices should be displayed. + void SetDisplayXRAuxDevices (bool theToDisplay) { myToDisplayXRAuxDevices = theToDisplay; } + + //! Return TRUE to display XR hand controllers. + bool ToDisplayXRHands() const { return myToDisplayXRHands; } + + //! Set if tracked XR hand controllers should be displayed. + void SetDisplayXRHands (bool theToDisplay) { myToDisplayXRHands = theToDisplay; } + public: //! @name keyboard input //! Return keyboard state. @@ -408,6 +430,50 @@ Standard_EXPORT virtual void UpdateTouchPoint (Standard_Size theId, const Graphic3d_Vec2d& thePnt); +public: //! @name 3d mouse input + + //! Return acceleration ratio for translation event; 2.0 by default. + float Get3dMouseTranslationScale() const { return my3dMouseAccelTrans; } + + //! Set acceleration ratio for translation event. + void Set3dMouseTranslationScale (float theScale) { my3dMouseAccelTrans = theScale; } + + //! Return acceleration ratio for rotation event; 4.0 by default. + float Get3dMouseRotationScale() const { return my3dMouseAccelRotate; } + + //! Set acceleration ratio for rotation event. + void Set3dMouseRotationScale (float theScale) { my3dMouseAccelRotate = theScale; } + + //! Return quadric acceleration flag; TRUE by default. + bool To3dMousePreciseInput() const { return my3dMouseIsQuadric; } + + //! Set quadric acceleration flag. + void Set3dMousePreciseInput (bool theIsQuadric) { my3dMouseIsQuadric = theIsQuadric; } + + //! Return 3d mouse rotation axes (tilt/roll/spin) ignore flag; (FALSE, FALSE, FALSE) by default. + const NCollection_Vec3& Get3dMouseIsNoRotate() const { return my3dMouseNoRotate; } + + //! Return 3d mouse rotation axes (tilt/roll/spin) ignore flag; (FALSE, FALSE, FALSE) by default. + NCollection_Vec3& Change3dMouseIsNoRotate() { return my3dMouseNoRotate; } + + //! Return 3d mouse rotation axes (tilt/roll/spin) reverse flag; (TRUE, FALSE, FALSE) by default. + const NCollection_Vec3& Get3dMouseToReverse() const { return my3dMouseToReverse; } + + //! Return 3d mouse rotation axes (tilt/roll/spin) reverse flag; (TRUE, FALSE, FALSE) by default. + NCollection_Vec3& Change3dMouseToReverse() { return my3dMouseToReverse; } + + //! Process 3d mouse input event (redirects to translation, rotation and keys). + Standard_EXPORT virtual bool Update3dMouse (const WNT_HIDSpaceMouse& theEvent); + + //! Process 3d mouse input translation event. + Standard_EXPORT virtual bool update3dMouseTranslation (const WNT_HIDSpaceMouse& theEvent); + + //! Process 3d mouse input rotation event. + Standard_EXPORT virtual bool update3dMouseRotation (const WNT_HIDSpaceMouse& theEvent); + + //! Process 3d mouse input keys event. + Standard_EXPORT virtual bool update3dMouseKeys (const WNT_HIDSpaceMouse& theEvent); + public: //! Return event time (e.g. current time). @@ -468,9 +534,25 @@ Standard_EXPORT virtual gp_Pnt GravityPoint (const Handle(AIS_InteractiveContext)& theCtx, const Handle(V3d_View)& theView); + //! Modify view camera to fit all objects. + //! Default implementation fits either all visible and all selected objects (swapped on each call). + Standard_EXPORT virtual void FitAllAuto (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView); + public: - //! Perform camera actions. + //! Handle hot-keys defining new camera orientation (Aspect_VKey_ViewTop and similar keys). + //! Default implementation starts an animated transaction from the current to the target camera orientation, when specific action key was pressed. + //! This method is expected to be called from rendering thread. + Standard_EXPORT virtual void handleViewOrientationKeys (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView); + + //! Perform navigation (Aspect_VKey_NavForward and similar keys). + //! This method is expected to be called from rendering thread. + Standard_EXPORT virtual AIS_WalkDelta handleNavigationKeys (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView); + + //! Perform immediate camera actions (rotate/zoom/pan) on gesture progress. //! This method is expected to be called from rendering thread. Standard_EXPORT virtual void handleCameraActions (const Handle(AIS_InteractiveContext)& theCtx, const Handle(V3d_View)& theView, @@ -545,6 +627,40 @@ Standard_EXPORT virtual void handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx, const Handle(V3d_View)& theView); +public: + + //! Perform XR input. + //! This method is expected to be called from rendering thread. + Standard_EXPORT virtual void handleXRInput (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView, + const AIS_WalkDelta& theWalk); + + //! Handle trackpad view turn action. + Standard_EXPORT virtual void handleXRTurnPad (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView); + + //! Handle trackpad teleportation action. + Standard_EXPORT virtual void handleXRTeleport (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView); + + //! Handle picking on trigger click. + Standard_EXPORT virtual void handleXRPicking (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView); + + //! Perform dynamic highlighting for active hand. + Standard_EXPORT virtual void handleXRHighlight (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView); + + //! Display auxiliary XR presentations. + Standard_EXPORT virtual void handleXRPresentations (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView); + + //! Perform picking with/without dynamic highlighting for XR pose. + Standard_EXPORT virtual Standard_Integer handleXRMoveTo (const Handle(AIS_InteractiveContext)& theCtx, + const Handle(V3d_View)& theView, + const gp_Trsf& thePose, + const Standard_Boolean theToHighlight); + protected: //! Flush buffers. @@ -622,10 +738,28 @@ Handle(AIS_AnimationCamera) myViewAnimation; //!< view animation Handle(AIS_RubberBand) myRubberBand; //!< Rubber-band presentation + Handle(SelectMgr_EntityOwner) myDragOwner; //!< detected owner of currently dragged object Handle(AIS_InteractiveObject) myDragObject; //!< currently dragged object Graphic3d_Vec2i myPrevMoveTo; //!< previous position of MoveTo event in 3D viewer Standard_Boolean myHasHlrOnBeforeRotation; //!< flag for restoring Computed mode after rotation +protected: //! @name XR input variables + + NCollection_Array1 myXRPrsDevices; //!< array of XR tracked devices presentations + Handle(Graphic3d_Camera) myXRCameraTmp; //!< temporary camera + Quantity_Color myXRLaserTeleColor; //!< color of teleport laser + Quantity_Color myXRLaserPickColor; //!< color of picking laser + Aspect_XRTrackedDeviceRole myXRLastTeleportHand;//!< active hand for teleport + Aspect_XRTrackedDeviceRole myXRLastPickingHand; //!< active hand for picking objects + Aspect_XRHapticActionData myXRTeleportHaptic; //!< vibration on picking teleport destination + Aspect_XRHapticActionData myXRPickingHaptic; //!< vibration on dynamic highlighting + Aspect_XRHapticActionData myXRSelectHaptic; //!< vibration on selection + Standard_Real myXRLastPickDepthLeft; //!< last picking depth for left hand + Standard_Real myXRLastPickDepthRight; //!< last picking depth for right hand + Standard_Real myXRTurnAngle; //!< discrete turn angle for XR trackpad + Standard_Boolean myToDisplayXRAuxDevices; //!< flag to display auxiliary tracked XR devices + Standard_Boolean myToDisplayXRHands; //!< flag to display XR hands + protected: //! @name keyboard input variables Aspect_VKeySet myKeys; //!< keyboard state @@ -647,6 +781,7 @@ Aspect_VKeyMouse myMousePressed; //!< active mouse buttons Aspect_VKeyFlags myMouseModifiers; //!< active key modifiers passed with last mouse event Standard_Integer myMouseSingleButton; //!< index of mouse button pressed alone (>0) + Standard_Boolean myMouseStopDragOnUnclick; //!< queue stop dragging even with at next mouse unclick protected: //! @name multi-touch input variables @@ -665,6 +800,15 @@ Standard_Boolean myUpdateStartPointRot; //!< flag indicating that new gravity point should be picked for starting rotation gesture Standard_Boolean myUpdateStartPointZRot; //!< flag indicating that new gravity point should be picked for starting Z-rotation gesture +protected: //! @name 3d mouse input variables + + bool my3dMouseButtonState[32];//!< cached button state + NCollection_Vec3 my3dMouseNoRotate; //!< ignore 3d mouse rotation axes + NCollection_Vec3 my3dMouseToReverse; //!< reverse 3d mouse rotation axes + float my3dMouseAccelTrans; //!< acceleration ratio for translation event + float my3dMouseAccelRotate; //!< acceleration ratio for rotation event + bool my3dMouseIsQuadric; //!< quadric acceleration + protected: //! @name rotation/panning transient state variables Handle(AIS_Point) myAnchorPointPrs1; //!< anchor point presentation (Graphic3d_ZLayerId_Top) diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ViewCube.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ViewCube.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ViewCube.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ViewCube.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -137,6 +136,9 @@ myBoxEdgeGap (0.0), myBoxFacetExtension (1.0), myAxesPadding (1.0), + myAxesRadius (1.0), + myAxesConeRadius (3.0), + myAxesSphereRadius (4.0), myCornerMinSize (2.0), myRoundRadius (0.0), myToDisplayAxes (true), @@ -146,12 +148,12 @@ myViewAnimation (new AIS_AnimationCamera ("AIS_ViewCube", Handle(V3d_View)())), myStartState(new Graphic3d_Camera()), myEndState (new Graphic3d_Camera()), - myDuration (0.5), myToAutoStartAnim (true), myIsFixedAnimation (true), myToFitSelected (true), myToResetCameraUp (false) { + myViewAnimation->SetOwnDuration (0.5); myInfiniteState = true; myIsMutable = true; myDrawer->SetZLayer (Graphic3d_ZLayerId_Topmost); @@ -198,7 +200,7 @@ // this should be forced back-face culling regardless Closed flag myDrawer->TextAspect()->Aspect()->SetSuppressBackFaces (true); - Graphic3d_MaterialAspect aMat (Graphic3d_NOM_UserDefined); + Graphic3d_MaterialAspect aMat (Graphic3d_NameOfMaterial_UserDefined); aMat.SetColor (Quantity_NOC_WHITE); aMat.SetAmbientColor (Quantity_NOC_GRAY60); @@ -596,10 +598,11 @@ } Handle(Graphic3d_Group) anAxisGroup = thePrs->NewGroup(); + anAxisGroup->SetClosed (true); anAxisGroup->SetGroupPrimitivesAspect (aDatumAspect->ShadingAspect (aPart)->Aspect()); const Standard_Real anArrowLength = 0.2 * anAxisSize; - Handle(Graphic3d_ArrayOfTriangles) aTriangleArray = Prs3d_Arrow::DrawShaded (anAx1, 1.0, anAxisSize, 3.0, anArrowLength, THE_NB_ARROW_FACETTES); + Handle(Graphic3d_ArrayOfTriangles) aTriangleArray = Prs3d_Arrow::DrawShaded (anAx1, myAxesRadius, anAxisSize, myAxesConeRadius, anArrowLength, THE_NB_ARROW_FACETTES); anAxisGroup->AddPrimitiveArray (aTriangleArray); TCollection_AsciiString anAxisLabel; @@ -618,10 +621,11 @@ // Display center { Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); + aGroup->SetClosed (true); Handle(Prs3d_ShadingAspect) anAspectCen = new Prs3d_ShadingAspect(); anAspectCen->SetColor (Quantity_NOC_WHITE); aGroup->SetGroupPrimitivesAspect (anAspectCen->Aspect()); - Prs3d_ToolSphere aTool (4.0, THE_NB_DISK_SLICES, THE_NB_DISK_SLICES); + Prs3d_ToolSphere aTool (myAxesSphereRadius, THE_NB_DISK_SLICES, THE_NB_DISK_SLICES); gp_Trsf aTrsf; aTrsf.SetTranslation (gp_Vec (gp::Origin(), aLocation)); Handle(Graphic3d_ArrayOfTriangles) aCenterArray; @@ -822,6 +826,24 @@ } //======================================================================= +//function : Duration +//purpose : +//======================================================================= +Standard_Real AIS_ViewCube::Duration() const +{ + return myViewAnimation->OwnDuration(); +} + +//======================================================================= +//function : SetDuration +//purpose : +//======================================================================= +void AIS_ViewCube::SetDuration (Standard_Real theDurationSec) +{ + myViewAnimation->SetOwnDuration (theDurationSec); +} + +//======================================================================= //function : HasAnimation //purpose : //======================================================================= @@ -910,7 +932,6 @@ myViewAnimation->SetView (aView); myViewAnimation->SetCameraStart (myStartState); myViewAnimation->SetCameraEnd (myEndState); - myViewAnimation->SetOwnDuration (myDuration); myViewAnimation->StartTimer (0.0, 1.0, true, false); } @@ -921,7 +942,7 @@ Standard_Boolean AIS_ViewCube::updateAnimation() { const Standard_Real aPts = myViewAnimation->UpdateTimer(); - if (aPts >= myDuration) + if (aPts >= myViewAnimation->OwnDuration()) { myViewAnimation->Stop(); onAnimationFinished(); diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ViewCube.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ViewCube.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ViewCube.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ViewCube.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -189,6 +189,45 @@ //! The value should be within [0, 0.5] range. Standard_EXPORT void SetRoundRadius (const Standard_Real theValue); + //! Returns radius of axes of the trihedron; 1.0 by default. + Standard_Real AxesRadius() const { return myAxesRadius; } + + //! Sets radius of axes of the trihedron. + void SetAxesRadius (const Standard_Real theRadius) + { + if (Abs (myAxesRadius - theRadius) > Precision::Confusion()) + { + myAxesRadius = theRadius; + SetToUpdate(); + } + } + + //! Returns radius of cone of axes of the trihedron; 3.0 by default. + Standard_Real AxesConeRadius() const { return myAxesConeRadius; } + + //! Sets radius of cone of axes of the trihedron. + void SetAxesConeRadius (Standard_Real theRadius) + { + if (Abs (myAxesConeRadius - theRadius) > Precision::Confusion()) + { + myAxesConeRadius = theRadius; + SetToUpdate(); + } + } + + //! Returns radius of sphere (central point) of the trihedron; 4.0 by default. + Standard_Real AxesSphereRadius() const { return myAxesSphereRadius; } + + //! Sets radius of sphere (central point) of the trihedron. + void SetAxesSphereRadius (Standard_Real theRadius) + { + if (Abs (myAxesSphereRadius - theRadius) > Precision::Confusion()) + { + myAxesSphereRadius = theRadius; + SetToUpdate(); + } + } + //! @return TRUE if trihedron is drawn; TRUE by default. Standard_Boolean ToDrawAxes() const { return myToDisplayAxes; } @@ -412,7 +451,7 @@ //! Sets the material for the interactive object. virtual void UnsetMaterial() Standard_OVERRIDE { - Graphic3d_MaterialAspect aMat (Graphic3d_NOM_UserDefined); + Graphic3d_MaterialAspect aMat (Graphic3d_NameOfMaterial_UserDefined); aMat.SetColor (Quantity_NOC_WHITE); aMat.SetAmbientColor (Quantity_NOC_GRAY60); myDrawer->ShadingAspect()->SetMaterial (aMat); @@ -426,11 +465,11 @@ public: //! @name animation methods //! Return duration of animation in seconds; 0.5 sec by default - Standard_Real Duration() const { return myDuration; } + Standard_EXPORT Standard_Real Duration() const; //! Set duration of animation. //! @param theValue [in] input value of duration in seconds - void SetDuration (Standard_Real theValue) { myDuration = theValue; } + Standard_EXPORT void SetDuration (Standard_Real theValue); //! Return TRUE if new camera Up direction should be always set to default value for a new camera Direction; FALSE by default. //! When this flag is FALSE, the new camera Up will be set as current Up orthogonalized to the new camera Direction, @@ -621,6 +660,9 @@ Standard_Real myBoxEdgeGap; //!< gap between box side and box edge Standard_Real myBoxFacetExtension; //!< box facet extension Standard_Real myAxesPadding; //!< Padding between box and axes + Standard_Real myAxesRadius; //!< radius of axes of the trihedron; 1.0 by default + Standard_Real myAxesConeRadius; //!< radius of cone of axes of the trihedron; 3.0 by default + Standard_Real myAxesSphereRadius; //!< radius of sphere (central point) of the trihedron; 4.0 by default Standard_Real myCornerMinSize; //!< minimal size of box corner Standard_Real myRoundRadius; //!< relative round radius within [0; 0.5] range Standard_Boolean myToDisplayAxes; //!< trihedron visibility @@ -633,7 +675,6 @@ Handle(AIS_AnimationCamera) myViewAnimation; //!< Camera animation object Handle(Graphic3d_Camera) myStartState; //!< Start state of view camera Handle(Graphic3d_Camera) myEndState; //!< End state of view camera - Standard_Real myDuration; //!< Duration of animation. By default it is half a second Standard_Boolean myToAutoStartAnim; //!< start animation automatically on click Standard_Boolean myIsFixedAnimation; //!< fixed-loop animation Standard_Boolean myToFitSelected; //!< fit selected or fit entire scene diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_ViewInputBuffer.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_ViewInputBuffer.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_ViewInputBuffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_ViewInputBuffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,8 @@ { AIS_ViewSelectionTool_Picking, //!< pick to select AIS_ViewSelectionTool_RubberBand, //!< rubber-band to select - AIS_ViewSelectionTool_Polygon //!< polyline to select + AIS_ViewSelectionTool_Polygon, //!< polyline to select + AIS_ViewSelectionTool_ZoomWindow, //!< zoom-in window (no selection) }; //! Input buffer type. diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_XRTrackedDevice.cxx opencascade-7.5.1+dfsg1/src/AIS/AIS_XRTrackedDevice.cxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_XRTrackedDevice.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_XRTrackedDevice.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,205 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//! Texture holder. +class AIS_XRTrackedDevice::XRTexture : public Graphic3d_Texture2Dmanual +{ +public: + + //! Constructor. + XRTexture (const Handle(Image_Texture)& theImageSource, + const Graphic3d_TextureUnit theUnit = Graphic3d_TextureUnit_BaseColor) + : Graphic3d_Texture2Dmanual (""), myImageSource (theImageSource) + { + if (!theImageSource->TextureId().IsEmpty()) + { + myTexId = theImageSource->TextureId(); + } + myParams->SetTextureUnit (theUnit); + myIsColorMap = theUnit == Graphic3d_TextureUnit_BaseColor + || theUnit == Graphic3d_TextureUnit_Emissive; + } + + //! Image reader. + virtual Handle(Image_PixMap) GetImage (const Handle(Image_SupportedFormats)& theSupported) Standard_OVERRIDE + { + return myImageSource->ReadImage (theSupported); + } + +protected: + Handle(Image_Texture) myImageSource; +}; + +IMPLEMENT_STANDARD_RTTIEXT(AIS_XRTrackedDevice, AIS_InteractiveObject) + +//======================================================================= +//function : AIS_XRTrackedDevice +//purpose : +//======================================================================= +AIS_XRTrackedDevice::AIS_XRTrackedDevice (const Handle(Graphic3d_ArrayOfTriangles)& theTris, + const Handle(Image_Texture)& theTexture) +: myTris (theTris), + myLaserColor (Quantity_NOC_BLUE), + myLaserLength (0.0f), + myUnitFactor (1.0f), + myRole (Aspect_XRTrackedDeviceRole_Other), + myToShowAxes (false) +{ + myDrawer->SetShadingAspect (new Prs3d_ShadingAspect()); + myDrawer->ShadingAspect()->SetMaterial (Graphic3d_NameOfMaterial_DEFAULT); + myDrawer->ShadingAspect()->SetColor (Quantity_NOC_WHITE); + if (!theTexture.IsNull()) + { + myDrawer->ShadingAspect()->Aspect()->SetTextureMap (new XRTexture (theTexture)); + myDrawer->ShadingAspect()->Aspect()->SetTextureMapOn (true); + } +} + +//======================================================================= +//function : AIS_XRTrackedDevice +//purpose : +//======================================================================= +AIS_XRTrackedDevice::AIS_XRTrackedDevice() +: myLaserColor (Quantity_NOC_BLUE), + myLaserLength (0.0f), + myUnitFactor (1.0f), + myRole (Aspect_XRTrackedDeviceRole_Other), + myToShowAxes (true) +{ + // +} + +//======================================================================= +//function : SetLaserColor +//purpose : +//======================================================================= +void AIS_XRTrackedDevice::SetLaserColor (const Quantity_Color& theColor) +{ + if (!myLaserColor.IsEqual (theColor)) + { + myLaserColor = theColor; + computeLaserRay(); + } +} + +//======================================================================= +//function : SetLaserLength +//purpose : +//======================================================================= +void AIS_XRTrackedDevice::SetLaserLength (Standard_ShortReal theLength) +{ + if (myLaserLength != theLength) + { + myLaserLength = theLength; + computeLaserRay(); + } +} + +//======================================================================= +//function : computeLaserRay +//purpose : +//======================================================================= +void AIS_XRTrackedDevice::computeLaserRay() +{ + if (myRayGroup.IsNull()) + { + return; + } + + if (!myRayGroup->IsEmpty()) + { + myRayGroup->Clear(); + } + if (myLaserLength <= 0.0f) + { + return; + } + + Handle(Graphic3d_ArrayOfPrimitives) aLines = new Graphic3d_ArrayOfSegments (2, 0, Graphic3d_ArrayFlags_VertexColor); + aLines->AddVertex (gp_Pnt (0.0, 0.0, 0.0), myLaserColor); + aLines->AddVertex (gp_Pnt (0.0, 0.0, -myLaserLength), myLaserColor); + myRayGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect()); + myRayGroup->AddPrimitiveArray (aLines, false); // do not extend camera frustum by ray +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void AIS_XRTrackedDevice::Compute (const Handle(PrsMgr_PresentationManager3d)& , + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) +{ + if (theMode != 0) + { + return; + } + + thePrs->SetInfiniteState (myInfiniteState); + Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); + if (!myTris.IsNull()) + { + aGroup->SetGroupPrimitivesAspect (myDrawer->ShadingAspect()->Aspect()); + aGroup->AddPrimitiveArray (myTris); + } + + if (myToShowAxes || myTris.IsNull()) + { + const float aSize = 0.1f * myUnitFactor; + aGroup->SetGroupPrimitivesAspect (myDrawer->LineAspect()->Aspect()); + Handle(Graphic3d_ArrayOfPrimitives) aLines = new Graphic3d_ArrayOfSegments (6, 0, Graphic3d_ArrayFlags_VertexColor); + aLines->AddVertex (gp_Pnt (0.0, 0.0, 0.0), Quantity_Color (Quantity_NOC_RED)); + aLines->AddVertex (gp_Pnt (aSize, 0.0, 0.0), Quantity_Color (Quantity_NOC_RED)); + aLines->AddVertex (gp_Pnt (0.0, 0.0, 0.0), Quantity_Color (Quantity_NOC_GREEN)); + aLines->AddVertex (gp_Pnt (0.0, aSize, 0.0), Quantity_Color (Quantity_NOC_GREEN)); + aLines->AddVertex (gp_Pnt (0.0, 0.0, 0.0), Quantity_Color (Quantity_NOC_BLUE)); + aLines->AddVertex (gp_Pnt (0.0, 0.0, aSize), Quantity_Color (Quantity_NOC_BLUE)); + aGroup->AddPrimitiveArray (aLines); + } + + myRayGroup = thePrs->NewGroup(); + computeLaserRay(); +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void AIS_XRTrackedDevice::ComputeSelection (const Handle(SelectMgr_Selection)& theSel, + const Standard_Integer theMode) +{ + if (theMode != 0) + { + return; + } + + if (!myTris.IsNull()) + { + Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner (this); + Handle(Select3D_SensitivePrimitiveArray) aSensitive = new Select3D_SensitivePrimitiveArray (anOwner); + aSensitive->InitTriangulation (myTris->Attributes(), myTris->Indices(), TopLoc_Location(), true); + theSel->Add (aSensitive); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/AIS/AIS_XRTrackedDevice.hxx opencascade-7.5.1+dfsg1/src/AIS/AIS_XRTrackedDevice.hxx --- opencascade-7.4.1+dfsg1/src/AIS/AIS_XRTrackedDevice.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/AIS_XRTrackedDevice.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,92 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _AIS_XRTrackedDevice_HeaderFile +#define _AIS_XRTrackedDevice_HeaderFile + +#include +#include + +class Graphic3d_ArrayOfTriangles; +class Image_Texture; + +//! Auxiliary textured mesh presentation of tracked XR device. +class AIS_XRTrackedDevice : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTIEXT(AIS_XRTrackedDevice, AIS_InteractiveObject) +public: + //! Main constructor. + Standard_EXPORT AIS_XRTrackedDevice (const Handle(Graphic3d_ArrayOfTriangles)& theTris, + const Handle(Image_Texture)& theTexture); + + //! Empty constructor. + Standard_EXPORT AIS_XRTrackedDevice(); + + //! Return device role. + Aspect_XRTrackedDeviceRole Role() const { return myRole; } + + //! Set device role. + void SetRole (Aspect_XRTrackedDeviceRole theRole) { myRole = theRole; } + + //! Return laser color. + const Quantity_Color& LaserColor() const { return myLaserColor; } + + //! Set laser color. + Standard_EXPORT void SetLaserColor (const Quantity_Color& theColor); + + //! Return laser length. + Standard_ShortReal LaserLength() const { return myLaserLength; } + + //! Set laser length. + Standard_EXPORT void SetLaserLength (Standard_ShortReal theLength); + + //! Return unit scale factor. + Standard_ShortReal UnitFactor() const { return myUnitFactor; } + + //! Set unit scale factor. + void SetUnitFactor (Standard_ShortReal theFactor) { myUnitFactor = theFactor; } + +protected: + + //! Returns true for 0 mode. + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; } + + //! Compute presentation. + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr, + const Handle(Prs3d_Presentation)& thePrs, + const Standard_Integer theMode) Standard_OVERRIDE; + + //! Compute selection. + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSel, + const Standard_Integer theMode) Standard_OVERRIDE; + + //! Compute laser ray presentation. + Standard_EXPORT void computeLaserRay(); + +private: + //! Texture holder. + class XRTexture; + +private: + + Handle(Graphic3d_Group) myRayGroup; + + Handle(Graphic3d_ArrayOfTriangles) myTris; + Quantity_Color myLaserColor; + Standard_ShortReal myLaserLength; + Standard_ShortReal myUnitFactor; + Aspect_XRTrackedDeviceRole myRole; + Standard_Boolean myToShowAxes; +}; + +#endif // _AIS_XRTrackedDevice_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/AIS/FILES opencascade-7.5.1+dfsg1/src/AIS/FILES --- opencascade-7.4.1+dfsg1/src/AIS/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AIS/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,4 +1,3 @@ -AIS.cxx AIS.hxx AIS_Animation.cxx AIS_Animation.hxx @@ -7,8 +6,6 @@ AIS_AnimationCamera.hxx AIS_AnimationObject.cxx AIS_AnimationObject.hxx -AIS_AngleDimension.cxx -AIS_AngleDimension.hxx AIS_AttributeFilter.cxx AIS_AttributeFilter.hxx AIS_AttributeFilter.lxx @@ -20,12 +17,6 @@ AIS_C0RegularityFilter.hxx AIS_CameraFrustum.cxx AIS_CameraFrustum.hxx -AIS_Chamf2dDimension.cxx -AIS_Chamf2dDimension.hxx -AIS_Chamf2dDimension.lxx -AIS_Chamf3dDimension.cxx -AIS_Chamf3dDimension.hxx -AIS_Chamf3dDimension.lxx AIS_Circle.cxx AIS_Circle.hxx AIS_ClearMode.hxx @@ -35,8 +26,6 @@ AIS_DataMapOfShapeDrawer.hxx AIS_ColorScale.cxx AIS_ColorScale.hxx -AIS_ConcentricRelation.cxx -AIS_ConcentricRelation.hxx AIS_ConnectedInteractive.cxx AIS_ConnectedInteractive.hxx AIS_ConnectStatus.hxx @@ -46,37 +35,16 @@ AIS_DataMapofIntegerListOfinteractive.hxx AIS_DataMapOfIOStatus.hxx AIS_DataMapOfSelStat.hxx -AIS_DiameterDimension.cxx -AIS_DiameterDimension.hxx -AIS_Dimension.cxx -AIS_Dimension.hxx -AIS_DimensionOwner.cxx -AIS_DimensionOwner.hxx -AIS_DimensionSelectionMode.hxx AIS_DisplayMode.hxx -AIS_DisplaySpecialSymbol.hxx AIS_DisplayStatus.hxx AIS_DragAction.hxx -AIS_EllipseRadiusDimension.cxx -AIS_EllipseRadiusDimension.hxx -AIS_EqualDistanceRelation.cxx -AIS_EqualDistanceRelation.hxx -AIS_EqualDistanceRelation.lxx -AIS_EqualRadiusRelation.cxx -AIS_EqualRadiusRelation.hxx AIS_ExclusionFilter.cxx AIS_ExclusionFilter.hxx AIS_ExclusionFilter.lxx -AIS_FixRelation.cxx -AIS_FixRelation.hxx -AIS_FixRelation.lxx AIS_GlobalStatus.cxx AIS_GlobalStatus.hxx AIS_GraphicTool.cxx AIS_GraphicTool.hxx -AIS_IdenticRelation.cxx -AIS_IdenticRelation.hxx -AIS_IdenticRelation.lxx AIS_IndexedDataMapOfOwnerPrs.hxx AIS_InteractiveContext.cxx AIS_InteractiveContext.hxx @@ -85,13 +53,7 @@ AIS_InteractiveContext_3.cxx AIS_InteractiveObject.cxx AIS_InteractiveObject.hxx -AIS_KindOfDimension.hxx AIS_KindOfInteractive.hxx -AIS_KindOfRelation.hxx -AIS_KindOfSurface.hxx -AIS_KindOfUnit.hxx -AIS_LengthDimension.cxx -AIS_LengthDimension.hxx AIS_Line.cxx AIS_Line.hxx AIS_ListIteratorOfListOfInteractive.hxx @@ -103,29 +65,14 @@ AIS_ManipulatorOwner.cxx AIS_MapIteratorOfMapOfInteractive.hxx AIS_MapOfInteractive.hxx -AIS_MaxRadiusDimension.cxx -AIS_MaxRadiusDimension.hxx AIS_MediaPlayer.cxx AIS_MediaPlayer.hxx AIS_MouseGesture.hxx -AIS_MidPointRelation.cxx -AIS_MidPointRelation.hxx -AIS_MidPointRelation.lxx -AIS_MinRadiusDimension.cxx -AIS_MinRadiusDimension.hxx AIS_MultipleConnectedInteractive.cxx AIS_MultipleConnectedInteractive.hxx AIS_MultipleConnectedInteractive.lxx AIS_NavigationMode.hxx AIS_NListOfEntityOwner.hxx -AIS_OffsetDimension.cxx -AIS_OffsetDimension.hxx -AIS_OffsetDimension.lxx -AIS_ParallelRelation.cxx -AIS_ParallelRelation.hxx -AIS_ParallelRelation.lxx -AIS_PerpendicularRelation.cxx -AIS_PerpendicularRelation.hxx AIS_Plane.cxx AIS_Plane.hxx AIS_PlaneTrihedron.cxx @@ -134,10 +81,6 @@ AIS_Point.hxx AIS_PointCloud.cxx AIS_PointCloud.hxx -AIS_RadiusDimension.cxx -AIS_RadiusDimension.hxx -AIS_Relation.cxx -AIS_Relation.hxx AIS_RotationMode.hxx AIS_RubberBand.hxx AIS_RubberBand.cxx @@ -145,20 +88,13 @@ AIS_Selection.hxx AIS_SelectStatus.hxx AIS_SelectionModesConcurrency.hxx -AIS_SequenceOfDimension.hxx AIS_SequenceOfInteractive.hxx AIS_Shape.cxx AIS_Shape.hxx AIS_SignatureFilter.cxx AIS_SignatureFilter.hxx -AIS_StandardDatum.hxx AIS_StatusOfDetection.hxx AIS_StatusOfPick.hxx -AIS_SymmetricRelation.cxx -AIS_SymmetricRelation.hxx -AIS_SymmetricRelation.lxx -AIS_TangentRelation.cxx -AIS_TangentRelation.hxx AIS_TextLabel.cxx AIS_TextLabel.hxx AIS_TexturedShape.cxx @@ -172,11 +108,8 @@ AIS_TrihedronSelectionMode.hxx AIS_TypeFilter.cxx AIS_TypeFilter.hxx -AIS_TypeOfAngle.hxx -AIS_TypeOfAngleArrowVisibility.hxx AIS_TypeOfAttribute.hxx AIS_TypeOfAxis.hxx -AIS_TypeOfDist.hxx AIS_TypeOfIso.hxx AIS_TypeOfPlane.hxx AIS_ViewController.cxx @@ -185,3 +118,28 @@ AIS_ViewCube.cxx AIS_ViewCube.hxx AIS_WalkDelta.hxx +AIS_AngleDimension.hxx +AIS_Chamf2dDimension.hxx +AIS_Chamf3dDimension.hxx +AIS_ConcentricRelation.hxx +AIS_DiameterDimension.hxx +AIS_Dimension.hxx +AIS_DimensionOwner.hxx +AIS_EllipseRadiusDimension.hxx +AIS_EqualDistanceRelation.hxx +AIS_EqualRadiusRelation.hxx +AIS_FixRelation.hxx +AIS_IdenticRelation.hxx +AIS_LengthDimension.hxx +AIS_MaxRadiusDimension.hxx +AIS_MidPointRelation.hxx +AIS_MinRadiusDimension.hxx +AIS_OffsetDimension.hxx +AIS_ParallelRelation.hxx +AIS_PerpendicularRelation.hxx +AIS_RadiusDimension.hxx +AIS_Relation.hxx +AIS_SymmetricRelation.hxx +AIS_TangentRelation.hxx +AIS_XRTrackedDevice.cxx +AIS_XRTrackedDevice.hxx diff -Nru opencascade-7.4.1+dfsg1/src/AppBlend/AppBlend_AppSurf.gxx opencascade-7.5.1+dfsg1/src/AppBlend/AppBlend_AppSurf.gxx --- opencascade-7.4.1+dfsg1/src/AppBlend/AppBlend_AppSurf.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppBlend/AppBlend_AppSurf.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,7 +49,25 @@ //purpose : //======================================================================= -AppBlend_AppSurf::AppBlend_AppSurf ():done(Standard_False) {} +AppBlend_AppSurf::AppBlend_AppSurf () +: done(Standard_False), + dmin(0), + dmax(0), + tol3d(0.0), + tol2d(0.0), + nbit(0), + udeg(0), + vdeg(0), + knownp(Standard_False), + tol3dreached(0.0), + tol2dreached(0.0), + paramtype(Approx_ChordLength), + continuity(GeomAbs_C2) +{ + critweights[0]=0.4; + critweights[1]=0.2; + critweights[2]=0.4; +} //======================================================================= @@ -62,12 +80,21 @@ const Standard_Real Tol3d, const Standard_Real Tol2d, const Standard_Integer NbIt, - const Standard_Boolean KnownParameters): - done(Standard_False),dmin(Degmin),dmax(Degmax), - tol3d(Tol3d),tol2d(Tol2d),nbit(NbIt),knownp(KnownParameters) + const Standard_Boolean KnownParameters) +: done(Standard_False), + dmin(Degmin), + dmax(Degmax), + tol3d(Tol3d), + tol2d(Tol2d), + nbit(NbIt), + udeg(0), + vdeg(0), + knownp(KnownParameters), + tol3dreached(0.0), + tol2dreached(0.0), + paramtype(Approx_ChordLength), + continuity(GeomAbs_C2) { - continuity = GeomAbs_C2; - paramtype = Approx_ChordLength; critweights[0]=0.4; critweights[1]=0.2; critweights[2]=0.4; @@ -374,7 +401,7 @@ Standard_Real Uf = F.Parameter(Lin->Point(1)); Standard_Real Ul = F.Parameter(Lin->Point(NbPoint))-Uf; for (i=2; iPoint(i))-Uf)/Ul;; + theParams(i) = (F.Parameter(Lin->Point(i))-Uf)/Ul; } AppDef_Compute theAppDef(theParams,dmin,dmax,tol3d,tol2d,nbit, Standard_True, Standard_True); @@ -426,7 +453,7 @@ Standard_Real Uf = F.Parameter(Lin->Point(1)); Standard_Real Ul = F.Parameter(Lin->Point(NbPoint))-Uf; for (i=2; iPoint(i))-Uf)/Ul;; + theParams(i) = (F.Parameter(Lin->Point(i))-Uf)/Ul; } theapprox.Init(dmin,dmax,tol3d,tol2d,nbit,Standard_True, diff -Nru opencascade-7.4.1+dfsg1/src/AppCont/AppCont_LeastSquare.cxx opencascade-7.5.1+dfsg1/src/AppCont/AppCont_LeastSquare.cxx --- opencascade-7.4.1+dfsg1/src/AppCont/AppCont_LeastSquare.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppCont/AppCont_LeastSquare.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -452,7 +452,7 @@ myDone = Standard_True; for (i = bdeb; i <= bfin; i++) { for (j = bdeb; j <= bfin; j++) { - IBPij = IBP(i, j);; + IBPij = IBP(i, j); for (k = 1; k<= nbcol; k++) { myPoles(i, k) += IBPij * B2(j, k); } diff -Nru opencascade-7.4.1+dfsg1/src/AppDef/AppDef_LinearCriteria.cxx opencascade-7.5.1+dfsg1/src/AppDef/AppDef_LinearCriteria.cxx --- opencascade-7.4.1+dfsg1/src/AppDef/AppDef_LinearCriteria.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppDef/AppDef_LinearCriteria.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -54,9 +54,16 @@ const Standard_Integer FirstPoint, const Standard_Integer LastPoint): mySSP(SSP), + myQuadraticWeight(0.0), + myQualityWeight(0.0), myPntWeight(FirstPoint, LastPoint), - myE(0) + myLength(0.0), + myE(0), + IF(0), + IL(0) { + memset (myEstimation, 0, sizeof (myEstimation)); + memset (myPercent, 0, sizeof (myPercent)); myPntWeight.Init(1.); } @@ -353,53 +360,73 @@ // (critere sureleve => Non minimisation ) for(i = 0; i <= 2; i++) + { if((ValCri[i] < 0.8 * myEstimation[i]) && (myEstimation[i] > JEsMin[i])) { if(ICDANA < 1) ICDANA = 1; if(ValCri[i] < 0.1 * myEstimation[i]) ICDANA = 2; myEstimation[i] = Max(1.05*ValCri[i], JEsMin[i]); } - + } // (3) Mise a jours des Estimation // (critere sous-estimer => mauvais conditionement) - - if (ValCri[0] > myEstimation[0] * 2) { - myEstimation[0] += ValCri[0] * .1; - if (ICDANA == 0) { - if (ValCri[0] > myEstimation[0] * 10) { - ICDANA = 2; - } - else ICDANA = 1; - } - else { - ICDANA = 2; - } - } - if (ValCri[1] > myEstimation[1] * 20) { - myEstimation[1] += ValCri[1] * .1; - if (ICDANA == 0) { - if (ValCri[1] > myEstimation[1] * 100) { - ICDANA = 2; - } - else ICDANA = 1; - } - else { - ICDANA = 2; - } - } - if (ValCri[2] > myEstimation[2] * 20) { - myEstimation[2] += ValCri[2] * .05; - if (ICDANA == 0) { - if (ValCri[2] > myEstimation[2] * 100) { - ICDANA = 2; - } - else ICDANA = 1; - } - else { - ICDANA = 2; - } + if (ValCri[0] > myEstimation[0] * 2) + { + myEstimation[0] += ValCri[0] * .1; + if (ICDANA == 0) + { + if (ValCri[0] > myEstimation[0] * 10) + { + ICDANA = 2; + } + else + { + ICDANA = 1; + } } - + else + { + ICDANA = 2; + } + } + if (ValCri[1] > myEstimation[1] * 20) + { + myEstimation[1] += ValCri[1] * .1; + if (ICDANA == 0) + { + if (ValCri[1] > myEstimation[1] * 100) + { + ICDANA = 2; + } + else + { + ICDANA = 1; + } + } + else + { + ICDANA = 2; + } + } + if (ValCri[2] > myEstimation[2] * 20) + { + myEstimation[2] += ValCri[2] * .05; + if (ICDANA == 0) + { + if (ValCri[2] > myEstimation[2] * 100) + { + ICDANA = 2; + } + else + { + ICDANA = 1; + } + } + else + { + ICDANA = 2; + } + } return ICDANA; } diff -Nru opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves_ConstraintCouple.cxx opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves_ConstraintCouple.cxx --- opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves_ConstraintCouple.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves_ConstraintCouple.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,7 +16,11 @@ #include AppParCurves_ConstraintCouple:: - AppParCurves_ConstraintCouple() {} + AppParCurves_ConstraintCouple() +: myIndex(-1), + myConstraint(AppParCurves_NoConstraint) +{ +} AppParCurves_ConstraintCouple:: diff -Nru opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves.cxx opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves.cxx --- opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,7 +65,7 @@ math_Matrix& DA) { Standard_Integer i, j, id, Ndeg = NbPoles-1; - Standard_Real u0, u1, y0, y1, xs, bj, bj1;; + Standard_Real u0, u1, y0, y1, xs, bj, bj1; Standard_Integer first = U.Lower(), last = U.Upper(); math_Vector B(1, NbPoles-1); diff -Nru opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves_Gradient.gxx opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves_Gradient.gxx --- opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves_Gradient.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves_Gradient.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,7 +58,11 @@ const Standard_Real Tol3d, const Standard_Real Tol2d, const Standard_Integer NbIterations): - ParError(FirstPoint, LastPoint,0.0) { + ParError(FirstPoint, LastPoint,0.0), + AvError(0.0), + MError3d(0.0), + MError2d(0.0) +{ // Standard_Boolean grad = Standard_True; Standard_Integer j, k, i2, l; diff -Nru opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves_LeastSquare.gxx opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves_LeastSquare.gxx --- opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves_LeastSquare.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves_LeastSquare.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -1272,7 +1272,7 @@ { if (!done) {throw StdFail_NotDone();} - Standard_Integer i, j, j2, npoints = nbP+nbP2d;; + Standard_Integer i, j, j2, npoints = nbP+nbP2d; gp_Pnt Pt; gp_Pnt2d Pt2d; Standard_Integer ideb = resinit, ifin = resfin; diff -Nru opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves_MultiBSpCurve.cxx opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves_MultiBSpCurve.cxx --- opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves_MultiBSpCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves_MultiBSpCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,7 +46,10 @@ //purpose : //======================================================================= -AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve() {} +AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve() +: myDegree(0) +{ +} //======================================================================= @@ -56,7 +59,8 @@ AppParCurves_MultiBSpCurve::AppParCurves_MultiBSpCurve (const Standard_Integer NbPol): - AppParCurves_MultiCurve(NbPol) + AppParCurves_MultiCurve(NbPol), + myDegree(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves_MultiPoint.cxx opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves_MultiPoint.cxx --- opencascade-7.4.1+dfsg1/src/AppParCurves/AppParCurves_MultiPoint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppParCurves/AppParCurves_MultiPoint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,11 @@ #define tabPoint Handle(TColgp_HArray1OfPnt)::DownCast (ttabPoint) #define tabPoint2d Handle(TColgp_HArray1OfPnt2d)::DownCast (ttabPoint2d) -AppParCurves_MultiPoint::AppParCurves_MultiPoint() {} +AppParCurves_MultiPoint::AppParCurves_MultiPoint() +: nbP(0), + nbP2d(0) +{ +} AppParCurves_MultiPoint::AppParCurves_MultiPoint (const Standard_Integer NbPoles, diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_ComputeCLine.gxx opencascade-7.5.1+dfsg1/src/Approx/Approx_ComputeCLine.gxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_ComputeCLine.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_ComputeCLine.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -54,7 +54,11 @@ mylastC = LastC; myMaxSegments = MAXSEGM; myInvOrder = Standard_True; + myHangChecking = Standard_True; alldone = Standard_False; + tolreached = Standard_False; + currenttol3d = 0.0; + currenttol2d = 0.0; Perform(Line); } @@ -82,6 +86,10 @@ mylastC = LastC; myMaxSegments = MAXSEGM; myInvOrder = Standard_True; + myHangChecking = Standard_True; + tolreached = Standard_False; + currenttol3d = 0.0; + currenttol2d = 0.0; } //======================================================================= @@ -97,12 +105,20 @@ Standard_Real thetol3d = Precision::Confusion(), thetol2d = Precision::Confusion(); UFirst = Line.FirstParameter(); ULast = Line.LastParameter(); - Standard_Real TolU = Max((ULast-UFirst)*1.e-05, Precision::PApproximation()); + Standard_Real TolU = 0.; + if (myHangChecking) + { + TolU = Max((ULast - UFirst)*1.e-03, Precision::Confusion()); + } + else + { + TolU = Max((ULast - UFirst)*1.e-05, Precision::PApproximation()); + } Standard_Real myfirstU = UFirst; Standard_Real mylastU = ULast; Standard_Integer aMaxSegments = 0; Standard_Integer aMaxSegments1 = myMaxSegments - 1; - Standard_Integer aNbCut = 0, aNbImp = 0, aNbComp = 20; + Standard_Integer aNbCut = 0, aNbImp = 0, aNbComp = 10; if (!mycut) { @@ -176,7 +192,7 @@ //cout << myfirstU << " - " << mylastU << " tol : " << thetol3d << " " << thetol2d << endl; Standard_Boolean aStopCutting = Standard_False; - if (aNbCut >= aNbComp) + if (myHangChecking && aNbCut >= aNbComp) { if (aNbCut > aNbImp + 1) { @@ -435,6 +451,15 @@ } //======================================================================= +//function : SetHangChecking +//purpose : +//======================================================================= +void Approx_ComputeCLine::SetHangChecking(const Standard_Boolean theHangChecking) +{ + myHangChecking = theHangChecking; +} + +//======================================================================= //function : IsAllApproximated //purpose : returns False if at a moment of the approximation, // the status NoApproximation has been sent by the user diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_CurveOnSurface.cxx opencascade-7.5.1+dfsg1/src/Approx/Approx_CurveOnSurface.cxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_CurveOnSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_CurveOnSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,8 +27,11 @@ #include #include #include +#include +#include #include #include +#include #include #include #include @@ -300,6 +303,10 @@ } } +//============================================================================= +//function : Approx_CurveOnSurface +//purpose : Constructor +//============================================================================= Approx_CurveOnSurface::Approx_CurveOnSurface(const Handle(Adaptor2d_HCurve2d)& C2D, const Handle(Adaptor3d_HSurface)& Surf, const Standard_Real First, @@ -310,14 +317,75 @@ const Standard_Integer MaxSegments, const Standard_Boolean only3d, const Standard_Boolean only2d) +: myC2D(C2D), + mySurf(Surf), + myFirst(First), + myLast(Last), + myTol(Tol), + myIsDone(Standard_False), + myHasResult(Standard_False), + myError3d(0.0), + myError2dU(0.0), + myError2dV(0.0) + { + Perform(MaxSegments, MaxDegree, S, only3d, only2d); + } + +//============================================================================= +//function : Approx_CurveOnSurface +//purpose : Constructor +//============================================================================= + Approx_CurveOnSurface::Approx_CurveOnSurface(const Handle(Adaptor2d_HCurve2d)& theC2D, + const Handle(Adaptor3d_HSurface)& theSurf, + const Standard_Real theFirst, + const Standard_Real theLast, + const Standard_Real theTol) +: myC2D(theC2D), + mySurf(theSurf), + myFirst(theFirst), + myLast(theLast), + myTol(theTol), + myIsDone(Standard_False), + myHasResult(Standard_False), + myError3d(0.0), + myError2dU(0.0), + myError2dV(0.0) { - myIsDone = Standard_False; - if(only3d && only2d) throw Standard_ConstructionError(); - GeomAbs_Shape Order = S; +} - Handle( Adaptor2d_HCurve2d ) TrimmedC2D = C2D->Trim( First, Last, Precision::PConfusion() ); +//============================================================================= +//function : Perform +//purpose : +//============================================================================= +void Approx_CurveOnSurface::Perform(const Standard_Integer theMaxSegments, + const Standard_Integer theMaxDegree, + const GeomAbs_Shape theContinuity, + const Standard_Boolean theOnly3d, + const Standard_Boolean theOnly2d) +{ + myIsDone = Standard_False; + myHasResult = Standard_False; + myError2dU = 0.0; + myError2dV = 0.0; + myError3d = 0.0; + + if(theOnly3d && theOnly2d) throw Standard_ConstructionError(); + + Handle( Adaptor2d_HCurve2d ) TrimmedC2D = myC2D->Trim( myFirst, myLast, Precision::PConfusion() ); + + Standard_Boolean isU, isForward; + Standard_Real aParam; + if (theOnly3d && isIsoLine(TrimmedC2D, isU, aParam, isForward)) + { + if (buildC3dOnIsoLine(TrimmedC2D, isU, aParam, isForward)) + { + myIsDone = Standard_True; + myHasResult = Standard_True; + return; + } + } - Adaptor3d_CurveOnSurface COnS( TrimmedC2D, Surf ); + Adaptor3d_CurveOnSurface COnS( TrimmedC2D, mySurf ); Handle(Adaptor3d_HCurveOnSurface) HCOnS = new Adaptor3d_HCurveOnSurface(); HCOnS->Set(COnS); @@ -327,37 +395,34 @@ Handle(TColStd_HArray1OfReal) ThreeDTol; // create evaluators and choose appropriate one - Approx_CurveOnSurface_Eval3d Eval3dCvOnSurf (HCOnS, First, Last); - Approx_CurveOnSurface_Eval2d Eval2dCvOnSurf ( TrimmedC2D, First, Last); - Approx_CurveOnSurface_Eval EvalCvOnSurf (HCOnS, TrimmedC2D, First, Last); + Approx_CurveOnSurface_Eval3d Eval3dCvOnSurf (HCOnS, myFirst, myLast); + Approx_CurveOnSurface_Eval2d Eval2dCvOnSurf ( TrimmedC2D, myFirst, myLast); + Approx_CurveOnSurface_Eval EvalCvOnSurf (HCOnS, TrimmedC2D, myFirst, myLast); AdvApprox_EvaluatorFunction* EvalPtr; - if ( only3d ) EvalPtr = &Eval3dCvOnSurf; - else if ( only2d ) EvalPtr = &Eval2dCvOnSurf; + if ( theOnly3d ) EvalPtr = &Eval3dCvOnSurf; + else if ( theOnly2d ) EvalPtr = &Eval2dCvOnSurf; else EvalPtr = &EvalCvOnSurf; // Initialization for 2d approximation - if(!only3d) { + if(!theOnly3d) { Num1DSS = 2; OneDTol = new TColStd_HArray1OfReal(1,Num1DSS); Standard_Real TolU, TolV; - TolU = Surf->UResolution(Tol)/2; - TolV = Surf->VResolution(Tol)/2; + TolU = mySurf->UResolution(myTol)/2; + TolV = mySurf->VResolution(myTol)/2; OneDTol->SetValue(1,TolU); OneDTol->SetValue(2,TolV); } - if(!only2d) { + if(!theOnly2d) { Num3DSS=1; ThreeDTol = new TColStd_HArray1OfReal(1,Num3DSS); - ThreeDTol->Init(Tol/2); + ThreeDTol->Init(myTol/2); } - myError2dU = 0; - myError2dV = 0; - myError3d = 0; Standard_Integer NbInterv_C2 = HCOnS->NbIntervals(GeomAbs_C2); TColStd_Array1OfReal CutPnts_C2(1, NbInterv_C2 + 1); @@ -369,8 +434,8 @@ AdvApprox_PrefAndRec CutTool(CutPnts_C2,CutPnts_C3); AdvApprox_ApproxAFunction aApprox (Num1DSS, Num2DSS, Num3DSS, OneDTol, TwoDTolNul, ThreeDTol, - First, Last, Order, - MaxDegree, MaxSegments, + myFirst, myLast, theContinuity, + theMaxDegree, theMaxSegments, *EvalPtr, CutTool); myIsDone = aApprox.IsDone(); @@ -381,14 +446,14 @@ Handle(TColStd_HArray1OfInteger) Mults = aApprox.Multiplicities(); Standard_Integer Degree = aApprox.Degree(); - if(!only2d) + if(!theOnly2d) { TColgp_Array1OfPnt Poles(1,aApprox.NbPoles()); aApprox.Poles(1,Poles); myCurve3d = new Geom_BSplineCurve(Poles, Knots->Array1(), Mults->Array1(), Degree); myError3d = aApprox.MaxError(3, 1); } - if(!only3d) + if(!theOnly3d) { TColgp_Array1OfPnt2d Poles2d(1,aApprox.NbPoles()); TColStd_Array1OfReal Poles1dU(1,aApprox.NbPoles()); @@ -404,8 +469,6 @@ } } -// } - } Standard_Boolean Approx_CurveOnSurface::IsDone() const @@ -443,3 +506,215 @@ return myError2dV; } +//============================================================================= +//function : isIsoLine +//purpose : +//============================================================================= +Standard_Boolean Approx_CurveOnSurface::isIsoLine(const Handle(Adaptor2d_HCurve2d) theC2D, + Standard_Boolean& theIsU, + Standard_Real& theParam, + Standard_Boolean& theIsForward) const +{ + // These variables are used to check line state (vertical or horizontal). + Standard_Boolean isAppropriateType = Standard_False; + gp_Pnt2d aLoc2d; + gp_Dir2d aDir2d; + + // Test type. + const GeomAbs_CurveType aType = theC2D->GetType(); + if (aType == GeomAbs_Line) + { + gp_Lin2d aLin2d = theC2D->Line(); + aLoc2d = aLin2d.Location(); + aDir2d = aLin2d.Direction(); + isAppropriateType = Standard_True; + } + else if (aType == GeomAbs_BSplineCurve) + { + Handle(Geom2d_BSplineCurve) aBSpline2d = theC2D->BSpline(); + if (aBSpline2d->Degree() != 1 || aBSpline2d->NbPoles() != 2) + return Standard_False; // Not a line or uneven parameterization. + + aLoc2d = aBSpline2d->Pole(1); + + // Vector should be non-degenerated. + gp_Vec2d aVec2d(aBSpline2d->Pole(1), aBSpline2d->Pole(2)); + if (aVec2d.SquareMagnitude() < Precision::Confusion()) + return Standard_False; // Degenerated spline. + aDir2d = aVec2d; + + isAppropriateType = Standard_True; + } + else if (aType == GeomAbs_BezierCurve) + { + Handle(Geom2d_BezierCurve) aBezier2d = theC2D->Bezier(); + if (aBezier2d->Degree() != 1 || aBezier2d->NbPoles() != 2) + return Standard_False; // Not a line or uneven parameterization. + + aLoc2d = aBezier2d->Pole(1); + + // Vector should be non-degenerated. + gp_Vec2d aVec2d(aBezier2d->Pole(1), aBezier2d->Pole(2)); + if (aVec2d.SquareMagnitude() < Precision::Confusion()) + return Standard_False; // Degenerated spline. + aDir2d = aVec2d; + + isAppropriateType = Standard_True; + } + + if (!isAppropriateType) + return Standard_False; + + // Check line to be vertical or horizontal. + if (aDir2d.IsParallel(gp::DX2d(), Precision::Angular())) + { + // Horizontal line. V = const. + theIsU = Standard_False; + theParam = aLoc2d.Y(); + theIsForward = aDir2d.Dot(gp::DX2d()) > 0.0; + return Standard_True; + } + else if (aDir2d.IsParallel(gp::DY2d(), Precision::Angular())) + { + // Vertical line. U = const. + theIsU = Standard_True; + theParam = aLoc2d.X(); + theIsForward = aDir2d.Dot(gp::DY2d()) > 0.0; + return Standard_True; + } + + return Standard_False; +} + +#include + +//============================================================================= +//function : buildC3dOnIsoLine +//purpose : +//============================================================================= +Standard_Boolean Approx_CurveOnSurface::buildC3dOnIsoLine(const Handle(Adaptor2d_HCurve2d) theC2D, + const Standard_Boolean theIsU, + const Standard_Real theParam, + const Standard_Boolean theIsForward) +{ + // Convert adapter to the appropriate type. + Handle(GeomAdaptor_HSurface) aGeomAdapter = Handle(GeomAdaptor_HSurface)::DownCast(mySurf); + if (aGeomAdapter.IsNull()) + return Standard_False; + + if (mySurf->GetType() == GeomAbs_Sphere) + return Standard_False; + + // Extract isoline + Handle(Geom_Surface) aSurf = aGeomAdapter->ChangeSurface().Surface(); + Handle(Geom_Curve) aC3d; + + gp_Pnt2d aF2d = theC2D->Value(theC2D->FirstParameter()); + gp_Pnt2d aL2d = theC2D->Value(theC2D->LastParameter()); + + Standard_Boolean isToTrim = Standard_True; + Standard_Real U1, U2, V1, V2; + aSurf->Bounds(U1, U2, V1, V2); + + if (theIsU) + { + Standard_Real aV1Param = Min(aF2d.Y(), aL2d.Y()); + Standard_Real aV2Param = Max(aF2d.Y(), aL2d.Y()); + if (aV2Param < V1 - myTol || aV1Param > V2 + myTol) + { + return Standard_False; + } + else if (Precision::IsInfinite(V1) || Precision::IsInfinite(V2)) + { + if (Abs(aV2Param - aV1Param) < Precision::PConfusion()) + { + return Standard_False; + } + aSurf = new Geom_RectangularTrimmedSurface(aSurf, U1, U2, aV1Param, aV2Param); + isToTrim = Standard_False; + } + else + { + aV1Param = Max(aV1Param, V1); + aV2Param = Min(aV2Param, V2); + if (Abs(aV2Param - aV1Param) < Precision::PConfusion()) + { + return Standard_False; + } + } + aC3d = aSurf->UIso(theParam); + if (isToTrim) + aC3d = new Geom_TrimmedCurve(aC3d, aV1Param, aV2Param); + } + else + { + Standard_Real aU1Param = Min(aF2d.X(), aL2d.X()); + Standard_Real aU2Param = Max(aF2d.X(), aL2d.X()); + if (aU2Param < U1 - myTol || aU1Param > U2 + myTol) + { + return Standard_False; + } + else if (Precision::IsInfinite(U1) || Precision::IsInfinite(U2)) + { + if (Abs(aU2Param - aU1Param) < Precision::PConfusion()) + { + return Standard_False; + } + aSurf = new Geom_RectangularTrimmedSurface(aSurf, aU1Param, aU2Param, V1, V2); + isToTrim = Standard_False; + } + else + { + aU1Param = Max(aU1Param, U1); + aU2Param = Min(aU2Param, U2); + if (Abs(aU2Param - aU1Param) < Precision::PConfusion()) + { + return Standard_False; + } + } + aC3d = aSurf->VIso(theParam); + if (isToTrim) + aC3d = new Geom_TrimmedCurve(aC3d, aU1Param, aU2Param); + } + + // Convert arbitrary curve type to the b-spline. + myCurve3d = GeomConvert::CurveToBSplineCurve(aC3d, Convert_QuasiAngular); + if (!theIsForward) + myCurve3d->Reverse(); + + // Rebuild parameterization for the 3d curve to have the same parameterization with + // a two-dimensional curve. + TColStd_Array1OfReal aKnots = myCurve3d->Knots(); + BSplCLib::Reparametrize(theC2D->FirstParameter(), theC2D->LastParameter(), aKnots); + myCurve3d->SetKnots(aKnots); + + // Evaluate error. + myError3d = 0.0; + + const Standard_Real aParF = myFirst; + const Standard_Real aParL = myLast; + const Standard_Integer aNbPnt = 23; + for(Standard_Integer anIdx = 0; anIdx <= aNbPnt; ++anIdx) + { + const Standard_Real aPar = aParF + ((aParL - aParF) * anIdx) / aNbPnt; + + const gp_Pnt2d aPnt2d = theC2D->Value(aPar); + + const gp_Pnt aPntC3D = myCurve3d->Value(aPar); + const gp_Pnt aPntC2D = mySurf->Value(aPnt2d.X(), aPnt2d.Y()); + + const Standard_Real aSqDeviation = aPntC3D.SquareDistance(aPntC2D); + myError3d = Max(aSqDeviation, myError3d); + } + + myError3d = Sqrt(myError3d); + + // Target tolerance is not obtained. This situation happens for isolines on the sphere. + // OCCT is unable to convert it keeping original parameterization, while the geometric + // form of the result is entirely identical. In that case, it is better to utilize + // a general-purpose approach. + if (myError3d > myTol) + return Standard_False; + + return Standard_True; +} diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_CurveOnSurface.hxx opencascade-7.5.1+dfsg1/src/Approx/Approx_CurveOnSurface.hxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_CurveOnSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_CurveOnSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,9 +40,22 @@ DEFINE_STANDARD_ALLOC - + //! This constructor calls perform method. This constructor is deprecated. + Standard_DEPRECATED("This constructor is deprecated. Use other constructor and perform method instead.") Standard_EXPORT Approx_CurveOnSurface(const Handle(Adaptor2d_HCurve2d)& C2D, const Handle(Adaptor3d_HSurface)& Surf, const Standard_Real First, const Standard_Real Last, const Standard_Real Tol, const GeomAbs_Shape Continuity, const Standard_Integer MaxDegree, const Standard_Integer MaxSegments, const Standard_Boolean Only3d = Standard_False, const Standard_Boolean Only2d = Standard_False); - + + //! This constructor does not call perform method. + //! @param theC2D 2D Curve to be approximated in 3D. + //! @param theSurf Surface where 2D curve is located. + //! @param theFirst First parameter of resulting curve. + //! @param theFirst Last parameter of resulting curve. + //! @param theTol Computation tolerance. + Standard_EXPORT Approx_CurveOnSurface(const Handle(Adaptor2d_HCurve2d)& theC2D, + const Handle(Adaptor3d_HSurface)& theSurf, + const Standard_Real theFirst, + const Standard_Real theLast, + const Standard_Real theTol); + Standard_EXPORT Standard_Boolean IsDone() const; Standard_EXPORT Standard_Boolean HasResult() const; @@ -59,18 +72,64 @@ //! 2d Curve Standard_EXPORT Standard_Real MaxError2dV() const; - - + //! Constructs the 3d curve. Input parameters are ignored when the input curve is + //! U-isoline or V-isoline. + //! @param theMaxSegments Maximal number of segments in the resulting spline. + //! @param theMaxDegree Maximal degree of the result. + //! @param theContinuity Resulting continuity. + //! @param theOnly3d Determines building only 3D curve. + //! @param theOnly2d Determines building only 2D curve. + Standard_EXPORT void Perform(const Standard_Integer theMaxSegments, + const Standard_Integer theMaxDegree, + const GeomAbs_Shape theContinuity, + const Standard_Boolean theOnly3d = Standard_False, + const Standard_Boolean theOnly2d = Standard_False); protected: + //! Checks whether the 2d curve is a isoline. It can be represented by b-spline, bezier, + //! or geometric line. This line should have natural parameterization. + //! @param theC2D Trimmed curve to be checked. + //! @param theIsU Flag indicating that line is u const. + //! @param theParam Line parameter. + //! @param theIsForward Flag indicating forward parameterization on a isoline. + //! @return Standard_True when 2d curve is a line and Standard_False otherwise. + Standard_Boolean isIsoLine(const Handle(Adaptor2d_HCurve2d) theC2D, + Standard_Boolean& theIsU, + Standard_Real& theParam, + Standard_Boolean& theIsForward) const; + + //! Builds 3D curve for a isoline. This method takes corresponding isoline from + //! the input surface. + //! @param theC2D Trimmed curve to be approximated. + //! @param theIsU Flag indicating that line is u const. + //! @param theParam Line parameter. + //! @param theIsForward Flag indicating forward parameterization on a isoline. + //! @return Standard_True when 3d curve is built and Standard_False otherwise. + Standard_Boolean buildC3dOnIsoLine(const Handle(Adaptor2d_HCurve2d) theC2D, + const Standard_Boolean theIsU, + const Standard_Real theParam, + const Standard_Boolean theIsForward); +private: + Approx_CurveOnSurface& operator= (const Approx_CurveOnSurface&); +private: + //! Input curve. + const Handle(Adaptor2d_HCurve2d) myC2D; -private: + //! Input surface. + const Handle(Adaptor3d_HSurface) mySurf; + + //! First parameter of the result. + const Standard_Real myFirst; + //! Last parameter of the result. + const Standard_Real myLast; + //! Tolerance. + Standard_Real myTol; Handle(Geom2d_BSplineCurve) myCurve2d; Handle(Geom_BSplineCurve) myCurve3d; diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_CurvilinearParameter.cxx opencascade-7.5.1+dfsg1/src/Approx/Approx_CurvilinearParameter.cxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_CurvilinearParameter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_CurvilinearParameter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -133,6 +133,8 @@ const GeomAbs_Shape Order, const Standard_Integer MaxDegree, const Standard_Integer MaxSegments) +: myMaxError2d1(0.0), + myMaxError2d2(0.0) { #ifdef OCCT_DEBUG_CHRONO t_total = t_init = t_approx = t_uparam = 0; diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_FitAndDivide2d.hxx opencascade-7.5.1+dfsg1/src/Approx/Approx_FitAndDivide2d.hxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_FitAndDivide2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_FitAndDivide2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,6 +70,12 @@ //! By default inverse order is used. Standard_EXPORT void SetInvOrder(const Standard_Boolean theInvOrder); + //! Set value of hang checking flag + //! if this flag = true, possible hang of algorithm is checked + //! and algorithm is forced to stop. + //! By default hang checking is used. + Standard_EXPORT void SetHangChecking(const Standard_Boolean theHangChecking); + //! returns False if at a moment of the approximation, //! the status NoApproximation has been sent by the user //! when more points were needed. @@ -125,6 +131,7 @@ AppParCurves_Constraint mylastC; Standard_Integer myMaxSegments; Standard_Boolean myInvOrder; + Standard_Boolean myHangChecking; }; diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_FitAndDivide.hxx opencascade-7.5.1+dfsg1/src/Approx/Approx_FitAndDivide.hxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_FitAndDivide.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_FitAndDivide.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,6 +70,12 @@ //! By default inverse order is used. Standard_EXPORT void SetInvOrder(const Standard_Boolean theInvOrder); + //! Set value of hang checking flag + //! if this flag = true, possible hang of algorithm is checked + //! and algorithm is forced to stop. + //! By default hang checking is used. + Standard_EXPORT void SetHangChecking(const Standard_Boolean theHangChecking); + //! returns False if at a moment of the approximation, //! the status NoApproximation has been sent by the user //! when more points were needed. @@ -125,6 +131,7 @@ AppParCurves_Constraint mylastC; Standard_Integer myMaxSegments; Standard_Boolean myInvOrder; + Standard_Boolean myHangChecking; }; diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_ParametrizationType.hxx opencascade-7.5.1+dfsg1/src/Approx/Approx_ParametrizationType.hxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_ParametrizationType.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_ParametrizationType.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,9 +20,9 @@ enum Approx_ParametrizationType { -Approx_ChordLength, -Approx_Centripetal, -Approx_IsoParametric + Approx_ChordLength, //!< parameters of points are proportionate to distances between them + Approx_Centripetal, //!< parameters of points are proportionate to square roots of distances between them + Approx_IsoParametric //!< parameters of points are distributed uniformly }; #endif // _Approx_ParametrizationType_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_SameParameter.cxx opencascade-7.5.1+dfsg1/src/Approx/Approx_SameParameter.cxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_SameParameter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_SameParameter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,7 +14,6 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -// Modified by skv - Wed Jun 2 11:49:59 2004 OCC5898 #include #include @@ -25,22 +24,20 @@ #include #include #include -#include #include #include #include #include #include #include -#include #include #include -#include #include #include #include #include #include +#include //======================================================================= //class : Approx_SameParameter_Evaluator @@ -125,7 +122,7 @@ Standard_Boolean& Status, Standard_Real& Result) { - Standard_Integer num_iter = 0, not_done = 1, ii; + Standard_Integer num_iter = 0, not_done = 1; gp_Pnt a_point; gp_Vec vector, d1, d2; @@ -136,8 +133,7 @@ { num_iter++; Curve.D2(param, a_point, d1, d2); - for (ii = 1 ; ii <= 3 ; ii++) - vector.SetCoord(ii, APoint.Coord(ii) - a_point.Coord(ii)); + vector = gp_Vec(a_point,APoint); func = vector.Dot(d1); if ( Abs(func) < Tolerance * d1.Magnitude()) @@ -189,7 +185,7 @@ d2 = Max(d2, Pc3d.SquareDistance(Pcons)); } - const Standard_Real aMult = 1.5; // To be tolerant to discrete tolerance computing. + const Standard_Real aMult = 1. + 0.05; // Standard_Real aDeviation = aMult * sqrt(d2); aDeviation = Max(aDeviation, Precision::Confusion()); // Tolerance in modeling space. return aDeviation; @@ -199,11 +195,10 @@ //function : Check //purpose : Check current interpolation for validity. //======================================================================= -static Standard_Boolean Check(const TColStd_Array1OfReal& FlatKnots, +static Standard_Boolean Check(const TColStd_Array1OfReal& FlatKnots, const TColStd_Array1OfReal& Poles, const Standard_Integer nbp, - const TColStd_Array1OfReal& pc3d, - const TColStd_Array1OfReal& , + const Standard_Real *pc3d, const Handle(Adaptor3d_HCurve)& c3d, const Adaptor3d_CurveOnSurface& cons, Standard_Real& tol, @@ -217,8 +212,8 @@ // it fixes the bug OCC5898. To develop more or less sensible criterion it is // necessary to deeply investigate this problem which is not possible in frames // of debugging. - Standard_Real aParamFirst = 3.0 * pc3d(1) - 2.0 * pc3d(nbp); - Standard_Real aParamLast = 3.0 * pc3d(nbp) - 2.0 * pc3d(1); + Standard_Real aParamFirst = 3.0 * pc3d[0] - 2.0 * pc3d[nbp - 1]; + Standard_Real aParamLast = 3.0 * pc3d[nbp - 1] - 2.0 * pc3d[0]; Standard_Real FirstPar = cons.FirstParameter(); Standard_Real LastPar = cons.LastParameter(); @@ -227,27 +222,29 @@ if (aParamLast > LastPar) aParamLast = LastPar; - Standard_Real d2 = 0.0; // Maximum square deviation on the samples. const Standard_Real d = tol; const Standard_Integer nn = 2 * nbp; - const Standard_Real unsurnn = 1.0/nn; + const Standard_Real unsurnn = 1.0 / nn; + Standard_Real tprev = aParamFirst; for(Standard_Integer i = 0; i <= nn; i++) { // Compute corresponding parameter on 2d curve. // It should be inside of 3d curve parameter space. Standard_Real t = unsurnn*i; - Standard_Real tc3d = pc3d(1)*(1.-t) + pc3d(nbp)*t; + Standard_Real tc3d = pc3d[0]*(1.0 - t) + pc3d[nbp - 1] * t; // weight function. gp_Pnt Pc3d = c3d->Value(tc3d); Standard_Real tcons; - BSplCLib::Eval(tc3d,Standard_False,0,extrap_mode[0], - aDegree,FlatKnots,1, (Standard_Real&)Poles(1),tcons); - if (tcons < aParamFirst || + BSplCLib::Eval(tc3d, Standard_False, 0, extrap_mode[0], + aDegree, FlatKnots, 1, (Standard_Real&)Poles(1), tcons); + + if (tcons < tprev || tcons > aParamLast) { tol = Precision::Infinite(); return Standard_False; } + tprev = tcons; gp_Pnt Pcons = cons.Value(tcons); Standard_Real temp = Pc3d.SquareDistance(Pcons); if(temp > d2) d2 = temp; @@ -275,7 +272,8 @@ const Handle(Geom2d_Curve)& C2D, const Handle(Geom_Surface)& S, const Standard_Real Tol) -: mySameParameter(Standard_True), +: myDeltaMin(Precision::PConfusion()), + mySameParameter(Standard_True), myDone(Standard_False) { myHCurve2d = new Geom2dAdaptor_HCurve(C2D); @@ -292,7 +290,8 @@ const Handle(Geom2d_Curve)& C2D, const Handle(Adaptor3d_HSurface)& S, const Standard_Real Tol) -: mySameParameter(Standard_True), +: myDeltaMin(Precision::PConfusion()), + mySameParameter(Standard_True), myDone(Standard_False) { myC3d = C3D; @@ -309,7 +308,8 @@ const Handle(Adaptor2d_HCurve2d)& C2D, const Handle(Adaptor3d_HSurface)& S, const Standard_Real Tol) -: mySameParameter(Standard_True), +: myDeltaMin(Precision::PConfusion()), + mySameParameter(Standard_True), myDone(Standard_False) { myC3d = C3D; @@ -324,560 +324,620 @@ //======================================================================= void Approx_SameParameter::Build(const Standard_Real Tolerance) { - const Standard_Real anErrorMAX = 1.0e15; - const Standard_Integer aMaxArraySize = 1000; - const Standard_Integer NCONTROL = 22; - - Standard_Integer ii ; - Adaptor3d_CurveOnSurface CurveOnSurface(myHCurve2d,mySurf); - Standard_Real fcons = CurveOnSurface.FirstParameter(); - Standard_Real lcons = CurveOnSurface.LastParameter(); - Standard_Real fc3d = myC3d->FirstParameter(); - Standard_Real lc3d = myC3d->LastParameter(); - - //Control tangents at the extremities to know if the - //reparametring is possible and calculate the tangents - //at the extremities of the function of change of variable. + // Algorithm: + // 1) Build initial distribution. Increase number of samples in case of C0 continuity. + // 2.1) Check same parameter state on samples. + // 2.2) Compute parameters in 2d space if not same parameter. + // 3) Loop over poles number and try to interpolate 2d curve. + // 4) If loop is failed build 2d curve forcibly or use original pcurve. + Standard_Real qpcons[myMaxArraySize], qnewpcons[myMaxArraySize], + qpc3d[myMaxArraySize], qnewpc3d[myMaxArraySize]; + + // Create and fill data structure. + Approx_SameParameter_Data aData; + aData.myCOnS = Adaptor3d_CurveOnSurface(myHCurve2d,mySurf); + aData.myC2dPF = aData.myCOnS.FirstParameter(); + aData.myC2dPL = aData.myCOnS.LastParameter(); + aData.myC3dPF = myC3d->FirstParameter(); + aData.myC3dPL = myC3d->LastParameter(); + aData.myNbPnt = 0; // No points initially. + aData.myPC2d = qpcons; + aData.myPC3d = qpc3d; + aData.myNewPC2d = qnewpcons; + aData.myNewPC3d = qnewpc3d; + aData.myTol = Tolerance; + + // Build initial distribution. + if (!BuildInitialDistribution(aData)) + { + mySameParameter = Standard_False; + myDone = Standard_False; + return; + } + + // Check same parameter state on distribution. + Standard_Real aMaxSqDeviation = 0.0; + const Standard_Real aPercentOfBadProj = 0.3; + Standard_Integer aNbPnt = aData.myNbPnt - RealToInt(aPercentOfBadProj * aData.myNbPnt); + mySameParameter = CheckSameParameter(aData, aMaxSqDeviation); + if(mySameParameter) + { + myTolReached = ComputeTolReached(myC3d, aData.myCOnS, 2 * myNbSamples); + myDone = Standard_True; + return; + } + else + { + // Control number of sample points after checking sameparameter + // If number of points is less then initial one, it means that there are + // problems with projection + if(aData.myNbPnt < aNbPnt ) + { + myTolReached = ComputeTolReached(myC3d,aData.myCOnS, 2 * myNbSamples); + myCurve2d = Geom2dAdaptor::MakeCurve(myHCurve2d->Curve2d()); + myDone = Standard_False; + return; + } + } + + // Control tangents at the extremities to know if the + // reparametring is possible and calculate the tangents + // at the extremities of the function of change of variable. Standard_Real tangent[2] = { 0.0, 0.0 }; - gp_Pnt Pcons,Pc3d; - gp_Vec Vcons,Vc3d; + if(!ComputeTangents(aData.myCOnS, tangent[0], tangent[1])) + { + // Cannot compute tangents. + mySameParameter = Standard_False; + myDone = Standard_False; + myTolReached = ComputeTolReached(myC3d, aData.myCOnS, 2 * myNbSamples); + return; + } - const Standard_Real Tol = Tolerance; - const Standard_Real Tol2 = Tol * Tol; - Standard_Real deltamin = Precision::PConfusion(); + // There is at least one point where same parameter is broken. + // Try to build B-spline approximation curve using interpolation with degree 3. + // The loop is organized over number of poles. + GeomAbs_Shape aContinuity = myHCurve2d->Continuity(); + if(aContinuity > GeomAbs_C1) aContinuity = GeomAbs_C1; - Standard_Real besttol2 = Tol2; + Standard_Real besttol2 = aData.myTol * aData.myTol, + tolsov = Precision::Infinite(); + Standard_Boolean interpolok = Standard_False, + hasCountChanged = Standard_False; + do + { + // Interpolation data. + Standard_Integer num_knots = aData.myNbPnt + 7; + Standard_Integer num_poles = aData.myNbPnt + 3; + TColStd_Array1OfReal Poles(1, num_poles); + TColStd_Array1OfReal FlatKnots(1 ,num_knots); - // Check tangency on curve border. - Standard_Boolean extrok = 1; - CurveOnSurface.D1(fcons,Pcons,Vcons); - myC3d->D1(fc3d,Pc3d,Vc3d); - Standard_Real dist2 = Pcons.SquareDistance(Pc3d); - Standard_Real dmax2 = dist2; + if (!Interpolate(aData, tangent[0], tangent[1], Poles, FlatKnots)) + { + // Interpolation fails. + mySameParameter = Standard_False; + myDone = Standard_False; + myTolReached = ComputeTolReached(myC3d, aData.myCOnS, 2 * myNbSamples); + return; + } - Standard_Real magVcons = Vcons.Magnitude(); - if (magVcons > 1.e-12) - tangent[0] = Vc3d.Magnitude() / magVcons; - else extrok = 0; + Standard_Real algtol = sqrt(besttol2); + interpolok = Check (FlatKnots, Poles, aData.myNbPnt+1, aData.myPC3d, + myC3d, aData.myCOnS, algtol, tolsov); + tolsov = algtol; - CurveOnSurface.D1(lcons,Pcons,Vcons); - myC3d->D1(lc3d,Pc3d,Vc3d); - dist2 = Pcons.SquareDistance(Pc3d); + // Try to build 2d curve and check it for validity. + if(interpolok) + { + Standard_Real besttol = sqrt(besttol2); - dmax2 = Max(dmax2, dist2); - magVcons = Vcons.Magnitude(); - if (magVcons > 1.e-12) - tangent[1] = Vc3d.Magnitude() / magVcons; - else extrok = 0; - - - //Take a multiple of the sample pof CheckShape, - //at least the control points will be correct. No comment!!! - - Standard_Boolean interpolok = 0; - Standard_Real tolsov = 1.e200; - //Take parameters with constant step on the curve on surface - //and on curve 3d. - Standard_Real deltacons = lcons - fcons; - deltacons /= (NCONTROL); - Standard_Real deltac3d = lc3d - fc3d; - deltac3d /= (NCONTROL); - - Standard_Real wcons = fcons; - Standard_Real wc3d = fc3d; - - Standard_Real qpcons[aMaxArraySize], qnewpcons[aMaxArraySize], - qpc3d[aMaxArraySize], qnewpc3d[aMaxArraySize]; - Standard_Real * pcons = qpcons; Standard_Real * newpcons = qnewpcons; - Standard_Real * pc3d = qpc3d; Standard_Real * newpc3d = qnewpc3d; - - for ( ii = 0 ; ii < NCONTROL; ii++) { - pcons[ii] = wcons; - pc3d[ii] = wc3d; - wcons += deltacons; - wc3d += deltac3d; - } - pcons[NCONTROL] = lcons; - pc3d[NCONTROL] = lc3d; + Handle(TColStd_HArray1OfReal) tol1d,tol2d,tol3d; + tol1d = new TColStd_HArray1OfReal(1,2); + tol1d->SetValue(1, mySurf->UResolution(besttol)); + tol1d->SetValue(2, mySurf->VResolution(besttol)); - // Change number of points in case of C0 continuity. - Standard_Integer New_NCONTROL = NCONTROL; - GeomAbs_Shape Continuity = myHCurve2d->Continuity(); - if(Continuity > GeomAbs_C1) Continuity = GeomAbs_C1; - if(Continuity < GeomAbs_C1) - { - Standard_Integer NbInt = myHCurve2d->NbIntervals(GeomAbs_C1) + 1; - TColStd_Array1OfReal Param_de_decoupeC1 (1, NbInt); - myHCurve2d->Intervals(Param_de_decoupeC1, GeomAbs_C1); - TColStd_SequenceOfReal new_par; - Standard_Integer inter = 1; - ii =1; - new_par.Append(fcons); - - while(inter <= NbInt && Param_de_decoupeC1(inter) <= fcons + deltamin) inter++; - while(NbInt > 0 && Param_de_decoupeC1(NbInt) >= lcons - deltamin) NbInt--; - - while(inter <= NbInt || (ii < NCONTROL && inter <= Param_de_decoupeC1.Length()) ) { - if(Param_de_decoupeC1(inter) < pcons[ii]) { - new_par.Append(Param_de_decoupeC1(inter)); - if((pcons[ii] - Param_de_decoupeC1(inter)) <= deltamin) { - ii++; - if(ii > NCONTROL) {ii = NCONTROL;} + Approx_SameParameter_Evaluator ev (FlatKnots, Poles, myHCurve2d); + Standard_Integer aMaxDeg = 11, aMaxSeg = 1000; + AdvApprox_ApproxAFunction anApproximator(2,0,0,tol1d,tol2d,tol3d,aData.myC3dPF,aData.myC3dPL, + aContinuity,aMaxDeg,aMaxSeg,ev); + + if (anApproximator.IsDone() || anApproximator.HasResult()) + { + Adaptor3d_CurveOnSurface ACS = aData.myCOnS; + GeomLib_MakeCurvefromApprox aCurveBuilder(anApproximator); + Handle(Geom2d_BSplineCurve) aC2d = aCurveBuilder.Curve2dFromTwo1d(1,2); + Handle(Adaptor2d_HCurve2d) aHCurve2d = new Geom2dAdaptor_HCurve(aC2d); + aData.myCOnS.Load(aHCurve2d); + myTolReached = ComputeTolReached(myC3d,aData.myCOnS, 2 * myNbSamples); + + const Standard_Real aMult = 250.0; // To be tolerant with discrete tolerance. + if (myTolReached < aMult * besttol ) + { + myCurve2d = aC2d; + myHCurve2d = aHCurve2d; + myDone = Standard_True; + break; } - inter++; - } - else { - if((Param_de_decoupeC1(inter) - pcons[ii]) > deltamin) { - new_par.Append(pcons[ii]); + else if(aData.myNbPnt < myMaxArraySize - 1) + { + interpolok = Standard_False; + aData.myCOnS = ACS; + } + else + { + break; } - ii++; } } - new_par.Append(lcons); - New_NCONTROL = new_par.Length() - 1; - // Simple protection if New_NCONTROL > allocated elements in array but one - // aMaxArraySize - 1 index may be filled after projection. - if (New_NCONTROL > aMaxArraySize - 1) { - mySameParameter = Standard_False; + if (!interpolok) + hasCountChanged = IncreaseNbPoles(Poles, FlatKnots, aData, besttol2); + + } while(!interpolok && hasCountChanged); + + if (!myDone) + { + // Loop is finished unsuccessfully. Fix tolerance by maximal deviation, + // using data from the last loop iteration or initial data. Use data set with minimal deflection. + + // Original 2d curve. + aData.myCOnS.Load(myHCurve2d); + myTolReached = ComputeTolReached(myC3d,aData.myCOnS, 2 * myNbSamples); + myCurve2d = Geom2dAdaptor::MakeCurve(myHCurve2d->Curve2d()); + + // Approximation curve. + Standard_Integer num_knots = aData.myNbPnt + 7; + Standard_Integer num_poles = aData.myNbPnt + 3; + TColStd_Array1OfReal Poles(1, num_poles); + TColStd_Array1OfReal FlatKnots(1 ,num_knots); + + Interpolate(aData, tangent[0], tangent[1], + Poles, FlatKnots); + + Standard_Real besttol = sqrt(besttol2); + Handle(TColStd_HArray1OfReal) tol1d,tol2d,tol3d; + tol1d = new TColStd_HArray1OfReal(1,2) ; + tol1d->SetValue(1, mySurf->UResolution(besttol)); + tol1d->SetValue(2, mySurf->VResolution(besttol)); + + Approx_SameParameter_Evaluator ev(FlatKnots, Poles, myHCurve2d); + AdvApprox_ApproxAFunction anApproximator(2,0,0,tol1d,tol2d,tol3d,aData.myC3dPF,aData.myC3dPL, + aContinuity,11,40,ev); + + if (!anApproximator.IsDone() && + !anApproximator.HasResult() ) + { + myDone = Standard_False; return; } - for(ii = 1; ii <= New_NCONTROL; ii++){ - pcons[ii] = pc3d[ii] = new_par.Value(ii + 1); + + GeomLib_MakeCurvefromApprox aCurveBuilder(anApproximator); + Handle(Geom2d_BSplineCurve) aC2d = aCurveBuilder.Curve2dFromTwo1d(1,2); + Handle(Adaptor2d_HCurve2d) aHCurve2d = new Geom2dAdaptor_HCurve(aC2d); + aData.myCOnS.Load(aHCurve2d); + + Standard_Real anApproxTol = ComputeTolReached(myC3d,aData.myCOnS,2 * myNbSamples); + if (anApproxTol < myTolReached) + { + myTolReached = anApproxTol; + myCurve2d = aC2d; + myHCurve2d = aHCurve2d; } - pc3d[New_NCONTROL] = lc3d; + myDone = Standard_True; } +} - // Check existing same parameter state. - Extrema_LocateExtPC Projector; - Projector.Initialize(myC3d->Curve(),fc3d,lc3d,Tol); +//======================================================================= +//function : BuildInitialDistribution +//purpose : Sub-method in Build. +//======================================================================= +Standard_Boolean Approx_SameParameter::BuildInitialDistribution(Approx_SameParameter_Data &theData) const +{ + // Take a multiple of the sample pof CheckShape, + // at least the control points will be correct. + // Take parameters with constant step on the curve on surface + // and on curve 3d. + const Standard_Real deltacons = (theData.myC2dPL - theData.myC2dPF) / myNbSamples; + const Standard_Real deltac3d = (theData.myC3dPL - theData.myC3dPF) / myNbSamples; + Standard_Real wcons = theData.myC2dPF; + Standard_Real wc3d = theData.myC3dPF; + for (Standard_Integer ii = 0 ; ii < myNbSamples; ii++) + { + theData.myPC2d[ii] = wcons; + theData.myPC3d[ii] = wc3d; + wcons += deltacons; + wc3d += deltac3d; + } + theData.myNbPnt = myNbSamples; + theData.myPC2d[theData.myNbPnt] = theData.myC2dPL; + theData.myPC3d[theData.myNbPnt] = theData.myC3dPL; - Standard_Integer count = 1; - Standard_Real previousp = fc3d, initp=0, curp; - Standard_Real bornesup = lc3d - deltamin; - Standard_Boolean projok = 0, - use_parameter ; - for (ii = 1; ii < New_NCONTROL; ii++){ - CurveOnSurface.D0(pcons[ii],Pcons); - myC3d->D0(pc3d[ii],Pc3d); - dist2 = Pcons.SquareDistance(Pc3d); - use_parameter = (dist2 <= Tol2 && (pc3d[ii] > pc3d[count-1] + deltamin)) ; - Standard_Real aDistMin = RealLast();; - if(use_parameter) { - - if(dist2 > dmax2) dmax2 = dist2; - initp = previousp = pc3d[count] = pc3d[ii]; - pcons[count] = pcons[ii]; - count++; - + // Change number of points in case of C0 continuity. + GeomAbs_Shape Continuity = myHCurve2d->Continuity(); + if(Continuity < GeomAbs_C1) + { + if (!IncreaseInitialNbSamples(theData)) + { + // Number of samples is too big. + return Standard_False; } - else { - if(!projok) initp = pc3d[ii]; - projok = mySameParameter = Standard_False; - Projector.Perform(Pcons, initp); - if (Projector.IsDone()) { - curp = Projector.Point().Parameter(); - Standard_Real dist_2 = Projector.SquareDistance(); - projok = Standard_True; - aDistMin = dist_2; - } - else - { - ProjectPointOnCurve(initp,Pcons,Tol,30,myC3d->Curve(),projok,curp); - if(projok) - { - const gp_Pnt& ap1 =myC3d->Value(curp); - aDistMin = Pcons.SquareDistance(ap1); - } - } - projok = (projok && (curp > previousp + deltamin && curp < bornesup)); - if(projok) - { - initp = previousp = pc3d[count] = curp; - pcons[count] = pcons[ii]; - count++; - - } - else + } + + return Standard_True; +} + +//======================================================================= +//function : IncreaseInitialNbSamples +//purpose : Get number of C1 intervals and build new distribution on them. +// Sub-method in BuildInitialDistribution. +//======================================================================= +Standard_Boolean Approx_SameParameter::IncreaseInitialNbSamples(Approx_SameParameter_Data &theData) const +{ + Standard_Integer NbInt = myHCurve2d->NbIntervals(GeomAbs_C1) + 1; + TColStd_Array1OfReal aC1Intervals (1, NbInt); + myHCurve2d->Intervals(aC1Intervals, GeomAbs_C1); + + Standard_Integer inter = 1; + while(inter <= NbInt && aC1Intervals(inter) <= theData.myC3dPF + myDeltaMin) inter++; + while(NbInt > 0 && aC1Intervals(NbInt) >= theData.myC3dPL - myDeltaMin) NbInt--; + + // Compute new parameters. + TColStd_SequenceOfReal aNewPar; + aNewPar.Append(theData.myC3dPF); + Standard_Integer ii = 1; + while(inter <= NbInt || (ii < myNbSamples && inter <= aC1Intervals.Length()) ) + { + if(aC1Intervals(inter) < theData.myPC2d[ii]) + { + aNewPar.Append(aC1Intervals(inter)); + if((theData.myPC2d[ii] - aC1Intervals(inter)) <= myDeltaMin) { - Extrema_ExtPC PR(Pcons,myC3d->Curve(),fc3d,lc3d,Tol); - if(PR.IsDone()) + ii++; + if(ii > myNbSamples) { - const Standard_Integer aNbExt = PR.NbExt(); - if(aNbExt > 0) - { - Standard_Integer anIndMin = 0; - Standard_Real aCurDistMin = RealLast(); - for(Standard_Integer i = 1; i <= aNbExt; i++) - { - const gp_Pnt &aP = PR.Point(i).Value(); - Standard_Real aDist2 = aP.SquareDistance(Pcons); - if(aDist2 < aCurDistMin) - { - aCurDistMin = aDist2; - anIndMin = i; - } - } - if(anIndMin) - { - curp = PR.Point(anIndMin).Parameter(); - if( curp > previousp + deltamin && curp < bornesup) - { - aDistMin = aCurDistMin; - initp = previousp = pc3d[count] = curp; - pcons[count] = pcons[ii]; - count++; - projok = Standard_True; - - } - } - - } + ii = myNbSamples; } } - if(projok && besttol2 < aDistMin) - besttol2 = aDistMin; - - else if(!projok) + inter++; + } + else + { + if((aC1Intervals(inter) - theData.myPC2d[ii]) > myDeltaMin) { - //Projector -#ifdef OCCT_DEBUG - std::cout << "Projection not done" << std::endl; -#endif + aNewPar.Append(theData.myPC2d[ii]); } + ii++; } } - - if(mySameParameter){ - myTolReached = 1.5*sqrt(dmax2); - return; + // Simple protection if theNewNbPoints > allocated elements in array but one + // myMaxArraySize - 1 index may be filled after projection. + theData.myNbPnt = aNewPar.Length(); + if (theData.myNbPnt > myMaxArraySize - 1) + { + return Standard_False; } - if(!extrok) + for(ii = 1; ii < theData.myNbPnt; ii++) { - // If not already SameP and tangent to mill, abandon. - mySameParameter = Standard_False; -#ifdef OCCT_DEBUG - std::cout<<"SameParameter problem : zero tangent to extremities"<D0(theData.myC3dPF, Pc3d); + Standard_Real dist2 = Pcons.SquareDistance(Pc3d); + Standard_Real dmax2 = dist2; + + theData.myCOnS.D0(theData.myC2dPL, Pcons); + myC3d->D0(theData.myC3dPL, Pc3d); + dist2 = Pcons.SquareDistance(Pc3d); + dmax2 = Max(dmax2, dist2); + + Extrema_LocateExtPC Projector; + Projector.Initialize(myC3d->Curve(), theData.myC3dPF, theData.myC3dPL, theData.myTol); + + Standard_Integer count = 1; + Standard_Real previousp = theData.myC3dPF, initp=0, curp; + Standard_Real bornesup = theData.myC3dPL - myDeltaMin; + Standard_Boolean isProjOk = Standard_False; + for (Standard_Integer ii = 1; ii < theData.myNbPnt; ii++) { - // The tables and their limits for the interpolation. - Standard_Integer num_knots = count + 7; - Standard_Integer num_poles = count + 3; - TColStd_Array1OfReal Paramc3d(*pc3d,1,count+1); - TColStd_Array1OfReal Paramcons(*pcons,1,count+1); - TColStd_Array1OfInteger ContactOrder(1,num_poles) ; - TColStd_Array1OfReal Poles(1,num_poles) ; - TColStd_Array1OfReal InterpolationParameters(1,num_poles) ; - TColStd_Array1OfReal FlatKnots(1,num_knots) ; - - // Fill tables taking attention to end values. - ContactOrder.Init(0); - ContactOrder(2) = ContactOrder(num_poles - 1) = 1; - - FlatKnots(1) = FlatKnots(2) = FlatKnots(3) = FlatKnots(4) = fc3d; - FlatKnots(num_poles + 1) = FlatKnots(num_poles + 2) = - FlatKnots(num_poles + 3) = FlatKnots(num_poles + 4) = lc3d; - - Poles(1) = fcons; Poles(num_poles) = lcons; - Poles(2) = tangent[0]; Poles(num_poles - 1) = tangent[1]; - - InterpolationParameters(1) = InterpolationParameters(2) = fc3d; - InterpolationParameters(num_poles - 1) = InterpolationParameters(num_poles) = lc3d; - - for (ii = 3; ii <= num_poles - 2; ii++) { - Poles(ii) = Paramcons(ii - 1); - InterpolationParameters(ii) = FlatKnots(ii+2) = Paramc3d(ii - 1); - } - Standard_Integer inversion_problem; - BSplCLib::Interpolate(3,FlatKnots,InterpolationParameters,ContactOrder, - 1,Poles(1),inversion_problem); - if(inversion_problem) { - throw Standard_ConstructionError(); - } - - // Test if par2d(par3d) is monotonous function or not ----- IFV, Jan 2000 - // and try to insert new point to improve BSpline interpolation - - Standard_Integer extrap_mode[2] ; - extrap_mode[0] = extrap_mode[1] = 3; - Standard_Real eval_result[2] ; - Standard_Integer DerivativeRequest = 0; - Standard_Real *PolesArray = - (Standard_Real *) &Poles(Poles.Lower()) ; - - Standard_Integer newcount = 0; - for (ii = 0; ii < count; ii++) { - - newpcons[newcount] = pcons[ii]; - newpc3d[newcount] = pc3d[ii]; - newcount++; - - if(count - ii + newcount == aMaxArraySize) continue; - - BSplCLib::Eval(.5*(pc3d[ii]+pc3d[ii+1]), Standard_False, DerivativeRequest, - extrap_mode[0], 3, FlatKnots, 1, PolesArray[0], eval_result[0]); - - if(eval_result[0] < pcons[ii] || eval_result[0] > pcons[ii+1]) { - Standard_Real ucons = 0.5*(pcons[ii]+pcons[ii+1]); - Standard_Real uc3d = 0.5*(pc3d[ii]+pc3d[ii+1]); - - CurveOnSurface.D0(ucons,Pcons); - Projector.Perform(Pcons, uc3d); - if (Projector.IsDone()) { - curp = Projector.Point().Parameter(); - Standard_Real dist_2 = Projector.SquareDistance(); - if(dist_2 > besttol2) besttol2 = dist_2; - projok = 1; - } - else { - ProjectPointOnCurve(uc3d,Pcons,Tol,30,myC3d->Curve(),projok,curp); - } - if(projok){ - if(curp > pc3d[ii] + deltamin && curp < pc3d[ii+1] - deltamin){ - newpc3d[newcount] = curp; - newpcons[newcount] = ucons; - newcount ++; - } - } - else { -#ifdef OCCT_DEBUG - std::cout << "Projection not done" << std::endl; -#endif - } - } + theData.myCOnS.D0(theData.myPC2d[ii],Pcons); + myC3d->D0(theData.myPC3d[ii],Pc3d); + dist2 = Pcons.SquareDistance(Pc3d); + // Same parameter point. + Standard_Boolean isUseParam = (dist2 <= Tol2 && // Good distance. + (theData.myPC3d[ii] > theData.myPC3d[count-1] + myDeltaMin)); // Point is separated from previous. + if(isUseParam) + { + if(dmax2 < dist2) + dmax2 = dist2; + initp = previousp = theData.myPC3d[count] = theData.myPC3d[ii]; + theData.myPC2d[count] = theData.myPC2d[ii]; + count++; + continue; } - newpc3d[newcount] = pc3d[count]; - newpcons[newcount] = pcons[count]; - Standard_Real * temp; - temp = pc3d; - pc3d = newpc3d; - newpc3d = temp; - temp = pcons; - pcons = newpcons; - newpcons = temp; - - if((count != newcount) && newcount < aMaxArraySize) + // Local search: local extrema and iterative projection algorithm. + if(!isProjOk) + initp = theData.myPC3d[ii]; + isProjOk = isSameParam = Standard_False; + Projector.Perform(Pcons, initp); + if (Projector.IsDone()) + { + // Local extrema is found. + curp = Projector.Point().Parameter(); + isProjOk = Standard_True; + } + else + { + ProjectPointOnCurve(initp,Pcons,theData.myTol,30,myC3d->Curve(),isProjOk,curp); + } + isProjOk = isProjOk && // Good projection. + curp > previousp + myDeltaMin && // Point is separated from previous. + curp < bornesup; // Inside of parameter space. + if(isProjOk) { - hasCountChanged = Standard_True; - count = newcount; + initp = previousp = theData.myPC3d[count] = curp; + theData.myPC2d[count] = theData.myPC2d[ii]; + count++; continue; } - count = newcount; + // Whole parameter space search using general extrema. + Extrema_ExtPC PR(Pcons,myC3d->Curve(),theData.myC3dPF, theData.myC3dPL,theData.myTol); + if (!PR.IsDone() || PR.NbExt() == 0) // Lazy evaluation is used. + continue; - Standard_Real algtol = sqrt(besttol2); + const Standard_Integer aNbExt = PR.NbExt(); + Standard_Integer anIndMin = 0; + Standard_Real aCurDistMin = RealLast(); + for(Standard_Integer i = 1; i <= aNbExt; i++) + { + const gp_Pnt &aP = PR.Point(i).Value(); + Standard_Real aDist2 = aP.SquareDistance(Pcons); + if(aDist2 < aCurDistMin) + { + aCurDistMin = aDist2; + anIndMin = i; + } + } + if(anIndMin) + { + curp = PR.Point(anIndMin).Parameter(); + if( curp > previousp + myDeltaMin && curp < bornesup) + { + initp = previousp = theData.myPC3d[count] = curp; + theData.myPC2d[count] = theData.myPC2d[ii]; + count++; + isProjOk = Standard_True; + } + } + } + theData.myNbPnt = count; + theData.myPC2d[theData.myNbPnt] = theData.myC2dPL; + theData.myPC3d[theData.myNbPnt] = theData.myC3dPL; - interpolok = Check (FlatKnots, Poles, count+1, Paramc3d, Paramcons, - myC3d, CurveOnSurface, algtol, tolsov); + theSqDist = dmax2; + return isSameParam; +} - if (Precision::IsInfinite(algtol)) { - mySameParameter = Standard_False; -#ifdef OCCT_DEBUG - std::cout<<"SameParameter problem : function of interpolation of parametration at mills !!"<FirstParameter(); + theCOnS.D1(aParamFirst, aPntCOnS, aVecConS); + myC3d->D1(aParamFirst, aPnt, aVec); + Standard_Real aMagnitude = aVecConS.Magnitude(); + if (aMagnitude > aSmallMagnitude) + theFirstTangent = aVec.Magnitude() / aMagnitude; + else + return Standard_False; + + // Last point. + const Standard_Real aParamLast = myC3d->LastParameter(); + theCOnS.D1(aParamLast,aPntCOnS,aVecConS); + myC3d->D1(aParamLast, aPnt, aVec); + + aMagnitude = aVecConS.Magnitude(); + if (aMagnitude > aSmallMagnitude) + theLastTangent = aVec.Magnitude() / aMagnitude; + else + return Standard_False; - interpolok = (interpolok || // Good result. - count >= aMaxArraySize - 1 ); // Number of points. + return Standard_True; +} - if(interpolok) { - Standard_Real besttol = sqrt(besttol2); +//======================================================================= +//function : Interpolate +//purpose : Sub-method in Build. +//======================================================================= +Standard_Boolean Approx_SameParameter::Interpolate(const Approx_SameParameter_Data & theData, + const Standard_Real aTangFirst, + const Standard_Real aTangLast, + TColStd_Array1OfReal & thePoles, + TColStd_Array1OfReal & theFlatKnots) const +{ + Standard_Integer num_poles = theData.myNbPnt + 3; + TColStd_Array1OfInteger ContactOrder(1,num_poles); + TColStd_Array1OfReal aParameters(1, num_poles); - Handle(TColStd_HArray1OfReal) tol1d,tol2d,tol3d; - tol1d = new TColStd_HArray1OfReal(1,2) ; - tol1d->SetValue(1, mySurf->UResolution(besttol)); - tol1d->SetValue(2, mySurf->VResolution(besttol)); + // Fill tables taking attention to end values. + ContactOrder.Init(0); + ContactOrder(2) = ContactOrder(num_poles - 1) = 1; - Approx_SameParameter_Evaluator ev (FlatKnots, Poles, myHCurve2d); - AdvApprox_ApproxAFunction anApproximator(2,0,0,tol1d,tol2d,tol3d,fc3d,lc3d, - Continuity,11,40,ev); - - if (anApproximator.IsDone() || anApproximator.HasResult()) { - Adaptor3d_CurveOnSurface ACS = CurveOnSurface; - GeomLib_MakeCurvefromApprox aCurveBuilder(anApproximator) ; - Handle(Geom2d_BSplineCurve) aC2d = aCurveBuilder.Curve2dFromTwo1d(1,2) ; - Handle(Adaptor2d_HCurve2d) aHCurve2d = new Geom2dAdaptor_HCurve(aC2d); - CurveOnSurface.Load(aHCurve2d); + theFlatKnots(1) = theFlatKnots(2) = theFlatKnots(3) = theFlatKnots(4) = theData.myC3dPF; + theFlatKnots(num_poles + 1) = theFlatKnots(num_poles + 2) = + theFlatKnots(num_poles + 3) = theFlatKnots(num_poles + 4) = theData.myC3dPL; - myTolReached = ComputeTolReached(myC3d,CurveOnSurface,NCONTROL); + thePoles(1) = theData.myC2dPF; thePoles(num_poles) = theData.myC2dPL; + thePoles(2) = aTangFirst; thePoles(num_poles - 1) = aTangLast; - if(myTolReached > anErrorMAX) - { - //This tolerance is too big. Probably, we will not be able to get - //edge with sameparameter in this case. + aParameters(1) = aParameters(2) = theData.myC3dPF; + aParameters(num_poles - 1) = aParameters(num_poles) = theData.myC3dPL; - myDone = Standard_False; - return; - } + for (Standard_Integer ii = 3; ii <= num_poles - 2; ii++) + { + thePoles(ii) = theData.myPC2d[ii - 2]; + aParameters(ii) = theFlatKnots(ii+2) = theData.myPC3d[ii - 2]; + } + Standard_Integer inversion_problem; + BSplCLib::Interpolate(3,theFlatKnots,aParameters,ContactOrder, + 1,thePoles(1),inversion_problem); + if(inversion_problem) + { + return Standard_False; + } - if( (myTolReached < 250.0*besttol) || - (count >= aMaxArraySize-2) || - !hasCountChanged) //if count does not change after adding new point - //(else we can have circularity) - { - myCurve2d = aC2d; - myHCurve2d = aHCurve2d; - myDone = Standard_True; - } - else - { - interpolok = Standard_False; - CurveOnSurface = ACS; - } - } - } - - if(!interpolok) - { + return Standard_True; +} - newcount = 0; - for(Standard_Integer n = 0; n < count; n++){ - newpc3d[newcount] = pc3d[n]; - newpcons[newcount] = pcons[n]; - newcount ++; +//======================================================================= +//function : IncreaseNbPoles +//purpose : Sub-method in Build. +//======================================================================= +Standard_Boolean Approx_SameParameter::IncreaseNbPoles(const TColStd_Array1OfReal & thePoles, + const TColStd_Array1OfReal & theFlatKnots, + Approx_SameParameter_Data & theData, + Standard_Real &theBestSqTol) const +{ + Extrema_LocateExtPC Projector; + Projector.Initialize(myC3d->Curve(), myC3d->FirstParameter(), myC3d->LastParameter(), theData.myTol); + Standard_Real curp = 0.0; + Standard_Boolean projok = Standard_False; - if(count - n + newcount == aMaxArraySize) continue; + // Project middle point to fix parameterization and check projection existence. + const Standard_Integer aDegree = 3; + const Standard_Integer DerivativeRequest = 0; + Standard_Integer extrap_mode[2] = {aDegree, aDegree}; + Standard_Real eval_result; + Standard_Real *PolesArray = (Standard_Real *) &thePoles(thePoles.Lower()); + Standard_Integer newcount = 0; + for (Standard_Integer ii = 0; ii < theData.myNbPnt; ii++) + { + theData.myNewPC2d[newcount] = theData.myPC2d[ii]; + theData.myNewPC3d[newcount] = theData.myPC3d[ii]; + newcount++; - Standard_Real ucons = 0.5*(pcons[n]+pcons[n+1]); - Standard_Real uc3d = 0.5*(pc3d[n]+pc3d[n+1]); + if(theData.myNbPnt - ii + newcount == myMaxArraySize) continue; - CurveOnSurface.D0(ucons,Pcons); - Projector.Perform(Pcons, uc3d); - if (Projector.IsDone()) { - curp = Projector.Point().Parameter(); - Standard_Real dist_2 = Projector.SquareDistance(); - if(dist_2 > besttol2) besttol2 = dist_2; - projok = 1; - } - else { - ProjectPointOnCurve(uc3d,Pcons,Tol,30,myC3d->Curve(),projok,curp); - } - if(projok){ - if(curp > pc3d[n] + deltamin && curp < pc3d[n+1] - deltamin){ - newpc3d[newcount] = curp; - newpcons[newcount] = ucons; - newcount ++; - } - } - else { -#ifdef OCCT_DEBUG - std::cout << "Projection not done" << std::endl; -#endif - } - } - newpc3d[newcount] = pc3d[count]; - newpcons[newcount] = pcons[count]; - Standard_Real * tempx; - tempx = pc3d; - pc3d = newpc3d; - newpc3d = tempx; - tempx = pcons; - pcons = newpcons; - newpcons = tempx; - - if(count != newcount) + BSplCLib::Eval(0.5*(theData.myPC3d[ii]+theData.myPC3d[ii+1]), Standard_False, DerivativeRequest, + extrap_mode[0], 3, theFlatKnots, 1, PolesArray[0], eval_result); + + if(eval_result < theData.myPC2d[ii] || eval_result > theData.myPC2d[ii+1]) + { + Standard_Real ucons = 0.5*(theData.myPC2d[ii]+theData.myPC2d[ii+1]); + Standard_Real uc3d = 0.5*(theData.myPC3d[ii]+theData.myPC3d[ii+1]); + + gp_Pnt Pcons; + theData.myCOnS.D0(ucons,Pcons); + Projector.Perform(Pcons, uc3d); + if (Projector.IsDone()) { - count = newcount; - hasCountChanged = Standard_True; + curp = Projector.Point().Parameter(); + Standard_Real dist_2 = Projector.SquareDistance(); + if(dist_2 > theBestSqTol) theBestSqTol = dist_2; + projok = 1; } else { - hasCountChanged = Standard_False; + ProjectPointOnCurve(uc3d,Pcons,theData.myTol,30,myC3d->Curve(),projok,curp); + } + if(projok) + { + if(curp > theData.myPC3d[ii] + myDeltaMin && curp < theData.myPC3d[ii+1] - myDeltaMin) + { + theData.myNewPC3d[newcount] = curp; + theData.myNewPC2d[newcount] = ucons; + newcount ++; + } } } - } while(!interpolok && hasCountChanged); + } // for (ii = 0; ii < count; ii++) + theData.myNewPC3d[newcount] = theData.myPC3d[theData.myNbPnt]; + theData.myNewPC2d[newcount] = theData.myPC2d[theData.myNbPnt]; - if (!myDone) + if((theData.myNbPnt != newcount) && newcount < myMaxArraySize - 1) { - // Loop is finished unsuccessfully. Fix tolerance by maximal deviation, - // using data from the last loop iteration. - Standard_Integer num_knots = count + 7; - Standard_Integer num_poles = count + 3; - TColStd_Array1OfReal Paramc3d(*pc3d,1,count + 1); - TColStd_Array1OfReal Paramcons(*pcons,1,count + 1); - TColStd_Array1OfInteger ContactOrder(1,num_poles) ; - TColStd_Array1OfReal Poles(1,num_poles) ; - TColStd_Array1OfReal InterpolationParameters(1,num_poles) ; - TColStd_Array1OfReal FlatKnots(1,num_knots) ; - - // Fill tables taking attention to end values. - ContactOrder.Init(0); - ContactOrder(2) = ContactOrder(num_poles - 1) = 1; - - FlatKnots(1) = FlatKnots(2) = FlatKnots(3) = FlatKnots(4) = fc3d; - FlatKnots(num_poles + 1) = FlatKnots(num_poles + 2) = - FlatKnots(num_poles + 3) = FlatKnots(num_poles + 4) = lc3d; - - Poles(1) = fcons; Poles(num_poles) = lcons; - Poles(2) = tangent[0]; Poles(num_poles - 1) = tangent[1]; - - InterpolationParameters(1) = InterpolationParameters(2) = fc3d; - InterpolationParameters(num_poles - 1) = InterpolationParameters(num_poles) = lc3d; - - for (ii = 3; ii <= num_poles - 2; ii++) - { - Poles(ii) = Paramcons(ii - 1); - InterpolationParameters(ii) = FlatKnots(ii+2) = Paramc3d(ii - 1); - } - Standard_Integer inversion_problem; - BSplCLib::Interpolate(3,FlatKnots,InterpolationParameters,ContactOrder, - 1,Poles(1),inversion_problem); - if(inversion_problem) + // Distribution is changed. + theData.Swap(newcount); + return Standard_True; + } + + // Increase number of samples in two times. + newcount = 0; + for(Standard_Integer n = 0; n < theData.myNbPnt; n++) + { + theData.myNewPC3d[newcount] = theData.myPC3d[n]; + theData.myNewPC2d[newcount] = theData.myPC2d[n]; + newcount ++; + + if(theData.myNbPnt - n + newcount == myMaxArraySize) continue; + + Standard_Real ucons = 0.5*(theData.myPC2d[n]+theData.myPC2d[n+1]); + Standard_Real uc3d = 0.5*(theData.myPC3d[n]+theData.myPC3d[n+1]); + + gp_Pnt Pcons; + theData.myCOnS.D0(ucons,Pcons); + Projector.Perform(Pcons, uc3d); + if (Projector.IsDone()) { - throw Standard_ConstructionError(); + curp = Projector.Point().Parameter(); + Standard_Real dist_2 = Projector.SquareDistance(); + if(dist_2 > theBestSqTol) theBestSqTol = dist_2; + projok = 1; } - - Standard_Real besttol = sqrt(besttol2); - Handle(TColStd_HArray1OfReal) tol1d,tol2d,tol3d; - tol1d = new TColStd_HArray1OfReal(1,2) ; - tol1d->SetValue(1, mySurf->UResolution(besttol)); - tol1d->SetValue(2, mySurf->VResolution(besttol)); - - Approx_SameParameter_Evaluator ev (FlatKnots, Poles, myHCurve2d); - AdvApprox_ApproxAFunction anApproximator(2,0,0,tol1d,tol2d,tol3d,fc3d,lc3d, - Continuity,11,40,ev); - - if (!anApproximator.IsDone() && - !anApproximator.HasResult() ) + else { - myDone = Standard_False; - return; + ProjectPointOnCurve(uc3d,Pcons,theData.myTol,30,myC3d->Curve(),projok,curp); } - - GeomLib_MakeCurvefromApprox aCurveBuilder(anApproximator) ; - Handle(Geom2d_BSplineCurve) aC2d = aCurveBuilder.Curve2dFromTwo1d(1,2) ; - Handle(Adaptor2d_HCurve2d) aHCurve2d = new Geom2dAdaptor_HCurve(aC2d); - CurveOnSurface.Load(aHCurve2d); - - myTolReached = ComputeTolReached(myC3d,CurveOnSurface,NCONTROL); - - if(myTolReached > anErrorMAX) + if(projok) { - //This tolerance is too big. Probably, we will not be able to get - //edge with sameparameter in this case. - myDone = Standard_False; - return; + if(curp > theData.myPC3d[n] + myDeltaMin && curp < theData.myPC3d[n+1] - myDeltaMin) + { + theData.myNewPC3d[newcount] = curp; + theData.myNewPC2d[newcount] = ucons; + newcount ++; + } } + } + theData.myNewPC3d[newcount] = theData.myPC3d[theData.myNbPnt]; + theData.myNewPC2d[newcount] = theData.myPC2d[theData.myNbPnt]; - myCurve2d = aC2d; - myHCurve2d = aHCurve2d; - myDone = Standard_True; + if(theData.myNbPnt != newcount) + { + // Distribution is changed. + theData.Swap(newcount); + return Standard_True; } + + return Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_SameParameter.hxx opencascade-7.5.1+dfsg1/src/Approx/Approx_SameParameter.hxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_SameParameter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_SameParameter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,21 +20,17 @@ #include #include #include - +#include #include #include -class Geom2d_BSplineCurve; class Adaptor2d_HCurve2d; class Adaptor3d_HCurve; class Adaptor3d_HSurface; -class Standard_OutOfRange; -class Standard_ConstructionError; class Geom_Curve; class Geom2d_Curve; class Geom_Surface; - -//! Approximation of a PCurve on a surface to make its +//! Approximation of a PCurve on a surface to make its //! parameter be the same that the parameter of a given 3d //! reference curve. class Approx_SameParameter @@ -43,63 +39,149 @@ DEFINE_STANDARD_ALLOC - - //! Warning: the C3D and C2D must have the same parametric domain. - Standard_EXPORT Approx_SameParameter(const Handle(Geom_Curve)& C3D, const Handle(Geom2d_Curve)& C2D, const Handle(Geom_Surface)& S, const Standard_Real Tol); - - Standard_EXPORT Approx_SameParameter(const Handle(Adaptor3d_HCurve)& C3D, const Handle(Geom2d_Curve)& C2D, const Handle(Adaptor3d_HSurface)& S, const Standard_Real Tol); - + Standard_EXPORT Approx_SameParameter(const Handle(Geom_Curve)& C3D, + const Handle(Geom2d_Curve)& C2D, + const Handle(Geom_Surface)& S, + const Standard_Real Tol); //! Warning: the C3D and C2D must have the same parametric domain. - Standard_EXPORT Approx_SameParameter(const Handle(Adaptor3d_HCurve)& C3D, const Handle(Adaptor2d_HCurve2d)& C2D, const Handle(Adaptor3d_HSurface)& S, const Standard_Real Tol); - - Standard_Boolean IsDone() const; - - Standard_Real TolReached() const; - - //! Tells whether the original data had already the same - //! parameter up to the tolerance : in that case nothing - //! is done. - Standard_Boolean IsSameParameter() const; - - //! Returns the 2D curve that has the same parameter as - //! the 3D curve once evaluated on the surface up to the - //! specified tolerance - Handle(Geom2d_BSplineCurve) Curve2d() const; - + Standard_EXPORT Approx_SameParameter(const Handle(Adaptor3d_HCurve)& C3D, + const Handle(Geom2d_Curve)& C2D, + const Handle(Adaptor3d_HSurface)& S, + const Standard_Real Tol); + //! Warning: the C3D and C2D must have the same parametric domain. + Standard_EXPORT Approx_SameParameter(const Handle(Adaptor3d_HCurve)& C3D, + const Handle(Adaptor2d_HCurve2d)& C2D, + const Handle(Adaptor3d_HSurface)& S, + const Standard_Real Tol); + + //!@Returns .false. if calculations failed, + //! .true. if calculations succeed + Standard_Boolean IsDone() const + { + return myDone; + } + + //!@Returns tolerance (maximal distance) between 3d curve + //! and curve on surface, generated by 2d curve and surface. + Standard_Real TolReached() const + { + return myTolReached; + } + //! Tells whether the original data had already the same + //! parameter up to the tolerance : in that case nothing + //! is done. + Standard_Boolean IsSameParameter() const + { + return mySameParameter; + } + + //! Returns the 2D curve that has the same parameter as + //! the 3D curve once evaluated on the surface up to the + //! specified tolerance. + Handle(Geom2d_Curve) Curve2d() const + { + return myCurve2d; + } -protected: - - +private: + //! Internal data structure to unify access to the most actively used data. + //! This structure is not intended to be class field since + //! a lot of memory is used in intermediate computations. + struct Approx_SameParameter_Data + { + Adaptor3d_CurveOnSurface myCOnS; // Curve on surface. + Standard_Integer myNbPnt; // Number of points. + Standard_Real *myPC3d; // Parameters on 3d curve. + Standard_Real *myPC2d; // Parameters on 2d curve. + + // Second data arrays. Used in loop over poles. + Standard_Real *myNewPC3d; // Parameters on 3d curve. + Standard_Real *myNewPC2d; // Parameters on 2d curve. + + // Parameters ranges. + Standard_Real myC3dPF; // Curve 3d Parameter First. + Standard_Real myC3dPL; // Curve 3d Parameter Last. + Standard_Real myC2dPF; // Curve 2d Parameter First. + Standard_Real myC2dPL; // Curve 2d Parameter Last. + + Standard_Real myTol; // Working tolerance. + + // Swap data arrays and update number of points. + void Swap(const Standard_Integer theNewNbPoints) + { + myNbPnt = theNewNbPoints; + Standard_Real * temp; + + // 3-D + temp = myPC3d; + myPC3d = myNewPC3d; + myNewPC3d = temp; + + // 2-D + temp = myPC2d; + myPC2d = myNewPC2d; + myNewPC2d = temp; + } + }; -private: + Approx_SameParameter(const Approx_SameParameter &); + Approx_SameParameter& operator=(const Approx_SameParameter &); - - //! Compute the Pcurve (internal use only). + //! Computes the pcurve (internal use only). Standard_EXPORT void Build (const Standard_Real Tol); + //! Computes initial point distribution. + Standard_Boolean BuildInitialDistribution(Approx_SameParameter_Data &theData) const; + + //! Increases initial number of samples in case of the C0 continuity. + //! Return new number of points and corresponding data arrays. + //@return true if new number of samples is good and false otherwise. + Standard_Boolean IncreaseInitialNbSamples(Approx_SameParameter_Data &theData) const; + + //! Computes tangents on boundary points. + //@return true if tangents are not null and false otherwise. + Standard_Boolean ComputeTangents(const Adaptor3d_CurveOnSurface & theCOnS, + Standard_Real &theFirstTangent, + Standard_Real &theLastTangent) const; + + //! Method to check same parameter state + //! and build dependency between 2d and 3d curves. + //@return true if 2d and 3d curves have same parameter state and false otherwise. + Standard_Boolean CheckSameParameter(Approx_SameParameter_Data &theData, + Standard_Real &theSqDist) const; + + //! Computes interpolated values. + //!@Returns .false. if computations failed; + Standard_Boolean Interpolate(const Approx_SameParameter_Data & theData, + const Standard_Real aTangFirst, + const Standard_Real aTangLast, + TColStd_Array1OfReal & thePoles, + TColStd_Array1OfReal & theFlatKnots) const; + + //! Increases number of poles in poles loop. + //@return true if poles is changed and false otherwise. + Standard_Boolean IncreaseNbPoles(const TColStd_Array1OfReal & thePoles, + const TColStd_Array1OfReal & theFlatKnots, + Approx_SameParameter_Data & theData, + Standard_Real &theBestSqTol) const; + + static const Standard_Integer myNbSamples = 22; // To be consistent with "checkshape". + static const Standard_Integer myMaxArraySize = 1000; + const Standard_Real myDeltaMin; // Initialization is allowed only for integral types. Standard_Boolean mySameParameter; Standard_Boolean myDone; Standard_Real myTolReached; - Handle(Geom2d_BSplineCurve) myCurve2d; + Handle(Geom2d_Curve) myCurve2d; Handle(Adaptor2d_HCurve2d) myHCurve2d; Handle(Adaptor3d_HCurve) myC3d; Handle(Adaptor3d_HSurface) mySurf; - - }; - -#include - - - - - #endif // _Approx_SameParameter_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_SameParameter.lxx opencascade-7.5.1+dfsg1/src/Approx/Approx_SameParameter.lxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_SameParameter.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_SameParameter.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -// Created on: 1995-06-06 -// Created by: Modelistation -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : IsDone -//purpose : -//======================================================================= - -inline Standard_Boolean Approx_SameParameter::IsDone() const -{ return myDone ; } -//======================================================================= -//function : TolReached -//purpose : -//======================================================================= - -inline Standard_Real Approx_SameParameter::TolReached() const -{ return myTolReached; } -//======================================================================= -//function : IsSameParameter -//purpose : -//======================================================================= - -inline Standard_Boolean Approx_SameParameter::IsSameParameter() const -{ return mySameParameter ; } -//======================================================================= -//function : Curve2d -//purpose : -//======================================================================= - -inline Handle(Geom2d_BSplineCurve) Approx_SameParameter::Curve2d() const -{ return myCurve2d ; } diff -Nru opencascade-7.4.1+dfsg1/src/Approx/Approx_Status.hxx opencascade-7.5.1+dfsg1/src/Approx/Approx_Status.hxx --- opencascade-7.4.1+dfsg1/src/Approx/Approx_Status.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/Approx_Status.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,7 +17,7 @@ #ifndef _Approx_Status_HeaderFile #define _Approx_Status_HeaderFile - +//! It is an auxiliary flag being used in inner computations enum Approx_Status { Approx_PointsAdded, diff -Nru opencascade-7.4.1+dfsg1/src/Approx/FILES opencascade-7.5.1+dfsg1/src/Approx/FILES --- opencascade-7.4.1+dfsg1/src/Approx/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Approx/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -24,7 +24,6 @@ Approx_ParametrizationType.hxx Approx_SameParameter.cxx Approx_SameParameter.hxx -Approx_SameParameter.lxx Approx_SequenceOfHArray1OfReal.hxx Approx_Status.hxx Approx_SweepApproximation.cxx diff -Nru opencascade-7.4.1+dfsg1/src/ApproxInt/ApproxInt_ImpPrmSvSurfaces.gxx opencascade-7.5.1+dfsg1/src/ApproxInt/ApproxInt_ImpPrmSvSurfaces.gxx --- opencascade-7.4.1+dfsg1/src/ApproxInt/ApproxInt_ImpPrmSvSurfaces.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ApproxInt/ApproxInt_ImpPrmSvSurfaces.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -329,7 +329,9 @@ //-------------------------------------------------------------------------------- ApproxInt_ImpPrmSvSurfaces::ApproxInt_ImpPrmSvSurfaces( const TheISurface& ISurf ,const ThePSurface& PSurf): + MyIsTangent(Standard_False), MyHasBeenComputed(Standard_False), + MyIsTangentbis(Standard_False), MyHasBeenComputedbis(Standard_False), MyImplicitFirst(Standard_True), MyZerImpFunc(PSurf,ISurf) @@ -338,7 +340,9 @@ //-------------------------------------------------------------------------------- ApproxInt_ImpPrmSvSurfaces::ApproxInt_ImpPrmSvSurfaces( const ThePSurface& PSurf ,const TheISurface& ISurf): + MyIsTangent(Standard_False), MyHasBeenComputed(Standard_False), + MyIsTangentbis(Standard_False), MyHasBeenComputedbis(Standard_False), MyImplicitFirst(Standard_False), MyZerImpFunc(PSurf,ISurf) diff -Nru opencascade-7.4.1+dfsg1/src/ApproxInt/ApproxInt_PrmPrmSvSurfaces.gxx opencascade-7.5.1+dfsg1/src/ApproxInt/ApproxInt_PrmPrmSvSurfaces.gxx --- opencascade-7.4.1+dfsg1/src/ApproxInt/ApproxInt_PrmPrmSvSurfaces.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ApproxInt/ApproxInt_PrmPrmSvSurfaces.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,9 @@ //-------------------------------------------------------------------------------- ApproxInt_PrmPrmSvSurfaces::ApproxInt_PrmPrmSvSurfaces( const ThePSurface& Surf1 ,const ThePSurface& Surf2): + MyIsTangent(Standard_False), MyHasBeenComputed(Standard_False), + MyIsTangentbis(Standard_False), MyHasBeenComputedbis(Standard_False), MyIntersectionOn2S(Surf1,Surf2,TOLTANGENCY) { diff -Nru opencascade-7.4.1+dfsg1/src/AppStd/AppStd_Application.cxx opencascade-7.5.1+dfsg1/src/AppStd/AppStd_Application.cxx --- opencascade-7.4.1+dfsg1/src/AppStd/AppStd_Application.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppStd/AppStd_Application.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ //AGV 15/10/01 : Add XmlOcaf support; add MessageDriver support #include +#include IMPLEMENT_STANDARD_RTTIEXT(AppStd_Application,TDocStd_Application) @@ -29,3 +30,13 @@ return aRes; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void AppStd_Application::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDocStd_Application) +} diff -Nru opencascade-7.4.1+dfsg1/src/AppStd/AppStd_Application.hxx opencascade-7.5.1+dfsg1/src/AppStd/AppStd_Application.hxx --- opencascade-7.4.1+dfsg1/src/AppStd/AppStd_Application.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppStd/AppStd_Application.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,6 +35,9 @@ //! resources Standard_EXPORT Standard_CString ResourcesName() Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + DEFINE_STANDARD_RTTIEXT(AppStd_Application,TDocStd_Application) }; diff -Nru opencascade-7.4.1+dfsg1/src/AppStdL/AppStdL_Application.cxx opencascade-7.5.1+dfsg1/src/AppStdL/AppStdL_Application.cxx --- opencascade-7.4.1+dfsg1/src/AppStdL/AppStdL_Application.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppStdL/AppStdL_Application.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ //AGV 15/10/01 : Add XmlOcaf support; add MessageDriver support #include +#include IMPLEMENT_STANDARD_RTTIEXT(AppStdL_Application,TDocStd_Application) @@ -30,3 +31,13 @@ return aRes; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void AppStdL_Application::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDocStd_Application) +} diff -Nru opencascade-7.4.1+dfsg1/src/AppStdL/AppStdL_Application.hxx opencascade-7.5.1+dfsg1/src/AppStdL/AppStdL_Application.hxx --- opencascade-7.4.1+dfsg1/src/AppStdL/AppStdL_Application.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/AppStdL/AppStdL_Application.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,6 +34,9 @@ //! resources Standard_EXPORT Standard_CString ResourcesName() Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + DEFINE_STANDARD_RTTIEXT(AppStdL_Application,TDocStd_Application) }; diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Background.cxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Background.cxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Background.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Background.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,7 @@ #include #include +#include //-Aliases //-Global data definitions @@ -56,3 +57,14 @@ return (MyColor); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Aspect_Background::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, Aspect_Background) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &MyColor) +} diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Background.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Background.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Background.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Background.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,6 +46,9 @@ //! Returns the colour of the window background . Standard_EXPORT Quantity_Color Color() const; + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_CircularGrid.cxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_CircularGrid.cxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_CircularGrid.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_CircularGrid.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -140,3 +140,20 @@ myAlpha = M_PI / Standard_Real(myDivisionNumber); myA1 = Cos(myAlpha); myB1=Sin(myAlpha); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Aspect_CircularGrid::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS(theOStream, theDepth, Aspect_Grid) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRadiusStep) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDivisionNumber) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAlpha) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myA1) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myB1) +} diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_CircularGrid.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_CircularGrid.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_CircularGrid.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_CircularGrid.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,6 +55,9 @@ Standard_EXPORT Standard_Integer DivisionNumber() const; Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; private: diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_ColorSpace.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_ColorSpace.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_ColorSpace.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_ColorSpace.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,26 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_ColorSpace_HeaderFile +#define _Aspect_ColorSpace_HeaderFile + +#include + +//! Texture color spaces accepted by XR composer. +enum Aspect_ColorSpace +{ + Aspect_ColorSpace_sRGB = 0, //!< non-linear sRGB color space + Aspect_ColorSpace_Linear = 1, //!< linear RGB color space +}; + +#endif // _Aspect_ColorSpace_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_DisplayConnection.cxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_DisplayConnection.cxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_DisplayConnection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_DisplayConnection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,7 @@ // ======================================================================= Aspect_DisplayConnection::Aspect_DisplayConnection() { -#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) +#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) myDisplay = NULL; myIsOwnDisplay = false; OSD_Environment anEnv ("DISPLAY"); @@ -40,7 +40,7 @@ // ======================================================================= Aspect_DisplayConnection::~Aspect_DisplayConnection() { -#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) +#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) if (myDisplay != NULL && myIsOwnDisplay) { @@ -49,7 +49,7 @@ #endif } -#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) +#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) // ======================================================================= // function : Aspect_DisplayConnection // purpose : diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_DisplayConnection.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_DisplayConnection.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_DisplayConnection.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_DisplayConnection.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,7 @@ #include #include -#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) +#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) #include #endif @@ -39,7 +39,7 @@ //! Destructor. Close opened connection. Standard_EXPORT ~Aspect_DisplayConnection(); -#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) +#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) //! Constructor. Creates connection with display specified in theDisplayName. //! Display name should be in format "hostname:number" or "hostname:number.screen_number", where: //! hostname - Specifies the name of the host machine on which the display is physically attached. diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Eye.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Eye.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Eye.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Eye.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,24 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_Eye_HeaderFile +#define _Aspect_Eye_HeaderFile + +//! Camera eye index within stereoscopic pair. +enum Aspect_Eye +{ + Aspect_Eye_Left, + Aspect_Eye_Right +}; + +#endif // _Aspect_Eye_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_FBConfig.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_FBConfig.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_FBConfig.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_FBConfig.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,7 +14,7 @@ #ifndef _Aspect_FBConfig_HeaderFile #define _Aspect_FBConfig_HeaderFile -#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) +#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) typedef struct __GLXFBConfigRec* GLXFBConfig; typedef GLXFBConfig Aspect_FBConfig; // GLXFBConfig* under UNIX #else diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_FrustumLRBT.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_FrustumLRBT.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_FrustumLRBT.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_FrustumLRBT.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,55 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_FrustumLRBT_HeaderFile +#define _Aspect_FrustumLRBT_HeaderFile + +//! Structure defining frustum boundaries. +template +struct Aspect_FrustumLRBT +{ + Elem_t Left; + Elem_t Right; + Elem_t Bottom; + Elem_t Top; + + //! Empty constructor. + Aspect_FrustumLRBT() : Left (0), Right (0), Bottom (0), Top (0) {} + + //! Copy/cast constructor. + template + explicit Aspect_FrustumLRBT (const Aspect_FrustumLRBT& theOther) + : Left (static_cast (theOther.Left)), + Right (static_cast (theOther.Right)), + Bottom(static_cast (theOther.Bottom)), + Top (static_cast (theOther.Top)) {} + + //! Apply multiply factor. + void Multiply (Elem_t theScale) + { + Left *= theScale; + Right *= theScale; + Bottom *= theScale; + Top *= theScale; + } + + //! Return multiplied frustum. + Aspect_FrustumLRBT Multiplied (Elem_t theScale) + { + Aspect_FrustumLRBT aCopy (*this); + aCopy.Multiply (theScale); + return aCopy; + } +}; + +#endif // _Aspect_FrustumLRBT_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_GenId.cxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_GenId.cxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_GenId.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_GenId.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,8 @@ #include #include +#include + // ======================================================================= // function : Aspect_GenId // purpose : @@ -114,3 +116,21 @@ theId = myLowerBound + myLength - myFreeCount - 1; return Standard_True; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Aspect_GenId::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFreeCount) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLength) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLowerBound) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUpperBound) + + for (TColStd_ListOfInteger::Iterator anIter (myFreeIds); anIter.More(); anIter.Next()) + { + Standard_Integer aFreeId = anIter.Value(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aFreeId) + } +} diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_GenId.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_GenId.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_GenId.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_GenId.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -72,6 +72,9 @@ //! Returns the upper identifier in range. Standard_Integer Upper() const { return myUpperBound; } + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; private: diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_GradientBackground.cxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_GradientBackground.cxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_GradientBackground.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_GradientBackground.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,3 +55,18 @@ { return MyGradientMethod; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Aspect_GradientBackground::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, Aspect_GradientBackground) + + Quantity_Color aColor = Color(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &aColor) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &MyColor2) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, MyGradientMethod) +} diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_GradientBackground.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_GradientBackground.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_GradientBackground.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_GradientBackground.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,6 +51,9 @@ //! Returns the current gradient background fill mode. Standard_EXPORT Aspect_GradientFillMethod BgGradientFillMethod() const; + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_GraphicsLibrary.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_GraphicsLibrary.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_GraphicsLibrary.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_GraphicsLibrary.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,24 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_GraphicsLibrary_HeaderFile +#define _Aspect_GraphicsLibrary_HeaderFile + +//! Graphics API enumeration. +enum Aspect_GraphicsLibrary +{ + Aspect_GraphicsLibrary_OpenGL, + Aspect_GraphicsLibrary_OpenGLES, +}; + +#endif // _Aspect_GraphicsLibrary_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Grid.cxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Grid.cxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Grid.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Grid.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -104,3 +104,22 @@ myDrawMode = theDrawMode; UpdateDisplay(); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Aspect_Grid::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRotationAngle) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myXOrigin) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myYOrigin) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColor) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myTenthColor) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsActive) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawMode) +} diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Grid.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Grid.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Grid.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Grid.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -96,6 +96,9 @@ Standard_EXPORT virtual Standard_Boolean IsDisplayed() const = 0; Standard_EXPORT virtual void Init() = 0; + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_NeutralWindow.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_NeutralWindow.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_NeutralWindow.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_NeutralWindow.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,7 +59,7 @@ virtual void Unmap() const Standard_OVERRIDE { myIsMapped = Standard_False; } //! Resize window - do nothing. - virtual Aspect_TypeOfResize DoResize() const Standard_OVERRIDE { return Aspect_TOR_UNKNOWN; } + virtual Aspect_TypeOfResize DoResize() Standard_OVERRIDE { return Aspect_TOR_UNKNOWN; } //! Map window - do nothing. virtual Standard_Boolean DoMapping() const Standard_OVERRIDE { return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_OpenVRSession.cxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_OpenVRSession.cxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_OpenVRSession.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_OpenVRSession.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1149 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_OPENVR + #include + +namespace +{ + //! Print OpenVR compositor error. + static const char* getVRCompositorError (vr::EVRCompositorError theVRError) + { + switch (theVRError) + { + case vr::VRCompositorError_None: return "None"; + case vr::VRCompositorError_RequestFailed: return "Request Failed"; + case vr::VRCompositorError_IncompatibleVersion: return "Incompatible Version"; + case vr::VRCompositorError_DoNotHaveFocus: return "Do not have focus"; + case vr::VRCompositorError_InvalidTexture: return "Invalid Texture"; + case vr::VRCompositorError_IsNotSceneApplication: return "Is not scene application"; + case vr::VRCompositorError_TextureIsOnWrongDevice: return "Texture is on wrong device"; + case vr::VRCompositorError_TextureUsesUnsupportedFormat: return "Texture uses unsupported format"; + case vr::VRCompositorError_SharedTexturesNotSupported: return "Shared textures not supported"; + case vr::VRCompositorError_IndexOutOfRange: return "Index out of range"; + case vr::VRCompositorError_AlreadySubmitted: return "Already submitted"; + case vr::VRCompositorError_InvalidBounds: return "Invalid Bounds"; + case vr::VRCompositorError_AlreadySet: return "Already set"; + } + return "UNKNOWN"; + } + + //! Print OpenVR input error. + static const char* getVRInputError (vr::EVRInputError theVRError) + { + switch (theVRError) + { + case vr::VRInputError_None: return "None"; + case vr::VRInputError_NameNotFound: return "NameNotFound"; + case vr::VRInputError_WrongType: return "WrongType"; + case vr::VRInputError_InvalidHandle: return "InvalidHandle"; + case vr::VRInputError_InvalidParam: return "InvalidParam"; + case vr::VRInputError_NoSteam: return "NoSteam:"; + case vr::VRInputError_MaxCapacityReached: return "MaxCapacityReached"; + case vr::VRInputError_IPCError: return "IPCError"; + case vr::VRInputError_NoActiveActionSet: return "NoActiveActionSet"; + case vr::VRInputError_InvalidDevice: return "InvalidDevice"; + case vr::VRInputError_InvalidSkeleton: return "InvalidSkeleton"; + case vr::VRInputError_InvalidBoneCount: return "InvalidBoneCount"; + case vr::VRInputError_InvalidCompressedData: return "InvalidCompressedData"; + case vr::VRInputError_NoData: return "NoData"; + case vr::VRInputError_BufferTooSmall: return "BufferTooSmall"; + case vr::VRInputError_MismatchedActionManifest: return "MismatchedActionManifest"; + case vr::VRInputError_MissingSkeletonData: return "MissingSkeletonData"; + case vr::VRInputError_InvalidBoneIndex: return "InvalidBoneIndex"; + case vr::VRInputError_InvalidPriority: return "InvalidPriority"; + case vr::VRInputError_PermissionDenied: return "PermissionDenied"; + case vr::VRInputError_InvalidRenderModel: return "InvalidRenderModel"; + } + return "UNKNOWN"; + } + + //! Convert OpenVR mat4x4 into OCCT mat4x4. + static NCollection_Mat4 mat44vr2Occ (const vr::HmdMatrix44_t& theMat4) + { + NCollection_Mat4 aMat4; + for (int aRow = 0; aRow < 4; ++aRow) + { + aMat4.SetRow (aRow, NCollection_Vec4 (theMat4.m[aRow][0], theMat4.m[aRow][1], theMat4.m[aRow][2], theMat4.m[aRow][3])); + } + return aMat4; + } + + //! Convert OpenVR mat3x4 into OCCT gp_Trsf. + static gp_Trsf mat34vr2OccTrsf (const vr::HmdMatrix34_t& theMat4) + { + gp_Trsf aTrsf; + aTrsf.SetValues (theMat4.m[0][0], theMat4.m[0][1], theMat4.m[0][2], theMat4.m[0][3], + theMat4.m[1][0], theMat4.m[1][1], theMat4.m[1][2], theMat4.m[1][3], + theMat4.m[2][0], theMat4.m[2][1], theMat4.m[2][2], theMat4.m[2][3]); + return aTrsf; + } + + //! Convert OpenVR tracked pose. + static Aspect_TrackedDevicePose poseVr2Occ (const vr::TrackedDevicePose_t& theVrPose, + const Standard_Real theUnitFactor) + { + Aspect_TrackedDevicePose aPose; + aPose.Velocity.SetCoord (theVrPose.vVelocity.v[0], theVrPose.vVelocity.v[1], theVrPose.vVelocity.v[2]); + aPose.AngularVelocity.SetCoord (theVrPose.vAngularVelocity.v[0], theVrPose.vAngularVelocity.v[1], theVrPose.vAngularVelocity.v[2]); + aPose.IsValidPose = theVrPose.bPoseIsValid; + aPose.IsConnectedDevice = theVrPose.bDeviceIsConnected; + if (aPose.IsValidPose) + { + aPose.Orientation = mat34vr2OccTrsf (theVrPose.mDeviceToAbsoluteTracking); + if (theUnitFactor != 1.0) + { + aPose.Orientation.SetTranslationPart (aPose.Orientation.TranslationPart() * theUnitFactor); + } + } + return aPose; + } + + //! Find location of default actions manifest file (based on CSF_OCCTResourcePath or CASROOT variables). + TCollection_AsciiString defaultActionsManifestInit() + { + const TCollection_AsciiString THE_ACTIONS_JSON = "occtvr_actions.json"; + const TCollection_AsciiString aResRoot (OSD_Environment ("CSF_OCCTResourcePath").Value()); + if (!aResRoot.IsEmpty()) + { + if (OSD_File (aResRoot + "/" + THE_ACTIONS_JSON).Exists()) + { + return aResRoot + "/" + THE_ACTIONS_JSON; + } + if (OSD_File (aResRoot + "/XRResources/" + THE_ACTIONS_JSON).Exists()) + { + return aResRoot + "/XRResources/" + THE_ACTIONS_JSON; + } + } + const TCollection_AsciiString aCasRoot (OSD_Environment ("CASROOT").Value()); + if (!aCasRoot.IsEmpty()) + { + if (OSD_File (aCasRoot + "/" + THE_ACTIONS_JSON).Exists()) + { + return aCasRoot + "/" + THE_ACTIONS_JSON; + } + if (OSD_File (aCasRoot + "/XRResources/" + THE_ACTIONS_JSON).Exists()) + { + return aCasRoot + "/XRResources/" + THE_ACTIONS_JSON; + } + if (OSD_File (aCasRoot + "/XRResources/src/" + THE_ACTIONS_JSON).Exists()) + { + return aCasRoot + "/XRResources/src/" + THE_ACTIONS_JSON; + } + } + return OSD_Process::ExecutablePath() + "/occtvr_actions.json"; + } +} +#endif + +IMPLEMENT_STANDARD_RTTIEXT(Aspect_OpenVRSession, Aspect_XRSession) + +struct Aspect_OpenVRSession::VRContext +{ +#ifdef HAVE_OPENVR + vr::TrackedDevicePose_t TrackedPoses[vr::k_unMaxTrackedDeviceCount]; //!< array of tracked devices poses + vr::IVRSystem* System; //!< OpenVR session object + + //! Empty constructor. + Aspect_OpenVRSession::VRContext() : System (NULL) + { + memset (TrackedPoses, 0, sizeof(TrackedPoses)); + } + + //! IVRSystem::PollNextEvent() wrapper. + bool PollNextEvent (vr::VREvent_t& theEvent) + { + return System->PollNextEvent (&theEvent, sizeof(vr::VREvent_t)); + } + + //! IVRSystem::GetControllerState() wrapper. + bool GetControllerState (vr::VRControllerState_t& theState, + vr::TrackedDeviceIndex_t theDevice) + { + return System->GetControllerState (theDevice, &theState, sizeof(vr::VRControllerState_t&)); + } + + //! Retrieve string property from OpenVR. + TCollection_AsciiString getVrTrackedDeviceString (vr::TrackedDeviceIndex_t theDevice, + vr::TrackedDeviceProperty theProperty, + vr::TrackedPropertyError* theError = NULL) + { + const uint32_t aBuffLen = System->GetStringTrackedDeviceProperty(theDevice, theProperty, NULL, 0, theError); + if (aBuffLen == 0) + { + return TCollection_AsciiString(); + } + + NCollection_LocalArray aBuffer (aBuffLen + 1); + System->GetStringTrackedDeviceProperty (theDevice, theProperty, aBuffer, aBuffLen, theError); + aBuffer[aBuffLen] = '\0'; + const TCollection_AsciiString aResult (aBuffer); + return aResult; + } +#endif +}; + +#ifdef HAVE_OPENVR +//! Image wrapping vr::RenderModel_TextureMap_t. +class Aspect_OpenVRSession::VRImagePixmap : public Image_PixMap +{ +public: + //! Empty constructor. + VRImagePixmap() : myVrTexture (NULL) {} + + //! Load the texture. + bool Load (vr::TextureID_t theTexture, const TCollection_AsciiString& theVrModelName) + { + vr::RenderModel_TextureMap_t* aVrTexture = NULL; + vr::EVRRenderModelError aVrError = vr::VRRenderModelError_Loading; + for (; aVrError == vr::VRRenderModelError_Loading;) + { + aVrError = vr::VRRenderModels()->LoadTexture_Async (theTexture, &aVrTexture); + OSD::MilliSecSleep (1); + } + if (aVrError != vr::VRRenderModelError_None + || aVrTexture == NULL) + { + Message::SendFail (TCollection_AsciiString ("OpenVR, Unable to load render model texture: ") + theVrModelName + " - " + int(aVrError)); + return false; + } + + InitWrapper (Image_Format_RGBA, (Standard_Byte* )aVrTexture->rubTextureMapData, aVrTexture->unWidth, aVrTexture->unHeight); + myVrTexture = aVrTexture; + return true; + } + + virtual ~VRImagePixmap() + { + if (myVrTexture != NULL) + { + vr::VRRenderModels()->FreeTexture (myVrTexture); + } + } +private: + vr::RenderModel_TextureMap_t* myVrTexture; +}; + +//! Image_Texture extension using vr::VRRenderModels(). +class Aspect_OpenVRSession::VRTextureSource : public Image_Texture +{ +public: + + //! Main constructor. + VRTextureSource (vr::TextureID_t theTextureId, const TCollection_AsciiString& theVrModelName) + : Image_Texture (""), myVrTextureId (theTextureId), myVrModelName (theVrModelName) + { + myTextureId = TCollection_AsciiString ("texturevr://map_#") + (int )theTextureId; + } + +protected: + //! Read image. + virtual Handle(Image_PixMap) ReadImage (const Handle(Image_SupportedFormats)& ) const Standard_OVERRIDE + { + Handle(VRImagePixmap) aPixmap = new VRImagePixmap(); + if (!aPixmap->Load (myVrTextureId, myVrModelName)) + { + return Handle(VRImagePixmap)(); + } + return aPixmap; + } +private: + vr::TextureID_t myVrTextureId; + TCollection_AsciiString myVrModelName; +}; +#endif + +// ======================================================================= +// function : IsHmdPresent +// purpose : +// ======================================================================= +bool Aspect_OpenVRSession::IsHmdPresent() +{ +#ifdef HAVE_OPENVR + return vr::VR_IsHmdPresent(); +#else + return false; +#endif +} + +// ======================================================================= +// function : defaultActionsManifest +// purpose : +// ======================================================================= +TCollection_AsciiString Aspect_OpenVRSession::defaultActionsManifest() +{ +#ifdef HAVE_OPENVR + static const TCollection_AsciiString THE_ACTIONS_JSON_FULL = defaultActionsManifestInit(); + return THE_ACTIONS_JSON_FULL; +#else + return TCollection_AsciiString(); +#endif +} + +// ======================================================================= +// function : Aspect_OpenVRSession +// purpose : +// ======================================================================= +Aspect_OpenVRSession::Aspect_OpenVRSession() +: myContext (new VRContext()) +{ +#ifdef HAVE_OPENVR + myActionsManifest = defaultActionsManifest(); + myTrackedPoses.Resize (0, (Standard_Integer )vr::k_unMaxTrackedDeviceCount - 1, false); + { + Handle(Aspect_XRActionSet) aHeadActionSet = new Aspect_XRActionSet ("/actions/generic_head"); + myActionSets.Add (aHeadActionSet->Id(), aHeadActionSet); + + Handle(Aspect_XRAction) aHeadsetOn = new Aspect_XRAction (aHeadActionSet->Id() + "/in/headset_on_head", Aspect_XRActionType_InputDigital); + aHeadActionSet->AddAction (aHeadsetOn); + NCollection_Array1& aGenericSet = myRoleActions[Aspect_XRTrackedDeviceRole_Head]; + aGenericSet[Aspect_XRGenericAction_IsHeadsetOn] = aHeadsetOn; + } + for (int aHand = 0; aHand < 2; ++aHand) + { + NCollection_Array1& aGenericSet = myRoleActions[aHand == 0 ? Aspect_XRTrackedDeviceRole_LeftHand : Aspect_XRTrackedDeviceRole_RightHand]; + Handle(Aspect_XRActionSet) anActionSet = new Aspect_XRActionSet (aHand == 0 ? "/actions/generic_left" : "/actions/generic_right"); + myActionSets.Add (anActionSet->Id(), anActionSet); + + Handle(Aspect_XRAction) anAppMenuClick = new Aspect_XRAction (anActionSet->Id() + "/in/appmenu_click", Aspect_XRActionType_InputDigital); + anActionSet->AddAction (anAppMenuClick); + aGenericSet[Aspect_XRGenericAction_InputAppMenu] = anAppMenuClick; + + Handle(Aspect_XRAction) aSysMenuClick = new Aspect_XRAction (anActionSet->Id() + "/in/sysmenu_click", Aspect_XRActionType_InputDigital); + anActionSet->AddAction (aSysMenuClick); + aGenericSet[Aspect_XRGenericAction_InputSysMenu] = aSysMenuClick; + + Handle(Aspect_XRAction) aTriggerPull = new Aspect_XRAction (anActionSet->Id() + "/in/trigger_pull", Aspect_XRActionType_InputAnalog); + anActionSet->AddAction (aTriggerPull); + aGenericSet[Aspect_XRGenericAction_InputTriggerPull] = aTriggerPull; + + Handle(Aspect_XRAction) aTriggerClick = new Aspect_XRAction (anActionSet->Id() + "/in/trigger_click", Aspect_XRActionType_InputDigital); + anActionSet->AddAction (aTriggerClick); + aGenericSet[Aspect_XRGenericAction_InputTriggerClick] = aTriggerClick; + + Handle(Aspect_XRAction) aGripClick = new Aspect_XRAction (anActionSet->Id() + "/in/grip_click", Aspect_XRActionType_InputDigital); + anActionSet->AddAction (aGripClick); + aGenericSet[Aspect_XRGenericAction_InputGripClick] = aGripClick; + + Handle(Aspect_XRAction) aPadPos = new Aspect_XRAction (anActionSet->Id() + "/in/trackpad_position", Aspect_XRActionType_InputAnalog); + anActionSet->AddAction (aPadPos); + aGenericSet[Aspect_XRGenericAction_InputTrackPadPosition] = aPadPos; + + Handle(Aspect_XRAction) aPadTouch = new Aspect_XRAction (anActionSet->Id() + "/in/trackpad_touch", Aspect_XRActionType_InputDigital); + anActionSet->AddAction (aPadTouch); + aGenericSet[Aspect_XRGenericAction_InputTrackPadTouch] = aPadTouch; + + Handle(Aspect_XRAction) aPadClick = new Aspect_XRAction (anActionSet->Id() + "/in/trackpad_click", Aspect_XRActionType_InputDigital); + anActionSet->AddAction (aPadClick); + aGenericSet[Aspect_XRGenericAction_InputTrackPadClick] = aPadClick; + + Handle(Aspect_XRAction) aPoseBase = new Aspect_XRAction (anActionSet->Id() + "/in/pose_base", Aspect_XRActionType_InputPose); + anActionSet->AddAction (aPoseBase); + aGenericSet[Aspect_XRGenericAction_InputPoseBase] = aPoseBase; + + Handle(Aspect_XRAction) aPoseFront = new Aspect_XRAction (anActionSet->Id() + "/in/pose_front", Aspect_XRActionType_InputPose); + anActionSet->AddAction (aPoseFront); + aGenericSet[Aspect_XRGenericAction_InputPoseFront] = aPoseFront; + + Handle(Aspect_XRAction) aPoseGrip = new Aspect_XRAction (anActionSet->Id() + "/in/pose_handgrip", Aspect_XRActionType_InputPose); + anActionSet->AddAction (aPoseGrip); + aGenericSet[Aspect_XRGenericAction_InputPoseHandGrip] = aPoseGrip; + + Handle(Aspect_XRAction) aPoseTip = new Aspect_XRAction (anActionSet->Id() + "/in/pose_tip", Aspect_XRActionType_InputPose); + anActionSet->AddAction (aPoseTip); + aGenericSet[Aspect_XRGenericAction_InputPoseFingerTip] = aPoseTip; + + Handle(Aspect_XRAction) aHaptic = new Aspect_XRAction (anActionSet->Id() + "/out/haptic", Aspect_XRActionType_OutputHaptic); + anActionSet->AddAction (aHaptic); + aGenericSet[Aspect_XRGenericAction_OutputHaptic] = aHaptic; + + Handle(Aspect_XRAction) aThumbsctickPos = new Aspect_XRAction (anActionSet->Id() + "/in/thumbstick_position", Aspect_XRActionType_InputAnalog); + anActionSet->AddAction (aThumbsctickPos); + aGenericSet[Aspect_XRGenericAction_InputThumbstickPosition] = aThumbsctickPos; + + Handle(Aspect_XRAction) aThumbsctickTouch = new Aspect_XRAction (anActionSet->Id() + "/in/thumbstick_touch", Aspect_XRActionType_InputDigital); + anActionSet->AddAction (aThumbsctickTouch); + aGenericSet[Aspect_XRGenericAction_InputThumbstickTouch] = aThumbsctickTouch; + + Handle(Aspect_XRAction) aThumbsctickClick = new Aspect_XRAction (anActionSet->Id() + "/in/thumbstick_click", Aspect_XRActionType_InputDigital); + anActionSet->AddAction (aThumbsctickClick); + aGenericSet[Aspect_XRGenericAction_InputThumbstickClick] = aThumbsctickClick; + } +#endif +} + +// ======================================================================= +// function : ~Aspect_OpenVRSession +// purpose : +// ======================================================================= +Aspect_OpenVRSession::~Aspect_OpenVRSession() +{ + closeVR(); + delete myContext; +} + +// ======================================================================= +// function : closeVR +// purpose : +// ======================================================================= +void Aspect_OpenVRSession::closeVR() +{ +#ifdef HAVE_OPENVR + if (myContext->System != NULL) + { + vr::VR_Shutdown(); + myContext->System = NULL; + } +#endif +} + +// ======================================================================= +// function : getVRSystem +// purpose : +// ======================================================================= +void* Aspect_OpenVRSession::getVRSystem() const +{ +#ifdef HAVE_OPENVR + return myContext->System; +#else + return NULL; +#endif +} + +// ======================================================================= +// function : Close +// purpose : +// ======================================================================= +void Aspect_OpenVRSession::Close() +{ + closeVR(); +} + +// ======================================================================= +// function : IsOpen +// purpose : +// ======================================================================= +bool Aspect_OpenVRSession::IsOpen() const +{ +#ifdef HAVE_OPENVR + return myContext->System != NULL; +#else + return false; +#endif +} + +// ======================================================================= +// function : Open +// purpose : +// ======================================================================= +bool Aspect_OpenVRSession::Open() +{ +#ifdef HAVE_OPENVR + if (myContext->System != NULL) + { + return true; + } + + vr::EVRInitError aVrError = vr::VRInitError_None; + myContext->System = vr::VR_Init (&aVrError, vr::VRApplication_Scene); + if (aVrError != vr::VRInitError_None) + { + myContext->System = NULL; + Message::SendFail (TCollection_AsciiString ("OpenVR, Unable to init VR runtime: ") + vr::VR_GetVRInitErrorAsEnglishDescription (aVrError)); + Close(); + return false; + } + + /*vr::IVRRenderModels* aRenderModels = (vr::IVRRenderModels* )vr::VR_GetGenericInterface (vr::IVRRenderModels_Version, &aVrError); + if (aRenderModels == NULL) + { + Message::SendFail (TCollection_AsciiString ("Unable to get render model interface: ") + vr::VR_GetVRInitErrorAsEnglishDescription (aVrError));; + }*/ + + NCollection_Vec2 aRenderSize; + myContext->System->GetRecommendedRenderTargetSize (&aRenderSize.x(), &aRenderSize.y()); + myRendSize = NCollection_Vec2 (aRenderSize); + myDispFreq = myContext->System->GetFloatTrackedDeviceProperty (vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_DisplayFrequency_Float); + if (myRendSize.x() <= 0 + || myRendSize.y() <= 0) + { + Close(); + return false; + } + updateProjectionFrustums(); + initInput(); + return true; +#else + Message::SendFail ("Open CASCADE has been built without OpenVR support"); + return false; +#endif +} + +// ======================================================================= +// function : initInput +// purpose : +// ======================================================================= +bool Aspect_OpenVRSession::initInput() +{ +#ifdef HAVE_OPENVR + if (myContext->System == NULL) + { + return false; + } + + if (!OSD_File (myActionsManifest).Exists()) + { + Message::SendFail (TCollection_AsciiString ("OpenVR, Unable to open actions manifest '") + myActionsManifest + "'"); + return false; + } + + vr::EVRInputError aVrError = vr::VRInput()->SetActionManifestPath (myActionsManifest.ToCString()); + if (aVrError != vr::VRInputError_None) + { + Message::SendFail (TCollection_AsciiString ("OpenVR, Unable to load actions manifest '") + myActionsManifest + + "': " + getVRInputError (aVrError)); + return false; + } + + bool hasErrors = false; + for (Aspect_XRActionSetMap::Iterator aSetIter (myActionSets); aSetIter.More(); aSetIter.Next()) + { + const Handle(Aspect_XRActionSet)& anActionSet = aSetIter.Value(); + for (Aspect_XRActionMap::Iterator anActionIter (anActionSet->Actions()); anActionIter.More(); anActionIter.Next()) + { + const Handle(Aspect_XRAction)& anAction = anActionIter.Value(); + vr::VRActionHandle_t anActionHandle = 0; + aVrError = vr::VRInput()->GetActionHandle (anAction->Id().ToCString(), &anActionHandle); + if (aVrError == vr::VRInputError_None) + { + anAction->SetRawHandle (anActionHandle); + } + else + { + hasErrors = true; + Message::SendFail (TCollection_AsciiString ("OpenVR, Unable to load action '") + anAction->Id() + "' from '" + myActionsManifest + + "': " + getVRInputError (aVrError)); + } + } + + vr::VRActionSetHandle_t anActionSetHandle = 0; + aVrError = vr::VRInput()->GetActionSetHandle (anActionSet->Id().ToCString(), &anActionSetHandle); + if (aVrError == vr::VRInputError_None) + { + anActionSet->SetRawHandle (anActionSetHandle); + } + else + { + hasErrors = true; + Message::SendFail (TCollection_AsciiString ("OpenVR, Unable to load action set '") + anActionSet->Id() + "' from '" + myActionsManifest + + "': " + getVRInputError (aVrError)); + } + } + return !hasErrors; +#else + return false; +#endif +} + +// ======================================================================= +// function : GetString +// purpose : +// ======================================================================= +TCollection_AsciiString Aspect_OpenVRSession::GetString (InfoString theInfo) const +{ +#ifdef HAVE_OPENVR + if (myContext->System != NULL) + { + vr::ETrackedDeviceProperty aVrProp = vr::Prop_Invalid; + switch (theInfo) + { + case InfoString_Vendor: aVrProp = vr::Prop_ManufacturerName_String; break; + case InfoString_Device: aVrProp = vr::Prop_ModelNumber_String; break; + case InfoString_Tracker: aVrProp = vr::Prop_TrackingSystemName_String; break; + case InfoString_SerialNumber: aVrProp = vr::Prop_SerialNumber_String; break; + } + if (aVrProp != vr::Prop_Invalid) + { + return myContext->getVrTrackedDeviceString (vr::k_unTrackedDeviceIndex_Hmd, aVrProp); + } + } +#else + (void )theInfo; +#endif + return TCollection_AsciiString(); +} + +// ======================================================================= +// function : NamedTrackedDevice +// purpose : +// ======================================================================= +Standard_Integer Aspect_OpenVRSession::NamedTrackedDevice (Aspect_XRTrackedDeviceRole theDevice) const +{ +#ifdef HAVE_OPENVR + if (myContext->System != NULL) + { + vr::TrackedDeviceIndex_t aDevIndex = vr::k_unTrackedDeviceIndexInvalid; + switch (theDevice) + { + case Aspect_XRTrackedDeviceRole_Head: aDevIndex = vr::k_unTrackedDeviceIndex_Hmd; break; + case Aspect_XRTrackedDeviceRole_LeftHand: aDevIndex = myContext->System->GetTrackedDeviceIndexForControllerRole (vr::TrackedControllerRole_LeftHand); break; + case Aspect_XRTrackedDeviceRole_RightHand: aDevIndex = myContext->System->GetTrackedDeviceIndexForControllerRole (vr::TrackedControllerRole_RightHand); break; + case Aspect_XRTrackedDeviceRole_Other: break; + } + if (aDevIndex == vr::k_unTrackedDeviceIndexInvalid) + { + return -1; + } + return (Standard_Integer )aDevIndex; + } +#else + (void )theDevice; +#endif + return -1; +} + +// ======================================================================= +// function : loadRenderModel +// purpose : +// ======================================================================= +Handle(Graphic3d_ArrayOfTriangles) Aspect_OpenVRSession::loadRenderModel (Standard_Integer theDevice, + Standard_Boolean theToApplyUnitFactor, + Handle(Image_Texture)& theTexture) +{ + if (theDevice < 0) + { + return Handle(Graphic3d_ArrayOfTriangles)(); + } +#ifdef HAVE_OPENVR + if (myContext->System == NULL) + { + return Handle(Graphic3d_ArrayOfTriangles)(); + } + + const TCollection_AsciiString aRenderModelName = myContext->getVrTrackedDeviceString (theDevice, vr::Prop_RenderModelName_String); + if (aRenderModelName.IsEmpty()) + { + return Handle(Graphic3d_ArrayOfTriangles)(); + } + + vr::RenderModel_t* aVrModel = NULL; + vr::EVRRenderModelError aVrError = vr::VRRenderModelError_Loading; + for (; aVrError == vr::VRRenderModelError_Loading;) + { + aVrError = vr::VRRenderModels()->LoadRenderModel_Async (aRenderModelName.ToCString(), &aVrModel); + OSD::MilliSecSleep (1); + } + if (aVrError != vr::VRRenderModelError_None) + { + Message::SendFail (TCollection_AsciiString ("OpenVR, Unable to load render model: ") + aRenderModelName + " - " + int(aVrError)); + return Handle(Graphic3d_ArrayOfTriangles)(); + } + + if (aVrModel->diffuseTextureId >= 0) + { + theTexture = new VRTextureSource (aVrModel->diffuseTextureId, aRenderModelName); + } + + const float aScale = theToApplyUnitFactor ? float(myUnitFactor) : 1.0f; + Handle(Graphic3d_ArrayOfTriangles) aTris = new Graphic3d_ArrayOfTriangles ((int )aVrModel->unVertexCount, (int )aVrModel->unTriangleCount * 3, + Graphic3d_ArrayFlags_VertexNormal | Graphic3d_ArrayFlags_VertexTexel); + for (uint32_t aVertIter = 0; aVertIter < aVrModel->unVertexCount; ++aVertIter) + { + const vr::RenderModel_Vertex_t& aVert = aVrModel->rVertexData[aVertIter]; + aTris->AddVertex (aVert.vPosition.v[0] * aScale, aVert.vPosition.v[1] * aScale, aVert.vPosition.v[2] * aScale, + aVert.vNormal.v[0], aVert.vNormal.v[1], aVert.vNormal.v[2], + aVert.rfTextureCoord[0], aVert.rfTextureCoord[1]); + } + for (uint32_t aTriIter = 0; aTriIter < aVrModel->unTriangleCount; ++aTriIter) + { + aTris->AddEdges (aVrModel->rIndexData[aTriIter * 3 + 0] + 1, + aVrModel->rIndexData[aTriIter * 3 + 1] + 1, + aVrModel->rIndexData[aTriIter * 3 + 2] + 1); + } + + vr::VRRenderModels()->FreeRenderModel (aVrModel); + return aTris; +#else + (void )theToApplyUnitFactor; + (void )theTexture; + return Handle(Graphic3d_ArrayOfTriangles)(); +#endif +} + +// ======================================================================= +// function : EyeToHeadTransform +// purpose : +// ======================================================================= +NCollection_Mat4 Aspect_OpenVRSession::EyeToHeadTransform (Aspect_Eye theEye) const +{ +#ifdef HAVE_OPENVR + if (myContext->System != NULL) + { + const vr::HmdMatrix34_t aMatVr = myContext->System->GetEyeToHeadTransform (theEye == Aspect_Eye_Right ? vr::Eye_Right : vr::Eye_Left); + gp_Trsf aTrsf = mat34vr2OccTrsf (aMatVr); + if (myUnitFactor != 1.0) + { + aTrsf.SetTranslationPart (aTrsf.TranslationPart() * myUnitFactor); + } + NCollection_Mat4 aMat4; + aTrsf.GetMat4 (aMat4); + return aMat4; + } +#else + (void )theEye; +#endif + return NCollection_Mat4(); +} + +// ======================================================================= +// function : ProjectionMatrix +// purpose : +// ======================================================================= +NCollection_Mat4 Aspect_OpenVRSession::ProjectionMatrix (Aspect_Eye theEye, + double theZNear, + double theZFar) const +{ +#ifdef HAVE_OPENVR + if (myContext->System != NULL) + { + const vr::HmdMatrix44_t aMat4 = myContext->System->GetProjectionMatrix (theEye == Aspect_Eye_Right ? vr::Eye_Right : vr::Eye_Left, + (float )theZNear, (float )theZFar); + return mat44vr2Occ (aMat4); + } +#else + (void )theEye; + (void )theZNear; + (void )theZFar; +#endif + return NCollection_Mat4(); +} + +// ======================================================================= +// function : updateProjectionFrustums +// purpose : +// ======================================================================= +void Aspect_OpenVRSession::updateProjectionFrustums() +{ +#ifdef HAVE_OPENVR + Aspect_FrustumLRBT aFrustL, aFrustR; + myContext->System->GetProjectionRaw (vr::Eye_Left, &aFrustL.Left, &aFrustL.Right, &aFrustL.Top, &aFrustL.Bottom); + myContext->System->GetProjectionRaw (vr::Eye_Right, &aFrustR.Left, &aFrustR.Right, &aFrustR.Top, &aFrustR.Bottom); + myFrustumL = Aspect_FrustumLRBT (aFrustL); + myFrustumR = Aspect_FrustumLRBT (aFrustR); + std::swap (myFrustumL.Top, myFrustumL.Bottom); + std::swap (myFrustumR.Top, myFrustumR.Bottom); + + const NCollection_Vec2 aTanHalfFov (NCollection_Vec4(-aFrustL.Left, aFrustL.Right, -aFrustR.Left, aFrustR.Right).maxComp(), + NCollection_Vec4(-aFrustL.Top, aFrustL.Bottom, -aFrustR.Top, aFrustR.Bottom).maxComp()); + myAspect = aTanHalfFov.x() / aTanHalfFov.y(); + myFieldOfView = 2.0 * ATan(aTanHalfFov.y()) * 180.0 / M_PI; + + // Intra-ocular Distance can be changed in runtime + //const vr::HmdMatrix34_t aLeftToHead = myContext->System->GetEyeToHeadTransform (vr::Eye_Left); + //const vr::HmdMatrix34_t aRightToHead = myContext->System->GetEyeToHeadTransform (vr::Eye_Right); + //myIod = aRightToHead.m[0][3] - aLeftToHead.m[0][3]; + myIod = myContext->System->GetFloatTrackedDeviceProperty (vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_UserIpdMeters_Float); + myIod *= myUnitFactor; +#endif +} + +// ======================================================================= +// function : SetTrackingOrigin +// purpose : +// ======================================================================= +void Aspect_OpenVRSession::SetTrackingOrigin (TrackingUniverseOrigin theOrigin) +{ +#ifdef HAVE_OPENVR + if (myContext->System != NULL) + { + vr::ETrackingUniverseOrigin anOrigin = vr::TrackingUniverseStanding; + switch (theOrigin) + { + case TrackingUniverseOrigin_Seated: anOrigin = vr::TrackingUniverseSeated; break; + case TrackingUniverseOrigin_Standing: anOrigin = vr::TrackingUniverseStanding; break; + } + vr::VRCompositor()->SetTrackingSpace (anOrigin); + } +#endif + myTrackOrigin = theOrigin; +} + +// ======================================================================= +// function : WaitPoses +// purpose : +// ======================================================================= +bool Aspect_OpenVRSession::WaitPoses() +{ +#ifdef HAVE_OPENVR + if (myContext->System == NULL) + { + return false; + } + + switch (vr::VRCompositor()->GetTrackingSpace()) + { + case vr::TrackingUniverseSeated: + myTrackOrigin = TrackingUniverseOrigin_Seated; + break; + case vr::TrackingUniverseRawAndUncalibrated: + case vr::TrackingUniverseStanding: + myTrackOrigin = TrackingUniverseOrigin_Standing; + break; + } + + const vr::EVRCompositorError aVRError = vr::VRCompositor()->WaitGetPoses (myContext->TrackedPoses, vr::k_unMaxTrackedDeviceCount, NULL, 0); + if (aVRError != vr::VRCompositorError_None) + { + Message::SendTrace (TCollection_AsciiString ("Compositor wait poses error: ") + getVRCompositorError (aVRError)); + } + + for (Standard_Integer aPoseIter = myTrackedPoses.Lower(); aPoseIter <= myTrackedPoses.Upper(); ++aPoseIter) + { + const vr::TrackedDevicePose_t& aVrPose = myContext->TrackedPoses[aPoseIter]; + myTrackedPoses[aPoseIter] = poseVr2Occ (aVrPose, myUnitFactor); + } + + if (myContext->TrackedPoses[vr::k_unTrackedDeviceIndex_Hmd].bPoseIsValid) + { + myHeadPose = myTrackedPoses[vr::k_unTrackedDeviceIndex_Hmd].Orientation; + updateProjectionFrustums(); + } + return aVRError != vr::VRCompositorError_None; +#else + return false; +#endif +} + +// ======================================================================= +// function : GetDigitalActionData +// purpose : +// ======================================================================= +Aspect_XRDigitalActionData Aspect_OpenVRSession::GetDigitalActionData (const Handle(Aspect_XRAction)& theAction) const +{ + if (theAction.IsNull() + || theAction->Type() != Aspect_XRActionType_InputDigital) + { + throw Standard_ProgramError("Aspect_OpenVRSession::GetDigitalActionData() called for wrong action"); + } + + Aspect_XRDigitalActionData anActionData; +#ifdef HAVE_OPENVR + if (myContext->System != NULL + && theAction->RawHandle() != 0) + { + vr::InputDigitalActionData_t aNewData = {}; + vr::EVRInputError anInErr = vr::VRInput()->GetDigitalActionData (theAction->RawHandle(), &aNewData, sizeof(aNewData), vr::k_ulInvalidInputValueHandle); + if (anInErr != vr::VRInputError_None) + { + Message::SendFail (TCollection_AsciiString ("Input Error on '") + theAction->Id() + "': " + getVRInputError (anInErr)); + return anActionData; + } + + anActionData.IsActive = aNewData.bActive; + anActionData.IsChanged = aNewData.bChanged; + anActionData.IsPressed = aNewData.bState; + anActionData.UpdateTime = aNewData.fUpdateTime; + anActionData.ActiveOrigin = aNewData.activeOrigin; + } +#endif + return anActionData; +} + +// ======================================================================= +// function : GetAnalogActionData +// purpose : +// ======================================================================= +Aspect_XRAnalogActionData Aspect_OpenVRSession::GetAnalogActionData (const Handle(Aspect_XRAction)& theAction) const +{ + if (theAction.IsNull() + || theAction->Type() != Aspect_XRActionType_InputAnalog) + { + throw Standard_ProgramError("Aspect_OpenVRSession::GetAnalogActionData() called for wrong action"); + } + + Aspect_XRAnalogActionData anActionData; +#ifdef HAVE_OPENVR + if (myContext->System != NULL + && theAction->RawHandle() != 0) + { + vr::InputAnalogActionData_t aNewData = {}; + vr::EVRInputError anInErr = vr::VRInput()->GetAnalogActionData (theAction->RawHandle(), &aNewData, sizeof(aNewData), vr::k_ulInvalidInputValueHandle); + if (anInErr != vr::VRInputError_None) + { + Message::SendFail (TCollection_AsciiString ("Input Error on '") + theAction->Id() + "': " + getVRInputError (anInErr)); + return anActionData; + } + + anActionData.IsActive = aNewData.bActive; + anActionData.VecXYZ.SetValues (aNewData.x, aNewData.y, aNewData.z); + anActionData.DeltaXYZ.SetValues (aNewData.deltaX, aNewData.deltaY, aNewData.deltaZ); + anActionData.UpdateTime = aNewData.fUpdateTime; + anActionData.ActiveOrigin = aNewData.activeOrigin; + } +#endif + return anActionData; +} + +// ======================================================================= +// function : GetPoseActionDataForNextFrame +// purpose : +// ======================================================================= +Aspect_XRPoseActionData Aspect_OpenVRSession::GetPoseActionDataForNextFrame (const Handle(Aspect_XRAction)& theAction) const +{ + if (theAction.IsNull() + || theAction->Type() != Aspect_XRActionType_InputPose) + { + throw Standard_ProgramError("Aspect_OpenVRSession::GetPoseActionDataForNextFrame() called for wrong action"); + } + + Aspect_XRPoseActionData anActionData; +#ifdef HAVE_OPENVR + if (myContext->System != NULL + && theAction->RawHandle() != 0) + { + vr::ETrackingUniverseOrigin anOrigin = vr::TrackingUniverseSeated; + switch (myTrackOrigin) + { + case TrackingUniverseOrigin_Seated: anOrigin = vr::TrackingUniverseSeated; break; + case TrackingUniverseOrigin_Standing: anOrigin = vr::TrackingUniverseStanding; break; + } + vr::InputPoseActionData_t aNewData = {}; + vr::EVRInputError anInErr = vr::VRInput()->GetPoseActionDataForNextFrame (theAction->RawHandle(), anOrigin, &aNewData, sizeof(aNewData), vr::k_ulInvalidInputValueHandle); + if (anInErr != vr::VRInputError_None) + { + Message::SendFail (TCollection_AsciiString ("Input Error on '") + theAction->Id() + "': " + getVRInputError (anInErr)); + return anActionData; + } + + anActionData.Pose = poseVr2Occ (aNewData.pose, myUnitFactor); + anActionData.IsActive = aNewData.bActive; + anActionData.ActiveOrigin = aNewData.activeOrigin; + } +#endif + return anActionData; +} + +// ======================================================================= +// function : triggerHapticVibrationAction +// purpose : +// ======================================================================= +void Aspect_OpenVRSession::triggerHapticVibrationAction (const Handle(Aspect_XRAction)& theAction, + const Aspect_XRHapticActionData& theParams) +{ + if (theAction.IsNull() + || theAction->Type() != Aspect_XRActionType_OutputHaptic) + { + throw Standard_ProgramError("Aspect_OpenVRSession::triggerHapticVibrationAction() called for wrong action"); + } + +#ifdef HAVE_OPENVR + if (myContext->System != NULL + && theAction->RawHandle() != 0) + { + Aspect_XRHapticActionData aParams = theParams; + if (!theParams.IsValid()) + { + // preset for aborting + aParams.Duration = 0.0f; + aParams.Frequency = 1.0f; + aParams.Amplitude = 0.1f; + } + vr::EVRInputError anInErr = vr::VRInput()->TriggerHapticVibrationAction (theAction->RawHandle(), + aParams.Delay, aParams.Duration, aParams.Frequency, aParams.Amplitude, + vr::k_ulInvalidInputValueHandle); + if (anInErr != vr::VRInputError_None) + { + Message::SendFail (TCollection_AsciiString ("Output Error on '") + theAction->Id() + "': " + getVRInputError (anInErr)); + } + } +#else + (void )theParams; +#endif +} + +// ======================================================================= +// function : ProcessEvents +// purpose : +// ======================================================================= +void Aspect_OpenVRSession::ProcessEvents() +{ +#ifdef HAVE_OPENVR + if (myContext->System == NULL) + { + return; + } + + // process OpenVR events + vr::VREvent_t aVREvent = {}; + for (; myContext->PollNextEvent (aVREvent);) + { + switch (aVREvent.eventType) + { + case vr::VREvent_TrackedDeviceActivated: onTrackedDeviceActivated ((int )aVREvent.trackedDeviceIndex); break; + case vr::VREvent_TrackedDeviceDeactivated: onTrackedDeviceDeactivated((int )aVREvent.trackedDeviceIndex); break; + case vr::VREvent_TrackedDeviceUpdated: onTrackedDeviceUpdated ((int )aVREvent.trackedDeviceIndex); break; + } + } + + // process OpenVR action state + if (myActionSets.Extent() > 0) + { + NCollection_LocalArray anActionSets (myActionSets.Extent()); + memset (anActionSets, 0, sizeof(vr::VRActiveActionSet_t) * myActionSets.Extent()); + for (Standard_Integer aSetIter = 0; aSetIter < myActionSets.Extent(); ++aSetIter) + { + anActionSets[aSetIter].ulActionSet = myActionSets.FindFromIndex (aSetIter + 1)->RawHandle(); + } + vr::VRInput()->UpdateActionState (anActionSets, sizeof(vr::VRActiveActionSet_t), myActionSets.Extent()); + } + + WaitPoses(); + + for (Aspect_XRActionSetMap::Iterator aSetIter (myActionSets); aSetIter.More(); aSetIter.Next()) + { + const Handle(Aspect_XRActionSet)& anActionSet = aSetIter.Value(); + for (Aspect_XRActionMap::Iterator anActionIter (anActionSet->Actions()); anActionIter.More(); anActionIter.Next()) + { + const Handle(Aspect_XRAction)& anAction = anActionIter.Value(); + if (anAction->RawHandle() == 0 + || anAction->Id().IsEmpty()) + { + continue; + } + + switch (anAction->Type()) + { + case Aspect_XRActionType_InputDigital: + { + Aspect_XRDigitalActionData aData = GetDigitalActionData (anAction); + //if (aData.IsChanged) { std::cout << " " << anAction->Id() << " pressed: " << aData.IsPressed << "\n"; } + break; + } + case Aspect_XRActionType_InputAnalog: + { + Aspect_XRAnalogActionData aData = GetAnalogActionData (anAction); + //if (aData.IsChanged()) { std::cout << " " << anAction->Id() << " changed: " << aData.VecXYZ[0] << " " << aData.VecXYZ[1] << " " << aData.VecXYZ[2] << "\n"; } + break; + } + case Aspect_XRActionType_InputPose: + { + GetPoseActionDataForNextFrame (anAction); + break; + } + } + } + } + + // process OpenVR controller state using deprecated API + //for (vr::TrackedDeviceIndex_t aDevIter = 0; aDevIter < vr::k_unMaxTrackedDeviceCount; ++aDevIter) { + // vr::VRControllerState_t aCtrlState = {}; if (myContext->GetControllerState (aCtrlState, aDevIter)) { aCtrlState.ulButtonPressed == 0; } + //} +#endif +} + +// ======================================================================= +// function : onTrackedDeviceActivated +// purpose : +// ======================================================================= +void Aspect_OpenVRSession::onTrackedDeviceActivated (Standard_Integer theDeviceIndex) +{ + Message::SendTrace (TCollection_AsciiString ("OpenVR, Device ") + theDeviceIndex + " attached"); +} + +// ======================================================================= +// function : onTrackedDeviceDeactivated +// purpose : +// ======================================================================= +void Aspect_OpenVRSession::onTrackedDeviceDeactivated (Standard_Integer theDeviceIndex) +{ + Message::SendTrace (TCollection_AsciiString ("OpenVR, Device ") + theDeviceIndex + " detached"); +} + +// ======================================================================= +// function : onTrackedDeviceUpdated +// purpose : +// ======================================================================= +void Aspect_OpenVRSession::onTrackedDeviceUpdated (Standard_Integer theDeviceIndex) +{ + Message::SendTrace (TCollection_AsciiString ("OpenVR, Device ") + theDeviceIndex + " updated"); +} + +// ======================================================================= +// function : SubmitEye +// purpose : +// ======================================================================= +bool Aspect_OpenVRSession::SubmitEye (void* theTexture, + Aspect_GraphicsLibrary theGraphicsLib, + Aspect_ColorSpace theColorSpace, + Aspect_Eye theEye) +{ + if (theTexture == NULL) + { + return false; + } +#ifdef HAVE_OPENVR + if (myContext->System == NULL) + { + return false; + } + + vr::Texture_t aVRTexture = { (void* )theTexture, vr::TextureType_OpenGL, vr::ColorSpace_Gamma }; + switch (theGraphicsLib) + { + case Aspect_GraphicsLibrary_OpenGL: + aVRTexture.eType = vr::TextureType_OpenGL; + break; + default: + Message::SendFail ("Compositor error: unsupported Graphics API"); + return false; + } + switch (theColorSpace) + { + case Aspect_ColorSpace_sRGB: aVRTexture.eColorSpace = vr::ColorSpace_Gamma; break; + case Aspect_ColorSpace_Linear: aVRTexture.eColorSpace = vr::ColorSpace_Linear; break; + } + + const vr::EVRCompositorError aVRError = vr::VRCompositor()->Submit (theEye == Aspect_Eye_Right ? vr::Eye_Right : vr::Eye_Left, &aVRTexture); + if (aVRError != vr::VRCompositorError_None) + { + if (aVRError != vr::VRCompositorError_AlreadySubmitted) + { + Message::SendFail (TCollection_AsciiString ("Compositor Error: ") + getVRCompositorError (aVRError)); + } + else + { + Message::SendTrace (TCollection_AsciiString ("Compositor Error: ") + getVRCompositorError (aVRError)); + } + return false; + } + return true; +#else + (void )theGraphicsLib; + (void )theColorSpace; + (void )theEye; + return false; +#endif +} diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_OpenVRSession.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_OpenVRSession.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_OpenVRSession.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_OpenVRSession.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,149 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_OpenVRSession_HeaderFile +#define _Aspect_OpenVRSession_HeaderFile + +#include + +//! OpenVR wrapper implementing Aspect_XRSession interface. +class Aspect_OpenVRSession : public Aspect_XRSession +{ + DEFINE_STANDARD_RTTIEXT(Aspect_OpenVRSession, Aspect_XRSession) +public: + + //! Return TRUE if an HMD may be presented on the system (e.g. to show VR checkbox in application GUI). + //! This is fast check, and even if it returns TRUE, opening session may fail. + Standard_EXPORT static bool IsHmdPresent(); + +public: + + //! Empty constructor. + Standard_EXPORT Aspect_OpenVRSession(); + + //! Destructor. + Standard_EXPORT virtual ~Aspect_OpenVRSession(); + + //! Return TRUE if session is opened. + Standard_EXPORT virtual bool IsOpen() const Standard_OVERRIDE; + + //! Initialize session. + Standard_EXPORT virtual bool Open() Standard_OVERRIDE; + + //! Release session. + Standard_EXPORT virtual void Close() Standard_OVERRIDE; + + //! Fetch actual poses of tracked devices. + Standard_EXPORT virtual bool WaitPoses() Standard_OVERRIDE; + + //! Return recommended viewport Width x Height for rendering into VR. + virtual NCollection_Vec2 RecommendedViewport() const Standard_OVERRIDE { return myRendSize; } + + //! Return transformation from eye to head. + //! vr::GetEyeToHeadTransform() wrapper. + Standard_EXPORT virtual NCollection_Mat4 EyeToHeadTransform (Aspect_Eye theEye) const Standard_OVERRIDE; + + //! Return projection matrix. + Standard_EXPORT virtual NCollection_Mat4 ProjectionMatrix (Aspect_Eye theEye, + double theZNear, + double theZFar) const Standard_OVERRIDE; + + //! Return TRUE. + virtual bool HasProjectionFrustums() const Standard_OVERRIDE { return true; } + + //! Receive XR events. + Standard_EXPORT virtual void ProcessEvents() Standard_OVERRIDE; + + //! Submit texture eye to XR Composer. + //! @param theTexture [in] texture handle + //! @param theGraphicsLib [in] graphics library in which texture handle is defined + //! @param theColorSpace [in] texture color space; + //! sRGB means no color conversion by composer; + //! Linear means to sRGB color conversion by composer + //! @param theEye [in] eye to display + //! @return FALSE on error + Standard_EXPORT virtual bool SubmitEye (void* theTexture, + Aspect_GraphicsLibrary theGraphicsLib, + Aspect_ColorSpace theColorSpace, + Aspect_Eye theEye) Standard_OVERRIDE; + + //! Query information. + Standard_EXPORT virtual TCollection_AsciiString GetString (InfoString theInfo) const Standard_OVERRIDE; + + //! Return index of tracked device of known role. + Standard_EXPORT virtual Standard_Integer NamedTrackedDevice (Aspect_XRTrackedDeviceRole theDevice) const Standard_OVERRIDE; + + //! Fetch data for digital input action (like button). + Standard_EXPORT virtual Aspect_XRDigitalActionData GetDigitalActionData (const Handle(Aspect_XRAction)& theAction) const Standard_OVERRIDE; + + //! Fetch data for analog input action (like axis). + Standard_EXPORT virtual Aspect_XRAnalogActionData GetAnalogActionData (const Handle(Aspect_XRAction)& theAction) const Standard_OVERRIDE; + + //! Fetch data for pose input action (like fingertip position). + Standard_EXPORT virtual Aspect_XRPoseActionData GetPoseActionDataForNextFrame (const Handle(Aspect_XRAction)& theAction) const Standard_OVERRIDE; + + //! Set tracking origin. + Standard_EXPORT virtual void SetTrackingOrigin (TrackingUniverseOrigin theOrigin) Standard_OVERRIDE; + +protected: + + //! Find location of default actions manifest file (based on CSF_OCCTResourcePath or CASROOT variables). + Standard_EXPORT TCollection_AsciiString defaultActionsManifest(); + + //! Release OpenVR device. + Standard_EXPORT void closeVR(); + + //! Update projection frustums. + Standard_EXPORT virtual void updateProjectionFrustums(); + + //! Init VR input. + Standard_EXPORT virtual bool initInput(); + + //! Handle tracked device activation. + Standard_EXPORT virtual void onTrackedDeviceActivated (Standard_Integer theDeviceIndex); + + //! Handle tracked device deactivation. + Standard_EXPORT virtual void onTrackedDeviceDeactivated (Standard_Integer theDeviceIndex); + + //! Handle tracked device update. + Standard_EXPORT virtual void onTrackedDeviceUpdated (Standard_Integer theDeviceIndex); + + //! Trigger vibration. + Standard_EXPORT virtual void triggerHapticVibrationAction (const Handle(Aspect_XRAction)& theAction, + const Aspect_XRHapticActionData& theParams) Standard_OVERRIDE; + + //! Return model for displaying device. + Standard_EXPORT virtual Handle(Graphic3d_ArrayOfTriangles) loadRenderModel (Standard_Integer theDevice, + Standard_Boolean theToApplyUnitFactor, + Handle(Image_Texture)& theTexture) Standard_OVERRIDE; + +protected: + + //! Access vr::IVRSystem* - OpenVR session object. + Standard_EXPORT void* getVRSystem() const; + +private: + + //! Internal fields + struct VRContext; + class VRImagePixmap; + class VRTextureSource; + +protected: + + VRContext* myContext; + TCollection_AsciiString myActionsManifest; + +}; + +#endif // _Aspect_OpenVRSession_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_RectangularGrid.cxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_RectangularGrid.cxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_RectangularGrid.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_RectangularGrid.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -155,3 +155,25 @@ const Standard_Real beta) const { return (Abs( Sin(alpha) * Cos(beta + M_PI / 2.) - Cos(alpha) * Sin(beta + M_PI / 2.)) != 0) ; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Aspect_RectangularGrid::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS(theOStream, theDepth, Aspect_Grid) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myXStep) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myYStep) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFirstAngle) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySecondAngle) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, a1) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, b1) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, c1) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, a2) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, b2) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, c2) +} diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_RectangularGrid.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_RectangularGrid.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_RectangularGrid.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_RectangularGrid.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -67,6 +67,9 @@ Standard_EXPORT Standard_Real SecondAngle() const; Standard_EXPORT virtual void Init() Standard_OVERRIDE; + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; private: diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_TrackedDevicePose.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_TrackedDevicePose.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_TrackedDevicePose.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_TrackedDevicePose.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,36 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_TrackedDevicePose_HeaderFile +#define _Aspect_TrackedDevicePose_HeaderFile + +#include +#include + +//! Describes a single pose for a tracked object (for XR). +struct Aspect_TrackedDevicePose +{ + gp_Trsf Orientation; //!< device to absolute transformation + gp_Vec Velocity; //!< velocity in tracker space in m/s + gp_Vec AngularVelocity; //!< angular velocity in radians/s + bool IsValidPose; //!< indicates valid pose + bool IsConnectedDevice; //!< indicates connected state + + //! Empty constructor. + Aspect_TrackedDevicePose() : IsValidPose (false), IsConnectedDevice (false) {} +}; + +//! Array of tracked poses. +typedef NCollection_Array1 Aspect_TrackedDevicePoseArray; + +#endif // _Aspect_TrackedDevicePose_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_VKey.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_VKey.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_VKey.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_VKey.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -139,6 +139,20 @@ Aspect_VKey_BrowserFavorites, Aspect_VKey_BrowserHome, + // 3d view keys + Aspect_VKey_ViewTop, + Aspect_VKey_ViewBottom, + Aspect_VKey_ViewLeft, + Aspect_VKey_ViewRight, + Aspect_VKey_ViewFront, + Aspect_VKey_ViewBack, + Aspect_VKey_ViewAxoLeftProj, + Aspect_VKey_ViewAxoRightProj, + Aspect_VKey_ViewFitAll, + Aspect_VKey_ViewRoll90CW, + Aspect_VKey_ViewRoll90CCW, + Aspect_VKey_ViewSwitchRotate, + // modifier keys, @sa Aspect_VKey_ModifiersLower and Aspect_VKey_ModifiersUpper below Aspect_VKey_Shift, Aspect_VKey_Control, diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_VKeySet.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_VKeySet.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_VKeySet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_VKeySet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,6 +65,11 @@ return myKeys[theKey].Status == KeyStatus_Pressed; } + //! Return mutex for thread-safe updates. + //! All operations in class implicitly locks this mutex, + //! so this method could be used only for batch processing of keys. + Standard_Mutex& Mutex() { return myLock; } + public: //! Reset the key state into unpressed state. diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Window.cxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Window.cxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Window.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Window.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -92,3 +92,18 @@ { MyGradientBackground.SetColors (theFirstColor, theSecondColor, theFillMethod); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Aspect_Window::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &MyBackground) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &MyGradientBackground) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, MyBackgroundFillMethod) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, MyIsVirtual) +} diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Window.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Window.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_Window.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_Window.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,7 +58,7 @@ Standard_EXPORT virtual void Unmap() const = 0; //! Apply the resizing to the window . - Standard_EXPORT virtual Aspect_TypeOfResize DoResize() const = 0; + Standard_EXPORT virtual Aspect_TypeOfResize DoResize() = 0; //! Apply the mapping change to the window . //! and returns TRUE if the window is mapped at screen. @@ -114,6 +114,9 @@ //! on platforms implementing thread-unsafe connections to display. //! NULL can be passed instead otherwise. virtual void InvalidateContent (const Handle(Aspect_DisplayConnection)& theDisp) { (void )theDisp; } + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; DEFINE_STANDARD_RTTIEXT(Aspect_Window,Standard_Transient) diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRAction.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRAction.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRAction.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRAction.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,58 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_XRAction_HeaderFile +#define _Aspect_XRAction_HeaderFile + +#include +#include +#include +#include +#include + +//! XR action definition. +class Aspect_XRAction : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(Aspect_XRAction, Standard_Transient) +public: + + //! Return action id. + const TCollection_AsciiString& Id() const { return myId; } + + //! Return action type. + Aspect_XRActionType Type() const { return myType; } + + //! Return TRUE if action is defined. + bool IsValid() const { return myRawHandle != 0; } + + //! Return action handle. + uint64_t RawHandle() const { return myRawHandle; } + + //! Set action handle. + void SetRawHandle (uint64_t theHande) { myRawHandle = theHande; } + + //! Main constructor. + Aspect_XRAction (const TCollection_AsciiString& theId, + const Aspect_XRActionType theType) + : myId (theId), myRawHandle (0), myType (theType) {} + +protected: + TCollection_AsciiString myId; //!< action id + uint64_t myRawHandle; //!< action handle + Aspect_XRActionType myType; //!< action type +}; + +//! Map of actions with action Id as a key. +typedef NCollection_IndexedDataMap Aspect_XRActionMap; + +#endif // _Aspect_XRAction_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRActionSet.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRActionSet.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRActionSet.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRActionSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,55 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_XRActionSet_HeaderFile +#define _Aspect_XRActionSet_HeaderFile + +#include + +//! XR action set. +class Aspect_XRActionSet : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(Aspect_XRActionSet, Standard_Transient) +public: + + //! Return action id. + const TCollection_AsciiString& Id() const { return myId; } + + //! Return action handle. + uint64_t RawHandle() const { return myRawHandle; } + + //! Set action handle. + void SetRawHandle (uint64_t theHande) { myRawHandle = theHande; } + + //! Add action. + void AddAction (const Handle(Aspect_XRAction)& theAction) + { + myActions.Add (theAction->Id(), theAction); + } + + //! Return map of actions. + const Aspect_XRActionMap& Actions() const { return myActions; } + + //! Main constructor. + Aspect_XRActionSet (const TCollection_AsciiString& theId) + : myId (theId), myRawHandle (0) {} + +protected: + TCollection_AsciiString myId; //!< action set id + uint64_t myRawHandle; //!< action set handle + Aspect_XRActionMap myActions; //!< map of actions +}; + +typedef NCollection_IndexedDataMap Aspect_XRActionSetMap; + +#endif // _Aspect_XRActionSet_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRActionType.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRActionType.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRActionType.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRActionType.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,27 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_XRActionType_HeaderFile +#define _Aspect_XRActionType_HeaderFile + +//! XR action type. +enum Aspect_XRActionType +{ + Aspect_XRActionType_InputDigital, //!< boolean input (like button) + Aspect_XRActionType_InputAnalog, //!< analog input (1/2/3 axes) + Aspect_XRActionType_InputPose, //!< positional input + Aspect_XRActionType_InputSkeletal, //!< skeletal input + Aspect_XRActionType_OutputHaptic //!< haptic output (vibration) +}; + +#endif // _Aspect_XRActionType_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRAnalogActionData.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRAnalogActionData.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRAnalogActionData.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRAnalogActionData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,35 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_XRAnalogActionData_HeaderFile +#define _Aspect_XRAnalogActionData_HeaderFile + +#include + +//! Analog input XR action data. +struct Aspect_XRAnalogActionData +{ + uint64_t ActiveOrigin; //!< The origin that caused this action's current state + float UpdateTime; //!< Time relative to now when this event happened. Will be negative to indicate a past time + NCollection_Vec3 VecXYZ; //!< the current state of this action + NCollection_Vec3 DeltaXYZ; //!< deltas since the previous update + bool IsActive; //!< whether or not this action is currently available to be bound in the active action set + + //! Return TRUE if delta is non-zero. + bool IsChanged() { return !DeltaXYZ.IsEqual (NCollection_Vec3 (0.0f, 0.0f, 0.0f)); } + + //! Empty constructor. + Aspect_XRAnalogActionData() : ActiveOrigin (0), UpdateTime (0.0f), IsActive (false) {} +}; + +#endif // _Aspect_XRAnalogActionData_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRDigitalActionData.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRDigitalActionData.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRDigitalActionData.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRDigitalActionData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,32 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_XRDigitalActionData_HeaderFile +#define _Aspect_XRDigitalActionData_HeaderFile + +#include + +//! Digital input XR action data. +struct Aspect_XRDigitalActionData +{ + uint64_t ActiveOrigin; //!< The origin that caused this action's current state + float UpdateTime; //!< Time relative to now when this event happened. Will be negative to indicate a past time + bool IsActive; //!< whether or not this action is currently available to be bound in the active action set + bool IsPressed; //!< Aspect_InputActionType_Digital state - The current state of this action; will be true if currently pressed + bool IsChanged; //!< Aspect_InputActionType_Digital state - this is true if the state has changed since the last frame + + //! Empty constructor. + Aspect_XRDigitalActionData() : ActiveOrigin (0), UpdateTime (0.0f), IsActive (false), IsPressed (false), IsChanged (false) {} +}; + +#endif // _Aspect_XRDigitalActionData_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRGenericAction.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRGenericAction.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRGenericAction.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRGenericAction.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,40 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_XRGenericAction_HeaderFile +#define _Aspect_XRGenericAction_HeaderFile + +//! Generic XR action. +enum Aspect_XRGenericAction +{ + Aspect_XRGenericAction_IsHeadsetOn, //!< headset is on/off head + Aspect_XRGenericAction_InputAppMenu, //!< application menu button pressed/released + Aspect_XRGenericAction_InputSysMenu, //!< system menu button pressed/released + Aspect_XRGenericAction_InputTriggerPull, //!< trigger squeezing [0..1], 1 to click + Aspect_XRGenericAction_InputTriggerClick, //!< trigger clicked/released + Aspect_XRGenericAction_InputGripClick, //!< grip state on/off + Aspect_XRGenericAction_InputTrackPadPosition, //!< trackpad 2D position [-1,+1] with X and Y axes + Aspect_XRGenericAction_InputTrackPadTouch, //!< trackpad touched/untouched + Aspect_XRGenericAction_InputTrackPadClick, //!< trackpad clicked/released + Aspect_XRGenericAction_InputThumbstickPosition, //!< thumbstick 2D position [-1,+1] with X and Y axes + Aspect_XRGenericAction_InputThumbstickTouch, //!< thumbstick touched/untouched + Aspect_XRGenericAction_InputThumbstickClick, //!< thumbstick clicked/released + Aspect_XRGenericAction_InputPoseBase, //!< base position of hand + Aspect_XRGenericAction_InputPoseFront, //!< front position of hand + Aspect_XRGenericAction_InputPoseHandGrip, //!< position of main handgrip + Aspect_XRGenericAction_InputPoseFingerTip, //!< position of main fingertip + Aspect_XRGenericAction_OutputHaptic //!< haptic output (vibration) +}; +enum { Aspect_XRGenericAction_NB = Aspect_XRGenericAction_OutputHaptic + 1 }; + +#endif // _Aspect_XRGenericAction_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRHapticActionData.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRHapticActionData.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRHapticActionData.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRHapticActionData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,38 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_XRHapticActionData_HeaderFile +#define _Aspect_XRHapticActionData_HeaderFile + +//! Haptic output XR action data. +struct Aspect_XRHapticActionData +{ + float Delay; //!< delay in seconds before start + float Duration; //!< duration in seconds + float Frequency; //!< vibration frequency + float Amplitude; //!< vibration amplitude + + //! Return TRUE if data is not empty. + bool IsValid() const + { + return Duration > 0.0f + && Amplitude > 0.0f + && Frequency > 0.0f + && Delay >= 0.0f; + } + + //! Empty constructor. + Aspect_XRHapticActionData() : Delay (0.0f), Duration (0.0f), Frequency (0.0f), Amplitude (0.0f) {} +}; + +#endif // _Aspect_XRHapticActionData_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRPoseActionData.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRPoseActionData.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRPoseActionData.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRPoseActionData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,31 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_XRPoseActionData_HeaderFile +#define _Aspect_XRPoseActionData_HeaderFile + +#include +#include + +//! Pose input XR action data. +struct Aspect_XRPoseActionData +{ + Aspect_TrackedDevicePose Pose; //!< pose state + uint64_t ActiveOrigin; //!< The origin that caused this action's current state + bool IsActive; //!< whether or not this action is currently available to be bound in the active action set + + //! Empty constructor. + Aspect_XRPoseActionData() : ActiveOrigin (0), IsActive (false) {} +}; + +#endif // _Aspect_XRPoseActionData_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRSession.cxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRSession.cxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRSession.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRSession.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,60 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(Aspect_XRSession, Standard_Transient) +IMPLEMENT_STANDARD_RTTIEXT(Aspect_XRAction, Standard_Transient) +IMPLEMENT_STANDARD_RTTIEXT(Aspect_XRActionSet, Standard_Transient) + +// ======================================================================= +// function : Aspect_XRSession +// purpose : +// ======================================================================= +Aspect_XRSession::Aspect_XRSession() +: myTrackOrigin (TrackingUniverseOrigin_Standing), + myTrackedPoses (0, 0), + myUnitFactor (1.0), + myAspect (1.0), + myFieldOfView (90.0), + myIod (0.0), + myDispFreq (0.0f) +{ + for (Standard_Integer aRoleIter = 0; aRoleIter < Aspect_XRTrackedDeviceRole_NB; ++aRoleIter) + { + myRoleActions[aRoleIter].Resize (0, Aspect_XRGenericAction_NB - 1, false); + } +} + +// ======================================================================= +// function : AbortHapticVibrationAction +// purpose : +// ======================================================================= +void Aspect_XRSession::AbortHapticVibrationAction (const Handle(Aspect_XRAction)& theAction) +{ + triggerHapticVibrationAction (theAction, Aspect_XRHapticActionData()); +} + +// ======================================================================= +// function : TriggerHapticVibrationAction +// purpose : +// ======================================================================= +void Aspect_XRSession::TriggerHapticVibrationAction (const Handle(Aspect_XRAction)& theAction, + const Aspect_XRHapticActionData& theParams) +{ + if (!theParams.IsValid()) + { + throw Standard_ProgramError("Aspect_OpenVRSession::TriggerHapticVibrationAction() called for wrong action"); + } + triggerHapticVibrationAction (theAction, theParams); +} diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRSession.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRSession.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRSession.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRSession.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,262 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_XRSession_HeaderFile +#define _Aspect_XRSession_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Graphic3d_ArrayOfTriangles; +class Image_Texture; + +//! Extended Reality (XR) Session interface. +class Aspect_XRSession : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(Aspect_XRSession, Standard_Transient) +public: + + //! Identifies which style of tracking origin the application wants to use for the poses it is requesting. + enum TrackingUniverseOrigin + { + TrackingUniverseOrigin_Seated, //! poses are provided relative to the seated zero pose + TrackingUniverseOrigin_Standing, //! poses are provided relative to the safe bounds configured by the user + }; + +public: + + //! Return TRUE if session is opened. + virtual bool IsOpen() const = 0; + + //! Initialize session. + virtual bool Open() = 0; + + //! Release session. + virtual void Close() = 0; + + //! Fetch actual poses of tracked devices. + virtual bool WaitPoses() = 0; + + //! Return recommended viewport Width x Height for rendering into VR. + virtual NCollection_Vec2 RecommendedViewport() const = 0; + + //! Return transformation from eye to head. + virtual NCollection_Mat4 EyeToHeadTransform (Aspect_Eye theEye) const = 0; + + //! Return transformation from head to eye. + NCollection_Mat4 HeadToEyeTransform (Aspect_Eye theEye) const + { + NCollection_Mat4 aMat; + EyeToHeadTransform (theEye).Inverted (aMat); + return aMat; + } + + //! Return projection matrix. + virtual NCollection_Mat4 ProjectionMatrix (Aspect_Eye theEye, + double theZNear, + double theZFar) const = 0; + + //! Return FALSE if projection frustums are unsupported and general 4x4 projection matrix should be fetched instead + virtual bool HasProjectionFrustums() const = 0; + + //! Receive XR events. + virtual void ProcessEvents() = 0; + + //! Submit texture eye to XR Composer. + //! @param theTexture [in] texture handle + //! @param theGraphicsLib [in] graphics library in which texture handle is defined + //! @param theColorSpace [in] texture color space; + //! sRGB means no color conversion by composer; + //! Linear means to sRGB color conversion by composer + //! @param theEye [in] eye to display + //! @return FALSE on error + virtual bool SubmitEye (void* theTexture, + Aspect_GraphicsLibrary theGraphicsLib, + Aspect_ColorSpace theColorSpace, + Aspect_Eye theEye) = 0; + + //! Return unit scale factor defined as scale factor for m (meters); 1.0 by default. + Standard_Real UnitFactor() const { return myUnitFactor; } + + //! Set unit scale factor. + void SetUnitFactor (Standard_Real theFactor) { myUnitFactor = theFactor; } + + //! Return aspect ratio. + Standard_Real Aspect() const { return myAspect; } + + //! Return field of view. + Standard_Real FieldOfView() const { return myFieldOfView; } + + //! Return Intra-ocular Distance (IOD); also known as Interpupillary Distance (IPD). + //! Defined in meters by default (@sa UnitFactor()). + Standard_Real IOD() const { return myIod; } + + //! Return display frequency or 0 if unknown. + Standard_ShortReal DisplayFrequency() const { return myDispFreq; } + + //! Return projection frustum. + //! @sa HasProjectionFrustums(). + const Aspect_FrustumLRBT& ProjectionFrustum (Aspect_Eye theEye) const + { + return theEye == Aspect_Eye_Right ? myFrustumR : myFrustumL; + } + + //! Return head orientation in right-handed system: + //! +y is up + //! +x is to the right + //! -z is forward + //! Distance unit is meters by default (@sa UnitFactor()). + const gp_Trsf& HeadPose() const { return myHeadPose; } + + //! Return left hand orientation. + gp_Trsf LeftHandPose() const + { + const Standard_Integer aDevice = NamedTrackedDevice (Aspect_XRTrackedDeviceRole_LeftHand); + return aDevice != -1 ? myTrackedPoses[aDevice].Orientation : gp_Trsf(); + } + + //! Return right hand orientation. + gp_Trsf RightHandPose() const + { + const Standard_Integer aDevice = NamedTrackedDevice (Aspect_XRTrackedDeviceRole_RightHand); + return aDevice != -1 ? myTrackedPoses[aDevice].Orientation : gp_Trsf(); + } + + //! Return number of tracked poses array. + const Aspect_TrackedDevicePoseArray& TrackedPoses() const { return myTrackedPoses; } + + //! Return TRUE if device orientation is defined. + bool HasTrackedPose (Standard_Integer theDevice) const { return myTrackedPoses[theDevice].IsValidPose; } + + //! Return index of tracked device of known role, or -1 if undefined. + virtual Standard_Integer NamedTrackedDevice (Aspect_XRTrackedDeviceRole theDevice) const = 0; + + //! Load model for displaying device. + //! @param theDevice [in] device index + //! @param theTexture [out] texture source + //! @return model triangulation or NULL if not found + Handle(Graphic3d_ArrayOfTriangles) LoadRenderModel (Standard_Integer theDevice, + Handle(Image_Texture)& theTexture) + { + return loadRenderModel (theDevice, true, theTexture); + } + + //! Load model for displaying device. + //! @param theDevice [in] device index + //! @param theToApplyUnitFactor [in] flag to apply unit scale factor + //! @param theTexture [out] texture source + //! @return model triangulation or NULL if not found + Handle(Graphic3d_ArrayOfTriangles) LoadRenderModel (Standard_Integer theDevice, + Standard_Boolean theToApplyUnitFactor, + Handle(Image_Texture)& theTexture) + { + return loadRenderModel (theDevice, theToApplyUnitFactor, theTexture); + } + + //! Fetch data for digital input action (like button). + //! @param theAction [in] action of Aspect_XRActionType_InputDigital type + virtual Aspect_XRDigitalActionData GetDigitalActionData (const Handle(Aspect_XRAction)& theAction) const = 0; + + //! Fetch data for digital input action (like axis). + //! @param theAction [in] action of Aspect_XRActionType_InputAnalog type + virtual Aspect_XRAnalogActionData GetAnalogActionData (const Handle(Aspect_XRAction)& theAction) const = 0; + + //! Fetch data for pose input action (like fingertip position). + //! The returned values will match the values returned by the last call to WaitPoses(). + //! @param theAction [in] action of Aspect_XRActionType_InputPose type + virtual Aspect_XRPoseActionData GetPoseActionDataForNextFrame (const Handle(Aspect_XRAction)& theAction) const = 0; + + //! Trigger vibration. + Standard_EXPORT void TriggerHapticVibrationAction (const Handle(Aspect_XRAction)& theAction, + const Aspect_XRHapticActionData& theParams); + + //! Abort vibration. + Standard_EXPORT void AbortHapticVibrationAction (const Handle(Aspect_XRAction)& theAction); + + //! Return tracking origin. + TrackingUniverseOrigin TrackingOrigin() const { return myTrackOrigin; } + + //! Set tracking origin. + virtual void SetTrackingOrigin (TrackingUniverseOrigin theOrigin) { myTrackOrigin = theOrigin; } + + //! Return generic action for specific hand or NULL if undefined. + const Handle(Aspect_XRAction)& GenericAction (Aspect_XRTrackedDeviceRole theDevice, + Aspect_XRGenericAction theAction) const + { + const NCollection_Array1& anActions = myRoleActions[theDevice]; + return anActions[theAction]; + } + +public: + + //! Info string enumeration. + enum InfoString + { + InfoString_Vendor, + InfoString_Device, + InfoString_Tracker, + InfoString_SerialNumber, + }; + + //! Query information. + virtual TCollection_AsciiString GetString (InfoString theInfo) const = 0; + +protected: + + //! Empty constructor. + Standard_EXPORT Aspect_XRSession(); + + //! Load model for displaying device. + //! @param theDevice [in] device index + //! @param theToApplyUnitFactor [in] flag to apply unit scale factor + //! @param theTexture [out] texture source + //! @return model triangulation or NULL if not found + virtual Handle(Graphic3d_ArrayOfTriangles) loadRenderModel (Standard_Integer theDevice, + Standard_Boolean theToApplyUnitFactor, + Handle(Image_Texture)& theTexture) = 0; + + //! Trigger vibration. + virtual void triggerHapticVibrationAction (const Handle(Aspect_XRAction)& theAction, + const Aspect_XRHapticActionData& theParams) = 0; + +protected: + + NCollection_Array1 + myRoleActions[Aspect_XRTrackedDeviceRole_NB]; //!< generic actions + Aspect_XRActionSetMap myActionSets; //!< actions sets + TrackingUniverseOrigin myTrackOrigin; //!< tracking origin + Aspect_TrackedDevicePoseArray myTrackedPoses; //!< array of tracked poses + gp_Trsf myHeadPose; //!< head orientation + NCollection_Vec2 myRendSize; //!< viewport Width x Height for rendering into VR + Aspect_FrustumLRBT myFrustumL; //!< left eye projection frustum + Aspect_FrustumLRBT myFrustumR; //!< right eye projection frustum + Standard_Real myUnitFactor; //!< unit scale factor defined as scale factor for m (meters) + Standard_Real myAspect; //!< aspect ratio + Standard_Real myFieldOfView; //!< field of view + Standard_Real myIod; //!< intra-ocular distance in meters + Standard_ShortReal myDispFreq; //!< display frequency + +}; + +#endif // _Aspect_XRSession_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRTrackedDeviceRole.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRTrackedDeviceRole.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XRTrackedDeviceRole.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XRTrackedDeviceRole.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,27 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Aspect_XRTrackedDeviceRole_HeaderFile +#define _Aspect_XRTrackedDeviceRole_HeaderFile + +//! Predefined tracked devices. +enum Aspect_XRTrackedDeviceRole +{ + Aspect_XRTrackedDeviceRole_Head, //!< head + Aspect_XRTrackedDeviceRole_LeftHand, //!< left hand + Aspect_XRTrackedDeviceRole_RightHand, //!< right hand + Aspect_XRTrackedDeviceRole_Other, //!< other devices +}; +enum { Aspect_XRTrackedDeviceRole_NB = Aspect_XRTrackedDeviceRole_Other + 1 }; + +#endif // _Aspect_XRTrackedDeviceRole_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XWD.hxx opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XWD.hxx --- opencascade-7.4.1+dfsg1/src/Aspect/Aspect_XWD.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/Aspect_XWD.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,7 +14,7 @@ #ifndef __Aspect_WNTXWD_HXX # define __Aspect_WNTXWD_HXX -#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) +#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) # include # else diff -Nru opencascade-7.4.1+dfsg1/src/Aspect/FILES opencascade-7.5.1+dfsg1/src/Aspect/FILES --- opencascade-7.4.1+dfsg1/src/Aspect/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Aspect/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -5,26 +5,32 @@ Aspect_Background.hxx Aspect_CircularGrid.cxx Aspect_CircularGrid.hxx +Aspect_ColorSpace.hxx Aspect_Convert.hxx Aspect_Display.hxx Aspect_DisplayConnection.cxx Aspect_DisplayConnection.hxx Aspect_DisplayConnectionDefinitionError.hxx Aspect_Drawable.hxx +Aspect_Eye.hxx Aspect_FBConfig.hxx Aspect_FillMethod.hxx +Aspect_FrustumLRBT.hxx Aspect_GenId.cxx Aspect_GenId.hxx Aspect_GradientBackground.cxx Aspect_GradientBackground.hxx Aspect_GradientFillMethod.hxx Aspect_GraphicDeviceDefinitionError.hxx +Aspect_GraphicsLibrary.hxx Aspect_Grid.cxx Aspect_Grid.hxx Aspect_GridDrawMode.hxx Aspect_GridType.hxx Aspect_NeutralWindow.cxx Aspect_NeutralWindow.hxx +Aspect_OpenVRSession.cxx +Aspect_OpenVRSession.hxx Aspect_Handle.hxx Aspect_HatchStyle.hxx Aspect_IdentDefinitionError.hxx @@ -37,6 +43,7 @@ Aspect_ScrollDelta.hxx Aspect_Touch.hxx Aspect_TouchMap.hxx +Aspect_TrackedDevicePose.hxx Aspect_TypeOfColorScaleData.hxx Aspect_TypeOfColorScaleOrientation.hxx Aspect_TypeOfColorScalePosition.hxx @@ -60,4 +67,15 @@ Aspect_WindowDefinitionError.hxx Aspect_WindowError.hxx Aspect_XAtom.hxx +Aspect_XRAction.hxx +Aspect_XRActionSet.hxx +Aspect_XRActionType.hxx +Aspect_XRAnalogActionData.hxx +Aspect_XRDigitalActionData.hxx +Aspect_XRGenericAction.hxx +Aspect_XRHapticActionData.hxx +Aspect_XRPoseActionData.hxx +Aspect_XRSession.cxx +Aspect_XRSession.hxx +Aspect_XRTrackedDeviceRole.hxx Aspect_XWD.hxx diff -Nru opencascade-7.4.1+dfsg1/src/BinDrivers/BinDrivers_DocumentRetrievalDriver.cxx opencascade-7.5.1+dfsg1/src/BinDrivers/BinDrivers_DocumentRetrievalDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinDrivers/BinDrivers_DocumentRetrievalDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinDrivers/BinDrivers_DocumentRetrievalDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,7 +58,8 @@ void BinDrivers_DocumentRetrievalDriver::ReadShapeSection (BinLDrivers_DocumentSection& /*theSection*/, Standard_IStream& theIS, - const Standard_Boolean /*isMess*/) + const Standard_Boolean /*isMess*/, + const Message_ProgressRange& theRange) { // Read Shapes @@ -69,7 +70,7 @@ OCC_CATCH_SIGNALS Handle(BinMNaming_NamedShapeDriver) aNamedShapeDriver = Handle(BinMNaming_NamedShapeDriver)::DownCast (aDriver); - aNamedShapeDriver->ReadShapeSection (theIS); + aNamedShapeDriver->ReadShapeSection (theIS, theRange); } catch(Standard_Failure const& anException) { const TCollection_ExtendedString aMethStr diff -Nru opencascade-7.4.1+dfsg1/src/BinDrivers/BinDrivers_DocumentRetrievalDriver.hxx opencascade-7.5.1+dfsg1/src/BinDrivers/BinDrivers_DocumentRetrievalDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinDrivers/BinDrivers_DocumentRetrievalDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinDrivers/BinDrivers_DocumentRetrievalDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,11 +42,17 @@ //! Constructor Standard_EXPORT BinDrivers_DocumentRetrievalDriver(); - Standard_EXPORT virtual Handle(BinMDF_ADriverTable) AttributeDrivers (const Handle(Message_Messenger)& theMsgDriver) Standard_OVERRIDE; + Standard_EXPORT virtual Handle(BinMDF_ADriverTable) AttributeDrivers + (const Handle(Message_Messenger)& theMsgDriver) Standard_OVERRIDE; - Standard_EXPORT virtual void ReadShapeSection (BinLDrivers_DocumentSection& theSection, Standard_IStream& theIS, const Standard_Boolean isMess = Standard_False) Standard_OVERRIDE; + Standard_EXPORT virtual void ReadShapeSection + (BinLDrivers_DocumentSection& theSection, + Standard_IStream& theIS, + const Standard_Boolean isMess = Standard_False, + const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; - Standard_EXPORT virtual void CheckShapeSection (const Storage_Position& thePos, Standard_IStream& theIS) Standard_OVERRIDE; + Standard_EXPORT virtual void CheckShapeSection + (const Storage_Position& thePos, Standard_IStream& theIS) Standard_OVERRIDE; //! Clears the NamedShape driver Standard_EXPORT virtual void Clear() Standard_OVERRIDE; @@ -54,22 +60,6 @@ DEFINE_STANDARD_RTTIEXT(BinDrivers_DocumentRetrievalDriver,BinLDrivers_DocumentRetrievalDriver) -protected: - - - - -private: - - - - }; - - - - - - #endif // _BinDrivers_DocumentRetrievalDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinDrivers/BinDrivers_DocumentStorageDriver.cxx opencascade-7.5.1+dfsg1/src/BinDrivers/BinDrivers_DocumentStorageDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinDrivers/BinDrivers_DocumentStorageDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinDrivers/BinDrivers_DocumentStorageDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -99,7 +99,8 @@ //======================================================================= void BinDrivers_DocumentStorageDriver::WriteShapeSection (BinLDrivers_DocumentSection& theSection, - Standard_OStream& theOS) + Standard_OStream& theOS, + const Message_ProgressRange& theRange) { const Standard_Size aShapesSectionOffset = (Standard_Size) theOS.tellp(); @@ -110,7 +111,7 @@ OCC_CATCH_SIGNALS Handle(BinMNaming_NamedShapeDriver) aNamedShapeDriver = Handle(BinMNaming_NamedShapeDriver)::DownCast (aDriver); - aNamedShapeDriver->WriteShapeSection (theOS); + aNamedShapeDriver->WriteShapeSection (theOS, theRange); } catch(Standard_Failure const& anException) { TCollection_ExtendedString anErrorStr ("BinDrivers_DocumentStorageDriver, Shape Section :"); diff -Nru opencascade-7.4.1+dfsg1/src/BinDrivers/BinDrivers_DocumentStorageDriver.hxx opencascade-7.5.1+dfsg1/src/BinDrivers/BinDrivers_DocumentStorageDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinDrivers/BinDrivers_DocumentStorageDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinDrivers/BinDrivers_DocumentStorageDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,10 +39,14 @@ //! Constructor Standard_EXPORT BinDrivers_DocumentStorageDriver(); - Standard_EXPORT virtual Handle(BinMDF_ADriverTable) AttributeDrivers (const Handle(Message_Messenger)& theMsgDriver) Standard_OVERRIDE; + Standard_EXPORT virtual Handle(BinMDF_ADriverTable) AttributeDrivers + (const Handle(Message_Messenger)& theMsgDriver) Standard_OVERRIDE; //! implements the procedure of writing a shape section to file - Standard_EXPORT virtual void WriteShapeSection (BinLDrivers_DocumentSection& theDocSection, Standard_OStream& theOS) Standard_OVERRIDE; + Standard_EXPORT virtual void WriteShapeSection + (BinLDrivers_DocumentSection& theDocSection, + Standard_OStream& theOS, + const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; //! Return true if shape should be stored with triangles. Standard_EXPORT Standard_Boolean IsWithTriangles() const; @@ -53,22 +57,6 @@ DEFINE_STANDARD_RTTIEXT(BinDrivers_DocumentStorageDriver,BinLDrivers_DocumentStorageDriver) -protected: - - - - -private: - - - - }; - - - - - - #endif // _BinDrivers_DocumentStorageDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentRetrievalDriver.cxx opencascade-7.5.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentRetrievalDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentRetrievalDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentRetrievalDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,6 +42,8 @@ #include #include #include +#include + IMPLEMENT_STANDARD_RTTIEXT(BinLDrivers_DocumentRetrievalDriver,PCDM_RetrievalDriver) @@ -77,7 +79,8 @@ void BinLDrivers_DocumentRetrievalDriver::Read (const TCollection_ExtendedString& theFileName, const Handle(CDM_Document)& theNewDocument, - const Handle(CDM_Application)& theApplication) + const Handle(CDM_Application)& theApplication, + const Message_ProgressRange& theRange) { std::ifstream aFileStream; OSD_OpenStream (aFileStream, theFileName, std::ios::in | std::ios::binary); @@ -87,7 +90,12 @@ Handle(Storage_Data) dData; TCollection_ExtendedString aFormat = PCDM_ReadWriter::FileFormat (aFileStream, dData); - Read (aFileStream, dData, theNewDocument, theApplication); + Read(aFileStream, dData, theNewDocument, theApplication, theRange); + if (!theRange.More()) + { + myReaderStatus = PCDM_RS_UserBreak; + return; + } } else { @@ -108,7 +116,8 @@ void BinLDrivers_DocumentRetrievalDriver::Read (Standard_IStream& theIStream, const Handle(Storage_Data)& theStorageData, const Handle(CDM_Document)& theDoc, - const Handle(CDM_Application)& theApplication) + const Handle(CDM_Application)& theApplication, + const Message_ProgressRange& theRange) { myReaderStatus = PCDM_RS_DriverFailure; myMsgDriver = theApplication -> MessageDriver(); @@ -224,6 +233,8 @@ Handle(TDF_Data) aData = new TDF_Data(); std::streampos aDocumentPos = -1; + Message_ProgressScope aPS(theRange, "Reading data", 3); + // 2b. Read the TOC of Sections if (aFileVer >= 3) { BinLDrivers_DocumentSection aSection; @@ -246,10 +257,17 @@ BinLDrivers_DocumentSection& aCurSection = anIterS.ChangeValue(); if (aCurSection.IsPostRead() == Standard_False) { theIStream.seekg ((std::streampos) aCurSection.Offset()); - if (aCurSection.Name().IsEqual ((Standard_CString)SHAPESECTION_POS)) - ReadShapeSection (aCurSection, theIStream); + if (aCurSection.Name().IsEqual ((Standard_CString)SHAPESECTION_POS)) + { + ReadShapeSection (aCurSection, theIStream, false, aPS.Next()); + if (!aPS.More()) + { + myReaderStatus = PCDM_RS_UserBreak; + return; + } + } else - ReadSection (aCurSection, theDoc, theIStream); + ReadSection (aCurSection, theDoc, theIStream); } } } else { //aFileVer < 3 @@ -287,7 +305,12 @@ CheckShapeSection(aShapeSectionPos, theIStream); // Read Shapes BinLDrivers_DocumentSection aCurSection; - ReadShapeSection (aCurSection, theIStream, Standard_False); + ReadShapeSection (aCurSection, theIStream, Standard_False, aPS.Next()); + if (!aPS.More()) + { + myReaderStatus = PCDM_RS_UserBreak; + return; + } } } } // end of reading Sections or shape section @@ -300,8 +323,20 @@ theIStream.read ((char*)&aTag, sizeof(Standard_Integer)); // read sub-tree of the root label - Standard_Integer nbRead = ReadSubTree (theIStream, aData->Root()); + Standard_Integer nbRead = ReadSubTree (theIStream, aData->Root(), aPS.Next()); + if (!aPS.More()) + { + myReaderStatus = PCDM_RS_UserBreak; + return; + } + Clear(); + if (!aPS.More()) + { + myReaderStatus = PCDM_RS_UserBreak; + return; + } + aPS.Next(); if (nbRead > 0) { // attach data to the document @@ -331,17 +366,27 @@ Standard_Integer BinLDrivers_DocumentRetrievalDriver::ReadSubTree (Standard_IStream& theIS, - const TDF_Label& theLabel) + const TDF_Label& theLabel, + const Message_ProgressRange& theRange) { Standard_Integer nbRead = 0; TCollection_ExtendedString aMethStr ("BinLDrivers_DocumentRetrievalDriver: "); + Message_ProgressScope aPS(theRange, "Reading sub tree", 2, true); + // Read attributes: theIS >> myPAtt; while (theIS && myPAtt.TypeId() > 0 && // not an end marker ? myPAtt.Id() > 0 && // not a garbage ? - !theIS.eof()) { + !theIS.eof()) + { + if (!aPS.More()) + { + myReaderStatus = PCDM_RS_UserBreak; + return -1; + } + // get a driver according to TypeId Handle(BinMDF_ADriver) aDriver = myDrivers->GetDriver (myPAtt.TypeId()); if (!aDriver.IsNull()) { @@ -407,12 +452,19 @@ #if DO_INVERSE aTag = InverseInt (aTag); #endif + while (theIS && aTag >= 0 && !theIS.eof()) { // not an end marker ? // create sub-label TDF_Label aLab = theLabel.FindChild (aTag, Standard_True); + if (!aPS.More()) + { + myReaderStatus = PCDM_RS_UserBreak; + return -1; + } + // read sub-tree - Standard_Integer nbSubRead = ReadSubTree(theIS, aLab); + Standard_Integer nbSubRead = ReadSubTree (theIS, aLab, aPS.Next()); // check for error if (nbSubRead == -1) return -1; @@ -424,6 +476,7 @@ aTag = InverseInt (aTag); #endif } + if (aTag != BinLDrivers_ENDLABEL) { // invalid end label marker myMsgDriver->Send (aMethStr + "error: invalid end label marker", Message_Fail); @@ -465,8 +518,9 @@ void BinLDrivers_DocumentRetrievalDriver::ReadShapeSection (BinLDrivers_DocumentSection& theSection, - Standard_IStream& /*theIS*/, - const Standard_Boolean isMess) + Standard_IStream& /*theIS*/, + const Standard_Boolean isMess, + const Message_ProgressRange &/*theRange*/) { if(isMess && theSection.Length()) { diff -Nru opencascade-7.4.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentRetrievalDriver.hxx opencascade-7.5.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentRetrievalDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentRetrievalDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentRetrievalDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,12 +59,16 @@ Standard_EXPORT virtual Handle(CDM_Document) CreateDocument() Standard_OVERRIDE; //! retrieves the content of the file into a new Document. - Standard_EXPORT virtual void Read (const TCollection_ExtendedString& theFileName, const Handle(CDM_Document)& theNewDocument, const Handle(CDM_Application)& theApplication) Standard_OVERRIDE; + Standard_EXPORT virtual void Read (const TCollection_ExtendedString& theFileName, + const Handle(CDM_Document)& theNewDocument, + const Handle(CDM_Application)& theApplication, + const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE; Standard_EXPORT virtual void Read (Standard_IStream& theIStream, const Handle(Storage_Data)& theStorageData, const Handle(CDM_Document)& theDoc, - const Handle(CDM_Application)& theApplication) Standard_OVERRIDE; + const Handle(CDM_Application)& theApplication, + const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE; Standard_EXPORT virtual Handle(BinMDF_ADriverTable) AttributeDrivers (const Handle(Message_Messenger)& theMsgDriver); @@ -77,14 +81,24 @@ //! Read the tree from the stream to - Standard_EXPORT virtual Standard_Integer ReadSubTree (Standard_IStream& theIS, const TDF_Label& theData); + Standard_EXPORT virtual Standard_Integer ReadSubTree + (Standard_IStream& theIS, + const TDF_Label& theData, + const Message_ProgressRange& theRanges = Message_ProgressRange()); //! define the procedure of reading a section to file. - Standard_EXPORT virtual void ReadSection (BinLDrivers_DocumentSection& theSection, const Handle(CDM_Document)& theDoc, Standard_IStream& theIS); + Standard_EXPORT virtual void ReadSection + (BinLDrivers_DocumentSection& theSection, + const Handle(CDM_Document)& theDoc, + Standard_IStream& theIS); //! define the procedure of reading a shapes section to file. - Standard_EXPORT virtual void ReadShapeSection (BinLDrivers_DocumentSection& theSection, Standard_IStream& theIS, const Standard_Boolean isMess = Standard_False); + Standard_EXPORT virtual void ReadShapeSection + (BinLDrivers_DocumentSection& theSection, + Standard_IStream& theIS, + const Standard_Boolean isMess = Standard_False, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! checks the shapes section can be correctly retreived. Standard_EXPORT virtual void CheckShapeSection (const Storage_Position& thePos, Standard_IStream& theIS); diff -Nru opencascade-7.4.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentSection.hxx opencascade-7.5.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentSection.hxx --- opencascade-7.4.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentSection.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentSection.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ #include #include #include +#include + class TCollection_AsciiString; diff -Nru opencascade-7.4.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentStorageDriver.cxx opencascade-7.5.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentStorageDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentStorageDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentStorageDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,6 +42,7 @@ #include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(BinLDrivers_DocumentStorageDriver,PCDM_StorageDriver) @@ -63,7 +64,8 @@ void BinLDrivers_DocumentStorageDriver::Write (const Handle(CDM_Document)& theDocument, - const TCollection_ExtendedString& theFileName) + const TCollection_ExtendedString& theFileName, + const Message_ProgressRange& theRange) { SetIsError(Standard_False); SetStoreStatus(PCDM_SS_OK); @@ -75,7 +77,7 @@ if (aFileStream.is_open() && aFileStream.good()) { - Write (theDocument, aFileStream); + Write(theDocument, aFileStream, theRange); } else { @@ -89,7 +91,9 @@ //purpose : //======================================================================= -void BinLDrivers_DocumentStorageDriver::Write (const Handle(CDM_Document)& theDoc, Standard_OStream& theOStream) +void BinLDrivers_DocumentStorageDriver::Write (const Handle(CDM_Document)& theDoc, + Standard_OStream& theOStream, + const Message_ProgressRange& theRange) { myMsgDriver = theDoc->Application()->MessageDriver(); myMapUnsupported.Clear(); @@ -136,11 +140,25 @@ myRelocTable.Clear(); myPAtt.Init(); + Message_ProgressScope aPS(theRange, "Writing document", 3); + // Write Doc structure - WriteSubTree (aData->Root(), theOStream); // Doc is written + WriteSubTree (aData->Root(), theOStream, aPS.Next()); // Doc is written + if (!aPS.More()) + { + SetIsError(Standard_True); + SetStoreStatus(PCDM_SS_UserBreak); + return; + } // 4. Write Shapes section - WriteShapeSection (aShapesSection, theOStream); + WriteShapeSection (aShapesSection, theOStream, aPS.Next()); + if (!aPS.More()) + { + SetIsError(Standard_True); + SetStoreStatus(PCDM_SS_UserBreak); + return; + } // Write application-defined sections for (anIterS.Init (mySections); anIterS.More(); anIterS.Next()) { @@ -164,7 +182,13 @@ SetStoreStatus(PCDM_SS_No_Obj); } myRelocTable.Clear(); - + if (!aPS.More()) + { + SetIsError(Standard_True); + SetStoreStatus(PCDM_SS_UserBreak); + return; + } + aPS.Next(); if (!theOStream) { // A problem with the stream #ifdef OCCT_DEBUG @@ -204,15 +228,16 @@ //======================================================================= void BinLDrivers_DocumentStorageDriver::WriteSubTree - (const TDF_Label& theLabel, - Standard_OStream& theOS) + (const TDF_Label& theLabel, + Standard_OStream& theOS, + const Message_ProgressRange& theRange) { // Skip empty labels if (!myEmptyLabels.IsEmpty() && myEmptyLabels.First() == theLabel) { myEmptyLabels.RemoveFirst(); return; } - + Message_ProgressScope aPS(theRange, "Writing sub tree", 2, true); // Write label header: tag Standard_Integer aTag = theLabel.Tag(); #if DO_INVERSE @@ -222,8 +247,8 @@ // Write attributes TDF_AttributeIterator itAtt (theLabel); - for ( ; itAtt.More() && theOS; itAtt.Next()) { - const Handle(TDF_Attribute)& tAtt = itAtt.Value(); + for ( ; itAtt.More() && theOS && aPS.More(); itAtt.Next()) { + const Handle(TDF_Attribute) tAtt = itAtt.Value(); const Handle(Standard_Type)& aType = tAtt->DynamicType(); // Get type ID and driver Handle(BinMDF_ADriver) aDriver; @@ -249,7 +274,12 @@ // Problem with the stream return; } - + if (!aPS.More()) + { + SetIsError(Standard_True); + SetStoreStatus(PCDM_SS_UserBreak); + return; + } // Write the end attributes list marker BinLDrivers_Marker anEndAttr = BinLDrivers_ENDATTRLIST; #if DO_INVERSE @@ -262,7 +292,13 @@ for ( ; itChld.More(); itChld.Next()) { const TDF_Label& aChildLab = itChld.Value(); - WriteSubTree (aChildLab, theOS); + if (!aPS.More()) + { + SetIsError(Standard_True); + SetStoreStatus(PCDM_SS_UserBreak); + return; + } + WriteSubTree (aChildLab, theOS, aPS.Next()); } // Write the end label marker @@ -509,7 +545,8 @@ //======================================================================= void BinLDrivers_DocumentStorageDriver::WriteShapeSection (BinLDrivers_DocumentSection& theSection, - Standard_OStream& theOS) + Standard_OStream& theOS, + const Message_ProgressRange& /*theRange*/) { const Standard_Size aShapesSectionOffset = (Standard_Size) theOS.tellp(); theSection.Write (theOS, aShapesSectionOffset); diff -Nru opencascade-7.4.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentStorageDriver.hxx opencascade-7.5.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentStorageDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentStorageDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinLDrivers/BinLDrivers_DocumentStorageDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -52,10 +52,14 @@ Standard_EXPORT BinLDrivers_DocumentStorageDriver(); //! Write to the binary file - Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, const TCollection_ExtendedString& theFileName) Standard_OVERRIDE; + Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, + const TCollection_ExtendedString& theFileName, + const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; //! Write to theOStream - Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, Standard_OStream& theOStream) Standard_OVERRIDE; + Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, + Standard_OStream& theOStream, + const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; Standard_EXPORT virtual Handle(BinMDF_ADriverTable) AttributeDrivers (const Handle(Message_Messenger)& theMsgDriver); @@ -71,13 +75,19 @@ //! Write the tree under to the stream - Standard_EXPORT void WriteSubTree (const TDF_Label& theData, Standard_OStream& theOS); + Standard_EXPORT void WriteSubTree (const TDF_Label& theData, + Standard_OStream& theOS, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! define the procedure of writing a section to file. - Standard_EXPORT virtual void WriteSection (const TCollection_AsciiString& theName, const Handle(CDM_Document)& theDoc, Standard_OStream& theOS); + Standard_EXPORT virtual void WriteSection (const TCollection_AsciiString& theName, + const Handle(CDM_Document)& theDoc, + Standard_OStream& theOS); //! defines the procedure of writing a shape section to file - Standard_EXPORT virtual void WriteShapeSection (BinLDrivers_DocumentSection& theDocSection, Standard_OStream& theOS); + Standard_EXPORT virtual void WriteShapeSection (BinLDrivers_DocumentSection& theDocSection, + Standard_OStream& theOS, + const Message_ProgressRange& theRange = Message_ProgressRange()); Handle(BinMDF_ADriverTable) myDrivers; BinObjMgt_SRelocationTable myRelocTable; @@ -85,7 +95,6 @@ private: - Standard_EXPORT void FirstPass (const TDF_Label& theRoot); //! Returns true if and its sub-labels do not contain @@ -104,13 +113,6 @@ BinLDrivers_VectorOfDocumentSection mySections; TCollection_ExtendedString myFileName; - }; - - - - - - #endif // _BinLDrivers_DocumentStorageDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_CommentDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_CommentDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_CommentDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_CommentDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -// Created on: 2001-08-24 -// Created by: Alexnder GRIGORIEV -// Copyright (c) 2001-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataStd_CommentDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataStd_CommentDriver -//purpose : Constructor -//======================================================================= -BinMDataStd_CommentDriver::BinMDataStd_CommentDriver - (const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver (theMsgDriver, NULL) -{} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMDataStd_CommentDriver::NewEmpty() const -{ - return (new TDataStd_Comment()); -} - -//======================================================================= -//function : Paste -//purpose : -//======================================================================= -Standard_Boolean BinMDataStd_CommentDriver::Paste - (const BinObjMgt_Persistent& theSource, - const Handle(TDF_Attribute)& theTarget, - BinObjMgt_RRelocationTable& ) const -{ - TCollection_ExtendedString aString; - Standard_Boolean ok = theSource >> aString; - if (ok) - Handle(TDataStd_Comment)::DownCast(theTarget) -> Set (aString); - return ok; -} - -//======================================================================= -//function : Paste -//purpose : -//======================================================================= -void BinMDataStd_CommentDriver::Paste (const Handle(TDF_Attribute)& theSource, - BinObjMgt_Persistent& theTarget, - BinObjMgt_SRelocationTable& ) const -{ - TCollection_ExtendedString aName = - Handle(TDataStd_Comment)::DownCast(theSource) -> Get(); - theTarget << aName; -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_CommentDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_CommentDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_CommentDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_CommentDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2001-08-24 -// Created by: Alexander GRIGORIEV -// Copyright (c) 2001-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataStd_CommentDriver_HeaderFile -#define _BinMDataStd_CommentDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataStd_CommentDriver; -DEFINE_STANDARD_HANDLE(BinMDataStd_CommentDriver, BinMDF_ADriver) - -//! Attribute Driver. -class BinMDataStd_CommentDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataStd_CommentDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - Standard_EXPORT void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataStd_CommentDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataStd_CommentDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,8 +19,6 @@ #include #include #include -#include -#include #include #include #include @@ -29,15 +27,13 @@ #include #include #include -#include -#include +#include #include #include #include #include #include -#include -#include +#include #include #include #include @@ -52,31 +48,26 @@ void BinMDataStd::AddDrivers (const Handle(BinMDF_ADriverTable)& theDriverTable, const Handle(Message_Messenger)& theMsgDriver) { - theDriverTable->AddDriver (new BinMDataStd_CommentDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_ExpressionDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_IntegerArrayDriver(theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_IntegerDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_NameDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_RealArrayDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_RealDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_RelationDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_TreeNodeDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_UAttributeDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_VariableDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_DirectoryDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_NoteBookDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_ExtStringArrayDriver(theMsgDriver) ); - - theDriverTable->AddDriver (new BinMDataStd_TickDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_IntegerListDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_RealListDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_ExtStringListDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_BooleanListDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_ReferenceListDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_BooleanArrayDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_ReferenceArrayDriver(theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_ByteArrayDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_NamedDataDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_AsciiStringDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataStd_IntPackedMapDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_ExpressionDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_IntegerArrayDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_IntegerDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_GenericExtStringDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_RealArrayDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_RealDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_TreeNodeDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_UAttributeDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_VariableDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_ExtStringArrayDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_GenericEmptyDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_IntegerListDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_RealListDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_ExtStringListDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_BooleanListDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_ReferenceListDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_BooleanArrayDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_ReferenceArrayDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_ByteArrayDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_NamedDataDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_AsciiStringDriver (theMsgDriver) ); + theDriverTable->AddDriver (new BinMDataStd_IntPackedMapDriver (theMsgDriver) ); } diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_DirectoryDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_DirectoryDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_DirectoryDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_DirectoryDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataStd_DirectoryDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataStd_DirectoryDriver -//purpose : -//======================================================================= -BinMDataStd_DirectoryDriver::BinMDataStd_DirectoryDriver - (const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataStd_Directory)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= - -Handle(TDF_Attribute) BinMDataStd_DirectoryDriver::NewEmpty() const -{ - return new TDataStd_Directory(); -} - -//======================================================================= -//function : Paste -//purpose : persistent -> transient (retrieve) -//======================================================================= - -Standard_Boolean BinMDataStd_DirectoryDriver::Paste - (const BinObjMgt_Persistent&, - const Handle(TDF_Attribute)&, - BinObjMgt_RRelocationTable& ) const -{return Standard_True;} - -//======================================================================= -//function : Paste -//purpose : transient -> persistent (store) -//======================================================================= - -void BinMDataStd_DirectoryDriver::Paste (const Handle(TDF_Attribute)&, - BinObjMgt_Persistent&, - BinObjMgt_SRelocationTable& ) const -{} - - - diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_DirectoryDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_DirectoryDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_DirectoryDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_DirectoryDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataStd_DirectoryDriver_HeaderFile -#define _BinMDataStd_DirectoryDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataStd_DirectoryDriver; -DEFINE_STANDARD_HANDLE(BinMDataStd_DirectoryDriver, BinMDF_ADriver) - -//! Directory attribute Driver. -class BinMDataStd_DirectoryDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataStd_DirectoryDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataStd_DirectoryDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataStd_DirectoryDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericEmptyDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericEmptyDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericEmptyDriver.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericEmptyDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,72 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(BinMDataStd_GenericEmptyDriver,BinMDF_ADriver) + +//======================================================================= +//function : BinMDataStd_GenericEmptyDriver +//purpose : +//======================================================================= +BinMDataStd_GenericEmptyDriver::BinMDataStd_GenericEmptyDriver(const Handle(Message_Messenger)& theMsgDriver) +: BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataStd_GenericEmpty)->Name()) +{} + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) BinMDataStd_GenericEmptyDriver::NewEmpty() const +{ + return Handle(TDF_Attribute)(); // this attribute can not be created +} + +//======================================================================= +//function : SourceType +//purpose : +//======================================================================= +const Handle(Standard_Type)& BinMDataStd_GenericEmptyDriver::SourceType() const +{ + return Standard_Type::Instance(); +} + +//======================================================================= +//function : Paste +//purpose : persistent -> transient (retrieve) +//======================================================================= +Standard_Boolean BinMDataStd_GenericEmptyDriver::Paste(const BinObjMgt_Persistent&, + const Handle(TDF_Attribute)&, + BinObjMgt_RRelocationTable& ) const +{ + return Standard_True; +} + +//======================================================================= +//function : Paste +//purpose : transient -> persistent (store) +//======================================================================= +void BinMDataStd_GenericEmptyDriver::Paste(const Handle(TDF_Attribute)&, + BinObjMgt_Persistent&, + BinObjMgt_SRelocationTable& ) const +{ +} diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericEmptyDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericEmptyDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericEmptyDriver.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericEmptyDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,72 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _BinMDataStd_GenericEmptyDriver_HeaderFile +#define _BinMDataStd_GenericEmptyDriver_HeaderFile + +#include +#include + +#include +#include +#include +#include +class Message_Messenger; +class TDF_Attribute; +class BinObjMgt_Persistent; + + +class BinMDataStd_GenericEmptyDriver; +DEFINE_STANDARD_HANDLE(BinMDataStd_GenericEmptyDriver, BinMDF_ADriver) + +//! GenericEmpty attribute driver. +class BinMDataStd_GenericEmptyDriver : public BinMDF_ADriver +{ + +public: + + + Standard_EXPORT BinMDataStd_GenericEmptyDriver(const Handle(Message_Messenger)& theMessageDriver); + + Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; + + Standard_EXPORT virtual const Handle(Standard_Type)& SourceType() const Standard_OVERRIDE; + + Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; + + Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; + + + + + DEFINE_STANDARD_RTTIEXT(BinMDataStd_GenericEmptyDriver,BinMDF_ADriver) + +protected: + + + + +private: + + + + +}; + + + + + + + +#endif // _BinMDataStd_GenericEmptyDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericExtStringDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericExtStringDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericExtStringDriver.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericExtStringDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,98 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + + +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(BinMDataStd_GenericExtStringDriver,BinMDF_ADriver) + +//======================================================================= +//function : BinMDataStd_GenericExtStringDriver +//purpose : +//======================================================================= +BinMDataStd_GenericExtStringDriver::BinMDataStd_GenericExtStringDriver + (const Handle(Message_Messenger)& theMessageDriver) + : BinMDF_ADriver (theMessageDriver, STANDARD_TYPE(TDataStd_GenericExtString)->Name()) +{ +} + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) BinMDataStd_GenericExtStringDriver::NewEmpty() const +{ + return new TDataStd_Name; +} + +//======================================================================= +//function : SourceType +//purpose : +//======================================================================= +Handle(Standard_Type)& BinMDataStd_GenericExtStringDriver::SourceType() const +{ + static Handle(Standard_Type) aSourceType = Standard_Type::Instance(); + return aSourceType; +} + +//======================================================================= +//function : Paste +//purpose : persistent -> transient (retrieve) +//======================================================================= + +Standard_Boolean BinMDataStd_GenericExtStringDriver::Paste + (const BinObjMgt_Persistent& Source, + const Handle(TDF_Attribute)& Target, + BinObjMgt_RRelocationTable& RelocTable) const +{ + Handle(TDataStd_GenericExtString) aStrAttr = Handle(TDataStd_GenericExtString)::DownCast(Target); + TCollection_ExtendedString aStr; + Standard_Boolean ok = Source >> aStr; + if (ok) + aStrAttr->Set( aStr ); + if(RelocTable.GetHeaderData()->StorageVersion().IntegerValue() > 8) { // process user defined guid + const Standard_Integer& aPos = Source.Position(); + Standard_GUID aGuid; + ok = Source >> aGuid; + if (!ok) { + Source.SetPosition(aPos); + ok = Standard_True; + } else { + aStrAttr->SetID(aGuid); + } + } + return ok; +} + +//======================================================================= +//function : Paste +//purpose : transient -> persistent (store) +//======================================================================= + +void BinMDataStd_GenericExtStringDriver::Paste + (const Handle(TDF_Attribute)& Source, + BinObjMgt_Persistent& Target, + BinObjMgt_SRelocationTable& /*RelocTable*/) const +{ + Handle(TDataStd_GenericExtString) aStrAttr = Handle(TDataStd_GenericExtString)::DownCast(Source); + Target << aStrAttr->Get(); + // process user defined guid + Target << aStrAttr->ID(); +} diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericExtStringDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericExtStringDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericExtStringDriver.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_GenericExtStringDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,74 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _BinMDataStd_GenericExtStringDriver_HeaderFile +#define _BinMDataStd_GenericExtStringDriver_HeaderFile + +#include +#include + +#include +#include +#include +#include +class Message_Messenger; +class TDF_Attribute; +class BinObjMgt_Persistent; + + +class BinMDataStd_GenericExtStringDriver; +DEFINE_STANDARD_HANDLE(BinMDataStd_GenericExtStringDriver, BinMDF_ADriver) + +//! TDataStd_Name attribute Driver. +class BinMDataStd_GenericExtStringDriver : public BinMDF_ADriver +{ + +public: + + + Standard_EXPORT BinMDataStd_GenericExtStringDriver(const Handle(Message_Messenger)& theMessageDriver); + + Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; + + Standard_EXPORT virtual Handle(Standard_Type)& SourceType() const Standard_OVERRIDE; + + //! persistent -> transient (retrieve) + Standard_EXPORT Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; + + //! transient -> persistent (store) + Standard_EXPORT void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; + + + + + DEFINE_STANDARD_RTTIEXT(BinMDataStd_GenericExtStringDriver,BinMDF_ADriver) + +protected: + + + + +private: + + + + +}; + + + + + + + +#endif // _BinMDataStd_GenericExtStringDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd.hxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -68,21 +68,17 @@ -friend class BinMDataStd_NameDriver; +friend class BinMDataStd_GenericExtStringDriver; friend class BinMDataStd_IntegerDriver; friend class BinMDataStd_RealDriver; friend class BinMDataStd_IntegerArrayDriver; friend class BinMDataStd_RealArrayDriver; friend class BinMDataStd_UAttributeDriver; -friend class BinMDataStd_DirectoryDriver; -friend class BinMDataStd_CommentDriver; friend class BinMDataStd_VariableDriver; friend class BinMDataStd_ExpressionDriver; -friend class BinMDataStd_RelationDriver; -friend class BinMDataStd_NoteBookDriver; friend class BinMDataStd_TreeNodeDriver; friend class BinMDataStd_ExtStringArrayDriver; -friend class BinMDataStd_TickDriver; +friend class BinMDataStd_GenericEmptyDriver; friend class BinMDataStd_AsciiStringDriver; friend class BinMDataStd_IntPackedMapDriver; friend class BinMDataStd_IntegerListDriver; diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_IntegerDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_IntegerDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_IntegerDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_IntegerDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,7 +65,6 @@ ok = theSource >> aGuid; if (!ok) { theSource.SetPosition(aPos); - anAtt->SetID(TDataStd_Integer::GetID()); ok = Standard_True; } else { anAtt->SetID(aGuid); diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_NamedDataDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_NamedDataDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_NamedDataDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_NamedDataDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -204,6 +204,7 @@ if(S.IsNull()) return; // Standard_Integer i=0; + S->LoadDeferredData(); if(S->HasIntegers() && !S->GetIntegersContainer().IsEmpty()) { theTarget.PutInteger(1) << S->GetIntegersContainer().Extent(); //dim TColStd_DataMapIteratorOfDataMapOfStringInteger itr(S->GetIntegersContainer()); diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_NameDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_NameDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_NameDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_NameDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -// Created on: 2002-11-19 -// Created by: Edward AGAPOV (eap) -// Copyright (c) 2002-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataStd_NameDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataStd_NameDriver -//purpose : -//======================================================================= -BinMDataStd_NameDriver::BinMDataStd_NameDriver - (const Handle(Message_Messenger)& theMessageDriver) - : BinMDF_ADriver (theMessageDriver, STANDARD_TYPE(TDataStd_Name)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= - -Handle(TDF_Attribute) BinMDataStd_NameDriver::NewEmpty() const -{ - return new TDataStd_Name; -} - -//======================================================================= -//function : Paste -//purpose : persistent -> transient (retrieve) -//======================================================================= - -Standard_Boolean BinMDataStd_NameDriver::Paste - (const BinObjMgt_Persistent& Source, - const Handle(TDF_Attribute)& Target, - BinObjMgt_RRelocationTable& RelocTable) const -{ - Handle(TDataStd_Name) aName = Handle(TDataStd_Name)::DownCast(Target); - TCollection_ExtendedString aStr; - Standard_Boolean ok = Source >> aStr; - if (ok) - aName->Set( aStr ); - if(RelocTable.GetHeaderData()->StorageVersion().IntegerValue() > 8) { // process user defined guid - const Standard_Integer& aPos = Source.Position(); - Standard_GUID aGuid; - ok = Source >> aGuid; - if (!ok) { - Source.SetPosition(aPos); - aName->SetID(TDataStd_Name::GetID()); - ok = Standard_True; - } else { - aName->SetID(aGuid); - } - } else - aName->SetID(TDataStd_Name::GetID()); - return ok; -} - -//======================================================================= -//function : Paste -//purpose : transient -> persistent (store) -//======================================================================= - -void BinMDataStd_NameDriver::Paste - (const Handle(TDF_Attribute)& Source, - BinObjMgt_Persistent& Target, - BinObjMgt_SRelocationTable& /*RelocTable*/) const -{ - Handle(TDataStd_Name) aName = Handle(TDataStd_Name)::DownCast(Source); - Target << aName->Get(); - // process user defined guid - if(aName->ID() != TDataStd_Name::GetID()) - Target << aName->ID(); -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_NameDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_NameDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_NameDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_NameDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -// Created on: 2002-11-19 -// Created by: Edward AGAPOV -// Copyright (c) 2002-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataStd_NameDriver_HeaderFile -#define _BinMDataStd_NameDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataStd_NameDriver; -DEFINE_STANDARD_HANDLE(BinMDataStd_NameDriver, BinMDF_ADriver) - -//! TDataStd_Name attribute Driver. -class BinMDataStd_NameDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataStd_NameDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - //! persistent -> transient (retrieve) - Standard_EXPORT Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - //! transient -> persistent (store) - Standard_EXPORT void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataStd_NameDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataStd_NameDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_NoteBookDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_NoteBookDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_NoteBookDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_NoteBookDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataStd_NoteBookDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataStd_NoteBookDriver -//purpose : -//======================================================================= -BinMDataStd_NoteBookDriver::BinMDataStd_NoteBookDriver - (const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataStd_NoteBook)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= - -Handle(TDF_Attribute) BinMDataStd_NoteBookDriver::NewEmpty() const -{ - return new TDataStd_NoteBook(); -} - -//======================================================================= -//function : Paste -//purpose : persistent -> transient (retrieve) -//======================================================================= - -Standard_Boolean BinMDataStd_NoteBookDriver::Paste - (const BinObjMgt_Persistent&, - const Handle(TDF_Attribute)&, - BinObjMgt_RRelocationTable& ) const -{return Standard_True;} - -//======================================================================= -//function : Paste -//purpose : transient -> persistent (store) -//======================================================================= - -void BinMDataStd_NoteBookDriver::Paste (const Handle(TDF_Attribute)&, - BinObjMgt_Persistent&, - BinObjMgt_SRelocationTable& ) const -{} - - diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_NoteBookDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_NoteBookDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_NoteBookDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_NoteBookDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataStd_NoteBookDriver_HeaderFile -#define _BinMDataStd_NoteBookDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataStd_NoteBookDriver; -DEFINE_STANDARD_HANDLE(BinMDataStd_NoteBookDriver, BinMDF_ADriver) - -//! NoteBook attribute Driver. -class BinMDataStd_NoteBookDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataStd_NoteBookDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataStd_NoteBookDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataStd_NoteBookDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_RelationDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_RelationDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_RelationDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_RelationDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,122 +0,0 @@ -// Created on: 2001-09-12 -// Created by: Julia DOROVSKIKH -// Copyright (c) 2001-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataStd_RelationDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataStd_RelationDriver -//purpose : Constructor -//======================================================================= -BinMDataStd_RelationDriver::BinMDataStd_RelationDriver - (const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver (theMsgDriver, NULL) -{} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMDataStd_RelationDriver::NewEmpty() const -{ - return (new TDataStd_Relation()); -} - -//======================================================================= -//function : Paste -//purpose : persistent -> transient (retrieve) -//======================================================================= -Standard_Boolean BinMDataStd_RelationDriver::Paste - (const BinObjMgt_Persistent& theSource, - const Handle(TDF_Attribute)& theTarget, - BinObjMgt_RRelocationTable& theRelocTable) const -{ - Handle(TDataStd_Relation) aC = - Handle(TDataStd_Relation)::DownCast(theTarget); - - // variables - Standard_Integer nbvar; - if (! (theSource >> nbvar) || nbvar < 0) - return Standard_False; - TDF_AttributeList& aList = aC->GetVariables(); - for (; nbvar > 0; nbvar--) - { - Handle(TDF_Attribute) aV; - Standard_Integer aNb; - if (! (theSource >> aNb)) - return Standard_False; - if (aNb > 0) - { - if (theRelocTable.IsBound(aNb)) - aV = Handle(TDataStd_Variable)::DownCast(theRelocTable.Find(aNb)); - else - { - aV = new TDataStd_Variable; - theRelocTable.Bind(aNb, aV); - } - } - aList.Append(aV); - } - - // expression - TCollection_ExtendedString aString; - if (! (theSource >> aString)) - return Standard_False; - aC->SetRelation(aString); - - return Standard_True; -} - -//======================================================================= -//function : Paste -//purpose : transient -> persistent (store) -//======================================================================= -void BinMDataStd_RelationDriver::Paste - (const Handle(TDF_Attribute)& theSource, - BinObjMgt_Persistent& theTarget, - BinObjMgt_SRelocationTable& theRelocTable) const -{ - Handle(TDataStd_Relation) aC = - Handle(TDataStd_Relation)::DownCast(theSource); - - // variables - const TDF_AttributeList& aList = aC->GetVariables(); - Standard_Integer nbvar = aList.Extent(); - theTarget << nbvar; - TDF_ListIteratorOfAttributeList it; - for (it.Initialize(aList); it.More(); it.Next()) - { - const Handle(TDF_Attribute)& TV = it.Value(); - Standard_Integer aNb; - if (!TV.IsNull()) - aNb = theRelocTable.Add(TV); - else - aNb = -1; - theTarget << aNb; - } - - // expression - TCollection_ExtendedString aName = aC->Name(); - theTarget << aName; -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_RelationDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_RelationDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_RelationDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_RelationDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2001-09-12 -// Created by: Julia DOROVSKIKH -// Copyright (c) 2001-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataStd_RelationDriver_HeaderFile -#define _BinMDataStd_RelationDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataStd_RelationDriver; -DEFINE_STANDARD_HANDLE(BinMDataStd_RelationDriver, BinMDF_ADriver) - -//! Attribute Driver. -class BinMDataStd_RelationDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataStd_RelationDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - Standard_EXPORT void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataStd_RelationDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataStd_RelationDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_TickDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_TickDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_TickDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_TickDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -// Created on: 2007-05-29 -// Created by: Vlad Romashko -// Copyright (c) 2007-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataStd_TickDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataStd_TickDriver -//purpose : -//======================================================================= -BinMDataStd_TickDriver::BinMDataStd_TickDriver(const Handle(Message_Messenger)& theMsgDriver) -: BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataStd_Tick)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMDataStd_TickDriver::NewEmpty() const -{ - return new TDataStd_Tick(); -} - -//======================================================================= -//function : Paste -//purpose : persistent -> transient (retrieve) -//======================================================================= -Standard_Boolean BinMDataStd_TickDriver::Paste(const BinObjMgt_Persistent&, - const Handle(TDF_Attribute)&, - BinObjMgt_RRelocationTable& ) const -{ - return Standard_True; -} - -//======================================================================= -//function : Paste -//purpose : transient -> persistent (store) -//======================================================================= -void BinMDataStd_TickDriver::Paste(const Handle(TDF_Attribute)&, - BinObjMgt_Persistent&, - BinObjMgt_SRelocationTable& ) const -{ -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_TickDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_TickDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataStd/BinMDataStd_TickDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/BinMDataStd_TickDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2007-05-29 -// Created by: Vlad Romashko -// Copyright (c) 2007-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataStd_TickDriver_HeaderFile -#define _BinMDataStd_TickDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataStd_TickDriver; -DEFINE_STANDARD_HANDLE(BinMDataStd_TickDriver, BinMDF_ADriver) - -//! Tick attribute driver. -class BinMDataStd_TickDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataStd_TickDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataStd_TickDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataStd_TickDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataStd/FILES opencascade-7.5.1+dfsg1/src/BinMDataStd/FILES --- opencascade-7.4.1+dfsg1/src/BinMDataStd/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataStd/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -8,10 +8,6 @@ BinMDataStd_BooleanListDriver.hxx BinMDataStd_ByteArrayDriver.cxx BinMDataStd_ByteArrayDriver.hxx -BinMDataStd_CommentDriver.cxx -BinMDataStd_CommentDriver.hxx -BinMDataStd_DirectoryDriver.cxx -BinMDataStd_DirectoryDriver.hxx BinMDataStd_ExpressionDriver.cxx BinMDataStd_ExpressionDriver.hxx BinMDataStd_ExtStringArrayDriver.cxx @@ -28,10 +24,8 @@ BinMDataStd_IntPackedMapDriver.hxx BinMDataStd_NamedDataDriver.cxx BinMDataStd_NamedDataDriver.hxx -BinMDataStd_NameDriver.cxx -BinMDataStd_NameDriver.hxx -BinMDataStd_NoteBookDriver.cxx -BinMDataStd_NoteBookDriver.hxx +BinMDataStd_GenericExtStringDriver.cxx +BinMDataStd_GenericExtStringDriver.hxx BinMDataStd_RealArrayDriver.cxx BinMDataStd_RealArrayDriver.hxx BinMDataStd_RealDriver.cxx @@ -42,10 +36,8 @@ BinMDataStd_ReferenceArrayDriver.hxx BinMDataStd_ReferenceListDriver.cxx BinMDataStd_ReferenceListDriver.hxx -BinMDataStd_RelationDriver.cxx -BinMDataStd_RelationDriver.hxx -BinMDataStd_TickDriver.cxx -BinMDataStd_TickDriver.hxx +BinMDataStd_GenericEmptyDriver.cxx +BinMDataStd_GenericEmptyDriver.hxx BinMDataStd_TreeNodeDriver.cxx BinMDataStd_TreeNodeDriver.hxx BinMDataStd_UAttributeDriver.cxx diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_AxisDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_AxisDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_AxisDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_AxisDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataXtd_AxisDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataXtd_AxisDriver -//purpose : -//======================================================================= -BinMDataXtd_AxisDriver::BinMDataXtd_AxisDriver - (const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataXtd_Axis)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= - -Handle(TDF_Attribute) BinMDataXtd_AxisDriver::NewEmpty() const -{ - return new TDataXtd_Axis(); -} - -//======================================================================= -//function : Paste -//purpose : persistent -> transient (retrieve) -//======================================================================= - -Standard_Boolean BinMDataXtd_AxisDriver::Paste - (const BinObjMgt_Persistent&, - const Handle(TDF_Attribute)&, - BinObjMgt_RRelocationTable& ) const -{return Standard_True;} - -//======================================================================= -//function : Paste -//purpose : transient -> persistent (store) -//======================================================================= - -void BinMDataXtd_AxisDriver::Paste (const Handle(TDF_Attribute)&, - BinObjMgt_Persistent&, - BinObjMgt_SRelocationTable& ) const -{} - diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_AxisDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_AxisDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_AxisDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_AxisDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataXtd_AxisDriver_HeaderFile -#define _BinMDataXtd_AxisDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataXtd_AxisDriver; -DEFINE_STANDARD_HANDLE(BinMDataXtd_AxisDriver, BinMDF_ADriver) - -//! Axis attribute Driver. -class BinMDataXtd_AxisDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataXtd_AxisDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataXtd_AxisDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataXtd_AxisDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd.cxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,14 +16,9 @@ // modified 13.04.2009 Sergey Zaritchny #include -#include #include #include #include -#include -#include -#include -#include #include #include #include @@ -42,11 +37,6 @@ theDriverTable->AddDriver (new BinMDataXtd_ConstraintDriver (theMsgDriver) ); theDriverTable->AddDriver (new BinMDataXtd_GeometryDriver (theMsgDriver) ); theDriverTable->AddDriver (new BinMDataXtd_PatternStdDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataXtd_ShapeDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataXtd_PointDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataXtd_AxisDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataXtd_PlaneDriver (theMsgDriver) ); - theDriverTable->AddDriver (new BinMDataXtd_PlacementDriver (theMsgDriver) ); theDriverTable->AddDriver (new BinMDataXtd_TriangulationDriver(theMsgDriver) ); theDriverTable->AddDriver (new BinMDataXtd_PresentationDriver (theMsgDriver) ); diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd.hxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,14 +23,9 @@ #include class BinMDF_ADriverTable; class Message_Messenger; -class BinMDataXtd_PointDriver; -class BinMDataXtd_AxisDriver; -class BinMDataXtd_PlaneDriver; class BinMDataXtd_GeometryDriver; class BinMDataXtd_ConstraintDriver; -class BinMDataXtd_PlacementDriver; class BinMDataXtd_PatternStdDriver; -class BinMDataXtd_ShapeDriver; class BinMDataXtd_TriangulationDriver; //! Storage and Retrieval drivers for modelling attributes. @@ -62,14 +57,9 @@ -friend class BinMDataXtd_PointDriver; -friend class BinMDataXtd_AxisDriver; -friend class BinMDataXtd_PlaneDriver; friend class BinMDataXtd_GeometryDriver; friend class BinMDataXtd_ConstraintDriver; -friend class BinMDataXtd_PlacementDriver; friend class BinMDataXtd_PatternStdDriver; -friend class BinMDataXtd_ShapeDriver; friend class BinMDataXtd_TriangulationDriver; }; diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlacementDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlacementDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlacementDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlacementDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataXtd_PlacementDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataXtd_PlacementDriver -//purpose : -//======================================================================= -BinMDataXtd_PlacementDriver::BinMDataXtd_PlacementDriver - (const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataXtd_Placement)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= - -Handle(TDF_Attribute) BinMDataXtd_PlacementDriver::NewEmpty() const -{ - return new TDataXtd_Placement(); -} - -//======================================================================= -//function : Paste -//purpose : persistent -> transient (retrieve) -//======================================================================= - -Standard_Boolean BinMDataXtd_PlacementDriver::Paste - (const BinObjMgt_Persistent&, - const Handle(TDF_Attribute)&, - BinObjMgt_RRelocationTable& ) const -{return Standard_True;} - -//======================================================================= -//function : Paste -//purpose : transient -> persistent (store) -//======================================================================= - -void BinMDataXtd_PlacementDriver::Paste (const Handle(TDF_Attribute)&, - BinObjMgt_Persistent&, - BinObjMgt_SRelocationTable& ) const -{} - - diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlacementDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlacementDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlacementDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlacementDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataXtd_PlacementDriver_HeaderFile -#define _BinMDataXtd_PlacementDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataXtd_PlacementDriver; -DEFINE_STANDARD_HANDLE(BinMDataXtd_PlacementDriver, BinMDF_ADriver) - -//! Placement attribute Driver. -class BinMDataXtd_PlacementDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataXtd_PlacementDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataXtd_PlacementDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataXtd_PlacementDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlaneDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlaneDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlaneDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlaneDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataXtd_PlaneDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataXtd_PlaneDriver -//purpose : -//======================================================================= -BinMDataXtd_PlaneDriver::BinMDataXtd_PlaneDriver - (const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataXtd_Plane)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= - -Handle(TDF_Attribute) BinMDataXtd_PlaneDriver::NewEmpty() const -{ - return new TDataXtd_Plane(); -} - -//======================================================================= -//function : Paste -//purpose : persistent -> transient (retrieve) -//======================================================================= - -Standard_Boolean BinMDataXtd_PlaneDriver::Paste - (const BinObjMgt_Persistent&, - const Handle(TDF_Attribute)&, - BinObjMgt_RRelocationTable& ) const -{return Standard_True;} - -//======================================================================= -//function : Paste -//purpose : transient -> persistent (store) -//======================================================================= - -void BinMDataXtd_PlaneDriver::Paste (const Handle(TDF_Attribute)&, - BinObjMgt_Persistent&, - BinObjMgt_SRelocationTable& ) const -{} - diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlaneDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlaneDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlaneDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PlaneDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataXtd_PlaneDriver_HeaderFile -#define _BinMDataXtd_PlaneDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataXtd_PlaneDriver; -DEFINE_STANDARD_HANDLE(BinMDataXtd_PlaneDriver, BinMDF_ADriver) - -//! Plane attribute Driver. -class BinMDataXtd_PlaneDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataXtd_PlaneDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataXtd_PlaneDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataXtd_PlaneDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PointDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PointDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PointDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PointDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataXtd_PointDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataXtd_PointDriver -//purpose : -//======================================================================= -BinMDataXtd_PointDriver::BinMDataXtd_PointDriver - (const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataXtd_Point)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= - -Handle(TDF_Attribute) BinMDataXtd_PointDriver::NewEmpty() const -{ - return new TDataXtd_Point(); -} - -//======================================================================= -//function : Paste -//purpose : persistent -> transient (retrieve) -//======================================================================= - -Standard_Boolean BinMDataXtd_PointDriver::Paste - (const BinObjMgt_Persistent&, - const Handle(TDF_Attribute)&, - BinObjMgt_RRelocationTable& ) const -{return Standard_True;} - -//======================================================================= -//function : Paste -//purpose : transient -> persistent (store) -//======================================================================= - -void BinMDataXtd_PointDriver::Paste (const Handle(TDF_Attribute)&, - BinObjMgt_Persistent&, - BinObjMgt_SRelocationTable& ) const -{} - - diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PointDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PointDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PointDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PointDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataXtd_PointDriver_HeaderFile -#define _BinMDataXtd_PointDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataXtd_PointDriver; -DEFINE_STANDARD_HANDLE(BinMDataXtd_PointDriver, BinMDF_ADriver) - -//! Point attribute Driver. -class BinMDataXtd_PointDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataXtd_PointDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataXtd_PointDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataXtd_PointDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PresentationDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PresentationDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PresentationDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_PresentationDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(BinMDataXtd_PresentationDriver,BinMDF_ADriver) @@ -70,9 +71,17 @@ ok = theSource >> aValue; if (!ok) return ok; if ( aValue != -1 ) - anAttribute->SetColor((Quantity_NameOfColor)aValue); + { + Quantity_NameOfColor aNameOfColor = TDataXtd_Presentation::getColorNameFromOldEnum (aValue); + if (aNameOfColor <= Quantity_NOC_WHITE) + { + anAttribute->SetColor (aNameOfColor); + } + } else + { anAttribute->UnsetColor(); + } // Material ok = theSource >> aValue; @@ -107,7 +116,7 @@ else anAttribute->UnsetMode(); - return ok; + return true; } //======================================================================= @@ -129,9 +138,14 @@ // Color if (anAttribute->HasOwnColor()) - theTarget.PutInteger(anAttribute->Color()); + { + const Standard_Integer anOldEnum = TDataXtd_Presentation::getOldColorNameFromNewEnum (anAttribute->Color()); + theTarget.PutInteger (anOldEnum); + } else + { theTarget.PutInteger(-1); + } // Material if (anAttribute->HasOwnMaterial()) diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_ShapeDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_ShapeDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_ShapeDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_ShapeDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMDataXtd_ShapeDriver,BinMDF_ADriver) - -//======================================================================= -//function : BinMDataXtd_ShapeDriver -//purpose : -//======================================================================= -BinMDataXtd_ShapeDriver::BinMDataXtd_ShapeDriver - (const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataXtd_Shape)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= - -Handle(TDF_Attribute) BinMDataXtd_ShapeDriver::NewEmpty() const -{ - return new TDataXtd_Shape(); -} - -//======================================================================= -//function : Paste -//purpose : persistent -> transient (retrieve) -//======================================================================= - -Standard_Boolean BinMDataXtd_ShapeDriver::Paste - (const BinObjMgt_Persistent&, - const Handle(TDF_Attribute)&, - BinObjMgt_RRelocationTable& ) const -{return Standard_True;} - -//======================================================================= -//function : Paste -//purpose : transient -> persistent (store) -//======================================================================= - -void BinMDataXtd_ShapeDriver::Paste (const Handle(TDF_Attribute)&, - BinObjMgt_Persistent&, - BinObjMgt_SRelocationTable& ) const -{} diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_ShapeDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_ShapeDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/BinMDataXtd_ShapeDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/BinMDataXtd_ShapeDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2004-05-13 -// Created by: Sergey ZARITCHNY -// Copyright (c) 2004-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMDataXtd_ShapeDriver_HeaderFile -#define _BinMDataXtd_ShapeDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMDataXtd_ShapeDriver; -DEFINE_STANDARD_HANDLE(BinMDataXtd_ShapeDriver, BinMDF_ADriver) - -//! Shape attribute Driver. -class BinMDataXtd_ShapeDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMDataXtd_ShapeDriver(const Handle(Message_Messenger)& theMessageDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& Source, const Handle(TDF_Attribute)& Target, BinObjMgt_RRelocationTable& RelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMDataXtd_ShapeDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMDataXtd_ShapeDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMDataXtd/FILES opencascade-7.5.1+dfsg1/src/BinMDataXtd/FILES --- opencascade-7.4.1+dfsg1/src/BinMDataXtd/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDataXtd/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,21 +1,11 @@ BinMDataXtd.cxx BinMDataXtd.hxx -BinMDataXtd_AxisDriver.cxx -BinMDataXtd_AxisDriver.hxx BinMDataXtd_ConstraintDriver.cxx BinMDataXtd_ConstraintDriver.hxx BinMDataXtd_GeometryDriver.cxx BinMDataXtd_GeometryDriver.hxx BinMDataXtd_PatternStdDriver.cxx BinMDataXtd_PatternStdDriver.hxx -BinMDataXtd_PlacementDriver.cxx -BinMDataXtd_PlacementDriver.hxx -BinMDataXtd_PlaneDriver.cxx -BinMDataXtd_PlaneDriver.hxx -BinMDataXtd_PointDriver.cxx -BinMDataXtd_PointDriver.hxx -BinMDataXtd_ShapeDriver.cxx -BinMDataXtd_ShapeDriver.hxx BinMDataXtd_PresentationDriver.hxx BinMDataXtd_PresentationDriver.cxx BinMDataXtd_PositionDriver.hxx diff -Nru opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriver.cxx opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,12 +15,6 @@ #include -#include -#include -#include -#include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(BinMDF_ADriver,Standard_Transient) @@ -34,4 +28,15 @@ { if (theName) myTypeName = theName; -} \ No newline at end of file +} + +//======================================================================= +//function : SourceType +//purpose : +//======================================================================= + +const Handle(Standard_Type)& BinMDF_ADriver::SourceType () const +{ + return NewEmpty() -> DynamicType(); +} + diff -Nru opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriver.hxx opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,7 +48,7 @@ //! Returns the type of source object, //! inheriting from Attribute from TDF. - const Handle(Standard_Type)& SourceType() const; + Standard_EXPORT virtual const Handle(Standard_Type)& SourceType() const; //! Returns the type name of the attribute object const TCollection_AsciiString& TypeName() const; @@ -63,6 +63,8 @@ //! to keep the sharings. Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& aSource, BinObjMgt_Persistent& aTarget, BinObjMgt_SRelocationTable& aRelocTable) const = 0; + //! Returns the current message driver of this driver + const Handle(Message_Messenger)& MessageDriver() const { return myMessageDriver; } DEFINE_STANDARD_RTTIEXT(BinMDF_ADriver,Standard_Transient) diff -Nru opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriver.lxx opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriver.lxx --- opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriver.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriver.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,16 +16,6 @@ #include //======================================================================= -//function : SourceType -//purpose : -//======================================================================= - -inline const Handle(Standard_Type)& BinMDF_ADriver::SourceType () const -{ - return NewEmpty() -> DynamicType(); -} - -//======================================================================= //function : TypeName //purpose : //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.cxx opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.cxx --- opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,10 +17,12 @@ #include #include #include +#include #include #include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(BinMDF_ADriverTable,Standard_Transient) @@ -45,6 +47,42 @@ } //======================================================================= +//function : AddDerivedDriver +//purpose : +//======================================================================= +void BinMDF_ADriverTable::AddDerivedDriver (const Handle(TDF_Attribute)& theInstance) +{ + const Handle(Standard_Type)& anInstanceType = theInstance->DynamicType(); + if (!myMap.IsBound (anInstanceType)) // no direct driver, use a derived one + { + for (Handle(Standard_Type) aType = anInstanceType->Parent(); !aType.IsNull(); aType = aType->Parent()) + { + if (myMap.IsBound (aType)) + { + Handle(BinMDF_DerivedDriver) aDriver = new BinMDF_DerivedDriver (theInstance, myMap (aType)); + myMap.Bind (anInstanceType, aDriver); + return; + } + } + } +} + +//======================================================================= +//function : AddDerivedDriver +//purpose : +//======================================================================= +const Handle(Standard_Type)& BinMDF_ADriverTable::AddDerivedDriver (Standard_CString theDerivedType) +{ + if (Handle(TDF_Attribute) anInstance = TDF_DerivedAttribute::Attribute (theDerivedType)) + { + AddDerivedDriver (anInstance); + return anInstance->DynamicType(); + } + static const Handle(Standard_Type) aNullType; + return aNullType; +} + +//======================================================================= //function : AssignIds //purpose : Assigns the IDs to the drivers of the given Types. // It uses indices in the map as IDs. @@ -97,4 +135,16 @@ myMapId.Bind (aType, i); } } + + // try to add derived drivers for attributes not found in myMap + for (BinMDF_StringIdMap::Iterator aStrId (aStringIdMap); aStrId.More(); aStrId.Next()) + { + if (!myMapId.IsBound2 (aStrId.Value())) + { + if (Handle(Standard_Type) anAdded = AddDerivedDriver (aStrId.Key().ToCString())) + { + myMapId.Bind (anAdded, aStrId.Value()); + } + } + } } diff -Nru opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.hxx opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.hxx --- opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,7 +48,15 @@ //! Adds a translation driver . Standard_EXPORT void AddDriver (const Handle(BinMDF_ADriver)& theDriver); - + + //! Adds a translation driver for the derived attribute. The base driver must be already added. + //! @param theInstance is newly created attribute, detached from any label + Standard_EXPORT void AddDerivedDriver (const Handle(TDF_Attribute)& theInstance); + + //! Adds a translation driver for the derived attribute. The base driver must be already added. + //! @param theDerivedType is registered attribute type using IMPLEMENT_DERIVED_ATTRIBUTE macro + Standard_EXPORT const Handle(Standard_Type)& AddDerivedDriver (Standard_CString theDerivedType); + //! Assigns the IDs to the drivers of the given Types. //! It uses indices in the map as IDs. //! Useful in storage procedure. @@ -61,11 +69,11 @@ //! Gets a driver according to . //! Returns Type ID if the driver was assigned an ID; 0 otherwise. - Standard_Integer GetDriver (const Handle(Standard_Type)& theType, Handle(BinMDF_ADriver)& theDriver) const; + Standard_Integer GetDriver (const Handle(Standard_Type)& theType, Handle(BinMDF_ADriver)& theDriver); //! Returns a driver according to . //! Returns null handle if a driver is not found - Handle(BinMDF_ADriver) GetDriver (const Standard_Integer theTypeId) const; + Handle(BinMDF_ADriver) GetDriver (const Standard_Integer theTypeId); diff -Nru opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.lxx opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.lxx --- opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_ADriverTable.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,13 @@ inline Standard_Integer BinMDF_ADriverTable::GetDriver (const Handle(Standard_Type)& theType, - Handle(BinMDF_ADriver)& theDriver) const + Handle(BinMDF_ADriver)& theDriver) { + if (!myMap.IsBound (theType)) // try to assign driver for derived type + { + AddDerivedDriver (theType->Name()); + } + Standard_Integer anId = 0; if (myMap.IsBound(theType)) { theDriver = myMap (theType); @@ -51,7 +56,7 @@ //======================================================================= inline Handle(BinMDF_ADriver) BinMDF_ADriverTable::GetDriver - (const Standard_Integer theTypeId) const + (const Standard_Integer theTypeId) { Handle(BinMDF_ADriver) aDriver; if (myMapId.IsBound2(theTypeId)) { diff -Nru opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_DerivedDriver.cxx opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_DerivedDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_DerivedDriver.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_DerivedDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,16 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(BinMDF_DerivedDriver, BinMDF_ADriver) diff -Nru opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_DerivedDriver.hxx opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_DerivedDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMDF/BinMDF_DerivedDriver.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDF/BinMDF_DerivedDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,59 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _BinMDF_DerivedDriver_HeaderFile +#define _BinMDF_DerivedDriver_HeaderFile + +#include + +//! A universal driver for the attribute that inherits another attribute with +//! ready to used persistence mechanism implemented (already has a driver to store/retrieve). +class BinMDF_DerivedDriver : public BinMDF_ADriver +{ + DEFINE_STANDARD_RTTIEXT(BinMDF_DerivedDriver, BinMDF_ADriver) +public: + + //! Creates a derivative persistence driver for theDerivative attribute by reusage of theBaseDriver + //! @param theDerivative an instance of the attribute, just created, detached from any label + //! @param theBaseDriver a driver of the base attribute, called by Paste methods + BinMDF_DerivedDriver (const Handle(TDF_Attribute)& theDerivative, + const Handle(BinMDF_ADriver)& theBaseDriver) + : BinMDF_ADriver(theBaseDriver->MessageDriver()), myDerivative(theDerivative), myBaseDirver(theBaseDriver) {} + + //! Creates a new instance of the derivative attribute + virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE { return myDerivative->NewEmpty(); } + + //! Reuses the base driver to read the base fields + virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, + const Handle(TDF_Attribute)& theTarget, + BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE + { + Standard_Boolean aResult = myBaseDirver->Paste (theSource, theTarget, theRelocTable); + theTarget->AfterRetrieval(); // to allow synchronization of the derived attribute with the base content + return aResult; + } + + //! Reuses the base driver to store the base fields + virtual void Paste (const Handle(TDF_Attribute)& theSource, + BinObjMgt_Persistent& theTarget, + BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE + { + myBaseDirver->Paste(theSource, theTarget, theRelocTable); + } + +protected: + Handle(TDF_Attribute) myDerivative; //!< the derivative attribute that inherits the base + Handle(BinMDF_ADriver) myBaseDirver; //!< the base attribute driver to be reused here +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/BinMDF/FILES opencascade-7.5.1+dfsg1/src/BinMDF/FILES --- opencascade-7.4.1+dfsg1/src/BinMDF/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMDF/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -15,3 +15,5 @@ BinMDF_TagSourceDriver.hxx BinMDF_TypeADriverMap.hxx BinMDF_TypeIdMap.hxx +BinMDF_DerivedDriver.cxx +BinMDF_DerivedDriver.hxx diff -Nru opencascade-7.4.1+dfsg1/src/BinMNaming/BinMNaming_NamedShapeDriver.cxx opencascade-7.5.1+dfsg1/src/BinMNaming/BinMNaming_NamedShapeDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMNaming/BinMNaming_NamedShapeDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMNaming/BinMNaming_NamedShapeDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -276,11 +276,12 @@ //purpose : //======================================================================= -void BinMNaming_NamedShapeDriver::WriteShapeSection (Standard_OStream& theOS) +void BinMNaming_NamedShapeDriver::WriteShapeSection (Standard_OStream& theOS, + const Message_ProgressRange& theRange) { theOS << SHAPESET; myShapeSet.SetFormatNb(myFormatNb); - myShapeSet.Write (theOS); + myShapeSet.Write (theOS, theRange); myShapeSet.Clear(); } @@ -299,7 +300,8 @@ //purpose : //======================================================================= -void BinMNaming_NamedShapeDriver::ReadShapeSection (Standard_IStream& theIS) +void BinMNaming_NamedShapeDriver::ReadShapeSection (Standard_IStream& theIS, + const Message_ProgressRange& theRange) { // check section title string; note that some versions of OCCT (up to 6.3.1) // might avoid writing shape section if it is empty @@ -308,7 +310,7 @@ theIS >> aSectionTitle; if(aSectionTitle.Length() > 0 && aSectionTitle == SHAPESET) { myShapeSet.Clear(); - myShapeSet.Read (theIS); + myShapeSet.Read (theIS, theRange); SetFormatNb(myShapeSet.FormatNb()); } else diff -Nru opencascade-7.4.1+dfsg1/src/BinMNaming/BinMNaming_NamedShapeDriver.hxx opencascade-7.5.1+dfsg1/src/BinMNaming/BinMNaming_NamedShapeDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMNaming/BinMNaming_NamedShapeDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMNaming/BinMNaming_NamedShapeDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -52,10 +52,12 @@ Standard_EXPORT void Paste (const Handle(TDF_Attribute)& Source, BinObjMgt_Persistent& Target, BinObjMgt_SRelocationTable& RelocTable) const Standard_OVERRIDE; //! Input the shapes from Bin Document file - Standard_EXPORT void ReadShapeSection (Standard_IStream& theIS); + Standard_EXPORT void ReadShapeSection (Standard_IStream& theIS, + const Message_ProgressRange& therange = Message_ProgressRange()); //! Output the shapes into Bin Document file - Standard_EXPORT void WriteShapeSection (Standard_OStream& theOS); + Standard_EXPORT void WriteShapeSection (Standard_OStream& theOS, + const Message_ProgressRange& therange = Message_ProgressRange()); //! Clear myShapeSet Standard_EXPORT void Clear(); diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_AreaDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_AreaDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_AreaDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_AreaDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_AreaDriver,BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_AreaDriver::BinMXCAFDoc_AreaDriver(const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_Area)->Name()) { -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_AreaDriver::NewEmpty() const { - return new XCAFDoc_Area(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_AreaDriver::Paste(const BinObjMgt_Persistent& theSource, - const Handle(TDF_Attribute)& theTarget, - BinObjMgt_RRelocationTable& ) const -{ - Handle(XCAFDoc_Area) anAtt = Handle(XCAFDoc_Area)::DownCast(theTarget); - Standard_Real aValue; - Standard_Boolean isOk = theSource >> aValue; - if(isOk) - anAtt->Set(aValue); - return isOk; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_AreaDriver::Paste(const Handle(TDF_Attribute)& theSource, - BinObjMgt_Persistent& theTarget, - BinObjMgt_SRelocationTable& ) const -{ - Handle(XCAFDoc_Area) anAtt = Handle(XCAFDoc_Area)::DownCast(theSource); - theTarget << anAtt->Get(); -} - diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_AreaDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_AreaDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_AreaDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_AreaDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_AreaDriver_HeaderFile -#define _BinMXCAFDoc_AreaDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMXCAFDoc_AreaDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_AreaDriver, BinMDF_ADriver) - - -class BinMXCAFDoc_AreaDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_AreaDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_AreaDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMXCAFDoc_AreaDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ClippingPlaneToolDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ClippingPlaneToolDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ClippingPlaneToolDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ClippingPlaneToolDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -// Created on: 2016-11-30 -// Created by: Irina KRYLOVA -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_ClippingPlaneToolDriver, BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_ClippingPlaneToolDriver::BinMXCAFDoc_ClippingPlaneToolDriver - (const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_ClippingPlaneTool)->Name()) -{ -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_ClippingPlaneToolDriver::NewEmpty() const -{ - return new XCAFDoc_ClippingPlaneTool(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_ClippingPlaneToolDriver::Paste - (const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - return Standard_True; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_ClippingPlaneToolDriver::Paste - (const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const { -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ClippingPlaneToolDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ClippingPlaneToolDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ClippingPlaneToolDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ClippingPlaneToolDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -// Created on: 2016-11-30 -// Created by: Irina KRYLOVA -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_ClippingPlaneToolDriver_HeaderFile -#define _BinMXCAFDoc_ClippingPlaneToolDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMXCAFDoc_ClippingPlaneToolDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_ClippingPlaneToolDriver, BinMDF_ADriver) - - -class BinMXCAFDoc_ClippingPlaneToolDriver : public BinMDF_ADriver -{ -public: - - Standard_EXPORT BinMXCAFDoc_ClippingPlaneToolDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste(const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste(const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_ClippingPlaneToolDriver, BinMDF_ADriver) - -}; -#endif // _BinMXCAFDoc_ClippingPlaneToolDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ColorToolDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ColorToolDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ColorToolDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ColorToolDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_ColorToolDriver,BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_ColorToolDriver::BinMXCAFDoc_ColorToolDriver(const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_ColorTool)->Name()) { -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_ColorToolDriver::NewEmpty() const { - return new XCAFDoc_ColorTool(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_ColorToolDriver::Paste(const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - return Standard_True; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_ColorToolDriver::Paste(const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const { -} - diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ColorToolDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ColorToolDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ColorToolDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ColorToolDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_ColorToolDriver_HeaderFile -#define _BinMXCAFDoc_ColorToolDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMXCAFDoc_ColorToolDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_ColorToolDriver, BinMDF_ADriver) - - -class BinMXCAFDoc_ColorToolDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_ColorToolDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_ColorToolDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMXCAFDoc_ColorToolDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,30 +18,18 @@ #include #include #include -#include #include #include -#include #include -#include -#include #include -#include -#include #include -#include #include #include -#include #include -#include #include #include -#include -#include -#include -#include -#include +#include +#include #include #include @@ -52,7 +40,6 @@ void BinMXCAFDoc::AddDrivers(const Handle(BinMDF_ADriverTable)& theDriverTable, const Handle(Message_Messenger)& theMsgDrv) { - theDriverTable->AddDriver( new BinMXCAFDoc_AreaDriver (theMsgDrv)); theDriverTable->AddDriver( new BinMXCAFDoc_CentroidDriver (theMsgDrv)); theDriverTable->AddDriver( new BinMXCAFDoc_ColorDriver (theMsgDrv)); theDriverTable->AddDriver( new BinMXCAFDoc_GraphNodeDriver(theMsgDrv)); @@ -71,23 +58,11 @@ theDriverTable->AddDriver( aLocationDriver); theDriverTable->AddDriver( new BinMXCAFDoc_AssemblyItemRefDriver(theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_VolumeDriver (theMsgDrv)); theDriverTable->AddDriver( new BinMXCAFDoc_DatumDriver (theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_GeomToleranceDriver (theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_DimensionDriver (theMsgDrv)); theDriverTable->AddDriver( new BinMXCAFDoc_DimTolDriver (theMsgDrv)); theDriverTable->AddDriver( new BinMXCAFDoc_MaterialDriver (theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_NoteBalloonDriver (theMsgDrv)); + theDriverTable->AddDriver( new BinMXCAFDoc_VisMaterialDriver (theMsgDrv)); theDriverTable->AddDriver( new BinMXCAFDoc_NoteBinDataDriver (theMsgDrv)); theDriverTable->AddDriver( new BinMXCAFDoc_NoteCommentDriver (theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_ViewDriver (theMsgDrv)); - - theDriverTable->AddDriver( new BinMXCAFDoc_ColorToolDriver (theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_DocumentToolDriver(theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_LayerToolDriver (theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_ShapeToolDriver (theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_DimTolToolDriver (theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_MaterialToolDriver(theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_NotesToolDriver (theMsgDrv)); - theDriverTable->AddDriver( new BinMXCAFDoc_ViewToolDriver (theMsgDrv)); + theDriverTable->AddDriver( new BinMXCAFDoc_VisMaterialToolDriver(theMsgDrv)); } diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimensionDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimensionDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimensionDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimensionDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -// Created on: -// Created by: -// Copyright (c) 2015 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_DimensionDriver,BinMDF_ADriver) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -BinMXCAFDoc_DimensionDriver::BinMXCAFDoc_DimensionDriver (const Handle(Message_Messenger)& theMsgDriver) -: BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_Dimension)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_DimensionDriver::NewEmpty() const -{ - return new XCAFDoc_Dimension(); -} - -//======================================================================= -//function : Paste -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_DimensionDriver::Paste (const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - //Handle(XCAFDoc_Dimension) anAtt = Handle(XCAFDoc_Dimension)::DownCast(theTarget); - return Standard_True; -} - -//======================================================================= -//function : Paste -//purpose : -//======================================================================= -void BinMXCAFDoc_DimensionDriver::Paste (const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const -{ - //Handle(XCAFDoc_Dimension) anAtt = Handle(XCAFDoc_Dimension)::DownCast(theSource); -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimensionDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimensionDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimensionDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimensionDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -// Created on: -// Created by: -// Copyright (c) 20015 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_DimensionDriver_HeaderFile -#define _BinMXCAFDoc_DimensionDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include - -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - -class BinMXCAFDoc_DimensionDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_DimensionDriver, BinMDF_ADriver) - -class BinMXCAFDoc_DimensionDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_DimensionDriver (const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, - const Handle(TDF_Attribute)& theTarget, - BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, - BinObjMgt_Persistent& theTarget, - BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_DimensionDriver,BinMDF_ADriver) - -}; - -#endif // _BinMXCAFDoc_DimensionDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimTolToolDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimTolToolDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimTolToolDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimTolToolDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -// Created on: 2008-12-10 -// Created by: Pavel TELKOV -// Copyright (c) 2008-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_DimTolToolDriver,BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_DimTolToolDriver::BinMXCAFDoc_DimTolToolDriver - (const Handle(Message_Messenger)& theMsgDriver) -: BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_DimTolTool)->Name()) -{ -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_DimTolToolDriver::NewEmpty() const -{ - return new XCAFDoc_DimTolTool(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_DimTolToolDriver::Paste - (const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - return Standard_True; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_DimTolToolDriver::Paste - (const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const { -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimTolToolDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimTolToolDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimTolToolDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DimTolToolDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2008-12-10 -// Created by: Pavel TELKOV -// Copyright (c) 2008-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_DimTolToolDriver_HeaderFile -#define _BinMXCAFDoc_DimTolToolDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMXCAFDoc_DimTolToolDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_DimTolToolDriver, BinMDF_ADriver) - - -class BinMXCAFDoc_DimTolToolDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_DimTolToolDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_DimTolToolDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMXCAFDoc_DimTolToolDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DocumentToolDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DocumentToolDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DocumentToolDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DocumentToolDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_DocumentToolDriver,BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_DocumentToolDriver::BinMXCAFDoc_DocumentToolDriver(const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_DocumentTool)->Name()) { -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_DocumentToolDriver::NewEmpty() const { - return new XCAFDoc_DocumentTool(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_DocumentToolDriver::Paste(const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& theTarget, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - Handle(XCAFDoc_DocumentTool) T = Handle(XCAFDoc_DocumentTool)::DownCast(theTarget); - T->Init(); - return Standard_True; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_DocumentToolDriver::Paste(const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const -{ -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DocumentToolDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DocumentToolDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DocumentToolDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_DocumentToolDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_DocumentToolDriver_HeaderFile -#define _BinMXCAFDoc_DocumentToolDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMXCAFDoc_DocumentToolDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_DocumentToolDriver, BinMDF_ADriver) - - -class BinMXCAFDoc_DocumentToolDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_DocumentToolDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_DocumentToolDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMXCAFDoc_DocumentToolDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_GeomToleranceDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_GeomToleranceDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_GeomToleranceDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_GeomToleranceDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -// Created on: -// Created by: -// Copyright (c) 2015 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_GeomToleranceDriver,BinMDF_ADriver) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -BinMXCAFDoc_GeomToleranceDriver::BinMXCAFDoc_GeomToleranceDriver (const Handle(Message_Messenger)& theMsgDriver) -: BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_GeomTolerance)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_GeomToleranceDriver::NewEmpty() const -{ - return new XCAFDoc_GeomTolerance(); -} - -//======================================================================= -//function : Paste -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_GeomToleranceDriver::Paste (const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - //Handle(XCAFDoc_GeomTolerance) anAtt = Handle(XCAFDoc_GeomTolerance)::DownCast(theTarget); - return Standard_True; -} - -//======================================================================= -//function : Paste -//purpose : -//======================================================================= -void BinMXCAFDoc_GeomToleranceDriver::Paste (const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const -{ - //Handle(XCAFDoc_GeomTolerance) anAtt = Handle(XCAFDoc_GeomTolerance)::DownCast(theSource); -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_GeomToleranceDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_GeomToleranceDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_GeomToleranceDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_GeomToleranceDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -// Created on: -// Created by: -// Copyright (c) 20015 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_GeomToleranceDriver_HeaderFile -#define _BinMXCAFDoc_GeomToleranceDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include - -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - -class BinMXCAFDoc_GeomToleranceDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_GeomToleranceDriver, BinMDF_ADriver) - -class BinMXCAFDoc_GeomToleranceDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_GeomToleranceDriver (const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, - const Handle(TDF_Attribute)& theTarget, - BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, - BinObjMgt_Persistent& theTarget, - BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_GeomToleranceDriver,BinMDF_ADriver) - -}; - -#endif // _BinMXCAFDoc_GeomToleranceDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,26 +22,13 @@ class BinMDF_ADriverTable; class Message_Messenger; -class BinMXCAFDoc_AreaDriver; class BinMXCAFDoc_CentroidDriver; -class BinMXCAFDoc_ClippingPlaneToolDriver; class BinMXCAFDoc_ColorDriver; class BinMXCAFDoc_GraphNodeDriver; class BinMXCAFDoc_LocationDriver; -class BinMXCAFDoc_VolumeDriver; class BinMXCAFDoc_DatumDriver; -class BinMXCAFDoc_GeomToleranceDriver; -class BinMXCAFDoc_DimensionDriver; class BinMXCAFDoc_DimTolDriver; class BinMXCAFDoc_MaterialDriver; -class BinMXCAFDoc_ColorToolDriver; -class BinMXCAFDoc_DocumentToolDriver; -class BinMXCAFDoc_LayerToolDriver; -class BinMXCAFDoc_ShapeToolDriver; -class BinMXCAFDoc_DimTolToolDriver; -class BinMXCAFDoc_MaterialToolDriver; -class BinMXCAFDoc_ViewDriver; -class BinMXCAFDoc_ViewToolDriver; @@ -69,26 +56,13 @@ -friend class BinMXCAFDoc_AreaDriver; friend class BinMXCAFDoc_CentroidDriver; -friend class BinMXCAFDoc_ClippingPlaneToolDriver; friend class BinMXCAFDoc_ColorDriver; friend class BinMXCAFDoc_GraphNodeDriver; friend class BinMXCAFDoc_LocationDriver; -friend class BinMXCAFDoc_VolumeDriver; friend class BinMXCAFDoc_DatumDriver; -friend class BinMXCAFDoc_GeomToleranceDriver; -friend class BinMXCAFDoc_DimensionDriver; friend class BinMXCAFDoc_DimTolDriver; friend class BinMXCAFDoc_MaterialDriver; -friend class BinMXCAFDoc_ColorToolDriver; -friend class BinMXCAFDoc_DocumentToolDriver; -friend class BinMXCAFDoc_LayerToolDriver; -friend class BinMXCAFDoc_ShapeToolDriver; -friend class BinMXCAFDoc_DimTolToolDriver; -friend class BinMXCAFDoc_MaterialToolDriver; -friend class BinMXCAFDoc_ViewDriver; -friend class BinMXCAFDoc_ViewToolDriver; }; diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_LayerToolDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_LayerToolDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_LayerToolDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_LayerToolDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_LayerToolDriver,BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_LayerToolDriver::BinMXCAFDoc_LayerToolDriver(const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_LayerTool)->Name()) { -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_LayerToolDriver::NewEmpty() const { - return new XCAFDoc_LayerTool(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_LayerToolDriver::Paste(const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - return Standard_True; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_LayerToolDriver::Paste(const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const -{ -} - diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_LayerToolDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_LayerToolDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_LayerToolDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_LayerToolDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_LayerToolDriver_HeaderFile -#define _BinMXCAFDoc_LayerToolDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMXCAFDoc_LayerToolDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_LayerToolDriver, BinMDF_ADriver) - - -class BinMXCAFDoc_LayerToolDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_LayerToolDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_LayerToolDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMXCAFDoc_LayerToolDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_MaterialToolDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_MaterialToolDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_MaterialToolDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_MaterialToolDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -// Created on: 2008-12-10 -// Created by: Pavel TELKOV -// Copyright (c) 2008-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_MaterialToolDriver,BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_MaterialToolDriver::BinMXCAFDoc_MaterialToolDriver - (const Handle(Message_Messenger)& theMsgDriver) -: BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_MaterialTool)->Name()) -{ -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_MaterialToolDriver::NewEmpty() const -{ - return new XCAFDoc_MaterialTool(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_MaterialToolDriver::Paste - (const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - return Standard_True; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_MaterialToolDriver::Paste - (const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const { -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_MaterialToolDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_MaterialToolDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_MaterialToolDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_MaterialToolDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2008-12-10 -// Created by: Pavel TELKOV -// Copyright (c) 2008-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_MaterialToolDriver_HeaderFile -#define _BinMXCAFDoc_MaterialToolDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMXCAFDoc_MaterialToolDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_MaterialToolDriver, BinMDF_ADriver) - - -class BinMXCAFDoc_MaterialToolDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_MaterialToolDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_MaterialToolDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMXCAFDoc_MaterialToolDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NoteBalloonDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NoteBalloonDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NoteBalloonDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NoteBalloonDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -// Created on: 2017-08-10 -// Created by: Eugeny NIKONOV -// Copyright (c) 2005-2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_NoteBalloonDriver, BinMXCAFDoc_NoteCommentDriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_NoteBalloonDriver::BinMXCAFDoc_NoteBalloonDriver(const Handle(Message_Messenger)& theMsgDriver) - : BinMXCAFDoc_NoteCommentDriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_NoteBalloon)->Name()) -{ -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_NoteBalloonDriver::NewEmpty() const -{ - return new XCAFDoc_NoteBalloon(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_NoteBalloonDriver::BinMXCAFDoc_NoteBalloonDriver(const Handle(Message_Messenger)& theMsgDriver, - Standard_CString theName) - : BinMXCAFDoc_NoteCommentDriver(theMsgDriver, theName) -{ - -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NoteBalloonDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NoteBalloonDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NoteBalloonDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NoteBalloonDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -// Created on: 2017-08-10 -// Created by: Sergey NIKONOV -// Copyright (c) 2005-2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_NoteBalloonDriver_HeaderFile -#define _BinMXCAFDoc_NoteBalloonDriver_HeaderFile - -#include - -class BinMXCAFDoc_NoteBalloonDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_NoteBalloonDriver, BinMXCAFDoc_NoteCommentDriver) - -class BinMXCAFDoc_NoteBalloonDriver : public BinMXCAFDoc_NoteCommentDriver -{ -public: - - Standard_EXPORT BinMXCAFDoc_NoteBalloonDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_NoteBalloonDriver, BinMXCAFDoc_NoteCommentDriver) - - -protected: - - BinMXCAFDoc_NoteBalloonDriver(const Handle(Message_Messenger)& theMsgDriver, - Standard_CString theName); - -}; - -#endif // _BinMXCAFDoc_NoteCommentDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NotesToolDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NotesToolDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NotesToolDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NotesToolDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -// Created on: 2017-02-10 -// Created by: Eugeny NIKONOV -// Copyright (c) 2005-2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_NotesToolDriver, BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_NotesToolDriver::BinMXCAFDoc_NotesToolDriver(const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_NotesTool)->Name()) -{ -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_NotesToolDriver::NewEmpty() const -{ - return new XCAFDoc_NotesTool(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_NotesToolDriver::Paste(const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - return Standard_True; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_NotesToolDriver::Paste(const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const -{ -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NotesToolDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NotesToolDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NotesToolDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_NotesToolDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -// Created on: 2017-02-10 -// Created by: Sergey NIKONOV -// Copyright (c) 2005-2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_NotesToolDriver_HeaderFile -#define _BinMXCAFDoc_NotesToolDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include - -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - -class BinMXCAFDoc_NotesToolDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_NotesToolDriver, BinMDF_ADriver) - -class BinMXCAFDoc_NotesToolDriver : public BinMDF_ADriver -{ -public: - - Standard_EXPORT BinMXCAFDoc_NotesToolDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, - const Handle(TDF_Attribute)& theTarget, - BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT void Paste (const Handle(TDF_Attribute)& theSource, - BinObjMgt_Persistent& theTarget, - BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_NotesToolDriver, BinMDF_ADriver) - -}; - -#endif // _BinMXCAFDoc_NotesToolDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ShapeToolDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ShapeToolDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ShapeToolDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ShapeToolDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_ShapeToolDriver,BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_ShapeToolDriver::BinMXCAFDoc_ShapeToolDriver(const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_ShapeTool)->Name()) -{ -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_ShapeToolDriver::NewEmpty() const { - return new XCAFDoc_ShapeTool(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_ShapeToolDriver::Paste(const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - return Standard_True; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_ShapeToolDriver::Paste(const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const -{ -} - diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ShapeToolDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ShapeToolDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ShapeToolDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ShapeToolDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_ShapeToolDriver_HeaderFile -#define _BinMXCAFDoc_ShapeToolDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMXCAFDoc_ShapeToolDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_ShapeToolDriver, BinMDF_ADriver) - - -class BinMXCAFDoc_ShapeToolDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_ShapeToolDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_ShapeToolDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMXCAFDoc_ShapeToolDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -// Created on: 2016-10-24 -// Created by: Irina KRYLOVA -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_ViewDriver, BinMDF_ADriver) - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -BinMXCAFDoc_ViewDriver::BinMXCAFDoc_ViewDriver (const Handle(Message_Messenger)& theMsgDriver) -: BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_View)->Name()) -{ -} - -//======================================================================= -//function : NewEmpty -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_ViewDriver::NewEmpty() const -{ - return new XCAFDoc_View(); -} - -//======================================================================= -//function : Paste -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_ViewDriver::Paste (const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - return Standard_True; -} - -//======================================================================= -//function : Paste -//purpose : -//======================================================================= -void BinMXCAFDoc_ViewDriver::Paste (const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const -{ -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -// Created on: 2016-10-24 -// Created by: Irina KRYLOVA -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_ViewDriver_HeaderFile -#define _BinMXCAFDoc_ViewDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include - -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - -class BinMXCAFDoc_ViewDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_ViewDriver, BinMDF_ADriver) - -class BinMXCAFDoc_ViewDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_ViewDriver (const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, - const Handle(TDF_Attribute)& theTarget, - BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, - BinObjMgt_Persistent& theTarget, - BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_ViewDriver, BinMDF_ADriver) - -}; - -#endif // _BinMXCAFDoc_ViewDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewToolDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewToolDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewToolDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewToolDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -// Created on: 2016-10-24 -// Created by: Irina KRYLOVA -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_ViewToolDriver, BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_ViewToolDriver::BinMXCAFDoc_ViewToolDriver - (const Handle(Message_Messenger)& theMsgDriver) -: BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_ViewTool)->Name()) -{ -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_ViewToolDriver::NewEmpty() const -{ - return new XCAFDoc_ViewTool(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_ViewToolDriver::Paste - (const BinObjMgt_Persistent& /*theSource*/, - const Handle(TDF_Attribute)& /*theTarget*/, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - return Standard_True; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_ViewToolDriver::Paste - (const Handle(TDF_Attribute)& /*theSource*/, - BinObjMgt_Persistent& /*theTarget*/, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const { -} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewToolDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewToolDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewToolDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_ViewToolDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -// Created on: 2016-10-24 -// Created by: Irina KRYLOVA -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_ViewToolDriver_HeaderFile -#define _BinMXCAFDoc_ViewToolDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMXCAFDoc_ViewToolDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_ViewToolDriver, BinMDF_ADriver) - - -class BinMXCAFDoc_ViewToolDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_ViewToolDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_ViewToolDriver, BinMDF_ADriver) - -}; -#endif // _BinMXCAFDoc_ViewToolDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialDriver.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,264 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_VisMaterialDriver, BinMDF_ADriver) + +//! Encode alpha mode into character. +static Standard_Byte alphaModeToChar (Graphic3d_AlphaMode theMode) +{ + switch (theMode) + { + case Graphic3d_AlphaMode_Opaque: return 'O'; + case Graphic3d_AlphaMode_Mask: return 'M'; + case Graphic3d_AlphaMode_Blend: return 'B'; + case Graphic3d_AlphaMode_BlendAuto: return 'A'; + } + return 'A'; +} + +//! Decode alpha mode from character. +static Graphic3d_AlphaMode alphaModeFromChar (Standard_Byte theMode) +{ + switch (theMode) + { + case 'O': return Graphic3d_AlphaMode_Opaque; + case 'M': return Graphic3d_AlphaMode_Mask; + case 'B': return Graphic3d_AlphaMode_Blend; + case 'A': return Graphic3d_AlphaMode_BlendAuto; + } + return Graphic3d_AlphaMode_BlendAuto; +} + +//! Encode vec3. +static void writeVec3 (BinObjMgt_Persistent& theTarget, + const Graphic3d_Vec3& theVec3) +{ + theTarget.PutShortReal (theVec3[0]); + theTarget.PutShortReal (theVec3[1]); + theTarget.PutShortReal (theVec3[2]); +} + +//! Encode vec4. +static void writeVec4 (BinObjMgt_Persistent& theTarget, + const Graphic3d_Vec4& theVec4) +{ + theTarget.PutShortReal (theVec4[0]); + theTarget.PutShortReal (theVec4[1]); + theTarget.PutShortReal (theVec4[2]); + theTarget.PutShortReal (theVec4[3]); +} + +//! Decode vec3. +static void readVec3 (const BinObjMgt_Persistent& theSource, + Graphic3d_Vec3& theVec3) +{ + theSource.GetShortReal (theVec3[0]); + theSource.GetShortReal (theVec3[1]); + theSource.GetShortReal (theVec3[2]); +} + +//! Decode vec3. +static void readColor (const BinObjMgt_Persistent& theSource, + Quantity_Color& theColor) +{ + Graphic3d_Vec3 aVec3; + readVec3 (theSource, aVec3); + theColor = Quantity_Color (aVec3); +} + +//! Decode vec4. +static void readColor (const BinObjMgt_Persistent& theSource, + Quantity_ColorRGBA& theColor) +{ + Graphic3d_Vec4 aVec4; + theSource.GetShortReal (aVec4[0]); + theSource.GetShortReal (aVec4[1]); + theSource.GetShortReal (aVec4[2]); + theSource.GetShortReal (aVec4[3]); + theColor = Quantity_ColorRGBA (aVec4); +} + +//! Encode texture path. +static void writeTexture (BinObjMgt_Persistent& theTarget, + const Handle(Image_Texture)& theImage) +{ + theTarget.PutAsciiString (!theImage.IsNull() + && !theImage->FilePath().IsEmpty() + && theImage->FileOffset() == -1 + ? theImage->FilePath() + : ""); +} + +//! Decode texture path. +static void readTexture (const BinObjMgt_Persistent& theSource, + Handle(Image_Texture)& theTexture) +{ + TCollection_AsciiString aPath; + theSource.GetAsciiString (aPath); + if (!aPath.IsEmpty()) + { + theTexture = new Image_Texture (aPath); + } +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +BinMXCAFDoc_VisMaterialDriver::BinMXCAFDoc_VisMaterialDriver (const Handle(Message_Messenger)& theMsgDriver) +: BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_VisMaterial)->Name()) +{ +} + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) BinMXCAFDoc_VisMaterialDriver::NewEmpty() const +{ + return new XCAFDoc_VisMaterial(); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= +Standard_Boolean BinMXCAFDoc_VisMaterialDriver::Paste (const BinObjMgt_Persistent& theSource, + const Handle(TDF_Attribute)& theTarget, + BinObjMgt_RRelocationTable& /*theRelocTable*/) const +{ + Handle(XCAFDoc_VisMaterial) aMat = Handle(XCAFDoc_VisMaterial)::DownCast(theTarget); + Standard_Byte aVerMaj = 0, aVerMin = 0; + theSource.GetByte (aVerMaj); + theSource.GetByte (aVerMin); + if (aVerMaj < 1 || aVerMaj > MaterialVersionMajor) + { + myMessageDriver->Send (TCollection_AsciiString ("Skipping XCAFDoc_VisMaterial of unknown version ") + + Standard_Integer(aVerMaj) + "." + Standard_Integer(aVerMin) + + " (supported version: " + Standard_Integer(MaterialVersionMajor) + "." + Standard_Integer(MaterialVersionMinor) + ")"); + return false; + } + + Standard_Byte isDoubleSided = 0, anAlphaMode = 0; + Standard_ShortReal anAlphaCutOff = 0.5f; + theSource.GetByte (isDoubleSided); + theSource.GetByte (anAlphaMode); + theSource.GetShortReal (anAlphaCutOff); + aMat->SetDoubleSided (isDoubleSided == '1'); + aMat->SetAlphaMode (alphaModeFromChar (anAlphaMode), anAlphaCutOff); + + XCAFDoc_VisMaterialPBR aPbrMat; + theSource.GetBoolean (aPbrMat.IsDefined); + if (aPbrMat.IsDefined) + { + readColor (theSource, aPbrMat.BaseColor); + readVec3 (theSource, aPbrMat.EmissiveFactor); + theSource.GetShortReal (aPbrMat.Metallic); + theSource.GetShortReal (aPbrMat.Roughness); + readTexture (theSource, aPbrMat.BaseColorTexture); + readTexture (theSource, aPbrMat.MetallicRoughnessTexture); + readTexture (theSource, aPbrMat.EmissiveTexture); + readTexture (theSource, aPbrMat.OcclusionTexture); + readTexture (theSource, aPbrMat.NormalTexture); + aMat->SetPbrMaterial (aPbrMat); + } + + bool hasComMat = false; + theSource.GetBoolean (hasComMat); + if (hasComMat) + { + XCAFDoc_VisMaterialCommon aComMat; + aComMat.IsDefined = true; + readColor (theSource, aComMat.AmbientColor); + readColor (theSource, aComMat.DiffuseColor); + readColor (theSource, aComMat.SpecularColor); + readColor (theSource, aComMat.EmissiveColor); + theSource.GetShortReal (aComMat.Shininess); + theSource.GetShortReal (aComMat.Transparency); + readTexture (theSource, aComMat.DiffuseTexture); + aMat->SetCommonMaterial (aComMat); + } + + if (aVerMaj > MaterialVersionMajor_1 + || (aVerMaj == MaterialVersionMajor_1 + && aVerMin >= MaterialVersionMinor_1)) + { + if (aPbrMat.IsDefined) + { + theSource.GetShortReal (aPbrMat.RefractionIndex); + } + } + + if (aPbrMat.IsDefined) + { + aMat->SetPbrMaterial (aPbrMat); + } + + return Standard_True; +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= +void BinMXCAFDoc_VisMaterialDriver::Paste (const Handle(TDF_Attribute)& theSource, + BinObjMgt_Persistent& theTarget, + BinObjMgt_SRelocationTable& ) const +{ + Handle(XCAFDoc_VisMaterial) aMat = Handle(XCAFDoc_VisMaterial)::DownCast(theSource); + theTarget.PutByte (MaterialVersionMajor); + theTarget.PutByte (MaterialVersionMinor); + + theTarget.PutByte (aMat->IsDoubleSided() ? '1' : '0'); + theTarget.PutByte (alphaModeToChar (aMat->AlphaMode())); + theTarget.PutShortReal (aMat->AlphaCutOff()); + + theTarget.PutBoolean (aMat->HasPbrMaterial()); + if (aMat->HasPbrMaterial()) + { + const XCAFDoc_VisMaterialPBR& aPbrMat = aMat->PbrMaterial(); + writeVec4 (theTarget, aPbrMat.BaseColor); + writeVec3 (theTarget, aPbrMat.EmissiveFactor); + theTarget.PutShortReal (aPbrMat.Metallic); + theTarget.PutShortReal (aPbrMat.Roughness); + writeTexture (theTarget, aPbrMat.BaseColorTexture); + writeTexture (theTarget, aPbrMat.MetallicRoughnessTexture); + writeTexture (theTarget, aPbrMat.EmissiveTexture); + writeTexture (theTarget, aPbrMat.OcclusionTexture); + writeTexture (theTarget, aPbrMat.NormalTexture); + } + + theTarget.PutBoolean (aMat->HasCommonMaterial()); + if (aMat->HasCommonMaterial()) + { + const XCAFDoc_VisMaterialCommon& aComMat = aMat->CommonMaterial(); + writeVec3 (theTarget, aComMat.AmbientColor); + writeVec3 (theTarget, aComMat.DiffuseColor); + writeVec3 (theTarget, aComMat.SpecularColor); + writeVec3 (theTarget, aComMat.EmissiveColor); + theTarget.PutShortReal (aComMat.Shininess); + theTarget.PutShortReal (aComMat.Transparency); + writeTexture (theTarget, aComMat.DiffuseTexture); + } + + if (aMat->HasPbrMaterial()) + { + theTarget.PutShortReal (aMat->PbrMaterial().RefractionIndex); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialDriver.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,59 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _BinMXCAFDoc_VisMaterialDriver_HeaderFile +#define _BinMXCAFDoc_VisMaterialDriver_HeaderFile + +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(BinMXCAFDoc_VisMaterialDriver, BinMDF_ADriver) + +//! Binary persistence driver for XCAFDoc_VisMaterial attribute. +class BinMXCAFDoc_VisMaterialDriver : public BinMDF_ADriver +{ + DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_VisMaterialDriver, BinMDF_ADriver) + + //! Persistence version (major for breaking changes, minor for adding new fields at end). + enum + { + MaterialVersionMajor_1 = 1, + MaterialVersionMinor_0 = 0, + MaterialVersionMinor_1 = 1, //!< added IOR + + MaterialVersionMajor = MaterialVersionMajor_1, + MaterialVersionMinor = MaterialVersionMinor_1 + }; +public: + + //! Main constructor. + Standard_EXPORT BinMXCAFDoc_VisMaterialDriver (const Handle(Message_Messenger)& theMsgDriver); + + //! Create new instance of XCAFDoc_VisMaterial. + Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; + + //! Paste attribute from persistence into document. + Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, + const Handle(TDF_Attribute)& theTarget, + BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; + + //! Paste attribute from document into persistence. + Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, + BinObjMgt_Persistent& theTarget, + BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; + +}; + +#endif // _BinMXCAFDoc_VisMaterialDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialToolDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialToolDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialToolDriver.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialToolDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,59 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include + +IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_VisMaterialToolDriver, BinMDF_ADriver) + +//======================================================================= +//function : BinMXCAFDoc_VisMaterialToolDriver +//purpose : +//======================================================================= +BinMXCAFDoc_VisMaterialToolDriver::BinMXCAFDoc_VisMaterialToolDriver (const Handle(Message_Messenger)& theMsgDriver) +: BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(XCAFDoc_VisMaterialTool)->Name()) +{ + // +} + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) BinMXCAFDoc_VisMaterialToolDriver::NewEmpty() const +{ + return new XCAFDoc_VisMaterialTool(); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= +Standard_Boolean BinMXCAFDoc_VisMaterialToolDriver::Paste (const BinObjMgt_Persistent& , + const Handle(TDF_Attribute)& , + BinObjMgt_RRelocationTable& ) const +{ + return Standard_True; +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= +void BinMXCAFDoc_VisMaterialToolDriver::Paste (const Handle(TDF_Attribute)& , + BinObjMgt_Persistent& , + BinObjMgt_SRelocationTable& ) const +{ + // +} diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialToolDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialToolDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialToolDriver.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VisMaterialToolDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,45 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _BinMXCAFDoc_VisMaterialToolDriver_HeaderFile +#define _BinMXCAFDoc_VisMaterialToolDriver_HeaderFile + +#include + +DEFINE_STANDARD_HANDLE(BinMXCAFDoc_VisMaterialToolDriver, BinMDF_ADriver) + +//! Binary persistence driver for XCAFDoc_VisMaterialTool attribute. +class BinMXCAFDoc_VisMaterialToolDriver : public BinMDF_ADriver +{ + DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_VisMaterialToolDriver, BinMDF_ADriver) +public: + + //! Main constructor. + Standard_EXPORT BinMXCAFDoc_VisMaterialToolDriver (const Handle(Message_Messenger)& theMsgDriver); + + //! Create new instance of XCAFDoc_VisMaterialTool. + Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; + + //! Paste attribute from persistence into document. + Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, + const Handle(TDF_Attribute)& theTarget, + BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; + + //! Paste attribute from document into persistence. + Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, + BinObjMgt_Persistent& theTarget, + BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; + +}; + +#endif // _BinMXCAFDoc_VisMaterialToolDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VolumeDriver.cxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VolumeDriver.cxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VolumeDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VolumeDriver.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(BinMXCAFDoc_VolumeDriver,BinMDF_ADriver) - -//======================================================================= -//function : -//purpose : -//======================================================================= -BinMXCAFDoc_VolumeDriver::BinMXCAFDoc_VolumeDriver(const Handle(Message_Messenger)& theMsgDriver) - : BinMDF_ADriver(theMsgDriver, STANDARD_TYPE(XCAFDoc_Volume)->Name()) { -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Handle(TDF_Attribute) BinMXCAFDoc_VolumeDriver::NewEmpty() const { - return new XCAFDoc_Volume(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -Standard_Boolean BinMXCAFDoc_VolumeDriver::Paste(const BinObjMgt_Persistent& theSource, - const Handle(TDF_Attribute)& theTarget, - BinObjMgt_RRelocationTable& /*theRelocTable*/) const -{ - Handle(XCAFDoc_Volume) anAtt = Handle(XCAFDoc_Volume)::DownCast(theTarget); - Standard_Real aVol; - Standard_Boolean isOk = theSource >> aVol; - if(isOk) - anAtt->Set(aVol); - return isOk; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void BinMXCAFDoc_VolumeDriver::Paste(const Handle(TDF_Attribute)& theSource, - BinObjMgt_Persistent& theTarget, - BinObjMgt_SRelocationTable& /*theRelocTable*/) const -{ - Handle(XCAFDoc_Volume) anAtt = Handle(XCAFDoc_Volume)::DownCast(theSource); - theTarget << anAtt->Get(); -} - diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VolumeDriver.hxx opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VolumeDriver.hxx --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VolumeDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/BinMXCAFDoc_VolumeDriver.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -// Created on: 2005-05-17 -// Created by: Eugeny NAPALKOV -// Copyright (c) 2005-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BinMXCAFDoc_VolumeDriver_HeaderFile -#define _BinMXCAFDoc_VolumeDriver_HeaderFile - -#include -#include - -#include -#include -#include -#include -class Message_Messenger; -class TDF_Attribute; -class BinObjMgt_Persistent; - - -class BinMXCAFDoc_VolumeDriver; -DEFINE_STANDARD_HANDLE(BinMXCAFDoc_VolumeDriver, BinMDF_ADriver) - - -class BinMXCAFDoc_VolumeDriver : public BinMDF_ADriver -{ - -public: - - - Standard_EXPORT BinMXCAFDoc_VolumeDriver(const Handle(Message_Messenger)& theMsgDriver); - - Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_Boolean Paste (const BinObjMgt_Persistent& theSource, const Handle(TDF_Attribute)& theTarget, BinObjMgt_RRelocationTable& theRelocTable) const Standard_OVERRIDE; - - Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theSource, BinObjMgt_Persistent& theTarget, BinObjMgt_SRelocationTable& theRelocTable) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(BinMXCAFDoc_VolumeDriver,BinMDF_ADriver) - -protected: - - - - -private: - - - - -}; - - - - - - - -#endif // _BinMXCAFDoc_VolumeDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/FILES opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/FILES --- opencascade-7.4.1+dfsg1/src/BinMXCAFDoc/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinMXCAFDoc/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -2,54 +2,28 @@ BinMXCAFDoc.hxx BinMXCAFDoc_AssemblyItemRefDriver.cxx BinMXCAFDoc_AssemblyItemRefDriver.hxx -BinMXCAFDoc_AreaDriver.cxx -BinMXCAFDoc_AreaDriver.hxx BinMXCAFDoc_CentroidDriver.cxx BinMXCAFDoc_CentroidDriver.hxx -BinMXCAFDoc_ClippingPlaneToolDriver.cxx -BinMXCAFDoc_ClippingPlaneToolDriver.hxx BinMXCAFDoc_ColorDriver.cxx BinMXCAFDoc_ColorDriver.hxx -BinMXCAFDoc_ColorToolDriver.cxx -BinMXCAFDoc_ColorToolDriver.hxx BinMXCAFDoc_DatumDriver.cxx BinMXCAFDoc_DatumDriver.hxx -BinMXCAFDoc_DimensionDriver.cxx -BinMXCAFDoc_DimensionDriver.hxx BinMXCAFDoc_DimTolDriver.cxx BinMXCAFDoc_DimTolDriver.hxx -BinMXCAFDoc_DimTolToolDriver.cxx -BinMXCAFDoc_DimTolToolDriver.hxx -BinMXCAFDoc_DocumentToolDriver.cxx -BinMXCAFDoc_DocumentToolDriver.hxx -BinMXCAFDoc_GeomToleranceDriver.cxx -BinMXCAFDoc_GeomToleranceDriver.hxx BinMXCAFDoc_GraphNodeDriver.cxx BinMXCAFDoc_GraphNodeDriver.hxx -BinMXCAFDoc_LayerToolDriver.cxx -BinMXCAFDoc_LayerToolDriver.hxx BinMXCAFDoc_LocationDriver.cxx BinMXCAFDoc_LocationDriver.hxx BinMXCAFDoc_LocationDriver.lxx BinMXCAFDoc_MaterialDriver.cxx BinMXCAFDoc_MaterialDriver.hxx -BinMXCAFDoc_MaterialToolDriver.cxx -BinMXCAFDoc_MaterialToolDriver.hxx BinMXCAFDoc_NoteDriver.cxx BinMXCAFDoc_NoteDriver.hxx -BinMXCAFDoc_NoteBalloonDriver.cxx -BinMXCAFDoc_NoteBalloonDriver.hxx BinMXCAFDoc_NoteCommentDriver.cxx BinMXCAFDoc_NoteCommentDriver.hxx BinMXCAFDoc_NoteBinDataDriver.cxx BinMXCAFDoc_NoteBinDataDriver.hxx -BinMXCAFDoc_NotesToolDriver.cxx -BinMXCAFDoc_NotesToolDriver.hxx -BinMXCAFDoc_ShapeToolDriver.cxx -BinMXCAFDoc_ShapeToolDriver.hxx -BinMXCAFDoc_ViewDriver.cxx -BinMXCAFDoc_ViewDriver.hxx -BinMXCAFDoc_ViewToolDriver.cxx -BinMXCAFDoc_ViewToolDriver.hxx -BinMXCAFDoc_VolumeDriver.cxx -BinMXCAFDoc_VolumeDriver.hxx +BinMXCAFDoc_VisMaterialDriver.cxx +BinMXCAFDoc_VisMaterialDriver.hxx +BinMXCAFDoc_VisMaterialToolDriver.cxx +BinMXCAFDoc_VisMaterialToolDriver.hxx diff -Nru opencascade-7.4.1+dfsg1/src/BinTools/BinTools_Curve2dSet.cxx opencascade-7.5.1+dfsg1/src/BinTools/BinTools_Curve2dSet.cxx --- opencascade-7.4.1+dfsg1/src/BinTools/BinTools_Curve2dSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinTools/BinTools_Curve2dSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,6 +38,7 @@ #include #include #include +#include #define LINE 1 #define CIRCLE 2 @@ -345,11 +346,13 @@ //purpose : //======================================================================= -void BinTools_Curve2dSet::Write(Standard_OStream& OS)const +void BinTools_Curve2dSet::Write (Standard_OStream& OS, + const Message_ProgressRange& theRange) const { Standard_Integer i, aNbCurves = myMap.Extent(); + Message_ProgressScope aPS(theRange, "Writing 2D curves",aNbCurves); OS << "Curve2ds "<< aNbCurves << "\n"; - for (i = 1; i <= aNbCurves; i++) { + for (i = 1; i <= aNbCurves && aPS.More(); i++, aPS.Next()) { WriteCurve2d(Handle(Geom2d_Curve)::DownCast(myMap(i)),OS); } } @@ -692,7 +695,8 @@ //purpose : //======================================================================= -void BinTools_Curve2dSet::Read(Standard_IStream& IS) +void BinTools_Curve2dSet::Read (Standard_IStream& IS, + const Message_ProgressRange& theRange) { char buffer[255]; @@ -710,12 +714,10 @@ Handle(Geom2d_Curve) C; Standard_Integer i, aNbCurves; IS >> aNbCurves; - IS.get();//remove - for (i = 1; i <= aNbCurves; i++) { + Message_ProgressScope aPS(theRange, "Reading curves 2d", aNbCurves); + IS.get();//remove + for (i = 1; i <= aNbCurves && aPS.More(); i++, aPS.Next()) { BinTools_Curve2dSet::ReadCurve2d(IS,C); myMap.Add(C); } } - - - diff -Nru opencascade-7.4.1+dfsg1/src/BinTools/BinTools_Curve2dSet.hxx opencascade-7.5.1+dfsg1/src/BinTools/BinTools_Curve2dSet.hxx --- opencascade-7.4.1+dfsg1/src/BinTools/BinTools_Curve2dSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinTools/BinTools_Curve2dSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,9 @@ #include #include #include + +#include + class Standard_OutOfRange; class Geom2d_Curve; @@ -57,42 +60,26 @@ //! Writes the content of me on the stream in a //! format that can be read back by Read. - Standard_EXPORT void Write (Standard_OStream& OS) const; + Standard_EXPORT void Write (Standard_OStream& OS, + const Message_ProgressRange& theRange = Message_ProgressRange()) const; //! Reads the content of me from the stream . me //! is first cleared. - Standard_EXPORT void Read (Standard_IStream& IS); + Standard_EXPORT void Read (Standard_IStream& IS, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Dumps the curve on the binary stream, that can be read back. - Standard_EXPORT static void WriteCurve2d (const Handle(Geom2d_Curve)& C, Standard_OStream& OS); + Standard_EXPORT static void WriteCurve2d(const Handle(Geom2d_Curve)& C, Standard_OStream& OS); //! Reads the curve from the stream. The curve is //! assumed to have been written with the Write //! method. Standard_EXPORT static Standard_IStream& ReadCurve2d (Standard_IStream& IS, Handle(Geom2d_Curve)& C); - - - -protected: - - - - - private: - - TColStd_IndexedMapOfTransient myMap; - }; - - - - - - #endif // _BinTools_Curve2dSet_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinTools/BinTools_CurveSet.cxx opencascade-7.5.1+dfsg1/src/BinTools/BinTools_CurveSet.cxx --- opencascade-7.4.1+dfsg1/src/BinTools/BinTools_CurveSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinTools/BinTools_CurveSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,6 +37,7 @@ #include #include #include +#include #define LINE 1 #define CIRCLE 2 @@ -358,11 +359,13 @@ //purpose : //======================================================================= -void BinTools_CurveSet::Write(Standard_OStream& OS)const +void BinTools_CurveSet::Write (Standard_OStream& OS, + const Message_ProgressRange& theRange)const { - Standard_Integer i, nbsurf = myMap.Extent(); - OS << "Curves "<< nbsurf << "\n"; - for (i = 1; i <= nbsurf; i++) { + Standard_Integer i, nbcurv = myMap.Extent(); + Message_ProgressScope aPS(theRange, "Writing curves", nbcurv); + OS << "Curves "<< nbcurv << "\n"; + for (i = 1; i <= nbcurv &&aPS.More(); i++, aPS.Next()) { WriteCurve(Handle(Geom_Curve)::DownCast(myMap(i)),OS); } } @@ -711,7 +714,8 @@ //purpose : //======================================================================= -void BinTools_CurveSet::Read(Standard_IStream& IS) +void BinTools_CurveSet::Read (Standard_IStream& IS, + const Message_ProgressRange& theRange) { char buffer[255]; IS >> buffer; @@ -729,11 +733,11 @@ Standard_Integer i, nbcurve; IS >> nbcurve; + Message_ProgressScope aPS(theRange, "Reading curves", nbcurve); + IS.get();//remove - for (i = 1; i <= nbcurve; i++) { + for (i = 1; i <= nbcurve && aPS.More(); i++, aPS.Next()) { BinTools_CurveSet::ReadCurve(IS,C); myMap.Add(C); } } - - diff -Nru opencascade-7.4.1+dfsg1/src/BinTools/BinTools_CurveSet.hxx opencascade-7.5.1+dfsg1/src/BinTools/BinTools_CurveSet.hxx --- opencascade-7.4.1+dfsg1/src/BinTools/BinTools_CurveSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinTools/BinTools_CurveSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,9 @@ #include #include #include + +#include + class Standard_OutOfRange; class Geom_Curve; @@ -54,11 +57,13 @@ //! Writes the content of me on the stream in a //! format that can be read back by Read. - Standard_EXPORT void Write (Standard_OStream& OS) const; + Standard_EXPORT void Write (Standard_OStream& OS, + const Message_ProgressRange& theRange = Message_ProgressRange()) const; //! Reads the content of me from the stream . me //! is first cleared. - Standard_EXPORT void Read (Standard_IStream& IS); + Standard_EXPORT void Read (Standard_IStream& IS, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Dumps the curve on the stream in binary format //! that can be read back. @@ -69,28 +74,10 @@ //! method Standard_EXPORT static Standard_IStream& ReadCurve (Standard_IStream& IS, Handle(Geom_Curve)& C); - - - -protected: - - - - - private: - - TColStd_IndexedMapOfTransient myMap; - }; - - - - - - #endif // _BinTools_CurveSet_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinTools/BinTools.cxx opencascade-7.5.1+dfsg1/src/BinTools/BinTools.cxx --- opencascade-7.4.1+dfsg1/src/BinTools/BinTools.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinTools/BinTools.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,17 +49,34 @@ //======================================================================= //function : PutReal -//purpose : +//purpose : //======================================================================= +Standard_OStream& BinTools::PutReal (Standard_OStream& theOS, + const Standard_Real& theValue) +{ +#if DO_INVERSE + const Standard_Real aRValue = InverseReal (theValue); + theOS.write((char*)&aRValue, sizeof(Standard_Real)); +#else + theOS.write((char*)&theValue, sizeof(Standard_Real)); +#endif + return theOS; +} -Standard_OStream& BinTools::PutReal(Standard_OStream& OS, const Standard_Real aValue) +//======================================================================= +//function : PutShortReal +//purpose : +//======================================================================= +Standard_OStream& BinTools::PutShortReal (Standard_OStream& theOS, + const Standard_ShortReal& theValue) { - Standard_Real aRValue = aValue; #if DO_INVERSE - aRValue = InverseReal (aValue); + const Standard_ShortReal aValue = InverseShortReal (theValue); + theOS.write ((char*)&aValue, sizeof(Standard_ShortReal)); +#else + theOS.write ((char*)&theValue, sizeof(Standard_ShortReal)); #endif - OS.write((char*)&aRValue, sizeof(Standard_Real)); - return OS; + return theOS; } //======================================================================= @@ -76,19 +93,39 @@ OS.write((char*)&aSValue, sizeof(Standard_ExtCharacter)); return OS; } + //======================================================================= //function : GetReal -//purpose : +//purpose : //======================================================================= +Standard_IStream& BinTools::GetReal (Standard_IStream& theIS, + Standard_Real& theValue) +{ + if (!theIS.read ((char*)&theValue, sizeof(Standard_Real))) + { + throw Storage_StreamTypeMismatchError(); + } +#if DO_INVERSE + theValue = InverseReal (theValue); +#endif + return theIS; +} -Standard_IStream& BinTools::GetReal(Standard_IStream& IS, Standard_Real& aValue) +//======================================================================= +//function : GetShortReal +//purpose : +//======================================================================= +Standard_IStream& BinTools::GetShortReal (Standard_IStream& theIS, + Standard_ShortReal& theValue) { - if(!IS.read ((char*)&aValue, sizeof(Standard_Real))) + if (!theIS.read ((char*)&theValue, sizeof(Standard_ShortReal))) + { throw Storage_StreamTypeMismatchError(); + } #if DO_INVERSE - aValue = InverseReal (aValue); + theValue = InverseShortReal (theValue); #endif - return IS; + return theIS; } //======================================================================= @@ -99,7 +136,7 @@ Standard_IStream& BinTools::GetInteger(Standard_IStream& IS, Standard_Integer& aValue) { if(!IS.read ((char*)&aValue, sizeof(Standard_Integer))) - throw Storage_StreamTypeMismatchError();; + throw Storage_StreamTypeMismatchError(); #if DO_INVERSE aValue = InverseInt (aValue); #endif @@ -114,7 +151,7 @@ Standard_IStream& BinTools::GetExtChar(Standard_IStream& IS, Standard_ExtCharacter& theValue) { if(!IS.read ((char*)&theValue, sizeof(Standard_ExtCharacter))) - throw Storage_StreamTypeMismatchError();; + throw Storage_StreamTypeMismatchError(); #if DO_INVERSE theValue = InverseExtChar (theValue); #endif @@ -137,12 +174,13 @@ //purpose : //======================================================================= -void BinTools::Write (const TopoDS_Shape& theShape, Standard_OStream& theStream) +void BinTools::Write (const TopoDS_Shape& theShape, Standard_OStream& theStream, + const Message_ProgressRange& theRange) { BinTools_ShapeSet aShapeSet(Standard_True); aShapeSet.SetFormatNb (3); aShapeSet.Add (theShape); - aShapeSet.Write (theStream); + aShapeSet.Write (theStream, theRange); aShapeSet.Write (theShape, theStream); } @@ -151,10 +189,11 @@ //purpose : //======================================================================= -void BinTools::Read (TopoDS_Shape& theShape, Standard_IStream& theStream) +void BinTools::Read (TopoDS_Shape& theShape, Standard_IStream& theStream, + const Message_ProgressRange& theRange) { BinTools_ShapeSet aShapeSet(Standard_True); - aShapeSet.Read (theStream); + aShapeSet.Read (theStream, theRange); aShapeSet.Read (theShape, theStream, aShapeSet.NbShapes()); } @@ -163,7 +202,8 @@ //purpose : //======================================================================= -Standard_Boolean BinTools::Write (const TopoDS_Shape& theShape, const Standard_CString theFile) +Standard_Boolean BinTools::Write (const TopoDS_Shape& theShape, const Standard_CString theFile, + const Message_ProgressRange& theRange) { std::ofstream aStream; aStream.precision (15); @@ -171,7 +211,7 @@ if (!aStream.good()) return Standard_False; - Write (theShape, aStream); + Write (theShape, aStream, theRange); aStream.close(); return aStream.good(); } @@ -181,7 +221,8 @@ //purpose : //======================================================================= -Standard_Boolean BinTools::Read (TopoDS_Shape& theShape, const Standard_CString theFile) +Standard_Boolean BinTools::Read (TopoDS_Shape& theShape, const Standard_CString theFile, + const Message_ProgressRange& theRange) { std::filebuf aBuf; OSD_OpenStream (aBuf, theFile, std::ios::in | std::ios::binary); @@ -189,6 +230,6 @@ return Standard_False; Standard_IStream aStream (&aBuf); - Read (theShape, aStream); + Read (theShape, aStream, theRange); return aStream.good(); } diff -Nru opencascade-7.4.1+dfsg1/src/BinTools/BinTools.hxx opencascade-7.5.1+dfsg1/src/BinTools/BinTools.hxx --- opencascade-7.4.1+dfsg1/src/BinTools/BinTools.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinTools/BinTools.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,7 @@ #include #include #include +#include class TopoDS_Shape; class BinTools_ShapeSet; @@ -42,9 +43,10 @@ DEFINE_STANDARD_ALLOC - - Standard_EXPORT static Standard_OStream& PutReal (Standard_OStream& OS, const Standard_Real theValue); - + Standard_EXPORT static Standard_OStream& PutReal (Standard_OStream& OS, const Standard_Real& theValue); + + Standard_EXPORT static Standard_OStream& PutShortReal (Standard_OStream& OS, const Standard_ShortReal& theValue); + Standard_EXPORT static Standard_OStream& PutInteger (Standard_OStream& OS, const Standard_Integer theValue); Standard_EXPORT static Standard_OStream& PutBool (Standard_OStream& OS, const Standard_Boolean theValue); @@ -52,7 +54,9 @@ Standard_EXPORT static Standard_OStream& PutExtChar (Standard_OStream& OS, const Standard_ExtCharacter theValue); Standard_EXPORT static Standard_IStream& GetReal (Standard_IStream& IS, Standard_Real& theValue); - + + Standard_EXPORT static Standard_IStream& GetShortReal (Standard_IStream& IS, Standard_ShortReal& theValue); + Standard_EXPORT static Standard_IStream& GetInteger (Standard_IStream& IS, Standard_Integer& theValue); Standard_EXPORT static Standard_IStream& GetBool (Standard_IStream& IS, Standard_Boolean& theValue); @@ -60,16 +64,22 @@ Standard_EXPORT static Standard_IStream& GetExtChar (Standard_IStream& IS, Standard_ExtCharacter& theValue); //! Writes on in binary format. - Standard_EXPORT static void Write (const TopoDS_Shape& theShape, Standard_OStream& theStream); + Standard_EXPORT static void Write (const TopoDS_Shape& theShape, Standard_OStream& theStream, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Reads a shape from and returns it in . - Standard_EXPORT static void Read (TopoDS_Shape& theShape, Standard_IStream& theStream); + Standard_EXPORT static void Read (TopoDS_Shape& theShape, Standard_IStream& theStream, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Writes in . - Standard_EXPORT static Standard_Boolean Write (const TopoDS_Shape& theShape, const Standard_CString theFile); + Standard_EXPORT static Standard_Boolean Write + (const TopoDS_Shape& theShape, const Standard_CString theFile, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Reads a shape from and returns it in . - Standard_EXPORT static Standard_Boolean Read (TopoDS_Shape& theShape, const Standard_CString theFile); + Standard_EXPORT static Standard_Boolean Read + (TopoDS_Shape& theShape, const Standard_CString theFile, + const Message_ProgressRange& theRange = Message_ProgressRange()); protected: diff -Nru opencascade-7.4.1+dfsg1/src/BinTools/BinTools_ShapeSet.cxx opencascade-7.5.1+dfsg1/src/BinTools/BinTools_ShapeSet.cxx --- opencascade-7.4.1+dfsg1/src/BinTools/BinTools_ShapeSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinTools/BinTools_ShapeSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,6 +51,7 @@ #include #include #include +#include #include //#define MDTV_DEB 1 @@ -294,14 +295,26 @@ //purpose : //======================================================================= -void BinTools_ShapeSet::WriteGeometry(Standard_OStream& OS)const +void BinTools_ShapeSet::WriteGeometry (Standard_OStream& OS, + const Message_ProgressRange& theRange)const { - myCurves2d.Write(OS); - myCurves.Write(OS); - WritePolygon3D(OS); - WritePolygonOnTriangulation(OS); - mySurfaces.Write(OS); - WriteTriangulation(OS); + Message_ProgressScope aPS(theRange, "Writing geometry", 6); + myCurves2d.Write(OS, aPS.Next()); + if (!aPS.More()) + return; + myCurves.Write(OS, aPS.Next()); + if (!aPS.More()) + return; + WritePolygon3D(OS, aPS.Next()); + if (!aPS.More()) + return; + WritePolygonOnTriangulation(OS, aPS.Next()); + if (!aPS.More()) + return; + mySurfaces.Write(OS, aPS.Next()); + if (!aPS.More()) + return; + WriteTriangulation(OS, aPS.Next()); } //======================================================================= @@ -309,7 +322,8 @@ //purpose : //======================================================================= -void BinTools_ShapeSet::Write(Standard_OStream& OS)const +void BinTools_ShapeSet::Write (Standard_OStream& OS, + const Message_ProgressRange& theRange)const { // write the copyright @@ -330,18 +344,22 @@ // write the geometry //----------------------------------------- - WriteGeometry(OS); + Message_ProgressScope aPS(theRange, "Writing geometry", 2); + + WriteGeometry(OS, aPS.Next()); + if (!aPS.More()) + return; //----------------------------------------- // write the shapes //----------------------------------------- Standard_Integer i, nbShapes = myShapes.Extent(); - + Message_ProgressScope aPSinner(aPS.Next(), "Writing shapes", nbShapes); OS << "\nTShapes " << nbShapes << "\n"; // subshapes are written first - for (i = 1; i <= nbShapes; i++) { + for (i = 1; i <= nbShapes && aPSinner.More(); i++, aPSinner.Next()) { const TopoDS_Shape& S = myShapes(i); @@ -369,7 +387,6 @@ } Write(TopoDS_Shape(),OS); // Null shape to end the list } - } //======================================================================= @@ -377,7 +394,8 @@ //purpose : //======================================================================= -void BinTools_ShapeSet::Read(Standard_IStream& IS) +void BinTools_ShapeSet::Read (Standard_IStream& IS, + const Message_ProgressRange& theRange) { Clear(); @@ -413,9 +431,10 @@ //----------------------------------------- // read the geometry //----------------------------------------- - - ReadGeometry(IS); - + Message_ProgressScope aPSouter(theRange, "Reading", 2); + ReadGeometry(IS, aPSouter.Next()); + if (!aPSouter.More()) + return; //----------------------------------------- // read the shapes //----------------------------------------- @@ -428,12 +447,11 @@ throw Standard_Failure(aMsg.str().c_str()); return; } - Standard_Integer nbShapes = 0; IS >> nbShapes; IS.get();//remove lf - - for (int i = 1; i <= nbShapes; i++) { + Message_ProgressScope aPSinner(aPSouter.Next(), "Reading Shapes", nbShapes); + for (int i = 1; i <= nbShapes && aPSinner.More(); i++, aPSinner.Next()) { TopoDS_Shape S; @@ -487,7 +505,8 @@ //purpose : //======================================================================= -void BinTools_ShapeSet::Write(const TopoDS_Shape& S, Standard_OStream& OS)const +void BinTools_ShapeSet::Write (const TopoDS_Shape& S, + Standard_OStream& OS)const { if (S.IsNull()) @@ -505,8 +524,8 @@ //purpose : //======================================================================= -void BinTools_ShapeSet::Read(TopoDS_Shape& S, Standard_IStream& IS, - const Standard_Integer nbshapes)const +void BinTools_ShapeSet::Read (TopoDS_Shape& S, Standard_IStream& IS, + const Standard_Integer nbshapes)const { Standard_Character aChar = '\0'; IS >> aChar; @@ -531,14 +550,26 @@ //purpose : //======================================================================= -void BinTools_ShapeSet::ReadGeometry(Standard_IStream& IS) +void BinTools_ShapeSet::ReadGeometry (Standard_IStream& IS, + const Message_ProgressRange& theRange) { - myCurves2d.Read(IS); - myCurves.Read(IS); - ReadPolygon3D(IS); - ReadPolygonOnTriangulation(IS); - mySurfaces.Read(IS); - ReadTriangulation(IS); + Message_ProgressScope aPS(theRange, "Reading geomentry", 6); + myCurves2d.Read(IS, aPS.Next()); + if (!aPS.More()) + return; + myCurves.Read(IS, aPS.Next()); + if (!aPS.More()) + return; + ReadPolygon3D(IS, aPS.Next()); + if (!aPS.More()) + return; + ReadPolygonOnTriangulation(IS, aPS.Next()); + if (!aPS.More()) + return; + mySurfaces.Read(IS, aPS.Next()); + if (!aPS.More()) + return; + ReadTriangulation(IS, aPS.Next()); } //======================================================================= @@ -546,7 +577,7 @@ //purpose : //======================================================================= -void BinTools_ShapeSet::WriteGeometry(const TopoDS_Shape& S, +void BinTools_ShapeSet::WriteGeometry (const TopoDS_Shape& S, Standard_OStream& OS)const { // Write the geometry @@ -725,7 +756,7 @@ const TopoDS_Face& F = TopoDS::Face(S); // Write the surface geometry - Standard_Boolean aNatRes = (BRep_Tool::NaturalRestriction(F)) ? Standard_True : Standard_False; + Standard_Boolean aNatRes = BRep_Tool::NaturalRestriction(F); BinTools::PutBool (OS, aNatRes); BinTools::PutReal (OS, TF->Tolerance()); BinTools::PutInteger (OS, !TF->Surface().IsNull() @@ -797,7 +828,7 @@ BRep_ListOfPointRepresentation& lpr = TV->ChangePoints(); TopLoc_Location L; - Standard_Boolean aNewF = (myFormatNb > 2) ? Standard_True : Standard_False; + Standard_Boolean aNewF = (myFormatNb > 2); do { if(aNewF) { val = (Standard_Integer)IS.get();//case {0|1|2|3} @@ -1034,8 +1065,8 @@ case 5 : // -5- Polygon3D BinTools::GetInteger(IS, c); BinTools::GetInteger(IS, l); -//??? Bug? myBuilder.UpdateEdge(E,Handle(Poly_Polygon3D)::DownCast(myPolygons3D(c))); - myBuilder.UpdateEdge(E,Handle(Poly_Polygon3D)::DownCast(myPolygons3D(c)), Locations().Location(l)); +//??? Bug? myBuilder.UpdateEdge(E,myPolygons3D(c)); + myBuilder.UpdateEdge(E, myPolygons3D(c), Locations().Location(l)); break; case 6 : // -6- Polygon on triangulation @@ -1047,18 +1078,13 @@ BinTools::GetInteger(IS, t); BinTools::GetInteger(IS, l); - if (closed) { - myBuilder.UpdateEdge - (E, Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt)), - Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt2)), - Handle(Poly_Triangulation)::DownCast(myTriangulations(t)), - Locations().Location(l)); + if (closed) + { + myBuilder.UpdateEdge (E, myNodes(pt), myNodes(pt2), myTriangulations(t), Locations().Location(l)); } - else { - myBuilder.UpdateEdge - (E,Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(pt)), - Handle(Poly_Triangulation)::DownCast(myTriangulations(t)), - Locations().Location(l)); + else + { + myBuilder.UpdateEdge (E, myNodes(pt), myTriangulations(t), Locations().Location(l)); } // range break; @@ -1107,8 +1133,7 @@ // cas triangulation if(aByte == 2) { BinTools::GetInteger(IS, s); - myBuilder.UpdateFace(TopoDS::Face(S), - Handle(Poly_Triangulation)::DownCast(myTriangulations(s))); + myBuilder.UpdateFace(TopoDS::Face(S), myTriangulations(s)); } } break; @@ -1182,197 +1207,223 @@ //======================================================================= //function : WritePolygonOnTriangulation -//purpose : +//purpose : //======================================================================= +void BinTools_ShapeSet::WritePolygonOnTriangulation + (Standard_OStream& OS, + const Message_ProgressRange& theRange) const +{ + const Standard_Integer aNbPol = myNodes.Extent(); + OS << "PolygonOnTriangulations " << aNbPol << "\n"; + try + { + OCC_CATCH_SIGNALS + Message_ProgressScope aPS(theRange, "Writing polygons on triangulation", aNbPol); + for (Standard_Integer aPolIter = 1; aPolIter <= aNbPol && aPS.More(); ++aPolIter, aPS.Next()) + { + const Handle(Poly_PolygonOnTriangulation)& aPoly = myNodes.FindKey (aPolIter); + const TColStd_Array1OfInteger& aNodes = aPoly->Nodes(); + BinTools::PutInteger(OS, aNodes.Length()); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNodes.Length(); ++aNodeIter) + { + BinTools::PutInteger(OS, aNodes.Value (aNodeIter)); + } -void BinTools_ShapeSet::WritePolygonOnTriangulation(Standard_OStream& OS) const -{ - Standard_Integer i, j, nbpOntri = myNodes.Extent(); + // write the deflection + BinTools::PutReal(OS, aPoly->Deflection()); - OS << "PolygonOnTriangulations " << nbpOntri << "\n"; - Handle(Poly_PolygonOnTriangulation) Poly; - Handle(TColStd_HArray1OfReal) Param; - try { - OCC_CATCH_SIGNALS - for (i=1; i<=nbpOntri; i++) { - Poly = Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(i)); - const TColStd_Array1OfInteger& Nodes = Poly->Nodes(); - BinTools::PutInteger(OS, Nodes.Length()); - for (j=1; j <= Nodes.Length(); j++) - BinTools::PutInteger(OS, Nodes.Value(j)); - - // writing parameters: - Param = Poly->Parameters(); - - // write the deflection - BinTools::PutReal(OS, Poly->Deflection()); - if (!Param.IsNull()) { - BinTools::PutBool(OS, Standard_True); - for (j=1; j <= Param->Length(); j++) - BinTools::PutReal(OS, Param->Value(j)); + // writing parameters + if (const Handle(TColStd_HArray1OfReal)& aParam = aPoly->Parameters()) + { + BinTools::PutBool(OS, Standard_True); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aParam->Length(); ++aNodeIter) + { + BinTools::PutReal(OS, aParam->Value (aNodeIter)); + } + } + else + { + BinTools::PutBool(OS, Standard_False); } - else - BinTools::PutBool(OS, Standard_False); } } - catch(Standard_Failure const& anException) { + catch (Standard_Failure const& anException) + { Standard_SStream aMsg; - aMsg << "EXCEPTION in BinTools_ShapeSet::WritePolygonOnTriangulation(..)" << std::endl; - aMsg << anException << std::endl; + aMsg << "EXCEPTION in BinTools_ShapeSet::WritePolygonOnTriangulation(..)\n" << anException << "\n"; throw Standard_Failure(aMsg.str().c_str()); } } //======================================================================= //function : ReadPolygonOnTriangulation -//purpose : +//purpose : //======================================================================= - -void BinTools_ShapeSet::ReadPolygonOnTriangulation(Standard_IStream& IS) -{ - char buffer[255]; - IS >> buffer; - if (IS.fail() || (strstr(buffer,"PolygonOnTriangulations") == NULL)) { +void BinTools_ShapeSet::ReadPolygonOnTriangulation + (Standard_IStream& IS, + const Message_ProgressRange& theRange) +{ + char aHeader[255]; + IS >> aHeader; + if (IS.fail() || (strstr(aHeader,"PolygonOnTriangulations") == NULL)) + { throw Standard_Failure("BinTools_ShapeSet::ReadPolygonOnTriangulation: Not a PolygonOnTriangulation section"); } - Standard_Integer i, j, val, nbpol = 0, nbnodes =0; - Standard_Boolean hasparameters; - Standard_Real par; - Handle(TColStd_HArray1OfReal) Param; - Handle(Poly_PolygonOnTriangulation) Poly; - IS >> nbpol; - IS.get();//remove LF - try { + + Standard_Integer aNbPol = 0; + IS >> aNbPol; + IS.get();//remove LF + try + { OCC_CATCH_SIGNALS - for (i=1; i<=nbpol; i++) { - BinTools::GetInteger(IS, nbnodes); + Message_ProgressScope aPS(theRange, "Reading Polygones on triangulation", aNbPol); + for (Standard_Integer aPolIter = 1; aPolIter <= aNbPol && aPS.More(); ++aPolIter, aPS.Next()) + { + Standard_Integer aNbNodes = 0; + BinTools::GetInteger(IS, aNbNodes); + Handle(Poly_PolygonOnTriangulation) aPoly = new Poly_PolygonOnTriangulation (aNbNodes, Standard_False); + TColStd_Array1OfInteger& aNodes = aPoly->ChangeNodes(); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNbNodes; ++aNodeIter) + { + BinTools::GetInteger(IS, aNodes.ChangeValue (aNodeIter)); + } - TColStd_Array1OfInteger Nodes(1, nbnodes); - for (j = 1; j <= nbnodes; j++) { - BinTools::GetInteger(IS, val); - Nodes(j) = val; - } - Standard_Real def; - BinTools::GetReal(IS, def); - BinTools::GetBool(IS, hasparameters); - if (hasparameters) { - TColStd_Array1OfReal Param1(1, nbnodes); - for (j = 1; j <= nbnodes; j++) { - BinTools::GetReal(IS, par); - Param1(j) = par; - } - Poly = new Poly_PolygonOnTriangulation(Nodes, Param1); + Standard_Real aDefl = 0.0; + BinTools::GetReal(IS, aDefl); + aPoly->Deflection (aDefl); + + Standard_Boolean hasParameters = Standard_False; + BinTools::GetBool(IS, hasParameters); + if (hasParameters) + { + Handle(TColStd_HArray1OfReal) aParams = new TColStd_HArray1OfReal (1, aNbNodes); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNbNodes; ++aNodeIter) + { + BinTools::GetReal(IS, aParams->ChangeValue (aNodeIter)); + } + aPoly->SetParameters (aParams); } - else Poly = new Poly_PolygonOnTriangulation(Nodes); - Poly->Deflection(def); - myNodes.Add(Poly); + myNodes.Add (aPoly); } } - catch(Standard_Failure const& anException) { + catch (Standard_Failure const& anException) + { Standard_SStream aMsg; - aMsg << "EXCEPTION in BinTools_ShapeSet::ReadPolygonOnTriangulation(..)" << std::endl; - aMsg << anException << std::endl; + aMsg << "EXCEPTION in BinTools_ShapeSet::ReadPolygonOnTriangulation(..)\n" << anException << "\n"; throw Standard_Failure(aMsg.str().c_str()); } } - - //======================================================================= //function : WritePolygon3D -//purpose : +//purpose : //======================================================================= - -void BinTools_ShapeSet::WritePolygon3D(Standard_OStream& OS)const +void BinTools_ShapeSet::WritePolygon3D (Standard_OStream& OS, + const Message_ProgressRange& theRange)const { - Standard_Integer i, j, nbpol = myPolygons3D.Extent(); - OS << "Polygon3D " << nbpol << "\n"; - Handle(Poly_Polygon3D) P; - try { + const Standard_Integer aNbPol = myPolygons3D.Extent(); + OS << "Polygon3D " << aNbPol << "\n"; + try + { OCC_CATCH_SIGNALS - for (i = 1; i <= nbpol; i++) { - P = Handle(Poly_Polygon3D)::DownCast(myPolygons3D(i)); - BinTools::PutInteger(OS, P->NbNodes()); - BinTools::PutBool(OS, P->HasParameters()? 1:0); - - // write the deflection - BinTools::PutReal(OS, P->Deflection()); - - // write the nodes - Standard_Integer i1, nbNodes = P->NbNodes(); - const TColgp_Array1OfPnt& Nodes = P->Nodes(); - for (j = 1; j <= nbNodes; j++) { - BinTools::PutReal(OS, Nodes(j).X()); - BinTools::PutReal(OS, Nodes(j).Y()); - BinTools::PutReal(OS, Nodes(j).Z()); - } - if (P->HasParameters()) { - const TColStd_Array1OfReal& Param = P->Parameters(); - for ( i1 = 1; i1 <= nbNodes; i1++ ) { - BinTools::PutReal(OS, Param(i1)); - } + Message_ProgressScope aPS(theRange, "Writing polygons 3D", aNbPol); + for (Standard_Integer aPolIter = 1; aPolIter <= aNbPol && aPS.More(); ++aPolIter, aPS.Next()) + { + const Handle(Poly_Polygon3D)& aPoly = myPolygons3D.FindKey (aPolIter); + BinTools::PutInteger(OS, aPoly->NbNodes()); + BinTools::PutBool(OS, aPoly->HasParameters()); + + // write the deflection + BinTools::PutReal(OS, aPoly->Deflection()); + + // write the nodes + const Standard_Integer aNbNodes = aPoly->NbNodes(); + const TColgp_Array1OfPnt& aNodes = aPoly->Nodes(); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNbNodes; ++aNodeIter) + { + const gp_Pnt& aPnt = aNodes.Value (aNodeIter); + BinTools::PutReal(OS, aPnt.X()); + BinTools::PutReal(OS, aPnt.Y()); + BinTools::PutReal(OS, aPnt.Z()); + } + if (aPoly->HasParameters()) + { + const TColStd_Array1OfReal& aParam = aPoly->Parameters(); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNbNodes; ++aNodeIter) + { + BinTools::PutReal(OS, aParam.Value (aNodeIter)); + } } } } - catch(Standard_Failure const& anException) { + catch (Standard_Failure const& anException) + { Standard_SStream aMsg; - aMsg << "EXCEPTION in BinTools_ShapeSet::WritePolygon3D(..)" << std::endl; - aMsg << anException << std::endl; + aMsg << "EXCEPTION in BinTools_ShapeSet::WritePolygon3D(..)\n" << anException << "\n"; throw Standard_Failure(aMsg.str().c_str()); } } //======================================================================= //function : ReadPolygon3D -//purpose : +//purpose : //======================================================================= - -void BinTools_ShapeSet::ReadPolygon3D(Standard_IStream& IS) +void BinTools_ShapeSet::ReadPolygon3D (Standard_IStream& IS, + const Message_ProgressRange& theRange) { - char buffer[255]; - Standard_Integer i, j, p, nbpol=0, nbnodes =0; - Standard_Boolean hasparameters = Standard_False; - Standard_Real d, x, y, z; - IS >> buffer; + char aHeader[255]; + IS >> aHeader; - if (IS.fail() || strstr(buffer,"Polygon3D") == NULL) { + if (IS.fail() || strstr(aHeader,"Polygon3D") == NULL) + { #ifdef OCCT_DEBUG - std::cout <<"Buffer: " << buffer << std::endl; + std::cout <<"Buffer: " << aHeader << std::endl; #endif throw Standard_Failure("BinTools_ShapeSet::ReadPolygon3D: Not a Polygon3D section"); } - Handle(Poly_Polygon3D) P; - IS >> nbpol; - IS.get();//remove LF - try { + Standard_Integer aNbPol = 0; + IS >> aNbPol; + IS.get();//remove LF + try + { OCC_CATCH_SIGNALS - for (i=1; i<=nbpol; i++) { - BinTools::GetInteger(IS, nbnodes); - BinTools::GetBool(IS, hasparameters); - TColgp_Array1OfPnt Nodes(1, nbnodes); - BinTools::GetReal(IS, d); - for (j = 1; j <= nbnodes; j++) { - BinTools::GetReal(IS, x); - BinTools::GetReal(IS, y); - BinTools::GetReal(IS, z); - Nodes(j).SetCoord(x,y,z); - } - if (hasparameters) { - TColStd_Array1OfReal Param(1,nbnodes); - for (p = 1; p <= nbnodes; p++) - BinTools::GetReal(IS, Param(p)); - - P = new Poly_Polygon3D(Nodes, Param); - } - else P = new Poly_Polygon3D(Nodes); - P->Deflection(d); - myPolygons3D.Add(P); + Message_ProgressScope aPS(theRange, "Reading polygones 3D", aNbPol); + for (Standard_Integer aPolIter = 1; aPolIter <= aNbPol && aPS.More(); ++aPolIter, aPS.Next()) + { + Standard_Integer aNbNodes = 0; + Standard_Boolean hasParameters = Standard_False; + Standard_Real aDefl = 0.0; + BinTools::GetInteger(IS, aNbNodes); + BinTools::GetBool(IS, hasParameters); + BinTools::GetReal(IS, aDefl); + + Handle(Poly_Polygon3D) aPoly = new Poly_Polygon3D (aNbNodes, hasParameters); + aPoly->Deflection (aDefl); + + TColgp_Array1OfPnt& aNodes = aPoly->ChangeNodes(); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNbNodes; ++aNodeIter) + { + gp_XYZ& aPnt = aNodes.ChangeValue (aNodeIter).ChangeCoord(); + BinTools::GetReal(IS, aPnt.ChangeCoord (1)); + BinTools::GetReal(IS, aPnt.ChangeCoord (2)); + BinTools::GetReal(IS, aPnt.ChangeCoord (3)); + } + if (hasParameters) + { + TColStd_Array1OfReal& aParam = aPoly->ChangeParameters(); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNbNodes; ++aNodeIter) + { + BinTools::GetReal(IS, aParam.ChangeValue (aNodeIter)); + } + } + + myPolygons3D.Add (aPoly); } } - catch(Standard_Failure const& anException) { + catch (Standard_Failure const& anException) + { Standard_SStream aMsg; - aMsg << "EXCEPTION in BinTools_ShapeSet::ReadPolygon3D(..)" << std::endl; - aMsg << anException << std::endl; + aMsg << "EXCEPTION in BinTools_ShapeSet::ReadPolygon3D(..)\n" << anException << "\n"; throw Standard_Failure(aMsg.str().c_str()); } } @@ -1380,125 +1431,138 @@ //======================================================================= //function : WriteTriangulation -//purpose : +//purpose : //======================================================================= - -void BinTools_ShapeSet::WriteTriangulation(Standard_OStream& OS) const +void BinTools_ShapeSet::WriteTriangulation (Standard_OStream& OS, + const Message_ProgressRange& theRange) const { - Standard_Integer i, j, nbNodes, nbtri = myTriangulations.Extent(); - Standard_Integer nbTriangles = 0, n1, n2, n3; - OS << "Triangulations " << nbtri << "\n"; - Handle(Poly_Triangulation) T; - try { + const Standard_Integer aNbTriangulations = myTriangulations.Extent(); + OS << "Triangulations " << aNbTriangulations << "\n"; + + try + { OCC_CATCH_SIGNALS - for (i = 1; i <= nbtri; i++) { - T = Handle(Poly_Triangulation)::DownCast(myTriangulations(i)); - BinTools::PutInteger(OS, T->NbNodes()); - BinTools::PutInteger(OS, T->NbTriangles()); - BinTools::PutBool(OS, T->HasUVNodes()? 1:0); - // write the deflection - BinTools::PutReal(OS, T->Deflection()); - - // write the 3d nodes - nbNodes = T->NbNodes(); - const TColgp_Array1OfPnt& Nodes = T->Nodes(); - for (j = 1; j <= nbNodes; j++) { - BinTools::PutReal(OS, Nodes(j).X()); - BinTools::PutReal(OS, Nodes(j).Y()); - BinTools::PutReal(OS, Nodes(j).Z()); + Message_ProgressScope aPS(theRange, "Writing triangulation", aNbTriangulations); + for (Standard_Integer aTriangulationIter = 1; aTriangulationIter <= aNbTriangulations && aPS.More(); ++aTriangulationIter, aPS.Next()) + { + const Handle(Poly_Triangulation)& aTriangulation = myTriangulations.FindKey (aTriangulationIter); + const Standard_Integer aNbNodes = aTriangulation->NbNodes(); + const Standard_Integer aNbTriangles = aTriangulation->NbTriangles(); + BinTools::PutInteger(OS, aNbNodes); + BinTools::PutInteger(OS, aNbTriangles); + BinTools::PutBool(OS, aTriangulation->HasUVNodes() ? 1 : 0); + BinTools::PutReal(OS, aTriangulation->Deflection()); + + // write the 3d nodes + const TColgp_Array1OfPnt& aNodes = aTriangulation->Nodes(); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNbNodes; ++aNodeIter) + { + const gp_Pnt& aPnt = aNodes.Value (aNodeIter); + BinTools::PutReal(OS, aPnt.X()); + BinTools::PutReal(OS, aPnt.Y()); + BinTools::PutReal(OS, aPnt.Z()); } - - if (T->HasUVNodes()) { - const TColgp_Array1OfPnt2d& UVNodes = T->UVNodes(); - for (j = 1; j <= nbNodes; j++) { - BinTools::PutReal(OS, UVNodes(j).X()); - BinTools::PutReal(OS, UVNodes(j).Y()); - } + + if (aTriangulation->HasUVNodes()) + { + const TColgp_Array1OfPnt2d& aUVNodes = aTriangulation->UVNodes(); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNbNodes; ++aNodeIter) + { + const gp_Pnt2d aUV = aUVNodes.Value (aNodeIter); + BinTools::PutReal(OS, aUV.X()); + BinTools::PutReal(OS, aUV.Y()); + } } - nbTriangles = T->NbTriangles(); - const Poly_Array1OfTriangle& Triangles = T->Triangles(); - for (j = 1; j <= nbTriangles; j++) { - Triangles(j).Get(n1, n2, n3); - BinTools::PutInteger(OS, n1); - BinTools::PutInteger(OS, n2); - BinTools::PutInteger(OS, n3); + + const Poly_Array1OfTriangle& aTriangles = aTriangulation->Triangles(); + for (Standard_Integer aTriIter = 1; aTriIter <= aNbTriangles; ++aTriIter) + { + const Poly_Triangle& aTri = aTriangles.Value (aTriIter); + BinTools::PutInteger(OS, aTri.Value (1)); + BinTools::PutInteger(OS, aTri.Value (2)); + BinTools::PutInteger(OS, aTri.Value (3)); } } } - catch(Standard_Failure const& anException) { + catch (Standard_Failure const& anException) + { Standard_SStream aMsg; - aMsg << "EXCEPTION in BinTools_ShapeSet::WriteTriangulation(..)" << std::endl; - aMsg << anException << std::endl; + aMsg << "EXCEPTION in BinTools_ShapeSet::WriteTriangulation(..)\n" << anException << "\n"; throw Standard_Failure(aMsg.str().c_str()); } } //======================================================================= //function : ReadTriangulation -//purpose : +//purpose : //======================================================================= - -void BinTools_ShapeSet::ReadTriangulation(Standard_IStream& IS) +void BinTools_ShapeSet::ReadTriangulation (Standard_IStream& IS, + const Message_ProgressRange& theRange) { - char buffer[255]; - Standard_Integer i, j, nbtri =0; - Standard_Real d, x, y, z; - Standard_Integer nbNodes =0, nbTriangles=0; - Standard_Boolean hasUV = Standard_False; - - Handle(Poly_Triangulation) T; - IS >> buffer; - - if (IS.fail() || (strstr(buffer,"Triangulations") == NULL)) { + char aHeader[255]; + IS >> aHeader; + if (IS.fail() || (strstr(aHeader, "Triangulations") == NULL)) + { throw Standard_Failure("BinTools_ShapeSet::Triangulation: Not a Triangulation section"); } - IS >> nbtri; + + Standard_Integer aNbTriangulations = 0; + IS >> aNbTriangulations; IS.get();// remove LF - try { + try + { OCC_CATCH_SIGNALS - for (i=1; i<=nbtri; i++) { - BinTools::GetInteger(IS, nbNodes); - BinTools::GetInteger(IS, nbTriangles); - TColgp_Array1OfPnt Nodes(1, nbNodes); + Message_ProgressScope aPS(theRange, "Reading triangulation", aNbTriangulations); + for (Standard_Integer aTriangulationIter = 1; aTriangulationIter <= aNbTriangulations && aPS.More(); ++aTriangulationIter, aPS.Next()) + { + Standard_Integer aNbNodes = 0, aNbTriangles = 0; + Standard_Boolean hasUV = Standard_False; + Standard_Real aDefl = 0.0; + BinTools::GetInteger(IS, aNbNodes); + BinTools::GetInteger(IS, aNbTriangles); BinTools::GetBool(IS, hasUV); - TColgp_Array1OfPnt2d UVNodes(1, nbNodes); - BinTools::GetReal(IS, d); //deflection - for (j = 1; j <= nbNodes; j++) { - BinTools::GetReal(IS, x); - BinTools::GetReal(IS, y); - BinTools::GetReal(IS, z); - Nodes(j).SetCoord(x,y,z); + BinTools::GetReal(IS, aDefl); //deflection + Handle(Poly_Triangulation) aTriangulation = new Poly_Triangulation (aNbNodes, aNbTriangles, hasUV); + aTriangulation->Deflection (aDefl); + + TColgp_Array1OfPnt& aNodes = aTriangulation->ChangeNodes(); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNbNodes; ++aNodeIter) + { + Standard_Real* anXYZ = aNodes.ChangeValue (aNodeIter).ChangeCoord().ChangeData(); + BinTools::GetReal(IS, anXYZ[0]); + BinTools::GetReal(IS, anXYZ[1]); + BinTools::GetReal(IS, anXYZ[2]); } - - if (hasUV) { - for (j = 1; j <= nbNodes; j++) { - BinTools::GetReal(IS, x); - BinTools::GetReal(IS, y); - UVNodes(j).SetCoord(x,y); - } + + if (hasUV) + { + TColgp_Array1OfPnt2d& aUVNodes = aTriangulation->ChangeUVNodes(); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aNbNodes; ++aNodeIter) + { + gp_XY& anUV = aUVNodes.ChangeValue (aNodeIter).ChangeCoord(); + BinTools::GetReal(IS, anUV.ChangeCoord (1)); + BinTools::GetReal(IS, anUV.ChangeCoord (2)); + } } - + // read the triangles - Standard_Integer n1,n2,n3; - Poly_Array1OfTriangle Triangles(1, nbTriangles); - for (j = 1; j <= nbTriangles; j++) { - BinTools::GetInteger(IS, n1); - BinTools::GetInteger(IS, n2); - BinTools::GetInteger(IS, n3); - Triangles(j).Set(n1,n2,n3); + Poly_Array1OfTriangle& aTriangles = aTriangulation->ChangeTriangles(); + for (Standard_Integer aTriIter = 1; aTriIter <= aNbTriangles; ++aTriIter) + { + Poly_Triangle& aTri = aTriangles.ChangeValue (aTriIter); + BinTools::GetInteger(IS, aTri.ChangeValue (1)); + BinTools::GetInteger(IS, aTri.ChangeValue (2)); + BinTools::GetInteger(IS, aTri.ChangeValue (3)); } - - if (hasUV) T = new Poly_Triangulation(Nodes,UVNodes,Triangles); - else T = new Poly_Triangulation(Nodes,Triangles); - T->Deflection(d); - myTriangulations.Add(T); + + myTriangulations.Add (aTriangulation); } } - catch(Standard_Failure const& anException) { + catch (Standard_Failure const& anException) + { Standard_SStream aMsg; - aMsg << "EXCEPTION in BinTools_ShapeSet::ReadTriangulation(..)" << std::endl; - aMsg << anException << std::endl; + aMsg << "EXCEPTION in BinTools_ShapeSet::ReadTriangulation(..)\n" << anException << "\n"; throw Standard_Failure(aMsg.str().c_str()); } } diff -Nru opencascade-7.4.1+dfsg1/src/BinTools/BinTools_ShapeSet.hxx opencascade-7.5.1+dfsg1/src/BinTools/BinTools_ShapeSet.hxx --- opencascade-7.4.1+dfsg1/src/BinTools/BinTools_ShapeSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinTools/BinTools_ShapeSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,6 +32,7 @@ #include #include #include + class TopoDS_Shape; class BinTools_LocationSet; @@ -98,7 +99,9 @@ //! Write the type. //! calls WriteGeometry(S). //! Write the flags, the subshapes. - Standard_EXPORT virtual void Write (Standard_OStream& OS) const; + Standard_EXPORT virtual void Write + (Standard_OStream& OS, + const Message_ProgressRange& theRange = Message_ProgressRange()) const; //! Reads the content of me from the binary stream . me //! is first cleared. @@ -112,7 +115,9 @@ //! Reads the type. //! calls ReadGeometry(T,S). //! Reads the flag, the subshapes. - Standard_EXPORT virtual void Read (Standard_IStream& IS); + Standard_EXPORT virtual void Read + (Standard_IStream& IS, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Writes on the shape . Writes the //! orientation, the index of the TShape and the index @@ -121,14 +126,20 @@ //! Writes the geometry of me on the stream in a //! binary format that can be read back by Read. - Standard_EXPORT virtual void WriteGeometry (Standard_OStream& OS) const; + Standard_EXPORT virtual void WriteGeometry + (Standard_OStream& OS, + const Message_ProgressRange& theRange = Message_ProgressRange()) const; //! Reads the geometry of me from the stream . - Standard_EXPORT virtual void ReadGeometry (Standard_IStream& IS); + Standard_EXPORT virtual void ReadGeometry + (Standard_IStream& IS, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Reads from a shape and returns it in S. //! is the number of tshapes in the set. - Standard_EXPORT virtual void Read (TopoDS_Shape& S, Standard_IStream& IS, const Standard_Integer NbShapes) const; + Standard_EXPORT virtual void Read + (TopoDS_Shape& S, + Standard_IStream& IS, const Standard_Integer NbShapes) const; //! Writes the geometry of on the stream in a //! binary format that can be read back by Read. @@ -146,44 +157,45 @@ //! Reads the 3d polygons of me //! from the stream . - Standard_EXPORT void ReadPolygon3D (Standard_IStream& IS); + Standard_EXPORT void ReadPolygon3D + (Standard_IStream& IS, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Writes the 3d polygons //! on the stream in a format that can //! be read back by Read. - Standard_EXPORT void WritePolygon3D (Standard_OStream& OS) const; + Standard_EXPORT void WritePolygon3D + (Standard_OStream& OS, + const Message_ProgressRange& theRange = Message_ProgressRange()) const; //! Reads the triangulation of me //! from the stream . - Standard_EXPORT void ReadTriangulation (Standard_IStream& IS); + Standard_EXPORT void ReadTriangulation + (Standard_IStream& IS, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Writes the triangulation //! on the stream in a format that can //! be read back by Read. - Standard_EXPORT void WriteTriangulation (Standard_OStream& OS) const; + Standard_EXPORT void WriteTriangulation + (Standard_OStream& OS, + const Message_ProgressRange& theRange = Message_ProgressRange()) const; //! Reads the polygons on triangulation of me //! from the stream . - Standard_EXPORT void ReadPolygonOnTriangulation (Standard_IStream& IS); + Standard_EXPORT void ReadPolygonOnTriangulation + (Standard_IStream& IS, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Writes the polygons on triangulation //! on the stream in a format that can //! be read back by Read. - Standard_EXPORT void WritePolygonOnTriangulation (Standard_OStream& OS) const; - - - - -protected: - - - - + Standard_EXPORT void WritePolygonOnTriangulation + (Standard_OStream& OS, + const Message_ProgressRange& theRange = Message_ProgressRange()) const; private: - - TopTools_IndexedMapOfShape myShapes; BinTools_LocationSet myLocations; Standard_Integer myFormatNb; @@ -191,19 +203,12 @@ BinTools_SurfaceSet mySurfaces; BinTools_CurveSet myCurves; BinTools_Curve2dSet myCurves2d; - TColStd_IndexedMapOfTransient myPolygons2D; - TColStd_IndexedMapOfTransient myPolygons3D; - TColStd_IndexedMapOfTransient myTriangulations; - TColStd_IndexedMapOfTransient myNodes; + NCollection_IndexedMap myPolygons2D; + NCollection_IndexedMap myPolygons3D; + NCollection_IndexedMap myTriangulations; + NCollection_IndexedMap myNodes; Standard_Boolean myWithTriangles; - }; - - - - - - #endif // _BinTools_ShapeSet_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BinTools/BinTools_SurfaceSet.cxx opencascade-7.5.1+dfsg1/src/BinTools/BinTools_SurfaceSet.cxx --- opencascade-7.4.1+dfsg1/src/BinTools/BinTools_SurfaceSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinTools/BinTools_SurfaceSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,6 +42,7 @@ #include #include #include +#include #define PLANE 1 #define CYLINDER 2 @@ -436,12 +437,14 @@ //purpose : //======================================================================= -void BinTools_SurfaceSet::Write(Standard_OStream& OS)const +void BinTools_SurfaceSet::Write (Standard_OStream& OS, + const Message_ProgressRange& theRange)const { Standard_Integer i, nbsurf = myMap.Extent(); + Message_ProgressScope aPS(theRange, "Writing surfases", nbsurf); OS << "Surfaces "<< nbsurf << "\n"; - for (i = 1; i <= nbsurf; i++) { + for (i = 1; i <= nbsurf && aPS.More(); i++, aPS.Next()) { WriteSurface(Handle(Geom_Surface)::DownCast(myMap(i)),OS); } @@ -873,7 +876,8 @@ //purpose : //======================================================================= -void BinTools_SurfaceSet::Read(Standard_IStream& IS) +void BinTools_SurfaceSet::Read (Standard_IStream& IS, + const Message_ProgressRange& theRange) { char buffer[255]; IS >> buffer; @@ -890,10 +894,10 @@ Handle(Geom_Surface) S; Standard_Integer i, nbsurf; IS >> nbsurf; + Message_ProgressScope aPS(theRange, "Reading surfaces", nbsurf); IS.get ();//remove - for (i = 1; i <= nbsurf; i++) { + for (i = 1; i <= nbsurf && aPS.More(); i++, aPS.Next()) { BinTools_SurfaceSet::ReadSurface(IS,S); myMap.Add(S); } } - diff -Nru opencascade-7.4.1+dfsg1/src/BinTools/BinTools_SurfaceSet.hxx opencascade-7.5.1+dfsg1/src/BinTools/BinTools_SurfaceSet.hxx --- opencascade-7.4.1+dfsg1/src/BinTools/BinTools_SurfaceSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BinTools/BinTools_SurfaceSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,9 @@ #include #include #include + +#include + class Standard_OutOfRange; class Geom_Surface; @@ -54,11 +57,13 @@ //! Writes the content of me on the stream in //! binary format that can be read back by Read. - Standard_EXPORT void Write (Standard_OStream& OS) const; + Standard_EXPORT void Write (Standard_OStream& OS, + const Message_ProgressRange& theRange = Message_ProgressRange()) const; //! Reads the content of me from the stream . me //! is first cleared. - Standard_EXPORT void Read (Standard_IStream& IS); + Standard_EXPORT void Read (Standard_IStream& IS, + const Message_ProgressRange& therange = Message_ProgressRange()); //! Dumps the surface on the stream in binary //! format that can be read back. @@ -69,28 +74,10 @@ //! method. Standard_EXPORT static Standard_IStream& ReadSurface (Standard_IStream& IS, Handle(Geom_Surface)& S); - - - -protected: - - - - - private: - - TColStd_IndexedMapOfTransient myMap; - }; - - - - - - #endif // _BinTools_SurfaceSet_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Bisector/Bisector_BisecCC.cxx opencascade-7.5.1+dfsg1/src/Bisector/Bisector_BisecCC.cxx --- opencascade-7.4.1+dfsg1/src/Bisector/Bisector_BisecCC.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bisector/Bisector_BisecCC.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -77,9 +77,17 @@ //purpose : //============================================================================= Bisector_BisecCC::Bisector_BisecCC() +: sign1(0.0), + sign2(0.0), + currentInterval(0), + shiftParameter(0.0), + distMax(0.0), + isEmpty(Standard_True), + isConvex1(Standard_False), + isConvex2(Standard_False), + extensionStart(Standard_False), + extensionEnd(Standard_False) { - shiftParameter = 0; - isEmpty = Standard_False; } //============================================================================= @@ -558,7 +566,7 @@ gp_Vec2d D1,D2; gp_Pnt2d P; C->D2(U,P,D1,D2); - Standard_Real Norm2 = D1.SquareMagnitude();; + Standard_Real Norm2 = D1.SquareMagnitude(); if (Norm2 < Tol) { K1 = 0.0; } diff -Nru opencascade-7.4.1+dfsg1/src/Bisector/Bisector_Bisec.cxx opencascade-7.5.1+dfsg1/src/Bisector/Bisector_Bisec.cxx --- opencascade-7.4.1+dfsg1/src/Bisector/Bisector_Bisec.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bisector/Bisector_Bisec.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -677,12 +677,12 @@ Standard_Real Norm2; C->D2(US,P,D1,D2); - Norm2 = D1.SquareMagnitude();; + Norm2 = D1.SquareMagnitude(); if (Norm2 < gp::Resolution()) { KF = 0.0;} else { KF = Abs(D1^D2)/(Norm2*sqrt(Norm2));} C->D2(UL,P,D1,D2); - Norm2 = D1.SquareMagnitude();; + Norm2 = D1.SquareMagnitude(); if (Norm2 < gp::Resolution()) { KL = 0.0;} else { KL = Abs(D1^D2)/(Norm2*sqrt(Norm2));} diff -Nru opencascade-7.4.1+dfsg1/src/Bisector/Bisector_BisecPC.cxx opencascade-7.5.1+dfsg1/src/Bisector/Bisector_BisecPC.cxx --- opencascade-7.4.1+dfsg1/src/Bisector/Bisector_BisecPC.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bisector/Bisector_BisecPC.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,6 +51,15 @@ // purpose : //============================================================================= Bisector_BisecPC::Bisector_BisecPC() +: sign(0.0), + bisInterval(0), + currentInterval(0), + shiftParameter(0.0), + distMax(0.0), + isEmpty(Standard_True), + isConvex(Standard_False), + extensionStart(Standard_False), + extensionEnd(Standard_False) { } @@ -452,7 +461,7 @@ gp_Vec2d D1,D2; gp_Pnt2d P; C->D2(U,P,D1,D2); - Standard_Real Norm2 = D1.SquareMagnitude();; + Standard_Real Norm2 = D1.SquareMagnitude(); if (Norm2 < Tol) { K1 = 0.0; } diff -Nru opencascade-7.4.1+dfsg1/src/Bisector/Bisector_PointOnBis.cxx opencascade-7.5.1+dfsg1/src/Bisector/Bisector_PointOnBis.cxx --- opencascade-7.4.1+dfsg1/src/Bisector/Bisector_PointOnBis.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bisector/Bisector_PointOnBis.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,11 @@ // purpose : //============================================================================= Bisector_PointOnBis::Bisector_PointOnBis() +: param1(0.0), + param2(0.0), + paramBis(0.0), + distance(0.0), + infinite(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/BiTgte/BiTgte_Blend.cxx opencascade-7.5.1+dfsg1/src/BiTgte/BiTgte_Blend.cxx --- opencascade-7.4.1+dfsg1/src/BiTgte/BiTgte_Blend.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BiTgte/BiTgte_Blend.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1192,35 +1192,42 @@ } BiTgte_ContactType Type = BiTgte_VertexVertex; - switch (Type1) { - - case TopAbs_VERTEX: - switch (Type2) { - case TopAbs_VERTEX: Type = BiTgte_VertexVertex; break; - case TopAbs_EDGE: Type = BiTgte_EdgeVertex; break; - case TopAbs_FACE: Type = BiTgte_FaceVertex; break; - default: + switch (Type1) + { + case TopAbs_VERTEX: + switch (Type2) + { + case TopAbs_VERTEX: Type = BiTgte_VertexVertex; break; + case TopAbs_EDGE: Type = BiTgte_EdgeVertex; break; + case TopAbs_FACE: Type = BiTgte_FaceVertex; break; + default: + break; + } break; - } - - case TopAbs_EDGE: - switch (Type2) { - case TopAbs_EDGE: Type = BiTgte_EdgeEdge; break; - case TopAbs_FACE: Type = BiTgte_FaceEdge; break; - default: + + case TopAbs_EDGE: + switch (Type2) + { + case TopAbs_EDGE: Type = BiTgte_EdgeEdge; break; + case TopAbs_FACE: Type = BiTgte_FaceEdge; break; + default: + break; + } break; - } - - case TopAbs_FACE: - switch (Type2) { - case TopAbs_FACE: Type = BiTgte_FaceEdge; break; + + case TopAbs_FACE: + switch (Type2) + { + case TopAbs_FACE: Type = BiTgte_FaceEdge; break; + default: + break; + } + break; + default: break; - } - default: - break; } - + return Type; } @@ -1573,7 +1580,7 @@ // ------------------------------------ TopTools_ListOfShape Let; if ( AS.ShapeType() == TopAbs_FACE) { - myAnalyse.Edges(TopoDS::Face(AS),BRepOffset_Tangent,Let); + myAnalyse.Edges(TopoDS::Face(AS),ChFiDS_Tangential,Let); } TopTools_ListIteratorOfListOfShape itlet(Let); @@ -1589,14 +1596,14 @@ TopExp::Vertices (OTE,OV1,OV2); TopTools_ListOfShape LE; if (!EdgeTgt.IsBound(V1)) { - myAnalyse.Edges(V1,BRepOffset_Tangent,LE); + myAnalyse.Edges(V1,ChFiDS_Tangential,LE); const TopTools_ListOfShape& LA = myAnalyse.Ancestors(V1); if (LE.Extent() == LA.Extent()) EdgeTgt.Bind(V1,OV1); } if (!EdgeTgt.IsBound(V2)) { LE.Clear(); - myAnalyse.Edges(V2,BRepOffset_Tangent,LE); + myAnalyse.Edges(V2,ChFiDS_Tangential,LE); const TopTools_ListOfShape& LA = myAnalyse.Ancestors(V2); if (LE.Extent() == LA.Extent()) EdgeTgt.Bind(V2,OV2); @@ -1637,8 +1644,8 @@ //-------------------------------------------------------- // Construction of tubes on edge. //-------------------------------------------------------- - BRepOffset_Type OT = BRepOffset_Convex; - if (myRadius < 0.) OT = BRepOffset_Concave; + ChFiDS_TypeOfConcavity OT = ChFiDS_Convex; + if (myRadius < 0.) OT = ChFiDS_Concave; TopTools_IndexedDataMapOfShapeListOfShape Map; TopExp::MapShapesAndAncestors(Co,TopAbs_EDGE,TopAbs_FACE,Map); @@ -1724,8 +1731,8 @@ // Proceed with MakeLoops TopTools_IndexedDataMapOfShapeListOfShape aDMVV; - BRepOffset_Type OT = BRepOffset_Concave; - if (myRadius < 0.) OT = BRepOffset_Convex; + ChFiDS_TypeOfConcavity OT = ChFiDS_Concave; + if (myRadius < 0.) OT = ChFiDS_Convex; TopTools_ListOfShape LOF; //it.Initialize(myFaces); @@ -1773,10 +1780,12 @@ } } } + TopTools_DataMapOfShapeListOfShape anEmptyMap; BRepOffset_Inter2d::Compute(myAsDes, CurOF, myEdges, myTol, + anEmptyMap, aDMVV); } } @@ -1806,20 +1815,23 @@ myAsDes->Add(CurOF,CurOE); } + TopTools_DataMapOfShapeListOfShape anEmptyMap; BRepOffset_Inter2d::Compute(myAsDes, CurOF, myEdges, myTol, + anEmptyMap, aDMVV); } // // fuse vertices on edges stored in AsDes - BRepOffset_Inter2d::FuseVertices(aDMVV, myAsDes); + BRepAlgo_Image anEmptyImage; + BRepOffset_Inter2d::FuseVertices(aDMVV, myAsDes, anEmptyImage); // ------------ // unwinding // ------------ BRepOffset_MakeLoops MakeLoops; - MakeLoops.Build( LOF, myAsDes, myImageOffset ); + MakeLoops.Build (LOF, myAsDes, myImageOffset, anEmptyImage); // ------------------------------------------------------------ // It is possible to unwind edges at least one ancestor which of @@ -2209,7 +2221,7 @@ if (OF2isEdge) { // Update CutEdges. exp.Next(); const TopoDS_Edge& EOnF2 = TopoDS::Edge(exp.Current()); - TopExp::Vertices(EOnF2,V1,V2);; + TopExp::Vertices(EOnF2,V1,V2); gp_Pnt P1 = BRep_Tool::Pnt(V1); Projector.Init(P1,GC2); diff -Nru opencascade-7.4.1+dfsg1/src/Blend/Blend_Walking_4.gxx opencascade-7.5.1+dfsg1/src/Blend/Blend_Walking_4.gxx --- opencascade-7.4.1+dfsg1/src/Blend/Blend_Walking_4.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Blend/Blend_Walking_4.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -730,7 +730,7 @@ previousP.Parameter(),tolesp); Ext2.SetValue(previousP.PointOnS2(), sol(3),sol(4), - previousP.Parameter(),tolesp);; + previousP.Parameter(),tolesp); if (!previousP.IsTangencyPoint()) { Ext1.SetTangent(previousP.TangentOnS1()); Ext2.SetTangent(previousP.TangentOnS2()); diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ChAsym.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ChAsym.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ChAsym.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ChAsym.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,9 +40,14 @@ const Handle(Adaptor3d_HCurve)& C) : surf1(S1),surf2(S2), curv(C), tcurv(C), + param(0), + dist1(RealLast()), + angle(RealLast()), + tgang(RealLast()), FX(1, 4), DX(1, 4, 1, 4), istangent(Standard_True), + choix(0), distmin(RealLast()) { } diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ChAsymInv.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ChAsymInv.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ChAsymInv.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ChAsymInv.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,12 @@ BlendFunc_ChAsymInv::BlendFunc_ChAsymInv(const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_HCurve)& C) : - surf1(S1),surf2(S2),curv(C), + surf1(S1),surf2(S2), + dist1(RealLast()), + angle(RealLast()), + tgang(RealLast()), + curv(C), choix(0), + first(Standard_False), FX(1, 4), DX(1, 4, 1, 4) { diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ConstRad.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ConstRad.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ConstRad.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ConstRad.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,22 +51,24 @@ const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_HCurve)& C) : - surf1(S1),surf2(S2), - curv(C), tcurv(C), - istangent(Standard_True), - xval(1,4), - E(1,4), DEDX(1,4,1,4), DEDT(1,4), - D2EDX2(4,4,4), - D2EDXDT(1,4,1,4), D2EDT2(1,4), - maxang(RealFirst()), minang(RealLast()), - distmin(RealLast()), - mySShape(BlendFunc_Rational) + surf1(S1),surf2(S2), + curv(C), tcurv(C), + istangent(Standard_True), param(0.0), + ray1(0.0), ray2(0.0), + choix(0), xval(1, 4), + E(1,4), DEDX(1,4,1,4), DEDT(1,4), + D2EDX2(4,4,4), + D2EDXDT(1,4,1,4), D2EDT2(1,4), + maxang(RealFirst()), minang(RealLast()), + distmin(RealLast()), + mySShape(BlendFunc_Rational) { // Initialisaton of cash control variables. tval = -9.876e100; xval.Init(-9.876e100); myXOrder = -1; myTOrder = -1; + myTConv = Convert_TgtThetaOver2; } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ConstRadInv.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ConstRadInv.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ConstRadInv.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ConstRadInv.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,9 +28,16 @@ BlendFunc_ConstRadInv::BlendFunc_ConstRadInv(const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, - const Handle(Adaptor3d_HCurve)& C): - surf1(S1),surf2(S2),curv(C) -{} + const Handle(Adaptor3d_HCurve)& C) +: surf1(S1), + surf2(S2), + curv(C), + ray1(0.0), + ray2(0.0), + choix(0), + first(Standard_False) +{ +} void BlendFunc_ConstRadInv::Set(const Standard_Real R, const Standard_Integer Choix) diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroat.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroat.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroat.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroat.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,12 @@ BlendFunc_ConstThroat::BlendFunc_ConstThroat(const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_HCurve)& C) - : BlendFunc_GenChamfer(S1,S2,C) +: BlendFunc_GenChamfer(S1,S2,C), + istangent(Standard_False), + param(0.0), + Throat(0.0), + normtg(0.0), + theD(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroatInv.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroatInv.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroatInv.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroatInv.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,13 @@ BlendFunc_ConstThroatInv::BlendFunc_ConstThroatInv(const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_HCurve)& C) - : BlendFunc_GenChamfInv(S1,S2,C) +: BlendFunc_GenChamfInv(S1,S2,C), + Throat(0.0), + param(0.0), + sign1(0.0), + sign2(0.0), + normtg(0.0), + theD(0.0) { } @@ -99,7 +105,7 @@ Abs(valsol(4)) <= Tol*Tol) return Standard_True; - return Standard_False;; + return Standard_False; } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroatWithPenetrationInv.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroatWithPenetrationInv.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroatWithPenetrationInv.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_ConstThroatWithPenetrationInv.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -52,7 +52,7 @@ Abs(valsol(4)) <= Tol) return Standard_True; - return Standard_False;; + return Standard_False; } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_Corde.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_Corde.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_Corde.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_Corde.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,13 @@ //purpose : //======================================================================= BlendFunc_Corde::BlendFunc_Corde(const Handle(Adaptor3d_HSurface)& S, - const Handle(Adaptor3d_HCurve)& CG) : - surf(S),guide(CG) + const Handle(Adaptor3d_HCurve)& CG) +: surf(S), + guide(CG), + dis(0.0), + normtg(0.0), + theD(0.0), + istangent(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_CSCircular.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_CSCircular.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_CSCircular.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_CSCircular.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -901,12 +901,12 @@ { gp_Vec d1u1,d1v1,d2u1,d2v1,d2uv1,d1,d2; gp_Vec ns,ns2,dnplan,dnw,dn2w; //,np2,dnp2; - gp_Vec ncrossns;; + gp_Vec ncrossns; gp_Vec resulu,resulv,temp,tgct,resul; gp_Pnt Center; - Standard_Real norm,ndotns,grosterme;; + Standard_Real norm,ndotns,grosterme; math_Vector sol(1,2),valsol(1,2),secmember(1,2); math_Matrix gradsol(1,2,1,2); diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_CSConstRad.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_CSConstRad.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_CSConstRad.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_CSConstRad.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,9 +44,14 @@ const Handle(Adaptor3d_HCurve)& C, const Handle(Adaptor3d_HCurve)& CG) : - surf(S),curv(C),guide(CG),istangent(Standard_True), - maxang(RealFirst()), minang(RealLast()),mySShape(BlendFunc_Rational) -{} + surf(S),curv(C),guide(CG), prmc(0.0), + istangent(Standard_True), ray(0.0), + choix(0), normtg(0.0), theD(0.0), + maxang(RealFirst()), minang(RealLast()), + mySShape(BlendFunc_Rational) +{ + myTConv = Convert_TgtThetaOver2; +} //======================================================================= @@ -875,7 +880,7 @@ gp_Vec d1u1,d1v1,d2u1,d2v1,d2uv1,d1; gp_Vec ns,ns2,dnplan,dnw,dn2w; //,np2,dnp2; - gp_Vec ncrossns;; + gp_Vec ncrossns; gp_Vec resulu,resulv,temp,tgct,resul; gp_Pnt Center; diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_GenChamfer.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_GenChamfer.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_GenChamfer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_GenChamfer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,12 @@ BlendFunc_GenChamfer::BlendFunc_GenChamfer(const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_HCurve)& CG) - : surf1(S1),surf2(S2),curv(CG), - distmin(RealLast()) +: surf1(S1), + surf2(S2), + curv(CG), + choix(0), + tol(0.0), + distmin(RealLast()) { } diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_GenChamfInv.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_GenChamfInv.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_GenChamfInv.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_GenChamfInv.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,8 +28,12 @@ //======================================================================= BlendFunc_GenChamfInv::BlendFunc_GenChamfInv(const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, - const Handle(Adaptor3d_HCurve)& C) : - surf1(S1),surf2(S2),curv(C) + const Handle(Adaptor3d_HCurve)& C) +: surf1(S1), + surf2(S2), + curv(C), + choix(0), + first(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_Ruled.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_Ruled.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_Ruled.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_Ruled.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,10 +35,12 @@ const Handle(Adaptor3d_HSurface)& S2, const Handle(Adaptor3d_HCurve)& C) : - surf1(S1),surf2(S2),curv(C), - istangent(Standard_True), - distmin(RealLast()) -{} + surf1(S1),surf2(S2),curv(C), + istangent(Standard_True), + normtg(0.0), theD(0.0), + distmin(RealLast()) +{ +} Standard_Integer BlendFunc_Ruled::NbEquations () const { diff -Nru opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_RuledInv.cxx opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_RuledInv.cxx --- opencascade-7.4.1+dfsg1/src/BlendFunc/BlendFunc_RuledInv.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BlendFunc/BlendFunc_RuledInv.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,9 +24,13 @@ BlendFunc_RuledInv::BlendFunc_RuledInv(const Handle(Adaptor3d_HSurface)& S1, const Handle(Adaptor3d_HSurface)& S2, - const Handle(Adaptor3d_HCurve)& C) : - surf1(S1),surf2(S2),curv(C) -{} + const Handle(Adaptor3d_HCurve)& C) +: surf1(S1), + surf2(S2), + curv(C), + first(Standard_False) +{ +} void BlendFunc_RuledInv::Set(const Standard_Boolean OnFirst, const Handle(Adaptor2d_HCurve2d)& C) diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_B2d.hxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_B2d.hxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_B2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_B2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -83,7 +83,7 @@ //! Transform the bounding box with the given transformation. //! The resulting box will be larger if theTrsf contains rotation. - Standard_EXPORT Standard_NODISCARD Bnd_B2d Transformed (const gp_Trsf2d& theTrsf) const; + Standard_NODISCARD Standard_EXPORT Bnd_B2d Transformed (const gp_Trsf2d& theTrsf) const; //! Check the given point for the inclusion in the Box. //! Returns True if the point is outside. diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_B2f.hxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_B2f.hxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_B2f.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_B2f.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -84,7 +84,7 @@ //! Transform the bounding box with the given transformation. //! The resulting box will be larger if theTrsf contains rotation. - Standard_EXPORT Standard_NODISCARD Bnd_B2f Transformed (const gp_Trsf2d& theTrsf) const; + Standard_NODISCARD Standard_EXPORT Bnd_B2f Transformed (const gp_Trsf2d& theTrsf) const; //! Check the given point for the inclusion in the Box. //! Returns True if the point is outside. diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_B3d.hxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_B3d.hxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_B3d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_B3d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -84,7 +84,7 @@ //! Transform the bounding box with the given transformation. //! The resulting box will be larger if theTrsf contains rotation. - Standard_EXPORT Standard_NODISCARD Bnd_B3d Transformed (const gp_Trsf& theTrsf) const; + Standard_NODISCARD Standard_EXPORT Bnd_B3d Transformed (const gp_Trsf& theTrsf) const; //! Check the given point for the inclusion in the Box. //! Returns True if the point is outside. diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_B3f.hxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_B3f.hxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_B3f.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_B3f.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -85,7 +85,7 @@ //! Transform the bounding box with the given transformation. //! The resulting box will be larger if theTrsf contains rotation. - Standard_EXPORT Standard_NODISCARD Bnd_B3f Transformed (const gp_Trsf& theTrsf) const; + Standard_NODISCARD Standard_EXPORT Bnd_B3f Transformed (const gp_Trsf& theTrsf) const; //! Check the given point for the inclusion in the Box. //! Returns True if the point is outside. diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_Box2d.hxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_Box2d.hxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_Box2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_Box2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -160,7 +160,7 @@ //! Applying a geometric transformation (for example, a //! rotation) to a bounding box generally increases its //! dimensions. This is not optimal for algorithms which use it. - Standard_EXPORT Standard_NODISCARD Bnd_Box2d Transformed (const gp_Trsf2d& T) const; + Standard_NODISCARD Standard_EXPORT Bnd_Box2d Transformed (const gp_Trsf2d& T) const; //! Adds the 2d box to . Standard_EXPORT void Add (const Bnd_Box2d& Other); diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_Box.cxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_Box.cxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_Box.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_Box.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -975,13 +975,30 @@ //function : DumpJson //purpose : //======================================================================= -void Bnd_Box::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const +void Bnd_Box::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Bnd_Box); - OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "CornerMin", 3, Xmin, Ymin, Zmin) OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "CornerMax", 3, Xmax, Ymax, Zmax) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Gap); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Flags); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Gap) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Flags) +} + +//======================================================================= +//function : InitFromJson +//purpose : +//======================================================================= +Standard_Boolean Bnd_Box::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + TCollection_AsciiString aStreamStr = Standard_Dump::Text (theSStream); + OCCT_INIT_VECTOR_CLASS (aStreamStr, "CornerMin", aPos, 3, &Xmin, &Ymin, &Zmin) + OCCT_INIT_VECTOR_CLASS (aStreamStr, "CornerMax", aPos, 3, &Xmax, &Ymax, &Zmax) + + OCCT_INIT_FIELD_VALUE_REAL (aStreamStr, aPos, Gap); + OCCT_INIT_FIELD_VALUE_INTEGER (aStreamStr, aPos, Flags); + + theStreamPos = aPos; + return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_Box.hxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_Box.hxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_Box.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_Box.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -219,7 +219,7 @@ //! Applying a geometric transformation (for example, a //! rotation) to a bounding box generally increases its //! dimensions. This is not optimal for algorithms which use it. - Standard_EXPORT Standard_NODISCARD Bnd_Box Transformed (const gp_Trsf& T) const; + Standard_NODISCARD Standard_EXPORT Bnd_Box Transformed (const gp_Trsf& T) const; //! Adds the box to . Standard_EXPORT void Add (const Bnd_Box& Other); @@ -303,7 +303,10 @@ } //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + + //! Inits the content of me from the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); protected: diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_OBB.cxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_OBB.cxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_OBB.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_OBB.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1027,17 +1027,17 @@ //function : DumpJson //purpose : //======================================================================= -void Bnd_OBB::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Bnd_OBB::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Bnd_OBB); + OCCT_DUMP_CLASS_BEGIN (theOStream, Bnd_OBB) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myCenter); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myAxes[0]); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myAxes[1]); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myAxes[2]); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myCenter) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myAxes[0]) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myAxes[1]) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myAxes[2]) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHDims[0]); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHDims[1]); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHDims[2]); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsAABox); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHDims[0]) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHDims[1]) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHDims[2]) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsAABox) } diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_OBB.hxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_OBB.hxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_OBB.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_OBB.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -283,7 +283,7 @@ Standard_EXPORT void Add(const gp_Pnt& theP); //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_Range.cxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_Range.cxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_Range.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_Range.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -181,10 +181,10 @@ // function : DumpJson // purpose : // ======================================================================= -void Bnd_Range::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const +void Bnd_Range::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Bnd_Range); + OCCT_DUMP_CLASS_BEGIN (theOStream, Bnd_Range) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFirst); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLast); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFirst) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLast) } diff -Nru opencascade-7.4.1+dfsg1/src/Bnd/Bnd_Range.hxx opencascade-7.5.1+dfsg1/src/Bnd/Bnd_Range.hxx --- opencascade-7.4.1+dfsg1/src/Bnd/Bnd_Range.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Bnd/Bnd_Range.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -257,7 +257,7 @@ } //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; private: diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_Alerts.hxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_Alerts.hxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_Alerts.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_Alerts.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -138,4 +138,7 @@ //! The shape is not periodic DEFINE_ALERT_WITH_SHAPE(BOPAlgo_AlertShapeIsNotPeriodic) +//! Unable to make closed edge on face (to make a seam) +DEFINE_ALERT_WITH_SHAPE(BOPAlgo_AlertUnableToMakeClosedEdgeOnFace) + #endif // _BOPAlgo_Alerts_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_ArgumentAnalyzer.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_ArgumentAnalyzer.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_ArgumentAnalyzer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_ArgumentAnalyzer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -357,7 +357,7 @@ aChecker.SetNonDestructive(Standard_True); aChecker.SetRunParallel(myRunParallel); aChecker.SetFuzzyValue(myFuzzyValue); - aChecker.SetProgressIndicator(myProgressIndicator); + aChecker.SetProgressIndicator(*myProgressScope); // aChecker.Perform(); Standard_Boolean hasError = aChecker.HasErrors(); diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_BOPAlgo_msg.pxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_BOPAlgo_msg.pxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_BOPAlgo_msg.pxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_BOPAlgo_msg.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -126,4 +126,7 @@ "Unable to glue the shapes\n" "\n" ".BOPAlgo_AlertShapeIsNotPeriodic\n" - "The shape is not periodic\n"; + "The shape is not periodic\n" + "\n" + ".BOPAlgo_AlertUnableToMakeClosedEdgeOnFace\n" + "Unable to make closed edge on face.\n"; diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_BOP.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_BOP.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_BOP.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_BOP.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -60,8 +60,7 @@ // static void MapFacesToBuildSolids(const TopoDS_Shape& theSol, - TopTools_IndexedDataMapOfShapeListOfShape& theMFS, - TopTools_IndexedMapOfShape& theMFI); + TopTools_IndexedDataMapOfShapeListOfShape& theMFS); //======================================================================= //function : @@ -388,7 +387,10 @@ pPF=new BOPAlgo_PaveFiller(aAllocator); pPF->SetArguments(aLS); pPF->SetRunParallel(myRunParallel); - pPF->SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + pPF->SetProgressIndicator(*myProgressScope); + } pPF->SetFuzzyValue(myFuzzyValue); pPF->SetNonDestructive(myNonDestructive); pPF->SetGlue(myGlue); @@ -1002,8 +1004,6 @@ TopTools_IndexedMapOfShape aMUSols; // Use map to chose the most outer faces to build result solids aMFS.Clear(); - // Internal faces - TopTools_IndexedMapOfShape aMFI; // TopoDS_Iterator aIt(myRC); for (; aIt.More(); aIt.Next()) { @@ -1015,7 +1015,7 @@ } } // - MapFacesToBuildSolids(aSx, aMFS, aMFI); + MapFacesToBuildSolids(aSx, aMFS); } // for (; aIt.More(); aIt.Next()) { // // Process possibly untouched solids. @@ -1035,7 +1035,7 @@ } // if (aExp.More()) { - MapFacesToBuildSolids(aSx, aMFS, aMFI); + MapFacesToBuildSolids(aSx, aMFS); } else { BOPTools_Set aST; @@ -1058,13 +1058,6 @@ aSFS.Append(aFx); } } - // Internal faces - aNb = aMFI.Extent(); - for (i = 1; i <= aNb; ++i) { - TopoDS_Shape aFx = aMFI.FindKey(i); - aSFS.Append(aFx.Oriented(TopAbs_FORWARD)); - aSFS.Append(aFx.Oriented(TopAbs_REVERSED)); - } // TopoDS_Shape aRC; BOPTools_AlgoTools::MakeContainer(TopAbs_COMPOUND, aRC); @@ -1073,6 +1066,7 @@ BOPAlgo_BuilderSolid aBS; aBS.SetContext(myContext); aBS.SetShapes(aSFS); + aBS.SetAvoidInternalShapes (Standard_True); aBS.Perform(); if (aBS.HasErrors()) { AddError (new BOPAlgo_AlertSolidBuilderFailed); // SolidBuilder failed @@ -1518,19 +1512,16 @@ //======================================================================= //function : MapFacesToBuildSolids //purpose : Stores the faces of the given solid into outgoing maps: -// - not internal faces with reference to solid; -// - internal faces. +// - not internal faces with reference to solid. //======================================================================= void MapFacesToBuildSolids(const TopoDS_Shape& theSol, - TopTools_IndexedDataMapOfShapeListOfShape& theMFS, - TopTools_IndexedMapOfShape& theMFI) + TopTools_IndexedDataMapOfShapeListOfShape& theMFS) { TopExp_Explorer aExp(theSol, TopAbs_FACE); for (; aExp.More(); aExp.Next()) { const TopoDS_Shape& aF = aExp.Current(); // if (aF.Orientation() == TopAbs_INTERNAL) { - theMFI.Add(aF); continue; } // diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_Builder_2.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_Builder_2.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_Builder_2.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_Builder_2.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #include +#include #include #include #include @@ -383,7 +384,18 @@ if (bIsClosed) { if (aMFence.Add(aSp)) { if (!BRep_Tool::IsClosed(aSp, aF)){ - BOPTools_AlgoTools3D::DoSplitSEAMOnFace(aSp, aF); + if (!BOPTools_AlgoTools3D::DoSplitSEAMOnFace(aSp, aF)) + { + // try different approach + if (!BOPTools_AlgoTools3D::DoSplitSEAMOnFace(aE, aSp, aF)) + { + TopoDS_Compound aWS; + BRep_Builder().MakeCompound (aWS); + BRep_Builder().Add (aWS, aF); + BRep_Builder().Add (aWS, aSp); + AddWarning (new BOPAlgo_AlertUnableToMakeClosedEdgeOnFace (aWS)); + } + } } // aSp.Orientation(TopAbs_FORWARD); @@ -438,7 +450,10 @@ aBF.SetFace(aF); aBF.SetShapes(aLE); aBF.SetRunParallel(myRunParallel); - aBF.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + aBF.SetProgressIndicator(*myProgressScope); + } // }// for (i=0; iSetArguments(myArguments); pPF->SetRunParallel(myRunParallel); - pPF->SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + pPF->SetProgressIndicator(*myProgressScope); + } pPF->SetFuzzyValue(myFuzzyValue); pPF->SetNonDestructive(myNonDestructive); pPF->SetGlue(myGlue); @@ -632,7 +635,10 @@ aBS.SetRunParallel(myRunParallel); aBS.SetContext(myContext); aBS.SetFuzzyValue(myFuzzyValue); - aBS.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + aBS.SetProgressIndicator(*myProgressScope); + } aBS.Perform(); // Resulting solids diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_CheckerSI.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_CheckerSI.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_CheckerSI.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_CheckerSI.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -432,7 +432,10 @@ aFaceSelfIntersect.SetFace(aF); aFaceSelfIntersect.SetTolF(aTolF); // - aFaceSelfIntersect.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + aFaceSelfIntersect.SetProgressIndicator(*myProgressScope); + } } Standard_Integer aNbFace = aVFace.Length(); diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_MakerVolume.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_MakerVolume.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_MakerVolume.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_MakerVolume.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -86,7 +86,10 @@ } // pPF->SetRunParallel(myRunParallel); - pPF->SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + pPF->SetProgressIndicator(*myProgressScope); + } pPF->SetFuzzyValue(myFuzzyValue); pPF->SetNonDestructive(myNonDestructive); pPF->SetGlue(myGlue); diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo.msg opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo.msg --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo.msg 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo.msg 2021-02-02 08:51:56.000000000 +0000 @@ -124,3 +124,6 @@ .BOPAlgo_AlertShapeIsNotPeriodic The shape is not periodic + +.BOPAlgo_AlertUnableToMakeClosedEdgeOnFace +Unable to make closed edge on face. diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_Options.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_Options.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_Options.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_Options.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,8 +15,9 @@ #include #include -#include +#include #include +#include #include #include #include @@ -51,6 +52,7 @@ myReport(new Message_Report), myRunParallel(myGlobalRunParallel), myFuzzyValue(Precision::Confusion()), + myProgressScope(0L), myUseOBB(Standard_False) { BOPAlgo_LoadMessages(); @@ -67,6 +69,7 @@ myReport(new Message_Report), myRunParallel(myGlobalRunParallel), myFuzzyValue(Precision::Confusion()), + myProgressScope(0L), myUseOBB(Standard_False) { BOPAlgo_LoadMessages(); @@ -132,22 +135,21 @@ //purpose : //======================================================================= void BOPAlgo_Options::SetProgressIndicator - (const Handle(Message_ProgressIndicator)& theObj) + (const Message_ProgressScope& theScope) { - if (!theObj.IsNull()) { - myProgressIndicator = theObj; - } + myProgressScope = &theScope; } + //======================================================================= //function : UserBreak //purpose : //======================================================================= void BOPAlgo_Options::UserBreak() const { - if (myProgressIndicator.IsNull()) { + if (!myProgressScope) { return; } - if (myProgressIndicator->UserBreak()) { + if (myProgressScope->UserBreak()) { throw Standard_NotImplemented("BOPAlgo_Options::UserBreak(), method is not implemented"); } } diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_Options.hxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_Options.hxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_Options.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_Options.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,7 @@ #include -class Message_ProgressIndicator; +class Message_ProgressScope; //! The class provides the following options for the algorithms in Boolean Component: //! - *Memory allocation tool* - tool for memory allocations; @@ -156,7 +156,7 @@ //!@name Progress indicator //! Set the Progress Indicator object. - Standard_EXPORT void SetProgressIndicator(const Handle(Message_ProgressIndicator)& theObj); + Standard_EXPORT void SetProgressIndicator(const Message_ProgressScope& theProgress); public: //!@name Usage of Oriented Bounding boxes @@ -185,7 +185,7 @@ Handle(Message_Report) myReport; Standard_Boolean myRunParallel; Standard_Real myFuzzyValue; - Handle(Message_ProgressIndicator) myProgressIndicator; + const Message_ProgressScope* myProgressScope; Standard_Boolean myUseOBB; }; diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_10.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_10.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_10.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_10.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -152,8 +152,6 @@ // // add vertex to SD map myDS->AddShapeSD(nV, nVNew); - // - myDS->InitPaveBlocksForVertex(nV); // Add new vertex to map of vertices to avoid further extension myVertsToAvoidExtension.Add(nVNew); diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_1.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_1.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -145,8 +145,7 @@ Standard_Integer nV; if (nSD != -1) { // update old SD vertex with new value - Handle(BRep_TVertex)& aTVertex = - reinterpret_cast(const_cast(aVSD.TShape())); + BRep_TVertex* aTVertex = static_cast(aVSD.TShape().get()); aTVertex->Pnt(BRep_Tool::Pnt(aVn)); aTVertex->Tolerance(BRep_Tool::Tolerance(aVn)); aVn = aVSD; diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_2.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_2.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_2.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_2.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -264,7 +264,10 @@ aVESolver.SetEdge(aE); aVESolver.SetPaveBlock(aPB); aVESolver.SetFuzzyValue(myFuzzyValue); - aVESolver.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + aVESolver.SetProgressIndicator(*myProgressScope); + } } } // diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_3.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_3.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_3.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_3.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -253,7 +253,10 @@ anEdgeEdge.SetEdge2(aE2, aT21, aT22); anEdgeEdge.SetBoxes (aBB1, aBB2); anEdgeEdge.SetFuzzyValue(myFuzzyValue); - anEdgeEdge.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + anEdgeEdge.SetProgressIndicator(*myProgressScope); + } }//for (; aIt2.More(); aIt2.Next()) { }//for (; aIt1.More(); aIt1.Next()) { }//for (; myIterator->More(); myIterator->Next()) { @@ -652,6 +655,12 @@ // Vertices Standard_Integer nV1, nV2; thePB->Indices(nV1, nV2); + + if (nV1 < 0 || nV2 < 0) + { + return; + } + const TopoDS_Vertex& aV1=(*(TopoDS_Vertex *)(&myDS->Shape(nV1))); const TopoDS_Vertex& aV2=(*(TopoDS_Vertex *)(&myDS->Shape(nV2))); // Get the edge @@ -1002,6 +1011,7 @@ aBAC1.D1((aT11 + aT12) * 0.5, aPm, aVTgt1); if (aVTgt1.SquareMagnitude() < gp::Resolution()) continue; + aVTgt1.Normalize(); BOPDS_ListIteratorOfListOfPaveBlock aItLPB2 = aItLPB1; for (aItLPB2.Next(); aItLPB2.More(); aItLPB2.Next()) @@ -1034,25 +1044,30 @@ aPB2->Range(aT21, aT22); // Check the angle between edges in the middle point. - // If the angle is more than 10 degrees, do not use the additional + // If the angle is more than 25 degrees, do not use the additional // tolerance, as it may lead to undesired unification of edges Standard_Boolean bUseAddTol = Standard_True; { - GeomAPI_ProjectPointOnCurve& aProjPC = myContext->ProjPC(aE2); - aProjPC.Perform(aPm); - if (!aProjPC.NbPoints()) - continue; - BRepAdaptor_Curve aBAC2(aE2); - gp_Pnt aPm2; - gp_Vec aVTgt2; - aBAC2.D1(aProjPC.LowerDistanceParameter(), aPm2, aVTgt2); - if (aVTgt2.SquareMagnitude() < gp::Resolution()) - continue; - // The angle should be close to zero - Standard_Real aCos = aVTgt1.Dot(aVTgt2); - if (Abs(aCos) < 0.984) - bUseAddTol = Standard_False; + if (aBAC1.GetType() != GeomAbs_Line || + aBAC2.GetType() != GeomAbs_Line) + { + GeomAPI_ProjectPointOnCurve& aProjPC = myContext->ProjPC(aE2); + aProjPC.Perform(aPm); + if (!aProjPC.NbPoints()) + continue; + + gp_Pnt aPm2; + gp_Vec aVTgt2; + aBAC2.D1(aProjPC.LowerDistanceParameter(), aPm2, aVTgt2); + if (aVTgt2.SquareMagnitude() < gp::Resolution()) + continue; + + // The angle should be close to zero + Standard_Real aCos = aVTgt1.Dot (aVTgt2.Normalized()); + if (Abs(aCos) < 0.9063) + bUseAddTol = Standard_False; + } } // Add pair for intersection @@ -1064,10 +1079,17 @@ anEdgeEdge.SetEdge2(aE2, aT21, aT22); anEdgeEdge.SetBoxes (myDS->ShapeInfo(nE1).Box(), myDS->ShapeInfo (nE2).Box()); if (bUseAddTol) + { anEdgeEdge.SetFuzzyValue(myFuzzyValue + aTolAdd); + } else + { anEdgeEdge.SetFuzzyValue(myFuzzyValue); - anEdgeEdge.SetProgressIndicator(myProgressIndicator); + } + if (myProgressScope != NULL) + { + anEdgeEdge.SetProgressIndicator(*myProgressScope); + } } } } diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_4.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_4.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_4.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_4.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -217,7 +217,10 @@ aVertexFace.SetVertex(aV); aVertexFace.SetFace(aF); aVertexFace.SetFuzzyValue(myFuzzyValue); - aVertexFace.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + aVertexFace.SetProgressIndicator(*myProgressScope); + } }//for (; myIterator->More(); myIterator->Next()) { // aNbVF=aVVF.Length(); diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_5.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_5.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_5.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_5.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -278,7 +278,10 @@ aSR = aPBRange; BOPTools_AlgoTools::CorrectRange(aE, aF, aSR, aPBRange); aEdgeFace.SetRange (aPBRange); - aEdgeFace.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + aEdgeFace.SetProgressIndicator(*myProgressScope); + } // Save the pair to avoid their forced intersection BOPDS_MapOfPaveBlock* pMPB = myFPBDone.ChangeSeek(nF); if (!pMPB) @@ -300,12 +303,6 @@ continue; } // - const IntTools_SequenceOfCommonPrts& aCPrts=aEdgeFace.CommonParts(); - aNbCPrts = aCPrts.Length(); - if (!aNbCPrts) { - continue; - } - // aEdgeFace.Indices(nE, nF); // const TopoDS_Edge& aE=aEdgeFace.Edge(); @@ -313,6 +310,23 @@ // aTolE=BRep_Tool::Tolerance(aE); aTolF=BRep_Tool::Tolerance(aF); + // + const IntTools_SequenceOfCommonPrts& aCPrts=aEdgeFace.CommonParts(); + aNbCPrts = aCPrts.Length(); + if (!aNbCPrts) { + if (aEdgeFace.MinimalDistance() < RealLast() && + aEdgeFace.MinimalDistance() > aTolE + aTolF) + { + const Handle(BOPDS_PaveBlock)& aPB=aEdgeFace.PaveBlock(); + aPB->Range(aT1, aT2); + NCollection_List* pList = myDistances.ChangeSeek (BOPDS_Pair (nE, nF)); + if (!pList) + pList = myDistances.Bound (BOPDS_Pair (nE, nF), NCollection_List()); + pList->Append (EdgeRangeDistance (aT1, aT2, aEdgeFace.MinimalDistance())); + } + continue; + } + // const IntTools_Range& anewSR=aEdgeFace.NewSR(); Handle(BOPDS_PaveBlock)& aPB=aEdgeFace.PaveBlock(); // @@ -424,8 +438,17 @@ const TopoDS_Vertex& aV = TopoDS::Vertex(myDS->Shape(nV[j])); const gp_Pnt aP = BRep_Tool::Pnt(aV); Standard_Real aDistPP = aP.Distance(aPnew); - UpdateVertex(nV[j], aDistPP); - myVertsToAvoidExtension.Add(nV[j]); + Standard_Real aTol = BRep_Tool::Tolerance(aV); + Standard_Real aMaxDist = 1.e4 * aTol; + if (aTol < .01) + { + aMaxDist = Min(aMaxDist, 0.1); + } + if (aDistPP < aMaxDist) + { + UpdateVertex(nV[j], aDistPP); + myVertsToAvoidExtension.Add(nV[j]); + } } } continue; @@ -847,6 +870,7 @@ // Projection tool GeomAPI_ProjectPointOnSurf& aProjPS = myContext->ProjPS(aF); + BRepAdaptor_Surface& aSurfAdaptor = myContext->SurfaceAdaptor (aF); // Iterate on pave blocks and combine pairs containing // the same vertices @@ -886,7 +910,7 @@ // Check directions coincidence at middle point on the edge // and projection of that point on the face. // If the angle between tangent vector to the curve and normal - // of the face is not in the range of 80 - 100 degrees, do not use the additional + // of the face is not in the range of 65 - 115 degrees, do not use the additional // tolerance, as it may lead to undesired unification of edge with the face. Standard_Boolean bUseAddTol = Standard_True; @@ -926,15 +950,19 @@ if (!myContext->IsPointInFace(aF, gp_Pnt2d(U, V))) continue; - gp_Pnt aPOnS = aProjPS.NearestPoint(); - gp_Vec aVFNorm(aPOnS, aPOnE); - if (aVFNorm.SquareMagnitude() > gp::Resolution()) + if (aSurfAdaptor.GetType() != GeomAbs_Plane || + aBAC.GetType() != GeomAbs_Line) { - // Angle between vectors should be close to 90 degrees. - // We allow deviation of 10 degrees. - Standard_Real aCos = aVFNorm.Dot(aVETgt); - if (Abs(aCos) > 0.174) - bUseAddTol = Standard_False; + gp_Pnt aPOnS = aProjPS.NearestPoint(); + gp_Vec aVFNorm(aPOnS, aPOnE); + if (aVFNorm.SquareMagnitude() > gp::Resolution()) + { + // Angle between vectors should be close to 90 degrees. + // We allow deviation of 25 degrees. + Standard_Real aCos = aVFNorm.Normalized().Dot (aVETgt.Normalized()); + if (Abs(aCos) > 0.4226) + bUseAddTol = Standard_False; + } } // Compute an addition to Fuzzy value @@ -985,7 +1013,10 @@ aEdgeFace.SetFuzzyValue(myFuzzyValue + aTolAdd); aEdgeFace.UseQuickCoincidenceCheck(Standard_True); aEdgeFace.SetRange(IntTools_Range(aPB->Pave1().Parameter(), aPB->Pave2().Parameter())); - aEdgeFace.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + aEdgeFace.SetProgressIndicator(*myProgressScope); + } } } } diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_6.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -306,7 +308,10 @@ // aFaceFace.SetParameters(bApprox, bCompC2D1, bCompC2D2, anApproxTol); aFaceFace.SetFuzzyValue(myFuzzyValue); - aFaceFace.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + aFaceFace.SetProgressIndicator(*myProgressScope); + } } else { // for the Glue mode just add all interferences of that type @@ -500,7 +505,6 @@ myDS->SubShapesOnIn(nF1, nF2, aMVOnIn, aMVCommon, aMPBOnIn, aMPBCommon); myDS->SharedEdges(nF1, nF2, aLSE, aAllocator); // - Standard_Boolean bHasRealSectionEdge = Standard_False; // 1. Treat Points for (j=0; jHasEdge()) + continue; + + if (myDS->ShapeInfo (aPB->OriginalEdge()).HasFlag()) + continue; + + aPBTree.Add (iPB, Bnd_Tools::Bnd2BVH (myDS->ShapeInfo (aPB->Edge()).Box())); + } + } + + // // 3. Make section edges for (j=0; jIsEmpty() || !pFaces->Contains(nF)) pFaces->Append(nF); + // Try fusing the vertices of the existing pave block + // with the vertices put on the real section curve (except + // for technological vertices, which will be removed) + Standard_Integer nVOut1, nVOut2; + aPBOut->Indices(nVOut1, nVOut2); + if (nV1 != nVOut1 && nV1 != nVOut2 && !aMVBounds.Contains(nV1)) + { + aVertsOnRejectedPB.Add(aV1); + } + if (nV2 != nVOut1 && nV2 != nVOut2 && !aMVBounds.Contains(nV2)) + { + aVertsOnRejectedPB.Add(aV2); + } + if (aMPBAdd.Add(aPBOut)) { // Add edge for processing as the section edge PreparePostTreatFF(i, j, aPBOut, aMSCPB, aMVI, aLPBC); - // Try fusing the vertices of the existing pave block - // with the vertices put on the real section curve (except - // for technological vertices, which will be removed) - Standard_Integer nVOut1, nVOut2; - aPBOut->Indices(nVOut1, nVOut2); - if (nV1 != nVOut1 && nV1 != nVOut2 && !aMVBounds.Contains(nV1)) - { - aVertsOnRejectedPB.Add(aV1); - } - if (nV2 != nVOut1 && nV2 != nVOut2 && !aMVBounds.Contains(nV2)) - { - aVertsOnRejectedPB.Add(aV2); - } } } continue; @@ -715,8 +741,10 @@ // aMVTol.UnBind(nV1); aMVTol.UnBind(nV2); - // - bHasRealSectionEdge = Standard_True; + + // Add existing pave blocks for post treatment + ProcessExistingPaveBlocks (i, j, nF1, nF2, aES, aMPBOnIn, aPBTree, + aMSCPB, aMVI, aLPBC, aPBFacesMap, aMPBAdd); } // aLPBC.RemoveFirst(); @@ -744,29 +772,7 @@ aDMVLV.UnBind(nV1); } // - ProcessExistingPaveBlocks(i, nF1, nF2, aMPBOnIn, aDMBV, aMSCPB, aMVI, aPBFacesMap, aMPBAdd); - // - // If the pair of faces has produced any real section edges - // it is necessary to check if these edges do not intersect - // any common IN edges of the faces. For that, all such edges - // are added for Post Treatment along with sections edges. - if (bHasRealSectionEdge) { - const BOPDS_IndexedMapOfPaveBlock& aMPBIn1 = aFI1.PaveBlocksIn(); - const BOPDS_IndexedMapOfPaveBlock& aMPBIn2 = aFI2.PaveBlocksIn(); - // - // For simplicity add all IN edges into the first set of section curves. - // These existing edges will be removed from the set on the post treatment - // stage in the UpdateFaceInfo function. - BOPDS_ListOfPaveBlock& aLPBC = aVC.ChangeValue(0).ChangePaveBlocks(); - // - Standard_Integer aNbIn1 = aMPBIn1.Extent(); - for (j = 1; j <= aNbIn1; ++j) { - const Handle(BOPDS_PaveBlock)& aPB = aMPBIn1(j); - if (aMPBIn2.Contains(aPB) && aMPBAdd.Add(aPB)) { - PreparePostTreatFF(i, 0, aPB, aMSCPB, aMVI, aLPBC); - } - } - } + ProcessExistingPaveBlocks(i, nF1, nF2, aMPBOnIn, aPBTree, aDMBV, aMSCPB, aMVI, aPBFacesMap, aMPBAdd); }//for (i=0; i 0; --k) { const TopoDS_Shape& aS=theMSCPB.FindKey(k); - aLS.Append(aS); + const Handle(BOPDS_PaveBlock)& aPB = theMSCPB (k).PaveBlock1(); + if (!aPB.IsNull() && aPB->HasEdge()) + BRep_Builder().Add (anExistingEdges, aS); + else + aLS.Append(aS); // add vertices-candidates for SD from the map aDMNewSD, // so that they took part in fuse operation. TopoDS_Iterator itV(aS); @@ -948,6 +961,8 @@ } } } + if (anExistingEdges.NbChildren() > 0) + aLS.Append (anExistingEdges); // // The section edges considered as a micro should be // specially treated - their vertices should be united and @@ -1007,7 +1022,10 @@ } // // 2 Fuse shapes - aPF.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + aPF.SetProgressIndicator(*myProgressScope); + } aPF.SetRunParallel(myRunParallel); aPF.SetArguments(aLS); aPF.Perform(); @@ -1029,6 +1047,12 @@ aItLS.Initialize(aLS); for (; aItLS.More(); aItLS.Next()) { const TopoDS_Shape& aSx=aItLS.Value(); + if (aSx.ShapeType() == TopAbs_COMPOUND) + { + for (TopoDS_Iterator itC (aSx); itC.More(); itC.Next()) + aLS.Append (itC.Value()); + continue; + } nSx=aPDS->Index(aSx); const BOPDS_ShapeInfo& aSIx=aPDS->ShapeInfo(nSx); // @@ -1596,108 +1620,190 @@ const BOPDS_Curve& theNC, const Standard_Real theTolR3D, const BOPDS_IndexedMapOfPaveBlock& theMPBOnIn, + BOPTools_BoxTree& thePBTree, const BOPDS_MapOfPaveBlock& theMPBCommon, Handle(BOPDS_PaveBlock)& aPBOut, Standard_Real& theTolNew) { - Standard_Boolean bRet; - Standard_Real aT1, aT2, aTm, aTx, aTolCheck; - Standard_Integer nSp, iFlag1, iFlag2, nV11, nV12, nV21, nV22, i, aNbPB; - gp_Pnt aP1, aPm, aP2; - Bnd_Box aBoxP1, aBoxPm, aBoxP2, aBoxTmp; - // - bRet=Standard_False; - aTolCheck = theTolR3D + myFuzzyValue; const IntTools_Curve& aIC=theNC.Curve(); - // + + Standard_Real aT1, aT2; thePB->Range(aT1, aT2); - thePB->Indices(nV11, nV12); - const Standard_Real aTolV11 = BRep_Tool::Tolerance(TopoDS::Vertex(myDS->Shape(nV11))); - const Standard_Real aTolV12 = BRep_Tool::Tolerance(TopoDS::Vertex(myDS->Shape(nV12))); - const Standard_Real aTolV1 = Max(aTolV11, aTolV12) + myFuzzyValue; + + Standard_Integer nV11, nV12; + thePB->Indices (nV11, nV12); //first point - aIC.D0(aT1, aP1); - aBoxP1.Add(aP1); - aBoxP1.Enlarge(aTolV11); + Bnd_Box aBoxP1; + gp_Pnt aP1; + aIC.D0 (aT1, aP1); + aBoxP1.Add (aP1); + const Standard_Real aTolV11 = BRep_Tool::Tolerance (TopoDS::Vertex (myDS->Shape (nV11))); + aBoxP1.Enlarge (aTolV11); + + // Find edges intersecting by AABB with the first point + BOPTools_BoxTreeSelector aSelector; + aSelector.SetBox (Bnd_Tools::Bnd2BVH (aBoxP1)); + aSelector.SetBVHSet (&thePBTree); + if (!aSelector.Select()) + return Standard_False; + //intermediate point - aTm=IntTools_Tools::IntermediatePoint (aT1, aT2); - aIC.D0(aTm, aPm); - aBoxPm.Add(aPm); - //last point - aIC.D0(aT2, aP2); - aBoxP2.Add(aP2); - aBoxP2.Enlarge(aTolV12); - // + Bnd_Box aBoxPm; + Standard_Real aTm = IntTools_Tools::IntermediatePoint (aT1, aT2); + gp_Pnt aPm; + gp_Vec aVTgt1; + const Handle(Geom_Curve)& aC3d = aIC.Curve(); + aC3d->D1(aTm, aPm, aVTgt1); + aBoxPm.Add (aPm); + Standard_Boolean isVtgt1Valid = aVTgt1.SquareMagnitude() > gp::Resolution(); + if (isVtgt1Valid) + aVTgt1.Normalize(); + + // last point + Bnd_Box aBoxP2; + gp_Pnt aP2; + aIC.D0 (aT2, aP2); + aBoxP2.Add (aP2); + const Standard_Real aTolV12 = BRep_Tool::Tolerance (TopoDS::Vertex (myDS->Shape (nV12))); + aBoxP2.Enlarge (aTolV12); + + const Standard_Real aTolV1 = Max(aTolV11, aTolV12) + myFuzzyValue; + + Standard_Real aTolCheck = theTolR3D + myFuzzyValue; + + //Some limit values to define "thin" face when iflag1=iflag2=2 and + //edge has no common block with any face + Standard_Real aMaxTolAdd = 0.001; //Maximal tolerance of edge allowed + const Standard_Real aCoeffTolAdd = 10.; //Coeff to define max. tolerance with help of aTolCheck + aMaxTolAdd = Min(aMaxTolAdd, aCoeffTolAdd * aTolCheck); + // Look for the existing pave block closest to the section curve + Standard_Boolean bFound = Standard_False; theTolNew = ::RealLast(); - aNbPB = theMPBOnIn.Extent(); - for (i = 1; i <= aNbPB; ++i) { - const Handle(BOPDS_PaveBlock)& aPB = theMPBOnIn(i); - aPB->Indices(nV21, nV22); - const Standard_Real aTolV21 = BRep_Tool::Tolerance(TopoDS::Vertex(myDS->Shape(nV21))); - const Standard_Real aTolV22 = BRep_Tool::Tolerance(TopoDS::Vertex(myDS->Shape(nV22))); - const Standard_Real aTolV2 = Max(aTolV21, aTolV22) + myFuzzyValue; - nSp=aPB->Edge(); - if (nSp < 0) + for (TColStd_ListOfInteger::Iterator it (aSelector.Indices()); it.More(); it.Next()) + { + const Handle (BOPDS_PaveBlock)& aPB = theMPBOnIn (it.Value()); + + Standard_Integer nV21, nV22; + aPB->Indices (nV21, nV22); + + const Standard_Real aTolV21 = BRep_Tool::Tolerance (TopoDS::Vertex (myDS->Shape (nV21))); + const Standard_Real aTolV22 = BRep_Tool::Tolerance (TopoDS::Vertex (myDS->Shape (nV22))); + const Standard_Real aTolV2 = Max (aTolV21, aTolV22) + myFuzzyValue; + + const BOPDS_ShapeInfo& aSISp = myDS->ChangeShapeInfo (aPB->Edge()); + const TopoDS_Edge& aSp = (*(TopoDS_Edge *)(&aSISp.Shape())); + const Bnd_Box& aBoxSp = aSISp.Box(); + + Standard_Integer iFlag1 = (nV11 == nV21 || nV11 == nV22) ? 2 : 1; + Standard_Integer iFlag2 = (nV12 == nV21 || nV12 == nV22) ? 2 : (!aBoxSp.IsOut (aBoxP2) ? 1 : 0); + if (!iFlag2) continue; - const BOPDS_ShapeInfo& aSISp=myDS->ChangeShapeInfo(nSp); - const TopoDS_Edge& aSp=(*(TopoDS_Edge *)(&aSISp.Shape())); - const Bnd_Box& aBoxSp=aSISp.Box(); - // - iFlag1 = (nV11 == nV21 || nV11 == nV22) ? 2 : - (!aBoxSp.IsOut(aBoxP1) ? 1 : 0); - iFlag2 = (nV12 == nV21 || nV12 == nV22) ? 2 : - (!aBoxSp.IsOut(aBoxP2) ? 1 : 0); - if (iFlag1 && iFlag2) { - Standard_Real aDist = 0.; - - Standard_Real aRealTol = aTolCheck; - if (myDS->IsCommonBlock(aPB)) - { - aRealTol = Max(aRealTol, Max(aTolV1, aTolV2)); - if (theMPBCommon.Contains(aPB)) - // for an edge, which is a common block with a face, - // increase the chance to coincide with section curve - aRealTol *= 2.; - } - - aBoxTmp = aBoxPm; - aBoxTmp.Enlarge(aRealTol); - Standard_Real aDistToSp = 0.; - if (aBoxSp.IsOut(aBoxTmp) || myContext->ComputePE(aPm, - aRealTol, - aSp, - aTx, aDistToSp)) { - continue; - } - // - if (iFlag1 == 1) { - iFlag1 = !myContext->ComputePE(aP1, aRealTol, aSp, aTx, aDist); - if (iFlag1 && aDistToSp < aDist) - aDistToSp = aDist; - } - // - if (iFlag2 == 1) { - iFlag2 = !myContext->ComputePE(aP2, aRealTol, aSp, aTx, aDist); - if (iFlag2 && aDistToSp < aDist) - aDistToSp = aDist; - } - // - if (iFlag1 && iFlag2) + Standard_Real aDist = 0.; + Standard_Real aCoeff = 1.; //Coeff for taking in account deflections between edge and theNC + //when aPB is not common block + Standard_Real aDistm1m2 = 0.; + Standard_Integer aPEStatus = 1; + + Standard_Real aRealTol = aTolCheck; + if (myDS->IsCommonBlock(aPB)) + { + aRealTol = Max(aRealTol, Max(aTolV1, aTolV2)); + if (theMPBCommon.Contains(aPB)) + // for an edge, which is a common block with a face, + // increase the chance to coincide with section curve + aRealTol *= 2.; + } + else if (iFlag1 == 2 && iFlag2 == 2) + { + //Check, if edge could be common block with section curve + // and increase the chance to coincide with section curve + //skip processing if one edge is closed, but other is not closed + //such configurations can give iFlag1 == 2 && iFlag2 == 2 + Standard_Boolean bSkipProcessing = ((nV11 == nV12) && (nV21 != nV22)) || ((nV11 != nV12) && (nV21 == nV22)); + + if (!bSkipProcessing) { - if (aDistToSp < theTolNew) + + if (isVtgt1Valid) { - aPBOut = aPB; - theTolNew = aDistToSp; - bRet = Standard_True; + BRepAdaptor_Curve aBAC2(aSp); + if (aIC.Type() != GeomAbs_Line || + aBAC2.GetType() != GeomAbs_Line) + { + Standard_Real aTldp; + Standard_Real aTolAdd = 2. * Min(aMaxTolAdd, Max(aRealTol, Max(aTolV1, aTolV2))); + aPEStatus = myContext->ComputePE(aPm, aTolAdd, aSp, + aTldp, aDistm1m2); + + if (aPEStatus == 0 ) + { + gp_Pnt aPm2; + gp_Vec aVTgt2; + aBAC2.D1(aTldp, aPm2, aVTgt2); + if (aVTgt2.SquareMagnitude() > gp::Resolution()) + { + // The angle should be close to zero + Standard_Real aCos = aVTgt1.Dot(aVTgt2.Normalized()); + if (Abs(aCos) >= 0.9063) + { + aRealTol = aTolAdd; + aCoeff = 2.; + } + } + } + } } } } + + Bnd_Box aBoxTmp = aBoxPm; + aBoxTmp.Enlarge(aRealTol); + + Standard_Real aDistToSp = 0.; + Standard_Real aTx; + if (aBoxSp.IsOut(aBoxTmp) || aPEStatus < 0) + { + continue; + } + else if(aPEStatus == 0) //aPEStatus == 0 for case iflag1 == iflag2 == 2 + { + aDistToSp = aDistm1m2; + } + else if (aPEStatus == 1) //Projection has not been done yet + { + aPEStatus = myContext->ComputePE(aPm, aRealTol, aSp, + aTx, aDistToSp); + if (aPEStatus < 0) + continue; + } + // + if (iFlag1 == 1) { + iFlag1 = !myContext->ComputePE(aP1, aRealTol, aSp, aTx, aDist); + if (iFlag1 && aDistToSp < aDist) + aDistToSp = aDist; + } + // + if (iFlag2 == 1) { + iFlag2 = !myContext->ComputePE(aP2, aRealTol, aSp, aTx, aDist); + if (iFlag2 && aDistToSp < aDist) + aDistToSp = aDist; + } + // + if (iFlag1 && iFlag2) + { + if (aDistToSp < theTolNew) + { + aPBOut = aPB; + theTolNew = aCoeff * aDistToSp; + bFound = Standard_True; + } + } } - return bRet; + return bFound; } //======================================================================= @@ -2480,11 +2586,102 @@ //function : ProcessExistingPaveBlocks //purpose : //======================================================================= +void BOPAlgo_PaveFiller::ProcessExistingPaveBlocks (const Standard_Integer theInt, + const Standard_Integer theCur, + const Standard_Integer nF1, + const Standard_Integer nF2, + const TopoDS_Edge& theES, + const BOPDS_IndexedMapOfPaveBlock& theMPBOnIn, + BOPTools_BoxTree& thePBTree, + BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB, + TopTools_DataMapOfShapeInteger& theMVI, + BOPDS_ListOfPaveBlock& theLPBC, + BOPAlgo_DataMapOfPaveBlockListOfInteger& thePBFacesMap, + BOPDS_MapOfPaveBlock& theMPB) +{ + Bnd_Box aBoxES; + BRepBndLib::Add (theES, aBoxES, false); + + BOPTools_BoxTreeSelector aSelector; + aSelector.SetBox (Bnd_Tools::Bnd2BVH (aBoxES)); + aSelector.SetBVHSet (&thePBTree); + if (!aSelector.Select()) + return; + + const Standard_Real aTolES = BRep_Tool::Tolerance (theES); + + const BOPDS_FaceInfo& aFI1 = myDS->FaceInfo (nF1); + const BOPDS_FaceInfo& aFI2 = myDS->FaceInfo (nF2); + + for (TColStd_ListOfInteger::Iterator itPB (aSelector.Indices()); itPB.More(); itPB.Next()) + { + const Handle(BOPDS_PaveBlock)& aPBF = theMPBOnIn (itPB.Value()); + if (theMPB.Contains (aPBF)) + continue; + + Standard_Boolean bInF1 = (aFI1.PaveBlocksOn().Contains(aPBF) || + aFI1.PaveBlocksIn().Contains(aPBF)); + Standard_Boolean bInF2 = (aFI2.PaveBlocksOn().Contains(aPBF) || + aFI2.PaveBlocksIn().Contains(aPBF)); + if (bInF1 && bInF2) + { + // Add all common edges for post treatment + theMPB.Add (aPBF); + PreparePostTreatFF (theInt, theCur, aPBF, theMSCPB, theMVI, theLPBC); + continue; + } + + const Standard_Integer nF = bInF1 ? nF2 : nF1; + const NCollection_List* pList = myDistances.Seek (BOPDS_Pair (aPBF->OriginalEdge(), nF)); + if (!pList) + continue; + + Standard_Real aT1, aT2; + aPBF->Range (aT1, aT2); + + Standard_Real aDist = RealLast(); + for (NCollection_List::Iterator itR (*pList); itR.More(); itR.Next()) + { + const EdgeRangeDistance& aRangeDist = itR.Value(); + if ((aT1 <= aRangeDist.First && aRangeDist.First <= aT2) || + (aT1 <= aRangeDist.Last && aRangeDist.Last <= aT2) || + (aRangeDist.First <= aT1 && aT1 <= aRangeDist.Last) || + (aRangeDist.First <= aT2 && aT2 <= aRangeDist.Last)) + { + aDist = aRangeDist.Distance; + break; + } + } + if (aDist < RealLast()) + { + const TopoDS_Edge& aEF = TopoDS::Edge (myDS->Shape (aPBF->Edge())); + const Standard_Real aTolSum = aTolES + BRep_Tool::Tolerance (aEF); + + if (aDist <= aTolSum) + { + theMPB.Add (aPBF); + PreparePostTreatFF (theInt, theCur, aPBF, theMSCPB, theMVI, theLPBC); + + TColStd_ListOfInteger* pFaces = thePBFacesMap.ChangeSeek(aPBF); + if (!pFaces) + pFaces = thePBFacesMap.Bound (aPBF, TColStd_ListOfInteger()); + if (pFaces->IsEmpty() || !pFaces->Contains (nF)) + pFaces->Append (nF); + } + } + } +} + +//======================================================================= +//function : ProcessExistingPaveBlocks +//purpose : +//======================================================================= void BOPAlgo_PaveFiller::ProcessExistingPaveBlocks (const Standard_Integer theInt, const Standard_Integer nF1, const Standard_Integer nF2, const BOPDS_IndexedMapOfPaveBlock& aMPBOnIn, + BOPTools_BoxTree& thePBTree, const TColStd_DataMapOfIntegerListOfInteger& aDMBV, BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& aMSCPB, TopTools_DataMapOfShapeInteger& aMVI, @@ -2496,7 +2693,7 @@ } // Standard_Real aT, dummy; - Standard_Integer i, nV, nE, iC, aNbPB, iFlag; + Standard_Integer nV, nE, iC, iFlag; TColStd_ListIteratorOfListOfInteger aItLI; TColStd_DataMapIteratorOfDataMapOfIntegerListOfInteger aItBV; // @@ -2507,8 +2704,6 @@ const BOPDS_FaceInfo& aFI1 = myDS->FaceInfo(nF1); const BOPDS_FaceInfo& aFI2 = myDS->FaceInfo(nF2); // - aNbPB = aMPBOnIn.Extent(); - // aItBV.Initialize(aDMBV); for (; aItBV.More(); aItBV.Next()) { iC = aItBV.Key(); @@ -2527,8 +2722,15 @@ continue; } // - for (i = 1; i <= aNbPB; ++i) { - const Handle(BOPDS_PaveBlock)& aPB = aMPBOnIn(i); + BOPTools_BoxTreeSelector aSelector; + aSelector.SetBox (Bnd_Tools::Bnd2BVH (aBoxV)); + aSelector.SetBVHSet (&thePBTree); + if (!aSelector.Select()) + continue; + + for (TColStd_ListOfInteger::Iterator it (aSelector.Indices()); it.More(); it.Next()) + { + const Handle(BOPDS_PaveBlock)& aPB = aMPBOnIn (it.Value()); if (aPB->Pave1().Index() == nV || aPB->Pave2().Index() == nV) { continue; } @@ -2536,18 +2738,8 @@ if (aMPB.Contains(aPB)) { continue; } - if (myDS->ShapeInfo(aPB->OriginalEdge()).HasFlag()) { // skip degenerated edges - continue; - } - // nE = aPB->Edge(); const BOPDS_ShapeInfo& aSIE = myDS->ShapeInfo(nE); - const Bnd_Box& aBoxE = aSIE.Box(); - // - if (aBoxV.IsOut(aBoxE)) { - continue; - } - // const TopoDS_Edge& aE = *(TopoDS_Edge*)&aSIE.Shape(); // iFlag = myContext->ComputeVE(aV, aE, aT, dummy, myFuzzyValue); @@ -2646,37 +2838,50 @@ else { // For the different original edge compute the parameters of paves BOPDS_Pave aPave[2]; - for (Standard_Integer i = 0; i < 2; ++i) { - Standard_Integer nV = aPBValuePaves[i].Index(); - aPave[i].SetIndex(nV); - if (nV == aPB2->Pave1().Index()) { - aPave[i].SetParameter(aPB2->Pave1().Parameter()); - } - else if (nV == aPB2->Pave2().Index()) { - aPave[i].SetParameter(aPB2->Pave2().Parameter()); - } - else { - // Compute the parameter by projecting the point - const TopoDS_Vertex& aV = TopoDS::Vertex(myDS->Shape(nV)); - const TopoDS_Edge& aEOr = TopoDS::Edge(myDS->Shape(nE)); - Standard_Real aTOut, aDist; - Standard_Integer iErr = myContext->ComputeVE(aV, aEOr, aTOut, aDist, myFuzzyValue); - if (!iErr) { - aPave[i].SetParameter(aTOut); + + if (aPBValuePaves[0].Index() == aPBValuePaves[1].Index() && + aPB2->Pave1().Index() == aPB2->Pave2().Index()) + { + // still closed + aPave[0].SetIndex (aPBValuePaves[0].Index()); + aPave[0].SetParameter (aPB2->Pave1().Parameter()); + aPave[1].SetIndex (aPBValuePaves[1].Index()); + aPave[1].SetParameter (aPB2->Pave2().Parameter()); + } + else + { + for (Standard_Integer i = 0; i < 2; ++i) { + Standard_Integer nV = aPBValuePaves[i].Index(); + aPave[i].SetIndex(nV); + if (nV == aPB2->Pave1().Index()) { + aPave[i].SetParameter(aPB2->Pave1().Parameter()); + } + else if (nV == aPB2->Pave2().Index()) { + aPave[i].SetParameter(aPB2->Pave2().Parameter()); } else { - // Unable to project - set the parameter of the closest boundary - const TopoDS_Vertex& aV1 = TopoDS::Vertex(myDS->Shape(aPB2->Pave1().Index())); - const TopoDS_Vertex& aV2 = TopoDS::Vertex(myDS->Shape(aPB2->Pave2().Index())); - // - gp_Pnt aP = BRep_Tool::Pnt(aV); - gp_Pnt aP1 = BRep_Tool::Pnt(aV1); - gp_Pnt aP2 = BRep_Tool::Pnt(aV2); - // - Standard_Real aDist1 = aP.SquareDistance(aP1); - Standard_Real aDist2 = aP.SquareDistance(aP2); - // - aPave[i].SetParameter(aDist1 < aDist2 ? aPB2->Pave1().Parameter() : aPB2->Pave2().Parameter()); + // Compute the parameter by projecting the point + const TopoDS_Vertex& aV = TopoDS::Vertex(myDS->Shape(nV)); + const TopoDS_Edge& aEOr = TopoDS::Edge(myDS->Shape(nE)); + Standard_Real aTOut, aDist; + Standard_Integer iErr = myContext->ComputeVE(aV, aEOr, aTOut, aDist, myFuzzyValue); + if (!iErr) { + aPave[i].SetParameter(aTOut); + } + else { + // Unable to project - set the parameter of the closest boundary + const TopoDS_Vertex& aV1 = TopoDS::Vertex(myDS->Shape(aPB2->Pave1().Index())); + const TopoDS_Vertex& aV2 = TopoDS::Vertex(myDS->Shape(aPB2->Pave2().Index())); + // + gp_Pnt aP = BRep_Tool::Pnt(aV); + gp_Pnt aP1 = BRep_Tool::Pnt(aV1); + gp_Pnt aP2 = BRep_Tool::Pnt(aV2); + // + Standard_Real aDist1 = aP.SquareDistance(aP1); + Standard_Real aDist2 = aP.SquareDistance(aP2); + // + aPave[i].SetParameter(aDist1 < aDist2 ? aPB2->Pave1().Parameter() : aPB2->Pave2().Parameter()); + } } } } @@ -3250,6 +3455,7 @@ aTolV=BRep_Tool::Tolerance(aV); // UpdateVertex(nV, aTolV); + myDS->InitPaveBlocksForVertex (nV); } }//for (j=0; j(aE.TShape().operator->())->Tolerance(aTolC); + static_cast(aE.TShape().get())->Tolerance(aTolC); bIsReduced = Standard_True; } } @@ -3446,7 +3652,7 @@ } // if (aMaxTol < aTolV) { - reinterpret_cast(aV.TShape().operator->())->Tolerance(aMaxTol); + static_cast(aV.TShape().get())->Tolerance(aMaxTol); } } } diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_7.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_7.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_7.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_PaveFiller_7.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -484,7 +484,10 @@ aBSE.SetCommonBlock(aCB); } aBSE.SetDS(myDS); - aBSE.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + aBSE.SetProgressIndicator(*myProgressScope); + } } // for (; aItPB.More(); aItPB.Next()) { } // for (i=0; i #include #include +#include #include #include #include @@ -319,7 +320,9 @@ //! created the section curve. Standard_EXPORT Standard_Boolean IsExistingPaveBlock (const Handle(BOPDS_PaveBlock)& thePB, const BOPDS_Curve& theNC, - const Standard_Real theTolR3D, const BOPDS_IndexedMapOfPaveBlock& theMPB, + const Standard_Real theTolR3D, + const BOPDS_IndexedMapOfPaveBlock& theMPB, + BOPTools_BoxTree& thePBTree, const BOPDS_MapOfPaveBlock& theMPBCommon, Handle(BOPDS_PaveBlock)& thePBOut, Standard_Real& theTolNew); @@ -412,6 +415,21 @@ TColStd_DataMapOfIntegerListOfInteger& aDMVLV, const Standard_Integer aType = 0); + //! Adds the existing edges for intersection with section edges + //! by checking the possible intersection with the faces comparing + //! pre-saved E-F distances with new tolerances. + Standard_EXPORT void ProcessExistingPaveBlocks (const Standard_Integer theInt, + const Standard_Integer theCur, + const Standard_Integer nF1, + const Standard_Integer nF2, + const TopoDS_Edge& theES, + const BOPDS_IndexedMapOfPaveBlock& theMPBOnIn, + BOPTools_BoxTree& thePBTree, + BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB, + TopTools_DataMapOfShapeInteger& theMVI, + BOPDS_ListOfPaveBlock& theLPBC, + BOPAlgo_DataMapOfPaveBlockListOfInteger& thePBFacesMap, + BOPDS_MapOfPaveBlock& theMPB); //! Adds the existing edges from the map which interfere //! with the vertices from map to the post treatment of section edges. @@ -419,12 +437,12 @@ const Standard_Integer nF1, const Standard_Integer nF2, const BOPDS_IndexedMapOfPaveBlock& theMPBOnIn, + BOPTools_BoxTree& thePBTree, const TColStd_DataMapOfIntegerListOfInteger& theDMBV, BOPDS_IndexedDataMapOfShapeCoupleOfPaveBlocks& theMSCPB, TopTools_DataMapOfShapeInteger& theMVI, BOPAlgo_DataMapOfPaveBlockListOfInteger& thePBFacesMap, BOPDS_MapOfPaveBlock& theMPB); - //! Replaces existing pave block with new pave blocks . //! The list contains images of which were created in @@ -599,6 +617,22 @@ //! Check all edges on the micro status and remove the positive ones Standard_EXPORT void RemoveMicroEdges(); + //! Auxiliary structure to hold the edge distance to the face + struct EdgeRangeDistance + { + Standard_Real First; + Standard_Real Last; + Standard_Real Distance; + + EdgeRangeDistance (const Standard_Real theFirst = 0.0, + const Standard_Real theLast = 0.0, + const Standard_Real theDistance = RealLast()) + : First (theFirst), Last (theLast), Distance (theDistance) + {} + }; + +protected: //! Fields + TopTools_ListOfShape myArguments; BOPDS_PDS myDS; BOPDS_PIterator myIterator; @@ -615,6 +649,11 @@ //! which has already been extended to cover the real intersection //! points, and should not be extended any longer to be put //! on a section curve. + + NCollection_DataMap , + BOPDS_PairMapHasher> myDistances; //!< Map to store minimal distances between shapes + //! which have no real intersections }; diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_Splitter.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_Splitter.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_Splitter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_Splitter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -89,7 +89,10 @@ BOPAlgo_PaveFiller *pPF = new BOPAlgo_PaveFiller(); pPF->SetArguments(aLS); pPF->SetRunParallel(myRunParallel); - pPF->SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + pPF->SetProgressIndicator(*myProgressScope); + } pPF->SetFuzzyValue(myFuzzyValue); pPF->SetNonDestructive(myNonDestructive); pPF->SetGlue(myGlue); diff -Nru opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_WireSplitter_1.cxx opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_WireSplitter_1.cxx --- opencascade-7.4.1+dfsg1/src/BOPAlgo/BOPAlgo_WireSplitter_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPAlgo/BOPAlgo_WireSplitter_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -94,6 +94,7 @@ static void Path (const GeomAdaptor_Surface& aGAS, const TopoDS_Face& myFace, + const MyDataMapOfShapeBoolean& aVertMap, const TopoDS_Vertex& aVa, const TopoDS_Edge& aEOuta, BOPAlgo_EdgeInfo& anEdgeInfo, @@ -101,8 +102,7 @@ TopTools_SequenceOfShape& aVertVa, TColgp_SequenceOfPnt2d& aCoordVa, BOPTools_ConnexityBlock& aCB, - BOPAlgo_IndexedDataMapOfShapeListOfEdgeInfo& mySmartMap, - MyDataMapOfShapeBoolean aVertMap); + BOPAlgo_IndexedDataMapOfShapeListOfEdgeInfo& mySmartMap); static Standard_Real Angle (const gp_Dir2d& aDir2D); @@ -122,7 +122,6 @@ static void RefineAngles(const TopoDS_Face& myFace, - const TopTools_ListOfShape&, BOPAlgo_IndexedDataMapOfShapeListOfEdgeInfo&, const Handle(IntTools_Context)&); @@ -130,7 +129,6 @@ static void RefineAngles(const TopoDS_Vertex& , const TopoDS_Face& , - const TopTools_MapOfShape& , BOPAlgo_ListOfEdgeInfo&, const Handle(IntTools_Context)&); @@ -324,7 +322,7 @@ //Theme: The treatment p-curves convergent in node. //The refining the angles of p-curves taking into account //bounding curves if exist. - RefineAngles(myFace, myEdges, mySmartMap, theContext); + RefineAngles(myFace, mySmartMap, theContext); // // 4. Do // @@ -348,8 +346,8 @@ aVertVa.Clear(); aCoordVa.Clear(); // - Path(aGAS, myFace, aVa, aEOuta, aEI, aLS, - aVertVa, aCoordVa, aCB, mySmartMap, aVertMap); + Path(aGAS, myFace, aVertMap, aVa, aEOuta, aEI, aLS, + aVertVa, aCoordVa, aCB, mySmartMap); } } }// for (i=1; i<=aNb; ++i) { @@ -360,6 +358,7 @@ //======================================================================= void Path (const GeomAdaptor_Surface& aGAS, const TopoDS_Face& myFace, + const MyDataMapOfShapeBoolean& aVertMap, const TopoDS_Vertex& aVFirst, const TopoDS_Edge& aEFirst, BOPAlgo_EdgeInfo& aEIFirst, @@ -367,8 +366,7 @@ TopTools_SequenceOfShape& aVertVa, TColgp_SequenceOfPnt2d& aCoordVa, BOPTools_ConnexityBlock& aCB, - BOPAlgo_IndexedDataMapOfShapeListOfEdgeInfo& mySmartMap, - MyDataMapOfShapeBoolean aVertMap) + BOPAlgo_IndexedDataMapOfShapeListOfEdgeInfo& mySmartMap) { Standard_Integer i, j, aNb, aNbj; Standard_Real anAngleIn, anAngleOut, anAngle, aMinAngle; @@ -385,6 +383,8 @@ BOPAlgo_EdgeInfo* anEdgeInfo = &aEIFirst; // aTwoPI = M_PI + M_PI; + + NCollection_Sequence anInfoSeq; // // append block // @@ -401,6 +401,7 @@ anEdgeInfo->SetPassed(Standard_True); aLS.Append(aEOuta); aVertVa.Append(aVa); + anInfoSeq.Append (anEdgeInfo); TopoDS_Vertex pVa=aVa; pVa.Orientation(TopAbs_FORWARD); @@ -481,6 +482,7 @@ // TopTools_SequenceOfShape aLSt, aVertVat; TColgp_SequenceOfPnt2d aCoordVat; + NCollection_Sequence anInfoSeqTmp; // aVb=(*(TopoDS_Vertex *)(&aVertVa(i))); // @@ -488,15 +490,16 @@ aLSt.Append(aLS(j)); aVertVat.Append(aVertVa(j)); aCoordVat.Append(aCoordVa(j)); + anInfoSeqTmp.Append (anInfoSeq (j)); } // - aLS.Clear(); - aVertVa.Clear(); - aCoordVa.Clear(); - aLS=aLSt; aVertVa=aVertVat; aCoordVa=aCoordVat; + anInfoSeq = anInfoSeqTmp; + + aEOuta = TopoDS::Edge (aLS.Last()); + anEdgeInfo = anInfoSeq.Last(); // break; } @@ -783,7 +786,7 @@ //for case chl/927/r9 aTX=0.05*(aLast - aFirst);//aTX=0.25*(aLast - aFirst); if (aTX < 5.e-5) { - aTX = 5.e-5; + aTX = Min (5.e-5, (aLast - aFirst) / 2.); } if(dt > aTX) { // to save direction of the curve as much as it possible @@ -880,48 +883,15 @@ //purpose : //======================================================================= void RefineAngles(const TopoDS_Face& myFace, - const TopTools_ListOfShape& myEdges, BOPAlgo_IndexedDataMapOfShapeListOfEdgeInfo& mySmartMap, const Handle(IntTools_Context)& theContext) { - Standard_Integer aNb, i; - NCollection_IndexedDataMap aMSI; - TopTools_MapOfShape aMBE; - TopTools_ListIteratorOfListOfShape aIt; - // - // 1. Boundary Edges - aIt.Initialize(myEdges); - for(; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aE=aIt.Value(); - if(aMSI.Contains(aE)) { - Standard_Integer& iCnt = aMSI.ChangeFromKey(aE); - ++iCnt; - } - else { - Standard_Integer iCnt = 1; - aMSI.Add(aE, iCnt); - } - } - // - aNb = aMSI.Extent(); - for (i = 1; i <= aNb; ++i) { - Standard_Integer iCnt = aMSI(i); - if (iCnt == 1) { - const TopoDS_Shape& aE = aMSI.FindKey(i); - aMBE.Add(aE); - } - } - // - aMSI.Clear(); - // - aNb = mySmartMap.Extent(); - for (i = 1; i <= aNb; ++i) { - const TopoDS_Vertex& aV=*((TopoDS_Vertex*)&mySmartMap.FindKey(i)); - BOPAlgo_ListOfEdgeInfo& aLEI=mySmartMap(i); - // - RefineAngles(aV, myFace, aMBE, aLEI, theContext); + const Standard_Integer aNb = mySmartMap.Extent(); + for (Standard_Integer i = 1; i <= aNb; ++i) + { + const TopoDS_Vertex& aV = *((TopoDS_Vertex*)&mySmartMap.FindKey (i)); + BOPAlgo_ListOfEdgeInfo& aLEI = mySmartMap (i); + RefineAngles(aV, myFace, aLEI, theContext); } } //======================================================================= @@ -937,7 +907,6 @@ //======================================================================= void RefineAngles(const TopoDS_Vertex& aV, const TopoDS_Face& myFace, - const TopTools_MapOfShape& aMBE, BOPAlgo_ListOfEdgeInfo& aLEI, const Handle(IntTools_Context)& theContext) { @@ -954,11 +923,10 @@ aItLEI.Initialize(aLEI); for (; aItLEI.More(); aItLEI.Next()) { BOPAlgo_EdgeInfo& aEI=aItLEI.ChangeValue(); - const TopoDS_Edge& aE=aEI.Edge(); bIsIn=aEI.IsIn(); aA=aEI.Angle(); // - if (aMBE.Contains(aE)) { + if (!aEI.IsInside()) { ++iCntBnd; if (!bIsIn) { aA1=aA; @@ -982,7 +950,7 @@ BOPAlgo_EdgeInfo& aEI=aItLEI.ChangeValue(); const TopoDS_Edge& aE=aEI.Edge(); // - bIsBoundary=aMBE.Contains(aE); + bIsBoundary=!aEI.IsInside(); bIsIn=aEI.IsIn(); if (bIsBoundary || bIsIn) { continue; diff -Nru opencascade-7.4.1+dfsg1/src/BOPTest/BOPTest_BOPCommands.cxx opencascade-7.5.1+dfsg1/src/BOPTest/BOPTest_BOPCommands.cxx --- opencascade-7.4.1+dfsg1/src/BOPTest/BOPTest_BOPCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPTest/BOPTest_BOPCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -647,6 +647,7 @@ aToApproxC2dOnS2, anAppTol); aFF.SetList(aListOfPnts); + aFF.SetFuzzyValue (BOPTest_Objects::FuzzyValue()); // aFF.Perform (aF1, aF2); // diff -Nru opencascade-7.4.1+dfsg1/src/BOPTest/BOPTest.cxx opencascade-7.5.1+dfsg1/src/BOPTest/BOPTest.cxx --- opencascade-7.4.1+dfsg1/src/BOPTest/BOPTest.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPTest/BOPTest.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -136,7 +137,8 @@ } // output message with list of shapes - Message::DefaultMessenger()->Send (aText, anAlertTypes[iGravity]); + Draw_Interpretor& aDrawInterpretor = Draw::GetInterpretor(); + aDrawInterpretor << aText << "\n"; } } } diff -Nru opencascade-7.4.1+dfsg1/src/BOPTools/BOPTools_AlgoTools_1.cxx opencascade-7.5.1+dfsg1/src/BOPTools/BOPTools_AlgoTools_1.cxx --- opencascade-7.4.1+dfsg1/src/BOPTools/BOPTools_AlgoTools_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPTools/BOPTools_AlgoTools_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -813,7 +813,7 @@ { if (myCref.IsNull()) return; - Standard_Boolean ok=Standard_True;; + Standard_Boolean ok = Standard_True; Handle(BRep_TEdge)& TE = *((Handle(BRep_TEdge)*)&myShape.TShape()); Standard_Real Tol = BRep_Tool::Tolerance(TopoDS::Edge(myShape)); diff -Nru opencascade-7.4.1+dfsg1/src/BOPTools/BOPTools_AlgoTools3D.cxx opencascade-7.5.1+dfsg1/src/BOPTools/BOPTools_AlgoTools3D.cxx --- opencascade-7.4.1+dfsg1/src/BOPTools/BOPTools_AlgoTools3D.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPTools/BOPTools_AlgoTools3D.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -72,8 +73,8 @@ //function : DoSplitSEAMOnFace //purpose : //======================================================================= -void BOPTools_AlgoTools3D::DoSplitSEAMOnFace (const TopoDS_Edge& aSplit, - const TopoDS_Face& aF) +Standard_Boolean BOPTools_AlgoTools3D::DoSplitSEAMOnFace (const TopoDS_Edge& aSplit, + const TopoDS_Face& aF) { Standard_Boolean bIsUPeriodic, bIsVPeriodic, bIsLeft; Standard_Real aTol, a, b, anUPeriod, anVPeriod, aT, anU, dU, anU1; @@ -131,7 +132,7 @@ bIsVPeriodic=aSB->IsVPeriodic(); // if (!(bIsUPeriodic || bIsVPeriodic)) { - return; + return Standard_False; } anUPeriod = bIsUPeriodic ? aSB->UPeriod() : 0.; anVPeriod = bIsVPeriodic ? aSB->VPeriod() : 0.; @@ -139,7 +140,7 @@ // if (aRTS.IsNull()) { if (!bIsUClosed && !bIsVClosed) { - return; + return Standard_False; } // if (bIsUClosed) { @@ -191,7 +192,7 @@ } // if (anU1==anU && anV1==anV) { - return; + return Standard_False; } // aScPr = (anU1==anU) ? aDir2D1*aDOX : aDir2D1*aDOY; @@ -222,7 +223,96 @@ BB.UpdateEdge(aSp, aC2, aC1, aF, aTol); } } + return Standard_True; } + +//======================================================================= +//function : DoSplitSEAMOnFace +//purpose : +//======================================================================= +Standard_Boolean BOPTools_AlgoTools3D::DoSplitSEAMOnFace (const TopoDS_Edge& theEOrigin, + const TopoDS_Edge& theESplit, + const TopoDS_Face& theFace) +{ + if (!BRep_Tool::IsClosed (theEOrigin, theFace)) + return Standard_False; + + if (BRep_Tool::IsClosed (theESplit, theFace)) + return Standard_True; + + TopoDS_Edge aESplit = theESplit; + aESplit.Orientation (TopAbs_FORWARD); + + TopoDS_Face aFace = theFace; + aFace.Orientation (TopAbs_FORWARD); + + Standard_Real aTS1, aTS2; + Handle(Geom2d_Curve) aC2DSplit = BRep_Tool::CurveOnSurface (aESplit, aFace, aTS1, aTS2); + if (aC2DSplit.IsNull()) + return Standard_False; + + Standard_Real aT1, aT2; + Handle(Geom2d_Curve) aC2D1 = BRep_Tool::CurveOnSurface ( + TopoDS::Edge (theEOrigin.Oriented (TopAbs_FORWARD)), aFace, aT1, aT2); + Handle(Geom2d_Curve) aC2D2 = BRep_Tool::CurveOnSurface ( + TopoDS::Edge (theEOrigin.Oriented (TopAbs_REVERSED)), aFace, aT1, aT2); + + Standard_Real aT = BOPTools_AlgoTools2D::IntermediatePoint (aTS1, aTS2); + gp_Pnt2d aPMid; + gp_Vec2d aVTgt; + aC2DSplit->D1 (aT, aPMid, aVTgt); + + // project on original 2d curves + Geom2dAPI_ProjectPointOnCurve aProjPC1, aProjPC2; + aProjPC1.Init (aPMid, aC2D1, aT1, aT2); + aProjPC2.Init (aPMid, aC2D2, aT1, aT2); + + if (!aProjPC1.NbPoints() && !aProjPC2.NbPoints()) + return Standard_False; + + Standard_Real aDist1 = aProjPC1.NbPoints() ? aProjPC1.LowerDistance() : RealLast(); + Standard_Real aDist2 = aProjPC2.NbPoints() ? aProjPC2.LowerDistance() : RealLast(); + + if (aDist1 > Precision::PConfusion() && aDist2 > Precision::PConfusion()) + return Standard_False; + + // choose the closest and take corresponding point from the opposite + gp_Pnt2d aNewPnt = aDist1 < aDist2 ? aC2D2->Value (aProjPC1.LowerDistanceParameter()) : + aC2D1->Value (aProjPC2.LowerDistanceParameter()); + + Handle (Geom2d_Curve) aTmpC1 = Handle (Geom2d_Curve)::DownCast (aC2DSplit->Copy()); + Handle (Geom2d_Curve) aTmpC2 = Handle (Geom2d_Curve)::DownCast (aC2DSplit->Copy()); + + Handle (Geom2d_TrimmedCurve) aC1 = new Geom2d_TrimmedCurve (aTmpC1, aTS1, aTS2); + Handle (Geom2d_TrimmedCurve) aC2 = new Geom2d_TrimmedCurve (aTmpC2, aTS1, aTS2); + + gp_Vec2d aTrVec (aPMid, aNewPnt); + aC2->Translate (aTrVec); + + gp_Pnt2d aPProj; + gp_Vec2d aVTgtOrigin; + if (aDist1 < aDist2) + { + aC2D1->D1 (aProjPC1.LowerDistanceParameter(), aPProj, aVTgtOrigin); + } + else + { + aC2D2->D1 (aProjPC2.LowerDistanceParameter(), aPProj, aVTgtOrigin); + } + + Standard_Real aDot = aVTgt.Dot (aVTgtOrigin); + + if ((aDist1 < aDist2) == (aDot > 0)) + { + BRep_Builder().UpdateEdge (aESplit, aC1, aC2, aFace, BRep_Tool::Tolerance (aESplit)); + } + else + { + BRep_Builder().UpdateEdge (aESplit, aC2, aC1, aFace, BRep_Tool::Tolerance (aESplit)); + } + return Standard_True; +} + //======================================================================= //function : GetNormalToFaceOnEdge //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BOPTools/BOPTools_AlgoTools3D.hxx opencascade-7.5.1+dfsg1/src/BOPTools/BOPTools_AlgoTools3D.hxx --- opencascade-7.4.1+dfsg1/src/BOPTools/BOPTools_AlgoTools3D.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPTools/BOPTools_AlgoTools3D.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,11 +43,15 @@ DEFINE_STANDARD_ALLOC - + //! Makes the edge seam edge for the face basing on the surface properties (U and V periods) + Standard_EXPORT static Standard_Boolean DoSplitSEAMOnFace (const TopoDS_Edge& theESplit, + const TopoDS_Face& theFace); - //! Make the edge seam edge for the face - Standard_EXPORT static void DoSplitSEAMOnFace (const TopoDS_Edge& aSp, - const TopoDS_Face& aF); + //! Makes the split edge seam edge for the face basing on the positions + //! of 2d curves of the original edge . + Standard_EXPORT static Standard_Boolean DoSplitSEAMOnFace (const TopoDS_Edge& theEOrigin, + const TopoDS_Edge& theESplit, + const TopoDS_Face& theFace); //! Computes normal to the face for the point on the edge //! at parameter .
diff -Nru opencascade-7.4.1+dfsg1/src/BOPTools/BOPTools_AlgoTools.cxx opencascade-7.5.1+dfsg1/src/BOPTools/BOPTools_AlgoTools.cxx --- opencascade-7.4.1+dfsg1/src/BOPTools/BOPTools_AlgoTools.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BOPTools/BOPTools_AlgoTools.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -825,7 +825,8 @@ const TopoDS_Face& aF2=(*(TopoDS_Face*)(&aLF.Last())); iRet=BOPTools_AlgoTools::IsInternalFace(theFace, aE, aF1, aF2, theContext); - break; + if (iRet != 2) + break; } }//for(; aExp.More(); aExp.Next()) { // @@ -901,8 +902,6 @@ const TopoDS_Face& theFace2, const Handle(IntTools_Context)& theContext) { - Standard_Boolean bRet; - Standard_Integer iRet; TopoDS_Edge aE1, aE2; TopoDS_Face aFOff; BOPTools_ListOfCoupleOfShape theLCSOff; @@ -931,17 +930,15 @@ aCS2.SetShape2(theFace2); theLCSOff.Append(aCS2); // - bRet=GetFaceOff(aE1, theFace1, theLCSOff, aFOff, theContext); - // - iRet=0; // theFace is not internal - if (theFace.IsEqual(aFOff)) { + Standard_Integer iRet = 0; // theFace is not internal + Standard_Boolean isDone = GetFaceOff (aE1, theFace1, theLCSOff, aFOff, theContext); + if (!isDone) + // error, unable to classify face by this edge + iRet = 2; + else if (theFace.IsEqual (aFOff)) // theFace is internal - iRet=1; - if (!bRet) { - // theFace seems to be internal - iRet=2; - } - } + iRet = 1; + return iRet; } //======================================================================= @@ -957,7 +954,7 @@ { Standard_Boolean bRet, bIsComputed; Standard_Real aT, aT1, aT2, aAngle, aTwoPI, aAngleMin, aDt3D; - Standard_Real aUmin, aUsup, aVmin, aVsup, aPA; + Standard_Real aUmin, aUsup, aVmin, aVsup; gp_Pnt aPn1, aPn2, aPx; gp_Dir aDN1, aDN2, aDBF, aDBF2, aDTF; gp_Vec aVTgt; @@ -967,7 +964,6 @@ BOPTools_ListIteratorOfListOfCoupleOfShape aIt; GeomAPI_ProjectPointOnSurf aProjPL; // - aPA=Precision::Angular(); aAngleMin=100.; aTwoPI=M_PI+M_PI; aC3D =BRep_Tool::Curve(theE1, aT1, aT2); @@ -994,6 +990,10 @@ // aDTF=aDN1^aDBF; // + // The difference between faces should be obvious enough + // to guarantee the correctness of the classification + Standard_Real anAngleCriteria = Precision::Confusion(); + bRet=Standard_True; aIt.Initialize(theLCSOff); for (; aIt.More(); aIt.Next()) { @@ -1012,11 +1012,7 @@ //Angle aAngle=AngleWithRef(aDBF, aDBF2, aDTF); // - if(aAngle<0.) { - aAngle=aTwoPI+aAngle; - } - // - if (aAngleLocked()) - { - throw TopoDS_LockedShape("BRep_Builder::Transfert"); - } const Standard_Real tol = TE->Tolerance(); - BRep_ListOfCurveRepresentation& lcr = TE->ChangeCurves(); + const BRep_ListOfCurveRepresentation& lcr = TE->Curves(); BRep_ListIteratorOfListOfCurveRepresentation itcr(lcr); while (itcr.More()) { diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_Curve3D.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_Curve3D.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_Curve3D.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_Curve3D.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -92,3 +92,16 @@ C->SetRange(First(), Last()); return C; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_Curve3D::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_GCurve) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myCurve.get()) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_Curve3D.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_Curve3D.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_Curve3D.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_Curve3D.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -54,6 +54,9 @@ //! Return a copy of this representation. Standard_EXPORT Handle(BRep_CurveRepresentation) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOn2Surfaces.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOn2Surfaces.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOn2Surfaces.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOn2Surfaces.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -147,3 +147,20 @@ myContinuity); return C; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_CurveOn2Surfaces::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_CurveRepresentation) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, mySurface.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, mySurface2.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myLocation2) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myContinuity) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOn2Surfaces.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOn2Surfaces.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOn2Surfaces.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOn2Surfaces.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -66,6 +66,9 @@ //! Return a copy of this representation. Standard_EXPORT Handle(BRep_CurveRepresentation) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOnClosedSurface.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOnClosedSurface.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOnClosedSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOnClosedSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -180,4 +180,20 @@ BRep_CurveOnSurface::Update(); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_CurveOnClosedSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_CurveOnSurface) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPCurve2.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myContinuity) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myUV21) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myUV22) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOnClosedSurface.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOnClosedSurface.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOnClosedSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOnClosedSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -78,6 +78,9 @@ //! This is called when the range is modified. Standard_EXPORT virtual void Update() Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOnSurface.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOnSurface.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOnSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOnSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -146,4 +146,20 @@ } } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_CurveOnSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_GCurve) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myUV1) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myUV2) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPCurve.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, mySurface.get()) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOnSurface.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOnSurface.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveOnSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveOnSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -71,6 +71,9 @@ //! This is called when the range is modified. Standard_EXPORT virtual void Update() Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveRepresentation.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveRepresentation.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveRepresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveRepresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -426,3 +426,13 @@ throw Standard_DomainError("BRep_CurveRepresentation"); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_CurveRepresentation::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myLocation) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveRepresentation.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveRepresentation.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_CurveRepresentation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_CurveRepresentation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -144,6 +144,9 @@ //! Return a copy of this representation. Standard_EXPORT virtual Handle(BRep_CurveRepresentation) Copy() const = 0; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_GCurve.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_GCurve.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_GCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_GCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,3 +46,16 @@ } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_GCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_CurveRepresentation) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFirst) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLast) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_GCurve.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_GCurve.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_GCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_GCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,6 +57,9 @@ //! This is called when the range is modified. Standard_EXPORT virtual void Update(); + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PointOnCurve.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PointOnCurve.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PointOnCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PointOnCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -80,4 +80,16 @@ myCurve = C; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_PointOnCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_PointRepresentation) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCurve.get()) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PointOnCurve.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PointOnCurve.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PointOnCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PointOnCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,6 +48,9 @@ Standard_EXPORT virtual void Curve (const Handle(Geom_Curve)& C) Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PointOnCurveOnSurface.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PointOnCurveOnSurface.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PointOnCurveOnSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PointOnCurveOnSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -84,4 +84,16 @@ myPCurve = C; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_PointOnCurveOnSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_PointRepresentation) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPCurve.get()) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PointOnCurveOnSurface.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PointOnCurveOnSurface.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PointOnCurveOnSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PointOnCurveOnSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -50,6 +50,9 @@ Standard_EXPORT virtual void PCurve (const Handle(Geom2d_Curve)& C) Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PointRepresentation.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PointRepresentation.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PointRepresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PointRepresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -197,4 +197,15 @@ throw Standard_DomainError("BRep_PointRepresentation"); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_PointRepresentation::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myLocation) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myParameter) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PointRepresentation.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PointRepresentation.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PointRepresentation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PointRepresentation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -84,6 +84,9 @@ Standard_EXPORT virtual void Surface (const Handle(Geom_Surface)& S); + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PointsOnSurface.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PointsOnSurface.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PointsOnSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PointsOnSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -56,4 +56,17 @@ mySurface = S; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_PointsOnSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_PointRepresentation) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, mySurface.get()) +} + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PointsOnSurface.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PointsOnSurface.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PointsOnSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PointsOnSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,6 +40,9 @@ Standard_EXPORT virtual void Surface (const Handle(Geom_Surface)& S) Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_Polygon3D.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_Polygon3D.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_Polygon3D.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_Polygon3D.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -76,3 +76,15 @@ return P; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_Polygon3D::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_CurveRepresentation) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPolygon3D.get()) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_Polygon3D.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_Polygon3D.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_Polygon3D.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_Polygon3D.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -50,6 +50,9 @@ //! Return a copy of this representation. Standard_EXPORT Handle(BRep_CurveRepresentation) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnClosedSurface.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnClosedSurface.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnClosedSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnClosedSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -79,3 +79,16 @@ return P; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_PolygonOnClosedSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_PolygonOnSurface) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPolygon2.get()) +} + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnClosedSurface.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnClosedSurface.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnClosedSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnClosedSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,6 +51,9 @@ //! Return a copy of this representation. Standard_EXPORT virtual Handle(BRep_CurveRepresentation) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnClosedTriangulation.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnClosedTriangulation.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnClosedTriangulation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnClosedTriangulation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -84,3 +84,15 @@ return P; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_PolygonOnClosedTriangulation::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_PolygonOnTriangulation) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPolygon2.get()) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnClosedTriangulation.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnClosedTriangulation.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnClosedTriangulation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnClosedTriangulation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,6 +51,9 @@ //! Return a copy of this representation. Standard_EXPORT virtual Handle(BRep_CurveRepresentation) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnSurface.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnSurface.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -102,3 +102,16 @@ return P; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_PolygonOnSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_CurveRepresentation) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPolygon2D.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, mySurface.get()) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnSurface.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnSurface.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,6 +59,9 @@ //! Return a copy of this representation. Standard_EXPORT virtual Handle(BRep_CurveRepresentation) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnTriangulation.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnTriangulation.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnTriangulation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnTriangulation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -104,3 +104,17 @@ return P; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_PolygonOnTriangulation::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, BRep_CurveRepresentation) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPolygon.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTriangulation.get()) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnTriangulation.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnTriangulation.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_PolygonOnTriangulation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_PolygonOnTriangulation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,6 +58,9 @@ //! Return a copy of this representation. Standard_EXPORT virtual Handle(BRep_CurveRepresentation) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_TEdge.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_TEdge.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_TEdge.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_TEdge.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -141,3 +141,22 @@ return TE; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_TEdge::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TopoDS_TEdge) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTolerance) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFlags) + + for (BRep_ListIteratorOfListOfCurveRepresentation itr(myCurves); itr.More(); itr.Next()) + { + const Handle(BRep_CurveRepresentation)& aCurveRepresentation = itr.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aCurveRepresentation.get()) + } +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_TEdge.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_TEdge.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_TEdge.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_TEdge.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -81,6 +81,9 @@ //! Returns a copy of the TShape with no sub-shapes. Standard_EXPORT Handle(TopoDS_TShape) EmptyCopy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_TFace.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_TFace.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_TFace.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_TFace.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -50,3 +50,21 @@ TF->Tolerance(myTolerance); return TF; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_TFace::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TopoDS_TFace) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, mySurface.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTriangulation.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myLocation) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTolerance) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNaturalRestriction) +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_TFace.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_TFace.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_TFace.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_TFace.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -88,6 +88,9 @@ //! The new Face has no triangulation. Standard_EXPORT virtual Handle(TopoDS_TShape) EmptyCopy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_Tool.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_Tool.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_Tool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_Tool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -208,6 +208,17 @@ //======================================================================= //function : IsGeometric +//purpose : Returns True if has a surface. +//======================================================================= +Standard_Boolean BRep_Tool::IsGeometric (const TopoDS_Face& F) +{ + const BRep_TFace* TF = static_cast(F.TShape().get()); + const Handle(Geom_Surface)& S = TF->Surface(); + return !S.IsNull(); +} + +//======================================================================= +//function : IsGeometric //purpose : Returns True if is a 3d curve or a curve on // surface. //======================================================================= @@ -1253,84 +1264,95 @@ //purpose : Returns the parameter of on . //======================================================================= -Standard_Real BRep_Tool::Parameter(const TopoDS_Vertex& V, - const TopoDS_Edge& E) +Standard_Boolean BRep_Tool::Parameter (const TopoDS_Vertex& theV, + const TopoDS_Edge& theE, + Standard_Real& theParam) { - // Search the vertex in the edge Standard_Boolean rev = Standard_False; TopoDS_Shape VF; TopAbs_Orientation orient = TopAbs_INTERNAL; - TopoDS_Iterator itv(E.Oriented(TopAbs_FORWARD)); + TopoDS_Iterator itv(theE.Oriented(TopAbs_FORWARD)); // if the edge has no vertices // and is degenerated use the vertex orientation // RLE, june 94 - if (!itv.More() && Degenerated(E)) { - orient = V.Orientation(); + if (!itv.More() && BRep_Tool::Degenerated(theE)) { + orient = theV.Orientation(); } while (itv.More()) { const TopoDS_Shape& Vcur = itv.Value(); - if (V.IsSame(Vcur)) { + if (theV.IsSame(Vcur)) { if (VF.IsNull()) { VF = Vcur; } else { - rev = E.Orientation() == TopAbs_REVERSED; - if (Vcur.Orientation() == V.Orientation()) { + rev = theE.Orientation() == TopAbs_REVERSED; + if (Vcur.Orientation() == theV.Orientation()) { VF = Vcur; } } } itv.Next(); } - + if (!VF.IsNull()) orient = VF.Orientation(); - - Standard_Real f,l; - if (orient == TopAbs_FORWARD) { - BRep_Tool::Range(E,f,l); - return (rev) ? l : f; - } - - else if (orient == TopAbs_REVERSED) { - BRep_Tool::Range(E,f,l); - return (rev) ? f : l; - } + Standard_Real f, l; + + if (orient == TopAbs_FORWARD) { + BRep_Tool::Range(theE, f, l); + theParam = (rev) ? l : f; + return Standard_True; + } + + else if (orient == TopAbs_REVERSED) { + BRep_Tool::Range(theE, f, l); + theParam = (rev) ? f : l; + return Standard_True; + } else { TopLoc_Location L; - const Handle(Geom_Curve)& C = BRep_Tool::Curve(E,L,f,l); - L = L.Predivided(V.Location()); - if (!C.IsNull() || Degenerated(E)) { - const BRep_TVertex* TV = static_cast(V.TShape().get()); + const Handle(Geom_Curve)& C = BRep_Tool::Curve(theE, L, f, l); + L = L.Predivided(theV.Location()); + if (!C.IsNull() || BRep_Tool::Degenerated(theE)) { + const BRep_TVertex* TV = static_cast(theV.TShape().get()); BRep_ListIteratorOfListOfPointRepresentation itpr(TV->Points()); while (itpr.More()) { const Handle(BRep_PointRepresentation)& pr = itpr.Value(); - if (pr->IsPointOnCurve(C,L)) { + if (pr->IsPointOnCurve(C, L)) { Standard_Real p = pr->Parameter(); Standard_Real res = p;// SVV 4 nov 99 - to avoid warnings on Linux if (!C.IsNull()) { // Closed curves RLE 16 june 94 - if (Precision::IsNegativeInfinite(f)) return pr->Parameter();//p; - if (Precision::IsPositiveInfinite(l)) return pr->Parameter();//p; + if (Precision::IsNegativeInfinite(f)) + { + theParam = pr->Parameter();//p; + return Standard_True; + }; + if (Precision::IsPositiveInfinite(l)) + { + theParam = pr->Parameter();//p; + return Standard_True; + } gp_Pnt Pf = C->Value(f).Transformed(L.Transformation()); gp_Pnt Pl = C->Value(l).Transformed(L.Transformation()); - Standard_Real tol = BRep_Tool::Tolerance(V); + Standard_Real tol = BRep_Tool::Tolerance(theV); if (Pf.Distance(Pl) < tol) { - if (Pf.Distance(BRep_Tool::Pnt(V)) < tol) { - if (V.Orientation() == TopAbs_FORWARD) res = f;//p = f; + if (Pf.Distance(BRep_Tool::Pnt(theV)) < tol) { + if (theV.Orientation() == TopAbs_FORWARD) res = f;//p = f; else res = l;//p = l; } } } - return res;//p; + theParam = res;//p; + return Standard_True; } itpr.Next(); } @@ -1340,30 +1362,44 @@ // let us try with the first pcurve Handle(Geom2d_Curve) PC; Handle(Geom_Surface) S; - BRep_Tool::CurveOnSurface(E,PC,S,L,f,l); - L = L.Predivided(V.Location()); - const BRep_TVertex* TV = static_cast(V.TShape().get()); + BRep_Tool::CurveOnSurface(theE, PC, S, L, f, l); + L = L.Predivided(theV.Location()); + const BRep_TVertex* TV = static_cast(theV.TShape().get()); BRep_ListIteratorOfListOfPointRepresentation itpr(TV->Points()); while (itpr.More()) { const Handle(BRep_PointRepresentation)& pr = itpr.Value(); - if (pr->IsPointOnCurveOnSurface(PC,S,L)) { + if (pr->IsPointOnCurveOnSurface(PC, S, L)) { Standard_Real p = pr->Parameter(); // Closed curves RLE 16 june 94 if (PC->IsClosed()) { - if ((p == PC->FirstParameter()) || - (p == PC->LastParameter())) { - if (V.Orientation() == TopAbs_FORWARD) p = PC->FirstParameter(); - else p = PC->LastParameter(); + if ((p == PC->FirstParameter()) || + (p == PC->LastParameter())) { + if (theV.Orientation() == TopAbs_FORWARD) p = PC->FirstParameter(); + else p = PC->LastParameter(); } } - return p; + theParam = p; + return Standard_True; } itpr.Next(); } } } - + + return Standard_False; +} + +//======================================================================= +//function : Parameter +//purpose : Returns the parameter of on . +//======================================================================= + +Standard_Real BRep_Tool::Parameter(const TopoDS_Vertex& V, + const TopoDS_Edge& E) +{ + Standard_Real p; + if (Parameter(V, E, p)) return p; throw Standard_NoSuchObject("BRep_Tool:: no parameter on edge"); } diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_Tool.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_Tool.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_Tool.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_Tool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -74,6 +74,9 @@ //! Returns the NaturalRestriction flag of the face. Standard_EXPORT static Standard_Boolean NaturalRestriction (const TopoDS_Face& F); + //! Returns True if has a surface, false otherwise. + Standard_EXPORT static Standard_Boolean IsGeometric (const TopoDS_Face& F); + //! Returns True if is a 3d curve or a curve on //! surface. Standard_EXPORT static Standard_Boolean IsGeometric (const TopoDS_Edge& E); @@ -252,7 +255,17 @@ //! Returns the tolerance. Standard_EXPORT static Standard_Real Tolerance (const TopoDS_Vertex& V); + //! Finds the parameter of on . + //! @param theV [in] input vertex + //! @param theE [in] input edge + //! @param theParam [out] calculated parameter on the curve + //! @return TRUE if done + Standard_EXPORT static Standard_Boolean Parameter (const TopoDS_Vertex& theV, + const TopoDS_Edge& theE, + Standard_Real &theParam); + //! Returns the parameter of on . + //! Throws Standard_NoSuchObject if no parameter on edge Standard_EXPORT static Standard_Real Parameter (const TopoDS_Vertex& V, const TopoDS_Edge& E); //! Returns the parameters of the vertex on the diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_TVertex.cxx opencascade-7.5.1+dfsg1/src/BRep/BRep_TVertex.cxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_TVertex.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_TVertex.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,3 +47,21 @@ return TV; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void BRep_TVertex::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TopoDS_TVertex) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPnt) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTolerance) + for (BRep_ListIteratorOfListOfPointRepresentation itr(myPoints); itr.More(); itr.Next()) + { + const Handle(BRep_PointRepresentation)& aPointRepresentation = itr.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aPointRepresentation.get()) + } +} diff -Nru opencascade-7.4.1+dfsg1/src/BRep/BRep_TVertex.hxx opencascade-7.5.1+dfsg1/src/BRep/BRep_TVertex.hxx --- opencascade-7.4.1+dfsg1/src/BRep/BRep_TVertex.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRep/BRep_TVertex.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -62,6 +62,9 @@ //! Returns a copy of the TShape with no sub-shapes. Standard_EXPORT Handle(TopoDS_TShape) EmptyCopy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo.cxx opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -421,9 +421,18 @@ isReverse = !IsFwdSeq(1); } - TopoDS_Vertex FirstVtx_final = FirstVertex; + TopoDS_Vertex FirstVtx_final, LastVtx_final; + if (isReverse) + { + FirstVtx_final = LastVertex; + LastVtx_final = FirstVertex; + } + else + { + FirstVtx_final = FirstVertex; + LastVtx_final = LastVertex; + } FirstVtx_final.Orientation(TopAbs_FORWARD); - TopoDS_Vertex LastVtx_final = LastVertex; LastVtx_final.Orientation(TopAbs_REVERSED); if (CurveSeq.IsEmpty()) @@ -497,6 +506,9 @@ concatcurve->SetValue(concatcurve->Lower(), Concat.BSplineCurve()); } + if (isReverse) { + concatcurve->ChangeValue(concatcurve->Lower())->Reverse(); + } ResEdge = BRepLib_MakeEdge(concatcurve->Value(concatcurve->Lower()), FirstVtx_final, LastVtx_final, concatcurve->Value(concatcurve->Lower())->FirstParameter(), diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_FaceRestrictor.cxx opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_FaceRestrictor.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_FaceRestrictor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_FaceRestrictor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -361,7 +361,7 @@ else { TopoDS_Shape aLocalShape = Faces.First().EmptyCopied(); TopoDS_Face NF = TopoDS::Face(aLocalShape); - // TopoDS_Face NF = TopoDS::Face(Faces.First().EmptyCopied());; + // TopoDS_Face NF = TopoDS::Face(Faces.First().EmptyCopied()); B.Add (NF,WI); Faces.Append (NF); BuildFaceIn (NF, WI, KeyContains, KeyIsIn, TopAbs_FORWARD,Faces); diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_Image.cxx opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_Image.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_Image.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_Image.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -309,3 +309,55 @@ } +//======================================================================= +//function : RemoveRoot +//purpose : +//======================================================================= +void BRepAlgo_Image::RemoveRoot (const TopoDS_Shape& Root) +{ + Standard_Boolean isRemoved = Standard_False; + for (TopTools_ListOfShape::Iterator it (roots); it.More(); it.Next()) + { + if (Root.IsSame (it.Value())) + { + roots.Remove (it); + isRemoved = Standard_True; + break; + } + } + + if (!isRemoved) + return; + + const TopTools_ListOfShape* pNewS = down.Seek (Root); + if (pNewS) + { + for (TopTools_ListOfShape::Iterator it (*pNewS); it.More(); it.Next()) + { + const TopoDS_Shape *pOldS = up.Seek (it.Value()); + if (pOldS && pOldS->IsSame (Root)) + up.UnBind (it.Value()); + } + down.UnBind (Root); + } +} + +//======================================================================= +//function : ReplaceRoot +//purpose : +//======================================================================= +void BRepAlgo_Image::ReplaceRoot (const TopoDS_Shape& OldRoot, + const TopoDS_Shape& NewRoot) +{ + if (!HasImage (OldRoot)) + return; + + const TopTools_ListOfShape& aLImage = Image (OldRoot); + if (HasImage (NewRoot)) + Add (NewRoot, aLImage); + else + Bind (NewRoot, aLImage); + + SetRoot (NewRoot); + RemoveRoot (OldRoot); +} diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_Image.hxx opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_Image.hxx --- opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_Image.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_Image.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -60,6 +60,14 @@ //! Remove to set of images. Standard_EXPORT void Remove (const TopoDS_Shape& S); + //! Removes the root from the list of roots and up and down maps. + Standard_EXPORT void RemoveRoot (const TopoDS_Shape& Root); + + //! Replaces the with the , so all images + //! of the become the images of the . + //! The is removed. + Standard_EXPORT void ReplaceRoot (const TopoDS_Shape& OldRoot, const TopoDS_Shape& NewRoot); + Standard_EXPORT const TopTools_ListOfShape& Roots() const; Standard_EXPORT Standard_Boolean IsImage (const TopoDS_Shape& S) const; diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_Loop.cxx opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_Loop.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_Loop.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_Loop.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,8 +23,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -160,6 +162,15 @@ } } +//======================================================================= +//function : SetImageVV +//purpose : +//======================================================================= + +void BRepAlgo_Loop::SetImageVV (const BRepAlgo_Image& theImageVV) +{ + myImageVV = theImageVV; +} //======================================================================= //function : UpdateClosedEdge @@ -606,6 +617,8 @@ TopoDS_Wire NW; Standard_Boolean End; + UpdateVEmap (MVE); + TopTools_MapOfShape UsedEdges; while (MVE.Extent() > 0) { @@ -924,6 +937,7 @@ { VerVerMap = myVerticesForSubstitute; } + //======================================================================= //function : VerticesForSubstitute //purpose : @@ -933,3 +947,123 @@ { myVerticesForSubstitute = VerVerMap; } + +//======================================================================= +//function : UpdateVEmap +//purpose : +//======================================================================= + +void BRepAlgo_Loop::UpdateVEmap (TopTools_IndexedDataMapOfShapeListOfShape& theVEmap) +{ + TopTools_IndexedDataMapOfShapeListOfShape VerLver; + + for (Standard_Integer ii = 1; ii <= theVEmap.Extent(); ii++) + { + const TopoDS_Vertex& aVertex = TopoDS::Vertex (theVEmap.FindKey(ii)); + const TopTools_ListOfShape& aElist = theVEmap(ii); + if (aElist.Extent() == 1 && myImageVV.IsImage(aVertex)) + { + const TopoDS_Vertex& aProVertex = TopoDS::Vertex (myImageVV.ImageFrom(aVertex)); + if (VerLver.Contains(aProVertex)) + { + TopTools_ListOfShape& aVlist = VerLver.ChangeFromKey(aProVertex); + aVlist.Append (aVertex.Oriented(TopAbs_FORWARD)); + } + else + { + TopTools_ListOfShape aVlist; + aVlist.Append (aVertex.Oriented(TopAbs_FORWARD)); + VerLver.Add (aProVertex, aVlist); + } + } + } + + if (VerLver.IsEmpty()) + return; + + BRep_Builder aBB; + for (Standard_Integer ii = 1; ii <= VerLver.Extent(); ii++) + { + const TopTools_ListOfShape& aVlist = VerLver(ii); + if (aVlist.Extent() == 1) + continue; + + Standard_Real aMaxTol = 0.; + TColgp_Array1OfPnt Points (1, aVlist.Extent()); + + TopTools_ListIteratorOfListOfShape itl (aVlist); + Standard_Integer jj = 0; + for (; itl.More(); itl.Next()) + { + const TopoDS_Vertex& aVertex = TopoDS::Vertex (itl.Value()); + Standard_Real aTol = BRep_Tool::Tolerance(aVertex); + aMaxTol = Max (aMaxTol, aTol); + gp_Pnt aPnt = BRep_Tool::Pnt(aVertex); + Points(++jj) = aPnt; + } + + gp_Ax2 anAxis; + Standard_Boolean IsSingular; + GeomLib::AxeOfInertia (Points, anAxis, IsSingular); + gp_Pnt aCentre = anAxis.Location(); + Standard_Real aMaxDist = 0.; + for (jj = 1; jj <= Points.Upper(); jj++) + { + Standard_Real aSqDist = aCentre.SquareDistance (Points(jj)); + aMaxDist = Max (aMaxDist, aSqDist); + } + aMaxDist = Sqrt(aMaxDist); + aMaxTol = Max (aMaxTol, aMaxDist); + + //Find constant vertex + TopoDS_Vertex aConstVertex; + for (itl.Initialize(aVlist); itl.More(); itl.Next()) + { + const TopoDS_Vertex& aVertex = TopoDS::Vertex (itl.Value()); + const TopTools_ListOfShape& aElist = theVEmap.FindFromKey(aVertex); + const TopoDS_Shape& anEdge = aElist.First(); + TopTools_ListIteratorOfListOfShape itcedges (myConstEdges); + for (; itcedges.More(); itcedges.Next()) + if (anEdge.IsSame (itcedges.Value())) + { + aConstVertex = aVertex; + break; + } + if (!aConstVertex.IsNull()) + break; + } + if (aConstVertex.IsNull()) + aConstVertex = TopoDS::Vertex(aVlist.First()); + aBB.UpdateVertex (aConstVertex, aCentre, aMaxTol); + + for (itl.Initialize(aVlist); itl.More(); itl.Next()) + { + const TopoDS_Vertex& aVertex = TopoDS::Vertex (itl.Value()); + if (aVertex.IsSame(aConstVertex)) + continue; + + const TopTools_ListOfShape& aElist = theVEmap.FindFromKey (aVertex); + TopoDS_Edge anEdge = TopoDS::Edge (aElist.First()); + anEdge.Orientation(TopAbs_FORWARD); + TopoDS_Vertex aV1, aV2; + TopExp::Vertices (anEdge, aV1, aV2); + TopoDS_Vertex aVertexToRemove = (aV1.IsSame(aVertex))? aV1 : aV2; + anEdge.Free(Standard_True); + aBB.Remove (anEdge, aVertexToRemove); + aBB.Add (anEdge, aConstVertex.Oriented (aVertexToRemove.Orientation())); + } + } + + TopTools_IndexedMapOfShape Emap; + for (Standard_Integer ii = 1; ii <= theVEmap.Extent(); ii++) + { + const TopTools_ListOfShape& aElist = theVEmap(ii); + TopTools_ListIteratorOfListOfShape itl (aElist); + for (; itl.More(); itl.Next()) + Emap.Add (itl.Value()); + } + + theVEmap.Clear(); + for (Standard_Integer ii = 1; ii <= Emap.Extent(); ii++) + TopExp::MapShapesAndAncestors (Emap(ii), TopAbs_VERTEX, TopAbs_EDGE, theVEmap); +} diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_Loop.hxx opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_Loop.hxx --- opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_Loop.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_Loop.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,8 @@ #include #include #include +#include +#include class TopoDS_Face; class TopoDS_Edge; @@ -53,9 +55,15 @@ //! Add as a set of const edges. Standard_EXPORT void AddConstEdges (const TopTools_ListOfShape& LE); + //! Sets the Image Vertex - Vertex + Standard_EXPORT void SetImageVV (const BRepAlgo_Image& theImageVV); + //! Make loops. Standard_EXPORT void Perform(); + //! Update VE map according to Image Vertex - Vertex + Standard_EXPORT void UpdateVEmap (TopTools_IndexedDataMapOfShapeListOfShape& theVEmap); + //! Cut the edge in several edges on the //! vertices. Standard_EXPORT void CutEdge (const TopoDS_Edge& E, const TopTools_ListOfShape& VonE, TopTools_ListOfShape& NE) const; @@ -102,6 +110,7 @@ TopTools_ListOfShape myNewFaces; TopTools_DataMapOfShapeListOfShape myCutEdges; TopTools_DataMapOfShapeShape myVerticesForSubstitute; + BRepAlgo_Image myImageVV; }; diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_NormalProjection.cxx opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_NormalProjection.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgo/BRepAlgo_NormalProjection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgo/BRepAlgo_NormalProjection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -363,9 +363,8 @@ #ifdef OCCT_DEBUG_CHRONO InitChron(chr_approx); #endif - Approx_CurveOnSurface appr(HPCur, hsur, Udeb, Ufin, myTol3d, - myContinuity, myMaxDegree, myMaxSeg, - Only3d, Only2d); + Approx_CurveOnSurface appr(HPCur, hsur, Udeb, Ufin, myTol3d); + appr.Perform(myMaxSeg, myMaxDegree, myContinuity, Only3d, Only2d); #ifdef OCCT_DEBUG_CHRONO ResultChron(chr_approx,t_approx); approx_count++; diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Algo.hxx opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Algo.hxx --- opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Algo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Algo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,9 +24,8 @@ #include #include #include -class Message_ProgressIndicator; -class TopoDS_Shape; +class TopoDS_Shape; //! Provides the root interface for the API algorithms diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_BooleanOperation.cxx opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_BooleanOperation.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_BooleanOperation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_BooleanOperation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -280,7 +280,7 @@ fprintf(afile,"%s\n","# Result is Null "); fprintf(afile, "%s %s %s\n","restore", aName1.ToCString(), "arg1"); - fprintf(afile, "%s %s %s\n","restore", aName2.ToCString(), "arg2");; + fprintf(afile, "%s %s %s\n","restore", aName2.ToCString(), "arg2"); TCollection_AsciiString aBopString; switch (theOperation) { diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.cxx opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_BuilderAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -125,7 +125,10 @@ myDSFiller->SetArguments(theArgs); // Set options for intersection myDSFiller->SetRunParallel(myRunParallel); - myDSFiller->SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + myDSFiller->SetProgressIndicator(*myProgressScope); + } myDSFiller->SetFuzzyValue(myFuzzyValue); myDSFiller->SetNonDestructive(myNonDestructive); myDSFiller->SetGlue(myGlue); @@ -145,7 +148,10 @@ { // Set options to the builder myBuilder->SetRunParallel(myRunParallel); - myBuilder->SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + myBuilder->SetProgressIndicator(*myProgressScope); + } myBuilder->SetCheckInverted(myCheckInverted); myBuilder->SetToFillHistory(myFillHistory); // Perform building of the result with pre-calculated intersections diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Check.cxx opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Check.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Check.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Check.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -94,7 +94,10 @@ anAnalyzer.SelfInterMode() = myTestSI; // Set options from BOPAlgo_Options anAnalyzer.SetRunParallel(myRunParallel); - anAnalyzer.SetProgressIndicator(myProgressIndicator); + if (myProgressScope != NULL) + { + anAnalyzer.SetProgressIndicator(*myProgressScope); + } anAnalyzer.SetFuzzyValue(myFuzzyValue); // Perform the check anAnalyzer.Perform(); diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Common.cxx opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Common.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Common.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Common.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,9 +55,7 @@ const TopoDS_Shape& S2) : BRepAlgoAPI_BooleanOperation(S1, S2, BOPAlgo_COMMON) { - BRepAlgoAPI_BooleanOperation* pBO= - (BRepAlgoAPI_BooleanOperation*) (void*) this; - pBO->Build(); + Build(); } //======================================================================= //function : BRepAlgoAPI_Common @@ -68,9 +66,7 @@ const BOPAlgo_PaveFiller& aDSF) : BRepAlgoAPI_BooleanOperation(S1, S2, aDSF, BOPAlgo_COMMON) { - BRepAlgoAPI_BooleanOperation* pBO= - (BRepAlgoAPI_BooleanOperation*) (void*) this; - pBO->Build(); + Build(); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Cut.cxx opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Cut.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Cut.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Cut.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -56,9 +56,7 @@ : BRepAlgoAPI_BooleanOperation(S1, S2, BOPAlgo_CUT) { - BRepAlgoAPI_BooleanOperation* pBO= - (BRepAlgoAPI_BooleanOperation*) (void*) this; - pBO->Build(); + Build(); } //======================================================================= //function : BRepAlgoAPI_Cut @@ -72,7 +70,5 @@ BRepAlgoAPI_BooleanOperation(S1, S2, aDSF, (bFWD) ? BOPAlgo_CUT : BOPAlgo_CUT21) { - BRepAlgoAPI_BooleanOperation* pBO= - (BRepAlgoAPI_BooleanOperation*) (void*) this; - pBO->Build(); + Build(); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Fuse.cxx opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Fuse.cxx --- opencascade-7.4.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Fuse.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepAlgoAPI/BRepAlgoAPI_Fuse.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -56,9 +56,7 @@ : BRepAlgoAPI_BooleanOperation(S1, S2, BOPAlgo_FUSE) { - BRepAlgoAPI_BooleanOperation* pBO= - (BRepAlgoAPI_BooleanOperation*) (void*) this; - pBO->Build(); + Build(); } //======================================================================= //function : BRepAlgoAPI_Fuse @@ -70,7 +68,5 @@ : BRepAlgoAPI_BooleanOperation(S1, S2, aDSF, BOPAlgo_FUSE) { - BRepAlgoAPI_BooleanOperation* pBO= - (BRepAlgoAPI_BooleanOperation*) (void*) this; - pBO->Build(); + Build(); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_AppSurface.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_AppSurface.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_AppSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_AppSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -126,8 +126,8 @@ return approx.TolCurveOnSurf(Index); } -inline void BRepBlend_AppSurface::TolReached (Standard_Real& Tol3d, - Standard_Real& Tol2d) const +void BRepBlend_AppSurface::TolReached (Standard_Real& Tol3d, + Standard_Real& Tol2d) const { Tol3d = approx.MaxErrorOnSurf(); Tol2d = 0; diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_CurvPointRadInv.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_CurvPointRadInv.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_CurvPointRadInv.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_CurvPointRadInv.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,7 +26,10 @@ //======================================================================= BRepBlend_CurvPointRadInv::BRepBlend_CurvPointRadInv (const Handle(Adaptor3d_HCurve)& C1, - const Handle(Adaptor3d_HCurve)& C2) : curv1(C1), curv2(C2) + const Handle(Adaptor3d_HCurve)& C2) +: curv1(C1), + curv2(C2), + choix(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_Extremity.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_Extremity.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_Extremity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_Extremity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -63,7 +63,8 @@ const Standard_Real Tol) : pt(P), tang(gp_Vec(0,0,0)), - param(Param),u(W),tol(Tol),isvtx(Standard_False), + param(Param),u(W),v(0.0), + tol(Tol),isvtx(Standard_False), hastang(Standard_False) {} diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_PointOnRst.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_PointOnRst.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_PointOnRst.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_PointOnRst.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,7 +18,10 @@ #include #include -BRepBlend_PointOnRst::BRepBlend_PointOnRst () {} +BRepBlend_PointOnRst::BRepBlend_PointOnRst () +: prm(0.0) +{ +} BRepBlend_PointOnRst::BRepBlend_PointOnRst(const Handle(Adaptor2d_HCurve2d)& A, diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_RstRstConstRad.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_RstRstConstRad.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_RstRstConstRad.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_RstRstConstRad.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -68,10 +68,13 @@ surf1(Surf1), surf2(Surf2), rst1(Rst1), rst2(Rst2), cons1(Rst1, Surf1), cons2(Rst2, Surf2), guide(CGuide), tguide(CGuide), - istangent(Standard_True), maxang(RealFirst()), minang(RealLast()), - distmin(RealLast()), - mySShape(BlendFunc_Rational) -{} + prmrst1(0.0), prmrst2(0.0), + istangent(Standard_True), ray(0.0), + choix(0), normtg(0.0), theD(0.0), + maxang(RealFirst()), minang(RealLast()), + distmin(RealLast()), mySShape(BlendFunc_Rational) +{ +} //======================================================================= //function : NbVariables diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_RstRstLineBuilder.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_RstRstLineBuilder.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_RstRstLineBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_RstRstLineBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -174,8 +174,13 @@ const Handle(Adaptor3d_HSurface)& Surf2, const Handle(Adaptor2d_HCurve2d)& Rst2, const Handle(Adaptor3d_TopolTool)& Domain2): - sol(1,2), surf1(Surf1), domain1(Domain1), - surf2(Surf2), domain2(Domain2), rst1(Rst1), rst2(Rst2) + done(Standard_False), sol(1, 2), surf1(Surf1), + domain1(Domain1), surf2(Surf2), + domain2(Domain2), rst1(Rst1), rst2(Rst2), + tolesp(0.0), tolgui(0.0), pasmax(0.0), + fleche(0.0), param(0.0), rebrou(Standard_False), + iscomplete(Standard_False), comptra(Standard_False), sens(0.0), + decrochdeb(Blend_NoDecroch), decrochfin(Blend_NoDecroch) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_SurfCurvConstRadInv.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_SurfCurvConstRadInv.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_SurfCurvConstRadInv.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_SurfCurvConstRadInv.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,12 @@ BRepBlend_SurfCurvConstRadInv::BRepBlend_SurfCurvConstRadInv (const Handle(Adaptor3d_HSurface)& S, const Handle(Adaptor3d_HCurve)& C, - const Handle(Adaptor3d_HCurve)& Cg) : surf(S),curv(C),guide(Cg) + const Handle(Adaptor3d_HCurve)& Cg) +: surf(S), + curv(C), + guide(Cg), + ray(0.0), + choix(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_SurfPointConstRadInv.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_SurfPointConstRadInv.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_SurfPointConstRadInv.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_SurfPointConstRadInv.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,11 @@ //======================================================================= BRepBlend_SurfPointConstRadInv::BRepBlend_SurfPointConstRadInv (const Handle(Adaptor3d_HSurface)& S, - const Handle(Adaptor3d_HCurve)& C) : surf(S), curv(C) + const Handle(Adaptor3d_HCurve)& C) +: surf(S), + curv(C), + ray(0.0), + choix(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstConstRad.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstConstRad.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstConstRad.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstConstRad.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -66,10 +66,12 @@ const Handle(Adaptor3d_HCurve)& CGuide): surf(Surf), surfrst(SurfRst), rst(Rst), cons(Rst,SurfRst), guide(CGuide), tguide(CGuide), - istangent(Standard_True), theD(0.), maxang(RealFirst()), minang(RealLast()), - distmin(RealLast()), - mySShape(BlendFunc_Rational) -{} + prmrst(0.0), istangent(Standard_True), + ray(0.0), choix(0), normtg(0.0), + theD(0.), maxang(RealFirst()), minang(RealLast()), + distmin(RealLast()), mySShape(BlendFunc_Rational) +{ +} //======================================================================= //function : NbVariables @@ -878,7 +880,7 @@ gp_Vec d1u1,d1v1,d2u1,d2v1,d2uv1,d1; gp_Vec ns,ns2,dnplan,dnw,dn2w; //,np2,dnp2; - gp_Vec ncrossns;; + gp_Vec ncrossns; gp_Vec resulu,resulv,temp,tgct,resul; gp_Vec d1urst,d1vrst; gp_Pnt Center,bid; diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstEvolRad.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstEvolRad.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstEvolRad.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstEvolRad.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -887,7 +887,7 @@ gp_Vec d1u1,d1v1,d2u1,d2v1,d2uv1,d1; gp_Vec ns,ns2,dnplan,dnw,dn2w;//,np2,dnp2; - gp_Vec ncrossns;; + gp_Vec ncrossns; gp_Vec resulu,resulv,temp,tgct,resul; gp_Vec d1urst,d1vrst; gp_Pnt Center,bid; diff -Nru opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstLineBuilder.cxx opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstLineBuilder.cxx --- opencascade-7.4.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstLineBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBlend/BRepBlend_SurfRstLineBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -212,8 +212,13 @@ const Handle(Adaptor3d_HSurface)& Surf2, const Handle(Adaptor2d_HCurve2d)& Rst, const Handle(Adaptor3d_TopolTool)& Domain2): - sol(1,3),surf1(Surf1), domain1(Domain1), - surf2(Surf2), rst(Rst), domain2(Domain2) + done(Standard_False), sol(1, 3), surf1(Surf1), + domain1(Domain1), surf2(Surf2), rst(Rst), + domain2(Domain2), tolesp(0.0), tolgui(0.0), + pasmax(0.0), fleche(0.0), param(0.0), + rebrou(Standard_False), iscomplete(Standard_False), + comptra(Standard_False), sens(0.0), + decrochdeb(Standard_False), decrochfin(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepBndLib/BRepBndLib.cxx opencascade-7.5.1+dfsg1/src/BRepBndLib/BRepBndLib.cxx --- opencascade-7.4.1+dfsg1/src/BRepBndLib/BRepBndLib.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBndLib/BRepBndLib.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -653,7 +653,7 @@ { if(anExtr.NbExt() > 0) { - Standard_Integer i, imin = 0;; + Standard_Integer i, imin = 0; Standard_Real dmin = RealLast(); Standard_Real uextr = 0., vextr = 0.; Extrema_POnSurf P1, P2; diff -Nru opencascade-7.4.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_FastSewing.cxx opencascade-7.5.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_FastSewing.cxx --- opencascade-7.4.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_FastSewing.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_FastSewing.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -581,8 +581,11 @@ BRepBuilderAPI_FastSewing::NodeInspector:: NodeInspector(const NCollection_Vector& theVec, const gp_Pnt& thePnt, - const Standard_Real theTol): -myVecOfVertexes(theVec), myPoint(thePnt), myResID(-1) + const Standard_Real theTol) +: myVecOfVertexes(theVec), + myPoint(thePnt), + myResID(-1), + myIsFindingEnable(Standard_False) { mySQToler = theTol*theTol; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx opencascade-7.5.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx --- opencascade-7.4.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -85,8 +85,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -1812,10 +1811,10 @@ #include #endif -void BRepBuilderAPI_Sewing::Perform(const Handle(Message_ProgressIndicator)& thePI) +void BRepBuilderAPI_Sewing::Perform(const Message_ProgressRange& theProgress) { const Standard_Integer aNumberOfStages = myAnalysis + myCutting + mySewing + 2; - Message_ProgressSentry aPS (thePI, "Sewing", 0, aNumberOfStages, 1); + Message_ProgressScope aPS (theProgress, "Sewing", aNumberOfStages); #ifdef OCCT_DEBUG Standard_Real t_total = 0., t_analysis = 0., t_assembling = 0., t_cutting = 0., t_merging = 0.; OSD_Chronometer chr_total, chr_local; @@ -1831,10 +1830,9 @@ chr_local.Reset(); chr_local.Start(); #endif - FaceAnalysis (thePI); + FaceAnalysis (aPS.Next()); if (!aPS.More()) return; - aPS.Next(); #ifdef OCCT_DEBUG chr_local.Stop(); chr_local.Show(t_analysis); @@ -1855,10 +1853,9 @@ chr_local.Reset(); chr_local.Start(); #endif - VerticesAssembling (thePI); + VerticesAssembling (aPS.Next()); if (!aPS.More()) return; - aPS.Next(); #ifdef OCCT_DEBUG chr_local.Stop(); chr_local.Show(t_assembling); @@ -1871,10 +1868,9 @@ chr_local.Reset(); chr_local.Start(); #endif - Cutting (thePI); + Cutting (aPS.Next()); if (!aPS.More()) return; - aPS.Next(); #ifdef OCCT_DEBUG chr_local.Stop(); chr_local.Show(t_cutting); @@ -1886,10 +1882,9 @@ chr_local.Reset(); chr_local.Start(); #endif - Merging (Standard_True, thePI); + Merging (Standard_True, aPS.Next()); if (!aPS.More()) return; - aPS.Next(); #ifdef OCCT_DEBUG chr_local.Stop(); chr_local.Show(t_merging); @@ -1898,10 +1893,10 @@ } else { - aPS.Next( 1, Handle(TCollection_HAsciiString)()); + aPS.Next(); if (myCutting) - aPS.Next( 1, Handle(TCollection_HAsciiString)()); - aPS.Next( 1, Handle(TCollection_HAsciiString)()); + aPS.Next(); + aPS.Next(); if (!aPS.More()) return; } @@ -1913,7 +1908,7 @@ std::cout << "Creating sewed shape..." << std::endl; #endif // examine the multiple edges if any and process sameparameter for edges if necessary - EdgeProcessing (thePI); + EdgeProcessing (aPS.Next()); if (!aPS.More()) return; CreateSewedShape(); @@ -1923,7 +1918,7 @@ return; } - EdgeRegularity (thePI); + EdgeRegularity (aPS.Next()); if (mySameParameterMode && myFaceMode) SameParameterShape(); @@ -2235,7 +2230,7 @@ // myDegenerated //======================================================================= -void BRepBuilderAPI_Sewing::FaceAnalysis(const Handle(Message_ProgressIndicator)& thePI) +void BRepBuilderAPI_Sewing::FaceAnalysis(const Message_ProgressRange& theProgress) { if (!myShape.IsNull() && myOldShapes.IsEmpty()) { Add(myShape); @@ -2246,7 +2241,7 @@ TopTools_MapOfShape SmallEdges; TopTools_IndexedDataMapOfShapeListOfShape GluedVertices; Standard_Integer i = 1; - Message_ProgressSentry aPS (thePI, "Shape analysis", 0, myOldShapes.Extent(), 1); + Message_ProgressScope aPS (theProgress, "Shape analysis", myOldShapes.Extent()); for (i = 1; i <= myOldShapes.Extent() && aPS.More(); i++, aPS.Next()) { for (TopExp_Explorer fexp(myOldShapes(i),TopAbs_FACE); fexp.More(); fexp.Next()) { @@ -2777,7 +2772,7 @@ TopTools_DataMapOfShapeListOfShape& aNodeEdges, const TopTools_IndexedDataMapOfShapeListOfShape& aBoundFaces, const Standard_Real Tolerance, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { // Create map of node -> vertices TopTools_IndexedDataMapOfShapeListOfShape NodeVertices; @@ -2805,7 +2800,7 @@ #endif // Merge nearest nodes TopTools_IndexedDataMapOfShapeShape NodeNearestNode; - Message_ProgressSentry aPS (theProgress, "Glueing nodes", 0, nbNodes, 1, Standard_True); + Message_ProgressScope aPS (theProgress, "Glueing nodes", nbNodes, Standard_True); for (Standard_Integer i = 1; i <= nbNodes && aPS.More(); i++, aPS.Next()) { const TopoDS_Vertex& node1 = TopoDS::Vertex(NodeVertices.FindKey(i)); // Find near nodes @@ -2938,11 +2933,11 @@ return CreateNewNodes(NodeNearestNode,NodeVertices,aVertexNode,aNodeEdges); } -void BRepBuilderAPI_Sewing::VerticesAssembling(const Handle(Message_ProgressIndicator)& thePI) +void BRepBuilderAPI_Sewing::VerticesAssembling(const Message_ProgressRange& theProgress) { Standard_Integer nbVert = myVertexNode.Extent(); Standard_Integer nbVertFree = myVertexNodeFree.Extent(); - Message_ProgressSentry aPS (thePI, "Vertices assembling", 0, 2, 1); + Message_ProgressScope aPS (theProgress, "Vertices assembling", 2); if (nbVert || nbVertFree) { // Fill map node -> sections Standard_Integer i; @@ -2964,16 +2959,15 @@ #ifdef OCCT_DEBUG std::cout << "Assemble " << nbVert << " vertices on faces..." << std::endl; #endif - while (GlueVertices(myVertexNode,myNodeSections,myBoundFaces,myTolerance, thePI)); + while (GlueVertices(myVertexNode,myNodeSections,myBoundFaces,myTolerance, aPS.Next())); } if (!aPS.More()) return; - aPS.Next(); if (nbVertFree) { #ifdef OCCT_DEBUG std::cout << "Assemble " << nbVertFree << " vertices on floating edges..." << std::endl; #endif - while (GlueVertices(myVertexNodeFree,myNodeSections,myBoundFaces,myTolerance, thePI)); + while (GlueVertices(myVertexNodeFree,myNodeSections,myBoundFaces,myTolerance, aPS.Next())); } } } @@ -3133,11 +3127,11 @@ //======================================================================= void BRepBuilderAPI_Sewing::Merging(const Standard_Boolean /* firstTime */, - const Handle(Message_ProgressIndicator)& thePI) + const Message_ProgressRange& theProgress) { BRep_Builder B; // TopTools_MapOfShape MergedEdges; - Message_ProgressSentry aPS (thePI, "Merging bounds", 0, myBoundFaces.Extent(), 1); + Message_ProgressScope aPS (theProgress, "Merging bounds", myBoundFaces.Extent()); TopTools_IndexedDataMapOfShapeListOfShape::Iterator anIterB(myBoundFaces); for (; anIterB.More() && aPS.More(); anIterB.Next(), aPS.Next()) { @@ -3623,7 +3617,7 @@ // myCuttingNode //======================================================================= -void BRepBuilderAPI_Sewing::Cutting(const Handle(Message_ProgressIndicator)& thePI) +void BRepBuilderAPI_Sewing::Cutting(const Message_ProgressRange& theProgress) { Standard_Integer i, nbVertices = myVertexNode.Extent(); if (!nbVertices) return; @@ -3646,7 +3640,7 @@ Standard_Real first, last; // Iterate on all boundaries Standard_Integer nbBounds = myBoundFaces.Extent(); - Message_ProgressSentry aPS (thePI, "Cutting bounds", 0, nbBounds, 1); + Message_ProgressScope aPS (theProgress, "Cutting bounds", nbBounds); TopTools_IndexedDataMapOfShapeListOfShape::Iterator anIterB(myBoundFaces); for (; anIterB.More() && aPS.More(); anIterB.Next(), aPS.Next()) { const TopoDS_Edge& bound = TopoDS::Edge(anIterB.Key()); @@ -3986,12 +3980,12 @@ // - make the contigous edges sameparameter //======================================================================= -void BRepBuilderAPI_Sewing::EdgeProcessing(const Handle(Message_ProgressIndicator)& thePI) +void BRepBuilderAPI_Sewing::EdgeProcessing(const Message_ProgressRange& theProgress) { // constructs sectionEdge TopTools_IndexedMapOfShape MapFreeEdges; TopTools_DataMapOfShapeShape EdgeFace; - Message_ProgressSentry aPS (thePI, "Edge processing", 0, myBoundFaces.Extent(), 1); + Message_ProgressScope aPS (theProgress, "Edge processing", myBoundFaces.Extent()); TopTools_IndexedDataMapOfShapeListOfShape::Iterator anIterB(myBoundFaces); for (; anIterB.More() && aPS.More(); anIterB.Next(), aPS.Next()) { const TopoDS_Shape& bound = anIterB.Key(); @@ -4051,12 +4045,12 @@ //purpose : update Continuity flag on newly created edges //======================================================================= -void BRepBuilderAPI_Sewing::EdgeRegularity(const Handle(Message_ProgressIndicator)& thePI) +void BRepBuilderAPI_Sewing::EdgeRegularity(const Message_ProgressRange& theProgress) { TopTools_IndexedDataMapOfShapeListOfShape aMapEF; TopExp::MapShapesAndAncestors(mySewedShape, TopAbs_EDGE, TopAbs_FACE, aMapEF); - Message_ProgressSentry aPS(thePI, "Encode edge regularity", 0, myMergedEdges.Extent(), 1); + Message_ProgressScope aPS(theProgress, "Encode edge regularity", myMergedEdges.Extent()); for (TopTools_MapIteratorOfMapOfShape aMEIt(myMergedEdges); aMEIt.More() && aPS.More(); aMEIt.Next(), aPS.Next()) { TopoDS_Edge anEdge = TopoDS::Edge(myReShape->Apply(aMEIt.Value())); diff -Nru opencascade-7.4.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.hxx opencascade-7.5.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.hxx --- opencascade-7.4.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepBuilderAPI/BRepBuilderAPI_Sewing.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,13 +41,12 @@ #include #include -#include +#include class BRepTools_ReShape; class Standard_OutOfRange; class Standard_NoSuchObject; class TopoDS_Shape; -class Message_ProgressIndicator; class TopoDS_Edge; class TopoDS_Face; class Geom_Surface; @@ -105,8 +104,8 @@ Standard_EXPORT void Add (const TopoDS_Shape& shape); //! Computing - //! thePI - progress indicator of algorithm - Standard_EXPORT void Perform (const Handle(Message_ProgressIndicator)& thePI = 0); + //! theProgress - progress indicator of algorithm + Standard_EXPORT void Perform (const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Gives the sewed shape //! a null shape if nothing constructed @@ -248,10 +247,10 @@ //! Performs cutting of sections - //! thePI - progress indicator of processing - Standard_EXPORT void Cutting (const Handle(Message_ProgressIndicator)& thePI = 0); + //! theProgress - progress indicator of processing + Standard_EXPORT void Cutting (const Message_ProgressRange& theProgress = Message_ProgressRange()); - Standard_EXPORT void Merging (const Standard_Boolean passage, const Handle(Message_ProgressIndicator)& thePI = 0); + Standard_EXPORT void Merging (const Standard_Boolean passage, const Message_ProgressRange& theProgress = Message_ProgressRange()); Standard_EXPORT Standard_Boolean IsMergedClosed (const TopoDS_Edge& Edge1, const TopoDS_Edge& Edge2, const TopoDS_Face& fase) const; @@ -262,10 +261,10 @@ //! Merged nearest edges. Standard_EXPORT Standard_Boolean MergedNearestEdges (const TopoDS_Shape& edge, TopTools_SequenceOfShape& SeqMergedEdge, TColStd_SequenceOfBoolean& SeqMergedOri); - Standard_EXPORT void EdgeProcessing (const Handle(Message_ProgressIndicator)& thePI = 0); + Standard_EXPORT void EdgeProcessing (const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Recompute regularity on merged edges - Standard_EXPORT void EdgeRegularity (const Handle(Message_ProgressIndicator)& thePI = 0); + Standard_EXPORT void EdgeRegularity (const Message_ProgressRange& theProgress = Message_ProgressRange()); Standard_EXPORT void CreateOutputInformations(); @@ -277,8 +276,8 @@ //! This method is called from Perform only - //! thePI - progress indicator of processing - Standard_EXPORT virtual void FaceAnalysis (const Handle(Message_ProgressIndicator)& thePI = 0); + //! theProgress - progress indicator of processing + Standard_EXPORT virtual void FaceAnalysis (const Message_ProgressRange& theProgress = Message_ProgressRange()); //! This method is called from Perform only @@ -286,8 +285,8 @@ //! This method is called from Perform only - //! thePI - progress indicator of processing - Standard_EXPORT virtual void VerticesAssembling (const Handle(Message_ProgressIndicator)& thePI = 0); + //! theProgress - progress indicator of processing + Standard_EXPORT virtual void VerticesAssembling (const Message_ProgressRange& theProgress = Message_ProgressRange()); //! This method is called from Perform only diff -Nru opencascade-7.4.1+dfsg1/src/BRepCheck/BRepCheck_Face.cxx opencascade-7.5.1+dfsg1/src/BRepCheck/BRepCheck_Face.cxx --- opencascade-7.4.1+dfsg1/src/BRepCheck/BRepCheck_Face.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepCheck/BRepCheck_Face.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -82,6 +82,9 @@ //======================================================================= BRepCheck_Face::BRepCheck_Face (const TopoDS_Face& F) +: myIntres(BRepCheck_NoError), + myImbres(BRepCheck_NoError), + myOrires(BRepCheck_NoError) { Init(F); myIntdone = Standard_False; diff -Nru opencascade-7.4.1+dfsg1/src/BRepCheck/BRepCheck_Shell.cxx opencascade-7.5.1+dfsg1/src/BRepCheck/BRepCheck_Shell.cxx --- opencascade-7.4.1+dfsg1/src/BRepCheck/BRepCheck_Shell.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepCheck/BRepCheck_Shell.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -111,6 +111,11 @@ //======================================================================= BRepCheck_Shell::BRepCheck_Shell(const TopoDS_Shell& S) +: myNbori(0), + myCdone(Standard_False), + myCstat(BRepCheck_NoError), + myOdone(Standard_False), + myOstat(BRepCheck_NoError) { Init(S); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepCheck/BRepCheck_Wire.cxx opencascade-7.5.1+dfsg1/src/BRepCheck/BRepCheck_Wire.cxx --- opencascade-7.4.1+dfsg1/src/BRepCheck/BRepCheck_Wire.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepCheck/BRepCheck_Wire.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -130,6 +130,9 @@ //purpose : //======================================================================= BRepCheck_Wire::BRepCheck_Wire(const TopoDS_Wire& W) +: myCdone(Standard_False), + myCstat(BRepCheck_NoError), + myGctrl(Standard_False) { Init(W); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepClass/BRepClass_FaceExplorer.cxx opencascade-7.5.1+dfsg1/src/BRepClass/BRepClass_FaceExplorer.cxx --- opencascade-7.4.1+dfsg1/src/BRepClass/BRepClass_FaceExplorer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepClass/BRepClass_FaceExplorer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include static const Standard_Real Probing_Start = 0.123; static const Standard_Real Probing_End = 0.7; @@ -140,7 +141,7 @@ gp_Lin2d& L, Standard_Real& Par) { - TopExp_Explorer anExpF(myFace,TopAbs_EDGE); + TopExp_Explorer anExpF(myFace, TopAbs_EDGE); Standard_Integer i; Standard_Real aFPar; Standard_Real aLPar; @@ -153,7 +154,7 @@ if (i != myCurEdgeInd) continue; - const TopoDS_Shape &aLocalShape = anExpF.Current(); + const TopoDS_Shape &aLocalShape = anExpF.Current(); const TopAbs_Orientation anOrientation = aLocalShape.Orientation(); if (anOrientation == TopAbs_FORWARD || anOrientation == TopAbs_REVERSED) { @@ -162,27 +163,29 @@ aC2d = BRep_Tool::CurveOnSurface(anEdge, myFace, aFPar, aLPar); if (!aC2d.IsNull()) { - // Treatment of infinite cases. - if (Precision::IsNegativeInfinite(aFPar)) { - if (Precision::IsPositiveInfinite(aLPar)) { - aFPar = -1.; - aLPar = 1.; - } else { - aFPar = aLPar - 1.; - } - } else if (Precision::IsPositiveInfinite(aLPar)) - aLPar = aFPar + 1.; + // Treatment of infinite cases. + if (Precision::IsNegativeInfinite(aFPar)) { + if (Precision::IsPositiveInfinite(aLPar)) { + aFPar = -1.; + aLPar = 1.; + } + else { + aFPar = aLPar - 1.; + } + } + else if (Precision::IsPositiveInfinite(aLPar)) + aLPar = aFPar + 1.; - for (; myCurEdgePar < Probing_End ;myCurEdgePar += Probing_Step) { - aParamIn = myCurEdgePar*aFPar + (1. - myCurEdgePar)*aLPar; + for (; myCurEdgePar < Probing_End; myCurEdgePar += Probing_Step) { + aParamIn = myCurEdgePar*aFPar + (1. - myCurEdgePar)*aLPar; gp_Vec2d aTanVec; - aC2d->D1(aParamIn, aPOnC, aTanVec); - Par = aPOnC.SquareDistance(P); + aC2d->D1(aParamIn, aPOnC, aTanVec); + Par = aPOnC.SquareDistance(P); - if (Par > aTolParConf2) { - gp_Vec2d aLinVec(P, aPOnC); - gp_Dir2d aLinDir(aLinVec); + if (Par > aTolParConf2) { + gp_Vec2d aLinVec(P, aPOnC); + gp_Dir2d aLinDir(aLinVec); Standard_Real aTanMod = aTanVec.SquareMagnitude(); if (aTanMod < aTolParConf2) @@ -190,8 +193,10 @@ aTanVec /= Sqrt(aTanMod); Standard_Real aSinA = aTanVec.Crossed(aLinDir.XY()); const Standard_Real SmallAngle = 0.001; + Standard_Boolean isSmallAngle = Standard_False; if (Abs(aSinA) < SmallAngle) { + isSmallAngle = Standard_True; // The line from the input point P to the current point on edge // is tangent to the edge curve. This condition is bad for classification. // Therefore try to go to another point in the hope that there will be @@ -201,28 +206,66 @@ continue; } - L = gp_Lin2d(P, aLinDir); + L = gp_Lin2d(P, aLinDir); - // Check if ends of a curve lie on a line. - aC2d->D0(aFPar, aPOnC); - - if (L.SquareDistance(aPOnC) > aTolParConf2) { - aC2d->D0(aLPar, aPOnC); - - if (L.SquareDistance(aPOnC) > aTolParConf2) { - myCurEdgePar += Probing_Step; - - if (myCurEdgePar >= Probing_End) { - myCurEdgeInd++; - myCurEdgePar = Probing_Start; - } - - Par = Sqrt(Par); - return Standard_True; - } - } - } - } + // Check if ends of a curve lie on a line. + aC2d->D0(aFPar, aPOnC); + gp_Pnt2d aFPOnC = aPOnC; + if (L.SquareDistance(aPOnC) > aTolParConf2) { + aC2d->D0(aLPar, aPOnC); + if (L.SquareDistance(aPOnC) > aTolParConf2) { + + if (isSmallAngle) + { + //Try to find minimal distance between curve and line + + Geom2dAPI_ProjectPointOnCurve aProj; + aProj.Init(P, aC2d, aFPar, aLPar); + if (aProj.NbPoints() > 0) + { + gp_Pnt2d aLPOnC = aPOnC; + Standard_Real aFDist = P.SquareDistance(aFPOnC); + Standard_Real aLDist = P.SquareDistance(aLPOnC); + Standard_Real aMinDist = aProj.LowerDistance(); + aMinDist *= aMinDist; + aPOnC = aProj.NearestPoint(); + if (aMinDist > aFDist) + { + aMinDist = aFDist; + aPOnC = aFPOnC; + } + // + if (aMinDist > aLDist) + { + aMinDist = aLDist; + aPOnC = aLPOnC; + } + // + if (aMinDist < Par) + { + Par = aMinDist; + if (Par < aTolParConf2) + { + continue; + } + aLinVec.SetXY((aPOnC.XY() - P.XY())); + aLinDir.SetXY(aLinVec.XY()); + L = gp_Lin2d(P, aLinDir); + } + } + } + myCurEdgePar += Probing_Step; + if (myCurEdgePar >= Probing_End) { + myCurEdgeInd++; + myCurEdgePar = Probing_Start; + } + + Par = Sqrt(Par); + return Standard_True; + } + } + } + } } // if (!aC2d.IsNull()) { } // if (anOrientation == TopAbs_FORWARD ... @@ -233,7 +276,7 @@ // nothing found, return an horizontal line Par = RealLast(); - L = gp_Lin2d(P,gp_Dir2d(1,0)); + L = gp_Lin2d(P, gp_Dir2d(1, 0)); return Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepClass/BRepClass_Intersector.cxx opencascade-7.5.1+dfsg1/src/BRepClass/BRepClass_Intersector.cxx --- opencascade-7.4.1+dfsg1/src/BRepClass/BRepClass_Intersector.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepClass/BRepClass_Intersector.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,6 +35,13 @@ #include #include +static +void GetTangentAsChord(const Handle(Geom2d_Curve)& thePCurve, + gp_Dir2d& theTangent, + const Standard_Real theParam, + const Standard_Real theFirst, + const Standard_Real theLast); + static void RefineTolerance(const TopoDS_Face& aF, const Geom2dAdaptor_Curve& aC, @@ -169,12 +176,21 @@ gp_Dir2d& Norm, Standard_Real& C) const { - Standard_Real f,l; - Geom2dLProp_CLProps2d Prop(BRep_Tool::CurveOnSurface(E.Edge(),E.Face(),f,l), - U,2,Precision::PConfusion()); - Prop.Tangent(Tang); - C = Prop.Curvature(); - if (C > Precision::PConfusion()) + Standard_Real fpar, lpar; + Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(E.Edge(), E.Face(), fpar, lpar); + Geom2dLProp_CLProps2d Prop(aPCurve, U, 2, Precision::PConfusion()); + + C = 0.; + if (Prop.IsTangentDefined()) + { + Prop.Tangent(Tang); + C = Prop.Curvature(); + } + else + GetTangentAsChord(aPCurve, Tang, U, fpar, lpar); + + if (C > Precision::PConfusion() && + !Precision::IsInfinite(C)) Prop.Normal(Norm); else Norm.SetCoord(Tang.Y(),-Tang.X()); @@ -220,4 +236,31 @@ } } +//======================================================================= +//function : GetTangentAsChord +//purpose : +//======================================================================= +void GetTangentAsChord(const Handle(Geom2d_Curve)& thePCurve, + gp_Dir2d& theTangent, + const Standard_Real theParam, + const Standard_Real theFirst, + const Standard_Real theLast) +{ + Standard_Real Offset = 0.1*(theLast - theFirst); + if (theLast - theParam < Precision::PConfusion()) //theParam == theLast + Offset *= -1; + else if (theParam + Offset > theLast) // is close to + Offset = 0.5*(theLast - theParam); + + gp_Pnt2d aPnt2d = thePCurve->Value(theParam); + gp_Pnt2d OffsetPnt2d = thePCurve->Value(theParam + Offset); + + gp_Vec2d aChord(aPnt2d, OffsetPnt2d); + if (Offset < 0.) + aChord.Reverse(); + + Standard_Real SqLength = aChord.SquareMagnitude(); + if (SqLength > Precision::SquarePConfusion()) + theTangent = aChord; +} diff -Nru opencascade-7.4.1+dfsg1/src/BRepClass3d/BRepClass3d_Intersector3d.cxx opencascade-7.5.1+dfsg1/src/BRepClass3d/BRepClass3d_Intersector3d.cxx --- opencascade-7.4.1+dfsg1/src/BRepClass3d/BRepClass3d_Intersector3d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepClass3d/BRepClass3d_Intersector3d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,7 +31,12 @@ //============================================================================ BRepClass3d_Intersector3d::BRepClass3d_Intersector3d() - : done(Standard_False),hasapoint(Standard_False) +: U(0.0), + V(0.0), + W(0.0), + done(Standard_False), + hasapoint(Standard_False), + state(TopAbs_UNKNOWN) { } //============================================================================ diff -Nru opencascade-7.4.1+dfsg1/src/BRepClass3d/BRepClass3d_SClassifier.cxx opencascade-7.5.1+dfsg1/src/BRepClass3d/BRepClass3d_SClassifier.cxx --- opencascade-7.4.1+dfsg1/src/BRepClass3d/BRepClass3d_SClassifier.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepClass3d/BRepClass3d_SClassifier.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -61,7 +61,8 @@ //function : BRepClass3d_SClassifier //purpose : //======================================================================= -BRepClass3d_SClassifier::BRepClass3d_SClassifier() +BRepClass3d_SClassifier::BRepClass3d_SClassifier() +: myState(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepClass3d/BRepClass3d_SolidClassifier.cxx opencascade-7.5.1+dfsg1/src/BRepClass3d/BRepClass3d_SolidClassifier.cxx --- opencascade-7.4.1+dfsg1/src/BRepClass3d/BRepClass3d_SolidClassifier.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepClass3d/BRepClass3d_SolidClassifier.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -96,7 +96,9 @@ } BRepClass3d_SolidClassifier::BRepClass3d_SolidClassifier(const TopoDS_Shape& S) -: aSolidLoaded(Standard_True),explorer(S) +: aSolidLoaded(Standard_True), + explorer(S), + isaholeinspace(Standard_False) { #if LBRCOMPT STAT.NbConstrShape++; diff -Nru opencascade-7.4.1+dfsg1/src/BRepClass3d/BRepClass3d_SolidExplorer.cxx opencascade-7.5.1+dfsg1/src/BRepClass3d/BRepClass3d_SolidExplorer.cxx --- opencascade-7.4.1+dfsg1/src/BRepClass3d/BRepClass3d_SolidExplorer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepClass3d/BRepClass3d_SolidExplorer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -771,7 +771,10 @@ //purpose : //======================================================================= -BRepClass3d_SolidExplorer::BRepClass3d_SolidExplorer() +BRepClass3d_SolidExplorer::BRepClass3d_SolidExplorer() +: myReject(Standard_True), + myFirstFace(0), + myParamOnEdge(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepExtrema/BRepExtrema_DistShapeShape.cxx opencascade-7.5.1+dfsg1/src/BRepExtrema/BRepExtrema_DistShapeShape.cxx --- opencascade-7.4.1+dfsg1/src/BRepExtrema/BRepExtrema_DistShapeShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepExtrema/BRepExtrema_DistShapeShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,7 +35,6 @@ #include #include #include -#include #include #include @@ -81,7 +80,12 @@ Standard_Real Distance; //!< Distance between sub-shapes //! Uninitialized constructor for collection. - BRepExtrema_CheckPair() {} + BRepExtrema_CheckPair() + : Index1(0), + Index2(0), + Distance(0.0) + { + } //! Creates new pair of sub-shapes. BRepExtrema_CheckPair (Standard_Integer theIndex1, diff -Nru opencascade-7.4.1+dfsg1/src/BRepExtrema/BRepExtrema_SelfIntersection.hxx opencascade-7.5.1+dfsg1/src/BRepExtrema/BRepExtrema_SelfIntersection.hxx --- opencascade-7.4.1+dfsg1/src/BRepExtrema/BRepExtrema_SelfIntersection.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepExtrema/BRepExtrema_SelfIntersection.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -96,21 +96,21 @@ protected: //! Filter out correct adjacent mesh elements. - virtual BRepExtrema_ElementFilter::FilterResult PreCheckElements (const Standard_Integer theIndex1, - const Standard_Integer theIndex2); + Standard_EXPORT virtual BRepExtrema_ElementFilter::FilterResult PreCheckElements (const Standard_Integer theIndex1, + const Standard_Integer theIndex2); //! Checks if the given triangles have only single common vertex. - BRepExtrema_ElementFilter::FilterResult isRegularSharedVertex (const BVH_Vec3d& theSharedVert, - const BVH_Vec3d& theTrng1Vtxs1, - const BVH_Vec3d& theTrng1Vtxs2, - const BVH_Vec3d& theTrng2Vtxs1, - const BVH_Vec3d& theTrng2Vtxs2); + Standard_EXPORT BRepExtrema_ElementFilter::FilterResult isRegularSharedVertex (const BVH_Vec3d& theSharedVert, + const BVH_Vec3d& theTrng1Vtxs1, + const BVH_Vec3d& theTrng1Vtxs2, + const BVH_Vec3d& theTrng2Vtxs1, + const BVH_Vec3d& theTrng2Vtxs2); //! Checks if the given triangles have only single common edge. - BRepExtrema_ElementFilter::FilterResult isRegularSharedEdge (const BVH_Vec3d& theTrng1Vtxs0, - const BVH_Vec3d& theTrng1Vtxs1, - const BVH_Vec3d& theTrng1Vtxs2, - const BVH_Vec3d& theTrng2Vtxs2); + Standard_EXPORT BRepExtrema_ElementFilter::FilterResult isRegularSharedEdge (const BVH_Vec3d& theTrng1Vtxs0, + const BVH_Vec3d& theTrng1Vtxs1, + const BVH_Vec3d& theTrng1Vtxs2, + const BVH_Vec3d& theTrng2Vtxs2); private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat.cxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat.cxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -676,7 +676,7 @@ break; case BRepFeat_EmptyCutResult : s << "Failure in Cut : Empty resulting shape"; - break;; + break; case BRepFeat_FalseSide : s << "Verify plane and wire orientation"; break; diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_Form.cxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_Form.cxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_Form.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_Form.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1015,7 +1015,11 @@ Standard_Boolean BRepFeat_Form::IsDeleted(const TopoDS_Shape& F) { - return (myMap(F).IsEmpty()); + if (myMap.IsBound(F)) + { + return (myMap(F).IsEmpty()); + } + return Standard_False; } //======================================================================= @@ -1026,16 +1030,23 @@ const TopTools_ListOfShape& BRepFeat_Form::Modified (const TopoDS_Shape& F) { + myGenerated.Clear(); + if (!IsDone()) + return myGenerated; + + if (mySbase.IsEqual(F)) + { + myGenerated.Append(myShape); + return myGenerated; + } + if (myMap.IsBound(F)) { - static TopTools_ListOfShape list; - list.Clear(); // For the second passage DPF TopTools_ListIteratorOfListOfShape ite(myMap(F)); for(; ite.More(); ite.Next()) { const TopoDS_Shape& sh = ite.Value(); - if(!sh.IsSame(F)) - list.Append(sh); + if(!sh.IsSame(F) && sh.ShapeType() == F.ShapeType()) + myGenerated.Append(sh); } - return list; } return myGenerated; // empty list } @@ -1048,19 +1059,20 @@ const TopTools_ListOfShape& BRepFeat_Form::Generated (const TopoDS_Shape& S) { - if (myMap.IsBound(S) && - S.ShapeType() != TopAbs_FACE) { // check if filter on face or not - static TopTools_ListOfShape list; - list.Clear(); // For the second passage DPF + myGenerated.Clear(); + if (!IsDone()) + return myGenerated; + if (myMap.IsBound(S) && + S.ShapeType() != TopAbs_FACE) { // check if filter on face or not TopTools_ListIteratorOfListOfShape ite(myMap(S)); for(; ite.More(); ite.Next()) { const TopoDS_Shape& sh = ite.Value(); if(!sh.IsSame(S)) - list.Append(sh); + myGenerated.Append(sh); } - return list; + return myGenerated; } - else return myGenerated; + return myGenerated; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakeDPrism.hxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakeDPrism.hxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakeDPrism.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakeDPrism.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -74,7 +74,9 @@ Init (Sbase, Pbase, Skface, Angle, Fuse, Modify); } - BRepFeat_MakeDPrism() + BRepFeat_MakeDPrism() + : myAngle(RealLast()), + myStatusError(BRepFeat_OK) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakeLinearForm.lxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakeLinearForm.lxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakeLinearForm.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakeLinearForm.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,11 @@ //purpose : //======================================================================= -inline BRepFeat_MakeLinearForm::BRepFeat_MakeLinearForm () {} +inline BRepFeat_MakeLinearForm::BRepFeat_MakeLinearForm () +: myBnd(0.0), + myTol(0.0) +{ +} //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakePrism.lxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakePrism.lxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakePrism.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakePrism.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,10 @@ //purpose : //======================================================================= -inline BRepFeat_MakePrism::BRepFeat_MakePrism () {} +inline BRepFeat_MakePrism::BRepFeat_MakePrism () +: myStatusError(BRepFeat_OK) +{ +} //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevol.lxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevol.lxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevol.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevol.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,10 @@ //purpose : //======================================================================= -inline BRepFeat_MakeRevol::BRepFeat_MakeRevol () {} +inline BRepFeat_MakeRevol::BRepFeat_MakeRevol () +: myStatusError(BRepFeat_OK) +{ +} //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevolutionForm.cxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevolutionForm.cxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevolutionForm.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevolutionForm.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1055,6 +1055,7 @@ if(ex1.Current().IsSame(e1)) { myLFMap(iter.Key()).Clear(); myLFMap(iter.Key()).Append(ex2.Current()); + break; // break the cycle (e1 became a dead reference) } ex2.Next(); } @@ -1062,16 +1063,14 @@ TopTools_DataMapIteratorOfDataMapOfShapeListOfShape iter1(mySlface); for(; iter1.More(); iter1.Next()) { - const TopoDS_Shape& f1 = iter1.Key(); const TopoDS_Shape& e1 = iter1.Value().First(); TopExp_Explorer ex1(myPbase, TopAbs_EDGE); TopExp_Explorer ex2(Pbase, TopAbs_EDGE); for(; ex1.More(); ex1.Next()) { - const TopoDS_Shape& E1 = ex1.Current(); - const TopoDS_Shape& E2 = ex2.Current(); - if(E1.IsSame(e1)) { - mySlface(f1).Clear(); - mySlface(f1).Append(E2); + if(ex1.Current().IsSame(e1)) { + mySlface(iter1.Key()).Clear(); + mySlface(iter1.Key()).Append(ex2.Current()); + break; // break the cycle (e1 became a dead reference) } ex2.Next(); } @@ -1158,9 +1157,9 @@ const TopoDS_Shape& sh = it1.Value().First(); exx.Init(VraiForm, TopAbs_FACE); for(; exx.More(); exx.Next()) { - const TopoDS_Face& fac = TopoDS::Face(exx.Current()); + TopoDS_Face fac = TopoDS::Face(exx.Current()); TopExp_Explorer exx1(fac, TopAbs_WIRE); - const TopoDS_Wire& thew = TopoDS::Wire(exx1.Current()); + TopoDS_Wire thew = TopoDS::Wire(exx1.Current()); if(thew.IsSame(myFShape)) { const TopTools_ListOfShape& desfaces = trP.Modified(f2); myMap(myFShape) = desfaces; @@ -1172,13 +1171,13 @@ continue; } if(fac.IsSame(sh)) { - if (trP.IsDeleted(fac)) { - } - else { + if (! trP.IsDeleted(fac)) + { const TopTools_ListOfShape& desfaces = trP.Modified(fac); if(!desfaces.IsEmpty()) { myMap(orig).Clear(); myMap(orig) = trP.Modified(fac); + break; // break the cycle (sh became a dead reference) } } } diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevolutionForm.lxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevolutionForm.lxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevolutionForm.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_MakeRevolutionForm.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,16 @@ //purpose : //======================================================================= -inline BRepFeat_MakeRevolutionForm::BRepFeat_MakeRevolutionForm () {} +inline BRepFeat_MakeRevolutionForm::BRepFeat_MakeRevolutionForm () +: myHeight1(0.0), + myHeight2(0.0), + mySliding(Standard_False), + myBnd(0.0), + myTol(0.0), + myAngle1(RealLast()), + myAngle2(RealLast()) +{ +} //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_RibSlot.lxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_RibSlot.lxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_RibSlot.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_RibSlot.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,5 +19,9 @@ //purpose : //======================================================================= -inline BRepFeat_RibSlot::BRepFeat_RibSlot () -{} +inline BRepFeat_RibSlot::BRepFeat_RibSlot () +: myFuse(Standard_False), + mySliding(Standard_False), + myStatusError(BRepFeat_OK) +{ +} diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_SplitShape.cxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_SplitShape.cxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_SplitShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_SplitShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include //======================================================================= //function : Build @@ -38,6 +39,7 @@ if (mySShape.IsDone()) { Done(); myShape = mySShape.ResultingShape(); + myRight.Clear(); } } @@ -64,6 +66,33 @@ return mySShape.Left(); } + +//======================================================================= +//function : Right +//purpose : +//======================================================================= + +const TopTools_ListOfShape& BRepFeat_SplitShape::Right() const +{ + if (myRight.IsEmpty()) + { + TopTools_MapOfShape aMapOfLeft; + TopTools_ListIteratorOfListOfShape anIterator; + for (anIterator.Initialize(mySShape.Left()); anIterator.More(); anIterator.Next()) + { + aMapOfLeft.Add(anIterator.Value()); + } + TopExp_Explorer anExplorer; + for (anExplorer.Init(myShape, TopAbs_FACE); anExplorer.More(); anExplorer.Next()) + { + const TopoDS_Shape& aFace = anExplorer.Current(); + if (!aMapOfLeft.Contains(aFace)) + myRight.Append(aFace); + } + } + return myRight; +} + //======================================================================= //function : isDeleted //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_SplitShape.hxx opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_SplitShape.hxx --- opencascade-7.4.1+dfsg1/src/BRepFeat/BRepFeat_SplitShape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFeat/BRepFeat_SplitShape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -105,6 +105,9 @@ //! Raises NotDone if IsDone returns . Standard_EXPORT const TopTools_ListOfShape& Left() const; + //! Returns the faces of the "right" part on the shape. + Standard_EXPORT const TopTools_ListOfShape& Right() const; + //! Builds the cut and the resulting faces and edges as well. Standard_EXPORT void Build() Standard_OVERRIDE; @@ -130,6 +133,8 @@ LocOpe_Spliter mySShape; Handle(LocOpe_WiresOnShape) myWOnShape; + mutable TopTools_ListOfShape myRight; + }; diff -Nru opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_ComputeCLine.hxx opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_ComputeCLine.hxx --- opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_ComputeCLine.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_ComputeCLine.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,6 +70,12 @@ //! By default inverse order is used. Standard_EXPORT void SetInvOrder(const Standard_Boolean theInvOrder); + //! Set value of hang checking flag + //! if this flag = true, possible hang of algorithm is checked + //! and algorithm is forced to stop. + //! By default hang checking is used. + Standard_EXPORT void SetHangChecking(const Standard_Boolean theHangChecking); + //! returns False if at a moment of the approximation, //! the status NoApproximation has been sent by the user //! when more points were needed. @@ -125,6 +131,7 @@ AppParCurves_Constraint mylastC; Standard_Integer myMaxSegments; Standard_Boolean myInvOrder; + Standard_Boolean myHangChecking; }; diff -Nru opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Evolved.cxx opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Evolved.cxx --- opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Evolved.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Evolved.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -149,9 +149,6 @@ TColStd_SequenceOfReal& ThePar, TopTools_SequenceOfShape& S); -static TopAbs_Orientation OriEdgeInFace (const TopoDS_Edge& E, - const TopoDS_Face& F); - static Standard_Integer PosOnFace (Standard_Real d1, Standard_Real d2, Standard_Real d3); @@ -986,8 +983,8 @@ // skin => same orientation E[0] , inverted orientation E[2] // if contreskin it is inverted. //-------------------------------------------------------------- - E[0].Orientation(OriEdgeInFace(E[0],F[0])); - E[2].Orientation(OriEdgeInFace(E[2],F[1])); + E[0].Orientation(BRepTools::OriEdgeInFace(E[0],F[0])); + E[2].Orientation(BRepTools::OriEdgeInFace(E[2],F[1])); if (DistanceToOZ(VF) < DistanceToOZ(VL) ) { // Skin @@ -1199,14 +1196,14 @@ TopTools_ListIteratorOfListOfShape itl; const TopTools_ListOfShape& LF = myMap(CurrentSpine)(VCF); - TopAbs_Orientation Ori = OriEdgeInFace(TopoDS::Edge(LF.First()), + TopAbs_Orientation Ori = BRepTools::OriEdgeInFace(TopoDS::Edge(LF.First()), CurrentFace); for (itl.Initialize(LF), itl.Next(); itl.More(); itl.Next()) { TopoDS_Edge RE = TopoDS::Edge(itl.Value()); MapBis(CurrentFace).Append(RE.Oriented(Ori)); } const TopTools_ListOfShape& LL = myMap(CurrentSpine)(VCL); - Ori = OriEdgeInFace(TopoDS::Edge(LL.First()),CurrentFace); + Ori = BRepTools::OriEdgeInFace(TopoDS::Edge(LL.First()),CurrentFace); for (itl.Initialize(LL), itl.Next() ; itl.More(); itl.Next()) { TopoDS_Edge RE = TopoDS::Edge(itl.Value()); MapBis(CurrentFace).Append(RE.Oriented(Ori)); @@ -2920,26 +2917,6 @@ return TopAbs_REVERSED; } -//======================================================================= -//function : OriEdgeInFace -//purpose : -//======================================================================= - -TopAbs_Orientation OriEdgeInFace (const TopoDS_Edge& E, - const TopoDS_Face& F ) - -{ - TopExp_Explorer Exp(F.Oriented(TopAbs_FORWARD),TopAbs_EDGE); - - for (; Exp.More() ;Exp.Next()) { - if (Exp.Current().IsSame(E)) { - return Exp.Current().Orientation(); - } - } - throw Standard_ConstructionError("BRepFill_Evolved::OriEdgeInFace"); -} - - //======================================================================= //function : IsOnFace diff -Nru opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Filling.cxx opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Filling.cxx --- opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Filling.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Filling.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -234,8 +235,6 @@ if (IsBound) { myBoundary.Append( EdgeFaceAndOrder ); - TopTools_ListOfShape EmptyList; - myOldNewMap.Bind(anEdge, EmptyList); return myBoundary.Length(); } else @@ -258,8 +257,6 @@ if (IsBound) { myBoundary.Append( EdgeFaceAndOrder ); - TopTools_ListOfShape EmptyList; - myOldNewMap.Bind(anEdge, EmptyList); return myBoundary.Length(); } else @@ -460,7 +457,9 @@ aDist < BRep_Tool::Tolerance(V_edge[j])) { MW.Add(CurEdge); - myOldNewMap(CurEdge).Append(MW.Edge()); + TopoDS_Edge NewEdge = MW.Edge(); + myOldNewMap.Bind(CurEdge.Oriented(TopAbs_FORWARD), + NewEdge.Oriented(TopAbs_FORWARD)); EdgeList.Remove(Itl); found = Standard_True; break; @@ -704,25 +703,47 @@ { const TopoDS_Edge& InitEdge = myBoundary(i).myEdge; TopoDS_Edge anEdge = InitEdge; - if (!myOldNewMap(anEdge).IsEmpty()) - anEdge = TopoDS::Edge( myOldNewMap(anEdge).First() ); + anEdge.Orientation(TopAbs_FORWARD); + if (myOldNewMap.IsBound(anEdge)) + anEdge = TopoDS::Edge(myOldNewMap(anEdge)); + Handle(Geom2d_Curve) aCurveOnPlate = CurvesOnPlate->Value(i); TopoDS_Edge NewEdge = TopoDS::Edge(anEdge.EmptyCopied()); - TopoDS_Vertex V1, V2; - TopExp::Vertices(anEdge, V1, V2, Standard_True); //with orientation - BB.UpdateVertex(V1, dmax); - BB.UpdateVertex(V2, dmax); - BB.Add(NewEdge, V1); - BB.Add(NewEdge, V2); + TopoDS_Vertex V1, V2, NewV1, NewV2; + TopExp::Vertices(anEdge, V1, V2); + + if (myOldNewMap.IsBound(V1)) + NewV1 = TopoDS::Vertex(myOldNewMap(V1)); + else + { + gp_Pnt aPnt = BRep_Tool::Pnt(V1); + NewV1 = BRepLib_MakeVertex(aPnt); + BB.UpdateVertex(NewV1, dmax); + myOldNewMap.Bind(V1.Oriented(TopAbs_FORWARD), NewV1); + } + + if (myOldNewMap.IsBound(V2)) + NewV2 = TopoDS::Vertex(myOldNewMap(V2)); + else + { + gp_Pnt aPnt = BRep_Tool::Pnt(V2); + NewV2 = BRepLib_MakeVertex(aPnt); + BB.UpdateVertex(NewV2, dmax); + myOldNewMap.Bind(V2.Oriented(TopAbs_FORWARD), NewV2); + } + + NewV1.Orientation(TopAbs_FORWARD); + BB.Add(NewEdge, NewV1); + NewV2.Orientation(TopAbs_REVERSED); + BB.Add(NewEdge, NewV2); TopLoc_Location Loc; BB.UpdateEdge(NewEdge, aCurveOnPlate, Surface, Loc, dmax); //BRepLib::SameRange(NewEdge); BRepLib::SameParameter(NewEdge, dmax, Standard_True); FinalEdges.Append(NewEdge); - myOldNewMap(InitEdge).Clear(); - myOldNewMap(InitEdge).Append(NewEdge); + myOldNewMap.Bind(InitEdge.Oriented(TopAbs_FORWARD), NewEdge.Oriented(TopAbs_FORWARD)); } TopoDS_Wire FinalWire = WireFromList(FinalEdges); diff -Nru opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Filling.hxx opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Filling.hxx --- opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Filling.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Filling.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -207,7 +207,7 @@ BRepFill_SequenceOfEdgeFaceAndOrder myConstraints; BRepFill_SequenceOfFaceAndOrder myFreeConstraints; GeomPlate_SequenceOfPointConstraint myPoints; - TopTools_DataMapOfShapeListOfShape myOldNewMap; + TopTools_DataMapOfShapeShape myOldNewMap; TopTools_ListOfShape myGenerated; TopoDS_Face myFace; TopoDS_Face myInitFace; diff -Nru opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_OffsetWire.cxx opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_OffsetWire.cxx --- opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_OffsetWire.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_OffsetWire.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -275,9 +275,9 @@ Handle(Geom2d_Curve) OC; if (AHC->GetType() == GeomAbs_Line) { - if (E.Orientation() == TopAbs_REVERSED) + if (E.Orientation() == TopAbs_FORWARD) anOffset *= -1; - Adaptor2d_OffsetCurve Off(AHC,anOffset); + Adaptor2d_OffsetCurve Off(AHC, anOffset); OC = new Geom2d_Line(Off.Line()); } else if (AHC->GetType() == GeomAbs_Circle) @@ -298,7 +298,7 @@ if (E.Orientation() == TopAbs_FORWARD) anOffset *= -1; Handle(Geom2d_TrimmedCurve) G2dT = new Geom2d_TrimmedCurve(aPCurve, f, l); - OC = new Geom2d_OffsetCurve( G2dT, anOffset); + OC = new Geom2d_OffsetCurve(G2dT, anOffset); } Handle(Geom_Surface) aSurf = BRep_Tool::Surface(mySpine); Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurf); @@ -2032,7 +2032,7 @@ Standard_Real f,l; Standard_Real anOffset = Offset; - if (E.Orientation() == TopAbs_REVERSED) anOffset *= -1; + if (E.Orientation() == TopAbs_FORWARD) anOffset *= -1; Handle(Geom2d_Curve) G2d = BRep_Tool::CurveOnSurface(E,F,f,l); Handle(Geom2d_Curve) G2dOC; @@ -2060,14 +2060,14 @@ gp_Dir2d Xd = axes.XDirection(); gp_Dir2d Yd = axes.YDirection(); Standard_Real Crossed = Xd.X()*Yd.Y()-Xd.Y()*Yd.X(); - Standard_Real Signe = ( Crossed > 0.) ? 1. : -1.; + Standard_Real Signe = ( Crossed > 0.) ? -1. : 1.; if (anOffset*Signe < AC.Circle().Radius() - Precision::Confusion()) { Handle(Geom2dAdaptor_HCurve) AHC = new Geom2dAdaptor_HCurve(G2d); - Adaptor2d_OffsetCurve Off(AHC,-anOffset); - Handle(Geom2d_Circle) CC = new Geom2d_Circle(Off.Circle()); + Adaptor2d_OffsetCurve Off(AHC, anOffset); + Handle(Geom2d_Circle) CC = new Geom2d_Circle(Off.Circle()); Standard_Real Delta = 2*M_PI - l + f; if (theJoinType == GeomAbs_Arc) @@ -2101,7 +2101,7 @@ else if (AC.GetType() == GeomAbs_Line) { Handle(Geom2dAdaptor_HCurve) AHC = new Geom2dAdaptor_HCurve(G2d); - Adaptor2d_OffsetCurve Off(AHC,anOffset); + Adaptor2d_OffsetCurve Off(AHC, anOffset); Handle(Geom2d_Line) CC = new Geom2d_Line(Off.Line()); Standard_Real Delta = (l - f); if (ToExtendFirstPar) @@ -2122,7 +2122,6 @@ } else { - anOffset = -anOffset; Handle(Geom2d_TrimmedCurve) G2dT = new Geom2d_TrimmedCurve(G2d,f,l); G2dOC = new Geom2d_OffsetCurve( G2dT, anOffset); diff -Nru opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Pipe.cxx opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Pipe.cxx --- opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Pipe.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Pipe.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -434,7 +434,7 @@ TopoDS_Edge BRepFill_Pipe::Edge(const TopoDS_Edge& ESpine, const TopoDS_Vertex& VProfile) { - Standard_Integer ii, ispin = 0, iprof = 0, count = 0;; + Standard_Integer ii, ispin = 0, iprof = 0, count = 0; // ************************************************* // Search if VProfile is a Vertex of myProfile @@ -760,8 +760,11 @@ TopoDS_Face F; for (ii=InitialLength+1; ii<=myFaces->ColLength(); ii++) { for (jj=1; jj<=myFaces->RowLength(); jj++) { - F = TopoDS::Face(myFaces->Value(ii, jj)); - if (!F.IsNull()) B.Add(result, F); + if (myFaces->Value(ii, jj).ShapeType() == TopAbs_FACE) + { + F = TopoDS::Face(myFaces->Value(ii, jj)); + if (!F.IsNull()) B.Add(result, F); + } } } diff -Nru opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Sweep.cxx opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Sweep.cxx --- opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Sweep.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Sweep.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -330,8 +330,9 @@ if (!HasPCurves(E)) { Handle(Geom2dAdaptor_HCurve) HC2d = new Geom2dAdaptor_HCurve( Pcurv ); - Approx_CurveOnSurface AppCurve(HC2d, S, HC2d->FirstParameter(), HC2d->LastParameter(), - Precision::Confusion(), GeomAbs_C1, 10, 10, Standard_True); + Approx_CurveOnSurface AppCurve(HC2d, S, HC2d->FirstParameter(), HC2d->LastParameter(), + Precision::Confusion()); + AppCurve.Perform(10, 10, GeomAbs_C1, Standard_True); if (AppCurve.IsDone() && AppCurve.HasResult()) { C3d = AppCurve.Curve3d(); @@ -1618,7 +1619,7 @@ // Control direction & Range Standard_Real R, First, Last, Tol=1.e-4; - Standard_Boolean reverse = Standard_False;; + Standard_Boolean reverse = Standard_False; // Class BRep_Tool without fields and without Constructor : @@ -2922,38 +2923,46 @@ Standard_Real Extend = 0.0; if (NbTrous==1) Extend = EvalExtrapol(1, Transition); isDone = BuildShell(Transition, - 1, NbPath+1, + 1, NbPath+1, ReversedEdges, Tapes, Rails, - Extend, Extend); + Extend, Extend); } else { // This is done piece by piece Standard_Integer IFirst = 1, ILast; for (ii=1, isDone=Standard_True; - ii<=NbPart && isDone; ii++) { - if (ii > NbTrous) ILast = NbPath+1; - else ILast = Trous->Value(ii); - isDone = BuildShell(Transition, - IFirst, ILast, + ii<=NbPart && isDone; ii++) { + if (ii > NbTrous) ILast = NbPath+1; + else ILast = Trous->Value(ii); + isDone = BuildShell(Transition, + IFirst, ILast, ReversedEdges, Tapes, Rails, - EvalExtrapol(IFirst, Transition), - EvalExtrapol(ILast, Transition)); - if (IFirst>1) { - Translate(myVEdges, IFirst, Bounds, 2); - PerformCorner(IFirst, - Transition, Bounds); - } - IFirst = ILast; - Translate(myVEdges, IFirst, Bounds, 1); + EvalExtrapol(IFirst, Transition), + EvalExtrapol(ILast, Transition)); + if (IFirst>1) { + Translate(myVEdges, IFirst, Bounds, 2); + if (!PerformCorner(IFirst, + Transition, Bounds)) + { + isDone = Standard_False; + return; + } + } + IFirst = ILast; + Translate(myVEdges, IFirst, Bounds, 1); } } // Management of looping ends if ( (NbTrous>0) && (myLoc->IsClosed()) && - (Trous->Value(NbTrous) == NbPath+1) ) { + (Trous->Value(NbTrous) == NbPath+1) ) { Translate(myVEdges, NbPath+1, Bounds, 1); Translate(myVEdges, 1, Bounds, 2); - PerformCorner(1, Transition, Bounds); + if (!PerformCorner(1, Transition, Bounds)) + { + isDone = Standard_False; + return; + } Translate(myVEdges, 1, myVEdges, NbPath+1); } @@ -3174,12 +3183,14 @@ //function : PerformCorner //purpose : Trim and/or loop a corner //====================================================================== - void BRepFill_Sweep::PerformCorner(const Standard_Integer Index, - const BRepFill_TransitionStyle Transition, - const Handle(TopTools_HArray2OfShape)& Bounds) + Standard_Boolean BRepFill_Sweep::PerformCorner(const Standard_Integer Index, + const BRepFill_TransitionStyle Transition, + const Handle(TopTools_HArray2OfShape)& Bounds) { - if (Transition == BRepFill_Modified) return; // Do nothing. + if (Transition == BRepFill_Modified) return Standard_True; // Do nothing. + + const Standard_Real anAngularTol = 0.025; BRepFill_TransitionStyle TheTransition = Transition; Standard_Boolean isTangent=Standard_False; @@ -3225,11 +3236,15 @@ #ifdef OCCT_DEBUG std::cout << "BRepFill_Sweep::PerformCorner : This is not a corner !" << std::endl; #endif - return; + return Standard_True; } Sortant = t2 - t1; } + if (T1.Angle(T2) >= M_PI - anAngularTol) + { + return Standard_False; + } if ((TheTransition == BRepFill_Right) && (T1.Angle(T2) > myAngMax) ) { TheTransition = BRepFill_Round; @@ -3335,7 +3350,7 @@ #ifdef OCCT_DEBUG std::cout << "Fail of TrimCorner" << std::endl; #endif - return; // Nothing is touched + return Standard_True; // Nothing is touched } if (mySec->IsUClosed()) @@ -3415,7 +3430,7 @@ #endif } } - + return Standard_True; /* #if DRAW if (Affich) { diff -Nru opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Sweep.hxx opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Sweep.hxx --- opencascade-7.4.1+dfsg1/src/BRepFill/BRepFill_Sweep.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepFill/BRepFill_Sweep.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -124,7 +124,7 @@ Standard_EXPORT Standard_Boolean BuildShell (const BRepFill_TransitionStyle Transition, const Standard_Integer Vf, const Standard_Integer Vl, TopTools_MapOfShape& ReversedEdges, BRepFill_DataMapOfShapeHArray2OfShape& Tapes, BRepFill_DataMapOfShapeHArray2OfShape& Rails, const Standard_Real ExtendFirst = 0.0, const Standard_Real ExtendLast = 0.0); - Standard_EXPORT void PerformCorner (const Standard_Integer Index, const BRepFill_TransitionStyle Transition, const Handle(TopTools_HArray2OfShape)& Bounds); + Standard_EXPORT Standard_Boolean PerformCorner (const Standard_Integer Index, const BRepFill_TransitionStyle Transition, const Handle(TopTools_HArray2OfShape)& Bounds); Standard_EXPORT Standard_Real EvalExtrapol (const Standard_Integer Index, const BRepFill_TransitionStyle Transition) const; diff -Nru opencascade-7.4.1+dfsg1/src/BRepGProp/BRepGProp_Sinert.cxx opencascade-7.5.1+dfsg1/src/BRepGProp/BRepGProp_Sinert.cxx --- opencascade-7.4.1+dfsg1/src/BRepGProp/BRepGProp_Sinert.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepGProp/BRepGProp_Sinert.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,7 @@ //purpose : Constructor //======================================================================= BRepGProp_Sinert::BRepGProp_Sinert() +: myEpsilon(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepGProp/BRepGProp_Vinert.cxx opencascade-7.5.1+dfsg1/src/BRepGProp/BRepGProp_Vinert.cxx --- opencascade-7.4.1+dfsg1/src/BRepGProp/BRepGProp_Vinert.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepGProp/BRepGProp_Vinert.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ //purpose : Constructor //======================================================================= BRepGProp_Vinert::BRepGProp_Vinert() +: myEpsilon(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib.cxx opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib.cxx --- opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1347,15 +1347,13 @@ } // Eval tol2d to compute SameRange - Standard_Real UResol = Max(GAS.UResolution(theTolerance), Precision::PConfusion()); - Standard_Real VResol = Max(GAS.VResolution(theTolerance), Precision::PConfusion()); - Standard_Real Tol2d = Min(UResol, VResol); + Standard_Real TolSameRange = Max(GAC.Resolution(theTolerance), Precision::PConfusion()); for(Standard_Integer i = 0; i < 2; i++){ Handle(Geom2d_Curve) curPC = PC[i]; Standard_Boolean updatepc = 0; if(curPC.IsNull()) break; if(!SameRange){ - GeomLib::SameRange(Tol2d, + GeomLib::SameRange(TolSameRange, PC[i],GCurve->First(),GCurve->Last(), f3d,l3d,curPC); @@ -1375,13 +1373,17 @@ if(GAC2d.GetType() == GeomAbs_BSplineCurve && GAC2d.Continuity() == GeomAbs_C0) { + Standard_Real UResol = GAS.UResolution(theTolerance); + Standard_Real VResol = GAS.VResolution(theTolerance); + Standard_Real TolConf2d = Min(UResol, VResol); + TolConf2d = Max(TolConf2d, Precision::PConfusion()); Handle(Geom2d_BSplineCurve) bs2d = GAC2d.BSpline(); Handle(Geom2d_BSplineCurve) bs2dsov = bs2d; Standard_Real fC0 = bs2d->FirstParameter(), lC0 = bs2d->LastParameter(); Standard_Boolean repar = Standard_True; gp_Pnt2d OriginPoint; bs2d->D0(fC0, OriginPoint); - Geom2dConvert::C0BSplineToC1BSplineCurve(bs2d, Tol2d); + Geom2dConvert::C0BSplineToC1BSplineCurve(bs2d, TolConf2d); isBSP = Standard_True; if(bs2d->IsPeriodic()) { // -------- IFV, Jan 2000 @@ -1425,7 +1427,7 @@ } d = sqrt(d)*.1; - Tol2dbail = Max(Min(Tol2dbail,d),Tol2d); + Tol2dbail = Max(Min(Tol2dbail,d), TolConf2d); Geom2dConvert::C0BSplineToC1BSplineCurve(bs2d,Tol2dbail); @@ -1531,8 +1533,8 @@ GAC2d.Load(bs2d,f3d,l3d); curPC = bs2d; - if(Abs(bs2d->FirstParameter() - fC0) > Tol2d || - Abs(bs2d->LastParameter() - lC0) > Tol2d ) { + if(Abs(bs2d->FirstParameter() - fC0) > TolSameRange || + Abs(bs2d->LastParameter() - lC0) > TolSameRange) { Standard_Integer NbKnots = bs2d->NbKnots(); TColStd_Array1OfReal Knots(1,NbKnots); bs2d->Knots(Knots); @@ -1585,7 +1587,7 @@ //Approx_SameParameter has failed. //Consequently, the situation might be, //when 3D and 2D-curve do not have same-range. - GeomLib::SameRange( Tol2d, PC[i], + GeomLib::SameRange( TolSameRange, PC[i], GCurve->First(), GCurve->Last(), f3d,l3d,curPC); diff -Nru opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib_FindSurface.cxx opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib_FindSurface.cxx --- opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib_FindSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib_FindSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,6 +55,7 @@ #include #include #include +#include //======================================================================= //function : Controle @@ -160,7 +161,10 @@ //function : BRepLib_FindSurface //purpose : //======================================================================= -BRepLib_FindSurface::BRepLib_FindSurface() +BRepLib_FindSurface::BRepLib_FindSurface() +: myTolerance(0.0), + myTolReached(0.0), + isExisted(Standard_False) { } //======================================================================= @@ -174,6 +178,70 @@ { Init(S,Tol,OnlyPlane,OnlyClosed); } + +namespace +{ +static void fillParams (const TColStd_Array1OfReal& theKnots, + Standard_Integer theDegree, + Standard_Real theParMin, + Standard_Real theParMax, + NCollection_Vector& theParams) +{ + Standard_Real aPrevPar = theParMin; + theParams.Append (aPrevPar); + + Standard_Integer aNbP = Max (theDegree, 1); + + for (Standard_Integer i = 1; + (i < theKnots.Length()) && (theKnots (i) < (theParMax - Precision::PConfusion())); ++i) + { + if (theKnots (i + 1) < theParMin + Precision::PConfusion()) + continue; + + Standard_Real aStep = (theKnots (i + 1) - theKnots (i)) / aNbP; + for (Standard_Integer k = 1; k <= aNbP ; ++k) + { + Standard_Real aPar = theKnots (i) + k * aStep; + if (aPar > theParMax - Precision::PConfusion()) + break; + + if (aPar > aPrevPar + Precision::PConfusion()) + { + theParams.Append (aPar); + aPrevPar = aPar; + } + } + } + theParams.Append (theParMax); +} + +static void fillPoints (const BRepAdaptor_Curve& theCurve, + const NCollection_Vector theParams, + TColgp_SequenceOfPnt& thePoints, + TColStd_SequenceOfReal& theWeights) +{ + Standard_Real aDistPrev = 0., aDistNext; + gp_Pnt aPPrev (theCurve.Value (theParams (0))), aPNext; + + for (Standard_Integer iP = 1; iP <= theParams.Length(); ++iP) + { + if (iP < theParams.Length()) + { + Standard_Real aParam = theParams (iP); + aPNext = theCurve.Value (aParam); + aDistNext = aPPrev.Distance (aPNext); + } + else + aDistNext = 0.0; + + thePoints.Append (aPPrev); + theWeights.Append (aDistPrev + aDistNext); + aDistPrev = aDistNext; + aPPrev = aPNext; + } +} + +} //======================================================================= //function : Init //purpose : @@ -282,117 +350,57 @@ } Standard_Integer iNbPoints=0; - // Add the points with weights to the sequences + // Fill the parameters of the sampling points + NCollection_Vector aParams; switch (c.GetType()) { - case GeomAbs_BezierCurve: + case GeomAbs_BezierCurve: { - // Put all poles for bezier Handle(Geom_BezierCurve) GC = c.Bezier(); - Standard_Integer iNbPol = GC->NbPoles(); - Standard_Real tf = GC->FirstParameter(); - Standard_Real tl = GC->LastParameter(); - Standard_Real r = (dfUl - dfUf) / (tl - tf); - r *= iNbPol; - if ( iNbPol < 2 || r < 1.) - // Degenerate - continue; - else - { - Handle(TColgp_HArray1OfPnt) aPoles = new (TColgp_HArray1OfPnt) (1, iNbPol); - GC->Poles(aPoles->ChangeArray1()); - gp_Pnt aPolePrev = aPoles->Value(1), aPoleNext; - Standard_Real dfDistPrev = 0., dfDistNext; - for (Standard_Integer iPol=1; iPol<=iNbPol; iPol++) - { - if (iPolValue(iPol+1); - dfDistNext = aPolePrev.Distance(aPoleNext); - } - else - dfDistNext = 0.; - aPoints.Append (aPolePrev); - aWeight.Append (dfDistPrev+dfDistNext); - dfDistPrev = dfDistNext; - aPolePrev = aPoleNext; - } - } + TColStd_Array1OfReal aKnots (1, 2); + aKnots.SetValue (1, GC->FirstParameter()); + aKnots.SetValue (2, GC->LastParameter()); + + fillParams (aKnots, GC->Degree(), dfUf, dfUl, aParams); + break; } - break; - case GeomAbs_BSplineCurve: + case GeomAbs_BSplineCurve: { - // Put all poles for bspline Handle(Geom_BSplineCurve) GC = c.BSpline(); - Standard_Integer iNbPol = GC->NbPoles(); - Standard_Real tf = GC->FirstParameter(); - Standard_Real tl = GC->LastParameter(); - Standard_Real r = (dfUl - dfUf) / (tl - tf); - r *= iNbPol; - if ( iNbPol < 2 || r < 1.) - // Degenerate - continue; - else - { - Handle(TColgp_HArray1OfPnt) aPoles = new (TColgp_HArray1OfPnt) (1, iNbPol); - GC->Poles(aPoles->ChangeArray1()); - gp_Pnt aPolePrev = aPoles->Value(1), aPoleNext; - Standard_Real dfDistPrev = 0., dfDistNext; - for (Standard_Integer iPol=1; iPol<=iNbPol; iPol++) - { - if (iPolValue(iPol+1); - dfDistNext = aPolePrev.Distance(aPoleNext); - } - else - dfDistNext = 0.; - aPoints.Append (aPolePrev); - aWeight.Append (dfDistPrev+dfDistNext); - dfDistPrev = dfDistNext; - aPolePrev = aPoleNext; - } - } + fillParams (GC->Knots(), GC->Degree(), dfUf, dfUl, aParams); + break; } - break; - - case GeomAbs_Line: - case GeomAbs_Circle: - case GeomAbs_Ellipse: - case GeomAbs_Hyperbola: - case GeomAbs_Parabola: - // Two points on straight segment, Four points on otheranalitical curves - iNbPoints = (c.GetType() == GeomAbs_Line ? 2 : 4); - Standard_FALLTHROUGH - default: + case GeomAbs_Line: + { + // Two points on a straight segment + aParams.Append (dfUf); + aParams.Append (dfUl); + break; + } + case GeomAbs_Circle: + case GeomAbs_Ellipse: + case GeomAbs_Hyperbola: + case GeomAbs_Parabola: + // Four points on other analytical curves + iNbPoints = 4; + Standard_FALLTHROUGH + default: { // Put some points on other curves - if (iNbPoints==0) - iNbPoints = 15 + c.NbIntervals(GeomAbs_C3); - Standard_Real dfDelta = (dfUl-dfUf)/(iNbPoints-1); - Standard_Integer iPoint; - Standard_Real dfU; - gp_Pnt aPointPrev = c.Value(dfUf), aPointNext; - Standard_Real dfDistPrev = 0., dfDistNext; - for (iPoint=1, dfU=dfUf+dfDelta; - iPoint<=iNbPoints; - iPoint++, dfU+=dfDelta) - { - if (iPoint dfSide*myTolerance) { - Handle(Geom_Plane) aPlane2 = new Geom_Plane(aBaryCenter, aCross); - Standard_Real dfDist2 = Controle (aPoints, aPlane2); - if (dfDist2 < myTolerance) { - myTolReached = dfDist2; - mySurface = aPlane2; - return; - } - if (dfDist2 < dfDist) { - dfDist = dfDist2; - aPlane = aPlane2; - } - } - } - } - } - // - //XXf - //static Standard_Real weakness = 5.0; - Standard_Real weakness = 5.0; - //XXf - if(dfDist <= myTolerance || (dfDist < myTolerance*weakness && Tol<0)) { - //XXf - //myTolReached = dfDist; - //XXt + + if (!isSolved) + return; + + gp_Vec aN (aVec (1), aVec (2), aVec (3)); + Handle(Geom_Plane) aPlane = new Geom_Plane (aBaryCenter, aN); + myTolReached = Controle (aPoints, aPlane); + const Standard_Real aWeakness = 5.0; + if (myTolReached <= myTolerance || (Tol < 0 && myTolReached < myTolerance * aWeakness)) + { mySurface = aPlane; //If S is wire, try to orient surface according to orientation of wire. - if(S.ShapeType() == TopAbs_WIRE && S.Closed()) + if (S.ShapeType() == TopAbs_WIRE && S.Closed()) { - // - TopoDS_Wire aW = TopoDS::Wire(S); - TopoDS_Face aTmpFace = BRepLib_MakeFace(mySurface, Precision::Confusion()); + TopoDS_Wire aW = TopoDS::Wire (S); + TopoDS_Face aTmpFace = BRepLib_MakeFace (mySurface, Precision::Confusion()); BRep_Builder BB; - BB.Add(aTmpFace, aW); - BRepTopAdaptor_FClass2d FClass(aTmpFace, 0.); - if ( FClass.PerformInfinitePoint() == TopAbs_IN ) + BB.Add (aTmpFace, aW); + BRepTopAdaptor_FClass2d FClass (aTmpFace, 0.); + if (FClass.PerformInfinitePoint() == TopAbs_IN) { - gp_Dir aN = aPlane->Position().Direction(); - aN.Reverse(); - mySurface = new Geom_Plane(aPlane->Position().Location(), aN); + gp_Dir aNorm = aPlane->Position().Direction(); + aNorm.Reverse(); + mySurface = new Geom_Plane (aPlane->Position().Location(), aNorm); } - } } - //XXf - myTolReached = dfDist; - //XXt } //======================================================================= //function : Found diff -Nru opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib_MakeEdge.cxx opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib_MakeEdge.cxx --- opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib_MakeEdge.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib_MakeEdge.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -173,7 +173,9 @@ //======================================================================= BRepLib_MakeEdge::BRepLib_MakeEdge() -{} +: myError(BRepLib_PointProjectionFailed) +{ +} //======================================================================= //function : BRepLib_MakeEdge diff -Nru opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib_MakeFace.cxx opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib_MakeFace.cxx --- opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib_MakeFace.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib_MakeFace.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -468,7 +468,7 @@ else if (Type == GeomAbs_BezierCurve) { Handle(Geom_BezierCurve) BZ = AC.Bezier(); Standard_Integer NbPoles = BZ->NbPoles(); - Standard_Real aMaxPoleDist2 = 0.0, aMaxTol2 = theMaxTol*theMaxTol;; + Standard_Real aMaxPoleDist2 = 0.0, aMaxTol2 = theMaxTol*theMaxTol; gp_Pnt P1,P2; P1 = BZ->Pole(1); for (Standard_Integer i = 2; i <= NbPoles; i++) { diff -Nru opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib_MakeWire_1.cxx opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib_MakeWire_1.cxx --- opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib_MakeWire_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib_MakeWire_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -155,8 +155,10 @@ Standard_Real aTolV = BRep_Tool::Tolerance(aV); Standard_Real aL = myP.SquareDistance(aVPnt); + Standard_Real aSTol = aTolV + myTolP; + aSTol *= aSTol; - if (aL < Max(aTolV*aTolV, mySTol)) + if (aL <= aSTol) { myResultInd.Append(theObj); return Standard_True; @@ -176,7 +178,7 @@ myP = theP; myVBox.Add(myP); myVBox.Enlarge(theTol); - mySTol = theTol*theTol; + myTolP = theTol; myVInd = theVInd; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib_MakeWire.hxx opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib_MakeWire.hxx --- opencascade-7.4.1+dfsg1/src/BRepLib/BRepLib_MakeWire.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepLib/BRepLib_MakeWire.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -135,8 +135,12 @@ { public: BRepLib_BndBoxVertexSelector(const TopTools_IndexedMapOfShape& theMapOfShape) - : BRepLib_BndBoxVertexSelector::Selector(), myMapOfShape (theMapOfShape) - {} + : BRepLib_BndBoxVertexSelector::Selector(), + myMapOfShape (theMapOfShape), + myTolP(0.0), + myVInd(0) + { + } Standard_Boolean Reject (const Bnd_Box& theBox) const { @@ -165,7 +169,7 @@ const TopTools_IndexedMapOfShape& myMapOfShape; //vertices gp_Pnt myP; - Standard_Real mySTol; + Standard_Real myTolP; Standard_Integer myVInd; Bnd_Box myVBox; NCollection_List myResultInd; diff -Nru opencascade-7.4.1+dfsg1/src/BRepMAT2d/BRepMAT2d_BisectingLocus.cxx opencascade-7.5.1+dfsg1/src/BRepMAT2d/BRepMAT2d_BisectingLocus.cxx --- opencascade-7.4.1+dfsg1/src/BRepMAT2d/BRepMAT2d_BisectingLocus.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMAT2d/BRepMAT2d_BisectingLocus.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,6 +49,8 @@ //purpose : Constructeur vide. //============================================================================= BRepMAT2d_BisectingLocus::BRepMAT2d_BisectingLocus() +: isDone(Standard_False), + nbContours(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMAT2d/BRepMAT2d_LinkTopoBilo.cxx opencascade-7.5.1+dfsg1/src/BRepMAT2d/BRepMAT2d_LinkTopoBilo.cxx --- opencascade-7.4.1+dfsg1/src/BRepMAT2d/BRepMAT2d_LinkTopoBilo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMAT2d/BRepMAT2d_LinkTopoBilo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,6 +47,8 @@ //purpose : //======================================================================= BRepMAT2d_LinkTopoBilo::BRepMAT2d_LinkTopoBilo() +: current(0), + isEmpty(Standard_True) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_BaseMeshAlgo.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_BaseMeshAlgo.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_BaseMeshAlgo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_BaseMeshAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_BaseMeshAlgo, IMeshTools_MeshAlgo) + //======================================================================= // Function: Constructor // Purpose : @@ -46,7 +48,8 @@ //======================================================================= void BRepMesh_BaseMeshAlgo::Perform( const IMeshData::IFaceHandle& theDFace, - const IMeshTools_Parameters& theParameters) + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) { try { @@ -61,7 +64,11 @@ if (initDataStructure()) { - generateMesh(); + if (!theRange.More()) + { + return; + } + generateMesh(theRange); commitSurfaceTriangulation(); } } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_BaseMeshAlgo.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_BaseMeshAlgo.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_BaseMeshAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_BaseMeshAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,7 @@ class BRepMesh_DataStructureOfDelaun; class BRepMesh_Delaun; -//! Class provides base fuctionality for algorithms building face triangulation. +//! Class provides base functionality for algorithms building face triangulation. //! Performs initialization of BRepMesh_DataStructureOfDelaun and nodes map structures. class BRepMesh_BaseMeshAlgo : public IMeshTools_MeshAlgo { @@ -42,38 +42,39 @@ //! Performs processing of the given face. Standard_EXPORT virtual void Perform( const IMeshData::IFaceHandle& theDFace, - const IMeshTools_Parameters& theParameters) Standard_OVERRIDE; + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_BaseMeshAlgo, IMeshTools_MeshAlgo) + DEFINE_STANDARD_RTTIEXT(BRepMesh_BaseMeshAlgo, IMeshTools_MeshAlgo) protected: //! Gets discrete face. - inline const IMeshData::IFaceHandle& getDFace() const + const IMeshData::IFaceHandle& getDFace() const { return myDFace; } //! Gets meshing parameters. - inline const IMeshTools_Parameters& getParameters() const + const IMeshTools_Parameters& getParameters() const { return myParameters; } //! Gets common allocator. - inline const Handle(NCollection_IncAllocator)& getAllocator() const + const Handle(NCollection_IncAllocator)& getAllocator() const { return myAllocator; } //! Gets mesh structure. - inline const Handle(BRepMesh_DataStructureOfDelaun)& getStructure() const + const Handle(BRepMesh_DataStructureOfDelaun)& getStructure() const { return myStructure; } //! Gets 3d nodes map. - inline const Handle(VectorOfPnt)& getNodesMap() const + const Handle(VectorOfPnt)& getNodesMap() const { return myNodesMap; } @@ -103,11 +104,11 @@ Standard_EXPORT virtual Standard_Boolean initDataStructure(); //! Generates mesh for the contour stored in data structure. - Standard_EXPORT virtual void generateMesh() = 0; + Standard_EXPORT virtual void generateMesh(const Message_ProgressRange& theRange) = 0; private: - //! If the given edge has another pcurve for current face coinsiding with specified one, + //! If the given edge has another pcurve for current face coinciding with specified one, //! returns TopAbs_INTERNAL flag. Elsewhere returns orientation of specified pcurve. TopAbs_Orientation fixSeamEdgeOrientation( const IMeshData::IEdgeHandle& theDEdge, diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Circle.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Circle.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Circle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Circle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,26 +44,26 @@ //! Sets location of a circle. //! @param theLocation location of a circle. - inline void SetLocation(const gp_XY& theLocation) + void SetLocation(const gp_XY& theLocation) { myLocation = theLocation; } //! Sets radius of a circle. //! @param theRadius radius of a circle. - inline void SetRadius(const Standard_Real theRadius) + void SetRadius(const Standard_Real theRadius) { myRadius = theRadius; } //! Returns location of a circle. - inline const gp_XY& Location() const + const gp_XY& Location() const { return myLocation; } //! Returns radius of a circle. - inline const Standard_Real& Radius() const + const Standard_Real& Radius() const { return myRadius; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CircleInspector.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CircleInspector.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CircleInspector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CircleInspector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,14 +46,14 @@ //! Adds the circle to vector of circles at the given position. //! @param theIndex position of circle in the vector. //! @param theCircle circle to be added. - inline void Bind(const Standard_Integer theIndex, - const BRepMesh_Circle& theCircle) + void Bind(const Standard_Integer theIndex, + const BRepMesh_Circle& theCircle) { myCircles.SetValue(theIndex, theCircle); } //! Resutns vector of registered circles. - inline const IMeshData::VectorOfCircle& Circles() const + const IMeshData::VectorOfCircle& Circles() const { return myCircles; } @@ -61,21 +61,21 @@ //! Returns circle with the given index. //! @param theIndex index of circle. //! @return circle with the given index. - inline BRepMesh_Circle& Circle(const Standard_Integer theIndex) + BRepMesh_Circle& Circle(const Standard_Integer theIndex) { return myCircles(theIndex); } //! Set reference point to be checked. //! @param thePoint bullet point. - inline void SetPoint(const gp_XY& thePoint) + void SetPoint(const gp_XY& thePoint) { myResIndices.Clear(); myPoint = thePoint; } //! Returns list of circles shot by the reference point. - inline IMeshData::ListOfInteger& GetShotCircles() + IMeshData::ListOfInteger& GetShotCircles() { return myResIndices; } @@ -83,7 +83,7 @@ //! Performs inspection of a circle with the given index. //! @param theTargetIndex index of a circle to be checked. //! @return status of the check. - inline NCollection_CellFilter_Action Inspect( + NCollection_CellFilter_Action Inspect( const Standard_Integer theTargetIndex) { BRepMesh_Circle& aCircle = myCircles(theTargetIndex); diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CircleTool.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CircleTool.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CircleTool.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CircleTool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -50,14 +50,14 @@ //! Initializes the tool. //! @param theReservedSize size to be reserved for vector of circles. - inline void Init(const Standard_Integer /*theReservedSize*/) + void Init(const Standard_Integer /*theReservedSize*/) { myTolerance = Precision::PConfusion(); } //! Sets new size for cell filter. //! @param theSize cell size to be set for X and Y dimensions. - inline void SetCellSize(const Standard_Real theSize) + void SetCellSize(const Standard_Real theSize) { myCellFilter.Reset(theSize, myAllocator); } @@ -65,8 +65,8 @@ //! Sets new size for cell filter. //! @param theSizeX cell size to be set for X dimension. //! @param theSizeY cell size to be set for Y dimension. - inline void SetCellSize(const Standard_Real theSizeX, - const Standard_Real theSizeY) + void SetCellSize(const Standard_Real theSizeX, + const Standard_Real theSizeY) { Standard_Real aCellSizeC[2] = { theSizeX, theSizeY }; NCollection_Array1 aCellSize(aCellSizeC[0], 1, 2); @@ -76,15 +76,15 @@ //! Sets limits of inspection area. //! @param theMin bottom left corner of inspection area. //! @param theMax top right corner of inspection area. - inline void SetMinMaxSize(const gp_XY& theMin, - const gp_XY& theMax) + void SetMinMaxSize(const gp_XY& theMin, + const gp_XY& theMax) { myFaceMin = theMin; myFaceMax = theMax; } //! Retruns true if cell filter contains no circle. - inline Standard_Boolean IsEmpty () const + Standard_Boolean IsEmpty () const { return mySelector.Circles ().IsEmpty (); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Classifier.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Classifier.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Classifier.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Classifier.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_Classifier, Standard_Transient) + //======================================================================= //function : Constructor //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Classifier.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Classifier.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Classifier.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Classifier.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,7 +58,7 @@ const std::pair& theRangeU, const std::pair& theRangeV); - DEFINE_STANDARD_RTTI_INLINE (BRepMesh_Classifier, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(BRepMesh_Classifier, Standard_Transient) private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ConstrainedBaseMeshAlgo.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ConstrainedBaseMeshAlgo.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ConstrainedBaseMeshAlgo.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ConstrainedBaseMeshAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_ConstrainedBaseMeshAlgo, BRepMesh_BaseMeshAlgo) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ConstrainedBaseMeshAlgo.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ConstrainedBaseMeshAlgo.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ConstrainedBaseMeshAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ConstrainedBaseMeshAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,7 +23,7 @@ class BRepMesh_DataStructureOfDelaun; class BRepMesh_Delaun; -//! Class provides base fuctionality to build face triangulation using Dealunay approach. +//! Class provides base functionality to build face triangulation using Dealunay approach. //! Performs generation of mesh using raw data from model. class BRepMesh_ConstrainedBaseMeshAlgo : public BRepMesh_BaseMeshAlgo { @@ -39,7 +39,7 @@ { } - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ConstrainedBaseMeshAlgo, BRepMesh_BaseMeshAlgo) + DEFINE_STANDARD_RTTIEXT(BRepMesh_ConstrainedBaseMeshAlgo, BRepMesh_BaseMeshAlgo) protected: @@ -49,10 +49,11 @@ return std::pair (-1, -1); } - //! Perfroms processing of generated mesh. + //! Performs processing of generated mesh. //! By default does nothing. //! Expected to be called from method generateMesh() in successor classes. - virtual void postProcessMesh (BRepMesh_Delaun& /*theMesher*/) + virtual void postProcessMesh (BRepMesh_Delaun& /*theMesher*/, + const Message_ProgressRange& /*theRange*/) { } }; diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Context.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Context.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Context.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Context.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,19 +20,61 @@ #include #include #include + #include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_Context, IMeshTools_Context) //======================================================================= // Function: Constructor // Purpose : //======================================================================= -BRepMesh_Context::BRepMesh_Context () +BRepMesh_Context::BRepMesh_Context (IMeshTools_MeshAlgoType theMeshType) { + if (theMeshType == IMeshTools_MeshAlgoType_DEFAULT) + { + TCollection_AsciiString aValue = OSD_Environment ("CSF_MeshAlgo").Value(); + aValue.LowerCase(); + if (aValue == "watson" + || aValue == "0") + { + theMeshType = IMeshTools_MeshAlgoType_Watson; + } + else if (aValue == "delabella" + || aValue == "1") + { + theMeshType = IMeshTools_MeshAlgoType_Delabella; + } + else + { + if (!aValue.IsEmpty()) + { + Message::SendWarning (TCollection_AsciiString("BRepMesh_Context, ignore unknown algorithm '") + aValue + "' specified in CSF_MeshAlgo variable"); + } + theMeshType = IMeshTools_MeshAlgoType_Watson; + } + } + + Handle (IMeshTools_MeshAlgoFactory) aAlgoFactory; + switch (theMeshType) + { + case IMeshTools_MeshAlgoType_DEFAULT: + case IMeshTools_MeshAlgoType_Watson: + aAlgoFactory = new BRepMesh_MeshAlgoFactory(); + break; + case IMeshTools_MeshAlgoType_Delabella: + aAlgoFactory = new BRepMesh_DelabellaMeshAlgoFactory(); + break; + } + SetModelBuilder (new BRepMesh_ModelBuilder); SetEdgeDiscret (new BRepMesh_EdgeDiscret); SetModelHealer (new BRepMesh_ModelHealer); SetPreProcessor (new BRepMesh_ModelPreProcessor); - SetFaceDiscret (new BRepMesh_FaceDiscret(new BRepMesh_MeshAlgoFactory)); + SetFaceDiscret (new BRepMesh_FaceDiscret (aAlgoFactory)); SetPostProcessor(new BRepMesh_ModelPostProcessor); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Context.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Context.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Context.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Context.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,12 +25,12 @@ public: //! Constructor. - Standard_EXPORT BRepMesh_Context (); + Standard_EXPORT BRepMesh_Context (IMeshTools_MeshAlgoType theMeshType = IMeshTools_MeshAlgoType_DEFAULT); //! Destructor. Standard_EXPORT virtual ~BRepMesh_Context (); - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_Context, IMeshTools_Context) + DEFINE_STANDARD_RTTIEXT(BRepMesh_Context, IMeshTools_Context) }; #endif \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CurveTessellator.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CurveTessellator.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CurveTessellator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CurveTessellator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,6 +28,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_CurveTessellator, IMeshTools_CurveTessellator) + //======================================================================= //function : Constructor //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CurveTessellator.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CurveTessellator.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CurveTessellator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CurveTessellator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -60,7 +60,7 @@ gp_Pnt& thePoint, Standard_Real& theParameter) const Standard_OVERRIDE; - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_CurveTessellator, IMeshTools_CurveTessellator) + DEFINE_STANDARD_RTTIEXT(BRepMesh_CurveTessellator, IMeshTools_CurveTessellator) private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CustomBaseMeshAlgo.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CustomBaseMeshAlgo.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CustomBaseMeshAlgo.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CustomBaseMeshAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_CustomBaseMeshAlgo, BRepMesh_ConstrainedBaseMeshAlgo) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CustomBaseMeshAlgo.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CustomBaseMeshAlgo.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CustomBaseMeshAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CustomBaseMeshAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,40 +25,63 @@ class BRepMesh_DataStructureOfDelaun; -//! Class provides base fuctionality to build face triangulation using custom triangulation algorithm. +//! Class provides base functionality to build face triangulation using custom triangulation algorithm. //! Performs generation of mesh using raw data from model. class BRepMesh_CustomBaseMeshAlgo : public BRepMesh_ConstrainedBaseMeshAlgo { public: //! Constructor. - Standard_EXPORT BRepMesh_CustomBaseMeshAlgo () + BRepMesh_CustomBaseMeshAlgo () { } //! Destructor. - Standard_EXPORT virtual ~BRepMesh_CustomBaseMeshAlgo () + virtual ~BRepMesh_CustomBaseMeshAlgo () { } - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_CustomBaseMeshAlgo, BRepMesh_ConstrainedBaseMeshAlgo) + DEFINE_STANDARD_RTTIEXT(BRepMesh_CustomBaseMeshAlgo, BRepMesh_ConstrainedBaseMeshAlgo) protected: //! Generates mesh for the contour stored in data structure. - Standard_EXPORT virtual void generateMesh () Standard_OVERRIDE + virtual void generateMesh (const Message_ProgressRange& theRange) Standard_OVERRIDE { const Handle (BRepMesh_DataStructureOfDelaun)& aStructure = this->getStructure (); + const Standard_Integer aNodesNb = aStructure->NbNodes (); + buildBaseTriangulation (); std::pair aCellsCount = this->getCellsCount (aStructure->NbNodes ()); BRepMesh_Delaun aMesher (aStructure, aCellsCount.first, aCellsCount.second, Standard_False); + + const Standard_Integer aNewNodesNb = aStructure->NbNodes (); + const Standard_Boolean isRemoveAux = aNewNodesNb > aNodesNb; + if (isRemoveAux) + { + IMeshData::VectorOfInteger aAuxVertices (aNewNodesNb - aNodesNb); + for (Standard_Integer aExtNodesIt = aNodesNb + 1; aExtNodesIt <= aNewNodesNb; ++aExtNodesIt) + { + aAuxVertices.Append (aExtNodesIt); + } + + // Set aux vertices if there are some to clean up mesh correctly. + aMesher.SetAuxVertices (aAuxVertices); + } + aMesher.ProcessConstraints (); + // Destruction of triangles containing aux vertices added (possibly) during base mesh computation. + if (isRemoveAux) + { + aMesher.RemoveAuxElements (); + } + BRepMesh_MeshTool aCleaner (aStructure); aCleaner.EraseFreeLinks (); - postProcessMesh (aMesher); + postProcessMesh (aMesher, theRange); } protected: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CustomDelaunayBaseMeshAlgo.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CustomDelaunayBaseMeshAlgo.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_CustomDelaunayBaseMeshAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_CustomDelaunayBaseMeshAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,7 @@ class BRepMesh_DataStructureOfDelaun; class BRepMesh_Delaun; -//! Class provides base fuctionality to build face triangulation using custom +//! Class provides base functionality to build face triangulation using custom //! triangulation algorithm with possibility to modify final mesh. //! Performs generation of mesh using raw data from model. template @@ -39,14 +39,15 @@ protected: - //! Perfroms processing of generated mesh. - virtual void postProcessMesh(BRepMesh_Delaun& theMesher) + //! Performs processing of generated mesh. + virtual void postProcessMesh (BRepMesh_Delaun& theMesher, + const Message_ProgressRange& theRange) { - BaseAlgo::postProcessMesh (theMesher); - const Handle(BRepMesh_DataStructureOfDelaun)& aStructure = this->getStructure(); std::pair aCellsCount = this->getCellsCount (aStructure->NbNodes()); theMesher.InitCirclesTool (aCellsCount.first, aCellsCount.second); + + BaseAlgo::postProcessMesh (theMesher, theRange); } }; diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DataStructureOfDelaun.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DataStructureOfDelaun.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DataStructureOfDelaun.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DataStructureOfDelaun.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_DataStructureOfDelaun, Standard_Transient) + //======================================================================= //function : BRepMesh_DataStructureOfDelaun //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DataStructureOfDelaun.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DataStructureOfDelaun.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DataStructureOfDelaun.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DataStructureOfDelaun.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,7 +42,7 @@ public: //! @name API for accessing mesh nodes. //! Returns number of nodes. - inline Standard_Integer NbNodes() const + Standard_Integer NbNodes() const { return myNodes->Extent(); } @@ -68,7 +68,7 @@ //! Get node by the index. //! @param theIndex index of a node. //! @return node with the given index. - inline const BRepMesh_Vertex& GetNode(const Standard_Integer theIndex) + const BRepMesh_Vertex& GetNode(const Standard_Integer theIndex) { return myNodes->FindKey(theIndex); } @@ -105,7 +105,7 @@ //! Get list of links attached to the node with the given index. //! @param theIndex index of node whose links should be retrieved. //! @return list of links attached to the node. - inline const IMeshData::ListOfInteger& LinksConnectedTo( + const IMeshData::ListOfInteger& LinksConnectedTo( const Standard_Integer theIndex) const { return linksConnectedTo(theIndex); @@ -115,7 +115,7 @@ public: //! @name API for accessing mesh links. //! Returns number of links. - inline Standard_Integer NbLinks() const + Standard_Integer NbLinks() const { return myLinks.Extent(); } @@ -142,7 +142,7 @@ } //! Returns map of indices of links registered in mesh. - inline const IMeshData::MapOfInteger& LinksOfDomain() const + const IMeshData::MapOfInteger& LinksOfDomain() const { return myLinksOfDomain; } @@ -176,7 +176,7 @@ public: //! @name API for accessing mesh elements. //! Returns number of links. - inline Standard_Integer NbElements() const + Standard_Integer NbElements() const { return myElements.Size(); } @@ -195,7 +195,7 @@ } //! Returns map of indices of elements registered in mesh. - inline const IMeshData::MapOfInteger& ElementsOfDomain() const + const IMeshData::MapOfInteger& ElementsOfDomain() const { return myElementsOfDomain; } @@ -229,13 +229,13 @@ Standard_EXPORT void Statistics(Standard_OStream& theStream) const; //! Returns memory allocator used by the structure. - inline const Handle(NCollection_IncAllocator)& Allocator() const + const Handle(NCollection_IncAllocator)& Allocator() const { return myAllocator; } //! Gives the data structure for initialization of cell size and tolerance. - inline const Handle(BRepMesh_VertexTool)& Data() + const Handle(BRepMesh_VertexTool)& Data() { return myNodes; } @@ -251,14 +251,14 @@ clearDeletedNodes(); } - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_DataStructureOfDelaun, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(BRepMesh_DataStructureOfDelaun, Standard_Transient) private: //! Get list of links attached to the node with the given index. //! @param theIndex index of node whose links should be retrieved. //! @return list of links attached to the node. - inline IMeshData::ListOfInteger& linksConnectedTo( + IMeshData::ListOfInteger& linksConnectedTo( const Standard_Integer theIndex) const { return (IMeshData::ListOfInteger&)myNodeLinks.Find(theIndex); diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DefaultRangeSplitter.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DefaultRangeSplitter.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DefaultRangeSplitter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DefaultRangeSplitter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include //======================================================================= // Function: Reset @@ -125,9 +126,14 @@ const Standard_Real aDiffU = myRangeU.second - myRangeU.first; const Standard_Real aDiffV = myRangeV.second - myRangeV.first; + const Standard_Real aTolerance = BRep_Tool::Tolerance (myDFace->GetFace()); + const Adaptor3d_Surface& aSurface = GetSurface()->Surface(); + const Standard_Real aResU = aSurface.UResolution (aTolerance); + const Standard_Real aResV = aSurface.VResolution (aTolerance); + const Standard_Real aDeflectionUV = 1.e-05; - myTolerance.first = Max(Min(aDeflectionUV, 0.1 * aDiffU), 1e-7 * aDiffU); - myTolerance.second = Max(Min(aDeflectionUV, 0.1 * aDiffV), 1e-7 * aDiffV); + myTolerance.first = Max(Min(aDeflectionUV, aResU), 1e-7 * aDiffU); + myTolerance.second = Max(Min(aDeflectionUV, aResV), 1e-7 * aDiffV); } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DefaultRangeSplitter.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DefaultRangeSplitter.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DefaultRangeSplitter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DefaultRangeSplitter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,7 +70,7 @@ //! Returns point in 3d space corresponded to the given //! point defined in parameteric space of surface. - inline gp_Pnt Point(const gp_Pnt2d& thePoint2d) const + gp_Pnt Point(const gp_Pnt2d& thePoint2d) const { return GetSurface()->Value(thePoint2d.X(), thePoint2d.Y()); } @@ -78,47 +78,43 @@ protected: //! Computes parametric tolerance taking length along U and V into account. - virtual void computeTolerance( - const Standard_Real theLenU, - const Standard_Real theLenV); + Standard_EXPORT virtual void computeTolerance (const Standard_Real theLenU, const Standard_Real theLenV); //! Computes parametric delta taking length along U and V and value of tolerance into account. - virtual void computeDelta( - const Standard_Real theLengthU, - const Standard_Real theLengthV); + Standard_EXPORT virtual void computeDelta (const Standard_Real theLengthU, const Standard_Real theLengthV); public: //! Returns face model. - inline const IMeshData::IFaceHandle& GetDFace() const + const IMeshData::IFaceHandle& GetDFace() const { return myDFace; } //! Returns surface. - inline const Handle(BRepAdaptor_HSurface)& GetSurface() const + const Handle(BRepAdaptor_HSurface)& GetSurface() const { return myDFace->GetSurface(); } //! Returns U range. - inline const std::pair& GetRangeU() const + const std::pair& GetRangeU() const { return myRangeU; } //! Returns V range. - inline const std::pair& GetRangeV() const + const std::pair& GetRangeV() const { return myRangeV; } //! Returns delta. - inline const std::pair& GetDelta () const + const std::pair& GetDelta () const { return myDelta; } - inline const std::pair& GetToleranceUV() const + const std::pair& GetToleranceUV() const { return myTolerance; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Deflection.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Deflection.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Deflection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Deflection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_Deflection, Standard_Transient) + //======================================================================= //function : RelativeEdgeDeflection //purpose : @@ -145,18 +147,39 @@ } Standard_Real aFaceDeflection = 0.0; - if (theDFace->WiresNb () > 0) + if (!theParameters.ForceFaceDeflection) { - for (Standard_Integer aWireIt = 0; aWireIt < theDFace->WiresNb(); ++aWireIt) + if (theDFace->WiresNb () > 0) { - aFaceDeflection += theDFace->GetWire(aWireIt)->GetDeflection(); + for (Standard_Integer aWireIt = 0; aWireIt < theDFace->WiresNb (); ++aWireIt) + { + aFaceDeflection += theDFace->GetWire (aWireIt)->GetDeflection (); + } + + aFaceDeflection /= theDFace->WiresNb (); } - aFaceDeflection /= theDFace->WiresNb (); + aFaceDeflection = Max (2. * BRepMesh_ShapeTool::MaxFaceTolerance ( + theDFace->GetFace ()), aFaceDeflection); } + aFaceDeflection = Max (aDeflection, aFaceDeflection); - aFaceDeflection = Max(aDeflection, aFaceDeflection); + theDFace->SetDeflection (aFaceDeflection); +} - theDFace->SetDeflection (Max(2.* BRepMesh_ShapeTool::MaxFaceTolerance( - theDFace->GetFace()), aFaceDeflection)); +//======================================================================= +// Function: IsConsistent +// Purpose : +//======================================================================= +Standard_Boolean BRepMesh_Deflection::IsConsistent ( + const Standard_Real theCurrent, + const Standard_Real theRequired, + const Standard_Boolean theAllowDecrease, + const Standard_Real theRatio) +{ + // Check if the deflection of existing polygonal representation + // fits the required deflection. + Standard_Boolean isConsistent = theCurrent < (1. + theRatio) * theRequired + && (!theAllowDecrease || theCurrent > (1. - theRatio) * theRequired); + return isConsistent; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Deflection.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Deflection.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Deflection.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Deflection.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,7 +58,21 @@ const IMeshData::IFaceHandle& theDFace, const IMeshTools_Parameters& theParameters); - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_Deflection, Standard_Transient) + //! Checks if the deflection of current polygonal representation + //! is consistent with the required deflection. + //! @param theCurrent [in] Current deflection. + //! @param theRequired [in] Required deflection. + //! @param theAllowDecrease [in] Flag controlling the check. If decrease is allowed, + //! to be consistent the current and required deflections should be approximately the same. + //! If not allowed, the current deflection should be less than required. + //! @param theRatio [in] The ratio for comparison of the deflections (value from 0 to 1). + Standard_EXPORT static Standard_Boolean IsConsistent ( + const Standard_Real theCurrent, + const Standard_Real theRequired, + const Standard_Boolean theAllowDecrease, + const Standard_Real theRatio = 0.1); + + DEFINE_STANDARD_RTTIEXT(BRepMesh_Deflection, Standard_Transient) }; #endif \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaBaseMeshAlgo.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaBaseMeshAlgo.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaBaseMeshAlgo.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaBaseMeshAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,193 @@ +// Created on: 2019-07-05 +// Copyright (c) 2019 OPEN CASCADE SAS +// Created by: Oleg AGASHIN +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include + +#include +#include + +#include "delabella.pxx" + +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_DelabellaBaseMeshAlgo, BRepMesh_CustomBaseMeshAlgo) + +namespace +{ + //! Redirect algorithm messages to OCCT messenger. + static int logDelabella2Occ (void* theStream, const char* theFormat, ...) + { + (void )theStream; + char aBuffer[1024]; // should be more than enough for Delabella messages + + va_list anArgList; + va_start(anArgList, theFormat); + Vsprintf(aBuffer, theFormat, anArgList); + va_end(anArgList); + + Message_Gravity aGravity = Message_Warning; + switch ((int )theFormat[1]) + { + case int('E'): aGravity = Message_Fail; break; // [ERR] + case int('W'): aGravity = Message_Trace; break; // [WRN] + case int('N'): aGravity = Message_Trace; break; // [NFO] + } + Message::Send (aBuffer, aGravity); + return 0; + } +} + +//======================================================================= +// Function: Constructor +// Purpose : +//======================================================================= +BRepMesh_DelabellaBaseMeshAlgo::BRepMesh_DelabellaBaseMeshAlgo () +{ +} + +//======================================================================= +// Function: Destructor +// Purpose : +//======================================================================= +BRepMesh_DelabellaBaseMeshAlgo::~BRepMesh_DelabellaBaseMeshAlgo () +{ +} + +//======================================================================= +//function : buildBaseTriangulation +//purpose : +//======================================================================= +void BRepMesh_DelabellaBaseMeshAlgo::buildBaseTriangulation() +{ + const Handle(BRepMesh_DataStructureOfDelaun)& aStructure = this->getStructure(); + + Bnd_B2d aBox; + const Standard_Integer aNodesNb = aStructure->NbNodes (); + std::vector aPoints (2 * (aNodesNb + 4)); + for (Standard_Integer aNodeIt = 0; aNodeIt < aNodesNb; ++aNodeIt) + { + const BRepMesh_Vertex& aVertex = aStructure->GetNode (aNodeIt + 1); + + const size_t aBaseIdx = 2 * static_cast (aNodeIt); + aPoints[aBaseIdx + 0] = aVertex.Coord ().X (); + aPoints[aBaseIdx + 1] = aVertex.Coord ().Y (); + + aBox.Add (gp_Pnt2d(aVertex.Coord ())); + } + + aBox.Enlarge (0.1 * (aBox.CornerMax () - aBox.CornerMin ()).Modulus ()); + const gp_XY aMin = aBox.CornerMin (); + const gp_XY aMax = aBox.CornerMax (); + + aPoints[2 * aNodesNb + 0] = aMin.X (); + aPoints[2 * aNodesNb + 1] = aMin.Y (); + aStructure->AddNode (BRepMesh_Vertex ( + aPoints[2 * aNodesNb + 0], + aPoints[2 * aNodesNb + 1], BRepMesh_Free)); + + aPoints[2 * aNodesNb + 2] = aMax.X (); + aPoints[2 * aNodesNb + 3] = aMin.Y (); + aStructure->AddNode (BRepMesh_Vertex ( + aPoints[2 * aNodesNb + 2], + aPoints[2 * aNodesNb + 3], BRepMesh_Free)); + + aPoints[2 * aNodesNb + 4] = aMax.X (); + aPoints[2 * aNodesNb + 5] = aMax.Y (); + aStructure->AddNode (BRepMesh_Vertex ( + aPoints[2 * aNodesNb + 4], + aPoints[2 * aNodesNb + 5], BRepMesh_Free)); + + aPoints[2 * aNodesNb + 6] = aMin.X (); + aPoints[2 * aNodesNb + 7] = aMax.Y (); + aStructure->AddNode (BRepMesh_Vertex ( + aPoints[2 * aNodesNb + 6], + aPoints[2 * aNodesNb + 7], BRepMesh_Free)); + + const Standard_Real aDiffX = (aMax.X () - aMin.X ()); + const Standard_Real aDiffY = (aMax.Y () - aMin.Y ()); + for (size_t i = 0; i < aPoints.size(); i += 2) + { + aPoints[i + 0] = (aPoints[i + 0] - aMin.X ()) / aDiffX - 0.5; + aPoints[i + 1] = (aPoints[i + 1] - aMin.Y ()) / aDiffY - 0.5; + } + + IDelaBella* aTriangulator = IDelaBella::Create(); + if (aTriangulator == NULL) // should never happen + { + throw Standard_ProgramError ("BRepMesh_DelabellaBaseMeshAlgo::buildBaseTriangulation: unable creating a triangulation algorithm"); + } + + aTriangulator->SetErrLog (logDelabella2Occ, NULL); + try + { + const int aVerticesNb = aTriangulator->Triangulate ( + static_cast(aPoints.size () / 2), + &aPoints[0], &aPoints[1], 2 * sizeof (Standard_Real)); + + if (aVerticesNb > 0) + { + const DelaBella_Triangle* aTrianglePtr = aTriangulator->GetFirstDelaunayTriangle(); + while (aTrianglePtr != NULL) + { + Standard_Integer aNodes[3] = { + aTrianglePtr->v[0]->i + 1, + aTrianglePtr->v[2]->i + 1, + aTrianglePtr->v[1]->i + 1 + }; + + Standard_Integer aEdges [3]; + Standard_Boolean aOrientations[3]; + for (Standard_Integer k = 0; k < 3; ++k) + { + const BRepMesh_Edge aLink (aNodes[k], aNodes[(k + 1) % 3], BRepMesh_Free); + + const Standard_Integer aLinkInfo = aStructure->AddLink (aLink); + aEdges [k] = Abs (aLinkInfo); + aOrientations[k] = aLinkInfo > 0; + } + + const BRepMesh_Triangle aTriangle (aEdges, aOrientations, BRepMesh_Free); + aStructure->AddElement (aTriangle); + + aTrianglePtr = aTrianglePtr->next; + } + } + + aTriangulator->Destroy (); + aTriangulator = NULL; + } + catch (Standard_Failure const& theException) + { + if (aTriangulator != NULL) + { + aTriangulator->Destroy (); + aTriangulator = NULL; + } + + throw Standard_Failure (theException); + } + catch (...) + { + if (aTriangulator != NULL) + { + aTriangulator->Destroy (); + aTriangulator = NULL; + } + + throw Standard_Failure ("BRepMesh_DelabellaBaseMeshAlgo::buildBaseTriangulation: exception in triangulation algorithm"); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaBaseMeshAlgo.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaBaseMeshAlgo.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaBaseMeshAlgo.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaBaseMeshAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,46 @@ +// Created on: 2019-07-05 +// Copyright (c) 2019 OPEN CASCADE SAS +// Created by: Oleg AGASHIN +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _BRepMesh_DelabellaBaseMeshAlgo_HeaderFile +#define _BRepMesh_DelabellaBaseMeshAlgo_HeaderFile + +#include +#include +#include + +class BRepMesh_DataStructureOfDelaun; +class BRepMesh_Delaun; + +//! Class provides base functionality to build face triangulation using Delabella project. +//! Performs generation of mesh using raw data from model. +class BRepMesh_DelabellaBaseMeshAlgo : public BRepMesh_CustomBaseMeshAlgo +{ +public: + + //! Constructor. + Standard_EXPORT BRepMesh_DelabellaBaseMeshAlgo (); + + //! Destructor. + Standard_EXPORT virtual ~BRepMesh_DelabellaBaseMeshAlgo (); + + DEFINE_STANDARD_RTTIEXT(BRepMesh_DelabellaBaseMeshAlgo, BRepMesh_CustomBaseMeshAlgo) + +protected: + + //! Builds base triangulation using Delabella project. + Standard_EXPORT virtual void buildBaseTriangulation() Standard_OVERRIDE; +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaMeshAlgoFactory.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaMeshAlgoFactory.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaMeshAlgoFactory.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaMeshAlgoFactory.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,145 @@ +// Created on: 2019-07-05 +// Copyright (c) 2019 OPEN CASCADE SAS +// Created by: Oleg AGASHIN +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + struct DefaultBaseMeshAlgo + { + typedef BRepMesh_DelaunayBaseMeshAlgo Type; + }; + + template + struct DefaultNodeInsertionMeshAlgo + { + typedef BRepMesh_DelaunayNodeInsertionMeshAlgo Type; + }; + + struct BaseMeshAlgo + { + typedef BRepMesh_DelabellaBaseMeshAlgo Type; + }; + + template + struct NodeInsertionMeshAlgo + { + typedef BRepMesh_DelaunayNodeInsertionMeshAlgo > Type; + }; + + template + struct DeflectionControlMeshAlgo + { + typedef BRepMesh_DelaunayDeflectionControlMeshAlgo > Type; + }; +} + +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_DelabellaMeshAlgoFactory, IMeshTools_MeshAlgoFactory) + +//======================================================================= +// Function: Constructor +// Purpose : +//======================================================================= +BRepMesh_DelabellaMeshAlgoFactory::BRepMesh_DelabellaMeshAlgoFactory () +{ +} + +//======================================================================= +// Function: Destructor +// Purpose : +//======================================================================= +BRepMesh_DelabellaMeshAlgoFactory::~BRepMesh_DelabellaMeshAlgoFactory () +{ +} + +//======================================================================= +// Function: GetAlgo +// Purpose : +//======================================================================= +Handle(IMeshTools_MeshAlgo) BRepMesh_DelabellaMeshAlgoFactory::GetAlgo( + const GeomAbs_SurfaceType theSurfaceType, + const IMeshTools_Parameters& theParameters) const +{ + switch (theSurfaceType) + { + case GeomAbs_Plane: + return theParameters.InternalVerticesMode ? + new NodeInsertionMeshAlgo::Type : + new BaseMeshAlgo::Type; + break; + + case GeomAbs_Sphere: + { + NodeInsertionMeshAlgo::Type* aMeshAlgo = + new NodeInsertionMeshAlgo::Type; + aMeshAlgo->SetPreProcessSurfaceNodes (Standard_True); + return aMeshAlgo; + } + break; + + case GeomAbs_Cylinder: + return theParameters.InternalVerticesMode ? + new DefaultNodeInsertionMeshAlgo::Type : + new DefaultBaseMeshAlgo::Type; + break; + + case GeomAbs_Cone: + { + NodeInsertionMeshAlgo::Type* aMeshAlgo = + new NodeInsertionMeshAlgo::Type; + aMeshAlgo->SetPreProcessSurfaceNodes (Standard_True); + return aMeshAlgo; + } + break; + + case GeomAbs_Torus: + { + NodeInsertionMeshAlgo::Type* aMeshAlgo = + new NodeInsertionMeshAlgo::Type; + aMeshAlgo->SetPreProcessSurfaceNodes (Standard_True); + return aMeshAlgo; + } + break; + + case GeomAbs_SurfaceOfRevolution: + { + DeflectionControlMeshAlgo::Type* aMeshAlgo = + new DeflectionControlMeshAlgo::Type; + aMeshAlgo->SetPreProcessSurfaceNodes (Standard_True); + return aMeshAlgo; + } + break; + + default: + { + DeflectionControlMeshAlgo::Type* aMeshAlgo = + new DeflectionControlMeshAlgo::Type; + aMeshAlgo->SetPreProcessSurfaceNodes (Standard_True); + return aMeshAlgo; + } + } +} diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaMeshAlgoFactory.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaMeshAlgoFactory.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaMeshAlgoFactory.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelabellaMeshAlgoFactory.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,44 @@ +// Created on: 2019-07-05 +// Copyright (c) 2019 OPEN CASCADE SAS +// Created by: Oleg AGASHIN +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _BRepMesh_DelabellaMeshAlgoFactory_HeaderFile +#define _BRepMesh_DelabellaMeshAlgoFactory_HeaderFile + +#include +#include +#include +#include + +//! Implementation of IMeshTools_MeshAlgoFactory providing Delabella-based +//! algorithms of different complexity depending on type of target surface. +class BRepMesh_DelabellaMeshAlgoFactory : public IMeshTools_MeshAlgoFactory +{ +public: + + //! Constructor. + Standard_EXPORT BRepMesh_DelabellaMeshAlgoFactory (); + + //! Destructor. + Standard_EXPORT virtual ~BRepMesh_DelabellaMeshAlgoFactory (); + + //! Creates instance of meshing algorithm for the given type of surface. + Standard_EXPORT virtual Handle(IMeshTools_MeshAlgo) GetAlgo( + const GeomAbs_SurfaceType theSurfaceType, + const IMeshTools_Parameters& theParameters) const Standard_OVERRIDE; + + DEFINE_STANDARD_RTTIEXT(BRepMesh_DelabellaMeshAlgoFactory, IMeshTools_MeshAlgoFactory) +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayBaseMeshAlgo.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayBaseMeshAlgo.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayBaseMeshAlgo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayBaseMeshAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_DelaunayBaseMeshAlgo, BRepMesh_ConstrainedBaseMeshAlgo) + //======================================================================= // Function: Constructor // Purpose : @@ -37,7 +39,7 @@ //function : generateMesh //purpose : //======================================================================= -void BRepMesh_DelaunayBaseMeshAlgo::generateMesh() +void BRepMesh_DelaunayBaseMeshAlgo::generateMesh(const Message_ProgressRange& theRange) { const Handle(BRepMesh_DataStructureOfDelaun)& aStructure = getStructure(); const Handle(VectorOfPnt)& aNodesMap = getNodesMap(); @@ -53,5 +55,9 @@ BRepMesh_MeshTool aCleaner(aStructure); aCleaner.EraseFreeLinks(); - postProcessMesh(aMesher); + if (!theRange.More()) + { + return; + } + postProcessMesh(aMesher, theRange); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayBaseMeshAlgo.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayBaseMeshAlgo.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayBaseMeshAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayBaseMeshAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,7 +23,7 @@ class BRepMesh_DataStructureOfDelaun; class BRepMesh_Delaun; -//! Class provides base fuctionality to build face triangulation using Dealunay approach. +//! Class provides base functionality to build face triangulation using Dealunay approach. //! Performs generation of mesh using raw data from model. class BRepMesh_DelaunayBaseMeshAlgo : public BRepMesh_ConstrainedBaseMeshAlgo { @@ -35,12 +35,12 @@ //! Destructor. Standard_EXPORT virtual ~BRepMesh_DelaunayBaseMeshAlgo(); - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_DelaunayBaseMeshAlgo, BRepMesh_ConstrainedBaseMeshAlgo) + DEFINE_STANDARD_RTTIEXT(BRepMesh_DelaunayBaseMeshAlgo, BRepMesh_ConstrainedBaseMeshAlgo) protected: //! Generates mesh for the contour stored in data structure. - Standard_EXPORT virtual void generateMesh() Standard_OVERRIDE; + Standard_EXPORT virtual void generateMesh (const Message_ProgressRange& theRange) Standard_OVERRIDE; }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayDeflectionControlMeshAlgo.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayDeflectionControlMeshAlgo.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayDeflectionControlMeshAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayDeflectionControlMeshAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,8 @@ //! Constructor. BRepMesh_DelaunayDeflectionControlMeshAlgo() : myMaxSqDeflection(-1.), - myIsAllDegenerated(Standard_False) + myIsAllDegenerated(Standard_False), + myCircles(NULL) { } @@ -45,22 +46,33 @@ protected: - //! Perfroms processing of generated mesh. Generates surface nodes and inserts them into structure. - virtual void postProcessMesh(BRepMesh_Delaun& theMesher) Standard_OVERRIDE + //! Performs processing of generated mesh. Generates surface nodes and inserts them into structure. + virtual void postProcessMesh (BRepMesh_Delaun& theMesher, + const Message_ProgressRange& theRange) Standard_OVERRIDE { + Message_ProgressScope aPS(theRange, "Post process mesh", 2); // Insert surface nodes. - DelaunayInsertionBaseClass::postProcessMesh(theMesher); + DelaunayInsertionBaseClass::postProcessMesh (theMesher, aPS.Next()); + if (!aPS.More()) + { + return; + } if (this->getParameters().ControlSurfaceDeflection && this->getStructure()->ElementsOfDomain().Extent() > 0) { - optimizeMesh(theMesher); + optimizeMesh(theMesher, aPS.Next()); + } + else + { + aPS.Next(); } } //! Checks deviation of a mesh from geometrical surface. //! Inserts additional nodes in case of huge deviation. - virtual void optimizeMesh(BRepMesh_Delaun& theMesher) + virtual void optimizeMesh (BRepMesh_Delaun& theMesher, + const Message_ProgressRange& theRange) { Handle(NCollection_IncAllocator) aTmpAlloc = new NCollection_IncAllocator(IMeshData::MEMORY_BLOCK_SIZE_HUGE); @@ -71,8 +83,13 @@ const Standard_Integer aIterationsNb = 11; Standard_Boolean isInserted = Standard_True; + Message_ProgressScope aPS(theRange, "Iteration", aIterationsNb); for (Standard_Integer aPass = 1; aPass <= aIterationsNb && isInserted && !myIsAllDegenerated; ++aPass) { + if (!aPS.More()) + { + return; + } // Reset stop condition myMaxSqDeflection = -1.; myIsAllDegenerated = Standard_True; @@ -82,7 +99,6 @@ { break; } - // Iterate on current triangles IMeshData::IteratorOfMapOfInteger aTriangleIt(this->getStructure()->ElementsOfDomain()); for (; aTriangleIt.More(); aTriangleIt.Next()) @@ -91,7 +107,7 @@ splitTriangleGeometry(aTriangle); } - isInserted = this->insertNodes(myControlNodes, theMesher); + isInserted = this->insertNodes(myControlNodes, theMesher, aPS.Next()); } myCouplesMap.Nullify(); @@ -107,6 +123,11 @@ //! Contains geometrical data related to node of triangle. struct TriangleNodeInfo { + TriangleNodeInfo() + : isFrontierLink(Standard_False) + { + } + gp_XY Point2d; gp_XYZ Point; Standard_Boolean isFrontierLink; @@ -172,7 +193,7 @@ }; //! Returns nodes info of the given triangle. - inline void getTriangleInfo( + void getTriangleInfo( const BRepMesh_Triangle& theTriangle, const Standard_Integer (&theNodesIndices)[3], TriangleNodeInfo (&theInfo)[3]) const @@ -216,7 +237,7 @@ //! Updates array of links vectors. //! @return False on degenerative triangle. - inline Standard_Boolean computeTriangleGeometry( + Standard_Boolean computeTriangleGeometry( const TriangleNodeInfo(&theNodesInfo)[3], gp_Vec (&theLinks)[3], gp_Vec &theNormal) @@ -237,7 +258,7 @@ //! Updates array of links vectors. //! @return False on degenerative triangle. - inline Standard_Boolean checkTriangleForDegenerativityAndGetLinks( + Standard_Boolean checkTriangleForDegenerativityAndGetLinks( const TriangleNodeInfo (&theNodesInfo)[3], gp_Vec (&theLinks)[3]) { @@ -256,7 +277,7 @@ //! Checks area of triangle in parametric space for degenerativity. //! @return False on degenerative triangle. - inline Standard_Boolean checkTriangleArea2d( + Standard_Boolean checkTriangleArea2d( const TriangleNodeInfo (&theNodesInfo)[3]) { const gp_Vec2d aLink2d1(theNodesInfo[0].Point2d, theNodesInfo[1].Point2d); @@ -268,9 +289,9 @@ //! Computes normal using two link vectors. //! @return True on success, False in case of normal of null magnitude. - inline Standard_Boolean computeNormal(const gp_Vec& theLink1, - const gp_Vec& theLink2, - gp_Vec& theNormal) + Standard_Boolean computeNormal(const gp_Vec& theLink1, + const gp_Vec& theLink2, + gp_Vec& theNormal) { const gp_Vec aNormal(theLink1 ^ theLink2); if (aNormal.SquareMagnitude() > gp::Resolution()) @@ -284,7 +305,7 @@ //! Computes deflection of midpoints of triangles links. //! @return True if point fits specified deflection. - inline void splitLinks( + void splitLinks( const TriangleNodeInfo (&theNodesInfo)[3], const Standard_Integer (&theNodesIndices)[3]) { @@ -364,7 +385,7 @@ //! insertion in case if it overflows deflection. //! @return True if point has been cached for insertion. template - inline Standard_Boolean usePoint( + Standard_Boolean usePoint( const gp_XY& thePnt2d, const DeflectionFunctor& theDeflectionFunctor) { diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayNodeInsertionMeshAlgo.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayNodeInsertionMeshAlgo.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayNodeInsertionMeshAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DelaunayNodeInsertionMeshAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,7 +42,7 @@ } //! Returns PreProcessSurfaceNodes flag. - inline Standard_Boolean IsPreProcessSurfaceNodes () const + Standard_Boolean IsPreProcessSurfaceNodes () const { return myIsPreProcessSurfaceNodes; } @@ -50,7 +50,7 @@ //! Sets PreProcessSurfaceNodes flag. //! If TRUE, registers surface nodes before generation of base mesh. //! If FALSE, inserts surface nodes after generation of base mesh. - inline void SetPreProcessSurfaceNodes (const Standard_Boolean isPreProcessSurfaceNodes) + void SetPreProcessSurfaceNodes (const Standard_Boolean isPreProcessSurfaceNodes) { myIsPreProcessSurfaceNodes = isPreProcessSurfaceNodes; } @@ -84,24 +84,30 @@ &this->getRangeSplitter()); } - //! Perfroms processing of generated mesh. Generates surface nodes and inserts them into structure. - virtual void postProcessMesh(BRepMesh_Delaun& theMesher) Standard_OVERRIDE + //! Performs processing of generated mesh. Generates surface nodes and inserts them into structure. + virtual void postProcessMesh (BRepMesh_Delaun& theMesher, + const Message_ProgressRange& theRange) Standard_OVERRIDE { - InsertionBaseClass::postProcessMesh(theMesher); + if (!theRange.More()) + { + return; + } + InsertionBaseClass::postProcessMesh (theMesher, Message_ProgressRange()); // shouldn't be range passed here? if (!myIsPreProcessSurfaceNodes) { const Handle(IMeshData::ListOfPnt2d) aSurfaceNodes = this->getRangeSplitter().GenerateSurfaceNodes(this->getParameters()); - insertNodes(aSurfaceNodes, theMesher); + insertNodes(aSurfaceNodes, theMesher, theRange); } } //! Inserts nodes into mesh. Standard_Boolean insertNodes( const Handle(IMeshData::ListOfPnt2d)& theNodes, - BRepMesh_Delaun& theMesher) + BRepMesh_Delaun& theMesher, + const Message_ProgressRange& theRange) { if (theNodes.IsNull() || theNodes->IsEmpty()) { @@ -120,7 +126,11 @@ } } - theMesher.AddVertices(aVertexIndexes); + theMesher.AddVertices (aVertexIndexes, theRange); + if (!theRange.More()) + { + return Standard_False; + } return !aVertexIndexes.IsEmpty(); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Delaun.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Delaun.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Delaun.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Delaun.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,6 +34,7 @@ #include #include +#include const Standard_Real AngDeviation1Deg = M_PI/180.; const Standard_Real AngDeviation90Deg = 90 * AngDeviation1Deg; @@ -70,7 +71,7 @@ Handle(BRepMesh_DataStructureOfDelaun) myStructure; }; - inline void UpdateBndBox(const gp_XY& thePnt1, const gp_XY& thePnt2, Bnd_B2d& theBox) + void UpdateBndBox(const gp_XY& thePnt1, const gp_XY& thePnt2, Bnd_B2d& theBox) { theBox.Add( thePnt1 ); theBox.Add( thePnt2 ); @@ -89,7 +90,9 @@ const Standard_Boolean isFillCircles) : myMeshData ( theOldMesh ), myCircles (new NCollection_IncAllocator( - IMeshData::MEMORY_BLOCK_SIZE_HUGE)) + IMeshData::MEMORY_BLOCK_SIZE_HUGE)), + mySupVert (3), + myInitCircles (Standard_False) { if (isFillCircles) { @@ -103,7 +106,9 @@ //======================================================================= BRepMesh_Delaun::BRepMesh_Delaun(IMeshData::Array1OfVertexOfDelaun& theVertices) : myCircles (theVertices.Length(), new NCollection_IncAllocator( - IMeshData::MEMORY_BLOCK_SIZE_HUGE)) + IMeshData::MEMORY_BLOCK_SIZE_HUGE)), + mySupVert (3), + myInitCircles (Standard_False) { if ( theVertices.Length() > 2 ) { @@ -123,7 +128,9 @@ IMeshData::Array1OfVertexOfDelaun& theVertices) : myMeshData( theOldMesh ), myCircles ( theVertices.Length(), new NCollection_IncAllocator( - IMeshData::MEMORY_BLOCK_SIZE_HUGE)) + IMeshData::MEMORY_BLOCK_SIZE_HUGE)), + mySupVert (3), + myInitCircles (Standard_False) { if ( theVertices.Length() > 2 ) { @@ -140,7 +147,9 @@ IMeshData::VectorOfInteger& theVertexIndices) : myMeshData( theOldMesh ), myCircles ( theVertexIndices.Length(), new NCollection_IncAllocator( - IMeshData::MEMORY_BLOCK_SIZE_HUGE)) + IMeshData::MEMORY_BLOCK_SIZE_HUGE)), + mySupVert (3), + myInitCircles (Standard_False) { perform(theVertexIndices); } @@ -155,7 +164,9 @@ const Standard_Integer theCellsCountV) : myMeshData (theOldMesh), myCircles (theVertexIndices.Length (), new NCollection_IncAllocator( - IMeshData::MEMORY_BLOCK_SIZE_HUGE)) + IMeshData::MEMORY_BLOCK_SIZE_HUGE)), + mySupVert (3), + myInitCircles (Standard_False) { perform (theVertexIndices, theCellsCountU, theCellsCountV); } @@ -234,6 +245,8 @@ myCircles.SetMinMaxSize( gp_XY( aMinX, aMinY ), gp_XY( aMaxX, aMaxY ) ); myCircles.SetCellSize ( aDeltaX / Max (theCellsCountU, aScaler), aDeltaY / Max (theCellsCountV, aScaler)); + + myInitCircles = Standard_True; } //======================================================================= @@ -284,14 +297,14 @@ Standard_Real aDeltaMax = Max( aDeltaX, aDeltaY ); Standard_Real aDelta = aDeltaX + aDeltaY; - mySupVert[0] = myMeshData->AddNode( - BRepMesh_Vertex( ( aMinX + aMaxX ) / 2, aMaxY + aDeltaMax, BRepMesh_Free ) ); + mySupVert.Append (myMeshData->AddNode( + BRepMesh_Vertex( ( aMinX + aMaxX ) / 2, aMaxY + aDeltaMax, BRepMesh_Free ) ) ); - mySupVert[1] = myMeshData->AddNode( - BRepMesh_Vertex( aMinX - aDelta, aMinY - aDeltaMin, BRepMesh_Free ) ); + mySupVert.Append (myMeshData->AddNode( + BRepMesh_Vertex( aMinX - aDelta, aMinY - aDeltaMin, BRepMesh_Free ) ) ); - mySupVert[2] = myMeshData->AddNode( - BRepMesh_Vertex( aMaxX + aDelta, aMinY - aDeltaMin, BRepMesh_Free ) ); + mySupVert.Append (myMeshData->AddNode( + BRepMesh_Vertex( aMaxX + aDelta, aMinY - aDeltaMin, BRepMesh_Free ) ) ); Standard_Integer e[3]; Standard_Boolean o[3]; @@ -318,7 +331,7 @@ void BRepMesh_Delaun::deleteTriangle(const Standard_Integer theIndex, IMeshData::MapOfIntegerInteger& theLoopEdges ) { - if (!myCircles.IsEmpty()) + if (myInitCircles) { myCircles.Delete (theIndex); } @@ -364,15 +377,28 @@ createTriangles( theVertexIndexes( anVertexIdx ), aLoopEdges ); // Add other nodes to the mesh - createTrianglesOnNewVertices( theVertexIndexes ); + createTrianglesOnNewVertices (theVertexIndexes, Message_ProgressRange()); } + RemoveAuxElements (); +} + +//======================================================================= +//function : RemoveAuxElements +//purpose : +//======================================================================= +void BRepMesh_Delaun::RemoveAuxElements () +{ + Handle (NCollection_IncAllocator) aAllocator = new NCollection_IncAllocator ( + IMeshData::MEMORY_BLOCK_SIZE_HUGE); + + IMeshData::MapOfIntegerInteger aLoopEdges (10, aAllocator); + // Destruction of triangles containing a top of the super triangle - BRepMesh_SelectorOfDataStructureOfDelaun aSelector( myMeshData ); - for (Standard_Integer aSupVertId = 0; aSupVertId < 3; ++aSupVertId) + BRepMesh_SelectorOfDataStructureOfDelaun aSelector (myMeshData); + for (Standard_Integer aSupVertId = 0; aSupVertId < mySupVert.Size(); ++aSupVertId) aSelector.NeighboursOfNode( mySupVert[aSupVertId] ); - - aLoopEdges.Clear(); + IMeshData::IteratorOfMapOfInteger aFreeTriangles( aSelector.Elements() ); for ( ; aFreeTriangles.More(); aFreeTriangles.Next() ) deleteTriangle( aFreeTriangles.Key(), aLoopEdges ); @@ -387,7 +413,7 @@ } // The tops of the super triangle are destroyed - for (Standard_Integer aSupVertId = 0; aSupVertId < 3; ++aSupVertId) + for (Standard_Integer aSupVertId = 0; aSupVertId < mySupVert.Size (); ++aSupVertId) myMeshData->RemoveNode( mySupVert[aSupVertId] ); } @@ -517,7 +543,8 @@ //purpose : Creation of triangles from the new nodes //======================================================================= void BRepMesh_Delaun::createTrianglesOnNewVertices( - IMeshData::VectorOfInteger& theVertexIndexes) + IMeshData::VectorOfInteger& theVertexIndexes, + const Message_ProgressRange& theRange) { Handle(NCollection_IncAllocator) aAllocator = new NCollection_IncAllocator(IMeshData::MEMORY_BLOCK_SIZE_HUGE); @@ -531,8 +558,13 @@ Standard_Integer anIndex = theVertexIndexes.Lower(); Standard_Integer anUpper = theVertexIndexes.Upper(); - for( ; anIndex <= anUpper; ++anIndex ) + Message_ProgressScope aPS(theRange, "Create triangles on new vertices", anUpper); + for (; anIndex <= anUpper; ++anIndex, aPS.Next()) { + if (!aPS.More()) + { + return; + } aAllocator->Reset(Standard_False); IMeshData::MapOfIntegerInteger aLoopEdges(10, aAllocator); @@ -610,7 +642,7 @@ //======================================================================= void BRepMesh_Delaun::insertInternalEdges() { - Handle(IMeshData::MapOfInteger) anInternalEdges = InternalEdges();; + Handle(IMeshData::MapOfInteger) anInternalEdges = InternalEdges(); // Destruction of triancles intersecting internal edges // and their replacement by makeshift triangles @@ -652,53 +684,56 @@ //======================================================================= //function : isBoundToFrontier -//purpose : Goes through the neighbour triangles around the given node -// started from the given link, returns TRUE if some triangle -// has a bounding frontier edge or FALSE elsewhere. -// Stop link is used to prevent cycles. -// Previous element Id is used to identify next neighbor element. +//purpose : //======================================================================= Standard_Boolean BRepMesh_Delaun::isBoundToFrontier( const Standard_Integer theRefNodeId, - const Standard_Integer theRefLinkId, - const Standard_Integer theStopLinkId, - const Standard_Integer thePrevElementId) + const Standard_Integer theRefLinkId) { - const BRepMesh_PairOfIndex& aPair = - myMeshData->ElementsConnectedTo( theRefLinkId ); - if ( aPair.IsEmpty() ) - return Standard_False; + std::stack aLinkStack; + TColStd_PackedMapOfInteger aVisitedLinks; - Standard_Integer aNbElements = aPair.Extent(); - for ( Standard_Integer anElemIt = 1; anElemIt <= aNbElements; ++anElemIt ) + aLinkStack.push (theRefLinkId); + while (!aLinkStack.empty ()) { - const Standard_Integer aTriId = aPair.Index(anElemIt); - if ( aTriId < 0 || aTriId == thePrevElementId ) - continue; + const Standard_Integer aCurrentLinkId = aLinkStack.top (); + aLinkStack.pop (); - const BRepMesh_Triangle& aElement = GetTriangle(aTriId); - const Standard_Integer(&anEdges)[3] = aElement.myEdges; + const BRepMesh_PairOfIndex& aPair = myMeshData->ElementsConnectedTo (aCurrentLinkId); + if (aPair.IsEmpty ()) + return Standard_False; - for ( Standard_Integer anEdgeIt = 0; anEdgeIt < 3; ++anEdgeIt ) + const Standard_Integer aNbElements = aPair.Extent (); + for (Standard_Integer anElemIt = 1; anElemIt <= aNbElements; ++anElemIt) { - const Standard_Integer anEdgeId = anEdges[anEdgeIt]; - if ( anEdgeId == theRefLinkId ) + const Standard_Integer aTriId = aPair.Index (anElemIt); + if (aTriId < 0) continue; - if ( anEdgeId == theStopLinkId ) - return Standard_False; + const BRepMesh_Triangle& aElement = GetTriangle (aTriId); + const Standard_Integer (&anEdges)[3] = aElement.myEdges; - const BRepMesh_Edge& anEdge = GetEdge( anEdgeId ); - if ( anEdge.FirstNode() != theRefNodeId && - anEdge.LastNode() != theRefNodeId ) + for (Standard_Integer anEdgeIt = 0; anEdgeIt < 3; ++anEdgeIt) { - continue; - } + const Standard_Integer anEdgeId = anEdges[anEdgeIt]; + if (anEdgeId == aCurrentLinkId) + continue; - if ( anEdge.Movability() != BRepMesh_Free ) - return Standard_True; + const BRepMesh_Edge& anEdge = GetEdge (anEdgeId); + if (anEdge.FirstNode () != theRefNodeId && + anEdge.LastNode () != theRefNodeId) + { + continue; + } + + if (anEdge.Movability () != BRepMesh_Free) + return Standard_True; - return isBoundToFrontier( theRefNodeId, anEdgeId, theStopLinkId, aTriId ); + if (aVisitedLinks.Add (anEdgeId)) + { + aLinkStack.push (anEdgeId); + } + } } } @@ -771,9 +806,7 @@ myMeshData->ElementNodes (aCurTriangle, v); for (int aNodeIdx = 0; aNodeIdx < 3 && isCanNotBeRemoved; ++aNodeIdx) { - if (v[aNodeIdx] == mySupVert[0] || - v[aNodeIdx] == mySupVert[1] || - v[aNodeIdx] == mySupVert[2]) + if (isSupVertex (v[aNodeIdx])) { isCanNotBeRemoved = Standard_False; } @@ -792,8 +825,7 @@ for ( Standard_Integer aLinkNodeIt = 0; aLinkNodeIt < 2; ++aLinkNodeIt ) { isConnected[aLinkNodeIt] = isBoundToFrontier( ( aLinkNodeIt == 0 ) ? - anEdge.FirstNode() : anEdge.LastNode(), - aFreeEdgeId, aFreeEdgeId, -1); + anEdge.FirstNode() : anEdge.LastNode(), aFreeEdgeId); } if ( !isConnected[0] || !isConnected[1] ) @@ -1224,19 +1256,23 @@ //function : addTriangle //purpose : Add a triangle based on the given oriented edges into mesh //======================================================================= -inline void BRepMesh_Delaun::addTriangle( const Standard_Integer (&theEdgesId)[3], - const Standard_Boolean (&theEdgesOri)[3], - const Standard_Integer (&theNodesId)[3] ) +void BRepMesh_Delaun::addTriangle( const Standard_Integer (&theEdgesId)[3], + const Standard_Boolean (&theEdgesOri)[3], + const Standard_Integer (&theNodesId)[3] ) { Standard_Integer aNewTriangleId = myMeshData->AddElement(BRepMesh_Triangle(theEdgesId, theEdgesOri, BRepMesh_Free)); - Standard_Boolean isAdded = myCircles.Bind( - aNewTriangleId, - GetVertex( theNodesId[0] ).Coord(), - GetVertex( theNodesId[1] ).Coord(), - GetVertex( theNodesId[2] ).Coord() ); + Standard_Boolean isAdded = Standard_True; + if (myInitCircles) + { + isAdded = myCircles.Bind( + aNewTriangleId, + GetVertex( theNodesId[0] ).Coord(), + GetVertex( theNodesId[1] ).Coord(), + GetVertex( theNodesId[2] ).Coord() ); + } if ( !isAdded ) myMeshData->RemoveElement( aNewTriangleId ); @@ -1890,7 +1926,7 @@ //function : meshElementaryPolygon //purpose : Triangulation of closed polygon containing only three edges. //======================================================================= -inline Standard_Boolean BRepMesh_Delaun::meshElementaryPolygon( +Standard_Boolean BRepMesh_Delaun::meshElementaryPolygon( const IMeshData::SequenceOfInteger& thePolygon) { Standard_Integer aPolyLen = thePolygon.Length(); @@ -2199,13 +2235,14 @@ //function : AddVertices //purpose : Adds some vertices in the triangulation. //======================================================================= -void BRepMesh_Delaun::AddVertices(IMeshData::VectorOfInteger& theVertices) +void BRepMesh_Delaun::AddVertices(IMeshData::VectorOfInteger& theVertices, + const Message_ProgressRange& theRange) { ComparatorOfIndexedVertexOfDelaun aCmp(myMeshData); std::make_heap(theVertices.begin(), theVertices.end(), aCmp); std::sort_heap(theVertices.begin(), theVertices.end(), aCmp); - createTrianglesOnNewVertices(theVertices); + createTrianglesOnNewVertices(theVertices, theRange); } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Delaun.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Delaun.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Delaun.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Delaun.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,6 +29,7 @@ #include #include #include +#include class Bnd_B2d; class Bnd_Box2d; @@ -75,20 +76,21 @@ Standard_EXPORT void RemoveVertex (const BRepMesh_Vertex& theVertex); //! Adds some vertices into the triangulation. - Standard_EXPORT void AddVertices (IMeshData::VectorOfInteger& theVerticesIndices); + Standard_EXPORT void AddVertices (IMeshData::VectorOfInteger& theVerticesIndices, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Modify mesh to use the edge. //! @return True if done Standard_EXPORT Standard_Boolean UseEdge (const Standard_Integer theEdge); //! Gives the Mesh data structure. - inline const Handle(BRepMesh_DataStructureOfDelaun)& Result() const + const Handle(BRepMesh_DataStructureOfDelaun)& Result() const { return myMeshData; } //! Forces insertion of constraint edges into the base triangulation. - inline void ProcessConstraints() + void ProcessConstraints() { insertInternalEdges(); @@ -97,43 +99,43 @@ } //! Gives the list of frontier edges. - inline Handle(IMeshData::MapOfInteger) Frontier() const + Handle(IMeshData::MapOfInteger) Frontier() const { return getEdgesByType (BRepMesh_Frontier); } //! Gives the list of internal edges. - inline Handle(IMeshData::MapOfInteger) InternalEdges() const + Handle(IMeshData::MapOfInteger) InternalEdges() const { return getEdgesByType (BRepMesh_Fixed); } //! Gives the list of free edges used only one time - inline Handle(IMeshData::MapOfInteger) FreeEdges() const + Handle(IMeshData::MapOfInteger) FreeEdges() const { return getEdgesByType (BRepMesh_Free); } //! Gives vertex with the given index - inline const BRepMesh_Vertex& GetVertex (const Standard_Integer theIndex) const + const BRepMesh_Vertex& GetVertex (const Standard_Integer theIndex) const { return myMeshData->GetNode (theIndex); } //! Gives edge with the given index - inline const BRepMesh_Edge& GetEdge (const Standard_Integer theIndex) const + const BRepMesh_Edge& GetEdge (const Standard_Integer theIndex) const { return myMeshData->GetLink (theIndex); } //! Gives triangle with the given index - inline const BRepMesh_Triangle& GetTriangle (const Standard_Integer theIndex) const + const BRepMesh_Triangle& GetTriangle (const Standard_Integer theIndex) const { return myMeshData->GetElement (theIndex); } //! Returns tool used to build mesh consistent to Delaunay criteria. - inline const BRepMesh_CircleTool& Circles() const + const BRepMesh_CircleTool& Circles() const { return myCircles; } @@ -147,6 +149,17 @@ const Standard_Real theSqTolerance, Standard_Integer& theEdgeOn) const; + //! Explicitly sets ids of auxiliary vertices used to build mesh and used by 3rd-party algorithms. + inline void SetAuxVertices (const IMeshData::VectorOfInteger& theSupVert) + { + mySupVert = theSupVert; + } + + //! Destruction of auxiliary triangles containing the given vertices. + //! Removes auxiliary vertices also. + //! @param theAuxVertices auxiliary vertices to be cleaned up. + Standard_EXPORT void RemoveAuxElements (); + private: enum ReplaceFlag @@ -247,16 +260,16 @@ IMeshData::SequenceOfBndB2d& thePolyBoxesCut); //! Triangulation of closed polygon containing only three edges. - inline Standard_Boolean meshElementaryPolygon (const IMeshData::SequenceOfInteger& thePolygon); + Standard_Boolean meshElementaryPolygon (const IMeshData::SequenceOfInteger& thePolygon); //! Creates the triangles beetween the given node and the given polyline. void createTriangles (const Standard_Integer theVertexIndex, IMeshData::MapOfIntegerInteger& thePoly); //! Add a triangle based on the given oriented edges into mesh - inline void addTriangle (const Standard_Integer (&theEdgesId)[3], - const Standard_Boolean (&theEdgesOri)[3], - const Standard_Integer (&theNodesId)[3]); + void addTriangle (const Standard_Integer (&theEdgesId)[3], + const Standard_Boolean (&theEdgesOri)[3], + const Standard_Integer (&theNodesId)[3]); //! Deletes the triangle with the given index and adds the free edges into the map. //! When an edge is suppressed more than one time it is destroyed. @@ -284,7 +297,8 @@ IMeshData::SequenceOfBndB2d& thePolyBoxes); //! Creates the triangles on new nodes. - void createTrianglesOnNewVertices (IMeshData::VectorOfInteger& theVertexIndices); + void createTrianglesOnNewVertices (IMeshData::VectorOfInteger& theVertexIndices, + const Message_ProgressRange& theRange); //! Cleanup mesh from the free triangles. void cleanupMesh(); @@ -292,12 +306,8 @@ //! Goes through the neighbour triangles around the given node started //! from the given link, returns TRUE if some triangle has a bounding //! frontier edge or FALSE elsewhere. - //! Stop link is used to prevent cycles. - //! Previous element Id is used to identify next neighbor element. Standard_Boolean isBoundToFrontier (const Standard_Integer theRefNodeId, - const Standard_Integer theRefLinkId, - const Standard_Integer theStopLinkId, - const Standard_Integer thePrevElementId); + const Standard_Integer theRefLinkId); //! Remove internal triangles from the given polygon. void cleanupPolygon (const IMeshData::SequenceOfInteger& thePolygon, @@ -354,13 +364,27 @@ //! Performs insertion of internal edges into mesh. void insertInternalEdges(); + //! Checks whether the given vertex id relates to super contour. + Standard_Boolean isSupVertex (const Standard_Integer theVertexIdx) const + { + for (IMeshData::VectorOfInteger::Iterator aIt (mySupVert); aIt.More (); aIt.Next ()) + { + if (theVertexIdx == aIt.Value ()) + { + return Standard_True; + } + } + + return Standard_False; + } + private: Handle(BRepMesh_DataStructureOfDelaun) myMeshData; BRepMesh_CircleTool myCircles; - Standard_Integer mySupVert[3]; + IMeshData::VectorOfInteger mySupVert; + Standard_Boolean myInitCircles; BRepMesh_Triangle mySupTrian; - }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DiscretFactory.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DiscretFactory.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DiscretFactory.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DiscretFactory.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,7 +39,7 @@ Standard_EXPORT static BRepMesh_DiscretFactory& Get(); //! Returns the list of registered meshing algorithms. - inline const TColStd_MapOfAsciiString& Names() const + const TColStd_MapOfAsciiString& Names() const { return myNames; } @@ -53,7 +53,7 @@ } //! Returns name for current meshing algorithm. - inline const TCollection_AsciiString& DefaultName() const + const TCollection_AsciiString& DefaultName() const { return myDefaultName; } @@ -67,13 +67,13 @@ } //! Returns function name that should be exported by plugin. - inline const TCollection_AsciiString& FunctionName() const + const TCollection_AsciiString& FunctionName() const { return myFunctionName; } //! Returns error status for last meshing algorithm switch. - inline BRepMesh_FactoryError ErrorStatus() const + BRepMesh_FactoryError ErrorStatus() const { return myErrorStatus; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DiscretRoot.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DiscretRoot.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_DiscretRoot.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_DiscretRoot.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include //! This is a common interface for meshing algorithms //! instantiated by Mesh Factory and implemented by plugins. @@ -29,24 +30,24 @@ Standard_EXPORT virtual ~BRepMesh_DiscretRoot(); //! Set the shape to triangulate. - inline void SetShape(const TopoDS_Shape& theShape) + void SetShape(const TopoDS_Shape& theShape) { myShape = theShape; } - inline const TopoDS_Shape& Shape() const + const TopoDS_Shape& Shape() const { return myShape; } //! Returns true if triangualtion was performed and has success. - inline Standard_Boolean IsDone() const + Standard_Boolean IsDone() const { return myIsDone; } //! Compute triangulation for set shape. - virtual void Perform() = 0; + virtual void Perform(const Message_ProgressRange& theRange = Message_ProgressRange()) = 0; DEFINE_STANDARD_RTTIEXT(BRepMesh_DiscretRoot,Standard_Transient) @@ -57,13 +58,13 @@ Standard_EXPORT BRepMesh_DiscretRoot(); //! Sets IsDone flag. - inline void setDone() + void setDone() { myIsDone = Standard_True; } //! Clears IsDone flag. - inline void setNotDone() + void setNotDone() { myIsDone = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_EdgeDiscret.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_EdgeDiscret.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_EdgeDiscret.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_EdgeDiscret.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_EdgeDiscret, IMeshTools_ModelAlgo) + //======================================================================= // Function: Constructor // Purpose : @@ -85,8 +87,10 @@ //======================================================================= Standard_Boolean BRepMesh_EdgeDiscret::performInternal ( const Handle (IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) { + (void )theRange; myModel = theModel; myParameters = theParameters; @@ -155,8 +159,10 @@ const Handle (Poly_Polygon3D)& aPoly3D = BRep_Tool::Polygon3D (aDEdge->GetEdge (), aLoc); if (!aPoly3D.IsNull ()) { - if (aPoly3D->HasParameters () && - aPoly3D->Deflection () < 1.1 * aDEdge->GetDeflection ()) + if (aPoly3D->HasParameters() && + BRepMesh_Deflection::IsConsistent (aPoly3D->Deflection(), + aDEdge->GetDeflection(), + myParameters.AllowQualityDecrease)) { // Edge already has suitable 3d polygon. aDEdge->SetStatus(IMeshData_Reused); @@ -209,8 +215,10 @@ if (!aPolygon.IsNull ()) { - Standard_Boolean isConsistent = aPolygon->HasParameters () && - aPolygon->Deflection () < 1.1 * theDEdge->GetDeflection (); + Standard_Boolean isConsistent = aPolygon->HasParameters() && + BRepMesh_Deflection::IsConsistent (aPolygon->Deflection(), + theDEdge->GetDeflection(), + myParameters.AllowQualityDecrease); if (!isConsistent) { diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_EdgeDiscret.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_EdgeDiscret.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_EdgeDiscret.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_EdgeDiscret.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -53,7 +53,7 @@ const IMeshData::IFaceHandle& theDFace); //! Functor API to discretize the given edge. - inline void operator() (const Standard_Integer theEdgeIndex) const { + void operator() (const Standard_Integer theEdgeIndex) const { process (theEdgeIndex); } @@ -68,14 +68,15 @@ const IMeshData::IEdgeHandle& theDEdge, const Standard_Boolean theUpdateEnds); - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_EdgeDiscret, IMeshTools_ModelAlgo) + DEFINE_STANDARD_RTTIEXT(BRepMesh_EdgeDiscret, IMeshTools_ModelAlgo) protected: //! Performs processing of edges of the given model. Standard_EXPORT virtual Standard_Boolean performInternal ( const Handle (IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) Standard_OVERRIDE; + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) Standard_OVERRIDE; private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Edge.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Edge.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Edge.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Edge.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,14 +43,14 @@ } //! Returns movability flag of the Link. - inline BRepMesh_DegreeOfFreedom Movability() const + BRepMesh_DegreeOfFreedom Movability() const { return myMovability; } //! Sets movability flag of the Link. //! @param theMovability flag to be set. - inline void SetMovability(const BRepMesh_DegreeOfFreedom theMovability) + void SetMovability(const BRepMesh_DegreeOfFreedom theMovability) { myMovability = theMovability; } @@ -58,7 +58,7 @@ //! Checks if the given edge and this one have the same orientation. //! @param theOther edge to be checked against this one. //! \retrun TRUE if edges have the same orientation, FALSE if not. - inline Standard_Boolean IsSameOrientation(const BRepMesh_Edge& theOther) const + Standard_Boolean IsSameOrientation(const BRepMesh_Edge& theOther) const { return BRepMesh_OrientedEdge::IsEqual(theOther); } @@ -66,7 +66,7 @@ //! Checks for equality with another edge. //! @param theOther edge to be checked against this one. //! @return TRUE if equal, FALSE if not. - inline Standard_Boolean IsEqual(const BRepMesh_Edge& theOther) const + Standard_Boolean IsEqual(const BRepMesh_Edge& theOther) const { if (myMovability == BRepMesh_Deleted || theOther.myMovability == BRepMesh_Deleted) return Standard_False; @@ -76,7 +76,7 @@ } //! Alias for IsEqual. - inline Standard_Boolean operator ==(const BRepMesh_Edge& Other) const + Standard_Boolean operator ==(const BRepMesh_Edge& Other) const { return IsEqual(Other); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_EdgeParameterProvider.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_EdgeParameterProvider.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_EdgeParameterProvider.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_EdgeParameterProvider.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,6 +45,12 @@ //! Constructor. Initializes empty provider. BRepMesh_EdgeParameterProvider() + : myIsSameParam(Standard_False), + myFirstParam(0.0), + myOldFirstParam(0.0), + myScale(0.0), + myCurParam(0.0), + myFoundParam(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_EdgeTessellationExtractor.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_EdgeTessellationExtractor.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_EdgeTessellationExtractor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_EdgeTessellationExtractor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_EdgeTessellationExtractor, IMeshTools_CurveTessellator) + //======================================================================= //function : Constructor //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_EdgeTessellationExtractor.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_EdgeTessellationExtractor.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_EdgeTessellationExtractor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_EdgeTessellationExtractor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -50,7 +50,7 @@ gp_Pnt& thePoint, Standard_Real& theParameter) const Standard_OVERRIDE; - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_EdgeTessellationExtractor, IMeshTools_CurveTessellator) + DEFINE_STANDARD_RTTIEXT(BRepMesh_EdgeTessellationExtractor, IMeshTools_CurveTessellator) private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_FaceChecker.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_FaceChecker.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_FaceChecker.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_FaceChecker.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_FaceChecker, Standard_Transient) + namespace { const Standard_Real MaxTangentAngle = 5. * M_PI / 180.; @@ -103,6 +105,7 @@ BndBox2dTreeSelector(const Standard_Real theTolerance) : myMaxLoopSize(M_PI * theTolerance * theTolerance), mySelfSegmentIndex(-1), + mySegment(0), myIndices(256, new NCollection_IncAllocator(IMeshData::MEMORY_BLOCK_SIZE_HUGE)) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_FaceChecker.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_FaceChecker.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_FaceChecker.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_FaceChecker.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,8 +38,9 @@ gp_Pnt2d* Point2; // / using indices. Segment() - : Point1(NULL) - , Point2(NULL) + : EdgePtr(NULL), + Point1(NULL), + Point2(NULL) { } @@ -77,17 +78,17 @@ } //! Checks wire with the given index for intersection with others. - inline void operator()(const Standard_Integer theWireIndex) const + void operator()(const Standard_Integer theWireIndex) const { perform(theWireIndex); } - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_FaceChecker, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(BRepMesh_FaceChecker, Standard_Transient) private: //! Returns True in case if check can be performed in parallel mode. - inline Standard_Boolean isParallel() const + Standard_Boolean isParallel() const { return (myParameters.InParallel && myDFace->WiresNb() > 1); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_FaceDiscret.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_FaceDiscret.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_FaceDiscret.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_FaceDiscret.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,6 +21,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_FaceDiscret, IMeshTools_ModelAlgo) + //======================================================================= // Function: Constructor // Purpose : @@ -39,13 +41,46 @@ { } +//! Auxiliary functor for parallel processing of Faces. +class BRepMesh_FaceDiscret::FaceListFunctor +{ +public: + FaceListFunctor (BRepMesh_FaceDiscret* theAlgo, + const Message_ProgressRange& theRange) + : myAlgo (theAlgo), + myScope (theRange, "Face Discret", theAlgo->myModel->FacesNb()) + { + myRanges.reserve (theAlgo->myModel->FacesNb()); + for (Standard_Integer aFaceIter = 0; aFaceIter < theAlgo->myModel->FacesNb(); ++aFaceIter) + { + myRanges.push_back (myScope.Next()); + } + } + + void operator() (const Standard_Integer theFaceIndex) const + { + if (!myScope.More()) + { + return; + } + Message_ProgressScope aFaceScope(myRanges[theFaceIndex], NULL, 1); + myAlgo->process(theFaceIndex, aFaceScope.Next()); + } + +private: + mutable BRepMesh_FaceDiscret* myAlgo; + Message_ProgressScope myScope; + std::vector myRanges; +}; + //======================================================================= // Function: Perform // Purpose : //======================================================================= Standard_Boolean BRepMesh_FaceDiscret::performInternal( const Handle(IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) { myModel = theModel; myParameters = theParameters; @@ -54,7 +89,12 @@ return Standard_False; } - OSD_Parallel::For(0, myModel->FacesNb(), *this, !(myParameters.InParallel && myModel->FacesNb() > 1)); + FaceListFunctor aFunctor(this, theRange); + OSD_Parallel::For(0, myModel->FacesNb(), aFunctor, !(myParameters.InParallel && myModel->FacesNb() > 1)); + if (!theRange.More()) + { + return Standard_False; + } myModel.Nullify(); // Do not hold link to model. return Standard_True; @@ -64,7 +104,8 @@ // Function: process // Purpose : //======================================================================= -void BRepMesh_FaceDiscret::process(const Standard_Integer theFaceIndex) const +void BRepMesh_FaceDiscret::process(const Standard_Integer theFaceIndex, + const Message_ProgressRange& theRange) const { const IMeshData::IFaceHandle& aDFace = myModel->GetFace(theFaceIndex); if (aDFace->IsSet(IMeshData_Failure) || @@ -86,7 +127,12 @@ return; } - aMeshingAlgo->Perform(aDFace, myParameters); + if (!theRange.More()) + { + aDFace->SetStatus (IMeshData_UserBreak); + return; + } + aMeshingAlgo->Perform(aDFace, myParameters, theRange); } catch (Standard_Failure const&) { diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_FaceDiscret.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_FaceDiscret.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_FaceDiscret.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_FaceDiscret.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,7 @@ #include #include #include +#include //! Class implements functionality starting triangulation of model's faces. //! Each face is processed separately and can be executed in parallel mode. @@ -36,24 +37,24 @@ //! Destructor. Standard_EXPORT virtual ~BRepMesh_FaceDiscret(); - //! Functor API to discretize the given edge. - inline void operator() (const Standard_Integer theFaceIndex) const { - process(theFaceIndex); - } - - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_FaceDiscret, IMeshTools_ModelAlgo) + DEFINE_STANDARD_RTTIEXT(BRepMesh_FaceDiscret, IMeshTools_ModelAlgo) protected: //! Performs processing of faces of the given model. Standard_EXPORT virtual Standard_Boolean performInternal ( const Handle(IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) Standard_OVERRIDE; + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) Standard_OVERRIDE; private: //! Checks existing discretization of the face and updates data model. - void process(const Standard_Integer theFaceIndex) const; + void process (const Standard_Integer theFaceIndex, + const Message_ProgressRange& theRange) const; + +private: + class FaceListFunctor; private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_GeomTool.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_GeomTool.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_GeomTool.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_GeomTool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -99,15 +99,15 @@ //! @param theIsReplace if TRUE replaces existing point lying within //! parameteric tolerance of the given point. //! @return index of new added point or found with parametric tolerance - inline Standard_Integer AddPoint(const gp_Pnt& thePoint, - const Standard_Real theParam, - const Standard_Boolean theIsReplace = Standard_True) + Standard_Integer AddPoint(const gp_Pnt& thePoint, + const Standard_Real theParam, + const Standard_Boolean theIsReplace = Standard_True) { return myDiscretTool.AddPoint(thePoint, theParam, theIsReplace); } //! Returns number of discretization points. - inline Standard_Integer NbPoints() const + Standard_Integer NbPoints() const { return myDiscretTool.NbPoints(); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_IncrementalMesh.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_IncrementalMesh.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_IncrementalMesh.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_IncrementalMesh.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_IncrementalMesh, BRepMesh_DiscretRoot) + namespace { //! Default flag to control parallelization for BRepMesh_IncrementalMesh @@ -66,11 +68,12 @@ //======================================================================= BRepMesh_IncrementalMesh::BRepMesh_IncrementalMesh( const TopoDS_Shape& theShape, - const IMeshTools_Parameters& theParameters) + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) : myParameters(theParameters) { myShape = theShape; - Perform(); + Perform(theRange); } //======================================================================= @@ -85,17 +88,17 @@ //function : Perform //purpose : //======================================================================= -void BRepMesh_IncrementalMesh::Perform() +void BRepMesh_IncrementalMesh::Perform(const Message_ProgressRange& theRange) { - Handle(BRepMesh_Context) aContext = new BRepMesh_Context; - Perform (aContext); + Handle(BRepMesh_Context) aContext = new BRepMesh_Context (myParameters.MeshAlgo); + Perform (aContext, theRange); } //======================================================================= //function : Perform //purpose : //======================================================================= -void BRepMesh_IncrementalMesh::Perform(const Handle(IMeshTools_Context)& theContext) +void BRepMesh_IncrementalMesh::Perform(const Handle(IMeshTools_Context)& theContext, const Message_ProgressRange& theRange) { initParameters(); @@ -103,23 +106,31 @@ theContext->ChangeParameters() = myParameters; theContext->ChangeParameters().CleanModel = Standard_False; + Message_ProgressScope aPS(theRange, "Perform incmesh", 10); IMeshTools_MeshBuilder aIncMesh(theContext); - aIncMesh.Perform(); - + aIncMesh.Perform(aPS.Next(9)); + if (!aPS.More()) + { + myStatus = IMeshData_UserBreak; + return; + } myStatus = IMeshData_NoError; const Handle(IMeshData_Model)& aModel = theContext->GetModel(); - for (Standard_Integer aFaceIt = 0; aFaceIt < aModel->FacesNb(); ++aFaceIt) + if (!aModel.IsNull()) { - const IMeshData::IFaceHandle& aDFace = aModel->GetFace(aFaceIt); - myStatus |= aDFace->GetStatusMask(); - - for (Standard_Integer aWireIt = 0; aWireIt < aDFace->WiresNb(); ++aWireIt) + for (Standard_Integer aFaceIt = 0; aFaceIt < aModel->FacesNb(); ++aFaceIt) { - const IMeshData::IWireHandle& aDWire = aDFace->GetWire(aWireIt); - myStatus |= aDWire->GetStatusMask(); + const IMeshData::IFaceHandle& aDFace = aModel->GetFace(aFaceIt); + myStatus |= aDFace->GetStatusMask(); + + for (Standard_Integer aWireIt = 0; aWireIt < aDFace->WiresNb(); ++aWireIt) + { + const IMeshData::IWireHandle& aDWire = aDFace->GetWire(aWireIt); + myStatus |= aDWire->GetStatusMask(); + } } } - + aPS.Next(1); setDone(); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_IncrementalMesh.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_IncrementalMesh.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_IncrementalMesh.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_IncrementalMesh.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -50,36 +50,38 @@ //! @param theShape shape to be meshed. //! @param theParameters - parameters of meshing Standard_EXPORT BRepMesh_IncrementalMesh(const TopoDS_Shape& theShape, - const IMeshTools_Parameters& theParameters); + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Performs meshing ot the shape. - Standard_EXPORT virtual void Perform() Standard_OVERRIDE; + Standard_EXPORT virtual void Perform(const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; //! Performs meshing using custom context; - Standard_EXPORT void Perform(const Handle(IMeshTools_Context)& theContext); + Standard_EXPORT void Perform(const Handle(IMeshTools_Context)& theContext, + const Message_ProgressRange& theRange = Message_ProgressRange()); public: //! @name accessing to parameters. //! Returns meshing parameters - inline const IMeshTools_Parameters& Parameters() const + const IMeshTools_Parameters& Parameters() const { return myParameters; } //! Returns modifiable meshing parameters - inline IMeshTools_Parameters& ChangeParameters() + IMeshTools_Parameters& ChangeParameters() { return myParameters; } //! Returns modified flag. - inline Standard_Boolean IsModified() const + Standard_Boolean IsModified() const { return myModified; } //! Returns accumulated status flags faced during meshing. - inline Standard_Integer GetStatusFlags() const + Standard_Integer GetStatusFlags() const { return myStatus; } @@ -87,7 +89,7 @@ private: //! Initializes specific parameters - inline void initParameters() + void initParameters() { if (myParameters.DeflectionInterior < Precision::Confusion()) { @@ -129,7 +131,7 @@ //! Discret() static method (thus applied only to Mesh Factories). Standard_EXPORT static void SetParallelDefault(const Standard_Boolean isInParallel); - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_IncrementalMesh, BRepMesh_DiscretRoot) + DEFINE_STANDARD_RTTIEXT(BRepMesh_IncrementalMesh, BRepMesh_DiscretRoot) protected: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_MeshAlgoFactory.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_MeshAlgoFactory.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_MeshAlgoFactory.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_MeshAlgoFactory.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_MeshAlgoFactory, IMeshTools_MeshAlgoFactory) + namespace { struct BaseMeshAlgo diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_MeshAlgoFactory.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_MeshAlgoFactory.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_MeshAlgoFactory.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_MeshAlgoFactory.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,7 +22,7 @@ #include //! Default implementation of IMeshTools_MeshAlgoFactory providing algorithms -//! of different compexity depending on type of target surface. +//! of different complexity depending on type of target surface. class BRepMesh_MeshAlgoFactory : public IMeshTools_MeshAlgoFactory { public: @@ -38,7 +38,7 @@ const GeomAbs_SurfaceType theSurfaceType, const IMeshTools_Parameters& theParameters) const Standard_OVERRIDE; - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_MeshAlgoFactory, IMeshTools_MeshAlgoFactory) + DEFINE_STANDARD_RTTIEXT(BRepMesh_MeshAlgoFactory, IMeshTools_MeshAlgoFactory) }; #endif \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_MeshTool.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_MeshTool.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_MeshTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_MeshTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,10 +24,12 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_MeshTool, Standard_Transient) + namespace { //! Returns index of triangle node opposite to the given link. - inline Standard_Integer findApexIndex( + Standard_Integer findApexIndex( const Standard_Integer(&aNodes)[3], const BRepMesh_Edge& theLink) { diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_MeshTool.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_MeshTool.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_MeshTool.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_MeshTool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,7 +49,7 @@ mySign = myConstraint.Direction().X() > 0; } - inline Standard_Boolean IsAbove(const Standard_Integer theNodeIndex) const + Standard_Boolean IsAbove(const Standard_Integer theNodeIndex) const { const BRepMesh_Vertex& aVertex = myStructure->GetNode(theNodeIndex); const gp_Vec2d aNodeVec(myConstraint.Location(), aVertex.Coord()); @@ -88,7 +88,7 @@ Standard_EXPORT virtual ~BRepMesh_MeshTool(); //! Returns data structure manipulated by this tool. - inline const Handle(BRepMesh_DataStructureOfDelaun)& GetStructure() const + const Handle(BRepMesh_DataStructureOfDelaun)& GetStructure() const { return myStructure; } @@ -98,7 +98,7 @@ //! Adds new triangle with specified nodes to mesh. //! Legalizes triangle in case if it violates circle criteria. - inline void AddAndLegalizeTriangle( + void AddAndLegalizeTriangle( const Standard_Integer thePoint1, const Standard_Integer thePoint2, const Standard_Integer thePoint3) @@ -112,7 +112,7 @@ } //! Adds new triangle with specified nodes to mesh. - inline void AddTriangle( + void AddTriangle( const Standard_Integer thePoint1, const Standard_Integer thePoint2, const Standard_Integer thePoint3, @@ -128,10 +128,10 @@ //! Adds new link to mesh. //! Updates link index and link orientaion parameters. - inline void AddLink(const Standard_Integer theFirstNode, - const Standard_Integer theLastNode, - Standard_Integer& theLinkIndex, - Standard_Boolean& theLinkOri) + void AddLink(const Standard_Integer theFirstNode, + const Standard_Integer theLastNode, + Standard_Integer& theLinkIndex, + Standard_Boolean& theLinkOri) { const Standard_Integer aLinkIt = myStructure->AddLink( BRepMesh_Edge(theFirstNode, theLastNode, BRepMesh_Free)); @@ -169,12 +169,12 @@ //! Gives the list of edges with type defined by input parameter. Standard_EXPORT Handle(IMeshData::MapOfInteger) GetEdgesByType(const BRepMesh_DegreeOfFreedom theEdgeType) const; - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_MeshTool, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(BRepMesh_MeshTool, Standard_Transient) private: //! Returns True if the given point lies within circumcircle of the given triangle. - inline Standard_Boolean checkCircle( + Standard_Boolean checkCircle( const Standard_Integer(&aNodes)[3], const Standard_Integer thePoint) { @@ -200,7 +200,7 @@ //! Adds new triangle with the given nodes and updates //! links stack by ones are not in used map. - inline void addTriangleAndUpdateStack( + void addTriangleAndUpdateStack( const Standard_Integer theNode0, const Standard_Integer theNode1, const Standard_Integer theNode2, diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelBuilder.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelBuilder.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_ModelBuilder, IMeshTools_ModelBuilder) + //======================================================================= // Function: Constructor // Purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelBuilder.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelBuilder.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelBuilder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelBuilder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,7 @@ //! Destructor. Standard_EXPORT virtual ~BRepMesh_ModelBuilder (); - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelBuilder, IMeshTools_ModelBuilder) + DEFINE_STANDARD_RTTIEXT(BRepMesh_ModelBuilder, IMeshTools_ModelBuilder) protected: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelHealer.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelHealer.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelHealer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelHealer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,6 +33,8 @@ #include #endif +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_ModelHealer, IMeshTools_ModelAlgo) + namespace { //! Decreases deflection of the given edge and tries to update discretization. @@ -73,7 +75,7 @@ }; //! Returns True if some of two vertcies is same with reference one. - inline Standard_Boolean isSameWithSomeOf( + Standard_Boolean isSameWithSomeOf( const TopoDS_Vertex& theRefVertex, const TopoDS_Vertex& theVertex1, const TopoDS_Vertex& theVertex2) @@ -83,7 +85,7 @@ } //! Returns True if some of two vertcies is within tolerance of reference one. - inline Standard_Boolean isInToleranceWithSomeOf( + Standard_Boolean isInToleranceWithSomeOf( const gp_Pnt& theRefPoint, const gp_Pnt& thePoint1, const gp_Pnt& thePoint2, @@ -117,8 +119,10 @@ //======================================================================= Standard_Boolean BRepMesh_ModelHealer::performInternal( const Handle(IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) { + (void )theRange; myModel = theModel; myParameters = theParameters; if (myModel.IsNull()) diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelHealer.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelHealer.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelHealer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelHealer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,28 +45,29 @@ Standard_EXPORT virtual ~BRepMesh_ModelHealer(); //! Functor API to discretize the given edge. - inline void operator() (const Standard_Integer theEdgeIndex) const { + void operator() (const Standard_Integer theEdgeIndex) const { process(theEdgeIndex); } //! Functor API to discretize the given edge. - inline void operator() (const IMeshData::IFaceHandle& theDFace) const { + void operator() (const IMeshData::IFaceHandle& theDFace) const { process(theDFace); } - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelHealer, IMeshTools_ModelAlgo) + DEFINE_STANDARD_RTTIEXT(BRepMesh_ModelHealer, IMeshTools_ModelAlgo) protected: //! Performs processing of edges of the given model. Standard_EXPORT virtual Standard_Boolean performInternal ( const Handle(IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) Standard_OVERRIDE; + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) Standard_OVERRIDE; private: //! Checks existing discretization of the face and updates data model. - inline void process(const Standard_Integer theFaceIndex) const + void process(const Standard_Integer theFaceIndex) const { const IMeshData::IFaceHandle& aDFace = myModel->GetFace(theFaceIndex); process(aDFace); @@ -95,7 +96,7 @@ //! Chooses the most closest point to reference one from the given pair. //! Returns square distance between reference point and closest one as //! well as pointer to closest point. - inline Standard_Real closestPoint( + Standard_Real closestPoint( gp_Pnt2d& theRefPnt, gp_Pnt2d& theFristPnt, gp_Pnt2d& theSecondPnt, @@ -117,7 +118,7 @@ //! Chooses the most closest points among the given to reference one from the given pair. //! Returns square distance between reference point and closest one as //! well as pointer to closest point. - inline Standard_Real closestPoints( + Standard_Real closestPoints( gp_Pnt2d& theFirstPnt1, gp_Pnt2d& theSecondPnt1, gp_Pnt2d& theFirstPnt2, @@ -143,7 +144,7 @@ //! Adjusts the given pair of points supposed to be the same. //! In addition, adjusts another end-point of an edge in order //! to perform correct matching in case of gap. - inline void adjustSamePoints( + void adjustSamePoints( gp_Pnt2d*& theMajorSamePnt1, gp_Pnt2d*& theMinorSamePnt1, gp_Pnt2d*& theMajorSamePnt2, @@ -167,7 +168,7 @@ void fixFaceBoundaries(const IMeshData::IFaceHandle& theDFace) const; //! Returns True if check can be done in parallel. - inline Standard_Boolean isParallel() const + Standard_Boolean isParallel() const { return (myParameters.InParallel && myModel->FacesNb() > 1); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelPostProcessor.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelPostProcessor.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelPostProcessor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelPostProcessor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_ModelPostProcessor, IMeshTools_ModelAlgo) + namespace { //! Commits 3D polygons and polygons on triangulations for corresponding edges. @@ -179,8 +181,10 @@ //======================================================================= Standard_Boolean BRepMesh_ModelPostProcessor::performInternal( const Handle(IMeshData_Model)& theModel, - const IMeshTools_Parameters& /*theParameters*/) + const IMeshTools_Parameters& /*theParameters*/, + const Message_ProgressRange& theRange) { + (void )theRange; if (theModel.IsNull()) { return Standard_False; diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelPostProcessor.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelPostProcessor.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelPostProcessor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelPostProcessor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,14 +32,15 @@ //! Destructor. Standard_EXPORT virtual ~BRepMesh_ModelPostProcessor(); - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelPostProcessor, IMeshTools_ModelAlgo) + DEFINE_STANDARD_RTTIEXT(BRepMesh_ModelPostProcessor, IMeshTools_ModelAlgo) protected: //! Performs processing of edges of the given model. Standard_EXPORT virtual Standard_Boolean performInternal ( const Handle(IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) Standard_OVERRIDE; + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) Standard_OVERRIDE; }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelPreProcessor.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelPreProcessor.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelPreProcessor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelPreProcessor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,6 +14,7 @@ // commercial license or contractual agreement. #include +#include #include #include #include @@ -23,6 +24,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_ModelPreProcessor, IMeshTools_ModelAlgo) + namespace { //! Checks consistency of triangulation stored in topological face. @@ -30,8 +33,10 @@ { public: //! Constructor - TriangulationConsistency(const Handle(IMeshData_Model)& theModel) + TriangulationConsistency(const Handle(IMeshData_Model)& theModel, + const Standard_Boolean theAllowQualityDecrease) : myModel (theModel) + , myAllowQualityDecrease (theAllowQualityDecrease) { } @@ -51,7 +56,9 @@ if (!aTriangulation.IsNull()) { Standard_Boolean isTriangulationConsistent = - aTriangulation->Deflection() < 1.1 * aDFace->GetDeflection(); + BRepMesh_Deflection::IsConsistent (aTriangulation->Deflection(), + aDFace->GetDeflection(), + myAllowQualityDecrease); if (isTriangulationConsistent) { @@ -88,6 +95,7 @@ private: Handle(IMeshData_Model) myModel; + Standard_Boolean myAllowQualityDecrease; //!< Flag used for consistency check }; //! Adds additional points to seam edges on specific surfaces. @@ -244,15 +252,19 @@ //======================================================================= Standard_Boolean BRepMesh_ModelPreProcessor::performInternal( const Handle(IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) { + (void )theRange; if (theModel.IsNull()) { return Standard_False; } - OSD_Parallel::For(0, theModel->FacesNb(), SeamEdgeAmplifier(theModel, theParameters), !theParameters.InParallel); - OSD_Parallel::For(0, theModel->FacesNb(), TriangulationConsistency(theModel), !theParameters.InParallel); + const Standard_Integer aFacesNb = theModel->FacesNb(); + const Standard_Boolean isOneThread = !theParameters.InParallel; + OSD_Parallel::For(0, aFacesNb, SeamEdgeAmplifier (theModel, theParameters), isOneThread); + OSD_Parallel::For(0, aFacesNb, TriangulationConsistency (theModel, theParameters.AllowQualityDecrease), isOneThread); // Clean edges and faces from outdated polygons. Handle(NCollection_IncAllocator) aTmpAlloc(new NCollection_IncAllocator(IMeshData::MEMORY_BLOCK_SIZE_HUGE)); diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelPreProcessor.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelPreProcessor.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ModelPreProcessor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ModelPreProcessor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,14 +33,15 @@ //! Destructor. Standard_EXPORT virtual ~BRepMesh_ModelPreProcessor(); - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ModelPreProcessor, IMeshTools_ModelAlgo) + DEFINE_STANDARD_RTTIEXT(BRepMesh_ModelPreProcessor, IMeshTools_ModelAlgo) protected: //! Performs processing of edges of the given model. Standard_EXPORT virtual Standard_Boolean performInternal ( const Handle(IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) Standard_OVERRIDE; + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) Standard_OVERRIDE; }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_NodeInsertionMeshAlgo.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_NodeInsertionMeshAlgo.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_NodeInsertionMeshAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_NodeInsertionMeshAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,11 +47,16 @@ //! Performs processing of the given face. virtual void Perform( const IMeshData::IFaceHandle& theDFace, - const IMeshTools_Parameters& theParameters) Standard_OVERRIDE + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) Standard_OVERRIDE { myRangeSplitter.Reset(theDFace, theParameters); myClassifier = new BRepMesh_Classifier; - BaseAlgo::Perform(theDFace, theParameters); + if (!theRange.More()) + { + return; + } + BaseAlgo::Perform(theDFace, theParameters, theRange); myClassifier.Nullify(); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_NURBSRangeSplitter.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_NURBSRangeSplitter.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_NURBSRangeSplitter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_NURBSRangeSplitter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,7 +44,10 @@ myParamsForbiddenToRemove(theParamsForbiddenToRemove), myControlParamsForbiddenToRemove(theControlParamsForbiddenToRemove), myAllocator(new NCollection_IncAllocator(IMeshData::MEMORY_BLOCK_SIZE_HUGE)), - myControlParamsToRemove(new IMeshData::MapOfReal(1, myAllocator)) + myControlParamsToRemove(new IMeshData::MapOfReal(1, myAllocator)), + myCurrParam(0.0), + myCurrControlParam(0.0), + myPrevControlParam(0.0) { } @@ -214,7 +217,7 @@ }; //! Adds param to map if it fits specified range. - inline Standard_Boolean addParam( + Standard_Boolean addParam( const Standard_Real& theParam, const std::pair& theRange, IMeshData::IMapOfReal& theParams) @@ -230,7 +233,7 @@ } //! Initializes parameters map using CN intervals. - inline Standard_Boolean initParamsFromIntervals( + Standard_Boolean initParamsFromIntervals( const TColStd_Array1OfReal& theIntervals, const std::pair& theRange, const Standard_Boolean isSplitIntervals, @@ -269,11 +272,17 @@ for (; aIntervalU <= theIntervals[0].Upper (); ++aIntervalU) { const Standard_Real aParamU = theIntervals[0].Value(aIntervalU); + if (Precision::IsInfinite (aParamU)) + continue; + Standard_Integer aIntervalV = theIntervals[1].Lower (); for (; aIntervalV <= theIntervals[1].Upper (); ++aIntervalV) { gp_Dir aNorm; const Standard_Real aParamV = theIntervals[1].Value(aIntervalV); + if (Precision::IsInfinite (aParamV)) + continue; + if (GeomLib::NormEstim (theSurf, gp_Pnt2d (aParamU, aParamV), Precision::Confusion (), aNorm) != 0) { return Standard_True; diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_NURBSRangeSplitter.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_NURBSRangeSplitter.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_NURBSRangeSplitter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_NURBSRangeSplitter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,6 +28,7 @@ //! Constructor. BRepMesh_NURBSRangeSplitter() + : mySurfaceType(GeomAbs_OtherSurface) { } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_OrientedEdge.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_OrientedEdge.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_OrientedEdge.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_OrientedEdge.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,13 +43,13 @@ } //! Returns index of first node of the Link. - inline Standard_Integer FirstNode() const + Standard_Integer FirstNode() const { return myFirstNode; } //! Returns index of last node of the Link. - inline Standard_Integer LastNode() const + Standard_Integer LastNode() const { return myLastNode; } @@ -57,7 +57,7 @@ //! Computes a hash code for this oriented edge, in the range [1, theUpperBound] //! @param theUpperBound the upper bound of the range a computing hash code must be within //! @return a computed hash code, in the range [1, theUpperBound] - inline Standard_Integer HashCode (const Standard_Integer theUpperBound) const + Standard_Integer HashCode (const Standard_Integer theUpperBound) const { return ::HashCode (myFirstNode + myLastNode, theUpperBound); } @@ -65,13 +65,13 @@ //! Checks this and other edge for equality. //! @param theOther edge to be checked against this one. //! @retrun TRUE if edges have the same orientation, FALSE if not. - inline Standard_Boolean IsEqual(const BRepMesh_OrientedEdge& theOther) const + Standard_Boolean IsEqual(const BRepMesh_OrientedEdge& theOther) const { return (myFirstNode == theOther.myFirstNode && myLastNode == theOther.myLastNode); } //! Alias for IsEqual. - inline Standard_Boolean operator ==(const BRepMesh_OrientedEdge& Other) const + Standard_Boolean operator ==(const BRepMesh_OrientedEdge& Other) const { return IsEqual(Other); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_PairOfIndex.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_PairOfIndex.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_PairOfIndex.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_PairOfIndex.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,7 @@ } //! Appends index to the pair. - inline void Append(const Standard_Integer theIndex) + void Append(const Standard_Integer theIndex) { if (myIndex[0] < 0) myIndex[0] = theIndex; @@ -52,7 +52,7 @@ } //! Prepends index to the pair. - inline void Prepend(const Standard_Integer theIndex) + void Prepend(const Standard_Integer theIndex) { if (myIndex[1] >= 0) throw Standard_OutOfRange("BRepMesh_PairOfIndex::Prepend, more than two index to store"); @@ -62,7 +62,7 @@ } //! Returns is pair is empty. - inline Standard_Boolean IsEmpty() const + Standard_Boolean IsEmpty() const { // Check only first index. It is impossible to update // second index if the first one is empty. @@ -70,26 +70,26 @@ } //! Returns number of initialized indeces. - inline Standard_Integer Extent() const + Standard_Integer Extent() const { return (myIndex[0] < 0 ? 0 : (myIndex[1] < 0 ? 1 : 2)); } //! Returns first index of pair. - inline Standard_Integer FirstIndex() const + Standard_Integer FirstIndex() const { return myIndex[0]; } //! Returns last index of pair - inline Standard_Integer LastIndex() const + Standard_Integer LastIndex() const { return (myIndex[1] < 0 ? myIndex[0] : myIndex[1]); } //! Returns index corresponding to the given position in the pair. //! @param thePairPos position of index in the pair (1 or 2). - inline Standard_Integer Index(const Standard_Integer thePairPos) const + Standard_Integer Index(const Standard_Integer thePairPos) const { if (thePairPos != 1 && thePairPos != 2) throw Standard_OutOfRange("BRepMesh_PairOfIndex::Index, requested index is out of range"); @@ -100,8 +100,8 @@ //! Sets index corresponding to the given position in the pair. //! @param thePairPos position of index in the pair (1 or 2). //! @param theIndex index to be stored. - inline void SetIndex(const Standard_Integer thePairPos, - const Standard_Integer theIndex) + void SetIndex(const Standard_Integer thePairPos, + const Standard_Integer theIndex) { if (thePairPos != 1 && thePairPos != 2) throw Standard_OutOfRange("BRepMesh_PairOfIndex::SetIndex, requested index is out of range"); @@ -111,7 +111,7 @@ //! Remove index from the given position. //! @param thePairPos position of index in the pair (1 or 2). - inline void RemoveIndex(const Standard_Integer thePairPos) + void RemoveIndex(const Standard_Integer thePairPos) { if (thePairPos != 1 && thePairPos != 2) throw Standard_OutOfRange("BRepMesh_PairOfIndex::RemoveIndex, requested index is out of range"); diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_SelectorOfDataStructureOfDelaun.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_SelectorOfDataStructureOfDelaun.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_SelectorOfDataStructureOfDelaun.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_SelectorOfDataStructureOfDelaun.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_SelectorOfDataStructureOfDelaun, Standard_Transient) + //======================================================================= //function : Default constructor //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_SelectorOfDataStructureOfDelaun.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_SelectorOfDataStructureOfDelaun.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_SelectorOfDataStructureOfDelaun.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_SelectorOfDataStructureOfDelaun.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -60,40 +60,40 @@ Standard_EXPORT void NeighboursByEdgeOf(const BRepMesh_Triangle& theElement); //! Adds a level of neighbours by edge to the selector. - inline void NeighboursOf(const BRepMesh_SelectorOfDataStructureOfDelaun& /*theSelector*/) + void NeighboursOf(const BRepMesh_SelectorOfDataStructureOfDelaun& /*theSelector*/) { } //! Adds a level of neighbours by edge the selector. - inline void AddNeighbours() + void AddNeighbours() { } //! Returns selected nodes. - inline const IMeshData::MapOfInteger& Nodes() const + const IMeshData::MapOfInteger& Nodes() const { return myNodes; } //! Returns selected links. - inline const IMeshData::MapOfInteger& Links() const + const IMeshData::MapOfInteger& Links() const { return myLinks; } //! Returns selected elements. - inline const IMeshData::MapOfInteger& Elements() const + const IMeshData::MapOfInteger& Elements() const { return myElements; } //! Gives the list of incices of frontier links. - inline const IMeshData::MapOfInteger& FrontierLinks() const + const IMeshData::MapOfInteger& FrontierLinks() const { return myFrontier; } - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_SelectorOfDataStructureOfDelaun, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(BRepMesh_SelectorOfDataStructureOfDelaun, Standard_Transient) private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ShapeTool.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ShapeTool.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ShapeTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ShapeTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_ShapeTool, Standard_Transient) + namespace { //! Auxilary struct to take a tolerance of edge. @@ -72,7 +74,7 @@ Standard_Real aMaxTolerance = BRep_Tool::Tolerance(theFace); Standard_Real aTolerance = Max( - MaxTolerance(theFace), + MaxTolerance(theFace), MaxTolerance(theFace)); return Max(aMaxTolerance, aTolerance); diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ShapeTool.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ShapeTool.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ShapeTool.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ShapeTool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -150,7 +150,7 @@ Standard_Real& theLastParam, const Standard_Boolean isConsiderOrientation = Standard_False); - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ShapeTool, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(BRepMesh_ShapeTool, Standard_Transient) }; #endif \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ShapeVisitor.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ShapeVisitor.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ShapeVisitor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ShapeVisitor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,6 +33,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_ShapeVisitor, IMeshTools_ShapeVisitor) + //======================================================================= // Function: Constructor // Purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ShapeVisitor.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ShapeVisitor.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_ShapeVisitor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_ShapeVisitor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,7 +49,7 @@ //! Handles TopoDS_Edge object. Standard_EXPORT virtual void Visit (const TopoDS_Edge& theEdge) Standard_OVERRIDE; - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_ShapeVisitor, IMeshTools_ShapeVisitor) + DEFINE_STANDARD_RTTIEXT(BRepMesh_ShapeVisitor, IMeshTools_ShapeVisitor) private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_SphereRangeSplitter.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_SphereRangeSplitter.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_SphereRangeSplitter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_SphereRangeSplitter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,7 +42,7 @@ private: //! Computes step for the given range. - inline void computeStep( + void computeStep( const std::pair& theRange, const Standard_Real theDefaultStep, std::pair& theStepAndOffset) const diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Triangle.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Triangle.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Triangle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Triangle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -60,7 +60,7 @@ //! @param theEdges array of edges of triangle. //! @param theOrientations array of edge's orientations. //! @param theMovability movability of triangle. - inline void Initialize( + void Initialize( const Standard_Integer (&theEdges)[3], const Standard_Boolean (&theOrientations)[3], const BRepMesh_DegreeOfFreedom theMovability) @@ -73,21 +73,21 @@ //! Gets edges with orientations composing the triangle. //! @param[out] theEdges array edges are stored to. //! @param[out] theOrientations array orientations are stored to. - inline void Edges(Standard_Integer (&theEdges)[3], - Standard_Boolean (&theOrientations)[3]) const + void Edges(Standard_Integer (&theEdges)[3], + Standard_Boolean (&theOrientations)[3]) const { memcpy(theEdges, myEdges, sizeof(myEdges)); memcpy(theOrientations, myOrientations, sizeof(myOrientations)); } //! Returns movability of the triangle. - inline BRepMesh_DegreeOfFreedom Movability() const + BRepMesh_DegreeOfFreedom Movability() const { return myMovability; } //! Sets movability of the triangle. - inline void SetMovability(const BRepMesh_DegreeOfFreedom theMovability) + void SetMovability(const BRepMesh_DegreeOfFreedom theMovability) { myMovability = theMovability; } @@ -95,7 +95,7 @@ //! Computes a hash code for this triangle, in the range [1, theUpperBound] //! @param theUpperBound the upper bound of the range a computing hash code must be within //! @return a computed hash code, in the range [1, theUpperBound] - inline Standard_Integer HashCode (const Standard_Integer theUpperBound) const + Standard_Integer HashCode (const Standard_Integer theUpperBound) const { return ::HashCode (myEdges[0] + myEdges[1] + myEdges[2], theUpperBound); } @@ -103,7 +103,7 @@ //! Checks for equality with another triangle. //! @param theOther triangle to be checked against this one. //! @return TRUE if equal, FALSE if not. - inline Standard_Boolean IsEqual(const BRepMesh_Triangle& theOther) const + Standard_Boolean IsEqual(const BRepMesh_Triangle& theOther) const { if (myMovability == BRepMesh_Deleted || theOther.myMovability == BRepMesh_Deleted) return Standard_False; @@ -133,7 +133,7 @@ } //! Alias for IsEqual. - inline Standard_Boolean operator ==(const BRepMesh_Triangle& theOther) const + Standard_Boolean operator ==(const BRepMesh_Triangle& theOther) const { return IsEqual(theOther); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_UVParamRangeSplitter.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_UVParamRangeSplitter.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_UVParamRangeSplitter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_UVParamRangeSplitter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,25 +49,25 @@ public: //! Returns U parameters. - inline const IMeshData::IMapOfReal& GetParametersU() const + const IMeshData::IMapOfReal& GetParametersU() const { return myUParams; } //! Returns U parameters. - inline IMeshData::IMapOfReal& GetParametersU() + IMeshData::IMapOfReal& GetParametersU() { return myUParams; } //! Returns V parameters. - inline const IMeshData::IMapOfReal& GetParametersV() const + const IMeshData::IMapOfReal& GetParametersV() const { return myVParams; } //! Returns V parameters. - inline IMeshData::IMapOfReal& GetParametersV() + IMeshData::IMapOfReal& GetParametersV() { return myVParams; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Vertex.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Vertex.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_Vertex.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_Vertex.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,9 +65,9 @@ //! @param theUV position of vertex in parametric space. //! @param theLocation3d index of 3d point to be associated with vertex. //! @param theMovability movability of the vertex. - inline void Initialize(const gp_XY& theUV, - const Standard_Integer theLocation3d, - const BRepMesh_DegreeOfFreedom theMovability) + void Initialize(const gp_XY& theUV, + const Standard_Integer theLocation3d, + const BRepMesh_DegreeOfFreedom theMovability) { myUV = theUV; myLocation3d = theLocation3d; @@ -75,31 +75,31 @@ } //! Returns position of the vertex in parametric space. - inline const gp_XY& Coord() const + const gp_XY& Coord() const { return myUV; } //! Returns position of the vertex in parametric space for modification. - inline gp_XY& ChangeCoord() + gp_XY& ChangeCoord() { return myUV; } //! Returns index of 3d point associated with the vertex. - inline Standard_Integer Location3d() const + Standard_Integer Location3d() const { return myLocation3d; } //! Returns movability of the vertex. - inline BRepMesh_DegreeOfFreedom Movability() const + BRepMesh_DegreeOfFreedom Movability() const { return myMovability; } //! Sets movability of the vertex. - inline void SetMovability(const BRepMesh_DegreeOfFreedom theMovability) + void SetMovability(const BRepMesh_DegreeOfFreedom theMovability) { myMovability = theMovability; } @@ -107,7 +107,7 @@ //! Computes a hash code for this vertex, in the range [1, theUpperBound] //! @param theUpperBound the upper bound of the range a computing hash code must be within //! @return a computed hash code, in the range [1, theUpperBound] - inline Standard_Integer HashCode(const Standard_Integer theUpperBound) const + Standard_Integer HashCode(const Standard_Integer theUpperBound) const { return ::HashCode(Floor(1e5 * myUV.X()) * Floor(1e5 * myUV.Y()), theUpperBound); } @@ -115,7 +115,7 @@ //! Checks for equality with another vertex. //! @param theOther vertex to be checked against this one. //! @return TRUE if equal, FALSE if not. - inline Standard_Boolean IsEqual(const BRepMesh_Vertex& theOther) const + Standard_Boolean IsEqual(const BRepMesh_Vertex& theOther) const { if (myMovability == BRepMesh_Deleted || theOther.myMovability == BRepMesh_Deleted) @@ -127,7 +127,7 @@ } //! Alias for IsEqual. - inline Standard_Boolean operator ==(const BRepMesh_Vertex& Other) const + Standard_Boolean operator ==(const BRepMesh_Vertex& Other) const { return IsEqual(Other); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_VertexInspector.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_VertexInspector.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_VertexInspector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_VertexInspector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -60,7 +60,7 @@ //! Sets the tolerance to be used for identification of //! coincident vertices equal for both dimensions. - inline void SetTolerance(const Standard_Real theTolerance) + void SetTolerance(const Standard_Real theTolerance) { myTolerance[0] = theTolerance * theTolerance; myTolerance[1] = 0.; @@ -70,15 +70,15 @@ //! coincident vertices. //! @param theToleranceX tolerance for X dimension. //! @param theToleranceY tolerance for Y dimension. - inline void SetTolerance(const Standard_Real theToleranceX, - const Standard_Real theToleranceY) + void SetTolerance(const Standard_Real theToleranceX, + const Standard_Real theToleranceY) { myTolerance[0] = theToleranceX * theToleranceX; myTolerance[1] = theToleranceY * theToleranceY; } //! Clear inspector's internal data structures. - inline void Clear() + void Clear() { myVertices->Clear(); myDelNodes.Clear(); @@ -86,26 +86,26 @@ //! Deletes vertex with the given index. //! @param theIndex index of vertex to be removed. - inline void Delete(const Standard_Integer theIndex) + void Delete(const Standard_Integer theIndex) { myVertices->ChangeValue(theIndex - 1).SetMovability(BRepMesh_Deleted); myDelNodes.Append(theIndex); } //! Returns number of registered vertices. - inline Standard_Integer NbVertices() const + Standard_Integer NbVertices() const { return myVertices->Length(); } //! Returns vertex with the given index. - inline BRepMesh_Vertex& GetVertex(Standard_Integer theIndex) + BRepMesh_Vertex& GetVertex(Standard_Integer theIndex) { return myVertices->ChangeValue(theIndex - 1); } //! Set reference point to be checked. - inline void SetPoint(const gp_XY& thePoint) + void SetPoint(const gp_XY& thePoint) { myIndex = 0; myMinSqDist = RealLast(); @@ -113,26 +113,26 @@ } //! Returns index of point coinciding with regerence one. - inline Standard_Integer GetCoincidentPoint() const + Standard_Integer GetCoincidentPoint() const { return myIndex; } //! Returns list with indexes of vertices that have movability attribute //! equal to BRepMesh_Deleted and can be replaced with another node. - inline const IMeshData::ListOfInteger& GetListOfDelPoints() const + const IMeshData::ListOfInteger& GetListOfDelPoints() const { return myDelNodes; } //! Returns set of mesh vertices. - inline const Handle(IMeshData::VectorOfVertex)& Vertices() const + const Handle(IMeshData::VectorOfVertex)& Vertices() const { return myVertices; } //! Returns set of mesh vertices for modification. - inline Handle(IMeshData::VectorOfVertex)& ChangeVertices() + Handle(IMeshData::VectorOfVertex)& ChangeVertices() { return myVertices; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_VertexTool.cxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_VertexTool.cxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_VertexTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_VertexTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMesh_VertexTool, Standard_Transient) + //======================================================================= //function : Inspect //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_VertexTool.hxx opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_VertexTool.hxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/BRepMesh_VertexTool.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/BRepMesh_VertexTool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -99,19 +99,19 @@ Standard_EXPORT void DeleteVertex(const Standard_Integer theIndex); //! Returns set of mesh vertices. - inline const Handle(IMeshData::VectorOfVertex)& Vertices() const + const Handle(IMeshData::VectorOfVertex)& Vertices() const { return mySelector.Vertices(); } //! Returns set of mesh vertices. - inline Handle(IMeshData::VectorOfVertex)& ChangeVertices() + Handle(IMeshData::VectorOfVertex)& ChangeVertices() { return mySelector.ChangeVertices(); } //! Returns vertex by the given index. - inline const BRepMesh_Vertex& FindKey(const Standard_Integer theIndex) + const BRepMesh_Vertex& FindKey(const Standard_Integer theIndex) { return mySelector.GetVertex(theIndex); } @@ -125,13 +125,13 @@ } //! Returns a number of vertices. - inline Standard_Integer Extent() const + Standard_Integer Extent() const { return mySelector.NbVertices(); } //! Returns True when the map contains no keys.
- inline Standard_Boolean IsEmpty() const + Standard_Boolean IsEmpty() const { return (Extent() == 0); } @@ -143,14 +143,14 @@ const BRepMesh_Vertex& theVertex); //! Remove last node from the structure. - inline void RemoveLast() + void RemoveLast() { DeleteVertex(Extent()); } //! Returns the list with indexes of vertices that have movability attribute //! equal to BRepMesh_Deleted and can be replaced with another node. - inline const IMeshData::ListOfInteger& GetListOfDelNodes() const + const IMeshData::ListOfInteger& GetListOfDelNodes() const { return mySelector.GetListOfDelPoints(); } @@ -158,7 +158,7 @@ //! Prints statistics. Standard_EXPORT void Statistics(Standard_OStream& theStream) const; - DEFINE_STANDARD_RTTI_INLINE(BRepMesh_VertexTool, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(BRepMesh_VertexTool, Standard_Transient) private: @@ -166,9 +166,9 @@ //! @param thePoint point to be expanded. //! @param[out] theMinPoint bottom left corner of area defined by expanded point. //! @param[out] theMaxPoint top right corner of area defined by expanded point. - inline void expandPoint(const gp_XY& thePoint, - gp_XY& theMinPoint, - gp_XY& theMaxPoint) + void expandPoint(const gp_XY& thePoint, + gp_XY& theMinPoint, + gp_XY& theMaxPoint) { theMinPoint.SetX(thePoint.X() - myTolerance[0]); theMinPoint.SetY(thePoint.Y() - myTolerance[1]); diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/delabella.cpp opencascade-7.5.1+dfsg1/src/BRepMesh/delabella.cpp --- opencascade-7.4.1+dfsg1/src/BRepMesh/delabella.cpp 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/delabella.cpp 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1047 @@ +/* + +MIT License + +DELABELLA - Delaunay triangulation library +Copyright (C) 2018 GUMIX - Marcin Sokalski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +#include +#include + +// gcc 4.9 for Android doesn't have search.h +#if !defined(__ANDROID__) || defined(__clang__) + #include +#endif + +#if (defined(__APPLE__)) +#include +#else +#include +#endif + +#include +#include "delabella.pxx" // we just need LOG() macro + +// assuming BITS is max(X_BITS,Y_BITS) + +typedef double Signed14; // BITS xy coords +typedef double Signed15; // BITS + 1 vect::xy +typedef long double Unsigned28; // 2xBITS z coord +typedef long double Signed29; // 2xBITS + 1 vect::z +typedef long double Signed31; // 2xBITS + 3 norm::z +typedef long double Signed45; // 3xBITS + 3 norm::xy +typedef long double Signed62; // 4xBITS + 6 dot(vect,norm) + +/* +// above typedefs can be used to configure delabella arithmetic types +// in example, EXACT SOLVER (with xy coords limited to 14bits integers in range: +/-8192) +// could be achieved with following configuration: + +typedef int16_t Signed14; // BITS xy coords +typedef int16_t Signed15; // BITS + 1 vect::xy +typedef uint32_t Unsigned28; // 2xBITS z coord +typedef int32_t Signed29; // 2xBITS + 1 vect::z +typedef int32_t Signed31; // 2xBITS + 3 norm::z +typedef int64_t Signed45; // 3xBITS + 3 norm::xy +typedef int64_t Signed62; // 4xBITS + 6 dot(vect,norm) + +// alternatively, one could use some BigInt implementation +// in order to expand xy range +*/ + + +static Unsigned28 s14sqr(const Signed14& s) +{ + return (Unsigned28)((Signed29)s*s); +} + +struct Norm +{ + Signed45 x; + Signed45 y; + Signed31 z; +}; + +struct Vect +{ + Signed15 x, y; + Signed29 z; + + Norm cross (const Vect& v) const // cross prod + { + Norm n; + n.x = (Signed45)y*v.z - (Signed45)z*v.y; + n.y = (Signed45)z*v.x - (Signed45)x*v.z; + n.z = (Signed29)x*v.y - (Signed29)y*v.x; + return n; + } +}; + +struct CDelaBella : IDelaBella +{ + struct Face; + + struct Vert : DelaBella_Vertex + { + Unsigned28 z; + Face* sew; + + Vect operator - (const Vert& v) const // diff + { + Vect d; + d.x = (Signed15)x - (Signed15)v.x; + d.y = (Signed15)y - (Signed15)v.y; + d.z = (Signed29)z - (Signed29)v.z; + return d; + } + + static bool overlap(const Vert* v1, const Vert* v2) + { + return v1->x == v2->x && v1->y == v2->y; + } + + bool operator < (const Vert& v) const + { + return u28cmp(this, &v) < 0; + } + + static int u28cmp(const void* a, const void* b) + { + Vert* va = (Vert*)a; + Vert* vb = (Vert*)b; + if (va->z < vb->z) + return -1; + if (va->z > vb->z) + return 1; + if (va->y < vb->y) + return -1; + if (va->y > vb->y) + return 1; + if (va->x < vb->x) + return -1; + if (va->x > vb->x) + return 1; + if (va->i < vb->i) + return -1; + if (va->i > vb->i) + return 1; + return 0; + } + }; + + struct Face : DelaBella_Triangle + { + Norm n; + + static Face* Alloc(Face** from) + { + Face* f = *from; + *from = (Face*)f->next; + f->next = 0; + return f; + } + + void Free(Face** to) + { + next = *to; + *to = this; + } + + Face* Next(const Vert* p) const + { + // return next face in same direction as face vertices are (cw/ccw) + + if (v[0] == p) + return (Face*)f[1]; + if (v[1] == p) + return (Face*)f[2]; + if (v[2] == p) + return (Face*)f[0]; + return 0; + } + + Signed62 dot(const Vert& p) const // dot + { + Vect d = p - *(Vert*)v[0]; + return (Signed62)n.x * d.x + (Signed62)n.y * d.y + (Signed62)n.z * d.z; + } + + Norm cross() const // cross of diffs + { + return (*(Vert*)v[1] - *(Vert*)v[0]).cross(*(Vert*)v[2] - *(Vert*)v[0]); + } + }; + + Vert* vert_alloc; + Face* face_alloc; + int max_verts; + int max_faces; + + Face* first_dela_face; + Face* first_hull_face; + Vert* first_hull_vert; + + int inp_verts; + int out_verts; + + int(*errlog_proc)(void* file, const char* fmt, ...); + void* errlog_file; + + virtual ~CDelaBella () + { + } + + int Triangulate() + { + int points = inp_verts; + std::sort(vert_alloc, vert_alloc + points); + + // rmove dups + { + int w = 0, r = 1; // skip initial no-dups block + while (r < points && !Vert::overlap(vert_alloc + r, vert_alloc + w)) + { + w++; + r++; + } + + w++; + + while (r < points) + { + r++; + + // skip dups + while (r < points && Vert::overlap(vert_alloc + r, vert_alloc + r - 1)) + r++; + + // copy next no-dups block + while (r < points && !Vert::overlap(vert_alloc + r, vert_alloc + r - 1)) + vert_alloc[w++] = vert_alloc[r++]; + } + + if (points - w) + { + if (errlog_proc) + errlog_proc(errlog_file, "[WRN] detected %d dups in xy array!\n", points - w); + points = w; + } + } + + if (points < 3) + { + if (points == 2) + { + if (errlog_proc) + errlog_proc(errlog_file, "[WRN] all input points are colinear, returning single segment!\n"); + first_hull_vert = vert_alloc + 0; + vert_alloc[0].next = (DelaBella_Vertex*)vert_alloc + 1; + vert_alloc[1].next = 0; + } + else + { + if (errlog_proc) + errlog_proc(errlog_file, "[WRN] all input points are identical, returning signle point!\n"); + first_hull_vert = vert_alloc + 0; + vert_alloc[0].next = 0; + } + + return -points; + } + + int hull_faces = 2 * points - 4; + + if (max_faces < hull_faces) + { + if (max_faces) + free(face_alloc); + max_faces = 0; + face_alloc = (Face*)malloc(sizeof(Face) * hull_faces); + if (face_alloc) + max_faces = hull_faces; + else + { + if (errlog_proc) + errlog_proc(errlog_file, "[ERR] Not enough memory, shop for some more RAM. See you!\n"); + return 0; + } + } + + for (int i = 1; i < hull_faces; i++) + face_alloc[i - 1].next = face_alloc + i; + face_alloc[hull_faces - 1].next = 0; + + Face* cache = face_alloc; + Face* hull = 0; + + Face f; // tmp + f.v[0] = vert_alloc + 0; + f.v[1] = vert_alloc + 1; + f.v[2] = vert_alloc + 2; + f.n = f.cross(); + + bool colinear = f.n.z == 0; + int i = 3; + + ///////////////////////////////////////////////////////////////////////// + // UNTIL INPUT IS COPLANAR, GROW IT IN FORM OF A 2D CONTOUR + /* + . | | after adding . | ________* L + . \ Last points to / Head next point . \ ______/ / + . *____ | -----> .H *____ | + . |\_ \_____ | . |\_ \_____ | + . \ \_ \__* - Tail points to Last . \ \_ \__* T + . \ \_ / . \ \_ / + . \__ \_ __/ . \__ \_ __/ + . \__* - Head points to Tail . \__/ + */ + + Vert* head = (Vert*)f.v[0]; + Vert* tail = (Vert*)f.v[1]; + Vert* last = (Vert*)f.v[2]; + + head->next = tail; + tail->next = last; + last->next = head; + + while (i < points && f.dot(vert_alloc[i]) == 0) + { + Vert* v = vert_alloc + i; + + // it is enough to test just 1 non-zero coord + // but we want also to test stability (assert) + // so we calc all signs... + + // why not testing sign of dot prod of 2 normals? + // that way we'd fall into precission problems + + Norm LvH = (*v - *last).cross(*head - *last); + bool lvh = + (f.n.x > 0 && LvH.x > 0) || (f.n.x < 0 && LvH.x < 0) || + (f.n.y > 0 && LvH.y > 0) || (f.n.y < 0 && LvH.y < 0) || + (f.n.z > 0 && LvH.z > 0) || (f.n.z < 0 && LvH.z < 0); + + Norm TvL = (*v - *tail).cross(*last - *tail); + bool tvl = + (f.n.x > 0 && TvL.x > 0) || (f.n.x < 0 && TvL.x < 0) || + (f.n.y > 0 && TvL.y > 0) || (f.n.y < 0 && TvL.y < 0) || + (f.n.z > 0 && TvL.z > 0) || (f.n.z < 0 && TvL.z < 0); + + if (lvh && !tvl) // insert new f on top of e(2,0) = (last,head) + { + // f.v[0] = head; + f.v[1] = last; + f.v[2] = v; + + last->next = v; + v->next = head; + tail = last; + } + else + if (tvl && !lvh) // insert new f on top of e(1,2) = (tail,last) + { + f.v[0] = last; + //f.v[1] = tail; + f.v[2] = v; + + tail->next = v; + v->next = last; + head = last; + } + else + { + // wtf? dilithium crystals are fucked. + assert(0); + } + + last = v; + i++; + } + + if (i == points) + { + if (colinear) + { + if (errlog_proc) + errlog_proc(errlog_file, "[WRN] all input points are colinear, returning segment list!\n"); + first_hull_vert = head; + last->next = 0; // break contour, make it a list + return -points; + } + else + { + if (points > 3) + { + if (errlog_proc) + errlog_proc(errlog_file, "[NFO] all input points are cocircular.\n"); + } + else + { + if (errlog_proc) + errlog_proc(errlog_file, "[NFO] trivial case of 3 points, thank you.\n"); + + first_dela_face = Face::Alloc(&cache); + first_dela_face->next = 0; + first_hull_face = Face::Alloc(&cache); + first_hull_face->next = 0; + + first_dela_face->f[0] = first_dela_face->f[1] = first_dela_face->f[2] = first_hull_face; + first_hull_face->f[0] = first_hull_face->f[1] = first_hull_face->f[2] = first_dela_face; + + head->sew = tail->sew = last->sew = first_hull_face; + + if (f.n.z < 0) + { + first_dela_face->v[0] = head; + first_dela_face->v[1] = tail; + first_dela_face->v[2] = last; + first_hull_face->v[0] = last; + first_hull_face->v[1] = tail; + first_hull_face->v[2] = head; + + // reverse silhouette + head->next = last; + last->next = tail; + tail->next = head; + + first_hull_vert = last; + } + else + { + first_dela_face->v[0] = last; + first_dela_face->v[1] = tail; + first_dela_face->v[2] = head; + first_hull_face->v[0] = head; + first_hull_face->v[1] = tail; + first_hull_face->v[2] = last; + + first_hull_vert = head; + } + + first_dela_face->n = first_dela_face->cross(); + first_hull_face->n = first_hull_face->cross(); + + return 3; + } + + // retract last point it will be added as a cone's top later + last = head; + head = (Vert*)head->next; + i--; + } + } + + ///////////////////////////////////////////////////////////////////////// + // CREATE CONE HULL WITH TOP AT cloud[i] AND BASE MADE OF CONTOUR LIST + // in 2 ways :( - depending on at which side of the contour a top vertex appears + + Vert* q = vert_alloc + i; + + if (f.dot(*q) > 0) + { + Vert* p = last; + Vert* n = (Vert*)p->next; + + Face* first_side = Face::Alloc(&cache); + first_side->v[0] = p; + first_side->v[1] = n; + first_side->v[2] = q; + first_side->n = first_side->cross(); + hull = first_side; + + p = n; + n = (Vert*)n->next; + + Face* prev_side = first_side; + Face* prev_base = 0; + Face* first_base = 0; + + do + { + Face* base = Face::Alloc(&cache); + base->v[0] = n; + base->v[1] = p; + base->v[2] = last; + base->n = base->cross(); + + Face* side = Face::Alloc(&cache); + side->v[0] = p; + side->v[1] = n; + side->v[2] = q; + side->n = side->cross(); + + side->f[2] = base; + base->f[2] = side; + + side->f[1] = prev_side; + prev_side->f[0] = side; + + base->f[0] = prev_base; + if (prev_base) + prev_base->f[1] = base; + else + first_base = base; + + prev_base = base; + prev_side = side; + + p = n; + n = (Vert*)n->next; + } while (n != last); + + Face* last_side = Face::Alloc(&cache); + last_side->v[0] = p; + last_side->v[1] = n; + last_side->v[2] = q; + last_side->n = last_side->cross(); + + last_side->f[1] = prev_side; + prev_side->f[0] = last_side; + + last_side->f[0] = first_side; + first_side->f[1] = last_side; + + first_base->f[0] = first_side; + first_side->f[2] = first_base; + + last_side->f[2] = prev_base; + prev_base->f[1] = last_side; + + i++; + } + else + { + Vert* p = last; + Vert* n = (Vert*)p->next; + + Face* first_side = Face::Alloc(&cache); + first_side->v[0] = n; + first_side->v[1] = p; + first_side->v[2] = q; + first_side->n = first_side->cross(); + hull = first_side; + + p = n; + n = (Vert*)n->next; + + Face* prev_side = first_side; + Face* prev_base = 0; + Face* first_base = 0; + + do + { + Face* base = Face::Alloc(&cache); + base->v[0] = p; + base->v[1] = n; + base->v[2] = last; + base->n = base->cross(); + + Face* side = Face::Alloc(&cache); + side->v[0] = n; + side->v[1] = p; + side->v[2] = q; + side->n = side->cross(); + + side->f[2] = base; + base->f[2] = side; + + side->f[0] = prev_side; + prev_side->f[1] = side; + + base->f[1] = prev_base; + if (prev_base) + prev_base->f[0] = base; + else + first_base = base; + + prev_base = base; + prev_side = side; + + p = n; + n = (Vert*)n->next; + } while (n != last); + + Face* last_side = Face::Alloc(&cache); + last_side->v[0] = n; + last_side->v[1] = p; + last_side->v[2] = q; + last_side->n = last_side->cross(); + + last_side->f[0] = prev_side; + prev_side->f[1] = last_side; + + last_side->f[1] = first_side; + first_side->f[0] = last_side; + + first_base->f[1] = first_side; + first_side->f[2] = first_base; + + last_side->f[2] = prev_base; + prev_base->f[0] = last_side; + + i++; + } + + ///////////////////////////////////////////////////////////////////////// + // ACTUAL ALGORITHM + + for (; i < points; i++) + { + //ValidateHull(alloc, 2 * i - 4); + + Vert* _q = vert_alloc + i; + Vert* _p = vert_alloc + i - 1; + Face* _f = hull; + + // 1. FIND FIRST VISIBLE FACE + // simply iterate around last vertex using last added triange adjecency info + while (_f->dot(*_q) <= 0) + { + _f = _f->Next(_p); + if (_f == hull) + { + // if no visible face can be located at last vertex, + // let's run through all faces (approximately last to first), + // yes this is emergency fallback and should not ever happen. + _f = face_alloc + 2 * i - 4 - 1; + while (_f->dot(*_q) <= 0) + { + assert(_f != face_alloc); // no face is visible? you must be kidding! + _f--; + } + } + } + + // 2. DELETE VISIBLE FACES & ADD NEW ONES + // (we also build silhouette (vertex loop) between visible & invisible faces) + + int del = 0; + int add = 0; + + // push first visible face onto stack (of visible faces) + Face* stack = _f; + _f->next = _f; // old trick to use list pointers as 'on-stack' markers + while (stack) + { + // pop, take care of last item ptr (it's not null!) + _f = stack; + stack = (Face*)_f->next; + if (stack == _f) + stack = 0; + _f->next = 0; + + // copy parts of old face that we still need after removal + Vert* fv[3] = { (Vert*)_f->v[0],(Vert*)_f->v[1],(Vert*)_f->v[2] }; + Face* ff[3] = { (Face*)_f->f[0],(Face*)_f->f[1],(Face*)_f->f[2] }; + + // delete visible face + _f->Free(&cache); + del++; + + // check all 3 neighbors + for (int e = 0; e < 3; e++) + { + Face* n = ff[e]; + if (n && !n->next) // ensure neighbor is not processed yet & isn't on stack + { + if (n->dot(*_q) <= 0) // if neighbor is not visible we have slihouette edge + { + // build face + add++; + + // ab: given face adjacency [index][], + // it provides [][2] vertex indices on shared edge (CCW order) + const static int ab[3][2] = { { 1,2 },{ 2,0 },{ 0,1 } }; + + Vert* a = fv[ab[e][0]]; + Vert* b = fv[ab[e][1]]; + + Face* s = Face::Alloc(&cache); + s->v[0] = a; + s->v[1] = b; + s->v[2] = _q; + + s->n = s->cross(); + s->f[2] = n; + + // change neighbour's adjacency from old visible face to cone side + if (n->f[0] == _f) + n->f[0] = s; + else + if (n->f[1] == _f) + n->f[1] = s; + else + if (n->f[2] == _f) + n->f[2] = s; + else + assert(0); + + // build silhouette needed for sewing sides in the second pass + a->sew = s; + a->next = b; + } + else + { + // disjoin visible faces + // so they won't be processed more than once + + if (n->f[0] == _f) + n->f[0] = 0; + else + if (n->f[1] == _f) + n->f[1] = 0; + else + if (n->f[2] == _f) + n->f[2] = 0; + else + assert(0); + + // push neighbor face, it's visible and requires processing + n->next = stack ? stack : n; + stack = n; + } + } + } + } + + // if addv[0]; + + Vert* pr = entry; + do + { + // sew pr<->nx + Vert* nx = (Vert*)pr->next; + pr->sew->f[0] = nx->sew; + nx->sew->f[1] = pr->sew; + pr = nx; + } while (pr != entry); + } + + assert(2 * i - 4 == hull_faces); + //ValidateHull(alloc, hull_faces); + + // needed? + for (i = 0; i < points; i++) + { + vert_alloc[i].next = 0; + vert_alloc[i].sew = 0; + } + + i = 0; + Face** prev_dela = &first_dela_face; + Face** prev_hull = &first_hull_face; + for (int j = 0; j < hull_faces; j++) + { + Face* _f = face_alloc + j; + if (_f->n.z < 0) + { + *prev_dela = _f; + prev_dela = (Face**)&_f->next; + i++; + } + else + { + *prev_hull = _f; + prev_hull = (Face**)&_f->next; + if (((Face*)_f->f[0])->n.z < 0) + { + _f->v[1]->next = _f->v[2]; + ((Vert*)_f->v[1])->sew = _f; + } + if (((Face*)_f->f[1])->n.z < 0) + { + _f->v[2]->next = _f->v[0]; + ((Vert*)_f->v[2])->sew = _f; + } + if (((Face*)_f->f[2])->n.z < 0) + { + _f->v[0]->next = _f->v[1]; + ((Vert*)_f->v[0])->sew = _f; + } + } + } + + *prev_dela = 0; + *prev_hull = 0; + + first_hull_vert = (Vert*)first_hull_face->v[0]; + + // todo link slihouette verts into contour + // and sew its edges with hull faces + + return 3*i; + } + + bool ReallocVerts(int points) + { + inp_verts = points; + out_verts = 0; + + first_dela_face = 0; + first_hull_face = 0; + first_hull_vert = 0; + + if (max_verts < points) + { + if (max_verts) + { + free(vert_alloc); + vert_alloc = 0; + max_verts = 0; + } + + vert_alloc = (Vert*)malloc(sizeof(Vert)*points); + if (vert_alloc) + max_verts = points; + else + { + if (errlog_proc) + errlog_proc(errlog_file, "[ERR] Not enough memory, shop for some more RAM. See you!\n"); + return false; + } + } + + return true; + } + + virtual int Triangulate(int points, const float* x, const float* y = 0, int advance_bytes = 0) + { + if (!x) + return 0; + + if (!y) + y = x + 1; + + if (advance_bytes < static_cast(sizeof(float) * 2)) + advance_bytes = static_cast(sizeof(float) * 2); + + if (!ReallocVerts(points)) + return 0; + + for (int i = 0; i < points; i++) + { + Vert* v = vert_alloc + i; + v->i = i; + v->x = (Signed14)*(const float*)((const char*)x + i*advance_bytes); + v->y = (Signed14)*(const float*)((const char*)y + i*advance_bytes); + v->z = s14sqr(v->x) + s14sqr(v->y); + } + + out_verts = Triangulate(); + return out_verts; + } + + virtual int Triangulate(int points, const double* x, const double* y, int advance_bytes) + { + if (!x) + return 0; + + if (!y) + y = x + 1; + + if (advance_bytes < static_cast(sizeof(double) * 2)) + advance_bytes = static_cast(sizeof(double) * 2); + + if (!ReallocVerts(points)) + return 0; + + for (int i = 0; i < points; i++) + { + Vert* v = vert_alloc + i; + v->i = i; + v->x = (Signed14)*(const double*)((const char*)x + i*advance_bytes); + v->y = (Signed14)*(const double*)((const char*)y + i*advance_bytes); + v->z = s14sqr (v->x) + s14sqr (v->y); + } + + out_verts = Triangulate(); + return out_verts; + } + + virtual void Destroy() + { + if (face_alloc) + free(face_alloc); + if (vert_alloc) + free(vert_alloc); + delete this; + } + + // num of points passed to last call to Triangulate() + virtual int GetNumInputPoints() const + { + return inp_verts; + } + + // num of verts returned from last call to Triangulate() + virtual int GetNumOutputVerts() const + { + return out_verts; + } + + virtual const DelaBella_Triangle* GetFirstDelaunayTriangle() const + { + return first_dela_face; + } + + virtual const DelaBella_Triangle* GetFirstHullTriangle() const + { + return first_hull_face; + } + + virtual const DelaBella_Vertex* GetFirstHullVertex() const + { + return first_hull_vert; + } + + virtual void SetErrLog(int(*proc)(void* stream, const char* fmt, ...), void* stream) + { + errlog_proc = proc; + errlog_file = stream; + } +}; + +IDelaBella* IDelaBella::Create() +{ + CDelaBella* db = new CDelaBella; + if (!db) + return 0; + + db->vert_alloc = 0; + db->face_alloc = 0; + db->max_verts = 0; + db->max_faces = 0; + + db->first_dela_face = 0; + db->first_hull_face = 0; + db->first_hull_vert = 0; + + db->inp_verts = 0; + db->out_verts = 0; + + db->errlog_proc = 0; + db->errlog_file = 0; + + return db; +} + +void* DelaBella_Create() +{ + return IDelaBella::Create(); +} + +void DelaBella_Destroy(void* db) +{ + ((IDelaBella*)db)->Destroy(); +} + +void DelaBella_SetErrLog(void* db, int(*proc)(void* stream, const char* fmt, ...), void* stream) +{ + ((IDelaBella*)db)->SetErrLog(proc, stream); +} + +int DelaBella_TriangulateFloat(void* db, int points, float* x, float* y, int advance_bytes) +{ + return ((IDelaBella*)db)->Triangulate(points, x, y, advance_bytes); +} + +int DelaBella_TriangulateDouble(void* db, int points, double* x, double* y, int advance_bytes) +{ + return ((IDelaBella*)db)->Triangulate(points, x, y, advance_bytes); +} + +int DelaBella_GetNumInputPoints(void* db) +{ + return ((IDelaBella*)db)->GetNumInputPoints(); +} + +int DelaBella_GetNumOutputVerts(void* db) +{ + return ((IDelaBella*)db)->GetNumOutputVerts(); +} + +const DelaBella_Triangle* GetFirstDelaunayTriangle(void* db) +{ + return ((IDelaBella*)db)->GetFirstDelaunayTriangle(); +} + +const DelaBella_Triangle* GetFirstHullTriangle(void* db) +{ + return ((IDelaBella*)db)->GetFirstHullTriangle(); +} + +const DelaBella_Vertex* GetFirstHullVertex(void* db) +{ + return ((IDelaBella*)db)->GetFirstHullVertex(); +} + +// depreciated! +int DelaBella(int points, const double* xy, int* abc, int(*errlog)(const char* fmt, ...)) +{ + if (errlog) + errlog("[WRN] Depreciated interface! errlog disabled.\n"); + + if (!xy || points <= 0) + return 0; + + IDelaBella* db = IDelaBella::Create(); + int verts = db->Triangulate(points, xy, 0, 0); + + if (!abc) + return verts; + + if (verts > 0) + { + int tris = verts / 3; + const DelaBella_Triangle* dela = db->GetFirstDelaunayTriangle(); + for (int i = 0; i < tris; i++) + { + for (int j=0; j<3; j++) + abc[3 * i + j] = dela->v[j]->i; + dela = dela->next; + } + } + else + { + int pnts = -verts; + const DelaBella_Vertex* line = db->GetFirstHullVertex(); + for (int i = 0; i < pnts; i++) + { + abc[i] = line->i; + line = line->next; + } + } + + return verts; +} diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/delabella.pxx opencascade-7.5.1+dfsg1/src/BRepMesh/delabella.pxx --- opencascade-7.4.1+dfsg1/src/BRepMesh/delabella.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/delabella.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,90 @@ +/* + +MIT License + +DELABELLA - Delaunay triangulation library +Copyright (C) 2018 GUMIX - Marcin Sokalski + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +#ifndef DELABELLA_H +#define DELABELLA_H + +// returns: positive value: number of triangle indices, negative: number of line segment indices (degenerated input) +// triangle indices in abc array are always returned in clockwise order +// DEPRECIATED. move to new API either extern "C" or IDelaBella (C++) +int DelaBella(int points, const double* xy/*[points][2]*/, int* abc/*[2*points-5][3]*/, int (*errlog)(const char* fmt,...) = printf); + +struct DelaBella_Vertex +{ + int i; // index of original point + double x, y; // coordinates (input copy) + DelaBella_Vertex* next; // next silhouette vertex +}; + +struct DelaBella_Triangle +{ + DelaBella_Vertex* v[3]; // 3 vertices spanning this triangle + DelaBella_Triangle* f[3]; // 3 adjacent faces, f[i] is at the edge opposite to vertex v[i] + DelaBella_Triangle* next; // next triangle (of delaunay set or hull set) +}; + +#ifdef __cplusplus +struct IDelaBella +{ + static IDelaBella* Create(); + + virtual void Destroy() = 0; + + virtual void SetErrLog(int(*proc)(void* stream, const char* fmt, ...), void* stream) = 0; + + // return 0: no output + // negative: all points are colinear, output hull vertices form colinear segment list, no triangles on output + // positive: output hull vertices form counter-clockwise ordered segment contour, delaunay and hull triangles are available + // if 'y' pointer is null, y coords are treated to be located immediately after every x + // if advance_bytes is less than 2*sizeof coordinate type, it is treated as 2*sizeof coordinate type + virtual int Triangulate(int points, const float* x, const float* y = 0, int advance_bytes = 0) = 0; + virtual int Triangulate(int points, const double* x, const double* y = 0, int advance_bytes = 0) = 0; + + // num of points passed to last call to Triangulate() + virtual int GetNumInputPoints() const = 0; + + // num of verts returned from last call to Triangulate() + virtual int GetNumOutputVerts() const = 0; + + virtual const DelaBella_Triangle* GetFirstDelaunayTriangle() const = 0; // valid only if Triangulate() > 0 + virtual const DelaBella_Triangle* GetFirstHullTriangle() const = 0; // valid only if Triangulate() > 0 + virtual const DelaBella_Vertex* GetFirstHullVertex() const = 0; // if Triangulate() < 0 it is list, otherwise closed contour! +}; +#else +void* DelaBella_Create(); +void DelaBella_Destroy(void* db); +void DelaBella_SetErrLog(void* db, int(*proc)(void* stream, const char* fmt, ...), void* stream); +int DelaBella_TriangulateFloat(void* db, int points, float* x, float* y = 0, int advance_bytes = 0); +int DelaBella_TriangulateDouble(void* db, int points, double* x, double* y = 0, int advance_bytes = 0); +int DelaBella_GetNumInputPoints(void* db); +int DelaBella_GetNumOutputVerts(void* db); +const DelaBella_Triangle* GetFirstDelaunayTriangle(void* db); +const DelaBella_Triangle* GetFirstHullTriangle(void* db); +const DelaBella_Vertex* GetFirstHullVertex(void* db); +#endif + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/BRepMesh/FILES opencascade-7.5.1+dfsg1/src/BRepMesh/FILES --- opencascade-7.4.1+dfsg1/src/BRepMesh/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMesh/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,6 +1,7 @@ BRepMesh_BaseMeshAlgo.cxx BRepMesh_BaseMeshAlgo.hxx BRepMesh_ConstrainedBaseMeshAlgo.hxx +BRepMesh_ConstrainedBaseMeshAlgo.cxx BRepMesh_BoundaryParamsRangeSplitter.hxx BRepMesh_Circle.hxx BRepMesh_CircleInspector.hxx @@ -85,4 +86,11 @@ BRepMesh_VertexTool.cxx BRepMesh_VertexTool.hxx BRepMesh_CustomBaseMeshAlgo.hxx +BRepMesh_CustomBaseMeshAlgo.cxx BRepMesh_CustomDelaunayBaseMeshAlgo.hxx +delabella.pxx +delabella.cpp +BRepMesh_DelabellaBaseMeshAlgo.hxx +BRepMesh_DelabellaBaseMeshAlgo.cxx +BRepMesh_DelabellaMeshAlgoFactory.hxx +BRepMesh_DelabellaMeshAlgoFactory.cxx diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Curve.cxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Curve.cxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Curve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Curve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMeshData_Curve, IMeshData_Curve) + //======================================================================= // Function: Constructor // Purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Curve.hxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Curve.hxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Curve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Curve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -60,7 +60,7 @@ //! Clears parameters list. Standard_EXPORT virtual void Clear(const Standard_Boolean isKeepEndPoints) Standard_OVERRIDE; - DEFINE_STANDARD_RTTI_INLINE(BRepMeshData_Curve, IMeshData_Curve) + DEFINE_STANDARD_RTTIEXT(BRepMeshData_Curve, IMeshData_Curve) protected: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Edge.cxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Edge.cxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Edge.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Edge.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMeshData_Edge, IMeshData_Edge) + //======================================================================= // Function: Constructor // Purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Edge.hxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Edge.hxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Edge.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Edge.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -53,7 +53,7 @@ Standard_EXPORT virtual const IMeshData::IPCurveHandle& GetPCurve ( const Standard_Integer theIndex) const Standard_OVERRIDE; - DEFINE_STANDARD_RTTI_INLINE(BRepMeshData_Edge, IMeshData_Edge) + DEFINE_STANDARD_RTTIEXT(BRepMeshData_Edge, IMeshData_Edge) private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Face.cxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Face.cxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Face.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Face.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMeshData_Face, IMeshData_Face) + //======================================================================= // Function: Constructor // Purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Face.hxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Face.hxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Face.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Face.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,7 +47,7 @@ const TopoDS_Wire& theWire, const Standard_Integer theEdgeNb = 0) Standard_OVERRIDE; - DEFINE_STANDARD_RTTI_INLINE(BRepMeshData_Face, IMeshData_Face) + DEFINE_STANDARD_RTTIEXT(BRepMeshData_Face, IMeshData_Face) private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Model.cxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Model.cxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Model.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Model.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,6 +21,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMeshData_Model, IMeshData_Model) + //======================================================================= // Function: Constructor // Purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Model.hxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Model.hxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Model.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Model.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,18 +35,18 @@ Standard_EXPORT virtual ~BRepMeshData_Model (); //! Returns maximum size of shape's bounding box. - Standard_EXPORT virtual Standard_Real GetMaxSize () const Standard_OVERRIDE + virtual Standard_Real GetMaxSize () const Standard_OVERRIDE { return myMaxSize; } //! Sets maximum size of shape's bounding box. - inline void SetMaxSize (const Standard_Real theValue) + void SetMaxSize (const Standard_Real theValue) { myMaxSize = theValue; } - DEFINE_STANDARD_RTTI_INLINE(BRepMeshData_Model, IMeshData_Model) + DEFINE_STANDARD_RTTIEXT(BRepMeshData_Model, IMeshData_Model) public: //! @name discrete faces diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_PCurve.cxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_PCurve.cxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_PCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_PCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMeshData_PCurve, IMeshData_PCurve) + //======================================================================= // Function: Constructor // Purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_PCurve.hxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_PCurve.hxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_PCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_PCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,7 +65,7 @@ //! Clears parameters list. Standard_EXPORT virtual void Clear(const Standard_Boolean isKeepEndPoints) Standard_OVERRIDE; - DEFINE_STANDARD_RTTI_INLINE(BRepMeshData_PCurve, IMeshData_PCurve) + DEFINE_STANDARD_RTTIEXT(BRepMeshData_PCurve, IMeshData_PCurve) protected: diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Wire.cxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Wire.cxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Wire.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Wire.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(BRepMeshData_Wire, IMeshData_Wire) + //======================================================================= // Function: Constructor // Purpose : diff -Nru opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Wire.hxx opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Wire.hxx --- opencascade-7.4.1+dfsg1/src/BRepMeshData/BRepMeshData_Wire.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepMeshData/BRepMeshData_Wire.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -52,7 +52,7 @@ Standard_EXPORT virtual TopAbs_Orientation GetEdgeOrientation ( const Standard_Integer theIndex) const Standard_OVERRIDE; - DEFINE_STANDARD_RTTI_INLINE(BRepMeshData_Wire, IMeshData_Wire) + DEFINE_STANDARD_RTTIEXT(BRepMeshData_Wire, IMeshData_Wire) private: diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Analyse.cxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Analyse.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Analyse.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Analyse.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,8 @@ #include +#include +#include #include #include #include @@ -24,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -44,16 +48,8 @@ #include #include #include +#include -// -static void Correct2dPoint(const TopoDS_Face& theF, gp_Pnt2d& theP2d); -// -static BRepOffset_Type DefineConnectType(const TopoDS_Edge& E, - const TopoDS_Face& F1, - const TopoDS_Face& F2, - const Standard_Real SinTol, - const Standard_Boolean CorrectPoint); -// static void CorrectOrientationOfTangent(gp_Vec& TangVec, const TopoDS_Vertex& aVertex, const TopoDS_Edge& anEdge) @@ -68,19 +64,17 @@ //======================================================================= BRepOffset_Analyse::BRepOffset_Analyse() -:myDone(Standard_False) +: myOffset (0.0), myDone (Standard_False) { } - //======================================================================= //function : BRepOffset_Analyse //purpose : //======================================================================= - BRepOffset_Analyse::BRepOffset_Analyse(const TopoDS_Shape& S, - const Standard_Real Angle) -:myDone(Standard_False) + const Standard_Real Angle) +: myOffset (0.0), myDone (Standard_False) { Perform( S, Angle); } @@ -89,34 +83,43 @@ //function : EdgeAnlyse //purpose : //======================================================================= - static void EdgeAnalyse(const TopoDS_Edge& E, const TopoDS_Face& F1, const TopoDS_Face& F2, const Standard_Real SinTol, BRepOffset_ListOfInterval& LI) { - Standard_Real f,l; BRep_Tool::Range(E, F1, f, l); BRepOffset_Interval I; I.First(f); I.Last(l); - // - // Tangent if the regularity is at least G1. - if (BRep_Tool::HasContinuity(E,F1,F2)) { - if (BRep_Tool::Continuity(E,F1,F2) > GeomAbs_C0) { - I.Type(BRepOffset_Tangent); - LI.Append(I); - return; - } + // + BRepAdaptor_Surface aBAsurf1(F1, Standard_False); + GeomAbs_SurfaceType aSurfType1 = aBAsurf1.GetType(); + + BRepAdaptor_Surface aBAsurf2(F2, Standard_False); + GeomAbs_SurfaceType aSurfType2 = aBAsurf2.GetType(); + + Standard_Boolean isTwoPlanes = (aSurfType1 == GeomAbs_Plane && aSurfType2 == GeomAbs_Plane); + + ChFiDS_TypeOfConcavity ConnectType = ChFiDS_Other; + + if (isTwoPlanes) //then use only strong condition + { + if (BRep_Tool::Continuity(E,F1,F2) > GeomAbs_C0) + ConnectType = ChFiDS_Tangential; + else + ConnectType = ChFi3d::DefineConnectType(E, F1, F2, SinTol, Standard_False); } - // - BRepOffset_Type aType = DefineConnectType(E, F1, F2, SinTol, Standard_False); - if(aType != BRepOffset_Tangent) + else { - aType = DefineConnectType(E, F1, F2, SinTol, Standard_True); + if (ChFi3d::IsTangentFaces(E, F1, F2)) //weak condition + ConnectType = ChFiDS_Tangential; + else + ConnectType = ChFi3d::DefineConnectType(E, F1, F2, SinTol, Standard_False); } - I.Type(aType); + + I.Type(ConnectType); LI.Append(I); } @@ -124,7 +127,6 @@ //function : BuildAncestors //purpose : //======================================================================= - static void BuildAncestors (const TopoDS_Shape& S, TopTools_IndexedDataMapOfShapeListOfShape& MA) { @@ -134,59 +136,57 @@ } //======================================================================= -//function : IsDone -//purpose : -//======================================================================= - -Standard_Boolean BRepOffset_Analyse::IsDone() const -{ - return myDone; -} - - -//======================================================================= //function : Perform //purpose : //======================================================================= - void BRepOffset_Analyse::Perform (const TopoDS_Shape& S, - const Standard_Real Angle) + const Standard_Real Angle) { myShape = S; + myNewFaces .Clear(); + myGenerated.Clear(); + myReplacement.Clear(); + myDescendants.Clear(); - angle = Angle; - Standard_Real SinTol = Sin(Angle); + myAngle = Angle; + Standard_Real SinTol = Abs (Sin(Angle)); // Build ancestors. - BuildAncestors (S,ancestors); + BuildAncestors (S,myAncestors); + + TopTools_ListOfShape aLETang; - TopExp_Explorer Exp(S.Oriented(TopAbs_FORWARD),TopAbs_EDGE); for ( ; Exp.More(); Exp.Next()) { const TopoDS_Edge& E = TopoDS::Edge(Exp.Current()); - if (!mapEdgeType.IsBound(E)) { + if (!myMapEdgeType.IsBound(E)) { BRepOffset_ListOfInterval LI; - mapEdgeType.Bind(E,LI); + myMapEdgeType.Bind(E,LI); const TopTools_ListOfShape& L = Ancestors(E); if ( L.IsEmpty()) - continue; + continue; if (L.Extent() == 2) { - const TopoDS_Face& F1 = TopoDS::Face(L.First()); - const TopoDS_Face& F2 = TopoDS::Face(L.Last ()); - EdgeAnalyse(E,F1,F2,SinTol,mapEdgeType(E)); + const TopoDS_Face& F1 = TopoDS::Face (L.First()); + const TopoDS_Face& F2 = TopoDS::Face (L.Last()); + EdgeAnalyse (E, F1, F2, SinTol, myMapEdgeType (E)); + + // For tangent faces add artificial perpendicular face + // to close the gap between them (if they have different offset values) + if (myMapEdgeType(E).Last().Type() == ChFiDS_Tangential) + aLETang.Append (E); } else if (L.Extent() == 1) { - Standard_Real U1,U2; - const TopoDS_Face& F = TopoDS::Face(L.First()); - BRep_Tool::Range(E,F,U1,U2); - BRepOffset_Interval Inter(U1,U2,BRepOffset_Other); - - if (! BRepTools::IsReallyClosed(E,F)) { - Inter.Type(BRepOffset_FreeBoundary); - } - mapEdgeType(E).Append(Inter); + Standard_Real U1, U2; + const TopoDS_Face& F = TopoDS::Face (L.First()); + BRep_Tool::Range (E, F, U1, U2); + BRepOffset_Interval Inter (U1, U2, ChFiDS_Other); + + if (!BRepTools::IsReallyClosed (E, F)) { + Inter.Type (ChFiDS_FreeBound); + } + myMapEdgeType (E).Append (Inter); } else { #ifdef OCCT_DEBUG @@ -195,47 +195,472 @@ } } } + + TreatTangentFaces (aLETang); myDone = Standard_True; } //======================================================================= -//function : Clear +//function : Generated //purpose : //======================================================================= - -void BRepOffset_Analyse::Clear() +void BRepOffset_Analyse::TreatTangentFaces (const TopTools_ListOfShape& theLE) { - myDone = Standard_False; - myShape .Nullify(); - mapEdgeType.Clear(); - ancestors .Clear(); + if (theLE.IsEmpty() || myFaceOffsetMap.IsEmpty()) + { + // Noting to do: either there are no tangent faces in the shape or + // the face offset map has not been provided + return; + } + + // Select the edges which connect faces with different offset values + TopoDS_Compound aCETangent; + BRep_Builder().MakeCompound (aCETangent); + // Bind to each tangent edge a max offset value of its faces + TopTools_DataMapOfShapeReal anEdgeOffsetMap; + // Bind vertices of the tangent edges with connected edges + // of the face with smaller offset value + TopTools_DataMapOfShapeShape aDMVEMin; + for (TopTools_ListOfShape::Iterator it (theLE); it.More(); it.Next()) + { + const TopoDS_Shape& aE = it.Value(); + const TopTools_ListOfShape& aLA = Ancestors (aE); + + const TopoDS_Shape& aF1 = aLA.First(), aF2 = aLA.Last(); + + const Standard_Real *pOffsetVal1 = myFaceOffsetMap.Seek (aF1); + const Standard_Real *pOffsetVal2 = myFaceOffsetMap.Seek (aF2); + const Standard_Real anOffsetVal1 = pOffsetVal1 ? Abs (*pOffsetVal1) : myOffset; + const Standard_Real anOffsetVal2 = pOffsetVal2 ? Abs (*pOffsetVal2) : myOffset; + if (anOffsetVal1 != anOffsetVal2) + { + BRep_Builder().Add (aCETangent, aE); + anEdgeOffsetMap.Bind (aE, Max (anOffsetVal1, anOffsetVal2)); + + const TopoDS_Shape& aFMin = anOffsetVal1 < anOffsetVal2 ? aF1 : aF2; + for (TopoDS_Iterator itV (aE); itV.More(); itV.Next()) + { + const TopoDS_Shape& aV = itV.Value(); + if (Ancestors (aV).Extent() == 3) + { + for (TopExp_Explorer expE (aFMin, TopAbs_EDGE); expE.More(); expE.Next()) + { + const TopoDS_Shape& aEMin = expE.Current(); + if (aEMin.IsSame (aE)) + continue; + for (TopoDS_Iterator itV1 (aEMin); itV1.More(); itV1.Next()) + { + const TopoDS_Shape& aVx = itV1.Value(); + if (aV.IsSame (aVx)) + aDMVEMin.Bind (aV, aEMin); + } + } + } + } + } + } + + if (anEdgeOffsetMap.IsEmpty()) + return; + + // Create map of Face ancestors for the vertices on tangent edges + TopTools_DataMapOfShapeListOfShape aDMVFAnc; + + for (TopTools_ListOfShape::Iterator itE (theLE); itE.More(); itE.Next()) + { + const TopoDS_Shape& aE = itE.Value(); + if (!anEdgeOffsetMap.IsBound (aE)) + continue; + + TopTools_MapOfShape aMFence; + { + const TopTools_ListOfShape& aLEA = Ancestors (aE); + for (TopTools_ListOfShape::Iterator itLEA (aLEA); itLEA.More(); itLEA.Next()) + aMFence.Add (itLEA.Value()); + } + + for (TopoDS_Iterator itV (aE); itV.More(); itV.Next()) + { + const TopoDS_Shape& aV = itV.Value(); + TopTools_ListOfShape* pLFA = aDMVFAnc.Bound (aV, TopTools_ListOfShape()); + const TopTools_ListOfShape& aLVA = Ancestors (aV); + for (TopTools_ListOfShape::Iterator itLVA (aLVA); itLVA.More(); itLVA.Next()) + { + const TopoDS_Edge& aEA = TopoDS::Edge (itLVA.Value()); + const BRepOffset_ListOfInterval* pIntervals = myMapEdgeType.Seek (aEA); + if (!pIntervals || pIntervals->IsEmpty()) + continue; + if (pIntervals->First().Type() == ChFiDS_Tangential) + continue; + + const TopTools_ListOfShape& aLEA = Ancestors (aEA); + for (TopTools_ListOfShape::Iterator itLEA (aLEA); itLEA.More(); itLEA.Next()) + { + const TopoDS_Shape& aFA = itLEA.Value(); + if (aMFence.Add (aFA)) + pLFA->Append (aFA); + } + } + } + } + + Handle(IntTools_Context) aCtx = new IntTools_Context(); + // Tangency criteria + Standard_Real aSinTol = Abs (Sin (myAngle)); + + // Make blocks of connected edges + TopTools_ListOfListOfShape aLCB; + TopTools_IndexedDataMapOfShapeListOfShape aMVEMap; + + BOPTools_AlgoTools::MakeConnexityBlocks (aCETangent, TopAbs_VERTEX, TopAbs_EDGE, aLCB, aMVEMap); + + // Analyze each block to find co-planar edges + for (TopTools_ListOfListOfShape::Iterator itLCB (aLCB); itLCB.More(); itLCB.Next()) + { + const TopTools_ListOfShape& aCB = itLCB.Value(); + + TopTools_MapOfShape aMFence; + for (TopTools_ListOfShape::Iterator itCB1 (aCB); itCB1.More(); itCB1.Next()) + { + const TopoDS_Edge& aE1 = TopoDS::Edge (itCB1.Value()); + if (!aMFence.Add (aE1)) + continue; + + TopoDS_Compound aBlock; + BRep_Builder().MakeCompound (aBlock); + BRep_Builder().Add (aBlock, aE1.Oriented (TopAbs_FORWARD)); + + Standard_Real anOffset = anEdgeOffsetMap.Find (aE1); + const TopTools_ListOfShape& aLF1 = Ancestors (aE1); + + gp_Dir aDN1; + BOPTools_AlgoTools3D::GetNormalToFaceOnEdge (aE1, TopoDS::Face (aLF1.First()), aDN1); + + TopTools_ListOfShape::Iterator itCB2 = itCB1; + for (itCB2.Next(); itCB2.More(); itCB2.Next()) + { + const TopoDS_Edge& aE2 = TopoDS::Edge (itCB2.Value()); + if (aMFence.Contains (aE2)) + continue; + + const TopTools_ListOfShape& aLF2 = Ancestors (aE2); + + gp_Dir aDN2; + BOPTools_AlgoTools3D::GetNormalToFaceOnEdge (aE2, TopoDS::Face (aLF2.First()), aDN2); + + if (aDN1.XYZ().Crossed (aDN2.XYZ()).Modulus() < aSinTol) + { + BRep_Builder().Add (aBlock, aE2.Oriented (TopAbs_FORWARD)); + aMFence.Add (aE2); + anOffset = Max (anOffset, anEdgeOffsetMap.Find (aE2)); + } + } + + // Make the prism + BRepPrimAPI_MakePrism aMP (aBlock, gp_Vec (aDN1.XYZ()) * anOffset); + if (!aMP.IsDone()) + continue; + + TopTools_IndexedDataMapOfShapeListOfShape aPrismAncestors; + TopExp::MapShapesAndAncestors (aMP.Shape(), TopAbs_EDGE, TopAbs_FACE, aPrismAncestors); + TopExp::MapShapesAndAncestors (aMP.Shape(), TopAbs_VERTEX, TopAbs_EDGE, aPrismAncestors); + + for (TopoDS_Iterator itE (aBlock); itE.More(); itE.Next()) + { + const TopoDS_Edge& aE = TopoDS::Edge (itE.Value()); + const TopTools_ListOfShape& aLG = aMP.Generated (aE); + TopoDS_Face aFNew = TopoDS::Face (aLG.First()); + + TopTools_ListOfShape& aLA = myAncestors.ChangeFromKey (aE); + + TopoDS_Shape aF1 = aLA.First(); + TopoDS_Shape aF2 = aLA.Last(); + + const Standard_Real *pOffsetVal1 = myFaceOffsetMap.Seek (aF1); + const Standard_Real *pOffsetVal2 = myFaceOffsetMap.Seek (aF2); + const Standard_Real anOffsetVal1 = pOffsetVal1 ? Abs (*pOffsetVal1) : myOffset; + const Standard_Real anOffsetVal2 = pOffsetVal2 ? Abs (*pOffsetVal2) : myOffset; + + const TopoDS_Shape& aFToRemove = anOffsetVal1 > anOffsetVal2 ? aF1 : aF2; + const TopoDS_Shape& aFOpposite = anOffsetVal1 > anOffsetVal2 ? aF2 : aF1; + + // Orient the face so its normal is directed to smaller offset face + { + // get normal of the new face + gp_Dir aDN; + BOPTools_AlgoTools3D::GetNormalToFaceOnEdge (aE, aFNew, aDN); + + // get bi-normal for the aFOpposite + TopoDS_Edge aEInF; + for (TopExp_Explorer aExpE (aFOpposite, TopAbs_EDGE); aExpE.More(); aExpE.Next()) + { + if (aE.IsSame (aExpE.Current())) + { + aEInF = TopoDS::Edge (aExpE.Current()); + break; + } + } + + gp_Pnt2d aP2d; + gp_Pnt aPInF; + Standard_Real f, l; + const Handle(Geom_Curve)& aC3D = BRep_Tool::Curve (aEInF, f, l); + gp_Pnt aPOnE = aC3D->Value ((f + l) / 2.); + BOPTools_AlgoTools3D::PointNearEdge (aEInF, TopoDS::Face (aFOpposite), (f + l) / 2., 1.e-5, aP2d, aPInF); + + gp_Vec aBN (aPOnE, aPInF); + + if (aBN.Dot (aDN) < 0) + aFNew.Reverse(); + } + + // Remove the face with bigger offset value from edge ancestors + for (TopTools_ListOfShape::Iterator itA (aLA); itA.More();itA.Next()) + { + if (itA.Value().IsSame (aFToRemove)) + { + aLA.Remove (itA); + break; + } + } + aLA.Append (aFNew); + + myMapEdgeType (aE).Clear(); + // Analyze edge again + EdgeAnalyse (aE, TopoDS::Face (aFOpposite), aFNew, aSinTol, myMapEdgeType (aE)); + + // Analyze vertices + TopTools_MapOfShape aFNewEdgeMap; + aFNewEdgeMap.Add (aE); + for (TopoDS_Iterator itV (aE); itV.More(); itV.Next()) + { + const TopoDS_Shape& aV = itV.Value(); + // Add Side edge to map of Ancestors with the correct orientation + TopoDS_Edge aEG = TopoDS::Edge (aMP.Generated (aV).First()); + myGenerated.Bind (aV, aEG); + { + for (TopExp_Explorer anExpEg (aFNew, TopAbs_EDGE); anExpEg.More(); anExpEg.Next()) + { + if (anExpEg.Current().IsSame (aEG)) + { + aEG = TopoDS::Edge (anExpEg.Current()); + break; + } + } + } + + if (aDMVEMin.IsBound (aV)) + { + const TopTools_ListOfShape* pSA = aDMVFAnc.Seek (aV); + if (pSA && pSA->Extent() == 1) + { + // Adjust orientation of generated edge to its new ancestor + TopoDS_Edge aEMin = TopoDS::Edge (aDMVEMin.Find (aV)); + for (TopExp_Explorer expEx (pSA->First(), TopAbs_EDGE); expEx.More(); expEx.Next()) + { + if (expEx.Current().IsSame (aEMin)) + { + aEMin = TopoDS::Edge (expEx.Current()); + break; + } + } + + TopAbs_Orientation anOriInEMin (TopAbs_FORWARD), anOriInEG (TopAbs_FORWARD); + + for (TopoDS_Iterator itx (aEMin); itx.More(); itx.Next()) + { + if (itx.Value().IsSame (aV)) + { + anOriInEMin = itx.Value().Orientation(); + break; + } + } + + for (TopoDS_Iterator itx (aEG); itx.More(); itx.Next()) + { + if (itx.Value().IsSame (aV)) + { + anOriInEG = itx.Value().Orientation(); + break; + } + } + + if (anOriInEG == anOriInEMin) + aEG.Reverse(); + } + } + + TopTools_ListOfShape& aLVA = myAncestors.ChangeFromKey (aV); + if (!aLVA.Contains (aEG)) + aLVA.Append (aEG); + aFNewEdgeMap.Add (aEG); + + TopTools_ListOfShape& aLEGA = + myAncestors (myAncestors.Add (aEG, aPrismAncestors.FindFromKey (aEG))); + { + // Add ancestors from the shape + const TopTools_ListOfShape* pSA = aDMVFAnc.Seek (aV); + if (pSA && !pSA->IsEmpty()) + { + TopTools_ListOfShape aLSA = *pSA; + aLEGA.Append (aLSA); + } + } + + myMapEdgeType.Bind (aEG, BRepOffset_ListOfInterval()); + if (aLEGA.Extent() == 2) + { + EdgeAnalyse (aEG, TopoDS::Face (aLEGA.First()), TopoDS::Face (aLEGA.Last()), + aSinTol, myMapEdgeType (aEG)); + } + } + + // Find an edge opposite to tangential one and add ancestors for it + TopoDS_Edge aEOpposite; + for (TopExp_Explorer anExpE (aFNew, TopAbs_EDGE); anExpE.More(); anExpE.Next()) + { + if (!aFNewEdgeMap.Contains (anExpE.Current())) + { + aEOpposite = TopoDS::Edge (anExpE.Current()); + break; + } + } + + { + // Find it in aFOpposite + for (TopExp_Explorer anExpE (aFToRemove, TopAbs_EDGE); anExpE.More(); anExpE.Next()) + { + const TopoDS_Shape& aEInFToRem = anExpE.Current(); + if (aE.IsSame (aEInFToRem)) + { + if (BOPTools_AlgoTools::IsSplitToReverse (aEOpposite, aEInFToRem, aCtx)) + aEOpposite.Reverse(); + break; + } + } + } + + TopTools_ListOfShape aLFOpposite; + aLFOpposite.Append (aFNew); + aLFOpposite.Append (aFToRemove); + myAncestors.Add (aEOpposite, aLFOpposite); + myMapEdgeType.Bind (aEOpposite, BRepOffset_ListOfInterval()); + EdgeAnalyse (aEOpposite, aFNew, TopoDS::Face (aFToRemove), aSinTol, myMapEdgeType (aEOpposite)); + + TopTools_DataMapOfShapeShape* pEEMap = myReplacement.ChangeSeek (aFToRemove); + if (!pEEMap) + pEEMap = myReplacement.Bound (aFToRemove, TopTools_DataMapOfShapeShape()); + pEEMap->Bind (aE, aEOpposite); + + // Add ancestors for the vertices + for (TopoDS_Iterator itV (aEOpposite); itV.More(); itV.Next()) + { + const TopoDS_Shape& aV = itV.Value(); + const TopTools_ListOfShape& aLVA = aPrismAncestors.FindFromKey (aV); + myAncestors.Add (aV, aLVA); + } + + myNewFaces.Append (aFNew); + myGenerated.Bind (aE, aFNew); + } + } + } } +//======================================================================= +//function : EdgeReplacement +//purpose : +//======================================================================= +const TopoDS_Edge& BRepOffset_Analyse::EdgeReplacement (const TopoDS_Face& theF, + const TopoDS_Edge& theE) const +{ + const TopTools_DataMapOfShapeShape* pEE = myReplacement.Seek (theF); + if (!pEE) + return theE; + const TopoDS_Shape* pE = pEE->Seek (theE); + if (!pE) + return theE; + return TopoDS::Edge (*pE); +} +//======================================================================= +//function : Generated +//purpose : +//======================================================================= +TopoDS_Shape BRepOffset_Analyse::Generated (const TopoDS_Shape& theS) const +{ + static TopoDS_Shape aNullShape; + const TopoDS_Shape* pGenS = myGenerated.Seek (theS); + return pGenS ? *pGenS : aNullShape; +} //======================================================================= -//function : BRepOffset_ListOfInterval& +//function : Descendants //purpose : //======================================================================= +const TopTools_ListOfShape* BRepOffset_Analyse::Descendants (const TopoDS_Shape& theS, + const Standard_Boolean theUpdate) const +{ + if (myDescendants.IsEmpty() || theUpdate) + { + myDescendants.Clear(); + const Standard_Integer aNbA = myAncestors.Extent(); + for (Standard_Integer i = 1; i <= aNbA; ++i) + { + const TopoDS_Shape& aSS = myAncestors.FindKey (i); + const TopTools_ListOfShape& aLA = myAncestors (i); + + for (TopTools_ListOfShape::Iterator it (aLA); it.More(); it.Next()) + { + const TopoDS_Shape& aSA = it.Value(); + + TopTools_ListOfShape* pLD = myDescendants.ChangeSeek (aSA); + if (!pLD) + pLD = myDescendants.Bound (aSA, TopTools_ListOfShape()); + if (!pLD->Contains (aSS)) + pLD->Append (aSS); + } + } + } -const BRepOffset_ListOfInterval& BRepOffset_Analyse::Type(const TopoDS_Edge& E) -const + return myDescendants.Seek (theS); +} + +//======================================================================= +//function : Clear +//purpose : +//======================================================================= +void BRepOffset_Analyse::Clear() { - return mapEdgeType (E); + myDone = Standard_False; + myShape .Nullify(); + myMapEdgeType.Clear(); + myAncestors .Clear(); + myFaceOffsetMap.Clear(); + myReplacement.Clear(); + myDescendants.Clear(); + myNewFaces .Clear(); + myGenerated.Clear(); } +//======================================================================= +//function : BRepOffset_ListOfInterval& +//purpose : +//======================================================================= +const BRepOffset_ListOfInterval& BRepOffset_Analyse::Type(const TopoDS_Edge& E) const +{ + return myMapEdgeType (E); +} //======================================================================= //function : Edges //purpose : //======================================================================= - void BRepOffset_Analyse::Edges(const TopoDS_Vertex& V, - const BRepOffset_Type T, - TopTools_ListOfShape& LE) -const + const ChFiDS_TypeOfConcavity T, + TopTools_ListOfShape& LE) const { LE.Clear(); const TopTools_ListOfShape& L = Ancestors (V); @@ -243,15 +668,19 @@ for ( ;it.More(); it.Next()) { const TopoDS_Edge& E = TopoDS::Edge(it.Value()); - TopoDS_Vertex V1,V2; - BRepOffset_Tool::EdgeVertices (E,V1,V2); - if (V1.IsSame(V)) { - if (mapEdgeType(E).Last().Type() == T) - LE.Append(E); - } - if (V2.IsSame(V)) { - if (mapEdgeType(E).First().Type() == T) - LE.Append(E); + const BRepOffset_ListOfInterval *pIntervals = myMapEdgeType.Seek (E); + if (pIntervals && pIntervals->Extent() > 0) + { + TopoDS_Vertex V1,V2; + BRepOffset_Tool::EdgeVertices (E,V1,V2); + if (V1.IsSame(V)) { + if (pIntervals->Last().Type() == T) + LE.Append (E); + } + if (V2.IsSame(V)) { + if (pIntervals->First().Type() == T) + LE.Append (E); + } } } } @@ -261,15 +690,13 @@ //function : Edges //purpose : //======================================================================= - void BRepOffset_Analyse::Edges(const TopoDS_Face& F, - const BRepOffset_Type T, - TopTools_ListOfShape& LE) -const + const ChFiDS_TypeOfConcavity T, + TopTools_ListOfShape& LE) const { LE.Clear(); TopExp_Explorer exp(F, TopAbs_EDGE); - + for ( ;exp.More(); exp.Next()) { const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); @@ -285,14 +712,12 @@ //function : TangentEdges //purpose : //======================================================================= - void BRepOffset_Analyse::TangentEdges(const TopoDS_Edge& Edge , const TopoDS_Vertex& Vertex, TopTools_ListOfShape& Edges ) const { gp_Vec V,VRef; - Standard_Real U,URef; BRepAdaptor_Curve C3d, C3dRef; @@ -314,49 +739,23 @@ V = C3d.DN(U,1); CorrectOrientationOfTangent(V, Vertex, CurE); if (V.SquareMagnitude() < gp::Resolution()) continue; - if (V.IsOpposite(VRef,angle)) { + if (V.IsOpposite(VRef,myAngle)) { Edges.Append(CurE); } } } - - -//======================================================================= -//function : HasAncestor -//purpose : -//======================================================================= - -Standard_Boolean BRepOffset_Analyse::HasAncestor (const TopoDS_Shape& S) const -{ - return ancestors.Contains(S); -} - - -//======================================================================= -//function : Ancestors -//purpose : -//======================================================================= - -const TopTools_ListOfShape& BRepOffset_Analyse::Ancestors -(const TopoDS_Shape& S) const -{ - return ancestors.FindFromKey(S); -} - - //======================================================================= //function : Explode //purpose : //======================================================================= - -void BRepOffset_Analyse::Explode( TopTools_ListOfShape& List, - const BRepOffset_Type T ) const +void BRepOffset_Analyse::Explode (TopTools_ListOfShape& List, + const ChFiDS_TypeOfConcavity T) const { List.Clear(); BRep_Builder B; TopTools_MapOfShape Map; - + TopExp_Explorer Fexp; for (Fexp.Init(myShape,TopAbs_FACE); Fexp.More(); Fexp.Next()) { if ( Map.Add(Fexp.Current())) { @@ -376,10 +775,9 @@ //function : Explode //purpose : //======================================================================= - -void BRepOffset_Analyse::Explode( TopTools_ListOfShape& List, - const BRepOffset_Type T1, - const BRepOffset_Type T2) const +void BRepOffset_Analyse::Explode (TopTools_ListOfShape& List, + const ChFiDS_TypeOfConcavity T1, + const ChFiDS_TypeOfConcavity T2) const { List.Clear(); BRep_Builder B; @@ -400,199 +798,70 @@ } } - //======================================================================= //function : AddFaces //purpose : //======================================================================= - void BRepOffset_Analyse::AddFaces (const TopoDS_Face& Face, - TopoDS_Compound& Co, - TopTools_MapOfShape& Map, - const BRepOffset_Type T) const + TopoDS_Compound& Co, + TopTools_MapOfShape& Map, + const ChFiDS_TypeOfConcavity T) const { BRep_Builder B; - TopExp_Explorer exp(Face,TopAbs_EDGE); - for ( ; exp.More(); exp.Next()) { - const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); + const TopTools_ListOfShape *pLE = Descendants (Face); + if (!pLE) + return; + for (TopTools_ListOfShape::Iterator it (*pLE); it.More(); it.Next()) + { + const TopoDS_Edge& E = TopoDS::Edge (it.Value()); const BRepOffset_ListOfInterval& LI = Type(E); if (!LI.IsEmpty() && LI.First().Type() == T) { // so is attached to G1 by const TopTools_ListOfShape& L = Ancestors(E); if (L.Extent() == 2) { - TopoDS_Face F1 = TopoDS::Face(L.First()); - if ( F1.IsSame(Face)) - F1 = TopoDS::Face(L.Last ()); - if ( Map.Add(F1)) { - B.Add(Co,F1); - AddFaces(F1,Co,Map,T); - } + TopoDS_Face F1 = TopoDS::Face (L.First()); + if (F1.IsSame (Face)) + F1 = TopoDS::Face (L.Last()); + if (Map.Add (F1)) { + B.Add (Co, F1); + AddFaces (F1, Co, Map, T); + } } } } } + //======================================================================= //function : AddFaces //purpose : //======================================================================= - void BRepOffset_Analyse::AddFaces (const TopoDS_Face& Face, - TopoDS_Compound& Co, - TopTools_MapOfShape& Map, - const BRepOffset_Type T1, - const BRepOffset_Type T2) const + TopoDS_Compound& Co, + TopTools_MapOfShape& Map, + const ChFiDS_TypeOfConcavity T1, + const ChFiDS_TypeOfConcavity T2) const { BRep_Builder B; - TopExp_Explorer exp(Face,TopAbs_EDGE); - for ( ; exp.More(); exp.Next()) { - const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); + const TopTools_ListOfShape *pLE = Descendants (Face); + if (!pLE) + return; + for (TopTools_ListOfShape::Iterator it (*pLE); it.More(); it.Next()) + { + const TopoDS_Edge& E = TopoDS::Edge (it.Value()); const BRepOffset_ListOfInterval& LI = Type(E); if (!LI.IsEmpty() && - (LI.First().Type() == T1 || LI.First().Type() == T2)) { + (LI.First().Type() == T1 || LI.First().Type() == T2)) { // so is attached to G1 by const TopTools_ListOfShape& L = Ancestors(E); if (L.Extent() == 2) { - TopoDS_Face F1 = TopoDS::Face(L.First()); - if ( F1.IsSame(Face)) - F1 = TopoDS::Face(L.Last ()); - if ( Map.Add(F1)) { - B.Add(Co,F1); - AddFaces(F1,Co,Map,T1,T2); - } + TopoDS_Face F1 = TopoDS::Face (L.First()); + if (F1.IsSame (Face)) + F1 = TopoDS::Face (L.Last()); + if (Map.Add (F1)) { + B.Add (Co, F1); + AddFaces (F1, Co, Map, T1, T2); + } } } } } - -//======================================================================= -//function : Correct2dPoint -//purpose : -//======================================================================= -void Correct2dPoint(const TopoDS_Face& theF, gp_Pnt2d& theP2d) -{ - BRepAdaptor_Surface aBAS(theF, Standard_False); - if (aBAS.GetType() < GeomAbs_BezierSurface) { - return; - } - // - const Standard_Real coeff = 0.01; - Standard_Real eps; - Standard_Real u1, u2, v1, v2; - // - aBAS.Initialize(theF, Standard_True); - u1 = aBAS.FirstUParameter(); - u2 = aBAS.LastUParameter(); - v1 = aBAS.FirstVParameter(); - v2 = aBAS.LastVParameter(); - if (!(Precision::IsInfinite(u1) || Precision::IsInfinite(u2))) - { - eps = Max(coeff*(u2 - u1), Precision::PConfusion()); - if (Abs(theP2d.X() - u1) < eps) - { - theP2d.SetX(u1 + eps); - } - if (Abs(theP2d.X() - u2) < eps) - { - theP2d.SetX(u2 - eps); - } - } - if (!(Precision::IsInfinite(v1) || Precision::IsInfinite(v2))) - { - eps = Max(coeff*(v2 - v1), Precision::PConfusion()); - if (Abs(theP2d.Y() - v1) < eps) - { - theP2d.SetY(v1 + eps); - } - if (Abs(theP2d.Y() - v2) < eps) - { - theP2d.SetY(v2 - eps); - } - } -} - -//======================================================================= -//function : DefineConnectType -//purpose : -//======================================================================= -BRepOffset_Type DefineConnectType(const TopoDS_Edge& E, - const TopoDS_Face& F1, - const TopoDS_Face& F2, - const Standard_Real SinTol, - const Standard_Boolean CorrectPoint) -{ - TopLoc_Location L; - Standard_Real f,l; - - const Handle(Geom_Surface)& S1 = BRep_Tool::Surface(F1); - const Handle(Geom_Surface)& S2 = BRep_Tool::Surface(F2); - // - Handle (Geom2d_Curve) C1 = BRep_Tool::CurveOnSurface(E,F1,f,l); - Handle (Geom2d_Curve) C2 = BRep_Tool::CurveOnSurface(E,F2,f,l); - - BRepAdaptor_Curve C(E); - f = C.FirstParameter(); - l = C.LastParameter(); -// - Standard_Real ParOnC = 0.5*(f+l); - gp_Vec T1 = C.DN(ParOnC,1).Transformed(L.Transformation()); - if (T1.SquareMagnitude() > gp::Resolution()) { - T1.Normalize(); - } - - if (BRepOffset_Tool::OriEdgeInFace(E,F1) == TopAbs_REVERSED) { - T1.Reverse(); - } - if (F1.Orientation() == TopAbs_REVERSED) T1.Reverse(); - - gp_Pnt2d P = C1->Value(ParOnC); - gp_Pnt P3; - gp_Vec D1U,D1V; - - if(CorrectPoint) - Correct2dPoint(F1, P); - // - S1->D1(P.X(),P.Y(),P3,D1U,D1V); - gp_Vec DN1(D1U^D1V); - if (F1.Orientation() == TopAbs_REVERSED) DN1.Reverse(); - - P = C2->Value(ParOnC); - if(CorrectPoint) - Correct2dPoint(F2, P); - S2->D1(P.X(),P.Y(),P3,D1U,D1V); - gp_Vec DN2(D1U^D1V); - if (F2.Orientation() == TopAbs_REVERSED) DN2.Reverse(); - - DN1.Normalize(); - DN2.Normalize(); - - gp_Vec ProVec = DN1^DN2; - Standard_Real NormProVec = ProVec.Magnitude(); - - if (Abs(NormProVec) < SinTol) { - // plane - if (DN1.Dot(DN2) > 0) { - //Tangent - return BRepOffset_Tangent; - } - else { - //Mixed not finished! -#ifdef OCCT_DEBUG - std::cout <<" faces locally mixed"< gp::Resolution()) - ProVec.Normalize(); - Standard_Real Prod = T1.Dot(DN1^DN2); - if (Prod > 0.) { - // - return BRepOffset_Convex; - } - else { - //reenters - return BRepOffset_Concave; - } - } -} diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Analyse.hxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Analyse.hxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Analyse.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Analyse.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,10 @@ #include #include #include -#include +#include +#include +#include +#include #include #include class TopoDS_Shape; @@ -36,86 +39,164 @@ class TopoDS_Face; class TopoDS_Compound; - -//! Analyse of a shape consit to -//! Find the part of edges convex concave tangent. +//! Analyses the shape to find the parts of edges +//! connecting the convex, concave or tangent faces. class BRepOffset_Analyse { public: - DEFINE_STANDARD_ALLOC - +public: //! @name Constructors + + //! Empty c-tor Standard_EXPORT BRepOffset_Analyse(); - - Standard_EXPORT BRepOffset_Analyse(const TopoDS_Shape& S, const Standard_Real Angle); - - Standard_EXPORT void Perform (const TopoDS_Shape& S, const Standard_Real Angle); - - Standard_EXPORT Standard_Boolean IsDone() const; - - Standard_EXPORT void Clear(); - - Standard_EXPORT const BRepOffset_ListOfInterval& Type (const TopoDS_Edge& E) const; - + + //! C-tor performing the job inside + Standard_EXPORT BRepOffset_Analyse (const TopoDS_Shape& theS, + const Standard_Real theAngle); + +public: //! @name Performing analysis + + //! Performs the analysis + Standard_EXPORT void Perform (const TopoDS_Shape& theS, + const Standard_Real theAngle); + +public: //! @name Results + + //! Returns status of the algorithm + Standard_Boolean IsDone() const + { + return myDone; + } + + //! Returns the connectivity type of the edge + Standard_EXPORT const BRepOffset_ListOfInterval& Type (const TopoDS_Edge& theE) const; + //! Stores in all the edges of Type //! on the vertex . - Standard_EXPORT void Edges (const TopoDS_Vertex& V, const BRepOffset_Type T, TopTools_ListOfShape& L) const; + Standard_EXPORT void Edges (const TopoDS_Vertex& theV, + const ChFiDS_TypeOfConcavity theType, + TopTools_ListOfShape& theL) const; //! Stores in all the edges of Type //! on the face . - Standard_EXPORT void Edges (const TopoDS_Face& F, const BRepOffset_Type T, TopTools_ListOfShape& L) const; + Standard_EXPORT void Edges (const TopoDS_Face& theF, + const ChFiDS_TypeOfConcavity theType, + TopTools_ListOfShape& theL) const; //! set in all the Edges of which are //! tangent to at the vertex . - Standard_EXPORT void TangentEdges (const TopoDS_Edge& Edge, const TopoDS_Vertex& Vertex, TopTools_ListOfShape& Edges) const; - - Standard_EXPORT Standard_Boolean HasAncestor (const TopoDS_Shape& S) const; - - Standard_EXPORT const TopTools_ListOfShape& Ancestors (const TopoDS_Shape& S) const; + Standard_EXPORT void TangentEdges (const TopoDS_Edge& theEdge, + const TopoDS_Vertex& theVertex, + TopTools_ListOfShape& theEdges) const; + + //! Checks if the given shape has ancestors + Standard_Boolean HasAncestor (const TopoDS_Shape& theS) const + { + return myAncestors.Contains (theS); + } + + //! Returns ancestors for the shape + const TopTools_ListOfShape& Ancestors (const TopoDS_Shape& theS) const + { + return myAncestors.FindFromKey (theS); + } //! Explode in compounds of faces where //! all the connex edges are of type - Standard_EXPORT void Explode (TopTools_ListOfShape& L, const BRepOffset_Type Type) const; + Standard_EXPORT void Explode (TopTools_ListOfShape& theL, + const ChFiDS_TypeOfConcavity theType) const; //! Explode in compounds of faces where //! all the connex edges are of type or - Standard_EXPORT void Explode (TopTools_ListOfShape& L, const BRepOffset_Type Type1, const BRepOffset_Type Type2) const; + Standard_EXPORT void Explode (TopTools_ListOfShape& theL, + const ChFiDS_TypeOfConcavity theType1, + const ChFiDS_TypeOfConcavity theType2) const; //! Add in the faces of the shell containing //! where all the connex edges are of type . - Standard_EXPORT void AddFaces (const TopoDS_Face& Face, TopoDS_Compound& Co, TopTools_MapOfShape& Map, const BRepOffset_Type Type) const; + Standard_EXPORT void AddFaces (const TopoDS_Face& theFace, + TopoDS_Compound& theCo, + TopTools_MapOfShape& theMap, + const ChFiDS_TypeOfConcavity theType) const; //! Add in the faces of the shell containing //! where all the connex edges are of type or . - Standard_EXPORT void AddFaces (const TopoDS_Face& Face, TopoDS_Compound& Co, TopTools_MapOfShape& Map, const BRepOffset_Type Type1, const BRepOffset_Type Type2) const; - + Standard_EXPORT void AddFaces (const TopoDS_Face& theFace, + TopoDS_Compound& theCo, + TopTools_MapOfShape& theMap, + const ChFiDS_TypeOfConcavity theType1, + const ChFiDS_TypeOfConcavity theType2) const; + + void SetOffsetValue (const Standard_Real theOffset) + { + myOffset = theOffset; + } + + //! Sets the face-offset data map to analyze tangential cases + void SetFaceOffsetMap (const TopTools_DataMapOfShapeReal& theMap) + { + myFaceOffsetMap = theMap; + } + + //! Returns the new faces constructed between tangent faces + //! having different offset values on the shape + const TopTools_ListOfShape& NewFaces() const { return myNewFaces; } + + //! Returns the new face constructed for the edge connecting + //! the two tangent faces having different offset values + Standard_EXPORT TopoDS_Shape Generated (const TopoDS_Shape& theS) const; + + //! Checks if the edge has generated a new face. + Standard_Boolean HasGenerated (const TopoDS_Shape& theS) const + { + return myGenerated.Seek (theS) != NULL; + } + + //! Returns the replacement of the edge in the face. + //! If no replacement exists, returns the edge + Standard_EXPORT const TopoDS_Edge& EdgeReplacement (const TopoDS_Face& theFace, + const TopoDS_Edge& theEdge) const; + + //! Returns the shape descendants. + Standard_EXPORT const TopTools_ListOfShape* Descendants (const TopoDS_Shape& theS, + const Standard_Boolean theUpdate = Standard_False) const; +public: //! @name Clearing the content + //! Clears the content of the algorithm + Standard_EXPORT void Clear(); -protected: - - - - - -private: - - - - Standard_Boolean myDone; - TopoDS_Shape myShape; - BRepOffset_DataMapOfShapeListOfInterval mapEdgeType; - TopTools_IndexedDataMapOfShapeListOfShape ancestors; - Standard_Real angle; - +private: //! @name Treatment of tangential cases + //! Treatment of the tangential cases. + //! @param theEdges List of edges connecting tangent faces + Standard_EXPORT void TreatTangentFaces (const TopTools_ListOfShape& theEdges); + +private: //! @name Fields + + // Inputs + TopoDS_Shape myShape; //!< Input shape to analyze + Standard_Real myAngle; //!< Criteria angle to check tangency + + Standard_Real myOffset; //!< Offset value + TopTools_DataMapOfShapeReal myFaceOffsetMap; //!< Map to store offset values for the faces. + //! Should be set by the calling algorithm. + + // Results + Standard_Boolean myDone; //!< Status of the algorithm + + BRepOffset_DataMapOfShapeListOfInterval myMapEdgeType; //!< Map containing the list of intervals on the edge + TopTools_IndexedDataMapOfShapeListOfShape myAncestors; //!< Ancestors map + NCollection_DataMap myReplacement; //!< Replacement of an edge in the face + mutable TopTools_DataMapOfShapeListOfShape myDescendants; //!< Map of shapes descendants built on the base of + //!< Ancestors map. Filled on the first query. + + TopTools_ListOfShape myNewFaces; //!< New faces generated to close the gaps between adjacent + //! tangential faces having different offset values + TopTools_DataMapOfShapeShape myGenerated; //!< Binding between edge and face generated from the edge }; - - - - - - #endif // _BRepOffset_Analyse_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Error.hxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Error.hxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Error.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Error.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,12 +20,15 @@ enum BRepOffset_Error { -BRepOffset_NoError, -BRepOffset_UnknownError, -BRepOffset_BadNormalsOnGeometry, -BRepOffset_C0Geometry, -BRepOffset_NullOffset, -BRepOffset_NotConnectedShell + BRepOffset_NoError, + BRepOffset_UnknownError, + BRepOffset_BadNormalsOnGeometry, + BRepOffset_C0Geometry, + BRepOffset_NullOffset, + BRepOffset_NotConnectedShell, + BRepOffset_CannotTrimEdges, //!< exception while trim edges + BRepOffset_CannotFuseVertices, //!< exception while fuse vertices + BRepOffset_CannotExtentEdge //!< exception while extent edges }; #endif // _BRepOffset_Error_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Inter2d.cxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Inter2d.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Inter2d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Inter2d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,8 +32,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -77,6 +79,7 @@ #include #include #include +#include #include #ifdef DRAW @@ -112,27 +115,153 @@ return V; } -static Standard_Boolean IsOrientationChanged(TopTools_IndexedMapOfShape& theMap, - const TopoDS_Edge& theEdge) +static Standard_Integer DefineClosedness(const TopoDS_Face& theFace) { - Standard_Boolean IsOrChanged = Standard_False; - - if (!theMap.Contains(theEdge)) - theMap.Add(theEdge); - else + TopExp_Explorer anExplo (theFace, TopAbs_EDGE); + for (; anExplo.More(); anExplo.Next()) { - Standard_Integer anInd = theMap.FindIndex(theEdge); - const TopoDS_Shape& anEdge = theMap(anInd); - if (theEdge.Orientation() != anEdge.Orientation()) + const TopoDS_Edge& anEdge = TopoDS::Edge (anExplo.Current()); + if (BRepTools::IsReallyClosed(anEdge, theFace)) { - theMap.Substitute( anInd, theEdge ); - IsOrChanged = Standard_True; + Standard_Real fpar, lpar; + Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(anEdge, theFace, fpar, lpar); + gp_Vec2d aTangent = aPCurve->DN(fpar, 1); + Standard_Real aCrossProd1 = aTangent ^ gp::DX2d(); + Standard_Real aCrossProd2 = aTangent ^ gp::DY2d(); + if (Abs(aCrossProd2) < Abs(aCrossProd1)) //pcurve is parallel to OY + return 1; + else + return 2; } } - return IsOrChanged; + return 0; } +static void GetEdgesOrientedInFace(const TopoDS_Shape& theShape, + const TopoDS_Face& theFace, + const Handle(BRepAlgo_AsDes)& theAsDes, + TopTools_SequenceOfShape& theSeqEdges) +{ + const TopTools_ListOfShape& aEdges = theAsDes->Descendant (theFace); + + TopExp_Explorer anExplo (theShape, TopAbs_EDGE); + for (; anExplo.More(); anExplo.Next()) + { + const TopoDS_Shape& anEdge = anExplo.Current(); + TopTools_ListIteratorOfListOfShape itl (aEdges); + for (; itl.More(); itl.Next()) + { + const TopoDS_Shape& anEdgeInFace = itl.Value(); + if (anEdgeInFace.IsSame(anEdge)) + { + theSeqEdges.Append (anEdgeInFace); + break; + } + } + } + + if (theSeqEdges.Length() == 1) + return; + + TopTools_IndexedDataMapOfShapeListOfShape aVEmap; + for (Standard_Integer ii = 1; ii <= theSeqEdges.Length(); ii++) + TopExp::MapShapesAndAncestors (theSeqEdges(ii), TopAbs_VERTEX, TopAbs_EDGE, aVEmap); + + TopoDS_Vertex aFirstVertex; + TopoDS_Edge aFirstEdge; + for (Standard_Integer ii = 1; ii <= aVEmap.Extent(); ii++) + { + const TopoDS_Vertex& aVertex = TopoDS::Vertex (aVEmap.FindKey(ii)); + const TopTools_ListOfShape& aElist = aVEmap(ii); + if (aElist.Extent() == 1) + { + const TopoDS_Edge& anEdge = TopoDS::Edge(aElist.First()); + TopoDS_Vertex aV1, aV2; + TopExp::Vertices(anEdge, aV1, aV2, Standard_True); //with orientation + if (aV1.IsSame(aVertex)) + { + aFirstVertex = aVertex; + aFirstEdge = anEdge; + break; + } + } + } + + if (aFirstEdge.IsNull()) //closed set of edges + { + //Standard_Real aPeriod = 0.; + Standard_Integer IndCoord = DefineClosedness (theFace); + /* + BRepAdaptor_Surface aBAsurf (theFace, Standard_False); + if (IndCoord == 1) + aPeriod = aBAsurf.LastUParameter() - aBAsurf.FirstUParameter(); + else if (IndCoord == 2) + aPeriod = aBAsurf.LastVParameter() - aBAsurf.FirstVParameter(); + */ + + if (IndCoord != 0) + { + Standard_Real aMaxDelta = 0.; + for (Standard_Integer ii = 1; ii <= aVEmap.Extent(); ii++) + { + const TopoDS_Vertex& aVertex = TopoDS::Vertex (aVEmap.FindKey(ii)); + const TopTools_ListOfShape& aElist = aVEmap(ii); + const TopoDS_Edge& anEdge1 = TopoDS::Edge(aElist.First()); + const TopoDS_Edge& anEdge2 = TopoDS::Edge(aElist.Last()); + Standard_Real aParam1 = BRep_Tool::Parameter(aVertex, anEdge1); + Standard_Real aParam2 = BRep_Tool::Parameter(aVertex, anEdge2); + BRepAdaptor_Curve2d aBAcurve1 (anEdge1, theFace); + BRepAdaptor_Curve2d aBAcurve2 (anEdge2, theFace); + gp_Pnt2d aPnt1 = aBAcurve1.Value(aParam1); + gp_Pnt2d aPnt2 = aBAcurve2.Value(aParam2); + Standard_Real aDelta = Abs(aPnt1.Coord(IndCoord) - aPnt2.Coord(IndCoord)); + if (aDelta > aMaxDelta) + { + aMaxDelta = aDelta; + aFirstVertex = aVertex; + } + } + const TopTools_ListOfShape& aElist = aVEmap.FindFromKey(aFirstVertex); + TopTools_ListIteratorOfListOfShape itl (aElist); + for (; itl.More(); itl.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge(itl.Value()); + TopoDS_Vertex aV1, aV2; + TopExp::Vertices(anEdge, aV1, aV2, Standard_True); //with orientation + if (aV1.IsSame(aFirstVertex)) + { + aFirstEdge = anEdge; + break; + } + } + } + } + + Standard_Integer aNbEdges = theSeqEdges.Length(); + theSeqEdges.Clear(); + theSeqEdges.Append (aFirstEdge); + TopoDS_Edge anEdge = aFirstEdge; + for (;;) + { + TopoDS_Vertex aLastVertex = TopExp::LastVertex (anEdge, Standard_True); //with orientation + if (aLastVertex.IsSame(aFirstVertex)) + break; + + const TopTools_ListOfShape& aElist = aVEmap.FindFromKey(aLastVertex); + if (aElist.Extent() == 1) + break; + + if (aElist.First().IsSame(anEdge)) + anEdge = TopoDS::Edge(aElist.Last()); + else + anEdge = TopoDS::Edge(aElist.First()); + + theSeqEdges.Append (anEdge); + if (theSeqEdges.Length() == aNbEdges) + break; + } +} //======================================================================= //function : Store @@ -504,7 +633,7 @@ // Vertex storage in DS. //--------------------------------- Standard_Real TolStore = BRep_Tool::Tolerance(E1) + BRep_Tool::Tolerance(E2); - TolStore = Max(TolStore, 10.*Tol); + TolStore = Max (TolStore, Tol); Store (E1,E2,LV1,LV2,TolStore,AsDes, aDMVV); } } @@ -517,10 +646,13 @@ const BRepAdaptor_Surface& BAsurf, const TopoDS_Edge& E1, const TopoDS_Edge& E2, + const TopAbs_Orientation theOr1, + const TopAbs_Orientation theOr2, const Handle(BRepAlgo_AsDes)& AsDes, Standard_Real Tol, Standard_Boolean WithOri, - gp_Pnt& Pref, + const TopoDS_Vertex& theVref, + BRepAlgo_Image& theImageVV, TopTools_IndexedDataMapOfShapeListOfShape& aDMVV, Standard_Boolean& theCoincide) { @@ -566,125 +698,142 @@ Standard_Boolean WithDegen = BRep_Tool::Degenerated(E1) || BRep_Tool::Degenerated(E2); if (WithDegen) + { + Standard_Integer ideg = (BRep_Tool::Degenerated(E1))? 1 : 2; + TopoDS_Iterator iter( EI[ideg] ); + if (iter.More()) { - Standard_Integer ideg = (BRep_Tool::Degenerated(E1))? 1 : 2; - TopoDS_Iterator iter( EI[ideg] ); - if (iter.More()) - { - const TopoDS_Vertex& vdeg = TopoDS::Vertex(iter.Value()); - DegPoint = BRep_Tool::Pnt(vdeg); - } - else - { - BRepAdaptor_Curve CEdeg( EI[ideg], F ); - DegPoint = CEdeg.Value( CEdeg.FirstParameter() ); - } + const TopoDS_Vertex& vdeg = TopoDS::Vertex(iter.Value()); + DegPoint = BRep_Tool::Pnt(vdeg); } + else + { + BRepAdaptor_Curve CEdeg( EI[ideg], F ); + DegPoint = CEdeg.Value( CEdeg.FirstParameter() ); + } + } // Handle(Geom2d_Curve) pcurve1 = BRep_Tool::CurveOnSurface(E1, F, f[1], l[1]); Handle(Geom2d_Curve) pcurve2 = BRep_Tool::CurveOnSurface(E2, F, f[2], l[2]); Geom2dAdaptor_Curve GAC1(pcurve1, f[1], l[1]); Geom2dAdaptor_Curve GAC2(pcurve2, f[2], l[2]); + if ((GAC1.GetType() == GeomAbs_Line) && + (GAC2.GetType() == GeomAbs_Line)) + { + // Just quickly check if lines coincide + if (GAC1.Line().Direction().IsParallel (GAC2.Line().Direction(), 1.e-8)) + { + theCoincide = Standard_True; + return; + } + } + Geom2dInt_GInter Inter2d( GAC1, GAC2, TolDub, TolDub ); // if (!Inter2d.IsDone() || !Inter2d.NbPoints()) { theCoincide = (Inter2d.NbSegments() && - (GAC1.GetType() == GeomAbs_Line) && - (GAC2.GetType() == GeomAbs_Line)); + (GAC1.GetType() == GeomAbs_Line) && + (GAC2.GetType() == GeomAbs_Line)); return; } // for (i = 1; i <= Inter2d.NbPoints(); i++) + { + gp_Pnt P3d; + if (WithDegen) + P3d = DegPoint; + else { - gp_Pnt P3d; - if (WithDegen) - P3d = DegPoint; - else - { - gp_Pnt2d P2d = Inter2d.Point(i).Value(); - P3d = BAsurf.Value( P2d.X(), P2d.Y() ); - } - ResPoints.Append( P3d ); - ResParamsOnE1.Append( Inter2d.Point(i).ParamOnFirst() ); - ResParamsOnE2.Append( Inter2d.Point(i).ParamOnSecond() ); + gp_Pnt2d P2d = Inter2d.Point(i).Value(); + P3d = BAsurf.Value( P2d.X(), P2d.Y() ); } + ResPoints.Append( P3d ); + ResParamsOnE1.Append( Inter2d.Point(i).ParamOnFirst() ); + ResParamsOnE2.Append( Inter2d.Point(i).ParamOnSecond() ); + } for (i = 1; i <= ResPoints.Length(); i++) + { + Standard_Real aT1 = ResParamsOnE1(i); //ponc1.Parameter(); + Standard_Real aT2 = ResParamsOnE2(i); //ponc2.Parameter(); + if (Precision::IsInfinite(aT1) || Precision::IsInfinite(aT2)) { - Standard_Real aT1 = ResParamsOnE1(i); //ponc1.Parameter(); - Standard_Real aT2 = ResParamsOnE2(i); //ponc2.Parameter(); - if (Precision::IsInfinite(aT1) || Precision::IsInfinite(aT2)) - { #ifdef OCCT_DEBUG - std::cout << "Inter2d : Solution rejected due to infinite parameter"< l[1]+Tol) - { - std::cout << "out of limit"< 1) { //std::cout << "IFV - RefEdgeInter: remove vertex" << std::endl; + gp_Pnt Pref = BRep_Tool::Pnt(theVref); Standard_Real dmin = RealLast(); TopoDS_Vertex Vmin; for (it1LV1.Initialize(LV1); it1LV1.More(); it1LV1.Next()) { @@ -782,10 +932,21 @@ } } } + + TopTools_ListIteratorOfListOfShape itl (LV1); + for (; itl.More(); itl.Next()) + { + TopoDS_Shape aNewVertex = itl.Value(); + aNewVertex.Orientation(TopAbs_FORWARD); + if (theImageVV.HasImage (theVref)) + theImageVV.Add (theVref.Oriented(TopAbs_FORWARD), aNewVertex); + else + theImageVV.Bind (theVref.Oriented(TopAbs_FORWARD), aNewVertex); + } ////----------------------------------------------------- Standard_Real TolStore = BRep_Tool::Tolerance(E1) + BRep_Tool::Tolerance(E2); - TolStore = Max(TolStore, 10.*Tol); + TolStore = Max (TolStore, Tol); Store (E1,E2,LV1,LV2,TolStore,AsDes, aDMVV); } } @@ -911,7 +1072,7 @@ // Modified by skv - Fri Dec 26 17:00:55 2003 OCC4455 Begin //static void ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE) -void BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const Standard_Real theOffset) +Standard_Boolean BRepOffset_Inter2d::ExtentEdge(const TopoDS_Edge& E,TopoDS_Edge& NE, const Standard_Real theOffset) { //BRepLib::BuildCurve3d(E); @@ -1249,13 +1410,19 @@ } } } - - Handle(Geom2d_Curve) ProjPCurve = - GeomProjLib::Curve2d( C3d, FirstParOnPC, LastParOnPC, theSurf ); - if (ProjPCurve.IsNull()) - ProjectionSuccess = Standard_False; + if (!C3d.IsNull() && FirstParOnPC < LastParOnPC) + { + Handle(Geom2d_Curve) ProjPCurve = + GeomProjLib::Curve2d(C3d, FirstParOnPC, LastParOnPC, theSurf); + if (ProjPCurve.IsNull()) + ProjectionSuccess = Standard_False; + else + CurveRep->PCurve(ProjPCurve); + } else - CurveRep->PCurve( ProjPCurve ); + { + return Standard_False; + } } } } @@ -1299,7 +1466,7 @@ aSegment = new Geom_TrimmedCurve(aLin, 0, aDelta); if (!aCompCurve.Add(aSegment, aTol)) - return; + return Standard_True; } if (LastPar < anEl + a2Offset) { @@ -1309,7 +1476,7 @@ aSegment = new Geom_TrimmedCurve(aLin, 0, aDelta); if (!aCompCurve.Add(aSegment, aTol)) - return; + return Standard_True; } C3d = aCompCurve.BSplineCurve(); @@ -1329,6 +1496,7 @@ BB.Range( NE, FirstPar, LastPar ); } + return Standard_True; } // Modified by skv - Fri Dec 26 17:00:57 2003 OCC4455 End @@ -1387,6 +1555,7 @@ const TopoDS_Face& F, const TopTools_IndexedMapOfShape& NewEdges, const Standard_Real Tol, + const TopTools_DataMapOfShapeListOfShape& theEdgeIntEdges, TopTools_IndexedDataMapOfShapeListOfShape& theDMVV) { #ifdef DRAW @@ -1422,12 +1591,41 @@ while (j < i && it2LE.More()) { const TopoDS_Edge& E2 = TopoDS::Edge(it2LE.Value()); + + Standard_Boolean ToIntersect = Standard_True; + if (theEdgeIntEdges.IsBound(E1)) + { + const TopTools_ListOfShape& aElist = theEdgeIntEdges(E1); + TopTools_ListIteratorOfListOfShape itedges (aElist); + for (; itedges.More(); itedges.Next()) + if (E2.IsSame (itedges.Value())) + ToIntersect = Standard_False; + + if (ToIntersect) + { + for (itedges.Initialize(aElist); itedges.More(); itedges.Next()) + { + const TopoDS_Shape& anEdge = itedges.Value(); + if (theEdgeIntEdges.IsBound(anEdge)) + { + const TopTools_ListOfShape& aElist2 = theEdgeIntEdges(anEdge); + TopTools_ListIteratorOfListOfShape itedges2 (aElist2); + for (; itedges2.More(); itedges2.Next()) + if (E2.IsSame (itedges2.Value())) + ToIntersect = Standard_False; + } + } + } + } + //-------------------------------------------------------------- // Intersections of New edges obtained by intersection // between them and with edges of restrictions //------------------------------------------------------ - if ( (!EdgesOfFace.Contains(E1) || !EdgesOfFace.Contains(E2)) && - (NewEdges.Contains(E1) || NewEdges.Contains(E2)) ) { + if (ToIntersect && + (!EdgesOfFace.Contains(E1) || !EdgesOfFace.Contains(E2)) && + (NewEdges.Contains(E1) || NewEdges.Contains(E2)) ) { + TopoDS_Shape aLocalShape = F.Oriented(TopAbs_FORWARD); EdgeInter(TopoDS::Face(aLocalShape),BAsurf,E1,E2,AsDes,Tol,Standard_True, theDMVV); // EdgeInter(TopoDS::Face(F.Oriented(TopAbs_FORWARD)),E1,E2,AsDes,Tol,Standard_True); @@ -1443,15 +1641,19 @@ //function : ConnexIntByInt //purpose : //======================================================================= -void BRepOffset_Inter2d::ConnexIntByInt +Standard_Boolean BRepOffset_Inter2d::ConnexIntByInt (const TopoDS_Face& FI, BRepOffset_Offset& OFI, TopTools_DataMapOfShapeShape& MES, const TopTools_DataMapOfShapeShape& Build, + const Handle(BRepAlgo_AsDes)& theAsDes, const Handle(BRepAlgo_AsDes)& AsDes2d, const Standard_Real Offset, const Standard_Real Tol, + const BRepOffset_Analyse& Analyse, TopTools_IndexedMapOfShape& FacesWithVerts, + BRepAlgo_Image& theImageVV, + TopTools_DataMapOfShapeListOfShape& theEdgeIntEdges, TopTools_IndexedDataMapOfShapeListOfShape& theDMVV) { @@ -1480,7 +1682,10 @@ TopoDS_Shape aLocalShape = OFI.Generated(EI); const TopoDS_Edge& OE = TopoDS::Edge(aLocalShape); if (!MES.IsBound(OE) && !Build.IsBound(EI)) { - ExtentEdge(OE,NE, Offset); + if (!ExtentEdge(OE, NE, Offset)) + { + return Standard_False; + } MES.Bind (OE,NE); } } @@ -1506,8 +1711,7 @@ continue; // Protection from case when explorer does not contain edges. CurE = FirstE = wexp.Current(); TopTools_IndexedMapOfShape Edges; - Standard_Boolean ToReverse1, ToReverse2; - ToReverse1 = IsOrientationChanged(Edges, CurE); + while (!end) { wexp.Next(); if (wexp.More()) { @@ -1518,10 +1722,10 @@ } if (CurE.IsSame(NextE)) continue; - ToReverse2 = IsOrientationChanged(Edges, NextE); - TopoDS_Vertex Vref = CommonVertex(CurE, NextE); - gp_Pnt Pref = BRep_Tool::Pnt(Vref); + + CurE = Analyse.EdgeReplacement (FI, CurE); + NextE = Analyse.EdgeReplacement (FI, NextE); TopoDS_Shape aLocalShape = OFI.Generated(CurE); TopoDS_Edge CEO = TopoDS::Edge(aLocalShape); @@ -1533,21 +1737,38 @@ TopTools_ListOfShape LV1,LV2; Standard_Boolean DoInter = 1; TopoDS_Shape NE1,NE2; + TopTools_SequenceOfShape NE1seq, NE2seq; + TopAbs_Orientation anOr1 = TopAbs_EXTERNAL, anOr2 = TopAbs_EXTERNAL; + Standard_Integer aChoice = 0; if (Build.IsBound(CurE) && Build.IsBound(NextE)) { + aChoice = 1; NE1 = Build(CurE ); NE2 = Build(NextE); + GetEdgesOrientedInFace (NE1, FIO, theAsDes, NE1seq); + GetEdgesOrientedInFace (NE2, FIO, theAsDes, NE2seq); + anOr1 = TopAbs_REVERSED; + anOr2 = TopAbs_FORWARD; } else if (Build.IsBound(CurE) && MES.IsBound(NEO)) { + aChoice = 2; NE1 = Build(CurE); NE2 = MES (NEO); + NE2.Orientation (NextE.Orientation()); + GetEdgesOrientedInFace (NE1, FIO, theAsDes, NE1seq); + NE2seq.Append (NE2); + anOr1 = TopAbs_REVERSED; + anOr2 = TopAbs_FORWARD; } else if (Build.IsBound(NextE) && MES.IsBound(CEO)) { + aChoice = 3; NE1 = Build(NextE); NE2 = MES(CEO); - Standard_Boolean Tmp = ToReverse1; - ToReverse1 = ToReverse2; - ToReverse2 = Tmp; + NE2.Orientation (CurE.Orientation()); + GetEdgesOrientedInFace (NE1, FIO, theAsDes, NE1seq); + NE2seq.Append (NE2); + anOr1 = TopAbs_FORWARD; + anOr2 = TopAbs_REVERSED; } else { DoInter = 0; @@ -1557,23 +1778,43 @@ // NE1,NE2 can be a compound of Edges. //------------------------------------ Standard_Boolean bCoincide; - TopExp_Explorer Exp1, Exp2; - for (Exp1.Init(NE1, TopAbs_EDGE); Exp1.More(); Exp1.Next()) { - TopoDS_Edge aE1 = TopoDS::Edge(Exp1.Current()); - for (Exp2.Init(NE2, TopAbs_EDGE); Exp2.More(); Exp2.Next()) { - TopoDS_Edge aE2 = TopoDS::Edge(Exp2.Current()); - - //Correct orientation of edges - if (ToReverse1) - aE1.Reverse(); - if (ToReverse2) - aE2.Reverse(); - ////////////////////////////// - - RefEdgeInter(FIO, BAsurf, aE1, aE2, AsDes2d, - Tol, Standard_True, Pref, theDMVV, bCoincide); - } + TopoDS_Edge aE1, aE2; + if (aChoice == 1 || aChoice == 2) + { + aE1 = TopoDS::Edge (NE1seq.Last()); + aE2 = TopoDS::Edge (NE2seq.First()); + } + else // aChoice == 3 + { + aE1 = TopoDS::Edge (NE1seq.First()); + aE2 = TopoDS::Edge (NE2seq.Last()); } + + if (aE1.Orientation() == TopAbs_REVERSED) + anOr1 = TopAbs::Reverse(anOr1); + if (aE2.Orientation() == TopAbs_REVERSED) + anOr2 = TopAbs::Reverse(anOr2); + + RefEdgeInter(FIO, BAsurf, aE1, aE2, anOr1, anOr2, AsDes2d, + Tol, Standard_True, Vref, theImageVV, theDMVV, bCoincide); + + if (theEdgeIntEdges.IsBound(aE1)) + theEdgeIntEdges(aE1).Append(aE2); + else + { + TopTools_ListOfShape aElist; + aElist.Append(aE2); + theEdgeIntEdges.Bind (aE1, aElist); + } + if (theEdgeIntEdges.IsBound(aE2)) + theEdgeIntEdges(aE2).Append(aE1); + else + { + TopTools_ListOfShape aElist; + aElist.Append(aE1); + theEdgeIntEdges.Bind (aE2, aElist); + } + // // check if some of the offset edges have been // generated out of the common vertex @@ -1582,21 +1823,23 @@ } } else { - if (MES.IsBound(CEO)) { - TopoDS_Vertex V = CommonVertex(CEO,NEO); - UpdateVertex (V,CEO,TopoDS::Edge(MES(CEO)),Tol); - AsDes2d->Add (MES(CEO),V); - } - else if (MES.IsBound(NEO)) { - TopoDS_Vertex V = CommonVertex(CEO,NEO); - UpdateVertex (V,NEO,TopoDS::Edge(MES(NEO)),Tol); - AsDes2d->Add (MES(NEO),V); + TopoDS_Vertex V = CommonVertex(CEO,NEO); + if (!V.IsNull()) + { + if (MES.IsBound(CEO)) { + UpdateVertex (V,CEO,TopoDS::Edge(MES(CEO)),Tol); + AsDes2d->Add (MES(CEO),V); + } + if (MES.IsBound(NEO)) { + UpdateVertex (V,NEO,TopoDS::Edge(MES(NEO)),Tol); + AsDes2d->Add (MES(NEO),V); + } } } - CurE = NextE; - ToReverse1 = ToReverse2; + CurE = wexp.Current(); } } + return Standard_True; } //======================================================================= @@ -1611,6 +1854,7 @@ const Handle(BRepAlgo_AsDes)& AsDes, const Handle(BRepAlgo_AsDes)& AsDes2d, const Standard_Real Tol, + const BRepOffset_Analyse& Analyse, TopTools_IndexedDataMapOfShapeListOfShape& theDMVV) { TopoDS_Face FIO = TopoDS::Face(OFI.Face()); @@ -1652,18 +1896,21 @@ if (CurE.IsSame(NextE)) continue; // TopoDS_Vertex Vref = CommonVertex(CurE, NextE); - gp_Pnt Pref = BRep_Tool::Pnt(Vref); if (!Build.IsBound(Vref)) { CurE = NextE; continue; } - // + + CurE = Analyse.EdgeReplacement (FI, CurE); + NextE = Analyse.EdgeReplacement (FI, NextE); + TopoDS_Shape aLocalShape = OFI.Generated(CurE); TopoDS_Edge CEO = TopoDS::Edge(aLocalShape); aLocalShape = OFI.Generated(NextE); TopoDS_Edge NEO = TopoDS::Edge(aLocalShape); // TopoDS_Shape NE1,NE2; + TopAbs_Orientation anOr1 = TopAbs_EXTERNAL, anOr2 = TopAbs_EXTERNAL; if (Build.IsBound(CurE) && Build.IsBound(NextE)) { NE1 = Build(CurE ); @@ -1678,7 +1925,7 @@ NE2 = MES(CEO); } else { - CurE = NextE; + CurE = wexp.Current(); continue; } // @@ -1696,8 +1943,9 @@ // intersection with first edge for (Exp1.Init(NE1, TopAbs_EDGE); Exp1.More(); Exp1.Next()) { const TopoDS_Edge& aE1 = TopoDS::Edge(Exp1.Current()); - RefEdgeInter(FIO, BAsurf, aE1, aE3, AsDes2d, - Tol, Standard_True, Pref, theDMVV, bCoincide); + BRepAlgo_Image anEmptyImage; + RefEdgeInter(FIO, BAsurf, aE1, aE3, anOr1, anOr2, AsDes2d, + Tol, Standard_True, Vref, anEmptyImage, theDMVV, bCoincide); if (bCoincide) { // in case of coincidence trim the edge E3 the same way as E1 Store(aE3, AsDes2d->Descendant(aE1), Tol, Standard_True, AsDes2d, theDMVV); @@ -1707,8 +1955,9 @@ // intersection with second edge for (Exp1.Init(NE2, TopAbs_EDGE); Exp1.More(); Exp1.Next()) { const TopoDS_Edge& aE2 = TopoDS::Edge(Exp1.Current()); - RefEdgeInter(FIO, BAsurf, aE2, aE3, AsDes2d, - Tol, Standard_True, Pref, theDMVV, bCoincide); + BRepAlgo_Image anEmptyImage; + RefEdgeInter(FIO, BAsurf, aE2, aE3, anOr1, anOr2, AsDes2d, + Tol, Standard_True, Vref, anEmptyImage, theDMVV, bCoincide); if (bCoincide) { // in case of coincidence trim the edge E3 the same way as E2 Store(aE3, AsDes2d->Descendant(aE2), Tol, Standard_True, AsDes2d, theDMVV); @@ -1726,12 +1975,13 @@ for (Exp1.Next(); Exp1.More(); Exp1.Next()) { const TopoDS_Edge& aE3Next = TopoDS::Edge(Exp1.Current()); if (aME.Contains(aE3Next)) { - RefEdgeInter(FIO, BAsurf, aE3Next, aE3, AsDes2d, - Tol, Standard_True, Pref, theDMVV, bCoincide); + BRepAlgo_Image anEmptyImage; + RefEdgeInter(FIO, BAsurf, aE3Next, aE3, anOr1, anOr2, AsDes2d, + Tol, Standard_True, Vref, anEmptyImage, theDMVV, bCoincide); } } } - CurE = NextE; + CurE = wexp.Current(); } } } @@ -1761,8 +2011,9 @@ //function : FuseVertices //purpose : //======================================================================= -void BRepOffset_Inter2d::FuseVertices(const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV, - const Handle(BRepAlgo_AsDes)& theAsDes) +Standard_Boolean BRepOffset_Inter2d::FuseVertices (const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV, + const Handle(BRepAlgo_AsDes)& theAsDes, + BRepAlgo_Image& theImageVV) { BRep_Builder aBB; TopTools_MapOfShape aMVDone; @@ -1795,11 +2046,21 @@ for (; aItLE.More(); aItLE.Next()) { const TopoDS_Edge& aE = TopoDS::Edge(aItLE.Value()); Standard_Real aTolE = BRep_Tool::Tolerance(aE); - Standard_Real aT = BRep_Tool::Parameter(aVOldInt, aE); + Standard_Real aT; + if (!BRep_Tool::Parameter(aVOldInt, aE, aT)) + { + return Standard_False; + } aBB.UpdateVertex(aVNewInt, aT, aE, aTolE); } // and replace the vertex theAsDes->Replace(aVOld, aVNew); + if (theImageVV.IsImage(aVOld)) + { + const TopoDS_Vertex& aProVertex = TopoDS::Vertex (theImageVV.ImageFrom(aVOld)); + theImageVV.Add (aProVertex, aVNew.Oriented(TopAbs_FORWARD)); + } } } -} + return Standard_True; +} \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Inter2d.hxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Inter2d.hxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Inter2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Inter2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,13 +24,17 @@ #include #include #include +#include #include class BRepAlgo_AsDes; -class TopoDS_Face; +class BRepAlgo_Image; +class BRepOffset_Analyse; class BRepOffset_Offset; +class TopoDS_Edge; +class TopoDS_Face; -//! Computes the intersections betwwen edges on a face +//! Computes the intersections between edges on a face //! stores result is SD as AsDes from BRepOffset. class BRepOffset_Inter2d { @@ -49,6 +53,7 @@ const TopoDS_Face& F, const TopTools_IndexedMapOfShape& NewEdges, const Standard_Real Tol, + const TopTools_DataMapOfShapeListOfShape& theEdgeIntEdges, TopTools_IndexedDataMapOfShapeListOfShape& theDMVV); //! Computes the intersection between the offset edges of the . @@ -56,15 +61,19 @@ //! When all faces of the shape are treated the intersection vertices //! have to be fused using the FuseVertices method. //! theDMVV contains the vertices that should be fused. - Standard_EXPORT static void ConnexIntByInt (const TopoDS_Face& FI, - BRepOffset_Offset& OFI, - TopTools_DataMapOfShapeShape& MES, - const TopTools_DataMapOfShapeShape& Build, - const Handle(BRepAlgo_AsDes)& AsDes2d, - const Standard_Real Offset, - const Standard_Real Tol, - TopTools_IndexedMapOfShape& FacesWithVerts, - TopTools_IndexedDataMapOfShapeListOfShape& theDMVV); + Standard_EXPORT static Standard_Boolean ConnexIntByInt (const TopoDS_Face& FI, + BRepOffset_Offset& OFI, + TopTools_DataMapOfShapeShape& MES, + const TopTools_DataMapOfShapeShape& Build, + const Handle(BRepAlgo_AsDes)& theAsDes, + const Handle(BRepAlgo_AsDes)& AsDes2d, + const Standard_Real Offset, + const Standard_Real Tol, + const BRepOffset_Analyse& Analyse, + TopTools_IndexedMapOfShape& FacesWithVerts, + BRepAlgo_Image& theImageVV, + TopTools_DataMapOfShapeListOfShape& theEdgeIntEdges, + TopTools_IndexedDataMapOfShapeListOfShape& theDMVV); //! Computes the intersection between the offset edges generated //! from vertices and stored into AsDes as descendants of the . @@ -79,17 +88,20 @@ const Handle(BRepAlgo_AsDes)& AsDes, const Handle(BRepAlgo_AsDes)& AsDes2d, const Standard_Real Tol, + const BRepOffset_Analyse& Analyse, TopTools_IndexedDataMapOfShapeListOfShape& theDMVV); //! Fuses the chains of vertices in the theDMVV //! and updates AsDes by replacing the old vertices //! with the new ones. - Standard_EXPORT static void FuseVertices(const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV, - const Handle(BRepAlgo_AsDes)& theAsDes); + Standard_EXPORT static Standard_Boolean FuseVertices (const TopTools_IndexedDataMapOfShapeListOfShape& theDMVV, + const Handle(BRepAlgo_AsDes)& theAsDes, + BRepAlgo_Image& theImageVV); + //! extents the edge - Standard_EXPORT static void ExtentEdge(const TopoDS_Edge& E, - TopoDS_Edge& NE, - const Standard_Real theOffset); + Standard_EXPORT static Standard_Boolean ExtentEdge (const TopoDS_Edge& E, + TopoDS_Edge& NE, + const Standard_Real theOffset); protected: diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Inter3d.cxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Inter3d.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Inter3d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Inter3d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -169,6 +169,7 @@ { TopTools_ListOfShape LInt1, LInt2; TopoDS_Edge NullEdge; + TopoDS_Face NullFace; if (F1.IsSame(F2)) return; if (IsDone(F1,F2)) return; @@ -221,11 +222,11 @@ if (BRepOffset_Tool::FindCommonShapes(TopoDS::Face(InitF1), TopoDS::Face(InitF2),LE,LV)) { if (!LE.IsEmpty()) { - BRepOffset_Tool::Inter3D (F1,F2,LInt1,LInt2,mySide,NullEdge); + BRepOffset_Tool::Inter3D (F1,F2,LInt1,LInt2,mySide,NullEdge,NullFace,NullFace); } } else { - BRepOffset_Tool::Inter3D(F1,F2,LInt1,LInt2,mySide,NullEdge); + BRepOffset_Tool::Inter3D(F1,F2,LInt1,LInt2,mySide,NullEdge,NullFace,NullFace); } } } @@ -236,7 +237,7 @@ BRepOffset_Tool::PipeInter(F1,F2,LInt1,LInt2,mySide); } else { - BRepOffset_Tool::Inter3D (F1,F2,LInt1,LInt2,mySide,NullEdge); + BRepOffset_Tool::Inter3D (F1,F2,LInt1,LInt2,mySide,NullEdge,NullFace,NullFace); } } Store (F1,F2,LInt1,LInt2); @@ -253,12 +254,13 @@ const BRepOffset_Analyse& Analyse, const BRepAlgo_Image& InitOffsetFace) { - BRepOffset_Type OT = BRepOffset_Concave; - if (mySide == TopAbs_OUT) OT = BRepOffset_Convex; + ChFiDS_TypeOfConcavity OT = ChFiDS_Concave; + if (mySide == TopAbs_OUT) OT = ChFiDS_Convex; TopExp_Explorer Exp(ShapeInit,TopAbs_EDGE); TopTools_ListOfShape LInt1,LInt2; TopoDS_Face F1,F2; TopoDS_Edge NullEdge; + TopoDS_Face NullFace; //--------------------------------------------------------------------- // etape 1 : Intersection of faces // corresponding to the initial faces @@ -273,10 +275,13 @@ //----------------------------------------------------------- const TopTools_ListOfShape& Anc = Analyse.Ancestors(E); if (Anc.Extent() == 2) { - F1 = TopoDS::Face(InitOffsetFace.Image(Anc.First()).First()); - F2 = TopoDS::Face(InitOffsetFace.Image(Anc.Last ()).First()); + + const TopoDS_Face& InitF1 = TopoDS::Face(Anc.First()); + const TopoDS_Face& InitF2 = TopoDS::Face(Anc.Last()); + F1 = TopoDS::Face(InitOffsetFace.Image(InitF1).First()); + F2 = TopoDS::Face(InitOffsetFace.Image(InitF2).First()); if (!IsDone(F1,F2)) { - BRepOffset_Tool::Inter3D (F1,F2,LInt1,LInt2,mySide,E,Standard_True); + BRepOffset_Tool::Inter3D (F1,F2,LInt1,LInt2,mySide,E,InitF1,InitF2); Store (F1,F2,LInt1,LInt2); } } @@ -296,7 +301,7 @@ //--------------------------- // E1 generated a tube. //--------------------------- - F1 = TopoDS::Face(InitOffsetFace.Image(E1).First());; + F1 = TopoDS::Face(InitOffsetFace.Image(E1).First()); TopExp::Vertices(E1,V[0],V[1]); const TopTools_ListOfShape& AncE1 = Analyse.Ancestors(E1); @@ -349,7 +354,7 @@ // to the tube or if E2 is not a tangent edge. //------------------------------------------------------- const BRepOffset_ListOfInterval& L = Analyse.Type(E2); - if (!L.IsEmpty() && L.First().Type() == BRepOffset_Tangent) { + if (!L.IsEmpty() && L.First().Type() == ChFiDS_Tangential) { continue; } const TopTools_ListOfShape& AncE2 = Analyse.Ancestors(E2); @@ -361,7 +366,7 @@ if (!TangentFaces) { F2 = TopoDS::Face(InitOffsetFace.Image(InitF2).First()); if (!IsDone(F1,F2)) { - BRepOffset_Tool::Inter3D (F1,F2,LInt1,LInt2,mySide,NullEdge); + BRepOffset_Tool::Inter3D (F1,F2,LInt1,LInt2,mySide,NullEdge,NullFace,NullFace); Store (F1,F2,LInt1,LInt2); } } @@ -371,7 +376,7 @@ if (!TangentFaces) { F2 = TopoDS::Face(InitOffsetFace.Image(InitF2).First()); if (!IsDone(F1,F2)) { - BRepOffset_Tool::Inter3D (F1,F2,LInt1,LInt2,mySide,NullEdge); + BRepOffset_Tool::Inter3D (F1,F2,LInt1,LInt2,mySide,NullEdge,NullFace,NullFace); Store (F1,F2,LInt1,LInt2); } } @@ -399,88 +404,148 @@ TopTools_ListOfShape& Failed, const Standard_Boolean bIsPlanar) { - //TopExp_Explorer Exp(SI,TopAbs_EDGE); TopTools_IndexedMapOfShape VEmap; - TopTools_IndexedDataMapOfShapeListOfShape aMVF; TopoDS_Face F1,F2,OF1,OF2,NF1,NF2; TopAbs_State CurSide = mySide; BRep_Builder B; Standard_Boolean bEdge; - Standard_Integer i, aNb; + Standard_Integer i, aNb = 0; TopTools_ListIteratorOfListOfShape it, it1, itF1, itF2; // - TopExp::MapShapes(SI, TopAbs_EDGE , VEmap); - // map the shape for vertices - if (bIsPlanar) { + TopExp::MapShapes (SI, TopAbs_EDGE, VEmap); + // Take the vertices for treatment + if (bIsPlanar) + { + aNb = VEmap.Extent(); + for (i = 1; i <= aNb; ++i) + { + const TopoDS_Edge& aE = TopoDS::Edge (VEmap (i)); + TopoDS_Shape aFGen = Analyse.Generated (aE); + if (!aFGen.IsNull()) + TopExp::MapShapes (aFGen, TopAbs_EDGE, VEmap); + } + + // Add vertices for treatment TopExp::MapShapes(SI, TopAbs_VERTEX, VEmap); - // - // make vertex-faces connexity map with unique ancestors - TopExp::MapShapesAndUniqueAncestors(SI, TopAbs_VERTEX, TopAbs_FACE, aMVF); + + for (TopTools_ListOfShape::Iterator itNF (Analyse.NewFaces()); itNF.More(); itNF.Next()) + TopExp::MapShapes (itNF.Value(), TopAbs_VERTEX, VEmap); } // TopTools_DataMapOfShapeListOfShape aDMVLF1, aDMVLF2, aDMIntFF; TopTools_IndexedDataMapOfShapeListOfShape aDMIntE; // - if (bIsPlanar) { - aNb = VEmap.Extent(); - for (i = 1; i <= aNb; ++i) { + if (bIsPlanar) + { + // Find internal edges in the faces to skip them while preparing faces + // for intersection through vertices + NCollection_DataMap aDMFEI; + { + for (TopExp_Explorer expF (SI, TopAbs_FACE); expF.More(); expF.Next()) + { + const TopoDS_Shape& aFx = expF.Current(); + + TopTools_MapOfShape aMEI; + for (TopExp_Explorer expE (aFx, TopAbs_EDGE); expE.More(); expE.Next()) + { + const TopoDS_Shape& aEx = expE.Current(); + if (aEx.Orientation() != TopAbs_FORWARD && + aEx.Orientation() != TopAbs_REVERSED) + aMEI.Add (aEx); + } + if (!aMEI.IsEmpty()) + aDMFEI.Bind (aFx, aMEI); + } + } + + // Analyze faces connected through vertices + for (i = aNb + 1, aNb = VEmap.Extent(); i <= aNb; ++i) + { const TopoDS_Shape& aS = VEmap(i); - if (aS.ShapeType() != TopAbs_VERTEX) { + if (aS.ShapeType() != TopAbs_VERTEX) continue; + + // Find faces connected to the vertex + TopTools_ListOfShape aLF; + { + const TopTools_ListOfShape& aLE = Analyse.Ancestors (aS); + for (TopTools_ListOfShape::Iterator itLE (aLE); itLE.More(); itLE.Next()) + { + const TopTools_ListOfShape& aLEA = Analyse.Ancestors (itLE.Value()); + for (TopTools_ListOfShape::Iterator itLEA (aLEA); itLEA.More(); itLEA.Next()) + { + if (!aLF.Contains (itLEA.Value())) + aLF.Append (itLEA.Value()); + } + } } - // - // faces connected by the vertex - const TopTools_ListOfShape& aLF = aMVF.FindFromKey(aS); - if (aLF.Extent() < 2) { + + if (aLF.Extent() < 2) continue; - } + // build lists of faces connected to the same vertex by looking for // the pairs in which the vertex is alone (not connected to shared edges) TopTools_ListOfShape aLF1, aLF2; - // + it.Initialize(aLF); - for (; it.More(); it.Next()) { + for (; it.More(); it.Next()) + { const TopoDS_Shape& aFV1 = it.Value(); - // + // get edges of first face connected to current vertex TopTools_MapOfShape aME; - TopExp_Explorer aExp(aFV1, TopAbs_EDGE); - for (; aExp.More(); aExp.Next()) { - const TopoDS_Shape& aE = aExp.Current(); - if (aE.Orientation() != TopAbs_FORWARD && - aE.Orientation() != TopAbs_REVERSED) - // Face is connected to the vertex through internal edge + const TopTools_MapOfShape *pF1Internal = aDMFEI.Seek (aFV1); + const TopTools_ListOfShape* pLE1 = Analyse.Descendants (aFV1); + if (!pLE1) + continue; + TopTools_ListOfShape::Iterator itLE1 (*pLE1); + for (; itLE1.More(); itLE1.Next()) + { + const TopoDS_Shape& aE = itLE1.Value(); + if (pF1Internal && pF1Internal->Contains (aE)) break; - TopoDS_Iterator aItV(aE); - for (; aItV.More(); aItV.Next()) { - if (aS.IsSame(aItV.Value())) { + for (TopoDS_Iterator aItV(aE); aItV.More(); aItV.Next()) + { + if (aS.IsSame (aItV.Value())) + { aME.Add(aE); break; } } } - if (aExp.More()) + if (itLE1.More()) continue; // get to the next face in the list it1 = it; for (it1.Next(); it1.More(); it1.Next()) { - const TopoDS_Shape& aFV2 = it1.Value(); - // - aExp.Init(aFV2, TopAbs_EDGE); - for (; aExp.More(); aExp.Next()) { - const TopoDS_Shape& aEV2 = aExp.Current(); - if (aME.Contains(aEV2) && - (Analyse.Ancestors(aEV2).Extent() == 2 || // Multi-connexity is not supported in Analyzer - (aEV2.Orientation() != TopAbs_FORWARD && // Avoid intersection of faces connected by internal edge - aEV2.Orientation() != TopAbs_REVERSED))) { + const TopoDS_Face& aFV2 = TopoDS::Face (it1.Value()); + + const TopTools_MapOfShape *pF2Internal = aDMFEI.Seek (aFV2); + + const TopTools_ListOfShape* pLE2 = Analyse.Descendants (aFV2); + if (!pLE2) + continue; + TopTools_ListOfShape::Iterator itLE2 (*pLE2); + for (; itLE2.More(); itLE2.Next()) + { + const TopoDS_Shape& aEV2 = itLE2.Value(); + if (!aME.Contains (aEV2)) + continue; + + if (pF2Internal && pF2Internal->Contains (aEV2)) + // Avoid intersection of faces connected by internal edge + break; + + if (Analyse.HasAncestor (aEV2) && + Analyse.Ancestors (aEV2).Extent() == 2) + // Faces will be intersected through the edge break; - } } - // - if (!aExp.More()) { - // faces share only vertex - make pair for intersection + + if (!itLE2.More()) + { aLF1.Append(aFV1); aLF2.Append(aFV2); } @@ -511,13 +576,13 @@ continue; } // - BRepOffset_Type OT = L.First().Type(); - if (OT != BRepOffset_Convex && OT != BRepOffset_Concave) { + ChFiDS_TypeOfConcavity OT = L.First().Type(); + if (OT != ChFiDS_Convex && OT != ChFiDS_Concave) { continue; } // - if (OT == BRepOffset_Concave) CurSide = TopAbs_IN; - else CurSide = TopAbs_OUT; + if (OT == ChFiDS_Concave) CurSide = TopAbs_IN; + else CurSide = TopAbs_OUT; //----------------------------------------------------------- // edge is of the proper type, return adjacent faces. //----------------------------------------------------------- @@ -575,7 +640,7 @@ // if (!IsDone(NF1,NF2)) { TopTools_ListOfShape LInt1,LInt2; - BRepOffset_Tool::Inter3D (NF1,NF2,LInt1,LInt2,CurSide,E,bEdge); + BRepOffset_Tool::Inter3D (NF1,NF2,LInt1,LInt2,CurSide,E,F1,F2); SetDone(NF1,NF2); if (!LInt1.IsEmpty()) { Store (NF1,NF2,LInt1,LInt2); @@ -974,7 +1039,7 @@ TopTools_ListOfShape LInt1,LInt2; TopTools_ListOfShape LOE; LOE.Append(OE); - BRepOffset_Tool::Inter3D (WCF,NF,LInt1,LInt2,Side,E,bEdge); + BRepOffset_Tool::Inter3D (WCF,NF,LInt1,LInt2,Side,E,CF,F); SetDone(NF,CF); if (!LInt1.IsEmpty()) { Store (CF,NF,LInt1,LInt2); @@ -1026,6 +1091,7 @@ TopoDS_Edge OE; BRep_Builder B; TopoDS_Edge NullEdge; + TopoDS_Face NullFace; Standard_Integer j; for (j = 1; j <= ContextFaces.Extent(); j++) { @@ -1195,7 +1261,7 @@ // If no trace try intersection. //------------------------------------------------------- if (LInt1.IsEmpty()) { - BRepOffset_Tool::Inter3D (CF,OF1,LInt1,LInt2,mySide,NullEdge); + BRepOffset_Tool::Inter3D (CF,OF1,LInt1,LInt2,mySide,NullEdge,NullFace,NullFace); } Store (CF,OF1,LInt1,LInt2); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Interval.cxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Interval.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Interval.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Interval.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,7 +33,7 @@ BRepOffset_Interval::BRepOffset_Interval(const Standard_Real U1, const Standard_Real U2, - const BRepOffset_Type Type): + const ChFiDS_TypeOfConcavity Type): f(U1), l(U2), type(Type) diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Interval.hxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Interval.hxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Interval.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Interval.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,7 +22,7 @@ #include #include -#include +#include @@ -35,19 +35,21 @@ Standard_EXPORT BRepOffset_Interval(); - Standard_EXPORT BRepOffset_Interval(const Standard_Real U1, const Standard_Real U2, const BRepOffset_Type Type); + Standard_EXPORT BRepOffset_Interval(const Standard_Real U1, + const Standard_Real U2, + const ChFiDS_TypeOfConcavity Type); void First (const Standard_Real U); void Last (const Standard_Real U); - void Type (const BRepOffset_Type T); + void Type (const ChFiDS_TypeOfConcavity T); Standard_Real First() const; Standard_Real Last() const; - BRepOffset_Type Type() const; + ChFiDS_TypeOfConcavity Type() const; @@ -64,7 +66,7 @@ Standard_Real f; Standard_Real l; - BRepOffset_Type type; + ChFiDS_TypeOfConcavity type; }; diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Interval.lxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Interval.lxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Interval.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Interval.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,7 +41,7 @@ //purpose : //======================================================================= -inline void BRepOffset_Interval::Type(const BRepOffset_Type T) +inline void BRepOffset_Interval::Type(const ChFiDS_TypeOfConcavity T) { type = T; } @@ -74,7 +74,7 @@ //purpose : //======================================================================= -inline BRepOffset_Type BRepOffset_Interval::Type() const +inline ChFiDS_TypeOfConcavity BRepOffset_Interval::Type() const { return type; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_MakeLoops.cxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_MakeLoops.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_MakeLoops.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_MakeLoops.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,12 +51,14 @@ void BRepOffset_MakeLoops::Build(const TopTools_ListOfShape& LF, const Handle(BRepAlgo_AsDes)& AsDes, - BRepAlgo_Image& Image) + BRepAlgo_Image& Image, + BRepAlgo_Image& theImageVV) { TopTools_ListIteratorOfListOfShape it(LF); TopTools_ListIteratorOfListOfShape itl,itLCE; BRepAlgo_Loop Loops; Loops.VerticesForSubstitute( myVerVerMap ); + Loops.SetImageVV (theImageVV); for (; it.More(); it.Next()) { const TopoDS_Face& F = TopoDS::Face(it.Value()); diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_MakeLoops.hxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_MakeLoops.hxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_MakeLoops.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_MakeLoops.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,11 +39,20 @@ Standard_EXPORT BRepOffset_MakeLoops(); - Standard_EXPORT void Build (const TopTools_ListOfShape& LF, const Handle(BRepAlgo_AsDes)& AsDes, BRepAlgo_Image& Image); + Standard_EXPORT void Build (const TopTools_ListOfShape& LF, + const Handle(BRepAlgo_AsDes)& AsDes, + BRepAlgo_Image& Image, + BRepAlgo_Image& theImageVV); - Standard_EXPORT void BuildOnContext (const TopTools_ListOfShape& LContext, const BRepOffset_Analyse& Analyse, const Handle(BRepAlgo_AsDes)& AsDes, BRepAlgo_Image& Image, const Standard_Boolean InSide); + Standard_EXPORT void BuildOnContext (const TopTools_ListOfShape& LContext, + const BRepOffset_Analyse& Analyse, + const Handle(BRepAlgo_AsDes)& AsDes, + BRepAlgo_Image& Image, + const Standard_Boolean InSide); - Standard_EXPORT void BuildFaces (const TopTools_ListOfShape& LF, const Handle(BRepAlgo_AsDes)& AsDes, BRepAlgo_Image& Image); + Standard_EXPORT void BuildFaces (const TopTools_ListOfShape& LF, + const Handle(BRepAlgo_AsDes)& AsDes, + BRepAlgo_Image& Image); diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset_1.cxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset_1.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -60,6 +60,7 @@ #include #include #include +#include #include #include @@ -70,6 +71,8 @@ typedef NCollection_DataMap BRepOffset_DataMapOfShapeMapOfShape; +typedef NCollection_DataMap + BRepOffset_DataMapOfShapeIndexedMapOfShape; static void IntersectTrimmedEdges(const TopTools_ListOfShape& theLF, @@ -103,10 +106,21 @@ TopTools_DataMapOfShapeShape& theOrigins, TopTools_ListOfShape& theLFImages); +//! Auxiliary structure to contain intersection information +struct BRepOffset_MakeOffset_InterResults +{ + TopTools_DataMapOfShapeListOfShape SSInterfs; //!< Intersection information, used to add pair for intersection + NCollection_DataMap InterPairs; //!< All possible intersection pairs, used to avoid + //! some of the intersection +}; + static void BuildSplitsOfFaces(const TopTools_ListOfShape& theLF, const TopTools_MapOfShape& theModifiedEdges, const TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, + const BRepOffset_Analyse* theAnalyse, Handle(BRepAlgo_AsDes)& theAsDes, TopTools_DataMapOfShapeShape& theFacesOrigins, TopTools_DataMapOfShapeListOfShape& theOEImages, @@ -122,11 +136,12 @@ TopTools_IndexedDataMapOfShapeListOfShape& theFImages, TopTools_DataMapOfShapeListOfShape& theDMFNewHoles, TopoDS_Shape& theSolids, - TopTools_DataMapOfShapeListOfShape& theSSInterfs); + BRepOffset_MakeOffset_InterResults& theIntRes); static void BuildSplitsOfInvFaces(const TopTools_IndexedDataMapOfShapeListOfShape& theFToRebuild, const TopTools_MapOfShape& theModifiedEdges, + const BRepOffset_Analyse* theAnalyse, TopTools_IndexedDataMapOfShapeListOfShape& theFImages, TopTools_DataMapOfShapeListOfShape& theDMFNewHoles, TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, @@ -155,28 +170,41 @@ const TopTools_ListOfShape& theLFImages, const TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, const TopTools_DataMapOfShapeShape& theFacesOrigins, + const BRepOffset_Analyse* theAnalyse, const TopTools_DataMapOfShapeListOfShape& theOEImages, const TopTools_DataMapOfShapeListOfShape& theOEOrigins, TopTools_IndexedMapOfShape& theInvEdges, TopTools_IndexedMapOfShape& theValidEdges, - TopTools_DataMapOfShapeListOfShape& theDMFLVE, - TopTools_DataMapOfShapeListOfShape& theDMFLNE, - TopTools_DataMapOfShapeListOfShape& theDMFLIE, - TopTools_DataMapOfShapeListOfShape& theDMFLVIE, + BRepOffset_DataMapOfShapeMapOfShape& theDMFMVE, + BRepOffset_DataMapOfShapeMapOfShape& theDMFMNE, + BRepOffset_DataMapOfShapeIndexedMapOfShape& theDMFMIE, + BRepOffset_DataMapOfShapeMapOfShape& theDMFMVIE, TopTools_DataMapOfShapeListOfShape& theDMEOrLEIm, TopTools_MapOfShape& theMEInverted, - TopTools_MapOfShape& theEdgesInvalidByVertex); + TopTools_MapOfShape& theEdgesInvalidByVertex, + TopTools_MapOfShape& theEdgesValidByVertex); + +static + void FindInvalidEdges (const TopTools_ListOfShape& theLFOffset, + const TopTools_IndexedDataMapOfShapeListOfShape& theFImages, + const TopTools_DataMapOfShapeShape& theFacesOrigins, + const BRepOffset_Analyse* theAnalyse, + const TopTools_IndexedMapOfShape& theInvEdges, + const TopTools_IndexedMapOfShape& theValidEdges, + BRepOffset_DataMapOfShapeIndexedMapOfShape& theLocInvEdges, + BRepOffset_DataMapOfShapeMapOfShape& theLocValidEdges, + BRepOffset_DataMapOfShapeMapOfShape& theNeutralEdges); static void FindInvalidFaces(TopTools_ListOfShape& theLFImages, const TopTools_IndexedMapOfShape& theInvEdges, const TopTools_IndexedMapOfShape& theValidEdges, - const TopTools_DataMapOfShapeListOfShape& theDMFLVE, - const TopTools_DataMapOfShapeListOfShape& theDMFLIE, - const TopTools_ListOfShape& theLENeutral, - const TopTools_ListOfShape& theLEValInverted, + const BRepOffset_DataMapOfShapeMapOfShape& theDMFMVE, + const BRepOffset_DataMapOfShapeIndexedMapOfShape& theDMFMIE, + const TopTools_MapOfShape& theLENeutral, const TopTools_MapOfShape& theMEInverted, const TopTools_MapOfShape& theEdgesInvalidByVertex, + const TopTools_MapOfShape& theEdgesValidByVertex, const TopTools_MapOfShape& theMFHoles, TopTools_IndexedMapOfShape& theMFInvInHole, TopTools_ListOfShape& theInvFaces, @@ -232,6 +260,7 @@ void RemoveInvalidSplitsFromValid(const TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces, const TopTools_DataMapOfShapeShape& theArtInvFaces, const TopTools_MapOfShape& theMEInverted, + const BRepOffset_DataMapOfShapeMapOfShape& theDMFMVIE, TopTools_IndexedDataMapOfShapeListOfShape& theFImages); static @@ -244,7 +273,7 @@ const TopTools_IndexedMapOfShape& theMFToCheckInt, const TopTools_IndexedMapOfShape& theMFInvInHole, const TopoDS_Shape& theFHoles, - TopTools_DataMapOfShapeListOfShape& theSSInterfs, + BRepOffset_MakeOffset_InterResults& theIntRes, TopTools_IndexedMapOfShape& theMERemoved, TopTools_IndexedMapOfShape& theMEInside, TopoDS_Shape& theSolids); @@ -284,8 +313,9 @@ TopTools_DataMapOfShapeListOfShape& theOEOrigins); static - void FilterInvalidFaces(const TopTools_IndexedDataMapOfShapeListOfShape& theFImages, + void FilterInvalidFaces(TopTools_IndexedDataMapOfShapeListOfShape& theFImages, const TopTools_IndexedDataMapOfShapeListOfShape& theDMEF, + const TopTools_IndexedMapOfShape& theInvEdges, const TopTools_IndexedMapOfShape& theMERemoved, TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces, TopTools_DataMapOfShapeShape& theArtInvFaces); @@ -293,10 +323,17 @@ static void FilterInvalidEdges(const TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces, const TopTools_DataMapOfShapeShape& theArtInvFaces, - const TopTools_DataMapOfShapeListOfShape& theDMFLIE, + const BRepOffset_DataMapOfShapeIndexedMapOfShape& theDMFMIE, const TopTools_IndexedMapOfShape& theMERemoved, TopTools_IndexedMapOfShape& theInvEdges); +static + void CheckEdgesCreatedByVertex (const TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces, + const TopTools_DataMapOfShapeShape& theArtInvFaces, + const TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, + const TopTools_IndexedMapOfShape& theValidEdges, + TopTools_IndexedMapOfShape& theInvEdges); + static void FindFacesToRebuild(const TopTools_IndexedDataMapOfShapeListOfShape& theLFImages, const TopTools_IndexedMapOfShape& theInvEdges, @@ -309,7 +346,8 @@ void RebuildFaces(const TopTools_IndexedDataMapOfShapeListOfShape& theFToRebuild, const TopTools_MapOfShape& theFSelfRebAvoid, const TopoDS_Shape& theSolids, - const TopTools_DataMapOfShapeListOfShape& theSSInterfs, + const BRepOffset_MakeOffset_InterResults& theIntRes, + const BRepOffset_Analyse* theAnalyse, TopTools_IndexedDataMapOfShapeListOfShape& theFImages, TopTools_DataMapOfShapeListOfShape& theDMFNewHoles, TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, @@ -332,7 +370,7 @@ void IntersectFaces(const TopTools_IndexedDataMapOfShapeListOfShape& theFToRebuild, const TopTools_MapOfShape& theFSelfRebAvoid, const TopoDS_Shape& theSolids, - const TopTools_DataMapOfShapeListOfShape& theSSInterfs, + const BRepOffset_MakeOffset_InterResults& theIntRes, TopTools_IndexedDataMapOfShapeListOfShape& theFImages, TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, TopTools_DataMapOfShapeListOfShape& theOEImages, @@ -594,6 +632,7 @@ static Standard_Boolean FindShape(const TopoDS_Shape& theSWhat, const TopoDS_Shape& theSWhere, + const BRepOffset_Analyse* theAnalyse, TopoDS_Shape& theRes); static @@ -667,6 +706,7 @@ // these invalidities will be rebuilt. //======================================================================= void BRepOffset_MakeOffset::BuildSplitsOfExtendedFaces(const TopTools_ListOfShape& theLF, + const BRepOffset_Analyse& theAnalyse, Handle(BRepAlgo_AsDes)& theAsDes, TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, TopTools_DataMapOfShapeShape& theFacesOrigins, @@ -693,7 +733,7 @@ // but may be filled on the following rebuilding steps TopTools_DataMapOfShapeShape anArtInvFaces; // shapes connections for using in rebuilding - TopTools_DataMapOfShapeListOfShape aSSInterfs; + BRepOffset_MakeOffset_InterResults aIntRes; // edges to avoid on second steps TopTools_MapOfShape aLastInvEdges; // keep information of already invalid faces to avoid @@ -704,21 +744,21 @@ // solid build from the new splits TopoDS_Shape aSolids; // now we can split the faces - BuildSplitsOfFaces(theLF, aNewEdges, theEdgesOrigins, theAsDes, theFacesOrigins, + BuildSplitsOfFaces(theLF, aNewEdges, theEdgesOrigins, &theAnalyse, theAsDes, theFacesOrigins, anOEImages, anOEOrigins, aLastInvEdges, anEdgesToAvoid, anInvEdges, aValidEdges, anInvertedEdges, anAlreadyInvFaces, anInvFaces, anArtInvFaces, aFImages, - aDMFNewHoles, aSolids, aSSInterfs); + aDMFNewHoles, aSolids, aIntRes); // // Find faces to rebuild if (anInvFaces.Extent()) { TopTools_IndexedDataMapOfShapeListOfShape aFToRebuild; TopTools_MapOfShape aFSelfRebAvoid; - FindFacesToRebuild(aFImages, anInvEdges, anInvFaces, aSSInterfs, aFToRebuild, aFSelfRebAvoid); + FindFacesToRebuild(aFImages, anInvEdges, anInvFaces, aIntRes.SSInterfs, aFToRebuild, aFSelfRebAvoid); // if (aFToRebuild.Extent()) { // vertices to avoid TopTools_MapOfShape aVAEmpty; - RebuildFaces(aFToRebuild, aFSelfRebAvoid, aSolids, aSSInterfs, aFImages, aDMFNewHoles, + RebuildFaces(aFToRebuild, aFSelfRebAvoid, aSolids, aIntRes, &theAnalyse, aFImages, aDMFNewHoles, theEdgesOrigins, theFacesOrigins, anOEImages, anOEOrigins, aLastInvEdges, anEdgesToAvoid, anInvEdges, aValidEdges, anInvertedEdges, anAlreadyInvFaces, anInvFaces, anArtInvFaces, aVAEmpty, theETrimEInf, theAsDes); @@ -739,6 +779,7 @@ //======================================================================= void BuildSplitsOfInvFaces(const TopTools_IndexedDataMapOfShapeListOfShape& theFToRebuild, const TopTools_MapOfShape& theModifiedEdges, + const BRepOffset_Analyse* theAnalyse, TopTools_IndexedDataMapOfShapeListOfShape& theFImages, TopTools_DataMapOfShapeListOfShape& theDMFNewHoles, TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, @@ -774,22 +815,22 @@ // inverted edges TopTools_MapOfShape anInvertedEdges; // shapes connection for using in rebuilding process - TopTools_DataMapOfShapeListOfShape aSSInterfs; + BRepOffset_MakeOffset_InterResults aIntRes; // TopoDS_Shape aSolids; // - BuildSplitsOfFaces(aLF, theModifiedEdges, theEdgesOrigins, theAsDes, theFacesOrigins, + BuildSplitsOfFaces(aLF, theModifiedEdges, theEdgesOrigins, theAnalyse, theAsDes, theFacesOrigins, theOEImages, theOEOrigins, theLastInvEdges, theEdgesToAvoid, anInvEdges, theValidEdges, anInvertedEdges, theAlreadyInvFaces, anInvFaces, anArtInvFaces, theFImages, - theDMFNewHoles, aSolids, aSSInterfs); + theDMFNewHoles, aSolids, aIntRes); // if (anInvFaces.Extent()) { TopTools_IndexedDataMapOfShapeListOfShape aFToRebuild; TopTools_MapOfShape aFSelfRebAvoid; - FindFacesToRebuild(theFImages, anInvEdges, anInvFaces, aSSInterfs, aFToRebuild, aFSelfRebAvoid); + FindFacesToRebuild(theFImages, anInvEdges, anInvFaces, aIntRes.SSInterfs, aFToRebuild, aFSelfRebAvoid); // if (aFToRebuild.Extent()) { - RebuildFaces(aFToRebuild, aFSelfRebAvoid, aSolids, aSSInterfs, theFImages, theDMFNewHoles, + RebuildFaces(aFToRebuild, aFSelfRebAvoid, aSolids, aIntRes, theAnalyse, theFImages, theDMFNewHoles, theEdgesOrigins, theFacesOrigins, theOEImages, theOEOrigins, theLastInvEdges, theEdgesToAvoid, anInvEdges, theValidEdges, anInvertedEdges, theAlreadyInvFaces, anInvFaces, anArtInvFaces, theVertsToAvoid, theETrimEInf, theAsDes); @@ -805,6 +846,7 @@ void BuildSplitsOfFaces(const TopTools_ListOfShape& theLF, const TopTools_MapOfShape& theModifiedEdges, const TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, + const BRepOffset_Analyse* theAnalyse, Handle(BRepAlgo_AsDes)& theAsDes, TopTools_DataMapOfShapeShape& theFacesOrigins, TopTools_DataMapOfShapeListOfShape& theOEImages, @@ -820,7 +862,7 @@ TopTools_IndexedDataMapOfShapeListOfShape& theFImages, TopTools_DataMapOfShapeListOfShape& theDMFNewHoles, TopoDS_Shape& theSolids, - TopTools_DataMapOfShapeListOfShape& theSSInterfs) + BRepOffset_MakeOffset_InterResults& theIntRes) { if (theLF.IsEmpty()) { return; @@ -831,18 +873,20 @@ // // processed faces TopTools_ListOfShape aLFDone; - // extended face - list of neutral edges, i.e. in one splits - valid and in others - invalid - TopTools_DataMapOfShapeListOfShape aDMFLNE; - // list of valid edges for each face - TopTools_DataMapOfShapeListOfShape aDMFLVE; - // list of invalid edges for each face - TopTools_DataMapOfShapeListOfShape aDMFLIE; + // extended face - map of neutral edges, i.e. in one split - valid and in other - invalid + BRepOffset_DataMapOfShapeMapOfShape aDMFMNE; + // map of valid edges for each face + BRepOffset_DataMapOfShapeMapOfShape aDMFMVE; + // map of invalid edges for each face + BRepOffset_DataMapOfShapeIndexedMapOfShape aDMFMIE; // map of valid inverted edges for the face - TopTools_DataMapOfShapeListOfShape aDMFLVIE; + BRepOffset_DataMapOfShapeMapOfShape aDMFMVIE; // map of splits to check for internals TopTools_IndexedMapOfShape aMFToCheckInt; // map of edges created from vertex and marked as invalid TopTools_MapOfShape aMEdgeInvalidByVertex; + // map of edges created from vertex and marked as valid + TopTools_MapOfShape aMEdgeValidByVertex; // connection map from old edges to new ones TopTools_DataMapOfShapeListOfShape aDMEOrLEIm; // @@ -932,7 +976,7 @@ } // if (bArtificialCase) { - TopTools_ListOfShape aLEInv; + TopTools_IndexedMapOfShape aMEInv; // make the face invalid theArtInvFaces.Bind(aF, aCE); // @@ -945,7 +989,7 @@ const TopoDS_Shape& aE = aExpE.Current(); if (aMapEInv.Contains(aE)) { theInvEdges.Add(aE); - AppendToList(aLEInv, aE); + aMEInv.Add (aE); } else { theValidEdges.Add(aE); @@ -953,7 +997,7 @@ } } // - aDMFLIE.Bind(aF, aLEInv); + aDMFMIE.Bind(aF, aMEInv); aLFDone.Append(aF); // continue; @@ -961,9 +1005,9 @@ } // // find invalid edges - FindInvalidEdges(aF, aLFImages, theEdgesOrigins, theFacesOrigins, theOEImages, - theOEOrigins, theInvEdges, theValidEdges, aDMFLVE, aDMFLNE, aDMFLIE, - aDMFLVIE, aDMEOrLEIm, theInvertedEdges, aMEdgeInvalidByVertex); + FindInvalidEdges(aF, aLFImages, theEdgesOrigins, theFacesOrigins, theAnalyse, theOEImages, + theOEOrigins, theInvEdges, theValidEdges, aDMFMVE, aDMFMNE, aDMFMIE, + aDMFMVIE, aDMEOrLEIm, theInvertedEdges, aMEdgeInvalidByVertex, aMEdgeValidByVertex); // // save the new splits if (!pLFIm) { @@ -977,10 +1021,15 @@ aLFDone.Append(aF); } // - if (theInvEdges.IsEmpty() && theArtInvFaces.IsEmpty()) { + if (theInvEdges.IsEmpty() && theArtInvFaces.IsEmpty() && aDMFMIE.IsEmpty()) { return; } - // + + // Additional step to find invalid edges by checking unclassified edges + // in the splits of SD faces + FindInvalidEdges (aLFDone, theFImages, theFacesOrigins, theAnalyse, + theInvEdges, theValidEdges, aDMFMIE, aDMFMVE, aDMFMNE); + #ifdef OFFSET_DEBUG // show invalid edges TopoDS_Compound aCEInv1; @@ -1030,7 +1079,7 @@ } } - TopTools_ListOfShape anEmptyList; + TopTools_MapOfShape anEmptyMap; // invalid faces inside the holes TopTools_IndexedMapOfShape aMFInvInHole; // all hole faces @@ -1050,18 +1099,13 @@ if (bArtificialCase) { aLFInv = aLFImages; } - else { + else + { // neutral edges - TopTools_ListOfShape* pLNE = aDMFLNE.ChangeSeek(aF); - if (!pLNE) { - pLNE = &anEmptyList; - } - // valid inverted edges - TopTools_ListOfShape* pLIVE = aDMFLVIE.ChangeSeek(aF); - if (!pLIVE) { - pLIVE = &anEmptyList; + const TopTools_MapOfShape* pMNE = aDMFMNE.ChangeSeek(aF); + if (!pMNE) { + pMNE = &anEmptyMap; } - // // find faces inside holes wires TopTools_MapOfShape aMFHoles; const TopoDS_Face& aFOr = TopoDS::Face(theFacesOrigins.Find(aF)); @@ -1074,8 +1118,8 @@ } // // find invalid faces - FindInvalidFaces(aLFImages, theInvEdges, theValidEdges, aDMFLVE, aDMFLIE, - *pLNE, *pLIVE, theInvertedEdges, aMEdgeInvalidByVertex, + FindInvalidFaces(aLFImages, theInvEdges, theValidEdges, aDMFMVE, aDMFMIE, + *pMNE, theInvertedEdges, aMEdgeInvalidByVertex, aMEdgeValidByVertex, aMFHoles, aMFInvInHole, aLFInv, anInvertedFaces); } // @@ -1123,12 +1167,13 @@ } // // remove invalid splits from valid splits - RemoveInvalidSplitsFromValid(theInvFaces, theArtInvFaces, theInvertedEdges, theFImages); + RemoveInvalidSplitsFromValid (theInvFaces, theArtInvFaces, theInvertedEdges, + aDMFMVIE, theFImages); // // remove inside faces TopTools_IndexedMapOfShape aMEInside; RemoveInsideFaces(theFImages, theInvFaces, theArtInvFaces, theInvEdges, theInvertedEdges, - anInvertedFaces, aMFToCheckInt, aMFInvInHole, aFHoles, theSSInterfs, + anInvertedFaces, aMFToCheckInt, aMFInvInHole, aFHoles, theIntRes, aMERemoved, aMEInside, theSolids); // // make compound of valid splits @@ -1152,7 +1197,7 @@ FilterEdgesImages(aCFIm, theOEImages, theOEOrigins); // // filter invalid faces - FilterInvalidFaces(theFImages, aDMEF, aMEInside, theInvFaces, theArtInvFaces); + FilterInvalidFaces(theFImages, aDMEF, theInvEdges, aMEInside, theInvFaces, theArtInvFaces); aNb = theInvFaces.Extent(); if (!aNb) { theInvEdges.Clear(); @@ -1175,8 +1220,12 @@ #endif // // filter invalid edges - FilterInvalidEdges(theInvFaces, theArtInvFaces, aDMFLIE, aMERemoved, theInvEdges); + FilterInvalidEdges(theInvFaces, theArtInvFaces, aDMFMIE, aMERemoved, theInvEdges); // + // Check additionally validity of edges originated from vertices. + CheckEdgesCreatedByVertex (theInvFaces, theArtInvFaces, theEdgesOrigins, + theValidEdges, theEdgesToAvoid); + #ifdef OFFSET_DEBUG // show invalid edges TopoDS_Compound aCEInv; @@ -1552,17 +1601,19 @@ const TopTools_ListOfShape& theLFImages, const TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, const TopTools_DataMapOfShapeShape& theFacesOrigins, + const BRepOffset_Analyse* theAnalyse, const TopTools_DataMapOfShapeListOfShape& theOEImages, const TopTools_DataMapOfShapeListOfShape& theOEOrigins, TopTools_IndexedMapOfShape& theInvEdges, TopTools_IndexedMapOfShape& theValidEdges, - TopTools_DataMapOfShapeListOfShape& theDMFLVE, - TopTools_DataMapOfShapeListOfShape& theDMFLNE, - TopTools_DataMapOfShapeListOfShape& theDMFLIE, - TopTools_DataMapOfShapeListOfShape& theDMFLVIE, + BRepOffset_DataMapOfShapeMapOfShape& theDMFMVE, + BRepOffset_DataMapOfShapeMapOfShape& theDMFMNE, + BRepOffset_DataMapOfShapeIndexedMapOfShape& theDMFMIE, + BRepOffset_DataMapOfShapeMapOfShape& theDMFMVIE, TopTools_DataMapOfShapeListOfShape& theDMEOrLEIm, TopTools_MapOfShape& theMEInverted, - TopTools_MapOfShape& theEdgesInvalidByVertex) + TopTools_MapOfShape& theEdgesInvalidByVertex, + TopTools_MapOfShape& theEdgesValidByVertex) { // Edge is considered as invalid in the following cases: // 1. Its orientation on the face has changed comparing to the originals edge and face; @@ -1584,6 +1635,8 @@ // maps for checking the inverted edges TopTools_IndexedDataMapOfShapeListOfShape aDMVE, aDMEF; TopTools_IndexedMapOfShape aMEdges; + // back map from the original shapes to their offset images + TopTools_DataMapOfShapeListOfShape anImages; // TopTools_ListIteratorOfListOfShape aItLF(theLFImages); for (; aItLF.More(); aItLF.Next()) { @@ -1613,6 +1666,22 @@ } AppendToList(*pLE, aE); } + + // back map from original edges to their offset images + const TopTools_ListOfShape* pLOr = theEdgesOrigins.Seek (aE); + if (!pLOr) + continue; + for (TopTools_ListOfShape::Iterator itOr (*pLOr); itOr.More(); itOr.Next()) + { + const TopoDS_Shape& aSOr = itOr.Value(); + TopoDS_Shape aSInF; + if (!FindShape (aSOr, aFOr, theAnalyse, aSInF)) + continue; + TopTools_ListOfShape* pImages = anImages.ChangeSeek (aSInF); + if (!pImages) + pImages = anImages.Bound (aSInF, TopTools_ListOfShape()); + AppendToList (*pImages, aE); + } } } // @@ -1625,9 +1694,9 @@ const TopoDS_Face& aFIm = *(TopoDS_Face*)&aItLF.Value(); // // valid edges for this split - TopTools_ListOfShape aLVE; + TopTools_MapOfShape aMVE; // invalid edges for this split - TopTools_ListOfShape aLIE; + TopTools_IndexedMapOfShape aMIE; // TopExp_Explorer aExp(aFIm, TopAbs_EDGE); for (; aExp.More(); aExp.Next()) { @@ -1654,10 +1723,12 @@ ++aNbVOr; } } + if (aNbVOr > 1 && (aLEOr.Extent() - aNbVOr) > 1) + continue; // - TopTools_MapOfShape aME, aMV; + TopTools_MapOfShape aME, aMV, aMF; Standard_Boolean bInvalid = Standard_False, bChecked = Standard_False; - Standard_Integer aNbP = NbPoints(aEIm); + Standard_Integer aNbP = NbPoints(aEIm), aNbInv = 0; Standard_Boolean bUseVertex = !aNbVOr ? Standard_False : (aNbVOr == 1 && aDMEF.FindFromKey(aEIm).Extent() == 1 && @@ -1684,16 +1755,26 @@ if (pLEFOr) { TopoDS_Compound aCEOr; BRep_Builder().MakeCompound(aCEOr); + // Avoid classification of edges originated from vertices + // located between tangent edges + Standard_Boolean bAllTgt = Standard_True; TopTools_ListIteratorOfListOfShape aItLEFOr(*pLEFOr); - for (; aItLEFOr.More(); aItLEFOr.Next()) { + gp_Vec aVRef = GetAverageTangent (aItLEFOr.Value(), aNbP); + for (; aItLEFOr.More(); aItLEFOr.Next()) + { const TopoDS_Shape& aEOr = aItLEFOr.Value(); BRep_Builder().Add(aCEOr, aEOr); + + gp_Vec aVCur = GetAverageTangent (aEOr, aNbP); + if (!aVRef.IsParallel (aVCur, Precision::Angular())) + bAllTgt = Standard_False; } - aEOrF = aCEOr; + if (!bAllTgt) + aEOrF = aCEOr; } } else { - FindShape(aSOr, aFOr, aEOrF); + FindShape(aSOr, aFOr, theAnalyse, aEOrF); // TopTools_ListOfShape *pLEIm = theDMEOrLEIm.ChangeSeek(aSOr); if (!pLEIm) { @@ -1706,22 +1787,56 @@ // the edge has not been found continue; } - // - // Check orientations of the image edge and original edge. - // In case the 3d curves are having the same direction the orientations - // must be the same. Otherwise the orientations should also be different. - // - // get average tangent vector for each curve taking into account - // the orientations of the edges, i.e. the edge is reversed - // the vector is reversed as well - gp_Vec aVSum1 = GetAverageTangent(aEIm, aNbP); - gp_Vec aVSum2 = GetAverageTangent(aEOrF, aNbP); - // - aVSum1.Normalize(); - aVSum2.Normalize(); - // - Standard_Real aCos = aVSum1.Dot(aVSum2); - if (!bVertex) { + + if (bVertex) + { + TopTools_MapOfShape aMVTotal; + Standard_Integer aNbChecked = 0; + // Just check if the original edges sharing the vertex do not share it any more. + for (TopoDS_Iterator it (aEOrF); it.More(); it.Next()) + { + const TopoDS_Shape& aEOr = it.Value(); + const TopTools_ListOfShape* aLIm = anImages.Seek (aEOr); + if (!aLIm) + continue; + ++aNbChecked; + TopTools_IndexedDataMapOfShapeListOfShape aMVLoc; + for (TopTools_ListOfShape::Iterator itLIM (*aLIm); itLIM.More(); itLIM.Next()) + TopExp::MapShapesAndAncestors (itLIM.Value(), TopAbs_VERTEX, TopAbs_EDGE, aMVLoc); + for (Standard_Integer i = 1; i <= aMVLoc.Extent(); ++i) + { + if (aMVLoc(i).Extent() > 1 && !aMVTotal.Add (aMVLoc.FindKey (i))) + { + bInvalid = Standard_True; + theEdgesInvalidByVertex.Add(aEIm); + break; + } + } + if (bInvalid) + break; + } + if (!bInvalid && aNbChecked < 2) + continue; + else + theEdgesValidByVertex.Add (aEIm); + } + else + { + // + // Check orientations of the image edge and original edge. + // In case the 3d curves are having the same direction the orientations + // must be the same. Otherwise the orientations should also be different. + // + // get average tangent vector for each curve taking into account + // the orientations of the edges, i.e. the edge is reversed + // the vector is reversed as well + gp_Vec aVSum1 = GetAverageTangent(aEIm, aNbP); + gp_Vec aVSum2 = GetAverageTangent(aEOrF, aNbP); + // + aVSum1.Normalize(); + aVSum2.Normalize(); + // + Standard_Real aCos = aVSum1.Dot(aVSum2); if (Abs(aCos) < 0.9999) { continue; } @@ -1732,12 +1847,16 @@ const TopoDS_Shape& aV = aExpE.Current(); aMV.Add(aV); } - } - // - if (aCos < Precision::Confusion()) { - bInvalid = Standard_True; - if (bVertex) { - theEdgesInvalidByVertex.Add(aEIm); + if (theAnalyse) + { + for (TopTools_ListOfShape::Iterator itFA (theAnalyse->Ancestors (aEOrF)); + itFA.More(); itFA.Next()) + aMF.Add (itFA.Value()); + } + // + if (aCos < Precision::Confusion()) { + bInvalid = Standard_True; + aNbInv++; } } bChecked = Standard_True; @@ -1747,46 +1866,78 @@ continue; } // + Standard_Boolean bLocalOnly = (aNbVOr > 1 && (aLEOr.Extent() - aNbVOr) > 1); Standard_Integer aNbE = aME.Extent(), aNbV = aMV.Extent(); - if ((aNbE > 1) && (aNbV == 2*aNbE)) { - continue; + if (aNbE > 1 && aNbV == 2*aNbE) + { + Standard_Boolean bSkip = Standard_True; + + // Allow the edge to be analyzed if it is: + // * originated from more than two faces + // * unanimously considered valid or invalid + // * not a boundary edge in the splits + if (aMF.Extent () > 2 && (aNbInv == 0 || aNbInv == aNbE)) + { + if (theLFImages.Extent() > 2) + { + TopoDS_Iterator itV (aEIm); + for (; itV.More(); itV.Next()) + { + TopTools_ListOfShape::Iterator itE (aDMVE.FindFromKey (itV.Value())); + for (; itE.More(); itE.Next()) + if (aDMEF.FindFromKey (itE.Value()).Extent() < 2) + break; + if (itE.More()) + break; + } + bSkip = itV.More(); + } + } + if (bSkip) + continue; + else + bLocalOnly = Standard_True; } // if (bInvalid) { - theInvEdges.Add(aEIm); - aLIE.Append(aEIm); + if (!bLocalOnly) + theInvEdges.Add(aEIm); + aMIE.Add (aEIm); aMEInv.Add(aEIm); continue; } // // check if the edge has been inverted - Standard_Boolean bInverted = !aNbE ? Standard_False : + Standard_Boolean bInverted = !aNbE || bLocalOnly ? Standard_False : CheckInverted(aEIm, aFOr, theOEImages, theOEOrigins, theEdgesOrigins, aDMVE, aMEdges, theMEInverted); // if (!bInverted || !aNbVOr) { - theValidEdges.Add(aEIm); - aLVE.Append(aEIm); + if (!bLocalOnly) + theValidEdges.Add(aEIm); + aMVE.Add (aEIm); aMEVal.Add(aEIm); } } // // valid edges - if (aLVE.Extent()) { - theDMFLVE.Bind(aFIm, aLVE); + if (aMVE.Extent()) + { + theDMFMVE.Bind (aFIm, aMVE); } // // invalid edges - if (aLIE.Extent()) { - theDMFLIE.Bind(aFIm, aLIE); + if (aMIE.Extent()) + { + theDMFMIE.Bind (aFIm, aMIE); } } // // process invalid edges: // check for the inverted edges - TopTools_ListOfShape aLVIE; + TopTools_MapOfShape aMVIE; // fill neutral edges - TopTools_ListOfShape aLNE; + TopTools_MapOfShape aMNE; // Standard_Integer i, aNbEInv = aMEInv.Extent(); for (i = 1; i <= aNbEInv; ++i) { @@ -1794,8 +1945,9 @@ // // neutral edges - on the splits of the same offset face // it is valid for one split and invalid for other - if (aMEVal.Contains(aEIm)) { - aLNE.Append(aEIm); + if (aMEVal.Contains(aEIm)) + { + aMNE.Add (aEIm); continue; } // @@ -1821,18 +1973,210 @@ !aMEInv.Contains(aEIm1) && !aMEInt.Contains(aEIm1) && theMEInverted.Contains(aEIm1)) { theInvEdges.Add(aEIm1); - aLVIE.Append(aEIm1); + aMVIE.Add (aEIm1); } } } } // - if (aLNE.Extent()) { - theDMFLNE.Bind(theF, aLNE); + if (aMNE.Extent()) + { + theDMFMNE.Bind (theF, aMNE); } // - if (aLVIE.Extent()) { - theDMFLVIE.Bind(theF, aLVIE); + if (aMVIE.Extent()) + { + theDMFMVIE.Bind (theF, aMVIE); + } +} + +namespace +{ + static void addAsNeutral (const TopoDS_Shape& theE, + const TopoDS_Shape& theFInv, + const TopoDS_Shape& theFVal, + BRepOffset_DataMapOfShapeIndexedMapOfShape& theLocInvEdges, + BRepOffset_DataMapOfShapeMapOfShape& theLocValidEdges) + { + TopTools_IndexedMapOfShape* pMEInv = theLocInvEdges.ChangeSeek (theFInv); + if (!pMEInv) + pMEInv = theLocInvEdges.Bound (theFInv, TopTools_IndexedMapOfShape()); + pMEInv->Add (theE); + + TopTools_MapOfShape* pMEVal = theLocValidEdges.ChangeSeek (theFVal); + if (!pMEVal) + pMEVal = theLocValidEdges.Bound (theFVal, TopTools_MapOfShape()); + pMEVal->Add (theE); + } + +} +//======================================================================= +//function : FindInvalidEdges +//purpose : Additional method to look for invalid faces +//======================================================================= +void FindInvalidEdges (const TopTools_ListOfShape& theLFOffset, + const TopTools_IndexedDataMapOfShapeListOfShape& theFImages, + const TopTools_DataMapOfShapeShape& theFacesOrigins, + const BRepOffset_Analyse* theAnalyse, + const TopTools_IndexedMapOfShape& theInvEdges, + const TopTools_IndexedMapOfShape& theValidEdges, + BRepOffset_DataMapOfShapeIndexedMapOfShape& theLocInvEdges, + BRepOffset_DataMapOfShapeMapOfShape& theLocValidEdges, + BRepOffset_DataMapOfShapeMapOfShape& theNeutralEdges) +{ + // 1. Find edges unclassified in faces + // 2. Find SD faces in which the same edge is classified + // 3. Check if the edge is neutral in face in which it wasn't classified + + NCollection_IndexedDataMap aMEUnclassified; + TopTools_DataMapOfShapeShape aFSplitFOffset; + + // Avoid artificial faces + TopTools_MapOfShape aNewFaces; + if (theAnalyse) + { + TopTools_MapOfShape aMapNewTmp; + for (TopTools_ListOfShape::Iterator it (theAnalyse->NewFaces()); it.More(); it.Next()) + aMapNewTmp.Add (it.Value()); + + for (TopTools_ListOfShape::Iterator it (theLFOffset); it.More(); it.Next()) + { + const TopoDS_Shape& aFOffset = it.Value(); + const TopoDS_Shape& aFOrigin = theFacesOrigins.Find (aFOffset); + if (aMapNewTmp.Contains (aFOrigin)) + aNewFaces.Add (aFOffset); + } + } + + TopTools_IndexedDataMapOfShapeListOfShape anEFMap; + for (TopTools_ListOfShape::Iterator itLFO (theLFOffset); itLFO.More(); itLFO.Next()) + { + const TopoDS_Shape& aF = itLFO.Value(); + if (aNewFaces.Contains (aF)) + continue; + + const TopTools_ListOfShape& aLFImages = theFImages.FindFromKey (aF); + for (TopTools_ListOfShape::Iterator itLF (aLFImages); itLF.More(); itLF.Next()) + { + const TopoDS_Shape& aFIm = itLF.Value(); + + TopExp::MapShapesAndAncestors (aFIm, TopAbs_EDGE, TopAbs_FACE, anEFMap); + + const TopTools_IndexedMapOfShape* pMEInvalid = theLocInvEdges.Seek (aFIm); + const TopTools_MapOfShape* pMEValid = theLocValidEdges.Seek (aFIm); + + for (TopExp_Explorer expE (aFIm, TopAbs_EDGE); expE.More(); expE.Next()) + { + const TopoDS_Shape& aE = expE.Current(); + if (theInvEdges.Contains (aE) != theValidEdges.Contains (aE)) + { + // edge is classified in some face + + if ((!pMEInvalid || !pMEInvalid->Contains (aE)) && + (!pMEValid || !pMEValid->Contains (aE))) + { + // but not in the current one + TopTools_MapOfShape *pMap = aMEUnclassified.ChangeSeek (aE); + if (!pMap) + pMap = &aMEUnclassified (aMEUnclassified.Add (aE, TopTools_MapOfShape())); + pMap->Add (aFIm); + + aFSplitFOffset.Bind (aFIm, aF); + } + } + } + } + } + + if (aMEUnclassified.IsEmpty()) + return; + + // Analyze unclassified edges + const Standard_Integer aNbE = aMEUnclassified.Extent(); + for (Standard_Integer iE = 1; iE <= aNbE; ++iE) + { + const TopoDS_Shape& aE = aMEUnclassified.FindKey (iE); + const TopTools_MapOfShape& aMFUnclassified = aMEUnclassified (iE); + + const TopTools_ListOfShape& aLF = anEFMap.FindFromKey (aE); + + for (TopTools_ListOfShape::Iterator itLF (aLF); itLF.More(); itLF.Next()) + { + const TopoDS_Shape& aFClassified = itLF.Value(); + if (aMFUnclassified.Contains (aFClassified)) + continue; + + BOPTools_Set anEdgeSetClass; + anEdgeSetClass.Add (aFClassified, TopAbs_EDGE); + + TopoDS_Shape aEClassified; + FindShape (aE, aFClassified, NULL, aEClassified); + TopAbs_Orientation anOriClass = aEClassified.Orientation(); + + gp_Dir aDNClass; + BOPTools_AlgoTools3D::GetNormalToFaceOnEdge (TopoDS::Edge (aEClassified), TopoDS::Face (aFClassified), aDNClass); + + const TopTools_IndexedMapOfShape* pMEInvalid = theLocInvEdges.Seek (aFClassified); + Standard_Boolean isInvalid = pMEInvalid && pMEInvalid->Contains (aE); + + for (TopTools_MapOfShape::Iterator itM (aMFUnclassified); itM.More(); itM.Next()) + { + const TopoDS_Shape& aFUnclassified = itM.Value(); + + BOPTools_Set anEdgeSetUnclass; + anEdgeSetUnclass.Add (aFUnclassified, TopAbs_EDGE); + + if (anEdgeSetClass.IsEqual (anEdgeSetUnclass)) + { + gp_Dir aDNUnclass; + BOPTools_AlgoTools3D::GetNormalToFaceOnEdge (TopoDS::Edge (aE), TopoDS::Face (aFUnclassified), aDNUnclass); + + Standard_Boolean isSameOri = aDNClass.IsEqual (aDNUnclass, Precision::Angular()); + + // Among other splits of the same face find those where the edge is contained with different + // orientation + const TopoDS_Shape& aFOffset = aFSplitFOffset.Find (aFUnclassified); + const TopTools_ListOfShape& aLFSplits = theFImages.FindFromKey (aFOffset); + TopTools_ListOfShape::Iterator itLFSp (aLFSplits); + for (; itLFSp.More(); itLFSp.Next()) + { + const TopoDS_Shape& aFSp = itLFSp.Value(); + + if (!aFSp.IsSame (aFUnclassified) && aMFUnclassified.Contains (aFSp)) + { + TopoDS_Shape aEUnclassified; + FindShape (aE, aFSp, NULL, aEUnclassified); + + TopAbs_Orientation anOriUnclass = aEUnclassified.Orientation(); + if (!isSameOri) + anOriUnclass = TopAbs::Reverse (anOriUnclass); + + if (anOriClass != anOriUnclass) + { + // make the edge neutral for the face + TopTools_MapOfShape* pMENeutral = theNeutralEdges.ChangeSeek (aFOffset); + if (!pMENeutral) + pMENeutral = theNeutralEdges.Bound (aFOffset, TopTools_MapOfShape()); + pMENeutral->Add (aE); + + if (isInvalid && isSameOri) + { + // make edge invalid in aFUnclassified and valid in aFSp + addAsNeutral (aE, aFClassified, aFSp, theLocInvEdges, theLocValidEdges); + } + else + { + // make edge invalid in aFSp and valid in aFUnclassified + addAsNeutral (aE, aFSp, aFClassified, theLocInvEdges, theLocValidEdges); + } + } + } + } + if (itLFSp.More()) + break; + } + } + } } } @@ -1843,12 +2187,12 @@ void FindInvalidFaces(TopTools_ListOfShape& theLFImages, const TopTools_IndexedMapOfShape& theInvEdges, const TopTools_IndexedMapOfShape& theValidEdges, - const TopTools_DataMapOfShapeListOfShape& theDMFLVE, - const TopTools_DataMapOfShapeListOfShape& theDMFLIE, - const TopTools_ListOfShape& theLENeutral, - const TopTools_ListOfShape& theLEValInverted, + const BRepOffset_DataMapOfShapeMapOfShape& theDMFMVE, + const BRepOffset_DataMapOfShapeIndexedMapOfShape& theDMFMIE, + const TopTools_MapOfShape& theMENeutral, const TopTools_MapOfShape& theMEInverted, const TopTools_MapOfShape& theEdgesInvalidByVertex, + const TopTools_MapOfShape& theEdgesValidByVertex, const TopTools_MapOfShape& theMFHoles, TopTools_IndexedMapOfShape& theMFInvInHole, TopTools_ListOfShape& theInvFaces, @@ -1867,21 +2211,7 @@ Standard_Boolean bHasValid, bAllValid, bAllInvalid, bHasReallyInvalid, bAllInvNeutral; Standard_Boolean bValid, bValidLoc, bInvalid, bInvalidLoc, bNeutral, bInverted; Standard_Boolean bIsInvalidByInverted; - Standard_Integer i, aNbChecked; - // - // neutral edges - TopTools_MapOfShape aMEN; - for (TopTools_ListIteratorOfListOfShape aItLE(theLENeutral); aItLE.More(); aItLE.Next()) - { - aMEN.Add(aItLE.Value()); - } - // - // valid inverted edges - TopTools_MapOfShape aMEValInverted; - for (TopTools_ListIteratorOfListOfShape aItLE(theLEValInverted); aItLE.More(); aItLE.Next()) - { - aMEValInverted.Add(aItLE.Value()); - } + Standard_Integer aNbChecked; // Standard_Boolean bTreatInvertedAsInvalid = (theLFImages.Extent() == 1); // @@ -1891,26 +2221,22 @@ // faces for post treat TopTools_ListOfShape aLFPT; // + TopTools_IndexedDataMapOfShapeListOfShape aDMEF; TopTools_ListIteratorOfListOfShape aItLF(theLFImages); + for (; aItLF.More(); aItLF.Next()) + { + const TopoDS_Face& aFIm = *(TopoDS_Face*)&aItLF.Value(); + TopExp::MapShapesAndAncestors (aFIm, TopAbs_EDGE, TopAbs_FACE, aDMEF); + } + + aItLF.Initialize (theLFImages); for (; aItLF.More(); ) { const TopoDS_Face& aFIm = *(TopoDS_Face*)&aItLF.Value(); // // valid edges for this split - TopTools_MapOfShape aMVE; + const TopTools_MapOfShape* pMVE = theDMFMVE.Seek (aFIm); // invalid edges for this split - TopTools_MapOfShape aMIE; - // - for (i = 0; i < 2; ++i) { - TopTools_MapOfShape& aME = !i ? aMVE : aMIE; - const TopTools_ListOfShape* pLE = !i ? theDMFLVE.Seek(aFIm) : theDMFLIE.Seek(aFIm); - if (pLE) { - TopTools_ListIteratorOfListOfShape aItLE(*pLE); - for (; aItLE.More(); aItLE.Next()) { - const TopoDS_Shape& aE = aItLE.Value(); - aME.Add(aE); - } - } - } + const TopTools_IndexedMapOfShape* pMIE = theDMFMIE.Seek (aFIm); // bHasValid = Standard_False; bAllValid = Standard_True; @@ -1927,34 +2253,39 @@ // bValid = theValidEdges.Contains(aEIm); bInvalid = theInvEdges.Contains(aEIm); + bNeutral = theMENeutral.Contains(aEIm); // - if (!bValid && !bInvalid) { + if (!bValid && !bInvalid && !bNeutral) { // edge has not been checked for some reason continue; } - // + + // skip not-boundary edges originated from vertex + if ((theEdgesInvalidByVertex.Contains (aEIm) || + theEdgesValidByVertex.Contains (aEIm)) && + aDMEF.FindFromKey (aEIm).Extent() != 1) + continue; + ++aNbChecked; // - bInvalidLoc = aMIE.Contains(aEIm); - bHasReallyInvalid = bInvalidLoc && !bValid && !theEdgesInvalidByVertex.Contains(aEIm); + bInvalidLoc = pMIE && pMIE->Contains (aEIm); + bHasReallyInvalid = bInvalid && bInvalidLoc && !bValid && !theEdgesInvalidByVertex.Contains(aEIm); if (bHasReallyInvalid) { break; } // - bNeutral = aMEN.Contains(aEIm); - bValidLoc = aMVE.Contains(aEIm); - // + bValidLoc = pMVE && pMVE->Contains(aEIm); bInverted = theMEInverted.Contains(aEIm); - if (!bInvalid && bTreatInvertedAsInvalid) { + if (!bInvalid && !bInvalidLoc && bTreatInvertedAsInvalid) { bInvalid = bInverted; } // - if (bValidLoc && (bNeutral || aMEValInverted.Contains(aEIm))) { + if (bValidLoc && bNeutral) { bHasValid = Standard_True; } // bAllValid &= bValidLoc; - bAllInvalid &= bInvalid; + bAllInvalid &= (bInvalid || bInvalidLoc); bAllInvNeutral &= (bAllInvalid && bNeutral); bIsInvalidByInverted &= (bInvalidLoc || bInverted); } @@ -2010,27 +2341,14 @@ if (aLFPT.IsEmpty() || aMENRem.IsEmpty()) { return; } - // - Standard_Integer aNb = aMENRem.Extent(); - for (i = 1; i <= aNb; ++i) { - aMEN.Remove(aMENRem(i)); - } - // + // check the splits once more aItLF.Initialize(aLFPT); for (; aItLF.More(); aItLF.Next()) { const TopoDS_Face& aFIm = *(TopoDS_Face*)&aItLF.Value(); // // valid edges for this split - TopTools_MapOfShape aMVE; - const TopTools_ListOfShape* pLVE = theDMFLVE.Seek(aFIm); - if (pLVE) { - TopTools_ListIteratorOfListOfShape aItLE(*pLVE); - for (; aItLE.More(); aItLE.Next()) { - const TopoDS_Shape& aE = aItLE.Value(); - aMVE.Add(aE); - } - } + const TopTools_MapOfShape* pMVE = theDMFMVE.Seek(aFIm); // bHasValid = Standard_False; bAllValid = Standard_True; @@ -2043,14 +2361,14 @@ // bValid = theValidEdges.Contains(aEIm); bInvalid = theInvEdges.Contains(aEIm); - bNeutral = aMEN.Contains(aEIm); - bValidLoc = aMVE.Contains(aEIm); + bNeutral = theMENeutral.Contains(aEIm) && !aMENRem.Contains (aEIm); + bValidLoc = pMVE && pMVE->Contains(aEIm); // if (!bInvalid && bTreatInvertedAsInvalid) { bInvalid = theMEInverted.Contains(aEIm); } // - if (bValidLoc && (bNeutral || aMEValInverted.Contains(aEIm))) { + if (bValidLoc && bNeutral) { bHasValid = Standard_True; } // @@ -2399,7 +2717,7 @@ const TopoDS_Shape& aEO = aItLOE.Value(); if (aEO.ShapeType() == TopAbs_EDGE && aMFence.Add(aEO)) { TopoDS_Shape aEOin; - if (FindShape(aEO, theFOr, aEOin)) { + if (FindShape(aEO, theFOr, NULL, aEOin)) { AppendToList(aLOE, aEO); } } @@ -2793,6 +3111,7 @@ void RemoveInvalidSplitsFromValid(const TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces, const TopTools_DataMapOfShapeShape& theArtInvFaces, const TopTools_MapOfShape& theMEInverted, + const BRepOffset_DataMapOfShapeMapOfShape& theDMFMVIE, TopTools_IndexedDataMapOfShapeListOfShape& theFImages) { // Decide whether to remove the found invalid faces or not. @@ -2868,22 +3187,49 @@ TopTools_IndexedDataMapOfShapeListOfShape aDMEF; TopExp::MapShapesAndAncestors(aCB, TopAbs_EDGE, TopAbs_FACE, aDMEF); // + TopTools_DataMapOfShapeListOfShape aDMFF; aExp.Init(aCB, TopAbs_FACE); for (; aExp.More(); aExp.Next()) { const TopoDS_Shape& aFCB = aExp.Current(); - // - TopExp_Explorer aExpE(aFCB, TopAbs_EDGE); - for (; aExpE.More(); aExpE.Next()) { - const TopoDS_Shape& aECB = aExpE.Current(); - if (aDMEF.FindFromKey(aECB).Extent() > 1) { - if (!theMEInverted.Contains(aECB)) { + const TopoDS_Shape& aF = aDMIFOF.Find (aFCB); + TopTools_ListOfShape* pList = aDMFF.ChangeSeek (aF); + if (!pList) + pList = aDMFF.Bound (aF, TopTools_ListOfShape()); + pList->Append (aFCB); + } + + for (TopTools_DataMapOfShapeListOfShape::Iterator itM (aDMFF); itM.More(); itM.Next()) + { + const TopoDS_Shape& aF = itM.Key(); + const TopTools_MapOfShape* pValidInverted = theDMFMVIE.Seek (aF); + + // either remove all of these faces or none. + const TopTools_ListOfShape& aLFCB = itM.Value(); + TopTools_ListOfShape::Iterator itL (aLFCB); + for (; itL.More(); itL.Next()) + { + const TopoDS_Shape& aFCB = itL.Value(); + TopExp_Explorer aExpE(aFCB, TopAbs_EDGE); + for (; aExpE.More(); aExpE.Next()) { + const TopoDS_Shape& aECB = aExpE.Current(); + if (pValidInverted && pValidInverted->Contains (aECB)) break; + if (aDMEF.FindFromKey(aECB).Extent() > 1) + { + if (!theMEInverted.Contains(aECB)) + break; } } + if (!aExpE.More()) + // if one removed - remove all + break; } - // - if (!aExpE.More()) { - aMFToRem.Add(aFCB); + if (itL.More()) + { + for (itL.Initialize (aLFCB); itL.More(); itL.Next()) + { + aMFToRem.Add (itL.Value()); + } } } } @@ -2908,6 +3254,186 @@ } } +namespace +{ +//======================================================================= +//function : buildPairs +//purpose : builds pairs of shapes +//======================================================================= +static void buildPairs (const TopTools_IndexedMapOfShape& theSMap, + BRepOffset_DataMapOfShapeMapOfShape& theIntPairs) +{ + const Standard_Integer aNbS = theSMap.Extent(); + if (aNbS < 2) + return; + for (Standard_Integer it1 = 1; it1 <= aNbS; ++it1) + { + const TopoDS_Shape& aS = theSMap (it1); + if (!theIntPairs.IsBound (aS)) + theIntPairs.Bind (aS, TopTools_MapOfShape()); + } + + for (Standard_Integer it1 = 1; it1 <= aNbS; ++it1) + { + const TopoDS_Shape& aS1 = theSMap (it1); + TopTools_MapOfShape& aMap1 = theIntPairs (aS1); + for (Standard_Integer it2 = it1 + 1; it2 <= aNbS; ++it2) + { + const TopoDS_Shape& aS2 = theSMap (it2); + aMap1.Add (aS2); + theIntPairs (aS2).Add (aS1); + } + } +} + +//======================================================================= +//function : buildIntersectionPairs +//purpose : builds intersection pairs +//======================================================================= +static void buildIntersectionPairs (const TopTools_IndexedDataMapOfShapeListOfShape& theFImages, + const TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces, + const BOPAlgo_Builder& theBuilder, + const TopTools_MapOfShape& theMFRemoved, + const TopTools_DataMapOfShapeShape& theFOrigins, + NCollection_DataMap& theIntPairs) +{ + TopAbs_ShapeEnum aCType = TopAbs_VERTEX; + // Build connection map from vertices to faces + TopTools_IndexedDataMapOfShapeListOfShape aDMVF; + TopExp::MapShapesAndAncestors (theBuilder.Shape(), aCType, TopAbs_FACE, aDMVF); + + const TopTools_DataMapOfShapeListOfShape& anImages = theBuilder.Images(); + const TopTools_DataMapOfShapeListOfShape& anOrigins = theBuilder.Origins(); + + // Find all faces connected to the not removed faces and build intersection pairs among them. + // For removed faces intersect only those connected to each other. + + for (Standard_Integer iF = 1; iF <= theInvFaces.Extent(); ++iF) + { + const TopoDS_Shape& aFInv = theInvFaces.FindKey (iF); + + TopoDS_Compound aCF, aCFRem; + BRep_Builder().MakeCompound (aCF); + BRep_Builder().MakeCompound (aCFRem); + + for (Standard_Integer iC = 0; iC < 2; ++iC) + { + const TopTools_ListOfShape& aLF = !iC ? theInvFaces (iF) : theFImages.FindFromKey (aFInv); + + for (TopTools_ListOfShape::Iterator it (aLF); it.More(); it.Next()) + { + TopTools_ListOfShape aLFIm; + TakeModified (it.Value(), anImages, aLFIm); + + for (TopTools_ListOfShape::Iterator itIm (aLFIm); itIm.More(); itIm.Next()) + { + const TopoDS_Shape& aFIm = itIm.Value(); + + if (theMFRemoved.Contains (aFIm)) + BRep_Builder().Add (aCFRem, aFIm); + else + BRep_Builder().Add (aCF, aFIm); + } + } + } + + TopTools_ListOfShape aLCB; + BOPTools_AlgoTools::MakeConnexityBlocks (aCF, TopAbs_EDGE, TopAbs_FACE, aLCB); + + if (aLCB.IsEmpty()) + continue; + + BRepOffset_DataMapOfShapeMapOfShape* pFInterMap = + theIntPairs.Bound (aFInv, BRepOffset_DataMapOfShapeMapOfShape()); + + // build pairs for not removed faces + for (TopTools_ListOfShape::Iterator itCB (aLCB); itCB.More(); itCB.Next()) + { + const TopoDS_Shape& aCB = itCB.Value(); + + TopTools_IndexedMapOfShape aMFInter; + for (TopExp_Explorer exp (aCB, aCType); exp.More(); exp.Next()) + { + const TopoDS_Shape& aCS = exp.Current(); + const TopTools_ListOfShape* pLFV = aDMVF.Seek (aCS); + if (!pLFV) + continue; + + for (TopTools_ListOfShape::Iterator itFV (*pLFV); itFV.More(); itFV.Next()) + { + const TopoDS_Shape& aFConnected = itFV.Value(); + + TopTools_ListOfShape aLFOr; + TakeModified (aFConnected, anOrigins, aLFOr); + for (TopTools_ListOfShape::Iterator itOr (aLFOr); itOr.More(); itOr.Next()) + { + const TopoDS_Shape* pFOr = theFOrigins.Seek (itOr.Value()); + if (pFOr) + aMFInter.Add (*pFOr); + } + } + } + + // build intersection pairs + buildPairs (aMFInter, *pFInterMap); + } + + aLCB.Clear(); + BOPTools_AlgoTools::MakeConnexityBlocks (aCFRem, TopAbs_EDGE, TopAbs_FACE, aLCB); + + if (aLCB.IsEmpty()) + continue; + + for (TopTools_ListOfShape::Iterator itCB (aLCB); itCB.More(); itCB.Next()) + { + const TopoDS_Shape& aCB = itCB.Value(); + + TopTools_IndexedDataMapOfShapeListOfShape aDMEF; + for (TopExp_Explorer exp (aCB, aCType); exp.More(); exp.Next()) + { + const TopoDS_Shape& aCS = exp.Current(); + const TopTools_ListOfShape* pLFV = aDMVF.Seek (aCS); + if (!pLFV) + continue; + + for (TopTools_ListOfShape::Iterator itFV (*pLFV); itFV.More(); itFV.Next()) + { + const TopoDS_Shape& aFConnected = itFV.Value(); + TopExp::MapShapesAndAncestors (aFConnected, TopAbs_EDGE, TopAbs_FACE, aDMEF); + } + } + + for (Standard_Integer iE = 1; iE <= aDMEF.Extent(); ++iE) + { + const TopTools_ListOfShape& aLFConnected = aDMEF (iE); + if (aLFConnected.Extent() < 2) + continue; + + TopTools_IndexedMapOfShape aMFInter; + for (TopTools_ListOfShape::Iterator itLF (aLFConnected); itLF.More(); itLF.Next()) + { + const TopoDS_Shape& aFConnected = itLF.Value(); + + TopTools_ListOfShape aLFOr; + TakeModified (aFConnected, anOrigins, aLFOr); + for (TopTools_ListOfShape::Iterator itOr (aLFOr); itOr.More(); itOr.Next()) + { + const TopoDS_Shape* pFOr = theFOrigins.Seek (itOr.Value()); + if (pFOr) + aMFInter.Add (*pFOr); + } + } + + buildPairs (aMFInter, *pFInterMap); + } + } + } +} + +} + //======================================================================= //function : RemoveInsideFaces //purpose : Looking for the inside faces that can be safely removed @@ -2921,7 +3447,7 @@ const TopTools_IndexedMapOfShape& theMFToCheckInt, const TopTools_IndexedMapOfShape& theMFInvInHole, const TopoDS_Shape& theFHoles, - TopTools_DataMapOfShapeListOfShape& theSSInterfs, + BRepOffset_MakeOffset_InterResults& theIntRes, TopTools_IndexedMapOfShape& theMERemoved, TopTools_IndexedMapOfShape& theMEInside, TopoDS_Shape& theSolids) @@ -2983,7 +3509,7 @@ // // get shapes connection for using in the rebuilding process // for the cases in which some of the intersection left undetected - ShapesConnections(theInvFaces, theInvEdges, aDMFImF, aMV, theSSInterfs); + ShapesConnections(theInvFaces, theInvEdges, aDMFImF, aMV, theIntRes.SSInterfs); // // find faces to remove const TopoDS_Shape& aSols = aMV.Shape(); @@ -3105,7 +3631,7 @@ const TopoDS_Shape& aFSol = pLSols->First(); // TopoDS_Shape aFx; - if (!FindShape(aFInvIm, aFSol, aFx)) { + if (!FindShape(aFInvIm, aFSol, NULL, aFx)) { continue; } // @@ -3184,6 +3710,11 @@ theMEInside.Add(aE); } } + + // build all possible intersection pairs basing on the intersection results + // taking into account removed faces. + if (aMFToRem.Extent()) + buildIntersectionPairs (theFImages, theInvFaces, aMV, aMFToRem, aDMFImF, theIntRes.InterPairs); } //======================================================================= @@ -3709,8 +4240,9 @@ //function : FilterInvalidFaces //purpose : Filtering of the invalid faces //======================================================================= -void FilterInvalidFaces(const TopTools_IndexedDataMapOfShapeListOfShape& theFImages, +void FilterInvalidFaces(TopTools_IndexedDataMapOfShapeListOfShape& theFImages, const TopTools_IndexedDataMapOfShapeListOfShape& theDMEF, + const TopTools_IndexedMapOfShape& theInvEdges, const TopTools_IndexedMapOfShape& theMERemoved, TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces, TopTools_DataMapOfShapeShape& theArtInvFaces) @@ -3721,10 +4253,12 @@ // do not remove invalid faces if it creates free edges // TopTools_IndexedDataMapOfShapeListOfShape aReallyInvFaces; + // Edge-Face connexity map of all splits, both invalid and valid + TopTools_IndexedDataMapOfShapeListOfShape aDMEFAll; TopTools_ListIteratorOfListOfShape aItLF; // - Standard_Integer i, aNb = theInvFaces.Extent(); - for (i = 1; i <= aNb; ++i) { + const Standard_Integer aNb = theInvFaces.Extent(); + for (Standard_Integer i = 1; i <= aNb; ++i) { const TopoDS_Shape& aF = theInvFaces.FindKey(i); const TopTools_ListOfShape& aLFInv = theInvFaces(i); // @@ -3742,7 +4276,7 @@ continue; } // - const TopTools_ListOfShape& aLFIm = theFImages.FindFromKey(aF); + TopTools_ListOfShape& aLFIm = theFImages.ChangeFromKey(aF); Standard_Boolean bInvalid = aLFIm.IsEmpty(); // if (!bInvalid) { @@ -3794,6 +4328,55 @@ bInvalid = aItLF.More(); } } + if (bInvalid) + { + if (aDMEFAll.IsEmpty()) + { + aDMEFAll = theDMEF; + for (Standard_Integer iF = 1; iF <= aNb; ++iF) + for (TopTools_ListOfShape::Iterator itLFInv (theInvFaces(iF)); itLFInv.More(); itLFInv.Next()) + TopExp::MapShapesAndAncestors (itLFInv.Value(), TopAbs_EDGE, TopAbs_FACE, aDMEFAll); + } + + TopTools_MapOfShape aLocalSplits; + for (Standard_Integer j = 0; j < 2; ++j) + for (aItLF.Initialize((!j ? aLFIm : aLFInv)); aItLF.More(); aItLF.Next()) + aLocalSplits.Add (aItLF.Value()); + + // Check if all invalid edges are located inside the split and do not touch + // any other faces both invalid and valid + aItLF.Initialize(aLFInv); + for (; aItLF.More(); aItLF.Next()) + { + const TopoDS_Shape& aFIm = aItLF.Value(); + TopExp_Explorer aExp(aFIm, TopAbs_EDGE); + for (; aExp.More(); aExp.Next()) + { + const TopoDS_Shape& aE = aExp.Current(); + if (theInvEdges.Contains (aE) && !theMERemoved.Contains (aE)) + { + const TopTools_ListOfShape& aLF = aDMEFAll.FindFromKey (aE); + TopTools_ListOfShape::Iterator itLF (aLF); + for (; itLF.More(); itLF.Next()) + { + if (!aLocalSplits.Contains (itLF.Value())) + break; + } + if (itLF.More()) + break; + } + } + if (aExp.More()) + break; + } + bInvalid = aItLF.More(); + if (!bInvalid) + { + aItLF.Initialize(aLFInv); + for (; aItLF.More(); aItLF.Next()) + AppendToList (aLFIm, aItLF.Value()); + } + } // if (bInvalid) { aReallyInvFaces.Add(aF, aLFInv); @@ -3804,12 +4387,62 @@ } //======================================================================= +//function : CheckEdgesCreatedByVertex +//purpose : Checks additionally the unchecked edges originated from vertices +//======================================================================= +void CheckEdgesCreatedByVertex (const TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces, + const TopTools_DataMapOfShapeShape& theArtInvFaces, + const TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, + const TopTools_IndexedMapOfShape& theValidEdges, + TopTools_IndexedMapOfShape& theInvEdges) +{ + // Mark the unchecked edges contained in invalid faces as invalid + const Standard_Integer aNbF = theInvFaces.Extent(); + for (Standard_Integer i = 1; i <= aNbF; ++i) + { + const TopoDS_Shape& aF = theInvFaces.FindKey (i); + if (theArtInvFaces.IsBound (aF)) + continue; + + const TopTools_ListOfShape& aLFIm = theInvFaces (i); + for (TopTools_ListOfShape::Iterator it (aLFIm); it.More(); it.Next()) + { + const TopoDS_Shape& aFIm = it.Value(); + for (TopExp_Explorer expE (aFIm, TopAbs_EDGE); expE.More(); expE.Next()) + { + const TopoDS_Shape& aE = expE.Current(); + if (theInvEdges.Contains (aE) + || theValidEdges.Contains (aE)) + { + continue; + } + + // check if this edges is created by vertex + const TopTools_ListOfShape* pLEOr = theEdgesOrigins.Seek (aE); + if (!pLEOr) + continue; + TopTools_ListOfShape::Iterator itLEO (*pLEOr); + for (; itLEO.More(); itLEO.Next()) + { + if (itLEO.Value().ShapeType() != TopAbs_VERTEX) + break; + } + if (!itLEO.More()) + { + theInvEdges.Add (aE); + } + } + } + } +} + +//======================================================================= //function : FilterInvalidEdges //purpose : Filtering the invalid edges according to currently invalid faces //======================================================================= void FilterInvalidEdges(const TopTools_IndexedDataMapOfShapeListOfShape& theInvFaces, const TopTools_DataMapOfShapeShape& theArtInvFaces, - const TopTools_DataMapOfShapeListOfShape& theDMFLIE, + const BRepOffset_DataMapOfShapeIndexedMapOfShape& theDMFMIE, const TopTools_IndexedMapOfShape& theMERemoved, TopTools_IndexedMapOfShape& theInvEdges) { @@ -3864,10 +4497,11 @@ for (i = 1; i <= aNb; ++i) { const TopoDS_Shape& aF = theInvFaces.FindKey(i); if (theArtInvFaces.IsBound(aF)) { - const TopTools_ListOfShape& aLEInv = theDMFLIE.Find(aF); - aItLF.Initialize(aLEInv); - for (; aItLF.More(); aItLF.Next()) { - const TopoDS_Shape& aE = aItLF.Value(); + const TopTools_IndexedMapOfShape& aMIE = theDMFMIE.Find(aF); + const Standard_Integer aNbIE = aMIE.Extent(); + for (Standard_Integer iE = 1; iE <= aNbIE; ++iE) + { + const TopoDS_Shape& aE = aMIE (iE); if (aMEInv.Contains(aE) && !aMEInvToAvoid.Contains(aE)) { aReallyInvEdges.Add(aE); } @@ -4026,7 +4660,8 @@ void RebuildFaces(const TopTools_IndexedDataMapOfShapeListOfShape& theFToRebuild, const TopTools_MapOfShape& theFSelfRebAvoid, const TopoDS_Shape& theSolids, - const TopTools_DataMapOfShapeListOfShape& theSSInterfs, + const BRepOffset_MakeOffset_InterResults& theIntRes, + const BRepOffset_Analyse* theAnalyse, TopTools_IndexedDataMapOfShapeListOfShape& theFImages, TopTools_DataMapOfShapeListOfShape& theDMFNewHoles, TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, @@ -4048,12 +4683,12 @@ TopTools_MapOfShape aModifiedEdges; // // 1. Intersect faces - IntersectFaces(theFToRebuild, theFSelfRebAvoid, theSolids, theSSInterfs, theFImages, theEdgesOrigins, theOEImages, + IntersectFaces(theFToRebuild, theFSelfRebAvoid, theSolids, theIntRes, theFImages, theEdgesOrigins, theOEImages, theOEOrigins, theInvEdges, theValidEdges, theInvertedEdges, theEdgesToAvoid, theInvFaces, theArtInvFaces, theVertsToAvoid, theETrimEInf, aModifiedEdges, theAsDes); // // 2. Repeat steps to build the correct faces - BuildSplitsOfInvFaces(theFToRebuild, aModifiedEdges, theFImages, theDMFNewHoles, theEdgesOrigins, + BuildSplitsOfInvFaces(theFToRebuild, aModifiedEdges, theAnalyse, theFImages, theDMFNewHoles, theEdgesOrigins, theFacesOrigins, theOEImages, theOEOrigins, theLastInvEdges, theEdgesToAvoid, theVertsToAvoid, theAlreadyInvFaces, theValidEdges, theETrimEInf, theAsDes); @@ -4067,7 +4702,7 @@ void IntersectFaces(const TopTools_IndexedDataMapOfShapeListOfShape& theFToRebuild, const TopTools_MapOfShape& theFSelfRebAvoid, const TopoDS_Shape& theSolids, - const TopTools_DataMapOfShapeListOfShape& theSSInterfs, + const BRepOffset_MakeOffset_InterResults& theIntRes, TopTools_IndexedDataMapOfShapeListOfShape& theFImages, TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, TopTools_DataMapOfShapeListOfShape& theOEImages, @@ -4378,12 +5013,13 @@ TopTools_IndexedMapOfShape aMFAvoid; // FindFacesForIntersection(aFInv, aME, theFImages, aDMSF, aMVInvAll, - theArtInvFaces, bArtificial, theSSInterfs, aMFAvoid, aMFInt, aMFIntExt, aLFInt); + theArtInvFaces, bArtificial, theIntRes.SSInterfs, aMFAvoid, aMFInt, aMFIntExt, aLFInt); if (aMFInt.Extent() < 3) { // nothing to intersect continue; } // + const BRepOffset_DataMapOfShapeMapOfShape* pMFInter = theIntRes.InterPairs.Seek (aFInv); // intersect the faces, but do not intersect the invalid ones // among each other (except for the artificially invalid faces) TopTools_IndexedMapOfShape aMEToInt; @@ -4400,12 +5036,19 @@ // TopTools_ListOfShape& aLFDone = aMDone.ChangeFind(aFi); // + const TopTools_MapOfShape* pInterFi = !pMFInter ? 0 : pMFInter->Seek (aFi); + if (pMFInter && !pInterFi) + continue; + for (j = i + 1; j <= aNb; ++j) { const TopoDS_Face& aFj = TopoDS::Face(aMFInt(j)); if (bSelfRebAvoid && aFj.IsSame(aFInv)) { continue; } // + if (pInterFi && !pInterFi->Contains (aFj)) + continue; + const TopTools_ListOfShape& aLFImj = theFImages.FindFromKey(aFj); // TopTools_ListOfShape& aLFEj = aFLE.ChangeFromKey(aFj); @@ -5035,7 +5678,9 @@ TopAbs_State aSide = TopAbs_OUT; TopTools_ListOfShape aLInt1, aLInt2; TopoDS_Edge aNullEdge; - BRepOffset_Tool::Inter3D(TopoDS::Face(theFi), TopoDS::Face(theFj), aLInt1, aLInt2, aSide, aNullEdge); + TopoDS_Face aNullFace; + BRepOffset_Tool::Inter3D(TopoDS::Face(theFi), TopoDS::Face(theFj), aLInt1, aLInt2, aSide, + aNullEdge, aNullFace, aNullFace); // if (aLInt1.IsEmpty()) { return; @@ -7118,6 +7763,7 @@ //======================================================================= Standard_Boolean FindShape(const TopoDS_Shape& theSWhat, const TopoDS_Shape& theSWhere, + const BRepOffset_Analyse* theAnalyse, TopoDS_Shape& theRes) { Standard_Boolean bFound = Standard_False; @@ -7131,6 +7777,25 @@ break; } } + + if (!bFound && theAnalyse) + { + const TopTools_ListOfShape *pLD = theAnalyse->Descendants (theSWhere); + if (pLD) + { + for (TopTools_ListOfShape::Iterator it (*pLD); it.More(); it.Next()) + { + const TopoDS_Shape& aS = it.Value(); + if (aS.IsSame (theSWhat)) + { + theRes = aS; + bFound = Standard_True; + break; + } + } + } + } + return bFound; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset.cxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -77,6 +77,7 @@ #include #include #include +#include #include #include #include @@ -245,7 +246,7 @@ // static methods //======================================================================= static - void GetEnlargedFaces(const TopoDS_Shape& theShape, + void GetEnlargedFaces(const TopTools_ListOfShape& theFaces, const BRepOffset_DataMapOfShapeOffset& theMapSF, const TopTools_DataMapOfShapeShape& theMES, TopTools_DataMapOfShapeShape& theFacesOrigins, @@ -281,25 +282,27 @@ BRepAlgo_Image& theImage); static - Standard_Boolean IsPlanar(const TopoDS_Shape& theS); +void RemoveSeamAndDegeneratedEdges(const TopoDS_Face& theFace, + const TopoDS_Face& theOldFace); static - void TrimEdge(TopoDS_Edge& NE, - const Handle(BRepAlgo_AsDes)& AsDes2d, - Handle(BRepAlgo_AsDes)& AsDes, - TopTools_DataMapOfShapeShape& theETrimEInf); + Standard_Boolean TrimEdge(TopoDS_Edge& NE, + const Handle(BRepAlgo_AsDes)& AsDes2d, + Handle(BRepAlgo_AsDes)& AsDes, + TopTools_DataMapOfShapeShape& theETrimEInf); static - void TrimEdges(const TopoDS_Shape& theShape, - const Standard_Real theOffset, - BRepOffset_DataMapOfShapeOffset& theMapSF, - TopTools_DataMapOfShapeShape& theMES, - TopTools_DataMapOfShapeShape& theBuild, - Handle(BRepAlgo_AsDes)& theAsDes, - Handle(BRepAlgo_AsDes)& theAsDes2d, - TopTools_IndexedMapOfShape& theNewEdges, - TopTools_DataMapOfShapeShape& theETrimEInf, - TopTools_DataMapOfShapeListOfShape& theEdgesOrigins); + Standard_Boolean TrimEdges(const TopoDS_Shape& theShape, + const Standard_Real theOffset, + const BRepOffset_Analyse& Analyse, + BRepOffset_DataMapOfShapeOffset& theMapSF, + TopTools_DataMapOfShapeShape& theMES, + TopTools_DataMapOfShapeShape& theBuild, + Handle(BRepAlgo_AsDes)& theAsDes, + Handle(BRepAlgo_AsDes)& theAsDes2d, + TopTools_IndexedMapOfShape& theNewEdges, + TopTools_DataMapOfShapeShape& theETrimEInf, + TopTools_DataMapOfShapeListOfShape& theEdgesOrigins); static void AppendToList(TopTools_ListOfShape& theL, @@ -509,26 +512,26 @@ BRepTools_WireExplorer Wexp; for (; Explo.More(); Explo.Next()) + { + TopoDS_Face aFace = TopoDS::Face(Explo.Current()); + TopoDS_Iterator itf(aFace); + for (; itf.More(); itf.Next()) { - TopoDS_Face aFace = TopoDS::Face(Explo.Current()); - TopoDS_Iterator itf(aFace); - for (; itf.More(); itf.Next()) + TopoDS_Wire aWire = TopoDS::Wire(itf.Value()); + for (Wexp.Init(aWire, aFace); Wexp.More(); Wexp.Next()) + { + TopoDS_Edge anEdge = Wexp.Current(); + if (BRep_Tool::Degenerated(anEdge)) + continue; + const BRepOffset_ListOfInterval& Lint = Analyser.Type(anEdge); + if (!Lint.IsEmpty() && Lint.First().Type() == ChFiDS_FreeBound) { - TopoDS_Wire aWire = TopoDS::Wire(itf.Value()); - for (Wexp.Init(aWire, aFace); Wexp.More(); Wexp.Next()) - { - TopoDS_Edge anEdge = Wexp.Current(); - if (BRep_Tool::Degenerated(anEdge)) - continue; - const BRepOffset_ListOfInterval& Lint = Analyser.Type(anEdge); - if (!Lint.IsEmpty() && Lint.First().Type() == BRepOffset_FreeBoundary) - { - MapEF.Bind(anEdge, aFace); - Edges.Append(anEdge); - } - } + MapEF.Bind(anEdge, aFace); + Edges.Append(anEdge); } + } } + } TopTools_ListIteratorOfListOfShape itl; while (!Edges.IsEmpty()) @@ -588,6 +591,7 @@ : myOffset (Offset), myTol (Tol), +myInitialShape (S), myShape (S), myMode (Mode), myInter (Inter), @@ -598,6 +602,8 @@ myDone (Standard_False) { myAsDes = new BRepAlgo_AsDes(); + myIsLinearizationAllowed = Standard_True; + MakeOffsetShape(); } @@ -618,6 +624,7 @@ const Standard_Boolean RemoveIntEdges) { myOffset = Offset; + myInitialShape = S; myShape = S; myTol = Tol; myMode = Mode; @@ -626,6 +633,7 @@ myJoin = Join; myThickening = Thickening; myRemoveIntEdges = RemoveIntEdges; + myIsLinearizationAllowed = Standard_True; myDone = Standard_False; myIsPerformSewing = Standard_False; myIsPlanar = Standard_False; @@ -644,10 +652,25 @@ myInitOffsetFace .Clear(); myInitOffsetEdge .Clear(); myImageOffset .Clear(); + myImageVV .Clear(); myFaces .Clear(); + myOriginalFaces .Clear(); myFaceOffset .Clear(); + myEdgeIntEdges .Clear(); myAsDes ->Clear(); myDone = Standard_False; + myGenerated.Clear(); + myResMap.Clear(); +} + +//======================================================================= +//function : AllowLinearization +//purpose : +//======================================================================= + +void BRepOffset_MakeOffset::AllowLinearization(const Standard_Boolean theIsAllowed) +{ + myIsLinearizationAllowed = theIsAllowed; } //======================================================================= @@ -656,13 +679,8 @@ //======================================================================= void BRepOffset_MakeOffset::AddFace(const TopoDS_Face& F) { - myFaces.Add(F); - //------------- - // MAJ SD. - //------------- - myInitOffsetFace.SetRoot (F) ; - myInitOffsetFace.Bind (F,F); - myImageOffset.SetRoot (F) ; + + myOriginalFaces.Add(F); } //======================================================================= @@ -673,8 +691,7 @@ void BRepOffset_MakeOffset::SetOffsetOnFace(const TopoDS_Face& F, const Standard_Real Off) { - if ( myFaceOffset.IsBound(F)) myFaceOffset.UnBind(F); - myFaceOffset.Bind(F,Off); + myFaceOffset.Bind(F, Off); } //======================================================================= @@ -768,6 +785,50 @@ } } +//======================================================================= +//function : SetFaces +//purpose : +//======================================================================= + +void BRepOffset_MakeOffset::SetFaces() +{ + for (Standard_Integer ii = 1; ii <= myOriginalFaces.Extent(); ii++) + { + TopoDS_Face aFace = TopoDS::Face(myOriginalFaces(ii)); + const TopoDS_Shape* aPlanface = myFacePlanfaceMap.Seek(aFace); + if (aPlanface) + aFace = TopoDS::Face(*aPlanface); + + myFaces.Add(aFace); + //------------- + // MAJ SD. + //------------- + myInitOffsetFace.SetRoot (aFace) ; + myInitOffsetFace.Bind (aFace, aFace); + myImageOffset.SetRoot (aFace) ; + } +} + +//======================================================================= +//function : SetFacesWithOffset +//purpose : +//======================================================================= + +void BRepOffset_MakeOffset::SetFacesWithOffset() +{ + TopTools_DataMapIteratorOfDataMapOfShapeShape anItmap(myFacePlanfaceMap); + for (; anItmap.More(); anItmap.Next()) + { + TopoDS_Face aFace = TopoDS::Face(anItmap.Key()); + TopoDS_Face aPlanface = TopoDS::Face(anItmap.Value()); + if (myFaceOffset.IsBound(aFace)) + { + Standard_Real anOffset = myFaceOffset(aFace); + myFaceOffset.UnBind(aFace); + myFaceOffset.Bind(aPlanface, anOffset); + } + } +} //======================================================================= //function : MakeOffsetShape @@ -778,14 +839,22 @@ { myDone = Standard_False; // + // check if shape consists of only planar faces - myIsPlanar = IsPlanar(myShape); + myIsPlanar = IsPlanar(); + + SetFaces(); + SetFacesWithOffset(); + + BuildFaceComp(); + //------------------------------------------ // Construction of myShape without caps. //------------------------------------------ if(!myFaces.IsEmpty()) { - RemoveCorks (myShape,myFaces); + RemoveCorks (myShape, myOriginalFaces); + RemoveCorks (myFaceComp, myFaces); } if (!CheckInputData()) @@ -794,7 +863,7 @@ // Check Error() method. return; } - + myError = BRepOffset_NoError; TopAbs_State Side = TopAbs_IN; if (myOffset < 0.) Side = TopAbs_OUT; @@ -805,7 +874,12 @@ // There are possible second variant: analytical continuation of arcsin. Standard_Real TolAngleCoeff = Min(myTol / (Abs(myOffset * 0.5) + Precision::Confusion()), 1.0); Standard_Real TolAngle = 4*ASin(TolAngleCoeff); - myAnalyse.Perform(myShape,TolAngle); + if ((myJoin == GeomAbs_Intersection) && myInter && myIsPlanar) + { + myAnalyse.SetOffsetValue (myOffset); + myAnalyse.SetFaceOffsetMap (myFaceOffset); + } + myAnalyse.Perform(myFaceComp,TolAngle); //--------------------------------------------------- // Construction of Offset from preanalysis. //--------------------------------------------------- @@ -818,6 +892,10 @@ BuildOffsetByArc(); else if (myJoin == GeomAbs_Intersection) BuildOffsetByInter(); + if (myError != BRepOffset_NoError) + { + return; + } //----------------- // Auto unwinding. //----------------- @@ -870,6 +948,10 @@ // Coding of regularities. //---------------------------------- EncodeRegularity(); + //---------------------------------- + // Replace roots in history maps + //---------------------------------- + ReplaceRoots(); //---------------------- // Creation of solids. //---------------------- @@ -1042,7 +1124,7 @@ // Standard_Boolean OffsetOutside = (myOffset > 0.); // - BRepLib::SortFaces(myShape, aLF); + BRepLib::SortFaces(myFaceComp, aLF); // aItLF.Initialize(aLF); for (; aItLF.More(); aItLF.Next()) { @@ -1050,11 +1132,11 @@ aCurOffset = myFaceOffset.IsBound(aF) ? myFaceOffset(aF) : myOffset; BRepOffset_Offset OF(aF, aCurOffset, ShapeTgt, OffsetOutside, myJoin); TopTools_ListOfShape Let; - myAnalyse.Edges(aF,BRepOffset_Tangent,Let); + myAnalyse.Edges(aF,ChFiDS_Tangential,Let); TopTools_ListIteratorOfListOfShape itl(Let); for (; itl.More(); itl.Next()) { const TopoDS_Edge& Cur = TopoDS::Edge(itl.Value()); - if ( !ShapeTgt.IsBound(Cur)) { + if ( !ShapeTgt.IsBound(Cur) && !myAnalyse.HasGenerated (Cur)) { TopoDS_Shape aLocalShape = OF.Generated(Cur); const TopoDS_Edge& OTE = TopoDS::Edge(aLocalShape); ShapeTgt.Bind(Cur,OF.Generated(Cur)); @@ -1063,14 +1145,14 @@ TopExp::Vertices (OTE,OV1,OV2); TopTools_ListOfShape LE; if (!ShapeTgt.IsBound(V1)) { - myAnalyse.Edges(V1,BRepOffset_Tangent,LE); + myAnalyse.Edges(V1,ChFiDS_Tangential,LE); const TopTools_ListOfShape& LA =myAnalyse.Ancestors(V1); if (LE.Extent() == LA.Extent()) ShapeTgt.Bind(V1,OV1); } if (!ShapeTgt.IsBound(V2)) { LE.Clear(); - myAnalyse.Edges(V2,BRepOffset_Tangent,LE); + myAnalyse.Edges(V2,ChFiDS_Tangential,LE); const TopTools_ListOfShape& LA =myAnalyse.Ancestors(V2); if (LE.Extent() == LA.Extent()) ShapeTgt.Bind(V2,OV2); @@ -1079,6 +1161,14 @@ } theMapSF.Bind(aF,OF); } + // + const TopTools_ListOfShape& aNewFaces = myAnalyse.NewFaces(); + for (TopTools_ListOfShape::Iterator it (aNewFaces); it.More(); it.Next()) + { + const TopoDS_Face& aF = TopoDS::Face (it.Value()); + BRepOffset_Offset OF(aF, 0.0, ShapeTgt, OffsetOutside, myJoin); + theMapSF.Bind (aF, OF); + } } //======================================================================= @@ -1122,16 +1212,24 @@ BRepOffset_Inter3d Inter3 (AsDes,Side,myTol); // Intersection between parallel faces - Inter3.ConnexIntByInt(myShape,MapSF,myAnalyse,MES,Build,Failed,myIsPlanar); + Inter3.ConnexIntByInt(myFaceComp,MapSF,myAnalyse,MES,Build,Failed,myIsPlanar); // Intersection with caps. Inter3.ContextIntByInt(myFaces,ExtentContext,MapSF,myAnalyse,MES,Build,Failed,myIsPlanar); - + TopTools_ListOfShape aLFaces; + for (Exp.Init(myFaceComp,TopAbs_FACE) ; Exp.More(); Exp.Next()) + aLFaces.Append (Exp.Current()); + for (TopTools_ListOfShape::Iterator it (myAnalyse.NewFaces()); it.More(); it.Next()) + aLFaces.Append (it.Value()); //--------------------------------------------------------------------------------- // Extension of neighbor edges of new edges and intersection between neighbors. //-------------------------------------------------------------------------------- Handle(BRepAlgo_AsDes) AsDes2d = new BRepAlgo_AsDes(); - IntersectEdges(myShape, MapSF, MES, Build, AsDes, AsDes2d); + IntersectEdges(aLFaces, MapSF, MES, Build, AsDes, AsDes2d); + if (myError != BRepOffset_NoError) + { + return; + } //----------------------------------------------------------- // Great restriction of new edges and update of AsDes. //------------------------------------------ ---------------- @@ -1142,7 +1240,11 @@ //Map of edges obtained after FACE-FACE (offsetted) intersection. //Key1 is edge trimmed by intersection points with other edges; //Item is not-trimmed edge. - TrimEdges(myShape, myOffset, MapSF, MES, Build, AsDes, AsDes2d, NewEdges, aETrimEInf, anEdgesOrigins); + if (!TrimEdges(myFaceComp, myOffset, myAnalyse, MapSF, MES, Build, AsDes, AsDes2d, NewEdges, aETrimEInf, anEdgesOrigins)) + { + myError = BRepOffset_CannotTrimEdges; + return; + } // //--------------------------------- // Intersection 2D on // @@ -1151,14 +1253,14 @@ TopTools_DataMapOfShapeShape aFacesOrigins; // offset face - initial face TopTools_ListOfShape LFE; BRepAlgo_Image IMOE; - GetEnlargedFaces(myShape, MapSF, MES, aFacesOrigins, IMOE, LFE); + GetEnlargedFaces(aLFaces, MapSF, MES, aFacesOrigins, IMOE, LFE); // TopTools_ListIteratorOfListOfShape itLFE(LFE); for (; itLFE.More(); itLFE.Next()) { const TopoDS_Face& NEF = TopoDS::Face(itLFE.Value()); Standard_Real aCurrFaceTol = BRep_Tool::Tolerance(NEF); - BRepOffset_Inter2d::Compute(AsDes, NEF, NewEdges, aCurrFaceTol, aDMVV); + BRepOffset_Inter2d::Compute(AsDes, NEF, NewEdges, aCurrFaceTol, myEdgeIntEdges, aDMVV); } //---------------------------------------------- // Intersections 2d on caps. @@ -1168,10 +1270,10 @@ { const TopoDS_Face& Cork = TopoDS::Face(myFaces(i)); Standard_Real aCurrFaceTol = BRep_Tool::Tolerance(Cork); - BRepOffset_Inter2d::Compute(AsDes, Cork, NewEdges, aCurrFaceTol, aDMVV); + BRepOffset_Inter2d::Compute(AsDes, Cork, NewEdges, aCurrFaceTol, myEdgeIntEdges, aDMVV); } // - BRepOffset_Inter2d::FuseVertices(aDMVV, AsDes); + BRepOffset_Inter2d::FuseVertices(aDMVV, AsDes, myImageVV); //------------------------------- // Unwinding of extended Faces. //------------------------------- @@ -1179,7 +1281,7 @@ TopTools_MapOfShape aMFDone; // if ((myJoin == GeomAbs_Intersection) && myInter && myIsPlanar) { - BuildSplitsOfExtendedFaces(LFE, AsDes, anEdgesOrigins, aFacesOrigins, aETrimEInf, IMOE); + BuildSplitsOfExtendedFaces(LFE, myAnalyse, AsDes, anEdgesOrigins, aFacesOrigins, aETrimEInf, IMOE); // TopTools_ListIteratorOfListOfShape aItLF(LFE); for (; aItLF.More(); aItLF.Next()) { @@ -1188,7 +1290,7 @@ } } else { - myMakeLoops.Build(LFE, AsDes, IMOE); + myMakeLoops.Build(LFE, AsDes, IMOE, myImageVV); } // #ifdef OCCT_DEBUG @@ -1197,8 +1299,9 @@ //--------------------------- // MAJ SD. for faces // //--------------------------- - for (Exp.Init(myShape,TopAbs_FACE) ; Exp.More(); Exp.Next()) { - const TopoDS_Shape& FI = Exp.Current(); + for (TopTools_ListOfShape::Iterator it (aLFaces); it.More(); it.Next()) + { + const TopoDS_Shape& FI = it.Value(); myInitOffsetFace.SetRoot(FI); TopoDS_Face OF = MapSF(FI).Face(); if (MES.IsBound(OF)) { @@ -1327,9 +1430,9 @@ // Add methods for supporting history. TopTools_MapOfShape aMapEdges; - for (Exp.Init(myShape,TopAbs_FACE) ; Exp.More(); Exp.Next()) { - const TopoDS_Shape& aFaceRef = Exp.Current(); - + for (TopTools_ListOfShape::Iterator it (aLFaces); it.More(); it.Next()) + { + const TopoDS_Shape& aFaceRef = it.Value(); Exp2.Init(aFaceRef.Oriented(TopAbs_FORWARD), TopAbs_EDGE); for (; Exp2.More(); Exp2.Next()) { @@ -1435,6 +1538,66 @@ DEBVerticesControl (COES,myAsDes); if ( ChronBuild) Clock.Show(); #endif + +} + +//======================================================================= +//function : ReplaceRoots +//purpose : +//======================================================================= +void BRepOffset_MakeOffset::ReplaceRoots() +{ + // Replace the artificial faces and edges in InitOffset maps with the original ones. + TopTools_MapOfShape View; + for (TopExp_Explorer anExpF (myFaceComp, TopAbs_EDGE); anExpF.More(); anExpF.Next()) + { + const TopoDS_Shape& aF = anExpF.Current(); + for (TopExp_Explorer anExpE (aF, TopAbs_EDGE); anExpE.More(); anExpE.Next()) + { + const TopoDS_Shape& aE = anExpE.Current(); + if (!View.Add (aE)) + continue; + + TopoDS_Shape aFGen = myAnalyse.Generated (aE); + if (aFGen.IsNull()) + continue; + + myInitOffsetFace.ReplaceRoot (aFGen, aE); + + for (TopoDS_Iterator itV (aE); itV.More(); itV.Next()) + { + const TopoDS_Shape& aV = itV.Value(); + if (!View.Add (aV)) + continue; + + TopoDS_Shape aEGen = myAnalyse.Generated (aV); + if (aEGen.IsNull()) + continue; + + myInitOffsetEdge.ReplaceRoot (aEGen, aV); + } + } + } +} + +//======================================================================= +//function : BuildFaceComp +//purpose : Make a compound containing actual faces (including planar faces instead of their originals) +//======================================================================= +void BRepOffset_MakeOffset::BuildFaceComp() +{ + BRep_Builder aBB; + aBB.MakeCompound(myFaceComp); + TopExp_Explorer anExplo(myShape, TopAbs_FACE); + for (; anExplo.More(); anExplo.Next()) + { + TopoDS_Shape aFace = anExplo.Current(); + TopAbs_Orientation anOr = aFace.Orientation(); + const TopoDS_Shape* aPlanface = myFacePlanfaceMap.Seek(aFace); + if (aPlanface) + aFace = *aPlanface; + aBB.Add(myFaceComp, aFace.Oriented(anOr)); + } } //======================================================================= @@ -1463,10 +1626,10 @@ //-------------------------------------------------------- // Construction of tubes on edge. //-------------------------------------------------------- - BRepOffset_Type OT = BRepOffset_Convex; - if (myOffset < 0.) OT = BRepOffset_Concave; + ChFiDS_TypeOfConcavity OT = ChFiDS_Convex; + if (myOffset < 0.) OT = ChFiDS_Concave; - for (Exp.Init(myShape,TopAbs_EDGE); Exp.More(); Exp.Next()) { + for (Exp.Init(myFaceComp,TopAbs_EDGE); Exp.More(); Exp.Next()) { const TopoDS_Edge& E = TopoDS::Edge(Exp.Current()); if (Done.Add(E)) { const TopTools_ListOfShape& Anc = myAnalyse.Ancestors(E); @@ -1535,7 +1698,7 @@ Done.Clear(); TopTools_ListIteratorOfListOfShape it; - for (Exp.Init(myShape,TopAbs_VERTEX); Exp.More(); Exp.Next()) { + for (Exp.Init(myFaceComp,TopAbs_VERTEX); Exp.More(); Exp.Next()) { const TopoDS_Vertex& V = TopoDS::Vertex (Exp.Current()); if (Done.Add(V)) { const TopTools_ListOfShape& LA = myAnalyse.Ancestors(V); @@ -1566,7 +1729,7 @@ // Particular processing if V is at least a free border. //------------------------------------------------------------- TopTools_ListOfShape LBF; - myAnalyse.Edges(V,BRepOffset_FreeBoundary,LBF); + myAnalyse.Edges(V,ChFiDS_FreeBound,LBF); if (!LBF.IsEmpty()) { Standard_Boolean First = Standard_True; for (it.Initialize(LE) ; it.More(); it.Next()) { @@ -1592,8 +1755,8 @@ //------------------------------------------------------ // MAJ SD. //------------------------------------------------------ - BRepOffset_Type RT = BRepOffset_Concave; - if (myOffset < 0.) RT = BRepOffset_Convex; + ChFiDS_TypeOfConcavity RT = ChFiDS_Concave; + if (myOffset < 0.) RT = ChFiDS_Convex; BRepOffset_DataMapIteratorOfDataMapOfShapeOffset It(MapSF); for ( ; It.More(); It.Next()) { const TopoDS_Shape& SI = It.Key(); @@ -1737,8 +1900,8 @@ // Reconstruction of faces. //--------------------------- TopoDS_Face F,NF; - BRepOffset_Type RT = BRepOffset_Concave; - if (myOffset < 0.) RT = BRepOffset_Convex; + ChFiDS_TypeOfConcavity RT = ChFiDS_Concave; + if (myOffset < 0.) RT = ChFiDS_Convex; TopoDS_Shape OE,NE; TopAbs_Orientation Or; @@ -1825,8 +1988,8 @@ CopiedMap.Assign(myFaceOffset); TopTools_DataMapIteratorOfDataMapOfShapeReal it(CopiedMap); - BRepOffset_Type RT = BRepOffset_Convex; - if (myOffset < 0.) RT = BRepOffset_Concave; + ChFiDS_TypeOfConcavity RT = ChFiDS_Convex; + if (myOffset < 0.) RT = ChFiDS_Concave; for ( ; it.More(); it.Next()) { const TopoDS_Face& F = TopoDS::Face(it.Key()); @@ -1838,9 +2001,9 @@ TopTools_MapOfShape Dummy; Build.Add(Co,F); if (myJoin == GeomAbs_Arc) - myAnalyse.AddFaces(F,Co,Dummy,BRepOffset_Tangent,RT); + myAnalyse.AddFaces(F,Co,Dummy,ChFiDS_Tangential,RT); else - myAnalyse.AddFaces(F,Co,Dummy,BRepOffset_Tangent); + myAnalyse.AddFaces(F,Co,Dummy,ChFiDS_Tangential); TopExp_Explorer exp(Co,TopAbs_FACE); for (; exp.More(); exp.Next()) { @@ -2326,14 +2489,14 @@ Inter.CompletInt (OffsetFaces,myInitOffsetFace); TopTools_IndexedMapOfShape& NewEdges = Inter.NewEdges(); if (myJoin == GeomAbs_Intersection) { - BRepOffset_Tool::CorrectOrientation (myShape,NewEdges,myAsDes,myInitOffsetFace,myOffset); + BRepOffset_Tool::CorrectOrientation (myFaceComp,NewEdges,myAsDes,myInitOffsetFace,myOffset); } } else { //-------------------------------- // Only between neighbor faces. //-------------------------------- - Inter.ConnexIntByArc(OffsetFaces,myShape,myAnalyse,myInitOffsetFace); + Inter.ConnexIntByArc(OffsetFaces,myFaceComp,myAnalyse,myInitOffsetFace); } #ifdef OCCT_DEBUG if ( ChronBuild) Clock.Show(); @@ -2367,10 +2530,10 @@ Standard_Integer i; for (i = 1; i <= Modif.Extent(); i++) { const TopoDS_Face& F = TopoDS::Face(Modif(i)); - BRepOffset_Inter2d::Compute(myAsDes,F,NewEdges,myTol, aDMVV); + BRepOffset_Inter2d::Compute(myAsDes, F, NewEdges, myTol, myEdgeIntEdges, aDMVV); } // - BRepOffset_Inter2d::FuseVertices(aDMVV, myAsDes); + BRepOffset_Inter2d::FuseVertices(aDMVV, myAsDes, myImageVV); // #ifdef OCCT_DEBUG if (AffichInt2d) { @@ -2410,7 +2573,7 @@ BuildSplitsOfTrimmedFaces(LF, myAsDes, myImageOffset); } else { - myMakeLoops.Build(LF,myAsDes,myImageOffset); + myMakeLoops.Build(LF,myAsDes,myImageOffset,myImageVV); } //----------------------------------------- @@ -2515,7 +2678,7 @@ TopTools_DataMapOfShapeShape MapEF; //Edges of contours: edge + face Standard_Real OffsetVal = Abs(myOffset); - FillContours(myShape, myAnalyse, Contours, MapEF); + FillContours(myFaceComp, myAnalyse, Contours, MapEF); for (Standard_Integer ic = 1; ic <= Contours.Extent(); ic++) { @@ -3123,7 +3286,7 @@ void BRepOffset_MakeOffset::SelectShells () { TopTools_MapOfShape FreeEdges; - TopExp_Explorer exp(myShape,TopAbs_EDGE); + TopExp_Explorer exp(myFaceComp,TopAbs_EDGE); //------------------------------------------------------------- // FreeEdges all edges that can have free border in the // parallel shell @@ -3133,7 +3296,7 @@ const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); const TopTools_ListOfShape& LA = myAnalyse.Ancestors(E); if (LA.Extent() < 2) { - if (myAnalyse.Type(E).First().Type() == BRepOffset_FreeBoundary) { + if (myAnalyse.Type(E).First().Type() == ChFiDS_FreeBound) { FreeEdges.Add(E); } } @@ -3186,7 +3349,7 @@ const TopTools_IndexedMapOfShape& BRepOffset_MakeOffset::ClosingFaces () const { - return myFaces; + return myOriginalFaces; } @@ -3334,7 +3497,7 @@ if ( myAnalyse.HasAncestor(Ed)) { const BRepOffset_ListOfInterval& LI = myAnalyse.Type(Ed); if (LI.Extent() == 1 && - LI.First().Type() == BRepOffset_Tangent) { + LI.First().Type() == ChFiDS_Tangential) { B.Continuity(OE,F1,F2,GeomAbs_G1); } } @@ -3433,6 +3596,7 @@ Standard_Real aFirst, aLast; Handle(Geom_Curve) aCrv = BRep_Tool::Curve(E, aFirst, aLast); Standard_Real aMaxDist = ComputeMaxDist(aBAS.Plane(), aCrv, aFirst, aLast); + E.Locked (Standard_False); B.UpdateEdge(E, aMaxDist); isUpdated = Standard_True; } @@ -3455,6 +3619,7 @@ Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(V[i].TShape()); TV->Tolerance(0.); BRepCheck_Vertex VertexCorrector(V[i]); + V[i].Locked (Standard_False); B.UpdateVertex(V[i], VertexCorrector.Tolerance()); // use the occasion to clean the vertices. (TV->ChangePoints()).Clear(); @@ -3579,7 +3744,7 @@ } // Connectivity of input shape. - if (!IsConnectedShell(myShape)) + if (!IsConnectedShell(myFaceComp)) { myError = BRepOffset_NotConnectedShell; return Standard_False; @@ -3588,7 +3753,7 @@ // Normals check and continuity check. const Standard_Integer aPntPerDim = 20; // 21 points on each dimension. Standard_Real aUmin, aUmax, aVmin, aVmax; - TopExp_Explorer anExpSF(myShape, TopAbs_FACE); + TopExp_Explorer anExpSF(myFaceComp, TopAbs_FACE); NCollection_Map aPresenceMap; TopLoc_Location L; gp_Pnt2d aPnt2d; @@ -3822,7 +3987,7 @@ //function : IntersectEdges //purpose : //======================================================================= -void BRepOffset_MakeOffset::IntersectEdges(const TopoDS_Shape& theShape, +void BRepOffset_MakeOffset::IntersectEdges(const TopTools_ListOfShape& theFaces, BRepOffset_DataMapOfShapeOffset& theMapSF, TopTools_DataMapOfShapeShape& theMES, TopTools_DataMapOfShapeShape& theBuild, @@ -3831,14 +3996,18 @@ { Standard_Real aTolF; TopTools_IndexedDataMapOfShapeListOfShape aDMVV; - TopExp_Explorer aExp(theShape, TopAbs_FACE); // intersect edges created from edges TopTools_IndexedMapOfShape aMFV; - for (; aExp.More(); aExp.Next()) { - const TopoDS_Face& aF = TopoDS::Face(aExp.Current()); - aTolF = BRep_Tool::Tolerance(aF); - BRepOffset_Inter2d::ConnexIntByInt - (aF, theMapSF(aF), theMES, theBuild, theAsDes2d, myOffset, aTolF, aMFV, aDMVV); + for (TopTools_ListOfShape::Iterator it (theFaces); it.More(); it.Next()) + { + const TopoDS_Face& aF = TopoDS::Face (it.Value()); + aTolF = BRep_Tool::Tolerance (aF); + if (!BRepOffset_Inter2d::ConnexIntByInt(aF, theMapSF(aF), theMES, theBuild, theAsDes, theAsDes2d, + myOffset, aTolF, myAnalyse, aMFV, myImageVV, myEdgeIntEdges, aDMVV)) + { + myError = BRepOffset_CannotExtentEdge; + return; + } } // intersect edges created from vertices Standard_Integer i, aNbF = aMFV.Extent(); @@ -3846,35 +4015,55 @@ const TopoDS_Face& aF = TopoDS::Face(aMFV(i)); aTolF = BRep_Tool::Tolerance(aF); BRepOffset_Inter2d::ConnexIntByIntInVert - (aF, theMapSF(aF), theMES, theBuild, theAsDes, theAsDes2d, aTolF, aDMVV); + (aF, theMapSF(aF), theMES, theBuild, theAsDes, theAsDes2d, aTolF, myAnalyse, aDMVV); } // // fuse vertices on edges - BRepOffset_Inter2d::FuseVertices(aDMVV, theAsDes2d); + if (!BRepOffset_Inter2d::FuseVertices(aDMVV, theAsDes2d, myImageVV)) + { + myError = BRepOffset_CannotFuseVertices; + return; + } } //======================================================================= //function : TrimEdges //purpose : //======================================================================= -void TrimEdges(const TopoDS_Shape& theShape, - const Standard_Real theOffset, - BRepOffset_DataMapOfShapeOffset& theMapSF, - TopTools_DataMapOfShapeShape& theMES, - TopTools_DataMapOfShapeShape& theBuild, - Handle(BRepAlgo_AsDes)& theAsDes, - Handle(BRepAlgo_AsDes)& theAsDes2d, - TopTools_IndexedMapOfShape& theNewEdges, - TopTools_DataMapOfShapeShape& theETrimEInf, - TopTools_DataMapOfShapeListOfShape& theEdgesOrigins) +Standard_Boolean TrimEdges(const TopoDS_Shape& theShape, + const Standard_Real theOffset, + const BRepOffset_Analyse& Analyse, + BRepOffset_DataMapOfShapeOffset& theMapSF, + TopTools_DataMapOfShapeShape& theMES, + TopTools_DataMapOfShapeShape& theBuild, + Handle(BRepAlgo_AsDes)& theAsDes, + Handle(BRepAlgo_AsDes)& theAsDes2d, + TopTools_IndexedMapOfShape& theNewEdges, + TopTools_DataMapOfShapeShape& theETrimEInf, + TopTools_DataMapOfShapeListOfShape& theEdgesOrigins) { TopExp_Explorer Exp,Exp2,ExpC; TopoDS_Shape NE; TopoDS_Edge TNE; TopoDS_Face NF; - // - for (Exp.Init(theShape,TopAbs_FACE) ; Exp.More(); Exp.Next()) { - const TopoDS_Face& FI = TopoDS::Face(Exp.Current()); + + TopTools_ListOfShape aLFaces; + for (Exp.Init (theShape, TopAbs_FACE); Exp.More(); Exp.Next()) + aLFaces.Append (Exp.Current()); + + TopTools_MapOfShape aMFGenerated; + TopTools_IndexedDataMapOfShapeListOfShape aDMEF; + for (TopTools_ListOfShape::Iterator it (Analyse.NewFaces()); it.More(); it.Next()) + { + const TopoDS_Shape& aFG = it.Value(); + aLFaces.Append (aFG); + aMFGenerated.Add (aFG); + TopExp::MapShapesAndUniqueAncestors (aFG, TopAbs_EDGE, TopAbs_FACE, aDMEF); + } + + for (TopTools_ListOfShape::Iterator it (aLFaces); it.More(); it.Next()) + { + const TopoDS_Face& FI = TopoDS::Face (it.Value()); NF = theMapSF(FI).Face(); if (theMES.IsBound(NF)) { NF = TopoDS::Face(theMES(NF)); @@ -3909,7 +4098,8 @@ // trim edges if (NE.ShapeType() == TopAbs_EDGE) { if (theNewEdges.Add(NE)) { - TrimEdge (TopoDS::Edge(NE),theAsDes2d,theAsDes, theETrimEInf); + if (!TrimEdge (TopoDS::Edge(NE),theAsDes2d,theAsDes, theETrimEInf)) + return Standard_False; } } else { @@ -3922,7 +4112,8 @@ TopoDS_Edge NEC = TopoDS::Edge(ExpC.Current()); if (theNewEdges.Add(NEC)) { if (!theAsDes2d->Descendant(NEC).IsEmpty()) { - TrimEdge (NEC,theAsDes2d, theAsDes, theETrimEInf); + if(!TrimEdge (NEC,theAsDes2d, theAsDes, theETrimEInf)) + return Standard_False; } else { if (theAsDes->HasAscendant(NEC)) { @@ -3937,7 +4128,9 @@ if (aS.ShapeType() != TopAbs_EDGE) { continue; } - // + if (aMFGenerated.Contains (FI) && aDMEF.FindFromKey (aS).Extent() == 1) + continue; + NE = theMapSF(FI).Generated(aS); //// modified by jgv, 19.12.03 for OCC4455 //// NE.Orientation(aS.Orientation()); @@ -3952,7 +4145,8 @@ NE = theMES(NE); NE.Orientation(aS.Orientation()); if (theNewEdges.Add(NE)) { - TrimEdge (TopoDS::Edge(NE), theAsDes2d, theAsDes, theETrimEInf); + if (!TrimEdge (TopoDS::Edge(NE), theAsDes2d, theAsDes, theETrimEInf)) + return Standard_False; } } else { @@ -3968,6 +4162,7 @@ } } } + return Standard_True; } //======================================================================= @@ -3975,7 +4170,7 @@ //purpose : Trim the edge of the largest of descendants in AsDes2d. // Order in AsDes two vertices that have trimmed the edge. //======================================================================= -void TrimEdge(TopoDS_Edge& NE, +Standard_Boolean TrimEdge(TopoDS_Edge& NE, const Handle(BRepAlgo_AsDes)& AsDes2d, Handle(BRepAlgo_AsDes)& AsDes, TopTools_DataMapOfShapeShape& theETrimEInf) @@ -4013,7 +4208,9 @@ gp_Pnt thePoint = BRep_Tool::Pnt(V); GeomAPI_ProjectPointOnCurve Projector(thePoint, theCurve); if (Projector.NbPoints() == 0) - throw Standard_ConstructionError("BRepOffset_MakeOffset::TrimEdge no projection"); + { + return Standard_False; + } U = Projector.LowerDistanceParameter(); } if (U < UMin) { @@ -4025,7 +4222,7 @@ } // if (V1.IsNull() || V2.IsNull()) { - throw Standard_ConstructionError("BRepOffset_MakeOffset::TrimEdge"); + return Standard_False; } if (!V1.IsSame(V2)) { NE.Free( Standard_True ); @@ -4062,28 +4259,28 @@ theETrimEInf.Bind(NE, aSourceEdge); } } + return Standard_True; } //======================================================================= //function : GetEnlargedFaces //purpose : //======================================================================= -void GetEnlargedFaces(const TopoDS_Shape& theShape, +void GetEnlargedFaces(const TopTools_ListOfShape& theFaces, const BRepOffset_DataMapOfShapeOffset& theMapSF, const TopTools_DataMapOfShapeShape& theMES, TopTools_DataMapOfShapeShape& theFacesOrigins, BRepAlgo_Image& theImage, TopTools_ListOfShape& theLSF) { - TopExp_Explorer aExp(theShape, TopAbs_FACE); - for (; aExp.More(); aExp.Next()) { - const TopoDS_Shape& FI = aExp.Current(); + for (TopTools_ListOfShape::Iterator it (theFaces); it.More(); it.Next()) + { + const TopoDS_Shape& FI = it.Value(); const TopoDS_Shape& OFI = theMapSF(FI).Face(); if (theMES.IsBound(OFI)) { const TopoDS_Face& aLocalFace = TopoDS::Face(theMES(OFI)); theLSF.Append(aLocalFace); theImage.SetRoot(aLocalFace); - // theFacesOrigins.Bind(aLocalFace, FI); } } @@ -4247,6 +4444,152 @@ } //======================================================================= +//function : Generated +//purpose : +//======================================================================= +const TopTools_ListOfShape& BRepOffset_MakeOffset::Generated (const TopoDS_Shape& theS) +{ + myGenerated.Clear(); + const TopAbs_ShapeEnum aType = theS.ShapeType(); + switch (aType) + { + case TopAbs_VERTEX: + { + if (myAnalyse.HasAncestor (theS)) + { + TopTools_MapOfShape aMFence; + const TopTools_ListOfShape& aLA = myAnalyse.Ancestors (theS); + TopTools_ListOfShape::Iterator itLA (aLA); + for (; myGenerated.IsEmpty() && itLA.More(); itLA.Next()) + { + const TopoDS_Shape& aE = itLA.Value(); + if (!myInitOffsetEdge.HasImage (aE)) + continue; + TopTools_ListOfShape aLEIm; + myInitOffsetEdge.LastImage (aE, aLEIm); + TopTools_ListOfShape::Iterator itLEIm (aLEIm); + for (; myGenerated.IsEmpty() && itLEIm.More(); itLEIm.Next()) + { + TopoDS_Iterator itV (itLEIm.Value()); + for (; itV.More(); itV.Next()) + { + if (!aMFence.Add (itV.Value())) + { + myGenerated.Append (itV.Value()); + break; + } + } + } + } + } + } + Standard_FALLTHROUGH + case TopAbs_EDGE: + { + if (myInitOffsetEdge.HasImage (theS)) + { + myInitOffsetEdge.LastImage (theS, myGenerated); + } + } + Standard_FALLTHROUGH + case TopAbs_FACE: + { + TopoDS_Shape aS = theS; + const TopoDS_Shape* aPlanface = myFacePlanfaceMap.Seek(aS); + if (aPlanface) + aS = TopoDS::Face(*aPlanface); + + if (!myFaces.Contains (aS) && + myInitOffsetFace.HasImage (aS)) + { + myInitOffsetFace.LastImage (aS, myGenerated); + + if (!myFaces.IsEmpty()) + { + // Reverse generated shapes in case of small solids. + // Useful only for faces without influence on others. + TopTools_ListIteratorOfListOfShape it(myGenerated); + for (; it.More(); it.Next()) + it.Value().Reverse(); + } + } + break; + } + case TopAbs_SOLID: + { + if (theS.IsSame (myShape)) + myGenerated.Append (myOffsetShape); + break; + } + default: + break; + } + + if (myResMap.IsEmpty()) + TopExp::MapShapes (myOffsetShape, myResMap); + + for (TopTools_ListOfShape::Iterator it (myGenerated); it.More();) + { + if (myResMap.Contains (it.Value())) + it.Next(); + else + myGenerated.Remove (it); + } + + return myGenerated; +} + +//======================================================================= +//function : Modified +//purpose : +//======================================================================= +const TopTools_ListOfShape& BRepOffset_MakeOffset::Modified (const TopoDS_Shape& theShape) +{ + myGenerated.Clear(); + + if (theShape.ShapeType() == TopAbs_FACE) + { + TopoDS_Shape aS = theShape; + const TopoDS_Shape* aPlanface = myFacePlanfaceMap.Seek(aS); + if (aPlanface) + aS = TopoDS::Face(*aPlanface); + + if (myFaces.Contains (aS) && + myInitOffsetFace.HasImage (aS)) + { + myInitOffsetFace.LastImage (aS, myGenerated); + + if (!myFaces.IsEmpty()) + { + // Reverse generated shapes in case of small solids. + // Useful only for faces without influence on others. + TopTools_ListIteratorOfListOfShape it(myGenerated); + for (; it.More(); it.Next()) + it.Value().Reverse(); + } + } + } + + return myGenerated; +} + +//======================================================================= +//function : IsDeleted +//purpose : +//======================================================================= +Standard_Boolean BRepOffset_MakeOffset::IsDeleted (const TopoDS_Shape& theS) +{ + if (myResMap.IsEmpty()) + TopExp::MapShapes (myOffsetShape, myResMap); + + if (myResMap.Contains (theS)) + return Standard_False; + + return Generated (theS).IsEmpty() + && Modified (theS).IsEmpty(); +} + +//======================================================================= //function : GetSubShapes //purpose : //======================================================================= @@ -4274,17 +4617,127 @@ //function : IsPlanar //purpose : Checks if all the faces of the shape are planes //======================================================================= -Standard_Boolean IsPlanar(const TopoDS_Shape& theS) +Standard_Boolean BRepOffset_MakeOffset::IsPlanar() { - TopExp_Explorer aExp(theS, TopAbs_FACE); - for (; aExp.More(); aExp.Next()) { + Standard_Boolean aIsNonPlanarFound = Standard_False; + BRep_Builder aBB; + + TopExp_Explorer aExp(myShape, TopAbs_FACE); + for (; aExp.More(); aExp.Next()) + { const TopoDS_Face& aF = *(TopoDS_Face*)&aExp.Current(); BRepAdaptor_Surface aBAS(aF, Standard_False); - if (aBAS.GetType() != GeomAbs_Plane) { - break; + if (aBAS.GetType() == GeomAbs_Plane) + continue; + + if (myIsLinearizationAllowed) + { + //define the toleance + Standard_Real aTolForFace = BRep_Tool::Tolerance(aF); + + //try to linearize + Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aF); + GeomLib_IsPlanarSurface aPlanarityChecker(aSurf, Precision::Confusion()); + if (aPlanarityChecker.IsPlanar()) + { + gp_Pln aPln = aPlanarityChecker.Plan(); + Handle(Geom_Plane) aPlane = new Geom_Plane(aPln); + TopoDS_Face aPlanarFace; + aBB.MakeFace(aPlanarFace, aPlane, aTolForFace); + TopoDS_Face aFaceForward = aF; + aFaceForward.Orientation(TopAbs_FORWARD); + TopoDS_Iterator anItFace(aFaceForward); + for (; anItFace.More(); anItFace.Next()) + { + const TopoDS_Shape& aWire = anItFace.Value(); + aBB.Add(aPlanarFace, aWire); + } + RemoveSeamAndDegeneratedEdges(aPlanarFace, aFaceForward); + myFacePlanfaceMap.Bind(aF, aPlanarFace); + if (myFaces.Contains(aF)) + { + myFaces.RemoveKey(aF); + myFaces.Add(aPlanarFace); + } + } + else + aIsNonPlanarFound = Standard_True; } + else + aIsNonPlanarFound = Standard_True; + } + + return (!aIsNonPlanarFound); +} + +//======================================================================= +//function : RemoveSeamAndDegeneratedEdges +//purpose : Removes useless seam and degenerated edges from a face that becomes planar +//======================================================================= +void RemoveSeamAndDegeneratedEdges(const TopoDS_Face& theFace, + const TopoDS_Face& theOldFace) +{ + TopoDS_Face aFace = theFace; + aFace.Orientation(TopAbs_FORWARD); + + Standard_Boolean aIsDegOrSeamFound = Standard_False; + TopTools_SequenceOfShape aEseq; + TopExp_Explorer anExplo(aFace, TopAbs_EDGE); + for (; anExplo.More(); anExplo.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge(anExplo.Current()); + if (BRep_Tool::Degenerated(anEdge) || + BRepTools::IsReallyClosed(anEdge, theOldFace)) + aIsDegOrSeamFound = Standard_True; + else + aEseq.Append(anEdge); + } + + if (!aIsDegOrSeamFound) + return; + + //Reconstruct wires + BRep_Builder aBB; + TopTools_ListOfShape aWlist; + TopoDS_Iterator anItFace(aFace); + for (; anItFace.More(); anItFace.Next()) + aWlist.Append(anItFace.Value()); + + aFace.Free(Standard_True); + TopTools_ListIteratorOfListOfShape anItl(aWlist); + for (; anItl.More(); anItl.Next()) + aBB.Remove(aFace, anItl.Value()); + + while (!aEseq.IsEmpty()) + { + TopoDS_Wire aNewWire; + aBB.MakeWire(aNewWire); + TopoDS_Edge aCurEdge = TopoDS::Edge(aEseq(1)); + aBB.Add(aNewWire, aCurEdge); + aEseq.Remove(1); + TopoDS_Vertex aFirstVertex, aCurVertex; + TopExp::Vertices(aCurEdge, aFirstVertex, aCurVertex, Standard_True); //with orientation + while (!aCurVertex.IsSame(aFirstVertex)) + { + TopoDS_Vertex aV1, aV2; + Standard_Integer ind; + for (ind = 1; ind <= aEseq.Length(); ind++) + { + aCurEdge = TopoDS::Edge(aEseq(ind)); + TopExp::Vertices(aCurEdge, aV1, aV2, Standard_True); //with orientation + if (aV1.IsSame(aCurVertex)) + break; + } + if (ind > aEseq.Length()) //error occured: wire is not closed + break; + + aBB.Add(aNewWire, aCurEdge); + aEseq.Remove(ind); + aCurVertex = aV2; + } + + aBB.Add(aFace, aNewWire); } - return !aExp.More(); } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset.hxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset.hxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_MakeOffset.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -50,7 +51,6 @@ DEFINE_STANDARD_ALLOC - Standard_EXPORT BRepOffset_MakeOffset(); Standard_EXPORT BRepOffset_MakeOffset(const TopoDS_Shape& S, @@ -75,6 +75,9 @@ Standard_EXPORT void Clear(); + //! Changes the flag allowing the linearization + Standard_EXPORT void AllowLinearization (const Standard_Boolean theIsAllowed); + //! Add Closing Faces, has to be in the initial //! shape S. Standard_EXPORT void AddFace (const TopoDS_Face& F); @@ -92,6 +95,11 @@ Standard_EXPORT const TopoDS_Shape& Shape() const; + const TopoDS_Shape& InitShape() const + { + return myInitialShape; + } + //! returns information about offset state. Standard_EXPORT BRepOffset_Error Error() const; @@ -121,12 +129,36 @@ //! Return bad shape, which obtained in CheckInputData. Standard_EXPORT const TopoDS_Shape& GetBadShape() const; +public: //! @name History methods + + //! Returns the list of shapes generated from the shape . + Standard_EXPORT const TopTools_ListOfShape& Generated (const TopoDS_Shape& theS); + + //! Returns the list of shapes modified from the shape . + Standard_EXPORT const TopTools_ListOfShape& Modified (const TopoDS_Shape& theS); + + //! Returns true if the shape S has been deleted. + Standard_EXPORT Standard_Boolean IsDeleted (const TopoDS_Shape& S); + protected: private: + //! Check if shape consists of only planar faces + //! If is TRUE, try to approximate images of faces + //! by planar faces + Standard_EXPORT Standard_Boolean IsPlanar(); + + //! Set the faces that are to be removed + Standard_EXPORT void SetFaces(); + + //! Set the faces with special value of offset + Standard_EXPORT void SetFacesWithOffset(); + + Standard_EXPORT void BuildFaceComp(); + Standard_EXPORT void BuildOffsetByArc(); Standard_EXPORT void BuildOffsetByInter(); @@ -152,6 +184,9 @@ Standard_EXPORT void EncodeRegularity(); + //! Replace roots in history maps + Standard_EXPORT void ReplaceRoots(); + Standard_EXPORT void MakeSolid(); Standard_EXPORT void ToContext (BRepOffset_DataMapOfShapeOffset& MapSF); @@ -169,7 +204,7 @@ Standard_EXPORT void RemoveInternalEdges(); //! Intersects edges - Standard_EXPORT void IntersectEdges (const TopoDS_Shape& theShape, + Standard_EXPORT void IntersectEdges (const TopTools_ListOfShape& theFaces, BRepOffset_DataMapOfShapeOffset& theMapSF, TopTools_DataMapOfShapeShape& theMES, TopTools_DataMapOfShapeShape& theBuild, @@ -181,6 +216,7 @@ //! for BRepOffset_MakeLoops::Build method. //! Currently the Complete intersection mode is limited to work only on planar cases. Standard_EXPORT void BuildSplitsOfExtendedFaces(const TopTools_ListOfShape& theLF, + const BRepOffset_Analyse& theAnalyse, Handle(BRepAlgo_AsDes)& theAsDes, TopTools_DataMapOfShapeListOfShape& theEdgesOrigins, TopTools_DataMapOfShapeShape& theFacesOrigins, @@ -195,8 +231,11 @@ Standard_Real myOffset; Standard_Real myTol; + TopoDS_Shape myInitialShape; TopoDS_Shape myShape; + TopoDS_Compound myFaceComp; BRepOffset_Mode myMode; + Standard_Boolean myIsLinearizationAllowed; Standard_Boolean myInter; Standard_Boolean mySelfInter; GeomAbs_JoinType myJoin; @@ -204,20 +243,25 @@ Standard_Boolean myRemoveIntEdges; TopTools_DataMapOfShapeReal myFaceOffset; TopTools_IndexedMapOfShape myFaces; + TopTools_IndexedMapOfShape myOriginalFaces; BRepOffset_Analyse myAnalyse; TopoDS_Shape myOffsetShape; BRepAlgo_Image myInitOffsetFace; BRepAlgo_Image myInitOffsetEdge; BRepAlgo_Image myImageOffset; + BRepAlgo_Image myImageVV; TopTools_ListOfShape myWalls; Handle(BRepAlgo_AsDes) myAsDes; + TopTools_DataMapOfShapeListOfShape myEdgeIntEdges; Standard_Boolean myDone; BRepOffset_Error myError; BRepOffset_MakeLoops myMakeLoops; Standard_Boolean myIsPerformSewing; // Handle bad walls in thicksolid mode. Standard_Boolean myIsPlanar; TopoDS_Shape myBadShape; - + TopTools_DataMapOfShapeShape myFacePlanfaceMap; + TopTools_ListOfShape myGenerated; + TopTools_MapOfShape myResMap; }; #endif // _BRepOffset_MakeOffset_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Offset.cxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Offset.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Offset.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Offset.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1613,50 +1613,52 @@ { TopoDS_Shape aShape; - switch ( myShape.ShapeType()) { - - case TopAbs_FACE: + switch ( myShape.ShapeType()) + { + case TopAbs_FACE: { - TopExp_Explorer exp (myShape.Oriented(TopAbs_FORWARD), TopAbs_EDGE); - TopExp_Explorer expo(myFace .Oriented(TopAbs_FORWARD), TopAbs_EDGE); - for ( ; exp.More() && expo.More(); exp.Next(), expo.Next()) { - if ( Shape.IsSame(exp.Current())) { - if ( myShape.Orientation() == TopAbs_REVERSED) - aShape = expo.Current().Reversed(); - else - aShape = expo.Current(); - } + TopExp_Explorer exp (myShape.Oriented(TopAbs_FORWARD), TopAbs_EDGE); + TopExp_Explorer expo (myFace .Oriented(TopAbs_FORWARD), TopAbs_EDGE); + for (; exp.More() && expo.More(); exp.Next(), expo.Next()) + { + if (Shape.IsSame (exp.Current())) + { + if (myShape.Orientation() == TopAbs_REVERSED) + aShape = expo.Current().Reversed(); + else + aShape = expo.Current(); + break; + } } } break; - case TopAbs_EDGE: + case TopAbs_EDGE: // have generate a pipe. { TopoDS_Vertex V1, V2; TopExp::Vertices(TopoDS::Edge(myShape), V1, V2); - - TopExp_Explorer expf(myFace .Oriented(TopAbs_FORWARD), TopAbs_WIRE); - TopExp_Explorer expo(expf.Current().Oriented(TopAbs_FORWARD), - TopAbs_EDGE); + + TopExp_Explorer expf(myFace.Oriented(TopAbs_FORWARD), TopAbs_WIRE); + TopExp_Explorer expo(expf.Current().Oriented(TopAbs_FORWARD), TopAbs_EDGE); expo.Next(); expo.Next(); if ( V2.IsSame(Shape)) { - if ( expf.Current().Orientation() == TopAbs_REVERSED) - aShape = expo.Current().Reversed(); - else - aShape = expo.Current(); + if (expf.Current().Orientation() == TopAbs_REVERSED) + aShape = expo.Current().Reversed(); + else + aShape = expo.Current(); } else { - expo.Next(); - if ( expf.Current().Orientation() == TopAbs_REVERSED) - aShape = expo.Current().Reversed(); - else - aShape = expo.Current(); + expo.Next(); + if (expf.Current().Orientation() == TopAbs_REVERSED) + aShape = expo.Current().Reversed(); + else + aShape = expo.Current(); } - if ( myFace.Orientation() == TopAbs_REVERSED) - aShape.Reverse(); + if (myFace.Orientation() == TopAbs_REVERSED) + aShape.Reverse(); } break; default: diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Tool.cxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Tool.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Tool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Tool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -181,26 +181,6 @@ } //======================================================================= -//function : OriEdgeInFace -//purpose : -//======================================================================= - -TopAbs_Orientation BRepOffset_Tool::OriEdgeInFace (const TopoDS_Edge& E, - const TopoDS_Face& F ) - -{ - TopExp_Explorer Exp; - Exp.Init(F.Oriented(TopAbs_FORWARD),TopAbs_EDGE); - - for (; Exp.More() ;Exp.Next()) { - if (Exp.Current().IsSame(E)) { - return Exp.Current().Orientation(); - } - } - throw Standard_ConstructionError("BRepOffset_Tool::OriEdgeInFace"); -} - -//======================================================================= //function : FindPeriod //purpose : //======================================================================= @@ -1365,7 +1345,11 @@ { TopoDS_Vertex CV, V11, V12, V21, V22; TopExp::CommonVertex( CurEdge, anEdge, CV ); - Standard_Boolean IsAutonomCV = IsAutonomVertex( CV, pDS, F1, F2 ); + Standard_Boolean IsAutonomCV = Standard_False; + if (!CV.IsNull()) + { + IsAutonomCV = IsAutonomVertex(CV, pDS, F1, F2); + } if (IsAutonomCV) { aGlueTol = BRep_Tool::Tolerance(CV); @@ -1417,8 +1401,9 @@ TopTools_ListOfShape& L1, TopTools_ListOfShape& L2, const TopAbs_State Side, - const TopoDS_Edge& RefEdge, - const Standard_Boolean IsRefEdgeDefined) + const TopoDS_Edge& RefEdge, + const TopoDS_Face& theRefFace1, + const TopoDS_Face& theRefFace2) { #ifdef DRAW if (AffichInter) { @@ -1461,7 +1446,7 @@ aPF.Perform(); TopTools_IndexedMapOfShape TrueEdges; - if (IsRefEdgeDefined) + if (!RefEdge.IsNull()) CheckIntersFF( aPF.PDS(), RefEdge, TrueEdges ); Standard_Boolean addPCurve1 = 1; @@ -1510,33 +1495,33 @@ if (!BOPTools_AlgoTools2D::HasCurveOnSurface(anEdge, F1)) { Handle(Geom2d_Curve) aC2d = aBC.Curve().FirstCurve2d(); if(!aC3DETrim.IsNull()) { - Handle(Geom2d_Curve) aC2dNew; - - if(aC3DE->IsPeriodic()) { - BOPTools_AlgoTools2D::AdjustPCurveOnFace(F1, f, l, aC2d, aC2dNew, aContext); - } - else { - BOPTools_AlgoTools2D::AdjustPCurveOnFace(F1, aC3DETrim, aC2d, aC2dNew, aContext); - } - aC2d = aC2dNew; - } - BB.UpdateEdge(anEdge, aC2d, F1, aTolEdge); + Handle(Geom2d_Curve) aC2dNew; + + if(aC3DE->IsPeriodic()) { + BOPTools_AlgoTools2D::AdjustPCurveOnFace(F1, f, l, aC2d, aC2dNew, aContext); + } + else { + BOPTools_AlgoTools2D::AdjustPCurveOnFace(F1, aC3DETrim, aC2d, aC2dNew, aContext); + } + aC2d = aC2dNew; + } + BB.UpdateEdge(anEdge, aC2d, F1, aTolEdge); } if (!BOPTools_AlgoTools2D::HasCurveOnSurface(anEdge, F2)) { Handle(Geom2d_Curve) aC2d = aBC.Curve().SecondCurve2d(); if(!aC3DETrim.IsNull()) { - Handle(Geom2d_Curve) aC2dNew; - - if(aC3DE->IsPeriodic()) { - BOPTools_AlgoTools2D::AdjustPCurveOnFace(F2, f, l, aC2d, aC2dNew, aContext); - } - else { - BOPTools_AlgoTools2D::AdjustPCurveOnFace(F2, aC3DETrim, aC2d, aC2dNew, aContext); - } - aC2d = aC2dNew; - } - BB.UpdateEdge(anEdge, aC2d, F2, aTolEdge); + Handle(Geom2d_Curve) aC2dNew; + + if(aC3DE->IsPeriodic()) { + BOPTools_AlgoTools2D::AdjustPCurveOnFace(F2, f, l, aC2d, aC2dNew, aContext); + } + else { + BOPTools_AlgoTools2D::AdjustPCurveOnFace(F2, aC3DETrim, aC2d, aC2dNew, aContext); + } + aC2d = aC2dNew; + } + BB.UpdateEdge(anEdge, aC2d, F2, aTolEdge); } OrientSection (anEdge, F1, F2, O1, O2); @@ -1579,6 +1564,84 @@ else if (aSurf->IsKind(STANDARD_TYPE(Geom_ElementarySurface))) isEl2 = Standard_True; + if (L1.Extent() > 1 && (!isEl1 || !isEl2) && !theRefFace1.IsNull()) + { + //remove excess edges that are out of range + TopoDS_Vertex aV1, aV2; + TopExp::Vertices (RefEdge, aV1, aV2); + if (!aV1.IsSame(aV2)) //only if RefEdge is open + { + Handle(Geom_Surface) aRefSurf1 = BRep_Tool::Surface (theRefFace1); + Handle(Geom_Surface) aRefSurf2 = BRep_Tool::Surface (theRefFace2); + if (aRefSurf1->IsUClosed() || aRefSurf1->IsVClosed() || + aRefSurf2->IsUClosed() || aRefSurf2->IsVClosed()) + { + TopoDS_Edge MinAngleEdge; + Standard_Real MinAngle = Precision::Infinite(); + BRepAdaptor_Curve aRefBAcurve (RefEdge); + gp_Pnt aRefPnt = aRefBAcurve.Value ((aRefBAcurve.FirstParameter() + aRefBAcurve.LastParameter())/2); + + TopTools_ListIteratorOfListOfShape itl (L1); + for (; itl.More(); itl.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge (itl.Value()); + + BRepAdaptor_Curve aBAcurve (anEdge); + gp_Pnt aMidPntOnEdge = aBAcurve.Value ((aBAcurve.FirstParameter() + aBAcurve.LastParameter())/2); + gp_Vec RefToMid (aRefPnt, aMidPntOnEdge); + + Extrema_ExtPC aProjector (aRefPnt, aBAcurve); + if (aProjector.IsDone()) + { + Standard_Integer imin = 0; + Standard_Real MinSqDist = Precision::Infinite(); + for (Standard_Integer ind = 1; ind <= aProjector.NbExt(); ind++) + { + Standard_Real aSqDist = aProjector.SquareDistance(ind); + if (aSqDist < MinSqDist) + { + MinSqDist = aSqDist; + imin = ind; + } + } + if (imin != 0) + { + gp_Pnt aProjectionOnEdge = aProjector.Point(imin).Value(); + gp_Vec RefToProj (aRefPnt, aProjectionOnEdge); + Standard_Real anAngle = RefToProj.Angle(RefToMid); + if (anAngle < MinAngle) + { + MinAngle = anAngle; + MinAngleEdge = anEdge; + } + } + } + } + + if (!MinAngleEdge.IsNull()) + { + TopTools_ListIteratorOfListOfShape itlist1 (L1); + TopTools_ListIteratorOfListOfShape itlist2 (L2); + + while (itlist1.More()) + { + const TopoDS_Shape& anEdge = itlist1.Value(); + if (anEdge.IsSame(MinAngleEdge)) + { + itlist1.Next(); + itlist2.Next(); + } + else + { + L1.Remove(itlist1); + L2.Remove(itlist2); + } + } + } + } //if closed + } //if (!aV1.IsSame(aV2)) + } //if (L1.Extent() > 1 && (!isEl1 || !isEl2) && !theRefFace1.IsNull()) + if (L1.Extent() > 1 && (!isEl1 || !isEl2)) { TopTools_SequenceOfShape eseq; TopTools_SequenceOfShape EdgesForConcat; @@ -1740,7 +1803,7 @@ eseq.Append( aLocalEdgesForConcat(j) ); else eseq.Append( AssembledEdge ); - } + } //for (i = 1; i <= wseq.Length(); i++) } //end of else (when TrueEdges is empty) if (eseq.Length() < L1.Extent()) @@ -2968,7 +3031,11 @@ C.D0(U2,P); B.Add(P); } - B.Get(UMin,VMin,UMax,VMax); + + if (!B.IsVoid()) + B.Get(UMin,VMin,UMax,VMax); + else + BRep_Tool::Surface(F)->Bounds (UMin, UMax, VMin, VMax); } //======================================================================= @@ -3008,8 +3075,8 @@ const BRepOffset_ListOfInterval& L = Analyse.Type(anEdge); if (!L.IsEmpty() || BRep_Tool::Degenerated(anEdge)) { - BRepOffset_Type OT = L.First().Type(); - if (OT == BRepOffset_Tangent || BRep_Tool::Degenerated(anEdge)) + ChFiDS_TypeOfConcavity OT = L.First().Type(); + if (OT == ChFiDS_Tangential || BRep_Tool::Degenerated(anEdge)) { Standard_Real fpar, lpar; Handle(Geom2d_Curve) aCurve = BRep_Tool::CurveOnSurface(anEdge, F, fpar, lpar); @@ -3480,7 +3547,8 @@ if (ConstShapes.IsBound(E)) ToBuild.UnBind(E); if (ToBuild.IsBound(E)) { EnLargeFace(TopoDS::Face(ToBuild(E)),StopFace,Standard_False); - BRepOffset_Tool::Inter3D (EF,StopFace,LInt1,LInt2,Side,E,Standard_True); + TopoDS_Face NullFace; + BRepOffset_Tool::Inter3D (EF,StopFace,LInt1,LInt2,Side,E,NullFace,NullFace); // No intersection, it may happen for example for a chosen (non-offseted) planar face and // its neighbour offseted cylindrical face, if the offset is directed so that // the radius of the cylinder becomes smaller. diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Tool.hxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Tool.hxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Tool.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Tool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -53,10 +53,6 @@ //! taking account the orientation of Edge. Standard_EXPORT static void EdgeVertices (const TopoDS_Edge& E, TopoDS_Vertex& V1, TopoDS_Vertex& V2); - //! returns the cumul of the orientation of - //! and thc containing wire in - Standard_EXPORT static TopAbs_Orientation OriEdgeInFace (const TopoDS_Edge& E, const TopoDS_Face& F); - //! is a section between and . Computes //! the orientation of in influenced by . //! idem for . @@ -91,9 +87,10 @@ const TopoDS_Face& F2, TopTools_ListOfShape& LInt1, TopTools_ListOfShape& LInt2, - const TopAbs_State Side, - const TopoDS_Edge& RefEdge, - const Standard_Boolean IsRefEdgeDefined = Standard_False); + const TopAbs_State Side, + const TopoDS_Edge& RefEdge, + const TopoDS_Face& RefFace1, + const TopoDS_Face& RefFace2); //! Find if the edges of the face are on //! the face . diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Type.hxx opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Type.hxx --- opencascade-7.4.1+dfsg1/src/BRepOffset/BRepOffset_Type.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/BRepOffset_Type.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -// Created on: 1995-10-12 -// Created by: Bruno DUMORTIER -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _BRepOffset_Type_HeaderFile -#define _BRepOffset_Type_HeaderFile - - -enum BRepOffset_Type -{ -BRepOffset_Concave, -BRepOffset_Convex, -BRepOffset_Tangent, -BRepOffset_FreeBoundary, -BRepOffset_Other -}; - -#endif // _BRepOffset_Type_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffset/FILES opencascade-7.5.1+dfsg1/src/BRepOffset/FILES --- opencascade-7.4.1+dfsg1/src/BRepOffset/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffset/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -34,4 +34,3 @@ BRepOffset_Status.hxx BRepOffset_Tool.cxx BRepOffset_Tool.hxx -BRepOffset_Type.hxx diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx opencascade-7.5.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -118,24 +118,14 @@ const TopTools_ListOfShape& BRepOffsetAPI_MakeOffsetShape::Generated (const TopoDS_Shape& S) { myGenerated.Clear(); - - if (myLastUsedAlgo == OffsetAlgo_JOIN && !myOffsetShape.ClosingFaces().Contains(S)) + if (myLastUsedAlgo == OffsetAlgo_JOIN) { - myOffsetShape.OffsetFacesFromShapes ().LastImage (S, myGenerated); - - if (!myOffsetShape.ClosingFaces().IsEmpty()) - { - // Reverse generated shapes in case of small solids. - // Useful only for faces without influence on others. - TopTools_ListIteratorOfListOfShape it(myGenerated); - for (; it.More(); it.Next()) - it.Value().Reverse(); - } + myGenerated = myOffsetShape.Generated (S); } else if (myLastUsedAlgo == OffsetAlgo_SIMPLE) { TopoDS_Shape aGenShape = mySimpleOffsetShape.Generated(S); - if (!aGenShape.IsNull()) + if (!aGenShape.IsNull() && !aGenShape.IsSame (S)) myGenerated.Append(aGenShape); } @@ -143,27 +133,20 @@ } //======================================================================= -//function : GeneratedEdge +//function : Modified //purpose : //======================================================================= -const TopTools_ListOfShape& BRepOffsetAPI_MakeOffsetShape::GeneratedEdge (const TopoDS_Shape& S) +const TopTools_ListOfShape& BRepOffsetAPI_MakeOffsetShape::Modified (const TopoDS_Shape& S) { myGenerated.Clear(); - if (myLastUsedAlgo == OffsetAlgo_JOIN) { - myOffsetShape.OffsetEdgesFromShapes().LastImage (S, myGenerated); - - if (!myGenerated.IsEmpty()) - { - if (S.IsSame(myGenerated.First())) - myGenerated.RemoveFirst(); - } + myGenerated = myOffsetShape.Modified (S); } else if (myLastUsedAlgo == OffsetAlgo_SIMPLE) { - TopoDS_Shape aGenShape = mySimpleOffsetShape.Generated(S); - if (!aGenShape.IsNull()) + TopoDS_Shape aGenShape = mySimpleOffsetShape.Modified(S); + if (!aGenShape.IsNull() && !aGenShape.IsSame (S)) myGenerated.Append(aGenShape); } @@ -171,6 +154,19 @@ } //======================================================================= +//function : IsDeleted +//purpose : +//======================================================================= +Standard_Boolean BRepOffsetAPI_MakeOffsetShape::IsDeleted (const TopoDS_Shape& S) +{ + if (myLastUsedAlgo == OffsetAlgo_JOIN) + { + return myOffsetShape.IsDeleted(S); + } + return Standard_False; +} + +//======================================================================= //function : GetJoinType //purpose : Query offset join type. //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.hxx opencascade-7.5.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.hxx --- opencascade-7.4.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_MakeOffsetShape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -133,12 +133,15 @@ //! Does nothing. Standard_EXPORT virtual void Build() Standard_OVERRIDE; - //! Returns the list of shapes generated from the shape . + //! Returns the list of shapes generated from the shape . Standard_EXPORT virtual const TopTools_ListOfShape& Generated (const TopoDS_Shape& S) Standard_OVERRIDE; - - //! Returns the list of edges generated from the shape . - Standard_EXPORT const TopTools_ListOfShape& GeneratedEdge (const TopoDS_Shape& S); - + + //! Returns the list of shapes Modified from the shape . + Standard_EXPORT virtual const TopTools_ListOfShape& Modified (const TopoDS_Shape& S) Standard_OVERRIDE; + + //! Returns true if the shape has been removed from the result. + Standard_EXPORT virtual Standard_Boolean IsDeleted (const TopoDS_Shape& S) Standard_OVERRIDE; + //! Returns offset join type. Standard_EXPORT GeomAbs_JoinType GetJoinType() const; diff -Nru opencascade-7.4.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_ThruSections.cxx opencascade-7.5.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_ThruSections.cxx --- opencascade-7.4.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_ThruSections.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepOffsetAPI/BRepOffsetAPI_ThruSections.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -397,29 +397,30 @@ Standard_Integer IndFirstSec = 1; if (Georges.IsDegeneratedFirstSection()) IndFirstSec = 2; - TopoDS_Shape aWorkingSection = WorkingSections(IndFirstSec); + TopoDS_Wire aWorkingSection = TopoDS::Wire(WorkingSections(IndFirstSec)); myNbEdgesInSection += aWorkingSection.NbChildren(); for (Standard_Integer ii = 1; ii <= myWires.Length(); ii++) { - TopExp_Explorer Explo(myWires(ii), TopAbs_EDGE); - for (; Explo.More(); Explo.Next()) + TopoDS_Iterator itw(myWires(ii)); + for (; itw.More(); itw.Next()) { - const TopoDS_Edge& anEdge = TopoDS::Edge(Explo.Current()); + const TopoDS_Edge& anEdge = TopoDS::Edge(itw.Value()); Standard_Integer aSign = 1; TopoDS_Vertex Vfirst, Vlast; TopExp::Vertices(anEdge, Vfirst, Vlast); TopTools_ListOfShape aNewEdges = Georges.GeneratedShapes(anEdge); TColStd_ListOfInteger IList; - aWorkingSection = WorkingSections(ii); + aWorkingSection = TopoDS::Wire(WorkingSections(ii)); Standard_Integer NbNewEdges = aNewEdges.Extent(); TopTools_ListIteratorOfListOfShape itl(aNewEdges); for (Standard_Integer kk = 1; itl.More(); itl.Next(),kk++) { const TopoDS_Edge& aNewEdge = TopoDS::Edge(itl.Value()); Standard_Integer inde = 1; - for (TopoDS_Iterator itw (aWorkingSection); itw.More(); itw.Next(), inde++) + BRepTools_WireExplorer wexp(aWorkingSection); + for (; wexp.More(); wexp.Next(), inde++) { - const TopoDS_Shape& aWorkingEdge = itw.Value(); + const TopoDS_Shape& aWorkingEdge = wexp.Current(); if (aWorkingEdge.IsSame(aNewEdge)) { aSign = (aWorkingEdge.Orientation() == TopAbs_FORWARD)? 1 : -1; @@ -1295,12 +1296,14 @@ Standard_Integer Eindex = myVertexIndex(S); Standard_Integer Vindex = (Eindex > 0)? 0 : 1; Eindex = Abs(Eindex); - const TopoDS_Shape& FirstSection = myWires(1); + const TopoDS_Wire& FirstSection = TopoDS::Wire(myWires(1)); TopoDS_Edge FirstEdge; - TopoDS_Iterator itw(FirstSection); - for (Standard_Integer inde = 1; itw.More(); itw.Next(),inde++) + TopoDS_Vertex FirstVertexOfFirstEdge; + BRepTools_WireExplorer wexp(FirstSection); + for (Standard_Integer inde = 1; wexp.More(); wexp.Next(),inde++) { - FirstEdge = TopoDS::Edge(itw.Value()); + FirstEdge = wexp.Current(); + FirstVertexOfFirstEdge = wexp.CurrentVertex(); if (inde == Eindex) break; } @@ -1330,7 +1333,20 @@ FirstEdgeInFace = Explo.Current(); TopoDS_Vertex VV [2]; TopExp::Vertices(FirstEdge, VV[0], VV[1]); - FirstVertex = VV[Vindex]; + if (Vindex == 0) + { + if (VV[0].IsSame(FirstVertexOfFirstEdge)) + FirstVertex = VV[0]; + else + FirstVertex = VV[1]; + } + else //Vindex == 1 + { + if (VV[0].IsSame(FirstVertexOfFirstEdge)) + FirstVertex = VV[1]; + else + FirstVertex = VV[0]; + } const TopTools_ListOfShape& Elist = VEmap.FindFromKey(FirstVertex); TopTools_ListIteratorOfListOfShape itl(Elist); TopAbs_Orientation anEdgeOr = (Vindex == 0)? TopAbs_REVERSED : TopAbs_FORWARD; diff -Nru opencascade-7.4.1+dfsg1/src/BRepPreviewAPI/BRepPreviewAPI_MakeBox.cxx opencascade-7.5.1+dfsg1/src/BRepPreviewAPI/BRepPreviewAPI_MakeBox.cxx --- opencascade-7.4.1+dfsg1/src/BRepPreviewAPI/BRepPreviewAPI_MakeBox.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPreviewAPI/BRepPreviewAPI_MakeBox.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,124 @@ +// Created on: 2020-01-31 +// Created by: Svetlana SHUTINA +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include + +#include + +//======================================================================= +//function : Build +//purpose : +//======================================================================= +void BRepPreviewAPI_MakeBox::Build() +{ + gp_Pnt anLocation = myWedge.Axes().Location(); + + gp_Pnt aFirstPoint (anLocation.X(), anLocation.Y(), anLocation.Z()); + gp_Pnt aSecondPoint (anLocation.X() + myWedge.GetXMax(), anLocation.Y() + myWedge.GetYMax(), anLocation.Z() + myWedge.GetZMax()); + + Standard_Boolean aThinOnX = Abs (aFirstPoint.X() - aSecondPoint.X()) < Precision::Confusion(); + Standard_Boolean aThinOnY = Abs (aFirstPoint.Y() - aSecondPoint.Y()) < Precision::Confusion(); + Standard_Boolean aThinOnZ = Abs (aFirstPoint.Z() - aSecondPoint.Z()) < Precision::Confusion(); + + Standard_Integer aPreviewType = (int)aThinOnX + (int)aThinOnY + (int)aThinOnZ; + + if (aPreviewType == 3) // thin box in all directions is a point + { + makeVertex (aFirstPoint); + } + else if (aPreviewType == 2) // thin box in two directions is a point + { + makeEdge (aFirstPoint, aSecondPoint); + } + // thin box in only one direction is a rectangular face + else if (aPreviewType == 1) + { + gp_Pnt aPnt1, aPnt2, aPnt3, aPnt4; + if (aThinOnX) + { + aPnt1 = gp_Pnt (aFirstPoint.X(), aFirstPoint.Y(), aFirstPoint.Z()); + aPnt2 = gp_Pnt (aFirstPoint.X(), aSecondPoint.Y(), aFirstPoint.Z()); + aPnt3 = gp_Pnt (aFirstPoint.X(), aSecondPoint.Y(), aSecondPoint.Z()); + aPnt4 = gp_Pnt (aFirstPoint.X(), aFirstPoint.Y(), aSecondPoint.Z()); + } + else if (aThinOnY) + { + aPnt1 = gp_Pnt (aFirstPoint.X(), aFirstPoint.Y(), aFirstPoint.Z()); + aPnt2 = gp_Pnt (aSecondPoint.X(), aFirstPoint.Y(), aFirstPoint.Z()); + aPnt3 = gp_Pnt (aSecondPoint.X(), aFirstPoint.Y(), aSecondPoint.Z()); + aPnt4 = gp_Pnt (aFirstPoint.X(), aFirstPoint.Y(), aSecondPoint.Z()); + } + else if (aThinOnZ) + { + aPnt1 = gp_Pnt (aFirstPoint.X(), aFirstPoint.Y(), aFirstPoint.Z()); + aPnt2 = gp_Pnt (aSecondPoint.X(), aFirstPoint.Y(), aFirstPoint.Z()); + aPnt3 = gp_Pnt (aSecondPoint.X(), aSecondPoint.Y(), aFirstPoint.Z()); + aPnt4 = gp_Pnt (aFirstPoint.X(), aSecondPoint.Y(), aFirstPoint.Z()); + } + + makeRectangle (aPnt1, aPnt2, aPnt3, aPnt4); + } + + if (!myShape.IsNull()) + { + Done(); + return; + } + + // box is a valid shape + Solid(); +} + +//======================================================================= +//function : makeVertex +//purpose : +//======================================================================= +void BRepPreviewAPI_MakeBox::makeVertex (const gp_Pnt& thePoint) +{ + myShape = BRepBuilderAPI_MakeVertex (thePoint); +} + +//======================================================================= +//function : makeEdge +//purpose : +//======================================================================= +void BRepPreviewAPI_MakeBox::makeEdge (const gp_Pnt& thePoint1, const gp_Pnt& thePoint2) +{ + myShape = BRepBuilderAPI_MakeEdge (thePoint1, thePoint2); +} + +//======================================================================= +//function : makeRectangle +//purpose : +//======================================================================= +void BRepPreviewAPI_MakeBox::makeRectangle (const gp_Pnt& thePnt1, const gp_Pnt& thePnt2, + const gp_Pnt& thePnt3, const gp_Pnt& thePnt4) +{ + TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge (thePnt1, thePnt2); + TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge (thePnt2, thePnt3); + TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge (thePnt3, thePnt4); + TopoDS_Edge anEdge4 = BRepBuilderAPI_MakeEdge (thePnt4, thePnt1); + + BRepBuilderAPI_MakeWire aWire (anEdge1, anEdge2, anEdge3, anEdge4); + BRepBuilderAPI_MakeFace aFace (aWire); + + myShape = aFace.Shape(); +} diff -Nru opencascade-7.4.1+dfsg1/src/BRepPreviewAPI/BRepPreviewAPI_MakeBox.hxx opencascade-7.5.1+dfsg1/src/BRepPreviewAPI/BRepPreviewAPI_MakeBox.hxx --- opencascade-7.4.1+dfsg1/src/BRepPreviewAPI/BRepPreviewAPI_MakeBox.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPreviewAPI/BRepPreviewAPI_MakeBox.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,57 @@ +// Created on: 2020-01-31 +// Created by: Svetlana SHUTINA +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _BRepPreviewAPI_MakeBox_HeaderFile +#define _BRepPreviewAPI_MakeBox_HeaderFile + +#include + +//! Builds a valid box, if points fulfill the conditions of a valid box. +//! And allows to build a preview, otherwise. +//! There are 4 cases: +//! 1 - preview can be a vertex if thin box in all directions is a point; +//! 2 - preview can be an edge if thin box in two directions is a point; +//! 3 - preview can be a rectangular face if thin box in only one direction is a point; +//! 4 - preview can be a valid box if point values fulfill the conditions of a valid box. + +class BRepPreviewAPI_MakeBox : public BRepPrimAPI_MakeBox +{ +public: + + //! Constructor + BRepPreviewAPI_MakeBox() {} + + //! Creates a preview depending on point values. + Standard_EXPORT virtual void Build() Standard_OVERRIDE; + +private: + + //! Create a vertex if thin box in all directions is a point. + void makeVertex (const gp_Pnt& thePoint); + + //! Create an edge if thin box in two directions is a point. + void makeEdge (const gp_Pnt& thePoint1, const gp_Pnt& thePoint2); + + //! Create a rectangular face if the box is thin in one direction only. + //! @param thePnt1 the first point for a rectangular face + //! @param thePnt2 the second point for a rectangular face + //! @param thePnt3 the third point for a rectangular face + //! @param thePnt4 the fourth point for a rectangular face + void makeRectangle (const gp_Pnt& thePnt1, const gp_Pnt& thePnt2, + const gp_Pnt& thePnt3, const gp_Pnt& thePnt4); + +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/BRepPreviewAPI/FILES opencascade-7.5.1+dfsg1/src/BRepPreviewAPI/FILES --- opencascade-7.4.1+dfsg1/src/BRepPreviewAPI/FILES 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPreviewAPI/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2 @@ +BRepPreviewAPI_MakeBox.hxx +BRepPreviewAPI_MakeBox.cxx diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrim/BRepPrim_Cylinder.hxx opencascade-7.5.1+dfsg1/src/BRepPrim/BRepPrim_Cylinder.hxx --- opencascade-7.4.1+dfsg1/src/BRepPrim/BRepPrim_Cylinder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrim/BRepPrim_Cylinder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -85,7 +85,7 @@ Standard_EXPORT void SetMeridian(); - Standard_Real myRadius; + Standard_Real myRadius; //!< cylinder radius }; diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrim/BRepPrim_GWedge.cxx opencascade-7.5.1+dfsg1/src/BRepPrim/BRepPrim_GWedge.cxx --- opencascade-7.4.1+dfsg1/src/BRepPrim/BRepPrim_GWedge.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrim/BRepPrim_GWedge.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -134,6 +134,27 @@ F[i] = Standard_False; } +BRepPrim_GWedge::BRepPrim_GWedge() : + XMin (0), + XMax (0), + YMin (0), + YMax (0), + ZMin (0), + ZMax (0), + Z2Min (0), + Z2Max (0), + X2Min (0), + X2Max (0) +{ + for (Standard_Integer i = 0; i < NBFACES; i++) + { + myInfinite[i]=Standard_False; + } + + BRepPrim_Wedge_Init (ShellBuilt,VerticesBuilt,EdgesBuilt, + WiresBuilt,FacesBuilt); +} + //======================================================================= //function : BRepPrim_GWedge //purpose : build a box @@ -158,10 +179,7 @@ X2Max(dx) { for (Standard_Integer i = 0; i < NBFACES; i++) { myInfinite[i]=Standard_False; } - if ( ( dx <= Precision::Confusion() ) || - ( dy <= Precision::Confusion() ) || - ( dz <= Precision::Confusion() ) ) - throw Standard_DomainError(); + BRepPrim_Wedge_Init(ShellBuilt,VerticesBuilt,EdgesBuilt, WiresBuilt,FacesBuilt); } @@ -191,11 +209,7 @@ X2Max(ltx) { for (Standard_Integer i = 0; i < NBFACES; i++) { myInfinite[i]=Standard_False; } - if ( ( dx <= Precision::Confusion() ) || - ( dy <= Precision::Confusion() ) || - ( dz <= Precision::Confusion() ) || - ( ltx < 0 ) ) - throw Standard_DomainError(); + BRepPrim_Wedge_Init(ShellBuilt,VerticesBuilt,EdgesBuilt, WiresBuilt,FacesBuilt); } @@ -231,12 +245,7 @@ X2Max(x2max) { for (Standard_Integer i = 0; i < NBFACES; i++) { myInfinite[i]=Standard_False; } - if ( ( XMax-XMin <= Precision::Confusion() ) || - ( YMax-YMin <= Precision::Confusion() ) || - ( ZMax-ZMin <= Precision::Confusion() ) || - ( Z2Max-Z2Min < 0 ) || - ( X2Max-X2Min < 0 ) ) - throw Standard_DomainError(); + BRepPrim_Wedge_Init(ShellBuilt,VerticesBuilt,EdgesBuilt, WiresBuilt,FacesBuilt); } @@ -296,6 +305,9 @@ //======================================================================= const TopoDS_Shell& BRepPrim_GWedge::Shell() { + if (IsDegeneratedShape()) + throw Standard_DomainError(); + if (!ShellBuilt) { myBuilder.MakeShell(myShell); @@ -1020,3 +1032,19 @@ } +//======================================================================= +//function : IsDegeneratedShape +//purpose : +//======================================================================= +Standard_Boolean BRepPrim_GWedge::IsDegeneratedShape() +{ + if ( ( XMax-XMin <= Precision::Confusion() ) || + ( YMax-YMin <= Precision::Confusion() ) || + ( ZMax-ZMin <= Precision::Confusion() ) || + ( Z2Max-Z2Min < 0 ) || + ( X2Max-X2Min < 0 ) ) + return Standard_True; + else + return Standard_False; +} + diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrim/BRepPrim_GWedge.hxx opencascade-7.5.1+dfsg1/src/BRepPrim/BRepPrim_GWedge.hxx --- opencascade-7.4.1+dfsg1/src/BRepPrim/BRepPrim_GWedge.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrim/BRepPrim_GWedge.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,6 +70,8 @@ DEFINE_STANDARD_ALLOC + //! Default constructor + Standard_EXPORT BRepPrim_GWedge(); //! Creates a GWedge algorithm. is the axis //! system for the primitive. @@ -191,7 +193,9 @@ //! direction. Standard_EXPORT gp_Pnt Point (const BRepPrim_Direction d1, const BRepPrim_Direction d2, const BRepPrim_Direction d3); - + //! Checkes a shape on degeneracy + //! @return TRUE if a shape is degenerated + Standard_EXPORT Standard_Boolean IsDegeneratedShape(); protected: diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrim/BRepPrim_Torus.hxx opencascade-7.5.1+dfsg1/src/BRepPrim/BRepPrim_Torus.hxx --- opencascade-7.4.1+dfsg1/src/BRepPrim/BRepPrim_Torus.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrim/BRepPrim_Torus.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,8 +70,8 @@ Standard_EXPORT void SetMeridian(); - Standard_Real myMajor; - Standard_Real myMinor; + Standard_Real myMajor; //!< distance from the center of the pipe to the center of the torus + Standard_Real myMinor; //!< radius of the pipe }; diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrim/BRepPrim_Wedge.hxx opencascade-7.5.1+dfsg1/src/BRepPrim/BRepPrim_Wedge.hxx --- opencascade-7.4.1+dfsg1/src/BRepPrim/BRepPrim_Wedge.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrim/BRepPrim_Wedge.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,9 @@ DEFINE_STANDARD_ALLOC - + //! Default constructor + BRepPrim_Wedge() {} + //! Creates a Wedge algorithm. is the axis //! system for the primitive. //! diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeBox.cxx opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeBox.cxx --- opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeBox.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeBox.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -102,6 +102,56 @@ { } +//======================================================================= +//function : Init +//purpose : +//======================================================================= +void BRepPrimAPI_MakeBox::Init (const Standard_Real theDX, const Standard_Real theDY, const Standard_Real theDZ) +{ + myWedge = BRepPrim_Wedge (gp_Ax2 (pmin (gp_Pnt (0, 0, 0), theDX, theDY, theDZ), gp_Dir (0, 0, 1), gp_Dir (1, 0, 0)), + Abs (theDX), Abs (theDY), Abs (theDZ)); +} + + +//======================================================================= +//function : Init +//purpose : +//======================================================================= +void BRepPrimAPI_MakeBox::Init (const gp_Pnt& thePnt, + const Standard_Real theDX, + const Standard_Real theDY, + const Standard_Real theDZ) +{ + myWedge = BRepPrim_Wedge (gp_Ax2 (pmin (thePnt, theDX, theDY, theDZ), gp_Dir (0, 0, 1), gp_Dir (1, 0, 0)), + Abs (theDX), Abs (theDY), Abs (theDZ)); +} + + +//======================================================================= +//function : Init +//purpose : +//======================================================================= +void BRepPrimAPI_MakeBox::Init (const gp_Pnt& thePnt1, const gp_Pnt& thePnt2) +{ + myWedge = BRepPrim_Wedge (gp_Ax2 (pmin (thePnt1,thePnt2), gp_Dir (0, 0, 1), gp_Dir (1, 0, 0)), + Abs (thePnt2.X() - thePnt1.X()), + Abs (thePnt2.Y() - thePnt1.Y()), + Abs (thePnt2.Z() - thePnt1.Z())); +} + + +//======================================================================= +//function : Init +//purpose : +//======================================================================= +void BRepPrimAPI_MakeBox::Init (const gp_Ax2& theAxes, + const Standard_Real theDX, + const Standard_Real theDY, + const Standard_Real theDZ) +{ + myWedge = BRepPrim_Wedge (theAxes, theDX, theDY, theDZ); +} + //======================================================================= //function : Wedge diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeBox.hxx opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeBox.hxx --- opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeBox.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeBox.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,12 +40,29 @@ //! - defining the construction of a box, //! - implementing the construction algorithm, and //! - consulting the result. +//! Constructs a box such that its sides are parallel to the axes of +//! - the global coordinate system, or +//! - the local coordinate system Axis. and +//! - with a corner at (0, 0, 0) and of size (dx, dy, dz), or +//! - with a corner at point P and of size (dx, dy, dz), or +//! - with corners at points P1 and P2. +//! Exceptions +//! Standard_DomainError if: dx, dy, dz are less than or equal to +//! Precision::Confusion(), or +//! - the vector joining the points P1 and P2 has a +//! component projected onto the global coordinate +//! system less than or equal to Precision::Confusion(). +//! In these cases, the box would be flat. + class BRepPrimAPI_MakeBox : public BRepBuilderAPI_MakeShape { public: DEFINE_STANDARD_ALLOC + + //! Default constructor + BRepPrimAPI_MakeBox() {} //! Make a box with a corner at 0,0,0 and the other dx,dy,dz Standard_EXPORT BRepPrimAPI_MakeBox(const Standard_Real dx, const Standard_Real dy, const Standard_Real dz); @@ -56,22 +73,27 @@ //! Make a box with corners P1,P2. Standard_EXPORT BRepPrimAPI_MakeBox(const gp_Pnt& P1, const gp_Pnt& P2); - //! Ax2 is the left corner and the axis. - //! Constructs a box such that its sides are parallel to the axes of - //! - the global coordinate system, or - //! - the local coordinate system Axis. and - //! - with a corner at (0, 0, 0) and of size (dx, dy, dz), or - //! - with a corner at point P and of size (dx, dy, dz), or - //! - with corners at points P1 and P2. - //! Exceptions - //! Standard_DomainError if: dx, dy, dz are less than or equal to - //! Precision::Confusion(), or - //! - the vector joining the points P1 and P2 has a - //! component projected onto the global coordinate - //! system less than or equal to Precision::Confusion(). - //! In these cases, the box would be flat. + //! Make a box with Ax2 (the left corner and the axis) and size dx, dy, dz. Standard_EXPORT BRepPrimAPI_MakeBox(const gp_Ax2& Axes, const Standard_Real dx, const Standard_Real dy, const Standard_Real dz); + //! Init a box with a corner at 0,0,0 and the other theDX, theDY, theDZ + Standard_EXPORT void Init (const Standard_Real theDX, const Standard_Real theDY, const Standard_Real theDZ); + + //! Init a box with a corner at thePnt and size theDX, theDY, theDZ. + Standard_EXPORT void Init (const gp_Pnt& thePnt, + const Standard_Real theDX, + const Standard_Real theDY, + const Standard_Real theDZ); + + //! Init a box with corners thePnt1, thePnt2. + Standard_EXPORT void Init (const gp_Pnt& thePnt1, const gp_Pnt& thePnt2); + + //! Init a box with Ax2 (the left corner and the theAxes) and size theDX, theDY, theDZ. + Standard_EXPORT void Init (const gp_Ax2& theAxes, + const Standard_Real theDX, + const Standard_Real theDY, + const Standard_Real theDZ); + //! Returns the internal algorithm. Standard_EXPORT BRepPrim_Wedge& Wedge(); @@ -110,6 +132,7 @@ protected: + BRepPrim_Wedge myWedge; @@ -117,7 +140,6 @@ - BRepPrim_Wedge myWedge; }; diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeCone.hxx opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeCone.hxx --- opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeCone.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeCone.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,18 +41,25 @@ DEFINE_STANDARD_ALLOC - - //! Make a cone of height H radius R1 in the plane z = - //! 0, R2 in the plane Z = H. R1 and R2 may be null. + + //! Make a cone. + //! @param R1 [in] cone bottom radius, may be null (z = 0) + //! @param R2 [in] cone top radius, may be null (z = H) + //! @param H [in] cone height Standard_EXPORT BRepPrimAPI_MakeCone(const Standard_Real R1, const Standard_Real R2, const Standard_Real H); - - //! Make a cone of height H radius R1 in the plane z = - //! 0, R2 in the plane Z = H. R1 and R2 may be null. - //! Take a section of + + //! Make a cone. + //! @param R1 [in] cone bottom radius, may be null (z = 0) + //! @param R2 [in] cone top radius, may be null (z = H) + //! @param H [in] cone height + //! @param angle [in] angle to create a part cone Standard_EXPORT BRepPrimAPI_MakeCone(const Standard_Real R1, const Standard_Real R2, const Standard_Real H, const Standard_Real angle); - - //! Make a cone of height H radius R1 in the plane z = - //! 0, R2 in the plane Z = H. R1 and R2 may be null. + + //! Make a cone. + //! @param axes [in] coordinate system for the construction of the cone + //! @param R1 [in] cone bottom radius, may be null (z = 0) + //! @param R2 [in] cone top radius, may be null (z = H) + //! @param H [in] cone height Standard_EXPORT BRepPrimAPI_MakeCone(const gp_Ax2& Axes, const Standard_Real R1, const Standard_Real R2, const Standard_Real H); //! Make a cone of height H radius R1 in the plane z = diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeCylinder.hxx opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeCylinder.hxx --- opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeCylinder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeCylinder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,17 +41,23 @@ DEFINE_STANDARD_ALLOC - - //! Make a cylinder of radius R and length H. + //! Make a cylinder. + //! @param R [in] cylinder radius + //! @param H [in] cylinder height Standard_EXPORT BRepPrimAPI_MakeCylinder(const Standard_Real R, const Standard_Real H); - - //! Make a cylinder of radius R and length H with - //! angle H. + + //! Make a cylinder (part cylinder). + //! @param R [in] cylinder radius + //! @param H [in] cylinder height + //! @param Angle [in] defines the missing portion of the cylinder Standard_EXPORT BRepPrimAPI_MakeCylinder(const Standard_Real R, const Standard_Real H, const Standard_Real Angle); - + //! Make a cylinder of radius R and length H. + //! @param Axes [in] coordinate system for the construction of the cylinder + //! @param R [in] cylinder radius + //! @param H [in] cylinder height Standard_EXPORT BRepPrimAPI_MakeCylinder(const gp_Ax2& Axes, const Standard_Real R, const Standard_Real H); - + //! Make a cylinder of radius R and length H with //! angle H. //! Constructs diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeSphere.hxx opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeSphere.hxx --- opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeSphere.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeSphere.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,39 +43,72 @@ DEFINE_STANDARD_ALLOC - //! Make a sphere of radius R. + //! Make a sphere. + //! @param R [in] sphere radius Standard_EXPORT BRepPrimAPI_MakeSphere(const Standard_Real R); - - //! Make a sphere of radius R. + + //! Make a sphere (spherical wedge). + //! @param R [in] sphere radius + //! @param angle [in] angle between the radii lying within the bounding semidisks Standard_EXPORT BRepPrimAPI_MakeSphere(const Standard_Real R, const Standard_Real angle); - - //! Make a sphere of radius R. + + //! Make a sphere (spherical segment). + //! @param R [in] sphere radius + //! @param angle1 [in] first angle defining a spherical segment + //! @param angle2 [in] second angle defining a spherical segment Standard_EXPORT BRepPrimAPI_MakeSphere(const Standard_Real R, const Standard_Real angle1, const Standard_Real angle2); - - //! Make a sphere of radius R. + + //! Make a sphere (spherical segment). + //! @param R [in] sphere radius + //! @param angle1 [in] first angle defining a spherical segment + //! @param angle2 [in] second angle defining a spherical segment + //! @param angle3 [in] angle between the radii lying within the bounding semidisks Standard_EXPORT BRepPrimAPI_MakeSphere(const Standard_Real R, const Standard_Real angle1, const Standard_Real angle2, const Standard_Real angle3); - - //! Make a sphere of radius R. + + //! Make a sphere. + //! @param Center [in] sphere center coordinates + //! @param R [in] sphere radius Standard_EXPORT BRepPrimAPI_MakeSphere(const gp_Pnt& Center, const Standard_Real R); - //! Make a sphere of radius R. + //! Make a sphere (spherical wedge). + //! @param Center [in] sphere center coordinates + //! @param R [in] sphere radius + //! @param angle [in] angle between the radii lying within the bounding semidisks Standard_EXPORT BRepPrimAPI_MakeSphere(const gp_Pnt& Center, const Standard_Real R, const Standard_Real angle); - - //! Make a sphere of radius R. + + //! Make a sphere (spherical segment). + //! @param Center [in] sphere center coordinates + //! @param R [in] sphere radius + //! @param angle1 [in] first angle defining a spherical segment + //! @param angle2 [in] second angle defining a spherical segment Standard_EXPORT BRepPrimAPI_MakeSphere(const gp_Pnt& Center, const Standard_Real R, const Standard_Real angle1, const Standard_Real angle2); - - //! Make a sphere of radius R. + + //! Make a sphere (spherical segment). + //! @param Center [in] sphere center coordinates + //! @param R [in] sphere radius + //! @param angle1 [in] first angle defining a spherical segment + //! @param angle2 [in] second angle defining a spherical segment + //! @param angle3 [in] angle between the radii lying within the bounding semidisks Standard_EXPORT BRepPrimAPI_MakeSphere(const gp_Pnt& Center, const Standard_Real R, const Standard_Real angle1, const Standard_Real angle2, const Standard_Real angle3); - - //! Make a sphere of radius R. + + //! Make a sphere. + //! @param Axis [in] coordinate system for the construction of the sphere + //! @param R [in] sphere radius Standard_EXPORT BRepPrimAPI_MakeSphere(const gp_Ax2& Axis, const Standard_Real R); - - //! Make a sphere of radius R. + + //! Make a sphere (spherical wedge). + //! @param Axis [in] coordinate system for the construction of the sphere + //! @param R [in] sphere radius + //! @param angle [in] angle between the radii lying within the bounding semidisks Standard_EXPORT BRepPrimAPI_MakeSphere(const gp_Ax2& Axis, const Standard_Real R, const Standard_Real angle); - - //! Make a sphere of radius R. + + //! Make a sphere (spherical segment). + //! @param Axis [in] coordinate system for the construction of the sphere + //! @param R [in] sphere radius + //! @param angle1 [in] first angle defining a spherical segment + //! @param angle2 [in] second angle defining a spherical segment Standard_EXPORT BRepPrimAPI_MakeSphere(const gp_Ax2& Axis, const Standard_Real R, const Standard_Real angle1, const Standard_Real angle2); - + //! Make a sphere of radius R. //! For all algorithms The resulting shape is composed of //! - a lateral spherical face, diff -Nru opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeTorus.hxx opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeTorus.hxx --- opencascade-7.4.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeTorus.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepPrimAPI/BRepPrimAPI_MakeTorus.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,28 +41,52 @@ DEFINE_STANDARD_ALLOC - - //! Make a torus of radii R1 R2. + + //! Make a torus. + //! @param R1 [in] distance from the center of the pipe to the center of the torus + //! @param R2 [in] radius of the pipe Standard_EXPORT BRepPrimAPI_MakeTorus(const Standard_Real R1, const Standard_Real R2); - - //! Make a section of a torus of radii R1 R2. + + //! Make a section of a torus. + //! @param R1 [in] distance from the center of the pipe to the center of the torus + //! @param R2 [in] radius of the pipe + //! @param angle [in] angle to create a torus pipe segment Standard_EXPORT BRepPrimAPI_MakeTorus(const Standard_Real R1, const Standard_Real R2, const Standard_Real angle); - //! Make a torus of radii R2, R2 with angles on the - //! small circle. + //! Make a torus with angles on the small circle. + //! @param R1 [in] distance from the center of the pipe to the center of the torus + //! @param R2 [in] radius of the pipe + //! @param angle1 [in] first angle to create a torus ring segment + //! @param angle2 [in] second angle to create a torus ring segment Standard_EXPORT BRepPrimAPI_MakeTorus(const Standard_Real R1, const Standard_Real R2, const Standard_Real angle1, const Standard_Real angle2); - //! Make a torus of radii R2, R2 with angles on the - //! small circle. + //! Make a torus with angles on the small circle. + //! @param R1 [in] distance from the center of the pipe to the center of the torus + //! @param R2 [in] radius of the pipe + //! @param angle1 [in] first angle to create a torus ring segment + //! @param angle2 [in] second angle to create a torus ring segment + //! @param angle [in] angle to create a torus pipe segment Standard_EXPORT BRepPrimAPI_MakeTorus(const Standard_Real R1, const Standard_Real R2, const Standard_Real angle1, const Standard_Real angle2, const Standard_Real angle); - //! Make a torus of radii R1 R2. + //! Make a torus. + //! @param Axes [in] coordinate system for the construction of the sphere + //! @param R1 [in] distance from the center of the pipe to the center of the torus + //! @param R2 [in] radius of the pipe Standard_EXPORT BRepPrimAPI_MakeTorus(const gp_Ax2& Axes, const Standard_Real R1, const Standard_Real R2); - //! Make a section of a torus of radii R1 R2. + //! Make a section of a torus. + //! @param Axes [in] coordinate system for the construction of the sphere + //! @param R1 [in] distance from the center of the pipe to the center of the torus + //! @param R2 [in] radius of the pipe + //! @param angle [in] angle to create a torus pipe segment Standard_EXPORT BRepPrimAPI_MakeTorus(const gp_Ax2& Axes, const Standard_Real R1, const Standard_Real R2, const Standard_Real angle); - //! Make a torus of radii R1 R2. + //! Make a torus. + //! @param Axes [in] coordinate system for the construction of the sphere + //! @param R1 [in] distance from the center of the pipe to the center of the torus + //! @param R2 [in] radius of the pipe + //! @param angle1 [in] first angle to create a torus ring segment + //! @param angle2 [in] second angle to create a torus ring segment Standard_EXPORT BRepPrimAPI_MakeTorus(const gp_Ax2& Axes, const Standard_Real R1, const Standard_Real R2, const Standard_Real angle1, const Standard_Real angle2); //! Make a section of a torus of radii R1 R2. diff -Nru opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_BasicCommands.cxx opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_BasicCommands.cxx --- opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_BasicCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_BasicCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -176,7 +177,7 @@ TopoDS_Shape S = DBRep::Get(a[i]); if (S.IsNull()) { - std::cerr << "Error: " << a[i] << " is not a valid shape\n"; + Message::SendFail() << "Error: " << a[i] << " is not a valid shape"; return 1; } else @@ -188,7 +189,7 @@ for (Standard_Integer i = 1; i < last; i++) { TopoDS_Shape S = DBRep::Get(a[i]); if (S.IsNull()) { - std::cerr << "Error: " << a[i] << " is not a valid shape\n"; + Message::SendFail() << "Error: " << a[i] << " is not a valid shape"; return 1; } else { @@ -271,9 +272,9 @@ } if (n < 3 || (n - iFirst) % 2) { - std::cout << "Use: " << a[0] << " [-n(ogeom)] [-m(esh)] shape1 copy1 [shape2 copy2 [...]]" << std::endl; - std::cout << "Option -n forbids copying of geometry (it will be shared)" << std::endl; - std::cout << "Option -m forces copying of mesh (disabled by default)" << std::endl; + Message::SendFail() << "Use: " << a[0] << " [-n(ogeom)] [-m(esh)] shape1 copy1 [shape2 copy2 [...]]\n" + << "Option -n forbids copying of geometry (it will be shared)\n" + << "Option -m forces copying of mesh (disabled by default)"; return 1; } @@ -584,7 +585,7 @@ } else { - std::cout << "Syntax error at argument '" << theArgVal[anArgIter] << "'.\n"; + Message::SendFail() << "Syntax error at argument '" << theArgVal[anArgIter] << "'"; return 1; } } @@ -592,19 +593,19 @@ if (anAABB.IsVoid() && aShape.IsNull()) { - std::cout << "Syntax error: input is not specified (neither shape nor coordinates)\n"; + Message::SendFail() << "Syntax error: input is not specified (neither shape nor coordinates)"; return 1; } else if (!anAABB.IsVoid() && (isOBB || isOptimal || isTolerUsed)) { - std::cout << "Syntax error: Options -obb, -optimal and -extToler cannot be used for explicitly defined AABB.\n"; + Message::SendFail() << "Syntax error: Options -obb, -optimal and -extToler cannot be used for explicitly defined AABB"; return 1; } else if (isOBB && !anOutVars[0].IsEmpty()) { - std::cout << "Error: Option -save works only with axes-aligned boxes.\n"; + Message::SendFail() << "Error: Option -save works only with axes-aligned boxes"; return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_CheckCommands.cxx opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_CheckCommands.cxx --- opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_CheckCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_CheckCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1082,11 +1082,16 @@ face1=TopoDS::Face(It.Value()); It.Next(); face2=TopoDS::Face(It.Value()); + + Standard_Boolean IsSeam = face1.IsEqual(face2); // calcul des deux pcurves const Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface (TopoDS::Edge(edge),face1,f1,l1); if (c1.IsNull()) return 1; + + if (IsSeam) + edge.Reverse(); const Handle(Geom2d_Curve) c2 = BRep_Tool::CurveOnSurface (TopoDS::Edge(edge),face2,f2,l2); if (c2.IsNull()) return 1; @@ -1212,10 +1217,15 @@ It.Next(); face2=TopoDS::Face(It.Value()); + Standard_Boolean IsSeam = face1.IsEqual(face2); + // calcul des deux pcurves const Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface (TopoDS::Edge(edge),face1,f1,l1); if (c1.IsNull()) return 1; + + if (IsSeam) + edge.Reverse(); const Handle(Geom2d_Curve) c2 = BRep_Tool::CurveOnSurface (TopoDS::Edge(edge),face2,f2,l2); if (c2.IsNull()) return 1; @@ -1335,10 +1345,16 @@ face1=TopoDS::Face(It.Value()); It.Next(); face2=TopoDS::Face(It.Value()); + + Standard_Boolean IsSeam = face1.IsEqual(face2); + // calcul des deux pcurves const Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface (TopoDS::Edge(edge),face1,f1,l1); if (c1.IsNull()) return 1; + + if (IsSeam) + edge.Reverse(); const Handle(Geom2d_Curve) c2 = BRep_Tool::CurveOnSurface (TopoDS::Edge(edge),face2,f2,l2); if (c2.IsNull()) return 1; diff -Nru opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_ExtremaCommands.cxx opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_ExtremaCommands.cxx --- opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_ExtremaCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_ExtremaCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,8 +14,6 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -// modified by mps (juillet 96) : ajout de la commande distmini - #include #include #include @@ -28,15 +26,13 @@ #include #include #include +#include #include #include #include #include - -//#ifdef _MSC_VER #include -//#endif //======================================================================= //function : distance @@ -150,9 +146,7 @@ { if (theNbArgs < 3 || theNbArgs > 6) { - std::cout << "Usage: " << theArgs[0] << - " Shape1 Shape2 [-tol ] [-profile]" << std::endl; - + Message::SendFail() << "Usage: " << theArgs[0] << " Shape1 Shape2 [-tol ] [-profile]"; return 1; } @@ -161,7 +155,7 @@ if (aShape1.IsNull() || aShape2.IsNull()) { - std::cout << "Error: Failed to find specified shapes" << std::endl; + Message::SendFail() << "Error: Failed to find specified shapes"; return 1; } @@ -178,14 +172,14 @@ { if (++anArgIdx >= theNbArgs) { - std::cout << "Error: wrong syntax at argument '" << aFlag << std::endl; + Message::SendFail() << "Error: wrong syntax at argument '" << aFlag; return 1; } const Standard_Real aTolerance = Draw::Atof (theArgs[anArgIdx]); if (aTolerance < 0.0) { - std::cout << "Error: Tolerance value should be non-negative" << std::endl; + Message::SendFail() << "Error: Tolerance value should be non-negative"; return 1; } else @@ -231,7 +225,7 @@ if (!aTool.IsDone()) { - std::cout << "Error: Failed to perform proximity test" << std::endl; + Message::SendFail() << "Error: Failed to perform proximity test"; return 1; } @@ -287,17 +281,14 @@ { if (theNbArgs < 2 || theNbArgs > 5) { - std::cout << "Usage: " << theArgs[0] << - " Shape [-tol ] [-profile]" << std::endl; - + Message::SendFail() << "Usage: " << theArgs[0] << " Shape [-tol ] [-profile]"; return 1; } TopoDS_Shape aShape = DBRep::Get (theArgs[1]); - if (aShape.IsNull()) { - std::cout << "Error: Failed to find specified shape" << std::endl; + Message::SendFail() << "Error: Failed to find specified shape"; return 1; } @@ -313,14 +304,14 @@ { if (++anArgIdx >= theNbArgs) { - std::cout << "Error: wrong syntax at argument '" << aFlag << std::endl; + Message::SendFail() << "Error: wrong syntax at argument '" << aFlag; return 1; } const Standard_Real aValue = Draw::Atof (theArgs[anArgIdx]); if (aValue < 0.0) { - std::cout << "Error: Tolerance value should be non-negative" << std::endl; + Message::SendFail() << "Error: Tolerance value should be non-negative"; return 1; } else @@ -360,7 +351,7 @@ if (!aTool.IsDone()) { - std::cout << "Error: Failed to perform proximity test" << std::endl; + Message::SendFail() << "Error: Failed to perform proximity test"; return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_FeatureCommands.cxx opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_FeatureCommands.cxx --- opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_FeatureCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_FeatureCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,6 +65,7 @@ #include #include +#include #include @@ -85,6 +86,10 @@ static BRepFeat_MakeLinearForm theLF; static BRepFeat_MakeRevolutionForm theRF; +//Input shapes for Prism, DPrism, Revol, Pipe +static TopoDS_Shape theSbase, thePbase; +static TopoDS_Face theSkface; + static Standard_Boolean dprdef = Standard_False; static Standard_Boolean prdef = Standard_False; static Standard_Boolean rvdef = Standard_False; @@ -94,8 +99,8 @@ static Standard_Real t3d = 1.e-4; static Standard_Real t2d = 1.e-5; -static Standard_Real ta = 1.e-2; -static Standard_Real fl = 1.e-3; +static Standard_Real ta = 1.e-2; +static Standard_Real fl = 1.e-3; static Standard_Real tapp_angle = 1.e-2; static GeomAbs_Shape blend_cont = GeomAbs_C1; static BRepFilletAPI_MakeFillet* Rakk = 0; @@ -103,7 +108,7 @@ static void Print(Draw_Interpretor& di, - const BRepFeat_Status St) + const BRepFeat_Status St) { di << " Error Status : "; switch (St) { @@ -122,17 +127,17 @@ } static Standard_Integer Loc(Draw_Interpretor& theCommands, - Standard_Integer narg, const char** a) + Standard_Integer narg, const char** a) { - if (narg<6) return 1; + if (narg < 6) return 1; TopoDS_Shape S = DBRep::Get(a[2]); TopoDS_Shape T = DBRep::Get(a[3]); Standard_Boolean Fuse; - if (!strcasecmp("F",a[4])) { + if (!strcasecmp("F", a[4])) { Fuse = Standard_True; } - else if (!strcasecmp("C",a[4])) { + else if (!strcasecmp("C", a[4])) { Fuse = Standard_False; } else { @@ -140,10 +145,10 @@ } TopTools_ListOfShape LF; - for (Standard_Integer i=0; i<= narg-6; i++) { - TopoDS_Shape aLocalShape(DBRep::Get(a[i+5],TopAbs_FACE)); + for (Standard_Integer i = 0; i <= narg - 6; i++) { + TopoDS_Shape aLocalShape(DBRep::Get(a[i + 5], TopAbs_FACE)); LF.Append(aLocalShape); -// LF.Append(TopoDS::Face(DBRep::Get(a[i+5],TopAbs_FACE))); + // LF.Append(TopoDS::Face(DBRep::Get(a[i+5],TopAbs_FACE))); } //BRepFeat_LocalOperation BLoc(S); @@ -151,7 +156,7 @@ //BLoc.BuildPartsOfTool(); TopTools_ListOfShape parts; BRepFeat_Builder BLoc; - BLoc.Init(S,T); + BLoc.Init(S, T); BLoc.SetOperation(Fuse); //BRepFeat_LocalOperation BLoc; //BLoc.Init(S,T,Fuse); @@ -160,7 +165,7 @@ #if 0 char newname[1024]; - strcpy(newname,a[1]); + strcpy(newname, a[1]); char* p = newname; while (*p != '\0') p++; *p = '_'; @@ -170,20 +175,20 @@ i = 0; for (; its.More(); its.Next()) { i++; - Sprintf(p,"%d",i); - DBRep::Set(newname,its.Value()); + Sprintf(p, "%d", i); + DBRep::Set(newname, its.Value()); } if (i >= 2) { dout.Flush(); - Standard_Integer qq,ww,ee,button; + Standard_Integer qq, ww, ee, button; TopoDS_Shell S; do { - TopoDS_Shape aLocalShape(DBRep::Get(".",TopAbs_SHELL)); + TopoDS_Shape aLocalShape(DBRep::Get(".", TopAbs_SHELL)); S = TopoDS::Shell(aLocalShape); -// S = TopoDS::Shell(DBRep::Get(".",TopAbs_SHELL)); - Draw::LastPick(qq,ww,ee,button); + // S = TopoDS::Shell(DBRep::Get(".",TopAbs_SHELL)); + Draw::LastPick(qq, ww, ee, button); if (!S.IsNull()) { - + switch (button) { case 1: //BLoc.RemovePart(S); @@ -192,7 +197,7 @@ BLoc.KeepPart(S); break; default: - {} + {} } } else { @@ -204,131 +209,131 @@ #endif BLoc.PerformResult(); if (!BLoc.HasErrors()) { -// dout.Clear(); - DBRep::Set(a[1],BLoc.Shape()); + // dout.Clear(); + DBRep::Set(a[1], BLoc.Shape()); dout.Flush(); return 0; } - theCommands << "Local operation not done" ; + theCommands << "Local operation not done"; return 1; } static Standard_Integer HOLE1(Draw_Interpretor& theCommands, - Standard_Integer narg, const char** a) + Standard_Integer narg, const char** a) { - if (narg<10 || narg == 11) return 1; + if (narg < 10 || narg == 11) return 1; TopoDS_Shape S = DBRep::Get(a[2]); - gp_Pnt Or(Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5])); - gp_Dir Di(Draw::Atof(a[6]),Draw::Atof(a[7]),Draw::Atof(a[8])); + gp_Pnt Or(Draw::Atof(a[3]), Draw::Atof(a[4]), Draw::Atof(a[5])); + gp_Dir Di(Draw::Atof(a[6]), Draw::Atof(a[7]), Draw::Atof(a[8])); Standard_Real Radius = Draw::Atof(a[9]); - theHole.Init(S,gp_Ax1(Or,Di)); + theHole.Init(S, gp_Ax1(Or, Di)); if (narg <= 10) { theHole.Perform(Radius); } else { Standard_Real pfrom = Draw::Atof(a[10]); - Standard_Real pto = Draw::Atof(a[11]); - theHole.Perform(Radius,pfrom,pto,WithControl); + Standard_Real pto = Draw::Atof(a[11]); + theHole.Perform(Radius, pfrom, pto, WithControl); } theHole.Build(); if (!theHole.HasErrors()) { -// dout.Clear(); - DBRep::Set(a[1],theHole.Shape()); + // dout.Clear(); + DBRep::Set(a[1], theHole.Shape()); dout.Flush(); return 0; } theCommands << "Echec de MakeCylindricalHole"; - Print(theCommands,theHole.Status()); + Print(theCommands, theHole.Status()); return 1; } static Standard_Integer HOLE2(Draw_Interpretor& theCommands, - Standard_Integer narg, const char** a) + Standard_Integer narg, const char** a) { - if (narg<10) return 1; + if (narg < 10) return 1; TopoDS_Shape S = DBRep::Get(a[2]); - gp_Pnt Or(Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5])); - gp_Dir Di(Draw::Atof(a[6]),Draw::Atof(a[7]),Draw::Atof(a[8])); + gp_Pnt Or(Draw::Atof(a[3]), Draw::Atof(a[4]), Draw::Atof(a[5])); + gp_Dir Di(Draw::Atof(a[6]), Draw::Atof(a[7]), Draw::Atof(a[8])); Standard_Real Radius = Draw::Atof(a[9]); - theHole.Init(S,gp_Ax1(Or,Di)); - theHole.PerformThruNext(Radius,WithControl); + theHole.Init(S, gp_Ax1(Or, Di)); + theHole.PerformThruNext(Radius, WithControl); theHole.Build(); if (!theHole.HasErrors()) { -// dout.Clear(); - DBRep::Set(a[1],theHole.Shape()); + // dout.Clear(); + DBRep::Set(a[1], theHole.Shape()); dout.Flush(); return 0; } theCommands << "Echec de MakeCylindricalHole"; - Print(theCommands,theHole.Status()); + Print(theCommands, theHole.Status()); return 1; } static Standard_Integer HOLE3(Draw_Interpretor& theCommands, - Standard_Integer narg, const char** a) + Standard_Integer narg, const char** a) { - if (narg<10) return 1; + if (narg < 10) return 1; TopoDS_Shape S = DBRep::Get(a[2]); - gp_Pnt Or(Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5])); - gp_Dir Di(Draw::Atof(a[6]),Draw::Atof(a[7]),Draw::Atof(a[8])); + gp_Pnt Or(Draw::Atof(a[3]), Draw::Atof(a[4]), Draw::Atof(a[5])); + gp_Dir Di(Draw::Atof(a[6]), Draw::Atof(a[7]), Draw::Atof(a[8])); Standard_Real Radius = Draw::Atof(a[9]); - theHole.Init(S,gp_Ax1(Or,Di)); - theHole.PerformUntilEnd(Radius,WithControl); + theHole.Init(S, gp_Ax1(Or, Di)); + theHole.PerformUntilEnd(Radius, WithControl); theHole.Build(); if (!theHole.HasErrors()) { -// dout.Clear(); - DBRep::Set(a[1],theHole.Shape()); + // dout.Clear(); + DBRep::Set(a[1], theHole.Shape()); dout.Flush(); return 0; } theCommands << "Echec de MakeCylindricalHole"; - Print(theCommands,theHole.Status()); + Print(theCommands, theHole.Status()); return 1; } static Standard_Integer HOLE4(Draw_Interpretor& theCommands, - Standard_Integer narg, const char** a) + Standard_Integer narg, const char** a) { - if (narg<11) return 1; + if (narg < 11) return 1; TopoDS_Shape S = DBRep::Get(a[2]); - gp_Pnt Or(Draw::Atof(a[3]),Draw::Atof(a[4]),Draw::Atof(a[5])); - gp_Dir Di(Draw::Atof(a[6]),Draw::Atof(a[7]),Draw::Atof(a[8])); + gp_Pnt Or(Draw::Atof(a[3]), Draw::Atof(a[4]), Draw::Atof(a[5])); + gp_Dir Di(Draw::Atof(a[6]), Draw::Atof(a[7]), Draw::Atof(a[8])); Standard_Real Radius = Draw::Atof(a[9]); Standard_Real Length = Draw::Atof(a[10]); - theHole.Init(S,gp_Ax1(Or,Di)); - theHole.PerformBlind(Radius,Length,WithControl); + theHole.Init(S, gp_Ax1(Or, Di)); + theHole.PerformBlind(Radius, Length, WithControl); theHole.Build(); if (!theHole.HasErrors()) { -// dout.Clear(); - DBRep::Set(a[1],theHole.Shape()); + // dout.Clear(); + DBRep::Set(a[1], theHole.Shape()); dout.Flush(); return 0; } theCommands << "Echec de MakeCylindricalHole"; - Print(theCommands,theHole.Status()); + Print(theCommands, theHole.Status()); return 1; } static Standard_Integer CONTROL(Draw_Interpretor& theCommands, - Standard_Integer narg, const char** a) + Standard_Integer narg, const char** a) { if (narg >= 2) { WithControl = strcmp("0", a[1]) != 0; @@ -347,40 +352,55 @@ //purpose : Print state of offset operation by error code. //======================================================================= static void reportOffsetState(Draw_Interpretor& theCommands, - const BRepOffset_Error theErrorCode) + const BRepOffset_Error theErrorCode) { - switch(theErrorCode) + switch (theErrorCode) { case BRepOffset_NoError: - { - theCommands << "OK. Offset performed succesfully."; - break; - } + { + theCommands << "OK. Offset performed succesfully."; + break; + } case BRepOffset_BadNormalsOnGeometry: - { - theCommands << "ERROR. Degenerated normal on input data."; - break; - } + { + theCommands << "ERROR. Degenerated normal on input data."; + break; + } case BRepOffset_C0Geometry: - { - theCommands << "ERROR. C0 continuity of input data."; - break; - } + { + theCommands << "ERROR. C0 continuity of input data."; + break; + } case BRepOffset_NullOffset: - { - theCommands << "ERROR. Null offset of all faces."; - break; - } + { + theCommands << "ERROR. Null offset of all faces."; + break; + } case BRepOffset_NotConnectedShell: - { - theCommands << "ERROR. Incorrect set of faces to remove, the remaining shell is not connected."; - break; - } + { + theCommands << "ERROR. Incorrect set of faces to remove, the remaining shell is not connected."; + break; + } + case BRepOffset_CannotTrimEdges: + { + theCommands << "ERROR. Can not trim edges."; + break; + } + case BRepOffset_CannotFuseVertices: + { + theCommands << "ERROR. Can not fuse vertices."; + break; + } + case BRepOffset_CannotExtentEdge: + { + theCommands << "ERROR. Can not extent edge."; + break; + } default: - { - theCommands << "ERROR. offsetperform operation not done."; - break; - } + { + theCommands << "ERROR. offsetperform operation not done."; + break; + } } } @@ -390,13 +410,13 @@ //======================================================================= static Standard_Integer PRW(Draw_Interpretor& theCommands, - Standard_Integer narg, const char** a) + Standard_Integer narg, const char** a) { - if (narg<9) return 1; + if (narg < 9) return 1; TopoDS_Shape S = DBRep::Get(a[3]); BRepFeat_MakePrism thePFace; gp_Vec V; - TopoDS_Shape FFrom,FUntil; + TopoDS_Shape FFrom, FUntil; Standard_Integer borne; Standard_Boolean fuse; if (a[1][0] == 'f' || a[1][0] == 'F') { @@ -415,21 +435,21 @@ } if (a[5][0] == '.' || IsAlphabetic(a[5][0])) { if (narg < 11) { - return 1; + return 1; } - V.SetCoord(Draw::Atof(a[6]),Draw::Atof(a[7]),Draw::Atof(a[8])); - FFrom = DBRep::Get(a[4],TopAbs_SHAPE); - FUntil = DBRep::Get(a[5],TopAbs_SHAPE); + V.SetCoord(Draw::Atof(a[6]), Draw::Atof(a[7]), Draw::Atof(a[8])); + FFrom = DBRep::Get(a[4], TopAbs_SHAPE); + FUntil = DBRep::Get(a[5], TopAbs_SHAPE); borne = 9; } else { - V.SetCoord(Draw::Atof(a[5]),Draw::Atof(a[6]),Draw::Atof(a[7])); - FUntil = DBRep::Get(a[4],TopAbs_SHAPE); + V.SetCoord(Draw::Atof(a[5]), Draw::Atof(a[6]), Draw::Atof(a[7])); + FUntil = DBRep::Get(a[4], TopAbs_SHAPE); borne = 8; } } else { - V.SetCoord(Draw::Atof(a[4]),Draw::Atof(a[5]),Draw::Atof(a[6])); + V.SetCoord(Draw::Atof(a[4]), Draw::Atof(a[5]), Draw::Atof(a[6])); borne = 7; } Standard_Real Length = V.Magnitude(); @@ -437,34 +457,34 @@ return 1; } - TopoDS_Shape aLocalShape(DBRep::Get(a[borne],TopAbs_FACE)); - TopoDS_Face F = TopoDS::Face(aLocalShape); -// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[borne],TopAbs_FACE)); + TopoDS_Shape aLocalShape(DBRep::Get(a[borne], TopAbs_FACE)); + TopoDS_Face F = TopoDS::Face(aLocalShape); + // TopoDS_Face F = TopoDS::Face(DBRep::Get(a[borne],TopAbs_FACE)); BRepFeat_SplitShape Spls(F); - for (Standard_Integer i = borne+1; iDynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { - Su = Handle(Geom_RectangularTrimmedSurface):: - DownCast(Su)->BasisSurface(); + Su = Handle(Geom_RectangularTrimmedSurface):: + DownCast(Su)->BasisSurface(); } if (Su->DynamicType() == STANDARD_TYPE(Geom_Plane)) { - gp_Pln pl = Handle(Geom_Plane)::DownCast(Su)->Pln(); - if (pl.Contains(gp_Lin(pl.Location(),V), - Precision::Confusion(), - Precision::Angular())) { - FEIF.Set(ToPrism,fac); - for (FEIF.Init();FEIF.More();FEIF.Next()) { - thePFace.Add(FEIF.Edge(),fac); - } - } + gp_Pln pl = Handle(Geom_Plane)::DownCast(Su)->Pln(); + if (pl.Contains(gp_Lin(pl.Location(), V), + Precision::Confusion(), + Precision::Angular())) { + FEIF.Set(ToPrism, fac); + for (FEIF.Init(); FEIF.More(); FEIF.Next()) { + thePFace.Add(FEIF.Edge(), fac); + } + } } else if (Su->DynamicType() == STANDARD_TYPE(Geom_CylindricalSurface)) { - gp_Cylinder cy = - Handle(Geom_CylindricalSurface)::DownCast(Su)->Cylinder(); - if (V.IsParallel(cy.Axis().Direction(),Precision::Angular())) { - FEIF.Set(ToPrism,fac); - for (FEIF.Init();FEIF.More();FEIF.Next()) { - thePFace.Add(FEIF.Edge(),fac); - } - } + gp_Cylinder cy = + Handle(Geom_CylindricalSurface)::DownCast(Su)->Cylinder(); + if (V.IsParallel(cy.Axis().Direction(), Precision::Angular())) { + FEIF.Set(ToPrism, fac); + for (FEIF.Init(); FEIF.More(); FEIF.Next()) { + thePFace.Add(FEIF.Edge(), fac); + } + } } } } @@ -532,14 +552,14 @@ } else if (borne == 9) { if (!(FFrom.IsNull() || FUntil.IsNull())) { - thePFace.Perform(FFrom,FUntil); + thePFace.Perform(FFrom, FUntil); } else if (FFrom.IsNull()) { if (!FUntil.IsNull()) { - thePFace.PerformFromEnd(FUntil); + thePFace.PerformFromEnd(FUntil); } else { - thePFace.PerformThruAll(); + thePFace.PerformThruAll(); } } else { @@ -553,7 +573,7 @@ return 1; } - DBRep::Set(a[2],thePFace); + DBRep::Set(a[2], thePFace); dout.Flush(); return 0; } @@ -565,14 +585,14 @@ //======================================================================= static Standard_Integer PRF(Draw_Interpretor& theCommands, - Standard_Integer narg, const char** a) + Standard_Integer narg, const char** a) { - if (narg<8) return 1; + if (narg < 8) return 1; TopoDS_Shape S = DBRep::Get(a[3]); BRepFeat_MakePrism thePFace; Standard_Integer borne; gp_Vec V; - TopoDS_Shape FFrom,FUntil; + TopoDS_Shape FFrom, FUntil; Standard_Boolean fuse; if (a[1][0] == 'f' || a[1][0] == 'F') { fuse = Standard_True; @@ -591,22 +611,22 @@ } if (a[5][0] == '.' || IsAlphabetic(a[5][0])) { if (narg < 10) { - return 1; + return 1; } borne = 9; - V.SetCoord(Draw::Atof(a[6]),Draw::Atof(a[7]),Draw::Atof(a[8])); - FFrom = DBRep::Get(a[4],TopAbs_SHAPE); - FUntil = DBRep::Get(a[5],TopAbs_SHAPE); + V.SetCoord(Draw::Atof(a[6]), Draw::Atof(a[7]), Draw::Atof(a[8])); + FFrom = DBRep::Get(a[4], TopAbs_SHAPE); + FUntil = DBRep::Get(a[5], TopAbs_SHAPE); } else { borne = 8; - V.SetCoord(Draw::Atof(a[5]),Draw::Atof(a[6]),Draw::Atof(a[7])); - FUntil = DBRep::Get(a[4],TopAbs_SHAPE); + V.SetCoord(Draw::Atof(a[5]), Draw::Atof(a[6]), Draw::Atof(a[7])); + FUntil = DBRep::Get(a[4], TopAbs_SHAPE); } } else { borne = 7; - V.SetCoord(Draw::Atof(a[4]),Draw::Atof(a[5]),Draw::Atof(a[6])); + V.SetCoord(Draw::Atof(a[4]), Draw::Atof(a[5]), Draw::Atof(a[6])); } Standard_Real Length = V.Magnitude(); if (Length < Precision::Confusion()) { @@ -614,41 +634,41 @@ } TopoDS_Shape ToPrism; - if (narg == borne+1) { - TopoDS_Shape aLocalShape(DBRep::Get(a[borne],TopAbs_FACE)); - TopoDS_Face F = TopoDS::Face(aLocalShape); -// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[borne],TopAbs_FACE)); - thePFace.Init(S,F,F,V,fuse,Standard_True); + if (narg == borne + 1) { + TopoDS_Shape aLocalShape(DBRep::Get(a[borne], TopAbs_FACE)); + TopoDS_Face F = TopoDS::Face(aLocalShape); + // TopoDS_Face F = TopoDS::Face(DBRep::Get(a[borne],TopAbs_FACE)); + thePFace.Init(S, F, F, V, fuse, Standard_True); ToPrism = F; } else { TopoDS_Shell She; BRep_Builder B; B.MakeShell(She); - for (Standard_Integer i=borne; iDynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { - Su = Handle(Geom_RectangularTrimmedSurface):: - DownCast(Su)->BasisSurface(); + Su = Handle(Geom_RectangularTrimmedSurface):: + DownCast(Su)->BasisSurface(); } if (Su->DynamicType() == STANDARD_TYPE(Geom_Plane)) { - gp_Pln pl = Handle(Geom_Plane)::DownCast(Su)->Pln(); - if (pl.Contains(gp_Lin(pl.Location(),V), - Precision::Confusion(), - Precision::Angular())) { - FEIF.Set(ToPrism,fac); - for (FEIF.Init();FEIF.More();FEIF.Next()) { - thePFace.Add(FEIF.Edge(),fac); - } - } + gp_Pln pl = Handle(Geom_Plane)::DownCast(Su)->Pln(); + if (pl.Contains(gp_Lin(pl.Location(), V), + Precision::Confusion(), + Precision::Angular())) { + FEIF.Set(ToPrism, fac); + for (FEIF.Init(); FEIF.More(); FEIF.Next()) { + thePFace.Add(FEIF.Edge(), fac); + } + } } else if (Su->DynamicType() == STANDARD_TYPE(Geom_CylindricalSurface)) { - gp_Cylinder cy = - Handle(Geom_CylindricalSurface)::DownCast(Su)->Cylinder(); - if (V.IsParallel(cy.Axis().Direction(),Precision::Angular())) { - FEIF.Set(ToPrism,fac); - for (FEIF.Init();FEIF.More();FEIF.Next()) { - thePFace.Add(FEIF.Edge(),fac); - } - } + gp_Cylinder cy = + Handle(Geom_CylindricalSurface)::DownCast(Su)->Cylinder(); + if (V.IsParallel(cy.Axis().Direction(), Precision::Angular())) { + FEIF.Set(ToPrism, fac); + for (FEIF.Init(); FEIF.More(); FEIF.Next()) { + thePFace.Add(FEIF.Edge(), fac); + } + } } } } @@ -697,14 +717,14 @@ } else if (borne == 9) { if (!(FFrom.IsNull() || FUntil.IsNull())) { - thePFace.Perform(FFrom,FUntil); + thePFace.Perform(FFrom, FUntil); } else if (FFrom.IsNull()) { if (!FUntil.IsNull()) { - thePFace.PerformFromEnd(FUntil); + thePFace.PerformFromEnd(FUntil); } else { - thePFace.PerformThruAll(); + thePFace.PerformThruAll(); } } else { //FUntil.IsNull() @@ -718,7 +738,7 @@ return 1; } - DBRep::Set(a[2],thePFace); + DBRep::Set(a[2], thePFace); dout.Flush(); return 0; } @@ -730,50 +750,50 @@ //purpose : //======================================================================= -static Standard_Integer SPLS(Draw_Interpretor& , - Standard_Integer narg, const char** a) +static Standard_Integer SPLS(Draw_Interpretor&, + Standard_Integer narg, const char** a) { Standard_Integer newnarg; if (narg < 3) { - std::cout << "Invalid number of arguments. Should be : splitshape result shape [splitedges] \ - [face wire/edge/compound [wire/edge/compound ...] \ - [face wire/edge/compound [wire/edge/compound...] ...] \ - [@ edgeonshape edgeonwire [edgeonshape edgeonwire...]]" << std::endl; + Message::SendFail() << "Invalid number of arguments. Should be : splitshape result shape [splitedges] " + "[face wire/edge/compound [wire/edge/compound ...] " + "[face wire/edge/compound [wire/edge/compound...] ...] " + "[@ edgeonshape edgeonwire [edgeonshape edgeonwire...]]"; return 1; } TopoDS_Shape S = DBRep::Get(a[2]); if (S.IsNull()) { - std::cout << "Invalid input shape " << a[2]< 4) { - if (!strcmp(a[4],"i")) + if (!strcmp(a[4], "i")) JT = GeomAbs_Intersection; - if (!strcmp(a[4],"t")) + if (!strcmp(a[4], "t")) JT = GeomAbs_Tangent; } @@ -926,14 +946,14 @@ Tol = Draw::Atof(a[5]); BRepOffset_MakeOffset B; - B.Initialize(S,Of,Tol,BRepOffset_Skin,Inter,0,JT,Standard_True); + B.Initialize(S, Of, Tol, BRepOffset_Skin, Inter, 0, JT, Standard_True); B.MakeOffsetShape(); const BRepOffset_Error aRetCode = B.Error(); reportOffsetState(theCommands, aRetCode); - DBRep::Set(a[1],B.Shape()); + DBRep::Set(a[1], B.Shape()); return 0; } @@ -943,42 +963,42 @@ //======================================================================= Standard_Integer offsetshape(Draw_Interpretor& theCommands, - Standard_Integer n, const char** a) + Standard_Integer n, const char** a) { - if ( n < 4) return 1; - TopoDS_Shape S = DBRep::Get(a[2]); + if (n < 4) return 1; + TopoDS_Shape S = DBRep::Get(a[2]); if (S.IsNull()) return 1; - Standard_Real Of = Draw::Atof(a[3]); - Standard_Boolean Inter = (!strcmp(a[0],"offsetcompshape")); - GeomAbs_JoinType JT= GeomAbs_Arc; - if (!strcmp(a[0],"offsetinter")) + Standard_Real Of = Draw::Atof(a[3]); + Standard_Boolean Inter = (!strcmp(a[0], "offsetcompshape")); + GeomAbs_JoinType JT = GeomAbs_Arc; + if (!strcmp(a[0], "offsetinter")) { - JT = GeomAbs_Intersection; + JT = GeomAbs_Intersection; Inter = Standard_True; } - + BRepOffset_MakeOffset B; - Standard_Integer IB = 4; + Standard_Integer IB = 4; Standard_Real Tol = Precision::Confusion(); if (n > 4) { - TopoDS_Shape SF = DBRep::Get(a[4],TopAbs_FACE); + TopoDS_Shape SF = DBRep::Get(a[4], TopAbs_FACE); if (SF.IsNull()) { - IB = 5; + IB = 5; Tol = Draw::Atof(a[4]); } } - B.Initialize(S,Of,Tol,BRepOffset_Skin,Inter,0,JT); + B.Initialize(S, Of, Tol, BRepOffset_Skin, Inter, 0, JT); //------------------------------------------ // recuperation et chargement des bouchons. //---------------------------------------- Standard_Boolean YaBouchon = Standard_False; - for (Standard_Integer i = IB ; i < n; i++) + for (Standard_Integer i = IB; i < n; i++) { - TopoDS_Shape SF = DBRep::Get(a[i],TopAbs_FACE); + TopoDS_Shape SF = DBRep::Get(a[i], TopAbs_FACE); if (!SF.IsNull()) { YaBouchon = Standard_True; @@ -987,12 +1007,12 @@ } if (!YaBouchon) B.MakeOffsetShape(); - else B.MakeThickSolid (); + else B.MakeThickSolid(); const BRepOffset_Error aRetCode = B.Error(); reportOffsetState(theCommands, aRetCode); - DBRep::Set(a[1],B.Shape()); + DBRep::Set(a[1], B.Shape()); return 0; } @@ -1001,30 +1021,31 @@ static Standard_Real TheRadius; static Standard_Boolean theYaBouchon; static Standard_Real TheTolerance = Precision::Confusion(); -static Standard_Boolean TheInter = Standard_False; -static GeomAbs_JoinType TheJoin = GeomAbs_Arc; +static Standard_Boolean TheInter = Standard_False; +static GeomAbs_JoinType TheJoin = GeomAbs_Arc; static Standard_Boolean RemoveIntEdges = Standard_False; Standard_Integer offsetparameter(Draw_Interpretor& di, - Standard_Integer n, const char** a) + Standard_Integer n, const char** a) { - if ( n == 1 ) { + if (n == 1) { di << " offsetparameter Tol Inter(c/p) JoinType(a/i/t) [RemoveInternalEdges(r/k)]\n"; di << " Current Values\n"; di << " --> Tolerance : " << TheTolerance << "\n"; di << " --> TheInter : "; - if ( TheInter) { - di << "Complet" ; - } else { + if (TheInter) { + di << "Complet"; + } + else { di << "Partial"; } di << "\n --> TheJoin : "; - + switch (TheJoin) { case GeomAbs_Arc: di << "Arc"; break; case GeomAbs_Intersection: di << "Intersection"; break; default: - break ; + break; } // di << "\n --> Internal Edges : "; @@ -1039,14 +1060,14 @@ return 0; } - if ( n < 4 ) return 1; + if (n < 4) return 1; // TheTolerance = Draw::Atof(a[1]); - TheInter = strcmp(a[2],"p") != 0; + TheInter = strcmp(a[2], "p") != 0; // - if ( !strcmp(a[3],"a")) TheJoin = GeomAbs_Arc; - else if ( !strcmp(a[3],"i")) TheJoin = GeomAbs_Intersection; - else if ( !strcmp(a[3],"t")) TheJoin = GeomAbs_Tangent; + if (!strcmp(a[3], "a")) TheJoin = GeomAbs_Arc; + else if (!strcmp(a[3], "i")) TheJoin = GeomAbs_Intersection; + else if (!strcmp(a[3], "t")) TheJoin = GeomAbs_Tangent; // RemoveIntEdges = (n >= 5) ? !strcmp(a[4], "r") : Standard_False; // @@ -1058,24 +1079,24 @@ //purpose : //======================================================================= -Standard_Integer offsetload(Draw_Interpretor& , +Standard_Integer offsetload(Draw_Interpretor&, Standard_Integer n, const char** a) { - if ( n < 2) return 1; - TopoDS_Shape S = DBRep::Get(a[1]); + if (n < 2) return 1; + TopoDS_Shape S = DBRep::Get(a[1]); if (S.IsNull()) return 1; - Standard_Real Of = Draw::Atof(a[2]); + Standard_Real Of = Draw::Atof(a[2]); TheRadius = Of; -// Standard_Boolean Inter = Standard_True; - - TheOffset.Initialize(S,Of,TheTolerance,BRepOffset_Skin,TheInter,0,TheJoin, - Standard_False, RemoveIntEdges); + // Standard_Boolean Inter = Standard_True; + + TheOffset.Initialize(S, Of, TheTolerance, BRepOffset_Skin, TheInter, 0, TheJoin, + Standard_False, RemoveIntEdges); //------------------------------------------ // recuperation et chargement des bouchons. //---------------------------------------- - for (Standard_Integer i = 3 ; i < n; i++) { - TopoDS_Shape SF = DBRep::Get(a[i],TopAbs_FACE); + for (Standard_Integer i = 3; i < n; i++) { + TopoDS_Shape SF = DBRep::Get(a[i], TopAbs_FACE); if (!SF.IsNull()) { TheOffset.AddFace(TopoDS::Face(SF)); } @@ -1094,16 +1115,16 @@ Standard_Integer offsetonface(Draw_Interpretor&, Standard_Integer n, const char** a) { - if ( n < 3) return 1; + if (n < 3) return 1; - for (Standard_Integer i = 1 ; i < n; i+=2) { - TopoDS_Shape SF = DBRep::Get(a[i],TopAbs_FACE); + for (Standard_Integer i = 1; i < n; i += 2) { + TopoDS_Shape SF = DBRep::Get(a[i], TopAbs_FACE); if (!SF.IsNull()) { - Standard_Real Of = Draw::Atof(a[i+1]); - TheOffset.SetOffsetOnFace(TopoDS::Face(SF),Of); + Standard_Real Of = Draw::Atof(a[i + 1]); + TheOffset.SetOffsetOnFace(TopoDS::Face(SF), Of); } } - + return 0; } @@ -1113,28 +1134,36 @@ //======================================================================= Standard_Integer offsetperform(Draw_Interpretor& theCommands, - Standard_Integer theNArg, const char** a) - { - if ( theNArg < 2) return 1; + Standard_Integer theNArg, const char** a) +{ + if (theNArg < 2) return 1; if (theYaBouchon) - TheOffset.MakeThickSolid (); + TheOffset.MakeThickSolid(); else TheOffset.MakeOffsetShape(); - if(TheOffset.IsDone()) - { - DBRep::Set(a[1],TheOffset.Shape()); - } + if (TheOffset.IsDone()) + { + DBRep::Set(a[1], TheOffset.Shape()); + } else - { - const BRepOffset_Error aRetCode = TheOffset.Error(); - reportOffsetState(theCommands, aRetCode); - } + { + const BRepOffset_Error aRetCode = TheOffset.Error(); + reportOffsetState(theCommands, aRetCode); + } - return 0; + // Store the history of Boolean operation into the session + if (BRepTest_Objects::IsHistoryNeeded()) + { + TopTools_ListOfShape aLA; + aLA.Append(TheOffset.InitShape()); + BRepTest_Objects::SetHistory(aLA, TheOffset); } + return 0; +} + //======================================================================= //function : ROW @@ -1142,16 +1171,16 @@ //======================================================================= static Standard_Integer ROW(Draw_Interpretor& theCommands, - Standard_Integer narg, const char** a) + Standard_Integer narg, const char** a) { - if (narg<13) return 1; + if (narg < 13) return 1; TopoDS_Shape S = DBRep::Get(a[3]); BRepFeat_MakeRevol theRFace; gp_Dir D; gp_Pnt Or; - Standard_Real Angle=0; - TopoDS_Shape FFrom,FUntil; - Standard_Integer i,borne; + Standard_Real Angle = 0; + TopoDS_Shape FFrom, FUntil; + Standard_Integer i, borne; Standard_Boolean fuse; if (a[1][0] == 'f' || a[1][0] == 'F') { @@ -1164,61 +1193,61 @@ return 1; } - FFrom = DBRep::Get(a[4],TopAbs_SHAPE); + FFrom = DBRep::Get(a[4], TopAbs_SHAPE); if (FFrom.IsNull()) { Angle = Draw::Atof(a[4]); - Angle *=M_PI/180.; + Angle *= M_PI / 180.; i = 5; } else { - FUntil = DBRep::Get(a[5],TopAbs_SHAPE); + FUntil = DBRep::Get(a[5], TopAbs_SHAPE); if (FUntil.IsNull()) { i = 5; FUntil = FFrom; FFrom.Nullify(); - + } else { if (narg < 14) { - return 1; + return 1; } i = 6; } } - borne = i+6; + borne = i + 6; - Or.SetCoord(Draw::Atof(a[i]),Draw::Atof(a[i+1]),Draw::Atof(a[i+2])); - D.SetCoord(Draw::Atof(a[i+3]),Draw::Atof(a[i+4]),Draw::Atof(a[i+5])); - gp_Ax1 theAxis(Or,D); - - TopoDS_Shape aLocalShape(DBRep::Get(a[borne],TopAbs_FACE)); - TopoDS_Face F = TopoDS::Face(aLocalShape); -// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[borne],TopAbs_FACE)); + Or.SetCoord(Draw::Atof(a[i]), Draw::Atof(a[i + 1]), Draw::Atof(a[i + 2])); + D.SetCoord(Draw::Atof(a[i + 3]), Draw::Atof(a[i + 4]), Draw::Atof(a[i + 5])); + gp_Ax1 theAxis(Or, D); + + TopoDS_Shape aLocalShape(DBRep::Get(a[borne], TopAbs_FACE)); + TopoDS_Face F = TopoDS::Face(aLocalShape); + // TopoDS_Face F = TopoDS::Face(DBRep::Get(a[borne],TopAbs_FACE)); BRepFeat_SplitShape Spls(F); - for (i = borne+1; iDynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { - Su = Handle(Geom_RectangularTrimmedSurface):: - DownCast(Su)->BasisSurface(); + Su = Handle(Geom_RectangularTrimmedSurface):: + DownCast(Su)->BasisSurface(); } if (Su->DynamicType() == STANDARD_TYPE(Geom_Plane)) { - gp_Pln pl = Handle(Geom_Plane)::DownCast(Su)->Pln(); - if (pl.Axis().IsParallel(theAxis,Precision::Angular())) { - FEIF.Set(ToRotate,fac); - for (FEIF.Init();FEIF.More();FEIF.Next()) { - theRFace.Add(FEIF.Edge(),fac); - } - } + gp_Pln pl = Handle(Geom_Plane)::DownCast(Su)->Pln(); + if (pl.Axis().IsParallel(theAxis, Precision::Angular())) { + FEIF.Set(ToRotate, fac); + for (FEIF.Init(); FEIF.More(); FEIF.Next()) { + theRFace.Add(FEIF.Edge(), fac); + } + } } else if (Su->DynamicType() == STANDARD_TYPE(Geom_CylindricalSurface)) { - gp_Cylinder cy = - Handle(Geom_CylindricalSurface)::DownCast(Su)->Cylinder(); - if (cy.Axis().IsCoaxial(theAxis, - Precision::Angular(),Precision::Confusion())) { - FEIF.Set(ToRotate,fac); - for (FEIF.Init();FEIF.More();FEIF.Next()) { - theRFace.Add(FEIF.Edge(),fac); - } - } + gp_Cylinder cy = + Handle(Geom_CylindricalSurface)::DownCast(Su)->Cylinder(); + if (cy.Axis().IsCoaxial(theAxis, + Precision::Angular(), Precision::Confusion())) { + FEIF.Set(ToRotate, fac); + for (FEIF.Init(); FEIF.More(); FEIF.Next()) { + theRFace.Add(FEIF.Edge(), fac); + } + } } } } @@ -1284,7 +1313,7 @@ } } else { // borne == 12 - theRFace.Perform(FFrom,FUntil); + theRFace.Perform(FFrom, FUntil); } if (!theRFace.IsDone()) { @@ -1292,7 +1321,7 @@ return 1; } - DBRep::Set(a[2],theRFace); + DBRep::Set(a[2], theRFace); dout.Flush(); return 0; } @@ -1304,16 +1333,16 @@ //======================================================================= static Standard_Integer ROF(Draw_Interpretor& theCommands, - Standard_Integer narg, const char** a) + Standard_Integer narg, const char** a) { - if (narg<12) return 1; + if (narg < 12) return 1; TopoDS_Shape S = DBRep::Get(a[3]); BRepFeat_MakeRevol theRFace; gp_Dir D; gp_Pnt Or; - Standard_Real Angle=0; - TopoDS_Shape FFrom,FUntil; - Standard_Integer i,borne; + Standard_Real Angle = 0; + TopoDS_Shape FFrom, FUntil; + Standard_Integer i, borne; Standard_Boolean fuse; if (a[1][0] == 'f' || a[1][0] == 'F') { @@ -1326,67 +1355,67 @@ return 1; } - FFrom = DBRep::Get(a[4],TopAbs_SHAPE); + FFrom = DBRep::Get(a[4], TopAbs_SHAPE); if (FFrom.IsNull()) { Angle = Draw::Atof(a[4]); - Angle *=M_PI/180.; + Angle *= M_PI / 180.; i = 5; } else { - FUntil = DBRep::Get(a[5],TopAbs_SHAPE); + FUntil = DBRep::Get(a[5], TopAbs_SHAPE); if (FUntil.IsNull()) { i = 5; FUntil = FFrom; FFrom.Nullify(); - + } else { if (narg < 13) { - return 1; + return 1; } i = 6; } } - borne = i+6; - Or.SetCoord(Draw::Atof(a[i]),Draw::Atof(a[i+1]),Draw::Atof(a[i+2])); - D.SetCoord(Draw::Atof(a[i+3]),Draw::Atof(a[i+4]),Draw::Atof(a[i+5])); - gp_Ax1 theAxis(Or,D); + borne = i + 6; + Or.SetCoord(Draw::Atof(a[i]), Draw::Atof(a[i + 1]), Draw::Atof(a[i + 2])); + D.SetCoord(Draw::Atof(a[i + 3]), Draw::Atof(a[i + 4]), Draw::Atof(a[i + 5])); + gp_Ax1 theAxis(Or, D); TopoDS_Shape ToRotate; - if (narg == borne+1) { - TopoDS_Shape aLocalShape(DBRep::Get(a[borne],TopAbs_FACE)); - TopoDS_Face F = TopoDS::Face(aLocalShape); -// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[borne],TopAbs_FACE)); - theRFace.Init(S,F,F,theAxis,fuse,Standard_True); + if (narg == borne + 1) { + TopoDS_Shape aLocalShape(DBRep::Get(a[borne], TopAbs_FACE)); + TopoDS_Face F = TopoDS::Face(aLocalShape); + // TopoDS_Face F = TopoDS::Face(DBRep::Get(a[borne],TopAbs_FACE)); + theRFace.Init(S, F, F, theAxis, fuse, Standard_True); ToRotate = F; } else { TopoDS_Shell She; BRep_Builder B; B.MakeShell(She); - - for (i=borne; iDynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { - Su = Handle(Geom_RectangularTrimmedSurface):: - DownCast(Su)->BasisSurface(); + Su = Handle(Geom_RectangularTrimmedSurface):: + DownCast(Su)->BasisSurface(); } if (Su->DynamicType() == STANDARD_TYPE(Geom_Plane)) { - gp_Pln pl = Handle(Geom_Plane)::DownCast(Su)->Pln(); - if (pl.Axis().IsParallel(theAxis,Precision::Angular())) { - FEIF.Set(ToRotate,fac); - for (FEIF.Init();FEIF.More();FEIF.Next()) { - theRFace.Add(FEIF.Edge(),fac); - } - } + gp_Pln pl = Handle(Geom_Plane)::DownCast(Su)->Pln(); + if (pl.Axis().IsParallel(theAxis, Precision::Angular())) { + FEIF.Set(ToRotate, fac); + for (FEIF.Init(); FEIF.More(); FEIF.Next()) { + theRFace.Add(FEIF.Edge(), fac); + } + } } else if (Su->DynamicType() == STANDARD_TYPE(Geom_CylindricalSurface)) { - gp_Cylinder cy = - Handle(Geom_CylindricalSurface)::DownCast(Su)->Cylinder(); - if (cy.Axis().IsCoaxial(theAxis, - Precision::Angular(),Precision::Confusion())) { - FEIF.Set(ToRotate,fac); - for (FEIF.Init();FEIF.More();FEIF.Next()) { - theRFace.Add(FEIF.Edge(),fac); - } - } + gp_Cylinder cy = + Handle(Geom_CylindricalSurface)::DownCast(Su)->Cylinder(); + if (cy.Axis().IsCoaxial(theAxis, + Precision::Angular(), Precision::Confusion())) { + FEIF.Set(ToRotate, fac); + for (FEIF.Init(); FEIF.More(); FEIF.Next()) { + theRFace.Add(FEIF.Edge(), fac); + } + } } } } @@ -1435,7 +1464,7 @@ } } else { // borne == 12 - theRFace.Perform(FFrom,FUntil); + theRFace.Perform(FFrom, FUntil); } if (!theRFace.IsDone()) { @@ -1443,7 +1472,7 @@ return 1; } - DBRep::Set(a[2],theRFace); + DBRep::Set(a[2], theRFace); dout.Flush(); return 0; } @@ -1454,23 +1483,23 @@ //purpose : Commande glue //======================================================================= -static Standard_Integer GLU(Draw_Interpretor& , - Standard_Integer narg, const char** a) +static Standard_Integer GLU(Draw_Interpretor&, + Standard_Integer narg, const char** a) { - if (narg<6 || narg%2 != 0) return 1; + if (narg < 6 || narg % 2 != 0) return 1; TopoDS_Shape Sne = DBRep::Get(a[2]); TopoDS_Shape Sba = DBRep::Get(a[3]); - + Standard_Boolean pick; - - BRepFeat_Gluer theGl(Sne,Sba); - TopoDS_Shape Fne,Fba; - + + BRepFeat_Gluer theGl(Sne, Sba); + TopoDS_Shape Fne, Fba; + LocOpe_FindEdges fined; Standard_Integer i = 4; Standard_Boolean first = Standard_True; - while (iSetParams(ta,t3d,t2d,t3d,t2d,fl); + Rakk = new BRepFilletAPI_MakeFillet(V, FSh); + Rakk->SetParams(ta, t3d, t2d, t3d, t2d, fl); Rakk->SetContinuity(blend_cont, tapp_angle); Standard_Real Rad; TopoDS_Shape S; @@ -2183,57 +2261,57 @@ Standard_Integer nbedge = 0; if (Kas == 2) { - for (Standard_Integer ii = 1; ii < (narg-1)/2; ii++){ - Rad = Draw::Atof(a[2*ii + 1]); - if (Rad == 0.) continue; - S = DBRep::Get(a[(2*ii+2)],TopAbs_SHAPE); - TopExp_Explorer exp; - for (exp.Init(S,TopAbs_EDGE); exp.More(); exp.Next()) { - E = TopoDS::Edge(exp.Current()); - if(!E.IsNull()){ - Rakk->Add(Rad,E); - nbedge++; - } - } + for (Standard_Integer ii = 1; ii < (narg - 1) / 2; ii++) { + Rad = Draw::Atof(a[2 * ii + 1]); + if (Rad == 0.) continue; + S = DBRep::Get(a[(2 * ii + 2)], TopAbs_SHAPE); + TopExp_Explorer exp; + for (exp.Init(S, TopAbs_EDGE); exp.More(); exp.Next()) { + E = TopoDS::Edge(exp.Current()); + if (!E.IsNull()) { + Rakk->Add(Rad, E); + nbedge++; + } + } } } else if (Kas == 3) { Rad = Draw::Atof(a[3]); if (Rad != 0.) { - S = theShapeTop; - TopExp_Explorer exp; - for (exp.Init(S,TopAbs_EDGE); exp.More(); exp.Next()) { - E = TopoDS::Edge(exp.Current()); - if(!E.IsNull()){ - Rakk->Add(Rad,E); - nbedge++; - } - } + S = theShapeTop; + TopExp_Explorer exp; + for (exp.Init(S, TopAbs_EDGE); exp.More(); exp.Next()) { + E = TopoDS::Edge(exp.Current()); + if (!E.IsNull()) { + Rakk->Add(Rad, E); + nbedge++; + } + } } Rad = Draw::Atof(a[4]); if (Rad != 0.) { - S = theShapeBottom; - TopExp_Explorer exp; - for (exp.Init(S,TopAbs_EDGE); exp.More(); exp.Next()) { - E = TopoDS::Edge(exp.Current()); - if(!E.IsNull()){ - Rakk->Add(Rad,E); - nbedge++; - } - } + S = theShapeBottom; + TopExp_Explorer exp; + for (exp.Init(S, TopAbs_EDGE); exp.More(); exp.Next()) { + E = TopoDS::Edge(exp.Current()); + if (!E.IsNull()) { + Rakk->Add(Rad, E); + nbedge++; + } + } } } - - if(!nbedge) return 1; + + if (!nbedge) return 1; Rakk->Build(); - if(!Rakk->IsDone()) return 1; + if (!Rakk->IsDone()) return 1; TopoDS_Shape res = Rakk->Shape(); if (Kas == 2) { - DBRep::Set(a[1],res); - } + DBRep::Set(a[1], res); + } else if (Kas == 3) { - DBRep::Set(a[2],res); + DBRep::Set(a[2], res); } dout.Flush(); @@ -2256,8 +2334,8 @@ //purpose : Computes simple offset. //============================================================================= static Standard_Integer ComputeSimpleOffset(Draw_Interpretor& theCommands, - Standard_Integer narg, - const char** a) + Standard_Integer narg, + const char** a) { if (narg < 4) { @@ -2279,12 +2357,12 @@ return 0; } - Standard_Boolean makeSolid = (narg > 4 && !strcasecmp(a[4],"solid")); + Standard_Boolean makeSolid = (narg > 4 && !strcasecmp(a[4], "solid")); int iTolArg = (makeSolid ? 5 : 4); Standard_Real aTol = (narg > iTolArg ? Draw::Atof(a[iTolArg]) : Precision::Confusion()); BRepOffset_MakeSimpleOffset aMaker(aShape, anOffsetValue); - aMaker.SetTolerance (aTol); + aMaker.SetTolerance(aTol); aMaker.SetBuildSolidFlag(makeSolid); aMaker.Perform(); @@ -2304,7 +2382,7 @@ //purpose : //======================================================================= -void BRepTest::FeatureCommands (Draw_Interpretor& theCommands) +void BRepTest::FeatureCommands(Draw_Interpretor& theCommands) { static Standard_Boolean done = Standard_False; if (done) return; @@ -2314,48 +2392,48 @@ const char* g = "TOPOLOGY Feature commands"; - theCommands.Add("localope", - " Performs a local top. operation : localope result shape tool F/C (fuse/cut) face [face...]", - __FILE__,Loc,g); + theCommands.Add("localope", + " Performs a local top. operation : localope result shape tool F/C (fuse/cut) face [face...]", + __FILE__, Loc, g); theCommands.Add("hole", - " Performs a hole : hole result shape Or.X Or.Y Or.Z Dir.X Dir.Y Dir.Z Radius [Pfrom Pto]", - __FILE__,HOLE1,g); + " Performs a hole : hole result shape Or.X Or.Y Or.Z Dir.X Dir.Y Dir.Z Radius [Pfrom Pto]", + __FILE__, HOLE1, g); theCommands.Add("firsthole", - " Performs the first hole : firsthole result shape Or.X Or.Y Or.Z Dir.X Dir.Y Dir.Z Radius", - __FILE__,HOLE2,g); + " Performs the first hole : firsthole result shape Or.X Or.Y Or.Z Dir.X Dir.Y Dir.Z Radius", + __FILE__, HOLE2, g); theCommands.Add("holend", - " Performs the hole til end : holend result shape Or.X Or.Y Or.Z Dir.X Dir.Y Dir.Z Radius", - __FILE__,HOLE3,g); + " Performs the hole til end : holend result shape Or.X Or.Y Or.Z Dir.X Dir.Y Dir.Z Radius", + __FILE__, HOLE3, g); - theCommands.Add("blindhole", - " Performs the blind hole : blindhole result shape Or.X Or.Y Or.Z Dir.X Dir.Y Dir.Z Radius Length", - __FILE__,HOLE4,g); + theCommands.Add("blindhole", + " Performs the blind hole : blindhole result shape Or.X Or.Y Or.Z Dir.X Dir.Y Dir.Z Radius Length", + __FILE__, HOLE4, g); theCommands.Add("holecontrol", - "Sets/Unsets or display controls on holes : holecontrol [0/1]", - __FILE__,CONTROL,g); + "Sets/Unsets or display controls on holes : holecontrol [0/1]", + __FILE__, CONTROL, g); theCommands.Add("wprism", - "Prisms wires on a face : wprism f[use]/c[ut] result shape [[FaceFrom] FaceUntil] VecX VecY VecZ SkecthFace wire1 [wire2 ....]", - __FILE__,PRW,g); + "Prisms wires on a face : wprism f[use]/c[ut] result shape [[FaceFrom] FaceUntil] VecX VecY VecZ SkecthFace wire1 [wire2 ....]", + __FILE__, PRW, g); - theCommands.Add("fprism", - "Prisms a set of faces of a shape : fprism f[use]/c[ut] result shape [[FaceFrom] FaceUntil] VecX VecY VecZ face1 [face2...]", - __FILE__,PRF,g); + theCommands.Add("fprism", + "Prisms a set of faces of a shape : fprism f[use]/c[ut] result shape [[FaceFrom] FaceUntil] VecX VecY VecZ face1 [face2...]", + __FILE__, PRF, g); theCommands.Add("wrotate", - "Rotates wires on a face : wrotate f[use]/c[ut] result shape Angle/[FFrom] FUntil OX OY OZ DX DY DZ SkecthFace wire1 [wire2 ....]", - __FILE__,ROW,g); + "Rotates wires on a face : wrotate f[use]/c[ut] result shape Angle/[FFrom] FUntil OX OY OZ DX DY DZ SkecthFace wire1 [wire2 ....]", + __FILE__, ROW, g); - theCommands.Add("frotate", - "Rotates a set of faces of a shape : frotate f[use]/c[ut] result shape Angle/[FaceFrom] FaceUntil OX OY OZ DX DY DZ face1 [face2...]", - __FILE__,ROF,g); + theCommands.Add("frotate", + "Rotates a set of faces of a shape : frotate f[use]/c[ut] result shape Angle/[FaceFrom] FaceUntil OX OY OZ DX DY DZ face1 [face2...]", + __FILE__, ROF, g); theCommands.Add("splitshape", @@ -2364,87 +2442,87 @@ theCommands.Add("thickshell", - "thickshell r shape offset [jointype [tol] ]", - __FILE__,thickshell,g); - + "thickshell r shape offset [jointype [tol] ]", + __FILE__, thickshell, g); + theCommands.Add("offsetshape", - "offsetshape r shape offset [tol] [face ...]", - __FILE__,offsetshape,g); - + "offsetshape r shape offset [tol] [face ...]", + __FILE__, offsetshape, g); + theCommands.Add("offsetcompshape", - "offsetcompshape r shape offset [face ...]", - __FILE__,offsetshape,g); + "offsetcompshape r shape offset [face ...]", + __FILE__, offsetshape, g); theCommands.Add("offsetparameter", - "offsetparameter Tol Inter(c/p) JoinType(a/i/t) [RemoveInternalEdges(r/k)]", - __FILE__,offsetparameter); + "offsetparameter Tol Inter(c/p) JoinType(a/i/t) [RemoveInternalEdges(r/k)]", + __FILE__, offsetparameter); theCommands.Add("offsetload", - "offsetload shape offset bouchon1 bouchon2 ...", - __FILE__,offsetload,g); + "offsetload shape offset bouchon1 bouchon2 ...", + __FILE__, offsetload, g); theCommands.Add("offsetonface", - "offsetonface face1 offset1 face2 offset2 ...", - __FILE__,offsetonface,g); + "offsetonface face1 offset1 face2 offset2 ...", + __FILE__, offsetonface, g); theCommands.Add("offsetperform", - "offsetperform result", - __FILE__,offsetperform,g); + "offsetperform result", + __FILE__, offsetperform, g); - theCommands.Add("glue", - "glue result shapenew shapebase facenew facebase [facenew facebase...] [edgenew edgebase [edgenew edgebase...]]", - __FILE__,GLU,g); + theCommands.Add("glue", + "glue result shapenew shapebase facenew facebase [facenew facebase...] [edgenew edgebase [edgenew edgebase...]]", + __FILE__, GLU, g); - theCommands.Add("featprism", - "Defines the arguments for a prism : featprism shape element skface Dirx Diry Dirz Fuse(0/1/2) Modify(0/1)", - __FILE__,DEFIN); + theCommands.Add("featprism", + "Defines the arguments for a prism : featprism shape element skface Dirx Diry Dirz Fuse(0/1/2) Modify(0/1)", + __FILE__, DEFIN); - theCommands.Add("featrevol", - "Defines the arguments for a revol : featrevol shape element skface Ox Oy Oz Dx Dy Dz Fuse(0/1/2) Modify(0/1)", - __FILE__,DEFIN); + theCommands.Add("featrevol", + "Defines the arguments for a revol : featrevol shape element skface Ox Oy Oz Dx Dy Dz Fuse(0/1/2) Modify(0/1)", + __FILE__, DEFIN); - theCommands.Add("featpipe", - "Defines the arguments for a pipe : featpipe shape element skface spine Fuse(0/1/2) Modify(0/1)", - __FILE__,DEFIN); + theCommands.Add("featpipe", + "Defines the arguments for a pipe : featpipe shape element skface spine Fuse(0/1/2) Modify(0/1)", + __FILE__, DEFIN); - theCommands.Add("featdprism", - "Defines the arguments for a drafted prism : featdprism shape face skface angle Fuse(0/1/2) Modify(0/1)", - __FILE__,DEFIN); + theCommands.Add("featdprism", + "Defines the arguments for a drafted prism : featdprism shape face skface angle Fuse(0/1/2) Modify(0/1)", + __FILE__, DEFIN); - theCommands.Add("featlf", - "Defines the arguments for a linear rib or slot : featlf shape wire plane DirX DirY DirZ DirX DirY DirZ Fuse(0/1/2) Modify(0/1)", - __FILE__,DEFIN); + theCommands.Add("featlf", + "Defines the arguments for a linear rib or slot : featlf shape wire plane DirX DirY DirZ DirX DirY DirZ Fuse(0/1/2) Modify(0/1)", + __FILE__, DEFIN); - theCommands.Add("featrf", - "Defines the arguments for a rib or slot of revolution : featrf shape wire plane X Y Z DirX DirY DirZ Size Size Fuse(0/1/2) Modify(0/1)", - __FILE__,DEFIN); + theCommands.Add("featrf", + "Defines the arguments for a rib or slot of revolution : featrf shape wire plane X Y Z DirX DirY DirZ Size Size Fuse(0/1/2) Modify(0/1)", + __FILE__, DEFIN); - theCommands.Add("addslide", - " Adds sliding elements : addslide prism/revol/pipe edge face [edge face...]", - __FILE__,ADD); + theCommands.Add("addslide", + " Adds sliding elements : addslide prism/revol/pipe edge face [edge face...]", + __FILE__, ADD); - theCommands.Add("featperform", - " Performs the prism revol dprism linform or pipe :featperform prism/revol/pipe/dprism/lf result [[Ffrom] Funtil]", - __FILE__,PERF); + theCommands.Add("featperform", + " Performs the prism revol dprism linform or pipe :featperform prism/revol/pipe/dprism/lf result [[Ffrom] Funtil]", + __FILE__, PERF); - theCommands.Add("featperformval", - " Performs the prism revol dprism or linform with a value :featperformval prism/revol/dprism/lf result value", - __FILE__,PERF); + theCommands.Add("featperformval", + " Performs the prism revol dprism or linform with a value :featperformval prism/revol/dprism/lf result value", + __FILE__, PERF); - theCommands.Add("endedges", - " Return top and bottom edges of dprism :endedges dprism shapetop shapebottom First/LastShape (1/2)", - __FILE__,BOSS); + theCommands.Add("endedges", + " Return top and bottom edges of dprism :endedges dprism shapetop shapebottom First/LastShape (1/2)", + __FILE__, BOSS); - theCommands.Add("fillet", - " Perform fillet on compounds of edges :fillet result object rad1 comp1 rad2 comp2 ...", - __FILE__,BOSS); + theCommands.Add("fillet", + " Perform fillet on compounds of edges :fillet result object rad1 comp1 rad2 comp2 ...", + __FILE__, BOSS); - theCommands.Add("bossage", - " Perform fillet on top and bottom edges of dprism :bossage dprism result radtop radbottom First/LastShape (1/2)", - __FILE__,BOSS); + theCommands.Add("bossage", + " Perform fillet on top and bottom edges of dprism :bossage dprism result radtop radbottom First/LastShape (1/2)", + __FILE__, BOSS); - theCommands.Add("offsetshapesimple", - "offsetshapesimple result shape offsetvalue [solid] [tolerance=1e-7]", - __FILE__, ComputeSimpleOffset); + theCommands.Add("offsetshapesimple", + "offsetshapesimple result shape offsetvalue [solid] [tolerance=1e-7]", + __FILE__, ComputeSimpleOffset); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_FilletCommands.cxx opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_FilletCommands.cxx --- opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_FilletCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_FilletCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,6 +51,7 @@ #include #include #include +#include #include @@ -333,7 +334,7 @@ printtolblend(di); if(narg < 5) { - std::cout << "Use result shape1 shape2 radius [-d]" << std::endl; + Message::SendFail() << "Use result shape1 shape2 radius [-d]"; return 1; } @@ -341,7 +342,7 @@ TopoDS_Shape S1 = DBRep::Get(a[2]); TopoDS_Shape S2 = DBRep::Get(a[3]); if (S1.IsNull() || S2.IsNull()) { - printf(" Null shapes are not allowed \n"); + Message::SendFail() << " Null shapes are not allowed"; return 1; } Standard_Real Rad = Draw::Atof(a[4]); @@ -363,7 +364,7 @@ // theDSFiller.Perform(); if (theDSFiller.HasErrors()) { - printf("Check types of the arguments, please\n"); + Message::SendFail() << "Check types of the arguments, please"; return 1; } @@ -377,7 +378,7 @@ Standard_Boolean anIsDone = pBuilder->IsDone(); if (!anIsDone) { - printf("boolean operation not done HasErrors()=%d\n", pBuilder->HasErrors()); + Message::SendFail() << "boolean operation not done HasErrors()=" << pBuilder->HasErrors(); return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_FillingCommands.cxx opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_FillingCommands.cxx --- opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_FillingCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_FillingCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -97,6 +97,7 @@ #include #include +#include #include #include @@ -452,13 +453,18 @@ static Standard_Integer filling( Draw_Interpretor & di, Standard_Integer n, const char** a ) { #ifdef OCCT_DEBUG - // Chronmetrage + // Chronometrage OSD_Chronometer Chrono; Chrono.Reset(); Chrono.Start(); #endif - if (n < 7) return 1; + if (n < 7) + { + di.PrintHelp(a[0]); + return 1; + } + Standard_Integer NbBounds = Draw::Atoi( a[2] ); Standard_Integer NbConstraints = Draw::Atoi( a[3] ); Standard_Integer NbPoints = Draw::Atoi( a[4] ); @@ -473,8 +479,6 @@ TolCurv, MaxDeg, MaxSegments ); - //TopoDS_Shape aLocalFace(DBRep::Get( a[5], TopAbs_FACE ) ); - //TopoDS_Face InitFace = TopoDS::Face( aLocalFace); TopoDS_Face InitFace = TopoDS::Face( DBRep::Get(a[5], TopAbs_FACE) ); if (! InitFace.IsNull()) MakeFilling.LoadInitSurface( InitFace ); @@ -484,104 +488,94 @@ TopoDS_Face F; gp_Pnt Point; Standard_Integer Order; + TopTools_ListOfShape ListForHistory; for (k = 1; k <= NbBounds; k++) - { - E.Nullify(); - F.Nullify(); - //TopoDS_Shape aLocalEdge(DBRep::Get( a[i], TopAbs_EDGE )); - //E = TopoDS::Edge(aLocalEdge); - E = TopoDS::Edge( DBRep::Get(a[i], TopAbs_EDGE) ); - if (! E.IsNull()) - i++; - //aLocalFace = DBRep::Get( a[i], TopAbs_FACE ) ; - //F = TopoDS::Face(aLocalFace); - F = TopoDS::Face( DBRep::Get(a[i], TopAbs_FACE) ); - if (! F.IsNull()) - i++; - - Order = Draw::Atoi( a[i++] ); - - if (! E.IsNull() && ! F.IsNull()) - MakeFilling.Add( E, F, (GeomAbs_Shape)Order ); - else if (E.IsNull()) - { - if (F.IsNull()) - { - //std::cout< #include #include +#include static void SampleEdges (const TopoDS_Shape& theShape, @@ -277,7 +278,7 @@ { if (n <= 2) { - std::cout<<"Invalid input arguments. Should be: curve1 [curve2 ...] shape [result] [tol]"< #include #include +#include #include #include #include @@ -31,7 +32,7 @@ #include #include #include - +#include //======================================================================= // box @@ -39,28 +40,153 @@ static Standard_Integer box(Draw_Interpretor& , Standard_Integer n, const char** a) { - if (n < 5) return 1; - Standard_Real dx = Draw::Atof(a[n-3]); - Standard_Real dy = Draw::Atof(a[n-2]); - Standard_Real dz = Draw::Atof(a[n-1]); + gp_Pnt anOrigin; + gp_XYZ aParams; + gp_Dir aDir; + gp_Dir aXDir; + Standard_Boolean isMinMax = Standard_False; + Standard_Boolean isPreview = Standard_False; + Standard_Boolean isAxis = Standard_False; + + for (Standard_Integer anArgIter = 2; anArgIter < n; ++anArgIter) + { + TCollection_AsciiString anArgCase (a[anArgIter]); + anArgCase.LowerCase(); + if (anArgCase == "-min" && anArgIter + 3 <= n) + { + anOrigin.SetX (Draw::Atof(a[anArgIter + 1])); + anOrigin.SetY (Draw::Atof(a[anArgIter + 2])); + anOrigin.SetZ (Draw::Atof(a[anArgIter + 3])); + anArgIter += 3; + } + else if (anArgCase == "-max" && anArgIter + 3 <= n) + { + aParams.SetX (Draw::Atof(a[anArgIter + 1])); + aParams.SetY (Draw::Atof(a[anArgIter + 2])); + aParams.SetZ (Draw::Atof(a[anArgIter + 3])); + isMinMax = Standard_True; + anArgIter += 3; + } + else if (anArgCase == "-size" && anArgIter + 3 <= n) + { + aParams.SetX (Draw::Atof(a[anArgIter + 1])); + aParams.SetY (Draw::Atof(a[anArgIter + 2])); + aParams.SetZ (Draw::Atof(a[anArgIter + 3])); + isMinMax = Standard_False; + anArgIter += 3; + } + else if (anArgCase == "-dir" && anArgIter + 3 <= n) + { + Standard_Real aX = Draw::Atof(a[anArgIter + 1]); + Standard_Real anY = Draw::Atof(a[anArgIter + 2]); + Standard_Real aZ = Draw::Atof(a[anArgIter + 3]); + aDir.SetCoord (aX, anY, aZ); + isAxis = Standard_True; + anArgIter += 3; + } + else if (anArgCase == "-xdir" && anArgIter + 3 <= n) + { + Standard_Real aX = Draw::Atof(a[anArgIter + 1]); + Standard_Real anY = Draw::Atof(a[anArgIter + 2]); + Standard_Real aZ = Draw::Atof(a[anArgIter + 3]); + aXDir.SetCoord (aX, anY, aZ); + isAxis = Standard_True; + anArgIter += 3; + } + else if (anArgCase == "-preview") + { + isPreview = Standard_True; + } + else if (anArgIter + 5 < n || anArgIter + 2 < n) + { + Standard_Real aValue = 0.0; + Standard_Integer aCountReal = 0; + Standard_Integer anIter = anArgIter; + while (anIter < n && Draw::ParseReal(a[anIter], aValue)) + { + anIter++; + aCountReal++; + } + + if (aCountReal == 6) + { + anOrigin.SetX (Draw::Atof(a[anArgIter])); + anOrigin.SetY (Draw::Atof(a[anArgIter + 1])); + anOrigin.SetZ (Draw::Atof(a[anArgIter + 2])); + + aParams.SetX (Draw::Atof(a[anArgIter + 3])); + aParams.SetY (Draw::Atof(a[anArgIter + 4])); + aParams.SetZ (Draw::Atof(a[anArgIter + 5])); + anArgIter += 5; + } + + else if (aCountReal == 3) + { + aParams.SetX (Draw::Atof(a[anArgIter])); + aParams.SetY (Draw::Atof(a[anArgIter + 1])); + aParams.SetZ (Draw::Atof(a[anArgIter + 2])); + anArgIter += 2; + } + else + { + Message::SendFail() << "Syntax error"; + return 1; + } + } + } - TopoDS_Solid S; + if (isPreview) + { + TopoDS_Shape S; + BRepPreviewAPI_MakeBox aPreview; + + if (isMinMax == Standard_True) + { + aPreview.Init (anOrigin, aParams); + } + else if (isMinMax == Standard_False && isAxis == Standard_False) + { + aPreview.Init (anOrigin, aParams.X(), aParams.Y(), aParams.Z()); + } + else if (isAxis) + { + gp_Ax2 anAxis (anOrigin, aDir, aXDir); + aPreview.Init (anAxis, aParams.X(), aParams.Y(), aParams.Z()); + } + else + { + aPreview.Init (aParams.X(), aParams.Y(), aParams.Z()); + } - if (n > 5) { - if (n < 8) return 1; - Standard_Real x = Draw::Atof(a[2]); - Standard_Real y = Draw::Atof(a[3]); - Standard_Real z = Draw::Atof(a[4]); - S = BRepPrimAPI_MakeBox(gp_Pnt(x,y,z),dx,dy,dz); + S = aPreview; + DBRep::Set(a[1],S); } - else { - S = BRepPrimAPI_MakeBox(dx,dy,dz); + else + { + TopoDS_Solid S; + if (isMinMax == Standard_True) + { + S = BRepPrimAPI_MakeBox(anOrigin, aParams); + } + else if (isMinMax == Standard_False && isAxis == Standard_False) + { + S = BRepPrimAPI_MakeBox(anOrigin, aParams.X(), aParams.Y(), aParams.Z()); + } + else if (isAxis) + { + gp_Ax2 anAxis (anOrigin, aDir, aXDir); + S = BRepPrimAPI_MakeBox(anAxis, aParams.X(), aParams.Y(), aParams.Z()); + } + else + { + S = BRepPrimAPI_MakeBox(aParams.X(), aParams.Y(), aParams.Z()); + } + DBRep::Set(a[1],S); } - - DBRep::Set(a[1],S); return 0; } + //======================================================================= // wedge //======================================================================= @@ -274,13 +400,65 @@ const char* g = "Primitive building commands"; - theCommands.Add("box","box name [x1 y1 z1] dx dy dz",__FILE__,box,g); + theCommands.Add ("box", + "box name [dx dy dz] [x y z dx dy dz]" + "\n\t\t: [-min x y z] [-size dx dy dz] [-max x y z]" + "\n\t\t: [-dir x y z -xdir x y z] [-preview]" + "\n\t\t: Construct axes-aligned box and put result into 'name' variable" + "\n\t\t: -min box lower corner, origin; (0,0,0) by default" + "\n\t\t: -size box dimensions (alternative to -max)" + "\n\t\t: -max box upper corner (alternative to -size)" + "\n\t\t: -dir main direction of coordinate system (DZ by default)" + "\n\t\t: -xdir x direction of coordinate system (DX by default)" + "\n\t\t: -preview non-solid shape will be created (vertex, edge, rectangle or box);" + "\n\t\t: otherwise, return NULL shape in case of zero box dimension.", + __FILE__,box,g); + theCommands.Add("wedge","wedge name [Ox Oy Oz Zx Zy Zz Xx Xy Xz] dx dy dz ltx / xmin zmin xmax zmax",__FILE__,wedge,g); - theCommands.Add("pcylinder","pcylinder name [plane(ax2)] R H [angle]",__FILE__,cylinder,g); - theCommands.Add("pcone", "pcone name [plane(ax2)] R1 R2 H [angle]",__FILE__,cone,g); - theCommands.Add("psphere", "psphere name [plane(ax2)] R [angle1 angle2] [angle]",__FILE__,sphere,g); - theCommands.Add("ptorus", "ptorus name [plane(ax2)] R1 R2 [angle1 angle2] [angle]",__FILE__,torus,g); + theCommands.Add("pcylinder", + "pcylinder name [plane(ax2)] R H [angle]" + "\n\t\t: Construct a cylinder and put result into 'name' variable." + "\n\t\t: Parameters of the cylinder :" + "\n\t\t: - plane coordinate system for the construction of the cylinder" + "\n\t\t: - R cylinder radius" + "\n\t\t: - H cylinder height" + "\n\t\t: - angle cylinder top radius", + __FILE__, cylinder, g); + + theCommands.Add("pcone", + "pcone name [plane(ax2)] R1 R2 H [angle]" + "\n\t\t: Construct a cone, part cone or conical frustum and put result into 'name' variable." + "\n\t\t: Parameters of the cone :" + "\n\t\t: - plane coordinate system for the construction of the cone" + "\n\t\t: - R1 cone bottom radius" + "\n\t\t: - R2 cone top radius" + "\n\t\t: - H cone height" + "\n\t\t: - angle angle to create a part cone", + __FILE__, cone, g); + + theCommands.Add("psphere", + "psphere name [plane(ax2)] R [angle1 angle2] [angle]" + "\n\t\t: Construct a sphere, spherical segment or spherical wedge and put result into 'name' variable." + "\n\t\t: Parameters of the sphere :" + "\n\t\t: - plane coordinate system for the construction of the sphere" + "\n\t\t: - R sphere radius" + "\n\t\t: - angle1 first angle to create a spherical segment [-90; 90]" + "\n\t\t: - angle2 second angle to create a spherical segment [-90; 90]" + "\n\t\t: - angle angle to create a spherical wedge", + __FILE__, sphere, g); + + theCommands.Add("ptorus", + "ptorus name [plane(ax2)] R1 R2 [angle1 angle2] [angle]" + "\n\t\t: Construct a torus or torus segment and put result into 'name' variable." + "\n\t\t: Parameters of the torus :" + "\n\t\t: - plane coordinate system for the construction of the torus" + "\n\t\t: - R1 distance from the center of the pipe to the center of the torus" + "\n\t\t: - R2 radius of the pipe" + "\n\t\t: - angle1 first angle to create a torus ring segment" + "\n\t\t: - angle2 second angle to create a torus ring segment" + "\n\t\t: - angle angle to create a torus pipe segment", + __FILE__, torus, g); } diff -Nru opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_SurfaceCommands.cxx opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_SurfaceCommands.cxx --- opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_SurfaceCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_SurfaceCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -46,6 +47,7 @@ #include #include +#include #ifdef _WIN32 //#define strcasecmp strcmp Already defined @@ -75,7 +77,7 @@ Handle(Geom_Surface) S = DrawTrSurf::GetSurface(a[2]); if (S.IsNull()) { - std::cout << a[2] << " is not a surface" << std::endl; + Message::SendFail() << a[2] << " is not a surface"; return 1; } @@ -454,7 +456,7 @@ aSewing.Add(aSeq.Value(i)); Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (theDi, 1); - aSewing.Perform (aProgress); + aSewing.Perform (aProgress->Start()); aSewing.Dump(); const TopoDS_Shape& aRes = aSewing.SewedShape(); @@ -580,7 +582,7 @@ { if( argc < 3) { - std::cout<<"Invalid number of arguments. Should be: checkedgeregularity edge face1 [face2]"< 3 ? DBRep::Get(argv[3],TopAbs_FACE) : aFace1); if( anEdge.IsNull() || aFace1.IsNull() || aFace2.IsNull()) { - std::cout<<"Invalid number of arguments. Should be: getedgeregularity edge face1 [face2]"< #include #include - +#include //======================================================================= // prism @@ -244,7 +244,7 @@ aPipe.Perform(Standard_True); if (!aPipe.IsDone()) { - std::cout << "GeomFill_Pipe cannot make a surface" << std::endl; + Message::SendFail() << "GeomFill_Pipe cannot make a surface"; return 1; } @@ -550,16 +550,6 @@ Standard_Integer n, const char** a) { if (n == 1) { - //std::cout << "setsweep options [arg1 [arg2 [...]]] : options are :" << std::endl; - //std::cout << " -FR : Tangent and Normal are given by Frenet trihedron" <> command !"<< std::endl; di << "You have forgotten the <> command !\n"; return 1; } @@ -589,14 +578,12 @@ } else if (!strcmp(a[1], "-DX")) { if (n != 3) { - //std::cout << "bad arguments !" << std::endl; di << "bad arguments !\n"; return 1; } TopoDS_Shape Surf; Surf = DBRep::Get(a[2], TopAbs_SHAPE); if (Surf.IsNull()) { - //std::cout << a[2] <<"is not a shape !" << std::endl; di << a[2] << "is not a shape !\n"; return 1; } @@ -604,16 +591,14 @@ } else if (!strcmp(a[1], "-CN")) { if (n != 5) { - //std::cout << "bad arguments !" << std::endl; di << "bad arguments !\n"; return 1; } gp_Dir D(Draw::Atof(a[2]), Draw::Atof(a[3]), Draw::Atof(a[4])); - Sweep->SetMode(D);; + Sweep->SetMode(D); } else if (!strcmp(a[1], "-FX")) { if ((n != 5) && (n != 8)) { - //std::cout << "bad arguments !" << std::endl; di << "bad arguments !\n"; return 1; } @@ -632,7 +617,6 @@ { if (n != 5) { - //std::cout << "bad arguments !" << std::endl; di << "bad arguments !\n"; return 1; } @@ -648,7 +632,6 @@ } else { - //std::cout << "The option "<< a[1] << " is unknown !" << std::endl; di << "The option " << a[1] << " is unknown !\n"; return 1; } @@ -663,11 +646,6 @@ Standard_Integer n, const char** a) { if (n == 1) { - //std::cout << "addsweep wire/vertex [Vertex] [-T] [-R] [u0 v0 u1 v1 [...[uN vN]]] : options are :" << std::endl; - //std::cout << " -T : the wire/vertex have to be translated to assume contact"<< std::endl; - //std::cout << " with the spine" <> command !"<< std::endl; di << "You have forgotten the <> command !\n"; return 1; } @@ -691,7 +668,6 @@ (Section.ShapeType() != TopAbs_WIRE && Section.ShapeType() != TopAbs_VERTEX)) { - //std::cout << a[1] <<"is not a wire and is not a vertex!" << std::endl; di << a[1] << " is not a wire and is not a vertex!\n"; return 1; } @@ -705,7 +681,6 @@ // Reading of Vertex TopoDS_Shape InputVertex(DBRep::Get(a[cur], TopAbs_VERTEX)); Vertex = TopoDS::Vertex(InputVertex); - // Vertex = TopoDS::Vertex(DBRep::Get(a[cur],TopAbs_VERTEX)); if (!Vertex.IsNull()) { cur++; HasVertex = Standard_True; @@ -768,15 +743,12 @@ TopoDS_Wire Section; TopoDS_Shape InputShape(DBRep::Get(a[1], TopAbs_SHAPE)); Section = TopoDS::Wire(InputShape); - // Section = TopoDS::Wire(DBRep::Get(a[1],TopAbs_SHAPE)); if (Section.IsNull()) { - //std::cout << a[1] <<"is not a wire !" << std::endl; di << a[1] << "is not a wire !\n"; return 1; } Sweep->Delete(Section); - return 0; } @@ -787,14 +759,6 @@ Standard_Integer n, const char** a) { if (n == 1) { - //std::cout << "build sweep result [-M/-C/-R] [-S] [tol] : options are" << std::endl; - //std::cout << " -M : Discontinuities are treated by Modfication of"<< std::endl; - //std::cout << " the sweeping mode : it is the default" <> command !"<< std::endl; di << "You have forgotten the <> command !\n"; return 1; } if (!Sweep->IsReady()) { - //std::cout << "You have forgotten the <> command !"<< std::endl; di << "You have forgotten the <> command !\n"; return 1; } @@ -841,15 +803,12 @@ // Calcul le resultat Sweep->Build(); if (!Sweep->IsDone()) { - //std::cout << "Buildsweep : Not Done" << std::endl; di << "Buildsweep : Not Done\n"; BRepBuilderAPI_PipeError Stat = Sweep->GetStatus(); if (Stat == BRepBuilderAPI_PlaneNotIntersectGuide) { - //std::cout << "Buildsweep : One Plane not intersect the guide" << std::endl; di << "Buildsweep : One Plane not intersect the guide\n"; } if (Stat == BRepBuilderAPI_ImpossibleContact) { - //std::cout << "BuildSweep : One section can not be in contact with the guide" << std::endl; di << "BuildSweep : One section can not be in contact with the guide\n"; } } @@ -857,7 +816,6 @@ if (mksolid) { Standard_Boolean B; B = Sweep->MakeSolid(); - //if (!B) std::cout << " BuildSweep : It is impossible to make a solid !" << std::endl; if (!B) di << " BuildSweep : It is impossible to make a solid !\n"; } result = Sweep->Shape(); @@ -903,13 +861,11 @@ if ((n != 3) && (n != 4)) return 1; if (Sweep == 0) { - //std::cout << "You have forgotten the <> command !"<< std::endl; di << "You have forgotten the <> command !\n"; return 1; } if (!Sweep->IsReady()) { - //std::cout << "You have forgotten the <> command !"<< std::endl; di << "You have forgotten the <> command !\n"; return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_TopologyCommands.cxx opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_TopologyCommands.cxx --- opencascade-7.4.1+dfsg1/src/BRepTest/BRepTest_TopologyCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTest/BRepTest_TopologyCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -118,7 +119,7 @@ Sec.Approximation(Standard_True); else if (strcasecmp(a[i], "-p")) { - std::cout << "Unknown option: " << a[i] << std::endl; + Message::SendFail() << "Unknown option: " << a[i]; return 1; } } @@ -170,7 +171,6 @@ if ( Face.IsNull()) { TopoDS_Shape Shell = DBRep::Get(a[2],TopAbs_SHELL); if (Shell.IsNull()) { - //std::cout << a[2] << " must be a face or a shell" << std::endl; di << a[2] << " must be a face or a shell\n"; return 1; } @@ -180,7 +180,6 @@ DBRep::Set(a[1],Half.Solid()); } else { - //std::cout << " HalfSpace NotDone" << std::endl; di << " HalfSpace NotDone\n"; return 1; } @@ -192,7 +191,6 @@ DBRep::Set(a[1],Half.Solid()); } else { - //std::cout << " HalfSpace NotDone" << std::endl; di << " HalfSpace NotDone\n"; return 1; } @@ -211,14 +209,12 @@ TopoDS_Shape InputShape(DBRep::Get( a[2] ,TopAbs_FACE)); TopoDS_Face F = TopoDS::Face(InputShape); -// TopoDS_Face F = TopoDS::Face(DBRep::Get(a[2],TopAbs_FACE)); BRepAlgo_FaceRestrictor FR; FR.Init(F); for (Standard_Integer i = 3 ; i < narg ; i++) { TopoDS_Shape InputWire(DBRep::Get(a[i],TopAbs_WIRE)); TopoDS_Wire W = TopoDS::Wire(InputWire); -// TopoDS_Wire W = TopoDS::Wire(DBRep::Get(a[i],TopAbs_WIRE)); FR.Add(W); } FR.Perform(); diff -Nru opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BREntity.cxx opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BREntity.cxx --- opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BREntity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BREntity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -127,7 +127,8 @@ //purpose : //======================================================================= Handle(IGESData_IGESEntity) BRepToIGES_BREntity::TransferShape -(const TopoDS_Shape& start) +(const TopoDS_Shape& start, + const Message_ProgressRange& theProgress) { Handle(IGESData_IGESEntity) res; // TopoDS_Shape theShape; @@ -164,31 +165,31 @@ TopoDS_Face F = TopoDS::Face(start); BRepToIGES_BRShell BS(*this); BS.SetModel(GetModel()); - res = BS.TransferFace(F); + res = BS.TransferFace(F, theProgress); } else if (start.ShapeType() == TopAbs_SHELL) { TopoDS_Shell S = TopoDS::Shell(start); BRepToIGES_BRShell BS(*this); BS.SetModel(GetModel()); - res = BS.TransferShell(S); + res = BS.TransferShell(S, theProgress); } else if (start.ShapeType() == TopAbs_SOLID) { TopoDS_Solid M = TopoDS::Solid(start); BRepToIGES_BRSolid BS(*this); BS.SetModel(GetModel()); - res = BS.TransferSolid(M); + res = BS.TransferSolid(M, theProgress); } else if (start.ShapeType() == TopAbs_COMPSOLID) { TopoDS_CompSolid C = TopoDS::CompSolid(start); BRepToIGES_BRSolid BS(*this); BS.SetModel(GetModel()); - res = BS.TransferCompSolid(C); + res = BS.TransferCompSolid(C, theProgress); } else if (start.ShapeType() == TopAbs_COMPOUND) { TopoDS_Compound C = TopoDS::Compound(start); BRepToIGES_BRSolid BS(*this); BS.SetModel(GetModel()); - res = BS.TransferCompound(C); + res = BS.TransferCompound(C, theProgress); } else { // message d`erreur diff -Nru opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BREntity.hxx opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BREntity.hxx --- opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BREntity.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BREntity.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ #include #include #include +#include + class IGESData_IGESModel; class Transfer_FinderProcess; class IGESData_IGESEntity; @@ -64,7 +66,9 @@ //! Returns the result of the transfert of any Shape //! If the transfer has failed, this member return a NullEntity. - Standard_EXPORT virtual Handle(IGESData_IGESEntity) TransferShape (const TopoDS_Shape& start); + Standard_EXPORT virtual Handle(IGESData_IGESEntity) TransferShape + (const TopoDS_Shape& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Records a new Fail message Standard_EXPORT void AddFail (const TopoDS_Shape& start, const Standard_CString amess); diff -Nru opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BRShell.cxx opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BRShell.cxx --- opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BRShell.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BRShell.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,7 +43,7 @@ #include #include #include -#include +#include #include #include #include @@ -86,7 +86,8 @@ // TransferShell //============================================================================= -Handle(IGESData_IGESEntity) BRepToIGES_BRShell ::TransferShell(const TopoDS_Shape& start) +Handle(IGESData_IGESEntity) BRepToIGES_BRShell ::TransferShell(const TopoDS_Shape& start, + const Message_ProgressRange& theProgress) { Handle(IGESData_IGESEntity) res; @@ -94,11 +95,11 @@ if (start.ShapeType() == TopAbs_FACE) { TopoDS_Face F = TopoDS::Face(start); - res = TransferFace(F); + res = TransferFace(F, theProgress); } else if (start.ShapeType() == TopAbs_SHELL) { TopoDS_Shell S = TopoDS::Shell(start); - res = TransferShell(S); + res = TransferShell(S, theProgress); } else { // message d`erreur @@ -112,15 +113,10 @@ // //============================================================================= -Handle(IGESData_IGESEntity) BRepToIGES_BRShell ::TransferFace(const TopoDS_Face& start) +Handle(IGESData_IGESEntity) BRepToIGES_BRShell ::TransferFace(const TopoDS_Face& start, + const Message_ProgressRange&) { Handle(IGESData_IGESEntity) res; - - Handle(Message_ProgressIndicator) progress = GetTransferProcess()->GetProgress(); - if ( ! progress.IsNull() ) { - if ( progress->UserBreak() ) return res; - progress->Increment(); - } if ( start.IsNull()) { return res; @@ -340,7 +336,8 @@ // TransferShell //============================================================================= -Handle(IGESData_IGESEntity) BRepToIGES_BRShell::TransferShell(const TopoDS_Shell& start) +Handle(IGESData_IGESEntity) BRepToIGES_BRShell::TransferShell(const TopoDS_Shell& start, + const Message_ProgressRange& theProgress) { Handle(IGESData_IGESEntity) res; if ( start.IsNull()) return res; @@ -350,13 +347,19 @@ Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient(); Handle(IGESData_IGESEntity) IFace; - for (Ex.Init(start,TopAbs_FACE); Ex.More(); Ex.Next()) { + Standard_Integer nbshapes = 0; + for (Ex.Init(start, TopAbs_FACE); Ex.More(); Ex.Next()) + nbshapes++; + Message_ProgressScope aPS(theProgress, NULL, nbshapes); + for (Ex.Init(start,TopAbs_FACE); Ex.More() && aPS.More(); Ex.Next()) + { + Message_ProgressRange aRange = aPS.Next(); TopoDS_Face F = TopoDS::Face(Ex.Current()); if (F.IsNull()) { AddWarning(start," a Face is a null entity"); } else { - IFace = TransferFace(F); + IFace = TransferFace (F, aRange); if (!IFace.IsNull()) Seq->Append(IFace); } } diff -Nru opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BRShell.hxx opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BRShell.hxx --- opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BRShell.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BRShell.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,8 @@ #include #include +#include + class BRepToIGES_BREntity; class IGESData_IGESEntity; class TopoDS_Shape; @@ -48,15 +50,18 @@ //! Transfert an Shape entity from TopoDS to IGES //! This entity must be a Face or a Shell. //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESData_IGESEntity) TransferShell (const TopoDS_Shape& start); + Standard_EXPORT Handle(IGESData_IGESEntity) TransferShell (const TopoDS_Shape& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfert an Shell entity from TopoDS to IGES //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESData_IGESEntity) TransferShell (const TopoDS_Shell& start); + Standard_EXPORT Handle(IGESData_IGESEntity) TransferShell (const TopoDS_Shell& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfert a Face entity from TopoDS to IGES //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESData_IGESEntity) TransferFace (const TopoDS_Face& start); + Standard_EXPORT Handle(IGESData_IGESEntity) TransferFace (const TopoDS_Face& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); diff -Nru opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BRSolid.cxx opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BRSolid.cxx --- opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BRSolid.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BRSolid.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -64,7 +65,8 @@ // TransferSolid //============================================================================= -Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferSolid(const TopoDS_Shape& start) +Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferSolid(const TopoDS_Shape& start, + const Message_ProgressRange& theProgress) { Handle(IGESData_IGESEntity) res; @@ -72,15 +74,15 @@ if (start.ShapeType() == TopAbs_SOLID) { TopoDS_Solid M = TopoDS::Solid(start); - res = TransferSolid(M); + res = TransferSolid(M, theProgress); } else if (start.ShapeType() == TopAbs_COMPSOLID) { TopoDS_CompSolid C = TopoDS::CompSolid(start); - res = TransferCompSolid(C); + res = TransferCompSolid(C, theProgress); } else if (start.ShapeType() == TopAbs_COMPOUND) { TopoDS_Compound C = TopoDS::Compound(start); - res = TransferCompound(C); + res = TransferCompound(C, theProgress); } else { // error message @@ -94,7 +96,8 @@ // //============================================================================= -Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferSolid(const TopoDS_Solid& start) +Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferSolid(const TopoDS_Solid& start, + const Message_ProgressRange& theProgress) { Handle(IGESData_IGESEntity) res; if ( start.IsNull()) return res; @@ -104,13 +107,19 @@ BRepToIGES_BRShell BS(*this); Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient(); - for (Ex.Init(start,TopAbs_SHELL); Ex.More(); Ex.Next()) { + Standard_Integer nbshapes = 0; + for (Ex.Init(start, TopAbs_SHELL); Ex.More(); Ex.Next()) + nbshapes++; + Message_ProgressScope aPS(theProgress, NULL, nbshapes); + for (Ex.Init(start,TopAbs_SHELL); Ex.More() && aPS.More(); Ex.Next()) + { + Message_ProgressRange aRange = aPS.Next(); TopoDS_Shell S = TopoDS::Shell(Ex.Current()); if (S.IsNull()) { AddWarning(start," an Shell is a null entity"); } else { - IShell = BS.TransferShell(S); + IShell = BS.TransferShell (S, aRange); if (!IShell.IsNull()) Seq->Append(IShell); } } @@ -145,7 +154,8 @@ // TransferCompSolid //============================================================================= -Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferCompSolid(const TopoDS_CompSolid& start) +Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferCompSolid(const TopoDS_CompSolid& start, + const Message_ProgressRange& theProgress) { Handle(IGESData_IGESEntity) res; if ( start.IsNull()) return res; @@ -154,13 +164,19 @@ Handle(IGESData_IGESEntity) ISolid; Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient(); - for (Ex.Init(start,TopAbs_SOLID); Ex.More(); Ex.Next()) { + Standard_Integer nbshapes = 0; + for (Ex.Init(start, TopAbs_SOLID); Ex.More(); Ex.Next()) + nbshapes++; + Message_ProgressScope aPS(theProgress, NULL, nbshapes); + for (Ex.Init(start,TopAbs_SOLID); Ex.More() && aPS.More(); Ex.Next()) + { + Message_ProgressRange aRange = aPS.Next(); TopoDS_Solid S = TopoDS::Solid(Ex.Current()); if (S.IsNull()) { AddWarning(start," an Solid is a null entity"); } else { - ISolid = TransferSolid(S); + ISolid = TransferSolid (S, aRange); if (!ISolid.IsNull()) Seq->Append(ISolid); } } @@ -195,7 +211,8 @@ // TransferCompound //============================================================================= -Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferCompound(const TopoDS_Compound& start) +Handle(IGESData_IGESEntity) BRepToIGES_BRSolid ::TransferCompound(const TopoDS_Compound& start, + const Message_ProgressRange& theProgress) { Handle(IGESData_IGESEntity) res; if ( start.IsNull()) return res; @@ -207,46 +224,69 @@ BRepToIGES_BRWire BW(*this); Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient(); + // count numbers of subshapes + Standard_Integer nbshapes = 0; + for (Ex.Init(start, TopAbs_SOLID); Ex.More(); Ex.Next()) + nbshapes++; + for (Ex.Init(start, TopAbs_SHELL, TopAbs_SOLID); Ex.More(); Ex.Next()) + nbshapes++; + for (Ex.Init(start, TopAbs_FACE, TopAbs_SHELL); Ex.More(); Ex.Next()) + nbshapes++; + for (Ex.Init(start, TopAbs_WIRE, TopAbs_FACE); Ex.More(); Ex.Next()) + nbshapes++; + for (Ex.Init(start, TopAbs_EDGE, TopAbs_WIRE); Ex.More(); Ex.Next()) + nbshapes++; + for (Ex.Init(start, TopAbs_VERTEX, TopAbs_EDGE); Ex.More(); Ex.Next()) + nbshapes++; + Message_ProgressScope aPS(theProgress, NULL, nbshapes); + // take all Solids - for (Ex.Init(start, TopAbs_SOLID); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_SOLID); Ex.More() && aPS.More(); Ex.Next()) + { + Message_ProgressRange aRange = aPS.Next(); TopoDS_Solid S = TopoDS::Solid(Ex.Current()); if (S.IsNull()) { AddWarning(start," a Solid is a null entity"); } else { - IShape = TransferSolid(S); + IShape = TransferSolid (S, aRange); if (!IShape.IsNull()) Seq->Append(IShape); } } // take all isolated Shells - for (Ex.Init(start, TopAbs_SHELL, TopAbs_SOLID); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_SHELL, TopAbs_SOLID); Ex.More() && aPS.More(); Ex.Next()) + { + Message_ProgressRange aRange = aPS.Next(); TopoDS_Shell S = TopoDS::Shell(Ex.Current()); if (S.IsNull()) { AddWarning(start," a Shell is a null entity"); } else { - IShape = BS.TransferShell(S); + IShape = BS.TransferShell (S, aRange); if (!IShape.IsNull()) Seq->Append(IShape); } } // take all isolated Faces - for (Ex.Init(start, TopAbs_FACE, TopAbs_SHELL); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_FACE, TopAbs_SHELL); Ex.More() && aPS.More(); Ex.Next()) + { + Message_ProgressRange aRange = aPS.Next(); TopoDS_Face S = TopoDS::Face(Ex.Current()); if (S.IsNull()) { AddWarning(start," a Face is a null entity"); } else { - IShape = BS.TransferFace(S); + IShape = BS.TransferFace (S, aRange); if (!IShape.IsNull()) Seq->Append(IShape); } } // take all isolated Wires - for (Ex.Init(start, TopAbs_WIRE, TopAbs_FACE); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_WIRE, TopAbs_FACE); Ex.More() && aPS.More(); Ex.Next(), aPS.Next()) + { TopoDS_Wire S = TopoDS::Wire(Ex.Current()); if (S.IsNull()) { AddWarning(start," a Wire is a null entity"); @@ -259,7 +299,8 @@ // take all isolated Edges - for (Ex.Init(start, TopAbs_EDGE, TopAbs_WIRE); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_EDGE, TopAbs_WIRE); Ex.More() && aPS.More(); Ex.Next(), aPS.Next()) + { TopoDS_Edge S = TopoDS::Edge(Ex.Current()); if (S.IsNull()) { AddWarning(start," an Edge is a null entity"); @@ -272,7 +313,8 @@ // take all isolated Vertices - for (Ex.Init(start, TopAbs_VERTEX, TopAbs_EDGE); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_VERTEX, TopAbs_EDGE); Ex.More() && aPS.More(); Ex.Next(), aPS.Next()) + { TopoDS_Vertex S = TopoDS::Vertex(Ex.Current()); if (S.IsNull()) { AddWarning(start," a Vertex is a null entity"); @@ -284,7 +326,7 @@ } // construct the group - Standard_Integer nbshapes = Seq->Length(); + nbshapes = Seq->Length(); Handle(IGESData_HArray1OfIGESEntity) Tab; if (nbshapes >=1) { Tab = new IGESData_HArray1OfIGESEntity(1,nbshapes); diff -Nru opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BRSolid.hxx opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BRSolid.hxx --- opencascade-7.4.1+dfsg1/src/BRepToIGES/BRepToIGES_BRSolid.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepToIGES/BRepToIGES_BRSolid.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,19 +49,23 @@ //! Transfert a Shape entity from TopoDS to IGES //! this entity must be a Solid or a CompSolid or a Compound. //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESData_IGESEntity) TransferSolid (const TopoDS_Shape& start); + Standard_EXPORT Handle(IGESData_IGESEntity) TransferSolid (const TopoDS_Shape& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfert a Solid entity from TopoDS to IGES //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESData_IGESEntity) TransferSolid (const TopoDS_Solid& start); + Standard_EXPORT Handle(IGESData_IGESEntity) TransferSolid (const TopoDS_Solid& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfert an CompSolid entity from TopoDS to IGES //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESData_IGESEntity) TransferCompSolid (const TopoDS_CompSolid& start); + Standard_EXPORT Handle(IGESData_IGESEntity) TransferCompSolid (const TopoDS_CompSolid& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfert a Compound entity from TopoDS to IGES //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESData_IGESEntity) TransferCompound (const TopoDS_Compound& start); + Standard_EXPORT Handle(IGESData_IGESEntity) TransferCompound (const TopoDS_Compound& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); diff -Nru opencascade-7.4.1+dfsg1/src/BRepToIGESBRep/BRepToIGESBRep_Entity.cxx opencascade-7.5.1+dfsg1/src/BRepToIGESBRep/BRepToIGESBRep_Entity.cxx --- opencascade-7.4.1+dfsg1/src/BRepToIGESBRep/BRepToIGESBRep_Entity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepToIGESBRep/BRepToIGESBRep_Entity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -79,7 +79,7 @@ #include #include #include -#include +#include #include #include #include @@ -282,7 +282,8 @@ //purpose : //======================================================================= Handle(IGESData_IGESEntity) BRepToIGESBRep_Entity::TransferShape -(const TopoDS_Shape& start) +(const TopoDS_Shape& start, + const Message_ProgressRange& theProgress) { Handle(IGESData_IGESEntity) res; //TopoDS_Shape theShape; @@ -321,19 +322,19 @@ } else if (start.ShapeType() == TopAbs_SHELL) { TopoDS_Shell S = TopoDS::Shell(start); - res = TransferShell(S); + res = TransferShell(S, theProgress); } else if (start.ShapeType() == TopAbs_SOLID) { TopoDS_Solid M = TopoDS::Solid(start); - res = TransferSolid(M); + res = TransferSolid(M, theProgress); } else if (start.ShapeType() == TopAbs_COMPSOLID) { TopoDS_CompSolid C = TopoDS::CompSolid(start); - res = TransferCompSolid(C); + res = TransferCompSolid(C, theProgress); } else if (start.ShapeType() == TopAbs_COMPOUND) { TopoDS_Compound C = TopoDS::Compound(start); - res = TransferCompound(C); + res = TransferCompound(C, theProgress); } else { // error message @@ -512,12 +513,6 @@ Handle(IGESSolid_Face) BRepToIGESBRep_Entity ::TransferFace(const TopoDS_Face& start) { - Handle(Message_ProgressIndicator) progress = GetTransferProcess()->GetProgress(); - if ( ! progress.IsNull() ) { - if ( progress->UserBreak() ) return 0; - progress->Increment(); - } - Handle(IGESSolid_Face) myent = new IGESSolid_Face; if ( start.IsNull()) return myent; Handle(IGESData_IGESEntity) ISurf; @@ -623,7 +618,8 @@ // TransferShell //============================================================================= -Handle(IGESSolid_Shell) BRepToIGESBRep_Entity ::TransferShell(const TopoDS_Shell& start) +Handle(IGESSolid_Shell) BRepToIGESBRep_Entity ::TransferShell(const TopoDS_Shell& start, + const Message_ProgressRange& theProgress) { Handle(IGESSolid_Shell) myshell = new IGESSolid_Shell; if ( start.IsNull()) return myshell; @@ -633,7 +629,11 @@ TColStd_SequenceOfInteger SeqFlag; Handle(IGESSolid_Face) IFace; - for (Ex.Init(start,TopAbs_FACE); Ex.More(); Ex.Next()) { + Standard_Integer nbf = 0; + for (Ex.Init(start, TopAbs_FACE); Ex.More(); Ex.Next()) + nbf++; + Message_ProgressScope aPS(theProgress, NULL, nbf); + for (Ex.Init(start,TopAbs_FACE); Ex.More() && aPS.More(); Ex.Next(), aPS.Next()) { TopoDS_Face F = TopoDS::Face(Ex.Current()); if ( start.Orientation() == TopAbs_REVERSED ) F.Reverse(); //:l4 abv 12 Jan 99: CTS22022-2: writing reversed shells if (F.IsNull()) { @@ -673,7 +673,8 @@ // with a Solid //============================================================================= -Handle(IGESSolid_ManifoldSolid) BRepToIGESBRep_Entity ::TransferSolid (const TopoDS_Solid& start) +Handle(IGESSolid_ManifoldSolid) BRepToIGESBRep_Entity ::TransferSolid (const TopoDS_Solid& start, + const Message_ProgressRange& theProgress) { Handle(IGESSolid_ManifoldSolid) mysol = new IGESSolid_ManifoldSolid; if ( start.IsNull()) return mysol; @@ -684,13 +685,19 @@ Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient(); TColStd_SequenceOfInteger SeqFlag; - for (Ex.Init(start,TopAbs_SHELL); Ex.More(); Ex.Next()) { + Standard_Integer nbs = 0; + for (Ex.Init(start, TopAbs_SHELL); Ex.More(); Ex.Next()) + nbs++; + Message_ProgressScope aPS(theProgress, NULL, nbs); + for (Ex.Init(start,TopAbs_SHELL); Ex.More() && aPS.More(); Ex.Next()) + { + Message_ProgressRange aRange = aPS.Next(); TopoDS_Shell S = TopoDS::Shell(Ex.Current()); if (S.IsNull()) { AddWarning(start," a Shell is a null entity"); } else { - IShell = TransferShell(S); + IShell = TransferShell (S, aRange); if (!IShell.IsNull()) { Seq->Append(IShell); if (S.Orientation() == TopAbs_FORWARD ) SeqFlag.Append(1); @@ -743,7 +750,8 @@ // with a CompSolid //============================================================================= -Handle(IGESData_IGESEntity) BRepToIGESBRep_Entity::TransferCompSolid (const TopoDS_CompSolid& start) +Handle(IGESData_IGESEntity) BRepToIGESBRep_Entity::TransferCompSolid (const TopoDS_CompSolid& start, + const Message_ProgressRange& theProgress) { Handle(IGESData_IGESEntity) myent; if ( start.IsNull()) return myent; @@ -752,13 +760,19 @@ Handle(IGESSolid_ManifoldSolid) ISolid = new IGESSolid_ManifoldSolid; Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient(); - for (Ex.Init(start,TopAbs_SOLID); Ex.More(); Ex.Next()) { + Standard_Integer nbs = 0; + for (Ex.Init(start, TopAbs_SOLID); Ex.More(); Ex.Next()) + nbs++; + Message_ProgressScope aPS(theProgress, NULL, nbs); + for (Ex.Init(start,TopAbs_SOLID); Ex.More() && aPS.More(); Ex.Next()) + { + Message_ProgressRange aRange = aPS.Next(); TopoDS_Solid S = TopoDS::Solid(Ex.Current()); if (S.IsNull()) { AddWarning(start," an Solid is a null entity"); } else { - ISolid = TransferSolid(S); + ISolid = TransferSolid (S, aRange); if (!ISolid.IsNull()) Seq->Append(ISolid); } } @@ -794,7 +808,8 @@ // with a Compound //============================================================================= -Handle(IGESData_IGESEntity) BRepToIGESBRep_Entity::TransferCompound (const TopoDS_Compound& start) +Handle(IGESData_IGESEntity) BRepToIGESBRep_Entity::TransferCompound (const TopoDS_Compound& start, + const Message_ProgressRange& theProgress) { Handle(IGESData_IGESEntity) res; if ( start.IsNull()) return res; @@ -804,33 +819,54 @@ Handle(IGESData_IGESEntity) IShape; Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient(); + // count numbers of subshapes + Standard_Integer nbshapes = 0; + for (Ex.Init(start, TopAbs_SOLID); Ex.More(); Ex.Next()) + nbshapes++; + for (Ex.Init(start, TopAbs_SHELL, TopAbs_SOLID); Ex.More(); Ex.Next()) + nbshapes++; + for (Ex.Init(start, TopAbs_FACE, TopAbs_SHELL); Ex.More(); Ex.Next()) + nbshapes++; + for (Ex.Init(start, TopAbs_WIRE, TopAbs_FACE); Ex.More(); Ex.Next()) + nbshapes++; + for (Ex.Init(start, TopAbs_EDGE, TopAbs_WIRE); Ex.More(); Ex.Next()) + nbshapes++; + for (Ex.Init(start, TopAbs_VERTEX, TopAbs_EDGE); Ex.More(); Ex.Next()) + nbshapes++; + Message_ProgressScope aPS(theProgress, NULL, nbshapes); + // take all Solids - for (Ex.Init(start, TopAbs_SOLID); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_SOLID); Ex.More() && aPS.More(); Ex.Next()) + { + Message_ProgressRange aRange = aPS.Next(); TopoDS_Solid S = TopoDS::Solid(Ex.Current()); if (S.IsNull()) { AddWarning(start," a Solid is a null entity"); } else { - IShape = TransferSolid(S); + IShape = TransferSolid (S, aRange); if (!IShape.IsNull()) Seq->Append(IShape); } } // take all isolated Shells - for (Ex.Init(start, TopAbs_SHELL, TopAbs_SOLID); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_SHELL, TopAbs_SOLID); Ex.More() && aPS.More(); Ex.Next()) + { + Message_ProgressRange aRange = aPS.Next(); TopoDS_Shell S = TopoDS::Shell(Ex.Current()); if (S.IsNull()) { AddWarning(start," a Shell is a null entity"); } else { - IShape = TransferShell(S); + IShape = TransferShell (S, aRange); if (!IShape.IsNull()) Seq->Append(IShape); } } // take all isolated Faces - for (Ex.Init(start, TopAbs_FACE, TopAbs_SHELL); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_FACE, TopAbs_SHELL); Ex.More() && aPS.More(); Ex.Next(), aPS.Next()) + { TopoDS_Face S = TopoDS::Face(Ex.Current()); if (S.IsNull()) { AddWarning(start," a Face is a null entity"); @@ -843,7 +879,8 @@ // take all isolated Wires - for (Ex.Init(start, TopAbs_WIRE, TopAbs_FACE); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_WIRE, TopAbs_FACE); Ex.More() && aPS.More(); Ex.Next(), aPS.Next()) + { TopoDS_Wire S = TopoDS::Wire(Ex.Current()); BRepToIGES_BRWire BW(*this); @@ -854,7 +891,8 @@ // take all isolated Edges - for (Ex.Init(start, TopAbs_EDGE, TopAbs_WIRE); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_EDGE, TopAbs_WIRE); Ex.More() && aPS.More(); Ex.Next(), aPS.Next()) + { TopoDS_Edge S = TopoDS::Edge(Ex.Current()); BRepToIGES_BRWire BW(*this); @@ -865,7 +903,8 @@ // take all isolated Vertices - for (Ex.Init(start, TopAbs_VERTEX, TopAbs_EDGE); Ex.More(); Ex.Next()) { + for (Ex.Init(start, TopAbs_VERTEX, TopAbs_EDGE); Ex.More() && aPS.More(); Ex.Next(), aPS.Next()) + { TopoDS_Vertex S = TopoDS::Vertex(Ex.Current()); BRepToIGES_BRWire BW(*this); @@ -875,7 +914,7 @@ } // construct the group - Standard_Integer nbshapes = Seq->Length(); + nbshapes = Seq->Length(); if (nbshapes > 0) { Handle(IGESData_HArray1OfIGESEntity) Tab = new IGESData_HArray1OfIGESEntity(1,nbshapes); diff -Nru opencascade-7.4.1+dfsg1/src/BRepToIGESBRep/BRepToIGESBRep_Entity.hxx opencascade-7.5.1+dfsg1/src/BRepToIGESBRep/BRepToIGESBRep_Entity.hxx --- opencascade-7.4.1+dfsg1/src/BRepToIGESBRep/BRepToIGESBRep_Entity.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepToIGESBRep/BRepToIGESBRep_Entity.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,8 @@ #include #include #include +#include + class IGESSolid_EdgeList; class IGESSolid_VertexList; class TopoDS_Vertex; @@ -43,7 +45,6 @@ class TopoDS_CompSolid; class TopoDS_Compound; - //! provides methods to transfer BRep entity from CASCADE to IGESBRep. class BRepToIGESBRep_Entity : public BRepToIGES_BREntity { @@ -80,7 +81,9 @@ //! Returns the result of the transfert of any Shape //! If the transfer has failed, this member return a NullEntity. - Standard_EXPORT virtual Handle(IGESData_IGESEntity) TransferShape (const TopoDS_Shape& start) Standard_OVERRIDE; + Standard_EXPORT virtual Handle(IGESData_IGESEntity) TransferShape + (const TopoDS_Shape& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE; //! Transfert an Edge entity from TopoDS to IGES //! If this Entity could not be converted, this member returns a NullEntity. @@ -101,19 +104,23 @@ //! Transfert an Shell entity from TopoDS to IGES //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESSolid_Shell) TransferShell (const TopoDS_Shell& start); + Standard_EXPORT Handle(IGESSolid_Shell) TransferShell (const TopoDS_Shell& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfert a Solid entity from TopoDS to IGES //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESSolid_ManifoldSolid) TransferSolid (const TopoDS_Solid& start); + Standard_EXPORT Handle(IGESSolid_ManifoldSolid) TransferSolid (const TopoDS_Solid& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfert an CompSolid entity from TopoDS to IGES //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESData_IGESEntity) TransferCompSolid (const TopoDS_CompSolid& start); + Standard_EXPORT Handle(IGESData_IGESEntity) TransferCompSolid (const TopoDS_CompSolid& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfert a Compound entity from TopoDS to IGES //! If this Entity could not be converted, this member returns a NullEntity. - Standard_EXPORT Handle(IGESData_IGESEntity) TransferCompound (const TopoDS_Compound& start); + Standard_EXPORT Handle(IGESData_IGESEntity) TransferCompound (const TopoDS_Compound& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); diff -Nru opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools.cxx opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools.cxx --- opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -668,12 +667,11 @@ //======================================================================= void BRepTools::Write(const TopoDS_Shape& Sh, Standard_OStream& S, - const Handle(Message_ProgressIndicator)& PR) + const Message_ProgressRange& theProgress) { BRepTools_ShapeSet SS; - SS.SetProgress(PR); SS.Add(Sh); - SS.Write(S); + SS.Write(S, theProgress); SS.Write(Sh,S); } @@ -686,11 +684,10 @@ void BRepTools::Read(TopoDS_Shape& Sh, std::istream& S, const BRep_Builder& B, - const Handle(Message_ProgressIndicator)& PR) + const Message_ProgressRange& theProgress) { BRepTools_ShapeSet SS(B); - SS.SetProgress(PR); - SS.Read(S); + SS.Read(S, theProgress); SS.Read(Sh,S); } @@ -701,7 +698,7 @@ Standard_Boolean BRepTools::Write(const TopoDS_Shape& Sh, const Standard_CString File, - const Handle(Message_ProgressIndicator)& PR) + const Message_ProgressRange& theProgress) { std::ofstream os; OSD_OpenStream(os, File, std::ios::out); @@ -713,11 +710,10 @@ return isGood; BRepTools_ShapeSet SS; - SS.SetProgress(PR); SS.Add(Sh); os << "DBRep_DrawableShape\n"; // for easy Draw read - SS.Write(os); + SS.Write(os, theProgress); isGood = os.good(); if(isGood ) SS.Write(Sh,os); @@ -739,7 +735,7 @@ Standard_Boolean BRepTools::Read(TopoDS_Shape& Sh, const Standard_CString File, const BRep_Builder& B, - const Handle(Message_ProgressIndicator)& PR) + const Message_ProgressRange& theProgress) { std::filebuf fic; std::istream in(&fic); @@ -747,8 +743,7 @@ if(!fic.is_open()) return Standard_False; BRepTools_ShapeSet SS(B); - SS.SetProgress(PR); - SS.Read(in); + SS.Read(in, theProgress); if(!SS.NbShapes()) return Standard_False; SS.Read(Sh,in); return Standard_True; @@ -760,19 +755,36 @@ //purpose : //======================================================================= -void BRepTools::Clean(const TopoDS_Shape& theShape) +void BRepTools::Clean (const TopoDS_Shape& theShape) { + if (theShape.IsNull()) + return; + BRep_Builder aBuilder; Handle(Poly_Triangulation) aNullTriangulation; Handle(Poly_PolygonOnTriangulation) aNullPoly; - if (theShape.IsNull()) - return; + TopTools_MapOfShape aShapeMap; + const TopLoc_Location anEmptyLoc; TopExp_Explorer aFaceIt(theShape, TopAbs_FACE); for (; aFaceIt.More(); aFaceIt.Next()) { - const TopoDS_Face& aFace = TopoDS::Face(aFaceIt.Current()); + TopoDS_Shape aFaceNoLoc = aFaceIt.Value(); + aFaceNoLoc.Location (anEmptyLoc); + if (!aShapeMap.Add (aFaceNoLoc)) + { + // the face has already been processed + continue; + } + + const TopoDS_Face& aFace = TopoDS::Face (aFaceIt.Current()); + if (!BRep_Tool::IsGeometric (aFace)) + { + // Do not remove triangulation as there is no surface to recompute it. + continue; + } + TopLoc_Location aLoc; const Handle(Poly_Triangulation)& aTriangulation = @@ -782,6 +794,10 @@ continue; // Nullify edges + // Theoretically, the edges on the face (with surface) may have no geometry + // (no curve 3d or 2d or both). Such faces should be considered as invalid and + // are not supported by current implementation. So, both triangulation of the face + // and polygon on triangulation of the edges are removed unconditionally. TopExp_Explorer aEdgeIt(aFace, TopAbs_EDGE); for (; aEdgeIt.More(); aEdgeIt.Next()) { @@ -797,14 +813,27 @@ TopExp_Explorer aEdgeIt (theShape, TopAbs_EDGE); for (; aEdgeIt.More (); aEdgeIt.Next ()) { - const TopoDS_Edge& aEdge = TopoDS::Edge (aEdgeIt.Current ()); + TopoDS_Edge anEdgeNoLoc = TopoDS::Edge (aEdgeIt.Value()); + anEdgeNoLoc.Location (anEmptyLoc); + + if (!aShapeMap.Add (anEdgeNoLoc)) + { + // the edge has already been processed + continue; + } + + if (!BRep_Tool::IsGeometric (TopoDS::Edge (anEdgeNoLoc))) + { + // Do not remove polygon 3d as there is no curve to recompute it. + continue; + } TopLoc_Location aLoc; - Handle (Poly_Polygon3D) aPoly3d = BRep_Tool::Polygon3D (aEdge, aLoc); - if (aPoly3d.IsNull ()) + Handle (Poly_Polygon3D) aPoly3d = BRep_Tool::Polygon3D (anEdgeNoLoc, aLoc); + if (aPoly3d.IsNull()) continue; - aBuilder.UpdateEdge (aEdge, aNullPoly3d); + aBuilder.UpdateEdge (anEdgeNoLoc, aNullPoly3d); } } //======================================================================= @@ -903,25 +932,61 @@ //purpose : //======================================================================= -Standard_Boolean BRepTools::Triangulation(const TopoDS_Shape& S, - const Standard_Real deflec) -{ - TopExp_Explorer exf, exe; - TopLoc_Location l; - Handle(Poly_Triangulation) T; - Handle(Poly_PolygonOnTriangulation) Poly; - - for (exf.Init(S, TopAbs_FACE); exf.More(); exf.Next()) { - const TopoDS_Face& F = TopoDS::Face(exf.Current()); - T = BRep_Tool::Triangulation(F, l); - if (T.IsNull() || (T->Deflection() > deflec)) +Standard_Boolean BRepTools::Triangulation(const TopoDS_Shape& theShape, + const Standard_Real theLinDefl, + const Standard_Boolean theToCheckFreeEdges) +{ + TopExp_Explorer anEdgeIter; + TopLoc_Location aDummyLoc; + for (TopExp_Explorer aFaceIter (theShape, TopAbs_FACE); aFaceIter.More(); aFaceIter.Next()) + { + const TopoDS_Face& aFace = TopoDS::Face (aFaceIter.Current()); + const Handle(Poly_Triangulation)& aTri = BRep_Tool::Triangulation (aFace, aDummyLoc); + if (aTri.IsNull() + || aTri->Deflection() > theLinDefl) + { return Standard_False; - for (exe.Init(F, TopAbs_EDGE); exe.More(); exe.Next()) { - const TopoDS_Edge& E = TopoDS::Edge(exe.Current()); - Poly = BRep_Tool::PolygonOnTriangulation(E, T, l); - if (Poly.IsNull()) return Standard_False; + } + + for (anEdgeIter.Init (aFace, TopAbs_EDGE); anEdgeIter.More(); anEdgeIter.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge (anEdgeIter.Current()); + const Handle(Poly_PolygonOnTriangulation)& aPoly = BRep_Tool::PolygonOnTriangulation (anEdge, aTri, aDummyLoc); + if (aPoly.IsNull()) + { + return Standard_False; + } } } + if (!theToCheckFreeEdges) + { + return Standard_True; + } + + Handle(Poly_Triangulation) anEdgeTri; + for (anEdgeIter.Init (theShape, TopAbs_EDGE, TopAbs_FACE); anEdgeIter.More(); anEdgeIter.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge (anEdgeIter.Current()); + const Handle(Poly_Polygon3D)& aPolygon = BRep_Tool::Polygon3D (anEdge, aDummyLoc); + if (!aPolygon.IsNull()) + { + if (aPolygon->Deflection() > theLinDefl) + { + return Standard_False; + } + } + else + { + const Handle(Poly_PolygonOnTriangulation)& aPoly = BRep_Tool::PolygonOnTriangulation (anEdge, anEdgeTri, aDummyLoc); + if (aPoly.IsNull() + || anEdgeTri.IsNull() + || anEdgeTri->Deflection() > theLinDefl) + { + return Standard_False; + } + } + } + return Standard_True; } @@ -1068,4 +1133,130 @@ } +//======================================================================= +//function : OriEdgeInFace +//purpose : +//======================================================================= + +TopAbs_Orientation BRepTools::OriEdgeInFace (const TopoDS_Edge& E, + const TopoDS_Face& F ) + +{ + TopExp_Explorer Exp(F.Oriented(TopAbs_FORWARD),TopAbs_EDGE); + + for (; Exp.More() ;Exp.Next()) { + if (Exp.Current().IsSame(E)) { + return Exp.Current().Orientation(); + } + } + throw Standard_ConstructionError("BRepTools::OriEdgeInFace"); +} + + +namespace +{ + //======================================================================= + //function : findInternalsToKeep + //purpose : Looks for internal sub-shapes which has to be kept to preserve + // topological connectivity. + //======================================================================= + static void findInternalsToKeep (const TopoDS_Shape& theS, + TopTools_MapOfShape& theAllNonInternals, + TopTools_MapOfShape& theAllInternals, + TopTools_MapOfShape& theShapesToKeep) + { + for (TopoDS_Iterator it (theS, Standard_True); it.More(); it.Next()) + { + const TopoDS_Shape& aSS = it.Value(); + findInternalsToKeep (aSS, theAllNonInternals, theAllInternals, theShapesToKeep); + + if (aSS.Orientation() == TopAbs_INTERNAL) + theAllInternals.Add (aSS); + else + theAllNonInternals.Add (aSS); + + if (theAllNonInternals.Contains(aSS) && theAllInternals.Contains (aSS)) + theShapesToKeep.Add (aSS); + } + } + + //======================================================================= + //function : removeShapes + //purpose : Removes sub-shapes from the shape + //======================================================================= + static void removeShapes (TopoDS_Shape& theS, + const TopTools_ListOfShape& theLS) + { + BRep_Builder aBB; + Standard_Boolean isFree = theS.Free(); + theS.Free (Standard_True); + + for (TopTools_ListOfShape::Iterator it (theLS); it.More(); it.Next()) + { + aBB.Remove (theS, it.Value()); + } + theS.Free (isFree); + } + + //======================================================================= + //function : removeInternals + //purpose : Removes recursively all internal sub-shapes from the given shape. + // Returns true if all sub-shapes have been removed from the shape. + //======================================================================= + static Standard_Boolean removeInternals (TopoDS_Shape& theS, + const TopTools_MapOfShape* theShapesToKeep) + { + TopTools_ListOfShape aLRemove; + for (TopoDS_Iterator it (theS, Standard_True); it.More(); it.Next()) + { + const TopoDS_Shape& aSS = it.Value(); + if (aSS.Orientation() == TopAbs_INTERNAL) + { + if (!theShapesToKeep || !theShapesToKeep->Contains (aSS)) + aLRemove.Append (aSS); + } + else + { + if (removeInternals (*(TopoDS_Shape*)&aSS, theShapesToKeep)) + aLRemove.Append (aSS); + } + } + + Standard_Integer aNbSToRemove = aLRemove.Extent(); + if (aNbSToRemove) + { + removeShapes (theS, aLRemove); + return (theS.NbChildren() == 0); + } + return Standard_False; + } + +} + +//======================================================================= +//function : RemoveInternals +//purpose : +//======================================================================= +void BRepTools::RemoveInternals (TopoDS_Shape& theS, + const Standard_Boolean theForce) +{ + TopTools_MapOfShape *pMKeep = NULL, aMKeep; + if (!theForce) + { + // Find all internal sub-shapes which has to be kept to preserve topological connectivity. + // Note that if the multi-connected shape is not directly contained in some shape, + // but as a part of bigger sub-shape which will be removed, the multi-connected + // shape is going to be removed also, breaking topological connectivity. + // For instance, is a compound of the face and edge, which does not + // belong to the face. The face contains internal wire and the edge shares + // the vertex with one of the vertices of that wire. The vertex is not directly + // contained in the face, thus will be removed as part of internal wire, and topological + // connectivity between edge and face will be lost. + TopTools_MapOfShape anAllNonInternals, anAllInternals; + findInternalsToKeep (theS, anAllNonInternals, anAllInternals, aMKeep); + if (aMKeep.Extent()) + pMKeep = &aMKeep; + } + removeInternals (theS, pMKeep); +} diff -Nru opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools.hxx opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools.hxx --- opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,8 +27,7 @@ #include #include #include - -#include +#include class TopoDS_Face; class TopoDS_Wire; @@ -40,7 +39,6 @@ class TopoDS_CompSolid; class TopoDS_Compound; class TopoDS_Shape; -class Message_ProgressIndicator; class BRep_Builder; class BRepTools_WireExplorer; class BRepTools_Modification; @@ -150,9 +148,11 @@ //! edge on the face. Standard_EXPORT static void UpdateFaceUVPoints (const TopoDS_Face& theF); - //! Removes all the triangulations of the faces of - //! and removes all polygons on triangulations of the - //! edges. + //! Removes all cashed polygonal representation of the shape, + //! i.e. the triangulations of the faces of and polygons on + //! triangulations and polygons 3d of the edges. + //! In case polygonal representation is the only available representation + //! for the shape (shape does not have geometry) it is not removed. Standard_EXPORT static void Clean (const TopoDS_Shape& S); //! Removes geometry (curves and surfaces) from all edges and faces of the shape @@ -162,10 +162,18 @@ //! refer to surfaces not belonging to any face of Standard_EXPORT static void RemoveUnusedPCurves (const TopoDS_Shape& S); - //! verifies that each face from the shape has got - //! a triangulation with a deflection <= deflec and - //! the edges a discretisation on this triangulation. - Standard_EXPORT static Standard_Boolean Triangulation (const TopoDS_Shape& S, const Standard_Real deflec); + //! Verifies that each Face from the shape has got a triangulation with a deflection smaller or equal to specified one + //! and the Edges a discretization on this triangulation. + //! @param theShape [in] shape to verify + //! @param theLinDefl [in] maximum allowed linear deflection + //! @param theToCheckFreeEdges [in] if TRUE, then free Edges are required to have 3D polygon + //! @return FALSE if input Shape contains Faces without triangulation, + //! or that triangulation has worse (greater) deflection than specified one, + //! or Edges in Shape lack polygons on triangulation + //! or free Edges in Shape lack 3D polygons + Standard_EXPORT static Standard_Boolean Triangulation (const TopoDS_Shape& theShape, + const Standard_Real theLinDefl, + const Standard_Boolean theToCheckFreeEdges = Standard_False); //! Returns True if the distance between the two //! vertices is lower than their tolerance. @@ -197,18 +205,23 @@ Standard_EXPORT static void Dump (const TopoDS_Shape& Sh, Standard_OStream& S); //! Writes on in an ASCII format. - Standard_EXPORT static void Write (const TopoDS_Shape& Sh, Standard_OStream& S, const Handle(Message_ProgressIndicator)& PR = NULL); + Standard_EXPORT static void Write (const TopoDS_Shape& Sh, Standard_OStream& S, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Reads a Shape from in returns it in . //! is used to build the shape. - Standard_EXPORT static void Read (TopoDS_Shape& Sh, Standard_IStream& S, const BRep_Builder& B, const Handle(Message_ProgressIndicator)& PR = NULL); + Standard_EXPORT static void Read (TopoDS_Shape& Sh, Standard_IStream& S, const BRep_Builder& B, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Writes in . - Standard_EXPORT static Standard_Boolean Write (const TopoDS_Shape& Sh, const Standard_CString File, const Handle(Message_ProgressIndicator)& PR = NULL); + Standard_EXPORT static Standard_Boolean Write (const TopoDS_Shape& Sh, const Standard_CString File, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Reads a Shape from , returns it in . //! is used to build the shape. - Standard_EXPORT static Standard_Boolean Read (TopoDS_Shape& Sh, const Standard_CString File, const BRep_Builder& B, const Handle(Message_ProgressIndicator)& PR = NULL); + Standard_EXPORT static Standard_Boolean Read (TopoDS_Shape& Sh, const Standard_CString File, + const BRep_Builder& B, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Evals real tolerance of edge . //! , , , , are @@ -223,6 +236,20 @@ const Standard_Real theF, const Standard_Real theL); + //! returns the cumul of the orientation of + //! and thc containing wire in + Standard_EXPORT static TopAbs_Orientation OriEdgeInFace(const TopoDS_Edge& theEdge, + const TopoDS_Face& theFace); + + //! Removes internal sub-shapes from the shape. + //! The check on internal status is based on orientation of sub-shapes, + //! classification is not performed. + //! Before removal of internal sub-shapes the algorithm checks if such + //! removal is not going to break topological connectivity between sub-shapes. + //! The flag if set to true disables the connectivity check and clears + //! the given shape from all sub-shapes with internal orientation. + Standard_EXPORT static void RemoveInternals (TopoDS_Shape& theS, + const Standard_Boolean theForce = Standard_False); protected: @@ -249,10 +276,4 @@ }; - - - - - - #endif // _BRepTools_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_Modifier.cxx opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_Modifier.cxx --- opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_Modifier.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_Modifier.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -54,7 +53,7 @@ #include #include #include -#include +#include #include static void SetShapeFlags(const TopoDS_Shape& theInSh, TopoDS_Shape& theOutSh); @@ -116,7 +115,8 @@ static TopTools_IndexedMapOfShape MapE, MapF; #endif -void BRepTools_Modifier::Perform(const Handle(BRepTools_Modification)& M, const Handle(Message_ProgressIndicator) & aProgress) +void BRepTools_Modifier::Perform(const Handle(BRepTools_Modification)& M, + const Message_ProgressRange& theProgress) { if (myShape.IsNull()) { throw Standard_NullObject(); @@ -128,7 +128,7 @@ #endif TopTools_DataMapIteratorOfDataMapOfShapeShape theIter(myMap); - Message_ProgressSentry aPSentry(aProgress, "Converting Shape", 0, 2, 1); + Message_ProgressScope aPS(theProgress, "Converting Shape", 2); TopTools_IndexedDataMapOfShapeListOfShape aMVE, aMEF; TopExp::MapShapesAndAncestors(myShape, TopAbs_VERTEX, TopAbs_EDGE, aMVE); @@ -144,16 +144,14 @@ CreateOtherVertices(aMVE, aMEF, M); Standard_Boolean aNewGeom; - Rebuild(myShape, M, aNewGeom, aProgress); + Rebuild(myShape, M, aNewGeom, aPS.Next()); - if (!aPSentry.More()) + if (!aPS.More()) { // The processing was broken return; } - aPSentry.Next(); - if (myShape.ShapeType() == TopAbs_FACE) { if (myShape.Orientation() == TopAbs_REVERSED) { myMap(myShape).Reverse(); @@ -242,7 +240,7 @@ (const TopoDS_Shape& S, const Handle(BRepTools_Modification)& M, Standard_Boolean& theNewGeom, - const Handle(Message_ProgressIndicator)& aProgress) + const Message_ProgressRange& theProgress) { #ifdef DEBUG_Modifier int iF = MapF.Contains(S) ? MapF.FindIndex(S) : 0; @@ -357,16 +355,16 @@ for (it.Initialize(S, Standard_False); it.More(); it.Next()) ++aShapeCount; } - Message_ProgressSentry aPSentry(aProgress, "Converting SubShapes", 0, aShapeCount, 1); + Message_ProgressScope aPS(theProgress, "Converting SubShapes", aShapeCount); // - for (it.Initialize(S, Standard_False); it.More() && aPSentry.More(); it.Next(), aPSentry.Next()) { + for (it.Initialize(S, Standard_False); it.More() && aPS.More(); it.Next()) { // always call Rebuild Standard_Boolean isSubNewGeom = Standard_False; - Standard_Boolean subrebuilt = Rebuild(it.Value(), M, isSubNewGeom, aProgress); + Standard_Boolean subrebuilt = Rebuild(it.Value(), M, isSubNewGeom, aPS.Next()); rebuild = subrebuilt || rebuild ; theNewGeom = theNewGeom || isSubNewGeom; } - if (!aPSentry.More()) + if (!aPS.More()) { // The processing was broken return Standard_False; diff -Nru opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_Modifier.hxx opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_Modifier.hxx --- opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_Modifier.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_Modifier.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,17 +29,16 @@ #include #include -#include #include #include #include #include +#include class Standard_NullObject; class Standard_NoSuchObject; class TopoDS_Shape; class BRepTools_Modification; -class Message_ProgressIndicator; class Geom_Curve; class Geom_Surface; @@ -64,7 +63,8 @@ Standard_EXPORT void Init (const TopoDS_Shape& S); //! Performs the modifications described by . - Standard_EXPORT void Perform (const Handle(BRepTools_Modification)& M, const Handle(Message_ProgressIndicator)& aProgress = NULL); + Standard_EXPORT void Perform (const Handle(BRepTools_Modification)& M, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Returns Standard_True if the modification has //! been computed successfully. @@ -109,7 +109,7 @@ Standard_EXPORT Standard_Boolean Rebuild (const TopoDS_Shape& S, const Handle(BRepTools_Modification)& M, Standard_Boolean& theNewGeom, - const Handle(Message_ProgressIndicator)& aProgress = NULL); + const Message_ProgressRange& theProgress = Message_ProgressRange()); Standard_EXPORT void CreateNewVertices( const TopTools_IndexedDataMapOfShapeListOfShape& theMVE, diff -Nru opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_ReShape.cxx opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_ReShape.cxx --- opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_ReShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_ReShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -116,6 +116,7 @@ //======================================================================= BRepTools_ReShape::BRepTools_ReShape() +: myStatus(-1) { myConsiderLocation = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_ShapeSet.cxx opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_ShapeSet.cxx --- opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_ShapeSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_ShapeSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,8 +39,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -215,7 +214,7 @@ Handle(BRep_TFace) TF = Handle(BRep_TFace)::DownCast(S.TShape()); if (!TF->Surface().IsNull()) mySurfaces.Add(TF->Surface()); - if (myWithTriangles) { // for XML Persistence + if (myWithTriangles || TF->Surface().IsNull()) { // for XML Persistence Handle(Poly_Triangulation) Tr = TF->Triangulation(); if (!Tr.IsNull()) myTriangulations.Add(Tr); } @@ -230,7 +229,7 @@ //purpose : //======================================================================= -void BRepTools_ShapeSet::DumpGeometry(Standard_OStream& OS)const +void BRepTools_ShapeSet::DumpGeometry (Standard_OStream& OS)const { myCurves2d.Dump(OS); myCurves.Dump(OS); @@ -246,65 +245,27 @@ //purpose : //======================================================================= -void BRepTools_ShapeSet::WriteGeometry(Standard_OStream& OS) +void BRepTools_ShapeSet::WriteGeometry(Standard_OStream& OS, const Message_ProgressRange& theProgress) { - //OCC19559 - myCurves2d.SetProgress(GetProgress()); - myCurves.SetProgress(GetProgress()); - mySurfaces.SetProgress(GetProgress()); - - if ( !GetProgress().IsNull()) { - if(GetProgress()->UserBreak() ) return; - GetProgress()->NewScope ( 15, "2D Curves" ); - } - myCurves2d.Write(OS); + // Make nested progress scope for processing geometry + Message_ProgressScope aPS(theProgress, "Geometry", 100); + + myCurves2d.Write(OS, aPS.Next(20)); + if (aPS.UserBreak()) return; + + myCurves.Write(OS, aPS.Next(20)); + if (aPS.UserBreak()) return; + + WritePolygon3D(OS, Standard_True, aPS.Next(10)); + if (aPS.UserBreak()) return; - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - - GetProgress()->NewScope ( 15, "3D Curves" ); - } - myCurves.Write(OS); + WritePolygonOnTriangulation(OS, Standard_True, aPS.Next(10)); + if (aPS.UserBreak()) return; - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); + mySurfaces.Write(OS, aPS.Next(20)); + if (aPS.UserBreak()) return; - GetProgress()->NewScope ( 10, "3D Polygons" ); - } - WritePolygon3D(OS); - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - - GetProgress()->NewScope ( 10, "Polygons On Triangulation" ); - } - WritePolygonOnTriangulation(OS); - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - - GetProgress()->NewScope ( 10, "Surfaces" ); - } - mySurfaces.Write(OS); - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - - GetProgress()->NewScope ( 15, "Triangulations" ); - } - WriteTriangulation(OS); - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - } + WriteTriangulation(OS, Standard_True, aPS.Next(20)); } @@ -313,65 +274,27 @@ //purpose : //======================================================================= -void BRepTools_ShapeSet::ReadGeometry(Standard_IStream& IS) +void BRepTools_ShapeSet::ReadGeometry(Standard_IStream& IS, const Message_ProgressRange& theProgress) { - //OCC19559 - myCurves2d.SetProgress(GetProgress()); - myCurves.SetProgress(GetProgress()); - mySurfaces.SetProgress(GetProgress()); - - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->NewScope ( 15, "2D Curves" ); - } - myCurves2d.Read(IS); - - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - - GetProgress()->NewScope ( 15, "3D Curves" ); - } - myCurves.Read(IS); + // Make nested progress scope for processing geometry + Message_ProgressScope aPS(theProgress, "Geometry", 100); - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - - GetProgress()->NewScope ( 10, "3D Polygons" ); - } - ReadPolygon3D(IS); - if ( !GetProgress().IsNull() ) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - - GetProgress()->NewScope ( 10, "Polygons On Triangulation" ); - } - ReadPolygonOnTriangulation(IS); - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - - GetProgress()->NewScope ( 10, "Surfaces" ); - } - mySurfaces.Read(IS); - if ( !GetProgress().IsNull() ) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - - GetProgress()->NewScope ( 15, "Triangulations" ); - } - ReadTriangulation(IS); - if ( !GetProgress().IsNull()) { - if( GetProgress()->UserBreak() ) return; - GetProgress()->EndScope(); - GetProgress()->Show(); - } + myCurves2d.Read(IS, aPS.Next(20)); + if (aPS.UserBreak()) return; + + myCurves.Read(IS, aPS.Next(20)); + if (aPS.UserBreak()) return; + + ReadPolygon3D(IS, aPS.Next(15)); + if (aPS.UserBreak()) return; + + ReadPolygonOnTriangulation(IS, aPS.Next(15)); + if (aPS.UserBreak()) return; + + mySurfaces.Read(IS, aPS.Next(15)); + if (aPS.UserBreak()) return; + + ReadTriangulation(IS, aPS.Next(15)); } //======================================================================= @@ -582,8 +505,7 @@ //purpose : //======================================================================= -void BRepTools_ShapeSet::WriteGeometry(const TopoDS_Shape& S, - Standard_OStream& OS)const +void BRepTools_ShapeSet::WriteGeometry (const TopoDS_Shape& S, Standard_OStream& OS)const { // Write the geometry @@ -751,7 +673,7 @@ OS << " " << 0; OS << "\n"; } - if (myWithTriangles) { // for XML Persistence + if (myWithTriangles || TF->Surface().IsNull()) { // for XML Persistence if (!(TF->Triangulation()).IsNull()) { OS << 2; OS << " "; @@ -814,9 +736,9 @@ //purpose : //======================================================================= -void BRepTools_ShapeSet::ReadGeometry(const TopAbs_ShapeEnum T, - Standard_IStream& IS, - TopoDS_Shape& S) +void BRepTools_ShapeSet::ReadGeometry (const TopAbs_ShapeEnum T, + Standard_IStream& IS, + TopoDS_Shape& S) { // Read the geometry @@ -1233,12 +1155,12 @@ //======================================================================= void BRepTools_ShapeSet::WritePolygonOnTriangulation(Standard_OStream& OS, - const Standard_Boolean Compact)const + const Standard_Boolean Compact, + const Message_ProgressRange& theProgress)const { Standard_Integer i, j, nbpOntri = myNodes.Extent(); - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "Polygons On Triangulation", 0, nbpOntri, 1); + Message_ProgressScope aPS(theProgress, "Polygons On Triangulation", nbpOntri); if (Compact) OS << "PolygonOnTriangulations " << nbpOntri << "\n"; else { @@ -1249,7 +1171,7 @@ Handle(Poly_PolygonOnTriangulation) Poly; Handle(TColStd_HArray1OfReal) Param; - for (i=1; i<=nbpOntri && PS.More(); i++, PS.Next()) { + for (i=1; i<=nbpOntri && aPS.More(); i++, aPS.Next()) { Poly = Handle(Poly_PolygonOnTriangulation)::DownCast(myNodes(i)); const TColStd_Array1OfInteger& Nodes = Poly->Nodes(); if (!Compact) { @@ -1297,7 +1219,8 @@ //purpose : //======================================================================= -void BRepTools_ShapeSet::ReadPolygonOnTriangulation(Standard_IStream& IS) +void BRepTools_ShapeSet::ReadPolygonOnTriangulation(Standard_IStream& IS, + const Message_ProgressRange& theProgress) { char buffer[255]; IS >> buffer; @@ -1309,9 +1232,8 @@ Handle(Poly_PolygonOnTriangulation) Poly; IS >> nbpol; //OCC19559 - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "Polygons On Triangulation", 0, nbpol, 1); - for (i=1; i<=nbpol&& PS.More(); i++, PS.Next()) { + Message_ProgressScope aPS(theProgress, "Polygons On Triangulation", nbpol); + for (i=1; i<=nbpol&& aPS.More(); i++, aPS.Next()) { IS >> nbnodes; TColStd_Array1OfInteger Nodes(1, nbnodes); for (j = 1; j <= nbnodes; j++) { @@ -1352,12 +1274,12 @@ //======================================================================= void BRepTools_ShapeSet::WritePolygon3D(Standard_OStream& OS, - const Standard_Boolean Compact)const + const Standard_Boolean Compact, + const Message_ProgressRange& theProgress)const { Standard_Integer i, j, nbpol = myPolygons3D.Extent(); - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "3D Poligons", 0, nbpol, 1); + Message_ProgressScope aPS(theProgress, "3D Polygons", nbpol); if (Compact) OS << "Polygon3D " << nbpol << "\n"; @@ -1368,7 +1290,7 @@ } Handle(Poly_Polygon3D) P; - for (i = 1; i <= nbpol && PS.More(); i++, PS.Next()) { + for (i = 1; i <= nbpol && aPS.More(); i++, aPS.Next()) { P = Handle(Poly_Polygon3D)::DownCast(myPolygons3D(i)); if (Compact) { OS << P->NbNodes() << " "; @@ -1429,7 +1351,7 @@ //purpose : //======================================================================= -void BRepTools_ShapeSet::ReadPolygon3D(Standard_IStream& IS) +void BRepTools_ShapeSet::ReadPolygon3D(Standard_IStream& IS, const Message_ProgressRange& theProgress) { char buffer[255]; // Standard_Integer i, j, p, val, nbpol, nbnodes, hasparameters; @@ -1441,9 +1363,8 @@ Handle(Poly_Polygon3D) P; IS >> nbpol; //OCC19559 - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "3D Polygons", 0, nbpol, 1); - for (i=1; i<=nbpol && PS.More(); i++, PS.Next()) { + Message_ProgressScope aPS(theProgress, "3D Polygons", nbpol); + for (i=1; i<=nbpol && aPS.More(); i++, aPS.Next()) { IS >> nbnodes; IS >> hasparameters; TColgp_Array1OfPnt Nodes(1, nbnodes); @@ -1475,13 +1396,13 @@ //======================================================================= void BRepTools_ShapeSet::WriteTriangulation(Standard_OStream& OS, - const Standard_Boolean Compact)const + const Standard_Boolean Compact, + const Message_ProgressRange& theProgress)const { Standard_Integer i, j, nbNodes, nbtri = myTriangulations.Extent(); Standard_Integer nbTriangles = 0, n1, n2, n3; - - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "Triangulations", 0, nbtri, 1); + + Message_ProgressScope aPS(theProgress, "Triangulations", nbtri); if (Compact) OS << "Triangulations " << nbtri << "\n"; @@ -1492,7 +1413,7 @@ } Handle(Poly_Triangulation) T; - for (i = 1; i <= nbtri && PS.More(); i++, PS.Next()) { + for (i = 1; i <= nbtri && aPS.More(); i++, aPS.Next()) { T = Handle(Poly_Triangulation)::DownCast(myTriangulations(i)); if (Compact) { @@ -1578,7 +1499,7 @@ //purpose : //======================================================================= -void BRepTools_ShapeSet::ReadTriangulation(Standard_IStream& IS) +void BRepTools_ShapeSet::ReadTriangulation(Standard_IStream& IS, const Message_ProgressRange& theProgress) { char buffer[255]; // Standard_Integer i, j, val, nbtri; @@ -1594,9 +1515,8 @@ IS >> nbtri; //OCC19559 - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "Triangulations", 0, nbtri, 1); - for (i=1; i<=nbtri && PS.More();i++, PS.Next()) { + Message_ProgressScope aPS(theProgress, "Triangulations", nbtri); + for (i=1; i<=nbtri && aPS.More();i++, aPS.Next()) { IS >> nbNodes >> nbTriangles >> hasUV; GeomTools::GetReal(IS, d); diff -Nru opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_ShapeSet.hxx opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_ShapeSet.hxx --- opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_ShapeSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_ShapeSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,6 +31,7 @@ #include #include #include + class BRep_Builder; class TopoDS_Shape; @@ -48,11 +49,12 @@ //! Builds an empty ShapeSet. //! Parameter is added for XML Persistence - Standard_EXPORT BRepTools_ShapeSet(const Standard_Boolean isWithTriangles = Standard_True); + Standard_EXPORT BRepTools_ShapeSet (const Standard_Boolean isWithTriangles = Standard_True); //! Builds an empty ShapeSet. //! Parameter is added for XML Persistence - Standard_EXPORT BRepTools_ShapeSet(const BRep_Builder& B, const Standard_Boolean isWithTriangles = Standard_True); + Standard_EXPORT BRepTools_ShapeSet (const BRep_Builder& B, + const Standard_Boolean isWithTriangles = Standard_True); //! Clears the content of the set. Standard_EXPORT virtual void Clear() Standard_OVERRIDE; @@ -65,10 +67,12 @@ //! Writes the geometry of me on the stream in a //! format that can be read back by Read. - Standard_EXPORT virtual void WriteGeometry (Standard_OStream& OS) Standard_OVERRIDE; + Standard_EXPORT virtual void WriteGeometry (Standard_OStream& OS, + const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE; //! Reads the geometry of me from the stream . - Standard_EXPORT virtual void ReadGeometry (Standard_IStream& IS) Standard_OVERRIDE; + Standard_EXPORT virtual void ReadGeometry (Standard_IStream& IS, + const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE; //! Dumps the geometry of on the stream . Standard_EXPORT virtual void DumpGeometry (const TopoDS_Shape& S, Standard_OStream& OS) const Standard_OVERRIDE; @@ -90,12 +94,15 @@ //! Reads the 3d polygons of me //! from the stream . - Standard_EXPORT void ReadPolygon3D (Standard_IStream& IS); + Standard_EXPORT void ReadPolygon3D (Standard_IStream& IS, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Writes the 3d polygons //! on the stream in a format that can //! be read back by Read. - Standard_EXPORT void WritePolygon3D (Standard_OStream& OS, const Standard_Boolean Compact = Standard_True) const; + Standard_EXPORT void WritePolygon3D (Standard_OStream& OS, + const Standard_Boolean Compact = Standard_True, + const Message_ProgressRange& theProgress = Message_ProgressRange()) const; //! Dumps the 3d polygons //! on the stream . @@ -103,12 +110,15 @@ //! Reads the triangulation of me //! from the stream . - Standard_EXPORT void ReadTriangulation (Standard_IStream& IS); + Standard_EXPORT void ReadTriangulation (Standard_IStream& IS, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Writes the triangulation //! on the stream in a format that can //! be read back by Read. - Standard_EXPORT void WriteTriangulation (Standard_OStream& OS, const Standard_Boolean Compact = Standard_True) const; + Standard_EXPORT void WriteTriangulation (Standard_OStream& OS, + const Standard_Boolean Compact = Standard_True, + const Message_ProgressRange& theProgress = Message_ProgressRange()) const; //! Dumps the triangulation //! on the stream . @@ -116,12 +126,15 @@ //! Reads the polygons on triangulation of me //! from the stream . - Standard_EXPORT void ReadPolygonOnTriangulation (Standard_IStream& IS); + Standard_EXPORT void ReadPolygonOnTriangulation (Standard_IStream& IS, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Writes the polygons on triangulation //! on the stream in a format that can //! be read back by Read. - Standard_EXPORT void WritePolygonOnTriangulation (Standard_OStream& OS, const Standard_Boolean Compact = Standard_True) const; + Standard_EXPORT void WritePolygonOnTriangulation (Standard_OStream& OS, + const Standard_Boolean Compact = Standard_True, + const Message_ProgressRange& theProgress = Message_ProgressRange()) const; //! Dumps the polygons on triangulation //! on the stream . @@ -150,13 +163,6 @@ TColStd_IndexedMapOfTransient myNodes; Standard_Boolean myWithTriangles; - }; - - - - - - #endif // _BRepTools_ShapeSet_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_WireExplorer.cxx opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_WireExplorer.cxx --- opencascade-7.4.1+dfsg1/src/BRepTools/BRepTools_WireExplorer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTools/BRepTools_WireExplorer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -63,7 +63,10 @@ //function : BRepTools_WireExplorer //purpose : //======================================================================= -BRepTools_WireExplorer::BRepTools_WireExplorer() +BRepTools_WireExplorer::BRepTools_WireExplorer() +: myReverse(Standard_False), + myTolU(0.0), + myTolV(0.0) { } @@ -154,7 +157,6 @@ if (!myFace.IsNull()) { - BRepTools::Update(myFace); TopLoc_Location aL; const Handle(Geom_Surface)& aSurf = BRep_Tool::Surface(myFace, aL); GeomAdaptor_Surface aGAS(aSurf); diff -Nru opencascade-7.4.1+dfsg1/src/BRepTopAdaptor/BRepTopAdaptor_FClass2d.cxx opencascade-7.5.1+dfsg1/src/BRepTopAdaptor/BRepTopAdaptor_FClass2d.cxx --- opencascade-7.4.1+dfsg1/src/BRepTopAdaptor/BRepTopAdaptor_FClass2d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTopAdaptor/BRepTopAdaptor_FClass2d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -84,7 +84,13 @@ BRepTopAdaptor_FClass2d::BRepTopAdaptor_FClass2d(const TopoDS_Face& aFace,const Standard_Real TolUV) -: Toluv(TolUV), Face(aFace) { +: Toluv(TolUV), + Face(aFace), + U1(0.0), + V1(0.0), + U2(0.0), + V2(0.0) +{ #if LBRCOMPT STAT.NbConstrShape++; diff -Nru opencascade-7.4.1+dfsg1/src/BRepTopAdaptor/BRepTopAdaptor_TopolTool.cxx opencascade-7.5.1+dfsg1/src/BRepTopAdaptor/BRepTopAdaptor_TopolTool.cxx --- opencascade-7.4.1+dfsg1/src/BRepTopAdaptor/BRepTopAdaptor_TopolTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BRepTopAdaptor/BRepTopAdaptor_TopolTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,7 +48,12 @@ //function : BRepTopAdaptor_TopolTool //purpose : //======================================================================= - BRepTopAdaptor_TopolTool::BRepTopAdaptor_TopolTool () : myFClass2d(NULL) + BRepTopAdaptor_TopolTool::BRepTopAdaptor_TopolTool () + : myFClass2d(NULL), + myU0(0.0), + myV0(0.0), + myDU(0.0), + myDV(0.0) { myNbSamplesU=-1; } diff -Nru opencascade-7.4.1+dfsg1/src/BSplCLib/BSplCLib_Cache.cxx opencascade-7.5.1+dfsg1/src/BSplCLib/BSplCLib_Cache.cxx --- opencascade-7.4.1+dfsg1/src/BSplCLib/BSplCLib_Cache.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BSplCLib/BSplCLib_Cache.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -111,7 +111,7 @@ // When the degree of curve is lesser than the requested derivative, // nullify array cells corresponding to greater derivatives Standard_Integer aDerivative = theDerivative; - if (myParams.Degree < theDerivative) + if (!myIsRational && myParams.Degree < theDerivative) { aDerivative = myParams.Degree; for (Standard_Integer ind = myParams.Degree * aDimension; ind < (theDerivative + 1) * aDimension; ind++) diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_Box.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_Box.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_Box.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_Box.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,16 +18,90 @@ #include #include -#include +#include #include +#include #include +//! Base class for BVH_Box (CRTP idiom is used). +//! @tparam T Numeric data type +//! @tparam N Vector dimension +//! @tparam TheDerivedBox Template of derived class that defined axis aligned bounding box. +template class TheDerivedBox> +class BVH_BaseBox {}; + +// forward declaration +template class BVH_Box; + +//! Partial template specialization for BVH_Box when N = 3. +template +class BVH_BaseBox +{ +public: + + //! Transforms this box with given transformation. + void Transform (const NCollection_Mat4& theTransform) + { + if (theTransform.IsIdentity()) + { + return; + } + + BVH_Box *aThis = static_cast*>(this); + if (!aThis->IsValid()) + { + return; + } + + BVH_Box aBox = Transformed (theTransform); + + aThis->CornerMin() = aBox.CornerMin(); + aThis->CornerMax() = aBox.CornerMax(); + } + + //! Returns a box which is the result of applying the + //! given transformation to this box. + BVH_Box Transformed (const NCollection_Mat4& theTransform) const + { + BVH_Box aResultBox; + + if (theTransform.IsIdentity()) + { + return aResultBox; + } + + const BVH_Box *aThis = static_cast*>(this); + if (!aThis->IsValid()) + { + return aResultBox; + } + + for (size_t aX = 0; aX <= 1; ++aX) + { + for (size_t aY = 0; aY <= 1; ++aY) + { + for (size_t aZ = 0; aZ <= 1; ++aZ) + { + typename BVH::VectorType::Type aPnt = + theTransform * typename BVH::VectorType::Type (aX ? aThis->CornerMax().x() : aThis->CornerMin().x(), + aY ? aThis->CornerMax().y() : aThis->CornerMin().y(), + aZ ? aThis->CornerMax().z() : aThis->CornerMin().z(), + static_cast (1.0)); + + aResultBox.Add (aPnt.xyz()); + } + } + } + return aResultBox; + } +}; + //! Defines axis aligned bounding box (AABB) based on BVH vectors. //! \tparam T Numeric data type //! \tparam N Vector dimension template -class BVH_Box +class BVH_Box : public BVH_BaseBox { public: @@ -44,12 +118,6 @@ myMaxPoint (thePoint), myIsInited (Standard_True) {} - //! Creates copy of another bounding box. - BVH_Box (const BVH_Box& theBox) - : myMinPoint (theBox.myMinPoint), - myMaxPoint (theBox.myMaxPoint), - myIsInited (theBox.myIsInited) {} - //! Creates bounding box from corner points. BVH_Box (const BVH_VecNt& theMinPoint, const BVH_VecNt& theMaxPoint) @@ -110,11 +178,74 @@ T Center (const Standard_Integer theAxis) const; //! Dumps the content of me into the stream - void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const + void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const { (void)theDepth; - OCCT_DUMP_CLASS_BEGIN (theOStream, BVH_Box); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsValid()); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsInited) + + int n = Min (N, 3); + if (n == 1) + { + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMinPoint[0]) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMinPoint[0]) + } + else if (n == 2) + { + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "MinPoint", n, myMinPoint[0], myMinPoint[1]) + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "MaxPoint", n, myMaxPoint[0], myMaxPoint[1]) + } + else if (n == 3) + { + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "MinPoint", n, myMinPoint[0], myMinPoint[1], myMinPoint[2]) + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "MaxPoint", n, myMaxPoint[0], myMaxPoint[1], myMaxPoint[2]) + } + } + + //! Inits the content of me from the stream + Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) + { + Standard_Integer aPos = theStreamPos; + + Standard_Integer anIsInited = 0; + TCollection_AsciiString aStreamStr = Standard_Dump::Text (theSStream); + + OCCT_INIT_FIELD_VALUE_INTEGER (aStreamStr, aPos, anIsInited); + myIsInited = anIsInited != 0; + + int n = Min (N, 3); + if (n == 1) + { + Standard_Real aValue; + OCCT_INIT_FIELD_VALUE_REAL (aStreamStr, aPos, aValue); + myMinPoint[0] = (T)aValue; + } + else if (n == 2) + { + Standard_Real aValue1, aValue2; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "MinPoint", aPos, n, &aValue1, &aValue2); + myMinPoint[0] = (T)aValue1; + myMinPoint[1] = (T)aValue2; + + OCCT_INIT_VECTOR_CLASS (aStreamStr, "MaxPoint", aPos, n, &aValue1, &aValue2); + myMaxPoint[0] = (T)aValue1; + myMaxPoint[1] = (T)aValue2; + } + else if (n == 3) + { + Standard_Real aValue1, aValue2, aValue3; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "MinPoint", aPos, n, &aValue1, &aValue2, &aValue3); + myMinPoint[0] = (T)aValue1; + myMinPoint[1] = (T)aValue2; + myMinPoint[2] = (T)aValue3; + + OCCT_INIT_VECTOR_CLASS (aStreamStr, "MaxPoint", aPos, n, &aValue1, &aValue2, &aValue3); + myMaxPoint[0] = (T)aValue1; + myMaxPoint[1] = (T)aValue2; + myMaxPoint[2] = (T)aValue3; + } + + theStreamPos = aPos; + return Standard_True; } public: diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_DistanceField.lxx opencascade-7.5.1+dfsg1/src/BVH/BVH_DistanceField.lxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_DistanceField.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_DistanceField.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,7 +24,10 @@ template BVH_DistanceField::BVH_DistanceField (const Standard_Integer theMaximumSize, const Standard_Boolean theComputeSign) -: myMaximumSize (theMaximumSize), +: myDimensionX(0), + myDimensionY(0), + myDimensionZ(0), + myMaximumSize (theMaximumSize), myComputeSign (theComputeSign), myIsParallel (Standard_False) { diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_Distance.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_Distance.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_Distance.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_Distance.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,8 @@ //! Constructor BVH_Distance() : BVH_Traverse (), - myDistance (std::numeric_limits::max()) + myDistance (std::numeric_limits::max()), + myIsDone(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_LinearBuilder.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_LinearBuilder.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_LinearBuilder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_LinearBuilder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -106,10 +106,11 @@ Standard_Integer theDigit) const { Standard_Integer aNbPrims = theFinal - theStart; + unsigned int aBit = 1U << theDigit; while (aNbPrims > 0) { const Standard_Integer aStep = aNbPrims / 2; - if (theEncodedLinks.Value (theStart + aStep).first & (1 << theDigit)) + if (theEncodedLinks.Value (theStart + aStep).first & aBit) { aNbPrims = aStep; } @@ -130,26 +131,26 @@ template Standard_Integer BVH_LinearBuilder::emitHierachy (BVH_Tree* theBVH, const NCollection_Array1& theEncodedLinks, - const Standard_Integer theBit, + const Standard_Integer theDigit, const Standard_Integer theShift, const Standard_Integer theStart, const Standard_Integer theFinal) const { if (theFinal - theStart > BVH_Builder::myLeafNodeSize) { - const Standard_Integer aPosition = theBit < 0 ? - (theStart + theFinal) / 2 : lowerBound (theEncodedLinks, theStart, theFinal, theBit); + const Standard_Integer aPosition = theDigit < 0 ? + (theStart + theFinal) / 2 : lowerBound (theEncodedLinks, theStart, theFinal, theDigit); if (aPosition == theStart || aPosition == theFinal) { - return emitHierachy (theBVH, theEncodedLinks, theBit - 1, theShift, theStart, theFinal); + return emitHierachy (theBVH, theEncodedLinks, theDigit - 1, theShift, theStart, theFinal); } // Build inner node const Standard_Integer aNode = theBVH->AddInnerNode (0, 0); const Standard_Integer aRghNode = theShift + aPosition - theStart; - const Standard_Integer aLftChild = emitHierachy (theBVH, theEncodedLinks, theBit - 1, theShift, theStart, aPosition); - const Standard_Integer aRghChild = emitHierachy (theBVH, theEncodedLinks, theBit - 1, aRghNode, aPosition, theFinal); + const Standard_Integer aLftChild = emitHierachy (theBVH, theEncodedLinks, theDigit - 1, theShift, theStart, aPosition); + const Standard_Integer aRghChild = emitHierachy (theBVH, theEncodedLinks, theDigit - 1, aRghNode, aPosition, theFinal); theBVH->NodeInfoBuffer()[aNode].y() = aLftChild; theBVH->NodeInfoBuffer()[aNode].z() = aRghChild; diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_Object.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_Object.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_Object.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_Object.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -62,7 +62,7 @@ BVH_Object() {} //! Releases resources of geometric object. - virtual ~BVH_Object() = 0; + virtual ~BVH_Object() {} public: @@ -71,14 +71,4 @@ }; -// ======================================================================= -// function : ~BVH_Object -// purpose : -// ======================================================================= -template -BVH_Object::~BVH_Object() -{ - // -} - #endif // _BVH_Object_Header diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_PairDistance.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_PairDistance.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_PairDistance.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_PairDistance.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,8 @@ //! Constructor BVH_PairDistance() : BVH_PairTraverse (), - myDistance (std::numeric_limits::max()) + myDistance (std::numeric_limits::max()), + myIsDone(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_QueueBuilder.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_QueueBuilder.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_QueueBuilder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_QueueBuilder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,7 +44,7 @@ myNumOfThreads (theNumOfThreads) {} //! Releases resources of BVH queue based builder. - virtual ~BVH_QueueBuilder() = 0; + virtual ~BVH_QueueBuilder() {} public: @@ -288,14 +288,4 @@ } } -// ======================================================================= -// function : ~BVH_QueueBuilder -// purpose : -// ======================================================================= -template -BVH_QueueBuilder::~BVH_QueueBuilder() -{ - // -} - #endif // _BVH_QueueBuilder_Header diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_RadixSorter.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_RadixSorter.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_RadixSorter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_RadixSorter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,7 @@ #include //! Pair of Morton code and primitive ID. -typedef std::pair BVH_EncodedLink; +typedef std::pair BVH_EncodedLink; //! Performs radix sort of a BVH primitive set using //! 10-bit Morton codes (or 1024 x 1024 x 1024 grid). @@ -65,31 +65,30 @@ // Radix sort STL predicate for 32-bit integer. struct BitPredicate { - Standard_Integer myBit; + unsigned int myBit; //! Creates new radix sort predicate. - BitPredicate (const Standard_Integer theBit) : myBit (theBit) {} + BitPredicate (const Standard_Integer theDigit) : myBit (1U << theDigit) {} //! Returns predicate value. bool operator() (const BVH_EncodedLink theLink) const { - const Standard_Integer aMask = 1 << myBit; - return !(theLink.first & aMask); // 0-bit to the left side + return !(theLink.first & myBit); // 0-bit to the left side } }; //! STL compare tool used in binary search algorithm. struct BitComparator { - Standard_Integer myBit; + unsigned int myBit; //! Creates new STL comparator. - BitComparator (const Standard_Integer theBit) : myBit (theBit) {} + BitComparator (const Standard_Integer theDigit) : myBit (1U << theDigit) {} //! Checks left value for the given bit. bool operator() (BVH_EncodedLink theLink1, BVH_EncodedLink /*theLink2*/) { - return !(theLink1.first & (1 << myBit)); + return !(theLink1.first & myBit); } }; @@ -158,12 +157,12 @@ protected: // Performs MSD (most significant digit) radix sort. - static void perform (LinkIterator theStart, LinkIterator theFinal, Standard_Integer theBit = 29) + static void perform (LinkIterator theStart, LinkIterator theFinal, Standard_Integer theDigit = 29) { - while (theStart != theFinal && theBit >= 0) + while (theStart != theFinal && theDigit >= 0) { - LinkIterator anOffset = std::partition (theStart, theFinal, BitPredicate (theBit--)); - perform (theStart, anOffset, theBit); + LinkIterator anOffset = std::partition (theStart, theFinal, BitPredicate (theDigit--)); + perform (theStart, anOffset, theDigit); theStart = anOffset; } } @@ -198,12 +197,12 @@ const BVH_VecNt aCenter = theSet->Box (aPrimIdx).Center(); const BVH_VecNt aVoxelF = (aCenter - aSceneMin) * aReverseSize; - Standard_Integer aMortonCode = 0; + unsigned int aMortonCode = 0; for (Standard_Integer aCompIter = 0; aCompIter < aNbEffComp; ++aCompIter) { - Standard_Integer aVoxel = BVH::IntFloor (BVH::VecComp::Get (aVoxelF, aCompIter)); + const Standard_Integer aVoxelI = BVH::IntFloor (BVH::VecComp::Get (aVoxelF, aCompIter)); - aVoxel = Max (0, Min (aVoxel, aDimension - 1)); + unsigned int aVoxel = static_cast(Max (0, Min (aVoxelI, aDimension - 1))); aVoxel = (aVoxel | (aVoxel << 16)) & 0x030000FF; aVoxel = (aVoxel | (aVoxel << 8)) & 0x0300F00F; diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_Ray.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_Ray.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_Ray.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_Ray.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,39 @@ +// Created by: Olga Suryaninova +// Created on: 2019-11-25 +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _BVH_Ray_Header +#define _BVH_Ray_Header + +//! Describes a ray based on BVH vectors. +template +class BVH_Ray +{ +public: + + typedef typename BVH::VectorType::Type BVH_VecNt; + +public: + + BVH_VecNt Origin; + BVH_VecNt Direct; + +public: + + BVH_Ray (const BVH_VecNt& theOrigin, + const BVH_VecNt& theDirect) : Origin (theOrigin), + Direct (theDirect) { } +}; + +#endif // _BVH_Ray_Header diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_Set.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_Set.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_Set.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_Set.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,7 +35,7 @@ BVH_Set() {} //! Releases resources of set of objects. - virtual ~BVH_Set() = 0; + virtual ~BVH_Set() {} //! Returns AABB of the entire set of objects. virtual BVH_Box Box() const @@ -67,14 +67,4 @@ }; -// ======================================================================= -// function : ~BVH_Set -// purpose : -// ======================================================================= -template -BVH_Set::~BVH_Set() -{ - // -} - #endif // _BVH_Set_Header diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_Tools.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_Tools.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_Tools.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_Tools.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #define _BVH_Tools_Header #include +#include #include //! Defines a set of static methods operating with points and bounding boxes. @@ -35,6 +36,10 @@ static T BoxBoxSquareDistance (const BVH_Box& theBox1, const BVH_Box& theBox2) { + if (!theBox1.IsValid() || !theBox2.IsValid()) + { + return static_cast(0); + } return BoxBoxSquareDistance (theBox1.CornerMin(), theBox1.CornerMax(), theBox2.CornerMin(), theBox2.CornerMax()); } @@ -60,6 +65,10 @@ static T PointBoxSquareDistance (const BVH_VecNt& thePoint, const BVH_Box& theBox) { + if (!theBox.IsValid()) + { + return static_cast(0); + } return PointBoxSquareDistance (thePoint, theBox.CornerMin(), theBox.CornerMax()); @@ -79,6 +88,29 @@ return aDist; } +public: //! @name Point-Box projection + + //! Computes projection of point on bounding box + static BVH_VecNt PointBoxProjection (const BVH_VecNt& thePoint, + const BVH_Box& theBox) + { + if (!theBox.IsValid()) + { + return thePoint; + } + return PointBoxProjection (thePoint, + theBox.CornerMin(), + theBox.CornerMax()); + } + + //! Computes projection of point on bounding box + static BVH_VecNt PointBoxProjection (const BVH_VecNt& thePoint, + const BVH_VecNt& theCMin, + const BVH_VecNt& theCMax) + { + return thePoint.cwiseMax (theCMin).cwiseMin (theCMax); + } + public: //! @name Point-Triangle Square distance //! Computes square distance between point and triangle @@ -160,6 +192,92 @@ return (aDirect.Dot(aDirect)); } +public: //! @name Ray-Box Intersection + + //! Computes hit time of ray-box intersection + static Standard_Boolean RayBoxIntersection (const BVH_Ray& theRay, + const BVH_Box& theBox, + T& theTimeEnter, + T& theTimeLeave) + { + if (!theBox.IsValid()) + { + return Standard_False; + } + return RayBoxIntersection (theRay, theBox.CornerMin(), theBox.CornerMax(), theTimeEnter, theTimeLeave); + } + + //! Computes hit time of ray-box intersection + static Standard_Boolean RayBoxIntersection (const BVH_Ray& theRay, + const BVH_VecNt& theBoxCMin, + const BVH_VecNt& theBoxCMax, + T& theTimeEnter, + T& theTimeLeave) + { + return RayBoxIntersection (theRay.Origin, theRay.Direct, + theBoxCMin, theBoxCMax, theTimeEnter, theTimeLeave); + } + + //! Computes hit time of ray-box intersection + static Standard_Boolean RayBoxIntersection (const BVH_VecNt& theRayOrigin, + const BVH_VecNt& theRayDirection, + const BVH_Box& theBox, + T& theTimeEnter, + T& theTimeLeave) + { + if (!theBox.IsValid()) + { + return Standard_False; + } + return RayBoxIntersection (theRayOrigin, theRayDirection, + theBox.CornerMin(), theBox.CornerMax(), + theTimeEnter, theTimeLeave); + } + + //! Computes hit time of ray-box intersection + static Standard_Boolean RayBoxIntersection (const BVH_VecNt& theRayOrigin, + const BVH_VecNt& theRayDirection, + const BVH_VecNt& theBoxCMin, + const BVH_VecNt& theBoxCMax, + T& theTimeEnter, + T& theTimeLeave) + { + BVH_VecNt aNodeMin, aNodeMax; + for (int i = 0; i < N; ++i) + { + if (theRayDirection[i] == 0) + { + aNodeMin[i] = (theBoxCMin[i] - theRayOrigin[i]) < 0 ? + (std::numeric_limits::min)() : (std::numeric_limits::max)(); + aNodeMax[i] = (theBoxCMax[i] - theRayOrigin[i]) < 0 ? + (std::numeric_limits::min)() : (std::numeric_limits::max)(); + } + else + { + aNodeMin[i] = (theBoxCMin[i] - theRayOrigin[i]) / theRayDirection[i]; + aNodeMax[i] = (theBoxCMax[i] - theRayOrigin[i]) / theRayDirection[i]; + } + } + + BVH_VecNt aTimeMin, aTimeMax; + for (int i = 0; i < N; ++i) + { + aTimeMin[i] = Min (aNodeMin[i], aNodeMax[i]); + aTimeMax[i] = Max (aNodeMin[i], aNodeMax[i]); + } + + T aTimeEnter = Max (aTimeMin[0], Max (aTimeMin[1], aTimeMin[2])); + T aTimeLeave = Min (aTimeMax[0], Min (aTimeMax[1], aTimeMax[2])); + + Standard_Boolean hasIntersection = aTimeEnter <= aTimeLeave && aTimeLeave >= 0; + if (hasIntersection) + { + theTimeEnter = aTimeEnter; + theTimeLeave = aTimeLeave; + } + + return hasIntersection; + } }; #endif \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/BVH/BVH_Tree.hxx opencascade-7.5.1+dfsg1/src/BVH/BVH_Tree.hxx --- opencascade-7.4.1+dfsg1/src/BVH/BVH_Tree.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/BVH_Tree.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,10 +29,10 @@ BVH_TreeBaseTransient() {} //! Dumps the content of me into the stream - virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const { (void)theOStream; (void)theDepth; } + virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const { (void)theOStream; (void)theDepth; } //! Dumps the content of me into the stream - virtual void DumpNode (const int theNodeIndex, Standard_OStream& theOStream, const Standard_Integer theDepth) const + virtual void DumpNode (const int theNodeIndex, Standard_OStream& theOStream, Standard_Integer theDepth) const { (void)theNodeIndex; (void)theOStream; (void)theDepth; } }; @@ -186,11 +186,11 @@ } //! Dumps the content of me into the stream - virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE + virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE { - OCCT_DUMP_CLASS_BEGIN (theOStream, BVH_TreeBase); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDepth); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Length()); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDepth) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Length()) for (Standard_Integer aNodeIdx = 0; aNodeIdx < Length(); ++aNodeIdx) { @@ -199,20 +199,20 @@ } //! Dumps the content of node into the stream - virtual void DumpNode (const int theNodeIndex, Standard_OStream& theOStream, const Standard_Integer theDepth) const Standard_OVERRIDE + virtual void DumpNode (const int theNodeIndex, Standard_OStream& theOStream, Standard_Integer theDepth) const Standard_OVERRIDE { - OCCT_DUMP_CLASS_BEGIN (theOStream, BVH_TreeNode); + OCCT_DUMP_CLASS_BEGIN (theOStream, BVH_TreeNode) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, theNodeIndex); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, theNodeIndex) Bnd_Box aBndBox = BVH::ToBndBox (MinPoint (theNodeIndex), MaxPoint (theNodeIndex)); Bnd_Box* aPointer = &aBndBox; - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aPointer); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aPointer) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, BegPrimitive (theNodeIndex)); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, EndPrimitive (theNodeIndex)); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Level (theNodeIndex)); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsOuter (theNodeIndex)); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, BegPrimitive (theNodeIndex)) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, EndPrimitive (theNodeIndex)) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Level (theNodeIndex)) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsOuter (theNodeIndex)) } public: //! @name protected fields diff -Nru opencascade-7.4.1+dfsg1/src/BVH/FILES opencascade-7.5.1+dfsg1/src/BVH/FILES --- opencascade-7.4.1+dfsg1/src/BVH/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/BVH/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ BVH_Properties.cxx BVH_Properties.hxx BVH_QueueBuilder.hxx +BVH_Ray.hxx BVH_Set.hxx BVH_Sorter.hxx BVH_QuickSorter.hxx diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_Application.cxx opencascade-7.5.1+dfsg1/src/CDF/CDF_Application.cxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_Application.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_Application.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,8 +18,7 @@ #include #include -#include -#include +#include #include #include #include @@ -35,15 +34,15 @@ #include IMPLEMENT_STANDARD_RTTIEXT(CDF_Application,CDM_Application) - -#define theMetaDataDriver CDF_Session::CurrentSession()->MetaDataDriver() - - //======================================================================= //function : //purpose : //======================================================================= -CDF_Application::CDF_Application():myRetrievableStatus(PCDM_RS_OK) {} +CDF_Application::CDF_Application():myRetrievableStatus(PCDM_RS_OK) +{ + myDirectory = new CDF_Directory(); + myMetaDataDriver = new CDF_FWOSDriver (MetaDataLookUpTable()); +} //======================================================================= //function : Load @@ -58,7 +57,7 @@ //purpose : //======================================================================= void CDF_Application::Open(const Handle(CDM_Document)& aDocument) { - CDF_Session::CurrentSession()->Directory()->Add(aDocument); + myDirectory->Add(aDocument); aDocument->Open(this); Activate(aDocument,CDF_TOA_New); } @@ -76,7 +75,7 @@ //purpose : //======================================================================= void CDF_Application::Close(const Handle(CDM_Document)& aDocument) { - CDF_Session::CurrentSession()->Directory()->Remove(aDocument); + myDirectory->Remove(aDocument); aDocument->Close(); } @@ -84,33 +83,37 @@ //function : Retrieve //purpose : //======================================================================= -Handle(CDM_Document) CDF_Application::Retrieve(const TCollection_ExtendedString& aFolder, - const TCollection_ExtendedString& aName, - const Standard_Boolean UseStorageConfiguration) { +Handle(CDM_Document) CDF_Application::Retrieve (const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const Standard_Boolean UseStorageConfiguration, + const Message_ProgressRange& theRange) +{ TCollection_ExtendedString nullVersion; - return Retrieve(aFolder,aName,nullVersion,UseStorageConfiguration); + return Retrieve(aFolder, aName, nullVersion, UseStorageConfiguration, theRange); } //======================================================================= //function : Retrieve //purpose : //======================================================================= -Handle(CDM_Document) CDF_Application::Retrieve(const TCollection_ExtendedString& aFolder, - const TCollection_ExtendedString& aName, - const TCollection_ExtendedString& aVersion, - const Standard_Boolean UseStorageConfiguration) +Handle(CDM_Document) CDF_Application::Retrieve (const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const TCollection_ExtendedString& aVersion, + const Standard_Boolean UseStorageConfiguration, + const Message_ProgressRange& theRange) { Handle(CDM_MetaData) theMetaData; if(aVersion.Length() == 0) - theMetaData=theMetaDataDriver->MetaData(aFolder,aName); + theMetaData=myMetaDataDriver->MetaData(aFolder,aName); else - theMetaData=theMetaDataDriver->MetaData(aFolder,aName,aVersion); + theMetaData=myMetaDataDriver->MetaData(aFolder,aName,aVersion); CDF_TypeOfActivation theTypeOfActivation=TypeOfActivation(theMetaData); - Handle(CDM_Document) theDocument=Retrieve(theMetaData,UseStorageConfiguration,Standard_False); + Handle(CDM_Document) theDocument = Retrieve(theMetaData, UseStorageConfiguration, + Standard_False, theRange); - CDF_Session::CurrentSession()->Directory()->Add(theDocument); + myDirectory->Add(theDocument); Activate(theDocument,theTypeOfActivation); theDocument->Open(this); @@ -132,12 +135,12 @@ //======================================================================= PCDM_ReaderStatus CDF_Application::CanRetrieve(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aVersion) { - if (!theMetaDataDriver->Find(aFolder,aName,aVersion)) + if (!myMetaDataDriver->Find(aFolder,aName,aVersion)) return PCDM_RS_UnknownDocument; - else if (!theMetaDataDriver->HasReadPermission(aFolder,aName,aVersion)) + else if (!myMetaDataDriver->HasReadPermission(aFolder,aName,aVersion)) return PCDM_RS_PermissionDenied; else { - Handle(CDM_MetaData) theMetaData = theMetaDataDriver->MetaData(aFolder,aName,aVersion); + Handle(CDM_MetaData) theMetaData = myMetaDataDriver->MetaData(aFolder,aName,aVersion); if(theMetaData->IsRetrieved()) { return theMetaData->Document()->IsModified() @@ -185,7 +188,7 @@ //======================================================================= Standard_ExtString CDF_Application::DefaultFolder(){ if(myDefaultFolder.Length() == 0) { - myDefaultFolder=CDF_Session::CurrentSession()->MetaDataDriver()->DefaultFolder(); + myDefaultFolder=myMetaDataDriver->DefaultFolder(); } return myDefaultFolder.ToExtString(); } @@ -195,7 +198,7 @@ //purpose : //======================================================================= Standard_Boolean CDF_Application::SetDefaultFolder(const Standard_ExtString aFolder) { - Standard_Boolean found = CDF_Session::CurrentSession()->MetaDataDriver()->FindFolder(aFolder); + Standard_Boolean found = myMetaDataDriver->FindFolder(aFolder); if(found) myDefaultFolder=aFolder; return found; } @@ -204,15 +207,20 @@ //function : Retrieve //purpose : //======================================================================= -Handle(CDM_Document) CDF_Application::Retrieve(const Handle(CDM_MetaData)& aMetaData,const Standard_Boolean UseStorageConfiguration) { - return Retrieve(aMetaData,UseStorageConfiguration,Standard_True); +Handle(CDM_Document) CDF_Application::Retrieve(const Handle(CDM_MetaData)& aMetaData, + const Standard_Boolean UseStorageConfiguration, + const Message_ProgressRange& theRange) { + return Retrieve(aMetaData, UseStorageConfiguration, Standard_True, theRange); } //======================================================================= //function : Retrieve //purpose : //======================================================================= -Handle(CDM_Document) CDF_Application::Retrieve(const Handle(CDM_MetaData)& aMetaData,const Standard_Boolean UseStorageConfiguration, const Standard_Boolean IsComponent) { +Handle(CDM_Document) CDF_Application::Retrieve (const Handle(CDM_MetaData)& aMetaData, + const Standard_Boolean UseStorageConfiguration, + const Standard_Boolean IsComponent, + const Message_ProgressRange& theRange) { Handle(CDM_Document) theDocumentToReturn; myRetrievableStatus = PCDM_RS_DriverFailure; @@ -261,11 +269,11 @@ SetReferenceCounter(theDocument,PCDM_RetrievalDriver::ReferenceCounter(aMetaData->FileName(), MessageDriver())); SetDocumentVersion(theDocument,aMetaData); - theMetaDataDriver->ReferenceIterator()->LoadReferences(theDocument,aMetaData,this,UseStorageConfiguration); + myMetaDataDriver->ReferenceIterator(MessageDriver())->LoadReferences(theDocument,aMetaData,this,UseStorageConfiguration); try { OCC_CATCH_SIGNALS - theReader->Read(aMetaData->FileName(),theDocument,this); + theReader->Read (aMetaData->FileName(), theDocument, this, theRange); } catch (Standard_Failure const& anException) { myRetrievableStatus = theReader->GetStatus(); @@ -275,7 +283,8 @@ throw Standard_Failure(aMsg.str().c_str()); } } - myRetrievableStatus = theReader->GetStatus(); + myRetrievableStatus = theReader->GetStatus(); + theDocument->Open (this); // must be done before SetMetaData theDocument->SetMetaData(aMetaData); theDocumentToReturn=theDocument; @@ -320,7 +329,8 @@ //function : Read //purpose : //======================================================================= -Handle(CDM_Document) CDF_Application::Read (Standard_IStream& theIStream) +Handle(CDM_Document) CDF_Application::Read (Standard_IStream& theIStream, + const Message_ProgressRange& theRange) { Handle(CDM_Document) aDoc; Handle(Storage_Data) dData; @@ -358,8 +368,7 @@ try { OCC_CATCH_SIGNALS - - aReader->Read (theIStream, dData, aDoc, this); + aReader->Read (theIStream, dData, aDoc, this, theRange); } catch (Standard_Failure const& anException) { @@ -520,3 +529,12 @@ else return CanRetrieve(aMetaData->Folder(),aMetaData->Name()); } + +//======================================================================= +//function : MetaDataDriver +//purpose : +//======================================================================= +Handle(CDF_MetaDataDriver) CDF_Application::MetaDataDriver() const { + Standard_NoSuchObject_Raise_if(myMetaDataDriver.IsNull(), "no metadatadriver has been provided; this application is not able to store or retrieve files."); + return myMetaDataDriver; +} diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_Application.hxx opencascade-7.5.1+dfsg1/src/CDF/CDF_Application.hxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_Application.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_Application.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,15 +19,15 @@ #include #include +#include +#include #include #include #include -#include #include #include class Standard_NoSuchObject; -class CDF_Session; class Standard_GUID; class CDM_Document; class TCollection_ExtendedString; @@ -35,7 +35,7 @@ class CDM_MetaData; class PCDM_RetrievalDriver; class PCDM_StorageDriver; - +class CDF_Directory; class CDF_Application; DEFINE_STANDARD_HANDLE(CDF_Application, CDM_Application) @@ -87,7 +87,11 @@ //! //! Since the version is not specified in this syntax, the latest wil be used. //! A link is kept with the database through an instance of CDM_MetaData - Standard_EXPORT Handle(CDM_Document) Retrieve (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const Standard_Boolean UseStorageConfiguration = Standard_True); + Standard_EXPORT Handle(CDM_Document) Retrieve + (const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const Standard_Boolean UseStorageConfiguration = Standard_True, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! This method retrieves a document from the database. //! If the Document references other documents which have @@ -103,18 +107,28 @@ //! Handle(CDM_Document) theDocument=myApplication->Retrieve("|user|cascade","box","2"); //! A link is kept with the database through an instance //! of CDM_MetaData - Standard_EXPORT Handle(CDM_Document) Retrieve (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aVersion, const Standard_Boolean UseStorageConfiguration = Standard_True); - - Standard_EXPORT PCDM_ReaderStatus CanRetrieve (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName); - - Standard_EXPORT PCDM_ReaderStatus CanRetrieve (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aVersion); + Standard_EXPORT Handle(CDM_Document) Retrieve + (const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const TCollection_ExtendedString& aVersion, + const Standard_Boolean UseStorageConfiguration = Standard_True, + const Message_ProgressRange& theRange = Message_ProgressRange()); + + Standard_EXPORT PCDM_ReaderStatus CanRetrieve (const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName); + + Standard_EXPORT PCDM_ReaderStatus CanRetrieve (const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const TCollection_ExtendedString& aVersion); //! Checks status after Retrieve PCDM_ReaderStatus GetRetrieveStatus() const { return myRetrievableStatus; } //! Reads aDoc from standard SEEKABLE stream theIStream, //! the stream should support SEEK fuctionality - Standard_EXPORT Handle(CDM_Document) Read (Standard_IStream& theIStream); + Standard_EXPORT Handle(CDM_Document) Read + (Standard_IStream& theIStream, + const Message_ProgressRange& theRange = Message_ProgressRange()); //! Returns instance of read driver for specified format. //! @@ -147,26 +161,20 @@ //! try to retrieve a Format directly in the file or in //! application resource by using extension. returns //! True if found; - Standard_EXPORT Standard_Boolean Format (const TCollection_ExtendedString& aFileName, TCollection_ExtendedString& theFormat); + Standard_EXPORT Standard_Boolean Format (const TCollection_ExtendedString& aFileName, + TCollection_ExtendedString& theFormat); Standard_EXPORT Standard_ExtString DefaultFolder(); Standard_EXPORT Standard_Boolean SetDefaultFolder (const Standard_ExtString aFolder); - -friend class CDF_Session; + //! returns MetaDatdDriver of this application + Standard_EXPORT Handle(CDF_MetaDataDriver) MetaDataDriver() const; DEFINE_STANDARD_RTTIEXT(CDF_Application,CDM_Application) -protected: - - - Standard_EXPORT CDF_Application(); - - PCDM_ReaderStatus myRetrievableStatus; - NCollection_IndexedDataMap myReaders; - NCollection_IndexedDataMap myWriters; - + Handle(CDF_MetaDataDriver) myMetaDataDriver; + Handle(CDF_Directory) myDirectory; private: @@ -183,11 +191,19 @@ //! retrieved and modified since the previous retrieval. //! You do not need to call , but you should redefine //! this method to implement application specific behavior. - Standard_EXPORT virtual void Activate (const Handle(CDM_Document)& aDocument, const CDF_TypeOfActivation aTypeOfActivation); + Standard_EXPORT virtual void Activate (const Handle(CDM_Document)& aDocument, + const CDF_TypeOfActivation aTypeOfActivation); - Standard_EXPORT Handle(CDM_Document) Retrieve (const Handle(CDM_MetaData)& aMetaData, const Standard_Boolean UseStorageConfiguration) Standard_OVERRIDE; - - Standard_EXPORT Handle(CDM_Document) Retrieve (const Handle(CDM_MetaData)& aMetaData, const Standard_Boolean UseStorageConfiguration, const Standard_Boolean IsComponent); + Standard_EXPORT Handle(CDM_Document) Retrieve + (const Handle(CDM_MetaData)& aMetaData, + const Standard_Boolean UseStorageConfiguration, + const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; + + Standard_EXPORT Handle(CDM_Document) Retrieve + (const Handle(CDM_MetaData)& aMetaData, + const Standard_Boolean UseStorageConfiguration, + const Standard_Boolean IsComponent, + const Message_ProgressRange& theRange = Message_ProgressRange()); Standard_EXPORT Standard_Integer DocumentVersion (const Handle(CDM_MetaData)& theMetaData) Standard_OVERRIDE; @@ -195,6 +211,14 @@ Standard_EXPORT PCDM_ReaderStatus CanRetrieve (const Handle(CDM_MetaData)& aMetaData); +protected: + + Standard_EXPORT CDF_Application(); + + PCDM_ReaderStatus myRetrievableStatus; + NCollection_IndexedDataMap myReaders; + NCollection_IndexedDataMap myWriters; + private: TCollection_ExtendedString myDefaultFolder; }; diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF.cxx opencascade-7.5.1+dfsg1/src/CDF/CDF.cxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -// Created on: 1998-03-11 -// Created by: Jean-Louis Frenkel -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include - -static void CDF_InitApplication () { - - static Standard_Boolean FirstApplication = Standard_True; - - if(FirstApplication) { - FirstApplication = Standard_False; - } -} -void CDF::GetLicense(const Standard_Integer ){ - - CDF_InitApplication(); - -} - -Standard_Boolean CDF::IsAvailable(const Standard_Integer ) { - - CDF_InitApplication(); - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_Directory.cxx opencascade-7.5.1+dfsg1/src/CDF/CDF_Directory.cxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_Directory.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_Directory.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,31 +31,22 @@ } void CDF_Directory::Remove(const Handle(CDM_Document)& aDocument) { - - CDM_ListIteratorOfListOfDocument it(myDocuments); - - Standard_Boolean found = Standard_False; - for (; it.More() && !found;) { - found = aDocument == it.Value(); - if(found) + for (CDM_ListIteratorOfListOfDocument it(myDocuments); it.More(); it.Next()) { + if (aDocument == it.Value()) { myDocuments.Remove(it); - else - it.Next(); + break; + } } } - Standard_Boolean CDF_Directory::Contains(const Handle(CDM_Document)& aDocument) const { - - CDM_ListIteratorOfListOfDocument it(myDocuments); - Standard_Boolean found = Standard_False; - for (; it.More() && !found; it.Next()) { - found = aDocument == it.Value(); + for (CDM_ListIteratorOfListOfDocument it(myDocuments); it.More(); it.Next()) { + if (aDocument == it.Value()) + return Standard_True; } - return found; + return Standard_False; } - Standard_Integer CDF_Directory::Length() const { return myDocuments.Extent(); } @@ -69,6 +60,7 @@ Standard_Boolean CDF_Directory::IsEmpty() const { return myDocuments.IsEmpty(); } + Handle(CDM_Document) CDF_Directory::Last() { Standard_NoSuchObject_Raise_if(IsEmpty(),"CDF_Directory::Last: the directory does not contain any document"); return myDocuments.Last(); diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_DirectoryIterator.cxx opencascade-7.5.1+dfsg1/src/CDF/CDF_DirectoryIterator.cxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_DirectoryIterator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_DirectoryIterator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,13 +17,9 @@ #include #include -#include #include #include -CDF_DirectoryIterator::CDF_DirectoryIterator():myIterator(CDF_Session::CurrentSession()->Directory()->List()) {} - - CDF_DirectoryIterator::CDF_DirectoryIterator(const Handle(CDF_Directory)& aDirectory):myIterator(aDirectory->List()) {} diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_FWOSDriver.cxx opencascade-7.5.1+dfsg1/src/CDF/CDF_FWOSDriver.cxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_FWOSDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_FWOSDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,7 +48,10 @@ //function : CDF_FWOSDriver //purpose : //============================================================================== -CDF_FWOSDriver::CDF_FWOSDriver() {} +CDF_FWOSDriver::CDF_FWOSDriver(CDM_MetaDataLookUpTable& theLookUpTable) +: myLookUpTable (&theLookUpTable) +{ +} //============================================================================== //function : Find @@ -107,7 +110,7 @@ const TCollection_ExtendedString& /*aVersion*/) { TCollection_ExtendedString p = Concatenate(aFolder,aName); - return CDM_MetaData::LookUp(aFolder,aName,p,p,UTL::IsReadOnly(p)); + return CDM_MetaData::LookUp (*myLookUpTable, aFolder, aName, p, p, UTL::IsReadOnly(p)); } //============================================================================== @@ -117,7 +120,7 @@ Handle(CDM_MetaData) CDF_FWOSDriver::CreateMetaData(const Handle(CDM_Document)& aDocument, const TCollection_ExtendedString& aFileName) { - return CDM_MetaData::LookUp(aDocument->RequestedFolder(),aDocument->RequestedName(), + return CDM_MetaData::LookUp(*myLookUpTable, aDocument->RequestedFolder(), aDocument->RequestedName(), Concatenate(aDocument->RequestedFolder(),aDocument->RequestedName()), aFileName,UTL::IsReadOnly(aFileName)); } @@ -194,23 +197,6 @@ } //============================================================================== -//function : BuildMetaData -//purpose : -//============================================================================== -Handle(CDM_MetaData) CDF_FWOSDriver::BuildMetaData(const TCollection_ExtendedString& aFileName) -{ - - OSD_Path p = UTL::Path(aFileName); - - TCollection_ExtendedString f = UTL::Trek(p); - TCollection_ExtendedString n = UTL::Name(p); - n +="."; - n += UTL::Extension(p); - - return CDM_MetaData::LookUp(f,n,aFileName,aFileName,UTL::IsReadOnly(aFileName)); -} - -//============================================================================== //function : SetName //purpose : //============================================================================== diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_FWOSDriver.hxx opencascade-7.5.1+dfsg1/src/CDF/CDF_FWOSDriver.hxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_FWOSDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_FWOSDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,6 +21,8 @@ #include #include +#include + #include class TCollection_ExtendedString; class CDM_MetaData; @@ -36,9 +38,10 @@ public: - - //! initializes the MetaDatadriver with its specific name. - Standard_EXPORT CDF_FWOSDriver(); + //! Initializes the MetaDatadriver connected to specified look-up table. + //! Note that the created driver will keep reference to the table, + //! thus it must have life time longer than this object. + Standard_EXPORT CDF_FWOSDriver(CDM_MetaDataLookUpTable& theLookUpTable); //! indicate whether a file exists corresponding to the folder and the name Standard_EXPORT Standard_Boolean Find (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aVersion) Standard_OVERRIDE; @@ -58,30 +61,16 @@ DEFINE_STANDARD_RTTIEXT(CDF_FWOSDriver,CDF_MetaDataDriver) -protected: - - - - private: - Standard_EXPORT Handle(CDM_MetaData) MetaData (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aVersion) Standard_OVERRIDE; Standard_EXPORT Handle(CDM_MetaData) CreateMetaData (const Handle(CDM_Document)& aDocument, const TCollection_ExtendedString& aFileName) Standard_OVERRIDE; Standard_EXPORT static TCollection_ExtendedString Concatenate (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName); - Standard_EXPORT Handle(CDM_MetaData) BuildMetaData (const TCollection_ExtendedString& aFileName); - - - +private: + CDM_MetaDataLookUpTable* myLookUpTable; }; - - - - - - #endif // _CDF_FWOSDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF.hxx opencascade-7.5.1+dfsg1/src/CDF/CDF.hxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -// Created on: 1997-08-07 -// Created by: Jean-Louis Frenkel -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _CDF_HeaderFile -#define _CDF_HeaderFile - -#include -#include -#include - -#include -#include -class CDF_Directory; -class CDF_DirectoryIterator; -class CDF_Session; -class CDF_Application; -class CDF_StoreList; -class CDF_Store; -class CDF_MetaDataDriver; -class CDF_FWOSDriver; -class CDF_MetaDataDriverFactory; - -class CDF -{ -public: - - Standard_EXPORT static void GetLicense (const Standard_Integer anApplicationIdentifier); - - Standard_EXPORT static Standard_Boolean IsAvailable (const Standard_Integer anApplicationIdentifier); -}; - -#endif // _CDF_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_MetaDataDriver.cxx opencascade-7.5.1+dfsg1/src/CDF/CDF_MetaDataDriver.cxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_MetaDataDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_MetaDataDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,13 +17,14 @@ #include #include -#include #include #include #include #include #include +#include #include +#include IMPLEMENT_STANDARD_RTTIEXT(CDF_MetaDataDriver,Standard_Transient) @@ -68,15 +69,17 @@ //purpose : //======================================================================= -void CDF_MetaDataDriver::CreateReference(const Handle(CDM_MetaData)& ,const Handle(CDM_MetaData)& , const Standard_Integer , const Standard_Integer ) {} +void CDF_MetaDataDriver::CreateReference(const Handle(CDM_MetaData)& , + const Handle(CDM_MetaData)& , const Standard_Integer , const Standard_Integer ) {} //======================================================================= //function : ReferenceIterator //purpose : //======================================================================= -Handle(PCDM_ReferenceIterator) CDF_MetaDataDriver::ReferenceIterator() { - return new PCDM_ReferenceIterator(CDF_Session::CurrentSession()->CurrentApplication()->MessageDriver()); +Handle(PCDM_ReferenceIterator) CDF_MetaDataDriver::ReferenceIterator(const Handle(Message_Messenger)& theMessageDriver) +{ + return new PCDM_ReferenceIterator(theMessageDriver); } //======================================================================= @@ -84,7 +87,9 @@ //purpose : //======================================================================= -Standard_Boolean CDF_MetaDataDriver::Find(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName) { +Standard_Boolean CDF_MetaDataDriver::Find(const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName) +{ TCollection_ExtendedString aVersion; return Find(aFolder,aName,aVersion); } diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_MetaDataDriver.hxx opencascade-7.5.1+dfsg1/src/CDF/CDF_MetaDataDriver.hxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_MetaDataDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_MetaDataDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,18 +17,14 @@ #ifndef _CDF_MetaDataDriver_HeaderFile #define _CDF_MetaDataDriver_HeaderFile -#include #include -#include -#include -#include class Standard_NotImplemented; class CDM_MetaData; class TCollection_ExtendedString; class CDM_Document; class PCDM_ReferenceIterator; - +class Message_Messenger; class CDF_MetaDataDriver; DEFINE_STANDARD_HANDLE(CDF_MetaDataDriver, Standard_Transient) @@ -100,7 +96,7 @@ Standard_EXPORT virtual TCollection_ExtendedString DefaultFolder() = 0; - Standard_EXPORT virtual Handle(PCDM_ReferenceIterator) ReferenceIterator(); + Standard_EXPORT virtual Handle(PCDM_ReferenceIterator) ReferenceIterator(const Handle(Message_Messenger)& theMessageDriver); //! calls Find with an empty version Standard_EXPORT Standard_Boolean Find (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName); diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_Session.cxx opencascade-7.5.1+dfsg1/src/CDF/CDF_Session.cxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_Session.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_Session.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,131 +0,0 @@ -// Created on: 1997-08-08 -// Created by: Jean-Louis Frenkel -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(CDF_Session,Standard_Transient) - -static Handle(CDF_Session) CS; - -//======================================================================= -//function : -//purpose : -//======================================================================= -CDF_Session::CDF_Session () : myHasCurrentApplication(Standard_False) -{ - Standard_MultiplyDefined_Raise_if(!CS.IsNull()," a session already exists"); - myDirectory = new CDF_Directory(); - CS = this; -} - -//======================================================================= -//function : Exists -//purpose : -//======================================================================= -Standard_Boolean CDF_Session::Exists() { - return !CS.IsNull(); -} - -//======================================================================= -//function : Directory -//purpose : -//======================================================================= -Handle(CDF_Directory) CDF_Session::Directory() const { - - return CS->myDirectory; -} - -//======================================================================= -//function : CurrentSession -//purpose : -//======================================================================= -Handle(CDF_Session) CDF_Session::CurrentSession() { - Standard_NoSuchObject_Raise_if(CS.IsNull(), "no session has been created"); - return CS; -} - -//======================================================================= -//function : HasCurrentApplication -//purpose : -//======================================================================= -Standard_Boolean CDF_Session::HasCurrentApplication() const { - return myHasCurrentApplication; -} - -//======================================================================= -//function : CurrentApplication -//purpose : -//======================================================================= -Handle(CDF_Application) CDF_Session::CurrentApplication() const { - Standard_NoSuchObject_Raise_if(!myHasCurrentApplication,"there is no current application in the session"); - return myCurrentApplication; -} - -//======================================================================= -//function : SetCurrentApplication -//purpose : -//======================================================================= -void CDF_Session::SetCurrentApplication(const Handle(CDF_Application)& anApplication) { - myCurrentApplication = anApplication; - myHasCurrentApplication = Standard_True; -} - -//======================================================================= -//function : UnsetCurrentApplication -//purpose : -//======================================================================= -void CDF_Session::UnsetCurrentApplication() { - myHasCurrentApplication = Standard_False; - myCurrentApplication.Nullify(); -} - -//======================================================================= -//function : MetaDataDriver -//purpose : -//======================================================================= -Handle(CDF_MetaDataDriver) CDF_Session::MetaDataDriver() const { - Standard_NoSuchObject_Raise_if(myMetaDataDriver.IsNull(),"no metadatadriver has been provided; this session is not able to store or retrieve files."); - return myMetaDataDriver; -} - -//======================================================================= -//function : LoadDriver -//purpose : -//======================================================================= -void CDF_Session::LoadDriver() { - if (myMetaDataDriver.IsNull()) { - // for compatibility with old code, initialize useless driver directly - // instead of loading it as plugin - Handle(CDF_MetaDataDriverFactory) aFactory; - myMetaDataDriver = new CDF_FWOSDriver; - } -} diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_Session.hxx opencascade-7.5.1+dfsg1/src/CDF/CDF_Session.hxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_Session.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_Session.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -// Created on: 1997-08-07 -// Created by: Jean-Louis Frenkel -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _CDF_Session_HeaderFile -#define _CDF_Session_HeaderFile - -#include -#include - -#include -#include -class CDF_Directory; -class CDF_Application; -class CDF_MetaDataDriver; -class Standard_NoSuchObject; -class Standard_MultiplyDefined; - - -class CDF_Session; -DEFINE_STANDARD_HANDLE(CDF_Session, Standard_Transient) - - -class CDF_Session : public Standard_Transient -{ - -public: - - - Standard_EXPORT CDF_Session(); - - //! returns true if a session has been created. - Standard_EXPORT static Standard_Boolean Exists(); - - //! returns the only one instance of Session - //! that has been created. - Standard_EXPORT static Handle(CDF_Session) CurrentSession(); - - //! returns the directory of the session; - Standard_EXPORT Handle(CDF_Directory) Directory() const; - - Standard_EXPORT Standard_Boolean HasCurrentApplication() const; - - Standard_EXPORT Handle(CDF_Application) CurrentApplication() const; - - Standard_EXPORT void SetCurrentApplication (const Handle(CDF_Application)& anApplication); - - Standard_EXPORT void UnsetCurrentApplication(); - - Standard_EXPORT Handle(CDF_MetaDataDriver) MetaDataDriver() const; - - Standard_EXPORT void LoadDriver(); - - -friend class CDF_Application; - - - DEFINE_STANDARD_RTTIEXT(CDF_Session,Standard_Transient) - -protected: - - - - -private: - - - Handle(CDF_Directory) myDirectory; - Handle(CDF_Application) myCurrentApplication; - Standard_Boolean myHasCurrentApplication; - Handle(CDF_MetaDataDriver) myMetaDataDriver; - - -}; - - - - - - - -#endif // _CDF_Session_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_Store.cxx opencascade-7.5.1+dfsg1/src/CDF/CDF_Store.cxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_Store.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_Store.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,7 +15,6 @@ #include #include -#include #include #include #include @@ -25,16 +24,17 @@ #include #include #include -#include -#define theMetaDataDriver CDF_Session::CurrentSession()->MetaDataDriver() +#define theMetaDataDriver Handle(CDF_Application)::DownCast((myCurrentDocument->Application()))->MetaDataDriver() +static const Handle(TCollection_HExtendedString) blank = new TCollection_HExtendedString(""); -static TCollection_ExtendedString blank(""); - - - -CDF_Store::CDF_Store() {} +CDF_Store::CDF_Store() +: myHasSubComponents(Standard_False), + myIsMainDocument(Standard_False), + myStatus(PCDM_SS_No_Obj) +{ +} CDF_Store::CDF_Store(const Handle(CDM_Document)& aDocument):myHasSubComponents(Standard_False) { myMainDocument = aDocument; @@ -62,19 +62,14 @@ myCurrentDocument = myMainDocument; } -Standard_ExtString CDF_Store::Folder() const { - static TCollection_ExtendedString retv; +Handle(TCollection_HExtendedString) CDF_Store::Folder() const { if(myCurrentDocument->HasRequestedFolder()) - retv = myCurrentDocument->RequestedFolder(); - else - retv= blank; - return retv.ToExtString(); + return new TCollection_HExtendedString(myCurrentDocument->RequestedFolder()); + return blank; } -Standard_ExtString CDF_Store::Name() const { - static TCollection_ExtendedString retv; - retv = myCurrentDocument->RequestedName(); - return retv.ToExtString(); +Handle(TCollection_HExtendedString) CDF_Store::Name() const { + return new TCollection_HExtendedString(myCurrentDocument->RequestedName()); } @@ -140,31 +135,26 @@ return SetName(theName); } -void CDF_Store::Realize() { +void CDF_Store::Realize (const Message_ProgressRange& theRange) +{ Standard_ProgramError_Raise_if(!myList->IsConsistent(),"information are missing"); Handle(CDM_MetaData) m; myText = ""; - myStatus = myList->Store(m,myText); + myStatus = myList->Store(m, myText, theRange); if(myStatus==PCDM_SS_OK) myPath = m->Path(); } Standard_ExtString CDF_Store::Path() const { return myPath.ToExtString(); } -Standard_ExtString CDF_Store::MetaDataPath() const { - static TCollection_ExtendedString retv; - retv=""; - if(myCurrentDocument->IsStored()) retv=myCurrentDocument->MetaData()->Path(); - return retv.ToExtString(); +Handle(TCollection_HExtendedString) CDF_Store::MetaDataPath() const { + if(myCurrentDocument->IsStored()) + return new TCollection_HExtendedString(myCurrentDocument->MetaData()->Path()); + return blank; } -Standard_ExtString CDF_Store::Description() const { - static TCollection_ExtendedString retv; - +Handle(TCollection_HExtendedString) CDF_Store::Description() const { if(myMainDocument->FindDescription()) - retv = myMainDocument->Description(); - else - retv= blank; - - return retv.ToExtString(); + return new TCollection_HExtendedString(myMainDocument->Description()); + return blank; } Standard_Boolean CDF_Store::IsStored() const { @@ -186,13 +176,10 @@ return myCurrentDocument->HasRequestedPreviousVersion(); } -Standard_ExtString CDF_Store::PreviousVersion() const { - static TCollection_ExtendedString retv; +Handle(TCollection_HExtendedString) CDF_Store::PreviousVersion() const { if(myCurrentDocument->HasRequestedPreviousVersion()) - retv= myCurrentDocument->RequestedPreviousVersion(); - else - retv=blank; - return retv.ToExtString(); + return new TCollection_HExtendedString(myCurrentDocument->RequestedPreviousVersion()); + return blank; } Standard_Boolean CDF_Store::SetPreviousVersion (const Standard_ExtString aPreviousVersion) { @@ -212,36 +199,7 @@ return Standard_True; } -void CDF_Store::InitComponent() { - myList->Init(); -} - -Standard_Boolean CDF_Store::MoreComponent() const { - return myList->More(); -} - -void CDF_Store::NextComponent() { - myList->Next(); -} -void CDF_Store::SetCurrent() { - myCurrentDocument = myList->Value(); - myIsMainDocument = myCurrentDocument == myMainDocument; - - -} - -Standard_ExtString CDF_Store::Component() const { - - static TCollection_ExtendedString retv; - retv=myList->Value()->Presentation(); - return retv.ToExtString(); -} -Standard_Boolean CDF_Store::HasSubComponents () const { - return myHasSubComponents; -} - -void CDF_Store::SetCurrent(const Standard_ExtString aPresentation) { - myCurrentDocument = CDM_Document::FindFromPresentation(aPresentation); +void CDF_Store::SetCurrent(const Standard_ExtString /*aPresentation*/) { myIsMainDocument = myCurrentDocument == myMainDocument; } void CDF_Store::SetMain() { @@ -253,18 +211,6 @@ return myIsMainDocument; } -CDF_SubComponentStatus CDF_Store::SubComponentStatus(const Standard_ExtString aPresentation) const { - Handle(CDM_Document) d = CDM_Document::FindFromPresentation(aPresentation); - - if(!d->IsStored()) - return d->HasRequestedFolder()? CDF_SCS_Consistent : CDF_SCS_Unconsistent; - - if(d->IsModified()) return CDF_SCS_Modified; - return CDF_SCS_Stored; -} - - - PCDM_StoreStatus CDF_Store::StoreStatus() const { return myStatus; } @@ -275,8 +221,7 @@ void CDF_Store::FindDefault() { if (!myCurrentDocument->IsStored ()) { - myCurrentDocument->SetRequestedFolder(CDF_Session::CurrentSession()->CurrentApplication()->DefaultFolder()); -// myCurrentDocument->SetRequestedName(theMetaDataDriver->SetName(myCurrentDocument,myCurrentDocument->Presentation())); + myCurrentDocument->SetRequestedFolder(Handle(CDF_Application)::DownCast((myCurrentDocument->Application()))->DefaultFolder()); myCurrentDocument->SetRequestedName(theMetaDataDriver->SetName(myCurrentDocument,myCurrentDocument->RequestedName())); } } @@ -284,8 +229,6 @@ myCurrentDocument->SetRequestedComment(aComment); } -Standard_ExtString CDF_Store::Comment() const { - static TCollection_ExtendedString retv; - retv=myCurrentDocument->RequestedComment(); - return retv.ToExtString(); +Handle(TCollection_HExtendedString) CDF_Store::Comment() const { + return new TCollection_HExtendedString(myCurrentDocument->RequestedComment()); } diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_Store.hxx opencascade-7.5.1+dfsg1/src/CDF/CDF_Store.hxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_Store.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_Store.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,6 +28,10 @@ #include #include #include +#include + +#include + class CDF_StoreList; class CDM_Document; class TCollection_ExtendedString; @@ -45,10 +49,10 @@ Standard_EXPORT CDF_Store(const Handle(CDM_Document)& aDocument); //! returns the folder in which the current document will be stored. - Standard_EXPORT Standard_ExtString Folder() const; + Standard_EXPORT Handle(TCollection_HExtendedString) Folder() const; //! returns the name under which the current document will be stored - Standard_EXPORT Standard_ExtString Name() const; + Standard_EXPORT Handle(TCollection_HExtendedString) Name() const; //! returns true if the current document is already stored Standard_EXPORT Standard_Boolean IsStored() const; @@ -61,7 +65,7 @@ Standard_EXPORT Standard_Boolean HasAPreviousVersion() const; - Standard_EXPORT Standard_ExtString PreviousVersion() const; + Standard_EXPORT Handle(TCollection_HExtendedString) PreviousVersion() const; //! returns true if the currentdocument is the main one, ie the document //! of the current selection. @@ -77,7 +81,7 @@ Standard_EXPORT void SetComment (const Standard_ExtString aComment); - Standard_EXPORT Standard_ExtString Comment() const; + Standard_EXPORT Handle(TCollection_HExtendedString) Comment() const; //! defines the name under which the document should be stored. //! uses for example after modification of the folder. @@ -85,36 +89,17 @@ Standard_EXPORT Standard_Boolean SetPreviousVersion (const Standard_ExtString aPreviousVersion); - Standard_EXPORT void Realize(); + Standard_EXPORT void Realize (const Message_ProgressRange& theRange = Message_ProgressRange()); //! returns the complete path of the created meta-data. Standard_EXPORT Standard_ExtString Path() const; //! returns the path of the previous store is the object //! is already stored, otherwise an empty string; - Standard_EXPORT Standard_ExtString MetaDataPath() const; + Standard_EXPORT Handle(TCollection_HExtendedString) MetaDataPath() const; //! returns the description of the format of the main object. - Standard_EXPORT Standard_ExtString Description() const; - - //! Allows to Start a new Iteration from beginning - Standard_EXPORT void InitComponent(); - - //! Returns True if there are more entries to return - Standard_EXPORT Standard_Boolean MoreComponent() const; - - //! Go to the next entry - //! (if there is not, Value will raise an exception) - Standard_EXPORT void NextComponent(); - - Standard_EXPORT void SetCurrent(); - - //! Returns item value of current entry - Standard_EXPORT Standard_ExtString Component() const; - - Standard_EXPORT Standard_Boolean HasSubComponents() const; - - Standard_EXPORT CDF_SubComponentStatus SubComponentStatus (const Standard_ExtString aPresentation) const; + Standard_EXPORT Handle(TCollection_HExtendedString) Description() const; Standard_EXPORT void SetCurrent (const Standard_ExtString aPresentation); diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_StoreList.cxx opencascade-7.5.1+dfsg1/src/CDF/CDF_StoreList.cxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_StoreList.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_StoreList.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -74,9 +73,11 @@ Handle(CDM_Document) CDF_StoreList::Value() const { return myIterator.Key(); } -PCDM_StoreStatus CDF_StoreList::Store (Handle(CDM_MetaData)& aMetaData, TCollection_ExtendedString& aStatusAssociatedText) { - - Handle(CDF_MetaDataDriver) theMetaDataDriver = CDF_Session::CurrentSession()->MetaDataDriver(); +PCDM_StoreStatus CDF_StoreList::Store (Handle(CDM_MetaData)& aMetaData, + TCollection_ExtendedString& aStatusAssociatedText, + const Message_ProgressRange& theRange) +{ + Handle(CDF_MetaDataDriver) theMetaDataDriver = Handle(CDF_Application)::DownCast((myMainDocument->Application()))->MetaDataDriver(); PCDM_StoreStatus status = PCDM_SS_OK; { @@ -101,6 +102,10 @@ throw Standard_Failure(aMsg.str().c_str()); } + // Reset the store-status. + // It has sense in multi-threaded access to the storage driver - this way we reset the status for each call. + aDocumentStorageDriver->SetStoreStatus(PCDM_SS_OK); + if(!theMetaDataDriver->FindFolder(theDocument->RequestedFolder())) { Standard_SStream aMsg; aMsg << "could not find the active dbunit"; aMsg << TCollection_ExtendedString(theDocument->RequestedFolder())<< (char)0; @@ -108,7 +113,7 @@ } TCollection_ExtendedString theName=theMetaDataDriver->BuildFileName(theDocument); - aDocumentStorageDriver->Write(theDocument,theName); + aDocumentStorageDriver->Write(theDocument, theName, theRange); status = aDocumentStorageDriver->GetStoreStatus(); aMetaData = theMetaDataDriver->CreateMetaData(theDocument,theName); theDocument->SetMetaData(aMetaData); diff -Nru opencascade-7.4.1+dfsg1/src/CDF/CDF_StoreList.hxx opencascade-7.5.1+dfsg1/src/CDF/CDF_StoreList.hxx --- opencascade-7.4.1+dfsg1/src/CDF/CDF_StoreList.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/CDF_StoreList.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,8 @@ #include #include #include +#include + class CDM_Document; class Standard_NoSuchObject; class CDM_MetaData; @@ -48,7 +50,9 @@ //! stores each object of the storelist in the reverse //! order of which they had been added. - Standard_EXPORT PCDM_StoreStatus Store (Handle(CDM_MetaData)& aMetaData, TCollection_ExtendedString& aStatusAssociatedText); + Standard_EXPORT PCDM_StoreStatus Store (Handle(CDM_MetaData)& aMetaData, + TCollection_ExtendedString& aStatusAssociatedText, + const Message_ProgressRange& theRange = Message_ProgressRange()); Standard_EXPORT void Init(); diff -Nru opencascade-7.4.1+dfsg1/src/CDF/FILES opencascade-7.5.1+dfsg1/src/CDF/FILES --- opencascade-7.4.1+dfsg1/src/CDF/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDF/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,5 +1,3 @@ -CDF.cxx -CDF.hxx CDF_Application.cxx CDF_Application.hxx CDF_Directory.cxx @@ -13,8 +11,6 @@ CDF_MetaDataDriverError.hxx CDF_MetaDataDriverFactory.cxx CDF_MetaDataDriverFactory.hxx -CDF_Session.cxx -CDF_Session.hxx CDF_Store.cxx CDF_Store.hxx CDF_StoreList.cxx diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_Application.cxx opencascade-7.5.1+dfsg1/src/CDM/CDM_Application.cxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_Application.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_Application.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -28,6 +29,14 @@ IMPLEMENT_STANDARD_RTTIEXT(CDM_Application,Standard_Transient) //======================================================================= +//function : Constructor +//purpose : +//======================================================================= +CDM_Application::CDM_Application() +{ + myMessenger = new Message_Messenger; +} +//======================================================================= //function : SetDocumentVersion //purpose : //======================================================================= @@ -57,10 +66,7 @@ Handle(Message_Messenger) CDM_Application::MessageDriver() { - static Handle(Message_Messenger) theMessenger; - if(theMessenger.IsNull()) - theMessenger = Message::DefaultMessenger(); - return theMessenger; + return myMessenger; } //======================================================================= @@ -78,10 +84,10 @@ //purpose : //======================================================================= -void CDM_Application::BeginOfUpdate (const Handle(CDM_Document)& aDocument) +void CDM_Application::BeginOfUpdate (const Handle(CDM_Document)& /*aDocument*/) { - TCollection_ExtendedString updating("Updating:"); - updating+=aDocument->Presentation(); + TCollection_ExtendedString updating("Updating: "); + updating += "Document"; Write(updating.ToExtString()); } @@ -91,17 +97,17 @@ //======================================================================= void CDM_Application::EndOfUpdate - (const Handle(CDM_Document)& aDocument, + (const Handle(CDM_Document)& /*aDocument*/, const Standard_Boolean theStatus, const TCollection_ExtendedString& /*ErrorString*/) { TCollection_ExtendedString message; if (theStatus) - message="Updated:"; + message="Updated: "; else - message="Error during updating:"; + message="Error during updating: "; - message+=aDocument->Presentation(); + message+="Document"; Write(message.ToExtString()); } @@ -126,3 +132,21 @@ // Default: empty return TCollection_AsciiString(); } + +//======================================================================= +//function : MetaDataLookUpTable +//purpose : returns the MetaData LookUpTable +//======================================================================= +CDM_MetaDataLookUpTable& CDM_Application::MetaDataLookUpTable() +{ + return myMetaDataLookUpTable; +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void CDM_Application::DumpJson (Standard_OStream& theOStream, Standard_Integer /*theDepth*/) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) +} diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_Application.hxx opencascade-7.5.1+dfsg1/src/CDM/CDM_Application.hxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_Application.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_Application.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,8 @@ #include #include #include +#include +#include class CDM_Reference; class CDM_MetaData; @@ -66,6 +68,12 @@ //! Returns the application version. Standard_EXPORT virtual TCollection_AsciiString Version() const; + + //! Returns MetaData LookUpTable + Standard_EXPORT virtual CDM_MetaDataLookUpTable& MetaDataLookUpTable(); + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; friend class CDM_Reference; friend class CDM_MetaData; @@ -75,22 +83,25 @@ protected: - + Standard_EXPORT CDM_Application(); + Standard_EXPORT void SetDocumentVersion (const Handle(CDM_Document)& aDocument, const Handle(CDM_MetaData)& aMetaData) const; Standard_EXPORT void SetReferenceCounter (const Handle(CDM_Document)& aDocument, const Standard_Integer aReferenceCounter); - - private: - Standard_EXPORT virtual Handle(CDM_Document) Retrieve (const Handle(CDM_MetaData)& aMetaData, const Standard_Boolean UseStorageConfiguration) = 0; + Standard_EXPORT virtual Handle(CDM_Document) Retrieve + (const Handle(CDM_MetaData)& aMetaData, + const Standard_Boolean UseStorageConfiguration, + const Message_ProgressRange& theRange = Message_ProgressRange()) = 0; //! returns -1 if the metadata has no modification counter. Standard_EXPORT virtual Standard_Integer DocumentVersion (const Handle(CDM_MetaData)& aMetaData) = 0; - + Handle(Message_Messenger) myMessenger; + CDM_MetaDataLookUpTable myMetaDataLookUpTable; }; diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_DataMapIteratorOfPresentationDirectory.hxx opencascade-7.5.1+dfsg1/src/CDM/CDM_DataMapIteratorOfPresentationDirectory.hxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_DataMapIteratorOfPresentationDirectory.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_DataMapIteratorOfPresentationDirectory.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright (c) 2015 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#ifndef CDM_DataMapIteratorOfPresentationDirectory_HeaderFile -#define CDM_DataMapIteratorOfPresentationDirectory_HeaderFile - -#include - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_Document.cxx opencascade-7.5.1+dfsg1/src/CDM/CDM_Document.cxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_Document.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_Document.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,11 +23,11 @@ #include #include #include -#include #include #include #include #include +#include #include #include #include @@ -39,11 +39,6 @@ IMPLEMENT_STANDARD_RTTIEXT(CDM_Document,Standard_Transient) -static CDM_PresentationDirectory& getPresentations() { - static CDM_PresentationDirectory thePresentations; - return thePresentations; -} - //======================================================================= //function : CDM_Document //purpose : @@ -51,7 +46,6 @@ CDM_Document::CDM_Document(): myResourcesAreLoaded (Standard_False), - myValidPresentation (Standard_False), myVersion (1), myActualReferenceIdentifier (0), myStorageVersion (0), @@ -228,11 +222,6 @@ return theReference; } -static CDM_ListOfDocument& getListOfDocumentToUpdate() { - static CDM_ListOfDocument theListOfDocumentToUpdate; - return theListOfDocumentToUpdate; -} - //======================================================================= //function : IsInSession //purpose : @@ -285,25 +274,23 @@ //function : UpdateFromDocuments //purpose : //======================================================================= - void CDM_Document::UpdateFromDocuments(const Standard_Address aModifContext) const { - Standard_Boolean StartUpdateCycle=getListOfDocumentToUpdate().IsEmpty(); - + CDM_ListOfDocument aListOfDocumentsToUpdate; + Standard_Boolean StartUpdateCycle = aListOfDocumentsToUpdate.IsEmpty(); CDM_ListIteratorOfListOfReferences it(myFromReferences); for(; it.More() ; it.Next()) { Handle(CDM_Document) theFromDocument=it.Value()->FromDocument(); CDM_ListIteratorOfListOfDocument itUpdate; - for(; itUpdate.More(); itUpdate.Next()) { if(itUpdate.Value() == theFromDocument) break; - + if(itUpdate.Value()->ShallowReferences(theFromDocument)) { - getListOfDocumentToUpdate().InsertBefore(theFromDocument,itUpdate); + aListOfDocumentsToUpdate.InsertBefore(theFromDocument,itUpdate); break; } } - if(!itUpdate.More()) getListOfDocumentToUpdate().Append(theFromDocument); + if(!itUpdate.More()) aListOfDocumentsToUpdate.Append(theFromDocument); theFromDocument->Update(this,it.Value()->ReferenceIdentifier(),aModifContext); } @@ -313,15 +300,15 @@ Handle(CDM_Application) theApplication; TCollection_ExtendedString ErrorString; - while(!getListOfDocumentToUpdate().IsEmpty()) { - theDocumentToUpdate=getListOfDocumentToUpdate().First(); + while(!aListOfDocumentsToUpdate.IsEmpty()) { + theDocumentToUpdate = aListOfDocumentsToUpdate.First(); theApplication=theDocumentToUpdate->Application(); ErrorString.Clear(); theApplication->BeginOfUpdate(theDocumentToUpdate); theApplication->EndOfUpdate (theDocumentToUpdate, theDocumentToUpdate->Update(ErrorString), ErrorString); - getListOfDocumentToUpdate().RemoveFirst(); + aListOfDocumentsToUpdate.RemoveFirst(); } } } @@ -519,104 +506,6 @@ } //======================================================================= -//function : Presentation -//purpose : -//======================================================================= - -Standard_ExtString CDM_Document::Presentation() -{ - if(!myValidPresentation) ComputePresentation(); - return myPresentation.ToExtString(); -} - -//======================================================================= -//function : UnvalidPresentation -//purpose : -//======================================================================= - -void CDM_Document::UnvalidPresentation() -{ - if(myValidPresentation) { - getPresentations().UnBind(myPresentation); - myValidPresentation=Standard_False; - } -} - -//======================================================================= -//function : ComputePresentation -//purpose : -//======================================================================= - -void CDM_Document::ComputePresentation() -{ - TCollection_ExtendedString presentation(""); - static Standard_Integer theUnnamedDocuments(0); - static CDM_NamesDirectory theNames; - - if(!myMetaData.IsNull()) { - presentation += myMetaData->Name(); - if(!theNames.IsBound(presentation)) theNames.Bind(presentation,0); - Standard_Integer range = theNames(presentation); - range += 1; - theNames(presentation) = range; - if(range != 1) { - presentation += "<"; - presentation += range; - presentation += ">"; - } - } - else { - presentation = "Document_"; - presentation += ++theUnnamedDocuments; - } - - if(getPresentations().IsBound(presentation)) { - TCollection_ExtendedString Test = presentation; - Test += "!"; - Standard_Integer Count=0; - while (getPresentations().IsBound(Test)) { - Count++; - Test = presentation; Test+= "!"; Test+= Count; - } - presentation = Test; - } - - - myPresentation = TCollection_ExtendedString(presentation); - myValidPresentation = Standard_True; - getPresentations().Bind(presentation,this); -} - -//======================================================================= -//function : FindFromPresentation -//purpose : -//======================================================================= - -Handle(CDM_Document) CDM_Document::FindFromPresentation - (const TCollection_ExtendedString& aPresentation) -{ - TCollection_ExtendedString x(aPresentation); - if(!getPresentations().IsBound(x)) { - Standard_SStream aMsg; - aMsg <<"No document having this presentation: " << x << " does exist." - << std::endl << (char)0; - throw Standard_NoSuchObject(aMsg.str().c_str()); - } - return getPresentations()(x); -} - -//======================================================================= -//function : FindPresentation -//purpose : -//======================================================================= - -Standard_Boolean CDM_Document::FindPresentation - (const TCollection_ExtendedString& aPresentation) -{ - return getPresentations().IsBound(aPresentation); -} - -//======================================================================= //function : IsStored //purpose : //======================================================================= @@ -647,8 +536,8 @@ aMetaData->SetDocument(this); -// Update the document refencing this MetaData: - CDM_DataMapIteratorOfMetaDataLookUpTable it(CDM_MetaData::LookUpTable()); + // Update the document refencing this MetaData: + CDM_DataMapIteratorOfMetaDataLookUpTable it(Application()->MetaDataLookUpTable()); for(;it.More();it.Next()) { const Handle(CDM_MetaData)& theMetaData=it.Value(); if(theMetaData != aMetaData && theMetaData->IsRetrieved()) { @@ -659,11 +548,8 @@ } } if(!myMetaData.IsNull()) { - if(myMetaData->Name() != aMetaData->Name()) UnvalidPresentation(); myMetaData->UnsetDocument(); } - else - UnvalidPresentation(); } myStorageVersion = Modifications(); @@ -683,7 +569,6 @@ { if(!myMetaData.IsNull()) { myMetaData->UnsetDocument(); -// myMetaData.Nullify(); } } @@ -790,7 +675,7 @@ if(!myMetaData.IsNull()) myRequestedName=myMetaData->Name(); else - myRequestedName=Presentation(); + myRequestedName="Document_"; } myRequestedNameIsDefined=Standard_True; return myRequestedName; @@ -911,7 +796,6 @@ RemoveAllReferences(); UnsetIsStored(); myApplication.Nullify(); - UnvalidPresentation(); } @@ -1284,3 +1168,52 @@ { myStorageFormatVersion = theVersion; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void CDM_Document::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + for (TColStd_SequenceOfExtendedString::Iterator aCommentIt (myComments); aCommentIt.More(); aCommentIt.Next()) + { + const TCollection_ExtendedString& aComment = aCommentIt.Value(); + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, aComment) + } + + for (CDM_ListOfReferences::Iterator aFromReferenceIt (myFromReferences); aFromReferenceIt.More(); aFromReferenceIt.Next()) + { + const Handle(CDM_Reference)& aFromReference = aFromReferenceIt.Value().get(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aFromReference.get()) + } + + for (CDM_ListOfReferences::Iterator aToReferenceIt (myToReferences); aToReferenceIt.More(); aToReferenceIt.Next()) + { + const Handle(CDM_Reference)& aToReference = aToReferenceIt.Value().get(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aToReference.get()) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myVersion) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myActualReferenceIdentifier) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myStorageVersion) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myMetaData.get()) + + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myRequestedComment) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myRequestedFolder) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRequestedFolderIsDefined) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myRequestedName) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRequestedNameIsDefined) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRequestedPreviousVersionIsDefined) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myRequestedPreviousVersion) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myFileExtension) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myDescription) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFileExtensionWasFound) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDescriptionWasFound) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myApplication.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myStorageFormatVersion) +} diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_Document.hxx opencascade-7.5.1+dfsg1/src/CDM/CDM_Document.hxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_Document.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_Document.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ #include #include #include +#include class CDM_MetaData; class CDM_Application; @@ -216,21 +217,6 @@ //! the comment is an empty string. Standard_EXPORT Standard_ExtString Comment() const; - //! Returns an alphanumeric string identifying this document - //! in a unique manner in the current process. The presentation - //! may change when the document is stored. - //! Tries to get the 'FileFormat`.Presentation resource - //! This item is used to give a default presentation - //! to the document. - Standard_EXPORT Standard_ExtString Presentation(); - - //! returns the document having the given alphanumeric presentation. - Standard_EXPORT static Handle(CDM_Document) FindFromPresentation (const TCollection_ExtendedString& aPresentation); - - //! indicates whether a document having the given presentation - //! does exist. - Standard_EXPORT static Standard_Boolean FindPresentation (const TCollection_ExtendedString& aPresentation); - Standard_EXPORT Standard_Boolean IsStored() const; //! returns the value of the modification counter at the @@ -310,7 +296,7 @@ //! A referenced document may indicate through this //! virtual method that it does not allow the closing of //! aDocument which it references through the reference - //! aReferenceIdentifier. By default returns Standard_True;; + //! aReferenceIdentifier. By default returns Standard_True. Standard_EXPORT virtual Standard_Boolean CanCloseReference (const Handle(CDM_Document)& aDocument, const Standard_Integer aReferenceIdentifier) const; //! A referenced document may update its internal @@ -349,6 +335,9 @@ //! Sets of the format to be used to store the document Standard_EXPORT void ChangeStorageFormatVersion(const Standard_Integer theVersion); + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + friend class CDM_Reference; friend class CDM_ReferenceIterator; friend class CDM_Application; @@ -371,10 +360,6 @@ //! the manager returned by this method will be //! used to search for the following resource items. Standard_EXPORT Handle(Resource_Manager) StorageResource(); - - Standard_EXPORT void ComputePresentation(); - - Standard_EXPORT void UnvalidPresentation(); Standard_EXPORT void AddToReference (const Handle(CDM_Reference)& aReference); @@ -382,9 +367,8 @@ Standard_EXPORT void RemoveFromReference (const Standard_Integer aReferenceIdentifier); + TColStd_SequenceOfExtendedString myComments; - TCollection_ExtendedString myPresentation; - Standard_Boolean myValidPresentation; CDM_ListOfReferences myFromReferences; CDM_ListOfReferences myToReferences; Standard_Integer myVersion; @@ -404,7 +388,6 @@ Standard_Boolean myDescriptionWasFound; Handle(CDM_Application) myApplication; Standard_Integer myStorageFormatVersion; - }; diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_MetaData.cxx opencascade-7.5.1+dfsg1/src/CDM/CDM_MetaData.cxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_MetaData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_MetaData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,18 +20,18 @@ #include #include #include -#include +#include +#include +#include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(CDM_MetaData,Standard_Transient) -static CDM_MetaDataLookUpTable& getLookUpTable(){ - static CDM_MetaDataLookUpTable theLookUpTable; - return theLookUpTable; -} CDM_MetaData::CDM_MetaData(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath,const TCollection_ExtendedString& aFileName,const Standard_Boolean ReadOnly): myIsRetrieved(Standard_False), +myDocument(NULL), myFolder(aFolder), myName(aName), myHasVersion(Standard_False), @@ -43,6 +43,7 @@ CDM_MetaData::CDM_MetaData(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath,const TCollection_ExtendedString& aVersion,const TCollection_ExtendedString& aFileName,const Standard_Boolean ReadOnly): myIsRetrieved(Standard_False), +myDocument(NULL), myFolder(aFolder), myName(aName), myVersion(aVersion), @@ -68,29 +69,48 @@ void CDM_MetaData::UnsetDocument() { myIsRetrieved = Standard_False; } -Handle(CDM_MetaData) CDM_MetaData::LookUp(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath,const TCollection_ExtendedString& aFileName,const Standard_Boolean ReadOnly) { +Handle(CDM_MetaData) CDM_MetaData::LookUp(CDM_MetaDataLookUpTable& theLookUpTable, + const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const TCollection_ExtendedString& aPath, + const TCollection_ExtendedString& aFileName, + const Standard_Boolean ReadOnly) +{ Handle(CDM_MetaData) theMetaData; TCollection_ExtendedString aConventionalPath=aPath; aConventionalPath.ChangeAll('\\','/'); - if(!getLookUpTable().IsBound(aConventionalPath)) { + if(!theLookUpTable.IsBound(aConventionalPath)) + { theMetaData = new CDM_MetaData(aFolder,aName,aPath,aFileName,ReadOnly); - getLookUpTable().Bind(aConventionalPath,theMetaData); + theLookUpTable.Bind(aConventionalPath, theMetaData); } else - theMetaData = getLookUpTable()(aConventionalPath); + { + theMetaData = theLookUpTable.Find(aConventionalPath); + } return theMetaData; } -Handle(CDM_MetaData) CDM_MetaData::LookUp(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath, const TCollection_ExtendedString& aVersion, const TCollection_ExtendedString& aFileName,const Standard_Boolean ReadOnly) { +Handle(CDM_MetaData) CDM_MetaData::LookUp(CDM_MetaDataLookUpTable& theLookUpTable, + const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const TCollection_ExtendedString& aPath, + const TCollection_ExtendedString& aVersion, + const TCollection_ExtendedString& aFileName, + const Standard_Boolean ReadOnly) +{ Handle(CDM_MetaData) theMetaData; TCollection_ExtendedString aConventionalPath=aPath; aConventionalPath.ChangeAll('\\','/'); - if(!getLookUpTable().IsBound(aConventionalPath)) { + if(!theLookUpTable.IsBound(aConventionalPath)) + { theMetaData = new CDM_MetaData(aFolder,aName,aPath,aVersion,aFileName,ReadOnly); - getLookUpTable().Bind(aConventionalPath,theMetaData); + theLookUpTable.Bind(aConventionalPath,theMetaData); } else - theMetaData = getLookUpTable()(aConventionalPath); + { + theMetaData = theLookUpTable.Find(aConventionalPath); + } return theMetaData; } @@ -127,9 +147,7 @@ Standard_OStream& CDM_MetaData::operator << (Standard_OStream& anOStream) { return Print(anOStream); } -const CDM_MetaDataLookUpTable& CDM_MetaData::LookUpTable() { - return getLookUpTable(); -} + Standard_Integer CDM_MetaData::DocumentVersion(const Handle(CDM_Application)& anApplication) { if(myDocumentVersion==0) myDocumentVersion=anApplication->DocumentVersion(this); return myDocumentVersion; @@ -144,3 +162,24 @@ void CDM_MetaData::UnsetIsReadOnly() { myIsReadOnly=Standard_False; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void CDM_MetaData::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsRetrieved) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myDocument) + + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myFolder) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myName) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myVersion) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasVersion) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myFileName) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myPath) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDocumentVersion) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsReadOnly) +} diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_MetaData.hxx opencascade-7.5.1+dfsg1/src/CDM/CDM_MetaData.hxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_MetaData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_MetaData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,11 +45,21 @@ public: - - Standard_EXPORT static Handle(CDM_MetaData) LookUp (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath, const TCollection_ExtendedString& aFileName, const Standard_Boolean ReadOnly); - - Standard_EXPORT static Handle(CDM_MetaData) LookUp (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath, const TCollection_ExtendedString& aVersion, const TCollection_ExtendedString& aFileName, const Standard_Boolean ReadOnly); - + Standard_EXPORT static Handle(CDM_MetaData) LookUp (CDM_MetaDataLookUpTable& theLookUpTable, + const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const TCollection_ExtendedString& aPath, + const TCollection_ExtendedString& aFileName, + const Standard_Boolean ReadOnly); + + Standard_EXPORT static Handle(CDM_MetaData) LookUp (CDM_MetaDataLookUpTable& theLookUpTable, + const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const TCollection_ExtendedString& aPath, + const TCollection_ExtendedString& aVersion, + const TCollection_ExtendedString& aFileName, + const Standard_Boolean ReadOnly); + Standard_EXPORT Standard_Boolean IsRetrieved() const; Standard_EXPORT Handle(CDM_Document) Document() const; @@ -84,6 +94,9 @@ Standard_EXPORT void SetIsReadOnly(); Standard_EXPORT void UnsetIsReadOnly(); + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; friend class CDM_Reference; @@ -98,24 +111,27 @@ DEFINE_STANDARD_RTTIEXT(CDM_MetaData,Standard_Transient) -protected: +private: + CDM_MetaData (const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const TCollection_ExtendedString& aPath, + const TCollection_ExtendedString& aFileName, + const Standard_Boolean ReadOnly); + + CDM_MetaData (const TCollection_ExtendedString& aFolder, + const TCollection_ExtendedString& aName, + const TCollection_ExtendedString& aPath, + const TCollection_ExtendedString& aVersion, + const TCollection_ExtendedString& aFileName, + const Standard_Boolean ReadOnly); + void SetDocument (const Handle(CDM_Document)& aDocument); + Standard_Integer DocumentVersion (const Handle(CDM_Application)& anApplication); private: - - Standard_EXPORT CDM_MetaData(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath, const TCollection_ExtendedString& aFileName, const Standard_Boolean ReadOnly); - - Standard_EXPORT CDM_MetaData(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath, const TCollection_ExtendedString& aVersion, const TCollection_ExtendedString& aFileName, const Standard_Boolean ReadOnly); - - Standard_EXPORT void SetDocument (const Handle(CDM_Document)& aDocument); - - Standard_EXPORT static const CDM_MetaDataLookUpTable& LookUpTable(); - - Standard_EXPORT Standard_Integer DocumentVersion (const Handle(CDM_Application)& anApplication); - Standard_Boolean myIsRetrieved; CDM_DocumentPointer myDocument; TCollection_ExtendedString myFolder; diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_MetaDataLookUpTable.hxx opencascade-7.5.1+dfsg1/src/CDM/CDM_MetaDataLookUpTable.hxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_MetaDataLookUpTable.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_MetaDataLookUpTable.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,7 @@ #include #include - +class CDM_MetaData; typedef NCollection_DataMap CDM_MetaDataLookUpTable; typedef NCollection_DataMap::Iterator CDM_DataMapIteratorOfMetaDataLookUpTable; diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_PresentationDirectory.hxx opencascade-7.5.1+dfsg1/src/CDM/CDM_PresentationDirectory.hxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_PresentationDirectory.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_PresentationDirectory.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -// Created on: 1997-05-06 -// Created by: Jean-Louis Frenkel, Remi Lequette -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef CDM_PresentationDirectory_HeaderFile -#define CDM_PresentationDirectory_HeaderFile - -#include -#include -#include -#include - -typedef NCollection_DataMap CDM_PresentationDirectory; -typedef NCollection_DataMap::Iterator CDM_DataMapIteratorOfPresentationDirectory; - - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_Reference.cxx opencascade-7.5.1+dfsg1/src/CDM/CDM_Reference.cxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_Reference.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_Reference.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,7 @@ #include #include #include +#include #include IMPLEMENT_STANDARD_RTTIEXT(CDM_Reference,Standard_Transient) @@ -27,7 +28,8 @@ myToDocument(aToDocument), myFromDocument(aFromDocument.operator->()), myReferenceIdentifier(aReferenceIdentifier), -myDocumentVersion(aToDocumentVersion) +myDocumentVersion(aToDocumentVersion), +myUseStorageConfiguration(Standard_False) {} CDM_Reference::CDM_Reference(const Handle(CDM_Document)& aFromDocument, const Handle(CDM_MetaData)& aToDocument, const Standard_Integer aReferenceIdentifier, const Handle(CDM_Application)& anApplication, const Standard_Integer aToDocumentVersion, const Standard_Boolean UseStorageConfiguration): @@ -120,3 +122,23 @@ Standard_Boolean CDM_Reference::IsStored() const { return !myMetaData.IsNull(); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void CDM_Reference::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myToDocument.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myFromDocument) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myReferenceIdentifier) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myApplication.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myMetaData.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDocumentVersion) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUseStorageConfiguration) +} diff -Nru opencascade-7.4.1+dfsg1/src/CDM/CDM_Reference.hxx opencascade-7.5.1+dfsg1/src/CDM/CDM_Reference.hxx --- opencascade-7.4.1+dfsg1/src/CDM/CDM_Reference.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/CDM_Reference.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,6 +48,9 @@ Standard_EXPORT Standard_Integer DocumentVersion() const; Standard_EXPORT Standard_Boolean IsReadOnly() const; + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; friend class CDM_Document; diff -Nru opencascade-7.4.1+dfsg1/src/CDM/FILES opencascade-7.5.1+dfsg1/src/CDM/FILES --- opencascade-7.4.1+dfsg1/src/CDM/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CDM/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -2,7 +2,6 @@ CDM_Application.hxx CDM_CanCloseStatus.hxx CDM_DataMapIteratorOfMetaDataLookUpTable.hxx -CDM_DataMapIteratorOfPresentationDirectory.hxx CDM_Document.cxx CDM_Document.hxx CDM_DocumentHasher.hxx @@ -17,7 +16,6 @@ CDM_MetaData.hxx CDM_MetaDataLookUpTable.hxx CDM_NamesDirectory.hxx -CDM_PresentationDirectory.hxx CDM_Reference.cxx CDM_Reference.hxx CDM_ReferenceIterator.cxx diff -Nru opencascade-7.4.1+dfsg1/src/ChFi2d/ChFi2d_Builder.cxx opencascade-7.5.1+dfsg1/src/ChFi2d/ChFi2d_Builder.cxx --- opencascade-7.4.1+dfsg1/src/ChFi2d/ChFi2d_Builder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi2d/ChFi2d_Builder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,7 +70,7 @@ //purpose : //======================================================================= - ChFi2d_Builder::ChFi2d_Builder() +ChFi2d_Builder::ChFi2d_Builder() : status (ChFi2d_NotPlanar) { } diff -Nru opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_0.cxx opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_0.cxx --- opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_0.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_0.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -2311,7 +2311,7 @@ Standard_Integer IArcspine = DStr.AddShape(Arcspine); Standard_Integer IVtx = CorDat->IndexFirstPointOnS1(); - TopAbs_Orientation OVtx = TopAbs_FORWARD;; + TopAbs_Orientation OVtx = TopAbs_FORWARD; for(ex.Init(Arcspine.Oriented(TopAbs_FORWARD),TopAbs_VERTEX); ex.More(); ex.Next()) { @@ -4594,89 +4594,6 @@ } } -Standard_Boolean ChFi3d_isTangentFaces(const TopoDS_Edge &theEdge, - const TopoDS_Face &theFace1, - const TopoDS_Face &theFace2, - const GeomAbs_Shape Order) -{ - if (Order == GeomAbs_G1 && - BRep_Tool::Continuity( theEdge, theFace1, theFace2 ) != GeomAbs_C0) - return Standard_True; - - Standard_Real TolC0 = Max(0.001, 1.5*BRep_Tool::Tolerance(theEdge)); - - Standard_Real aFirst; - Standard_Real aLast; - -// Obtaining of pcurves of edge on two faces. - const Handle(Geom2d_Curve) aC2d1 = BRep_Tool::CurveOnSurface - (theEdge, theFace1, aFirst, aLast); - const Handle(Geom2d_Curve) aC2d2 = BRep_Tool::CurveOnSurface - (theEdge, theFace2, aFirst, aLast); - if (aC2d1.IsNull() || aC2d2.IsNull()) - return Standard_False; - -// Obtaining of two surfaces from adjacent faces. - Handle(Geom_Surface) aSurf1 = BRep_Tool::Surface(theFace1); - Handle(Geom_Surface) aSurf2 = BRep_Tool::Surface(theFace2); - - if (aSurf1.IsNull() || aSurf2.IsNull()) - return Standard_False; - -// Computation of the number of samples on the edge. - BRepAdaptor_Surface aBAS1(theFace1); - BRepAdaptor_Surface aBAS2(theFace2); - Handle(BRepAdaptor_HSurface) aBAHS1 = new BRepAdaptor_HSurface(aBAS1); - Handle(BRepAdaptor_HSurface) aBAHS2 = new BRepAdaptor_HSurface(aBAS2); - Handle(BRepTopAdaptor_TopolTool) aTool1 = new BRepTopAdaptor_TopolTool(aBAHS1); - Handle(BRepTopAdaptor_TopolTool) aTool2 = new BRepTopAdaptor_TopolTool(aBAHS2); - Standard_Integer aNbSamples1 = aTool1->NbSamples(); - Standard_Integer aNbSamples2 = aTool2->NbSamples(); - Standard_Integer aNbSamples = Max(aNbSamples1, aNbSamples2); - - -// Computation of the continuity. - Standard_Real aPar; - Standard_Real aDelta = (aLast - aFirst)/(aNbSamples - 1); - Standard_Integer i, nbNotDone = 0; - - for (i = 1, aPar = aFirst; i <= aNbSamples; i++, aPar += aDelta) { - if (i == aNbSamples) aPar = aLast; - - LocalAnalysis_SurfaceContinuity aCont(aC2d1, aC2d2, aPar, - aSurf1, aSurf2, Order, - 0.001, TolC0, 0.1, 0.1, 0.1); - if (!aCont.IsDone()) - { - nbNotDone++; - continue; - } - - if (Order == GeomAbs_G1) - { - if (!aCont.IsG1()) - return Standard_False; - } - else if (!aCont.IsG2()) - return Standard_False; - } - - if (nbNotDone == aNbSamples) - return Standard_False; - - //Compare normals of tangent faces in the middle point - Standard_Real MidPar = (aFirst + aLast)/2.; - gp_Pnt2d uv1 = aC2d1->Value(MidPar); - gp_Pnt2d uv2 = aC2d2->Value(MidPar); - gp_Dir normal1, normal2; - TopOpeBRepTool_TOOL::Nt( uv1, theFace1, normal1 ); - TopOpeBRepTool_TOOL::Nt( uv2, theFace2, normal2 ); - Standard_Real dot = normal1.Dot(normal2); - if (dot < 0.) - return Standard_False; - return Standard_True; -} - //======================================================================= //function : NbNotDegeneratedEdges //purpose : calculate the number of non-degenerated edges of Map VEMap(Vtx) @@ -4694,6 +4611,7 @@ return nba; } + //======================================================================= //function : NbSharpEdges //purpose : calculate the number of sharp edges of Map VEMap(Vtx) @@ -4712,7 +4630,7 @@ { TopoDS_Face F1, F2; ChFi3d_conexfaces(cur, F1, F2, EFMap); - if (!F2.IsNull() && ChFi3d_isTangentFaces(cur, F1, F2, GeomAbs_G2)) + if (!F2.IsNull() && ChFi3d::IsTangentFaces(cur, F1, F2, GeomAbs_G2)) nba--; } } diff -Nru opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_0.hxx opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_0.hxx --- opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_0.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_0.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -552,11 +552,6 @@ TopoDS_Edge & edgelibre1, TopoDS_Edge & edgelibre2); -Standard_Boolean ChFi3d_isTangentFaces(const TopoDS_Edge &theEdge, - const TopoDS_Face &theFace1, - const TopoDS_Face &theFace2, - const GeomAbs_Shape Order = GeomAbs_G1); - Standard_Integer ChFi3d_NbNotDegeneratedEdges (const TopoDS_Vertex& Vtx, const ChFiDS_Map& VEMap); Standard_Integer ChFi3d_NumberOfEdges(const TopoDS_Vertex& Vtx, diff -Nru opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_1.cxx opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_1.cxx --- opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -89,7 +89,8 @@ TopoDS_Face& theF2, const TopoDS_Face& theFirstFace, const TopoDS_Edge& thePrevEdge, - const TopoDS_Vertex& theCommonVertex) + const TopoDS_Vertex& theCommonVertex, + const ChFiDS_Map& theEFmap) { if (theF1.IsSame(theFirstFace)) return; @@ -99,25 +100,42 @@ return; } - TopTools_IndexedDataMapOfShapeListOfShape VEmapFirst, VEmap; - TopExp::MapShapesAndAncestors(theFirstFace, TopAbs_VERTEX, TopAbs_EDGE, VEmapFirst); - TopExp::MapShapesAndAncestors(theF1, TopAbs_VERTEX, TopAbs_EDGE, VEmap); - - const TopTools_ListOfShape& ElistFirst = VEmapFirst.FindFromKey(theCommonVertex); - const TopTools_ListOfShape& Elist = VEmap.FindFromKey(theCommonVertex); - TopTools_ListIteratorOfListOfShape itlfirst(ElistFirst); - for (; itlfirst.More(); itlfirst.Next()) - { - const TopoDS_Shape& anEdge = itlfirst.Value(); - if (anEdge.IsSame(thePrevEdge)) - continue; - TopTools_ListIteratorOfListOfShape itl(Elist); - for(; itl.More(); itl.Next()) - if (anEdge.IsSame(itl.Value())) - return; + //Loop until find or + Standard_Boolean ToExchange = Standard_False; + TopoDS_Edge PrevEdge = thePrevEdge, CurEdge; + TopoDS_Face PrevFace = theFirstFace, CurFace; + for (;;) + { + TopTools_IndexedDataMapOfShapeListOfShape VEmap; + TopExp::MapShapesAndAncestors(PrevFace, TopAbs_VERTEX, TopAbs_EDGE, VEmap); + const TopTools_ListOfShape& Elist = VEmap.FindFromKey(theCommonVertex); + if (PrevEdge.IsSame(Elist.First())) + CurEdge = TopoDS::Edge(Elist.Last()); + else + CurEdge = TopoDS::Edge(Elist.First()); + + const TopTools_ListOfShape& Flist = theEFmap.FindFromKey(CurEdge); + if (PrevFace.IsSame(Flist.First())) + CurFace = TopoDS::Face(Flist.Last()); + else + CurFace = TopoDS::Face(Flist.First()); + + if (CurFace.IsSame(theF1)) + break; + else if (CurFace.IsSame(theF2)) + { + ToExchange = Standard_True; + break; + } + + PrevEdge = CurEdge; + PrevFace = CurFace; } - TopoDS_Face TmpFace = theF1; theF1 = theF2; theF2 = TmpFace; + if (ToExchange) + { + TopoDS_Face TmpFace = theF1; theF1 = theF2; theF2 = TmpFace; + } } static void ConcatCurves(TColGeom_SequenceOfCurve& theCurves, @@ -573,7 +591,7 @@ if(Nbf < 2) return Standard_False; // Modified by Sergey KHROMOV - Fri Dec 21 17:44:19 2001 Begin //if (BRep_Tool::Continuity(E1,F[0],F[1]) != GeomAbs_C0) { - if (ChFi3d_isTangentFaces(E1,F[0],F[1])) { + if (ChFi3d::IsTangentFaces(E1,F[0],F[1])) { // Modified by Sergey KHROMOV - Fri Dec 21 17:44:21 2001 End return Standard_False; } @@ -592,7 +610,7 @@ if(Nbf < 2) return Standard_False; // Modified by Sergey KHROMOV - Tue Dec 18 18:10:40 2001 Begin // if (BRep_Tool::Continuity(Ec,F[0],F[1]) < GeomAbs_G1) { - if (!ChFi3d_isTangentFaces(Ec,F[0],F[1])) { + if (!ChFi3d::IsTangentFaces(Ec,F[0],F[1])) { // Modified by Sergey KHROMOV - Tue Dec 18 18:10:41 2001 End return Standard_False; } @@ -680,7 +698,7 @@ Standard_Integer NbG1Connections = 0; for(Standard_Integer ii = 1; ii <= 2; ii++){ - TopoDS_Edge E[3],Ec; + TopoDS_Edge E[3]; TopoDS_Vertex V; ChFiDS_State sst; Standard_Integer iedge; @@ -705,44 +723,61 @@ if(sst == ChFiDS_BreakPoint){ TopTools_ListIteratorOfListOfShape It;//,Jt; - Standard_Integer i = 0; Standard_Boolean sommetpourri = Standard_False; - TopTools_IndexedMapOfShape EdgesOfV; - //to avoid repeating of edges + TopTools_IndexedMapOfOrientedShape EdgesOfV; + TopTools_MapOfShape Edges; + Edges.Add(E[0]); + EdgesOfV.Add(E[0]); + Standard_Integer IndOfE = 0; for (It.Initialize(myVEMap(V)); It.More(); It.Next()) - EdgesOfV.Add(It.Value()); - for (Standard_Integer ind = 1; ind <= EdgesOfV.Extent(); ind++) { - Ec = TopoDS::Edge(EdgesOfV(ind)); - Standard_Boolean bonedge = !BRep_Tool::Degenerated(Ec); - if (bonedge) + { + TopoDS_Edge anEdge = TopoDS::Edge(It.Value()); + if (BRep_Tool::Degenerated(anEdge)) + continue; + TopoDS_Face F1, F2; + ChFi3d_conexfaces(anEdge, F1, F2, myEFMap); + if (!F2.IsNull() && ChFi3d::IsTangentFaces(anEdge, F1, F2, GeomAbs_G2)) //smooth edge { - TopoDS_Face F1, F2; - ChFi3d_conexfaces(Ec, F1, F2, myEFMap); - if (!F2.IsNull() && ChFi3d_isTangentFaces(Ec, F1, F2, GeomAbs_G2)) + if (!F1.IsSame(F2)) + NbG1Connections++; + continue; + } + + if (Edges.Add(anEdge)) + { + EdgesOfV.Add(anEdge); + if (IndOfE < 2) { - bonedge = Standard_False; - if (!F1.IsSame(F2)) - NbG1Connections++; + IndOfE++; + E[IndOfE] = anEdge; } } - if(bonedge){ - if (!Ec.IsSame(E[0])) + else + { + TopoDS_Vertex V1, V2; + TopExp::Vertices(anEdge, V1, V2); + if (V1.IsSame(V2)) //edge is closed - two ends of the edge in the vertex { - if( i < 2 ){ - i++; - E[i] = Ec; - } - else{ -#ifdef OCCT_DEBUG - std::cout<<"top has more than 3 edges"<SetTypeOfConcavity(TypeOfConcavity); + Standard_Boolean ToRestrict = (Offset > 0)? Standard_True : Standard_False; BRepAdaptor_Surface Sb1(ff1, ToRestrict); BRepAdaptor_Surface Sb2(ff2, ToRestrict); @@ -852,8 +893,11 @@ CEc.D1(Wl,P2,V1); Wl = BRep_Tool::Parameter(LVEc,Ec); CEc.D1(Wl,P2,V2); - if (V1.IsParallel(V2,ta)) { - if (FaceTangency(Ec,Ec,VStart)) { + Standard_Boolean IsFaceTangency = FaceTangency(Ec,Ec,VStart); + if (V1.IsParallel(V2,ta) || + IsFaceTangency) + { + if (IsFaceTangency) { CurSt = ChFiDS_Closed; } else { @@ -918,7 +962,7 @@ Spine->SetEdges(Ec); TopoDS_Face CurF1, CurF2; ChFi3d_conexfaces(Ec,CurF1,CurF2,myEFMap); - ReorderFaces(CurF1, CurF2, FirstFace, PrevEdge, CommonVertex); + ReorderFaces(CurF1, CurF2, FirstFace, PrevEdge, CommonVertex, myEFMap); myEdgeFirstFace.Bind(Ec, CurF1); if (Offset > 0) { @@ -1004,7 +1048,7 @@ Spine->PutInFirst(Ec); TopoDS_Face CurF1, CurF2; ChFi3d_conexfaces(Ec,CurF1,CurF2,myEFMap); - ReorderFaces(CurF1, CurF2, FirstFace, PrevEdge, CommonVertex); + ReorderFaces(CurF1, CurF2, FirstFace, PrevEdge, CommonVertex, myEFMap); myEdgeFirstFace.Bind(Ec, CurF1); if (Offset > 0) { diff -Nru opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_2.cxx opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_2.cxx --- opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_2.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_2.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -250,7 +250,7 @@ // Modified by Sergey KHROMOV - Fri Dec 21 17:12:48 2001 Begin // Standard_Boolean istg = // BRep_Tool::Continuity(ecur,ff,F) != GeomAbs_C0; - Standard_Boolean istg = ChFi3d_isTangentFaces(ecur,ff,F); + Standard_Boolean istg = ChFi3d::IsTangentFaces(ecur,ff,F); // Modified by Sergey KHROMOV - Fri Dec 21 17:12:51 2001 End if((!issame || (issame && isreallyclosed)) && istg) { found = 1; @@ -456,7 +456,7 @@ FVoi = TopoDS::Face(It.Value()); // Modified by Sergey KHROMOV - Fri Dec 21 17:09:32 2001 Begin // if (BRep_Tool::Continuity(E,FRef,FVoi) != GeomAbs_C0) { - if (ChFi3d_isTangentFaces(E,FRef,FVoi)) { + if (ChFi3d::IsTangentFaces(E,FRef,FVoi)) { // Modified by Sergey KHROMOV - Fri Dec 21 17:09:33 2001 End return Standard_True; } @@ -476,7 +476,7 @@ FVoi = FRef; // Modified by Sergey KHROMOV - Fri Dec 21 17:15:12 2001 Begin // if (BRep_Tool::Continuity(E,FRef,FRef) >= GeomAbs_G1) { - if (ChFi3d_isTangentFaces(E,FRef,FRef)) { + if (ChFi3d::IsTangentFaces(E,FRef,FRef)) { // Modified by Sergey KHROMOV - Fri Dec 21 17:15:16 2001 End return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_C1.cxx opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_C1.cxx --- opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_C1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_C1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -334,7 +334,7 @@ if ( Update(HBs,Hc3df,FIop,CPop,FprolUV,isFirst,c3dU) ) return Standard_True; - if (!ChFi3d_isTangentFaces(Eprol,Fprol,Fop)) + if (!ChFi3d::IsTangentFaces(Eprol,Fprol,Fop)) return Standard_False; Handle(Geom2d_Curve) gpcprol = BRep_Tool::CurveOnSurface(Eprol,Fprol,uf,ul); @@ -803,7 +803,7 @@ #endif TopoDS_Edge edgecouture; - Standard_Boolean couture,intcouture=Standard_False;; + Standard_Boolean couture,intcouture=Standard_False; Standard_Real tolreached = tolesp; Standard_Real par1 =0.,par2 =0.; Standard_Integer indpt = 0,Icurv1 = 0,Icurv2 = 0; @@ -1639,14 +1639,14 @@ ChFi3d_edge_common_faces(myEFMap(Eadj1),Fga,Fdr); // Modified by Sergey KHROMOV - Fri Dec 21 17:57:32 2001 Begin // reg1=BRep_Tool::Continuity(Eadj1,Fga,Fdr)!=GeomAbs_C0; - reg1 = ChFi3d_isTangentFaces(Eadj1,Fga,Fdr); + reg1 = ChFi3d::IsTangentFaces(Eadj1,Fga,Fdr); // Modified by Sergey KHROMOV - Fri Dec 21 17:57:33 2001 End if (F2.IsSame(facecouture)) Eadj2=edgecouture; else ChFi3d_cherche_element(Vtx,EdgeSpine,F2,Eadj2,Vbid1); ChFi3d_edge_common_faces(myEFMap(Eadj2),Fga,Fdr); // Modified by Sergey KHROMOV - Fri Dec 21 17:58:22 2001 Begin // reg2=BRep_Tool::Continuity(Eadj2,Fga,Fdr)!=GeomAbs_C0; - reg2 = ChFi3d_isTangentFaces(Eadj2,Fga,Fdr); + reg2 = ChFi3d::IsTangentFaces(Eadj2,Fga,Fdr); // Modified by Sergey KHROMOV - Fri Dec 21 17:58:24 2001 End // two faces common to the edge are found @@ -2067,9 +2067,9 @@ else if (nbarete==5) { //pro15368 // Modified by Sergey KHROMOV - Fri Dec 21 18:07:43 2001 End - Standard_Boolean isTangent0 = ChFi3d_isTangentFaces(Edge[0],F1,Face[0]); - Standard_Boolean isTangent1 = ChFi3d_isTangentFaces(Edge[1],Face[0],Face[1]); - Standard_Boolean isTangent2 = ChFi3d_isTangentFaces(Edge[2],Face[1],Face[2]); + Standard_Boolean isTangent0 = ChFi3d::IsTangentFaces(Edge[0],F1,Face[0]); + Standard_Boolean isTangent1 = ChFi3d::IsTangentFaces(Edge[1],Face[0],Face[1]); + Standard_Boolean isTangent2 = ChFi3d::IsTangentFaces(Edge[2],Face[1],Face[2]); if ((isTangent0 || isTangent2) && isTangent1) { // GeomAbs_Shape cont0,cont1,cont2; // cont0=BRep_Tool::Continuity(Edge[0],F1,Face[0]); @@ -3970,7 +3970,7 @@ inters = Update(HBs,Hc3df,FiopArc,CPopArc,p2dbout,isfirst,wop); // Modified by Sergey KHROMOV - Fri Dec 21 18:08:27 2001 Begin // if(!inters && BRep_Tool::Continuity(Arcprol,Fv,Fop) != GeomAbs_C0){ - if(!inters && ChFi3d_isTangentFaces(Arcprol,Fv,Fop)){ + if(!inters && ChFi3d::IsTangentFaces(Arcprol,Fv,Fop)){ // Modified by Sergey KHROMOV - Fri Dec 21 18:08:29 2001 End // Arcprol is an edge of tangency, ultimate adjustment by an extrema curve/curve is attempted. Standard_Real ff,ll; @@ -3990,7 +3990,7 @@ #endif TopoDS_Edge edgecouture; - Standard_Boolean couture,intcouture=Standard_False;; + Standard_Boolean couture,intcouture=Standard_False; Standard_Real tolreached = tolesp; Standard_Real par1 = 0.,par2 = 0.; Standard_Integer indpt =0,Icurv1 =0,Icurv2 =0; diff -Nru opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_CnCrn.cxx opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_CnCrn.cxx --- opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_Builder_CnCrn.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_Builder_CnCrn.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -144,6 +144,7 @@ #include #include #include +#include // performances #ifdef OCCT_DEBUG @@ -1261,7 +1262,7 @@ // Modified by Sergey KHROMOV - Fri Dec 21 18:11:02 2001 Begin // regul.SetValue(ic,BRep_Tool::Continuity(TopoDS::Edge(Evive.Value(ic)),F1,F2) // !=GeomAbs_C0); - regul.SetValue(ic, ChFi3d_isTangentFaces(TopoDS::Edge(Evive.Value(ic)),F1,F2)); + regul.SetValue(ic, ChFi3d::IsTangentFaces(TopoDS::Edge(Evive.Value(ic)),F1,F2)); // Modified by Sergey KHROMOV - Fri Dec 21 18:11:07 2001 End } } diff -Nru opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_ChBuilder.cxx opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_ChBuilder.cxx --- opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_ChBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_ChBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -344,8 +344,10 @@ Spine->SetMode(myMode); Standard_Real Offset = -1; if (myMode == ChFiDS_ConstThroatWithPenetrationChamfer) - Offset = Min(Dis1,Dis2);; - + { + Offset = Min(Dis1,Dis2); + } + Spine->SetEdges(E_wnt); if(PerformElement(Spine, Offset, F)){ Spine->Load(); diff -Nru opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d.cxx opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d.cxx --- opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,6 +29,200 @@ #include #include #include +#include +#include +#include +#include +#include +#include + + +static void Correct2dPoint(const TopoDS_Face& theF, gp_Pnt2d& theP2d); +// + +//======================================================================= +//function : DefineConnectType +//purpose : +//======================================================================= +ChFiDS_TypeOfConcavity ChFi3d::DefineConnectType(const TopoDS_Edge& E, + const TopoDS_Face& F1, + const TopoDS_Face& F2, + const Standard_Real SinTol, + const Standard_Boolean CorrectPoint) +{ + const Handle(Geom_Surface)& S1 = BRep_Tool::Surface(F1); + const Handle(Geom_Surface)& S2 = BRep_Tool::Surface(F2); + // + Standard_Real f,l; + Handle (Geom2d_Curve) C1 = BRep_Tool::CurveOnSurface(E,F1,f,l); + //For the case of seam edge + TopoDS_Edge EE = E; + if (F1.IsSame(F2)) + EE.Reverse(); + Handle (Geom2d_Curve) C2 = BRep_Tool::CurveOnSurface(EE,F2,f,l); + if (C1.IsNull() || C2.IsNull()) + return ChFiDS_Other; + + BRepAdaptor_Curve C(E); + f = C.FirstParameter(); + l = C.LastParameter(); +// + Standard_Real ParOnC = 0.5*(f+l); + gp_Vec T1 = C.DN(ParOnC,1); + if (T1.SquareMagnitude() <= gp::Resolution()) + { + ParOnC = IntTools_Tools::IntermediatePoint(f,l); + T1 = C.DN(ParOnC,1); + } + if (T1.SquareMagnitude() > gp::Resolution()) { + T1.Normalize(); + } + + if (BRepTools::OriEdgeInFace(E,F1) == TopAbs_REVERSED) { + T1.Reverse(); + } + if (F1.Orientation() == TopAbs_REVERSED) T1.Reverse(); + + gp_Pnt2d P = C1->Value(ParOnC); + gp_Pnt P3; + gp_Vec D1U,D1V; + + if(CorrectPoint) + Correct2dPoint(F1, P); + // + S1->D1(P.X(),P.Y(),P3,D1U,D1V); + gp_Vec DN1(D1U^D1V); + if (F1.Orientation() == TopAbs_REVERSED) DN1.Reverse(); + + P = C2->Value(ParOnC); + if(CorrectPoint) + Correct2dPoint(F2, P); + S2->D1(P.X(),P.Y(),P3,D1U,D1V); + gp_Vec DN2(D1U^D1V); + if (F2.Orientation() == TopAbs_REVERSED) DN2.Reverse(); + + DN1.Normalize(); + DN2.Normalize(); + + gp_Vec ProVec = DN1^DN2; + Standard_Real NormProVec = ProVec.Magnitude(); + if (NormProVec < SinTol) { + // plane + if (DN1.Dot(DN2) > 0) { + //Tangent + return ChFiDS_Tangential; + } + else { + //Mixed not finished! +#ifdef OCCT_DEBUG + std::cout <<" faces locally mixed"< gp::Resolution()) + ProVec /= NormProVec; + Standard_Real Prod = T1.Dot(ProVec); + if (Prod > 0.) { + // + return ChFiDS_Convex; + } + else { + //reenters + return ChFiDS_Concave; + } + } +} + +//======================================================================= +//function : IsTangentFaces +//purpose : +//======================================================================= +Standard_Boolean ChFi3d::IsTangentFaces(const TopoDS_Edge& theEdge, + const TopoDS_Face& theFace1, + const TopoDS_Face& theFace2, + const GeomAbs_Shape Order) +{ + if (Order == GeomAbs_G1 && BRep_Tool::Continuity(theEdge, theFace1, theFace2) != GeomAbs_C0) + return Standard_True; + + Standard_Real TolC0 = Max(0.001, 1.5*BRep_Tool::Tolerance(theEdge)); + + Standard_Real aFirst; + Standard_Real aLast; + + // Obtaining of pcurves of edge on two faces. + const Handle(Geom2d_Curve) aC2d1 = BRep_Tool::CurveOnSurface + (theEdge, theFace1, aFirst, aLast); + //For the case of seam edge + TopoDS_Edge EE = theEdge; + if (theFace1.IsSame(theFace2)) + EE.Reverse(); + const Handle(Geom2d_Curve) aC2d2 = BRep_Tool::CurveOnSurface + (EE, theFace2, aFirst, aLast); + if (aC2d1.IsNull() || aC2d2.IsNull()) + return Standard_False; + + // Obtaining of two surfaces from adjacent faces. + Handle(Geom_Surface) aSurf1 = BRep_Tool::Surface(theFace1); + Handle(Geom_Surface) aSurf2 = BRep_Tool::Surface(theFace2); + + if (aSurf1.IsNull() || aSurf2.IsNull()) + return Standard_False; + + // Computation of the number of samples on the edge. + BRepAdaptor_Surface aBAS1(theFace1); + BRepAdaptor_Surface aBAS2(theFace2); + Handle(BRepAdaptor_HSurface) aBAHS1 = new BRepAdaptor_HSurface(aBAS1); + Handle(BRepAdaptor_HSurface) aBAHS2 = new BRepAdaptor_HSurface(aBAS2); + Handle(BRepTopAdaptor_TopolTool) aTool1 = new BRepTopAdaptor_TopolTool(aBAHS1); + Handle(BRepTopAdaptor_TopolTool) aTool2 = new BRepTopAdaptor_TopolTool(aBAHS2); + Standard_Integer aNbSamples1 = aTool1->NbSamples(); + Standard_Integer aNbSamples2 = aTool2->NbSamples(); + Standard_Integer aNbSamples = Max(aNbSamples1, aNbSamples2); + + // Computation of the continuity. + Standard_Real aPar; + Standard_Real aDelta = (aLast - aFirst) / (aNbSamples - 1); + Standard_Integer i, nbNotDone = 0; + + for (i = 1, aPar = aFirst; i <= aNbSamples; i++, aPar += aDelta) { + if (i == aNbSamples) aPar = aLast; + + LocalAnalysis_SurfaceContinuity aCont(aC2d1, aC2d2, aPar, + aSurf1, aSurf2, Order, + 0.001, TolC0, 0.1, 0.1, 0.1); + if (!aCont.IsDone()) + { + nbNotDone++; + continue; + } + + if (Order == GeomAbs_G1) + { + if (!aCont.IsG1()) + return Standard_False; + } + else if (!aCont.IsG2()) + return Standard_False; + } + + if (nbNotDone == aNbSamples) + return Standard_False; + + //Compare normals of tangent faces in the middle point + Standard_Real MidPar = (aFirst + aLast) / 2.; + gp_Pnt2d uv1 = aC2d1->Value(MidPar); + gp_Pnt2d uv2 = aC2d2->Value(MidPar); + gp_Dir normal1, normal2; + TopOpeBRepTool_TOOL::Nt(uv1, theFace1, normal1); + TopOpeBRepTool_TOOL::Nt(uv2, theFace2, normal2); + Standard_Real dot = normal1.Dot(normal2); + if (dot < 0.) + return Standard_False; + return Standard_True; +} //======================================================================= //function : ConcaveSide @@ -290,3 +484,49 @@ } return (o1 == o2); } + +//======================================================================= +//function : Correct2dPoint +//purpose : +//======================================================================= +void Correct2dPoint(const TopoDS_Face& theF, gp_Pnt2d& theP2d) +{ + BRepAdaptor_Surface aBAS(theF, Standard_False); + if (aBAS.GetType() < GeomAbs_BezierSurface) { + return; + } + // + const Standard_Real coeff = 0.01; + Standard_Real eps; + Standard_Real u1, u2, v1, v2; + // + aBAS.Initialize(theF, Standard_True); + u1 = aBAS.FirstUParameter(); + u2 = aBAS.LastUParameter(); + v1 = aBAS.FirstVParameter(); + v2 = aBAS.LastVParameter(); + if (!(Precision::IsInfinite(u1) || Precision::IsInfinite(u2))) + { + eps = Max(coeff*(u2 - u1), Precision::PConfusion()); + if (Abs(theP2d.X() - u1) < eps) + { + theP2d.SetX(u1 + eps); + } + if (Abs(theP2d.X() - u2) < eps) + { + theP2d.SetX(u2 - eps); + } + } + if (!(Precision::IsInfinite(v1) || Precision::IsInfinite(v2))) + { + eps = Max(coeff*(v2 - v1), Precision::PConfusion()); + if (Abs(theP2d.Y() - v1) < eps) + { + theP2d.SetY(v1 + eps); + } + if (Abs(theP2d.Y() - v2) < eps) + { + theP2d.SetY(v2 - eps); + } + } +} diff -Nru opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_FilBuilder.cxx opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_FilBuilder.cxx --- opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d_FilBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d_FilBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1461,7 +1461,7 @@ const Standard_Boolean RecRst, const math_Vector& Soldep) { - Handle(ChFiDS_SurfData) Data = SeqData(1);; + Handle(ChFiDS_SurfData) Data = SeqData(1); Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine); if(fsp.IsNull()) throw Standard_ConstructionError("PerformSurf : this is not the spine of a fillet"); Handle(BRepBlend_Line) lin; @@ -1577,7 +1577,7 @@ const Standard_Boolean RecRst2, const math_Vector& Soldep) { - Handle(ChFiDS_SurfData) Data = SeqData(1);; + Handle(ChFiDS_SurfData) Data = SeqData(1); Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine); if(fsp.IsNull()) throw Standard_ConstructionError("PerformSurf : this is not the spine of a fillet"); Handle(BRepBlend_Line) lin; @@ -1942,13 +1942,21 @@ Handle(ChFiDS_Spine) Spine = Stripe->Spine(); if (Spine->IsTangencyExtremity((Sens == 1))) return; //No extension on queue Standard_Real dU = Spine->LastParameter(Spine->NbEdges()); - if (Sens == 1){ - Spine->SetFirstParameter(-dU*Coeff); - Spine->SetFirstTgt(0.); + if (Sens == 1){ + if (!(Spine->GetTypeOfConcavity() == ChFiDS_Convex && + Spine->FirstStatus() == ChFiDS_OnSame)) + { + Spine->SetFirstParameter(-dU*Coeff); + Spine->SetFirstTgt(0.); + } } else{ - Spine->SetLastParameter(dU*(1.+Coeff)); - Spine->SetLastTgt(dU); + if (!(Spine->GetTypeOfConcavity() == ChFiDS_Convex && + Spine->LastStatus() == ChFiDS_OnSame)) + { + Spine->SetLastParameter(dU*(1.+Coeff)); + Spine->SetLastTgt(dU); + } } check.Append(Stripe); } diff -Nru opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d.hxx opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d.hxx --- opencascade-7.4.1+dfsg1/src/ChFi3d/ChFi3d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFi3d/ChFi3d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,8 +24,11 @@ #include #include #include +#include +#include class BRepAdaptor_Surface; class TopoDS_Edge; +class TopoDS_Face; class ChFi3d_Builder; class ChFi3d_ChBuilder; class ChFi3d_FilBuilder; @@ -39,7 +42,19 @@ DEFINE_STANDARD_ALLOC - + //! Defines the type of concavity in the edge of connection of two faces + Standard_EXPORT static ChFiDS_TypeOfConcavity DefineConnectType (const TopoDS_Edge& E, + const TopoDS_Face& F1, + const TopoDS_Face& F2, + const Standard_Real SinTol, + const Standard_Boolean CorrectPoint); + + //! Returns true if theEdge between theFace1 and theFace2 is tangent + Standard_EXPORT static Standard_Boolean IsTangentFaces (const TopoDS_Edge& theEdge, + const TopoDS_Face& theFace1, + const TopoDS_Face& theFace2, + const GeomAbs_Shape Order = GeomAbs_G1); + //! Returns Reversed in Or1 and(or) Or2 if //! the concave edge defined by the interior of faces F1 and F2, //! in the neighbourhood of their boundary E is of the edge opposite to the diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_ChamfSpine.cxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_ChamfSpine.cxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_ChamfSpine.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_ChamfSpine.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,12 +26,20 @@ //purpose : //======================================================================= ChFiDS_ChamfSpine::ChFiDS_ChamfSpine() +: d1 (0.0), + d2 (0.0), + angle (0.0), + mChamf (ChFiDS_Sym) { myMode = ChFiDS_ClassicChamfer; } -ChFiDS_ChamfSpine::ChFiDS_ChamfSpine(const Standard_Real Tol): -ChFiDS_Spine(Tol) +ChFiDS_ChamfSpine::ChFiDS_ChamfSpine(const Standard_Real Tol) +: ChFiDS_Spine (Tol), + d1 (0.0), + d2 (0.0), + angle (0.0), + mChamf (ChFiDS_Sym) { myMode = ChFiDS_ClassicChamfer; } diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_CircSection.cxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_CircSection.cxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_CircSection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_CircSection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,7 +23,11 @@ //function : ChFiDS_CircSection //purpose : //======================================================================= -ChFiDS_CircSection::ChFiDS_CircSection(){} +ChFiDS_CircSection::ChFiDS_CircSection() +: myF (0.0), + myL (0.0) +{ +} //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_ElSpine.cxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_ElSpine.cxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_ElSpine.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_ElSpine.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,10 +39,14 @@ //function : ChFiDS_ElSpine //purpose : //======================================================================= -ChFiDS_ElSpine::ChFiDS_ElSpine():periodic(0) +ChFiDS_ElSpine::ChFiDS_ElSpine() +: pfirst (0.0), + plast (0.0), + period (0.0), + periodic (Standard_False), + pfirstsav (Precision::Infinite()), + plastsav (Precision::Infinite()) { - pfirstsav = Precision::Infinite(); - plastsav = Precision::Infinite(); } diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_FaceInterference.cxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_FaceInterference.cxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_FaceInterference.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_FaceInterference.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,10 @@ //purpose : //======================================================================= ChFiDS_FaceInterference::ChFiDS_FaceInterference() +: firstParam (0.0), + lastParam (0.0), + lineindex (0), + LineTransition (TopAbs_FORWARD) { } diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_Regul.cxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_Regul.cxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_Regul.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_Regul.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,9 @@ //purpose : //======================================================================= ChFiDS_Regul::ChFiDS_Regul() +: icurv (0), + is1 (0), + is2 (0) { } diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_Spine.cxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_Spine.cxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_Spine.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_Spine.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,16 +41,26 @@ //purpose : //======================================================================= ChFiDS_Spine::ChFiDS_Spine() -: splitdone(Standard_False), - myMode(ChFiDS_ClassicChamfer), - tolesp(Precision::Confusion()), - firstprolon(Standard_False), - lastprolon(Standard_False), - firstistgt(Standard_False), - lastistgt(Standard_False), - hasfirsttgt(Standard_False), - haslasttgt(Standard_False), - hasref(Standard_False) +: splitdone (Standard_False), + myMode (ChFiDS_ClassicChamfer), + indexofcurve (0), + myTypeOfConcavity (ChFiDS_Other), + firstState (ChFiDS_OnSame), + lastState (ChFiDS_OnSame), + tolesp (Precision::Confusion()), + firstparam (0.0), + lastparam (0.0), + firstprolon (Standard_False), + lastprolon (Standard_False), + firstistgt (Standard_False), + lastistgt (Standard_False), + firsttgtpar (0.0), + lasttgtpar (0.0), + hasfirsttgt (Standard_False), + haslasttgt (Standard_False), + valref (0.0), + hasref (Standard_False), + errorstate (ChFiDS_Ok) { } @@ -59,16 +69,26 @@ //purpose : //======================================================================= ChFiDS_Spine::ChFiDS_Spine(const Standard_Real Tol) - : splitdone(Standard_False), - myMode(ChFiDS_ClassicChamfer), - tolesp(Tol), - firstprolon(Standard_False), - lastprolon(Standard_False), - firstistgt(Standard_False), - lastistgt(Standard_False), - hasfirsttgt(Standard_False), - haslasttgt(Standard_False), - hasref(Standard_False) +: splitdone (Standard_False), + myMode (ChFiDS_ClassicChamfer), + indexofcurve (0), + myTypeOfConcavity (ChFiDS_Other), + firstState (ChFiDS_OnSame), + lastState (ChFiDS_OnSame), + tolesp (Tol), + firstparam (0.0), + lastparam (0.0), + firstprolon (Standard_False), + lastprolon (Standard_False), + firstistgt (Standard_False), + lastistgt (Standard_False), + firsttgtpar (0.0), + lasttgtpar (0.0), + hasfirsttgt (Standard_False), + haslasttgt (Standard_False), + valref (0.0), + hasref (Standard_False), + errorstate (ChFiDS_Ok) { } diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_Spine.hxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_Spine.hxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_Spine.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_Spine.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,6 +34,7 @@ #include #include #include +#include class TopoDS_Edge; class ChFiDS_HElSpine; class gp_Lin; @@ -201,8 +202,14 @@ ChFiDS_State Status (const Standard_Boolean IsFirst) const; + //! returns the type of concavity in the connection + ChFiDS_TypeOfConcavity GetTypeOfConcavity() const; + void SetStatus (const ChFiDS_State S, const Standard_Boolean IsFirst); + //! sets the type of concavity in the connection + void SetTypeOfConcavity (const ChFiDS_TypeOfConcavity theType); + //! returns if the set of edges starts (or end) on //! Tangency point. Standard_Boolean IsTangencyExtremity (const Standard_Boolean IsFirst) const; @@ -264,6 +271,7 @@ BRepAdaptor_Curve myCurve; BRepAdaptor_Curve myOffsetCurve; Standard_Integer indexofcurve; + ChFiDS_TypeOfConcavity myTypeOfConcavity; ChFiDS_State firstState; ChFiDS_State lastState; TopTools_SequenceOfShape spine; diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_Spine.lxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_Spine.lxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_Spine.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_Spine.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,16 @@ #include //======================================================================= +//function : SetTypeOfConcavity +//purpose : +//======================================================================= + +inline void ChFiDS_Spine::SetTypeOfConcavity(const ChFiDS_TypeOfConcavity theType) +{ + myTypeOfConcavity = theType; +} + +//======================================================================= //function : SetFirstStatus //purpose : //======================================================================= @@ -36,6 +46,17 @@ { lastState = S; } + +//======================================================================= +//function : GetTypeOfConcavity +//purpose : +//======================================================================= + +inline ChFiDS_TypeOfConcavity ChFiDS_Spine::GetTypeOfConcavity()const +{ + return myTypeOfConcavity; +} + //======================================================================= //function : FirstStatus //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_Stripe.cxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_Stripe.cxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_Stripe.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_Stripe.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,12 +22,27 @@ IMPLEMENT_STANDARD_RTTIEXT(ChFiDS_Stripe,Standard_Transient) -ChFiDS_Stripe::ChFiDS_Stripe (): - begfilled(/*Standard_False*/0), // eap, Apr 29 2002, occ293 - endfilled(/*Standard_False*/0), - orcurv1(TopAbs_FORWARD), - orcurv2(TopAbs_FORWARD) -{} +ChFiDS_Stripe::ChFiDS_Stripe () +: pardeb1 (0.0), + parfin1 (0.0), + pardeb2 (0.0), + parfin2 (0.0), + myChoix (0), + indexOfSolid (0), + indexOfcurve1 (0), + indexOfcurve2 (0), + indexfirstPOnS1 (0), + indexlastPOnS1 (0), + indexfirstPOnS2 (0), + indexlastPOnS2 (0), + begfilled(/*Standard_False*/0), // eap, Apr 29 2002, occ293 + endfilled(/*Standard_False*/0), + myOr1 (TopAbs_FORWARD), + myOr2 (TopAbs_FORWARD), + orcurv1 (TopAbs_FORWARD), + orcurv2 (TopAbs_FORWARD) +{ +} void ChFiDS_Stripe::Reset() { diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_SurfData.cxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_SurfData.cxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_SurfData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_SurfData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,10 +24,23 @@ IMPLEMENT_STANDARD_RTTIEXT(ChFiDS_SurfData,Standard_Transient) -ChFiDS_SurfData::ChFiDS_SurfData () : -indexOfS1(0),indexOfS2(0),indexOfConge(0), -isoncurv1(0),isoncurv2(0),twistons1(0),twistons2(0) -{} +ChFiDS_SurfData::ChFiDS_SurfData() +: ufspine (0.0), + ulspine (0.0), + myfirstextend (0.0), + mylastextend (0.0), + indexOfS1 (0), + indexOfC1 (0), + indexOfS2 (0), + indexOfC2 (0), + indexOfConge (0), + isoncurv1 (Standard_False), + isoncurv2 (Standard_False), + twistons1 (Standard_False), + twistons2 (Standard_False), + orientation (TopAbs_FORWARD) +{ +} //======================================================================= //function : Copy diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_TypeOfConcavity.hxx opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_TypeOfConcavity.hxx --- opencascade-7.4.1+dfsg1/src/ChFiDS/ChFiDS_TypeOfConcavity.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/ChFiDS_TypeOfConcavity.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,30 @@ +// Created on: 1995-10-12 +// Created by: Bruno DUMORTIER +// Copyright (c) 1995-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _ChFiDS_TypeOfConcavity_HeaderFile +#define _ChFiDS_TypeOfConcavity_HeaderFile + + +enum ChFiDS_TypeOfConcavity +{ +ChFiDS_Concave, +ChFiDS_Convex, +ChFiDS_Tangential, +ChFiDS_FreeBound, +ChFiDS_Other +}; + +#endif // _ChFiDS_TypeOfConcavity_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/ChFiDS/FILES opencascade-7.5.1+dfsg1/src/ChFiDS/FILES --- opencascade-7.4.1+dfsg1/src/ChFiDS/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiDS/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -46,3 +46,4 @@ ChFiDS_SurfData.cxx ChFiDS_SurfData.hxx ChFiDS_SurfData.lxx +ChFiDS_TypeOfConcavity.hxx \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnCyl.cxx opencascade-7.5.1+dfsg1/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnCyl.cxx --- opencascade-7.4.1+dfsg1/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnCyl.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ChFiKPart/ChFiKPart_ComputeData_FilPlnCyl.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -123,20 +123,25 @@ UOnCyl = ElCLib::InPeriod(UOnCyl,fu,fu+2*M_PI); ElSLib::Parameters(Pln,OrFillet,UOnPln,VOnPln); - gp_Vec XDir,OtherDir; - XDir = NorF.Reversed(); - OtherDir = gp_Dir(gp_Vec(OrFillet,ElSLib::Value(UOnCyl,VOnCyl,Cyl))); - - if (!plandab) { - gp_Vec tmp = XDir; - XDir = OtherDir; - OtherDir = tmp; + gp_Vec XDir, OtherDir; + if (plandab) + { + XDir = NorF.Reversed(); + OtherDir = gp_Vec(OrFillet, ElSLib::Value(UOnCyl, VOnCyl, Cyl)); + OtherDir.Normalize(); + } + else + { + OtherDir = NorF.Reversed(); + XDir = gp_Vec(OrFillet, ElSLib::Value(UOnCyl, VOnCyl, Cyl)); + XDir.Normalize(); } - gp_Ax3 AxFil (OrFillet,DirFillet,XDir); - // construction YDir to go from face1 to face2. - if ((XDir^OtherDir).Dot(DirFillet) < 0.) + + gp_Ax3 AxFil (OrFillet, DirFillet, XDir); + gp_Vec aProd = XDir.Crossed(OtherDir); + if (aProd.Dot(DirFillet) < 0.) AxFil.YReverse(); - + Handle(Geom_CylindricalSurface) Fillet = new Geom_CylindricalSurface(AxFil,Radius); Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(Fillet,DStr)); @@ -149,8 +154,10 @@ gp_Lin2d Lin2dPln(PPln2d,VPln2d); gp_Pnt POnPln = ElSLib::Value(UOnPln,VOnPln,Pln); gp_Lin C3d(POnPln,DirFillet); + Standard_Real UOnFillet,V; ElSLib::CylinderParameters(AxFil,Radius,POnPln,UOnFillet,V); + if(UOnFillet > M_PI) UOnFillet = 0.; gp_Lin2d LOnFillet(gp_Pnt2d(UOnFillet,V),gp::DY2d()); Handle(Geom_Line) L3d = new Geom_Line (C3d); diff -Nru opencascade-7.4.1+dfsg1/src/Cocoa/Cocoa_Window.hxx opencascade-7.5.1+dfsg1/src/Cocoa/Cocoa_Window.hxx --- opencascade-7.4.1+dfsg1/src/Cocoa/Cocoa_Window.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Cocoa/Cocoa_Window.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -91,7 +91,7 @@ Standard_EXPORT virtual void Unmap() const Standard_OVERRIDE; //! Applies the resizing to the window - Standard_EXPORT virtual Aspect_TypeOfResize DoResize() const Standard_OVERRIDE; + Standard_EXPORT virtual Aspect_TypeOfResize DoResize() Standard_OVERRIDE; //! Apply the mapping change to the window Standard_EXPORT virtual Standard_Boolean DoMapping() const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/Cocoa/Cocoa_Window.mm opencascade-7.5.1+dfsg1/src/Cocoa/Cocoa_Window.mm --- opencascade-7.4.1+dfsg1/src/Cocoa/Cocoa_Window.mm 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Cocoa/Cocoa_Window.mm 2021-02-02 08:51:56.000000000 +0000 @@ -138,6 +138,8 @@ { throw Aspect_WindowDefinitionError("Unable to create window"); } + // for the moment, OpenGL renderer is expected to output sRGB colorspace + [myHWindow setColorSpace: [NSColorSpace sRGBColorSpace]]; myHView = [[myHWindow contentView] retain]; NSString* aTitleNs = [[NSString alloc] initWithUTF8String: theTitle]; @@ -291,7 +293,7 @@ // function : DoResize // purpose : // ======================================================================= -Aspect_TypeOfResize Cocoa_Window::DoResize() const +Aspect_TypeOfResize Cocoa_Window::DoResize() { if (myHView == NULL) { @@ -324,10 +326,10 @@ default: break; } - *((Standard_Integer* )&myXLeft ) = (Standard_Integer )aBounds.origin.x; - *((Standard_Integer* )&myXRight ) = (Standard_Integer )(aBounds.origin.x + aBounds.size.width); - *((Standard_Integer* )&myYTop ) = (Standard_Integer )aBounds.origin.y; - *((Standard_Integer* )&myYBottom ) = (Standard_Integer )(aBounds.origin.y + aBounds.size.height); + myXLeft = (Standard_Integer )aBounds.origin.x; + myXRight = (Standard_Integer )(aBounds.origin.x + aBounds.size.width); + myYTop = (Standard_Integer )aBounds.origin.y; + myYBottom = (Standard_Integer )(aBounds.origin.y + aBounds.size.height); return aMode; } diff -Nru opencascade-7.4.1+dfsg1/src/Contap/Contap_ArcFunction.cxx opencascade-7.5.1+dfsg1/src/Contap/Contap_ArcFunction.cxx --- opencascade-7.4.1+dfsg1/src/Contap/Contap_ArcFunction.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Contap/Contap_ArcFunction.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,8 +28,10 @@ Contap_ArcFunction::Contap_ArcFunction (): myMean(1.), myType(Contap_ContourStd), -myDir(0.,0.,1.) -{} +myDir(0.,0.,1.), +myCosAng(0.0) +{ +} void Contap_ArcFunction::Set(const Handle(Adaptor3d_HSurface)& S) diff -Nru opencascade-7.4.1+dfsg1/src/Contap/Contap_ContAna.cxx opencascade-7.5.1+dfsg1/src/Contap/Contap_ContAna.cxx --- opencascade-7.4.1+dfsg1/src/Contap/Contap_ContAna.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Contap/Contap_ContAna.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,13 @@ static const Standard_Real Tolpetit = 1.e-8; -Contap_ContAna::Contap_ContAna (): done(Standard_False) {} +Contap_ContAna::Contap_ContAna () +: done(Standard_False), + nbSol(0), + typL(GeomAbs_OtherCurve), + prm(0.0) +{ +} void Contap_ContAna::Perform (const gp_Sphere& S, const gp_Dir& D) diff -Nru opencascade-7.4.1+dfsg1/src/Contap/Contap_Point.cxx opencascade-7.5.1+dfsg1/src/Contap/Contap_Point.cxx --- opencascade-7.4.1+dfsg1/src/Contap/Contap_Point.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Contap/Contap_Point.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,13 +23,18 @@ #include Contap_Point::Contap_Point (): - onarc(Standard_False),isvtx(Standard_False),ismult(Standard_False), - myInternal(Standard_False) -{} +uparam(0.0), vparam(0.0), paraline(0.0), +onarc(Standard_False), prmarc(0.0), isvtx(Standard_False), +ismult(Standard_False), myInternal(Standard_False) +{ +} Contap_Point::Contap_Point (const gp_Pnt& Pt, const Standard_Real U, const Standard_Real V): -pt(Pt),uparam(U),vparam(V),onarc(Standard_False),isvtx(Standard_False), -ismult(Standard_False),myInternal(Standard_False) -{} +pt(Pt),uparam(U),vparam(V), +paraline(0.0), onarc(Standard_False), +prmarc(0.0), isvtx(Standard_False), +ismult(Standard_False), myInternal(Standard_False) +{ +} \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/Contap/Contap_SurfFunction.cxx opencascade-7.5.1+dfsg1/src/Contap/Contap_SurfFunction.cxx --- opencascade-7.4.1+dfsg1/src/Contap/Contap_SurfFunction.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Contap/Contap_SurfFunction.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,11 +32,19 @@ myMean(1.), myType(Contap_ContourStd), myDir(0.,0.,1.), + myAng(0.0), myCosAng(0.), // PI/2 - Angle de depouille tol(1.e-6), + valf(0.0), + Usol(0.0), + Vsol(0.0), + Fpu(0.0), + Fpv(0.0), + tangent(Standard_False), computed(Standard_False), derived(Standard_False) -{} +{ +} void Contap_SurfFunction::Set(const Handle(Adaptor3d_HSurface)& S) { diff -Nru opencascade-7.4.1+dfsg1/src/CPnts/CPnts_AbscissaPoint.cxx opencascade-7.5.1+dfsg1/src/CPnts/CPnts_AbscissaPoint.cxx --- opencascade-7.4.1+dfsg1/src/CPnts/CPnts_AbscissaPoint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CPnts/CPnts_AbscissaPoint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -234,7 +234,12 @@ //purpose : //======================================================================= -CPnts_AbscissaPoint::CPnts_AbscissaPoint() : myDone(Standard_False) +CPnts_AbscissaPoint::CPnts_AbscissaPoint() +: myDone(Standard_False), + myL(0.0), + myParam(0.0), + myUMin(0.0), + myUMax(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/CPnts/CPnts_UniformDeflection.cxx opencascade-7.5.1+dfsg1/src/CPnts/CPnts_UniformDeflection.cxx --- opencascade-7.4.1+dfsg1/src/CPnts/CPnts_UniformDeflection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CPnts/CPnts_UniformDeflection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -231,9 +231,21 @@ //purpose : //======================================================================= -CPnts_UniformDeflection::CPnts_UniformDeflection () -{ - myDone = Standard_False; +CPnts_UniformDeflection::CPnts_UniformDeflection () +: myDone(Standard_False), + my3d(Standard_False), + myFinish(Standard_False), + myTolCur(0.0), + myControl(Standard_False), + myIPoint(0), + myNbPoints(0), + myDwmax(0.0), + myDeflection(0.0), + myFirstParam(0.0), + myLastParam(0.0), + myDu(0.0) +{ + memset (myParams, 0, sizeof (myParams)); } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/CSLib/CSLib.cxx opencascade-7.5.1+dfsg1/src/CSLib/CSLib.cxx --- opencascade-7.4.1+dfsg1/src/CSLib/CSLib.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/CSLib/CSLib.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,24 +27,6 @@ #include #include -#define D1uD1vRatioIsNull CSLib_D1uD1vRatioIsNull -#define D1vD1uRatioIsNull CSLib_D1vD1uRatioIsNull -#define D1uIsParallelD1v CSLib_D1uIsParallelD1v -#define D1IsNull CSLib_D1IsNull -#define D1uIsNull CSLib_D1uIsNull -#define D1vIsNull CSLib_D1vIsNull -#define Done CSLib_Done - -#define D1NuIsNull CSLib_D1NuIsNull -#define D1NvIsNull CSLib_D1NvIsNull -#define D1NuIsParallelD1Nv CSLib_D1NuIsParallelD1Nv -#define D1NIsNull CSLib_D1NIsNull -#define D1NuNvRatioIsNull CSLib_D1NuNvRatioIsNull -#define D1NvNuRatioIsNull CSLib_D1NvNuRatioIsNull -#define InfinityOfSolutions CSLib_InfinityOfSolutions -#define Defined CSLib_Defined -#define Singular CSLib_Singular - void CSLib::Normal ( const gp_Vec& D1U, @@ -61,18 +43,18 @@ gp_Vec D1UvD1V = D1U.Crossed(D1V); if (D1UMag <= gp::Resolution() && D1VMag <= gp::Resolution()) { - theStatus = D1IsNull; + theStatus = CSLib_D1IsNull; } - else if (D1UMag <= gp::Resolution()) theStatus = D1uIsNull; - else if (D1VMag <= gp::Resolution()) theStatus = D1vIsNull; -// else if ((D1VMag / D1UMag) <= RealEpsilon()) theStatus = D1vD1uRatioIsNull; -// else if ((D1UMag / D1VMag) <= RealEpsilon()) theStatus = D1uD1vRatioIsNull; + else if (D1UMag <= gp::Resolution()) theStatus = CSLib_D1uIsNull; + else if (D1VMag <= gp::Resolution()) theStatus = CSLib_D1vIsNull; +// else if ((D1VMag / D1UMag) <= RealEpsilon()) theStatus = CSLib_D1vD1uRatioIsNull; +// else if ((D1UMag / D1VMag) <= RealEpsilon()) theStatus = CSLib_D1uD1vRatioIsNull; else { Standard_Real Sin2 = D1UvD1V.SquareMagnitude() / (D1UMag * D1VMag); - if (Sin2 < (SinTol * SinTol)) { theStatus = D1uIsParallelD1v; } - else { Normal = gp_Dir (D1UvD1V); theStatus = Done; } + if (Sin2 < (SinTol * SinTol)) { theStatus = CSLib_D1uIsParallelD1v; } + else { Normal = gp_Dir (D1UvD1V); theStatus = CSLib_Done; } } } @@ -107,25 +89,25 @@ if (LD1Nu <= RealEpsilon() && LD1Nv <= RealEpsilon()) { - theStatus = D1NIsNull; + theStatus = CSLib_D1NIsNull; Done = Standard_False; } else if (LD1Nu < RealEpsilon()) { - theStatus = D1NuIsNull; + theStatus = CSLib_D1NuIsNull; Done = Standard_True; Normal = gp_Dir (D1Nv); } else if (LD1Nv < RealEpsilon()) { - theStatus = D1NvIsNull; + theStatus = CSLib_D1NvIsNull; Done = Standard_True; Normal = gp_Dir (D1Nu); } else if ((LD1Nv / LD1Nu) <= RealEpsilon()) { - theStatus = D1NvNuRatioIsNull; + theStatus = CSLib_D1NvNuRatioIsNull; Done = Standard_False; } else if ((LD1Nu / LD1Nv) <= RealEpsilon()) { - theStatus = D1NuNvRatioIsNull; + theStatus = CSLib_D1NuNvRatioIsNull; Done = Standard_False; } else { @@ -133,12 +115,12 @@ Standard_Real Sin2 = D1NCross.SquareMagnitude() / (LD1Nu * LD1Nv); if (Sin2 < (SinTol * SinTol)) { - theStatus = D1NuIsParallelD1Nv; + theStatus = CSLib_D1NuIsParallelD1Nv; Done = Standard_True; Normal = gp_Dir (D1Nu); } else { - theStatus = InfinityOfSolutions; + theStatus = CSLib_InfinityOfSolutions; Done = Standard_False; } } @@ -161,7 +143,7 @@ if (NMag <= MagTol || D1UMag <= MagTol || D1VMag <= MagTol ) { - theStatus = Singular; + theStatus = CSLib_Singular; // if (D1UMag <= MagTol || D1VMag <= MagTol && NMag > MagTol) MagTol = 2* NMag; } else @@ -170,7 +152,7 @@ gp_Dir aD1U(D1U); gp_Dir aD1V(D1V); Normal = gp_Dir(aD1U.Crossed(aD1V)); - theStatus = Defined; + theStatus = CSLib_Defined; } @@ -219,7 +201,7 @@ { if(Order == 0) { - theStatus = Defined; + theStatus = CSLib_Defined; Normal=D.Normalized(); } else @@ -373,16 +355,16 @@ //Polynom is always negative SP=-1; if(SP==0) - theStatus = InfinityOfSolutions; + theStatus = CSLib_InfinityOfSolutions; else { - theStatus = Defined; + theStatus = CSLib_Defined; Normal=SP*Vk0.Normalized(); } } else { - theStatus = Defined; + theStatus = CSLib_Defined; Normal=D.Normalized(); } } @@ -439,120 +421,126 @@ const Standard_Integer Iduref, const Standard_Integer Idvref) { -Standard_Integer Kderiv; -Kderiv=Nu+Nv; -TColgp_Array2OfVec DerVecNor(0,Kderiv,0,Kderiv); -TColStd_Array2OfReal TabScal(0,Kderiv,0,Kderiv); -TColStd_Array2OfReal TabNorm(0,Kderiv,0,Kderiv); -Standard_Integer Ideriv,Jderiv,Mderiv,Pderiv,Qderiv; -Standard_Real Scal,Dnorm; -gp_Vec DerNor; -DerNor=(DerNUV.Value(Iduref,Idvref)).Normalized(); -DerVecNor.SetValue(0,0,DerNor); -Dnorm=DerNUV.Value(Iduref,Idvref)*DerVecNor.Value(0,0); -TabNorm.SetValue(0,0,Dnorm); -TabScal.SetValue(0,0,0.); -for ( Mderiv = 1;Mderiv <= Kderiv; Mderiv++) - for ( Pderiv = 0 ; Pderiv <= Mderiv ; Pderiv++) + const Standard_Integer Kderiv = Nu + Nv; + TColgp_Array2OfVec DerVecNor(0,Kderiv,0,Kderiv); + TColStd_Array2OfReal TabScal(0,Kderiv,0,Kderiv); + TColStd_Array2OfReal TabNorm(0,Kderiv,0,Kderiv); + gp_Vec DerNor = (DerNUV.Value (Iduref, Idvref)).Normalized(); + DerVecNor.SetValue(0,0,DerNor); + Standard_Real Dnorm = DerNUV.Value (Iduref, Idvref) * DerVecNor.Value (0, 0); + TabNorm.SetValue(0,0,Dnorm); + TabScal.SetValue(0,0,0.); + + for (Standard_Integer Mderiv = 1; Mderiv <= Kderiv; Mderiv++) + { + for (Standard_Integer Pderiv = 0; Pderiv <= Mderiv; Pderiv++) + { + const Standard_Integer Qderiv = Mderiv - Pderiv; + if (Pderiv > Nu || Qderiv > Nv) + { + continue; + } + + // Compute n . derivee(p,q) of n + Standard_Real Scal = 0.; + if (Pderiv > Qderiv) + { + for (Standard_Integer Jderiv = 1; Jderiv <= Qderiv; Jderiv++) { - Qderiv = Mderiv - Pderiv; - if (Pderiv <= Nu && Qderiv <= Nv) - { -// -// Compute n . derivee(p,q) of n - Scal = 0.; - if ( Pderiv > Qderiv ) - { - for (Jderiv=1 ; Jderiv <=Qderiv;Jderiv++) - Scal=Scal - -PLib::Bin(Qderiv,Jderiv)* - (DerVecNor.Value(0,Jderiv)*DerVecNor.Value(Pderiv,Qderiv-Jderiv)); - - for (Jderiv=0 ; Jderiv < Qderiv ; Jderiv++) - Scal=Scal - -PLib::Bin(Qderiv,Jderiv)* - (DerVecNor.Value(Pderiv,Jderiv)*DerVecNor.Value(0,Qderiv-Jderiv)); - - for (Ideriv=1 ; Ideriv < Pderiv;Ideriv++) - for (Jderiv =0 ; Jderiv <=Qderiv ; Jderiv++) - Scal= Scal - - PLib::Bin(Pderiv,Ideriv) - *PLib::Bin(Qderiv,Jderiv) - *(DerVecNor.Value(Ideriv,Jderiv) - *DerVecNor.Value(Pderiv-Ideriv,Qderiv-Jderiv)); - } - else - { - for (Ideriv = 1 ; Ideriv <= Pderiv ; Ideriv++) - Scal = Scal - PLib::Bin(Pderiv,Ideriv)* - DerVecNor.Value(Ideriv,0)*DerVecNor.Value(Pderiv-Ideriv,Qderiv); - for (Ideriv = 0 ; Ideriv < Pderiv ; Ideriv++) - Scal = Scal - PLib::Bin(Pderiv,Ideriv)* - DerVecNor.Value(Ideriv,Qderiv)*DerVecNor.Value(Pderiv-Ideriv,0); - - for (Ideriv=0 ; Ideriv <= Pderiv;Ideriv++) - for (Jderiv =1 ; Jderiv arbFBO->glGenFramebuffers (1, &myGlFBufferId); - GLenum aPixelFormat = 0, aDataType = 0; - if (myDepthFormat != 0 - && getDepthDataFormat (myDepthFormat, aPixelFormat, aDataType) - && !myDepthStencilTexture->Init (theCtx, myDepthFormat, - aPixelFormat, aDataType, - aSizeX, aSizeY, Graphic3d_TOT_2D)) + const OpenGl_TextureFormat aDepthFormat = OpenGl_TextureFormat::FindSizedFormat (theCtx, myDepthFormat); + if (aDepthFormat.IsValid() + && !myDepthStencilTexture->Init (theCtx, aDepthFormat, Graphic3d_Vec2i (aSizeX, aSizeY), Graphic3d_TOT_2D)) { - Release (theCtx.operator->()); + Release (theCtx.get()); theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, TCollection_AsciiString("D3DHost_FrameBuffer, could not initialize GL_DEPTH24_STENCIL8 texture ") + aSizeX + "x" + aSizeY); return Standard_False; @@ -280,6 +278,7 @@ } OpenGl_FrameBuffer::BindBuffer (theCtx); + theCtx->SetFrameBufferSRGB (true, myIsSRGBReady); if (myD3dFallback) { return; @@ -288,17 +287,16 @@ theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, myColorTextures (0)->GetTarget(), myColorTextures (0)->TextureId(), 0); - GLenum aDepthPixelFormat = 0, aDepthDataType = 0; - getDepthDataFormat (myDepthFormat, aDepthPixelFormat, aDepthDataType); + const OpenGl_TextureFormat aDepthFormat = OpenGl_TextureFormat::FindSizedFormat (theCtx, myDepthFormat); if (myDepthStencilTexture->IsValid()) { #ifdef GL_DEPTH_STENCIL_ATTACHMENT - theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, aDepthPixelFormat == GL_DEPTH_STENCIL ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT, + theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, aDepthFormat.PixelFormat() == GL_DEPTH_STENCIL ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT, myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); #else theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); - if (aDepthPixelFormat == GL_DEPTH_STENCIL) + if (aDepthFormat.PixelFormat() == GL_DEPTH_STENCIL) { theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); @@ -310,12 +308,12 @@ if (myDepthStencilTexture->IsValid()) { #ifdef GL_DEPTH_STENCIL_ATTACHMENT - theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, aDepthPixelFormat == GL_DEPTH_STENCIL ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT, + theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, aDepthFormat.PixelFormat() == GL_DEPTH_STENCIL ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT, myDepthStencilTexture->GetTarget(), 0, 0); #else theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, myDepthStencilTexture->GetTarget(), 0, 0); - if (aDepthPixelFormat == GL_DEPTH_STENCIL) + if (aDepthFormat.PixelFormat() == GL_DEPTH_STENCIL) { theCtx->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, myDepthStencilTexture->GetTarget(), 0, 0); diff -Nru opencascade-7.4.1+dfsg1/src/D3DHost/D3DHost_FrameBuffer.hxx opencascade-7.5.1+dfsg1/src/D3DHost/D3DHost_FrameBuffer.hxx --- opencascade-7.4.1+dfsg1/src/D3DHost/D3DHost_FrameBuffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/D3DHost/D3DHost_FrameBuffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -103,6 +103,13 @@ //! Returns TRUE if FBO has been initialized without WGL/D3D interop. Standard_Boolean D3dFallback() const { return myD3dFallback; } + //! Returns TRUE if color buffer is sRGB ready; FALSE by default. + //! Requires D3DSAMP_SRGBTEXTURE sampler parameter being set on D3D level for rendering D3D surface. + Standard_Boolean IsSRGBReady() const { return myIsSRGBReady; } + + //! Set if color buffer is sRGB ready. + void SetSRGBReady (Standard_Boolean theIsReady) { myIsSRGBReady = theIsReady; } + protected: using OpenGl_FrameBuffer::Init; @@ -115,6 +122,7 @@ void* myGlD3dSurf; //!< WGL/D3D surface handle Standard_Integer myLockCount; //!< locking counter Standard_Boolean myD3dFallback; //!< indicates that FBO has been initialized without WGL/D3D interop + Standard_Boolean myIsSRGBReady; //!< indicates that color buffer is sRGB ready public: diff -Nru opencascade-7.4.1+dfsg1/src/D3DHost/D3DHost_View.cxx opencascade-7.5.1+dfsg1/src/D3DHost/D3DHost_View.cxx --- opencascade-7.4.1+dfsg1/src/D3DHost/D3DHost_View.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/D3DHost/D3DHost_View.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,8 +20,20 @@ #include #include +#include + IMPLEMENT_STANDARD_RTTIEXT(D3DHost_View,OpenGl_View) +namespace +{ + enum D3DHost_VendorId + { + D3DHost_VendorId_AMD = 0x1002, + D3DHost_VendorId_NVIDIA = 0x10DE, + D3DHost_VendorId_Intel = 0x8086, + }; +} + // ======================================================================= // function : d3dFormatError // purpose : @@ -129,6 +141,51 @@ } // ======================================================================= +// function : DiagnosticInformation +// purpose : +// ======================================================================= +void D3DHost_View::DiagnosticInformation (TColStd_IndexedDataMapOfStringString& theDict, + Graphic3d_DiagnosticInfo theFlags) const +{ + base_type::DiagnosticInformation (theDict, theFlags); + if (myD3dDevice == NULL) + { + return; + } + + D3DCAPS9 aDevCaps; + memset (&aDevCaps, 0, sizeof(aDevCaps)); + if (myD3dDevice->GetDeviceCaps (&aDevCaps) < 0) + { + return; + } + + const UINT anAdapter = aDevCaps.AdapterOrdinal; + D3DADAPTER_IDENTIFIER9 aDevId; + memset (&aDevId, 0, sizeof(aDevId)); + if (myD3dLib->GetAdapterIdentifier (anAdapter, 0, &aDevId) < 0) + { + return; + } + + TCollection_AsciiString aVendorId ((int )aDevId.VendorId); + switch (aDevId.VendorId) + { + case D3DHost_VendorId_AMD: aVendorId = "AMD"; break; + case D3DHost_VendorId_NVIDIA: aVendorId = "NVIDIA"; break; + case D3DHost_VendorId_Intel: aVendorId = "Intel"; break; + } + theDict.Add ("D3Dvendor", aVendorId); + theDict.Add ("D3Ddescription", aDevId.Description); + theDict.Add ("D3DdeviceName", aDevId.DeviceName); + theDict.Add ("D3Ddriver", aDevId.Driver); + theDict.Add ("D3DdeviceId", TCollection_AsciiString((int )aDevId.DeviceId)); + theDict.Add ("D3Dinterop", myD3dWglFbo.IsNull() || myD3dWglFbo->D3dFallback() + ? "Software Fallback" + : "WGL_NV_DX_interop"); +} + +// ======================================================================= // function : d3dInitLib // purpose : // ======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/D3DHost/D3DHost_View.hxx opencascade-7.5.1+dfsg1/src/D3DHost/D3DHost_View.hxx --- opencascade-7.4.1+dfsg1/src/D3DHost/D3DHost_View.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/D3DHost/D3DHost_View.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,6 +58,11 @@ //! Redraw only immediate layer. Standard_EXPORT virtual void RedrawImmediate() Standard_OVERRIDE; + //! Fill in the dictionary with diagnostic info. + //! Should be called within rendering thread. + Standard_EXPORT virtual void DiagnosticInformation (TColStd_IndexedDataMapOfStringString& theDict, + Graphic3d_DiagnosticInfo theFlags) const Standard_OVERRIDE; + public: //! @return true if IDirect3DDevice9Ex device has been created diff -Nru opencascade-7.4.1+dfsg1/src/DBRep/DBRep.cxx opencascade-7.5.1+dfsg1/src/DBRep/DBRep.cxx --- opencascade-7.4.1+dfsg1/src/DBRep/DBRep.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DBRep/DBRep.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -1332,26 +1333,39 @@ static Standard_Integer XProgress (Draw_Interpretor& di, Standard_Integer argc, const char **argv) { - for ( Standard_Integer i=1; i < argc; i++ ) { + for ( Standard_Integer i=1; i < argc; i++ ) + { Standard_Boolean turn = Standard_True; if ( argv[i][0] == '-' ) turn = Standard_False; else if ( argv[i][0] != '+' ) continue; - if ( argv[i][1] == 't' ) Draw_ProgressIndicator::DefaultTextMode() = turn; + + TCollection_AsciiString anArgCase (argv[i]); + anArgCase.LowerCase(); + if ( argv[i][1] == 't' ) Draw_ProgressIndicator::DefaultTclMode() = turn; + else if (argv[i][1] == 'c') Draw_ProgressIndicator::DefaultConsoleMode() = turn; else if ( argv[i][1] == 'g' ) Draw_ProgressIndicator::DefaultGraphMode() = turn; - else if ( ! strcmp ( argv[i], "-stop" ) && i+1 < argc ) { + else if ( ! strcmp ( argv[i], "-stop" ) && i+1 < argc ) + { Standard_Address aPtr = 0; if (sscanf (argv[++i], "%p", &aPtr) == 1) Draw_ProgressIndicator::StopIndicator() = aPtr; return 0; } } - di << "Progress Indicator defaults: text mode is "; - if ( Draw_ProgressIndicator::DefaultTextMode() ) { + di << "Progress Indicator defaults: tcl mode is "; + if ( Draw_ProgressIndicator::DefaultTclMode() ) { di<<"ON"; } else { di<<"OFF"; } - di<<", graphical mode is "; + di<<", console mode is "; + if (Draw_ProgressIndicator::DefaultConsoleMode()) { + di << "ON"; + } + else { + di << "OFF"; + } + di << ", graphical mode is "; if ( Draw_ProgressIndicator::DefaultGraphMode() ) { di<<"ON"; } else { @@ -1407,6 +1421,39 @@ } //======================================================================= +// removeinternals +//======================================================================= +static Standard_Integer removeInternals (Draw_Interpretor& di, + Standard_Integer n, + const char** a) +{ + if (n < 2) + { + di.PrintHelp (a[0]); + return 1; + } + + TopoDS_Shape aShape = DBRep::Get (a[1]); + if (aShape.IsNull()) + { + di << a[1] << "is a null shape\n"; + return 1; + } + + Standard_Boolean isForce = Standard_False; + if (n > 2) + { + isForce = (Draw::Atoi (a[2]) != 0); + } + + BRepTools::RemoveInternals (aShape, isForce); + + DBRep::Set (a[1], aShape); + + return 0; +} + +//======================================================================= //function : BasicCommands //purpose : //======================================================================= @@ -1463,7 +1510,13 @@ __FILE__,purgemmgt,g); // Add command for DRAW-specific ProgressIndicator - theCommands.Add ( "XProgress","XProgress [+|-t] [+|-g]: switch on/off textual and graphical mode of Progress Indicator",XProgress,"DE: General"); + theCommands.Add ( "XProgress", + "XProgress [+|-t] [+|-c] [+|-g]" + "\n\t\t The options are:" + "\n\t\t +|-t : switch on/off output to tcl of Progress Indicator" + "\n\t\t +|-c : switch on/off output to cout of Progress Indicator" + "\n\t\t +|-g : switch on/off graphical mode of Progress Indicator", + XProgress,"DE: General"); theCommands.Add("binsave", "binsave shape filename\n" "\t\tsave the shape in the binary format file", @@ -1471,6 +1524,12 @@ theCommands.Add("binrestore", "binrestore filename shape\n" "\t\trestore the shape from the binary format file", __FILE__, binrestore, g); + + theCommands.Add ("removeinternals", "removeinternals shape [force flag {0/1}]" + "\n\t\t Removes sub-shapes with internal orientation from the shape.\n" + "\n\t\t Force flag disables the check on topological connectivity and" + "removes all internal sub-shapes\n", + __FILE__, removeInternals, g); } //======================================================================= @@ -1529,11 +1588,10 @@ N = Handle(DBRep_DrawableShape)::DownCast(d); BRep_Builder B; BRepTools_ShapeSet S(B); - if(!Draw::GetProgressBar().IsNull()) - S.SetProgress(Draw::GetProgressBar()); - S.Add(N->Shape()); - S.Write(OS); - if(!Draw::GetProgressBar().IsNull() && Draw::GetProgressBar()->UserBreak()) + S.Add (N->Shape()); + Handle(Draw_ProgressIndicator) aProgress = Draw::GetProgressBar(); + S.Write(OS, Message_ProgressIndicator::Start(aProgress)); + if (! aProgress.IsNull() && aProgress->UserBreak()) return; S.Write(N->Shape(),OS); } @@ -1542,11 +1600,10 @@ { BRep_Builder B; BRepTools_ShapeSet S(B); - if(!Draw::GetProgressBar().IsNull()) - S.SetProgress(Draw::GetProgressBar()); - S.Read(IS); + Handle(Draw_ProgressIndicator) aProgress = Draw::GetProgressBar(); + S.Read(IS, Message_ProgressIndicator::Start(aProgress)); Handle(DBRep_DrawableShape) N; - if(!Draw::GetProgressBar().IsNull() && Draw::GetProgressBar()->UserBreak()) + if (! aProgress.IsNull() && aProgress->UserBreak()) return N; TopoDS_Shape theShape; S.Read(theShape,IS ); diff -Nru opencascade-7.4.1+dfsg1/src/DBRep/DBRep_Debug.cxx opencascade-7.5.1+dfsg1/src/DBRep/DBRep_Debug.cxx --- opencascade-7.4.1+dfsg1/src/DBRep/DBRep_Debug.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DBRep/DBRep_Debug.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,11 @@ #include #include #include +#include +#include +#include +#include +#include #include #include @@ -42,8 +47,31 @@ } //======================================================================= +//function : fromContainer +//purpose : static function to copy shapes from container into compound +//======================================================================= +template +static Standard_Boolean fromContainer (void* theContainer, + TopoDS_Compound& theShape) +{ + try + { + T *pContainer = (T*) theContainer; + for (typename T::Iterator it (*pContainer); it.More(); it.Next()) + { + BRep_Builder().Add (theShape, it.Value()); + } + return true; + } + catch (Standard_Failure const&) + { + return false; + } +} + +//======================================================================= //function : DBRep_SetComp -//purpose : make compound from the given list of shapes +//purpose : make compound from the given container of shapes //======================================================================= Standard_EXPORT const char* DBRep_SetComp(const char* theNameStr, void* theListPtr) { @@ -51,26 +79,23 @@ { return "Error: name or list of shapes is null"; } - try { - TopTools_ListOfShape *pLS; - pLS = (TopTools_ListOfShape *)theListPtr; - TopoDS_Compound aC; - BRep_Builder aBB; - TopTools_ListIteratorOfListOfShape aIt; - - aBB.MakeCompound(aC); - aIt.Initialize(*pLS); - for (; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aE = aIt.Value(); - aBB.Add(aC, aE); - } - DBRep::Set(theNameStr, aC); + TopoDS_Compound aC; + BRep_Builder().MakeCompound(aC); + + if (fromContainer (theListPtr, aC) + || fromContainer (theListPtr, aC) + || fromContainer (theListPtr, aC) + || fromContainer (theListPtr, aC) + || fromContainer (theListPtr, aC) + || fromContainer > (theListPtr, aC)) + { + DBRep::Set (theNameStr, aC); return theNameStr; } - catch (Standard_Failure const& anException) + else { - return anException.GetMessageString(); + return "Error: Invalid type"; } } diff -Nru opencascade-7.4.1+dfsg1/src/DBRep/DBRep_HideData.cxx opencascade-7.5.1+dfsg1/src/DBRep/DBRep_HideData.cxx --- opencascade-7.4.1+dfsg1/src/DBRep/DBRep_HideData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DBRep/DBRep_HideData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,11 @@ //======================================================================= DBRep_HideData::DBRep_HideData() -{} +: myView(-1), + myFocal(0.0), + myAngle(0.0) +{ +} //======================================================================= //function : Set @@ -57,7 +61,6 @@ myAngle = ang; Handle(HLRBRep_PolyAlgo) hider = new HLRBRep_PolyAlgo(S); - hider->Angle(ang); hider->Projector(HLRAlgo_Projector(myTrsf,myFocal > 0.,myFocal)); hider->Update(); diff -Nru opencascade-7.4.1+dfsg1/src/DBRep/DBRep_HideData.hxx opencascade-7.5.1+dfsg1/src/DBRep/DBRep_HideData.hxx --- opencascade-7.4.1+dfsg1/src/DBRep/DBRep_HideData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DBRep/DBRep_HideData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,11 +59,11 @@ //! Focal <= 0 means parallel projection //! Alg : the hidden lines Standard_EXPORT void Set (const Standard_Integer ViewId, const gp_Trsf& TProj, const Standard_Real Focal, const TopoDS_Shape& S, const Standard_Real ang); - - Standard_Integer ViewId() const; - - Standard_Real Angle() const; - + + Standard_Integer ViewId() const { return myView; } + + Standard_Real Angle() const { return myAngle; } + //! Returns True if the projection is the same Standard_EXPORT Standard_Boolean IsSame (const gp_Trsf& TProj, const Standard_Real Focla) const; @@ -72,19 +72,8 @@ //! Returns the subshape touched by the last pick. Standard_EXPORT const TopoDS_Shape& LastPick() const; - - - -protected: - - - - - private: - - Standard_Integer myView; gp_Trsf myTrsf; Standard_Real myFocal; @@ -93,14 +82,6 @@ TopoDS_Shape myPickShap; Standard_Real myAngle; - }; - -#include - - - - - #endif // _DBRep_HideData_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/DBRep/DBRep_HideData.lxx opencascade-7.5.1+dfsg1/src/DBRep/DBRep_HideData.lxx --- opencascade-7.4.1+dfsg1/src/DBRep/DBRep_HideData.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DBRep/DBRep_HideData.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -// Created on: 1995-09-22 -// Created by: Remi LEQUETTE -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : ViewId -//purpose : -//======================================================================= - -inline Standard_Integer DBRep_HideData::ViewId() const -{ - return myView; -} - -//======================================================================= -//function : Angle -//purpose : -//======================================================================= - -inline Standard_Real DBRep_HideData::Angle() const -{ - return myAngle; -} - diff -Nru opencascade-7.4.1+dfsg1/src/DBRep/FILES opencascade-7.5.1+dfsg1/src/DBRep/FILES --- opencascade-7.4.1+dfsg1/src/DBRep/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DBRep/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -11,7 +11,6 @@ DBRep_Face.lxx DBRep_HideData.cxx DBRep_HideData.hxx -DBRep_HideData.lxx DBRep_IsoBuilder.cxx DBRep_IsoBuilder.hxx DBRep_ListIteratorOfListOfEdge.hxx diff -Nru opencascade-7.4.1+dfsg1/src/DDataStd/DDataStd_BasicCommands.cxx opencascade-7.5.1+dfsg1/src/DDataStd/DDataStd_BasicCommands.cxx --- opencascade-7.4.1+dfsg1/src/DDataStd/DDataStd_BasicCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDataStd/DDataStd_BasicCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -100,6 +101,10 @@ #include #include #include + +#include +#include + #define MAXLENGTH 10 //#define DEB_DDataStd @@ -337,8 +342,7 @@ if (!DDF::GetDF(arg[1],DF)) return 1; Handle(TDataStd_Comment) A; if (!DDF::Find(DF,arg[2],TDataStd_Comment::GetID(),A)) return 1; - TCollection_AsciiString s(A->Get(),'?'); - di << A->Get().ToExtString(); + di << A->Get(); return 0; } di << "DDataStd_GetComment : Error\n"; @@ -610,7 +614,6 @@ } for(Standard_Integer i = A->Lower(); i<=A->Upper(); i++){ - //std::cout << A->Value(i) << std::endl; di << A->Value(i); if(iUpper()) di<<" "; @@ -1039,7 +1042,7 @@ Standard_CString expr (arg[3]); Handle(TDataStd_Relation) aR = TDataStd_Relation::Set(label); - aR->SetRelation(expr); + aR->SetRelation(TCollection_ExtendedString (expr, Standard_True)); Handle(TDataStd_Variable) aV; for (Standard_Integer i = 4; i < nb; i++) @@ -1219,7 +1222,8 @@ if ((!isGuid && nb > 6) || (isGuid && nb > 8)) { j = j + 2; for(Standard_Integer i = From; i<=To; ++i) { - A->SetValue(i, arg[j] ); + TCollection_ExtendedString aVal (arg[j], Standard_True); + A->SetValue(i, aVal); j++; } } @@ -1253,7 +1257,8 @@ Handle(TDataStd_ExtStringArray) arr; if (label.FindAttribute(TDataStd_ExtStringArray::GetID(), arr)) { - arr->SetValue(index, arg[4]); + TCollection_ExtendedString aVal(arg[4], Standard_True); + arr->SetValue(index, aVal); return 0; } @@ -1294,8 +1299,7 @@ } for(Standard_Integer i = A->Lower(); i<=A->Upper(); i++){ - TCollection_AsciiString anAsciiString(A->Value(i),'?'); - di << anAsciiString.ToCString(); + di << A->Value(i); if(iUpper()) di<<" "; } @@ -1421,7 +1425,7 @@ #endif if (!anIS) { // Can not open file - std::cout << "Error: can't open file " << aFileName <SetValue(i, ival != 0); @@ -1852,7 +1856,7 @@ Standard_Integer ival = Draw::Atoi(arg[i]); if(ival > 1) { - std::cout << "Bad value = " << ival<< ". 0 or 1 is expected." << std::endl; + Message::SendFail() << "Bad value = " << ival<< ". 0 or 1 is expected."; return 1; } A->Append (ival != 0); @@ -2475,7 +2479,6 @@ } for(Standard_Integer i = A->Lower(); i<=A->Upper(); i++){ - //std::cout << A->Value(i) << std::endl; di << A->Value(i); if(iUpper()) di<<" "; @@ -3202,6 +3205,7 @@ j = 1111; TCollection_ExtendedString aKey("Key_"); + anAtt->LoadDeferredData(); for(Standard_Integer i = 1; i<=aNumP; i++) { TCollection_ExtendedString key = aKey + i; Standard_Integer aVal = j+i; @@ -3237,7 +3241,7 @@ if(!aLabel.FindAttribute(TDataStd_NamedData::GetID(), anAtt)) anAtt = TDataStd_NamedData::Set(aLabel); if(anAtt.IsNull()) { - std::cout<< "NamedData attribute is not found or not set" << std::endl; + Message::SendFail() << "NamedData attribute is not found or not set"; return 1;} j = 15; @@ -3247,6 +3251,7 @@ anArr->SetValue(i, aVal); j++; } + anAtt->LoadDeferredData(); anAtt->SetArrayOfIntegers(aKey, anArr); return 0; } @@ -3316,7 +3321,7 @@ } Handle(TDataStd_AsciiString) anAtt; if( !aLabel.FindAttribute(aGuid, anAtt) ) { - std::cout << "AsciiString attribute is not found or not set" << std::endl; + Message::SendFail() << "AsciiString attribute is not found or not set"; return 1; } @@ -3363,6 +3368,7 @@ return 1;} j = 4; + anAtt->LoadDeferredData(); for(Standard_Integer i = 1; i<=aNumP; i++) { TCollection_ExtendedString aKey(arg[j]); Standard_Integer aVal = Draw::Atoi(arg[j+1]); @@ -3392,18 +3398,21 @@ Handle(TDataStd_NamedData) anAtt; - if(!aLabel.FindAttribute(TDataStd_NamedData::GetID(), anAtt)) { - std::cout << "NamedData attribute is not found or not set" << std::endl; - return 1;} + if(!aLabel.FindAttribute(TDataStd_NamedData::GetID(), anAtt)) + { + Message::SendFail() << "NamedData attribute is not found or not set"; + return 1; + } + std::cout <LoadDeferredData(); for(Standard_Integer i = 1; i<=aNumP; i++) { TCollection_ExtendedString aKey(arg[j]); Standard_Real aVal = Draw::Atof(arg[j+1]); @@ -3502,17 +3518,19 @@ std::cout <LoadDeferredData(); const TDataStd_DataMapOfStringReal& aMap = anAtt->GetRealsContainer(); TDataStd_DataMapIteratorOfDataMapOfStringReal itr(aMap); for (; itr.More(); itr.Next()){ TCollection_ExtendedString aKey(itr.Key()); - TCollection_AsciiString aStr(aKey,'?'); Standard_Real aValue = itr.Value(); - std::cout << "Key = " << aStr.ToCString() << " Value = " <LoadDeferredData(); for(Standard_Integer i = 1; i<=aNumP; i++) { TCollection_ExtendedString aKey(arg[j]); Standard_Byte aVal = (Standard_Byte)Draw::Atoi(arg[j+1]); @@ -3719,19 +3772,23 @@ Handle(TDataStd_NamedData) anAtt; - if(!aLabel.FindAttribute(TDataStd_NamedData::GetID(), anAtt)) { - std::cout << "NamedData attribute is not found or not set" << std::endl; - return 1;} + if (!aLabel.FindAttribute(TDataStd_NamedData::GetID(), anAtt)) + { + Message::SendFail() << "NamedData attribute is not found or not set"; + return 1; + } + std::cout <SetValue(i, aVal); j++; } + anAtt->LoadDeferredData(); anAtt->SetArrayOfIntegers(aKey, anArr); return 0; } @@ -3831,17 +3898,20 @@ Handle(TDataStd_NamedData) anAtt; - if(!aLabel.FindAttribute(TDataStd_NamedData::GetID(), anAtt)) { - std::cout << "NamedData attribute is not found or not set" << std::endl; - return 1;} + if(!aLabel.FindAttribute(TDataStd_NamedData::GetID(), anAtt)) + { + Message::SendFail() << "NamedData attribute is not found or not set"; + return 1; + } + std::cout <SetValue(i, aVal); j++; } + anAtt->LoadDeferredData(); anAtt->SetArrayOfReals(aKey, anArr); return 0; } @@ -3961,17 +4041,20 @@ Handle(TDataStd_NamedData) anAtt; - if(!aLabel.FindAttribute(TDataStd_NamedData::GetID(), anAtt)) { - std::cout << "NamedData attribute is not found or not set" << std::endl; - return 1;} + if (!aLabel.FindAttribute(TDataStd_NamedData::GetID(), anAtt)) + { + Message::SendFail() << "NamedData attribute is not found or not set"; + return 1; + } + std::cout <Label().FindAttribute(TDataStd_Name::GetID(),name)) { - TCollection_AsciiString tmpStr(name->Get(),'?'); - tmpStr.ChangeAll(' ','_'); - aList.AssignCat(tmpStr); + aList.AssignCat(name->Get()); } aList.AssignCat("\""); // Dynamic type. -2 aList.AssignCat(TDF_BrowserSeparator2); TCollection_ExtendedString ext; if (TDF::ProgIDFromGUID(aTreeNode->ID(), ext)) - aList.AssignCat(TCollection_AsciiString(ext,'?')); + aList.AssignCat(ext); else aList.AssignCat(aTreeNode->DynamicType()->Name()); // Executable or Forgotten? -3 // aList.AssignCat(TDF_BrowserSeparator2); diff -Nru opencascade-7.4.1+dfsg1/src/DDataStd/DDataStd_TreeCommands.cxx opencascade-7.5.1+dfsg1/src/DDataStd/DDataStd_TreeCommands.cxx --- opencascade-7.4.1+dfsg1/src/DDataStd/DDataStd_TreeCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDataStd/DDataStd_TreeCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -350,7 +351,7 @@ Handle(DDataStd_TreeBrowser) browser = Handle(DDataStd_TreeBrowser)::DownCast (Draw::GetExisting (a[1])); if (browser.IsNull()) { - std::cout << "Syntax error: browser '" << a[1] << "' not found\n"; + Message::SendFail() << "Syntax error: browser '" << a[1] << "' not found"; return 1; } @@ -461,11 +462,9 @@ const char** /*a*/) { if (cni.More()) { - //std::cout<<"TRUE"<Label(), entry); - //std::cout< #include #include - -#include - +#include //======================================================================= //function : Children @@ -117,6 +115,37 @@ return 0; } +//======================================================================= +//function : SetEmptyAttribute +//purpose : Adds an empty attribute to the label by its dynamic type. +//======================================================================= + +static Standard_Integer DDF_SetEmptyAttribute (Draw_Interpretor& di, + Standard_Integer n, + const char** a) +{ + if (n != 4) return 1; + + Handle(TDF_Data) DF; + + if (!DDF::GetDF (a[1], DF)) return 1; + + TDF_Label lab; + TDF_Tool::Label(DF,a[2],lab); + + if (lab.IsNull()) return 1; + + Handle(TDF_Attribute) anAttrByType = TDF_DerivedAttribute::Attribute(a[3]); + if (anAttrByType.IsNull()) { + di<<"DDF: Not registered attribute type '"<ID()); + return 0; + } di<<"DDF: The format of GUID is invalid\n"; return 1; } @@ -167,66 +202,6 @@ return 0; } -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// save/restore & Store/Retrieve commands -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - - -//========================================================== -// ErrorMessage -//========================================================== - -void ErrorMessage (const Storage_Error n) -{ - std::cout << "Storage Error: " << std::flush; - - switch (n) { - case Storage_VSOk: - std::cout << "no problem" << std::endl; - break; - case Storage_VSOpenError: - std::cout << "while opening the stream" << std::endl; - break; - case Storage_VSModeError: - std::cout << "the stream is opened with a wrong mode for operation " << std::endl; - break; - case Storage_VSCloseError: - std::cout << "while closing the stream" << std::endl; - break; - case Storage_VSAlreadyOpen: - std::cout << "stream is already opened" << std::endl; - break; - case Storage_VSNotOpen: - std::cout << "stream not opened" << std::endl; - break; - case Storage_VSSectionNotFound: - std::cout << "the section is not found" << std::endl; - break; - case Storage_VSWriteError: - std::cout << "error during writing" << std::endl; - break; - case Storage_VSFormatError: - std::cout << "wrong format error occured while reading" << std::endl; - break; - case Storage_VSUnknownType: - std::cout << "try to read an unknown type" << std::endl; - break; - case Storage_VSTypeMismatch: - std::cout << "try to read a wrong primitive type (read a char while expecting a real)" << std::endl; - break; - case Storage_VSInternalError: - std::cout << "internal error" << std::endl; - break; - case Storage_VSExtCharParityError: std::cout << "parity error" << std::endl; - break; - default: - std::cout << "unknown error code" << std::endl; - break; - } -} - - //======================================================================= //function : DDF_SetTagger //purpose : SetTagger (DF, entry) @@ -360,12 +335,16 @@ " Returns the list of label attributes: Attributes DF label", __FILE__, DDF_Attributes, g); + theCommands.Add ("SetEmptyAttribute", + "Sets an empty attribute by its type (like TDataStd_Tick): SetEmptyAttribute DF label type", + __FILE__, DDF_SetEmptyAttribute, g); + theCommands.Add ("ForgetAll", "Forgets all attributes from the label: ForgetAll DF Label", __FILE__, DDF_ForgetAll, g); theCommands.Add ("ForgetAtt", - "Forgets the specified by guid attribute from the label: ForgetAtt DF Label guid", + "Forgets the specified by guid attribute or type from the label: ForgetAtt DF Label guid_or_type", __FILE__, DDF_ForgetAttribute, g); theCommands.Add ("Label", diff -Nru opencascade-7.4.1+dfsg1/src/DDF/DDF_BrowserCommands.cxx opencascade-7.5.1+dfsg1/src/DDF/DDF_BrowserCommands.cxx --- opencascade-7.4.1+dfsg1/src/DDF/DDF_BrowserCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDF/DDF_BrowserCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -50,14 +51,14 @@ { if (n<2) { - std::cout << "Use: " << a[0] << " document [brower_name]" << std::endl; + Message::SendFail() << "Use: " << a[0] << " document [brower_name]"; return 1; } Handle(TDF_Data) DF; if (!DDF::GetDF (a[1], DF)) { - std::cout << "Error: document " << a[1] << " is not found" << std::endl; + Message::SendFail() << "Error: document " << a[1] << " is not found"; return 1; } @@ -78,8 +79,8 @@ } else { - std::cout << "Error: Could not load script " << aTclScript << std::endl; - std::cout << "Check environment variable CSF_DrawPluginDefaults" << std::endl; + Message::SendFail() << "Error: Could not load script " << aTclScript << "\n" + << "Check environment variable CSF_DrawPluginDefaults"; } // Call command dftree defined in dftree.tcl @@ -106,7 +107,7 @@ Handle(DDF_Browser) browser = Handle(DDF_Browser)::DownCast (Draw::GetExisting (a[1])); if (browser.IsNull()) { - std::cout << "Syntax error: browser '" << a[1] << "' not found\n"; + Message::SendFail() << "Syntax error: browser '" << a[1] << "' not found"; return 1; } @@ -135,7 +136,7 @@ Handle(DDF_Browser) browser = Handle(DDF_Browser)::DownCast (Draw::GetExisting (a[1])); if (browser.IsNull()) { - std::cout << "Syntax error: browser '" << a[1] << "' not found\n"; + Message::SendFail() << "Syntax error: browser '" << a[1] << "' not found"; return 1; } @@ -168,7 +169,7 @@ Handle(DDF_Browser) browser = Handle(DDF_Browser)::DownCast (Draw::GetExisting (a[1])); if (browser.IsNull()) { - std::cout << "Syntax error: browser '" << a[1] << "' not found\n"; + Message::SendFail() << "Syntax error: browser '" << a[1] << "' not found"; return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/DDF/DDF_Browser.cxx opencascade-7.5.1+dfsg1/src/DDF/DDF_Browser.cxx --- opencascade-7.4.1+dfsg1/src/DDF/DDF_Browser.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDF/DDF_Browser.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -131,7 +131,7 @@ list.AssignCat("\""); if (root.FindAttribute(TDataStd_Name::GetID(),name)) { - TCollection_AsciiString tmpStr(name->Get(),'?'); + TCollection_AsciiString tmpStr(name->Get()); tmpStr.ChangeAll(' ','_'); list.AssignCat(tmpStr); } @@ -178,7 +178,7 @@ list.AssignCat("\""); if (itr.Value().FindAttribute(TDataStd_Name::GetID(),name)) { - TCollection_AsciiString tmpStr(name->Get(),'?'); + TCollection_AsciiString tmpStr(name->Get()); tmpStr.ChangeAll(' ','_'); list.AssignCat(tmpStr); } diff -Nru opencascade-7.4.1+dfsg1/src/DDF/DDF_IOStream.cxx opencascade-7.5.1+dfsg1/src/DDF/DDF_IOStream.cxx --- opencascade-7.4.1+dfsg1/src/DDF/DDF_IOStream.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDF/DDF_IOStream.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,1367 +0,0 @@ -// Created by: DAUTRY Philippe -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -// ---------------- - -// Version: 0.0 -//Version Date Purpose -// 0.0 Aug 22 1997 Creation - -#include - -#include - -// This file has been written using FSD_File.cxx as template. -// This is a specific adaptation for Draw use (save & restore commands). -// It is not sure at all this code is portable on any other plateform than -// SUN OS. Don't use it anywhere else. -// Thanks for comprehension. (22 august 97) - - -#include -#include -#include -#include - -#include -#include - -#include -#include - -const Standard_CString MAGICNUMBER = "FSDFILE"; - - -//======================================================================= -//function : DDF_IOStream -//purpose : -//======================================================================= - -DDF_IOStream::DDF_IOStream() : - myIStream(NULL), - myOStream(NULL) -{} - -//======================================================================= -//function : Open -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::Open(const TCollection_AsciiString& aName,const Storage_OpenMode aMode) -{ - //myIStream = NULL; - //myOStream = NULL; - //return Storage_VSOk; - - Storage_Error result = Storage_VSOk; - - SetName(aName); - - if (OpenMode() == Storage_VSNone) { - if (aMode == Storage_VSRead) { - if (myIStream != NULL) delete myIStream; - myIStream = new std::ifstream(aName.ToCString(),std::ios::in); // std::ios::nocreate is not portable - if (myIStream->fail()) { - result = Storage_VSOpenError; - } - else { - myIStream->precision(17); - myIStream->imbue (std::locale::classic()); // always use C locale - SetOpenMode(aMode); - } - } - else if (aMode == Storage_VSWrite) { - if (myOStream != NULL) delete myOStream; - myOStream = new std::ofstream(aName.ToCString(),std::ios::out); - if (myOStream->fail()) { - result = Storage_VSOpenError; - } - else { - myOStream->precision(17); - myOStream->imbue (std::locale::classic()); // make sure to always use C locale - SetOpenMode(aMode); - } - } - } - else { - result = Storage_VSAlreadyOpen; - } - - return result; -} - -//======================================================================= -//function : Open -//purpose : "Opens" an std::istream. -//======================================================================= - -Storage_Error DDF_IOStream::Open(std::istream* anIStream) -{ - myOStream = NULL; - SetOpenMode(Storage_VSRead); - myIStream = anIStream; - myIStream->precision(17); - myIStream->imbue (std::locale::classic()); // use always C locale - SetName("DDF_IOStream"); - return Storage_VSOk; // ou Storage_VSAlreadyOpen ? -} - -//======================================================================= -//function : Open -//purpose : "Opens" an std::ostream. -//======================================================================= - -Storage_Error DDF_IOStream::Open(std::ostream* anOStream) -{ - myIStream = NULL; - SetOpenMode(Storage_VSWrite); - myOStream = anOStream; - myOStream->precision(17); - myOStream->imbue (std::locale::classic()); // use always C locale - SetName("DDF_IOStream"); - return Storage_VSOk; // ou Storage_VSAlreadyOpen ? -} - -//======================================================================= -//function : IsEnd -//purpose : -//======================================================================= - -Standard_Boolean DDF_IOStream::IsEnd() -{ - if (OpenMode() == Storage_VSRead) return myIStream->eof(); - else return myOStream->eof(); -} - -//======================================================================= -//function : Close -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::Close() -{ return Storage_VSOk; } - - -// ------------------ PROTECTED - - -//======================================================================= -//function : MagicNumber -//purpose : -//======================================================================= - -Standard_CString DDF_IOStream::MagicNumber() -{ return MAGICNUMBER; } - -//======================================================================= -//function : FlushEndOfLine -//purpose : -//======================================================================= - -void DDF_IOStream::FlushEndOfLine() -{ - static char Buffer[8192]; - char c; - Standard_Boolean IsEnd = Standard_False; - - while (!IsEnd && !DDF_IOStream::IsEnd()) { - Buffer[0] = '\0'; - myIStream->get(Buffer,8192,'\n'); - - if (myIStream->get(c) && c != '\n') { - } - else { - IsEnd = Standard_True; - } - } -} - -//======================================================================= -//function : ReadLine -//purpose : -//======================================================================= - -void DDF_IOStream::ReadLine(TCollection_AsciiString& buffer) -{ - static char Buffer[8193]; - char c; - Standard_Boolean IsEnd = Standard_False; - - buffer.Clear(); - - while (!IsEnd && !DDF_IOStream::IsEnd()) { - Buffer[0] = '\0'; - myIStream->get(Buffer,8192,'\n'); - - if (myIStream->get(c) && c != '\n') { - buffer += Buffer; - buffer += c; - } - else { - buffer += Buffer; - IsEnd = Standard_True; - } - } -} - - -//======================================================================= -//function : WriteExtendedLine -//purpose : -//======================================================================= - -void DDF_IOStream::WriteExtendedLine(const TCollection_ExtendedString& buffer) -{ - Standard_ExtString extBuffer; - Standard_Integer i,c,d; - - extBuffer = buffer.ToExtString(); - - for (i = 0; i < buffer.Length(); i++) { - c = (extBuffer[i] & 0x0000FF00 ) >> 8 ; - d = extBuffer[i] & 0x000000FF; - - *myOStream << (char)c << (char)d; - } - - *myOStream << (char)0 << "\n"; -} - -//======================================================================= -//function : ReadExtendedLine -//purpose : -//======================================================================= - -void DDF_IOStream::ReadExtendedLine(TCollection_ExtendedString& buffer) -{ - char c = '\0'; - Standard_ExtCharacter i = 0,j,check = 0; - Standard_Boolean fin = Standard_False; - - buffer.Clear(); - - while (!fin && !IsEnd()) { - myIStream->get(c); - check++; -// if (!(check % 2)) throw Storage_StreamExtCharParityError(); - i = (Standard_ExtCharacter)c; - if (c == '\0') fin = Standard_True; - i = (i << 8); - - myIStream->get(c); - check++; -// if ((check % 2) != 0) throw Storage_StreamExtCharParityError(); -// std::cout << check << std::endl; - j = (Standard_ExtCharacter)c; - if (c != '\n') fin = Standard_False; - i |= (0x00FF & j); - buffer += (Standard_ExtCharacter)i; - } - -// if ((check % 2) != 0) throw Storage_StreamExtCharParityError(); -// std::cout << check << std::endl; -} - -//======================================================================= -//function : ReadChar -//purpose : -//======================================================================= - -void DDF_IOStream::ReadChar(TCollection_AsciiString& buffer, const Standard_Integer rsize) -{ - char c = '\0'; - Standard_Integer ccount = 0; - - buffer.Clear(); - - while (!IsEnd() && (ccount < rsize)) { - myIStream->get(c); - buffer += c; - ccount++; - } -} - -//======================================================================= -//function : ReadString -//purpose : -//======================================================================= - -void DDF_IOStream::ReadString(TCollection_AsciiString& buffer) -{ - char c = '\0'; - Standard_Boolean IsEnd = Standard_False; - - buffer.Clear(); - - while (!IsEnd && !DDF_IOStream::IsEnd()) { - myIStream->get(c); - if ((c != ' ') && (c != '\n')) IsEnd = Standard_True; - } - - IsEnd = Standard_False; - - while (!IsEnd && !DDF_IOStream::IsEnd()) { - buffer += c; - myIStream->get(c); - if (c == '\n') IsEnd = Standard_True; - } -} - -//======================================================================= -//function : ReadWord -//purpose : -//======================================================================= - -void DDF_IOStream::ReadWord(TCollection_AsciiString& buffer) -{ - char c = '\0'; - Standard_Boolean IsEnd = Standard_False; - - buffer.Clear(); - - while (!IsEnd && !DDF_IOStream::IsEnd()) { - myIStream->get(c); - if ((c != ' ') && (c != '\n')) IsEnd = Standard_True; - } - - IsEnd = Standard_False; - - while (!IsEnd && !DDF_IOStream::IsEnd()) { - buffer += c; - myIStream->get(c); - if ((c == '\n') || (c == ' ')) IsEnd = Standard_True; - } -} - -//======================================================================= -//function : FindTag -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::FindTag(const Standard_CString aTag) -{ - TCollection_AsciiString l; - - ReadString(l); - - while ((strcmp(l.ToCString(),aTag) != 0) && !IsEnd()) { - ReadString(l); - } - - if (IsEnd()) { - return Storage_VSSectionNotFound; - } - else { - return Storage_VSOk; - } -} - -//======================================================================= -//function : SkipObject -//purpose : -//======================================================================= - -void DDF_IOStream::SkipObject() -{ - FlushEndOfLine(); -} - - -// ---------------------- PUBLIC : PUT - - -//======================================================================= -//function : PutReference -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::PutReference(const Standard_Integer aValue) -{ - *myOStream << aValue << " "; - if (myOStream->bad()) throw Storage_StreamWriteError("PutReference"); - return *this; -} - -//======================================================================= -//function : PutCharacter -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::PutCharacter(const Standard_Character aValue) -{ - *myOStream << aValue << " "; - if (myOStream->bad()) throw Storage_StreamWriteError("PutCharacter"); - return *this; -} - -//======================================================================= -//function : PutExtCharacter -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::PutExtCharacter(const Standard_ExtCharacter aValue) -{ - *myOStream << (short )aValue << " "; - if (myOStream->bad()) throw Storage_StreamWriteError("PutExtCharacter"); - return *this; -} - -//======================================================================= -//function : PutInteger -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::PutInteger(const Standard_Integer aValue) -{ - *myOStream << aValue << " "; - if (myOStream->bad()) throw Storage_StreamWriteError("PutInteger"); - return *this; -} - -//======================================================================= -//function : PutBoolean -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::PutBoolean(const Standard_Boolean aValue) -{ - *myOStream << ((Standard_Integer)aValue) << " "; - if (myOStream->bad()) throw Storage_StreamWriteError("PutBoolean"); - return *this; -} - -//======================================================================= -//function : PutReal -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::PutReal(const Standard_Real aValue) -{ - *myOStream << ((Standard_Real)aValue) << " "; - if (myOStream->bad()) throw Storage_StreamWriteError("PutReal"); - return *this; -} - -//======================================================================= -//function : PutShortReal -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::PutShortReal(const Standard_ShortReal aValue) -{ - *myOStream << aValue << " "; - if (myOStream->bad()) throw Storage_StreamWriteError("PutShortReal"); - return *this; -} - - -// ----------------- PUBLIC : GET - - -//======================================================================= -//function : GetReference -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::GetReference(Standard_Integer& aValue) -{ - if (!(*myIStream >> aValue)) throw Storage_StreamTypeMismatchError("GetReference"); - return *this; -} - -//======================================================================= -//function : GetCharacter -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::GetCharacter(Standard_Character& aValue) -{ - if (!(*myIStream >> aValue)) throw Storage_StreamTypeMismatchError("GetCharacter"); - return *this; -} - -//======================================================================= -//function : GetExtCharacter -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::GetExtCharacter(Standard_ExtCharacter& aValue) -{ - short aChar = 0; - if (!(*myIStream >> aChar)) throw Storage_StreamTypeMismatchError("GetExtCharacter"); - aValue = aChar; - return *this; -} - -//======================================================================= -//function : GetInteger -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::GetInteger(Standard_Integer& aValue) -{ - if (!(*myIStream >> aValue)) throw Storage_StreamTypeMismatchError("GetInteger"); - return *this; -} - -//======================================================================= -//function : GetBoolean -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::GetBoolean(Standard_Boolean& aValue) -{ - if (!(*myIStream >> aValue)) throw Storage_StreamTypeMismatchError("GetBoolean"); - return *this; -} - -//======================================================================= -//function : GetReal -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::GetReal(Standard_Real& aValue) -{ - if (!(*myIStream >> aValue)) throw Storage_StreamTypeMismatchError("GetReal"); - return *this; -} - -//======================================================================= -//function : GetShortReal -//purpose : -//======================================================================= - -Storage_BaseDriver& DDF_IOStream::GetShortReal(Standard_ShortReal& aValue) -{ - if (!(*myIStream >> aValue)) throw Storage_StreamTypeMismatchError("GetShortReal"); - return *this; -} - -// -------------------------- DESTROY - -//======================================================================= -//function : Destroy -//purpose : -//======================================================================= - -void DDF_IOStream::Destroy() -{ - if (OpenMode() != Storage_VSNone) Close(); -} - - -// -------------------------- INFO : WRITE - - -//======================================================================= -//function : BeginWriteInfoSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginWriteInfoSection() -{ - *myOStream << DDF_IOStream::MagicNumber() << '\n'; - *myOStream << "BEGIN_INFO_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - - return Storage_VSOk; -} - -//======================================================================= -//function : WriteInfo -//purpose : -//======================================================================= - -void DDF_IOStream::WriteInfo(const Standard_Integer nbObj, - const TCollection_AsciiString& dbVersion, - const TCollection_AsciiString& date, - const TCollection_AsciiString& schemaName, - const TCollection_AsciiString& schemaVersion, - const TCollection_ExtendedString& appName, - const TCollection_AsciiString& appVersion, - const TCollection_ExtendedString& dataType, - const TColStd_SequenceOfAsciiString& userInfo) -{ - Standard_Integer i; -// char *extBuffer; - - *myOStream << nbObj; - *myOStream << "\n"; - *myOStream << dbVersion.ToCString() << "\n"; - *myOStream << date.ToCString() << "\n"; - *myOStream << schemaName.ToCString() << "\n"; - *myOStream << schemaVersion.ToCString() << "\n"; - WriteExtendedLine(appName); - *myOStream << appVersion.ToCString() << "\n"; - WriteExtendedLine(dataType); - *myOStream << userInfo.Length() << "\n"; - - if (myOStream->bad()) throw Storage_StreamWriteError(); - - for (i = 1; i <= userInfo.Length(); i++) { - *myOStream << userInfo.Value(i).ToCString() << "\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - } -} - - -//======================================================================= -//function : EndWriteInfoSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndWriteInfoSection() -{ - *myOStream << "END_INFO_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - -//======================================================================= -//function : BeginReadInfoSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginReadInfoSection() -{ - Storage_Error s; - TCollection_AsciiString l; - Standard_Integer len = (Standard_Integer) strlen(DDF_IOStream::MagicNumber()); - - // Added because of Draw: - // It don't go to next line after reading its own header line information! - FlushEndOfLine(); - ReadChar(l,len); - - if (strncmp(DDF_IOStream::MagicNumber(),l.ToCString(),len) != 0) { -#ifdef OCCT_DEBUG - std::cout<<"BeginReadInfoSection: format error"<> nbObj)) throw Storage_StreamTypeMismatchError("ReadInfo 1"); - - FlushEndOfLine(); - - ReadLine(dbVersion); - ReadLine(date); - ReadLine(schemaName); - ReadLine(schemaVersion); - ReadExtendedLine(appName); - ReadLine(appVersion); - ReadExtendedLine(dataType); - - Standard_Integer i,len = 0; - - if (!(*myIStream >> len)) throw Storage_StreamTypeMismatchError("ReadInfo 2"); - - FlushEndOfLine(); - - TCollection_AsciiString line; - - for (i = 1; i <= len && !IsEnd(); i++) { - ReadLine(line); - userInfo.Append(line); - line.Clear(); - } -} - -//======================================================================= -//function : ReadCompleteInfo -//purpose : -//======================================================================= -void DDF_IOStream::ReadCompleteInfo( Standard_IStream& /*theIStream*/, Handle(Storage_Data)& /*theData*/ ) -{ - -} - -//======================================================================= -//function : EndReadInfoSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndReadInfoSection() -{ return FindTag("END_INFO_SECTION"); } - - -// ---------------- COMMENTS : WRITE - - -//======================================================================= -//function : BeginWriteCommentSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginWriteCommentSection() -{ - *myOStream << "BEGIN_COMMENT_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - -//======================================================================= -//function : WriteComment -//purpose : -//======================================================================= - -void DDF_IOStream::WriteComment(const TColStd_SequenceOfExtendedString& aCom) -{ - Standard_Integer i,aSize; - - aSize = aCom.Length(); - *myOStream << aSize << "\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - - for (i = 1; i <= aSize; i++) { - WriteExtendedLine(aCom.Value(i)); - if (myOStream->bad()) throw Storage_StreamWriteError(); - } -} - -//======================================================================= -//function : EndWriteCommentSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndWriteCommentSection() -{ - *myOStream << "END_COMMENT_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - - -// ---------------- COMMENTS : READ - - -//======================================================================= -//function : BeginReadCommentSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginReadCommentSection() -{ - return FindTag("BEGIN_COMMENT_SECTION"); -} - -//======================================================================= -//function : ReadComment -//purpose : -//======================================================================= - -void DDF_IOStream::ReadComment(TColStd_SequenceOfExtendedString& aCom) -{ - TCollection_ExtendedString line; - Standard_Integer len,i; - - if (!(*myIStream >> len)) throw Storage_StreamTypeMismatchError("ReadComment"); - - FlushEndOfLine(); - - for (i = 1; i <= len && !IsEnd(); i++) { - ReadExtendedLine(line); - aCom.Append(line); - line.Clear(); - } -} - -//======================================================================= -//function : EndReadCommentSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndReadCommentSection() -{ return FindTag("END_COMMENT_SECTION"); } - - -// --------------- TYPE : WRITE - - -//======================================================================= -//function : BeginWriteTypeSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginWriteTypeSection() -{ - *myOStream << "BEGIN_TYPE_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - -//======================================================================= -//function : SetTypeSectionSize -//purpose : -//======================================================================= - -void DDF_IOStream::SetTypeSectionSize(const Standard_Integer aSize) -{ - *myOStream << aSize << "\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : WriteTypeInformations -//purpose : -//======================================================================= - -void DDF_IOStream::WriteTypeInformations(const Standard_Integer typeNum, - const TCollection_AsciiString& typeName) -{ - *myOStream << typeNum << " " << typeName.ToCString() << "\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : EndWriteTypeSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndWriteTypeSection() -{ - *myOStream << "END_TYPE_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - - -// ------------------- TYPE : READ - - -//======================================================================= -//function : BeginReadTypeSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginReadTypeSection() -{ return FindTag("BEGIN_TYPE_SECTION"); } - -//======================================================================= -//function : TypeSectionSize -//purpose : -//======================================================================= - -Standard_Integer DDF_IOStream::TypeSectionSize() -{ - Standard_Integer i; - - if (!(*myIStream >> i)) throw Storage_StreamTypeMismatchError("TypeSectionSize"); - - FlushEndOfLine(); - - return i; -} - -//======================================================================= -//function : ReadTypeInformations -//purpose : -//======================================================================= - -void DDF_IOStream::ReadTypeInformations(Standard_Integer& typeNum, - TCollection_AsciiString& typeName) -{ - if (!(*myIStream >> typeNum)) throw Storage_StreamTypeMismatchError("ReadTypeInformations 1"); - if (!(*myIStream >> typeName)) throw Storage_StreamTypeMismatchError("ReadTypeInformations 2"); - FlushEndOfLine(); -} - -//======================================================================= -//function : EndReadTypeSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndReadTypeSection() -{ - return FindTag("END_TYPE_SECTION"); -} - - -// -------------------- ROOT : WRITE - - -//======================================================================= -//function : BeginWriteRootSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginWriteRootSection() -{ - *myOStream << "BEGIN_ROOT_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - -//======================================================================= -//function : SetRootSectionSize -//purpose : -//======================================================================= - -void DDF_IOStream::SetRootSectionSize(const Standard_Integer aSize) -{ - *myOStream << aSize << "\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : WriteRoot -//purpose : -//======================================================================= - -void DDF_IOStream::WriteRoot(const TCollection_AsciiString& rootName, const Standard_Integer aRef, const TCollection_AsciiString& rootType) -{ - *myOStream << aRef << " " << rootName.ToCString() << " " << rootType.ToCString() << "\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : EndWriteRootSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndWriteRootSection() -{ - *myOStream << "END_ROOT_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - - -// ----------------------- ROOT : READ - - -//======================================================================= -//function : BeginReadRootSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginReadRootSection() -{ return FindTag("BEGIN_ROOT_SECTION"); } - -//======================================================================= -//function : RootSectionSize -//purpose : -//======================================================================= - -Standard_Integer DDF_IOStream::RootSectionSize() -{ - Standard_Integer i; - - if (!(*myIStream >> i)) throw Storage_StreamTypeMismatchError("RootSectionSize"); - - FlushEndOfLine(); - - return i; -} - -//======================================================================= -//function : ReadRoot -//purpose : -//======================================================================= - -void DDF_IOStream::ReadRoot(TCollection_AsciiString& rootName, Standard_Integer& aRef,TCollection_AsciiString& rootType) -{ - if (!(*myIStream >> aRef)) throw Storage_StreamTypeMismatchError("ReadRoot"); - ReadWord(rootName); - ReadWord(rootType); -} - -//======================================================================= -//function : EndReadRootSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndReadRootSection() -{ return FindTag("END_ROOT_SECTION"); } - - -// -------------------------- REF : WRITE - - -//======================================================================= -//function : BeginWriteRefSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginWriteRefSection() -{ - *myOStream << "BEGIN_REF_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - -//======================================================================= -//function : SetRefSectionSize -//purpose : -//======================================================================= - -void DDF_IOStream::SetRefSectionSize(const Standard_Integer aSize) -{ - *myOStream << aSize << "\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : WriteReferenceType -//purpose : -//======================================================================= - -void DDF_IOStream::WriteReferenceType(const Standard_Integer reference, - const Standard_Integer typeNum) -{ - *myOStream << reference << " " << typeNum << "\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : EndWriteRefSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndWriteRefSection() -{ - *myOStream << "END_REF_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - - -// ----------------------- REF : READ - - -//======================================================================= -//function : BeginReadRefSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginReadRefSection() -{ return FindTag("BEGIN_REF_SECTION"); } - -//======================================================================= -//function : RefSectionSize -//purpose : -//======================================================================= - -Standard_Integer DDF_IOStream::RefSectionSize() -{ - Standard_Integer i; - - if (!(*myIStream >> i)) throw Storage_StreamTypeMismatchError("RefSectionSize"); - FlushEndOfLine(); - - return i; -} - -//======================================================================= -//function : ReadReferenceType -//purpose : -//======================================================================= - -void DDF_IOStream::ReadReferenceType(Standard_Integer& reference, - Standard_Integer& typeNum) -{ - if (!(*myIStream >> reference)) throw Storage_StreamTypeMismatchError("ReadReferenceType 1"); - if (!(*myIStream >> typeNum)) throw Storage_StreamTypeMismatchError("ReadReferenceType 2"); - FlushEndOfLine(); -} - -//======================================================================= -//function : EndReadRefSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndReadRefSection() -{ - return FindTag("END_REF_SECTION"); -} - - -// -------------------- DATA : WRITE - - -//======================================================================= -//function : BeginWriteDataSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginWriteDataSection() -{ - *myOStream << "BEGIN_DATA_SECTION"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - -//======================================================================= -//function : WritePersistentObjectHeader -//purpose : -//======================================================================= - -void DDF_IOStream::WritePersistentObjectHeader(const Standard_Integer aRef, - const Standard_Integer aType) -{ - *myOStream << "\n#" << aRef << "=%" << aType; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : BeginWritePersistentObjectData -//purpose : -//======================================================================= - -void DDF_IOStream::BeginWritePersistentObjectData() -{ - *myOStream << "( "; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : BeginWriteObjectData -//purpose : -//======================================================================= - -void DDF_IOStream::BeginWriteObjectData() -{ - *myOStream << "( "; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : EndWriteObjectData -//purpose : -//======================================================================= - -void DDF_IOStream::EndWriteObjectData() -{ - *myOStream << ") "; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : EndWritePersistentObjectData -//purpose : -//======================================================================= - -void DDF_IOStream::EndWritePersistentObjectData() -{ - *myOStream << ")"; - if (myOStream->bad()) throw Storage_StreamWriteError(); -} - -//======================================================================= -//function : EndWriteDataSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndWriteDataSection() -{ - *myOStream << "\nEND_DATA_SECTION\n"; - if (myOStream->bad()) throw Storage_StreamWriteError(); - return Storage_VSOk; -} - - -// ---------------------- DATA : READ - - -//======================================================================= -//function : BeginReadDataSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::BeginReadDataSection() -{ return FindTag("BEGIN_DATA_SECTION"); } - -//======================================================================= -//function : ReadPersistentObjectHeader -//purpose : -//======================================================================= - -void DDF_IOStream::ReadPersistentObjectHeader(Standard_Integer& aRef, - Standard_Integer& aType) -{ - char c = '\0'; - - myIStream->get(c); - - while (c != '#') { - if (IsEnd() || (c != ' ') || (c == '\n')) { - throw Storage_StreamFormatError(); - } - myIStream->get(c); - } - - if (!(*myIStream >> aRef)) throw Storage_StreamTypeMismatchError("ReadPersistentObjectHeader 1"); - myIStream->get(c); - - while (c != '=') { - if (IsEnd() || (c != ' ') || (c == '\n')) { - throw Storage_StreamFormatError(); - } - myIStream->get(c); - } - - myIStream->get(c); - - while (c != '%') { - if (IsEnd() || (c != ' ') || (c == '\n')) { - throw Storage_StreamFormatError(); - } - myIStream->get(c); - } - - if (!(*myIStream >> aType)) throw Storage_StreamTypeMismatchError("ReadPersistentObjectHeader 2"); -} - -//======================================================================= -//function : BeginReadPersistentObjectData -//purpose : -//======================================================================= - -void DDF_IOStream::BeginReadPersistentObjectData() -{ - char c = '\0'; - myIStream->get(c); - while (c != '(') { - if (IsEnd() || (c != ' ') || (c == '\n')) { - throw Storage_StreamFormatError(); - } - myIStream->get(c); - } -} - -//======================================================================= -//function : BeginReadObjectData -//purpose : -//======================================================================= - -void DDF_IOStream::BeginReadObjectData() -{ - char c = '\0'; - myIStream->get(c); - while (c != '(') { - if (IsEnd() || (c != ' ') || (c == '\n')) { - throw Storage_StreamFormatError("BeginReadObjectData"); - } - myIStream->get(c); - } -} - -//======================================================================= -//function : EndReadObjectData -//purpose : -//======================================================================= - -void DDF_IOStream::EndReadObjectData() -{ - char c = '\0'; - myIStream->get(c); - while (c != ')') { - if (IsEnd() || (c != ' ') || (c == '\n')) { - throw Storage_StreamFormatError("EndReadObjectData"); - } - myIStream->get(c); - } -} - -//======================================================================= -//function : EndReadPersistentObjectData -//purpose : -//======================================================================= - -void DDF_IOStream::EndReadPersistentObjectData() -{ - char c = '\0'; - - myIStream->get(c); - while (c != ')') { - if (IsEnd() || (c != ' ') || (c == '\n')) { - throw Storage_StreamFormatError("EndReadPersistentObjectData"); - } - myIStream->get(c); - } - - myIStream->get(c); - while (c != '\n') { - if (IsEnd() || (c != ' ')) { - throw Storage_StreamFormatError(); - } - myIStream->get(c); - } -} - -//======================================================================= -//function : EndReadDataSection -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::EndReadDataSection() -{ return FindTag("END_DATA_SECTION"); } - -//======================================================================= -//function : IsGoodFileType -//purpose : -//======================================================================= - -Storage_Error DDF_IOStream::IsGoodFileType(std::istream* anIStream) -{ - DDF_IOStream f; - Storage_Error s; - - s = f.Open(anIStream); - - if (s == Storage_VSOk) { - TCollection_AsciiString l; - Standard_Integer len = (Standard_Integer) strlen(DDF_IOStream::MagicNumber()); - - f.ReadChar(l,len); - - f.Close(); - - if (strncmp(DDF_IOStream::MagicNumber(),l.ToCString(),len) != 0) { -#ifdef OCCT_DEBUG - std::cout<<"IsGoodFileType: format error"< - -#include -#include -#include -#include - -class Storage_StreamTypeMismatchError; -class Storage_StreamFormatError; -class Storage_StreamWriteError; -class Storage_StreamExtCharParityError; - -#include - -class DDF_IOStream : public Storage_BaseDriver { - -public: - - // Methods PUBLIC - // -DDF_IOStream(); - Storage_Error Open(const TCollection_AsciiString& aName,const Storage_OpenMode aMode) ; - Storage_Error Open(std::istream* anIStream) ; - Storage_Error Open(std::ostream* anOStream) ; - Standard_Boolean IsEnd() ; - Storage_Position Tell() { return -1; } -static Storage_Error IsGoodFileType(std::istream* anIStream) ; - Storage_Error BeginWriteInfoSection() ; - void WriteInfo(const Standard_Integer nbObj,const TCollection_AsciiString& dbVersion,const TCollection_AsciiString& date,const TCollection_AsciiString& schemaName,const TCollection_AsciiString& schemaVersion,const TCollection_ExtendedString& appName,const TCollection_AsciiString& appVersion,const TCollection_ExtendedString& objectType,const TColStd_SequenceOfAsciiString& userInfo) ; - Storage_Error EndWriteInfoSection() ; - Storage_Error BeginReadInfoSection() ; - void ReadInfo(Standard_Integer& nbObj,TCollection_AsciiString& dbVersion,TCollection_AsciiString& date,TCollection_AsciiString& schemaName,TCollection_AsciiString& schemaVersion,TCollection_ExtendedString& appName,TCollection_AsciiString& appVersion,TCollection_ExtendedString& objectType,TColStd_SequenceOfAsciiString& userInfo) ; - void ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData); - Storage_Error EndReadInfoSection() ; - Storage_Error BeginWriteCommentSection() ; - void WriteComment(const TColStd_SequenceOfExtendedString& userComments) ; - Storage_Error EndWriteCommentSection() ; - Storage_Error BeginReadCommentSection() ; - void ReadComment(TColStd_SequenceOfExtendedString& userComments) ; - Storage_Error EndReadCommentSection() ; - Storage_Error BeginWriteTypeSection() ; - void SetTypeSectionSize(const Standard_Integer aSize) ; - void WriteTypeInformations(const Standard_Integer typeNum,const TCollection_AsciiString& typeName) ; - Storage_Error EndWriteTypeSection() ; - Storage_Error BeginReadTypeSection() ; - Standard_Integer TypeSectionSize() ; - void ReadTypeInformations(Standard_Integer& typeNum,TCollection_AsciiString& typeName) ; - Storage_Error EndReadTypeSection() ; - Storage_Error BeginWriteRootSection() ; - void SetRootSectionSize(const Standard_Integer aSize) ; - void WriteRoot(const TCollection_AsciiString& rootName,const Standard_Integer aRef,const TCollection_AsciiString& aType) ; - Storage_Error EndWriteRootSection() ; - Storage_Error BeginReadRootSection() ; - Standard_Integer RootSectionSize() ; - void ReadRoot(TCollection_AsciiString& rootName,Standard_Integer& aRef,TCollection_AsciiString& aType) ; - Storage_Error EndReadRootSection() ; - Storage_Error BeginWriteRefSection() ; - void SetRefSectionSize(const Standard_Integer aSize) ; - void WriteReferenceType(const Standard_Integer reference,const Standard_Integer typeNum) ; - Storage_Error EndWriteRefSection() ; - Storage_Error BeginReadRefSection() ; - Standard_Integer RefSectionSize() ; - void ReadReferenceType(Standard_Integer& reference,Standard_Integer& typeNum) ; - Storage_Error EndReadRefSection() ; - Storage_Error BeginWriteDataSection() ; - void WritePersistentObjectHeader(const Standard_Integer aRef,const Standard_Integer aType) ; - void BeginWritePersistentObjectData() ; - void BeginWriteObjectData() ; - void EndWriteObjectData() ; - void EndWritePersistentObjectData() ; - Storage_Error EndWriteDataSection() ; - Storage_Error BeginReadDataSection() ; - void ReadPersistentObjectHeader(Standard_Integer& aRef,Standard_Integer& aType) ; - void BeginReadPersistentObjectData() ; - void BeginReadObjectData() ; - void EndReadObjectData() ; - void EndReadPersistentObjectData() ; - Storage_Error EndReadDataSection() ; - void SkipObject() ; - Storage_BaseDriver& PutReference(const Standard_Integer aValue) ; - Storage_BaseDriver& PutCharacter(const Standard_Character aValue) ; - Storage_BaseDriver& operator <<(const Standard_Character aValue) -{ - return PutCharacter(aValue); -} - - Storage_BaseDriver& PutExtCharacter(const Standard_ExtCharacter aValue) ; - Storage_BaseDriver& operator <<(const Standard_ExtCharacter aValue) -{ - return PutExtCharacter(aValue); -} - - Storage_BaseDriver& PutInteger(const Standard_Integer aValue) ; - Storage_BaseDriver& operator <<(const Standard_Integer aValue) -{ - return PutInteger(aValue); -} - - Storage_BaseDriver& PutBoolean(const Standard_Boolean aValue) ; - Storage_BaseDriver& operator <<(const Standard_Boolean aValue) -{ - return PutBoolean(aValue); -} - - Storage_BaseDriver& PutReal(const Standard_Real aValue) ; - Storage_BaseDriver& operator <<(const Standard_Real aValue) -{ - return PutReal(aValue); -} - - Storage_BaseDriver& PutShortReal(const Standard_ShortReal aValue) ; - Storage_BaseDriver& operator <<(const Standard_ShortReal aValue) -{ - return PutShortReal(aValue); -} - - Storage_BaseDriver& GetReference(Standard_Integer& aValue) ; - Storage_BaseDriver& GetCharacter(Standard_Character& aValue) ; - Storage_BaseDriver& operator >>(Standard_Character& aValue) -{ - return GetCharacter(aValue); -} - - Storage_BaseDriver& GetExtCharacter(Standard_ExtCharacter& aValue) ; - Storage_BaseDriver& operator >>(Standard_ExtCharacter& aValue) -{ - return GetExtCharacter(aValue); -} - - Storage_BaseDriver& GetInteger(Standard_Integer& aValue) ; - Storage_BaseDriver& operator >>(Standard_Integer& aValue) -{ - return GetInteger(aValue); -} - - Storage_BaseDriver& GetBoolean(Standard_Boolean& aValue) ; - Storage_BaseDriver& operator >>(Standard_Boolean& aValue) -{ - return GetBoolean(aValue); -} - - Storage_BaseDriver& GetReal(Standard_Real& aValue) ; - Storage_BaseDriver& operator >>(Standard_Real& aValue) -{ - return GetReal(aValue); -} - - Storage_BaseDriver& GetShortReal(Standard_ShortReal& aValue) ; - Storage_BaseDriver& operator >>(Standard_ShortReal& aValue) -{ - return GetShortReal(aValue); -} - - Storage_Error Close() ; - void Destroy() ; -~DDF_IOStream() -{ - Destroy(); -} - - - - - - -protected: - - // Methods PROTECTED - // - void ReadLine(TCollection_AsciiString& buffer) ; - void ReadWord(TCollection_AsciiString& buffer) ; - void ReadExtendedLine(TCollection_ExtendedString& buffer) ; - void WriteExtendedLine(const TCollection_ExtendedString& buffer) ; - void ReadChar(TCollection_AsciiString& buffer,const Standard_Integer rsize) ; - void ReadString(TCollection_AsciiString& buffer) ; - void FlushEndOfLine() ; - Storage_Error FindTag(const Standard_CString aTag) ; - - - // Fields PROTECTED - // - - -private: - - // Methods PRIVATE - // -static Standard_CString MagicNumber() ; - - - // Fields PRIVATE - // -//FSD_FStream myStream; -std::istream* myIStream; -std::ostream* myOStream; - - -}; - -// other inline functions and methods (like "C++: function call" methods) -// -#endif diff -Nru opencascade-7.4.1+dfsg1/src/DDF/FILES opencascade-7.5.1+dfsg1/src/DDF/FILES --- opencascade-7.4.1+dfsg1/src/DDF/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDF/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -9,8 +9,6 @@ DDF_Data.cxx DDF_Data.hxx DDF_DataCommands.cxx -DDF_IOStream.cxx -DDF_IOStream.hxx DDF_ListIteratorOfTransactionStack.hxx DDF_Transaction.cxx DDF_Transaction.hxx diff -Nru opencascade-7.4.1+dfsg1/src/DDocStd/DDocStd_ApplicationCommands.cxx opencascade-7.5.1+dfsg1/src/DDocStd/DDocStd_ApplicationCommands.cxx --- opencascade-7.4.1+dfsg1/src/DDocStd/DDocStd_ApplicationCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDocStd/DDocStd_ApplicationCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -64,12 +65,8 @@ A->GetDocument(i,D); di <<"document " << i; if (D->IsSaved()) { - TCollection_AsciiString GetNameAsciiString(D->GetName().ToExtString(),'?'); - TCollection_AsciiString GetPathAsciiString(D->GetPath().ToExtString(),'?'); - //std::cout << " name : " << D->GetName(); - //std::cout << " path : " << D->GetPath(); - di << " name : " << GetNameAsciiString.ToCString(); - di << " path : " << GetPathAsciiString.ToCString(); + di << " name : " << D->GetName(); + di << " path : " << D->GetPath(); } else di << " not saved"; di << "\n"; @@ -126,11 +123,11 @@ //======================================================================= static Standard_Integer DDocStd_Open (Draw_Interpretor& di, - Standard_Integer nb, - const char** a) + Standard_Integer nb, + const char** a) { if (nb >= 3) { - TCollection_ExtendedString path (a[1]); + TCollection_ExtendedString path (a[1], Standard_True); Handle(TDocStd_Application) A = DDocStd::GetApplication(); Handle(TDocStd_Document) D; Standard_Integer insession = A->IsInSession(path); @@ -151,53 +148,61 @@ } } + Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di, 1); if (anUseStream) { std::ifstream aFileStream; OSD_OpenStream (aFileStream, path, std::ios::in | std::ios::binary); - theStatus = A->Open (aFileStream, D); + theStatus = A->Open (aFileStream, D, aProgress->Start()); } else { - theStatus = A->Open(path,D); + theStatus = A->Open (path, D, aProgress->Start()); } - if (theStatus == PCDM_RS_OK && !D.IsNull()) { + if (theStatus == PCDM_RS_OK && !D.IsNull()) + { Handle(DDocStd_DrawDocument) DD = new DDocStd_DrawDocument(D); TDataStd_Name::Set(D->GetData()->Root(),a[2]); Draw::Set(a[2],DD); return 0; - } else { + } + else + { switch ( theStatus ) { + case PCDM_RS_UserBreak: { + di << " could not retrieve , user break \n"; + break; + } case PCDM_RS_AlreadyRetrieved: case PCDM_RS_AlreadyRetrievedAndModified: { - di << " already retrieved \n" ; - break; + di << " already retrieved \n" ; + break; } case PCDM_RS_NoDriver: { - di << " could not retrieve , no Driver to make it \n" ; - break ; + di << " could not retrieve , no Driver to make it \n" ; + break ; } case PCDM_RS_UnknownDocument: case PCDM_RS_NoModel: { - di << " could not retrieve , Unknown Document or No Model \n"; - break ; + di << " could not retrieve , Unknown Document or No Model \n"; + break ; } case PCDM_RS_TypeNotFoundInSchema: case PCDM_RS_UnrecognizedFileFormat: { - di << " could not retrieve , Type not found or Unrecognized File Format\n"; - break ; + di << " could not retrieve , Type not found or Unrecognized File Format\n"; + break ; } case PCDM_RS_PermissionDenied: { - di << " could not retrieve , permission denied \n" ; - break; + di << " could not retrieve , permission denied \n" ; + break; } default: - di << " could not retrieve \n" ; - break; + di << " could not retrieve \n" ; + break; } di << "DDocStd_Open : Error\n"; - } + } } return 1; } @@ -208,8 +213,8 @@ //======================================================================= static Standard_Integer DDocStd_Save (Draw_Interpretor& di, - Standard_Integer nb, - const char** a) + Standard_Integer nb, + const char** a) { if (nb == 2) { Handle(TDocStd_Document) D; @@ -219,7 +224,9 @@ di << "this document has never been saved\n"; return 0; } - A->Save(D); + + Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di, 1); + A->Save (D, aProgress->Start()); return 0; } di << "DDocStd_Save : Error\n"; @@ -238,7 +245,7 @@ if (nb >= 3) { Handle(TDocStd_Document) D; if (!DDocStd::GetDocument(a[1],D)) return 1; - TCollection_ExtendedString path (a[2]); + TCollection_ExtendedString path (a[2], Standard_True); Handle(TDocStd_Application) A = DDocStd::GetApplication(); PCDM_StoreStatus theStatus; @@ -255,15 +262,17 @@ D->SetEmptyLabelsSavingMode(isSaveEmptyLabels); } } + + Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di, 1); if (anUseStream) { std::ofstream aFileStream; OSD_OpenStream (aFileStream, path, std::ios::out | std::ios::binary); - theStatus = A->SaveAs (D, aFileStream); + theStatus = A->SaveAs (D, aFileStream, aProgress->Start()); } else { - theStatus = A->SaveAs(D,path); + theStatus = A->SaveAs(D,path, aProgress->Start()); } if (theStatus != PCDM_SS_OK ) { @@ -292,6 +301,10 @@ di << "Error saving document: Write info section failure\n" ; break; } + case PCDM_SS_UserBreak: { + di << "Error saving document: User break \n" ; + break; + } default: break; } @@ -309,13 +322,13 @@ //purpose : //======================================================================= -static Standard_Integer DDocStd_Close (Draw_Interpretor& /*theDI*/, +static Standard_Integer DDocStd_Close (Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec) { if (theArgNb != 2) { - std::cout << "DDocStd_Close : Error\n"; + theDI << "DDocStd_Close : Error\n"; return 1; } @@ -410,19 +423,11 @@ const char** a) { if (nb == 2) { - TDocStd_PathParser path (a[1]); - //std::cout << "Trek : " << path.Trek() << std::endl; - //std::cout << "Name : " << path.Name() << std::endl; - //std::cout << "Extension : " << path.Extension() << std::endl; - //std::cout << "Path : " << path.Path() << std::endl; - TCollection_AsciiString TrekAsciiString(path.Trek().ToExtString(),'?'); - TCollection_AsciiString NameAsciiString(path.Name().ToExtString(),'?'); - TCollection_AsciiString ExtensionAsciiString(path.Extension().ToExtString(),'?'); - TCollection_AsciiString PathAsciiString(path.Path().ToExtString(),'?'); - di << "Trek : " << TrekAsciiString.ToCString() << "\n"; - di << "Name : " << NameAsciiString.ToCString() << "\n"; - di << "Extension : " << ExtensionAsciiString.ToCString() << "\n"; - di << "Path : " << PathAsciiString.ToCString() << "\n"; + TDocStd_PathParser path (TCollection_ExtendedString (a[1], Standard_True)); + di << "Trek : " << path.Trek() << "\n"; + di << "Name : " << path.Name() << "\n"; + di << "Extension : " << path.Extension() << "\n"; + di << "Path : " << path.Path() << "\n"; return 0; } di << "DDocStd_Path : Error\n"; @@ -440,7 +445,7 @@ if (nb == 3) { Handle(TDocStd_Document) D; if (!DDocStd::GetDocument(a[1],D)) return 1; - TCollection_ExtendedString comment (a[2]); + TCollection_ExtendedString comment (a[2], Standard_True); // Handle(TDocStd_Application) A = DDocStd::GetApplication(); // A->AddComment(D,comment); D->AddComment(comment); @@ -467,9 +472,7 @@ for (int i = 1; i <= comments.Length(); i++) { - //std::cout << comments(i) << std::endl; - TCollection_AsciiString commentAsciiString(comments(i).ToExtString(),'?'); - di << commentAsciiString.ToCString() << "\n"; + di << comments(i) << "\n"; } return 0; diff -Nru opencascade-7.4.1+dfsg1/src/DDocStd/DDocStd.cxx opencascade-7.5.1+dfsg1/src/DDocStd/DDocStd.cxx --- opencascade-7.4.1+dfsg1/src/DDocStd/DDocStd.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDocStd/DDocStd.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,8 +13,6 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - -#include #include #include #include diff -Nru opencascade-7.4.1+dfsg1/src/DDocStd/DDocStd_DocumentCommands.cxx opencascade-7.5.1+dfsg1/src/DDocStd/DDocStd_DocumentCommands.cxx --- opencascade-7.4.1+dfsg1/src/DDocStd/DDocStd_DocumentCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDocStd/DDocStd_DocumentCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -311,7 +311,7 @@ di << "\n"; // document name if (D->IsSaved()) - di << "DOCUMENT : " << TCollection_AsciiString(D->GetName(),'?').ToCString(); + di << "DOCUMENT : " << D->GetName(); else di << "DOCUMENT : not saved"; di << "\n"; diff -Nru opencascade-7.4.1+dfsg1/src/DDocStd/DDocStd_MTMCommands.cxx opencascade-7.5.1+dfsg1/src/DDocStd/DDocStd_MTMCommands.cxx --- opencascade-7.4.1+dfsg1/src/DDocStd/DDocStd_MTMCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDocStd/DDocStd_MTMCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -109,7 +109,7 @@ return 1; } if(n > 1) - sMultiTransactionManager->CommitCommand(a[1]); + sMultiTransactionManager->CommitCommand(TCollection_ExtendedString (a[1], Standard_True)); else sMultiTransactionManager->CommitCommand(); return 0; @@ -266,20 +266,17 @@ else if ( att->IsKind(STANDARD_TYPE(TDataStd_Name)) ) { Handle(TDataStd_Name) val = Handle(TDataStd_Name)::DownCast ( att ); - TCollection_AsciiString str ( val->Get(), '?' ); - di << str.ToCString(); + di << val->Get(); } else if ( att->IsKind(STANDARD_TYPE(TDataStd_Comment)) ) { Handle(TDataStd_Comment) val = Handle(TDataStd_Comment)::DownCast ( att ); - TCollection_AsciiString str ( val->Get(), '?' ); - di << str.ToCString(); + di << val->Get(); } else if ( att->IsKind(STANDARD_TYPE(TDataStd_AsciiString)) ) { Handle(TDataStd_AsciiString) val = Handle(TDataStd_AsciiString)::DownCast ( att ); - TCollection_AsciiString str ( val->Get(), '?' ); - di << str.ToCString(); + di << val->Get(); } else if ( att->IsKind(STANDARD_TYPE(TDataStd_IntegerArray)) ) { diff -Nru opencascade-7.4.1+dfsg1/src/DDocStd/DDocStd_ShapeSchemaCommands.cxx opencascade-7.5.1+dfsg1/src/DDocStd/DDocStd_ShapeSchemaCommands.cxx --- opencascade-7.4.1+dfsg1/src/DDocStd/DDocStd_ShapeSchemaCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DDocStd/DDocStd_ShapeSchemaCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,6 +30,57 @@ #include #include +//========================================================== +// ErrorMessage +//========================================================== + +static void DDocStd_StorageErrorMessage (Draw_Interpretor& theDI, const Storage_Error theStatus) +{ + switch (theStatus) { + case Storage_VSOk: + break; + case Storage_VSOpenError: + theDI << "Storage error: failed to open the stream"; + break; + case Storage_VSModeError: + theDI << "Storage error: the stream is opened with a wrong mode for operation "; + break; + case Storage_VSCloseError: + theDI << "Storage error: failed to closing the stream"; + break; + case Storage_VSAlreadyOpen: + theDI << "Storage error: stream is already opened"; + break; + case Storage_VSNotOpen: + theDI << "Storage error: stream not opened"; + break; + case Storage_VSSectionNotFound: + theDI << "Storage error: the section is not found"; + break; + case Storage_VSWriteError: + theDI << "Storage error: error during writing"; + break; + case Storage_VSFormatError: + theDI << "Storage error: wrong format error occured while reading"; + break; + case Storage_VSUnknownType: + theDI << "Storage error: try to read an unknown type"; + break; + case Storage_VSTypeMismatch: + theDI << "Storage error: try to read a wrong primitive type (read a char while expecting a real)"; + break; + case Storage_VSInternalError: + theDI << "Storage error: internal error"; + break; + case Storage_VSExtCharParityError: + theDI << "Storage error: parity error"; + break; + default: + theDI << "Storage error: unknown error code"; + break; + } +} + //======================================================================= //function : DDocStd_ShapeSchema_Write //======================================================================= @@ -51,7 +102,7 @@ return 1; } - NCollection_Handle aFileDriver(new FSD_File); + Handle(Storage_BaseDriver) aFileDriver(new FSD_File); Standard_Boolean hasStorageDriver = Standard_False; Standard_Integer iArgN = theArgNb - 1; @@ -76,8 +127,9 @@ Storage_Error aStatus = aFileDriver->Open(theArgs[iArgN], Storage_VSWrite); if (aStatus != Storage_VSOk) { - theDI << "Error : couldn't open file '" << "' for writing (" << aStatus << ")\n"; - return 1; + theDI << "Error: cannot open file '" << "' for writing (" << aStatus << ")\n"; + DDocStd_StorageErrorMessage (theDI, aStatus); + return 0; } TopTools_SequenceOfShape aShapes; @@ -129,15 +181,9 @@ aData->RootData()->AddRoot(aRoot); } - Storage_Error anError = StdStorage::Write(*aFileDriver, aData); - + Storage_Error anError = StdStorage::Write(aFileDriver, aData); aFileDriver->Close(); - - if (anError != Storage_VSOk) - { - theDI << "Error : " << anError << "\n"; - return 1; - } + DDocStd_StorageErrorMessage(theDI, anError); return 0; } @@ -170,8 +216,8 @@ Storage_Error anError = StdStorage::Read(TCollection_AsciiString(theArgs[1]), aData); if (anError != Storage_VSOk) { - theDI << "Error : " << anError << "\n"; - return 1; + DDocStd_StorageErrorMessage(theDI, anError); + return 0; } TopTools_SequenceOfShape aShapes; diff -Nru opencascade-7.4.1+dfsg1/src/DNaming/DNaming_BasicCommands.cxx opencascade-7.5.1+dfsg1/src/DNaming/DNaming_BasicCommands.cxx --- opencascade-7.4.1+dfsg1/src/DNaming/DNaming_BasicCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DNaming/DNaming_BasicCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -453,7 +453,7 @@ const TopoDS_Shape& aShape = DBRep::Get(a[3]); if(aShape.IsNull()) return 1; if(nb == 5) { - TDataStd_Name::Set(L, a[4]); + TDataStd_Name::Set(L, TCollection_ExtendedString (a[4], Standard_True)); } DNaming::LoadImportedShape(L, aShape); @@ -461,7 +461,7 @@ DDF::ReturnLabel(di, L); return 0; } - std::cout << "DNaming_NewShape : Error" << std::endl; + di << "DNaming_NewShape : Error"; return 1; } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/DNaming/DNaming_ModelingCommands.cxx opencascade-7.5.1+dfsg1/src/DNaming/DNaming_ModelingCommands.cxx --- opencascade-7.4.1+dfsg1/src/DNaming/DNaming_ModelingCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DNaming/DNaming_ModelingCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -104,7 +105,7 @@ Handle(TDataStd_UAttribute) anObj = AddObject (aDoc); if(!anObj.IsNull()) { if(nb == 3) - TDataStd_Name::Set(anObj->Label(), a[2]); + TDataStd_Name::Set(anObj->Label(), TCollection_ExtendedString (a[2], Standard_True)); DDF::ReturnLabel(di, anObj->Label()); return 0; } @@ -333,7 +334,7 @@ DDF::ReturnLabel(theDI, anObj->Label()); return 0; } - std::cout << "DNaming_AddBox : Error" << std::endl; + Message::SendFail() << "DNaming_AddBox : Error"; return 1; } @@ -385,7 +386,7 @@ return 0; } } - std::cout << "DNaming_BoxDX : Error" << std::endl; + Message::SendFail() << "DNaming_BoxDX : Error"; return 1; } @@ -418,7 +419,7 @@ return 0; } } - std::cout << "DNaming_BoxDY : Error" << std::endl; + Message::SendFail() << "DNaming_BoxDY : Error"; return 1; } @@ -451,7 +452,7 @@ return 0; } } - std::cout << "DNaming_BoxDZ : Error" << std::endl; + Message::SendFail() << "DNaming_BoxDZ : Error"; return 1; } @@ -525,7 +526,7 @@ logbook->Clear(); Standard_Integer aRes = ComputeFunction(aFun, logbook); if(aRes != 0) { - std::cout << "DNaming_SolveFlatFrom: Driver failed at label = " << entry << std::endl; + Message::SendFail() << "DNaming_SolveFlatFrom: Driver failed at label = " << entry; return 1; } #ifdef OCCT_DEBUG @@ -539,7 +540,7 @@ return 0; } ERR: - std::cout << "DNaming_SolveFlatFrom : Error" << std::endl; + Message::SendFail() << "DNaming_SolveFlatFrom : Error"; return 1; } @@ -569,7 +570,7 @@ } return 0; } - std::cout << "DNaming_InitLogBook : Error - No document ==> " < " << theNb; return 1; } @@ -600,7 +601,7 @@ } return 0; } - std::cout << "DNaming_CheckLogBook : Error - No document ==> " < " << theNb; return 1; } @@ -625,17 +626,18 @@ if(!aFun.IsNull()) { Handle(TFunction_Logbook) logbook = TFunction_Logbook::Set(funLabel); Standard_Integer aRes = ComputeFunction(aFun, logbook); - if(aRes != 0) { - std::cout << "DNaming_ComputeFun : No Driver or Driver failed" << std::endl; - return 1; - } + if(aRes != 0) + { + Message::SendFail() << "DNaming_ComputeFun : No Driver or Driver failed"; + return 1; + } #ifdef OCCT_DEBUG std::cout <<"DNaming_ComputeFun : function from label " << theArg[2] << " is recomputed" << std::endl; #endif return 0; } } - std::cout << "DNaming_ComputeFun : Error" << std::endl; + Message::SendFail() << "DNaming_ComputeFun : Error"; return 1; } @@ -723,7 +725,7 @@ } } //### } - std::cout << "DNaming_AttachShape : Error" << std::endl; + Message::SendFail() << "DNaming_AttachShape : Error"; return 1; } @@ -788,7 +790,7 @@ } } } - std::cout << "DNaming_XAttachShape : Error" << std::endl; + Message::SendFail() << "DNaming_XAttachShape : Error"; return 1; } @@ -829,7 +831,7 @@ DDF::ReturnLabel(theDI, anObj->Label()); return 0; } - std::cout << "DNaming_AddCylinder : Error" << std::endl; + Message::SendFail() << "DNaming_AddCylinder : Error"; return 1; } @@ -862,7 +864,7 @@ return 0; } } - std::cout << "DNaming_CylRadius : Error" << std::endl; + Message::SendFail() << "DNaming_CylRadius : Error"; return 1; } @@ -895,7 +897,7 @@ DDF::ReturnLabel(theDI, aFun->Label()); return 0; } - std::cout << "DModel_AddFuse : Error" << std::endl; + Message::SendFail() << "DModel_AddFuse : Error"; return 1; } @@ -929,7 +931,7 @@ DDF::ReturnLabel(theDI, aFun->Label()); return 0; } - std::cout << "DModel_AddCut : Error" << std::endl; + Message::SendFail() << "DModel_AddCut : Error"; return 1; } @@ -962,7 +964,7 @@ DDF::ReturnLabel(theDI, aFun->Label()); return 0; } - std::cout << "DModel_AddComm : Error" << std::endl; + Message::SendFail() << "DModel_AddComm : Error"; return 1; } @@ -994,7 +996,7 @@ DDF::ReturnLabel(theDI, aFun->Label()); return 0; } - std::cout << "DModel_AddSection : Error" << std::endl; + Message::SendFail() << "DModel_AddSection : Error"; return 1; } @@ -1007,7 +1009,7 @@ const char** theArg) { if (theNb < 5) { - std::cout<<"DNaming_AddFillet(): Wrong number of arguments"<Label()); return 0; } - std::cout << "DNaming_Translate : Error" << std::endl; + Message::SendFail() << "DNaming_Translate : Error"; return 1; } //======================================================================= @@ -1118,7 +1120,7 @@ DDF::ReturnLabel(di, aFun->Label()); return 0; } - std::cout << "DNaming_PTranslateAlongLine : Error" << std::endl; + Message::SendFail() << "DNaming_PTranslateAlongLine : Error"; return 1; } @@ -1157,7 +1159,7 @@ DDF::ReturnLabel(di, aFun->Label()); return 0; } - std::cout << "DNaming_PRotateRoundLine : Error" << std::endl; + Message::SendFail() << "DNaming_PRotateRoundLine : Error"; return 1; } @@ -1190,7 +1192,7 @@ DDF::ReturnLabel(di, aFun->Label()); return 0; } - std::cout << "DNaming_PMirrorObject : Error" << std::endl; + Message::SendFail() << "DNaming_PMirrorObject : Error"; return 1; } //======================================================================= @@ -1202,7 +1204,7 @@ const char** theArg) { if (theNb < 5 ) { - std::cout<<"DNaming_AddPrism(): Wrong number of arguments"<Label()); return 0; } - std::cout << "DNaming_AddPoint : Error" << std::endl; + + Message::SendFail() << "DNaming_AddPoint : Error"; return 1; } @@ -1504,7 +1507,8 @@ DDF::ReturnLabel(theDI, anObj->Label()); return 0; } - std::cout << "DNaming_AddPoint : Error" << std::endl; + + Message::SendFail() << "DNaming_AddPoint : Error"; return 1; } @@ -1558,7 +1562,8 @@ return 0; } } - std::cout << "DNaming_PntOffset : Error" << std::endl; + + Message::SendFail() << "DNaming_PntOffset : Error"; return 1; } @@ -1572,7 +1577,7 @@ const char** theArg) { if (theNb < 5) { - std::cout<<"DNaming_AddLine3D: Wrong number of arguments"<= 3) { - Handle(TDocStd_Document) D; - if (!DDocStd::GetDocument(arg[1],D)) return 1; - TDF_Label L; - if (!DDF::FindLabel(D->GetData(),arg[2],L)) return 1; + if (nb != 3 && nb != 4) + { + std::cout << "Syntax error: wrong number of arguments\n"; + return 1; + } + + Handle(TDocStd_Document) D; + if (!DDocStd::GetDocument (arg[1], D)) + { + std::cout << "Syntax error: '" << arg[1] << "' is not a document\n"; + return 1; + } + + TDF_Label L; + if (!DDF::FindLabel (D->GetData(), arg[2], L)) + { + std::cout << "Syntax error: '" << arg[2] << "' label cannot be found in the document\n"; + return 1; + } - Handle(TPrsStd_AISViewer) viewer; - if( !TPrsStd_AISViewer::Find(L, viewer) ) return 1; + Handle(TPrsStd_AISViewer) viewer; + Handle(TPrsStd_AISPresentation) prs; + if (!TPrsStd_AISViewer::Find (L, viewer) + ||!L.FindAttribute (TPrsStd_AISPresentation::GetID(), prs)) + { + std::cout << "Syntax error: '" << arg[2] << "' label has no presentation\n"; + return 1; + } - Handle(TPrsStd_AISPresentation) prs; - if(L.FindAttribute( TPrsStd_AISPresentation::GetID(), prs) ) { - if( nb == 4 ) { - prs->SetColor((Quantity_NameOfColor)Draw::Atoi(arg[3])); - TPrsStd_AISViewer::Update(L); - } - else - if (prs->HasOwnColor()){ - di << "Color = " << prs->Color() << "\n"; - di<Color(); - } - else{ - di << "DPrsStd_AISColor: Warning : Color wasn't set\n"; - di<<(-1); - } - return 0; + if (nb == 4) + { + Quantity_NameOfColor aColor = Quantity_NOC_BLACK; + if (!Quantity_Color::ColorFromName (arg[3], aColor)) + { + std::cout << "Syntax error: unknown color '" << arg[3] << "'\n"; + return 1; } + prs->SetColor (aColor); + TPrsStd_AISViewer::Update (L); + } + else if (prs->HasOwnColor()) + { + di << "Color = " << Quantity_Color::StringName (prs->Color()) << "\n"; + di << Quantity_Color::StringName (prs->Color()); + } + else + { + di << "DPrsStd_AISColor: Warning : Color wasn't set\n"; + di << (-1); } - di << "DPrsStd_AISColor : Error" << "\n"; - return 1; + return 0; } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/Draft/Draft_Modification_1.cxx opencascade-7.5.1+dfsg1/src/Draft/Draft_Modification_1.cxx --- opencascade-7.4.1+dfsg1/src/Draft/Draft_Modification_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draft/Draft_Modification_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -2169,9 +2169,8 @@ Standard_Real Udeb, Ufin; ProjCurve.Bounds(1, Udeb, Ufin); Standard_Integer MaxSeg = 20 + HProjector->NbIntervals(GeomAbs_C3); - Approx_CurveOnSurface appr( HProjector, hsur2, Udeb, Ufin, Tol, - GeomAbs_C1, 10, MaxSeg, - Standard_False, Standard_False ); + Approx_CurveOnSurface appr(HProjector, hsur2, Udeb, Ufin, Tol); + appr.Perform(MaxSeg, 10, GeomAbs_C1, Standard_False, Standard_False); Einf.ChangeSecondPC() = appr.Curve2d(); Einf.ChangeGeometry() = appr.Curve3d(); Einf.SetNewGeometry( Standard_True ); diff -Nru opencascade-7.4.1+dfsg1/src/Draw/CommandWindow.cxx opencascade-7.5.1+dfsg1/src/Draw/CommandWindow.cxx --- opencascade-7.4.1+dfsg1/src/Draw/CommandWindow.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/CommandWindow.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -185,8 +185,9 @@ GetCaretPos (&pos); SendMessageW (hWnd, EM_REPLACESEL, 0, (LPARAM )THE_PROMPT); // Display the command in the console - std::wcout << aCmdBuffer << std::endl; - //TCollection_AsciiString aCmdUtf8 (aCmdBuffer + sizeof(THE_PROMPT) / sizeof(wchar_t) - 1); + //std::wcout << aCmdBuffer << std::endl; // wcout does not work well with UTF-8 + TCollection_AsciiString aCmdUtf8 (aCmdBuffer + sizeof(THE_PROMPT) / sizeof(wchar_t) - 1); + std::cout << aCmdUtf8.ToCString() << std::endl; //Draw_Interprete (aCmdUtf8.ToCString()); //if (toExit) { DestroyProc (hWnd); } wcscpy_s (console_command, aCmdBuffer + sizeof(THE_PROMPT) / sizeof(wchar_t) - 1); diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_BasicCommands.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_BasicCommands.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_BasicCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_BasicCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -258,9 +259,9 @@ { if (n != 2 && n != 3) { - std::cout << "Enable or disable logging: " << a[0] << " {on|off}" << std::endl; - std::cout << "Reset log: " << a[0] << " reset" << std::endl; - std::cout << "Get log content: " << a[0] << " get" << std::endl; + Message::SendFail() << "Enable or disable logging: " << a[0] << " {on|off}\n" + << "Reset log: " << a[0] << " reset\n" + << "Get log content: " << a[0] << " get"; return 1; } @@ -291,7 +292,7 @@ di << (di.GetDoLog() ? "on" : "off"); } else { - std::cout << "Unrecognized option(s): " << a[1] << std::endl; + Message::SendFail() << "Unrecognized option(s): " << a[1]; return 1; } return 0; @@ -301,7 +302,7 @@ { if (n != 2) { - std::cout << "Enable or disable echoing: " << a[0] << " {on|off}" << std::endl; + Message::SendFail() << "Enable or disable echoing: " << a[0] << " {on|off}"; return 1; } @@ -314,7 +315,7 @@ di.SetDoEcho (Standard_False); } else { - std::cout << "Unrecognized option: " << a[1] << std::endl; + Message::SendFail() << "Unrecognized option: " << a[1]; return 1; } return 0; @@ -362,6 +363,11 @@ #else di << "OpenGL: desktop\n"; #endif +#ifdef HAVE_OPENVR + di << "OpenVR enabled (HAVE_OPENVR)\n"; +#else + di << "OpenVR disabled\n"; +#endif #ifdef HAVE_RAPIDJSON di << "RapidJSON enabled (HAVE_RAPIDJSON)\n"; #else @@ -537,13 +543,24 @@ } #endif -#ifdef _WIN32 -static Standard_Integer cpulimit(Draw_Interpretor&, Standard_Integer n, const char** a) +// Returns time in seconds defined by the argument string, +// multiplied by factor defined in environment variable +// CSF_CPULIMIT_FACTOR (if it exists, 1 otherwise) +static clock_t GetCpuLimit (const Standard_CString theParam) { -#else + clock_t aValue = Draw::Atoi (theParam); + + OSD_Environment aEnv("CSF_CPULIMIT_FACTOR"); + TCollection_AsciiString aEnvStr = aEnv.Value(); + if (!aEnvStr.IsEmpty()) + { + aValue *= Draw::Atoi (aEnvStr.ToCString()); + } + return aValue; +} + static Standard_Integer cpulimit(Draw_Interpretor& di, Standard_Integer n, const char** a) { -#endif static int aFirst = 1; #ifdef _WIN32 // Windows specific code @@ -553,7 +570,7 @@ if (n <= 1){ CPU_LIMIT = RLIM_INFINITY; } else { - CPU_LIMIT = Draw::Atoi (a[1]); + CPU_LIMIT = GetCpuLimit (a[1]); Standard_Real anUserSeconds, aSystemSeconds; OSD_Chronometer::GetProcessCPU (anUserSeconds, aSystemSeconds); CPU_CURRENT = clock_t(anUserSeconds + aSystemSeconds); @@ -573,7 +590,7 @@ if (n <= 1) rlp.rlim_cur = RLIM_INFINITY; else - rlp.rlim_cur = Draw::Atoi(a[1]); + rlp.rlim_cur = GetCpuLimit (a[1]); CPU_LIMIT = rlp.rlim_cur; int status; @@ -597,10 +614,10 @@ pthread_create(&cpulimitThread, NULL, CpuFunc, NULL); } #endif + di << "CPU and elapsed time limit set to " << (double)CPU_LIMIT << " seconds"; return 0; } - //======================================================================= //function : mallochook //purpose : @@ -745,7 +762,7 @@ else if ( ! strcmp (cat, "LC_TIME") ) category = LC_TIME; else { - std::cout << "Error: cannot recognize argument " << cat << " as one of LC_ macros" << std::endl; + Message::SendFail() << "Error: cannot recognize argument " << cat << " as one of LC_ macros"; return 1; } } @@ -767,50 +784,64 @@ Standard_Integer theArgNb, const char** theArgVec) { - OSD_MemInfo aMemInfo; if (theArgNb <= 1) { + OSD_MemInfo aMemInfo; theDI << aMemInfo.ToString(); return 0; } + NCollection_Map aCounters; for (Standard_Integer anIter = 1; anIter < theArgNb; ++anIter) { TCollection_AsciiString anArg (theArgVec[anIter]); anArg.LowerCase(); if (anArg == "virt" || anArg == "v") { - theDI << Standard_Real (aMemInfo.Value (OSD_MemInfo::MemVirtual)) << " "; + aCounters.Add (OSD_MemInfo::MemVirtual); } else if (anArg == "heap" || anArg == "h") { - theDI << Standard_Real (aMemInfo.Value (OSD_MemInfo::MemHeapUsage)) << " "; + aCounters.Add (OSD_MemInfo::MemHeapUsage); } else if (anArg == "wset" || anArg == "w") { - theDI << Standard_Real (aMemInfo.Value (OSD_MemInfo::MemWorkingSet)) << " "; + aCounters.Add (OSD_MemInfo::MemWorkingSet); } else if (anArg == "wsetpeak") { - theDI << Standard_Real (aMemInfo.Value (OSD_MemInfo::MemWorkingSetPeak)) << " "; + aCounters.Add (OSD_MemInfo::MemWorkingSetPeak); } else if (anArg == "swap") { - theDI << Standard_Real (aMemInfo.Value (OSD_MemInfo::MemSwapUsage)) << " "; + aCounters.Add (OSD_MemInfo::MemSwapUsage); } else if (anArg == "swappeak") { - theDI << Standard_Real (aMemInfo.Value (OSD_MemInfo::MemSwapUsagePeak)) << " "; + aCounters.Add (OSD_MemInfo::MemSwapUsagePeak); } else if (anArg == "private") { - theDI << Standard_Real (aMemInfo.Value (OSD_MemInfo::MemPrivate)) << " "; + aCounters.Add (OSD_MemInfo::MemPrivate); } else { std::cerr << "Unknown argument '" << theArgVec[anIter] << "'!\n"; } } + + OSD_MemInfo aMemInfo (Standard_False); + aMemInfo.SetActive (Standard_False); + for (NCollection_Map::Iterator aCountersIt (aCounters); aCountersIt.More(); aCountersIt.Next()) + { + aMemInfo.SetActive (aCountersIt.Value(), Standard_True); + } + aMemInfo.Update(); + + for (NCollection_Map::Iterator aCountersIt (aCounters); aCountersIt.More(); aCountersIt.Next()) + { + theDI << Standard_Real (aMemInfo.Value (aCountersIt.Value())) << " "; + } theDI << "\n"; return 0; } @@ -853,7 +884,7 @@ const Standard_Integer aVal = Draw::Atoi (theArgVec[++anIter]); if (aVal <= 0 || aVal > aDefPool->NbThreads()) { - std::cout << "Syntax error: maximum number of threads to use should be <= of threads in the pool\n"; + Message::SendFail() << "Syntax error: maximum number of threads to use should be <= of threads in the pool"; return 1; } aDefPool->SetNbDefaultThreadsToLaunch (aVal); @@ -884,7 +915,7 @@ } else { - std::cout << "Syntax error: unknown argument '" << anArg << "'\n"; + Message::SendFail() << "Syntax error: unknown argument '" << anArg << "'"; return 1; } } @@ -958,7 +989,7 @@ } else { - std::cout << "Syntax error: unknown argument '" << anArg << "'\n"; + Message::SendFail() << "Syntax error: unknown argument '" << anArg << "'"; return 1; } } @@ -992,7 +1023,7 @@ Message_Gravity aLevel = Message_Info; if (theArgNb < 1 || theArgNb > 2) { - std::cout << "Error: wrong number of arguments! See usage:\n"; + Message::SendFail() << "Error: wrong number of arguments! See usage:"; theDI.PrintHelp (theArgVec[0]); return 1; } @@ -1023,7 +1054,7 @@ } else { - std::cout << "Error: unknown gravity '" << theArgVec[1] << "'!\n"; + Message::SendFail() << "Error: unknown gravity '" << theArgVec[1] << "'"; return 1; } } @@ -1031,14 +1062,14 @@ Handle(Message_Messenger) aMessenger = Message::DefaultMessenger(); if (aMessenger.IsNull()) { - std::cout << "Error: default messenger is unavailable!\n"; + Message::SendFail() << "Error: default messenger is unavailable"; return 1; } Message_SequenceOfPrinters& aPrinters = aMessenger->ChangePrinters(); if (aPrinters.Length() < 1) { - std::cout << "Error: no printers registered in default Messenger!\n"; + Message::SendFail() << "Error: no printers registered in default Messenger"; return 0; } @@ -1073,6 +1104,104 @@ return 0; } +//============================================================================== +//function : dputs +//purpose : +//============================================================================== +static int dputs (Draw_Interpretor& theDI, + Standard_Integer theArgNb, + const char** theArgVec) +{ + Standard_OStream* aStream = &std::cout; + bool isNoNewline = false, toIntense = false; + Message_ConsoleColor aColor = Message_ConsoleColor_Default; + for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) + { + TCollection_AsciiString anArg (theArgVec[anArgIter]); + anArg.LowerCase(); + if (anArg == "-nonewline") + { + isNoNewline = true; + } + else if (anArg == "stdcout") + { + aStream = &std::cout; + } + else if (anArg == "stdcerr") + { + aStream = &std::cerr; + } + else if (anArg == "-intense") + { + toIntense = true; + } + else if (anArg == "-black") + { + aColor = Message_ConsoleColor_Black; + } + else if (anArg == "-white") + { + aColor = Message_ConsoleColor_White; + } + else if (anArg == "-red") + { + aColor = Message_ConsoleColor_Red; + } + else if (anArg == "-blue") + { + aColor = Message_ConsoleColor_Blue; + } + else if (anArg == "-green") + { + aColor = Message_ConsoleColor_Green; + } + else if (anArg == "-yellow") + { + aColor = Message_ConsoleColor_Yellow; + } + else if (anArg == "-cyan") + { + aColor = Message_ConsoleColor_Cyan; + } + else if (anArg == "-magenta") + { + aColor = Message_ConsoleColor_Magenta; + } + else if (anArgIter + 1 == theArgNb) + { + if (!theDI.ToColorize()) + { + toIntense = false; + aColor = Message_ConsoleColor_Default; + } + if (toIntense || aColor != Message_ConsoleColor_Default) + { + Message_PrinterOStream::SetConsoleTextColor (aStream, aColor, toIntense); + } + + *aStream << theArgVec[anArgIter]; + if (!isNoNewline) + { + *aStream << std::endl; + } + + if (toIntense || aColor != Message_ConsoleColor_Default) + { + Message_PrinterOStream::SetConsoleTextColor (aStream, Message_ConsoleColor_Default, false); + } + return 0; + } + else + { + Message::SendFail() << "Syntax error at '" << anArg << "'"; + return 1; + } + } + + Message::SendFail() << "Syntax error: wrong number of arguments"; + return 1; +} + void Draw::BasicCommands(Draw_Interpretor& theCommands) { static Standard_Boolean Done = Standard_False; @@ -1134,4 +1263,10 @@ __FILE__,dversion,g); theCommands.Add("dlocale", "set and / or query locate of C subsystem (function setlocale())", __FILE__,dlocale,g); + + theCommands.Add("dputs", + "dputs [-intense] [-black|-white|-red|-green|-blue|-yellow|-cyan|-magenta]" + "\n\t\t: [-nonewline] [stdcout|stdcerr] text" + "\n\t\t: Puts text into console output", + __FILE__,dputs,g); } diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Commands.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Commands.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Commands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Commands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,30 +17,13 @@ #include #include -#include #include -#include -#include -#include #include void Draw::Commands (Draw_Interpretor& theCommands) { - static Standard_Boolean isFirstTime = Standard_True; - if (isFirstTime) - { - // override default std::cout printer by draw interpretor printer - const Handle(Message_Messenger)& aMsgMgr = Message::DefaultMessenger(); - if (!aMsgMgr.IsNull()) - { - aMsgMgr->RemovePrinters (STANDARD_TYPE (Message_PrinterOStream)); - aMsgMgr->RemovePrinters (STANDARD_TYPE (Draw_Printer)); - aMsgMgr->AddPrinter (new Draw_Printer (theCommands)); - } - isFirstTime = Standard_False; - } - Draw::BasicCommands(theCommands); + Draw::MessageCommands(theCommands); Draw::VariableCommands(theCommands); Draw::GraphicCommands(theCommands); Draw::PloadCommands(theCommands); diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -37,6 +40,9 @@ #include #include + +#include + // on MSVC, use #pragma to define name of the Tcl library to link with, // depending on Tcl version number #ifdef _MSC_VER @@ -53,7 +59,7 @@ Standard_EXPORT Draw_Viewer dout; Standard_EXPORT Draw_Interpretor theCommands; -Standard_EXPORT Standard_Boolean Draw_Batch; +Standard_EXPORT Standard_Boolean Draw_Batch = Standard_False; Standard_EXPORT Standard_Boolean Draw_Spying = Standard_False; Standard_EXPORT Standard_Boolean Draw_Chrono = Standard_False; Standard_EXPORT Standard_Boolean Draw_VirtualWindows = Standard_False; @@ -68,7 +74,7 @@ static std::ostream spystream(&Draw_Spyfile); -static Handle(Draw_ProgressIndicator) PInd = NULL; +static Handle(Draw_ProgressIndicator) global_Progress = NULL; Standard_EXPORT Standard_Boolean Draw_Interprete(const char* command); // true if complete command @@ -234,14 +240,14 @@ //function : //purpose : Set/Get Progress Indicator //======================================================================= -void Draw::SetProgressBar(const Handle(Draw_ProgressIndicator)& thePI) +void Draw::SetProgressBar(const Handle(Draw_ProgressIndicator)& theProgress) { - PInd = thePI; + global_Progress = theProgress; } Handle(Draw_ProgressIndicator) Draw::GetProgressBar() { - return PInd; + return global_Progress; } #ifndef _WIN32 @@ -419,6 +425,7 @@ // standard commands // ***************************************************************** Draw::BasicCommands(theCommands); + Draw::MessageCommands(theCommands); Draw::VariableCommands(theCommands); Draw::UnitCommands(theCommands); if (!Draw_Batch) Draw::GraphicCommands(theCommands); @@ -493,7 +500,13 @@ } // read commands from file - if (!aRunFile.IsEmpty()) { + if (!aRunFile.IsEmpty()) + { + if (!isInteractiveForced) + { + // disable console messages colorization to avoid spoiling log with color codes + theCommands.SetToColorize (Standard_False); + } ReadInitFile (aRunFile); // provide a clean exit, this is useful for some analysis tools if ( ! isInteractiveForced ) @@ -618,12 +631,15 @@ if (*theCommands.Result()) { - #ifdef _WIN32 - const TCollection_ExtendedString aResWide (theCommands.Result()); - std::wcout << aResWide.ToWideString() << std::endl; - #else + if (c > 0 && theCommands.ToColorize()) + { + Message_PrinterOStream::SetConsoleTextColor (&std::cout, Message_ConsoleColor_Red, true); + } std::cout << theCommands.Result() << std::endl; - #endif + if (c > 0 && theCommands.ToColorize()) + { + Message_PrinterOStream::SetConsoleTextColor (&std::cout, Message_ConsoleColor_Default, false); + } } if (Draw_Chrono && hadchrono) { @@ -661,31 +677,29 @@ //================================================================================= // //================================================================================= -void Draw::Load(Draw_Interpretor& theDI, const TCollection_AsciiString& theKey, - const TCollection_AsciiString& theResourceFileName, - TCollection_AsciiString& theDefaultsDirectory, - TCollection_AsciiString& theUserDefaultsDirectory, - const Standard_Boolean Verbose ) { - +void Draw::Load (Draw_Interpretor& theDI, + const TCollection_AsciiString& theKey, + const TCollection_AsciiString& theResourceFileName, + const TCollection_AsciiString& theDefaultsDirectory, + const TCollection_AsciiString& theUserDefaultsDirectory, + const Standard_Boolean theIsVerbose) +{ static Plugin_MapOfFunctions theMapOfFunctions; - OSD_Function f; - - if(!theMapOfFunctions.IsBound(theKey)) { - - Handle(Resource_Manager) aPluginResource = new Resource_Manager(theResourceFileName.ToCString(), theDefaultsDirectory, theUserDefaultsDirectory, Verbose); - - if(!aPluginResource->Find(theKey.ToCString())) { - Standard_SStream aMsg; aMsg << "Could not find the resource:"; - aMsg << theKey.ToCString()<< std::endl; - std::cout << "could not find the resource:"<Find (theKey, aPluginLibrary)) + { + Message::SendFail() << "could not find the resource:" << theKey; + Standard_SStream aMsg; aMsg << "Could not find the resource:" << theKey << std::endl; + throw Draw_Failure (aMsg.str().c_str()); } - TCollection_AsciiString aPluginLibrary(""); #if !defined(_WIN32) || defined(__MINGW32__) - aPluginLibrary += "lib"; + aPluginLibrary = TCollection_AsciiString ("lib") + aPluginLibrary; #endif - aPluginLibrary += aPluginResource->Value(theKey.ToCString()); #ifdef _WIN32 aPluginLibrary += ".dll"; #elif __APPLE__ @@ -695,37 +709,251 @@ #else aPluginLibrary += ".so"; #endif - OSD_SharedLibrary aSharedLibrary(aPluginLibrary.ToCString()); - if(!aSharedLibrary.DlOpen(OSD_RTLD_LAZY)) { - TCollection_AsciiString error(aSharedLibrary.DlError()); - Standard_SStream aMsg; aMsg << "Could not open: "; - aMsg << aPluginResource->Value(theKey.ToCString()); - aMsg << "; reason: "; - aMsg << error.ToCString(); + OSD_SharedLibrary aSharedLibrary (aPluginLibrary.ToCString()); + if (!aSharedLibrary.DlOpen (OSD_RTLD_LAZY)) + { + const TCollection_AsciiString anError (aSharedLibrary.DlError()); + Standard_SStream aMsg; + aMsg << "Could not open: " << aPluginLibrary << "; reason: " << anError; #ifdef OCCT_DEBUG - std::cout << "could not open: " << aPluginResource->Value(theKey.ToCString())<< " ; reason: "<< error.ToCString() << std::endl; + std::cout << "could not open: " << aPluginLibrary << " ; reason: "<< anError << std::endl; #endif throw Draw_Failure(aMsg.str().c_str()); } - f = aSharedLibrary.DlSymb("PLUGINFACTORY"); - if( f == NULL ) { - TCollection_AsciiString error(aSharedLibrary.DlError()); - Standard_SStream aMsg; aMsg << "Could not find the factory in: "; - aMsg << aPluginResource->Value(theKey.ToCString()); - aMsg << error.ToCString(); + + aFunc = aSharedLibrary.DlSymb ("PLUGINFACTORY"); + if (aFunc == NULL) + { + const TCollection_AsciiString anError (aSharedLibrary.DlError()); + Standard_SStream aMsg; + aMsg << "Could not find the factory in: " << aPluginLibrary << anError; throw Draw_Failure(aMsg.str().c_str()); } - theMapOfFunctions.Bind(theKey, f); + theMapOfFunctions.Bind (theKey, aFunc); } - else - f = theMapOfFunctions(theKey); - -// void (*fp) (Draw_Interpretor&, const TCollection_AsciiString&) = NULL; -// fp = (void (*)(Draw_Interpretor&, const TCollection_AsciiString&)) f; -// (*fp) (theDI, theKey); void (*fp) (Draw_Interpretor&) = NULL; - fp = (void (*)(Draw_Interpretor&)) f; + fp = (void (*)(Draw_Interpretor&) )aFunc; (*fp) (theDI); +} + +namespace +{ + const Standard_Integer THE_MAX_INTEGER_COLOR_COMPONENT = 255; + const Standard_ShortReal THE_MAX_REAL_COLOR_COMPONENT = 1.0f; + //! Parses string and get an integer color component (only values within range 0 .. 255 are allowed) + //! @param theColorComponentString the string representing the color component + //! @param theIntegerColorComponent an integer color component that is a result of parsing + //! @return true if parsing was successful, or false otherwise + static bool parseNumericalColorComponent (const Standard_CString theColorComponentString, + Standard_Integer& theIntegerColorComponent) + { + Standard_Integer anIntegerColorComponent; + if (!Draw::ParseInteger (theColorComponentString, anIntegerColorComponent)) + { + return false; + } + if ((anIntegerColorComponent < 0) || (anIntegerColorComponent > THE_MAX_INTEGER_COLOR_COMPONENT)) + { + return false; + } + theIntegerColorComponent = anIntegerColorComponent; + return true; + } + + //! Parses the string and gets a real color component from it (only values within range 0.0 .. 1.0 are allowed) + //! @param theColorComponentString the string representing the color component + //! @param theRealColorComponent a real color component that is a result of parsing + //! @return true if parsing was successful, or false otherwise + static bool parseNumericalColorComponent (const Standard_CString theColorComponentString, + Standard_ShortReal& theRealColorComponent) + { + Standard_Real aRealColorComponent; + if (!Draw::ParseReal (theColorComponentString, aRealColorComponent)) + { + return false; + } + const Standard_ShortReal aShortRealColorComponent = static_cast (aRealColorComponent); + if ((aShortRealColorComponent < 0.0f) || (aShortRealColorComponent > THE_MAX_REAL_COLOR_COMPONENT)) + { + return false; + } + theRealColorComponent = aShortRealColorComponent; + return true; + } + + //! Parses the string and gets a real color component from it (integer values 2 .. 255 are scaled to the 0.0 .. 1.0 + //! range, values 0 and 1 are leaved as they are) + //! @param theColorComponentString the string representing the color component + //! @param theColorComponent a color component that is a result of parsing + //! @return true if parsing was successful, or false otherwise + static bool parseColorComponent (const Standard_CString theColorComponentString, + Standard_ShortReal& theColorComponent) + { + Standard_Integer anIntegerColorComponent; + if (parseNumericalColorComponent (theColorComponentString, anIntegerColorComponent)) + { + if (anIntegerColorComponent == 1) + { + theColorComponent = THE_MAX_REAL_COLOR_COMPONENT; + } + else + { + theColorComponent = anIntegerColorComponent * 1.0f / THE_MAX_INTEGER_COLOR_COMPONENT; + } + return true; + } + return parseNumericalColorComponent (theColorComponentString, theColorComponent); + } + + //! Parses the array of strings and gets an integer color (only values within range 0 .. 255 are allowed and at least + //! one of components must be greater than 1) + //! @tparam TheNumber the type of resulting color vector elements + //! @param theNumberOfColorComponents the number of color components + //! @param theColorComponentStrings the array of strings representing color components + //! @param theNumericalColor a 4-component vector that is a result of parsing + //! @return true if parsing was successful, or false otherwise + template + static bool parseNumericalColor (Standard_Integer& theNumberOfColorComponents, + const char* const* const theColorComponentStrings, + NCollection_Vec4& theNumericalColor) + { + for (Standard_Integer aColorComponentIndex = 0; aColorComponentIndex < theNumberOfColorComponents; + ++aColorComponentIndex) + { + const char* const aColorComponentString = theColorComponentStrings[aColorComponentIndex]; + TheNumber aNumericalColorComponent; + if (parseNumericalColorComponent (aColorComponentString, aNumericalColorComponent)) + { + theNumericalColor[aColorComponentIndex] = aNumericalColorComponent; + } + else + { + if (aColorComponentIndex == 3) + { + theNumberOfColorComponents = 3; + } + else + { + return false; + } + } + } + return true; + } + + //! Parses an array of strings and get an integer color (only values within range 0 .. 255 are allowed and at least + //! one of components must be greater than 1) + //! @param theNumberOfColorComponents the number of color components + //! @param theColorComponentStrings the array of strings representing color components + //! @param theColor a color that is a result of parsing + //! @return true if parsing was successful, or false otherwise + static bool parseIntegerColor (Standard_Integer& theNumberOfColorComponents, + const char* const* const theColorComponentStrings, + Quantity_ColorRGBA& theColor) + { + const Standard_Integer THE_COLOR_COMPONENT_NOT_PARSED = -1; + NCollection_Vec4 anIntegerColor (THE_COLOR_COMPONENT_NOT_PARSED); + if (!parseNumericalColor (theNumberOfColorComponents, theColorComponentStrings, anIntegerColor) + || anIntegerColor.maxComp() <= 1) + { + return false; + } + if (anIntegerColor.a() == THE_COLOR_COMPONENT_NOT_PARSED) + { + anIntegerColor.a() = THE_MAX_INTEGER_COLOR_COMPONENT; + } + + const NCollection_Vec4 aRealColor = NCollection_Vec4 (anIntegerColor) / static_cast (THE_MAX_INTEGER_COLOR_COMPONENT); + theColor = Quantity_ColorRGBA (Quantity_ColorRGBA::Convert_sRGB_To_LinearRGB (aRealColor)); + return true; + } + + //! Parses an array of strings and get a real color (only values within range 0.0 .. 1.0 are allowed) + //! @param theNumberOfColorComponents the number of color components + //! @param theColorComponentStrings the array of strings representing color components + //! @param theColor a color that is a result of parsing + //! @return true if parsing was successful, or false otherwise + static bool parseRealColor (Standard_Integer& theNumberOfColorComponents, + const char* const* const theColorComponentStrings, + Quantity_ColorRGBA& theColor) + { + NCollection_Vec4 aRealColor (THE_MAX_REAL_COLOR_COMPONENT); + if (!parseNumericalColor (theNumberOfColorComponents, theColorComponentStrings, aRealColor)) + { + return false; + } + theColor = Quantity_ColorRGBA (aRealColor); + return true; + } +} + +//======================================================================= +// function : parseColor +// purpose : +//======================================================================= +Standard_Integer Draw::parseColor (const Standard_Integer theArgNb, + const char* const* const theArgVec, + Quantity_ColorRGBA& theColor, + const bool theToParseAlpha) +{ + if ((theArgNb >= 1) && Quantity_ColorRGBA::ColorFromHex (theArgVec[0], theColor, !theToParseAlpha)) + { + return 1; + } + if (theArgNb >= 1 && Quantity_ColorRGBA::ColorFromName (theArgVec[0], theColor)) + { + if (theArgNb >= 2 && theToParseAlpha) + { + const Standard_CString anAlphaStr = theArgVec[1]; + Standard_ShortReal anAlphaComponent; + if (parseColorComponent (anAlphaStr, anAlphaComponent)) + { + theColor.SetAlpha (anAlphaComponent); + return 2; + } + } + return 1; + } + if (theArgNb >= 3) + { + const Standard_Integer aNumberOfColorComponentsToParse = Min (theArgNb, theToParseAlpha ? 4 : 3); + Standard_Integer aNumberOfColorComponentsParsed = aNumberOfColorComponentsToParse; + if (parseIntegerColor (aNumberOfColorComponentsParsed, theArgVec, theColor)) + { + return aNumberOfColorComponentsParsed; + } + aNumberOfColorComponentsParsed = aNumberOfColorComponentsToParse; + if (parseRealColor (aNumberOfColorComponentsParsed, theArgVec, theColor)) + { + return aNumberOfColorComponentsParsed; + } + return 0; + } + return 0; +} + +//======================================================================= +//function : ParseOnOff +//purpose : +//======================================================================= +Standard_Boolean Draw::ParseOnOff (Standard_CString theArg, + Standard_Boolean& theIsOn) +{ + TCollection_AsciiString aFlag(theArg); + aFlag.LowerCase(); + if (aFlag == "on" + || aFlag == "1") + { + theIsOn = Standard_True; + return Standard_True; + } + else if (aFlag == "off" + || aFlag == "0") + { + theIsOn = Standard_False; + return Standard_True; + } + return Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Drawable3D.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Drawable3D.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Drawable3D.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Drawable3D.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,10 @@ //purpose : //======================================================================= Draw_Drawable3D::Draw_Drawable3D() : + myXmin(0.0), + myXmax(0.0), + myYmin(0.0), + myYmax(0.0), isVisible(Standard_False), isProtected(Standard_False), myName(NULL) diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_GraphicCommands.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_GraphicCommands.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_GraphicCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_GraphicCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -195,12 +196,12 @@ id = atoi(argv[1]); if ((id < 0) || (id >= MAXVIEW)) { - std::cout << "Incorrect view-id, must be in 0.."< -#include +#include +#include #include -#include -#include -#include -#include -#include -class TCollection_AsciiString; -class Draw_Drawable3D; -class Draw_ProgressIndicator; class Draw_Drawable3D; -class Draw_Drawable2D; -class Draw_Color; -class Draw_Display; -class Draw_Segment3D; -class Draw_Segment2D; -class Draw_Marker3D; -class Draw_Marker2D; -class Draw_Axis3D; -class Draw_Axis2D; -class Draw_Text3D; -class Draw_Text2D; -class Draw_Circle3D; -class Draw_Circle2D; -class Draw_Number; -class Draw_Chronometer; -class Draw_Grid; -class Draw_Box; class Draw_ProgressIndicator; -class Draw_Printer; - //! MAQUETTE DESSIN MODELISATION class Draw @@ -58,9 +31,22 @@ DEFINE_STANDARD_ALLOC - - Standard_EXPORT static void Load (Draw_Interpretor& theDI, const TCollection_AsciiString& theKey, const TCollection_AsciiString& theResourceFileName, TCollection_AsciiString& theDefaultsDirectory, TCollection_AsciiString& theUserDefaultsDirectory, const Standard_Boolean Verbose = Standard_False); - + //! (Re)Load a Draw Harness plugin. + //! @param theDI [in] [out] Tcl interpretor to append loaded commands + //! @param theKey [in] plugin code name to be resolved in resource file + //! @param theResourceFileName [in] description file name + //! @param theDefaultsDirectory [in] default folder for looking description file + //! @param theUserDefaultsDirectory [in] user folder for looking description file + //! @param theIsVerbose [in] print verbose messages + Standard_EXPORT static void Load (Draw_Interpretor& theDI, + const TCollection_AsciiString& theKey, + const TCollection_AsciiString& theResourceFileName, + const TCollection_AsciiString& theDefaultsDirectory, + const TCollection_AsciiString& theUserDefaultsDirectory, + const Standard_Boolean theIsVerbose = Standard_False); + +public: //! @name Tcl variables management tools + //! Sets a variable. Display it if is true. Standard_EXPORT static void Set (const Standard_CString Name, const Handle(Draw_Drawable3D)& D, const Standard_Boolean Disp); @@ -91,15 +77,17 @@ //! Sets a TCL sting variable Standard_EXPORT static void Set (const Standard_CString Name, const Standard_CString val); + +public: //! @name argument parsing tools //! Converts numeric expression, that can involve DRAW //! variables, to real value. Standard_EXPORT static Standard_Real Atof (const Standard_CString Name); //! Converts the numeric expression, that can involve DRAW variables, to a real value - //! @param theExpressionString the strings that containes the expression involving DRAW variables to be parsed + //! @param theExpressionString the strings that contains the expression involving DRAW variables to be parsed //! @param theParsedRealValue a real value that is a result of parsing - //! @return true if parsing was successfull, or false otherwise + //! @return true if parsing was successful, or false otherwise Standard_EXPORT static bool ParseReal (const Standard_CString theExpressionString, Standard_Real& theParsedRealValue); //! Converts numeric expression, that can involve DRAW @@ -108,12 +96,91 @@ Standard_EXPORT static Standard_Integer Atoi (const Standard_CString Name); //! Converts the numeric expression, that can involve DRAW variables, to an integer value - //! @param theExpressionString the strings that containes the expression involving DRAW variables to be parsed + //! @param theExpressionString the strings that contains the expression involving DRAW variables to be parsed //! @param theParsedIntegerValue an integer value that is a result of parsing - //! @return true if parsing was successfull, or false otherwise + //! @return true if parsing was successful, or false otherwise Standard_EXPORT static bool ParseInteger (const Standard_CString theExpressionString, Standard_Integer& theParsedIntegerValue); + //! Parses RGB(A) color argument(s) specified within theArgVec[0], theArgVec[1], theArgVec[2] and theArgVec[3]. + //! Handles either color specified by name (single argument) or by RGB(A) components (3-4 arguments) in range 0..1. + //! The result is stored in theColor on success. + //! + //! Usage code sample for command argument in form "cmd -color {ColorName|R G B [A]|ColorHex}": + //! @code + //! for (int anArgIter = 1; anArgIter < theNbArgs; ++anArgIter) + //! { + //! TCollection_AsciiString aParam (theArgVec[anArgIter]); + //! aParam.LowerCase(); + //! if (aParam == "-color") + //! { + //! Quantity_ColorRGBA aColor; + //! Standard_Integer aNbParsed = Draw::ParseColor (theArgNb - anArgIter - 1, + //! theArgVec + anArgIter + 1, aColor); + //! anArgIter += aNbParsed; + //! if (aNbParsed == 0) { std::cerr << "Syntax error at '" << aParam << "'"; return 1; } + //! // process color + //! } + //! } + //! @endcode + //! + //! @param theArgNb [in] number of available arguments in theArgVec (array limits) + //! @param theArgVec [in] argument list + //! @param theColor [out] retrieved color + //! @return number of handled arguments (1, 2, 3 or 4) or 0 on syntax error + static Standard_Integer ParseColor (const Standard_Integer theArgNb, + const char* const* const theArgVec, + Quantity_ColorRGBA& theColor) + { + return parseColor (theArgNb, theArgVec, theColor, true); + } + + //! Parses RGB color argument(s). + //! @param theArgNb [in] number of available arguments in theArgVec (array limits) + //! @param theArgVec [in] argument list + //! @param theColor [out] retrieved color + //! @return number of handled arguments (1 or 3) or 0 on syntax error. + static Standard_Integer ParseColor (const Standard_Integer theArgNb, + const char* const* const theArgVec, + Quantity_Color& theColor) + { + Quantity_ColorRGBA anRgba; + const Standard_Integer aNbParsed = parseColor (theArgNb, theArgVec, anRgba, false); + if (aNbParsed != 0) + { + theColor = anRgba.GetRGB(); + } + return aNbParsed; + } + + //! Parses boolean argument. Handles either flag specified by 0|1 or on|off. + //! + //! Usage code sample for command argument in form "cmd -usefeature [on|off|1|0]=on": + //! @code + //! for (int anArgIter = 1; anArgIter < theNbArgs; ++anArgIter) + //! { + //! TCollection_AsciiString aParam (theArgVec[anArgIter]); + //! aParam.LowerCase(); + //! if (aParam == "-usefeature") + //! { + //! bool toUseFeature = true; + //! if (anArgIter + 1 < theNbArgs && Draw::ParseOnOff (theArgVec[anArgIter + 1])) + //! { + //! ++anArgIter; + //! } + //! // process feature + //! } + //! } + //! @endcode + //! + //! @param theArg [in] argument value + //! @param theIsOn [out] decoded Boolean flag + //! @return FALSE on syntax error + Standard_EXPORT static Standard_Boolean ParseOnOff (Standard_CString theArg, + Standard_Boolean& theIsOn); + +public: + //! Returns last graphic selection description. Standard_EXPORT static void LastPick (Standard_Integer& view, Standard_Integer& X, Standard_Integer& Y, Standard_Integer& button); @@ -121,17 +188,22 @@ Standard_EXPORT static void Repaint(); //! sets progress indicator - Standard_EXPORT static void SetProgressBar (const Handle(Draw_ProgressIndicator)& thePI); + Standard_EXPORT static void SetProgressBar (const Handle(Draw_ProgressIndicator)& theProgress); //! gets progress indicator Standard_EXPORT static Handle(Draw_ProgressIndicator) GetProgressBar(); - + +public: //! @name methods loading standard command sets + //! Defines all Draw commands Standard_EXPORT static void Commands (Draw_Interpretor& I); //! Defines Draw basic commands Standard_EXPORT static void BasicCommands (Draw_Interpretor& I); + //! Defines Draw message commands + Standard_EXPORT static void MessageCommands (Draw_Interpretor& I); + //! Defines Draw variables handling commands. Standard_EXPORT static void VariableCommands (Draw_Interpretor& I); @@ -152,35 +224,16 @@ Standard_EXPORT static Handle(Draw_Drawable3D) getDrawable (Standard_CString& theName, Standard_Boolean theToAllowPick); -private: - -friend class Draw_Drawable3D; -friend class Draw_Drawable2D; -friend class Draw_Color; -friend class Draw_Display; -friend class Draw_Segment3D; -friend class Draw_Segment2D; -friend class Draw_Marker3D; -friend class Draw_Marker2D; -friend class Draw_Axis3D; -friend class Draw_Axis2D; -friend class Draw_Text3D; -friend class Draw_Text2D; -friend class Draw_Circle3D; -friend class Draw_Circle2D; -friend class Draw_Number; -friend class Draw_Chronometer; -friend class Draw_Grid; -friend class Draw_Box; -friend class Draw_ProgressIndicator; -friend class Draw_Printer; + //! Parses RGB(A) color argument(s) specified within theArgVec[0], theArgVec[1], theArgVec[2] and theArgVec[3]. + //! Handles either color specified by name (single argument) + //! or by RGB(A) components (3-4 arguments) in range 0..1. + //! The result is stored in theColor on success. + //! Returns number of handled arguments (1, 2, 3 or 4) or 0 on syntax error. + Standard_EXPORT static Standard_Integer parseColor (Standard_Integer theArgNb, + const char* const* theArgVec, + Quantity_ColorRGBA& theColor, + bool theToParseAlpha); }; - - - - - - #endif // _Draw_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Interpretor.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Interpretor.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Interpretor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Interpretor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,18 +15,20 @@ // commercial license or contractual agreement. #include + #include +#include +#include +#include +#include +#include +#include #include #include #include #include - #include #include -#include -#include -#include -#include #include #include @@ -114,8 +116,7 @@ static Standard_Integer CommandCmd (ClientData theClientData, Tcl_Interp* interp, Standard_Integer argc, const char* argv[]) { - static Standard_Integer code; - code = TCL_OK; + Standard_Integer code = TCL_OK; Draw_Interpretor::CallBackData* aCallback = (Draw_Interpretor::CallBackData* )theClientData; Draw_Interpretor& di = *(aCallback->myDI); @@ -143,24 +144,26 @@ dumpArgs (std::cout, argc, argv); // run command - try { + try + { OCC_CATCH_SIGNALS // get exception if control-break has been pressed OSD::ControlBreak(); - // OCC680: Transfer UTF-8 directly to OCC commands without locale usage - Standard_Integer fres = aCallback->Invoke ( di, argc, argv /*anArgs.GetArgv()*/ ); - if (fres != 0) + if (fres != 0) + { code = TCL_ERROR; + } } - catch (Standard_Failure const& anException) { + catch (Standard_Failure const& anException) + { // fail if Draw_ExitOnCatch is set - std::cout << "An exception was caught " << anException << std::endl; const char* toExitOnCatch = Tcl_GetVar (interp, "Draw_ExitOnCatch", TCL_GLOBAL_ONLY); if (toExitOnCatch != NULL && Draw::Atoi (toExitOnCatch)) { + Message::SendFail() << "An exception was caught " << anException; #ifdef _WIN32 Tcl_Exit(0); #else @@ -168,18 +171,17 @@ #endif } - // get the error message Standard_SStream ss; - ss << "** Exception ** " << anException << std::ends; + ss << "An exception was caught " << anException << std::ends; Tcl_SetResult(interp,(char*)(ss.str().c_str()),TCL_VOLATILE); code = TCL_ERROR; } catch (std::exception const& theStdException) { - std::cout << "An exception was caught " << theStdException.what() << " [" << typeid(theStdException).name() << "]" << std::endl; const char* toExitOnCatch = Tcl_GetVar (interp, "Draw_ExitOnCatch", TCL_GLOBAL_ONLY); if (toExitOnCatch != NULL && Draw::Atoi (toExitOnCatch)) { + Message::SendFail() << "An exception was caught " << theStdException.what() << " [" << typeid(theStdException).name() << "]"; #ifdef _WIN32 Tcl_Exit (0); #else @@ -187,18 +189,17 @@ #endif } - // get the error message Standard_SStream ss; - ss << "** Exception ** " << theStdException.what() << " [" << typeid(theStdException).name() << "]" << std::ends; - Tcl_SetResult (interp, (char*)(ss.str().c_str()), TCL_VOLATILE); + ss << "An exception was caught " << theStdException.what() << " [" << typeid(theStdException).name() << "]" << std::ends; + Tcl_SetResult(interp,(char*)(ss.str().c_str()),TCL_VOLATILE); code = TCL_ERROR; } catch (...) { - std::cout << "UNKNOWN exception was caught " << std::endl; const char* toExitOnCatch = Tcl_GetVar (interp, "Draw_ExitOnCatch", TCL_GLOBAL_ONLY); if (toExitOnCatch != NULL && Draw::Atoi (toExitOnCatch)) { + Message::SendFail() << "UNKNOWN exception was caught "; #ifdef _WIN32 Tcl_Exit (0); #else @@ -206,10 +207,9 @@ #endif } - // get the error message Standard_SStream ss; - ss << "** Exception ** UNKNOWN" << std::ends; - Tcl_SetResult (interp, (char* )(ss.str().c_str()), TCL_VOLATILE); + ss << "UNKNOWN exception was caught " << std::ends; + Tcl_SetResult(interp,(char*)(ss.str().c_str()),TCL_VOLATILE); code = TCL_ERROR; } @@ -244,15 +244,34 @@ //======================================================================= //function : Draw_Interpretor -//purpose : +//purpose : //======================================================================= +Draw_Interpretor::Draw_Interpretor() +: // the tcl interpreter is not created immediately as it is kept + // by a global variable and created and deleted before the main() + myInterp (NULL), + isAllocated (Standard_False), + myDoLog (Standard_False), + myDoEcho (Standard_False), + myToColorize (Standard_True), + myFDLog (-1) +{ + // +} -Draw_Interpretor::Draw_Interpretor() : - isAllocated(Standard_False), myDoLog(Standard_False), myDoEcho(Standard_False), myFDLog(-1) +//======================================================================= +//function : Draw_Interpretor +//purpose : +//======================================================================= +Draw_Interpretor::Draw_Interpretor (const Draw_PInterp& theInterp) +: myInterp (theInterp), + isAllocated (Standard_False), + myDoLog (Standard_False), + myDoEcho (Standard_False), + myToColorize (Standard_True), + myFDLog (-1) { -// The tcl interpreter is not created immediately as it is kept -// by a global variable and created and deleted before the main(). - myInterp = NULL; + // } //======================================================================= @@ -269,16 +288,20 @@ } //======================================================================= -//function : Draw_Interpretor -//purpose : +//function : SetToColorize +//purpose : //======================================================================= - -Draw_Interpretor::Draw_Interpretor(const Draw_PInterp& p) : - isAllocated(Standard_False), - myInterp(p), - myDoLog(Standard_False), - myDoEcho(Standard_False) +void Draw_Interpretor::SetToColorize (Standard_Boolean theToColorize) { + myToColorize = theToColorize; + for (Message_SequenceOfPrinters::Iterator aPrinterIter (Message::DefaultMessenger()->Printers()); + aPrinterIter.More(); aPrinterIter.Next()) + { + if (Handle(Message_PrinterOStream) aPrinter = Handle(Message_PrinterOStream)::DownCast (aPrinterIter.Value())) + { + aPrinter->SetToColorize (theToColorize); + } + } } //======================================================================= @@ -371,15 +394,7 @@ Draw_Interpretor& Draw_Interpretor::Append(const Standard_CString s) { -#ifdef TCL_USES_UTF8 - // Convert string to UTF-8 format for Tcl - Tcl_DString TclString; - Tcl_ExternalToUtfDString ( NULL, s, -1, &TclString ); - Tcl_AppendResult ( myInterp, Tcl_DStringValue ( &TclString ), (Standard_CString)0 ); - Tcl_DStringFree ( &TclString ); -#else Tcl_AppendResult(myInterp,s,(Standard_CString)0); -#endif return *this; } @@ -457,21 +472,7 @@ void Draw_Interpretor::AppendElement(const Standard_CString s) { -#ifdef TCL_USES_UTF8 - // Convert string to UTF-8 format for Tcl - Tcl_DString TclString; - Tcl_ExternalToUtfDString ( NULL, s, -1, &TclString ); - Tcl_AppendElement ( myInterp, Tcl_DStringValue ( &TclString ) ); - Tcl_DStringFree ( &TclString ); -#else -#ifdef IRIX - //AppendElement is declared as (Tcl_Interp *interp, char *string) - //on SGI 32 - Tcl_AppendElement(myInterp,(char*) s); -#else Tcl_AppendElement(myInterp, s); -#endif -#endif } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Interpretor.hxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Interpretor.hxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Interpretor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Interpretor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -251,6 +251,12 @@ //! Returns current value of the log file descriptor Standard_Integer GetLogFileDescriptor() { return myFDLog; } + //! Return TRUE if console output should be colorized; TRUE by default. + Standard_Boolean ToColorize() const { return myToColorize; } + + //! Set if console output should be colorized. + Standard_EXPORT void SetToColorize (Standard_Boolean theToColorize); + protected: Standard_EXPORT void add (Standard_CString theCommandName, @@ -261,10 +267,11 @@ private: - Standard_Boolean isAllocated; Draw_PInterp myInterp; + Standard_Boolean isAllocated; Standard_Boolean myDoLog; Standard_Boolean myDoEcho; + Standard_Boolean myToColorize; Standard_Integer myFDLog; //!< file descriptor of log file public: diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Main.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Main.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Main.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Main.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,6 +70,11 @@ Draw_IsConsoleSubsystem = Standard_True; theDraw_InitAppli = fDraw_InitAppli; + // Set console code page to UTF-8 so that input from cin and output to cout + // pass Unicode symbols as expected + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); + // MKV 01.02.05 #if ((TCL_MAJOR_VERSION > 8) || ((TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION >= 4))) Tcl_FindExecutable(argv[0]); diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Marker2D.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Marker2D.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Marker2D.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Marker2D.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,7 +40,7 @@ Draw_Marker2D::Draw_Marker2D(const gp_Pnt2d& P, const Draw_MarkerShape T, const Draw_Color& C, const Standard_Real /*RSize*/) : - myPos(P), myCol(C), myTyp(T) + myPos(P), myCol(C), myTyp(T), mySiz(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Marker3D.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Marker3D.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Marker3D.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Marker3D.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,7 @@ //======================================================================= Draw_Marker3D::Draw_Marker3D(const gp_Pnt& P, const Draw_MarkerShape T, const Draw_Color& C, const Standard_Integer S) : - myPos(P), myCol(C), myTyp(T), mySiz(S), myIsRSiz(Standard_False) + myPos(P), myCol(C), myTyp(T), mySiz(S), myRSiz(0.0), myIsRSiz(Standard_False) { } @@ -40,7 +40,7 @@ Draw_Marker3D::Draw_Marker3D(const gp_Pnt& P, const Draw_MarkerShape T, const Draw_Color& C, const Standard_Real RSize) : - myPos(P), myCol(C), myTyp(T), myRSiz(RSize), myIsRSiz(Standard_True) + myPos(P), myCol(C), myTyp(T), mySiz(0), myRSiz(RSize), myIsRSiz(Standard_True) { } diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_MessageCommands.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_MessageCommands.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_MessageCommands.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_MessageCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,388 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +//============================================================================== +//function : printerType +//purpose : +//============================================================================== +static Standard_Boolean printerType (const TCollection_AsciiString& theTypeName, + Handle(Standard_Type)& theType) +{ + if (theTypeName == "ostream") + { + theType = STANDARD_TYPE(Message_PrinterOStream); + return Standard_True; + } + else if (theTypeName == "systemlog") + { + theType = STANDARD_TYPE(Message_PrinterSystemLog); + return Standard_True; + } + else if (theTypeName == "report") + { + theType = STANDARD_TYPE(Message_PrinterToReport); + return Standard_True; + } + else if (theTypeName == "draw") + { + theType = STANDARD_TYPE(Draw_Printer); + return Standard_True; + } + + return Standard_False; +} + +//============================================================================== +//function : createPrinter +//purpose : +//============================================================================== +static Handle(Message_Printer) createPrinter (const Handle(Standard_Type)& theType, Draw_Interpretor& theDI) +{ + const TCollection_AsciiString aTypeName (theType->Name()); + if (aTypeName == STANDARD_TYPE(Message_PrinterOStream)->Name()) + { + return new Message_PrinterOStream(); + } + else if (aTypeName == STANDARD_TYPE(Message_PrinterSystemLog)->Name()) + { + return new Message_PrinterSystemLog ("draw_messages"); + } + else if (aTypeName == STANDARD_TYPE(Message_PrinterToReport)->Name()) + { + Handle(Message_PrinterToReport) aMessagePrinter = new Message_PrinterToReport(); + const Handle(Message_Report)& aReport = Message::DefaultReport (Standard_True); + aMessagePrinter->SetReport (aReport); + return aMessagePrinter; + } + else if (aTypeName == STANDARD_TYPE(Draw_Printer)->Name()) + { + return new Draw_Printer (theDI); + } + return Handle(Message_Printer)(); +} + +//============================================================================== +//function : SendMessage +//purpose : +//============================================================================== +static Standard_Integer SendMessage (Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec) +{ + if (theArgNb < 2) + { + theDI << "Error: wrong number of arguments"; + return 1; + } + + const Handle(Message_Messenger)& aMessenger = Message::DefaultMessenger(); + for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) + { + TCollection_AsciiString anArg (theArgVec[anArgIter]); + anArg.LowerCase(); + aMessenger->Send (anArg); + } + + return 0; +} + +//============================================================================== +//function : PrintMessenger +//purpose : +//============================================================================== +static Standard_Integer PrintMessenger (Draw_Interpretor& theDI, Standard_Integer, const char**) +{ + const Handle(Message_Messenger)& aMessenger = Message::DefaultMessenger(); + + Standard_SStream aSStream; + aMessenger->DumpJson (aSStream); + theDI << aSStream; + std::cout << aSStream.str() << std::endl; + + return 0; +} + +//============================================================================== +//function : SetMessagePrinter +//purpose : +//============================================================================== +static Standard_Integer SetMessagePrinter (Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec) +{ + if (theArgNb < 2) + { + theDI << "Error: wrong number of arguments"; + return 1; + } + + Standard_Boolean toAddPrinter = Standard_True; + NCollection_List aPrinterTypes; + const Handle(Message_Messenger)& aMessenger = Message::DefaultMessenger(); + for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) + { + TCollection_AsciiString anArg (theArgVec[anArgIter]); + anArg.LowerCase(); + if (anArg == "-state") + { + if (anArgIter + 1 < theArgNb + && Draw::ParseOnOff (theArgVec[anArgIter + 1], toAddPrinter)) + { + ++anArgIter; + } + } + else if (anArg == "-type" + && anArgIter + 1 < theArgNb) + { + TCollection_AsciiString aVal (theArgVec[++anArgIter]); + aPrinterTypes.Append (aVal); + } + else + { + theDI << "Syntax error: unknown argument '" << theArgVec[anArgIter] << "'"; + return 1; + } + } + + for (NCollection_List::Iterator anIterator (aPrinterTypes); anIterator.More(); anIterator.Next()) + { + Handle(Standard_Type) aPrinterType; + if (!printerType (anIterator.Value(), aPrinterType)) + { + theDI << "Syntax error: unknown printer type '" << anIterator.Value() << "'"; + return 1; + } + + if (toAddPrinter) + { + Handle(Message_Printer) aPrinter = createPrinter (aPrinterType, theDI); + aMessenger->AddPrinter (aPrinter); + if (!Handle(Message_PrinterToReport)::DownCast(aPrinter).IsNull()) + { + Message::DefaultReport (Standard_False)->UpdateActiveInMessenger(); + } + } + else + { + aMessenger->RemovePrinters (aPrinterType); + } + } + return 0; +} + +//============================================================================== +//function : ClearReport +//purpose : +//============================================================================== +static Standard_Integer ClearReport(Draw_Interpretor& theDI, Standard_Integer theArgNb, const char**) +{ + if (theArgNb < 1) + { + theDI << "Error: wrong number of arguments"; + return 1; + } + + const Handle(Message_Report)& aReport = Message::DefaultReport (Standard_False); + if (aReport.IsNull()) + { + theDI << "Error: report is no created"; + return 1; + } + + aReport->Clear(); + return 0; +} + +//============================================================================== +//function : SetReportMetric +//purpose : +//============================================================================== +static Standard_Integer SetReportMetric(Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec) +{ + if (theArgNb < 1) + { + theDI << "Error: wrong number of arguments"; + return 1; + } + + const Handle(Message_Report)& aReport = Message::DefaultReport (Standard_True); + if (aReport.IsNull()) + { + return 1; + } + + aReport->ClearMetrics(); + for (int i = 1; i < theArgNb; i++) + { + Standard_Integer aMetricId = Draw::Atoi (theArgVec[i]); + if (aMetricId < Message_MetricType_ThreadCPUUserTime || aMetricId > Message_MetricType_MemHeapUsage) + { + theDI << "Error: unrecognized message metric: " << aMetricId; + return 1; + } + aReport->SetActiveMetric ((Message_MetricType)aMetricId, Standard_True); + } + return 0; +} + +//============================================================================== +//function : CollectMetricMessages +//purpose : +//============================================================================== +static Standard_Integer CollectMetricMessages(Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec) +{ + static Handle(NCollection_Shared) MyLevel; + + if (theArgNb < 1) + { + theDI << "Error: wrong number of arguments"; + return 1; + } + + Standard_Boolean toActivate = Standard_False; + for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) + { + TCollection_AsciiString anArg (theArgVec[anArgIter]); + anArg.LowerCase(); + if (anArg == "-activate") + { + if (anArgIter + 1 < theArgNb + && Draw::ParseOnOff (theArgVec[anArgIter + 1], toActivate)) + { + ++anArgIter; + } + } + } + if (toActivate) + { + if (!MyLevel.IsNull()) + { + theDI << "Error: collecting already activated"; + return 1; + } + MyLevel = new NCollection_Shared("Level"); + } + else + { + if (!MyLevel) + { + theDI << "Error: collecting was not activated"; + return 1; + } + MyLevel.Nullify(); + MyLevel = 0; + } + return 0; +} + +//============================================================================== +//function : PrintReport +//purpose : +//============================================================================== +static Standard_Integer PrintReport(Draw_Interpretor& theDI, Standard_Integer theArgNb, const char** theArgVec) +{ + if (theArgNb < 1) + { + theDI << "Error: wrong number of arguments"; + return 1; + } + + const Handle(Message_Report)& aReport = Message::DefaultReport (Standard_False); + if (aReport.IsNull()) + { + theDI << "Error: report is no created"; + return 1; + } + + for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) + { + TCollection_AsciiString anArgCase (theArgVec[anArgIter]); + anArgCase.LowerCase(); + if (anArgCase == "-messenger") + { + aReport->SendMessages (Message::DefaultMessenger()); + } + else if (anArgCase == "-dump" + || anArgCase == "-print") + { + Standard_SStream aSStream; + aReport->Dump (aSStream); + theDI << aSStream; + } + else if (anArgCase == "-dumpjson") + { + Standard_SStream aSStream; + aReport->DumpJson (aSStream); + theDI << aSStream; + } + } + + return 0; +} + +void Draw::MessageCommands(Draw_Interpretor& theCommands) +{ + static Standard_Boolean Done = Standard_False; + if (Done) return; + Done = Standard_True; + + const char* group = "DRAW Message Commands"; + + theCommands.Add("PrintMessenger", + "PrintMessenger" + "\n\t\t: Prints DumpJson information about messenger.", + __FILE__, PrintMessenger, group); + + theCommands.Add("SetMessagePrinter", + "SetMessagePrinter [-type ostream|systemlog|report|draw] [-state {on|off}=on]" + "\n\t\t: Sets or removes the printer in messenger." + "\n\t\t: Option -type set type of printer. Printers are applied with And combination." + "\n\t\t: Option -state add or remove printer", + __FILE__, SetMessagePrinter, group); + + theCommands.Add("SendMessage", + "SendMessage text [text ...]" + "\n Sends the text into the messenger.\n", + __FILE__, SendMessage, group); + + theCommands.Add("ClearReport", + "Removes all alerts in default printer", + __FILE__, ClearReport, group); + + theCommands.Add("SetReportMetric", + "SetReportMetric [metric ...] \n Activate report metrics, deactivate all if there are no parameters.\n" + "\n\t\t: metric is a value of Message_MetricType, e.g. 1 is Message_MetricType_UserTimeCPU" , + __FILE__, SetReportMetric, group); + + theCommands.Add("CollectMetricMessages", + "CollectMetricMessages [-activate {0|1}]" + "\n Start metric collection by 1, stop by 0. Result is placed in metric attributes of message report.\n", + __FILE__, CollectMetricMessages, group); + + theCommands.Add("PrintReport", + "PrintReport [-messenger] [-dump] [-dumpJson]" + "\n\t\t: Send report content to default messenger or stream" + "\n\t\t: Output options:" + "\n\t\t: -messenger Prints the information about report into messenger." + "\n\t\t: -dump Prints Dump information about report." + "\n\t\t: -dumpJson Prints DumpJson information about report.", + __FILE__, PrintReport, group); +} diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_PloadCommands.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_PloadCommands.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_PloadCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_PloadCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,152 +13,156 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -#include +#include +#include +#include +#include #include #include #include #include #include #include -#include -#include -#include - -static Handle(Resource_Manager) myResources; - -//======================================================================= -//function : FindPluginFile -//purpose : Searches for the existence of the plugin file according to its name thePluginName: -// - if thePluginName is empty then it defaults to DrawPlugin -// - the search directory is defined according to the variable -// CSF_Defaults (if it is omitted then it defaults to -// $CASROOT/src/DrawResources) -// - finally existence of the file is verified in the search directory -// - if the file exists but corresponding variable (CSF_...) has not been -// explicitly set, it is forced to (for further reuse by Resource_Manager) -// Returns True if the file exists, otherwise - False. -//======================================================================= +#include -#define FAILSTR "Failed to load plugin: " - -//static Standard_Boolean FindPluginFile (TCollection_AsciiString& thePluginName) -static Standard_Boolean FindPluginFile (TCollection_AsciiString& thePluginName, TCollection_AsciiString& aPluginDir) +//! Searches for the existence of the plugin file according to its name thePluginName: +//! - if thePluginName is empty then it defaults to DrawPlugin +//! - the search directory is defined according to the variable +//! CSF_Defaults (if it is omitted then it defaults to +//! $CASROOT/src/DrawResources) +//! - finally existence of the file is verified in the search directory +//! - if the file exists but corresponding variable (CSF_...) has not been +//! explicitly set, it is forced to (for further reuse by Resource_Manager) +//! @return TRUE if the file exists, otherwise - False +static Standard_Boolean findPluginFile (TCollection_AsciiString& thePluginName, + TCollection_AsciiString& thePluginDir) { - Standard_Boolean aResult = Standard_True; - // check if the file name has been specified and use default value if not - if (thePluginName.IsEmpty()) { + if (thePluginName.IsEmpty()) + { thePluginName += "DrawPlugin"; #ifdef OCCT_DEBUG std::cout << "Plugin file name has not been specified. Defaults to " << thePluginName.ToCString() << std::endl; #endif } - //TCollection_AsciiString aPluginDir; // the search directory - Standard_Boolean aDirFound = Standard_True, aToSetCSFVariable = Standard_False; + Standard_Boolean aToSetCSFVariable = Standard_False; // the order of search : by CSF_Defaults and then by CASROOT - TCollection_AsciiString aCSFVariable = TCollection_AsciiString ("CSF_") + thePluginName + "Defaults"; - aPluginDir = OSD_Environment (aCSFVariable).Value(); - if (aPluginDir.IsEmpty()) + const TCollection_AsciiString aCSFVariable = TCollection_AsciiString ("CSF_") + thePluginName + "Defaults"; + thePluginDir = OSD_Environment (aCSFVariable).Value(); + if (thePluginDir.IsEmpty()) { - aPluginDir = OSD_Environment ("DRAWHOME").Value(); - if (!aPluginDir.IsEmpty()) + thePluginDir = OSD_Environment ("DRAWHOME").Value(); + if (!thePluginDir.IsEmpty()) { aToSetCSFVariable = Standard_True; //CSF variable to be set later } else { // now try by CASROOT - aPluginDir = OSD_Environment ("CASROOT").Value(); - if (!aPluginDir.IsEmpty()) + thePluginDir = OSD_Environment ("CASROOT").Value(); + if (!thePluginDir.IsEmpty()) { - aPluginDir += "/src/DrawResources"; + thePluginDir += "/src/DrawResources"; aToSetCSFVariable = Standard_True; //CSF variable to be set later } else { - aResult = aDirFound = Standard_False; - std::cout << FAILSTR "Neither " << aCSFVariable << ", nor CASROOT variables have been set\n"; + Message::SendFail() << "Failed to load plugin: Neither " << aCSFVariable << ", nor CASROOT variables have been set"; + return Standard_False; } } } - - if (aDirFound) { - // search directory name has been constructed, now check whether it and the file exist - - TCollection_AsciiString aPluginFileName = aPluginDir + "/" + thePluginName; - OSD_File PluginFile ( aPluginFileName ); - if ( PluginFile.Exists() ) { - if (aToSetCSFVariable) { - OSD_Environment aCSFVarEnv ( aCSFVariable, aPluginDir ); - aCSFVarEnv.Build(); + + // search directory name has been constructed, now check whether it and the file exist + const TCollection_AsciiString aPluginFileName = thePluginDir + "/" + thePluginName; + OSD_File aPluginFile (aPluginFileName); + if (!aPluginFile.Exists()) + { + Message::SendFail() << "Failed to load plugin: File " << aPluginFileName << " not found"; + return Standard_False; + } + + if (aToSetCSFVariable) + { + OSD_Environment aCSFVarEnv (aCSFVariable, thePluginDir); + aCSFVarEnv.Build(); #ifdef OCCT_DEBUG - std::cout << "Variable " << aCSFVariable.ToCString() << " has not been explicitly defined. Set to " << aPluginDir.ToCString() << std::endl; + std::cout << "Variable " << aCSFVariable << " has not been explicitly defined. Set to " << thePluginDir << std::endl; #endif - if ( aCSFVarEnv.Failed() ) { - aResult = Standard_False; - std::cout << FAILSTR "Failed to initialize " << aCSFVariable.ToCString() << " with " << aPluginDir.ToCString() << std::endl; - } - } - } else { - aResult = Standard_False; - std::cout << FAILSTR "File " << aPluginFileName.ToCString() << " not found" << std::endl; + if (aCSFVarEnv.Failed()) + { + Message::SendFail() << "Failed to load plugin: Failed to initialize " << aCSFVariable << " with " << thePluginDir; + return Standard_False; } } - return aResult; + return Standard_True; } -//======================================================================= -//function : Parse -//purpose : Parse the input keys to atomic keys ( --> [ ..]) -//======================================================================= - -static void Parse (Draw_MapOfAsciiString& theMap) +//! Resolve keys within input map (groups, aliases and toolkits) to the list of destination toolkits (plugins to load). +//! @param theMap [in] [out] map to resolve (will be rewritten) +//! @param theResMgr [in] resource manager to resolve keys +static void resolveKeys (Draw_MapOfAsciiString& theMap, + const Handle(Resource_Manager)& theResMgr) { + if (theResMgr.IsNull()) + { + return; + } + Draw_MapOfAsciiString aMap, aMap2; - Standard_Integer j, k; - Standard_Integer aMapExtent, aMap2Extent; - aMapExtent = theMap.Extent(); - for(j = 1; j <= aMapExtent; j++) { - if (!myResources.IsNull()) { - const TCollection_AsciiString& aKey = theMap.FindKey(j); - TCollection_AsciiString aResource = aKey; - if(myResources->Find(aResource.ToCString())) { -#ifdef OCCT_DEBUG - std::cout << "Parse Value ==> " << myResources->Value(aResource.ToCString()) << std::endl; -#endif - TCollection_AsciiString aValue(myResources->Value(aResource.ToCString())); - // parse aValue string - Standard_Integer i=1; - for(;;) { - TCollection_AsciiString aCurKey = aValue.Token(" \t,", i++); -#ifdef OCCT_DEBUG - std::cout << "Parse aCurKey = " << aCurKey.ToCString() << std::endl; -#endif - if(aCurKey.IsEmpty()) break; - if(!myResources->Find(aCurKey.ToCString())) { - // It is toolkit - aMap.Add(aResource); - } - else - aMap2.Add(aCurKey); - } - } else - std::cout <<"Pload : Resource = " << aResource << " is not found" << std::endl; - if(!aMap2.IsEmpty()) - Parse(aMap2); - // - aMap2Extent = aMap2.Extent(); - for(k = 1; k <= aMap2Extent; k++) { - aMap.Add(aMap2.FindKey(k)); + const Standard_Integer aMapExtent = theMap.Extent(); + for (Standard_Integer j = 1; j <= aMapExtent; ++j) + { + TCollection_AsciiString aValue; + const TCollection_AsciiString aResource = theMap.FindKey (j); + if (theResMgr->Find (aResource, aValue)) + { + #ifdef OCCT_DEBUG + std::cout << "Parse Value ==> " << aValue << std::endl; + #endif + for (Standard_Integer aKeyIter = 1;; ++aKeyIter) + { + const TCollection_AsciiString aCurKey = aValue.Token (" \t,", aKeyIter); + #ifdef OCCT_DEBUG + std::cout << "Parse aCurKey = " << aCurKey << std::endl; + #endif + if (aCurKey.IsEmpty()) + { + break; + } + + if (theResMgr->Find (aCurKey.ToCString())) + { + aMap2.Add (aCurKey); + } + else + { + aMap.Add (aResource); // It is toolkit + } } + } + else + { + Message::SendFail() << "Pload : Resource = " << aResource << " is not found"; + } + if (!aMap2.IsEmpty()) + { + resolveKeys (aMap2, theResMgr); + } + + // + const Standard_Integer aMap2Extent = aMap2.Extent(); + for (Standard_Integer k = 1; k <= aMap2Extent; ++k) + { + aMap.Add (aMap2.FindKey (k)); } } - theMap.Assign(aMap); + theMap.Assign (aMap); } //======================================================================= @@ -166,98 +170,81 @@ //purpose : //======================================================================= -static Standard_Integer Pload (Draw_Interpretor& di, - Standard_Integer n, - const char** argv) +static Standard_Integer Pload (Draw_Interpretor& theDI, + Standard_Integer theNbArgs, + const char** theArgVec) { - char adef[] = "-"; - TCollection_AsciiString aPluginFileName(""); - TCollection_AsciiString aPluginDir(""), aPluginDir2(""); - Standard_Integer aStart = 0; - Standard_Integer aFinish = n - 1; - - if (n == 1) { - // Load DEFAULT key - aStart = 0; - } else { - if(argv[1][0] == adef[0]) { - aPluginFileName = argv[1]; - aPluginFileName.Remove(1,1); - if (n == 2) { - // Load DEFAULT key from aPluginFileName file - aStart = 0; - aFinish = n - 2; - } else { - aStart = 2; - } - } else { - aStart = 1; + Draw_MapOfAsciiString aMap; + TCollection_AsciiString aPluginFileName; + for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter) + { + const TCollection_AsciiString aTK (theArgVec[anArgIter]); + if (anArgIter == 1 + && aTK.Value (1) == '-') + { + aPluginFileName = aTK.SubString (2, aTK.Length()); + } + else + { + aMap.Add (aTK); } } + if (aMap.IsEmpty()) + { + aMap.Add ("DEFAULT"); // Load DEFAULT key + } - //if ( !FindPluginFile (aPluginFileName) ) { - if ( !FindPluginFile (aPluginFileName, aPluginDir) ) { + TCollection_AsciiString aPluginDir, aPluginDir2; + if (!findPluginFile (aPluginFileName, aPluginDir)) + { return 1; - } + } - Draw_MapOfAsciiString aMap; - TCollection_AsciiString aDEFAULT("DEFAULT"); - //for(Standard_Integer i = aStart; i < n; i++) - for(Standard_Integer i = aStart; i <= aFinish; i++) - if (i == 0) { - // Load DEFAULT key - aMap.Add(aDEFAULT); - } else { - TCollection_AsciiString aTK(argv[i]); - aMap.Add(aTK); + Handle(Resource_Manager) aResMgr = new Resource_Manager (aPluginFileName.ToCString(), aPluginDir, aPluginDir2, Standard_False); + resolveKeys (aMap, aResMgr); + + const Standard_Integer aMapExtent = aMap.Extent(); + for (Standard_Integer aResIter = 1; aResIter <= aMapExtent; ++aResIter) + { + const TCollection_AsciiString aResource = aMap.FindKey (aResIter); + #ifdef OCCT_DEBUG + std::cout << "aResource = " << aResource << std::endl; + #endif + TCollection_AsciiString aValue; + if (!aResMgr->Find (aResource, aValue)) + { + Message::SendWarning() <<"Pload : Resource = " << aResource << " is not found"; + continue; } - - //myResources = new Resource_Manager(aPluginFileName.ToCString()); - myResources = new Resource_Manager(aPluginFileName.ToCString(), aPluginDir, aPluginDir2, Standard_False); - Parse(aMap); - Standard_Integer j; - Standard_Integer aMapExtent; - aMapExtent = aMap.Extent(); - for(j = 1; j <= aMapExtent; j++) { - const TCollection_AsciiString& aKey = aMap.FindKey(j); - TCollection_AsciiString aResource = aKey; -#ifdef OCCT_DEBUG - std::cout << "aResource = " << aResource << std::endl; -#endif - if(myResources->Find(aResource.ToCString())) { - const TCollection_AsciiString& aValue = myResources->Value(aResource.ToCString()); -#ifdef OCCT_DEBUG - std::cout << "Value ==> " << aValue << std::endl; -#endif - - //Draw::Load(di, aKey, aPluginFileName); - Draw::Load(di, aKey, aPluginFileName, aPluginDir, aPluginDir2, Standard_False); - - // Load TclScript - TCollection_AsciiString aCSFVariable ("CSF_DrawPluginTclDir"); - TCollection_AsciiString aTclScriptDir; - aTclScriptDir = getenv (aCSFVariable.ToCString()); - TCollection_AsciiString aTclScriptFileName; - TCollection_AsciiString aTclScriptFileNameDefaults; - aTclScriptFileName = aTclScriptDir + "/" + aValue + ".tcl"; - aTclScriptFileNameDefaults = aPluginDir + "/" + aValue + ".tcl"; - OSD_File aTclScriptFile ( aTclScriptFileName ); - OSD_File aTclScriptFileDefaults ( aTclScriptFileNameDefaults ); - if (!aTclScriptDir.IsEmpty() && aTclScriptFile.Exists()) { -#ifdef OCCT_DEBUG - std::cout << "Load " << aTclScriptFileName << " TclScript" << std::endl; -#endif - di.EvalFile( aTclScriptFileName.ToCString() ); - } else if (!aPluginDir.IsEmpty() && aTclScriptFileDefaults.Exists()) { -#ifdef OCCT_DEBUG - std::cout << "Load " << aTclScriptFileNameDefaults << " TclScript" << std::endl; -#endif - di.EvalFile( aTclScriptFileNameDefaults.ToCString() ); - } - - } else - std::cout <<"Pload : Resource = " << aResource << " is not found" << std::endl; + #ifdef OCCT_DEBUG + std::cout << "Value ==> " << aValue << std::endl; + #endif + + Draw::Load (theDI, aResource, aPluginFileName, aPluginDir, aPluginDir2, Standard_False); + + // Load TclScript + const TCollection_AsciiString aTclScriptDir = OSD_Environment ("CSF_DrawPluginTclDir").Value(); + const TCollection_AsciiString aTclScriptFileName = aTclScriptDir + "/" + aValue + ".tcl"; + const TCollection_AsciiString aTclScriptFileNameDefaults = aPluginDir + "/" + aValue + ".tcl"; + OSD_File aTclScriptFile (aTclScriptFileName); + OSD_File aTclScriptFileDefaults (aTclScriptFileNameDefaults); + if (!aTclScriptDir.IsEmpty() + && aTclScriptFile.Exists()) + { + #ifdef OCCT_DEBUG + std::cout << "Load " << aTclScriptFileName << " TclScript" << std::endl; + #endif + theDI.EvalFile (aTclScriptFileName.ToCString()); + } + else if (!aPluginDir.IsEmpty() + && aTclScriptFileDefaults.Exists()) + { + #ifdef OCCT_DEBUG + std::cout << "Load " << aTclScriptFileNameDefaults << " TclScript" << std::endl; + #endif + theDI.EvalFile (aTclScriptFileNameDefaults.ToCString()); + } } return 0; } @@ -271,7 +258,7 @@ { if (n != 2) { - std::cout << "Error: specify path to library to be loaded" << std::endl; + Message::SendFail() << "Error: specify path to library to be loaded"; return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Printer.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Printer.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Printer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Printer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,9 +13,8 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #include -#include + #include #include @@ -23,75 +22,25 @@ //======================================================================= //function : Draw_Printer -//purpose : -//======================================================================= -Draw_Printer::Draw_Printer (const Draw_Interpretor& theTcl) -: myTcl((Standard_Address)&theTcl) -{ -} - -//======================================================================= -//function : Send -//purpose : -//======================================================================= - -void Draw_Printer::Send (const TCollection_ExtendedString& theString, - const Message_Gravity theGravity, - const Standard_Boolean theToPutEol) const -{ - if (!myTcl - || theGravity < myTraceLevel) - { - return; - } - - (*(Draw_Interpretor*)myTcl) << theString; - if (theToPutEol) - { - (*(Draw_Interpretor*)myTcl) << "\n"; - } -} - -//======================================================================= -//function : Send //purpose : //======================================================================= - -void Draw_Printer::Send (const Standard_CString theString, - const Message_Gravity theGravity, - const Standard_Boolean theToPutEol) const +Draw_Printer::Draw_Printer (Draw_Interpretor& theTcl) +: myTcl (&theTcl) { - if (!myTcl - || theGravity < myTraceLevel) - { - return; - } - - (*(Draw_Interpretor*)myTcl) << theString; - if (theToPutEol) - { - (*(Draw_Interpretor*)myTcl) << "\n"; - } } //======================================================================= -//function : Send +//function : send //purpose : //======================================================================= - -void Draw_Printer::Send (const TCollection_AsciiString& theString, - const Message_Gravity theGravity, - const Standard_Boolean theToPutEol) const +void Draw_Printer::send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const { - if (!myTcl + if (myTcl == NULL || theGravity < myTraceLevel) { return; } - (*(Draw_Interpretor*)myTcl) << theString; - if (theToPutEol) - { - (*(Draw_Interpretor*)myTcl) << "\n"; - } + *myTcl << theString << "\n"; } diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Printer.hxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Printer.hxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Printer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Printer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,18 +16,8 @@ #ifndef _Draw_Printer_HeaderFile #define _Draw_Printer_HeaderFile -#include -#include - -#include #include #include -#include -#include -#include -class TCollection_ExtendedString; -class TCollection_AsciiString; - class Draw_Printer; DEFINE_STANDARD_HANDLE(Draw_Printer, Message_Printer) @@ -36,53 +26,22 @@ //! (Message_Messenge) directed to Draw_Interpretor class Draw_Printer : public Message_Printer { - + DEFINE_STANDARD_RTTIEXT(Draw_Printer, Message_Printer) public: - //! Creates a printer connected to the interpretor. - Standard_EXPORT Draw_Printer(const Draw_Interpretor& theTcl); - - //! Send a string message with specified trace level. - //! The parameter putEndl specified whether end-of-line - //! should be added to the end of the message. - //! This method must be redefined in descentant. - Standard_EXPORT virtual void Send (const TCollection_ExtendedString& theString, const Message_Gravity theGravity, const Standard_Boolean putEndl) const Standard_OVERRIDE; - - //! Send a string message with specified trace level. - //! The parameter putEndl specified whether end-of-line - //! should be added to the end of the message. - //! Default implementation calls first method Send(). - Standard_EXPORT virtual void Send (const Standard_CString theString, const Message_Gravity theGravity, const Standard_Boolean putEndl) const Standard_OVERRIDE; - - //! Send a string message with specified trace level. - //! The parameter putEndl specified whether end-of-line - //! should be added to the end of the message. - //! Default implementation calls first method Send(). - Standard_EXPORT virtual void Send (const TCollection_AsciiString& theString, const Message_Gravity theGravity, const Standard_Boolean putEndl) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(Draw_Printer,Message_Printer) + Standard_EXPORT Draw_Printer (Draw_Interpretor& theTcl); protected: - - + //! Send a string message with specified trace level. + Standard_EXPORT virtual void send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const Standard_OVERRIDE; private: - - Standard_Address myTcl; - + Draw_Interpretor* myTcl; }; - - - - - - #endif // _Draw_Printer_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_ProgressIndicator.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_ProgressIndicator.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_ProgressIndicator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_ProgressIndicator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -11,14 +11,18 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include -#include #include #include -#include -#include +#include +#include +#include +#include +#include +#include #include #include @@ -29,14 +33,16 @@ //purpose : //======================================================================= Draw_ProgressIndicator::Draw_ProgressIndicator (const Draw_Interpretor &di, Standard_Real theUpdateThreshold) -: myTextMode ( DefaultTextMode() ), +: myTclMode ( DefaultTclMode() ), + myConsoleMode ( DefaultConsoleMode() ), myGraphMode ( DefaultGraphMode() ), - myDraw ( (Standard_Address)&di ), + myDraw ( (Draw_Interpretor*)&di ), myShown ( Standard_False ), myBreak ( Standard_False ), myUpdateThreshold ( 0.01 * theUpdateThreshold ), myLastPosition ( -1. ), - myStartTime ( 0 ) + myStartTime ( 0 ), + myGuiThreadId (OSD_Thread::Current()) { } @@ -58,8 +64,12 @@ void Draw_ProgressIndicator::Reset() { Message_ProgressIndicator::Reset(); - if ( myShown ) { - ((Draw_Interpretor*)myDraw)->Eval ( "destroy .xprogress" ); + if (myShown) + { + // eval will reset current string result - backup it beforehand + const TCollection_AsciiString aTclResStr (myDraw->Result()); + myDraw->Eval ( "destroy .xprogress" ); + *myDraw << aTclResStr; myShown = Standard_False; } myBreak = Standard_False; @@ -72,55 +82,77 @@ //purpose : //======================================================================= -Standard_Boolean Draw_ProgressIndicator::Show(const Standard_Boolean force) +void Draw_ProgressIndicator::Show (const Message_ProgressScope& theScope, const Standard_Boolean force) { - if ( ! myGraphMode && ! myTextMode ) - return Standard_False; + if (!myGraphMode && !myTclMode && !myConsoleMode) + return; // remember time of the first call to Show as process start time if ( ! myStartTime ) { - time_t aTimeT; - time ( &aTimeT ); - myStartTime = (Standard_Size)aTimeT; + if (!myStartTime) + { + time_t aTimeT; + time(&aTimeT); + myStartTime = (Standard_Size)aTimeT; + } } // unless show is forced, show updated state only if at least 1% progress has been reached since the last update Standard_Real aPosition = GetPosition(); if ( ! force && aPosition < 1. && Abs (aPosition - myLastPosition) < myUpdateThreshold) - return Standard_False; // return if update interval has not elapsed + return; // return if update interval has not elapsed + myLastPosition = aPosition; // Prepare textual progress info - char text[2048]; - Standard_Integer n = 0; - n += Sprintf ( &text[n], "Progress: %.0f%%", 100. * GetPosition() ); - for ( Standard_Integer i=GetNbScopes(); i >=1; i-- ) { - const Message_ProgressScale &scale = GetScope ( i ); - if ( scale.GetName().IsNull() ) continue; // skip unnamed scopes - // if scope has subscopes, print end of subscope as its current position - Standard_Real locPos = ( i >1 ? GetScope ( i-1 ).GetLast() : GetPosition() ); + std::stringstream aText; + aText.setf (std::ios::fixed, std:: ios::floatfield); + aText.precision(0); + aText << "Progress: " << 100. * GetPosition() << "%"; + NCollection_List aScopes; + for (const Message_ProgressScope* aPS = &theScope; aPS; aPS = aPS->Parent()) + aScopes.Prepend(aPS); + for (NCollection_List::Iterator it(aScopes); it.More(); it.Next()) + { + const Message_ProgressScope* aPS = it.Value(); + if (!aPS->Name()) continue; // skip unnamed scopes + aText << " " << aPS->Name() << ": "; + // print progress info differently for finite and infinite scopes - if ( scale.GetInfinite() ) - n += Sprintf ( &text[n], " %s: %.0f", scale.GetName()->ToCString(), - scale.BaseToLocal ( locPos ) ); - else - n += Sprintf ( &text[n], " %s: %.0f / %.0f", scale.GetName()->ToCString(), - scale.BaseToLocal ( locPos ), scale.GetMax() ); + Standard_Real aVal = aPS->Value(); + if (aPS->IsInfinite()) + { + if (Precision::IsInfinite(aVal)) + { + aText << "finished"; + } + else + { + aText << aVal; + } + } + else + { + aText << aVal << " / " << aPS->MaxValue(); + } } - // Show graphic progress bar - if ( myGraphMode ) { - + // Show graphic progress bar. + // It will be updated only within GUI thread. + if (myGraphMode && myGuiThreadId == OSD_Thread::Current()) + { // In addition, write elapsed/estimated/remaining time if ( GetPosition() > 0.01 ) { time_t aTimeT; time ( &aTimeT ); Standard_Size aTime = (Standard_Size)aTimeT; - n += Sprintf ( &text[n], "\nElapsed/estimated time: %ld/%.0f sec", - (long)(aTime - myStartTime), ( aTime - myStartTime ) / GetPosition() ); + aText << "\nElapsed/estimated time: " << (long)(aTime - myStartTime) << + "/" << ( aTime - myStartTime ) / GetPosition() << " sec"; } + // eval will reset current string result - backup it beforehand + const TCollection_AsciiString aTclResStr (myDraw->Result()); if ( ! myShown ) { char command[1024]; Sprintf ( command, "toplevel .xprogress -height 100 -width 410;" @@ -132,27 +164,32 @@ "message .xprogress.text -width 400 -text \"Progress 0%%\";" "button .xprogress.stop -text \"Break\" -relief groove -width 9 -command {XProgress -stop %p};" "pack .xprogress.bar .xprogress.text .xprogress.stop -side top;", this ); - ((Draw_Interpretor*)myDraw)->Eval ( command ); + myDraw->Eval ( command ); myShown = Standard_True; } - char command[1024]; - Standard_Integer num = 0; - num += Sprintf ( &command[num], ".xprogress.bar coords progress 2 2 %.0f 21;", - 1+400*GetPosition() ); - num += Sprintf ( &command[num], ".xprogress.bar coords progress_next 2 2 %.0f 21;", - 1+400*GetScope(1).GetLast() ); - num += Sprintf ( &command[num], ".xprogress.text configure -text \"%s\";", text ); - num += Sprintf ( &command[num], "update" ); - ((Draw_Interpretor*)myDraw)->Eval ( command ); + std::stringstream aCommand; + aCommand.setf(std::ios::fixed, std::ios::floatfield); + aCommand.precision(0); + aCommand << ".xprogress.bar coords progress 2 2 " << (1 + 400 * GetPosition()) << " 21;"; + aCommand << ".xprogress.bar coords progress_next 2 2 " << (1 + 400 * theScope.GetPortion()) << " 21;"; + aCommand << ".xprogress.text configure -text \"" << aText.str() << "\";"; + aCommand << "update"; + + myDraw->Eval (aCommand.str().c_str()); + *myDraw << aTclResStr; } // Print textual progress info - if ( myTextMode ) - Message::DefaultMessenger()->Send (text, Message_Info); - - return Standard_True; + if (myTclMode && myDraw) + { + *myDraw << aText.str().c_str() << "\n"; + } + if (myConsoleMode) + { + std::cout << aText.str().c_str() << "\n"; + } } - + //======================================================================= //function : UserBreak //purpose : @@ -160,32 +197,65 @@ Standard_Boolean Draw_ProgressIndicator::UserBreak() { - if ( StopIndicator() == this ) { + if ( StopIndicator() == this ) + { // std::cout << "Progress Indicator - User Break: " << StopIndicator() << ", " << (void*)this << std::endl; myBreak = Standard_True; - ((Draw_Interpretor*)myDraw)->Eval ( "XProgress -stop 0" ); + myDraw->Eval ( "XProgress -stop 0" ); + } + else + { + // treatment of Ctrl-Break signal + try + { + OSD::ControlBreak(); + } + catch (const OSD_Exception_CTRL_BREAK&) + { + myBreak = Standard_True; + } } return myBreak; } //======================================================================= -//function : SetTextMode -//purpose : Sets text output mode (on/off) +//function : SetTclMode +//purpose : Sets Tcl output mode (on/off) +//======================================================================= + +void Draw_ProgressIndicator::SetTclMode(const Standard_Boolean theTclMode) +{ + myTclMode = theTclMode; +} + +//======================================================================= +//function : GetTclMode +//purpose : Returns Tcl output mode (on/off) +//======================================================================= + +Standard_Boolean Draw_ProgressIndicator::GetTclMode() const +{ + return myTclMode; +} + +//======================================================================= +//function : SetConsoleMode +//purpose : Sets Console output mode (on/off) //======================================================================= -void Draw_ProgressIndicator::SetTextMode(const Standard_Boolean theTextMode) +void Draw_ProgressIndicator::SetConsoleMode(const Standard_Boolean theMode) { - myTextMode = theTextMode; + myConsoleMode = theMode; } //======================================================================= -//function : GetTextMode -//purpose : Returns text output mode (on/off) +//function : GetConsoleMode +//purpose : Returns Console output mode (on/off) //======================================================================= -Standard_Boolean Draw_ProgressIndicator::GetTextMode() const +Standard_Boolean Draw_ProgressIndicator::GetConsoleMode() const { - return myTextMode; + return myConsoleMode; } //======================================================================= @@ -209,36 +279,45 @@ } //======================================================================= -//function : DefaultTextMode +//function : DefaultTclMode +//purpose : +//======================================================================= + +Standard_Boolean &Draw_ProgressIndicator::DefaultTclMode() +{ + static Standard_Boolean defTclMode = Standard_False; + return defTclMode; +} + +//======================================================================= +//function : DefaultConsoleMode //purpose : //======================================================================= -Standard_Boolean &Draw_ProgressIndicator::DefaultTextMode () +Standard_Boolean &Draw_ProgressIndicator::DefaultConsoleMode() { - static Standard_Boolean defTextMode = Standard_False; - return defTextMode; + static Standard_Boolean defConsoleMode = Standard_False; + return defConsoleMode; } - + //======================================================================= //function : DefaultGraphMode //purpose : //======================================================================= -Standard_Boolean &Draw_ProgressIndicator::DefaultGraphMode () +Standard_Boolean &Draw_ProgressIndicator::DefaultGraphMode() { static Standard_Boolean defGraphMode = Standard_False; return defGraphMode; } - + //======================================================================= //function : StopIndicator //purpose : //======================================================================= -Standard_Address &Draw_ProgressIndicator::StopIndicator () +Standard_Address &Draw_ProgressIndicator::StopIndicator() { static Standard_Address stopIndicator = 0; return stopIndicator; } - - diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_ProgressIndicator.hxx opencascade-7.5.1+dfsg1/src/Draw/Draw_ProgressIndicator.hxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_ProgressIndicator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_ProgressIndicator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,33 +43,45 @@ //! Destructor; calls Reset() Standard_EXPORT ~Draw_ProgressIndicator(); - //! Sets text output mode (on/off) - Standard_EXPORT void SetTextMode (const Standard_Boolean theTextMode); - - //! Gets text output mode (on/off) - Standard_EXPORT Standard_Boolean GetTextMode() const; + //! Sets tcl output mode (on/off). + Standard_EXPORT void SetTclMode (const Standard_Boolean theTclMode); + //! Gets tcl output mode (on/off). + Standard_EXPORT Standard_Boolean GetTclMode() const; + + //! Sets console output mode (on/off). + //! If it is on then progress is shown in the standard output. + Standard_EXPORT void SetConsoleMode(const Standard_Boolean theMode); + + //! Gets console output mode (on/off) + Standard_EXPORT Standard_Boolean GetConsoleMode() const; + //! Sets graphical output mode (on/off) Standard_EXPORT void SetGraphMode (const Standard_Boolean theGraphMode); //! Gets graphical output mode (on/off) Standard_EXPORT Standard_Boolean GetGraphMode() const; - + //! Clears/erases opened TCL windows if any //! and sets myBreak to False Standard_EXPORT virtual void Reset() Standard_OVERRIDE; //! Defines method Show of Progress Indicator - Standard_EXPORT virtual Standard_Boolean Show (const Standard_Boolean force = Standard_True) Standard_OVERRIDE; + Standard_EXPORT virtual void Show (const Message_ProgressScope& theScope, + const Standard_Boolean force = Standard_True) Standard_OVERRIDE; //! Redefines method UserBreak of Progress Indicator Standard_EXPORT virtual Standard_Boolean UserBreak() Standard_OVERRIDE; - Standard_EXPORT static Standard_Boolean& DefaultTextMode(); - - //! Get/Set default values for output modes + //! Get/Set default value for tcl mode + Standard_EXPORT static Standard_Boolean& DefaultTclMode(); + + //! Get/Set default value for console mode + Standard_EXPORT static Standard_Boolean& DefaultConsoleMode(); + + //! Get/Set default value for graph mode Standard_EXPORT static Standard_Boolean& DefaultGraphMode(); - + //! Internal method for implementation of UserBreak mechanism; //! note that it uses static variable and thus not thread-safe! Standard_EXPORT static Standard_Address& StopIndicator(); @@ -77,14 +89,16 @@ DEFINE_STANDARD_RTTIEXT(Draw_ProgressIndicator,Message_ProgressIndicator) private: - Standard_Boolean myTextMode; + Standard_Boolean myTclMode; + Standard_Boolean myConsoleMode; Standard_Boolean myGraphMode; - Standard_Address myDraw; + Draw_Interpretor* myDraw; Standard_Boolean myShown; Standard_Boolean myBreak; Standard_Real myUpdateThreshold; Standard_Real myLastPosition; Standard_Size myStartTime; + Standard_ThreadId myGuiThreadId; }; #endif // _Draw_ProgressIndicator_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_VariableCommands.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_VariableCommands.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_VariableCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_VariableCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,8 +23,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -156,9 +158,6 @@ // find a tool Draw_SaveAndRestore* tool = Draw_First; Handle(Draw_ProgressIndicator) progress = new Draw_ProgressIndicator ( di, 1 ); - progress->SetScale ( 0, 100, 1 ); - progress->NewScope(100,"Writing"); - progress->Show(); while (tool) { if (tool->Test(D)) break; @@ -175,8 +174,6 @@ return 1; } Draw::SetProgressBar( 0 ); - progress->EndScope(); - progress->Show(); } os << "0\n\n"; @@ -221,8 +218,7 @@ if (!in.fail()) { // search a tool Handle(Draw_ProgressIndicator) progress = new Draw_ProgressIndicator ( di, 1 ); - progress->NewScope(100,"Reading"); - progress->Show(); + Draw::SetProgressBar(progress); Draw_SaveAndRestore* tool = Draw_First; Draw_SaveAndRestore* aDBRepTool = NULL; @@ -231,7 +227,6 @@ if (!strcmp(typ,toolName)) break; if (!strcmp("DBRep_DrawableShape",toolName)) aDBRepTool = tool; - Draw::SetProgressBar(progress); tool = tool->Next(); } @@ -253,8 +248,6 @@ return 1; } Draw::SetProgressBar( 0 ); - progress->EndScope(); - progress->Show(); } di << name; @@ -388,7 +381,7 @@ if (n < 3) return 1; Standard_Integer id = Draw::Atoi(a[1]); if (!dout.HasView(id)) { - std::cout << "bad view number in draw"<Save(filename); diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Window_1.mm opencascade-7.5.1+dfsg1/src/Draw/Draw_Window_1.mm --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Window_1.mm 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Window_1.mm 2021-02-02 08:51:56.000000000 +0000 @@ -36,6 +36,12 @@ #define NSCompositingOperationSourceOver NSCompositeSourceOver #endif +#if !defined(MAC_OS_X_VERSION_10_14) || (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_14) + #define NSBitmapImageFileTypePNG NSPNGFileType + #define NSBitmapImageFileTypeBMP NSBMPFileType + #define NSBitmapImageFileTypeJPEG NSJPEGFileType + #define NSBitmapImageFileTypeGIF NSGIFFileType +#endif @interface Draw_CocoaView : NSView { @@ -561,10 +567,10 @@ NSString* aFileExtension = [[aFileName pathExtension] lowercaseString]; NSDictionary* aFileTypeDict = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInt: NSPNGFileType], @"png", - [NSNumber numberWithInt: NSBMPFileType], @"bmp", - [NSNumber numberWithInt: NSJPEGFileType], @"jpg", - [NSNumber numberWithInt: NSGIFFileType], @"gif", + [NSNumber numberWithInt: NSBitmapImageFileTypePNG], @"png", + [NSNumber numberWithInt: NSBitmapImageFileTypeBMP], @"bmp", + [NSNumber numberWithInt: NSBitmapImageFileTypeJPEG], @"jpg", + [NSNumber numberWithInt: NSBitmapImageFileTypeGIF], @"gif", nil]; if ([aFileTypeDict valueForKey: aFileExtension] == NULL) { diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Window.cxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Window.cxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Window.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Window.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1453,7 +1453,9 @@ next(firstWindow), previous(NULL), myMemHbm(NULL), - myUseBuffer(Standard_False) + myUseBuffer(Standard_False), + myCurrPen(0), + myCurrMode(0) { if (firstWindow) firstWindow->previous = this; firstWindow = this; @@ -2003,7 +2005,7 @@ y2=a4; } -static DWORD WINAPI tkLoop(VOID); +static DWORD WINAPI tkLoop (LPVOID theThreadParameter); #ifdef _TK static Tk_Window mainWindow; #endif @@ -2027,12 +2029,12 @@ dwMainThreadId = GetCurrentThreadId(); //necessary for normal Tk operation - hThread = CreateThread(NULL, // no security attributes - 0, // use default stack size - (LPTHREAD_START_ROUTINE) tkLoop, // thread function - NULL, // no thread function argument - 0, // use default creation flags - &IDThread); + hThread = CreateThread (NULL, // no security attributes + 0, // use default stack size + tkLoop, // thread function + NULL, // no thread function argument + 0, // use default creation flags + &IDThread); if (!hThread) { std::cout << "Failed to create Tcl/Tk main loop thread. Switching to batch mode..." << std::endl; Draw_Batch = Standard_True; @@ -2082,8 +2084,9 @@ /*--------------------------------------------------------*\ | readStdinThreadFunc \*--------------------------------------------------------*/ -static DWORD WINAPI readStdinThreadFunc() +static DWORD WINAPI readStdinThreadFunc (const LPVOID theThreadParameter) { + (void)theThreadParameter; if (!Draw_IsConsoleSubsystem) { return 1; @@ -2246,8 +2249,9 @@ /*--------------------------------------------------------*\ | tkLoop: implements Tk_Main()-like behaviour in a separate thread \*--------------------------------------------------------*/ -static DWORD WINAPI tkLoop(VOID) +static DWORD WINAPI tkLoop (const LPVOID theThreadParameter) { + (void)theThreadParameter; Tcl_CreateExitHandler(exitProc, 0); Draw_Interpretor& aCommands = Draw::GetInterpretor(); @@ -2309,7 +2313,7 @@ #endif } } - catch (Standard_Failure) + catch (const Standard_Failure&) { std::cout << "tkLoop: exception in TK_Init\n"; } @@ -2389,12 +2393,12 @@ DWORD IDThread; HANDLE hThread; if (Draw_IsConsoleSubsystem) { - hThread = CreateThread(NULL, // no security attributes - 0, // use default stack size - (LPTHREAD_START_ROUTINE) readStdinThreadFunc, // thread function - NULL, // no thread function argument - 0, // use default creation flags - &IDThread); // returns thread identifier + hThread = CreateThread (NULL, // no security attributes + 0, // use default stack size + readStdinThreadFunc, // thread function + NULL, // no thread function argument + 0, // use default creation flags + &IDThread); // returns thread identifier if (!hThread) { std::cout << "pb in creation of the thread reading stdin" << std::endl; Draw_IsConsoleSubsystem = Standard_False; @@ -2494,6 +2498,6 @@ Standard_Boolean DrawWindow::DefineColor (const Standard_Integer, const char*) { return Standard_True; -}; +} #endif diff -Nru opencascade-7.4.1+dfsg1/src/Draw/Draw_Window.hxx opencascade-7.5.1+dfsg1/src/Draw/Draw_Window.hxx --- opencascade-7.4.1+dfsg1/src/Draw/Draw_Window.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/Draw_Window.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -370,7 +370,13 @@ friend class DrawWindow; public : //constructeur - Segment () {} + Segment () + : x1(0), + y1(0), + x2(0), + y2(0) + { + } //destructeur ~Segment () {} diff -Nru opencascade-7.4.1+dfsg1/src/Draw/FILES opencascade-7.5.1+dfsg1/src/Draw/FILES --- opencascade-7.4.1+dfsg1/src/Draw/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Draw/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -43,6 +43,7 @@ Draw_Marker3D.cxx Draw_Marker3D.hxx Draw_MarkerShape.hxx +Draw_MessageCommands.cxx Draw_Number.cxx Draw_Number.hxx Draw_PInterp.hxx diff -Nru opencascade-7.4.1+dfsg1/src/DrawDim/DrawDim_Dimension.cxx opencascade-7.5.1+dfsg1/src/DrawDim/DrawDim_Dimension.cxx --- opencascade-7.4.1+dfsg1/src/DrawDim/DrawDim_Dimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DrawDim/DrawDim_Dimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,6 +32,7 @@ //======================================================================= DrawDim_Dimension::DrawDim_Dimension() : is_valued(Standard_False), + myValue(0.0), myTextColor(Draw_blanc) { } diff -Nru opencascade-7.4.1+dfsg1/src/DrawResources/CheckCommands.tcl opencascade-7.5.1+dfsg1/src/DrawResources/CheckCommands.tcl --- opencascade-7.4.1+dfsg1/src/DrawResources/CheckCommands.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DrawResources/CheckCommands.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -1104,3 +1104,61 @@ # current platform is not equal to given as argument platform, return false return 0 } + +help checkgravitycenter { + Compare Center Of Gravity with given reference data + + Use: checkgravitycenter shape prop_type x y z tol +} +proc checkgravitycenter {shape prop_type x y z tol} { + puts "checkgravitycenter ${shape} $prop_type $x $y $z $tol" + upvar ${shape} ${shape} + + if { $prop_type == "-l" } { + set outstr [lprops $shape] + } elseif { $prop_type == "-s" } { + set outstr [sprops $shape] + } elseif { $prop_type == "-v" } { + set outstr [vprops $shape] + } else { + error "Error : invalid prop_type" + } + + if { ![regexp {\nX = +([-0-9.+eE]+).*\nY = +([-0-9.+eE]+).*\nZ = +([-0-9.+eE]+)} ${outstr} full comp_x comp_y comp_z] } { + error "Error : cannot evaluate properties" + } + + if { [expr abs($comp_x-$x)] < $tol && [expr abs($comp_y-$y)] < $tol && [expr abs($comp_z-$z)] < $tol } { + puts "Check of center of gravity is OK: value = ($comp_x, $comp_y, $comp_z), expected = ($x, $y, $z)" + } else { + puts "Error: center of gravity ($comp_x, $comp_y, $comp_z) is not equal to expected ($x, $y, $z)" + } +} + +help checkMultilineStrings { + Compares two strings. + Logically splits the strings to lines by the new line characters. + Outputs the first different lines. + + Use: checkMultilineStrings +} +proc checkMultilineStrings {tS1 tS2} { + set aL1 [split $tS1 \n] + set aL2 [split $tS2 \n] + + set aC1 [llength $aL1] + set aC2 [llength $aL2] + set aC [expr {min($aC1, $aC2)}] + + for {set aI 0} {$aI < $aC} {incr aI} { + if {[lindex $aL1 $aI] != [lindex $aL2 $aI]} { + puts "Error. $aI-th lines are different:" + puts "[lindex $aL1 $aI]" + puts "[lindex $aL2 $aI]" + } + } + + if {$aC1 != $aC2} { + puts "Error. Line counts are different: $aC1 != $aC2." + } +} diff -Nru opencascade-7.4.1+dfsg1/src/DrawResources/StandardCommands.tcl opencascade-7.5.1+dfsg1/src/DrawResources/StandardCommands.tcl --- opencascade-7.4.1+dfsg1/src/DrawResources/StandardCommands.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DrawResources/StandardCommands.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -27,67 +27,56 @@ set tcl_prompt2 {puts -nonewline "> "} - ################################################# # the help command in TCL ################################################# - - proc help {{command ""} {helpstring ""} {group "Procedures"}} { - - global Draw_Helps Draw_Groups - - if {$command == ""} { - + global Draw_Helps Draw_Groups + if {$command == ""} { # help general foreach h [lsort [array names Draw_Groups]] { - puts "" - puts "" - puts $h - set i 0 - foreach f [lsort $Draw_Groups($h)] { + dputs -intense "\n\n$h" + set i 0 + foreach f [lsort $Draw_Groups($h)] { if {$i == 0} { - puts "" - puts -nonewline " " + puts "" + puts -nonewline " " } puts -nonewline $f for {set j [string length $f]} {$j < 15} {incr j} { - puts -nonewline " " + puts -nonewline " " } incr i if {$i == 4} {set i 0} - } - puts "" + } + puts "" } - } elseif {$helpstring == ""} { - + } elseif {$helpstring == ""} { # help function set isfound 0 foreach f [lsort [array names Draw_Helps]] { - if {[string match $command $f]} { - puts -nonewline $f + if {[string match $command $f]} { + dputs -nonewline -intense $f for {set j [string length $f]} {$j < 15} {incr j} { - puts -nonewline " " + puts -nonewline " " } puts " : $Draw_Helps($f)" set isfound 1 - } + } } if {!$isfound} { - if {[string first * $command] != -1} { - puts "No matching commands found!" - } else { - puts "No help found for '$command'! Please try 'help $command*' to find matching commands." - } + if {[string first * $command] != -1} { + puts "No matching commands found!" + } else { + puts "No help found for '$command'! Please try 'help $command*' to find matching commands." + } } - } else { - + } else { # set help lappend Draw_Groups($group) $command set Draw_Helps($command) $helpstring - } - - flush stdout + } + flush stdout } help help {help pattern, or help command string group, to set help} {DRAW General Commands} diff -Nru opencascade-7.4.1+dfsg1/src/DrawResources/TestCommands.tcl opencascade-7.5.1+dfsg1/src/DrawResources/TestCommands.tcl --- opencascade-7.4.1+dfsg1/src/DrawResources/TestCommands.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DrawResources/TestCommands.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -144,7 +144,9 @@ -xml filename: write XML report for Jenkins (in JUnit-like format) -beep: play sound signal at the end of the tests -regress dirname: re-run only a set of tests that have been detected as regressions on some previous run. + -skipped dirname: re-run only a set of tests that have been skipped on some previous run. Here "dirname" is path to directory containing results of previous run. + -skip N: skip first N tests (useful to restart after abort) Groups, grids, and test cases to be executed can be specified by list of file masks, separated by spaces or comma; default is all (*). } @@ -172,7 +174,10 @@ set exc_grid 0 set exc_case 0 set regress 0 - set prev_logdir "" + set skipped 0 + set logdir_regr "" + set logdir_skip "" + set nbskip 0 for {set narg 0} {$narg < [llength $args]} {incr narg} { set arg [lindex $args $narg] @@ -234,13 +239,29 @@ } # re-run only a set of tests that have been detected as regressions on some previous run - if { $arg == "-regress" } { + if { $arg == "-regress" || $arg == "-skipped" } { incr narg if { $narg < [llength $args] && ! [regexp {^-} [lindex $args $narg]] } { - set prev_logdir [lindex $args $narg] - set regress 1 + if { $arg == "-regress" } { + set logdir_regr [file normalize [string trim [lindex $args $narg]]] + set regress 1 + } else { + set logdir_skip [file normalize [string trim [lindex $args $narg]]] + set skipped 1 + } + } else { + error "Option $arg requires argument" + } + continue + } + + # skip N first tests + if { $arg == "-skip" } { + incr narg + if { $narg < [llength $args] && [string is integer [lindex $args $narg]] } { + set nbskip [lindex $args $narg] } else { - error "Option -regress requires argument" + error "Option -skip requires integer argument" } continue } @@ -303,7 +324,6 @@ # check that target log directory is empty or does not exist set logdir [file normalize [string trim $logdir]] - set prev_logdir [file normalize [string trim $prev_logdir]] if { $logdir == "" } { # if specified logdir is empty string, generate unique name like # results/_ @@ -332,7 +352,7 @@ # if option "regress" is given set rerun_group_grid_case {} - if { ${regress} > 0 } { + if { ${regress} > 0 || ${skipped} > 0 } { if { "${groupmask}" != "*"} { lappend rerun_group_grid_case [list $groupmask $gridmask $casemask] } @@ -341,8 +361,8 @@ } if { ${regress} > 0 } { - if { [file exists ${prev_logdir}/tests.log] } { - set fd [open ${prev_logdir}/tests.log] + if { [file exists ${logdir_regr}/tests.log] } { + set fd [open ${logdir_regr}/tests.log] while { [gets $fd line] >= 0 } { if {[regexp {CASE ([^\s]+) ([^\s]+) ([^\s]+): FAILED} $line dump group grid casename] || [regexp {CASE ([^\s]+) ([^\s]+) ([^\s]+): IMPROVEMENT} $line dump group grid casename]} { @@ -351,7 +371,20 @@ } close $fd } else { - error "Error: file ${prev_logdir}/tests.log is not found, check your input arguments!" + error "Error: file ${logdir_regr}/tests.log is not found, check your input arguments!" + } + } + if { ${skipped} > 0 } { + if { [file exists ${logdir_skip}/tests.log] } { + set fd [open ${logdir_skip}/tests.log] + while { [gets $fd line] >= 0 } { + if {[regexp {CASE ([^\s]+) ([^\s]+) ([^\s]+): SKIPPED} $line dump group grid casename] } { + lappend rerun_group_grid_case [list $group $grid $casename] + } + } + close $fd + } else { + error "Error: file ${logdir_skip}/tests.log is not found, check your input arguments!" } } @@ -501,7 +534,11 @@ continue } - lappend tests_list [list $dir $group $grid $casename $casefile] + if { $nbskip > 0 } { + incr nbskip -1 + } else { + lappend tests_list [list $dir $group $grid $casename $casefile] + } } } } @@ -571,7 +608,20 @@ if { $logdir != "" } { set imgdir_cmd "set imagedir $logdir/$group/$grid" } # prepare command file for running test case in separate instance of DRAW - set fd_cmd [open $logdir/$group/$grid/${casename}.tcl w] + set file_cmd "$logdir/$group/$grid/${casename}.tcl" + set fd_cmd [open $file_cmd w] + + # UTF-8 encoding is used by default on Linux everywhere, and "unicode" is set + # by default as encoding of stdin and stdout on Windows in interactive mode; + # however in batch mode on Windows default encoding is set to system one (e.g. 1252), + # so we need to set UTF-8 encoding explicitly to have Unicode symbols transmitted + # correctly between calling and caller processes + if { "$tcl_platform(platform)" == "windows" } { + puts $fd_cmd "fconfigure stdout -encoding utf-8" + puts $fd_cmd "fconfigure stdin -encoding utf-8" + } + + # commands to set up and run test puts $fd_cmd "$imgdir_cmd" puts $fd_cmd "set test_image $casename" puts $fd_cmd "_run_test $dir $group $grid $casefile t" @@ -591,10 +641,10 @@ puts $fd_cmd "exit" close $fd_cmd - # commant to run DRAW with a command file; + # command to run DRAW with a command file; # note that empty string is passed as standard input to avoid possible # hang-ups due to waiting for stdin of the launching process - set command "exec <<{} DRAWEXE -f $logdir/$group/$grid/${casename}.tcl" + set command "exec <<{} DRAWEXE -f $file_cmd" # alternative method to run without temporary file; disabled as it needs too many backslashes # else { @@ -1318,7 +1368,15 @@ uplevel source -encoding utf-8 $scriptsdir/$group/end } } res] { - puts "Tcl Exception: $res" + if { "$res" == "" } { set res "EMPTY" } + # in echo mode, output error message using dputs command to have it colored, + # note that doing the same in logged mode would duplicate the message + if { ! $dlog_exists || ! $echo } { + puts "Tcl Exception: $res" + } else { + decho off + dputs -red -intense "Tcl Exception: $res" + } } # stop logging @@ -1558,6 +1616,7 @@ proc _log_test_case {output logdir dir group grid casename logvar} { upvar $logvar log set show_errors 0 + # check result and make HTML log _check_log $dir $group $grid $casename $show_errors $output summary html_log lappend log $summary @@ -1567,6 +1626,11 @@ _log_html $logdir/$group/$grid/$casename.html $html_log "Test $group $grid $casename" _log_save $logdir/$group/$grid/$casename.log "$output\n$summary" "Test $group $grid $casename" } + + # remove intermediate command file used to run test + if { [file exists $logdir/$group/$grid/${casename}.tcl] } { + file delete $logdir/$group/$grid/${casename}.tcl + } } # Auxiliary procedure to save log to file @@ -1710,8 +1774,8 @@ puts $fd "" # time stamp and elapsed time info + puts $fd "

Generated on [clock format [clock seconds] -format {%Y-%m-%d %H:%M:%S}] on [info hostname]\n

" if { $total_time != "" } { - puts $fd "

Generated on [clock format [clock seconds] -format {%Y-%m-%d %H:%M:%S}] on [info hostname]\n

" puts $fd [join [split $total_time "\n"] "

"] } else { puts $fd "

NOTE: This is intermediate summary; the tests are still running! This page will refresh automatically until tests are finished." @@ -2040,6 +2104,15 @@ } } +# auxiliary procedure to produce string comparing two values, where first value is a portion of second +proc _diff_show_positive_ratio {value1 value2} { + if {[expr double ($value2)] == 0.} { + return "$value1 / $value2" + } else { + return "$value1 / $value2 \[[format "%5.2f%%" [expr 100 * double($value1) / double($value2)]]\]" + } +} + # procedure to check cpu user time proc _check_time {regexp_msg} { upvar log log @@ -2102,6 +2175,8 @@ set stat(cpu2) 0 set stat(mem1) 0 set stat(mem2) 0 + set stat(img1) 0 + set stat(img2) 0 set log {} set log_image {} set log_cpu {} @@ -2239,13 +2314,16 @@ } } } + foreach imgfile $imgcommon { + set stat(img2) [expr $stat(img2) + 1] # if { $verbose > 1 } { _log_and_puts log "Checking [split basename /] $casename: $imgfile" } set diffile [_diff_img_name $dir1 $dir2 $basename $imgfile] if { [catch {diffimage [file join $dir1 $basename $imgfile] \ [file join $dir2 $basename $imgfile] \ -toleranceOfColor 0.0 -blackWhite off -borderFilter off $diffile} diff] } { if {$image != false} { + set stat(img1) [expr $stat(img1) + 1] _log_and_puts log_image "IMAGE [split $basename /] $casename: $imgfile cannot be compared" } else { _log_and_puts log "IMAGE [split $basename /] $casename: $imgfile cannot be compared" @@ -2259,6 +2337,7 @@ [file join $dir2 $basename $imgfile] \ -toleranceOfColor $aCaseDiffColorTol -blackWhite off -borderFilter off $diffile} diff2] } { if {$image != false} { + set stat(img1) [expr $stat(img1) + 1] _log_and_puts log_image "IMAGE [split $basename /] $casename: $imgfile cannot be compared" } else { _log_and_puts log "IMAGE [split $basename /] $casename: $imgfile cannot be compared" @@ -2269,6 +2348,7 @@ set toLogImageCase false file delete -force $diffile if {$image != false} { + set stat(img1) [expr $stat(img1) + 1] _log_and_puts log_image "IMAGE [split $basename /] $casename: $imgfile is similar \[$diff different pixels\]" } else { _log_and_puts log "IMAGE [split $basename /] $casename: $imgfile is similar \[$diff different pixels\]" @@ -2278,6 +2358,7 @@ } if {$image != false} { + set stat(img1) [expr $stat(img1) + 1] _log_and_puts log_image "IMAGE [split $basename /] $casename: $imgfile differs \[$diff different pixels\]" } else { _log_and_puts log "IMAGE [split $basename /] $casename: $imgfile differs \[$diff different pixels\]" @@ -2325,6 +2406,13 @@ _log_and_puts log "Total CPU difference: [_diff_show_ratio $stat(cpu1) $stat(cpu2)]" } } + if {$image != false || ($image == false && $cpu == false && $memory == false)} { + if {$image != false} { + _log_and_puts log_image "Total Image difference: [_diff_show_positive_ratio $stat(img1) $stat(img2)]" + } else { + _log_and_puts log "Total Image difference: [_diff_show_positive_ratio $stat(img1) $stat(img2)]" + } + } } } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_AnglePresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_AnglePresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_AnglePresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_AnglePresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -161,7 +161,7 @@ Handle(Graphic3d_ArrayOfPrimitives) aPrims = new Graphic3d_ArrayOfPolylines(12); for( i = 0; i <= 11; i++ ) aPrims->AddVertex(ElCLib::Value(param + angle/11 * i, aCircle2)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); DsgPrs::ComputeSymbol(aPresentation, aDimensionAspect, AttachmentPnt, AttachmentPnt, aDir, aDir, DsgPrs_AS_LASTAR); @@ -171,7 +171,7 @@ param = ElCLib::Parameter(aCircle2, tmpPnt); tmpPnt = ElCLib::Value(param, aCircle2); tmpPnt = tmpPnt.Translated(gp_Vec(0, 0, -2)); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), aDimensionAspect->TextAspect(), txt, tmpPnt); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), aDimensionAspect->TextAspect(), txt, tmpPnt); angle = 2. * M_PI - param ; if( param > OppParam ) @@ -180,7 +180,7 @@ aPrims = new Graphic3d_ArrayOfPolylines(12); for( i = 11; i >= 0; i-- ) aPrims->AddVertex(ElCLib::Value(-angle/11 * i, aCircle2)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } if( AboveInBelowCone( VmaxCircle, VminCircle, myCircle ) == 1 && !IsConeTrimmed ) //above @@ -204,7 +204,7 @@ aPrims->AddVertex(OppositePnt); aPrims->AddVertex(( aPnt.Distance(P1) < aPnt.Distance(P2) )? P11 : P12); } - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } @@ -230,7 +230,7 @@ sprintf(valcar,"%5.2f",theval); Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (aPresentation); + Handle(Graphic3d_Group) aGroup = aPresentation->CurrentGroup(); aGroup->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Ax2 ax(CenterPoint,axisdir,dir1); @@ -343,7 +343,7 @@ sprintf(valcar,"%5.2f",theval); Handle( Prs3d_DimensionAspect ) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup( aPresentation )->SetPrimitivesAspect( LA->LineAspect()->Aspect() ); + aPresentation->CurrentGroup()->SetPrimitivesAspect( LA->LineAspect()->Aspect() ); gp_Circ AngleCirc, AttachCirc; Standard_Real FirstParAngleCirc, LastParAngleCirc, FirstParAttachCirc, LastParAttachCirc; @@ -385,7 +385,7 @@ for (Standard_Integer i = 0; i < NodeNumber; i++, FirstParAngleCirc += delta) aPrims->AddVertex(ElCLib::Value( FirstParAngleCirc, AngleCirc )); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); aPrims = new Graphic3d_ArrayOfSegments(4); } else // null angle @@ -399,7 +399,7 @@ DsgPrs::ComputeSymbol( aPresentation, LA, EndOfArrow1, EndOfArrow2, DirOfArrow1, DirOfArrow2, ArrowPrs ); // Drawing the text - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, OffsetPoint); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, OffsetPoint); // Line from AttachmentPoint1 to end of Arrow1 aPrims->AddVertex(AttachmentPoint1); @@ -408,7 +408,7 @@ aPrims->AddVertex(ProjAttachPoint2); aPrims->AddVertex(EndOfArrow2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // Line or arc from AttachmentPoint2 to its "projection" if (AttachmentPoint2.Distance( ProjAttachPoint2 ) > Precision::Confusion()) @@ -431,7 +431,7 @@ for (Standard_Integer i = 0; i < NodeNumber; i++, FirstParAttachCirc += delta) aPrims->AddVertex(ElCLib::Value( FirstParAttachCirc, AttachCirc )); } - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } } @@ -457,7 +457,7 @@ sprintf(valcar,"%5.2f",theval); Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Dir Norm; if (!dir1.IsParallel(dir2, Precision::Angular())) { @@ -515,7 +515,7 @@ for (Standard_Integer i = 1; i<=nbp; i++) aPrims->AddVertex(ElCLib::Value(udeb+ dteta*(i-1),cer)); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText,OffsetPoint); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText,OffsetPoint); Standard_Real length = LA->ArrowAspect()->Length(); if (length < Precision::Confusion()) length = 1.e-04; @@ -534,7 +534,7 @@ gp_Vec v2(ptarr,ptarr3); const Standard_Real beta = v1.Angle(v2); dirarr.Rotate(ax1, beta); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), ptarr, dirarr, LA->ArrowAspect()->Angle(), length); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), ptarr, dirarr, LA->ArrowAspect()->Angle(), length); aPrims->AddBound(2); aPrims->AddVertex(AttachmentPoint1); @@ -545,13 +545,13 @@ ax1.SetLocation(ptarr); gp_Dir dirarr2(vecarr); dirarr2.Rotate(ax1, - beta); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), ptarr, dirarr2, LA->ArrowAspect()->Angle(), length); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), ptarr, dirarr2, LA->ArrowAspect()->Angle(), length); aPrims->AddBound(2); aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(ptarr); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } @@ -576,7 +576,7 @@ sprintf(valcar,"%5.2f",theval); Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Dir Norm = dir1.Crossed(dir2); if (Abs(theval) > M_PI) Norm.Reverse(); @@ -626,7 +626,7 @@ for (Standard_Integer i = 1; i<=nbp; i++) aPrims->AddVertex(ElCLib::Value(udeb+ dteta*(i-1),cer)); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, OffsetPoint); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, OffsetPoint); Standard_Real length = LA->ArrowAspect()->Length(); if (length < Precision::Confusion()) length = 1.e-04; @@ -662,7 +662,7 @@ aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(ptarr1); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // One traces the arrows DsgPrs::ComputeSymbol(aPresentation,LA,ptarr,ptarr1,dirarr,dirarr2,ArrowPrs); @@ -692,7 +692,7 @@ TCollection_ExtendedString aText(valas); Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Dir Norm = dir1.Crossed(dir2); if (Abs(theval) > M_PI) Norm.Reverse(); @@ -742,7 +742,7 @@ for (Standard_Integer i = 1; i<=nbp; i++) aPrims->AddVertex(ElCLib::Value(udeb+ dteta*(i-1),cer)); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, OffsetPoint); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, OffsetPoint); Standard_Real length = LA->ArrowAspect()->Length(); if (length < Precision::Confusion()) length = 1.e-04; @@ -762,7 +762,7 @@ const Standard_Real beta = v1.Angle(v2); dirarr.Rotate(ax1, beta); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), ptarr, dirarr, LA->ArrowAspect()->Angle(), length); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), ptarr, dirarr, LA->ArrowAspect()->Angle(), length); aPrims->AddBound(2); aPrims->AddVertex(AttachmentPoint1); @@ -773,13 +773,13 @@ gp_Dir dirarr2(vecarr); dirarr2.Rotate(ax1, -beta); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), ptarr, dirarr2, LA->ArrowAspect()->Angle(), length); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), ptarr, dirarr2, LA->ArrowAspect()->Angle(), length); aPrims->AddBound(2); aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(ptarr); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } void DsgPrs_AnglePresentation::Add (const Handle(Prs3d_Presentation)& aPresentation, @@ -791,7 +791,7 @@ const DsgPrs_ArrowSide ArrowSide) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Dir dir1(gp_Vec(CenterPoint, AttachmentPoint1)); gp_Ax2 ax(CenterPoint,theAxe.Direction(),dir1); @@ -803,7 +803,7 @@ Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(nbp); for (Standard_Integer i = 1; i<=nbp; i++) aPrims->AddVertex(ElCLib::Value(dteta*(i-1),cer)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); Standard_Real uc1 = 0.; Standard_Real uc2 = ElCLib::Parameter(cer,AttachmentPoint1.Rotated(theAxe,theval)); @@ -818,21 +818,21 @@ case DsgPrs_AS_FIRSTAR: { ElCLib::D1(uc1,cer,ptarr,vecarr); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), ptarr, gp_Dir(-vecarr), LA->ArrowAspect()->Angle(), length); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), ptarr, gp_Dir(-vecarr), LA->ArrowAspect()->Angle(), length); break; } case DsgPrs_AS_LASTAR: { ElCLib::D1(uc2,cer,ptarr,vecarr); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), ptarr, gp_Dir(vecarr), LA->ArrowAspect()->Angle(), length); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), ptarr, gp_Dir(vecarr), LA->ArrowAspect()->Angle(), length); break; } case DsgPrs_AS_BOTHAR: { ElCLib::D1(uc1,cer,ptarr,vecarr); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), ptarr, gp_Dir(-vecarr), LA->ArrowAspect()->Angle(), length); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), ptarr, gp_Dir(-vecarr), LA->ArrowAspect()->Angle(), length); ElCLib::D1(uc2,cer,ptarr,vecarr); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), ptarr, gp_Dir(vecarr), LA->ArrowAspect()->Angle(), length); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), ptarr, gp_Dir(vecarr), LA->ArrowAspect()->Angle(), length); break; } default: break; diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_Chamf2dPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_Chamf2dPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_Chamf2dPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_Chamf2dPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,17 +38,17 @@ { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(aPntAttach); aPrims->AddVertex(aPntEnd); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); gp_Dir ArrowDir(aPntAttach.XYZ()-aPntEnd.XYZ()); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), aPntAttach, ArrowDir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), aPntAttach, ArrowDir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, aPntEnd); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, aPntEnd); } @@ -67,14 +67,14 @@ { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(aPntAttach); aPrims->AddVertex(aPntEnd); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, aPntEnd); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, aPntEnd); gp_Dir ArrowDir(aPntAttach.XYZ()-aPntEnd.XYZ()); gp_Dir ArrowDir1 = ArrowDir; diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_ConcentricPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_ConcentricPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_ConcentricPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_ConcentricPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,7 +14,6 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #include #include #include @@ -26,7 +25,6 @@ #include #include #include -#include void DsgPrs_ConcentricPresentation::Add( const Handle(Prs3d_Presentation)& aPresentation, @@ -43,7 +41,7 @@ const Standard_Integer nbp = 50; const Standard_Real dteta = (2. * M_PI)/nbp; - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(2*nbp+6,4); @@ -90,5 +88,5 @@ aPrims->AddVertex(p1); aPrims->AddVertex(p2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -109,7 +108,7 @@ { Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); anArrayOfPoints->AddVertex (pt1.X(), pt1.Y(), pt1.Z()); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints); + aPresentation->CurrentGroup()->AddPrimitiveArray (anArrayOfPoints); } break; } @@ -119,7 +118,7 @@ // On dessine un rond Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); anArrayOfPoints->AddVertex (pt2.X(), pt2.Y(), pt2.Z()); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints); + aPresentation->CurrentGroup()->AddPrimitiveArray (anArrayOfPoints); break; } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_DatumPrs.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_DatumPrs.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_DatumPrs.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_DatumPrs.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,7 @@ const Handle(Prs3d_Drawer)& theDrawer) { Handle(Prs3d_DatumAspect) aDatumAspect = theDrawer->DatumAspect(); - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePresentation); + Handle(Graphic3d_Group) aGroup = thePresentation->CurrentGroup(); gp_Ax2 anAxis (theDatum); gp_Pnt anOrigin = anAxis.Location(); diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_DiameterPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_DiameterPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_DiameterPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_DiameterPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,7 +48,7 @@ const Standard_Boolean IsDiamSymbol ) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Standard_Real parat = ElCLib::Parameter(aCircle, AttachmentPoint); gp_Pnt ptoncirc = ElCLib::Value (parat, aCircle); @@ -73,13 +73,13 @@ Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(pt1); aPrims->AddVertex(OppositePoint); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // value TCollection_ExtendedString Text = aText; if(IsDiamSymbol) Text = TCollection_ExtendedString("\330 ") + aText; // VRO (2007-05-17) inserted a blank. - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), Text, AttachmentPoint); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), Text, AttachmentPoint); // arrows gp_Dir arrdir (vecrap); @@ -144,7 +144,7 @@ } Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Standard_Real parEndOfArrow = ElCLib::Parameter(aCircle,AttachmentPoint); gp_Pnt EndOfArrow; gp_Pnt DrawPosition = AttachmentPoint;// point of attachment @@ -185,13 +185,13 @@ Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(DrawPosition); aPrims->AddVertex(EndOfArrow); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // text TCollection_ExtendedString Text = aText; if(IsDiamSymbol) Text = TCollection_ExtendedString("\330 ") + Text;// => \330 | \370? - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), Text, DrawPosition); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), Text, DrawPosition); // Add presentation of arrow gp_Dir DirOfArrow(gp_Vec(DrawPosition, EndOfArrow).XYZ()); diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_EllipseRadiusPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_EllipseRadiusPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_EllipseRadiusPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_EllipseRadiusPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,7 +57,7 @@ const DsgPrs_ArrowSide ArrowPrs) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); const Standard_Real dist = aCenter.Distance( aPosition ); const Standard_Boolean inside = ( dist <= theval ); @@ -66,12 +66,12 @@ Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(aCenter); aPrims->AddVertex(EndPoint); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // value TCollection_ExtendedString Text(IsMaxRadius? "a = " : "b = "); Text += aText; - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), Text, aPosition); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), Text, aPosition); // arrows gp_Dir arrdir( gp_Vec( aCenter, anEndOfArrow)); @@ -99,7 +99,7 @@ const DsgPrs_ArrowSide ArrowPrs) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); if(!IsInDomain) { @@ -115,7 +115,7 @@ Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(NodeNumber); for (Standard_Integer i = 0 ; i < NodeNumber; i++, parFirst += delta) aPrims->AddVertex(ElCLib::Value( parFirst, anEllipse )); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } DsgPrs_EllipseRadiusPresentation::Add(aPresentation, aDrawer, theval, aText, aPosition, anEndOfArrow, aCenter, IsMaxRadius, ArrowPrs); @@ -141,7 +141,7 @@ const DsgPrs_ArrowSide ArrowPrs) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); if(!IsInDomain) { @@ -167,7 +167,7 @@ aCurve->D0( parFirst, p1 ); aPrims->AddVertex(p1); } - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } DsgPrs_EllipseRadiusPresentation::Add(aPresentation, aDrawer, theval, aText, aPosition, anEndOfArrow, aCenter, IsMaxRadius, ArrowPrs); diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_EqualDistancePresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_EqualDistancePresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_EqualDistancePresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_EqualDistancePresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -48,7 +47,7 @@ const Handle( Geom_Plane )& Plane ) { Handle( Prs3d_DimensionAspect ) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup( aPresentation )->SetPrimitivesAspect( LA->LineAspect()->Aspect() ); + aPresentation->CurrentGroup()->SetPrimitivesAspect( LA->LineAspect()->Aspect() ); // Line between two middles gp_Pnt Middle12( (Point1.XYZ() + Point2.XYZ()) * 0.5 ), Middle34( (Point3.XYZ() + Point4.XYZ()) * 0.5 ); @@ -56,7 +55,7 @@ Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(Middle12); aPrims->AddVertex(Middle34); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // Add presentation of arrows (points) gp_Dir aDir( 0, 0, 1 ); @@ -112,7 +111,7 @@ TCollection_ExtendedString aText("=="); //Draw the text - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation),LA->TextAspect(), aText, aTextPos); + Prs3d_Text::Draw (aPresentation->CurrentGroup(),LA->TextAspect(), aText, aTextPos); } @@ -132,7 +131,7 @@ gp_Pnt& aProj2) { const Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Lin L1 (aPoint1,aDirection); gp_Lin L2 (aPoint2,aDirection); @@ -144,7 +143,7 @@ aPrims->AddVertex(aProj1); aPrims->AddVertex(aProj2); aPrims->AddVertex(aPoint2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); //add arrows presentation gp_Dir aDir(aProj2.XYZ() - aProj1.XYZ()); @@ -170,7 +169,7 @@ const DsgPrs_ArrowSide anArrowSide) { const Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Standard_Real aPar11, aPar12, aPar21, aPar22; if(aCirc1.Radius() > Precision::Confusion()){ @@ -193,7 +192,7 @@ Handle(Graphic3d_ArrayOfPrimitives) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(aPoint2); aPrims->AddVertex(aPoint4); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); Standard_Integer i, aNodeNb; Standard_Real aDelta, aCurPar; @@ -208,7 +207,7 @@ for (i = 1; i<= aNodeNb; aCurPar += aDelta, i++) aPrims->AddVertex(ElCLib::Value( aCurPar, aCirc1)); aPrims->AddVertex(aPoint2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } if (aPar22 < aPar21) aPar22 += 2.*M_PI; if ( Abs(aPar22 - aPar21) > Precision::Confusion()) @@ -221,7 +220,7 @@ for (i = 1; i<= aNodeNb; aCurPar += aDelta, i++) aPrims->AddVertex(ElCLib::Value( aCurPar, aCirc2)); aPrims->AddVertex(aPoint4); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } //get the direction of interval diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_EqualRadiusPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_EqualRadiusPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_EqualRadiusPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_EqualRadiusPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,6 @@ #include #include #include -#include #include #include @@ -42,14 +41,14 @@ const Handle( Geom_Plane )& Plane ) { Handle( Prs3d_DimensionAspect ) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup( aPresentation )->SetPrimitivesAspect( LA->LineAspect()->Aspect() ); + aPresentation->CurrentGroup()->SetPrimitivesAspect( LA->LineAspect()->Aspect() ); Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(4); aPrims->AddVertex(FirstPoint); aPrims->AddVertex(FirstCenter); aPrims->AddVertex(SecondCenter); aPrims->AddVertex(SecondPoint); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // Add presentation of arrows gp_Dir FirstDir = gce_MakeDir( FirstCenter, FirstPoint ), SecondDir = gce_MakeDir( SecondCenter, SecondPoint ); @@ -91,6 +90,6 @@ } //Draw the text - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, aTextPos); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, aTextPos); //ota === end === } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_FilletRadiusPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_FilletRadiusPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_FilletRadiusPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_FilletRadiusPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -71,7 +71,7 @@ gp_Circ FilletCirc; // gp_Pnt NewPosition, EndOfArrow; Handle( Prs3d_DimensionAspect ) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup( aPresentation )->SetPrimitivesAspect( LA->LineAspect()->Aspect() ); + aPresentation->CurrentGroup()->SetPrimitivesAspect( LA->LineAspect()->Aspect() ); Standard_Real ArrowLength = LA->ArrowAspect()->Length(); DsgPrs::ComputeFilletRadiusPresentation( ArrowLength, @@ -101,7 +101,7 @@ Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(NodeNumber); for (Standard_Integer i = 0 ; i < NodeNumber; i++, FirstParCirc += delta) aPrims->AddVertex(ElCLib::Value( FirstParCirc, FilletCirc )); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); HasCircle = Standard_True; Handle(Geom_Circle) Circle = new Geom_Circle( FilletCirc ); @@ -116,10 +116,10 @@ Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(DrawPosition); aPrims->AddVertex(EndOfArrow); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // Drawing the text - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, DrawPosition); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, DrawPosition); // Add presentation of arrows DsgPrs::ComputeSymbol( aPresentation, LA, EndOfArrow, EndOfArrow, DirOfArrow, DirOfArrow, ArrowPrs ); diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_FixPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_FixPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_FixPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_FixPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,6 @@ #include #include #include -#include //======================================================================= //function : Add @@ -43,7 +42,7 @@ const Standard_Real symbsize) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(10); @@ -90,14 +89,14 @@ aPrims->AddVertex(PF); aPrims->AddVertex(PL); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Quantity_Color aColor = LA->LineAspect()->Aspect()->Color(); Handle(Graphic3d_AspectMarker3d) aMarkerAsp = new Graphic3d_AspectMarker3d (Aspect_TOM_O, aColor, 1.0); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect (aMarkerAsp); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aMarkerAsp); Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); anArrayOfPoints->AddVertex (aPntAttach.X(), aPntAttach.Y(), aPntAttach.Z()); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints); + aPresentation->CurrentGroup()->AddPrimitiveArray (anArrayOfPoints); } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_IdenticPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_IdenticPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_IdenticPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_IdenticPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,24 +43,24 @@ const gp_Pnt& aPntOffset) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(aPntAttach); aPrims->AddVertex(aPntOffset); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Quantity_Color aColor = LA->LineAspect()->Aspect()->Color(); Handle(Graphic3d_AspectMarker3d) aMarkerAsp = new Graphic3d_AspectMarker3d (Aspect_TOM_O, aColor, 1.0); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect (aMarkerAsp); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aMarkerAsp); Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); anArrayOfPoints->AddVertex (aPntAttach.X(), aPntAttach.Y(), aPntAttach.Z()); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints); + aPresentation->CurrentGroup()->AddPrimitiveArray (anArrayOfPoints); // texte - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, aPntOffset); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, aPntOffset); } @@ -72,7 +72,7 @@ const gp_Pnt& aPntOffset) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(4); @@ -93,10 +93,10 @@ else aPrims->AddVertex(aSAttach); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // texte - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, aPntOffset); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, aPntOffset); } @@ -110,7 +110,7 @@ const gp_Pnt& aPntOffset) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Ax2 ax = theAxe; ax.SetLocation(aCenter); @@ -141,10 +141,10 @@ for (Standard_Integer i = 1; i<=nbp; i++) aPrims->AddVertex(ElCLib::Value(pFAttach + dteta*(i-1),CC)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // texte - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, aPntOffset); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, aPntOffset); } // jfa 16/10/2000 @@ -159,7 +159,7 @@ const gp_Pnt& aPntOnCirc) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Ax2 ax = theAxe; ax.SetLocation(aCenter); @@ -190,10 +190,10 @@ for (Standard_Integer i = 1; i<=nbp; i++) aPrims->AddVertex(ElCLib::Value(pFAttach + dteta*(i-1),CC)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // texte - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, aPntOffset); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, aPntOffset); } // jfa 16/10/2000 end @@ -208,7 +208,7 @@ const gp_Pnt& aPntOnElli) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Standard_Real pFAttach = ElCLib::Parameter(anEllipse, aFAttach); Standard_Real pSAttach = ElCLib::Parameter(anEllipse, aSAttach); @@ -235,9 +235,9 @@ for (Standard_Integer i = 1; i<=nbp; i++) aPrims->AddVertex(ElCLib::Value(pFAttach + dteta*(i-1),anEllipse)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // texte - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, aPntOffset); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, aPntOffset); } // jfa 10/10/2000 end diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_LengthPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_LengthPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_LengthPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_LengthPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -48,7 +47,7 @@ const gp_Pnt& OffsetPoint) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Lin L1 (AttachmentPoint1,aDirection); gp_Lin L2 (AttachmentPoint2,aDirection); @@ -91,20 +90,20 @@ arrdir.Reverse(); // arrow 1 : 2nd group - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), Proj1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), Proj1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); // arrow 2 : 3rd group - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), Proj2, arrdir.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), Proj2, arrdir.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); - Prs3d_Root::NewGroup(aPresentation); + aPresentation->NewGroup(); // text : 4th group - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, offp); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, offp); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); // processing of call 1 : 5th group aPrims->AddVertex(AttachmentPoint1); @@ -114,7 +113,7 @@ aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(Proj2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } //================================================================================== @@ -133,7 +132,7 @@ const DsgPrs_ArrowSide ArrowPrs ) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Pnt EndOfArrow1, EndOfArrow2; gp_Dir DirOfArrow1; @@ -175,7 +174,7 @@ DsgPrs::ComputeSymbol( aPresentation, LA, EndOfArrow1, EndOfArrow2, DirOfArrow1, DirOfArrow1.Reversed(), ArrowPrs ); // Drawing the text - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, OffsetPoint); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, OffsetPoint); // Line from AttachmentPoint1 to end of Arrow1 aPrims->AddVertex(AttachmentPoint1); @@ -185,7 +184,7 @@ aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(EndOfArrow2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } @@ -204,7 +203,7 @@ const DsgPrs_ArrowSide ArrowPrs) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Lin L1 (AttachmentPoint1,aDirection); gp_Lin L2 (AttachmentPoint2,aDirection); @@ -255,10 +254,10 @@ aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(Proj2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // text - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, offp); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, offp); // symbols at the extremities of the face DsgPrs::ComputeSymbol(aPresentation,LA,Proj1,Proj2,arrdir,arrdir.Reversed(),ArrowPrs); @@ -281,7 +280,7 @@ const DsgPrs_ArrowSide ArrowPrs ) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Pnt EndOfArrow2; gp_Dir DirOfArrow1; @@ -320,13 +319,13 @@ Handle(Graphic3d_ArrayOfPrimitives) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(FirstPoint); aPrims->AddVertex(LastPoint); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // Add presentation of arrows DsgPrs::ComputeSymbol( aPresentation, LA, AttachmentPoint1, EndOfArrow2, DirOfArrow1, DirOfArrow1.Reversed(), ArrowPrs ); // Drawing the text - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, OffsetPoint); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, OffsetPoint); // Two curves from end of Arrow2 to AttachmentPoint2 Standard_Real Alpha, delta; @@ -340,7 +339,7 @@ aPrims = new Graphic3d_ArrayOfPolylines(NodeNumber); for (Standard_Integer i = 1; i <= NodeNumber; i++, FirstU += delta) aPrims->AddVertex(VCurve->Value( FirstU )); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } Alpha = Abs( deltaV ); if (Alpha > Precision::Angular() && AlphaAddVertex(UCurve->Value( FirstV )); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } } @@ -369,27 +368,27 @@ Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(Pt1); aPrims->AddVertex(Pt2); - Prs3d_Root::CurrentGroup(aPrs)->AddPrimitiveArray(aPrims); + aPrs->CurrentGroup()->AddPrimitiveArray(aPrims); gp_Vec V ; switch(ArrowPrs) { case DsgPrs_AS_LASTAR: - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPrs), Pt2, gp_Dir(gp_Vec(Pt1,Pt2)), + Prs3d_Arrow::Draw (aPrs->CurrentGroup(), Pt2, gp_Dir(gp_Vec(Pt1,Pt2)), aDrawer->DimensionAspect()->ArrowAspect()->Angle(), aDrawer->DimensionAspect()->ArrowAspect()->Length()); break; case DsgPrs_AS_FIRSTAR: - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPrs), Pt1, gp_Dir(gp_Vec(Pt2,Pt1)), + Prs3d_Arrow::Draw (aPrs->CurrentGroup(), Pt1, gp_Dir(gp_Vec(Pt2,Pt1)), aDrawer->DimensionAspect()->ArrowAspect()->Angle(), aDrawer->DimensionAspect()->ArrowAspect()->Length()); break; case DsgPrs_AS_BOTHAR: V = gp_Vec(Pt1,Pt2); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPrs), Pt2, gp_Dir(V), + Prs3d_Arrow::Draw (aPrs->CurrentGroup(), Pt2, gp_Dir(V), aDrawer->DimensionAspect()->ArrowAspect()->Angle(), aDrawer->DimensionAspect()->ArrowAspect()->Length()); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPrs), Pt1, gp_Dir(V.Reversed()), + Prs3d_Arrow::Draw (aPrs->CurrentGroup(), Pt1, gp_Dir(V.Reversed()), aDrawer->DimensionAspect()->ArrowAspect()->Angle(), aDrawer->DimensionAspect()->ArrowAspect()->Length()); break; diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_MidPointPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_MidPointPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_MidPointPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_MidPointPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -59,8 +58,8 @@ if ( first ) { // center of the symmetry - circle around the MidPoint - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); const Standard_Real alpha = 2. * M_PI; const Standard_Integer nbp = 100; @@ -76,26 +75,26 @@ aPrims->AddVertex(Position.IsEqual(MidPoint,rad)? MidPoint : ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM)); // mid point aPrims->AddVertex(Position); // text position - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // texte TCollection_ExtendedString aText(" (+)"); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, Position); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, Position); } if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) ) { if ( !first ) { - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); } // segment from mid point to the geometry Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(ElCLib::Value(ElCLib::Parameter(aCircleM,AttachPoint),aCircleM)); // mid point aPrims->AddVertex(AttachPoint); // attach point to the geometry - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } } @@ -123,13 +122,13 @@ gp_Circ aCircleM (ax,rad); // segment on line - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfPrimitives) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(Point1); aPrims->AddVertex(Point2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); if ( first ) { @@ -148,11 +147,11 @@ aPrims->AddVertex(Position.IsEqual(MidPoint,rad)? MidPoint : ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM)); // mid point aPrims->AddVertex(Position); // text position - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // texte TCollection_ExtendedString aText (" (+)"); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, Position); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, Position); } if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) ) @@ -161,7 +160,7 @@ aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(ElCLib::Value(ElCLib::Parameter(aCircleM,AttachPoint),aCircleM)); aPrims->AddVertex(AttachPoint); // attach point to the geometry - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } } @@ -189,8 +188,8 @@ gp_Circ aCircleM (ax,rad); // segment on circle - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); const Standard_Real pf = ElCLib::Parameter(aCircle,Point1); const Standard_Real pl = ElCLib::Parameter(aCircle,Point2); @@ -203,7 +202,7 @@ Handle(Graphic3d_ArrayOfPrimitives) aPrims = new Graphic3d_ArrayOfPolylines(nbp); for (Standard_Integer i = 1; i <= nbp; i++) aPrims->AddVertex(ElCLib::Value(pf + dteta*(i-1),aCircle)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); if ( first ) { @@ -222,11 +221,11 @@ aPrims->AddVertex(Position.IsEqual(MidPoint,rad)? MidPoint : ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM)); // mid point aPrims->AddVertex(Position); // text position - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // texte TCollection_ExtendedString aText (" (+)"); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, Position); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, Position); } if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) ) @@ -235,7 +234,7 @@ aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(ElCLib::Value(ElCLib::Parameter(aCircleM,AttachPoint),aCircleM)); // mid point aPrims->AddVertex(AttachPoint); // attach point to the geometry - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } } @@ -265,8 +264,8 @@ gp_Circ aCircleM (ax,rad); // segment on ellipse - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); const Standard_Real pf = ElCLib::Parameter(aCircle,Point1); const Standard_Real pl = ElCLib::Parameter(aCircle,Point2); @@ -279,7 +278,7 @@ Handle(Graphic3d_ArrayOfPrimitives) aPrims = new Graphic3d_ArrayOfPolylines(nbp); for (Standard_Integer i = 1; i <= nbp; i++) aPrims->AddVertex(ElCLib::Value(pf + dteta*(i-1),aCircle)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); if ( first ) { @@ -298,11 +297,11 @@ aPrims->AddVertex(Position.IsEqual(MidPoint,rad)? MidPoint : ElCLib::Value(ElCLib::Parameter(aCircleM,Position),aCircleM)); // mid point aPrims->AddVertex(Position); // text position - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // texte TCollection_ExtendedString aText (" (+)"); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, Position); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, Position); } if ( !AttachPoint.IsEqual(MidPoint, Precision::Confusion()) ) @@ -311,6 +310,6 @@ aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(ElCLib::Value(ElCLib::Parameter(aCircleM,AttachPoint),aCircleM)); // mid point aPrims->AddVertex(AttachPoint); // attach point to the geometry - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_OffsetPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_OffsetPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_OffsetPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_OffsetPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,7 +46,7 @@ const gp_Pnt& OffsetPoint) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Lin L1 (AttachmentPoint1,aDirection); gp_Lin L2 (AttachmentPoint2,aDirection2); @@ -93,13 +93,13 @@ aPrims->AddVertex(PointMin); aPrims->AddVertex(PointMax); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); if (DimNulle) { - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), offp, L4.Direction(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), offp, L4.Direction().Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), offp, L4.Direction(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), offp, L4.Direction().Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); } else { @@ -110,27 +110,27 @@ arrdir.Reverse(); // fleche 1 : 2eme groupe - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), Proj1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), Proj1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); // ball 1 : 3eme groupe Quantity_Color aColor = LA->LineAspect()->Aspect()->Color(); Handle(Graphic3d_AspectMarker3d) aMarkerAsp = new Graphic3d_AspectMarker3d (Aspect_TOM_O, aColor, 1.0); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect (aMarkerAsp); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aMarkerAsp); Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); anArrayOfPoints->AddVertex (Proj2.X(), Proj2.Y(), Proj2.Z()); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints); + aPresentation->CurrentGroup()->AddPrimitiveArray (anArrayOfPoints); - Prs3d_Root::NewGroup(aPresentation); + aPresentation->NewGroup(); // texte : 4eme groupe - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, offp); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, offp); } - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); // trait de rappel 1 : 5eme groupe aPrims->AddVertex(AttachmentPoint1); @@ -140,7 +140,7 @@ aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(Proj2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } void DsgPrs_OffsetPresentation::AddAxes (const Handle(Prs3d_Presentation)& aPresentation, @@ -165,47 +165,47 @@ Handle(Graphic3d_AspectLine3d) AxeAsp = new Graphic3d_AspectLine3d (acolor, atype, awidth); AxeAsp->SetType( Aspect_TOL_DOTDASH); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(AxeAsp); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(AxeAsp); // trait d'axe : 1er groupe Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(AttachmentPoint1); aPrims->AddVertex(Proj1); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); - Prs3d_Root::NewGroup(aPresentation); + aPresentation->NewGroup(); Handle(Graphic3d_AspectLine3d) Axe2Asp = new Graphic3d_AspectLine3d (acolor, atype, awidth); Axe2Asp->SetType ( Aspect_TOL_DOTDASH); Axe2Asp->SetWidth ( 4.); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(Axe2Asp); + aPresentation->CurrentGroup()->SetPrimitivesAspect(Axe2Asp); // trait d'axe: 2eme groupe aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(Proj2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // anneau : 3eme et 4eme groupes Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); anArrayOfPoints->AddVertex (Proj2.X(), Proj2.Y(), Proj2.Z()); - Prs3d_Root::NewGroup(aPresentation); + aPresentation->NewGroup(); Handle(Graphic3d_AspectMarker3d) MarkerAsp = new Graphic3d_AspectMarker3d(); MarkerAsp->SetType(Aspect_TOM_O); MarkerAsp->SetScale(4.); //MarkerAsp->SetColor(Quantity_Color(Quantity_NOC_RED)); MarkerAsp->SetColor(acolor); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(MarkerAsp); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints); + aPresentation->CurrentGroup()->SetPrimitivesAspect(MarkerAsp); + aPresentation->CurrentGroup()->AddPrimitiveArray (anArrayOfPoints); - Prs3d_Root::NewGroup(aPresentation); + aPresentation->NewGroup(); Handle(Graphic3d_AspectMarker3d) Marker2Asp = new Graphic3d_AspectMarker3d(); Marker2Asp->SetType(Aspect_TOM_O); Marker2Asp->SetScale(2.); //Marker2Asp->SetColor(Quantity_Color(Quantity_NOC_GREEN)); Marker2Asp->SetColor(acolor); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(Marker2Asp); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints); + aPresentation->CurrentGroup()->SetPrimitivesAspect(Marker2Asp); + aPresentation->CurrentGroup()->AddPrimitiveArray (anArrayOfPoints); } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_ParalPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_ParalPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_ParalPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_ParalPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,7 +43,7 @@ const gp_Pnt& OffsetPoint) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Lin L1 (AttachmentPoint1,aDirection); gp_Lin L2 (AttachmentPoint2,aDirection); gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,OffsetPoint),L1); @@ -77,8 +77,8 @@ aPrims->AddVertex(PointMin); aPrims->AddVertex(PointMax); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); if (dist < (LA->ArrowAspect()->Length()+LA->ArrowAspect()->Length())) outside = Standard_True; @@ -87,20 +87,20 @@ arrdir.Reverse(); // arrow 1 : 2nd group - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), Proj1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), Proj1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); // arrow 2 : 3rd group - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), Proj2, arrdir.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), Proj2, arrdir.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); - Prs3d_Root::NewGroup(aPresentation); + aPresentation->NewGroup(); // text : 4th group - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, offp); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, offp); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); // processing of call 1 : 5th group aPrims->AddVertex(AttachmentPoint1); @@ -110,7 +110,7 @@ aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(Proj2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } @@ -128,7 +128,7 @@ const DsgPrs_ArrowSide ArrowPrs) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Lin L1 (AttachmentPoint1,aDirection); gp_Lin L2 (AttachmentPoint2,aDirection); @@ -177,10 +177,10 @@ aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(Proj2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // text - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, offp); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, offp); //arrows DsgPrs::ComputeSymbol(aPresentation,LA,Proj1,Proj2,arrdir,arrdir.Reversed(),ArrowPrs); diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_PerpenPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_PerpenPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_PerpenPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_PerpenPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -50,7 +50,7 @@ { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); LA->LineAspect()->SetTypeOfLine(Aspect_TOL_SOLID); // ou DOT ou DOTDASH - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); // segments Handle(Graphic3d_ArrayOfPrimitives) aPrims = new Graphic3d_ArrayOfPolylines(6,2); @@ -75,26 +75,26 @@ aPrims->AddVertex(p_symb); aPrims->AddVertex(pAx22); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // points attache if (intOut1 || intOut2) { LA->LineAspect()->SetTypeOfLine(Aspect_TOL_DOT); // ou DOT ou DOTDASH - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); if (intOut1) { aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(pAx1); aPrims->AddVertex(pnt1); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } if (intOut2) { aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(pAx2); aPrims->AddVertex(pnt2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } } } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_RadiusPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_RadiusPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_RadiusPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_RadiusPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,7 +70,7 @@ lpara -= 2.*M_PI; } Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Standard_Real parat = ElCLib::Parameter(aCircle,AttachmentPoint); gp_Pnt attpoint = AttachmentPoint; @@ -114,17 +114,17 @@ Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(firstpoint); aPrims->AddVertex(drawtopoint); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); gp_Dir arrdir = L.Direction(); if (reverseArrow) arrdir.Reverse(); // fleche - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), ptoncirc, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), ptoncirc, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); // texte - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, attpoint); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, attpoint); } //======================================================================= @@ -144,7 +144,7 @@ const Standard_Boolean reverseArrow) { Handle( Prs3d_DimensionAspect ) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup( aPresentation )->SetPrimitivesAspect( LA->LineAspect()->Aspect() ); + aPresentation->CurrentGroup()->SetPrimitivesAspect( LA->LineAspect()->Aspect() ); gp_Pnt LineOrigin, LineEnd; DsgPrs::ComputeRadiusLine(Center, EndOfArrow, AttachmentPoint, drawFromCenter, LineOrigin, LineEnd); @@ -152,10 +152,10 @@ Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(LineOrigin); aPrims->AddVertex(LineEnd); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // text - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), LA->TextAspect(), aText, AttachmentPoint); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), LA->TextAspect(), aText, AttachmentPoint); gp_Dir ArrowDir = gce_MakeDir( LineOrigin , LineEnd ); if (reverseArrow) diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_ShadedPlanePresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_ShadedPlanePresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_ShadedPlanePresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_ShadedPlanePresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,7 +22,6 @@ #include #include #include -#include #include //======================================================================= @@ -35,14 +34,14 @@ const gp_Pnt& aPt2, const gp_Pnt& aPt3) { - Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation); - TheGroup->SetPrimitivesAspect(aDrawer->PlaneAspect()->EdgesAspect()->Aspect()); - TheGroup->SetPrimitivesAspect(aDrawer->ShadingAspect()->Aspect()); + Handle(Graphic3d_Group) aGroup = aPresentation->CurrentGroup(); + aGroup->SetPrimitivesAspect(aDrawer->PlaneAspect()->EdgesAspect()->Aspect()); + aGroup->SetPrimitivesAspect(aDrawer->ShadingAspect()->Aspect()); Handle(Graphic3d_ArrayOfPolygons) aPrims = new Graphic3d_ArrayOfPolygons(4); aPrims->AddVertex(aPt1); aPrims->AddVertex(aPt2); aPrims->AddVertex(aPt3); aPrims->AddVertex(aPt1); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aGroup->AddPrimitiveArray(aPrims); } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_ShapeDirPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_ShapeDirPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_ShapeDirPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_ShapeDirPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -249,12 +249,12 @@ gp_Pnt pt2(pt.XYZ()+leng*dir.XYZ()); - Prs3d_Root::CurrentGroup(prs)->SetPrimitivesAspect(drawer->LineAspect()->Aspect()); + prs->CurrentGroup()->SetPrimitivesAspect(drawer->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(pt); aPrims->AddVertex(pt2); - Prs3d_Root::CurrentGroup(prs)->AddPrimitiveArray(aPrims); + prs->CurrentGroup()->AddPrimitiveArray(aPrims); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (prs), pt2, dir, M_PI/180.*10., leng*0.3); + Prs3d_Arrow::Draw (prs->CurrentGroup(), pt2, dir, M_PI/180.*10., leng*0.3); } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_SymbPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_SymbPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_SymbPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_SymbPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,7 +37,7 @@ Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); Handle(Prs3d_TextAspect) TA = LA->TextAspect(); TA->SetColor(Quantity_NOC_GREEN); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (aPresentation), TA, aText, OffsetPoint); + Prs3d_Text::Draw (aPresentation->CurrentGroup(), TA, aText, OffsetPoint); // 2eme groupe : marker Handle(Geom_CartesianPoint) theP = new Geom_CartesianPoint(OffsetPoint); diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_SymmetricPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_SymmetricPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_SymmetricPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_SymmetricPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,7 +59,7 @@ const gp_Pnt& OffsetPoint) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Pnt ProjOffsetPoint = ElCLib::Value(ElCLib::Parameter(aAxis,OffsetPoint),aAxis); gp_Pnt PjAttachPnt1 = ElCLib::Value(ElCLib::Parameter(aAxis,AttachmentPoint1),aAxis); @@ -158,8 +158,8 @@ if(aAxis.Distance(P1) > D1*(1 + coeff) && !Cross){ //==== PROCESSING OF FACE =========== - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Pj_P1 = ElCLib::Value(ElCLib::Parameter(aAxis,P1),aAxis); gp_Vec Vp(Pj_P1,P1); @@ -222,7 +222,7 @@ aPrims->AddVertex(Sym_pint); aPrims->AddVertex(P2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } /*=================================== @@ -236,8 +236,8 @@ else if (aAxis.Distance(P1) < D1*(1 - coeff) || Cross) { //------ PROCESSING OF FACE ------------ - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Pj_P1 = ElCLib::Value(ElCLib::Parameter(aAxis,P1),aAxis); gp_Vec VpInf(Pj_P1,P1); @@ -301,13 +301,13 @@ aPrims->AddVertex(Sym_pint); aPrims->AddVertex(P2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } else { //==== PROCESSING OF FACE =========== - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(6); @@ -322,21 +322,21 @@ aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(P2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } //==== ARROWS ================ - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); if (dist < (LA->ArrowAspect()->Length()+LA->ArrowAspect()->Length())) outside = Standard_True; gp_Dir arrdir = L3.Direction().Reversed(); if (outside) arrdir.Reverse(); // arrow 1 ---- - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), P1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), P1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); // arrow 2 ---- - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), P2, arrdir.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), P2, arrdir.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); //------------------------------------------------------------------------------------- //| SYMBOL OF SYMMETRY | @@ -371,8 +371,8 @@ //Calculate the extremities of the symbol axis gp_Vec vecAxe = vecA.Multiplied(.7); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(13,5); @@ -426,7 +426,7 @@ aPrims->AddVertex(pm.Translated(vsym)); aPrims->AddVertex(pm.Translated(vsym.Reversed())); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } //=================================================================== @@ -442,7 +442,7 @@ const gp_Pnt& OffsetPoint) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); gp_Pnt OffsetPnt(OffsetPoint.X(),OffsetPoint.Y(),OffsetPoint.Z()); gp_Pnt Center1 = aCircle1.Location(); @@ -491,7 +491,7 @@ Handle(Graphic3d_ArrayOfPrimitives) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(PointMin); aPrims->AddVertex(PointMax); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); //==== PROCESSING OF CALL 1 ===== Standard_Integer nbp = 10; @@ -530,7 +530,7 @@ Standard_Integer i; for(i = 2; i <= nbp; i++, alphaIter += Dalpha) aPrims->AddVertex(ElCLib::Value(ParamPAttach1 + alphaIter,aCircle1)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); //==== PROCESSING OF CALL 2 ===== gp_Pnt Center2 = ProjCenter1.Translated(Vp.Reversed()); @@ -570,20 +570,20 @@ alphaIter = Dalpha; for(i = 2; i <= nbp; i++, alphaIter += Dalpha) aPrims->AddVertex(ElCLib::Value(ParamPAttach2 + alphaIter,aCircle2)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); //==== ARROWS ================ - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); if (dist < (LA->ArrowAspect()->Length()+LA->ArrowAspect()->Length())) outside = Standard_True; gp_Dir arrdir = L3.Direction().Reversed(); if (outside) arrdir.Reverse(); // arrow 1 ---- - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), P1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), P1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); // arrow 2 ---- - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), P2, arrdir.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), P2, arrdir.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); //------------------------------------------------------------------------------------- //| SYMBOL OF SYMMETRY | @@ -609,8 +609,8 @@ //Calculation of extremas of the axis of the symbol gp_Vec vecAxe = vecA.Multiplied(.7); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); aPrims = new Graphic3d_ArrayOfPolylines(13,5); @@ -665,7 +665,7 @@ aPrims->AddVertex(pm.Translated(vsym)); aPrims->AddVertex(pm.Translated(vsym.Reversed())); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } //=================================================================== @@ -680,7 +680,7 @@ const gp_Pnt& OffsetPoint) { Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); if (AttachmentPoint1.IsEqual(AttachmentPoint2,Precision::Confusion())) { @@ -690,15 +690,15 @@ //Marker of localisation of the face Quantity_Color aColor = LA->LineAspect()->Aspect()->Color(); Handle(Graphic3d_AspectMarker3d) aMarkerAsp = new Graphic3d_AspectMarker3d (Aspect_TOM_O, aColor, 1.0); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect (aMarkerAsp); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aMarkerAsp); Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); anArrayOfPoints->AddVertex (AttachmentPoint1.X(), AttachmentPoint1.Y(), AttachmentPoint1.Z()); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints); + aPresentation->CurrentGroup()->AddPrimitiveArray (anArrayOfPoints); //Trace of the linking segment - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(8); @@ -737,7 +737,7 @@ aPrims->AddVertex(sgP21); aPrims->AddVertex(sgP22); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } //============================================================== // OTHER CASES : @@ -773,8 +773,8 @@ gp_Pnt PointMax = ElCLib::Value(parmax,L3); //==== PROCESSING OF FACE =========== - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfPrimitives) aPrims = new Graphic3d_ArrayOfSegments(6); @@ -789,36 +789,36 @@ aPrims->AddVertex(AttachmentPoint2); aPrims->AddVertex(P2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); //==== ARROWS ================ if (dist < (LA->ArrowAspect()->Length()+LA->ArrowAspect()->Length())) outside = Standard_True; gp_Dir arrdir = L3.Direction().Reversed(); if (outside) arrdir.Reverse(); // arrow 1 ---- - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), P1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), P1, arrdir, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); // arrow 2 ---- - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), P2, arrdir.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), P2, arrdir.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); //==== POINTS ================ //Marker of localization of attachment points: - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Quantity_Color aColor = LA->LineAspect()->Aspect()->Color(); Handle(Graphic3d_AspectMarker3d) aMarkerAspAtt = new Graphic3d_AspectMarker3d (Aspect_TOM_O, aColor, 1.0); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect (aMarkerAspAtt); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aMarkerAspAtt); Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints1 = new Graphic3d_ArrayOfPoints (1); anArrayOfPoints1->AddVertex (AttachmentPoint1.X(), AttachmentPoint1.Y(), AttachmentPoint1.Z()); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints1); + aPresentation->CurrentGroup()->AddPrimitiveArray (anArrayOfPoints1); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect (aMarkerAspAtt); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aMarkerAspAtt); Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints2 = new Graphic3d_ArrayOfPoints (1); anArrayOfPoints2->AddVertex (AttachmentPoint2.X(), AttachmentPoint2.Y(), AttachmentPoint2.Z()); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints2); + aPresentation->CurrentGroup()->AddPrimitiveArray (anArrayOfPoints2); //------------------------------------------------------------------------------------- //| SYMBOL OF SYMMETRY | @@ -842,8 +842,8 @@ //Calculate the extremas of the axis of the symbol gp_Vec vecAxe = vecA.Multiplied(.7); - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); aPrims = new Graphic3d_ArrayOfPolylines(13,5); @@ -898,6 +898,6 @@ aPrims->AddVertex(pm.Translated(vsym)); aPrims->AddVertex(pm.Translated(vsym.Reversed())); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); - } + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); + } } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_TangentPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_TangentPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_TangentPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_TangentPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -52,20 +52,20 @@ ARR2->SetLength(length/5); // Array1OfVertex - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); aPrims->AddVertex(p1); aPrims->AddVertex(p2); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); // fleche 1 : - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), p1, aDirection, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), p1, aDirection, LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); // fleche 2 - Prs3d_Root::NewGroup(aPresentation); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect()); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), p2, aDirection.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); + aPresentation->NewGroup(); + aPresentation->CurrentGroup()->SetPrimitivesAspect(LA->LineAspect()->Aspect()); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), p2, aDirection.Reversed(), LA->ArrowAspect()->Angle(), LA->ArrowAspect()->Length()); } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_XYZAxisPresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_XYZAxisPresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_XYZAxisPresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_XYZAxisPresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,6 @@ #include #include #include -#include #include //======================================================================= @@ -41,7 +40,7 @@ const gp_Pnt& aPfirst, const gp_Pnt& aPlast) { - Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(aPresentation); + Handle(Graphic3d_Group) G = aPresentation->CurrentGroup(); G->SetPrimitivesAspect(aLineAspect->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); @@ -49,14 +48,14 @@ aPrims->AddVertex(aPlast); G->AddPrimitiveArray(aPrims); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), aPlast,aDir, M_PI/180.*10., aVal/10.); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), aPlast,aDir, M_PI/180.*10., aVal/10.); if (*theText != '\0') { Handle(Graphic3d_Text) aText = new Graphic3d_Text (1.0f/81.0f); aText->SetText (theText); aText->SetPosition (aPlast); - Prs3d_Root::CurrentGroup(aPresentation)->AddText (aText); + aPresentation->CurrentGroup()->AddText (aText); } } @@ -71,7 +70,7 @@ const gp_Pnt& aPfirst, const gp_Pnt& aPlast) { - Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(aPresentation); + Handle(Graphic3d_Group) G = aPresentation->CurrentGroup(); G->SetPrimitivesAspect(aLineAspect->Aspect()); Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2); @@ -80,7 +79,7 @@ G->AddPrimitiveArray(aPrims); G->SetPrimitivesAspect( anArrowAspect->Aspect() ); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), aPlast, aDir, anArrowAspect->Angle(), aVal/10.); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), aPlast, aDir, anArrowAspect->Angle(), aVal/10.); G->SetPrimitivesAspect(aTextAspect->Aspect()); @@ -89,6 +88,6 @@ Handle(Graphic3d_Text) aText = new Graphic3d_Text (1.0f/81.0f); aText->SetText (theText); aText->SetPosition (aPlast); - Prs3d_Root::CurrentGroup(aPresentation)->AddText(aText); + aPresentation->CurrentGroup()->AddText(aText); } } diff -Nru opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_XYZPlanePresentation.cxx opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_XYZPlanePresentation.cxx --- opencascade-7.4.1+dfsg1/src/DsgPrs/DsgPrs_XYZPlanePresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/DsgPrs/DsgPrs_XYZPlanePresentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,7 +22,6 @@ #include #include #include -#include //======================================================================= //function : Add @@ -35,7 +34,7 @@ const gp_Pnt& aPt2, const gp_Pnt& aPt3) { - Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation); + Handle(Graphic3d_Group) TheGroup = aPresentation->CurrentGroup(); TheGroup->SetPrimitivesAspect(aDrawer->PlaneAspect()->EdgesAspect()->Aspect()); Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(4); diff -Nru opencascade-7.4.1+dfsg1/src/ElSLib/ElSLib.cxx opencascade-7.5.1+dfsg1/src/ElSLib/ElSLib.cxx --- opencascade-7.4.1+dfsg1/src/ElSLib/ElSLib.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ElSLib/ElSLib.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1480,10 +1480,19 @@ Standard_Real cosu = cos(U); Standard_Real sinu = sin(U); gp_Dir dx(cosu,sinu,0.); - gp_Dir dP(x - MajorRadius * cosu, - y - MajorRadius * sinu, - z); - V = dx.AngleWithRef(dP,dx^gp::DZ()); + gp_XYZ dPV(x - MajorRadius * cosu, + y - MajorRadius * sinu, + z); + Standard_Real aMag = dPV.Modulus(); + if (aMag <= gp::Resolution()) + { + V = 0.; + } + else + { + gp_Dir dP(dPV); + V = dx.AngleWithRef(dP, dx^gp::DZ()); + } if (V < -1.e-16) V += PIPI; else if (V < 0) V = 0; } diff -Nru opencascade-7.4.1+dfsg1/src/Expr/Expr_NamedUnknown.cxx opencascade-7.5.1+dfsg1/src/Expr/Expr_NamedUnknown.cxx --- opencascade-7.4.1+dfsg1/src/Expr/Expr_NamedUnknown.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Expr/Expr_NamedUnknown.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -130,7 +130,7 @@ Handle(Expr_GeneralExpression) Expr_NamedUnknown::Derivative (const Handle(Expr_NamedUnknown)& X) const { Handle(Expr_NamedUnknown) me = this; - if (me != X) { + if (!me->IsIdentical(X)) { if (IsAssigned()) { return myExpression->Derivative(X); } diff -Nru opencascade-7.4.1+dfsg1/src/Expr/Expr_Sum.cxx opencascade-7.5.1+dfsg1/src/Expr/Expr_Sum.cxx --- opencascade-7.4.1+dfsg1/src/Expr/Expr_Sum.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Expr/Expr_Sum.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -232,7 +232,7 @@ if (op->NbSubExpressions() > 1) { str = "("; str += op->String(); - str += ")";; + str += ")"; } else { str = op->String(); @@ -243,7 +243,7 @@ if (op->NbSubExpressions() > 1) { str += "("; str += op->String(); - str += ")";; + str += ")"; } else { str += op->String(); diff -Nru opencascade-7.4.1+dfsg1/src/Expr/Expr_UnaryFunction.cxx opencascade-7.5.1+dfsg1/src/Expr/Expr_UnaryFunction.cxx --- opencascade-7.4.1+dfsg1/src/Expr/Expr_UnaryFunction.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Expr/Expr_UnaryFunction.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -125,6 +125,6 @@ TCollection_AsciiString res = myFunction->GetStringName(); res += "("; res += Operand()->String(); - res += ")";; + res += ")"; return res; } diff -Nru opencascade-7.4.1+dfsg1/src/ExprIntrp/ExprIntrp.lex opencascade-7.5.1+dfsg1/src/ExprIntrp/ExprIntrp.lex --- opencascade-7.4.1+dfsg1/src/ExprIntrp/ExprIntrp.lex 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ExprIntrp/ExprIntrp.lex 2021-02-02 08:51:56.000000000 +0000 @@ -45,7 +45,9 @@ // provide safe error handler (exception instead of exit()) #define YY_FATAL_ERROR(msg) ExprIntrperror(msg) +// MSVC specifics #ifdef _MSC_VER + // add includes for flex 2.91 (Linux version) #include #include @@ -57,11 +59,15 @@ // Note that Intel compiler also defines _MSC_VER but has different warning ids #if defined(__INTEL_COMPILER) #pragma warning(disable:177 1786 1736) +#elif defined(__clang__) +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma GCC diagnostic ignored "-Winconsistent-dllimport" +#pragma GCC diagnostic ignored "-Wunneeded-internal-declaration" #else #pragma warning(disable:4131 4244 4273 4127 4267) #endif -#endif +#endif /* MSC_VER */ #ifdef __GNUC__ // add includes for flex 2.91 (Linux version) diff -Nru opencascade-7.4.1+dfsg1/src/ExprIntrp/ExprIntrp.tab.c opencascade-7.5.1+dfsg1/src/ExprIntrp/ExprIntrp.tab.c --- opencascade-7.4.1+dfsg1/src/ExprIntrp/ExprIntrp.tab.c 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ExprIntrp/ExprIntrp.tab.c 2021-02-02 08:51:56.000000000 +0000 @@ -1,19 +1,20 @@ -/* A Bison parser, made by GNU Bison 2.7. */ +/* A Bison parser, made by GNU Bison 3.7.1. */ /* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. - + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Inc. + 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 . */ @@ -26,13 +27,17 @@ special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. - + This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. @@ -44,7 +49,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "2.7" +#define YYBISON_VERSION "3.7.1" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -63,14 +68,12 @@ #define yyparse ExprIntrpparse #define yylex ExprIntrplex #define yyerror ExprIntrperror -#define yylval ExprIntrplval -#define yychar ExprIntrpchar #define yydebug ExprIntrpdebug #define yynerrs ExprIntrpnerrs +#define yylval ExprIntrplval +#define yychar ExprIntrpchar -/* Copy the first part of user declarations. */ -/* Line 371 of yacc.c */ -#line 17 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" +/* First part of user prologue. */ #include @@ -124,132 +127,182 @@ #pragma warning(disable:4131 4244 4127 4702) #endif -/* Line 371 of yacc.c */ -#line 77 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" -/* Line 371 of yacc.c */ -#line 133 "ExprIntrp.tab.c" -# ifndef YY_NULL -# if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULL nullptr +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) # else -# define YY_NULL 0 +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) # endif # endif -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* In a future release of Bison, this section will be replaced - by #include "ExprIntrp.tab.h". */ -#ifndef YY_EXPRINTRP_EXPRINTRP_TAB_H_INCLUDED -# define YY_EXPRINTRP_EXPRINTRP_TAB_H_INCLUDED -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int ExprIntrpdebug; -#endif - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - SUMOP = 258, - MINUSOP = 259, - DIVIDEOP = 260, - EXPOP = 261, - MULTOP = 262, - PARENTHESIS = 263, - BRACKET = 264, - ENDPARENTHESIS = 265, - ENDBRACKET = 266, - VALUE = 267, - IDENTIFIER = 268, - COMMA = 269, - DIFFERENTIAL = 270, - DERIVATE = 271, - DERIVKEY = 272, - ASSIGNOP = 273, - DEASSIGNKEY = 274, - EQUALOP = 275, - RELSEPARATOR = 276, - CONSTKEY = 277, - SUMKEY = 278, - PRODKEY = 279 - }; -#endif - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - -extern YYSTYPE ExprIntrplval; - -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int ExprIntrpparse (void *YYPARSE_PARAM); -#else -int ExprIntrpparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int ExprIntrpparse (void); -#else -int ExprIntrpparse (); -#endif -#endif /* ! YYPARSE_PARAM */ +#include "ExprIntrp.tab.h" +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_SUMOP = 3, /* SUMOP */ + YYSYMBOL_MINUSOP = 4, /* MINUSOP */ + YYSYMBOL_DIVIDEOP = 5, /* DIVIDEOP */ + YYSYMBOL_EXPOP = 6, /* EXPOP */ + YYSYMBOL_MULTOP = 7, /* MULTOP */ + YYSYMBOL_PARENTHESIS = 8, /* PARENTHESIS */ + YYSYMBOL_BRACKET = 9, /* BRACKET */ + YYSYMBOL_ENDPARENTHESIS = 10, /* ENDPARENTHESIS */ + YYSYMBOL_ENDBRACKET = 11, /* ENDBRACKET */ + YYSYMBOL_VALUE = 12, /* VALUE */ + YYSYMBOL_IDENTIFIER = 13, /* IDENTIFIER */ + YYSYMBOL_COMMA = 14, /* COMMA */ + YYSYMBOL_DIFFERENTIAL = 15, /* DIFFERENTIAL */ + YYSYMBOL_DERIVATE = 16, /* DERIVATE */ + YYSYMBOL_DERIVKEY = 17, /* DERIVKEY */ + YYSYMBOL_ASSIGNOP = 18, /* ASSIGNOP */ + YYSYMBOL_DEASSIGNKEY = 19, /* DEASSIGNKEY */ + YYSYMBOL_EQUALOP = 20, /* EQUALOP */ + YYSYMBOL_RELSEPARATOR = 21, /* RELSEPARATOR */ + YYSYMBOL_CONSTKEY = 22, /* CONSTKEY */ + YYSYMBOL_SUMKEY = 23, /* SUMKEY */ + YYSYMBOL_PRODKEY = 24, /* PRODKEY */ + YYSYMBOL_25_n_ = 25, /* '\n' */ + YYSYMBOL_YYACCEPT = 26, /* $accept */ + YYSYMBOL_exprentry = 27, /* exprentry */ + YYSYMBOL_Assignment = 28, /* Assignment */ + YYSYMBOL_29_1 = 29, /* $@1 */ + YYSYMBOL_Deassignment = 30, /* Deassignment */ + YYSYMBOL_31_2 = 31, /* $@2 */ + YYSYMBOL_GenExpr = 32, /* GenExpr */ + YYSYMBOL_SingleExpr = 33, /* SingleExpr */ + YYSYMBOL_Single = 34, /* Single */ + YYSYMBOL_Function = 35, /* Function */ + YYSYMBOL_36_3 = 36, /* $@3 */ + YYSYMBOL_ListGenExpr = 37, /* ListGenExpr */ + YYSYMBOL_38_4 = 38, /* $@4 */ + YYSYMBOL_funcident = 39, /* funcident */ + YYSYMBOL_FunctionDefinition = 40, /* FunctionDefinition */ + YYSYMBOL_41_5 = 41, /* $@5 */ + YYSYMBOL_DerFunctionId = 42, /* DerFunctionId */ + YYSYMBOL_43_6 = 43, /* $@6 */ + YYSYMBOL_DiffFuncId = 44, /* DiffFuncId */ + YYSYMBOL_45_7 = 45, /* $@7 */ + YYSYMBOL_46_8 = 46, /* $@8 */ + YYSYMBOL_DiffId = 47, /* DiffId */ + YYSYMBOL_FunctionDef = 48, /* FunctionDef */ + YYSYMBOL_49_9 = 49, /* $@9 */ + YYSYMBOL_ListArg = 50, /* ListArg */ + YYSYMBOL_51_10 = 51, /* $@10 */ + YYSYMBOL_unarg = 52, /* unarg */ + YYSYMBOL_Derivation = 53, /* Derivation */ + YYSYMBOL_54_11 = 54, /* $@11 */ + YYSYMBOL_55_12 = 55, /* $@12 */ + YYSYMBOL_56_13 = 56, /* $@13 */ + YYSYMBOL_ConstantDefinition = 57, /* ConstantDefinition */ + YYSYMBOL_58_14 = 58, /* $@14 */ + YYSYMBOL_59_15 = 59, /* $@15 */ + YYSYMBOL_Sumator = 60, /* Sumator */ + YYSYMBOL_61_16 = 61, /* $@16 */ + YYSYMBOL_62_17 = 62, /* $@17 */ + YYSYMBOL_Productor = 63, /* Productor */ + YYSYMBOL_64_18 = 64, /* $@18 */ + YYSYMBOL_65_19 = 65, /* $@19 */ + YYSYMBOL_RelationList = 66, /* RelationList */ + YYSYMBOL_SingleRelation = 67 /* SingleRelation */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; -#endif /* !YY_EXPRINTRP_EXPRINTRP_TAB_H_INCLUDED */ -/* Copy the second part of user declarations. */ -/* Line 390 of yacc.c */ -#line 223 "ExprIntrp.tab.c" #ifdef short # undef short #endif -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif #endif -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; #else -typedef short int yytype_int8; +typedef signed char yytype_int8; #endif -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; +#else +typedef short yytype_int16; #endif -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; #else -typedef short int yytype_int16; +typedef short yytype_uint8; +#endif + +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; +#else +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif #endif #ifndef YYSIZE_T @@ -257,16 +310,28 @@ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else -# define YYSIZE_T unsigned int +# define YYSIZE_T unsigned # endif #endif -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_uint8 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS @@ -280,6 +345,23 @@ # endif #endif + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED +# endif +#endif + /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) @@ -287,25 +369,41 @@ # define YYUSE(E) /* empty */ #endif -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(N) (N) +#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") #else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int yyi) -#else -static int -YYID (yyi) - int yyi; +# define YY_INITIAL_VALUE(Value) Value #endif -{ - return yyi; -} +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") #endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + + +#define YY_ASSERT(E) ((void) (0 && (E))) -#if ! defined yyoverflow || YYERROR_VERBOSE +#if !defined yyoverflow /* The parser invokes alloca or malloc; define the necessary symbols. */ @@ -322,8 +420,7 @@ # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS @@ -335,8 +432,8 @@ # endif # ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely @@ -352,7 +449,7 @@ # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) + && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 @@ -360,40 +457,37 @@ # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - +#endif /* !defined yyoverflow */ #if (! defined yyoverflow \ && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { - yytype_int16 yyss_alloc; + yy_state_t yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 @@ -403,16 +497,16 @@ elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) #endif @@ -422,16 +516,16 @@ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ - YYSIZE_T yyi; \ + YYPTRDIFF_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ - while (YYID (0)) + while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ @@ -447,18 +541,23 @@ #define YYNNTS 42 /* YYNRULES -- Number of rules. */ #define YYNRULES 70 -/* YYNRULES -- Number of states. */ +/* YYNSTATES -- Number of states. */ #define YYNSTATES 149 -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 +/* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 279 -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_int8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -491,155 +590,76 @@ }; #if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint8 yyprhs[] = -{ - 0, 0, 3, 5, 7, 9, 11, 13, 14, 19, - 20, 26, 30, 34, 38, 42, 46, 50, 54, 57, - 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, - 83, 88, 89, 95, 97, 98, 103, 105, 106, 111, - 112, 116, 122, 123, 124, 134, 136, 138, 139, 145, - 147, 148, 153, 155, 156, 164, 165, 166, 177, 178, - 179, 188, 189, 190, 205, 206, 207, 222, 224, 228, - 232 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 27, 0, -1, 32, -1, 28, -1, 30, -1, 40, - -1, 66, -1, -1, 13, 29, 18, 32, -1, -1, - 19, 9, 13, 31, 11, -1, 32, 3, 32, -1, - 32, 4, 32, -1, 32, 7, 32, -1, 32, 5, - 32, -1, 32, 6, 32, -1, 8, 32, 10, -1, - 9, 32, 11, -1, 4, 32, -1, 3, 32, -1, - 33, -1, 53, -1, 57, -1, 60, -1, 63, -1, - 34, -1, 35, -1, 13, -1, 12, -1, 39, 8, - 37, 10, -1, 42, 8, 37, 10, -1, -1, 44, - 36, 8, 37, 10, -1, 32, -1, -1, 32, 14, - 38, 37, -1, 13, -1, -1, 48, 41, 18, 32, - -1, -1, 13, 43, 16, -1, 15, 47, 5, 15, - 13, -1, -1, -1, 15, 12, 45, 47, 5, 15, - 12, 46, 13, -1, 13, -1, 44, -1, -1, 13, - 49, 9, 50, 11, -1, 52, -1, -1, 52, 14, - 51, 50, -1, 13, -1, -1, 17, 9, 32, 14, - 13, 54, 11, -1, -1, -1, 17, 9, 32, 14, - 13, 55, 14, 12, 56, 11, -1, -1, -1, 22, - 9, 13, 58, 14, 12, 59, 11, -1, -1, -1, - 23, 9, 32, 14, 13, 61, 14, 32, 14, 32, - 14, 12, 62, 11, -1, -1, -1, 24, 9, 32, - 14, 13, 64, 14, 32, 14, 32, 14, 12, 65, - 11, -1, 67, -1, 67, 21, 66, -1, 67, 25, - 66, -1, 32, 20, 32, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 81, 81, 82, 83, 84, 85, 88, 88, 91, - 91, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 110, 111, 115, 116, 119, - 120, 121, 121, 124, 125, 125, 128, 131, 131, 134, - 134, 137, 138, 138, 138, 141, 142, 145, 145, 148, - 149, 149, 152, 155, 155, 156, 156, 156, 159, 159, - 159, 162, 162, 162, 165, 165, 165, 168, 169, 170, - 173 + 0, 80, 80, 81, 82, 83, 84, 87, 87, 90, + 90, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 109, 110, 114, 115, 118, + 119, 120, 120, 123, 124, 124, 127, 130, 130, 133, + 133, 136, 137, 137, 137, 140, 141, 144, 144, 147, + 148, 148, 151, 154, 154, 155, 155, 155, 158, 158, + 158, 161, 161, 161, 164, 164, 164, 167, 168, 169, + 172 }; #endif -#if YYDEBUG || YYERROR_VERBOSE || 0 +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) + +#if YYDEBUG || 0 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; + /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { - "$end", "error", "$undefined", "SUMOP", "MINUSOP", "DIVIDEOP", "EXPOP", - "MULTOP", "PARENTHESIS", "BRACKET", "ENDPARENTHESIS", "ENDBRACKET", - "VALUE", "IDENTIFIER", "COMMA", "DIFFERENTIAL", "DERIVATE", "DERIVKEY", - "ASSIGNOP", "DEASSIGNKEY", "EQUALOP", "RELSEPARATOR", "CONSTKEY", - "SUMKEY", "PRODKEY", "'\\n'", "$accept", "exprentry", "Assignment", - "$@1", "Deassignment", "$@2", "GenExpr", "SingleExpr", "Single", - "Function", "$@3", "ListGenExpr", "$@4", "funcident", - "FunctionDefinition", "$@5", "DerFunctionId", "$@6", "DiffFuncId", "$@7", - "$@8", "DiffId", "FunctionDef", "$@9", "ListArg", "$@10", "unarg", - "Derivation", "$@11", "$@12", "$@13", "ConstantDefinition", "$@14", - "$@15", "Sumator", "$@16", "$@17", "Productor", "$@18", "$@19", - "RelationList", "SingleRelation", YY_NULL + "\"end of file\"", "error", "\"invalid token\"", "SUMOP", "MINUSOP", + "DIVIDEOP", "EXPOP", "MULTOP", "PARENTHESIS", "BRACKET", + "ENDPARENTHESIS", "ENDBRACKET", "VALUE", "IDENTIFIER", "COMMA", + "DIFFERENTIAL", "DERIVATE", "DERIVKEY", "ASSIGNOP", "DEASSIGNKEY", + "EQUALOP", "RELSEPARATOR", "CONSTKEY", "SUMKEY", "PRODKEY", "'\\n'", + "$accept", "exprentry", "Assignment", "$@1", "Deassignment", "$@2", + "GenExpr", "SingleExpr", "Single", "Function", "$@3", "ListGenExpr", + "$@4", "funcident", "FunctionDefinition", "$@5", "DerFunctionId", "$@6", + "DiffFuncId", "$@7", "$@8", "DiffId", "FunctionDef", "$@9", "ListArg", + "$@10", "unarg", "Derivation", "$@11", "$@12", "$@13", + "ConstantDefinition", "$@14", "$@15", "Sumator", "$@16", "$@17", + "Productor", "$@18", "$@19", "RelationList", "SingleRelation", YY_NULLPTR }; + +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) +{ + return yytname[yysymbol]; +} #endif -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = +#ifdef YYPRINT +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ +static const yytype_int16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 10 }; -# endif +#endif -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 26, 27, 27, 27, 27, 27, 29, 28, 31, - 30, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 33, 33, 34, 34, 35, - 35, 36, 35, 37, 38, 37, 39, 41, 40, 43, - 42, 44, 45, 46, 44, 47, 47, 49, 48, 50, - 51, 50, 52, 54, 53, 55, 56, 53, 58, 59, - 57, 61, 62, 60, 64, 65, 63, 66, 66, 66, - 67 -}; +#define YYPACT_NINF (-51) -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 1, 1, 1, 1, 1, 0, 4, 0, - 5, 3, 3, 3, 3, 3, 3, 3, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, - 4, 0, 5, 1, 0, 4, 1, 0, 4, 0, - 3, 5, 0, 0, 9, 1, 1, 0, 5, 1, - 0, 4, 1, 0, 7, 0, 0, 10, 0, 0, - 8, 0, 0, 14, 0, 0, 14, 1, 3, 3, - 3 -}; +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) -/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 0, 0, 0, 0, 0, 28, 27, 0, 0, 0, - 0, 0, 0, 0, 3, 4, 2, 20, 25, 26, - 0, 5, 0, 31, 37, 21, 22, 23, 24, 6, - 67, 27, 19, 18, 0, 0, 0, 0, 0, 42, - 45, 46, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 16, 17, 0, 40, 0, 0, 0, 0, 9, - 58, 0, 0, 11, 12, 14, 15, 13, 70, 33, - 0, 0, 0, 0, 0, 68, 69, 8, 52, 0, - 49, 0, 0, 0, 0, 0, 0, 0, 34, 29, - 30, 0, 38, 48, 50, 0, 41, 53, 10, 0, - 61, 64, 0, 32, 0, 0, 0, 0, 59, 0, - 0, 35, 51, 43, 54, 0, 0, 0, 0, 0, - 56, 60, 0, 0, 44, 0, 0, 0, 57, 0, - 0, 0, 0, 62, 65, 0, 0, 63, 66 -}; +#define YYTABLE_NINF (-56) -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 13, 14, 36, 15, 94, 79, 17, 18, 19, - 57, 80, 112, 20, 21, 58, 22, 37, 23, 66, - 129, 42, 24, 38, 89, 114, 90, 25, 116, 117, - 135, 26, 95, 126, 27, 119, 145, 28, 120, 146, - 29, 30 -}; +#define yytable_value_is_error(Yyn) \ + 0 -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -51 + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ static const yytype_int16 yypact[] = { 4, 62, 62, 62, 62, -51, 2, 87, 39, 58, @@ -659,7 +679,29 @@ 140, 171, 172, -51, -51, 174, 175, -51, -51 }; -/* YYPGOTO[NTERM-NUM]. */ + /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_int8 yydefact[] = +{ + 0, 0, 0, 0, 0, 28, 27, 0, 0, 0, + 0, 0, 0, 0, 3, 4, 2, 20, 25, 26, + 0, 5, 0, 31, 37, 21, 22, 23, 24, 6, + 67, 27, 19, 18, 0, 0, 0, 0, 0, 42, + 45, 46, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 16, 17, 0, 40, 0, 0, 0, 0, 9, + 58, 0, 0, 11, 12, 14, 15, 13, 70, 33, + 0, 0, 0, 0, 0, 68, 69, 8, 52, 0, + 49, 0, 0, 0, 0, 0, 0, 0, 34, 29, + 30, 0, 38, 48, 50, 0, 41, 53, 10, 0, + 61, 64, 0, 32, 0, 0, 0, 0, 59, 0, + 0, 35, 51, 43, 54, 0, 0, 0, 0, 0, + 56, 60, 0, 0, 44, 0, 0, 0, 57, 0, + 0, 0, 0, 62, 65, 0, 0, 63, 66 +}; + + /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -51, -51, -51, -51, -51, -51, 0, -51, -51, -51, @@ -669,10 +711,19 @@ -35, -51 }; -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -56 + /* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 13, 14, 36, 15, 94, 79, 17, 18, 19, + 57, 80, 112, 20, 21, 58, 22, 37, 23, 66, + 129, 42, 24, 38, 89, 114, 90, 25, 116, 117, + 135, 26, 95, 126, 27, 119, 145, 28, 120, 146, + 29, 30 +}; + + /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { 16, 32, 33, 34, 35, 41, 81, 1, 2, 48, @@ -696,12 +747,6 @@ 134, 138, 0, 143, 144, 147, 148, 0, 122, 91 }; -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-51))) - -#define yytable_value_is_error(Yytable_value) \ - YYID (0) - static const yytype_int16 yycheck[] = { 0, 1, 2, 3, 4, 7, 56, 3, 4, 0, @@ -725,9 +770,9 @@ 13, 11, -1, 12, 12, 11, 11, -1, 114, 66 }; -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_int8 yystos[] = { 0, 3, 4, 8, 9, 12, 13, 15, 17, 19, 22, 23, 24, 27, 28, 30, 32, 33, 34, 35, @@ -746,67 +791,66 @@ 32, 14, 14, 12, 12, 62, 65, 11, 11 }; -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. However, - YYFAIL appears to be in use. Nevertheless, it is formally deprecated - in Bison 2.4.2's NEWS entry, where a plan to phase it out is - discussed. */ - -#define YYFAIL goto yyerrlab -#if defined YYFAIL - /* This is here to suppress warnings from the GCC cpp's - -Wunused-macros. Normally we don't worry about that warning, but - some users do, and we want to make it easy for users to remove - YYFAIL uses, which will produce warnings from Bison 2.5. */ -#endif + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_int8 yyr1[] = +{ + 0, 26, 27, 27, 27, 27, 27, 29, 28, 31, + 30, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 33, 33, 34, 34, 35, + 35, 36, 35, 37, 38, 37, 39, 41, 40, 43, + 42, 44, 45, 46, 44, 47, 47, 49, 48, 50, + 51, 50, 52, 54, 53, 55, 56, 53, 58, 59, + 57, 61, 62, 60, 64, 65, 63, 66, 66, 66, + 67 +}; -#define YYRECOVERING() (!!yyerrstatus) + /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 1, 1, 1, 1, 1, 0, 4, 0, + 5, 3, 3, 3, 3, 3, 3, 3, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, + 4, 0, 5, 1, 0, 4, 1, 0, 4, 0, + 3, 5, 0, 0, 9, 1, 1, 0, 5, 1, + 0, 4, 1, 0, 7, 0, 0, 10, 0, 0, + 8, 0, 0, 14, 0, 0, 14, 1, 3, 3, + 3 +}; -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - -/* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 +enum { YYENOMEM = -2 }; -/* This macro is provided for backward compatibility. */ -#ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -#endif +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use YYerror or YYUNDEF. */ +#define YYERRCODE YYUNDEF -/* YYLEX -- calling `yylex' with the right arguments. */ -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif /* Enable debugging if requested. */ #if YYDEBUG @@ -816,82 +860,65 @@ # define YYFPRINTF fprintf # endif -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +/* This macro is provided for backward compatibility. */ +# ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { - FILE *yyo = yyoutput; - YYUSE (yyo); + FILE *yyoutput = yyo; + YYUSE (yyoutput); if (!yyvaluep) return; # ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); + if (yykind < YYNTOKENS) + YYPRINT (yyo, yytoknum[yykind], *yyvaluep); # endif - switch (yytype) - { - default: - break; - } + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YYUSE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END } -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); + yy_symbol_value_print (yyo, yykind, yyvaluep); + YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. @@ -899,16 +926,8 @@ | TOP (included). | `------------------------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -#else static void -yy_stack_print (yybottom, yytop) - yytype_int16 *yybottom; - yytype_int16 *yytop; -#endif +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) @@ -919,63 +938,56 @@ YYFPRINTF (stderr, "\n"); } -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, + int yyrule) { + int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)]); YYFPRINTF (stderr, "\n"); } } -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule); \ +} while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH +#ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif @@ -991,363 +1003,77 @@ #endif -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message - about the unexpected token YYTOKEN for the state stack whose top is - YYSSP. - - Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is - not large enough to hold the message. In that case, also set - *YYMSG_ALLOC to the required number of bytes. Return 2 if the - required number of bytes is too large to store. */ -static int -yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, - yytype_int16 *yyssp, int yytoken) -{ - YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); - YYSIZE_T yysize = yysize0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - /* Internationalized format string. */ - const char *yyformat = YY_NULL; - /* Arguments of yyformat. */ - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - /* Number of reported tokens (one for the "unexpected", one per - "expected"). */ - int yycount = 0; - - /* There are many possibilities here to consider: - - Assume YYFAIL is not used. It's too flawed to consider. See - - for details. YYERROR is fine as it does not invoke this - function. - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yychar) is if - this state is a consistent state with a default action. Thus, - detecting the absence of a lookahead is sufficient to determine - that there is no unexpected or expected token to report. In that - case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is a - consistent state with a default action. There might have been a - previous inconsistent state, consistent state with a non-default - action, or user semantic action that manipulated yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state merging - (from LALR or IELR) and default reductions corrupt the expected - token list. However, the list is correct for canonical LR with - one exception: it will still contain any token that will not be - accepted due to an error action in a later state. - */ - if (yytoken != YYEMPTY) - { - int yyn = yypact[*yyssp]; - yyarg[yycount++] = yytname[yytoken]; - if (!yypact_value_is_default (yyn)) - { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yyx; - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR - && !yytable_value_is_error (yytable[yyx + yyn])) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - break; - } - yyarg[yycount++] = yytname[yyx]; - { - YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - } - } - } - - switch (yycount) - { -# define YYCASE_(N, S) \ - case N: \ - yyformat = S; \ - break - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -# undef YYCASE_ - } - { - YYSIZE_T yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - if (*yymsg_alloc < yysize) - { - *yymsg_alloc = 2 * yysize; - if (! (yysize <= *yymsg_alloc - && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) - *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; - return 1; - } - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - { - char *yyp = *yymsg; - int yyi = 0; - while ((*yyp = *yyformat) != '\0') - if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyformat += 2; - } - else - { - yyp++; - yyformat++; - } - } - return 0; -} -#endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep) { YYUSE (yyvaluep); - if (!yymsg) yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); - switch (yytype) - { - - default: - break; - } + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YYUSE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END } - - -/* The lookahead symbol. */ +/* Lookahead token kind. */ int yychar; - -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - /* The semantic value of the lookahead symbol. */ -YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); - +YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; + + /*----------. | yyparse. | `----------*/ -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) int yyparse (void) -#else -int -yyparse () - -#endif -#endif { - int yystate; + yy_state_fast_t yystate = 0; /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; + int yyerrstatus = 0; - /* The stacks and their tools: - `yyss': related to states. - `yyvs': related to semantic values. - - Refer to the stacks through separate pointers, to allow yyoverflow + /* Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; - YYSIZE_T yystacksize; + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; int yyn; + /* The return value of yyparse. */ int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken = 0; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif + #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) @@ -1355,102 +1081,105 @@ Keep to zero when no symbol should be popped. */ int yylen = 0; - yyssp = yyss = yyssa; - yyvsp = yyvs = yyvsa; - yystacksize = YYINITDEPTH; - YYDPRINTF ((stderr, "Starting parse\n")); - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; + /*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | +| yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ - yynewstate: +yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; - yysetstate: - *yyssp = yystate; + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + goto yyexhaustedlab; +#else { /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + YYPTRDIFF_T yysize = yyssp - yyss + 1; -#ifdef yyoverflow +# if defined yyoverflow { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else +# else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; + yystacksize = YYMAXDEPTH; { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); } # endif -#endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END if (yyss + yystacksize - 1 <= yyssp) - YYABORT; + YYABORT; } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ if (yystate == YYFINAL) YYACCEPT; goto yybackup; + /*-----------. | yybackup. | `-----------*/ yybackup: - /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ @@ -1461,18 +1190,29 @@ /* Not known => get a lookahead token if don't already have one. */ - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (); } if (yychar <= YYEOF) { - yychar = yytoken = YYEOF; + yychar = YYEOF; + yytoken = YYSYMBOL_YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } + else if (yychar == YYerror) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = YYUNDEF; + yytoken = YYSYMBOL_YYerror; + goto yyerrlab1; + } else { yytoken = YYTRANSLATE (yychar); @@ -1500,15 +1240,13 @@ /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar = YYEMPTY; - yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END + /* Discard the shifted token. */ + yychar = YYEMPTY; goto yynewstate; @@ -1523,14 +1261,14 @@ /*-----------------------------. -| yyreduce -- Do a reduction. | +| yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. + '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison @@ -1543,291 +1281,196 @@ YY_REDUCE_PRINT (yyn); switch (yyn) { - case 5: -/* Line 1792 of yacc.c */ -#line 84 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndOfFuncDef();} + case 5: /* exprentry: FunctionDefinition */ + {ExprIntrp_EndOfFuncDef();} break; - case 6: -/* Line 1792 of yacc.c */ -#line 85 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndOfRelation();} + case 6: /* exprentry: RelationList */ + {ExprIntrp_EndOfRelation();} break; - case 7: -/* Line 1792 of yacc.c */ -#line 88 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_AssignVariable();} + case 7: /* $@1: %empty */ + {ExprIntrp_AssignVariable();} break; - case 8: -/* Line 1792 of yacc.c */ -#line 88 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndOfAssign();} + case 8: /* Assignment: IDENTIFIER $@1 ASSIGNOP GenExpr */ + {ExprIntrp_EndOfAssign();} break; - case 9: -/* Line 1792 of yacc.c */ -#line 91 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_Deassign();} + case 9: /* $@2: %empty */ + {ExprIntrp_Deassign();} break; - case 11: -/* Line 1792 of yacc.c */ -#line 94 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_SumOperator();} + case 11: /* GenExpr: GenExpr SUMOP GenExpr */ + {ExprIntrp_SumOperator();} break; - case 12: -/* Line 1792 of yacc.c */ -#line 95 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_MinusOperator();} + case 12: /* GenExpr: GenExpr MINUSOP GenExpr */ + {ExprIntrp_MinusOperator();} break; - case 13: -/* Line 1792 of yacc.c */ -#line 96 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_ProductOperator();} + case 13: /* GenExpr: GenExpr MULTOP GenExpr */ + {ExprIntrp_ProductOperator();} break; - case 14: -/* Line 1792 of yacc.c */ -#line 97 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_DivideOperator();} + case 14: /* GenExpr: GenExpr DIVIDEOP GenExpr */ + {ExprIntrp_DivideOperator();} break; - case 15: -/* Line 1792 of yacc.c */ -#line 98 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_ExpOperator();} + case 15: /* GenExpr: GenExpr EXPOP GenExpr */ + {ExprIntrp_ExpOperator();} break; - case 18: -/* Line 1792 of yacc.c */ -#line 101 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_UnaryMinusOperator();} + case 18: /* GenExpr: MINUSOP GenExpr */ + {ExprIntrp_UnaryMinusOperator();} break; - case 19: -/* Line 1792 of yacc.c */ -#line 102 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_UnaryPlusOperator();} + case 19: /* GenExpr: SUMOP GenExpr */ + {ExprIntrp_UnaryPlusOperator();} break; - case 27: -/* Line 1792 of yacc.c */ -#line 115 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_VariableIdentifier();} + case 27: /* Single: IDENTIFIER */ + {ExprIntrp_VariableIdentifier();} break; - case 28: -/* Line 1792 of yacc.c */ -#line 116 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_NumValue();} + case 28: /* Single: VALUE */ + {ExprIntrp_NumValue();} break; - case 29: -/* Line 1792 of yacc.c */ -#line 119 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndFunction();} + case 29: /* Function: funcident PARENTHESIS ListGenExpr ENDPARENTHESIS */ + {ExprIntrp_EndFunction();} break; - case 30: -/* Line 1792 of yacc.c */ -#line 120 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndDerFunction();} + case 30: /* Function: DerFunctionId PARENTHESIS ListGenExpr ENDPARENTHESIS */ + {ExprIntrp_EndDerFunction();} break; - case 31: -/* Line 1792 of yacc.c */ -#line 121 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndDifferential();} + case 31: /* $@3: %empty */ + {ExprIntrp_EndDifferential();} break; - case 32: -/* Line 1792 of yacc.c */ -#line 121 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndDiffFunction();} + case 32: /* Function: DiffFuncId $@3 PARENTHESIS ListGenExpr ENDPARENTHESIS */ + {ExprIntrp_EndDiffFunction();} break; - case 33: -/* Line 1792 of yacc.c */ -#line 124 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndFuncArg();} + case 33: /* ListGenExpr: GenExpr */ + {ExprIntrp_EndFuncArg();} break; - case 34: -/* Line 1792 of yacc.c */ -#line 125 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_NextFuncArg();} + case 34: /* $@4: %empty */ + {ExprIntrp_NextFuncArg();} break; - case 36: -/* Line 1792 of yacc.c */ -#line 128 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_StartFunction();} + case 36: /* funcident: IDENTIFIER */ + {ExprIntrp_StartFunction();} break; - case 37: -/* Line 1792 of yacc.c */ -#line 131 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_DefineFunction();} + case 37: /* $@5: %empty */ + {ExprIntrp_DefineFunction();} break; - case 39: -/* Line 1792 of yacc.c */ -#line 134 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_StartDerivate();} + case 39: /* $@6: %empty */ + {ExprIntrp_StartDerivate();} break; - case 40: -/* Line 1792 of yacc.c */ -#line 134 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndDerivate();} + case 40: /* DerFunctionId: IDENTIFIER $@6 DERIVATE */ + {ExprIntrp_EndDerivate();} break; - case 41: -/* Line 1792 of yacc.c */ -#line 137 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_DiffVar();} + case 41: /* DiffFuncId: DIFFERENTIAL DiffId DIVIDEOP DIFFERENTIAL IDENTIFIER */ + {ExprIntrp_DiffVar();} break; - case 42: -/* Line 1792 of yacc.c */ -#line 138 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_DiffDegree();} + case 42: /* $@7: %empty */ + {ExprIntrp_DiffDegree();} break; - case 43: -/* Line 1792 of yacc.c */ -#line 138 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_VerDiffDegree();} + case 43: /* $@8: %empty */ + {ExprIntrp_VerDiffDegree();} break; - case 44: -/* Line 1792 of yacc.c */ -#line 138 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_DiffDegreeVar();} + case 44: /* DiffFuncId: DIFFERENTIAL VALUE $@7 DiffId DIVIDEOP DIFFERENTIAL VALUE $@8 IDENTIFIER */ + {ExprIntrp_DiffDegreeVar();} break; - case 45: -/* Line 1792 of yacc.c */ -#line 141 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_StartDifferential();} + case 45: /* DiffId: IDENTIFIER */ + {ExprIntrp_StartDifferential();} break; - case 47: -/* Line 1792 of yacc.c */ -#line 145 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_StartFunction();} + case 47: /* $@9: %empty */ + {ExprIntrp_StartFunction();} break; - case 49: -/* Line 1792 of yacc.c */ -#line 148 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndFuncArg();} + case 49: /* ListArg: unarg */ + {ExprIntrp_EndFuncArg();} break; - case 50: -/* Line 1792 of yacc.c */ -#line 149 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_NextFuncArg();} + case 50: /* $@10: %empty */ + {ExprIntrp_NextFuncArg();} break; - case 52: -/* Line 1792 of yacc.c */ -#line 152 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_VariableIdentifier();} + case 52: /* unarg: IDENTIFIER */ + {ExprIntrp_VariableIdentifier();} break; - case 53: -/* Line 1792 of yacc.c */ -#line 155 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_Derivation();} + case 53: /* $@11: %empty */ + {ExprIntrp_Derivation();} break; - case 54: -/* Line 1792 of yacc.c */ -#line 155 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndDerivation();} + case 54: /* Derivation: DERIVKEY BRACKET GenExpr COMMA IDENTIFIER $@11 ENDBRACKET */ + {ExprIntrp_EndDerivation();} break; - case 55: -/* Line 1792 of yacc.c */ -#line 156 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_Derivation();} + case 55: /* $@12: %empty */ + {ExprIntrp_Derivation();} break; - case 56: -/* Line 1792 of yacc.c */ -#line 156 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_DerivationValue();} + case 56: /* $@13: %empty */ + {ExprIntrp_DerivationValue();} break; - case 57: -/* Line 1792 of yacc.c */ -#line 156 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndDerivation();} + case 57: /* Derivation: DERIVKEY BRACKET GenExpr COMMA IDENTIFIER $@12 COMMA VALUE $@13 ENDBRACKET */ + {ExprIntrp_EndDerivation();} break; - case 58: -/* Line 1792 of yacc.c */ -#line 159 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_ConstantIdentifier();} + case 58: /* $@14: %empty */ + {ExprIntrp_ConstantIdentifier();} break; - case 59: -/* Line 1792 of yacc.c */ -#line 159 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_ConstantDefinition();} + case 59: /* $@15: %empty */ + {ExprIntrp_ConstantDefinition();} break; - case 61: -/* Line 1792 of yacc.c */ -#line 162 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_VariableIdentifier();} + case 61: /* $@16: %empty */ + {ExprIntrp_VariableIdentifier();} break; - case 62: -/* Line 1792 of yacc.c */ -#line 162 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_NumValue();} + case 62: /* $@17: %empty */ + {ExprIntrp_NumValue();} break; - case 63: -/* Line 1792 of yacc.c */ -#line 162 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_Sumator();} + case 63: /* Sumator: SUMKEY BRACKET GenExpr COMMA IDENTIFIER $@16 COMMA GenExpr COMMA GenExpr COMMA VALUE $@17 ENDBRACKET */ + {ExprIntrp_Sumator();} break; - case 64: -/* Line 1792 of yacc.c */ -#line 165 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_VariableIdentifier();} + case 64: /* $@18: %empty */ + {ExprIntrp_VariableIdentifier();} break; - case 65: -/* Line 1792 of yacc.c */ -#line 165 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_NumValue();} + case 65: /* $@19: %empty */ + {ExprIntrp_NumValue();} break; - case 66: -/* Line 1792 of yacc.c */ -#line 165 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_Productor();} + case 66: /* Productor: PRODKEY BRACKET GenExpr COMMA IDENTIFIER $@18 COMMA GenExpr COMMA GenExpr COMMA VALUE $@19 ENDBRACKET */ + {ExprIntrp_Productor();} break; - case 70: -/* Line 1792 of yacc.c */ -#line 173 "D:/ABV/OCCT/occt7/src/ExprIntrp/ExprIntrp.yacc" - {ExprIntrp_EndOfEqual();} + case 70: /* SingleRelation: GenExpr EQUALOP GenExpr */ + {ExprIntrp_EndOfEqual();} break; -/* Line 1792 of yacc.c */ -#line 1831 "ExprIntrp.tab.c" + default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -1841,96 +1484,58 @@ case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; - YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; - /* Now `shift' the result of the reduction. Determine what state + /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } goto yynewstate; -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ - yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); - + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; -#if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); -#else -# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ - yyssp, yytoken) - { - char const *yymsgp = YY_("syntax error"); - int yysyntax_error_status; - yysyntax_error_status = YYSYNTAX_ERROR; - if (yysyntax_error_status == 0) - yymsgp = yymsg; - else if (yysyntax_error_status == 1) - { - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); - if (!yymsg) - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - yysyntax_error_status = 2; - } - else - { - yysyntax_error_status = YYSYNTAX_ERROR; - yymsgp = yymsg; - } - } - yyerror (yymsgp); - if (yysyntax_error_status == 2) - goto yyexhaustedlab; - } -# undef YYSYNTAX_ERROR -#endif } - - if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an - error, discard it. */ + error, discard it. */ if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } } /* Else will try to reuse lookahead token after shifting the error @@ -1942,14 +1547,12 @@ | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered + /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; @@ -1962,29 +1565,30 @@ | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ + /* Pop stack until we find a state that shifts the error token. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) - YYABORT; + YYABORT; yydestruct ("Error: popping", - yystos[yystate], yyvsp); + YY_ACCESSING_SYMBOL (yystate), yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); @@ -1996,7 +1600,7 @@ /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; @@ -2009,6 +1613,7 @@ yyresult = 0; goto yyreturn; + /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ @@ -2016,16 +1621,21 @@ yyresult = 1; goto yyreturn; -#if !defined yyoverflow || YYERROR_VERBOSE + +#if !defined yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; - /* Fall through. */ + goto yyreturn; #endif + +/*-------------------------------------------------------. +| yyreturn -- parsing is finished, clean up and return. | +`-------------------------------------------------------*/ yyreturn: if (yychar != YYEMPTY) { @@ -2035,26 +1645,21 @@ yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); } - /* Do not reclaim the symbols of the rule which action triggered + /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} + return yyresult; +} diff -Nru opencascade-7.4.1+dfsg1/src/ExprIntrp/ExprIntrp.tab.h opencascade-7.5.1+dfsg1/src/ExprIntrp/ExprIntrp.tab.h --- opencascade-7.4.1+dfsg1/src/ExprIntrp/ExprIntrp.tab.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ExprIntrp/ExprIntrp.tab.h 2021-02-02 08:51:56.000000000 +0000 @@ -1,19 +1,20 @@ -/* A Bison parser, made by GNU Bison 2.7. */ +/* A Bison parser, made by GNU Bison 3.7.1. */ /* Bison interface for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. - + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation, + Inc. + 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 . */ @@ -26,13 +27,17 @@ special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. - + This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -#ifndef YY_EXPRINTRP_EXPRINTRP_TAB_H_INCLUDED -# define YY_EXPRINTRP_EXPRINTRP_TAB_H_INCLUDED -/* Enabling traces. */ +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_EXPRINTRP_EXPRINTRP_EXPRINTRP_TAB_H_INCLUDED +# define YY_EXPRINTRP_EXPRINTRP_EXPRINTRP_TAB_H_INCLUDED +/* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif @@ -40,59 +45,51 @@ extern int ExprIntrpdebug; #endif -/* Tokens. */ +/* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - SUMOP = 258, - MINUSOP = 259, - DIVIDEOP = 260, - EXPOP = 261, - MULTOP = 262, - PARENTHESIS = 263, - BRACKET = 264, - ENDPARENTHESIS = 265, - ENDBRACKET = 266, - VALUE = 267, - IDENTIFIER = 268, - COMMA = 269, - DIFFERENTIAL = 270, - DERIVATE = 271, - DERIVKEY = 272, - ASSIGNOP = 273, - DEASSIGNKEY = 274, - EQUALOP = 275, - RELSEPARATOR = 276, - CONSTKEY = 277, - SUMKEY = 278, - PRODKEY = 279 - }; + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + SUMOP = 258, /* SUMOP */ + MINUSOP = 259, /* MINUSOP */ + DIVIDEOP = 260, /* DIVIDEOP */ + EXPOP = 261, /* EXPOP */ + MULTOP = 262, /* MULTOP */ + PARENTHESIS = 263, /* PARENTHESIS */ + BRACKET = 264, /* BRACKET */ + ENDPARENTHESIS = 265, /* ENDPARENTHESIS */ + ENDBRACKET = 266, /* ENDBRACKET */ + VALUE = 267, /* VALUE */ + IDENTIFIER = 268, /* IDENTIFIER */ + COMMA = 269, /* COMMA */ + DIFFERENTIAL = 270, /* DIFFERENTIAL */ + DERIVATE = 271, /* DERIVATE */ + DERIVKEY = 272, /* DERIVKEY */ + ASSIGNOP = 273, /* ASSIGNOP */ + DEASSIGNKEY = 274, /* DEASSIGNKEY */ + EQUALOP = 275, /* EQUALOP */ + RELSEPARATOR = 276, /* RELSEPARATOR */ + CONSTKEY = 277, /* CONSTKEY */ + SUMKEY = 278, /* SUMKEY */ + PRODKEY = 279 /* PRODKEY */ + }; + typedef enum yytokentype yytoken_kind_t; #endif - +/* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef int YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif + extern YYSTYPE ExprIntrplval; -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int ExprIntrpparse (void *YYPARSE_PARAM); -#else -int ExprIntrpparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus int ExprIntrpparse (void); -#else -int ExprIntrpparse (); -#endif -#endif /* ! YYPARSE_PARAM */ -#endif /* !YY_EXPRINTRP_EXPRINTRP_TAB_H_INCLUDED */ +#endif /* !YY_EXPRINTRP_EXPRINTRP_EXPRINTRP_TAB_H_INCLUDED */ diff -Nru opencascade-7.4.1+dfsg1/src/ExprIntrp/ExprIntrp.yacc opencascade-7.5.1+dfsg1/src/ExprIntrp/ExprIntrp.yacc --- opencascade-7.4.1+dfsg1/src/ExprIntrp/ExprIntrp.yacc 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ExprIntrp/ExprIntrp.yacc 2021-02-02 08:51:56.000000000 +0000 @@ -1,4 +1,3 @@ -/* /* Copyright (c) 1997-1999 Matra Datavision Copyright (c) 1999-2014 OPEN CASCADE SAS diff -Nru opencascade-7.4.1+dfsg1/src/ExprIntrp/lex.ExprIntrp.c opencascade-7.5.1+dfsg1/src/ExprIntrp/lex.ExprIntrp.c --- opencascade-7.4.1+dfsg1/src/ExprIntrp/lex.ExprIntrp.c 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ExprIntrp/lex.ExprIntrp.c 2021-02-02 08:51:56.000000000 +0000 @@ -1,170 +1,444 @@ + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + #define yy_create_buffer ExprIntrp_create_buffer #define yy_delete_buffer ExprIntrp_delete_buffer #define yy_scan_buffer ExprIntrp_scan_buffer #define yy_scan_string ExprIntrp_scan_string #define yy_scan_bytes ExprIntrp_scan_bytes -#define yy_flex_debug ExprIntrp_flex_debug #define yy_init_buffer ExprIntrp_init_buffer #define yy_flush_buffer ExprIntrp_flush_buffer #define yy_load_buffer_state ExprIntrp_load_buffer_state #define yy_switch_to_buffer ExprIntrp_switch_to_buffer +#define yypush_buffer_state ExprIntrppush_buffer_state +#define yypop_buffer_state ExprIntrppop_buffer_state +#define yyensure_buffer_stack ExprIntrpensure_buffer_stack +#define yy_flex_debug ExprIntrp_flex_debug #define yyin ExprIntrpin #define yyleng ExprIntrpleng #define yylex ExprIntrplex +#define yylineno ExprIntrplineno #define yyout ExprIntrpout #define yyrestart ExprIntrprestart #define yytext ExprIntrptext #define yywrap ExprIntrpwrap - -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.89 96/05/25 21:02:21 vern Exp $ - */ +#define yyalloc ExprIntrpalloc +#define yyrealloc ExprIntrprealloc +#define yyfree ExprIntrpfree #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif -#include +#ifdef yy_create_buffer +#define ExprIntrp_create_buffer_ALREADY_DEFINED +#else +#define yy_create_buffer ExprIntrp_create_buffer +#endif -#ifdef _MSC_VER -# include -# include -#endif /* _MSC_VER */ +#ifdef yy_delete_buffer +#define ExprIntrp_delete_buffer_ALREADY_DEFINED +#else +#define yy_delete_buffer ExprIntrp_delete_buffer +#endif + +#ifdef yy_scan_buffer +#define ExprIntrp_scan_buffer_ALREADY_DEFINED +#else +#define yy_scan_buffer ExprIntrp_scan_buffer +#endif + +#ifdef yy_scan_string +#define ExprIntrp_scan_string_ALREADY_DEFINED +#else +#define yy_scan_string ExprIntrp_scan_string +#endif +#ifdef yy_scan_bytes +#define ExprIntrp_scan_bytes_ALREADY_DEFINED +#else +#define yy_scan_bytes ExprIntrp_scan_bytes +#endif +#ifdef yy_init_buffer +#define ExprIntrp_init_buffer_ALREADY_DEFINED +#else +#define yy_init_buffer ExprIntrp_init_buffer +#endif -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus +#ifdef yy_flush_buffer +#define ExprIntrp_flush_buffer_ALREADY_DEFINED +#else +#define yy_flush_buffer ExprIntrp_flush_buffer #endif + +#ifdef yy_load_buffer_state +#define ExprIntrp_load_buffer_state_ALREADY_DEFINED +#else +#define yy_load_buffer_state ExprIntrp_load_buffer_state #endif +#ifdef yy_switch_to_buffer +#define ExprIntrp_switch_to_buffer_ALREADY_DEFINED +#else +#define yy_switch_to_buffer ExprIntrp_switch_to_buffer +#endif -#ifdef __cplusplus +#ifdef yypush_buffer_state +#define ExprIntrppush_buffer_state_ALREADY_DEFINED +#else +#define yypush_buffer_state ExprIntrppush_buffer_state +#endif -#include -#include +#ifdef yypop_buffer_state +#define ExprIntrppop_buffer_state_ALREADY_DEFINED +#else +#define yypop_buffer_state ExprIntrppop_buffer_state +#endif -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS +#ifdef yyensure_buffer_stack +#define ExprIntrpensure_buffer_stack_ALREADY_DEFINED +#else +#define yyensure_buffer_stack ExprIntrpensure_buffer_stack +#endif -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST +#ifdef yylex +#define ExprIntrplex_ALREADY_DEFINED +#else +#define yylex ExprIntrplex +#endif -#else /* ! __cplusplus */ +#ifdef yyrestart +#define ExprIntrprestart_ALREADY_DEFINED +#else +#define yyrestart ExprIntrprestart +#endif -#if __STDC__ +#ifdef yylex_init +#define ExprIntrplex_init_ALREADY_DEFINED +#else +#define yylex_init ExprIntrplex_init +#endif -#define YY_USE_PROTOS -#define YY_USE_CONST +#ifdef yylex_init_extra +#define ExprIntrplex_init_extra_ALREADY_DEFINED +#else +#define yylex_init_extra ExprIntrplex_init_extra +#endif -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ +#ifdef yylex_destroy +#define ExprIntrplex_destroy_ALREADY_DEFINED +#else +#define yylex_destroy ExprIntrplex_destroy +#endif -#ifdef __TURBOC__ - #pragma warn -rch - #pragma warn -use -#include +#ifdef yyget_debug +#define ExprIntrpget_debug_ALREADY_DEFINED +#else +#define yyget_debug ExprIntrpget_debug +#endif + +#ifdef yyset_debug +#define ExprIntrpset_debug_ALREADY_DEFINED +#else +#define yyset_debug ExprIntrpset_debug +#endif + +#ifdef yyget_extra +#define ExprIntrpget_extra_ALREADY_DEFINED +#else +#define yyget_extra ExprIntrpget_extra +#endif + +#ifdef yyset_extra +#define ExprIntrpset_extra_ALREADY_DEFINED +#else +#define yyset_extra ExprIntrpset_extra +#endif + +#ifdef yyget_in +#define ExprIntrpget_in_ALREADY_DEFINED +#else +#define yyget_in ExprIntrpget_in +#endif + +#ifdef yyset_in +#define ExprIntrpset_in_ALREADY_DEFINED +#else +#define yyset_in ExprIntrpset_in +#endif + +#ifdef yyget_out +#define ExprIntrpget_out_ALREADY_DEFINED +#else +#define yyget_out ExprIntrpget_out +#endif + +#ifdef yyset_out +#define ExprIntrpset_out_ALREADY_DEFINED +#else +#define yyset_out ExprIntrpset_out +#endif + +#ifdef yyget_leng +#define ExprIntrpget_leng_ALREADY_DEFINED +#else +#define yyget_leng ExprIntrpget_leng +#endif + +#ifdef yyget_text +#define ExprIntrpget_text_ALREADY_DEFINED +#else +#define yyget_text ExprIntrpget_text +#endif + +#ifdef yyget_lineno +#define ExprIntrpget_lineno_ALREADY_DEFINED +#else +#define yyget_lineno ExprIntrpget_lineno +#endif + +#ifdef yyset_lineno +#define ExprIntrpset_lineno_ALREADY_DEFINED +#else +#define yyset_lineno ExprIntrpset_lineno +#endif + +#ifdef yywrap +#define ExprIntrpwrap_ALREADY_DEFINED +#else +#define yywrap ExprIntrpwrap +#endif + +#ifdef yyalloc +#define ExprIntrpalloc_ALREADY_DEFINED +#else +#define yyalloc ExprIntrpalloc +#endif + +#ifdef yyrealloc +#define ExprIntrprealloc_ALREADY_DEFINED +#else +#define yyrealloc ExprIntrprealloc +#endif + +#ifdef yyfree +#define ExprIntrpfree_ALREADY_DEFINED +#else +#define yyfree ExprIntrpfree +#endif + +#ifdef yytext +#define ExprIntrptext_ALREADY_DEFINED +#else +#define yytext ExprIntrptext +#endif + +#ifdef yyleng +#define ExprIntrpleng_ALREADY_DEFINED +#else +#define yyleng ExprIntrpleng +#endif + +#ifdef yyin +#define ExprIntrpin_ALREADY_DEFINED +#else +#define yyin ExprIntrpin +#endif + +#ifdef yyout +#define ExprIntrpout_ALREADY_DEFINED +#else +#define yyout ExprIntrpout +#endif + +#ifdef yy_flex_debug +#define ExprIntrp_flex_debug_ALREADY_DEFINED +#else +#define yy_flex_debug ExprIntrp_flex_debug +#endif + +#ifdef yylineno +#define ExprIntrplineno_ALREADY_DEFINED +#else +#define yylineno ExprIntrplineno +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include #include -#define YY_USE_CONST -#define YY_USE_PROTOS + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 #endif -#ifdef YY_USE_CONST -#define yyconst const +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; #else -#define yyconst +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) #endif +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +/* begin standard C++ headers. */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) #else -#define YY_PROTO(proto) () +#define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ -#define BEGIN yy_start = 1 + 2 * - +#define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ -#define YY_START ((yy_start - 1) / 2) +#define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START - /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - /* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin ) - +#define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else #define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif extern int yyleng; + extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - + + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + +/* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) +#define unput(c) yyunput( c, (yytext_ptr) ) -#define unput(c) yyunput( c, yytext_ptr ) - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ -typedef unsigned int yy_size_t; - - +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; @@ -175,7 +449,7 @@ /* Size of input buffer in bytes, not including room for EOB * characters. */ - yy_size_t yy_buf_size; + int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. @@ -201,12 +475,16 @@ */ int yy_at_bol; + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; + #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process @@ -220,28 +498,37 @@ * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ -static YY_BUFFER_STATE yy_current_buffer = 0; +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". + * + * Returns the top of the stack, or NULL. */ -#define YY_CURRENT_BUFFER yy_current_buffer - +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; - static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - int yyleng; /* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ +static char *yy_c_buf_p = NULL; +static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches @@ -249,1798 +536,196 @@ */ static int yy_did_buffer_switch_on_eof; -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); +void yyrestart ( FILE *input_file ); +void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); +void yy_delete_buffer ( YY_BUFFER_STATE b ); +void yy_flush_buffer ( YY_BUFFER_STATE b ); +void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state ( void ); + +static void yyensure_buffer_stack ( void ); +static void yy_load_buffer_state ( void ); +static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); +#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); +YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); + +void *yyalloc ( yy_size_t ); +void *yyrealloc ( void *, yy_size_t ); +void yyfree ( void * ); #define yy_new_buffer yy_create_buffer - #define yy_set_interactive(is_interactive) \ { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } - #define yy_set_bol(at_bol) \ { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +typedef flex_uint8_t YY_CHAR; -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) +FILE *yyin = NULL, *yyout = NULL; -typedef unsigned char YY_CHAR; -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; -extern char *yytext; -#define yytext_ptr yytext -static yyconst short yy_nxt[][256] = - { - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 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, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 5, 4, 4, 4, 4, 4, 4, 6, - - 7, 8, 9, 10, 11, 12, 13, 14, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 4, 15, - 16, 17, 4, 4, 18, 19, 19, 20, 21, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 22, 19, 19, 23, 19, 19, 19, 19, 19, 19, - 19, 24, 4, 25, 26, 4, 4, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4 - }, - - { - 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 5, 4, 4, 4, 4, 4, 4, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 4, 15, - 16, 17, 4, 4, 18, 19, 19, 20, 21, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - - 22, 19, 19, 23, 19, 19, 19, 19, 19, 19, - 19, 24, 4, 25, 26, 4, 4, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4 - }, - - { - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, - -3, -3, -3, -3, -3, -3 - }, - - { - 3, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, - -4, -4, -4, -4, -4, -4 - - }, - - { - 3, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, - -5, -5, -5, -5, -5, -5 - }, - - { - 3, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, 27, - - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - - -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, - -6, -6, -6, -6, -6, -6 - }, - - { - 3, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, - -7, -7, -7, -7, -7, -7 - }, - - { - 3, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -8, -8, -8, -8 - }, - - { - 3, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, 28, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, - -9, -9, -9, -9, -9, -9 - - }, - - { - 3, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, - -10, -10, -10, -10, -10, -10 - }, - - { - 3, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - - -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, - -11, -11, -11, -11, -11, -11 - }, - - { - 3, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12 - }, - - { - 3, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, 29, -13, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, 30, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, - -13, -13, -13, -13, -13, -13 - }, - - { - 3, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, - -14, -14, -14, -14, -14, -14 - - }, - - { - 3, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, - -15, -15, -15, -15, -15, -15 - }, - - { - 3, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - - -16, -16, -16, -16, -16, 31, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - - -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, - -16, -16, -16, -16, -16, -16 - }, - - { - 3, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, - -17, -17, -17, -17, -17, -17 - }, - - { - 3, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, - -18, -18, -18, -18, -18, -18 - }, - - { - 3, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -19, -19, - - -19, -19, -19, -19, -19, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -19, -19, -19, -19, 32, -19, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, - -19, -19, -19, -19, -19, -19 - - }, - - { - 3, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -20, -20, - -20, -20, -20, -20, -20, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -20, -20, -20, -20, 32, -20, 32, 32, 32, - - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 33, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, - -20, -20, -20, -20, -20, -20 - }, - - { - 3, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - - -21, -21, -21, -21, -21, -21, -21, -21, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -21, -21, - -21, -21, -21, -21, -21, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -21, -21, -21, -21, 32, -21, 32, 32, 32, - 32, 34, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - - -21, -21, -21, -21, -21, -21, -21, -21, -21, -21, - -21, -21, -21, -21, -21, -21 - }, - - { - 3, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -22, -22, - -22, -22, -22, -22, -22, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -22, -22, -22, -22, 32, -22, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 35, 32, 32, 32, 32, 32, - 32, 32, 32, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, - -22, -22, -22, -22, -22, -22 - }, - - { - 3, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -23, -23, - -23, -23, -23, -23, -23, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -23, -23, -23, -23, 32, -23, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 36, 32, 32, - - 32, 32, 32, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, - -23, -23, -23, -23, -23, -23 - }, - - { - 3, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, - -24, -24, -24, -24, -24, -24 - - }, - - { - 3, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25 - }, - - { - 3, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26 - }, - - { - 3, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, 27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27, -27, -27, -27, -27, - -27, -27, -27, -27, -27, -27 - }, - - { - 3, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28, -28, -28, -28, -28, - -28, -28, -28, -28, -28, -28 - }, - - { - 3, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, 29, -29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, -29, -29, - - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, 30, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29, -29, -29, -29, -29, - -29, -29, -29, -29, -29, -29 - - }, - - { - 3, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, 37, -30, 37, -30, -30, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, 37, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30, -30, -30, -30, -30, - -30, -30, -30, -30, -30, -30 - }, - - { - 3, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - - -31, -31, -31, -31, -31, -31, -31, -31, -31, -31, - -31, -31, -31, -31, -31, -31 - }, - - { - 3, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -32, -32, - -32, -32, -32, -32, -32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -32, -32, -32, -32, 32, -32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32 - }, - - { - 3, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -33, -33, - -33, -33, -33, -33, -33, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -33, -33, -33, -33, 32, -33, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 39, 32, 32, 32, 32, 32, 32, 32, 32, 32, - - 32, 32, 32, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33, -33, -33, -33, -33, - -33, -33, -33, -33, -33, -33 - }, - - { - 3, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -34, -34, - - -34, -34, -34, -34, -34, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -34, -34, -34, -34, 32, -34, 40, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 41, 32, 32, 32, 32, 32, - 32, 32, 32, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34, -34, -34, -34, -34, - -34, -34, -34, -34, -34, -34 - - }, - - { - 3, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -35, -35, - -35, -35, -35, -35, -35, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -35, -35, -35, -35, 32, -35, 32, 32, 32, - - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 42, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35 - }, - - { - 3, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - - -36, -36, -36, -36, -36, -36, -36, -36, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -36, -36, - -36, -36, -36, -36, -36, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -36, -36, -36, -36, 32, -36, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - - -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, - -36, -36, -36, -36, -36, -36 - }, - - { - 3, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, - -37, -37, -37, -37, -37, -37 - }, - - { - 3, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, - -38, -38, -38, -38, -38, -38 - }, - - { - 3, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -39, -39, - - -39, -39, -39, -39, -39, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -39, -39, -39, -39, 32, -39, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 44, 32, 32, 32, 32, - 32, 32, 32, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, - -39, -39, -39, -39, -39, -39 - - }, - - { - 3, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -40, -40, - -40, -40, -40, -40, -40, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -40, -40, -40, -40, 32, -40, 32, 32, 32, - - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 45, 32, 32, 32, 32, - 32, 32, 32, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, - -40, -40, -40, -40, -40, -40 - }, - - { - 3, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - - -41, -41, -41, -41, -41, -41, -41, -41, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -41, -41, - -41, -41, -41, -41, -41, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -41, -41, -41, -41, 32, -41, 32, 32, 32, - 32, 32, 32, 32, 32, 46, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - - -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, - -41, -41, -41, -41, -41, -41 - }, - - { - 3, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -42, -42, - -42, -42, -42, -42, -42, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -42, -42, -42, -42, 32, -42, 32, 32, 32, - 47, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, - -42, -42, -42, -42, -42, -42 - }, - - { - 3, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -43, -43, - -43, -43, -43, -43, -43, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -43, -43, -43, -43, 32, -43, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - - 32, 32, 32, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, - -43, -43, -43, -43, -43, -43 - }, - - { - 3, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -44, -44, - - -44, -44, -44, -44, -44, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -44, -44, -44, -44, 32, -44, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 48, 32, 32, 32, - 32, 32, 32, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, - -44, -44, -44, -44, -44, -44 - - }, - - { - 3, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -45, -45, - -45, -45, -45, -45, -45, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -45, -45, -45, -45, 32, -45, 32, 32, 32, - - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 49, 32, 32, 32, 32, - 32, 32, 32, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, - -45, -45, -45, -45, -45, -45 - }, - - { - 3, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - - -46, -46, -46, -46, -46, -46, -46, -46, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -46, -46, - -46, -46, -46, -46, -46, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -46, -46, -46, -46, 32, -46, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 50, 32, - 32, 32, 32, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - - -46, -46, -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -46, -46, -46, -46 - }, - - { - 3, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -47, -47, - -47, -47, -47, -47, -47, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -47, -47, -47, -47, 32, -47, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -47, -47, -47 - }, - - { - 3, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -48, -48, - -48, -48, -48, -48, -48, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -48, -48, -48, -48, 32, -48, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - - 32, 32, 32, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48 - }, - - { - 3, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -49, -49, - - -49, -49, -49, -49, -49, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -49, -49, -49, -49, 32, -49, 32, 32, 32, - 32, 32, 32, 32, 32, 51, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, - -49, -49, -49, -49, -49, -49 - - }, - - { - 3, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -50, -50, - -50, -50, -50, -50, -50, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -50, -50, -50, -50, 32, -50, 32, 32, 32, - - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, - -50, -50, -50, -50, -50, -50 - }, - - { - 3, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - - -51, -51, -51, -51, -51, -51, -51, -51, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -51, -51, - -51, -51, -51, -51, -51, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -51, -51, -51, -51, 32, -51, 32, 32, 32, - 32, 32, 32, 52, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - - -51, -51, -51, -51, -51, -51, -51, -51, -51, -51, - -51, -51, -51, -51, -51, -51 - }, - - { - 3, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -52, -52, - -52, -52, -52, -52, -52, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -52, -52, -52, -52, 32, -52, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 53, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, - -52, -52, -52, -52, -52, -52 - }, - - { - 3, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, -53, -53, - -53, -53, -53, -53, -53, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, -53, -53, -53, -53, 32, -53, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - - 32, 32, 32, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, - -53, -53, -53, -53, -53, -53 - }, - } ; +extern int yylineno; +int yylineno = 1; +extern char *yytext; +#ifdef yytext_ptr +#undef yytext_ptr +#endif +#define yytext_ptr yytext -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); +static yy_state_type yy_get_previous_state ( void ); +static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); +static int yy_get_next_buffer ( void ); +static void yynoreturn yy_fatal_error ( const char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ + (yytext_ptr) = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ - yy_hold_char = *yy_cp; \ + (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ - yy_c_buf_p = yy_cp; - + (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 26 #define YY_END_OF_BUFFER 27 -static yyconst short int yy_accept[54] = +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static const flex_int16_t yy_accept[55] = { 0, 0, 0, 27, 26, 1, 25, 8, 10, 7, 2, 12, 3, 22, 4, 24, 26, 15, 13, 23, 23, 23, 23, 23, 9, 11, 5, 25, 6, 22, 0, 14, 23, 23, 23, 23, 23, 0, 21, 23, 23, 23, 23, 19, 23, 23, 23, 20, 18, 23, 17, - 23, 23, 16 + 23, 23, 16, 0 } ; -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; +static const YY_CHAR yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 1, 13, 14, + 15, 1, 1, 16, 17, 17, 18, 19, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 20, + 17, 17, 21, 17, 17, 17, 17, 17, 17, 17, + 22, 1, 23, 24, 25, 1, 26, 17, 17, 27, + + 28, 17, 29, 17, 30, 17, 17, 17, 31, 32, + 33, 17, 17, 34, 35, 36, 37, 38, 17, 17, + 17, 17, 1, 39, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static const YY_CHAR yy_meta[40] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 1 + } ; + +static const flex_int16_t yy_base[56] = + { 0, + 0, 0, 75, 77, 77, 71, 77, 77, 67, 77, + 77, 77, 30, 77, 77, 63, 77, 77, 0, 38, + 42, 35, 31, 77, 77, 77, 64, 77, 31, 37, + 77, 0, 34, 19, 32, 33, 51, 50, 26, 25, + 27, 29, 0, 19, 19, 14, 0, 0, 21, 0, + 21, 16, 0, 77, 45 + } ; + +static const flex_int16_t yy_def[56] = + { 0, + 54, 1, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, + 55, 55, 55, 54, 54, 54, 54, 54, 54, 54, + 54, 55, 55, 55, 55, 55, 54, 54, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 54 + } ; + +static const flex_int16_t yy_nxt[117] = + { 0, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 13, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 4, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 4, 29, + 29, 29, 29, 37, 40, 37, 32, 53, 38, 52, + 51, 50, 41, 49, 48, 47, 46, 30, 30, 45, + 44, 38, 38, 43, 42, 39, 27, 36, 35, 34, + 33, 31, 28, 27, 54, 37, 3, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, -static yyconst yy_state_type yy_NUL_trans[54] = + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54 + } ; + +static const flex_int16_t yy_chk[117] = { 0, - 4, 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 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, + 29, 13, 29, 30, 34, 30, 55, 52, 30, 51, + 49, 46, 34, 45, 44, 42, 41, 13, 29, 40, + 39, 38, 37, 36, 35, 33, 27, 23, 22, 21, + 20, 16, 9, 6, 3, 30, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54 } ; +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ @@ -2049,7 +734,6 @@ #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#define INITIAL 0 /* Copyright (c) 1997-1999 Matra Datavision @@ -2094,7 +778,9 @@ // provide safe error handler (exception instead of exit()) #define YY_FATAL_ERROR(msg) ExprIntrperror(msg) +// MSVC specifics #ifdef _MSC_VER + // add includes for flex 2.91 (Linux version) #include #include @@ -2106,11 +792,15 @@ // Note that Intel compiler also defines _MSC_VER but has different warning ids #if defined(__INTEL_COMPILER) #pragma warning(disable:177 1786 1736) +#elif defined(__clang__) +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma GCC diagnostic ignored "-Winconsistent-dllimport" +#pragma GCC diagnostic ignored "-Wunneeded-internal-declaration" #else #pragma warning(disable:4131 4244 4273 4127 4267) #endif -#endif +#endif /* MSC_VER */ #ifdef __GNUC__ // add includes for flex 2.91 (Linux version) @@ -2120,6 +810,50 @@ #pragma GCC diagnostic ignored "-Wunused-function" #endif +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals ( void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy ( void ); + +int yyget_debug ( void ); + +void yyset_debug ( int debug_flag ); + +YY_EXTRA_TYPE yyget_extra ( void ); + +void yyset_extra ( YY_EXTRA_TYPE user_defined ); + +FILE *yyget_in ( void ); + +void yyset_in ( FILE * _in_str ); + +FILE *yyget_out ( void ); + +void yyset_out ( FILE * _out_str ); + + int yyget_leng ( void ); + +char *yyget_text ( void ); + +int yyget_lineno ( void ); + +void yyset_lineno ( int _line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. @@ -2127,79 +861,51 @@ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); +extern "C" int yywrap ( void ); #else -extern int yywrap YY_PROTO(( void )); +extern int yywrap ( void ); #endif #endif #ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); + + static void yyunput ( int c, char *buf_ptr ); + #endif #ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen YY_PROTO(( yyconst char * )); +static int yy_flex_strlen ( const char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus -static int yyinput YY_PROTO(( void )); +static int yyinput ( void ); #else -static int input YY_PROTO(( void )); -#endif +static int input ( void ); #endif -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else #define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ - #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -2207,8 +913,35 @@ */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ - if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + int n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - @@ -2229,12 +962,18 @@ #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif +/* end tables serialization structures and prototypes */ + /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL -#define YY_DECL int yylex YY_PROTO(( void )) -#endif +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. @@ -2245,30 +984,30 @@ /* Code executed at the end of each rule. */ #ifndef YY_BREAK -#define YY_BREAK break; +#define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION +/** The main scanner function which does all the work. + */ YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - - - - if ( yy_init ) +{ + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + + if ( !(yy_init) ) { - yy_init = 0; + (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif - if ( ! yy_start ) - yy_start = 1; /* first start state */ + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; @@ -2276,56 +1015,70 @@ if ( ! yyout ) yyout = stdout; - if ( ! yy_current_buffer ) - yy_current_buffer = + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); + } - yy_load_buffer_state(); + yy_load_buffer_state( ); } - while ( 1 ) /* loops until end-of-file is reached */ + { + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { - yy_cp = yy_c_buf_p; + yy_cp = (yy_c_buf_p); /* Support of yytext. */ - *yy_cp = yy_hold_char; + *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; - yy_current_state = yy_start; + yy_current_state = (yy_start); yy_match: - while ( (yy_current_state = yy_nxt[yy_current_state][YY_SC_TO_UI(*yy_cp)]) > 0 ) + do { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; } - + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 55 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - - yy_current_state = -yy_current_state; + while ( yy_base[yy_current_state] != 77 ); yy_find_action: yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } YY_DO_BEFORE_ACTION; - do_action: /* This label is used only to access EOF actions. */ - switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yy_hold_char; - yy_cp = yy_last_accepting_cpos + 1; - yy_current_state = yy_last_accepting_state; + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: @@ -2438,26 +1191,26 @@ case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yy_hold_char; + *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure - * consistency between yy_current_buffer and our + * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ - yy_n_chars = yy_current_buffer->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position @@ -2467,13 +1220,13 @@ * end-of-buffer state). Contrast this with the test * in input(). */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; - yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - yy_current_state = yy_get_previous_state(); + yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have @@ -2486,30 +1239,30 @@ yy_next_state = yy_try_NUL_trans( yy_current_state ); - yy_bp = yytext_ptr + YY_MORE_ADJ; + yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; + yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { - yy_cp = yy_c_buf_p; + yy_cp = (yy_c_buf_p); goto yy_find_action; } } - else switch ( yy_get_next_buffer() ) + else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { - yy_did_buffer_switch_on_eof = 0; + (yy_did_buffer_switch_on_eof) = 0; - if ( yywrap() ) + if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up @@ -2520,7 +1273,7 @@ * YY_NULL, it'll still work - another * YY_NULL will get returned. */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; @@ -2528,30 +1281,30 @@ else { - if ( ! yy_did_buffer_switch_on_eof ) + if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = - yytext_ptr + yy_amount_of_matched_text; + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; - yy_current_state = yy_get_previous_state(); + yy_current_state = yy_get_previous_state( ); - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - yy_current_state = yy_get_previous_state(); + yy_current_state = yy_get_previous_state( ); - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; @@ -2562,8 +1315,8 @@ "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ - } /* end of yylex */ - + } /* end of user's declarations */ +} /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * @@ -2572,21 +1325,20 @@ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ - -static int yy_get_next_buffer() - { - register char *dest = yy_current_buffer->yy_ch_buf; - register char *source = yytext_ptr; - register int number_to_move, i; +static int yy_get_next_buffer (void) +{ + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; int ret_val; - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); - if ( yy_current_buffer->yy_fill_buffer == 0 ) + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. @@ -2606,34 +1358,30 @@ /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ - yy_n_chars = 0; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = yy_current_buffer; + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = - (int) (yy_c_buf_p - b->yy_ch_buf); + (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { @@ -2646,44 +1394,46 @@ b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ - yy_flex_realloc( (void *) b->yy_ch_buf, - b->yy_buf_size + 2 ); + yyrealloc( (void *) b->yy_ch_buf, + (yy_size_t) (b->yy_buf_size + 2) ); } else /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; + b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); - yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; - num_to_read = yy_current_buffer->yy_buf_size - + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; -#endif + } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } - if ( yy_n_chars == 0 ) + if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); + yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } @@ -2691,156 +1441,175 @@ else ret_val = EOB_ACT_CONTINUE_SCAN; - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; - } - +} /* yy_get_previous_state - get the state just before the EOB char was reached */ -static yy_state_type yy_get_previous_state() - { - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = yy_start; + static yy_state_type yy_get_previous_state (void) +{ + yy_state_type yy_current_state; + char *yy_cp; + + yy_current_state = (yy_start); - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { - if ( *yy_cp ) + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) { - yy_current_state = yy_nxt[yy_current_state][YY_SC_TO_UI(*yy_cp)]; + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; } - else - yy_current_state = yy_NUL_trans[yy_current_state]; - if ( yy_accept[yy_current_state] ) + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 55 ) + yy_c = yy_meta[yy_c]; } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; - } - +} /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + int yy_is_jam; + char *yy_cp = (yy_c_buf_p); -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif - { - register int yy_is_jam; - register char *yy_cp = yy_c_buf_p; - - yy_current_state = yy_NUL_trans[yy_current_state]; - yy_is_jam = (yy_current_state == 0); - - if ( ! yy_is_jam ) + YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) { - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 55 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_is_jam = (yy_current_state == 54); - return yy_is_jam ? 0 : yy_current_state; - } - + return yy_is_jam ? 0 : yy_current_state; +} #ifndef YY_NO_UNPUT -#ifdef YY_USE_PROTOS -static void yyunput( int c, register char *yy_bp ) -#else -static void yyunput( c, yy_bp ) -int c; -register char *yy_bp; -#endif - { - register char *yy_cp = yy_c_buf_p; + + static void yyunput (int c, char * yy_bp ) +{ + char *yy_cp; + + yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; + *yy_cp = (yy_hold_char); - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ - register int number_to_move = yy_n_chars + 2; - register char *dest = &yy_current_buffer->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; - register char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; + int number_to_move = (yy_n_chars) + 2; + char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; - while ( source > yy_current_buffer->yy_ch_buf ) + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); - yy_n_chars = yy_current_buffer->yy_buf_size; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} - yytext_ptr = yy_bp; - yy_hold_char = *yy_cp; - yy_c_buf_p = yy_cp; - } -#endif /* ifndef YY_NO_UNPUT */ - +#endif +#ifndef YY_NO_INPUT #ifdef __cplusplus -static int yyinput() + static int yyinput (void) #else -static int input() + static int input (void) #endif - { - int c; - *yy_c_buf_p = yy_hold_char; +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ - *yy_c_buf_p = '\0'; + *(yy_c_buf_p) = '\0'; else { /* need more input */ - int offset = yy_c_buf_p - yytext_ptr; - ++yy_c_buf_p; + int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); + ++(yy_c_buf_p); - switch ( yy_get_next_buffer() ) + switch ( yy_get_next_buffer( ) ) { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /*FALLTHROUGH*/ + case EOB_ACT_END_OF_FILE: { - if ( yywrap() ) - { - yy_c_buf_p = yytext_ptr + offset; - return EOF; - } + if ( yywrap( ) ) + return 0; - if ( ! yy_did_buffer_switch_on_eof ) + if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); @@ -2850,99 +1619,92 @@ } case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + offset; + (yy_c_buf_p) = (yytext_ptr) + offset; break; - - case EOB_ACT_LAST_MATCH: -#ifdef __cplusplus - YY_FATAL_ERROR( - "unexpected last match in yyinput()" ); -#else - YY_FATAL_ERROR( - "unexpected last match in input()" ); -#endif } } } - c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ - *yy_c_buf_p = '\0'; /* preserve yytext */ - yy_hold_char = *++yy_c_buf_p; - + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); return c; - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); +} +#endif /* ifndef YY_NO_INPUT */ - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE ); } + yy_init_buffer( YY_CURRENT_BUFFER, input_file ); + yy_load_buffer_state( ); +} -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - { - if ( yy_current_buffer == new_buffer ) +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) return; - if ( yy_current_buffer ) + if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } - yy_current_buffer = new_buffer; - yy_load_buffer_state(); + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } + (yy_did_buffer_switch_on_eof) = 1; +} +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - { +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); @@ -2951,7 +1713,7 @@ /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); @@ -2960,70 +1722,64 @@ yy_init_buffer( b, file ); return b; - } - +} -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - { +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) return; - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); + yyfree( (void *) b->yy_ch_buf ); - yy_flex_free( (void *) b ); - } - - -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif + yyfree( (void *) b ); +} +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) - { +{ + int oerrno = errno; + yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif - } - + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#endif +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; - { b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes @@ -3038,90 +1794,181 @@ b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; - if ( b == yy_current_buffer ) - yy_load_buffer_state(); + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; } +} +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + yy_size_t num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); -#ifndef YY_NO_SCAN_BUFFER -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - YY_BUFFER_STATE b; + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ - return 0; + return NULL; - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; - b->yy_input_file = 0; + b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - yy_switch_to_buffer( b ); + yy_switch_to_buffer( b ); return b; - } -#endif - - -#ifndef YY_NO_SCAN_STRING -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *str ) -#else -YY_BUFFER_STATE yy_scan_string( str ) -yyconst char *str; -#endif - { - int len; - for ( len = 0; str[len]; ++len ) - ; - - return yy_scan_bytes( str, len ); - } -#endif +} +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (const char * yystr ) +{ + + return yy_scan_bytes( yystr, (int) strlen(yystr) ); +} -#ifndef YY_NO_SCAN_BYTES -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) +{ YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; - + /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n ); if ( ! b ) @@ -3133,148 +1980,198 @@ b->yy_is_our_buffer = 1; return b; - } -#endif - +} -#ifndef YY_NO_PUSH_STATE -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 #endif - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); +static void yynoreturn yy_fatal_error (const char* msg ) +{ + fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); +/* Redefine yyless() so it works in section 3 code. */ - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } +/* Accessor methods (get/set functions) to struct members. */ - yy_start_stack[yy_start_stack_ptr++] = YY_START; +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} - BEGIN(new_state); - } -#endif +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} -#ifndef YY_NO_POP_STATE -static void yy_pop_state() - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif +/** Get the current token. + * + */ +char *yyget_text (void) +{ + return yytext; +} -#ifndef YY_NO_TOP_STATE -static int yy_top_state() - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif +/** Set the current line number. + * @param _line_number line number + * + */ +void yyset_lineno (int _line_number ) +{ + + yylineno = _line_number; +} -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif +/** Set the input stream. This does not discard the current + * input buffer. + * @param _in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * _in_str ) +{ + yyin = _in_str ; +} -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } +void yyset_out (FILE * _out_str ) +{ + yyout = _out_str ; +} +int yyget_debug (void) +{ + return yy_flex_debug; +} +void yyset_debug (int _bdebug ) +{ + yy_flex_debug = _bdebug ; +} -/* Redefine yyless() so it works in section 3 code. */ +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = NULL; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = NULL; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = NULL; + yyout = NULL; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer( YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( ); + return 0; +} -/* Internal utility routines. */ +/* + * Internal utility routines. + */ #ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; +static void yy_flex_strncpy (char* s1, const char * s2, int n ) +{ + + int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; - } +} #endif #ifdef YY_NEED_STRLEN -#ifdef YY_USE_PROTOS -static int yy_flex_strlen( yyconst char *s ) -#else -static int yy_flex_strlen( s ) -yyconst char *s; -#endif - { - register int n; +static int yy_flex_strlen (const char * s ) +{ + int n; for ( n = 0; s[n]; ++n ) ; return n; - } +} #endif +void *yyalloc (yy_size_t size ) +{ + return malloc(size); +} -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { +void *yyrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter @@ -3282,23 +2179,13 @@ * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ - return (void *) realloc( (char *) ptr, size ); - } + return realloc(ptr, size); +} -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif diff -Nru opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtCC2d.cxx opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtCC2d.cxx --- opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtCC2d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtCC2d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,19 @@ #include Extrema_ExtCC2d::Extrema_ExtCC2d() -: myIsFindSingleSolution(Standard_False) +: myIsFindSingleSolution(Standard_False), + myDone(Standard_False), + myIsPar(Standard_False), + mynbext(0), + inverse(Standard_False), + myv1(0.0), + myv2(0.0), + mytolc1(0.0), + mytolc2(0.0), + mydist11(0.0), + mydist12(0.0), + mydist21(0.0), + mydist22(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtCC.cxx opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtCC.cxx --- opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtCC.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtCC.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,7 +55,8 @@ Extrema_ExtCC::Extrema_ExtCC (const Standard_Real TolC1, const Standard_Real TolC2) : myIsFindSingleSolution(Standard_False), - myDone (Standard_False) + myDone (Standard_False), + myIsPar(Standard_False) { myC[0] = 0; myC[1] = 0; myInf[0] = myInf[1] = -Precision::Infinite(); diff -Nru opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtCS.cxx opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtCS.cxx --- opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtCS.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtCS.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,10 +39,22 @@ #include #include #include +#include -Extrema_ExtCS::Extrema_ExtCS() +Extrema_ExtCS::Extrema_ExtCS() +: myS(NULL), + myDone(Standard_False), + myIsPar(Standard_False), + myuinf(0.0), + myusup(0.0), + myvinf(0.0), + myvsup(0.0), + mytolC(0.0), + mytolS(0.0), + myucinf(0.0), + myucsup(0.0), + myStype(GeomAbs_OtherSurface) { - myDone = Standard_False; } Extrema_ExtCS::Extrema_ExtCS(const Adaptor3d_Curve& C, @@ -105,7 +117,7 @@ mySqDist.Clear(); Standard_Integer i, j; Standard_Integer NbT, NbU, NbV; - NbT = NbU = NbV = 10; + NbT = 12; NbU = NbV = 10; GeomAbs_CurveType myCtype = C.GetType(); myDone = Standard_False; @@ -177,6 +189,27 @@ if (myS->IsVPeriodic()) NbV = 13; + if (clast - cfirst <= Precision::Confusion()) + { + Standard_Real aCPar = (cfirst + clast) / 2.; + gp_Pnt aPm = C.Value(aCPar); + Extrema_ExtPS anExtPS(aPm, *myS, ufirst, ulast, + vfirst, vlast, mytolS, mytolS, Extrema_ExtFlag_MIN); + myDone = anExtPS.IsDone(); + if (myDone) { + Standard_Integer NbExt = anExtPS.NbExt(); + Standard_Real T = aCPar, U, V; + Extrema_POnCurv PC; + Extrema_POnSurf PS; + for (i = 1; i <= NbExt; i++) { + PS = anExtPS.Point(i); + PS.Parameter(U, V); + AddSolution(C, T, U, V, PC.Value(), PS.Value(), anExtPS.SquareDistance(i)); + } + } + return; + } + Extrema_GenExtCS Ext(C, *myS, NbT, NbU, NbV, cfirst, clast, ufirst, ulast, vfirst, vlast, mytolC, mytolS); diff -Nru opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtElC2d.cxx opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtElC2d.cxx --- opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtElC2d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtElC2d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,10 +39,9 @@ myDone = Standard_False; myIsPar = Standard_False; myNbExt = 0; - - for (Standard_Integer i = 0; i < 8; i++) + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) { - mySqDist[i] = RealLast(); + mySqDist[anIdx] = RealLast(); } } @@ -70,6 +69,10 @@ myDone = Standard_False; myIsPar = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } gp_Vec2d D1(C1.Direction()); gp_Vec2d D2(C2.Direction()); @@ -125,6 +128,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } // Calculate T1 in the reference of the circle ... gp_Dir2d D = C1.Direction(); @@ -172,6 +179,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } // Calculate T1 in the reference of the ellipse ... gp_Dir2d D = C1.Direction(); @@ -219,6 +230,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } // Calculate T1 in the reference of the parabole ... gp_Dir2d D = C1.Direction(); @@ -255,6 +270,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } // Calculate T1 in the reference of the parabole ... gp_Dir2d D = C1.Direction(); @@ -289,6 +308,10 @@ myDone = Standard_False; myNbExt = 0; myDone = Standard_True; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } gp_Pnt2d O1 = C1.Location(); gp_Pnt2d O2 = C2.Location(); @@ -339,6 +362,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } Standard_Integer i, j; @@ -368,6 +395,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } Standard_Integer i, j; @@ -397,6 +428,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } Standard_Integer i, j; diff -Nru opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtElC.cxx opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtElC.cxx --- opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtElC.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtElC.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -119,6 +119,8 @@ const Standard_Real Cte, const Standard_Real Binf, const Standard_Real Bsup) +: NbRoots(0), + infinite_roots(Standard_False) { Standard_Integer i, nbessai; Standard_Real cc ,sc, c, s, cte; @@ -232,10 +234,9 @@ myDone = Standard_False; myIsPar = Standard_False; myNbExt = 0; - - for (Standard_Integer i = 0; i < 6; i++) + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) { - mySqDist[i] = RealLast(); + mySqDist[anIdx] = RealLast(); } } //======================================================================= @@ -294,6 +295,10 @@ myDone = Standard_False; myNbExt = 0; myIsPar = Standard_False; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } const gp_Dir &aD1 = theC1.Position().Direction(), &aD2 = theC2.Position().Direction(); @@ -460,6 +465,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } if (PlanarLineCircleExtrema(C1, C2)) { @@ -631,6 +640,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } // Calculate T1 the reference of the ellipse ... gp_Dir D = C1.Direction(); @@ -744,6 +757,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } // Calculate T1 in the reference of the hyperbola... gp_Dir D = C1.Direction(); @@ -839,6 +856,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } // Calculate T1 in the reference of the parabola... gp_Dir D = C1.Direction(); @@ -900,6 +921,10 @@ myIsPar = Standard_False; myDone = Standard_False; myNbExt = 0; + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } // aTolA=Precision::Angular(); aTolD=Precision::Confusion(); diff -Nru opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtPExtS.cxx opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtPExtS.cxx --- opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtPExtS.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtPExtS.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -155,6 +155,10 @@ myDone(Standard_False), myNbExt(0) { + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } } //============================================================================= @@ -178,6 +182,10 @@ myDone(Standard_False), myNbExt(0) { + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } Initialize (theS, theUmin, theUsup, @@ -205,6 +213,10 @@ myDone(Standard_False), myNbExt(0) { + for (size_t anIdx = 0; anIdx < sizeof (mySqDist) / sizeof (mySqDist[0]); anIdx++) + { + mySqDist[anIdx] = RealLast(); + } Initialize (theS, theS->FirstUParameter(), theS->LastUParameter(), diff -Nru opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtPS.cxx opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtPS.cxx --- opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtPS.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtPS.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -143,8 +143,20 @@ //======================================================================= Extrema_ExtPS::Extrema_ExtPS() +: myS(NULL), + myDone(Standard_False), + myuinf(0.0), + myusup(0.0), + myvinf(0.0), + myvsup(0.0), + mytolu(0.0), + mytolv(0.0), + d11(0.0), + d12(0.0), + d21(0.0), + d22(0.0), + mytype(GeomAbs_OtherSurface) { - myDone = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtSS.cxx opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtSS.cxx --- opencascade-7.4.1+dfsg1/src/Extrema/Extrema_ExtSS.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Extrema/Extrema_ExtSS.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,9 +27,22 @@ #include #include -Extrema_ExtSS::Extrema_ExtSS() +Extrema_ExtSS::Extrema_ExtSS() +: myS2(NULL), + myDone(Standard_False), + myIsPar(Standard_False), + myuinf1(0.0), + myusup1(0.0), + myvinf1(0.0), + myvsup1(0.0), + myuinf2(0.0), + myusup2(0.0), + myvinf2(0.0), + myvsup2(0.0), + mytolS1(0.0), + mytolS2(0.0), + myStype(GeomAbs_OtherSurface) { - myDone = Standard_False; } Extrema_ExtSS::Extrema_ExtSS(const Adaptor3d_Surface& S1, diff -Nru opencascade-7.4.1+dfsg1/src/Extrema/Extrema_FuncExtCS.cxx opencascade-7.5.1+dfsg1/src/Extrema/Extrema_FuncExtCS.cxx --- opencascade-7.4.1+dfsg1/src/Extrema/Extrema_FuncExtCS.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Extrema/Extrema_FuncExtCS.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,6 +51,11 @@ //purpose : //======================================================================= Extrema_FuncExtCS::Extrema_FuncExtCS() + : myC(NULL), + myS(NULL), + myt(0.0), + myU(0.0), + myV(0.0) { myCinit = Standard_False; mySinit = Standard_False; @@ -203,12 +208,13 @@ std::cout <<"F(1)= "<SetOfSurfData()->Value(1)-> VertexFirstOnS1().IsOnArc(); Standard_Boolean isonedge2= myListStripe.First()->SetOfSurfData()->Value(1)-> - VertexFirstOnS2().IsOnArc();; + VertexFirstOnS2().IsOnArc(); if (isonedge1 && isonedge2) {return FilletSurf_TwoExtremityOnEdge;} diff -Nru opencascade-7.4.1+dfsg1/src/Font/FILES opencascade-7.5.1+dfsg1/src/Font/FILES --- opencascade-7.4.1+dfsg1/src/Font/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,6 +1,4 @@ -Font_BRepFont.cxx Font_BRepFont.hxx -Font_BRepTextBuilder.cxx Font_BRepTextBuilder.hxx Font_FontAspect.hxx Font_FontMgr.cxx @@ -18,3 +16,4 @@ Font_TextFormatter.hxx Font_TextFormatter.cxx Font_UnicodeSubset.hxx +Font_DejavuSans_Latin_woff.pxx diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_BRepFont.cxx opencascade-7.5.1+dfsg1/src/Font/Font_BRepFont.cxx --- opencascade-7.4.1+dfsg1/src/Font/Font_BRepFont.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_BRepFont.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,649 +0,0 @@ -// Created on: 2013-09-16 -// Copyright (c) 2013-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include FT_FREETYPE_H -#include FT_OUTLINE_H - -IMPLEMENT_STANDARD_RTTIEXT(Font_BRepFont,Font_FTFont) - -namespace -{ - // pre-defined font rendering options - static const unsigned int THE_FONT_SIZE = 72; - static const unsigned int THE_RESOLUTION_DPI = 4800; - static const Font_FTFontParams THE_FONT_PARAMS (THE_FONT_SIZE, THE_RESOLUTION_DPI); - - // compute scaling factor for specified font size - inline Standard_Real getScale (const Standard_Real theSize) - { - return theSize / Standard_Real(THE_FONT_SIZE) * 72.0 / Standard_Real(THE_RESOLUTION_DPI); - } - - //! Auxiliary method to convert FT_Vector to gp_XY - static gp_XY readFTVec (const FT_Vector& theVec, - const Standard_Real theScaleUnits, - const Standard_Real theWidthScaling = 1.0) - { - return gp_XY (theScaleUnits * Standard_Real(theVec.x) * theWidthScaling / 64.0, theScaleUnits * Standard_Real(theVec.y) / 64.0); - } - - //! Auxiliary method for classification wire theW2 with respect to wire theW1 - static TopAbs_State classifyWW (const TopoDS_Wire& theW1, - const TopoDS_Wire& theW2, - const TopoDS_Face& theF) - { - TopAbs_State aRes = TopAbs_UNKNOWN; - - TopoDS_Face aF = TopoDS::Face (theF.EmptyCopied()); - aF.Orientation (TopAbs_FORWARD); - BRep_Builder aB; - aB.Add (aF, theW1); - BRepTopAdaptor_FClass2d aClass2d (aF, ::Precision::PConfusion()); - for (TopoDS_Iterator anEdgeIter (theW2); anEdgeIter.More(); anEdgeIter.Next()) - { - const TopoDS_Edge& anEdge = TopoDS::Edge (anEdgeIter.Value()); - Standard_Real aPFirst = 0.0, aPLast = 0.0; - Handle(Geom2d_Curve) aCurve2d = BRep_Tool::CurveOnSurface (anEdge, theF, aPFirst, aPLast); - if (aCurve2d.IsNull()) - { - continue; - } - - gp_Pnt2d aPnt2d = aCurve2d->Value ((aPFirst + aPLast) / 2.0); - TopAbs_State aState = aClass2d.Perform (aPnt2d, Standard_False); - if (aState == TopAbs_OUT - || aState == TopAbs_IN) - { - if (aRes == TopAbs_UNKNOWN) - { - aRes = aState; - } - else if (aRes != aState) - { - return TopAbs_UNKNOWN; - } - } - } - return aRes; - } - -} - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -Font_BRepFont::Font_BRepFont () -: myPrecision (Precision::Confusion()), - myScaleUnits (1.0), - myIsCompositeCurve (Standard_False), - my3Poles (1, 3), - my4Poles (1, 4) -{ - init(); -} - -// ======================================================================= -// function : init -// purpose : -// ======================================================================= -void Font_BRepFont::init() -{ - mySurface = new Geom_Plane (gp_Pln (gp::XOY())); - myCurve2dAdaptor = new Geom2dAdaptor_HCurve(); - Handle(Adaptor3d_HSurface) aSurfAdaptor = new GeomAdaptor_HSurface (mySurface); - myCurvOnSurf.Load (aSurfAdaptor); -} - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -Font_BRepFont::Font_BRepFont (const NCollection_String& theFontPath, - const Standard_Real theSize) -: myPrecision (Precision::Confusion()), - myScaleUnits (1.0), - myIsCompositeCurve (Standard_False), - my3Poles (1, 3), - my4Poles (1, 4) -{ - init(); - if (theSize <= myPrecision * 100.0) - { - return; - } - - myScaleUnits = getScale (theSize); - Font_FTFont::Init (theFontPath.ToCString(), THE_FONT_PARAMS); -} - -// ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -Font_BRepFont::Font_BRepFont (const NCollection_String& theFontName, - const Font_FontAspect theFontAspect, - const Standard_Real theSize, - const Font_StrictLevel theStrictLevel) -: myPrecision (Precision::Confusion()), - myScaleUnits (1.0), - myIsCompositeCurve (Standard_False), - my3Poles (1, 3), - my4Poles (1, 4) -{ - init(); - if (theSize <= myPrecision * 100.0) - { - return; - } - - myScaleUnits = getScale (theSize); - Font_FTFont::FindAndInit (theFontName.ToCString(), theFontAspect, THE_FONT_PARAMS, theStrictLevel); -} - -// ======================================================================= -// function : Release -// purpose : -// ======================================================================= -void Font_BRepFont::Release() -{ - myCache.Clear(); - Font_FTFont::Release(); -} - -// ======================================================================= -// function : SetCompositeCurveMode -// purpose : -// ======================================================================= -void Font_BRepFont::SetCompositeCurveMode (const Standard_Boolean theToConcatenate) -{ - if (myIsCompositeCurve != theToConcatenate) - { - myIsCompositeCurve = theToConcatenate; - myCache.Clear(); - } -} - -// ======================================================================= -// function : Init -// purpose : -// ======================================================================= -bool Font_BRepFont::Init (const NCollection_String& theFontPath, - const Standard_Real theSize) -{ - if (theSize <= myPrecision * 100.0) - { - return false; - } - - myScaleUnits = getScale (theSize); - return Font_FTFont::Init (theFontPath.ToCString(), THE_FONT_PARAMS); -} - -// ======================================================================= -// function : FindAndInit -// purpose : -// ======================================================================= -bool Font_BRepFont::FindAndInit (const TCollection_AsciiString& theFontName, - const Font_FontAspect theFontAspect, - const Standard_Real theSize, - const Font_StrictLevel theStrictLevel) -{ - if (theSize <= myPrecision * 100.0) - { - return false; - } - - myScaleUnits = getScale (theSize); - return Font_FTFont::FindAndInit (theFontName.ToCString(), theFontAspect, THE_FONT_PARAMS, theStrictLevel); -} - -// ======================================================================= -// function : RenderGlyph -// purpose : -// ======================================================================= -TopoDS_Shape Font_BRepFont::RenderGlyph (const Standard_Utf32Char& theChar) -{ - TopoDS_Shape aShape; - Standard_Mutex::Sentry aSentry (myMutex); - renderGlyph (theChar, aShape); - return aShape; -} - -// ======================================================================= -// function : to3d -// purpose : -// ======================================================================= -bool Font_BRepFont::to3d (const Handle(Geom2d_Curve)& theCurve2d, - const GeomAbs_Shape theContinuity, - Handle(Geom_Curve)& theCurve3d) -{ - Standard_Real aMaxDeviation = 0.0; - Standard_Real anAverDeviation = 0.0; - myCurve2dAdaptor->ChangeCurve2d().Load (theCurve2d); - const Handle(Adaptor2d_HCurve2d)& aCurve = myCurve2dAdaptor; // to avoid ambiguity - myCurvOnSurf.Load (aCurve); - GeomLib::BuildCurve3d (myPrecision, myCurvOnSurf, - myCurve2dAdaptor->FirstParameter(), myCurve2dAdaptor->LastParameter(), - theCurve3d, aMaxDeviation, anAverDeviation, theContinuity); - return !theCurve3d.IsNull(); -} - - -// ======================================================================= -// function : buildFaces -// purpose : -// ======================================================================= -Standard_Boolean Font_BRepFont::buildFaces (const NCollection_Sequence& theWires, - TopoDS_Shape& theRes) -{ - // classify wires - NCollection_DataMap, TopTools_ShapeMapHasher> aMapOutInts; - TopTools_DataMapOfShapeInteger aMapNbOuts; - TopoDS_Face aF; - myBuilder.MakeFace (aF, mySurface, myPrecision); - Standard_Integer aWireIter1Index = 1; - for (NCollection_Sequence::Iterator aWireIter1 (theWires); aWireIter1.More(); ++aWireIter1Index, aWireIter1.Next()) - { - const TopoDS_Wire& aW1 = aWireIter1.Value(); - if (!aMapNbOuts.IsBound (aW1)) - { - const Standard_Integer aNbOuts = 0; - aMapNbOuts.Bind (aW1, aNbOuts); - } - - NCollection_Sequence* anIntWs = aMapOutInts.Bound (aW1, NCollection_Sequence()); - Standard_Integer aWireIter2Index = 1; - for (NCollection_Sequence::Iterator aWireIter2 (theWires); aWireIter2.More(); ++aWireIter2Index, aWireIter2.Next()) - { - if (aWireIter1Index == aWireIter2Index) - { - continue; - } - - const TopoDS_Wire& aW2 = aWireIter2.Value(); - const TopAbs_State aClass = classifyWW (aW1, aW2, aF); - if (aClass == TopAbs_IN) - { - anIntWs->Append (aW2); - if (Standard_Integer* aNbOutsPtr = aMapNbOuts.ChangeSeek (aW2)) - { - ++(*aNbOutsPtr); - } - else - { - const Standard_Integer aNbOuts = 1; - aMapNbOuts.Bind (aW2, aNbOuts); - } - } - } - } - - // check out wires and remove "not out" wires from maps - for (TopTools_DataMapIteratorOfDataMapOfShapeInteger anOutIter (aMapNbOuts); anOutIter.More(); anOutIter.Next()) - { - const Standard_Integer aTmp = anOutIter.Value() % 2; - if (aTmp > 0) - { - // not out wire - aMapOutInts.UnBind (anOutIter.Key()); - } - } - - // create faces for out wires - TopTools_MapOfShape anUsedShapes; - TopoDS_Compound aFaceComp; - myBuilder.MakeCompound (aFaceComp); - for (; !aMapOutInts.IsEmpty(); ) - { - // find out wire with max number of outs - TopoDS_Shape aW; - Standard_Integer aMaxNbOuts = -1; - for (NCollection_DataMap, TopTools_ShapeMapHasher>::Iterator itMOI (aMapOutInts); - itMOI.More(); itMOI.Next()) - { - const TopoDS_Shape& aKey = itMOI.Key(); - const Standard_Integer aNbOuts = aMapNbOuts.Find (aKey); - if (aNbOuts > aMaxNbOuts) - { - aMaxNbOuts = aNbOuts; - aW = aKey; - } - } - - // create face for selected wire - TopoDS_Face aNewF; - myBuilder.MakeFace (aNewF, mySurface, myPrecision); - myBuilder.Add (aNewF, aW); - anUsedShapes.Add (aW); - const NCollection_Sequence& anIns = aMapOutInts.Find (aW); - for (NCollection_Sequence::Iterator aWireIter (anIns); aWireIter.More(); aWireIter.Next()) - { - TopoDS_Wire aWin = aWireIter.Value(); - if (anUsedShapes.Contains (aWin)) - { - continue; - } - - aWin.Reverse(); - myBuilder.Add (aNewF, aWin); - anUsedShapes.Add (aWin); - } - - myBuilder.Add (aFaceComp, aNewF); - aMapOutInts.UnBind (aW); - } - - if (aFaceComp.NbChildren() == 0) - { - return Standard_False; - } - - if (aFaceComp.NbChildren() == 1) - { - theRes = TopoDS_Iterator (aFaceComp).Value(); - } - else - { - theRes = aFaceComp; - } - return Standard_True; -} - - -// ======================================================================= -// function : renderGlyph -// purpose : -// ======================================================================= -Standard_Boolean Font_BRepFont::renderGlyph (const Standard_Utf32Char theChar, - TopoDS_Shape& theShape) -{ - theShape.Nullify(); - if (!loadGlyph (theChar) - || myActiveFTFace->glyph->format != FT_GLYPH_FORMAT_OUTLINE) - { - return Standard_False; - } - else if (myCache.Find (theChar, theShape)) - { - return !theShape.IsNull(); - } - - const FT_Outline& anOutline = myActiveFTFace->glyph->outline; - if (!anOutline.n_contours) - return Standard_False; - - TopLoc_Location aLoc; - NCollection_Sequence aWires; - TopoDS_Compound aFaceCompDraft; - - // Get orientation is useless since it doesn't retrieve any in-font information and just computes orientation. - // Because it fails in some cases - leave this to ShapeFix. - //const FT_Orientation anOrient = FT_Outline_Get_Orientation (&anOutline); - for (short aContour = 0, aStartIndex = 0; aContour < anOutline.n_contours; ++aContour) - { - const FT_Vector* aPntList = &anOutline.points[aStartIndex]; - const char* aTags = &anOutline.tags[aStartIndex]; - const short anEndIndex = anOutline.contours[aContour]; - const short aPntsNb = (anEndIndex - aStartIndex) + 1; - aStartIndex = anEndIndex + 1; - if (aPntsNb < 3 && !myFontParams.IsSingleStrokeFont) - { - // closed contour can not be constructed from < 3 points - continue; - } - - BRepBuilderAPI_MakeWire aWireMaker; - - gp_XY aPntPrev; - gp_XY aPntCurr = readFTVec (aPntList[aPntsNb - 1], myScaleUnits, myWidthScaling); - gp_XY aPntNext = readFTVec (aPntList[0], myScaleUnits, myWidthScaling); - - bool isLineSeg = !myFontParams.IsSingleStrokeFont - && FT_CURVE_TAG(aTags[aPntsNb - 1]) == FT_Curve_Tag_On; - gp_XY aPntLine1 = aPntCurr; - - // see http://freetype.sourceforge.net/freetype2/docs/glyphs/glyphs-6.html - // for a full description of FreeType tags. - for (short aPntId = 0; aPntId < aPntsNb; ++aPntId) - { - aPntPrev = aPntCurr; - aPntCurr = aPntNext; - aPntNext = readFTVec (aPntList[(aPntId + 1) % aPntsNb], myScaleUnits, myWidthScaling); - - // process tags - if (FT_CURVE_TAG(aTags[aPntId]) == FT_Curve_Tag_On) - { - if (!isLineSeg) - { - aPntLine1 = aPntCurr; - isLineSeg = true; - continue; - } - - const gp_XY aDirVec = aPntCurr - aPntLine1; - const Standard_Real aLen = aDirVec.Modulus(); - if (aLen <= myPrecision) - { - aPntLine1 = aPntCurr; - isLineSeg = true; - continue; - } - - if (myIsCompositeCurve) - { - Handle(Geom2d_TrimmedCurve) aLine = GCE2d_MakeSegment (gp_Pnt2d (aPntLine1), gp_Pnt2d (aPntCurr)); - myConcatMaker.Add (aLine, myPrecision); - } - else - { - Handle(Geom_Curve) aCurve3d; - Handle(Geom2d_Line) aCurve2d = new Geom2d_Line (gp_Pnt2d (aPntLine1), gp_Dir2d (aDirVec)); - if (to3d (aCurve2d, GeomAbs_C1, aCurve3d)) - { - TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d, 0.0, aLen); - myBuilder.UpdateEdge (anEdge, aCurve2d, mySurface, aLoc, myPrecision); - aWireMaker.Add (anEdge); - } - } - aPntLine1 = aPntCurr; - } - else if (FT_CURVE_TAG(aTags[aPntId]) == FT_Curve_Tag_Conic) - { - isLineSeg = false; - gp_XY aPntPrev2 = aPntPrev; - gp_XY aPntNext2 = aPntNext; - - // previous point is either the real previous point (an "on" point), - // or the midpoint between the current one and the previous "conic off" point - if (FT_CURVE_TAG(aTags[(aPntId - 1 + aPntsNb) % aPntsNb]) == FT_Curve_Tag_Conic) - { - aPntPrev2 = (aPntCurr + aPntPrev) * 0.5; - } - - // next point is either the real next point or the midpoint - if (FT_CURVE_TAG(aTags[(aPntId + 1) % aPntsNb]) == FT_Curve_Tag_Conic) - { - aPntNext2 = (aPntCurr + aPntNext) * 0.5; - } - - my3Poles.SetValue (1, aPntPrev2); - my3Poles.SetValue (2, aPntCurr); - my3Poles.SetValue (3, aPntNext2); - Handle(Geom2d_BezierCurve) aBezierArc = new Geom2d_BezierCurve (my3Poles); - if (myIsCompositeCurve) - { - myConcatMaker.Add (aBezierArc, myPrecision); - } - else - { - Handle(Geom_Curve) aCurve3d; - if (to3d (aBezierArc, GeomAbs_C1, aCurve3d)) - { - TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d); - myBuilder.UpdateEdge (anEdge, aBezierArc, mySurface, aLoc, myPrecision); - aWireMaker.Add (anEdge); - } - } - } - else if (FT_CURVE_TAG(aTags[aPntId]) == FT_Curve_Tag_Cubic - && FT_CURVE_TAG(aTags[(aPntId + 1) % aPntsNb]) == FT_Curve_Tag_Cubic) - { - isLineSeg = false; - my4Poles.SetValue (1, aPntPrev); - my4Poles.SetValue (2, aPntCurr); - my4Poles.SetValue (3, aPntNext); - my4Poles.SetValue (4, gp_Pnt2d(readFTVec (aPntList[(aPntId + 2) % aPntsNb], myScaleUnits, myWidthScaling))); - Handle(Geom2d_BezierCurve) aBezier = new Geom2d_BezierCurve (my4Poles); - if (myIsCompositeCurve) - { - myConcatMaker.Add (aBezier, myPrecision); - } - else - { - Handle(Geom_Curve) aCurve3d; - if (to3d (aBezier, GeomAbs_C1, aCurve3d)) - { - TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d); - myBuilder.UpdateEdge (anEdge, aBezier, mySurface, aLoc, myPrecision); - aWireMaker.Add (anEdge); - } - } - } - } - - if (myIsCompositeCurve) - { - Handle(Geom2d_BSplineCurve) aDraft2d = myConcatMaker.BSplineCurve(); - if (aDraft2d.IsNull()) - { - continue; - } - - const gp_Pnt2d aFirstPnt = aDraft2d->StartPoint(); - const gp_Pnt2d aLastPnt = aDraft2d->EndPoint(); - if (!myFontParams.IsSingleStrokeFont - && !aFirstPnt.IsEqual (aLastPnt, myPrecision)) - { - Handle(Geom2d_TrimmedCurve) aLine = GCE2d_MakeSegment (aLastPnt, aFirstPnt); - myConcatMaker.Add (aLine, myPrecision); - } - - Handle(Geom2d_BSplineCurve) aCurve2d = myConcatMaker.BSplineCurve(); - Handle(Geom_Curve) aCurve3d; - if (to3d (aCurve2d, GeomAbs_C0, aCurve3d)) - { - TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d); - myBuilder.UpdateEdge (anEdge, aCurve2d, mySurface, aLoc, myPrecision); - aWireMaker.Add (anEdge); - } - myConcatMaker.Clear(); - } - else - { - if (!aWireMaker.IsDone()) - { - continue; - } - - TopoDS_Vertex aFirstV, aLastV; - TopExp::Vertices (aWireMaker.Wire(), aFirstV, aLastV); - gp_Pnt aFirstPoint = BRep_Tool::Pnt (aFirstV); - gp_Pnt aLastPoint = BRep_Tool::Pnt (aLastV); - if (!myFontParams.IsSingleStrokeFont - && !aFirstPoint.IsEqual (aLastPoint, myPrecision)) - { - aWireMaker.Add (BRepLib_MakeEdge (aFirstV, aLastV)); - } - } - - if (!aWireMaker.IsDone()) - { - continue; - } - - TopoDS_Wire aWireDraft = aWireMaker.Wire(); - if (!myFontParams.IsSingleStrokeFont) - { - // collect all wires and set CCW orientation - TopoDS_Face aFace; - myBuilder.MakeFace (aFace, mySurface, myPrecision); - myBuilder.Add (aFace, aWireDraft); - BRepTopAdaptor_FClass2d aClass2d (aFace, ::Precision::PConfusion()); - TopAbs_State aState = aClass2d.PerformInfinitePoint(); - if (aState != TopAbs_OUT) - { - // need to reverse - aWireDraft.Reverse(); - } - aWires.Append (aWireDraft); - } - else - { - if (aFaceCompDraft.IsNull()) - { - myBuilder.MakeCompound (aFaceCompDraft); - } - myBuilder.Add (aFaceCompDraft, aWireDraft); - } - } - - if (!aWires.IsEmpty()) - { - buildFaces (aWires, theShape); - } - else if (!aFaceCompDraft.IsNull()) - { - theShape = aFaceCompDraft; - } - - myCache.Bind (theChar, theShape); - return !theShape.IsNull(); -} diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_BRepFont.hxx opencascade-7.5.1+dfsg1/src/Font/Font_BRepFont.hxx --- opencascade-7.4.1+dfsg1/src/Font/Font_BRepFont.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_BRepFont.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,226 +15,9 @@ #ifndef _Font_BRepFont_H__ #define _Font_BRepFont_H__ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include -DEFINE_STANDARD_HANDLE(Font_BRepFont, Font_FTFont) - -//! This tool provides basic services for rendering of vectorized text glyphs as BRep shapes. -//! Single instance initialize single font for sequential glyphs rendering with implicit caching of already rendered glyphs. -//! Thus position of each glyph in the text is specified by shape location. -//! -//! Please notice that this implementation uses mutex for thread-safety access, -//! thus may lead to performance penalties in case of concurrent access. -//! Although caching should eliminate this issue after rendering of sufficient number of glyphs. -class Font_BRepFont : protected Font_FTFont -{ - DEFINE_STANDARD_RTTIEXT(Font_BRepFont, Font_FTFont) -public: - - //! Empty constructor - Standard_EXPORT Font_BRepFont(); - - //! Constructor with initialization. - //! @param theFontPath FULL path to the font - //! @param theSize the face size in model units - Standard_EXPORT Font_BRepFont (const NCollection_String& theFontPath, - const Standard_Real theSize); - - //! Constructor with initialization. - //! @param theFontName the font name - //! @param theFontAspect the font style - //! @param theSize the face size in model units - //! @param theStrictLevel search strict level for using aliases and fallback - Standard_EXPORT Font_BRepFont (const NCollection_String& theFontName, - const Font_FontAspect theFontAspect, - const Standard_Real theSize, - const Font_StrictLevel theStrictLevel = Font_StrictLevel_Any); - - //! Release currently loaded font. - Standard_EXPORT virtual void Release() Standard_OVERRIDE; - - //! Initialize the font. - //! @param theFontPath FULL path to the font - //! @param theSize the face size in model units - //! @return true on success - Standard_EXPORT bool Init (const NCollection_String& theFontPath, - const Standard_Real theSize); - - //! Find (using Font_FontMgr) and initialize the font from the given name. - //! Please take into account that size is specified NOT in typography points (pt.). - //! If you need to specify size in points, value should be converted. - //! Formula for pt. -> m conversion: - //! aSizeMeters = 0.0254 * theSizePt / 72.0 - //! @param theFontName the font name - //! @param theFontAspect the font style - //! @param theSize the face size in model units - //! @param theStrictLevel search strict level for using aliases and fallback - //! @return true on success - Standard_EXPORT bool FindAndInit (const TCollection_AsciiString& theFontName, - const Font_FontAspect theFontAspect, - const Standard_Real theSize, - const Font_StrictLevel theStrictLevel = Font_StrictLevel_Any); - - //! Render single glyph as TopoDS_Shape. - //! @param theChar glyph identifier - //! @return rendered glyph within cache, might be NULL shape - Standard_EXPORT TopoDS_Shape RenderGlyph (const Standard_Utf32Char& theChar); - - //! Setup glyph geometry construction mode. - //! By default algorithm creates independent TopoDS_Edge - //! for each original curve in the glyph (line segment or Bezie curve). - //! Algorithm might optionally create composite BSpline curve for each contour - //! which reduces memory footprint but limits curve class to C0. - //! Notice that altering this flag clears currently accumulated cache! - Standard_EXPORT void SetCompositeCurveMode (const Standard_Boolean theToConcatenate); - - //! Setup glyph scaling along X-axis. - //! By default glyphs are not scaled (scaling factor = 1.0) - void SetWidthScaling (const float theScaleFactor) - { - myWidthScaling = theScaleFactor; - } - -public: - - //! @return vertical distance from the horizontal baseline to the highest character coordinate. - Standard_Real Ascender() const - { - return myScaleUnits * Standard_Real(Font_FTFont::Ascender()); - } - - //! @return vertical distance from the horizontal baseline to the lowest character coordinate. - Standard_Real Descender() const - { - return myScaleUnits * Standard_Real(Font_FTFont::Descender()); - } - - //! @return default line spacing (the baseline-to-baseline distance). - Standard_Real LineSpacing() const - { - return myScaleUnits * Standard_Real(Font_FTFont::LineSpacing()); - } - - //! Configured point size - Standard_Real PointSize() const - { - return myScaleUnits * Standard_Real(Font_FTFont::PointSize()); - } - - //! Compute advance to the next character with kerning applied when applicable. - //! Assuming text rendered horizontally. - Standard_Real AdvanceX (const Standard_Utf32Char theUCharNext) - { - return myScaleUnits * Standard_Real(Font_FTFont::AdvanceX (theUCharNext)); - } - - //! Compute advance to the next character with kerning applied when applicable. - //! Assuming text rendered horizontally. - Standard_Real AdvanceX (const Standard_Utf32Char theUChar, - const Standard_Utf32Char theUCharNext) - { - return myScaleUnits * Standard_Real(Font_FTFont::AdvanceX (theUChar, theUCharNext)); - } - - //! Compute advance to the next character with kerning applied when applicable. - //! Assuming text rendered vertically. - Standard_Real AdvanceY (const Standard_Utf32Char theUCharNext) - { - return myScaleUnits * Standard_Real(Font_FTFont::AdvanceY (theUCharNext)); - } - - //! Compute advance to the next character with kerning applied when applicable. - //! Assuming text rendered vertically. - Standard_Real AdvanceY (const Standard_Utf32Char theUChar, - const Standard_Utf32Char theUCharNext) - { - return myScaleUnits * Standard_Real(Font_FTFont::AdvanceY (theUChar, theUCharNext)); - } - - //! Returns scaling factor for current font size. - Standard_Real Scale() const - { - return myScaleUnits; - } - - //! Returns mutex. - Standard_Mutex& Mutex() - { - return myMutex; - } - -public: - - //! Find (using Font_FontMgr) and initialize the font from the given name. - //! Alias for FindAndInit() for backward compatibility. - bool Init (const NCollection_String& theFontName, - const Font_FontAspect theFontAspect, - const Standard_Real theSize) - { - return FindAndInit (theFontName.ToCString(), theFontAspect, theSize, Font_StrictLevel_Any); - } - -protected: - - //! Render single glyph as TopoDS_Shape. This method does not lock the mutex. - //! @param theChar glyph identifier - //! @param theShape rendered glyph within cache, might be NULL shape - //! @return true if glyph's geometry is available - Standard_EXPORT Standard_Boolean renderGlyph (const Standard_Utf32Char theChar, - TopoDS_Shape& theShape); - -private: - - //! Initialize class fields - void init(); - - //! Auxiliary method to create 3D curve - bool to3d (const Handle(Geom2d_Curve)& theCurve2d, - const GeomAbs_Shape theContinuity, - Handle(Geom_Curve)& theCurve3d); - - //! Auxiliary method for creation faces from sequence of wires. - //! Splits to few faces (if it is needed) and updates orientation of wires. - Standard_Boolean buildFaces (const NCollection_Sequence& theWires, - TopoDS_Shape& theRes); - - //! Hide visibility. - using Font_FTFont::FindAndCreate; - -protected: //! @name Protected fields - - NCollection_DataMap - myCache; //!< glyphs cache - Standard_Mutex myMutex; //!< lock for thread-safety - Handle(Geom_Surface) mySurface; //!< surface to place glyphs on to - Standard_Real myPrecision; //!< algorithm precision - Standard_Real myScaleUnits; //!< scale font rendering units into model units - Standard_Boolean myIsCompositeCurve; //!< flag to merge C1 curves of each contour into single C0 curve, OFF by default - -protected: //! @name Shared temporary variables for glyph construction - - Adaptor3d_CurveOnSurface myCurvOnSurf; - Handle(Geom2dAdaptor_HCurve) myCurve2dAdaptor; - Geom2dConvert_CompCurveToBSplineCurve myConcatMaker; - TColgp_Array1OfPnt2d my3Poles; - TColgp_Array1OfPnt2d my4Poles; - BRep_Builder myBuilder; - -}; +//! Alias for porting from old name. +typedef StdPrs_BRepFont Font_BRepFont; #endif // _Font_BRepFont_H__ diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_BRepTextBuilder.cxx opencascade-7.5.1+dfsg1/src/Font/Font_BRepTextBuilder.cxx --- opencascade-7.4.1+dfsg1/src/Font/Font_BRepTextBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_BRepTextBuilder.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ -// Created on: 2015-08-10 -// Created by: Ilya SEVRIKOV -// Copyright (c) 2013-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -// ======================================================================= -// Function : Perfrom -// Purpose : -// ======================================================================= -TopoDS_Shape Font_BRepTextBuilder::Perform (Font_BRepFont& theFont, - const Font_TextFormatter& theFormatter, - const gp_Ax3& thePenLoc) -{ - gp_Trsf aTrsf; - gp_XYZ aPen; - TopoDS_Shape aGlyphShape; - TopoDS_Compound aResult; - Standard_Mutex::Sentry aSentry (theFont.Mutex()); - - myBuilder.MakeCompound (aResult); - - Standard_Integer aSymbolCounter = 0; - Standard_Real aScaleUnits = theFont.Scale(); - for (NCollection_Utf8Iter anIter = theFormatter.String().Iterator(); *anIter != 0; ++anIter) - { - const Standard_Utf32Char aCharCurr = *anIter; - if (aCharCurr == '\x0D' // CR (carriage return) - || aCharCurr == '\a' // BEL (alarm) - || aCharCurr == '\f' // FF (form feed) NP (new page) - || aCharCurr == '\b' // BS (backspace) - || aCharCurr == '\v' // VT (vertical tab) - || aCharCurr == ' ' - || aCharCurr == '\t' - || aCharCurr == '\n') - { - continue; // skip unsupported carriage control codes - } - - const NCollection_Vec2& aCorner = theFormatter.TopLeft (aSymbolCounter); - aPen.SetCoord (aCorner.x() * aScaleUnits, aCorner.y() * aScaleUnits, 0.0); - aGlyphShape = theFont.RenderGlyph (aCharCurr); - if (!aGlyphShape.IsNull()) - { - aTrsf.SetTranslation (gp_Vec (aPen)); - aGlyphShape.Move (aTrsf); - myBuilder.Add (aResult, aGlyphShape); - } - - ++aSymbolCounter; - } - - aTrsf.SetTransformation (thePenLoc, gp_Ax3 (gp::XOY())); - aResult.Move (aTrsf); - - return aResult; -} - -// ======================================================================= -// Function : Perform -// Purpose : -// ======================================================================= -TopoDS_Shape Font_BRepTextBuilder::Perform (Font_BRepFont& theFont, - const NCollection_String& theString, - const gp_Ax3& thePenLoc, - const Graphic3d_HorizontalTextAlignment theHAlign, - const Graphic3d_VerticalTextAlignment theVAlign) -{ - Font_TextFormatter aFormatter; - - aFormatter.Reset(); - aFormatter.SetupAlignment (theHAlign, theVAlign); - - aFormatter.Append (theString, *(reinterpret_cast (&theFont))); - aFormatter.Format(); - - return Perform (theFont, aFormatter, thePenLoc); -} diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_BRepTextBuilder.hxx opencascade-7.5.1+dfsg1/src/Font/Font_BRepTextBuilder.hxx --- opencascade-7.4.1+dfsg1/src/Font/Font_BRepTextBuilder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_BRepTextBuilder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,6 +1,4 @@ -// Created on: 2015-08-10 -// Created by: Ilya SEVRIKOV -// Copyright (c) 2013-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -16,36 +14,9 @@ #ifndef Font_BRepTextBuilder_Header #define Font_BRepTextBuilder_Header -#include -#include -#include +#include -//! Represents class for applying text formatting. -class Font_BRepTextBuilder -{ -public: - //! Render text as BRep shape. - //! @param theString text in UTF-8 encoding - //! @param thePenLoc start position and orientation on the baseline - //! @param theFormatter formatter which defines alignment for the text - //! @return result shape with pen transformation applied as shape location - Standard_EXPORT TopoDS_Shape Perform (Font_BRepFont& theFont, - const Font_TextFormatter& theFormatter, - const gp_Ax3& thePenLoc = gp_Ax3()); - //! Render text as BRep shape. - //! @param theString text in UTF-8 encoding - //! @param thePenLoc start position and orientation on the baseline - //! @param theHAlign horizontal alignment of the text - //! @param theVAlign vertical alignment of the text - //! @return result shape with pen transformation applied as shape location - Standard_EXPORT TopoDS_Shape Perform (Font_BRepFont& theFont, - const NCollection_String& theString, - const gp_Ax3& thePenLoc = gp_Ax3(), - const Graphic3d_HorizontalTextAlignment theHAlign = Graphic3d_HTA_LEFT, - const Graphic3d_VerticalTextAlignment theVAlign = Graphic3d_VTA_BOTTOM); - -protected: - BRep_Builder myBuilder; -}; +//! Alias for porting from old name. +typedef StdPrs_BRepTextBuilder Font_BRepTextBuilder; #endif // Font_BRepTextBuilder_Header diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_DejavuSans_Latin_woff.pxx opencascade-7.5.1+dfsg1/src/Font/Font_DejavuSans_Latin_woff.pxx --- opencascade-7.4.1+dfsg1/src/Font/Font_DejavuSans_Latin_woff.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_DejavuSans_Latin_woff.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1649 @@ +//! DejaVuSans.ttf (extracted Basic Latin sub-set into .woff) +//! DejaVu changes are in public domain. +//! +//! Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. +//! +//! Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), +//! to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, +//! and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: +//! +//! The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. +//! +//! The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, +//! only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". +//! +//! This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. +//! +//! The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. +//! +//! THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, +//! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. +//! IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, +//! OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. +//! +//! Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, +//! use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. +const long int Font_DejavuSans_Latin_woff_size = 25936; +const unsigned char Font_DejavuSans_Latin_woff[25936] = { +0x77,0x4F,0x46,0x46,0x00,0x01,0x00,0x00,0x00,0x00,0x65,0x50,0x00,0x14,0x00,0x00, +0x00,0x00,0xED,0xCC,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x46,0x54,0x4D, +0x00,0x00,0x01,0xBC,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x1C,0x86,0xBD,0x27,0x4B, +0x47,0x44,0x45,0x46,0x00,0x00,0x01,0xD8,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x2C, +0x01,0x1E,0x01,0xF3,0x47,0x50,0x4F,0x53,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0xFF, +0x00,0x00,0x26,0xE2,0xB8,0xC4,0x18,0x8A,0x47,0x53,0x55,0x42,0x00,0x00,0x09,0x00, +0x00,0x00,0x01,0xD5,0x00,0x00,0x04,0x78,0x24,0xFC,0x0E,0x67,0x4D,0x41,0x54,0x48, +0x00,0x00,0x0A,0xD8,0x00,0x00,0x01,0x0D,0x00,0x00,0x02,0xB2,0x7A,0xE9,0xD2,0x5C, +0x4F,0x53,0x2F,0x32,0x00,0x00,0x0B,0xE8,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x56, +0x59,0x7D,0x73,0xA1,0x63,0x6D,0x61,0x70,0x00,0x00,0x0C,0x40,0x00,0x00,0x01,0x86, +0x00,0x00,0x01,0xDA,0xCF,0x40,0x58,0xA0,0x63,0x76,0x74,0x20,0x00,0x00,0x0D,0xC8, +0x00,0x00,0x00,0x3A,0x00,0x00,0x00,0x3A,0x12,0xE8,0x0C,0x67,0x66,0x70,0x67,0x6D, +0x00,0x00,0x0E,0x04,0x00,0x00,0x01,0xB1,0x00,0x00,0x02,0x65,0x53,0xB4,0x2F,0xA7, +0x67,0x61,0x73,0x70,0x00,0x00,0x0F,0xB8,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08, +0x00,0x00,0x00,0x10,0x67,0x6C,0x79,0x66,0x00,0x00,0x0F,0xC0,0x00,0x00,0x46,0x1D, +0x00,0x00,0x86,0x4C,0xB3,0x5D,0x18,0x2D,0x68,0x65,0x61,0x64,0x00,0x00,0x55,0xE0, +0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x36,0x14,0x67,0x48,0x93,0x68,0x68,0x65,0x61, +0x00,0x00,0x56,0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x24,0x11,0x81,0x05,0x67, +0x68,0x6D,0x74,0x78,0x00,0x00,0x56,0x38,0x00,0x00,0x02,0x1B,0x00,0x00,0x03,0xA6, +0x45,0xB9,0x73,0xAA,0x6C,0x6F,0x63,0x61,0x00,0x00,0x58,0x54,0x00,0x00,0x01,0xCD, +0x00,0x00,0x01,0xD6,0x19,0x75,0xF9,0x66,0x6D,0x61,0x78,0x70,0x00,0x00,0x5A,0x24, +0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x02,0x07,0x01,0xA5,0x6E,0x61,0x6D,0x65, +0x00,0x00,0x5A,0x44,0x00,0x00,0x08,0x6E,0x00,0x00,0x29,0x28,0x82,0x94,0xC7,0x82, +0x70,0x6F,0x73,0x74,0x00,0x00,0x62,0xB4,0x00,0x00,0x01,0xED,0x00,0x00,0x02,0xDD, +0x7B,0xDA,0x8C,0xE2,0x70,0x72,0x65,0x70,0x00,0x00,0x64,0xA4,0x00,0x00,0x00,0xA1, +0x00,0x00,0x00,0xEE,0xF7,0x79,0x03,0xE4,0x77,0x65,0x62,0x66,0x00,0x00,0x65,0x48, +0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0xC5,0xC5,0x5D,0xA8,0x00,0x00,0x00,0x01, +0x00,0x00,0x00,0x00,0xD9,0x2C,0x87,0xF6,0x00,0x00,0x00,0x00,0xD3,0xC2,0x29,0x10, +0x00,0x00,0x00,0x00,0xD9,0xCE,0x76,0x44,0x78,0xDA,0x63,0x60,0x64,0x60,0x60,0xE0, +0x01,0x62,0x19,0x06,0x15,0x06,0x26,0x20,0x64,0x64,0x78,0x0A,0xC4,0xCF,0x18,0x5E, +0x02,0xD9,0x2C,0x40,0x71,0x26,0x20,0x66,0x84,0x60,0x00,0x46,0x51,0x03,0x12,0x00, +0x78,0xDA,0xDD,0x5A,0x4F,0x6C,0x14,0x55,0x18,0xFF,0x66,0x5B,0xB0,0x80,0x2D,0x0B, +0xB4,0x15,0xF9,0x63,0x5B,0x28,0x5B,0xA0,0xD0,0x1A,0x58,0x90,0x22,0xC6,0x68,0x36, +0x5A,0xB2,0xB4,0x68,0x2B,0x26,0x88,0x97,0x81,0xD4,0x96,0x2C,0x5D,0xCC,0x5A,0x0E, +0x1A,0x7B,0x41,0x20,0xEB,0x6D,0x43,0x50,0x0C,0xA0,0x40,0xDC,0x93,0xD2,0x44,0x11, +0x1D,0x0F,0x46,0xB2,0x86,0x83,0x3D,0x78,0x5A,0x0F,0xC6,0x4C,0x8C,0xA7,0x7A,0xF1, +0xC0,0xC1,0x43,0x2F,0xCE,0xF3,0xF7,0xDE,0xBC,0xF9,0xD7,0xDD,0x6E,0x67,0x77,0xA7, +0x75,0x75,0x7E,0x99,0x37,0x6F,0xE7,0xFD,0x99,0xDF,0xFB,0xDE,0xF7,0xBE,0xEF,0x9B, +0x37,0x4B,0x0A,0x11,0xAD,0x54,0x7E,0x50,0x7E,0xA3,0xE6,0xD8,0x0B,0x47,0x5E,0xA1, +0x77,0xD4,0x94,0x7A,0x92,0x2E,0xA9,0xA9,0xF1,0x24,0x65,0x4F,0xA6,0xD4,0xD3,0xF4, +0xC5,0x29,0x35,0xF9,0x16,0x7D,0x77,0x6A,0x6C,0x24,0x45,0x3F,0x9E,0x7A,0x3B,0x75, +0x86,0x7E,0x1E,0x1D,0x39,0x9B,0xA2,0x3F,0x47,0x53,0x23,0x09,0x9A,0x1D,0x53,0x93, +0xA7,0x95,0xFA,0xB1,0x91,0x93,0x29,0x25,0x9C,0x50,0x93,0xAA,0xB2,0xE9,0x8C,0x7A, +0xB6,0x5D,0xD9,0x7E,0x46,0x9D,0x48,0x2A,0xD1,0x71,0x75,0x62,0x4C,0x79,0x33,0x99, +0xC0,0x9D,0x77,0xCF,0x8E,0xAA,0xE3,0x4A,0x3A,0x75,0x2E,0x99,0x52,0xAE,0x4C,0xBC, +0x91,0x1C,0x55,0x6E,0x4D,0x8C,0xA9,0xA7,0x95,0x3B,0x54,0x0F,0x0E,0xC4,0x18,0x71, +0x2E,0xAD,0x54,0x17,0x3F,0x36,0xD4,0x4E,0xAD,0xC3,0x83,0x31,0xA4,0xC7,0x86,0x78, +0x6A,0x97,0xBA,0x6B,0xFA,0xC9,0x87,0x29,0x34,0x10,0x47,0x0F,0xE1,0xE1,0xA1,0xE7, +0x91,0x56,0xDC,0xCF,0x7C,0xF9,0x28,0x35,0x1C,0x1E,0x1E,0x68,0xA7,0x68,0x5C,0xA4, +0x47,0x44,0x3A,0x70,0xF4,0x08,0xD2,0x41,0x91,0x1F,0x3A,0xCA,0xD3,0xE1,0xF8,0x30, +0x4F,0xC5,0x1D,0xD9,0x56,0x09,0x8C,0x43,0x28,0x31,0x92,0x4A,0x52,0x93,0x48,0x9B, +0xF1,0x5B,0x31,0xEF,0x8A,0x5C,0x88,0x96,0x53,0x93,0xCC,0x87,0xCD,0x6B,0xE7,0xF7, +0x14,0xEA,0xEC,0xE4,0x3D,0x74,0x3C,0xB9,0xE5,0x02,0xED,0xA3,0x97,0xE8,0x3F,0x72, +0xB0,0x3C,0xD3,0x64,0x36,0x4E,0x29,0xEA,0x43,0x4A,0x2C,0x86,0x33,0xCD,0xA6,0xD8, +0x35,0xD6,0x58,0xB4,0x51,0xC4,0x6E,0x3D,0x2D,0x52,0xBD,0xB0,0x9C,0xE5,0x0B,0x5A, +0xC5,0xCB,0x66,0xA6,0xA3,0xE7,0x3E,0xAB,0x7F,0x9E,0x8A,0x3B,0xC4,0x54,0x9C,0x93, +0x2C,0x63,0xE6,0xCC,0xBB,0x80,0x66,0xB7,0x74,0xEA,0x63,0x14,0x48,0xCF,0x99,0x65, +0x66,0x0F,0xB2,0xBC,0xCF,0x6E,0x67,0xC3,0xEE,0xCB,0xEC,0x35,0x03,0x09,0xA8,0x68, +0x2B,0xEF,0x88,0xFC,0x14,0xCB,0x18,0xB3,0xAC,0x8E,0x7A,0x3D,0x4C,0xF5,0x82,0xDE, +0x89,0xE5,0xF8,0x33,0x39,0x47,0x5F,0x63,0xCD,0x39,0x2D,0x0B,0x7B,0xB6,0xF2,0xCE, +0x73,0xC4,0x55,0xF6,0xEF,0x6D,0xC5,0x34,0xF0,0xCE,0xF0,0x51,0xFB,0x7A,0xAE,0xEE, +0xB7,0x9E,0xDF,0x9A,0xA5,0xF8,0x17,0xEA,0xCF,0xFC,0x0C,0xE4,0x58,0x33,0x95,0xF2, +0xF3,0xC7,0xD7,0xDD,0xBF,0x95,0x87,0xDE,0x4D,0xF3,0x15,0x40,0x64,0x68,0x98,0xF3, +0xD8,0x42,0xCF,0x32,0x6B,0x98,0xAD,0x59,0x42,0xCE,0x41,0xC2,0xD3,0x63,0xCC,0xA9, +0x2B,0x66,0x8C,0xCF,0x51,0xCC,0xDB,0xB3,0xD5,0x5E,0xCC,0x2A,0xD7,0x38,0x57,0x5B, +0xD4,0x17,0xDA,0x2D,0x9F,0x84,0x95,0x65,0xA4,0x4B,0x8E,0xCA,0x59,0x09,0xD7,0x16, +0x77,0x7E,0xE7,0x59,0xB7,0xF9,0x79,0xEC,0x42,0x6D,0x58,0x3C,0x4D,0xAE,0x4D,0x2D, +0x38,0x8E,0x81,0xCA,0x8F,0xF3,0xE3,0x5A,0xB2,0xC3,0xB6,0x2A,0x99,0x39,0x5A,0xA2, +0x72,0xF9,0x5A,0x63,0x90,0x2B,0xC5,0x35,0xD3,0x56,0xDE,0xBE,0x26,0xD8,0xA4,0xB4, +0x68,0x3A,0xBF,0x07,0xBB,0x7E,0xAD,0x0A,0x7E,0x39,0x96,0x73,0x49,0xAE,0xB7,0x50, +0xF3,0x8C,0x19,0x3C,0xA1,0x8D,0x6B,0xAB,0xF1,0xB0,0x94,0x25,0xB0,0xAF,0x31,0x6F, +0x59,0x75,0xD2,0x34,0xD4,0xBF,0x67,0x44,0xA6,0x0F,0xD6,0x5A,0x2F,0x65,0x5F,0x4C, +0x1F,0x12,0xA4,0x9D,0xF4,0xED,0xD7,0xF8,0xAA,0xCE,0x1B,0x39,0xCE,0xA1,0x74,0x5D, +0x9C,0x59,0x47,0xB2,0xE2,0xB7,0x2E,0xEC,0x81,0xC7,0x5F,0xD8,0x92,0xCC,0x9A,0x5A, +0x51,0x15,0xDF,0x08,0x45,0x0C,0xCD,0xF4,0x90,0x35,0x1A,0xB1,0xE8,0x5C,0x6A,0x98, +0x5D,0xBE,0x52,0xA6,0x0A,0xAD,0x1C,0xB7,0xBE,0xA6,0x0F,0x14,0xF5,0xF2,0xA6,0x64, +0x5C,0xE5,0xD9,0x39,0x57,0xEE,0x31,0x75,0xB1,0x2E,0xF2,0xFC,0x1E,0xA4,0x98,0xAD, +0x82,0x1F,0x56,0x5B,0x71,0x5F,0x57,0x63,0x72,0x8C,0xB1,0x46,0xAC,0x52,0x1E,0xD9, +0xA4,0x4B,0x69,0xBB,0x31,0x65,0x40,0x1A,0x86,0xA9,0x85,0x62,0xE5,0x1B,0x59,0x23, +0x6F,0x40,0xBA,0xC6,0x34,0x2F,0xC5,0x99,0x93,0x7E,0x2D,0xCD,0xD6,0x18,0xBF,0xE3, +0xF7,0x5F,0xC6,0x1F,0x66,0xBD,0x4A,0x67,0xD8,0x98,0xAD,0x24,0xC2,0x58,0x62,0xF9, +0xA5,0x11,0x09,0x1E,0xF7,0xAE,0xDF,0x62,0x6C,0x64,0x34,0xA9,0x5A,0xEB,0xD7,0xCA, +0xF3,0xB8,0xD4,0x8A,0xA2,0xD9,0xA0,0x6D,0xD9,0x65,0xA4,0x59,0x1D,0x37,0x63,0x46, +0xAC,0x8F,0x16,0xCC,0xC8,0x82,0x16,0x4E,0xFA,0x86,0xB4,0x8B,0x5F,0xDA,0x6D,0x73, +0x84,0xC5,0xC9,0x48,0x2F,0x33,0xC9,0xEB,0xA1,0x5C,0xAB,0xC6,0x57,0x82,0xDF,0xAC, +0x7B,0xD5,0x9A,0xD1,0x92,0x8B,0x4B,0x31,0x29,0x66,0x17,0x8E,0xE3,0xC4,0xBA,0xCF, +0x56,0x3D,0xAF,0x2A,0x24,0xC7,0xED,0x6C,0xA3,0xA1,0x1A,0x0F,0xC5,0x7C,0x64,0x8A, +0xC5,0x8B,0x6E,0x59,0x5B,0x9E,0x4E,0xFA,0x3F,0xE9,0xF5,0x58,0x8B,0xDD,0xAE,0xCD, +0xB4,0x49,0xC6,0x0C,0x2F,0x43,0xAF,0x2D,0x55,0xF0,0xC3,0x5C,0x08,0xF9,0xE9,0x35, +0x6A,0x57,0xF4,0x20,0xA3,0xA1,0xC5,0x1B,0x27,0xE4,0x98,0xA8,0x56,0x8F,0xED,0x78, +0x45,0x0B,0x90,0xE5,0x73,0x6E,0xCD,0xF1,0xCD,0x43,0x2B,0x8C,0xFF,0x4D,0x6B,0xED, +0x79,0x1F,0xD0,0x65,0x7C,0x90,0xA3,0xFF,0xED,0x81,0x59,0xCD,0x08,0x2B,0x10,0x09, +0x28,0xB6,0xCF,0x05,0xCE,0x4F,0x13,0x71,0xC9,0x24,0xBC,0xA6,0xBF,0xB7,0x54,0x1E, +0xF1,0xE4,0x1D,0x8D,0xE3,0xBF,0x5D,0xA5,0xD3,0x9E,0x19,0xCE,0x3B,0x7B,0x2F,0xF6, +0x1E,0x4C,0x7F,0x99,0x14,0x5F,0xE5,0x9E,0x1D,0x5E,0x49,0xF5,0x1B,0x1F,0x2F,0xE5, +0xFB,0x11,0xEF,0x4D,0x5A,0xDB,0x58,0x6D,0xF2,0xB3,0xDE,0xDD,0xCA,0x59,0xC1,0x6E, +0x2D,0x2B,0xA5,0x71,0xBC,0xCC,0x5E,0xD7,0x7A,0x95,0x52,0xD4,0x1D,0xCF,0x5B,0x5B, +0xF2,0x33,0xF2,0x85,0xFE,0xC4,0x79,0x86,0x88,0x35,0xCD,0x88,0x3D,0xE1,0x87,0x97, +0x6C,0x77,0xB5,0x34,0xC7,0x0A,0x77,0xB8,0x34,0xEB,0x6D,0xCC,0xB5,0x43,0xC7,0xDF, +0xEE,0x06,0xC5,0x5B,0x45,0x5B,0x19,0xFC,0x02,0xF6,0x74,0x4B,0xB3,0x7F,0xEA,0x4D, +0x8B,0xED,0x9F,0xCE,0x1D,0x9B,0xB5,0x7F,0x5A,0x9B,0xFC,0x9C,0xFD,0xDD,0xDA,0xE2, +0xE7,0x44,0x2D,0x85,0xFB,0xCF,0x35,0xE6,0x7F,0xA7,0xF0,0xFE,0x1C,0xF0,0xBE,0x4A, +0xC0,0xF6,0x25,0xE2,0x78,0xE2,0x5A,0x8C,0x9F,0xE5,0x8E,0x58,0x8D,0xEE,0x1C,0x94, +0xF3,0x7D,0xE1,0x5F,0xE1,0x07,0xED,0x13,0x51,0x6E,0xE0,0xEB,0xD7,0xBD,0x86,0xCD, +0xDD,0x31,0xAB,0x4F,0x97,0x6F,0xF2,0x63,0x5F,0x42,0xC1,0xDA,0x17,0x6F,0x84,0xBF, +0x10,0x3F,0xBB,0x57,0xC1,0xAF,0x60,0x07,0xD1,0xE6,0x57,0x7A,0x85,0x56,0xFB,0x7D, +0xA6,0x2A,0xBF,0x36,0x5D,0xF8,0x55,0xC6,0x77,0xEB,0x67,0x97,0x4C,0x0F,0x97,0x2C, +0xBE,0x2F,0x5B,0xB6,0x66,0x7C,0xBF,0x08,0xFB,0x7F,0x56,0x5D,0x63,0x3A,0xA8,0xFD, +0xBF,0xC5,0xFA,0x3E,0x5D,0xE4,0x88,0x57,0xC2,0x15,0xAB,0x25,0x27,0xF6,0xA1,0xCD, +0x54,0xF3,0xBC,0x87,0xA7,0x3D,0x7B,0xF4,0x9A,0x6B,0xDF,0x21,0xE3,0x44,0x8F,0xF6, +0xAE,0xD1,0xA4,0x8C,0x12,0xB4,0xE2,0x51,0x6D,0x85,0xBE,0x2A,0x22,0xBE,0x36,0x6A, +0xE2,0x49,0xBD,0xDC,0x76,0x9B,0x3B,0x56,0x46,0x9A,0xD5,0x31,0xCD,0xFD,0x1D,0xD1, +0xF9,0xAE,0xEC,0x8C,0x82,0xB5,0xB0,0x43,0xF6,0x2A,0x8F,0xC8,0x5D,0x36,0xAD,0x38, +0x93,0x32,0xF9,0x85,0xE8,0x00,0x85,0x01,0x85,0x3A,0x81,0x10,0x6D,0x03,0xEA,0xF8, +0xB7,0x07,0xAA,0xA7,0x2E,0x60,0x19,0xED,0x00,0x96,0xD3,0x4E,0xE0,0x11,0xEA,0x06, +0x1A,0x68,0x37,0xB0,0x82,0x7A,0x80,0x95,0xB0,0x50,0xBD,0xB4,0x8A,0xF6,0x00,0x8F, +0xD2,0x5E,0xA0,0x91,0xA2,0x40,0x13,0xED,0x03,0x56,0xD3,0x7E,0x20,0x4C,0x4F,0x01, +0x6B,0xF0,0x9C,0x03,0xB4,0x16,0x9A,0xD3,0x47,0xEB,0xE8,0x20,0xD0,0x4C,0x4F,0x03, +0x2D,0x74,0x08,0x68,0xA5,0x67,0x80,0xC7,0xF0,0x86,0xDC,0x4F,0xEB,0xE9,0x30,0xF0, +0x38,0x0D,0x02,0x1B,0xE8,0x65,0x60,0x23,0x0D,0x01,0x9B,0xE8,0x18,0xB0,0x99,0x8E, +0x03,0x4F,0xD0,0x6B,0x40,0x1B,0x9D,0x00,0xDA,0xE9,0x75,0xA0,0x83,0xC6,0x81,0x2D, +0x34,0x09,0x6C,0xA5,0xF3,0x40,0x27,0xBD,0x47,0x17,0x30,0x9A,0x8B,0x40,0x84,0x2E, +0x01,0xDB,0x28,0x0D,0x74,0xD1,0xFB,0xC0,0x76,0xBA,0x0C,0x2C,0xA3,0x2B,0xF4,0x11, +0x98,0x5F,0xA7,0x4F,0xC0,0xED,0x26,0xD0,0x4A,0xB7,0x80,0x1D,0x74,0x1B,0xD8,0x49, +0x9F,0xD1,0x14,0xF8,0xDC,0x05,0xBA,0xE9,0x2B,0x60,0x23,0xDD,0xA3,0x6F,0xC1,0xE4, +0x3E,0xD0,0x41,0x39,0xA0,0x83,0x1E,0x00,0xAD,0xF4,0x2B,0xB0,0x97,0x74,0x20,0x2A, +0xFE,0x8F,0xF2,0x93,0xF8,0x87,0x4A,0xF1,0xA3,0xCE,0xF3,0xAB,0x1E,0x2C,0x96,0x43, +0xB6,0x04,0xC9,0xAE,0xC0,0x49,0x90,0x6A,0x83,0xB8,0x12,0x24,0xDB,0x00,0x76,0x0D, +0x90,0x6A,0x13,0xA4,0x19,0x86,0x14,0xD7,0x42,0x7A,0xCD,0x9E,0xF6,0x7C,0x8F,0xAA, +0x15,0xB2,0x5B,0x0F,0x99,0x6D,0x00,0x36,0x8A,0xBB,0x9B,0x90,0xDB,0x0C,0x39,0x11, +0x4A,0xDA,0x20,0xA3,0x0E,0xC8,0x66,0x2B,0x64,0xB2,0xCD,0x47,0x3C,0xD3,0xB5,0x40, +0xF9,0x76,0x17,0x77,0x0B,0x04,0x99,0xED,0x2C,0x5A,0x7B,0x95,0x0D,0x7E,0xAC,0x96, +0x58,0x27,0xC6,0xD8,0x0D,0xF6,0xDD,0x12,0x7C,0x14,0xBB,0x30,0x8A,0x5D,0x80,0x75, +0xEC,0xC6,0x18,0x7A,0x30,0x8A,0x1E,0x01,0x7E,0xF4,0x62,0x1C,0x5C,0xE7,0x22,0xB6, +0xFD,0x58,0x57,0x86,0xB6,0x0F,0x40,0xA7,0x8E,0x62,0x66,0x5E,0x84,0x2C,0x4D,0x59, +0x74,0x09,0xDE,0xDD,0x78,0x52,0x0F,0x7A,0xDD,0x83,0x39,0x8C,0x42,0x73,0xF7,0x43, +0x63,0x0F,0x40,0x53,0x0F,0x42,0x43,0x0F,0x41,0x33,0xFB,0xA1,0x91,0x83,0xD0,0xC4, +0x21,0x68,0xE0,0x71,0x68,0xDE,0x09,0x68,0xDC,0x38,0x34,0xED,0xBC,0xD0,0xB1,0x8B, +0xD0,0xAD,0x34,0x74,0xEA,0x32,0xB4,0xE9,0x03,0xFA,0x90,0xAE,0x42,0xA7,0xAE,0xD3, +0x0D,0xFA,0x18,0x5A,0x75,0x13,0xDA,0x74,0x1B,0x7A,0xF4,0x39,0xDD,0x81,0x2E,0xDD, +0x85,0x0E,0xDD,0xA3,0xAF,0xE9,0x1B,0xD2,0xA0,0x47,0xF7,0xA1,0x3F,0x0F,0xA0,0x37, +0x3A,0x34,0x25,0x2A,0x64,0xD8,0x89,0xB1,0x2F,0xB3,0xF4,0x86,0xFD,0x82,0xF3,0x4B, +0x9C,0x9F,0xE2,0xBC,0x21,0xFE,0xF9,0x34,0xE7,0xFC,0x07,0x42,0x23,0xC6,0x4E,0x00, +0x78,0xDA,0xDD,0x52,0x31,0x6B,0x14,0x51,0x10,0xFE,0xE6,0xBD,0x4B,0x38,0x8F,0x20, +0x87,0x84,0x2B,0x24,0xC8,0x16,0x21,0xA4,0x10,0xB1,0xB8,0x4A,0xD4,0x42,0xCE,0xC8, +0xB9,0x7B,0xB7,0x64,0x37,0xC1,0x4E,0x78,0xB7,0x9E,0xBB,0xC7,0xDD,0xED,0xC9,0xF3, +0x2C,0x4C,0x91,0xC2,0xC2,0xC2,0x5A,0x24,0xD8,0x29,0xD6,0x22,0xD6,0x56,0x21,0x45, +0x0A,0x4B,0x7F,0x43,0xA2,0xE0,0x0F,0xB0,0x8B,0xF3,0x66,0xF7,0xA2,0x20,0x27,0x6A, +0xE9,0x7E,0xEC,0x37,0xB3,0x33,0xF3,0xBE,0x79,0x6F,0xDE,0x82,0x00,0xD4,0xE8,0x40, +0x2D,0x62,0xB9,0xB5,0x11,0x6C,0x61,0xC7,0x58,0xD3,0xC3,0x53,0x63,0xC7,0x39,0xDE, +0xF4,0xAC,0x19,0xE0,0x5D,0x62,0xF2,0x87,0xF8,0x90,0x64,0x7D,0x8B,0xC3,0xE4,0xB1, +0x1D,0xE1,0x53,0xDA,0x9F,0x58,0x7C,0x4D,0x6D,0x7F,0x88,0x6F,0x99,0xC9,0x07,0x54, +0xC9,0xFA,0x3D,0x4B,0xF5,0xA1,0xC9,0x0D,0xAD,0x8C,0xCC,0xC4,0xA3,0xF5,0x91,0x99, +0xE6,0xD4,0x1C,0x9B,0x69,0x46,0x36,0x1F,0x72,0x64,0x77,0x92,0x9A,0x31,0x3D,0xB3, +0x8F,0x72,0x4B,0x2F,0xA6,0xF7,0xF3,0x94,0x5E,0x4F,0x33,0x33,0xA0,0xB7,0xA8,0xA0, +0x78,0x88,0xD1,0x80,0xF6,0xB7,0x23,0x0F,0x8D,0xB8,0xDB,0x62,0xDE,0x8E,0x1C,0x03, +0x27,0x27,0x9C,0x53,0x45,0xA5,0xF8,0xF4,0x47,0x7E,0x1D,0xAA,0xE3,0xB3,0x42,0x3D, +0x8E,0x6E,0x30,0x97,0x71,0x3D,0xA7,0x7E,0x5E,0x7C,0x7E,0xDF,0x26,0xAA,0xED,0xB8, +0xE3,0xA1,0xE9,0x0B,0x07,0xC2,0x9D,0x30,0x60,0xEE,0x8A,0x1F,0x85,0x8E,0x63,0x3F, +0x76,0x2C,0x11,0x59,0xAB,0xA4,0xD7,0x2F,0xAA,0x32,0x83,0xBF,0x3F,0xE5,0x82,0x17, +0x6D,0xB6,0xE0,0x25,0xC9,0xF8,0x01,0xD6,0x84,0x2F,0x0A,0x37,0x47,0x83,0xD4,0xE0, +0xAA,0xA8,0x16,0xDA,0x9A,0x59,0x9D,0x5A,0x25,0xD6,0x69,0x2D,0x60,0x09,0xCB,0x58, +0xC1,0x2A,0xAE,0x63,0x11,0x67,0x38,0x76,0x85,0xAD,0xD3,0x0E,0xD8,0xBA,0x9A,0xBB, +0x62,0x6B,0xD4,0xA0,0xCB,0x74,0x9B,0xEE,0xD1,0x2E,0xED,0xD1,0x7B,0xFA,0x48,0x47, +0x0A,0xB2,0x17,0x52,0x4E,0xF1,0x2C,0xCE,0x09,0xA8,0xEC,0x39,0x7B,0x7F,0x97,0x71, +0x7D,0x1D,0x9C,0x4A,0x86,0xE7,0xE5,0x0C,0x02,0x74,0x98,0x97,0x78,0x47,0xD7,0x78, +0x97,0x37,0x19,0x1A,0xB7,0x18,0x1A,0x6D,0x86,0x86,0xCF,0xD0,0x52,0x45,0xE8,0x22, +0x64,0xFF,0x0E,0x43,0xE3,0x09,0xF6,0x98,0x5F,0xE2,0x15,0xF3,0x3E,0x43,0xE3,0x80, +0xA1,0x19,0x55,0xEE,0x7E,0xA1,0xFC,0xCB,0xD4,0x4F,0xB3,0x56,0xA7,0xB3,0xA9,0x94, +0x5F,0xB3,0x5A,0x17,0x2B,0x26,0xE7,0xEA,0x66,0x7E,0x51,0xF7,0x23,0xF3,0x2F,0x67, +0xFE,0xBF,0x32,0x84,0x4B,0xFC,0x56,0x79,0x2A,0x35,0xCE,0x9E,0x87,0x87,0x2F,0x72, +0x4F,0x21,0x3E,0x8B,0x0D,0x70,0xCC,0xAB,0x43,0x1C,0xC9,0xBD,0xBA,0xF9,0xB7,0xBF, +0x03,0x8B,0xDC,0x85,0x2D,0x00,0x00,0x00,0x78,0xDA,0xAD,0x91,0xB1,0x4A,0x03,0x41, +0x14,0x45,0xCF,0xCC,0x66,0xD9,0xAC,0x06,0x3F,0x41,0x82,0x45,0x58,0x2C,0x2C,0x2C, +0x44,0x24,0x88,0x6C,0x65,0x29,0x42,0x2C,0x52,0x98,0x54,0x62,0xBB,0x01,0x2D,0x2D, +0xB4,0x11,0x41,0xEC,0xC4,0x4F,0xB0,0xF2,0x1B,0xFC,0x09,0x3B,0x05,0x4B,0x6B,0x5B, +0x1B,0xEF,0xDB,0x9D,0xAC,0x1B,0x53,0xA4,0xD0,0xB7,0xBC,0x99,0x33,0xEF,0xDD,0xB9, +0xEC,0xCC,0xE0,0x80,0x25,0xDE,0xF9,0xE0,0x80,0x7E,0x87,0xE4,0x4D,0x6B,0xFC,0x25, +0xB4,0xC6,0x10,0xBF,0x50,0x86,0x71,0x33,0xA6,0x6B,0x77,0x1A,0x78,0xC0,0xC2,0x70, +0x2B,0xF2,0x3D,0x5F,0xAC,0x63,0x58,0x69,0x6D,0xAE,0xB9,0xE1,0x31,0x53,0x1F,0x36, +0xD6,0x93,0x1F,0xF6,0xDB,0xF0,0x75,0x27,0xEE,0xD7,0x5B,0x33,0xF7,0xE4,0x9E,0x49, +0x88,0x58,0x65,0x8D,0x1E,0xEB,0x6C,0xB0,0xC9,0x16,0x3B,0xEC,0x92,0x93,0x49,0xB1, +0xAF,0xD4,0x79,0xB8,0x56,0x3E,0x2A,0x5F,0x95,0x9F,0xF2,0xED,0x29,0xE5,0xE3,0x0E, +0x83,0x53,0x54,0xF9,0xA5,0x67,0xD5,0x2C,0xBA,0xC5,0x95,0x44,0x7A,0xFF,0x4F,0x9A, +0xE2,0x97,0xE6,0xA4,0xD6,0x5C,0xCC,0x69,0xE2,0xA0,0x99,0xD4,0x9A,0x87,0xA0,0xC9, +0xD2,0x9B,0xB9,0x1A,0xE9,0x55,0xD8,0xE7,0x19,0x59,0xA5,0x6D,0x3C,0xB2,0x8E,0xC8, +0xFD,0xD1,0xB1,0x6B,0x95,0xD8,0x6B,0xEC,0x5A,0x47,0xE4,0x42,0x27,0xB7,0x4E,0xCB, +0xEE,0xB9,0xBC,0x6D,0xD1,0xB4,0x63,0xE7,0xC8,0xFC,0x91,0xC6,0xC2,0x3A,0x22,0xA7, +0x2F,0x61,0x99,0x8E,0xDE,0x66,0x8F,0x63,0xFD,0xDD,0x58,0x95,0x48,0x9E,0x39,0xC5, +0x37,0xC8,0x4C,0x2E,0x66,0x00,0x00,0x00,0x00,0x01,0x04,0x0E,0x01,0x90,0x00,0x05, +0x00,0x04,0x05,0x33,0x05,0x99,0x00,0x00,0x01,0x1E,0x05,0x33,0x05,0x99,0x00,0x00, +0x03,0xD7,0x00,0x66,0x02,0x12,0x00,0x00,0x02,0x0B,0x06,0x03,0x03,0x08,0x04,0x02, +0x02,0x04,0xE7,0x00,0x6E,0xFF,0xD2,0x00,0xFD,0xFF,0x0A,0x24,0x60,0x29,0x04,0x00, +0x20,0x0C,0x50,0x66,0x45,0x64,0x00,0x40,0x00,0x0D,0xFB,0x04,0x06,0x14,0xFE,0x14, +0x00,0x00,0x09,0xDC,0x03,0xDC,0x60,0x00,0x01,0xFF,0xDF,0xFF,0x00,0x00,0x00,0x00, +0x78,0xDA,0x63,0x60,0x60,0x60,0x66,0x80,0x60,0x19,0x06,0x46,0x06,0x10,0xB8,0x02, +0xE4,0x31,0x82,0xF9,0x2C,0x0C,0x3B,0x80,0xB4,0x16,0x83,0x02,0x90,0xC5,0xC5,0xC0, +0xCB,0x50,0xC7,0xF0,0x9F,0x31,0x98,0xB1,0x82,0xE9,0x18,0xD3,0x1D,0x05,0x2E,0x05, +0x11,0x05,0x29,0x05,0x39,0x05,0x25,0x05,0x35,0x05,0x7D,0x05,0x2B,0x85,0x78,0x85, +0x35,0x8A,0x4A,0xAA,0x7F,0x7E,0xB3,0xFC,0xFF,0x0F,0xD4,0xC3,0x0B,0xD4,0xB3,0x80, +0x31,0x08,0xAA,0x96,0x41,0x41,0x40,0x41,0x42,0x41,0x06,0xAA,0xD6,0x12,0xAE,0x96, +0xF1,0xFF,0xFF,0xFF,0x5F,0xFF,0x3F,0xFE,0x7F,0xE8,0x7F,0xC1,0x7F,0x9F,0xBF,0xFF, +0xFF,0xBE,0x7A,0x70,0xFC,0xC1,0xA1,0x07,0xFB,0x1F,0xEC,0x7B,0xB0,0xFB,0xC1,0x8E, +0x07,0x1B,0x1E,0x2C,0x7F,0xD0,0xFC,0xC0,0xFC,0xFE,0xA1,0x5B,0x2F,0x59,0x9F,0x42, +0xDD,0x46,0x24,0x60,0x64,0x63,0x80,0x6B,0x60,0x64,0x02,0x12,0x4C,0xE8,0x0A,0x80, +0x5E,0x66,0x61,0x65,0x63,0xE7,0xE0,0xE4,0xE2,0xE6,0xE1,0xE5,0xE3,0x17,0x10,0x14, +0x12,0x16,0x11,0x15,0x13,0x97,0x90,0x94,0x92,0x96,0x91,0x95,0x93,0x57,0x50,0x54, +0x52,0x56,0x51,0x55,0x53,0xD7,0xD0,0xD4,0xD2,0xD6,0xD1,0xD5,0xD3,0x37,0x30,0x34, +0x32,0x36,0x31,0x35,0x33,0xB7,0xB0,0xB4,0xB2,0xB6,0xB1,0xB5,0xB3,0x77,0x70,0x74, +0x72,0x76,0x71,0x75,0x73,0xF7,0xF0,0xF4,0xF2,0xF6,0xF1,0xF5,0xF3,0x0F,0x08,0x0C, +0x0A,0x0E,0x09,0x0D,0x0B,0x8F,0x88,0x8C,0x8A,0x8E,0x89,0x8D,0x8B,0x4F,0x48,0x64, +0x68,0x6B,0xEF,0xEC,0x9E,0x3C,0x63,0xDE,0xE2,0x45,0x4B,0x96,0x2D,0x5D,0xBE,0x72, +0xF5,0xAA,0x35,0x6B,0xD7,0xAF,0xDB,0xB0,0x71,0xF3,0xD6,0x2D,0xDB,0x76,0x6C,0xDF, +0xB3,0x7B,0xEF,0x3E,0x86,0xA2,0x94,0xD4,0xCC,0xBB,0x15,0x0B,0x0B,0xB2,0x9F,0x94, +0x65,0x31,0x74,0xCC,0x62,0x28,0x66,0x60,0x48,0x2F,0x07,0xBB,0x2E,0xA7,0x86,0x61, +0xC5,0xAE,0xC6,0xE4,0x3C,0x10,0x3B,0xB7,0xF6,0x5E,0x52,0x53,0xEB,0xF4,0x43,0x87, +0xAF,0x5E,0xBB,0x75,0xFB,0xFA,0x8D,0x9D,0x0C,0x07,0x8F,0x30,0x3C,0x7E,0xF0,0xF0, +0xD9,0x73,0x86,0xCA,0x9B,0x77,0x18,0x5A,0x7A,0x9A,0x7B,0xBB,0xFA,0x27,0x4C,0xEC, +0x9B,0x3A,0x8D,0x61,0xCA,0x9C,0xB9,0xB3,0x19,0x8E,0x1E,0x2B,0x04,0x6A,0xAA,0x02, +0x62,0x00,0x37,0x44,0x8A,0xA0,0x00,0x00,0x00,0x00,0x04,0x60,0x05,0xD5,0x00,0xA6, +0x00,0x8F,0x00,0x93,0x00,0x9A,0x00,0xA0,0x00,0xAA,0x00,0xE9,0x00,0xB8,0x00,0xB2, +0x00,0xB8,0x00,0xBE,0x00,0xC4,0x00,0xCA,0x00,0xD5,0x00,0x9D,0x00,0xA2,0x00,0xAE, +0x00,0xC2,0x00,0x70,0x00,0xC7,0x00,0xAC,0x00,0x8D,0x00,0x60,0x00,0x6E,0x00,0x44, +0x05,0x11,0x00,0x00,0x78,0xDA,0x5D,0x51,0xBB,0x4E,0x5B,0x41,0x10,0xDD,0x0D,0x0F, +0x03,0x81,0xC4,0xD8,0x20,0x39,0xDA,0x14,0xB3,0x99,0x90,0xC6,0x7B,0xA1,0x05,0x09, +0xC4,0xD5,0x8D,0x62,0x64,0x3B,0x85,0xE5,0x08,0x69,0x37,0x72,0x91,0x8B,0x71,0x01, +0x1F,0x40,0x81,0x44,0x0D,0xDA,0xAF,0x19,0xA0,0xA1,0xA4,0x48,0x9B,0x06,0x21,0x17, +0x48,0x7C,0x42,0x3E,0x21,0x12,0x33,0x6B,0x88,0xA2,0x34,0x3B,0x3B,0xB3,0x73,0xCE, +0x99,0x33,0x4B,0xCA,0x91,0xAA,0x77,0xE9,0x6B,0xCF,0x53,0xE7,0x24,0x90,0xC2,0xDD, +0x06,0xCD,0x36,0xFD,0x4E,0x48,0xB5,0xB3,0x00,0xF7,0xA4,0xEB,0xEB,0x8D,0x8C,0xB4, +0x83,0x07,0x5A,0x6C,0x66,0xF4,0xCA,0x75,0xFB,0xFE,0x0B,0x06,0x9B,0xD1,0x94,0x3B, +0x6A,0x00,0xE5,0x3D,0x6F,0x29,0x0F,0x19,0x4D,0x3B,0x81,0x5A,0xB4,0xA7,0xFE,0xD1, +0xFC,0x0A,0x86,0xFB,0xFC,0x1F,0xF3,0x3B,0x18,0xB4,0x34,0xD3,0xF4,0xD4,0x3A,0x09, +0xE9,0x21,0x04,0xE6,0x9B,0x71,0x4B,0x83,0xEF,0x19,0xCD,0xBA,0xCB,0x0F,0xFA,0x82, +0xD5,0xE1,0x62,0x30,0x30,0xA4,0x98,0xA6,0xE2,0x2E,0x3F,0xA6,0x52,0xFE,0xB7,0x34, +0xE7,0x6A,0xCB,0xB0,0xB5,0x91,0xD1,0xBC,0x83,0x33,0x11,0xF9,0xC9,0x34,0x40,0x53, +0x6B,0x6D,0x04,0x9A,0xFE,0xD4,0x21,0xD5,0xF3,0x71,0x14,0x4B,0x90,0xCB,0xA6,0xB1, +0x36,0x98,0x98,0xB2,0xFE,0x24,0x13,0xC1,0x85,0xC9,0x74,0x55,0x53,0xB5,0xCC,0xF8, +0xDA,0xC1,0x5D,0xB2,0xB3,0xE8,0x60,0x83,0x2A,0xCD,0x81,0x07,0xD8,0xC3,0x56,0x79, +0x0C,0x1E,0x0E,0x0F,0x26,0x14,0xD2,0xB7,0x24,0xCA,0x2C,0x0D,0x11,0xF6,0x62,0xAB, +0xC4,0x08,0x11,0x93,0x1C,0x0A,0x39,0xE5,0xDC,0xC9,0xFE,0xA4,0x40,0xF9,0x48,0x12, +0xC6,0xBC,0x49,0x4A,0x3B,0xE3,0x86,0xB5,0x06,0xC6,0x91,0xD7,0xC0,0xA0,0x36,0x4F, +0xB3,0xFF,0x3C,0x9B,0x4D,0x6D,0x6F,0x1D,0xC2,0xF8,0x59,0x1C,0xC1,0x77,0xBF,0x19, +0x4B,0x3A,0xF8,0xC8,0x86,0xDA,0x18,0x11,0x62,0x3B,0x62,0x29,0x80,0x09,0x44,0x42, +0x46,0x55,0xF9,0x86,0x1A,0xCF,0xBD,0x2C,0x06,0xE4,0x52,0xFB,0xCF,0x40,0x94,0x80, +0xE5,0xF1,0x8F,0x7F,0x9D,0x08,0xB4,0xEE,0xD8,0x44,0x3C,0x97,0xB5,0x75,0x0E,0x31, +0x56,0x08,0x7A,0x7E,0xDB,0xDC,0xF2,0xCB,0x8A,0xBB,0x56,0xB9,0xCE,0x8B,0x42,0x77, +0x6F,0xAA,0x6A,0xA8,0xD2,0x29,0xCD,0xFB,0x5E,0xCE,0xBE,0xC7,0x03,0x9E,0x1E,0x0B, +0xC3,0x41,0x63,0xC1,0x9B,0xCF,0xFB,0xFE,0x4A,0x81,0xFA,0x3C,0x2C,0xAE,0x34,0x68, +0x0E,0x04,0x43,0x7A,0x37,0x7A,0xFF,0xA2,0xB5,0xEA,0x88,0xAB,0xBC,0x17,0x3E,0xB2, +0x27,0xD3,0xBF,0xB1,0x5A,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xFF,0xFF,0x00,0x0F, +0x78,0xDA,0xBD,0x7D,0x09,0x60,0x14,0x55,0xD2,0x70,0xBF,0xEE,0x9E,0xFB,0xEC,0x39, +0x32,0xB9,0x93,0xC9,0xE4,0x80,0x84,0x64,0x60,0x86,0x10,0x02,0x72,0x29,0xAB,0xA0, +0x88,0x88,0x08,0x08,0x18,0x11,0x10,0xF0,0x00,0x84,0x88,0x57,0x40,0x04,0x54,0x64, +0x11,0x23,0x72,0xA8,0x88,0x80,0x08,0xC8,0x46,0x64,0xBB,0x27,0x23,0x02,0x22,0x72, +0xAC,0x72,0xC4,0x8B,0x65,0xC1,0x65,0x91,0x75,0x95,0xF5,0xC8,0xEA,0x2A,0xEB,0xA7, +0xAE,0x40,0xD2,0xFC,0x55,0xEF,0xF5,0x4C,0x26,0x27,0xBA,0xFB,0xFD,0x9F,0x38,0x93, +0x9E,0xEE,0x99,0x7E,0xF5,0xEA,0xD5,0xAB,0xBB,0xAA,0x39,0x9E,0x1B,0xC8,0x71,0xFC, +0x24,0xDD,0x8D,0x9C,0xC0,0x19,0xB8,0x12,0x85,0x70,0xC1,0xCB,0x22,0x06,0x31,0xED, +0x9F,0x21,0x45,0xAF,0xFB,0xF8,0xB2,0x88,0xC0,0xC3,0x21,0xA7,0x08,0x78,0x5A,0x87, +0xA7,0x23,0x06,0x7D,0x7A,0xC3,0x65,0x11,0x82,0xE7,0xC3,0x92,0x5F,0xCA,0xF3,0x4B, +0xFE,0x81,0x7C,0xB6,0x9A,0x4B,0x9E,0x55,0xA7,0xEA,0x6E,0x3C,0xFF,0xCA,0x40,0xF1, +0x3D,0x0E,0x6E,0x49,0x4A,0xE1,0x8D,0xD3,0x1D,0x87,0xFB,0x9A,0xB8,0x30,0x17,0x81, +0x73,0x45,0x0A,0x31,0xD5,0x47,0x74,0x3C,0x57,0x44,0x64,0x73,0x50,0xE6,0x4E,0xC8, +0x62,0x48,0x11,0x1C,0xF5,0xB2,0x3E,0xA4,0x18,0x1C,0xF5,0x8A,0x85,0x14,0x71,0x8A, +0x8E,0x48,0x2E,0xD9,0x58,0xDE,0xB5,0x9B,0xBF,0x34,0xEC,0x15,0xA4,0xB0,0x24,0x04, +0x48,0x69,0x5D,0x5D,0x9D,0x67,0x83,0xAA,0x0A,0x57,0xF2,0xD5,0x8D,0x33,0xD5,0xE7, +0xF1,0xFE,0xDC,0xDB,0x42,0x0D,0x5F,0x4F,0xEF,0x6F,0xE0,0xBA,0x72,0x00,0x10,0x57, +0x24,0xEB,0xC2,0x51,0x18,0xCD,0x28,0x16,0xC1,0x9D,0x89,0x6C,0xC4,0x31,0x14,0xC1, +0x52,0x2F,0x0B,0x4E,0x45,0x24,0x45,0x8A,0xC1,0x52,0xAF,0x98,0x60,0x90,0xAE,0xDD, +0xDC,0x70,0x63,0xFC,0xF7,0x76,0xCD,0x87,0x35,0x70,0x9F,0xA2,0xC6,0xE3,0xF8,0xA2, +0xF7,0x5D,0xCB,0x71,0x7A,0x9F,0x6E,0x0F,0x97,0xC6,0x65,0x91,0x11,0x5C,0x24,0x15, +0xE0,0x8E,0x78,0x93,0x52,0xC2,0xE1,0xB0,0xCC,0x05,0x6B,0x3D,0xBE,0xE4,0xB4,0x5C, +0x5F,0x58,0x21,0xFA,0xFA,0x5A,0x5E,0x4A,0xCF,0xC8,0xF5,0x85,0x64,0x31,0x58,0x2B, +0x38,0x33,0xB3,0xF0,0xB4,0x0E,0x4E,0xEB,0x4D,0x66,0x1B,0x9C,0x06,0x74,0x99,0x8B, +0x6A,0xFB,0xEB,0x0C,0xA6,0xA2,0x88,0xD1,0x62,0x0D,0x85,0x00,0xA2,0xEC,0xA0,0x9C, +0x7A,0x42,0x49,0x01,0x88,0x52,0x9C,0x8A,0x01,0x20,0x32,0x5A,0xEA,0x23,0x06,0x23, +0x7E,0xCF,0x20,0x9A,0x8A,0x6A,0x93,0x8C,0x06,0x63,0x51,0xD4,0x6B,0xE1,0x42,0x22, +0x0E,0x8A,0xE7,0xBD,0x6E,0x53,0x91,0x6C,0x74,0x22,0x72,0xA2,0x56,0x7A,0x41,0xF1, +0x93,0x22,0xB9,0x47,0xEA,0xAE,0xBE,0xD2,0xD9,0x49,0x9C,0xB7,0xC8,0xBC,0xAB,0x6F, +0xE6,0xD9,0x95,0x78,0x20,0xA7,0x3A,0x6B,0xF9,0x54,0x83,0xBB,0xA8,0x56,0xA0,0xEF, +0x7A,0x7C,0x87,0x91,0x6A,0x4D,0x29,0x46,0x38,0x48,0x72,0xD6,0x9A,0x93,0x2C,0x70, +0xE0,0x75,0xD6,0xDA,0xBC,0x56,0xF8,0x82,0x93,0xBE,0x4B,0xF4,0xDD,0x83,0xEF,0xF8, +0x1D,0x1F,0xFD,0x0E,0xFC,0x2A,0x99,0xFE,0x0A,0xEE,0x99,0x16,0xBB,0x4F,0x7A,0xEC, +0x3E,0x19,0xF8,0x9D,0xDA,0xCC,0xD8,0x37,0xB3,0xF0,0xBC,0xD0,0xDF,0xC9,0x0B,0x38, +0x77,0xA7,0x84,0x48,0x4A,0xCF,0xC8,0xCC,0x2A,0x69,0xF1,0x9F,0xDC,0x3F,0x15,0x71, +0x5F,0xEA,0x77,0xFB,0xE1,0x15,0x16,0xE8,0xCB,0xEB,0xA7,0xAF,0x80,0x1B,0x5F,0x65, +0x70,0x69,0x2D,0x19,0x3F,0x42,0xDD,0x43,0x6E,0x9F,0xBC,0x61,0x2A,0xC9,0xBD,0x7D, +0xFD,0x14,0xD2,0x53,0x7D,0x71,0x38,0xE9,0xAB,0x3E,0x3F,0x75,0xFD,0x14,0xF5,0xD4, +0x94,0x17,0xA7,0x1E,0x24,0x79,0xC3,0xD5,0xD3,0x64,0xED,0x73,0x64,0xE8,0x6A,0xB2, +0x4E,0xBD,0x15,0x5F,0xAB,0xD5,0xC8,0x73,0xEA,0x04,0xB2,0x16,0x5F,0x70,0x1E,0xA8, +0xA2,0x46,0x3D,0x26,0x4E,0xD3,0x7B,0x38,0x3F,0xD7,0x89,0x0B,0x72,0xCB,0xB8,0x48, +0x16,0xAC,0xA4,0x9C,0x1E,0x56,0x44,0xB1,0x5E,0xEE,0x1C,0x8A,0x64,0xD1,0xE5,0xC9, +0xCA,0x04,0xF4,0xE6,0x07,0x65,0x6F,0x58,0xB1,0xC0,0x79,0x7B,0x48,0xB6,0x06,0x89, +0xDC,0x35,0x28,0x1B,0x4F,0xC8,0x5C,0x48,0xC9,0x31,0xD7,0xCB,0x39,0x4E,0x25,0x93, +0x14,0x45,0x44,0x4B,0x1E,0xAC,0x61,0x34,0xC3,0xC2,0x49,0xB0,0x38,0x36,0x6F,0x67, +0xF8,0x14,0xC9,0xC8,0xC4,0x9B,0x64,0x48,0x70,0x93,0x0C,0xA7,0xD2,0x05,0x56,0x34, +0xC5,0x5C,0xAF,0x74,0x43,0x42,0x16,0xB3,0x24,0x97,0xC2,0xA5,0x95,0x97,0xCB,0xF9, +0xD2,0x6B,0xC4,0xE8,0x4A,0xC9,0x0B,0xE6,0xFA,0xCA,0x65,0x8B,0x4B,0x31,0x4B,0xE5, +0x40,0xDF,0x65,0xA5,0x99,0xC4,0x27,0x95,0x90,0xD2,0xEE,0x3D,0xCA,0x80,0xD4,0xE1, +0x83,0xB7,0x84,0x14,0x48,0x99,0xC4,0xEB,0xD1,0x1B,0xA4,0x80,0x50,0x42,0xDC,0x9E, +0x24,0x9F,0x64,0x27,0xA4,0x2F,0x7C,0x27,0xBF,0xA0,0x66,0xF2,0xD1,0x19,0xA7,0x0F, +0xFF,0xE5,0xDD,0x49,0x37,0x6F,0xBB,0xE1,0x86,0xDF,0x8F,0x3B,0x73,0xE2,0xCC,0x89, +0x49,0xE4,0xF6,0x3F,0x0E,0x9D,0x39,0xF7,0x9E,0x07,0xC9,0xF0,0x79,0xF3,0xAB,0x1E, +0x1D,0x17,0xED,0x3F,0x80,0x90,0x43,0xB9,0x5B,0x57,0xBD,0xB4,0xDB,0xFE,0xF5,0x57, +0x62,0x56,0xDA,0xEF,0x0B,0x4B,0x44,0xF5,0xC6,0x40,0x74,0xCD,0xEF,0x0E,0x38,0xD4, +0xA3,0xA4,0x98,0x2F,0x16,0xD6,0x8E,0x1C,0xEF,0x25,0xAB,0x6D,0x77,0x34,0xDC,0x25, +0x4D,0x1F,0x33,0x7A,0x6A,0x32,0xD0,0xBC,0x8E,0x9B,0x79,0xF1,0x8C,0xA1,0xB3,0xEE, +0x2C,0x67,0xE1,0x7C,0x40,0xF7,0x05,0xB0,0x5F,0x37,0x73,0x91,0x3C,0xC4,0x57,0x72, +0x38,0x5A,0x24,0x72,0x59,0x30,0x63,0x01,0x37,0x58,0x4A,0x38,0xEA,0xA5,0x1F,0xA3, +0x0E,0x53,0x9E,0x60,0x83,0x3F,0xF4,0x93,0xDC,0x2D,0xFB,0x84,0x14,0xCD,0xA2,0xC7, +0x44,0xEE,0x8E,0xFB,0x4E,0x23,0x56,0xD9,0xEA,0x54,0x5C,0x40,0xBA,0x7A,0xF6,0x49, +0xEF,0x54,0xD2,0xE1,0x53,0x27,0xF6,0xA9,0x93,0x53,0x29,0x81,0x4F,0x39,0x8C,0xAC, +0x4B,0x01,0x7B,0x2E,0xAB,0xE4,0xAA,0x35,0x09,0xB8,0xC7,0xCA,0x95,0x92,0x4E,0xF0, +0x21,0x25,0x2B,0x2F,0x15,0x3E,0x70,0x4A,0xB7,0x22,0xC0,0x67,0x4E,0x7A,0x79,0xB9, +0xE2,0x75,0xC0,0x91,0x9E,0x43,0x24,0xBA,0xBB,0xF7,0x08,0x87,0x92,0x00,0x63,0x81, +0x9C,0xFC,0x32,0x4F,0x52,0x38,0xD4,0x03,0x50,0x15,0xC8,0xD1,0xBB,0x49,0xD8,0x44, +0xDA,0xB9,0x36,0x73,0xD7,0xDA,0xB5,0xBB,0xDF,0x58,0xB7,0x6E,0xE7,0xBA,0x09,0xA3, +0x46,0x4D,0x9C,0x34,0x72,0xE4,0xC4,0xD5,0xC2,0xE6,0xF5,0x0D,0x63,0xF8,0xE2,0x37, +0xD6,0xAD,0xDD,0xF5,0xC6,0x0B,0xEB,0x77,0xAD,0x9F,0x38,0xEA,0xC6,0x89,0x13,0x6F, +0x1C,0x35,0x51,0x1C,0xB3,0xEB,0xE3,0x53,0x6F,0xBC,0xF9,0x97,0x53,0xBB,0x1F,0x59, +0xB1,0xE2,0x91,0xF9,0xAB,0x56,0x5E,0x30,0xE8,0x6D,0xE7,0xFE,0x87,0xAC,0xDA,0x7D, +0xEA,0xE3,0x37,0xDE,0x38,0x75,0xEA,0x8D,0x05,0x2B,0x57,0x2E,0x58,0xB8,0x72,0x05, +0xF2,0x8D,0xF9,0x17,0xCF,0xE8,0x54,0xC0,0x61,0x3E,0x70,0xA3,0x99,0x5C,0x24,0x1B, +0xF9,0x46,0x2E,0x32,0xBD,0x42,0x43,0x7D,0xC4,0x04,0xC8,0x53,0x9C,0x86,0x7A,0x22, +0x77,0xA3,0x4C,0xA9,0xC0,0x06,0x7C,0xA2,0x80,0x33,0x16,0x29,0x6E,0x5B,0xBD,0x5C, +0xE0,0x54,0x52,0x61,0xF2,0x69,0x40,0x3A,0x21,0xF8,0xEB,0x2E,0x00,0x16,0x28,0x94, +0xCB,0xA9,0xD2,0xEB,0x26,0x6B,0xA6,0x3F,0xB7,0xB0,0xB8,0x04,0x29,0x27,0xCD,0x25, +0x67,0x03,0x1E,0x9C,0x85,0x92,0xEB,0x35,0x4E,0x6F,0xCB,0xF4,0xD3,0xB3,0x26,0x49, +0xB6,0x32,0x44,0x94,0x51,0x5A,0x82,0x29,0x23,0x21,0xC1,0x3C,0xBD,0x40,0x3E,0x40, +0x3B,0x65,0x61,0x3D,0x6F,0x20,0x81,0x02,0x3B,0x9C,0xE3,0x18,0x1E,0xCA,0x88,0x9D, +0xCC,0x7F,0xEC,0xB1,0xAE,0xA1,0xBF,0xEE,0xB8,0x61,0xD3,0x8D,0xA3,0xD6,0x0E,0xBC, +0x7D,0x61,0xEF,0xB1,0xA4,0xA1,0xF7,0xE5,0xFA,0x5D,0xD6,0xA9,0x37,0x13,0x5F,0x43, +0xF5,0xD4,0xBF,0x2F,0xFC,0x97,0xFA,0xFE,0xBE,0x3F,0xAD,0xBF,0x65,0xF3,0xE0,0xC6, +0x6F,0xC7,0xDE,0x48,0xDE,0x7B,0xF8,0xD3,0x89,0xFD,0xE6,0x5E,0xB6,0xE1,0xED,0xDC, +0xDC,0xED,0xC1,0x6E,0x33,0x46,0x87,0xA7,0x54,0x34,0xFE,0x7C,0x53,0xDD,0xAC,0x47, +0x54,0xF5,0x21,0xF5,0xCC,0xF2,0x9B,0x46,0x11,0xF7,0x99,0xA7,0xF7,0xF7,0xEB,0xCF, +0x67,0x5D,0xFF,0x22,0x90,0x14,0x47,0x90,0x3F,0x93,0x19,0x94,0x3F,0x07,0x18,0x77, +0xD6,0x58,0x33,0x01,0x7E,0xA9,0xF1,0x65,0xFA,0xD2,0xC5,0x19,0xF2,0xDB,0x1A,0x2B, +0x66,0xBF,0x97,0xD5,0xEF,0xF9,0x2A,0xBD,0x8B,0xB3,0x71,0x6E,0x8E,0xC8,0x76,0xFA, +0x1B,0x83,0xBD,0x5E,0x71,0xB0,0xEF,0x77,0x77,0xE1,0xC4,0xBC,0x1E,0x97,0x2F,0x90, +0xCF,0xCB,0x2B,0x9E,0x59,0xFF,0xD8,0x82,0x85,0x8F,0xAE,0x5F,0xB5,0x92,0x5F,0xF8, +0x09,0xF9,0xC3,0x37,0x5F,0xA8,0x7D,0xBF,0xFC,0x52,0xED,0xFD,0xF9,0xD7,0xE4,0x1D, +0xBC,0xD7,0x46,0xB8,0xD7,0x8C,0xC4,0x7B,0x09,0x27,0x14,0x73,0xD3,0xBD,0x7A,0xB8, +0x4A,0xBB,0xF3,0x05,0xE1,0x24,0x97,0xD7,0xC3,0x1B,0x36,0x3E,0xBA,0x90,0xDE,0x68, +0xE5,0x2A,0xF5,0xFB,0xCF,0xC9,0xDB,0x5F,0x7E,0x49,0xF6,0x7F,0xF1,0x8D,0x7A,0xD9, +0x27,0x7F,0x53,0x7B,0x7D,0x8D,0xF7,0xEA,0xC3,0x5F,0x2D,0x1C,0x80,0x75,0x96,0x80, +0xB3,0x68,0xC2,0xCC,0x15,0x94,0x1D,0x28,0xCC,0xA2,0x76,0xCA,0x1C,0x50,0x9E,0xB9, +0xD9,0x9D,0x8B,0x49,0x99,0x0E,0x66,0x96,0xE7,0xB3,0x11,0x43,0x9E,0x14,0x90,0x74, +0x7D,0xC8,0x14,0xF5,0xB9,0x5E,0x64,0xD8,0x2C,0x32,0xAC,0x97,0xFA,0x1C,0x99,0xD2, +0x4B,0x95,0x67,0xA9,0xB2,0x30,0xE6,0xC0,0xFE,0x89,0x75,0xE4,0x01,0x75,0x51,0xDD, +0xC4,0xFD,0x07,0x26,0xD4,0xA9,0x8B,0xC8,0x03,0x75,0x30,0xD6,0x49,0xD8,0x9C,0xA7, +0x74,0x22,0xEC,0xCB,0x21,0x5C,0xC4,0x8C,0xFB,0x91,0x0B,0xCA,0x06,0x90,0x3E,0xC6, +0x7A,0x59,0x17,0x8A,0x10,0x0E,0xB9,0x0F,0x11,0x4C,0x00,0x83,0x35,0x28,0x9B,0x4F, +0xC8,0x7C,0x48,0x31,0x81,0x74,0x11,0x43,0x11,0x93,0x19,0xAF,0x99,0x50,0xFA,0x98, +0x4D,0x78,0x68,0xE6,0x4C,0x45,0x8A,0x8D,0x81,0x55,0xEA,0x07,0xA0,0x80,0xEB,0x02, +0x44,0x27,0xF9,0xE2,0x2D,0x7C,0x71,0xE3,0x31,0x78,0xAB,0xC1,0xBF,0x35,0x8D,0xC7, +0xF8,0x62,0x9C,0xE7,0xDA,0x8B,0x2E,0x72,0x80,0x53,0x81,0x3B,0xE4,0x71,0x30,0x6C, +0x94,0x37,0x71,0x26,0x5C,0x3D,0x7D,0x50,0x26,0x27,0x14,0xD1,0x59,0x4F,0x05,0x98, +0x88,0xE2,0x5A,0x57,0x0E,0x37,0xF5,0xB9,0x51,0x60,0xAF,0x1D,0x7E,0x6C,0xE3,0xB7, +0xA4,0xFF,0xD6,0xAD,0xEA,0x5E,0xB8,0xC7,0x24,0xF2,0x09,0x3F,0x8F,0x5F,0x08,0x34, +0x90,0x83,0xF7,0x50,0x88,0x50,0x8F,0x2F,0x24,0x01,0x85,0x83,0x9D,0x2F,0x38,0x91, +0x22,0x62,0x24,0x50,0xEA,0xF7,0x4E,0xE2,0xD3,0xC8,0x27,0x1B,0x37,0xE2,0xF8,0xA7, +0xE0,0x6D,0x1B,0x8C,0x2F,0x70,0x9D,0x13,0xB4,0x87,0xD8,0x41,0x9C,0x8A,0x00,0x0E, +0x7C,0xB1,0x5B,0x84,0x01,0x84,0x53,0xC7,0x54,0x15,0x7F,0xCF,0x5D,0xBC,0x9C,0x8F, +0x50,0xFA,0x1B,0xAC,0x69,0x07,0x7C,0x38,0x81,0xF6,0x50,0x27,0x20,0x30,0x01,0x9E, +0x91,0x20,0x0A,0xD4,0x3E,0xF9,0xFF,0x4C,0x43,0x39,0x2A,0xCA,0xC4,0x29,0x73,0x7B, +0x65,0xDE,0x29,0x0B,0x7B,0x79,0x85,0x13,0xA8,0xE4,0x22,0x70,0x7F,0x2F,0x09,0x13, +0xDE,0x58,0xD3,0xF8,0xF3,0x1E,0xFD,0xF2,0x73,0xD3,0x38,0xAA,0x2F,0x2C,0xBA,0x78, +0x46,0xAC,0xD6,0x78,0xE7,0x40,0x2E,0x62,0x42,0x00,0x1D,0xB0,0xE5,0x91,0x5F,0x2A, +0x5E,0xDC,0xF2,0xC9,0x74,0x4C,0x2B,0x28,0x3A,0x8C,0x19,0x2A,0x7A,0x50,0x76,0x52, +0x34,0x6E,0xA7,0x98,0x84,0x72,0xD8,0xD5,0x89,0x3C,0xCD,0xC9,0x85,0x43,0x9C,0xE4, +0xE4,0x60,0xBF,0xBA,0x9D,0xAE,0x70,0xC8,0x25,0x39,0xF9,0x40,0x0E,0xBF,0x88,0x98, +0x2E,0x5C,0x20,0x26,0xF5,0xDF,0x17,0x2E,0xA8,0xFF,0xAE,0x7B,0x61,0xCD,0x0B,0xF0, +0xDF,0x9A,0x17,0xF8,0x7A,0xF2,0x20,0x59,0xAA,0x56,0xAA,0x8F,0xA9,0x8B,0xD4,0x4A, +0xB2,0x14,0x88,0xE8,0x3D,0xF5,0x3D,0x80,0x33,0x4C,0xBA,0x93,0xB0,0xFA,0x1E,0xDD, +0x4B,0x9F,0x72,0x9C,0x38,0x06,0x70,0x61,0xE6,0x6E,0xE0,0x22,0x06,0x84,0xD0,0x68, +0xA4,0x54,0xC2,0x23,0x90,0x84,0x77,0x66,0xEF,0x85,0x05,0x31,0x02,0xAC,0x96,0xA0, +0x6C,0x82,0xD5,0x75,0xD4,0x47,0x44,0x4A,0x35,0xA2,0x1E,0x08,0xC8,0x44,0x45,0xA5, +0x89,0x98,0x34,0x8A,0x52,0xAC,0x28,0xE0,0x08,0x07,0x4B,0x6F,0x46,0x80,0x4B,0xF3, +0x28,0x35,0x01,0x55,0x7D,0x4A,0x6E,0x3B,0x42,0xAE,0x6E,0xD8,0x48,0xAE,0x16,0x8F, +0xEF,0x18,0x74,0xFE,0x78,0x4D,0x8D,0x58,0x09,0xE3,0xAF,0x82,0xF1,0xAF,0x06,0x1C, +0xA5,0xE3,0x5A,0xD0,0x25,0x4C,0x35,0xD6,0x47,0x24,0x1C,0xDC,0x8C,0xA3,0x66,0x00, +0x55,0x9F,0x50,0x3C,0x30,0xAA,0xC1,0x43,0x95,0x21,0xA0,0x55,0xD9,0x16,0x42,0xB9, +0xCB,0x29,0xA9,0x38,0x0E,0x29,0x97,0xCD,0x92,0x62,0xF3,0x80,0x38,0x85,0x4F,0xF6, +0x72,0x5C,0xEB,0x1E,0x5C,0x19,0x15,0x8D,0xC0,0xEB,0x0C,0xA5,0x7D,0x49,0x38,0x24, +0xA2,0xE8,0xD4,0x73,0x06,0xBF,0x77,0x15,0x60,0x22,0x7C,0xEB,0xB5,0x2F,0x3F,0x76, +0xCB,0xB1,0xFB,0x1F,0xFC,0xD3,0xE8,0xAF,0x88,0xE7,0x37,0x63,0x53,0xD4,0x1F,0x7E, +0xE0,0xF7,0xD5,0xDC,0x47,0x96,0xF5,0x9A,0xF6,0xCC,0xE0,0xFB,0x56,0x5D,0x7E,0xC5, +0xBB,0xDD,0x42,0x5F,0xED,0x1F,0xB7,0xE9,0xEE,0x0C,0xF5,0xEB,0x73,0x35,0x88,0xA7, +0x35,0xB0,0x96,0x95,0x00,0x67,0x27,0xEE,0x18,0x17,0xC9,0x47,0x38,0x45,0x80,0x33, +0x95,0x49,0x3E,0xC5,0x0D,0x38,0xF3,0x84,0x64,0x1F,0xC8,0x3A,0x25,0xC9,0x58,0x0F, +0x12,0x2E,0x3F,0xD5,0x06,0xC8,0x40,0x82,0xEE,0x4C,0x67,0x10,0x80,0x35,0x76,0xE2, +0xE5,0x0C,0x98,0x8A,0x33,0x03,0xA7,0xE2,0xB4,0x00,0xBE,0x0A,0x19,0x81,0x39,0xFE, +0xB8,0xAF,0x81,0x2A,0x6A,0xBE,0x12,0xD9,0x53,0x22,0xFB,0x9C,0x4A,0x92,0xFB,0x9C, +0xEC,0x71,0x2A,0x29,0xEE,0x73,0xBB,0x1C,0x81,0x7D,0x47,0xE1,0xA2,0x05,0xF5,0x2B, +0x6F,0x92,0x07,0x34,0x2B,0x1F,0xE8,0x60,0xBE,0x14,0x77,0x51,0x04,0xDE,0xB3,0x7F, +0x9B,0xFD,0xDB,0x80,0xDE,0x2E,0xB9,0xCA,0x41,0x2F,0xF4,0xC0,0x1F,0x20,0x99,0xE4, +0x92,0x12,0xF2,0x5A,0x92,0xCF,0xE3,0x4D,0x4E,0x89,0xEB,0x57,0x84,0x03,0x3D,0x06, +0x48,0x89,0x04,0x00,0x53,0x56,0x09,0x24,0x86,0x9C,0xE4,0x52,0x9C,0x19,0x31,0x8D, +0x83,0x49,0xC1,0x22,0x52,0x1A,0x17,0x87,0x09,0xA8,0x43,0xDD,0x43,0xF4,0xE7,0xE4, +0xAF,0x19,0x71,0x68,0xDA,0x9E,0x83,0x3B,0x37,0x6D,0xDB,0xBE,0x72,0xED,0x4B,0xCF, +0xDE,0xB0,0x67,0x56,0xE5,0xE1,0x9B,0xBE,0x20,0xD6,0x27,0x17,0x2E,0x7B,0x49,0xFD, +0x50,0xFD,0xAA,0xE2,0x60,0xF1,0x81,0x6E,0xA1,0x55,0xD5,0x8F,0xAC,0xDC,0x7C,0xDF, +0xDD,0x95,0x55,0xB9,0xF9,0xD1,0xEC,0xEC,0xA3,0x91,0x39,0xAF,0xF8,0xB3,0xFE,0xF0, +0xD4,0xE9,0xEF,0xF3,0x60,0x4F,0x4C,0x82,0xF5,0xDE,0x48,0xE9,0xCD,0xC6,0x8D,0x60, +0x7B,0x82,0x92,0x5A,0x94,0xB3,0x98,0x78,0x1B,0x68,0xE7,0x61,0xD8,0x55,0xA8,0xF7, +0x53,0x66,0x6C,0x3A,0x21,0x5B,0x43,0x8A,0x11,0x70,0x27,0x84,0x22,0x46,0x4A,0x76, +0x46,0x4A,0x76,0x54,0x31,0x36,0x21,0xDF,0x42,0x46,0x0D,0x5B,0x15,0x27,0x66,0xA3, +0x7B,0xA4,0x94,0x80,0xFA,0xEE,0x0D,0x00,0x03,0x03,0x03,0x64,0x12,0x3F,0x4D,0x3D, +0x7E,0xFC,0xB0,0xCA,0x13,0x95,0x8C,0x3F,0x20,0x44,0x1A,0xC2,0x5B,0xD4,0xF5,0x64, +0xFC,0x16,0x21,0x83,0xF2,0xB1,0x33,0xE2,0x24,0x80,0x25,0x83,0xBB,0x87,0x8B,0xA4, +0xC5,0xD6,0xD4,0x8E,0xB4,0x27,0xC1,0x22,0x7A,0xCD,0x69,0x76,0x58,0x44,0x2F,0x9C, +0x33,0x7B,0x29,0x9F,0xB4,0x21,0x3B,0xCD,0x0C,0xCA,0xB6,0x13,0x8A,0xCB,0x5C,0x1F, +0x71,0xD9,0xF0,0xAC,0xCB,0x09,0x14,0xE9,0x62,0x4A,0x7B,0x32,0x6C,0xDF,0x2C,0x34, +0x27,0x5C,0xA0,0x9F,0x88,0x66,0x6F,0x1A,0xD5,0x4F,0xC4,0x34,0x20,0x4C,0x8E,0x92, +0x29,0x49,0x06,0xE4,0x7B,0x5D,0xB2,0xAB,0x19,0xD2,0x11,0xD7,0x94,0xE9,0x22,0xBE, +0x39,0x2F,0x68,0xA6,0x39,0xF9,0x6B,0xC7,0xEC,0xBD,0xF3,0xD5,0x23,0x47,0x5E,0xBD, +0xFE,0xC5,0x11,0x42,0x4A,0xE3,0xFA,0x2E,0xA3,0xBB,0x9C,0x27,0xB9,0xEA,0x9F,0xD4, +0xEF,0x2A,0x0E,0x04,0xEA,0xBA,0x75,0xDD,0xBE,0x66,0xCD,0xF6,0xDC,0x7C,0xFE,0xDB, +0x1A,0xF5,0x69,0x87,0x43,0xFD,0xF6,0x1F,0xFF,0x52,0x7F,0xCC,0x46,0x9E,0x53,0x0D, +0x73,0x5A,0x05,0x74,0x9A,0xCC,0xE5,0x72,0xB3,0xB9,0x48,0x12,0xCE,0x2A,0x3D,0xC6, +0x73,0x60,0x47,0x45,0x9D,0x39,0x49,0xA0,0x9D,0x31,0x8D,0x23,0x8F,0xAA,0x63,0x29, +0x4E,0x2E,0x55,0x44,0x6D,0x9D,0x82,0xEE,0x86,0x29,0xE4,0xA3,0xB6,0x0A,0x7B,0x4B, +0xB1,0x02,0x4A,0xE5,0x2C,0xA9,0xD6,0x2C,0x38,0x93,0x50,0xA5,0x70,0xBB,0x14,0x83, +0x1E,0x99,0x52,0x4E,0xBA,0xE4,0x8A,0x70,0x6E,0xB8,0x5C,0xAE,0x98,0x9D,0x30,0x3D, +0x43,0xB9,0x2C,0x48,0xB2,0x9E,0x31,0x29,0x7F,0x4C,0xD3,0xE0,0x85,0xD8,0x8C,0x02, +0xD9,0x5C,0xA2,0xA6,0x55,0x4D,0x86,0x91,0xB4,0x21,0xCF,0x8F,0x18,0xF2,0xFC,0x90, +0x43,0xC7,0x1C,0xBD,0x23,0x77,0x7E,0x4A,0x74,0xEA,0xD9,0xCF,0xD4,0x46,0xF5,0xDB, +0x6F,0xD7,0x3D,0xFE,0xF8,0x3A,0x7C,0x01,0xFF,0x9A,0x40,0x36,0x65,0x66,0xEE,0xC8, +0xCD,0x57,0xBF,0x57,0xBF,0x1B,0x75,0xB3,0xFA,0xDD,0xD7,0x5F,0xA8,0xFF,0x20,0x4B, +0x67,0xBC,0xF8,0xC6,0x1B,0x2F,0x6E,0xD8,0xB5,0x0B,0xF7,0xE5,0x16,0xA0,0xA7,0xA9, +0xB0,0x86,0x7A,0x90,0x23,0x11,0x1D,0x52,0x13,0x32,0x74,0xC6,0xB1,0x0C,0x41,0xC5, +0x18,0x67,0x47,0x42,0x39,0x93,0x23,0x24,0x40,0xB6,0x08,0x7B,0x1B,0x3F,0x3B,0x46, +0x54,0x5D,0x51,0xCD,0xC8,0xF3,0xF3,0x75,0x45,0x1C,0x48,0x82,0x25,0x80,0xB7,0x25, +0x80,0x37,0x1F,0xE8,0x24,0x41,0xEE,0x61,0x2E,0xE2,0x45,0xCC,0xA5,0xC5,0x14,0xB4, +0x62,0x43,0x7D,0xB4,0xC0,0xEF,0x35,0x01,0xE6,0x0A,0x10,0x73,0x5D,0x29,0xE3,0x86, +0xE5,0x96,0x93,0x9D,0x72,0x2E,0xEE,0x6B,0x3D,0x5A,0xAB,0x41,0x25,0x97,0x9E,0x42, +0xF6,0xA4,0xB8,0xE0,0xB0,0x10,0x2F,0x01,0x7F,0x47,0xC5,0x5F,0x29,0xCC,0x05,0xFD, +0xCC,0xE4,0xF0,0xA6,0xF9,0x05,0x4A,0x17,0x7E,0xA0,0x0B,0xC5,0x05,0x9C,0x5D,0x2E, +0x90,0x14,0x07,0x30,0x7B,0xB9,0x18,0x50,0xAE,0x2F,0x4F,0x50,0xDA,0x72,0x99,0x9E, +0xCA,0xF6,0x5F,0x20,0x27,0xB7,0x99,0x26,0x9B,0x70,0xBC,0x64,0xE3,0xD3,0x0B,0x96, +0x71,0x17,0xFF,0xFA,0x89,0xBA,0x6C,0xFE,0xD3,0x2F,0xA9,0xFF,0xFE,0xF7,0xBF,0x41, +0x10,0x6C,0x7A,0xEA,0xA9,0xCD,0x9B,0x96,0x3D,0xB5,0xC9,0xBF,0x6C,0xE1,0x82,0xE5, +0xCB,0x17,0x2C,0x5C,0x46,0x36,0x56,0xBF,0x93,0x93,0x1D,0x79,0xB8,0xF6,0xC3,0x0F, +0x6B,0x1F,0x8E,0x64,0xE7,0xBC,0x53,0x7D,0xF2,0xAB,0xAF,0x4E,0x2E,0x5A,0xFD,0xFC, +0x63,0x8B,0x56,0xAF,0xE6,0x83,0xF7,0x2C,0x58,0x70,0x0F,0xBC,0x38,0x4D,0x67,0x15, +0x17,0x35,0xD1,0x11,0x95,0x5D,0x4E,0xA3,0x46,0x47,0x39,0x80,0x8D,0xA4,0x74,0x13, +0xD2,0x51,0x52,0x9C,0x8E,0x94,0x14,0x47,0xBD,0x46,0x44,0x51,0x3D,0x25,0xA9,0xD6, +0x74,0x64,0x72,0x26,0xE1,0xD4,0x65,0x3D,0xCC,0xDB,0x8D,0x74,0xE4,0x34,0xC1,0xD2, +0x58,0x81,0x13,0x49,0xB2,0xAD,0x9C,0x51,0x95,0x9E,0x83,0x2B,0x14,0x05,0x5C,0x38, +0x1B,0x85,0x1D,0x6C,0x86,0x02,0xBA,0x55,0x5C,0xEE,0x04,0x4D,0x95,0xCD,0x7B,0x3E, +0x71,0x7E,0x46,0x04,0x22,0xA9,0x8A,0xFA,0xF9,0x90,0x35,0x23,0x86,0xAC,0xB9,0x06, +0xC8,0xA9,0x57,0xE4,0xAE,0xBF,0xA9,0x17,0xEA,0x62,0x74,0x24,0xFC,0xF0,0x05,0x49, +0xA2,0x62,0x70,0x9D,0x3A,0x96,0x92,0x13,0xB1,0x11,0xD7,0xC8,0x71,0xC4,0xF1,0x35, +0x10,0xD1,0x06,0x20,0x26,0x98,0xEF,0x59,0x20,0xA6,0x03,0x62,0x80,0xFA,0x0C,0x8A, +0x9B,0xB4,0x0A,0x54,0x47,0x74,0xA8,0x53,0x18,0xE3,0x5E,0x09,0x27,0xF5,0x4A,0xA0, +0x66,0x61,0x8A,0x6B,0x16,0x02,0xBC,0xCE,0x1E,0x3B,0x06,0xFA,0x85,0x90,0x87,0x3A, +0x06,0xCF,0x74,0x24,0xB8,0x9F,0x0E,0x54,0xDB,0x4E,0x1C,0x52,0x86,0x01,0x6F,0x63, +0x46,0x15,0x09,0x7F,0x0F,0x5A,0x92,0x6C,0x0C,0xA1,0xED,0xDE,0x52,0x51,0xB2,0x00, +0x07,0xF6,0xA2,0xB2,0x14,0x3C,0xA6,0xA9,0x4B,0xA2,0x9B,0xE9,0x2D,0x27,0xB9,0x0A, +0xDD,0x29,0x71,0x33,0xD0,0x3A,0x07,0x5C,0xCE,0x6B,0x22,0xDE,0x93,0x3A,0xFE,0xC2, +0xCF,0xA2,0x91,0x0F,0x6E,0x26,0x47,0xB7,0xAB,0xCB,0xD4,0xE5,0xDB,0x71,0xEC,0x93, +0x64,0xBC,0xEE,0x94,0xB0,0x81,0xCE,0x25,0x95,0x69,0x57,0x46,0x36,0x13,0x81,0xCE, +0x24,0xE6,0xE9,0xC0,0xDD,0x00,0x2F,0xB8,0xC9,0x79,0x55,0xC7,0x93,0xF1,0x35,0x35, +0x64,0xF5,0x96,0x2D,0x4C,0xC7,0x4E,0x18,0xAB,0xAC,0xD4,0x44,0x60,0xB8,0x93,0xA2, +0xFE,0xC2,0x79,0x1D,0x5F,0xB1,0x9D,0x4C,0x23,0x33,0xB6,0xAB,0xC1,0xCD,0x94,0x4E, +0x96,0xC3,0xE6,0x91,0x81,0x4E,0xB2,0x81,0x4E,0x26,0x71,0x11,0x3F,0xE2,0x2D,0x07, +0xB4,0x31,0x11,0xE9,0x24,0x53,0x60,0xC4,0xE1,0x3F,0x21,0xBB,0x43,0x74,0x6B,0x48, +0x21,0x39,0xD7,0xA9,0xA4,0x21,0x8B,0xD4,0xF8,0x4C,0xAE,0x1F,0xD6,0x5C,0xF4,0x65, +0xC2,0x9A,0xCB,0x69,0x52,0xC4,0x9A,0x6C,0xC1,0x23,0x03,0xEA,0x0F,0x9C,0x92,0x99, +0x03,0x17,0x0D,0xB8,0x45,0xCA,0x65,0x51,0x02,0x51,0x8F,0x50,0x23,0x4B,0xC1,0x4D, +0xE1,0x00,0x5B,0xC5,0x60,0x27,0x19,0x24,0x00,0xC6,0x4D,0x3F,0x12,0x13,0xF8,0x88, +0xC3,0xE5,0x15,0xFB,0xA6,0xEC,0xF8,0x64,0xD0,0x98,0xD1,0xC1,0x02,0xA3,0x5E,0xFF, +0x56,0xCF,0x31,0x63,0xCA,0xC3,0x0B,0xEF,0xBA,0xAE,0x76,0x79,0x9D,0x78,0x60,0x77, +0x79,0xCF,0xFD,0xEB,0x86,0x2C,0x1E,0x39,0x32,0x58,0x9A,0xE2,0xBD,0xAC,0x7B,0xD5, +0xEA,0xDB,0x16,0x8C,0xBC,0xA9,0xB4,0xA2,0xDB,0x4D,0xD3,0xAF,0x3C,0x7F,0x1E,0x10, +0x0D,0x7A,0x9B,0xBA,0xC6,0x30,0x53,0xB7,0x81,0xEB,0x0F,0xBA,0xB5,0xCC,0xC9,0xBD, +0x83,0x4A,0x77,0xB1,0x5E,0x76,0x83,0x2A,0x1F,0x56,0x06,0xC2,0x51,0x56,0x28,0x32, +0xD0,0x8D,0xAC,0x7F,0x60,0x06,0xB0,0xFE,0xAB,0x83,0x4A,0x0A,0x9C,0xEC,0x14,0x54, +0xF4,0x22,0x4C,0xF7,0x5A,0xCA,0x53,0x4B,0x2C,0x5C,0x3A,0xF0,0xD4,0x12,0x90,0xE3, +0xB0,0x1D,0x06,0x30,0xA3,0x76,0x80,0x53,0xB9,0x0A,0x3E,0x65,0xB1,0x4F,0x59,0xCE, +0xA8,0x93,0x7D,0xCB,0x19,0x94,0xD3,0xC3,0xF0,0x59,0xC9,0x61,0x9E,0x1C,0x38,0xA7, +0x0C,0x05,0xD4,0x5C,0x35,0x00,0xF8,0x85,0x3B,0xA5,0x93,0xBE,0x77,0x77,0x34,0x7A, +0x73,0x80,0xCF,0x2A,0x65,0x3D,0x71,0xDB,0xB8,0xBB,0x6B,0x87,0xCA,0xD5,0x03,0x25, +0xD7,0x76,0x2B,0x97,0x94,0xEE,0xCC,0x41,0xA3,0x8F,0x99,0x3F,0x3D,0x80,0x6D,0x00, +0x4A,0x89,0xD7,0xC9,0xE9,0x4A,0x71,0xCF,0xE4,0x6B,0xE6,0x5F,0x69,0x58,0x62,0x2E, +0x83,0xFC,0x5C,0x94,0x39,0xCC,0x4A,0x4A,0x12,0xD1,0xF0,0xF3,0xE9,0x91,0xBF,0x14, +0xE4,0xF3,0x79,0x09,0xDB,0x6B,0xD1,0xE3,0x0F,0xCD,0x27,0xC3,0xDF,0xFC,0x13,0xB9, +0xB3,0xEA,0x9A,0xEB,0xD4,0xFD,0xEA,0x57,0x97,0x3D,0x3F,0x65,0xEB,0x47,0x7F,0x7E, +0x65,0xCA,0x9A,0xDE,0xD5,0x4F,0x6F,0xEA,0xD7,0x7F,0xAA,0x7A,0x5C,0xAE,0xFA,0x6C, +0xFC,0x0B,0x4A,0xE5,0xB4,0xDB,0x89,0xE7,0x85,0xF9,0xE7,0xA6,0x8E,0x99,0xAB,0x9E, +0x7C,0x76,0xA7,0xBA,0xE3,0xE1,0x87,0x1F,0xE3,0x2B,0x9F,0x9C,0x53,0xB5,0xF4,0xA9, +0x07,0x1F,0xA8,0xE6,0xB3,0xB6,0x93,0xAB,0xE7,0xCE,0x5B,0xB4,0x6D,0xFD,0x84,0x2F, +0xAA,0xD4,0x73,0xEA,0x87,0xFA,0xD5,0xD7,0x0E,0x3E,0x77,0xE8,0xD0,0xF9,0x6B,0x86, +0x2C,0x6C,0xCC,0x4E,0xFA,0x44,0xB9,0x73,0xF7,0xB0,0x85,0x4B,0x06,0xF4,0x9F,0xAC, +0xBE,0xB6,0x6F,0x9D,0xFA,0x8F,0x3B,0xA6,0x4E,0x1B,0x75,0xFD,0x8C,0x5B,0xA7,0x2C, +0x9C,0x3B,0x97,0x0C,0x7E,0xBD,0xFA,0xA5,0x8D,0x4F,0x3E,0xB1,0x69,0x23,0xAC,0x8B, +0x13,0x6C,0x1E,0xE4,0xF5,0x06,0xD0,0x1E,0xBA,0xB0,0x3D,0x2A,0x0B,0x61,0x66,0x41, +0xEA,0x8D,0x1C,0x01,0x76,0xA4,0x17,0xA8,0xA6,0xAA,0xA9,0xA1,0x46,0x4D,0x0D,0x45, +0x95,0x37,0x20,0xF8,0x05,0xB7,0x9F,0x38,0xF9,0x5E,0x9F,0xF3,0xE5,0x7F,0x7C,0xBC, +0xF1,0x96,0xC7,0xDF,0xE6,0xF3,0xD4,0x7F,0xEA,0x8E,0x9F,0x2F,0x22,0xF3,0xD4,0xF9, +0x7C,0x01,0xFF,0x25,0xCA,0x81,0xC3,0x20,0x4F,0xBE,0x81,0x31,0xEC,0x20,0x09,0xB2, +0xB9,0x89,0x1A,0x27,0x70,0x08,0xF5,0x4C,0xAE,0x64,0x0B,0xF5,0xD1,0x64,0x1F,0x1D, +0x2A,0x19,0x87,0xF2,0x53,0xCE,0xE7,0x40,0xA6,0x1F,0x92,0x1D,0x4E,0x34,0xEE,0x14, +0x0B,0x6C,0xED,0x74,0xE4,0xFB,0x3A,0x20,0x71,0x58,0x52,0x25,0xDD,0x41,0x1D,0x97, +0x9C,0xE2,0xC3,0x03,0x4B,0xB9,0x9C,0x2C,0xC1,0x47,0x39,0x1B,0x77,0x3D,0x00,0x27, +0xF9,0x13,0x79,0x7C,0x9E,0x9F,0x21,0x1F,0x74,0x66,0xED,0xE0,0x30,0x2F,0x7E,0x79, +0xFE,0xE1,0x39,0x2B,0x37,0xA9,0x67,0x2F,0xA8,0x11,0x32,0xF0,0xA5,0x17,0x5E,0x78, +0x49,0xDD,0x4D,0x8A,0x56,0x2C,0x5B,0xB6,0x42,0x3D,0xAE,0x3B,0xBE,0x57,0x59,0xBC, +0xC1,0x93,0x5D,0xF7,0xEC,0xA1,0xBF,0x6C,0x5E,0xB4,0xE4,0x89,0x47,0x37,0xCE,0x98, +0x35,0xF3,0x6E,0xBA,0x87,0x2B,0x2F,0x9E,0xD1,0x15,0xC0,0xDE,0x4C,0xE1,0xFA,0x70, +0x11,0x1F,0xE5,0xE0,0x42,0x4C,0x13,0x40,0xE0,0x53,0x29,0xF0,0x36,0xE0,0x64,0x69, +0x88,0x2E,0xA7,0x0F,0xA0,0xF3,0xA0,0x9A,0x12,0xE1,0x0C,0xC8,0x83,0x65,0xC1,0xD5, +0x52,0xA2,0x33,0x86,0x0C,0xE4,0xE2,0xB5,0xE3,0x87,0x4A,0xF2,0x18,0xB9,0xE1,0xB1, +0x7F,0x4E,0x9D,0xFC,0xE5,0x82,0x8B,0x9C,0x7A,0x96,0x38,0x09,0xB7,0xE0,0xCB,0xC9, +0x77,0xFC,0xF3,0x11,0xF5,0x55,0xF5,0x41,0x90,0xDF,0x53,0xC9,0xBA,0xAB,0xAE,0x3A, +0x7E,0x4B,0x85,0x7A,0x50,0xFD,0xB3,0x7A,0x52,0x3D,0x58,0x71,0xCB,0xB1,0x41,0x83, +0xC8,0x3A,0x58,0x4B,0xC0,0xB3,0x4E,0x06,0x3C,0x1B,0xC1,0x5A,0xEE,0xA9,0x61,0xD9, +0x14,0xC3,0xB2,0x84,0xD0,0xB9,0x28,0x74,0x26,0x40,0xAD,0xC9,0x89,0xD6,0xA9,0xA2, +0x03,0x40,0xD1,0x78,0x56,0x24,0x93,0x14,0x47,0x1D,0x03,0xA8,0x40,0x93,0x14,0x81, +0xC3,0x64,0x1D,0x89,0x90,0x55,0xEA,0x54,0x75,0xD8,0xF1,0x1F,0x80,0x6B,0x65,0xA9, +0x9F,0xAA,0x75,0x3F,0xE8,0x8E,0xAB,0xCF,0xA8,0x0F,0xAB,0x0F,0xA9,0xAB,0x36,0x93, +0x64,0x52,0x42,0xBA,0x10,0x1F,0xE2,0x07,0xD7,0x7A,0x09,0xC0,0x60,0xE1,0xAE,0x8E, +0x41,0x60,0xD4,0x20,0x00,0x45,0x30,0xAA,0x63,0x24,0xA5,0x43,0x55,0xC2,0x1A,0x07, +0x06,0x0D,0x68,0x6A,0x5C,0x9B,0x2C,0xD4,0xE8,0x11,0xE2,0xA6,0x0F,0xB3,0xA0,0x99, +0xF5,0xCC,0x5E,0x87,0x05,0xB9,0x31,0x95,0x3F,0xD8,0x58,0xCE,0xFF,0xAC,0x3B,0x5E, +0xA3,0x5E,0x59,0xD3,0x78,0xA6,0x46,0x1B,0x37,0x00,0xE3,0x9A,0x80,0xC3,0xD0,0x71, +0xDB,0x1E,0xD3,0xDC,0xC6,0x98,0x4D,0xA3,0x59,0x5A,0x8C,0x76,0x58,0x18,0xD3,0x78, +0x37,0x3F,0xAC,0x51,0xC6,0x91,0x06,0xD5,0x34,0x96,0x71,0x71,0x1A,0x40,0xBD,0x26, +0x83,0xBB,0x57,0xD3,0x71,0x13,0x69,0x20,0xEA,0x4D,0x4A,0x43,0x29,0xEE,0x45,0x84, +0x67,0xC6,0xC8,0x41,0xB6,0x31,0x42,0x06,0xF5,0x26,0xE2,0x4E,0xC6,0x71,0xDD,0x5E, +0x18,0x91,0x6A,0x87,0x36,0x60,0xC8,0x66,0x21,0x0D,0xA9,0x23,0x59,0xD2,0x94,0x41, +0x2F,0x2A,0x80,0xC9,0x28,0xC4,0x15,0x1B,0x6A,0x33,0xE6,0x56,0xEA,0xA0,0xD8,0x9C, +0x78,0x24,0x34,0x08,0x81,0xDF,0x20,0x01,0x2D,0x21,0x15,0x4F,0x13,0xC3,0x8C,0xBB, +0x1B,0x96,0xA8,0xDF,0xAA,0xFF,0x24,0x6E,0xE2,0xBA,0x73,0xCB,0x15,0xEA,0x76,0xDE, +0x35,0x5B,0xFD,0x62,0xBD,0xBA,0x41,0x9D,0x0D,0x64,0x34,0x9D,0x3C,0x37,0xE8,0xCA, +0x8F,0x6E,0x19,0xAF,0xBE,0xAF,0x1E,0x55,0xFF,0xA8,0xBE,0x9F,0x57,0x40,0x96,0x6D, +0x6E,0x9C,0x77,0xC3,0x8D,0xE4,0x39,0x6D,0x1D,0x75,0xBD,0xE9,0x3A,0xF6,0xD3,0xB8, +0x82,0x21,0x1C,0xF7,0xFA,0x0B,0x66,0x8A,0x51,0xA1,0x69,0x15,0x2D,0x80,0x51,0x3E, +0x24,0x5B,0x9C,0xA8,0x1D,0xA2,0x48,0x47,0x51,0x14,0x5B,0x3C,0x0C,0x5C,0x84,0xC1, +0x76,0x00,0x84,0x1E,0xE1,0xFF,0x7A,0xE4,0x48,0x63,0x8E,0xEE,0x78,0xE3,0x1A,0x7E, +0xD2,0xF9,0x22,0x5C,0x47,0x86,0x53,0x18,0x8F,0x2C,0xA7,0xFE,0x03,0x7F,0xC2,0xFA, +0xC5,0x3D,0x08,0x70,0x37,0x7C,0xE9,0xE2,0x77,0x3C,0x7C,0x04,0xB9,0x0C,0xFD,0xED, +0xC5,0x55,0xEA,0x64,0xFA,0x5B,0x0B,0x57,0xC8,0x7C,0x44,0xC8,0xAD,0x38,0x0D,0x38, +0xF1,0x04,0xC2,0x12,0x11,0x0D,0xD4,0xBE,0xB6,0xC4,0x69,0xCA,0x80,0x0C,0x19,0x6E, +0xE4,0xD4,0x17,0x91,0x3B,0xFA,0x3D,0x36,0xFD,0xC8,0x7B,0x67,0xAE,0x3D,0xBB,0x6A, +0xBF,0x6E,0xDA,0xF9,0xE5,0xEA,0xF7,0x3F,0xC4,0x60,0xD2,0xDD,0x41,0xED,0xAA,0xAE, +0x2D,0x70,0x20,0x86,0xA9,0xED,0x0E,0x90,0x99,0xE9,0xC4,0x9B,0x4C,0x74,0x45,0x30, +0x95,0x97,0x33,0x10,0x89,0xDF,0x44,0xFC,0x04,0xE7,0xBC,0x96,0x88,0x8D,0x69,0x42, +0xAA,0xFA,0x53,0x63,0x18,0x66,0xBE,0x98,0xBF,0xAF,0x71,0x50,0xC3,0x19,0xFE,0x83, +0xC6,0x6E,0xF1,0xB9,0x8B,0x38,0x8E,0x2E,0xC6,0x81,0x11,0xB3,0xDA,0xFC,0xF5,0xB1, +0xF9,0x47,0x04,0x4A,0xAD,0x82,0x0E,0x66,0x60,0x68,0x42,0xAC,0x17,0x6E,0xFF,0x11, +0xA0,0xE2,0x78,0x4D,0xFC,0x5E,0xFA,0x2C,0xB8,0x97,0x95,0xBB,0x5C,0x83,0x59,0x9F, +0x00,0xB3,0x8D,0xF9,0x46,0xEC,0xD4,0x37,0x82,0xC6,0x95,0xDE,0x5E,0xAF,0xD8,0x51, +0x73,0x40,0xDF,0x08,0x2F,0x22,0xE5,0xB1,0x59,0x18,0xD9,0x2C,0x70,0x0A,0xB0,0x72, +0xA0,0xE0,0x4B,0x87,0x49,0x31,0x99,0x4B,0xE6,0x91,0xE2,0xB7,0xD5,0x79,0x75,0xEA, +0x3C,0xDD,0xF1,0x06,0xA3,0xF0,0xF3,0xF9,0x22,0x5D,0x56,0x03,0x27,0x72,0xE7,0x3F, +0xD5,0xF0,0x15,0xA6,0x7B,0xB0,0xAD,0xB1,0xB5,0xAD,0x67,0xA7,0xBC,0x47,0xD0,0xC6, +0x46,0x5D,0x4D,0x30,0xE1,0xD8,0x86,0xD6,0x63,0x13,0x89,0xBE,0x1D,0x06,0x01,0xB3, +0xEA,0x0F,0xEA,0xD9,0x46,0xC0,0xD1,0x85,0x2C,0xF1,0xD3,0xF3,0x45,0xE2,0xA7,0x17, +0xB2,0x80,0xDF,0xE1,0x3E,0x3C,0xD9,0xD2,0x17,0x14,0xDB,0x89,0x74,0xFB,0x69,0xBE, +0x20,0x67,0x93,0x2F,0xC8,0x79,0x09,0x5F,0x90,0xC6,0xFC,0xB2,0xB9,0x44,0xBF,0x50, +0x25,0x79,0x80,0xF4,0x26,0xBD,0xC8,0xFD,0xEA,0xE3,0xEA,0x3B,0xEA,0xDB,0xEA,0xA2, +0xE3,0x44,0xF8,0xF8,0x63,0x42,0xD4,0x8B,0x1F,0x7F,0xAC,0x36,0x32,0x9B,0x4A,0x1D, +0xAB,0xAE,0x45,0x65,0x98,0x6C,0x24,0x13,0xD4,0x2F,0xD4,0x1D,0x64,0x10,0x49,0x25, +0x69,0x64,0x90,0xBA,0x83,0xEA,0x74,0xB8,0xC6,0x4B,0x29,0x2D,0xB9,0x63,0xD8,0x61, +0x1C,0xCA,0x0D,0x1C,0xC3,0x64,0xA1,0xFB,0xC9,0x84,0x20,0x7B,0xE2,0x64,0x65,0x09, +0xC9,0x66,0x27,0xDA,0xE2,0x94,0x4B,0x7B,0x91,0xC2,0xDC,0x96,0x26,0x2E,0x8D,0x4E, +0x04,0xB1,0x88,0xA4,0xC4,0x9D,0x0C,0x87,0xC9,0xA1,0x0B,0x08,0xD3,0x05,0x55,0x5D, +0xBA,0x7A,0xF5,0x52,0x55,0x77,0xFC,0xCC,0xA9,0xD3,0x9F,0x35,0x6E,0xE1,0xD5,0xA7, +0x17,0x3D,0xF6,0x34,0xE2,0x4B,0xFD,0x99,0xE2,0x4B,0x02,0xCE,0x75,0x03,0x17,0x71, +0x70,0x0C,0x4D,0x0C,0x5F,0x69,0x4D,0xEC,0xCA,0x05,0xF8,0x02,0xE3,0x3B,0x59,0xC3, +0x17,0xF2,0xA8,0x64,0x34,0xBE,0x05,0x8B,0xC3,0x44,0x2D,0x0D,0x89,0x2A,0x92,0x88, +0x38,0xD9,0x84,0x1A,0x66,0x0B,0xF4,0xC5,0x1C,0xE0,0xED,0x20,0xF1,0xE8,0x3B,0xC4, +0xFC,0xC3,0x69,0x7F,0xC0,0xD9,0x11,0x26,0x1B,0xD4,0x27,0x47,0xAB,0xA7,0xBF,0xE3, +0x79,0xB2,0x89,0xDC,0xDA,0x36,0x3E,0x75,0x23,0x00,0x9F,0x6E,0x2E,0x9D,0xBB,0x49, +0xA3,0x36,0x2B,0xA3,0x36,0x25,0x1D,0x50,0xEA,0xF2,0x50,0x94,0xBA,0x04,0xE6,0xEF, +0x82,0x59,0x81,0x11,0x8E,0xFE,0x24,0x37,0x9B,0x18,0xA2,0x14,0x0D,0xCA,0x64,0x37, +0xD5,0x23,0x64,0x1D,0x1A,0x4B,0x9C,0xE2,0x71,0xB1,0x8F,0xE9,0x52,0x5C,0x18,0x6A, +0x7A,0x84,0xCF,0x8D,0x41,0xA2,0x16,0xF8,0x26,0x5C,0xC3,0xC2,0xB9,0x03,0xAA,0xFA, +0xBE,0x77,0xF2,0xAD,0xAB,0x97,0xDC,0xFF,0xB1,0xFA,0xF4,0xCA,0x95,0x4F,0x03,0xDE, +0x4F,0xFC,0x79,0xE9,0xAE,0xDC,0xA4,0xA7,0x1E,0x52,0xA7,0x92,0x79,0xAB,0x26,0x34, +0x2E,0x16,0x32,0x16,0x2D,0x5C,0xF8,0x28,0xDD,0x9F,0xE8,0xBF,0xDC,0x00,0x6B,0x50, +0x00,0x5A,0x3E,0xD3,0x1F,0x32,0x9B,0xE9,0x0F,0x9D,0xA8,0x4D,0x94,0x1A,0x52,0x6C, +0x0E,0x2A,0x33,0xFC,0x00,0xA3,0x07,0x60,0xED,0xCC,0x7C,0x5A,0x67,0x7F,0xBF,0xEF, +0x63,0xF4,0x69,0xD9,0xE5,0x3C,0xB0,0x91,0xF7,0x2A,0x4E,0xC7,0x39,0x59,0xDA,0xCB, +0xD5,0x3A,0xA5,0xDC,0x3C,0xF4,0x49,0x91,0xF8,0x11,0x7A,0xA7,0x14,0x3F,0x88,0x96, +0x5A,0xB3,0xE0,0xCB,0xC4,0x65,0xF3,0xC4,0x64,0x4B,0x26,0x2A,0x25,0xA9,0xA8,0x94, +0xD4,0x72,0x06,0x0F,0xFA,0x53,0xE2,0x5A,0x09,0x35,0x8E,0x9B,0x22,0x1A,0x59,0x24, +0xE6,0xA4,0x2A,0x88,0x3B,0x56,0x82,0x20,0xEC,0x17,0x11,0xDF,0x8F,0xB7,0xFF,0x65, +0x56,0xE5,0xBB,0xB7,0x6C,0xAA,0xBD,0x6F,0xF3,0x83,0x9F,0x7D,0xA4,0x9E,0x56,0xBF, +0xBC,0xE3,0xBB,0x87,0xAB,0xBE,0x99,0xF5,0xEA,0xEE,0x45,0xAB,0xAB,0x3E,0x3B,0x22, +0x5E,0xF9,0xCE,0xDF,0xF3,0xF3,0xDF,0x2E,0xEB,0xF1,0xF0,0xBD,0x13,0x6F,0xCB,0x4A, +0x29,0x3A,0xB9,0xFD,0xE4,0xDF,0xBA,0x06,0x3F,0xFC,0xCD,0x95,0x8F,0x3F,0x34,0x7D, +0x4E,0x56,0x72,0xF1,0x5E,0xE0,0xDB,0xE7,0x61,0x4F,0xD4,0x53,0xDD,0xB3,0x17,0x07, +0x26,0x6A,0x82,0x9F,0x41,0x16,0x58,0x40,0x59,0x7F,0x02,0x15,0xBE,0x88,0x4E,0x4F, +0x63,0xBB,0x20,0xA8,0x23,0x7A,0x1D,0x1E,0xEA,0xD1,0x4B,0xC5,0x2C,0x2E,0xA1,0x94, +0x79,0xD6,0xF5,0xE2,0x77,0x8D,0xDF,0xD6,0xE9,0x8A,0x6A,0x6A,0xCE,0x1F,0x47,0xF7, +0x03,0xE0,0x3A,0x02,0xFC,0xA1,0x33,0xDC,0x5F,0xE2,0xCA,0x34,0x6A,0xD7,0x6B,0xDA, +0x90,0x6C,0x0E,0xC7,0x94,0x21,0x8C,0x88,0x0B,0x4E,0xBC,0x19,0xF5,0x29,0xA0,0x8C, +0x36,0x09,0x80,0x1F,0x47,0xB9,0x16,0x27,0x61,0xAA,0x3B,0x4A,0x0A,0xA4,0xEE,0x48, +0xDD,0xB6,0x03,0xFB,0xB7,0xD5,0xA9,0x9F,0x00,0x4D,0x7E,0xAE,0x7E,0xC2,0x77,0x13, +0x36,0x36,0xCC,0x06,0x33,0xF5,0xAC,0xB0,0xA4,0x61,0x9C,0xFA,0xB1,0x7A,0x82,0x14, +0xD2,0xB1,0x63,0x7A,0xB5,0x1E,0xE5,0x19,0x9D,0x1B,0xC7,0x53,0xD5,0xBA,0xC9,0x85, +0xC2,0xE9,0x61,0x18,0x1E,0xB1,0x1E,0x36,0xA1,0x32,0xED,0x3C,0x46,0x4E,0x92,0xBF, +0xFC,0xB1,0xF1,0xE0,0xE7,0xC0,0xE7,0x7C,0x62,0x3D,0x88,0x37,0x82,0xF9,0x02,0x86, +0xCD,0x94,0x9F,0xBF,0xCD,0x45,0xAC,0x78,0x1F,0xA3,0xC9,0x12,0x0E,0x87,0xE9,0xED, +0xA2,0x44,0x10,0xF5,0x86,0x5C,0x5F,0x9C,0xB3,0x13,0x98,0x0C,0x71,0x2A,0x7A,0xCD, +0x16,0xB4,0x33,0xA2,0xD9,0xF7,0xF9,0xD9,0x27,0xA8,0x23,0x94,0x73,0xCA,0xD6,0xBD, +0x76,0xF4,0xB7,0xF3,0x7B,0x31,0x8E,0xFD,0x2C,0x9E,0xD5,0xC9,0x42,0x89,0x42,0x78, +0x23,0x9C,0xB3,0x2B,0x66,0xD7,0x39,0x9D,0x6C,0xD9,0xDB,0xF4,0x13,0x53,0x89,0x62, +0x31,0x1B,0x65,0x33,0x5C,0xD3,0xE1,0x35,0xB1,0xE9,0x87,0x8A,0xA8,0x33,0xCA,0x7A, +0xA7,0xAC,0xDB,0xAB,0x93,0x0D,0x4E,0xD9,0xB8,0x57,0xE0,0x22,0xBC,0xCE,0x8C,0x54, +0xD8,0xDF,0xC4,0x0B,0x70,0xD5,0x64,0xB6,0x58,0x5B,0x86,0xA3,0x71,0xAE,0x74,0xBA, +0x26,0x12,0x18,0xF8,0x2E,0xF0,0x83,0xF2,0x33,0xF8,0xF6,0x9E,0xBA,0x58,0x05,0x7E, +0xB0,0x1F,0x76,0xCF,0x05,0x97,0xF8,0x2D,0xBE,0x40,0xB6,0x38,0xCF,0x9F,0xC5,0x18, +0x50,0x5C,0x17,0xC9,0xD7,0x76,0xBA,0x31,0x4C,0x1D,0x9C,0xA0,0x8B,0xA0,0x8C,0xA7, +0x12,0x5D,0xE1,0x51,0x76,0x88,0x66,0x2A,0x3B,0xD8,0x18,0x26,0x1C,0xA4,0x0F,0xEF, +0x55,0x83,0x27,0x49,0x25,0x99,0x7D,0x52,0xCD,0x06,0x3B,0x5E,0x1D,0xA7,0xDE,0x24, +0x64,0xF0,0x3B,0x68,0x0E,0x42,0xB8,0xE1,0x67,0xBE,0xAA,0xF1,0x51,0xA0,0xC5,0x06, +0xA0,0xC5,0x2F,0xA9,0xEE,0xDC,0x95,0xF9,0xEC,0x9B,0xD6,0xCB,0x44,0x9D,0xCD,0x18, +0x45,0x30,0x23,0x47,0x34,0xD0,0x55,0x83,0xE5,0x33,0x68,0xCB,0x27,0xD0,0xF9,0x00, +0x09,0x8A,0x27,0xC9,0x5A,0xF2,0xFC,0xC9,0xC6,0xB3,0x75,0x20,0xE5,0x57,0xF3,0x93, +0x1B,0xBE,0x07,0x2D,0xF5,0x20,0x93,0xCB,0xE3,0x60,0x0E,0x59,0x54,0x36,0x96,0x68, +0x32,0xDE,0x60,0xD4,0x2C,0x7A,0x81,0x29,0xA6,0x2C,0x21,0xC3,0xC0,0xDC,0xEF,0x8A, +0x88,0x34,0xA8,0xA7,0x8E,0x77,0xE2,0x47,0xA7,0x82,0xDF,0x3B,0x4E,0x90,0x1B,0xA6, +0x88,0x2B,0x1B,0x86,0x09,0x07,0x57,0x8B,0xCB,0x6A,0x56,0x5F,0x98,0x51,0xD3,0x14, +0xBB,0x1B,0xAD,0xF7,0xC0,0x3E,0x2A,0xA5,0x9E,0x09,0x9D,0x48,0x3D,0x13,0x44,0x8C, +0xF9,0x58,0xA2,0x06,0x27,0x67,0x06,0xA3,0x18,0x14,0x15,0x9D,0xB9,0x3E,0xF6,0x49, +0x08,0xC5,0xD3,0x33,0xFC,0xDE,0x80,0x14,0xF6,0xCA,0x64,0xCB,0xD9,0xB3,0xEA,0xF7, +0x86,0x9C,0xEA,0x73,0x0D,0xD5,0x2D,0x63,0x3A,0x14,0x1D,0x24,0x1E,0xD3,0x21,0x16, +0x4A,0x69,0x42,0xF3,0x98,0xCE,0xFE,0xBF,0xC4,0x62,0x3A,0x1C,0x46,0x73,0x18,0xA5, +0xF1,0x0A,0xDF,0x14,0xD3,0x91,0x60,0xE5,0x6B,0x78,0x63,0x8D,0xEE,0x38,0x46,0x74, +0x08,0x77,0x90,0xC6,0x0A,0x11,0xF6,0xBE,0x1C,0xEE,0x0C,0xE0,0x08,0xB2,0x10,0xC4, +0xAC,0x01,0x0A,0xBB,0xE1,0x04,0x80,0x89,0xAE,0x2F,0x33,0x0B,0x67,0x13,0x33,0x0C, +0x0B,0x7C,0xC1,0x19,0x9B,0x84,0x21,0xE6,0x79,0xF1,0x81,0x86,0x09,0x1A,0xB0,0xFF, +0xE0,0x77,0xDF,0x91,0x2D,0xEA,0xE8,0x79,0x7A,0xB1,0xFA,0xE7,0xBF,0x6A,0x7E,0x17, +0x61,0x8B,0xEE,0x14,0xDD,0x8B,0xCD,0x63,0xA3,0x94,0xCB,0x34,0x73,0x68,0x22,0xCF, +0x77,0x33,0xE2,0x3C,0xC9,0x67,0xFD,0x81,0xCF,0x3A,0xAC,0x0E,0x52,0x07,0x09,0x34, +0x64,0x47,0x96,0xA8,0xB3,0x99,0xBE,0xF9,0x8D,0x9A,0x21,0x7A,0xD4,0xAD,0x80,0x17, +0x1F,0x87,0xC0,0x02,0xCC,0xF8,0xA2,0x71,0x36,0xA6,0xA1,0x62,0x8E,0x85,0x47,0xEC, +0x74,0xE1,0xCF,0xEA,0xD6,0x6A,0x06,0x43,0x8D,0x78,0x96,0x5F,0xAC,0x9F,0x0C,0xBF, +0xE9,0x84,0xBF,0x89,0x12,0x13,0x67,0x89,0x47,0x67,0xA3,0xBC,0x13,0xA3,0x7D,0xF4, +0xC7,0x0A,0x11,0xA8,0x67,0x1B,0xB7,0x0A,0xA0,0xEA,0x6D,0x92,0xFA,0x9C,0x7E,0xB2, +0xFA,0x5B,0x94,0x79,0x55,0x20,0x3B,0x8A,0xC5,0x2A,0x2E,0x95,0xCB,0xC3,0x98,0xB7, +0x07,0xA9,0x34,0x99,0x8A,0x10,0x7D,0x7D,0xC4,0x41,0x30,0xCE,0xA4,0xAF,0x8F,0x0A, +0x81,0x64,0x07,0x2A,0xE7,0x08,0x50,0x3E,0x5D,0xAB,0x34,0x40,0x5A,0x9A,0x53,0xF1, +0xA0,0x5F,0xCC,0x1F,0x0A,0x29,0x6E,0x73,0xBD,0x52,0x80,0x11,0x70,0xDC,0x31,0x16, +0x6B,0x39,0x8A,0x86,0x88,0xD1,0x91,0x5C,0x8E,0xC2,0x21,0x90,0x89,0x89,0x14,0xDE, +0xF2,0x72,0xC5,0x28,0x30,0xCB,0xDA,0x11,0x8F,0x79,0x87,0xFD,0x89,0x41,0x8C,0xA4, +0x14,0x12,0x60,0x9E,0x10,0xE6,0x3D,0xEC,0x83,0x42,0xA3,0xAA,0xF1,0x02,0xE1,0x5F, +0x7E,0x66,0xFC,0xF6,0x11,0xB7,0xED,0x19,0xF3,0x3F,0x67,0x77,0xF4,0xDB,0xFD,0xF8, +0xD6,0xBA,0x1D,0xF3,0x67,0x3C,0xB7,0xF3,0xF5,0x4F,0xB6,0x92,0x2B,0xDF,0xDC,0xEB, +0x9A,0xB7,0xA4,0xA4,0xA4,0xA6,0xA0,0xA0,0xE1,0x22,0xD7,0x38,0xBF,0x66,0xF2,0xAD, +0xFB,0xB6,0x4D,0xA8,0x3C,0x19,0xED,0x3C,0x19,0xE6,0xB7,0x0B,0xE6,0xB7,0x11,0x68, +0xC1,0x09,0x32,0x7D,0xAC,0xA6,0x23,0x21,0xCB,0x53,0x3C,0x30,0x3F,0x3D,0xCE,0x2F, +0x15,0x0F,0x52,0xA9,0x04,0x20,0x18,0x37,0x60,0x92,0xDD,0x09,0xF3,0xE1,0xA5,0x50, +0x48,0x76,0x3A,0x15,0x1F,0xF2,0x6F,0x1B,0x93,0xED,0x3E,0x74,0xEE,0xE8,0xAD,0x38, +0xAB,0x54,0x0F,0xD8,0x58,0x26,0xF4,0x07,0x6B,0xCA,0x39,0xF5,0xA1,0xD3,0x48,0x5F, +0x7E,0x81,0x57,0x4A,0x70,0xCF,0xEC,0xDA,0xD9,0x4B,0xA9,0x7A,0x97,0xBB,0x78,0xF1, +0xDD,0x2A,0xA5,0xD7,0xCB,0x4F,0x3F,0xFD,0x32,0xBE,0xF4,0x9E,0xC6,0x0D,0x93,0x6E, +0x55,0x77,0xAB,0x3F,0xC3,0xBF,0xDD,0xB7,0x4E,0xDA,0xC2,0x07,0xEB,0xBE,0xFC,0xB2, +0x0E,0x5E,0xB8,0xB6,0x33,0x2F,0x9E,0x11,0xBE,0x84,0x75,0x49,0xF0,0x09,0x00,0x9C, +0x02,0x02,0x6C,0xD6,0x37,0xF9,0x04,0xEC,0xBF,0xC2,0x27,0x40,0xA5,0x6F,0x58,0xF3, +0x09,0xE4,0x70,0x33,0x41,0xF7,0xD6,0xDF,0xB8,0x61,0xC8,0xD0,0x17,0x86,0xD5,0xBE, +0xF3,0x4E,0xED,0xB0,0x17,0x86,0x5E,0xBB,0xE9,0xE6,0x46,0xF5,0x04,0x1F,0x24,0x2E, +0xD2,0x2B,0x10,0xD8,0x5A,0x54,0x74,0xE6,0xBD,0xF7,0xCE,0x14,0x15,0xD5,0xE4,0xE6, +0x92,0xBE,0x48,0x2B,0x00,0x93,0x38,0xA6,0x09,0x97,0x18,0xCD,0x8E,0xD8,0x63,0xB8, +0x14,0x62,0xB8,0x14,0x28,0x2E,0x05,0x43,0x13,0x2E,0x25,0x5B,0xBD,0x2C,0x39,0x19, +0xA7,0xF3,0x01,0xAD,0x98,0xCC,0x0C,0x97,0x66,0x09,0x35,0x73,0x7B,0x1C,0x97,0x9C, +0x45,0x5F,0x1E,0x0F,0x9F,0x26,0xF9,0xD0,0xBE,0xA3,0xB4,0xC0,0x27,0x7A,0xD0,0x67, +0x72,0x17,0xEB,0xE6,0x28,0xBD,0x76,0xEC,0xE8,0xA5,0xCC,0xA9,0xBB,0xB8,0x07,0x30, +0xB9,0x65,0x0B,0x60,0x13,0xA0,0x36,0x92,0x81,0xB7,0x4E,0xE2,0x2B,0xCE,0x7D,0xB3, +0x65,0xD2,0xAD,0x64,0x20,0x31,0xC6,0xB1,0x19,0x83,0x7D,0x1E,0xE0,0xD3,0xC3,0xA5, +0x71,0x93,0xB9,0x88,0x0B,0xC1,0xB6,0xC4,0xC0,0x4E,0x01,0x12,0xF7,0x1A,0x5D,0xD4, +0xC2,0x46,0x12,0x4F,0xA7,0x60,0x1B,0x01,0x6C,0x6F,0x08,0x33,0xB7,0x92,0x10,0x72, +0x00,0x3A,0x03,0xFE,0x26,0x19,0x01,0x52,0xC1,0xE2,0x42,0x1C,0xEB,0x25,0xC5,0xEE, +0x40,0xF0,0x2D,0x2E,0x2A,0xDD,0x65,0xA3,0x24,0xDB,0x69,0xDC,0x88,0x8B,0x47,0x81, +0x33,0x88,0x9F,0x6A,0x39,0x9A,0x27,0xC6,0x9D,0x47,0x57,0x62,0x26,0xE9,0xDC,0xF0, +0x19,0x31,0x34,0x44,0xAC,0xEF,0xBD,0x7E,0xC7,0xC1,0x09,0x13,0x3F,0xBC,0x53,0xFD, +0x41,0x3D,0xF8,0x0E,0xFF,0x14,0xBF,0xE9,0xF1,0xD5,0x3B,0xF9,0x3C,0xB0,0xAF,0xAF, +0x50,0x4F,0x9F,0x1F,0xB3,0xE7,0x60,0xF7,0xEE,0xDB,0x0A,0xBB,0x90,0x9E,0xE4,0x7E, +0xF2,0x4C,0x74,0x1B,0xDB,0xF7,0x41,0x98,0xD0,0xCF,0xB0,0x0E,0x6E,0xF4,0x87,0xB8, +0xA8,0x8E,0x03,0xB3,0x90,0x6D,0x61,0xCA,0xE9,0x1C,0x21,0x90,0x2E,0x8A,0x5E,0xCF, +0xF4,0x7E,0x17,0xCD,0x28,0x90,0x60,0xB7,0x5A,0x43,0x11,0xC9,0x85,0x4B,0x23,0x39, +0x40,0xE7,0x71,0x49,0x34,0x26,0x86,0x3A,0x8F,0x57,0xF3,0x32,0x87,0x4B,0xBB,0xF7, +0xE8,0x4D,0xBC,0x00,0x1D,0xC0,0x4C,0xF5,0x9F,0xA0,0xBC,0xED,0xCD,0x6D,0xF2,0xC4, +0x6B,0x49,0x50,0x3D,0xBA,0x53,0x38,0x5A,0x3D,0xF4,0x8D,0x57,0x9E,0x1B,0x36,0x75, +0x62,0x75,0x43,0x50,0x38,0x8A,0x38,0x55,0x47,0x8A,0x63,0x00,0xA7,0xE9,0xC0,0x7F, +0xEE,0x66,0x79,0x76,0x4A,0x36,0xE0,0xD4,0x00,0xD0,0x30,0xC4,0xE6,0xEB,0xEB,0x51, +0x96,0xBA,0xF5,0x2C,0xBE,0x0A,0x48,0xCD,0x00,0xA4,0x66,0x68,0x18,0x0D,0x68,0xB4, +0x50,0x08,0x1F,0x32,0x90,0x6F,0x38,0x9C,0xE5,0xE8,0x9D,0xA8,0x15,0xAC,0x6E,0x96, +0x31,0xE4,0xB6,0x32,0xBC,0xA6,0x4A,0xB2,0xB3,0x5C,0xC9,0xCF,0x46,0x22,0xF1,0xC5, +0x88,0xC4,0xA5,0x79,0x4A,0x9D,0x7C,0x93,0x2E,0xD9,0x87,0xB4,0x26,0x98,0x86,0xF7, +0xE7,0x44,0xCA,0x77,0xA8,0xEA,0xF9,0x5B,0xB7,0x5E,0x7F,0xFD,0xDA,0xE1,0xAF,0x45, +0xCB,0x23,0x73,0xDE,0x6F,0xD8,0xB3,0x69,0xC5,0xCA,0x4D,0x9B,0x56,0xAE,0xD8,0xC4, +0xF7,0x21,0x22,0xE9,0x35,0x61,0x62,0x4D,0x43,0x91,0xFA,0x99,0x5A,0x9F,0x91,0x59, +0xDB,0xA5,0xF0,0xCD,0xB7,0xC6,0x4E,0x9C,0x00,0x2A,0x84,0x70,0xF0,0xE3,0x8F,0x0F, +0x1E,0xFA,0xF8,0x63,0x86,0xF7,0x5D,0x20,0xCF,0x27,0x51,0xBC,0x5F,0xAB,0xE9,0x0C, +0xE6,0x30,0xE3,0x21,0x98,0x2D,0xA0,0x77,0x34,0xF1,0x10,0x66,0x70,0x01,0x4F,0x44, +0x07,0x86,0x9B,0xA6,0xFE,0x29,0x66,0x33,0x35,0xB8,0x14,0x8B,0x9B,0x4A,0x61,0x4E, +0x71,0xC4,0xC2,0x5D,0x31,0xDE,0x91,0xE4,0x05,0x9C,0x53,0x98,0xBD,0xD2,0xAE,0x9D, +0x97,0xD7,0xCE,0xDE,0xF7,0xCE,0x8E,0x39,0x73,0x56,0x6E,0x05,0x4E,0xB1,0xF6,0xB6, +0x49,0xDF,0x7D,0xD5,0x38,0x8E,0x5F,0xBB,0x6E,0xED,0x9E,0x8D,0x8D,0x8B,0x18,0x4D, +0xEF,0x03,0xA0,0x1E,0x00,0x78,0x68,0xDE,0x67,0xCC,0xFE,0x43,0x4A,0x68,0x1D,0x0C, +0x31,0xB3,0x60,0x88,0x39,0x1E,0x0C,0xC1,0xB4,0xCC,0xD2,0xB0,0x77,0xDF,0x8E,0x1D, +0x3B,0xC4,0xF1,0x17,0xD6,0xEB,0x8A,0xEA,0xEB,0xF1,0x9E,0x17,0x4F,0xA9,0x23,0xE9, +0x3D,0x2D,0x9C,0x03,0x35,0x5C,0x1D,0xD1,0x3C,0x1F,0x6C,0x21,0x6D,0x78,0x57,0x27, +0x3A,0x40,0x30,0xDE,0x6B,0x30,0x63,0xBA,0x5D,0xA2,0x1B,0x44,0x62,0x92,0x4A,0x53, +0x6E,0x3D,0xFA,0x22,0x82,0x5E,0xFE,0xBC,0x6E,0xB7,0x0F,0xD9,0xF1,0xD2,0x6B,0x57, +0x7E,0xB1,0x43,0xFD,0xFE,0xD6,0xE7,0xC4,0x7B,0x2E,0x3C,0x71,0x62,0xAF,0xFE,0x38, +0x0E,0xC8,0x70,0xBA,0x06,0xC6,0x33,0xC7,0xA2,0x39,0xE8,0x0F,0x11,0x09,0xBA,0x29, +0x34,0x67,0x88,0xB9,0xC9,0x19,0x22,0xB6,0x70,0x86,0xA0,0x36,0x46,0x00,0x55,0x7C, +0xDE,0xD7,0x8D,0xDB,0xF8,0x3B,0xCF,0x36,0x1E,0xD4,0x7B,0x1A,0x6E,0x27,0x67,0x1A, +0x7F,0x68,0xDC,0xCA,0x07,0x1A,0x4F,0xC3,0xFD,0x9B,0x70,0x94,0xCE,0xEE,0x1F,0x77, +0xFF,0x00,0x2E,0xF0,0xD5,0xE4,0xFE,0xD9,0xB7,0x43,0xEF,0x39,0xF7,0x0D,0x83,0xC9, +0x90,0x01,0x74,0x9D,0xC3,0x4D,0xD5,0xF4,0x2A,0x67,0x0A,0x68,0xC7,0x88,0x5A,0xBA, +0xDC,0x60,0x14,0x2A,0x99,0x06,0x64,0x0E,0x44,0x0E,0xD0,0x9B,0xE5,0xB0,0x95,0xCE, +0x61,0x59,0x60,0x29,0x66,0x1A,0x60,0x03,0x64,0x50,0x31,0x92,0x0B,0x7F,0x53,0x73, +0xE8,0xA2,0xCB,0x29,0x12,0x5A,0xB7,0x34,0x96,0x06,0x36,0x53,0xB3,0xE9,0x78,0x29, +0x09,0xF8,0x5A,0x12,0x42,0x02,0x45,0xF4,0x93,0x1F,0x78,0xF0,0x95,0xCE,0xBF,0xD9, +0xBB,0xE0,0xF7,0x7B,0x76,0xCE,0x9A,0x5D,0xBD,0x79,0xE7,0xAC,0xFB,0x96,0x6E,0x16, +0xC7,0x6F,0x9B,0x32,0x61,0xCE,0xBD,0x73,0xEE,0xFD,0xF1,0x33,0xA4,0x8F,0x17,0xD7, +0x20,0x7D,0xF0,0x6B,0x37,0x3C,0xFF,0xD6,0x4B,0x8C,0x4E,0x34,0xBA,0x85,0xF9,0xB8, +0xB9,0xAB,0x9A,0xE8,0x36,0x3E,0x1B,0x24,0xDE,0xFF,0x80,0x62,0xBD,0x1D,0x51,0x2C, +0x00,0xD5,0x8A,0x60,0x19,0x0F,0x9E,0x0D,0x70,0x34,0xF3,0xAD,0xC4,0x78,0xB0,0x57, +0xDF,0xE4,0x5B,0xB1,0x37,0xF9,0x56,0xEC,0xBF,0x38,0xCF,0x26,0x71,0xCB,0x13,0xE9, +0x5F,0x67,0x89,0x4B,0xFD,0xF6,0xEC,0xBF,0xD4,0xEF,0xF6,0xBF,0xB2,0x72,0xF9,0xD6, +0xAD,0xCB,0x57,0x6C,0x05,0x11,0xE1,0x21,0x3D,0xD5,0x43,0xEA,0x37,0xEA,0x3F,0xD5, +0x83,0xA4,0x9C,0xB8,0x0F,0x7F,0xF9,0xD5,0xA1,0x83,0xF5,0x5F,0x22,0x6C,0xBB,0x80, +0x97,0x6D,0x04,0xD8,0x50,0xB6,0xDD,0xC0,0x35,0xA9,0x08,0x4D,0x68,0x02,0xD9,0x06, +0x8A,0xF0,0x7F,0xAA,0x1F,0xB8,0x35,0x8C,0xC5,0xF4,0x83,0x14,0x72,0x29,0xFD,0x40, +0x1D,0xA9,0x37,0xD7,0x24,0x2A,0x08,0x8D,0xDB,0x84,0x93,0xCD,0x65,0x9A,0xC6,0x7F, +0x35,0x98,0xE3,0xA2,0xB8,0x89,0xFF,0x22,0xCC,0xE6,0xE0,0x7F,0x29,0x87,0x4B,0xD1, +0xCF,0xFA,0x6B,0xE5,0x70,0xCD,0xB9,0x9F,0xF8,0xE1,0xAD,0xE4,0x30,0xA5,0x45,0xE1, +0x6A,0x80,0x59,0x8A,0x65,0x94,0x27,0x60,0xD8,0xD6,0x14,0x4E,0x90,0xD8,0xAE,0xA7, +0x61,0x04,0x1B,0xDD,0x26,0xE6,0x66,0xDB,0x24,0x8B,0x30,0x85,0x06,0xA8,0xAE,0xD7, +0xAE,0x47,0xDD,0x25,0xE9,0x24,0x6B,0x70,0x97,0x35,0x2F,0x03,0xDD,0x4D,0x9E,0xA8, +0xD3,0xBD,0xE9,0x92,0xEA,0xF6,0x34,0x46,0x70,0xBC,0x19,0xA0,0x47,0x1D,0x84,0xF1, +0x0A,0xB8,0xA7,0x58,0x3E,0xAC,0x22,0x02,0x86,0x24,0x1C,0x2E,0x59,0xCF,0x7C,0x23, +0x76,0xD0,0x66,0x2D,0x54,0x9B,0x45,0xEF,0x65,0x8E,0x2D,0xEE,0x18,0xF9,0xEE,0xCB, +0xFD,0x0E,0xE6,0x18,0xB1,0x38,0xC1,0x5A,0x55,0x32,0x8D,0xE7,0xE4,0xAC,0xBD,0x5C, +0xAD,0xD9,0xC2,0x12,0xA3,0x49,0xFC,0x88,0x3A,0x46,0x0C,0x69,0x98,0x4C,0x22,0x25, +0xE7,0xA1,0xF3,0x23,0x47,0x52,0x3C,0x5E,0xC4,0xA8,0x98,0xC7,0x92,0x4A,0x92,0xA5, +0x5A,0x62,0xF7,0xE6,0xE0,0x35,0xAA,0xAA,0x25,0xE6,0x95,0xA0,0xFB,0xA3,0x65,0xE2, +0x27,0x73,0x93,0x60,0xE6,0xEB,0x8C,0xC9,0xEF,0xDC,0xBA,0xE0,0x89,0xDB,0x5E,0xE9, +0xFF,0xCA,0xB3,0x7F,0x7B,0x7F,0x72,0x74,0xC8,0xD0,0x2D,0x63,0x16,0x2F,0x9E,0xB0, +0xA2,0xDF,0x1F,0x36,0xFD,0xFB,0xCF,0x63,0x0E,0x74,0xDE,0x53,0x5A,0x7A,0xD3,0xF5, +0xD7,0x0C,0xCB,0x73,0xE4,0xAE,0x5C,0xB0,0x76,0x6B,0x66,0xE6,0xB6,0x4E,0x9D,0x46, +0x8C,0xE8,0x3F,0xD8,0x6F,0x2F,0x7C,0x6E,0xF1,0x9A,0xED,0x01,0xC0,0x41,0x19,0x10, +0xCB,0xF7,0xBA,0xB5,0xB0,0xFF,0x6F,0xD4,0x7C,0x16,0x56,0x8D,0xB2,0xC1,0xD8,0xA5, +0x3A,0x83,0x21,0x9E,0x89,0x28,0x6A,0xE2,0x8B,0xE9,0x0D,0x40,0x21,0x34,0xA8,0xE1, +0x8A,0x65,0x22,0xCA,0xB6,0x50,0xC4,0x65,0x6A,0xAD,0x3A,0x68,0xC9,0x88,0x9E,0x24, +0xAA,0x40,0xE4,0x97,0x4A,0x65,0x8B,0x76,0x92,0x2A,0xF5,0xD1,0x6B,0x2A,0xDF,0x7C, +0xF3,0xF8,0x06,0x50,0x1D,0x48,0x5F,0x75,0x7F,0x75,0xE3,0xFA,0xC5,0x43,0x57,0xAF, +0xFB,0x23,0x3F,0x9E,0xD1,0xEF,0x36,0xE0,0x07,0xA3,0x29,0x5F,0xF2,0x60,0x76,0xA4, +0x0D,0xA9,0x41,0xA2,0x2E,0x15,0x83,0x06,0x1E,0xF0,0x29,0x0F,0xE5,0xD9,0xDE,0x18, +0xCF,0x46,0xBF,0x0A,0x98,0xE6,0xB2,0x09,0x44,0x02,0x90,0x2F,0xEA,0x11,0x36,0xB4, +0x29,0x24,0xF4,0xF4,0xEA,0xB5,0xC4,0xB2,0x66,0x2E,0x16,0xCD,0x9E,0x20,0xDB,0x90, +0x33,0xBD,0xBA,0x63,0xC7,0x15,0xCA,0xEC,0x7D,0x87,0xC8,0x07,0x64,0x17,0xBF,0xB9, +0xF1,0xD6,0x75,0xEB,0xF6,0x6C,0xE4,0xAB,0x2E,0xAC,0xDF,0x3A,0x79,0xE2,0x59,0x61, +0x0B,0xF3,0x0B,0x80,0x9E,0x38,0x3E,0xD1,0xC7,0x42,0x2E,0xE1,0x63,0xE9,0x73,0x80, +0x54,0x90,0x8A,0x03,0xEA,0xB8,0xF3,0xE2,0xF8,0x86,0x11,0xC2,0xD6,0x0B,0xEB,0xE1, +0x27,0x23,0x39,0x4E,0x5F,0x0A,0xF7,0x69,0xED,0x63,0x21,0x6D,0xF9,0x58,0xCC,0x4D, +0x3E,0x16,0x73,0xDC,0xC7,0xB2,0xDF,0xFB,0xDD,0x7B,0xAD,0x7D,0x2C,0x7D,0xEA,0xBF, +0x3B,0xD8,0xDA,0xC7,0xA2,0x67,0x3E,0x96,0xFD,0x69,0xDF,0x6D,0x6F,0xE5,0x63,0x91, +0x98,0x8F,0x25,0xF6,0xC3,0xFF,0xD0,0xC7,0x92,0x46,0xF0,0x7F,0x12,0xB0,0x90,0xC0, +0xC8,0x1D,0x5F,0x7C,0x7E,0xF2,0x8B,0xCF,0x77,0xA8,0xA7,0x4E,0xFE,0xEB,0xFB,0x93, +0x30,0xEB,0x55,0xC2,0x1D,0xF8,0xBA,0xB0,0x5E,0x58,0xD5,0x70,0x07,0xDD,0xE7,0xBD, +0x01,0x8F,0x0F,0xC0,0xFC,0x9B,0xFB,0x57,0xC8,0x2F,0xF3,0xAF,0xF4,0x26,0xB5,0xEA, +0xAC,0x93,0xA4,0x33,0xE9,0x7C,0x52,0xBD,0x93,0xD4,0x9C,0x54,0x77,0xA9,0xBB,0xF8, +0xAB,0xF9,0x24,0x75,0x26,0xA9,0x6E,0xFC,0xA4,0x71,0x1F,0xD9,0xA1,0x0E,0xC2,0xB5, +0x02,0xFE,0x87,0x6B,0xE5,0x40,0x1B,0x5C,0x5B,0x26,0xD4,0x7D,0xA9,0x81,0xE4,0x0C, +0x52,0x6D,0x44,0xE1,0xCC,0xCD,0x56,0x0B,0x50,0x4B,0x33,0xE7,0xFA,0x91,0xD8,0xB2, +0x79,0x86,0xAE,0x98,0xB3,0xFC,0xAE,0x21,0x23,0xC2,0x7E,0x98,0xC8,0x0A,0xE1,0xAE, +0x0B,0x3D,0x0F,0x3D,0xB8,0x7A,0xD0,0x63,0x23,0x18,0xBF,0x1A,0x0D,0xFC,0xEA,0x14, +0x8C,0x81,0xD9,0x21,0x9A,0x8F,0x45,0x57,0x4F,0x15,0x14,0x45,0xD0,0x25,0xF8,0x58, +0x04,0x03,0x66,0xB6,0xD1,0x9C,0xA0,0x26,0xEF,0xCA,0x68,0x3E,0xDA,0x78,0x9B,0x70, +0x47,0xE3,0x10,0x3E,0xBA,0x45,0xC8,0x5B,0xBE,0xA5,0xE1,0xD4,0x72,0xB8,0x27,0xE1, +0xD4,0x88,0xE8,0x03,0x9D,0x24,0x97,0x1B,0xC1,0x01,0x6B,0x56,0x52,0xC5,0x7A,0x9A, +0xFC,0x21,0x52,0x1D,0xCB,0x24,0xB2,0x64,0x8C,0xEC,0x13,0xB2,0x2E,0xA4,0xF8,0xCC, +0xA8,0xD1,0x47,0x7C,0xD9,0xB8,0xE7,0x7C,0xE9,0xB0,0x03,0xCD,0x21,0xCC,0xC7,0x80, +0x89,0xA5,0xC2,0x88,0x49,0xD9,0xA0,0x31,0x13,0x49,0x76,0x97,0xCB,0x56,0x90,0x3B, +0x4E,0x1C,0x9F,0xCE,0xAF,0x0F,0x69,0x52,0xE6,0xA9,0xAF,0x19,0xFE,0x68,0x9B,0x13, +0x2E,0xE5,0x07,0x00,0x7B,0xD5,0x77,0xFE,0xEE,0x5C,0xDF,0x81,0x4B,0x47,0x8E,0x9D, +0x3E,0x63,0xCC,0xC8,0xA5,0x03,0xFB,0x9E,0xFB,0xDD,0x5D,0x4F,0xF2,0x19,0xD5,0x95, +0x2B,0xCF,0x9E,0x5E,0x5E,0x3D,0x7A,0xE9,0xCF,0x2F,0x3C,0x99,0x92,0xF6,0xE4,0x9A, +0x9F,0x97,0x8E,0x7E,0x6A,0xC5,0xE9,0xEF,0x9E,0xB9,0x87,0xE2,0x83,0x88,0x6A,0x06, +0xD9,0xA6,0xCF,0xA0,0x7E,0x8A,0xB6,0xF3,0xC0,0x31,0xC2,0x42,0xC4,0x1A,0x35,0xC3, +0xC8,0xFD,0xCC,0x7E,0xD3,0x6C,0xBE,0xB9,0xCC,0x1F,0x93,0xCE,0xB2,0x31,0x70,0x95, +0xB4,0xF9,0x82,0x4E,0x69,0x09,0x29,0xD9,0x66,0xD4,0xAB,0x22,0x22,0x9D,0xAF,0x98, +0x0B,0xF3,0x75,0x6A,0xF3,0x4D,0x47,0x5A,0xD1,0xE1,0x7C,0x53,0x68,0x58,0xDE,0xE9, +0x52,0x2C,0x5E,0x9C,0xAF,0x4E,0x9B,0x6E,0x59,0x09,0xC1,0xA9,0xD1,0xF5,0x4D,0x8A, +0x4F,0x97,0xCE,0xBF,0x08,0x80,0xB8,0xF2,0x89,0x1B,0xC7,0xCC,0x98,0x31,0xE6,0xC6, +0x27,0xAE,0xEC,0x77,0xEE,0xE5,0xBB,0x9E,0xEC,0xDB,0xF7,0xC9,0xBB,0x5E,0x3E,0xD7, +0x6F,0xCF,0xC8,0xEA,0x9F,0xD7,0x3C,0x99,0x96,0xF2,0xE4,0x0B,0x3F,0x3F,0x39,0xAA, +0x7A,0xF9,0xE9,0xB3,0x2B,0x2B,0xAB,0xEF,0x79,0xE6,0xBB,0xD3,0x2B,0xD0,0xC7,0x43, +0x8E,0xE9,0x4E,0x09,0xDD,0xB8,0x0C,0x90,0x1E,0x72,0x5A,0x50,0x11,0x85,0xFA,0x5A, +0xAB,0x98,0x66,0xA4,0x01,0x16,0x0C,0x6C,0x60,0x18,0x83,0x53,0xAC,0x98,0x1E,0x46, +0x9C,0xE5,0xF1,0xA4,0x17,0x5F,0x12,0xFE,0x8B,0x5B,0xDA,0x05,0xF9,0xF8,0x0F,0x20, +0x39,0x79,0x7B,0xED,0xAD,0xD3,0x97,0x9B,0x75,0x46,0xFB,0xF3,0x15,0x23,0x7F,0x37, +0x05,0x3F,0x3D,0x6D,0xD1,0x19,0x1C,0xCF,0x57,0x8C,0xDE,0x4A,0x8E,0x45,0xAE,0xFB, +0xCD,0x65,0x22,0x2F,0xE8,0xFA,0x0E,0x19,0x11,0xB9,0x6E,0x60,0x6F,0x7A,0x78,0x2D, +0xAB,0xC3,0x52,0x97,0xF0,0x1C,0xD0,0x20,0xE6,0x28,0xC1,0x6E,0x42,0xF1,0xAE,0xE8, +0xB5,0x2C,0x25,0x1D,0xCB,0x52,0x72,0xD0,0x2C,0x25,0x51,0x2B,0xC1,0x82,0x45,0x70, +0x87,0xDD,0x20,0xB5,0x41,0xF9,0x26,0xA5,0xDE,0x0D,0x9E,0xBA,0x3A,0x92,0x4A,0x6E, +0x53,0x9F,0x6F,0x9C,0x29,0x7E,0xC4,0xF2,0x9E,0xB6,0xAA,0x07,0xC5,0x80,0xEE,0x59, +0x2E,0x15,0xF8,0xDC,0x7D,0x2C,0x8B,0x4E,0x4E,0x0E,0x2B,0x76,0x50,0x18,0x32,0x43, +0x11,0xAF,0x9D,0x16,0x2E,0xF9,0x4C,0x9A,0xC2,0x2B,0x84,0x15,0x9B,0x9E,0x26,0xD4, +0xE8,0x69,0x2E,0xA5,0x9E,0x8A,0x89,0x1C,0xE6,0x09,0xB2,0x53,0xD9,0x89,0x4A,0x90, +0x90,0x19,0x0A,0x45,0x93,0x68,0x06,0xBD,0xA2,0xB3,0x81,0x86,0x11,0x40,0xFC,0xD8, +0xBD,0x12,0x26,0x52,0xCA,0x36,0x29,0xC2,0x61,0xE1,0x0C,0xA6,0x95,0x81,0x16,0x4C, +0xF5,0x8B,0x32,0x29,0xEC,0xD6,0xEA,0x66,0x84,0xBE,0x04,0xF1,0x65,0x00,0xB0,0xF3, +0x39,0xAD,0x70,0x66,0x2B,0x31,0xFD,0x6B,0x32,0x19,0xBC,0x78,0xE0,0xD5,0x8F,0x0F, +0x24,0x57,0x2E,0x1E,0x34,0x60,0xF1,0xB5,0x93,0xFF,0xA5,0xFE,0xFB,0xC0,0xC6,0xE5, +0xCB,0x37,0x82,0xA6,0xC1,0x93,0x50,0x12,0xA6,0x0E,0x88,0xFE,0xAC,0xAD,0x9D,0x0B, +0x85,0x86,0xF5,0xBA,0xC2,0x82,0x9A,0xCC,0x80,0x41,0xFD,0x3B,0xC9,0xF6,0xC0,0x66, +0x27,0x3B,0x3F,0x93,0x84,0xD1,0xAE,0xCF,0x60,0x2D,0xE7,0x03,0x3F,0x9A,0xA0,0x3B, +0x0B,0xD6,0xFF,0x8C,0x58,0xD6,0x98,0x11,0xB4,0xF4,0x50,0xC4,0x4C,0x13,0x19,0x0C, +0xF5,0x51,0x51,0xC7,0x99,0x6D,0x45,0x58,0x46,0x84,0xE5,0x45,0xBE,0x10,0x75,0x03, +0xF0,0x14,0xBD,0x29,0x34,0xCC,0x13,0x49,0xE1,0x71,0xEE,0x29,0x69,0x18,0xDB,0x4F, +0x41,0xDC,0xF0,0x29,0x78,0x82,0xE7,0xF0,0x04,0x0F,0x28,0x41,0x07,0x01,0xA7,0x48, +0x3A,0x2A,0x86,0x64,0x33,0x86,0x7F,0x68,0xDE,0x19,0xC8,0xA0,0x70,0xA9,0x33,0x41, +0xBE,0x33,0x03,0xDB,0xEF,0x9D,0xFF,0xCD,0xC1,0x83,0x27,0xBE,0xEA,0xF3,0xCC,0x75, +0x43,0x1E,0xEF,0xB3,0xE2,0x1E,0xB2,0x48,0x7D,0x80,0x2F,0xAE,0x21,0x47,0xAB,0xBF, +0x25,0xBA,0xFF,0xC9,0xCA,0xD8,0xDE,0xB9,0xF3,0xF3,0x7F,0xFA,0xA8,0x5A,0x0D,0xD6, +0x30,0x79,0x59,0xC1,0x0D,0x17,0x77,0x8B,0x11,0x9A,0xF9,0x78,0x17,0x27,0x67,0x05, +0x31,0xC7,0x51,0x2E,0x06,0x5E,0xAA,0xA5,0x3A,0x8A,0x27,0xA2,0xB9,0x16,0xAE,0x40, +0x2C,0xC2,0xE4,0x2D,0xB0,0xAA,0x71,0x2D,0xE0,0x13,0x4D,0x6A,0xCC,0xA5,0x39,0xC5, +0x06,0xC0,0x7E,0xA1,0x54,0x6B,0x76,0xA6,0x53,0x4D,0x24,0xC9,0xA5,0xB8,0x53,0x50, +0x4B,0x29,0xC0,0x52,0xA7,0xF4,0x1C,0x4C,0x6D,0x04,0x3D,0xC5,0xE0,0x4E,0xC1,0xAB, +0x36,0x97,0x62,0xA6,0x64,0xDD,0x8F,0xE9,0x27,0x65,0x05,0x65,0xCC,0x3C,0xF1,0x95, +0xF9,0x0C,0xAC,0xCA,0xC9,0x67,0xA0,0x55,0x29,0xF9,0x05,0x86,0x44,0xDD,0xB0,0xE2, +0x83,0xBC,0xBC,0xFC,0xFC,0x0F,0x2A,0x3F,0x28,0xBB,0xA7,0xFF,0x65,0xB3,0xFB,0x7C, +0x30,0xEB,0xFD,0xBC,0xDC,0xFC,0x4E,0x47,0x67,0x7D,0xD0,0xFB,0x9E,0x3E,0xBD,0xEE, +0xEF,0xF3,0x81,0xFC,0xC2,0xCC,0x99,0x6B,0x9E,0x9F,0x75,0xF7,0xDA,0xB7,0xDF,0xEF, +0x7B,0x6F,0xAF,0xFE,0xF7,0xF4,0x7C,0xBF,0xF2,0x83,0x02,0xF8,0xCA,0xD1,0xCA,0xF7, +0x7B,0xDF,0xD7,0xB7,0x5F,0x65,0xF9,0x07,0x33,0x3F,0xE8,0x94,0x9F,0x97,0xF7,0x01, +0xDF,0x6D,0xD6,0x9A,0x17,0x66,0xDE,0xBD,0x7A,0x35,0xE5,0xC5,0xC3,0x61,0x0D,0x0F, +0xE8,0x8E,0x73,0xC9,0xDC,0x83,0x4C,0x8F,0x89,0xF9,0xD3,0xA3,0x92,0xCB,0xC1,0xD9, +0x50,0x5D,0x88,0x4A,0xAC,0x9A,0xC9,0x1A,0x8A,0xFA,0x92,0xE8,0x39,0x43,0x38,0xEA, +0x63,0xE7,0x74,0xB0,0xA4,0x29,0xB4,0xCE,0xC3,0x1D,0x52,0xEC,0x98,0xAF,0x12,0x8A, +0xD8,0xA9,0xD1,0x6E,0xB7,0x9A,0xB0,0xE4,0x23,0xE2,0xA0,0x64,0xEF,0xC0,0x5A,0xB0, +0xA4,0x10,0x35,0xE5,0xEC,0x0E,0xCD,0x33,0xEF,0x4B,0x6A,0x26,0x46,0x60,0xF9,0x0C, +0x5E,0xE6,0x24,0x01,0x5E,0x5F,0x5A,0x00,0x6F,0xC3,0xF7,0x90,0x2A,0xF2,0xC0,0x5B, +0xEA,0x7E,0x62,0x54,0x5F,0x1B,0x41,0xD6,0xA9,0x13,0x0F,0xAB,0xE3,0xC9,0xFA,0x11, +0x6A,0x94,0x18,0x75,0xC7,0x1B,0x07,0xF2,0xBB,0x1B,0xB7,0x57,0x3D,0x1F,0xAE,0x52, +0xCB,0xC9,0xC1,0xAA,0xF0,0xF3,0x55,0x74,0x4D,0x81,0x9F,0x6E,0x20,0xDB,0x60,0x1F, +0xA2,0x0D,0x9F,0xC1,0x25,0x9A,0xEC,0x16,0x66,0xB2,0xC7,0x0B,0x1E,0x91,0xAF,0x0A, +0x8C,0xB7,0xD6,0xD4,0xA8,0x1B,0xF8,0x9F,0x1A,0xCD,0x22,0x87,0xEF,0x94,0x36,0xC6, +0x5D,0xEC,0x23,0x60,0x0C,0x30,0xC4,0xF5,0xE5,0x9E,0xE0,0xB4,0x6A,0x25,0xA0,0xE3, +0x40,0x50,0x29,0x44,0x06,0xDB,0x8F,0xEE,0xD5,0x30,0xDE,0x14,0x53,0x9E,0xD0,0xD0, +0x0B,0x3B,0x95,0x72,0x34,0x4D,0xE1,0x5C,0xAA,0x53,0xCE,0xC6,0xD3,0xC5,0x66,0x4A, +0x4F,0xC0,0x84,0x95,0xFE,0x98,0x45,0xA2,0xC7,0x08,0x6D,0x7E,0x41,0x37,0xA4,0x86, +0x62,0xE9,0x75,0xA7,0xC9,0x17,0x28,0xEC,0xDA,0xE3,0x32,0xFC,0x98,0xED,0xAA,0xB5, +0x25,0x5B,0x33,0xA8,0x9B,0xA6,0x30,0x00,0xC8,0xC9,0x07,0x96,0x2C,0xBD,0xA6,0xB7, +0x65,0x17,0xB0,0x2F,0x98,0x5C,0xED,0x97,0x35,0x01,0x7F,0x64,0xF4,0x13,0xD3,0x71, +0xE3,0xA1,0x40,0x54,0x85,0xCB,0x3C,0x68,0x06,0x63,0xFA,0x9B,0x9D,0x8C,0xBB,0x79, +0x6C,0xEF,0xDE,0x87,0x36,0x0F,0x7E,0xEE,0xBA,0x1B,0xAA,0x7B,0xDE,0x7A,0xD7,0xFB, +0xA9,0xF6,0x63,0x0B,0xC7,0xDD,0xDC,0xB7,0xFC,0xDD,0x57,0x07,0xAF,0x1E,0x3D,0x6A, +0x45,0xAF,0xC9,0x33,0x4F,0xA7,0x9C,0x78,0x78,0xC3,0x92,0xF3,0xFD,0xFA,0x56,0xFF, +0xD4,0xAF,0x2F,0x7F,0x6C,0x6C,0x75,0xB7,0x2E,0x77,0xFF,0x66,0xC1,0xBA,0x8C,0x8C, +0x8D,0x05,0x05,0xC3,0xAE,0x1A,0x53,0xE9,0x30,0xDE,0xB7,0xFA,0xB6,0x31,0x4F,0x94, +0x76,0x9F,0xD6,0xFF,0xC9,0x2D,0xF4,0xEC,0x88,0x21,0x93,0xAB,0xEC,0xF7,0x3F,0xF7, +0xE8,0x90,0x47,0x17,0x15,0x8F,0x2D,0xB9,0xE6,0xF1,0x47,0x4B,0xC6,0x50,0x1C,0x7E, +0xA4,0xBB,0x52,0xE8,0xAC,0x77,0xD2,0xB5,0xA0,0x51,0x0F,0x59,0x0C,0xA3,0x53,0xBD, +0x13,0x25,0x1E,0xED,0x28,0x5E,0x94,0xEA,0x68,0x2A,0x4A,0x75,0xC4,0x8B,0x52,0x81, +0xE1,0x62,0x9E,0xE9,0x47,0x75,0xBB,0xEB,0x74,0x57,0x1E,0x81,0xFF,0x40,0x7D,0x20, +0x69,0xA0,0x0B,0x7E,0xAE,0x7B,0x0F,0x24,0x66,0x90,0x1B,0xCC,0x3D,0xC6,0x7C,0x76, +0xD1,0x4C,0x91,0x73,0xC3,0x8D,0xAF,0x0A,0x46,0xFB,0x33,0xFA,0xEC,0x15,0x8C,0x86, +0xD9,0x51,0x61,0x30,0xAA,0xA7,0x57,0x89,0x7C,0x35,0xF5,0xE5,0x27,0xB3,0xAA,0xA4, +0x64,0xA7,0xD2,0x15,0xC6,0xEB,0x03,0x2B,0xD6,0xC7,0x89,0x7E,0x05,0xCC,0x42,0x44, +0x66,0x7B,0x0D,0x6E,0xF0,0x3E,0x92,0xEB,0x75,0x57,0xA6,0xBE,0x30,0xDC,0xE3,0x8A, +0xAB,0xE8,0xB2,0xF4,0xBF,0x0A,0x96,0x65,0x60,0xB9,0xDC,0x4B,0xDA,0x6E,0x4D,0xCE, +0xED,0xCA,0x95,0x5D,0x81,0xEB,0x12,0x76,0xC9,0x3D,0x50,0x4B,0x88,0xE7,0x1F,0xB2, +0xA2,0xA9,0x58,0x5A,0x21,0x22,0x9F,0x39,0x2C,0xD9,0x12,0xD0,0x15,0x33,0xD8,0x89, +0xAF,0x85,0x7D,0x12,0x17,0x6F,0xF9,0x24,0xED,0xAE,0x69,0xD3,0x88,0xE1,0xD9,0x67, +0x89,0x61,0xDA,0xB4,0xBB,0xE0,0x58,0x3D,0xF7,0xEC,0xB3,0xEA,0x39,0x38,0x9E,0x34, +0xBE,0xA2,0xE2,0xB3,0x85,0x8F,0x9C,0xA9,0xB8,0xF9,0xE6,0x8A,0x71,0x15,0x67,0x1E, +0x59,0xF8,0x59,0x45,0xC5,0xF8,0x83,0x17,0xFE,0x3C,0xF8,0xF1,0x01,0x97,0x2F,0xB8, +0x7C,0xE5,0xCB,0xAF,0x3C,0xDF,0xFF,0xC1,0xCB,0xAF,0x58,0x7C,0xE5,0x9F,0x2F,0xF0, +0x9F,0xAF,0x26,0xFA,0x69,0xD3,0xA6,0x4F,0x87,0x5F,0x9F,0x5F,0xFD,0xAC,0x7A,0x81, +0x1D,0x13,0xDD,0xB3,0xF3,0xCF,0x54,0x54,0xDC,0x72,0x4B,0xC5,0xCD,0x9F,0x2D,0x7C, +0xF4,0xCC,0xCD,0x15,0xF8,0xDF,0xE7,0x0B,0x8E,0x7E,0x9F,0x9E,0x36,0xDF,0x9F,0xFD, +0xFB,0x17,0xD6,0x6D,0xCB,0xCA,0x99,0x97,0x91,0x8E,0xA9,0x35,0xB0,0x6A,0x95,0xE4, +0xB8,0xD0,0x1B,0xF6,0x40,0x2A,0x97,0xC9,0x75,0xE6,0xAA,0x81,0x47,0x60,0x5C,0xC6, +0xC8,0x70,0x9A,0x16,0x8C,0xA6,0xB3,0xA3,0xE4,0x60,0x34,0x87,0x1D,0x15,0x04,0xA3, +0x82,0x56,0xF1,0x58,0x48,0xF1,0x9C,0xC5,0xB8,0x67,0x96,0x16,0xD8,0xC8,0x03,0x71, +0xE6,0x66,0xA7,0x32,0x42,0x11,0x0F,0xCD,0x25,0xF5,0x00,0xFB,0x57,0x8A,0xE0,0x6A, +0x56,0x5B,0x91,0x8E,0x9C,0x64,0x38,0xE9,0x71,0xB3,0x54,0xF1,0xC4,0x88,0x07,0xDD, +0x08,0xBD,0x9B,0xD5,0xBA,0xA0,0xF3,0x84,0xD9,0x26,0x34,0xC3,0xB7,0x29,0xDE,0x51, +0xF9,0xD6,0xEE,0xED,0xB3,0x67,0xF7,0x7D,0x7C,0xE0,0xE0,0x65,0xBF,0x79,0xBD,0x76, +0x65,0x97,0xA7,0x6E,0x7E,0xF8,0xD9,0x64,0x5E,0x6E,0xAC,0x9B,0x30,0x7C,0xEA,0x82, +0x79,0x2F,0x3E,0x24,0x44,0x16,0xFD,0x56,0x1C,0x3B,0x36,0x27,0x67,0x5E,0x7A,0xBA, +0x5C,0xAB,0xF6,0xBF,0xBB,0xDF,0xC0,0x45,0xEA,0x8A,0xAA,0x2A,0x52,0xDF,0xFF,0xDA, +0xA7,0x66,0x65,0x5C,0xC1,0x6A,0xA0,0x97,0x8A,0x79,0x62,0x00,0xEC,0x18,0x5B,0x3C, +0x0B,0x59,0x60,0x7F,0xD6,0x92,0xE3,0xEA,0x31,0x52,0x1C,0x60,0x7F,0xF8,0xE0,0x70, +0xB2,0xE1,0x2D,0xF5,0x07,0xF5,0x87,0xB7,0xC8,0x86,0xF8,0x21,0x8B,0x71,0x91,0x2C, +0xD0,0x7F,0x2A,0x40,0xEF,0xE8,0x1A,0xCB,0x4E,0x06,0x35,0x1B,0x91,0xC0,0x51,0xF9, +0xAF,0xA7,0x99,0x50,0xC0,0xA1,0x22,0xA2,0x40,0xD5,0x35,0x2E,0x9E,0x47,0x84,0xF5, +0x69,0x01,0xE9,0xA4,0x8E,0xDF,0xC2,0x47,0x6B,0x40,0x61,0x5F,0xC9,0xFD,0x57,0xB5, +0x64,0x62,0xB3,0x3D,0x74,0x05,0x58,0x8B,0xBF,0x6B,0xBE,0x8B,0x2E,0x0F,0x46,0x07, +0xD2,0xA3,0xC8,0xE5,0x03,0x11,0x94,0xCB,0xBB,0x02,0x0F,0xBF,0x2C,0x24,0x0F,0x09, +0x46,0x43,0xEC,0x1B,0x09,0x7B,0xEA,0xDA,0xD6,0x7B,0x2A,0x7A,0x05,0x5B,0xE6,0x81, +0x21,0xF9,0x0A,0xA7,0x32,0x08,0x4E,0x94,0xB2,0xEC,0xDF,0xD2,0x66,0xFB,0x0C,0xB3, +0x7D,0x07,0x5D,0x21,0xB9,0xA2,0xAE,0xCC,0x42,0x7D,0x4F,0xDC,0x4D,0xA5,0x92,0xDC, +0xA7,0x5C,0xCE,0x75,0xC9,0x97,0xC1,0xEA,0x0F,0xBC,0x1C,0x2E,0xC1,0x56,0xEB,0xC9, +0xE1,0xA5,0x21,0x92,0x5C,0xFA,0x1F,0x6C,0x34,0xD2,0x94,0x67,0x9A,0x45,0x02,0x05, +0xCD,0xF3,0x43,0x7E,0xE5,0x5E,0x23,0xC3,0x48,0x86,0xBC,0xED,0xF6,0xF1,0xC9,0x57, +0x94,0x2C,0xDE,0x3A,0xBF,0xF7,0xE0,0x1E,0x97,0x57,0x4D,0x1F,0x35,0x7A,0x5A,0xD5, +0xAF,0xDA,0x6E,0x8D,0x5F,0x0B,0x03,0xEF,0x7B,0x60,0xE4,0xDD,0x92,0xF1,0xDA,0xC1, +0x9F,0x1C,0x1D,0x1F,0x56,0xD7,0x90,0xC3,0x7D,0xAF,0x19,0xD2,0x8F,0xD2,0xC8,0x71, +0xDD,0x04,0xA1,0x48,0xF7,0x53,0xD3,0x9A,0xEA,0xEA,0xF1,0x95,0xB8,0xA6,0x86,0x66, +0x6B,0x7A,0x9C,0x1F,0xA9,0x9B,0xB0,0x82,0xD6,0xDB,0x1E,0x10,0x66,0x0B,0x7D,0x60, +0xBF,0xDA,0x61,0xC7,0x5E,0xC3,0xB1,0x84,0x95,0x64,0x6A,0x04,0x45,0x5D,0xDA,0xB6, +0x4C,0xA3,0x4B,0xE5,0x60,0xF9,0xD7,0x0E,0x27,0x3A,0x1C,0x30,0xB3,0x09,0x33,0xAF, +0xD3,0x61,0x2D,0xA8,0x2F,0xD0,0x4A,0xDD,0x82,0x98,0x4D,0xA4,0x98,0x12,0x4A,0x8A, +0x7D,0x31,0xD9,0x92,0x58,0x87,0x70,0x60,0xC7,0xA3,0xFD,0xEF,0x2D,0x2A,0x29,0xD9, +0xF9,0xD8,0xA2,0xE8,0xBC,0xE9,0xC3,0x86,0x4D,0x9F,0x71,0xDD,0xB0,0xE9,0xA2,0xFC, +0xD8,0xAE,0x6E,0x25,0xC5,0xB3,0x2E,0x7F,0xE4,0xF5,0xE8,0xA2,0xEB,0xA6,0x4D,0xBB, +0xEE,0xBA,0xBB,0x67,0xD0,0xFC,0x7C,0xAD,0x76,0x53,0x00,0x0B,0xF3,0xD6,0x04,0xAD, +0x11,0xAC,0x1E,0x4B,0x18,0x73,0x3F,0x51,0x83,0x10,0x69,0xF2,0x88,0x68,0x07,0x75, +0xB0,0xA9,0x5D,0x00,0x75,0x92,0xDB,0xA9,0xEE,0x68,0xB3,0xA0,0x6A,0x1E,0xB1,0x51, +0xD5,0xC2,0x26,0x50,0x03,0x2E,0x62,0xA7,0x5A,0xB4,0x1D,0x6B,0xE4,0x40,0xD4,0x4B, +0x5A,0x7D,0x02,0x4D,0xF3,0x6F,0x2A,0xEB,0xC4,0x74,0xFF,0x58,0x69,0x67,0x4D,0x0D, +0xFF,0x51,0x0D,0x59,0xA8,0xCE,0xAD,0x51,0xE7,0x92,0x85,0x80,0xF7,0x0A,0x7E,0x0D, +0x1F,0xA5,0x75,0x1F,0x37,0x36,0xE7,0x73,0x5C,0x30,0x9A,0xA4,0x21,0x2F,0x05,0xCD, +0x83,0xA8,0x8B,0x51,0x36,0xB6,0x33,0xA0,0x6E,0x1C,0x1D,0x8E,0x6A,0xA1,0xEA,0x0D, +0xA7,0x24,0x69,0x95,0x79,0x46,0x29,0x16,0xD3,0x72,0x68,0x62,0xBB,0xB4,0x47,0x19, +0xD7,0x9C,0x5B,0x79,0x88,0xDE,0xE0,0xF7,0x56,0xE4,0xF4,0x23,0xA3,0xA7,0xDE,0xD8, +0xFD,0xC1,0x41,0xD7,0x3E,0x5A,0xBE,0x6C,0x9B,0xFA,0x5A,0xCF,0x2C,0xB2,0x85,0x5F, +0x33,0x3D,0xAB,0x27,0xE9,0x56,0x71,0xF9,0xF5,0x81,0x40,0x55,0x7A,0xFA,0x23,0x77, +0x2D,0x51,0xFF,0xDE,0x35,0x6D,0x16,0xC0,0x39,0x81,0x5F,0xCA,0xBF,0x47,0xEB,0xF1, +0xFE,0xC4,0xC5,0xCA,0xF0,0xA2,0x6E,0x06,0xAA,0x56,0x89,0xA7,0xC1,0x2B,0xE7,0x07, +0xA3,0x22,0x3B,0xB2,0x04,0xA3,0x56,0x6D,0xAF,0xD2,0xAA,0xBC,0x68,0x80,0xCD,0x01, +0x0B,0xF3,0xB0,0x7C,0x1F,0x75,0x5A,0xAD,0x20,0xCF,0x36,0x6B,0xDF,0xF4,0x16,0x05, +0x79,0x5E,0x56,0x90,0xE7,0x3D,0xB7,0xCB,0xA6,0xEE,0x7B,0xE2,0xFF,0x6F,0x41,0x9E, +0xBB,0x83,0x82,0xBC,0xA4,0x44,0x05,0x67,0x42,0xF7,0xFB,0xAE,0x98,0x76,0xFF,0x8C, +0xBB,0x46,0x56,0x54,0xDC,0x3A,0xE9,0x96,0x4E,0x93,0xAF,0x1F,0xFC,0x70,0xD9,0x53, +0xBF,0x1B,0x33,0x7C,0xDC,0x6D,0x7B,0x94,0xF2,0xB9,0xFC,0xF6,0x07,0xD2,0x52,0xAF, +0xBB,0xF2,0xEA,0x21,0x77,0xF5,0xBB,0xAC,0x57,0x1F,0x97,0xAF,0x52,0x72,0xDD,0x3B, +0xF1,0x37,0xE3,0x5D,0xAE,0x69,0xC3,0xE7,0x3C,0xE6,0x45,0x1B,0xBA,0x52,0xFC,0x56, +0x18,0x4E,0x63,0xFD,0xD9,0xB4,0x96,0xB7,0xDD,0x58,0x7F,0xD7,0x6E,0xA8,0x9F,0x92, +0x4A,0x92,0x7C,0x50,0xDD,0x25,0x7E,0x8B,0xF9,0x85,0xB8,0x4F,0xB7,0xA9,0x23,0xC5, +0xCF,0xC1,0x86,0xCC,0xE6,0x6E,0xE3,0x22,0xE9,0x68,0xED,0x25,0x85,0xD1,0xCF,0x86, +0xCE,0x85,0x74,0x9A,0x0A,0x95,0x0E,0x74,0x11,0xF3,0xBA,0xC5,0x12,0xE6,0xB3,0x59, +0x3C,0x20,0x5B,0xCB,0x65,0x32,0xB3,0x3C,0x79,0x53,0x36,0x10,0x4D,0x3A,0xE2,0x42, +0x49,0xA2,0xD6,0x83,0x1E,0xEB,0x81,0xDC,0x29,0x59,0xE5,0xCC,0x19,0xE1,0x6A,0xE9, +0x82,0x4B,0xD4,0x16,0x34,0x7B,0x41,0xDA,0xB6,0xE3,0xB7,0x8B,0x56,0xAC,0xDC,0x11, +0xC8,0x33,0x65,0xA7,0x77,0x1E,0x1C,0xF8,0xCD,0x70,0x47,0x68,0xD9,0x84,0xC9,0xD5, +0x85,0xE8,0xF6,0x6E,0x1C,0xB4,0x6C,0xC5,0x96,0x2D,0xFC,0xD2,0x86,0x0D,0x97,0x95, +0x5B,0xAC,0x2B,0x7C,0x49,0x43,0x87,0x5D,0x77,0xDD,0xD0,0xA1,0x8D,0x1F,0x31,0x9F, +0xCC,0xDA,0x8B,0xBD,0xC5,0x72,0xB0,0x03,0x6C,0x31,0xAE,0xA1,0xD1,0x7E,0xC4,0x48, +0xC5,0x90,0xD1,0x6C,0x62,0xCA,0xBE,0x1D,0x0B,0xAA,0x35,0x76,0x21,0x9B,0x9C,0x51, +0x8E,0xF2,0x22,0xD4,0xEB,0x4C,0xD4,0xD7,0x16,0xD5,0x31,0x4E,0x12,0xAB,0x47,0xCF, +0x0D,0xE3,0xBE,0xC3,0x7F,0x25,0x64,0x2D,0x11,0x3F,0x22,0x7B,0x97,0xEE,0x79,0xF2, +0xA3,0xAF,0xC5,0xE0,0x9E,0xAF,0xCE,0x4D,0xD6,0x67,0x9D,0xFB,0x54,0x18,0x2A,0x61, +0x4C,0xE9,0x14,0x3F,0x88,0x6C,0x13,0xAE,0x6C,0xE2,0x79,0xA6,0xFA,0xF6,0x0B,0x9A, +0xDD,0xB4,0xA0,0x99,0x1F,0x84,0x66,0x37,0xAC,0x63,0x40,0x9D,0xCD,0xEF,0x83,0x23, +0x37,0xC6,0xF5,0x31,0x02,0x02,0x9C,0x22,0xAE,0x84,0x78,0x30,0x3B,0x2D,0x6A,0x63, +0x50,0x61,0xE4,0xC5,0xA6,0x97,0x58,0x81,0x8D,0x80,0xA9,0xDB,0x6E,0xEC,0x15,0xA0, +0x70,0xB4,0x7C,0x52,0x17,0xA3,0xBB,0x82,0x70,0x5C,0x87,0x06,0xC4,0x5E,0x1D,0xEC, +0x7D,0x59,0x51,0xF1,0x7D,0x65,0x3D,0xEE,0xBF,0xB7,0x64,0x54,0xD1,0x59,0xC9,0xD1, +0xB5,0x24,0x73,0x54,0x9F,0xBE,0xB7,0x77,0xBD,0x69,0xAC,0xD5,0x8A,0xB8,0x5B,0x0C, +0x7C,0xE3,0x6D,0xDD,0x27,0x9C,0x99,0x1B,0xC9,0xB1,0x7C,0x27,0x43,0x30,0xC6,0x3A, +0xC4,0x10,0xA5,0x2C,0x0D,0x18,0x5A,0x47,0x1C,0x15,0x29,0x30,0xBF,0xAA,0x94,0xB8, +0x0C,0xBD,0xF4,0x7E,0xB0,0x7A,0x17,0x7F,0xB1,0xF8,0xBD,0xC6,0x8F,0xDE,0xD5,0x0D, +0xBC,0xA7,0xA0,0xB1,0x68,0xFA,0x74,0x7E,0x22,0x60,0x6C,0x3C,0xE8,0x68,0x93,0x68, +0x7E,0xAD,0x03,0x6C,0xF1,0xA9,0xDA,0xFA,0xA5,0x68,0x56,0x5B,0x30,0x6A,0x63,0x47, +0xA6,0xA0,0xC6,0x24,0xB4,0x60,0x3C,0x96,0xE0,0x50,0x0E,0xC0,0x0A,0x75,0xF4,0x8C, +0x07,0x60,0x3C,0xDE,0x19,0xAF,0x5B,0x4B,0x92,0x68,0x84,0x08,0x8B,0xD6,0x58,0x54, +0x3E,0xC5,0xDD,0x66,0x97,0x89,0x26,0x6D,0x8B,0xED,0xD6,0xF1,0x1F,0xD6,0xD6,0xBE, +0xFF,0x7E,0x6D,0xED,0x87,0x45,0xA0,0x63,0xED,0x9B,0x37,0xF5,0xF6,0xB9,0x73,0xEE, +0xB8,0xFD,0x21,0x71,0xC4,0x5B,0xA7,0x4F,0xBF,0xF5,0xD6,0xA9,0x8F,0xD5,0x7E,0x55, +0x55,0xFC,0xBC,0x47,0xD7,0xAF,0x7F,0x74,0xF1,0xFA,0x17,0xB5,0xB8,0xEB,0x52,0x71, +0x50,0x4C,0xB7,0xD2,0xAA,0xAE,0x04,0xF6,0x67,0x1F,0x29,0x06,0xA5,0xEA,0x78,0x80, +0xFD,0x59,0xFA,0x16,0xB1,0x12,0xEB,0x5B,0x6A,0xC5,0x70,0xB5,0x22,0x7E,0x88,0x34, +0x2C,0x72,0x8B,0x2F,0x9E,0x31,0xCC,0x03,0x3C,0x98,0x41,0xFA,0xA5,0x70,0xE9,0xC8, +0x1D,0x2D,0x48,0x0D,0xBE,0x70,0xC4,0xCA,0x2A,0xDD,0xA3,0x8E,0x54,0x8B,0x15,0x0C, +0x58,0x77,0x38,0xD6,0xA2,0xC3,0x1B,0x8A,0xA4,0x52,0x7B,0x35,0x15,0x2C,0xD4,0xA8, +0xC1,0x48,0x2F,0x83,0x89,0x62,0xA0,0x97,0x15,0x62,0xC5,0x22,0xF0,0x28,0xA7,0xE1, +0x2D,0xE3,0x17,0xAE,0x9F,0x2C,0xD2,0xEC,0x55,0x39,0x0D,0x4C,0x66,0xB6,0x55,0x5C, +0xA1,0x88,0x8F,0x96,0x13,0xF8,0xBC,0x26,0xE4,0x94,0x78,0x98,0xEC,0x80,0x95,0xC6, +0x60,0x91,0x68,0x8A,0xD5,0xC6,0x44,0xAD,0x36,0xBB,0xC4,0xE2,0xF4,0x86,0x54,0x38, +0xE9,0xA4,0xF9,0x0F,0xE9,0xE5,0x6D,0xD2,0x02,0x66,0x40,0xE5,0x69,0x25,0xBF,0xDE, +0x40,0x69,0x9E,0x3F,0x46,0x1D,0x23,0x85,0x8D,0xEB,0x1B,0xC6,0xF1,0x77,0x91,0xC7, +0x37,0x2F,0x5A,0xF4,0x94,0x5A,0x47,0x4A,0x9B,0xE8,0xE5,0xFC,0xBD,0xD8,0xAB,0xE3, +0xA3,0x07,0x78,0x67,0xE3,0xDF,0xA7,0xED,0xDA,0x35,0x8D,0xBC,0x44,0xF5,0x7C,0xC4, +0x5D,0x3F,0x0D,0x77,0x05,0xDC,0x51,0x86,0x39,0xEA,0x10,0x88,0xE6,0x31,0x46,0x10, +0x43,0x61,0x4B,0x1C,0xC9,0xA9,0xA1,0x68,0xA6,0x0F,0xCF,0xA1,0xE2,0xD8,0x06,0xD2, +0x3A,0xFD,0x0A,0xA4,0x81,0x89,0x10,0xF5,0x33,0xB2,0xCC,0x07,0xEB,0xC0,0x4F,0xAD, +0x03,0x40,0x13,0x66,0xDA,0x76,0x4E,0xC0,0x94,0x47,0x7A,0x0D,0x30,0x95,0x19,0xC8, +0xA3,0xA8,0xCA,0x73,0x30,0x54,0x19,0xA4,0x88,0xCB,0xE3,0xC7,0xBA,0x5C,0x9A,0x3A, +0x9B,0xD6,0x11,0xDA,0xDA,0x11,0xC5,0xCD,0x31,0xB8,0xA4,0x2D,0xC1,0xDC,0x12,0x97, +0x19,0x6D,0xCB,0x69,0x91,0x9B,0xA0,0xD1,0x63,0x27,0xAE,0x0B,0x57,0xC6,0xF5,0x22, +0xC3,0xB9,0x48,0x67,0xA4,0xC7,0xD2,0x30,0x95,0xDA,0x4A,0x4A,0x61,0xB8,0x1D,0xB9, +0x1D,0x2D,0xEE,0xD9,0x39,0x15,0x90,0xDC,0x2D,0x1C,0x2D,0x66,0xD7,0xC3,0xA1,0x48, +0xCF,0x62,0xC4,0x46,0xCF,0x20,0xD0,0x69,0xBE,0x88,0x97,0xE1,0x0F,0xFD,0xB2,0xD5, +0x42,0x3F,0xC5,0xC4,0x7B,0xEF,0x76,0xC4,0xBB,0x1C,0x70,0x2A,0x3D,0x80,0x28,0xCB, +0x43,0xA8,0x88,0x23,0x51,0x76,0x0D,0x45,0x4A,0x7B,0xE0,0x4D,0x4B,0xC3,0xB0,0x1E, +0x3D,0x4A,0xF1,0xB0,0x47,0x31,0x10,0xE5,0x65,0xFF,0x77,0x8A,0x80,0x92,0x81,0xF9, +0x99,0x5D,0xCA,0x95,0x1E,0x01,0xC9,0x55,0x5B,0x58,0x14,0xEC,0x49,0x97,0x34,0xBF, +0x27,0x9C,0x2D,0xC1,0xCA,0x47,0x85,0xEB,0x55,0x4E,0x1B,0x04,0xFD,0x57,0xBA,0x82, +0xA9,0xD5,0x5E,0xE9,0x58,0x7B,0x20,0x49,0xAD,0xF6,0x50,0xC7,0x0A,0x45,0xE3,0x80, +0x36,0xF6,0x15,0xCF,0x55,0xAB,0xD3,0x85,0xAD,0x54,0x47,0xC8,0xE5,0x26,0x70,0x91, +0x1C,0xF4,0x33,0xFB,0x4D,0xF5,0xE8,0xE8,0xF6,0x09,0xF1,0xF2,0x61,0x0F,0x3A,0x43, +0x69,0x12,0x39,0x86,0x22,0xB0,0x58,0xD4,0x4A,0x3D,0xF4,0x8A,0x87,0x65,0x07,0xC8, +0x7E,0x29,0xA2,0x93,0x44,0xD4,0x05,0x72,0x5D,0x11,0x27,0xAD,0x18,0xE5,0x14,0x5F, +0x26,0x25,0x72,0xBC,0xC8,0x59,0x52,0x69,0x78,0xD9,0xC7,0xAA,0x41,0xC1,0xFC,0xE9, +0x43,0xC2,0x5A,0x9D,0x68,0x73,0xC7,0x02,0x88,0xCE,0xEA,0xC1,0x37,0x8D,0xEE,0x9A, +0x6F,0x34,0xE8,0xF7,0x94,0x8D,0x19,0xD3,0x2B,0xBC,0x70,0xDA,0xD0,0xE8,0xF8,0x8A, +0xBD,0x53,0x76,0xFC,0x8D,0xDC,0x72,0xA4,0x5B,0xBC,0x3A,0xB4,0x47,0xD5,0x9A,0xDB, +0x16,0x8C,0x1A,0xCD,0xAA,0x43,0xAF,0xC0,0xCA,0x51,0x31,0x84,0x02,0x57,0x60,0x39, +0xD3,0x86,0x3B,0x69,0x2D,0xA2,0xBD,0xC3,0x6A,0x44,0x47,0x50,0x71,0xB6,0x57,0x8D, +0x28,0x84,0xDD,0x81,0x96,0x15,0x89,0x3F,0xBC,0xF1,0x87,0xE7,0x12,0xAB,0x12,0xF9, +0x9B,0xD5,0x9F,0x99,0x1F,0xE2,0x7F,0x69,0x4C,0x77,0x58,0x68,0x39,0xE6,0xD2,0x3F, +0xEC,0xFC,0x7B,0xE2,0x98,0xE4,0x46,0x62,0xC4,0x51,0x63,0x63,0x4E,0x83,0x31,0xED, +0x9C,0xD4,0x7A,0x4C,0x47,0xD3,0x98,0xAE,0x20,0x0B,0xAB,0x13,0x07,0x0D,0x9B,0x36, +0x8D,0x99,0x46,0x60,0x96,0x05,0x06,0xA1,0x59,0xF1,0xE5,0xE6,0x63,0xBB,0x8F,0x2D, +0xD9,0xBC,0xF9,0xAE,0xC4,0x1A,0x4C,0xFD,0x44,0x62,0x56,0x7F,0x8A,0x44,0x2E,0xFC, +0x81,0xD5,0x62,0xB2,0xB1,0x2B,0x60,0xEC,0x3C,0xE0,0x1F,0x55,0x2D,0xC7,0xCE,0x8F, +0x8D,0x8D,0x49,0x8B,0xC6,0xB0,0x66,0xDB,0xD5,0xFA,0x5D,0xA9,0xC6,0xA2,0xA8,0x85, +0xB1,0x8C,0xA4,0x10,0x55,0xF5,0x8D,0x27,0xA2,0x79,0x6C,0xBB,0xE7,0x31,0x5B,0x8F, +0x49,0x24,0x9A,0x21,0x96,0x67,0x64,0x4E,0x46,0xAF,0x14,0xE5,0x2D,0x24,0xB5,0x13, +0x9A,0xD8,0x3E,0x97,0x5C,0x80,0x81,0xDF,0x7C,0xB8,0xD4,0x29,0x11,0x7D,0x54,0xDC, +0x63,0x08,0x9D,0xFA,0x54,0xC2,0x94,0x9C,0x82,0x44,0xF3,0xBD,0x37,0x9F,0xE1,0xD2, +0x29,0x23,0x73,0xFB,0x74,0x2D,0xF7,0xE5,0x38,0xB2,0x3B,0xCD,0xE5,0xA7,0x8C,0xC8, +0xE9,0xDD,0xBD,0x3C,0x25,0xCB,0x9A,0xDB,0xE9,0x37,0xCD,0xE6,0xBC,0xF0,0xB6,0x7B, +0x9D,0x69,0x99,0x36,0x6B,0xB8,0xB3,0x7E,0xD2,0x7D,0xCE,0x34,0xBF,0xDD,0x12,0x2A, +0xD6,0x5F,0xD8,0xC8,0x7F,0xC9,0xE4,0x39,0xC3,0xC1,0x50,0xC0,0x81,0x05,0x56,0xC0, +0x85,0x39,0x86,0xCD,0xB1,0x60,0x8D,0x63,0xC1,0x88,0x05,0xCA,0x51,0x13,0xF3,0x2B, +0x3A,0x61,0xE2,0x6E,0x9C,0x38,0x2D,0x77,0xB3,0xB0,0xDA,0x1C,0x97,0xA3,0x9E,0x3A, +0xA0,0x2C,0x46,0x34,0x3B,0xD0,0xC5,0xE4,0xA0,0x89,0x85,0x2E,0x97,0xC2,0xDB,0x68, +0x4D,0x93,0x35,0xD6,0x42,0x25,0x36,0x61,0x2C,0x6E,0xF7,0xD3,0x6C,0xAB,0x84,0xA9, +0x6D,0xAB,0x8B,0xE2,0x1C,0x2A,0xEA,0x9A,0x66,0x51,0x57,0x87,0x30,0x93,0xD9,0x75, +0x75,0x89,0xB4,0x3A,0x0D,0x20,0xF6,0x72,0xFE,0x38,0xD4,0xF6,0xB0,0x2C,0x05,0x31, +0xCA,0x25,0x67,0x05,0x35,0xD1,0x49,0xC3,0x3D,0xE2,0x09,0x0C,0x29,0xE0,0xFA,0x24, +0xB1,0x36,0x60,0x66,0xB6,0x3E,0x01,0x4C,0x8C,0xA4,0x36,0x12,0xBA,0xBE,0xD2,0xA5, +0x88,0xC1,0xE6,0x2D,0x67,0x15,0x86,0x1E,0x00,0x37,0x0B,0x14,0xB1,0xD7,0x44,0xB3, +0x8D,0x78,0x53,0x68,0xED,0x73,0x38,0x9E,0xEF,0x80,0x6C,0x2F,0x4E,0xF0,0x09,0x3A, +0x99,0x93,0xF7,0xF6,0xE9,0xBB,0xAE,0x72,0xD6,0x8B,0xFD,0x2E,0xE3,0x3D,0x74,0x2E, +0x07,0x79,0xBF,0xFA,0xDD,0x33,0xA3,0xFB,0xF5,0xBB,0xE9,0xA6,0x7E,0xFD,0x47,0xE9, +0x66,0x77,0xAE,0x1C,0x5C,0xB9,0xFE,0xC5,0x59,0x57,0xDE,0xDB,0xF9,0xFC,0x92,0xF8, +0x76,0x18,0xD2,0x6F,0x34,0x7E,0x63,0x14,0x8B,0x97,0x18,0x39,0xCE,0x30,0x08,0xEC, +0x04,0x07,0x68,0xDB,0x15,0x2C,0x0A,0x2F,0x73,0xE1,0x66,0xC5,0xA3,0xA0,0xEB,0x44, +0xED,0x4E,0x2B,0x2E,0x8D,0x5D,0xC0,0xB2,0x4E,0x6B,0xBC,0xAC,0x13,0x94,0x71,0xEB, +0x09,0x59,0x0A,0xC5,0x2B,0x3B,0xAD,0x54,0x05,0xE0,0x63,0x2A,0x00,0xAB,0x2C,0xD5, +0x52,0x20,0xC2,0xA4,0xA9,0x9A,0x14,0x5E,0x30,0x1D,0x29,0x60,0xE4,0x67,0x8A,0xBB, +0x1B,0xD3,0x58,0x5D,0x69,0x43,0x9F,0xC6,0xB3,0xEB,0x3F,0x27,0x75,0xF3,0xE3,0x05, +0xA6,0x0C,0x68,0xC1,0xC9,0x60,0xAD,0x54,0x67,0x6B,0x35,0xC0,0xC5,0x18,0xDD,0xC0, +0x8C,0xDF,0x68,0x2E,0xF3,0x68,0xC5,0x0A,0x79,0xD0,0x85,0x95,0xA1,0xAD,0x45,0x49, +0x62,0x0D,0x68,0x36,0x2C,0x44,0x01,0x5B,0x88,0x20,0x2C,0x44,0xB6,0x4D,0x72,0x6D, +0x37,0x0B,0x4E,0x5F,0x6A,0xA0,0x10,0x37,0x49,0x81,0x24,0xE7,0xC2,0x22,0x64,0x14, +0x02,0xCD,0x14,0xC3,0x9E,0x91,0x22,0xA9,0xD9,0x05,0xB4,0x21,0x48,0x2E,0x26,0xFB, +0x18,0x3C,0x34,0x5D,0x58,0xBA,0x44,0x09,0x31,0x69,0xC3,0xE0,0xE8,0xB0,0xAC,0x98, +0x9C,0x6E,0x61,0x8D,0xB4,0x5F,0x67,0xDC,0xF8,0x64,0x0B,0x43,0x85,0xD5,0xB6,0x2D, +0x01,0x1E,0x8A,0x76,0xC2,0x25,0xAB,0x7E,0x9D,0xBF,0xA0,0xEA,0x57,0x6A,0x55,0xF5, +0x8B,0xEC,0x2E,0xA1,0xF2,0xB7,0x31,0x8B,0x32,0x74,0x6D,0x75,0x0C,0x77,0x22,0x5F, +0xFD,0xBF,0x81,0x03,0x18,0x7D,0x22,0x1C,0x8F,0x51,0x26,0xAF,0xC1,0x01,0xBC,0xD6, +0xC8,0xE4,0x4A,0x0C,0x96,0x69,0x00,0x8B,0x8B,0x1B,0x7E,0x29,0x58,0xDC,0xBF,0x00, +0x16,0xE4,0x31,0x26,0x8E,0x65,0x23,0xB6,0x82,0x09,0x65,0x41,0x02,0x58,0x0D,0x9F, +0x31,0x49,0x90,0x08,0x19,0x95,0x02,0x8C,0x8F,0x30,0xD8,0x86,0x52,0x3C,0xB9,0xE3, +0x31,0xD6,0x76,0xA0,0xC3,0x1A,0x5A,0x67,0x38,0x6A,0x63,0x2C,0x50,0x0A,0xC5,0xD2, +0x0F,0x3B,0x84,0xB6,0xD6,0x6A,0xC2,0x6E,0x7B,0x0E,0x56,0x68,0xEE,0xD4,0x5A,0xE0, +0x78,0x5B,0xA3,0x53,0x8B,0xC1,0x24,0xC2,0xFE,0x0F,0x8C,0xC7,0xC4,0x01,0x07,0x26, +0x08,0xEC,0x8F,0xC7,0x1C,0x15,0xB2,0x0B,0xD6,0x16,0xE3,0x3D,0x05,0x5C,0x44,0x44, +0x2B,0x82,0xB5,0x83,0x33,0xC6,0x6A,0x7C,0xA9,0xDF,0xC3,0x40,0x39,0x1B,0x7A,0x19, +0x31,0xFC,0xE7,0x0E,0x60,0x14,0xAE,0x37,0x10,0xCB,0xE8,0x23,0x48,0x25,0xE7,0x5E, +0x60,0x55,0xC3,0x3C,0xB7,0x01,0xDE,0xB2,0x7E,0xE5,0xFD,0x40,0xE8,0x5A,0x30,0xB2, +0xB7,0x01,0x16,0x7D,0xD6,0x11,0xB6,0xDA,0xB1,0x3B,0x62,0x3E,0x2E,0x06,0xEB,0xC7, +0xC3,0x9A,0xEB,0x41,0x97,0xE8,0xAC,0x55,0x11,0x19,0x79,0x2D,0x3D,0xD6,0x40,0x8B, +0x3A,0xD1,0x00,0x57,0xCC,0xA0,0x99,0x46,0x78,0xA2,0x2B,0xA7,0x77,0x15,0xD8,0xF2, +0xA1,0x13,0x86,0x67,0xCB,0xD6,0xFF,0x48,0x6C,0xBD,0x62,0x77,0x17,0xB0,0x67,0x08, +0x3F,0xDA,0x30,0x94,0xC2,0x6B,0xE1,0x06,0x25,0x40,0x8C,0x3E,0x12,0x63,0x3C,0xF6, +0x65,0x0A,0x25,0x54,0x3D,0xD7,0x0A,0x06,0x11,0x96,0x81,0x73,0xD0,0x9C,0x15,0x01, +0x4E,0x18,0xE9,0x09,0x4B,0xBC,0x38,0xDB,0x1D,0x6B,0xFB,0x0A,0x7F,0xF5,0x75,0xC6, +0x23,0xFA,0x3A,0xC4,0xF8,0xB9,0xB9,0x38,0x2C,0x1E,0x51,0x5A,0x36,0x83,0xDC,0xD9, +0x45,0x6B,0xD0,0x52,0xB8,0x29,0xCC,0x82,0xC3,0xFC,0xBF,0x78,0x9D,0x6D,0x94,0x70, +0x16,0xC1,0x46,0x73,0x12,0x30,0x2F,0x06,0xF5,0x03,0xD0,0x1E,0x2C,0x34,0x2B,0x0D, +0xCB,0x18,0xC1,0x16,0xB6,0x59,0xA8,0x4B,0x35,0x19,0xCC,0x01,0x0B,0xF5,0xA7,0x5A, +0x68,0xCF,0x31,0x96,0x78,0x6B,0x88,0x75,0x4B,0xA0,0xE5,0xBF,0x06,0x89,0x29,0xE0, +0xB1,0x46,0x04,0x9D,0x89,0xE4,0x8E,0xB5,0x22,0x40,0xB2,0x31,0x1F,0x26,0xEB,0x89, +0x42,0x56,0xA9,0xB7,0xAB,0xC3,0xD4,0xF1,0x75,0xFF,0x13,0xEB,0x48,0xF0,0x3F,0x64, +0x98,0x2A,0xF3,0xBB,0x9F,0xE2,0x17,0xC7,0x1A,0x13,0xF0,0xBB,0x1B,0xFF,0x11,0xEB, +0x4D,0xA0,0x66,0x3C,0x15,0xAF,0x1B,0x0D,0x83,0xFE,0x63,0x82,0x55,0x5F,0xD4,0xAA, +0x4A,0x19,0x1D,0x18,0xE6,0x70,0xD4,0xC3,0xB4,0x9E,0x80,0x27,0x1D,0xB4,0x1E,0xCD, +0xCB,0x91,0x1C,0xD2,0x8A,0x33,0x63,0x25,0xCC,0xE6,0x38,0x27,0xC7,0x8E,0x92,0x3E, +0xF8,0x94,0xC2,0x3E,0xA5,0x34,0x95,0x37,0xA3,0x69,0x59,0xC0,0x92,0x9A,0x80,0x97, +0x2B,0xB6,0x74,0xCC,0x88,0xC1,0x4A,0xFE,0x76,0x4A,0x9D,0x3B,0xD6,0x85,0x9A,0x0A, +0xA1,0x0B,0xDA,0xD3,0x83,0x12,0x2B,0xA4,0xDB,0x56,0x83,0x30,0xF6,0x86,0x75,0xD3, +0x94,0x4F,0x62,0xFF,0xD1,0xAB,0xDA,0xAC,0x9C,0x4E,0x6F,0xAB,0x72,0x3A,0x23,0xA1, +0x67,0x28,0x73,0x26,0xFC,0x82,0xE2,0x69,0x24,0xEF,0x8E,0x0B,0xA8,0xBF,0x86,0xFD, +0x79,0xA9,0x22,0x6A,0x61,0x0A,0xD3,0x9D,0xFF,0x6F,0x61,0x47,0x76,0xDF,0x31,0xEC, +0x64,0x38,0x30,0x83,0x4B,0x01,0xCF,0xDF,0xA2,0x09,0x86,0x18,0xFC,0xD3,0x28,0xFC, +0x99,0xED,0xC0,0x9F,0xD5,0x16,0xFC,0xD9,0x2D,0xFA,0xB5,0xFE,0x22,0xF8,0x35,0x33, +0xA1,0xE3,0x29,0x6C,0x63,0x5C,0xE7,0x17,0x4C,0x22,0x41,0x86,0xB0,0x79,0x54,0xD0, +0x79,0x94,0x72,0x0B,0xDA,0x98,0x07,0x86,0x69,0x93,0xC3,0x5A,0xF8,0xB6,0xB6,0x5B, +0x4E,0x21,0xEC,0xA5,0x34,0x2D,0x7A,0x00,0x7B,0xA9,0x47,0xE2,0x24,0x93,0x59,0x10, +0x2F,0x9D,0x05,0xF1,0xF2,0x9A,0xED,0xAC,0x18,0x02,0xCA,0xD0,0xAE,0x28,0xD5,0xBA, +0x7D,0x09,0x85,0xBF,0x98,0xFC,0x3A,0xDC,0x52,0x1D,0x63,0x66,0x65,0x7B,0xDB,0xEC, +0x92,0xB8,0x9A,0xD7,0xE6,0xD6,0x03,0xDB,0x83,0xE1,0x6D,0xA8,0x46,0xBF,0x59,0xDC, +0xB4,0xB6,0x30,0x97,0x8C,0xCD,0x8B,0xA2,0x29,0x8C,0xA3,0x67,0xB0,0x4E,0xD6,0xCD, +0x90,0xA5,0xA4,0x39,0x68,0x22,0x17,0xC6,0xD5,0xB2,0xE0,0x30,0xAB,0x09,0x4D,0x58, +0x30,0x9E,0x8E,0xD9,0xCD,0x80,0x26,0xE1,0x17,0x23,0x49,0x93,0xC3,0x1D,0xA3,0x63, +0x3B,0x48,0xE6,0x4B,0xCF,0x9C,0x0A,0x6C,0xEA,0x3F,0x4F,0xE1,0xFA,0xE9,0xD6,0x88, +0x6F,0xC3,0x5C,0xB9,0x3C,0x13,0x29,0x33,0x11,0x9F,0x89,0x18,0x4C,0x70,0x9E,0x1C, +0x52,0x7B,0xDE,0x4B,0xEA,0x48,0xDD,0x7D,0x6A,0x19,0x39,0x7C,0x9F,0x5A,0xAA,0x96, +0xEE,0x00,0xEE,0x56,0xF7,0x80,0x5A,0x4A,0xDF,0xD4,0xB2,0x07,0x48,0x9D,0x5A,0x8A, +0x74,0x36,0xF9,0xE2,0x2E,0xDD,0xE7,0x7A,0x1F,0x60,0xCB,0xCF,0x15,0x71,0xD3,0xB9, +0x88,0x1B,0xB1,0x95,0x07,0xD8,0x32,0x20,0xB6,0xB2,0x70,0xBF,0x74,0xA1,0xF2,0x2E, +0xD9,0x49,0xBB,0xC4,0x75,0x42,0x3F,0x33,0xE0,0xA1,0x18,0x8B,0xFB,0xA9,0xF0,0xF6, +0x01,0xD3,0xED,0x24,0xBD,0x66,0x76,0x27,0x19,0x58,0x26,0x15,0x66,0x23,0x52,0xD3, +0x2C,0x0F,0x9D,0xCE,0x5C,0x12,0xED,0xA3,0xF6,0x1A,0xB1,0x39,0xC5,0xB4,0x22,0xBC, +0x6E,0x70,0x29,0x66,0x2B,0xCB,0xA5,0xCA,0xE7,0x4B,0x99,0x96,0x5D,0xE6,0x33,0x24, +0xB9,0xBC,0xAC,0x71,0x1A,0xE6,0x4F,0xF9,0x28,0x05,0x71,0xEE,0x4C,0x5A,0x27,0x00, +0x9A,0xF6,0xE4,0x9A,0xA1,0xD7,0x21,0xF6,0x16,0x9C,0x1E,0xB5,0x01,0x8E,0x87,0x21, +0x06,0x1F,0x3E,0x3D,0x76,0x43,0x55,0x41,0x01,0xFF,0x7E,0x9F,0x17,0x6F,0x01,0xFC, +0xBD,0xD8,0x17,0xFE,0x10,0x52,0x50,0xE0,0x3A,0x3C,0x99,0x18,0xD7,0x23,0x22,0xAF, +0xBD,0xE6,0xAD,0x9B,0xDE,0x99,0xA2,0xFE,0x44,0xB1,0x79,0xCD,0x35,0x6F,0x09,0xC1, +0xBB,0x77,0x0F,0x14,0x86,0xF5,0xBF,0x42,0xDD,0xD1,0xA8,0xEF,0x7F,0x05,0xE2,0xF5, +0xEE,0x1D,0x57,0x81,0xDC,0xA2,0xB5,0xEC,0xC0,0xF7,0x24,0xB0,0xFD,0x7A,0xB7,0x55, +0xCD,0x9E,0xD4,0x56,0x35,0xBB,0x4F,0xAB,0x66,0x8F,0x38,0x5C,0x1E,0xA6,0x6D,0xB4, +0xAE,0x68,0x47,0x16,0xD1,0xA2,0xAA,0x9D,0x0C,0x42,0x8E,0xDC,0x46,0x69,0xBB,0xBE, +0x22,0xA6,0xDF,0xFE,0x7F,0x84,0x07,0x78,0x6E,0x4B,0x78,0x7E,0x8F,0x4C,0xB6,0x0D, +0x78,0x74,0x23,0x19,0x63,0x8D,0xC1,0x33,0x0D,0xE0,0x49,0x6E,0x1B,0x9E,0x94,0xB6, +0xE0,0x49,0x6D,0x82,0xC7,0xDB,0x01,0x3C,0xC8,0x43,0x5B,0x82,0x64,0xD1,0xB8,0x66, +0xDB,0x50,0x69,0x9C,0x52,0xD0,0xE0,0x1A,0x4A,0xF1,0x94,0xC2,0xDD,0xD2,0x1A,0x32, +0x2C,0xA2,0x48,0x0A,0x47,0xDD,0x6C,0xB3,0xFB,0x42,0xB1,0x72,0x51,0x0D,0x52,0x17, +0x8D,0x9C,0x83,0x0E,0xC5,0xEA,0xF0,0xB4,0x7E,0x80,0x31,0xF8,0xB1,0xE9,0x5B,0x92, +0x17,0xAB,0xF1,0xF4,0xED,0x41,0xAF,0xED,0xEC,0x96,0xE0,0xBB,0x71,0x2F,0xB7,0x05, +0xFB,0xBD,0xB1,0xFD,0xCB,0xB3,0x9A,0x78,0x58,0x63,0x23,0x68,0x7E,0xDD,0x5B,0x56, +0xC5,0xDB,0xE2,0x55,0xF1,0x76,0xAD,0x2A,0x3E,0xC2,0xE3,0xAE,0x69,0xB3,0x32,0x1E, +0xFD,0x63,0x4D,0xD5,0xF1,0xF9,0xD4,0x68,0x6A,0xAA,0x90,0x17,0xD6,0x34,0xB7,0x9B, +0x96,0x52,0x5D,0xD3,0x8B,0x11,0xC3,0x78,0x9F,0x94,0xA8,0xC5,0x46,0x2D,0x12,0x0B, +0xA8,0x9B,0x82,0x97,0xB5,0x1F,0xC2,0xBD,0x9F,0x14,0xEB,0xF6,0xAB,0xF0,0xB6,0x50, +0x08,0xD9,0x63,0x4C,0xA3,0xF4,0xA1,0x46,0xE9,0xB5,0xD1,0x3E,0x9A,0xAC,0x68,0x2C, +0xDC,0xBA,0x65,0xCA,0x11,0xB5,0xA9,0x65,0xCA,0x73,0x4F,0xAA,0xBA,0xE3,0xEA,0xCF, +0x9F,0x7E,0xFC,0xF1,0x67,0xEA,0x36,0xF2,0xF3,0xD3,0x8F,0x3D,0xB6,0x4C,0xAB,0x83, +0xB9,0x78,0x46,0xDC,0xAA,0xF7,0x70,0x41,0xEE,0x21,0x0D,0x22,0x0F,0x6D,0x64,0xA9, +0xAF,0x67,0xDD,0x69,0x93,0x81,0x65,0x17,0x05,0xB1,0x58,0x25,0xD6,0xC4,0x32,0x68, +0xAE,0x97,0x83,0x54,0x90,0xD1,0x9A,0x38,0x33,0x6B,0x5E,0x29,0xD9,0x58,0xCF,0xCA, +0xBC,0x20,0xAC,0x58,0x32,0xB2,0x25,0xB3,0x14,0x11,0x03,0x45,0x68,0xD3,0x67,0xBA, +0x5E,0xB3,0x7B,0xD2,0x72,0x3A,0x75,0xA6,0x45,0x27,0x52,0x44,0xEF,0x30,0x50,0x5C, +0x16,0x25,0x03,0x62,0x25,0x43,0xA6,0x56,0xB8,0xCC,0xB2,0x25,0xA8,0xEF,0xB5,0xA9, +0xE8,0xA4,0xA0,0x65,0x71,0x4A,0x59,0xAC,0xE0,0xE6,0xBB,0xBF,0x7C,0x78,0x4A,0x78, +0x66,0x4B,0xAF,0x01,0xE5,0x9B,0xC7,0x7F,0x7A,0xAC,0xFF,0xE3,0x83,0x87,0x3D,0x31, +0xE0,0x9E,0xFB,0x7B,0xDF,0x36,0x6E,0xFC,0xA8,0x97,0x9F,0x31,0x2E,0x9C,0xB9,0xE0, +0x71,0x71,0xE6,0xA1,0x53,0x5F,0xFD,0xCD,0x58,0x39,0x3E,0x78,0x7D,0x61,0xDE,0x1D, +0x4F,0x4E,0xDA,0xFA,0x7A,0x4A,0xF2,0xC6,0xCC,0x8C,0x5B,0xC6,0xF6,0x1B,0xD1,0xB7, +0xAC,0xF7,0xA2,0xB1,0xF3,0xB6,0x66,0x4C,0xB9,0x7B,0xC9,0xC2,0x0B,0xCB,0x81,0x96, +0x69,0xFD,0xB9,0x7E,0xB2,0x96,0xB3,0x75,0x6F,0x62,0x05,0x7A,0x4E,0xB3,0x0A,0xF4, +0x82,0xA6,0x0A,0x74,0x9A,0xAB,0xA5,0x64,0x99,0xEB,0x13,0x13,0xB5,0x68,0x05,0x7A, +0x2C,0x2F,0x2B,0x62,0xB1,0xD2,0xD6,0x57,0x1E,0xE9,0x35,0xA3,0x23,0x39,0x3D,0x23, +0x93,0x0A,0xAD,0x82,0x9C,0x5F,0x5F,0x86,0x8E,0x05,0xF3,0xE4,0x12,0xA5,0xE8,0xF3, +0xB1,0xA0,0x5E,0xFD,0x57,0x47,0x05,0xE9,0xBA,0xFD,0xEA,0x6F,0x1B,0x26,0x68,0x55, +0xE9,0x5C,0xB3,0x79,0xE7,0xC1,0xBC,0x1F,0xFC,0x45,0x95,0xF7,0x85,0xED,0x56,0xDE, +0x17,0xB5,0xA8,0xBC,0xC7,0x59,0xE7,0x17,0x74,0x66,0xAD,0x60,0xE5,0x4E,0xFF,0x7D, +0x09,0x3E,0xC6,0xA1,0x3A,0x2C,0xC3,0x7F,0x9A,0xE6,0x1B,0x74,0x54,0x8C,0x2F,0xF8, +0x59,0x2E,0x42,0xE2,0xDC,0xFD,0x5C,0x17,0x6E,0x6E,0xE2,0xDC,0xF3,0x9A,0xCD,0xBD, +0xB0,0x69,0xEE,0xC5,0xF1,0x3A,0xCB,0x1C,0x6D,0xEE,0x9D,0xB4,0xB9,0x97,0x60,0xD1, +0x56,0xB3,0x35,0xDF,0x4E,0xD7,0x3C,0xCB,0xAF,0x4D,0x3F,0x13,0x33,0x54,0xF3,0x7E, +0xFD,0xF4,0x63,0xFE,0xF0,0x4B,0xAC,0xFE,0xB3,0x3F,0xAE,0xF8,0x71,0x49,0x34,0x7A, +0x67,0x47,0xCB,0x2F,0x5E,0x8D,0x73,0xFF,0xF1,0xC7,0x86,0x49,0x71,0x12,0x88,0xE3, +0xA1,0x0C,0xF0,0xD0,0x83,0x1B,0xC0,0xED,0x4A,0xC4,0x43,0xAF,0x66,0x78,0xE8,0x17, +0xC3,0x03,0xAA,0x25,0x69,0x61,0x2D,0xCA,0x29,0x87,0x83,0x5A,0x14,0x53,0xEE,0x04, +0x2C,0xFE,0x72,0x8A,0xA1,0x32,0x73,0x7D,0x6D,0x5A,0x19,0x07,0x7A,0x71,0x0F,0xA6, +0xED,0x96,0x69,0xE8,0xEA,0xC3,0xD0,0x55,0xDB,0xD9,0xED,0x31,0xD2,0xC7,0x37,0xE0, +0xC5,0x4E,0xC1,0x68,0x67,0xE6,0x38,0xBC,0x02,0xBE,0xD3,0xA9,0x07,0x68,0xC2,0xC6, +0xE4,0x4C,0x47,0x97,0x5E,0x74,0xBF,0xF4,0xF3,0xB4,0x89,0x34,0x25,0xAF,0x0B,0x7C, +0xEA,0x5A,0x2E,0x87,0x25,0x25,0xD0,0xAD,0xFC,0x12,0xFB,0x47,0x2B,0xD7,0x63,0x99, +0x6E,0xCD,0x34,0xE5,0x4B,0x62,0x76,0x29,0x3F,0x79,0x6C,0x7E,0xFF,0xBC,0xF2,0x24, +0xBF,0x2D,0x3F,0x97,0x9F,0xDB,0xEC,0xD3,0xF0,0x0E,0xD1,0xFD,0xC0,0xA2,0xE5,0xE9, +0xFE,0x32,0x8F,0x7B,0xF0,0xF0,0xF8,0x41,0x43,0xA9,0x86,0x7A,0x51,0xC3,0xBB,0x53, +0xE3,0x39,0xC5,0xDC,0xEA,0x5F,0xC0,0x75,0x30,0x13,0xAD,0x30,0x1C,0x4D,0x67,0x22, +0xB5,0x28,0x14,0x73,0xC1,0x66,0x21,0xBE,0xB3,0xD0,0x31,0x95,0xE9,0x68,0xC5,0x8F, +0x6A,0x8B,0x11,0xD9,0x4A,0x21,0x36,0x18,0x0E,0x2A,0xC5,0x20,0x50,0xD0,0x3F,0x9B, +0x99,0xC6,0xDA,0xF0,0x15,0x62,0xDA,0x68,0x0E,0xE5,0xC8,0x05,0x9E,0xFF,0x80,0x33, +0xA1,0x9B,0xA5,0x09,0x83,0x28,0x94,0xDB,0xC4,0xE2,0xB6,0xBA,0x7D,0x31,0x5C,0xCD, +0xAD,0x6B,0x1B,0x5D,0x1B,0x8E,0x1C,0x69,0xB0,0x6A,0xBB,0xF4,0x01,0xCC,0x59,0xD6, +0x70,0x64,0xD0,0x53,0xFE,0xD4,0x8D,0xEB,0x83,0x4F,0x13,0xB9,0x24,0x87,0x92,0x83, +0xC1,0x68,0x29,0x23,0xC8,0xDE,0x40,0x58,0x9A,0xAB,0xBA,0x6F,0x22,0xD7,0xCA,0x07, +0x33,0x2C,0xC4,0x68,0x2F,0xE4,0x54,0x7A,0xC2,0xA7,0x2E,0xEC,0x53,0x97,0x16,0x1C, +0xAD,0x1F,0x7C,0xE8,0x19,0xD2,0xE8,0x31,0xD8,0x99,0xD2,0x63,0xA0,0x1D,0x7A,0xEC, +0x0D,0x16,0x9C,0xD2,0x25,0xBF,0xFC,0x97,0x73,0xB3,0x76,0x9E,0x2B,0xD2,0x21,0x87, +0xB3,0xAD,0xAB,0xAC,0x5C,0x87,0xAF,0x07,0x47,0x0D,0xE8,0x3F,0x7A,0x74,0xFF,0x01, +0xA3,0x3A,0xE2,0x76,0x62,0x01,0xFD,0xF2,0xFA,0xF5,0x95,0x03,0x46,0x8D,0xEE,0xDF, +0x6F,0xF4,0x28,0xB6,0xDF,0x0D,0x33,0xC4,0x2A,0x1A,0x61,0xEF,0x8B,0x18,0x2D,0x44, +0x4F,0x51,0x6E,0x58,0xE9,0x0A,0x52,0x3F,0x23,0x44,0x51,0x8A,0xF5,0x27,0x80,0x55, +0xF9,0xB2,0x50,0xB4,0x67,0x6A,0x21,0x22,0xB6,0x27,0x20,0xB6,0x14,0x55,0x02,0xA1, +0x29,0x8F,0x9F,0xE6,0xE9,0x3B,0x95,0x30,0xEB,0x8B,0x88,0x19,0xFC,0x3D,0x43,0x72, +0x2A,0xCB,0xE7,0x4F,0xD6,0x92,0xF7,0x8B,0xE3,0xF2,0x20,0x8C,0x84,0x56,0x88,0xBC, +0x31,0xD5,0xA5,0xB8,0x0A,0xE0,0x6F,0xB9,0x14,0xF1,0x66,0xE4,0xD2,0xE6,0x90,0x2E, +0x25,0xDB,0x4F,0x2B,0x7F,0xBB,0x82,0x7D,0xC7,0x65,0x17,0x14,0x63,0x0B,0x5B,0xC4, +0xAF,0x82,0xF9,0x80,0x6D,0x61,0x94,0xD6,0x80,0x34,0xEF,0x6B,0x11,0x4B,0xEB,0x4A, +0xC0,0x71,0x31,0xDB,0xE4,0xCD,0x50,0xFA,0xE4,0xF1,0x1E,0x57,0xFF,0xE9,0x91,0xCF, +0x88,0xB1,0x21,0x62,0x7D,0xF7,0xF5,0xA9,0x87,0x26,0x4D,0xFA,0xF0,0x8E,0x97,0x7F, +0xBE,0x76,0xF0,0x9F,0xAB,0xDF,0xFC,0x63,0x0C,0xCD,0xFC,0x0F,0x7C,0x35,0xD9,0xB4, +0xF8,0xB9,0x9D,0x89,0xD8,0x1D,0x3F,0x7A,0x4C,0x05,0xB6,0xC3,0x78,0xEB,0x50,0x69, +0xE9,0xB6,0xC2,0x2E,0x0F,0xDC,0x77,0xFF,0xFD,0x6F,0x44,0x19,0xA2,0xDF,0x89,0xF5, +0xC5,0xC0,0x7A,0xE8,0xD9,0x5A,0xCF,0x94,0xA6,0x18,0x4A,0x40,0x8B,0xA1,0x68,0x8D, +0x53,0xDA,0x88,0xA1,0xD8,0xFF,0xBB,0x18,0x4A,0xA0,0xA3,0x18,0x4A,0x8B,0x96,0x2B, +0x6D,0xC5,0x50,0xDA,0x6B,0xC3,0x42,0x06,0xB4,0x0C,0x9F,0xB4,0xD9,0x97,0xA5,0xF1, +0xBB,0x96,0x39,0x5E,0x02,0xEB,0x75,0x02,0xF2,0xD5,0x03,0x76,0x4B,0x16,0xE6,0x58, +0x35,0xEF,0x76,0x92,0x01,0x9B,0x36,0x85,0x75,0x3B,0x49,0x41,0x92,0xCA,0x8E,0x77, +0x3B,0x49,0xA1,0xDD,0x4E,0x52,0xB5,0x6E,0x27,0x68,0xF5,0xA7,0x1A,0x25,0x57,0x54, +0xB0,0xB8,0xBC,0x3E,0xD6,0xA4,0xAF,0xCD,0x7E,0x27,0x29,0x1D,0xF5,0x3B,0x41,0xFD, +0xA9,0xA3,0x9E,0x27,0x7F,0xA0,0xCA,0xD3,0xEE,0xF6,0x3B,0x9F,0xE8,0xAE,0x51,0x7F, +0xDB,0xF8,0x12,0x5B,0xE5,0xC4,0xB9,0xA1,0xA7,0xE3,0xCE,0x4B,0x75,0x72,0xC9,0x6E, +0xA7,0x93,0x8B,0x5F,0xEB,0xE4,0xF2,0x1A,0xCC,0x0D,0x54,0x05,0x36,0xB9,0x88,0xDD, +0xC1,0x92,0x15,0x7E,0x75,0x3B,0x17,0x54,0x8F,0x3A,0x6E,0xE9,0xB2,0x93,0xEA,0x47, +0xED,0x36,0x76,0x21,0x6F,0x52,0xE5,0xA8,0xF9,0xFC,0x72,0x2E,0x3D,0xBF,0x40,0x3B, +0xF3,0xCB,0x4D,0x9C,0x5F,0x66,0x76,0x7C,0x7E,0x59,0xFF,0xD9,0xFC,0x34,0x55,0xA8, +0xE3,0x29,0x1A,0x98,0x22,0x74,0x89,0x39,0xFE,0xF8,0x23,0x8D,0x97,0xB3,0x79,0x3A, +0xB5,0x75,0x0C,0xA0,0xDF,0xBC,0xA3,0x99,0xA2,0xFF,0x35,0x3B,0x1C,0xCD,0x60,0xE2, +0xD7,0x0F,0xE2,0x37,0xB7,0xC5,0xCC,0x13,0xDC,0x56,0xE8,0xD6,0xC4,0xE7,0x78,0x04, +0x9A,0xF0,0x81,0x56,0x53,0xBA,0x91,0xF6,0x96,0x54,0xB2,0xB3,0x80,0xD3,0x59,0x5C, +0x29,0xCC,0x93,0x65,0xB4,0xB0,0x6A,0x3D,0xAF,0x74,0xE9,0x55,0xD6,0xEC,0xDE,0x8E, +0xD1,0x90,0x81,0x56,0x70,0x7B,0x38,0xE0,0xBD,0xB4,0x28,0x48,0xB8,0x78,0x10,0x8C, +0xC0,0xCD,0x34,0x9F,0xD7,0x00,0xB6,0x70,0x61,0x2C,0xF6,0x82,0xBD,0x10,0x8C,0xB4, +0xE2,0xDD,0xC4,0x02,0x2E,0x66,0xD6,0x21,0x0E,0x43,0x46,0xB2,0x40,0x43,0x3B,0x18, +0xF0,0xC7,0xE8,0x4A,0x39,0x6E,0x9C,0x21,0x3B,0xC6,0x61,0x27,0xAF,0x0B,0x4E,0x6C, +0xE2,0x22,0x56,0x31,0xBD,0xF2,0x29,0x60,0x86,0x33,0xFE,0x93,0x7B,0x23,0x19,0xD3, +0x7B,0x3F,0x45,0xA9,0x75,0xEA,0x8E,0x71,0x2C,0x81,0xF8,0x82,0x4B,0xBB,0xBD,0x70, +0xF1,0xAF,0x70,0x6F,0x18,0x92,0xC6,0xA3,0x2C,0xD8,0x75,0x86,0x45,0xA4,0xF0,0xDE, +0x16,0x7A,0x6F,0x2B,0x0B,0x4B,0x99,0x69,0x34,0xA8,0xFD,0xB0,0x94,0x90,0xC3,0xA8, +0x65,0x74,0x6C,0x8C,0x1F,0x7F,0x8C,0x8F,0x02,0xF4,0x71,0xF1,0x07,0x18,0xE7,0x4A, +0xAD,0x16,0x0B,0x7D,0x05,0x83,0x5A,0xCE,0x82,0xA6,0xF1,0xC6,0x43,0x54,0xE6,0x50, +0xAC,0x94,0x3E,0x56,0x97,0x65,0xA1,0xA5,0xF4,0xB2,0xC1,0xA9,0x98,0x2C,0xCC,0xB1, +0x61,0xD7,0x7A,0x3B,0x86,0xBD,0x14,0x00,0x7C,0x64,0x9B,0xB5,0x8E,0xDF,0x31,0xAE, +0x82,0x96,0x6A,0x9D,0xDF,0xC5,0x46,0xAF,0x43,0xFD,0x47,0xEB,0x55,0x02,0xF6,0x79, +0x0A,0xD7,0x09,0x39,0x28,0xED,0xC0,0x05,0x8C,0x53,0xCE,0x0F,0x62,0xDD,0xB7,0x6C, +0x09,0xC6,0x1A,0x1A,0xA5,0xDA,0xB1,0x7C,0x8E,0xD2,0x9C,0xC7,0xCE,0x7A,0x19,0xE1, +0xE3,0x6E,0x14,0xA3,0x09,0x24,0x42,0xB6,0xF4,0xBA,0x60,0x30,0x5B,0x6C,0x4E,0x9F, +0x9E,0x76,0xCB,0x8C,0x65,0xA6,0xE6,0x67,0x60,0x99,0x10,0x07,0xF2,0xC3,0x82,0x9E, +0x22,0x83,0xD1,0x19,0x7F,0x94,0x02,0x48,0x8E,0x02,0x5D,0x41,0x5E,0x41,0xD8,0x97, +0xE7,0xD3,0xD1,0x92,0x91,0x66,0xDD,0x4D,0x0A,0x34,0x56,0xEA,0x39,0xED,0xEA,0x5E, +0xB8,0x4E,0xDD,0xE7,0x27,0x29,0xAF,0xFD,0x7D,0x1E,0xB9,0xD6,0xAF,0x9E,0xDC,0xF8, +0xD0,0x2C,0xF5,0xEF,0x5F,0x7C,0xA9,0x7E,0xBE,0x7F,0xDB,0xD3,0xCB,0xB6,0xF5,0xE8, +0x11,0x1A,0xDD,0xF9,0xE5,0x9D,0x7C,0xCA,0x79,0x52,0xA6,0xD3,0x45,0xEF,0x9C,0x38, +0xEE,0xDD,0x65,0x33,0x6E,0x9D,0xB0,0xAB,0x5A,0xFD,0xDB,0xAB,0x17,0xD5,0xC3,0xA4, +0x8C,0xBB,0xB8,0xFB,0xAF,0x7F,0xDD,0xFD,0xE0,0xEE,0x81,0x92,0xF3,0xCF,0x4C,0x7E, +0xB2,0xFE,0x46,0x65,0x9C,0x9B,0x0B,0x72,0x4F,0xB7,0xD3,0x29,0x06,0x93,0xC0,0x3C, +0xE1,0x98,0xDD,0xD1,0x25,0x18,0x2B,0xAE,0xC4,0x2D,0xD9,0x35,0xA1,0x87,0x4C,0xAD, +0xC7,0x8D,0x46,0x48,0x90,0x69,0x77,0x4D,0x0D,0x65,0x6A,0x73,0xCC,0x16,0x23,0xCD, +0x9B,0xC4,0xF3,0xFE,0x20,0x3E,0x3A,0x2E,0x5D,0x2B,0x51,0xF5,0x07,0x61,0x63,0xEA, +0x7D,0x0E,0x96,0x28,0x99,0x89,0x8D,0x33,0x3A,0x97,0xCB,0x5D,0x24,0x25,0xBD,0xB0, +0xBC,0x9D,0xA6,0x33,0x42,0x07,0xE6,0x45,0x62,0x43,0x9A,0xBC,0x0E,0x4C,0x89,0x56, +0xCD,0x6A,0x74,0x19,0xAD,0xCD,0x87,0x98,0xEC,0x99,0x0D,0xB4,0xCF,0x72,0x97,0x87, +0x6A,0x5E,0x76,0x77,0x02,0xC7,0x8A,0xC5,0x89,0x9C,0x40,0x14,0x4E,0x8D,0xFB,0xD8, +0xEB,0xE3,0x79,0xCA,0xEC,0x09,0x1A,0x51,0x93,0x4D,0x70,0xD8,0xE9,0x1C,0x13,0x33, +0x94,0x9B,0x85,0xB7,0x62,0x4E,0x87,0x36,0xFA,0xD9,0x6C,0xA5,0x02,0xF3,0xC3,0xF6, +0xBA,0xDA,0xE8,0xAE,0x06,0x71,0xD9,0x2F,0xDE,0xD9,0xA6,0x39,0xDC,0xBE,0x04,0xB8, +0x9B,0x77,0xDE,0x49,0x6F,0xAB,0xF3,0x4E,0x2C,0xBE,0x15,0x35,0x09,0xC9,0x29,0x69, +0x5A,0x9B,0xDE,0xD4,0x5F,0xD6,0x83,0x87,0x89,0xC4,0xB6,0xFA,0xF0,0xD4,0x32,0x51, +0xD8,0x5E,0x37,0x1E,0xF2,0x53,0xCC,0x4F,0x90,0x08,0x77,0x42,0x5C,0xAB,0x19,0xDC, +0x59,0x6D,0xC1,0x7D,0xA9,0xB8,0x56,0x9B,0x00,0xC7,0x65,0x5C,0x5B,0x30,0x13,0x4D, +0xB6,0x75,0x0C,0x34,0x95,0x6D,0x31,0xB8,0xCB,0x00,0x6E,0x7C,0x0E,0xE3,0x33,0x1A, +0xDC,0x45,0x31,0xB8,0xBB,0xA1,0xB6,0x1F,0x94,0xAD,0xE1,0x58,0xE1,0x4B,0x6E,0x30, +0x96,0xE1,0x9D,0x12,0xD2,0x9E,0xBD,0xA8,0x74,0xB2,0xD7,0xD7,0x5A,0x3B,0xE1,0x16, +0xD2,0xA2,0x56,0xEC,0x49,0x8B,0x38,0xBD,0xDA,0x54,0x7D,0x89,0xB1,0x29,0x32,0x1C, +0x8C,0xA6,0xB2,0x2D,0x84,0x4F,0x5F,0x4C,0x29,0xA0,0xC1,0x2C,0x21,0xA3,0xA8,0x5B, +0xD3,0x23,0x17,0x71,0xDE,0x4A,0x12,0xB0,0x1C,0xD9,0x5F,0x2E,0xE7,0x4A,0x8A,0x27, +0xA7,0x15,0x1E,0x2E,0x69,0xA5,0xB7,0x41,0x88,0x3B,0x3A,0xD8,0x53,0x95,0xED,0x91, +0xA7,0x48,0x5A,0xEF,0xAD,0x46,0x57,0x8C,0x5C,0x45,0x0D,0x77,0xCE,0xD6,0xB1,0xAC, +0x84,0x55,0x6F,0x37,0x96,0x65,0xBF,0x54,0x2C,0xCB,0x7E,0xE9,0x58,0x56,0xDB,0xC4, +0x1C,0x97,0xFC,0x6D,0x11,0x87,0x0F,0x25,0x7E,0x7B,0x94,0xC1,0x0F,0x65,0x65,0xC0, +0x40,0x17,0x27,0xB9,0x55,0xBA,0x53,0xE2,0x0C,0x2D,0xDF,0x22,0x0C,0x33,0xA3,0x36, +0x74,0xFC,0xE9,0x35,0x5A,0x8D,0xA5,0x96,0x6C,0x21,0x1B,0x43,0xD8,0x90,0x34,0x85, +0x4A,0xB7,0xA6,0xC7,0xFE,0xD1,0xFC,0x16,0x14,0x62,0x27,0x75,0x7C,0xA3,0xF8,0xD3, +0x4F,0x3F,0xF1,0xC5,0x35,0x35,0xEA,0xED,0x3F,0xFE,0xC8,0x9F,0xF9,0xE9,0x27,0xB6, +0xDF,0x07,0x5D,0xDC,0x20,0xAE,0x11,0x77,0x6B,0xF1,0xAD,0xD9,0xB1,0xF8,0x96,0x9E, +0x3D,0x7B,0x8F,0xF5,0x8F,0xC8,0x82,0x4F,0x56,0x2A,0xB0,0xB5,0x48,0x97,0xBD,0x29, +0xD2,0x65,0x6F,0x8A,0x74,0x45,0x48,0x92,0xAF,0x9C,0xC6,0xBA,0xA2,0x66,0x77,0x5B, +0xA1,0x2E,0x39,0xA9,0x55,0xA0,0x8B,0x26,0xB2,0xFA,0xB0,0xE8,0x9B,0xF5,0x8F,0x62, +0xCD,0x02,0x10,0xA7,0x89,0x61,0x2E,0xBD,0x3B,0x6E,0x0C,0x0D,0x5A,0xD9,0xA3,0x07, +0x20,0xF6,0xE6,0x75,0x57,0x2C,0xB9,0xE5,0xE9,0xD2,0x1E,0x80,0xDD,0xF1,0x2F,0xF6, +0x5B,0xB2,0xC4,0xED,0x21,0x5F,0x15,0x4E,0xE9,0xFB,0xCC,0xEF,0x66,0x74,0x9E,0x32, +0x60,0xF9,0x56,0x8F,0xD7,0xB9,0xFD,0xDA,0xB7,0xEF,0x43,0x34,0x87,0xBB,0x6F,0xB9, +0xAE,0xF6,0xDA,0x77,0xEE,0x47,0x54,0x77,0x0F,0x6F,0xE1,0xE7,0x0D,0x9A,0x5E,0xC2, +0x0F,0xEB,0xDC,0xF9,0xEB,0xC6,0xD3,0x85,0x9D,0xBE,0x3A,0x74,0xDD,0xEC,0x12,0x8A, +0x07,0xDA,0x5F,0x08,0xF8,0x87,0x1B,0x30,0x91,0xCC,0x8D,0x6A,0xAF,0xC3,0x50,0x32, +0x45,0x43,0x4A,0x3B,0x1D,0x86,0xD0,0x1A,0x12,0x38,0xD6,0x5D,0xD3,0x26,0xD5,0x4A, +0xDE,0x24,0x1F,0xA5,0x9A,0x0E,0x9B,0x0D,0x21,0x03,0xF7,0x35,0x6B,0x38,0x74,0x1F, +0x72,0x6D,0x57,0xEB,0xA6,0x43,0xBA,0xE5,0xEA,0x6F,0x67,0xFF,0x6F,0xC2,0x8A,0xDD, +0x90,0x6A,0x25,0x0F,0x33,0xD8,0xAC,0x12,0xAC,0xCF,0x25,0x60,0xC5,0x70,0x8A,0xA1, +0x79,0x73,0xA4,0xFE,0x94,0x43,0x9B,0x5B,0x43,0x2B,0xA6,0x21,0x9B,0xAB,0x6C,0x06, +0x6F,0x2A,0xEC,0xD3,0x8A,0xF6,0xE0,0x4D,0xA3,0xF0,0xA6,0xB7,0x03,0x6F,0x46,0x33, +0xDC,0x46,0x01,0xB7,0x34,0x8D,0x42,0xB6,0xBA,0xE4,0x4B,0xA2,0x58,0x63,0xD7,0xCD, +0xB1,0xFC,0x24,0x63,0xD3,0xDB,0xDB,0x83,0xFC,0xC7,0x1F,0x2B,0x81,0xC7,0x30,0xD8, +0x9D,0x1A,0xAE,0xD3,0xB9,0x07,0x3A,0xC2,0x36,0xA6,0xA6,0xE1,0x33,0x73,0x19,0xB3, +0x49,0x0D,0xC5,0x9A,0xA9,0xC1,0x6C,0x6A,0x3D,0x02,0x3A,0xFE,0x7C,0x8E,0x16,0xF3, +0xAA,0x4D,0xB7,0xDA,0x8C,0x5A,0x5C,0x2D,0xA8,0xA4,0x3B,0x58,0x97,0xB5,0x14,0x1F, +0xB0,0x19,0x89,0x36,0x4B,0xEF,0x98,0x76,0x60,0x6F,0xFB,0x50,0x39,0x6D,0x36,0xB3, +0x8D,0x75,0xE3,0xC7,0xD5,0xB5,0x31,0xAD,0xCA,0x23,0x47,0xEA,0xA8,0xCA,0x0A,0xFA, +0x1B,0xED,0x87,0x04,0x6B,0x82,0x19,0x78,0x6D,0x74,0x44,0xF2,0x04,0x59,0xC3,0xFF, +0x76,0x3B,0x22,0x09,0xF0,0xA9,0x75,0x57,0xA4,0x6E,0xAC,0x92,0xB0,0x59,0x6F,0x24, +0xF1,0x63,0x26,0xA3,0xB5,0xBE,0x79,0x5A,0x4F,0xD8,0xEB,0xB9,0xD6,0xAD,0x75,0x51, +0x4D,0x27,0xFF,0x4D,0xD7,0x3C,0xE9,0xD7,0x76,0xCD,0x33,0xEC,0x69,0xDE,0x57,0x37, +0xB1,0x6D,0x9E,0xA0,0xE1,0xC8,0x49,0x71,0xE4,0xE3,0xAE,0x6B,0x89,0x25,0x4C,0xE1, +0x04,0xF5,0x56,0x62,0xAB,0x8D,0x0D,0x1E,0x41,0xD6,0x38,0x59,0xA3,0x7F,0x37,0x73, +0x51,0xFA,0xB4,0x47,0x7F,0x7A,0x50,0x77,0xE3,0xA9,0x3A,0xDF,0x3E,0x46,0x35,0xB9, +0xD1,0x1A,0xAB,0xEF,0x81,0xCC,0x68,0x8E,0x53,0x5D,0x77,0x26,0x28,0x78,0xAE,0x92, +0xE3,0x8C,0x56,0xDD,0x71,0xC0,0x29,0x8D,0xEE,0xB2,0xBE,0x7E,0x46,0x7C,0x78,0x03, +0x4B,0xE7,0xF0,0xD1,0x67,0xC7,0x46,0x0D,0x66,0x3B,0x5A,0xC7,0x06,0x63,0xBC,0x1D, +0xB0,0xE4,0xA4,0x0D,0xFE,0x68,0xCF,0x46,0xFA,0x50,0xF6,0x88,0x85,0x3E,0x10,0xD1, +0x62,0xC2,0x24,0x4A,0x8B,0xD5,0x54,0xC4,0x72,0xE2,0x0C,0x66,0x74,0xA4,0x4A,0x9A, +0xC4,0xEB,0x4C,0x9A,0x52,0x97,0x69,0x0A,0x87,0x1F,0x68,0x11,0x1F,0xF9,0xF2,0x16, +0x51,0x44,0x5F,0x2C,0x87,0xF2,0xC2,0x47,0xEA,0x75,0xEA,0x80,0xE3,0xC0,0x1B,0x06, +0xCC,0x9F,0xAF,0xBE,0xA5,0xEE,0xE5,0xBF,0x21,0xD3,0xC8,0x9C,0x58,0x32,0xF3,0x1C, +0x72,0xB7,0xFA,0x89,0xFA,0x89,0x38,0x5F,0xFD,0x34,0xA6,0x03,0x19,0x0E,0x80,0x2D, +0x97,0xCD,0x75,0x01,0x49,0xF7,0x1C,0x17,0xC9,0xD4,0x3A,0x0C,0xE5,0xEA,0xF1,0xE9, +0x62,0x54,0x96,0x83,0xFD,0xA6,0x14,0xC2,0xC7,0x6E,0xA1,0x68,0xB1,0x3D,0x13,0xE7, +0x52,0x8C,0x3E,0x0D,0xA6,0x00,0xF9,0x41,0x20,0xF9,0x9D,0xB4,0xA7,0xB4,0x1D,0x0E, +0x8B,0x43,0xB2,0x9D,0x69,0x40,0xC8,0x38,0x50,0xD5,0x29,0xF0,0xC3,0x24,0x32,0xB1, +0xE0,0xCF,0x2E,0x29,0x7A,0x7C,0x4A,0x77,0x09,0x10,0x8E,0x84,0x7D,0x18,0xB0,0x32, +0x95,0x75,0xDF,0xCB,0xC5,0xB2,0x13,0x2F,0xFD,0x8A,0x27,0x8D,0x3E,0xB8,0x2F,0xC2, +0xF9,0xD1,0x71,0x27,0x17,0xC6,0x9D,0x75,0x1D,0xBA,0x34,0x9B,0xA9,0x01,0xBA,0x98, +0x23,0x4B,0xFA,0xD7,0x13,0xC7,0x2E,0x1F,0xFA,0x55,0x75,0xCC,0x95,0x79,0xC7,0xA1, +0x09,0x93,0x3E,0xBC,0x63,0xFD,0xF7,0xD7,0x5F,0x75,0xF4,0x89,0x44,0xCD,0x40,0x18, +0xC4,0x57,0xF3,0x1B,0x17,0x3F,0xB7,0x93,0xA9,0x07,0x33,0xEE,0xBA,0xF3,0xEE,0x04, +0xA7,0xC0,0xF4,0x69,0xD3,0xA7,0x25,0x68,0x0A,0xB7,0x91,0x67,0x6B,0xD1,0xC7,0xA5, +0xC5,0xC8,0x87,0x52,0xBB,0xD7,0x89,0x9D,0x96,0x13,0xA3,0xE4,0x68,0xBC,0xDB,0xC2, +0x51,0x33,0xA3,0x50,0x3B,0x50,0xA8,0x14,0x8B,0x9A,0xD7,0x5A,0xF5,0x06,0xE0,0x3B, +0xF4,0x51,0x4C,0x41,0x34,0x79,0x6B,0x6D,0xF4,0x84,0x13,0x28,0x16,0xD5,0x1F,0x9B, +0xB5,0xDD,0x36,0xF3,0x31,0x42,0x6D,0x0A,0xA8,0xEF,0xA7,0x29,0xB3,0x09,0x01,0xF5, +0xDD,0x5A,0x10,0x9F,0x70,0xFB,0xC4,0x6F,0x85,0x7E,0xD4,0x07,0x50,0x44,0xBB,0xA4, +0x08,0xE1,0x78,0x39,0xB2,0x81,0x16,0x6B,0x6A,0x45,0xFF,0xCD,0x7B,0xA0,0x6B,0x0C, +0x7B,0x1F,0x63,0xD1,0x31,0xA3,0x1F,0xEF,0xB7,0x5D,0x97,0x21,0x5C,0x0D,0xFA,0x32, +0xCA,0x11,0x9C,0x0D,0x07,0xD3,0x8B,0xB7,0xEA,0x60,0xB5,0xB1,0xB2,0x2D,0x14,0xAB, +0x04,0x4D,0x63,0x7A,0x6F,0x1A,0xE5,0xB8,0xF8,0xBC,0xE6,0x74,0xAD,0x12,0xD4,0x86, +0x7D,0xB8,0x04,0x09,0x97,0x1D,0x3B,0x5A,0xE2,0xB2,0x27,0x4B,0x8A,0x31,0x89,0x35, +0xC3,0xC6,0x80,0x7D,0x47,0x6A,0xEE,0xF6,0x0E,0xB4,0xD9,0x36,0x0D,0xC2,0xC4,0x7E, +0x16,0x5C,0xB3,0x6E,0x15,0xDC,0x7F,0x75,0xAD,0x5E,0x58,0xC3,0x3F,0x10,0xBF,0x26, +0xF4,0x24,0xF5,0x4F,0x3D,0x15,0xBF,0x66,0x48,0xBC,0x66,0x48,0xB8,0xB6,0x4D,0xA8, +0x27,0xC7,0xE8,0xF3,0x7E,0xE0,0x9A,0x3B,0x2C,0x78,0xB7,0x6D,0x9C,0x3F,0x5C,0xA8, +0x7F,0x95,0xF4,0x53,0xF7,0xBD,0x8A,0xCF,0xAD,0x10,0x54,0xF2,0x11,0xBB,0x9E,0x46, +0x35,0xC8,0xC8,0xF0,0x63,0x1B,0xE1,0x5C,0xBF,0x67,0x9F,0x55,0xF7,0xE1,0xEF,0x2F, +0xBA,0xC8,0x31,0xFA,0xAC,0x68,0x8E,0x3D,0x06,0x7A,0x5B,0xC2,0x63,0xA0,0xB1,0x57, +0xA3,0x50,0x2F,0x4C,0xA3,0xBF,0xB7,0xC4,0x46,0x08,0xC7,0xC7,0x39,0x98,0x30,0x96, +0x36,0x62,0xAB,0xDF,0xB0,0x51,0xFD,0xF1,0x7B,0x93,0x14,0x04,0xA0,0x9E,0x8D,0x90, +0x30,0xCE,0x45,0x97,0x30,0x8D,0xC2,0x61,0x89,0x41,0xD2,0xE2,0x37,0xDF,0x36,0xFF, +0x09,0x47,0x80,0x82,0x8F,0x0A,0x8F,0x8A,0x7E,0xCC,0x8B,0x7F,0xDD,0x74,0x50,0xB0, +0xEA,0xC7,0x71,0x56,0xE7,0x9F,0xBE,0xE9,0xC6,0xC1,0x5B,0xD7,0xC4,0x67,0xC8,0x93, +0xF0,0xAB,0x0F,0xCD,0x79,0x65,0xEB,0xDC,0xB9,0x5B,0xF9,0xF3,0x73,0x5E,0x79,0x65, +0xCE,0xDC,0xAD,0x5B,0x91,0x57,0x7D,0xC3,0x71,0x06,0x0F,0x7D,0x4E,0x35,0xEA,0xE5, +0x1C,0xEE,0x03,0xBF,0xF6,0xFA,0xE6,0x38,0x39,0xFE,0x27,0x72,0xFC,0xB8,0x4A,0xFF, +0xC3,0xDA,0x73,0x6E,0x29,0x5F,0x49,0x6B,0x7F,0x63,0x5D,0x55,0xD6,0xB6,0xEA,0xA3, +0x42,0xF7,0x08,0x7C,0x6F,0x15,0xFB,0x5E,0x59,0xB3,0xD2,0xE0,0xA5,0x89,0x85,0xC0, +0xF8,0x3C,0x04,0xF6,0xEC,0xE9,0x6E,0x1C,0x27,0x95,0x85,0xBB,0xE3,0x03,0x00,0x4B, +0x03,0x65,0x61,0x17,0xD7,0xD4,0x6C,0xC7,0xE0,0x37,0xF8,0x69,0x76,0x86,0x0F,0x0E, +0x12,0x18,0x14,0x27,0x94,0x2D,0x21,0x64,0x7F,0xD9,0x9A,0x4E,0xA4,0xC7,0x37,0x13, +0x76,0x8E,0x1A,0xFB,0xBB,0xC9,0x2F,0x1C,0xC9,0xE6,0x07,0x94,0x35,0x7E,0xC1,0x13, +0xC2,0x93,0x3D,0x3D,0xD5,0xDF,0x66,0x1F,0x79,0x61,0xF2,0xEF,0xC6,0xDE,0xB4,0x73, +0xFC,0x3F,0xD5,0xBA,0x4E,0xBC,0xB1,0xCA,0x17,0xCC,0x0E,0x04,0x7D,0x55,0x84,0x90, +0x9C,0xAB,0xAE,0x3A,0x7E,0xFB,0x98,0x43,0x6F,0x54,0x25,0x97,0x04,0xB2,0x4B,0x92, +0xAB,0xDE,0x38,0x32,0xE6,0x76,0x2C,0xC6,0xC8,0x21,0x02,0xF6,0xA5,0x2A,0x10,0x96, +0xEB,0xAF,0xA4,0xCF,0x51,0xF1,0x00,0x98,0xA5,0x7E,0xFA,0xA0,0x5E,0x22,0x61,0x0B, +0x48,0x64,0x17,0x01,0x41,0x22,0x05,0xBC,0xBE,0x6E,0x16,0xD9,0xB6,0x75,0xDB,0xC6, +0x9A,0x99,0x07,0xCA,0xEA,0x74,0xF7,0x55,0x54,0xA8,0xE9,0xE4,0xEF,0x6A,0x3A,0x7F, +0xF9,0x45,0x98,0x59,0xE3,0x1E,0x38,0x3E,0x4A,0x82,0x6A,0x3A,0x9D,0x27,0xF0,0xB4, +0xF1,0xE2,0x78,0xA4,0xDD,0x6E,0x92,0x5F,0xC2,0xE3,0x0B,0xEB,0x61,0xBD,0x83,0xF8, +0x5C,0x69,0xD0,0x1F,0x30,0x93,0x89,0x6B,0xD1,0x83,0x9C,0x3E,0xDE,0x0B,0x46,0x85, +0x75,0x08,0xCA,0xAF,0xD6,0xEE,0x94,0x27,0x5E,0xCB,0x47,0x76,0xAA,0x86,0x9D,0xF0, +0x8E,0xDD,0xC8,0x5F,0xFF,0x3D,0x76,0x23,0xBF,0xB0,0x5E,0x38,0x8A,0x0D,0xC9,0xC9, +0x68,0xDA,0xC2,0x9A,0xF5,0x47,0xD7,0xEE,0xA9,0xDD,0x91,0xD6,0xF5,0xFB,0x9B,0xF7, +0x35,0xE7,0xB9,0x9D,0xEA,0xEB,0xCD,0x5A,0x9B,0x9F,0xFB,0x46,0x57,0x15,0xEF,0x6E, +0xCE,0x31,0xD8,0xF4,0x0D,0x70,0x1F,0x8C,0x11,0x27,0xC2,0x66,0xC0,0x1B,0x95,0x76, +0x2F,0xEB,0x51,0xD6,0x0A,0xD6,0x26,0x78,0x69,0xE7,0xF4,0x82,0x7C,0x72,0x6E,0x54, +0x7A,0xC1,0xD0,0x85,0xDB,0xE2,0xB0,0xC3,0xFF,0xBA,0x49,0xB1,0x66,0xEA,0x9D,0x3A, +0x4D,0x9D,0x38,0xF4,0x8D,0x1B,0xD3,0xDD,0x05,0x89,0x33,0x69,0x9A,0x0D,0x89,0xC3, +0x90,0xDF,0x16,0x04,0xAD,0x26,0x96,0xD0,0xB4,0x1D,0x87,0x6E,0x3E,0x4B,0x18,0xB9, +0xD9,0xB0,0xCD,0x26,0x4C,0x27,0xFD,0xFF,0x00,0xAA,0xBA,0xEC,0x0A,0x00,0x00,0x00, +0x00,0x01,0x00,0x00,0x00,0x02,0x5E,0xB8,0x56,0xE2,0xEF,0x5E,0x5F,0x0F,0x3C,0xF5, +0x00,0x1F,0x08,0x00,0x00,0x00,0x00,0x00,0xD3,0xC2,0x29,0x10,0x00,0x00,0x00,0x00, +0xD9,0xCE,0x76,0x44,0xFF,0x96,0xFE,0x1D,0x08,0x0C,0x07,0x6D,0x00,0x00,0x00,0x08, +0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xDA,0x63,0x60,0x64,0x60,0xE0,0xBC, +0xF3,0x47,0x85,0x81,0x81,0xA3,0xFF,0xFF,0xB4,0xFF,0xA7,0x38,0x78,0x18,0x80,0x22, +0x28,0xE0,0x25,0x00,0x9A,0xCA,0x06,0xFA,0x78,0xDA,0x6D,0x93,0x31,0x68,0x53,0x51, +0x14,0x86,0xFF,0xF7,0xDE,0x7D,0x79,0x21,0x83,0x88,0x08,0x45,0x1C,0x1C,0x8A,0x88, +0x38,0x64,0x08,0x41,0x4A,0x0D,0x5D,0x3A,0x88,0x38,0x39,0x88,0x43,0x28,0xA5,0x94, +0x80,0x83,0x48,0x08,0x0E,0xA5,0x3A,0x74,0x2A,0x25,0x43,0x04,0x21,0x43,0x91,0x0C, +0xC5,0x41,0x82,0x04,0x09,0xA5,0x48,0xE8,0x12,0x24,0x94,0xE0,0x24,0x22,0x45,0x1E, +0x08,0x52,0x42,0x11,0x22,0x38,0x38,0x49,0x31,0x7E,0xE7,0x25,0x85,0xA0,0x0D,0x7C, +0xFC,0xF7,0x9D,0x7B,0xCE,0xCD,0xBB,0xFF,0x9F,0xF8,0x43,0x2D,0x8A,0x8F,0xDF,0x84, +0xAA,0x14,0xE4,0xBD,0x7C,0xD0,0x52,0x2F,0xB5,0xAB,0x46,0x38,0xA3,0x66,0xB4,0xAD, +0x72,0xAA,0xA0,0x0D,0x3F,0xA7,0x5E,0x70,0x45,0x6F,0xE1,0x95,0x93,0x0A,0xEC,0x7F, +0xA1,0xBF,0xE1,0x1F,0x69,0x15,0x8D,0xFD,0xB6,0x44,0xFF,0x26,0x7C,0x83,0x3A,0xBC, +0x84,0x55,0xB0,0x73,0x6A,0xF0,0x1A,0xAA,0xB0,0x41,0xEF,0x4F,0x68,0xD8,0x19,0xA7, +0xB8,0x05,0xBD,0x48,0x8B,0xF9,0x35,0x9D,0x0F,0x9F,0xA9,0x1F,0xD6,0x55,0x49,0x5D, +0x47,0xCF,0xA9,0xEF,0xB6,0xD5,0x4F,0xE5,0x78,0x76,0xEA,0xFB,0x45,0x63,0x54,0x0F, +0x17,0xA8,0x3F,0xA1,0x7E,0x4C,0xCF,0x09,0x7A,0x57,0x15,0xF7,0x69,0xAC,0x61,0x8D, +0xDA,0x45,0x6D,0xBA,0xA3,0xD1,0xEF,0x30,0x56,0xDB,0xCE,0x8C,0xBE,0x6B,0x31,0x5C, +0x57,0x81,0xDA,0x09,0x5A,0xB4,0xBB,0xD8,0x3B,0xA3,0x07,0xC9,0xF7,0x6B,0x34,0xE4, +0x5E,0x4D,0x77,0xAC,0x75,0x66,0x3B,0xAE,0xA4,0x32,0x5A,0x76,0x43,0x95,0xFD,0x8F, +0xCA,0xDA,0x3A,0xBC,0xA0,0x8E,0x3F,0xA7,0xAE,0x3F,0x37,0x8A,0xDD,0xCE,0x78,0x1D, +0x7D,0x50,0xC7,0xEA,0x6E,0x90,0xF4,0x77,0xAC,0x2F,0xB8,0xC3,0xF3,0x0D,0x3D,0x0E, +0x66,0x75,0x93,0xBD,0x96,0xDB,0xC7,0xAF,0xAA,0xEE,0xA3,0xF3,0xB6,0x76,0x39,0x3D, +0x08,0x67,0x3C,0xF9,0x6D,0xCF,0x99,0x4E,0xBC,0x4C,0xBC,0xC7,0x9F,0x37,0xE6,0x11, +0x2C,0xC1,0x3D,0xEB,0xE1,0xBD,0x8A,0x70,0x98,0x96,0x77,0x39,0xE8,0x71,0xCF,0xC1, +0xD8,0x3B,0xF3,0xDE,0x6A,0xEC,0x7D,0x86,0xF7,0x56,0x0B,0xF2,0x5A,0x82,0x15,0x27, +0xAF,0xC2,0x7C,0xCB,0xFC,0xB7,0x7C,0x78,0x9E,0xA5,0xBE,0xC5,0xFC,0x32,0xF3,0xDD, +0xA8,0xAB,0xAD,0x09,0x2B,0x78,0x5F,0x4B,0x7C,0x3F,0x03,0xEE,0x97,0xB6,0x2C,0x2C, +0x87,0x69,0xC8,0x61,0x1E,0x76,0xC8,0xE2,0x0F,0x9A,0x22,0x9F,0xCC,0x69,0x0E,0xFF, +0xB1,0xEB,0x5D,0x42,0x4B,0x49,0x16,0x53,0x58,0x16,0xEE,0x90,0xF3,0x32,0xF8,0x85, +0xEF,0x67,0x11,0xC5,0x68,0x69,0x9C,0xC3,0x34,0x64,0x70,0x80,0xFF,0xCF,0xD1,0xAF, +0xF0,0x2B,0xF1,0x7F,0x92,0xC3,0xBF,0x24,0xF9,0x0E,0x74,0xDB,0xB2,0x98,0xC6,0xB2, +0x48,0xB2,0x46,0xD3,0x35,0x55,0xD2,0x59,0xFA,0xED,0x9D,0xA4,0x2E,0xEC,0x05,0x7B, +0x52,0xF4,0x88,0x5C,0x26,0xEA,0xAF,0x49,0x5E,0x0C,0xB7,0xC6,0xE8,0x07,0xFA,0x14, +0x7D,0xC8,0x9E,0xFD,0x0F,0x26,0x30,0x4B,0x2E,0xC9,0xFF,0xA2,0x05,0x6D,0x53,0x77, +0x75,0x8A,0x77,0x5E,0x8E,0xFD,0xA1,0xCD,0x06,0x39,0x35,0xA0,0x6B,0xE7,0x92,0x95, +0xC8,0xF3,0x9A,0x5B,0x66,0x9D,0xE1,0x37,0x07,0xD1,0xBE,0xB2,0xCA,0xFE,0x05,0x11, +0x80,0xE6,0x3B,0x00,0x78,0xDA,0x63,0x60,0x60,0xD0,0x81,0xC2,0x18,0x86,0x0E,0xC6, +0x1C,0x26,0x26,0xA6,0x25,0xCC,0x3A,0xCC,0x3E,0xCC,0x45,0xCC,0x33,0x98,0xCF,0xB1, +0xF0,0xB0,0xE8,0xB1,0xF8,0xB0,0xE4,0xB0,0x2C,0x60,0xF9,0xC4,0x6A,0xC4,0xDA,0xC6, +0xA6,0xC5,0x56,0xC0,0x76,0x8B,0x3D,0x88,0xBD,0x8C,0xFD,0x1F,0x47,0x19,0xC7,0x3C, +0x8E,0x13,0x1C,0x77,0x38,0xFE,0x71,0x0A,0x71,0xD6,0x70,0x79,0x70,0x55,0x71,0x3D, +0xE0,0xD6,0xE3,0x2E,0xE0,0x5E,0xC3,0xFD,0x88,0x27,0x84,0xA7,0x87,0x67,0x15,0xCF, +0x35,0x5E,0x2E,0x5E,0x03,0xDE,0x3C,0xDE,0x65,0xBC,0x7F,0xF8,0xEC,0xF8,0x96,0xF0, +0x33,0xF0,0xB7,0xF1,0x6F,0xE3,0xFF,0x22,0x20,0x21,0x30,0x4B,0xE0,0x8C,0xC0,0x1F, +0x41,0x2D,0xC1,0x30,0xC1,0x0E,0xC1,0x5D,0x82,0x8F,0x04,0xFF,0x08,0xC9,0x09,0xF5, +0x09,0xBD,0x12,0x36,0x11,0x9E,0x24,0xFC,0x43,0xC4,0x46,0x64,0x8B,0xC8,0x1F,0x51, +0x35,0xD1,0x38,0xD1,0x3E,0xD1,0x15,0x62,0x02,0x62,0x21,0x62,0x8B,0xC4,0xFE,0x88, +0x87,0x89,0xF7,0x49,0x08,0x48,0xC4,0x48,0x2C,0x93,0x38,0x25,0xE9,0x25,0x59,0x23, +0xB9,0x4E,0xF2,0x86,0x94,0x99,0x54,0x80,0xD4,0x1A,0xA9,0x0F,0x52,0x1F,0xA4,0xA5, +0xA4,0x27,0x49,0x7F,0x91,0x29,0x91,0xB9,0x27,0xCB,0x24,0xBB,0x44,0xF6,0x82,0x5C, +0x8B,0x3C,0x97,0xBC,0x8E,0x7C,0x88,0x7C,0x91,0x82,0x9D,0x42,0x8C,0xC2,0x1A,0x85, +0x5F,0x8A,0x7E,0x8A,0x9F,0x94,0x84,0x94,0x2A,0x94,0x76,0x28,0x5D,0x53,0x16,0x53, +0x0E,0x53,0xDE,0xA1,0x7C,0x4B,0xA5,0x42,0x55,0x49,0x4D,0x45,0xAD,0x4F,0xED,0x84, +0x3A,0x93,0xBA,0x83,0xFA,0x21,0x0D,0x39,0x8D,0x1E,0x8D,0x47,0x9A,0x59,0x9A,0xEB, +0x34,0xBF,0x68,0x39,0x69,0xCD,0xD1,0x3A,0xA2,0xF5,0x4E,0x5B,0x46,0x3B,0x4A,0xFB, +0x80,0x8E,0x93,0xCE,0x02,0x5D,0x06,0xDD,0x14,0x3D,0x06,0xBD,0x32,0xBD,0x19,0xFA, +0x32,0xFA,0x29,0xFA,0x6B,0xF4,0x7F,0x18,0x84,0x19,0x4C,0x30,0xB8,0x65,0x18,0x67, +0x78,0xCB,0x28,0xC2,0xE8,0x8E,0xF1,0x0C,0x13,0x2D,0x93,0x2B,0xA6,0x2D,0x66,0x1C, +0x66,0x65,0x66,0xCF,0xCC,0xA3,0xCC,0x6F,0x59,0x70,0x58,0x98,0x59,0x64,0x59,0xAC, +0xB2,0x54,0xB1,0xDC,0x62,0x25,0x60,0x95,0x63,0x75,0xC2,0x3A,0xCD,0xFA,0x8A,0x0D, +0x87,0x4D,0x8F,0xCD,0x23,0x5B,0x2B,0xDB,0x19,0x76,0x2C,0x76,0x76,0x76,0xD3,0xEC, +0x5E,0xD8,0x7B,0xD9,0xBF,0x70,0xB0,0x70,0x48,0x70,0xD8,0x83,0x03,0x9E,0x72,0xB8, +0xE1,0xF0,0xCC,0xE1,0x8B,0x23,0x93,0xA3,0x90,0xA3,0x92,0xA3,0x91,0xA3,0x8F,0x63, +0x9A,0x63,0x83,0xE3,0x02,0xC7,0x6D,0x40,0x78,0xCA,0xF1,0x9E,0xE3,0x3D,0x27,0x2D, +0xA7,0x20,0xA7,0x38,0xA7,0x0E,0xA7,0x35,0x4E,0xEF,0x9C,0xD5,0x00,0x67,0xA3,0x97, +0x68,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xEA,0x00,0x4D,0x00,0x05,0x00,0x00, +0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x16,0x00,0x00,0x01,0x00,0x01,0x54, +0x00,0x00,0x00,0x00,0x78,0xDA,0xED,0x5A,0xDD,0x6E,0x1B,0x45,0x14,0x1E,0xB7,0x05, +0x95,0x01,0xAA,0x52,0xA1,0x0A,0x71,0x35,0x8A,0x84,0x12,0x24,0x93,0xA6,0x2D,0x50, +0x91,0x2B,0x5C,0xC7,0x49,0x43,0xD3,0xA4,0x24,0x4E,0x02,0x97,0x1B,0xEF,0x26,0x71, +0x13,0x7B,0x8D,0xBD,0x4E,0x08,0xD7,0x3C,0x06,0xCF,0x80,0x78,0x08,0x2E,0xF8,0xBB, +0xE2,0x8E,0x1B,0x2E,0x78,0x12,0xCE,0xF9,0xE6,0xCC,0xEE,0xAC,0xBD,0x76,0x92,0x36, +0x7F,0x48,0xC8,0xCA,0xEE,0xEC,0xCC,0x99,0xF3,0xF3,0x9D,0x33,0x67,0x66,0x8E,0xA2, +0x94,0xBA,0xA3,0xFE,0x56,0xD7,0x55,0xE9,0xC6,0x1B,0x4A,0x95,0x66,0x94,0x92,0x76, +0x49,0xDD,0xA5,0x2F,0xDB,0xBE,0xA6,0x6E,0x96,0xE6,0xA5,0x7D,0x9D,0xFA,0x97,0xA5, +0x7D,0x43,0x99,0x52,0x28,0xED,0xD7,0xD4,0x7B,0xA5,0xEF,0xA5,0xFD,0xBA,0x7A,0xB7, +0xF4,0x83,0xB4,0x6F,0xAA,0x89,0xD2,0x4F,0xD2,0x7E,0x53,0xCD,0x96,0xFE,0x94,0xF6, +0xDB,0x1F,0xCC,0x5E,0x7B,0x4B,0xDA,0xB7,0xD4,0xEE,0xA4,0xE3,0x7F,0x5B,0xDD,0x9D, +0xFC,0x51,0xDA,0xEF,0xA8,0x9B,0x93,0x3F,0x4B,0xFB,0x17,0xEA,0xFF,0x43,0xDA,0xBF, +0xAA,0x99,0xC9,0x7F,0xA4,0xFD,0x9B,0xBA,0x35,0x75,0x47,0xDA,0xBF,0xAB,0xDB,0x53, +0xC6,0xB6,0xFF,0xBA,0xAE,0xDE,0x9F,0x9A,0x51,0x55,0x15,0xAB,0x8E,0x3A,0x52,0x5D, +0xD5,0x54,0x3B,0x6A,0x57,0x25,0xCA,0xA8,0x29,0xD5,0x50,0x1F,0xD2,0xFB,0x81,0x9A, +0xA1,0xDF,0x43,0x6A,0x6D,0x11,0x85,0x51,0x8F,0x89,0x26,0x51,0x3D,0xFA,0xEB,0xAA, +0x48,0x05,0xAA,0xA5,0xCA,0xD4,0xBB,0xA8,0xDA,0x44,0x3F,0x4D,0xAD,0x8A,0xDA,0xA7, +0x9F,0x51,0xAB,0x29,0xAF,0x1E,0xBE,0x22,0x7A,0x47,0x34,0xE7,0x80,0x9E,0x21,0x51, +0xEA,0x13,0x48,0xFD,0x34,0x95,0x5A,0x27,0x49,0x07,0x24,0xEB,0x05,0xCD,0x69,0x13, +0x35,0xEB,0x11,0xD0,0x9C,0xD3,0x49,0x9C,0xA3,0xD6,0x0B,0x9A,0xB7,0xA1,0xFA,0x44, +0xD1,0x20,0xDA,0x00,0xDC,0x22,0xCC,0x08,0x60,0x91,0x21,0x2E,0x6D,0x7A,0x76,0x88, +0x66,0x8B,0xF8,0x36,0x89,0xCE,0xD0,0xFC,0x98,0xA4,0x07,0x18,0x1B,0xE4,0xB3,0x06, +0x2E,0x3D,0xD2,0x28,0xA6,0xDF,0xDE,0x88,0xD1,0xE2,0x5E,0x93,0xCE,0xDA,0x80,0xAE, +0x3D,0x92,0x10,0x43,0xFE,0x03,0xD2,0xF8,0xA1,0x7A,0x94,0x9B,0x57,0xCC,0x6B,0x1B, +0x33,0xAC,0xD5,0x89,0xF8,0x84,0x51,0x48,0xC8,0x86,0x59,0x75,0x8F,0x7E,0xA1,0xD0, +0x1F,0x10,0xFD,0x34,0xD1,0xC5,0xF4,0xEE,0x92,0x5D,0x11,0xE6,0x76,0x81,0xC0,0x34, +0xF1,0x88,0x68,0xCE,0xBC,0xC7,0xCD,0x21,0xE2,0xBC,0x32,0xEC,0x7B,0x1E,0x63,0x94, +0x23,0x78,0x2A,0x22,0xBC,0x62,0x75,0x48,0xB4,0xEC,0x97,0xB3,0x41,0x9B,0x39,0x2D, +0xD0,0xC8,0x11,0xD1,0xEC,0x62,0x66,0x93,0xC6,0x3A,0xD0,0x3B,0x81,0x67,0x19,0x81, +0x2E,0x66,0x70,0x2C,0x30,0xD7,0x83,0x01,0x54,0x06,0xED,0xC8,0xA2,0xA9,0x9F,0x8B, +0xA6,0x51,0xD6,0x68,0xFA,0x15,0xD9,0x6E,0x7D,0x16,0x50,0xCB,0x47,0x6D,0x38,0xAE, +0xB5,0xFA,0xE8,0x15,0x7E,0xFA,0x44,0x6B,0xE5,0xEC,0x57,0xA8,0x39,0xC6,0xE6,0x26, +0x8D,0x68,0xB4,0x12,0xF4,0x70,0x94,0xB5,0x80,0xF5,0x1E,0xF5,0xC5,0xE4,0x81,0xE3, +0x74,0x61,0xCB,0x9E,0x83,0x5F,0x0B,0xDC,0xB2,0xE8,0x6F,0x42,0xA7,0x5D,0x8C,0x45, +0x62,0xD7,0x0E,0xA4,0xB4,0xC5,0xEB,0x65,0xF1,0xBB,0xF5,0x96,0x95,0x66,0x63,0xCC, +0xC6,0x73,0x19,0x7A,0xC5,0xF0,0x7E,0x1B,0xF3,0x3B,0xB2,0xC2,0xAC,0x84,0x98,0xB8, +0x26,0x12,0x63,0x4D,0x89,0x82,0x00,0x3C,0x2C,0xD2,0x5A,0x78,0x26,0xD0,0x62,0x30, +0x9E,0x1A,0xA0,0xE3,0x38,0xB4,0xDC,0x1D,0x07,0xA6,0xB6,0xBA,0xDB,0x58,0x8E,0xB0, +0x5E,0x6D,0xEC,0x4D,0x78,0x51,0x32,0x01,0xCF,0xF1,0xDC,0x10,0xEF,0x1E,0xF4,0x6A, +0xD0,0x9C,0x40,0xEC,0xD3,0x58,0x05,0x0D,0x8A,0xD0,0x16,0xB8,0x24,0x18,0x71,0xF8, +0x6C,0x53,0x6B,0x5F,0x56,0xD2,0x54,0xAA,0x63,0x26,0x81,0x33,0x0C,0xEB,0x9F,0x50, +0xFC,0xDA,0xE8,0x67,0x89,0x19,0x26,0xDC,0xD3,0xC1,0xAA,0x09,0x49,0x42,0x03,0xB3, +0x9D,0x36,0x21,0x2C,0x48,0x10,0x6B,0x5B,0x34,0x9A,0x60,0xD4,0xCA,0xD0,0x63,0x24, +0x94,0x65,0x35,0x37,0x48,0xB3,0x3E,0xB8,0x58,0x4C,0x0E,0x11,0x03,0xBB,0xC8,0x3A, +0x89,0x20,0xD3,0x42,0x9F,0x6F,0x91,0xB3,0xA1,0x9B,0x8B,0x4A,0xAB,0x6D,0x1F,0x18, +0x96,0x3D,0xEF,0x70,0xBB,0x05,0x7F,0x5A,0x5F,0x6B,0x2F,0x83,0xF4,0x68,0x76,0x79, +0x84,0x1D,0xE5,0xD4,0xCE,0x7B,0xC8,0x20,0x06,0x9C,0xED,0x7A,0xB0,0xBC,0x9B,0x82, +0x6A,0xDE,0xFB,0xE3,0xAD,0x76,0xC8,0x59,0x6D,0x3B,0x69,0x44,0x27,0xD0,0x2B,0x8B, +0xBA,0xCC,0xA2,0x43,0xE0,0xD1,0x3A,0x91,0x04,0xB7,0x1A,0xB6,0x91,0xB5,0xDB,0x62, +0x61,0xE4,0x49,0x0C,0xF1,0x64,0x19,0x65,0xBC,0x19,0x89,0x17,0x44,0xD1,0x00,0x3F, +0x4B,0xE3,0xFC,0xC7,0x71,0xBC,0x2F,0x99,0xCD,0x79,0xA8,0x01,0xD9,0x21,0x34,0x6E, +0x8A,0xA6,0xB3,0x58,0x9D,0x75,0xD1,0x2E,0x20,0x8E,0x31,0x32,0x43,0xE6,0x03,0x3F, +0x17,0x65,0x08,0x0C,0x67,0x82,0x36,0xD1,0x27,0xB2,0x1A,0x7A,0x39,0x5A,0xB7,0x56, +0x3A,0x85,0x39,0xC0,0x9F,0x67,0x60,0x73,0x00,0xCD,0x35,0x72,0x73,0x3E,0xD6,0x2C, +0x1A,0x76,0x2F,0x09,0xC6,0xF8,0x33,0xC6,0x2E,0x67,0xC4,0xF7,0x2D,0xBC,0xA3,0x53, +0x78,0x9B,0x69,0x8E,0xA0,0xEF,0x36,0xB2,0x00,0xF3,0x9E,0xCE,0x21,0x35,0x6E,0x2E, +0x63,0x72,0x24,0x7B,0x8B,0x95,0xCE,0x98,0x6F,0x43,0xC7,0x50,0x22,0x69,0x1F,0x71, +0xDA,0x4D,0x7B,0xAC,0xA6,0x8C,0x69,0xE8,0xF9,0xDC,0x8F,0x3A,0xB7,0x83,0x06,0xD8, +0x11,0x9B,0xC8,0x19,0xFB,0xF8,0xD2,0xA9,0x45,0x21,0x34,0x65,0x7F,0xB5,0x3D,0x34, +0x76,0x72,0xFB,0xAA,0x95,0xE4,0x72,0x68,0x80,0xE8,0xB1,0xB1,0xEB,0x64,0x0C,0xE2, +0xD3,0x3B,0xD6,0x26,0xA7,0xA5,0x16,0x0B,0xB2,0x08,0x0B,0xE0,0xA3,0x93,0x6B,0x90, +0x97,0x33,0x88,0x47,0x91,0x6E,0x65,0xF1,0xF7,0x3E,0xE6,0x35,0x47,0x64,0x73,0x9D, +0x7A,0xA7,0x8B,0x3C,0x1B,0x20,0xAF,0x64,0x7C,0x5D,0x4F,0x2F,0x8D,0x48,0xB7,0x5E, +0x06,0x77,0x8F,0x48,0xF2,0x5C,0x04,0x2B,0x9C,0xA4,0x43,0x58,0x15,0x62,0xFE,0x44, +0xC1,0x7E,0x38,0x91,0xDA,0x3D,0x38,0x43,0xD3,0x98,0xDB,0x6D,0x27,0xBC,0x28,0xB3, +0x6B,0x66,0x69,0x60,0x7F,0xD9,0xC2,0x7A,0x8F,0x3D,0x5D,0xFB,0xB2,0x0E,0x5C,0x9C, +0x1C,0xD0,0x68,0xB3,0x00,0xB1,0x48,0x7D,0x0B,0x9C,0xDB,0xB2,0x92,0x3B,0xF4,0xB3, +0xBB,0x57,0x80,0x8C,0x1A,0xA5,0x33,0x7C,0xBF,0x5B,0x9D,0x5D,0x8F,0x2E,0x5C,0x29, +0xBB,0xC8,0xF0,0x06,0xEF,0x9E,0xE8,0x18,0x21,0x92,0x46,0xC5,0x89,0xCB,0x75,0x45, +0xB9,0x3B,0xC4,0x4E,0xD0,0x86,0xDF,0x7D,0xBC,0x8A,0x50,0xD5,0x1E,0x72,0xBE,0x0F, +0x5F,0x76,0xAD,0xF6,0x90,0x35,0xDD,0x5E,0x9D,0xAD,0x36,0xB7,0x92,0x02,0xEC,0x6B, +0xEE,0xEC,0xD1,0x95,0x19,0x79,0x8E,0x1D,0x44,0xF4,0x1E,0x3D,0x77,0xC4,0x63,0x76, +0x3F,0xE4,0xA8,0xD2,0x69,0x56,0x3D,0xCF,0x4C,0x35,0xDA,0xAA,0x2D,0x59,0x23,0x89, +0xEC,0x87,0xDB,0x29,0x52,0x4F,0x54,0x0D,0x72,0x56,0xD4,0x32,0x7D,0xB1,0x9C,0x15, +0xFA,0xAA,0xAB,0x4D,0x3A,0x47,0xAE,0x62,0x6C,0x91,0xFA,0x0C,0x9D,0xE3,0x56,0x69, +0x64,0x83,0xBE,0xE6,0xA8,0x77,0x0E,0x7E,0xA9,0x60,0x84,0xC7,0x27,0xB0,0x1A,0x37, +0xA9,0xCD,0x1C,0x57,0xD4,0x3A,0x78,0x59,0x1E,0xAB,0xF4,0x64,0xDE,0x5F,0x53,0x0F, +0xF3,0x36,0xF8,0xE6,0xAF,0xA7,0x44,0xBF,0x4C,0xBC,0x78,0x6E,0x4D,0x7D,0x05,0x19, +0x35,0xE2,0xB6,0x46,0x9A,0xAD,0x50,0x9B,0x79,0x3F,0xA3,0xDE,0x25,0x7A,0xD7,0x84, +0x8E,0x67,0x54,0xA9,0x67,0x9D,0xBE,0xB9,0xBD,0x80,0x53,0xA8,0x95,0xB7,0x4C,0xB3, +0xEA,0x58,0x3B,0x3C,0x8F,0x75,0xB1,0x9A,0xD6,0xA9,0x3F,0x93,0x9A,0xD7,0x6A,0x11, +0x12,0x9D,0x66,0xCF,0xE8,0x6B,0x95,0xF8,0x3F,0x91,0xD1,0x0A,0xF1,0x5E,0x04,0x3F, +0xD6,0xBF,0x8C,0xF3,0x11,0xB7,0x97,0x45,0x4F,0x8B,0xDC,0x2A,0xB8,0x33,0x46,0xCC, +0x99,0x79,0x56,0x49,0xA3,0x25,0x7C,0x71,0xEF,0x3A,0xBD,0x9F,0x13,0xDD,0x1A,0xF0, +0xAC,0xC0,0x66,0xAB,0xED,0x32,0x6C,0x98,0xA7,0x71,0x6B,0x4B,0x0D,0x1A,0x58,0x4F, +0x58,0x8D,0xAA,0xF4,0x7E,0x4E,0xB2,0x99,0x62,0x81,0xF4,0xAA,0x03,0x05,0x96,0x54, +0x17,0xCA,0x32,0xFC,0xC8,0xF6,0xCC,0x61,0x3E,0x4B,0x7D,0x0A,0x2A,0xAB,0xD9,0x8A, +0x78,0x79,0x15,0xB7,0x00,0xC7,0x65,0x5A,0xB0,0xB4,0x7A,0x30,0xFE,0x1B,0xA9,0xE4, +0x35,0xD8,0xBF,0x44,0x3F,0x03,0xFB,0xEB,0xD4,0x53,0x87,0x6F,0x2A,0xC4,0xDF,0xF1, +0x75,0xB1,0xB3,0x00,0x0E,0xAC,0xB7,0x06,0x1A,0xEB,0xB0,0xAF,0x02,0x1C,0x56,0x20, +0xE1,0x31,0xE8,0x18,0x45,0xC6,0x73,0x29,0x8D,0xB8,0x55,0xCF,0x2B,0x55,0xE0,0xC5, +0x7E,0x2B,0xE3,0x6E,0x59,0x81,0x25,0x0B,0xA9,0x77,0x06,0x2D,0x71,0xDC,0x7C,0xEF, +0x14,0x45,0x87,0x4E,0x25,0x2C,0xC0,0xBE,0x1A,0x90,0x5A,0x02,0xF5,0x1A,0xE1,0x58, +0x23,0xFA,0xC5,0xB4,0xC7,0xC6,0xE3,0x22,0x6C,0xAD,0x0A,0xD6,0x96,0xA7,0x8D,0x7B, +0x1B,0x13,0x4B,0x1E,0xBA,0x55,0xD8,0xC8,0x9E,0xFD,0x92,0xA4,0xD6,0x24,0xA6,0x2A, +0xC0,0x2E,0x6F,0x05,0xFB,0x69,0x13,0xFA,0x67,0x56,0x58,0x0F,0x54,0xE4,0x59,0xF5, +0x30,0xCB,0xBC,0xBF,0x2C,0xDE,0x75,0xFA,0xD4,0x21,0xB9,0x5E,0x80,0xCA,0x26,0xD6, +0x62,0x0D,0x54,0x15,0xF8,0x7A,0x2D,0x5D,0x23,0xF3,0x58,0xBF,0xCF,0x44,0xF3,0xF5, +0x34,0xC2,0xB2,0x1C,0xB0,0x2E,0xF1,0xB9,0x92,0x6A,0x96,0xC7,0xD7,0xAD,0x23,0x47, +0x77,0x92,0xDC,0x61,0x79,0x39,0xD9,0x79,0x0F,0xCE,0x21,0x9E,0x96,0x44,0xC3,0xB5, +0x14,0x0D,0x4B,0xA1,0xC7,0xF0,0xB5,0xB9,0xAB,0x46,0xFB,0x5A,0x03,0xF7,0x9C,0x24, +0xCD,0xDB,0xF9,0x9D,0xDB,0x3F,0x35,0x66,0xA7,0x51,0xFF,0xDC,0x59,0xF6,0x72,0xAD, +0x7F,0x12,0xB0,0x59,0x78,0x01,0xB4,0xAD,0x01,0xBA,0xAC,0xD7,0xDE,0x96,0xEC,0x9E, +0x95,0xDD,0x75,0xFC,0xB3,0x5B,0xD1,0x0D,0xDB,0xDD,0x8E,0xCB,0xB9,0x53,0x6F,0x76, +0xFA,0xB0,0xB9,0xDB,0xDE,0x89,0xFC,0x53,0x6F,0x88,0xF3,0xB9,0x3D,0x03,0xF6,0xD2, +0x53,0x49,0x8C,0x73,0x60,0x9C,0x9E,0x4C,0x0E,0x31,0x1A,0x79,0xB7,0x15,0x5B,0x3B, +0x89,0x73,0xF7,0x3C,0x96,0x1C,0x60,0xEF,0x2F,0xA7,0xB2,0xDC,0x5E,0x14,0x7B,0xA7, +0x9C,0x10,0x5A,0xEF,0x8B,0xB4,0x5E,0x01,0x9A,0xA3,0x77,0x28,0x3D,0x74,0x33,0xEC, +0x60,0xBF,0xB7,0x52,0x0E,0xD1,0x4E,0xE4,0x64,0xC2,0xF6,0xF5,0x85,0x96,0xFB,0xBF, +0x1B,0xB8,0x0D,0x77,0x07,0x6E,0x53,0x99,0x0F,0x4C,0xA1,0x0F,0x9C,0x2D,0x45,0x27, +0x07,0x1F,0xFF,0x2E,0xFC,0xDD,0x91,0xBB,0x54,0x13,0x08,0xF3,0x79,0x72,0x5A,0xF8, +0x76,0xD3,0x7B,0x59,0x86,0x09,0x23,0x60,0xEB,0x6A,0xAD,0x01,0xAF,0x67,0xD1,0xC7, +0xDC,0x66,0x87,0xAA,0x0A,0x09,0x4E,0xC4,0x99,0xE6,0x21,0xB0,0xD6,0x52,0xA3,0x63, +0x99,0x1A,0xF9,0xCA,0xD5,0xB8,0x2E,0xBF,0xEA,0x74,0xD6,0x15,0xDA,0xAB,0x54,0x0F, +0xD2,0xB9,0x7A,0x90,0xB9,0xB0,0x7A,0x90,0x2E,0xAC,0x07,0x99,0x0B,0xAE,0x07,0xE9, +0x13,0xD5,0x83,0xF2,0x27,0xF9,0x86,0xA7,0x53,0x6F,0xE8,0x9E,0x71,0xB2,0x0A,0x6A, +0x51,0x85,0x45,0x5F,0x5A,0x5D,0xC9,0x0C,0xD5,0x95,0xF4,0xFF,0x75,0x25,0xAF,0xAE, +0xA4,0x73,0xEB,0xE1,0xBF,0x57,0x57,0xD2,0xB9,0x1D,0xF6,0xF2,0xEA,0x4A,0xFA,0x8A, +0xD6,0x95,0x74,0x61,0x5D,0xC9,0x5C,0x70,0x5D,0x49,0x8F,0xA9,0x17,0x5C,0x4C,0x5D, +0x49,0x9F,0xBA,0xAE,0x64,0xCE,0xA5,0xAE,0xA4,0x47,0xD4,0x95,0x46,0xED,0xBE,0xA3, +0xAB,0x4B,0xF6,0x7E,0x6E,0x4F,0x12,0x57,0xAD,0xBA,0xA4,0x07,0xAA,0x4B,0xE6,0x12, +0xAB,0x4B,0x7A,0x0C,0xBA,0xC6,0x43,0xF0,0x6A,0x57,0x99,0x34,0x62,0xCC,0x5C,0x81, +0x2A,0x93,0xBE,0xC2,0x55,0x26,0x3D,0x50,0x65,0x32,0x97,0x52,0x65,0xD2,0xC7,0x56, +0x99,0xCC,0x85,0x55,0x99,0xF4,0x29,0xAA,0x4C,0xE6,0xDC,0xAA,0x4C,0x1A,0x18,0x6C, +0x10,0xD7,0x2F,0xA0,0xAD,0x45,0xBB,0x42,0xE3,0x17,0x57,0x3B,0xD2,0x85,0x3E,0xBF, +0xAC,0xDA,0x91,0x1E,0xAA,0x1D,0x99,0x4B,0xAB,0x1D,0xE9,0x91,0xB5,0x23,0x73,0x81, +0xB5,0x23,0x7D,0x8A,0xDA,0x91,0xB9,0xB4,0xDA,0x91,0xCB,0xAC,0xA3,0x77,0x94,0xE1, +0x8A,0x8F,0x7E,0x89,0x8A,0x8F,0x39,0xA7,0x8A,0x8F,0x7E,0xA5,0x8A,0x8F,0x39,0xA3, +0x8A,0x8F,0xF6,0x2A,0x3E,0xE3,0xEA,0x0E,0x67,0x51,0xA1,0x49,0x86,0xF8,0x7F,0xEE, +0x55,0x1A,0x34,0xE4,0xF0,0xD7,0xF4,0x2B,0xFC,0xCF,0xD5,0x3D,0xE0,0xB2,0x47,0x7F, +0xF7,0xA0,0x5B,0x88,0x53,0xD3,0x34,0xCE,0xAF,0x1D,0xEA,0xCB,0x9F,0xC6,0xC6,0xFF, +0xF7,0xD9,0x26,0xEA,0x23,0xDB,0xA9,0x0F,0xEE,0x13,0x9F,0x19,0x9C,0x45,0xFA,0x58, +0x33,0x0D,0xE9,0x7D,0x84,0xE7,0x27,0xA4,0xED,0xC7,0xEA,0x33,0x7A,0x3E,0xA0,0xB7, +0xAD,0xEA,0xDC,0xA7,0xEF,0x50,0x76,0xF4,0x3E,0xEE,0x0D,0x3D,0xE0,0xD2,0xC5,0xAD, +0x87,0x23,0xC3,0xF7,0xF0,0x37,0xD4,0xD3,0xA4,0x31,0xC6,0x63,0xFF,0x5F,0x11,0x2E, +0xC0,0xFA,0x00,0x00,0x78,0xDA,0x6D,0xD0,0x47,0x4C,0x54,0x61,0x10,0xC0,0xF1,0xFF, +0xC0,0xB2,0x0B,0x4B,0xEF,0x1D,0xEC,0xBD,0xBC,0xF7,0x76,0x97,0x62,0xDF,0x05,0x9E, +0xBD,0xF7,0x2E,0x0A,0xEC,0xAE,0x22,0xE0,0xE2,0xAA,0x58,0x50,0x23,0xF6,0x12,0x8D, +0x89,0x9E,0x34,0xB6,0x8B,0x1A,0x7B,0x8D,0x46,0x3D,0xA8,0xB1,0xB7,0x58,0xA2,0x1E, +0x3C,0xDB,0xE3,0x41,0xBD,0xEA,0xC2,0x7E,0xDE,0x9C,0xCB,0x2F,0x33,0xC9,0x4C,0x66, +0x86,0x08,0xDA,0xE2,0x4F,0x33,0x33,0xF8,0x5F,0x7C,0x06,0x89,0x90,0x48,0x22,0xB1, +0x10,0x85,0x15,0x1B,0xD1,0xC4,0x60,0x27,0x96,0x38,0xE2,0x49,0x20,0x91,0x24,0x92, +0x49,0x21,0x95,0x34,0xD2,0xC9,0x20,0x93,0x2C,0xB2,0xC9,0x21,0x97,0x3C,0xF2,0x29, +0xA0,0x90,0x76,0xB4,0xA7,0x03,0x1D,0xE9,0x44,0x67,0xBA,0xD0,0x95,0x6E,0x74,0xA7, +0x07,0x3D,0xE9,0x45,0x6F,0xFA,0xD0,0x17,0x0D,0x1D,0x03,0x07,0x4E,0x5C,0x14,0x51, +0x4C,0x09,0xA5,0xF4,0xA3,0x3F,0x03,0x18,0xC8,0x20,0x06,0x33,0x04,0x37,0x1E,0xCA, +0x28,0xA7,0x02,0x93,0xA1,0x0C,0x63,0x38,0x23,0x18,0xC9,0x28,0x46,0x33,0x86,0xB1, +0x8C,0x63,0x3C,0x13,0x98,0xC8,0x24,0x26,0x33,0x85,0xA9,0x4C,0x63,0x7A,0xE8,0x96, +0x99,0xCC,0x62,0x36,0x73,0x98,0xCB,0x3C,0x2A,0xC5,0xC2,0x51,0x5A,0xD8,0xC8,0x0D, +0xF6,0xF1,0x91,0x4D,0xEC,0x62,0x3B,0x07,0x38,0xCE,0x31,0x89,0x62,0x1B,0xEF,0xD9, +0xC0,0x5E,0xB1,0x8A,0x8D,0x9D,0xEC,0x67,0x0B,0xB7,0xF9,0x20,0xD1,0x1C,0xE4,0x04, +0xBF,0xF8,0xC9,0x6F,0x8E,0x70,0x8A,0x07,0xDC,0xE3,0x34,0xF3,0x59,0xC0,0x6E,0xAA, +0x78,0x44,0x35,0xF7,0x79,0xC8,0x33,0x1E,0xF3,0x84,0xA7,0x7C,0xA2,0x86,0x97,0x3C, +0xE7,0x05,0x67,0xF0,0xF2,0x83,0x3D,0xBC,0xE1,0x15,0xAF,0xF1,0xF1,0x85,0x6F,0x6C, +0x65,0x21,0x7E,0x16,0xB1,0x98,0x5A,0xEA,0x38,0x44,0x3D,0x4B,0x68,0x20,0x40,0x23, +0x41,0x96,0xB2,0x8C,0xE5,0xA1,0x2F,0xAF,0x60,0x25,0x4D,0xAC,0x62,0x0D,0xAB,0xB9, +0xCA,0x61,0xD6,0xD2,0xCC,0x3A,0xD6,0xF3,0x95,0xEF,0x5C,0xE3,0x2C,0xE7,0xB8,0xCE, +0x5B,0xDE,0x49,0x8C,0xD8,0x25,0x56,0xE2,0x24,0x5E,0x12,0x24,0x51,0x92,0x24,0x59, +0x52,0x24,0x55,0xD2,0x24,0x5D,0x32,0x38,0xCF,0x05,0x2E,0x73,0x85,0x3B,0x5C,0xE4, +0x12,0x77,0xD9,0xCC,0x49,0xC9,0xE4,0x26,0xB7,0x24,0x4B,0xB2,0xD9,0x21,0x39,0x92, +0x2B,0x79,0x92,0x2F,0x05,0x56,0x6F,0x6D,0x53,0x83,0x4F,0xB7,0x05,0xEB,0xFC,0x9A, +0xA6,0x95,0x87,0x75,0x6B,0x4A,0x95,0x7B,0x0C,0xA5,0x43,0x59,0xDA,0xAA,0x11,0x6A, +0x50,0xEA,0x4A,0x43,0xE9,0x50,0x3A,0x95,0x2E,0x65,0x91,0xB2,0x58,0x59,0xA2,0xFC, +0x37,0xCF,0x1D,0x56,0x57,0x73,0x75,0xDD,0x5E,0xE3,0xF7,0x06,0x03,0xD5,0x55,0x95, +0x8D,0xBE,0x70,0xC9,0x30,0xC3,0xBA,0x4C,0x4B,0x45,0x30,0x50,0xDF,0x96,0xB8,0xCC, +0xB2,0x56,0x4D,0x4F,0x78,0x8F,0x90,0x86,0xD2,0xA1,0x74,0xFE,0x05,0x2A,0x68,0x9D, +0x3B,0x00,0x00,0x00,0x78,0xDA,0x3D,0xCC,0xAF,0x0E,0xC2,0x30,0x10,0x06,0xF0,0x76, +0x65,0x5D,0x57,0xF6,0x2F,0x64,0x96,0xA4,0xE8,0x1A,0x24,0x06,0xB7,0xCD,0xCC,0x10, +0x54,0x9B,0x00,0x8F,0x81,0x05,0x83,0x84,0x67,0xB9,0x82,0x59,0x90,0xBC,0xD8,0x38, +0xA0,0xD4,0xDD,0xEF,0xFB,0xEE,0x6E,0xA0,0xE3,0x05,0xE8,0x95,0xF4,0x20,0x36,0xC6, +0x51,0x7A,0xB3,0xAE,0xE3,0xDA,0x2C,0xA0,0xB2,0x3D,0xD4,0x5B,0x1C,0xCE,0x76,0x0E, +0x5C,0xEF,0x0C,0x01,0xA6,0x5A,0x60,0xBA,0x81,0x44,0xB5,0x77,0xF6,0x88,0xF4,0x17, +0x1C,0x91,0xEC,0x3D,0x62,0x04,0x6F,0x3C,0x26,0x88,0x78,0xE5,0x21,0x54,0xFB,0x24, +0x8C,0xA6,0xC4,0x3B,0xC5,0x52,0xCC,0x7E,0xA0,0x20,0xFD,0xE7,0x29,0xA6,0x72,0x88, +0xB4,0x63,0xDD,0x11,0x99,0x7D,0x8E,0xE4,0x69,0x24,0x21,0xC9,0x71,0x21,0x7B,0x05, +0x16,0xC8,0xFC,0x10,0x58,0x22,0x8B,0x75,0x60,0x85,0x2C,0x97,0x7F,0x5A,0xA8,0xF5, +0x1B,0x9E,0x7A,0x44,0x27,0x00,0x00,0x00,0x00,0x01,0x5D,0xA8,0xC5,0xC4,0x00,0x00 +}; diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_FontMgr.cxx opencascade-7.5.1+dfsg1/src/Font/Font_FontMgr.cxx --- opencascade-7.4.1+dfsg1/src/Font/Font_FontMgr.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_FontMgr.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -27,6 +28,8 @@ #include #include +#include "Font_DejavuSans_Latin_woff.pxx" + #include #include FT_FREETYPE_H IMPLEMENT_STANDARD_RTTIEXT(Font_FontMgr,Standard_Transient) @@ -42,7 +45,6 @@ namespace { - // list of supported extensions static Standard_CString Font_FontMgr_Extensions[] = { @@ -51,8 +53,7 @@ "ttc", NULL }; - - }; + } #else @@ -81,7 +82,7 @@ NULL }; - #if !defined(__ANDROID__) && !defined(__APPLE__) + #if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) // X11 configuration file in plain text format (obsolete - doesn't exists in modern distributives) static Standard_CString myFontServiceConf[] = {"/etc/X11/fs/config", "/usr/X11R6/lib/X11/fs/config", @@ -139,47 +140,149 @@ #endif -// ======================================================================= -// function : checkFont -// purpose : -// ======================================================================= -static Handle(Font_SystemFont) checkFont (const Handle(Font_FTLibrary)& theFTLib, - const Standard_CString theFontPath) +//! Retrieve font information. +//! @param theFonts [out] list of validated fonts +//! @param theFTLib [in] font library +//! @param theFontPath [in] path to the file +//! @param theFaceId [in] face id, or -1 to load all faces within the file +//! @return TRUE if at least one font face has been detected +static bool checkFont (NCollection_Sequence& theFonts, + const Handle(Font_FTLibrary)& theFTLib, + const TCollection_AsciiString& theFontPath, + FT_Long theFaceId = -1) { + const FT_Long aFaceId = theFaceId != -1 ? theFaceId : 0; FT_Face aFontFace; - FT_Error aFaceError = FT_New_Face (theFTLib->Instance(), theFontPath, 0, &aFontFace); + FT_Error aFaceError = FT_New_Face (theFTLib->Instance(), theFontPath.ToCString(), aFaceId, &aFontFace); if (aFaceError != FT_Err_Ok) { - return NULL; + return false; + } + if (aFontFace->family_name == NULL // skip broken fonts (error in FreeType?) + || FT_Select_Charmap (aFontFace, ft_encoding_unicode) != 0) // Font_FTFont supports only UNICODE fonts + { + FT_Done_Face (aFontFace); + return false; } + // FreeType decomposes font definition into Family Name and Style Name, + // so that fonts within the same Family and different Styles can be identified. + // OCCT Font Manager natively handles 4 basic styles: Regular, Bold, Italic and Bold+Italic. + // To include other non-standard Styles, their names can be appended to Family Name; for this, names of normal Styles should be removed. + TCollection_AsciiString aFamily (aFontFace->family_name); + TCollection_AsciiString aStyle (aFontFace->style_name != NULL ? aFontFace->style_name : ""); Font_FontAspect anAspect = Font_FA_Regular; if (aFontFace->style_flags == (FT_STYLE_FLAG_ITALIC | FT_STYLE_FLAG_BOLD)) { anAspect = Font_FA_BoldItalic; + const Standard_Integer aRemoveItalic = aStyle.Search ("Italic"); + if (aRemoveItalic != -1) + { + aStyle.Remove (aRemoveItalic, 6); + } + else + { + // synonym + const Standard_Integer aRemoveOblique = aStyle.Search ("Oblique"); + if (aRemoveOblique != -1) + { + aStyle.Remove (aRemoveOblique, 7); + } + } + + const Standard_Integer aRemoveBold = aStyle.Search ("Bold"); + if (aRemoveBold != -1) + { + aStyle.Remove (aRemoveBold, 4); + } } else if (aFontFace->style_flags == FT_STYLE_FLAG_ITALIC) { anAspect = Font_FA_Italic; + const Standard_Integer aRemoveItalic = aStyle.Search ("Italic"); + if (aRemoveItalic != -1) + { + aStyle.Remove (aRemoveItalic, 6); + } + else + { + // synonym + const Standard_Integer aRemoveOblique = aStyle.Search ("Oblique"); + if (aRemoveOblique != -1) + { + aStyle.Remove (aRemoveOblique, 7); + } + } } else if (aFontFace->style_flags == FT_STYLE_FLAG_BOLD) { anAspect = Font_FA_Bold; + const Standard_Integer aRemoveBold = aStyle.Search ("Bold"); + if (aRemoveBold != -1) + { + aStyle.Remove (aRemoveBold, 4); + } } - Handle(Font_SystemFont) aResult; - if (aFontFace->family_name != NULL // skip broken fonts (error in FreeType?) - && FT_Select_Charmap (aFontFace, ft_encoding_unicode) == 0) // Font_FTFont supports only UNICODE fonts - { - aResult = new Font_SystemFont (aFontFace->family_name); - aResult->SetFontPath (anAspect, theFontPath); - // automatically identify some known single-line fonts - aResult->SetSingleStrokeFont (aResult->FontKey().StartsWith ("olf ")); + const Standard_Integer aRemoveReg = aStyle.Search ("Regular"); + if (aRemoveReg != -1) + { + aStyle.Remove (aRemoveReg, 7); + } + else + { + // synonym + const Standard_Integer aRemoveBook = aStyle.Search ("Book"); + if (aRemoveBook != -1) + { + aStyle.Remove (aRemoveBook, 4); + } } - FT_Done_Face (aFontFace); + aStyle.LeftAdjust(); + aStyle.RightAdjust(); + for (;;) + { + // remove double spaces after removal of several keywords in-between, like "Condensed Bold Italic Oblique" + const Standard_Integer aRemoveSpace = aStyle.Search (" "); + if (aRemoveSpace == -1) + { + break; + } - return aResult; + aStyle.Remove (aRemoveSpace, 1); + } + + if (!aStyle.IsEmpty()) + { + aFamily = aFamily + " " + aStyle; + } + + Handle(Font_SystemFont) aResult = new Font_SystemFont (aFamily); + aResult->SetFontPath (anAspect, theFontPath, (Standard_Integer )aFaceId); + // automatically identify some known single-line fonts + aResult->SetSingleStrokeFont (aResult->FontKey().StartsWith ("olf ")); + theFonts.Append (aResult); + + if (theFaceId < aFontFace->num_faces) + { + const FT_Long aNbInstances = aFontFace->style_flags >> 16; + for (FT_Long anInstIter = 1; anInstIter < aNbInstances; ++anInstIter) + { + const FT_Long aSubFaceId = aFaceId + (anInstIter << 16); + checkFont (theFonts, theFTLib, theFontPath, aSubFaceId); + } + } + if (theFaceId == -1) + { + for (FT_Long aFaceIter = 1; aFaceIter < aFontFace->num_faces; ++aFaceIter) + { + checkFont (theFonts, theFTLib, theFontPath, aFaceIter); + } + } + + FT_Done_Face (aFontFace); + return true; } // ======================================================================= @@ -208,6 +311,114 @@ } // ======================================================================= +// function : AddFontAlias +// purpose : +// ======================================================================= +bool Font_FontMgr::AddFontAlias (const TCollection_AsciiString& theAliasName, + const TCollection_AsciiString& theFontName) +{ + TCollection_AsciiString anAliasName (theAliasName); + anAliasName.LowerCase(); + Handle(Font_FontAliasSequence) anAliases; + if (!myFontAliases.Find (anAliasName, anAliases)) + { + anAliases = new Font_FontAliasSequence(); + myFontAliases.Bind (anAliasName, anAliases); + } + + for (Font_FontAliasSequence::Iterator anAliasIter (*anAliases); anAliasIter.More(); anAliasIter.Next()) + { + if (anAliasIter.Value().FontName.IsEqual (anAliasName)) + { + return false; + } + } + + anAliases->Append (Font_FontAlias (theFontName)); + return true; +} + +// ======================================================================= +// function : RemoveFontAlias +// purpose : +// ======================================================================= +bool Font_FontMgr::RemoveFontAlias (const TCollection_AsciiString& theAliasName, + const TCollection_AsciiString& theFontName) +{ + if (theAliasName.IsEmpty()) + { + if (myFontAliases.IsEmpty()) + { + return false; + } + myFontAliases.Clear(); + return true; + } + + TCollection_AsciiString anAliasName (theAliasName); + anAliasName.LowerCase(); + Handle(Font_FontAliasSequence) anAliases; + if (!myFontAliases.Find (anAliasName, anAliases)) + { + return false; + } + + if (theFontName.IsEmpty()) + { + myFontAliases.UnBind (anAliasName); + return true; + } + + for (Font_FontAliasSequence::Iterator aFontIter (*anAliases); aFontIter.More(); aFontIter.Next()) + { + if (aFontIter.Value().FontName.IsEqual (theFontName)) + { + anAliases->Remove (aFontIter); + if (anAliases->IsEmpty()) + { + myFontAliases.UnBind (anAliasName); + } + return true; + } + } + return false; +} + +// ======================================================================= +// function : GetAllAliases +// purpose : +// ======================================================================= +void Font_FontMgr::GetAllAliases (TColStd_SequenceOfHAsciiString& theAliases) const +{ + for (NCollection_DataMap::Iterator anAliasIter (myFontAliases); + anAliasIter.More(); anAliasIter.Next()) + { + theAliases.Append (new TCollection_HAsciiString (anAliasIter.Key())); + } +} + +// ======================================================================= +// function : GetFontAliases +// purpose : +// ======================================================================= +void Font_FontMgr::GetFontAliases (TColStd_SequenceOfHAsciiString& theFontNames, + const TCollection_AsciiString& theAliasName) const +{ + TCollection_AsciiString anAliasName (theAliasName); + anAliasName.LowerCase(); + Handle(Font_FontAliasSequence) anAliases; + if (!myFontAliases.Find (anAliasName, anAliases)) + { + return; + } + + for (Font_FontAliasSequence::Iterator aFontIter (*anAliases); aFontIter.More(); aFontIter.Next()) + { + theFontNames.Append (new TCollection_HAsciiString (aFontIter.Value().FontName)); + } +} + +// ======================================================================= // function : addFontAlias // purpose : // ======================================================================= @@ -290,6 +501,7 @@ aCJK ->Append (Font_FontAlias ("simsun")); // Windows aCJK ->Append (Font_FontAlias ("droid sans fallback")); // Android, Linux aCJK ->Append (Font_FontAlias ("noto sans sc")); // Android + aCJK ->Append (Font_FontAlias ("noto sans cjk jp")); #if defined(_WIN32) aKorean->Append (Font_FontAlias ("malgun gothic")); // introduced since Vista @@ -303,6 +515,7 @@ aKorean->Append (Font_FontAlias ("nanummyeongjo")); // Linux aKorean->Append (Font_FontAlias ("noto serif cjk jp")); // Linux aKorean->Append (Font_FontAlias ("noto sans cjk jp")); // Linux + aKorean->Append (Font_FontAlias ("droid sans fallback")); // Linux #if defined(_WIN32) anArab->Append (Font_FontAlias ("times new roman")); @@ -345,10 +558,24 @@ // function : CheckFont // purpose : // ======================================================================= +Standard_Boolean Font_FontMgr::CheckFont (NCollection_Sequence& theFonts, + const TCollection_AsciiString& theFontPath) const +{ + Handle(Font_FTLibrary) aFtLibrary = new Font_FTLibrary(); + return checkFont (theFonts, aFtLibrary, theFontPath, 0); +} + +// ======================================================================= +// function : CheckFont +// purpose : +// ======================================================================= Handle(Font_SystemFont) Font_FontMgr::CheckFont (Standard_CString theFontPath) const { Handle(Font_FTLibrary) aFtLibrary = new Font_FTLibrary(); - return checkFont (aFtLibrary, theFontPath); + NCollection_Sequence aFonts; + return checkFont (aFonts, aFtLibrary, theFontPath, 0) + ? aFonts.First() + : Handle(Font_SystemFont)(); } // ======================================================================= @@ -373,14 +600,17 @@ Handle(Font_SystemFont) anOldFont = myFontMap.FindKey (anOldIndex); for (int anAspectIter = 0; anAspectIter < Font_FontAspect_NB; ++anAspectIter) { - if (anOldFont->FontPath ((Font_FontAspect )anAspectIter).IsEqual (theFont->FontPath ((Font_FontAspect )anAspectIter))) + if (anOldFont->FontPath ((Font_FontAspect )anAspectIter).IsEqual (theFont->FontPath ((Font_FontAspect )anAspectIter)) + && anOldFont->FontFaceId ((Font_FontAspect )anAspectIter) == theFont->FontFaceId ((Font_FontAspect )anAspectIter)) { continue; } else if (theToOverride || !anOldFont->HasFontAspect ((Font_FontAspect )anAspectIter)) { - anOldFont->SetFontPath ((Font_FontAspect )anAspectIter, theFont->FontPath ((Font_FontAspect )anAspectIter)); + anOldFont->SetFontPath ((Font_FontAspect )anAspectIter, + theFont->FontPath ((Font_FontAspect )anAspectIter), + theFont->FontFaceId ((Font_FontAspect )anAspectIter)); } else if (theFont->HasFontAspect ((Font_FontAspect )anAspectIter)) { @@ -391,6 +621,15 @@ } // ======================================================================= +// function : ClearFontDataBase() +// purpose : +// ======================================================================= +void Font_FontMgr::ClearFontDataBase() +{ + myFontMap.Clear(); +} + +// ======================================================================= // function : InitFontDataBase // purpose : // ======================================================================= @@ -398,6 +637,7 @@ { myFontMap.Clear(); Handle(Font_FTLibrary) aFtLibrary = new Font_FTLibrary(); + NCollection_Sequence aFonts; #if defined(OCCT_UWP) // system font files are not accessible @@ -459,10 +699,9 @@ aFontExtension.LowerCase(); if (aSupportedExtensions.Contains (aFontExtension)) { - if (Handle(Font_SystemFont) aNewFont = checkFont (aFtLibrary, aFontPath.ToCString())) - { - RegisterFont (aNewFont, false); - } + aFonts.Clear(); + checkFont (aFonts, aFtLibrary, aFontPath.ToCString()); + RegisterFonts (aFonts, false); } } } @@ -473,7 +712,7 @@ #else NCollection_Map aMapOfFontsDirs; -#if !defined(__ANDROID__) && !defined(__APPLE__) +#if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) if (FcConfig* aFcCfg = FcInitLoadConfig()) { if (FcStrList* aFcFontDir = FcConfigGetFontDirs (aFcCfg)) @@ -498,7 +737,7 @@ const OSD_Protection aProtectRead (OSD_R, OSD_R, OSD_R, OSD_R); if (aMapOfFontsDirs.IsEmpty()) { - Message::DefaultMessenger()->Send ("Font_FontMgr, fontconfig library returns an empty folder list", Message_Alarm); + Message::SendAlarm ("Font_FontMgr, fontconfig library returns an empty folder list"); // read fonts directories from font service config file (obsolete) for (Standard_Integer anIter = 0; myFontServiceConf[anIter] != NULL; ++anIter) @@ -576,7 +815,7 @@ for (NCollection_Map::Iterator anIter (aMapOfFontsDirs); anIter.More(); anIter.Next()) { - #if !defined(__ANDROID__) && !defined(__APPLE__) + #if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) OSD_File aReadFile (anIter.Value() + "/fonts.dir"); if (!aReadFile.Exists()) { @@ -591,13 +830,12 @@ aFontFilePath.SystemName (aFontFileName); aFontFileName = anIter.Value() + "/" + aFontFileName; - if (Handle(Font_SystemFont) aNewFont = checkFont (aFtLibrary, aFontFileName.ToCString())) - { - RegisterFont (aNewFont, false); - } + aFonts.Clear(); + checkFont (aFonts, aFtLibrary, aFontFileName); + RegisterFonts (aFonts, false); } - #if !defined(__ANDROID__) && !defined(__APPLE__) + #if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__EMSCRIPTEN__) continue; } @@ -649,9 +887,12 @@ } TCollection_AsciiString aFontFileName (aLine.SubString (1, anEndOfFileName)); aFontPath.AssignCat (aFontFileName); - if (Handle(Font_SystemFont) aNewFont = checkFont (aFtLibrary, aFontPath.ToCString())) + + aFonts.Clear(); + if (checkFont (aFonts, aFtLibrary, aFontPath)) { - RegisterFont (aNewFont, false); + RegisterFonts (aFonts, false); + const Handle(Font_SystemFont)& aNewFont = aFonts.First(); if (!aXLFD.IsEmpty() && aXLFD.Search ("-0-0-0-0-") != -1) // ignore non-resizable fonts { @@ -674,7 +915,7 @@ } Handle(Font_SystemFont) aNewFontFromXLFD = new Font_SystemFont (anXName); - aNewFontFromXLFD->SetFontPath (anXAspect, aFontPath); + aNewFontFromXLFD->SetFontPath (anXAspect, aFontPath, 0); if (!aNewFont->IsEqual (aNewFontFromXLFD)) { RegisterFont (aNewFontFromXLFD, false); @@ -742,14 +983,27 @@ Font_FontAspect theFontAspect) const { Font_FontAspect aFontAspect = theFontAspect; + Handle(Font_SystemFont) aFont; switch (theSubset) { - case Font_UnicodeSubset_Western: return FindFont (Font_NOF_SANS_SERIF, Font_StrictLevel_Aliases, aFontAspect); - case Font_UnicodeSubset_Korean: return FindFont (Font_NOF_KOREAN, Font_StrictLevel_Aliases, aFontAspect); - case Font_UnicodeSubset_CJK: return FindFont (Font_NOF_CJK, Font_StrictLevel_Aliases, aFontAspect); - case Font_UnicodeSubset_Arabic: return FindFont (Font_NOF_ARABIC, Font_StrictLevel_Aliases, aFontAspect); + case Font_UnicodeSubset_Western: aFont = FindFont (Font_NOF_SANS_SERIF, Font_StrictLevel_Aliases, aFontAspect, false); break; + case Font_UnicodeSubset_Korean: aFont = FindFont (Font_NOF_KOREAN, Font_StrictLevel_Aliases, aFontAspect, false); break; + case Font_UnicodeSubset_CJK: aFont = FindFont (Font_NOF_CJK, Font_StrictLevel_Aliases, aFontAspect, false); break; + case Font_UnicodeSubset_Arabic: aFont = FindFont (Font_NOF_ARABIC, Font_StrictLevel_Aliases, aFontAspect, false); break; } - return Handle(Font_SystemFont)(); + if (aFont.IsNull()) + { + const char* aRange = ""; + switch (theSubset) + { + case Font_UnicodeSubset_Western: aRange = "Western"; break; + case Font_UnicodeSubset_Korean: aRange = "Korean"; break; + case Font_UnicodeSubset_CJK: aRange = "CJK"; break; + case Font_UnicodeSubset_Arabic: aRange = "Arabic"; break; + } + Message::SendFail (TCollection_AsciiString("Font_FontMgr, error: unable to find ") + aRange + " fallback font!"); + } + return aFont; } // ======================================================================= @@ -758,7 +1012,8 @@ // ======================================================================= Handle(Font_SystemFont) Font_FontMgr::FindFont (const TCollection_AsciiString& theFontName, Font_StrictLevel theStrictLevel, - Font_FontAspect& theFontAspect) const + Font_FontAspect& theFontAspect, + Standard_Boolean theDoFailMsg) const { TCollection_AsciiString aFontName (theFontName); aFontName.LowerCase(); @@ -822,8 +1077,8 @@ { if (isAliasUsed && myToTraceAliases) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Font_FontMgr, using font alias '") + aFont->FontName() + "'" - " instead of requested '" + theFontName +"'", Message_Trace); + Message::SendTrace (TCollection_AsciiString("Font_FontMgr, using font alias '") + aFont->FontName() + "'" + " instead of requested '" + theFontName + "'"); } if (isBestAlias) { @@ -844,7 +1099,10 @@ } if (aFont.IsNull()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Font_FontMgr, error: unable to find any font!", Message_Fail)); + if (theDoFailMsg) + { + Message::SendFail ("Font_FontMgr, error: unable to find any font!"); + } return Handle(Font_SystemFont)(); } @@ -855,8 +1113,8 @@ { TCollection_AsciiString aDesc = TCollection_AsciiString() + "'" + theFontName + "'" + TCollection_AsciiString() + " [" + Font_FontMgr::FontAspectToString (theFontAspect) + "]"; - Message::DefaultMessenger()->Send (TCollection_AsciiString("Font_FontMgr, warning: unable to find font ") - + aDesc + "; " + aFont->ToString() + " is used instead"); + Message::SendWarning (TCollection_AsciiString("Font_FontMgr, warning: unable to find font ") + + aDesc + "; " + aFont->ToString() + " is used instead"); } return aFont; } @@ -889,3 +1147,14 @@ } return Handle(Font_SystemFont)(); } + +// ======================================================================= +// function : EmbedFallbackFont +// purpose : +// ======================================================================= +Handle(NCollection_Buffer) Font_FontMgr::EmbedFallbackFont() +{ + return new NCollection_Buffer (Handle(NCollection_BaseAllocator)(), + Font_DejavuSans_Latin_woff_size, + const_cast(Font_DejavuSans_Latin_woff)); +} diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_FontMgr.hxx opencascade-7.5.1+dfsg1/src/Font/Font_FontMgr.hxx --- opencascade-7.4.1+dfsg1/src/Font/Font_FontMgr.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_FontMgr.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,6 +30,7 @@ class Font_SystemFont; class TCollection_HAsciiString; +class NCollection_Buffer; DEFINE_STANDARD_HANDLE(Font_FontMgr, Standard_Transient) @@ -100,9 +101,11 @@ //! @param theStrictLevel [in] search strict level for using aliases and fallback //! @param theFontAspect [in] [out] font aspect to find (considered only if family name is not found); //! can be modified if specified font alias refers to another style (compatibility with obsolete aliases) + //! @param theDoFailMsg [in] put error message on failure into default messenger Standard_EXPORT Handle(Font_SystemFont) FindFont (const TCollection_AsciiString& theFontName, Font_StrictLevel theStrictLevel, - Font_FontAspect& theFontAspect) const; + Font_FontAspect& theFontAspect, + Standard_Boolean theDoFailMsg = Standard_True) const; //! Tries to find font by given parameters. Handle(Font_SystemFont) FindFont (const TCollection_AsciiString& theFontName, @@ -118,13 +121,32 @@ Standard_EXPORT Handle(Font_SystemFont) FindFallbackFont (Font_UnicodeSubset theSubset, Font_FontAspect theFontAspect) const; + //! Read font file and retrieve information from it (the list of font faces). + Standard_EXPORT Standard_Boolean CheckFont (NCollection_Sequence& theFonts, + const TCollection_AsciiString& theFontPath) const; + //! Read font file and retrieve information from it. Standard_EXPORT Handle(Font_SystemFont) CheckFont (const Standard_CString theFontPath) const; //! Register new font. //! If there is existing entity with the same name and properties but different path //! then font will be overridden or ignored depending on theToOverride flag. - Standard_EXPORT Standard_Boolean RegisterFont (const Handle(Font_SystemFont)& theFont, const Standard_Boolean theToOverride); + Standard_EXPORT Standard_Boolean RegisterFont (const Handle(Font_SystemFont)& theFont, + const Standard_Boolean theToOverride); + + //! Register new fonts. + Standard_Boolean RegisterFonts (const NCollection_Sequence& theFonts, + const Standard_Boolean theToOverride) + { + Standard_Boolean isRegistered = Standard_False; + for (NCollection_Sequence::Iterator aFontIter (theFonts); aFontIter.More(); aFontIter.Next()) + { + isRegistered = RegisterFont (aFontIter.Value(), theToOverride) || isRegistered; + } + return isRegistered; + } + +public: //! Return flag for tracing font aliases usage via Message_Trace messages; TRUE by default. Standard_Boolean ToTraceAliases() const { return myToTraceAliases; } @@ -133,13 +155,60 @@ //! Can be disabled to avoid redundant messages with Message_Trace level. void SetTraceAliases (Standard_Boolean theToTrace) { myToTraceAliases = theToTrace; } + //! Return font names with defined aliases. + //! @param theAliases [out] alias names + Standard_EXPORT void GetAllAliases (TColStd_SequenceOfHAsciiString& theAliases) const; + + //! Return aliases to specified font name. + //! @param theFontNames [out] font names associated with alias name + //! @param theAliasName [in] alias name + Standard_EXPORT void GetFontAliases (TColStd_SequenceOfHAsciiString& theFontNames, + const TCollection_AsciiString& theAliasName) const; + + //! Register font alias. + //! + //! Font alias allows using predefined short-cuts like Font_NOF_MONOSPACE or Font_NOF_SANS_SERIF, + //! and defining several fallback fonts like Font_NOF_CJK ("cjk") or "courier" for fonts, + //! which availability depends on system. + //! + //! By default, Font_FontMgr registers standard aliases, which could be extended or replaced by application + //! basing on better knowledge of the system or basing on additional fonts packaged with application itself. + //! Aliases are defined "in advance", so that they could point to non-existing fonts, + //! and they are resolved dynamically on request - first existing font is returned in case of multiple aliases to the same name. + //! + //! @param theAliasName [in] alias name or name of another font to be used as alias + //! @param theFontName [in] font to be used as substitution for alias + //! @return FALSE if alias has been already registered + Standard_EXPORT bool AddFontAlias (const TCollection_AsciiString& theAliasName, + const TCollection_AsciiString& theFontName); + + //! Unregister font alias. + //! @param theAliasName [in] alias name or name of another font to be used as alias; + //! all aliases will be removed in case of empty name + //! @param theFontName [in] font to be used as substitution for alias; + //! all fonts will be removed in case of empty name + //! @return TRUE if alias has been removed + Standard_EXPORT bool RemoveFontAlias (const TCollection_AsciiString& theAliasName, + const TCollection_AsciiString& theFontName); + +public: + + //! Collects available fonts paths. + Standard_EXPORT void InitFontDataBase(); + + //! Clear registry. Can be used for testing purposes. + Standard_EXPORT void ClearFontDataBase(); + + //! Return DejaVu font as embed a single fallback font. + //! It can be used in cases when there is no own font file. + //! Note: result buffer is readonly and should not be changed, + //! any data modification can lead to unpredictable consequences. + Standard_EXPORT static Handle(NCollection_Buffer) EmbedFallbackFont(); + private: //! Creates empty font manager object Standard_EXPORT Font_FontMgr(); - - //! Collects available fonts paths. - Standard_EXPORT void InitFontDataBase(); private: diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_FTFont.cxx opencascade-7.5.1+dfsg1/src/Font/Font_FTFont.cxx --- opencascade-7.4.1+dfsg1/src/Font/Font_FTFont.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_FTFont.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -81,7 +81,8 @@ // ======================================================================= bool Font_FTFont::Init (const Handle(NCollection_Buffer)& theData, const TCollection_AsciiString& theFileName, - const Font_FTFontParams& theParams) + const Font_FTFontParams& theParams, + const Standard_Integer theFaceId) { Release(); myBuffer = theData; @@ -89,25 +90,25 @@ myFontParams = theParams; if (!myFTLib->IsValid()) { - Message::DefaultMessenger()->Send ("FreeType library is unavailable", Message_Trace); + Message::SendTrace ("FreeType library is unavailable"); Release(); return false; } if (!theData.IsNull()) { - if (FT_New_Memory_Face (myFTLib->Instance(), theData->Data(), (FT_Long )theData->Size(), 0, &myFTFace) != 0) + if (FT_New_Memory_Face (myFTLib->Instance(), theData->Data(), (FT_Long )theData->Size(), (FT_Long )theFaceId, &myFTFace) != 0) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Font '") + myFontPath + "' failed to load from memory", Message_Trace); + Message::SendTrace (TCollection_AsciiString("Font '") + myFontPath + "' failed to load from memory"); Release(); return false; } } else { - if (FT_New_Face (myFTLib->Instance(), myFontPath.ToCString(), 0, &myFTFace) != 0) + if (FT_New_Face (myFTLib->Instance(), myFontPath.ToCString(), (FT_Long )theFaceId, &myFTFace) != 0) { - //Message::DefaultMessenger()->Send (TCollection_AsciiString("Font '") + myFontPath + "' failed to load from file", Message_Trace); + //Message::SendTrace (TCollection_AsciiString("Font '") + myFontPath + "' failed to load from file"); Release(); return false; } @@ -115,13 +116,13 @@ if (FT_Select_Charmap (myFTFace, ft_encoding_unicode) != 0) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Font '") + myFontPath + "' doesn't contains Unicode charmap", Message_Trace); + Message::SendTrace (TCollection_AsciiString("Font '") + myFontPath + "' doesn't contains Unicode charmap"); Release(); return false; } else if (FT_Set_Char_Size (myFTFace, 0L, toFTPoints (theParams.PointSize), theParams.Resolution, theParams.Resolution) != 0) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Font '") + myFontPath + "' doesn't contains Unicode charmap of requested size", Message_Trace); + Message::SendTrace (TCollection_AsciiString("Font '") + myFontPath + "' doesn't contains Unicode charmap of requested size"); Release(); return false; } @@ -156,17 +157,40 @@ { Handle(Font_FontMgr) aFontMgr = Font_FontMgr::GetInstance(); Font_FontAspect aFontAspect = theFontAspect; + Font_FTFontParams aParams = theParams; if (Handle(Font_SystemFont) aRequestedFont = aFontMgr->FindFont (theFontName, theStrictLevel, aFontAspect)) { - Font_FTFontParams aParams = theParams; if (aRequestedFont->IsSingleStrokeFont()) { aParams.IsSingleStrokeFont = true; } - const TCollection_AsciiString& aPath = aRequestedFont->FontPathAny (aFontAspect, aParams.ToSynthesizeItalic); + Standard_Integer aFaceId = 0; + const TCollection_AsciiString& aPath = aRequestedFont->FontPathAny (aFontAspect, aParams.ToSynthesizeItalic, aFaceId); Handle(Font_FTFont) aFont = new Font_FTFont(); - if (aFont->Init (aPath, aParams)) + if (aFont->Init (aPath, aParams, aFaceId)) + { + aFont->myFontAspect = aFontAspect; + return aFont; + } + } + else if (theStrictLevel == Font_StrictLevel_Any) + { + switch (theFontAspect) + { + case Font_FontAspect_UNDEFINED: + case Font_FontAspect_Regular: + case Font_FontAspect_Bold: + aFontAspect = Font_FontAspect_Regular; + break; + case Font_FontAspect_Italic: + case Font_FontAspect_BoldItalic: + aFontAspect = Font_FontAspect_Italic; + aParams.ToSynthesizeItalic = true; + break; + } + Handle(Font_FTFont) aFont = new Font_FTFont(); + if (aFont->Init (Font_FontMgr::EmbedFallbackFont(), "Embed Fallback Font", aParams, 0)) { aFont->myFontAspect = aFontAspect; return aFont; @@ -194,8 +218,18 @@ aParams.IsSingleStrokeFont = true; } - const TCollection_AsciiString& aPath = aRequestedFont->FontPathAny (myFontAspect, aParams.ToSynthesizeItalic); - return Init (aPath, aParams); + Standard_Integer aFaceId = 0; + const TCollection_AsciiString& aPath = aRequestedFont->FontPathAny (myFontAspect, aParams.ToSynthesizeItalic, aFaceId); + return Init (aPath, aParams, aFaceId); + } + else if (theStrictLevel == Font_StrictLevel_Any) + { + if (theFontAspect == Font_FontAspect_Italic + || theFontAspect == Font_FontAspect_BoldItalic) + { + aParams.ToSynthesizeItalic = true; + } + return Init (Font_FontMgr::EmbedFallbackFont(), "Embed Fallback Font", aParams, 0); } Release(); return false; @@ -221,11 +255,12 @@ Font_FTFontParams aParams = myFontParams; aParams.IsSingleStrokeFont = aRequestedFont->IsSingleStrokeFont(); - const TCollection_AsciiString& aPath = aRequestedFont->FontPathAny (myFontAspect, aParams.ToSynthesizeItalic); - if (myFallbackFaces[theSubset]->Init (aPath, aParams)) + Standard_Integer aFaceId = 0; + const TCollection_AsciiString& aPath = aRequestedFont->FontPathAny (myFontAspect, aParams.ToSynthesizeItalic, aFaceId); + if (myFallbackFaces[theSubset]->Init (aPath, aParams, aFaceId)) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Font_FTFont, using fallback font '") + aRequestedFont->FontName() + "'" - + " for symbols unsupported by '" + myFTFace->family_name + "'", Message_Trace); + Message::SendTrace (TCollection_AsciiString ("Font_FTFont, using fallback font '") + aRequestedFont->FontName() + "'" + + " for symbols unsupported by '" + myFTFace->family_name + "'"); } } return myFallbackFaces[theSubset]->IsValid(); @@ -572,3 +607,17 @@ aFormatter.BndBox (aBndBox); return aBndBox; } + +// ======================================================================= +// function : renderGlyphOutline +// purpose : +// ======================================================================= +const FT_Outline* Font_FTFont::renderGlyphOutline (const Standard_Utf32Char theChar) +{ + if (!loadGlyph (theChar) + || myActiveFTFace->glyph->format != FT_GLYPH_FORMAT_OUTLINE) + { + return 0; + } + return &myActiveFTFace->glyph->outline; +} diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_FTFont.hxx opencascade-7.5.1+dfsg1/src/Font/Font_FTFont.hxx --- opencascade-7.4.1+dfsg1/src/Font/Font_FTFont.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_FTFont.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,6 +29,7 @@ // forward declarations to avoid including of FreeType headers typedef struct FT_FaceRec_* FT_Face; typedef struct FT_Vector_ FT_Vector; +typedef struct FT_Outline_ FT_Outline; class Font_FTLibrary; //! Font initialization parameters. @@ -155,11 +156,13 @@ //! Initialize the font from the given file path. //! @param theFontPath path to the font //! @param theParams initialization parameters + //! @param theFaceId face id within the file (0 by default) //! @return true on success bool Init (const TCollection_AsciiString& theFontPath, - const Font_FTFontParams& theParams) + const Font_FTFontParams& theParams, + const Standard_Integer theFaceId = 0) { - return Init (Handle(NCollection_Buffer)(), theFontPath, theParams); + return Init (Handle(NCollection_Buffer)(), theFontPath, theParams, theFaceId); } //! Initialize the font from the given file path or memory buffer. @@ -167,10 +170,12 @@ //! when NULL, function will attempt to open theFileName file //! @param theFileName optional path to the font //! @param theParams initialization parameters + //! @param theFaceId face id within the file (0 by default) //! @return true on success Standard_EXPORT bool Init (const Handle(NCollection_Buffer)& theData, const TCollection_AsciiString& theFileName, - const Font_FTFontParams& theParams); + const Font_FTFontParams& theParams, + const Standard_Integer theFaceId = 0); //! Find (using Font_FontMgr) and initialize the font from the given name. //! @param theFontName the font name @@ -227,6 +232,12 @@ return myFontParams.PointSize; } + //! Return glyph scaling along X-axis. + float WidthScaling() const + { + return myWidthScaling; + } + //! Setup glyph scaling along X-axis. //! By default glyphs are not scaled (scaling factor = 1.0) void SetWidthScaling (const float theScaleFactor) @@ -277,6 +288,14 @@ public: + //! Computes outline contour for the symbol. + //! @param theUChar [in] the character to be loaded as current one + //! @param theOutline [out] outline contour + //! @return true on success + Standard_EXPORT const FT_Outline* renderGlyphOutline(const Standard_Utf32Char theChar); + +public: + //! Initialize the font. //! @param theFontPath path to the font //! @param thePointSize the face size in points (1/72 inch) @@ -290,7 +309,7 @@ Font_FTFontParams aParams; aParams.PointSize = thePointSize; aParams.Resolution = theResolution; - return Init (theFontPath.ToCString(), aParams); + return Init (theFontPath.ToCString(), aParams, 0); } //! Initialize the font. diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_Rect.hxx opencascade-7.5.1+dfsg1/src/Font/Font_Rect.hxx --- opencascade-7.4.1+dfsg1/src/Font/Font_Rect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_Rect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ #define _Font_Rect_H__ #include +#include //! Auxiliary POD structure - 2D rectangle definition. struct Font_Rect @@ -76,6 +77,16 @@ return Top - Bottom; } + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer) const + { + OCCT_DUMP_CLASS_BEGIN (theOStream, Font_Rect) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Left) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Right) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Top) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Bottom) + } }; #endif // _Font_Rect_H__ diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_SystemFont.cxx opencascade-7.5.1+dfsg1/src/Font/Font_SystemFont.cxx --- opencascade-7.4.1+dfsg1/src/Font/Font_SystemFont.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_SystemFont.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,6 +29,7 @@ myFontName (theFontName), myIsSingleLine (Standard_False) { + memset (myFaceIds, 0, sizeof(myFaceIds)); if (theFontName.IsEmpty()) { throw Standard_ProgramError ("Font_SystemFont constructor called with empty font name"); } myFontKey.LowerCase(); } @@ -38,10 +39,12 @@ // purpose : // ======================================================================= void Font_SystemFont::SetFontPath (Font_FontAspect theAspect, - const TCollection_AsciiString& thePath) + const TCollection_AsciiString& thePath, + const Standard_Integer theFaceId) { if (theAspect == Font_FontAspect_UNDEFINED) { throw Standard_ProgramError ("Font_SystemFont::SetFontPath() called with UNDEFINED aspect"); } myFilePaths[theAspect] = thePath; + myFaceIds [theAspect] = theFaceId; } // ======================================================================= @@ -102,6 +105,10 @@ isFirstAspect = false; } aDesc += FontPath ((Font_FontAspect )anAspectIter); + if (FontFaceId ((Font_FontAspect )anAspectIter) != 0) + { + aDesc = aDesc + "," + FontFaceId ((Font_FontAspect )anAspectIter); + } } aDesc += "]"; return aDesc; diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_SystemFont.hxx opencascade-7.5.1+dfsg1/src/Font/Font_SystemFont.hxx --- opencascade-7.4.1+dfsg1/src/Font/Font_SystemFont.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_SystemFont.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,9 +43,16 @@ return myFilePaths[theAspect != Font_FontAspect_UNDEFINED ? theAspect : Font_FontAspect_Regular]; } + //! Returns font file path. + Standard_Integer FontFaceId (Font_FontAspect theAspect) const + { + return myFaceIds[theAspect != Font_FontAspect_UNDEFINED ? theAspect : Font_FontAspect_Regular]; + } + //! Sets font file path for specific aspect. Standard_EXPORT void SetFontPath (Font_FontAspect theAspect, - const TCollection_AsciiString& thePath); + const TCollection_AsciiString& thePath, + const Standard_Integer theFaceId = 0); //! Returns TRUE if dedicated file for specified font aspect has been defined. bool HasFontAspect (Font_FontAspect theAspect) const @@ -55,9 +62,12 @@ //! Returns any defined font file path. const TCollection_AsciiString& FontPathAny (Font_FontAspect theAspect, - bool& theToSynthesizeItalic) const + bool& theToSynthesizeItalic, + Standard_Integer& theFaceId) const { - const TCollection_AsciiString& aPath = myFilePaths[theAspect != Font_FontAspect_UNDEFINED ? theAspect : Font_FontAspect_Regular]; + const Font_FontAspect anAspect = theAspect != Font_FontAspect_UNDEFINED ? theAspect : Font_FontAspect_Regular; + const TCollection_AsciiString& aPath = myFilePaths[anAspect]; + theFaceId = myFaceIds[anAspect]; if (!aPath.IsEmpty()) { return aPath; @@ -70,17 +80,20 @@ && !myFilePaths[Font_FontAspect_Bold].IsEmpty()) { theToSynthesizeItalic = true; + theFaceId = myFaceIds[Font_FontAspect_Bold]; return myFilePaths[Font_FontAspect_Bold]; } else if (!myFilePaths[Font_FontAspect_Regular].IsEmpty()) { theToSynthesizeItalic = true; + theFaceId = myFaceIds[Font_FontAspect_Regular]; return myFilePaths[Font_FontAspect_Regular]; } } if (!myFilePaths[Font_FontAspect_Regular].IsEmpty()) { + theFaceId = myFaceIds[Font_FontAspect_Regular]; return myFilePaths[Font_FontAspect_Regular]; } @@ -88,9 +101,11 @@ { if (!myFilePaths[anAspectIter].IsEmpty()) { + theFaceId = myFaceIds[anAspectIter]; return myFilePaths[anAspectIter]; } } + theFaceId = myFaceIds[Font_FontAspect_Regular]; return myFilePaths[Font_FontAspect_Regular]; } @@ -128,6 +143,7 @@ private: TCollection_AsciiString myFilePaths[Font_FontAspect_NB]; //!< paths to the font file + Standard_Integer myFaceIds [Font_FontAspect_NB]; //!< face ids per font file TCollection_AsciiString myFontKey; //!< font family name, lower cased TCollection_AsciiString myFontName; //!< font family name Standard_Boolean myIsSingleLine; //!< single stroke font flag, FALSE by default diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_TextFormatter.cxx opencascade-7.5.1+dfsg1/src/Font/Font_TextFormatter.cxx --- opencascade-7.4.1+dfsg1/src/Font/Font_TextFormatter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_TextFormatter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,10 @@ #include +#include + +IMPLEMENT_STANDARD_RTTIEXT (Font_TextFormatter, Standard_Transient) + namespace { typedef NCollection_Vec2 Vec2f; @@ -55,16 +59,17 @@ : myAlignX (Graphic3d_HTA_LEFT), myAlignY (Graphic3d_VTA_TOP), myTabSize (8), + myWrappingWidth (0.0f), + myLastSymbolWidth (0.0f), + myMaxSymbolWidth (0.0f), // myPen (0.0f, 0.0f), - myRectsNb (0), myLineSpacing (0.0f), myAscender (0.0f), myIsFormatted (false), // myLinesNb (0), myRectLineStart (0), - myRectWordStart (0), myNewLineNb(0), myPenCurrLine (0.0f), myBndTop (0.0f), @@ -94,10 +99,12 @@ myIsFormatted = false; myString.Clear(); myPen.x() = myPen.y() = 0.0f; - myRectsNb = 0; myLineSpacing = myAscender = 0.0f; myCorners.Clear(); myNewLines.Clear(); + + myLastSymbolWidth = 0.0f; + myMaxSymbolWidth = 0.0f; } // ======================================================================= @@ -119,16 +126,13 @@ int aSymbolsCounter = 0; // special counter to process tabulation symbols // first pass - render all symbols using associated font on single ZERO baseline - for (NCollection_Utf8Iter anIter = theString.Iterator(); *anIter != 0;) + for (Font_TextFormatter::Iterator aFormatterIt (*this); aFormatterIt.More(); aFormatterIt.Next()) { - const Standard_Utf32Char aCharThis = *anIter; - const Standard_Utf32Char aCharNext = *++anIter; + const Standard_Utf32Char aCharThis = aFormatterIt.Symbol(); + const Standard_Utf32Char aCharNext = aFormatterIt.SymbolNext(); - if (aCharThis == '\x0D' // CR (carriage return) - || aCharThis == '\a' // BEL (alarm) - || aCharThis == '\f' // FF (form feed) NP (new page) - || aCharThis == '\b' // BS (backspace) - || aCharThis == '\v') // VT (vertical tab) + Standard_ShortReal anAdvanceX = 0; + if (IsCommandSymbol (aCharThis)) { continue; // skip unsupported carriage control codes } @@ -136,79 +140,69 @@ { aSymbolsCounter = 0; myNewLines.Append (myPen.x()); - continue; // will be processed on second pass + anAdvanceX = 0; // the symbol has null width } else if (aCharThis == ' ') { - ++aSymbolsCounter; - myPen.x() += theFont.AdvanceX (' ', aCharNext); - continue; + anAdvanceX = theFont.AdvanceX (' ', aCharNext); } else if (aCharThis == '\t') { const Standard_Integer aSpacesNum = (myTabSize - (aSymbolsCounter - 1) % myTabSize); - myPen.x() += theFont.AdvanceX (' ', aCharNext) * Standard_ShortReal(aSpacesNum); + anAdvanceX = theFont.AdvanceX (' ', aCharNext) * Standard_ShortReal(aSpacesNum); aSymbolsCounter += aSpacesNum; - continue; } - + else + { + anAdvanceX = theFont.AdvanceX (aCharThis, aCharNext); + } ++aSymbolsCounter; - myCorners.Append (myPen); - - myPen.x() += theFont.AdvanceX (aCharThis, aCharNext); - - ++myRectsNb; + myPen.x() += anAdvanceX; + myMaxSymbolWidth = Max (myMaxSymbolWidth, anAdvanceX); } + myLastSymbolWidth = myPen.x() - myCorners.Last().x(); } // ======================================================================= // function : newLine // purpose : // ======================================================================= -void Font_TextFormatter::newLine (const Standard_Integer theLastRect) +void Font_TextFormatter::newLine (const Standard_Integer theLastRect, + const Standard_ShortReal theMaxLineWidth) { - if (myRectLineStart >= myRectsNb) + Standard_Integer aFirstCornerId = myRectLineStart; + Standard_Integer aLastCornerId = theLastRect; + + if (aFirstCornerId >= myCorners.Length()) { ++myLinesNb; myPenCurrLine -= myLineSpacing; return; } + Standard_ShortReal aXMin = BottomLeft (aFirstCornerId).x(); + Font_Rect aBndBox; + GlyphBoundingBox (aLastCornerId, aBndBox); + Standard_ShortReal aXMax = aBndBox.Right; + myMoveVec.y() = myPenCurrLine; switch (myAlignX) { default: - case Graphic3d_HTA_LEFT: - { - myMoveVec.x() = (myNewLineNb > 0) ? -myNewLines.Value (myNewLineNb - 1) : 0.0f; + case Graphic3d_HTA_LEFT: myMoveVec.x() = -aXMin; break; - } - case Graphic3d_HTA_RIGHT: - { - myMoveVec.x() = (myNewLineNb < myNewLines.Length()) - ? -myNewLines.Value (myNewLineNb) - : -myPen.x(); + case Graphic3d_HTA_RIGHT: myMoveVec.x() = -aXMin + (theMaxLineWidth - (aXMax - aXMin)) - theMaxLineWidth; break; - } - case Graphic3d_HTA_CENTER: - { - const Standard_ShortReal aFrom = (myNewLineNb > 0) - ? myNewLines.Value (myNewLineNb - 1) - : 0.0f; - const Standard_ShortReal aTo = (myNewLineNb < myNewLines.Length()) - ? myNewLines.Value (myNewLineNb) - : myPen.x(); - myMoveVec.x() = -0.5f * (aFrom + aTo); + case Graphic3d_HTA_CENTER: myMoveVec.x() = -aXMin + 0.5f * (theMaxLineWidth - (aXMax - aXMin)) - 0.5f * theMaxLineWidth; break; - } } move (myCorners, myMoveVec, myRectLineStart, theLastRect); ++myLinesNb; myPenCurrLine -= myLineSpacing; - myRectLineStart = myRectWordStart = theLastRect + 1; + myRectLineStart = theLastRect + 1; } // ======================================================================= @@ -217,13 +211,13 @@ // ======================================================================= void Font_TextFormatter::Format() { - if (myRectsNb == 0 || myIsFormatted) + if (myCorners.Length() == 0 || myIsFormatted) { return; } myIsFormatted = true; - myLinesNb = myRectLineStart = myRectWordStart = 0; + myLinesNb = myRectLineStart = 0; myBndTop = 0.0f; myBndWidth = 0.0f; myMoveVec.x() = myMoveVec.y() = 0.0f; @@ -232,59 +226,61 @@ myPenCurrLine = -myAscender; Standard_Integer aRectIter = 0; myNewLineNb = 0; - Standard_ShortReal aMaxLineWidth = -1.0f; - for (NCollection_Utf8Iter anIter = myString.Iterator(); *anIter != 0; ++anIter) + + Standard_ShortReal aMaxLineWidth = Wrapping(); + if (HasWrapping()) { - const Standard_Utf32Char aCharThis = *anIter; - if (aCharThis == '\x0D' // CR (carriage return) - || aCharThis == '\a' // BEL (alarm) - || aCharThis == '\f' // FF (form feed) NP (new page) - || aCharThis == '\b' // BS (backspace) - || aCharThis == '\v') // VT (vertical tab) + // it is not possible to wrap less than symbol width + aMaxLineWidth = Max (aMaxLineWidth, MaximumSymbolWidth()); + } + else + { + if (myNewLines.IsEmpty()) // If only one line { - continue; // skip unsupported carriage control codes + aMaxLineWidth = myPen.x(); } - else if (aCharThis == '\x0A') // LF (line feed, new line) + else { - // calculate max line width - if (myNewLineNb == 0) - { - aMaxLineWidth = myNewLines.Value(0); - } - else + for (int aLineIt = 0; aLineIt < myNewLines.Size(); aLineIt++) { - aMaxLineWidth = Max (aMaxLineWidth, myNewLines.Value (myNewLineNb) - myNewLines.Value (myNewLineNb - 1)); + aMaxLineWidth = Max (aMaxLineWidth, LineWidth (aLineIt)); } + aMaxLineWidth = Max (aMaxLineWidth, LineWidth (myNewLines.Size())); // processing the last line also + } + } + + for (Font_TextFormatter::Iterator aFormatterIt(*this); + aFormatterIt.More(); aFormatterIt.Next()) + { + const Standard_Utf32Char aCharThis = aFormatterIt.Symbol(); + aRectIter = aFormatterIt.SymbolPosition(); - const Standard_Integer aLastRect = aRectIter - 1; // last rect on current line - newLine (aLastRect); + if (aCharThis == '\x0A') // LF (line feed, new line) + { + const Standard_Integer aLastRect = aRectIter; // last rect on current line + newLine (aLastRect, aMaxLineWidth); ++myNewLineNb; continue; } - else if (aCharThis == ' ' - || aCharThis == '\t') + else if (HasWrapping()) // wrap lines longer than maximum width { - myRectWordStart = aRectIter; - continue; - } + Standard_Integer aFirstCornerId = myRectLineStart; - ++aRectIter; - } - - // If only one line - if (aMaxLineWidth < 0.0f) - { - aMaxLineWidth = myPen.x(); - } - else // Consider last line - { - aMaxLineWidth = Max (aMaxLineWidth, myPen.x() - myNewLines.Value (myNewLineNb - 1)); + Font_Rect aBndBox; + GlyphBoundingBox (aRectIter, aBndBox); + const Standard_ShortReal aNextXPos = aBndBox.Right - BottomLeft (aFirstCornerId).x(); + if (aNextXPos > aMaxLineWidth) // wrap the line and do processing of the symbol + { + const Standard_Integer aLastRect = aRectIter - 1; // last rect on current line + newLine (aLastRect, aMaxLineWidth); + } + } } myBndWidth = aMaxLineWidth; // move last line - newLine (myRectsNb - 1); + newLine (myCorners.Length() - 1, aMaxLineWidth); // apply vertical alignment style if (myAlignY == Graphic3d_VTA_BOTTOM) @@ -302,6 +298,129 @@ if (myAlignY != Graphic3d_VTA_TOP) { - moveY (myCorners, myBndTop, 0, myRectsNb - 1); + moveY (myCorners, myBndTop, 0, myCorners.Length() - 1); } } + +// ======================================================================= +// function : GlyphBoundingBox +// purpose : +// ======================================================================= +Standard_Boolean Font_TextFormatter::GlyphBoundingBox (const Standard_Integer theIndex, + Font_Rect& theBndBox) const +{ + if (theIndex < 0 || theIndex >= Corners().Size()) + return Standard_False; + + const NCollection_Vec2& aLeftCorner = BottomLeft (theIndex); + if (theIndex + 1 < myCorners.Length()) // not the last symbol + { + const NCollection_Vec2& aNextLeftCorner = BottomLeft (theIndex + 1); + theBndBox.Left = aLeftCorner.x(); + theBndBox.Bottom = aLeftCorner.y(); + theBndBox.Top = theBndBox.Bottom + myLineSpacing; + if (Abs (aLeftCorner.y() - aNextLeftCorner.y()) < Precision::Confusion()) // in the same row + { + theBndBox.Right = aNextLeftCorner.x(); + } + else + { + // the next symbol is on the next row either by '\n' or by wrapping + Standard_ShortReal aLineWidth = LineWidth (LineIndex (theIndex)); + theBndBox.Left = aLeftCorner.x(); + switch (myAlignX) + { + case Graphic3d_HTA_LEFT: theBndBox.Right = aLineWidth; break; + case Graphic3d_HTA_RIGHT: theBndBox.Right = myBndWidth; break; + case Graphic3d_HTA_CENTER: theBndBox.Right = 0.5f * (myBndWidth + aLineWidth); break; + } + } + } + else // the last symbol + { + theBndBox.Left = aLeftCorner.x(); + theBndBox.Right = aLeftCorner.x() + myLastSymbolWidth; + theBndBox.Bottom = aLeftCorner.y(); + theBndBox.Top = theBndBox.Bottom + myLineSpacing; + } + return Standard_True; +} + + +// ======================================================================= +// function : IsLFSymbol +// purpose : +// ======================================================================= +Standard_Boolean Font_TextFormatter::IsLFSymbol (const Standard_Integer theIndex) const +{ + Font_Rect aBndBox; + if (!GlyphBoundingBox (theIndex, aBndBox)) + return Standard_False; + + return Abs (aBndBox.Right - aBndBox.Left) < Precision::Confusion(); +} + +// ======================================================================= +// function : FirstPosition +// purpose : +// ======================================================================= +Standard_ShortReal Font_TextFormatter::FirstPosition() const +{ + switch (myAlignX) + { + default: + case Graphic3d_HTA_LEFT: return 0; + case Graphic3d_HTA_RIGHT: return myBndWidth; + case Graphic3d_HTA_CENTER: return 0.5f * myBndWidth; + } +} + +// ======================================================================= +// function : LinePositionIndex +// purpose : +// ======================================================================= +Standard_Integer Font_TextFormatter::LinePositionIndex (const Standard_Integer theIndex) const +{ + Standard_Integer anIndex = 0; + + Standard_ShortReal anIndexHeight = BottomLeft (theIndex).y(); + for (Standard_Integer aPrevIndex = theIndex-1; aPrevIndex >= 0; aPrevIndex--) + { + if (BottomLeft (aPrevIndex).y() > anIndexHeight) + { + break; + } + anIndex++; + } + return anIndex; +} + +// ======================================================================= +// function : LineIndex +// purpose : +// ======================================================================= +Standard_Integer Font_TextFormatter::LineIndex (const Standard_Integer theIndex) const +{ + if (myLineSpacing < 0.0f) + return 0; + + return (Standard_Integer)Abs((BottomLeft (theIndex).y() + myAscender) / myLineSpacing); +} + +// ======================================================================= +// function : LineWidth +// purpose : +// ======================================================================= +Standard_ShortReal Font_TextFormatter::LineWidth (const Standard_Integer theIndex) const +{ + if (theIndex < 0) + return 0; + + if (theIndex < myNewLines.Length()) + return theIndex == 0 ? myNewLines[0] : myNewLines[theIndex] - myNewLines[theIndex -1]; + + if (theIndex == myNewLines.Length()) // the last line + return theIndex == 0 ? myPen.x() : myPen.x() - myNewLines[theIndex -1]; + + return 0; +} diff -Nru opencascade-7.4.1+dfsg1/src/Font/Font_TextFormatter.hxx opencascade-7.5.1+dfsg1/src/Font/Font_TextFormatter.hxx --- opencascade-7.4.1+dfsg1/src/Font/Font_TextFormatter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Font/Font_TextFormatter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,10 +25,120 @@ class Font_FTFont; -//! This class intended to prepare formatted text. -class Font_TextFormatter +DEFINE_STANDARD_HANDLE(Font_TextFormatter, Standard_Transient) + +//! This class is intended to prepare formatted text by using:
+//! - font to string combination,
+//! - alignment,
+//! - wrapping.
+//! +//! After text formatting, each symbol of formatted text is placed in some position. +//! Further work with the formatter is using an iterator. +//! The iterator gives an access to each symbol inside the initial row. +//! Also it's possible to get only significant/writable symbols of the text.
+//! Formatter gives an access to geometrical position of a symbol by the symbol index in the text.
+//! Example of correspondence of some text symbol to an index in "row_1\n\nrow_2\n":
+//! "row_1\n" - 0-5 indices;
+//! "\n" - 6 index;
+//! "\n" - 7 index;
+//! "row_2\n" - 8-13 indices.
+//! Pay attention that fonts should have the same LineSpacing value for correct formatting.
+//! Example of the formatter using: +//! @code +//! Handle(Font_TextFormatter) aFormatter = new Font_TextFormatter(); +//! aFormatter->Append(text_1, aFont1); +//! aFormatter->Append(text_2, aFont2); +//! // setting of additional properties such as wrapping or alignment +//! aFormatter->Format(); +//! @endcode +class Font_TextFormatter : public Standard_Transient { public: + //! Iteration filter flags. Command symbols are skipped with any filter. + enum IterationFilter + { + IterationFilter_None = 0x0000, //!< no filter + IterationFilter_ExcludeInvisible = 0x0002, //!< exclude ' ', '\t', '\n' + }; + + //! Iterator through formatted symbols. + //! It's possible to filter returned symbols to have only significant ones. + class Iterator + { + public: + //! Constructor with initialization. + Iterator (const Font_TextFormatter& theFormatter, + IterationFilter theFilter = IterationFilter_None) + : myFilter (theFilter), myIter (theFormatter.myString.Iterator()), mySymbolChar (0), mySymbolCharNext (0) + { + mySymbolPosition = readNextSymbol (-1, mySymbolChar); + mySymbolNext = readNextSymbol (mySymbolPosition, mySymbolCharNext); + } + + //! Returns TRUE if iterator points to a valid item. + Standard_Boolean More() const { return mySymbolPosition >= 0; } + + //! Returns TRUE if next item exists + Standard_Boolean HasNext() const { return mySymbolNext >= 0; } + + //! Returns current symbol. + Standard_Utf32Char Symbol() const { return mySymbolChar; } + + //! Returns the next symbol if exists. + Standard_Utf32Char SymbolNext() const { return mySymbolCharNext; } + + //! Returns current symbol position. + Standard_Integer SymbolPosition() const { return mySymbolPosition; } + + //! Returns the next symbol position. + Standard_Integer SymbolPositionNext() const { return mySymbolNext; } + + //! Moves to the next item. + void Next() + { + mySymbolPosition = mySymbolNext; + mySymbolChar = mySymbolCharNext; + mySymbolNext = readNextSymbol (mySymbolPosition, mySymbolCharNext); + } + + protected: + //! Finds index of the next symbol + Standard_Integer readNextSymbol (const Standard_Integer theSymbolStartingFrom, + Standard_Utf32Char& theSymbolChar) + { + Standard_Integer aNextSymbol = theSymbolStartingFrom; + for (; *myIter != 0; ++myIter) + { + const Standard_Utf32Char aCharCurr = *myIter; + if (Font_TextFormatter::IsCommandSymbol (aCharCurr)) + { + continue; // skip unsupported carriage control codes + } + aNextSymbol++; + if ((myFilter & IterationFilter_ExcludeInvisible) != 0) + { + if (aCharCurr == '\x0A'|| // LF (line feed, new line) + aCharCurr == ' ' || + aCharCurr == '\t') + { + continue; + } + } + ++myIter; + theSymbolChar = aCharCurr; + return aNextSymbol; // found the first next, not command and not filtered symbol + } + return -1; // the next symbol is not found + } + + protected: + IterationFilter myFilter; //!< possibility to filter not-necessary symbols + NCollection_Utf8Iter myIter; //!< the next symbol iterator value over the text formatter string + Standard_Integer mySymbolPosition; //!< the current position + Standard_Utf32Char mySymbolChar; //!< the current symbol + Standard_Integer mySymbolNext; //!< position of the next symbol in iterator, if zero, the iterator is finished + Standard_Utf32Char mySymbolCharNext; //!< the current symbol + }; //! Default constructor. Standard_EXPORT Font_TextFormatter(); @@ -48,24 +158,68 @@ //! Should not be called more than once after initialization! Standard_EXPORT void Format(); - //! Returns specific glyph rectangle. - inline const NCollection_Vec2& TopLeft (const Standard_Integer theIndex) const + Standard_DEPRECATED("BottomLeft should be used instead") + const NCollection_Vec2& TopLeft (const Standard_Integer theIndex) const { - return myCorners.Value (theIndex); + return BottomLeft (theIndex); } + //! Returns specific glyph rectangle. + const NCollection_Vec2& BottomLeft (const Standard_Integer theIndex) const + { return myCorners.Value (theIndex); } + //! Returns current rendering string. inline const NCollection_String& String() const { return myString; } + //! Returns symbol bounding box + //! @param bounding box. + Standard_EXPORT Standard_Boolean GlyphBoundingBox (const Standard_Integer theIndex, + Font_Rect& theBndBox) const; + + //! Returns the line height + //! @param theIndex a line index, obtained by LineIndex() + Standard_ShortReal LineHeight (const Standard_Integer theIndex) const + { return theIndex == 0 ? myAscender : myLineSpacing; } + + //! Returns width of a line + Standard_EXPORT Standard_ShortReal LineWidth (const Standard_Integer theIndex) const; + + //! Returns true if the symbol by the index is '\n'. The width of the symbol is zero. + Standard_EXPORT Standard_Boolean IsLFSymbol (const Standard_Integer theIndex) const; + + //! Returns position of the first symbol in a line using alignment + Standard_EXPORT Standard_ShortReal FirstPosition() const; + + //! Returns column index of the corner index in the current line + Standard_EXPORT Standard_Integer LinePositionIndex (const Standard_Integer theIndex) const; + + //! Returns row index of the corner index among text lines + Standard_EXPORT Standard_Integer LineIndex (const Standard_Integer theIndex) const; + //! Returns tab size. inline Standard_Integer TabSize() const { return myTabSize; } + //! Returns horizontal alignment style + Graphic3d_HorizontalTextAlignment HorizontalTextAlignment() const { return myAlignX; } + + //! Returns vertical alignment style + Graphic3d_VerticalTextAlignment VerticalTextAlignment() const { return myAlignY; } + + //! Sets text wrapping width, zero means that the text is not bounded by width + void SetWrapping (const Standard_ShortReal theWidth) { myWrappingWidth = theWidth; } + + //! Returns text maximum width, zero means that the text is not bounded by width + Standard_Boolean HasWrapping() const { return myWrappingWidth > 0; } + + //! Returns text maximum width, zero means that the text is not bounded by width + Standard_ShortReal Wrapping() const { return myWrappingWidth; } + //! @return width of formatted text. inline Standard_ShortReal ResultWidth() const { @@ -78,6 +232,9 @@ return myLineSpacing * Standard_ShortReal(myLinesNb); } + //! @return maximum width of the text symbol + Standard_ShortReal MaximumSymbolWidth() const { return myMaxSymbolWidth; } + //! @param bounding box. inline void BndBox (Font_Rect& theBndBox) const { @@ -98,16 +255,41 @@ theBndBox.Bottom = theBndBox.Top - myLineSpacing * Standard_ShortReal(myLinesNb); } + //! Returns internal container of the top left corners of a formatted rectangles. + const NCollection_Vector < NCollection_Vec2 >& Corners() const { return myCorners; } + + //! Returns container of each line position at LF in formatted text + const NCollection_Vector& NewLines() const { return myNewLines; } + + //! Returns true if the symbol is CR, BEL, FF, NP, BS or VT + static inline Standard_Boolean IsCommandSymbol (const Standard_Utf32Char& theSymbol) + { + if (theSymbol == '\x0D' // CR (carriage return) + || theSymbol == '\a' // BEL (alarm) + || theSymbol == '\f' // FF (form feed) NP (new page) + || theSymbol == '\b' // BS (backspace) + || theSymbol == '\v') // VT (vertical tab) + return Standard_True; + + return Standard_False; + } + + DEFINE_STANDARD_RTTIEXT (Font_TextFormatter, Standard_Transient) + protected: //! @name class auxiliary methods //! Move glyphs on the current line to correct position. - Standard_EXPORT void newLine (const Standard_Integer theLastRect); + Standard_EXPORT void newLine (const Standard_Integer theLastRect, + const Standard_ShortReal theMaxLineWidth); protected: //! @name configuration Graphic3d_HorizontalTextAlignment myAlignX; //!< horizontal alignment style Graphic3d_VerticalTextAlignment myAlignY; //!< vertical alignment style Standard_Integer myTabSize; //!< horizontal tabulation width (number of space symbols) + Standard_ShortReal myWrappingWidth; //!< text is wrapped by the width if defined (more 0) + Standard_ShortReal myLastSymbolWidth; //!< width of the last symbol + Standard_ShortReal myMaxSymbolWidth; //!< maximum symbol width of the formatter string protected: //! @name input data @@ -115,19 +297,17 @@ NCollection_Vec2 myPen; //!< current pen position NCollection_Vector < NCollection_Vec2 > - myCorners; //!< The top left corners of a formatted rectangles. - Standard_Integer myRectsNb; //!< rectangles number + myCorners; //!< The bottom left corners of a formatted rectangles. NCollection_Vector myNewLines; //!< position at LF Standard_ShortReal myLineSpacing; //!< line spacing (computed as maximum of all fonts involved in text formatting) - Standard_ShortReal myAscender; //!< + Standard_ShortReal myAscender; //!< line spacing for the first line bool myIsFormatted; //!< formatting state protected: //! @name temporary variables for formatting routines Standard_Integer myLinesNb; //!< overall (new)lines number (including splitting by width limit) Standard_Integer myRectLineStart; //!< id of first rectangle on the current line - Standard_Integer myRectWordStart; //!< id of first rectangle in the current word Standard_Integer myNewLineNb; Standard_ShortReal myPenCurrLine; //!< current baseline position diff -Nru opencascade-7.4.1+dfsg1/src/FSD/FSD_Base64Decoder.cxx opencascade-7.5.1+dfsg1/src/FSD/FSD_Base64Decoder.cxx --- opencascade-7.4.1+dfsg1/src/FSD/FSD_Base64Decoder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/FSD/FSD_Base64Decoder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,23 @@ #include #include +//! Buffer with decoded data. +class FSD_Base64DecoderBuffer : public NCollection_Buffer +{ +public: + //! Empty constructor. + FSD_Base64DecoderBuffer() : NCollection_Buffer (NCollection_BaseAllocator::CommonBaseAllocator()) {} + + //! Shrink data size. + void ShrinkSize (Standard_Size theSize) + { + if (theSize < mySize) + { + mySize = theSize; + } + } +}; + // ======================================================================= // function : Decode // purpose : @@ -37,10 +54,10 @@ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255, 255 }; - Handle(NCollection_Buffer) aData = new NCollection_Buffer (NCollection_BaseAllocator::CommonBaseAllocator()); + Handle(FSD_Base64DecoderBuffer) aData = new FSD_Base64DecoderBuffer(); if (!aData->Allocate (3 * theLen / 4)) { - Message::DefaultMessenger()->Send ("Fail to allocate memory.", Message_Fail); + Message::SendFail ("Fail to allocate memory."); return Handle(NCollection_Buffer)(); } @@ -82,6 +99,8 @@ ++aDataPtr; } } - + // shrink buffer size to actual length + const Standard_Size aFinalLen = aDataPtr - aData->ChangeData(); + aData->ShrinkSize (aFinalLen); return aData; } diff -Nru opencascade-7.4.1+dfsg1/src/FSD/FSD_BinaryFile.cxx opencascade-7.5.1+dfsg1/src/FSD/FSD_BinaryFile.cxx --- opencascade-7.4.1+dfsg1/src/FSD/FSD_BinaryFile.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/FSD/FSD_BinaryFile.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,6 +32,8 @@ const Standard_CString MAGICNUMBER = "BINFILE"; +IMPLEMENT_STANDARD_RTTIEXT(FSD_BinaryFile,Storage_BaseDriver) + //======================================================================= //function : FSD_BinaryFile //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/FSD/FSD_BinaryFile.hxx opencascade-7.5.1+dfsg1/src/FSD/FSD_BinaryFile.hxx --- opencascade-7.4.1+dfsg1/src/FSD/FSD_BinaryFile.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/FSD/FSD_BinaryFile.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,10 +17,6 @@ #ifndef _FSD_BinaryFile_HeaderFile #define _FSD_BinaryFile_HeaderFile -#include -#include -#include - #include #include #include @@ -32,22 +28,15 @@ #include #include #include -#include -#include -#include -#include -#include -#include + class Storage_StreamTypeMismatchError; class Storage_StreamFormatError; class Storage_StreamWriteError; class Storage_StreamExtCharParityError; class TCollection_AsciiString; class TCollection_ExtendedString; -class Storage_BaseDriver; class Storage_HeaderData; - // Macro that tells if bytes must be reversed when read/write // data to/from a binary file. It is needed to provide binary file compatibility // between little and big endian platforms. @@ -60,26 +49,27 @@ #endif #endif +DEFINE_STANDARD_HANDLE(FSD_BinaryFile,Storage_BaseDriver) class FSD_BinaryFile : public Storage_BaseDriver { public: + DEFINE_STANDARD_RTTIEXT(FSD_BinaryFile,Storage_BaseDriver) - DEFINE_STANDARD_ALLOC +public: - Standard_EXPORT FSD_BinaryFile(); - Standard_EXPORT Storage_Error Open (const TCollection_AsciiString& aName, const Storage_OpenMode aMode); + Standard_EXPORT Storage_Error Open (const TCollection_AsciiString& aName, const Storage_OpenMode aMode) Standard_OVERRIDE; - Standard_EXPORT Standard_Boolean IsEnd(); + Standard_EXPORT Standard_Boolean IsEnd() Standard_OVERRIDE; //! return position in the file. Return -1 upon error. - Standard_EXPORT Storage_Position Tell(); + Standard_EXPORT Storage_Position Tell() Standard_OVERRIDE; Standard_EXPORT static Storage_Error IsGoodFileType (const TCollection_AsciiString& aName); - Standard_EXPORT Storage_Error BeginWriteInfoSection(); + Standard_EXPORT Storage_Error BeginWriteInfoSection() Standard_OVERRIDE; Standard_EXPORT static Standard_Integer WriteInfo (Standard_OStream& theOStream, const Standard_Integer nbObj, @@ -93,223 +83,206 @@ const TColStd_SequenceOfAsciiString& userInfo, const Standard_Boolean theOnlyCount = Standard_False); - Standard_EXPORT void WriteInfo (const Standard_Integer nbObj, const TCollection_AsciiString& dbVersion, const TCollection_AsciiString& date, const TCollection_AsciiString& schemaName, const TCollection_AsciiString& schemaVersion, const TCollection_ExtendedString& appName, const TCollection_AsciiString& appVersion, const TCollection_ExtendedString& objectType, const TColStd_SequenceOfAsciiString& userInfo); + Standard_EXPORT void WriteInfo (const Standard_Integer nbObj, + const TCollection_AsciiString& dbVersion, + const TCollection_AsciiString& date, + const TCollection_AsciiString& schemaName, + const TCollection_AsciiString& schemaVersion, + const TCollection_ExtendedString& appName, + const TCollection_AsciiString& appVersion, + const TCollection_ExtendedString& objectType, + const TColStd_SequenceOfAsciiString& userInfo) Standard_OVERRIDE; - Standard_EXPORT Storage_Error EndWriteInfoSection(); + Standard_EXPORT Storage_Error EndWriteInfoSection() Standard_OVERRIDE; Standard_EXPORT Storage_Error EndWriteInfoSection(Standard_OStream& theOStream); - Standard_EXPORT Storage_Error BeginReadInfoSection(); + Standard_EXPORT Storage_Error BeginReadInfoSection() Standard_OVERRIDE; - Standard_EXPORT void ReadInfo (Standard_Integer& nbObj, TCollection_AsciiString& dbVersion, TCollection_AsciiString& date, TCollection_AsciiString& schemaName, TCollection_AsciiString& schemaVersion, TCollection_ExtendedString& appName, TCollection_AsciiString& appVersion, TCollection_ExtendedString& objectType, TColStd_SequenceOfAsciiString& userInfo); + Standard_EXPORT void ReadInfo (Standard_Integer& nbObj, + TCollection_AsciiString& dbVersion, + TCollection_AsciiString& date, + TCollection_AsciiString& schemaName, + TCollection_AsciiString& schemaVersion, + TCollection_ExtendedString& appName, + TCollection_AsciiString& appVersion, + TCollection_ExtendedString& objectType, + TColStd_SequenceOfAsciiString& userInfo) Standard_OVERRIDE; - Standard_EXPORT void ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData); + Standard_EXPORT void ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData) Standard_OVERRIDE; - Standard_EXPORT Storage_Error EndReadInfoSection(); + Standard_EXPORT Storage_Error EndReadInfoSection() Standard_OVERRIDE; - Standard_EXPORT Storage_Error BeginWriteCommentSection(); + Standard_EXPORT Storage_Error BeginWriteCommentSection() Standard_OVERRIDE; Standard_EXPORT Storage_Error BeginWriteCommentSection (Standard_OStream& theOStream); - Standard_EXPORT void WriteComment (const TColStd_SequenceOfExtendedString& userComments); + Standard_EXPORT void WriteComment (const TColStd_SequenceOfExtendedString& userComments) Standard_OVERRIDE; Standard_EXPORT static Standard_Integer WriteComment (Standard_OStream& theOStream, const TColStd_SequenceOfExtendedString& theComments, const Standard_Boolean theOnlyCount = Standard_False); - Standard_EXPORT Storage_Error EndWriteCommentSection(); + Standard_EXPORT Storage_Error EndWriteCommentSection() Standard_OVERRIDE; Standard_EXPORT Storage_Error EndWriteCommentSection (Standard_OStream& theOStream); - Standard_EXPORT Storage_Error BeginReadCommentSection(); + Standard_EXPORT Storage_Error BeginReadCommentSection() Standard_OVERRIDE; - Standard_EXPORT void ReadComment (TColStd_SequenceOfExtendedString& userComments); + Standard_EXPORT void ReadComment (TColStd_SequenceOfExtendedString& userComments) Standard_OVERRIDE; Standard_EXPORT static void ReadComment (Standard_IStream& theIStream, TColStd_SequenceOfExtendedString& userComments); - Standard_EXPORT Storage_Error EndReadCommentSection(); + Standard_EXPORT Storage_Error EndReadCommentSection() Standard_OVERRIDE; - Standard_EXPORT Storage_Error BeginWriteTypeSection(); + Standard_EXPORT Storage_Error BeginWriteTypeSection() Standard_OVERRIDE; - Standard_EXPORT void SetTypeSectionSize (const Standard_Integer aSize); + Standard_EXPORT void SetTypeSectionSize (const Standard_Integer aSize) Standard_OVERRIDE; - Standard_EXPORT void WriteTypeInformations (const Standard_Integer typeNum, const TCollection_AsciiString& typeName); + Standard_EXPORT void WriteTypeInformations (const Standard_Integer typeNum, const TCollection_AsciiString& typeName) Standard_OVERRIDE; - Standard_EXPORT Storage_Error EndWriteTypeSection(); + Standard_EXPORT Storage_Error EndWriteTypeSection() Standard_OVERRIDE; - Standard_EXPORT Storage_Error BeginReadTypeSection(); + Standard_EXPORT Storage_Error BeginReadTypeSection() Standard_OVERRIDE; - Standard_EXPORT Standard_Integer TypeSectionSize(); + Standard_EXPORT Standard_Integer TypeSectionSize() Standard_OVERRIDE; Standard_EXPORT static Standard_Integer TypeSectionSize(Standard_IStream& theIStream); - Standard_EXPORT void ReadTypeInformations (Standard_Integer& typeNum, TCollection_AsciiString& typeName); + Standard_EXPORT void ReadTypeInformations (Standard_Integer& typeNum, TCollection_AsciiString& typeName) Standard_OVERRIDE; - Standard_EXPORT static void ReadTypeInformations (Standard_IStream& theIStream, Standard_Integer& typeNum, TCollection_AsciiString& typeName); + Standard_EXPORT static void ReadTypeInformations (Standard_IStream& theIStream, + Standard_Integer& typeNum, + TCollection_AsciiString& typeName); - Standard_EXPORT Storage_Error EndReadTypeSection(); + Standard_EXPORT Storage_Error EndReadTypeSection() Standard_OVERRIDE; - Standard_EXPORT Storage_Error BeginWriteRootSection(); + Standard_EXPORT Storage_Error BeginWriteRootSection() Standard_OVERRIDE; - Standard_EXPORT void SetRootSectionSize (const Standard_Integer aSize); + Standard_EXPORT void SetRootSectionSize (const Standard_Integer aSize) Standard_OVERRIDE; - Standard_EXPORT void WriteRoot (const TCollection_AsciiString& rootName, const Standard_Integer aRef, const TCollection_AsciiString& aType); + Standard_EXPORT void WriteRoot (const TCollection_AsciiString& rootName, + const Standard_Integer aRef, + const TCollection_AsciiString& aType) Standard_OVERRIDE; - Standard_EXPORT Storage_Error EndWriteRootSection(); + Standard_EXPORT Storage_Error EndWriteRootSection() Standard_OVERRIDE; - Standard_EXPORT Storage_Error BeginReadRootSection(); + Standard_EXPORT Storage_Error BeginReadRootSection() Standard_OVERRIDE; - Standard_EXPORT Standard_Integer RootSectionSize(); + Standard_EXPORT Standard_Integer RootSectionSize() Standard_OVERRIDE; Standard_EXPORT static Standard_Integer RootSectionSize(Standard_IStream& theIStream); - Standard_EXPORT void ReadRoot (TCollection_AsciiString& rootName, Standard_Integer& aRef, TCollection_AsciiString& aType); + Standard_EXPORT void ReadRoot (TCollection_AsciiString& rootName, + Standard_Integer& aRef, + TCollection_AsciiString& aType) Standard_OVERRIDE; - Standard_EXPORT static void ReadRoot (Standard_IStream& theIStream, TCollection_AsciiString& rootName, Standard_Integer& aRef, TCollection_AsciiString& aType); + Standard_EXPORT static void ReadRoot (Standard_IStream& theIStream, + TCollection_AsciiString& rootName, + Standard_Integer& aRef, + TCollection_AsciiString& aType); - Standard_EXPORT Storage_Error EndReadRootSection(); + Standard_EXPORT Storage_Error EndReadRootSection() Standard_OVERRIDE; - Standard_EXPORT Storage_Error BeginWriteRefSection(); + Standard_EXPORT Storage_Error BeginWriteRefSection() Standard_OVERRIDE; - Standard_EXPORT void SetRefSectionSize (const Standard_Integer aSize); + Standard_EXPORT void SetRefSectionSize (const Standard_Integer aSize) Standard_OVERRIDE; - Standard_EXPORT void WriteReferenceType (const Standard_Integer reference, const Standard_Integer typeNum); + Standard_EXPORT void WriteReferenceType (const Standard_Integer reference, const Standard_Integer typeNum) Standard_OVERRIDE; - Standard_EXPORT Storage_Error EndWriteRefSection(); + Standard_EXPORT Storage_Error EndWriteRefSection() Standard_OVERRIDE; - Standard_EXPORT Storage_Error BeginReadRefSection(); + Standard_EXPORT Storage_Error BeginReadRefSection() Standard_OVERRIDE; - Standard_EXPORT Standard_Integer RefSectionSize(); + Standard_EXPORT Standard_Integer RefSectionSize() Standard_OVERRIDE; Standard_EXPORT static Standard_Integer RefSectionSize(Standard_IStream& theIStream); - Standard_EXPORT void ReadReferenceType (Standard_Integer& reference, Standard_Integer& typeNum); + Standard_EXPORT void ReadReferenceType (Standard_Integer& reference, Standard_Integer& typeNum) Standard_OVERRIDE; - Standard_EXPORT static void ReadReferenceType (Standard_IStream& theIStream, Standard_Integer& reference, Standard_Integer& typeNum); + Standard_EXPORT static void ReadReferenceType (Standard_IStream& theIStream, + Standard_Integer& reference, + Standard_Integer& typeNum); - Standard_EXPORT Storage_Error EndReadRefSection(); + Standard_EXPORT Storage_Error EndReadRefSection() Standard_OVERRIDE; - Standard_EXPORT Storage_Error BeginWriteDataSection(); + Standard_EXPORT Storage_Error BeginWriteDataSection() Standard_OVERRIDE; - Standard_EXPORT void WritePersistentObjectHeader (const Standard_Integer aRef, const Standard_Integer aType); + Standard_EXPORT void WritePersistentObjectHeader (const Standard_Integer aRef, const Standard_Integer aType) Standard_OVERRIDE; - Standard_EXPORT void BeginWritePersistentObjectData(); + Standard_EXPORT void BeginWritePersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT void BeginWriteObjectData(); + Standard_EXPORT void BeginWriteObjectData() Standard_OVERRIDE; - Standard_EXPORT void EndWriteObjectData(); + Standard_EXPORT void EndWriteObjectData() Standard_OVERRIDE; - Standard_EXPORT void EndWritePersistentObjectData(); + Standard_EXPORT void EndWritePersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT Storage_Error EndWriteDataSection(); + Standard_EXPORT Storage_Error EndWriteDataSection() Standard_OVERRIDE; - Standard_EXPORT Storage_Error BeginReadDataSection(); + Standard_EXPORT Storage_Error BeginReadDataSection() Standard_OVERRIDE; - Standard_EXPORT void ReadPersistentObjectHeader (Standard_Integer& aRef, Standard_Integer& aType); + Standard_EXPORT void ReadPersistentObjectHeader (Standard_Integer& aRef, Standard_Integer& aType) Standard_OVERRIDE; - Standard_EXPORT void BeginReadPersistentObjectData(); + Standard_EXPORT void BeginReadPersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT void BeginReadObjectData(); + Standard_EXPORT void BeginReadObjectData() Standard_OVERRIDE; - Standard_EXPORT void EndReadObjectData(); + Standard_EXPORT void EndReadObjectData() Standard_OVERRIDE; - Standard_EXPORT void EndReadPersistentObjectData(); + Standard_EXPORT void EndReadPersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT Storage_Error EndReadDataSection(); + Standard_EXPORT Storage_Error EndReadDataSection() Standard_OVERRIDE; - Standard_EXPORT void SkipObject(); + Standard_EXPORT void SkipObject() Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& PutReference (const Standard_Integer aValue); + Standard_EXPORT Storage_BaseDriver& PutReference (const Standard_Integer aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& PutCharacter (const Standard_Character aValue); -Storage_BaseDriver& operator << (const Standard_Character aValue) -{ - return PutCharacter(aValue); -} + Standard_EXPORT Storage_BaseDriver& PutCharacter (const Standard_Character aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& PutExtCharacter (const Standard_ExtCharacter aValue); -Storage_BaseDriver& operator << (const Standard_ExtCharacter aValue) -{ - return PutExtCharacter(aValue); -} + Standard_EXPORT Storage_BaseDriver& PutExtCharacter (const Standard_ExtCharacter aValue) Standard_OVERRIDE; Standard_EXPORT static Standard_Integer PutInteger (Standard_OStream& theOStream, const Standard_Integer aValue, const Standard_Boolean theOnlyCount = Standard_False); - Standard_EXPORT Storage_BaseDriver& PutInteger (const Standard_Integer aValue); -Storage_BaseDriver& operator << (const Standard_Integer aValue) -{ - return PutInteger(aValue); -} + Standard_EXPORT Storage_BaseDriver& PutInteger (const Standard_Integer aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& PutBoolean (const Standard_Boolean aValue); -Storage_BaseDriver& operator << (const Standard_Boolean aValue) -{ - return PutBoolean(aValue); -} + Standard_EXPORT Storage_BaseDriver& PutBoolean (const Standard_Boolean aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& PutReal (const Standard_Real aValue); -Storage_BaseDriver& operator << (const Standard_Real aValue) -{ - return PutReal(aValue); -} + Standard_EXPORT Storage_BaseDriver& PutReal (const Standard_Real aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& PutShortReal (const Standard_ShortReal aValue); -Storage_BaseDriver& operator << (const Standard_ShortReal aValue) -{ - return PutShortReal(aValue); -} + Standard_EXPORT Storage_BaseDriver& PutShortReal (const Standard_ShortReal aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& GetReference (Standard_Integer& aValue); + Standard_EXPORT Storage_BaseDriver& GetReference (Standard_Integer& aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& GetCharacter (Standard_Character& aValue); -Storage_BaseDriver& operator >> (Standard_Character& aValue) -{ - return GetCharacter(aValue); -} + Standard_EXPORT Storage_BaseDriver& GetCharacter (Standard_Character& aValue) Standard_OVERRIDE; Standard_EXPORT static void GetReference (Standard_IStream& theIStream, Standard_Integer& aValue); - Standard_EXPORT Storage_BaseDriver& GetExtCharacter (Standard_ExtCharacter& aValue); -Storage_BaseDriver& operator >> (Standard_ExtCharacter& aValue) -{ - return GetExtCharacter(aValue); -} + Standard_EXPORT Storage_BaseDriver& GetExtCharacter (Standard_ExtCharacter& aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& GetInteger (Standard_Integer& aValue); -Storage_BaseDriver& operator >> (Standard_Integer& aValue) -{ - return GetInteger(aValue); -} + Standard_EXPORT Storage_BaseDriver& GetInteger (Standard_Integer& aValue) Standard_OVERRIDE; Standard_EXPORT static void GetInteger (Standard_IStream& theIStream, Standard_Integer& aValue); - Standard_EXPORT Storage_BaseDriver& GetBoolean (Standard_Boolean& aValue); -Storage_BaseDriver& operator >> (Standard_Boolean& aValue) -{ - return GetBoolean(aValue); -} + Standard_EXPORT Storage_BaseDriver& GetBoolean (Standard_Boolean& aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& GetReal (Standard_Real& aValue); -Storage_BaseDriver& operator >> (Standard_Real& aValue) -{ - return GetReal(aValue); -} + Standard_EXPORT Storage_BaseDriver& GetReal (Standard_Real& aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_BaseDriver& GetShortReal (Standard_ShortReal& aValue); -Storage_BaseDriver& operator >> (Standard_ShortReal& aValue) -{ - return GetShortReal(aValue); -} + Standard_EXPORT Storage_BaseDriver& GetShortReal (Standard_ShortReal& aValue) Standard_OVERRIDE; - Standard_EXPORT Storage_Error Close(); + Standard_EXPORT Storage_Error Close() Standard_OVERRIDE; Standard_EXPORT void Destroy(); -~FSD_BinaryFile() -{ - Destroy(); -} + + ~FSD_BinaryFile() + { + Destroy(); + } + +public: + //!@name Own methods ///Inverse bytes in integer value static Standard_Integer InverseInt(const Standard_Integer theValue) @@ -353,7 +326,6 @@ Standard_EXPORT static Standard_CString MagicNumber(); protected: - //! read character from the current position. Standard_EXPORT void ReadChar (TCollection_AsciiString& buffer, const Standard_Size rsize); diff -Nru opencascade-7.4.1+dfsg1/src/FSD/FSD_CmpFile.cxx opencascade-7.5.1+dfsg1/src/FSD/FSD_CmpFile.cxx --- opencascade-7.4.1+dfsg1/src/FSD/FSD_CmpFile.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/FSD/FSD_CmpFile.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,8 @@ const Standard_CString MAGICNUMBER = "CMPFILE"; +IMPLEMENT_STANDARD_RTTIEXT(FSD_CmpFile, FSD_File) + //======================================================================= //function : FSD_CmpFile //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/FSD/FSD_CmpFile.hxx opencascade-7.5.1+dfsg1/src/FSD/FSD_CmpFile.hxx --- opencascade-7.4.1+dfsg1/src/FSD/FSD_CmpFile.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/FSD/FSD_CmpFile.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,49 +21,48 @@ #include #include #include -#include -#include -#include + class TCollection_AsciiString; class TCollection_ExtendedString; class Storage_BaseDriver; +DEFINE_STANDARD_HANDLE(FSD_CmpFile,FSD_File) + class FSD_CmpFile : public FSD_File { public: + DEFINE_STANDARD_RTTIEXT(FSD_CmpFile,FSD_File) - DEFINE_STANDARD_ALLOC - - +public: Standard_EXPORT FSD_CmpFile(); - Standard_EXPORT Storage_Error Open(const TCollection_AsciiString& aName, const Storage_OpenMode aMode); + Standard_EXPORT Storage_Error Open(const TCollection_AsciiString& aName, const Storage_OpenMode aMode) Standard_OVERRIDE; Standard_EXPORT static Storage_Error IsGoodFileType(const TCollection_AsciiString& aName); - Standard_EXPORT Storage_Error BeginWriteInfoSection(); + Standard_EXPORT Storage_Error BeginWriteInfoSection() Standard_OVERRIDE; - Standard_EXPORT Storage_Error BeginReadInfoSection(); + Standard_EXPORT Storage_Error BeginReadInfoSection() Standard_OVERRIDE; - Standard_EXPORT void WritePersistentObjectHeader(const Standard_Integer aRef, const Standard_Integer aType); + Standard_EXPORT void WritePersistentObjectHeader(const Standard_Integer aRef, const Standard_Integer aType) Standard_OVERRIDE; - Standard_EXPORT void BeginWritePersistentObjectData(); + Standard_EXPORT void BeginWritePersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT void BeginWriteObjectData(); + Standard_EXPORT void BeginWriteObjectData() Standard_OVERRIDE; - Standard_EXPORT void EndWriteObjectData(); + Standard_EXPORT void EndWriteObjectData() Standard_OVERRIDE; - Standard_EXPORT void EndWritePersistentObjectData(); + Standard_EXPORT void EndWritePersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT void ReadPersistentObjectHeader(Standard_Integer& aRef, Standard_Integer& aType); + Standard_EXPORT void ReadPersistentObjectHeader(Standard_Integer& aRef, Standard_Integer& aType) Standard_OVERRIDE; - Standard_EXPORT void BeginReadPersistentObjectData(); + Standard_EXPORT void BeginReadPersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT void BeginReadObjectData(); + Standard_EXPORT void BeginReadObjectData() Standard_OVERRIDE; - Standard_EXPORT void EndReadObjectData(); + Standard_EXPORT void EndReadObjectData() Standard_OVERRIDE; - Standard_EXPORT void EndReadPersistentObjectData(); + Standard_EXPORT void EndReadPersistentObjectData() Standard_OVERRIDE; Standard_EXPORT void Destroy(); ~FSD_CmpFile() @@ -73,22 +72,19 @@ Standard_EXPORT static Standard_CString MagicNumber(); - - protected: - //! read from the current position to the end of line. - Standard_EXPORT void ReadLine(TCollection_AsciiString& buffer); + Standard_EXPORT void ReadLine(TCollection_AsciiString& buffer) Standard_OVERRIDE; //! read extended chars (unicode) from the current position to the end of line. - Standard_EXPORT void ReadExtendedLine(TCollection_ExtendedString& buffer); + Standard_EXPORT void ReadExtendedLine(TCollection_ExtendedString& buffer) Standard_OVERRIDE; //! write from the current position to the end of line. - Standard_EXPORT void WriteExtendedLine(const TCollection_ExtendedString& buffer); + Standard_EXPORT void WriteExtendedLine(const TCollection_ExtendedString& buffer) Standard_OVERRIDE; //! read from the first none space character position to the end of line. - Standard_EXPORT void ReadString(TCollection_AsciiString& buffer); + Standard_EXPORT void ReadString(TCollection_AsciiString& buffer) Standard_OVERRIDE; }; diff -Nru opencascade-7.4.1+dfsg1/src/FSD/FSD_File.cxx opencascade-7.5.1+dfsg1/src/FSD/FSD_File.cxx --- opencascade-7.4.1+dfsg1/src/FSD/FSD_File.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/FSD/FSD_File.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,6 +30,8 @@ #define USEOSDREAL 1 +IMPLEMENT_STANDARD_RTTIEXT(FSD_File, Storage_BaseDriver) + //======================================================================= //function : FSD_File //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/FSD/FSD_FileHeader.hxx opencascade-7.5.1+dfsg1/src/FSD/FSD_FileHeader.hxx --- opencascade-7.4.1+dfsg1/src/FSD/FSD_FileHeader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/FSD/FSD_FileHeader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,8 @@ #ifndef _FSD_FileHeader_HeaderFile #define _FSD_FileHeader_HeaderFile +#include + struct FSD_FileHeader { Standard_Integer testindian; Standard_Integer binfo; diff -Nru opencascade-7.4.1+dfsg1/src/FSD/FSD_File.hxx opencascade-7.5.1+dfsg1/src/FSD/FSD_File.hxx --- opencascade-7.4.1+dfsg1/src/FSD/FSD_File.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/FSD/FSD_File.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,25 +17,9 @@ #ifndef _FSD_File_HeaderFile #define _FSD_File_HeaderFile -#include -#include -#include - #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include + class Storage_StreamTypeMismatchError; class Storage_StreamFormatError; class Storage_StreamWriteError; @@ -44,17 +28,16 @@ class TCollection_ExtendedString; class Storage_BaseDriver; - +DEFINE_STANDARD_HANDLE(FSD_File,Storage_BaseDriver) //! A general driver which defines as a file, the //! physical container for data to be stored or retrieved. class FSD_File : public Storage_BaseDriver { public: + DEFINE_STANDARD_RTTIEXT(FSD_File,Storage_BaseDriver) - DEFINE_STANDARD_ALLOC - - +public: //! Constructs a driver defining as a file, the physical //! container for data to be stored or retrieved. @@ -68,203 +51,174 @@ //! The function returns Storage_VSOk if the file //! is opened correctly, or any other value of the //! Storage_Error enumeration which specifies the problem encountered. - Standard_EXPORT virtual Storage_Error Open (const TCollection_AsciiString& aName, const Storage_OpenMode aMode); + Standard_EXPORT virtual Storage_Error Open (const TCollection_AsciiString& aName, const Storage_OpenMode aMode) Standard_OVERRIDE; - Standard_EXPORT virtual Standard_Boolean IsEnd(); + Standard_EXPORT virtual Standard_Boolean IsEnd() Standard_OVERRIDE; //! return position in the file. Return -1 upon error. - Standard_EXPORT virtual Storage_Position Tell(); + Standard_EXPORT virtual Storage_Position Tell() Standard_OVERRIDE; Standard_EXPORT static Storage_Error IsGoodFileType (const TCollection_AsciiString& aName); - Standard_EXPORT virtual Storage_Error BeginWriteInfoSection(); + Standard_EXPORT virtual Storage_Error BeginWriteInfoSection() Standard_OVERRIDE; - Standard_EXPORT virtual void WriteInfo (const Standard_Integer nbObj, const TCollection_AsciiString& dbVersion, const TCollection_AsciiString& date, const TCollection_AsciiString& schemaName, const TCollection_AsciiString& schemaVersion, const TCollection_ExtendedString& appName, const TCollection_AsciiString& appVersion, const TCollection_ExtendedString& objectType, const TColStd_SequenceOfAsciiString& userInfo); + Standard_EXPORT virtual void WriteInfo (const Standard_Integer nbObj, + const TCollection_AsciiString& dbVersion, + const TCollection_AsciiString& date, + const TCollection_AsciiString& schemaName, + const TCollection_AsciiString& schemaVersion, + const TCollection_ExtendedString& appName, + const TCollection_AsciiString& appVersion, + const TCollection_ExtendedString& objectType, + const TColStd_SequenceOfAsciiString& userInfo) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndWriteInfoSection(); + Standard_EXPORT virtual Storage_Error EndWriteInfoSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginReadInfoSection(); + Standard_EXPORT virtual Storage_Error BeginReadInfoSection() Standard_OVERRIDE; - Standard_EXPORT virtual void ReadInfo (Standard_Integer& nbObj, TCollection_AsciiString& dbVersion, TCollection_AsciiString& date, TCollection_AsciiString& schemaName, TCollection_AsciiString& schemaVersion, TCollection_ExtendedString& appName, TCollection_AsciiString& appVersion, TCollection_ExtendedString& objectType, TColStd_SequenceOfAsciiString& userInfo); + Standard_EXPORT virtual void ReadInfo (Standard_Integer& nbObj, + TCollection_AsciiString& dbVersion, + TCollection_AsciiString& date, + TCollection_AsciiString& schemaName, + TCollection_AsciiString& schemaVersion, + TCollection_ExtendedString& appName, + TCollection_AsciiString& appVersion, + TCollection_ExtendedString& objectType, + TColStd_SequenceOfAsciiString& userInfo) Standard_OVERRIDE; - Standard_EXPORT virtual void ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData); + Standard_EXPORT virtual void ReadCompleteInfo (Standard_IStream& theIStream, Handle(Storage_Data)& theData) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndReadInfoSection(); + Standard_EXPORT virtual Storage_Error EndReadInfoSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginWriteCommentSection(); + Standard_EXPORT virtual Storage_Error BeginWriteCommentSection() Standard_OVERRIDE; - Standard_EXPORT virtual void WriteComment (const TColStd_SequenceOfExtendedString& userComments); + Standard_EXPORT virtual void WriteComment (const TColStd_SequenceOfExtendedString& userComments) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndWriteCommentSection(); + Standard_EXPORT virtual Storage_Error EndWriteCommentSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginReadCommentSection(); + Standard_EXPORT virtual Storage_Error BeginReadCommentSection() Standard_OVERRIDE; - Standard_EXPORT virtual void ReadComment (TColStd_SequenceOfExtendedString& userComments); + Standard_EXPORT virtual void ReadComment (TColStd_SequenceOfExtendedString& userComments) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndReadCommentSection(); + Standard_EXPORT virtual Storage_Error EndReadCommentSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginWriteTypeSection(); + Standard_EXPORT virtual Storage_Error BeginWriteTypeSection() Standard_OVERRIDE; - Standard_EXPORT virtual void SetTypeSectionSize (const Standard_Integer aSize); + Standard_EXPORT virtual void SetTypeSectionSize (const Standard_Integer aSize) Standard_OVERRIDE; - Standard_EXPORT virtual void WriteTypeInformations (const Standard_Integer typeNum, const TCollection_AsciiString& typeName); + Standard_EXPORT virtual void WriteTypeInformations (const Standard_Integer typeNum, + const TCollection_AsciiString& typeName) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndWriteTypeSection(); + Standard_EXPORT virtual Storage_Error EndWriteTypeSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginReadTypeSection(); + Standard_EXPORT virtual Storage_Error BeginReadTypeSection() Standard_OVERRIDE; - Standard_EXPORT virtual Standard_Integer TypeSectionSize(); + Standard_EXPORT virtual Standard_Integer TypeSectionSize() Standard_OVERRIDE; - Standard_EXPORT virtual void ReadTypeInformations (Standard_Integer& typeNum, TCollection_AsciiString& typeName); + Standard_EXPORT virtual void ReadTypeInformations (Standard_Integer& typeNum, TCollection_AsciiString& typeName) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndReadTypeSection(); + Standard_EXPORT virtual Storage_Error EndReadTypeSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginWriteRootSection(); + Standard_EXPORT virtual Storage_Error BeginWriteRootSection() Standard_OVERRIDE; - Standard_EXPORT virtual void SetRootSectionSize (const Standard_Integer aSize); + Standard_EXPORT virtual void SetRootSectionSize (const Standard_Integer aSize) Standard_OVERRIDE; - Standard_EXPORT virtual void WriteRoot (const TCollection_AsciiString& rootName, const Standard_Integer aRef, const TCollection_AsciiString& aType); + Standard_EXPORT virtual void WriteRoot (const TCollection_AsciiString& rootName, + const Standard_Integer aRef, + const TCollection_AsciiString& aType) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndWriteRootSection(); + Standard_EXPORT virtual Storage_Error EndWriteRootSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginReadRootSection(); + Standard_EXPORT virtual Storage_Error BeginReadRootSection() Standard_OVERRIDE; - Standard_EXPORT virtual Standard_Integer RootSectionSize(); + Standard_EXPORT virtual Standard_Integer RootSectionSize() Standard_OVERRIDE; - Standard_EXPORT virtual void ReadRoot (TCollection_AsciiString& rootName, Standard_Integer& aRef, TCollection_AsciiString& aType); + Standard_EXPORT virtual void ReadRoot (TCollection_AsciiString& rootName, + Standard_Integer& aRef, + TCollection_AsciiString& aType) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndReadRootSection(); + Standard_EXPORT virtual Storage_Error EndReadRootSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginWriteRefSection(); + Standard_EXPORT virtual Storage_Error BeginWriteRefSection() Standard_OVERRIDE; - Standard_EXPORT virtual void SetRefSectionSize (const Standard_Integer aSize); + Standard_EXPORT virtual void SetRefSectionSize (const Standard_Integer aSize) Standard_OVERRIDE; - Standard_EXPORT virtual void WriteReferenceType (const Standard_Integer reference, const Standard_Integer typeNum); + Standard_EXPORT virtual void WriteReferenceType (const Standard_Integer reference, const Standard_Integer typeNum) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndWriteRefSection(); + Standard_EXPORT virtual Storage_Error EndWriteRefSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginReadRefSection(); + Standard_EXPORT virtual Storage_Error BeginReadRefSection() Standard_OVERRIDE; - Standard_EXPORT virtual Standard_Integer RefSectionSize(); + Standard_EXPORT virtual Standard_Integer RefSectionSize() Standard_OVERRIDE; - Standard_EXPORT virtual void ReadReferenceType (Standard_Integer& reference, Standard_Integer& typeNum); + Standard_EXPORT virtual void ReadReferenceType (Standard_Integer& reference, Standard_Integer& typeNum) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndReadRefSection(); + Standard_EXPORT virtual Storage_Error EndReadRefSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginWriteDataSection(); + Standard_EXPORT virtual Storage_Error BeginWriteDataSection() Standard_OVERRIDE; - Standard_EXPORT virtual void WritePersistentObjectHeader (const Standard_Integer aRef, const Standard_Integer aType); + Standard_EXPORT virtual void WritePersistentObjectHeader (const Standard_Integer aRef, const Standard_Integer aType) Standard_OVERRIDE; - Standard_EXPORT virtual void BeginWritePersistentObjectData(); + Standard_EXPORT virtual void BeginWritePersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT virtual void BeginWriteObjectData(); + Standard_EXPORT virtual void BeginWriteObjectData() Standard_OVERRIDE; - Standard_EXPORT virtual void EndWriteObjectData(); + Standard_EXPORT virtual void EndWriteObjectData() Standard_OVERRIDE; - Standard_EXPORT virtual void EndWritePersistentObjectData(); + Standard_EXPORT virtual void EndWritePersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndWriteDataSection(); + Standard_EXPORT virtual Storage_Error EndWriteDataSection() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error BeginReadDataSection(); + Standard_EXPORT virtual Storage_Error BeginReadDataSection() Standard_OVERRIDE; - Standard_EXPORT virtual void ReadPersistentObjectHeader (Standard_Integer& aRef, Standard_Integer& aType); + Standard_EXPORT virtual void ReadPersistentObjectHeader (Standard_Integer& aRef, Standard_Integer& aType) Standard_OVERRIDE; - Standard_EXPORT virtual void BeginReadPersistentObjectData(); + Standard_EXPORT virtual void BeginReadPersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT virtual void BeginReadObjectData(); + Standard_EXPORT virtual void BeginReadObjectData() Standard_OVERRIDE; - Standard_EXPORT virtual void EndReadObjectData(); + Standard_EXPORT virtual void EndReadObjectData() Standard_OVERRIDE; - Standard_EXPORT virtual void EndReadPersistentObjectData(); + Standard_EXPORT virtual void EndReadPersistentObjectData() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_Error EndReadDataSection(); + Standard_EXPORT virtual Storage_Error EndReadDataSection() Standard_OVERRIDE; - Standard_EXPORT virtual void SkipObject(); + Standard_EXPORT virtual void SkipObject() Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& PutReference (const Standard_Integer aValue); + Standard_EXPORT virtual Storage_BaseDriver& PutReference (const Standard_Integer aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& PutCharacter (const Standard_Character aValue); + Standard_EXPORT virtual Storage_BaseDriver& PutCharacter (const Standard_Character aValue) Standard_OVERRIDE; - Storage_BaseDriver& operator << (const Standard_Character aValue) - { - return PutCharacter(aValue); - } + Standard_EXPORT virtual Storage_BaseDriver& PutExtCharacter(const Standard_ExtCharacter aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& PutExtCharacter (const Standard_ExtCharacter aValue); - Storage_BaseDriver& operator << (const Standard_ExtCharacter aValue) - { - return PutExtCharacter(aValue); - } + Standard_EXPORT virtual Storage_BaseDriver& PutInteger (const Standard_Integer aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& PutInteger (const Standard_Integer aValue); - Storage_BaseDriver& operator << (const Standard_Integer aValue) - { - return PutInteger(aValue); - } + Standard_EXPORT virtual Storage_BaseDriver& PutBoolean (const Standard_Boolean aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& PutBoolean (const Standard_Boolean aValue); - Storage_BaseDriver& operator << (const Standard_Boolean aValue) - { - return PutBoolean(aValue); - } + Standard_EXPORT virtual Storage_BaseDriver& PutReal (const Standard_Real aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& PutReal (const Standard_Real aValue); - Storage_BaseDriver& operator << (const Standard_Real aValue) - { - return PutReal(aValue); - } + Standard_EXPORT virtual Storage_BaseDriver& PutShortReal (const Standard_ShortReal aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& PutShortReal (const Standard_ShortReal aValue); - Storage_BaseDriver& operator << (const Standard_ShortReal aValue) - { - return PutShortReal(aValue); - } + Standard_EXPORT virtual Storage_BaseDriver& GetReference (Standard_Integer& aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& GetReference (Standard_Integer& aValue); + Standard_EXPORT virtual Storage_BaseDriver& GetCharacter (Standard_Character& aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& GetCharacter (Standard_Character& aValue); - Storage_BaseDriver& operator >> (Standard_Character& aValue) - { - return GetCharacter(aValue); - } + Standard_EXPORT virtual Storage_BaseDriver& GetExtCharacter (Standard_ExtCharacter& aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& GetExtCharacter (Standard_ExtCharacter& aValue); - Storage_BaseDriver& operator >> (Standard_ExtCharacter& aValue) - { - return GetExtCharacter(aValue); - } + Standard_EXPORT virtual Storage_BaseDriver& GetInteger (Standard_Integer& aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& GetInteger (Standard_Integer& aValue); - Storage_BaseDriver& operator >> (Standard_Integer& aValue) - { - return GetInteger(aValue); - } + Standard_EXPORT virtual Storage_BaseDriver& GetBoolean (Standard_Boolean& aValue) Standard_OVERRIDE; - Standard_EXPORT virtual Storage_BaseDriver& GetBoolean (Standard_Boolean& aValue); - Storage_BaseDriver& operator >> (Standard_Boolean& aValue) - { - return GetBoolean(aValue); - } - - Standard_EXPORT virtual Storage_BaseDriver& GetReal (Standard_Real& aValue); - Storage_BaseDriver& operator >> (Standard_Real& aValue) - { - return GetReal(aValue); - } - - Standard_EXPORT virtual Storage_BaseDriver& GetShortReal (Standard_ShortReal& aValue); - Storage_BaseDriver& operator >> (Standard_ShortReal& aValue) - { - return GetShortReal(aValue); - } + Standard_EXPORT virtual Storage_BaseDriver& GetReal (Standard_Real& aValue) Standard_OVERRIDE; + Standard_EXPORT virtual Storage_BaseDriver& GetShortReal (Standard_ShortReal& aValue) Standard_OVERRIDE; //! Closes the file driven by this driver. This file was //! opened by the last call to the function Open. //! The function returns Storage_VSOk if the //! closure is correctly done, or any other value of //! the Storage_Error enumeration which specifies the problem encountered. - Standard_EXPORT virtual Storage_Error Close(); + Standard_EXPORT virtual Storage_Error Close() Standard_OVERRIDE; Standard_EXPORT void Destroy(); ~FSD_File() @@ -274,9 +228,7 @@ Standard_EXPORT static Standard_CString MagicNumber(); - - protected: - +protected: //! read from the current position to the end of line. Standard_EXPORT virtual void ReadLine (TCollection_AsciiString& buffer); @@ -300,7 +252,7 @@ Standard_EXPORT virtual Storage_Error FindTag (const Standard_CString aTag); - +protected: FSD_FStream myStream; }; diff -Nru opencascade-7.4.1+dfsg1/src/GccAna/GccAna_Circ2d2TanRad_1.cxx opencascade-7.5.1+dfsg1/src/GccAna/GccAna_Circ2d2TanRad_1.cxx --- opencascade-7.4.1+dfsg1/src/GccAna/GccAna_Circ2d2TanRad_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GccAna/GccAna_Circ2d2TanRad_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -446,7 +446,7 @@ WellDone = Standard_True; NbrSol = 1; TheSame1(1) = 0; - qualifier1(1) = Qualified1.Qualifier();; + qualifier1(1) = Qualified1.Qualifier(); qualifier2(1) = Qualified2.Qualifier(); pnttg1sol(1)=gp_Pnt2d(Cen.XY()+cote*Radius*gp_XY(ydir,-xdir)); pnttg2sol(1)=gp_Pnt2d(Cen.XY()+Radius*gp_XY(ydir,-xdir)); diff -Nru opencascade-7.4.1+dfsg1/src/GccAna/GccAna_Circ2dTanOnRad_3.cxx opencascade-7.5.1+dfsg1/src/GccAna/GccAna_Circ2dTanOnRad_3.cxx --- opencascade-7.4.1+dfsg1/src/GccAna/GccAna_Circ2dTanOnRad_3.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GccAna/GccAna_Circ2dTanOnRad_3.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -97,10 +97,10 @@ else { if (Abs(Radius-R1) < Tol) { if (OnCirc.Distance(center1) < Tol) { - cirsol(NbrSol) = C1; + NbrSol = 1; + cirsol(NbrSol) = C1; // ============== qualifier1(NbrSol) = Qualified1.Qualifier(); - NbrSol = 1; TheSame1(NbrSol) = 1; pntcen3(NbrSol) = center1; parcen3(NbrSol)=ElCLib::Parameter(OnCirc,pntcen3(NbrSol)); @@ -126,10 +126,10 @@ else { if (Abs(Radius-R1) < Tol) { if (OnCirc.Distance(center1) < Tol) { - cirsol(NbrSol) = C1; + NbrSol = 1; + cirsol(NbrSol) = C1; // ============== qualifier1(NbrSol) = Qualified1.Qualifier(); - NbrSol = 1; TheSame1(NbrSol) = 1; pntcen3(NbrSol) = center1; parcen3(NbrSol)=ElCLib::Parameter(OnCirc,pntcen3(NbrSol)); diff -Nru opencascade-7.4.1+dfsg1/src/gce/gce_MakeCone.hxx opencascade-7.5.1+dfsg1/src/gce/gce_MakeCone.hxx --- opencascade-7.4.1+dfsg1/src/gce/gce_MakeCone.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gce/gce_MakeCone.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -85,7 +85,7 @@ //! "NullAngle". Standard_EXPORT gce_MakeCone(const gp_Pnt& P1, const gp_Pnt& P2, const gp_Pnt& P3, const gp_Pnt& P4); - //! Makes a Cone by its axis and and two points. + //! Makes a Cone by its axis and two points. //! The distance between and the axis is the radius //! of the section passing through . //! The distance between and the axis is the radius @@ -98,7 +98,7 @@ //! "ConfusedPoints" Standard_EXPORT gce_MakeCone(const gp_Ax1& Axis, const gp_Pnt& P1, const gp_Pnt& P2); - //! Makes a Cone by its axis and and two points. + //! Makes a Cone by its axis and two points. //! The distance between and the axis is the radius //! of the section passing through //! The distance between and the axis is the radius diff -Nru opencascade-7.4.1+dfsg1/src/GCPnts/GCPnts_QuasiUniformDeflection.cxx opencascade-7.5.1+dfsg1/src/GCPnts/GCPnts_QuasiUniformDeflection.cxx --- opencascade-7.4.1+dfsg1/src/GCPnts/GCPnts_QuasiUniformDeflection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GCPnts/GCPnts_QuasiUniformDeflection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -82,7 +82,9 @@ //======================================================================= GCPnts_QuasiUniformDeflection::GCPnts_QuasiUniformDeflection () -:myDone(Standard_False),myCont(GeomAbs_C1) +: myDone(Standard_False), + myDeflection(0.0), + myCont(GeomAbs_C1) { } diff -Nru opencascade-7.4.1+dfsg1/src/GCPnts/GCPnts_TangentialDeflection.cxx opencascade-7.5.1+dfsg1/src/GCPnts/GCPnts_TangentialDeflection.cxx --- opencascade-7.4.1+dfsg1/src/GCPnts/GCPnts_TangentialDeflection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GCPnts/GCPnts_TangentialDeflection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -103,7 +103,16 @@ //purpose : //======================================================================= -GCPnts_TangentialDeflection::GCPnts_TangentialDeflection () { } +GCPnts_TangentialDeflection::GCPnts_TangentialDeflection () +: angularDeflection(0.0), + curvatureDeflection(0.0), + uTol(0.0), + minNbPnts(0), + myMinLen(0.0), + lastu(0.0), + firstu(0.0) +{ +} //======================================================================= //function : AddPoint diff -Nru opencascade-7.4.1+dfsg1/src/GCPnts/GCPnts_TangentialDeflection.pxx opencascade-7.5.1+dfsg1/src/GCPnts/GCPnts_TangentialDeflection.pxx --- opencascade-7.4.1+dfsg1/src/GCPnts/GCPnts_TangentialDeflection.pxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GCPnts/GCPnts_TangentialDeflection.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -196,10 +196,12 @@ D0 (C, firstu, P); parameters.Append (firstu); points .Append (P); - if (minNbPnts > 2) { + if (minNbPnts > 2) + { Standard_Real Du = (lastu - firstu) / minNbPnts; Standard_Real U = firstu + Du; - for (Standard_Integer i = 2; i <= minNbPnts; i++) { + for (Standard_Integer i = 2; i < minNbPnts; i++) + { D0 (C, U, P); parameters.Append (U); points .Append (P); @@ -571,14 +573,14 @@ //-- On rajoute des points aux milieux des segments si le nombre //-- mini de points n'est pas atteint //-- - Standard_Integer Nbp = points.Length(); - Standard_Integer MinNb= (9*minNbPnts)/10; - //if(MinNb<4) MinNb=4; - - //-- if(Nbp < MinNb) { cout<<"\n*"; } else { cout<<"\n."; } - while(Nbp < MinNb) { - //-- cout<<" \nGCPnts TangentialDeflection : Ajout de Points ("< reversed. - Standard_EXPORT Standard_NODISCARD Handle(Geom_Axis1Placement) Reversed() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Axis1Placement) Reversed() const; //! Assigns V to the unit vector of this axis. Standard_EXPORT void SetDirection (const gp_Dir& V) Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_BezierCurve.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_BezierCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_BezierCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_BezierCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -812,3 +812,24 @@ weights.Nullify(); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_BezierCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_BoundedCurve) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, rational) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, closed) + if (!poles.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, poles->Size()) + if (!weights.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, weights->Size()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, maxderivinv) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, maxderivinvok) +} + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_BezierCurve.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_BezierCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_BezierCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_BezierCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -333,6 +333,9 @@ //! Creates a new object which is a copy of this Bezier curve. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_BezierSurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_BezierSurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_BezierSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_BezierSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1937,3 +1937,23 @@ weights.Nullify(); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_BezierSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_BoundedSurface) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, urational) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vrational) + if (!poles.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, poles->Size()) + if (!weights.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, weights->Size()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, umaxderivinv) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vmaxderivinv) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, maxderivinvok) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_BezierSurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_BezierSurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_BezierSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_BezierSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -583,6 +583,9 @@ //! Creates a new object which is a copy of this Bezier surface. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_BoundedCurve.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_BoundedCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_BoundedCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_BoundedCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,4 +19,15 @@ #include #include -IMPLEMENT_STANDARD_RTTIEXT(Geom_BoundedCurve,Geom_Curve) \ No newline at end of file +IMPLEMENT_STANDARD_RTTIEXT(Geom_BoundedCurve,Geom_Curve) + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_BoundedCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Curve) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_BoundedCurve.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_BoundedCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_BoundedCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_BoundedCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -54,6 +54,9 @@ //! Returns the start point of the curve. Standard_EXPORT virtual gp_Pnt StartPoint() const = 0; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_BSplineCurve.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_BSplineCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_BSplineCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_BSplineCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1120,3 +1120,33 @@ } } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_BSplineCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_BoundedCurve) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, rational) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, periodic) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, knotSet) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, smooth) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, deg) + if (!poles.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, poles->Size()) + + if (!weights.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, weights->Size()) + if (!flatknots.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, flatknots->Size()) + if (!knots.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, knots->Size()) + if (!mults.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mults->Size()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, maxderivinv) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, maxderivinvok) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_BSplineCurve.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_BSplineCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_BSplineCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_BSplineCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -786,6 +786,9 @@ //! Comapare two Bspline curve on identity; Standard_EXPORT Standard_Boolean IsEqual (const Handle(Geom_BSplineCurve)& theOther, const Standard_Real thePreci) const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_BSplineSurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_BSplineSurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_BSplineSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_BSplineSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1272,3 +1272,46 @@ Rational(Weights, urational, vrational); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_BSplineSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_BoundedSurface) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, urational) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vrational) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, uperiodic) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vperiodic) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, uknotSet) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vknotSet) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Usmooth) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Vsmooth) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, udeg) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vdeg) + + if (!poles.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, poles->Size()) + if (!weights.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, weights->Size()) + if (!ufknots.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, ufknots->Size()) + if (!vfknots.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vfknots->Size()) + + if (!uknots.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, uknots->Size()) + if (!vknots.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vknots->Size()) + if (!umults.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, umults->Size()) + if (!vmults.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vmults->Size()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, umaxderivinv) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vmaxderivinv) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, maxderivinvok) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_BSplineSurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_BSplineSurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_BSplineSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_BSplineSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1189,6 +1189,9 @@ //! Creates a new object which is a copy of this BSpline surface. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Circle.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Circle.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Circle.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Circle.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -234,3 +234,16 @@ radius = radius * Abs(T.ScaleFactor()); pos.Transform (T); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_Circle::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Conic) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, radius) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Circle.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Circle.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Circle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Circle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -158,6 +158,9 @@ //! Creates a new object which is a copy of this circle. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_ConicalSurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_ConicalSurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_ConicalSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_ConicalSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -433,3 +432,16 @@ return T2; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_ConicalSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_ElementarySurface) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, radius) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, semiAngle) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_ConicalSurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_ConicalSurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_ConicalSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_ConicalSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -283,6 +283,9 @@ //! Creates a new object which is a copy of this cone. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Conic.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Conic.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Conic.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Conic.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,50 +14,69 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #include -#include -#include -#include -#include -#include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(Geom_Conic,Geom_Curve) -typedef Geom_Conic Conic; -typedef gp_Ax1 Ax1; -typedef gp_Ax2 Ax2; -typedef gp_Pnt Pnt; -typedef gp_Vec Vec; - - - -void Geom_Conic::Reverse () { +//======================================================================= +//function : UReverse +//purpose : +//======================================================================= +void Geom_Conic::Reverse () +{ gp_Dir Vz = pos.Direction (); Vz.Reverse(); pos.SetDirection (Vz); } -void Geom_Conic::SetAxis (const Ax1& A1) { pos.SetAxis (A1); } - -void Geom_Conic::SetLocation (const Pnt& O) { pos.SetLocation (O); } - -void Geom_Conic::SetPosition (const Ax2& A2) { pos = A2; } - -Ax1 Geom_Conic::Axis () const { return pos.Axis(); } - -GeomAbs_Shape Geom_Conic::Continuity () const { return GeomAbs_CN; } - -Pnt Geom_Conic::Location () const { return pos.Location(); } - -const gp_Ax2& Geom_Conic::Position () const { return pos; } +//======================================================================= +//function : UReverse +//purpose : +//======================================================================= + +GeomAbs_Shape Geom_Conic::Continuity () const +{ + return GeomAbs_CN; +} -Ax1 Geom_Conic::XAxis () const {return Ax1(pos.Location(), pos.XDirection());} +//======================================================================= +//function : UReverse +//purpose : +//======================================================================= + +gp_Ax1 Geom_Conic::XAxis () const +{ + return gp_Ax1 (pos.Location(), pos.XDirection()); +} -Ax1 Geom_Conic::YAxis () const {return Ax1(pos.Location(), pos.YDirection());} +//======================================================================= +//function : UReverse +//purpose : +//======================================================================= + +gp_Ax1 Geom_Conic::YAxis () const +{ + return gp_Ax1 (pos.Location(), pos.YDirection()); +} -Standard_Boolean Geom_Conic::IsCN (const Standard_Integer ) const { return Standard_True; } +//======================================================================= +//function : UReverse +//purpose : +//======================================================================= + +Standard_Boolean Geom_Conic::IsCN (const Standard_Integer ) const +{ + return Standard_True; +} +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_Conic::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Curve) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &pos) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Conic.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Conic.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Conic.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Conic.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,22 +17,8 @@ #ifndef _Geom_Conic_HeaderFile #define _Geom_Conic_HeaderFile -#include -#include - #include #include -#include -#include -#include -#include -class Standard_ConstructionError; -class Standard_RangeError; -class Standard_DomainError; -class gp_Ax1; -class gp_Pnt; -class gp_Ax2; - class Geom_Conic; DEFINE_STANDARD_HANDLE(Geom_Conic, Geom_Curve) @@ -62,51 +48,45 @@ //! also defines the origin of the parameter of the conic. class Geom_Conic : public Geom_Curve { - public: - //! Changes the orientation of the conic's plane. The normal //! axis to the plane is A1. The XAxis and the YAxis are recomputed. //! //! raised if the A1 is parallel to the XAxis of the conic. - Standard_EXPORT void SetAxis (const gp_Ax1& A1); + void SetAxis (const gp_Ax1& theA1) { pos.SetAxis(theA1); } //! changes the location point of the conic. - Standard_EXPORT void SetLocation (const gp_Pnt& P); + void SetLocation (const gp_Pnt& theP) { pos.SetLocation(theP); } //! changes the local coordinate system of the conic. - Standard_EXPORT void SetPosition (const gp_Ax2& A2); + void SetPosition (const gp_Ax2& theA2) { pos = theA2; } //! Returns the "main Axis" of this conic. This axis is //! normal to the plane of the conic. - Standard_EXPORT gp_Ax1 Axis() const; - - - //! Returns the eccentricity value of the conic e. - //! e = 0 for a circle - //! 0 < e < 1 for an ellipse (e = 0 if MajorRadius = MinorRadius) - //! e > 1 for a hyperbola - //! e = 1 for a parabola - //! Exceptions - //! Standard_DomainError in the case of a hyperbola if - //! its major radius is null. - Standard_EXPORT virtual Standard_Real Eccentricity() const = 0; - + const gp_Ax1& Axis() const { return pos.Axis(); } //! Returns the location point of the conic. //! For the circle, the ellipse and the hyperbola it is the center of //! the conic. For the parabola it is the Apex of the parabola. - Standard_EXPORT gp_Pnt Location() const; + const gp_Pnt& Location() const { return pos.Location(); } - //! Returns the local coordinates system of the conic. //! The main direction of the Axis2Placement is normal to the //! plane of the conic. The X direction of the Axis2placement //! is in the plane of the conic and corresponds to the origin //! for the conic's parametric value u. - Standard_EXPORT const gp_Ax2& Position() const; + const gp_Ax2& Position() const { return pos; } + //! Returns the eccentricity value of the conic e. + //! e = 0 for a circle + //! 0 < e < 1 for an ellipse (e = 0 if MajorRadius = MinorRadius) + //! e > 1 for a hyperbola + //! e = 1 for a parabola + //! Exceptions + //! Standard_DomainError in the case of a hyperbola if + //! its major radius is null. + virtual Standard_Real Eccentricity() const = 0; //! Returns the XAxis of the conic. //! This axis defines the origin of parametrization of the conic. @@ -136,28 +116,13 @@ //! Raised if N < 0. Standard_EXPORT Standard_Boolean IsCN (const Standard_Integer N) const Standard_OVERRIDE; - - + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; DEFINE_STANDARD_RTTIEXT(Geom_Conic,Geom_Curve) protected: - - gp_Ax2 pos; - - -private: - - - - }; - - - - - - #endif // _Geom_Conic_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Curve.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Curve.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Curve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Curve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -88,4 +88,14 @@ return 1.; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_Curve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Geometry) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Curve.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Curve.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Curve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Curve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -117,7 +117,7 @@ Standard_EXPORT virtual Standard_Real ParametricTransformation (const gp_Trsf& T) const; //! Returns a copy of reversed. - Standard_EXPORT Standard_NODISCARD Handle(Geom_Curve) Reversed() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Curve) Reversed() const; //! Returns the value of the first parameter. //! Warnings : @@ -225,6 +225,9 @@ //! derivative on the basis curve and the offset direction are parallel. Standard_EXPORT gp_Pnt Value (const Standard_Real U) const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_CylindricalSurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_CylindricalSurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_CylindricalSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_CylindricalSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -374,3 +373,16 @@ T2.SetAffinity(Axis, Abs(T.ScaleFactor())); return T2; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_CylindricalSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_ElementarySurface) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, radius) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_CylindricalSurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_CylindricalSurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_CylindricalSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_CylindricalSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -212,6 +212,9 @@ //! Creates a new object which is a copy of this cylinder. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_ElementarySurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_ElementarySurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_ElementarySurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_ElementarySurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,31 +14,17 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #include -#include -#include -#include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(Geom_ElementarySurface,Geom_Surface) -typedef Geom_ElementarySurface ElementarySurface; -typedef gp_Ax1 Ax1; -typedef gp_Ax2 Ax2; -typedef gp_Ax3 Ax3; -typedef gp_Dir Dir; -typedef gp_Pnt Pnt; -typedef gp_Vec Vec; - //======================================================================= //function : Continuity //purpose : //======================================================================= -GeomAbs_Shape Geom_ElementarySurface::Continuity () const { - +GeomAbs_Shape Geom_ElementarySurface::Continuity () const +{ return GeomAbs_CN; } @@ -47,8 +33,8 @@ //purpose : //======================================================================= -Standard_Boolean Geom_ElementarySurface::IsCNu (const Standard_Integer ) const { - +Standard_Boolean Geom_ElementarySurface::IsCNu (const Standard_Integer ) const +{ return Standard_True; } @@ -57,92 +43,40 @@ //purpose : //======================================================================= -Standard_Boolean Geom_ElementarySurface::IsCNv (const Standard_Integer ) const { - +Standard_Boolean Geom_ElementarySurface::IsCNv (const Standard_Integer ) const +{ return Standard_True; } //======================================================================= -//function : Axis -//purpose : -//======================================================================= - -Ax1 Geom_ElementarySurface::Axis () const { - - return pos.Axis(); -} - -//======================================================================= -//function : SetAxis -//purpose : -//======================================================================= - -void Geom_ElementarySurface::SetAxis (const Ax1& A1) { - - pos.SetAxis (A1); -} - -//======================================================================= -//function : Location -//purpose : -//======================================================================= - -Pnt Geom_ElementarySurface::Location () const { - - return pos.Location(); -} - -//======================================================================= -//function : Position -//purpose : -//======================================================================= - -const gp_Ax3& Geom_ElementarySurface::Position () const { - - return pos; -} - -//======================================================================= -//function : SetPosition -//purpose : -//======================================================================= - -void Geom_ElementarySurface::SetPosition (const Ax3& A3) { - - pos = A3; -} - -//======================================================================= -//function : SetLocation -//purpose : -//======================================================================= - -void Geom_ElementarySurface::SetLocation (const Pnt& Loc) { - - pos.SetLocation (Loc); -} - - -//======================================================================= //function : UReverse //purpose : //======================================================================= -void Geom_ElementarySurface::UReverse () { - +void Geom_ElementarySurface::UReverse () +{ pos.YReverse(); } - - //======================================================================= //function : VReverse //purpose : //======================================================================= -void Geom_ElementarySurface::VReverse () { - +void Geom_ElementarySurface::VReverse () +{ pos.ZReverse(); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_ElementarySurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Surface) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &pos) +} \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_ElementarySurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_ElementarySurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_ElementarySurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_ElementarySurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,20 +17,8 @@ #ifndef _Geom_ElementarySurface_HeaderFile #define _Geom_ElementarySurface_HeaderFile -#include -#include - #include #include -#include -#include -#include -#include -class Standard_ConstructionError; -class gp_Ax1; -class gp_Pnt; -class gp_Ax3; - class Geom_ElementarySurface; DEFINE_STANDARD_HANDLE(Geom_ElementarySurface, Geom_Surface) @@ -74,38 +62,30 @@ //! "main Direction" = - "X Direction" ^ "Y Direction" class Geom_ElementarySurface : public Geom_Surface { - public: - - //! Changes the main axis (ZAxis) of the elementary surface. //! //! Raised if the direction of A1 is parallel to the XAxis of the //! coordinate system of the surface. - Standard_EXPORT void SetAxis (const gp_Ax1& A1); - + void SetAxis (const gp_Ax1& theA1) { pos.SetAxis(theA1); } //! Changes the location of the local coordinates system of the //! surface. - Standard_EXPORT void SetLocation (const gp_Pnt& Loc); - + void SetLocation (const gp_Pnt& theLoc) { pos.SetLocation(theLoc); } //! Changes the local coordinates system of the surface. - Standard_EXPORT void SetPosition (const gp_Ax3& A3); + void SetPosition (const gp_Ax3& theAx3) { pos = theAx3; } - //! Returns the main axis of the surface (ZAxis). - Standard_EXPORT gp_Ax1 Axis() const; - + const gp_Ax1& Axis() const { return pos.Axis(); } //! Returns the location point of the local coordinate system of the //! surface. - Standard_EXPORT gp_Pnt Location() const; + const gp_Pnt& Location() const { return pos.Location(); } //! Returns the local coordinates system of the surface. - Standard_EXPORT const gp_Ax3& Position() const; - + const gp_Ax3& Position() const { return pos; } //! Reverses the U parametric direction of the surface. Standard_EXPORT virtual void UReverse() Standard_OVERRIDE; @@ -116,8 +96,7 @@ //! me->UReversed()->Value(me->UReversedParameter(U),V) //! is the same point as //! me->Value(U,V) - Standard_EXPORT virtual Standard_Real UReversedParameter (const Standard_Real U) const Standard_OVERRIDE = 0; - + Standard_EXPORT virtual Standard_Real UReversedParameter (const Standard_Real U) const Standard_OVERRIDE = 0; //! Reverses the V parametric direction of the surface. Standard_EXPORT virtual void VReverse() Standard_OVERRIDE; @@ -139,28 +118,13 @@ //! Returns True. Standard_EXPORT Standard_Boolean IsCNv (const Standard_Integer N) const Standard_OVERRIDE; - - + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; DEFINE_STANDARD_RTTIEXT(Geom_ElementarySurface,Geom_Surface) protected: - - gp_Ax3 pos; - - -private: - - - - }; - - - - - - #endif // _Geom_ElementarySurface_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Ellipse.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Ellipse.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Ellipse.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Ellipse.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -343,3 +343,17 @@ minorRadius = minorRadius * Abs(T.ScaleFactor()); pos.Transform(T); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_Ellipse::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Conic) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, majorRadius) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, minorRadius) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Ellipse.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Ellipse.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Ellipse.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Ellipse.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -220,6 +220,9 @@ //! Creates a new object which is a copy of this ellipse. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Geometry.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Geometry.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Geometry.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Geometry.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -165,3 +165,7 @@ } +void Geom_Geometry::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Geometry.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Geometry.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Geometry.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Geometry.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -99,25 +99,28 @@ //! (see class Transformation of the package Geom). Standard_EXPORT virtual void Transform (const gp_Trsf& T) = 0; - Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Geometry) Mirrored (const gp_Pnt& P) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Geometry) Mirrored (const gp_Ax1& A1) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Geometry) Mirrored (const gp_Ax2& A2) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Rotated (const gp_Ax1& A1, const Standard_Real Ang) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Geometry) Rotated (const gp_Ax1& A1, const Standard_Real Ang) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Scaled (const gp_Pnt& P, const Standard_Real S) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Geometry) Scaled (const gp_Pnt& P, const Standard_Real S) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Transformed (const gp_Trsf& T) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Geometry) Transformed (const gp_Trsf& T) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Translated (const gp_Vec& V) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Geometry) Translated (const gp_Vec& V) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom_Geometry) Translated (const gp_Pnt& P1, const gp_Pnt& P2) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Geometry) Translated (const gp_Pnt& P1, const gp_Pnt& P2) const; //! Creates a new object which is a copy of this geometric object. Standard_EXPORT virtual Handle(Geom_Geometry) Copy() const = 0; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Hyperbola.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Hyperbola.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Hyperbola.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Hyperbola.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -388,3 +388,17 @@ minorRadius = minorRadius * Abs(T.ScaleFactor()); pos.Transform(T); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_Hyperbola::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Conic) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, majorRadius) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, minorRadius) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Hyperbola.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Hyperbola.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Hyperbola.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Hyperbola.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -276,6 +276,9 @@ //! Creates a new object which is a copy of this hyperbola. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Line.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Line.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Line.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Line.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -251,4 +251,15 @@ return Abs(T.ScaleFactor()); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_Line::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Curve) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &pos) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Line.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Line.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Line.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Line.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -179,6 +179,9 @@ //! Creates a new object which is a copy of this line. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_OffsetCurve.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_OffsetCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_OffsetCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_OffsetCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -444,3 +444,20 @@ { return myBasisCurveContinuity; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_OffsetCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Curve) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, basisCurve.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &direction) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, offsetValue) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBasisCurveContinuity) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_OffsetCurve.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_OffsetCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_OffsetCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_OffsetCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -281,6 +281,9 @@ //! Returns continuity of the basis curve. Standard_EXPORT GeomAbs_Shape GetBasisCurveContinuity() const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_OffsetSurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_OffsetSurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_OffsetSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_OffsetSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -966,3 +966,21 @@ { return !myOscSurf.IsNull() && myOscSurf->VOscSurf(U, V, t, L); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_OffsetSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Surface) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, basisSurf.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, equivSurf.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, offsetValue) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myOscSurf.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBasisSurfContinuity) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_OffsetSurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_OffsetSurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_OffsetSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_OffsetSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -357,6 +357,9 @@ inline GeomAbs_Shape GetBasisSurfContinuity() const { return myBasisSurfContinuity; } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + DEFINE_STANDARD_RTTIEXT(Geom_OffsetSurface,Geom_Surface) private: diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_OsculatingSurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_OsculatingSurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_OsculatingSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_OsculatingSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,7 +37,8 @@ //purpose : //======================================================================= Geom_OsculatingSurface::Geom_OsculatingSurface() - : myAlong(1,4) +: myTol(0.0), + myAlong(1,4) { myAlong.Init(Standard_False); } @@ -446,7 +447,6 @@ const Handle(Geom_BSplineSurface)& BS, Handle(Geom_BSplineSurface)& BSpl) const { - Standard_Integer i, j; Standard_Boolean OsculSurf=Standard_True; #ifdef OCCT_DEBUG std::cout<<"t = "<ChangeValue(i) = i-1; PolynomialVIntervals->ChangeValue(i) = i-1; @@ -560,8 +560,6 @@ VLocalIndex = 0; ULocalIndex = 0; - for(j = 1; j <= SVKnot; j++) VLocalIndex += BS->VMultiplicity(j); - for(i = 1; i <= SUKnot; i++) ULocalIndex += BS->UMultiplicity(i); ucacheparameter = BS->UKnot(SUKnot); vcacheparameter = BS->VKnot(SVKnot); vspanlength = BS->VKnot(SVKnot + 1) - BS->VKnot(SVKnot); @@ -799,5 +797,23 @@ } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_OsculatingSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myBasisSurf.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTol) + if (!myOsculSurf1.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myOsculSurf1->Size()) + if (!myOsculSurf2.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myOsculSurf2->Size()) + if (!myKdeg.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myKdeg->Size()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAlong.Size()) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_OsculatingSurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_OsculatingSurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_OsculatingSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_OsculatingSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,6 +65,9 @@ //! along V at the point U,V. Standard_EXPORT Standard_Boolean VOscSurf (const Standard_Real U, const Standard_Real V, Standard_Boolean& t, Handle(Geom_BSplineSurface)& L) const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + DEFINE_STANDARD_RTTIEXT(Geom_OsculatingSurface,Standard_Transient) diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Parabola.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Parabola.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Parabola.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Parabola.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -306,4 +306,15 @@ return Abs(T.ScaleFactor()); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_Parabola::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Conic) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, focalLength) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Parabola.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Parabola.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Parabola.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Parabola.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -223,6 +223,9 @@ //! Creates a new object which is a copy of this parabola. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Plane.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Plane.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Plane.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Plane.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -381,3 +380,14 @@ T2.SetScale(gp::Origin2d(), Abs(T.ScaleFactor())); return gp_GTrsf2d(T2); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_Plane::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_ElementarySurface) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Plane.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Plane.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Plane.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Plane.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -218,6 +218,9 @@ //! Creates a new object which is a copy of this plane. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_RectangularTrimmedSurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_RectangularTrimmedSurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_RectangularTrimmedSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_RectangularTrimmedSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -118,7 +118,7 @@ { Handle(Geom_RectangularTrimmedSurface) S2 = new Geom_RectangularTrimmedSurface( O->BasisSurface(),U1,U2, V1, V2, USense, VSense); - basisSurf = new Geom_OffsetSurface(S2, O->Offset()); + basisSurf = new Geom_OffsetSurface(S2, O->Offset(), Standard_True); } SetTrim( U1, U2, V1, V2, USense, VSense); @@ -153,7 +153,7 @@ { Handle(Geom_RectangularTrimmedSurface) S2 = new Geom_RectangularTrimmedSurface( O->BasisSurface(),Param1,Param2, UTrim, Sense); - basisSurf = new Geom_OffsetSurface(S2, O->Offset()); + basisSurf = new Geom_OffsetSurface(S2, O->Offset(), Standard_True); } SetTrim(Param1, Param2, UTrim, Sense); @@ -653,3 +653,22 @@ return basisSurf->ParametricTransformation(T); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_RectangularTrimmedSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_BoundedSurface) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, basisSurf.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, utrim1) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vtrim1) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, utrim2) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, vtrim2) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, isutrimmed) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, isvtrimmed) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_RectangularTrimmedSurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_RectangularTrimmedSurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_RectangularTrimmedSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_RectangularTrimmedSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -305,6 +305,9 @@ //! Creates a new object which is a copy of this patch. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_SphericalSurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_SphericalSurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_SphericalSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_SphericalSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -360,3 +360,16 @@ radius = radius * Abs(T.ScaleFactor()); pos.Transform (T); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_SphericalSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_ElementarySurface) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, radius) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_SphericalSurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_SphericalSurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_SphericalSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_SphericalSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -221,6 +221,9 @@ //! Creates a new object which is a copy of this sphere. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Surface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Surface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Surface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Surface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -122,3 +122,14 @@ D0(U,V,P); return P; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_Surface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Geometry) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Surface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Surface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Surface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Surface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,24 +17,13 @@ #ifndef _Geom_Surface_HeaderFile #define _Geom_Surface_HeaderFile -#include -#include - #include -#include -#include -#include -#include -class Standard_RangeError; -class Standard_NoSuchObject; -class Geom_UndefinedDerivative; -class Geom_UndefinedValue; + class gp_Trsf; class gp_GTrsf2d; class gp_Pnt; class gp_Vec; - class Geom_Surface; DEFINE_STANDARD_HANDLE(Geom_Surface, Geom_Geometry) @@ -79,7 +68,7 @@ //! Reverses the U direction of parametrization of . //! The bounds of the surface are not modified. //! A copy of is returned. - Standard_EXPORT Standard_NODISCARD Handle(Geom_Surface) UReversed() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Surface) UReversed() const; //! Returns the parameter on the Ureversed surface for //! the point of parameter U on . @@ -100,7 +89,7 @@ //! Reverses the V direction of parametrization of . //! The bounds of the surface are not modified. //! A copy of is returned. - Standard_EXPORT Standard_NODISCARD Handle(Geom_Surface) VReversed() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Surface) VReversed() const; //! Returns the parameter on the Vreversed surface for //! the point of parameter V on . @@ -276,6 +265,9 @@ //! compute the current point. Standard_EXPORT gp_Pnt Value (const Standard_Real U, const Standard_Real V) const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_SurfaceOfLinearExtrusion.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_SurfaceOfLinearExtrusion.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_SurfaceOfLinearExtrusion.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_SurfaceOfLinearExtrusion.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -391,3 +391,14 @@ return TU * TV; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_SurfaceOfLinearExtrusion::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_SweptSurface) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_SurfaceOfLinearExtrusion.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_SurfaceOfLinearExtrusion.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_SurfaceOfLinearExtrusion.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_SurfaceOfLinearExtrusion.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -249,6 +249,9 @@ //! Creates a new object which is a copy of this surface of linear extrusion. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_SurfaceOfRevolution.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_SurfaceOfRevolution.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_SurfaceOfRevolution.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_SurfaceOfRevolution.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -457,3 +457,14 @@ return T2; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_SurfaceOfRevolution::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_SweptSurface) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &loc) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_SurfaceOfRevolution.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_SurfaceOfRevolution.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_SurfaceOfRevolution.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_SurfaceOfRevolution.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -303,6 +303,9 @@ //! Creates a new object which is a copy of this surface of revolution. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + DEFINE_STANDARD_RTTIEXT(Geom_SurfaceOfRevolution,Geom_SweptSurface) diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_SweptSurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_SweptSurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_SweptSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_SweptSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,3 +44,18 @@ { return basisCurve; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_SweptSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Surface) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, basisCurve.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &direction) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, smooth) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_SweptSurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_SweptSurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_SweptSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_SweptSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,6 +65,9 @@ //! for a surface of linear extrusion it is the extruded curve. Standard_EXPORT Handle(Geom_Curve) BasisCurve() const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_ToroidalSurface.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_ToroidalSurface.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_ToroidalSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_ToroidalSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -397,3 +396,17 @@ minorRadius = minorRadius * Abs(T.ScaleFactor()); pos.Transform (T); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_ToroidalSurface::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_ElementarySurface) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, majorRadius) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, minorRadius) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_ToroidalSurface.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_ToroidalSurface.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_ToroidalSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_ToroidalSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -245,6 +245,9 @@ //! Creates a new object which is a copy of this torus. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Transformation.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Transformation.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Transformation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Transformation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,8 @@ #include +#include + IMPLEMENT_STANDARD_RTTIEXT(Geom_Transformation, Standard_Transient) Geom_Transformation::Geom_Transformation () { } @@ -56,3 +58,8 @@ gpTrsf.PreMultiply (Other->Trsf()); } + +void Geom_Transformation::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &gpTrsf) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Transformation.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Transformation.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Transformation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Transformation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -160,12 +160,12 @@ //! Raised if the the transformation is singular. This means that //! the ScaleFactor is lower or equal to Resolution from //! package gp. - Standard_EXPORT Standard_NODISCARD Handle(Geom_Transformation) Inverted() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Transformation) Inverted() const; //! Computes the transformation composed with Other and . //! * Other. //! Returns a new transformation - Standard_EXPORT Standard_NODISCARD Handle(Geom_Transformation) Multiplied (const Handle(Geom_Transformation)& Other) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Transformation) Multiplied (const Handle(Geom_Transformation)& Other) const; //! Computes the transformation composed with Other and . //! = * Other. @@ -192,6 +192,9 @@ //! Creates a new object which is a copy of this transformation. Standard_EXPORT Handle(Geom_Transformation) Copy() const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + private: gp_Trsf gpTrsf; diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_TrimmedCurve.cxx opencascade-7.5.1+dfsg1/src/Geom/Geom_TrimmedCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_TrimmedCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_TrimmedCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -368,3 +368,18 @@ return basisCurve->ParametricTransformation(T); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom_TrimmedCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_BoundedCurve) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, basisCurve.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, uTrim1) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, uTrim2) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_TrimmedCurve.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_TrimmedCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_TrimmedCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_TrimmedCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -252,6 +252,9 @@ //! Creates a new object which is a copy of this trimmed curve. Standard_EXPORT Handle(Geom_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_Vector.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_Vector.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_Vector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_Vector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,7 +47,7 @@ //! Returns a copy of reversed. - Standard_EXPORT Standard_NODISCARD Handle(Geom_Vector) Reversed() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_Vector) Reversed() const; //! Computes the angular value, in radians, between this //! vector and vector Other. The result is a value between 0 and Pi. diff -Nru opencascade-7.4.1+dfsg1/src/Geom/Geom_VectorWithMagnitude.hxx opencascade-7.5.1+dfsg1/src/Geom/Geom_VectorWithMagnitude.hxx --- opencascade-7.4.1+dfsg1/src/Geom/Geom_VectorWithMagnitude.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom/Geom_VectorWithMagnitude.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -80,7 +80,7 @@ //! Adds the vector Other to . - Standard_EXPORT Standard_NODISCARD Handle(Geom_VectorWithMagnitude) Added (const Handle(Geom_Vector)& Other) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_VectorWithMagnitude) Added (const Handle(Geom_Vector)& Other) const; //! Computes the cross product between and Other @@ -106,12 +106,12 @@ //! Divides by a scalar. A new vector is returned. - Standard_EXPORT Standard_NODISCARD Handle(Geom_VectorWithMagnitude) Divided (const Standard_Real Scalar) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_VectorWithMagnitude) Divided (const Standard_Real Scalar) const; //! Computes the product of the vector by a scalar. //! A new vector is returned. - Standard_EXPORT Standard_NODISCARD Handle(Geom_VectorWithMagnitude) Multiplied (const Standard_Real Scalar) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_VectorWithMagnitude) Multiplied (const Standard_Real Scalar) const; //! Computes the product of the vector by a scalar. @@ -127,14 +127,14 @@ //! //! Raised if the magnitude of the vector is lower or equal to //! Resolution from package gp. - Standard_EXPORT Standard_NODISCARD Handle(Geom_VectorWithMagnitude) Normalized() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom_VectorWithMagnitude) Normalized() const; //! Subtracts the Vector Other to . Standard_EXPORT void Subtract (const Handle(Geom_Vector)& Other); //! Subtracts the vector Other to . A new vector is returned. - Standard_EXPORT Standard_NODISCARD + Standard_NODISCARD Standard_EXPORT Handle(Geom_VectorWithMagnitude) Subtracted (const Handle(Geom_Vector)& Other) const; //! Applies the transformation T to this vector. diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_AxisPlacement.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_AxisPlacement.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_AxisPlacement.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_AxisPlacement.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -64,7 +64,7 @@ //! Note: //! - Reverse assigns the result to this axis, while //! - Reversed creates a new one. - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_AxisPlacement) Reversed() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_AxisPlacement) Reversed() const; //! Changes the complete definition of the axis placement. Standard_EXPORT void SetAxis (const gp_Ax2d& A); diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BezierCurve.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BezierCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BezierCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BezierCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -822,3 +822,23 @@ weights.Nullify(); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_BezierCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_BoundedCurve) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, rational) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, closed) + if (!poles.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, poles->Size()) + if (!weights.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, weights->Size()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, maxderivinv) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, maxderivinvok) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BezierCurve.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BezierCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BezierCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BezierCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -320,6 +320,9 @@ //! Creates a new object which is a copy of this Bezier curve. Standard_EXPORT Handle(Geom2d_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BoundedCurve.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BoundedCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BoundedCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BoundedCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,4 +19,15 @@ #include #include -IMPLEMENT_STANDARD_RTTIEXT(Geom2d_BoundedCurve,Geom2d_Curve) \ No newline at end of file +IMPLEMENT_STANDARD_RTTIEXT(Geom2d_BoundedCurve,Geom2d_Curve) + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_BoundedCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Curve) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BoundedCurve.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BoundedCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BoundedCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BoundedCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -61,6 +61,9 @@ //! "FirstParameter" of the curve. Standard_EXPORT virtual gp_Pnt2d StartPoint() const = 0; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BSplineCurve.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BSplineCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BSplineCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BSplineCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1238,3 +1238,33 @@ } } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_BSplineCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_BoundedCurve) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, rational) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, periodic) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, knotSet) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, smooth) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, deg) + if (!poles.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, poles->Size()) + + if (!weights.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, weights->Size()) + if (!flatknots.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, flatknots->Size()) + if (!knots.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, knots->Size()) + if (!mults.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mults->Size()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, maxderivinv) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, maxderivinvok) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BSplineCurve.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BSplineCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_BSplineCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_BSplineCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -817,6 +817,9 @@ //! Creates a new object which is a copy of this BSpline curve. Standard_EXPORT Handle(Geom2d_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_CartesianPoint.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_CartesianPoint.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_CartesianPoint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_CartesianPoint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -72,3 +72,11 @@ gpPnt2d.Transform (T); } + +void Geom2d_CartesianPoint::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Point) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &gpPnt2d) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_CartesianPoint.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_CartesianPoint.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_CartesianPoint.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_CartesianPoint.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -76,6 +76,9 @@ Standard_EXPORT Handle(Geom2d_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Circle.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Circle.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Circle.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Circle.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -263,3 +263,15 @@ radius = radius * Abs(T.ScaleFactor()); pos.Transform (T); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_Circle::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Conic) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, radius) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Circle.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Circle.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Circle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Circle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -155,6 +155,9 @@ //! Creates a new object which is a copy of this circle. Standard_EXPORT Handle(Geom2d_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Conic.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Conic.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Conic.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Conic.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,71 +14,16 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #include -#include -#include -#include -#include -#include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(Geom2d_Conic,Geom2d_Curve) -typedef Geom2d_Conic Conic; - -typedef gp_Ax2d Ax2d; -typedef gp_Dir2d Dir2d; -typedef gp_Pnt2d Pnt2d; -typedef gp_Vec2d Vec2d; - -//======================================================================= -//function : SetAxis -//purpose : -//======================================================================= - -void Geom2d_Conic::SetAxis(const gp_Ax22d& A) -{ - pos.SetAxis(A); -} - -//======================================================================= -//function : SetXAxis -//purpose : -//======================================================================= - -void Geom2d_Conic::SetXAxis (const Ax2d& A) -{ - pos.SetXAxis(A); -} - -//======================================================================= -//function : SetYAxis -//purpose : -//======================================================================= - -void Geom2d_Conic::SetYAxis (const Ax2d& A) -{ - pos.SetYAxis(A); -} - -//======================================================================= -//function : SetLocation -//purpose : -//======================================================================= - -void Geom2d_Conic::SetLocation (const Pnt2d& P) -{ - pos.SetLocation (P); -} - //======================================================================= //function : XAxis //purpose : //======================================================================= -Ax2d Geom2d_Conic::XAxis () const +gp_Ax2d Geom2d_Conic::XAxis () const { return gp_Ax2d(pos.Location(), pos.XDirection()); } @@ -88,40 +33,19 @@ //purpose : //======================================================================= -Ax2d Geom2d_Conic::YAxis () const +gp_Ax2d Geom2d_Conic::YAxis () const { return gp_Ax2d(pos.Location(), pos.YDirection()); } //======================================================================= -//function : Location -//purpose : -//======================================================================= - -Pnt2d Geom2d_Conic::Location () const -{ - return pos.Location(); -} - -//======================================================================= -//function : Position -//purpose : -//======================================================================= - -const gp_Ax22d& Geom2d_Conic::Position () const -{ - return pos; -} - - -//======================================================================= //function : Reverse //purpose : //======================================================================= -void Geom2d_Conic::Reverse () { - - Dir2d Temp = pos.YDirection (); +void Geom2d_Conic::Reverse () +{ + gp_Dir2d Temp = pos.YDirection (); Temp.Reverse (); pos.SetAxis(gp_Ax22d(pos.Location(), pos.XDirection(), Temp)); } @@ -145,3 +69,16 @@ { return Standard_True; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_Conic::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Curve) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &pos) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Conic.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Conic.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Conic.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Conic.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,21 +17,8 @@ #ifndef _Geom2d_Conic_HeaderFile #define _Geom2d_Conic_HeaderFile -#include -#include - #include #include -#include -#include -#include -#include -class Standard_ConstructionError; -class Standard_DomainError; -class gp_Ax22d; -class gp_Ax2d; -class gp_Pnt2d; - class Geom2d_Conic; DEFINE_STANDARD_HANDLE(Geom2d_Conic, Geom2d_Curve) @@ -53,30 +40,31 @@ //! the parameter of the conic. class Geom2d_Conic : public Geom2d_Curve { - public: - //! Modifies this conic, redefining its local coordinate system - //! partially, by assigning P as its origin - Standard_EXPORT void SetAxis (const gp_Ax22d& A); + //! partially, by assigning theA as its axis + void SetAxis (const gp_Ax22d& theA) { pos.SetAxis(theA); } - Standard_EXPORT void SetXAxis (const gp_Ax2d& A); + //! Assigns the origin and unit vector of axis theA to the + //! origin of the local coordinate system of this conic and X Direction. + //! The other unit vector of the local coordinate system + //! of this conic is recomputed normal to theA, without + //! changing the orientation of the local coordinate + //! system (right-handed or left-handed). + void SetXAxis (const gp_Ax2d& theAX) { pos.SetXAxis(theAX); } - //! Assigns the origin and unit vector of axis A to the - //! origin of the local coordinate system of this conic and either: - //! - its "X Direction", or - //! - its "Y Direction". + //! Assigns the origin and unit vector of axis theA to the + //! origin of the local coordinate system of this conic and Y Direction. //! The other unit vector of the local coordinate system - //! of this conic is recomputed normal to A, without + //! of this conic is recomputed normal to theA, without //! changing the orientation of the local coordinate //! system (right-handed or left-handed). - Standard_EXPORT void SetYAxis (const gp_Ax2d& A); + void SetYAxis (const gp_Ax2d& theAY) { pos.SetXAxis(theAY); } //! Modifies this conic, redefining its local coordinate - //! system fully, by assigning A as this coordinate system. - Standard_EXPORT void SetLocation (const gp_Pnt2d& P); - + //! system partially, by assigning theP as its origin. + void SetLocation (const gp_Pnt2d& theP) { pos.SetLocation(theP); } //! Returns the "XAxis" of the conic. //! This axis defines the origin of parametrization of the conic. @@ -102,12 +90,10 @@ //! Returns the location point of the conic. //! For the circle, the ellipse and the hyperbola it is the center of //! the conic. For the parabola it is the vertex of the parabola. - Standard_EXPORT gp_Pnt2d Location() const; + const gp_Pnt2d& Location() const { return pos.Location(); } - //! Returns the local coordinates system of the conic. - Standard_EXPORT const gp_Ax22d& Position() const; - + const gp_Ax22d& Position() const { return pos; } //! Reverses the direction of parameterization of . //! The local coordinate system of the conic is modified. @@ -120,32 +106,16 @@ //! Returns GeomAbs_CN which is the global continuity of any conic. Standard_EXPORT GeomAbs_Shape Continuity() const Standard_OVERRIDE; - //! Returns True, the order of continuity of a conic is infinite. Standard_EXPORT Standard_Boolean IsCN (const Standard_Integer N) const Standard_OVERRIDE; - - + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; DEFINE_STANDARD_RTTIEXT(Geom2d_Conic,Geom2d_Curve) protected: - - gp_Ax22d pos; - - -private: - - - - }; - - - - - - #endif // _Geom2d_Conic_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Curve.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Curve.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Curve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Curve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -88,3 +88,14 @@ D0(U,P); return P; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_Curve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Geometry) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Curve.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Curve.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Curve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Curve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -110,7 +110,7 @@ //! - the end point of the initial curve becomes the start //! point of the reversed curve. //! - Reversed creates a new curve. - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Curve) Reversed() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Curve) Reversed() const; //! Returns the value of the first parameter. //! Warnings : @@ -224,6 +224,9 @@ //! are parallel. Standard_EXPORT gp_Pnt2d Value (const Standard_Real U) const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Ellipse.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Ellipse.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Ellipse.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Ellipse.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -383,3 +383,17 @@ minorRadius = minorRadius * Abs(T.ScaleFactor()); pos.Transform(T); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_Ellipse::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Conic) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, majorRadius) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, minorRadius) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Ellipse.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Ellipse.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Ellipse.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Ellipse.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -241,6 +241,9 @@ //! Creates a new object which is a copy of this ellipse. Standard_EXPORT Handle(Geom2d_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Geometry.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Geometry.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Geometry.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Geometry.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -133,3 +133,8 @@ G->Translate (P1, P2); return G; } + +void Geom2d_Geometry::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Geometry.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Geometry.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Geometry.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Geometry.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -94,22 +94,25 @@ //! itself. A copy of the object is returned. Standard_EXPORT virtual void Transform (const gp_Trsf2d& T) = 0; - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Mirrored (const gp_Pnt2d& P) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Geometry) Mirrored (const gp_Pnt2d& P) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Mirrored (const gp_Ax2d& A) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Geometry) Mirrored (const gp_Ax2d& A) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Rotated (const gp_Pnt2d& P, const Standard_Real Ang) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Geometry) Rotated (const gp_Pnt2d& P, const Standard_Real Ang) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Scaled (const gp_Pnt2d& P, const Standard_Real S) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Geometry) Scaled (const gp_Pnt2d& P, const Standard_Real S) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Transformed (const gp_Trsf2d& T) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Geometry) Transformed (const gp_Trsf2d& T) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Translated (const gp_Vec2d& V) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Geometry) Translated (const gp_Vec2d& V) const; - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Geometry) Translated (const gp_Pnt2d& P1, const gp_Pnt2d& P2) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Geometry) Translated (const gp_Pnt2d& P1, const gp_Pnt2d& P2) const; Standard_EXPORT virtual Handle(Geom2d_Geometry) Copy() const = 0; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Hyperbola.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Hyperbola.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Hyperbola.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Hyperbola.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -436,3 +436,17 @@ minorRadius = minorRadius * Abs (T.ScaleFactor()); pos.Transform(T); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_Hyperbola::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Conic) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, majorRadius) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, minorRadius) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Hyperbola.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Hyperbola.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Hyperbola.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Hyperbola.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -294,6 +294,9 @@ //! Creates a new object which is a copy of this hyperbola. Standard_EXPORT Handle(Geom2d_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Line.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Line.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Line.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Line.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -293,3 +293,14 @@ return L.Distance (P); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_Line::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Curve) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &pos) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Line.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Line.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Line.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Line.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -181,6 +181,9 @@ //! Creates a new object, which is a copy of this line. Standard_EXPORT Handle(Geom2d_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_OffsetCurve.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_OffsetCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_OffsetCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_OffsetCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -388,3 +388,19 @@ { return myBasisCurveContinuity; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_OffsetCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Curve) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, basisCurve.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, offsetValue) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBasisCurveContinuity) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_OffsetCurve.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_OffsetCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_OffsetCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_OffsetCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -285,6 +285,9 @@ //! Returns continuity of the basis curve. Standard_EXPORT GeomAbs_Shape GetBasisCurveContinuity() const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Parabola.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Parabola.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Parabola.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Parabola.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -335,4 +335,15 @@ return Abs(T.ScaleFactor()); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_Parabola::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Conic) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, focalLength) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Parabola.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Parabola.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Parabola.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Parabola.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -205,6 +205,9 @@ //! Creates a new object, which is a copy of this parabola. Standard_EXPORT Handle(Geom2d_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Point.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Point.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Point.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Point.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,3 +37,14 @@ gp_Pnt2d P2 = Other->Pnt2d (); return P1.SquareDistance (P2); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_Point::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_Geometry) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Point.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Point.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Point.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Point.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -56,6 +56,9 @@ //! computes the square distance between and . Standard_EXPORT Standard_Real SquareDistance (const Handle(Geom2d_Point)& Other) const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Transformation.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Transformation.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Transformation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Transformation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -170,13 +170,13 @@ //! Computes the inverse of this transformation and creates a new one. //! Raises ConstructionError if the the transformation is singular. This means that //! the ScaleFactor is lower or equal to Resolution from package gp. - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Transformation) Inverted() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Transformation) Inverted() const; //! Computes the transformation composed with Other and . //! * Other. //! Returns a new transformation - Standard_EXPORT Standard_NODISCARD + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Transformation) Multiplied (const Handle(Geom2d_Transformation)& Other) const; Standard_NODISCARD Handle(Geom2d_Transformation) operator * (const Handle(Geom2d_Transformation)& Other) const { diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_TrimmedCurve.cxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_TrimmedCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_TrimmedCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_TrimmedCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -345,3 +345,17 @@ return basisCurve->ParametricTransformation(T); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Geom2d_TrimmedCurve::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom2d_BoundedCurve) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, basisCurve.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, uTrim1) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, uTrim2) +} diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_TrimmedCurve.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_TrimmedCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_TrimmedCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_TrimmedCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -256,6 +256,9 @@ //! Creates a new object, which is a copy of this trimmed curve. Standard_EXPORT Handle(Geom2d_Geometry) Copy() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Vector.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Vector.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_Vector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_Vector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,7 +46,7 @@ Standard_EXPORT void Reverse(); //! Returns a copy of reversed. - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_Vector) Reversed() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_Vector) Reversed() const; //! Computes the angular value, in radians, between this //! vector and vector Other. The result is a value diff -Nru opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_VectorWithMagnitude.hxx opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_VectorWithMagnitude.hxx --- opencascade-7.4.1+dfsg1/src/Geom2d/Geom2d_VectorWithMagnitude.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2d/Geom2d_VectorWithMagnitude.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -80,7 +80,7 @@ //! Adds the vector Other to . - Standard_EXPORT Standard_NODISCARD + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_VectorWithMagnitude) Added (const Handle(Geom2d_Vector)& Other) const; Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) operator + (const Handle(Geom2d_Vector)& Other) const { @@ -105,7 +105,7 @@ //! Divides by a scalar. A new vector is returned. - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) Divided (const Standard_Real Scalar) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_VectorWithMagnitude) Divided (const Standard_Real Scalar) const; Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) operator / (const Standard_Real Scalar) const { return Divided(Scalar); @@ -117,7 +117,7 @@ //! //! -C++: alias operator * //! Collision with same operator defined for the class Vector! - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) Multiplied (const Standard_Real Scalar) const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_VectorWithMagnitude) Multiplied (const Standard_Real Scalar) const; //! Computes the product of the vector by a scalar. @@ -137,7 +137,7 @@ //! //! Raised if the magnitude of the vector is lower or equal to //! Resolution from package gp. - Standard_EXPORT Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) Normalized() const; + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_VectorWithMagnitude) Normalized() const; //! Subtracts the Vector Other to . Standard_EXPORT void Subtract (const Handle(Geom2d_Vector)& Other); @@ -148,7 +148,7 @@ //! Subtracts the vector Other to . A new vector is returned. - Standard_EXPORT Standard_NODISCARD + Standard_NODISCARD Standard_EXPORT Handle(Geom2d_VectorWithMagnitude) Subtracted (const Handle(Geom2d_Vector)& Other) const; Standard_NODISCARD Handle(Geom2d_VectorWithMagnitude) operator - (const Handle(Geom2d_Vector)& Other) const { diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dAdaptor/Geom2dAdaptor.cxx opencascade-7.5.1+dfsg1/src/Geom2dAdaptor/Geom2dAdaptor.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dAdaptor/Geom2dAdaptor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dAdaptor/Geom2dAdaptor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ #include +#include #include #include #include @@ -88,7 +89,21 @@ C2D = HC.BSpline(); } break; - + + case GeomAbs_OffsetCurve: + { + const Geom2dAdaptor_Curve* pGAC = dynamic_cast(&HC); + if (pGAC != 0) + { + C2D = pGAC->Curve(); + } + else + { + Standard_DomainError::Raise("Geom2dAdaptor::MakeCurve, Not Geom2dAdaptor_Curve"); + } + } + break; + default: throw Standard_DomainError("Geom2dAdaptor::MakeCurve, OtherCurve"); @@ -99,8 +114,19 @@ ((HC.FirstParameter() != C2D->FirstParameter()) || (HC.LastParameter() != C2D->LastParameter()))) { - C2D = new Geom2d_TrimmedCurve - (C2D,HC.FirstParameter(),HC.LastParameter()); + if (C2D->IsPeriodic() || + (HC.FirstParameter() >= C2D->FirstParameter() && + HC.LastParameter() <= C2D->LastParameter())) + { + C2D = new Geom2d_TrimmedCurve + (C2D, HC.FirstParameter(), HC.LastParameter()); + } + else + { + Standard_Real tf = Max(HC.FirstParameter(), C2D->FirstParameter()); + Standard_Real tl = Min(HC.LastParameter(), C2D->LastParameter()); + C2D = new Geom2d_TrimmedCurve(C2D, tf, tl); + } } return C2D; diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dAPI/Geom2dAPI_ProjectPointOnCurve.cxx opencascade-7.5.1+dfsg1/src/Geom2dAPI/Geom2dAPI_ProjectPointOnCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dAPI/Geom2dAPI_ProjectPointOnCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dAPI/Geom2dAPI_ProjectPointOnCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,6 +28,7 @@ //purpose : //======================================================================= Geom2dAPI_ProjectPointOnCurve::Geom2dAPI_ProjectPointOnCurve() +: myIndex(-1) { myIsDone = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dConvert/Geom2dConvert.cxx opencascade-7.5.1+dfsg1/src/Geom2dConvert/Geom2dConvert.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dConvert/Geom2dConvert.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dConvert/Geom2dConvert.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1480,7 +1480,7 @@ BS->D1(BS->FirstParameter(),point1,V1); //a verifier BS->D1(BS->LastParameter(),point2,V2); - if ((point1.SquareDistance(point2) < tolerance) && + if ((point1.SquareDistance(point2) < tolerance * tolerance) && (V1.IsParallel(V2, anAngularToler))) { closed_flag = Standard_True; diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dEvaluator/FILES opencascade-7.5.1+dfsg1/src/Geom2dEvaluator/FILES --- opencascade-7.4.1+dfsg1/src/Geom2dEvaluator/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dEvaluator/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,3 +1,5 @@ Geom2dEvaluator_Curve.hxx Geom2dEvaluator_OffsetCurve.cxx Geom2dEvaluator_OffsetCurve.hxx +Geom2dEvaluator.hxx +Geom2dEvaluator.cxx \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator.cxx opencascade-7.5.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,239 @@ +// Created on: 2015-09-21 +// Copyright (c) 2015 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include +#include +#include + +//======================================================================= +//function : CalculateD0 +//purpose : +//======================================================================= +void Geom2dEvaluator::CalculateD0( gp_Pnt2d& theValue, + const gp_Vec2d& theD1, const Standard_Real theOffset) +{ + if (theD1.SquareMagnitude() <= gp::Resolution()) + throw Standard_NullValue("Geom2dEvaluator: Undefined normal vector " + "because tangent vector has zero-magnitude!"); + + gp_Dir2d aNormal(theD1.Y(), -theD1.X()); + theValue.ChangeCoord().Add(aNormal.XY() * theOffset); +} + +//======================================================================= +//function : CalculateD1 +//purpose : +//======================================================================= +void Geom2dEvaluator::CalculateD1(gp_Pnt2d& theValue, + gp_Vec2d& theD1, + const gp_Vec2d& theD2, const Standard_Real theOffset) +{ + // P(u) = p(u) + Offset * Ndir / R + // with R = || p' ^ Z|| and Ndir = P' ^ Z + + // P'(u) = p'(u) + (Offset / R**2) * (DNdir/DU * R - Ndir * (DR/R)) + + gp_XY Ndir(theD1.Y(), -theD1.X()); + gp_XY DNdir(theD2.Y(), -theD2.X()); + Standard_Real R2 = Ndir.SquareModulus(); + Standard_Real R = Sqrt(R2); + Standard_Real R3 = R * R2; + Standard_Real Dr = Ndir.Dot(DNdir); + if (R3 <= gp::Resolution()) + { + if (R2 <= gp::Resolution()) + throw Standard_NullValue("Geom2dEvaluator_OffsetCurve: Null derivative"); + //We try another computation but the stability is not very good. + DNdir.Multiply(R); + DNdir.Subtract(Ndir.Multiplied(Dr / R)); + DNdir.Multiply(theOffset / R2); + } + else + { + // Same computation as IICURV in EUCLID-IS because the stability is better + DNdir.Multiply(theOffset / R); + DNdir.Subtract(Ndir.Multiplied(theOffset * Dr / R3)); + } + + Ndir.Multiply(theOffset / R); + // P(u) + theValue.ChangeCoord().Add(Ndir); + // P'(u) + theD1.Add(gp_Vec2d(DNdir)); +} + +//======================================================================= +//function : CalculateD2 +//purpose : +//======================================================================= +void Geom2dEvaluator::CalculateD2( gp_Pnt2d& theValue, + gp_Vec2d& theD1, + gp_Vec2d& theD2, + const gp_Vec2d& theD3, + const Standard_Boolean theIsDirChange, const Standard_Real theOffset) +{ + // P(u) = p(u) + Offset * Ndir / R + // with R = || p' ^ Z|| and Ndir = P' ^ Z + + // P'(u) = p'(u) + (Offset / R**2) * (DNdir/DU * R - Ndir * (DR/R)) + + // P"(u) = p"(u) + (Offset / R) * (D2Ndir/DU - DNdir * (2.0 * Dr/ R**2) + + // Ndir * ( (3.0 * Dr**2 / R**4) - (D2r / R**2))) + + gp_XY Ndir(theD1.Y(), -theD1.X()); + gp_XY DNdir(theD2.Y(), -theD2.X()); + gp_XY D2Ndir(theD3.Y(), -theD3.X()); + Standard_Real R2 = Ndir.SquareModulus(); + Standard_Real R = Sqrt(R2); + Standard_Real R3 = R2 * R; + Standard_Real R4 = R2 * R2; + Standard_Real R5 = R3 * R2; + Standard_Real Dr = Ndir.Dot(DNdir); + Standard_Real D2r = Ndir.Dot(D2Ndir) + DNdir.Dot(DNdir); + if (R5 <= gp::Resolution()) + { + if (R4 <= gp::Resolution()) + throw Standard_NullValue("Geom2dEvaluator: Null derivative"); + //We try another computation but the stability is not very good dixit ISG. + // V2 = P" (U) : + D2Ndir.Subtract(DNdir.Multiplied(2.0 * Dr / R2)); + D2Ndir.Add(Ndir.Multiplied(((3.0 * Dr * Dr) / R4) - (D2r / R2))); + D2Ndir.Multiply(theOffset / R); + + // V1 = P' (U) : + DNdir.Multiply(R); + DNdir.Subtract(Ndir.Multiplied(Dr / R)); + DNdir.Multiply(theOffset / R2); + } + else + { + // Same computation as IICURV in EUCLID-IS because the stability is better. + // V2 = P" (U) : + D2Ndir.Multiply(theOffset / R); + D2Ndir.Subtract(DNdir.Multiplied(2.0 * theOffset * Dr / R3)); + D2Ndir.Add(Ndir.Multiplied(theOffset * (((3.0 * Dr * Dr) / R5) - (D2r / R3)))); + + // V1 = P' (U) + DNdir.Multiply(theOffset / R); + DNdir.Subtract(Ndir.Multiplied(theOffset * Dr / R3)); + } + + Ndir.Multiply(theOffset / R); + // P(u) + theValue.ChangeCoord().Add(Ndir); + // P'(u) : + theD1.Add(gp_Vec2d(DNdir)); + // P"(u) : + if (theIsDirChange) + theD2.Reverse(); + theD2.Add(gp_Vec2d(D2Ndir)); +} + +//======================================================================= +//function : CalculateD3 +//purpose : +//======================================================================= +void Geom2dEvaluator::CalculateD3( gp_Pnt2d& theValue, + gp_Vec2d& theD1, + gp_Vec2d& theD2, + gp_Vec2d& theD3, + const gp_Vec2d& theD4, + const Standard_Boolean theIsDirChange, const Standard_Real theOffset) +{ + // P(u) = p(u) + Offset * Ndir / R + // with R = || p' ^ Z|| and Ndir = P' ^ Z + + // P'(u) = p'(u) + (Offset / R**2) * (DNdir/DU * R - Ndir * (DR/R)) + + // P"(u) = p"(u) + (Offset / R) * (D2Ndir/DU - DNdir * (2.0 * Dr/ R**2) + + // Ndir * ( (3.0 * Dr**2 / R**4) - (D2r / R**2))) + + // P"'(u) = p"'(u) + (Offset / R) * (D3Ndir - (3.0 * Dr/R**2 ) * D2Ndir - + // (3.0 * D2r / R2) * DNdir) + (3.0 * Dr * Dr / R4) * DNdir - + // (D3r/R2) * Ndir + (6.0 * Dr * Dr / R4) * Ndir + + // (6.0 * Dr * D2r / R4) * Ndir - (15.0 * Dr* Dr* Dr /R6) * Ndir + + gp_XY Ndir(theD1.Y(), -theD1.X()); + gp_XY DNdir(theD2.Y(), -theD2.X()); + gp_XY D2Ndir(theD3.Y(), -theD3.X()); + gp_XY D3Ndir(theD4.Y(), -theD4.X()); + Standard_Real R2 = Ndir.SquareModulus(); + Standard_Real R = Sqrt(R2); + Standard_Real R3 = R2 * R; + Standard_Real R4 = R2 * R2; + Standard_Real R5 = R3 * R2; + Standard_Real R6 = R3 * R3; + Standard_Real R7 = R5 * R2; + Standard_Real Dr = Ndir.Dot(DNdir); + Standard_Real D2r = Ndir.Dot(D2Ndir) + DNdir.Dot(DNdir); + Standard_Real D3r = Ndir.Dot(D3Ndir) + 3.0 * DNdir.Dot(D2Ndir); + + if (R7 <= gp::Resolution()) + { + if (R6 <= gp::Resolution()) + throw Standard_NullValue("Geom2dEvaluator: Null derivative"); + //We try another computation but the stability is not very good dixit ISG. + // V3 = P"' (U) : + D3Ndir.Subtract(D2Ndir.Multiplied(3.0 * theOffset * Dr / R2)); + D3Ndir.Subtract( + (DNdir.Multiplied((3.0 * theOffset) * ((D2r / R2) + (Dr*Dr) / R4)))); + D3Ndir.Add(Ndir.Multiplied( + (theOffset * (6.0*Dr*Dr / R4 + 6.0*Dr*D2r / R4 - 15.0*Dr*Dr*Dr / R6 - D3r)))); + D3Ndir.Multiply(theOffset / R); + // V2 = P" (U) : + R4 = R2 * R2; + D2Ndir.Subtract(DNdir.Multiplied(2.0 * Dr / R2)); + D2Ndir.Subtract(Ndir.Multiplied(((3.0 * Dr * Dr) / R4) - (D2r / R2))); + D2Ndir.Multiply(theOffset / R); + // V1 = P' (U) : + DNdir.Multiply(R); + DNdir.Subtract(Ndir.Multiplied(Dr / R)); + DNdir.Multiply(theOffset / R2); + } + else + { + // Same computation as IICURV in EUCLID-IS because the stability is better. + // V3 = P"' (U) : + D3Ndir.Multiply(theOffset / R); + D3Ndir.Subtract(D2Ndir.Multiplied(3.0 * theOffset * Dr / R3)); + D3Ndir.Subtract(DNdir.Multiplied( + ((3.0 * theOffset) * ((D2r / R3) + (Dr*Dr) / R5)))); + D3Ndir.Add(Ndir.Multiplied( + (theOffset * (6.0*Dr*Dr / R5 + 6.0*Dr*D2r / R5 - 15.0*Dr*Dr*Dr / R7 - D3r)))); + // V2 = P" (U) : + D2Ndir.Multiply(theOffset / R); + D2Ndir.Subtract(DNdir.Multiplied(2.0 * theOffset * Dr / R3)); + D2Ndir.Subtract(Ndir.Multiplied( + theOffset * (((3.0 * Dr * Dr) / R5) - (D2r / R3)))); + // V1 = P' (U) : + DNdir.Multiply(theOffset / R); + DNdir.Subtract(Ndir.Multiplied(theOffset * Dr / R3)); + } + + Ndir.Multiply(theOffset / R); + // P(u) + theValue.ChangeCoord().Add(Ndir); + // P'(u) : + theD1.Add(gp_Vec2d(DNdir)); + // P"(u) + theD2.Add(gp_Vec2d(D2Ndir)); + // P"'(u) + if (theIsDirChange) + theD3.Reverse(); + theD3.Add(gp_Vec2d(D2Ndir)); +} + + diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator.hxx opencascade-7.5.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator.hxx --- opencascade-7.4.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,87 @@ +// Created on: 1992-08-28 +// Created by: Remi LEQUETTE +// Copyright (c) 1992-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Geom2dEvaluator_HeaderFile +#define _Geom2dEvaluator_HeaderFile + +#include +#include +#include +#include + +class gp_Pnt2d; +class gp_Vec2d; + +//! The Geom2dEvaluator package provides utilities for . +//! calculating value and derivatives of offset curve +//! using corresponding values of base curve + +class Geom2dEvaluator +{ +public: + + DEFINE_STANDARD_ALLOC + + + //! Recalculate D1 values of base curve into D0 value of offset curve + Standard_EXPORT static void CalculateD0(gp_Pnt2d& theValue, + const gp_Vec2d& theD1, const Standard_Real theOffset); + + //! Recalculate D2 values of base curve into D1 values of offset curve + Standard_EXPORT static void CalculateD1(gp_Pnt2d& theValue, + gp_Vec2d& theD1, + const gp_Vec2d& theD2, const Standard_Real theOffset); + + + //! Recalculate D3 values of base curve into D2 values of offset curve + Standard_EXPORT static void CalculateD2(gp_Pnt2d& theValue, + gp_Vec2d& theD1, + gp_Vec2d& theD2, + const gp_Vec2d& theD3, const Standard_Boolean theIsDirChange, + const Standard_Real theOffset); + + + //! Recalculate D3 values of base curve into D3 values of offset curve + Standard_EXPORT static void CalculateD3(gp_Pnt2d& theValue, + gp_Vec2d& theD1, + gp_Vec2d& theD2, + gp_Vec2d& theD3, + const gp_Vec2d& theD4, const Standard_Boolean theIsDirChange, + const Standard_Real theOffset); + + + //! Recalculate derivatives in the singular point + //! Returns true if the direction of derivatives is changed + Standard_EXPORT static Standard_Boolean AdjustDerivative(const Standard_Integer theMaxDerivative, + const Standard_Real theU, + gp_Vec2d& theD1, + gp_Vec2d& theD2, + gp_Vec2d& theD3, + gp_Vec2d& theD4); + + +protected: + + + + + +private: + +}; + + +#endif // _Geom2dEvaluator_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator_OffsetCurve.cxx opencascade-7.5.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator_OffsetCurve.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator_OffsetCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator_OffsetCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,7 +13,7 @@ // commercial license or contractual agreement. #include - +#include #include #include @@ -43,7 +43,7 @@ { gp_Vec2d aD1; BaseD1(theU, theValue, aD1); - CalculateD0(theValue, aD1); + Geom2dEvaluator::CalculateD0(theValue, aD1, myOffset); } void Geom2dEvaluator_OffsetCurve::D1(const Standard_Real theU, @@ -52,7 +52,7 @@ { gp_Vec2d aD2; BaseD2(theU, theValue, theD1, aD2); - CalculateD1(theValue, theD1, aD2); + Geom2dEvaluator::CalculateD1(theValue, theD1, aD2, myOffset); } void Geom2dEvaluator_OffsetCurve::D2(const Standard_Real theU, @@ -70,7 +70,7 @@ isDirectionChange = AdjustDerivative(3, theU, theD1, theD2, aD3, aDummyD4); } - CalculateD2(theValue, theD1, theD2, aD3, isDirectionChange); + Geom2dEvaluator::CalculateD2(theValue, theD1, theD2, aD3, isDirectionChange, myOffset); } void Geom2dEvaluator_OffsetCurve::D3(const Standard_Real theU, @@ -86,7 +86,7 @@ if (theD1.SquareMagnitude() <= gp::Resolution()) isDirectionChange = AdjustDerivative(4, theU, theD1, theD2, theD3, aD4); - CalculateD3(theValue, theD1, theD2, theD3, aD4, isDirectionChange); + Geom2dEvaluator::CalculateD3(theValue, theD1, theD2, theD3, aD4, isDirectionChange, myOffset); } gp_Vec2d Geom2dEvaluator_OffsetCurve::DN(const Standard_Real theU, @@ -184,207 +184,6 @@ } -void Geom2dEvaluator_OffsetCurve::CalculateD0( gp_Pnt2d& theValue, - const gp_Vec2d& theD1) const -{ - if (theD1.SquareMagnitude() <= gp::Resolution()) - throw Standard_NullValue("Geom2dEvaluator_OffsetCurve: Undefined normal vector " - "because tangent vector has zero-magnitude!"); - - gp_Dir2d aNormal(theD1.Y(), -theD1.X()); - theValue.ChangeCoord().Add(aNormal.XY() * myOffset); -} - -void Geom2dEvaluator_OffsetCurve::CalculateD1( gp_Pnt2d& theValue, - gp_Vec2d& theD1, - const gp_Vec2d& theD2) const -{ - // P(u) = p(u) + Offset * Ndir / R - // with R = || p' ^ Z|| and Ndir = P' ^ Z - - // P'(u) = p'(u) + (Offset / R**2) * (DNdir/DU * R - Ndir * (DR/R)) - - gp_XY Ndir(theD1.Y(), -theD1.X()); - gp_XY DNdir(theD2.Y(), -theD2.X()); - Standard_Real R2 = Ndir.SquareModulus(); - Standard_Real R = Sqrt(R2); - Standard_Real R3 = R * R2; - Standard_Real Dr = Ndir.Dot(DNdir); - if (R3 <= gp::Resolution()) - { - if (R2 <= gp::Resolution()) - throw Standard_NullValue("Geom2dEvaluator_OffsetCurve: Null derivative"); - //We try another computation but the stability is not very good. - DNdir.Multiply(R); - DNdir.Subtract(Ndir.Multiplied(Dr / R)); - DNdir.Multiply(myOffset / R2); - } - else - { - // Same computation as IICURV in EUCLID-IS because the stability is better - DNdir.Multiply(myOffset / R); - DNdir.Subtract(Ndir.Multiplied(myOffset * Dr / R3)); - } - - Ndir.Multiply(myOffset / R); - // P(u) - theValue.ChangeCoord().Add(Ndir); - // P'(u) - theD1.Add(gp_Vec2d(DNdir)); -} - -void Geom2dEvaluator_OffsetCurve::CalculateD2( gp_Pnt2d& theValue, - gp_Vec2d& theD1, - gp_Vec2d& theD2, - const gp_Vec2d& theD3, - const Standard_Boolean theIsDirChange) const -{ - // P(u) = p(u) + Offset * Ndir / R - // with R = || p' ^ Z|| and Ndir = P' ^ Z - - // P'(u) = p'(u) + (Offset / R**2) * (DNdir/DU * R - Ndir * (DR/R)) - - // P"(u) = p"(u) + (Offset / R) * (D2Ndir/DU - DNdir * (2.0 * Dr/ R**2) + - // Ndir * ( (3.0 * Dr**2 / R**4) - (D2r / R**2))) - - gp_XY Ndir(theD1.Y(), -theD1.X()); - gp_XY DNdir(theD2.Y(), -theD2.X()); - gp_XY D2Ndir(theD3.Y(), -theD3.X()); - Standard_Real R2 = Ndir.SquareModulus(); - Standard_Real R = Sqrt(R2); - Standard_Real R3 = R2 * R; - Standard_Real R4 = R2 * R2; - Standard_Real R5 = R3 * R2; - Standard_Real Dr = Ndir.Dot(DNdir); - Standard_Real D2r = Ndir.Dot(D2Ndir) + DNdir.Dot(DNdir); - if (R5 <= gp::Resolution()) - { - if (R4 <= gp::Resolution()) - throw Standard_NullValue("Geom2dEvaluator_OffsetCurve: Null derivative"); - //We try another computation but the stability is not very good dixit ISG. - // V2 = P" (U) : - D2Ndir.Subtract(DNdir.Multiplied(2.0 * Dr / R2)); - D2Ndir.Add(Ndir.Multiplied(((3.0 * Dr * Dr) / R4) - (D2r / R2))); - D2Ndir.Multiply(myOffset / R); - - // V1 = P' (U) : - DNdir.Multiply(R); - DNdir.Subtract(Ndir.Multiplied(Dr / R)); - DNdir.Multiply(myOffset / R2); - } - else - { - // Same computation as IICURV in EUCLID-IS because the stability is better. - // V2 = P" (U) : - D2Ndir.Multiply(myOffset / R); - D2Ndir.Subtract(DNdir.Multiplied(2.0 * myOffset * Dr / R3)); - D2Ndir.Add(Ndir.Multiplied(myOffset * (((3.0 * Dr * Dr) / R5) - (D2r / R3)))); - - // V1 = P' (U) - DNdir.Multiply(myOffset / R); - DNdir.Subtract(Ndir.Multiplied(myOffset * Dr / R3)); - } - - Ndir.Multiply(myOffset / R); - // P(u) - theValue.ChangeCoord().Add(Ndir); - // P'(u) : - theD1.Add(gp_Vec2d(DNdir)); - // P"(u) : - if (theIsDirChange) - theD2.Reverse(); - theD2.Add(gp_Vec2d(D2Ndir)); -} - -void Geom2dEvaluator_OffsetCurve::CalculateD3( gp_Pnt2d& theValue, - gp_Vec2d& theD1, - gp_Vec2d& theD2, - gp_Vec2d& theD3, - const gp_Vec2d& theD4, - const Standard_Boolean theIsDirChange) const -{ - // P(u) = p(u) + Offset * Ndir / R - // with R = || p' ^ Z|| and Ndir = P' ^ Z - - // P'(u) = p'(u) + (Offset / R**2) * (DNdir/DU * R - Ndir * (DR/R)) - - // P"(u) = p"(u) + (Offset / R) * (D2Ndir/DU - DNdir * (2.0 * Dr/ R**2) + - // Ndir * ( (3.0 * Dr**2 / R**4) - (D2r / R**2))) - - // P"'(u) = p"'(u) + (Offset / R) * (D3Ndir - (3.0 * Dr/R**2 ) * D2Ndir - - // (3.0 * D2r / R2) * DNdir) + (3.0 * Dr * Dr / R4) * DNdir - - // (D3r/R2) * Ndir + (6.0 * Dr * Dr / R4) * Ndir + - // (6.0 * Dr * D2r / R4) * Ndir - (15.0 * Dr* Dr* Dr /R6) * Ndir - - gp_XY Ndir(theD1.Y(), -theD1.X()); - gp_XY DNdir(theD2.Y(), -theD2.X()); - gp_XY D2Ndir(theD3.Y(), -theD3.X()); - gp_XY D3Ndir(theD4.Y(), -theD4.X()); - Standard_Real R2 = Ndir.SquareModulus(); - Standard_Real R = Sqrt(R2); - Standard_Real R3 = R2 * R; - Standard_Real R4 = R2 * R2; - Standard_Real R5 = R3 * R2; - Standard_Real R6 = R3 * R3; - Standard_Real R7 = R5 * R2; - Standard_Real Dr = Ndir.Dot(DNdir); - Standard_Real D2r = Ndir.Dot(D2Ndir) + DNdir.Dot(DNdir); - Standard_Real D3r = Ndir.Dot(D3Ndir) + 3.0 * DNdir.Dot(D2Ndir); - - if (R7 <= gp::Resolution()) - { - if (R6 <= gp::Resolution()) - throw Standard_NullValue("Geom2dEvaluator_OffsetCurve: Null derivative"); - //We try another computation but the stability is not very good dixit ISG. - // V3 = P"' (U) : - D3Ndir.Subtract(D2Ndir.Multiplied(3.0 * myOffset * Dr / R2)); - D3Ndir.Subtract( - (DNdir.Multiplied((3.0 * myOffset) * ((D2r / R2) + (Dr*Dr) / R4)))); - D3Ndir.Add(Ndir.Multiplied( - (myOffset * (6.0*Dr*Dr / R4 + 6.0*Dr*D2r / R4 - 15.0*Dr*Dr*Dr / R6 - D3r)))); - D3Ndir.Multiply(myOffset / R); - // V2 = P" (U) : - R4 = R2 * R2; - D2Ndir.Subtract(DNdir.Multiplied(2.0 * Dr / R2)); - D2Ndir.Subtract(Ndir.Multiplied(((3.0 * Dr * Dr) / R4) - (D2r / R2))); - D2Ndir.Multiply(myOffset / R); - // V1 = P' (U) : - DNdir.Multiply(R); - DNdir.Subtract(Ndir.Multiplied(Dr / R)); - DNdir.Multiply(myOffset / R2); - } - else - { - // Same computation as IICURV in EUCLID-IS because the stability is better. - // V3 = P"' (U) : - D3Ndir.Multiply(myOffset / R); - D3Ndir.Subtract(D2Ndir.Multiplied(3.0 * myOffset * Dr / R3)); - D3Ndir.Subtract(DNdir.Multiplied( - ((3.0 * myOffset) * ((D2r / R3) + (Dr*Dr) / R5)))); - D3Ndir.Add(Ndir.Multiplied( - (myOffset * (6.0*Dr*Dr / R5 + 6.0*Dr*D2r / R5 - 15.0*Dr*Dr*Dr / R7 - D3r)))); - // V2 = P" (U) : - D2Ndir.Multiply(myOffset / R); - D2Ndir.Subtract(DNdir.Multiplied(2.0 * myOffset * Dr / R3)); - D2Ndir.Subtract(Ndir.Multiplied( - myOffset * (((3.0 * Dr * Dr) / R5) - (D2r / R3)))); - // V1 = P' (U) : - DNdir.Multiply(myOffset / R); - DNdir.Subtract(Ndir.Multiplied(myOffset * Dr / R3)); - } - - Ndir.Multiply(myOffset / R); - // P(u) - theValue.ChangeCoord().Add(Ndir); - // P'(u) : - theD1.Add(gp_Vec2d(DNdir)); - // P"(u) - theD2.Add(gp_Vec2d(D2Ndir)); - // P"'(u) - if (theIsDirChange) - theD3.Reverse(); - theD3.Add(gp_Vec2d(D2Ndir)); -} Standard_Boolean Geom2dEvaluator_OffsetCurve::AdjustDerivative( diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator_OffsetCurve.hxx opencascade-7.5.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator_OffsetCurve.hxx --- opencascade-7.4.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator_OffsetCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dEvaluator/Geom2dEvaluator_OffsetCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,27 +57,6 @@ DEFINE_STANDARD_RTTIEXT(Geom2dEvaluator_OffsetCurve,Geom2dEvaluator_Curve) private: - //! Recalculate D1 values of base curve into D0 value of offset curve - void CalculateD0( gp_Pnt2d& theValue, - const gp_Vec2d& theD1) const; - //! Recalculate D2 values of base curve into D1 values of offset curve - void CalculateD1( gp_Pnt2d& theValue, - gp_Vec2d& theD1, - const gp_Vec2d& theD2) const; - //! Recalculate D3 values of base curve into D2 values of offset curve - void CalculateD2( gp_Pnt2d& theValue, - gp_Vec2d& theD1, - gp_Vec2d& theD2, - const gp_Vec2d& theD3, - const Standard_Boolean theIsDirChange) const; - //! Recalculate D3 values of base curve into D3 values of offset curve - void CalculateD3( gp_Pnt2d& theValue, - gp_Vec2d& theD1, - gp_Vec2d& theD2, - gp_Vec2d& theD3, - const gp_Vec2d& theD4, - const Standard_Boolean theIsDirChange) const; - //! Calculate value of base curve/adaptor void BaseD0(const Standard_Real theU, gp_Pnt2d& theValue) const; //! Calculate value and first derivatives of base curve/adaptor diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOn.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOn.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOn.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOn.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,6 +41,7 @@ const Standard_Real Param1 , const Standard_Real Param2 , const Standard_Real ParamOn ): + WellDone(Standard_False), cirsol(1,8) , qualifier1(1,8), qualifier2(1,8), @@ -53,7 +54,7 @@ par2sol(1,8) , pararg1(1,8) , pararg2(1,8) , - parcen3(1,8) + parcen3(1,8) { Geom2dAdaptor_Curve C1 = Qualified1.Qualified(); Geom2dAdaptor_Curve C2 = Qualified2.Qualified(); @@ -374,6 +375,7 @@ const Standard_Real Tolerance , const Standard_Real Param1 , const Standard_Real ParamOn ): + WellDone(Standard_False), cirsol(1,8) , qualifier1(1,8), qualifier2(1,8), @@ -386,7 +388,7 @@ par2sol(1,8) , pararg1(1,8) , pararg2(1,8) , - parcen3(1,8) + parcen3(1,8) { Geom2dAdaptor_Curve C1 = Qualified1.Qualified(); GeomAbs_CurveType Type1 = C1.GetType(); @@ -564,6 +566,7 @@ const Handle(Geom2d_Point)& Point2 , const Geom2dAdaptor_Curve& OnCurve , const Standard_Real Tolerance ): + WellDone(Standard_False), cirsol(1,8) , qualifier1(1,8), qualifier2(1,8), @@ -576,8 +579,7 @@ par2sol(1,8) , pararg1(1,8) , pararg2(1,8) , - parcen3(1,8) - + parcen3(1,8) { GeomAbs_CurveType Type3 = OnCurve.GetType(); Handle(Geom2d_Curve) Con = OnCurve.Curve(); diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOnGeo.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOnGeo.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOnGeo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOnGeo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,24 +46,26 @@ #include #include +static const Standard_Integer aNbSolMAX = 8; + Geom2dGcc_Circ2d2TanOnGeo:: Geom2dGcc_Circ2d2TanOnGeo (const GccEnt_QualifiedCirc& Qualified1 , const GccEnt_QualifiedCirc& Qualified2 , const Geom2dAdaptor_Curve& OnCurv , const Standard_Real Tolerance ): - cirsol(1,8) , - qualifier1(1,8), - qualifier2(1,8), - TheSame1(1,8) , - TheSame2(1,8) , - pnttg1sol(1,8) , - pnttg2sol(1,8) , - pntcen(1,8) , - par1sol(1,8) , - par2sol(1,8) , - pararg1(1,8) , - pararg2(1,8) , - parcen3(1,8) + cirsol(1, aNbSolMAX) , + qualifier1(1, aNbSolMAX), + qualifier2(1, aNbSolMAX), + TheSame1(1, aNbSolMAX) , + TheSame2(1, aNbSolMAX) , + pnttg1sol(1, aNbSolMAX) , + pnttg2sol(1, aNbSolMAX) , + pntcen(1, aNbSolMAX) , + par1sol(1, aNbSolMAX) , + par2sol(1, aNbSolMAX) , + pararg1(1, aNbSolMAX) , + pararg2(1, aNbSolMAX) , + parcen3(1, aNbSolMAX) { WellDone = Standard_False; Standard_Real thefirst = -100000.; @@ -200,7 +202,7 @@ } } if (nnsol > 0) { - for (Standard_Integer k = 1 ; k <= nnsol ; k++) { + for (Standard_Integer k = 1 ; k <= nnsol && NbrSol < aNbSolMAX; k++) { NbrSol++; cirsol(NbrSol) = gp_Circ2d(gp_Ax2d(Center,dirx),Radius(k)); // ========================================================== @@ -276,19 +278,19 @@ const GccEnt_QualifiedLin& Qualified2 , const Geom2dAdaptor_Curve& OnCurv , const Standard_Real Tolerance ): -cirsol(1,8) , -qualifier1(1,8), -qualifier2(1,8), -TheSame1(1,8) , -TheSame2(1,8) , -pnttg1sol(1,8) , -pnttg2sol(1,8) , -pntcen(1,8) , -par1sol(1,8) , -par2sol(1,8) , -pararg1(1,8) , -pararg2(1,8) , -parcen3(1,8) +cirsol(1, aNbSolMAX) , +qualifier1(1, aNbSolMAX), +qualifier2(1, aNbSolMAX), +TheSame1(1, aNbSolMAX) , +TheSame2(1, aNbSolMAX) , +pnttg1sol(1, aNbSolMAX) , +pnttg2sol(1, aNbSolMAX) , +pntcen(1, aNbSolMAX) , +par1sol(1, aNbSolMAX) , +par2sol(1, aNbSolMAX) , +pararg1(1, aNbSolMAX) , +pararg2(1, aNbSolMAX) , +parcen3(1, aNbSolMAX) { WellDone = Standard_False; @@ -353,7 +355,7 @@ } if (Intp.IsDone()) { if (!Intp.IsEmpty()) { - for (Standard_Integer j = 1 ; j <= Intp.NbPoints() ; j++) { + for (Standard_Integer j = 1 ; j <= Intp.NbPoints() && NbrSol < aNbSolMAX; j++) { gp_Pnt2d Center(Intp.Point(j).Value()); Standard_Real dist1 = Center.Distance(center1); // Standard_Integer nbsol = 1; @@ -454,19 +456,19 @@ const GccEnt_QualifiedLin& Qualified2 , const Geom2dAdaptor_Curve& OnCurv , const Standard_Real Tolerance ): -cirsol(1,8) , -qualifier1(1,8), -qualifier2(1,8), -TheSame1(1,8) , -TheSame2(1,8) , -pnttg1sol(1,8) , -pnttg2sol(1,8) , -pntcen(1,8) , -par1sol(1,8) , -par2sol(1,8) , -pararg1(1,8) , -pararg2(1,8) , -parcen3(1,8) +cirsol(1, aNbSolMAX) , +qualifier1(1, aNbSolMAX), +qualifier2(1, aNbSolMAX), +TheSame1(1, aNbSolMAX) , +TheSame2(1, aNbSolMAX) , +pnttg1sol(1, aNbSolMAX) , +pnttg2sol(1, aNbSolMAX) , +pntcen(1, aNbSolMAX) , +par1sol(1, aNbSolMAX) , +par2sol(1, aNbSolMAX) , +pararg1(1, aNbSolMAX) , +pararg2(1, aNbSolMAX) , +parcen3(1, aNbSolMAX) { WellDone = Standard_False; @@ -510,7 +512,7 @@ Intp.Perform(Bis.ThisSolution(i),D1,C2,D2,Tol1,Tol2); if (Intp.IsDone()) { if ((!Intp.IsEmpty())) { - for (Standard_Integer j = 1 ; j <= Intp.NbPoints() ; j++) { + for (Standard_Integer j = 1 ; j <= Intp.NbPoints() && NbrSol < aNbSolMAX; j++) { gp_Pnt2d Center(Intp.Point(j).Value()); Standard_Real dist1 = L1.Distance(Center); Standard_Real dist2 = L2.Distance(Center); @@ -609,19 +611,19 @@ const gp_Pnt2d& Point2 , const Geom2dAdaptor_Curve& OnCurv , const Standard_Real Tolerance ): -cirsol(1,8) , -qualifier1(1,8), -qualifier2(1,8), -TheSame1(1,8) , -TheSame2(1,8) , -pnttg1sol(1,8) , -pnttg2sol(1,8) , -pntcen(1,8) , -par1sol(1,8) , -par2sol(1,8) , -pararg1(1,8) , -pararg2(1,8) , -parcen3(1,8) +cirsol(1, aNbSolMAX) , +qualifier1(1, aNbSolMAX), +qualifier2(1, aNbSolMAX), +TheSame1(1, aNbSolMAX) , +TheSame2(1, aNbSolMAX) , +pnttg1sol(1, aNbSolMAX) , +pnttg2sol(1, aNbSolMAX) , +pntcen(1, aNbSolMAX) , +par1sol(1, aNbSolMAX) , +par2sol(1, aNbSolMAX) , +pararg1(1, aNbSolMAX) , +pararg2(1, aNbSolMAX) , +parcen3(1, aNbSolMAX) { WellDone = Standard_False; @@ -697,7 +699,7 @@ } if (Intp.IsDone()) { if ((!Intp.IsEmpty())) { - for (Standard_Integer j = 1 ; j <= Intp.NbPoints() ; j++) { + for (Standard_Integer j = 1 ; j <= Intp.NbPoints() && NbrSol < aNbSolMAX; j++) { gp_Pnt2d Center(Intp.Point(j).Value()); Radius = Center.Distance(Point2); Standard_Real dist1 = center1.Distance(Center); @@ -771,19 +773,19 @@ const gp_Pnt2d& Point2 , const Geom2dAdaptor_Curve& OnCurv , const Standard_Real Tolerance ): -cirsol(1,8) , -qualifier1(1,8), -qualifier2(1,8), -TheSame1(1,8) , -TheSame2(1,8) , -pnttg1sol(1,8) , -pnttg2sol(1,8) , -pntcen(1,8) , -par1sol(1,8) , -par2sol(1,8) , -pararg1(1,8) , -pararg2(1,8) , -parcen3(1,8) +cirsol(1, aNbSolMAX) , +qualifier1(1, aNbSolMAX), +qualifier2(1, aNbSolMAX), +TheSame1(1, aNbSolMAX) , +TheSame2(1, aNbSolMAX) , +pnttg1sol(1, aNbSolMAX) , +pnttg2sol(1, aNbSolMAX) , +pntcen(1, aNbSolMAX) , +par1sol(1, aNbSolMAX) , +par2sol(1, aNbSolMAX) , +pararg1(1, aNbSolMAX) , +pararg2(1, aNbSolMAX) , +parcen3(1, aNbSolMAX) { WellDone = Standard_False; @@ -839,7 +841,7 @@ } if (Intp.IsDone()) { if ((!Intp.IsEmpty())) { - for (Standard_Integer j = 1 ; j <= Intp.NbPoints() ; j++) { + for (Standard_Integer j = 1 ; j <= Intp.NbPoints() && NbrSol < aNbSolMAX; j++) { gp_Pnt2d Center(Intp.Point(j).Value()); Standard_Real Radius = L1.Distance(Center); // Standard_Integer nbsol = 1; @@ -908,19 +910,19 @@ const gp_Pnt2d& Point2 , const Geom2dAdaptor_Curve& OnCurv , const Standard_Real Tolerance ): -cirsol(1,8) , -qualifier1(1,8), -qualifier2(1,8), -TheSame1(1,8) , -TheSame2(1,8) , -pnttg1sol(1,8) , -pnttg2sol(1,8) , -pntcen(1,8) , -par1sol(1,8) , -par2sol(1,8) , -pararg1(1,8) , -pararg2(1,8) , -parcen3(1,8) +cirsol(1, aNbSolMAX) , +qualifier1(1, aNbSolMAX), +qualifier2(1, aNbSolMAX), +TheSame1(1, aNbSolMAX) , +TheSame2(1, aNbSolMAX) , +pnttg1sol(1, aNbSolMAX) , +pnttg2sol(1, aNbSolMAX) , +pntcen(1, aNbSolMAX) , +par1sol(1, aNbSolMAX) , +par2sol(1, aNbSolMAX) , +pararg1(1, aNbSolMAX) , +pararg2(1, aNbSolMAX) , +parcen3(1, aNbSolMAX) { WellDone = Standard_False; @@ -947,7 +949,7 @@ Intp.Perform(Bis.ThisSolution(),D1,Cu2,D2,Tol1,Tol2); if (Intp.IsDone()) { if ((!Intp.IsEmpty())) { - for (Standard_Integer j = 1 ; j <= Intp.NbPoints() ; j++) { + for (Standard_Integer j = 1 ; j <= Intp.NbPoints() && NbrSol < aNbSolMAX; j++) { gp_Pnt2d Center(Intp.Point(j).Value()); Standard_Real Radius = Point2.Distance(Center); NbrSol++; diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOnIter.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOnIter.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOnIter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanOnIter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -61,7 +61,8 @@ WellDone = Standard_False; Standard_Real Tol = Abs(Tolang); - WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -163,6 +164,8 @@ parcen3 = 0.; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -272,6 +275,8 @@ parcen3 = 0.; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified())) { throw GccEnt_BadQualifier(); @@ -357,6 +362,8 @@ parcen3 = 0.; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -465,6 +472,8 @@ parcen3 = 0.; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -571,6 +580,8 @@ parcen3 = 0.; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -675,6 +686,8 @@ parcen3 = 0.; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -785,6 +798,8 @@ parcen3 = 0.; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified())) { throw GccEnt_BadQualifier(); @@ -871,7 +886,8 @@ WellDone = Standard_False; Standard_Real Tol = Abs(Tolerance); - WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -977,6 +993,8 @@ parcen3 = 0.; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -1006,7 +1024,7 @@ tol(1) = 2.e-15*M_PI; tol(2) = Geom2dGcc_CurveTool::EpsX(Cu2,Abs(Tolerance)); tol(3) = Geom2dGcc_CurveTool::EpsX(OnCurv,Abs(Tolerance)); - tol(4) = Tol/10.;; + tol(4) = Tol/10.; gp_Pnt2d point1 = ElCLib::Value(Param1,C1); gp_Pnt2d point2 = Geom2dGcc_CurveTool::Value(Cu2,Param2); gp_Pnt2d point3 = Geom2dGcc_CurveTool::Value(OnCurv,ParamOn); @@ -1079,6 +1097,8 @@ parcen3 = 0.; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -1179,6 +1199,8 @@ parcen3 = 0.; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified())) { throw GccEnt_BadQualifier(); diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanRad.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanRad.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanRad.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanRad.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -262,17 +262,17 @@ const Handle(Geom2d_Point)& Point , const Standard_Real Radius , const Standard_Real Tolerance ): - cirsol(1,8) , - qualifier1(1,8), - qualifier2(1,8), - TheSame1(1,8) , - TheSame2(1,8) , - pnttg1sol(1,8), - pnttg2sol(1,8), - par1sol(1,8) , - par2sol(1,8) , - pararg1(1,8) , - pararg2(1,8) + cirsol(1,aNbSolMAX) , + qualifier1(1,aNbSolMAX), + qualifier2(1,aNbSolMAX), + TheSame1(1,aNbSolMAX) , + TheSame2(1,aNbSolMAX) , + pnttg1sol(1,aNbSolMAX), + pnttg2sol(1,aNbSolMAX), + par1sol(1,aNbSolMAX) , + par2sol(1,aNbSolMAX) , + pararg1(1,aNbSolMAX) , + pararg2(1,aNbSolMAX) { if (Radius < 0.) { throw Standard_NegativeValue(); } else { diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanRadGeo.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanRadGeo.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanRadGeo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d2TanRadGeo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -181,9 +181,10 @@ gp_Pnt2d Point(L1.Location().XY()+cote1(jcote1)*Dir.XY()); gp_Lin2d Line(Point,L1.Direction()); // ligne avec deport. IntRes2d_Domain D1; - for (Standard_Integer jcote2 = 1 ; jcote2 <= nbrcote2 ; jcote2++) { + for (Standard_Integer jcote2 = 1; jcote2 <= nbrcote2 && NbrSol < aNbSolMAX; jcote2++) { Handle(Geom2dAdaptor_HCurve) HCu2 = new Geom2dAdaptor_HCurve(Cu2); - Adaptor2d_OffsetCurve C2(HCu2,cote2(jcote2)); + //Adaptor2d_OffsetCurve C2(HCu2,cote2(jcote2)); + Adaptor2d_OffsetCurve C2(HCu2, -cote2(jcote2)); firstparam = Max(C2.FirstParameter(),thefirst); lastparam = Min(C2.LastParameter(),thelast); IntRes2d_Domain D2(C2.Value(firstparam), firstparam, Tol, @@ -191,7 +192,7 @@ Geom2dInt_TheIntConicCurveOfGInter Intp(Line,D1,C2,D2,Tol,Tol); if (Intp.IsDone()) { if (!Intp.IsEmpty()) { - for (Standard_Integer i = 1 ; i <= Intp.NbPoints() ; i++) { + for (Standard_Integer i = 1; i <= Intp.NbPoints() && NbrSol < aNbSolMAX; i++) { NbrSol++; gp_Pnt2d Center(Intp.Point(i).Value()); cirsol(NbrSol) = gp_Circ2d(gp_Ax2d(Center,dirx),Radius); @@ -360,14 +361,15 @@ } Standard_Real R1 = C1.Radius(); Geom2dInt_TheIntConicCurveOfGInter Intp; - for (Standard_Integer jcote1 = 1 ; jcote1 <= nbrcote1 ; jcote1++) { + for (Standard_Integer jcote1 = 1; jcote1 <= nbrcote1 && NbrSol < aNbSolMAX; jcote1++) { gp_Circ2d Circ(C1.XAxis(),R1+cote1(jcote1)); IntRes2d_Domain D1(ElCLib::Value(0.,Circ), 0.,Tol, ElCLib::Value(2.*M_PI,Circ),2.*M_PI,Tol); D1.SetEquivalentParameters(0.,2.*M_PI); for (Standard_Integer jcote2 = 1 ; jcote2 <= nbrcote2 ; jcote2++) { Handle(Geom2dAdaptor_HCurve) HCu2 = new Geom2dAdaptor_HCurve(Cu2); - Adaptor2d_OffsetCurve C2(HCu2,cote2(jcote2)); + //Adaptor2d_OffsetCurve C2(HCu2,cote2(jcote2)); + Adaptor2d_OffsetCurve C2(HCu2, -cote2(jcote2)); firstparam = Max(C2.FirstParameter(),thefirst); lastparam = Min(C2.LastParameter(),thelast); IntRes2d_Domain D2(C2.Value(firstparam), firstparam, Tol, @@ -375,7 +377,7 @@ Intp.Perform(Circ,D1,C2,D2,Tol,Tol); if (Intp.IsDone()) { if (!Intp.IsEmpty()) { - for (Standard_Integer i = 1 ; i <= Intp.NbPoints() ; i++) { + for (Standard_Integer i = 1; i <= Intp.NbPoints() && NbrSol < aNbSolMAX; i++) { NbrSol++; gp_Pnt2d Center(Intp.Point(i).Value()); cirsol(NbrSol) = gp_Circ2d(gp_Ax2d(Center,dirx),Radius); @@ -497,9 +499,10 @@ ElCLib::Value(M_PI+M_PI,Circ),M_PI+M_PI,Tol); D1.SetEquivalentParameters(0.,M_PI+M_PI); Geom2dInt_TheIntConicCurveOfGInter Intp; - for (Standard_Integer jcote1 = 1 ; jcote1 <= nbrcote1 ; jcote1++) { + for (Standard_Integer jcote1 = 1; jcote1 <= nbrcote1 && NbrSol < aNbSolMAX; jcote1++) { Handle(Geom2dAdaptor_HCurve) HCu1 = new Geom2dAdaptor_HCurve(Cu1); - Adaptor2d_OffsetCurve Cu2(HCu1,cote1(jcote1)); + //Adaptor2d_OffsetCurve Cu2(HCu1,cote1(jcote1)); + Adaptor2d_OffsetCurve Cu2(HCu1,-cote1(jcote1)); firstparam = Max(Cu2.FirstParameter(),thefirst); lastparam = Min(Cu2.LastParameter(),thelast); IntRes2d_Domain D2(Cu2.Value(firstparam), firstparam, Tol, @@ -507,7 +510,7 @@ Intp.Perform(Circ,D1,Cu2,D2,Tol,Tol); if (Intp.IsDone()) { if (!Intp.IsEmpty()) { - for (Standard_Integer i = 1 ; i <= Intp.NbPoints() ; i++) { + for (Standard_Integer i = 1; i <= Intp.NbPoints() && NbrSol < aNbSolMAX; i++) { NbrSol++; gp_Pnt2d Center(Intp.Point(i).Value()); cirsol(NbrSol) = gp_Circ2d(gp_Ax2d(Center,dirx),Radius); @@ -832,16 +835,18 @@ Geom2dInt_GInter Intp; for (Standard_Integer jcote1 = 1 ; jcote1 <= nbrcote1 ; jcote1++) { Handle(Geom2dAdaptor_HCurve) HCu1 = new Geom2dAdaptor_HCurve(Cu1); - Adaptor2d_OffsetCurve C1(HCu1,cote1(jcote1)); + //Adaptor2d_OffsetCurve C1(HCu1,cote1(jcote1)); + Adaptor2d_OffsetCurve C1(HCu1, -cote1(jcote1)); #ifdef OCCT_DEBUG Standard_Real firstparam = Max(C1.FirstParameter(), thefirst); Standard_Real lastparam = Min(C1.LastParameter(), thelast); IntRes2d_Domain D2C1(C1.Value(firstparam),firstparam,Tol, C1.Value(lastparam),lastparam,Tol); #endif - for (Standard_Integer jcote2 = 1 ; jcote2 <= nbrcote2 ; jcote2++) { + for (Standard_Integer jcote2 = 1; jcote2 <= nbrcote2 && NbrSol < aNbSolMAX; jcote2++) { Handle(Geom2dAdaptor_HCurve) HCu2 = new Geom2dAdaptor_HCurve(Cu2); - Adaptor2d_OffsetCurve C2(HCu2,cote2(jcote2)); + //Adaptor2d_OffsetCurve C2(HCu2,cote2(jcote2)); + Adaptor2d_OffsetCurve C2(HCu2, -cote2(jcote2)); #ifdef OCCT_DEBUG firstparam = Max(C2.FirstParameter(), thefirst); lastparam = Min(C2.LastParameter(),thelast); @@ -853,7 +858,7 @@ if (!Intp.IsEmpty()) { const Standard_Real aSQApproxTol = Precision::Approximation() * Precision::Approximation(); - for (Standard_Integer i = 1 ; i <= Intp.NbPoints() ; i++) + for (Standard_Integer i = 1; i <= Intp.NbPoints() && NbrSol < aNbSolMAX; i++) { Standard_Real aU0 = Intp.Point(i).ParamOnFirst(); Standard_Real aV0 = Intp.Point(i).ParamOnSecond(); diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d3Tan.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d3Tan.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d3Tan.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d3Tan.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -248,22 +248,22 @@ const Standard_Real Tolerance , const Standard_Real Param1 , const Standard_Real Param2 ): - cirsol(1,16) , - qualifier1(1,16), - qualifier2(1,16), - qualifier3(1,16), - TheSame1(1,16) , - TheSame2(1,16) , - TheSame3(1,16) , - pnttg1sol(1,16), - pnttg2sol(1,16), - pnttg3sol(1,16), - par1sol(1,16) , - par2sol(1,16) , - par3sol(1,16) , - pararg1(1,16) , - pararg2(1,16) , - pararg3(1,16) + cirsol(1,20) , + qualifier1(1,20), + qualifier2(1,20), + qualifier3(1,20), + TheSame1(1,20) , + TheSame2(1,20) , + TheSame3(1,20) , + pnttg1sol(1,20), + pnttg2sol(1,20), + pnttg3sol(1,20), + par1sol(1,20) , + par2sol(1,20) , + par3sol(1,20) , + pararg1(1,20) , + pararg2(1,20) , + pararg3(1,20) { Geom2dAdaptor_Curve C1 = Qualified1.Qualified(); Geom2dAdaptor_Curve C2 = Qualified2.Qualified(); diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d3TanIter.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d3TanIter.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d3TanIter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2d3TanIter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -63,6 +63,9 @@ Standard_Real Tol = Abs(Tolerance); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; + qualifier3 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -187,6 +190,9 @@ Standard_Real Tol = Abs(Tolerance); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; + qualifier3 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -316,6 +322,9 @@ Standard_Real Tol = Abs(Tolerance); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; + qualifier3 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -448,6 +457,9 @@ Standard_Real Tol = Abs(Tolerance); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; + qualifier3 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -580,6 +592,9 @@ Standard_Real Tol = Abs(Tolerance); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; + qualifier3 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || @@ -705,6 +720,9 @@ Standard_Real Tol = Abs(Tolerance); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; + qualifier3 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -820,6 +838,9 @@ Standard_Real Tol = Abs(Tolerance); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; + qualifier3 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified())) { throw GccEnt_BadQualifier(); @@ -929,6 +950,9 @@ Standard_Real Tol = Abs(Tolerance); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; + qualifier3 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -1048,6 +1072,9 @@ Standard_Real Tol = Abs(Tolerance); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; + qualifier3 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || @@ -1177,6 +1204,9 @@ Standard_Real Tol = Abs(Tolerance); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; + qualifier3 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2dTanOnRadGeo.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2dTanOnRadGeo.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2dTanOnRadGeo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Circ2dTanOnRadGeo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,6 +44,8 @@ #include #include +static const Standard_Integer aNbSolMAX = 8; + //========================================================================= // Cercle tangent : a un cercle Qualified1 (C1). + // centre : sur une droite OnLine. + @@ -70,14 +72,14 @@ // Initialisation des champs. + //========================================================================= -cirsol(1,8) , -qualifier1(1,8) , -TheSame1(1,8) , -pnttg1sol(1,8) , -pntcen3(1,8) , -par1sol(1,8) , -pararg1(1,8) , -parcen3(1,8) +cirsol(1,aNbSolMAX) , +qualifier1(1,aNbSolMAX) , +TheSame1(1,aNbSolMAX) , +pnttg1sol(1,aNbSolMAX) , +pntcen3(1,aNbSolMAX) , +par1sol(1,aNbSolMAX) , +pararg1(1,aNbSolMAX) , +parcen3(1,aNbSolMAX) { //========================================================================= @@ -123,7 +125,8 @@ Geom2dInt_TheIntConicCurveOfGInter Intp; for (Standard_Integer jcote1 = 1 ; jcote1 <= nbrcote1 ; jcote1++) { Handle(Geom2dAdaptor_HCurve) HCu1 = new Geom2dAdaptor_HCurve(Cu1); - Adaptor2d_OffsetCurve C2(HCu1,Coef(jcote1)); + //Adaptor2d_OffsetCurve C2(HCu1,Coef(jcote1)); + Adaptor2d_OffsetCurve C2(HCu1, -Coef(jcote1)); firstparam = Max(C2.FirstParameter(),thefirst); lastparam = Min(C2.LastParameter(),thelast); IntRes2d_Domain D2(C2.Value(firstparam), firstparam, Tol, @@ -131,7 +134,7 @@ Intp.Perform(OnLine,D1,C2,D2,Tol,Tol); if (Intp.IsDone()) { if (!Intp.IsEmpty()) { - for (Standard_Integer i = 1 ; i <= Intp.NbPoints() ; i++) { + for (Standard_Integer i = 1 ; i <= Intp.NbPoints() && NbrSol < aNbSolMAX; i++) { NbrSol++; gp_Pnt2d Center(Intp.Point(i).Value()); cirsol(NbrSol) = gp_Circ2d(gp_Ax2d(Center,dirx),Radius); @@ -179,14 +182,14 @@ // Initialisation des champs. + //========================================================================= -cirsol(1,8) , -qualifier1(1,8) , -TheSame1(1,8) , -pnttg1sol(1,8) , -pntcen3(1,8) , -par1sol(1,8) , -pararg1(1,8) , -parcen3(1,8) +cirsol(1,aNbSolMAX) , +qualifier1(1,aNbSolMAX) , +TheSame1(1,aNbSolMAX) , +pnttg1sol(1,aNbSolMAX) , +pntcen3(1,aNbSolMAX) , +par1sol(1,aNbSolMAX) , +pararg1(1,aNbSolMAX) , +parcen3(1,aNbSolMAX) { //========================================================================= @@ -236,7 +239,8 @@ Geom2dInt_TheIntConicCurveOfGInter Intp; for (Standard_Integer jcote1 = 1 ; jcote1 <= nbrcote1 ; jcote1++) { Handle(Geom2dAdaptor_HCurve) HCu1 = new Geom2dAdaptor_HCurve(Cu1); - Adaptor2d_OffsetCurve C2(HCu1,cote1(jcote1)); + //Adaptor2d_OffsetCurve C2(HCu1,cote1(jcote1)); + Adaptor2d_OffsetCurve C2(HCu1, -cote1(jcote1)); firstparam = Max(C2.FirstParameter(),thefirst); lastparam = Min(C2.LastParameter(),thelast); IntRes2d_Domain D2(C2.Value(firstparam),firstparam,Tol, @@ -244,7 +248,7 @@ Intp.Perform(OnCirc,D1,C2,D2,Tol,Tol); if (Intp.IsDone()) { if (!Intp.IsEmpty()) { - for (Standard_Integer i = 1 ; i <= Intp.NbPoints() ; i++) { + for (Standard_Integer i = 1 ; i <= Intp.NbPoints() && NbrSol < aNbSolMAX; i++) { NbrSol++; gp_Pnt2d Center(Intp.Point(i).Value()); cirsol(NbrSol) = gp_Circ2d(gp_Ax2d(Center,dirx),Radius); @@ -292,14 +296,14 @@ // Initialisation des champs. + //========================================================================= -cirsol(1,8) , -qualifier1(1,8) , -TheSame1(1,8) , -pnttg1sol(1,8) , -pntcen3(1,8) , -par1sol(1,8) , -pararg1(1,8) , -parcen3(1,8) +cirsol(1,aNbSolMAX) , +qualifier1(1,aNbSolMAX) , +TheSame1(1,aNbSolMAX) , +pnttg1sol(1,aNbSolMAX) , +pntcen3(1,aNbSolMAX) , +par1sol(1,aNbSolMAX) , +pararg1(1,aNbSolMAX) , +parcen3(1,aNbSolMAX) { //========================================================================= @@ -358,7 +362,7 @@ Intp.Perform(Circ,D1,OnCurv,D2,Tol,Tol); if (Intp.IsDone()) { if (!Intp.IsEmpty()) { - for (Standard_Integer i = 1 ; i <= Intp.NbPoints() ; i++) { + for (Standard_Integer i = 1 ; i <= Intp.NbPoints() && NbrSol < aNbSolMAX; i++) { NbrSol++; gp_Pnt2d Center(Intp.Point(i).Value()); cirsol(NbrSol) = gp_Circ2d(gp_Ax2d(Center,dirx),Radius); @@ -416,14 +420,14 @@ // Initialisation des champs. + //========================================================================= -cirsol(1,8) , -qualifier1(1,8) , -TheSame1(1,8) , -pnttg1sol(1,8) , -pntcen3(1,8) , -par1sol(1,8) , -pararg1(1,8) , -parcen3(1,8) +cirsol(1,aNbSolMAX) , +qualifier1(1,aNbSolMAX) , +TheSame1(1,aNbSolMAX) , +pnttg1sol(1,aNbSolMAX) , +pntcen3(1,aNbSolMAX) , +par1sol(1,aNbSolMAX) , +pararg1(1,aNbSolMAX) , +parcen3(1,aNbSolMAX) { //========================================================================= @@ -482,7 +486,7 @@ Intp.Perform(Line,D1,OnCurv,D2,Tol,Tol); if (Intp.IsDone()) { if (!Intp.IsEmpty()) { - for (Standard_Integer i = 1 ; i <= Intp.NbPoints() ; i++) { + for (Standard_Integer i = 1 ; i <= Intp.NbPoints() && NbrSol < aNbSolMAX; i++) { NbrSol++; gp_Pnt2d Center(Intp.Point(i).Value()); cirsol(NbrSol) = gp_Circ2d(gp_Ax2d(Center,dirx),Radius); @@ -537,14 +541,14 @@ // Initialisation des champs. + //========================================================================= -cirsol(1,8) , -qualifier1(1,8) , -TheSame1(1,8) , -pnttg1sol(1,8) , -pntcen3(1,8) , -par1sol(1,8) , -pararg1(1,8) , -parcen3(1,8) +cirsol(1,aNbSolMAX) , +qualifier1(1,aNbSolMAX) , +TheSame1(1,aNbSolMAX) , +pnttg1sol(1,aNbSolMAX) , +pntcen3(1,aNbSolMAX) , +par1sol(1,aNbSolMAX) , +pararg1(1,aNbSolMAX) , +parcen3(1,aNbSolMAX) { //========================================================================= @@ -591,7 +595,8 @@ Geom2dInt_GInter Intp; for (Standard_Integer jcote1 = 1 ; jcote1 <= nbrcote1 ; jcote1++) { Handle(Geom2dAdaptor_HCurve) HCu1 = new Geom2dAdaptor_HCurve(Cu1); - Adaptor2d_OffsetCurve C1(HCu1,cote1(jcote1)); + //Adaptor2d_OffsetCurve C1(HCu1,cote1(jcote1)); + Adaptor2d_OffsetCurve C1(HCu1, -cote1(jcote1)); firstparam = Max(C1.FirstParameter(),thefirst); lastparam = Min(C1.LastParameter(),thelast); IntRes2d_Domain D1(C1.Value(firstparam), firstparam, Tol, @@ -605,7 +610,7 @@ Intp.Perform(C1,D1,C2,D2,Tol,Tol); if (Intp.IsDone()) { if (!Intp.IsEmpty()) { - for (Standard_Integer i = 1 ; i <= Intp.NbPoints() ; i++) { + for (Standard_Integer i = 1 ; i <= Intp.NbPoints() && NbrSol < aNbSolMAX; i++) { NbrSol++; gp_Pnt2d Center(Intp.Point(i).Value()); cirsol(NbrSol) = gp_Circ2d(gp_Ax2d(Center,dirx),Radius); @@ -653,14 +658,14 @@ // Initialisation des champs. + //========================================================================= -cirsol(1,8) , -qualifier1(1,8) , -TheSame1(1,8) , -pnttg1sol(1,8) , -pntcen3(1,8) , -par1sol(1,8) , -pararg1(1,8) , -parcen3(1,8) +cirsol(1,aNbSolMAX) , +qualifier1(1,aNbSolMAX) , +TheSame1(1,aNbSolMAX) , +pnttg1sol(1,aNbSolMAX) , +pntcen3(1,aNbSolMAX) , +par1sol(1,aNbSolMAX) , +pararg1(1,aNbSolMAX) , +parcen3(1,aNbSolMAX) { //========================================================================= @@ -692,7 +697,7 @@ Geom2dInt_TheIntConicCurveOfGInter Intp(Circ,D1,OnCurv,D2,Tol,Tol); if (Intp.IsDone()) { if (!Intp.IsEmpty()) { - for (Standard_Integer i = 1 ; i <= Intp.NbPoints() ; i++) { + for (Standard_Integer i = 1 ; i <= Intp.NbPoints() && NbrSol < aNbSolMAX; i++) { NbrSol++; gp_Pnt2d Center(Intp.Point(i).Value()); cirsol(NbrSol) = gp_Circ2d(gp_Ax2d(Center,dirx),Radius); diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2d2TanIter.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2d2TanIter.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2d2TanIter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2d2TanIter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,10 +46,13 @@ par1sol = 0.; pararg1 = 0.; - + par2sol = 0.0; + pararg2 = 0.0; //Standard_Real Tol = Abs(Tolang); WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (Qualified1.IsEnclosed()) { throw GccEnt_BadQualifier(); } gp_Circ2d C1 = Qualified1.Qualified(); Geom2dAdaptor_Curve Cu2 = Qualified2.Qualified(); @@ -122,7 +125,11 @@ const Standard_Real Tolang ) { par1sol = 0.; pararg1 = 0.; + par2sol = 0.0; + pararg2 = 0.0; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified()) || !(Qualified2.IsEnclosed() || Qualified2.IsEnclosing() || @@ -196,7 +203,11 @@ par1sol = 0.; pararg1 = 0.; + par2sol = 0.0; + pararg2 = 0.0; WellDone = Standard_False; + qualifier1 = GccEnt_noqualifier; + qualifier2 = GccEnt_noqualifier; if (!(Qualified1.IsEnclosed() || Qualified1.IsEnclosing() || Qualified1.IsOutside() || Qualified1.IsUnqualified())) { throw GccEnt_BadQualifier(); diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2dTanObl.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2dTanObl.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2dTanObl.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2dTanObl.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,6 +37,7 @@ const gp_Lin2d& TheLine , const Standard_Real TolAng , const Standard_Real Angle ): + Paral2(Standard_False), linsol(1,2) , qualifier1(1,2), pnttg1sol(1,2) , @@ -44,7 +45,7 @@ par1sol(1,2) , par2sol(1,2) , pararg1(1,2) , - pararg2(1,2) + pararg2(1,2) { Geom2dAdaptor_Curve C1 = Qualified1.Qualified(); Handle(Geom2d_Curve) CC1 = C1.Curve(); @@ -102,6 +103,7 @@ const Standard_Real TolAng , const Standard_Real Param1 , const Standard_Real Angle ): + Paral2(Standard_False), linsol(1,2) , qualifier1(1,2), pnttg1sol(1,2) , @@ -109,7 +111,7 @@ par1sol(1,2) , par2sol(1,2) , pararg1(1,2) , - pararg2(1,2) + pararg2(1,2) { Geom2dAdaptor_Curve C1 = Qualified1.Qualified(); Handle(Geom2d_Curve) CC1 = C1.Curve(); diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2dTanOblIter.cxx opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2dTanOblIter.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2dTanOblIter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dGcc/Geom2dGcc_Lin2dTanOblIter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,6 +41,8 @@ const Standard_Real Param1 , const Standard_Real TolAng , const Standard_Real Angle ) +: par2sol(0.0), + pararg2(0.0) { par1sol = 0.; diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Element.cxx opencascade-7.5.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Element.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Element.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Element.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,17 +14,9 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -//======================================================================= -// Function : Geom2dHatch_Element -// Purpose : Magic Constructor. -//======================================================================= - -#include #include -Geom2dHatch_Element::Geom2dHatch_Element (const Geom2dHatch_Element& Other) -: myCurve(Other.myCurve), myOrientation(Other.myOrientation) { -} +#include //======================================================================= // Function : Geom2dHatch_Element diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Element.hxx opencascade-7.5.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Element.hxx --- opencascade-7.4.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Element.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Element.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,10 +35,7 @@ Standard_EXPORT Geom2dHatch_Element(); - - //! Magic constructor. - Standard_EXPORT Geom2dHatch_Element(const Geom2dHatch_Element& Other); - + //! Creates an element. Standard_EXPORT Geom2dHatch_Element(const Geom2dAdaptor_Curve& Curve, const TopAbs_Orientation Orientation = TopAbs_FORWARD); diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Elements.cxx opencascade-7.5.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Elements.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Elements.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Elements.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,8 +28,17 @@ #include #include #include +#include + +static const Standard_Real Probing_Start = 0.123; +static const Standard_Real Probing_End = 0.8; +static const Standard_Real Probing_Step = 0.2111; Geom2dHatch_Elements::Geom2dHatch_Elements(const Geom2dHatch_Elements& ) +: NumWire(0), + NumEdge(0), + myCurEdge(0), + myCurEdgePar(0.0) { #ifdef OCCT_DEBUG std::cout<<" Magic Constructor in Geom2dHatch_Elements:: "<ChangeFind(Itertemp.Key()); + Geom2dHatch_Element& Item = ((Geom2dHatch_MapOfElements*)ptrmyMap)->ChangeFind (Itertemp.Key()); Geom2dAdaptor_Curve& E = Item.ChangeCurve(); - TopAbs_Orientation Or= Item.Orientation(); - gp_Pnt2d P2 = E.Value - ((E.FirstParameter() + E.LastParameter()) *0.5); - if ((Or == TopAbs_FORWARD) || - (Or == TopAbs_REVERSED)) { - gp_Vec2d V(P,P2); - Par = V.Magnitude(); - if (Par >= gp::Resolution()) { - L = gp_Lin2d(P,V); - myCurEdge++; - return Standard_True; + TopAbs_Orientation Or = Item.Orientation(); + if (Or == TopAbs_FORWARD || Or == TopAbs_REVERSED) + { + Standard_Real aFPar = E.FirstParameter(), aLPar = E.LastParameter(); + if (Precision::IsNegativeInfinite (aFPar)) + { + if (Precision::IsPositiveInfinite (aLPar)) + { + aFPar = -1.; + aLPar = 1.; + } + else + aFPar = aLPar - 1.; } - } - } + else if (Precision::IsPositiveInfinite (aLPar)) + aLPar = aFPar + 1.; - if (i == myCurEdge + 1) { - Par = RealLast(); - L = gp_Lin2d(P,gp_Dir2d(1,0)); + for (; myCurEdgePar < Probing_End; myCurEdgePar += Probing_Step) + { + Standard_Real aParam = myCurEdgePar * aFPar + (1. - myCurEdgePar) * aLPar; + gp_Vec2d aTanVec; + gp_Pnt2d aPOnC; + E.D1 (aParam, aPOnC, aTanVec); + gp_Vec2d aLinVec (P, aPOnC); + Par = aLinVec.SquareMagnitude(); + if (Par > Precision::SquarePConfusion()) + { + gp_Dir2d aLinDir (aLinVec); + Standard_Real aTanMod = aTanVec.SquareMagnitude(); + if (aTanMod < Precision::SquarePConfusion()) + continue; + + aTanVec /= Sqrt (aTanMod); + Standard_Real aSinA = aTanVec.Crossed (aLinDir); + if (Abs (aSinA) < 0.001) + { + // too small angle - line and edge may be considered + // as tangent which is bad for classifier + if (myCurEdgePar + Probing_Step < Probing_End) + continue; + } + + L = gp_Lin2d (P, aLinDir); + + aPOnC = E.Value (aFPar); + if (L.SquareDistance (aPOnC) > Precision::SquarePConfusion()) + { + aPOnC = E.Value (aLPar); + if (L.SquareDistance (aPOnC) > Precision::SquarePConfusion()) + { + myCurEdgePar += Probing_Step; + if (myCurEdgePar >= Probing_End) + { + myCurEdge++; + myCurEdgePar = Probing_Start; + } + Par = Sqrt (Par); + return Standard_True; + } + } + } + } + } myCurEdge++; - - return Standard_True; + myCurEdgePar = Probing_Start; } + Par = RealLast(); + L = gp_Lin2d (P, gp_Dir2d (1, 0)); + return Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Elements.hxx opencascade-7.5.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Elements.hxx --- opencascade-7.4.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Elements.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Elements.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -114,7 +114,7 @@ Standard_Integer NumWire; Standard_Integer NumEdge; Standard_Integer myCurEdge; - + Standard_Real myCurEdgePar; }; diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Hatching.cxx opencascade-7.5.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Hatching.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Hatching.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dHatch/Geom2dHatch_Hatching.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,7 +31,12 @@ // Purpose : Constructor. //======================================================================= -Geom2dHatch_Hatching::Geom2dHatch_Hatching () { +Geom2dHatch_Hatching::Geom2dHatch_Hatching () +: myTrimDone(Standard_False), + myTrimFailed(Standard_False), + myIsDone(Standard_False), + myStatus(HatchGen_NoProblem) +{ } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dLProp/Geom2dLProp_CurAndInf2d.cxx opencascade-7.5.1+dfsg1/src/Geom2dLProp/Geom2dLProp_CurAndInf2d.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dLProp/Geom2dLProp_CurAndInf2d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dLProp/Geom2dLProp_CurAndInf2d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,6 +32,7 @@ //purpose : //======================================================================= Geom2dLProp_CurAndInf2d::Geom2dLProp_CurAndInf2d() +: isDone(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/Geom2dLProp/Geom2dLProp_NumericCurInf2d.cxx opencascade-7.5.1+dfsg1/src/Geom2dLProp/Geom2dLProp_NumericCurInf2d.cxx --- opencascade-7.4.1+dfsg1/src/Geom2dLProp/Geom2dLProp_NumericCurInf2d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Geom2dLProp/Geom2dLProp_NumericCurInf2d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,6 +30,7 @@ //purpose : //======================================================================= Geom2dLProp_NumericCurInf2d::Geom2dLProp_NumericCurInf2d() +: isDone(Standard_False) { } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/GeomAbs/FILES opencascade-7.5.1+dfsg1/src/GeomAbs/FILES --- opencascade-7.4.1+dfsg1/src/GeomAbs/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomAbs/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,9 +1,6 @@ GeomAbs_BSplKnotDistribution.hxx -GeomAbs_CurveForm.hxx GeomAbs_CurveType.hxx GeomAbs_IsoType.hxx GeomAbs_JoinType.hxx GeomAbs_Shape.hxx -GeomAbs_SurfaceForm.hxx GeomAbs_SurfaceType.hxx -GeomAbs_UVSense.hxx diff -Nru opencascade-7.4.1+dfsg1/src/GeomAbs/GeomAbs_CurveForm.hxx opencascade-7.5.1+dfsg1/src/GeomAbs/GeomAbs_CurveForm.hxx --- opencascade-7.4.1+dfsg1/src/GeomAbs/GeomAbs_CurveForm.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomAbs/GeomAbs_CurveForm.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -// Created on: 1993-02-22 -// Created by: Modelistation -// Copyright (c) 1993-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _GeomAbs_CurveForm_HeaderFile -#define _GeomAbs_CurveForm_HeaderFile - - -//! This enumeration is used to note specific curve form. -enum GeomAbs_CurveForm -{ -GeomAbs_PolylineForm, -GeomAbs_CircularForm, -GeomAbs_EllipticForm, -GeomAbs_HyperbolicForm, -GeomAbs_ParabolicForm, -GeomAbs_OtherCurveForm -}; - -#endif // _GeomAbs_CurveForm_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/GeomAbs/GeomAbs_SurfaceForm.hxx opencascade-7.5.1+dfsg1/src/GeomAbs/GeomAbs_SurfaceForm.hxx --- opencascade-7.4.1+dfsg1/src/GeomAbs/GeomAbs_SurfaceForm.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomAbs/GeomAbs_SurfaceForm.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -// Created on: 1993-02-22 -// Created by: Modelistation -// Copyright (c) 1993-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _GeomAbs_SurfaceForm_HeaderFile -#define _GeomAbs_SurfaceForm_HeaderFile - - -//! This enumeration is used to note specific surface form. -enum GeomAbs_SurfaceForm -{ -GeomAbs_PlanarForm, -GeomAbs_ConicalForm, -GeomAbs_CylindricalForm, -GeomAbs_ToroidalForm, -GeomAbs_SphericalForm, -GeomAbs_RevolutionForm, -GeomAbs_RuledForm, -GeomAbs_QuadricForm, -GeomAbs_OtherSurfaceForm -}; - -#endif // _GeomAbs_SurfaceForm_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/GeomAbs/GeomAbs_UVSense.hxx opencascade-7.5.1+dfsg1/src/GeomAbs/GeomAbs_UVSense.hxx --- opencascade-7.4.1+dfsg1/src/GeomAbs/GeomAbs_UVSense.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomAbs/GeomAbs_UVSense.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -// Created on: 1993-02-22 -// Created by: Modelistation -// Copyright (c) 1993-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _GeomAbs_UVSense_HeaderFile -#define _GeomAbs_UVSense_HeaderFile - - -//! This enumeration is used in the class RectangularTrimmedSurface -//! to compare the orientation of the basic surface and the orientation -//! of the trimmed surface and in the class ElementarySurface to know -//! the direction of parametrization by comparison with the default -//! construction mode. -enum GeomAbs_UVSense -{ -GeomAbs_SameUV, -GeomAbs_SameU, -GeomAbs_SameV, -GeomAbs_OppositeUV -}; - -#endif // _GeomAbs_UVSense_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaCurveCurve.cxx opencascade-7.5.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaCurveCurve.cxx --- opencascade-7.4.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaCurveCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaCurveCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,9 +31,13 @@ //purpose : //======================================================================= GeomAPI_ExtremaCurveCurve::GeomAPI_ExtremaCurveCurve() +: myIsDone(Standard_False), + myIndex(0), + myTotalExt(Standard_False), + myIsInfinite(Standard_False), + myTotalDist(0.0) { - myIsDone = Standard_False; - myTotalExt = Standard_False; + memset (myTotalPars, 0, sizeof (myTotalPars)); } diff -Nru opencascade-7.4.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaCurveSurface.cxx opencascade-7.5.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaCurveSurface.cxx --- opencascade-7.4.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaCurveSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaCurveSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,9 @@ //purpose : //======================================================================= GeomAPI_ExtremaCurveSurface::GeomAPI_ExtremaCurveSurface() +: myIsDone(Standard_False), + myIndex(0) { - myIsDone = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaSurfaceSurface.cxx opencascade-7.5.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaSurfaceSurface.cxx --- opencascade-7.4.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaSurfaceSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomAPI/GeomAPI_ExtremaSurfaceSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,8 +30,9 @@ //purpose : //======================================================================= GeomAPI_ExtremaSurfaceSurface::GeomAPI_ExtremaSurfaceSurface() +: myIsDone(Standard_False), + myIndex(0) { - myIsDone = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/GeomAPI/GeomAPI_ProjectPointOnCurve.cxx opencascade-7.5.1+dfsg1/src/GeomAPI/GeomAPI_ProjectPointOnCurve.cxx --- opencascade-7.4.1+dfsg1/src/GeomAPI/GeomAPI_ProjectPointOnCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomAPI/GeomAPI_ProjectPointOnCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,8 +28,9 @@ //purpose : //======================================================================= GeomAPI_ProjectPointOnCurve::GeomAPI_ProjectPointOnCurve() +: myIsDone(Standard_False), + myIndex(0) { - myIsDone = Standard_False; } //======================================================================= //function : GeomAPI_ProjectPointOnCurve diff -Nru opencascade-7.4.1+dfsg1/src/GeomAPI/GeomAPI_ProjectPointOnSurf.cxx opencascade-7.5.1+dfsg1/src/GeomAPI/GeomAPI_ProjectPointOnSurf.cxx --- opencascade-7.4.1+dfsg1/src/GeomAPI/GeomAPI_ProjectPointOnSurf.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomAPI/GeomAPI_ProjectPointOnSurf.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,10 @@ //purpose : //======================================================================= GeomAPI_ProjectPointOnSurf::GeomAPI_ProjectPointOnSurf() -: myIsDone (Standard_False) { } +: myIsDone (Standard_False), + myIndex(0) +{ +} //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/GeomConvert/GeomConvert_1.cxx opencascade-7.5.1+dfsg1/src/GeomConvert/GeomConvert_1.cxx --- opencascade-7.4.1+dfsg1/src/GeomConvert/GeomConvert_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomConvert/GeomConvert_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -76,8 +76,7 @@ //purpose : //======================================================================= -Handle(Geom_BSplineSurface) BSplineSurfaceBuilder - (const Convert_ElementarySurfaceToBSplineSurface& Convert) +static Handle(Geom_BSplineSurface) BSplineSurfaceBuilder (const Convert_ElementarySurfaceToBSplineSurface& Convert) { Handle(Geom_BSplineSurface) TheSurface; Standard_Integer UDegree = Convert.UDegree (); diff -Nru opencascade-7.4.1+dfsg1/src/GeometryTest/GeometryTest_APICommands.cxx opencascade-7.5.1+dfsg1/src/GeometryTest/GeometryTest_APICommands.cxx --- opencascade-7.4.1+dfsg1/src/GeometryTest/GeometryTest_APICommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeometryTest/GeometryTest_APICommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -90,7 +91,7 @@ { if ( n < 5) { - std::cout << " Use proj curve/surf x y z [{extrema algo: g(grad)/t(tree)}|{u v}]" << std::endl; + Message::SendFail() << " Use proj curve/surf x y z [{extrema algo: g(grad)/t(tree)}|{u v}]"; return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/GeometryTest/GeometryTest_ContinuityCommands.cxx opencascade-7.5.1+dfsg1/src/GeometryTest/GeometryTest_ContinuityCommands.cxx --- opencascade-7.4.1+dfsg1/src/GeometryTest/GeometryTest_ContinuityCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeometryTest/GeometryTest_ContinuityCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include /*********************************************************************************/ void InitEpsSurf(Standard_Real& epsnl,Standard_Real& epsdis, Standard_Real& epsangk1, @@ -106,7 +107,7 @@ Standard_FALLTHROUGH case 8 : break; default : - std::cerr << "Error: invalid number of arguments: expected to get 8 - 10 parameters" << std::endl; + Message::SendFail() << "Error: invalid number of arguments: expected to get 8 - 10 parameters"; return 1; } } @@ -125,7 +126,7 @@ Standard_FALLTHROUGH case 8 : break; default : - std::cerr << "Error: invalid number of arguments: expected to get 8 - 11 parameters" << std::endl; + Message::SendFail() << "Error: invalid number of arguments: expected to get 8 - 11 parameters"; return 1; } } @@ -146,13 +147,13 @@ Standard_FALLTHROUGH case 8 : break; default : - std::cerr << "Error: invalid number of arguments: expected to get 8 - 12 parameters" << std::endl; + Message::SendFail() << "Error: invalid number of arguments: expected to get 8 - 12 parameters"; return 1; } } break; default: - std::cerr << "Error: invalid value of parameter 1 (" << a[1] << "): should be 0, 1, or 2" << std::endl; + Message::SendFail() << "Error: invalid value of parameter 1 (" << a[1] << "): should be 0, 1, or 2"; return 1; } @@ -217,7 +218,7 @@ Standard_FALLTHROUGH case 8 : break; default : - std::cerr << "Error: invalid number of arguments: expected to get 8 - 11 parameters" << std::endl; + Message::SendFail() << "Error: invalid number of arguments: expected to get 8 - 11 parameters"; return 1; } } @@ -240,13 +241,13 @@ Standard_FALLTHROUGH case 8 : break; default : - std::cerr << "Error: invalid number of arguments: expected to get 8 - 13 parameters" << std::endl; + Message::SendFail() << "Error: invalid number of arguments: expected to get 8 - 13 parameters"; return 1; } } break; default: - std::cerr << "Error: invalid value of parameter 1 (" << a[1] << "): should be 1 or 2" << std::endl; + Message::SendFail() << "Error: invalid value of parameter 1 (" << a[1] << "): should be 1 or 2"; return 1; } @@ -306,7 +307,7 @@ Standard_FALLTHROUGH case 6 : break; default : - std::cerr << "Error: invalid number of arguments: expected to get 6 - 8 parameters" << std::endl; + Message::SendFail() << "Error: invalid number of arguments: expected to get 6 - 8 parameters"; return 1; } } @@ -330,14 +331,14 @@ Standard_FALLTHROUGH case 6 : break; default : - std::cerr << "Error: invalid number of arguments: expected to get 6 - 12 parameters" << std::endl; + Message::SendFail() << "Error: invalid number of arguments: expected to get 6 - 12 parameters"; return 1; } } break; default: - std::cerr << "Error: invalid value of parameter 1 (" << a[1] << "): should be 1 or 2" << std::endl; + Message::SendFail() << "Error: invalid value of parameter 1 (" << a[1] << "): should be 1 or 2"; return 1; } @@ -395,7 +396,7 @@ Standard_FALLTHROUGH case 6 : break; default : - std::cerr << "Error: invalid number of arguments: expected to get 6 - 8 parameters" << std::endl; + Message::SendFail() << "Error: invalid number of arguments: expected to get 6 - 8 parameters"; return 1; } } @@ -413,7 +414,7 @@ Standard_FALLTHROUGH case 6 : break; default : - std::cerr << "Error: invalid number of arguments: expected to get 6 - 9 parameters" << std::endl; + Message::SendFail() << "Error: invalid number of arguments: expected to get 6 - 9 parameters"; return 1; } } @@ -434,14 +435,14 @@ Standard_FALLTHROUGH case 6 : break; default : - std::cerr << "Error: invalid number of arguments: expected to get 6 - 10 parameters" << std::endl; + Message::SendFail() << "Error: invalid number of arguments: expected to get 6 - 10 parameters"; return 1; } } break; default: - std::cerr << "Error: invalid value of parameter 1 (" << a[1] << "): should be 0, 1, or 2" << std::endl; + Message::SendFail() << "Error: invalid value of parameter 1 (" << a[1] << "): should be 0, 1, or 2"; return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/GeometryTest/GeometryTest_CurveCommands.cxx opencascade-7.5.1+dfsg1/src/GeometryTest/GeometryTest_CurveCommands.cxx --- opencascade-7.4.1+dfsg1/src/GeometryTest/GeometryTest_CurveCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeometryTest/GeometryTest_CurveCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -98,7 +98,7 @@ #include #include #include - +#include #include @@ -367,9 +367,8 @@ return 0; } else { - Approx_CurveOnSurface appr(HPCur, hsur, Udeb, Ufin, myTol3d, - myContinuity, myMaxDegree, myMaxSeg, - Only3d, Only2d); + Approx_CurveOnSurface appr(HPCur, hsur, Udeb, Ufin, myTol3d); + appr.Perform(myMaxSeg, myMaxDegree, myContinuity, Only3d, Only2d); if(!Only3d) { PCur2d = appr.Curve2d(); di << " Error in 2d is " << appr.MaxError2dU() @@ -945,7 +944,7 @@ TopoDS_Wire aWire = TopoDS::Wire(DBRep::Get(a[2], TopAbs_WIRE)); if (aWire.IsNull()) { - std::cout << "cannot evaluate the argument " << a[2] << " as a curve" << std::endl; + Message::SendFail() << "cannot evaluate the argument " << a[2] << " as a curve"; return 1; } BRepAdaptor_CompCurve aCompCurve(aWire); @@ -1008,7 +1007,7 @@ static Standard_Integer crvtpoints (Draw_Interpretor& di, Standard_Integer n, const char** a) { - Standard_Integer i, nbp; + Standard_Integer i, nbp, aMinPntsNb = 2; Standard_Real defl, angle = Precision::Angular(); Handle(Adaptor3d_HCurve) aHCurve; @@ -1019,7 +1018,7 @@ TopoDS_Wire aWire = TopoDS::Wire(DBRep::Get(a[2], TopAbs_WIRE)); if (aWire.IsNull()) { - std::cout << "cannot evaluate the argument " << a[2] << " as a curve" << std::endl; + Message::SendFail() << "cannot evaluate the argument " << a[2] << " as a curve"; return 1; } BRepAdaptor_CompCurve aCompCurve(aWire); @@ -1031,10 +1030,13 @@ } defl = Draw::Atof(a[3]); - if(n > 3) + if(n > 4) angle = Draw::Atof(a[4]); - GCPnts_TangentialDeflection PntGen(aHCurve->Curve(), angle, defl, 2); + if(n > 5) + aMinPntsNb = Draw::Atoi (a[5]); + + GCPnts_TangentialDeflection PntGen(aHCurve->Curve(), angle, defl, aMinPntsNb); nbp = PntGen.NbPoints(); di << "Nb points : " << nbp << "\n"; diff -Nru opencascade-7.4.1+dfsg1/src/GeometryTest/GeometryTest_CurveTanCommands.cxx opencascade-7.5.1+dfsg1/src/GeometryTest/GeometryTest_CurveTanCommands.cxx --- opencascade-7.4.1+dfsg1/src/GeometryTest/GeometryTest_CurveTanCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeometryTest/GeometryTest_CurveTanCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -37,7 +38,7 @@ { if (theArgsNb < 5) { - std::cout << "Error: wrong number of arguments.\n"; + Message::SendFail() << "Error: wrong number of argument"; return 1; } @@ -61,7 +62,7 @@ { if (theArgsNb < 6) { - std::cout << "Error: wrong number of arguments.\n"; + Message::SendFail() << "Error: wrong number of arguments"; return 1; } aResult2d = new Geom2d_Line (gp_Pnt2d (Draw::Atof (theArgVec[2]), Draw::Atof (theArgVec[3])), @@ -71,7 +72,7 @@ } else { - std::cout << "Error: wrong command name.\n"; + Message::SendFail() << "Error: wrong command name"; return 1; } @@ -95,7 +96,7 @@ { if (!theCirTan3.IsDone()) { - std::cout << "GccAna_Circ2d3Tan is not done"; + Message::SendFail() << "GccAna_Circ2d3Tan is not done"; return 1; } @@ -159,7 +160,7 @@ { if (theArgsNb < 5) { - std::cout << "Error: wrong number of arguments.\n"; + Message::SendFail() << "Error: wrong number of arguments"; return 1; } @@ -183,7 +184,7 @@ { if (!anIsPoint1 || !anIsPoint2 || !anIsPoint3) { - std::cout << "Error: wrong points definition.\n"; + Message::SendFail() << "Error: wrong points definition"; return 1; } GccAna_Circ2d3Tan aCircBuilder (aPoint1, aPoint2, aPoint3, aTolerance); @@ -195,7 +196,7 @@ { if (!anIsPoint2 || !anIsPoint3) { - std::cout << "Error: wrong points definition.\n"; + Message::SendFail() << "Error: wrong points definition"; return 1; } Geom2dAdaptor_Curve anAdaptorCurve1 (aQCurve1->GetCurve()); @@ -211,7 +212,7 @@ GccAna_Circ2d3Tan aCircBuilder (aQualifiedLin1, aPoint2, aPoint3, aTolerance); return solutions (theDI, aCircBuilder, theArgVec[1]); } - std::cout << "Error: wrong curve type.\n"; + Message::SendFail() << "Error: wrong curve type"; return 1; } @@ -220,7 +221,7 @@ { if (!anIsPoint3) { - std::cout << "Error: wrong point definition.\n"; + Message::SendFail() << "Error: wrong point definition"; return 1; } Geom2dAdaptor_Curve anAdaptorCurve1 (aQCurve1->GetCurve()); @@ -246,7 +247,7 @@ GccAna_Circ2d3Tan aCircBuilder (aQualifiedLin1, aQualifiedLin2, aPoint3, aTolerance); return solutions (theDI, aCircBuilder, theArgVec[1]); } - std::cout << "Error: wrong curve type.\n"; + Message::SendFail() << "Error: wrong curve type"; return 1; } @@ -292,7 +293,7 @@ return solutions (theDI, aCircBuilder, theArgVec[1]); } - std::cout << "Error: wrong curve type.\n"; + Message::SendFail() << "Error: wrong curve type"; return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_BezierCurves.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_BezierCurves.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_BezierCurves.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_BezierCurves.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,7 +42,7 @@ // the geometry of the curve. // Only the length of the derivatives are changed. //======================================================================= -void SetSameWeights(TColStd_Array1OfReal& W1, +static void SetSameWeights(TColStd_Array1OfReal& W1, TColStd_Array1OfReal& W2, TColStd_Array1OfReal& W3, TColStd_Array1OfReal& W4 ) @@ -98,7 +98,7 @@ // CC1 = C1 //======================================================================= -Standard_Boolean Arrange(const Handle(Geom_BezierCurve)& C1, +static Standard_Boolean Arrange(const Handle(Geom_BezierCurve)& C1, const Handle(Geom_BezierCurve)& C2, const Handle(Geom_BezierCurve)& C3, const Handle(Geom_BezierCurve)& C4, diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_BSplineCurves.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_BSplineCurves.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_BSplineCurves.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_BSplineCurves.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,7 +48,7 @@ // ----->----- // CC1 = C1 //======================================================================= -Standard_Boolean Arrange(const Handle(Geom_BSplineCurve)& C1, +static Standard_Boolean Arrange(const Handle(Geom_BSplineCurve)& C1, const Handle(Geom_BSplineCurve)& C2, const Handle(Geom_BSplineCurve)& C3, const Handle(Geom_BSplineCurve)& C4, @@ -103,7 +103,7 @@ //purpose : Internal Use Only //======================================================================= -Standard_Integer SetSameDistribution(Handle(Geom_BSplineCurve)& C1, +static Standard_Integer SetSameDistribution(Handle(Geom_BSplineCurve)& C1, Handle(Geom_BSplineCurve)& C2 ) { Standard_Integer nbp1 = C1->NbPoles(); diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_CircularBlendFunc.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_CircularBlendFunc.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_CircularBlendFunc.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_CircularBlendFunc.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,9 +35,9 @@ static Standard_Integer NbSections = 0; #endif -const Standard_Real TolAng = 1.e-6; +static const Standard_Real TolAng = 1.e-6; -GeomAbs_Shape GeomFillNextShape(const GeomAbs_Shape S) +static GeomAbs_Shape GeomFillNextShape(const GeomAbs_Shape S) { switch (S) { case GeomAbs_C0 : @@ -53,7 +53,7 @@ } } -void GeomFillFusInt(const TColStd_Array1OfReal& I1, +static void GeomFillFusInt(const TColStd_Array1OfReal& I1, const TColStd_Array1OfReal& I2, TColStd_SequenceOfReal& Seq) { diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_ConstrainedFilling.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_ConstrainedFilling.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_ConstrainedFilling.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_ConstrainedFilling.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -310,10 +310,17 @@ GeomFill_ConstrainedFilling::GeomFill_ConstrainedFilling (const Standard_Integer MaxDeg, - const Standard_Integer MaxSeg) : - degmax(MaxDeg),segmax(MaxSeg),appdone(Standard_False) + const Standard_Integer MaxSeg) +: degmax(MaxDeg), + segmax(MaxSeg), + appdone(Standard_False), + nbd3(0) { dom[0] = dom[1] = dom[2] = dom[3] = 1.; + memset (ctr, 0, sizeof (ctr)); + memset (degree, 0, sizeof (degree)); + memset (ibound, 0, sizeof (ibound)); + memset (mig, 0, sizeof (mig)); } diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_CornerState.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_CornerState.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_CornerState.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_CornerState.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,7 +23,9 @@ //======================================================================= GeomFill_CornerState::GeomFill_CornerState() : gap(RealLast()), + tgtang(0.0), isconstrained(0), + norang(0.0), scal(1.), coonscnd(1) { diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_Darboux.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_Darboux.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_Darboux.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_Darboux.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -130,7 +130,7 @@ //function : NormalD1 //purpose : computes Normal to Surface and its first derivative //======================================================================= -void NormalD1 (const Standard_Real U, const Standard_Real V, +static void NormalD1 (const Standard_Real U, const Standard_Real V, const Handle(Adaptor3d_HSurface)& Surf, gp_Dir& Normal, gp_Vec& D1UNormal, gp_Vec& D1VNormal) { @@ -192,7 +192,7 @@ //function : NormalD2 //purpose : computes Normal to Surface and its first and second derivatives //======================================================================= -void NormalD2 (const Standard_Real U, const Standard_Real V, +static void NormalD2 (const Standard_Real U, const Standard_Real V, const Handle(Adaptor3d_HSurface)& Surf, gp_Dir& Normal, gp_Vec& D1UNormal, gp_Vec& D1VNormal, gp_Vec& D2UNormal, gp_Vec& D2VNormal, gp_Vec& D2UVNormal) diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_Filling.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_Filling.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_Filling.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_Filling.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,7 @@ //purpose : //======================================================================= GeomFill_Filling::GeomFill_Filling() +: IsRational(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_Frenet.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_Frenet.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_Frenet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_Frenet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -95,6 +95,7 @@ //======================================================================= GeomFill_Frenet::GeomFill_Frenet() +: isSngl(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_FunctionGuide.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_FunctionGuide.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_FunctionGuide.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_FunctionGuide.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -52,7 +52,12 @@ (const Handle(GeomFill_SectionLaw)& S, const Handle(Adaptor3d_HCurve)& C, const Standard_Real Param) -: TheGuide(C), TheLaw(S), TheUonS(Param) +: TheGuide(C), + TheLaw(S), + isconst(Standard_False), + First(0.0), + Last(0.0), + TheUonS(Param) { Standard_Real Tol = Precision::Confusion(); if (TheLaw->IsConstant(Tol)) { diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_NSections.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_NSections.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_NSections.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_NSections.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -62,7 +62,7 @@ #ifdef OCCT_DEBUG // verification des fonctions de derivation D1 et D2 par differences finies -Standard_Boolean verifD1(const TColgp_Array1OfPnt& P1, +static Standard_Boolean verifD1(const TColgp_Array1OfPnt& P1, const TColStd_Array1OfReal& W1, const TColgp_Array1OfPnt& P2, const TColStd_Array1OfReal& W2, @@ -104,7 +104,7 @@ return ok; } -Standard_Boolean verifD2(const TColgp_Array1OfVec& DP1, +static Standard_Boolean verifD2(const TColgp_Array1OfVec& DP1, const TColStd_Array1OfReal& DW1, const TColgp_Array1OfVec& DP2, const TColStd_Array1OfReal& DW2, @@ -114,7 +114,7 @@ const Standard_Real wTol, const Standard_Real pas) { - Standard_Boolean ok = Standard_True;; + Standard_Boolean ok = Standard_True; Standard_Integer ii, L = DP1.Length(); Standard_Real d2w; gp_Vec d2P; @@ -598,7 +598,8 @@ new Geom_BSplineSurface(anApprox.SurfPoles(), anApprox.SurfWeights(), anApprox.SurfUKnots(), anApprox.SurfVKnots(), anApprox.SurfUMults(), anApprox.SurfVMults(), - anApprox.UDegree(), anApprox.VDegree()); + anApprox.UDegree(), anApprox.VDegree(), + section.IsPeriodic()); } else { diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_Profiler.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_Profiler.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_Profiler.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_Profiler.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,7 @@ //function : UnifyByInsertingAllKnots //purpose : //======================================================================= -void UnifyByInsertingAllKnots(TColGeom_SequenceOfCurve& theCurves, +static void UnifyByInsertingAllKnots(TColGeom_SequenceOfCurve& theCurves, const Standard_Real PTol) { // inserting in the first curve the knot-vector of all the others. @@ -82,7 +82,7 @@ //function : UnifyBySettingMiddleKnots //purpose : //======================================================================= -void UnifyBySettingMiddleKnots(TColGeom_SequenceOfCurve& theCurves) +static void UnifyBySettingMiddleKnots(TColGeom_SequenceOfCurve& theCurves) { Standard_Integer i, j; diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_SectionPlacement.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_SectionPlacement.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_SectionPlacement.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_SectionPlacement.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -182,9 +182,10 @@ //=============================================================== GeomFill_SectionPlacement:: GeomFill_SectionPlacement(const Handle(GeomFill_LocationLaw)& L, - const Handle(Geom_Geometry)& Section) : - myLaw(L), /* myAdpSection(Section), mySection(Section), */ - Dist(RealLast()), AngleMax(0.) + const Handle(Geom_Geometry)& Section) : + myLaw(L), /* myAdpSection(Section), mySection(Section), */ + SecParam(0.0), PathParam(0.0), + Dist(RealLast()), AngleMax(0.) { done = Standard_False; diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_Sweep.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_Sweep.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_Sweep.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_Sweep.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -219,6 +219,12 @@ // Traitement des KPart if (myKPart) isKPart = BuildKPart(); + + if (!isKPart) + { + myExchUV = Standard_False; + isUReversed = isVReversed = Standard_False; + } // Traitement des produits Formelles if ((!isKPart) && (Methode == GeomFill_Location)) { @@ -812,7 +818,7 @@ if ((SectionType == GeomAbs_Circle) && IsTrsf) { gp_Circ C = AC.Circle(); Standard_Real Radius; - Standard_Boolean IsGoodSide = Standard_True;; + Standard_Boolean IsGoodSide = Standard_True; C.Transform(Tf2); gp_Vec DC; // On calcul le centre eventuel @@ -870,6 +876,16 @@ isUReversed = Standard_True; } + if (Abs(l - f) <= Precision::PConfusion() || + Abs(UlastOnSec - UfirstOnSec) > M_PI_2) + { + // l == f - "degenerated" surface + // UlastOnSec - UfirstOnSec > M_PI_2 - "twisted" surface, + // it is impossible to represent with help of trimmed sphere + isUReversed = Standard_False; + return Ok; + } + if ( (f >= -M_PI/2) && (l <= M_PI/2)) { Ok = Standard_True; myExchUV = Standard_True; @@ -953,7 +969,12 @@ // (2.2.a) Cylindre // si la line est orthogonale au plan de rotation SError = error; - gp_Ax3 Axis(CentreOfSurf, Dir.Direction(), DS); + // + gp_Ax3 Axis(CentreOfSurf, Dir.Direction()); + if (DS.SquareMagnitude() > gp::Resolution()) + { + Axis.SetXDirection(DS); + } S = new (Geom_CylindricalSurface) (Axis, L.Distance(CentreOfSurf)); Ok = Standard_True; diff -Nru opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_SweepSectionGenerator.cxx opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_SweepSectionGenerator.cxx --- opencascade-7.4.1+dfsg1/src/GeomFill/GeomFill_SweepSectionGenerator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomFill/GeomFill_SweepSectionGenerator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,8 +51,12 @@ //======================================================================= GeomFill_SweepSectionGenerator::GeomFill_SweepSectionGenerator() +: myRadius(0.0), + myIsDone(Standard_False), + myNbSections(0), + myType(-1), + myPolynomial(Standard_False) { - myIsDone = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/GeomInt/GeomInt_IntSS_1.cxx opencascade-7.5.1+dfsg1/src/GeomInt/GeomInt_IntSS_1.cxx --- opencascade-7.4.1+dfsg1/src/GeomInt/GeomInt_IntSS_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomInt/GeomInt_IntSS_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1031,9 +1031,8 @@ //approximation of curve on surface. Standard_Integer aMaxDeg = 8; Standard_Integer aMaxSeg = 1000; - Approx_CurveOnSurface anApp(anAHC2d, aGAHS, tf, tl, Precision::Confusion(), - GeomAbs_C1, aMaxDeg, aMaxSeg, - Standard_True, Standard_False); + Approx_CurveOnSurface anApp(anAHC2d, aGAHS, tf, tl, Precision::Confusion()); + anApp.Perform(aMaxSeg, aMaxDeg, GeomAbs_C1, Standard_True, Standard_False); if(!anApp.HasResult()) return; diff -Nru opencascade-7.4.1+dfsg1/src/GeomInt/GeomInt_LineTool.cxx opencascade-7.5.1+dfsg1/src/GeomInt/GeomInt_LineTool.cxx --- opencascade-7.4.1+dfsg1/src/GeomInt/GeomInt_LineTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomInt/GeomInt_LineTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,6 +31,8 @@ #include #include +namespace +{ class ProjectPointOnSurf { public: @@ -121,6 +123,7 @@ StdFail_NotDone_Raise_if(!myIsDone, "GeomInt_IntSS::ProjectPointOnSurf::LowerDistance"); return sqrt(myExtPS.SquareDistance(myIndex)); } +} //======================================================================= //function : AdjustPeriodic diff -Nru opencascade-7.4.1+dfsg1/src/GeomLib/GeomLib.cxx opencascade-7.5.1+dfsg1/src/GeomLib/GeomLib.cxx --- opencascade-7.4.1+dfsg1/src/GeomLib/GeomLib.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomLib/GeomLib.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -1095,7 +1096,6 @@ { - Standard_Integer curve_not_computed = 1 ; MaxDeviation = 0.0e0 ; AverageDeviation = 0.0e0 ; Handle(GeomAdaptor_HSurface) geom_adaptor_surface_ptr (Handle(GeomAdaptor_HSurface)::DownCast(Curve.GetSurface()) ); @@ -1126,11 +1126,23 @@ NewCurvePtr = GeomLib::To3d(axes, geom2d_curve.Curve()); - curve_not_computed = 0 ; + return; } + + Handle(Adaptor2d_HCurve2d) TrimmedC2D = geom_adaptor_curve_ptr->Trim (FirstParameter, LastParameter, Precision::PConfusion()); + + Standard_Boolean isU, isForward; + Standard_Real aParam; + if (isIsoLine(TrimmedC2D, isU, aParam, isForward)) + { + NewCurvePtr = buildC3dOnIsoLine (TrimmedC2D, geom_adaptor_surface_ptr, FirstParameter, LastParameter, Tolerance, isU, aParam, isForward); + if (!NewCurvePtr.IsNull()) + { + return; + } + } } - if (curve_not_computed) { // // Entree @@ -1182,7 +1194,6 @@ AverageDeviation = anApproximator.AverageError(3,1) ; NewCurvePtr = aCurvePtr ; } - } } //======================================================================= @@ -2783,3 +2794,218 @@ // return Standard_True; } + +//============================================================================= +//function : isIsoLine +//purpose : +//============================================================================= +Standard_Boolean GeomLib::isIsoLine (const Handle(Adaptor2d_HCurve2d) theC2D, + Standard_Boolean& theIsU, + Standard_Real& theParam, + Standard_Boolean& theIsForward) +{ + // These variables are used to check line state (vertical or horizontal). + Standard_Boolean isAppropriateType = Standard_False; + gp_Pnt2d aLoc2d; + gp_Dir2d aDir2d; + + // Test type. + const GeomAbs_CurveType aType = theC2D->GetType(); + if (aType == GeomAbs_Line) + { + gp_Lin2d aLin2d = theC2D->Line(); + aLoc2d = aLin2d.Location(); + aDir2d = aLin2d.Direction(); + isAppropriateType = Standard_True; + } + else if (aType == GeomAbs_BSplineCurve) + { + Handle(Geom2d_BSplineCurve) aBSpline2d = theC2D->BSpline(); + if (aBSpline2d->Degree() != 1 || aBSpline2d->NbPoles() != 2) + return Standard_False; // Not a line or uneven parameterization. + + aLoc2d = aBSpline2d->Pole(1); + + // Vector should be non-degenerated. + gp_Vec2d aVec2d(aBSpline2d->Pole(1), aBSpline2d->Pole(2)); + if (aVec2d.SquareMagnitude() < Precision::Confusion()) + return Standard_False; // Degenerated spline. + aDir2d = aVec2d; + + isAppropriateType = Standard_True; + } + else if (aType == GeomAbs_BezierCurve) + { + Handle(Geom2d_BezierCurve) aBezier2d = theC2D->Bezier(); + if (aBezier2d->Degree() != 1 || aBezier2d->NbPoles() != 2) + return Standard_False; // Not a line or uneven parameterization. + + aLoc2d = aBezier2d->Pole(1); + + // Vector should be non-degenerated. + gp_Vec2d aVec2d(aBezier2d->Pole(1), aBezier2d->Pole(2)); + if (aVec2d.SquareMagnitude() < Precision::Confusion()) + return Standard_False; // Degenerated spline. + aDir2d = aVec2d; + + isAppropriateType = Standard_True; + } + + if (!isAppropriateType) + return Standard_False; + + // Check line to be vertical or horizontal. + if (aDir2d.IsParallel(gp::DX2d(), Precision::Angular())) + { + // Horizontal line. V = const. + theIsU = Standard_False; + theParam = aLoc2d.Y(); + theIsForward = aDir2d.Dot(gp::DX2d()) > 0.0; + return Standard_True; + } + else if (aDir2d.IsParallel(gp::DY2d(), Precision::Angular())) + { + // Vertical line. U = const. + theIsU = Standard_True; + theParam = aLoc2d.X(); + theIsForward = aDir2d.Dot(gp::DY2d()) > 0.0; + return Standard_True; + } + + return Standard_False; +} + +//============================================================================= +//function : buildC3dOnIsoLine +//purpose : +//============================================================================= +Handle(Geom_Curve) GeomLib::buildC3dOnIsoLine (const Handle(Adaptor2d_HCurve2d) theC2D, + const Handle(Adaptor3d_HSurface) theSurf, + const Standard_Real theFirst, + const Standard_Real theLast, + const Standard_Real theTolerance, + const Standard_Boolean theIsU, + const Standard_Real theParam, + const Standard_Boolean theIsForward) +{ + // Convert adapter to the appropriate type. + Handle(GeomAdaptor_HSurface) aGeomAdapter = Handle(GeomAdaptor_HSurface)::DownCast(theSurf); + if (aGeomAdapter.IsNull()) + return Handle(Geom_Curve)(); + + if (theSurf->GetType() == GeomAbs_Sphere) + return Handle(Geom_Curve)(); + + // Extract isoline + Handle(Geom_Surface) aSurf = aGeomAdapter->ChangeSurface().Surface(); + Handle(Geom_Curve) aC3d; + + gp_Pnt2d aF2d = theC2D->Value(theC2D->FirstParameter()); + gp_Pnt2d aL2d = theC2D->Value(theC2D->LastParameter()); + + Standard_Boolean isToTrim = Standard_True; + Standard_Real U1, U2, V1, V2; + aSurf->Bounds(U1, U2, V1, V2); + + if (theIsU) + { + Standard_Real aV1Param = Min(aF2d.Y(), aL2d.Y()); + Standard_Real aV2Param = Max(aF2d.Y(), aL2d.Y()); + if (aV2Param < V1 - theTolerance || aV1Param > V2 + theTolerance) + { + return Handle(Geom_Curve)(); + } + else if (Precision::IsInfinite(V1) || Precision::IsInfinite(V2)) + { + if (Abs(aV2Param - aV1Param) < Precision::PConfusion()) + { + return Handle(Geom_Curve)(); + } + aSurf = new Geom_RectangularTrimmedSurface(aSurf, U1, U2, aV1Param, aV2Param); + isToTrim = Standard_False; + } + else + { + aV1Param = Max(aV1Param, V1); + aV2Param = Min(aV2Param, V2); + if (Abs(aV2Param - aV1Param) < Precision::PConfusion()) + { + return Handle(Geom_Curve)(); + } + } + aC3d = aSurf->UIso(theParam); + if (isToTrim) + aC3d = new Geom_TrimmedCurve(aC3d, aV1Param, aV2Param); + } + else + { + Standard_Real aU1Param = Min(aF2d.X(), aL2d.X()); + Standard_Real aU2Param = Max(aF2d.X(), aL2d.X()); + if (aU2Param < U1 - theTolerance || aU1Param > U2 + theTolerance) + { + return Handle(Geom_Curve)(); + } + else if (Precision::IsInfinite(U1) || Precision::IsInfinite(U2)) + { + if (Abs(aU2Param - aU1Param) < Precision::PConfusion()) + { + return Handle(Geom_Curve)(); + } + aSurf = new Geom_RectangularTrimmedSurface(aSurf, aU1Param, aU2Param, V1, V2); + isToTrim = Standard_False; + } + else + { + aU1Param = Max(aU1Param, U1); + aU2Param = Min(aU2Param, U2); + if (Abs(aU2Param - aU1Param) < Precision::PConfusion()) + { + return Handle(Geom_Curve)(); + } + } + aC3d = aSurf->VIso(theParam); + if (isToTrim) + aC3d = new Geom_TrimmedCurve(aC3d, aU1Param, aU2Param); + } + + // Convert arbitrary curve type to the b-spline. + Handle(Geom_BSplineCurve) aCurve3d = GeomConvert::CurveToBSplineCurve(aC3d, Convert_QuasiAngular); + if (!theIsForward) + aCurve3d->Reverse(); + + // Rebuild parameterization for the 3d curve to have the same parameterization with + // a two-dimensional curve. + TColStd_Array1OfReal aKnots = aCurve3d->Knots(); + BSplCLib::Reparametrize(theC2D->FirstParameter(), theC2D->LastParameter(), aKnots); + aCurve3d->SetKnots(aKnots); + + // Evaluate error. + Standard_Real anError3d = 0.0; + + const Standard_Real aParF = theFirst; + const Standard_Real aParL = theLast; + const Standard_Integer aNbPnt = 23; + for (Standard_Integer anIdx = 0; anIdx <= aNbPnt; ++anIdx) + { + const Standard_Real aPar = aParF + ((aParL - aParF) * anIdx) / aNbPnt; + + const gp_Pnt2d aPnt2d = theC2D->Value(aPar); + + const gp_Pnt aPntC3D = aCurve3d->Value(aPar); + const gp_Pnt aPntC2D = theSurf->Value(aPnt2d.X(), aPnt2d.Y()); + + const Standard_Real aSqDeviation = aPntC3D.SquareDistance(aPntC2D); + anError3d = Max (aSqDeviation, anError3d); + } + + anError3d = Sqrt(anError3d); + + // Target tolerance is not obtained. This situation happens for isolines on the sphere. + // OCCT is unable to convert it keeping original parameterization, while the geometric + // form of the result is entirely identical. In that case, it is better to utilize + // a general-purpose approach. + if (anError3d > theTolerance) + return Handle(Geom_Curve)(); + + return aCurve3d; +} diff -Nru opencascade-7.4.1+dfsg1/src/GeomLib/GeomLib.hxx opencascade-7.5.1+dfsg1/src/GeomLib/GeomLib.hxx --- opencascade-7.4.1+dfsg1/src/GeomLib/GeomLib.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomLib/GeomLib.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,6 +34,8 @@ class Geom2d_Curve; class gp_GTrsf2d; class Adaptor3d_CurveOnSurface; +class Adaptor2d_HCurve2d; +class Adaptor3d_HSurface; class Geom_BoundedCurve; class gp_Pnt; class gp_Vec; @@ -223,10 +225,35 @@ const Standard_Real V2, const Standard_Real Tol); -protected: - - + //! Checks whether the 2d curve is a isoline. It can be represented by b-spline, bezier, + //! or geometric line. This line should have natural parameterization. + //! @param theC2D Trimmed curve to be checked. + //! @param theIsU Flag indicating that line is u const. + //! @param theParam Line parameter. + //! @param theIsForward Flag indicating forward parameterization on a isoline. + //! @return Standard_True when 2d curve is a line and Standard_False otherwise. + Standard_EXPORT static Standard_Boolean isIsoLine (const Handle(Adaptor2d_HCurve2d) theC2D, + Standard_Boolean& theIsU, + Standard_Real& theParam, + Standard_Boolean& theIsForward); + + //! Builds 3D curve for a isoline. This method takes corresponding isoline from + //! the input surface. + //! @param theC2D Trimmed curve to be approximated. + //! @param theIsU Flag indicating that line is u const. + //! @param theParam Line parameter. + //! @param theIsForward Flag indicating forward parameterization on a isoline. + //! @return Standard_True when 3d curve is built and Standard_False otherwise. + Standard_EXPORT static Handle(Geom_Curve) buildC3dOnIsoLine (const Handle(Adaptor2d_HCurve2d) theC2D, + const Handle(Adaptor3d_HSurface) theSurf, + const Standard_Real theFirst, + const Standard_Real theLast, + const Standard_Real theTolerance, + const Standard_Boolean theIsU, + const Standard_Real theParam, + const Standard_Boolean theIsForward); +protected: private: diff -Nru opencascade-7.4.1+dfsg1/src/GeomLib/GeomLib_Interpolate.cxx opencascade-7.5.1+dfsg1/src/GeomLib/GeomLib_Interpolate.cxx --- opencascade-7.4.1+dfsg1/src/GeomLib/GeomLib_Interpolate.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomLib/GeomLib_Interpolate.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,7 +39,7 @@ const Standard_Integer NumPoints, const TColgp_Array1OfPnt& PointsArray, const TColStd_Array1OfReal& ParametersArray) - +: myIsDone(Standard_False) { Standard_Integer ii, num_knots, diff -Nru opencascade-7.4.1+dfsg1/src/GeomliteTest/GeomliteTest_API2dCommands.cxx opencascade-7.5.1+dfsg1/src/GeomliteTest/GeomliteTest_API2dCommands.cxx --- opencascade-7.4.1+dfsg1/src/GeomliteTest/GeomliteTest_API2dCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomliteTest/GeomliteTest_API2dCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,8 +45,9 @@ #include #include #include -#include +#include +#include #include #ifdef _WIN32 Standard_IMPORT Draw_Viewer dout; @@ -442,7 +443,7 @@ { if (n < 2) { - std::cout << "2dintana circle circle " << std::endl; + Message::SendFail() << "2dintana circle circle"; return 1; } @@ -483,21 +484,21 @@ { if( n < 2) { - std::cout<< "intconcon con1 con2 "<FirstParameter(), A2d->LastParameter(), - Tol, Continuity, MaxDeg, MaxSeg, - Standard_True, Standard_False); + Approx_CurveOnSurface App(A2d, AS, A2d->FirstParameter(), A2d->LastParameter(), Tol); + App.Perform(MaxSeg, MaxDeg, Continuity, Standard_True, Standard_False); if(App.HasResult()) { Handle(Geom_BSplineCurve) BSCurve = App.Curve3d(); diff -Nru opencascade-7.4.1+dfsg1/src/GeomliteTest/GeomliteTest_ModificationCommands.cxx opencascade-7.5.1+dfsg1/src/GeomliteTest/GeomliteTest_ModificationCommands.cxx --- opencascade-7.4.1+dfsg1/src/GeomliteTest/GeomliteTest_ModificationCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomliteTest/GeomliteTest_ModificationCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,6 +32,7 @@ #include #include #include +#include #ifdef _MSC_VER #include @@ -143,7 +144,7 @@ { if (n < 4 || n > 5) { - std::cout << "Wrong parameters" << std::endl; + Message::SendFail() << "Syntax error: Wrong parameters"; return 1; } @@ -183,7 +184,7 @@ Handle(Geom_BezierSurface) aBezSurf = DrawTrSurf::GetBezierSurface(a[1]); if (n != 5 && (!aBSplSurf.IsNull() || !aBezSurf.IsNull())) { - std::cout << "Incorrect parameters" << std::endl; + Message::SendFail() << "Syntax error: Incorrect parameters"; return 1; } @@ -199,7 +200,7 @@ return 0; } - std::cout << a[1] << " is not a B-spline nor a Bezier curve/surface" << std::endl; + Message::SendFail() << a[1] << " is not a B-spline nor a Bezier curve/surface"; return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/GeomliteTest/GeomliteTest_SurfaceCommands.cxx opencascade-7.5.1+dfsg1/src/GeomliteTest/GeomliteTest_SurfaceCommands.cxx --- opencascade-7.4.1+dfsg1/src/GeomliteTest/GeomliteTest_SurfaceCommands.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomliteTest/GeomliteTest_SurfaceCommands.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -81,6 +81,7 @@ #include #include #include +#include #include #ifdef _WIN32 @@ -1381,14 +1382,14 @@ { if (n < 2) { - std::cout<<"Invalid number of parameters"< #include -Standard_Integer GeomAbsToInteger(const GeomAbs_Shape gcont) +static Standard_Integer GeomAbsToInteger(const GeomAbs_Shape gcont) { Standard_Integer cont=0 ; switch (gcont) { diff -Nru opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_Aij.cxx opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_Aij.cxx --- opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_Aij.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_Aij.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,8 @@ #include GeomPlate_Aij::GeomPlate_Aij() +: Ind1(0), + Ind2(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_BuildPlateSurface.cxx opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_BuildPlateSurface.cxx --- opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_BuildPlateSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_BuildPlateSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -66,7 +66,7 @@ #include #include #include -#include +#include #include @@ -300,10 +300,9 @@ Projector.Bounds(1, Udeb, Ufin); MaxSeg = 20 + HProjector->NbIntervals(GeomAbs_C3); - Approx_CurveOnSurface appr(HProjector, hsur, Udeb, Ufin, myTol3d, - Continuity, MaxDegree, MaxSeg, - Standard_False, Standard_True); - + Approx_CurveOnSurface appr(HProjector, hsur, Udeb, Ufin, myTol3d); + appr.Perform(MaxSeg, MaxDegree, Continuity, Standard_False, Standard_True); + Curve2d = appr.Curve2d(); } #if DRAW @@ -449,7 +448,7 @@ // Function : Perform // Calculates the surface filled with loaded constraints //--------------------------------------------------------- -void GeomPlate_BuildPlateSurface::Perform(const Handle(Message_ProgressIndicator) & aProgress) +void GeomPlate_BuildPlateSurface::Perform(const Message_ProgressRange& theProgress) { #ifdef OCCT_DEBUG // Timing @@ -480,8 +479,13 @@ //====================================================================== // Initial Surface //====================================================================== + Message_ProgressScope aPS(theProgress, NULL, 100, Standard_True); if (!mySurfInitIsGive) - ComputeSurfInit(aProgress); + { + ComputeSurfInit (aPS.Next(10)); + if (aPS.UserBreak()) + return; + } else { if (NTLinCont>=2) @@ -652,9 +656,9 @@ // Construction of the surface //==================================================================== - myPlate.SolveTI(myDegree, ComputeAnisotropie(), aProgress); + myPlate.SolveTI(myDegree, ComputeAnisotropie(), aPS.Next(90)); - if (!aProgress.IsNull() && aProgress->UserBreak()) + if (aPS.UserBreak()) { return; } @@ -691,9 +695,9 @@ //==================================================================== //Construction of the surface //==================================================================== - myPlate.SolveTI(myDegree, ComputeAnisotropie(), aProgress); + myPlate.SolveTI(myDegree, ComputeAnisotropie(), aPS.Next(90)); - if (!aProgress.IsNull() && aProgress->UserBreak()) + if (aPS.UserBreak()) { return; } @@ -1014,7 +1018,7 @@ for(i=1; i<=NTCurve; i++) if (myLinCont->Value(i)->Order()!=-1) - { Standard_Integer NbPt=myParCont->Value(i).Length();; + { Standard_Integer NbPt=myParCont->Value(i).Length(); // first constraint point (j=0) // Standard_Integer NbPt=myParCont->Length(); if (iordre==0) { @@ -1359,7 +1363,7 @@ // there are point constraints. //------------------------------------------------------------------------- -void GeomPlate_BuildPlateSurface::ComputeSurfInit(const Handle(Message_ProgressIndicator) & aProgress) +void GeomPlate_BuildPlateSurface::ComputeSurfInit(const Message_ProgressRange& theProgress) { Standard_Integer nopt=2, popt=2, Np=1; Standard_Boolean isHalfSpace = Standard_True; @@ -1724,8 +1728,8 @@ //==================================================================== // Construction of the surface //==================================================================== - myPlate.SolveTI(2, ComputeAnisotropie(), aProgress); - if (!aProgress.IsNull() && aProgress->UserBreak()) + myPlate.SolveTI(2, ComputeAnisotropie(), theProgress); + if (theProgress.UserBreak()) { return; } diff -Nru opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_BuildPlateSurface.hxx opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_BuildPlateSurface.hxx --- opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_BuildPlateSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_BuildPlateSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,7 +46,6 @@ class Geom2d_Curve; class Adaptor3d_HCurve; class Adaptor2d_HCurve2d; -class Message_ProgressIndicator; @@ -131,7 +130,7 @@ //! Exceptions //! Standard_RangeError if the value of the constraint is //! null or if plate is not done. - Standard_EXPORT void Perform(const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)()); + Standard_EXPORT void Perform(const Message_ProgressRange& theProgress = Message_ProgressRange()); //! returns the CurveConstraints of order order Standard_EXPORT Handle(GeomPlate_CurveConstraint) CurveConstraint (const Standard_Integer order) const; @@ -218,7 +217,7 @@ Standard_EXPORT Handle(Adaptor2d_HCurve2d) ProjectedCurve (Handle(Adaptor3d_HCurve)& Curv); - Standard_EXPORT void ComputeSurfInit(const Handle(Message_ProgressIndicator) & aProgress); + Standard_EXPORT void ComputeSurfInit(const Message_ProgressRange& theProgress); Standard_EXPORT void Intersect (Handle(GeomPlate_HArray1OfSequenceOfReal)& PntInter, Handle(GeomPlate_HArray1OfSequenceOfReal)& PntG1G1); diff -Nru opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_CurveConstraint.cxx opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_CurveConstraint.cxx --- opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_CurveConstraint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_CurveConstraint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,8 +46,19 @@ //--------------------------------------------------------- // Constructeur vide //--------------------------------------------------------- -GeomPlate_CurveConstraint :: GeomPlate_CurveConstraint () : -myLProp(2,1.e-4) +GeomPlate_CurveConstraint :: GeomPlate_CurveConstraint () +: myNbPoints(0), + myOrder(0), + myTang(0), + myConstG0(Standard_False), + myConstG1(Standard_False), + myConstG2(Standard_False), + myLProp(2, 1.e-4), + myTolDist(0.0), + myTolAng(0.0), + myTolCurv(0.0), + myTolU(0.0), + myTolV(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_PointConstraint.cxx opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_PointConstraint.cxx --- opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_PointConstraint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_PointConstraint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,7 +43,11 @@ myOrder(Order), myLProp(2,TolDist), myPoint(Pt), +myU(0.0), +myV(0.0), myTolDist(TolDist), +myTolAng(0.0), +myTolCurv(0.0), hasPnt2dOnSurf(Standard_False) { if ((myOrder>1)||(myOrder<-1)) throw Standard_Failure("GeomPlate_PointConstraint : the constraint must 0 or -1 with a point"); diff -Nru opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_Surface.cxx opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_Surface.cxx --- opencascade-7.4.1+dfsg1/src/GeomPlate/GeomPlate_Surface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomPlate/GeomPlate_Surface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,7 +44,13 @@ //function : GeomPlate_Surface //purpose : //======================================================================= -GeomPlate_Surface::GeomPlate_Surface(const Handle(Geom_Surface)& Surfinit,const Plate_Plate& Surfinter) : mySurfinter(Surfinter),mySurfinit(Surfinit) +GeomPlate_Surface::GeomPlate_Surface(const Handle(Geom_Surface)& Surfinit,const Plate_Plate& Surfinter) +: mySurfinter(Surfinter), + mySurfinit(Surfinit), + myUmin(0.0), + myUmax(0.0), + myVmin(0.0), + myVmax(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/GeomProjLib/GeomProjLib.cxx opencascade-7.5.1+dfsg1/src/GeomProjLib/GeomProjLib.cxx --- opencascade-7.4.1+dfsg1/src/GeomProjLib/GeomProjLib.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomProjLib/GeomProjLib.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -340,8 +340,8 @@ Standard_Real f,l; Proj.Bounds(1,f,l); Handle(Adaptor2d_HCurve2d) HC2d = Proj.Trim(f,l,TolU); - Approx_CurveOnSurface Approx(HC2d, HS, f, l, Tol, - GeomAbs_C2,14,16,Standard_True); + Approx_CurveOnSurface Approx(HC2d, HS, f, l, Tol); + Approx.Perform(16, 14, GeomAbs_C2, Standard_True); // ici, on a toujours un type BSpline. if (Approx.IsDone() && Approx.HasResult()) diff -Nru opencascade-7.4.1+dfsg1/src/GeomToIGES/GeomToIGES_GeomCurve.cxx opencascade-7.5.1+dfsg1/src/GeomToIGES/GeomToIGES_GeomCurve.cxx --- opencascade-7.4.1+dfsg1/src/GeomToIGES/GeomToIGES_GeomCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomToIGES/GeomToIGES_GeomCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -501,7 +501,7 @@ if (start.IsNull()) { return res; } - Handle(IGESGeom_CircularArc) Circle = new IGESGeom_CircularArc;; + Handle(IGESGeom_CircularArc) Circle = new IGESGeom_CircularArc(); IGESConvGeom_GeomBuilder Build; Standard_Real U1 = Udeb; diff -Nru opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_Curve2dSet.cxx opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_Curve2dSet.cxx --- opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_Curve2dSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_Curve2dSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -496,16 +495,14 @@ //purpose : //======================================================================= -void GeomTools_Curve2dSet::Write(Standard_OStream& OS)const +void GeomTools_Curve2dSet::Write(Standard_OStream& OS, const Message_ProgressRange& theProgress)const { std::streamsize prec = OS.precision(17); Standard_Integer i, nbsurf = myMap.Extent(); OS << "Curve2ds "<< nbsurf << "\n"; - //OCC19559 - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "2D Curves", 0, nbsurf, 1); - for (i = 1; i <= nbsurf && PS.More(); i++, PS.Next()) { + Message_ProgressScope aPS(theProgress, "2D Curves", nbsurf); + for (i = 1; i <= nbsurf && aPS.More(); i++, aPS.Next()) { PrintCurve2d(Handle(Geom2d_Curve)::DownCast(myMap(i)),OS,Standard_True); } OS.precision(prec); @@ -840,7 +837,7 @@ //purpose : //======================================================================= -void GeomTools_Curve2dSet::Read(Standard_IStream& IS) +void GeomTools_Curve2dSet::Read(Standard_IStream& IS, const Message_ProgressRange& theProgress) { char buffer[255]; IS >> buffer; @@ -851,33 +848,9 @@ Standard_Integer i, nbcurve; IS >> nbcurve; - //OCC19559 - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "2D Curves", 0, nbcurve, 1); - for (i = 1; i <= nbcurve && PS.More(); i++, PS.Next()) { + Message_ProgressScope aPS(theProgress, "2D Curves", nbcurve); + for (i = 1; i <= nbcurve && aPS.More(); i++, aPS.Next()) { Handle(Geom2d_Curve) C = GeomTools_Curve2dSet::ReadCurve2d (IS); myMap.Add(C); } } - -//======================================================================= -//function : GetProgress -//purpose : -//======================================================================= - -Handle(Message_ProgressIndicator) GeomTools_Curve2dSet::GetProgress() const -{ - return myProgress; -} - -//======================================================================= -//function : SetProgress -//purpose : -//======================================================================= - -void GeomTools_Curve2dSet::SetProgress(const Handle(Message_ProgressIndicator)& PR) -{ - myProgress = PR; -} - - diff -Nru opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_Curve2dSet.hxx opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_Curve2dSet.hxx --- opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_Curve2dSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_Curve2dSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,7 +26,8 @@ #include #include #include -class Message_ProgressIndicator; +#include + class Standard_OutOfRange; class Geom2d_Curve; @@ -60,48 +61,29 @@ //! Writes the content of me on the stream in a //! format that can be read back by Read. - Standard_EXPORT void Write (Standard_OStream& OS) const; + Standard_EXPORT void Write (Standard_OStream& OS, + const Message_ProgressRange& theProgress = Message_ProgressRange()) const; //! Reads the content of me from the stream . me //! is first cleared. - Standard_EXPORT void Read (Standard_IStream& IS); + Standard_EXPORT void Read (Standard_IStream& IS, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Dumps the curve on the stream, if compact is True //! use the compact format that can be read back. - Standard_EXPORT static void PrintCurve2d (const Handle(Geom2d_Curve)& C, Standard_OStream& OS, const Standard_Boolean compact = Standard_False); + Standard_EXPORT static void PrintCurve2d (const Handle(Geom2d_Curve)& C, + Standard_OStream& OS, + const Standard_Boolean compact = Standard_False); //! Reads the curve from the stream. The curve is //! assumed to have been written with the Print //! method (compact = True). Standard_EXPORT static Handle(Geom2d_Curve) ReadCurve2d (Standard_IStream& IS); - - Standard_EXPORT void SetProgress (const Handle(Message_ProgressIndicator)& PR); - - Standard_EXPORT Handle(Message_ProgressIndicator) GetProgress() const; - - - - -protected: - - - - private: - - TColStd_IndexedMapOfTransient myMap; - Handle(Message_ProgressIndicator) myProgress; - }; - - - - - - #endif // _GeomTools_Curve2dSet_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_CurveSet.cxx opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_CurveSet.cxx --- opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_CurveSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_CurveSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -513,16 +512,14 @@ //purpose : //======================================================================= -void GeomTools_CurveSet::Write(Standard_OStream& OS)const +void GeomTools_CurveSet::Write(Standard_OStream& OS, const Message_ProgressRange& theProgress)const { std::streamsize prec = OS.precision(17); Standard_Integer i, nbcurve = myMap.Extent(); OS << "Curves "<< nbcurve << "\n"; - //OCC19559 - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "3D Curves", 0, nbcurve, 1); - for (i = 1; i <= nbcurve && PS.More(); i++, PS.Next()) { + Message_ProgressScope aPS(theProgress, "3D Curves", nbcurve); + for (i = 1; i <= nbcurve && aPS.More(); i++, aPS.Next()) { PrintCurve(Handle(Geom_Curve)::DownCast(myMap(i)),OS,Standard_True); } OS.precision(prec); @@ -861,7 +858,7 @@ //purpose : //======================================================================= -void GeomTools_CurveSet::Read(Standard_IStream& IS) +void GeomTools_CurveSet::Read(Standard_IStream& IS, const Message_ProgressRange& theProgress) { char buffer[255]; IS >> buffer; @@ -872,33 +869,9 @@ Standard_Integer i, nbcurve; IS >> nbcurve; - //OCC19559 - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "3D Curves", 0, nbcurve, 1); - for (i = 1; i <= nbcurve && PS.More(); i++, PS.Next()) { + Message_ProgressScope aPS(theProgress, "3D Curves", nbcurve); + for (i = 1; i <= nbcurve && aPS.More(); i++, aPS.Next()) { Handle(Geom_Curve) C = GeomTools_CurveSet::ReadCurve (IS); myMap.Add(C); } } - -//======================================================================= -//function : GetProgress -//purpose : -//======================================================================= - -Handle(Message_ProgressIndicator) GeomTools_CurveSet::GetProgress() const -{ - return myProgress; -} - -//======================================================================= -//function : SetProgress -//purpose : -//======================================================================= - -void GeomTools_CurveSet::SetProgress(const Handle(Message_ProgressIndicator)& PR) -{ - myProgress = PR; -} - - diff -Nru opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_CurveSet.hxx opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_CurveSet.hxx --- opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_CurveSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_CurveSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,7 +26,8 @@ #include #include #include -class Message_ProgressIndicator; +#include + class Standard_OutOfRange; class Geom_Curve; @@ -60,48 +61,29 @@ //! Writes the content of me on the stream in a //! format that can be read back by Read. - Standard_EXPORT void Write (Standard_OStream& OS) const; + Standard_EXPORT void Write (Standard_OStream& OS, + const Message_ProgressRange& theProgress = Message_ProgressRange()) const; //! Reads the content of me from the stream . me //! is first cleared. - Standard_EXPORT void Read (Standard_IStream& IS); + Standard_EXPORT void Read (Standard_IStream& IS, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Dumps the curve on the stream, if compact is True //! use the compact format that can be read back. - Standard_EXPORT static void PrintCurve (const Handle(Geom_Curve)& C, Standard_OStream& OS, const Standard_Boolean compact = Standard_False); + Standard_EXPORT static void PrintCurve (const Handle(Geom_Curve)& C, + Standard_OStream& OS, + const Standard_Boolean compact = Standard_False); //! Reads the curve from the stream. The curve is //! assumed to have been written with the Print //! method (compact = True). Standard_EXPORT static Handle(Geom_Curve) ReadCurve (Standard_IStream& IS); - - Standard_EXPORT void SetProgress (const Handle(Message_ProgressIndicator)& PR); - - Standard_EXPORT Handle(Message_ProgressIndicator) GetProgress() const; - - - - -protected: - - - - private: - - TColStd_IndexedMapOfTransient myMap; - Handle(Message_ProgressIndicator) myProgress; - }; - - - - - - #endif // _GeomTools_CurveSet_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_SurfaceSet.cxx opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_SurfaceSet.cxx --- opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_SurfaceSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_SurfaceSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,8 +36,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -633,16 +632,14 @@ //purpose : //======================================================================= -void GeomTools_SurfaceSet::Write(Standard_OStream& OS)const +void GeomTools_SurfaceSet::Write(Standard_OStream& OS, const Message_ProgressRange& theProgress)const { std::streamsize prec = OS.precision(17); Standard_Integer i, nbsurf = myMap.Extent(); OS << "Surfaces "<< nbsurf << "\n"; - //OCC19559 - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "Surfaces", 0, nbsurf, 1); - for (i = 1; i <= nbsurf && PS.More(); i++, PS.Next()) { + Message_ProgressScope aPS(theProgress, "Surfaces", nbsurf); + for (i = 1; i <= nbsurf && aPS.More(); i++, aPS.Next()) { PrintSurface(Handle(Geom_Surface)::DownCast(myMap(i)),OS,Standard_True); } OS.precision(prec); @@ -930,7 +927,7 @@ //purpose : //======================================================================= -Handle(Geom_Surface) GeomTools_SurfaceSet::ReadSurface(Standard_IStream& IS) +Handle(Geom_Surface) GeomTools_SurfaceSet::ReadSurface (Standard_IStream& IS) { Standard_Integer stype; @@ -1052,7 +1049,7 @@ //purpose : //======================================================================= -void GeomTools_SurfaceSet::Read(Standard_IStream& IS) +void GeomTools_SurfaceSet::Read(Standard_IStream& IS, const Message_ProgressRange& theProgress) { char buffer[255]; IS >> buffer; @@ -1063,34 +1060,9 @@ Standard_Integer i, nbsurf; IS >> nbsurf; - //OCC19559 - Handle(Message_ProgressIndicator) progress = GetProgress(); - Message_ProgressSentry PS(progress, "Surfaces", 0, nbsurf, 1); - for (i = 1; i <= nbsurf && PS.More(); i++, PS.Next()) { + Message_ProgressScope aPS(theProgress, "Surfaces", nbsurf); + for (i = 1; i <= nbsurf && aPS.More(); i++, aPS.Next()) { Handle(Geom_Surface) S = GeomTools_SurfaceSet::ReadSurface (IS); myMap.Add(S); } } - -//======================================================================= -//function : GetProgress -//purpose : -//======================================================================= - -Handle(Message_ProgressIndicator) GeomTools_SurfaceSet::GetProgress() const -{ - return myProgress; -} - -//======================================================================= -//function : SetProgress -//purpose : -//======================================================================= - -void GeomTools_SurfaceSet::SetProgress(const Handle(Message_ProgressIndicator)& PR) -{ - myProgress = PR; -} - - - diff -Nru opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_SurfaceSet.hxx opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_SurfaceSet.hxx --- opencascade-7.4.1+dfsg1/src/GeomTools/GeomTools_SurfaceSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomTools/GeomTools_SurfaceSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,7 +26,8 @@ #include #include #include -class Message_ProgressIndicator; +#include + class Standard_OutOfRange; class Geom_Surface; @@ -60,48 +61,29 @@ //! Writes the content of me on the stream in a //! format that can be read back by Read. - Standard_EXPORT void Write (Standard_OStream& OS) const; + Standard_EXPORT void Write (Standard_OStream& OS, + const Message_ProgressRange& theProgress = Message_ProgressRange()) const; //! Reads the content of me from the stream . me //! is first cleared. - Standard_EXPORT void Read (Standard_IStream& IS); + Standard_EXPORT void Read (Standard_IStream& IS, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Dumps the surface on the stream, if compact is True //! use the compact format that can be read back. - Standard_EXPORT static void PrintSurface (const Handle(Geom_Surface)& S, Standard_OStream& OS, const Standard_Boolean compact = Standard_False); + Standard_EXPORT static void PrintSurface (const Handle(Geom_Surface)& S, + Standard_OStream& OS, + const Standard_Boolean compact = Standard_False); //! Reads the surface from the stream. The surface is //! assumed to have been written with the Print //! method (compact = True). Standard_EXPORT static Handle(Geom_Surface) ReadSurface (Standard_IStream& IS); - - Standard_EXPORT void SetProgress (const Handle(Message_ProgressIndicator)& PR); - - Standard_EXPORT Handle(Message_ProgressIndicator) GetProgress() const; - - - - -protected: - - - - private: - - TColStd_IndexedMapOfTransient myMap; - Handle(Message_ProgressIndicator) myProgress; - }; - - - - - - #endif // _GeomTools_SurfaceSet_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/GeomToStep/GeomToStep_MakeCurve.cxx opencascade-7.5.1+dfsg1/src/GeomToStep/GeomToStep_MakeCurve.cxx --- opencascade-7.4.1+dfsg1/src/GeomToStep/GeomToStep_MakeCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GeomToStep/GeomToStep_MakeCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,6 +42,7 @@ #include #include #include +#include //============================================================================= // Creation d' une Curve de prostep a partir d' une Curve de Geom @@ -162,6 +163,10 @@ GeomToStep_MakeBoundedCurve MkBoundedC(L); theCurve = MkBoundedC.Value(); } + else if (C->IsKind(STANDARD_TYPE(Geom2d_TrimmedCurve))) { + GeomToStep_MakeCurve aMaker = (Handle(Geom2d_TrimmedCurve)::DownCast(C)->BasisCurve()); + theCurve = aMaker.Value(); + } else done = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Ax1.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Ax1.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Ax1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Ax1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include Standard_Boolean gp_Ax1::IsCoaxial (const gp_Ax1& Other, @@ -84,3 +85,25 @@ return A1; } +void gp_Ax1::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_VECTOR_CLASS (theOStream, "Location", 3, loc.X(), loc.Y(), loc.Z()) + OCCT_DUMP_VECTOR_CLASS (theOStream, "Direction", 3, vdir.X(), vdir.Y(), vdir.Z()) +} + +Standard_Boolean gp_Ax1::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + TCollection_AsciiString aStreamStr = Standard_Dump::Text (theSStream); + + gp_XYZ& anXYZLoc = loc.ChangeCoord(); + OCCT_INIT_VECTOR_CLASS (aStreamStr, "Location", aPos, 3, + &anXYZLoc.ChangeCoord (1), &anXYZLoc.ChangeCoord (2), &anXYZLoc.ChangeCoord (3)) + gp_XYZ aDir; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "Direction", aPos, 3, + &aDir.ChangeCoord (1), &aDir.ChangeCoord (2), &aDir.ChangeCoord (3)) + SetDirection (aDir); + + theStreamPos = aPos; + return Standard_True; +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Ax1.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Ax1.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Ax1.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Ax1.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -123,7 +123,7 @@ //! Performs the symmetrical transformation of an axis //! placement with respect to the point P which is the //! center of the symmetry and creates a new axis. - Standard_EXPORT Standard_NODISCARD gp_Ax1 Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Ax1 Mirrored (const gp_Pnt& P) const; //! Performs the symmetrical transformation of an axis @@ -135,7 +135,7 @@ //! Performs the symmetrical transformation of an axis //! placement with respect to an axis placement which //! is the axis of the symmetry and creates a new axis. - Standard_EXPORT Standard_NODISCARD gp_Ax1 Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Ax1 Mirrored (const gp_Ax1& A1) const; //! Performs the symmetrical transformation of an axis @@ -149,7 +149,7 @@ //! placement with respect to a plane. The axis placement //! locates the plane of the symmetry : //! (Location, XDirection, YDirection) and creates a new axis. - Standard_EXPORT Standard_NODISCARD gp_Ax1 Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Ax1 Mirrored (const gp_Ax2& A2) const; //! Rotates this axis at an angle Ang (in radians) about the axis A1 //! and assigns the result to this axis. @@ -205,7 +205,11 @@ Standard_NODISCARD gp_Ax1 Translated (const gp_Pnt& P1, const gp_Pnt& P2) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me from the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); protected: diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Ax22d.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Ax22d.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Ax22d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Ax22d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,7 @@ #include #include #include +#include void gp_Ax22d::Mirror (const gp_Pnt2d& P) { @@ -57,3 +58,10 @@ return Temp; } +void gp_Ax22d::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_VECTOR_CLASS (theOStream, "Location", 2, point.X(), point.Y()) + + OCCT_DUMP_VECTOR_CLASS (theOStream, "XAxis", 2, vxdir.X(), vxdir.Y()) + OCCT_DUMP_VECTOR_CLASS (theOStream, "YAxis", 2, vydir.X(), vydir.Y()) +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Ax22d.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Ax22d.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Ax22d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Ax22d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -152,7 +152,7 @@ //! The main direction of the axis placement is not changed. //! The "XDirection" and the "YDirection" are reversed. //! So the axis placement stay right handed. - Standard_EXPORT Standard_NODISCARD gp_Ax22d Mirrored (const gp_Pnt2d& P) const; + Standard_NODISCARD Standard_EXPORT gp_Ax22d Mirrored (const gp_Pnt2d& P) const; Standard_EXPORT void Mirror (const gp_Ax2d& A); @@ -164,7 +164,7 @@ //! point, on the "XDirection" and "YDirection". //! The resulting main "Direction" is the cross product between //! the "XDirection" and the "YDirection" after transformation. - Standard_EXPORT Standard_NODISCARD gp_Ax22d Mirrored (const gp_Ax2d& A) const; + Standard_NODISCARD Standard_EXPORT gp_Ax22d Mirrored (const gp_Ax2d& A) const; void Rotate (const gp_Pnt2d& P, const Standard_Real Ang); @@ -210,6 +210,9 @@ //! point . Standard_NODISCARD gp_Ax22d Translated (const gp_Pnt2d& P1, const gp_Pnt2d& P2) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Ax2.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Ax2.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Ax2.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Ax2.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,6 +28,7 @@ #include #include #include +#include gp_Ax2::gp_Ax2 (const gp_Pnt& P, const gp_Dir& V) : axis(P,V) @@ -113,3 +114,42 @@ return Temp; } +void gp_Ax2::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_VECTOR_CLASS (theOStream, "Location", 3, axis.Location().X(), axis.Location().Y(), axis.Location().Z()) + OCCT_DUMP_VECTOR_CLASS (theOStream, "Direction", 3, axis.Direction().X(), axis.Direction().Y(), axis.Direction().Z()) + + OCCT_DUMP_VECTOR_CLASS (theOStream, "XDirection", 3, vxdir.X(), vxdir.Y(), vxdir.Z()) + OCCT_DUMP_VECTOR_CLASS (theOStream, "YDirection", 3, vydir.X(), vydir.Y(), vydir.Z()) +} + +Standard_Boolean gp_Ax2::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + TCollection_AsciiString aStreamStr = Standard_Dump::Text (theSStream); + + gp_XYZ anXYZLoc; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "Location", aPos, 3, + &anXYZLoc.ChangeCoord (1), &anXYZLoc.ChangeCoord (2), &anXYZLoc.ChangeCoord (3)) + SetLocation (anXYZLoc); + + gp_XYZ aDir; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "Direction", aPos, 3, + &aDir.ChangeCoord (1), &aDir.ChangeCoord (2), &aDir.ChangeCoord (3)) + gp_XYZ aXDir; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "XDirection", aPos, 3, + &aXDir.ChangeCoord (1), &aXDir.ChangeCoord (2), &aXDir.ChangeCoord (3)) + gp_XYZ anYDir; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "YDirection", aPos, 3, + &anYDir.ChangeCoord (1), &anYDir.ChangeCoord (2), &anYDir.ChangeCoord (3)) + + axis.SetDirection (gp_Dir (aDir)); + vxdir = gp_Dir (aXDir); + vydir = gp_Dir (anYDir); + + if (!Direction().IsEqual (aDir, Precision::Confusion())) + return Standard_False; + + theStreamPos = aPos; + return Standard_True; +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Ax2d.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Ax2d.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Ax2d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Ax2d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ #include #include #include +#include Standard_Boolean gp_Ax2d::IsCoaxial (const gp_Ax2d& Other, const Standard_Real AngularTolerance, @@ -75,3 +76,10 @@ return AA; } +void gp_Ax2d::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, gp_Ax2d) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &loc) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &vdir) +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Ax2d.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Ax2d.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Ax2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Ax2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -123,7 +123,7 @@ //! Performs the symmetrical transformation of an axis //! placement with respect to the point P which is the //! center of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Ax2d Mirrored (const gp_Pnt2d& P) const; + Standard_NODISCARD Standard_EXPORT gp_Ax2d Mirrored (const gp_Pnt2d& P) const; Standard_EXPORT void Mirror (const gp_Ax2d& A); @@ -131,7 +131,7 @@ //! Performs the symmetrical transformation of an axis //! placement with respect to an axis placement which //! is the axis of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Ax2d Mirrored (const gp_Ax2d& A) const; + Standard_NODISCARD Standard_EXPORT gp_Ax2d Mirrored (const gp_Ax2d& A) const; void Rotate (const gp_Pnt2d& P, const Standard_Real Ang); @@ -168,6 +168,9 @@ //! point . Standard_NODISCARD gp_Ax2d Translated (const gp_Pnt2d& P1, const gp_Pnt2d& P2) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Ax2.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Ax2.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Ax2.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Ax2.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -202,7 +202,7 @@ //! product "X Direction" ^ "Y Direction". //! This maintains the right-handed property of the //! coordinate system. - Standard_EXPORT Standard_NODISCARD gp_Ax2 Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Ax2 Mirrored (const gp_Pnt& P) const; //! Performs a symmetrical transformation of this coordinate @@ -238,7 +238,7 @@ //! product "X Direction" ^ "Y Direction". //! This maintains the right-handed property of the //! coordinate system. - Standard_EXPORT Standard_NODISCARD gp_Ax2 Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Ax2 Mirrored (const gp_Ax1& A1) const; //! Performs a symmetrical transformation of this coordinate @@ -276,7 +276,7 @@ //! product "X Direction" ^ "Y Direction". //! This maintains the right-handed property of the //! coordinate system. - Standard_EXPORT Standard_NODISCARD gp_Ax2 Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Ax2 Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); @@ -323,6 +323,12 @@ Standard_NODISCARD gp_Ax2 Translated (const gp_Pnt& P1, const gp_Pnt& P2) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + + //! Inits the content of me from the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); + protected: diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Ax3.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Ax3.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Ax3.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Ax3.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,7 @@ #include #include #include +#include //======================================================================= //function : gp_Ax3 @@ -105,3 +106,40 @@ return Temp; } + +void gp_Ax3::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_VECTOR_CLASS (theOStream, "Location", 3, Location().X(), Location().Y(), Location().Z()) + OCCT_DUMP_VECTOR_CLASS (theOStream, "Direction", 3, Direction().X(), Direction().Y(), Direction().Z()) + + OCCT_DUMP_VECTOR_CLASS (theOStream, "XDirection", 3, XDirection().X(), XDirection().Y(), XDirection().Z()) + OCCT_DUMP_VECTOR_CLASS (theOStream, "YDirection", 3, YDirection().X(), YDirection().Y(), YDirection().Z()) +} + +Standard_Boolean gp_Ax3::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + TCollection_AsciiString aStreamStr = Standard_Dump::Text (theSStream); + + gp_XYZ anXYZLoc; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "Location", aPos, 3, + &anXYZLoc.ChangeCoord (1), &anXYZLoc.ChangeCoord (2), &anXYZLoc.ChangeCoord (3)) + SetLocation (anXYZLoc); + + gp_XYZ aDir; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "Direction", aPos, 3, + &aDir.ChangeCoord (1), &aDir.ChangeCoord (2), &aDir.ChangeCoord (3)) + gp_XYZ aXDir; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "XDirection", aPos, 3, + &aXDir.ChangeCoord (1), &aXDir.ChangeCoord (2), &aXDir.ChangeCoord (3)) + gp_XYZ anYDir; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "YDirection", aPos, 3, + &anYDir.ChangeCoord (1), &anYDir.ChangeCoord (2), &anYDir.ChangeCoord (3)) + + axis.SetDirection (gp_Dir (aDir)); + vxdir = gp_Dir (aXDir); + vydir = gp_Dir (anYDir); + + theStreamPos = aPos; + return Standard_True; +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Ax3.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Ax3.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Ax3.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Ax3.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -218,7 +218,7 @@ //! The main direction of the axis placement is not changed. //! The "XDirection" and the "YDirection" are reversed. //! So the axis placement stay right handed. - Standard_EXPORT Standard_NODISCARD gp_Ax3 Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Ax3 Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -230,7 +230,7 @@ //! point, on the "XDirection" and "YDirection". //! The resulting main "Direction" is the cross product between //! the "XDirection" and the "YDirection" after transformation. - Standard_EXPORT Standard_NODISCARD gp_Ax3 Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Ax3 Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -243,7 +243,7 @@ //! point, on the "XDirection" and "YDirection". //! The resulting main "Direction" is the cross product between //! the "XDirection" and the "YDirection" after transformation. - Standard_EXPORT Standard_NODISCARD gp_Ax3 Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Ax3 Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); @@ -290,7 +290,11 @@ Standard_NODISCARD gp_Ax3 Translated (const gp_Pnt& P1, const gp_Pnt& P2) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me from the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); protected: diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Circ2d.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Circ2d.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Circ2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Circ2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -167,14 +167,14 @@ //! Performs the symmetrical transformation of a circle with respect //! to the point P which is the center of the symmetry - Standard_EXPORT Standard_NODISCARD gp_Circ2d Mirrored (const gp_Pnt2d& P) const; + Standard_NODISCARD Standard_EXPORT gp_Circ2d Mirrored (const gp_Pnt2d& P) const; Standard_EXPORT void Mirror (const gp_Ax2d& A); //! Performs the symmetrical transformation of a circle with respect //! to an axis placement which is the axis of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Circ2d Mirrored (const gp_Ax2d& A) const; + Standard_NODISCARD Standard_EXPORT gp_Circ2d Mirrored (const gp_Ax2d& A) const; void Rotate (const gp_Pnt2d& P, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Circ.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Circ.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Circ.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Circ.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -153,7 +153,7 @@ //! Performs the symmetrical transformation of a circle //! with respect to the point P which is the center of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Circ Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Circ Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -161,7 +161,7 @@ //! Performs the symmetrical transformation of a circle with //! respect to an axis placement which is the axis of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Circ Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Circ Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -169,7 +169,7 @@ //! Performs the symmetrical transformation of a circle with respect //! to a plane. The axis placement A2 locates the plane of the //! of the symmetry : (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Circ Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Circ Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Cone.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Cone.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Cone.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Cone.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -163,7 +163,7 @@ //! Performs the symmetrical transformation of a cone //! with respect to the point P which is the center of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Cone Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Cone Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -171,7 +171,7 @@ //! Performs the symmetrical transformation of a cone with //! respect to an axis placement which is the axis of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Cone Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Cone Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -179,7 +179,7 @@ //! Performs the symmetrical transformation of a cone with respect //! to a plane. The axis placement A2 locates the plane of the //! of the symmetry : (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Cone Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Cone Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Cylinder.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Cylinder.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Cylinder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Cylinder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -125,7 +125,7 @@ //! Performs the symmetrical transformation of a cylinder //! with respect to the point P which is the center of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Cylinder Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Cylinder Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -133,7 +133,7 @@ //! Performs the symmetrical transformation of a cylinder with //! respect to an axis placement which is the axis of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Cylinder Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Cylinder Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -141,7 +141,7 @@ //! Performs the symmetrical transformation of a cylinder with respect //! to a plane. The axis placement A2 locates the plane of the //! of the symmetry : (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Cylinder Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Cylinder Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Dir2d.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Dir2d.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Dir2d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Dir2d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,6 +21,7 @@ #include #include #include +#include #include Standard_Real gp_Dir2d::Angle (const gp_Dir2d& Other) const @@ -101,3 +102,7 @@ return V; } +void gp_Dir2d::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_VECTOR_CLASS (theOStream, "gp_Dir2d", 2, coord.X(), coord.Y()) +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Dir2d.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Dir2d.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Dir2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Dir2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -223,7 +223,7 @@ //! Performs the symmetrical transformation of a direction //! with respect to the direction V which is the center of //! the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Dir2d Mirrored (const gp_Dir2d& V) const; + Standard_NODISCARD Standard_EXPORT gp_Dir2d Mirrored (const gp_Dir2d& V) const; Standard_EXPORT void Mirror (const gp_Ax2d& A); @@ -231,7 +231,7 @@ //! Performs the symmetrical transformation of a direction //! with respect to an axis placement which is the axis //! of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Dir2d Mirrored (const gp_Ax2d& A) const; + Standard_NODISCARD Standard_EXPORT gp_Dir2d Mirrored (const gp_Ax2d& A) const; void Rotate (const Standard_Real Ang); @@ -249,6 +249,9 @@ //! direction is reversed. Standard_NODISCARD gp_Dir2d Transformed (const gp_Trsf2d& T) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Dir.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Dir.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Dir.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Dir.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ #include #include #include +#include #include Standard_Real gp_Dir::Angle (const gp_Dir& Other) const @@ -139,3 +140,17 @@ return V; } +void gp_Dir::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_VECTOR_CLASS (theOStream, "gp_Dir", 3, coord.X(), coord.Y(), coord.Z()) +} + +Standard_Boolean gp_Dir::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + OCCT_INIT_VECTOR_CLASS (Standard_Dump::Text (theSStream), "gp_Dir", aPos, 3, &coord.ChangeCoord (1), &coord.ChangeCoord (2), &coord.ChangeCoord (3)) + + theStreamPos = aPos; + return Standard_True; +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Dir.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Dir.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Dir.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Dir.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -228,7 +228,7 @@ //! Performs the symmetrical transformation of a direction //! with respect to the direction V which is the center of //! the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Dir Mirrored (const gp_Dir& V) const; + Standard_NODISCARD Standard_EXPORT gp_Dir Mirrored (const gp_Dir& V) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -236,7 +236,7 @@ //! Performs the symmetrical transformation of a direction //! with respect to an axis placement which is the axis //! of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Dir Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Dir Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -244,7 +244,7 @@ //! Performs the symmetrical transformation of a direction //! with respect to a plane. The axis placement A2 locates //! the plane of the symmetry : (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Dir Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Dir Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); @@ -263,6 +263,11 @@ Standard_NODISCARD gp_Dir Transformed (const gp_Trsf& T) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + + //! Inits the content of me from the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); protected: diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Elips2d.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Elips2d.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Elips2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Elips2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -208,14 +208,14 @@ //! Performs the symmetrical transformation of a ellipse with respect //! to the point P which is the center of the symmetry - Standard_EXPORT Standard_NODISCARD gp_Elips2d Mirrored (const gp_Pnt2d& P) const; + Standard_NODISCARD Standard_EXPORT gp_Elips2d Mirrored (const gp_Pnt2d& P) const; Standard_EXPORT void Mirror (const gp_Ax2d& A); //! Performs the symmetrical transformation of a ellipse with respect //! to an axis placement which is the axis of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Elips2d Mirrored (const gp_Ax2d& A) const; + Standard_NODISCARD Standard_EXPORT gp_Elips2d Mirrored (const gp_Ax2d& A) const; void Rotate (const gp_Pnt2d& P, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Elips.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Elips.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Elips.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Elips.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -198,14 +198,14 @@ //! Performs the symmetrical transformation of an ellipse with //! respect to the point P which is the center of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Elips Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Elips Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); //! Performs the symmetrical transformation of an ellipse with //! respect to an axis placement which is the axis of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Elips Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Elips Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -213,7 +213,7 @@ //! Performs the symmetrical transformation of an ellipse with //! respect to a plane. The axis placement A2 locates the plane //! of the symmetry (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Elips Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Elips Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_GTrsf.cxx opencascade-7.5.1+dfsg1/src/gp/gp_GTrsf.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_GTrsf.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_GTrsf.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ #include #include #include +#include #include void gp_GTrsf::SetTranslationPart (const gp_XYZ& Coord) @@ -157,3 +158,18 @@ return; } } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void gp_GTrsf::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, gp_GTrsf) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &matrix) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &loc) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, shape) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, scale) +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_GTrsf.hxx opencascade-7.5.1+dfsg1/src/gp/gp_GTrsf.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_GTrsf.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_GTrsf.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -244,25 +244,44 @@ gp_Trsf Trsf() const; + //! Convert transformation to 4x4 matrix. + template + void GetMat4 (NCollection_Mat4& theMat) const + { + if (shape == gp_Identity) + { + theMat.InitIdentity(); + return; + } + + theMat.SetValue (0, 0, static_cast (Value (1, 1))); + theMat.SetValue (0, 1, static_cast (Value (1, 2))); + theMat.SetValue (0, 2, static_cast (Value (1, 3))); + theMat.SetValue (0, 3, static_cast (Value (1, 4))); + theMat.SetValue (1, 0, static_cast (Value (2, 1))); + theMat.SetValue (1, 1, static_cast (Value (2, 2))); + theMat.SetValue (1, 2, static_cast (Value (2, 3))); + theMat.SetValue (1, 3, static_cast (Value (2, 4))); + theMat.SetValue (2, 0, static_cast (Value (3, 1))); + theMat.SetValue (2, 1, static_cast (Value (3, 2))); + theMat.SetValue (2, 2, static_cast (Value (3, 3))); + theMat.SetValue (2, 3, static_cast (Value (3, 4))); + theMat.SetValue (3, 0, static_cast (0)); + theMat.SetValue (3, 1, static_cast (0)); + theMat.SetValue (3, 2, static_cast (0)); + theMat.SetValue (3, 3, static_cast (1)); + } - - -protected: - - - - + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; private: - - gp_Mat matrix; gp_XYZ loc; gp_TrsfForm shape; Standard_Real scale; - }; diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Hypr2d.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Hypr2d.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Hypr2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Hypr2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -279,14 +279,14 @@ //! Performs the symmetrical transformation of an hyperbola with //! respect to the point P which is the center of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Hypr2d Mirrored (const gp_Pnt2d& P) const; + Standard_NODISCARD Standard_EXPORT gp_Hypr2d Mirrored (const gp_Pnt2d& P) const; Standard_EXPORT void Mirror (const gp_Ax2d& A); //! Performs the symmetrical transformation of an hyperbola with //! respect to an axis placement which is the axis of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Hypr2d Mirrored (const gp_Ax2d& A) const; + Standard_NODISCARD Standard_EXPORT gp_Hypr2d Mirrored (const gp_Ax2d& A) const; void Rotate (const gp_Pnt2d& P, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Hypr.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Hypr.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Hypr.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Hypr.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -251,14 +251,14 @@ //! Performs the symmetrical transformation of an hyperbola with //! respect to the point P which is the center of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Hypr Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Hypr Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); //! Performs the symmetrical transformation of an hyperbola with //! respect to an axis placement which is the axis of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Hypr Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Hypr Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -266,7 +266,7 @@ //! Performs the symmetrical transformation of an hyperbola with //! respect to a plane. The axis placement A2 locates the plane //! of the symmetry (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Hypr Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Hypr Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Lin2d.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Lin2d.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Lin2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Lin2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -143,7 +143,7 @@ //! Performs the symmetrical transformation of a line //! with respect to the point

which is the center //! of the symmetry - Standard_EXPORT Standard_NODISCARD gp_Lin2d Mirrored (const gp_Pnt2d& P) const; + Standard_NODISCARD Standard_EXPORT gp_Lin2d Mirrored (const gp_Pnt2d& P) const; Standard_EXPORT void Mirror (const gp_Ax2d& A); @@ -151,7 +151,7 @@ //! Performs the symmetrical transformation of a line //! with respect to an axis placement which is the axis //! of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Lin2d Mirrored (const gp_Ax2d& A) const; + Standard_NODISCARD Standard_EXPORT gp_Lin2d Mirrored (const gp_Ax2d& A) const; void Rotate (const gp_Pnt2d& P, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Lin.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Lin.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Lin.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Lin.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -132,7 +132,7 @@ //! Performs the symmetrical transformation of a line //! with respect to the point P which is the center of //! the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Lin Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Lin Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -140,7 +140,7 @@ //! Performs the symmetrical transformation of a line //! with respect to an axis placement which is the axis //! of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Lin Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Lin Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -149,7 +149,7 @@ //! with respect to a plane. The axis placement //! locates the plane of the symmetry : //! (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Lin Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Lin Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Mat.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Mat.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Mat.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Mat.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -273,7 +273,7 @@ //function : DumpJson //purpose : //======================================================================= -void gp_Mat::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const +void gp_Mat::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - OCCT_DUMP_VECTOR_CLASS (theOStream, gp_Mat, 9, Mat00, Mat01, Mat02, Mat10, Mat11, Mat12, Mat20, Mat21, Mat22); + OCCT_DUMP_VECTOR_CLASS (theOStream, "gp_Mat", 9, Mat00, Mat01, Mat02, Mat10, Mat11, Mat12, Mat20, Mat21, Mat22) } diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Mat.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Mat.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Mat.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Mat.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -256,7 +256,7 @@ Standard_NODISCARD gp_Mat Transposed() const; //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; friend class gp_XYZ; diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Parab2d.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Parab2d.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Parab2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Parab2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -188,14 +188,14 @@ //! Performs the symmetrical transformation of a parabola with respect //! to the point P which is the center of the symmetry - Standard_EXPORT Standard_NODISCARD gp_Parab2d Mirrored (const gp_Pnt2d& P) const; + Standard_NODISCARD Standard_EXPORT gp_Parab2d Mirrored (const gp_Pnt2d& P) const; Standard_EXPORT void Mirror (const gp_Ax2d& A); //! Performs the symmetrical transformation of a parabola with respect //! to an axis placement which is the axis of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Parab2d Mirrored (const gp_Ax2d& A) const; + Standard_NODISCARD Standard_EXPORT gp_Parab2d Mirrored (const gp_Ax2d& A) const; void Rotate (const gp_Pnt2d& P, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Parab.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Parab.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Parab.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Parab.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -165,7 +165,7 @@ //! Performs the symmetrical transformation of a parabola //! with respect to the point P which is the center of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Parab Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Parab Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -173,7 +173,7 @@ //! Performs the symmetrical transformation of a parabola //! with respect to an axis placement which is the axis of //! the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Parab Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Parab Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -181,7 +181,7 @@ //! Performs the symmetrical transformation of a parabola //! with respect to a plane. The axis placement A2 locates //! the plane of the symmetry (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Parab Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Parab Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Pln.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Pln.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Pln.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Pln.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,6 +30,7 @@ #include #include #include +#include gp_Pln::gp_Pln (const gp_Pnt& P, const gp_Dir& V) @@ -130,3 +131,7 @@ return Pl; } +void gp_Pln::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &pos) +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Pln.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Pln.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Pln.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Pln.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -178,7 +178,7 @@ //! Warnings : //! The normal direction to the plane is not changed. //! The "XAxis" and the "YAxis" are reversed. - Standard_EXPORT Standard_NODISCARD gp_Pln Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Pln Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -190,7 +190,7 @@ //! the "XDirection" and the "YDirection" after transformation //! if the initial plane was right handed, else it is the //! opposite. - Standard_EXPORT Standard_NODISCARD gp_Pln Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Pln Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -202,7 +202,7 @@ //! direction is the cross product between the "XDirection" //! and the "YDirection" after transformation if the initial //! plane was right handed, else it is the opposite. - Standard_EXPORT Standard_NODISCARD gp_Pln Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Pln Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); @@ -241,6 +241,9 @@ Standard_NODISCARD gp_Pln Translated (const gp_Pnt& P1, const gp_Pnt& P2) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Pnt2d.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Pnt2d.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Pnt2d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Pnt2d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ #include #include #include +#include #include void gp_Pnt2d::Transform (const gp_Trsf2d& T) @@ -69,3 +70,7 @@ return P; } +void gp_Pnt2d::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_VECTOR_CLASS (theOStream, "gp_Pnt2d", 2, coord.X(), coord.Y()) +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Pnt2d.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Pnt2d.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Pnt2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Pnt2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -114,14 +114,14 @@ //! Performs the symmetrical transformation of a point //! with respect to an axis placement which is the axis - Standard_EXPORT Standard_NODISCARD gp_Pnt2d Mirrored (const gp_Pnt2d& P) const; + Standard_NODISCARD Standard_EXPORT gp_Pnt2d Mirrored (const gp_Pnt2d& P) const; Standard_EXPORT void Mirror (const gp_Ax2d& A); //! Rotates a point. A1 is the axis of the rotation. //! Ang is the angular value of the rotation in radians. - Standard_EXPORT Standard_NODISCARD gp_Pnt2d Mirrored (const gp_Ax2d& A) const; + Standard_NODISCARD Standard_EXPORT gp_Pnt2d Mirrored (const gp_Ax2d& A) const; void Rotate (const gp_Pnt2d& P, const Standard_Real Ang); @@ -151,6 +151,9 @@ Standard_NODISCARD gp_Pnt2d Translated (const gp_Pnt2d& P1, const gp_Pnt2d& P2) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Pnt.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Pnt.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Pnt.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Pnt.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ #include #include #include +#include #include void gp_Pnt::Transform (const gp_Trsf& T) @@ -85,3 +86,17 @@ return P; } +void gp_Pnt::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_VECTOR_CLASS (theOStream, "gp_Pnt", 3, coord.X(), coord.Y(), coord.Z()) +} + +Standard_Boolean gp_Pnt::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + OCCT_INIT_VECTOR_CLASS (Standard_Dump::Text (theSStream), "gp_Pnt", aPos, 3, &coord.ChangeCoord (1), &coord.ChangeCoord (2), &coord.ChangeCoord (3)) + + theStreamPos = aPos; + return Standard_True; +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Pnt.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Pnt.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Pnt.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Pnt.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -129,7 +129,7 @@ //! Performs the symmetrical transformation of a point //! with respect to an axis placement which is the axis //! of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Pnt Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Pnt Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -137,14 +137,14 @@ //! Performs the symmetrical transformation of a point //! with respect to a plane. The axis placement A2 locates //! the plane of the symmetry : (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Pnt Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Pnt Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); //! Rotates a point. A1 is the axis of the rotation. //! Ang is the angular value of the rotation in radians. - Standard_EXPORT Standard_NODISCARD gp_Pnt Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Pnt Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); @@ -174,7 +174,11 @@ Standard_NODISCARD gp_Pnt Translated (const gp_Pnt& P1, const gp_Pnt& P2) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me from the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); protected: diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Quaternion.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Quaternion.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Quaternion.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Quaternion.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,9 +48,6 @@ //! Creates quaternion directly from component values gp_Quaternion(const Standard_Real x, const Standard_Real y, const Standard_Real z, const Standard_Real w); - //! Creates copy of another quaternion - gp_Quaternion(const gp_Quaternion& theToCopy); - //! Creates quaternion representing shortest-arc rotation //! operator producing vector theVecTo from vector theVecFrom. gp_Quaternion(const gp_Vec& theVecFrom, const gp_Vec& theVecTo); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Quaternion.lxx opencascade-7.5.1+dfsg1/src/gp/gp_Quaternion.lxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Quaternion.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Quaternion.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,16 +37,6 @@ //purpose : //======================================================================= -inline gp_Quaternion::gp_Quaternion (const gp_Quaternion& theToCopy) -: x(theToCopy.x), y(theToCopy.y), z(theToCopy.z), w(theToCopy.w) -{ -} - -//======================================================================= -//function : gp_Quaternion -//purpose : -//======================================================================= - inline gp_Quaternion::gp_Quaternion (const gp_Vec& theVecFrom, const gp_Vec& theVecTo) { SetRotation (theVecFrom, theVecTo); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Sphere.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Sphere.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Sphere.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Sphere.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -132,7 +132,7 @@ //! Performs the symmetrical transformation of a sphere //! with respect to the point P which is the center of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Sphere Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Sphere Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -140,7 +140,7 @@ //! Performs the symmetrical transformation of a sphere with //! respect to an axis placement which is the axis of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Sphere Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Sphere Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -148,7 +148,7 @@ //! Performs the symmetrical transformation of a sphere with respect //! to a plane. The axis placement A2 locates the plane of the //! of the symmetry : (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Sphere Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Sphere Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Torus.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Torus.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Torus.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Torus.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -174,7 +174,7 @@ //! Performs the symmetrical transformation of a torus //! with respect to the point P which is the center of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Torus Mirrored (const gp_Pnt& P) const; + Standard_NODISCARD Standard_EXPORT gp_Torus Mirrored (const gp_Pnt& P) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -182,7 +182,7 @@ //! Performs the symmetrical transformation of a torus with //! respect to an axis placement which is the axis of the //! symmetry. - Standard_EXPORT Standard_NODISCARD gp_Torus Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Torus Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -190,7 +190,7 @@ //! Performs the symmetrical transformation of a torus with respect //! to a plane. The axis placement A2 locates the plane of the //! of the symmetry : (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Torus Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Torus Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Trsf.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Trsf.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Trsf.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Trsf.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -130,6 +130,57 @@ } //======================================================================= +//function : SetRotationPart +//purpose : +//======================================================================= +void gp_Trsf::SetRotationPart (const gp_Quaternion& theR) +{ + const bool hasRotation = !theR.IsEqual (gp_Quaternion()); + if (hasRotation) + { + matrix = theR.GetMatrix(); + } + else + { + matrix.SetIdentity(); + } + + switch (shape) + { + case gp_Identity: + { + if (hasRotation) + { + shape = gp_Rotation; + } + break; + } + case gp_Rotation: + { + if (!hasRotation) + { + shape = gp_Identity; + } + break; + } + case gp_Translation: + case gp_PntMirror: + case gp_Ax1Mirror: + case gp_Ax2Mirror: + case gp_Scale: + case gp_CompoundTrsf: + case gp_Other: + { + if (hasRotation) + { + shape = gp_CompoundTrsf; + } + break; + } + } +} + +//======================================================================= //function : SetScale //purpose : //======================================================================= @@ -855,13 +906,48 @@ //function : DumpJson //purpose : //======================================================================= -void gp_Trsf::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void gp_Trsf::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_VECTOR_CLASS (theOStream, "Location", 3, loc.X(), loc.Y(), loc.Z()) + OCCT_DUMP_VECTOR_CLASS (theOStream, "Matrix", 9, matrix.Value(1, 1), matrix.Value(1, 2), matrix.Value(1, 3), + matrix.Value(2, 1), matrix.Value(2, 2), matrix.Value(2, 3), + matrix.Value(3, 1), matrix.Value(3, 2), matrix.Value(3, 3)) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, shape) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, scale) +} + +//======================================================================= +//function : InitFromJson +//purpose : +//======================================================================= +Standard_Boolean gp_Trsf::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) { - OCCT_DUMP_CLASS_BEGIN (theOStream, gp_Trsf); + Standard_Integer aPos = theStreamPos; + TCollection_AsciiString aStreamStr = Standard_Dump::Text (theSStream); + + gp_XYZ anXYZLoc; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "Location", aPos, 3, + &anXYZLoc.ChangeCoord (1), &anXYZLoc.ChangeCoord (2), &anXYZLoc.ChangeCoord (3)) + SetTranslation (anXYZLoc); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &loc); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &matrix); + Standard_Real mymatrix[3][3]; + OCCT_INIT_VECTOR_CLASS (aStreamStr, "Matrix", aPos, 9, &mymatrix[0][0], &mymatrix[0][1], &mymatrix[0][2], + &mymatrix[1][0], &mymatrix[1][1], &mymatrix[1][2], + &mymatrix[2][0], &mymatrix[2][1], &mymatrix[2][2]) + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 3; j++) + { + matrix.SetValue (i + 1, j + 1, mymatrix[i][j]); + } + } - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, shape); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, scale); + Standard_Real ashape; + OCCT_INIT_FIELD_VALUE_INTEGER (aStreamStr, aPos, ashape); + shape = (gp_TrsfForm)((Standard_Integer)ashape); + + OCCT_INIT_FIELD_VALUE_REAL (aStreamStr, aPos, scale); + + theStreamPos = aPos; + return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Trsf.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Trsf.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Trsf.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Trsf.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ #include #include #include +#include #include class Standard_ConstructionError; @@ -110,13 +111,14 @@ //! A1 is the rotation axis and Ang is the angular value of the //! rotation in radians. Standard_EXPORT void SetRotation (const gp_Ax1& A1, const Standard_Real Ang); - //! Changes the transformation into a rotation defined by quaternion. //! Note that rotation is performed around origin, i.e. //! no translation is involved. Standard_EXPORT void SetRotation (const gp_Quaternion& R); - + + //! Replaces the rotation part with specified quaternion. + Standard_EXPORT void SetRotationPart (const gp_Quaternion& R); //! Changes the transformation into a scale. //! P is the center of the scale and S is the scaling value. @@ -351,7 +353,10 @@ } //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + + //! Inits the content of me from the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); friend class gp_GTrsf; diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Vec2d.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Vec2d.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Vec2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Vec2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -265,7 +265,7 @@ //! Performs the symmetrical transformation of a vector //! with respect to the vector V which is the center of //! the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Vec2d Mirrored (const gp_Vec2d& V) const; + Standard_NODISCARD Standard_EXPORT gp_Vec2d Mirrored (const gp_Vec2d& V) const; //! Performs the symmetrical transformation of a vector @@ -277,7 +277,7 @@ //! Performs the symmetrical transformation of a vector //! with respect to an axis placement which is the axis //! of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Vec2d Mirrored (const gp_Ax2d& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Vec2d Mirrored (const gp_Ax2d& A1) const; void Rotate (const Standard_Real Ang); diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Vec.cxx opencascade-7.5.1+dfsg1/src/gp/gp_Vec.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Vec.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Vec.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,6 +30,7 @@ #include #include #include +#include #include Standard_Boolean gp_Vec::IsEqual @@ -126,3 +127,12 @@ Vres.Mirror (A2); return Vres; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void gp_Vec::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_VECTOR_CLASS (theOStream, "gp_Vec", 3, coord.X(), coord.Y(), coord.Z()) +} diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_Vec.hxx opencascade-7.5.1+dfsg1/src/gp/gp_Vec.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_Vec.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_Vec.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -319,7 +319,7 @@ //! Performs the symmetrical transformation of a vector //! with respect to the vector V which is the center of //! the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Vec Mirrored (const gp_Vec& V) const; + Standard_NODISCARD Standard_EXPORT gp_Vec Mirrored (const gp_Vec& V) const; Standard_EXPORT void Mirror (const gp_Ax1& A1); @@ -327,7 +327,7 @@ //! Performs the symmetrical transformation of a vector //! with respect to an axis placement which is the axis //! of the symmetry. - Standard_EXPORT Standard_NODISCARD gp_Vec Mirrored (const gp_Ax1& A1) const; + Standard_NODISCARD Standard_EXPORT gp_Vec Mirrored (const gp_Ax1& A1) const; Standard_EXPORT void Mirror (const gp_Ax2& A2); @@ -335,7 +335,7 @@ //! Performs the symmetrical transformation of a vector //! with respect to a plane. The axis placement A2 locates //! the plane of the symmetry : (Location, XDirection, YDirection). - Standard_EXPORT Standard_NODISCARD gp_Vec Mirrored (const gp_Ax2& A2) const; + Standard_NODISCARD Standard_EXPORT gp_Vec Mirrored (const gp_Ax2& A2) const; void Rotate (const gp_Ax1& A1, const Standard_Real Ang); @@ -354,6 +354,9 @@ //! Transforms a vector with the transformation T. Standard_NODISCARD gp_Vec Transformed (const gp_Trsf& T) const; + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_XYZ.cxx opencascade-7.5.1+dfsg1/src/gp/gp_XYZ.cxx --- opencascade-7.4.1+dfsg1/src/gp/gp_XYZ.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_XYZ.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,21 @@ //function : DumpJson //purpose : //======================================================================= -void gp_XYZ::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const +void gp_XYZ::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - OCCT_DUMP_VECTOR_CLASS (theOStream, gp_XYZ, 3, x, y, z) + OCCT_DUMP_VECTOR_CLASS (theOStream, "gp_XYZ", 3, x, y, z) } + +//======================================================================= +//function : InitFromJson +//purpose : +//======================================================================= +Standard_Boolean gp_XYZ::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + OCCT_INIT_VECTOR_CLASS (Standard_Dump::Text (theSStream), "gp_XYZ", aPos, 3, &x, &y, &z) + + theStreamPos = aPos; + return Standard_True; +} + diff -Nru opencascade-7.4.1+dfsg1/src/gp/gp_XYZ.hxx opencascade-7.5.1+dfsg1/src/gp/gp_XYZ.hxx --- opencascade-7.4.1+dfsg1/src/gp/gp_XYZ.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/gp/gp_XYZ.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,7 @@ #include #include +#include class Standard_ConstructionError; class Standard_OutOfRange; @@ -328,8 +329,10 @@ //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! Inits the content of me from the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); protected: diff -Nru opencascade-7.4.1+dfsg1/src/GProp/GProp_PEquation.cxx opencascade-7.5.1+dfsg1/src/GProp/GProp_PEquation.cxx --- opencascade-7.4.1+dfsg1/src/GProp/GProp_PEquation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/GProp/GProp_PEquation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,7 @@ GProp_PEquation::GProp_PEquation(const TColgp_Array1OfPnt& Pnts, const Standard_Real Tol) +: type(GProp_None) { GProp_PGProps Pmat(Pnts); g = Pmat.CentreOfMass(); diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/FILES opencascade-7.5.1+dfsg1/src/Graphic3d/FILES --- opencascade-7.4.1+dfsg1/src/Graphic3d/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -39,6 +39,7 @@ Graphic3d_BvhCStructureSetTrsfPers.hxx Graphic3d_Camera.cxx Graphic3d_Camera.hxx +Graphic3d_CameraTile.cxx Graphic3d_CameraTile.hxx Graphic3d_CappingFlags.hxx Graphic3d_CLight.cxx @@ -110,10 +111,13 @@ Graphic3d_NameOfTextureEnv.hxx Graphic3d_NameOfTexturePlane.hxx Graphic3d_NMapOfTransient.hxx +Graphic3d_PBRMaterial.cxx +Graphic3d_PBRMaterial.hxx Graphic3d_PolygonOffset.cxx Graphic3d_PolygonOffset.hxx Graphic3d_PriorityDefinitionError.hxx Graphic3d_RenderingMode.hxx +Graphic3d_RenderingParams.cxx Graphic3d_RenderingParams.hxx Graphic3d_RenderTransparentMethod.hxx Graphic3d_SequenceOfGroup.hxx @@ -162,6 +166,7 @@ Graphic3d_TextureUnit.hxx Graphic3d_TextureSet.cxx Graphic3d_TextureSet.hxx +Graphic3d_TextureSetBits.hxx Graphic3d_ToneMappingMethod.hxx Graphic3d_TransformError.hxx Graphic3d_TransformPers.hxx diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_AspectLine3d.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_AspectLine3d.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_AspectLine3d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_AspectLine3d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,6 +39,6 @@ { myShadingModel = Graphic3d_TOSM_UNLIT; myInteriorColor.SetRGB (theColor); - myLineType = theType; + SetLineType (theType); SetLineWidth ((float)theWidth); } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_AspectLine3d.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_AspectLine3d.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_AspectLine3d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_AspectLine3d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,7 +46,7 @@ Aspect_TypeOfLine Type() const { return myLineType; } //! Modifies the type of line. - void SetType (const Aspect_TypeOfLine theType) { myLineType = theType; } + void SetType (const Aspect_TypeOfLine theType) { SetLineType (theType); } //! Return line width. Standard_ShortReal Width() const { return myLineWidth; } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Aspects.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Aspects.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Aspects.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Aspects.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,6 +30,8 @@ myAlphaCutoff (0.5f), myLineType (Aspect_TOL_SOLID), myLineWidth (1.0f), + myLineFactor (1), + myLinePattern (0xFFFF), myMarkerType (Aspect_TOM_POINT), myMarkerScale (1.0f), myTextStyle (Aspect_TOST_NORMAL), @@ -66,20 +68,33 @@ //function : DumpJson //purpose : //======================================================================= -void Graphic3d_Aspects::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Graphic3d_Aspects::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Graphic3d_Aspects); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myInteriorColor); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBackInteriorColor); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myEdgeColor); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPolygonOffset); - - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToSkipFirstEdge); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDistinguishMaterials); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDrawEdges); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDrawSilhouette); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToSuppressBackFaces); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToMapTexture); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsTextZoomable); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myInteriorColor) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBackInteriorColor) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myEdgeColor) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPolygonOffset) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToSkipFirstEdge) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDistinguishMaterials) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDrawEdges) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDrawSilhouette) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToSuppressBackFaces) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToMapTexture) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsTextZoomable) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAlphaMode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAlphaCutoff) + + if (!myTextFont.IsNull()) + { + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myTextFont->String()) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTextStyle) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTextDisplayType) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTextFontAspect) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTextAngle) } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Aspects.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Aspects.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Aspects.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Aspects.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -238,7 +238,34 @@ Aspect_TypeOfLine LineType() const { return myLineType; } //! Modifies the line type - void SetLineType (Aspect_TypeOfLine theType) { myLineType = theType; } + void SetLineType (Aspect_TypeOfLine theType) + { + myLineType = theType; + myLinePattern = DefaultLinePatternForType (theType); + } + + //! Return custom stipple line pattern; 0xFFFF by default. + uint16_t LinePattern() const { return myLinePattern; } + + //! Modifies the stipple line pattern, and changes line type to Aspect_TOL_USERDEFINED for non-standard pattern. + void SetLinePattern (uint16_t thePattern) + { + myLineType = DefaultLineTypeForPattern (thePattern); + myLinePattern = thePattern; + } + + //! Return a multiplier for each bit in the line stipple pattern within [1, 256] range; 1 by default. + uint16_t LineStippleFactor() const { return myLineFactor; } + + //! Set a multiplier for each bit in the line stipple pattern. + void SetLineStippleFactor (uint16_t theFactor) + { + if (theFactor == 0 || theFactor > 256) + { + throw Standard_OutOfRange ("Graphic3d_Aspects::SetLineStippleFactor(), bad factor value"); + } + myLineFactor = theFactor; + } //! Return width for edges in pixels; 1.0 by default. Standard_ShortReal LineWidth() const { return myLineWidth; } @@ -254,6 +281,36 @@ myLineWidth = theWidth; } + //! Return stipple line pattern for line type. + static uint16_t DefaultLinePatternForType (Aspect_TypeOfLine theType) + { + switch (theType) + { + case Aspect_TOL_DASH: return 0xFFC0; + case Aspect_TOL_DOT: return 0xCCCC; + case Aspect_TOL_DOTDASH: return 0xFF18; + case Aspect_TOL_EMPTY: return 0x0000; + case Aspect_TOL_SOLID: return 0xFFFF; + case Aspect_TOL_USERDEFINED: return 0xFF24; + } + return 0xFFFF; + } + + //! Return line type for stipple line pattern. + static Aspect_TypeOfLine DefaultLineTypeForPattern (uint16_t thePattern) + { + switch (thePattern) + { + case 0x0000: return Aspect_TOL_EMPTY; + case 0xFFC0: return Aspect_TOL_DASH; + case 0xCCCC: return Aspect_TOL_DOT; + case 0xFF18: return Aspect_TOL_DOTDASH; + case 0xFFFF: return Aspect_TOL_SOLID; + case 0xFF24: return Aspect_TOL_USERDEFINED; + } + return Aspect_TOL_USERDEFINED; + } + //! @name parameters specific to Point (Marker) primitive rendering public: @@ -388,7 +445,7 @@ Aspect_TypeOfLine EdgeLineType() const { return myLineType; } //! Modifies the edge line type (same as SetLineType()) - void SetEdgeLineType (Aspect_TypeOfLine theType) { myLineType = theType; } + void SetEdgeLineType (Aspect_TypeOfLine theType) { SetLineType (theType); } //! Return width for edges in pixels (same as LineWidth()). Standard_ShortReal EdgeWidth() const { return myLineWidth; } @@ -459,6 +516,8 @@ && myLineType == theOther.myLineType && myEdgeColor == theOther.myEdgeColor && myLineWidth == theOther.myLineWidth + && myLineFactor == theOther.myLineFactor + && myLinePattern == theOther.myLinePattern && myMarkerType == theOther.myMarkerType && myMarkerScale == theOther.myMarkerScale && myHatchStyle == theOther.myHatchStyle @@ -478,7 +537,8 @@ } //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: @@ -502,6 +562,8 @@ Aspect_TypeOfLine myLineType; Standard_ShortReal myLineWidth; + uint16_t myLineFactor; + uint16_t myLinePattern; Aspect_TypeOfMarker myMarkerType; Standard_ShortReal myMarkerScale; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_AspectText3d.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_AspectText3d.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_AspectText3d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_AspectText3d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,3 +55,13 @@ myTextFont = new TCollection_HAsciiString (theFont); } } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_AspectText3d::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS(theOStream, theDepth, Graphic3d_Aspects) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_AspectText3d.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_AspectText3d.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_AspectText3d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_AspectText3d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -110,6 +110,9 @@ //! Returns text FontAspect Font_FontAspect GetTextFontAspect() const { return myTextFontAspect; } + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; }; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BoundBuffer.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BoundBuffer.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BoundBuffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BoundBuffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -61,6 +61,19 @@ return true; } + //! Dumps the content of me into the stream + virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE + { + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, NCollection_Buffer) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, Colors) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, Bounds) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, NbBounds) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, NbMaxBounds) + } + public: Graphic3d_Vec4* Colors; //!< pointer to facet color values diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BSDF.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BSDF.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BSDF.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BSDF.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,6 +15,8 @@ #include +#include + #include // ======================================================================= @@ -58,11 +60,24 @@ return Graphic3d_Fresnel (Graphic3d_FM_SCHLICK, aFresnel); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_Fresnel::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, Graphic3d_Fresnel) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFresnelType) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myFresnelData) +} + // ======================================================================= // function : Graphic3d_BSDF // purpose : // ======================================================================= Graphic3d_BSDF::Graphic3d_BSDF() +: Ks (Graphic3d_Vec3 (0.f), 1.f) { FresnelCoat = Graphic3d_Fresnel::CreateConstant (0.f); FresnelBase = Graphic3d_Fresnel::CreateConstant (1.f); @@ -189,4 +204,56 @@ theAbsorptionCoeff); return aBSDF; -} \ No newline at end of file +} + +// ======================================================================= +// function : CreateMetallicRoughness +// purpose : +// ======================================================================= +Graphic3d_BSDF Graphic3d_BSDF::CreateMetallicRoughness (const Graphic3d_PBRMaterial& thePbr) +{ + const Graphic3d_Vec3 aDiff = (Graphic3d_Vec3 )thePbr.Color().GetRGB() * thePbr.Alpha(); + const Standard_ShortReal aRougness2 = thePbr.NormalizedRoughness() * thePbr.NormalizedRoughness(); + + Graphic3d_BSDF aBsdf; + aBsdf.Le = thePbr.Emission(); + if (thePbr.IOR() > 1.0f + && thePbr.Alpha() < 1.0f + && thePbr.Metallic() <= ShortRealEpsilon()) + { + aBsdf.FresnelCoat = Graphic3d_Fresnel::CreateDielectric (thePbr.IOR()); + aBsdf.Kt = Graphic3d_Vec3(1.0f); + aBsdf.Kc.r() = aBsdf.Kt.r(); + aBsdf.Kc.g() = aBsdf.Kt.g(); + aBsdf.Kc.b() = aBsdf.Kt.b(); + aBsdf.Absorption.SetValues (thePbr.Color().GetRGB(), thePbr.Alpha() * 0.25f); + } + else + { + aBsdf.FresnelBase = Graphic3d_Fresnel::CreateSchlick (aDiff * thePbr.Metallic()); + aBsdf.Ks.SetValues (Graphic3d_Vec3 (thePbr.Alpha()), aRougness2); + aBsdf.Kt = Graphic3d_Vec3 (1.0f - thePbr.Alpha()); + aBsdf.Kd = aDiff * (1.0f - thePbr.Metallic()); + } + + return aBsdf; +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_BSDF::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, Graphic3d_BSDF) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &Kc) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &Kd) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &Ks) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &Kt) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &Le) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &Absorption) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &FresnelCoat) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &FresnelBase) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BSDF.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BSDF.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BSDF.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BSDF.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,8 @@ #include #include +class Graphic3d_PBRMaterial; + //! Type of the Fresnel model. enum Graphic3d_FresnelModel { @@ -87,6 +89,9 @@ return myFresnelType; } + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: //! Creates new Fresnel reflectance factor. @@ -169,6 +174,9 @@ const Standard_ShortReal theAbsorptionCoeff, const Standard_ShortReal theRefractionIndex); + //! Creates BSDF from PBR metallic-roughness material. + static Standard_EXPORT Graphic3d_BSDF CreateMetallicRoughness (const Graphic3d_PBRMaterial& thePbr); + public: //! Creates uninitialized BSDF. @@ -180,6 +188,9 @@ //! Performs comparison of two BSDFs. Standard_EXPORT bool operator== (const Graphic3d_BSDF& theOther) const; + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + }; #endif // _Graphic3d_BSDF_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Buffer.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Buffer.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Buffer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Buffer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,3 +19,17 @@ IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_IndexBuffer, Graphic3d_Buffer) IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_BoundBuffer, NCollection_Buffer) IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_MutableIndexBuffer, Graphic3d_IndexBuffer) + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_Buffer::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, NCollection_Buffer) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Stride) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, NbElements) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, NbAttributes) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Buffer.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Buffer.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Buffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Buffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -315,6 +315,9 @@ //! Invalidate entire buffer. virtual void Invalidate() {} + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + public: Standard_Integer Stride; //!< the distance to the attributes of the next vertex within interleaved array diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BufferType.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BufferType.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BufferType.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BufferType.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,12 +15,13 @@ #define _Graphic3d_BufferType_H__ //! Define buffers available for dump -typedef enum +enum Graphic3d_BufferType { Graphic3d_BT_RGB, //!< color buffer without alpha component Graphic3d_BT_RGBA, //!< color buffer - Graphic3d_BT_Depth, //!< depth buffer - Graphic3d_BT_RGB_RayTraceHdrLeft //!< left view HDR color buffer for Ray-Tracing -} Graphic3d_BufferType; + Graphic3d_BT_Depth, //!< depth buffer + Graphic3d_BT_RGB_RayTraceHdrLeft, //!< left view HDR color buffer for Ray-Tracing + Graphic3d_BT_Red, //!< color buffer, red channel +}; #endif // _Graphic3d_BufferType_H__ diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BvhCStructureSet.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BvhCStructureSet.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BvhCStructureSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BvhCStructureSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,35 +33,35 @@ public: //! Creates an empty primitive set for BVH clipping. - Graphic3d_BvhCStructureSet(); + Standard_EXPORT Graphic3d_BvhCStructureSet(); //! Returns total number of structures. - virtual Standard_Integer Size() const Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer Size() const Standard_OVERRIDE; //! Returns AABB of the structure. - virtual Graphic3d_BndBox3d Box (const Standard_Integer theIdx) const Standard_OVERRIDE; + Standard_EXPORT virtual Graphic3d_BndBox3d Box (const Standard_Integer theIdx) const Standard_OVERRIDE; //! Calculates center of the AABB along given axis. - virtual Standard_Real Center (const Standard_Integer theIdx, - const Standard_Integer theAxis) const Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Real Center (const Standard_Integer theIdx, + const Standard_Integer theAxis) const Standard_OVERRIDE; //! Swaps structures with the given indices. - virtual void Swap (const Standard_Integer theIdx1, - const Standard_Integer theIdx2) Standard_OVERRIDE; + Standard_EXPORT virtual void Swap (const Standard_Integer theIdx1, + const Standard_Integer theIdx2) Standard_OVERRIDE; //! Adds structure to the set. //! @return true if structure added, otherwise returns false (structure already in the set). - Standard_Boolean Add (const Graphic3d_CStructure* theStruct); + Standard_EXPORT Standard_Boolean Add (const Graphic3d_CStructure* theStruct); //! Removes the given structure from the set. //! @return true if structure removed, otherwise returns false (structure is not in the set). - Standard_Boolean Remove (const Graphic3d_CStructure* theStruct); + Standard_EXPORT Standard_Boolean Remove (const Graphic3d_CStructure* theStruct); //! Cleans the whole primitive set. - void Clear(); + Standard_EXPORT void Clear(); //! Returns the structure corresponding to the given ID. - const Graphic3d_CStructure* GetStructureById (Standard_Integer theId); + Standard_EXPORT const Graphic3d_CStructure* GetStructureById (Standard_Integer theId); //! Access directly a collection of structures. const NCollection_IndexedMap& Structures() const { return myStructs; } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BvhCStructureSetTrsfPers.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BvhCStructureSetTrsfPers.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_BvhCStructureSetTrsfPers.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_BvhCStructureSetTrsfPers.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,35 +41,35 @@ public: //! Creates an empty primitive set for BVH clipping. - Graphic3d_BvhCStructureSetTrsfPers (const Handle(Select3D_BVHBuilder3d)& theBuilder); + Standard_EXPORT Graphic3d_BvhCStructureSetTrsfPers (const Handle(Select3D_BVHBuilder3d)& theBuilder); //! Returns total number of structures. - virtual Standard_Integer Size() const Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer Size() const Standard_OVERRIDE; //! Returns AABB of the structure. - virtual Graphic3d_BndBox3d Box (const Standard_Integer theIdx) const Standard_OVERRIDE; + Standard_EXPORT virtual Graphic3d_BndBox3d Box (const Standard_Integer theIdx) const Standard_OVERRIDE; //! Calculates center of the AABB along given axis. - virtual Standard_Real Center (const Standard_Integer theIdx, - const Standard_Integer theAxis) const Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Real Center (const Standard_Integer theIdx, + const Standard_Integer theAxis) const Standard_OVERRIDE; //! Swaps structures with the given indices. - virtual void Swap (const Standard_Integer theIdx1, - const Standard_Integer theIdx2) Standard_OVERRIDE; + Standard_EXPORT virtual void Swap (const Standard_Integer theIdx1, + const Standard_Integer theIdx2) Standard_OVERRIDE; //! Adds structure to the set. //! @return true if structure added, otherwise returns false (structure already in the set). - Standard_Boolean Add (const Graphic3d_CStructure* theStruct); + Standard_EXPORT Standard_Boolean Add (const Graphic3d_CStructure* theStruct); //! Removes the given structure from the set. //! @return true if structure removed, otherwise returns false (structure is not in the set). - Standard_Boolean Remove (const Graphic3d_CStructure* theStruct); + Standard_EXPORT Standard_Boolean Remove (const Graphic3d_CStructure* theStruct); //! Cleans the whole primitive set. - void Clear(); + Standard_EXPORT void Clear(); //! Returns the structure corresponding to the given ID. - const Graphic3d_CStructure* GetStructureById (Standard_Integer theId); + Standard_EXPORT const Graphic3d_CStructure* GetStructureById (Standard_Integer theId); //! Access directly a collection of structures. const NCollection_IndexedMap& Structures() const { return myStructs; } @@ -81,12 +81,12 @@ } //! Returns BVH tree for the given world view projection (builds it if necessary). - const opencascade::handle >& BVH (const Handle(Graphic3d_Camera)& theCamera, - const Graphic3d_Mat4d& theProjectionMatrix, - const Graphic3d_Mat4d& theWorldViewMatrix, - const Standard_Integer theViewportWidth, - const Standard_Integer theViewportHeight, - const Graphic3d_WorldViewProjState& theWVPState); + Standard_EXPORT const opencascade::handle >& BVH (const Handle(Graphic3d_Camera)& theCamera, + const Graphic3d_Mat4d& theProjectionMatrix, + const Graphic3d_Mat4d& theWorldViewMatrix, + const Standard_Integer theViewportWidth, + const Standard_Integer theViewportHeight, + const Graphic3d_WorldViewProjState& theWVPState); //! Returns builder for bottom-level BVH. const Handle(Select3D_BVHBuilder3d)& Builder() const { return myBuilder; } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Camera.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Camera.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Camera.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Camera.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -81,6 +81,8 @@ myAxialScale (1.0, 1.0, 1.0), myProjType (Projection_Orthographic), myFOVy (45.0), + myFOVx (45.0), + myFOV2d (180.0), myFOVyTan (Tan (DTR_HALF * 45.0)), myZNear (DEFAULT_ZNEAR), myZFar (DEFAULT_ZFAR), @@ -89,7 +91,10 @@ myZFocus (1.0), myZFocusType (FocusType_Relative), myIOD (0.05), - myIODType (IODType_Relative) + myIODType (IODType_Relative), + myIsCustomProjMatM (false), + myIsCustomProjMatLR(false), + myIsCustomFrustomLR(false) { myWorldViewProjState.Initialize ((Standard_Size)Standard_Atomic_Increment (&THE_STATE_COUNTER), (Standard_Size)Standard_Atomic_Increment (&THE_STATE_COUNTER), @@ -108,6 +113,8 @@ myAxialScale (1.0, 1.0, 1.0), myProjType (Projection_Orthographic), myFOVy (45.0), + myFOVx (45.0), + myFOV2d (180.0), myFOVyTan (Tan (DTR_HALF * 45.0)), myZNear (DEFAULT_ZNEAR), myZFar (DEFAULT_ZFAR), @@ -116,7 +123,10 @@ myZFocus (1.0), myZFocusType (FocusType_Relative), myIOD (0.05), - myIODType (IODType_Relative) + myIODType (IODType_Relative), + myIsCustomProjMatM (false), + myIsCustomProjMatLR(false), + myIsCustomFrustomLR(false) { myWorldViewProjState.Initialize (this); @@ -129,14 +139,32 @@ // ======================================================================= void Graphic3d_Camera::CopyMappingData (const Handle(Graphic3d_Camera)& theOtherCamera) { + SetProjectionType (theOtherCamera->ProjectionType()); SetFOVy (theOtherCamera->FOVy()); + SetFOV2d (theOtherCamera->FOV2d()); SetZRange (theOtherCamera->ZNear(), theOtherCamera->ZFar()); SetAspect (theOtherCamera->Aspect()); SetScale (theOtherCamera->Scale()); SetZFocus (theOtherCamera->ZFocusType(), theOtherCamera->ZFocus()); SetIOD (theOtherCamera->GetIODType(), theOtherCamera->IOD()); - SetProjectionType (theOtherCamera->ProjectionType()); SetTile (theOtherCamera->myTile); + + ResetCustomProjection(); + if (theOtherCamera->IsCustomStereoProjection()) + { + SetCustomStereoProjection (theOtherCamera->myCustomProjMatL, + theOtherCamera->myCustomHeadToEyeMatL, + theOtherCamera->myCustomProjMatR, + theOtherCamera->myCustomHeadToEyeMatR); + } + else if (theOtherCamera->IsCustomStereoFrustum()) + { + SetCustomStereoFrustums (theOtherCamera->myCustomFrustumL, theOtherCamera->myCustomFrustumR); + } + if (theOtherCamera->IsCustomMonoProjection()) + { + SetCustomMonoProjection (theOtherCamera->myCustomProjMatM); + } } // ======================================================================= @@ -419,12 +447,28 @@ } myFOVy = theFOVy; + myFOVx = theFOVy * myAspect; myFOVyTan = Tan(DTR_HALF * myFOVy); InvalidateProjection(); } // ======================================================================= +// function : SetFOV2d +// purpose : +// ======================================================================= +void Graphic3d_Camera::SetFOV2d (const Standard_Real theFOV) +{ + if (FOV2d() == theFOV) + { + return; + } + + myFOV2d = theFOV; + InvalidateProjection(); +} + +// ======================================================================= // function : SetZRange // purpose : // ======================================================================= @@ -462,6 +506,7 @@ } myAspect = theAspect; + myFOVx = myFOVy * theAspect; InvalidateProjection(); } @@ -872,19 +917,137 @@ } // ======================================================================= -// function : UpdateProjection +// function : ResetCustomProjection // purpose : // ======================================================================= -template -Graphic3d_Camera::TransformMatrices& - Graphic3d_Camera::UpdateProjection (TransformMatrices& theMatrices) const +void Graphic3d_Camera::ResetCustomProjection() { - if (theMatrices.IsProjectionValid()) + if (myIsCustomFrustomLR + || myIsCustomProjMatLR + || myIsCustomProjMatM) { - return theMatrices; // for inline accessors + myIsCustomFrustomLR = false; + myIsCustomProjMatLR = false; + myIsCustomProjMatM = false; + InvalidateProjection(); + } +} + +// ======================================================================= +// function : StereoProjection +// purpose : +// ======================================================================= +void Graphic3d_Camera::StereoProjection (Graphic3d_Mat4d& theProjL, + Graphic3d_Mat4d& theHeadToEyeL, + Graphic3d_Mat4d& theProjR, + Graphic3d_Mat4d& theHeadToEyeR) const +{ + stereoProjection (theProjL, theHeadToEyeL, theProjR, theHeadToEyeR); +} + +// ======================================================================= +// function : StereoProjectionF +// purpose : +// ======================================================================= +void Graphic3d_Camera::StereoProjectionF (Graphic3d_Mat4& theProjL, + Graphic3d_Mat4& theHeadToEyeL, + Graphic3d_Mat4& theProjR, + Graphic3d_Mat4& theHeadToEyeR) const +{ + stereoProjection (theProjL, theHeadToEyeL, theProjR, theHeadToEyeR); +} + +// ======================================================================= +// function : stereoProjection +// purpose : +// ======================================================================= +template +void Graphic3d_Camera::stereoProjection (NCollection_Mat4& theProjL, + NCollection_Mat4& theHeadToEyeL, + NCollection_Mat4& theProjR, + NCollection_Mat4& theHeadToEyeR) const +{ + if (myIsCustomProjMatLR) + { + theProjL .ConvertFrom (myCustomProjMatL); + theHeadToEyeL.ConvertFrom (myCustomHeadToEyeMatL); + theProjR .ConvertFrom (myCustomProjMatR); + theHeadToEyeR.ConvertFrom (myCustomHeadToEyeMatR); + return; } - theMatrices.InitProjection(); + NCollection_Mat4 aDummy; + computeProjection (aDummy, theProjL, theProjR, false); + + const Standard_Real aIOD = myIODType == IODType_Relative + ? myIOD * Distance() + : myIOD; + if (aIOD != 0.0) + { + // X translation to cancel parallax + theHeadToEyeL.InitIdentity(); + theHeadToEyeL.SetColumn (3, NCollection_Vec3 (Elem_t ( 0.5 * aIOD), Elem_t (0.0), Elem_t (0.0))); + theHeadToEyeR.InitIdentity(); + theHeadToEyeR.SetColumn (3, NCollection_Vec3 (Elem_t (-0.5 * aIOD), Elem_t (0.0), Elem_t (0.0))); + } +} + +// ======================================================================= +// function : SetCustomStereoFrustums +// purpose : +// ======================================================================= +void Graphic3d_Camera::SetCustomStereoFrustums (const Aspect_FrustumLRBT& theFrustumL, + const Aspect_FrustumLRBT& theFrustumR) +{ + myCustomFrustumL = theFrustumL; + myCustomFrustumR = theFrustumR; + myIsCustomFrustomLR = true; + myIsCustomProjMatLR = false; + InvalidateProjection(); +} + +// ======================================================================= +// function : SetCustomStereoProjection +// purpose : +// ======================================================================= +void Graphic3d_Camera::SetCustomStereoProjection (const Graphic3d_Mat4d& theProjL, + const Graphic3d_Mat4d& theHeadToEyeL, + const Graphic3d_Mat4d& theProjR, + const Graphic3d_Mat4d& theHeadToEyeR) +{ + myCustomProjMatL = theProjL; + myCustomProjMatR = theProjR; + myCustomHeadToEyeMatL = theHeadToEyeL; + myCustomHeadToEyeMatR = theHeadToEyeR; + myIsCustomProjMatLR = true; + myIsCustomFrustomLR = false; + InvalidateProjection(); +} + +// ======================================================================= +// function : SetCustomMonoProjection +// purpose : +// ======================================================================= +void Graphic3d_Camera::SetCustomMonoProjection (const Graphic3d_Mat4d& theProj) +{ + myCustomProjMatM = theProj; + myIsCustomProjMatM = true; + InvalidateProjection(); +} + +// ======================================================================= +// function : computeProjection +// purpose : +// ======================================================================= +template +void Graphic3d_Camera::computeProjection (NCollection_Mat4& theProjM, + NCollection_Mat4& theProjL, + NCollection_Mat4& theProjR, + bool theToAddHeadToEye) const +{ + theProjM.InitIdentity(); + theProjL.InitIdentity(); + theProjR.InitIdentity(); // sets top of frustum based on FOVy and near clipping plane Elem_t aScale = static_cast (myScale); @@ -894,13 +1057,11 @@ Elem_t aDXHalf = 0.0, aDYHalf = 0.0; if (IsOrthographic()) { - aDXHalf = aScale * Elem_t (0.5); - aDYHalf = aScale * Elem_t (0.5); + aDXHalf = aDYHalf = aScale * Elem_t (0.5); } else { - aDXHalf = aZNear * Elem_t (myFOVyTan); - aDYHalf = aZNear * Elem_t (myFOVyTan); + aDXHalf = aDYHalf = aZNear * Elem_t (myFOVyTan); } if (anAspect > 1.0) @@ -913,10 +1074,11 @@ } // sets right of frustum based on aspect ratio - Elem_t aLeft = -aDXHalf; - Elem_t aRight = aDXHalf; - Elem_t aBot = -aDYHalf; - Elem_t aTop = aDYHalf; + Aspect_FrustumLRBT anLRBT; + anLRBT.Left = -aDXHalf; + anLRBT.Right = aDXHalf; + anLRBT.Bottom = -aDYHalf; + anLRBT.Top = aDYHalf; Elem_t aIOD = myIODType == IODType_Relative ? static_cast (myIOD * Distance()) @@ -931,58 +1093,92 @@ const Elem_t aDXFull = Elem_t(2) * aDXHalf; const Elem_t aDYFull = Elem_t(2) * aDYHalf; const Graphic3d_Vec2i anOffset = myTile.OffsetLowerLeft(); - aLeft = -aDXHalf + aDXFull * static_cast (anOffset.x()) / static_cast (myTile.TotalSize.x()); - aRight = -aDXHalf + aDXFull * static_cast (anOffset.x() + myTile.TileSize.x()) / static_cast (myTile.TotalSize.x()); - aBot = -aDYHalf + aDYFull * static_cast (anOffset.y()) / static_cast (myTile.TotalSize.y()); - aTop = -aDYHalf + aDYFull * static_cast (anOffset.y() + myTile.TileSize.y()) / static_cast (myTile.TotalSize.y()); + anLRBT.Left = -aDXHalf + aDXFull * static_cast (anOffset.x()) / static_cast (myTile.TotalSize.x()); + anLRBT.Right = -aDXHalf + aDXFull * static_cast (anOffset.x() + myTile.TileSize.x()) / static_cast (myTile.TotalSize.x()); + anLRBT.Bottom = -aDYHalf + aDYFull * static_cast (anOffset.y()) / static_cast (myTile.TotalSize.y()); + anLRBT.Top = -aDYHalf + aDYFull * static_cast (anOffset.y() + myTile.TileSize.y()) / static_cast (myTile.TotalSize.y()); } + if (myIsCustomProjMatM) + { + theProjM.ConvertFrom (myCustomProjMatM); + } switch (myProjType) { - case Projection_Orthographic : - OrthoProj (aLeft, aRight, aBot, aTop, aZNear, aZFar, theMatrices.MProjection); - break; - - case Projection_Perspective : - PerspectiveProj (aLeft, aRight, aBot, aTop, aZNear, aZFar, theMatrices.MProjection); - break; - - case Projection_MonoLeftEye : + case Projection_Orthographic: { - StereoEyeProj (aLeft, aRight, aBot, aTop, - aZNear, aZFar, aIOD, aFocus, - Standard_True, theMatrices.MProjection); - theMatrices.LProjection = theMatrices.MProjection; + if (!myIsCustomProjMatM) + { + orthoProj (theProjM, anLRBT, aZNear, aZFar); + } break; } - - case Projection_MonoRightEye : + case Projection_Perspective: { - StereoEyeProj (aLeft, aRight, aBot, aTop, - aZNear, aZFar, aIOD, aFocus, - Standard_False, theMatrices.MProjection); - theMatrices.RProjection = theMatrices.MProjection; + if (!myIsCustomProjMatM) + { + perspectiveProj (theProjM, anLRBT, aZNear, aZFar); + } break; } - - case Projection_Stereo : + case Projection_MonoLeftEye: + case Projection_MonoRightEye: + case Projection_Stereo: { - PerspectiveProj (aLeft, aRight, aBot, aTop, aZNear, aZFar, theMatrices.MProjection); + if (!myIsCustomProjMatM) + { + perspectiveProj (theProjM, anLRBT, aZNear, aZFar); + } + if (myIsCustomProjMatLR) + { + if (theToAddHeadToEye) + { + theProjL.ConvertFrom (myCustomProjMatL * myCustomHeadToEyeMatL); + theProjR.ConvertFrom (myCustomProjMatR * myCustomHeadToEyeMatR); + } + else + { + theProjL.ConvertFrom (myCustomProjMatL); + theProjR.ConvertFrom (myCustomProjMatR); + } + } + else if (myIsCustomFrustomLR) + { + anLRBT = Aspect_FrustumLRBT (myCustomFrustumL).Multiplied (aZNear); + perspectiveProj (theProjL, anLRBT, aZNear, aZFar); + + anLRBT = Aspect_FrustumLRBT (myCustomFrustumR).Multiplied (aZNear); + perspectiveProj (theProjR, anLRBT, aZNear, aZFar); + } + else + { + stereoEyeProj (theProjL, + anLRBT, aZNear, aZFar, aIOD, aFocus, + Aspect_Eye_Left); + stereoEyeProj (theProjR, + anLRBT, aZNear, aZFar, aIOD, aFocus, + Aspect_Eye_Right); + } - StereoEyeProj (aLeft, aRight, aBot, aTop, - aZNear, aZFar, aIOD, aFocus, - Standard_True, - theMatrices.LProjection); - - StereoEyeProj (aLeft, aRight, aBot, aTop, - aZNear, aZFar, aIOD, aFocus, - Standard_False, - theMatrices.RProjection); + if (theToAddHeadToEye + && !myIsCustomProjMatLR + && aIOD != Elem_t (0.0)) + { + // X translation to cancel parallax + theProjL.Translate (NCollection_Vec3 (Elem_t ( 0.5) * aIOD, Elem_t (0.0), Elem_t (0.0))); + theProjR.Translate (NCollection_Vec3 (Elem_t (-0.5) * aIOD, Elem_t (0.0), Elem_t (0.0))); + } break; } } - - return theMatrices; // for inline accessors + if (myProjType == Projection_MonoLeftEye) + { + theProjM = theProjL; + } + else if (myProjType == Projection_MonoRightEye) + { + theProjM = theProjR; + } } // ======================================================================= @@ -1044,29 +1240,26 @@ } // ======================================================================= -// function : OrthoProj +// function : orthoProj // purpose : // ======================================================================= template -void Graphic3d_Camera::OrthoProj (const Elem_t theLeft, - const Elem_t theRight, - const Elem_t theBottom, - const Elem_t theTop, +void Graphic3d_Camera::orthoProj (NCollection_Mat4& theOutMx, + const Aspect_FrustumLRBT& theLRBT, const Elem_t theNear, - const Elem_t theFar, - NCollection_Mat4& theOutMx) + const Elem_t theFar) { // row 0 - theOutMx.ChangeValue (0, 0) = Elem_t (2.0) / (theRight - theLeft); + theOutMx.ChangeValue (0, 0) = Elem_t (2.0) / (theLRBT.Right - theLRBT.Left); theOutMx.ChangeValue (0, 1) = Elem_t (0.0); theOutMx.ChangeValue (0, 2) = Elem_t (0.0); - theOutMx.ChangeValue (0, 3) = - (theRight + theLeft) / (theRight - theLeft); + theOutMx.ChangeValue (0, 3) = - (theLRBT.Right + theLRBT.Left) / (theLRBT.Right - theLRBT.Left); // row 1 theOutMx.ChangeValue (1, 0) = Elem_t (0.0); - theOutMx.ChangeValue (1, 1) = Elem_t (2.0) / (theTop - theBottom); + theOutMx.ChangeValue (1, 1) = Elem_t (2.0) / (theLRBT.Top - theLRBT.Bottom); theOutMx.ChangeValue (1, 2) = Elem_t (0.0); - theOutMx.ChangeValue (1, 3) = - (theTop + theBottom) / (theTop - theBottom); + theOutMx.ChangeValue (1, 3) = - (theLRBT.Top + theLRBT.Bottom) / (theLRBT.Top - theLRBT.Bottom); // row 2 theOutMx.ChangeValue (2, 0) = Elem_t (0.0); @@ -1086,29 +1279,26 @@ // purpose : // ======================================================================= template -void Graphic3d_Camera::PerspectiveProj (const Elem_t theLeft, - const Elem_t theRight, - const Elem_t theBottom, - const Elem_t theTop, +void Graphic3d_Camera::perspectiveProj (NCollection_Mat4& theOutMx, + const Aspect_FrustumLRBT& theLRBT, const Elem_t theNear, - const Elem_t theFar, - NCollection_Mat4& theOutMx) + const Elem_t theFar) { // column 0 - theOutMx.ChangeValue (0, 0) = (Elem_t (2.0) * theNear) / (theRight - theLeft); + theOutMx.ChangeValue (0, 0) = (Elem_t (2.0) * theNear) / (theLRBT.Right - theLRBT.Left); theOutMx.ChangeValue (1, 0) = Elem_t (0.0); theOutMx.ChangeValue (2, 0) = Elem_t (0.0); theOutMx.ChangeValue (3, 0) = Elem_t (0.0); // column 1 theOutMx.ChangeValue (0, 1) = Elem_t (0.0); - theOutMx.ChangeValue (1, 1) = (Elem_t (2.0) * theNear) / (theTop - theBottom); + theOutMx.ChangeValue (1, 1) = (Elem_t (2.0) * theNear) / (theLRBT.Top - theLRBT.Bottom); theOutMx.ChangeValue (2, 1) = Elem_t (0.0); theOutMx.ChangeValue (3, 1) = Elem_t (0.0); // column 2 - theOutMx.ChangeValue (0, 2) = (theRight + theLeft) / (theRight - theLeft); - theOutMx.ChangeValue (1, 2) = (theTop + theBottom) / (theTop - theBottom); + theOutMx.ChangeValue (0, 2) = (theLRBT.Right + theLRBT.Left) / (theLRBT.Right - theLRBT.Left); + theOutMx.ChangeValue (1, 2) = (theLRBT.Top + theLRBT.Bottom) / (theLRBT.Top - theLRBT.Bottom); theOutMx.ChangeValue (2, 2) = -(theFar + theNear) / (theFar - theNear); theOutMx.ChangeValue (3, 2) = Elem_t (-1.0); @@ -1124,31 +1314,22 @@ // purpose : // ======================================================================= template -void Graphic3d_Camera::StereoEyeProj (const Elem_t theLeft, - const Elem_t theRight, - const Elem_t theBottom, - const Elem_t theTop, +void Graphic3d_Camera::stereoEyeProj (NCollection_Mat4& theOutMx, + const Aspect_FrustumLRBT& theLRBT, const Elem_t theNear, const Elem_t theFar, const Elem_t theIOD, const Elem_t theZFocus, - const Standard_Boolean theIsLeft, - NCollection_Mat4& theOutMx) + const Aspect_Eye theEyeIndex) { - Elem_t aDx = theIsLeft ? Elem_t (0.5) * theIOD : Elem_t (-0.5) * theIOD; + Elem_t aDx = theEyeIndex == Aspect_Eye_Left ? Elem_t (0.5) * theIOD : Elem_t (-0.5) * theIOD; Elem_t aDXStereoShift = aDx * theNear / theZFocus; // construct eye projection matrix - PerspectiveProj (theLeft + aDXStereoShift, - theRight + aDXStereoShift, - theBottom, theTop, theNear, theFar, - theOutMx); - - if (theIOD != Elem_t (0.0)) - { - // X translation to cancel parallax - theOutMx.Translate (NCollection_Vec3 (aDx, Elem_t (0.0), Elem_t (0.0))); - } + Aspect_FrustumLRBT aLRBT = theLRBT; + aLRBT.Left = theLRBT.Left + aDXStereoShift; + aLRBT.Right = theLRBT.Right + aDXStereoShift; + perspectiveProj (theOutMx, aLRBT, theNear, theFar); } // ======================================================================= @@ -1475,7 +1656,8 @@ //function : FrustumPoints //purpose : //======================================================================= -void Graphic3d_Camera::FrustumPoints (NCollection_Array1& thePoints) const +void Graphic3d_Camera::FrustumPoints (NCollection_Array1& thePoints, + const Graphic3d_Mat4d& theModelWorld) const { if (thePoints.Length() != FrustumVerticesNB) { @@ -1483,7 +1665,7 @@ } const Graphic3d_Mat4d& aProjectionMat = ProjectionMatrix(); - const Graphic3d_Mat4d& aWorldViewMat = OrientationMatrix(); + const Graphic3d_Mat4d aWorldViewMat = OrientationMatrix() * theModelWorld; Standard_Real nLeft = 0.0, nRight = 0.0, nTop = 0.0, nBottom = 0.0; Standard_Real fLeft = 0.0, fRight = 0.0, fTop = 0.0, fBottom = 0.0; @@ -1546,3 +1728,37 @@ aTmpPnt = anInvWorldView * aLeftBottomFar; thePoints.SetValue (FrustumVert_LeftBottomFar, aTmpPnt.xyz() / aTmpPnt.w()); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_Camera::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myUp) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myDirection) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myEye) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDistance) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myAxialScale) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myProjType) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFOVy) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myZNear) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myZFar) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAspect) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myScale) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myZFocus) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myZFocusType) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIOD) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIODType) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myTile) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myMatricesD) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myMatricesF) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myWorldViewProjState) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Camera.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Camera.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Camera.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Camera.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,8 @@ #ifndef _Graphic3d_Camera_HeaderFile #define _Graphic3d_Camera_HeaderFile +#include +#include #include #include #include @@ -76,6 +78,23 @@ //! Return true if Projection was not invalidated. Standard_Boolean IsProjectionValid() const { return myIsProjectionValid; } + + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const + { + if (IsOrientationValid()) + { + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &Orientation) + } + if (IsProjectionValid()) + { + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &MProjection) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &LProjection) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &RProjection) + } + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsOrientationValid) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsProjectionValid) + } public: @@ -185,6 +204,12 @@ //! Return a copy of orthogonalized up direction vector. Standard_EXPORT gp_Dir OrthogonalizedUp() const; + //! Right side direction. + gp_Dir SideRight() const + { + return -(gp_Vec (Direction()) ^ gp_Vec (OrthogonalizedUp())); + } + //! Get camera Eye position. //! @return camera eye location. const gp_Pnt& Eye() const { return myEye; } @@ -284,15 +309,26 @@ } //! Set Field Of View (FOV) in y axis for perspective projection. + //! Field of View in x axis is automatically scaled from view aspect ratio. //! @param theFOVy [in] the FOV in degrees. Standard_EXPORT void SetFOVy (const Standard_Real theFOVy); //! Get Field Of View (FOV) in y axis. //! @return the FOV value in degrees. - Standard_Real FOVy() const - { - return myFOVy; - } + Standard_Real FOVy() const { return myFOVy; } + + //! Get Field Of View (FOV) in x axis. + //! @return the FOV value in degrees. + Standard_Real FOVx() const { return myFOVx; } + + //! Get Field Of View (FOV) restriction for 2D on-screen elements; 180 degrees by default. + //! When 2D FOV is smaller than FOVy or FOVx, 2D elements defined within offset from view corner + //! will be extended to fit into specified 2D FOV. + //! This can be useful to make 2D elements sharply visible, like in case of HMD normally having extra large FOVy. + Standard_Real FOV2d() const { return myFOV2d; } + + //! Set Field Of View (FOV) restriction for 2D on-screen elements. + Standard_EXPORT void SetFOV2d (Standard_Real theFOV); //! Estimate Z-min and Z-max planes of projection volume to match the //! displayed objects. The methods ensures that view volume will @@ -427,6 +463,24 @@ //! @return values in form of gp_Pnt (Width, Height, Depth). Standard_EXPORT gp_XYZ ViewDimensions (const Standard_Real theZValue) const; + //! Return offset to the view corner in NDC space within dimension X for 2d on-screen elements, which is normally 0.5. + //! Can be clamped when FOVx exceeds FOV2d. + Standard_Real NDC2dOffsetX() const + { + return myFOV2d >= myFOVx + ? 0.5 + : 0.5 * myFOV2d / myFOVx; + } + + //! Return offset to the view corner in NDC space within dimension X for 2d on-screen elements, which is normally 0.5. + //! Can be clamped when FOVy exceeds FOV2d. + Standard_Real NDC2dOffsetY() const + { + return myFOV2d >= myFOVy + ? 0.5 + : 0.5 * myFOV2d / myFOVy; + } + //! Calculate WCS frustum planes for the camera projection volume. //! Frustum is a convex volume determined by six planes directing //! inwards. @@ -552,14 +606,98 @@ //! The matrix will be updated on request. Standard_EXPORT void InvalidateOrientation(); +public: + + //! Get stereo projection matrices. + //! @param theProjL [out] left eye projection matrix + //! @param theHeadToEyeL [out] left head to eye translation matrix + //! @param theProjR [out] right eye projection matrix + //! @param theHeadToEyeR [out] right head to eye translation matrix + Standard_EXPORT void StereoProjection (Graphic3d_Mat4d& theProjL, + Graphic3d_Mat4d& theHeadToEyeL, + Graphic3d_Mat4d& theProjR, + Graphic3d_Mat4d& theHeadToEyeR) const; + + //! Get stereo projection matrices. + //! @param theProjL [out] left eye projection matrix + //! @param theHeadToEyeL [out] left head to eye translation matrix + //! @param theProjR [out] right eye projection matrix + //! @param theHeadToEyeR [out] right head to eye translation matrix + Standard_EXPORT void StereoProjectionF (Graphic3d_Mat4& theProjL, + Graphic3d_Mat4& theHeadToEyeL, + Graphic3d_Mat4& theProjR, + Graphic3d_Mat4& theHeadToEyeR) const; + + //! Unset all custom frustums and projection matrices. + Standard_EXPORT void ResetCustomProjection(); + + //! Return TRUE if custom stereo frustums are set. + bool IsCustomStereoFrustum() const { return myIsCustomFrustomLR; } + + //! Set custom stereo frustums. + //! These can be retrieved from APIs like OpenVR. + Standard_EXPORT void SetCustomStereoFrustums (const Aspect_FrustumLRBT& theFrustumL, + const Aspect_FrustumLRBT& theFrustumR); + + //! Return TRUE if custom stereo projection matrices are set. + bool IsCustomStereoProjection() const { return myIsCustomProjMatLR; } + + //! Set custom stereo projection matrices. + //! @param theProjL [in] left eye projection matrix + //! @param theHeadToEyeL [in] left head to eye translation matrix + //! @param theProjR [in] right eye projection matrix + //! @param theHeadToEyeR [in] right head to eye translation matrix + Standard_EXPORT void SetCustomStereoProjection (const Graphic3d_Mat4d& theProjL, + const Graphic3d_Mat4d& theHeadToEyeL, + const Graphic3d_Mat4d& theProjR, + const Graphic3d_Mat4d& theHeadToEyeR); + + //! Return TRUE if custom projection matrix is set. + bool IsCustomMonoProjection() const { return myIsCustomProjMatM; } + + //! Set custom projection matrix. + Standard_EXPORT void SetCustomMonoProjection (const Graphic3d_Mat4d& theProj); + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + //! @name Managing projection and orientation cache private: + //! Get stereo projection matrices. + //! @param theProjL [out] left eye projection matrix + //! @param theHeadToEyeL [out] left head to eye translation matrix + //! @param theProjR [out] right eye projection matrix + //! @param theHeadToEyeR [out] right head to eye translation matrix + template + Standard_EXPORT void stereoProjection (NCollection_Mat4& theProjL, + NCollection_Mat4& theHeadToEyeL, + NCollection_Mat4& theProjR, + NCollection_Mat4& theHeadToEyeR) const; + + //! Compute projection matrices. + //! @param theProjM [out] mono projection matrix + //! @param theProjL [out] left eye projection matrix + //! @param theProjR [out] right eye projection matrix + //! @param theToAddHeadToEye [in] flag to pre-multiply head-to-eye translation + template + Standard_EXPORT void computeProjection (NCollection_Mat4& theProjM, + NCollection_Mat4& theProjL, + NCollection_Mat4& theProjR, + bool theToAddHeadToEye) const; + //! Compute projection matrices. //! @param theMatrices [in] the matrices data container. template - Standard_EXPORT - TransformMatrices& UpdateProjection (TransformMatrices& theMatrices) const; + TransformMatrices& UpdateProjection (TransformMatrices& theMatrices) const + { + if (!theMatrices.IsProjectionValid()) + { + theMatrices.InitProjection(); + computeProjection (theMatrices.MProjection, theMatrices.LProjection, theMatrices.RProjection, true); + } + return theMatrices; + } //! Compute orientation matrix. //! @param theMatrices [in] the matrices data container. @@ -569,68 +707,44 @@ private: - //! Compose orthographic projection matrix for - //! the passed camera volume mapping. - //! @param theLeft [in] the left mapping (clipping) coordinate. - //! @param theRight [in] the right mapping (clipping) coordinate. - //! @param theBottom [in] the bottom mapping (clipping) coordinate. - //! @param theTop [in] the top mapping (clipping) coordinate. - //! @param theNear [in] the near mapping (clipping) coordinate. - //! @param theFar [in] the far mapping (clipping) coordinate. - //! @param theOutMx [out] the projection matrix. + //! Compose orthographic projection matrix for the passed camera volume mapping. + //! @param theOutMx [out] the projection matrix + //! @param theLRBT [in] the left/right/bottom/top mapping (clipping) coordinates + //! @param theNear [in] the near mapping (clipping) coordinate + //! @param theFar [in] the far mapping (clipping) coordinate template - static void - OrthoProj (const Elem_t theLeft, - const Elem_t theRight, - const Elem_t theBottom, - const Elem_t theTop, - const Elem_t theNear, - const Elem_t theFar, - NCollection_Mat4& theOutMx); - - //! Compose perspective projection matrix for - //! the passed camera volume mapping. - //! @param theLeft [in] the left mapping (clipping) coordinate. - //! @param theRight [in] the right mapping (clipping) coordinate. - //! @param theBottom [in] the bottom mapping (clipping) coordinate. - //! @param theTop [in] the top mapping (clipping) coordinate. - //! @param theNear [in] the near mapping (clipping) coordinate. - //! @param theFar [in] the far mapping (clipping) coordinate. - //! @param theOutMx [out] the projection matrix. + static void orthoProj (NCollection_Mat4& theOutMx, + const Aspect_FrustumLRBT& theLRBT, + const Elem_t theNear, + const Elem_t theFar); + + //! Compose perspective projection matrix for the passed camera volume mapping. + //! @param theOutMx [out] the projection matrix + //! @param theLRBT [in] the left/right/bottom/top mapping (clipping) coordinates + //! @param theNear [in] the near mapping (clipping) coordinate + //! @param theFar [in] the far mapping (clipping) coordinate template - static void - PerspectiveProj (const Elem_t theLeft, - const Elem_t theRight, - const Elem_t theBottom, - const Elem_t theTop, - const Elem_t theNear, - const Elem_t theFar, - NCollection_Mat4& theOutMx); + static void perspectiveProj (NCollection_Mat4& theOutMx, + const Aspect_FrustumLRBT& theLRBT, + const Elem_t theNear, + const Elem_t theFar); //! Compose projection matrix for L/R stereo eyes. - //! @param theLeft [in] the left mapping (clipping) coordinate. - //! @param theRight [in] the right mapping (clipping) coordinate. - //! @param theBottom [in] the bottom mapping (clipping) coordinate. - //! @param theTop [in] the top mapping (clipping) coordinate. - //! @param theNear [in] the near mapping (clipping) coordinate. - //! @param theFar [in] the far mapping (clipping) coordinate. - //! @param theIOD [in] the Intraocular distance. - //! @param theZFocus [in] the z coordinate of off-axis - //! projection plane with zero parallax. - //! @param theIsLeft [in] boolean flag to choose between L/R eyes. - //! @param theOutMx [out] the projection matrix. + //! @param theOutMx [out] the projection matrix + //! @param theLRBT [in] the left/right/bottom/top mapping (clipping) coordinates + //! @param theNear [in] the near mapping (clipping) coordinate + //! @param theFar [in] the far mapping (clipping) coordinate + //! @param theIOD [in] the Intraocular distance + //! @param theZFocus [in] the z coordinate of off-axis projection plane with zero parallax + //! @param theEyeIndex [in] choose between L/R eyes template - static void - StereoEyeProj (const Elem_t theLeft, - const Elem_t theRight, - const Elem_t theBottom, - const Elem_t theTop, - const Elem_t theNear, - const Elem_t theFar, - const Elem_t theIOD, - const Elem_t theZFocus, - const Standard_Boolean theIsLeft, - NCollection_Mat4& theOutMx); + static void stereoEyeProj (NCollection_Mat4& theOutMx, + const Aspect_FrustumLRBT& theLRBT, + const Elem_t theNear, + const Elem_t theFar, + const Elem_t theIOD, + const Elem_t theZFocus, + const Aspect_Eye theEyeIndex); //! Construct "look at" orientation transformation. //! Reference point differs for perspective and ortho modes @@ -667,7 +781,8 @@ //! Fill array of current view frustum corners. //! The size of this array is equal to FrustumVerticesNB. //! The order of vertices is as defined in FrustumVert_* enumeration. - Standard_EXPORT void FrustumPoints (NCollection_Array1& thePoints) const; + Standard_EXPORT void FrustumPoints (NCollection_Array1& thePoints, + const Graphic3d_Mat4d& theModelWorld = Graphic3d_Mat4d()) const; private: @@ -680,6 +795,8 @@ Projection myProjType; //!< Projection type used for rendering. Standard_Real myFOVy; //!< Field Of View in y axis. + Standard_Real myFOVx; //!< Field Of View in x axis. + Standard_Real myFOV2d; //!< Field Of View limit for 2d on-screen elements Standard_Real myFOVyTan; //!< Field Of View as Tan(DTR_HALF * myFOVy) Standard_Real myZNear; //!< Distance to near clipping plane. Standard_Real myZFar; //!< Distance to far clipping plane. @@ -694,6 +811,17 @@ Graphic3d_CameraTile myTile;//!< Tile defining sub-area for drawing + Graphic3d_Mat4d myCustomProjMatM; + Graphic3d_Mat4d myCustomProjMatL; + Graphic3d_Mat4d myCustomProjMatR; + Graphic3d_Mat4d myCustomHeadToEyeMatL; + Graphic3d_Mat4d myCustomHeadToEyeMatR; + Aspect_FrustumLRBT myCustomFrustumL; //!< left custom frustum + Aspect_FrustumLRBT myCustomFrustumR; //!< right custom frustum + Standard_Boolean myIsCustomProjMatM; //!< flag indicating usage of custom projection matrix + Standard_Boolean myIsCustomProjMatLR; //!< flag indicating usage of custom stereo projection matrices + Standard_Boolean myIsCustomFrustomLR; //!< flag indicating usage of custom stereo frustums + mutable TransformMatrices myMatricesD; mutable TransformMatrices myMatricesF; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CameraTile.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CameraTile.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CameraTile.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CameraTile.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,30 @@ +// Created on: 2020-02-06 +// Created by: Svetlana SHUTINA +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_CameraTile::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &TotalSize) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &TileSize) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &Offset) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsTopDown) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CameraTile.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CameraTile.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CameraTile.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CameraTile.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ #include #include +#include #include //! Class defines the area (Tile) inside a view. @@ -82,6 +83,9 @@ && anOffset1.x() == anOffset2.x() && anOffset1.y() == anOffset2.y(); } + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; }; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CLight.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CLight.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CLight.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CLight.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -233,3 +233,62 @@ updateRevisionIf (Abs (mySmoothness - theValue) > ShortRealEpsilon()); mySmoothness = theValue; } + +// ======================================================================= +// function : SetRange +// purpose : +// ======================================================================= +void Graphic3d_CLight::SetRange (Standard_ShortReal theValue) +{ + Standard_ProgramError_Raise_if (myType != Graphic3d_TOLS_POSITIONAL && myType != Graphic3d_TOLS_SPOT, + "Graphic3d_CLight::SetRange(), incorrect light type"); + Standard_OutOfRange_Raise_if (theValue < 0.0, "Graphic3d_CLight::SetRange(), Bad value for falloff range"); + updateRevisionIf (Abs (Range() - theValue) > ShortRealEpsilon()); + myDirection.w() = theValue; +}; + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_CLight::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, this) + + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myId) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myName) + + if (myType == Graphic3d_TOLS_SPOT || myType == Graphic3d_TOLS_POSITIONAL) + { + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPosition) + } + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColor) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIntensity) + + if (myType == Graphic3d_TOLS_SPOT || myType == Graphic3d_TOLS_DIRECTIONAL) + { + gp_Dir aDirection = Direction(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &aDirection) + } + if (myType == Graphic3d_TOLS_POSITIONAL || myType == Graphic3d_TOLS_SPOT) + { + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, ConstAttenuation()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, LinearAttenuation()) + } + if (myType == Graphic3d_TOLS_SPOT) + { + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Angle()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Concentration()) + } + if (myType == Graphic3d_TOLS_POSITIONAL || myType == Graphic3d_TOLS_SPOT) + { + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Range()) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySmoothness) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myType) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRevision) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsHeadlight) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsEnabled) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CLight.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CLight.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CLight.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CLight.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -177,6 +177,16 @@ //! Modifies the smoothing angle (in radians) of directional light source; should be within range [0.0, M_PI/2]. Standard_EXPORT void SetSmoothAngle (Standard_ShortReal theValue); + //! Returns maximum distance on which point light source affects to objects and is considered during illumination calculations. + //! 0.0 means disabling range considering at all without any distance limits. + //! Has sense only for point light sources (positional and spot). + Standard_ShortReal Range() const { return myDirection.w(); } + + //! Modifies maximum distance on which point light source affects to objects and is considered during illumination calculations. + //! Positional and spot lights are only point light sources. + //! 0.0 means disabling range considering at all without any distance limits. + Standard_EXPORT void SetRange (Standard_ShortReal theValue); + //! @name low-level access methods public: @@ -189,11 +199,14 @@ //! Returns the color of the light source with dummy Alpha component, which should be ignored. const Graphic3d_Vec4& PackedColor() const { return myColor; } - //! Returns direction of directional/spot light. - const Graphic3d_Vec4& PackedDirection() const { return myDirection; } + //! Returns direction of directional/spot light and range for positional/spot light in alpha channel. + const Graphic3d_Vec4& PackedDirectionRange() const { return myDirection; } //! @return modification counter Standard_Size Revision() const { return myRevision; } + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; private: @@ -204,10 +217,10 @@ Standard_ShortReal& changeLinearAttenuation() { return myParams.y(); } //! Access spotlight angle parameter from packed vector. - Standard_ShortReal& changeAngle() { return myParams.z(); } + Standard_ShortReal& changeAngle() { return myParams.z(); } //! Access spotlight concentration parameter from packed vector. - Standard_ShortReal& changeConcentration() { return myParams.w(); } + Standard_ShortReal& changeConcentration() { return myParams.w(); } private: diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ClipPlane.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ClipPlane.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ClipPlane.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ClipPlane.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,7 @@ static Handle(Graphic3d_AspectFillArea3d) defaultAspect() { - Graphic3d_MaterialAspect aMaterial (Graphic3d_NOM_DEFAULT); + Graphic3d_MaterialAspect aMaterial (Graphic3d_NameOfMaterial_DEFAULT); Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d(); anAspect->SetDistinguishOff(); anAspect->SetFrontMaterial (aMaterial); @@ -338,3 +338,32 @@ } updateChainLen(); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_ClipPlane::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, this) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspect.get()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myNextInChain.get()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myPrevInChain) + + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myId) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPlane) + + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "Equation", 4, myEquation.x(), myEquation.y(), myEquation.z(), myEquation.w()) + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "EquationRev", 4, myEquationRev.x(), myEquationRev.y(), myEquationRev.z(), myEquationRev.w()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myChainLenFwd) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFlags) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myEquationMod) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAspectMod) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsOn) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsCapping) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ClipPlane.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ClipPlane.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ClipPlane.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ClipPlane.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -53,7 +53,7 @@ //! - Equation (0.0, 0.0, 1.0, 0) //! - IsOn (True), //! - IsCapping (False), - //! - Material (Graphic3d_NOM_DEFAULT), + //! - Material (Graphic3d_NameOfMaterial_DEFAULT), //! - Texture (NULL), //! - HatchStyle (Aspect_HS_HORIZONTAL), //! - IsHatchOn (False) @@ -377,6 +377,9 @@ return !IsPointOutHalfspace (aMinPnt); } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + public: // @name modification counters //! @return modification counter for equation. diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CStructure.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CStructure.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CStructure.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CStructure.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_CStructure,Standard_Transient) @@ -44,3 +45,44 @@ { Id = myGraphicDriver->NewIdentification(); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_CStructure::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + for (Graphic3d_SequenceOfGroup::Iterator anIterator (myGroups); anIterator.More(); anIterator.Next()) + { + const Handle(Graphic3d_Group)& aGroup = anIterator.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aGroup.get()) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Id) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myZLayer) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Priority) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, PreviousPriority) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, ContainsFacet) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsInfinite) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, stick) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, highlight) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, visible) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, HLRValidation) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsForHighlight) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsMutable) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Is2dText) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBndBox) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTrsf.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTrsfPers.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myClipPlanes.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myHighlightStyle.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsCulled) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBndBoxClipCheck) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CStructure.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CStructure.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CStructure.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CStructure.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include class Graphic3d_GraphicDriver; @@ -79,10 +79,10 @@ } //! Return transformation. - const Handle(Geom_Transformation)& Transformation() const { return myTrsf; } + const Handle(TopLoc_Datum3D)& Transformation() const { return myTrsf; } //! Assign transformation. - virtual void SetTransformation (const Handle(Geom_Transformation)& theTrsf) { myTrsf = theTrsf; } + virtual void SetTransformation (const Handle(TopLoc_Datum3D)& theTrsf) { myTrsf = theTrsf; } //! Return transformation persistence. const Handle(Graphic3d_TransformPers)& TransformPersistence() const { return myTrsfPers; } @@ -194,6 +194,9 @@ //! Update render transformation matrix. virtual void updateLayerTransformation() {} + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + public: int Id; @@ -224,7 +227,7 @@ Handle(Graphic3d_GraphicDriver) myGraphicDriver; Graphic3d_SequenceOfGroup myGroups; Graphic3d_BndBox3d myBndBox; - Handle(Geom_Transformation) myTrsf; + Handle(TopLoc_Datum3D) myTrsf; Handle(Graphic3d_TransformPers) myTrsfPers; Handle(Graphic3d_SequenceOfHClipPlane) myClipPlanes; Handle(Graphic3d_PresentationAttributes) myHighlightStyle; //! Current highlight style; is set only if highlight flag is true diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMap.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMap.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMap.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMap.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,21 +26,23 @@ public: //! Constructor defining loading cubemap from file. - Graphic3d_CubeMap (const TCollection_AsciiString& theFileName) : + Graphic3d_CubeMap (const TCollection_AsciiString& theFileName, + Standard_Boolean theToGenerateMipmaps = Standard_False) : Graphic3d_TextureMap (theFileName, Graphic3d_TOT_CUBEMAP), myCurrentSide (Graphic3d_CMS_POS_X), myEndIsReached (false), - myIsTopDown (true), - myZIsInverted (false) + myZIsInverted (false), + myHasMipmaps (theToGenerateMipmaps) {} //! Constructor defining direct cubemap initialization from PixMap. - Graphic3d_CubeMap (const Handle(Image_PixMap)& thePixmap = Handle(Image_PixMap)()) : + Graphic3d_CubeMap (const Handle(Image_PixMap)& thePixmap = Handle(Image_PixMap)(), + Standard_Boolean theToGenerateMipmaps = Standard_False) : Graphic3d_TextureMap (thePixmap, Graphic3d_TOT_CUBEMAP), myCurrentSide (Graphic3d_CMS_POS_X), myEndIsReached (false), - myIsTopDown (true), - myZIsInverted (false) + myZIsInverted (false), + myHasMipmaps (theToGenerateMipmaps) {} //! Returns whether the iterator has reached the end (true if it hasn't). @@ -63,12 +65,6 @@ } } - //! Returns whether row's memory layout is top-down. - Standard_Boolean IsTopDown() const - { - return myIsTopDown; - } - //! Sets Z axis inversion (vertical flipping). void SetZInversion (Standard_Boolean theZIsInverted) { @@ -81,9 +77,19 @@ return myZIsInverted; } + //! Returns whether mipmaps of cubemap will be generated or not. + Standard_Boolean HasMipmaps() const { return myHasMipmaps; } + + //! Sets whether to generate mipmaps of cubemap or not. + void SetMipmapsGeneration (Standard_Boolean theToGenerateMipmaps) { myHasMipmaps = theToGenerateMipmaps; } + + //! Returns current cubemap side as compressed PixMap. + //! Returns null handle if current side is invalid or if image is not in supported compressed format. + virtual Handle(Image_CompressedPixMap) CompressedValue (const Handle(Image_SupportedFormats)& theSupported) = 0; + //! Returns PixMap containing current side of cubemap. //! Returns null handle if current side is invalid. - virtual Handle(Image_PixMap) Value() = 0; + virtual Handle(Image_PixMap) Value (const Handle(Image_SupportedFormats)& theSupported) = 0; //! Sets iterator state to +X cubemap side. Graphic3d_CubeMap& Reset() @@ -100,8 +106,8 @@ Graphic3d_CubeMapSide myCurrentSide; //!< Iterator state Standard_Boolean myEndIsReached; //!< Indicates whether end of iteration has been reached or hasn't - Standard_Boolean myIsTopDown; //!< Stores rows's memory layout Standard_Boolean myZIsInverted; //!< Indicates whether Z axis is inverted that allows to synchronize vertical flip of cubemap + Standard_Boolean myHasMipmaps; //!< Indicates whether mipmaps of cubemap will be generated or not }; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapOrder.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapOrder.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapOrder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapOrder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -138,6 +138,10 @@ return &Order; } + //! Copy constructor. + Graphic3d_ValidatedCubeMapOrder (const Graphic3d_ValidatedCubeMapOrder& theOther) + : Order (theOther.Order) {} + public: const Graphic3d_CubeMapOrder Order; //!< Completely valid order @@ -146,13 +150,11 @@ //! Only Graphic3d_CubeMapOrder can generate Graphic3d_ValidatedCubeMapOrder in 'Validated' method. Graphic3d_ValidatedCubeMapOrder(const Graphic3d_CubeMapOrder theOrder) - : - Order(theOrder) - {} + : Order(theOrder) {} //! Deleted 'operator=' Graphic3d_ValidatedCubeMapOrder& operator= (const Graphic3d_ValidatedCubeMapOrder&); }; -#endif // _Graphic3d_CubeMapOrder_HeaderFile \ No newline at end of file +#endif // _Graphic3d_CubeMapOrder_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapPacked.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapPacked.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapPacked.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapPacked.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,7 +13,9 @@ // commercial license or contractual agreement. #include + #include +#include IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_CubeMapPacked, Graphic3d_CubeMap) @@ -40,17 +42,46 @@ myOrder (theOrder), myTileNumberX (1) { - if (checkImage (theImage, myTileNumberX)) + if (checkImage (theImage, myTileNumberX)) + { + myPixMap = theImage; + } +} + +// ======================================================================= +// function : CompressedValue +// purpose : +// ======================================================================= +Handle(Image_CompressedPixMap) Graphic3d_CubeMapPacked::CompressedValue (const Handle(Image_SupportedFormats)& theSupported) +{ + if (myTileNumberX == 0 + || !myPixMap.IsNull()) + { + return Handle(Image_CompressedPixMap)(); + } + + TCollection_AsciiString aFilePath; + myPath.SystemName (aFilePath); + if (!aFilePath.IsEmpty()) + { + const unsigned int aTileIndex = myOrder[myCurrentSide]; + Handle(Image_CompressedPixMap) anImage = Image_DDSParser::Load (theSupported, aFilePath, (Standard_Integer )aTileIndex); + if (!anImage.IsNull() + && anImage->NbFaces() == 6 + && anImage->SizeX() == anImage->SizeY()) { - myPixMap = theImage; + myIsTopDown = anImage->IsTopDown(); + return anImage; } + } + return Handle(Image_CompressedPixMap)(); } // ======================================================================= // function : Value // purpose : // ======================================================================= -Handle(Image_PixMap) Graphic3d_CubeMapPacked::Value() +Handle(Image_PixMap) Graphic3d_CubeMapPacked::Value (const Handle(Image_SupportedFormats)& theSupported) { if (myTileNumberX != 0) { @@ -60,7 +91,7 @@ myPath.SystemName (aFilePath); if (!aFilePath.IsEmpty()) { - tryLoadImage (aFilePath); + tryLoadImage (theSupported, aFilePath); } } @@ -183,13 +214,15 @@ // function : tryLoadImage // purpose : // ======================================================================= -void Graphic3d_CubeMapPacked::tryLoadImage (const TCollection_AsciiString& theFilePath) +void Graphic3d_CubeMapPacked::tryLoadImage (const Handle(Image_SupportedFormats)& theSupported, + const TCollection_AsciiString& theFilePath) { Handle(Image_AlienPixMap) anImage = new Image_AlienPixMap; if (anImage->Load (theFilePath)) { if (checkImage (anImage, myTileNumberX)) { + convertToCompatible (theSupported, anImage); myPixMap = anImage; } } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapPacked.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapPacked.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapPacked.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapPacked.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,23 +25,26 @@ DEFINE_STANDARD_RTTIEXT(Graphic3d_CubeMapPacked, Graphic3d_CubeMap) public: - //! Initialization to load cubemef from file. + //! Initialization to load cubemap from file. //! @theFileName - path to the cubemap image - //! @theOrder - array conaining six different indexes of cubemap sides which maps tile grid to cubemap sides + //! @theOrder - array containing six different indexes of cubemap sides which maps tile grid to cubemap sides Standard_EXPORT Graphic3d_CubeMapPacked (const TCollection_AsciiString& theFileName, const Graphic3d_ValidatedCubeMapOrder theOrder = Graphic3d_CubeMapOrder::Default()); //! Initialization to set cubemap directly by PixMap. //! @thePixMap - origin PixMap - //! @theOrder - array conaining six different indexes of cubemap sides which maps tile grid to cubemap sides + //! @theOrder - array containing six different indexes of cubemap sides which maps tile grid to cubemap sides Standard_EXPORT Graphic3d_CubeMapPacked (const Handle(Image_PixMap)& theImage, const Graphic3d_ValidatedCubeMapOrder theOrder = Graphic3d_CubeMapOrder::Default()); + //! Returns current cubemap side as compressed PixMap. + Standard_EXPORT virtual Handle(Image_CompressedPixMap) CompressedValue (const Handle(Image_SupportedFormats)& theSupported) Standard_OVERRIDE; + //! Returns current cubemap side as PixMap. //! Resulting PixMap is memory wrapper over original image. //! Returns null handle if current side or whole cubemap is invalid. //! Origin image has to contain six quad tiles having one sizes without any gaps to be valid. - Standard_EXPORT Handle(Image_PixMap) Value() Standard_OVERRIDE; + Standard_EXPORT virtual Handle(Image_PixMap) Value (const Handle(Image_SupportedFormats)& theSupported) Standard_OVERRIDE; //! Empty destructor. ~Graphic3d_CubeMapPacked() {} @@ -57,7 +60,8 @@ //! Tries to load image from file and checks it after that. //! Does nothing in case of fail. - void tryLoadImage (const TCollection_AsciiString &theFilePath); + void tryLoadImage (const Handle(Image_SupportedFormats)& theSupported, + const TCollection_AsciiString &theFilePath); protected: diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapSeparate.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapSeparate.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapSeparate.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapSeparate.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,7 +13,9 @@ // commercial license or contractual agreement. #include + #include +#include #include #include #include @@ -84,10 +86,54 @@ } // ======================================================================= +// function : CompressedValue +// purpose : +// ======================================================================= +Handle(Image_CompressedPixMap) Graphic3d_CubeMapSeparate::CompressedValue (const Handle(Image_SupportedFormats)& theSupported) +{ + if (!myImages[0].IsNull()) + { + return Handle(Image_CompressedPixMap)(); + } + + const Graphic3d_CubeMapOrder anOrder = Graphic3d_CubeMapOrder::Default(); + TCollection_AsciiString aFilePath; + myPaths[anOrder[myCurrentSide]].SystemName(aFilePath); + if (aFilePath.IsEmpty()) + { + return Handle(Image_CompressedPixMap)(); + } + + Handle(Image_CompressedPixMap) anImage = Image_DDSParser::Load (theSupported, aFilePath, 0); + if (anImage.IsNull() + || anImage->SizeX() != anImage->SizeY()) + { + return Handle(Image_CompressedPixMap)(); + } + + if (myCurrentSide == 0) + { + mySize = anImage->SizeX(); + myFormat = anImage->BaseFormat(); + myIsTopDown = anImage->IsTopDown(); + return anImage; + } + + if (anImage->BaseFormat() == myFormat + && anImage->SizeX() == (Standard_Integer )mySize) + { + return anImage; + } + + Message::SendWarning (TCollection_AsciiString() + "'" + aFilePath + "' inconsistent image format or dimension in Graphic3d_CubeMapSeparate"); + return Handle(Image_CompressedPixMap)(); +} + +// ======================================================================= // function : Value // purpose : // ======================================================================= -Handle(Image_PixMap) Graphic3d_CubeMapSeparate::Value() +Handle(Image_PixMap) Graphic3d_CubeMapSeparate::Value (const Handle(Image_SupportedFormats)& theSupported) { Graphic3d_CubeMapOrder anOrder = Graphic3d_CubeMapOrder::Default(); if (!myIsTopDown) @@ -108,6 +154,7 @@ Handle(Image_AlienPixMap) anImage = new Image_AlienPixMap; if (anImage->Load(aFilePath)) { + convertToCompatible (theSupported, anImage); if (anImage->SizeX() == anImage->SizeY()) { if (myCurrentSide == 0) @@ -127,22 +174,19 @@ } else { - Message::DefaultMessenger()->Send(TCollection_AsciiString() + - "'" + aFilePath + "' inconsistent image format or dimension in Graphic3d_CubeMapSeparate"); + Message::SendWarning (TCollection_AsciiString() + "'" + aFilePath + "' inconsistent image format or dimension in Graphic3d_CubeMapSeparate"); } } } } else { - Message::DefaultMessenger()->Send(TCollection_AsciiString() + - "Unable to load '" + aFilePath + "' image of Graphic3d_CubeMapSeparate"); + Message::SendWarning (TCollection_AsciiString() + "Unable to load '" + aFilePath + "' image of Graphic3d_CubeMapSeparate"); } } else { - Message::DefaultMessenger()->Send(TCollection_AsciiString() + - "[" + myCurrentSide + "] path of Graphic3d_CubeMapSeparate is invalid"); + Message::SendWarning (TCollection_AsciiString() + "[" + myCurrentSide + "] path of Graphic3d_CubeMapSeparate is invalid"); } } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapSeparate.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapSeparate.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapSeparate.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CubeMapSeparate.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,13 +33,16 @@ //! @theImages - array if PixMaps (has to have size equal 6). Standard_EXPORT Graphic3d_CubeMapSeparate(const NCollection_Array1& theImages); + //! Returns current cubemap side as compressed PixMap. + Standard_EXPORT virtual Handle(Image_CompressedPixMap) CompressedValue (const Handle(Image_SupportedFormats)& theSupported) Standard_OVERRIDE; + //! Returns current side of cubemap as PixMap. //! Returns null handle if current side or whole cubemap is invalid. //! All origin images have to have the same sizes, format and quad shapes to form valid cubemap. - Standard_EXPORT Handle(Image_PixMap) Value() Standard_OVERRIDE; + Standard_EXPORT virtual Handle(Image_PixMap) Value (const Handle(Image_SupportedFormats)& theSupported) Standard_OVERRIDE; //! Returns NULL. - virtual Handle(Image_PixMap) GetImage() const Standard_OVERRIDE + virtual Handle(Image_PixMap) GetImage (const Handle(Image_SupportedFormats)& ) Standard_OVERRIDE { return Handle(Image_PixMap)(); } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CullingTool.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CullingTool.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CullingTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CullingTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,12 +34,17 @@ // ======================================================================= // function : SetViewVolume -// purpose : Retrieves view volume's planes equations and its vertices from projection and world-view matrices. +// purpose : // ======================================================================= -void Graphic3d_CullingTool::SetViewVolume (const Handle(Graphic3d_Camera)& theCamera) +void Graphic3d_CullingTool::SetViewVolume (const Handle(Graphic3d_Camera)& theCamera, + const Graphic3d_Mat4d& theModelWorld) { - if (!myWorldViewProjState.IsChanged (theCamera->WorldViewProjState())) + const bool hasModelTrsf = !theModelWorld.IsIdentity(); + if (!myWorldViewProjState.IsChanged (theCamera->WorldViewProjState()) + && !hasModelTrsf) + { return; + } myIsProjectionParallel = theCamera->IsOrthographic(); const gp_Dir aCamDir = theCamera->Direction(); @@ -50,12 +55,19 @@ myWorldViewProjState = theCamera->WorldViewProjState(); myCamEye.SetValues (theCamera->Eye().X(), theCamera->Eye().Y(), theCamera->Eye().Z()); myCamDir.SetValues (aCamDir.X(), aCamDir.Y(), aCamDir.Z()); + if (hasModelTrsf) + { + Graphic3d_Mat4d aModelInv; + theModelWorld.Inverted (aModelInv); + myCamEye = (aModelInv * Graphic3d_Vec4d (myCamEye, 1.0)).xyz(); + myCamDir = (aModelInv * Graphic3d_Vec4d (myCamDir, 0.0)).xyz(); + } myCamScale = theCamera->IsOrthographic() ? theCamera->Scale() : 2.0 * Tan (theCamera->FOVy() * M_PI / 360.0); // same as theCamera->Scale()/theCamera->Distance() // Compute frustum points - theCamera->FrustumPoints (myClipVerts); + theCamera->FrustumPoints (myClipVerts, theModelWorld); // Compute frustum planes // Vertices go in order: @@ -84,7 +96,7 @@ myClipPlanes[aFaceIdx * 2 + i].Normal = Graphic3d_Vec3d::Cross (aPlanePnts[1] - aPlanePnts[0], aPlanePnts[2] - aPlanePnts[0]).Normalized() * (i == 0 ? -1.f : 1.f); - } + } } } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CullingTool.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CullingTool.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CullingTool.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CullingTool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,7 +59,10 @@ Standard_EXPORT Graphic3d_CullingTool(); //! Retrieves view volume's planes equations and its vertices from projection and world-view matrices. - Standard_EXPORT void SetViewVolume (const Handle(Graphic3d_Camera)& theCamera); + //! @param theCamera [in] camera definition + //! @param theModelWorld [in] optional object transformation for computing frustum in object local coordinate system + Standard_EXPORT void SetViewVolume (const Handle(Graphic3d_Camera)& theCamera, + const Graphic3d_Mat4d& theModelWorld = Graphic3d_Mat4d()); Standard_EXPORT void SetViewportSize (Standard_Integer theViewportWidth, Standard_Integer theViewportHeight, @@ -78,17 +81,20 @@ Standard_EXPORT void CacheClipPtsProjections(); //! Checks whether given AABB should be entirely culled or not. - //! @param theCtx [in] culling properties - //! @param theMinPt [in] maximum point of AABB - //! @param theMaxPt [in] minimum point of AABB - //! @return Standard_True, if AABB is in viewing area, Standard_False otherwise + //! @param theCtx [in] culling properties + //! @param theMinPnt [in] maximum point of AABB + //! @param theMaxPnt [in] minimum point of AABB + //! @param theIsInside [out] flag indicating if AABB is fully inside; initial value should be set to TRUE + //! @return TRUE if AABB is completely outside of view frustum or culled by size/distance; + //! FALSE in case of partial or complete overlap (use theIsInside to distinguish) bool IsCulled (const CullingContext& theCtx, - const Graphic3d_Vec3d& theMinPt, - const Graphic3d_Vec3d& theMaxPt) const - { - return isFullOut (theMinPt, theMaxPt) - || isTooDistant(theCtx, theMinPt, theMaxPt) - || isTooSmall (theCtx, theMinPt, theMaxPt); + const Graphic3d_Vec3d& theMinPnt, + const Graphic3d_Vec3d& theMaxPnt, + Standard_Boolean* theIsInside = NULL) const + { + return IsOutFrustum(theMinPnt, theMaxPnt, theIsInside) + || IsTooDistant(theCtx, theMinPnt, theMaxPnt, theIsInside) + || IsTooSmall (theCtx, theMinPnt, theMaxPnt); } //! Return the camera definition. @@ -122,7 +128,13 @@ return myWorldViewProjState; } -protected: + //! Returns camera eye position. + const Graphic3d_Vec3d& CameraEye() const { return myCamEye; } + + //! Returns camera direction. + const Graphic3d_Vec3d& CameraDirection() const { return myCamDir; } + +public: //! Calculates signed distance from plane to point. //! @param theNormal [in] the plane's normal. @@ -131,76 +143,89 @@ const Graphic3d_Vec4d& thePnt); //! Detects if AABB overlaps view volume using separating axis theorem (SAT). - //! @param theMinPt [in] maximum point of AABB. - //! @param theMaxPt [in] minimum point of AABB. - //! @return FALSE, if AABB is in viewing area, TRUE otherwise. - bool isFullOut (const Graphic3d_Vec3d& theMinPt, - const Graphic3d_Vec3d& theMaxPt) const + //! @param theMinPnt [in] maximum point of AABB + //! @param theMaxPnt [in] minimum point of AABB + //! @param theIsInside [out] flag indicating if AABB is fully inside; initial value should be set to TRUE + //! @return TRUE if AABB is completely outside of view frustum; + //! FALSE in case of partial or complete overlap (use theIsInside to distinguish) + //! @sa SelectMgr_Frustum::hasOverlap() + bool IsOutFrustum (const Graphic3d_Vec3d& theMinPnt, + const Graphic3d_Vec3d& theMaxPnt, + Standard_Boolean* theIsInside = NULL) const { // E1 // |_ E0 // / // E2 - - // E0 test (x axis) - if (theMinPt.x() > myMaxOrthoProjectionPts[0] - || theMaxPt.x() < myMinOrthoProjectionPts[0]) - { - return true; - } - - // E1 test (y axis) - if (theMinPt.y() > myMaxOrthoProjectionPts[1] - || theMaxPt.y() < myMinOrthoProjectionPts[1]) + if (theMinPnt[0] > myMaxOrthoProjectionPts[0] // E0 test (x axis) + || theMaxPnt[0] < myMinOrthoProjectionPts[0] + || theMinPnt[1] > myMaxOrthoProjectionPts[1] // E1 test (y axis) + || theMaxPnt[1] < myMinOrthoProjectionPts[1] + || theMinPnt[2] > myMaxOrthoProjectionPts[2] // E2 test (z axis) + || theMaxPnt[2] < myMinOrthoProjectionPts[2]) { return true; } - - // E2 test (z axis) - if (theMinPt.z() > myMaxOrthoProjectionPts[2] - || theMaxPt.z() < myMinOrthoProjectionPts[2]) + if (theIsInside != NULL + && *theIsInside) { - return true; + *theIsInside = theMinPnt[0] >= myMinOrthoProjectionPts[0] // E0 test (x axis) + && theMaxPnt[0] <= myMaxOrthoProjectionPts[0] + && theMinPnt[1] >= myMinOrthoProjectionPts[1] // E1 test (y axis) + && theMaxPnt[1] <= myMaxOrthoProjectionPts[1] + && theMinPnt[1] >= myMinOrthoProjectionPts[2] // E2 test (z axis) + && theMaxPnt[1] <= myMaxOrthoProjectionPts[2]; } const Standard_Integer anIncFactor = myIsProjectionParallel ? 2 : 1; for (Standard_Integer aPlaneIter = 0; aPlaneIter < PlanesNB - 1; aPlaneIter += anIncFactor) { // frustum normals - const Graphic3d_Vec3d anAxis = myClipPlanes[aPlaneIter].Normal; - - const Graphic3d_Vec3d aPVertex (anAxis.x() > 0.0 ? theMaxPt.x() : theMinPt.x(), - anAxis.y() > 0.0 ? theMaxPt.y() : theMinPt.y(), - anAxis.z() > 0.0 ? theMaxPt.z() : theMinPt.z()); - Standard_Real aPnt0 = aPVertex.Dot (anAxis); - - if (aPnt0 >= myMinClipProjectionPts[aPlaneIter] + const Graphic3d_Vec3d& anAxis = myClipPlanes[aPlaneIter].Normal; + const Graphic3d_Vec3d aPVertex (anAxis.x() > 0.0 ? theMaxPnt.x() : theMinPnt.x(), + anAxis.y() > 0.0 ? theMaxPnt.y() : theMinPnt.y(), + anAxis.z() > 0.0 ? theMaxPnt.z() : theMinPnt.z()); + const Standard_Real aPnt0 = aPVertex.Dot (anAxis); + if (theIsInside == NULL + && aPnt0 >= myMinClipProjectionPts[aPlaneIter] && aPnt0 <= myMaxClipProjectionPts[aPlaneIter]) { continue; } - const Graphic3d_Vec3d aNVertex (anAxis.x() > 0.0 ? theMinPt.x() : theMaxPt.x(), - anAxis.y() > 0.0 ? theMinPt.y() : theMaxPt.y(), - anAxis.z() > 0.0 ? theMinPt.z() : theMaxPt.z()); - Standard_Real aPnt1 = aNVertex.Dot (anAxis); - - const Standard_Real aMin = aPnt0 < aPnt1 ? aPnt0 : aPnt1; - const Standard_Real aMax = aPnt0 > aPnt1 ? aPnt0 : aPnt1; - - if (aMin > myMaxClipProjectionPts[aPlaneIter] - || aMax < myMinClipProjectionPts[aPlaneIter]) + const Graphic3d_Vec3d aNVertex (anAxis.x() > 0.0 ? theMinPnt.x() : theMaxPnt.x(), + anAxis.y() > 0.0 ? theMinPnt.y() : theMaxPnt.y(), + anAxis.z() > 0.0 ? theMinPnt.z() : theMaxPnt.z()); + const Standard_Real aPnt1 = aNVertex.Dot (anAxis); + + const Standard_Real aBoxProjMin = aPnt0 < aPnt1 ? aPnt0 : aPnt1; + const Standard_Real aBoxProjMax = aPnt0 > aPnt1 ? aPnt0 : aPnt1; + if (aBoxProjMin > myMaxClipProjectionPts[aPlaneIter] + || aBoxProjMax < myMinClipProjectionPts[aPlaneIter]) { return true; } + + if (theIsInside != NULL + && *theIsInside) + { + *theIsInside = aBoxProjMin >= myMinClipProjectionPts[aPlaneIter] + && aBoxProjMax <= myMaxClipProjectionPts[aPlaneIter]; + } } return false; } //! Returns TRUE if given AABB should be discarded by distance culling criterion. - bool isTooDistant (const CullingContext& theCtx, - const Graphic3d_Vec3d& theMinPt, - const Graphic3d_Vec3d& theMaxPt) const + //! @param theMinPnt [in] maximum point of AABB + //! @param theMaxPnt [in] minimum point of AABB + //! @param theIsInside [out] flag indicating if AABB is fully inside; initial value should be set to TRUE + //! @return TRUE if AABB is completely behind culling distance; + //! FALSE in case of partial or complete overlap (use theIsInside to distinguish) + bool IsTooDistant (const CullingContext& theCtx, + const Graphic3d_Vec3d& theMinPnt, + const Graphic3d_Vec3d& theMaxPnt, + Standard_Boolean* theIsInside = NULL) const { if (theCtx.DistCull <= 0.0) { @@ -208,22 +233,34 @@ } // check distance to the bounding sphere as fast approximation - const Graphic3d_Vec3d aSphereCenter = (theMinPt + theMaxPt) * 0.5; - const Standard_Real aSphereRadius = (theMaxPt - theMinPt).maxComp() * 0.5; - return (aSphereCenter - myCamEye).Modulus() - aSphereRadius > theCtx.DistCull; + const Graphic3d_Vec3d aSphereCenter = (theMinPnt + theMaxPnt) * 0.5; + const Standard_Real aSphereRadius = (theMaxPnt - theMinPnt).maxComp() * 0.5; + const Standard_Real aDistToCenter = (aSphereCenter - myCamEye).Modulus(); + if ((aDistToCenter - aSphereRadius) > theCtx.DistCull) + { + // clip if closest point is behind culling distance + return true; + } + if (theIsInside != NULL + && *theIsInside) + { + // check if farthest point is before culling distance + *theIsInside = (aDistToCenter + aSphereRadius) <= theCtx.DistCull; + } + return false; } //! Returns TRUE if given AABB should be discarded by size culling criterion. - bool isTooSmall (const CullingContext& theCtx, - const Graphic3d_Vec3d& theMinPt, - const Graphic3d_Vec3d& theMaxPt) const + bool IsTooSmall (const CullingContext& theCtx, + const Graphic3d_Vec3d& theMinPnt, + const Graphic3d_Vec3d& theMaxPnt) const { if (theCtx.SizeCull2 <= 0.0) { return false; } - const Standard_Real aBoxDiag2 = (theMaxPt - theMinPt).SquareModulus(); + const Standard_Real aBoxDiag2 = (theMaxPnt - theMinPnt).SquareModulus(); if (myIsProjectionParallel) { return aBoxDiag2 < theCtx.SizeCull2; @@ -231,7 +268,7 @@ // note that distances behind the Eye (aBndDist < 0) are not scaled correctly here, // but majority of such objects should be culled by frustum - const Graphic3d_Vec3d aBndCenter = (theMinPt + theMaxPt) * 0.5; + const Graphic3d_Vec3d aBndCenter = (theMinPnt + theMaxPnt) * 0.5; const Standard_Real aBndDist = (aBndCenter - myCamEye).Dot (myCamDir); return aBoxDiag2 < theCtx.SizeCull2 * aBndDist * aBndDist; } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CView.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CView.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CView.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CView.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,6 +13,7 @@ #include +#include #include #include #include @@ -32,7 +33,8 @@ myIsActive (Standard_False), myIsRemoved (Standard_False), myShadingModel (Graphic3d_TOSM_FRAGMENT), - myVisualization (Graphic3d_TOV_WIREFRAME) + myVisualization (Graphic3d_TOV_WIREFRAME), + myUnitFactor (1.0) { myId = myStructureManager->Identification (this); } @@ -43,6 +45,7 @@ //======================================================================= Graphic3d_CView::~Graphic3d_CView() { + myXRSession.Nullify(); if (!IsRemoved()) { myStructureManager->UnIdentification (this); @@ -186,6 +189,7 @@ const Handle(Graphic3d_Structure)& aStructComp = myStructsComputed.Value (anIndex); eraseStructure (aStructComp->CStructure()); displayStructure (aStruct->CStructure(), aStruct->DisplayPriority()); + Update (aStruct->GetZLayer()); } } return; @@ -218,7 +222,12 @@ } else { - Handle(Graphic3d_Structure) aCompStruct = aStruct->IsTransformed() ? aStruct->Compute (this, aStruct->Transformation()) : aStruct->Compute (this); + Handle(Graphic3d_Structure) aCompStruct; + aStruct->computeHLR (myCamera, aCompStruct); + if (aCompStruct.IsNull()) + { + continue; + } aCompStruct->SetHLRValidation (Standard_True); const Standard_Boolean toComputeWireframe = myVisualization == Graphic3d_TOV_WIREFRAME @@ -297,9 +306,13 @@ // compute + validation Handle(Graphic3d_Structure) aCompStructOld = myStructsComputed.ChangeValue (anIndex); Handle(Graphic3d_Structure) aCompStruct = aCompStructOld; - aCompStruct->SetTransformation (Handle(Geom_Transformation)()); - theStruct->IsTransformed() ? theStruct->Compute (this, theStruct->Transformation(), aCompStruct) - : theStruct->Compute (this, aCompStruct); + aCompStruct->SetTransformation (Handle(TopLoc_Datum3D)()); + theStruct->computeHLR (myCamera, aCompStruct); + if (aCompStruct.IsNull()) + { + return; + } + aCompStruct->SetHLRValidation (Standard_True); aCompStruct->CalculateBoundBox(); @@ -768,23 +781,13 @@ if (anIndex != 0) { aStruct = myStructsComputed.Value (anIndex); - aStruct->SetTransformation (Handle(Geom_Transformation)()); - if (theStructure->IsTransformed()) - { - theStructure->Compute (this, theStructure->Transformation(), aStruct); - } - else - { - theStructure->Compute (this, aStruct); - } + aStruct->SetTransformation (Handle(TopLoc_Datum3D)()); } - else + theStructure->computeHLR (myCamera, aStruct); + if (aStruct.IsNull()) { - aStruct = theStructure->IsTransformed() - ? theStructure->Compute (this, theStructure->Transformation()) - : theStructure->Compute (this); + return; } - aStruct->SetHLRValidation (Standard_True); // TOCOMPUTE and COMPUTED associated to sequences are added @@ -884,7 +887,7 @@ // purpose : // ======================================================================= void Graphic3d_CView::SetTransform (const Handle(Graphic3d_Structure)& theStructure, - const Handle(Geom_Transformation)& theTrsf) + const Handle(TopLoc_Datum3D)& theTrsf) { const Standard_Integer anIndex = IsComputed (theStructure); if (anIndex != 0) @@ -1096,3 +1099,354 @@ myShadingModel = theModel; } + +// ======================================================================= +// function : SetUnitFactor +// purpose : +// ======================================================================= +void Graphic3d_CView::SetUnitFactor (Standard_Real theFactor) +{ + if (theFactor <= 0.0) + { + throw Standard_ProgramError ("Graphic3d_CView::SetUnitFactor() - invalid unit factor"); + } + myUnitFactor = theFactor; + if (!myXRSession.IsNull()) + { + myXRSession->SetUnitFactor (theFactor); + } +} + +// ======================================================================= +// function : IsActiveXR +// purpose : +// ======================================================================= +bool Graphic3d_CView::IsActiveXR() const +{ + return !myXRSession.IsNull() + && myXRSession->IsOpen(); +} + +// ======================================================================= +// function : InitXR +// purpose : +// ======================================================================= +bool Graphic3d_CView::InitXR() +{ + if (myXRSession.IsNull()) + { + myXRSession = new Aspect_OpenVRSession(); + myXRSession->SetUnitFactor (myUnitFactor); + } + if (!myXRSession->IsOpen()) + { + myXRSession->Open(); + if (myBackXRCamera.IsNull()) + { + // backup camera properties + myBackXRCamera = new Graphic3d_Camera (myCamera); + } + } + return myXRSession->IsOpen(); +} + +// ======================================================================= +// function : ReleaseXR +// purpose : +// ======================================================================= +void Graphic3d_CView::ReleaseXR() +{ + if (!myXRSession.IsNull()) + { + if (myXRSession->IsOpen() + && !myBackXRCamera.IsNull()) + { + // restore projection properties overridden by HMD + myCamera->SetFOV2d (myBackXRCamera->FOV2d()); + myCamera->SetFOVy (myBackXRCamera->FOVy()); + myCamera->SetAspect(myBackXRCamera->Aspect()); + myCamera->SetIOD (myBackXRCamera->GetIODType(), myBackXRCamera->IOD()); + myCamera->SetZFocus(myBackXRCamera->ZFocusType(), myBackXRCamera->ZFocus()); + myCamera->ResetCustomProjection(); + myBackXRCamera.Nullify(); + } + myXRSession->Close(); + } +} + +//======================================================================= +//function : ProcessXRInput +//purpose : +//======================================================================= +void Graphic3d_CView::ProcessXRInput() +{ + if (myRenderParams.StereoMode == Graphic3d_StereoMode_OpenVR + && myCamera->ProjectionType() == Graphic3d_Camera::Projection_Stereo) + { + InitXR(); + } + else + { + ReleaseXR(); + } + + if (!IsActiveXR()) + { + myBaseXRCamera.Nullify(); + myPosedXRCamera.Nullify(); + return; + } + + myXRSession->ProcessEvents(); + Invalidate(); + + myCamera->SetFOV2d (myRenderParams.HmdFov2d); + myCamera->SetAspect(myXRSession->Aspect()); + myCamera->SetFOVy (myXRSession->FieldOfView()); + myCamera->SetIOD (Graphic3d_Camera::IODType_Absolute, myXRSession->IOD()); + myCamera->SetZFocus(Graphic3d_Camera::FocusType_Absolute, 1.0 * myUnitFactor); + + // VR APIs tend to decompose camera orientation-projection matrices into the following components: + // @begincode + // Model * [View * Eye^-1] * [Projection] + // @endcode + // so that Eye position is encoded into Orientation matrix, and there should be 2 Orientation matrices and 2 Projection matrices to make the stereo. + // Graphic3d_Camera historically follows different decomposition, with Eye position encoded into Projection matrix, + // so that there is only 1 Orientation matrix (matching mono view) and 2 Projection matrices. + if (myXRSession->HasProjectionFrustums()) + { + // note that this definition does not include a small forward/backward offset from head to eye + myCamera->SetCustomStereoFrustums (myXRSession->ProjectionFrustum (Aspect_Eye_Left), + myXRSession->ProjectionFrustum (Aspect_Eye_Right)); + } + else + { + const Graphic3d_Mat4d aPoseL = myXRSession->HeadToEyeTransform (Aspect_Eye_Left); + const Graphic3d_Mat4d aPoseR = myXRSession->HeadToEyeTransform (Aspect_Eye_Right); + const Graphic3d_Mat4d aProjL = myXRSession->ProjectionMatrix (Aspect_Eye_Left, myCamera->ZNear(), myCamera->ZFar()); + const Graphic3d_Mat4d aProjR = myXRSession->ProjectionMatrix (Aspect_Eye_Right, myCamera->ZNear(), myCamera->ZFar()); + myCamera->SetCustomStereoProjection (aProjL, aPoseL, aProjR, aPoseR); + } + myBaseXRCamera = myCamera; + if (myPosedXRCamera.IsNull()) + { + myPosedXRCamera = new Graphic3d_Camera(); + } + SynchronizeXRBaseToPosedCamera(); +} + +//======================================================================= +//function : SynchronizeXRBaseToPosedCamera +//purpose : +//======================================================================= +void Graphic3d_CView::SynchronizeXRBaseToPosedCamera() +{ + if (!myPosedXRCamera.IsNull()) + { + ComputeXRPosedCameraFromBase (*myPosedXRCamera, myXRSession->HeadPose()); + } +} + +//======================================================================= +//function : ComputeXRPosedCameraFromBase +//purpose : +//======================================================================= +void Graphic3d_CView::ComputeXRPosedCameraFromBase (Graphic3d_Camera& theCam, + const gp_Trsf& theXRTrsf) const +{ + theCam.Copy (myBaseXRCamera); + + // convert head pose into camera transformation + const gp_Ax3 anAxVr (gp::Origin(), gp::DZ(), gp::DX()); + const gp_Ax3 aCameraCS (gp::Origin(), -myBaseXRCamera->Direction(), -myBaseXRCamera->SideRight()); + gp_Trsf aTrsfCS; + aTrsfCS.SetTransformation (aCameraCS, anAxVr); + const gp_Trsf aTrsfToCamera = aTrsfCS * theXRTrsf * aTrsfCS.Inverted(); + gp_Trsf aTrsfToEye; + aTrsfToEye.SetTranslation (myBaseXRCamera->Eye().XYZ()); + + const gp_Trsf aTrsf = aTrsfToEye * aTrsfToCamera; + const gp_Dir anUpNew = myBaseXRCamera->Up().Transformed (aTrsf); + const gp_Dir aDirNew = myBaseXRCamera->Direction().Transformed (aTrsf); + const gp_Pnt anEyeNew = gp::Origin().Translated (aTrsf.TranslationPart()); + theCam.SetUp (anUpNew); + theCam.SetDirectionFromEye (aDirNew); + theCam.MoveEyeTo (anEyeNew); +} + +//======================================================================= +//function : SynchronizeXRPosedToBaseCamera +//purpose : +//======================================================================= +void Graphic3d_CView::SynchronizeXRPosedToBaseCamera() +{ + if (myPosedXRCameraCopy.IsNull() + || myPosedXRCamera.IsNull() + || myBaseXRCamera.IsNull() + || myCamera != myPosedXRCamera) + { + return; + } + + if (myPosedXRCameraCopy->Eye().IsEqual (myPosedXRCamera->Eye(), gp::Resolution()) + && (myPosedXRCameraCopy->Distance() - myPosedXRCamera->Distance()) <= gp::Resolution() + && myPosedXRCameraCopy->Direction().IsEqual (myPosedXRCamera->Direction(), gp::Resolution()) + && myPosedXRCameraCopy->Up().IsEqual (myPosedXRCamera->Up(), gp::Resolution())) + { + // avoid floating point math in case of no changes + return; + } + + // re-compute myBaseXRCamera from myPosedXRCamera by applying reversed head pose transformation + ComputeXRBaseCameraFromPosed (myPosedXRCamera, myXRSession->HeadPose()); + myPosedXRCameraCopy->Copy (myPosedXRCamera); +} + +//======================================================================= +//function : ComputeXRBaseCameraFromPosed +//purpose : +//======================================================================= +void Graphic3d_CView::ComputeXRBaseCameraFromPosed (const Graphic3d_Camera& theCamPosed, + const gp_Trsf& thePoseTrsf) +{ + const gp_Ax3 anAxVr (gp::Origin(), gp::DZ(), gp::DX()); + const gp_Ax3 aCameraCS (gp::Origin(), -myBaseXRCamera->Direction(), -myBaseXRCamera->SideRight()); + gp_Trsf aTrsfCS; + aTrsfCS.SetTransformation (aCameraCS, anAxVr); + const gp_Trsf aTrsfToCamera = aTrsfCS * thePoseTrsf * aTrsfCS.Inverted(); + const gp_Trsf aTrsfCamToHead = aTrsfToCamera.Inverted(); + const gp_Dir anUpNew = theCamPosed.Up().Transformed (aTrsfCamToHead); + const gp_Dir aDirNew = theCamPosed.Direction().Transformed (aTrsfCamToHead); + const gp_Pnt anEyeNew = theCamPosed.Eye().Translated (aTrsfToCamera.TranslationPart().Reversed()); + myBaseXRCamera->SetUp (anUpNew); + myBaseXRCamera->SetDirectionFromEye (aDirNew); + myBaseXRCamera->MoveEyeTo (anEyeNew); +} + +//======================================================================= +//function : TurnViewXRCamera +//purpose : +//======================================================================= +void Graphic3d_CView::TurnViewXRCamera (const gp_Trsf& theTrsfTurn) +{ + // use current eye position as an anchor + const Handle(Graphic3d_Camera)& aCamBase = myBaseXRCamera; + gp_Trsf aHeadTrsfLocal; + aHeadTrsfLocal.SetTranslationPart (myXRSession->HeadPose().TranslationPart()); + const gp_Pnt anEyeAnchor = PoseXRToWorld (aHeadTrsfLocal).TranslationPart(); + + // turn the view + aCamBase->SetDirectionFromEye (aCamBase->Direction().Transformed (theTrsfTurn)); + + // recompute new eye + const gp_Ax3 anAxVr (gp::Origin(), gp::DZ(), gp::DX()); + const gp_Ax3 aCameraCS (gp::Origin(), -aCamBase->Direction(), -aCamBase->SideRight()); + gp_Trsf aTrsfCS; + aTrsfCS.SetTransformation (aCameraCS, anAxVr); + const gp_Trsf aTrsfToCamera = aTrsfCS * aHeadTrsfLocal * aTrsfCS.Inverted(); + const gp_Pnt anEyeNew = anEyeAnchor.Translated (aTrsfToCamera.TranslationPart().Reversed()); + aCamBase->MoveEyeTo (anEyeNew); + + SynchronizeXRBaseToPosedCamera(); +} + +//======================================================================= +//function : SetupXRPosedCamera +//purpose : +//======================================================================= +void Graphic3d_CView::SetupXRPosedCamera() +{ + if (!myPosedXRCamera.IsNull()) + { + myCamera = myPosedXRCamera; + if (myPosedXRCameraCopy.IsNull()) + { + myPosedXRCameraCopy = new Graphic3d_Camera(); + } + myPosedXRCameraCopy->Copy (myPosedXRCamera); + } +} + +//======================================================================= +//function : UnsetXRPosedCamera +//purpose : +//======================================================================= +void Graphic3d_CView::UnsetXRPosedCamera() +{ + if (myCamera == myPosedXRCamera + && !myBaseXRCamera.IsNull()) + { + SynchronizeXRPosedToBaseCamera(); + myCamera = myBaseXRCamera; + } +} + +//======================================================================= +//function : DiagnosticInformation +//purpose : +//======================================================================= +void Graphic3d_CView::DiagnosticInformation (TColStd_IndexedDataMapOfStringString& theDict, + Graphic3d_DiagnosticInfo theFlags) const +{ + if ((theFlags & Graphic3d_DiagnosticInfo_Device) != 0 + && !myXRSession.IsNull()) + { + TCollection_AsciiString aVendor = myXRSession->GetString (Aspect_XRSession::InfoString_Vendor); + TCollection_AsciiString aDevice = myXRSession->GetString (Aspect_XRSession::InfoString_Device); + TCollection_AsciiString aTracker = myXRSession->GetString (Aspect_XRSession::InfoString_Tracker); + TCollection_AsciiString aSerial = myXRSession->GetString (Aspect_XRSession::InfoString_SerialNumber); + TCollection_AsciiString aDisplay = TCollection_AsciiString() + + myXRSession->RecommendedViewport().x() + "x" + myXRSession->RecommendedViewport().y() + + "@" + (int )Round (myXRSession->DisplayFrequency()) + + " [FOVy: " + (int )Round (myXRSession->FieldOfView()) + "]"; + + theDict.ChangeFromIndex (theDict.Add ("VRvendor", aVendor)) = aVendor; + theDict.ChangeFromIndex (theDict.Add ("VRdevice", aDevice)) = aDevice; + theDict.ChangeFromIndex (theDict.Add ("VRtracker", aTracker)) = aTracker; + theDict.ChangeFromIndex (theDict.Add ("VRdisplay", aDisplay)) = aDisplay; + theDict.ChangeFromIndex (theDict.Add ("VRserial", aSerial)) = aSerial; + } +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_CView::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Graphic3d_DataStructureManager); + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myId) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myRenderParams) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBgColor) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myStructureManager) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myCamera.get()) + + for (Graphic3d_SequenceOfStructure::Iterator anIter (myStructsToCompute); anIter.More(); anIter.Next()) + { + const Handle(Graphic3d_Structure)& aStructToCompute = anIter.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aStructToCompute.get()) + } + + for (Graphic3d_SequenceOfStructure::Iterator anIter (myStructsComputed); anIter.More(); anIter.Next()) + { + const Handle(Graphic3d_Structure)& aStructComputed = anIter.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aStructComputed.get()) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsInComputedMode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsActive) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsRemoved) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myShadingModel) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myVisualization) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myBackXRCamera.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myBaseXRCamera.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPosedXRCamera.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPosedXRCameraCopy.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUnitFactor) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CView.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CView.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_CView.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_CView.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -45,6 +46,7 @@ #include #include +class Aspect_XRSession; class Graphic3d_CView; class Graphic3d_GraphicDriver; class Graphic3d_Layer; @@ -90,7 +92,7 @@ Standard_Boolean IsRemoved() const { return myIsRemoved; } //! Returns camera object of the view. - virtual const Handle(Graphic3d_Camera)& Camera() const { return myCamera; } + virtual const Handle(Graphic3d_Camera)& Camera() const Standard_OVERRIDE { return myCamera; } //! Sets camera used by the view. virtual void SetCamera (const Handle(Graphic3d_Camera)& theCamera) { myCamera = theCamera; } @@ -193,7 +195,7 @@ //! Transforms the structure in the view. Standard_EXPORT void SetTransform (const Handle(Graphic3d_Structure)& theStructure, - const Handle(Geom_Transformation)& theTrsf); + const Handle(TopLoc_Datum3D)& theTrsf); //! Suppress the highlighting on the structure //! in the view . @@ -362,11 +364,16 @@ //! Sets gradient background fill colors. virtual void SetGradientBackground (const Aspect_GradientBackground& theBackground) = 0; - //! Returns background image texture file path. - virtual TCollection_AsciiString BackgroundImage() = 0; + //! Returns background image texture map. + virtual Handle(Graphic3d_TextureMap) BackgroundImage() = 0; - //! Sets background image texture file path. - virtual void SetBackgroundImage (const TCollection_AsciiString& theFilePath) = 0; + //! Sets image texture or environment cubemap as backround. + //! @param theTextureMap [in] source to set a background; + //! should be either Graphic3d_Texture2D or Graphic3d_CubeMap + //! @param theToUpdatePBREnv [in] defines whether IBL maps will be generated or not + //! (see GeneratePBREnvironment()) + virtual void SetBackgroundImage (const Handle(Graphic3d_TextureMap)& theTextureMap, + Standard_Boolean theToUpdatePBREnv = Standard_True) = 0; //! Returns background image fill style. virtual Aspect_FillMethod BackgroundImageStyle() const = 0; @@ -377,8 +384,18 @@ //! Returns cubemap being setted last time on background. virtual Handle(Graphic3d_CubeMap) BackgroundCubeMap() const = 0; - //! Sets environment cubemap as background. - virtual void SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap) = 0; + //! Generates PBR specular probe and irradiance map + //! in order to provide environment indirect illumination in PBR shading model (Image Based Lighting). + //! The source of environment data is background cubemap. + //! If PBR is unavailable it does nothing. + //! If PBR is available but there is no cubemap being set to background it clears all IBL maps (see 'ClearPBREnvironment'). + virtual void GeneratePBREnvironment() = 0; + + //! Fills PBR specular probe and irradiance map with white color. + //! So that environment indirect illumination will be constant + //! and will be fully controlled by ambient light sources. + //! If PBR is unavailable it does nothing. + virtual void ClearPBREnvironment() = 0; //! Returns environment texture set for the view. virtual Handle(Graphic3d_TextureEnv) TextureEnv() const = 0; @@ -411,8 +428,8 @@ //! The format of returned information (e.g. key-value layout) //! is NOT part of this API and can be changed at any time. //! Thus application should not parse returned information to weed out specific parameters. - virtual void DiagnosticInformation (TColStd_IndexedDataMapOfStringString& theDict, - Graphic3d_DiagnosticInfo theFlags) const = 0; + Standard_EXPORT virtual void DiagnosticInformation (TColStd_IndexedDataMapOfStringString& theDict, + Graphic3d_DiagnosticInfo theFlags) const = 0; //! Returns string with statistic performance info. virtual TCollection_AsciiString StatisticInformation() const = 0; @@ -420,6 +437,84 @@ //! Fills in the dictionary with statistic performance info. virtual void StatisticInformation (TColStd_IndexedDataMapOfStringString& theDict) const = 0; +public: + + //! Return unit scale factor defined as scale factor for m (meters); 1.0 by default. + //! Normally, view definition is unitless, however some operations like VR input requires proper units mapping. + Standard_Real UnitFactor() const { return myUnitFactor; } + + //! Set unit scale factor. + Standard_EXPORT void SetUnitFactor (Standard_Real theFactor); + + //! Return XR session. + const Handle(Aspect_XRSession)& XRSession() const { return myXRSession; } + + //! Set XR session. + void SetXRSession (const Handle(Aspect_XRSession)& theSession) { myXRSession = theSession; } + + //! Return TRUE if there is active XR session. + Standard_EXPORT bool IsActiveXR() const; + + //! Initialize XR session. + Standard_EXPORT virtual bool InitXR(); + + //! Release XR session. + Standard_EXPORT virtual void ReleaseXR(); + + //! Process input. + Standard_EXPORT virtual void ProcessXRInput(); + + //! Compute PosedXRCamera() based on current XR head pose and make it active. + Standard_EXPORT void SetupXRPosedCamera(); + + //! Set current camera back to BaseXRCamera() and copy temporary modifications of PosedXRCamera(). + //! Calls SynchronizeXRPosedToBaseCamera() beforehand. + Standard_EXPORT void UnsetXRPosedCamera(); + + //! Returns transient XR camera position with tracked head orientation applied. + const Handle(Graphic3d_Camera)& PosedXRCamera() const { return myPosedXRCamera; } + + //! Sets transient XR camera position with tracked head orientation applied. + void SetPosedXRCamera (const Handle(Graphic3d_Camera)& theCamera) { myPosedXRCamera = theCamera; } + + //! Returns anchor camera definition (without tracked head orientation). + const Handle(Graphic3d_Camera)& BaseXRCamera() const { return myBaseXRCamera; } + + //! Sets anchor camera definition. + void SetBaseXRCamera (const Handle(Graphic3d_Camera)& theCamera) { myBaseXRCamera = theCamera; } + + //! Convert XR pose to world space. + //! @param theTrsfXR [in] transformation defined in VR local coordinate system, + //! oriented as Y-up, X-right and -Z-forward + //! @return transformation defining orientation of XR pose in world space + gp_Trsf PoseXRToWorld (const gp_Trsf& thePoseXR) const + { + const Handle(Graphic3d_Camera)& anOrigin = myBaseXRCamera; + const gp_Ax3 anAxVr (gp::Origin(), gp::DZ(), gp::DX()); + const gp_Ax3 aCameraCS (anOrigin->Eye().XYZ(), -anOrigin->Direction(), -anOrigin->SideRight()); + gp_Trsf aTrsfCS; + aTrsfCS.SetTransformation (aCameraCS, anAxVr); + return aTrsfCS * thePoseXR; + } + + //! Recomputes PosedXRCamera() based on BaseXRCamera() and head orientation. + Standard_EXPORT void SynchronizeXRBaseToPosedCamera(); + + //! Checks if PosedXRCamera() has been modified since SetupXRPosedCamera() + //! and copies these modifications to BaseXRCamera(). + Standard_EXPORT void SynchronizeXRPosedToBaseCamera(); + + //! Compute camera position based on XR pose. + Standard_EXPORT void ComputeXRPosedCameraFromBase (Graphic3d_Camera& theCam, + const gp_Trsf& theXRTrsf) const; + + //! Update based camera from posed camera by applying reversed transformation. + Standard_EXPORT void ComputeXRBaseCameraFromPosed (const Graphic3d_Camera& theCamPosed, + const gp_Trsf& thePoseTrsf); + + //! Turn XR camera direction using current (head) eye position as anchor. + Standard_EXPORT void TurnViewXRCamera (const gp_Trsf& theTrsfTurn); + public: //! @name obsolete Graduated Trihedron functionality //! Returns data of a graduated trihedron @@ -439,6 +534,9 @@ (void )theMin; (void )theMax; } + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; private: @@ -474,6 +572,13 @@ Graphic3d_TypeOfShadingModel myShadingModel; Graphic3d_TypeOfVisualization myVisualization; + Handle(Aspect_XRSession) myXRSession; + Handle(Graphic3d_Camera) myBackXRCamera; //!< camera projection parameters to restore after closing XR session (FOV, aspect and similar) + Handle(Graphic3d_Camera) myBaseXRCamera; //!< neutral camera orientation defining coordinate system in which head tracking is defined + Handle(Graphic3d_Camera) myPosedXRCamera; //!< transient XR camera orientation with tracked head orientation applied (based on myBaseXRCamera) + Handle(Graphic3d_Camera) myPosedXRCameraCopy; //!< neutral camera orientation copy at the beginning of processing input + Standard_Real myUnitFactor; //!< unit scale factor defined as scale factor for m (meters) + protected: Graphic3d_GraduatedTrihedron myGTrihedronData; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_DataStructureManager.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_DataStructureManager.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_DataStructureManager.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_DataStructureManager.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,7 @@ // for the class #include +#include #include IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_DataStructureManager,Standard_Transient) @@ -32,3 +33,12 @@ //-Constructors Graphic3d_DataStructureManager::Graphic3d_DataStructureManager () { } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_DataStructureManager::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_DataStructureManager.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_DataStructureManager.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_DataStructureManager.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_DataStructureManager.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,6 +21,7 @@ #include +class Graphic3d_Camera; class Graphic3d_DataStructureManager; DEFINE_STANDARD_HANDLE(Graphic3d_DataStructureManager, Standard_Transient) @@ -32,29 +33,18 @@ class Graphic3d_DataStructureManager : public Standard_Transient { -public: - DEFINE_STANDARD_RTTIEXT(Graphic3d_DataStructureManager,Standard_Transient) - protected: - //! Initializes the manager . Standard_EXPORT Graphic3d_DataStructureManager(); + //! Returns camera object of the view. + virtual const Handle(Graphic3d_Camera)& Camera() const = 0; - -private: - - - + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; }; - - - - - - #endif // _Graphic3d_DataStructureManager_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsCounter.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsCounter.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsCounter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsCounter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,9 +17,15 @@ //! Stats counter. enum Graphic3d_FrameStatsCounter { + // overall scene counters Graphic3d_FrameStatsCounter_NbLayers = 0, //!< number of ZLayers - Graphic3d_FrameStatsCounter_NbLayersNotCulled, //!< number of not culled ZLayers Graphic3d_FrameStatsCounter_NbStructs, //!< number of defined OpenGl_Structure + Graphic3d_FrameStatsCounter_EstimatedBytesGeom, //!< estimated GPU memory used for geometry + Graphic3d_FrameStatsCounter_EstimatedBytesFbos, //!< estimated GPU memory used for FBOs + Graphic3d_FrameStatsCounter_EstimatedBytesTextures, //!< estimated GPU memory used for textures + + // rendered counters + Graphic3d_FrameStatsCounter_NbLayersNotCulled, //!< number of not culled ZLayers Graphic3d_FrameStatsCounter_NbStructsNotCulled, //!< number of not culled OpenGl_Structure Graphic3d_FrameStatsCounter_NbGroupsNotCulled, //!< number of not culled OpenGl_Group Graphic3d_FrameStatsCounter_NbElemsNotCulled, //!< number of not culled OpenGl_Element @@ -28,11 +34,32 @@ Graphic3d_FrameStatsCounter_NbElemsPointNotCulled, //!< number of not culled OpenGl_PrimitiveArray drawing points Graphic3d_FrameStatsCounter_NbElemsTextNotCulled, //!< number of not culled OpenGl_Text Graphic3d_FrameStatsCounter_NbTrianglesNotCulled, //!< number of not culled (as structure) triangles + Graphic3d_FrameStatsCounter_NbLinesNotCulled, //!< number of not culled (as structure) line segments Graphic3d_FrameStatsCounter_NbPointsNotCulled, //!< number of not culled (as structure) points - Graphic3d_FrameStatsCounter_EstimatedBytesGeom, //!< estimated GPU memory used for geometry - Graphic3d_FrameStatsCounter_EstimatedBytesFbos, //!< estimated GPU memory used for FBOs - Graphic3d_FrameStatsCounter_EstimatedBytesTextures, //!< estimated GPU memory used for textures + //Graphic3d_FrameStatsCounter_NbGlyphsNotCulled, //!< number glyphs, to be considered in future + + // immediate layer rendered counters + Graphic3d_FrameStatsCounter_NbLayersImmediate, //!< number of ZLayers in immediate layer + Graphic3d_FrameStatsCounter_NbStructsImmediate, //!< number of OpenGl_Structure in immediate layer + Graphic3d_FrameStatsCounter_NbGroupsImmediate, //!< number of OpenGl_Group in immediate layer + Graphic3d_FrameStatsCounter_NbElemsImmediate, //!< number of OpenGl_Element in immediate layer + Graphic3d_FrameStatsCounter_NbElemsFillImmediate, //!< number of OpenGl_PrimitiveArray drawing triangles in immediate layer + Graphic3d_FrameStatsCounter_NbElemsLineImmediate, //!< number of OpenGl_PrimitiveArray drawing lines in immediate layer + Graphic3d_FrameStatsCounter_NbElemsPointImmediate, //!< number of OpenGl_PrimitiveArray drawing points in immediate layer + Graphic3d_FrameStatsCounter_NbElemsTextImmediate, //!< number of OpenGl_Text in immediate layer + Graphic3d_FrameStatsCounter_NbTrianglesImmediate, //!< number of triangles in immediate layer + Graphic3d_FrameStatsCounter_NbLinesImmediate, //!< number of line segments in immediate layer + Graphic3d_FrameStatsCounter_NbPointsImmediate, //!< number of points in immediate layer +}; +enum +{ + Graphic3d_FrameStatsCounter_NB = Graphic3d_FrameStatsCounter_NbPointsImmediate + 1, + Graphic3d_FrameStatsCounter_SCENE_LOWER = Graphic3d_FrameStatsCounter_NbLayers, + Graphic3d_FrameStatsCounter_SCENE_UPPER = Graphic3d_FrameStatsCounter_EstimatedBytesTextures, + Graphic3d_FrameStatsCounter_RENDERED_LOWER = Graphic3d_FrameStatsCounter_NbLayersNotCulled, + Graphic3d_FrameStatsCounter_RENDERED_UPPER = Graphic3d_FrameStatsCounter_NbPointsNotCulled, + Graphic3d_FrameStatsCounter_IMMEDIATE_LOWER = Graphic3d_FrameStatsCounter_NbLayersImmediate, + Graphic3d_FrameStatsCounter_IMMEDIATE_UPPER = Graphic3d_FrameStatsCounter_NbPointsImmediate, }; -enum { Graphic3d_FrameStatsCounter_NB = Graphic3d_FrameStatsCounter_EstimatedBytesTextures + 1 }; #endif // _Graphic3d_FrameStatsCounter_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_FrameStats.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_FrameStats.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_FrameStats.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_FrameStats.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,6 +49,10 @@ else { theStream << theValue; + if (thePostfix == NULL) + { + theStream << " "; + } } if (thePostfix != NULL) { @@ -57,6 +61,23 @@ return theStream; } + //! Format a pair of counters. + static std::ostream& formatCounterPair (std::ostream& theStream, + Standard_Integer theWidth, + const char* thePrefix, + Standard_Size theValue, + Standard_Size theImmValue, + bool theToShowImmediate) + { + formatCounter (theStream, theWidth, thePrefix, theValue, NULL); + if (theToShowImmediate) + { + formatCounter (theStream, 1, "(", theImmValue, ")"); + } + theStream << "\n"; + return theStream; + } + //! Format memory counter. static std::ostream& formatBytes (std::ostream& theStream, Standard_Integer theWidth, @@ -263,11 +284,21 @@ { if ((theFlags & Graphic3d_RenderingParams::PerfCounters_FrameRate) != 0) { - aBuf << "FPS: " << std::setfill(' ') << std::setw (isCompact ? aValWidth : aValWidth + 3) << std::fixed << std::setprecision (1) << aStats.FrameRate() << "\n"; + aBuf << "FPS: " << std::setfill(' ') << std::setw (isCompact ? aValWidth : aValWidth + 3) << std::fixed << std::setprecision (1) << aStats.FrameRate(); + if (aStats.ImmediateFrameRate() > 0.0) + { + aBuf << " (" << std::fixed << std::setprecision (1) << aStats.ImmediateFrameRate() << ")"; + } + aBuf << "\n"; } if ((theFlags & Graphic3d_RenderingParams::PerfCounters_CPU) != 0) { - aBuf << "CPU FPS: " << std::setfill(' ') << std::setw (isCompact ? aValWidth : aValWidth + 3) << std::fixed << std::setprecision (1) << aStats.FrameRateCpu() << "\n"; + aBuf << "CPU FPS: " << std::setfill(' ') << std::setw (isCompact ? aValWidth : aValWidth + 3) << std::fixed << std::setprecision (1) << aStats.FrameRateCpu(); + if (aStats.ImmediateFrameRateCpu() > 0.0) + { + aBuf << " (" << std::fixed << std::setprecision (1) << aStats.ImmediateFrameRateCpu() << ")"; + } + aBuf << "\n"; } } if ((theFlags & Graphic3d_RenderingParams::PerfCounters_Layers) != 0) @@ -302,45 +333,81 @@ formatCounter (aBuf, aValWidth + 3, "Structs: ", aStats[Graphic3d_FrameStatsCounter_NbStructs], "\n"); } } + + const bool hasImmediate = aStats[Graphic3d_FrameStatsCounter_NbLayersImmediate] != 0 || aStats.ImmediateFrameRate() > 0.0; if ((theFlags & Graphic3d_RenderingParams::PerfCounters_Groups) != 0 || (theFlags & Graphic3d_RenderingParams::PerfCounters_GroupArrays) != 0 || (theFlags & Graphic3d_RenderingParams::PerfCounters_Triangles) != 0 + || (theFlags & Graphic3d_RenderingParams::PerfCounters_Lines) != 0 || (theFlags & Graphic3d_RenderingParams::PerfCounters_Points) != 0 || (!myIsLongLineFormat && ((theFlags & Graphic3d_RenderingParams::PerfCounters_Structures) != 0 || (theFlags & Graphic3d_RenderingParams::PerfCounters_Layers) != 0))) { - aBuf << "Rendered\n"; + if (hasImmediate) + { + aBuf << "Rendered (imm.)\n"; + } + else + { + aBuf << "Rendered\n"; + } } if (!myIsLongLineFormat && (theFlags & Graphic3d_RenderingParams::PerfCounters_Layers) != 0) { - formatCounter (aBuf, aValWidth, " Layers: ", aStats[Graphic3d_FrameStatsCounter_NbLayersNotCulled], "\n"); + formatCounterPair (aBuf, aValWidth, " Layers: ", + aStats[Graphic3d_FrameStatsCounter_NbLayersNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbLayersImmediate], hasImmediate); } if (!myIsLongLineFormat && (theFlags & Graphic3d_RenderingParams::PerfCounters_Structures) != 0) { - formatCounter (aBuf, aValWidth, " Structs: ", aStats[Graphic3d_FrameStatsCounter_NbStructsNotCulled], "\n"); + formatCounterPair (aBuf, aValWidth, " Structs: ", + aStats[Graphic3d_FrameStatsCounter_NbStructsNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbStructsImmediate], hasImmediate); } if ((theFlags & Graphic3d_RenderingParams::PerfCounters_Groups) != 0) { - formatCounter (aBuf, aValWidth, " Groups: ", aStats[Graphic3d_FrameStatsCounter_NbGroupsNotCulled], "\n"); + formatCounterPair (aBuf, aValWidth, " Groups: ", + aStats[Graphic3d_FrameStatsCounter_NbGroupsNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbGroupsImmediate], hasImmediate); } if ((theFlags & Graphic3d_RenderingParams::PerfCounters_GroupArrays) != 0) { - formatCounter (aBuf, aValWidth, " Arrays: ", aStats[Graphic3d_FrameStatsCounter_NbElemsNotCulled], "\n"); - formatCounter (aBuf, aValWidth, " [fill]: ", aStats[Graphic3d_FrameStatsCounter_NbElemsFillNotCulled], "\n"); - formatCounter (aBuf, aValWidth, " [line]: ", aStats[Graphic3d_FrameStatsCounter_NbElemsLineNotCulled], "\n"); - formatCounter (aBuf, aValWidth, " [point]: ", aStats[Graphic3d_FrameStatsCounter_NbElemsPointNotCulled], "\n"); - formatCounter (aBuf, aValWidth, " [text]: ", aStats[Graphic3d_FrameStatsCounter_NbElemsTextNotCulled], "\n"); + formatCounterPair (aBuf, aValWidth, " Arrays: ", + aStats[Graphic3d_FrameStatsCounter_NbElemsNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbElemsImmediate], hasImmediate); + formatCounterPair (aBuf, aValWidth, " [fill]: ", + aStats[Graphic3d_FrameStatsCounter_NbElemsFillNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbElemsFillImmediate], hasImmediate); + formatCounterPair (aBuf, aValWidth, " [line]: ", + aStats[Graphic3d_FrameStatsCounter_NbElemsLineNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbElemsLineImmediate], hasImmediate); + formatCounterPair (aBuf, aValWidth, " [point]: ", + aStats[Graphic3d_FrameStatsCounter_NbElemsPointNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbElemsPointImmediate], hasImmediate); + formatCounterPair (aBuf, aValWidth, " [text]: ", + aStats[Graphic3d_FrameStatsCounter_NbElemsTextNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbElemsTextImmediate], hasImmediate); } if ((theFlags & Graphic3d_RenderingParams::PerfCounters_Triangles) != 0) { - formatCounter (aBuf, aValWidth, " Triangles: ", aStats[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled], "\n"); + formatCounterPair (aBuf, aValWidth, " Triangles: ", + aStats[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbTrianglesImmediate], hasImmediate); + } + if ((theFlags & Graphic3d_RenderingParams::PerfCounters_Lines) != 0) + { + formatCounterPair (aBuf, aValWidth, " Lines: ", + aStats[Graphic3d_FrameStatsCounter_NbLinesNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbLinesImmediate], hasImmediate); } if ((theFlags & Graphic3d_RenderingParams::PerfCounters_Points) != 0) { - formatCounter (aBuf, aValWidth, " Points: ", aStats[Graphic3d_FrameStatsCounter_NbPointsNotCulled], "\n"); + formatCounterPair (aBuf, aValWidth, " Points: ", + aStats[Graphic3d_FrameStatsCounter_NbPointsNotCulled], + aStats[Graphic3d_FrameStatsCounter_NbPointsImmediate], hasImmediate); } if ((theFlags & Graphic3d_RenderingParams::PerfCounters_EstimMem) != 0) { @@ -437,6 +504,10 @@ { addInfo (theDict, "Rendered triangles", aStats[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled]); } + if ((theFlags & Graphic3d_RenderingParams::PerfCounters_Lines) != 0) + { + addInfo (theDict, "Rendered lines", aStats[Graphic3d_FrameStatsCounter_NbLinesNotCulled]); + } if ((theFlags & Graphic3d_RenderingParams::PerfCounters_Points) != 0) { addInfo (theDict, "Rendered points", aStats[Graphic3d_FrameStatsCounter_NbPointsNotCulled]); @@ -552,18 +623,33 @@ return; } + const Graphic3d_FrameStatsData& aPrevFrame = myCounters.Value (myLastFrameIndex); if (aTime > gp::Resolution()) { // update FPS myFpsTimer.Stop(); const double aCpuSec = myFpsTimer.UserTimeCPU(); - myCountersTmp[Graphic3d_FrameStatsTimer_ElapsedFrame] = aTime; myCountersTmp[Graphic3d_FrameStatsTimer_CpuFrame] = aCpuSec; - myCountersTmp.ChangeFrameRate() = double(myFpsFrameCount) / aTime; - myCountersTmp.ChangeFrameRateCpu() = aCpuSec > gp::Resolution() - ? double(myFpsFrameCount) / aCpuSec - : -1.0; + + if (theIsImmediateOnly) + { + myCountersTmp.ChangeImmediateFrameRate() = double(myFpsFrameCount) / aTime; + myCountersTmp.ChangeImmediateFrameRateCpu() = aCpuSec > gp::Resolution() + ? double(myFpsFrameCount) / aCpuSec + : -1.0; + myCountersTmp.ChangeFrameRate() = aPrevFrame.FrameRate(); + myCountersTmp.ChangeFrameRateCpu() = aPrevFrame.FrameRateCpu(); + } + else + { + myCountersTmp.ChangeImmediateFrameRate() = -1.0; + myCountersTmp.ChangeImmediateFrameRateCpu() = -1.0; + myCountersTmp.ChangeFrameRate() = double(myFpsFrameCount) / aTime; + myCountersTmp.ChangeFrameRateCpu() = aCpuSec > gp::Resolution() + ? double(myFpsFrameCount) / aCpuSec + : -1.0; + } myCountersTmp.FlushTimers (myFpsFrameCount, true); myCountersMax.FillMax (myCountersTmp); myFpsTimer.Reset(); @@ -585,6 +671,23 @@ { myLastFrameIndex = myCounters.Lower(); } + if (theIsImmediateOnly) + { + // copy rendered counters collected for immediate layers + const Standard_Integer anImmShift = Graphic3d_FrameStatsCounter_IMMEDIATE_LOWER - Graphic3d_FrameStatsCounter_RENDERED_LOWER; + Standard_STATIC_ASSERT((Graphic3d_FrameStatsCounter_RENDERED_UPPER - Graphic3d_FrameStatsCounter_RENDERED_LOWER) == (Graphic3d_FrameStatsCounter_IMMEDIATE_UPPER - Graphic3d_FrameStatsCounter_IMMEDIATE_LOWER)) + for (Standard_Integer aCntIter = Graphic3d_FrameStatsCounter_RENDERED_LOWER; aCntIter <= Graphic3d_FrameStatsCounter_RENDERED_UPPER; ++aCntIter) + { + myCountersTmp.ChangeCounterValue ((Graphic3d_FrameStatsCounter )(aCntIter + anImmShift)) = myCountersTmp.CounterValue ((Graphic3d_FrameStatsCounter )aCntIter); + } + + // copy main rendered counters from previous non-immediate frame + for (Standard_Integer aCntIter = Graphic3d_FrameStatsCounter_RENDERED_LOWER; aCntIter <= Graphic3d_FrameStatsCounter_RENDERED_UPPER; ++aCntIter) + { + myCountersTmp.ChangeCounterValue ((Graphic3d_FrameStatsCounter )aCntIter) = aPrevFrame.CounterValue ((Graphic3d_FrameStatsCounter )aCntIter); + } + myCountersTmp.ChangeCounterValue (Graphic3d_FrameStatsCounter_EstimatedBytesGeom) = aPrevFrame.CounterValue (Graphic3d_FrameStatsCounter_EstimatedBytesGeom); + } myCounters.SetValue (myLastFrameIndex, myCountersTmp); myCountersTmp.Reset(); } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsData.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsData.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,9 @@ // ======================================================================= Graphic3d_FrameStatsData::Graphic3d_FrameStatsData() : myFps (-1.0), - myFpsCpu (-1.0) + myFpsCpu (-1.0), + myFpsImmediate (-1.0), + myFpsCpuImmediate (-1.0) { myCounters .resize (Graphic3d_FrameStatsCounter_NB, 0); myTimers .resize (Graphic3d_FrameStatsTimer_NB, 0.0); @@ -36,6 +38,8 @@ { myFps = theOther.myFps; myFpsCpu = theOther.myFpsCpu; + myFpsImmediate = theOther.myFpsImmediate; + myFpsCpuImmediate = theOther.myFpsCpuImmediate; myCounters = theOther.myCounters; myTimers = theOther.myTimers; myTimersMin = theOther.myTimersMin; @@ -51,6 +55,8 @@ { myFps = -1.0; myFpsCpu = -1.0; + myFpsImmediate = -1.0; + myFpsCpuImmediate = -1.0; myCounters .assign (myCounters.size(), 0); myTimers .assign (myTimers.size(), 0.0); myTimersMin.assign (myTimersMin.size(), RealLast()); @@ -65,6 +71,8 @@ { myFps = Max (myFps, theOther.myFps); myFpsCpu = Max (myFpsCpu, theOther.myFpsCpu); + myFpsImmediate = Max (myFpsImmediate, theOther.myFpsImmediate); + myFpsCpuImmediate = Max (myFpsCpuImmediate, theOther.myFpsCpuImmediate); for (size_t aCounterIter = 0; aCounterIter < myCounters.size(); ++aCounterIter) { myCounters[aCounterIter] = myCounters[aCounterIter] > theOther.myCounters[aCounterIter] ? myCounters[aCounterIter] : theOther.myCounters[aCounterIter]; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsData.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsData.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_FrameStatsData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,6 +40,12 @@ //! while values around actual frame rate indicate rendering being limited by CPU performance (GPU is stalled in-between). Standard_Real FrameRateCpu() const { return myFpsCpu; } + //! Returns FPS for immediate redraws. + Standard_Real ImmediateFrameRate() const { return myFpsImmediate; } + + //! Returns CPU FPS for immediate redraws. + Standard_Real ImmediateFrameRateCpu() const { return myFpsCpuImmediate; } + //! Get counter value. Standard_Size CounterValue (Graphic3d_FrameStatsCounter theIndex) const { return myCounters[theIndex]; } @@ -71,6 +77,8 @@ std::vector myTimersMax; //!< maximum values of timers Standard_Real myFps; //!< FPS meter (frames per seconds, elapsed time) Standard_Real myFpsCpu; //!< CPU FPS meter (frames per seconds, CPU time) + Standard_Real myFpsImmediate; //!< FPS meter for immediate redraws + Standard_Real myFpsCpuImmediate; //!< CPU FPS meter for immediate redraws }; //! Temporary data frame definition. @@ -95,6 +103,12 @@ //! Returns CPU FPS (frames per seconds, CPU time). Standard_Real& ChangeFrameRateCpu() { return myFpsCpu; } + //! Returns FPS for immediate redraws. + Standard_Real& ChangeImmediateFrameRate() { return myFpsImmediate; } + + //! Returns CPU FPS for immediate redraws. + Standard_Real& ChangeImmediateFrameRateCpu() { return myFpsCpuImmediate; } + //! Return a timer object for time measurements. OSD_Timer& ChangeTimer (Graphic3d_FrameStatsTimer theTimer) { return myOsdTimers[theTimer]; } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_GraphicDriver.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_GraphicDriver.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_GraphicDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_GraphicDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -281,3 +281,20 @@ "Graphic3d_GraphicDriver::SetZLayerSettings, Layer with theLayerId does not exist"); aLayerDef->SetLayerSettings (theSettings); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_GraphicDriver::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myStructGenId) + + for (NCollection_List::Iterator anIter (myLayers); anIter.More(); anIter.Next()) + { + const Handle(Graphic3d_Layer)& aLayer = anIter.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aLayer.get()) + } +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_GraphicDriver.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_GraphicDriver.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_GraphicDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_GraphicDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -155,6 +155,9 @@ //! Frees the identifier of a structure. Standard_EXPORT void RemoveIdentification(const Standard_Integer theId); + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Group.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Group.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Group.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Group.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -452,10 +452,15 @@ // function : DumpJson // purpose : // ======================================================================= -void Graphic3d_Group::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const +void Graphic3d_Group::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Graphic3d_Group); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsClosed); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myContainsFacet); + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, this) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myStructure) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBounds) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsClosed) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myContainsFacet) } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Group.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Group.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Group.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Group.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -277,7 +277,7 @@ //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_HatchStyle.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_HatchStyle.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_HatchStyle.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_HatchStyle.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -516,3 +516,15 @@ ? (const Standard_Byte*)myPredefinedPatterns[myHatchType] : NULL); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_HatchStyle::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPattern.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHatchType) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_HatchStyle.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_HatchStyle.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_HatchStyle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_HatchStyle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,6 +49,9 @@ return myHatchType; } + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + private: Handle(NCollection_Buffer) myPattern; //!< Image bitmap with custom hatch pattern diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_IndexBuffer.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_IndexBuffer.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_IndexBuffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_IndexBuffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -77,6 +77,12 @@ } } + //! Dumps the content of me into the stream + virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE + { + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Graphic3d_Buffer) + } }; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Layer.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Layer.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Layer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Layer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -452,6 +452,19 @@ } } +namespace +{ + //! This structure describes the node in BVH + struct NodeInStack + { + NodeInStack (Standard_Integer theId = 0, + Standard_Boolean theIsFullInside = false) : Id (theId), IsFullInside (theIsFullInside) {} + + Standard_Integer Id; //!< node identifier + Standard_Boolean IsFullInside; //!< if the node is completely inside + }; +} + // ======================================================================= // function : UpdateCulling // purpose : @@ -517,33 +530,54 @@ aBVHTree = myBVHPrimitives.BVH(); } - if (theSelector.IsCulled (aCullCtx, aBVHTree->MinPoint (0), aBVHTree->MaxPoint (0))) + const bool toCheckFullInside = true; + NodeInStack aNode (0, toCheckFullInside); // a root node + if (theSelector.IsCulled (aCullCtx, aBVHTree->MinPoint (0), aBVHTree->MaxPoint (0), toCheckFullInside ? &aNode.IsFullInside : NULL)) { continue; } - Standard_Integer aStack[BVH_Constants_MaxTreeDepth]; + NodeInStack aStack[BVH_Constants_MaxTreeDepth]; Standard_Integer aHead = -1; - Standard_Integer aNode = 0; // a root node for (;;) { - if (!aBVHTree->IsOuter (aNode)) + if (!aBVHTree->IsOuter (aNode.Id)) { - const Standard_Integer aLeftChildIdx = aBVHTree->Child<0> (aNode); - const Standard_Integer aRightChildIdx = aBVHTree->Child<1> (aNode); - const Standard_Boolean isLeftChildIn = !theSelector.IsCulled (aCullCtx, aBVHTree->MinPoint (aLeftChildIdx), aBVHTree->MaxPoint (aLeftChildIdx)); - const Standard_Boolean isRightChildIn = !theSelector.IsCulled (aCullCtx, aBVHTree->MinPoint (aRightChildIdx), aBVHTree->MaxPoint (aRightChildIdx)); + NodeInStack aLeft (aBVHTree->Child<0> (aNode.Id), toCheckFullInside); + NodeInStack aRight(aBVHTree->Child<1> (aNode.Id), toCheckFullInside); + bool isLeftChildIn = true, isRightChildIn = true; + if (aNode.IsFullInside) + { + // small size should be always checked + isLeftChildIn = !theSelector.IsTooSmall (aCullCtx, aBVHTree->MinPoint (aLeft.Id), aBVHTree->MaxPoint (aLeft.Id)); + isRightChildIn = !theSelector.IsTooSmall (aCullCtx, aBVHTree->MinPoint (aRight.Id), aBVHTree->MaxPoint (aRight.Id)); + } + else + { + isLeftChildIn = !theSelector.IsCulled (aCullCtx, aBVHTree->MinPoint (aLeft.Id), aBVHTree->MaxPoint (aLeft.Id), toCheckFullInside ? &aLeft.IsFullInside : NULL); + if (!isLeftChildIn) + { + aLeft.IsFullInside = false; + } + + isRightChildIn = !theSelector.IsCulled (aCullCtx, aBVHTree->MinPoint (aRight.Id), aBVHTree->MaxPoint (aRight.Id), toCheckFullInside ? &aRight.IsFullInside : NULL); + if (!isRightChildIn) + { + aRight.IsFullInside = false; + } + } + if (isLeftChildIn && isRightChildIn) { - aNode = myBVHIsLeftChildQueuedFirst ? aLeftChildIdx : aRightChildIdx; - aStack[++aHead] = myBVHIsLeftChildQueuedFirst ? aRightChildIdx : aLeftChildIdx; + aNode = myBVHIsLeftChildQueuedFirst ? aLeft : aRight; + aStack[++aHead] = myBVHIsLeftChildQueuedFirst ? aRight : aLeft; myBVHIsLeftChildQueuedFirst = !myBVHIsLeftChildQueuedFirst; } else if (isLeftChildIn || isRightChildIn) { - aNode = isLeftChildIn ? aLeftChildIdx : aRightChildIdx; + aNode = isLeftChildIn ? aLeft : aRight; } else { @@ -557,14 +591,18 @@ } else { - Standard_Integer aIdx = aBVHTree->BegPrimitive (aNode); - const Graphic3d_CStructure* aStruct = isTrsfPers - ? myBVHPrimitivesTrsfPers.GetStructureById (aIdx) - : myBVHPrimitives.GetStructureById (aIdx); - if (aStruct->IsVisible (theViewId)) + const Standard_Integer aStartIdx = aBVHTree->BegPrimitive (aNode.Id); + const Standard_Integer anEndIdx = aBVHTree->EndPrimitive (aNode.Id); + for (Standard_Integer anIdx = aStartIdx; anIdx <= anEndIdx; ++anIdx) { - aStruct->MarkAsNotCulled(); - ++myNbStructuresNotCulled; + const Graphic3d_CStructure* aStruct = isTrsfPers + ? myBVHPrimitivesTrsfPers.GetStructureById (anIdx) + : myBVHPrimitives.GetStructureById (anIdx); + if (aStruct->IsVisible (theViewId)) + { + aStruct->MarkAsNotCulled(); + ++myNbStructuresNotCulled; + } } if (aHead < 0) { @@ -626,3 +664,38 @@ } } } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_Layer::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, this) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLayerId) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNbStructures) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNbStructuresNotCulled) + + const Standard_Integer aNbPriorities = myArray.Length(); + for (Standard_Integer aPriorityIter = 0; aPriorityIter < aNbPriorities; ++aPriorityIter) + { + const Graphic3d_IndexedMapOfStructure& aStructures = myArray (aPriorityIter); + for (Graphic3d_IndexedMapOfStructure::Iterator aStructIter (aStructures); aStructIter.More(); aStructIter.Next()) + { + const Graphic3d_CStructure* aStructure = aStructIter.Value(); + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, aStructure) + } + } + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myLayerSettings) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBVHIsLeftChildQueuedFirst) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsBVHPrimitivesNeedsReset) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsBoundingBoxNeedsReset[0]) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsBoundingBoxNeedsReset[1]) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBoundingBox[0]) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBoundingBox[1]) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Layer.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Layer.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Layer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Layer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -144,6 +144,9 @@ //! Returns indexed map of always rendered structures. const NCollection_IndexedMap& NonCullableStructures() const { return myAlwaysRenderedMap; } + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: //! Updates BVH trees if their state has been invalidated. diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_MaterialAspect.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_MaterialAspect.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_MaterialAspect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_MaterialAspect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ { const char* StringName; Graphic3d_BSDF BSDF; + Graphic3d_PBRMaterial PBRMaterial; Quantity_Color Colors[Graphic3d_TypeOfReflection_NB]; Standard_ShortReal TransparencyCoef; Standard_ShortReal RefractionIndex; @@ -41,32 +42,32 @@ //! Name list of standard materials (defined within enumeration). static const RawMaterial THE_MATERIALS[] = { - RawMaterial (Graphic3d_NOM_BRASS, "Brass"), - RawMaterial (Graphic3d_NOM_BRONZE, "Bronze"), - RawMaterial (Graphic3d_NOM_COPPER, "Copper"), - RawMaterial (Graphic3d_NOM_GOLD, "Gold"), - RawMaterial (Graphic3d_NOM_PEWTER, "Pewter"), - RawMaterial (Graphic3d_NOM_PLASTER, "Plastered"), - RawMaterial (Graphic3d_NOM_PLASTIC, "Plastified"), - RawMaterial (Graphic3d_NOM_SILVER, "Silver"), - RawMaterial (Graphic3d_NOM_STEEL, "Steel"), - RawMaterial (Graphic3d_NOM_STONE, "Stone"), - RawMaterial (Graphic3d_NOM_SHINY_PLASTIC, "Shiny_plastified"), - RawMaterial (Graphic3d_NOM_SATIN, "Satined"), - RawMaterial (Graphic3d_NOM_METALIZED, "Metalized"), - RawMaterial (Graphic3d_NOM_NEON_GNC, "Ionized"), - RawMaterial (Graphic3d_NOM_CHROME, "Chrome"), - RawMaterial (Graphic3d_NOM_ALUMINIUM, "Aluminium"), - RawMaterial (Graphic3d_NOM_OBSIDIAN, "Obsidian"), - RawMaterial (Graphic3d_NOM_NEON_PHC, "Neon"), - RawMaterial (Graphic3d_NOM_JADE, "Jade"), - RawMaterial (Graphic3d_NOM_CHARCOAL, "Charcoal"), - RawMaterial (Graphic3d_NOM_WATER, "Water"), - RawMaterial (Graphic3d_NOM_GLASS, "Glass"), - RawMaterial (Graphic3d_NOM_DIAMOND, "Diamond"), - RawMaterial (Graphic3d_NOM_TRANSPARENT, "Transparent"), - RawMaterial (Graphic3d_NOM_DEFAULT, "Default"), - RawMaterial (Graphic3d_NOM_UserDefined, "UserDefined") + RawMaterial (Graphic3d_NameOfMaterial_Brass, "Brass"), + RawMaterial (Graphic3d_NameOfMaterial_Bronze, "Bronze"), + RawMaterial (Graphic3d_NameOfMaterial_Copper, "Copper"), + RawMaterial (Graphic3d_NameOfMaterial_Gold, "Gold"), + RawMaterial (Graphic3d_NameOfMaterial_Pewter, "Pewter"), + RawMaterial (Graphic3d_NameOfMaterial_Plastered, "Plastered"), + RawMaterial (Graphic3d_NameOfMaterial_Plastified, "Plastified"), + RawMaterial (Graphic3d_NameOfMaterial_Silver, "Silver"), + RawMaterial (Graphic3d_NameOfMaterial_Steel, "Steel"), + RawMaterial (Graphic3d_NameOfMaterial_Stone, "Stone"), + RawMaterial (Graphic3d_NameOfMaterial_ShinyPlastified, "Shiny_plastified"), + RawMaterial (Graphic3d_NameOfMaterial_Satin, "Satined"), + RawMaterial (Graphic3d_NameOfMaterial_Metalized, "Metalized"), + RawMaterial (Graphic3d_NameOfMaterial_Ionized, "Ionized"), + RawMaterial (Graphic3d_NameOfMaterial_Chrome, "Chrome"), + RawMaterial (Graphic3d_NameOfMaterial_Aluminum, "Aluminium"), + RawMaterial (Graphic3d_NameOfMaterial_Obsidian, "Obsidian"), + RawMaterial (Graphic3d_NameOfMaterial_Neon, "Neon"), + RawMaterial (Graphic3d_NameOfMaterial_Jade, "Jade"), + RawMaterial (Graphic3d_NameOfMaterial_Charcoal, "Charcoal"), + RawMaterial (Graphic3d_NameOfMaterial_Water, "Water"), + RawMaterial (Graphic3d_NameOfMaterial_Glass, "Glass"), + RawMaterial (Graphic3d_NameOfMaterial_Diamond, "Diamond"), + RawMaterial (Graphic3d_NameOfMaterial_Transparent, "Transparent"), + RawMaterial (Graphic3d_NameOfMaterial_DEFAULT, "Default"), + RawMaterial (Graphic3d_NameOfMaterial_UserDefined, "UserDefined") }; } @@ -87,24 +88,25 @@ { switch (theName) { - case Graphic3d_NOM_PLASTIC: + case Graphic3d_NameOfMaterial_Plastified: MaterialType = Graphic3d_MATERIAL_ASPECT; Shininess = 0.0078125f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.50f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.25f)); Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.24f)); - Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.06f)); + Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.004896f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); BSDF.Kd = Graphic3d_Vec3 (0.2f); BSDF.Ks = Graphic3d_Vec4 (0.00784314f, 0.00784314f, 0.00784314f, 0.25f); BSDF.Normalize(); + break; - case Graphic3d_NOM_SHINY_PLASTIC: + case Graphic3d_NameOfMaterial_ShinyPlastified: MaterialType = Graphic3d_MATERIAL_ASPECT; Shininess = 1.00f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.44f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.22f)); Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.50f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (1.0f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); @@ -113,25 +115,26 @@ BSDF.Ks = Graphic3d_Vec4 (0.145f, 0.145f, 0.145f, 0.17f); BSDF.Normalize(); break; - case Graphic3d_NOM_SATIN: + case Graphic3d_NameOfMaterial_Satin: MaterialType = Graphic3d_MATERIAL_ASPECT; Shininess = 0.09375f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.33f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.165f)); Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.40f)); - Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.44f)); + Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.162647f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); BSDF.Kd = Graphic3d_Vec3 (0.2f); BSDF.Ks = Graphic3d_Vec4 (0.6f); + break; - case Graphic3d_NOM_NEON_GNC: + case Graphic3d_NameOfMaterial_Ionized: MaterialType = Graphic3d_MATERIAL_ASPECT; Shininess = 0.05f; Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.0f)); Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (1.0f)); - Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.62f)); + Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.342392f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (1.0f)); BSDF.Kd = Graphic3d_Vec3 (0.0f); @@ -139,114 +142,115 @@ BSDF.Le = static_cast (Colors[Graphic3d_TOR_DIFFUSE]); BSDF.FresnelBase = Graphic3d_Fresnel::CreateDielectric (1.5f); break; - case Graphic3d_NOM_METALIZED: + case Graphic3d_NameOfMaterial_Metalized: MaterialType = Graphic3d_MATERIAL_ASPECT; Shininess = 0.13f; Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.0f)); Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.47f)); - Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.45f)); + Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.170645f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f), Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.2f)), 0.045f); break; - case Graphic3d_NOM_BRASS: + case Graphic3d_NameOfMaterial_Brass: MaterialType = Graphic3d_MATERIAL_PHYSIC; BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f), Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.58f, 0.42f, 0.20f)), 0.045f); Shininess = 0.65f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.329f, 0.224f, 0.027f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.780f, 0.569f, 0.114f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.088428f, 0.041081f, 0.002090f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.570482f, 0.283555f, 0.012335f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.992f, 0.941f, 0.808f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_BRONZE: + case Graphic3d_NameOfMaterial_Bronze: MaterialType = Graphic3d_MATERIAL_PHYSIC; BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f), Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.65f, 0.35f, 0.15f)), 0.045f); Shininess = 0.65f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.213f, 0.128f, 0.054f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.714f, 0.428f, 0.181f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.037301f, 0.014931f, 0.004305f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.468185f, 0.153344f, 0.027491f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.590f, 0.408f, 0.250f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_COPPER: + case Graphic3d_NameOfMaterial_Copper: MaterialType = Graphic3d_MATERIAL_PHYSIC; BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f), Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.955008f, 0.637427f, 0.538163f)), 0.045f); Shininess = 0.65f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.191f, 0.074f, 0.023f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.604f, 0.270f, 0.083f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.030370f, 0.006451f, 0.001780f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.323236f, 0.059254f, 0.007584f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.950f, 0.640f, 0.540f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_GOLD: + case Graphic3d_NameOfMaterial_Gold: MaterialType = Graphic3d_MATERIAL_PHYSIC; BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f), Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (1.000000f, 0.765557f, 0.336057f)), 0.045f); Shininess = 0.80f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.300f, 0.230f, 0.095f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.752f, 0.580f, 0.100f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.073239f, 0.043234f, 0.009264f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.525643f, 0.295700f, 0.010023f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (1.000f, 0.710f, 0.290f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_PEWTER: + case Graphic3d_NameOfMaterial_Pewter: MaterialType = Graphic3d_MATERIAL_PHYSIC; BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f), Graphic3d_Fresnel::CreateConductor (1.8800f, 3.4900f), 0.045f); Shininess = 0.50f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.106f, 0.059f, 0.114f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.427f, 0.471f, 0.541f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.010979f, 0.004795f, 0.012335f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.152583f, 0.188174f, 0.253972f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.333f, 0.333f, 0.522f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_PLASTER: + case Graphic3d_NameOfMaterial_Plastered: MaterialType = Graphic3d_MATERIAL_ASPECT; Shininess = 0.01f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.26f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.13f)); Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.75f)); - Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.05f)); + Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.003936f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); BSDF.Kd = Graphic3d_Vec3 (0.482353f, 0.482353f, 0.482353f); + break; - case Graphic3d_NOM_SILVER: + case Graphic3d_NameOfMaterial_Silver: MaterialType = Graphic3d_MATERIAL_PHYSIC; BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f), Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.971519f, 0.959915f, 0.915324f)), 0.045f); Shininess = 0.75f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.275f, 0.275f, 0.250f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.630f, 0.630f, 0.630f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.061465f, 0.061465f, 0.050876f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.354692f, 0.354692f, 0.354692f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.950f, 0.930f, 0.880f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_STEEL: + case Graphic3d_NameOfMaterial_Steel: MaterialType = Graphic3d_MATERIAL_PHYSIC; BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f), Graphic3d_Fresnel::CreateConductor (Graphic3d_Vec3 (2.90f, 2.80f, 2.53f), Graphic3d_Vec3 (3.08f, 2.90f, 2.74f)), 0.045f); Shininess = 0.90f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.150f, 0.150f, 0.180f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.500f, 0.510f, 0.520f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.019607f, 0.019607f, 0.027212f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.214041f, 0.223414f, 0.233022f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.560f, 0.570f, 0.580f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_STONE: + case Graphic3d_NameOfMaterial_Stone: MaterialType = Graphic3d_MATERIAL_PHYSIC; // special case for SetColor() @@ -254,70 +258,71 @@ DiffuseCoef = 0.75f; Shininess = 0.17f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (1.00f, 0.8f, 0.62f) * 0.19f); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (1.00f, 0.8f, 0.62f) * 0.75f); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.030074f, 0.020069f, 0.013011f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.522522f, 0.318547f, 0.183064f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.98f, 1.0f, 0.60f) * 0.08f); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); BSDF.Kd = Graphic3d_Vec3 (0.243137f, 0.243137f, 0.243137f); BSDF.Ks = Graphic3d_Vec4 (0.00392157f, 0.00392157f, 0.00392157f, 0.5f); + break; - case Graphic3d_NOM_CHROME: + case Graphic3d_NameOfMaterial_Chrome: MaterialType = Graphic3d_MATERIAL_PHYSIC; BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f), Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.549585f, 0.556114f, 0.554256f)), 0.045f); Shininess = 0.90f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.200f, 0.200f, 0.225f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.550f, 0.550f, 0.550f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.033105f, 0.033105f, 0.041436f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.263273f, 0.263273f, 0.263273f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.975f, 0.975f, 0.975f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_ALUMINIUM: + case Graphic3d_NameOfMaterial_Aluminum: MaterialType = Graphic3d_MATERIAL_PHYSIC; BSDF = Graphic3d_BSDF::CreateMetallic (Graphic3d_Vec3 (0.985f, 0.985f, 0.985f), Graphic3d_Fresnel::CreateSchlick (Graphic3d_Vec3 (0.913183f, 0.921494f, 0.924524f)), 0.045f); Shininess = 0.75f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.300f, 0.300f, 0.300f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.600f, 0.600f, 0.600f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.073239f, 0.073239f, 0.073239f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.318547f, 0.318547f, 0.318547f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.910f, 0.920f, 0.920f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_NEON_PHC: + case Graphic3d_NameOfMaterial_Neon: MaterialType = Graphic3d_MATERIAL_PHYSIC; Shininess = 0.05f; Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.0f)); Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.0f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.62f)); - Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f, 0.90f, 0.414f)); + Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f, 0.787412f, 0.142892f)); BSDF.Kd = Graphic3d_Vec3 (0.0f); BSDF.Ks = Graphic3d_Vec4 (0.5f, 0.5f, 0.5f, 0.f); BSDF.Le = Graphic3d_Vec3 (0.0f, 1.0f, 0.46f); BSDF.FresnelBase = Graphic3d_Fresnel::CreateDielectric (1.5f); break; - case Graphic3d_NOM_OBSIDIAN: + case Graphic3d_NameOfMaterial_Obsidian: MaterialType = Graphic3d_MATERIAL_PHYSIC; Shininess = 0.3f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.054f, 0.050f, 0.066f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.183f, 0.170f, 0.225f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.004305f, 0.003936f, 0.005532f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.028053f, 0.024515f, 0.041436f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.333f, 0.329f, 0.346f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); BSDF.Kd = Graphic3d_Vec3 (0.023f, 0.f, 0.023f); BSDF.Ks = Graphic3d_Vec4 (0.0156863f, 0.0156863f, 0.0156863f, 0.1f); break; - case Graphic3d_NOM_JADE: + case Graphic3d_NameOfMaterial_Jade: MaterialType = Graphic3d_MATERIAL_PHYSIC; Shininess = 0.10f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.135f, 0.223f, 0.158f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.540f, 0.890f, 0.630f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.016338f, 0.040729f, 0.021493f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.252950f, 0.767769f, 0.354692f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.316f, 0.316f, 0.316f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); @@ -325,19 +330,19 @@ BSDF.Kd = Graphic3d_Vec3 (0.208658f, 0.415686f, 0.218401f); BSDF.Ks = Graphic3d_Vec4 (0.611765f, 0.611765f, 0.611765f, 0.06f); break; - case Graphic3d_NOM_CHARCOAL: + case Graphic3d_NameOfMaterial_Charcoal: MaterialType = Graphic3d_MATERIAL_PHYSIC; Shininess = 0.01f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.050f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.150f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.003936f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.019607f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.0f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); BSDF.Kd = Graphic3d_Vec3 (0.02f, 0.02f, 0.02f); BSDF.Ks = Graphic3d_Vec4 (0.1f, 0.1f, 0.1f, 0.3f); break; - case Graphic3d_NOM_WATER: + case Graphic3d_NameOfMaterial_Water: MaterialType = Graphic3d_MATERIAL_PHYSIC; RefractionIndex = 1.33f; @@ -348,12 +353,12 @@ TransparencyCoef = 0.80f; Shininess = 0.90f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.450f, 0.450f, 0.475f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.050f, 0.050f, 0.075f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.170645f, 0.170645f, 0.191627f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.003936f, 0.003936f, 0.006571f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.380f, 0.380f, 0.380f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_GLASS: + case Graphic3d_NameOfMaterial_Glass: MaterialType = Graphic3d_MATERIAL_PHYSIC; RefractionIndex = 1.62f; @@ -364,12 +369,12 @@ TransparencyCoef = 0.80f; Shininess = 0.50f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.550f, 0.575f, 0.575f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.050f, 0.075f, 0.075f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.263273f, 0.290143f, 0.290143f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.003936f, 0.006571f, 0.006571f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.920f, 0.920f, 0.920f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_DIAMOND: + case Graphic3d_NameOfMaterial_Diamond: MaterialType = Graphic3d_MATERIAL_PHYSIC; RefractionIndex = 2.42f; @@ -380,13 +385,13 @@ TransparencyCoef = 0.80f; Shininess = 0.90f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.550f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.100f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.263273f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.010023f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.970f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_TRANSPARENT: + case Graphic3d_NameOfMaterial_Transparent: MaterialType = Graphic3d_MATERIAL_PHYSIC; RefractionIndex = 1.0f; @@ -397,27 +402,28 @@ TransparencyCoef = 0.80f; Shininess = 0.90f; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.550f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.100f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.263273f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.010023f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.970f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_UserDefined: + case Graphic3d_NameOfMaterial_UserDefined: MaterialType = Graphic3d_MATERIAL_PHYSIC; Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.1f)); - Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.8f)); + Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.6f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.2f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; - case Graphic3d_NOM_DEFAULT: + case Graphic3d_NameOfMaterial_DEFAULT: MaterialType = Graphic3d_MATERIAL_ASPECT; - Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.30f)); + Colors[Graphic3d_TOR_AMBIENT] = Quantity_Color (Graphic3d_Vec3 (0.15f)); Colors[Graphic3d_TOR_DIFFUSE] = Quantity_Color (Graphic3d_Vec3 (0.65f)); Colors[Graphic3d_TOR_SPECULAR] = Quantity_Color (Graphic3d_Vec3 (0.0f)); Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; } + PBRMaterial.SetBSDF (BSDF); } // ======================================================================= @@ -425,9 +431,9 @@ // purpose : // ======================================================================= Graphic3d_MaterialAspect::Graphic3d_MaterialAspect() -: myRequestedMaterialName (Graphic3d_NOM_DEFAULT) +: myRequestedMaterialName (Graphic3d_NameOfMaterial_DEFAULT) { - init (Graphic3d_NOM_DEFAULT); + init (Graphic3d_NameOfMaterial_DEFAULT); } // ======================================================================= @@ -447,8 +453,9 @@ void Graphic3d_MaterialAspect::init (const Graphic3d_NameOfMaterial theName) { const RawMaterial& aMat = THE_MATERIALS[theName]; - myBSDF = aMat.BSDF; - myStringName = aMat.StringName; + myBSDF = aMat.BSDF; + myPBRMaterial = aMat.PBRMaterial; + myStringName = aMat.StringName; myColors[Graphic3d_TOR_AMBIENT] = aMat.Colors[Graphic3d_TOR_AMBIENT]; myColors[Graphic3d_TOR_DIFFUSE] = aMat.Colors[Graphic3d_TOR_DIFFUSE]; myColors[Graphic3d_TOR_SPECULAR] = aMat.Colors[Graphic3d_TOR_SPECULAR]; @@ -499,10 +506,12 @@ return; } + myPBRMaterial.SetColor (theColor); + const RawMaterial& aSrcMat = THE_MATERIALS[myRequestedMaterialName]; const Quantity_Color anAmbient((Graphic3d_Vec3 )theColor * aSrcMat.AmbientCoef); const Quantity_Color aDiffuse ((Graphic3d_Vec3 )theColor * aSrcMat.DiffuseCoef); - if (myMaterialName != Graphic3d_NOM_UserDefined + if (myMaterialName != Graphic3d_NameOfMaterial_UserDefined && (!myColors[Graphic3d_TOR_AMBIENT].IsEqual (anAmbient) || !myColors[Graphic3d_TOR_DIFFUSE].IsEqual (aDiffuse))) { @@ -519,7 +528,7 @@ void Graphic3d_MaterialAspect::SetAmbientColor (const Quantity_Color& theColor) { if (myMaterialType == Graphic3d_MATERIAL_PHYSIC - && myMaterialName != Graphic3d_NOM_UserDefined + && myMaterialName != Graphic3d_NameOfMaterial_UserDefined && !myColors[Graphic3d_TOR_AMBIENT].IsEqual (theColor)) { setUserMaterial(); @@ -534,7 +543,7 @@ void Graphic3d_MaterialAspect::SetDiffuseColor (const Quantity_Color& theColor) { if (myMaterialType == Graphic3d_MATERIAL_PHYSIC - && myMaterialName != Graphic3d_NOM_UserDefined + && myMaterialName != Graphic3d_NameOfMaterial_UserDefined && !myColors[Graphic3d_TOR_DIFFUSE].IsEqual (theColor)) { setUserMaterial(); @@ -549,7 +558,7 @@ void Graphic3d_MaterialAspect::SetSpecularColor (const Quantity_Color& theColor) { if (myMaterialType == Graphic3d_MATERIAL_PHYSIC - && myMaterialName != Graphic3d_NOM_UserDefined + && myMaterialName != Graphic3d_NameOfMaterial_UserDefined && !myColors[Graphic3d_TOR_SPECULAR].IsEqual (theColor)) { setUserMaterial(); @@ -564,7 +573,7 @@ void Graphic3d_MaterialAspect::SetEmissiveColor (const Quantity_Color& theColor) { if (myMaterialType == Graphic3d_MATERIAL_PHYSIC - && myMaterialName != Graphic3d_NOM_UserDefined + && myMaterialName != Graphic3d_NameOfMaterial_UserDefined && !myColors[Graphic3d_TOR_EMISSION].IsEqual (theColor)) { setUserMaterial(); @@ -585,6 +594,7 @@ } myTransparencyCoef = theValue; + myPBRMaterial.SetAlpha (1.0f - theValue); } // ======================================================================= @@ -658,32 +668,32 @@ // parse aliases if (aName == "Plastic") // Plastified { - theMat = Graphic3d_NOM_PLASTIC; + theMat = Graphic3d_NameOfMaterial_Plastified; return Standard_True; } else if (aName == "Shiny_plastic") // Shiny_plastified { - theMat = Graphic3d_NOM_SHINY_PLASTIC; + theMat = Graphic3d_NameOfMaterial_ShinyPlastified; return Standard_True; } else if (aName == "Plaster") // Plastered { - theMat = Graphic3d_NOM_PLASTER; + theMat = Graphic3d_NameOfMaterial_Plastered; return Standard_True; } else if (aName == "Satin") // Satined { - theMat = Graphic3d_NOM_SATIN; + theMat = Graphic3d_NameOfMaterial_Satin; return Standard_True; } else if (aName == "Neon_gnc") // Ionized { - theMat = Graphic3d_NOM_NEON_GNC; + theMat = Graphic3d_NameOfMaterial_Ionized; return Standard_True; } else if (aName == "Neon_phc") // Neon { - theMat = Graphic3d_NOM_NEON_PHC; + theMat = Graphic3d_NameOfMaterial_Neon; return Standard_True; } return Standard_False; @@ -702,3 +712,29 @@ const RawMaterial& aMat = THE_MATERIALS[theRank - 1]; return aMat.MaterialType; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_MaterialAspect::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, Graphic3d_MaterialAspect) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBSDF) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPBRMaterial) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myStringName) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColors[Graphic3d_TOR_AMBIENT]) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColors[Graphic3d_TOR_DIFFUSE]) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColors[Graphic3d_TOR_SPECULAR]) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColors[Graphic3d_TOR_EMISSION]) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTransparencyCoef) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRefractionIndex) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myShininess) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaterialType) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaterialName) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRequestedMaterialName) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_MaterialAspect.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_MaterialAspect.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_MaterialAspect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_MaterialAspect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #define _Graphic3d_MaterialAspect_HeaderFile #include +#include #include #include #include @@ -34,7 +35,7 @@ DEFINE_STANDARD_ALLOC //! Returns the number of predefined textures. - static Standard_Integer NumberOfMaterials() { return Graphic3d_NOM_DEFAULT; } + static Standard_Integer NumberOfMaterials() { return Graphic3d_NameOfMaterial_DEFAULT; } //! Returns the name of the predefined material of specified rank within range [1, NumberOfMaterials()]. Standard_EXPORT static Standard_CString MaterialName (const Standard_Integer theRank); @@ -49,10 +50,10 @@ Standard_EXPORT static Standard_Boolean MaterialFromName (const Standard_CString theName, Graphic3d_NameOfMaterial& theMat); - //! Returns the material for specified name or Graphic3d_NOM_DEFAULT if name is unknown. + //! Returns the material for specified name or Graphic3d_NameOfMaterial_DEFAULT if name is unknown. static Graphic3d_NameOfMaterial MaterialFromName (const Standard_CString theName) { - Graphic3d_NameOfMaterial aMat = Graphic3d_NOM_DEFAULT; + Graphic3d_NameOfMaterial aMat = Graphic3d_NameOfMaterial_DEFAULT; MaterialFromName (theName, aMat); return aMat; } @@ -86,7 +87,7 @@ { // if a component of a "standard" material change, the // result is no more standard (a blue gold is not a gold) - myMaterialName = Graphic3d_NOM_UserDefined; + myMaterialName = Graphic3d_NameOfMaterial_UserDefined; myStringName = theName; } @@ -170,6 +171,12 @@ //! Modifies the BSDF (bidirectional scattering distribution function). void SetBSDF (const Graphic3d_BSDF& theBSDF) { myBSDF = theBSDF; } + //! Returns physically based representation of material + const Graphic3d_PBRMaterial& PBRMaterial () const { return myPBRMaterial; } + + //! Modifies the physically based representation of material + void SetPBRMaterial (const Graphic3d_PBRMaterial& thePBRMaterial) { myPBRMaterial = thePBRMaterial; } + //! Returns TRUE if the reflection mode is active, FALSE otherwise. Standard_Boolean ReflectionMode (const Graphic3d_TypeOfReflection theType) const { @@ -197,6 +204,7 @@ return myTransparencyCoef == theOther.myTransparencyCoef && myRefractionIndex == theOther.myRefractionIndex && myBSDF == theOther.myBSDF + && myPBRMaterial == theOther.myPBRMaterial && myShininess == theOther.myShininess && myColors[Graphic3d_TOR_AMBIENT] == theOther.myColors[Graphic3d_TOR_AMBIENT] && myColors[Graphic3d_TOR_DIFFUSE] == theOther.myColors[Graphic3d_TOR_DIFFUSE] @@ -207,6 +215,9 @@ //! Returns TRUE if this material is identical to specified one. Standard_Boolean operator== (const Graphic3d_MaterialAspect& theOther) const { return IsEqual (theOther); } + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + public: //! Deactivates the reflective properties of the surface with specified reflection type. @@ -237,9 +248,9 @@ { // if a component of a "standard" material change, the // result is no more standard (a blue gold is not a gold) - if (myMaterialName != Graphic3d_NOM_UserDefined) + if (myMaterialName != Graphic3d_NameOfMaterial_UserDefined) { - myMaterialName = Graphic3d_NOM_UserDefined; + myMaterialName = Graphic3d_NameOfMaterial_UserDefined; myStringName = "UserDefined"; } } @@ -247,6 +258,7 @@ private: Graphic3d_BSDF myBSDF; + Graphic3d_PBRMaterial myPBRMaterial; TCollection_AsciiString myStringName; Quantity_Color myColors[Graphic3d_TypeOfReflection_NB]; Standard_ShortReal myTransparencyCoef; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_MediaTexture.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_MediaTexture.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_MediaTexture.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_MediaTexture.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -56,7 +56,7 @@ // Function : GetImage // Purpose : // ================================================================ -Handle(Image_PixMap) Graphic3d_MediaTexture::GetImage() const +Handle(Image_PixMap) Graphic3d_MediaTexture::GetImage (const Handle(Image_SupportedFormats)& ) { Standard_Mutex::Sentry aLock (myMutex.get()); if (myFrame.IsNull() diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_MediaTexture.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_MediaTexture.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_MediaTexture.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_MediaTexture.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,7 @@ Standard_Integer thePlane = -1); //! Image reader. - Standard_EXPORT virtual Handle(Image_PixMap) GetImage() const Standard_OVERRIDE; + Standard_EXPORT virtual Handle(Image_PixMap) GetImage (const Handle(Image_SupportedFormats)& theSupported) Standard_OVERRIDE; //! Return the frame. const Handle(Media_Frame)& Frame() const { return myFrame; } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_MediaTextureSet.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_MediaTextureSet.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_MediaTextureSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_MediaTextureSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -85,10 +85,10 @@ private: //! Lock the frame for decoding into. - virtual Handle(Media_Frame) LockFrame() Standard_OVERRIDE; + Standard_EXPORT virtual Handle(Media_Frame) LockFrame() Standard_OVERRIDE; //! Release the frame to present decoding results. - virtual void ReleaseFrame (const Handle(Media_Frame)& theFrame) Standard_OVERRIDE; + Standard_EXPORT virtual void ReleaseFrame (const Handle(Media_Frame)& theFrame) Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_NameOfMaterial.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_NameOfMaterial.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_NameOfMaterial.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_NameOfMaterial.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,35 +17,66 @@ #ifndef _Graphic3d_NameOfMaterial_HeaderFile #define _Graphic3d_NameOfMaterial_HeaderFile -//! Types of aspect materials. +//! List of named materials (predefined presets). +//! Each preset defines either physical (having natural color) or generic (mutable color) material (@sa Graphic3d_TypeOfMaterial). enum Graphic3d_NameOfMaterial { -Graphic3d_NOM_BRASS, -Graphic3d_NOM_BRONZE, -Graphic3d_NOM_COPPER, -Graphic3d_NOM_GOLD, -Graphic3d_NOM_PEWTER, -Graphic3d_NOM_PLASTER, -Graphic3d_NOM_PLASTIC, -Graphic3d_NOM_SILVER, -Graphic3d_NOM_STEEL, -Graphic3d_NOM_STONE, -Graphic3d_NOM_SHINY_PLASTIC, -Graphic3d_NOM_SATIN, -Graphic3d_NOM_METALIZED, -Graphic3d_NOM_NEON_GNC, -Graphic3d_NOM_CHROME, -Graphic3d_NOM_ALUMINIUM, -Graphic3d_NOM_OBSIDIAN, -Graphic3d_NOM_NEON_PHC, -Graphic3d_NOM_JADE, -Graphic3d_NOM_CHARCOAL, -Graphic3d_NOM_WATER, -Graphic3d_NOM_GLASS, -Graphic3d_NOM_DIAMOND, -Graphic3d_NOM_TRANSPARENT, -Graphic3d_NOM_DEFAULT, -Graphic3d_NOM_UserDefined + Graphic3d_NameOfMaterial_Brass, //!< Brass (Physic) + Graphic3d_NameOfMaterial_Bronze, //!< Bronze (Physic) + Graphic3d_NameOfMaterial_Copper, //!< Copper (Physic) + Graphic3d_NameOfMaterial_Gold, //!< Gold (Physic) + Graphic3d_NameOfMaterial_Pewter, //!< Pewter (Physic) + Graphic3d_NameOfMaterial_Plastered, //!< Plastered (Generic) + Graphic3d_NameOfMaterial_Plastified, //!< Plastified (Generic) + Graphic3d_NameOfMaterial_Silver, //!< Silver (Physic) + Graphic3d_NameOfMaterial_Steel, //!< Steel (Physic) + Graphic3d_NameOfMaterial_Stone, //!< Stone (Physic) + Graphic3d_NameOfMaterial_ShinyPlastified, //!< Shiny Plastified (Generic) + Graphic3d_NameOfMaterial_Satin, //!< Satin (Generic) + Graphic3d_NameOfMaterial_Metalized, //!< Metalized (Generic) + Graphic3d_NameOfMaterial_Ionized, //!< Ionized (Generic) + Graphic3d_NameOfMaterial_Chrome, //!< Chrome (Physic) + Graphic3d_NameOfMaterial_Aluminum, //!< Aluminum (Physic) + Graphic3d_NameOfMaterial_Obsidian, //!< Obsidian (Physic) + Graphic3d_NameOfMaterial_Neon, //!< Neon (Physic) + Graphic3d_NameOfMaterial_Jade, //!< Jade (Physic) + Graphic3d_NameOfMaterial_Charcoal, //!< Charcoal (Physic) + Graphic3d_NameOfMaterial_Water, //!< Water (Physic) + Graphic3d_NameOfMaterial_Glass, //!< Glass (Physic) + Graphic3d_NameOfMaterial_Diamond, //!< Diamond (Physic) + Graphic3d_NameOfMaterial_Transparent, //!< Transparent (Physic) + Graphic3d_NameOfMaterial_DEFAULT, //!< Default (Generic); + //! normally used as out-of-range value pointing to some application default + Graphic3d_NameOfMaterial_UserDefined, //!< User-defined (Physic); + //! used for any material with non-standard definition + + // old aliases + Graphic3d_NOM_BRASS = Graphic3d_NameOfMaterial_Brass, + Graphic3d_NOM_BRONZE = Graphic3d_NameOfMaterial_Bronze, + Graphic3d_NOM_COPPER = Graphic3d_NameOfMaterial_Copper, + Graphic3d_NOM_GOLD = Graphic3d_NameOfMaterial_Gold, + Graphic3d_NOM_PEWTER = Graphic3d_NameOfMaterial_Pewter, + Graphic3d_NOM_PLASTER = Graphic3d_NameOfMaterial_Plastered, + Graphic3d_NOM_PLASTIC = Graphic3d_NameOfMaterial_Plastified, + Graphic3d_NOM_SILVER = Graphic3d_NameOfMaterial_Silver, + Graphic3d_NOM_STEEL = Graphic3d_NameOfMaterial_Steel, + Graphic3d_NOM_STONE = Graphic3d_NameOfMaterial_Stone, + Graphic3d_NOM_SHINY_PLASTIC = Graphic3d_NameOfMaterial_ShinyPlastified, + Graphic3d_NOM_SATIN = Graphic3d_NameOfMaterial_Satin, + Graphic3d_NOM_METALIZED = Graphic3d_NameOfMaterial_Metalized, + Graphic3d_NOM_NEON_GNC = Graphic3d_NameOfMaterial_Ionized, + Graphic3d_NOM_CHROME = Graphic3d_NameOfMaterial_Chrome, + Graphic3d_NOM_ALUMINIUM = Graphic3d_NameOfMaterial_Aluminum, + Graphic3d_NOM_OBSIDIAN = Graphic3d_NameOfMaterial_Obsidian, + Graphic3d_NOM_NEON_PHC = Graphic3d_NameOfMaterial_Neon, + Graphic3d_NOM_JADE = Graphic3d_NameOfMaterial_Jade, + Graphic3d_NOM_CHARCOAL = Graphic3d_NameOfMaterial_Charcoal, + Graphic3d_NOM_WATER = Graphic3d_NameOfMaterial_Water, + Graphic3d_NOM_GLASS = Graphic3d_NameOfMaterial_Glass, + Graphic3d_NOM_DIAMOND = Graphic3d_NameOfMaterial_Diamond, + Graphic3d_NOM_TRANSPARENT = Graphic3d_NameOfMaterial_Transparent, + Graphic3d_NOM_DEFAULT = Graphic3d_NameOfMaterial_DEFAULT, + Graphic3d_NOM_UserDefined = Graphic3d_NameOfMaterial_UserDefined }; #endif // _Graphic3d_NameOfMaterial_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PBRMaterial.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PBRMaterial.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PBRMaterial.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PBRMaterial.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,367 @@ +// Author: Ilya Khramov +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include + +#include + +// ======================================================================= +// function : RoughnessFromSpecular +// purpose : +// ======================================================================= +Standard_ShortReal Graphic3d_PBRMaterial::RoughnessFromSpecular (const Quantity_Color& theSpecular, + const Standard_Real theShiness) +{ + Standard_Real aRoughnessFactor = 1.0 - theShiness; + //Standard_Real aSpecIntens = theSpecular.Light() * theSpecular; + const Standard_Real aSpecIntens = theSpecular.Red() * 0.2125 + + theSpecular.Green() * 0.7154 + + theSpecular.Blue() * 0.0721; + if (aSpecIntens < 0.1) + { + // low specular intensity should produce a rough material even if shininess is high + aRoughnessFactor *= (1.0 - aSpecIntens); + } + return (Standard_ShortReal )aRoughnessFactor; +} + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= +Graphic3d_PBRMaterial::Graphic3d_PBRMaterial () +: myColor (0.f, 0.f, 0.f, 1.f), + myMetallic (0.f), + myRoughness (1.f), + myEmission (0.f), + myIOR (1.5f) +{} + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= +Graphic3d_PBRMaterial::Graphic3d_PBRMaterial (const Graphic3d_BSDF& theBSDF) +{ + SetBSDF (theBSDF); +} + +// ======================================================================= +// function : SetMetallic +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetMetallic (Standard_ShortReal theMetallic) +{ + Graphic3d_MaterialDefinitionError_Raise_if (theMetallic < 0.f || theMetallic > 1.f, + "'metallic' parameter of PBR material must be in range [0, 1]") + myMetallic = theMetallic; +} + +// ======================================================================= +// function : Roughness +// purpose : +// ======================================================================= +Standard_ShortReal Graphic3d_PBRMaterial::Roughness (Standard_ShortReal theNormalizedRoughness) +{ + return theNormalizedRoughness * (1.f - MinRoughness()) + MinRoughness(); +} + +// ======================================================================= +// function : SetRoughness +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetRoughness (Standard_ShortReal theRoughness) +{ + Graphic3d_MaterialDefinitionError_Raise_if (theRoughness < 0.f || theRoughness > 1.f, + "'roughness' parameter of PBR material must be in range [0, 1]") + myRoughness = theRoughness; +} + +// ======================================================================= +// function : SetIOR +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetIOR (Standard_ShortReal theIOR) +{ + Graphic3d_MaterialDefinitionError_Raise_if (theIOR < 1.f || theIOR > 3.f, + "'IOR' parameter of PBR material must be in range [1, 3]") + myIOR = theIOR; +} + +// ======================================================================= +// function : SetColor +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetColor (const Quantity_ColorRGBA& theColor) +{ + myColor.SetRGB (theColor.GetRGB()); + SetAlpha (theColor.Alpha()); +} + +// ======================================================================= +// function : SetColor +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetColor (const Quantity_Color& theColor) +{ + myColor.SetRGB (theColor); +} + +// ======================================================================= +// function : SetAlpha +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetAlpha (Standard_ShortReal theAlpha) +{ + Graphic3d_MaterialDefinitionError_Raise_if (theAlpha < 0.f || theAlpha > 1.f, + "'alpha' parameter of PBR material must be in range [0, 1]") + myColor.SetAlpha (theAlpha); +} + +// ======================================================================= +// function : SetEmission +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetEmission (const Graphic3d_Vec3& theEmission) +{ + Graphic3d_MaterialDefinitionError_Raise_if (theEmission.r() < 0.f + || theEmission.g() < 0.f + || theEmission.b() < 0.f, + "all components of 'emission' parameter of PBR material must be greater than 0") + myEmission = theEmission; +} + +// ======================================================================= +// function : SetBSDF +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetBSDF (const Graphic3d_BSDF& theBSDF) +{ + SetEmission (theBSDF.Le); + + if (theBSDF.Absorption != Graphic3d_Vec4(0.f)) + { + SetMetallic (0.f); + SetColor (Quantity_Color (theBSDF.Absorption.rgb())); + if (theBSDF.FresnelCoat.FresnelType() == Graphic3d_FM_DIELECTRIC) + { + SetIOR (theBSDF.FresnelCoat.Serialize().y()); + SetRoughness (0.f); + SetAlpha (theBSDF.Absorption.a() * 4.f); + } + return; + } + + if (theBSDF.FresnelBase.FresnelType() == Graphic3d_FM_CONSTANT + && theBSDF.Kt != Graphic3d_Vec3(0.f)) + { + SetIOR (1.f); + SetRoughness (1.f); + SetMetallic (0.f); + SetColor (Quantity_Color (theBSDF.Kt)); + SetAlpha (1.f - (theBSDF.Kt.r() + theBSDF.Kt.g() + theBSDF.Kt.b()) / 3.f); + return; + } + + SetRoughness(sqrtf (theBSDF.Ks.w())); + if (theBSDF.FresnelBase.FresnelType() == Graphic3d_FM_DIELECTRIC + || theBSDF.FresnelBase.FresnelType() == Graphic3d_FM_CONSTANT) + { + SetIOR (1.5f); + SetColor (Quantity_Color (theBSDF.Kd)); + SetMetallic (0.f); + } + else if (theBSDF.FresnelBase.FresnelType() == Graphic3d_FM_SCHLICK) + { + SetColor (Quantity_Color (theBSDF.FresnelBase.Serialize().rgb())); + SetMetallic (1.f); + } + else + { + SetColor (Quantity_Color (theBSDF.Ks.rgb())); + SetMetallic (1.f); + } +} + +// ======================================================================= +// function : GenerateEnvLUT +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::GenerateEnvLUT (const Handle(Image_PixMap)& theLUT, + unsigned int theNbIntegralSamples) +{ + if (theLUT->Format() != Image_Format_RGF) + { + throw Standard_ProgramError("LUT pix map format for PBR LUT generation must be Image_Format_RGF"); + } + + for (unsigned int y = 0; y < theLUT->SizeY(); ++y) + { + Standard_ShortReal aRoughness = Roughness(y / Standard_ShortReal(theLUT->SizeY() - 1)); + + for (unsigned int x = 0; x < theLUT->SizeX(); ++x) + { + Standard_ShortReal aCosV = x / Standard_ShortReal(theLUT->SizeX() - 1); + Graphic3d_Vec3 aView = lutGenView (aCosV); + unsigned int aCount = 0; + Graphic3d_Vec2 aResult = Graphic3d_Vec2 (0.f); + for (unsigned int i = 0; i < theNbIntegralSamples; ++i) + { + Graphic3d_Vec2 aHammersleyPoint = lutGenHammersley (i, theNbIntegralSamples); + Graphic3d_Vec3 aHalf = lutGenImportanceSample (aHammersleyPoint, aRoughness); + Graphic3d_Vec3 aLight = lutGenReflect (aView, aHalf); + if (aLight.z() >= 0.f) + { + ++aCount; + Standard_ShortReal aCosVH = aView.Dot (aHalf); + Standard_ShortReal aGeometryFactor = lutGenGeometryFactor (aLight.z(), + aCosV, + aRoughness); + Standard_ShortReal anIntermediateResult = 1.f - aCosVH; + anIntermediateResult *= anIntermediateResult; + anIntermediateResult *= anIntermediateResult; + anIntermediateResult *= 1.f - aCosVH; + + aResult.x() += aGeometryFactor * (aCosVH / aHalf.z()) * (1.f - anIntermediateResult); + aResult.y() += aGeometryFactor * (aCosVH / aHalf.z()) * anIntermediateResult; + } + } + + aResult = aResult / Standard_ShortReal(theNbIntegralSamples); + theLUT->ChangeValue (theLUT->SizeY() - 1 - y, x) = aResult; + } + } +} + +// ======================================================================= +// function : SpecIBLMapSamplesFactor +// purpose : +// ======================================================================= +Standard_ShortReal Graphic3d_PBRMaterial::SpecIBLMapSamplesFactor (Standard_ShortReal theProbability, + Standard_ShortReal theRoughness) +{ + return acosf (lutGenImportanceSampleCosTheta (theProbability, theRoughness)) * 2.f / Standard_ShortReal(M_PI); +} + +// ======================================================================= +// function : lutGenGeometryFactor +// purpose : +// ======================================================================= +Standard_ShortReal Graphic3d_PBRMaterial::lutGenGeometryFactor (Standard_ShortReal theCosL, + Standard_ShortReal theCosV, + Standard_ShortReal theRoughness) +{ + Standard_ShortReal aK = theRoughness * theRoughness * 0.5f; + + Standard_ShortReal aGeometryFactor = theCosL; + aGeometryFactor /= theCosL * (1.f - aK) + aK; + aGeometryFactor /= theCosV * (1.f - aK) + aK; + + return aGeometryFactor; +} + +// ======================================================================= +// function : lutGenHammersley +// purpose : +// ======================================================================= +Graphic3d_Vec2 Graphic3d_PBRMaterial::lutGenHammersley (unsigned int theNumber, unsigned int theCount) +{ + Standard_ShortReal aPhi2 = 0.f; + for (unsigned int i = 0; i < sizeof(unsigned int) * 8; ++i) + { + if ((theNumber >> i) == 0) + { + break; + } + aPhi2 += ((theNumber >> i) & 1) / Standard_ShortReal(1 << (i + 1)); + } + + return Graphic3d_Vec2(theNumber / Standard_ShortReal(theCount), aPhi2); +} + +// ======================================================================= +// function : lutGenImportanceSampleCosTheta +// purpose : +// ======================================================================= +Standard_ShortReal Graphic3d_PBRMaterial::lutGenImportanceSampleCosTheta (Standard_ShortReal theHammersleyPointComponent, + Standard_ShortReal theRoughness) +{ + Standard_ShortReal aQuadRoughness = theRoughness * theRoughness; + aQuadRoughness *= aQuadRoughness; + + Standard_ShortReal aTmp = 1.f + (aQuadRoughness - 1.f) * theHammersleyPointComponent; + + if (aTmp != 0.f) + { + return sqrtf ((1.f - theHammersleyPointComponent) / aTmp); + } + else + { + return 0.f; + } +} + +// ======================================================================= +// function : lutGenImportanceSample +// purpose : +// ======================================================================= +Graphic3d_Vec3 Graphic3d_PBRMaterial::lutGenImportanceSample (const Graphic3d_Vec2 &theHammerslayPoint, + Standard_ShortReal theRoughness) +{ + Standard_ShortReal aPhi = 2.f * Standard_ShortReal(M_PI) * theHammerslayPoint.y(); + + Standard_ShortReal aCosTheta = lutGenImportanceSampleCosTheta (theHammerslayPoint.x(), theRoughness); + Standard_ShortReal aSinTheta = sqrtf (1.f - aCosTheta * aCosTheta); + + return Graphic3d_Vec3(aSinTheta * cosf (aPhi), + aSinTheta * sinf (aPhi), + aCosTheta); +} + +// ======================================================================= +// function : lutGenView +// purpose : +// ======================================================================= +Graphic3d_Vec3 Graphic3d_PBRMaterial::lutGenView (Standard_ShortReal theCosV) +{ + return Graphic3d_Vec3(0.f, sqrtf(1.f - theCosV * theCosV), theCosV); +} + +// ======================================================================= +// function : lutGenReflect +// purpose : +// ======================================================================= +Graphic3d_Vec3 Graphic3d_PBRMaterial::lutGenReflect (const Graphic3d_Vec3 &theVector, + const Graphic3d_Vec3 &theAxis) +{ + return theAxis * theAxis.Dot(theVector) * 2.f - theVector; +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_PBRMaterial::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, Graphic3d_PBRMaterial) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myColor) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMetallic) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRoughness) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myEmission) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIOR) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PBRMaterial.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PBRMaterial.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PBRMaterial.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PBRMaterial.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,201 @@ +// Author: Ilya Khramov +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Graphic3d_PBRMaterial_HeaderFile +#define _Graphic3d_PBRMaterial_HeaderFile + +#include +#include +#include +#include +#include +#include + +//! Class implementing Metallic-Roughness physically based material definition +class Graphic3d_PBRMaterial +{ +public: + + //! Creates new physically based material in Metallic-Roughness system. + //! 'metallic' parameter is 0 by default. + //! 'roughness' parameter is 1 by default. + //! 'color' parameter is (0, 0, 0) by default. + //! 'alpha' parameter is 1 by default. + //! 'IOR' parameter is 1.5 by default. + //! 'emission' parameter is (0, 0, 0) by default. + Standard_EXPORT Graphic3d_PBRMaterial(); + + //! Creates new physically based material in Metallic-Roughness system from Graphic3d_BSDF. + Standard_EXPORT Graphic3d_PBRMaterial (const Graphic3d_BSDF& theBSDF); + + //! Returns material's metallic coefficient in [0, 1] range. + //! 1 for metals and 0 for dielectrics. + //! It is preferable to be exactly 0 or 1. Average values are needed for textures mixing in shader. + Standard_ShortReal Metallic() const { return myMetallic; } + + //! Modifies metallic coefficient of material in [0, 1] range. + Standard_EXPORT void SetMetallic (Standard_ShortReal theMetallic); + + //! Maps roughness from [0, 1] to [MinRoughness, 1] for calculations. + Standard_EXPORT static Standard_ShortReal Roughness(Standard_ShortReal theNormalizedRoughness); + + //! Returns real value of roughness in [MinRoughness, 1] range for calculations. + Standard_ShortReal Roughness() const { return Roughness(myRoughness); } + + //! Returns roughness mapping parameter in [0, 1] range. + //! Roughness is defined in [0, 1] for handful material settings + //! and is mapped to [MinRoughness, 1] for calculations. + Standard_ShortReal NormalizedRoughness() const { return myRoughness; } + + //! Modifies roughness coefficient of material in [0, 1] range. + Standard_EXPORT void SetRoughness (Standard_ShortReal theRoughness); + + //! Returns index of refraction in [1, 3] range. + Standard_ShortReal IOR() const { return myIOR; } + + //! Modifies index of refraction in [1, 3] range. + //! In practice affects only on non-metal materials reflection possibilities. + Standard_EXPORT void SetIOR (Standard_ShortReal theIOR); + + //! Returns albedo color with alpha component of material. + const Quantity_ColorRGBA& Color() const { return myColor; } + + //! Modifies albedo color with alpha component. + Standard_EXPORT void SetColor (const Quantity_ColorRGBA& theColor); + + //! Modifies only albedo color. + Standard_EXPORT void SetColor (const Quantity_Color& theColor); + + //! Returns alpha component in range [0, 1]. + Standard_ShortReal Alpha() const { return myColor.Alpha(); }; + + //! Modifies alpha component. + Standard_EXPORT void SetAlpha (Standard_ShortReal theAlpha); + + //! Returns light intensity emitted by material. + //! Values are greater or equal 0. + Graphic3d_Vec3 Emission() const { return myEmission; } + + //! Modifies light intensity emitted by material. + Standard_EXPORT void SetEmission (const Graphic3d_Vec3& theEmission); + + //! Generates material in Metallic-Roughness system from Graphic3d_BSDF. + Standard_EXPORT void SetBSDF (const Graphic3d_BSDF& theBSDF); + +public: + + //! PBR materials comparison operator. + Standard_Boolean operator== (const Graphic3d_PBRMaterial& theOther) const + { + return (myMetallic == theOther.myMetallic) + && (myRoughness == theOther.myRoughness) + && (myIOR == theOther.myIOR) + && (myColor == theOther.myColor) + && (myEmission == theOther.myEmission); + } + +public: + + //! Generates 2D look up table of scale and bias for fresnell zero coefficient. + //! It is needed for calculation reflectance part of environment lighting. + //! @param [out] theLUT table storage (must be Image_Format_RGF). + //! @param [in] theIntegralSamplesCount number of importance samples in hemisphere integral calculation for every table item. + Standard_EXPORT static void GenerateEnvLUT (const Handle(Image_PixMap)& theLUT, + unsigned int theNbIntegralSamples = 1024); + + //! Compute material roughness from common material (specular color + shininess). + //! @param theSpecular [in] specular color + //! @param theShiness [in] normalized shininess coefficient within [0..1] range + //! @return roughness within [0..1] range + Standard_EXPORT static Standard_ShortReal RoughnessFromSpecular (const Quantity_Color& theSpecular, + const Standard_Real theShiness); + + //! Compute material metallicity from common material (specular color). + //! @param theSpecular [in] specular color + //! @return metallicity within [0..1] range + static Standard_ShortReal MetallicFromSpecular (const Quantity_Color& theSpecular) + { + return ((Graphic3d_Vec3 )theSpecular).maxComp(); + } + +public: + + //! Roughness cannot be 0 in real calculations, so it returns minimal achievable level of roughness in practice + static Standard_ShortReal MinRoughness() { return 0.01f; } + +public: + + //! Shows how much times less samples can be used in certain roughness value specular IBL map generation + //! in compare with samples number for map with roughness of 1. + //! Specular IBL maps with less roughness values have higher resolution but require less samples for the same quality of baking. + //! So that reducing samples number is good strategy to improve performance of baking. + //! The samples number for specular IBL map with roughness of 1 (the maximum possible samples number) is expected to be defined as baking parameter. + //! Samples number for other roughness values can be calculated by multiplication origin samples number by this factor. + //! @param theProbability value from 0 to 1 controlling strength of samples reducing. + //! Bigger values result in slower reduction to provide better quality but worse performance. + //! Value of 1 doesn't affect at all so that 1 will be returned (it can be used to disable reduction strategy). + //! @param theRoughness roughness value of current generated specular IBL map (from 0 to 1). + //! @return factor to calculate number of samples for current specular IBL map baking. + //! Be aware! It has no obligation to return 1 in case of roughness of 1. + //! Be aware! It produces poor quality with small number of origin samples. In that case it is recommended to be disabled. + Standard_EXPORT static Standard_ShortReal SpecIBLMapSamplesFactor (Standard_ShortReal theProbability, + Standard_ShortReal theRoughness); + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + +private: + + //! Calculates geometry factor of Cook-Torrance BRDF using Smith formula. + static Standard_ShortReal lutGenGeometryFactor (Standard_ShortReal theCosL, + Standard_ShortReal theCosV, + Standard_ShortReal theRoughness); + + //! Generates quasi-random point from Hammersley set. + //! @param theNumber number of point + //! @param theCount size of Hammersley set + static Graphic3d_Vec2 lutGenHammersley (unsigned int theNumber, unsigned int theCount); + + //! Generates only cosine theta of direction in spherical coordinates system + //! according to micro facet distribution function from Cook-Torrance BRDF. + static Standard_ShortReal lutGenImportanceSampleCosTheta (Standard_ShortReal theHammerslayPointComponent, + Standard_ShortReal theRoughness); + + //! Generates direction using point from Hammersley set + //! according to micro facet distribution function from Cook-Torrance BRDF. + static Graphic3d_Vec3 lutGenImportanceSample (const Graphic3d_Vec2 &theHammerslayPoint, + Standard_ShortReal theRoughness); + + //! Generates vector using cosine of angle between up vector (normal in hemisphere) + //! and desired vector. + //! x component for resulting vector will be zero. + static Graphic3d_Vec3 lutGenView (Standard_ShortReal theCosV); + + //! Returns reflected vector according axis. + //! @param theVector vector is needed to be reflected. + //! @param theAxis axis of reflection. + static Graphic3d_Vec3 lutGenReflect (const Graphic3d_Vec3 &theVector, + const Graphic3d_Vec3 &theAxis); + +private: + + Quantity_ColorRGBA myColor; //!< albedo color with alpha component [0, 1] + Standard_ShortReal myMetallic; //!< metallic coefficient of material [0, 1] + Standard_ShortReal myRoughness; //!< roughness coefficient of material [0, 1] + Graphic3d_Vec3 myEmission; //!< light intensity emitted by material [>= 0] + Standard_ShortReal myIOR; //!< index of refraction [1, 3] + +}; + +#endif // _Graphic3d_PBRMaterial_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PolygonOffset.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PolygonOffset.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PolygonOffset.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PolygonOffset.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,11 +19,11 @@ //function : DumpJson //purpose : //======================================================================= -void Graphic3d_PolygonOffset::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const +void Graphic3d_PolygonOffset::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Graphic3d_PolygonOffset); + OCCT_DUMP_CLASS_BEGIN (theOStream, Graphic3d_PolygonOffset) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Mode); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Factor); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Units); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Mode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Factor) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Units) } diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PolygonOffset.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PolygonOffset.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PolygonOffset.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PolygonOffset.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,7 @@ } //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; }; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PresentationAttributes.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PresentationAttributes.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PresentationAttributes.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PresentationAttributes.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,4 +15,21 @@ #include +#include + IMPLEMENT_STANDARD_RTTIEXT (Graphic3d_PresentationAttributes, Standard_Transient) + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_PresentationAttributes::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myBasicFillAreaAspect.get()) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBasicColor) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHiMethod) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myZLayer) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDispMode) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PresentationAttributes.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PresentationAttributes.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_PresentationAttributes.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_PresentationAttributes.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -90,6 +90,9 @@ //! Sets basic presentation fill area aspect. virtual void SetBasicFillAreaAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect) { myBasicFillAreaAspect = theAspect; } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: Handle(Graphic3d_AspectFillArea3d) myBasicFillAreaAspect; //!< presentation fill area aspect diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_RenderingParams.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_RenderingParams.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_RenderingParams.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_RenderingParams.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,92 @@ +// Created on: 2020-02-06 +// Created by: Svetlana SHUTINA +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_RenderingParams::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Method) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, TransparencyMethod) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, LineFeather) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, PbrEnvPow2Size) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, PbrEnvSpecMapNbLevels) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, PbrEnvBakingDiffNbSamples) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, PbrEnvBakingSpecNbSamples) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, PbrEnvBakingProbability) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, OitDepthFactor) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, NbMsaaSamples) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, RenderResolutionScale) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, ToEnableDepthPrepass) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, ToEnableAlphaToCoverage) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsGlobalIlluminationEnabled) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, SamplesPerPixel) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, RaytracingDepth) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsShadowEnabled) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsReflectionEnabled) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsAntialiasingEnabled) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsTransparentShadowEnabled) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, UseEnvironmentMapBackground) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, ToIgnoreNormalMapInRayTracing) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, CoherentPathTracingMode) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, AdaptiveScreenSampling) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, AdaptiveScreenSamplingAtomic) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, ShowSamplingTiles) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, TwoSidedBsdfModels) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, RadianceClampingValue) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, RebuildRayTracingShaders) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, RayTracingTileSize) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, NbRayTracingTiles) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, CameraApertureRadius) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, CameraFocalPlaneDist) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, FrustumCullingState) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, ToneMappingMethod) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Exposure) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, WhitePoint) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, StereoMode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, AnaglyphFilter) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &AnaglyphLeft) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &AnaglyphRight) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, ToReverseStereo) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, StatsPosition.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, ChartPosition.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &ChartSize) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, StatsTextAspect.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, StatsUpdateInterval) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, StatsTextHeight) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, StatsNbFrames) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, StatsMaxChartTime) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, CollectedStats) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, ToShowStats) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Resolution) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_RenderingParams.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_RenderingParams.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_RenderingParams.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_RenderingParams.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -60,19 +60,20 @@ // PerfCounters_Triangles = 0x040, //!< count Triangles PerfCounters_Points = 0x080, //!< count Points + PerfCounters_Lines = 0x100, //!< count Line segments // - PerfCounters_EstimMem = 0x100, //!< estimated GPU memory usage + PerfCounters_EstimMem = 0x200, //!< estimated GPU memory usage // - PerfCounters_FrameTime = 0x200, //!< frame CPU utilization time (rendering thread); @sa Graphic3d_FrameStatsTimer - PerfCounters_FrameTimeMax= 0x400, //!< maximum frame times + PerfCounters_FrameTime = 0x400, //!< frame CPU utilization time (rendering thread); @sa Graphic3d_FrameStatsTimer + PerfCounters_FrameTimeMax= 0x800, //!< maximum frame times // - PerfCounters_SkipImmediate = 0x800, //!< do not include immediate viewer updates (e.g. lazy updates without redrawing entire view content) + PerfCounters_SkipImmediate = 0x1000, //!< do not include immediate viewer updates (e.g. lazy updates without redrawing entire view content) //! show basic statistics PerfCounters_Basic = PerfCounters_FrameRate | PerfCounters_CPU | PerfCounters_Layers | PerfCounters_Structures, //! extended (verbose) statistics PerfCounters_Extended = PerfCounters_Basic | PerfCounters_Groups | PerfCounters_GroupArrays - | PerfCounters_Triangles | PerfCounters_Points + | PerfCounters_Triangles | PerfCounters_Points | PerfCounters_Lines | PerfCounters_EstimMem, //! all counters PerfCounters_All = PerfCounters_Extended @@ -95,6 +96,13 @@ : Method (Graphic3d_RM_RASTERIZATION), TransparencyMethod (Graphic3d_RTM_BLEND_UNORDERED), LineFeather (1.0f), + // PBR parameters + PbrEnvPow2Size (9), + PbrEnvSpecMapNbLevels (6), + PbrEnvBakingDiffNbSamples (1024), + PbrEnvBakingSpecNbSamples (256), + PbrEnvBakingProbability (0.99f), + // OitDepthFactor (0.0f), NbMsaaSamples (0), RenderResolutionScale (1.0f), @@ -102,12 +110,14 @@ ToEnableAlphaToCoverage (Standard_True), // ray tracing parameters IsGlobalIlluminationEnabled (Standard_False), + SamplesPerPixel(0), RaytracingDepth (THE_DEFAULT_DEPTH), IsShadowEnabled (Standard_True), IsReflectionEnabled (Standard_False), IsAntialiasingEnabled (Standard_False), IsTransparentShadowEnabled (Standard_False), UseEnvironmentMapBackground (Standard_False), + ToIgnoreNormalMapInRayTracing (Standard_False), CoherentPathTracingMode (Standard_False), AdaptiveScreenSampling (Standard_False), AdaptiveScreenSamplingAtomic(Standard_False), @@ -125,8 +135,10 @@ WhitePoint (1.f), // stereoscopic parameters StereoMode (Graphic3d_StereoMode_QuadBuffer), + HmdFov2d (30.0f), AnaglyphFilter (Anaglyph_RedCyan_Optimized), ToReverseStereo (Standard_False), + ToMirrorComposer (Standard_True), // StatsPosition (new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_UPPER, Graphic3d_Vec2i (20, 20))), ChartPosition (new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_RIGHT_UPPER, Graphic3d_Vec2i (20, 20))), @@ -164,6 +176,9 @@ { return Resolution / static_cast (THE_DEFAULT_RESOLUTION); } + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; public: @@ -171,6 +186,15 @@ Graphic3d_RenderTransparentMethod TransparencyMethod; //!< specifies rendering method for transparent graphics Standard_ShortReal LineFeather; //!< line feater width in pixels (> 0.0), 1.0 by default; //! high values produce blurred results, small values produce sharp (aliased) edges + + Standard_Integer PbrEnvPow2Size; //!< size of IBL maps side can be calculated as 2^PbrEnvPow2Size (> 0), 9 by default + Standard_Integer PbrEnvSpecMapNbLevels; //!< number of levels used in specular IBL map (> 1), 6 by default + Standard_Integer PbrEnvBakingDiffNbSamples; //!< number of samples used in Monte-Carlo integration during diffuse IBL map's + //! spherical harmonics coefficients generation (> 0), 1024 by default + Standard_Integer PbrEnvBakingSpecNbSamples; //!< number of samples used in Monte-Carlo integration during specular IBL map's generation (> 0), 256 by default + Standard_ShortReal PbrEnvBakingProbability; //!< controls strength of samples reducing strategy during specular IBL map's generation + //! (see 'SpecIBLMapSamplesFactor' function for detail explanation) [0.0, 1.0], 0.99 by default + Standard_ShortReal OitDepthFactor; //!< scalar factor [0-1] controlling influence of depth of a fragment to its final coverage Standard_Integer NbMsaaSamples; //!< number of MSAA samples (should be within 0..GL_MAX_SAMPLES, power-of-two number), 0 by default Standard_ShortReal RenderResolutionScale; //!< rendering resolution scale factor, 1 by default; @@ -186,6 +210,7 @@ Standard_Boolean IsAntialiasingEnabled; //!< enables/disables adaptive anti-aliasing, False by default Standard_Boolean IsTransparentShadowEnabled; //!< enables/disables light propagation through transparent media, False by default Standard_Boolean UseEnvironmentMapBackground; //!< enables/disables environment map background + Standard_Boolean ToIgnoreNormalMapInRayTracing; //!< enables/disables normal map ignoring during path tracing; FALSE by default Standard_Boolean CoherentPathTracingMode; //!< enables/disables 'coherent' tracing mode (single RNG seed within 16x16 image blocks) Standard_Boolean AdaptiveScreenSampling; //!< enables/disables adaptive screen sampling mode for path tracing, FALSE by default Standard_Boolean AdaptiveScreenSamplingAtomic;//!< enables/disables usage of atomic float operations within adaptive screen sampling, FALSE by default @@ -206,10 +231,12 @@ Standard_ShortReal WhitePoint; //!< white point value used in filmic tone mapping (path tracing), 1.0 by default Graphic3d_StereoMode StereoMode; //!< stereoscopic output mode, Graphic3d_StereoMode_QuadBuffer by default + Standard_ShortReal HmdFov2d; //!< sharp field of view range in degrees for displaying on-screen 2D elements, 30.0 by default; Anaglyph AnaglyphFilter; //!< filter for anaglyph output, Anaglyph_RedCyan_Optimized by default Graphic3d_Mat4 AnaglyphLeft; //!< left anaglyph filter (in normalized colorspace), Color = AnaglyphRight * theColorRight + AnaglyphLeft * theColorLeft; Graphic3d_Mat4 AnaglyphRight; //!< right anaglyph filter (in normalized colorspace), Color = AnaglyphRight * theColorRight + AnaglyphLeft * theColorLeft; Standard_Boolean ToReverseStereo; //!< flag to reverse stereo pair, FALSE by default + Standard_Boolean ToMirrorComposer; //!< if output device is an external composer - mirror rendering results in window in addition to sending frame to composer, TRUE by default Handle(Graphic3d_TransformPers) StatsPosition; //!< location of stats, upper-left position by default Handle(Graphic3d_TransformPers) ChartPosition; //!< location of stats chart, upper-right position by default diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_SequenceOfHClipPlane.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_SequenceOfHClipPlane.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_SequenceOfHClipPlane.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_SequenceOfHClipPlane.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,3 +58,18 @@ } return false; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_SequenceOfHClipPlane::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToOverrideGlobal) + + for (NCollection_Sequence::Iterator anIterator (myItems); anIterator.More(); anIterator.Next()) + { + const Handle(Graphic3d_ClipPlane)& aClipPlane = anIterator.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aClipPlane.get()) + } +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_SequenceOfHClipPlane.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_SequenceOfHClipPlane.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_SequenceOfHClipPlane.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_SequenceOfHClipPlane.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -94,6 +94,9 @@ //! Return the first item in sequence. const Handle(Graphic3d_ClipPlane)& First() const { return myItems.First(); } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: NCollection_Sequence myItems; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ShaderProgram.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ShaderProgram.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ShaderProgram.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ShaderProgram.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -80,9 +80,11 @@ : myNbLightsMax (THE_MAX_LIGHTS_DEFAULT), myNbClipPlanesMax (THE_MAX_CLIP_PLANES_DEFAULT), myNbFragOutputs (THE_NB_FRAG_OUTPUTS), + myTextureSetBits (Graphic3d_TextureSetBits_NONE), myHasDefSampler (true), myHasAlphaTest (false), - myHasWeightOitOutput (false) + myHasWeightOitOutput (false), + myIsPBR (false) { myID = TCollection_AsciiString ("Graphic3d_ShaderProgram_") + TCollection_AsciiString (Standard_Atomic_Increment (&THE_PROGRAM_OBJECT_COUNTER)); diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ShaderProgram.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ShaderProgram.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ShaderProgram.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ShaderProgram.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,7 @@ #include #include #include +#include #include //! List of shader objects. @@ -151,6 +152,19 @@ //! Note that weighted OIT also requires at least 2 Fragment Outputs (color + coverage). void SetWeightOitOutput (Standard_Boolean theOutput) { myHasWeightOitOutput = theOutput; } + //! Return TRUE if standard program header should define functions and variables used in PBR pipeline. + //! FALSE by default. + Standard_Boolean IsPBR() const { return myIsPBR; } + + //! Sets whether standard program header should define functions and variables used in PBR pipeline. + void SetPBR (Standard_Boolean theIsPBR) { myIsPBR = theIsPBR; } + + //! Return texture units declared within the program, @sa Graphic3d_TextureSetBits. + Standard_Integer TextureSetBits() const { return myTextureSetBits; } + + //! Set texture units declared within the program. + void SetTextureSetBits (Standard_Integer theBits) { myTextureSetBits = theBits; } + //! Pushes custom uniform variable to the program. //! The list of pushed variables is automatically cleared after applying to GLSL program. //! Thus after program recreation even unchanged uniforms should be pushed anew. @@ -201,9 +215,11 @@ Standard_Integer myNbLightsMax; //!< length of array of light sources (THE_MAX_LIGHTS) Standard_Integer myNbClipPlanesMax; //!< length of array of clipping planes (THE_MAX_CLIP_PLANES) Standard_Integer myNbFragOutputs; //!< length of array of Fragment Shader outputs (THE_NB_FRAG_OUTPUTS) + Standard_Integer myTextureSetBits;//!< texture units declared within the program, @sa Graphic3d_TextureSetBits Standard_Boolean myHasDefSampler; //!< flag indicating that program defines default texture sampler occSampler0 Standard_Boolean myHasAlphaTest; //!< flag indicating that Fragment Shader performs alpha test Standard_Boolean myHasWeightOitOutput; //!< flag indicating that Fragment Shader includes weighted OIT coverage + Standard_Boolean myIsPBR; //!< flag indicating that program defines functions and variables used in PBR pipeline }; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_StereoMode.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_StereoMode.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_StereoMode.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_StereoMode.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,6 +27,7 @@ Graphic3d_StereoMode_SideBySide, //!< horizontal pair Graphic3d_StereoMode_OverUnder, //!< vertical pair Graphic3d_StereoMode_SoftPageFlip, //!< software PageFlip for shutter glasses, should NOT be used! + Graphic3d_StereoMode_OpenVR, //!< OpenVR (HMD) Graphic3d_StereoMode_NB //!< the number of modes }; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Structure.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Structure.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Structure.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Structure.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,6 +30,8 @@ #include "Graphic3d_Structure.pxx" +#include + #include IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_Structure,Standard_Transient) @@ -47,8 +49,11 @@ { if (!theLinkPrs.IsNull()) { - myOwner = theLinkPrs->myOwner; - myVisual = theLinkPrs->myVisual; + myOwner = theLinkPrs->myOwner; + if (theLinkPrs->myVisual != Graphic3d_TOS_COMPUTED) + { + myVisual = theLinkPrs->myVisual; + } myComputeVisual = theLinkPrs->myComputeVisual; myCStructure = theLinkPrs->myCStructure->ShadowLink (theManager); } @@ -71,10 +76,10 @@ } //============================================================================= -//function : Clear +//function : clear //purpose : //============================================================================= -void Graphic3d_Structure::Clear (const Standard_Boolean theWithDestruction) +void Graphic3d_Structure::clear (const Standard_Boolean theWithDestruction) { if (IsDeleted()) return; @@ -204,10 +209,10 @@ } //============================================================================= -//function : Erase +//function : erase //purpose : //============================================================================= -void Graphic3d_Structure::Erase() +void Graphic3d_Structure::erase() { if (IsDeleted()) { @@ -429,7 +434,7 @@ } else { - Erase(); + erase(); myVisual = theVisual; SetComputeVisual (theVisual); Display(); @@ -667,7 +672,7 @@ //function : SetTransform //purpose : //============================================================================= -void Graphic3d_Structure::SetTransformation (const Handle(Geom_Transformation)& theTrsf) +void Graphic3d_Structure::SetTransformation (const Handle(TopLoc_Datum3D)& theTrsf) { if (IsDeleted()) return; @@ -676,7 +681,7 @@ if (!theTrsf.IsNull() && theTrsf->Trsf().Form() == gp_Identity) { - myCStructure->SetTransformation (Handle(Geom_Transformation)()); + myCStructure->SetTransformation (Handle(TopLoc_Datum3D)()); } else { @@ -1027,3 +1032,31 @@ myStructureManager->ChangeZLayer (this, theLayerId); myCStructure->SetZLayer (theLayerId); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Graphic3d_Structure::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myStructureManager) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myCStructure.get()) + + for (NCollection_IndexedMap::Iterator anIter (myAncestors); anIter.More(); anIter.Next()) + { + Graphic3d_Structure* anAncestor = anIter.Value(); + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, anAncestor) + } + + for (NCollection_IndexedMap::Iterator anIter (myDescendants); anIter.More(); anIter.Next()) + { + Graphic3d_Structure* aDescendant = anIter.Value(); + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, aDescendant) + } + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myOwner) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myVisual) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myComputeVisual) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Structure.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Structure.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Structure.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Structure.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -66,7 +66,10 @@ //! The structure itself is conserved. //! The transformation and the attributes of are conserved. //! The childs of are conserved. - Standard_EXPORT virtual void Clear (const Standard_Boolean WithDestruction = Standard_True); + virtual void Clear (const Standard_Boolean WithDestruction = Standard_True) + { + clear (WithDestruction); + } //! Suppresses the structure . //! It will be erased at the next screen update. @@ -78,9 +81,8 @@ //! Returns the current display priority for this structure. Standard_Integer DisplayPriority() const { return myCStructure->Priority; } - //! Erases the structure in all the views - //! of the visualiser. - Standard_EXPORT virtual void Erase(); + //! Erases this structure in all the views of the visualiser. + virtual void Erase() { erase(); } //! Highlights the structure in all the views with the given style //! @param theStyle [in] the style (type of highlighting: box/color, color and opacity) @@ -102,7 +104,10 @@ //! theXMin = theYMin = theZMin = RealFirst(). //! theXMax = theYMax = theZMax = RealLast(). //! By default, structure is created not infinite but empty. - void SetInfiniteState (const Standard_Boolean theToSet) { myCStructure->IsInfinite = theToSet ? 1 : 0; } + void SetInfiniteState (const Standard_Boolean theToSet) + { + if (!myCStructure.IsNull()) { myCStructure->IsInfinite = theToSet ? 1 : 0; } + } //! Modifies the order of displaying the structure. //! Values are between 0 and 10. @@ -138,7 +143,10 @@ //! Changes a sequence of clip planes slicing the structure on rendering. //! @param thePlanes [in] the set of clip planes. - void SetClipPlanes (const Handle(Graphic3d_SequenceOfHClipPlane)& thePlanes) { myCStructure->SetClipPlanes (thePlanes); } + void SetClipPlanes (const Handle(Graphic3d_SequenceOfHClipPlane)& thePlanes) + { + if (!myCStructure.IsNull()) { myCStructure->SetClipPlanes (thePlanes); } + } //! Get clip planes slicing the structure on rendering. //! @return set of clip planes. @@ -163,7 +171,10 @@ Standard_EXPORT void SetZoomLimit (const Standard_Real LimitInf, const Standard_Real LimitSup); //! Marks the structure representing wired structure needed for highlight only so it won't be added to BVH tree. - void SetIsForHighlight (const Standard_Boolean isForHighlight) { myCStructure->IsForHighlight = isForHighlight; } + void SetIsForHighlight (const Standard_Boolean isForHighlight) + { + if (!myCStructure.IsNull()) { myCStructure->IsForHighlight = isForHighlight; } + } //! Suppresses the highlight for the structure //! in all the views of the visualiser. @@ -173,38 +184,12 @@ { // } - - //! Returns the new Structure defined for the new visualization - virtual Handle(Graphic3d_Structure) Compute (const Handle(Graphic3d_DataStructureManager)& theProjector) - { - (void )theProjector; - return this; - } - - //! Returns the new Structure defined for the new visualization - virtual Handle(Graphic3d_Structure) Compute (const Handle(Graphic3d_DataStructureManager)& theProjector, - const Handle(Geom_Transformation)& theTrsf) - { - (void )theProjector; - (void )theTrsf; - return this; - } //! Returns the new Structure defined for the new visualization - virtual void Compute (const Handle(Graphic3d_DataStructureManager)& theProjector, - Handle(Graphic3d_Structure)& theStructure) - { - (void )theProjector; - (void )theStructure; - } - - //! Returns the new Structure defined for the new visualization - virtual void Compute (const Handle(Graphic3d_DataStructureManager)& theProjector, - const Handle(Geom_Transformation)& theTrsf, - Handle(Graphic3d_Structure)& theStructure) + virtual void computeHLR (const Handle(Graphic3d_Camera)& theProjector, + Handle(Graphic3d_Structure)& theStructure) { (void )theProjector; - (void )theTrsf; (void )theStructure; } @@ -246,7 +231,11 @@ Standard_Boolean IsDeleted() const { return myCStructure.IsNull(); } //! Returns the display indicator for this structure. - virtual Standard_Boolean IsDisplayed() const { return myCStructure->stick != 0; } + virtual Standard_Boolean IsDisplayed() const + { + return !myCStructure.IsNull() + && myCStructure->stick != 0; + } //! Returns Standard_True if the structure is empty. //! Warning: A structure is empty if : @@ -263,17 +252,26 @@ } //! Returns the highlight indicator for this structure. - virtual Standard_Boolean IsHighlighted() const { return myCStructure->highlight != 0; } + virtual Standard_Boolean IsHighlighted() const + { + return !myCStructure.IsNull() + && myCStructure->highlight != 0; + } //! Returns TRUE if the structure is transformed. Standard_Boolean IsTransformed() const { - return !myCStructure->Transformation().IsNull() - && myCStructure->Transformation()->Form() != gp_Identity; + return !myCStructure.IsNull() + && !myCStructure->Transformation().IsNull() + && myCStructure->Transformation()->Form() != gp_Identity; } //! Returns the visibility indicator for this structure. - Standard_Boolean IsVisible() const { return myCStructure->visible != 0; } + Standard_Boolean IsVisible() const + { + return !myCStructure.IsNull() + && myCStructure->visible != 0; + } //! Returns the coordinates of the boundary box of the structure . //! If is TRUE, the method returns actual graphical @@ -358,7 +356,10 @@ Standard_Address Owner() const { return myOwner; } - void SetHLRValidation (const Standard_Boolean theFlag) { myCStructure->HLRValidation = theFlag ? 1 : 0; } + void SetHLRValidation (const Standard_Boolean theFlag) + { + if (!myCStructure.IsNull()) { myCStructure->HLRValidation = theFlag ? 1 : 0; } + } //! Hidden parts stored in this structure are valid if: //! 1) the owner is defined. @@ -370,13 +371,13 @@ } //! Return local transformation. - const Handle(Geom_Transformation)& Transformation() const { return myCStructure->Transformation(); } + const Handle(TopLoc_Datum3D)& Transformation() const { return myCStructure->Transformation(); } //! Modifies the current local transformation - Standard_EXPORT void SetTransformation (const Handle(Geom_Transformation)& theTrsf); + Standard_EXPORT void SetTransformation (const Handle(TopLoc_Datum3D)& theTrsf); Standard_DEPRECATED("This method is deprecated - SetTransformation() should be called instead") - void Transform (const Handle(Geom_Transformation)& theTrsf) { SetTransformation (theTrsf); } + void Transform (const Handle(TopLoc_Datum3D)& theTrsf) { SetTransformation (theTrsf); } //! Modifies the current transform persistence (pan, zoom or rotate) Standard_EXPORT void SetTransformPersistence (const Handle(Graphic3d_TransformPers)& theTrsfPers); @@ -385,23 +386,39 @@ const Handle(Graphic3d_TransformPers)& TransformPersistence() const { return myCStructure->TransformPersistence(); } //! Sets if the structure location has mutable nature (content or location will be changed regularly). - void SetMutable (const Standard_Boolean theIsMutable) { myCStructure->IsMutable = theIsMutable; } - + void SetMutable (const Standard_Boolean theIsMutable) + { + if (!myCStructure.IsNull()) { myCStructure->IsMutable = theIsMutable; } + } + //! Returns true if structure has mutable nature (content or location are be changed regularly). //! Mutable structure will be managed in different way than static onces. - Standard_Boolean IsMutable() const { return myCStructure->IsMutable; } - + Standard_Boolean IsMutable() const + { + return !myCStructure.IsNull() + && myCStructure->IsMutable; + } + Graphic3d_TypeOfStructure ComputeVisual() const { return myComputeVisual; } - + //! Clears the structure . Standard_EXPORT void GraphicClear (const Standard_Boolean WithDestruction); - - void GraphicConnect (const Handle(Graphic3d_Structure)& theDaughter) { myCStructure->Connect (*theDaughter->myCStructure); } - - void GraphicDisconnect (const Handle(Graphic3d_Structure)& theDaughter) { myCStructure->Disconnect (*theDaughter->myCStructure); } + + void GraphicConnect (const Handle(Graphic3d_Structure)& theDaughter) + { + if (!myCStructure.IsNull()) { myCStructure->Connect (*theDaughter->myCStructure); } + } + + void GraphicDisconnect (const Handle(Graphic3d_Structure)& theDaughter) + { + if (!myCStructure.IsNull()) { myCStructure->Disconnect (*theDaughter->myCStructure); } + } //! Internal method which sets new transformation without calling graphic manager callbacks. - void GraphicTransform (const Handle(Geom_Transformation)& theTrsf) { myCStructure->SetTransformation (theTrsf); } + void GraphicTransform (const Handle(TopLoc_Datum3D)& theTrsf) + { + if (!myCStructure.IsNull()) { myCStructure->SetTransformation (theTrsf); } + } //! Returns the identification number of this structure. Standard_Integer Identification() const { return myCStructure->Id; } @@ -432,6 +449,9 @@ //! Returns the low-level structure const Handle(Graphic3d_CStructure)& CStructure() const { return myCStructure; } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: //! Transforms boundaries with transformation. @@ -451,6 +471,12 @@ //! Removes the given ancestor structure. Standard_EXPORT Standard_Boolean RemoveAncestor (Graphic3d_Structure* theAncestor); + //! Clears all the groups of primitives in the structure. + Standard_EXPORT void clear (const Standard_Boolean WithDestruction); + + //! Erases this structure in all the views of the visualiser. + Standard_EXPORT void erase(); + private: //! Suppress in the structure , the group theGroup. diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_StructureManager.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_StructureManager.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_StructureManager.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_StructureManager.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -407,7 +407,7 @@ // purpose : // ======================================================================== void Graphic3d_StructureManager::SetTransform (const Handle(Graphic3d_Structure)& theStructure, - const Handle(Geom_Transformation)& theTrsf) + const Handle(TopLoc_Datum3D)& theTrsf) { for (Graphic3d_IndexedMapOfView::Iterator aViewIt (myDefinedViews); aViewIt.More(); aViewIt.Next()) { @@ -446,3 +446,37 @@ aViewIt.Value()->ChangeZLayer (theStructure, theLayerId); } } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_StructureManager::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + for (Graphic3d_MapOfStructure::Iterator anIter (myDisplayedStructure); anIter.More(); anIter.Next()) + { + const Handle(Graphic3d_Structure)& aDisplayedStructure = anIter.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aDisplayedStructure.get()) + } + for (Graphic3d_MapOfStructure::Iterator anIter (myHighlightedStructure); anIter.More(); anIter.Next()) + { + const Handle(Graphic3d_Structure)& aHighlightedStructure = anIter.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aHighlightedStructure.get()) + } + for (Graphic3d_MapOfObject::Iterator anIter (myRegisteredObjects); anIter.More(); anIter.Next()) + { + const Handle(Graphic3d_ViewAffinity)& aRegisteredObject = anIter.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aRegisteredObject.get()) + } + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myGraphicDriver.get()) + for (Graphic3d_IndexedMapOfView::Iterator anIter (myDefinedViews); anIter.More(); anIter.Next()) + { + Graphic3d_CView* aDefinedView = anIter.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aDefinedView) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDeviceLostFlag) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_StructureManager.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_StructureManager.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_StructureManager.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_StructureManager.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -109,7 +109,7 @@ Standard_EXPORT virtual void Highlight (const Handle(Graphic3d_Structure)& theStructure); //! Transforms the structure. - Standard_EXPORT virtual void SetTransform (const Handle(Graphic3d_Structure)& theStructure, const Handle(Geom_Transformation)& theTrsf); + Standard_EXPORT virtual void SetTransform (const Handle(Graphic3d_Structure)& theStructure, const Handle(TopLoc_Datum3D)& theTrsf); //! Changes the display priority of the structure . Standard_EXPORT virtual void ChangeDisplayPriority (const Handle(Graphic3d_Structure)& theStructure, const Standard_Integer theOldPriority, const Standard_Integer theNewPriority); @@ -162,6 +162,9 @@ //! Sets Device Lost flag. void SetDeviceLost() { myDeviceLostFlag = Standard_True; } + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Text.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Text.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Text.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Text.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -31,6 +32,7 @@ //! - text formatter. Formatter contains text, height and alignment parameter. //! //! This class also has parameters of the text height and H/V alignments. +//! Custom formatting is available using Font_TextFormatter. class Graphic3d_Text : public Standard_Transient { DEFINE_STANDARD_RTTIEXT(Graphic3d_Text, Standard_Transient) @@ -55,6 +57,12 @@ //! Sets text value. void SetText (Standard_CString theText) { myText = theText; } + //! @return text formatter; NULL by default, which means standard text formatter will be used. + const Handle(Font_TextFormatter)& TextFormatter() const { return myFormatter; } + + //! Setup text default formatter for text within this context. + void SetTextFormatter (const Handle(Font_TextFormatter)& theFormatter) { myFormatter = theFormatter; } + //! The 3D point of attachment is projected. //! If the orientation is defined, the text is written in the plane of projection. const gp_Pnt& Position() const { return myOrientation.Location(); } @@ -99,6 +107,8 @@ void SetVerticalAlignment (const Graphic3d_VerticalTextAlignment theJustification) { myVAlign = theJustification; } protected: + Handle(Font_TextFormatter) myFormatter; //!< text formatter + NCollection_String myText; //!< text value gp_Ax2 myOrientation; //!< Text orientation in 3D space. diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureMap.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureMap.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureMap.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureMap.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,98 +17,63 @@ #ifndef _Graphic3d_TextureMap_HeaderFile #define _Graphic3d_TextureMap_HeaderFile -#include -#include - #include #include -#include #include class TCollection_AsciiString; - -class Graphic3d_TextureMap; -DEFINE_STANDARD_HANDLE(Graphic3d_TextureMap, Graphic3d_TextureRoot) - //! This is an abstract class for managing texture applyable on polygons. class Graphic3d_TextureMap : public Graphic3d_TextureRoot { - + DEFINE_STANDARD_RTTIEXT(Graphic3d_TextureMap, Graphic3d_TextureRoot) public: - - //! enable texture smoothing Standard_EXPORT void EnableSmooth(); - //! Returns TRUE if the texture is smoothed. Standard_EXPORT Standard_Boolean IsSmoothed() const; - //! disable texture smoothing Standard_EXPORT void DisableSmooth(); - - //! enable texture modulate mode. + //! enable texture modulate mode. //! the image is modulate with the shading of the surface. Standard_EXPORT void EnableModulate(); - //! disable texture modulate mode. //! the image is directly decal on the surface. Standard_EXPORT void DisableModulate(); - //! Returns TRUE if the texture is modulate. Standard_EXPORT Standard_Boolean IsModulate() const; - //! use this methods if you want to enable //! texture repetition on your objects. Standard_EXPORT void EnableRepeat(); - //! use this methods if you want to disable //! texture repetition on your objects. Standard_EXPORT void DisableRepeat(); - //! Returns TRUE if the texture repeat is enable. Standard_EXPORT Standard_Boolean IsRepeat() const; - - //! @return level of anisontropy texture filter. + + //! @return level of anisotropy texture filter. //! Default value is Graphic3d_LOTA_OFF. Standard_EXPORT Graphic3d_LevelOfTextureAnisotropy AnisoFilter() const; - - //! @param theLevel level of anisontropy texture filter. - Standard_EXPORT void SetAnisoFilter (const Graphic3d_LevelOfTextureAnisotropy theLevel); - - - - DEFINE_STANDARD_RTTIEXT(Graphic3d_TextureMap,Graphic3d_TextureRoot) + //! @param theLevel level of anisotropy texture filter. + Standard_EXPORT void SetAnisoFilter (const Graphic3d_LevelOfTextureAnisotropy theLevel); protected: - Standard_EXPORT Graphic3d_TextureMap(const TCollection_AsciiString& theFileName, const Graphic3d_TypeOfTexture theType); Standard_EXPORT Graphic3d_TextureMap(const Handle(Image_PixMap)& thePixMap, const Graphic3d_TypeOfTexture theType); - - -private: - - - - }; - - - - - +DEFINE_STANDARD_HANDLE(Graphic3d_TextureMap, Graphic3d_TextureRoot) #endif // _Graphic3d_TextureMap_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureParams.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureParams.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureParams.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureParams.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,6 +29,8 @@ myFilter (Graphic3d_TOTF_NEAREST), myAnisoLevel (Graphic3d_LOTA_OFF), myGenMode (Graphic3d_TOTM_MANUAL), + myBaseLevel (0), + myMaxLevel (1000), myRotAngle (0.0f), myToModulate (Standard_False), myToRepeat (Standard_False) diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureParams.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureParams.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureParams.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureParams.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -72,22 +72,22 @@ //! @param theLevel level of anisontropy texture filter. Standard_EXPORT void SetAnisoFilter (const Graphic3d_LevelOfTextureAnisotropy theLevel); - //! @return rotation angle in degrees - //! Default value is 0. + //! Return rotation angle in degrees; 0 by default. + //! Complete transformation matrix: Rotation -> Translation -> Scale. Standard_ShortReal Rotation() const { return myRotAngle; } //! @param theAngleDegrees rotation angle. Standard_EXPORT void SetRotation (const Standard_ShortReal theAngleDegrees); - //! @return scale factor - //! Default value is no scaling (1.0; 1.0). + //! Return scale factor; (1.0; 1.0) by default, which means no scaling. + //! Complete transformation matrix: Rotation -> Translation -> Scale. const Graphic3d_Vec2& Scale() const { return myScale; } //! @param theScale scale factor. Standard_EXPORT void SetScale (const Graphic3d_Vec2 theScale); - - //! @return translation vector - //! Default value is no translation (0.0; 0.0). + + //! Return translation vector; (0.0; 0.0), which means no translation. + //! Complete transformation matrix: Rotation -> Translation -> Scale. const Graphic3d_Vec2& Translation() const { return myTranslation; } //! @param theVec translation vector. @@ -106,6 +106,22 @@ //! Setup texture coordinates generation mode. Standard_EXPORT void SetGenMode (const Graphic3d_TypeOfTextureMode theMode, const Graphic3d_Vec4 thePlaneS, const Graphic3d_Vec4 thePlaneT); + //! @return base texture mipmap level; 0 by default. + Standard_Integer BaseLevel() const { return myBaseLevel; } + + //! Return maximum texture mipmap array level; 1000 by default. + //! Real rendering limit will take into account mipmap generation flags and presence of mipmaps in loaded image. + Standard_Integer MaxLevel() const { return myMaxLevel; } + + //! Setups texture mipmap array levels range. + //! The lowest value will be the base level. + //! The remaining one will be the maximum level. + void SetLevelsRange (Standard_Integer theFirstLevel, Standard_Integer theSecondLevel = 0) + { + myMaxLevel = theFirstLevel > theSecondLevel ? theFirstLevel : theSecondLevel; + myBaseLevel = theFirstLevel > theSecondLevel ? theSecondLevel : theFirstLevel; + } + //! Return modification counter of parameters related to sampler state. unsigned int SamplerRevision() const { return mySamplerRevision; } @@ -125,6 +141,8 @@ Graphic3d_TypeOfTextureFilter myFilter; //!< texture filter, Graphic3d_TOTF_NEAREST by default Graphic3d_LevelOfTextureAnisotropy myAnisoLevel; //!< level of anisotropy filter, Graphic3d_LOTA_OFF by default Graphic3d_TypeOfTextureMode myGenMode; //!< texture coordinates generation mode, Graphic3d_TOTM_MANUAL by default + Standard_Integer myBaseLevel; //!< base texture mipmap level (0 by default) + Standard_Integer myMaxLevel; //!< maximum texture mipmap array level (1000 by default) Standard_ShortReal myRotAngle; //!< texture coordinates rotation angle in degrees, 0 by default Standard_Boolean myToModulate; //!< flag to modulate texture with material color, FALSE by default Standard_Boolean myToRepeat; //!< flag to repeat (true) or wrap (false) texture coordinates out of [0,1] range diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureRoot.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureRoot.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureRoot.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureRoot.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,9 +19,12 @@ #include #include #include +#include +#include #include #include #include +#include #include #include @@ -89,7 +92,9 @@ : myParams (new Graphic3d_TextureParams()), myPath (theFileName), myRevision (0), - myType (theType) + myType (theType), + myIsColorMap (true), + myIsTopDown (true) { generateId(); } @@ -103,7 +108,9 @@ : myParams (new Graphic3d_TextureParams()), myPixMap (thePixMap), myRevision (0), - myType (theType) + myType (theType), + myIsColorMap (true), + myIsTopDown (true) { generateId(); } @@ -128,14 +135,56 @@ } // ======================================================================= +// function : GetCompressedImage +// purpose : +// ======================================================================= +Handle(Image_CompressedPixMap) Graphic3d_TextureRoot::GetCompressedImage (const Handle(Image_SupportedFormats)& theSupported) +{ + if (!myPixMap.IsNull()) + { + return Handle(Image_CompressedPixMap)(); + } + + // Case 2: texture source is specified as path + TCollection_AsciiString aFilePath; + myPath.SystemName (aFilePath); + if (aFilePath.IsEmpty()) + { + return Handle(Image_CompressedPixMap)(); + } + + TCollection_AsciiString aFilePathLower = aFilePath; + aFilePathLower.LowerCase(); + if (!aFilePathLower.EndsWith (".dds")) + { + // do not waste time on file system access in case of wrong file extension + return Handle(Image_CompressedPixMap)(); + } + + if (Handle(Image_CompressedPixMap) anImage = Image_DDSParser::Load (theSupported, aFilePath, 0)) + { + myIsTopDown = anImage->IsTopDown(); + return anImage; + } + return Handle(Image_CompressedPixMap)(); +} + +// ======================================================================= // function : GetImage // purpose : // ======================================================================= -Handle(Image_PixMap) Graphic3d_TextureRoot::GetImage() const +Handle(Image_PixMap) Graphic3d_TextureRoot::GetImage (const Handle(Image_SupportedFormats)& theSupported) { + if (Handle(Image_PixMap) anOldImage = GetImage()) + { + myIsTopDown = anOldImage->IsTopDown(); + return anOldImage; // compatibility with old API + } + // Case 1: texture source is specified as pixmap if (!myPixMap.IsNull()) { + myIsTopDown = myPixMap->IsTopDown(); return myPixMap; } @@ -148,12 +197,38 @@ } Handle(Image_AlienPixMap) anImage = new Image_AlienPixMap(); - if (!anImage->Load (aFilePath)) + if (anImage->Load (aFilePath)) { - return Handle(Image_PixMap)(); + myIsTopDown = anImage->IsTopDown(); + convertToCompatible (theSupported, anImage); + return anImage; + } + + return Handle(Image_PixMap)(); +} + +// ======================================================================= +// function : convertToCompatible +// purpose : +// ======================================================================= +void Graphic3d_TextureRoot::convertToCompatible (const Handle(Image_SupportedFormats)& theSupported, + const Handle(Image_PixMap)& theImage) +{ + if (theSupported.IsNull() + || theSupported->IsSupported (theImage->Format()) + || theImage.IsNull()) + { + return; } - return anImage; + if ((theImage->Format() == Image_Format_BGR32 + || theImage->Format() == Image_Format_BGR32)) + { + Image_PixMap::SwapRgbaBgra (*theImage); + theImage->SetFormat (theImage->Format() == Image_Format_BGR32 + ? Image_Format_RGB32 + : Image_Format_RGBA); + } } // ======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureRoot.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureRoot.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureRoot.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureRoot.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,8 @@ #include #include +class Image_CompressedPixMap; +class Image_SupportedFormats; class Graphic3d_TextureParams; //! This is the texture root class enable the dialog with the GraphicDriver allows the loading of texture. @@ -80,17 +82,40 @@ void UpdateRevision() { ++myRevision; } //! This method will be called by graphic driver each time when texture resource should be created. + //! It is called in front of GetImage() for uploading compressed image formats natively supported by GPU. + //! @param theSupported [in] the list of supported compressed texture formats; + //! returning image in unsupported format will result in texture upload failure + //! @return compressed pixmap or NULL if image is not in supported compressed format + Standard_EXPORT virtual Handle(Image_CompressedPixMap) GetCompressedImage (const Handle(Image_SupportedFormats)& theSupported); + + //! This method will be called by graphic driver each time when texture resource should be created. //! Default constructors allow defining the texture source as path to texture image or directly as pixmap. //! If the source is defined as path, then the image will be dynamically loaded when this method is called //! (and no copy will be preserved in this class instance). //! Inheritors may dynamically generate the image. //! Notice, image data should be in Bottom-Up order (see Image_PixMap::IsTopDown())! //! @return the image for texture. - Standard_EXPORT virtual Handle(Image_PixMap) GetImage() const; + Standard_EXPORT virtual Handle(Image_PixMap) GetImage (const Handle(Image_SupportedFormats)& theSupported); //! @return low-level texture parameters const Handle(Graphic3d_TextureParams)& GetParams() const { return myParams; } + //! Return flag indicating color nature of values within the texture; TRUE by default. + //! + //! This flag will be used to interpret 8-bit per channel RGB(A) images as sRGB(A) textures + //! with implicit linearizion of color components. + //! Has no effect on images with floating point values (always considered linearized). + //! + //! When set to FALSE, such images will be interpreted as textures will be linear component values, + //! which is useful for RGB(A) textures defining non-color properties (like Normalmap/Metalness/Roughness). + Standard_Boolean IsColorMap() const { return myIsColorMap; } + + //! Set flag indicating color nature of values within the texture. + void SetColorMap (Standard_Boolean theIsColor) { myIsColorMap = theIsColor; } + + //! Returns whether row's memory layout is top-down. + Standard_Boolean IsTopDown() const { return myIsTopDown; } + protected: //! Creates a texture from a file @@ -106,14 +131,24 @@ //! Unconditionally generate new texture id. Should be called only within constructor. Standard_EXPORT void generateId(); + //! Try converting image to compatible format. + Standard_EXPORT static void convertToCompatible (const Handle(Image_SupportedFormats)& theSupported, + const Handle(Image_PixMap)& theImage); + + //! Method for supporting old API; another GetImage() method should be implemented instead. + virtual Handle(Image_PixMap) GetImage() const { return Handle(Image_PixMap)(); } + protected: - Handle(Graphic3d_TextureParams) myParams; //!< associated texture parameters - TCollection_AsciiString myTexId; //!< unique identifier of this resource (for sharing graphic resource); should never be modified outside constructor - Handle(Image_PixMap) myPixMap; //!< image pixmap - as one of the ways for defining the texture source - OSD_Path myPath; //!< image file path - as one of the ways for defining the texture source - Standard_Size myRevision; //!< image revision - for signaling changes in the texture source (e.g. file update, pixmap update) - Graphic3d_TypeOfTexture myType; //!< texture type + Handle(Graphic3d_TextureParams) myParams; //!< associated texture parameters + TCollection_AsciiString myTexId; //!< unique identifier of this resource (for sharing graphic resource); should never be modified outside constructor + Handle(Image_PixMap) myPixMap; //!< image pixmap - as one of the ways for defining the texture source + OSD_Path myPath; //!< image file path - as one of the ways for defining the texture source + Standard_Size myRevision; //!< image revision - for signaling changes in the texture source (e.g. file update, pixmap update) + Graphic3d_TypeOfTexture myType; //!< texture type + Standard_Boolean myIsColorMap; //!< flag indicating color nature of values within the texture + Standard_Boolean myIsTopDown; //!< Stores rows's memory layout + }; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureSetBits.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureSetBits.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureSetBits.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureSetBits.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,30 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Graphic3d_TextureSetBits_HeaderFile +#define _Graphic3d_TextureSetBits_HeaderFile + +#include + +//! Standard texture units combination bits. +enum Graphic3d_TextureSetBits +{ + Graphic3d_TextureSetBits_NONE = 0, + Graphic3d_TextureSetBits_BaseColor = (unsigned int )(1 << int(Graphic3d_TextureUnit_BaseColor)), + Graphic3d_TextureSetBits_Emissive = (unsigned int )(1 << int(Graphic3d_TextureUnit_Emissive)), + Graphic3d_TextureSetBits_Occlusion = (unsigned int )(1 << int(Graphic3d_TextureUnit_Occlusion)), + Graphic3d_TextureSetBits_Normal = (unsigned int )(1 << int(Graphic3d_TextureUnit_Normal)), + Graphic3d_TextureSetBits_MetallicRoughness = (unsigned int )(1 << int(Graphic3d_TextureUnit_MetallicRoughness)), +}; + +#endif // _Graphic3d_TextureSetBits_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureSet.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureSet.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,7 @@ #include //! Class holding array of textures to be mapped as a set. +//! Textures should be defined in ascending order of texture units within the set. class Graphic3d_TextureSet : public Standard_Transient { DEFINE_STANDARD_RTTIEXT(Graphic3d_TextureSet, Standard_Transient) diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureUnit.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureUnit.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TextureUnit.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TextureUnit.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,17 +35,54 @@ Graphic3d_TextureUnit_14, Graphic3d_TextureUnit_15, - Graphic3d_TextureUnit_BaseColor = Graphic3d_TextureUnit_0, //!< base color of the material - //Graphic3d_TextureUnit_Normal = Graphic3d_TextureUnit_1, //!< tangent space normal map - //Graphic3d_TextureUnit_MetallicRoughness = Graphic3d_TextureUnit_2, //!< metalness+roughness of the material - //Graphic3d_TextureUnit_Emissive = Graphic3d_TextureUnit_3, //!< emissive map controls the color and intensity of the light being emitted by the material - //Graphic3d_TextureUnit_Occlusion = Graphic3d_TextureUnit_4, //!< occlusion map indicating areas of indirect lighting + // aliases - Graphic3d_TextureUnit_EnvMap = Graphic3d_TextureUnit_0 //!< environment cubemap for background + //! sampler2D occSamplerBaseColor. + //! RGB(A) base color of the material and alpha mask/opacity. + Graphic3d_TextureUnit_BaseColor = Graphic3d_TextureUnit_0, + //! sampler2D occSamplerEmissive. + //! RGB emissive map controls the color and intensity of the light being emitted by the material. + Graphic3d_TextureUnit_Emissive = Graphic3d_TextureUnit_1, + //! sampler2D occSamplerOcclusion. + //! Occlusion map indicating areas of indirect lighting. + //! Encoded into RED channel, with 1.0 meaning no occlusion (full color intensity) and 0.0 complete occlusion (black). + Graphic3d_TextureUnit_Occlusion = Graphic3d_TextureUnit_2, + //! sampler2D occSamplerNormal. + //! XYZ tangent space normal map. + Graphic3d_TextureUnit_Normal = Graphic3d_TextureUnit_3, + //! sampler2D occSamplerMetallicRoughness. + //! Metalness + roughness of the material. + //! Encoded into GREEN (roughness) + BLUE (metallic) channels, + //! so that it can be optionally combined with occlusion texture (RED channel). + Graphic3d_TextureUnit_MetallicRoughness = Graphic3d_TextureUnit_4, + + //! samplerCube occSampler0. + //! Environment cubemap for background. Rendered by dedicated program and normally occupies first texture unit. + Graphic3d_TextureUnit_EnvMap = Graphic3d_TextureUnit_0, + + //! sampler2D occSamplerPointSprite. + //! Sprite alpha-mask or RGBA image mapped using point UV, additional to BaseColor (mapping using vertex UV). + //! This texture unit is set Graphic3d_TextureUnit_1, so that it can be combined with Graphic3d_TextureUnit_BaseColor, + //! while other texture maps (normal map and others) are unexpected and unsupported for points. + //! Note that it can be overridden to Graphic3d_TextureUnit_0 for FFP fallback on hardware without multi-texturing. + Graphic3d_TextureUnit_PointSprite = Graphic3d_TextureUnit_1, + + //! sampler2D occEnvLUT. + //! Lookup table for approximated PBR environment lighting. + //! Configured as index at the end of available texture units - 3. + Graphic3d_TextureUnit_PbrEnvironmentLUT = -3, + //! sampler2D occDiffIBLMapSHCoeffs. + //! Diffuse (irradiance) IBL map's spherical harmonics coefficients baked for PBR from environment cubemap image. + //! Configured as index at the end of available texture units - 2. + Graphic3d_TextureUnit_PbrIblDiffuseSH = -2, + //! samplerCube occSpecIBLMap. + //! Specular IBL (Image-Based Lighting) environment map baked for PBR from environment cubemap image. + //! Configured as index at the end of available texture units - 1. + Graphic3d_TextureUnit_PbrIblSpecular = -1, }; enum { - Graphic3d_TextureUnit_NB = Graphic3d_TextureUnit_15 + 1 + Graphic3d_TextureUnit_NB = Graphic3d_TextureUnit_15 + 1, }; #endif // _Graphic3d_TextureUnit_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TransformPers.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TransformPers.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TransformPers.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TransformPers.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,3 +51,38 @@ } return aTrsfPers; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_TransformPers::PersParams3d::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + gp_Pnt anAttachPoint (PntX, PntY, PntZ); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &anAttachPoint) +} + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_TransformPers::PersParams2d::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, OffsetX) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, OffsetY) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, Corner) +} + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_TransformPers::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMode) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myParams.Params3d) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myParams.Params2d) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TransformPers.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TransformPers.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TransformPers.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TransformPers.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -283,6 +283,9 @@ const Standard_Integer theViewportWidth, const Standard_Integer theViewportHeight) const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + private: //! 3D anchor point for zoom/rotate transformation persistence. @@ -291,6 +294,9 @@ Standard_Real PntX; Standard_Real PntY; Standard_Real PntZ; + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; }; //! 2d/trihedron transformation persistence parameters. @@ -299,6 +305,9 @@ Standard_Integer OffsetX; Standard_Integer OffsetY; Aspect_TypeOfTriedronPosition Corner; + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; }; private: @@ -355,7 +364,7 @@ { const Standard_Real anOffsetX = (Standard_Real(myParams.Params2d.OffsetX) + aJitterComp) * aScale; const gp_Dir aSide = aForward.Crossed (theCamera->Up()); - const gp_XYZ aDeltaX = aSide.XYZ() * (Abs(aViewDim.X()) * 0.5 - anOffsetX); + const gp_XYZ aDeltaX = aSide.XYZ() * (Abs(aViewDim.X()) * theCamera->NDC2dOffsetX() - anOffsetX); if ((myParams.Params2d.Corner & Aspect_TOTP_RIGHT) != 0) { aCenter += aDeltaX; @@ -368,7 +377,7 @@ if ((myParams.Params2d.Corner & (Aspect_TOTP_TOP | Aspect_TOTP_BOTTOM)) != 0) { const Standard_Real anOffsetY = (Standard_Real(myParams.Params2d.OffsetY) + aJitterComp) * aScale; - const gp_XYZ aDeltaY = theCamera->Up().XYZ() * (Abs(aViewDim.Y()) * 0.5 - anOffsetY); + const gp_XYZ aDeltaY = theCamera->Up().XYZ() * (Abs(aViewDim.Y()) * theCamera->NDC2dOffsetY() - anOffsetY); if ((myParams.Params2d.Corner & Aspect_TOTP_TOP) != 0) { aCenter += aDeltaY; @@ -399,7 +408,7 @@ gp_XYZ aCenter (0.0, 0.0, -aFocus); if ((myParams.Params2d.Corner & (Aspect_TOTP_LEFT | Aspect_TOTP_RIGHT)) != 0) { - aCenter.SetX (-aViewDim.X() * 0.5 + (Standard_Real(myParams.Params2d.OffsetX) + aJitterComp) * aScale); + aCenter.SetX (-aViewDim.X() * theCamera->NDC2dOffsetX() + (Standard_Real(myParams.Params2d.OffsetX) + aJitterComp) * aScale); if ((myParams.Params2d.Corner & Aspect_TOTP_RIGHT) != 0) { aCenter.SetX (-aCenter.X()); @@ -407,7 +416,7 @@ } if ((myParams.Params2d.Corner & (Aspect_TOTP_TOP | Aspect_TOTP_BOTTOM)) != 0) { - aCenter.SetY (-aViewDim.Y() * 0.5 + (Standard_Real(myParams.Params2d.OffsetY) + aJitterComp) * aScale); + aCenter.SetY (-aViewDim.Y() * theCamera->NDC2dOffsetY() + (Standard_Real(myParams.Params2d.OffsetY) + aJitterComp) * aScale); if ((myParams.Params2d.Corner & Aspect_TOTP_TOP) != 0) { aCenter.SetY (-aCenter.Y()); diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TypeOfLimit.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TypeOfLimit.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TypeOfLimit.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TypeOfLimit.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,10 +25,12 @@ Graphic3d_TypeOfLimit_MaxViewDumpSizeY, //!< maximum height for image dump Graphic3d_TypeOfLimit_MaxCombinedTextureUnits, //!< maximum number of combined texture units for multitexturing Graphic3d_TypeOfLimit_MaxMsaa, //!< maximum number of MSAA samples + Graphic3d_TypeOfLimit_HasPBR, //!< indicates whether PBR metallic-roughness shading model is supported Graphic3d_TypeOfLimit_HasRayTracing, //!< indicates whether ray tracing is supported Graphic3d_TypeOfLimit_HasRayTracingTextures, //!< indicates whether ray tracing textures are supported Graphic3d_TypeOfLimit_HasRayTracingAdaptiveSampling, //!< indicates whether adaptive screen sampling is supported Graphic3d_TypeOfLimit_HasRayTracingAdaptiveSamplingAtomic,//!< indicates whether optimized adaptive screen sampling is supported (hardware supports atomic float operations) + Graphic3d_TypeOfLimit_HasSRGB, //!< indicates whether sRGB rendering is supported Graphic3d_TypeOfLimit_HasBlendedOit, //!< indicates whether necessary GL extensions for Weighted, Blended OIT available (without MSAA). Graphic3d_TypeOfLimit_HasBlendedOitMsaa, //!< indicates whether necessary GL extensions for Weighted, Blended OIT available (with MSAA). Graphic3d_TypeOfLimit_HasFlatShading, //!< indicates whether Flat shading (Graphic3d_TOSM_FACET) is supported diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TypeOfShadingModel.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TypeOfShadingModel.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_TypeOfShadingModel.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_TypeOfShadingModel.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,6 +46,12 @@ //! Shading model requires normals to be defined within vertex attributes. Graphic3d_TOSM_FRAGMENT, + //! Metallic-roughness physically based (PBR) illumination system. + Graphic3d_TOSM_PBR, + + //! Same as Graphic3d_TOSM_PBR but using flat per-triangle normal. + Graphic3d_TOSM_PBR_FACET, + // obsolete aliases Graphic3d_TOSM_NONE = Graphic3d_TOSM_UNLIT, V3d_COLOR = Graphic3d_TOSM_NONE, @@ -57,7 +63,7 @@ enum { //! Auxiliary value defining the overall number of values in enumeration Graphic3d_TypeOfShadingModel - Graphic3d_TypeOfShadingModel_NB = Graphic3d_TOSM_FRAGMENT + 1 + Graphic3d_TypeOfShadingModel_NB = Graphic3d_TOSM_PBR_FACET + 1 }; #endif // _Graphic3d_TypeOfShadingModel_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Vertex.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Vertex.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Vertex.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Vertex.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,9 +15,22 @@ #include +#include +#include + Standard_ShortReal Graphic3d_Vertex::Distance(const Graphic3d_Vertex& AOther) const { return sqrt( (X() - AOther.X()) * (X() - AOther.X()) + (Y() - AOther.Y()) * (Y() - AOther.Y()) + (Z() - AOther.Z()) * (Z() - AOther.Z()) ); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_Vertex::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + gp_XYZ aCoord (xyz[0], xyz[1], xyz[2]); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &aCoord) +} diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Vertex.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Vertex.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_Vertex.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_Vertex.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,12 +35,6 @@ SetCoord (0.0f, 0.0f, 0.0f); } - //! Creates a point with coordinates identical to thePoint. - Graphic3d_Vertex (const Graphic3d_Vertex& thePoint) - { - SetCoord (thePoint.X(), thePoint.Y(), thePoint.Z()); - } - //! Creates a point with theX, theY and theZ coordinates. Graphic3d_Vertex (const Standard_ShortReal theX, const Standard_ShortReal theY, @@ -108,6 +102,9 @@ //! Returns the distance between two points. Standard_EXPORT Standard_ShortReal Distance (const Graphic3d_Vertex& theOther) const; + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; float xyz[3]; diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ViewAffinity.cxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ViewAffinity.cxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ViewAffinity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ViewAffinity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,6 +15,17 @@ #include +#include +IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_ViewAffinity,Standard_Transient) -IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_ViewAffinity,Standard_Transient) \ No newline at end of file +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Graphic3d_ViewAffinity::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMask) +} \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ViewAffinity.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ViewAffinity.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ViewAffinity.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ViewAffinity.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,6 +59,9 @@ } } + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + private: unsigned int myMask; //!< affinity mask diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_WorldViewProjState.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_WorldViewProjState.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_WorldViewProjState.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_WorldViewProjState.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -141,13 +141,13 @@ && myWorldViewState == theOther.myWorldViewState; } - //! Copy world view projection state. - void operator = (const Graphic3d_WorldViewProjState& theOther) + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - myIsValid = theOther.myIsValid; - myCamera = theOther.myCamera; - myProjectionState = theOther.myProjectionState; - myWorldViewState = theOther.myWorldViewState; + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsValid) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myCamera) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myProjectionState) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myWorldViewState) } private: diff -Nru opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ZLayerSettings.hxx opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ZLayerSettings.hxx --- opencascade-7.4.1+dfsg1/src/Graphic3d/Graphic3d_ZLayerSettings.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Graphic3d/Graphic3d_ZLayerSettings.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,10 +15,11 @@ #define _Graphic3d_ZLayerSettings_HeaderFile #include -#include +#include #include #include #include +#include #include enum Graphic3d_ZLayerSetting @@ -62,7 +63,7 @@ const gp_XYZ& Origin() const { return myOrigin; } //! Return the transformation to the origin. - const Handle(Geom_Transformation)& OriginTransformation() const { return myOriginTrsf; } + const Handle(TopLoc_Datum3D)& OriginTransformation() const { return myOriginTrsf; } //! Set the origin of all objects within the layer. void SetOrigin (const gp_XYZ& theOrigin) @@ -71,8 +72,9 @@ myOriginTrsf.Nullify(); if (!theOrigin.IsEqual (gp_XYZ(0.0, 0.0, 0.0), gp::Resolution())) { - myOriginTrsf = new Geom_Transformation(); - myOriginTrsf->SetTranslation (theOrigin); + gp_Trsf aTrsf; + aTrsf.SetTranslation (theOrigin); + myOriginTrsf = new TopLoc_Datum3D (aTrsf); } } @@ -208,11 +210,34 @@ myPolygonOffset.Units =-1.0f; } + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const + { + OCCT_DUMP_CLASS_BEGIN (theOStream, Graphic3d_ZLayerSettings) + + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myName) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myOriginTrsf.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myOrigin) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCullingDistance) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCullingSize) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPolygonOffset) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsImmediate) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToRaytrace) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUseEnvironmentTexture) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToEnableDepthTest) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToEnableDepthWrite) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToClearDepth) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToRenderInDepthPrepass) + } + protected: TCollection_AsciiString myName; //!< user-provided name Handle(Graphic3d_LightSet) myLights; //!< lights list - Handle(Geom_Transformation) myOriginTrsf; //!< transformation to the origin + Handle(TopLoc_Datum3D) myOriginTrsf; //!< transformation to the origin gp_XYZ myOrigin; //!< the origin of all objects within the layer Standard_Real myCullingDistance; //!< distance to discard objects Standard_Real myCullingSize; //!< size to discard objects diff -Nru opencascade-7.4.1+dfsg1/src/Hatch/Hatch_Line.cxx opencascade-7.5.1+dfsg1/src/Hatch/Hatch_Line.cxx --- opencascade-7.4.1+dfsg1/src/Hatch/Hatch_Line.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Hatch/Hatch_Line.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ //purpose : //======================================================================= Hatch_Line::Hatch_Line() +: myForm(Hatch_ANYLINE) { } diff -Nru opencascade-7.4.1+dfsg1/src/Hatch/Hatch_Parameter.cxx opencascade-7.5.1+dfsg1/src/Hatch/Hatch_Parameter.cxx --- opencascade-7.4.1+dfsg1/src/Hatch/Hatch_Parameter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Hatch/Hatch_Parameter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,10 @@ //purpose : //======================================================================= Hatch_Parameter::Hatch_Parameter() +: myPar1(0.0), + myStart(Standard_False), + myIndex(0), + myPar2(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/HatchGen/HatchGen_PointOnElement.cxx opencascade-7.5.1+dfsg1/src/HatchGen/HatchGen_PointOnElement.cxx --- opencascade-7.4.1+dfsg1/src/HatchGen/HatchGen_PointOnElement.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HatchGen/HatchGen_PointOnElement.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,24 +34,8 @@ // Purpose : Constructor. //======================================================================= -HatchGen_PointOnElement::HatchGen_PointOnElement (const HatchGen_PointOnElement& Point) -{ - myIndex = Point.myIndex ; - myParam = Point.myParam ; - myPosit = Point.myPosit ; - myBefore = Point.myBefore ; - myAfter = Point.myAfter ; - mySegBeg = Point.mySegBeg ; - mySegEnd = Point.mySegEnd ; - myType = Point.myType ; -} - -//======================================================================= -// Function : HatchGen_PointOnElement -// Purpose : Constructor. -//======================================================================= - HatchGen_PointOnElement::HatchGen_PointOnElement (const IntRes2d_IntersectionPoint& Point) +: myType(HatchGen_UNDETERMINED) { const IntRes2d_Transition& TrsH = Point.TransitionOfFirst() ; const IntRes2d_Transition& TrsE = Point.TransitionOfSecond() ; diff -Nru opencascade-7.4.1+dfsg1/src/HatchGen/HatchGen_PointOnElement.hxx opencascade-7.5.1+dfsg1/src/HatchGen/HatchGen_PointOnElement.hxx --- opencascade-7.4.1+dfsg1/src/HatchGen/HatchGen_PointOnElement.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HatchGen/HatchGen_PointOnElement.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,9 +40,6 @@ //! ---Purpose; Creates an empty point on element Standard_EXPORT HatchGen_PointOnElement(); - //! Creates a point from an other. - Standard_EXPORT HatchGen_PointOnElement(const HatchGen_PointOnElement& Point); - //! Creates a point from an intersection point. Standard_EXPORT HatchGen_PointOnElement(const IntRes2d_IntersectionPoint& Point); diff -Nru opencascade-7.4.1+dfsg1/src/HatchGen/HatchGen_PointOnHatching.cxx opencascade-7.5.1+dfsg1/src/HatchGen/HatchGen_PointOnHatching.cxx --- opencascade-7.4.1+dfsg1/src/HatchGen/HatchGen_PointOnHatching.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HatchGen/HatchGen_PointOnHatching.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,23 +39,6 @@ // Purpose : Constructor. //======================================================================= -HatchGen_PointOnHatching::HatchGen_PointOnHatching (const HatchGen_PointOnHatching& Point) -{ - myIndex = Point.myIndex ; - myParam = Point.myParam ; - myPosit = Point.myPosit ; - myBefore = Point.myBefore ; - myAfter = Point.myAfter ; - mySegBeg = Point.mySegBeg ; - mySegEnd = Point.mySegEnd ; - myPoints = Point.myPoints ; -} - -//======================================================================= -// Function : HatchGen_PointOnHatching -// Purpose : Constructor. -//======================================================================= - HatchGen_PointOnHatching::HatchGen_PointOnHatching (const IntRes2d_IntersectionPoint& Point) { myIndex = 0 ; diff -Nru opencascade-7.4.1+dfsg1/src/HatchGen/HatchGen_PointOnHatching.hxx opencascade-7.5.1+dfsg1/src/HatchGen/HatchGen_PointOnHatching.hxx --- opencascade-7.4.1+dfsg1/src/HatchGen/HatchGen_PointOnHatching.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HatchGen/HatchGen_PointOnHatching.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,10 +41,7 @@ //! Creates an empty point. Standard_EXPORT HatchGen_PointOnHatching(); - - //! Creates a point from an other. - Standard_EXPORT HatchGen_PointOnHatching(const HatchGen_PointOnHatching& Point); - + //! Creates a point from an intersection point. Standard_EXPORT HatchGen_PointOnHatching(const IntRes2d_IntersectionPoint& Point); diff -Nru opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_BiPoint.hxx opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_BiPoint.hxx --- opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_BiPoint.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_BiPoint.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,6 +34,19 @@ public: struct IndicesT { + IndicesT() + : ShapeIndex(-1), + FaceConex1(0), + Face1Pt1(0), + Face1Pt2(0), + FaceConex2(0), + Face2Pt1(0), + Face2Pt2(0), + MinSeg(0), + MaxSeg(0), + SegFlags(0) + { + } Standard_Integer ShapeIndex; Standard_Integer FaceConex1; Standard_Integer Face1Pt1; diff -Nru opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_EdgeIterator.cxx opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_EdgeIterator.cxx --- opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_EdgeIterator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_EdgeIterator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,18 @@ //purpose : //======================================================================= HLRAlgo_EdgeIterator::HLRAlgo_EdgeIterator () -{} +: myNbVis(0), + myNbHid(0), + EVis(NULL), + EHid(NULL), + iVis(0), + iHid(0), + myHidStart(0.0), + myHidEnd(0.0), + myHidTolStart(0.0), + myHidTolEnd(0.0) +{ +} //======================================================================= //function : InitHidden diff -Nru opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_Intersection.cxx opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_Intersection.cxx --- opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_Intersection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_Intersection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,7 +22,13 @@ //purpose : //======================================================================= HLRAlgo_Intersection::HLRAlgo_Intersection() -{} +: mySegIndex(0), + myIndex(0), + myLevel(0), + myParam(0.0), + myToler(0.0) +{ +} //======================================================================= //function : HLRAlgo_Intersection diff -Nru opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyAlgo.cxx opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyAlgo.cxx --- opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyAlgo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,6 +39,9 @@ //======================================================================= HLRAlgo_PolyAlgo::HLRAlgo_PolyAlgo () +: myNbrShell(0), + myCurShell(0), + myFound(Standard_False) { myTriangle.TolParam = 0.00000001; myTriangle.TolAng = 0.0001; diff -Nru opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyData.hxx opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyData.hxx --- opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,6 +43,14 @@ public: struct FaceIndices { + //! The default constructor. + FaceIndices() + : Index(0), + Min(0), + Max(0) + { + } + Standard_Integer Index, Min, Max; }; @@ -58,6 +66,12 @@ //! The default constructor. Box() + : XMin(0.0), + YMin(0.0), + ZMin(0.0), + XMax(0.0), + YMax(0.0), + ZMax(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyHidingData.hxx opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyHidingData.hxx --- opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyHidingData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyHidingData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,6 +38,7 @@ struct PlaneT { + PlaneT() : D(0.0) {} gp_XYZ Normal; Standard_Real D; }; diff -Nru opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyInternalNode.hxx opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyInternalNode.hxx --- opencascade-7.4.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyInternalNode.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRAlgo/HLRAlgo_PolyInternalNode.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,6 +41,12 @@ struct NodeData { + NodeData() + : PCu1(0.0), + PCu2(0.0), + Scal(0.0) + { + } gp_XYZ Point, Normal; gp_XY UV; Standard_Real PCu1, PCu2, Scal; diff -Nru opencascade-7.4.1+dfsg1/src/HLRBRep/FILES opencascade-7.5.1+dfsg1/src/HLRBRep/FILES --- opencascade-7.4.1+dfsg1/src/HLRBRep/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRBRep/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -74,7 +74,6 @@ HLRBRep_PCLocFOfTheLocateExtPCOfTheProjPCurOfCInter_0.cxx HLRBRep_PolyAlgo.cxx HLRBRep_PolyAlgo.hxx -HLRBRep_PolyAlgo.lxx HLRBRep_PolyHLRToShape.cxx HLRBRep_PolyHLRToShape.hxx HLRBRep_PolyHLRToShape.lxx diff -Nru opencascade-7.4.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.cxx opencascade-7.5.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.cxx --- opencascade-7.4.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -78,7 +78,6 @@ HLRBRep_PolyAlgo::HLRBRep_PolyAlgo () : myDebug (Standard_False), -myAngle (5 * M_PI / 180.), myTolSta (0.1), myTolEnd (0.9), myTolAngular(0.001) @@ -94,7 +93,6 @@ HLRBRep_PolyAlgo::HLRBRep_PolyAlgo (const Handle(HLRBRep_PolyAlgo)& A) { myDebug = A->Debug(); - myAngle = A->Angle(); myTolAngular = A->TolAngular(); myTolSta = A->TolCoef(); myTolEnd = 1 - myTolSta; @@ -114,7 +112,6 @@ HLRBRep_PolyAlgo::HLRBRep_PolyAlgo (const TopoDS_Shape& S) : myDebug (Standard_False), -myAngle (5 * M_PI / 180.), myTolSta (0.1), myTolEnd (0.9), myTolAngular(0.001) diff -Nru opencascade-7.4.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.hxx opencascade-7.5.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.hxx --- opencascade-7.4.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,42 +17,31 @@ #ifndef _HLRBRep_PolyAlgo_HeaderFile #define _HLRBRep_PolyAlgo_HeaderFile -#include - +#include +#include +#include +#include #include #include #include -#include -#include - +#include +#include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#include +#include +#include #include -#include +#include +#include -class HLRAlgo_PolyAlgo; class Geom_Surface; -class Standard_OutOfRange; -class TopoDS_Shape; class HLRAlgo_Projector; class TopoDS_Edge; class HLRAlgo_PolyInternalData; class HLRAlgo_EdgeStatus; struct HLRAlgo_TriangleData; - class HLRBRep_PolyAlgo; DEFINE_STANDARD_HANDLE(HLRBRep_PolyAlgo, Standard_Transient) @@ -122,8 +111,8 @@ Standard_EXPORT HLRBRep_PolyAlgo(const TopoDS_Shape& S); - Standard_Integer NbShapes() const; - + Standard_Integer NbShapes() const { return myShapes.Length(); } + Standard_EXPORT TopoDS_Shape& Shape (const Standard_Integer I); //! remove the Shape of Index . @@ -135,40 +124,40 @@ //! Loads the shape S into this framework. //! Warning S must have already been triangulated. - void Load (const TopoDS_Shape& S); - + void Load (const TopoDS_Shape& theShape) { myShapes.Append (theShape); } + Standard_EXPORT Handle(HLRAlgo_PolyAlgo) Algo() const; //! Sets the parameters of the view for this framework. //! These parameters are defined by an HLRAlgo_Projector object, //! which is returned by the Projector function on a Prs3d_Projector object. - const HLRAlgo_Projector& Projector() const; - - void Projector (const HLRAlgo_Projector& P); - - Standard_Real Angle() const; - - void Angle (const Standard_Real Ang); - - Standard_Real TolAngular() const; - - void TolAngular (const Standard_Real Tol); - - Standard_Real TolCoef() const; + const HLRAlgo_Projector& Projector() const { return myProj; } + + void Projector (const HLRAlgo_Projector& theProj) { myProj = theProj; } - void TolCoef (const Standard_Real Tol); + Standard_Real TolAngular() const { return myTolAngular; } + + void TolAngular (const Standard_Real theTol) { myTolAngular = theTol; } + + Standard_Real TolCoef() const { return myTolSta; } + void TolCoef (const Standard_Real theTol) + { + myTolSta = theTol; + myTolEnd = 1.0 - theTol; + } + //! Launches calculation of outlines of the shape //! visualized by this framework. Used after setting the point of view and //! defining the shape or shapes to be visualized. Standard_EXPORT void Update(); - - void InitHide(); - - Standard_Boolean MoreHide() const; - - void NextHide(); - + + void InitHide() { myAlgo->InitHide(); } + + Standard_Boolean MoreHide() const { return myAlgo->MoreHide(); } + + void NextHide() { myAlgo->NextHide(); } + Standard_EXPORT HLRAlgo_BiPoint::PointsT& Hide ( HLRAlgo_EdgeStatus& status, TopoDS_Shape& S, @@ -176,35 +165,26 @@ Standard_Boolean& regn, Standard_Boolean& outl, Standard_Boolean& intl); - - void InitShow(); - - Standard_Boolean MoreShow() const; - - void NextShow(); - + + void InitShow() { myAlgo->InitShow(); } + + Standard_Boolean MoreShow() const { return myAlgo->MoreShow(); } + + void NextShow() { myAlgo->NextShow(); } + Standard_EXPORT HLRAlgo_BiPoint::PointsT& Show (TopoDS_Shape& S, Standard_Boolean& reg1, Standard_Boolean& regn, Standard_Boolean& outl, Standard_Boolean& intl); //! Make a shape with the internal outlines in each //! face. Standard_EXPORT TopoDS_Shape OutLinedShape (const TopoDS_Shape& S) const; - - Standard_Boolean Debug() const; - - void Debug (const Standard_Boolean B); - + Standard_Boolean Debug() const { return myDebug; } + void Debug (const Standard_Boolean theDebug) { myDebug = theDebug; } DEFINE_STANDARD_RTTIEXT(HLRBRep_PolyAlgo,Standard_Transient) -protected: - - - - private: - Standard_EXPORT TopoDS_Shape MakeShape() const; @@ -284,6 +264,8 @@ TIMultiply(thePoint.ChangeCoord(1), thePoint.ChangeCoord(2), thePoint.ChangeCoord(3), VecPartOnly); } +private: + HLRAlgo_Projector myProj; Standard_Real TMat[3][3]; Standard_Real TLoc[3]; @@ -296,7 +278,6 @@ TopTools_IndexedMapOfShape myFMap; Handle(HLRAlgo_PolyAlgo) myAlgo; Standard_Boolean myDebug; - Standard_Real myAngle; Standard_Real myTolSta; Standard_Real myTolEnd; Standard_Real myTolAngular; @@ -305,14 +286,6 @@ BRepAdaptor_Curve myBCurv; BRepAdaptor_Curve2d myPC; - }; - -#include - - - - - #endif // _HLRBRep_PolyAlgo_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.lxx opencascade-7.5.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.lxx --- opencascade-7.4.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRBRep/HLRBRep_PolyAlgo.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,163 +0,0 @@ -// Created on: 1995-06-15 -// Created by: Christophe MARION -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -//======================================================================= -//function : NbShapes -//purpose : -//======================================================================= - -inline Standard_Integer HLRBRep_PolyAlgo::NbShapes () const -{ return myShapes.Length(); } - -//======================================================================= -//function : Load -//purpose : -//======================================================================= - -inline void HLRBRep_PolyAlgo::Load (const TopoDS_Shape& S) -{ myShapes.Append(S); } - -//======================================================================= -//function : Projector -//purpose : -//======================================================================= - -inline const HLRAlgo_Projector & HLRBRep_PolyAlgo::Projector () const -{ return myProj; } - -//======================================================================= -//function : Projector -//purpose : -//======================================================================= - -inline void HLRBRep_PolyAlgo::Projector (const HLRAlgo_Projector& P) -{ myProj = P; } - -//======================================================================= -//function : Angle -//purpose : -//======================================================================= - -inline Standard_Real HLRBRep_PolyAlgo::Angle () const -{ return myAngle; } - -//======================================================================= -//function : Angle -//purpose : -//======================================================================= - -inline void HLRBRep_PolyAlgo::Angle (const Standard_Real Ang) -{ myAngle = Ang; } - -//======================================================================= -//function : TolAngular -//purpose : -//======================================================================= - -inline Standard_Real HLRBRep_PolyAlgo::TolAngular () const -{ return myTolAngular; } - -//======================================================================= -//function : TolAngular -//purpose : -//======================================================================= - -inline void HLRBRep_PolyAlgo::TolAngular (const Standard_Real Tol) -{ myTolAngular = Tol; } - -//======================================================================= -//function : TolCoef -//purpose : -//======================================================================= - -inline Standard_Real HLRBRep_PolyAlgo::TolCoef () const -{ return myTolSta; } - -//======================================================================= -//function : TolCoef -//purpose : -//======================================================================= - -inline void HLRBRep_PolyAlgo::TolCoef (const Standard_Real Tol) -{ myTolSta = Tol; myTolEnd = 1 - Tol;} - -//======================================================================= -//function : InitHide -//purpose : -//======================================================================= - -inline void HLRBRep_PolyAlgo::InitHide () -{ - myAlgo->InitHide(); -} - -//======================================================================= -//function : MoreHide -//purpose : -//======================================================================= - -inline Standard_Boolean HLRBRep_PolyAlgo::MoreHide () const -{ return myAlgo->MoreHide(); } - -//======================================================================= -//function : NextHide -//purpose : -//======================================================================= - -inline void HLRBRep_PolyAlgo::NextHide () -{ myAlgo->NextHide(); } - -//======================================================================= -//function : InitShow -//purpose : -//======================================================================= - -inline void HLRBRep_PolyAlgo::InitShow () -{ myAlgo->InitShow(); } - -//======================================================================= -//function : MoreShow -//purpose : -//======================================================================= - -inline Standard_Boolean HLRBRep_PolyAlgo::MoreShow () const -{ return myAlgo->MoreShow(); } - -//======================================================================= -//function : NextShow -//purpose : -//======================================================================= - -inline void HLRBRep_PolyAlgo::NextShow () -{ myAlgo->NextShow(); } - -//======================================================================= -//function : Debug -//purpose : -//======================================================================= - -inline Standard_Boolean HLRBRep_PolyAlgo::Debug () const -{ return myDebug; } - -//======================================================================= -//function : Debug -//purpose : -//======================================================================= - -inline void HLRBRep_PolyAlgo::Debug (const Standard_Boolean B) -{ myDebug = B; } diff -Nru opencascade-7.4.1+dfsg1/src/HLRBRep/HLRBRep_ShapeBounds.lxx opencascade-7.5.1+dfsg1/src/HLRBRep/HLRBRep_ShapeBounds.lxx --- opencascade-7.4.1+dfsg1/src/HLRBRep/HLRBRep_ShapeBounds.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRBRep/HLRBRep_ShapeBounds.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,15 @@ //======================================================================= inline HLRBRep_ShapeBounds::HLRBRep_ShapeBounds () -{} +: myNbIso(0), + myVertStart(0), + myVertEnd(0), + myEdgeStart(0), + myEdgeEnd(0), + myFaceStart(0), + myFaceEnd(0) +{ +} //======================================================================= //function : Shape diff -Nru opencascade-7.4.1+dfsg1/src/HLRBRep/HLRBRep_Surface.cxx opencascade-7.5.1+dfsg1/src/HLRBRep/HLRBRep_Surface.cxx --- opencascade-7.4.1+dfsg1/src/HLRBRep/HLRBRep_Surface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRBRep/HLRBRep_Surface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,6 +39,8 @@ //purpose : //======================================================================= HLRBRep_Surface::HLRBRep_Surface () +: myType(GeomAbs_OtherSurface), + myProj(NULL) { } diff -Nru opencascade-7.4.1+dfsg1/src/HLRTest/HLRTest_DrawablePolyEdgeTool.cxx opencascade-7.5.1+dfsg1/src/HLRTest/HLRTest_DrawablePolyEdgeTool.cxx --- opencascade-7.4.1+dfsg1/src/HLRTest/HLRTest_DrawablePolyEdgeTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRTest/HLRTest_DrawablePolyEdgeTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,6 +46,8 @@ const Standard_Integer ViewId, const Standard_Boolean Debug) : myAlgo(Alg), + myDispRg1(Standard_False), + myDispRgN(Standard_False), myDispHid(Standard_False), myViewId(ViewId), myDebug(Debug), diff -Nru opencascade-7.4.1+dfsg1/src/HLRTopoBRep/HLRTopoBRep_VData.lxx opencascade-7.5.1+dfsg1/src/HLRTopoBRep/HLRTopoBRep_VData.lxx --- opencascade-7.4.1+dfsg1/src/HLRTopoBRep/HLRTopoBRep_VData.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/HLRTopoBRep/HLRTopoBRep_VData.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,9 @@ //======================================================================= inline HLRTopoBRep_VData::HLRTopoBRep_VData() -{} +: myParameter(0.0) +{ +} //======================================================================= //function : Parameter diff -Nru opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_ContextModif.cxx opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_ContextModif.cxx --- opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_ContextModif.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_ContextModif.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -348,8 +348,8 @@ { if (modif.IsNull()) return; - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - sout << "--- Run Modifier:" << Message_EndLine; + Message_Messenger::StreamBuffer sout = Message::SendInfo(); + sout << "--- Run Modifier:" << std::endl; Handle(IFSelect_Selection) sel = modif->Selection(); if (!sel.IsNull()) sout<<" Selection:"<Label(); else sout<<" (no Selection)"; @@ -359,8 +359,8 @@ for (Standard_Integer i = 1; i <= nb; i ++) { if (thelist.Value(i) != ' ') ne ++; } - if (nb == ne) sout<<" All Model ("<Length(); - S<<"(List : "<Value(i); - S<<" ["<ToCString())<ToCString())<DynamicType()->Name(); } else { if (theent.IsNull()) S<<"***** No loaded entity"; - else { S<<"***** Loaded entity : "; themodel->PrintLabel (theent,S); } + else { S<<"***** Loaded entity : "; themodel->PrintLabel (theent, S); } } } - S<MaxNameLength (names ? 0 : -1); if (maxnam == 0) { maxnam = theeditor->MaxNameLength (0); nams = Standard_True; } Standard_Integer nbmod = 0; - if (what != 0) S<<"Mod N0 Name Value"<IsList(jv)) { @@ -489,7 +489,7 @@ if (what < 0) str = OriginalValue (jv); if (what > 0) str = EditedValue (jv); - S << (str.IsNull() ? "(NULL)" : str->ToCString()) <ToCString()) <IsList(jv)) { Handle(TColStd_HSequenceOfHAsciiString) list= OriginalList (jv); - S <ToCString()) <ToCString()) <ToCString()) <ToCString()) < True : prints Long Names; False : prints Short Names @@ -261,7 +259,7 @@ //! = 0 : prints Modified Values (Original + Edited) //! False (D) : lists are printed only as their count //! True : lists are printed for all their items - Standard_EXPORT void PrintValues (const Handle(Message_Messenger)& S, const Standard_Integer what, const Standard_Boolean names, const Standard_Boolean alsolist = Standard_False) const; + Standard_EXPORT void PrintValues (Standard_OStream& S, const Standard_Integer what, const Standard_Boolean names, const Standard_Boolean alsolist = Standard_False) const; //! Applies modifications to own data //! Calls ApplyData then Clears Status according EditKeepStatus diff -Nru opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_Editor.cxx opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_Editor.cxx --- opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_Editor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_Editor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -103,14 +103,14 @@ return (IFSelect_EditValue) edm; } - void IFSelect_Editor::PrintNames (const Handle(Message_Messenger)& S) const + void IFSelect_Editor::PrintNames (Standard_OStream& S) const { Standard_Integer i, nb = NbValues(); - S<<"**** Editor : "< 0) S<<"Short"<Name()<Name(),themaxco)<<" "<Label()<Name()<Name(),themaxco)<<" "<Label()< 0) S<<"Short"<Definition()<Definition()< class Standard_OutOfRange; class Interface_TypedValue; -class Message_Messenger; class IFSelect_EditForm; class TCollection_HAsciiString; class IFSelect_ListEditor; @@ -91,9 +90,9 @@ //! complete. If not found, returns 0 Standard_EXPORT Standard_Integer NameNumber (const Standard_CString name) const; - Standard_EXPORT void PrintNames (const Handle(Message_Messenger)& S) const; + Standard_EXPORT void PrintNames (Standard_OStream& S) const; - Standard_EXPORT void PrintDefs (const Handle(Message_Messenger)& S, const Standard_Boolean labels = Standard_False) const; + Standard_EXPORT void PrintDefs (Standard_OStream& S, const Standard_Boolean labels = Standard_False) const; //! Returns the MaxLength of, according to what : //! = -1 : length of short names diff -Nru opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_Functions.cxx opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_Functions.cxx --- opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_Functions.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_Functions.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -111,11 +111,11 @@ { // **** Version & cie **** //#58 rln - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - sout<<"Processor Version : "<Session(); // **** ToggleHandler **** Standard_Boolean hand = !WS->ErrorHandle(); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (hand) sout << " -- Mode Catch Error now Active" <SetErrorHandle(hand); return IFSelect_RetDone; } @@ -139,21 +139,21 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** XRead / Load **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Read/Load : give file name !"<Protocol().IsNull()) { sout<<"Protocol not defined"<WorkLibrary().IsNull()) { sout<<"WorkLibrary not defined"<Protocol().IsNull()) { sout<<"Protocol not defined"<WorkLibrary().IsNull()) { sout<<"WorkLibrary not defined"<ReadFile (arg1); // status : 0 OK, 1 erreur lecture, 2 Fail(try/catch), // -1 fichier non trouve, -2 lecture faite mais resultat vide switch (status) { - case IFSelect_RetVoid : sout<<"file:"<NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** Write All **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Write All : give file name !"<SendAll (arg1); } @@ -181,12 +181,12 @@ const Standard_CString arg1 = pilot->Arg(1); // const Standard_CString arg2 = pilot->Arg(2); // **** Write Selected **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Write Selected : give file name + givelist !"<CommandPart( 2)); - if (result.IsNull()) { sout<<"No entity selected"<Length()<Length()<SetList (result); return WS->SendSelected (arg1,sp); @@ -199,20 +199,20 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** Write Entite(s) **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Write Entitie(s) : give file name + n0s entitie(s)!"<Number(pilot->Arg(ia)); if (id > 0) { Handle(Standard_Transient) item = WS->StartingEntity(id); - if (sp->Add(item)) sout<<"Added:no."<Add(item)) sout<<"Added:no."<Arg(ia)<Arg(ia)< 0) { sout< 0) { sout<SendSelected (arg1,sp); } @@ -223,15 +223,15 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** Entity Label **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give entity number"<HasModel()) { sout<<"No loaded model, abandon"<HasModel()) { sout<<"No loaded model, abandon"<NumberFromLabel (arg1); if (nument <= 0 || nument > WS->NbStartingEntities()) - { sout<<"Not a suitable number: "<Label in Model : "; - WS->Model()->PrintLabel(WS->StartingEntity(nument),sout); - sout<Model()->PrintLabel(WS->StartingEntity(nument), sout); + sout<NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** Entity Number **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give label to search"<HasModel()) { sout<<"No loaded model, abandon"<HasModel()) { sout<<"No loaded model, abandon"<Model(); Standard_Integer i, cnt = 0; Standard_Boolean exact = Standard_False; - sout<<" ** Search Entity Number for Label : "<NextNumberForLabel (arg1, 0, exact) ; i != 0; i = model->NextNumberForLabel (arg1, i, exact)) { cnt ++; - sout<<" ** Found n0/id:"; model->Print (model->Value(i),sout); sout<Print (model->Value(i), sout); + sout< tout le modele"< cette selection, evaluation normale"< cette selection evaluee sur entite n0 num"< tout le modele"< cette selection, evaluation normale"< cette selection evaluee sur entite n0 num"<NamedItem(arg1)); @@ -322,7 +324,7 @@ for (i = 1; i < onflag; i ++) { sel = WS->GiveSelection(pilot->Arg(i)); if (!suite->AddInput(sel)) { - sout<<"Incorrect definition for applied selection"<Arg(1); // **** Sign Type **** Handle(IFSelect_Signature) signtype = WS->SignType(); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (signtype.IsNull()) sout<<"signtype actually undefined"<Name (signtype); Standard_Integer id = WS->ItemIdent (signtype); - sout<Label()<Label()< 0) sout<<"signtype : item n0 "< 0) sout<<"signtype : item n0 "<ToCString()<ToCString()<NamedItem(arg1)); - if (signtype.IsNull()) { sout<<"Not a Signature : "<SetSignType(signtype); return IFSelect_RetDone; @@ -389,23 +391,23 @@ const Standard_CString arg1 = pilot->Arg(1); // **** Sign Case **** Handle(IFSelect_Signature) signcase = GetCasted(IFSelect_Signature,WS->NamedItem(arg1)); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (signcase.IsNull()) sout<<"Not a Signature : "<IsIntCase(hasmin,valmin,hasmax,valmax)) { sout<<"Signature "<CaseList(); - if (caselist.IsNull()) sout<<"Signature "<Length(); - sout<<"Signature "<Value(i); - sout<Arg(1); // **** Entity Status **** Standard_Integer i,nb; - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 2) { nb = Interface_Category::NbCategories(); sout<<" Categories defined :"<Number(arg1); if (num <= 0 || num > WS->NbStartingEntities()) - { sout<<"Not a suitable entity number : "<StartingEntity(num); - WS->PrintEntityStatus(ent,sout); + WS->PrintEntityStatus (ent, sout); return IFSelect_RetVoid; } @@ -447,7 +449,7 @@ Standard_Integer niv = 0; // char arg10 = arg1[0]; // if (argc < 2) arg10 = '?'; - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); switch (arg1[0]) { case '?' : sout<<"? for this help, else give a listing mode (first letter suffices) :\n" @@ -459,7 +461,7 @@ <<" check CheckList (complete) per message (counting)\n" <<" totalcheck CheckList (complete) per message (listing n0 ents)\n" <<" FAILS CheckList (fails) per message (listing complete)\n" - <<" TOTALCHECK CheckList (complete) per message (listing complete)"<TraceDumpModel(niv); return IFSelect_RetVoid; @@ -485,14 +487,14 @@ Handle(IFSelect_WorkLibrary) WL = WS->WorkLibrary(); Standard_Integer levdef=0,levmax=10,level; WL->DumpLevels (levdef,levmax); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 2 || (argc == 2 && levmax < 0)) { sout<<"Give n0 or id of entity"; - if (levmax < 0) sout<<" and dump level"< 2) level = atoi(arg2); Handle(Standard_Transient) ent = WS->StartingEntity(num); if ( ent.IsNull() ) { - sout << "No entity with given id " << arg1 << " (" << num << ") is found in the current model" << Message_EndLine; + sout << "No entity with given id " << arg1 << " (" << num << ") is found in the current model" << std::endl; } else { - sout << " -- DUMP Entity n0 " << num << " level " << level << Message_EndLine; + sout << " -- DUMP Entity n0 " << num << " level " << level << std::endl; WL->DumpEntity (WS->Model(),WS->Protocol(),ent,sout,level); Interface_CheckIterator chl = WS->CheckOne (ent); @@ -526,14 +528,14 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); const Standard_CString arg2 = pilot->Arg(2); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<" Give signature name + n0 or id of entity"<NamedItem(arg1)); - if (sign.IsNull()) { sout<<"Not a signature : "<Number(arg2); Handle(Standard_Transient) ent = WS->StartingEntity (num); if (num == 0) return IFSelect_RetError; - sout<<"Entity n0 "<SignValue(sign,ent)<SignValue(sign,ent)<NbWords(); const Standard_CString arg1 = pilot->Arg(1); const Standard_CString arg2 = pilot->Arg(2); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<" Give 2 numeros or labels : dad son"<NumberFromLabel(arg1); Standard_Integer n2 = WS->NumberFromLabel(arg2); - sout<<"QueryParent for dad:"<QueryParent(WS->StartingEntity(n1),WS->StartingEntity(n2)); - if (qp < 0) sout<NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** NewInt **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 1) { sout<<"Donner la valeur entiere pour IntParam"<= 1) intpar->SetValue(atoi(arg1)); return pilot->RecordItem (intpar); @@ -596,9 +598,9 @@ const Standard_CString arg1 = pilot->Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** SetInt **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 3) - { sout<<"Donner 2 arguments : nom Parametre et Valeur"<NamedItem(arg1)); if (!WS->SetIntValue(par,val)) return IFSelect_RetFail; @@ -612,8 +614,8 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** NewText **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 1) { sout<<"Donner la valeur texte pour TextParam"<= 1) textpar->AssignCat(arg1); return pilot->RecordItem (textpar); @@ -627,9 +629,9 @@ const Standard_CString arg1 = pilot->Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** SetText **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 3) - { sout<<"Donner 2 arguments : nom Parametre et Valeur"<NamedItem(arg1)); if (!WS->SetTextValue(par,arg2)) return IFSelect_RetFail; return IFSelect_RetDone; @@ -642,8 +644,8 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** DumpSel **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give 1 argument : Selection Name"<DumpSelection (GetCasted(IFSelect_Selection,WS->NamedItem(arg1))); return IFSelect_RetVoid; } @@ -659,8 +661,8 @@ // **** MakeList **** char mode = pilot->Arg(0)[0]; // givelist/makelist if (mode == 'g') mode = pilot->Arg(0)[4]; // l list s short p pointed - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give Entity ID, or Selection Name [+ optional other selection or entity]"<NamedItem (arg1); pnt = GetCasted(IFSelect_SelectPointed,item); if (!pnt.IsNull()) { - sout<Clear(); } else if (!item.IsNull()) { - sout<CommandPart( (mode == 'm' ? 2 : 1) )<<" : "; - if (mode == 'l') WS->ListEntities (iter,0); - else if (mode == 's' || mode == 'm') WS->ListEntities (iter,2); + if (mode == 'l') WS->ListEntities (iter, 0, sout); + else if (mode == 's' || mode == 'm') WS->ListEntities (iter, 2, sout); else if (mode == 'p') { sout<StartingNumber (iter.Value()); - sout<SetList (result); - sout<<"List set to a SelectPointed : "<Arg(1)<Arg(1)<Session(); Standard_Integer argc = pilot->NbWords(); // **** GiveCount **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give Entity ID, or Selection Name [+ optional other selection or entity]"<EvaluateSelection(GetCasted(IFSelect_Selection,WS->NamedItem(arg1))); Handle(TColStd_HSequenceOfTransient) result = IFSelect_Functions::GiveList (WS,pilot->CommandPart(1)); if (result.IsNull()) return IFSelect_RetError; - sout<CommandPart(1)<<" : List of "<Length()<<" Entities"<CommandPart(1)<<" : List of "<Length()<<" Entities"<Session(); Standard_Integer argc = pilot->NbWords(); // **** SelSuite **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give Entity ID, or Selection Name [+ optional other selection or entity]"<EvaluateSelection(GetCasted(IFSelect_Selection,WS->NamedItem(arg1))); Handle(IFSelect_SelectSuite) selsuite = new IFSelect_SelectSuite; for (Standard_Integer i = 1; i < argc; i ++) { Handle(IFSelect_Selection) sel = WS->GiveSelection(pilot->Arg(i)); if (!selsuite->AddInput(sel)) { - sout<Arg(i-1)<<" : not a SelectDeduct, no more can be added. Abandon"<Arg(i-1)<<" : not a SelectDeduct, no more can be added. Abandon"<ClearData (mode); @@ -784,9 +786,9 @@ Handle(IFSelect_WorkSession) WS = pilot->Session(); Standard_Integer argc = pilot->NbWords(); // **** Item Label **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); TCollection_AsciiString label; - if (argc < 2) { sout<<" Give label to search"<Arg(i)); if (i < argc-1) label.AssignCat(" "); @@ -794,14 +796,14 @@ for (int mode = 0; mode <= 2; mode ++) { int nbitems = 0; int id; sout<<"Searching label : "<NextIdentForLabel(label.ToCString(), 0,mode) ; id != 0; id = WS->NextIdentForLabel(label.ToCString(),id,mode)) { sout<<" "<NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** Save (Dump) **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner nom du Fichier"<NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** Restore (Dump) **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner nom du Fichier"< 0) sout << "-- Erreur Lecture Fichier "< 0) sout << "-- Erreur Lecture Fichier "<Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** Param(Value) **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 2) { Handle(TColStd_HSequenceOfHAsciiString) li = Interface_Static::Items(); Standard_Integer i,nb = li->Length(); - sout<<" List of parameters : "<Value(i); - sout<<" : "<Value(i)->ToCString())<Value(i)->String(); + sout<<" : "<Value(i)->ToCString())< 0) { Standard_Integer use = atoi (arg1); WS->TraceStatics (use); } else { - if (argc > 2) sout<<" FORMER STATUS of Static Parameter "< Print(sout); - else sout<<" Value : "< 2) sout<<" FORMER STATUS of Static Parameter "< Print (sout); + else sout<<" Value : "<Session(); // **** SentFiles **** Handle(TColStd_HSequenceOfHAsciiString) list = WS->SentFiles(); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (list.IsNull()) - { sout<<"List of Sent Files not enabled"<Length(); - sout<<" Sent Files : "<Value(i)->ToCString()<Value(i)->ToCString()<NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** FilePrefix **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 2) { - if (WS->FilePrefix().IsNull()) sout<<"Pas de prefixe defini"<FilePrefix()->ToCString()<FilePrefix().IsNull()) sout<<"Pas de prefixe defini"<FilePrefix()->ToCString()<SetFilePrefix(arg1); @@ -918,11 +920,11 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** FileExtension **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 2) { - if (WS->FileExtension().IsNull()) sout<<"Pas d extension definie"<FileExtension()->ToCString()<FileExtension().IsNull()) sout<<"Pas d extension definie"<FileExtension()->ToCString()<SetFileExtension(arg1); @@ -937,13 +939,13 @@ const Standard_CString arg1 = pilot->Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** FileRoot **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner Dispatch et nom de Root"<NamedItem(arg1)); if (argc < 3) { - if (WS->FileRoot(disp).IsNull()) sout<<"Pas de racine definie pour "<FileRoot(disp)->ToCString()<FileRoot(disp).IsNull()) sout<<"Pas de racine definie pour "<FileRoot(disp)->ToCString()<SetFileRoot(disp,arg2)) return IFSelect_RetFail; @@ -957,11 +959,11 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** Default File Root **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 2) { - if (WS->DefaultFileRoot().IsNull()) sout<<"Pas de racine par defaut definie"<DefaultFileRoot()->ToCString()<DefaultFileRoot().IsNull()) sout<<"Pas de racine par defaut definie"<DefaultFileRoot()->ToCString()<SetDefaultFileRoot(arg1); @@ -973,20 +975,20 @@ { Handle(IFSelect_WorkSession) WS = pilot->Session(); // **** EvalFile **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (!WS->HasModel()) - { sout<<"Pas de Modele charge, abandon"<EvaluateFile(); Standard_Integer nbf = WS->NbFiles(); for (Standard_Integer i = 1; i <= nbf; i ++) { Handle(Interface_InterfaceModel) mod = WS->FileModel(i); if (mod.IsNull()) - { sout<<"Modele "<FileName(i); sout<<"Fichier n0 "<NbEntities()<<" Nom: "; - sout<Session(); Standard_Integer argc = pilot->NbWords(); // **** Split **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); IFSelect_ReturnStatus stat = IFSelect_RetVoid; - if (argc < 2) sout<<"Split : derniere liste de dispatches definie"<ClearShareOut(Standard_True); for (Standard_Integer i = 1; i < argc; i ++) { DeclareAndCast(IFSelect_Dispatch,disp,WS->NamedItem(pilot->Arg(i))); if (disp.IsNull()) { - sout<<"Pas un dispatch:"<Arg(i)<<", Splitt abandonne"<Arg(i)<<", Splitt abandonne"<SetActive(disp,Standard_True); @@ -1039,9 +1041,9 @@ else if (mode == 'c') numod = IFSelect_RemainCompute; else if (mode == 'f') numod = IFSelect_RemainForget; else { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc<2) sout<<"Donner un Mode - "; - sout<<"Modes possibles : l list, c compute, u undo, f forget"<SetRemaining(numod)) return IFSelect_RetVoid; @@ -1056,18 +1058,18 @@ const Standard_CString arg1 = pilot->Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** SetModelContent **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Donner nom selection et mode (k=keep,r=remove)"<NamedItem(arg1)); if (sel.IsNull()) - { sout<<"Pas de Selection de Nom : "<SetModelContent(sel,keepmode)) sout<<" Done"<SetModelContent(sel,keepmode)) sout<<" Done"<NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** Modifier **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner Nom du Modifier"<NamedItem(arg1)); if (modif.IsNull()) - { sout<<"Pas de Modifier de Nom : "<Dispatch(); - sout<<"Modifier : "<Label()<Label()<ModifierRank(modif); if (modif->IsKind(STANDARD_TYPE(IFSelect_Modifier))) sout<< "Model Modifier n0." << rank; else sout<< "File Modifier n0." << rank; - if (disp.IsNull()) sout<<" Applique a tous les Dispatchs" << Message_EndLine; + if (disp.IsNull()) sout<<" Applique a tous les Dispatchs" << std::endl; else { sout << " Dispatch : "<Label(); if (WS->HasName(disp)) sout << " - Nom:"<Name(disp)->ToCString(); - sout<Selection(); if (!sel.IsNull()) sout<<" Selection : "<< sel->Label(); if (WS->HasName(sel)) sout<<" - Nom:"<< WS->Name(sel)->ToCString(); - sout<Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** ModifSel **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 2) { sout<<"Donner Nom Modifier; + Nom Selection optionnel\n" - <<"Selection pour Mettre une Selection, sinon Annule"<NamedItem(arg1)); if (modif.IsNull()) - { sout<<"Pas un nom de Modifier : "<NamedItem(arg2)); if (sel.IsNull()) - { sout<<"Pas un nom de Selection : "<SetItemSelection(modif,sel)) return IFSelect_RetFail; return IFSelect_RetDone; @@ -1146,19 +1148,19 @@ const Standard_CString arg1 = pilot->Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** SetAppliedModifier **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 2) { sout<<"Donner Nom Modifier; + Nom Dispatch ou Transformer optionnel :\n" <<" - rien : tous Dispatches\n - Dispatch : ce Dispatch seul\n" - <<" - Transformer : pas un Dispatch mais un Transformer"<NamedItem(arg1)); if (modif.IsNull()) - { sout<<"Pas un nom de Modifier : "<NamedItem(arg2); if (item.IsNull()) - { sout<<"Pas un nom connu : "<ShareOut(); if (!WS->SetAppliedModifier(modif,item)) return IFSelect_RetFail; @@ -1172,11 +1174,11 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** ResetApplied (modifier) **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Designer un modifier"<NamedItem(arg1)); if (modif.IsNull()) - { sout<<"Pas un nom de Modifier : "<ResetAppliedModifier(modif)) return IFSelect_RetFail; return IFSelect_RetDone; } @@ -1190,15 +1192,15 @@ const Standard_CString arg2 = pilot->Arg(2); const Standard_CString arg3 = pilot->Arg(3); // **** ModifMove **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 4) { sout<<"modifmove MF rang1 rang2, M pour Model F pour File"<ChangeModifierRank(formodel,before,after)) return IFSelect_RetFail; return IFSelect_RetDone; } @@ -1211,14 +1213,14 @@ const Standard_CString arg1 = pilot->Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** DispSel **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Donner Noms Dispatch et Selection Finale"<NamedItem(arg1)); if (disp.IsNull()) - { sout<<"Pas un nom de Dispatch : "<NamedItem(arg2)); if (sel.IsNull()) - { sout<<"Pas un nom de Selection : "<SetItemSelection(disp,sel)) return IFSelect_RetFail; return IFSelect_RetDone; } @@ -1248,11 +1250,11 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** DispCount **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner Nom IntParam pour Count"<NamedItem(arg1)); if (par.IsNull()) - { sout<<"Pas un nom de IntParam : "<SetCount (par); return pilot->RecordItem(disp); @@ -1265,11 +1267,11 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** DispFiles **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner Nom IntParam pour NbFiles"<NamedItem(arg1)); if (par.IsNull()) - { sout<<"Pas un nom de IntParam : "<SetCount (par); return pilot->RecordItem(disp); @@ -1283,11 +1285,11 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** DispFiles **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner Nom Signature"<NamedItem(arg1)); if (sig.IsNull()) - { sout<<"Pas un nom de Signature : "<SetSignCounter (new IFSelect_SignCounter(sig)); return pilot->RecordItem(disp); @@ -1301,19 +1303,19 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** Dispatch **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner Nom du Dispatch"<NamedItem(arg1)); - if (disp.IsNull()) { sout<<"Pas un dispatch : "<DispatchRank(disp); sout<<"Dispatch de Nom : "<ItemSelection(disp); Handle(TCollection_HAsciiString) selname = WS->Name(sel); - if (sel.IsNull()) sout<<"Pas de Selection Finale"<ItemIdent(sel)<ToCString()<ItemIdent(sel)<ToCString()<HasRootName()) sout<<"-- Racine nom de fichier : " - <RootName()->ToCString()<RootName()->ToCString()<NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** Remove **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give Name to Remove !"<RemoveNamedItem(arg1)) return IFSelect_RetFail; return IFSelect_RetDone; } @@ -1337,20 +1339,20 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** EvalDisp **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 3) { sout<<"evaldisp mode disp [disp ...] : Mode + Name(s) of Dispatch(es). Mode:\n" - <<" 0 brief 1 +forgotten ents 2 +duplicata 3 1+2"<NamedItem(pilot->Arg(i))); if (disp.IsNull()) - { sout<<"Not a dispatch:"<Arg(i)<Arg(i)<NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** EvalADisp [GiveList] **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 3) { sout<<"evaladisp mode(=0-1-2-3) disp [givelist] : Mode + Dispatch [+ GiveList]\n If GiveList not given, computed from Selection of the Dispatch. Mode:\n" - <<" 0 brief 1 +forgotten ents 2 +duplicata 3 1+2"<NamedItem(pilot->Arg(2))); Handle(IFSelect_Dispatch) disp = IFSelect_Functions::GiveDispatch (WS,pilot->Arg(2),Standard_True); if (disp.IsNull()) - { sout<<"Not a dispatch:"<Arg(2)<Arg(2)<FinalSelection(); Handle(IFSelect_Selection) sel; if (argc > 3) { @@ -1394,9 +1396,9 @@ } if (sel.IsNull() && selsav.IsNull()) - { sout<<"No Selection nor GiveList defined"< 3) sout<<"GiveList is empty, hence computed from the Selection of the Dispatch"< 3) sout<<"GiveList is empty, hence computed from the Selection of the Dispatch"<SetFinalSelection(sel); @@ -1415,23 +1417,23 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** EvalADisp [GiveList] **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 3) { sout<<"writedisp filename disp [givelist] : FileName + Dispatch [+ GiveList]\n If GiveList not given, computed from Selection of the Dispatch.\n" <<"FileName : rootname.ext will gives rootname_1.ext etc...\n" <<" path/rootname.ext gives path/rootname_1.ext etc...\n" - <<"See also : evaladisp"<NamedItem(pilot->Arg(2))); Handle(IFSelect_Dispatch) disp = IFSelect_Functions::GiveDispatch (WS,pilot->Arg(2),Standard_True); if (disp.IsNull()) - { sout<<"Not a dispatch:"<Arg(2)<Arg(2)<FinalSelection(); Handle(IFSelect_Selection) sel; if (argc > 3) { @@ -1443,9 +1445,9 @@ } if (sel.IsNull() && selsav.IsNull()) - { sout<<"No Selection nor GiveList defined"< 3) sout<<"GiveList is empty, hence computed from the Selection of the Dispatch"< 3) sout<<"GiveList is empty, hence computed from the Selection of the Dispatch"<Arg(1); // **** EvalComplete **** Standard_Integer mode = 0; - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 2) sout << " -- mode par defaut 0\n"; - else { mode = atoi(arg1); sout << " -- mode : " << mode << Message_EndLine; } + else { mode = atoi(arg1); sout << " -- mode : " << mode << std::endl; } WS->EvaluateComplete(mode); return IFSelect_RetVoid; } @@ -1486,7 +1488,8 @@ Interface_CheckIterator chlist = WS->LastRunCheckList(); Handle(IFSelect_CheckCounter) counter = new IFSelect_CheckCounter(0); counter->Analyse(chlist,WS->Model(),Standard_False); - counter->PrintCount (Message::DefaultMessenger()); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); + counter->PrintCount (sout); return IFSelect_RetVoid; } @@ -1497,24 +1500,24 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** RunTransformer **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner Nom de Transformer"<NamedItem(arg1)); Standard_Integer effect = WS->RunTransformer(tsf); switch (effect) { - case -4 : sout<<"Edition sur place, nouveau Protocole, erreur recalcul graphe"< 0) ? IFSelect_RetDone : IFSelect_RetFail); @@ -1554,9 +1557,9 @@ pilot->Perform(); modif = GetCasted(IFSelect_Modifier,pilot->RecordedItem()); } - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (modif.IsNull()) - { sout<<"Pas un nom de Modifier : "<RunModifierSelected (modif,sp,runcopy); // sout<<"Modifier applique sur TransformStandard #"<ItemIdent(tsf)< 0) ? IFSelect_RetDone : IFSelect_RetFail); @@ -1595,9 +1598,9 @@ char opt = ' '; Standard_Integer argc = pilot->NbWords(); if (argc >= 2) opt = pilot->Word(1).Value(1); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (opt != 'f' && opt != 'l') - { sout<<"Donner option : f -> root-first l -> root-last"< root-first l -> root-last"<RecordItem(new IFSelect_ModifReorder(opt == 'l')); } @@ -1608,13 +1611,13 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** SelToggle **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner Nom de Selection"<NamedItem(arg1)); if (!WS->ToggleSelectExtract(sel)) - { sout<<"Pas une SelectExtract : "<IsReversedSelectExtract(sel)) sout<IsReversedSelectExtract(sel)) sout<Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** SelInput **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Donner Noms Selections cible et input"<NamedItem(arg1)); DeclareAndCast(IFSelect_Selection,sou,WS->NamedItem(arg2)); if (sel.IsNull() || sou.IsNull()) - { sout<<"Incorrect : "<SetInputSelection(sel,sou)) { - sout<<"Nom incorrect ou Selection "<Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** SelRange **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc >= 2 && arg1[0] == '?') argc = 1; if (argc < 2) { sout<<"Donner la description du SelectRange" <<" Formes admises :\n : Range de a \n" <<" tout seul : Range n0 \n from : Range From \n" - <<" until : Range Until "< : Range Until "<Word(1).IsEqual("from")) { - if (argc < 3) { sout<<"Forme admise : from "<"<NamedItem(arg2)); sel = new IFSelect_SelectRange; sel->SetFrom (low); // Range Until } else if (pilot->Word(1).IsEqual("until")) { - if (argc < 3) { sout<<"Forme admise : until "<"<NamedItem(arg2)); sel = new IFSelect_SelectRange; sel->SetUntil (up); @@ -1720,16 +1723,16 @@ // **** SelDiff **** Handle(IFSelect_Selection) sel = new IFSelect_SelectDiff; if (sel.IsNull()) return IFSelect_RetFail; - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) sout<<"Diff sans input : ne pas oublier de les definir (ctlmain, ctlsec)!"<NamedItem(arg1)); DeclareAndCast(IFSelect_Selection,selsec ,WS->NamedItem(arg2)); if (argc >= 2) if (!WS->SetControl(sel,selmain,Standard_True)) - sout<<"Echec ControlMain:"<= 3) if (!WS->SetControl(sel,selsec,Standard_False)) - sout<<"Echec ControlSecond:"<RecordItem (sel); } @@ -1741,12 +1744,12 @@ const Standard_CString arg1 = pilot->Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** SelControlMain **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Donner Noms de Control et MainInput"<NamedItem(arg1)); DeclareAndCast(IFSelect_Selection,selmain,WS->NamedItem(arg2)); if (WS->SetControl(sel,selmain,Standard_True)) return IFSelect_RetDone; - sout<<"Nom incorrect ou Selection "<Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** SelControlSecond **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Donner Noms de Control et SecondInput"<NamedItem(arg1)); DeclareAndCast(IFSelect_Selection,seldif,WS->NamedItem(arg2)); if (WS->SetControl(sel,seldif,Standard_False)) return IFSelect_RetDone; - sout<<"Nom incorrect ou Selection "<Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** SelCombAdd **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Donner n0 Combine et une Input"<NamedItem(arg1)); DeclareAndCast(IFSelect_Selection,seladd,WS->NamedItem(arg2)); if (WS->CombineAdd(sel,seladd)) return IFSelect_RetDone; - sout<<"Nom incorrect ou Selection "<Arg(1); const Standard_CString arg2 = pilot->Arg(2); // **** SelCombRem **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Donner n0 Combine et RANG a supprimer"<NamedItem(arg1)); DeclareAndCast(IFSelect_Selection,inp,WS->NamedItem(arg2)); if (WS->CombineRemove(sel,inp)) return IFSelect_RetDone; - sout<<"Nom incorrect ou Selection "<NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** SelEntNumber **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner Nom IntParam pour n0 Entite"<NamedItem(arg1)); Handle(IFSelect_SelectEntityNumber) sel = new IFSelect_SelectEntityNumber; sel->SetNumber(par); @@ -1846,8 +1849,8 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** SelTextType Exact **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner le TYPE a selectionner"<RecordItem (new IFSelect_SelectSignature (new IFSelect_SignType,arg1,Standard_True)); } @@ -1879,8 +1882,8 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** SelTextType Contain ** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner le TYPE a selectionner"<RecordItem (new IFSelect_SelectSignature (new IFSelect_SignType,arg1,Standard_False)); } @@ -1894,8 +1897,8 @@ Handle(TColStd_HSequenceOfTransient) list = IFSelect_Functions::GiveList (pilot->Session(),pilot->CommandPart(1)); if (list.IsNull()) return IFSelect_RetFail; - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - sout<<"SelectPointed : "<Length()<<" entities"<Length()<<" entities"<AddList (list); } return pilot->RecordItem (sp); @@ -1908,26 +1911,26 @@ Standard_Integer argc = pilot->NbWords(); const Standard_CString arg1 = pilot->Arg(1); // **** SetPointed (edit) / SetList (edit) **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (argc < 2) { sout<<"Donner NOM SelectPointed + Option(s) :\n" <<" aucune : liste des entites pointees\n" - <<" 0: Clear +nn ajout entite nn -nn enleve nn /nn toggle nn"<NamedItem(arg1)); - if (sp.IsNull()) { sout<<"Pas une SelectPointed:"<Model(); // pour Print if (argc == 2) { // listage simple Standard_Integer nb = sp->NbItems(); - sout<<" SelectPointed : "<Item(i); Standard_Integer id = WS->StartingNumber(pointed); if (id == 0) sout <<" (inconnu)"; - else { sout<<" "; model->Print(pointed,sout); } + else { sout <<" "; model->Print (pointed, sout); } } - if (nb > 0) sout< 0) sout<Word(ia); Standard_Integer id = pilot->Number(&(argi.ToCString())[1]); if (id == 0) { - if (!argi.IsEqual("0")) sout<<"Incorrect,ignore:"<Clear(); } + if (!argi.IsEqual("0")) sout<<"Incorrect,ignore:"<Clear(); } } else if (argi.Value(1) == '-') { Handle(Standard_Transient) item = WS->StartingEntity(id); if (sp->Remove(item)) sout<<"Removed:no."<Print(item,sout); sout<Print (item, sout); } else if (argi.Value(1) == '/') { Handle(Standard_Transient) item = WS->StartingEntity(id); if (sp->Remove(item)) sout<<"Toggled:n0."<Print(item,sout); sout<Print (item, sout); } else if (argi.Value(1) == '+') { Handle(Standard_Transient) item = WS->StartingEntity(id); if (sp->Add(item)) sout<<"Added:no."<Print(item,sout); sout<Print (item, sout); } else { - sout<<"Ignore:"<Arg(2); Handle(IFSelect_WorkSession) WS = pilot->Session(); // **** SelSignature **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Give name of Signature or Counter, text + option exact(D) else contains"< 3) { if (pilot->Arg(3)[0] == 'c') exact = Standard_False; } @@ -1987,7 +1993,7 @@ if (!sign.IsNull()) sel = new IFSelect_SelectSignature (sign,arg2,exact); else if (!cnt.IsNull()) sel = new IFSelect_SelectSignature (cnt,arg2,exact); - else { sout<RecordItem(sel); } @@ -1999,10 +2005,10 @@ const Standard_CString arg1 = pilot->Arg(1); Handle(IFSelect_WorkSession) WS = pilot->Session(); // **** SignCounter **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner nom signature"<NamedItem(arg1)); - if (sign.IsNull()) { sout<RecordItem(cnt); } @@ -2014,10 +2020,10 @@ const Standard_CString arg1 = pilot->Arg(1); Handle(IFSelect_WorkSession) WS = pilot->Session(); // **** NbSelected = GraphCounter **** - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Donner nom selection (deduction) a appliquer"<GiveSelection(arg1)); - if (applied.IsNull()) { sout<SetApplied (applied); return pilot->RecordItem(cnt); @@ -2031,8 +2037,8 @@ (const Handle(IFSelect_SessionPilot)& pilot) { Standard_Integer argc = pilot->NbWords(); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give the name of an EditForm or an Editor"<Arg(1); const Standard_CString arg2 = pilot->Arg(2); @@ -2043,7 +2049,7 @@ DeclareAndCast(IFSelect_EditForm,edf,WS->NamedItem(arg1)); Handle(IFSelect_Editor) edt; if (!edf.IsNull()) { - sout<<"Print EditForm "<Editor(); if (argc < 3) { @@ -2052,14 +2058,14 @@ if (edt.IsNull()) edt = GetCasted(IFSelect_Editor,WS->NamedItem(arg1)); if (edt.IsNull()) return IFSelect_RetVoid; - sout<<"Editor, Label : "<Label()<Label()<PrintNames(sout); - sout<PrintDefs (sout); if (!edf.IsNull()) { edf->PrintDefs(sout); - sout<NbWords(); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 3) { sout<<"Give the name of an EditForm + name of Value [+ newvalue or . to nullify]"<Arg(1); const Standard_CString arg2 = pilot->Arg(2); Handle(IFSelect_WorkSession) WS = pilot->Session(); DeclareAndCast(IFSelect_EditForm,edf,WS->NamedItem(arg1)); if (edf.IsNull()) - { sout<<"Not an EditForm : "<NameNumber (arg2); - if (num == 0) sout<<"Unknown Value Name : "<Editor()->IsList(num); @@ -2103,19 +2109,19 @@ if (islist) { listr = edf->EditedList(num); - if (listr.IsNull()) sout<<"(NULL LIST)"<Length(); - sout<<"(List : "<Value(ilist); - sout<<" ["<ToCString())<ToCString())<EditedValue (num); - sout<<(str.IsNull() ? "(NULL)" : str->ToCString())<ToCString())<Arg(numarg); if (islist) { if (argval[0] == '?') { - sout<<"To Edit, options"<CommandPart(numarg+1)),numset); } if (stated) stated = edf->ModifyList (num,listed,Standard_True); - if (stated) sout<<"List Edition done"<CommandPart(numarg)); if (edf->Modify (num,str,Standard_True)) { - sout<<"Now set to "<<(str.IsNull() ? "(NULL)" : str->ToCString())<ToCString())<NbWords(); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give the name of an EditForm [+ name of Value else all]"<Arg(1); const Standard_CString arg2 = pilot->Arg(2); Handle(IFSelect_WorkSession) WS = pilot->Session(); DeclareAndCast(IFSelect_EditForm,edf,WS->NamedItem(arg1)); if (edf.IsNull()) - { sout<<"Not an EditForm : "<ClearEdit(); sout<<"All Modifications Cleared"<ClearEdit(); sout<<"All Modifications Cleared"<NameNumber (arg2); - if (num == 0) sout<<"Unknown Value Name : "<IsModified(num)) - { sout<<"Value "<ClearEdit (num); - sout<<"Modification on Value "<NbWords(); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give the name of an EditForm [+ option keep to re-apply edited values]"<Arg(1); const Standard_CString arg2 = pilot->Arg(2); Handle(IFSelect_WorkSession) WS = pilot->Session(); DeclareAndCast(IFSelect_EditForm,edf,WS->NamedItem(arg1)); if (edf.IsNull()) - { sout<<"Not an EditForm : "<Entity(); Handle(Interface_InterfaceModel) model = edf->Model(); if (!model.IsNull()) { - if (ent.IsNull()) sout<<"Applying modifications on loaded model"<PrintLabel (ent,sout); + model->PrintLabel (ent, sout); } } - else sout<<"Applying modifications"<ApplyData (edf->Entity(),edf->Model())) { - sout<<"Modifications could not be applied"< 2 && arg2[0] == 'k') stat = Standard_False; if (stat) { edf->ClearEdit(); - sout<<"Edited values are cleared"<NbWords(); - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - if (argc < 2) { sout<<"Give the name of an EditForm [+ Entity-Ident]"<Arg(1); const Standard_CString arg2 = pilot->Arg(2); Handle(IFSelect_WorkSession) WS = pilot->Session(); DeclareAndCast(IFSelect_EditForm,edf,WS->NamedItem(arg1)); if (edf.IsNull()) - { sout<<"Not an EditForm : "<Number (arg2)); Standard_Boolean stat = Standard_False; if (argc < 3) { - sout<<"EditForm "<LoadModel(WS->Model()); } else if (num <= 0) { - sout<<"Not an entity ident : "<LoadData (WS->StartingEntity(num),WS->Model()); } if (!stat) { - sout<<"Loading not done"<NamedItem( &(nam.ToCString())[paro])); if (sg.IsNull()) { - sout<<"DispPerSignature "<SetSignCounter (new IFSelect_SignCounter(sg)); return ds; } - sout<<"Dispatch : "< 0) { @@ -183,8 +181,7 @@ if (!res) { char mess[100]; sprintf(mess,"Split Send (WriteFile) abandon on file n0.%d",i); checks.CCheck(0)->AddFail (mess); - Message::DefaultMessenger() << - " ** Sending File n0."<Init(0); for (eval.Evaluate(); eval.More(); eval.Next()) { @@ -242,8 +238,7 @@ if (!res) { char mess[100]; sprintf(mess,"Split Send (WriteFile) abandon on file n0.%d",i); checks.CCheck(0)->AddFail (mess); - Message::DefaultMessenger() << - " ** Sending File "<AddFail ("SendAll (WriteFile) has failed"); // if (!checks.IsEmpty(Standard_False)) { -// Message::DefaultMessenger() << +// Message::SendWarning() << // " ** SendAll has produced Check Messages : **"<NewEmptyModel(); @@ -339,7 +332,7 @@ checks.Merge(checklst); if (!res) checks.CCheck(0)->AddFail ("SendSelected (WriteFile) has failed"); // if (!checks.IsEmpty(Standard_False)) { -// Message::DefaultMessenger() << +// Message::SendWarning() << // " ** SendSelected has produced Check Messages : **"<DynamicType(); if (!theline.Value(1).IsEqual("!XSTEP") || !theline.Value(2).IsEqual("SESSION") || !theline.Value(4).IsEqual(sesstype->Name()) ) - { sout<<"Lineno."<DynamicType(); if (!theline.Value(1).IsEqual("!XSTEP") || !theline.Value(2).IsEqual("SESSION") || !theline.Value(4).IsEqual(sesstype->Name()) ) - { sout<<"Lineno."<SetErrorHandle(Standard_False); else if (theline.Value(2).IsEqual("1")) thesess->SetErrorHandle(Standard_True); - else { sout<<"Lineno."<SetValue ( atoi(theline.Value(2).ToCString()) ); AddItem (par); @@ -474,7 +474,7 @@ if (!ReadLine()) return 1; if (theline.Value(1).Value(1) == '!') break; // liste suivante if (theline.Length() != 2) - { sout<<"Lineno."<SetDirect( (direct > 0) ); } DeclareAndCast(IFSelect_SelectAnyList,sli,item); if (!sli.IsNull()) { - if (numlist == 0) sout<<"Lineno."<SetRange(low,up); } AddItem(item); @@ -535,29 +535,29 @@ if (!ReadLine()) return 1; if (theline.Value(1).Value(1) == '!') break; // liste suivante if (theline.Length() < 3) - { sout<<"Lineno."< 1) - sout<<"Lineno."<SetInput(source); } DeclareAndCast(IFSelect_SelectDeduct,sdt,sel); if (!sdt.IsNull()) { if (nbs > 1) - sout<<"Lineno."<SetInput(GetCasted(IFSelect_Selection,ItemValue(3))); } DeclareAndCast(IFSelect_SelectControl,sct,sel); if (!sct.IsNull()) { if (nbs != 2) - sout<<"Lineno."<SetMainInput (GetCasted(IFSelect_Selection,ItemValue(3))); sct->SetSecondInput (GetCasted(IFSelect_Selection,ItemValue(4))); } @@ -574,13 +574,13 @@ if (!ReadLine()) return 1; if (theline.Value(1).Value(1) == '!') break; // liste suivante if (theline.Length() < 2) - { sout<<"Lineno."<SetItemSelection(disp,input); } @@ -631,7 +631,7 @@ if (!ReadLine()) return 1; if (theline.Value(1).Value(1) == '!') break; // liste suivante if (theline.Length() != 2) - { sout<<"Lineno."<SetFileRoot (disp,theline.Value(2).ToCString()); } @@ -652,12 +652,12 @@ if (!ReadLine()) return 1; if (theline.Value(1).Value(1) == '!') break; // liste suivante if (theline.Length() < 3) - { sout<<"Lineno."<SetItemSelection (modif,input); if (!disp.IsNull()) thesess->SetAppliedModifier (modif,disp); else thesess->SetAppliedModifier (modif,thesess->ShareOut()); @@ -670,11 +670,11 @@ Standard_Integer IFSelect_SessionFile::ReadEnd () { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if ( theline.Length() != 2 || !theline.Value(1).IsEqual("!XSTEP") || !theline.Value(2).IsEqual("END")) - { sout<<"End of File Incorrect, lineno"<ReadOwn(*this,type,item)) break; dumper = dumper->Next(); } - if (dumper.IsNull()) sout<<" -- Lineno."< echec } @@ -738,7 +738,7 @@ void IFSelect_SessionFile::AddItem (const Handle(Standard_Transient)& item, const Standard_Boolean active) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); const TCollection_AsciiString& name = theline.Value(1); Standard_Integer id = 0; @@ -749,7 +749,7 @@ else id = thesess->AddNamedItem(name.ToCString(),item,active); } else sout<<"Lineno."<Value(id); if (filenum == 0) { if (!par.IsNull()) sout << "Lineno " << thenl << " -- Unknown Item : " - << " Type:" << par->DynamicType()->Name() << Message_EndLine; //sout<DynamicType()->Name() << std::endl; //sout<Item(id); diff -Nru opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_SessionPilot.cxx opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_SessionPilot.cxx --- opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_SessionPilot.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_SessionPilot.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -344,7 +344,8 @@ } counter->AddWithGraph (list,thesession->Graph()); } - counter->PrintList(Message::DefaultMessenger(),thesession->Model(),mode); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); + counter->PrintList (sout, thesession->Model(), mode); return IFSelect_RetVoid; } diff -Nru opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_SignatureList.cxx opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_SignatureList.cxx --- opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_SignatureList.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_SignatureList.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,8 +16,6 @@ #include #include #include -#include -#include #include #include #include @@ -147,30 +145,30 @@ { return thename->ToCString(); } - void IFSelect_SignatureList::PrintCount (const Handle(Message_Messenger)& S) const + void IFSelect_SignatureList::PrintCount (Standard_OStream& S) const { Standard_Integer nbtot = 0, nbsign = 0; NCollection_IndexedDataMap::Iterator iter(thedicount); - S << " Count "<ToCString()<<"\n ----- -----------"<ToCString()<<"\n ----- -----------"< 0) S << thename->ToCString()<< " Nul : " << thenbnuls< 0) S << thename->ToCString()<< " Nul : " << thenbnuls <::Iterator iter(thediclist); for (; iter.More(); iter.Next()) { DeclareAndCast(TColStd_HSequenceOfTransient,list,iter.Value()); - S<Length(); S<<" - Nb: "< 5 && mod == IFSelect_ShortByItem) nc = 5; for (Standard_Integer i = 1; i <= nc; i ++) { if (list->Value(i).IsNull()) { - S<<" 0"; if (mod == IFSelect_EntitiesByItem) S<<":(Global)"; + S << " 0"; + if (mod == IFSelect_EntitiesByItem) S<<":(Global)"; continue; } Standard_Integer num = model->Number(list->Value(i)); if (num == IFSelect_ShortByItem) { S<<" ??"; continue; } S<<" "<PrintLabel(list->Value(i),S); } + { S<<":"; model->PrintLabel(list->Value(i), S); } } if (nc < nb) S<<" .. etc"; - S<::Iterator iter(thedicount); - S << " Summary "<ToCString()<<"\n ----- -----------"<ToCString()<<"\n ----- -----------"< 0) { - S<<" Summary on Integer Values"< #include class TCollection_HAsciiString; -class Message_Messenger; class Interface_InterfaceModel; @@ -117,7 +116,7 @@ Standard_EXPORT virtual Standard_CString Name() const; //! Prints the counts of items (not the list) - Standard_EXPORT virtual void PrintCount (const Handle(Message_Messenger)& S) const; + Standard_EXPORT virtual void PrintCount (Standard_OStream& S) const; //! Prints the lists of items, if they are present (else, prints //! a message "no list available") @@ -129,13 +128,13 @@ //! - ShortByItem(D) complete list of entity numbers (0: "Global") //! - EntitiesByItem : list of (entity number/PrintLabel from the model) //! other modes are ignored - Standard_EXPORT virtual void PrintList (const Handle(Message_Messenger)& S, const Handle(Interface_InterfaceModel)& model, const IFSelect_PrintCount mod = IFSelect_ListByItem) const; + Standard_EXPORT virtual void PrintList (Standard_OStream& S, const Handle(Interface_InterfaceModel)& model, const IFSelect_PrintCount mod = IFSelect_ListByItem) const; //! Prints a summary //! Item which has the greatest count of entities //! For items which are numeric values : their count, maximum, //! minimum values, cumul, average - Standard_EXPORT virtual void PrintSum (const Handle(Message_Messenger)& S) const; + Standard_EXPORT virtual void PrintSum (Standard_OStream& S) const; diff -Nru opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_TransformStandard.cxx opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_TransformStandard.cxx --- opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_TransformStandard.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_TransformStandard.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -146,7 +146,7 @@ Interface_CopyTool& TC, Interface_CheckIterator& checks, Handle(Interface_InterfaceModel)& newmod) const { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); Standard_Boolean res = Standard_True; Standard_Boolean chg = Standard_False; Standard_Integer nb = NbModifiers(); @@ -176,11 +176,11 @@ Interface_CheckIterator checklist = ctx.CheckList(); if (!checklist.IsEmpty(Standard_False)) { checks.Merge(checklist); - sout<<"IFSelect_TransformStandard : Messages from Modifier n0 "< #include #include -#include -#include #include #include #include @@ -48,7 +46,7 @@ (const Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol, const Handle(Standard_Transient)& entity, - const Handle(Message_Messenger)& S) const + Standard_OStream& S) const { if (thelevhlp.IsNull()) DumpEntity (model,protocol,entity,S,0); else DumpEntity (model,protocol,entity,S,thelevdef); @@ -89,3 +87,12 @@ if (str.IsNull()) return ""; return str->ToCString(); } + +Standard_Integer IFSelect_WorkLibrary::ReadStream(const Standard_CString /*name*/, + std::istream& /*istream*/, + Handle(Interface_InterfaceModel)& /*model*/, + const Handle(Interface_Protocol)& /*protocol*/) const +{ + return 1; +} + diff -Nru opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_WorkLibrary.hxx opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_WorkLibrary.hxx --- opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_WorkLibrary.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_WorkLibrary.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,8 +31,6 @@ class Interface_EntityIterator; class Interface_CopyTool; class Standard_Transient; -class Message_Messenger; - class IFSelect_WorkLibrary; DEFINE_STANDARD_HANDLE(IFSelect_WorkLibrary, Standard_Transient) @@ -63,6 +61,16 @@ //! and recognize the Entities) Standard_EXPORT virtual Standard_Integer ReadFile (const Standard_CString name, Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol) const = 0; + //! Interface to read a data from the specified stream. + //! @param model is the resulting Model, which has to be created by this method. + //! In case of error, model must be returned Null + //! Return value is a status: 0 - OK, 1 - read failure, -1 - stream failure. + //! + //! Default implementation returns 1 (error). + Standard_EXPORT virtual Standard_Integer ReadStream (const Standard_CString theName, std::istream& theIStream, + Handle(Interface_InterfaceModel)& model, + const Handle(Interface_Protocol)& protocol) const; + //! Gives the way to Write a File from a Model. //! contains all necessary informations : the model, the //! protocol, the file name, and the list of File Modifiers to be @@ -98,10 +106,10 @@ //! for each norm. helps to identify, number ... entities. //! is to be interpreted for each norm (because of the //! formats which can be very different) - Standard_EXPORT virtual void DumpEntity (const Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol, const Handle(Standard_Transient)& entity, const Handle(Message_Messenger)& S, const Standard_Integer level) const = 0; + Standard_EXPORT virtual void DumpEntity (const Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol, const Handle(Standard_Transient)& entity, Standard_OStream& S, const Standard_Integer level) const = 0; //! Calls deferred DumpEntity with the recorded default level - Standard_EXPORT void DumpEntity (const Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol, const Handle(Standard_Transient)& entity, const Handle(Message_Messenger)& S) const; + Standard_EXPORT void DumpEntity (const Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol, const Handle(Standard_Transient)& entity, Standard_OStream& S) const; //! Records a default level and a maximum value for level //! level for DumpEntity can go between 0 and diff -Nru opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_WorkSession.cxx opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_WorkSession.cxx --- opencascade-7.4.1+dfsg1/src/IFSelect/IFSelect_WorkSession.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IFSelect/IFSelect_WorkSession.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -207,8 +207,7 @@ //purpose : //======================================================================= -IFSelect_ReturnStatus IFSelect_WorkSession::ReadFile - (const Standard_CString filename) +IFSelect_ReturnStatus IFSelect_WorkSession::ReadFile(const Standard_CString filename) { if (thelibrary.IsNull()) return IFSelect_RetVoid; if (theprotocol.IsNull()) return IFSelect_RetVoid; @@ -216,16 +215,16 @@ IFSelect_ReturnStatus status = IFSelect_RetVoid; try { OCC_CATCH_SIGNALS - Standard_Integer stat = thelibrary->ReadFile (filename,model,theprotocol); + Standard_Integer stat = thelibrary->ReadFile(filename, model, theprotocol); if (stat == 0) status = IFSelect_RetDone; else if (stat < 0) status = IFSelect_RetError; else status = IFSelect_RetFail; } catch(Standard_Failure const& anException) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout<<" **** Interruption ReadFile par Exception : ****\n"; sout << anException.GetMessageString(); - sout<<"\n Abandon"<ReadStream(theName, theIStream, model, theprotocol); + if (stat == 0) status = IFSelect_RetDone; + else if (stat < 0) status = IFSelect_RetError; + else status = IFSelect_RetFail; + } + catch (Standard_Failure const& anException) { + Message_Messenger::StreamBuffer sout = Message::SendInfo(); + sout << " **** Interruption ReadFile par Exception : ****\n"; + sout << anException.GetMessageString(); + sout << "\n Abandon" << std::endl; + status = IFSelect_RetFail; + } + if (status != IFSelect_RetDone) return status; + if (model.IsNull()) return IFSelect_RetVoid; + SetModel(model); + SetLoadedFile(theName); + return status; +} + //======================================================================= //function : @@ -1245,10 +1277,10 @@ iter = EvalSelection(sel); // appel normal (donc, code pas duplique) } catch (Standard_Failure const& anException) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout<<" **** Interruption EvalSelection par Exception : ****\n"; sout<code unique) } catch (Standard_Failure const& anException) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout<<" **** Interruption SelectionResult par Exception : ****\n"; sout<Graph(),theprotocol,checks,newmod); if (!checks.IsEmpty(Standard_False)) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - sout<<" ** RunTransformer has produced Check Messages : **"<AddFail ("Exception Raised -> Abandon"); } errhand = theerrhand; @@ -2035,8 +2067,8 @@ IFSelect_ShareOutResult R(theshareout,thegraph->Graph()); checks = thecopier->Copy (R,thelibrary,theprotocol); if (!checks.IsEmpty(Standard_False)) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - sout<<" ** EvaluateFile has produced Check Messages : **"<SetRemaining (thegraph->CGraph()); @@ -2125,10 +2157,10 @@ return SendSplit(); // appel normal (donc, code pas duplique) } catch (Standard_Failure const& anException) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout<<" **** Interruption SendSplit par Exception : ****\n"; sout<AddFail ("Exception Raised -> Abandon"); } errhand = theerrhand; @@ -2142,8 +2174,8 @@ return Standard_False; } if (!IsLoaded()) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - sout<< " *** Data for SendSplit not available ***"<AddFail("Data not available"); thecheckrun = checks; return Standard_False; @@ -2160,7 +2192,7 @@ if (theshareout.IsNull()) return Standard_False; Standard_Integer i, nbd = theshareout->NbDispatches(); Standard_Integer nf = 0; - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout<<" SendSplit .. "; for (i = 1; i <= nbd; i ++) { Handle(IFSelect_Dispatch) disp = theshareout->Dispatch(i); @@ -2187,7 +2219,7 @@ if (stat != IFSelect_RetDone) std::cout<<"File "<Graph().Size(); @@ -2271,9 +2303,9 @@ Interface_CopyTool TC(myModel,theprotocol); thecopier->CopiedRemaining (thegraph->Graph(),thelibrary,TC,newmod); if (newmod.IsNull()) { - sout<<" No Remaining Data recorded"<SetRemaining (thegraph->CGraph()); return Standard_False; } else { @@ -2295,17 +2327,17 @@ for (Standard_Integer i = 1; i <= nb; i ++) { if (thegraph->Graph().Status(i) >= 0) ne ++; } if (ne == 0) { - sout<<" - All entities are remaining, none yet sent"<SendAll(filename,thegraph->Graph(),thelibrary,theprotocol); } catch (Standard_Failure const& anException) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout<<" **** Interruption SendAll par Exception : ****\n"; sout<AddFail ("Exception Raised -> Abandon"); thecheckrun = checks; @@ -2398,10 +2430,10 @@ return SendSelected (filename,sel); // appel normal } catch (Standard_Failure const& anException) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout<<" **** Interruption SendSelected par Exception : ****\n"; sout<AddFail ("Exception Raised -> Abandon"); errhand = theerrhand; thecheckrun = checks; @@ -2844,32 +2876,32 @@ void IFSelect_WorkSession::TraceStatics (const Standard_Integer use, const Standard_Integer mode) const { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (use > 0) { - if (mode == 0) sout<<"******************************************"< 0) if (use == 5) { TraceStatics (-2,mode); - if (mode == 0) sout<Prefix(); - if (!str.IsNull()) sout << "Prefix : "<ToCString()<ToCString()<DefaultRootName(); - if (!str.IsNull()) sout << "Default Root : "<ToCString()<ToCString()<Extension(); - if (!str.IsNull()) sout << "Extension : "<ToCString()<ToCString()< 0) { - if (mode == 0) sout<<"******************************************"<Prefix(); - if (!str.IsNull()) sout << "Prefix : " << str->ToCString() << Message_EndLine; - else sout << "Prefix not Defined" << Message_EndLine; + if (!str.IsNull()) sout << "Prefix : " << str->ToCString() << std::endl; + else sout << "Prefix not Defined" << std::endl; str = theshareout->DefaultRootName(); - if (!str.IsNull()) sout << "Default Root : " << str->ToCString() << Message_EndLine; - else sout << "Default Root not Defined" << Message_EndLine; + if (!str.IsNull()) sout << "Default Root : " << str->ToCString() << std::endl; + else sout << "Default Root not Defined" << std::endl; str = theshareout->Extension(); - if (!str.IsNull()) sout << "Extension : " << str->ToCString() << Message_EndLine; - else sout << "Extension not defined" << Message_EndLine; + if (!str.IsNull()) sout << "Extension : " << str->ToCString() << std::endl; + else sout << "Extension not defined" << std::endl; Standard_Integer lr = theshareout->LastRun(); Standard_Integer nb = theshareout->NbDispatches(); - sout << "Nb Dispatches : " << nb <<" (Last Run : " << lr << ") : "<Dispatch(i); sout << "Dispatch n0 " << i; if (HasName(disp)) sout << " Name:"<< Name(disp)->ToCString(); - sout << " Label:" << disp->Label() << Message_EndLine; + sout << " Label:" << disp->Label() << std::endl; Handle(IFSelect_Selection) sel = disp->FinalSelection(); - if (sel.IsNull()) sout << " No Final Selection Defined" << Message_EndLine; + if (sel.IsNull()) sout << " No Final Selection Defined" << std::endl; else if (HasName(sel)) sout << " Final Selection : Name:" - << Name(sel)->ToCString() << " Label:" << sel->Label() << Message_EndLine; - else sout << " Final Selection : " << sel->Label() << Message_EndLine; + << Name(sel)->ToCString() << " Label:" << sel->Label() << std::endl; + else sout << " Final Selection : " << sel->Label() << std::endl; if (disp->HasRootName()) - sout<<" File Root Name : "<RootName()->ToCString()<RootName()->ToCString()<NbModifiers(Standard_True); if (nbm > 0) sout<< - " *** "<NbModifiers(Standard_False); if (nbf > 0) sout<< - " *** "<ToCString()<<" - "; else sout<<" - (no name) - "; - sout<DynamicType()->Name()<ToCString()<DynamicType()->Name()<ToCString()<NbModifiers(formodel); sout<< " ********** Modifiers in Session "; sout<<(formodel ? "(For Model)" : "(For File)"); - sout<<": "<GeneralModifier(formodel,i); if (!modif.IsNull()) sout<<"Modifier n0."<Label(); if (HasName(modif)) sout << " Named as : " << Name(modif)->ToCString(); - sout<ToCString(); - sout <<" **********"<Label() << " . Input(s) : "<< Message_EndLine; + sout <<" **********"<Label() << " . Input(s) : "<< std::endl; Standard_Integer nb = 0; IFSelect_SelectionIterator iter; sel->FillIterator(iter); for (; iter.More(); iter.Next()) { nb ++; Handle(IFSelect_Selection) newsel = iter.Value(); - sout<<" -- "<Label()<Label()< 0) - S << " ******** Loaded File : "<DumpHeader(S); S<DumpHeader (S); S <NbEntities(); @@ -3297,26 +3329,26 @@ for (Standard_Integer i = 1; i <= nbent; i ++) { if (!shar.IsShared(myModel->Value(i))) nbr ++; } - S << " *****************************************************************\n"; - S << " ******** Model : "<Entities(),1); + S <<" ******** Complete List ******** "; + ListEntities (myModel->Entities(), 1, S); } else if (level > 2) { IFSelect_PrintCount mode = IFSelect_ItemsByEntity; if (level == 5 || level == 8) mode = IFSelect_CountByItem; if (level == 6 || level == 9) mode = IFSelect_ListByItem; if (level == 7 || level == 10) mode = IFSelect_EntitiesByItem; - PrintCheckList (ModelCheckList(),Standard_False, mode); + PrintCheckList (S, ModelCheckList(),Standard_False, mode); } else { - if (level == 3) S << " ******** Check Model (Fails) ********"< what could be determined is listed"< what could be determined is listed"<Number(ent); - if (num == 0) { S<<" *** Entity to Dump not in the Model ***"<DumpEntity (myModel,theprotocol,ent,S,level); } @@ -3400,8 +3432,8 @@ void IFSelect_WorkSession::TraceDumpEntity (const Handle(Standard_Transient)& ent, const Standard_Integer level) const { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - DumpEntity (ent,level,sout); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); // should it be changed to SendTrace()? + DumpEntity (ent, level, sout); } // .... PrintEntityStatus .... @@ -3412,42 +3444,42 @@ //======================================================================= void IFSelect_WorkSession::PrintEntityStatus - (const Handle(Standard_Transient)& ent, const Handle(Message_Messenger)& S) + (const Handle(Standard_Transient)& ent, Standard_OStream& S) { Standard_Integer i,nb; Standard_Integer num = StartingNumber(ent); if (num == 0) { std::cout<<" -- PrintEntityStatus : unknown"<Print(ent,S); + myModel->Print (ent, S); Handle(TCollection_HAsciiString) hname = EntityName(ent); - if (!hname.IsNull() && hname->Length() > 0) S<<" Name:"<ToCString(); - S<Length() > 0) S <<" Name:"<ToCString(); + S <DynamicType()->Name()<Value (ent,myModel)<DynamicType()->Name()<Value (ent,myModel)<Length(); - if (nb == 0) S<<" Root"; - else S<<" Super-entities:"<Print(list->Value(i),S); } - S<Print(list->Value(i), S); } + S <Length(); - if (nb == 0) S<<" No sub-entity"; - else S<<" Sub-entities:"<Print(list->Value(i),S); } - S<Print(list->Value(i), S); } + S <1 && mode != IFSelect_CountSummary); counter->Analyse (chks,myModel,Standard_True,failsonly); - counter->PrintList (sout,myModel,mode); + counter->PrintList (S, myModel, mode); } } @@ -3481,13 +3513,12 @@ //purpose : //======================================================================= -void IFSelect_WorkSession::PrintSignatureList - (const Handle(IFSelect_SignatureList)& signlist, - const IFSelect_PrintCount mode) const +void IFSelect_WorkSession::PrintSignatureList (Standard_OStream& S, + const Handle(IFSelect_SignatureList)& signlist, + const IFSelect_PrintCount mode) const { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); if (signlist.IsNull()) return; - signlist->PrintList (sout,myModel,mode); + signlist->PrintList (S, myModel, mode); } // #### #### #### #### #### #### #### #### #### @@ -3501,7 +3532,7 @@ void IFSelect_WorkSession::EvaluateSelection (const Handle(IFSelect_Selection)& sel) const { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (errhand) { errhand = Standard_False; try { @@ -3511,20 +3542,20 @@ catch (Standard_Failure const& anException) { sout<<" **** Interruption EvaluateSelection par Exception **** Intitule\n"; sout<Label()<Label()<NbDispatches() < numdisp || numdisp <= 0) - { sout<<"Dispatch : Unknown"<FinalSelection().IsNull()) - { sout<<"Dispatch : No Final Selection"<Label()<Label()<Graph()); eval.Evaluate(); @@ -3571,35 +3602,35 @@ eval.Packets (mode ? Standard_True : Standard_False); Standard_Integer nbpack = evres->NbPackets(); - sout<<"Nb Packets produced : "<Entities(numpack), (mode ? 2 : -1)); + ListEntities (evres->Entities(numpack), (mode ? 2 : -1), sout); } //// Interface_EntityIterator iterem = disp->Remainder(thegraph->Graph()); if (mode == 0) return; if (mode == 1 || mode == 3) { - sout<NbDuplicated(0,Standard_False) == 0) - sout<<" **** All the Model is taken into account ****"<Duplicated(0,Standard_False),2); + sout<<" **** Starting Entities not taken by this Dispatch ****"<Duplicated(0,Standard_False), 2, sout); } } if (mode >= 2) { sout<<" **** Entites in more than one packet ****"; Standard_Integer max = evres->HighestDuplicationCount(); - if (max < 2) sout<<" : There are none"<NbDuplicated(newcount,Standard_False) == 0) continue; - sout<<" **** Entities put in "<Duplicated(newcount,Standard_False),2); + sout<<" **** Entities put in "<Duplicated(newcount,Standard_False), 2, sout); } } } @@ -3617,7 +3648,7 @@ void IFSelect_WorkSession::EvaluateComplete (const Standard_Integer mode) const { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); if (errhand) { errhand = Standard_False; try { @@ -3627,53 +3658,53 @@ catch (Standard_Failure const& anException) { sout<<" **** Interruption EvaluateComplete par Exception : ****\n"; sout<Graph()); eval.Evaluate(); sout<<"\n******** Evaluation ShareOutResult (Complete) ********\n"; - sout<<" **** List of Packets **** Count : "<NbPackets(); - sout<<"Nb Packets produced : "<Entities(numpack), (mode ? 2: -1)); + ListEntities (evres->Entities(numpack), (mode ? 2: -1), sout); } if (mode == 0) return; if (mode == 1 || mode == 3) { - sout<NbDuplicated(0,Standard_False) == 0) - sout<<" **** All the Model is taken into account ****"<Duplicated(0,Standard_False),2); + sout<<" **** Starting Entities Forgotten ****"<Duplicated(0,Standard_False), 2, sout); } } if (mode >= 2) { - sout<<" **** Entites in more than one packet ****"<HighestDuplicationCount(); - if (max < 2) sout<<" : There are none"<NbDuplicated(newcount,Standard_False) == 0) continue; - sout<<" **** Entities put in "<Duplicated(newcount,Standard_False),2); + sout<<" **** Entities put in "<Duplicated(newcount,Standard_False), 2, sout); } } } @@ -3689,14 +3720,13 @@ //======================================================================= void IFSelect_WorkSession::ListEntities - (const Interface_EntityIterator& iter, const Standard_Integer mmode) const + (const Interface_EntityIterator& iter, const Standard_Integer mmode, Standard_OStream& sout) const { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); int titre = 0; Standard_Integer mode = (mmode < 0 ? -mmode : mmode); - if (mmode >= 0) sout << " List of " << iter.NbEntities() << " Entities :"<= 0) sout << " List of " << iter.NbEntities() << " Entities :"<Graph()); try { @@ -3704,9 +3734,9 @@ int newcount = -1; int mods = 0; int cnt = 0; for (iter.Start(); iter.More(); iter.Next()) { if (!titre && mode == 1) sout - << "Number/Id. Category Validity Type\n----------- ----...."<Print(ent,sout,0); + myModel->Print (ent, sout, 0); if (!tool.IsShared(ent)) sout << " #ROOT#"; else sout << " "; Standard_Integer catnum = myModel->CategoryNumber(num); if (catnum > 0) sout<<" "<TypeName (ent, Standard_False)<TypeName (ent, Standard_False)< 0) sout<<","; sout<= 10) { sout << Message_EndLine<<"["<= 10) { sout << std::endl<<"["< 0) sout << " "; - myModel->Print(ent,sout,0); + myModel->Print (ent, sout, 0); if (!tool.IsShared(ent)) { if(mods == 0) sout<<"("; sout<<"R"; mods++; } if (myModel->IsUnknownEntity(num)) { sout<<(mods==0 ? '(' : ' ')<<"?"; mods ++; } if (myModel->IsRedefinedContent(num)) { sout<<(mods==0 ? '(' : ' ')<<"*"; mods ++; } if (mods) { sout<<")"; newcount ++; } } } - if (mode == 0) sout< as 3 but all CheckList (Fails + Warnings) //! 5,6,7 : as 3 but resp. Count,List,Labels by Fail //! 8,9,10 : as 4 but resp. Count,List,Labels by message - Standard_EXPORT void DumpModel (const Standard_Integer level, const Handle(Message_Messenger)& S); + Standard_EXPORT void DumpModel (const Standard_Integer level, Standard_OStream& S); //! Dumps the current Model (as inherited DumpModel), on currently //! defined Default Trace File (default is standard output) @@ -1029,12 +1034,12 @@ //! is to be interpreted for each norm : see specific //! classes of WorkLibrary for it. Generally, 0 if for very basic //! (only type ...), greater values give more and more details. - Standard_EXPORT void DumpEntity (const Handle(Standard_Transient)& ent, const Standard_Integer level, const Handle(Message_Messenger)& S) const; + Standard_EXPORT void DumpEntity (const Handle(Standard_Transient)& ent, const Standard_Integer level, Standard_OStream& S) const; //! Prints main informations about an entity : its number, type, //! validity (and checks if any), category, shareds and sharings.. //! mutable because it can recompute checks as necessary - Standard_EXPORT void PrintEntityStatus (const Handle(Standard_Transient)& ent, const Handle(Message_Messenger)& S); + Standard_EXPORT void PrintEntityStatus (const Handle(Standard_Transient)& ent, Standard_OStream& S); //! Dumps an entity from the current Model as inherited DumpEntity //! on currently defined Default Trace File @@ -1049,12 +1054,17 @@ //! 1 : according messages, count of entities //! 2 : id but with list of entities, designated by their numbers //! 3 : as 2 but with labels of entities - Standard_EXPORT void PrintCheckList (const Interface_CheckIterator& checklist, const Standard_Boolean failsonly, const IFSelect_PrintCount mode) const; + Standard_EXPORT void PrintCheckList (Standard_OStream& S, + const Interface_CheckIterator& checklist, + const Standard_Boolean failsonly, + const IFSelect_PrintCount mode) const; //! Prints a SignatureList to the current Trace File, controlled //! with the current Model //! defines the mode of printing (see SignatureList) - Standard_EXPORT void PrintSignatureList (const Handle(IFSelect_SignatureList)& signlist, const IFSelect_PrintCount mode) const; + Standard_EXPORT void PrintSignatureList (Standard_OStream& S, + const Handle(IFSelect_SignatureList)& signlist, + const IFSelect_PrintCount mode) const; //! Displays the list of Entities selected by a Selection (i.e. //! the result of EvalSelection). @@ -1086,7 +1096,7 @@ //! 1 gives a more complete trace (1 line per Entity) //! (can be used each time a trace has to be output from a list) //! 2 gives a form suitable for givelist : (n1,n2,n3...) - Standard_EXPORT void ListEntities (const Interface_EntityIterator& iter, const Standard_Integer mode) const; + Standard_EXPORT void ListEntities (const Interface_EntityIterator& iter, const Standard_Integer mode, Standard_OStream& S) const; DEFINE_STANDARD_RTTIEXT(IFSelect_WorkSession,Standard_Transient) diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_SpecificModule.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_SpecificModule.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_SpecificModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_SpecificModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -67,7 +67,7 @@ void IGESAppli_SpecificModule::OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, - const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, + const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const { switch (CN) { diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_SpecificModule.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_SpecificModule.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_SpecificModule.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_SpecificModule.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,8 +25,6 @@ #include class IGESData_IGESEntity; class IGESData_IGESDumper; -class Message_Messenger; - class IGESAppli_SpecificModule; DEFINE_STANDARD_HANDLE(IGESAppli_SpecificModule, IGESData_SpecificModule) @@ -43,7 +41,7 @@ Standard_EXPORT IGESAppli_SpecificModule(); //! Specific Dump (own parameters) for IGESAppli - Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const Standard_OVERRIDE; + Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const Standard_OVERRIDE; //! ---Purpose Standard_EXPORT virtual Standard_Boolean OwnCorrect (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent) const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolDrilledHole.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolDrilledHole.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolDrilledHole.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolDrilledHole.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -128,16 +128,16 @@ void IGESAppli_ToolDrilledHole::OwnDump (const Handle(IGESAppli_DrilledHole)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESAppli_DrilledHole" << Message_EndLine; + S << "IGESAppli_DrilledHole" << std::endl; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; + S << "Number of property values : " << ent->NbPropertyValues() << std::endl; S << "Drill diameter size :" << ent->DrillDiaSize() << " "; - S << "Finish diameter size : " << ent->FinishDiaSize() << Message_EndLine; + S << "Finish diameter size : " << ent->FinishDiaSize() << std::endl; S << "Plating indication flag : "; if (!ent->IsPlating()) S << "NO" << " - "; else S << "YES - "; S << "Lower Numbered Layer : " << ent->NbLowerLayer() << " "; - S << "Higher Numbered Layer : " << ent->NbHigherLayer() << Message_EndLine; + S << "Higher Numbered Layer : " << ent->NbHigherLayer() << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolDrilledHole.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolDrilledHole.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolDrilledHole.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolDrilledHole.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; //! Tool to work on a DrilledHole. Called by various Modules @@ -74,7 +73,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_DrilledHole)& entfrom, const Handle(IGESAppli_DrilledHole)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_DrilledHole)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_DrilledHole)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolElementResults.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolElementResults.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolElementResults.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolElementResults.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -303,34 +303,34 @@ void IGESAppli_ToolElementResults::OwnDump (const Handle(IGESAppli_ElementResults)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const // UNFINISHED + Standard_OStream& S, const Standard_Integer level) const // UNFINISHED { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESAppli_ElementResults" << Message_EndLine; + S << "IGESAppli_ElementResults\n"; S << "General Note : "; dumper.Dump(ent->Note(),S, sublevel); - S << Message_EndLine; - S << "Subcase Number : " << ent->SubCaseNumber() << Message_EndLine; - S << "Time : " << ent->Time() << Message_EndLine; - S << "Number of Result Values : " << ent->NbResultValues() << Message_EndLine; - S << "Result Report Flag : " << ent->ResultReportFlag() << Message_EndLine; + S << "\n"; + S << "Subcase Number : " << ent->SubCaseNumber() << "\n"; + S << "Time : " << ent->Time() << "\n"; + S << "Number of Result Values : " << ent->NbResultValues() << "\n"; + S << "Result Report Flag : " << ent->ResultReportFlag() << "\n"; S << "Element Identifiers : "; - IGESData_DumpVals(S ,level,1, ent->NbElements(),ent->ElementIdentifier); - S << Message_EndLine << "Elements : "; + IGESData_DumpVals(S,level,1, ent->NbElements(),ent->ElementIdentifier); + S << "\nElements : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbElements(),ent->Element); - S << Message_EndLine << "Element Topology Types : "; - IGESData_DumpVals(S ,level,1, ent->NbElements(),ent->ElementTopologyType); - S << Message_EndLine << "Numbers of Layers : "; - IGESData_DumpVals(S ,level,1, ent->NbElements(),ent->NbLayers); - S << Message_EndLine << "Data Layer Flags : "; - IGESData_DumpVals(S ,level,1, ent->NbElements(),ent->DataLayerFlag); - S << Message_EndLine << "Numbers of Result Data Locations : "; - IGESData_DumpVals(S ,level,1, ent->NbElements(),ent->NbResultDataLocs); - S << Message_EndLine << "Result Data Locations : "; S << " TO BE DONE "; + S << "\nElement Topology Types : "; + IGESData_DumpVals(S,level,1, ent->NbElements(),ent->ElementTopologyType); + S << "\nNumbers of Layers : "; + IGESData_DumpVals(S,level,1, ent->NbElements(),ent->NbLayers); + S << "\nData Layer Flags : "; + IGESData_DumpVals(S,level,1, ent->NbElements(),ent->DataLayerFlag); + S << "\nNumbers of Result Data Locations : "; + IGESData_DumpVals(S,level,1, ent->NbElements(),ent->NbResultDataLocs); + S << "\nResult Data Locations : "; S << " TO BE DONE "; // ?? A VERIFIER DE PRES, pas du tout sur que ce soit bon // cf aussi Write et Copy - if (level <= 4) S << " [ ask level > 4 for more, > 5 for complete ]" << Message_EndLine; + if (level <= 4) S << " [ ask level > 4 for more, > 5 for complete ]\n"; else { Standard_Integer i;// svv Jan 10 2000 : porting on DEC for (i = 1; i <= ent->NbElements(); i ++) { @@ -338,14 +338,14 @@ S << " ["<ResultDataLoc (i,j); - S << Message_EndLine; + S << "\n"; } S << "Result Data : "; for (i = 1; i <= ent->NbElements(); i ++) { Standard_Integer nres = ent->NbResults(i); S << " ["< 5 for complete Data ]" << Message_EndLine; + if (level <= 5) S << " [ ask level > 5 for complete Data ]\n"; else { for (Standard_Integer j = 1; j <= nres; j ++) S << " " << ent->ResultData(i,j); // ?? is it all ?? UNFINISHED diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolElementResults.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolElementResults.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolElementResults.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolElementResults.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ElementResults. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_ElementResults)& entfrom, const Handle(IGESAppli_ElementResults)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_ElementResults)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_ElementResults)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFiniteElement.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFiniteElement.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFiniteElement.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFiniteElement.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -126,13 +125,13 @@ void IGESAppli_ToolFiniteElement::OwnDump (const Handle(IGESAppli_FiniteElement)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESAppli_FiniteElement" << Message_EndLine; + S << "IGESAppli_FiniteElement\n"; - S << "Topology type : " << ent->Topology() << Message_EndLine; + S << "Topology type : " << ent->Topology() << "\n"; S << "Nodes : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbNodes(),ent->Node); - S << Message_EndLine << "Element Name : " << ent->Name(); - S << Message_EndLine; + S << "\nElement Name : " << ent->Name()->String(); + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFiniteElement.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFiniteElement.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFiniteElement.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFiniteElement.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a FiniteElement. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_FiniteElement)& entfrom, const Handle(IGESAppli_FiniteElement)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_FiniteElement)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_FiniteElement)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlow.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlow.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlow.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlow.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -295,36 +295,36 @@ void IGESAppli_ToolFlow::OwnDump (const Handle(IGESAppli_Flow)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESAppli_Flow" << Message_EndLine; - S << "Number of Context Flags : " << ent->NbContextFlags() << Message_EndLine; + S << "IGESAppli_Flow\n"; + S << "Number of Context Flags : " << ent->NbContextFlags() << "\n"; Standard_Integer tf = ent->TypeOfFlow(); S << "Type of Flow : " << tf; - if (tf == 1) S << " (logical)" << Message_EndLine; - else if (tf == 2) S << " (physical)" << Message_EndLine; - else S << " (not specified)" << Message_EndLine; + if (tf == 1) S << " (logical)\n"; + else if (tf == 2) S << " (physical)\n"; + else S << " (not specified)\n"; tf = ent->FunctionFlag(); S << "Function Flag : " << tf; - if (tf == 1) S << " (electrical signal)" << Message_EndLine; - else if (tf == 2) S << " (fluid flow path)" << Message_EndLine; - else S << " (not specified)" << Message_EndLine; + if (tf == 1) S << " (electrical signal)\n"; + else if (tf == 2) S << " (fluid flow path)\n"; + else S << " (not specified)\n"; S << "Flow Associativities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbFlowAssociativities(), ent->FlowAssociativity); - S << Message_EndLine << "Connect Points : "; + S << "\nConnect Points : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbConnectPoints(), ent->ConnectPoint); - S << Message_EndLine << "Joins : "; + S << "\nJoins : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbJoins(),ent->Join); - S << Message_EndLine << "Flow Names : "; + S << "\nFlow Names : "; IGESData_DumpStrings(S ,level,1, ent->NbFlowNames(),ent->FlowName); - S << Message_EndLine << "Text Display Templates : "; + S << "\nText Display Templates : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbTextDisplayTemplates(), ent->TextDisplayTemplate); - S << Message_EndLine << "Continuation Flow Associativities : "; + S << "\nContinuation Flow Associativities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbContFlowAssociativities(), ent->ContFlowAssociativity); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlow.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlow.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlow.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlow.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Flow. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_Flow)& entfrom, const Handle(IGESAppli_Flow)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_Flow)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_Flow)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlowLineSpec.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlowLineSpec.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlowLineSpec.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlowLineSpec.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -106,11 +106,11 @@ void IGESAppli_ToolFlowLineSpec::OwnDump (const Handle(IGESAppli_FlowLineSpec)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESAppli_FlowLineSpec" << Message_EndLine; + S << "IGESAppli_FlowLineSpec\n"; S << "Name and Modifiers : "; IGESData_DumpStrings(S ,level,1, ent->NbPropertyValues(),ent->Modifier); - S << Message_EndLine; + S << "\n"; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlowLineSpec.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlowLineSpec.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlowLineSpec.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolFlowLineSpec.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a FlowLineSpec. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_FlowLineSpec)& entfrom, const Handle(IGESAppli_FlowLineSpec)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_FlowLineSpec)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_FlowLineSpec)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelFunction.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelFunction.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelFunction.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelFunction.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -120,13 +120,13 @@ void IGESAppli_ToolLevelFunction::OwnDump (const Handle(IGESAppli_LevelFunction)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { - S << "IGESAppli_LevelFunction" << Message_EndLine; + S << "IGESAppli_LevelFunction\n"; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Function Description code : " << ent->FuncDescriptionCode() << Message_EndLine; + S << "Number of property values : " << ent->NbPropertyValues() << "\n"; + S << "Function Description code : " << ent->FuncDescriptionCode() << "\n"; S << "Function Description : "; IGESData_DumpString(S,ent->FuncDescription()); - S << Message_EndLine; + S << "\n"; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelFunction.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelFunction.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelFunction.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelFunction.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a LevelFunction. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_LevelFunction)& entfrom, const Handle(IGESAppli_LevelFunction)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_LevelFunction)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_LevelFunction)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelToPWBLayerMap.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelToPWBLayerMap.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelToPWBLayerMap.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelToPWBLayerMap.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -158,30 +158,30 @@ void IGESAppli_ToolLevelToPWBLayerMap::OwnDump (const Handle(IGESAppli_LevelToPWBLayerMap)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer i, num; - S << "IGESAppli_LevelToPWBLayerMap" << Message_EndLine; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Exchange File Level Number : " << Message_EndLine; - S << "Native Level Identification : " << Message_EndLine; - S << "Physical Layer Number : " << Message_EndLine; + S << "IGESAppli_LevelToPWBLayerMap\n"; + S << "Number of property values : " << ent->NbPropertyValues() << "\n"; + S << "Exchange File Level Number :\n"; + S << "Native Level Identification :\n"; + S << "Physical Layer Number :\n"; S << "Exchange File Level Identification : "; IGESData_DumpStrings (S,-level,1, ent->NbLevelToLayerDefs(),ent->ExchangeFileLevelIdent); - S << Message_EndLine; + S << "\n"; if (level > 4) for ( num = ent->NbLevelToLayerDefs(), i = 1; i <= num; i++ ) { - S << "[" << i << "]: " << Message_EndLine; + S << "[" << i << "]:\n"; S << "Exchange File Level Number : " - << ent->ExchangeFileLevelNumber(i) << Message_EndLine; + << ent->ExchangeFileLevelNumber(i) << "\n"; S << "Native Level Identification : "; IGESData_DumpString(S,ent->NativeLevel(i)); - S << Message_EndLine; - S << "Physical Layer Number : " << ent->PhysicalLayerNumber(i) << Message_EndLine; + S << "\n"; + S << "Physical Layer Number : " << ent->PhysicalLayerNumber(i) << "\n"; S << "Exchange File Level Identification : "; IGESData_DumpString(S,ent->ExchangeFileLevelIdent(i)); - S << Message_EndLine; + S << "\n"; } } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelToPWBLayerMap.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelToPWBLayerMap.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelToPWBLayerMap.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLevelToPWBLayerMap.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a LevelToPWBLayerMap. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_LevelToPWBLayerMap)& entfrom, const Handle(IGESAppli_LevelToPWBLayerMap)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_LevelToPWBLayerMap)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_LevelToPWBLayerMap)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLineWidening.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLineWidening.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLineWidening.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLineWidening.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,6 @@ #include #include #include -#include #include IGESAppli_ToolLineWidening::IGESAppli_ToolLineWidening () { } @@ -136,36 +135,36 @@ void IGESAppli_ToolLineWidening::OwnDump (const Handle(IGESAppli_LineWidening)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESAppli_LineWidening" << Message_EndLine; + S << "IGESAppli_LineWidening\n"; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Width of metalization : " << ent->WidthOfMetalization() << Message_EndLine; + S << "Number of property values : " << ent->NbPropertyValues() << "\n"; + S << "Width of metalization : " << ent->WidthOfMetalization() << "\n"; S << "Cornering Code : " ; - if (ent->CorneringCode() == 0) S << "0 (rounded)" << Message_EndLine; - else if (ent->CorneringCode() == 1) S << "1 (squared)" << Message_EndLine; - else S << "incorrect value" << Message_EndLine; + if (ent->CorneringCode() == 0) S << "0 (rounded)\n"; + else if (ent->CorneringCode() == 1) S << "1 (squared)\n"; + else S << "incorrect value\n"; S << "Extension Flag : " ; - if (ent->ExtensionFlag() == 0) S << "0 (No Extension)" << Message_EndLine; - else if (ent->ExtensionFlag() == 1) S << "1 (One-half width extension)" << Message_EndLine; - else if (ent->ExtensionFlag() == 2) S << "2 (Extension set by ExtensionValue)" << Message_EndLine; - else S << "incorrect value" << Message_EndLine; + if (ent->ExtensionFlag() == 0) S << "0 (No Extension)\n"; + else if (ent->ExtensionFlag() == 1) S << "1 (One-half width extension)\n"; + else if (ent->ExtensionFlag() == 2) S << "2 (Extension set by ExtensionValue)\n"; + else S << "incorrect value\n"; S << "Justification Flag : " ; if (ent->JustificationFlag() == 0) - S << "0 (Centre justified)" << Message_EndLine; + S << "0 (Centre justified)\n"; else if (ent->JustificationFlag() == 1) - S << "1 (left justified)" << Message_EndLine; + S << "1 (left justified)\n"; else if (ent->JustificationFlag() == 2) - S << "2 (right justified)" << Message_EndLine; + S << "2 (right justified)\n"; else - S << "incorrect value" << Message_EndLine; + S << "incorrect value\n"; if (ent->ExtensionFlag() == 2) - S << "Extension Value : " << ent->ExtensionValue() << Message_EndLine; + S << "Extension Value : " << ent->ExtensionValue() << std::endl; else - S << "No Extension Value (Extension Flag != 2)" << Message_EndLine; + S << "No Extension Value (Extension Flag != 2)" << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLineWidening.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLineWidening.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolLineWidening.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolLineWidening.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a LineWidening. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_LineWidening)& entfrom, const Handle(IGESAppli_LineWidening)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_LineWidening)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_LineWidening)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalConstraint.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalConstraint.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalConstraint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalConstraint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -130,15 +130,15 @@ void IGESAppli_ToolNodalConstraint::OwnDump (const Handle(IGESAppli_NodalConstraint)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESAppli_NodalConstraint" << Message_EndLine; - S << "Type of Constraint : " << ent->Type() << Message_EndLine; + S << "IGESAppli_NodalConstraint\n"; + S << "Type of Constraint : " << ent->Type() << "\n"; S << "Node : "; dumper.Dump(ent->NodeEntity(),S, sublevel); - S << Message_EndLine; + S << "\n"; S << "Tabular Data Properties : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbCases(),ent->TabularData); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalConstraint.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalConstraint.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalConstraint.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalConstraint.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a NodalConstraint. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_NodalConstraint)& entfrom, const Handle(IGESAppli_NodalConstraint)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_NodalConstraint)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_NodalConstraint)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalDisplAndRot.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalDisplAndRot.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalDisplAndRot.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalDisplAndRot.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -207,17 +207,17 @@ void IGESAppli_ToolNodalDisplAndRot::OwnDump (const Handle(IGESAppli_NodalDisplAndRot)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESAppli_NodalDisplAndRot" << Message_EndLine; + S << "IGESAppli_NodalDisplAndRot\n"; Standard_Integer nbcases = ent->NbCases(); Standard_Integer nbnodes = ent->NbNodes(); - S << "No. of analysis cases : " << nbcases << Message_EndLine; + S << "No. of analysis cases : " << nbcases << "\n"; S << "General Notes : "; IGESData_DumpEntities(S,dumper ,level,1, nbcases,ent->Note); - S << Message_EndLine; + S << "\n"; // gp_GTrsf loca; // true location n.u. switch (level) @@ -232,7 +232,7 @@ // IGESData_DumpListXYZL(S,-level,1,nbcases,ent->TranslationParameter,loca); S << "Rotational Parameters : "; // IGESData_DumpListXYZL(S,-level,1,nbcases,ent->RotationalParameter,loca); - S << " TO BE DONE" << Message_EndLine; + S << " TO BE DONE" << std::endl; break; case 5: case 6: { @@ -240,39 +240,39 @@ { S << "[" << i << "]: "; dumper.Dump (ent->Note(i),S, 1); - S << Message_EndLine; + S << std::endl; } - S << "Nodes : " << Message_EndLine; - S << "Node Identifiers : " << Message_EndLine; - S << "Translation Parameters : " << Message_EndLine; + S << "Nodes :\n"; + S << "Node Identifiers :\n"; + S << "Translation Parameters :\n"; S << "Rotational Parameters : Count = " << nbcases; // IGESData_DumpListXYZL(S,-level,1,nbcases,ent->RotationalParameter,loca); - S << Message_EndLine; + S << "\n"; for (Standard_Integer j = 1; j <= nbnodes; j ++) { S << "[" << j << "]: - NodeIdentifier : " - << ent->NodeIdentifier(j) << " - Node :"<NodeIdentifier(j) << " - Node :\n"; S << "Node : "; dumper.Dump (ent->Node(j),S, 1); - S << " - Parameters : " << Message_EndLine; + S << " - Parameters :\n"; for (Standard_Integer k = 1; k <= nbcases; k ++) { - S << " [" << k << "]: " << Message_EndLine; + S << " [" << k << "]:\n"; S << "Translational Parameter : X=" << ent->TranslationParameter(j,k).X() << ", Y=" << ent->TranslationParameter(j,k).Y() << ", Z=" - << ent->TranslationParameter(j,k).Z() << Message_EndLine; + << ent->TranslationParameter(j,k).Z() << "\n"; S << "Rotational Parameter : X=" << ent->RotationalParameter(j,k).X() << ", Y=" << ent->RotationalParameter(j,k).Y() << ", Z=" << ent->RotationalParameter(j,k).Z(); if (k == nbcases) S << "] "; - S << Message_EndLine; + S << "\n"; } } } break; default: break; } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalDisplAndRot.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalDisplAndRot.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalDisplAndRot.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalDisplAndRot.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a NodalDisplAndRot. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_NodalDisplAndRot)& entfrom, const Handle(IGESAppli_NodalDisplAndRot)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_NodalDisplAndRot)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_NodalDisplAndRot)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalResults.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalResults.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalResults.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalResults.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -212,24 +212,24 @@ void IGESAppli_ToolNodalResults::OwnDump (const Handle(IGESAppli_NodalResults)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { // Standard_Integer nbnodes = ent->NbNodes(); // Standard_Integer nbdata = ent->NbData (); - S << "IGESAppli_NodalResults" << Message_EndLine; + S << "IGESAppli_NodalResults\n"; S << "General Note : "; dumper.Dump(ent->Note(),S, (level <= 4) ? 0 : 1); - S << Message_EndLine; + S << "\n"; S << "Analysis subcase number : " << ent->SubCaseNumber() << " "; - S << "Time used : " << ent->Time() << Message_EndLine; + S << "Time used : " << ent->Time() << "\n"; S << "No. of nodes : " << ent->NbNodes() << " "; - S << "No. of values for a node : " << ent->NbData() << Message_EndLine; - S << "Node Identifiers : " << Message_EndLine; - S << "Nodes : " << Message_EndLine; + S << "No. of values for a node : " << ent->NbData() << "\n"; + S << "Node Identifiers :\n"; + S << "Nodes :\n"; S << "Data : "; if (level < 6) S << " [ask level > 5]"; // IGESData_DumpRectVals(S ,-level,1, ent->NbData(),ent->Data); - S << Message_EndLine; + S << "\n"; if (level > 4) { for (Standard_Integer i=1; i <= ent->NbNodes(); i++) @@ -238,12 +238,12 @@ S << "NodeIdentifier : " << ent->NodeIdentifier(i) << " "; S << "Node : "; dumper.Dump (ent->Node(i),S, 1); - S << Message_EndLine; + S << "\n"; if (level < 6) continue; S << "Data : [ "; for (Standard_Integer j = 1; j <= ent->NbData(); j ++) S << " " << ent->Data(i,j); - S << " ]" << Message_EndLine; + S << " ]\n"; } } } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalResults.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalResults.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalResults.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNodalResults.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a NodalResults. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_NodalResults)& entfrom, const Handle(IGESAppli_NodalResults)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_NodalResults)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_NodalResults)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNode.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNode.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNode.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNode.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -110,15 +110,15 @@ void IGESAppli_ToolNode::OwnDump (const Handle(IGESAppli_Node)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESAppli_Node" << Message_EndLine; + S << "IGESAppli_Node\n"; S << " Nodal Coords : 1st " << ent->Coord().X() - << " 2nd : " << ent->Coord().Y() << " 3rd : " << ent->Coord().Z() <Coord().Y() << " 3rd : " << ent->Coord().Z() << "\n"; S << "Nodal Displacement Coordinate System : "; if (!ent->System().IsNull()) dumper.Dump(ent->System(),S, level); else S << "Global Cartesian Coordinate System (default)"; - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNode.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNode.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolNode.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolNode.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Node. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_Node)& entfrom, const Handle(IGESAppli_Node)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_Node)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_Node)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPartNumber.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPartNumber.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPartNumber.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPartNumber.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -130,21 +129,21 @@ void IGESAppli_ToolPartNumber::OwnDump (const Handle(IGESAppli_PartNumber)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { //Standard_Integer sublevel = (level > 4) ? 1 : 0; //szv#4:S4163:12Mar99 unused - S << "IGESAppli_PartNumber" << Message_EndLine; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; + S << "IGESAppli_PartNumber\n"; + S << "Number of property values : " << ent->NbPropertyValues() << "\n"; S << "Generic Number or Name : "; IGESData_DumpString(S,ent->GenericNumber()); - S << Message_EndLine; + S << "\n"; S << "Military Number or Name : "; IGESData_DumpString(S,ent->MilitaryNumber()); - S << Message_EndLine; + S << "\n"; S << "Vendor Number or Name : "; IGESData_DumpString(S,ent->VendorNumber()); - S << Message_EndLine; + S << "\n"; S << "Internal Number or Name : "; IGESData_DumpString(S,ent->InternalNumber()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPartNumber.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPartNumber.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPartNumber.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPartNumber.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a PartNumber. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_PartNumber)& entfrom, const Handle(IGESAppli_PartNumber)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_PartNumber)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_PartNumber)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPinNumber.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPinNumber.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPinNumber.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPinNumber.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -116,11 +116,11 @@ void IGESAppli_ToolPinNumber::OwnDump (const Handle(IGESAppli_PinNumber)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { - S << "IGESAppli_PinNumber" << Message_EndLine; - S << "Number of Property Values : " << ent->NbPropertyValues() << Message_EndLine; + S << "IGESAppli_PinNumber\n"; + S << "Number of Property Values : " << ent->NbPropertyValues() << "\n"; S << "PinNumber : "; IGESData_DumpString(S,ent->PinNumberVal()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPinNumber.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPinNumber.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPinNumber.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPinNumber.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a PinNumber. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_PinNumber)& entfrom, const Handle(IGESAppli_PinNumber)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_PinNumber)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_PinNumber)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPipingFlow.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPipingFlow.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPipingFlow.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPipingFlow.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -282,11 +282,11 @@ void IGESAppli_ToolPipingFlow::OwnDump (const Handle(IGESAppli_PipingFlow)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESAppli_PipingFlow" << Message_EndLine; - S << "Number of Context Flags : " << ent->NbContextFlags() << Message_EndLine; - S << "Type of Flow : " << ent->TypeOfFlow() << Message_EndLine; + S << "IGESAppli_PipingFlow\n"; + S << "Number of Context Flags : " << ent->NbContextFlags() << "\n"; + S << "Type of Flow : " << ent->TypeOfFlow() << "\n"; S << "Flow Associativities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbFlowAssociativities(), ent->FlowAssociativity); @@ -303,6 +303,6 @@ S << "Continuation Flow Associativities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbContFlowAssociativities(), ent->ContFlowAssociativity); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPipingFlow.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPipingFlow.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPipingFlow.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPipingFlow.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a PipingFlow. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_PipingFlow)& entfrom, const Handle(IGESAppli_PipingFlow)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_PipingFlow)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_PipingFlow)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBArtworkStackup.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBArtworkStackup.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBArtworkStackup.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBArtworkStackup.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -114,14 +114,14 @@ void IGESAppli_ToolPWBArtworkStackup::OwnDump (const Handle(IGESAppli_PWBArtworkStackup)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESAppli_PWBArtworkStackup" << Message_EndLine; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; + S << "IGESAppli_PWBArtworkStackup\n"; + S << "Number of property values : " << ent->NbPropertyValues() << "\n"; S << "Artwork Stackup Identification : "; IGESData_DumpString(S,ent->Identification()); - S << Message_EndLine; + S << "\n"; S << "Level Numbers : "; - IGESData_DumpVals(S ,level,1, ent->NbLevelNumbers(),ent->LevelNumber); - S << Message_EndLine; + IGESData_DumpVals(S,level,1, ent->NbLevelNumbers(),ent->LevelNumber); + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBArtworkStackup.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBArtworkStackup.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBArtworkStackup.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBArtworkStackup.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a PWBArtworkStackup. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_PWBArtworkStackup)& entfrom, const Handle(IGESAppli_PWBArtworkStackup)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_PWBArtworkStackup)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_PWBArtworkStackup)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBDrilledHole.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBDrilledHole.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBDrilledHole.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBDrilledHole.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -118,11 +118,11 @@ void IGESAppli_ToolPWBDrilledHole::OwnDump (const Handle(IGESAppli_PWBDrilledHole)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESAppli_PWBDrilledHole" << Message_EndLine; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Drill Diameter Size : " << ent->DrillDiameterSize() << Message_EndLine; - S << "Finish Diameter Size : " << ent->FinishDiameterSize() << Message_EndLine; - S << "Drilled Hole Function Code : " << ent->FunctionCode() << Message_EndLine; + S << "IGESAppli_PWBDrilledHole\n" + << "Number of property values : " << ent->NbPropertyValues() << "\n" + << "Drill Diameter Size : " << ent->DrillDiameterSize() << "\n" + << "Finish Diameter Size : " << ent->FinishDiameterSize() << "\n" + << "Drilled Hole Function Code : " << ent->FunctionCode() << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBDrilledHole.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBDrilledHole.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBDrilledHole.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolPWBDrilledHole.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a PWBDrilledHole. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_PWBDrilledHole)& entfrom, const Handle(IGESAppli_PWBDrilledHole)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_PWBDrilledHole)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_PWBDrilledHole)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolReferenceDesignator.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolReferenceDesignator.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolReferenceDesignator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolReferenceDesignator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -121,11 +121,11 @@ void IGESAppli_ToolReferenceDesignator::OwnDump (const Handle(IGESAppli_ReferenceDesignator)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { - S << "IGESAppli_ReferenceDesignator" << Message_EndLine; - S << "Number of Property Values : " << ent->NbPropertyValues() << Message_EndLine; + S << "IGESAppli_ReferenceDesignator\n"; + S << "Number of Property Values : " << ent->NbPropertyValues() << "\n"; S << "ReferenceDesignator : "; IGESData_DumpString(S,ent->RefDesignatorText()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolReferenceDesignator.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolReferenceDesignator.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolReferenceDesignator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolReferenceDesignator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ReferenceDesignator. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_ReferenceDesignator)& entfrom, const Handle(IGESAppli_ReferenceDesignator)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_ReferenceDesignator)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_ReferenceDesignator)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolRegionRestriction.cxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolRegionRestriction.cxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolRegionRestriction.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolRegionRestriction.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -126,14 +126,14 @@ void IGESAppli_ToolRegionRestriction::OwnDump (const Handle(IGESAppli_RegionRestriction)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESAppli_RegionRestriction" << Message_EndLine; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Electrical vias restriction : " - << ent->ElectricalViasRestriction() << Message_EndLine; - S << "Electrical components restriction : " - << ent->ElectricalComponentRestriction() << Message_EndLine; - S << "Electrical circuitary restriction : " - << ent->ElectricalCktRestriction() << Message_EndLine; + S << "IGESAppli_RegionRestriction\n" + << "Number of property values : " << ent->NbPropertyValues() << "\n" + << "Electrical vias restriction : " + << ent->ElectricalViasRestriction() << "\n" + << "Electrical components restriction : " + << ent->ElectricalComponentRestriction() << "\n" + << "Electrical circuitary restriction : " + << ent->ElectricalCktRestriction() << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolRegionRestriction.hxx opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolRegionRestriction.hxx --- opencascade-7.4.1+dfsg1/src/IGESAppli/IGESAppli_ToolRegionRestriction.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESAppli/IGESAppli_ToolRegionRestriction.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a RegionRestriction. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESAppli_RegionRestriction)& entfrom, const Handle(IGESAppli_RegionRestriction)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESAppli_RegionRestriction)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESAppli_RegionRestriction)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_SpecificModule.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_SpecificModule.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_SpecificModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_SpecificModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -61,7 +61,7 @@ void IGESBasic_SpecificModule::OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, - const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, + const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const { switch (CN) { diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_SpecificModule.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_SpecificModule.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_SpecificModule.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_SpecificModule.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,8 +25,6 @@ #include class IGESData_IGESEntity; class IGESData_IGESDumper; -class Message_Messenger; - class IGESBasic_SpecificModule; DEFINE_STANDARD_HANDLE(IGESBasic_SpecificModule, IGESData_SpecificModule) @@ -43,7 +41,7 @@ Standard_EXPORT IGESBasic_SpecificModule(); //! Specific Dump (own parameters) for IGESBasic - Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const Standard_OVERRIDE; + Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const Standard_OVERRIDE; //! Performs non-ambiguous Corrections on Entities which support //! them (AssocGroupType,Hierarchy,Name,SingleParent) diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolAssocGroupType.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolAssocGroupType.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolAssocGroupType.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolAssocGroupType.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -112,12 +112,12 @@ void IGESBasic_ToolAssocGroupType::OwnDump (const Handle(IGESBasic_AssocGroupType)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { - S << "IGESBasic_AssocGroupType" << Message_EndLine; - S << "Number of data fields : " << ent->NbData() << Message_EndLine; - S << "Type of attached associativity : " << ent->AssocType() << Message_EndLine; - S << "Name of attached associativity : "; + S << "IGESBasic_AssocGroupType\n" + << "Number of data fields : " << ent->NbData() << "\n" + << "Type of attached associativity : " << ent->AssocType() << "\n" + << "Name of attached associativity : "; IGESData_DumpString(S,ent->Name()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolAssocGroupType.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolAssocGroupType.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolAssocGroupType.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolAssocGroupType.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a AssocGroupType. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_AssocGroupType)& entfrom, const Handle(IGESBasic_AssocGroupType)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_AssocGroupType)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_AssocGroupType)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalReferenceFile.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalReferenceFile.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalReferenceFile.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalReferenceFile.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -105,10 +105,10 @@ void IGESBasic_ToolExternalReferenceFile::OwnDump (const Handle(IGESBasic_ExternalReferenceFile)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESBasic_ExternalReferenceFile" << Message_EndLine; - S << "External Reference Names : "; - IGESData_DumpStrings(S ,level,1, ent->NbListEntries(),ent->Name); - S << Message_EndLine; + S << "IGESBasic_ExternalReferenceFile\n" + << "External Reference Names : "; + IGESData_DumpStrings(S,level,1, ent->NbListEntries(),ent->Name); + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalReferenceFile.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalReferenceFile.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalReferenceFile.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalReferenceFile.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ExternalReferenceFile. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_ExternalReferenceFile)& entfrom, const Handle(IGESBasic_ExternalReferenceFile)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalReferenceFile)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalReferenceFile)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFile.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFile.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFile.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFile.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -92,10 +92,10 @@ void IGESBasic_ToolExternalRefFile::OwnDump (const Handle(IGESBasic_ExternalRefFile)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { - S << "IGESBasic_ExternalRefFile" << Message_EndLine; - S << "External Reference File Identifier : "; + S << "IGESBasic_ExternalRefFile\n" + << "External Reference File Identifier : "; IGESData_DumpString(S,ent->FileId()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFile.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFile.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFile.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFile.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ExternalRefFile. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_ExternalRefFile)& entfrom, const Handle(IGESBasic_ExternalRefFile)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalRefFile)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalRefFile)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileIndex.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileIndex.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileIndex.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileIndex.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -132,23 +132,23 @@ void IGESBasic_ToolExternalRefFileIndex::OwnDump (const Handle(IGESBasic_ExternalRefFileIndex)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer i, num; - S << "IGESBasic_ExternalRefFileIndex" << Message_EndLine; - S << "External Reference Names : " << Message_EndLine; - S << "Internal Entities : "; + S << "IGESBasic_ExternalRefFileIndex\n" + << "External Reference Names :\n" + << "Internal Entities : "; IGESData_DumpEntities(S,dumper,-level,1, ent->NbEntries(),ent->Entity); - S << Message_EndLine; + S << "\n"; if (level > 4) for ( num = ent->NbEntries(), i = 1; i <= num; i++ ) { - S << "[" << i << "]: "; - S << "External Reference Name : "; + S << "[" << i << "]: " + << "External Reference Name : "; IGESData_DumpString(S,ent->Name(i)); S << " Internal Entity : "; dumper.Dump (ent->Entity(i),S, 1); - S << Message_EndLine; + S << "\n"; } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileIndex.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileIndex.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileIndex.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileIndex.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ExternalRefFileIndex. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_ExternalRefFileIndex)& entfrom, const Handle(IGESBasic_ExternalRefFileIndex)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalRefFileIndex)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalRefFileIndex)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileName.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileName.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileName.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileName.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -100,13 +100,13 @@ void IGESBasic_ToolExternalRefFileName::OwnDump (const Handle(IGESBasic_ExternalRefFileName)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { - S << "IGESBasic_ExternalRefFileName" << Message_EndLine; - S << "External Reference File Identifier : "; + S << "IGESBasic_ExternalRefFileName\n" + << "External Reference File Identifier : "; IGESData_DumpString(S,ent->FileId()); - S << Message_EndLine; - S << "External Reference Symbolic Name : "; + S << "\n" + << "External Reference Symbolic Name : "; IGESData_DumpString(S,ent->ReferenceName()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileName.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileName.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileName.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefFileName.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ExternalRefFileName. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_ExternalRefFileName)& entfrom, const Handle(IGESBasic_ExternalRefFileName)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalRefFileName)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalRefFileName)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefLibName.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefLibName.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefLibName.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefLibName.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -97,13 +97,13 @@ void IGESBasic_ToolExternalRefLibName::OwnDump (const Handle(IGESBasic_ExternalRefLibName)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S,const Standard_Integer /* level */) const + Standard_OStream& S,const Standard_Integer /* level */) const { - S << "IGESBasic_ExternalRefLibName" << Message_EndLine; - S << "Name of Library : "; + S << "IGESBasic_ExternalRefLibName\n" + << "Name of Library : "; IGESData_DumpString(S,ent->LibraryName()); - S << Message_EndLine; - S << "External Reference Symbolic Name : "; + S << "\n" + << "External Reference Symbolic Name : "; IGESData_DumpString(S,ent->ReferenceName()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefLibName.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefLibName.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefLibName.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefLibName.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ExternalRefLibName. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_ExternalRefLibName)& entfrom, const Handle(IGESBasic_ExternalRefLibName)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalRefLibName)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalRefLibName)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefName.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefName.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefName.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefName.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -92,10 +92,10 @@ void IGESBasic_ToolExternalRefName::OwnDump (const Handle(IGESBasic_ExternalRefName)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { - S << "IGESBasic_ExternalRefName" << Message_EndLine; - S << "External Reference Symbolic Name : "; + S << "IGESBasic_ExternalRefName\n" + << "External Reference Symbolic Name : "; IGESData_DumpString(S,ent->ReferenceName()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefName.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefName.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefName.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolExternalRefName.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ExternalRefName. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_ExternalRefName)& entfrom, const Handle(IGESBasic_ExternalRefName)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalRefName)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_ExternalRefName)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroup.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroup.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroup.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroup.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -163,11 +162,11 @@ void IGESBasic_ToolGroup::OwnDump (const Handle(IGESBasic_Group)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESBasic_Group" << Message_EndLine; - S << "Entries in the Group : "; + S << "IGESBasic_Group\n" + << "Entries in the Group : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbEntities(),ent->Entity); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroup.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroup.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroup.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroup.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -74,7 +74,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_Group)& entfrom, const Handle(IGESBasic_Group)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_Group)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_Group)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroupWithoutBackP.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroupWithoutBackP.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroupWithoutBackP.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroupWithoutBackP.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -160,11 +160,11 @@ void IGESBasic_ToolGroupWithoutBackP::OwnDump (const Handle(IGESBasic_GroupWithoutBackP)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESBasic_GroupWithoutBackP" << Message_EndLine; - S << "Entries in the Group : "; + S << "IGESBasic_GroupWithoutBackP\n" + << "Entries in the Group : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbEntities(),ent->Entity); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroupWithoutBackP.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroupWithoutBackP.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroupWithoutBackP.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolGroupWithoutBackP.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a GroupWithoutBackP. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_GroupWithoutBackP)& entfrom, const Handle(IGESBasic_GroupWithoutBackP)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_GroupWithoutBackP)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_GroupWithoutBackP)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolHierarchy.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolHierarchy.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolHierarchy.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolHierarchy.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -130,15 +130,14 @@ void IGESBasic_ToolHierarchy::OwnDump (const Handle(IGESBasic_Hierarchy)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESBasic_Hierarchy" << Message_EndLine; - - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Line Font : " << ent->NewLineFont() << Message_EndLine; - S << "View Number : " << ent->NewView() << Message_EndLine; - S << "Entity level : " << ent->NewEntityLevel() << Message_EndLine; - S << "Blank status : " << ent->NewBlankStatus() << Message_EndLine; - S << "Line weight : " << ent->NewLineWeight() << Message_EndLine; - S << "Color number : " << ent->NewColorNum() << Message_EndLine; + S << "IGESBasic_Hierarchy\n" + << "Number of property values : " << ent->NbPropertyValues() << "\n" + << "Line Font : " << ent->NewLineFont() << "\n" + << "View Number : " << ent->NewView() << "\n" + << "Entity level : " << ent->NewEntityLevel() << "\n" + << "Blank status : " << ent->NewBlankStatus() << "\n" + << "Line weight : " << ent->NewLineWeight() << "\n" + << "Color number : " << ent->NewColorNum() << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolHierarchy.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolHierarchy.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolHierarchy.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolHierarchy.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Hierarchy. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_Hierarchy)& entfrom, const Handle(IGESBasic_Hierarchy)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_Hierarchy)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_Hierarchy)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolName.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolName.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolName.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolName.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -105,12 +105,11 @@ void IGESBasic_ToolName::OwnDump (const Handle(IGESBasic_Name)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { - S << "IGESBasic_Name" << Message_EndLine; - - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Name : "; + S << "IGESBasic_Name\n" + << "Number of property values : " << ent->NbPropertyValues() << "\n" + << "Name : "; IGESData_DumpString(S,ent->Value()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolName.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolName.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolName.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolName.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Name. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_Name)& entfrom, const Handle(IGESBasic_Name)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_Name)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_Name)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroup.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroup.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroup.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroup.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -151,12 +151,11 @@ void IGESBasic_ToolOrderedGroup::OwnDump (const Handle(IGESBasic_OrderedGroup)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESBasic_OrderedGroup" << Message_EndLine; - - S << "Entries in the Group : "; + S << "IGESBasic_OrderedGroup\n" + << "Entries in the Group : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbEntities(),ent->Entity); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroup.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroup.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroup.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroup.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a OrderedGroup. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_OrderedGroup)& entfrom, const Handle(IGESBasic_OrderedGroup)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_OrderedGroup)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_OrderedGroup)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroupWithoutBackP.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroupWithoutBackP.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroupWithoutBackP.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroupWithoutBackP.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -152,12 +152,11 @@ void IGESBasic_ToolOrderedGroupWithoutBackP::OwnDump (const Handle(IGESBasic_OrderedGroupWithoutBackP)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESBasic_OrderedGroupWithoutBackP" << Message_EndLine; - - S << "Entries in the Group : "; + S << "IGESBasic_OrderedGroupWithoutBackP\n" + << "Entries in the Group : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbEntities(),ent->Entity); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroupWithoutBackP.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroupWithoutBackP.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroupWithoutBackP.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolOrderedGroupWithoutBackP.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a OrderedGroupWithoutBackP. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_OrderedGroupWithoutBackP)& entfrom, const Handle(IGESBasic_OrderedGroupWithoutBackP)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_OrderedGroupWithoutBackP)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_OrderedGroupWithoutBackP)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingleParent.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingleParent.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingleParent.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingleParent.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -176,15 +176,14 @@ void IGESBasic_ToolSingleParent::OwnDump (const Handle(IGESBasic_SingleParent)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESBasic_SingleParent" << Message_EndLine; - - S << "Number of ParentEntities : " << ent->NbParentEntities() << Message_EndLine; - S << "ParentEntity : "; + S << "IGESBasic_SingleParent\n" + << "Number of ParentEntities : " << ent->NbParentEntities() << "\n" + << "ParentEntity : "; dumper.Dump(ent->SingleParent(),S,(level <= 4) ? 0 : 1); - S << Message_EndLine; - S << "Children : "; + S << "\n" + << "Children : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbChildren(),ent->Child); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingleParent.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingleParent.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingleParent.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingleParent.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SingleParent. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_SingleParent)& entfrom, const Handle(IGESBasic_SingleParent)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_SingleParent)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_SingleParent)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingularSubfigure.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingularSubfigure.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingularSubfigure.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingularSubfigure.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -159,15 +159,14 @@ void IGESBasic_ToolSingularSubfigure::OwnDump (const Handle(IGESBasic_SingularSubfigure)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESBasic_SingularSubfigure" << Message_EndLine; - - S << "Subfigure Definition Entity : " ; + S << "IGESBasic_SingularSubfigure\n" + << "Subfigure Definition Entity : " ; dumper.Dump(ent->Subfigure(),S,(level <= 4) ? 0 : 1); - S << Message_EndLine; - S << " Translation Data : "; + S << "\n" + << " Translation Data : "; IGESData_DumpXYZL(S,level, ent->Translation(), ent->Location()); - S << " Scale Factors : " << ent->ScaleFactor() << Message_EndLine; - S << Message_EndLine; + S << " Scale Factors : " << ent->ScaleFactor() << "\n" + << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingularSubfigure.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingularSubfigure.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingularSubfigure.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSingularSubfigure.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SingularSubfigure. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_SingularSubfigure)& entfrom, const Handle(IGESBasic_SingularSubfigure)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_SingularSubfigure)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_SingularSubfigure)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSubfigureDef.cxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSubfigureDef.cxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSubfigureDef.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSubfigureDef.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -142,15 +141,14 @@ void IGESBasic_ToolSubfigureDef::OwnDump (const Handle(IGESBasic_SubfigureDef)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESBasic_SubfigureDef" << Message_EndLine; - - S << "Depth of the subfigure : " << ent->Depth() << Message_EndLine; - S << "Name of subfigure : "; + S << "IGESBasic_SubfigureDef\n" + << "Depth of the subfigure : " << ent->Depth() << "\n" + << "Name of subfigure : "; IGESData_DumpString(S,ent->Name()); - S << Message_EndLine; - S << "The Associated Entities : " ; + S << "\n" + << "The Associated Entities : "; IGESData_DumpEntities(S,dumper,level,1,ent->NbEntities(),ent->AssociatedEntity); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSubfigureDef.hxx opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSubfigureDef.hxx --- opencascade-7.4.1+dfsg1/src/IGESBasic/IGESBasic_ToolSubfigureDef.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESBasic/IGESBasic_ToolSubfigureDef.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SubfigureDef. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESBasic_SubfigureDef)& entfrom, const Handle(IGESBasic_SubfigureDef)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESBasic_SubfigureDef)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESBasic_SubfigureDef)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Reader.cxx opencascade-7.5.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Reader.cxx --- opencascade-7.4.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Reader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Reader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,8 +45,8 @@ #include //======================================================================= -//function : Transfer -//purpose : basic working method +//function : checkColorRange +//purpose : //======================================================================= static void checkColorRange (Standard_Real& theCol) { @@ -143,7 +143,12 @@ return; } -Standard_Boolean IGESCAFControl_Reader::Transfer (Handle(TDocStd_Document) &doc) +//======================================================================= +//function : Transfer +//purpose : basic working method +//======================================================================= +Standard_Boolean IGESCAFControl_Reader::Transfer (Handle(TDocStd_Document) &doc, + const Message_ProgressRange& theProgress) { // read all shapes Standard_Integer num;// = NbRootsForTransfer(); @@ -152,7 +157,7 @@ // TransferOneRoot ( i ); //} - TransferRoots(); // replaces the above + TransferRoots(theProgress); // replaces the above num = NbShapes(); if ( num <=0 ) return Standard_False; @@ -218,7 +223,7 @@ checkColorRange ( r ); checkColorRange ( g ); checkColorRange ( b ); - col.SetValues ( 0.01*r, 0.01*g, 0.01*b, Quantity_TOC_RGB ); + col.SetValues ( 0.01*r, 0.01*g, 0.01*b, Quantity_TOC_sRGB ); } } } @@ -334,8 +339,9 @@ //======================================================================= Standard_Boolean IGESCAFControl_Reader::Perform (const Standard_CString filename, - Handle(TDocStd_Document) &doc) + Handle(TDocStd_Document) &doc, + const Message_ProgressRange& theProgress) { if ( ReadFile ( filename ) != IFSelect_RetDone ) return Standard_False; - return Transfer ( doc ); + return Transfer ( doc, theProgress ); } diff -Nru opencascade-7.4.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Reader.hxx opencascade-7.5.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Reader.hxx --- opencascade-7.4.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Reader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Reader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -68,14 +68,19 @@ //! Translates currently loaded IGES file into the document //! Returns True if succeeded, and False in case of fail - Standard_EXPORT Standard_Boolean Transfer (Handle(TDocStd_Document)& theDoc); + Standard_EXPORT Standard_Boolean Transfer (Handle(TDocStd_Document)& theDoc, + const Message_ProgressRange& theProgress = Message_ProgressRange()); - Standard_Boolean Perform (const TCollection_AsciiString& theFileName, Handle(TDocStd_Document)& theDoc) - { return Perform (theFileName.ToCString(), theDoc); } + Standard_Boolean Perform (const TCollection_AsciiString& theFileName, + Handle(TDocStd_Document)& theDoc, + const Message_ProgressRange& theProgress = Message_ProgressRange()) + { return Perform (theFileName.ToCString(), theDoc, theProgress); } //! Translate IGES file given by filename into the document //! Return True if succeeded, and False in case of fail - Standard_EXPORT Standard_Boolean Perform (const Standard_CString theFileName, Handle(TDocStd_Document)& theDoc); + Standard_EXPORT Standard_Boolean Perform (const Standard_CString theFileName, + Handle(TDocStd_Document)& theDoc, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Set ColorMode for indicate read Colors or not. void SetColorMode (const Standard_Boolean theMode) diff -Nru opencascade-7.4.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Writer.cxx opencascade-7.5.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Writer.cxx --- opencascade-7.4.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Writer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Writer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -142,7 +143,8 @@ //purpose : //======================================================================= -Standard_Boolean IGESCAFControl_Writer::Transfer (const Handle(TDocStd_Document) &doc) +Standard_Boolean IGESCAFControl_Writer::Transfer (const Handle(TDocStd_Document) &doc, + const Message_ProgressRange& theProgress) { // translate free top-level shapes of the DECAF document Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool( doc->Main() ); @@ -150,7 +152,7 @@ TDF_LabelSequence labels; STool->GetFreeShapes ( labels ); - return Transfer (labels); + return Transfer (labels, theProgress); } //======================================================================= @@ -158,11 +160,12 @@ //purpose : //======================================================================= -Standard_Boolean IGESCAFControl_Writer::Transfer (const TDF_Label& label) +Standard_Boolean IGESCAFControl_Writer::Transfer (const TDF_Label& label, + const Message_ProgressRange& theProgress) { TDF_LabelSequence labels; labels.Append( label ); - return Transfer( labels ); + return Transfer( labels, theProgress ); } //======================================================================= @@ -170,13 +173,16 @@ //purpose : //======================================================================= -Standard_Boolean IGESCAFControl_Writer::Transfer (const TDF_LabelSequence& labels) +Standard_Boolean IGESCAFControl_Writer::Transfer (const TDF_LabelSequence& labels, + const Message_ProgressRange& theProgress) { if ( labels.Length() <=0 ) return Standard_False; - for ( Standard_Integer i=1; i <= labels.Length(); i++ ) { + Message_ProgressScope aPS(theProgress, "Labels", labels.Length()); + for ( Standard_Integer i=1; i <= labels.Length() && aPS.More(); i++ ) + { TopoDS_Shape shape = XCAFDoc_ShapeTool::GetShape ( labels.Value(i) ); if ( ! shape.IsNull() ) - AddShape ( shape ); + AddShape (shape, aPS.Next()); // IGESControl_Writer::Transfer ( shape ); } @@ -205,9 +211,10 @@ //======================================================================= Standard_Boolean IGESCAFControl_Writer::Perform (const Handle(TDocStd_Document) &doc, - const Standard_CString filename) + const Standard_CString filename, + const Message_ProgressRange& theProgress) { - if ( ! Transfer ( doc ) ) return Standard_False; + if ( ! Transfer ( doc, theProgress ) ) return Standard_False; return Write ( filename ) == IFSelect_RetDone; } @@ -217,9 +224,10 @@ //======================================================================= Standard_Boolean IGESCAFControl_Writer::Perform (const Handle(TDocStd_Document) &doc, - const TCollection_AsciiString &filename) + const TCollection_AsciiString &filename, + const Message_ProgressRange& theProgress) { - if ( ! Transfer ( doc ) ) return Standard_False; + if ( ! Transfer ( doc, theProgress ) ) return Standard_False; return Write ( filename.ToCString() ) == IFSelect_RetDone; } @@ -276,6 +284,7 @@ XCAFPrs_Style own = settings.FindFromKey(S); if ( own.IsSetColorCurv() ) style.SetColorCurv ( own.GetColorCurv() ); if ( own.IsSetColorSurf() ) style.SetColorSurf ( own.GetColorSurf() ); + style.SetMaterial (own.Material()); } // analyze whether current entity should get a color @@ -286,6 +295,12 @@ hasColor = Standard_True; col = style.GetColorSurf(); } + else if (!style.Material().IsNull() + && !style.Material()->IsEmpty()) + { + hasColor = Standard_True; + col = style.Material()->BaseColor().GetRGB(); + } } else if ( S.ShapeType() == TopAbs_EDGE || S.ShapeType() == TopAbs_WIRE ) { if ( style.IsSetColorCurv() ) { @@ -308,7 +323,9 @@ Handle(TCollection_HAsciiString) str = new TCollection_HAsciiString ( col.StringName ( col.Name() ) ); colent = new IGESGraph_Color; - colent->Init ( col.Red() * 100., col.Green() * 100., col.Blue() * 100., str ); + NCollection_Vec3 aColor_sRGB; + col.Values (aColor_sRGB.r(), aColor_sRGB.g(), aColor_sRGB.b(), Quantity_TOC_sRGB); + colent->Init ( aColor_sRGB.r() * 100., aColor_sRGB.g() * 100., aColor_sRGB.b() * 100., str ); AddEntity ( colent ); colors.Bind ( c, colent ); } diff -Nru opencascade-7.4.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Writer.hxx opencascade-7.5.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Writer.hxx --- opencascade-7.4.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Writer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESCAFControl/IGESCAFControl_Writer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -69,21 +69,28 @@ //! Transfers a document to a IGES model //! Returns True if translation is OK - Standard_EXPORT Standard_Boolean Transfer (const Handle(TDocStd_Document)& doc); + Standard_EXPORT Standard_Boolean Transfer (const Handle(TDocStd_Document)& doc, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfers labels to a IGES model //! Returns True if translation is OK - Standard_EXPORT Standard_Boolean Transfer (const TDF_LabelSequence& labels); + Standard_EXPORT Standard_Boolean Transfer (const TDF_LabelSequence& labels, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfers label to a IGES model //! Returns True if translation is OK - Standard_EXPORT Standard_Boolean Transfer (const TDF_Label& label); + Standard_EXPORT Standard_Boolean Transfer (const TDF_Label& label, + const Message_ProgressRange& theProgress = Message_ProgressRange()); - Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc, const TCollection_AsciiString& filename); + Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc, + const TCollection_AsciiString& filename, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfers a document and writes it to a IGES file //! Returns True if translation is OK - Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc, const Standard_CString filename); + Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc, + const Standard_CString filename, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Set ColorMode for indicate write Colors or not. Standard_EXPORT void SetColorMode (const Standard_Boolean colormode); diff -Nru opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_ActorWrite.cxx opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_ActorWrite.cxx --- opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_ActorWrite.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_ActorWrite.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -54,7 +54,8 @@ Handle(Transfer_Binder) IGESControl_ActorWrite::Transfer (const Handle(Transfer_Finder)& start, - const Handle(Transfer_FinderProcess)& FP) + const Handle(Transfer_FinderProcess)& FP, + const Message_ProgressRange& theProgress) { XSAlgo::AlgoContainer()->PrepareForTransfer(); @@ -74,14 +75,14 @@ shape = XSAlgo::AlgoContainer()->ProcessShape( shape, Tol, maxTol, "write.iges.resource.name", "write.iges.sequence", info, - FP->GetProgress() ); + theProgress ); // modified by NIZHNY-EAP Tue Aug 29 11:17:01 2000 ___END___ BRepToIGES_BREntity BR0; BR0.SetModel(modl); BR0.SetTransferProcess(FP); BRepToIGESBRep_Entity BR1; BR1.SetModel(modl); BR1.SetTransferProcess(FP); - if (themodetrans == 0) ent = BR0.TransferShape(shape); - if (themodetrans == 1) ent = BR1.TransferShape(shape); + if (themodetrans == 0) ent = BR0.TransferShape(shape, theProgress); + if (themodetrans == 1) ent = BR1.TransferShape(shape, theProgress); // modified by NIZHNY-EAP Tue Aug 29 11:37:18 2000 ___BEGIN___ XSAlgo::AlgoContainer()->MergeTransferInfo(FP, info); // modified by NIZHNY-EAP Tue Aug 29 11:37:25 2000 ___END___ diff -Nru opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_ActorWrite.hxx opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_ActorWrite.hxx --- opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_ActorWrite.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_ActorWrite.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,7 +46,10 @@ //! //! ModeTrans may be : 0 -> groups of Faces //! or 1 -> BRep - Standard_EXPORT virtual Handle(Transfer_Binder) Transfer (const Handle(Transfer_Finder)& start, const Handle(Transfer_FinderProcess)& FP) Standard_OVERRIDE; + Standard_EXPORT virtual Handle(Transfer_Binder) Transfer + (const Handle(Transfer_Finder)& start, + const Handle(Transfer_FinderProcess)& FP, + const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_Controller.cxx opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_Controller.cxx --- opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_Controller.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_Controller.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -344,9 +344,10 @@ IFSelect_ReturnStatus IGESControl_Controller::TransferWriteShape (const TopoDS_Shape& shape, const Handle(Transfer_FinderProcess)& FP, const Handle(Interface_InterfaceModel)& model, - const Standard_Integer modetrans) const + const Standard_Integer modetrans, + const Message_ProgressRange& theProgress) const { - return XSControl_Controller::TransferWriteShape (shape,FP,model,modetrans); + return XSControl_Controller::TransferWriteShape(shape, FP, model, modetrans, theProgress); } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_Controller.hxx opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_Controller.hxx --- opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_Controller.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_Controller.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -62,7 +62,12 @@ //! -2 bad model (requires an IGESModel) //! modeshape : 0 groupe of face (version < 5.1) //! 1 BREP-version 5.1 of IGES - Standard_EXPORT virtual IFSelect_ReturnStatus TransferWriteShape (const TopoDS_Shape& shape, const Handle(Transfer_FinderProcess)& FP, const Handle(Interface_InterfaceModel)& model, const Standard_Integer modetrans = 0) const Standard_OVERRIDE; + Standard_EXPORT virtual IFSelect_ReturnStatus TransferWriteShape + (const TopoDS_Shape& shape, + const Handle(Transfer_FinderProcess)& FP, + const Handle(Interface_InterfaceModel)& model, + const Standard_Integer modetrans = 0, + const Message_ProgressRange& theProgress = Message_ProgressRange()) const Standard_OVERRIDE; //! Standard Initialisation. It creates a Controller for IGES and //! records it to various names, available to select it later diff -Nru opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_Reader.cxx opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_Reader.cxx --- opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_Reader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_Reader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -247,7 +247,8 @@ NCollection_DataMap::Iterator aMapListIter(aMapList); for(; aMapCountIter.More() && aMapListIter.More(); aMapCountIter.Next(), aMapListIter.Next()) { - TF << aMapCountIter.Value() << aMapCountIter.Key() << Message_EndLine; + Message_Messenger::StreamBuffer aSender = TF->SendInfo(); + aSender << aMapCountIter.Value() << aMapCountIter.Key() << std::endl; if (mode == IFSelect_ListByItem) { Handle(TColStd_HSequenceOfInteger) entityList = aMapListIter.Value(); Standard_Integer length = entityList->Length(); @@ -255,19 +256,19 @@ TF->Send(msg3035, Message_Info); char line[80]; sprintf(line, "\t\t\t"); - TF << line; + aSender << line; Standard_Integer nbInLine = 0; for (Standard_Integer i = 1; i <= length; i++) { // IDT_Out << (entityList->Value(i)) << " "; sprintf(line, "\t %d", entityList->Value(i)); - TF << line; + aSender << line; if (++nbInLine == 6) { nbInLine = 0; sprintf(line, "\n\t\t\t"); - TF << line; + aSender << line; } } - TF << Message_EndLine; + aSender << std::endl; } } break; @@ -281,7 +282,7 @@ NCollection_DataMap::Iterator aMapIter(aMapCountResult); for (; aMapIter.More(); aMapIter.Next()) { - TF << aMapIter.Key() << aMapIter.Value() << Message_EndLine; + TF->SendInfo() << aMapIter.Key() << aMapIter.Value() << std::endl; } break; } @@ -311,7 +312,7 @@ for(; aMapCountIter.More(); aMapCountIter.Next()) { char mess[80]; sprintf(mess, aMapCountIter.Key().ToCString(), aMapCountIter.Value()); - TF << mess << Message_EndLine; //dicoCountIter.Value() << dicoCountIter.Name() << std::endl; + TF->SendInfo() << mess << std::endl; //dicoCountIter.Value() << dicoCountIter.Name() << std::endl; } break; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_Writer.cxx opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_Writer.cxx --- opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_Writer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_Writer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include #include @@ -82,21 +82,14 @@ myEditor (model,IGESSelect_WorkLibrary::DefineProtocol()) , myWriteMode (modecr) , myIsComputed (Standard_False) { } -Standard_Boolean IGESControl_Writer::AddShape (const TopoDS_Shape& theShape) +Standard_Boolean IGESControl_Writer::AddShape (const TopoDS_Shape& theShape, + const Message_ProgressRange& theProgress) { if (theShape.IsNull()) return Standard_False; - // for progress indication - Handle(Message_ProgressIndicator) progress = myTP->GetProgress(); - if ( ! progress.IsNull() ) { - Standard_Integer nbfaces=0; - for( TopExp_Explorer exp(theShape,TopAbs_FACE); exp.More(); exp.Next() ) - nbfaces++; - progress->SetScale ( "Faces", 0, nbfaces, 1 ); - } - XSAlgo::AlgoContainer()->PrepareForTransfer(); + Message_ProgressScope aPS(theProgress, NULL, 2); // modified by NIZHNY-EAP Tue Aug 29 11:16:54 2000 ___BEGIN___ Handle(Standard_Transient) info; Standard_Real Tol = Interface_Static::RVal("write.precision.val"); @@ -104,11 +97,17 @@ TopoDS_Shape Shape = XSAlgo::AlgoContainer()->ProcessShape( theShape, Tol, maxTol, "write.iges.resource.name", "write.iges.sequence", info, - progress ); + aPS.Next()); + if (!aPS.More()) + return Standard_False; + // modified by NIZHNY-EAP Tue Aug 29 11:17:01 2000 ___END___ BRepToIGES_BREntity B0; B0.SetTransferProcess(myTP); B0.SetModel(myModel); BRepToIGESBRep_Entity B1; B1.SetTransferProcess(myTP); B1.SetModel(myModel); - Handle(IGESData_IGESEntity) ent = myWriteMode? B1.TransferShape(Shape) : B0.TransferShape(Shape); + Handle(IGESData_IGESEntity) ent = myWriteMode? + B1.TransferShape (Shape, aPS.Next()) : B0.TransferShape(Shape, aPS.Next()); + if (!aPS.More()) + return Standard_False; if(ent.IsNull()) return Standard_False; diff -Nru opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_Writer.hxx opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_Writer.hxx --- opencascade-7.4.1+dfsg1/src/IGESControl/IGESControl_Writer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESControl/IGESControl_Writer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,8 @@ #include #include #include +#include + class Transfer_FinderProcess; class IGESData_IGESModel; class TopoDS_Shape; @@ -85,7 +87,8 @@ //! Translates a Shape to IGES Entities and adds them to the model //! Returns True if done, False if Shape not suitable for IGES or null - Standard_EXPORT Standard_Boolean AddShape (const TopoDS_Shape& sh); + Standard_EXPORT Standard_Boolean AddShape (const TopoDS_Shape& sh, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Translates a Geometry (Surface or Curve) to IGES Entities and //! adds them to the model diff -Nru opencascade-7.4.1+dfsg1/src/IGESData/IGESData_DefaultSpecific.cxx opencascade-7.5.1+dfsg1/src/IGESData/IGESData_DefaultSpecific.cxx --- opencascade-7.4.1+dfsg1/src/IGESData/IGESData_DefaultSpecific.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESData/IGESData_DefaultSpecific.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,29 +32,29 @@ void IGESData_DefaultSpecific::OwnDump (const Standard_Integer /*CN*/, const Handle(IGESData_IGESEntity)& ent, - const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, + const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer /*own*/) const { DeclareAndCast(IGESData_UndefinedEntity,lent,ent); if (lent.IsNull()) return; Standard_Integer dstat = lent->DirStatus(); - if (dstat != 0) S - << " -- Directory Entry Error Status = " << dstat << " --" << Message_EndLine; + if (dstat != 0) + S << " -- Directory Entry Error Status = " << dstat << " --\n"; Handle(Interface_UndefinedContent) cont = lent->UndefinedContent(); Standard_Integer nb = cont->NbParams(); S << " UNDEFINED ENTITY ...\n"<ParamType(i); - if (ptyp == Interface_ParamVoid) S<<" ["<IsParamEntity(i)) { DeclareAndCast(IGESData_IGESEntity,anent,cont->ParamEntity(i)); - S<<" ["< class IGESData_IGESEntity; class IGESData_IGESDumper; -class Message_Messenger; - class IGESData_DefaultSpecific; DEFINE_STANDARD_HANDLE(IGESData_DefaultSpecific, IGESData_SpecificModule) @@ -43,7 +41,7 @@ //! Specific Dump for UndefinedEntity : it concerns only //! own parameters, the general data (Directory Part, Lists) are //! taken into account by the IGESDumper - Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const Standard_OVERRIDE; + Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/IGESData/IGESData_Dump.hxx opencascade-7.5.1+dfsg1/src/IGESData/IGESData_Dump.hxx --- opencascade-7.4.1+dfsg1/src/IGESData/IGESData_Dump.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESData/IGESData_Dump.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -96,7 +96,7 @@ #define IGESData_DumpString(S,str) \ if (str.IsNull()) S << "(undefined)";\ - else { S << '"' << str << '"'; } + else { S << '"' << str->String() << '"'; } #define IGESData_DumpXY(S,XYval) \ S << " (" << XYval.X() << "," << XYval.Y() << ")" @@ -211,8 +211,8 @@ S << " :";\ for (Standard_Integer iopa = lo; iopa <= up; iopa ++) IGESData_DumpXY(S,item(iopa));\ if (Trsf.Form() != gp_Identity) {\ - S<< "\n Transformed :";\ - if (Level == 5) S<<" [ask level > 5]";\ + S << "\n Transformed :";\ + if (Level == 5) S <<" [ask level > 5]";\ else\ for (Standard_Integer jopa = lo; jopa <= up; jopa ++)\ IGESData_DumpXYT(S,item(jopa),Trsf);\ @@ -231,8 +231,8 @@ S << " :";\ for (Standard_Integer iopa = lo; iopa <= up; iopa ++) IGESData_DumpXY(S,item(iopa));\ if (Trsf.Form() != gp_Identity) {\ - S<< "\n Transformed :";\ - if (Level == 5) S<<" [ask level > 5]";\ + S << "\n Transformed :";\ + if (Level == 5) S <<" [ask level > 5]";\ else\ for (Standard_Integer jopa = lo; jopa <= up; jopa ++)\ IGESData_DumpXYTZ(S,item(jopa),Trsf,Z);\ @@ -252,8 +252,8 @@ S << " :";\ for (Standard_Integer iopa = lo; iopa <= up; iopa ++) IGESData_DumpXYZ(S,item(iopa));\ if (Trsf.Form() != gp_Identity) {\ - S<< "\n Transformed :";\ - if (Level == 5) S<<" [ask level > 5]";\ + S << "\n Transformed :";\ + if (Level == 5) S <<" [ask level > 5]";\ else\ for (Standard_Integer jopa = lo; jopa <= up; jopa ++)\ IGESData_DumpXYZT(S,item(jopa),Trsf);\ @@ -271,7 +271,7 @@ else if (Level > 0) {\ S << " :";\ for (Standard_Integer iopa = lo; iopa <= up; iopa ++)\ - { S << "\n["<String() << '"'; }\ S << "\n";\ }\ } diff -Nru opencascade-7.4.1+dfsg1/src/IGESData/IGESData_IGESDumper.cxx opencascade-7.5.1+dfsg1/src/IGESData/IGESData_IGESDumper.cxx --- opencascade-7.4.1+dfsg1/src/IGESData/IGESData_IGESDumper.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESData/IGESData_IGESDumper.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,6 @@ #include #include #include -#include #include IGESData_IGESDumper::IGESData_IGESDumper @@ -39,29 +38,29 @@ void IGESData_IGESDumper::PrintDNum - (const Handle(IGESData_IGESEntity)& ent, const Handle(Message_Messenger)& S) const + (const Handle(IGESData_IGESEntity)& ent, Standard_OStream& S) const { // Affichage garanti sur 12 caracteres 12345/D24689 Standard_Integer num = 0; if (!ent.IsNull()) { - if (themodel.IsNull()) S<<" D??? "; - else if ( (num = themodel->Number(ent)) == 0) S<<" 0:D?????"; + if (themodel.IsNull()) S <<" D??? "; + else if ( (num = themodel->Number(ent)) == 0) S <<" 0:D?????"; // throw Interface_InterfaceError("IGESDumper : PrintDNum"); else { - S<Number(ent); - if (num > 0) S< 0) S <TypeNumber() << " Form:" << ent->FormNumber() << Interface_MSG::Blanks (ent->FormNumber(),3) << " Class:"<< Interface_InterfaceModel::ClassName(ent->DynamicType()->Name()); @@ -70,7 +69,7 @@ void IGESData_IGESDumper::Dump - (const Handle(IGESData_IGESEntity)& ent, const Handle(Message_Messenger)& S, + (const Handle(IGESData_IGESEntity)& ent, Standard_OStream& S, const Standard_Integer own, const Standard_Integer attached) const { Standard_Integer att = attached; @@ -79,27 +78,28 @@ if (att == 0) att = diratt; // -1 signifie : ne rien sortir if (own < 0) return; - if (own > 1) S<<"\n"; - if (ent.IsNull()) { S<<"(Null)"; if (own > 1) S<<"\n"; return; } + + if (own > 1) S <<"\n"; + if (ent.IsNull()) { S <<"(Null)"; if (own > 1) S <<"\n"; return; } if (own == 0) { PrintDNum (ent,S); return; } // affichage auxiliaire if (own == 1) { PrintShort (ent,S); return; } // affichage auxiliaire - if (own > 0) S<<"**** Dump IGES, level "< 0) S <<"**** Dump IGES, level "<= 2) S <<"** Status Number : Blank:"<BlankStatus() @@ -107,50 +107,50 @@ <<" UseFlag:"<UseFlag() <<" Hierarchy:"<HierarchyStatus()<<"\n"; if (own >= 1) { - if (ent->HasShortLabel()) S<<"**** Label :"<ShortLabel()->ToCString(); - if (ent->HasSubScriptNumber()) S<<" SubScript:"<SubScriptNumber(); - if (ent->HasShortLabel()) S<HasShortLabel()) S <<"**** Label :"<ShortLabel()->ToCString(); + if (ent->HasSubScriptNumber()) S <<" SubScript:"<SubScriptNumber(); + if (ent->HasShortLabel()) S <HasTransf()) - { S<<"** Transf.Matrix :"; PrintDNum(ent->Transf(),S); S<<"\n"; } + { S <<"** Transf.Matrix :"; PrintDNum(ent->Transf(),S); S <<"\n"; } IGESData_DefList viewkind = ent->DefView(); if (viewkind == IGESData_DefOne) - { S<<"** View :"; PrintDNum (ent->View(),S); S<<"\n"; } + { S <<"** View :"; PrintDNum (ent->View(),S); S <<"\n"; } if (viewkind == IGESData_DefSeveral) - { S<<"** View (List) :"; PrintDNum (ent->ViewList(),S); S<<"\n"; } + { S <<"** View (List) :"; PrintDNum (ent->ViewList(),S); S <<"\n"; } } if (own >= 2) { if (ent->HasStructure()) - { S<<"** Structure :"; PrintDNum (ent->Structure(),S); S<<"\n"; } + { S <<"** Structure :"; PrintDNum (ent->Structure(),S); S <<"\n"; } - S<<"\n Graphic Attributes\n"; + S <<"\n Graphic Attributes\n"; if (ent->DefLineFont() == IGESData_DefValue) - { S<<"** LineFont Value:"<RankLineFont()<<"\n"; } + { S <<"** LineFont Value:"<RankLineFont()<<"\n"; } else if (ent->DefLineFont() == IGESData_DefReference) - { S<<"** LineFont Ref :"; PrintDNum (ent->LineFont(),S); S<<"\n"; } + { S <<"** LineFont Ref :"; PrintDNum (ent->LineFont(),S); S <<"\n"; } - if (ent->Level() > 0) S<<"** Level Value :"<Level()<<"\n"; + if (ent->Level() > 0) S <<"** Level Value :"<Level()<<"\n"; else if (ent->Level() < 0) - { S<<"** Level List :"; PrintDNum(ent->LevelList(),S); S<<"\n"; } + { S <<"** Level List :"; PrintDNum(ent->LevelList(),S); S <<"\n"; } if (ent->HasLabelDisplay()) - { S<<"** Label Display :"; PrintDNum (ent->LabelDisplay(),S); S<<"\n"; } + { S <<"** Label Display :"; PrintDNum (ent->LabelDisplay(),S); S <<"\n"; } if (ent->LineWeightNumber() != 0) { - S <<"** LineWeight Num:"<LineWeightNumber(); - if (diratt > 0) S<<" -> Value:"<LineWeight(); - S<LineWeightNumber(); + if (diratt > 0) S <<" -> Value:"<LineWeight(); + S <DefColor() == IGESData_DefValue) - { S<<"** Color Value :"<RankColor(); } + { S <<"** Color Value :"<RankColor(); } else if (ent->DefColor() == IGESData_DefReference) - { S<<"** Color Ref :"; PrintDNum (ent->Color(),S); } - S<Color(),S); } + S < 3) { - S<<"**** Own Data ****\n\n"; + S <<"**** Own Data ****\n\n"; OwnDump(ent,S,own); } } @@ -161,7 +161,7 @@ Standard_Integer nb = iter.NbEntities(); Standard_Boolean iasuit = (nb > 0); if (nb > 0) { - S<<"\n**** Properties (nb:"< 0) iasuit = Standard_True; if (nb > 0) { - S<<"\n**** Associativities (nb:"<OwnDump(CN,ent,*this,S,own); else if (themodel.IsNull()) - S <<" **** Dump impossible. Type "<DynamicType()->Name()<DynamicType()->Name()<Number(ent)<<":D" - <DNum(ent)<<" Type "<DynamicType()->Name()<DNum(ent)<<" Type "<DynamicType()->Name()< is the parameter from Dump - Standard_EXPORT void OwnDump (const Handle(IGESData_IGESEntity)& ent, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESData_IGESEntity)& ent, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESData/IGESData_IGESModel.cxx opencascade-7.5.1+dfsg1/src/IGESData/IGESData_IGESModel.cxx --- opencascade-7.4.1+dfsg1/src/IGESData/IGESData_IGESModel.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESData/IGESData_IGESModel.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -75,14 +74,14 @@ //======================================================================= void IGESData_IGESModel::DumpHeader - (const Handle(Message_Messenger)& S, const Standard_Integer ) const + (Standard_OStream& S, const Standard_Integer ) const { Standard_Integer ns = thestart->Length(); - S<<"**** Dump of IGES Model , Start and Global Sections ****"< 0) { S << "**** Start Section : "<Value(i)->ToCString()<Value(i)->ToCString()<ToCString()<ToCString()<ToCString()<ToCString()<ToCString()<ToCString()<ToCString()<ToCString()<ToCString()<<"\n"; + if (!str.IsNull()) S <<"[12] Receiver : "<ToCString()<<"\n"; S << "[13] Scale : " << theheader.Scale()<<"\n"; S << "[14] Unit Flag : " << theheader.UnitFlag(); // if (Interface_Static::IVal("read.scale.unit") == 1) //#73 rln 10.03.99 S4135: "read.scale.unit" does not affect GlobalSection -// S << " -> Value (in Meter) = " << theheader.UnitValue() / 1000 <<"\n"; +// S << " -> Value (in Meter) = " << theheader.UnitValue() / 1000 <<"\n"; // else S << " -> Value (in Millimeter) = " << theheader.UnitValue()<<"\n"; //abv 02 Mar 00: no unit parameter in OCC S << " -> Value (in CASCADE units) = " << theheader.UnitValue() <<"\n"; str = theheader.UnitName(); - if (!str.IsNull()) S<<"[15] Unit Name : " << str->ToCString()<<"\n\n"; + if (!str.IsNull()) S <<"[15] Unit Name : " << str->ToCString()<<"\n\n"; S << "[16] Line Weight Gradient : " << theheader.LineWeightGrad()<<"\n"; S << "[17] Line Weight Max Value: " << theheader.MaxLineWeight()<<"\n"; str = theheader.Date(); - if (!str.IsNull()) S<<"[18] (Creation) Date : "<ToCString() + if (!str.IsNull()) S <<"[18] (Creation) Date : "<ToCString() <<" i.e. "<ToCString()<<"\n"; S << "[19] Resolution : " << theheader.Resolution()<<"\n"; if (theheader.HasMaxCoord()) - S<<"[20] Maximum Coord : " << theheader.MaxCoord() << "\n\n"; - else S<<"[20] Maximum Coord not defined\n\n"; + S <<"[20] Maximum Coord : " << theheader.MaxCoord() << "\n\n"; + else S <<"[20] Maximum Coord not defined\n\n"; str = theheader.AuthorName(); - if (!str.IsNull()) S<<"[21] Author : "<ToCString()<<"\n"; + if (!str.IsNull()) S <<"[21] Author : "<ToCString()<<"\n"; str = theheader.CompanyName(); - if (!str.IsNull()) S<<"[22] Company : "<ToCString()<<"\n"; + if (!str.IsNull()) S <<"[22] Company : "<ToCString()<<"\n"; Standard_Integer num = theheader.IGESVersion(); S << "[23] IGES Version Number : " << num << " -> Name : " << IGESData_BasicEditor::IGESVersionName(num); num = theheader.DraftingStandard(); S << "\n[24] Drafting Standard : " << num; - if (num > 0) S<< " -> Name : " << IGESData_BasicEditor::DraftingName(num); - S< 0) S << " -> Name : " << IGESData_BasicEditor::DraftingName(num); + S <ToCString() - <<" i.e. "<ToCString()<ToCString()<ToCString() <ToCString() <TypeNumber(); + S <<" DE : "<<(2*num-1) << " type : " << igesent->TypeNumber(); // Standard_Integer num2 = igesent->TypeNumber(); } } @@ -603,15 +602,15 @@ //======================================================================= void IGESData_IGESModel::PrintInfo - (const Handle(Standard_Transient)& ent, const Handle(Message_Messenger)& S) const + (const Handle(Standard_Transient)& ent, Standard_OStream& S) const { DeclareAndCast(IGESData_IGESEntity,igesent,ent); - if (igesent.IsNull()) S<<"(NOT IGES)"; + if (igesent.IsNull()) S <<"(NOT IGES)"; else { Standard_Integer num = Number(ent); - if (num == 0) S<<"??"; + if (num == 0) S <<"??"; else { - S<<(2*num-1) << "type " << Type(ent)->Name(); + S <<(2*num-1) << "type " << Type(ent)->Name(); } } } diff -Nru opencascade-7.4.1+dfsg1/src/IGESData/IGESData_IGESModel.hxx opencascade-7.5.1+dfsg1/src/IGESData/IGESData_IGESModel.hxx --- opencascade-7.4.1+dfsg1/src/IGESData/IGESData_IGESModel.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESData/IGESData_IGESModel.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,18 +17,11 @@ #ifndef _IGESData_IGESModel_HeaderFile #define _IGESData_IGESModel_HeaderFile -#include -#include - #include #include #include -#include -#include -#include -#include + class Interface_InterfaceError; -class Message_Messenger; class IGESData_GlobalSection; class IGESData_IGESEntity; class Interface_InterfaceModel; @@ -67,7 +60,7 @@ //! Prints the IGES file header //! (Start and Global Sections) to the log file. The integer //! parameter is intended to be used as a level indicator but is not used at present. - Standard_EXPORT void DumpHeader (const Handle(Message_Messenger)& S, const Standard_Integer level = 0) const Standard_OVERRIDE; + Standard_EXPORT void DumpHeader (Standard_OStream& S, const Standard_Integer level = 0) const Standard_OVERRIDE; //! Returns Model's Start Section (list of comment lines) Standard_EXPORT Handle(TColStd_HSequenceOfHAsciiString) StartSection() const; @@ -144,16 +137,16 @@ //! Prints label specific to IGES norm for a given entity, i.e. //! its directory entry number (2*Number-1) - Standard_EXPORT void PrintLabel (const Handle(Standard_Transient)& ent, const Handle(Message_Messenger)& S) const Standard_OVERRIDE; + Standard_EXPORT void PrintLabel (const Handle(Standard_Transient)& ent, Standard_OStream& S) const Standard_OVERRIDE; //! Prints label specific to IGES norm for a given -- -- //! entity, i.e. its directory entry number (2*Number-1) //! in the log file format. - Standard_EXPORT virtual void PrintToLog (const Handle(Standard_Transient)& ent, const Handle(Message_Messenger)& S) const Standard_OVERRIDE; + Standard_EXPORT virtual void PrintToLog (const Handle(Standard_Transient)& ent, Standard_OStream& S) const Standard_OVERRIDE; //! Prints label specific to IGES norm for a given entity, i.e. //! its directory entry number (2*Number-1) - Standard_EXPORT void PrintInfo (const Handle(Standard_Transient)& ent, const Handle(Message_Messenger)& S) const; + Standard_EXPORT void PrintInfo (const Handle(Standard_Transient)& ent, Standard_OStream& S) const; //! Returns a string with the label attached to a given entity, //! i.e. a string "Dnn" with nn = directory entry number (2*N-1) diff -Nru opencascade-7.4.1+dfsg1/src/IGESData/IGESData_IGESReaderTool.cxx opencascade-7.5.1+dfsg1/src/IGESData/IGESData_IGESReaderTool.cxx --- opencascade-7.4.1+dfsg1/src/IGESData/IGESData_IGESReaderTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESData/IGESData_IGESReaderTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -290,13 +290,15 @@ if (v[14] < 0) { fieldent = GetCasted(IGESData_IGESEntity,IR->BoundEntity( (1-v[14])/2 )); Color = GetCasted(IGESData_ColorEntity, fieldent); + //an entity that is not a color entity and has a number corresponding + //to the color field should not be considered erroneous if (Color.IsNull()) { // Sending of message : Incorrect Color Number Message_Msg Msg34 ("XSTEP_34"); Msg34.Arg(thecnum); Msg34.Arg(thectyp.Type()); ach->SendWarning(Msg34); - ent->InitDirFieldEntity(13,fieldent); + ent->InitDirFieldEntity(13,Color); } else ent->InitColor(Color); } @@ -333,7 +335,7 @@ const Handle(IGESData_IGESReaderData)& IR, IGESData_ParamReader& PR) const { - Handle(Interface_Check) ach = new Interface_Check;; + Handle(Interface_Check) ach = new Interface_Check(); Handle(Interface_ReaderModule) imodule; Standard_Integer CN; diff -Nru opencascade-7.4.1+dfsg1/src/IGESData/IGESData_IGESWriter.cxx opencascade-7.5.1+dfsg1/src/IGESData/IGESData_IGESWriter.cxx --- opencascade-7.4.1+dfsg1/src/IGESData/IGESData_IGESWriter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESData/IGESData_IGESWriter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -116,7 +116,7 @@ void IGESData_IGESWriter::SendModel (const Handle(IGESData_Protocol)& protocol) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); IGESData_WriterLib lib(protocol); Standard_Integer nb = themodel->NbEntities(); @@ -137,7 +137,7 @@ #endif // Attention aux cas d erreur : contenu redefini if (themodel->IsRedefinedContent(i)) { - sout << " -- IGESWriter : Erroneous Entity N0."<ReportEntity(i); if (!rep.IsNull()) cnt = GetCasted(IGESData_IGESEntity,rep->Content()); if (cnt.IsNull()) cnt = ent; // secours @@ -156,7 +156,7 @@ undent->WriteOwnParams (*this); } else sout<<" -- IGESWriter : Not Processed for n0."<TypeNumber()<<" Form "<FormNumber()<TypeNumber()<<" Form "<FormNumber()<ToCString()); else S << line->ToCString(); -// for (Standard_Integer k = line->Length()+1; k <= MaxcarsG; k ++) S<<' '; +// for (Standard_Integer k = line->Length()+1; k <= MaxcarsG; k ++) aSender <<' '; S << &blancs[line->Length()]; if (fnes) writefnes (S,finlin); else S << finlin; @@ -537,7 +537,7 @@ if (fnes) writefnes (S,line->ToCString()); else S << line->ToCString(); -// for (Standard_Integer k = line->Length()+1; k <= MaxcarsG; k ++) S<<' '; +// for (Standard_Integer k = line->Length()+1; k <= MaxcarsG; k ++) aSender <<' '; S << &blancs[line->Length()]; if (fnes) writefnes (S,finlin); else S << finlin; @@ -567,16 +567,16 @@ v[8],v[9],v[10],v[11] ,2*i-1); if (fnes) writefnes (S,ligne); else S << ligne; - S<< "\n"; + S << "\n"; sprintf(ligne,"%8d%8d%8d%8d%8d%8s%8s%8s%8sD%7.7d", v[0],v[13],v[14],v[15],v[16],res1,res2,lab,num,2*i); if (fnes) writefnes (S,ligne); else S << ligne; - S<< "\n"; + S << "\n"; // std::cout << "Ent.no "<ToCString()); else S << line->ToCString(); -// for (Standard_Integer k = line->Length()+1; k <= MaxcarsP; k ++)S<<' '; +// for (Standard_Integer k = line->Length()+1; k <= MaxcarsP; k ++)aSender <<' '; S << &blancs[line->Length()]; if (fnes) writefnes (S,finlin); else S << finlin; @@ -618,7 +618,7 @@ // 12345678- 16- 24- 32 56789 123456789 123456789 123456789 12 if (fnes) writefnes (S,ligne); else S << ligne; - S<< "\n"; + S << "\n"; S.flush(); isGood = S.good(); #ifdef PATIENCELOG diff -Nru opencascade-7.4.1+dfsg1/src/IGESData/IGESData_SpecificModule.cxx opencascade-7.5.1+dfsg1/src/IGESData/IGESData_SpecificModule.cxx --- opencascade-7.4.1+dfsg1/src/IGESData/IGESData_SpecificModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESData/IGESData_SpecificModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,8 +15,6 @@ #include #include #include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(IGESData_SpecificModule,Standard_Transient) diff -Nru opencascade-7.4.1+dfsg1/src/IGESData/IGESData_SpecificModule.hxx opencascade-7.5.1+dfsg1/src/IGESData/IGESData_SpecificModule.hxx --- opencascade-7.4.1+dfsg1/src/IGESData/IGESData_SpecificModule.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESData/IGESData_SpecificModule.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,6 @@ #include class IGESData_IGESEntity; class IGESData_IGESDumper; -class Message_Messenger; class IGESData_SpecificModule; @@ -44,7 +43,7 @@ //! taken into account by the IGESDumper //! See class IGESDumper for the rules to follow for and //! level - Standard_EXPORT virtual void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const = 0; + Standard_EXPORT virtual void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const = 0; //! Specific Automatic Correction on own Parameters of an Entity. //! It works by setting in accordance redundant data, if there are diff -Nru opencascade-7.4.1+dfsg1/src/IGESData/IGESData_UndefinedEntity.cxx opencascade-7.5.1+dfsg1/src/IGESData/IGESData_UndefinedEntity.cxx --- opencascade-7.4.1+dfsg1/src/IGESData/IGESData_UndefinedEntity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESData/IGESData_UndefinedEntity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -218,7 +218,7 @@ iapb = Standard_False; if (v[3] < -max) iapb = Standard_True; else if (v[3] < 0) { - anent = GetCasted(IGESData_IGESEntity,IR->BoundEntity((-1-v[3])/2)); + anent = GetCasted(IGESData_IGESEntity,IR->BoundEntity((1-v[3])/2)); if (!anent->IsKind(STANDARD_TYPE(IGESData_LineFontEntity))) iapb = Standard_True; } // Sending of message : Line Font Pattern field is incorrect. @@ -232,7 +232,7 @@ iapb = Standard_False; if (v[4] < -max) iapb = Standard_True; else if (v[4] < 0) { - anent = GetCasted(IGESData_IGESEntity,IR->BoundEntity((-1-v[4])/2)); + anent = GetCasted(IGESData_IGESEntity,IR->BoundEntity((1-v[4])/2)); if (!anent->IsKind(STANDARD_TYPE(IGESData_LevelListEntity))) iapb = Standard_True; } @@ -276,7 +276,7 @@ iapb = Standard_False; if (v[7] < 0 || v[7] > max) iapb = Standard_True; - else if (v[7] < 0) { + else if (v[7] > 0) { anent = GetCasted(IGESData_IGESEntity,IR->BoundEntity((1+v[7])/2)); if (!anent->IsKind(STANDARD_TYPE(IGESData_LabelDisplayEntity))) iapb = Standard_True; } @@ -290,9 +290,9 @@ } iapb = Standard_False; - if (v[14] < 0 || v[14] > max) iapb = Standard_True; + if (v[14] < -max || v[14] > max) iapb = Standard_True; else if (v[14] < 0) { - anent = GetCasted(IGESData_IGESEntity,IR->BoundEntity((1+v[14])/2)); + anent = GetCasted(IGESData_IGESEntity,IR->BoundEntity((1-v[14])/2)); if (!anent->IsKind(STANDARD_TYPE(IGESData_ColorEntity))) { thedstat += 512; v[14] = 0; } } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_SpecificModule.cxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_SpecificModule.cxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_SpecificModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_SpecificModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,6 @@ #include #include #include -#include #include IMPLEMENT_STANDARD_RTTIEXT(IGESDefs_SpecificModule,IGESData_SpecificModule) @@ -43,7 +42,7 @@ void IGESDefs_SpecificModule::OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, - const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, + const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const { switch (CN) { diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_SpecificModule.hxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_SpecificModule.hxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_SpecificModule.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_SpecificModule.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,8 +24,6 @@ #include class IGESData_IGESEntity; class IGESData_IGESDumper; -class Message_Messenger; - class IGESDefs_SpecificModule; DEFINE_STANDARD_HANDLE(IGESDefs_SpecificModule, IGESData_SpecificModule) @@ -41,7 +39,7 @@ Standard_EXPORT IGESDefs_SpecificModule(); //! Specific Dump (own parameters) for IGESDefs - Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const Standard_OVERRIDE; + Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAssociativityDef.cxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAssociativityDef.cxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAssociativityDef.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAssociativityDef.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -177,39 +177,39 @@ void IGESDefs_ToolAssociativityDef::OwnDump (const Handle(IGESDefs_AssociativityDef)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDefs_AssociativityDef" << Message_EndLine; - S << "Number of Class Definitions : " << ent->NbClassDefs() << Message_EndLine; - S << "Back Pointer Requirement : " << Message_EndLine; - S << "Ordered / Unordered Class : " << Message_EndLine; - S << "Number Of Items per Entry : " << Message_EndLine; - S << "Items : " << Message_EndLine; + S << "IGESDefs_AssociativityDef\n" + << "Number of Class Definitions : " << ent->NbClassDefs() << "\n" + << "Back Pointer Requirement :\n" + << "Ordered / Unordered Class :\n" + << "Number Of Items per Entry :\n" + << "Items :\n"; IGESData_DumpVals(S,-level,1, ent->NbClassDefs(),ent->BackPointerReq); - S << Message_EndLine; + S << std::endl; if (level > 4) { // Warning : Item is a JAGGED Array Standard_Integer upper = ent->NbClassDefs(); for (Standard_Integer i = 1; i <= upper; i ++) { - S << "[" << i << "]: " << Message_EndLine; + S << "[" << i << "]:\n"; S << "Back Pointer Requirement : " << ent->BackPointerReq(i) << " "; if (ent->IsBackPointerReq(i)) S << "(Yes) "; else S << "(No) "; S << " Ordered/Unordered Class : " << ent->ClassOrder(i) << " "; - if (ent->IsOrdered(i)) S << "(Yes)" <IsOrdered(i)) S << "(Yes)\n"; + else S << "(No)\n"; S << "Number Of Items per Entry : " << ent->NbItemsPerClass(i); if (level < 6) { - S << " [ask level > 5 for more]" << Message_EndLine; + S << " [ask level > 5 for more]\n"; continue; } - S << Message_EndLine << " ["; + S << "\n ["; for (Standard_Integer j = 1; j <= ent->NbItemsPerClass(i); j ++) S << " " << ent->Item(i,j); - S << "]" << Message_EndLine; + S << "]\n"; } } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAssociativityDef.hxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAssociativityDef.hxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAssociativityDef.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAssociativityDef.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a AssociativityDef. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDefs_AssociativityDef)& entfrom, const Handle(IGESDefs_AssociativityDef)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDefs_AssociativityDef)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDefs_AssociativityDef)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeDef.cxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeDef.cxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeDef.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeDef.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -441,23 +441,23 @@ void IGESDefs_ToolAttributeDef::OwnDump (const Handle(IGESDefs_AttributeDef)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESDefs_AttributeDef" << Message_EndLine; - S << "Attribute Table Name: "; + S << "IGESDefs_AttributeDef\n" + << "Attribute Table Name: "; IGESData_DumpString(S,ent->TableName()); - S << Message_EndLine; - S << "Attribute List Type : " << ent->ListType() << Message_EndLine; - S << "Number of Attributes : " << ent->NbAttributes() << Message_EndLine; - S << "Attribute Types : " << Message_EndLine; - S << "Attribute Value Data Types : " << Message_EndLine; - S << "Attribute Value Counts : " << Message_EndLine; - if (ent->HasValues()) S << "Attribute Values : " << Message_EndLine; - if (ent->HasTextDisplay()) S << "Attribute Value Entities : " << Message_EndLine; + S << "\n" + << "Attribute List Type : " << ent->ListType() << "\n" + << "Number of Attributes : " << ent->NbAttributes() << "\n" + << "Attribute Types :\n" + << "Attribute Value Data Types :\n" + << "Attribute Value Counts :\n"; + if (ent->HasValues()) S << "Attribute Values :\n"; + if (ent->HasTextDisplay()) S << "Attribute Value Entities :\n"; IGESData_DumpVals(S,-level,1, ent->NbAttributes(),ent->AttributeType); - S << Message_EndLine; + S << "\n"; if (level > 4) { Standard_Integer upper = ent->NbAttributes(); @@ -465,9 +465,9 @@ { Standard_Integer avc = ent->AttributeValueCount(i); Standard_Integer typ = ent->AttributeValueDataType(i); - S << "[" << i << "]: "; - S << "Attribute Type : " << ent->AttributeType(i) << " "; - S << "Value Data Type : " << typ; + S << "[" << i << "]: " + << "Attribute Type : " << ent->AttributeType(i) << " " + << "Value Data Type : " << typ; switch (typ) { case 0 : S << " (Void)"; break; case 1 : S << " : Integer "; break; @@ -478,11 +478,11 @@ case 6 : S << " : Logical "; break; default : break; } - S << " Count : " << avc << Message_EndLine; + S << " Count : " << avc << "\n"; if (ent->HasValues()) { if (level <= 5) { - S << " [ content (Values) : ask level > 5 ]" << Message_EndLine; + S << " [ content (Values) : ask level > 5 ]\n"; continue; } for (Standard_Integer j = 1; j <= avc; j ++) @@ -512,10 +512,10 @@ S << " Attribute Value Pointer : "; dumper.Dump (ent->AttributeTextDisplay(i,j),S, sublevel); } - S << Message_EndLine; + S << std::endl; } } } } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeDef.hxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeDef.hxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeDef.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeDef.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a AttributeDef. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDefs_AttributeDef)& entfrom, const Handle(IGESDefs_AttributeDef)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDefs_AttributeDef)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDefs_AttributeDef)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeTable.cxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeTable.cxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeTable.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeTable.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -301,20 +301,20 @@ void IGESDefs_ToolAttributeTable::OwnDump (const Handle(IGESDefs_AttributeTable)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDefs_AttributeTable" << Message_EndLine; + S << "IGESDefs_AttributeTable\n"; Handle(IGESDefs_AttributeDef) ab = ent->Definition(); Standard_Integer na = ent->NbAttributes(); Standard_Integer nr = ent->NbRows(); if (ent->FormNumber() == 1) - S << "Number of Rows (i.e. complete sets of Attributes) : " << nr << Message_EndLine; - else S << "One set of Attributes" << Message_EndLine; - S << "Number of defined Attributes : " << na << Message_EndLine; + S << "Number of Rows (i.e. complete sets of Attributes) : " << nr << "\n"; + else S << "One set of Attributes\n"; + S << "Number of defined Attributes : " << na << "\n"; if (level <= 4) S << - " [ structure : see Structure in Directory Entry; content : level > 4 ]" < 4 ]\n"; else for (Standard_Integer k = 1; k <= nr; k ++) { @@ -347,8 +347,8 @@ default : break; } } - S << Message_EndLine; + S << "\n"; } } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeTable.hxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeTable.hxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeTable.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolAttributeTable.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a AttributeTable. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDefs_AttributeTable)& entfrom, const Handle(IGESDefs_AttributeTable)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDefs_AttributeTable)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDefs_AttributeTable)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolGenericData.cxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolGenericData.cxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolGenericData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolGenericData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -255,25 +255,25 @@ void IGESDefs_ToolGenericData::OwnDump (const Handle(IGESDefs_GenericData)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDefs_GenericData" << Message_EndLine; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Property Name : "; + S << "IGESDefs_GenericData\n" + << "Number of property values : " << ent->NbPropertyValues() << "\n" + << "Property Name : "; IGESData_DumpString(S,ent->Name()); - S << Message_EndLine; + S << std::endl; switch (level) { case 4: - S << "Types : " << Message_EndLine; - S << "Values : Count = " << ent->NbTypeValuePairs() << Message_EndLine; - S << " [ as level > 4 for content ]" << Message_EndLine; + S << "Types :\n"; + S << "Values : Count = " << ent->NbTypeValuePairs() << "\n"; + S << " [ as level > 4 for content ]\n"; break; case 5: case 6: { Standard_Integer i, num; - S << "Types & Values : " << Message_EndLine; + S << "Types & Values : " << "\n"; for ( num = ent->NbTypeValuePairs(), i = 1; i <= num; i++ ) { S << "[" << i << "]: "; @@ -293,9 +293,9 @@ << (ent->ValueAsLogical(i) ? "True" : "False"); break; default : break; } - S << Message_EndLine; + S << "\n"; } } } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolGenericData.hxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolGenericData.hxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolGenericData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolGenericData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a GenericData. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDefs_GenericData)& entfrom, const Handle(IGESDefs_GenericData)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDefs_GenericData)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDefs_GenericData)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolMacroDef.cxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolMacroDef.cxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolMacroDef.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolMacroDef.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -143,16 +143,16 @@ void IGESDefs_ToolMacroDef::OwnDump (const Handle(IGESDefs_MacroDef)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDefs_MacroDef" << Message_EndLine; - S << "MACRO : "; + S << "IGESDefs_MacroDef\n" + << "MACRO : "; IGESData_DumpString(S,ent->MACRO()); - S << Message_EndLine; - S << "Entity Type ID : " << ent->EntityTypeID() << Message_EndLine; - S << "Language Statement : "; - IGESData_DumpStrings(S ,level,1, ent->NbStatements(),ent->LanguageStatement); + S << "\n" + << "Entity Type ID : " << ent->EntityTypeID() << "\n" + << "Language Statement : "; + IGESData_DumpStrings(S,level,1, ent->NbStatements(),ent->LanguageStatement); S << "END MACRO : "; IGESData_DumpString(S,ent->ENDMACRO()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolMacroDef.hxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolMacroDef.hxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolMacroDef.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolMacroDef.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a MacroDef. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDefs_MacroDef)& entfrom, const Handle(IGESDefs_MacroDef)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDefs_MacroDef)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDefs_MacroDef)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolTabularData.cxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolTabularData.cxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolTabularData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolTabularData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -223,34 +223,34 @@ void IGESDefs_ToolTabularData::OwnDump (const Handle(IGESDefs_TabularData)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer nbIndeps = ent->NbIndependents(); //szv#4:S4163:12Mar99 i unused Standard_Integer nbDeps = ent->NbDependents(); - S << "IGESDefs_TabularData" << Message_EndLine; - S << "No. of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Property type : " << ent->PropertyType() << Message_EndLine; - S << "No. of Dependent variables : " << nbDeps << Message_EndLine; - S << "No. of Independent variables : " << nbIndeps << Message_EndLine; - S << "Type of independent variables : "; - IGESData_DumpVals(S ,level,1, nbIndeps,ent->TypeOfIndependents); - S << Message_EndLine << "Number of values of independent variables : "; - IGESData_DumpVals(S ,level,1, nbIndeps,ent->NbValues); + S << "IGESDefs_TabularData\n" + << "No. of property values : " << ent->NbPropertyValues() << "\n" + << "Property type : " << ent->PropertyType() << "\n" + << "No. of Dependent variables : " << nbDeps << "\n" + << "No. of Independent variables : " << nbIndeps << "\n" + << "Type of independent variables : "; + IGESData_DumpVals(S,level,1, nbIndeps,ent->TypeOfIndependents); + S << "\nNumber of values of independent variables : "; + IGESData_DumpVals(S,level,1, nbIndeps,ent->NbValues); // ?? JAGGED ?? - S << Message_EndLine << "Values of the independent variable : "; + S << std::endl << "Values of the independent variable : "; if (level < 5) S << " [ask level > 4]"; else { for (Standard_Integer ind = 1; ind <= nbIndeps; ind ++) { - S << Message_EndLine << "[" << ind << "]:"; + S << std::endl << "[" << ind << "]:"; Standard_Integer nbi = ent->NbValues(ind); for (Standard_Integer iv = 1; iv <= nbi; iv ++) S << " " << ent->IndependentValue(ind,iv); } } -// IGESData_DumpVals(S ,level,1, nbIndeps,ent->IndependentValue); - S << Message_EndLine << "Values of the dependent variable : "; -// IGESData_DumpVals(S ,level,1, nbDeps,ent->DependentValue); - S << " TO BE DONE"; - S << Message_EndLine; +// IGESData_DumpVals(aSender,level,1, nbIndeps,ent->IndependentValue); + S << std::endl << "Values of the dependent variable : "; +// IGESData_DumpVals(aSender,level,1, nbDeps,ent->DependentValue); + S << " TO BE DONE" + << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolTabularData.hxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolTabularData.hxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolTabularData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolTabularData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a TabularData. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDefs_TabularData)& entfrom, const Handle(IGESDefs_TabularData)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDefs_TabularData)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDefs_TabularData)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolUnitsData.cxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolUnitsData.cxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolUnitsData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolUnitsData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -153,29 +152,29 @@ void IGESDefs_ToolUnitsData::OwnDump (const Handle(IGESDefs_UnitsData)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDefs_UnitsData" << Message_EndLine; - S << "Number of Units : " << ent->NbUnits() << Message_EndLine; - S << "Type of Unit : " << Message_EndLine; - S << "Value of Unit : " << Message_EndLine; - S << "Scale Factor : " << Message_EndLine; + S << "IGESDefs_UnitsData\n" + << "Number of Units : " << ent->NbUnits() << "\n" + << "Type of Unit :\n" + << "Value of Unit :\n" + << "Scale Factor :\n"; IGESData_DumpStrings(S,-level,1, ent->NbUnits(),ent->UnitType); - S << Message_EndLine; + S << "\n"; if (level > 4) { - S << "Details of the Units" << Message_EndLine; + S << "Details of the Units\n"; Standard_Integer upper = ent->NbUnits(); for (Standard_Integer i = 1; i <= upper; i++) { S << "[" << i << "] Type : "; IGESData_DumpString(S,ent->UnitType(i)); - S << Message_EndLine; - S << " Value : "; + S << "\n" + << " Value : "; IGESData_DumpString(S,ent->UnitValue(i)); - S << Message_EndLine; - S << " ScaleFactor: " << ent->ScaleFactor(i) << Message_EndLine; + S << "\n" + << " ScaleFactor: " << ent->ScaleFactor(i) << "\n"; } } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolUnitsData.hxx opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolUnitsData.hxx --- opencascade-7.4.1+dfsg1/src/IGESDefs/IGESDefs_ToolUnitsData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDefs/IGESDefs_ToolUnitsData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a UnitsData. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDefs_UnitsData)& entfrom, const Handle(IGESDefs_UnitsData)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDefs_UnitsData)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDefs_UnitsData)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_SpecificModule.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_SpecificModule.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_SpecificModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_SpecificModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -75,7 +75,7 @@ void IGESDimen_SpecificModule::OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, - const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, + const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const { switch (CN) { diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_SpecificModule.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_SpecificModule.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_SpecificModule.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_SpecificModule.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,8 +25,6 @@ #include class IGESData_IGESEntity; class IGESData_IGESDumper; -class Message_Messenger; - class IGESDimen_SpecificModule; DEFINE_STANDARD_HANDLE(IGESDimen_SpecificModule, IGESData_SpecificModule) @@ -43,7 +41,7 @@ Standard_EXPORT IGESDimen_SpecificModule(); //! Specific Dump (own parameters) for IGESDimen - Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const Standard_OVERRIDE; + Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const Standard_OVERRIDE; //! Performs non-ambiguous Corrections on Entities which support //! them (BasicDimension,CenterLine,DimensionDisplayData, diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolAngularDimension.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolAngularDimension.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolAngularDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolAngularDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -143,28 +143,28 @@ void IGESDimen_ToolAngularDimension::OwnDump (const Handle(IGESDimen_AngularDimension)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESDimen_AngularDimension" << Message_EndLine; - S << "General Note Entity : "; + S << "IGESDimen_AngularDimension\n" + << "General Note Entity : "; dumper.Dump(ent->Note(),S, sublevel); - S << Message_EndLine; - S << "First Witness Entity : "; + S << "\n" + << "First Witness Entity : "; dumper.Dump(ent->FirstWitnessLine(),S, sublevel); - S << Message_EndLine; - S << "Second Witness Entity : "; + S << "\n" + << "Second Witness Entity : "; dumper.Dump(ent->SecondWitnessLine(),S, sublevel); - S << Message_EndLine; - S << "Vertex Point Co-ords : "; - IGESData_DumpXYL(S,level, ent->Vertex(), ent->Location()); S << Message_EndLine; - S << "Radius of Leader arcs : " << ent->Radius() << Message_EndLine; - S << "First Leader Entity : "; + S << "\n" + << "Vertex Point Co-ords : "; + IGESData_DumpXYL(S,level, ent->Vertex(), ent->Location()); S << "\n"; + S << "Radius of Leader arcs : " << ent->Radius() << "\n" + << "First Leader Entity : "; dumper.Dump(ent->FirstLeader(),S, sublevel); - S << Message_EndLine; - S << "Second Leader Entity : "; + S << "\n" + << "Second Leader Entity : "; dumper.Dump(ent->SecondLeader(),S, sublevel); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolAngularDimension.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolAngularDimension.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolAngularDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolAngularDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a AngularDimension. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_AngularDimension)& entfrom, const Handle(IGESDimen_AngularDimension)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_AngularDimension)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_AngularDimension)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolBasicDimension.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolBasicDimension.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolBasicDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolBasicDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -119,18 +119,18 @@ void IGESDimen_ToolBasicDimension::OwnDump (const Handle(IGESDimen_BasicDimension)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { - S << "IGESDimen_BasicDimension" << Message_EndLine; - S << "Number of Property Values : " << ent->NbPropertyValues() << Message_EndLine; - S << Message_EndLine << " Lower left corner : " ; + S << "IGESDimen_BasicDimension\n" + << "Number of Property Values : " << ent->NbPropertyValues() << "\n\n" + << " Lower left corner : " ; IGESData_DumpXY(S, ent->LowerLeft()); - S << Message_EndLine << " Lower right corner : " ; + S << "\n Lower right corner : " ; IGESData_DumpXY(S, ent->LowerRight()); - S << Message_EndLine << " Upper right corner : " ; + S << "\n Upper right corner : " ; IGESData_DumpXY(S, ent->UpperRight()); - S << Message_EndLine << " Upper left corner : "; + S << "\n Upper left corner : "; IGESData_DumpXY(S, ent->UpperLeft()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolBasicDimension.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolBasicDimension.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolBasicDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolBasicDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a BasicDimension. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_BasicDimension)& entfrom, const Handle(IGESDimen_BasicDimension)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_BasicDimension)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_BasicDimension)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolCenterLine.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolCenterLine.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolCenterLine.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolCenterLine.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -157,16 +157,16 @@ void IGESDimen_ToolCenterLine::OwnDump (const Handle(IGESDimen_CenterLine)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDimen_CenterLine" << Message_EndLine; - if (ent->IsCrossHair()) S << "Cross Hair" << Message_EndLine; - else S << "Through Circle Centers" << Message_EndLine; - S << "Data Type : " << ent->Datatype() << " "; - S << "Number of Data Points : " << ent->NbPoints() << " "; - S << "Common Z displacement : " << ent->ZDisplacement() << " "; - S << "Data Points : " << Message_EndLine; - IGESData_DumpListXYLZ(S ,level,1, ent->NbPoints(),ent->Point, + S << "IGESDimen_CenterLine\n"; + if (ent->IsCrossHair()) S << "Cross Hair\n"; + else S << "Through Circle Centers\n"; + S << "Data Type : " << ent->Datatype() << " " + << "Number of Data Points : " << ent->NbPoints() << " " + << "Common Z displacement : " << ent->ZDisplacement() << " " + << "Data Points :\n"; + IGESData_DumpListXYLZ(S,level,1, ent->NbPoints(),ent->Point, ent->Location(), ent->ZDisplacement()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolCenterLine.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolCenterLine.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolCenterLine.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolCenterLine.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a CenterLine. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_CenterLine)& entfrom, const Handle(IGESDimen_CenterLine)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_CenterLine)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_CenterLine)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolCurveDimension.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolCurveDimension.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolCurveDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolCurveDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -153,30 +153,30 @@ void IGESDimen_ToolCurveDimension::OwnDump (const Handle(IGESDimen_CurveDimension)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESDimen_CurveDimension" << Message_EndLine; - S << "General Note Entity : "; + S << "IGESDimen_CurveDimension\n" + << "General Note Entity : "; dumper.Dump(ent->Note(),S, sublevel); - S << Message_EndLine; - S << "First Curve Entity : "; + S << "\n" + << "First Curve Entity : "; dumper.Dump(ent->FirstCurve(),S, sublevel); - S << Message_EndLine; - S << "Second Curve Entity : "; + S << "\n" + << "Second Curve Entity : "; dumper.Dump(ent->SecondCurve(),S, sublevel); - S << Message_EndLine; - S << "First Leader Entity : "; + S << "\n" + << "First Leader Entity : "; dumper.Dump(ent->FirstLeader(),S, sublevel); - S << Message_EndLine; - S << "Second Leader Entity : "; + S << "\n" + << "Second Leader Entity : "; dumper.Dump(ent->SecondLeader(),S, sublevel); - S << Message_EndLine; - S << "First Witness Entity : "; + S << "\n" + << "First Witness Entity : "; dumper.Dump(ent->FirstWitnessLine(),S, sublevel); - S << Message_EndLine; - S << "Second Witness Entity : "; + S << "\n" + << "Second Witness Entity : "; dumper.Dump(ent->SecondWitnessLine(),S, sublevel); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolCurveDimension.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolCurveDimension.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolCurveDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolCurveDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a CurveDimension. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_CurveDimension)& entfrom, const Handle(IGESDimen_CurveDimension)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_CurveDimension)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_CurveDimension)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDiameterDimension.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDiameterDimension.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDiameterDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDiameterDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -119,22 +119,22 @@ void IGESDimen_ToolDiameterDimension::OwnDump (const Handle(IGESDimen_DiameterDimension)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESDimen_DiameterDimension" << Message_EndLine; - S << "General Note Entity : "; + S << "IGESDimen_DiameterDimension\n" + << "General Note Entity : "; dumper.Dump(ent->Note(),S, sublevel); - S << Message_EndLine; - S << "First Leader Entity : "; + S << "\n" + << "First Leader Entity : "; dumper.Dump(ent->FirstLeader(),S, sublevel); - S << Message_EndLine; - S << "Second Leader Entity : "; + S << "\n" + << "Second Leader Entity : "; dumper.Dump(ent->SecondLeader(),S, sublevel); - S << Message_EndLine; - S << "Center Point : "; + S << "\n" + << "Center Point : "; IGESData_DumpXYL(S,level, ent->Center(), ent->Location()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDiameterDimension.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDiameterDimension.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDiameterDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDiameterDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a DiameterDimension. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_DiameterDimension)& entfrom, const Handle(IGESDimen_DiameterDimension)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_DiameterDimension)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_DiameterDimension)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionDisplayData.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionDisplayData.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionDisplayData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionDisplayData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -269,90 +269,87 @@ void IGESDimen_ToolDimensionDisplayData::OwnDump (const Handle(IGESDimen_DimensionDisplayData)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDimen_DimensionDisplayData" << Message_EndLine; - - S << "No. of property values : " << ent->NbPropertyValues() << Message_EndLine; - - S << "DimensionType : " << ent->DimensionType() ; + S << "IGESDimen_DimensionDisplayData\n" + << "No. of property values : " << ent->NbPropertyValues() << "\n" + << "DimensionType : " << ent->DimensionType() ; switch (ent->DimensionType()) { - case 0 : S << " (Ordinary)" << Message_EndLine; break; - case 1 : S << " (Reference)" << Message_EndLine; break; - case 2 : S << " (Basic)" << Message_EndLine; break; - default : S << " (Incorrect Value)" << Message_EndLine; break; + case 0 : S << " (Ordinary)\n"; break; + case 1 : S << " (Reference)\n"; break; + case 2 : S << " (Basic)\n"; break; + default : S << " (Incorrect Value)\n"; break; } S << "Preferred Label Position : " << ent->LabelPosition(); switch (ent->LabelPosition()) { - case 0 : S << " (Does not exist)" << Message_EndLine; break; - case 1 : S << " (Before Measurement)" << Message_EndLine; break; - case 2 : S << " (After Measurement)" << Message_EndLine; break; - case 3 : S << " (Above Measurement)" << Message_EndLine; break; - case 4 : S << " (Below Measurement)" << Message_EndLine; break; - default : S << " (Incorrect Value)" << Message_EndLine; break; + case 0 : S << " (Does not exist)\n"; break; + case 1 : S << " (Before Measurement)\n"; break; + case 2 : S << " (After Measurement)\n"; break; + case 3 : S << " (Above Measurement)\n"; break; + case 4 : S << " (Below Measurement)\n"; break; + default : S << " (Incorrect Value)\n"; break; } S << "Character set interpretation : " << ent->CharacterSet() ; switch (ent->CharacterSet()) { - case 1 : S << " (Standard ASCII)" << Message_EndLine; break; - case 1001 : S << " (Symbol Font 1)" << Message_EndLine; break; - case 1002 : S << " (Symbol Font 2)" << Message_EndLine; break; - case 1003 : S << " (Drafting Font)" << Message_EndLine; break; - default : S << " (Not meaningful)" << Message_EndLine; break; + case 1 : S << " (Standard ASCII)\n"; break; + case 1001 : S << " (Symbol Font 1)\n"; break; + case 1002 : S << " (Symbol Font 2)\n"; break; + case 1003 : S << " (Drafting Font)\n"; break; + default : S << " (Not meaningful)\n"; break; } S << "LString : "; IGESData_DumpString(S,ent->LString()); - S << Message_EndLine; - - S << "Decimal Symbol : "; - if (ent->DecimalSymbol() == 0) S << "0 (.)" << Message_EndLine; - else S << "1 (,)" << Message_EndLine; - - S << "Witness Line Angle : " << ent->WitnessLineAngle() << Message_EndLine; - S << "Text Alignment : " ; - if (ent->TextAlignment() == 0 ) S << "0 (Horizontal)" << Message_EndLine; - else if (ent->TextAlignment() == 1 ) S << "1 (Parallel)" << Message_EndLine; - else S << ent->TextAlignment() << " (Incorrect Value)" << Message_EndLine; + S << "\n" + << "Decimal Symbol : "; + if (ent->DecimalSymbol() == 0) S << "0 (.)\n"; + else S << "1 (,)\n"; + + S << "Witness Line Angle : " << ent->WitnessLineAngle() << "\n" + << "Text Alignment : " ; + if (ent->TextAlignment() == 0 ) S << "0 (Horizontal)\n"; + else if (ent->TextAlignment() == 1 ) S << "1 (Parallel)\n"; + else S << ent->TextAlignment() << " (Incorrect Value)\n"; S << "Text Level : " << ent->TextLevel(); switch (ent->TextLevel()) { - case 0 : S << " (Neither above nor below)" << Message_EndLine; break; - case 1 : S << " (Above)" << Message_EndLine; break; - case 2 : S << " (Below)" << Message_EndLine; break; - default : S << " (Incorrect Value)" << Message_EndLine; break; + case 0 : S << " (Neither above nor below)\n"; break; + case 1 : S << " (Above)\n"; break; + case 2 : S << " (Below)\n"; break; + default : S << " (Incorrect Value)\n"; break; } S << "Preferred Text placement : " << ent->TextPlacement(); switch (ent->TextPlacement()) { - case 0 : S << " (Between witness lines)" << Message_EndLine; break; - case 1 : S << " (Outside near the first witness line)" << Message_EndLine; break; - case 2 : S << " (Outside near second witness line)" << Message_EndLine; break; - default : S << " (Incorrect Value)" << Message_EndLine; break; + case 0 : S << " (Between witness lines)\n"; break; + case 1 : S << " (Outside near the first witness line)\n"; break; + case 2 : S << " (Outside near second witness line)\n"; break; + default : S << " (Incorrect Value)\n"; break; } S << "Arrow Head Orientation : " << ent->ArrowHeadOrientation(); - if (ent->ArrowHeadOrientation() == 0) S << " (In, pointing out)" <ArrowHeadOrientation() == 1) S << " (Out, pointing in)" <ArrowHeadOrientation() == 0) S << " (In, pointing out)\n"; + else if (ent->ArrowHeadOrientation() == 1) S << " (Out, pointing in)\n"; + else S << " (Incorrect Value)\n"; Standard_Integer nbnotes = ent->NbSupplementaryNotes(); - S << " Primary Dimension Value : " << ent->InitialValue() << Message_EndLine; - S << " Number of Supplementary Notes : " << nbnotes <InitialValue() << "\n" + << " Number of Supplementary Notes : " << nbnotes << "\n" + << "Supplementary Notes , " + << " Start Index , " + << " End Index :\n"; IGESData_DumpVals(S,-level,1, nbnotes,ent->EndIndex); - S << Message_EndLine; + S << "\n"; if (level > 4) for (Standard_Integer i = 1; i <= nbnotes; i ++) { - S << "[" << i << "]: " << Message_EndLine; - S << "Supplementary Note : " << ent->SupplementaryNote(i); - S << ", Start Index : " << ent->StartIndex(i); - S << ", End Index : " << ent->EndIndex(i) << Message_EndLine; + S << "[" << i << "]:\n" + << "Supplementary Note : " << ent->SupplementaryNote(i) + << ", Start Index : " << ent->StartIndex(i) + << ", End Index : " << ent->EndIndex(i) << "\n"; } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionDisplayData.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionDisplayData.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionDisplayData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionDisplayData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a DimensionDisplayData. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_DimensionDisplayData)& entfrom, const Handle(IGESDimen_DimensionDisplayData)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_DimensionDisplayData)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_DimensionDisplayData)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionedGeometry.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionedGeometry.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionedGeometry.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionedGeometry.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include IGESDimen_ToolDimensionedGeometry::IGESDimen_ToolDimensionedGeometry () { } @@ -147,18 +146,18 @@ void IGESDimen_ToolDimensionedGeometry::OwnDump (const Handle(IGESDimen_DimensionedGeometry)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDimen_DimensionedGeometry" << Message_EndLine; + S << "IGESDimen_DimensionedGeometry\n"; //Standard_Integer lower = 1; //szv#4:S4163:12Mar99 unused // Standard_Integer upper = ent->NbGeometryEntities(); - S << "Number of Dimensions : " << ent->NbDimensions() << Message_EndLine; - S << "Dimension Entity : "; + S << "Number of Dimensions : " << ent->NbDimensions() << "\n" + << "Dimension Entity : "; dumper.Dump(ent->DimensionEntity(),S,(level <= 4) ? 0 : 1); - S << Message_EndLine; - S << "Geometry Entities : "; + S << "\n" + << "Geometry Entities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbGeometryEntities(),ent->GeometryEntity); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionedGeometry.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionedGeometry.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionedGeometry.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionedGeometry.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a DimensionedGeometry. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_DimensionedGeometry)& entfrom, const Handle(IGESDimen_DimensionedGeometry)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_DimensionedGeometry)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_DimensionedGeometry)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionTolerance.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionTolerance.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionTolerance.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionTolerance.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -153,17 +153,17 @@ void IGESDimen_ToolDimensionTolerance::OwnDump (const Handle(IGESDimen_DimensionTolerance)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESDimen_DimensionTolerance" << Message_EndLine; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Secondary Tolerance Flag : " << ent->SecondaryToleranceFlag() << Message_EndLine; - S << "Tolerance Type : " << ent->ToleranceType() << Message_EndLine; - S << "Tolerance Placement Flag : " << ent->TolerancePlacementFlag() << Message_EndLine; - S << "Upper Tolerance : " << ent->UpperTolerance() << Message_EndLine; - S << "Lower Tolerance : " << ent->LowerTolerance() << Message_EndLine; - S << "Sign Suppression Flag : " << ( ent->SignSuppressionFlag() ? "True" : "False" ) << Message_EndLine; - S << "Fraction Flag : " << ent->FractionFlag() << Message_EndLine; - S << "Precision : " << ent->Precision() << Message_EndLine; + S << "IGESDimen_DimensionTolerance\n" + << "Number of property values : " << ent->NbPropertyValues() << "\n" + << "Secondary Tolerance Flag : " << ent->SecondaryToleranceFlag() << "\n" + << "Tolerance Type : " << ent->ToleranceType() << "\n" + << "Tolerance Placement Flag : " << ent->TolerancePlacementFlag() << "\n" + << "Upper Tolerance : " << ent->UpperTolerance() << "\n" + << "Lower Tolerance : " << ent->LowerTolerance() << "\n" + << "Sign Suppression Flag : " << ( ent->SignSuppressionFlag() ? "True" : "False" ) << "\n" + << "Fraction Flag : " << ent->FractionFlag() << "\n" + << "Precision : " << ent->Precision() << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionTolerance.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionTolerance.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionTolerance.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionTolerance.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a DimensionTolerance. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_DimensionTolerance)& entfrom, const Handle(IGESDimen_DimensionTolerance)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_DimensionTolerance)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_DimensionTolerance)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionUnits.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionUnits.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionUnits.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionUnits.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -149,18 +149,18 @@ void IGESDimen_ToolDimensionUnits::OwnDump (const Handle(IGESDimen_DimensionUnits)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer /* level */) const + Standard_OStream& S, const Standard_Integer /* level */) const { - S << "IGESDimen_DimensionUnits" << Message_EndLine; - S << "Number of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Secondary Dimension Position : " << ent->SecondaryDimenPosition() << Message_EndLine; - S << "Units Indicator : " << ent->UnitsIndicator() << Message_EndLine; - S << "Character Set : " << ent->CharacterSet() << Message_EndLine; - S << "Format String : "; + S << "IGESDimen_DimensionUnits\n" + << "Number of property values : " << ent->NbPropertyValues() << "\n" + << "Secondary Dimension Position : " << ent->SecondaryDimenPosition() << "\n" + << "Units Indicator : " << ent->UnitsIndicator() << "\n" + << "Character Set : " << ent->CharacterSet() << "\n" + << "Format String : "; IGESData_DumpString(S,ent->FormatString()); - S << Message_EndLine; - S << "Fraction Flag : " << ent->FractionFlag(); + S << "\n" + << "Fraction Flag : " << ent->FractionFlag(); if (ent->FractionFlag() == 0) S << " Decimal , Precision : "; else S << " Fraction , Denominator : "; - S << ent->PrecisionOrDenominator() << Message_EndLine; + S << ent->PrecisionOrDenominator() << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionUnits.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionUnits.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionUnits.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolDimensionUnits.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a DimensionUnits. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_DimensionUnits)& entfrom, const Handle(IGESDimen_DimensionUnits)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_DimensionUnits)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_DimensionUnits)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolFlagNote.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolFlagNote.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolFlagNote.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolFlagNote.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,6 @@ #include #include #include -#include #include IGESDimen_ToolFlagNote::IGESDimen_ToolFlagNote () { } @@ -148,18 +147,18 @@ void IGESDimen_ToolFlagNote::OwnDump (const Handle(IGESDimen_FlagNote)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESDimen_FlagNote" << Message_EndLine; - S << "LowerLeftCorner : "; + S << "IGESDimen_FlagNote\n" + << "LowerLeftCorner : "; IGESData_DumpXYZL(S,level, ent->LowerLeftCorner(), ent->Location()); - S << Message_EndLine << "Rotation Angle: " << ent->Angle() << Message_EndLine; - S << "General Note Entity : "; + S << "\nRotation Angle: " << ent->Angle() << "\n" + << "General Note Entity : "; dumper.Dump(ent->Note(),S, sublevel); - S << Message_EndLine; - S << "Number of Leaders : " << ent->NbLeaders() << " Leaders : "; + S << "\n" + << "Number of Leaders : " << ent->NbLeaders() << " Leaders : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbLeaders(),ent->Leader); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolFlagNote.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolFlagNote.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolFlagNote.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolFlagNote.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a FlagNote. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_FlagNote)& entfrom, const Handle(IGESDimen_FlagNote)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_FlagNote)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_FlagNote)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralLabel.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralLabel.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralLabel.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralLabel.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -129,17 +129,17 @@ void IGESDimen_ToolGeneralLabel::OwnDump (const Handle(IGESDimen_GeneralLabel)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESDimen_GeneralLabel" << Message_EndLine; - S << "General Note Entity : "; + S << "IGESDimen_GeneralLabel\n" + << "General Note Entity : "; dumper.Dump(ent->Note(),S, sublevel); - S << Message_EndLine; - S << "Number of Leaders : " << ent->NbLeaders() << Message_EndLine; - S << "Leaders : "; + S << "\n" + << "Number of Leaders : " << ent->NbLeaders() << "\n" + << "Leaders : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbLeaders(),ent->Leader); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralLabel.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralLabel.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralLabel.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralLabel.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a GeneralLabel. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_GeneralLabel)& entfrom, const Handle(IGESDimen_GeneralLabel)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_GeneralLabel)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_GeneralLabel)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralNote.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralNote.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralNote.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralNote.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -332,53 +332,53 @@ void IGESDimen_ToolGeneralNote::OwnDump (const Handle(IGESDimen_GeneralNote)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; Standard_Integer upper = ent->NbStrings(); - S << "IGESDimen_GeneralNote" << Message_EndLine; - S << "Number of Text Strings : " << upper << Message_EndLine; - S << "Number of Characters : " << Message_EndLine; - S << "Box Widths : " << Message_EndLine; - S << "Box Heights : " << Message_EndLine; - S << "Font Codes : " << Message_EndLine; - S << "Font Entities : " << Message_EndLine; - S << "Slant Angles : " << Message_EndLine; - S << "Rotation Angles : " << Message_EndLine; - S << "Mirror Flags : " << Message_EndLine; - S << "Rotate Flags : " << Message_EndLine; - S << "Start Points : " << Message_EndLine; - S << "Texts : "; + S << "IGESDimen_GeneralNote\n" + << "Number of Text Strings : " << upper << "\n" + << "Number of Characters :\n" + << "Box Widths :\n" + << "Box Heights :\n" + << "Font Codes :\n" + << "Font Entities :\n" + << "Slant Angles :\n" + << "Rotation Angles :\n" + << "Mirror Flags :\n" + << "Rotate Flags :\n" + << "Start Points :\n" + << "Texts : "; IGESData_DumpVals(S,-level,1, ent->NbStrings(),ent->NbCharacters); - S << Message_EndLine; + S << "\n"; if (level > 4) { - S << "Details of each String" << Message_EndLine; + S << "Details of each String\n"; for ( Standard_Integer i = 1; i <= upper; i++) { - S << "[" << i << "]: " << Message_EndLine; - S << "Number of Characters : " << ent->NbCharacters(i) << " "; - S << "Box Width : " << ent->BoxWidth(i) << " "; - S << "Box Height : " << ent->BoxHeight(i) << Message_EndLine; + S << "[" << i << "]:\n" + << "Number of Characters : " << ent->NbCharacters(i) << " " + << "Box Width : " << ent->BoxWidth(i) << " " + << "Box Height : " << ent->BoxHeight(i) << "\n"; if (ent->IsFontEntity(i)) { S << "Font Entity : "; dumper.Dump (ent->FontEntity(i),S, sublevel); - S << Message_EndLine; + S << "\n"; } else - S << "Font Code : " << ent->FontCode(i) << Message_EndLine; - S << "Slant Angle : " << ent->SlantAngle(i) << " "; - S << "Rotation Angle : " << ent->RotationAngle(i) << " "; - S << "Mirror Flag : " << ent->MirrorFlag(i) << " "; - S << "Rotate Flag : " << ent->RotateFlag(i) << Message_EndLine; - S << "Start Point : "; + S << "Font Code : " << ent->FontCode(i) << "\n" + << "Slant Angle : " << ent->SlantAngle(i) << " " + << "Rotation Angle : " << ent->RotationAngle(i) << " " + << "Mirror Flag : " << ent->MirrorFlag(i) << " " + << "Rotate Flag : " << ent->RotateFlag(i) << "\n" + << "Start Point : "; IGESData_DumpXYZL(S,level, ent->StartPoint(i), ent->Location()); S << "\nText : "; IGESData_DumpString(S,ent->Text(i)); - S << Message_EndLine; + S << "\n"; } } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralNote.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralNote.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralNote.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralNote.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a GeneralNote. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_GeneralNote)& entfrom, const Handle(IGESDimen_GeneralNote)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_GeneralNote)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_GeneralNote)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralSymbol.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralSymbol.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralSymbol.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralSymbol.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -173,15 +173,15 @@ void IGESDimen_ToolGeneralSymbol::OwnDump (const Handle(IGESDimen_GeneralSymbol)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESDimen_GeneralSymbol" << Message_EndLine; - S << "General Note : "; + S << "IGESDimen_GeneralSymbol\n" + << "General Note : "; dumper.Dump(ent->Note(),S, sublevel); - S << Message_EndLine << "Geometric Entities : "; + S << "\nGeometric Entities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbGeomEntities(),ent->GeomEntity); - S << Message_EndLine << "Leader Arrows : "; + S << "\nLeader Arrows : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbLeaders(),ent->LeaderArrow); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralSymbol.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralSymbol.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralSymbol.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolGeneralSymbol.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a GeneralSymbol. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_GeneralSymbol)& entfrom, const Handle(IGESDimen_GeneralSymbol)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_GeneralSymbol)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_GeneralSymbol)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolLeaderArrow.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolLeaderArrow.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolLeaderArrow.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolLeaderArrow.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -142,17 +141,17 @@ void IGESDimen_ToolLeaderArrow::OwnDump (const Handle(IGESDimen_LeaderArrow)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDimen_LeaderArrow" << Message_EndLine; - S << "Number of Segments : " << ent->NbSegments() << Message_EndLine; - S << "Arrowhead Height : " << ent->ArrowHeadHeight() << Message_EndLine; - S << "Arrowhead Width : " << ent->ArrowHeadWidth() << Message_EndLine; - S << "Z depth : " << ent->ZDepth() << Message_EndLine; - S << "Arrowhead co-ords : "; + S << "IGESDimen_LeaderArrow\n" + << "Number of Segments : " << ent->NbSegments() << "\n" + << "Arrowhead Height : " << ent->ArrowHeadHeight() << "\n" + << "Arrowhead Width : " << ent->ArrowHeadWidth() << "\n" + << "Z depth : " << ent->ZDepth() << "\n" + << "Arrowhead co-ords : "; IGESData_DumpXYLZ(S,level,ent->ArrowHead(),ent->Location(),ent->ZDepth()); - S << Message_EndLine << "Segment Tails : "; - IGESData_DumpListXYLZ(S ,level,1, ent->NbSegments(),ent->SegmentTail, + S << "\nSegment Tails : "; + IGESData_DumpListXYLZ(S,level,1, ent->NbSegments(),ent->SegmentTail, ent->Location(), ent->ZDepth()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolLeaderArrow.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolLeaderArrow.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolLeaderArrow.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolLeaderArrow.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a LeaderArrow. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_LeaderArrow)& entfrom, const Handle(IGESDimen_LeaderArrow)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_LeaderArrow)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_LeaderArrow)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolLinearDimension.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolLinearDimension.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolLinearDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolLinearDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include IGESDimen_ToolLinearDimension::IGESDimen_ToolLinearDimension () { } @@ -130,28 +129,28 @@ void IGESDimen_ToolLinearDimension::OwnDump (const Handle(IGESDimen_LinearDimension)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESDimen_LinearDimension" << Message_EndLine; - if (ent->FormNumber() == 0) S << " (Undetermined Form)" << Message_EndLine; - else if (ent->FormNumber() == 1) S << " (Diameter Form)" << Message_EndLine; - else if (ent->FormNumber() == 2) S << " (Radius Form)" << Message_EndLine; + S << "IGESDimen_LinearDimension\n"; + if (ent->FormNumber() == 0) S << " (Undetermined Form)\n"; + else if (ent->FormNumber() == 1) S << " (Diameter Form)\n"; + else if (ent->FormNumber() == 2) S << " (Radius Form)\n"; S << "General Note Entity : "; dumper.Dump(ent->Note(),S, sublevel); - S << Message_EndLine; - S << "First Leader Entity : "; + S << "\n" + << "First Leader Entity : "; dumper.Dump(ent->FirstLeader(),S, sublevel); - S << Message_EndLine; - S << "Second Leader Entity : "; + S << "\n" + << "Second Leader Entity : "; dumper.Dump(ent->SecondLeader(),S, sublevel); - S << Message_EndLine; - S << "First Witness Entity : "; + S << "\n" + << "First Witness Entity : "; dumper.Dump(ent->FirstWitness(),S, sublevel); - S << Message_EndLine; - S << "Second Witness Entity : "; + S << "\n" + << "Second Witness Entity : "; dumper.Dump(ent->SecondWitness(),S, sublevel); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolLinearDimension.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolLinearDimension.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolLinearDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolLinearDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a LinearDimension. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_LinearDimension)& entfrom, const Handle(IGESDimen_LinearDimension)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_LinearDimension)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_LinearDimension)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewDimensionedGeometry.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewDimensionedGeometry.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewDimensionedGeometry.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewDimensionedGeometry.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -212,31 +212,31 @@ void IGESDimen_ToolNewDimensionedGeometry::OwnDump (const Handle(IGESDimen_NewDimensionedGeometry)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer i, num, sublevel = (level > 4) ? 1 : 0; - S << "IGESDimen_NewDimensionedGeometry" << Message_EndLine; - S << "Number of Dimensions : " << ent->NbDimensions() << Message_EndLine; - S << "Dimension Entity : "; + S << "IGESDimen_NewDimensionedGeometry\n" + << "Number of Dimensions : " << ent->NbDimensions() << "\n" + << "Dimension Entity : "; dumper.Dump(ent->DimensionEntity(),S, sublevel); - S << Message_EndLine; - S << "Dimension Orientation Flag : " << ent->DimensionOrientationFlag() << Message_EndLine; - S << "Angle Value Flag : " << ent->AngleValue() << Message_EndLine; - S << "Geometry Entities : " << Message_EndLine; - S << "Dimension Location Flags : " << Message_EndLine; - S << "Points : "; + S << "\n" + << "Dimension Orientation Flag : " << ent->DimensionOrientationFlag() << "\n" + << "Angle Value Flag : " << ent->AngleValue() << "\n" + << "Geometry Entities :\n" + << "Dimension Location Flags :\n" + << "Points : "; IGESData_DumpEntities(S,dumper,-level,1, ent->NbGeometries(),ent->GeometryEntity); - S << Message_EndLine; + S << "\n"; if (level > 4) for ( num = ent->NbGeometries(), i = 1; i <= num; i++ ) { - S << "[" << i << "]: " << Message_EndLine; - S << "Geometry Entity : "; + S << "[" << i << "]:\n" + << "Geometry Entity : "; dumper.Dump (ent->GeometryEntity(i),S, 1); - S << Message_EndLine; - S << "Dimension Location Flag : " << ent->DimensionLocationFlag(i) << Message_EndLine; - S << "Point : "; + S << "\n" + << "Dimension Location Flag : " << ent->DimensionLocationFlag(i) << "\n" + << "Point : "; IGESData_DumpXYZL(S,level, ent->Point(i), ent->Location()); } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewDimensionedGeometry.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewDimensionedGeometry.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewDimensionedGeometry.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewDimensionedGeometry.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a NewDimensionedGeometry. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_NewDimensionedGeometry)& entfrom, const Handle(IGESDimen_NewDimensionedGeometry)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_NewDimensionedGeometry)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_NewDimensionedGeometry)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewGeneralNote.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewGeneralNote.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewGeneralNote.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewGeneralNote.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -458,82 +458,82 @@ void IGESDimen_ToolNewGeneralNote::OwnDump (const Handle(IGESDimen_NewGeneralNote)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; Standard_Integer nbval = ent->NbStrings(); - S << "IGESDimen_NewGeneralNote" << Message_EndLine; - S << "Text Area : Width : " << ent->TextWidth() << " "; - S << "Height : " << ent->TextHeight() << " "; - S << "Justification Code : " << ent->JustifyCode() << Message_EndLine; - S << "Text Area Location Point : "; + S << "IGESDimen_NewGeneralNote\n" + << "Text Area : Width : " << ent->TextWidth() << " " + << "Height : " << ent->TextHeight() << " " + << "Justification Code : " << ent->JustifyCode() << "\n" + << "Text Area Location Point : "; IGESData_DumpXYZL(S,level, ent->AreaLocation(), ent->Location()); - S << "Rotation Angle of Text : " << ent->AreaRotationAngle() << Message_EndLine; - S << "Base Line Position : "; + S << "Rotation Angle of Text : " << ent->AreaRotationAngle() << "\n" + << "Base Line Position : "; IGESData_DumpXYZL(S,level, ent->BaseLinePosition(), ent->Location()); - S << "Normal Interline Spacing : " << ent->NormalInterlineSpace() << Message_EndLine; - S << "Number of Text Strings : " << nbval << Message_EndLine; + S << "Normal Interline Spacing : " << ent->NormalInterlineSpace() << "\n" + << "Number of Text Strings : " << nbval << "\n"; - S << "Character Display : " << Message_EndLine; - S << "Character Width : " << Message_EndLine; - S << "Character Height : " << Message_EndLine; - S << "Inter Character Spacing : " << Message_EndLine; - S << "Interline Spacing : " << Message_EndLine; - S << "Font Styles : " << Message_EndLine; - S << "Character Angle : " << Message_EndLine; - S << "Control Code String : " << Message_EndLine; - S << "Number of Characters : " << Message_EndLine; - S << "Box Widths : " << Message_EndLine; - S << "Box Heights : " << Message_EndLine; - S << "Character Set Codes : " << Message_EndLine; - S << "Character Set Entities : " << Message_EndLine; - S << "Slant Angles : " << Message_EndLine; - S << "Rotation Angles : " << Message_EndLine; - S << "Mirror Flags : " << Message_EndLine; - S << "Rotate Flags : " << Message_EndLine; - S << "Start Points : " << Message_EndLine; - S << "Texts : "; + S << "Character Display :\n" + << "Character Width :\n" + << "Character Height :\n" + << "Inter Character Spacing :\n" + << "Interline Spacing :\n" + << "Font Styles :\n" + << "Character Angle :\n" + << "Control Code String :\n" + << "Number of Characters :\n" + << "Box Widths :\n" + << "Box Heights :\n" + << "Character Set Codes :\n" + << "Character Set Entities :\n" + << "Slant Angles :\n" + << "Rotation Angles :\n" + << "Mirror Flags :\n" + << "Rotate Flags :\n" + << "Start Points :\n" + << "Texts : "; IGESData_DumpVals(S,-level,1, nbval, ent->NbCharacters); - S << Message_EndLine; + S << "\n"; if (level > 4) { - S << "Details of each String" << Message_EndLine; + S << "Details of each String\n"; for ( Standard_Integer i = 1; i <= nbval; i++) { - S << "[" << i << "]: " << Message_EndLine; - S << "Character Display : " << ent->CharacterDisplay(i) << " "; - S << "Character Width : " << ent->CharacterWidth(i) << " "; - S << "Character Height : " << ent->CharacterHeight(i) << Message_EndLine; - S << "Inter Character Spacing : "<InterCharacterSpace(i)<<" "; - S << "Interline Spacing : " << ent->InterlineSpace(i) << Message_EndLine; - S << "Font Styles : " << ent->FontStyle(i) << Message_EndLine; - S << "Character Angle : " << ent->CharacterAngle(i) << Message_EndLine; - S << "Control Code String : " ; + S << "[" << i << "]:\n" + << "Character Display : " << ent->CharacterDisplay(i) << " " + << "Character Width : " << ent->CharacterWidth(i) << " " + << "Character Height : " << ent->CharacterHeight(i) << "\n" + << "Inter Character Spacing : "<InterCharacterSpace(i)<<" " + << "Interline Spacing : " << ent->InterlineSpace(i) << "\n" + << "Font Styles : " << ent->FontStyle(i) << "\n" + << "Character Angle : " << ent->CharacterAngle(i) << "\n" + << "Control Code String : " ; IGESData_DumpString(S,ent->ControlCodeString(i)); - S << Message_EndLine; - S << "Number of Characters : " << ent->NbCharacters(i) << " "; - S << "Box Width : " << ent->BoxWidth(i) << " "; - S << "Box Height : " << ent->BoxHeight(i) << Message_EndLine; + S << "\n" + << "Number of Characters : " << ent->NbCharacters(i) << " " + << "Box Width : " << ent->BoxWidth(i) << " " + << "Box Height : " << ent->BoxHeight(i) << "\n"; if (ent->IsCharSetEntity(i)) { S << "Character Set Entity : "; dumper.Dump (ent->CharSetEntity(i),S, sublevel); - S << Message_EndLine; + S << "\n"; } else - S << "Character Set Code : " << ent->CharSetCode(i) << Message_EndLine; + S << "Character Set Code : " << ent->CharSetCode(i) << "\n" - S << "Slant Angle : " << ent->SlantAngle(i) << " "; - S << "Rotation Angle : " << ent->RotationAngle(i) << " "; - S << "Mirror Flag : " << ent->MirrorFlag(i) << " "; - S << "Rotate Flag : " << ent->RotateFlag(i) << Message_EndLine; - S << "Start Point : "; + << "Slant Angle : " << ent->SlantAngle(i) << " " + << "Rotation Angle : " << ent->RotationAngle(i) << " " + << "Mirror Flag : " << ent->MirrorFlag(i) << " " + << "Rotate Flag : " << ent->RotateFlag(i) << "\n" + << "Start Point : "; IGESData_DumpXYZL(S,level, ent->StartPoint(i), ent->Location()); S << "Text : "; IGESData_DumpString(S,ent->Text(i)); - S << Message_EndLine; + S << "\n"; } } - else S << Message_EndLine; + else S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewGeneralNote.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewGeneralNote.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewGeneralNote.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolNewGeneralNote.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a NewGeneralNote. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_NewGeneralNote)& entfrom, const Handle(IGESDimen_NewGeneralNote)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_NewGeneralNote)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_NewGeneralNote)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolOrdinateDimension.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolOrdinateDimension.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolOrdinateDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolOrdinateDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -151,24 +151,24 @@ void IGESDimen_ToolOrdinateDimension::OwnDump (const Handle(IGESDimen_OrdinateDimension)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDimen_OrdinateDimension" << Message_EndLine; + S << "IGESDimen_OrdinateDimension\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "General Note : "; dumper.Dump(ent->Note(),S, sublevel); - S << Message_EndLine; + S << "\n"; Handle(IGESDimen_WitnessLine) witLine = ent->WitnessLine(); Handle(IGESDimen_LeaderArrow) leadArr = ent->Leader(); if (!witLine.IsNull()) { S << "Witness line : "; dumper.Dump(witLine,S, sublevel); - S << Message_EndLine; + S << "\n"; } if (!leadArr.IsNull()) { S << "Leader arrow :"; dumper.Dump(leadArr,S, sublevel); - S << Message_EndLine; + S << "\n"; } } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolOrdinateDimension.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolOrdinateDimension.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolOrdinateDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolOrdinateDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a OrdinateDimension. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_OrdinateDimension)& entfrom, const Handle(IGESDimen_OrdinateDimension)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_OrdinateDimension)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_OrdinateDimension)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolPointDimension.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolPointDimension.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolPointDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolPointDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -111,21 +111,21 @@ void IGESDimen_ToolPointDimension::OwnDump (const Handle(IGESDimen_PointDimension)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDimen_PointDimension" << Message_EndLine; + S << "IGESDimen_PointDimension\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "General Note : "; dumper.Dump(ent->Note(),S , sublevel); - S << Message_EndLine; - S << "Leader Arrow : "; + S << "\n" + << "Leader Arrow : "; dumper.Dump(ent->LeaderArrow(),S , sublevel); - S << Message_EndLine; + S << "\n"; if (!ent->Geom().IsNull()) { S << "Enclosing Entity : "; dumper.Dump(ent->Geom(),S , sublevel); - S << Message_EndLine; + S << "\n"; } } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolPointDimension.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolPointDimension.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolPointDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolPointDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a PointDimension. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_PointDimension)& entfrom, const Handle(IGESDimen_PointDimension)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_PointDimension)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_PointDimension)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolRadiusDimension.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolRadiusDimension.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolRadiusDimension.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolRadiusDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -126,24 +126,24 @@ void IGESDimen_ToolRadiusDimension::OwnDump (const Handle(IGESDimen_RadiusDimension)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S,const Standard_Integer level) const + Standard_OStream& S,const Standard_Integer level) const { - S << "IGESDimen_RadiusDimension" << Message_EndLine; + S << "IGESDimen_RadiusDimension\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "General note : "; dumper.Dump(ent->Note(),S, sublevel); - S << Message_EndLine; - S << "Leader arrow : "; + S << "\n" + << "Leader arrow : "; dumper.Dump(ent->Leader(),S, sublevel); - S << Message_EndLine; - S << "Arc center : "; + S << "\n" + << "Arc center : "; IGESData_DumpXYLZ(S,level,ent->Center(),ent->Location(),ent->Leader()->ZDepth()); if (ent->HasLeader2()) { - S << Message_EndLine << "Leader arrow 2 : "; + S << "\nLeader arrow 2 : "; dumper.Dump(ent->Leader2(),S, sublevel); - S << Message_EndLine; + S << "\n"; } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolRadiusDimension.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolRadiusDimension.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolRadiusDimension.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolRadiusDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a RadiusDimension. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_RadiusDimension)& entfrom, const Handle(IGESDimen_RadiusDimension)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_RadiusDimension)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_RadiusDimension)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolSection.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolSection.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolSection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolSection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -157,14 +157,14 @@ void IGESDimen_ToolSection::OwnDump (const Handle(IGESDimen_Section)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDimen_Section" << Message_EndLine; - S << "Data Type : " << ent->Datatype() << " "; - S << "Number of Data Points : " << ent->NbPoints() << " "; - S << "Common Z displacement : " << ent->ZDisplacement() << Message_EndLine; - S << "Data Points : "; - IGESData_DumpListXYLZ(S ,level,1, ent->NbPoints(),ent->Point, + S << "IGESDimen_Section\n" + << "Data Type : " << ent->Datatype() << " " + << "Number of Data Points : " << ent->NbPoints() << " " + << "Common Z displacement : " << ent->ZDisplacement() << "\n" + << "Data Points : "; + IGESData_DumpListXYLZ(S,level,1, ent->NbPoints(),ent->Point, ent->Location(), ent->ZDisplacement()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolSectionedArea.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolSectionedArea.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolSectionedArea.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolSectionedArea.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,6 @@ #include #include #include -#include #include IGESDimen_ToolSectionedArea::IGESDimen_ToolSectionedArea () { } @@ -156,22 +155,21 @@ void IGESDimen_ToolSectionedArea::OwnDump (const Handle(IGESDimen_SectionedArea)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESDimen_SectionedArea" << Message_EndLine; - S << (ent->IsInverted() ? "Inverted Cross Hatches" : "Standard Cross Hatches"); - - S << " - Exterior curve : "; + S << "IGESDimen_SectionedArea\n" + << (ent->IsInverted() ? "Inverted Cross Hatches" : "Standard Cross Hatches") + << " - Exterior curve : "; dumper.Dump(ent->ExteriorCurve(),S, sublevel); - S << Message_EndLine; - S << "Fill pattern code : " << ent->Pattern() << Message_EndLine; - S << "Passing point : "; - IGESData_DumpXYZL(S,level, ent->PassingPoint(), ent->Location()); S << Message_EndLine; - S << "Distance between lines : " << ent->Distance() << Message_EndLine; - S << "Angle between lines and X axis : " << ent->Angle() << Message_EndLine; - S << "Island Curve : "; + S << "\n" + << "Fill pattern code : " << ent->Pattern() << "\n" + << "Passing point : "; + IGESData_DumpXYZL(S,level, ent->PassingPoint(), ent->Location()); S << "\n"; + S << "Distance between lines : " << ent->Distance() << "\n" + << "Angle between lines and X axis : " << ent->Angle() << "\n" + << "Island Curve : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbIslands(),ent->IslandCurve); - S << Message_EndLine; + S << "\n"; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolSectionedArea.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolSectionedArea.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolSectionedArea.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolSectionedArea.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SectionedArea. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_SectionedArea)& entfrom, const Handle(IGESDimen_SectionedArea)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_SectionedArea)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_SectionedArea)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolSection.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolSection.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolSection.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolSection.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Section. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_Section)& entfrom, const Handle(IGESDimen_Section)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_Section)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_Section)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolWitnessLine.cxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolWitnessLine.cxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolWitnessLine.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolWitnessLine.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -158,14 +158,14 @@ void IGESDimen_ToolWitnessLine::OwnDump (const Handle(IGESDimen_WitnessLine)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDimen_WitnessLine" << Message_EndLine; - S << "Data Type : " << ent->Datatype() << " "; - S << "Number of Data Points : " << ent->NbPoints() << " "; - S << "Common Z displacement : " << ent->ZDisplacement() << Message_EndLine; - S << "Data Points : "; - IGESData_DumpListXYLZ(S ,level,1, ent->NbPoints(),ent->Point, + S << "IGESDimen_WitnessLine\n" + << "Data Type : " << ent->Datatype() << " " + << "Number of Data Points : " << ent->NbPoints() << " " + << "Common Z displacement : " << ent->ZDisplacement() << "\n" + << "Data Points : "; + IGESData_DumpListXYLZ(S,level,1, ent->NbPoints(),ent->Point, ent->Location(), ent->ZDisplacement()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolWitnessLine.hxx opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolWitnessLine.hxx --- opencascade-7.4.1+dfsg1/src/IGESDimen/IGESDimen_ToolWitnessLine.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDimen/IGESDimen_ToolWitnessLine.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a WitnessLine. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDimen_WitnessLine)& entfrom, const Handle(IGESDimen_WitnessLine)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDimen_WitnessLine)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDimen_WitnessLine)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_Protocol.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_Protocol.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_Protocol.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_Protocol.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -68,7 +68,7 @@ Handle(Interface_Protocol) IGESDraw_Protocol::Resource (const Standard_Integer /*num*/) const { - Handle(Interface_Protocol) res = IGESDimen::Protocol();; + Handle(Interface_Protocol) res = IGESDimen::Protocol(); return res; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_SpecificModule.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_SpecificModule.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_SpecificModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_SpecificModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,7 +44,6 @@ #include #include #include -#include #include IMPLEMENT_STANDARD_RTTIEXT(IGESDraw_SpecificModule,IGESData_SpecificModule) @@ -57,7 +56,7 @@ void IGESDraw_SpecificModule::OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, - const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, + const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const { switch (CN) { diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_SpecificModule.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_SpecificModule.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_SpecificModule.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_SpecificModule.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,8 +25,6 @@ #include class IGESData_IGESEntity; class IGESData_IGESDumper; -class Message_Messenger; - class IGESDraw_SpecificModule; DEFINE_STANDARD_HANDLE(IGESDraw_SpecificModule, IGESData_SpecificModule) @@ -43,7 +41,7 @@ Standard_EXPORT IGESDraw_SpecificModule(); //! Specific Dump (own parameters) for IGESDraw - Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const Standard_OVERRIDE; + Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const Standard_OVERRIDE; //! Performs non-ambiguous Corrections on Entities which support //! them (Planar) diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolCircArraySubfigure.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolCircArraySubfigure.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolCircArraySubfigure.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolCircArraySubfigure.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -161,25 +160,24 @@ void IGESDraw_ToolCircArraySubfigure::OwnDump (const Handle(IGESDraw_CircArraySubfigure)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer tempSubLevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_CircArraySubfigure" << Message_EndLine; - - S << "Base Entity : "; + S << "IGESDraw_CircArraySubfigure\n" + << "Base Entity : "; dumper.Dump(ent->BaseEntity(),S, tempSubLevel); - S << Message_EndLine; - S << "Total Number Of Possible Instance Locations : " << ent->NbLocations() - << Message_EndLine; - S << "Imaginary Circle. Radius : " << ent->CircleRadius() << " Center : "; - IGESData_DumpXYZL(S, level, ent->CenterPoint(), ent->Location()); S << Message_EndLine; - S << "Start Angle (in radians) : " << ent->StartAngle() << " "; - S << "Delta Angle (in radians) : " << ent->DeltaAngle() << Message_EndLine; - S << "Do-Dont Flag : "; - if (ent->DoDontFlag()) S << "Dont" << Message_EndLine; - else S << "Do" << Message_EndLine; + S << "\n" + << "Total Number Of Possible Instance Locations : " << ent->NbLocations() + << "\n" + << "Imaginary Circle. Radius : " << ent->CircleRadius() << " Center : "; + IGESData_DumpXYZL(S, level, ent->CenterPoint(), ent->Location()); S << "\n"; + S << "Start Angle (in radians) : " << ent->StartAngle() << " " + << "Delta Angle (in radians) : " << ent->DeltaAngle() << "\n" + << "Do-Dont Flag : "; + if (ent->DoDontFlag()) S << "Dont\n"; + else S << "Do\n"; S << "The Do-Dont List : "; - IGESData_DumpVals(S ,level,1, ent->ListCount(),ent->ListPosition); - S << Message_EndLine; + IGESData_DumpVals(S,level,1, ent->ListCount(),ent->ListPosition); + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolCircArraySubfigure.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolCircArraySubfigure.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolCircArraySubfigure.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolCircArraySubfigure.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a CircArraySubfigure. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_CircArraySubfigure)& entfrom, const Handle(IGESDraw_CircArraySubfigure)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_CircArraySubfigure)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_CircArraySubfigure)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolConnectPoint.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolConnectPoint.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolConnectPoint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolConnectPoint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -203,32 +203,31 @@ void IGESDraw_ToolConnectPoint::OwnDump (const Handle(IGESDraw_ConnectPoint)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer tempSubLevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_ConnectPoint" << Message_EndLine; - - S << "Connection Point Coordinate : "; + S << "IGESDraw_ConnectPoint\n" + << "Connection Point Coordinate : "; IGESData_DumpXYZL(S, level, ent->Point(), ent->Location()); S << "Display Symbol Geometry Entity : "; dumper.Dump(ent->DisplaySymbol(),S, tempSubLevel); - S << Message_EndLine; - S << "Type Flag : " << ent->TypeFlag() << " " - << "Function Flag : " << ent->FunctionFlag() << Message_EndLine; - S << "Function Identifier : "; + S << "\n" + << "Type Flag : " << ent->TypeFlag() << " " + << "Function Flag : " << ent->FunctionFlag() << "\n" + << "Function Identifier : "; IGESData_DumpString(S,ent->FunctionIdentifier()); - S << Message_EndLine << "Text Display Template Entity for CID : "; + S << "\nText Display Template Entity for CID : "; dumper.Dump(ent->IdentifierTemplate(),S, tempSubLevel); - S << Message_EndLine << "Function Name : "; + S << "\nFunction Name : "; IGESData_DumpString(S,ent->FunctionName()); - S << Message_EndLine << "Text Display Template Entity for CFN : "; + S << "\nText Display Template Entity for CFN : "; dumper.Dump(ent->FunctionTemplate(),S, tempSubLevel); - S << Message_EndLine; - S << "Point Identifier : " << ent->PointIdentifier() << Message_EndLine + S << "\n" + << "Point Identifier : " << ent->PointIdentifier() << "\n" << "Function Code : " << ent->FunctionCode() - << "Swap Flag : " << ( ent->SwapFlag() ? "True" : "False" ) << Message_EndLine; - S << "Owner Subfigure Entity : "; + << "Swap Flag : " << ( ent->SwapFlag() ? "True" : "False" ) << "\n" + << "Owner Subfigure Entity : "; dumper.Dump(ent->OwnerSubfigure(),S, tempSubLevel); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolConnectPoint.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolConnectPoint.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolConnectPoint.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolConnectPoint.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ConnectPoint. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_ConnectPoint)& entfrom, const Handle(IGESDraw_ConnectPoint)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_ConnectPoint)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_ConnectPoint)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawing.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawing.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawing.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawing.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -262,21 +262,20 @@ void IGESDraw_ToolDrawing::OwnDump (const Handle(IGESDraw_Drawing)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_Drawing" << Message_EndLine; - - S << "View Entities : " << Message_EndLine - << "Transformed View Origins : "; - S << "Count = " << ent->NbViews(); + S << "IGESDraw_Drawing\n" + << "View Entities :\n" + << "Transformed View Origins : " + << "Count = " << ent->NbViews(); switch (level) { - case 4 : S << " [ ask level > 4 for content ]" << Message_EndLine; + case 4 : S << " [ ask level > 4 for content ]\n"; break; // Nothing to be dumped here case 5 : // Presently level 5 and 6 have the same Dump - S << Message_EndLine; + S << "\n"; Standard_FALLTHROUGH case 6 : { @@ -284,17 +283,17 @@ Standard_Integer up = ent->NbViews(); for (I = 1; I <= up; I++) { - S << Message_EndLine << "[" << I << "] "; - S << "View Entity : "; + S << "\n[" << I << "] " + << "View Entity : "; dumper.Dump (ent->ViewItem(I),S, sublevel); - S << Message_EndLine; - S << "Transformed View Origin : "; + S << "\n" + << "Transformed View Origin : "; IGESData_DumpXY(S, ent->ViewOrigin(I)); } } break; } - S << Message_EndLine << "Annotation Entities : "; + S << "\nAnnotation Entities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbAnnotations(),ent->Annotation); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawing.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawing.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawing.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawing.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Drawing. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_Drawing)& entfrom, const Handle(IGESDraw_Drawing)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_Drawing)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_Drawing)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawingWithRotation.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawingWithRotation.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawingWithRotation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawingWithRotation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -282,16 +282,15 @@ void IGESDraw_ToolDrawingWithRotation::OwnDump (const Handle(IGESDraw_DrawingWithRotation)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_DrawingWithRotation" << Message_EndLine; - - S << "View Entities : " << Message_EndLine - << "Transformed View Origins : " << Message_EndLine - << "Orientation Angles : "; - S << "Count = " << ent->NbViews() << Message_EndLine; + S << "IGESDraw_DrawingWithRotation\n" + << "View Entities :\n" + << "Transformed View Origins :\n" + << "Orientation Angles : " + << "Count = " << ent->NbViews() << "\n"; if (level > 4) // Level = 4 : no Dump. Level = 5 & 6 have same Dump { @@ -299,16 +298,16 @@ Standard_Integer up = ent->NbViews(); for (I = 1; I <= up; I++) { - S << "[" << I << "]:" << Message_EndLine; - S << "View Entity : "; + S << "[" << I << "]:\n" + << "View Entity : "; dumper.Dump (ent->ViewItem(I),S, sublevel); - S << Message_EndLine; - S << "Transformed View Origin : "; + S << "\n" + << "Transformed View Origin : "; IGESData_DumpXY(S, ent->ViewOrigin(I)); - S << " Orientation Angle : " << ent->OrientationAngle(I) << Message_EndLine; + S << " Orientation Angle : " << ent->OrientationAngle(I) << "\n"; } } S << "Annotation Entities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbAnnotations(),ent->Annotation); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawingWithRotation.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawingWithRotation.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawingWithRotation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolDrawingWithRotation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a DrawingWithRotation. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_DrawingWithRotation)& entfrom, const Handle(IGESDraw_DrawingWithRotation)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_DrawingWithRotation)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_DrawingWithRotation)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolLabelDisplay.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolLabelDisplay.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolLabelDisplay.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolLabelDisplay.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -204,39 +204,38 @@ void IGESDraw_ToolLabelDisplay::OwnDump (const Handle(IGESDraw_LabelDisplay)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_LabelDisplay" << Message_EndLine; - - S << "View Entities : " << Message_EndLine - << "Text Locations : " << Message_EndLine - << "Leader Entities : " << Message_EndLine - << "Label Level Numbers : " << Message_EndLine - << "Displayed Entities : "; - S << "Count = " << ent->NbLabels() << Message_EndLine; + S << "IGESDraw_LabelDisplay\n" + << "View Entities :\n" + << "Text Locations :\n" + << "Leader Entities :\n" + << "Label Level Numbers :\n" + << "Displayed Entities : " + << "Count = " << ent->NbLabels() << "\n"; if (level > 4) // Level = 4 : no Dump. Level = 5 & 6 : same Dump { Standard_Integer I; Standard_Integer up = ent->NbLabels(); for (I = 1; I <= up; I ++) { - S << "[" << I << "]:" << Message_EndLine; - S << "View Entity : "; + S << "[" << I << "]:\n" + << "View Entity : "; dumper.Dump (ent->ViewItem(I),S, sublevel); - S << Message_EndLine; - S << "Text Location in View : "; + S << "\n" + << "Text Location in View : "; IGESData_DumpXYZL(S,level, ent->TextLocation(I), ent->Location()); S << " Leader Entity in View : "; dumper.Dump (ent->LeaderEntity(I),S, sublevel); - S << Message_EndLine; - S << "Entity Label Level Number : "; - S << ent->LabelLevel(I) << " "; - S << "Displayed Entity : "; + S << "\n" + << "Entity Label Level Number : " + << ent->LabelLevel(I) << " " + << "Displayed Entity : "; dumper.Dump (ent->DisplayedEntity(I),S, sublevel); - S << Message_EndLine; + S << "\n"; } } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolLabelDisplay.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolLabelDisplay.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolLabelDisplay.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolLabelDisplay.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a LabelDisplay. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_LabelDisplay)& entfrom, const Handle(IGESDraw_LabelDisplay)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_LabelDisplay)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_LabelDisplay)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigure.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigure.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigure.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigure.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -226,24 +226,23 @@ void IGESDraw_ToolNetworkSubfigure::OwnDump (const Handle(IGESDraw_NetworkSubfigure)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_NetworkSubfigure" << Message_EndLine; - - S << "Network Subfigure Definition Entity : "; + S << "IGESDraw_NetworkSubfigure\n" + << "Network Subfigure Definition Entity : "; dumper.Dump(ent->SubfigureDefinition(),S, sublevel); - S << Message_EndLine << "Translation Data : "; + S << "\nTranslation Data : "; IGESData_DumpXYZL(S,level, ent->Translation(), ent->Location()); - S << Message_EndLine << "Scale Factors : "; + S << "\nScale Factors : "; IGESData_DumpXYZ(S, ent->ScaleFactors()); - S << Message_EndLine << "Type Flag : " << ent->TypeFlag() << Message_EndLine; - S << "Primary Reference Designator : "; + S << "\nType Flag : " << ent->TypeFlag() << "\n" + << "Primary Reference Designator : "; IGESData_DumpString(S,ent->ReferenceDesignator()); - S << Message_EndLine << "Text Display Template Entity : "; + S << "\nText Display Template Entity : "; dumper.Dump(ent->DesignatorTemplate(),S, sublevel); - S << Message_EndLine << "Connect Points : "; + S << "\nConnect Points : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbConnectPoints(),ent->ConnectPoint); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigureDef.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigureDef.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigureDef.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigureDef.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -223,23 +223,22 @@ void IGESDraw_ToolNetworkSubfigureDef::OwnDump (const Handle(IGESDraw_NetworkSubfigureDef)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer tempSubLevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_NetworkSubfigureDef" << Message_EndLine; - - S << "Depth Of Subfigure(Nesting) : " << ent->Depth() << Message_EndLine; - S << "Name Of Subfigure : "; + S << "IGESDraw_NetworkSubfigureDef\n" + << "Depth Of Subfigure(Nesting) : " << ent->Depth() << "\n" + << "Name Of Subfigure : "; IGESData_DumpString(S,ent->Name()); - S << Message_EndLine << "Associated Entities : "; + S << "\nAssociated Entities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbEntities(),ent->Entity); - S << Message_EndLine << "Type Flag : " << ent->TypeFlag() << Message_EndLine; - S << "Primary Reference Designator : "; + S << "\nType Flag : " << ent->TypeFlag() << "\n" + << "Primary Reference Designator : "; IGESData_DumpString(S,ent->Designator()); - S << Message_EndLine << "Text Display Template Entity : "; + S << "\nText Display Template Entity : "; dumper.Dump(ent->DesignatorTemplate(),S, tempSubLevel); - S << Message_EndLine << "Connect Point Entities : "; + S << "\nConnect Point Entities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbPointEntities(),ent->PointEntity); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigureDef.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigureDef.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigureDef.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigureDef.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a NetworkSubfigureDef. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_NetworkSubfigureDef)& entfrom, const Handle(IGESDraw_NetworkSubfigureDef)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_NetworkSubfigureDef)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_NetworkSubfigureDef)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigure.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigure.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigure.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolNetworkSubfigure.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a NetworkSubfigure. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_NetworkSubfigure)& entfrom, const Handle(IGESDraw_NetworkSubfigure)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_NetworkSubfigure)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_NetworkSubfigure)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolPerspectiveView.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolPerspectiveView.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolPerspectiveView.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolPerspectiveView.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -168,34 +168,33 @@ void IGESDraw_ToolPerspectiveView::OwnDump (const Handle(IGESDraw_PerspectiveView)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDraw_PerspectiveView" << Message_EndLine; - - S << "View Number : " << ent->ViewNumber() << " "; - S << "Scale Factor : " << ent->ScaleFactor() << Message_EndLine; - S << "View Plane Normal Vector : "; + S << "IGESDraw_PerspectiveView\n" + << "View Number : " << ent->ViewNumber() << " " + << "Scale Factor : " << ent->ScaleFactor() << "\n" + << "View Plane Normal Vector : "; IGESData_DumpXYZL(S,level, ent->ViewNormalVector(), ent->Location()); - S << Message_EndLine << "View Reference Point : "; + S << "\nView Reference Point : "; IGESData_DumpXYZL(S,level, ent->ViewReferencePoint() , ent->Location()); - S << Message_EndLine << "Center Of Projection : "; + S << "\nCenter Of Projection : "; IGESData_DumpXYZL(S,level, ent->CenterOfProjection() , ent->Location()); - S << Message_EndLine << "View Up Vector : "; + S << "\nView Up Vector : "; IGESData_DumpXYZL(S,level, ent->ViewUpVector() , ent->Location()); - S << Message_EndLine << "View Plane Distance : " << ent->ViewPlaneDistance()<TopLeft().X() << Message_EndLine; - S << "Right Side Of Clipping Window : " << ent->BottomRight().X() << Message_EndLine; - S << "Bottom Side Of Clipping Window : " << ent->BottomRight().Y() << Message_EndLine; - S << "Top Side Of Clipping Window : " << ent->TopLeft().Y() << Message_EndLine; - S << "Depth Clipping : " << ent->DepthClip(); + S << "\nView Plane Distance : " << ent->ViewPlaneDistance()<< "\n" + << "Left Side Of Clipping Window : " << ent->TopLeft().X() << "\n" + << "Right Side Of Clipping Window : " << ent->BottomRight().X() << "\n" + << "Bottom Side Of Clipping Window : " << ent->BottomRight().Y() << "\n" + << "Top Side Of Clipping Window : " << ent->TopLeft().Y() << "\n" + << "Depth Clipping : " << ent->DepthClip(); switch (ent->DepthClip()) { - case 0 : S << " (No Depth Clipping)" << Message_EndLine; break; - case 1 : S << " (Back Clipping Plane ON)" << Message_EndLine; break; - case 2 : S << " (Front Clipping Plane ON)" << Message_EndLine; break; - case 3 : S << " (Front and Back Clipping Planes ON)" << Message_EndLine; break; - default : S << " (Invalid Value)" << Message_EndLine; break; + case 0 : S << " (No Depth Clipping)\n"; break; + case 1 : S << " (Back Clipping Plane ON)\n"; break; + case 2 : S << " (Front Clipping Plane ON)\n"; break; + case 3 : S << " (Front and Back Clipping Planes ON)\n"; break; + default : S << " (Invalid Value)\n"; break; } - S << "Back Plane Distance : " << ent->BackPlaneDistance() << " "; - S << "Front Plane Distance : " << ent->FrontPlaneDistance() << Message_EndLine; - S << Message_EndLine; + S << "Back Plane Distance : " << ent->BackPlaneDistance() << " " + << "Front Plane Distance : " << ent->FrontPlaneDistance() << "\n" + << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolPerspectiveView.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolPerspectiveView.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolPerspectiveView.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolPerspectiveView.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a PerspectiveView. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_PerspectiveView)& entfrom, const Handle(IGESDraw_PerspectiveView)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_PerspectiveView)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_PerspectiveView)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolPlanar.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolPlanar.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolPlanar.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolPlanar.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -168,20 +168,19 @@ void IGESDraw_ToolPlanar::OwnDump (const Handle(IGESDraw_Planar)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_Planar" << Message_EndLine; - - S << "No. of Transformation Matrices : " << ent->NbMatrices() << " "; - S << "i.e. : "; + S << "IGESDraw_Planar\n" + << "No. of Transformation Matrices : " << ent->NbMatrices() << " " + << "i.e. : "; if ( ent->TransformMatrix().IsNull() ) S << "Null Handle"; else dumper.OwnDump (ent->TransformMatrix(),S, sublevel); - S << Message_EndLine; - S << "Array of Entities on the specified plane : "; + S << "\n" + << "Array of Entities on the specified plane : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbEntities(),ent->Entity); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolPlanar.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolPlanar.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolPlanar.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolPlanar.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Planar. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_Planar)& entfrom, const Handle(IGESDraw_Planar)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_Planar)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_Planar)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolRectArraySubfigure.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolRectArraySubfigure.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolRectArraySubfigure.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolRectArraySubfigure.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -174,27 +174,26 @@ void IGESDraw_ToolRectArraySubfigure::OwnDump (const Handle(IGESDraw_RectArraySubfigure)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer tempSubLevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_RectArraySubfigure" << Message_EndLine; - - S << "Base Entity : "; + S << "IGESDraw_RectArraySubfigure\n" + << "Base Entity : "; dumper.Dump(ent->BaseEntity(),S, tempSubLevel); - S << Message_EndLine; - S << "Scale Factor : " << ent->ScaleFactor() << " "; - S << "Lower Left Corner Of Array : "; + S << "\n" + << "Scale Factor : " << ent->ScaleFactor() << " " + << "Lower Left Corner Of Array : "; IGESData_DumpXYZL(S,level, ent->LowerLeftCorner(),gp_GTrsf()); // no location - S << "Number Of Columns : " << ent->NbColumns() << " "; - S << "Number Of Rows : " << ent->NbRows() << Message_EndLine; - S << "Horizontal Distance Between Columns : " << ent->ColumnSeparation()<RowSeparation() <RotationAngle() <NbColumns() << " " + << "Number Of Rows : " << ent->NbRows() << "\n" + << "Horizontal Distance Between Columns : " << ent->ColumnSeparation()<< "\n" + << "Vertical Distance Between Rows : " << ent->RowSeparation() << "\n" + << "Rotation Angle (in radians) : " << ent->RotationAngle() << "\n" + << "Do-Dont Flag : "; if (ent->DoDontFlag()) S << "(1)Dont "; else S << "(0)Do "; S << "Do-Dont List : "; - IGESData_DumpVals(S ,level,1, ent->ListCount(),ent->ListPosition); - S << Message_EndLine; + IGESData_DumpVals(S,level,1, ent->ListCount(),ent->ListPosition); + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolRectArraySubfigure.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolRectArraySubfigure.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolRectArraySubfigure.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolRectArraySubfigure.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a RectArraySubfigure. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_RectArraySubfigure)& entfrom, const Handle(IGESDraw_RectArraySubfigure)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_RectArraySubfigure)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_RectArraySubfigure)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolSegmentedViewsVisible.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolSegmentedViewsVisible.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolSegmentedViewsVisible.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolSegmentedViewsVisible.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -277,24 +276,23 @@ void IGESDraw_ToolSegmentedViewsVisible::OwnDump (const Handle(IGESDraw_SegmentedViewsVisible)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_SegmentedViewsVisible" << Message_EndLine; - - S << "View Entities : " << Message_EndLine - << "Breakpoint parameters : " << Message_EndLine - << "Display flags : " << Message_EndLine - << "Color Values : " << Message_EndLine - << "Color Definitions : " << Message_EndLine - << "LineFont Values : " << Message_EndLine - << "LineFont Definitions : " << Message_EndLine - << "Line Weights : " << Message_EndLine; - S << "Count Of Blocks = " << ent->NbSegmentBlocks() << Message_EndLine; + S << "IGESDraw_SegmentedViewsVisible\n" + << "View Entities :\n" + << "Breakpoint parameters :\n" + << "Display flags :\n" + << "Color Values :\n" + << "Color Definitions :\n" + << "LineFont Values :\n" + << "LineFont Definitions :\n" + << "Line Weights :\n" + << "Count Of Blocks = " << ent->NbSegmentBlocks() << "\n"; switch (level) { - case 4 : S << " [ for content, ask level > 4 ]" << Message_EndLine; + case 4 : S << " [ for content, ask level > 4 ]\n"; break; // Nothing to be dumped here case 5 : // Presently level 5 and 6 have the same Dump case 6 : @@ -303,23 +301,22 @@ Standard_Integer up = ent->NbSegmentBlocks(); for (I = 1; I <= up; I++) { - S << "[" << I << "]:" << Message_EndLine; - S << "View Entity : "; + S << "[" << I << "]:\n" + << "View Entity : "; dumper.Dump (ent->ViewItem(I),S, sublevel); - S << Message_EndLine; - S << "Breakpoint parameter : " <BreakpointParameter(I)<DisplayFlag(I) << Message_EndLine; + S << "\n" + << "Breakpoint parameter : " <BreakpointParameter(I)<< "\n" + << "Display Flag : " << ent->DisplayFlag(I) << "\n"; if ( (ent->ColorDefinition(I)).IsNull() ) { - S << "Color Value : "; - S << ent->ColorValue(I); + S << "Color Value : " << ent->ColorValue(I); } else { S << "Color Definition : "; dumper.Dump (ent->ColorDefinition(I),S, sublevel); } - S << Message_EndLine; + S << "\n"; if ( (ent->LineFontDefinition(I)).IsNull() ) { S << "LineFont Value : " << ent->LineFontValue(I); @@ -329,11 +326,11 @@ S << "LineFont Definition : "; dumper.Dump (ent->LineFontDefinition(I),S, sublevel); } - S << Message_EndLine; - S << "Line Weight : " << ent->LineWeightItem(I) << Message_EndLine; + S << "\n" + << "Line Weight : " << ent->LineWeightItem(I) << "\n"; } } break; } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolSegmentedViewsVisible.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolSegmentedViewsVisible.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolSegmentedViewsVisible.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolSegmentedViewsVisible.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SegmentedViewsVisible. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_SegmentedViewsVisible)& entfrom, const Handle(IGESDraw_SegmentedViewsVisible)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_SegmentedViewsVisible)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_SegmentedViewsVisible)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolView.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolView.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolView.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolView.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,7 +31,6 @@ #include #include #include -#include #include IGESDraw_ToolView::IGESDraw_ToolView () { } @@ -153,24 +152,23 @@ void IGESDraw_ToolView::OwnDump (const Handle(IGESDraw_View)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer tempSubLevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_View" << Message_EndLine; - - S << "View Number : " << ent->ViewNumber() << Message_EndLine; - S << "Scale Factor : " << ent->ScaleFactor() << Message_EndLine; - S << "Left Plane Of View Volume : "; - dumper.Dump(ent->LeftPlane(),S, tempSubLevel); S << Message_EndLine; + S << "IGESDraw_View\n" + << "View Number : " << ent->ViewNumber() << "\n" + << "Scale Factor : " << ent->ScaleFactor() << "\n" + << "Left Plane Of View Volume : "; + dumper.Dump(ent->LeftPlane(),S, tempSubLevel); S << "\n"; S << "Top Plane Of View Volume : "; - dumper.Dump(ent->TopPlane(),S, tempSubLevel); S << Message_EndLine; + dumper.Dump(ent->TopPlane(),S, tempSubLevel); S << "\n"; S << "Right Plane Of View Volume : "; - dumper.Dump(ent->RightPlane(),S, tempSubLevel); S << Message_EndLine; + dumper.Dump(ent->RightPlane(),S, tempSubLevel); S << "\n"; S << "Bottom Plane Of View Volume : "; - dumper.Dump(ent->BottomPlane(),S, tempSubLevel); S << Message_EndLine; + dumper.Dump(ent->BottomPlane(),S, tempSubLevel); S << "\n"; S << "Back Plane Of View Volume : "; - dumper.Dump(ent->BackPlane(),S, tempSubLevel); S << Message_EndLine; + dumper.Dump(ent->BackPlane(),S, tempSubLevel); S << "\n"; S << "Front Plane Of View Volume : "; - dumper.Dump(ent->FrontPlane(),S, tempSubLevel); S << Message_EndLine; + dumper.Dump(ent->FrontPlane(),S, tempSubLevel); S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolView.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolView.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolView.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolView.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a View. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESDraw_View)& entfrom, const Handle(IGESDraw_View)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_View)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_View)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisible.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisible.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisible.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisible.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,6 @@ #include #include #include -#include #include #include @@ -227,17 +226,15 @@ void IGESDraw_ToolViewsVisible::OwnDump (const Handle(IGESDraw_ViewsVisible)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESDraw_ViewsVisible" << Message_EndLine; - - S << "Views Visible : "; + S << "IGESDraw_ViewsVisible\n" + << "Views Visible : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbViews(),ent->ViewItem); - S << Message_EndLine; - S << "Entities Displayed : "; - IGESData_DumpEntities - (S,dumper ,level,1, ent->NbDisplayedEntities(),ent->DisplayedEntity); - S << Message_EndLine; + S << "\n" + << "Entities Displayed : "; + IGESData_DumpEntities(S,dumper ,level,1, ent->NbDisplayedEntities(),ent->DisplayedEntity); + S << std::endl; } Standard_Boolean IGESDraw_ToolViewsVisible::OwnCorrect diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisible.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisible.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisible.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisible.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ViewsVisible. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -83,7 +81,7 @@ Standard_EXPORT void OwnWhenDelete (const Handle(IGESDraw_ViewsVisible)& ent) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_ViewsVisible)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_ViewsVisible)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; //! Sets automatic unambiguous Correction on a ViewsVisible //! (all displayed entities must refer to in directory part, diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisibleWithAttr.cxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisibleWithAttr.cxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisibleWithAttr.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisibleWithAttr.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,6 @@ #include #include #include -#include #include #include @@ -337,48 +336,46 @@ void IGESDraw_ToolViewsVisibleWithAttr::OwnDump (const Handle(IGESDraw_ViewsVisibleWithAttr)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer tempSubLevel = (level <= 4) ? 0 : 1; - S << "IGESDraw_ViewsVisibleWithAttr" << Message_EndLine; - - S << "View Entities : " << Message_EndLine - << "Line Font Values : " << Message_EndLine - << "Line Font Definitions : " << Message_EndLine - << "Color Number/Definitions : " << Message_EndLine - << "Line Weights : " << Message_EndLine; - S << "Count of View Blocks : " << ent->NbViews() << Message_EndLine; + S << "IGESDraw_ViewsVisibleWithAttr\n" + << "View Entities :\n" + << "Line Font Values :\n" + << "Line Font Definitions :\n" + << "Color Number/Definitions :\n" + << "Line Weights :\n" + << "Count of View Blocks : " << ent->NbViews() << "\n"; if (level > 4) { // Level = 4 : nothing to Dump. Level = 5 & 6 : same Dump Standard_Integer I; Standard_Integer upper = ent->NbViews(); for (I = 1; I <= upper; I++) { - S << "[" << I << "]: " << Message_EndLine; - S << "View Entity : "; + S << "[" << I << "]:\n" + << "View Entity : "; dumper.Dump (ent->ViewItem(I),S, tempSubLevel); - S << Message_EndLine; + S << "\n"; if (ent->IsFontDefinition(I)) { S << "Line Font Definition : "; dumper.Dump (ent->FontDefinition(I),S, tempSubLevel); - S << Message_EndLine; + S << "\n"; } - else S << "Line Font Value : " << ent->LineFontValue(I) << Message_EndLine; + else S << "Line Font Value : " << ent->LineFontValue(I) << "\n"; if (ent->IsColorDefinition(I)) { S << "Color Definition : "; dumper.Dump (ent->ColorDefinition(I),S, tempSubLevel); - S << Message_EndLine; + S << std::endl; } - else S << "Color Value : " << ent->ColorValue(I) << Message_EndLine; + else S << "Color Value : " << ent->ColorValue(I) << "\n"; - S << "Line Weight : " << ent->LineWeightItem(I) << Message_EndLine; + S << "Line Weight : " << ent->LineWeightItem(I) << "\n"; } } S << "Displayed Entities : "; - IGESData_DumpEntities - (S,dumper ,level,1, ent->NbDisplayedEntities(),ent->DisplayedEntity); - S << Message_EndLine; + IGESData_DumpEntities(S,dumper ,level,1, ent->NbDisplayedEntities(),ent->DisplayedEntity); + S << std::endl; } Standard_Boolean IGESDraw_ToolViewsVisibleWithAttr::OwnCorrect diff -Nru opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisibleWithAttr.hxx opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisibleWithAttr.hxx --- opencascade-7.4.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisibleWithAttr.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESDraw/IGESDraw_ToolViewsVisibleWithAttr.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ViewsVisibleWithAttr. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -84,7 +82,7 @@ Standard_EXPORT void OwnWhenDelete (const Handle(IGESDraw_ViewsVisibleWithAttr)& ent) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESDraw_ViewsVisibleWithAttr)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESDraw_ViewsVisibleWithAttr)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; //! Sets automatic unambiguous Correction on a ViewsVisibleWithAttr //! (all displayed entities must refer to in directory part, diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_Protocol.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_Protocol.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_Protocol.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_Protocol.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -86,7 +86,7 @@ Handle(Interface_Protocol) IGESGeom_Protocol::Resource (const Standard_Integer /*num*/) const { - Handle(Interface_Protocol) res = IGESBasic::Protocol();; + Handle(Interface_Protocol) res = IGESBasic::Protocol(); return res; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_SpecificModule.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_SpecificModule.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_SpecificModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_SpecificModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -62,7 +62,6 @@ #include #include #include -#include #include IMPLEMENT_STANDARD_RTTIEXT(IGESGeom_SpecificModule,IGESData_SpecificModule) @@ -75,7 +74,7 @@ void IGESGeom_SpecificModule::OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, - const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, + const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const { switch (CN) { diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_SpecificModule.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_SpecificModule.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_SpecificModule.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_SpecificModule.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,8 +25,6 @@ #include class IGESData_IGESEntity; class IGESData_IGESDumper; -class Message_Messenger; - class IGESGeom_SpecificModule; DEFINE_STANDARD_HANDLE(IGESGeom_SpecificModule, IGESData_SpecificModule) @@ -43,7 +41,7 @@ Standard_EXPORT IGESGeom_SpecificModule(); //! Specific Dump (own parameters) for IGESGeom - Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const Standard_OVERRIDE; + Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const Standard_OVERRIDE; //! Performs non-ambiguous Correction on Entities which support //! them (Boundary,ConicArc,Flash,OffsetCurve,TransformationMatrix) diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundary.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundary.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundary.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundary.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -430,36 +429,38 @@ void IGESGeom_ToolBoundary::OwnDump(const Handle(IGESGeom_Boundary)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer i, num, sublevel = (level > 4) ? 1 : 0; - S << "IGESGeom_Boundary" << Message_EndLine; - S << "Bounded Surface Representation Type : " << ent->BoundaryType() << Message_EndLine; - S << "Trimming Curves Representation : " << ent->PreferenceType() << Message_EndLine; - S << "Bounded Surface : "; + S << "IGESGeom_Boundary\n" + << "Bounded Surface Representation Type : " << ent->BoundaryType() << "\n" + << "Trimming Curves Representation : " << ent->PreferenceType() << "\n" + << "Bounded Surface : "; dumper.Dump(ent->Surface(),S, sublevel); - S << Message_EndLine; - S << "Model Space Curves : " << Message_EndLine; - S << "Orientation Flags : " << Message_EndLine; - S << "Parameter Curves Set : "; - IGESData_DumpEntities - (S,dumper,-level,1,ent->NbModelSpaceCurves(),ent->ModelSpaceCurve); - S << Message_EndLine; + S << "\n" + << "Model Space Curves :\n" + << "Orientation Flags :\n" + << "Parameter Curves Set : "; + IGESData_DumpEntities(S,dumper,-level,1,ent->NbModelSpaceCurves(),ent->ModelSpaceCurve); + S << "\n"; if (level > 4) for ( num = ent->NbModelSpaceCurves(), i = 1; i <= num; i++ ) { - S << "[" << i << "]: "; - S << "Model Space Curve : "; + S << "[" << i << "]: " + << "Model Space Curve : "; dumper.Dump (ent->ModelSpaceCurve(i),S, 1); - S << " Orientation Flags : " << ent->Sense(i) << Message_EndLine; - S << " Parameter Curves : "; + S << " Orientation Flags : " << ent->Sense(i) << "\n" + << " Parameter Curves : "; Handle(IGESData_HArray1OfIGESEntity) curves = ent->ParameterCurves(i); if (!curves.IsNull()) { IGESData_DumpEntities(S,dumper, level,1,curves->Length(),curves->Value); } - else S << " List Empty"; - S << Message_EndLine; + else + { + S << " List Empty"; + } + S << "\n"; } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundary.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundary.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundary.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundary.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Boundary. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_Boundary)& entfrom, const Handle(IGESGeom_Boundary)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_Boundary)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_Boundary)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundedSurface.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundedSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundedSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundedSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -250,16 +250,16 @@ void IGESGeom_ToolBoundedSurface::OwnDump(const Handle(IGESGeom_BoundedSurface)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level > 4) ? 1 : 0; - S << "IGESGeom_BoundedSurface" << Message_EndLine; - S << "Representation Type : " << ent->RepresentationType() << Message_EndLine; - S << "Surface to be Bounded : "; + S << "IGESGeom_BoundedSurface\n" + << "Representation Type : " << ent->RepresentationType() << "\n" + << "Surface to be Bounded : "; dumper.Dump(ent->Surface(),S, sublevel); - S << Message_EndLine; - S << "Boundary Entities : "; + S << "\n" + << "Boundary Entities : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbBoundaries(),ent->Boundary); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundedSurface.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundedSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundedSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBoundedSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a BoundedSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_BoundedSurface)& entfrom, const Handle(IGESGeom_BoundedSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_BoundedSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_BoundedSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineCurve.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineCurve.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -401,27 +401,26 @@ void IGESGeom_ToolBSplineCurve::OwnDump(const Handle(IGESGeom_BSplineCurve)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer upind = ent->UpperIndex(); - S << "BSplineCurve from IGESGeom" << Message_EndLine; - S << "Sum UpperIndex : " << upind; - S << " Degree : " << ent->Degree() << " "; - S << (ent->IsPlanar() ? "Planar" : "NonPlanar") << Message_EndLine; - S << (ent->IsClosed() ? "Closed" : "Open") << " "; - S << (ent->IsPeriodic() ? "Periodic" : "NonPeriodic") << " ";//#54 rln 24.12.98 CCI60005 - S << (ent->IsPolynomial(Standard_True) ? "Polynomial" : "Rational"); - - S << Message_EndLine << "Knots : "; - IGESData_DumpVals(S ,level,-ent->Degree(), upind+1,ent->Knot); - S << Message_EndLine << "Weights : "; - IGESData_DumpVals(S ,level,0, upind,ent->Weight); - S << Message_EndLine << "Control Points (Poles) : "; - IGESData_DumpListXYZL(S ,level,0, upind, ent->Pole, ent->Location()); - S << Message_EndLine << "Starting Parameter Value : " << ent->UMin(); - S << " Ending Parameter Value : " << ent->UMax() << Message_EndLine; - S << "Unit Normal : "; + S << "BSplineCurve from IGESGeom\n" + << "Sum UpperIndex : " << upind + << " Degree : " << ent->Degree() << " " + << (ent->IsPlanar() ? "Planar" : "NonPlanar") << "\n" + << (ent->IsClosed() ? "Closed" : "Open") << " " + << (ent->IsPeriodic() ? "Periodic" : "NonPeriodic") << " " //#54 rln 24.12.98 CCI60005 + << (ent->IsPolynomial(Standard_True) ? "Polynomial" : "Rational") + << "\nKnots : "; + IGESData_DumpVals(S,level,-ent->Degree(), upind+1,ent->Knot); + S << "\nWeights : "; + IGESData_DumpVals(S,level,0, upind,ent->Weight); + S << "\nControl Points (Poles) : "; + IGESData_DumpListXYZL(S,level,0, upind, ent->Pole, ent->Location()); + S << "\nStarting Parameter Value : " << ent->UMin() + << " Ending Parameter Value : " << ent->UMax() << "\n" + << "Unit Normal : "; IGESData_DumpXYZL(S,level, ent->Normal(), ent->Location()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineCurve.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineCurve.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a BSplineCurve. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_BSplineCurve)& entfrom, const Handle(IGESGeom_BSplineCurve)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_BSplineCurve)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_BSplineCurve)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineSurface.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -466,50 +466,50 @@ void IGESGeom_ToolBSplineSurface::OwnDump(const Handle(IGESGeom_BSplineSurface)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { - S << "BSplineSurface from IGESGeom" << Message_EndLine << Message_EndLine; + S << "BSplineSurface from IGESGeom\n\n"; Standard_Integer indU = ent->UpperIndexU(); Standard_Integer indV = ent->UpperIndexV(); Standard_Integer degU = ent->DegreeU(); Standard_Integer degV = ent->DegreeV(); - S << "In U : Upper Knot Index : " << indU; - S << " Degree : " << degU << " "; - S << (ent->IsClosedU() ? "Closed" : "Open") << " "; - S << (ent->IsPeriodicU() ? "Periodic" : "Non Periodic"); - S << Message_EndLine; - S << "In V : Upper Knot Index : " << indV; - S << " Degree : " << degV << " "; - S << (ent->IsClosedV() ? "Closed" : "Open") << " "; - S << (ent->IsPeriodicV() ? "Periodic" : "Non Periodic") << " "; - S << (ent->IsPolynomial(Standard_True) ? "Polynomial" : "Rational") << Message_EndLine; + S << "In U : Upper Knot Index : " << indU + << " Degree : " << degU << " " + << (ent->IsClosedU() ? "Closed" : "Open") << " " + << (ent->IsPeriodicU() ? "Periodic" : "Non Periodic") + << "\n" + << "In V : Upper Knot Index : " << indV + << " Degree : " << degV << " " + << (ent->IsClosedV() ? "Closed" : "Open") << " " + << (ent->IsPeriodicV() ? "Periodic" : "Non Periodic") << " " + << (ent->IsPolynomial(Standard_True) ? "Polynomial" : "Rational") << "\n"; - S << "Starting Parameter for U direction : " << ent->UMin() << Message_EndLine; - S << "Ending Parameter for U direction : " << ent->UMax() << Message_EndLine; - S << "Starting Parameter for V direction : " << ent->VMin() << Message_EndLine; - S << "Ending Parameter for V direction : " << ent->VMax() << Message_EndLine; + S << "Starting Parameter for U direction : " << ent->UMin() << "\n" + << "Ending Parameter for U direction : " << ent->UMax() << "\n" + << "Starting Parameter for V direction : " << ent->VMin() << "\n" + << "Ending Parameter for V direction : " << ent->VMax() << "\n"; S << " Knots in U : "; - IGESData_DumpVals(S ,level,-degU, indU+1,ent->KnotU); - S << Message_EndLine; - S << " Knots in V : "; - IGESData_DumpVals(S ,level,-degV, indV+1,ent->KnotV); - S << Message_EndLine; - S << "Weights : (Row -> IndexU, Col -> IndexV)"; - IGESData_DumpRectVals(S ,level,0, indU,0,indV,ent->Weight); - S << Message_EndLine; - S << "Control Points (Poles) : "; + IGESData_DumpVals(S,level,-degU, indU+1,ent->KnotU); + S << "\n" + << " Knots in V : "; + IGESData_DumpVals(S,level,-degV, indV+1,ent->KnotV); + S << "\n" + << "Weights : (Row -> IndexU, Col -> IndexV)"; + IGESData_DumpRectVals(S,level,0, indU,0,indV,ent->Weight); + S << "\n" + << "Control Points (Poles) : "; //IGESData_DumpRectXYZL(S,level,1, ent->NbPoles(),ent->Pole, ent->Location()); - if (level < 5) { S << " [ content : ask level > 4 ]" << Message_EndLine; return; } + if (level < 5) { S << " [ content : ask level > 4 ]" << std::endl; return; } gp_GTrsf loca = ent->Location(); for (Standard_Integer JP = 0; JP <= indV; JP ++) for (Standard_Integer IP = 0; IP <= indU; IP ++) { - if (IP == 0) S << Message_EndLine; + if (IP == 0) S << "\n"; S <<" - ["<Pole(IP,JP),loca); } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineSurface.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolBSplineSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a BSplineSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_BSplineSurface)& entfrom, const Handle(IGESGeom_BSplineSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_BSplineSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_BSplineSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCircularArc.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCircularArc.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCircularArc.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCircularArc.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,7 +33,6 @@ #include #include #include -#include #include #include @@ -141,20 +140,20 @@ void IGESGeom_ToolCircularArc::OwnDump (const Handle(IGESGeom_CircularArc)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "CircularArc from IGESGeom" << Message_EndLine; - S << "Z-Plane Displacement : " << ent->ZPlane() << Message_EndLine; - S << "Center : "; + S << "CircularArc from IGESGeom]\n" + << "Z-Plane Displacement : " << ent->ZPlane() << "\n" + << "Center : "; IGESData_DumpXYLZ(S,level, ent->Center(), ent->Location(), ent->ZPlane()); - S << Message_EndLine; - S << "Start Point : "; + S << "\n" + << "Start Point : "; IGESData_DumpXYLZ(S,level, ent->StartPoint(), ent->Location(),ent->ZPlane()); - S << Message_EndLine; - S << "End Point : "; + S << "\n" + << "End Point : "; IGESData_DumpXYLZ(S,level, ent->EndPoint(), ent->Location(), ent->ZPlane()); - S << Message_EndLine; + S << "\n"; if (level <= 5) return; - S<< " Normal Axis : "; IGESData_DumpXYZL(S,level,ent->Axis(),ent->VectorLocation()); - S << Message_EndLine; + S << " Normal Axis : "; IGESData_DumpXYZL(S,level,ent->Axis(),ent->VectorLocation()); + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCircularArc.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCircularArc.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCircularArc.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCircularArc.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a CircularArc. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_CircularArc)& entfrom, const Handle(IGESGeom_CircularArc)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_CircularArc)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_CircularArc)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCompositeCurve.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCompositeCurve.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCompositeCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCompositeCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -121,10 +121,10 @@ void IGESGeom_ToolCompositeCurve::OwnDump (const Handle(IGESGeom_CompositeCurve)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESGeom_CompositeCurve" << Message_EndLine; - S << "Curve Entities : " << Message_EndLine; + S << "IGESGeom_CompositeCurve\n" + << "Curve Entities :\n"; IGESData_DumpEntities(S,dumper ,level,1, ent->NbCurves(),ent->Curve); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCompositeCurve.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCompositeCurve.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCompositeCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCompositeCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a CompositeCurve. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_CompositeCurve)& entfrom, const Handle(IGESGeom_CompositeCurve)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_CompositeCurve)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_CompositeCurve)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolConicArc.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolConicArc.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolConicArc.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolConicArc.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -278,47 +278,49 @@ void IGESGeom_ToolConicArc::OwnDump(const Handle(IGESGeom_ConicArc)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { Standard_Real A,B,C,D,E,F; ent->Equation(A,B,C,D,E,F); - S << "IGESGeom_ConicArc" << Message_EndLine; + S << "IGESGeom_ConicArc\n"; Standard_Integer cf = ent->FormNumber(); if (cf == 0) cf = ent->ComputedFormNumber(); - if (cf == 1) S << " -- Ellipse --" << Message_EndLine; - else if (cf == 2) S << " -- Hyperbola --" << Message_EndLine; - else if (cf == 3) S << " -- Parabola --" << Message_EndLine; - else S << " -- (Undetermined type of Conic) --" << Message_EndLine; - S << "Conic Coefficient A : " << A << Message_EndLine; - S << "Conic Coefficient B : " << B << Message_EndLine; - S << "Conic Coefficient C : " << C << Message_EndLine; - S << "Conic Coefficient D : " << D << Message_EndLine; - S << "Conic Coefficient E : " << E << Message_EndLine; - S << "Conic Coefficient F : " << F << Message_EndLine; - S << "Z-Plane shift : " << ent->ZPlane() << Message_EndLine; - S << "Start Point : "; + if (cf == 1) S << " -- Ellipse --\n"; + else if (cf == 2) S << " -- Hyperbola --\n"; + else if (cf == 3) S << " -- Parabola --\n"; + else S << " -- (Undetermined type of Conic) --\n"; + + S << "Conic Coefficient A : " << A << "\n" + << "Conic Coefficient B : " << B << "\n" + << "Conic Coefficient C : " << C << "\n" + << "Conic Coefficient D : " << D << "\n" + << "Conic Coefficient E : " << E << "\n" + << "Conic Coefficient F : " << F << "\n" + << "Z-Plane shift : " << ent->ZPlane() << "\n" + << "Start Point : "; IGESData_DumpXYLZ(S,level, ent->StartPoint(), ent->Location(),ent->ZPlane()); - S << Message_EndLine; - S << "End Point : "; + S << "\n" + << "End Point : "; IGESData_DumpXYLZ(S,level, ent->EndPoint(), ent->Location(), ent->ZPlane()); - S << Message_EndLine; - if (level <= 4) S<<" -- Computed Definition : ask level > 4" << Message_EndLine; + S << "\n"; + if (level <= 4) S <<" -- Computed Definition : ask level > 4" << std::endl; else { gp_Pnt Cen; gp_Dir Ax; Standard_Real Rmin,Rmax; ent->Definition (Cen,Ax,Rmin,Rmax); - S << " -- Computed Definition (and Transformed if level > 5)" << Message_EndLine; + S << " -- Computed Definition (and Transformed if level > 5)\n"; if (cf != 3) { - S<<" Center : "; IGESData_DumpXYZL(S,level,Cen,ent->Location()); - S<Location()); + S <<"\n"; } S << " Main Axis : "; IGESData_DumpXYZL(S,level,Ax,ent->VectorLocation()); - S<Axis(),ent->VectorLocation()); - S << Message_EndLine; + S <<"\n"; + if (cf == 3) S << " Focal : " << Rmin << "\n"; + else if (Rmin == Rmax) S << " Radius (Major = Minor) : " << Rmin << "\n"; + else S << " Major Radius : " << Rmax << " Minor Radius : " << Rmin <<"\n"; + + S << " Normal Axis : "; IGESData_DumpXYZL(S,level,ent->Axis(),ent->VectorLocation()); + S << std::endl; } } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolConicArc.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolConicArc.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolConicArc.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolConicArc.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ConicArc. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_ConicArc)& entfrom, const Handle(IGESGeom_ConicArc)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_ConicArc)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_ConicArc)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCopiousData.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCopiousData.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCopiousData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCopiousData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -262,7 +262,7 @@ void IGESGeom_ToolCopiousData::OwnDump(const Handle(IGESGeom_CopiousData)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer nbPnts = ent->NbPoints(); @@ -272,21 +272,21 @@ gp_GTrsf locv = ent->VectorLocation(); Standard_Boolean yatr = (level > 5 && ent->HasTransf()); - S << "IGESGeom_CopiousData" << Message_EndLine; + S << "IGESGeom_CopiousData\n"; if (ent->IsPointSet()) S << "Point Set "; else if (ent->IsPolyline()) S << "Polyline "; else if (ent->IsClosedPath2D()) S << "Closed Path 2D "; - S << "DataType " << ent->DataType() << " "; - S << "Number of T-uples = " << nbPnts << " "; + S << "DataType " << ent->DataType() << " " + << "Number of T-uples = " << nbPnts << " "; if (dtype == 1) { - S << "(Points 2D) "; - S << "ZPlane = " << ent->ZPlane() << Message_EndLine; + S << "(Points 2D) " + << "ZPlane = " << ent->ZPlane() << "\n"; } else if (dtype == 2) - S << "(Points 3D)" << Message_EndLine; + S << "(Points 3D)\n"; else if (dtype == 3) - S << "(Points 3D + Vectors 3D)" << Message_EndLine; + S << "(Points 3D + Vectors 3D)\n"; if (level > 4) { for (i = 1; i <= nbPnts; i ++) { @@ -309,9 +309,9 @@ S << " Transformed ("<< T.X() << "," << T.Y() << "," << T.Z() << ")"; } } - S << Message_EndLine; + S << std::endl; } } else S << " [ for content, ask level > 4 ]"; - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCopiousData.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCopiousData.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCopiousData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCopiousData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a CopiousData. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_CopiousData)& entfrom, const Handle(IGESGeom_CopiousData)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_CopiousData)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_CopiousData)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCurveOnSurface.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCurveOnSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCurveOnSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCurveOnSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -265,33 +265,33 @@ void IGESGeom_ToolCurveOnSurface::OwnDump(const Handle(IGESGeom_CurveOnSurface)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESGeom_CurveOnSurface" << Message_EndLine << Message_EndLine; + S << "IGESGeom_CurveOnSurface\n\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; Standard_Integer crem = ent->CreationMode(); S << "Creation Mode : " << crem << " i.e. "; - if (crem == 0) S << " " << Message_EndLine; - else if (crem == 1) S << " Projection of a Curve on a Surface" << Message_EndLine; - else if (crem == 2) S << " Intersection of two Surfaces" << Message_EndLine; - else if (crem == 3) S << " Isoparametric Curve (either U or V)" << Message_EndLine; - else S << " " << Message_EndLine; + if (crem == 0) S << " \n"; + else if (crem == 1) S << " Projection of a Curve on a Surface\n"; + else if (crem == 2) S << " Intersection of two Surfaces\n"; + else if (crem == 3) S << " Isoparametric Curve (either U or V)\n"; + else S << " \n"; S << "The Surface on which the curve lies : "; dumper.Dump(ent->Surface(),S, sublevel); - S << Message_EndLine; - S << "The curve B (in the parametric space (u, v)) : "; + S << "\n" + "The curve B (in the parametric space (u, v)) : "; dumper.Dump(ent->CurveUV(),S, sublevel); - S << Message_EndLine; - S << "The curve C (in the 3D Space) : "; + S << "\n" + "The curve C (in the 3D Space) : "; dumper.Dump(ent->Curve3D(),S, sublevel); - S << Message_EndLine; + S << "\n"; Standard_Integer pref = ent->PreferenceMode(); S << "Preferred representation mode : " << pref << " i.e. "; - if (pref == 0) S << " " << Message_EndLine; - else if (pref == 1) S << " Curve B on Surface" << Message_EndLine; - else if (pref == 2) S << " Curve C in 3D Space" << Message_EndLine; - else if (pref == 3) S << " Curves B & C equally preferred" << Message_EndLine; - else S << " " << Message_EndLine; + if (pref == 0) S << " \n"; + else if (pref == 1) S << " Curve B on Surface\n"; + else if (pref == 2) S << " Curve C in 3D Space\n"; + else if (pref == 3) S << " Curves B & C equally preferred\n"; + else S << " \n"; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCurveOnSurface.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCurveOnSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolCurveOnSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolCurveOnSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a CurveOnSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_CurveOnSurface)& entfrom, const Handle(IGESGeom_CurveOnSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_CurveOnSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_CurveOnSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolDirection.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolDirection.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolDirection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolDirection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,7 +33,6 @@ #include #include #include -#include #include IGESGeom_ToolDirection::IGESGeom_ToolDirection () { } @@ -115,11 +114,10 @@ void IGESGeom_ToolDirection::OwnDump (const Handle(IGESGeom_Direction)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESGeom_Direction" << Message_EndLine << Message_EndLine; - - S << "Value : "; + S << "IGESGeom_Direction\n\n" + << "Value : "; IGESData_DumpXYZL(S,level, ent->Value(), ent->VectorLocation()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolDirection.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolDirection.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolDirection.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolDirection.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Direction. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_Direction)& entfrom, const Handle(IGESGeom_Direction)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_Direction)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_Direction)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolFlash.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolFlash.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolFlash.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolFlash.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -173,14 +173,14 @@ void IGESGeom_ToolFlash::OwnDump (const Handle(IGESGeom_Flash)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; Standard_Integer fn = ent->FormNumber(); - S << "IGESGeom_Flash" << Message_EndLine; + S << "IGESGeom_Flash\n"; switch (fn) { - case 0 : S << " -- Form defined by reference entity --" << Message_EndLine; break; + case 0 : S << " -- Form defined by reference entity --\n"; break; case 1 : S << " -- Circular -- "; break; case 2 : S << " -- Rectangle -- "; break; case 3 : S << " -- Donut -- "; break; @@ -190,10 +190,10 @@ S << "Flash reference point : "; IGESData_DumpXYL(S,level, ent->ReferencePoint(), ent->Location()); - S << " First sizing parameter : " << ent->Dimension1() << " "; - S << " Second sizing parameter : " << ent->Dimension2() << Message_EndLine; - S << " Rotation about reference entity : " << ent->Rotation() << Message_EndLine; - S << "Reference Entity : "; + S << " First sizing parameter : " << ent->Dimension1() << " " + << " Second sizing parameter : " << ent->Dimension2() << "\n" + << " Rotation about reference entity : " << ent->Rotation() << "\n" + << "Reference Entity : "; dumper.Dump(ent->ReferenceEntity(),S, sublevel); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolFlash.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolFlash.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolFlash.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolFlash.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Flash. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_Flash)& entfrom, const Handle(IGESGeom_Flash)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_Flash)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_Flash)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolLine.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolLine.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolLine.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolLine.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -108,20 +108,20 @@ void IGESGeom_ToolLine::OwnDump (const Handle(IGESGeom_Line)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer infin = ent->Infinite(); switch (infin) { - case 1 : S << "Semi-Infinite Line"<StartPoint(), ent->Location()); - S << Message_EndLine; - S << "End Point : "; + S << "\n" + "End Point : "; IGESData_DumpXYZL(S,level, ent->EndPoint(), ent->Location()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolLine.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolLine.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolLine.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolLine.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Line. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_Line)& entfrom, const Handle(IGESGeom_Line)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_Line)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_Line)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetCurve.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetCurve.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -351,27 +351,26 @@ void IGESGeom_ToolOffsetCurve::OwnDump(const Handle(IGESGeom_OffsetCurve)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESGeom_OffsetCurve" << Message_EndLine; - - S << "The curve to be offset : " << Message_EndLine; + S << "IGESGeom_OffsetCurve\n" + << "The curve to be offset :\n"; dumper.Dump(ent->BaseCurve(),S, sublevel); - S << "Offset Distance Flag : " << ent->OffsetType() << Message_EndLine; - S << "Curve entity whose coordinate defines the offset : "; + S << "Offset Distance Flag : " << ent->OffsetType() << "\n" + << "Curve entity whose coordinate defines the offset : "; dumper.Dump(ent->Function(),S, sublevel); - S << Message_EndLine; - S << "In which Coordinate to use : " << ent->FunctionParameter() << Message_EndLine; - S << "Tapered Offset Type Flag : " << ent->TaperedOffsetType() << Message_EndLine; - S << "First Offset Distance : " << ent->FirstOffsetDistance() << " "; - S << "Arc Length : " << ent->ArcLength1() << Message_EndLine; - S << "Second Offset Distance : " << ent->SecondOffsetDistance() << " "; - S << "Arc Length : " << ent->ArcLength2() << Message_EndLine; - S << "Normal Vector : "; - IGESData_DumpXYZL(S,level, ent->NormalVector(), ent->VectorLocation()); S<StartParameter() << " "; - S << "Ending : " << ent->EndParameter() << Message_EndLine; + S << "\n" + << "In which Coordinate to use : " << ent->FunctionParameter() << "\n" + << "Tapered Offset Type Flag : " << ent->TaperedOffsetType() << "\n" + << "First Offset Distance : " << ent->FirstOffsetDistance() << " " + << "Arc Length : " << ent->ArcLength1() << "\n" + << "Second Offset Distance : " << ent->SecondOffsetDistance() << " " + << "Arc Length : " << ent->ArcLength2() << "\n" + << "Normal Vector : "; + IGESData_DumpXYZL(S,level, ent->NormalVector(), ent->VectorLocation()); S <<"\n"; + S << "Offset curve Parameters. Starting : " << ent->StartParameter() << " " + << "Ending : " << ent->EndParameter() << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetCurve.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetCurve.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a OffsetCurve. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_OffsetCurve)& entfrom, const Handle(IGESGeom_OffsetCurve)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_OffsetCurve)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_OffsetCurve)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetSurface.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -147,17 +147,16 @@ void IGESGeom_ToolOffsetSurface::OwnDump (const Handle(IGESGeom_OffsetSurface)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESGeom_OffsetSurface" << Message_EndLine; - - S << "Offset Indicator : "; + S << "IGESGeom_OffsetSurface\n" + << "Offset Indicator : "; IGESData_DumpXYZL(S,level, ent->OffsetIndicator(), ent->VectorLocation()); - S << Message_EndLine; - S << "Offset Distance : " << ent->Distance() << " "; - S << "Surface to be offset : "; + S << "\n" + << "Offset Distance : " << ent->Distance() << " " + << "Surface to be offset : "; dumper.Dump(ent->Surface(),S, sublevel); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetSurface.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolOffsetSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a OffsetSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_OffsetSurface)& entfrom, const Handle(IGESGeom_OffsetSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_OffsetSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_OffsetSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolPlane.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolPlane.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolPlane.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolPlane.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -266,21 +266,21 @@ void IGESGeom_ToolPlane::OwnDump(const Handle(IGESGeom_Plane)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESGeom_Plane" << Message_EndLine; + S << "IGESGeom_Plane\n"; Standard_Real A,B,C,D; ent->Equation(A,B,C,D); - S << "Plane Coefficient A : " << A << Message_EndLine; - S << "Plane Coefficient B : " << B << Message_EndLine; - S << "Plane Coefficient C : " << C << Message_EndLine; - S << "Plane Coefficient D : " << D << Message_EndLine; - S << "The Bounding Curve : " ; + S << "Plane Coefficient A : " << A << "\n" + << "Plane Coefficient B : " << B << "\n" + << "Plane Coefficient C : " << C << "\n" + << "Plane Coefficient D : " << D << "\n" + << "The Bounding Curve : " ; dumper.Dump(ent->BoundingCurve(),S, (level <= 4) ? 0 : 1); - S << Message_EndLine; - S << "Display Symbol Location : "; + S << "\n" + << "Display Symbol Location : "; IGESData_DumpXYZL(S,level, ent->SymbolAttach(), ent->Location()); - S << " Size : " << ent->SymbolSize() << Message_EndLine; + S << " Size : " << ent->SymbolSize() << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolPlane.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolPlane.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolPlane.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolPlane.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Plane. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_Plane)& entfrom, const Handle(IGESGeom_Plane)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_Plane)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_Plane)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolPoint.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolPoint.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolPoint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolPoint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -142,14 +142,13 @@ void IGESGeom_ToolPoint::OwnDump (const Handle(IGESGeom_Point)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESGeom_Point" << Message_EndLine; - - S << " Value : "; + S << "IGESGeom_Point\n" + << " Value : "; IGESData_DumpXYZL(S,level, ent->Value(), ent->Location()); - S << Message_EndLine; - S << " Display Symbol : "; + S << "\n" + << " Display Symbol : "; dumper.Dump(ent->DisplaySymbol(),S, (level <= 4) ? 0 : 1); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolPoint.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolPoint.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolPoint.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolPoint.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Point. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_Point)& entfrom, const Handle(IGESGeom_Point)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_Point)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_Point)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolRuledSurface.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolRuledSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolRuledSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolRuledSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -153,21 +153,20 @@ void IGESGeom_ToolRuledSurface::OwnDump (const Handle(IGESGeom_RuledSurface)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer tempSubLevel = (level <= 4) ? 0 : 1; - S << "IGESGeom_RuledSurface" << Message_EndLine; - - S << "First Curve : "; + S << "IGESGeom_RuledSurface\n" + << "First Curve : "; dumper.Dump(ent->FirstCurve(),S, tempSubLevel); - S << Message_EndLine; - S << "Second Curve : "; + S << "\n" + << "Second Curve : "; dumper.Dump(ent->SecondCurve(),S, tempSubLevel); - S << Message_EndLine; - S << "Direction Flag : " << ent->DirectionFlag() << " i.e."; - if (ent->DirectionFlag() == 0) S<< "Join First to First, Last to Last"<IsDevelopable()) S << " .. Is Developable" << Message_EndLine; - else S << " .. Is possibly not developable .." << Message_EndLine; + S << "\n" + << "Direction Flag : " << ent->DirectionFlag() << " i.e."; + if (ent->DirectionFlag() == 0) S << "Join First to First, Last to Last\n"; + else S << "Join First to Last, Last to First\n"; + if (ent->IsDevelopable()) S << " .. Is Developable\n"; + else S << " .. Is possibly not developable ..\n"; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolRuledSurface.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolRuledSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolRuledSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolRuledSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a RuledSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_RuledSurface)& entfrom, const Handle(IGESGeom_RuledSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_RuledSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_RuledSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolSplineCurve.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolSplineCurve.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolSplineCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolSplineCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -50,7 +49,7 @@ //Standard_Boolean st; //szv#4:S4163:12Mar99 not needed Standard_Integer nbSegments; - Standard_Integer aType, aDegree, nbDimensions;; + Standard_Integer aType, aDegree, nbDimensions; Handle(TColStd_HArray1OfReal) allBreakPoints; Handle(TColStd_HArray2OfReal) allXPolynomials; Handle(TColStd_HArray2OfReal) allYPolynomials; @@ -320,9 +319,9 @@ void IGESGeom_ToolSplineCurve::OwnDump (const Handle(IGESGeom_SplineCurve)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESGeom_SplineCurve" << Message_EndLine; + S << "IGESGeom_SplineCurve\n"; Standard_Integer nbSegments = ent->NbSegments(); S << "Spline Type : " << ent->SplineType() << " "; @@ -336,17 +335,17 @@ case 6 : S << "(B-Spline)"; break; default : S << "(Invalid value)"; break; } - S << Message_EndLine; - S << "Degree Of Continuity : " << ent->Degree() << Message_EndLine; - S << "Number Of Dimensions : " << ent->NbDimensions() << Message_EndLine; - S << "Number Of Segments : " << ent->NbSegments() << Message_EndLine; - S << "Segment Break Points : "; - IGESData_DumpVals(S ,level,1, nbSegments+1,ent->BreakPoint); + S << "\n" + << "Degree Of Continuity : " << ent->Degree() << "\n" + << "Number Of Dimensions : " << ent->NbDimensions() << "\n" + << "Number Of Segments : " << ent->NbSegments() << "\n" + << "Segment Break Points : "; + IGESData_DumpVals(S,level,1, nbSegments+1,ent->BreakPoint); if (level <= 4) { - S << " [ also ask level > 4 for X-Y-Z Polynomials ]" << Message_EndLine; + S << " [ also ask level > 4 for X-Y-Z Polynomials ]" << std::endl; return; } - S << " -- Polynomial Values --" << Message_EndLine; + S << " -- Polynomial Values --\n"; Standard_Real AX,BX,CX,DX, AY,BY,CY,DY, AZ,BZ,CZ,DZ; for (Standard_Integer I = 1; I <= nbSegments; I++) { //no need to declare (hides the same name in an outer scope) @@ -354,18 +353,18 @@ ent->XCoordPolynomial(I,AX,BX,CX,DX); ent->YCoordPolynomial(I,AY,BY,CY,DY); ent->ZCoordPolynomial(I,AZ,BZ,CZ,DZ); - S << "Segment "<XValues(AX,BX,CX,DX); ent->YValues(AY,BY,CY,DY); ent->ZValues(AZ,BZ,CZ,DZ); - S << "Terminate Point : X Y Z"<NbUSegments(); @@ -330,39 +330,38 @@ case 6 : S << " (B-Spline)"; break; default : S << " (Invalid value)"; break; } - S << Message_EndLine; - S << "The Patch Type : " << ent->PatchType(); + S << "\n" + << "The Patch Type : " << ent->PatchType(); if (ent->PatchType() == 1) S << " (Cartesian Product)"; else S << " (Unspecified)"; - S << Message_EndLine; - S << "Number Of Segments. In U : " - << nbUSegs << " In V : " << nbVSegs << Message_EndLine; - S << "The U Break Points : "; - IGESData_DumpVals(S ,level,1, nbUSegs+1,ent->UBreakPoint); - S <VBreakPoint); + S << "\n" + << "Number Of Segments. In U : " + << nbUSegs << " In V : " << nbVSegs << "\n" + << "The U Break Points : "; + IGESData_DumpVals(S,level,1, nbUSegs+1,ent->UBreakPoint); + S << "\nThe V Break Points : "; + IGESData_DumpVals(S,level,1, nbVSegs+1,ent->VBreakPoint); - S < 4) { for (I = 1; I <= nbUSegs; I++) for (J = 1; J <= nbVSegs; J++) { - S << "[" << I <<"," << J << "]: " << Message_EndLine; - S << "X Polynomial : "; + S << "[" << I <<"," << J << "]:\n" + << "X Polynomial : "; temp = ent->XPolynomial(I,J); IGESData_DumpVals(S,level,1, temp->Length(),temp->Value); - S << Message_EndLine; - S << "Y Polynomial : "; + S << "\n" + << "Y Polynomial : "; temp = ent->YPolynomial(I,J); IGESData_DumpVals(S,level,1, temp->Length(),temp->Value); - S << Message_EndLine; - S << "Z Polynomial : "; + S << "\n" + << "Z Polynomial : "; temp = ent->ZPolynomial(I,J); IGESData_DumpVals(S,level,1, temp->Length(),temp->Value); - S << Message_EndLine; + S << "\n"; } } - else S << Message_EndLine; + else S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolSplineSurface.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolSplineSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolSplineSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolSplineSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SplineSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_SplineSurface)& entfrom, const Handle(IGESGeom_SplineSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_SplineSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_SplineSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolSurfaceOfRevolution.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolSurfaceOfRevolution.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolSurfaceOfRevolution.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolSurfaceOfRevolution.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -164,18 +163,17 @@ void IGESGeom_ToolSurfaceOfRevolution::OwnDump (const Handle(IGESGeom_SurfaceOfRevolution)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - - S << "IGESGeom_SurfaceOfRevolution" << Message_EndLine << Message_EndLine; + S << "IGESGeom_SurfaceOfRevolution\n\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "Axis Of Revolution : "; dumper.Dump(ent->AxisOfRevolution(),S, sublevel); - S << Message_EndLine; - S << "Generatrix : "; + S << "\n" + << "Generatrix : "; dumper.Dump(ent->Generatrix(),S, sublevel); - S << Message_EndLine; - S << "Start Angle : " << ent->StartAngle() << " "; - S << "End Angle : " << ent->EndAngle() << Message_EndLine; + S << "\n" + << "Start Angle : " << ent->StartAngle() << " " + << "End Angle : " << ent->EndAngle() << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolSurfaceOfRevolution.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolSurfaceOfRevolution.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolSurfaceOfRevolution.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolSurfaceOfRevolution.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SurfaceOfRevolution. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_SurfaceOfRevolution)& entfrom, const Handle(IGESGeom_SurfaceOfRevolution)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_SurfaceOfRevolution)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_SurfaceOfRevolution)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTabulatedCylinder.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTabulatedCylinder.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTabulatedCylinder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTabulatedCylinder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,6 @@ #include #include #include -#include #include #include @@ -133,16 +132,15 @@ void IGESGeom_ToolTabulatedCylinder::OwnDump (const Handle(IGESGeom_TabulatedCylinder)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESGeom_TabulatedCylinder" << Message_EndLine; - - S << "Directrix : "; + S << "IGESGeom_TabulatedCylinder\n" + << "Directrix : "; dumper.Dump(ent->Directrix(),S, sublevel); - S << Message_EndLine; - S << "Terminate Point : "; + S << "\n" + << "Terminate Point : "; IGESData_DumpXYZL(S,level, ent->EndPoint(), ent->Location()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTabulatedCylinder.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTabulatedCylinder.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTabulatedCylinder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTabulatedCylinder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a TabulatedCylinder. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_TabulatedCylinder)& entfrom, const Handle(IGESGeom_TabulatedCylinder)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_TabulatedCylinder)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_TabulatedCylinder)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTransformationMatrix.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTransformationMatrix.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTransformationMatrix.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTransformationMatrix.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -212,28 +211,25 @@ void IGESGeom_ToolTransformationMatrix::OwnDump (const Handle(IGESGeom_TransformationMatrix)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESGeom_TransformationMatrix" << Message_EndLine; - - S << "| R11, R12, R13, T1 | " + S << "IGESGeom_TransformationMatrix\n" + << "| R11, R12, R13, T1 | " << ent->Data(1, 1) << ", " << ent->Data(1, 2) << ", " - << ent->Data(1, 3) << ", " << ent->Data(1, 4) << Message_EndLine; - - S << "| R21, R22, R23, T2 | " + << ent->Data(1, 3) << ", " << ent->Data(1, 4) << "\n" + << "| R21, R22, R23, T2 | " << ent->Data(2, 1) << ", " << ent->Data(2, 2) << ", " - << ent->Data(2, 3) << ", " << ent->Data(2, 4) << Message_EndLine; - - S << "| R31, R32, R33, T3 | " + << ent->Data(2, 3) << ", " << ent->Data(2, 4) << "\n" + << "| R31, R32, R33, T3 | " << ent->Data(3, 1) << ", " << ent->Data(3, 2) << ", " - << ent->Data(3, 3) << ", " << ent->Data(3, 4) << Message_EndLine; + << ent->Data(3, 3) << ", " << ent->Data(3, 4) << "\n"; switch (ent->FormNumber()) { - case 0 : S << "-- Direct Orthogonal Matrix" << Message_EndLine; break; - case 1 : S << "-- Reverse Orthogonal Matrix" << Message_EndLine; break; - case 10 : S << "-- Cartesien Coordinate System" << Message_EndLine; break; - case 11 : S << "-- Cylindrical Coordinate System" << Message_EndLine; break; - case 12 : S << "-- Spherical Coordinate System" << Message_EndLine; break; - default : S << "-- (Incorrect Form Number)" << Message_EndLine; break; + case 0 : S << "-- Direct Orthogonal Matrix" << std::endl; break; + case 1 : S << "-- Reverse Orthogonal Matrix" << std::endl; break; + case 10 : S << "-- Cartesien Coordinate System" << std::endl; break; + case 11 : S << "-- Cylindrical Coordinate System" << std::endl; break; + case 12 : S << "-- Spherical Coordinate System" << std::endl; break; + default : S << "-- (Incorrect Form Number)" << std::endl; break; } } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTransformationMatrix.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTransformationMatrix.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTransformationMatrix.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTransformationMatrix.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a TransformationMatrix. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_TransformationMatrix)& entfrom, const Handle(IGESGeom_TransformationMatrix)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_TransformationMatrix)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_TransformationMatrix)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTrimmedSurface.cxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTrimmedSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTrimmedSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTrimmedSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,6 @@ #include #include #include -#include #include #include @@ -299,21 +298,20 @@ void IGESGeom_ToolTrimmedSurface::OwnDump(const Handle(IGESGeom_TrimmedSurface)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer tempSubLevel = (level <= 4) ? 0 : 1; - S << "IGESGeom_TrimmedSurface" << Message_EndLine; - - S << "Surface to be trimmed : "; + S << "IGESGeom_TrimmedSurface\n" + << "Surface to be trimmed : "; dumper.Dump(ent->Surface(),S, tempSubLevel); - S << Message_EndLine; - S << "Boundary type : " << ent->OuterBoundaryType() << Message_EndLine; - S << "Outer Boundary : "; + S << "\n" + << "Boundary type : " << ent->OuterBoundaryType() << "\n" + << "Outer Boundary : "; dumper.Dump(ent->OuterContour(),S, tempSubLevel); - S << Message_EndLine; - S << "Inner Boundaries : "; + S << "\n" + << "Inner Boundaries : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbInnerContours(),ent->InnerContour); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTrimmedSurface.hxx opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTrimmedSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESGeom/IGESGeom_ToolTrimmedSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGeom/IGESGeom_ToolTrimmedSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a TrimmedSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGeom_TrimmedSurface)& entfrom, const Handle(IGESGeom_TrimmedSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGeom_TrimmedSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGeom_TrimmedSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_Protocol.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_Protocol.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_Protocol.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_Protocol.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -67,7 +67,7 @@ Handle(Interface_Protocol) IGESGraph_Protocol::Resource (const Standard_Integer /*num*/) const { - Handle(Interface_Protocol) res = IGESBasic::Protocol();; + Handle(Interface_Protocol) res = IGESBasic::Protocol(); return res; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_SpecificModule.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_SpecificModule.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_SpecificModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_SpecificModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,7 +57,7 @@ void IGESGraph_SpecificModule::OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, - const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, + const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const { switch (CN) { diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_SpecificModule.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_SpecificModule.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_SpecificModule.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_SpecificModule.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,8 +25,6 @@ #include class IGESData_IGESEntity; class IGESData_IGESDumper; -class Message_Messenger; - class IGESGraph_SpecificModule; DEFINE_STANDARD_HANDLE(IGESGraph_SpecificModule, IGESData_SpecificModule) @@ -43,7 +41,7 @@ Standard_EXPORT IGESGraph_SpecificModule(); //! Specific Dump (own parameters) for IGESGraph - Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const Standard_OVERRIDE; + Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const Standard_OVERRIDE; //! Performs non-ambiguous Corrections on Entities which support //! them (DrawingSize,DrawingUnits,HighLight,IntercharacterSpacing, diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolColor.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolColor.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolColor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolColor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -118,16 +118,16 @@ void IGESGraph_ToolColor::OwnDump (const Handle(IGESGraph_Color)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESGraph_Color" << Message_EndLine; + S << "IGESGraph_Color\n"; Standard_Real Red,Green,Blue; ent->RGBIntensity(Red,Green,Blue); - S << "Red (in % Of Full Intensity) : " << Red << Message_EndLine; - S << "Green (in % Of Full Intensity) : " << Green << Message_EndLine; - S << "Blue (in % Of Full Intensity) : " << Blue << Message_EndLine; - S << "Color Name : "; + S << "Red (in % Of Full Intensity) : " << Red << "\n" + << "Green (in % Of Full Intensity) : " << Green << "\n" + << "Blue (in % Of Full Intensity) : " << Blue << "\n" + << "Color Name : "; IGESData_DumpString(S,ent->ColorName()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolColor.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolColor.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolColor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolColor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Color. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_Color)& entfrom, const Handle(IGESGraph_Color)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_Color)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_Color)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDefinitionLevel.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDefinitionLevel.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDefinitionLevel.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDefinitionLevel.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -112,12 +112,11 @@ void IGESGraph_ToolDefinitionLevel::OwnDump (const Handle(IGESGraph_DefinitionLevel)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESGraph_DefinitionLevel" << Message_EndLine; - - S << "Level Numbers : "; - IGESData_DumpVals(S ,level,1, ent->NbPropertyValues(),ent->LevelNumber); - S << Message_EndLine; + S << "IGESGraph_DefinitionLevel\n" + << "Level Numbers : "; + IGESData_DumpVals(S,level,1, ent->NbPropertyValues(),ent->LevelNumber); + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDefinitionLevel.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDefinitionLevel.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDefinitionLevel.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDefinitionLevel.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a DefinitionLevel. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_DefinitionLevel)& entfrom, const Handle(IGESGraph_DefinitionLevel)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_DefinitionLevel)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_DefinitionLevel)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingSize.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingSize.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingSize.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingSize.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -111,12 +111,11 @@ void IGESGraph_ToolDrawingSize::OwnDump (const Handle(IGESGraph_DrawingSize)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESGraph_DrawingSize" << Message_EndLine; - - S << "No. of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Drawing extent along positive X-axis : " << ent->XSize() << Message_EndLine; - S << "Drawing extent along positive Y-axis : " << ent->YSize() << Message_EndLine; - S << Message_EndLine; + S << "IGESGraph_DrawingSize\n" + << "No. of property values : " << ent->NbPropertyValues() << "\n" + << "Drawing extent along positive X-axis : " << ent->XSize() << "\n" + << "Drawing extent along positive Y-axis : " << ent->YSize() << "\n" + << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingSize.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingSize.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingSize.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingSize.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a DrawingSize. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_DrawingSize)& entfrom, const Handle(IGESGraph_DrawingSize)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_DrawingSize)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_DrawingSize)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingUnits.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingUnits.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingUnits.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingUnits.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -221,14 +221,13 @@ void IGESGraph_ToolDrawingUnits::OwnDump (const Handle(IGESGraph_DrawingUnits)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESGraph_DrawingUnits" << Message_EndLine; - - S << "No. of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << " Units Flag : " << ent->Flag(); - S << " Units Name : "; + S << "IGESGraph_DrawingUnits\n" + << "No. of property values : " << ent->NbPropertyValues() << "\n" + << " Units Flag : " << ent->Flag() + << " Units Name : "; IGESData_DumpString(S,ent->Unit()); - S << " computed Value (in meters) : " << ent->UnitValue(); - S << Message_EndLine; + S << " computed Value (in meters) : " << ent->UnitValue() + << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingUnits.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingUnits.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingUnits.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolDrawingUnits.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a DrawingUnits. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_DrawingUnits)& entfrom, const Handle(IGESGraph_DrawingUnits)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_DrawingUnits)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_DrawingUnits)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolHighLight.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolHighLight.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolHighLight.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolHighLight.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -107,11 +107,10 @@ void IGESGraph_ToolHighLight::OwnDump (const Handle(IGESGraph_HighLight)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESGraph_HighLight" << Message_EndLine; - - S << "No. of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Highlight Status : " << ent->HighLightStatus() << Message_EndLine; - S << Message_EndLine; + S << "IGESGraph_HighLight\n" + << "No. of property values : " << ent->NbPropertyValues() << "\n" + << "Highlight Status : " << ent->HighLightStatus() << "\n" + << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolHighLight.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolHighLight.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolHighLight.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolHighLight.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a HighLight. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_HighLight)& entfrom, const Handle(IGESGraph_HighLight)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_HighLight)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_HighLight)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolIntercharacterSpacing.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolIntercharacterSpacing.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolIntercharacterSpacing.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolIntercharacterSpacing.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -109,11 +109,10 @@ void IGESGraph_ToolIntercharacterSpacing::OwnDump (const Handle(IGESGraph_IntercharacterSpacing)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESGraph_IntercharacterSpacing" << Message_EndLine; - - S << "No. of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Intercharacter space in % of text height : " << ent->ISpace() << Message_EndLine; - S << Message_EndLine; + S << "IGESGraph_IntercharacterSpacing\n" + << "No. of property values : " << ent->NbPropertyValues() << "\n" + << "Intercharacter space in % of text height : " << ent->ISpace() << "\n" + << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolIntercharacterSpacing.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolIntercharacterSpacing.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolIntercharacterSpacing.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolIntercharacterSpacing.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a IntercharacterSpacing. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_IntercharacterSpacing)& entfrom, const Handle(IGESGraph_IntercharacterSpacing)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_IntercharacterSpacing)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_IntercharacterSpacing)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefPattern.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefPattern.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefPattern.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefPattern.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -130,21 +129,20 @@ void IGESGraph_ToolLineFontDefPattern::OwnDump (const Handle(IGESGraph_LineFontDefPattern)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESGraph_LineFontDefPattern" << Message_EndLine; - - S << "Visible-Blank Segments : "; + S << "IGESGraph_LineFontDefPattern\n" + << "Visible-Blank Segments : "; Standard_Integer nb = ent->NbSegments(); - IGESData_DumpVals(S ,level,1, nb,ent->Length); - S <Length); + S << "\nDisplay Pattern : "; IGESData_DumpString(S,ent->DisplayPattern()); - S << Message_EndLine; + S << "\n"; if (level > 4) { - S << " -> Which Segments are Visible (the others are Blank) : " << Message_EndLine; + S << " -> Which Segments are Visible (the others are Blank) :\n"; for (Standard_Integer I = 1; I <= nb; I ++) { if (ent->IsVisible(I)) S << " " << I; } - S << Message_EndLine; + S << std::endl; } } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefPattern.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefPattern.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefPattern.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefPattern.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a LineFontDefPattern. Called by various //! Modules (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_LineFontDefPattern)& entfrom, const Handle(IGESGraph_LineFontDefPattern)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_LineFontDefPattern)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_LineFontDefPattern)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefTemplate.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefTemplate.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefTemplate.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefTemplate.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -117,18 +117,17 @@ void IGESGraph_ToolLineFontDefTemplate::OwnDump (const Handle(IGESGraph_LineFontDefTemplate)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer tempSubLevel = (level <= 4) ? 0 : 1; - S << "IGESGraph_LineFontDefTemplate" << Message_EndLine; - - S << "Orientation : " << ent->Orientation() << Message_EndLine; - S << "Subfigure Display Entity For Template Display : "; + S << "IGESGraph_LineFontDefTemplate\n" + << "Orientation : " << ent->Orientation() << "\n" + << "Subfigure Display Entity For Template Display : "; dumper.Dump(ent->TemplateEntity(),S, tempSubLevel); - S << Message_EndLine; - S << "Length Between Successive Template Figure : " << ent->Distance()<Scale() << Message_EndLine; - S << Message_EndLine; + S << "\n" + << "Length Between Successive Template Figure : " << ent->Distance()<< "\n" + << "Scale Factor for Subfigure : " << ent->Scale() << "\n" + << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefTemplate.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefTemplate.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefTemplate.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontDefTemplate.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a LineFontDefTemplate. Called by various //! Modules (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_LineFontDefTemplate)& entfrom, const Handle(IGESGraph_LineFontDefTemplate)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_LineFontDefTemplate)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_LineFontDefTemplate)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontPredefined.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontPredefined.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontPredefined.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontPredefined.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -106,11 +106,10 @@ void IGESGraph_ToolLineFontPredefined::OwnDump (const Handle(IGESGraph_LineFontPredefined)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESGraph_LineFontPredefined" << Message_EndLine; - - S << "No. of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Line font pattern code : " << ent->LineFontPatternCode() << Message_EndLine; - S << Message_EndLine; + S << "IGESGraph_LineFontPredefined\n" + << "No. of property values : " << ent->NbPropertyValues() << "\n" + << "Line font pattern code : " << ent->LineFontPatternCode() << "\n" + << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontPredefined.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontPredefined.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontPredefined.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolLineFontPredefined.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a LineFontPredefined. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_LineFontPredefined)& entfrom, const Handle(IGESGraph_LineFontPredefined)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_LineFontPredefined)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_LineFontPredefined)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolNominalSize.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolNominalSize.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolNominalSize.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolNominalSize.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -144,16 +144,15 @@ void IGESGraph_ToolNominalSize::OwnDump (const Handle(IGESGraph_NominalSize)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESGraph_NominalSize" << Message_EndLine; - - S << "No. of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Nominal size value : " << ent->NominalSizeValue() << Message_EndLine; - S << "Nominal size name : "; + S << "IGESGraph_NominalSize\n" + << "No. of property values : " << ent->NbPropertyValues() << "\n" + << "Nominal size value : " << ent->NominalSizeValue() << "\n" + << "Nominal size name : "; IGESData_DumpString(S,ent->NominalSizeName()); - S << Message_EndLine; - S << "Name of relevant engineering standard : "; + S << "\n" + << "Name of relevant engineering standard : "; IGESData_DumpString(S,ent->StandardName()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolNominalSize.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolNominalSize.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolNominalSize.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolNominalSize.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a NominalSize. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_NominalSize)& entfrom, const Handle(IGESGraph_NominalSize)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_NominalSize)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_NominalSize)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolPick.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolPick.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolPick.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolPick.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -109,12 +109,11 @@ void IGESGraph_ToolPick::OwnDump (const Handle(IGESGraph_Pick)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESGraph_Pick" << Message_EndLine; - - S << "No. of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Pick flag : " << ent->PickFlag(); - S << (ent->PickFlag() == 0 ? " NO" : " YES" ); - S << Message_EndLine; + S << "IGESGraph_Pick\n" + << "No. of property values : " << ent->NbPropertyValues() << "\n" + << "Pick flag : " << ent->PickFlag() + << (ent->PickFlag() == 0 ? " NO" : " YES" ) + << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolPick.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolPick.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolPick.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolPick.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Pick. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_Pick)& entfrom, const Handle(IGESGraph_Pick)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_Pick)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_Pick)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextDisplayTemplate.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextDisplayTemplate.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextDisplayTemplate.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextDisplayTemplate.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -182,14 +182,13 @@ void IGESGraph_ToolTextDisplayTemplate::OwnDump (const Handle(IGESGraph_TextDisplayTemplate)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESGraph_TextDisplayTemplate" << Message_EndLine; - - S << "Character box width : " << ent->BoxWidth() << " "; - S << "Character box height : " << ent->BoxHeight() << Message_EndLine; + S << "IGESGraph_TextDisplayTemplate\n" + << "Character box width : " << ent->BoxWidth() << " " + << "Character box height : " << ent->BoxHeight() << "\n"; if ( ent->IsFontEntity() ) { S << "Font Entity : "; @@ -197,15 +196,16 @@ } else S << "Font code : " << ent->FontCode(); - S << Message_EndLine; - S << "Slant angle : " << ent->SlantAngle() << " "; - S << "Rotation angle : " << ent->RotationAngle() << Message_EndLine; - S << "Mirror flag : " << ent->MirrorFlag() << " "; - S << "Rotate flag : " << ent->RotateFlag() << Message_EndLine; + + S << "\n" + << "Slant angle : " << ent->SlantAngle() << " " + << "Rotation angle : " << ent->RotationAngle() << "\n" + << "Mirror flag : " << ent->MirrorFlag() << " " + << "Rotate flag : " << ent->RotateFlag() << "\n"; if ( ent->FormNumber() == 0 ) S << "Lower Left Corner coordinates : "; else S << "Increments from coordinates : "; IGESData_DumpXYZL(S,level, ent->StartingCorner(), ent->Location()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextDisplayTemplate.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextDisplayTemplate.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextDisplayTemplate.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextDisplayTemplate.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a TextDisplayTemplate. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_TextDisplayTemplate)& entfrom, const Handle(IGESGraph_TextDisplayTemplate)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_TextDisplayTemplate)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_TextDisplayTemplate)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextFontDef.cxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextFontDef.cxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextFontDef.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolTextFontDef.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -288,32 +288,31 @@ void IGESGraph_ToolTextFontDef::OwnDump (const Handle(IGESGraph_TextFontDef)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer sublevel = (level <= 4) ? 0 : 1; Standard_Integer nbchars = ent->NbCharacters(); - S << "IGESGraph_TextFontDef" << Message_EndLine; - - S << "Font Code : " << ent->FontCode() << Message_EndLine; - S << "Font Name : "; + S << "IGESGraph_TextFontDef\n" + << "Font Code : " << ent->FontCode() << "\n" + << "Font Name : "; IGESData_DumpString(S,ent->FontName()); - S << Message_EndLine; + S << "\n"; if ( ent->IsSupersededFontEntity() ) { S << "Text Definition Entity : "; dumper.Dump(ent->SupersededFontEntity(),S, sublevel); } else S << "Superseding Font Number : " << ent->SupersededFontCode(); - S << Message_EndLine; - S << "No. of Grid Units eqvt to 1 Text Height : " << ent->Scale() << Message_EndLine; - S << "ASCII Codes : " << Message_EndLine - << "Grid Locations of next character origins : " << Message_EndLine - << "Pen Motions : " << Message_EndLine - << "Pen Positions : " << Message_EndLine - << "Grid Locations the pen moves to : "; - S << "Count = " << nbchars << Message_EndLine; + S << "\n" + << "No. of Grid Units eqvt to 1 Text Height : " << ent->Scale() << "\n" + << "ASCII Codes :\n" + << "Grid Locations of next character origins :\n" + << "Pen Motions :\n" + << "Pen Positions :\n" + << "Grid Locations the pen moves to : " + << "Count = " << nbchars << "\n"; IGESData_DumpVals(S,-level,1,nbchars,ent->ASCIICode); - S << Message_EndLine; + S << "\n"; if (level > 4 ) { Handle(TColgp_HArray1OfXY) arrXY; @@ -321,26 +320,25 @@ for (I = 1; I <= nbchars; I++) { Standard_Integer IX,IY; - S << "[" << I << "]: "; - S << "ASCII Code : " << ent->ASCIICode(I) << Message_EndLine; - S << "Grid Location of next character's origin : "; + S << "[" << I << "]: " + << "ASCII Code : " << ent->ASCIICode(I) << "\n" + << "Grid Location of next character's origin : "; ent->NextCharOrigin(I,IX,IY); S << "X=" << IX << " Y=" << IY; nbmotions = ent->NbPenMotions(I); S << " No. of Pen Motions : " << nbmotions; - if (level <= 5) S << " [ ask level > 5 for Details ]" << Message_EndLine; + if (level <= 5) S << " [ ask level > 5 for Details ]\n"; else { - S << Message_EndLine; + S << "\n"; for (J = 1; J <= nbmotions; J++) { - S << "Pen up(1) / down(0) flag : " << (Standard_Integer)ent->IsPenUp(I,J); - S << " Next Pen Position : "; + S << "Pen up(1) / down(0) flag : " << (Standard_Integer)ent->IsPenUp(I,J) + << " Next Pen Position : "; ent->NextPenPosition(I,J, IX,IY); - S << " X="< #include #include -#include #include IGESGraph_ToolUniformRectGrid::IGESGraph_ToolUniformRectGrid () { } @@ -159,19 +158,18 @@ void IGESGraph_ToolUniformRectGrid::OwnDump (const Handle(IGESGraph_UniformRectGrid)& ent, const IGESData_IGESDumper& /*dumper*/, - const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const + Standard_OStream& S, const Standard_Integer /*level*/) const { - S << "IGESGraph_UniformRectGrid" << Message_EndLine; - - S << "No. of property values : " << ent->NbPropertyValues() << Message_EndLine; - S << "Grid : " << ( ent->IsFinite() ? "Finite" : "Infinite"); - S << " - Composed of " << ( ent->IsLine() ? "Lines" : "Points"); - S << " - " << ( ent->IsWeighted() ? "Weighted" : "Unweighted") << Message_EndLine; - S << "Grid Point : "; + S << "IGESGraph_UniformRectGrid\n" + << "No. of property values : " << ent->NbPropertyValues() << "\n" + << "Grid : " << ( ent->IsFinite() ? "Finite" : "Infinite") + << " - Composed of " << ( ent->IsLine() ? "Lines" : "Points") + << " - " << ( ent->IsWeighted() ? "Weighted" : "Unweighted") << "\n" + << "Grid Point : "; IGESData_DumpXY(S, ent->GridPoint()); S << " Grid Spacing : "; - IGESData_DumpXY(S, ent->GridSpacing()); S << Message_EndLine; + IGESData_DumpXY(S, ent->GridSpacing()); S << "\n"; if (ent->IsFinite()) S << "No. of points/lines in direction : X : " << ent->NbPointsX() - << " - Y : " << ent->NbPointsY() << Message_EndLine; + << " - Y : " << ent->NbPointsY() << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolUniformRectGrid.hxx opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolUniformRectGrid.hxx --- opencascade-7.4.1+dfsg1/src/IGESGraph/IGESGraph_ToolUniformRectGrid.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESGraph/IGESGraph_ToolUniformRectGrid.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,8 +34,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a UniformRectGrid. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -74,7 +72,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESGraph_UniformRectGrid)& entfrom, const Handle(IGESGraph_UniformRectGrid)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESGraph_UniformRectGrid)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESGraph_UniformRectGrid)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSelect/IGESSelect_Activator.cxx opencascade-7.5.1+dfsg1/src/IGESSelect/IGESSelect_Activator.cxx --- opencascade-7.4.1+dfsg1/src/IGESSelect/IGESSelect_Activator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSelect/IGESSelect_Activator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -176,14 +176,14 @@ std::cout<NbEntities(i)<<" ent.s:"<Entities(i); - WS->ListEntities (iter,0); + WS->ListEntities (iter, 0, std::cout); } std::cout <<" -- Remaining Entities (not yet sorted) :" <NbDuplicated(0,Standard_False)<Duplicated(0,Standard_False); - WS->ListEntities(iter,0); + WS->ListEntities (iter, 0, std::cout); return IFSelect_RetVoid; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSelect/IGESSelect_CounterOfLevelNumber.cxx opencascade-7.5.1+dfsg1/src/IGESSelect/IGESSelect_CounterOfLevelNumber.cxx --- opencascade-7.4.1+dfsg1/src/IGESSelect/IGESSelect_CounterOfLevelNumber.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSelect/IGESSelect_CounterOfLevelNumber.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,9 +17,6 @@ #include #include #include -#include -#include -#include #include #include @@ -133,10 +130,10 @@ void IGESSelect_CounterOfLevelNumber::PrintCount - (const Handle(Message_Messenger)& S) const + (Standard_OStream& S) const { - IFSelect_SignatureList::PrintCount(S); - S<<" Highest value : " << thehigh << Message_EndLine; - if (thenblists > 0) S<<"REMARK for LEVEL LIST : Entities are counted in" - <<" \n, and in each Level value of their list"< 0) S <<"REMARK for LEVEL LIST : Entities are counted in" + <<" \n, and in each Level value of their list"< -#include - -#include #include #include -#include #include -class Standard_Transient; + class Interface_InterfaceModel; class TCollection_HAsciiString; -class Message_Messenger; - class IGESSelect_CounterOfLevelNumber; DEFINE_STANDARD_HANDLE(IGESSelect_CounterOfLevelNumber, IFSelect_SignCounter) @@ -85,7 +78,7 @@ //! Prints the counts of items (not the list) then the Highest //! Level Number recorded - Standard_EXPORT virtual void PrintCount (const Handle(Message_Messenger)& S) const Standard_OVERRIDE; + Standard_EXPORT virtual void PrintCount (Standard_OStream& S) const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSelect/IGESSelect_WorkLibrary.cxx opencascade-7.5.1+dfsg1/src/IGESSelect/IGESSelect_WorkLibrary.cxx --- opencascade-7.4.1+dfsg1/src/IGESSelect/IGESSelect_WorkLibrary.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSelect/IGESSelect_WorkLibrary.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -77,15 +77,15 @@ Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol) const { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); Handle(IGESData_IGESModel) igesmod = new IGESData_IGESModel; DeclareAndCast(IGESData_Protocol,prot,protocol); char* pname=(char*) name; Standard_Integer status = IGESFile_Read (pname,igesmod,prot); - if (status < 0) sout<<"File not found : "< 0) sout<<"Error when reading file : "< 0) sout<<"Error when reading file : "<AddFail("IGES File could not be created"); - sout<<" - IGES File could not be created : " << ctx.FileName() << Message_EndLine; return 0; + sout<<" - IGES File could not be created : " << ctx.FileName() << std::endl; return 0; } sout<<" IGES File Name : "<Number(igesent); if (num == 0) return; - S<<" --- Entity "<IsRedefinedContent(num); Handle(Standard_Transient) con; if (iserr) con = model->ReportEntity(num)->Content(); - if (entity.IsNull()) { S<<" Null"<DynamicType()->Name(); - else S << "(undefined)" << Message_EndLine; + else S << "(undefined)" << std::endl; igesent = GetCasted(IGESData_IGESEntity,con); con.Nullify(); Handle(Interface_Check) check = model->ReportEntity(num)->Check(); @@ -192,6 +192,6 @@ dump.Dump(igesent,S,level,(level-1)/3); } catch (Standard_Failure const&) { - S << " ** Dump Interrupt **" << Message_EndLine; + S << " ** Dump Interrupt **" << std::endl; } } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSelect/IGESSelect_WorkLibrary.hxx opencascade-7.5.1+dfsg1/src/IGESSelect/IGESSelect_WorkLibrary.hxx --- opencascade-7.4.1+dfsg1/src/IGESSelect/IGESSelect_WorkLibrary.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSelect/IGESSelect_WorkLibrary.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,8 +29,6 @@ class IFSelect_ContextWrite; class IGESData_Protocol; class Standard_Transient; -class Message_Messenger; - class IGESSelect_WorkLibrary; DEFINE_STANDARD_HANDLE(IGESSelect_WorkLibrary, IFSelect_WorkLibrary) @@ -61,7 +59,7 @@ //! Dumps an IGES Entity with an IGES Dumper. is the one //! used by IGESDumper. - Standard_EXPORT void DumpEntity (const Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol, const Handle(Standard_Transient)& entity, const Handle(Message_Messenger)& S, const Standard_Integer level) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpEntity (const Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol, const Handle(Standard_Transient)& entity, Standard_OStream& S, const Standard_Integer level) const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_Protocol.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_Protocol.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_Protocol.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_Protocol.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -88,7 +88,7 @@ Handle(Interface_Protocol) IGESSolid_Protocol::Resource (const Standard_Integer /*num*/) const { - Handle(Interface_Protocol) res = IGESGeom::Protocol();; + Handle(Interface_Protocol) res = IGESGeom::Protocol(); return res; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_SpecificModule.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_SpecificModule.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_SpecificModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_SpecificModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -64,7 +64,6 @@ #include #include #include -#include #include IMPLEMENT_STANDARD_RTTIEXT(IGESSolid_SpecificModule,IGESData_SpecificModule) @@ -77,7 +76,7 @@ void IGESSolid_SpecificModule::OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, - const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, + const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const { switch (CN) { diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_SpecificModule.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_SpecificModule.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_SpecificModule.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_SpecificModule.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,8 +24,6 @@ #include class IGESData_IGESEntity; class IGESData_IGESDumper; -class Message_Messenger; - class IGESSolid_SpecificModule; DEFINE_STANDARD_HANDLE(IGESSolid_SpecificModule, IGESData_SpecificModule) @@ -41,7 +39,7 @@ Standard_EXPORT IGESSolid_SpecificModule(); //! Specific Dump (own parameters) for IGESSolid - Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const Standard_OVERRIDE; + Standard_EXPORT void OwnDump (const Standard_Integer CN, const Handle(IGESData_IGESEntity)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolBlock.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolBlock.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolBlock.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolBlock.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -185,17 +185,16 @@ void IGESSolid_ToolBlock::OwnDump (const Handle(IGESSolid_Block)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_Block" << Message_EndLine; - - S << "Size : "; + S << "IGESSolid_Block\n" + << "Size : "; IGESData_DumpXYZ(S, ent->Size()); - S << Message_EndLine << "Corner : "; + S << "\nCorner : "; IGESData_DumpXYZL(S,level, ent->Corner(), ent->Location()); - S << Message_EndLine << "XAxis : "; + S << "\nXAxis : "; IGESData_DumpXYZL(S,level, ent->XAxis(), ent->VectorLocation()); - S << Message_EndLine << "ZAxis : "; + S << "\nZAxis : "; IGESData_DumpXYZL(S,level, ent->ZAxis(), ent->VectorLocation()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolBlock.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolBlock.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolBlock.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolBlock.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Block. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_Block)& entfrom, const Handle(IGESSolid_Block)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_Block)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_Block)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolBooleanTree.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolBooleanTree.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolBooleanTree.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolBooleanTree.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -174,35 +174,33 @@ void IGESSolid_ToolBooleanTree::OwnDump (const Handle(IGESSolid_BooleanTree)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer i, length = ent->Length(); - S << "IGESSolid_Boolean Tree" << Message_EndLine; - - S << "Length of the post-order notation :" << length << Message_EndLine; - + S << "IGESSolid_Boolean Tree\n" + << "Length of the post-order notation :" << length << "\n"; if (level > 4) { - S << "Post-order notation of the Boolean Tree :" << Message_EndLine; + S << "Post-order notation of the Boolean Tree :\n"; for (i = 1; i <= length; i++) { if (ent->IsOperand(i)) { S << "[" << i << "] Operand : "; dumper.Dump (ent->Operand(i),S, 1); - S << Message_EndLine; + S << "\n"; } else { Standard_Integer opcode = ent->Operation(i); S << "[" << i << "] Operator : " << opcode; if (opcode == 1) S << " (Union)"; - else if (opcode == 2) S << " (Intersection)" << Message_EndLine; - else if (opcode == 3) S << " (Difference)" << Message_EndLine; - else S << " (incorrect value)" << Message_EndLine; + else if (opcode == 2) S << " (Intersection)\n"; + else if (opcode == 3) S << " (Difference)\n"; + else S << " (incorrect value)\n"; } } } -// S << std::endl; +// aSender << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolBooleanTree.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolBooleanTree.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolBooleanTree.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolBooleanTree.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a BooleanTree. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_BooleanTree)& entfrom, const Handle(IGESSolid_BooleanTree)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_BooleanTree)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_BooleanTree)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolConeFrustum.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolConeFrustum.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolConeFrustum.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolConeFrustum.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -169,16 +169,15 @@ void IGESSolid_ToolConeFrustum::OwnDump (const Handle(IGESSolid_ConeFrustum)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_ConeFrustum" << Message_EndLine; - - S << "Height : " << ent->Height() << " "; - S << "Larger face Radius : " << ent->LargerRadius() << " "; - S << "Smaller face Radius : " << ent->SmallerRadius() << Message_EndLine; - S << "Face Center : "; + S << "IGESSolid_ConeFrustum\n" + << "Height : " << ent->Height() << " " + << "Larger face Radius : " << ent->LargerRadius() << " " + << "Smaller face Radius : " << ent->SmallerRadius() << "\n" + << "Face Center : "; IGESData_DumpXYZL(S,level, ent->FaceCenter(), ent->Location()); - S << Message_EndLine << "Axis : "; + S << "\nAxis : "; IGESData_DumpXYZL(S,level, ent->Axis(), ent->VectorLocation()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolConeFrustum.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolConeFrustum.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolConeFrustum.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolConeFrustum.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ConeFrustum. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_ConeFrustum)& entfrom, const Handle(IGESSolid_ConeFrustum)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_ConeFrustum)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_ConeFrustum)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolConicalSurface.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolConicalSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolConicalSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolConicalSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -141,24 +141,24 @@ void IGESSolid_ToolConicalSurface::OwnDump (const Handle(IGESSolid_ConicalSurface)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_ConicalSurface" << Message_EndLine; + S << "IGESSolid_ConicalSurface\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "Point on axis : "; dumper.Dump(ent->LocationPoint(),S, sublevel); - S << Message_EndLine; - S << "Axis direction : "; + S << "\n" + << "Axis direction : "; dumper.Dump(ent->Axis(),S, sublevel); - S << Message_EndLine; - S << "Radius : " << ent->Radius() << " "; - S << "Semi-angle : " << ent->SemiAngle() << Message_EndLine; + S << "\n" + << "Radius : " << ent->Radius() << " " + << "Semi-angle : " << ent->SemiAngle() << "\n"; if (ent->IsParametrised()) { - S << "Surface is Parametrised - Reference direction : " << Message_EndLine; + S << "Surface is Parametrised - Reference direction :\n"; dumper.Dump(ent->ReferenceDir(),S, sublevel); - S << Message_EndLine; + S << std::endl; } - else S << "Surface is UnParametrised" << Message_EndLine; + else S << "Surface is UnParametrised" << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolConicalSurface.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolConicalSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolConicalSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolConicalSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ConicalSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_ConicalSurface)& entfrom, const Handle(IGESSolid_ConicalSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_ConicalSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_ConicalSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylinder.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylinder.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylinder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylinder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -158,20 +158,19 @@ void IGESSolid_ToolCylinder::OwnDump (const Handle(IGESSolid_Cylinder)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { // Standard_Boolean locprint = (ent->HasTransf() && level >=6); // gp_Pnt TCenter = ent->TransformedFaceCenter(); // gp_Dir TAxis = ent->TransformedAxis(); - S << "IGESSolid_Cylinder" << Message_EndLine; - - S << "Height : " << ent->Height() << " "; - S << "Radius : " << ent->Radius() << Message_EndLine; - S << "Center : "; + S << "IGESSolid_Cylinder\n" + << "Height : " << ent->Height() << " " + << "Radius : " << ent->Radius() << "\n" + << "Center : "; IGESData_DumpXYZL(S,level, ent->FaceCenter(), ent->Location()); - S << Message_EndLine << "Axis : "; + S << "\nAxis : "; IGESData_DumpXYZL(S,level, ent->Axis(), ent->VectorLocation()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylinder.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylinder.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylinder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylinder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Cylinder. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_Cylinder)& entfrom, const Handle(IGESSolid_Cylinder)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_Cylinder)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_Cylinder)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylindricalSurface.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylindricalSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylindricalSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylindricalSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -134,23 +134,23 @@ void IGESSolid_ToolCylindricalSurface::OwnDump (const Handle(IGESSolid_CylindricalSurface)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_CylindricalSurface" << Message_EndLine; + S << "IGESSolid_CylindricalSurface\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "Point on axis : "; dumper.Dump(ent->LocationPoint(),S, sublevel); - S << Message_EndLine; - S << "Axis direction : "; + S << "\n" + << "Axis direction : "; dumper.Dump(ent->Axis(),S, sublevel); - S << Message_EndLine; - S << "Radius : " << ent->Radius() << Message_EndLine; + S << "\n" + << "Radius : " << ent->Radius() << "\n"; if (ent->IsParametrised()) { S << "Surface is Parametrised - Reference direction : "; dumper.Dump(ent->ReferenceDir(),S, sublevel); - S << Message_EndLine; + S << std::endl; } - else S << "Surface is UnParametrised" << Message_EndLine; + else S << "Surface is UnParametrised" << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylindricalSurface.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylindricalSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylindricalSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolCylindricalSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a CylindricalSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_CylindricalSurface)& entfrom, const Handle(IGESSolid_CylindricalSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_CylindricalSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_CylindricalSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolEdgeList.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolEdgeList.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolEdgeList.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolEdgeList.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -346,29 +346,29 @@ void IGESSolid_ToolEdgeList::OwnDump(const Handle(IGESSolid_EdgeList)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer i, length = ent->NbEdges(); - S << "IGESSolid_EdgeList" << Message_EndLine; - S << "Number of edge tuples : " << length << Message_EndLine; + S << "IGESSolid_EdgeList\n" + << "Number of edge tuples : " << length << "\n"; switch (level) { case 4 : - S << "Curves : "; - S << "Start Vertex List : "; - S << "Start Vertex Index : "; - IGESData_DumpVals(S ,level,1, length,ent->StartVertexIndex); - S << Message_EndLine; - S << "End Vertex List : "; - S << "End Vertex Index : "; - IGESData_DumpVals(S ,level,1, length,ent->EndVertexIndex); - S << Message_EndLine; + S << "Curves : " + << "Start Vertex List : " + << "Start Vertex Index : "; + IGESData_DumpVals(S,level,1, length,ent->StartVertexIndex); + S << "\n" + << "End Vertex List : " + << "End Vertex Index : "; + IGESData_DumpVals(S,level,1, length,ent->EndVertexIndex); + S << "\n"; break; case 5 : case 6 : - S<<" Curve - Vertices. Start : (VertexList,Index) End : (VertexList,Index)"<Curve(i),S, level-5); S <<" - Vertices. Start : ("; dumper.Dump (ent->StartVertexList(i),S, 0); - S << " , " << ent->StartVertexIndex(i); - S << ") End : ("; + S << " , " << ent->StartVertexIndex(i) + << ") End : ("; dumper.Dump (ent->EndVertexList(i),S, 0); - S << " , " << ent->EndVertexIndex(i); - S << ")" << Message_EndLine; + S << " , " << ent->EndVertexIndex(i) + << ")" << "\n"; } break; default : break; } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolEdgeList.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolEdgeList.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolEdgeList.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolEdgeList.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a EdgeList. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_EdgeList)& entfrom, const Handle(IGESSolid_EdgeList)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_EdgeList)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_EdgeList)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolEllipsoid.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolEllipsoid.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolEllipsoid.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolEllipsoid.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -188,17 +188,16 @@ void IGESSolid_ToolEllipsoid::OwnDump (const Handle(IGESSolid_Ellipsoid)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_Ellipsoid" << Message_EndLine; - - S << "Size : "; + S << "IGESSolid_Ellipsoid\n" + << "Size : "; IGESData_DumpXYZ(S, ent->Size()); - S << Message_EndLine << "Center : "; + S << "\nCenter : "; IGESData_DumpXYZL(S,level, ent->Center(), ent->Location()); - S << Message_EndLine << "XAxis : "; + S << "\nXAxis : "; IGESData_DumpXYZL(S,level, ent->XAxis(), ent->VectorLocation()); - S << Message_EndLine << "ZAxis : "; + S << "\nZAxis : "; IGESData_DumpXYZL(S,level, ent->ZAxis(), ent->VectorLocation()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolEllipsoid.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolEllipsoid.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolEllipsoid.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolEllipsoid.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Ellipsoid. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_Ellipsoid)& entfrom, const Handle(IGESSolid_Ellipsoid)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_Ellipsoid)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_Ellipsoid)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolFace.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolFace.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolFace.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolFace.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -246,19 +246,19 @@ void IGESSolid_ToolFace::OwnDump(const Handle(IGESSolid_Face)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_Face" << Message_EndLine; + S << "IGESSolid_Face\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "Surface : "; dumper.Dump(ent->Surface(),S, sublevel); - S << Message_EndLine; - if (ent->HasOuterLoop()) S << "Outer loop is present (First one)" << Message_EndLine; - else S << "Outer loop is not present" << Message_EndLine; + S << "\n"; + if (ent->HasOuterLoop()) S << "Outer loop is present (First one)\n"; + else S << "Outer loop is not present\n"; S << "Loops : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbLoops(),ent->Loop); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolFace.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolFace.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolFace.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolFace.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Face. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_Face)& entfrom, const Handle(IGESSolid_Face)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_Face)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_Face)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolLoop.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolLoop.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolLoop.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolLoop.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -368,31 +367,30 @@ void IGESSolid_ToolLoop::OwnDump(const Handle(IGESSolid_Loop)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { Standard_Integer i, j; Standard_Integer nbedges = ent->NbEdges(); Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "IGESSolid_Loop" << Message_EndLine; - - S << "Edge types : " << Message_EndLine; - S << "Edges : " << Message_EndLine; - S << "List index : " << Message_EndLine; - S << "Orientation flags : " << Message_EndLine; - S << "Parametric flags : "; + S << "IGESSolid_Loop\n" + << "Edge types :\n" + << "Edges :\n" + << "List index :\n" + << "Orientation flags :\n" + << "Parametric flags : "; IGESData_DumpEntities(S,dumper,-level,1, nbedges,ent->Edge); - S << Message_EndLine; + S << "\n"; if (level > 4) { S << "[ "; for (i = 1; i <= nbedges; i ++) { Standard_Integer nbc = ent->NbParameterCurves(i); - S << "[" << i << "]: "; - S << "Edge type : " << ent->EdgeType(i) << " "; - S << "Edge : "; + S << "[" << i << "]: " + << "Edge type : " << ent->EdgeType(i) << " " + << "Edge : "; dumper.Dump (ent->Edge(i),S, sublevel); S << " - Index : " << ent->ListIndex(i) << ", Orientation flag : " << ( ent->Orientation(i) ? "Positive" : "Negative" ) @@ -404,19 +402,19 @@ S << ":\n [ "; for (j = 1; j <= nbc; j ++) { - S << "[" << j << "]: "; - S << "Isoparametric flag : " - << ( ent->IsIsoparametric(i,j) ? "True" : "False" ) << " "; - S << "Parametric curve : "; + S << "[" << j << "]: " + << "Isoparametric flag : " + << ( ent->IsIsoparametric(i,j) ? "True" : "False" ) << " " + << "Parametric curve : "; dumper.Dump (ent->ParametricCurve(i,j),S, sublevel); - S << Message_EndLine; + S << "\n"; } S << " ]"; } } - S << Message_EndLine; + S << "\n"; } S << " ]"; } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolLoop.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolLoop.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolLoop.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolLoop.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Loop. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_Loop)& entfrom, const Handle(IGESSolid_Loop)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_Loop)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_Loop)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolManifoldSolid.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolManifoldSolid.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolManifoldSolid.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolManifoldSolid.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -207,39 +206,39 @@ void IGESSolid_ToolManifoldSolid::OwnDump (const Handle(IGESSolid_ManifoldSolid)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_ManifoldSolid" << Message_EndLine; + S << "IGESSolid_ManifoldSolid\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "Shell : "; dumper.Dump(ent->Shell(),S, sublevel); - S << Message_EndLine; + S << "\n"; if (ent->OrientationFlag()) - S << "Orientation agrees with the underlying surface" << Message_EndLine; + S << "Orientation agrees with the underlying surface\n"; else - S << "Orientation does not agrees with the underlying surface" << Message_EndLine; - S << "Void shells :" << Message_EndLine << "Orientation flags : "; + S << "Orientation does not agrees with the underlying surface\n"; + S << "Void shells :\nOrientation flags : "; IGESData_DumpEntities(S,dumper,-level,1, ent->NbVoidShells(),ent->VoidShell); - S << Message_EndLine; + S << std::endl; if (level > 4) { - S << "[ " << Message_EndLine; + S << "[\n"; if (ent->NbVoidShells() > 0) { Standard_Integer upper = ent->NbVoidShells(); for (Standard_Integer i = 1; i <= upper; i ++) { - S << "[" << i << "]: "; - S << "Void shell : "; + S << "[" << i << "]: " + << "Void shell : "; dumper.Dump (ent->VoidShell(i),S, sublevel); S << " - Orientation flag : "; - if (ent->VoidOrientationFlag(i)) S << "True" << Message_EndLine; - else S << "False" << Message_EndLine; + if (ent->VoidOrientationFlag(i)) S << "True\n"; + else S << "False\n"; } } - S << " ]" << Message_EndLine; + S << " ]\n"; } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolManifoldSolid.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolManifoldSolid.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolManifoldSolid.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolManifoldSolid.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ManifoldSolid. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_ManifoldSolid)& entfrom, const Handle(IGESSolid_ManifoldSolid)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_ManifoldSolid)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_ManifoldSolid)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolPlaneSurface.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolPlaneSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolPlaneSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolPlaneSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -254,23 +254,23 @@ void IGESSolid_ToolPlaneSurface::OwnDump(const Handle(IGESSolid_PlaneSurface)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_PlaneSurface" << Message_EndLine; + S << "IGESSolid_PlaneSurface\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "Point on axis : "; dumper.Dump(ent->LocationPoint(),S, sublevel); - S << Message_EndLine; - S << "Normal direction : "; + S << "\n" + << "Normal direction : "; dumper.Dump(ent->Normal(),S, sublevel); - S << Message_EndLine; + S << "\n"; if (ent->IsParametrised()) { S << "Surface is Parametrised - Reference direction : "; dumper.Dump(ent->ReferenceDir(),S, sublevel); - S << Message_EndLine; + S << std::endl; } - else S << "Surface is UnParametrised" << Message_EndLine; + else S << "Surface is UnParametrised" << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolPlaneSurface.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolPlaneSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolPlaneSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolPlaneSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a PlaneSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_PlaneSurface)& entfrom, const Handle(IGESSolid_PlaneSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_PlaneSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_PlaneSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolRightAngularWedge.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolRightAngularWedge.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolRightAngularWedge.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolRightAngularWedge.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -194,18 +194,17 @@ void IGESSolid_ToolRightAngularWedge::OwnDump (const Handle(IGESSolid_RightAngularWedge)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_RightAngularWedge" << Message_EndLine; - - S << "Size : "; + S << "IGESSolid_RightAngularWedge\n" + << "Size : "; IGESData_DumpXYZ(S, ent->Size()); S << " "; - S << "XSmall : " << ent->XSmallLength() << Message_EndLine; - S << "Corner : "; + S << "XSmall : " << ent->XSmallLength() << "\n" + << "Corner : "; IGESData_DumpXYZL(S,level, ent->Corner(), ent->Location()); - S << Message_EndLine << "XAxis : "; + S << "\nXAxis : "; IGESData_DumpXYZL(S,level, ent->XAxis(), ent->VectorLocation()); - S << Message_EndLine << "ZAxis : "; + S << "\nZAxis : "; IGESData_DumpXYZL(S,level, ent->ZAxis(), ent->VectorLocation()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolRightAngularWedge.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolRightAngularWedge.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolRightAngularWedge.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolRightAngularWedge.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a RightAngularWedge. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_RightAngularWedge)& entfrom, const Handle(IGESSolid_RightAngularWedge)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_RightAngularWedge)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_RightAngularWedge)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSelectedComponent.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSelectedComponent.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSelectedComponent.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSelectedComponent.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -105,14 +105,14 @@ void IGESSolid_ToolSelectedComponent::OwnDump (const Handle(IGESSolid_SelectedComponent)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_SelectedComponent" << Message_EndLine; + S << "IGESSolid_SelectedComponent\n"; // the heading for boolean tree is in BooleanTree OwnDump - S << "Boolean Tree Entity : " << Message_EndLine; + S << "Boolean Tree Entity :\n"; dumper.Dump(ent->Component(),S, (level <= 4) ? 0 : 1); S << "Seleted Point : "; IGESData_DumpXYZL(S,level, ent->SelectPoint(), ent->Location()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSelectedComponent.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSelectedComponent.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSelectedComponent.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSelectedComponent.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SelectedComponent. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_SelectedComponent)& entfrom, const Handle(IGESSolid_SelectedComponent)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_SelectedComponent)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_SelectedComponent)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolShell.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolShell.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolShell.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolShell.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -62,7 +62,7 @@ // MGE 03/08/98 //Standard_Boolean abool; //szv#4:S4163:12Mar99 moved down - Standard_Integer nbfaces=0;; //szv#4:S4163:12Mar99 `i` moved in for + Standard_Integer nbfaces=0; //szv#4:S4163:12Mar99 `i` moved in for //Handle(IGESSolid_Face) aface; //szv#4:S4163:12Mar99 moved down Handle(IGESSolid_HArray1OfFace) tempFaces; Handle(TColStd_HArray1OfInteger) tempOrientation; @@ -229,28 +229,28 @@ void IGESSolid_ToolShell::OwnDump(const Handle(IGESSolid_Shell)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_Shell" << Message_EndLine; + S << "IGESSolid_Shell\n"; Standard_Integer upper = ent->NbFaces(); Standard_Integer sublevel = (level <= 4) ? 0 : 1; - S << "Faces : " << Message_EndLine << "Orientation flags : "; + S << "Faces :\nOrientation flags : "; IGESData_DumpEntities(S,dumper,-level,1, ent->NbFaces(),ent->Face); - S << Message_EndLine; + S << "\n"; if (level > 4) { - S << "[" << Message_EndLine; + S << "[\n"; for (Standard_Integer i = 1; i <= upper; i ++) { - S << "[" << i << "]: "; - S << "Face : "; + S << "[" << i << "]: " + << "Face : "; dumper.Dump (ent->Face(i),S, sublevel); S << " - Orientation flag : "; - if (ent->Orientation(i)) S << "True" << Message_EndLine; - else S << "False" << Message_EndLine; + if (ent->Orientation(i)) S << "True\n"; + else S << "False\n"; } } - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolShell.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolShell.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolShell.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolShell.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Shell. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_Shell)& entfrom, const Handle(IGESSolid_Shell)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_Shell)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_Shell)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidAssembly.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidAssembly.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidAssembly.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidAssembly.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -156,16 +156,14 @@ void IGESSolid_ToolSolidAssembly::OwnDump (const Handle(IGESSolid_SolidAssembly)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { // Standard_Integer upper = ent->NbItems(); - - S << "IGESSolid_SolidAssembly" << Message_EndLine; - - S << "Items : "; + S << "IGESSolid_SolidAssembly\n" + << "Items : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbItems(),ent->Item); - S << Message_EndLine; - S << "Matrices : "; + S << "\n" + << "Matrices : "; IGESData_DumpEntities(S,dumper ,level,1, ent->NbItems(),ent->TransfMatrix); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidAssembly.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidAssembly.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidAssembly.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidAssembly.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SolidAssembly. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_SolidAssembly)& entfrom, const Handle(IGESSolid_SolidAssembly)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_SolidAssembly)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_SolidAssembly)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidInstance.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidInstance.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidInstance.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidInstance.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -91,11 +91,10 @@ void IGESSolid_ToolSolidInstance::OwnDump (const Handle(IGESSolid_SolidInstance)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_SolidInstance" << Message_EndLine; - - S << "Solid entity : "; + S << "IGESSolid_SolidInstance\n" + << "Solid entity : "; dumper.Dump(ent->Entity(),S, (level <= 4) ? 0 : 1); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidInstance.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidInstance.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidInstance.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidInstance.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SolidInstance. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_SolidInstance)& entfrom, const Handle(IGESSolid_SolidInstance)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_SolidInstance)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_SolidInstance)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfLinearExtrusion.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfLinearExtrusion.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfLinearExtrusion.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfLinearExtrusion.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -135,15 +135,14 @@ void IGESSolid_ToolSolidOfLinearExtrusion::OwnDump (const Handle(IGESSolid_SolidOfLinearExtrusion)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_SolidOfLinearExtrusion" << Message_EndLine; - - S << "Curve entity : "; + S << "IGESSolid_SolidOfLinearExtrusion\n" + << "Curve entity : "; dumper.Dump(ent->Curve(),S, (level <= 4) ? 0 : 1); - S << Message_EndLine; - S << "Extrusion length : " << ent->ExtrusionLength() << Message_EndLine; - S << "Extrusion direction : "; + S << "\n" + << "Extrusion length : " << ent->ExtrusionLength() << "\n" + << "Extrusion direction : "; IGESData_DumpXYZL(S,level, ent->ExtrusionDirection(), ent->VectorLocation()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfLinearExtrusion.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfLinearExtrusion.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfLinearExtrusion.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfLinearExtrusion.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SolidOfLinearExtrusion. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_SolidOfLinearExtrusion)& entfrom, const Handle(IGESSolid_SolidOfLinearExtrusion)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_SolidOfLinearExtrusion)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_SolidOfLinearExtrusion)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfRevolution.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfRevolution.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfRevolution.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfRevolution.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -167,17 +167,16 @@ void IGESSolid_ToolSolidOfRevolution::OwnDump (const Handle(IGESSolid_SolidOfRevolution)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_SolidOfRevolution" << Message_EndLine; - - S << "Curve entity :"; + S << "IGESSolid_SolidOfRevolution\n" + << "Curve entity :"; dumper.Dump(ent->Curve(),S, (level <= 4) ? 0 : 1); - S << Message_EndLine; - S << "Fraction of rotation : " << ent->Fraction() << Message_EndLine; - S << "Axis Point : "; + S << "\n" + << "Fraction of rotation : " << ent->Fraction() << "\n" + << "Axis Point : "; IGESData_DumpXYZL(S,level, ent->AxisPoint(), ent->Location()); - S << Message_EndLine << "Axis direction : "; + S << "\nAxis direction : "; IGESData_DumpXYZL(S,level, ent->Axis(), ent->VectorLocation()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfRevolution.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfRevolution.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfRevolution.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSolidOfRevolution.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SolidOfRevolution. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_SolidOfRevolution)& entfrom, const Handle(IGESSolid_SolidOfRevolution)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_SolidOfRevolution)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_SolidOfRevolution)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphere.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphere.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphere.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphere.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -120,12 +120,11 @@ void IGESSolid_ToolSphere::OwnDump (const Handle(IGESSolid_Sphere)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_Sphere" << Message_EndLine; - - S << "Radius : " << ent->Radius() << Message_EndLine; - S << "Center : "; + S << "IGESSolid_Sphere\n" + << "Radius : " << ent->Radius() << "\n" + << "Center : "; IGESData_DumpXYZL(S,level, ent->Center(), ent->Location()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphere.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphere.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphere.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphere.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Sphere. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_Sphere)& entfrom, const Handle(IGESSolid_Sphere)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_Sphere)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_Sphere)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphericalSurface.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphericalSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphericalSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphericalSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -141,24 +141,24 @@ void IGESSolid_ToolSphericalSurface::OwnDump (const Handle(IGESSolid_SphericalSurface)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_SphericalSurface" << Message_EndLine; + S << "IGESSolid_SphericalSurface\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "Center : "; dumper.Dump(ent->Center(),S, sublevel); - S << Message_EndLine; - S << "Radius : " << ent->Radius() << Message_EndLine; + S << "\n" + << "Radius : " << ent->Radius() << "\n"; if (ent->IsParametrised()) { - S << "Surface is Parametrised" << Message_EndLine; - S << "Axis direction : "; + S << "Surface is Parametrised\n" + << "Axis direction : "; dumper.Dump(ent->Axis(),S, sublevel); - S << Message_EndLine; - S << "Reference direction : "; + S << "\n" + << "Reference direction : "; dumper.Dump(ent->ReferenceDir(),S, sublevel); - S << Message_EndLine; + S << std::endl; } - else S << "Surface is UnParametrised" << Message_EndLine; + else S << "Surface is UnParametrised" << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphericalSurface.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphericalSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphericalSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolSphericalSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a SphericalSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_SphericalSurface)& entfrom, const Handle(IGESSolid_SphericalSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_SphericalSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_SphericalSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolToroidalSurface.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolToroidalSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolToroidalSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolToroidalSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,7 +31,6 @@ #include #include #include -#include #include IGESSolid_ToolToroidalSurface::IGESSolid_ToolToroidalSurface () { } @@ -138,24 +137,24 @@ void IGESSolid_ToolToroidalSurface::OwnDump (const Handle(IGESSolid_ToroidalSurface)& ent, const IGESData_IGESDumper& dumper, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_ToroidalSurface" << Message_EndLine; + S << "IGESSolid_ToroidalSurface\n"; Standard_Integer sublevel = (level <= 4) ? 0 : 1; S << "Center : "; dumper.Dump(ent->Center(),S, sublevel); - S << Message_EndLine; - S << "Axis direction : "; + S << "\n" + << "Axis direction : "; dumper.Dump(ent->Axis(),S, sublevel); - S << Message_EndLine; - S << "Major Radius : " << ent->MajorRadius() << " "; - S << "Minor Radius : " << ent->MinorRadius() << Message_EndLine; + S << "\n" + << "Major Radius : " << ent->MajorRadius() << " " + << "Minor Radius : " << ent->MinorRadius() << "\n"; if (ent->IsParametrised()) { S << "Surface is Parametrised - Reference direction : "; dumper.Dump(ent->ReferenceDir(),S, sublevel); - S << Message_EndLine; + S << std::endl; } - else S << "Surface is UnParametrised" << Message_EndLine; + else S << "Surface is UnParametrised" << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolToroidalSurface.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolToroidalSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolToroidalSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolToroidalSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a ToroidalSurface. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_ToroidalSurface)& entfrom, const Handle(IGESSolid_ToroidalSurface)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_ToroidalSurface)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_ToroidalSurface)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolTorus.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolTorus.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolTorus.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolTorus.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -159,15 +159,14 @@ void IGESSolid_ToolTorus::OwnDump (const Handle(IGESSolid_Torus)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, const Standard_Integer level) const + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_Torus" << Message_EndLine; - - S << "Radius of revolution : " << ent->MajorRadius() << " "; - S << "Radius of the disc : " << ent->DiscRadius() << Message_EndLine; - S << "Center Point : "; + S << "IGESSolid_Torus\n" + << "Radius of revolution : " << ent->MajorRadius() << " " + << "Radius of the disc : " << ent->DiscRadius() << "\n" + << "Center Point : "; IGESData_DumpXYZL(S,level, ent->AxisPoint(), ent->Location()); - S << Message_EndLine << "Axis direction : "; + S << "\nAxis direction : "; IGESData_DumpXYZL(S,level, ent->Axis(), ent->VectorLocation()); - S << Message_EndLine; + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolTorus.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolTorus.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolTorus.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolTorus.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a Torus. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_Torus)& entfrom, const Handle(IGESSolid_Torus)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_Torus)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_Torus)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolVertexList.cxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolVertexList.cxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolVertexList.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolVertexList.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -201,12 +201,11 @@ void IGESSolid_ToolVertexList::OwnDump(const Handle(IGESSolid_VertexList)& ent, const IGESData_IGESDumper& /* dumper */, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer level) const { - S << "IGESSolid_VertexList" << Message_EndLine; - - S << "Vertices : "; - IGESData_DumpListXYZL(S ,level,1, ent->NbVertices(),ent->Vertex,ent->Location()); - S << Message_EndLine; + S << "IGESSolid_VertexList\n" + << "Vertices : "; + IGESData_DumpListXYZL(S,level,1, ent->NbVertices(),ent->Vertex,ent->Location()); + S << std::endl; } diff -Nru opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolVertexList.hxx opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolVertexList.hxx --- opencascade-7.4.1+dfsg1/src/IGESSolid/IGESSolid_ToolVertexList.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESSolid/IGESSolid_ToolVertexList.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,6 @@ class Interface_Check; class Interface_CopyTool; class IGESData_IGESDumper; -class Message_Messenger; - //! Tool to work on a VertexList. Called by various Modules //! (ReadWriteModule, GeneralModule, SpecificModule) @@ -69,7 +67,7 @@ Standard_EXPORT void OwnCopy (const Handle(IGESSolid_VertexList)& entfrom, const Handle(IGESSolid_VertexList)& entto, Interface_CopyTool& TC) const; //! Dump of Specific Parameters - Standard_EXPORT void OwnDump (const Handle(IGESSolid_VertexList)& ent, const IGESData_IGESDumper& dumper, const Handle(Message_Messenger)& S, const Standard_Integer own) const; + Standard_EXPORT void OwnDump (const Handle(IGESSolid_VertexList)& ent, const IGESData_IGESDumper& dumper, Standard_OStream& S, const Standard_Integer own) const; diff -Nru opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_Actor.cxx opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_Actor.cxx --- opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_Actor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_Actor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include @@ -141,7 +141,8 @@ //purpose : //======================================================================= Handle(Transfer_Binder) IGESToBRep_Actor::Transfer -(const Handle(Standard_Transient)& start, const Handle(Transfer_TransientProcess)& TP) +(const Handle(Standard_Transient)& start, const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { DeclareAndCast(IGESData_IGESModel,mymodel,themodel); DeclareAndCast(IGESData_IGESEntity,ent,start); @@ -162,7 +163,7 @@ (typnum == 408) || (typnum == 308)) { // Start progress scope (no need to check if progress exists -- it is safe) - Message_ProgressSentry aPSentry(TP->GetProgress(), "Transfer stage", 0, 2, 1); + Message_ProgressScope aPS(theProgress, "Transfer stage", 2); XSAlgo::AlgoContainer()->PrepareForTransfer(); IGESToBRep_CurveAndSurface CAS; @@ -189,22 +190,19 @@ { try { OCC_CATCH_SIGNALS - shape = CAS.TransferGeometry(ent); + shape = CAS.TransferGeometry(ent, aPS.Next()); } catch(Standard_Failure const&) { shape.Nullify(); } } - - // Switch to fix stage. - aPSentry.Next(); // fixing shape Handle(Standard_Transient) info; shape = XSAlgo::AlgoContainer()->ProcessShape( shape, theeps, CAS.GetMaxTol(), "read.iges.resource.name", "read.iges.sequence", info, - TP->GetProgress() ); + aPS.Next()); XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems); } diff -Nru opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_Actor.hxx opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_Actor.hxx --- opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_Actor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_Actor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,12 +24,13 @@ #include #include #include +#include + class Interface_InterfaceModel; class Standard_Transient; class Transfer_Binder; class Transfer_TransientProcess; - class IGESToBRep_Actor; DEFINE_STANDARD_HANDLE(IGESToBRep_Actor, Transfer_ActorOfTransientProcess) @@ -58,7 +59,10 @@ Standard_EXPORT virtual Standard_Boolean Recognize (const Handle(Standard_Transient)& start) Standard_OVERRIDE; - Standard_EXPORT virtual Handle(Transfer_Binder) Transfer (const Handle(Standard_Transient)& start, const Handle(Transfer_TransientProcess)& TP) Standard_OVERRIDE; + Standard_EXPORT virtual Handle(Transfer_Binder) Transfer + (const Handle(Standard_Transient)& start, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE; //! Returns the tolerance which was actually used, either from //! the file or from statics diff -Nru opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_BRepEntity.cxx opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_BRepEntity.cxx --- opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_BRepEntity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_BRepEntity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,7 +59,7 @@ #include #include #include -#include +#include #include #include #include @@ -128,7 +128,8 @@ //purpose : //======================================================================= TopoDS_Shape IGESToBRep_BRepEntity::TransferBRepEntity - (const Handle(IGESData_IGESEntity)& start) + (const Handle(IGESData_IGESEntity)& start, + const Message_ProgressRange& theProgress) { TopoDS_Shape res; @@ -138,11 +139,11 @@ } else if (start->IsKind(STANDARD_TYPE(IGESSolid_Shell))) { DeclareAndCast(IGESSolid_Shell, st514, start); - res = TransferShell(st514); + res = TransferShell(st514, theProgress); } else if (start->IsKind(STANDARD_TYPE(IGESSolid_ManifoldSolid))) { DeclareAndCast(IGESSolid_ManifoldSolid, st186, start); - res = TransferManifoldSolid(st186); + res = TransferManifoldSolid(st186, theProgress); } else { Message_Msg Msg1005("IGES_1005"); @@ -531,7 +532,8 @@ //purpose : //======================================================================= TopoDS_Shape IGESToBRep_BRepEntity::TransferShell - (const Handle(IGESSolid_Shell)& start) + (const Handle(IGESSolid_Shell)& start, + const Message_ProgressRange& theProgress) { TopoDS_Shape res; @@ -542,13 +544,8 @@ Standard_Integer nbfaces = start->NbFaces(); if (nbfaces != 0) { Standard_Boolean closed = Standard_True; //:39 - Handle(Message_ProgressIndicator) progress = GetTransferProcess()->GetProgress(); - if ( ! progress.IsNull() ) progress->SetScale ( "Face", 0, nbfaces, 1 ); - for (Standard_Integer iface = 1; iface <= nbfaces; iface++) { - if ( ! progress.IsNull() ) { - progress->Increment(); - if ( progress->UserBreak() ) break; - } + Message_ProgressScope aPS(theProgress, "Face", nbfaces); + for (Standard_Integer iface = 1; iface <= nbfaces && aPS.More(); iface++, aPS.Next()) { Handle(IGESSolid_Face) face = start->Face(iface); Standard_Boolean orientation = start->Orientation(iface); TopoDS_Shape Sh = TransferFace(face); @@ -595,7 +592,8 @@ //purpose : //======================================================================= TopoDS_Shape IGESToBRep_BRepEntity::TransferManifoldSolid - (const Handle(IGESSolid_ManifoldSolid)& start) + (const Handle(IGESSolid_ManifoldSolid)& start, + const Message_ProgressRange& theProgress) { TopoDS_Shape res; @@ -606,7 +604,7 @@ Handle(IGESSolid_Shell) shell = start->Shell(); Standard_Boolean isoriented = start->OrientationFlag(); Standard_Integer nbshell = start->NbVoidShells(); - TopoDS_Shape Sh = TransferShell(shell); + TopoDS_Shape Sh = TransferShell(shell, theProgress); if (!Sh.IsNull()) { if (Sh.ShapeType() == TopAbs_SHELL) { TopoDS_Shell Shell = TopoDS::Shell(Sh); @@ -616,11 +614,11 @@ if (nbshell != 0) { // progress scope without name, since usually we have single shell in solid - Message_ProgressSentry PS ( GetTransferProcess()->GetProgress(), 0, 0, nbshell, 1 ); - for (Standard_Integer ishell=1; ishell<= nbshell && PS.More(); ishell++, PS.Next()) { + Message_ProgressScope aPS (theProgress, NULL, nbshell); + for (Standard_Integer ishell=1; ishell<= nbshell && aPS.More(); ishell++) { Handle(IGESSolid_Shell) voidshell= start->VoidShell(ishell); // Standard_Boolean orientation = start->VoidOrientationFlag(ishell); - TopoDS_Shape aSh = TransferShell(voidshell); + TopoDS_Shape aSh = TransferShell (voidshell, aPS.Next()); if (!aSh.IsNull()) { if (aSh.ShapeType() == TopAbs_SHELL) { TopoDS_Shell Shell = TopoDS::Shell(aSh); diff -Nru opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_BRepEntity.hxx opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_BRepEntity.hxx --- opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_BRepEntity.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_BRepEntity.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,8 @@ #include #include #include +#include + class IGESToBRep_CurveAndSurface; class TopoDS_Shape; class IGESData_IGESEntity; @@ -63,7 +65,8 @@ Standard_EXPORT IGESToBRep_BRepEntity(const Standard_Real eps, const Standard_Real epsGeom, const Standard_Real epsCoeff, const Standard_Boolean mode, const Standard_Boolean modeapprox, const Standard_Boolean optimized); //! Transfer the BRepEntity" : Face, Shell or ManifoldSolid. - Standard_EXPORT TopoDS_Shape TransferBRepEntity (const Handle(IGESData_IGESEntity)& start); + Standard_EXPORT TopoDS_Shape TransferBRepEntity (const Handle(IGESData_IGESEntity)& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfer the entity number "index" of the VertexList "start" Standard_EXPORT TopoDS_Vertex TransferVertex (const Handle(IGESSolid_VertexList)& start, const Standard_Integer index); @@ -78,10 +81,12 @@ Standard_EXPORT TopoDS_Shape TransferFace (const Handle(IGESSolid_Face)& start); //! Transfer the Shell Entity - Standard_EXPORT TopoDS_Shape TransferShell (const Handle(IGESSolid_Shell)& start); + Standard_EXPORT TopoDS_Shape TransferShell (const Handle(IGESSolid_Shell)& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfer the ManifoldSolid Entity - Standard_EXPORT TopoDS_Shape TransferManifoldSolid (const Handle(IGESSolid_ManifoldSolid)& start); + Standard_EXPORT TopoDS_Shape TransferManifoldSolid (const Handle(IGESSolid_ManifoldSolid)& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); diff -Nru opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_CurveAndSurface.cxx opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_CurveAndSurface.cxx --- opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_CurveAndSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_CurveAndSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,7 +39,7 @@ #include #include #include -#include +#include #include #include #include @@ -77,34 +77,6 @@ UpdateMinMaxTol(); } - -//======================================================================= -//function : IGESToBRep_CurveAndSurface -//purpose : -//======================================================================= - -IGESToBRep_CurveAndSurface::IGESToBRep_CurveAndSurface - (const IGESToBRep_CurveAndSurface& other) -: myEps (other.myEps), - myEpsCoeff (other.myEpsCoeff), - myEpsGeom (other.myEpsGeom), - myMinTol (other.myMinTol), - myMaxTol (other.myMaxTol), - myModeIsTopo (other.myModeIsTopo), - myModeApprox (other.myModeApprox), - myContIsOpti (other.myContIsOpti), - myUnitFactor (other.myUnitFactor), - mySurfaceCurve(other.mySurfaceCurve), - myContinuity (other.myContinuity), - mySurface (other.mySurface), - myUVResolution(other.myUVResolution), - myIsResolCom (other.myIsResolCom), - myModel (other.myModel), - myTP (other.myTP) -{ -} - - //======================================================================= //function : IGESToBRep_CurveAndSurface //purpose : @@ -194,7 +166,7 @@ if (unitfactor != 1.) { if ( myTP->TraceLevel() > 2 ) - myTP->Messenger() << "UnitFactor = "<< unitfactor << Message_EndLine; + myTP->Messenger()->SendInfo() << "UnitFactor = "<< unitfactor << std::endl; myUnitFactor = unitfactor; } UpdateMinMaxTol(); @@ -206,7 +178,8 @@ //======================================================================= TopoDS_Shape IGESToBRep_CurveAndSurface::TransferCurveAndSurface - (const Handle(IGESData_IGESEntity)& start) + (const Handle(IGESData_IGESEntity)& start, + const Message_ProgressRange& theProgress) { TopoDS_Shape res; if (start.IsNull()) { @@ -227,7 +200,7 @@ } else if (IGESToBRep::IsBRepEntity(start)) { IGESToBRep_BRepEntity TS(*this); - res = TS.TransferBRepEntity(start); + res = TS.TransferBRepEntity(start, theProgress); } else { Message_Msg msg1015("IGES_1015"); @@ -259,7 +232,8 @@ //======================================================================= TopoDS_Shape IGESToBRep_CurveAndSurface::TransferGeometry - (const Handle(IGESData_IGESEntity)& start) + (const Handle(IGESData_IGESEntity)& start, + const Message_ProgressRange& theProgress) { // Declaration of messages// // DCE 22/12/98 @@ -291,7 +265,7 @@ return res; try { OCC_CATCH_SIGNALS - res = TransferCurveAndSurface(start); + res = TransferCurveAndSurface(start, theProgress); } catch(Standard_Failure const&) { Message_Msg msg1015("IGES_1015"); @@ -323,7 +297,7 @@ else { try { OCC_CATCH_SIGNALS - res = TransferGeometry(stsub); + res = TransferGeometry(stsub, theProgress); } catch(Standard_Failure const&) { res.Nullify(); @@ -347,8 +321,10 @@ SendFail( st308, msg210); return res; } - Message_ProgressSentry PS ( myTP->GetProgress(), "Subfigure item", 0, st308->NbEntities(), 1 ); - for (Standard_Integer i=1; i <= st308->NbEntities() && PS.More(); i++, PS.Next()) { + Message_ProgressScope PS (theProgress, "Subfigure item", st308->NbEntities()); + for (Standard_Integer i=1; i <= st308->NbEntities() && PS.More(); i++) + { + Message_ProgressRange aRange = PS.Next(); TopoDS_Shape item; if (st308->AssociatedEntity(i).IsNull()) { Message_Msg msg1020("IGES_1020"); @@ -366,7 +342,7 @@ else { try { OCC_CATCH_SIGNALS - item = TransferGeometry(st308->AssociatedEntity(i)); + item = TransferGeometry (st308->AssociatedEntity(i), aRange); } catch(Standard_Failure const&) { item.Nullify(); @@ -400,9 +376,11 @@ SendFail(st402f1, msg202); return res; } - Message_ProgressSentry PS ( myTP->GetProgress(), "Group item", 0, st402f1->NbEntities(), 1 ); + Message_ProgressScope PS (theProgress, "Group item", st402f1->NbEntities()); Standard_Boolean ProblemInGroup = Standard_False; - for (Standard_Integer i=1; i <= st402f1->NbEntities() && PS.More(); i++, PS.Next()) { + for (Standard_Integer i=1; i <= st402f1->NbEntities() && PS.More(); i++) + { + Message_ProgressRange aRange = PS.Next(); TopoDS_Shape item; if (st402f1->Entity(i).IsNull()) { Message_Msg msg1020("IGES_1020"); @@ -420,7 +398,7 @@ else { try { OCC_CATCH_SIGNALS - item = TransferGeometry(st402f1->Entity(i)); + item = TransferGeometry (st402f1->Entity(i), aRange); } catch(Standard_Failure const&) { item.Nullify(); @@ -463,9 +441,11 @@ SendFail(st402f7, msg202); return res; } - Message_ProgressSentry PS ( myTP->GetProgress(), "Group item", 0, st402f7->NbEntities(), 1 ); + Message_ProgressScope PS (theProgress, "Group item", st402f7->NbEntities()); Standard_Boolean ProblemInGroup = Standard_False; - for (Standard_Integer i=1; i <= st402f7->NbEntities() && PS.More(); i++, PS.Next()) { + for (Standard_Integer i=1; i <= st402f7->NbEntities() && PS.More(); i++) + { + Message_ProgressRange aRange = PS.Next(); TopoDS_Shape item; if (st402f7->Entity(i).IsNull()) { Message_Msg msg1020("IGES_1020"); @@ -483,7 +463,7 @@ else { try { OCC_CATCH_SIGNALS - item = TransferGeometry(st402f7->Entity(i)); + item = TransferGeometry (st402f7->Entity(i), aRange); } catch(Standard_Failure const&) { item.Nullify(); diff -Nru opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_CurveAndSurface.hxx opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_CurveAndSurface.hxx --- opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_CurveAndSurface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_CurveAndSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ #include #include #include +#include + class Geom_Surface; class IGESData_IGESModel; class Transfer_TransientProcess; @@ -31,7 +33,6 @@ class IGESData_IGESEntity; class Message_Msg; - //! Provides methods to transfer CurveAndSurface from IGES to CASCADE. class IGESToBRep_CurveAndSurface { @@ -45,10 +46,6 @@ //! optimization of the continuity to False. Standard_EXPORT IGESToBRep_CurveAndSurface(); - //! Creates a tool CurveAndSurface ready to run and sets its - //! fields as CS's. - Standard_EXPORT IGESToBRep_CurveAndSurface(const IGESToBRep_CurveAndSurface& CS); - //! Creates a tool CurveAndSurface ready to run. Standard_EXPORT IGESToBRep_CurveAndSurface(const Standard_Real eps, const Standard_Real epsGeom, const Standard_Real epsCoeff, const Standard_Boolean mode, const Standard_Boolean modeapprox, const Standard_Boolean optimized); @@ -146,12 +143,14 @@ //! Returns the result of the transfert of any IGES Curve //! or Surface Entity. If the transfer has failed, this //! member return a NullEntity. - Standard_EXPORT TopoDS_Shape TransferCurveAndSurface (const Handle(IGESData_IGESEntity)& start); + Standard_EXPORT TopoDS_Shape TransferCurveAndSurface (const Handle(IGESData_IGESEntity)& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Returns the result of the transfert the geometry of //! any IGESEntity. If the transfer has failed, this //! member return a NullEntity. - Standard_EXPORT TopoDS_Shape TransferGeometry (const Handle(IGESData_IGESEntity)& start); + Standard_EXPORT TopoDS_Shape TransferGeometry (const Handle(IGESData_IGESEntity)& start, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Records a new Fail message void SendFail (const Handle(IGESData_IGESEntity)& start, const Message_Msg& amsg); diff -Nru opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_Reader.cxx opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_Reader.cxx --- opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_Reader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_Reader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,7 +40,7 @@ #include #include #include -#include +#include #include #include #include @@ -268,8 +268,13 @@ { Interface_CheckTool cht (theModel,protocol); Interface_CheckIterator chl = cht.CompleteCheckList(); - if (withprint && !theProc.IsNull()) - cht.Print(chl, theProc->Messenger()); + if (withprint + && !theProc.IsNull() + && !theProc->Messenger().IsNull()) + { + Message_Messenger::StreamBuffer aBuffer = theProc->Messenger()->SendInfo(); + cht.Print(chl, aBuffer); + } return chl.IsEmpty(Standard_True); } @@ -363,7 +368,8 @@ //function : TransferRoots //purpose : Transfers all Roots Entities //======================================================================= -void IGESToBRep_Reader::TransferRoots (const Standard_Boolean onlyvisible) +void IGESToBRep_Reader::TransferRoots (const Standard_Boolean onlyvisible, + const Message_ProgressRange& theProgress) { if (theModel.IsNull() || theProc.IsNull()) return; @@ -412,8 +418,10 @@ // sln 11.06.2002 OCC448 Interface_Static::SetIVal("read.iges.onlyvisible",onlyvisible); - Message_ProgressSentry PS ( theProc->GetProgress(), "Root", 0, nb, 1 ); - for (Standard_Integer i = 1; i <= nb && PS.More(); i++, PS.Next()) { + Message_ProgressScope PS (theProgress, "Root", nb); + for (Standard_Integer i = 1; i <= nb && PS.More(); i++) + { + Message_ProgressRange aRange = PS.Next(); Handle(IGESData_IGESEntity) ent = theModel->Entity(i); if ( SH.IsShared(ent) || ! theActor->Recognize (ent) ) continue; if (level > 0) { @@ -428,7 +436,7 @@ theDone = Standard_True; try { OCC_CATCH_SIGNALS - TP.Transfer(ent); + TP.Transfer (ent, aRange); shape = TransferBRep::ShapeResult (theProc,ent); } catch(Standard_Failure const&) { @@ -473,7 +481,8 @@ //function : Transfer //purpose : Transfers an Entity given //======================================================================= -Standard_Boolean IGESToBRep_Reader::Transfer(const Standard_Integer num) +Standard_Boolean IGESToBRep_Reader::Transfer(const Standard_Integer num, + const Message_ProgressRange& theProgress) { Handle(Message_Messenger) TF = theProc->Messenger(); theDone = Standard_False; @@ -496,7 +505,7 @@ Handle(IGESData_IGESEntity) ent = theModel->Entity(num); - Message_ProgressSentry PS ( theProc->GetProgress(), "OneEnt", 0, 1, 1 ); //skl + Message_ProgressScope aPS(theProgress, "OneEnt", 2); XSAlgo::AlgoContainer()->PrepareForTransfer(); IGESToBRep_CurveAndSurface CAS; @@ -538,7 +547,9 @@ { try { OCC_CATCH_SIGNALS - shape = CAS.TransferGeometry (ent); + shape = CAS.TransferGeometry (ent, aPS.Next()); + if (aPS.UserBreak()) + return Standard_False; } catch(Standard_Failure const&) { Message_Msg msg1015("IGES_1015"); @@ -554,7 +565,10 @@ shape = XSAlgo::AlgoContainer()->ProcessShape( shape, eps*CAS.GetUnitFactor(), CAS.GetMaxTol(), "read.iges.resource.name", "read.iges.sequence", info, - theProc->GetProgress() ); + aPS.Next() ); + if (aPS.UserBreak()) + return Standard_False; + XSAlgo::AlgoContainer()->MergeTransferInfo(theProc, info, nbTPitems); ShapeExtend_Explorer SBE; @@ -571,8 +585,6 @@ } } - PS.Relieve(); //skl - char t [20]; t[0]='\0'; Standard_Real second, cpu; diff -Nru opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_Reader.hxx opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_Reader.hxx --- opencascade-7.4.1+dfsg1/src/IGESToBRep/IGESToBRep_Reader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IGESToBRep/IGESToBRep_Reader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,12 +26,13 @@ #include #include #include +#include + class IGESData_IGESModel; class IGESToBRep_Actor; class Transfer_TransientProcess; class TopoDS_Shape; - //! A simple way to read geometric IGES data. //! Encapsulates reading file and calling transfer tools class IGESToBRep_Reader @@ -79,12 +80,14 @@ //! IGES file. Standard_True is the default value and means that only //! visible root entities are translated. Standard_False //! translates all of the roots (visible and invisible). - Standard_EXPORT void TransferRoots (const Standard_Boolean onlyvisible = Standard_True); + Standard_EXPORT void TransferRoots (const Standard_Boolean onlyvisible = Standard_True, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfers an Entity given its rank in the Model (Root or not) //! Returns True if it is recognized as Geom-Topol. //! (But it can have failed : see IsDone) - Standard_EXPORT Standard_Boolean Transfer (const Standard_Integer num); + Standard_EXPORT Standard_Boolean Transfer (const Standard_Integer num, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Returns True if the LAST Transfer/TransferRoots was a success Standard_EXPORT Standard_Boolean IsDone() const; diff -Nru opencascade-7.4.1+dfsg1/src/Image/FILES opencascade-7.5.1+dfsg1/src/Image/FILES --- opencascade-7.4.1+dfsg1/src/Image/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,6 +1,10 @@ Image_AlienPixMap.cxx Image_AlienPixMap.hxx Image_Color.hxx +Image_CompressedFormat.hxx +Image_CompressedPixMap.hxx +Image_DDSParser.cxx +Image_DDSParser.hxx Image_Diff.cxx Image_Diff.hxx Image_Format.hxx @@ -8,6 +12,8 @@ Image_PixMap.hxx Image_PixMapData.hxx Image_PixMapTypedData.hxx +Image_SupportedFormats.cxx +Image_SupportedFormats.hxx Image_Texture.cxx Image_Texture.hxx Image_VideoRecorder.cxx diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_AlienPixMap.cxx opencascade-7.5.1+dfsg1/src/Image/Image_AlienPixMap.cxx --- opencascade-7.4.1+dfsg1/src/Image/Image_AlienPixMap.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_AlienPixMap.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -548,8 +548,7 @@ } if ((aFIF == FIF_UNKNOWN) || !FreeImage_FIFSupportsReading (aFIF)) { - ::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image '") + theImagePath + "' has unsupported file format.", - Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: image '") + theImagePath + "' has unsupported file format"); if (aFiMem != NULL) { FreeImage_CloseMemory (aFiMem); @@ -586,28 +585,38 @@ } if (anImage == NULL) { - TCollection_AsciiString aMessage = "Error: image file '"; - aMessage.AssignCat (theImagePath); - aMessage.AssignCat ("' is missing or invalid."); - ::Message::DefaultMessenger()->Send (aMessage, Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: image file '") + theImagePath + "' is missing or invalid"); return false; } + Image_Format aFormat = Image_Format_UNKNOWN; if (FreeImage_GetBPP (anImage) == 1) { FIBITMAP* aTmpImage = FreeImage_ConvertTo8Bits (anImage); FreeImage_Unload (anImage); anImage = aTmpImage; } - - Image_Format aFormat = convertFromFreeFormat (FreeImage_GetImageType(anImage), - FreeImage_GetColorType(anImage), - FreeImage_GetBPP (anImage)); + if (anImage != NULL) + { + aFormat = convertFromFreeFormat (FreeImage_GetImageType(anImage), + FreeImage_GetColorType(anImage), + FreeImage_GetBPP (anImage)); + if (aFormat == Image_Format_UNKNOWN) + { + FIBITMAP* aTmpImage = FreeImage_ConvertTo24Bits (anImage); + FreeImage_Unload (anImage); + anImage = aTmpImage; + if (anImage != NULL) + { + aFormat = convertFromFreeFormat (FreeImage_GetImageType(anImage), + FreeImage_GetColorType(anImage), + FreeImage_GetBPP (anImage)); + } + } + } if (aFormat == Image_Format_UNKNOWN) { - //anImage = FreeImage_ConvertTo24Bits (anImage); - ::Message::DefaultMessenger()->Send ( TCollection_AsciiString ("Error: image '") + theImagePath + "' has unsupported pixel format.", - Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: image '") + theImagePath + "' has unsupported pixel format"); return false; } @@ -636,8 +645,7 @@ } if ((aFIF == FIF_UNKNOWN) || !FreeImage_FIFSupportsReading (aFIF)) { - ::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image stream '") + theFileName + "' has unsupported file format.", - Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: image stream '") + theFileName + "' has unsupported file format"); return false; } @@ -656,8 +664,7 @@ FIBITMAP* anImage = FreeImage_LoadFromHandle (aFIF, &aFiIO, &aStream, aLoadFlags); if (anImage == NULL) { - ::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image stream '") + theFileName + "' is missing or invalid.", - Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: image stream '") + theFileName + "' is missing or invalid"); return false; } @@ -666,8 +673,7 @@ FreeImage_GetBPP (anImage)); if (aFormat == Image_Format_UNKNOWN) { - ::Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: image stream '") + theFileName + "' has unsupported pixel format.", - Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: image stream '") + theFileName + "' has unsupported pixel format"); return false; } @@ -691,7 +697,7 @@ CoInitializeEx (NULL, COINIT_MULTITHREADED); if (CoCreateInstance (CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&aWicImgFactory.ChangePtr())) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot initialize WIC Imaging Factory", Message_Fail); + Message::SendFail ("Error: cannot initialize WIC Imaging Factory"); return false; } @@ -702,12 +708,12 @@ if (aWicImgFactory->CreateStream (&aWicStream.ChangePtr()) != S_OK || aWicStream->InitializeFromMemory ((BYTE* )theData, (DWORD )theLength) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot initialize WIC Stream", Message_Fail); + Message::SendFail ("Error: cannot initialize WIC Stream"); return false; } if (aWicImgFactory->CreateDecoderFromStream (aWicStream.get(), NULL, WICDecodeMetadataCacheOnDemand, &aWicDecoder.ChangePtr()) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot create WIC Image Decoder", Message_Fail); + Message::SendFail ("Error: cannot create WIC Image Decoder"); return false; } } @@ -716,7 +722,7 @@ const TCollection_ExtendedString aFileNameW (theFileName); if (aWicImgFactory->CreateDecoderFromFilename (aFileNameW.ToWideString(), NULL, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &aWicDecoder.ChangePtr()) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot create WIC Image Decoder", Message_Fail); + Message::SendFail ("Error: cannot create WIC Image Decoder"); return false; } } @@ -730,7 +736,7 @@ || aWicFrameDecode->GetSize (&aFrameSizeX, &aFrameSizeY) != S_OK || aWicFrameDecode->GetPixelFormat (&aWicPixelFormat)) { - Message::DefaultMessenger()->Send ("Error: cannot get WIC Image Frame", Message_Fail); + Message::SendFail ("Error: cannot get WIC Image Frame"); return false; } @@ -742,7 +748,7 @@ if (aWicImgFactory->CreateFormatConverter (&aWicConvertedFrame.ChangePtr()) != S_OK || aWicConvertedFrame->Initialize (aWicFrameDecode.get(), convertToWicFormat (aPixelFormat), WICBitmapDitherTypeNone, NULL, 0.0f, WICBitmapPaletteTypeCustom) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot convert WIC Image Frame to RGB format", Message_Fail); + Message::SendFail ("Error: cannot convert WIC Image Frame to RGB format"); return false; } aWicFrameDecode.Nullify(); @@ -750,7 +756,7 @@ if (!Image_PixMap::InitTrash (aPixelFormat, aFrameSizeX, aFrameSizeY)) { - Message::DefaultMessenger()->Send ("Error: cannot initialize memory for image", Message_Fail); + Message::SendFail ("Error: cannot initialize memory for image"); return false; } @@ -761,7 +767,7 @@ } if (aWicSrc->CopyPixels (NULL, (UINT )SizeRowBytes(), (UINT )SizeBytes(), ChangeData()) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot copy pixels from WIC Image", Message_Fail); + Message::SendFail ("Error: cannot copy pixels from WIC Image"); return false; } SetTopDown (true); @@ -779,14 +785,14 @@ theStream.seekg (aStart); if (aLen <= 0) { - Message::DefaultMessenger()->Send ("Error: empty stream", Message_Fail); + Message::SendFail ("Error: empty stream"); return false; } NCollection_Array1 aBuff (1, aLen); if (!theStream.read ((char* )&aBuff.ChangeFirst(), aBuff.Size())) { - Message::DefaultMessenger()->Send ("Error: unable to read stream", Message_Fail); + Message::SendFail ("Error: unable to read stream"); return false; } @@ -797,7 +803,7 @@ const TCollection_AsciiString& ) { Clear(); - Message::DefaultMessenger()->Send ("Error: no image library available", Message_Fail); + Message::SendFail ("Error: no image library available"); return false; } bool Image_AlienPixMap::Load (const Standard_Byte* , @@ -805,7 +811,7 @@ const TCollection_AsciiString& ) { Clear(); - Message::DefaultMessenger()->Send ("Error: no image library available", Message_Fail); + Message::SendFail ("Error: no image library available"); return false; } #endif @@ -1045,7 +1051,7 @@ if (aFileFormat == getNullGuid()) { - Message::DefaultMessenger()->Send ("Error: unsupported image format", Message_Fail); + Message::SendFail ("Error: unsupported image format"); return false; } @@ -1053,7 +1059,7 @@ CoInitializeEx (NULL, COINIT_MULTITHREADED); if (CoCreateInstance (CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&aWicImgFactory.ChangePtr())) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot initialize WIC Imaging Factory", Message_Fail); + Message::SendFail ("Error: cannot initialize WIC Imaging Factory"); return false; } @@ -1063,20 +1069,20 @@ if (aWicImgFactory->CreateStream (&aWicFileStream.ChangePtr()) != S_OK || aWicFileStream->InitializeFromFilename (aFileNameW.ToWideString(), GENERIC_WRITE) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot create WIC File Stream", Message_Fail); + Message::SendFail ("Error: cannot create WIC File Stream"); return false; } if (aWicImgFactory->CreateEncoder (aFileFormat, NULL, &aWicEncoder.ChangePtr()) != S_OK || aWicEncoder->Initialize (aWicFileStream.get(), WICBitmapEncoderNoCache) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot create WIC Encoder", Message_Fail); + Message::SendFail ("Error: cannot create WIC Encoder"); return false; } const WICPixelFormatGUID aWicPixelFormat = convertToWicFormat (myImgFormat); if (aWicPixelFormat == getNullGuid()) { - Message::DefaultMessenger()->Send ("Error: unsupported pixel format", Message_Fail); + Message::SendFail ("Error: unsupported pixel format"); return false; } @@ -1087,13 +1093,13 @@ || aWicFrameEncode->SetSize ((UINT )SizeX(), (UINT )SizeY()) != S_OK || aWicFrameEncode->SetPixelFormat (&aWicPixelFormatRes) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot create WIC Frame", Message_Fail); + Message::SendFail ("Error: cannot create WIC Frame"); return false; } if (aWicPixelFormatRes != aWicPixelFormat) { - Message::DefaultMessenger()->Send ("Error: pixel format is unsupported by image format", Message_Fail); + Message::SendFail ("Error: pixel format is unsupported by image format"); return false; } @@ -1101,7 +1107,7 @@ { if (aWicFrameEncode->WritePixels ((UINT )SizeY(), (UINT )SizeRowBytes(), (UINT )SizeBytes(), (BYTE* )Data()) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot write pixels to WIC Frame", Message_Fail); + Message::SendFail ("Error: cannot write pixels to WIC Frame"); return false; } } @@ -1111,7 +1117,7 @@ { if (aWicFrameEncode->WritePixels (1, (UINT )SizeRowBytes(), (UINT )SizeRowBytes(), (BYTE* )Row (aRow)) != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot write pixels to WIC Frame", Message_Fail); + Message::SendFail ("Error: cannot write pixels to WIC Frame"); return false; } } @@ -1120,12 +1126,12 @@ if (aWicFrameEncode->Commit() != S_OK || aWicEncoder->Commit() != S_OK) { - Message::DefaultMessenger()->Send ("Error: cannot commit data to WIC Frame", Message_Fail); + Message::SendFail ("Error: cannot commit data to WIC Frame"); return false; } if (aWicFileStream->Commit (STGC_DEFAULT) != S_OK) { - //Message::DefaultMessenger()->Send ("Error: cannot commit data to WIC File Stream", Message_Fail); + //Message::Send ("Error: cannot commit data to WIC File Stream", Message_Fail); //return false; } return true; @@ -1136,9 +1142,7 @@ { return savePPM (theFileName); } -#ifdef OCCT_DEBUG - std::cerr << "Image_PixMap, no image library available! Image saved in PPM format.\n"; -#endif + Message::SendTrace ("Image_PixMap, no image library available! Image saved in PPM format"); return savePPM (theFileName); #endif } diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_Color.hxx opencascade-7.5.1+dfsg1/src/Image/Image_Color.hxx --- opencascade-7.4.1+dfsg1/src/Image/Image_Color.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_Color.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -266,6 +266,31 @@ }; +//! POD structure for packed float RG color value (2 floats) +struct Image_ColorRGF +{ + //! Component type. + typedef Standard_ShortReal ComponentType_t; + + //! Returns the number of components. + static Standard_Integer Length() { return 2; } + + //! Alias to 1st component (red intensity). + Standard_ShortReal r() const { return v[0]; } + + //! Alias to 2nd component (green intensity). + Standard_ShortReal g() const { return v[1]; } + + //! Alias to 1st component (red intensity). + Standard_ShortReal& r() { return v[0]; } + + //! Alias to 2nd component (green intensity). + Standard_ShortReal& g() { return v[1]; } + +public: + Standard_ShortReal v[2]; +}; + //! POD structure for packed float RGB color value (3 floats) struct Image_ColorRGBF { diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_CompressedFormat.hxx opencascade-7.5.1+dfsg1/src/Image/Image_CompressedFormat.hxx --- opencascade-7.4.1+dfsg1/src/Image/Image_CompressedFormat.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_CompressedFormat.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,31 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Image_CompressedFormat_HeaderFile +#define _Image_CompressedFormat_HeaderFile + +#include + +//! List of compressed pixel formats natively supported by various graphics hardware (e.g. for efficient decoding on-the-fly). +//! It is defined as extension of Image_Format. +enum Image_CompressedFormat +{ + Image_CompressedFormat_UNKNOWN = Image_Format_UNKNOWN, + Image_CompressedFormat_RGB_S3TC_DXT1 = Image_Format_NB, + Image_CompressedFormat_RGBA_S3TC_DXT1, + Image_CompressedFormat_RGBA_S3TC_DXT3, + Image_CompressedFormat_RGBA_S3TC_DXT5 +}; +enum { Image_CompressedFormat_NB = Image_CompressedFormat_RGBA_S3TC_DXT5 + 1 }; + +#endif // _Image_CompressedFormat_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_CompressedPixMap.hxx opencascade-7.5.1+dfsg1/src/Image/Image_CompressedPixMap.hxx --- opencascade-7.4.1+dfsg1/src/Image/Image_CompressedPixMap.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_CompressedPixMap.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,108 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Image_CompressedPixMap_HeaderFile +#define _Image_CompressedPixMap_HeaderFile + +#include +#include +#include +#include +#include + +//! Compressed pixmap data definition. +//! It is defined independently from Image_PixMap, which defines only uncompressed formats. +class Image_CompressedPixMap : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(Image_CompressedPixMap, Standard_Transient) +public: + + //! Return base (uncompressed) pixel format. + Image_Format BaseFormat() const { return myBaseFormat; } + + //! Set base (uncompressed) pixel format. + void SetBaseFormat (Image_Format theFormat) { myBaseFormat = theFormat; } + + //! Return compressed format. + Image_CompressedFormat CompressedFormat() const { return myFormat; } + + //! Set compressed format. + void SetCompressedFormat (Image_CompressedFormat theFormat) { myFormat = theFormat; } + + //! Return raw (compressed) data. + const Handle(NCollection_Buffer)& FaceData() const { return myFaceData; } + + //! Set raw (compressed) data. + void SetFaceData (const Handle(NCollection_Buffer)& theBuffer) { myFaceData = theBuffer; } + + //! Return Array of mipmap sizes, including base level. + const NCollection_Array1& MipMaps() const { return myMipMaps; } + + //! Return Array of mipmap sizes, including base level. + NCollection_Array1& ChangeMipMaps() { return myMipMaps; } + + //! Return TRUE if complete mip map level set (up to 1x1 resolution). + Standard_Boolean IsCompleteMipMapSet() const { return myIsCompleteMips; } + + //! Set if complete mip map level set (up to 1x1 resolution). + void SetCompleteMipMapSet (Standard_Boolean theIsComplete) { myIsCompleteMips = theIsComplete; } + + //! Return surface length in bytes. + Standard_Size FaceBytes() const { return myFaceBytes; } + + //! Set surface length in bytes. + void SetFaceBytes (Standard_Size theSize) { myFaceBytes = theSize; } + + //! Return surface width. + Standard_Integer SizeX() const { return mySizeX; } + + //! Return surface height. + Standard_Integer SizeY() const { return mySizeY; } + + //! Set surface width x height. + void SetSize (Standard_Integer theSizeX, Standard_Integer theSizeY) + { + mySizeX = theSizeX; + mySizeY = theSizeY; + } + + //! Return TRUE if image layout is top-down (always true). + bool IsTopDown() const { return true; } + + //! Return number of faces in the file; should be 6 for cubemap. + Standard_Integer NbFaces() const { return myNbFaces; } + + //! Set number of faces in the file. + void SetNbFaces (Standard_Integer theSize) { myNbFaces = theSize; } + +public: + + //! Empty constructor. + Image_CompressedPixMap() + : myFaceBytes (0), myNbFaces (0), mySizeX (0), mySizeY (0), myBaseFormat (Image_Format_UNKNOWN), myFormat (Image_CompressedFormat_UNKNOWN), myIsCompleteMips (false) {} + +protected: + + NCollection_Array1 myMipMaps; //!< Array of mipmap sizes, including base level + Handle(NCollection_Buffer) myFaceData; //!< raw compressed data + Standard_Size myFaceBytes; //!< surface length in bytes + Standard_Integer myNbFaces; //!< number of faces in the file + Standard_Integer mySizeX; //!< surface width + Standard_Integer mySizeY; //!< surface height + Image_Format myBaseFormat; //!< base (uncompressed) pixel format + Image_CompressedFormat myFormat; //!< compressed format + Standard_Boolean myIsCompleteMips; //!< flag indicating complete mip map level set (up to 1x1 resolution) + +}; + +#endif // _Image_CompressedPixMap_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_DDSParser.cxx opencascade-7.5.1+dfsg1/src/Image/Image_DDSParser.cxx --- opencascade-7.4.1+dfsg1/src/Image/Image_DDSParser.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_DDSParser.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,255 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(Image_CompressedPixMap, Standard_Transient) + +//! DDS Pixel Format structure. +struct Image_DDSParser::DDSPixelFormat +{ + uint32_t Size; + uint32_t Flags; + uint32_t FourCC; + uint32_t RGBBitCount; + uint32_t RBitMask; + uint32_t GBitMask; + uint32_t BBitMask; + uint32_t ABitMask; +}; + +//! DDS File header structure. +struct Image_DDSParser::DDSFileHeader +{ + //! Caps2 flag indicating complete (6 faces) cubemap. + enum { DDSCompleteCubemap = 0xFE00 }; + + //! Return TRUE if cubmap flag is set. + bool IscompleteCubemap() const { return (Caps2 & DDSFileHeader::DDSCompleteCubemap) == DDSFileHeader::DDSCompleteCubemap; } + + uint32_t Size; + uint32_t Flags; + uint32_t Height; + uint32_t Width; + uint32_t PitchOrLinearSize; + uint32_t Depth; + uint32_t MipMapCount; + uint32_t Reserved1[11]; + DDSPixelFormat PixelFormatDef; + uint32_t Caps; + uint32_t Caps2; + uint32_t Caps3; + uint32_t Caps4; + uint32_t Reserved2; +}; + +// ======================================================================= +// function : Load +// purpose : +// ======================================================================= +Handle(Image_CompressedPixMap) Image_DDSParser::Load (const Handle(Image_SupportedFormats)& theSupported, + const TCollection_AsciiString& theFile, + const Standard_Integer theFaceIndex, + const int64_t theFileOffset) +{ + std::ifstream aFile; + OSD_OpenStream (aFile, theFile.ToCString(), std::ios::in | std::ios::binary); + + char aHeader[128] = {}; + if (!aFile.is_open() + || !aFile.good()) + { + return Handle(Image_CompressedPixMap)(); + } + if (theFileOffset != 0) + { + aFile.seekg ((std::streamoff )theFileOffset, std::ios::beg); + } + aFile.read (aHeader, 128); + Standard_Size aNbReadBytes = (Standard_Size )aFile.gcount(); + if (aNbReadBytes < 128 + || ::memcmp (aHeader, "DDS ", 4) != 0) + { + return Handle(Image_CompressedPixMap)(); + } + + Handle(Image_CompressedPixMap) aDef = parseHeader (*(const DDSFileHeader* )(aHeader + 4)); + if (aDef.IsNull()) + { + return Handle(Image_CompressedPixMap)(); + } + + if (!theSupported.IsNull() + && !theSupported->IsSupported (aDef->CompressedFormat())) + { + return Handle(Image_CompressedPixMap)(); + } + + if (theFaceIndex < 0) + { + return aDef; + } + + if (theFaceIndex >= aDef->NbFaces() + || aDef->FaceBytes() == 0) + { + Message::SendFail (TCollection_AsciiString ("DDS Reader error - invalid face index #") + theFaceIndex + " within file\n" + theFile); + return Handle(Image_CompressedPixMap)(); + } + + const Standard_Size anOffset = aDef->FaceBytes() * theFaceIndex; + if (anOffset != 0) + { + aFile.seekg ((std::streamoff )anOffset, std::ios::cur); + } + Handle(NCollection_Buffer) aBuffer = new NCollection_Buffer (Image_PixMap::DefaultAllocator(), aDef->FaceBytes()); + aFile.read ((char* )aBuffer->ChangeData(), aDef->FaceBytes()); + aNbReadBytes = (Standard_Size )aFile.gcount(); + if (aNbReadBytes < aDef->FaceBytes()) + { + Message::SendFail (TCollection_AsciiString ("DDS Reader error - unable to read face #") + theFaceIndex + " data from file\n" + theFile); + return Handle(Image_CompressedPixMap)(); + } + aDef->SetFaceData (aBuffer); + return aDef; +} + +// ======================================================================= +// function : Load +// purpose : +// ======================================================================= +Handle(Image_CompressedPixMap) Image_DDSParser::Load (const Handle(Image_SupportedFormats)& theSupported, + const Handle(NCollection_Buffer)& theBuffer, + const Standard_Integer theFaceIndex) +{ + if (theBuffer.IsNull() + || theBuffer->Size() < 128 + || ::memcmp (theBuffer->Data(), "DDS ", 4) != 0) + { + return Handle(Image_CompressedPixMap)(); + } + + Handle(Image_CompressedPixMap) aDef = parseHeader (*(const DDSFileHeader* )(theBuffer->Data() + 4)); + if (aDef.IsNull()) + { + return Handle(Image_CompressedPixMap)(); + } + + if (!theSupported.IsNull() + && !theSupported->IsSupported (aDef->CompressedFormat())) + { + return Handle(Image_CompressedPixMap)(); + } + + if (theFaceIndex < 0) + { + return aDef; + } + + if (theFaceIndex >= aDef->NbFaces() + || aDef->FaceBytes() == 0) + { + Message::SendFail (TCollection_AsciiString ("DDS Reader error - invalid face index #") + theFaceIndex + " within buffer"); + return Handle(Image_CompressedPixMap)(); + } + + const Standard_Size anOffset = aDef->FaceBytes() * theFaceIndex + 128; + if (theBuffer->Size() < anOffset + aDef->FaceBytes()) + { + Message::SendFail (TCollection_AsciiString ("DDS Reader error - unable to read face #") + theFaceIndex + " data from buffer"); + return Handle(Image_CompressedPixMap)(); + } + + Handle(NCollection_Buffer) aBuffer = new NCollection_Buffer (Image_PixMap::DefaultAllocator(), aDef->FaceBytes()); + memcpy (aBuffer->ChangeData(), theBuffer->Data() + anOffset, aDef->FaceBytes()); + aDef->SetFaceData (aBuffer); + return aDef; +} + +// ======================================================================= +// function : parseHeader +// purpose : +// ======================================================================= +Handle(Image_CompressedPixMap) Image_DDSParser::parseHeader (const DDSFileHeader& theHeader) +{ + if (theHeader.Size != 124 + || theHeader.Width == 0 + || theHeader.Height == 0 + || theHeader.PixelFormatDef.Size != 32) + { + return Handle(Image_CompressedPixMap)(); + } + + Image_Format aBaseFormat = Image_Format_UNKNOWN; + Image_CompressedFormat aFormat = Image_CompressedFormat_UNKNOWN; + Standard_Integer aBlockSize = 8; + const bool hasAlpha = (theHeader.PixelFormatDef.Flags & 0x1) != 0; + if (::memcmp (&theHeader.PixelFormatDef.FourCC, "DXT5", 4) == 0) + { + aBaseFormat = Image_Format_RGBA; + aFormat = Image_CompressedFormat_RGBA_S3TC_DXT5; + aBlockSize = 16; + } + else if (::memcmp (&theHeader.PixelFormatDef.FourCC, "DXT3", 4) == 0) + { + aBaseFormat = Image_Format_RGBA; + aFormat = Image_CompressedFormat_RGBA_S3TC_DXT3; + aBlockSize = 16; + } + else if (::memcmp (&theHeader.PixelFormatDef.FourCC, "DXT1", 4) == 0) + { + aBaseFormat = hasAlpha ? Image_Format_RGBA : Image_Format_RGB; + aFormat = hasAlpha ? Image_CompressedFormat_RGBA_S3TC_DXT1 : Image_CompressedFormat_RGB_S3TC_DXT1; + aBlockSize = 8; + } + if (aFormat == Image_CompressedFormat_UNKNOWN) + { + return Handle(Image_CompressedPixMap)(); + } + + Handle(Image_CompressedPixMap) aDef = new Image_CompressedPixMap(); + aDef->SetSize ((Standard_Integer )theHeader.Width, (Standard_Integer )theHeader.Height); + aDef->SetNbFaces (theHeader.IscompleteCubemap() != 0 ? 6 : 1); + aDef->SetBaseFormat (aBaseFormat); + aDef->SetCompressedFormat (aFormat); + + const Standard_Integer aNbMipMaps = Max ((Standard_Integer )theHeader.MipMapCount, 1); + aDef->ChangeMipMaps().Resize (0, aNbMipMaps - 1, false); + { + Standard_Size aFaceSize = 0; + NCollection_Vec2 aMipSizeXY (aDef->SizeX(), aDef->SizeY()); + for (Standard_Integer aMipIter = 0;; ++aMipIter) + { + const Standard_Integer aMipLength = ((aMipSizeXY.x() + 3) / 4) * ((aMipSizeXY.y() + 3) / 4) * aBlockSize; + aFaceSize += aMipLength; + aDef->ChangeMipMaps().SetValue (aMipIter, aMipLength); + if (aMipIter + 1 >= aNbMipMaps) + { + break; + } + + aMipSizeXY /= 2; + if (aMipSizeXY.x() == 0) { aMipSizeXY.x() = 1; } + if (aMipSizeXY.y() == 0) { aMipSizeXY.y() = 1; } + } + aDef->SetCompleteMipMapSet (aMipSizeXY.x() == 1 && aMipSizeXY.y() == 1); + aDef->SetFaceBytes (aFaceSize); + } + + return aDef; +} diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_DDSParser.hxx opencascade-7.5.1+dfsg1/src/Image/Image_DDSParser.hxx --- opencascade-7.4.1+dfsg1/src/Image/Image_DDSParser.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_DDSParser.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,62 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Image_DDSParser_HeaderFile +#define _Image_DDSParser_HeaderFile + +#include +#include + +class Image_SupportedFormats; + +//! Auxiliary tool for parsing DDS file structure (without decoding). +class Image_DDSParser +{ +public: + + //! Load the face from DDS file. + //! @param theSupported [in] list of supported image formats + //! @param theFile [in] file path + //! @param theFaceIndex [in] face index, within [0, Image_CompressedPixMap::NbFaces()) range; + //! use -1 to skip reading the face data + //! @param theFileOffset [in] offset to the DDS data + //! @return loaded face or NULL if file cannot be read or not valid DDS file + Standard_EXPORT static Handle(Image_CompressedPixMap) Load (const Handle(Image_SupportedFormats)& theSupported, + const TCollection_AsciiString& theFile, + const Standard_Integer theFaceIndex, + const int64_t theFileOffset = 0); + + //! Load the face from DDS file. + //! @param theSupported [in] list of supported image formats + //! @param theBuffer [in] pre-loaded file data, should be at least of 128 bytes long defining DDS header. + //! @param theFaceIndex [in] face index, within [0, Image_CompressedPixMap::NbFaces()) range; + //! use -1 to skip reading the face data + //! @return loaded face or NULL if file cannot be read or not valid DDS file + Standard_EXPORT static Handle(Image_CompressedPixMap) Load (const Handle(Image_SupportedFormats)& theSupported, + const Handle(NCollection_Buffer)& theBuffer, + const Standard_Integer theFaceIndex); + + +private: + + struct DDSPixelFormat; + struct DDSFileHeader; + +private: + + //! Parse DDS header. + static Handle(Image_CompressedPixMap) parseHeader (const DDSFileHeader& theHeader); + +}; + +#endif // _Image_DDSParser_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_Diff.cxx opencascade-7.5.1+dfsg1/src/Image/Image_Diff.cxx --- opencascade-7.4.1+dfsg1/src/Image/Image_Diff.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_Diff.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -111,13 +111,13 @@ || theImageRef->SizeY() != theImageNew->SizeY() || theImageRef->Format() != theImageNew->Format()) { - Message::DefaultMessenger()->Send ("Error: Images have different format or dimensions", Message_Fail); + Message::SendFail ("Error: Images have different format or dimensions"); return Standard_False; } else if (theImageRef->SizeX() >= 0xFFFF || theImageRef->SizeY() >= 0xFFFF) { - Message::DefaultMessenger()->Send ("Error: Images are too large", Message_Fail); + Message::SendFail ("Error: Images are too large"); return Standard_False; } @@ -144,7 +144,7 @@ if (!anImgRef->Load (theImgPathRef) || !anImgNew->Load (theImgPathNew)) { - Message::DefaultMessenger()->Send ("Error: Failed to load image(s) file(s)", Message_Fail); + Message::SendFail ("Error: Failed to load image(s) file(s)"); return Standard_False; } return Init (anImgRef, anImgNew, theToBlackWhite); diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_Format.hxx opencascade-7.5.1+dfsg1/src/Image/Image_Format.hxx --- opencascade-7.4.1+dfsg1/src/Image/Image_Format.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_Format.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,10 +28,12 @@ Image_Format_BGRA, //!< same as RGBA but with different components order Image_Format_GrayF, //!< 1 float (4-bytes) per pixel (1-component plane), intensity of the color Image_Format_AlphaF, //!< 1 float (4-bytes) per pixel (1-component plane), transparency + Image_Format_RGF, //!< 2 floats (8-bytes) RG image plane Image_Format_RGBF, //!< 3 floats (12-bytes) RGB image plane Image_Format_BGRF, //!< same as RGBF but with different components order Image_Format_RGBAF, //!< 4 floats (16-bytes) RGBA image plane Image_Format_BGRAF, //!< same as RGBAF but with different components order }; +enum { Image_Format_NB = Image_Format_BGRAF + 1 }; #endif // _Image_Format_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_PixMap.cxx opencascade-7.5.1+dfsg1/src/Image/Image_PixMap.cxx --- opencascade-7.4.1+dfsg1/src/Image/Image_PixMap.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_PixMap.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,6 +14,7 @@ // commercial license or contractual agreement. #include + #include #include @@ -22,6 +23,16 @@ IMPLEMENT_STANDARD_RTTIEXT(Image_PixMap,Standard_Transient) // ======================================================================= +// function : DefaultAllocator +// purpose : +// ======================================================================= +const Handle(NCollection_BaseAllocator)& Image_PixMap::DefaultAllocator() +{ + static const Handle(NCollection_BaseAllocator) THE_ALLOC = new NCollection_AlignedAllocator (16); + return THE_ALLOC; +} + +// ======================================================================= // function : Image_PixMap // purpose : // ======================================================================= @@ -40,6 +51,10 @@ Clear(); } +// ======================================================================= +// function : SizePixelBytes +// purpose : +// ======================================================================= Standard_Size Image_PixMap::SizePixelBytes (const Image_Format thePixelFormat) { switch (thePixelFormat) @@ -47,6 +62,8 @@ case Image_Format_GrayF: case Image_Format_AlphaF: return sizeof(float); + case Image_Format_RGF: + return sizeof(float) * 2; case Image_Format_RGBAF: case Image_Format_BGRAF: return sizeof(float) * 4; @@ -133,8 +150,7 @@ // use argument only if it greater const Standard_Size aSizeRowBytes = std::max (theSizeRowBytes, theSizeX * SizePixelBytes (thePixelFormat)); - Handle(NCollection_BaseAllocator) anAlloc = new NCollection_AlignedAllocator (16); - myData.Init (anAlloc, Image_PixMap::SizePixelBytes (thePixelFormat), + myData.Init (DefaultAllocator(), Image_PixMap::SizePixelBytes (thePixelFormat), theSizeX, theSizeY, aSizeRowBytes, NULL); return !myData.IsEmpty(); } @@ -192,7 +208,8 @@ // purpose : // ======================================================================= Quantity_ColorRGBA Image_PixMap::PixelColor (const Standard_Integer theX, - const Standard_Integer theY) const + const Standard_Integer theY, + const Standard_Boolean theToLinearize) const { if (IsEmpty() || theX < 0 || (Standard_Size )theX >= SizeX() @@ -213,6 +230,11 @@ const Standard_ShortReal& aPixel = Value (theY, theX); return Quantity_ColorRGBA (NCollection_Vec4 (1.0f, 1.0f, 1.0f, aPixel)); } + case Image_Format_RGF: + { + const Image_ColorRGF& aPixel = Value (theY, theX); + return Quantity_ColorRGBA (NCollection_Vec4 (aPixel.r(), aPixel.g(), 0.0f, 1.0f)); + } case Image_Format_RGBAF: { const Image_ColorRGBAF& aPixel = Value (theY, theX); @@ -236,32 +258,58 @@ case Image_Format_RGBA: { const Image_ColorRGBA& aPixel = Value (theY, theX); - return Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, float(aPixel.a()) / 255.0f); + return theToLinearize + ? Quantity_ColorRGBA (Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.r()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.g()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.b()) / 255.0f), + float(aPixel.a()) / 255.0f) + : Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, float(aPixel.a()) / 255.0f); } case Image_Format_BGRA: { const Image_ColorBGRA& aPixel = Value (theY, theX); - return Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, float(aPixel.a()) / 255.0f); + return theToLinearize + ? Quantity_ColorRGBA (Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.r()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.g()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.b()) / 255.0f), + float(aPixel.a()) / 255.0f) + : Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, float(aPixel.a()) / 255.0f); } case Image_Format_RGB32: { const Image_ColorRGB32& aPixel = Value (theY, theX); - return Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, 1.0f); // opaque + return theToLinearize + ? Quantity_ColorRGBA (Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.r()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.g()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.b()) / 255.0f), 1.0f) + : Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, 1.0f); } case Image_Format_BGR32: { const Image_ColorBGR32& aPixel = Value (theY, theX); - return Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, 1.0f); // opaque + return theToLinearize + ? Quantity_ColorRGBA (Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.r()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.g()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.b()) / 255.0f), 1.0f) + : Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, 1.0f); } case Image_Format_RGB: { const Image_ColorRGB& aPixel = Value (theY, theX); - return Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, 1.0f); // opaque + return theToLinearize + ? Quantity_ColorRGBA (Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.r()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.g()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.b()) / 255.0f), 1.0f) + : Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, 1.0f); } case Image_Format_BGR: { const Image_ColorBGR& aPixel = Value (theY, theX); - return Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, 1.0f); // opaque + return theToLinearize + ? Quantity_ColorRGBA (Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.r()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.g()) / 255.0f), + Quantity_Color::Convert_sRGB_To_LinearRGB (float(aPixel.b()) / 255.0f), 1.0f) + : Quantity_ColorRGBA (float(aPixel.r()) / 255.0f, float(aPixel.g()) / 255.0f, float(aPixel.b()) / 255.0f, 1.0f); } case Image_Format_Gray: { @@ -289,7 +337,8 @@ // ======================================================================= void Image_PixMap::SetPixelColor (const Standard_Integer theX, const Standard_Integer theY, - const Quantity_ColorRGBA& theColor) + const Quantity_ColorRGBA& theColor, + const Standard_Boolean theToDeLinearize) { if (IsEmpty() || theX < 0 || Standard_Size(theX) >= SizeX() @@ -311,6 +360,13 @@ ChangeValue (theY, theX) = aColor.a(); return; } + case Image_Format_RGF: + { + Image_ColorRGF& aPixel = ChangeValue (theY, theX); + aPixel.r() = aColor.r(); + aPixel.g() = aColor.g(); + return; + } case Image_Format_RGBAF: { Image_ColorRGBAF& aPixel = ChangeValue (theY, theX); @@ -348,53 +404,107 @@ case Image_Format_RGBA: { Image_ColorRGBA& aPixel = ChangeValue (theY, theX); - aPixel.r() = Standard_Byte(aColor.r() * 255.0f); - aPixel.g() = Standard_Byte(aColor.g() * 255.0f); - aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + if (theToDeLinearize) + { + aPixel.r() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.r()) * 255.0f); + aPixel.g() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.g()) * 255.0f); + aPixel.b() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.b()) * 255.0f); + } + else + { + aPixel.r() = Standard_Byte(aColor.r() * 255.0f); + aPixel.g() = Standard_Byte(aColor.g() * 255.0f); + aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + } aPixel.a() = Standard_Byte(aColor.a() * 255.0f); return; } case Image_Format_BGRA: { Image_ColorBGRA& aPixel = ChangeValue (theY, theX); - aPixel.r() = Standard_Byte(aColor.r() * 255.0f); - aPixel.g() = Standard_Byte(aColor.g() * 255.0f); - aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + if (theToDeLinearize) + { + aPixel.r() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.r()) * 255.0f); + aPixel.g() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.g()) * 255.0f); + aPixel.b() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.b()) * 255.0f); + } + else + { + aPixel.r() = Standard_Byte(aColor.r() * 255.0f); + aPixel.g() = Standard_Byte(aColor.g() * 255.0f); + aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + } aPixel.a() = Standard_Byte(aColor.a() * 255.0f); return; } case Image_Format_RGB32: { Image_ColorRGB32& aPixel = ChangeValue (theY, theX); - aPixel.r() = Standard_Byte(aColor.r() * 255.0f); - aPixel.g() = Standard_Byte(aColor.g() * 255.0f); - aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + if (theToDeLinearize) + { + aPixel.r() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.r()) * 255.0f); + aPixel.g() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.g()) * 255.0f); + aPixel.b() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.b()) * 255.0f); + } + else + { + aPixel.r() = Standard_Byte(aColor.r() * 255.0f); + aPixel.g() = Standard_Byte(aColor.g() * 255.0f); + aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + } aPixel.a_() = 255; return; } case Image_Format_BGR32: { Image_ColorBGR32& aPixel = ChangeValue (theY, theX); - aPixel.r() = Standard_Byte(aColor.r() * 255.0f); - aPixel.g() = Standard_Byte(aColor.g() * 255.0f); - aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + if (theToDeLinearize) + { + aPixel.r() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.r()) * 255.0f); + aPixel.g() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.g()) * 255.0f); + aPixel.b() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.b()) * 255.0f); + } + else + { + aPixel.r() = Standard_Byte(aColor.r() * 255.0f); + aPixel.g() = Standard_Byte(aColor.g() * 255.0f); + aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + } aPixel.a_() = 255; return; } case Image_Format_RGB: { Image_ColorRGB& aPixel = ChangeValue (theY, theX); - aPixel.r() = Standard_Byte(aColor.r() * 255.0f); - aPixel.g() = Standard_Byte(aColor.g() * 255.0f); - aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + if (theToDeLinearize) + { + aPixel.r() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.r()) * 255.0f); + aPixel.g() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.g()) * 255.0f); + aPixel.b() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.b()) * 255.0f); + } + else + { + aPixel.r() = Standard_Byte(aColor.r() * 255.0f); + aPixel.g() = Standard_Byte(aColor.g() * 255.0f); + aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + } return; } case Image_Format_BGR: { Image_ColorBGR& aPixel = ChangeValue (theY, theX); - aPixel.r() = Standard_Byte(aColor.r() * 255.0f); - aPixel.g() = Standard_Byte(aColor.g() * 255.0f); - aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + if (theToDeLinearize) + { + aPixel.r() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.r()) * 255.0f); + aPixel.g() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.g()) * 255.0f); + aPixel.b() = Standard_Byte(Quantity_Color::Convert_LinearRGB_To_sRGB (aColor.b()) * 255.0f); + } + else + { + aPixel.r() = Standard_Byte(aColor.r() * 255.0f); + aPixel.g() = Standard_Byte(aColor.g() * 255.0f); + aPixel.b() = Standard_Byte(aColor.b() * 255.0f); + } return; } case Image_Format_Gray: diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_PixMapData.hxx opencascade-7.5.1+dfsg1/src/Image/Image_PixMapData.hxx --- opencascade-7.4.1+dfsg1/src/Image/Image_PixMapData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_PixMapData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -74,27 +74,27 @@ //! @return data pointer to requested row (first column). inline const Standard_Byte* Row (const Standard_Size theRow) const { - return myTopRowPtr + SizeRowBytes * theRow * TopToDown; + return myTopRowPtr + ptrdiff_t(SizeRowBytes * theRow * TopToDown); } //! @return data pointer to requested row (first column). inline Standard_Byte* ChangeRow (const Standard_Size theRow) { - return myTopRowPtr + SizeRowBytes * theRow * TopToDown; + return myTopRowPtr + ptrdiff_t(SizeRowBytes * theRow * TopToDown); } //! @return data pointer to requested position. inline const Standard_Byte* Value (const Standard_Size theRow, const Standard_Size theCol) const { - return myTopRowPtr + SizeRowBytes * theRow * TopToDown + SizeBPP * theCol; + return myTopRowPtr + ptrdiff_t(SizeRowBytes * theRow * TopToDown) + SizeBPP * theCol; } //! @return data pointer to requested position. inline Standard_Byte* ChangeValue (const Standard_Size theRow, const Standard_Size theCol) { - return myTopRowPtr + SizeRowBytes * theRow * TopToDown + SizeBPP * theCol; + return myTopRowPtr + ptrdiff_t(SizeRowBytes * theRow * TopToDown) + SizeBPP * theCol; } //! Compute the maximal row alignment for current row size. diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_PixMap.hxx opencascade-7.5.1+dfsg1/src/Image/Image_PixMap.hxx --- opencascade-7.4.1+dfsg1/src/Image/Image_PixMap.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_PixMap.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,6 +48,9 @@ //! Convert image to Black/White. Standard_EXPORT static void ToBlackWhite (Image_PixMap& theImage); + //! Return default image data allocator. + Standard_EXPORT static const Handle(NCollection_BaseAllocator)& DefaultAllocator(); + public: // high-level API Image_Format Format() const { return myImgFormat; } @@ -102,26 +105,38 @@ //! Returns the pixel color. This function is relatively slow. //! Beware that this method takes coordinates in opposite order in contrast to ::Value() and ::ChangeValue(). - //! @param theX column index from left - //! @param theY row index from top + //! @param theX [in] column index from left + //! @param theY [in] row index from top + //! @param theToLinearize [in] when TRUE, the color stored in non-linear color space (e.g. Image_Format_RGB) will be linearized //! @return the pixel color Standard_EXPORT Quantity_ColorRGBA PixelColor (const Standard_Integer theX, - const Standard_Integer theY) const; + const Standard_Integer theY, + const Standard_Boolean theToLinearize = Standard_False) const; //! Sets the pixel color. This function is relatively slow. //! Beware that this method takes coordinates in opposite order in contrast to ::Value() and ::ChangeValue(). + //! @param theX [in] column index from left + //! @param theY [in] row index from top + //! @param theColor [in] color to store + //! @param theToDeLinearize [in] when TRUE, the gamma correction will be applied for storing in non-linear color space (e.g. Image_Format_RGB) void SetPixelColor (const Standard_Integer theX, const Standard_Integer theY, - const Quantity_Color& theColor) + const Quantity_Color& theColor, + const Standard_Boolean theToDeLinearize = Standard_False) { - SetPixelColor (theX, theY, Quantity_ColorRGBA (theColor, 1.0f)); + SetPixelColor (theX, theY, Quantity_ColorRGBA (theColor, 1.0f), theToDeLinearize); } //! Sets the pixel color. This function is relatively slow. //! Beware that this method takes coordinates in opposite order in contrast to ::Value() and ::ChangeValue(). + //! @param theX [in] column index from left + //! @param theY [in] row index from top + //! @param theColor [in] color to store + //! @param theToDeLinearize [in] when TRUE, the gamma correction will be applied for storing in non-linear color space (e.g. Image_Format_RGB) Standard_EXPORT void SetPixelColor (const Standard_Integer theX, const Standard_Integer theY, - const Quantity_ColorRGBA& theColor); + const Quantity_ColorRGBA& theColor, + const Standard_Boolean theToDeLinearize = Standard_False); //! Initialize image plane as wrapper over alien data. //! Data will not be copied! Notice that caller should ensure diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_SupportedFormats.cxx opencascade-7.5.1+dfsg1/src/Image/Image_SupportedFormats.cxx --- opencascade-7.4.1+dfsg1/src/Image/Image_SupportedFormats.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_SupportedFormats.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,27 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(Image_SupportedFormats, Standard_Transient) + +// ======================================================================= +// function : Image_SupportedFormats +// purpose : +// ======================================================================= +Image_SupportedFormats::Image_SupportedFormats() +: myFormats (Image_Format_UNKNOWN, Image_CompressedFormat_NB - 1), + myHasCompressed (false) +{ + myFormats.Init (false); +} diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_SupportedFormats.hxx opencascade-7.5.1+dfsg1/src/Image/Image_SupportedFormats.hxx --- opencascade-7.4.1+dfsg1/src/Image/Image_SupportedFormats.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_SupportedFormats.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,63 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Image_SupportedFormats_HeaderFile +#define _Image_SupportedFormats_HeaderFile + +#include +#include +#include + +//! Structure holding information about supported texture formats. +class Image_SupportedFormats : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(Image_SupportedFormats, Standard_Transient) +public: + + //! Empty constructor. + Standard_EXPORT Image_SupportedFormats(); + + //! Return TRUE if image format is supported. + bool IsSupported (Image_Format theFormat) const { return myFormats.Value (theFormat); } + + //! Set if image format is supported or not. + void Add (Image_Format theFormat) { myFormats.SetValue (theFormat, true); } + + //! Return TRUE if there are compressed image formats supported. + bool HasCompressed() const { return myHasCompressed; } + + //! Return TRUE if compressed image format is supported. + bool IsSupported (Image_CompressedFormat theFormat) const { return myFormats.Value (theFormat); } + + //! Set if compressed image format is supported or not. + void Add (Image_CompressedFormat theFormat) + { + myFormats.SetValue (theFormat, true); + myHasCompressed = true; + } + + //! Reset flags. + void Clear() + { + myFormats.Init (false); + myHasCompressed = false; + } + +protected: + + NCollection_Array1 myFormats; //!< list of supported formats + Standard_Boolean myHasCompressed; //!< flag indicating that some compressed image formats are supported + +}; + +#endif // _Image_SupportedFormats_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_Texture.cxx opencascade-7.5.1+dfsg1/src/Image/Image_Texture.cxx --- opencascade-7.4.1+dfsg1/src/Image/Image_Texture.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_Texture.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,6 +15,8 @@ #include #include +#include +#include #include #include #include @@ -74,10 +76,40 @@ } // ================================================================ +// Function : ReadCompressedImage +// Purpose : +// ================================================================ +Handle(Image_CompressedPixMap) Image_Texture::ReadCompressedImage (const Handle(Image_SupportedFormats)& theSupported) const +{ + if (!theSupported->HasCompressed()) + { + return Handle(Image_CompressedPixMap)(); + } + + if (!myBuffer.IsNull()) + { + return Image_DDSParser::Load (theSupported, myBuffer, 0); + } + else if (myOffset >= 0) + { + return Image_DDSParser::Load (theSupported, myImagePath, 0, myOffset); + } + + TCollection_AsciiString aFilePathLower = myImagePath; + aFilePathLower.LowerCase(); + if (!aFilePathLower.EndsWith (".dds")) + { + // do not waste time on file system access in case of wrong file extension + return Handle(Image_CompressedPixMap)(); + } + return Image_DDSParser::Load (theSupported, myImagePath, 0); +} + +// ================================================================ // Function : ReadImage // Purpose : // ================================================================ -Handle(Image_PixMap) Image_Texture::ReadImage() const +Handle(Image_PixMap) Image_Texture::ReadImage (const Handle(Image_SupportedFormats)& ) const { Handle(Image_PixMap) anImage; if (!myBuffer.IsNull()) @@ -127,7 +159,7 @@ } else if (theBuffer->Size() > (Standard_Size )IntegerLast()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: Image file size is too big '") + theId + "'.", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: Image file size is too big '") + theId + "'"); return Handle(Image_PixMap)(); } @@ -149,7 +181,7 @@ { if (theLength > IntegerLast()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: Image file size is too big '") + thePath + "'.", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: Image file size is too big '") + thePath + "'"); return Handle(Image_PixMap)(); } @@ -157,13 +189,13 @@ OSD_OpenStream (aFile, thePath.ToCString(), std::ios::in | std::ios::binary); if (!aFile) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: Image file '") + thePath + "' cannot be opened.", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: Image file '") + thePath + "' cannot be opened"); return Handle(Image_PixMap)(); } aFile.seekg ((std::streamoff )theOffset, std::ios_base::beg); if (!aFile.good()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: Image is defined with invalid file offset '") + thePath + "'.", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: Image is defined with invalid file offset '") + thePath + "'"); return Handle(Image_PixMap)(); } @@ -181,7 +213,7 @@ // ================================================================ TCollection_AsciiString Image_Texture::ProbeImageFileFormat() const { - static const int THE_PROBE_SIZE = 20; + static const Standard_Size THE_PROBE_SIZE = 20; char aBuffer[THE_PROBE_SIZE]; if (!myBuffer.IsNull()) { @@ -193,7 +225,7 @@ OSD_OpenStream (aFileIn, myImagePath.ToCString(), std::ios::in | std::ios::binary); if (!aFileIn) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: Unable to open file ") + myImagePath + "!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: Unable to open file '") + myImagePath + "'"); return false; } if (myOffset >= 0) @@ -201,14 +233,14 @@ aFileIn.seekg ((std::streamoff )myOffset, std::ios_base::beg); if (!aFileIn.good()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: Image is defined with invalid file offset '") + myImagePath + "'.", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: Image is defined with invalid file offset '") + myImagePath + "'"); return false; } } if (!aFileIn.read (aBuffer, THE_PROBE_SIZE)) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: unable to read image file '") + myImagePath + "'", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: unable to read image file '") + myImagePath + "'"); return false; } } @@ -240,6 +272,10 @@ { return "webp"; } + else if (memcmp (aBuffer, "DDS ", 4) == 0) + { + return "dds"; + } return ""; } @@ -256,7 +292,7 @@ OSD_OpenStream (aFileIn, myImagePath.ToCString(), std::ios::in | std::ios::binary); if (!aFileIn) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: Unable to open file ") + myImagePath + "!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: Unable to open file ") + myImagePath + "!"); return Standard_False; } @@ -266,7 +302,7 @@ aFileIn.seekg ((std::streamoff )myOffset, std::ios_base::beg); if (!aFileIn.good()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: Image is defined with invalid file offset '") + myImagePath + "'.", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: Image is defined with invalid file offset '") + myImagePath + "'"); return Standard_False; } } @@ -280,7 +316,7 @@ aBuffer = new NCollection_Buffer (NCollection_BaseAllocator::CommonBaseAllocator(), aLen); if (!aFileIn.read ((char* )aBuffer->ChangeData(), aBuffer->Size())) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: unable to read image file '") + myImagePath + "'", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: unable to read image file '") + myImagePath + "'"); return Standard_False; } } @@ -289,7 +325,7 @@ OSD_OpenStream (aFileOut, theFile.ToCString(), std::ios::out | std::ios::binary | std::ios::trunc); if (!aFileOut) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: Unable to create file ") + theFile + "!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: Unable to create file '") + theFile + "'"); return Standard_False; } @@ -297,8 +333,25 @@ aFileOut.close(); if (!aFileOut.good()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: Unable to write file ") + theFile + "!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: Unable to write file '") + theFile + "'"); return Standard_False; } return Standard_True; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Image_Texture::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myTextureId) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myImagePath) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myBuffer.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myOffset) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLength) +} diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_Texture.hxx opencascade-7.5.1+dfsg1/src/Image/Image_Texture.hxx --- opencascade-7.4.1+dfsg1/src/Image/Image_Texture.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_Texture.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,8 @@ #include #include +class Image_CompressedPixMap; +class Image_SupportedFormats; class Image_PixMap; //! Texture image definition. @@ -57,8 +59,11 @@ //! Return image file format. Standard_EXPORT TCollection_AsciiString ProbeImageFileFormat() const; + //! Image reader without decoding data for formats supported natively by GPUs. + Standard_EXPORT virtual Handle(Image_CompressedPixMap) ReadCompressedImage (const Handle(Image_SupportedFormats)& theSupported) const; + //! Image reader. - Standard_EXPORT virtual Handle(Image_PixMap) ReadImage() const; + Standard_EXPORT virtual Handle(Image_PixMap) ReadImage (const Handle(Image_SupportedFormats)& theSupported) const; //! Write image to specified file without decoding data. Standard_EXPORT virtual Standard_Boolean WriteImage (const TCollection_AsciiString& theFile); @@ -87,6 +92,9 @@ } return theTex1->myTextureId.IsEqual (theTex2->myTextureId); } + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Image/Image_VideoRecorder.cxx opencascade-7.5.1+dfsg1/src/Image/Image_VideoRecorder.cxx --- opencascade-7.4.1+dfsg1/src/Image/Image_VideoRecorder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Image/Image_VideoRecorder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -178,7 +178,7 @@ avformat_alloc_output_context2 (&myAVContext, NULL, theParams.Format.IsEmpty() ? NULL : theParams.Format.ToCString(), theFileName); if (myAVContext == NULL) { - ::Message::DefaultMessenger()->Send ("ViewerTest_VideoRecorder, could not deduce output format from file extension", Message_Fail); + ::Message::SendFail ("ViewerTest_VideoRecorder, could not deduce output format from file extension"); return Standard_False; } @@ -206,8 +206,7 @@ const int aResAv = avio_open (&myAVContext->pb, theFileName, AVIO_FLAG_WRITE); if (aResAv < 0) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: could not open '") + theFileName + "', " + formatAvError (aResAv); - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: could not open '") + theFileName + "', " + formatAvError (aResAv)); Close(); return Standard_False; } @@ -217,8 +216,7 @@ const int aResAv = avformat_write_header (myAVContext, NULL); if (aResAv < 0) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: can not open output file '") + theFileName + "', " + formatAvError (aResAv); - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: can not open output file '") + theFileName + "', " + formatAvError (aResAv)); Close(); return Standard_False; } @@ -254,8 +252,7 @@ } if (myVideoCodec == NULL) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: can not find encoder for ") + aCodecName; - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: can not find encoder for ") + aCodecName); return Standard_False; } @@ -263,8 +260,7 @@ myVideoStream = avformat_new_stream (myAVContext, myVideoCodec); if (myVideoStream == NULL) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: can not allocate stream!"); - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail ("Error: can not allocate stream"); return Standard_False; } myVideoStream->id = myAVContext->nb_streams - 1; @@ -357,8 +353,7 @@ const AVPixelFormat aPixFormat = av_get_pix_fmt (theParams.PixelFormat.ToCString()); if (aPixFormat == AV_PIX_FMT_NONE) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: unknown pixel format has been specified '") + theParams.PixelFormat + "'"; - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: unknown pixel format has been specified '") + theParams.PixelFormat + "'"); return Standard_False; } @@ -378,8 +373,7 @@ } if (aResAv < 0) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: can not open video codec, ") + formatAvError (aResAv); - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: can not open video codec, ") + formatAvError (aResAv)); return Standard_False; } @@ -387,8 +381,7 @@ myFrame = av_frame_alloc(); if (myFrame == NULL) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: can not allocate video frame!"); - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail ("Error: can not allocate video frame"); return Standard_False; } @@ -399,9 +392,8 @@ { memset (myFrame->data, 0, sizeof(myFrame->data)); memset (myFrame->linesize, 0, sizeof(myFrame->linesize)); - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: can not allocate picture ") - + aCodecCtx->width+ "x" + aCodecCtx->height + ", " + formatAvError (aResAv); - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: can not allocate picture ") + + aCodecCtx->width+ "x" + aCodecCtx->height + ", " + formatAvError (aResAv)); return Standard_False; } // copy data and linesize picture pointers to frame @@ -412,9 +404,8 @@ const Standard_Size aStride = aCodecCtx->width + 16 - (aCodecCtx->width % 16); if (!myImgSrcRgba.InitZero (Image_PixMap::ImgRGBA, aCodecCtx->width, aCodecCtx->height, aStride)) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: can not allocate RGBA32 picture ") - + aCodecCtx->width+ "x" + aCodecCtx->height; - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: can not allocate RGBA32 picture ") + + aCodecCtx->width+ "x" + aCodecCtx->height); return Standard_False; } @@ -423,8 +414,7 @@ SWS_BICUBIC, NULL, NULL, NULL); if (myScaleCtx == NULL) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: can not initialize the conversion context!"); - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail ("Error: can not initialize the conversion context"); return Standard_False; } return Standard_True; @@ -463,8 +453,7 @@ aResAv = avcodec_encode_video2 (aCodecCtx, &aPacket, theToFlush ? NULL : myFrame, &isGotPacket); if (aResAv < 0) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: can not encode video frame, ") + formatAvError (aResAv); - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: can not encode video frame, ") + formatAvError (aResAv)); return Standard_False; } @@ -490,8 +479,7 @@ if (aResAv < 0) { - const TCollection_AsciiString aMsg = TCollection_AsciiString ("Error: can not write video frame, ") + formatAvError (aResAv); - ::Message::DefaultMessenger()->Send (aMsg, Message_Fail); + ::Message::SendFail (TCollection_AsciiString ("Error: can not write video frame, ") + formatAvError (aResAv)); return Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/FILES opencascade-7.5.1+dfsg1/src/IMeshData/FILES --- opencascade-7.4.1+dfsg1/src/IMeshData/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,13 +1,22 @@ IMeshData_Curve.hxx +IMeshData_Curve.cxx IMeshData_Edge.hxx +IMeshData_Edge.cxx IMeshData_Face.hxx +IMeshData_Face.cxx IMeshData_Model.hxx +IMeshData_Model.cxx IMeshData_ParametersList.hxx +IMeshData_ParametersList.cxx IMeshData_ParametersListArrayAdaptor.hxx IMeshData_PCurve.hxx +IMeshData_PCurve.cxx IMeshData_Shape.hxx +IMeshData_Shape.cxx IMeshData_Status.hxx IMeshData_StatusOwner.hxx IMeshData_TessellatedShape.hxx +IMeshData_TessellatedShape.cxx IMeshData_Types.hxx IMeshData_Wire.hxx +IMeshData_Wire.cxx diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Curve.cxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Curve.cxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Curve.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Curve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshData_Curve, IMeshData_ParametersList) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Curve.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Curve.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Curve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Curve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,7 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshData_Curve() + virtual ~IMeshData_Curve() { } @@ -49,12 +49,12 @@ //! Removes point with the given index. Standard_EXPORT virtual void RemovePoint (const Standard_Integer theIndex) = 0; - DEFINE_STANDARD_RTTI_INLINE(IMeshData_Curve, IMeshData_ParametersList) + DEFINE_STANDARD_RTTIEXT(IMeshData_Curve, IMeshData_ParametersList) protected: //! Constructor. - Standard_EXPORT IMeshData_Curve() + IMeshData_Curve() { } }; diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Edge.cxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Edge.cxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Edge.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Edge.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshData_Edge, IMeshData_TessellatedShape) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Edge.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Edge.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Edge.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Edge.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,12 +34,12 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshData_Edge() + virtual ~IMeshData_Edge() { } //! Returns TopoDS_Edge attached to model. - inline const TopoDS_Edge& GetEdge () const + const TopoDS_Edge& GetEdge () const { return TopoDS::Edge (GetShape ()); } @@ -62,7 +62,7 @@ const Standard_Integer theIndex) const = 0; //! Clears curve and all pcurves assigned to the edge from discretization. - inline void Clear(const Standard_Boolean isKeepEndPoints) + void Clear(const Standard_Boolean isKeepEndPoints) { myCurve->Clear(isKeepEndPoints); for (Standard_Integer aPCurveIt = 0; aPCurveIt < PCurvesNb(); ++aPCurveIt) @@ -72,81 +72,81 @@ } //! Returns true in case if the edge is free one, i.e. it does not have pcurves. - inline Standard_Boolean IsFree () const + Standard_Boolean IsFree () const { return (PCurvesNb () == 0); } //! Sets 3d curve associated with current edge. - inline void SetCurve (const IMeshData::ICurveHandle& theCurve) + void SetCurve (const IMeshData::ICurveHandle& theCurve) { myCurve = theCurve; } //! Returns 3d curve associated with current edge. - inline const IMeshData::ICurveHandle& GetCurve () const + const IMeshData::ICurveHandle& GetCurve () const { return myCurve; } //! Gets value of angular deflection for the discrete model. - inline Standard_Real GetAngularDeflection () const + Standard_Real GetAngularDeflection () const { return myAngDeflection; } //! Sets value of angular deflection for the discrete model. - inline void SetAngularDeflection (const Standard_Real theValue) + void SetAngularDeflection (const Standard_Real theValue) { myAngDeflection = theValue; } //! Returns same param flag. //! By default equals to flag stored in topological shape. - inline Standard_Boolean GetSameParam () const + Standard_Boolean GetSameParam () const { return mySameParam; } //! Updates same param flag. - inline void SetSameParam (const Standard_Boolean theValue) + void SetSameParam (const Standard_Boolean theValue) { mySameParam = theValue; } //! Returns same range flag. //! By default equals to flag stored in topological shape. - inline Standard_Boolean GetSameRange () const + Standard_Boolean GetSameRange () const { return mySameRange; } //! Updates same range flag. - inline void SetSameRange (const Standard_Boolean theValue) + void SetSameRange (const Standard_Boolean theValue) { mySameRange = theValue; } //! Returns degenerative flag. //! By default equals to flag stored in topological shape. - inline Standard_Boolean GetDegenerated () const + Standard_Boolean GetDegenerated () const { return myDegenerated; } //! Updates degenerative flag. - inline void SetDegenerated (const Standard_Boolean theValue) + void SetDegenerated (const Standard_Boolean theValue) { myDegenerated = theValue; } - DEFINE_STANDARD_RTTI_INLINE(IMeshData_Edge, IMeshData_TessellatedShape) + DEFINE_STANDARD_RTTIEXT(IMeshData_Edge, IMeshData_TessellatedShape) protected: //! Constructor. //! Initializes empty model. - Standard_EXPORT IMeshData_Edge (const TopoDS_Edge& theEdge) + IMeshData_Edge (const TopoDS_Edge& theEdge) : IMeshData_TessellatedShape(theEdge), mySameParam (BRep_Tool::SameParameter(theEdge)), mySameRange (BRep_Tool::SameRange (theEdge)), diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Face.cxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Face.cxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Face.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Face.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshData_Face, IMeshData_TessellatedShape) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Face.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Face.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Face.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Face.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,7 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshData_Face() + virtual ~IMeshData_Face() { } @@ -53,32 +53,32 @@ const Standard_Integer theIndex) const = 0; //! Returns face's surface. - inline const Handle(BRepAdaptor_HSurface)& GetSurface() const + const Handle(BRepAdaptor_HSurface)& GetSurface() const { return mySurface; } //! Returns TopoDS_Face attached to model. - inline const TopoDS_Face& GetFace () const + const TopoDS_Face& GetFace () const { return TopoDS::Face (GetShape ()); } //! Returns whether the face discrete model is valid. - inline Standard_Boolean IsValid () const + Standard_Boolean IsValid () const { return (IsEqual(IMeshData_NoError) || IsEqual(IMeshData_ReMesh) || IsEqual(IMeshData_UnorientedWire)); } - DEFINE_STANDARD_RTTI_INLINE(IMeshData_Face, IMeshData_TessellatedShape) + DEFINE_STANDARD_RTTIEXT(IMeshData_Face, IMeshData_TessellatedShape) protected: //! Constructor. //! Initializes empty model. - Standard_EXPORT IMeshData_Face (const TopoDS_Face& theFace) + IMeshData_Face (const TopoDS_Face& theFace) : IMeshData_TessellatedShape(theFace) { BRepAdaptor_Surface aSurfAdaptor(GetFace(), Standard_False); diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Model.cxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Model.cxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Model.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Model.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshData_Model, IMeshData_Shape) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Model.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Model.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Model.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Model.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,14 +32,14 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshData_Model() + virtual ~IMeshData_Model() { } //! Returns maximum size of shape model. Standard_EXPORT virtual Standard_Real GetMaxSize () const = 0; - DEFINE_STANDARD_RTTI_INLINE(IMeshData_Model, IMeshData_Shape) + DEFINE_STANDARD_RTTIEXT(IMeshData_Model, IMeshData_Shape) public: //! @name discrete faces @@ -67,7 +67,7 @@ //! Constructor. //! Initializes empty model. - Standard_EXPORT IMeshData_Model (const TopoDS_Shape& theShape) + IMeshData_Model (const TopoDS_Shape& theShape) : IMeshData_Shape(theShape) { } diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_ParametersListArrayAdaptor.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_ParametersListArrayAdaptor.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_ParametersListArrayAdaptor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_ParametersListArrayAdaptor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,31 +28,31 @@ public: //! Constructor. Initializes tool by the given parameters. - Standard_EXPORT IMeshData_ParametersListArrayAdaptor( + IMeshData_ParametersListArrayAdaptor( const ParametersListPtrType& theParameters) : myParameters (theParameters) { } //! Destructor. - Standard_EXPORT virtual ~IMeshData_ParametersListArrayAdaptor() + virtual ~IMeshData_ParametersListArrayAdaptor() { } //! Returns lower index in parameters array. - Standard_EXPORT Standard_Integer Lower() const + Standard_Integer Lower() const { return 0; } //! Returns upper index in parameters array. - Standard_EXPORT Standard_Integer Upper() const + Standard_Integer Upper() const { return myParameters->ParametersNb() - 1; } //! Returns value of the given index. - Standard_EXPORT Standard_Real Value(const Standard_Integer theIndex) const + Standard_Real Value(const Standard_Integer theIndex) const { return myParameters->GetParameter(theIndex); } diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_ParametersList.cxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_ParametersList.cxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_ParametersList.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_ParametersList.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshData_ParametersList, Standard_Transient) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_ParametersList.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_ParametersList.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_ParametersList.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_ParametersList.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,7 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshData_ParametersList() + virtual ~IMeshData_ParametersList() { } @@ -38,12 +38,12 @@ //! Clears parameters list. Standard_EXPORT virtual void Clear(const Standard_Boolean isKeepEndPoints) = 0; - DEFINE_STANDARD_RTTI_INLINE(IMeshData_ParametersList, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(IMeshData_ParametersList, Standard_Transient) protected: //! Constructor. - Standard_EXPORT IMeshData_ParametersList() + IMeshData_ParametersList() { } diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_PCurve.cxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_PCurve.cxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_PCurve.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_PCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshData_PCurve, IMeshData_ParametersList) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_PCurve.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_PCurve.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_PCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_PCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,7 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshData_PCurve() + virtual ~IMeshData_PCurve() { } @@ -54,35 +54,35 @@ Standard_EXPORT virtual void RemovePoint (const Standard_Integer theIndex) = 0; //! Returns forward flag of this pcurve. - inline Standard_Boolean IsForward () const + Standard_Boolean IsForward () const { return (myOrientation != TopAbs_REVERSED); } //! Returns internal flag of this pcurve. - inline Standard_Boolean IsInternal() const + Standard_Boolean IsInternal() const { return (myOrientation == TopAbs_INTERNAL); } //! Returns orientation of the edge associated with current pcurve. - inline TopAbs_Orientation GetOrientation() const + TopAbs_Orientation GetOrientation() const { return myOrientation; } //! Returns discrete face pcurve is associated to. - inline const IMeshData::IFacePtr& GetFace () const + const IMeshData::IFacePtr& GetFace () const { return myDFace; } - DEFINE_STANDARD_RTTI_INLINE(IMeshData_PCurve, IMeshData_ParametersList) + DEFINE_STANDARD_RTTIEXT(IMeshData_PCurve, IMeshData_ParametersList) protected: //! Constructor. - Standard_EXPORT IMeshData_PCurve ( + IMeshData_PCurve ( const IMeshData::IFacePtr& theDFace, const TopAbs_Orientation theOrientation) : myDFace(theDFace), diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Shape.cxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Shape.cxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Shape.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Shape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshData_Shape, Standard_Transient) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Shape.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Shape.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Shape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Shape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,12 +27,12 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshData_Shape() + virtual ~IMeshData_Shape() { } //! Assigns shape to discrete shape. - inline void SetShape (const TopoDS_Shape& theShape) + void SetShape (const TopoDS_Shape& theShape) { myShape = theShape; } @@ -43,17 +43,17 @@ return myShape; } - DEFINE_STANDARD_RTTI_INLINE(IMeshData_Shape, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(IMeshData_Shape, Standard_Transient) protected: //! Constructor. - Standard_EXPORT IMeshData_Shape() + IMeshData_Shape() { } //! Constructor. - Standard_EXPORT IMeshData_Shape (const TopoDS_Shape& theShape) + IMeshData_Shape (const TopoDS_Shape& theShape) : myShape(theShape) { } diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Status.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Status.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Status.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Status.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,15 +19,16 @@ //! Enumerates statuses used to notify state of discrete model. enum IMeshData_Status { - IMeshData_NoError = 0x0, //!< Mesh generation is successful. - IMeshData_OpenWire = 0x1, //!< Notifies open wire problem, which can potentially lead to incorrect results. - IMeshData_SelfIntersectingWire = 0x2, //!< Notifies self-intersections on discretized wire, which can potentially lead to incorrect results. - IMeshData_Failure = 0x4, //!< Failed to generate mesh for some faces. - IMeshData_ReMesh = 0x8, //!< Deflection of some edges has been decreased due to interference of discrete model. - IMeshData_UnorientedWire = 0x10, //!< Notifies bad orientation of a wire, which can potentially lead to incorrect results. - IMeshData_TooFewPoints = 0x20, //!< Discrete model contains too few boundary points to generate mesh. - IMeshData_Outdated = 0x40, //!< Existing triangulation of some faces corresponds to greater deflection than specified by parameter. - IMeshData_Reused = 0x80 //!< Existing triangulation of some faces is reused as far as it fits specified deflection. + IMeshData_NoError = 0x0, //!< Mesh generation is successful. + IMeshData_OpenWire = 0x1, //!< Notifies open wire problem, which can potentially lead to incorrect results. + IMeshData_SelfIntersectingWire = 0x2, //!< Notifies self-intersections on discretized wire, which can potentially lead to incorrect results. + IMeshData_Failure = 0x4, //!< Failed to generate mesh for some faces. + IMeshData_ReMesh = 0x8, //!< Deflection of some edges has been decreased due to interference of discrete model. + IMeshData_UnorientedWire = 0x10, //!< Notifies bad orientation of a wire, which can potentially lead to incorrect results. + IMeshData_TooFewPoints = 0x20, //!< Discrete model contains too few boundary points to generate mesh. + IMeshData_Outdated = 0x40, //!< Existing triangulation of some faces corresponds to greater deflection than specified by parameter. + IMeshData_Reused = 0x80, //!< Existing triangulation of some faces is reused as far as it fits specified deflection. + IMeshData_UserBreak = 0x160 //!< User break }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_StatusOwner.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_StatusOwner.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_StatusOwner.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_StatusOwner.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,36 +26,36 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshData_StatusOwner() + virtual ~IMeshData_StatusOwner() { } //! Returns true in case if status is strictly equal to the given value. - inline Standard_Boolean IsEqual(const IMeshData_Status theValue) const + Standard_Boolean IsEqual(const IMeshData_Status theValue) const { return (myStatus == theValue); } //! Returns true in case if status is set. - inline Standard_Boolean IsSet(const IMeshData_Status theValue) const + Standard_Boolean IsSet(const IMeshData_Status theValue) const { return (myStatus & theValue) != 0; } //! Adds status to status flags of a face. - inline void SetStatus(const IMeshData_Status theValue) + void SetStatus(const IMeshData_Status theValue) { myStatus |= theValue; } //! Adds status to status flags of a face. - inline void UnsetStatus(const IMeshData_Status theValue) + void UnsetStatus(const IMeshData_Status theValue) { myStatus &= ~theValue; } //! Returns complete status mask. - inline Standard_Integer GetStatusMask() const + Standard_Integer GetStatusMask() const { return myStatus; } @@ -63,7 +63,7 @@ protected: //! Constructor. Initializes default status. - Standard_EXPORT IMeshData_StatusOwner() + IMeshData_StatusOwner() : myStatus(IMeshData_NoError) { } diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_TessellatedShape.cxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_TessellatedShape.cxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_TessellatedShape.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_TessellatedShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshData_TessellatedShape, IMeshData_Shape) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_TessellatedShape.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_TessellatedShape.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_TessellatedShape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_TessellatedShape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,34 +26,34 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshData_TessellatedShape() + virtual ~IMeshData_TessellatedShape() { } //! Gets deflection value for the discrete model. - inline Standard_Real GetDeflection () const + Standard_Real GetDeflection () const { return myDeflection; } //! Sets deflection value for the discrete model. - inline void SetDeflection (const Standard_Real theValue) + void SetDeflection (const Standard_Real theValue) { myDeflection = theValue; } - DEFINE_STANDARD_RTTI_INLINE(IMeshData_TessellatedShape, IMeshData_Shape) + DEFINE_STANDARD_RTTIEXT(IMeshData_TessellatedShape, IMeshData_Shape) protected: //! Constructor. - Standard_EXPORT IMeshData_TessellatedShape () + IMeshData_TessellatedShape () : myDeflection(RealLast()) { } //! Constructor. - Standard_EXPORT IMeshData_TessellatedShape (const TopoDS_Shape& theShape) + IMeshData_TessellatedShape (const TopoDS_Shape& theShape) : IMeshData_Shape(theShape), myDeflection(RealLast()) { diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Wire.cxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Wire.cxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Wire.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Wire.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshData_Wire, IMeshData_TessellatedShape) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Wire.hxx opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Wire.hxx --- opencascade-7.4.1+dfsg1/src/IMeshData/IMeshData_Wire.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshData/IMeshData_Wire.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,12 +32,12 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshData_Wire() + virtual ~IMeshData_Wire() { } //! Returns TopoDS_Face attached to model. - inline const TopoDS_Wire& GetWire () const + const TopoDS_Wire& GetWire () const { return TopoDS::Wire (GetShape ()); } @@ -59,13 +59,13 @@ Standard_EXPORT virtual TopAbs_Orientation GetEdgeOrientation ( const Standard_Integer theIndex) const = 0; - DEFINE_STANDARD_RTTI_INLINE(IMeshData_Wire, IMeshData_TessellatedShape) + DEFINE_STANDARD_RTTIEXT(IMeshData_Wire, IMeshData_TessellatedShape) protected: //! Constructor. //! Initializes empty model. - Standard_EXPORT IMeshData_Wire(const TopoDS_Wire& theWire) + IMeshData_Wire(const TopoDS_Wire& theWire) : IMeshData_TessellatedShape(theWire) { } diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/FILES opencascade-7.5.1+dfsg1/src/IMeshTools/FILES --- opencascade-7.4.1+dfsg1/src/IMeshTools/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,12 +1,20 @@ IMeshTools_Context.hxx +IMeshTools_Context.cxx IMeshTools_CurveTessellator.hxx +IMeshTools_CurveTessellator.cxx IMeshTools_MeshAlgo.hxx +IMeshTools_MeshAlgo.cxx IMeshTools_MeshAlgoFactory.hxx +IMeshTools_MeshAlgoFactory.cxx +IMeshTools_MeshAlgoType.hxx IMeshTools_MeshBuilder.hxx IMeshTools_MeshBuilder.cxx IMeshTools_ModelAlgo.hxx +IMeshTools_ModelAlgo.cxx IMeshTools_ModelBuilder.hxx +IMeshTools_ModelBuilder.cxx IMeshTools_Parameters.hxx IMeshTools_ShapeExplorer.hxx IMeshTools_ShapeExplorer.cxx IMeshTools_ShapeVisitor.hxx +IMeshTools_ShapeVisitor.cxx diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_Context.cxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_Context.cxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_Context.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_Context.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshTools_Context, IMeshData_Shape) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_Context.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_Context.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_Context.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_Context.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ #include #include #include +#include //! Interface class representing context of BRepMesh algorithm. //! Intended to cache discrete model and instances of tools for @@ -31,18 +32,18 @@ public: //! Constructor. - Standard_EXPORT IMeshTools_Context() + IMeshTools_Context() { } //! Destructor. - Standard_EXPORT virtual ~IMeshTools_Context() + virtual ~IMeshTools_Context() { } //! Builds model using assined model builder. //! @return True on success, False elsewhere. - Standard_EXPORT virtual Standard_Boolean BuildModel () + virtual Standard_Boolean BuildModel () { if (myModelBuilder.IsNull()) { @@ -56,7 +57,7 @@ //! Performs discretization of model edges using assigned edge discret algorithm. //! @return True on success, False elsewhere. - Standard_EXPORT virtual Standard_Boolean DiscretizeEdges() + virtual Standard_Boolean DiscretizeEdges() { if (myModel.IsNull() || myEdgeDiscret.IsNull()) { @@ -64,13 +65,13 @@ } // Discretize edges of a model. - return myEdgeDiscret->Perform(myModel, myParameters); + return myEdgeDiscret->Perform(myModel, myParameters, Message_ProgressRange()); } //! Performs healing of discrete model built by DiscretizeEdges() method //! using assigned healing algorithm. //! @return True on success, False elsewhere. - Standard_EXPORT virtual Standard_Boolean HealModel() + virtual Standard_Boolean HealModel() { if (myModel.IsNull()) { @@ -79,13 +80,13 @@ return myModelHealer.IsNull() ? Standard_True : - myModelHealer->Perform(myModel, myParameters); + myModelHealer->Perform (myModel, myParameters, Message_ProgressRange()); } //! Performs pre-processing of discrete model using assigned algorithm. //! Performs auxiliary actions such as cleaning shape from old triangulation. //! @return True on success, False elsewhere. - Standard_EXPORT virtual Standard_Boolean PreProcessModel() + virtual Standard_Boolean PreProcessModel() { if (myModel.IsNull()) { @@ -94,12 +95,12 @@ return myPreProcessor.IsNull() ? Standard_True : - myPreProcessor->Perform(myModel, myParameters); + myPreProcessor->Perform (myModel, myParameters, Message_ProgressRange()); } //! Performs meshing of faces of discrete model using assigned meshing algorithm. //! @return True on success, False elsewhere. - Standard_EXPORT virtual Standard_Boolean DiscretizeFaces() + virtual Standard_Boolean DiscretizeFaces (const Message_ProgressRange& theRange) { if (myModel.IsNull() || myFaceDiscret.IsNull()) { @@ -107,12 +108,12 @@ } // Discretize faces of a model. - return myFaceDiscret->Perform(myModel, myParameters); + return myFaceDiscret->Perform (myModel, myParameters, theRange); } //! Performs post-processing of discrete model using assigned algorithm. //! @return True on success, False elsewhere. - Standard_EXPORT virtual Standard_Boolean PostProcessModel() + virtual Standard_Boolean PostProcessModel() { if (myModel.IsNull()) { @@ -121,11 +122,11 @@ return myPostProcessor.IsNull() ? Standard_True : - myPostProcessor->Perform(myModel, myParameters); + myPostProcessor->Perform(myModel, myParameters, Message_ProgressRange()); } //! Cleans temporary context data. - Standard_EXPORT virtual void Clean() + virtual void Clean() { if (myParameters.CleanModel) { @@ -134,96 +135,96 @@ } //! Gets instance of a tool to be used to build discrete model. - inline const Handle (IMeshTools_ModelBuilder)& GetModelBuilder () const + const Handle (IMeshTools_ModelBuilder)& GetModelBuilder () const { return myModelBuilder; } //! Sets instance of a tool to be used to build discrete model. - inline void SetModelBuilder (const Handle (IMeshTools_ModelBuilder)& theBuilder) + void SetModelBuilder (const Handle (IMeshTools_ModelBuilder)& theBuilder) { myModelBuilder = theBuilder; } //! Gets instance of a tool to be used to discretize edges of a model. - inline const Handle (IMeshTools_ModelAlgo)& GetEdgeDiscret () const + const Handle (IMeshTools_ModelAlgo)& GetEdgeDiscret () const { return myEdgeDiscret; } //! Sets instance of a tool to be used to discretize edges of a model. - inline void SetEdgeDiscret (const Handle (IMeshTools_ModelAlgo)& theEdgeDiscret) + void SetEdgeDiscret (const Handle (IMeshTools_ModelAlgo)& theEdgeDiscret) { myEdgeDiscret = theEdgeDiscret; } //! Gets instance of a tool to be used to heal discrete model. - inline const Handle(IMeshTools_ModelAlgo)& GetModelHealer() const + const Handle(IMeshTools_ModelAlgo)& GetModelHealer() const { return myModelHealer; } //! Sets instance of a tool to be used to heal discrete model. - inline void SetModelHealer(const Handle(IMeshTools_ModelAlgo)& theModelHealer) + void SetModelHealer(const Handle(IMeshTools_ModelAlgo)& theModelHealer) { myModelHealer = theModelHealer; } //! Gets instance of pre-processing algorithm. - inline const Handle(IMeshTools_ModelAlgo)& GetPreProcessor() const + const Handle(IMeshTools_ModelAlgo)& GetPreProcessor() const { return myPreProcessor; } //! Sets instance of pre-processing algorithm. - inline void SetPreProcessor(const Handle(IMeshTools_ModelAlgo)& thePreProcessor) + void SetPreProcessor(const Handle(IMeshTools_ModelAlgo)& thePreProcessor) { myPreProcessor = thePreProcessor; } //! Gets instance of meshing algorithm. - inline const Handle(IMeshTools_ModelAlgo)& GetFaceDiscret() const + const Handle(IMeshTools_ModelAlgo)& GetFaceDiscret() const { return myFaceDiscret; } //! Sets instance of meshing algorithm. - inline void SetFaceDiscret(const Handle(IMeshTools_ModelAlgo)& theFaceDiscret) + void SetFaceDiscret(const Handle(IMeshTools_ModelAlgo)& theFaceDiscret) { myFaceDiscret = theFaceDiscret; } //! Gets instance of post-processing algorithm. - inline const Handle(IMeshTools_ModelAlgo)& GetPostProcessor() const + const Handle(IMeshTools_ModelAlgo)& GetPostProcessor() const { return myPostProcessor; } //! Sets instance of post-processing algorithm. - inline void SetPostProcessor(const Handle(IMeshTools_ModelAlgo)& thePostProcessor) + void SetPostProcessor(const Handle(IMeshTools_ModelAlgo)& thePostProcessor) { myPostProcessor = thePostProcessor; } //! Gets parameters to be used for meshing. - inline const IMeshTools_Parameters& GetParameters () const + const IMeshTools_Parameters& GetParameters () const { return myParameters; } //! Gets reference to parameters to be used for meshing. - inline IMeshTools_Parameters& ChangeParameters () + IMeshTools_Parameters& ChangeParameters () { return myParameters; } //! Returns discrete model of a shape. - inline const Handle (IMeshData_Model)& GetModel () const + const Handle (IMeshData_Model)& GetModel () const { return myModel; } - DEFINE_STANDARD_RTTI_INLINE(IMeshTools_Context, IMeshData_Shape) + DEFINE_STANDARD_RTTIEXT(IMeshTools_Context, IMeshData_Shape) private: diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_CurveTessellator.cxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_CurveTessellator.cxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_CurveTessellator.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_CurveTessellator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshTools_CurveTessellator, Standard_Transient) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_CurveTessellator.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_CurveTessellator.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_CurveTessellator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_CurveTessellator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,7 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshTools_CurveTessellator() + virtual ~IMeshTools_CurveTessellator() { } @@ -44,12 +44,12 @@ gp_Pnt& thePoint, Standard_Real& theParameter) const = 0; - DEFINE_STANDARD_RTTI_INLINE(IMeshTools_CurveTessellator, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(IMeshTools_CurveTessellator, Standard_Transient) protected: //! Constructor. - Standard_EXPORT IMeshTools_CurveTessellator() + IMeshTools_CurveTessellator() { } }; diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgo.cxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgo.cxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgo.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshTools_MeshAlgo, Standard_Transient) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoFactory.cxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoFactory.cxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoFactory.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoFactory.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshTools_MeshAlgoFactory, Standard_Transient) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoFactory.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoFactory.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoFactory.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoFactory.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,7 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshTools_MeshAlgoFactory() + virtual ~IMeshTools_MeshAlgoFactory() { } @@ -39,12 +39,12 @@ const GeomAbs_SurfaceType theSurfaceType, const IMeshTools_Parameters& theParameters) const = 0; - DEFINE_STANDARD_RTTI_INLINE(IMeshTools_MeshAlgoFactory, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(IMeshTools_MeshAlgoFactory, Standard_Transient) protected: //! Constructor. - Standard_EXPORT IMeshTools_MeshAlgoFactory() + IMeshTools_MeshAlgoFactory() { } }; diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgo.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgo.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,7 @@ #include #include #include +#include struct IMeshTools_Parameters; @@ -28,21 +29,22 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshTools_MeshAlgo() + virtual ~IMeshTools_MeshAlgo() { } //! Performs processing of the given face. Standard_EXPORT virtual void Perform( const IMeshData::IFaceHandle& theDFace, - const IMeshTools_Parameters& theParameters) = 0; + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) = 0; - DEFINE_STANDARD_RTTI_INLINE(IMeshTools_MeshAlgo, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(IMeshTools_MeshAlgo, Standard_Transient) protected: //! Constructor. - Standard_EXPORT IMeshTools_MeshAlgo() + IMeshTools_MeshAlgo() { } }; diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoType.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoType.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoType.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshAlgoType.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,25 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _IMeshTools_MeshAlgoType_HeaderFile +#define _IMeshTools_MeshAlgoType_HeaderFile + +//! Enumerates built-in meshing algorithms factories implementing IMeshTools_MeshAlgoFactory interface. +enum IMeshTools_MeshAlgoType +{ + IMeshTools_MeshAlgoType_DEFAULT = -1, //!< use global default (IMeshTools_MeshAlgoType_Watson or CSF_MeshAlgo) + IMeshTools_MeshAlgoType_Watson = 0, //!< generate 2D Delaunay triangulation based on Watson algorithm (BRepMesh_MeshAlgoFactory) + IMeshTools_MeshAlgoType_Delabella, //!< generate 2D Delaunay triangulation based on Delabella algorithm (BRepMesh_DelabellaMeshAlgoFactory) +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshBuilder.cxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshBuilder.cxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(IMeshTools_MeshBuilder, Message_Algorithm) + //======================================================================= // Function: Constructor // Purpose : @@ -47,7 +49,7 @@ // Function: Perform // Purpose : //======================================================================= -void IMeshTools_MeshBuilder::Perform () +void IMeshTools_MeshBuilder::Perform (const Message_ProgressRange& theRange) { ClearStatus (); @@ -58,6 +60,8 @@ return; } + Message_ProgressScope aPS(theRange, "Mesh Perform", 10); + if (aContext->BuildModel ()) { if (aContext->DiscretizeEdges ()) @@ -66,7 +70,7 @@ { if (aContext->PreProcessModel()) { - if (aContext->DiscretizeFaces()) + if (aContext->DiscretizeFaces(aPS.Next(9))) { if (aContext->PostProcessModel()) { @@ -79,6 +83,12 @@ } else { + if (!aPS.More()) + { + SetStatus(Message_Fail8); + aContext->Clean(); + return; + } SetStatus(Message_Fail6); } } @@ -113,6 +123,6 @@ Message_Warn1 : Message_Fail2); } } - + aPS.Next(1); aContext->Clean (); } diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshBuilder.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshBuilder.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_MeshBuilder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_MeshBuilder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,7 @@ #include #include #include +#include //! Builds mesh for each face of shape without triangulation. //! In case if some faces of shape have already been triangulated @@ -50,21 +51,21 @@ Standard_EXPORT virtual ~IMeshTools_MeshBuilder(); //! Sets context for algorithm. - inline void SetContext (const Handle (IMeshTools_Context)& theContext) + void SetContext (const Handle (IMeshTools_Context)& theContext) { myContext = theContext; } //! Gets context of algorithm. - inline const Handle (IMeshTools_Context)& GetContext () const + const Handle (IMeshTools_Context)& GetContext () const { return myContext; } //! Performs meshing ot the shape using current context. - Standard_EXPORT virtual void Perform (); + Standard_EXPORT virtual void Perform (const Message_ProgressRange& theRange); - DEFINE_STANDARD_RTTI_INLINE(IMeshTools_MeshBuilder, Message_Algorithm) + DEFINE_STANDARD_RTTIEXT(IMeshTools_MeshBuilder, Message_Algorithm) private: diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ModelAlgo.cxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ModelAlgo.cxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ModelAlgo.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ModelAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshTools_ModelAlgo, Standard_Transient) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ModelAlgo.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ModelAlgo.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ModelAlgo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ModelAlgo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,7 @@ #include #include #include +#include class IMeshData_Model; struct IMeshTools_Parameters; @@ -30,20 +31,21 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshTools_ModelAlgo() + virtual ~IMeshTools_ModelAlgo() { } //! Exceptions protected processing of the given model. Standard_Boolean Perform ( const Handle (IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) { try { OCC_CATCH_SIGNALS - return performInternal (theModel, theParameters); + return performInternal (theModel, theParameters, theRange); } catch (Standard_Failure const&) { @@ -51,19 +53,20 @@ } } - DEFINE_STANDARD_RTTI_INLINE(IMeshTools_ModelAlgo, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(IMeshTools_ModelAlgo, Standard_Transient) protected: //! Constructor. - Standard_EXPORT IMeshTools_ModelAlgo() + IMeshTools_ModelAlgo() { } //! Performs processing of the given model. Standard_EXPORT virtual Standard_Boolean performInternal ( const Handle (IMeshData_Model)& theModel, - const IMeshTools_Parameters& theParameters) = 0; + const IMeshTools_Parameters& theParameters, + const Message_ProgressRange& theRange) = 0; }; #endif \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ModelBuilder.cxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ModelBuilder.cxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ModelBuilder.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ModelBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshTools_ModelBuilder, Message_Algorithm) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ModelBuilder.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ModelBuilder.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ModelBuilder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ModelBuilder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,8 +21,8 @@ #include #include #include +#include -class IMeshData_Model; struct IMeshTools_Parameters; //! Interface class represents API for tool building discrete model. @@ -36,7 +36,7 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshTools_ModelBuilder() + virtual ~IMeshTools_ModelBuilder() { } @@ -61,12 +61,12 @@ } } - DEFINE_STANDARD_RTTI_INLINE(IMeshTools_ModelBuilder, Message_Algorithm) + DEFINE_STANDARD_RTTIEXT(IMeshTools_ModelBuilder, Message_Algorithm) protected: //! Constructor. - Standard_EXPORT IMeshTools_ModelBuilder() + IMeshTools_ModelBuilder() { } diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_Parameters.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_Parameters.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_Parameters.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_Parameters.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ #ifndef _IMeshTools_Parameters_HeaderFile #define _IMeshTools_Parameters_HeaderFile +#include #include //! Structure storing meshing parameters @@ -24,6 +25,7 @@ //! Default constructor IMeshTools_Parameters () : + MeshAlgo (IMeshTools_MeshAlgoType_DEFAULT), Angle(0.5), Deflection(0.001), AngleInterior(-1.0), @@ -34,7 +36,9 @@ InternalVerticesMode (Standard_True), ControlSurfaceDeflection (Standard_True), CleanModel (Standard_True), - AdjustMinSize (Standard_False) + AdjustMinSize (Standard_False), + ForceFaceDeflection (Standard_False), + AllowQualityDecrease (Standard_False) { } @@ -45,6 +49,9 @@ return 0.1; } + //! 2D Delaunay triangulation algorithm factory to use + IMeshTools_MeshAlgoType MeshAlgo; + //! Angular deflection used to tessellate the boundary edges Standard_Real Angle; @@ -57,7 +64,8 @@ //! Linear deflection used to tessellate the face interior Standard_Real DeflectionInterior; - //! Minimal allowed size of mesh element + //! Minimum size parameter limiting size of triangle's edges to prevent + //! sinking into amplification in case of distorted curves and surfaces. Standard_Real MinSize; //! Switches on/off multi-thread computation @@ -83,6 +91,14 @@ //! Enables/disables local adjustment of min size depending on edge size. //! Disabled by default. Standard_Boolean AdjustMinSize; + + //! Enables/disables usage of shape tolerances for computing face deflection. + //! Disabled by default. + Standard_Boolean ForceFaceDeflection; + + //! Allows/forbids the decrease of the quality of the generated mesh + //! over the existing one. + Standard_Boolean AllowQualityDecrease; }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ShapeExplorer.cxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ShapeExplorer.cxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ShapeExplorer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ShapeExplorer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(IMeshTools_ShapeExplorer, IMeshData_Shape) + namespace { //======================================================================= @@ -34,6 +36,7 @@ //======================================================================= void visitEdges (const Handle (IMeshTools_ShapeVisitor)& theVisitor, const TopoDS_Shape& theShape, + const Standard_Boolean isResetLocation, const TopAbs_ShapeEnum theToFind, const TopAbs_ShapeEnum theToAvoid = TopAbs_SHAPE) { @@ -46,7 +49,9 @@ continue; } - theVisitor->Visit (aEdge); + theVisitor->Visit (isResetLocation ? + TopoDS::Edge (aEdge.Located (TopLoc_Location ())) : + aEdge); } } } @@ -77,7 +82,7 @@ const Handle (IMeshTools_ShapeVisitor)& theVisitor) { // Explore all free edges in shape. - visitEdges (theVisitor, GetShape (), TopAbs_EDGE, TopAbs_FACE); + visitEdges (theVisitor, GetShape (), Standard_True, TopAbs_EDGE, TopAbs_FACE); // Explore all related to some face edges in shape. // make array of faces suitable for processing (excluding faces without surface) @@ -85,7 +90,6 @@ BRepLib::ReverseSortFaces (GetShape (), aFaceList); TopTools_MapOfShape aFaceMap; - TopLoc_Location aDummyLoc; const TopLoc_Location aEmptyLoc; TopTools_ListIteratorOfListOfShape aFaceIter (aFaceList); for (; aFaceIter.More (); aFaceIter.Next ()) @@ -98,14 +102,13 @@ } const TopoDS_Face& aFace = TopoDS::Face (aFaceIter.Value ()); - const Handle (Geom_Surface)& aSurf = BRep_Tool::Surface (aFace, aDummyLoc); - if (aSurf.IsNull()) + if (!BRep_Tool::IsGeometric (aFace)) { continue; } // Explore all edges in face. - visitEdges (theVisitor, aFace, TopAbs_EDGE); + visitEdges (theVisitor, aFace, Standard_False, TopAbs_EDGE); // Store only forward faces in order to prevent inverse issue. theVisitor->Visit (TopoDS::Face (aFace.Oriented (TopAbs_FORWARD))); diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ShapeExplorer.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ShapeExplorer.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ShapeExplorer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ShapeExplorer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,7 +35,7 @@ //! Starts exploring of a shape. Standard_EXPORT virtual void Accept (const Handle (IMeshTools_ShapeVisitor)& theVisitor); - DEFINE_STANDARD_RTTI_INLINE(IMeshTools_ShapeExplorer, IMeshData_Shape) + DEFINE_STANDARD_RTTIEXT(IMeshTools_ShapeExplorer, IMeshData_Shape) }; #endif \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ShapeVisitor.cxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ShapeVisitor.cxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ShapeVisitor.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ShapeVisitor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,18 @@ +// Created on: 2020-09-28 +// Copyright (c) 2020 OPEN CASCADE SAS +// Created by: Maria KRYLOVA +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(IMeshTools_ShapeVisitor, Standard_Transient) \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ShapeVisitor.hxx opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ShapeVisitor.hxx --- opencascade-7.4.1+dfsg1/src/IMeshTools/IMeshTools_ShapeVisitor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IMeshTools/IMeshTools_ShapeVisitor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,7 @@ public: //! Destructor. - Standard_EXPORT virtual ~IMeshTools_ShapeVisitor() + virtual ~IMeshTools_ShapeVisitor() { } @@ -38,12 +38,12 @@ //! Handles TopoDS_Edge object. Standard_EXPORT virtual void Visit (const TopoDS_Edge& theEdge) = 0; - DEFINE_STANDARD_RTTI_INLINE(IMeshTools_ShapeVisitor, Standard_Transient) + DEFINE_STANDARD_RTTIEXT(IMeshTools_ShapeVisitor, Standard_Transient) protected: //! Constructor. - Standard_EXPORT IMeshTools_ShapeVisitor() + IMeshTools_ShapeVisitor() { } }; diff -Nru opencascade-7.4.1+dfsg1/src/IntAna/IntAna_Curve.cxx opencascade-7.5.1+dfsg1/src/IntAna/IntAna_Curve.cxx --- opencascade-7.4.1+dfsg1/src/IntAna/IntAna_Curve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntAna/IntAna_Curve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,10 +55,39 @@ //purpose : //======================================================================= IntAna_Curve::IntAna_Curve() +: Z0Cte(0.0), + Z0Sin(0.0), + Z0Cos(0.0), + Z0SinSin(0.0), + Z0CosCos(0.0), + Z0CosSin(0.0), + Z1Cte(0.0), + Z1Sin(0.0), + Z1Cos(0.0), + Z1SinSin(0.0), + Z1CosCos(0.0), + Z1CosSin(0.0), + Z2Cte(0.0), + Z2Sin(0.0), + Z2Cos(0.0), + Z2SinSin(0.0), + Z2CosCos(0.0), + Z2CosSin(0.0), + TwoCurves(Standard_False), + TakeZPositive(Standard_False), + Tolerance(0.0), + DomainInf(0.0), + DomainSup(0.0), + RestrictedInf(Standard_False), + RestrictedSup(Standard_False), + firstbounded(Standard_False), + lastbounded(Standard_False), + typequadric(GeomAbs_OtherSurface), + RCyl(0.0), + Angle(0.0), + myFirstParameter(0.0), + myLastParameter(0.0) { - typequadric=GeomAbs_OtherSurface; - firstbounded=Standard_False; - lastbounded=Standard_False; } //======================================================================= //function : SetConeQuadValues diff -Nru opencascade-7.4.1+dfsg1/src/IntAna/IntAna_Int3Pln.cxx opencascade-7.5.1+dfsg1/src/IntAna/IntAna_Int3Pln.cxx --- opencascade-7.4.1+dfsg1/src/IntAna/IntAna_Int3Pln.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntAna/IntAna_Int3Pln.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,11 @@ #include #include -IntAna_Int3Pln::IntAna_Int3Pln () : done(Standard_False) {} +IntAna_Int3Pln::IntAna_Int3Pln() +: done(Standard_False), + empt(Standard_True) +{ +} IntAna_Int3Pln::IntAna_Int3Pln (const gp_Pln& P1, const gp_Pln& P2, diff -Nru opencascade-7.4.1+dfsg1/src/IntAna/IntAna_IntConicQuad.cxx opencascade-7.5.1+dfsg1/src/IntAna/IntAna_IntConicQuad.cxx --- opencascade-7.4.1+dfsg1/src/IntAna/IntAna_IntConicQuad.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntAna/IntAna_IntConicQuad.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -53,6 +53,10 @@ //== CREATE(void) { done=Standard_False; + parallel = Standard_False; + inquadric = Standard_False; + nbpts = 0; + memset (paramonc, 0, sizeof (paramonc)); } //============================================================================= //== L i n e - Q u a d r i c diff -Nru opencascade-7.4.1+dfsg1/src/IntAna/IntAna_IntLinTorus.cxx opencascade-7.5.1+dfsg1/src/IntAna/IntAna_IntLinTorus.cxx --- opencascade-7.4.1+dfsg1/src/IntAna/IntAna_IntLinTorus.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntAna/IntAna_IntLinTorus.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,8 +29,14 @@ #include #include -IntAna_IntLinTorus::IntAna_IntLinTorus () : done(Standard_False) -{} +IntAna_IntLinTorus::IntAna_IntLinTorus () +: done(Standard_False), + nbpt(0) +{ + memset (theFi, 0, sizeof (theFi)); + memset (theParam, 0, sizeof (theParam)); + memset (theTheta, 0, sizeof (theTheta)); +} IntAna_IntLinTorus::IntAna_IntLinTorus (const gp_Lin& L, const gp_Torus& T) { Perform(L,T); diff -Nru opencascade-7.4.1+dfsg1/src/IntAna/IntAna_IntQuadQuad.cxx opencascade-7.5.1+dfsg1/src/IntAna/IntAna_IntQuadQuad.cxx --- opencascade-7.4.1+dfsg1/src/IntAna/IntAna_IntQuadQuad.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntAna/IntAna_IntQuadQuad.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -183,7 +183,8 @@ const Standard_Real S, const Standard_Real Cte, const Standard_Real Binf, - const Standard_Real Bsup) + const Standard_Real Bsup) +: infinite_roots(Standard_False) { Standard_Integer i, j, SvNbRoots; Standard_Boolean Triee; @@ -317,6 +318,8 @@ myNbMaxCurves=12; myEpsilon=0.00000001; myEpsilonCoeffPolyNull=0.00000001; + memset (nextcurve, 0, sizeof (nextcurve)); + memset (previouscurve, 0, sizeof (previouscurve)); } //======================================================================= //function : IntAna_IntQuadQuad::IntAna_IntQuadQuad diff -Nru opencascade-7.4.1+dfsg1/src/IntAna/IntAna_QuadQuadGeo.cxx opencascade-7.5.1+dfsg1/src/IntAna/IntAna_QuadQuadGeo.cxx --- opencascade-7.4.1+dfsg1/src/IntAna/IntAna_QuadQuadGeo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntAna/IntAna_QuadQuadGeo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -63,7 +63,9 @@ //======================================================================= class AxeOperator { public: - AxeOperator(const gp_Ax1& A1,const gp_Ax1& A2); + AxeOperator(const gp_Ax1& A1,const gp_Ax1& A2, + const Standard_Real theEpsDistance = 1.e-14, + const Standard_Real theEpsAxesPara = Precision::Angular()); void Distance(Standard_Real& dist, Standard_Real& Param1, @@ -123,12 +125,15 @@ //function : AxeOperator::AxeOperator //purpose : //======================================================================= -AxeOperator::AxeOperator(const gp_Ax1& A1,const gp_Ax1& A2) +AxeOperator::AxeOperator(const gp_Ax1& A1,const gp_Ax1& A2, + const Standard_Real theEpsDistance, + const Standard_Real theEpsAxesPara) +: + Axe1 (A1), + Axe2 (A2), + myEPSILON_DISTANCE (theEpsDistance), + myEPSILON_AXES_PARA (theEpsAxesPara) { - myEPSILON_DISTANCE=1.0e-14; - myEPSILON_AXES_PARA=Precision::Angular(); - Axe1=A1; - Axe2=A2; //--------------------------------------------------------------------- gp_Dir V1=Axe1.Direction(); gp_Dir V2=Axe2.Direction(); @@ -162,12 +167,11 @@ thecoplanar=Standard_True; } } - else { - thecoplanar=Standard_True; - thenormal=(V1.Dot(V2)==0.0)? Standard_True : Standard_False; - } + + thenormal = Abs (V1.Dot(V2)) < myEPSILON_AXES_PARA; + //--- check if the two axis are concurrent - if(thecoplanar && (!theparallel)) { + if (thecoplanar && !theparallel) { Standard_Real smx=P2.X() - P1.X(); Standard_Real smy=P2.Y() - P1.Y(); Standard_Real smz=P2.Z() - P1.Z(); @@ -949,7 +953,8 @@ { done=Standard_True; //---------------------------- Parallel axes ------------------------- - AxeOperator A1A2(Cyl1.Axis(),Cyl2.Axis()); + AxeOperator A1A2(Cyl1.Axis(),Cyl2.Axis(), + myEPSILON_CYLINDER_DELTA_DISTANCE, myEPSILON_AXES_PARA); Standard_Real R1=Cyl1.Radius(); Standard_Real R2=Cyl2.Radius(); Standard_Real RmR, RmR_Relative; @@ -1118,7 +1123,7 @@ } else { //-- No Parallel Axis ---------------------------------OK if((RmR_Relative<=myEPSILON_CYLINDER_DELTA_RADIUS) - && (DistA1A2 <= myEPSILON_CYLINDER_DELTA_DISTANCE)) + && A1A2.Intersect()) { //-- PI/2 between the two axis and Intersection //-- and identical radius diff -Nru opencascade-7.4.1+dfsg1/src/IntAna2d/IntAna2d_AnaIntersection.cxx opencascade-7.5.1+dfsg1/src/IntAna2d/IntAna2d_AnaIntersection.cxx --- opencascade-7.4.1+dfsg1/src/IntAna2d/IntAna2d_AnaIntersection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntAna2d/IntAna2d_AnaIntersection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,9 +24,13 @@ #include #include -IntAna2d_AnaIntersection::IntAna2d_AnaIntersection () { - - done = Standard_False; +IntAna2d_AnaIntersection::IntAna2d_AnaIntersection () +: done(Standard_False), + para(Standard_False), + iden(Standard_False), + empt(Standard_True), + nbp(0) +{ } IntAna2d_AnaIntersection::IntAna2d_AnaIntersection (const gp_Lin2d& L1, diff -Nru opencascade-7.4.1+dfsg1/src/IntAna2d/IntAna2d_IntPoint.cxx opencascade-7.5.1+dfsg1/src/IntAna2d/IntAna2d_IntPoint.cxx --- opencascade-7.4.1+dfsg1/src/IntAna2d/IntAna2d_IntPoint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntAna2d/IntAna2d_IntPoint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,7 @@ IntAna2d_IntPoint::IntAna2d_IntPoint (const Standard_Real X, const Standard_Real Y, const Standard_Real U1): - myu1(U1),myp(X,Y),myimplicit(Standard_True) + myu1(U1),myu2(RealLast()),myp(X,Y),myimplicit(Standard_True) { } @@ -54,7 +54,7 @@ myimplicit = Standard_True; myp.SetCoord(X,Y); myu1 = U1; - + myu2 = RealLast(); } diff -Nru opencascade-7.4.1+dfsg1/src/IntAna2d/IntAna2d_Outils.cxx opencascade-7.5.1+dfsg1/src/IntAna2d/IntAna2d_Outils.cxx --- opencascade-7.4.1+dfsg1/src/IntAna2d/IntAna2d_Outils.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntAna2d/IntAna2d_Outils.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,7 +42,11 @@ return; } Standard_Integer i,j,nbp; - for(i=0;i<16;i++) val[i]=RealLast(); + for (size_t anIdx = 0; anIdx < sizeof (val) / sizeof (val[0]); anIdx++) + { + val[anIdx] = RealLast(); + sol[anIdx] = RealLast(); + } Standard_Real tol = Epsilon(100.0); math_DirectPolynomialRoots MATH_A43210(A4,A3,A2,A1,A0); @@ -193,6 +197,11 @@ const Standard_Real A1, const Standard_Real A0) { //-- std::cout<<" IntAna2d : A2..A0 "< //================================================================================ -IntCurveSurface_IntersectionPoint::IntCurveSurface_IntersectionPoint() { } +IntCurveSurface_IntersectionPoint::IntCurveSurface_IntersectionPoint() +: myUSurf(0.0), + myVSurf(0.0), + myUCurv(0.0) +{ +} //================================================================================ IntCurveSurface_IntersectionPoint::IntCurveSurface_IntersectionPoint(const gp_Pnt& P, const Standard_Real USurf, diff -Nru opencascade-7.4.1+dfsg1/src/IntCurveSurface/IntCurveSurface_Polyhedron.gxx opencascade-7.5.1+dfsg1/src/IntCurveSurface/IntCurveSurface_Polyhedron.gxx --- opencascade-7.4.1+dfsg1/src/IntCurveSurface/IntCurveSurface_Polyhedron.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntCurveSurface/IntCurveSurface_Polyhedron.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -506,12 +506,12 @@ if (colT==(colP+colP)) { colT++; linO=(ligP>ligE)? ligP : ligE; //--linO=Max(ligP, ligE); - colO=colP+1;; + colO=colP+1; } else { colT--; linO=(ligPInit(0); - } + theflags = new TColStd_HArray1OfInteger(0, thenbwords*(resflags + 1), 0); } Interface_BitMap::Interface_BitMap @@ -50,33 +46,24 @@ void Interface_BitMap::Initialize(const Interface_BitMap& other, const Standard_Boolean copied) { - other.Internals (thenbitems,thenbwords,thenbflags,theflags,thenames); - if (!copied) return; - Standard_Integer nb = theflags->Upper (); - Handle(TColStd_HArray1OfInteger) flags = new TColStd_HArray1OfInteger(0,nb); - Standard_Integer i; // svv Jan11 2000 : porting on DEC - for (i = 0; i <= nb; i ++) - flags->SetValue (i,theflags->Value(i)); - theflags = flags; - if (thenames.IsNull()) return; - nb = thenames->Length(); - Handle(TColStd_HSequenceOfAsciiString) names = new TColStd_HSequenceOfAsciiString(); - for (i = 1; i <= nb; i ++) - names->Append ( TCollection_AsciiString(thenames->Value(i)) ); - thenames = names; -} - -void Interface_BitMap::Internals -(Standard_Integer& nbitems, Standard_Integer& nbwords, - Standard_Integer& nbflags, - Handle(TColStd_HArray1OfInteger)& flags, - Handle(TColStd_HSequenceOfAsciiString)& names) const -{ - nbitems = thenbitems; nbwords = thenbwords; nbflags = thenbflags; - flags = theflags; names = thenames; + thenbitems = other.thenbitems; + thenbwords = other.thenbwords; + thenbflags = other.thenbflags; + if (!copied) + { + theflags = other.theflags; + thenames = other.thenames; + } + else + { + theflags = new TColStd_HArray1OfInteger(other.theflags->Array1()); + if (! other.thenames.IsNull()) + { + thenames = new TColStd_HSequenceOfAsciiString(other.thenames->Sequence()); + } + } } - void Interface_BitMap::Reservate (const Standard_Integer moreflags) { Standard_Integer nb = theflags->Upper (); diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_BitMap.hxx opencascade-7.5.1+dfsg1/src/Interface/Interface_BitMap.hxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_BitMap.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_BitMap.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,10 +70,6 @@ //! Initialize a BitMap from another one Standard_EXPORT void Initialize (const Interface_BitMap& other, const Standard_Boolean copied = Standard_False); - //! Returns internal values, used for copying - //! Flags values start at false - Standard_EXPORT void Internals (Standard_Integer& nbitems, Standard_Integer& nbwords, Standard_Integer& nbflags, Handle(TColStd_HArray1OfInteger)& flags, Handle(TColStd_HSequenceOfAsciiString)& names) const; - //! Reservates for a count of more flags Standard_EXPORT void Reservate (const Standard_Integer moreflags); diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_Check.cxx opencascade-7.5.1+dfsg1/src/Interface/Interface_Check.cxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_Check.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_Check.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -685,7 +685,7 @@ //purpose : //======================================================================= -void Interface_Check::Print(const Handle(Message_Messenger)& S, const Standard_Integer level, +void Interface_Check::Print(Standard_OStream& S, const Standard_Integer level, const Standard_Integer final) const { Standard_Integer j, nb = NbFails(); @@ -695,9 +695,9 @@ // if (nb > 0) S<<" --> Fails : "<= 0) - S< 0) S<<" --> Warnings : "<= 0) - S< 0) S<<" --> Infos : "<= 0) - S< : if positive (D) prints final values of messages //! if negative, prints originals //! if null, prints both forms - Standard_EXPORT void Print (const Handle(Message_Messenger)& S, const Standard_Integer level, const Standard_Integer final = 1) const; + Standard_EXPORT void Print (Standard_OStream& S, const Standard_Integer level, const Standard_Integer final = 1) const; //! Prints the messages of the check to the default trace file //! By default, according to the default standard level diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_CheckIterator.cxx opencascade-7.5.1+dfsg1/src/Interface/Interface_CheckIterator.cxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_CheckIterator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_CheckIterator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -501,7 +500,7 @@ //purpose : //======================================================================= -void Interface_CheckIterator::Print(const Handle(Message_Messenger)& S, +void Interface_CheckIterator::Print(Standard_OStream& S, const Standard_Boolean failsonly, const Standard_Integer final) const { @@ -514,7 +513,7 @@ //purpose : //======================================================================= -void Interface_CheckIterator::Print(const Handle(Message_Messenger)& S, +void Interface_CheckIterator::Print(Standard_OStream& S, const Handle(Interface_InterfaceModel)& model, const Standard_Boolean failsonly, const Standard_Integer /*final*/) const @@ -540,22 +539,22 @@ // mesnum = mesnum0; // if (yamod) mesnum = (nm0 > 0 ? mesnum1 : mesnum2); - if (!titre) S<<" ** " << Name() << " **"< 9 && i < 10) S<<" "; if (nb > 99 && i < 100) S<<" "; - S< 9 && i < 10) S <<" "; if (nb > 99 && i < 100) S <<" "; + S <Print (ent,S); } - else S<<" -- Entity n0 "<Print (ent, S); } + else S <<" -- Entity n0 "<PrintLabel(ent,S); } - if (num >= 0 && entnul) S<<" (unknown Type)"<= 0 && entnul) S <<" (unknown Type)"<= 0 && !entnul) { - if (yamod) S<<" Type:"<TypeName(ent)<DynamicType()->Name()<TypeName(ent)<DynamicType()->Name()< > 0, prints only final messages //! It uses the recorded Model if it is defined //! Remark : Works apart from the iteration methods (no interference) - Standard_EXPORT void Print (const Handle(Message_Messenger)& S, const Standard_Boolean failsonly, const Standard_Integer final = 0) const; + Standard_EXPORT void Print (Standard_OStream& S, const Standard_Boolean failsonly, const Standard_Integer final = 0) const; //! Works as Print without a model, but for entities which have //! no attached number (Number not positive), tries to compute //! this Number from and displays "original" or "computed" - Standard_EXPORT void Print (const Handle(Message_Messenger)& S, const Handle(Interface_InterfaceModel)& model, const Standard_Boolean failsonly, const Standard_Integer final = 0) const; + Standard_EXPORT void Print (Standard_OStream& S, const Handle(Interface_InterfaceModel)& model, const Standard_Boolean failsonly, const Standard_Integer final = 0) const; //! Clears data of iteration Standard_EXPORT void Destroy(); diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_CheckTool.cxx opencascade-7.5.1+dfsg1/src/Interface/Interface_CheckTool.cxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_CheckTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_CheckTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -155,18 +154,18 @@ //======================================================================= void Interface_CheckTool::Print(const Handle(Interface_Check)& ach, - const Handle(Message_Messenger)& S) const + Standard_OStream& S) const { Standard_Integer i, nb; nb = ach->NbFails(); if (nb > 0) S << " Fail Messages : " << nb << " :\n"; for (i = 1; i <= nb; i ++) { - S << ach->Fail(i) << "\n"; + S << ach->Fail(i)->String() << "\n"; } nb = ach->NbWarnings(); if (nb > 0) S << " Warning Messages : " << nb << " :\n"; for (i = 1; i <= nb; i ++) { - S << ach->Warning(i) << "\n"; + S << ach->Warning(i)->String() << "\n"; } } @@ -177,7 +176,7 @@ //======================================================================= void Interface_CheckTool::Print(const Interface_CheckIterator& list, - const Handle(Message_Messenger)& S) const + Standard_OStream& S) const { Handle(Interface_InterfaceModel) model = theshare.Model(); list.Print(S,model,Standard_False); diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_CheckTool.hxx opencascade-7.5.1+dfsg1/src/Interface/Interface_CheckTool.hxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_CheckTool.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_CheckTool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,7 +33,6 @@ class Standard_Transient; class Interface_ShareTool; class Interface_Check; -class Message_Messenger; class Interface_CheckIterator; class Interface_EntityIterator; @@ -71,12 +70,12 @@ Standard_EXPORT void FillCheck (const Handle(Standard_Transient)& ent, const Interface_ShareTool& sh, Handle(Interface_Check)& ach); //! Utility method which Prints the content of a Check - Standard_EXPORT void Print (const Handle(Interface_Check)& ach, const Handle(Message_Messenger)& S) const; + Standard_EXPORT void Print (const Handle(Interface_Check)& ach, Standard_OStream& S) const; //! Simply Lists all the Checks and the Content (messages) and the //! Entity, if there is, of each Check //! (if all Checks are OK, nothing is Printed) - Standard_EXPORT void Print (const Interface_CheckIterator& list, const Handle(Message_Messenger)& S) const; + Standard_EXPORT void Print (const Interface_CheckIterator& list, Standard_OStream& S) const; //! Returns the Check associated to an Entity identified by //! its Number in a Model. diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_EntityCluster.cxx opencascade-7.5.1+dfsg1/src/Interface/Interface_EntityCluster.cxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_EntityCluster.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_EntityCluster.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,7 @@ #include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(Interface_EntityCluster,Standard_Transient) @@ -56,7 +57,12 @@ else if (theents[3].IsNull()) theents[3] = ent; else { // Si celui-ci est plein ... if (thenext.IsNull()) thenext = new Interface_EntityCluster(ent); - else thenext->Append(ent); + else { + Handle(Interface_EntityCluster) aCurEntClust = thenext; + while (aCurEntClust->HasNext() && aCurEntClust->IsLocalFull()) + aCurEntClust = aCurEntClust->thenext; + aCurEntClust->Append(ent); + } } } @@ -110,24 +116,39 @@ const Handle(Standard_Transient)& Interface_EntityCluster::Value (const Standard_Integer num) const { - Standard_Integer nb = NbLocal(); + Standard_Integer nb = NbLocal(), aLocalNum=num; if (num <= 0) throw Standard_OutOfRange("Interface EntityCluster : Value"); - if (num > nb) { - if (thenext.IsNull()) throw Standard_OutOfRange("Interface EntityCluster : Value"); - return thenext->Value(num-nb); + if (num > nb) { + Handle(Interface_EntityCluster) aCurEntClust = thenext; + aLocalNum -= nb; + while (aLocalNum>aCurEntClust->NbLocal()) + { + if (!aCurEntClust->HasNext()) throw Standard_OutOfRange("Interface EntityCluster : Value"); + aCurEntClust = aCurEntClust->thenext; + aLocalNum-= nb; + } + return aCurEntClust->theents[aLocalNum - 1]; } return theents[num-1]; // numerotation a partir de 0 } void Interface_EntityCluster::SetValue (const Standard_Integer num, const Handle(Standard_Transient)& ent) -{ +{ if (ent.IsNull()) throw Standard_NullObject("Interface_EntityCluster SetValue"); - Standard_Integer nb = NbLocal(); + Standard_Integer nb = NbLocal(), aLocalNum = num; if (num <= 0) throw Standard_OutOfRange("Interface EntityCluster : SetValue"); - if (num > nb) { - if (thenext.IsNull()) throw Standard_OutOfRange("Interface EntityCluster : SetValue"); - thenext->SetValue(num-nb,ent); + if (num > nb) + { + Handle(Interface_EntityCluster) aCurEntClust = thenext; + aLocalNum -= nb; + while (aLocalNum > aCurEntClust->NbLocal()) + { + if (thenext.IsNull()) throw Standard_OutOfRange("Interface EntityCluster : SetValue"); + aCurEntClust = aCurEntClust->thenext; + aLocalNum -= nb; + } + aCurEntClust->theents[aLocalNum - 1] = ent; } else theents[num-1] = ent; // numerotation a partir de 0 } @@ -168,3 +189,38 @@ Handle(Interface_EntityCluster) Interface_EntityCluster::Next () const { return thenext; } + +Interface_EntityCluster::~Interface_EntityCluster() +{ + if (!thenext.IsNull()) + { + //Loading entities into the collection + //for deletion in reverse order(avoiding the recursion) + NCollection_Sequence aNColOfEntClust; + Handle(Interface_EntityCluster) aCurEntClust = thenext; + while (aCurEntClust->HasNext()) + { + aNColOfEntClust.Append(aCurEntClust); + aCurEntClust = aCurEntClust->Next(); + } + aNColOfEntClust.Append(aCurEntClust); + aNColOfEntClust.Reverse(); + for (NCollection_Sequence::Iterator anEntClustIter(aNColOfEntClust); + anEntClustIter.More(); anEntClustIter.Next()) + { + //Nullifying and destruction all fields of each entity in the collection + for (Standard_Integer anInd = 0; anInd < anEntClustIter.ChangeValue()->NbLocal(); ++anInd) + { + anEntClustIter.ChangeValue()->theents[anInd].Nullify(); + } + anEntClustIter.ChangeValue()->thenext.Nullify(); + } + } + for (Standard_Integer anInd = 0; anInd < NbLocal(); ++anInd) + { + theents[anInd].Nullify(); + } + thenext.Nullify(); +} + + diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_EntityCluster.hxx opencascade-7.5.1+dfsg1/src/Interface/Interface_EntityCluster.hxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_EntityCluster.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_EntityCluster.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -92,6 +92,9 @@ //! Fills an Iterator with designated Entities (includes Next) Standard_EXPORT void FillIterator (Interface_EntityIterator& iter) const; + //! Destructor + //! If Next exists, destroy from the last entity in reverse order. + Standard_EXPORT virtual ~Interface_EntityCluster(); friend class Interface_EntityList; diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_FileReaderTool.cxx opencascade-7.5.1+dfsg1/src/Interface/Interface_FileReaderTool.cxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_FileReaderTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_FileReaderTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -575,7 +575,10 @@ thereports->SetValue(irep,rep); if ( thetrace >= 2 && !Messenger().IsNull()) - ach->Print (Messenger(),2); + { + Message_Messenger::StreamBuffer sout = Messenger()->SendInfo(); + ach->Print (sout,2); + } } // Rechargement ? si oui, dans une UnknownEntity fournie par le protocole diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_Graph.cxx opencascade-7.5.1+dfsg1/src/Interface/Interface_Graph.cxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_Graph.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_Graph.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -102,6 +102,26 @@ theflags.Initialize(agraph.BitMap(),Standard_True); } +Interface_Graph& Interface_Graph::operator= (const Interface_Graph& theOther) +{ + themodel = theOther.Model(); + thepresents = theOther.thepresents; + thesharings = theOther.SharingTable(); + thestats.Nullify(); + + const Standard_Integer nb = theOther.NbStatuses(); + if (nb != 0) + { + thestats = new TColStd_HArray1OfInteger(1, nb); + for (Standard_Integer i = 1; i <= nb; ++i) + { + thestats->SetValue (i, theOther.Status(i)); + } + theflags.Initialize (theOther.BitMap(), Standard_True); + } + return *this; +} + void Interface_Graph::InitStats() { thestats = new TColStd_HArray1OfInteger(1,themodel->NbEntities()) , diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_Graph.hxx opencascade-7.5.1+dfsg1/src/Interface/Interface_Graph.hxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_Graph.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_Graph.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -87,6 +87,9 @@ //! Remark that status are copied from , but the other //! lists (sharing/shared) are copied only if = True Standard_EXPORT Interface_Graph(const Interface_Graph& agraph, const Standard_Boolean copied = Standard_False); + + //! Assignment + Standard_EXPORT Interface_Graph& operator= (const Interface_Graph& theOther); //! Erases data, making graph ready to rebegin from void //! (also resets Shared lists redefinitions) diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_InterfaceModel.cxx opencascade-7.5.1+dfsg1/src/Interface/Interface_InterfaceModel.cxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_InterfaceModel.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_InterfaceModel.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -916,18 +915,18 @@ //======================================================================= void Interface_InterfaceModel::Print(const Handle(Standard_Transient)& ent, - const Handle(Message_Messenger)& S, + Standard_OStream& S, const Standard_Integer mode) const { - if (ent.IsNull()) { S<<"NULL"; return; } + if (ent.IsNull()) { S << "NULL" ; return; } Standard_Integer num = Number(ent); - if (mode <= 0) S<= 0) { if (num > 0) PrintToLog(ent,S); // PrintLabel (ent,S); - else S<<"??"; + else S <<"??"; } } @@ -938,7 +937,7 @@ //======================================================================= void Interface_InterfaceModel::PrintToLog(const Handle(Standard_Transient)& ent, - const Handle(Message_Messenger)& S) const + Standard_OStream& S) const { PrintLabel (ent,S); } diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_InterfaceModel.hxx opencascade-7.5.1+dfsg1/src/Interface/Interface_InterfaceModel.hxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_InterfaceModel.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_InterfaceModel.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,7 +40,6 @@ class Interface_CheckIterator; class Interface_GeneralLib; class Interface_EntityIterator; -class Message_Messenger; class Interface_InterfaceModel; @@ -345,7 +344,7 @@ //! Dumps Header in a short, easy to read, form, onto a Stream //! allows to print more or less parts of the header, //! if necessary. 0 for basic print - Standard_EXPORT virtual void DumpHeader (const Handle(Message_Messenger)& S, const Standard_Integer level = 0) const = 0; + Standard_EXPORT virtual void DumpHeader (Standard_OStream& S, const Standard_Integer level = 0) const = 0; //! Prints identification of a given entity in , in order to //! be printed in a list or phrase @@ -354,17 +353,17 @@ //! = 0 (D) : prints its number plus '/' plus PrintLabel //! If == , simply prints "Global" //! If is unknown, prints "??/its type" - Standard_EXPORT void Print (const Handle(Standard_Transient)& ent, const Handle(Message_Messenger)& s, const Standard_Integer mode = 0) const; + Standard_EXPORT void Print (const Handle(Standard_Transient)& ent, Standard_OStream& s, const Standard_Integer mode = 0) const; //! Prints label specific to each norm, for a given entity. //! Must only print label itself, in order to be included in a //! phrase. Can call the result of StringLabel, but not obliged. - Standard_EXPORT virtual void PrintLabel (const Handle(Standard_Transient)& ent, const Handle(Message_Messenger)& S) const = 0; + Standard_EXPORT virtual void PrintLabel (const Handle(Standard_Transient)& ent, Standard_OStream& S) const = 0; //! Prints label specific to each norm in log format, for //! a given entity. //! By default, just calls PrintLabel, can be redefined - Standard_EXPORT virtual void PrintToLog (const Handle(Standard_Transient)& ent, const Handle(Message_Messenger)& S) const; + Standard_EXPORT virtual void PrintToLog (const Handle(Standard_Transient)& ent, Standard_OStream& S) const; //! Returns a string with the label attached to a given entity. //! Warning : While this string may be edited on the spot, if it is a read diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_ShareTool.cxx opencascade-7.5.1+dfsg1/src/Interface/Interface_ShareTool.cxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_ShareTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_ShareTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -203,13 +203,13 @@ return list; } - void Interface_ShareTool::Print - (const Interface_EntityIterator& iter, const Handle(Message_Messenger)& S) const +void Interface_ShareTool::Print (const Interface_EntityIterator& iter, Standard_OStream& S) const { S << " Nb.Entities : " << iter.NbEntities() << " : "; for (iter.Start(); iter.More(); iter.Next()) { Handle(Standard_Transient) ent = iter.Value(); - S << " n0/id:"; Model()->Print(ent,S); + S << " n0/id:"; + Model()->Print (ent, S); } - S< -#include -#include - -#include -#include #include + class Interface_HGraph; class Standard_DomainError; class Interface_InterfaceError; @@ -33,9 +28,6 @@ class Interface_Protocol; class Interface_Graph; class Interface_EntityIterator; -class Standard_Transient; -class Message_Messenger; - //! Builds the Graph of Dependancies, from the General Service //! "Shared" -> builds for each Entity of a Model, the Shared and @@ -113,7 +105,7 @@ //! Utility method which Prints the content of an iterator //! (by their Numbers) - Standard_EXPORT void Print (const Interface_EntityIterator& iter, const Handle(Message_Messenger)& S) const; + Standard_EXPORT void Print (const Interface_EntityIterator& iter,Standard_OStream& S) const; diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_STAT.hxx opencascade-7.5.1+dfsg1/src/Interface/Interface_STAT.hxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_STAT.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_STAT.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -97,7 +97,14 @@ //! used when starting Standard_EXPORT Interface_STAT(const Interface_STAT& other); - + + //! Assignment + Interface_STAT& operator= (const Interface_STAT& theOther) + { + theOther.Internals (thetitle, thetotal, thephnam, thephw, thephdeb,thephfin, thestw); + return *this; + } + //! Returns fields in once, without copying them, used for copy //! when starting Standard_EXPORT void Internals (Handle(TCollection_HAsciiString)& tit, Standard_Real& total, Handle(TColStd_HSequenceOfAsciiString)& phn, Handle(TColStd_HSequenceOfReal)& phw, Handle(TColStd_HSequenceOfInteger)& phdeb, Handle(TColStd_HSequenceOfInteger)& phfin, Handle(TColStd_HSequenceOfReal)& stw) const; diff -Nru opencascade-7.4.1+dfsg1/src/Interface/Interface_Static.cxx opencascade-7.5.1+dfsg1/src/Interface/Interface_Static.cxx --- opencascade-7.4.1+dfsg1/src/Interface/Interface_Static.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Interface/Interface_Static.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -11,10 +11,9 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include -#include -#include #include #include #include @@ -84,15 +83,15 @@ // ## Print ## -void Interface_Static::PrintStatic (const Handle(Message_Messenger)& S) const +void Interface_Static::PrintStatic (Standard_OStream& S) const { - S<<"--- Static Value : "<Name()<Name()< diff -Nru opencascade-7.4.1+dfsg1/src/Intf/Intf_Interference.cxx opencascade-7.5.1+dfsg1/src/Intf/Intf_Interference.cxx --- opencascade-7.4.1+dfsg1/src/Intf/Intf_Interference.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Intf/Intf_Interference.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,8 +28,10 @@ //purpose : Initialize for a deferred interference. //======================================================================= Intf_Interference::Intf_Interference (const Standard_Boolean Self) - : SelfIntf(Self) -{} + : SelfIntf(Self), + Tolerance(0.0) +{ +} //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/Intf/Intf_SectionLine.hxx opencascade-7.5.1+dfsg1/src/Intf/Intf_SectionLine.hxx --- opencascade-7.4.1+dfsg1/src/Intf/Intf_SectionLine.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Intf/Intf_SectionLine.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -67,6 +67,14 @@ //! Copies a SectionLine. Standard_EXPORT Intf_SectionLine(const Intf_SectionLine& Other); + //! Assignment + Intf_SectionLine& operator= (const Intf_SectionLine& theOther) + { + //closed = theOther.closed; // not copied as in copy constructor + myPoints = theOther.myPoints; + return *this; + } + //! Adds a point at the end of the SectionLine. Standard_EXPORT void Append (const Intf_SectionPoint& Pi); diff -Nru opencascade-7.4.1+dfsg1/src/Intf/Intf_TangentZone.cxx opencascade-7.5.1+dfsg1/src/Intf/Intf_TangentZone.cxx --- opencascade-7.4.1+dfsg1/src/Intf/Intf_TangentZone.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Intf/Intf_TangentZone.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,20 +31,6 @@ ParamOnFirstMax = ParamOnSecondMax = RealFirst(); } - -//======================================================================= -//function : Intf_TangentZone -//purpose : Copy -//======================================================================= - -Intf_TangentZone::Intf_TangentZone (const Intf_TangentZone& Other) -{ - Result=Other.Result; - ParamOnFirstMin = Other.ParamOnFirstMin; - ParamOnFirstMax = Other.ParamOnFirstMax; - ParamOnSecondMin = Other.ParamOnSecondMin; - ParamOnSecondMax = Other.ParamOnSecondMax; -} //======================================================================= //function : Append //purpose : Append the section point to the tangent zone. diff -Nru opencascade-7.4.1+dfsg1/src/Intf/Intf_TangentZone.hxx opencascade-7.5.1+dfsg1/src/Intf/Intf_TangentZone.hxx --- opencascade-7.4.1+dfsg1/src/Intf/Intf_TangentZone.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Intf/Intf_TangentZone.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -81,10 +81,7 @@ //! Builds an empty tangent zone. Standard_EXPORT Intf_TangentZone(); - - //! Copies a Tangent zone. - Standard_EXPORT Intf_TangentZone(const Intf_TangentZone& Other); - + //! Adds a SectionPoint to the TangentZone. Standard_EXPORT void Append (const Intf_SectionPoint& Pi); diff -Nru opencascade-7.4.1+dfsg1/src/Intf/Intf_Tool.cxx opencascade-7.5.1+dfsg1/src/Intf/Intf_Tool.cxx --- opencascade-7.4.1+dfsg1/src/Intf/Intf_Tool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Intf/Intf_Tool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,7 +40,14 @@ //======================================================================= Intf_Tool::Intf_Tool() : nbSeg(0) -{} +{ + memset (beginOnCurve, 0, sizeof (beginOnCurve)); + memset (bord, 0, sizeof (bord)); + memset (xint, 0, sizeof (xint)); + memset (yint, 0, sizeof (yint)); + memset (zint, 0, sizeof (zint)); + memset (parint, 0, sizeof (parint)); +} //======================================================================= //function : Lin2dBox diff -Nru opencascade-7.4.1+dfsg1/src/IntImp/IntImp_Int2S.gxx opencascade-7.5.1+dfsg1/src/IntImp/IntImp_Int2S.gxx --- opencascade-7.4.1+dfsg1/src/IntImp/IntImp_Int2S.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntImp/IntImp_Int2S.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,6 +30,7 @@ const Standard_Real TolTangency ) : done(Standard_True), empty(Standard_True), +tangent(Standard_False), myZerParFunc(surf1,surf2), tol(TolTangency*TolTangency) { diff -Nru opencascade-7.4.1+dfsg1/src/IntImp/IntImp_IntCS.gxx opencascade-7.5.1+dfsg1/src/IntImp/IntImp_IntCS.gxx --- opencascade-7.4.1+dfsg1/src/IntImp/IntImp_IntCS.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntImp/IntImp_IntCS.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,6 +33,9 @@ done(Standard_True), empty(Standard_True), myFunction(F), + w(0.0), + u(0.0), + v(0.0), tol(TolTangency*TolTangency) { if(tol<1e-13) { tol=1e-13; } diff -Nru opencascade-7.4.1+dfsg1/src/IntImp/IntImp_ZerImpFunc.gxx opencascade-7.5.1+dfsg1/src/IntImp/IntImp_ZerImpFunc.gxx --- opencascade-7.4.1+dfsg1/src/IntImp/IntImp_ZerImpFunc.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntImp/IntImp_ZerImpFunc.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,14 +26,30 @@ IntImp_ZerImpFunc::IntImp_ZerImpFunc() : + surf(NULL), + func(NULL), + u(0.0), + v(0.0), + tol(0.0), + valf(0.0), computed(Standard_False), + tangent(Standard_False), + tgdu(0.0), + tgdv(0.0), derived(Standard_False) { } IntImp_ZerImpFunc::IntImp_ZerImpFunc(const ThePSurface& PS , const TheISurface& IS) : + u(0.0), + v(0.0), + tol(0.0), + valf(0.0), computed(Standard_False), + tangent(Standard_False), + tgdu(0.0), + tgdv(0.0), derived(Standard_False) { surf = (Standard_Address)(&PS); @@ -41,7 +57,15 @@ } IntImp_ZerImpFunc::IntImp_ZerImpFunc(const TheISurface& IS) : + surf(NULL), + u(0.0), + v(0.0), + tol(0.0), + valf(0.0), computed(Standard_False), + tangent(Standard_False), + tgdu(0.0), + tgdv(0.0), derived(Standard_False) { func = (Standard_Address)(&IS); diff -Nru opencascade-7.4.1+dfsg1/src/IntImp/IntImp_ZerParFunc.gxx opencascade-7.5.1+dfsg1/src/IntImp/IntImp_ZerParFunc.gxx --- opencascade-7.4.1+dfsg1/src/IntImp/IntImp_ZerParFunc.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntImp/IntImp_ZerParFunc.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,11 @@ IntImp_ZerParFunc::IntImp_ZerParFunc(const ThePSurface& S1 , - const ThePSurface& S2) { + const ThePSurface& S2) +: compute(Standard_False), + tangent(Standard_False), + paramConst(0.0) +{ surf1 = (Standard_Address)(&S1); surf2 = (Standard_Address)(&S2); @@ -46,7 +50,7 @@ ures2 = ThePSurfaceTool::UResolution(SURF2,Precision::Confusion()); vres2 = ThePSurfaceTool::VResolution(SURF2,Precision::Confusion()); - + memset (f, 0, sizeof (f)); compute = Standard_False; tangent = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_ALine.cxx opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_ALine.cxx --- opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_ALine.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_ALine.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,8 +33,10 @@ const IntSurf_TypeTrans Trans1, const IntSurf_TypeTrans Trans2) : IntPatch_Line(Tang,Trans1,Trans2), - fipt(Standard_False),lapt(Standard_False) - + fipt(Standard_False), + lapt(Standard_False), + indf(0), + indl(0) { typ = IntPatch_Analytic; curv = C; @@ -46,8 +48,10 @@ const IntSurf_Situation Situ1, const IntSurf_Situation Situ2) : IntPatch_Line(Tang,Situ1,Situ2), - fipt(Standard_False),lapt(Standard_False) - + fipt(Standard_False), + lapt(Standard_False), + indf(0), + indl(0) { typ = IntPatch_Analytic; curv = C; @@ -57,8 +61,10 @@ IntPatch_ALine::IntPatch_ALine (const IntAna_Curve& C, const Standard_Boolean Tang) : IntPatch_Line(Tang), - fipt(Standard_False),lapt(Standard_False) - + fipt(Standard_False), + lapt(Standard_False), + indf(0), + indl(0) { typ = IntPatch_Analytic; curv = C; diff -Nru opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_ImpImpIntersection_2.gxx opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_ImpImpIntersection_2.gxx --- opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_ImpImpIntersection_2.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_ImpImpIntersection_2.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,7 +26,10 @@ //purpose : //======================================================================= IntPatch_ImpImpIntersection::IntPatch_ImpImpIntersection (): -myDone(IntStatus_Fail) +myDone(IntStatus_Fail), +empt(Standard_True), +tgte(Standard_False), +oppo(Standard_False) { } //======================================================================= @@ -109,7 +112,7 @@ case 21: { // Plane/Cylinder Standard_Real VMin, VMax, H; // - const Handle(Adaptor3d_HSurface)& aSCyl = bReverse ? S2 : S1; + const Handle(Adaptor3d_HSurface)& aSCyl = bReverse ? S1 : S2; VMin = aSCyl->FirstVParameter(); VMax = aSCyl->LastVParameter(); H = (Precision::IsNegativeInfinite(VMin) || diff -Nru opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_ImpImpIntersection_4.gxx opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_ImpImpIntersection_4.gxx --- opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_ImpImpIntersection_4.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_ImpImpIntersection_4.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -1870,7 +1870,7 @@ return Standard_False; if ((theLine->NbPoints() > 0) && - ((theUlSurf1 - theUfSurf1) >= thePeriodOfSurf1) && + ((theUlSurf1 - theUfSurf1) >= (thePeriodOfSurf1 - theTol2D)) && (((aU1par + thePeriodOfSurf1 - theUlSurf1) <= theTol2D) || ((aU1par - thePeriodOfSurf1 - theUfSurf1) >= theTol2D))) { @@ -2164,10 +2164,6 @@ return; Standard_Integer aNbPoints = theEndPointOnLine - theStartPointOnLine + 1; - if(aNbPoints >= theMinNbPoints) - { - return; - } Standard_Real aMinDeltaParam = theTol2D; @@ -2192,7 +2188,7 @@ Standard_Real U1prec = 0.0, V1prec = 0.0, U2prec = 0.0, V2prec = 0.0; Standard_Integer aNbPointsPrev = 0; - while(aNbPoints < theMinNbPoints && (aNbPoints != aNbPointsPrev)) + do { aNbPointsPrev = aNbPoints; for(Standard_Integer fp = theStartPointOnLine, lp = 0; fp < aLastPointIndex; fp = lp + 1) @@ -2269,7 +2265,7 @@ { return; } - } + } while(aNbPoints < theMinNbPoints && (aNbPoints != aNbPointsPrev)); } //======================================================================= @@ -2691,7 +2687,62 @@ if ((aRangeS1.Delta() > aMaxV1Range) || (aRangeS2.Delta() > aMaxV2Range)) return IntPatch_ImpImpIntersection::IntStatus_InfiniteSectionCurve; } + // + Standard_Boolean isGoodIntersection = Standard_False; + Standard_Real anOptdu = 0.; + for (;;) + { + //Checking parameters of cylinders in order to define "good intersection" + //"Good intersection" means that axes of cylinders are almost perpendicular and + // one radius is much smaller than the other and small cylinder is "inside" big one. + const Standard_Real aToMuchCoeff = 3.; + const Standard_Real aCritAngle = M_PI / 18.; // 10 degree + Standard_Real anR1 = theCyl1.Radius(); + Standard_Real anR2 = theCyl2.Radius(); + Standard_Real anRmin = 0., anRmax = 0.; + //Radius criterion + if (anR1 > aToMuchCoeff * anR2) + { + anRmax = anR1; anRmin = anR2; + } + else if (anR2 > aToMuchCoeff * anR1) + { + anRmax = anR2; anRmin = anR1; + } + else + { + break; + } + //Angle criterion + const gp_Ax1& anAx1 = theCyl1.Axis(); + const gp_Ax1& anAx2 = theCyl2.Axis(); + if (!anAx1.IsNormal(anAx2, aCritAngle)) + { + break; + } + //Placement criterion + gp_Lin anL1(anAx1), anL2(anAx2); + Standard_Real aDist = anL1.Distance(anL2); + if (aDist > anRmax / 2.) + { + break; + } + isGoodIntersection = Standard_True; + //Estimation of "optimal" du + //Relative deflection, absolut deflection is Rmin*aDeflection + Standard_Real aDeflection = 0.001; + Standard_Integer aNbP = 3; + if (anRmin * aDeflection > 1.e-3) + { + Standard_Real anAngle = 1.0e0 - aDeflection; + anAngle = 2.0e0 * ACos(anAngle); + aNbP = (Standard_Integer)(2. * M_PI / anAngle) + 1; + } + anOptdu = 2. * M_PI_2 / (Standard_Real)(aNbP - 1); + break; + } +// const ComputationMethods::stCoeffsValue &anEquationCoeffs = theBW.SICoeffs(); const IntSurf_Quadric& aQuad1 = theBW.GetQSurface(1); const IntSurf_Quadric& aQuad2 = theBW.GetQSurface(2); @@ -2699,15 +2750,27 @@ const Standard_Real aTol2D = theBW.Get2dTolerance(); const Standard_Real aTol3D = theBW.Get3dTolerance(); const Standard_Real aPeriod = 2.0*M_PI; - const Standard_Integer aNbMaxPoints = 2000; - const Standard_Integer aNbMinPoints = 200; - const Standard_Integer aNbPoints = Min(Max(aNbMinPoints, - RealToInt(20.0*theCyl1.Radius())), aNbMaxPoints); - const Standard_Real aStepMin = aTol2D, - aStepMax = (aUSurf1l - aUSurf1f > M_PI / 100.0) ? - (aUSurf1l - aUSurf1f) / IntToReal(aNbPoints) : - aUSurf1l - aUSurf1f; + Standard_Integer aNbMaxPoints = 1000; + Standard_Integer aNbMinPoints = 200; + Standard_Real du; + if (isGoodIntersection) + { + du = anOptdu; + aNbMaxPoints = 200; + aNbMinPoints = 50; + } + else + { + du = 2. * M_PI / aNbMaxPoints; + } + Standard_Integer aNbPts = Min(RealToInt((aUSurf1l - aUSurf1f) / du) + 1, + RealToInt(20.0*theCyl1.Radius())); + const Standard_Integer aNbPoints = Min(Max(aNbMinPoints, aNbPts), aNbMaxPoints); + const Standard_Real aStepMin = Max(aTol2D, Precision::PConfusion()), + aStepMax = (aUSurf1l - aUSurf1f > M_PI / 100.0) ? + (aUSurf1l - aUSurf1f) / IntToReal(aNbPoints) : aUSurf1l - aUSurf1f; + //The main idea of the algorithm is to change U1-parameter //(U-parameter of theCyl1) from aU1f to aU1l with some step //(step is adaptive) and to obtain set of intersection points. @@ -3279,6 +3342,16 @@ aMinUexp = Min(aMinUexp, anUexpect[i]); continue; } + // + if (isGoodIntersection) + { + //Use constant step + anUexpect[i] += aStepMax; + aMinUexp = Min(aMinUexp, anUexpect[i]); + + continue; + } + // Standard_Real aStepTmp = aStepMax; @@ -3487,7 +3560,7 @@ } #ifdef INTPATCH_IMPIMPINTERSECTION_DEBUG - //aWLine[i]->Dump(); + aWLine[i]->Dump(0); #endif } } @@ -3507,8 +3580,8 @@ const IntSurf_PntOn2S& aPntLWL1 = aWLine1->Point(aWLine1->NbPnts()); const IntSurf_PntOn2S aPntCur = theSPnt.Value(aNbPnt).PntOn2S(); - if (aPntCur.IsSame(aPntFWL1, Precision::Confusion()) || - aPntCur.IsSame(aPntLWL1, Precision::Confusion())) + if (aPntCur.IsSame(aPntFWL1, aTol3D) || + aPntCur.IsSame(aPntLWL1, aTol3D)) { theSPnt.Remove(aNbPnt); aNbPnt--; diff -Nru opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_ImpPrmIntersection.cxx opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_ImpPrmIntersection.cxx --- opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_ImpPrmIntersection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_ImpPrmIntersection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -3138,6 +3138,8 @@ const Standard_Real theToler2D, const Standard_Real thePeriod) // Period of parametric surface in direction which is perpendicular to theArc direction. { + const Standard_Real aCoeffs[] = { 0.02447174185, 0.09549150281, 0.20610737385, 0.34549150281, /*Sin(x)*Sin(x)*/ + 0.5, 0.65450849719, 0.79389262615 }; if(theLine->ArcType() == IntPatch_Restriction) {//Restriction-restriction processing const Handle(IntPatch_RLine)& aRL2 = Handle(IntPatch_RLine)::DownCast(theLine); @@ -3226,13 +3228,13 @@ const Standard_Real aUl = aPmin.X(), aVl = aPmin.Y(); - const Standard_Integer aNbPoints = 4; - const Standard_Real aStepU = (aUl - aUf)/aNbPoints, - aStepV = (aVl - aVf)/aNbPoints; - - Standard_Real aU = aUf+aStepU, aV = aVf+aStepV; - for(Standard_Integer i = 1; i < aNbPoints; i++) + Standard_Real aU, aV; + Standard_Real dU = aUl - aUf, dV = aVl - aVf; + for(Standard_Integer i = 0; i < 7; i++) { + aU = aUf + aCoeffs[i] * dU; + aV = aVf + aCoeffs[i] * dV; + aX.Value(1) = aU; aX.Value(2) = aV; @@ -3241,13 +3243,10 @@ return Standard_False; } - if(Abs(aVal(1)) > theToler3D) + if(Abs(theFunc.Root()) > theToler3D) { return Standard_False; - } - - aU += aStepU; - aV += aStepV; + } } } diff -Nru opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_InterferencePolyhedron.cxx opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_InterferencePolyhedron.cxx --- opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_InterferencePolyhedron.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_InterferencePolyhedron.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,8 +42,15 @@ //======================================================================= IntPatch_InterferencePolyhedron::IntPatch_InterferencePolyhedron () -: Intf_Interference(Standard_False) -{} +: Intf_Interference(Standard_False), + Incidence(0) +{ + memset (OI, 0, sizeof (OI)); + memset (TI, 0, sizeof (TI)); + memset (dpOeT, 0, sizeof (dpOeT)); + memset (dpOpT, 0, sizeof (dpOpT)); + memset (deOpT, 0, sizeof (deOpT)); +} //======================================================================= //function : IntPatch_InterferencePolyhedron @@ -52,8 +59,14 @@ IntPatch_InterferencePolyhedron::IntPatch_InterferencePolyhedron (const IntPatch_Polyhedron& FirstPol, const IntPatch_Polyhedron& SeconPol) -: Intf_Interference(Standard_False) +: Intf_Interference(Standard_False), + Incidence(0) { + memset (OI, 0, sizeof (OI)); + memset (TI, 0, sizeof (TI)); + memset (dpOeT, 0, sizeof (dpOeT)); + memset (dpOpT, 0, sizeof (dpOpT)); + memset (deOpT, 0, sizeof (deOpT)); if (!IntPatch_PolyhedronTool::Bounding(FirstPol).IsOut (IntPatch_PolyhedronTool::Bounding(SeconPol))) { Tolerance=IntPatch_PolyhedronTool::DeflectionOverEstimation(FirstPol)+ @@ -71,8 +84,14 @@ IntPatch_InterferencePolyhedron::IntPatch_InterferencePolyhedron (const IntPatch_Polyhedron& Objet) -: Intf_Interference(Standard_True) +: Intf_Interference(Standard_True), + Incidence(0) { + memset (OI, 0, sizeof (OI)); + memset (TI, 0, sizeof (TI)); + memset (dpOeT, 0, sizeof (dpOeT)); + memset (dpOpT, 0, sizeof (dpOpT)); + memset (deOpT, 0, sizeof (deOpT)); Tolerance=IntPatch_PolyhedronTool::DeflectionOverEstimation(Objet)*2; if (Tolerance==0.) Tolerance=Epsilon(1000.); @@ -466,7 +485,7 @@ Standard_Real div = dpOeT[iObj][iToo]-dpOeT[inext][iToo]; if(div>floatGap || div<-floatGap) { parO[iObj]=dpOeT[iObj][iToo]/ - (dpOeT[iObj][iToo]-dpOeT[inext][iToo]);; + (dpOeT[iObj][iToo]-dpOeT[inext][iToo]); piO=(IntPatch_PolyhedronTool::Point(FirstPol,OI[iObj]).XYZ()) + (voo[iObj]*parO[iObj]); } diff -Nru opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_Intersection.cxx opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_Intersection.cxx --- opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_Intersection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_Intersection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,11 +45,16 @@ //====================================================================== IntPatch_Intersection::IntPatch_Intersection () : done(Standard_False), - //empt, tgte, oppo, + empt(Standard_True), + tgte(Standard_False), + oppo(Standard_False), myTolArc(0.0), myTolTang(0.0), myUVMaxStep(0.0), myFleche(0.0), - myIsStartPnt(Standard_False) - //myU1Start, myV1Start, myU2Start, myV2Start + myIsStartPnt(Standard_False), + myU1Start(0.0), + myV1Start(0.0), + myU2Start(0.0), + myV2Start(0.0) { } @@ -63,11 +68,16 @@ const Standard_Real TolArc, const Standard_Real TolTang) : done(Standard_False), - //empt, tgte, oppo, + empt(Standard_True), + tgte(Standard_False), + oppo(Standard_False), myTolArc(TolArc), myTolTang(TolTang), myUVMaxStep(0.0), myFleche(0.0), - myIsStartPnt(Standard_False) - //myU1Start, myV1Start, myU2Start, myV2Start + myIsStartPnt(Standard_False), + myU1Start(0.0), + myV1Start(0.0), + myU2Start(0.0), + myV2Start(0.0) { if(myTolArc<1e-8) myTolArc=1e-8; if(myTolTang<1e-8) myTolTang=1e-8; @@ -84,11 +94,16 @@ const Standard_Real TolArc, const Standard_Real TolTang) : done(Standard_False), - //empt, tgte, oppo, + empt(Standard_True), + tgte(Standard_False), + oppo(Standard_False), myTolArc(TolArc), myTolTang(TolTang), myUVMaxStep(0.0), myFleche(0.0), - myIsStartPnt(Standard_False) - //myU1Start, myV1Start, myU2Start, myV2Start + myIsStartPnt(Standard_False), + myU1Start(0.0), + myV1Start(0.0), + myU2Start(0.0), + myV2Start(0.0) { Perform(S1,D1,TolArc,TolTang); } diff -Nru opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_Polyhedron.cxx opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_Polyhedron.cxx --- opencascade-7.4.1+dfsg1/src/IntPatch/IntPatch_Polyhedron.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntPatch/IntPatch_Polyhedron.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -402,12 +402,12 @@ if (colT==(colP+colP)) { colT++; linO=(ligP>ligE)? ligP : ligE; //--linO=Max(ligP, ligE); - colO=colP+1;; + colO=colP+1; } else { colT--; linO=(ligPPoint(aNbPntsWL2 - 1); if (!CheckArgumentsToJoin(theS1, theS2, aPntLWL1, aPt1.Value(), - aPntFWL1.Value(), aPt2.Value(), aMinRad)) + aPntLWL1.Value(), aPt2.Value(), aMinRad)) { continue; } diff -Nru opencascade-7.4.1+dfsg1/src/IntPolyh/IntPolyh_Point.hxx opencascade-7.5.1+dfsg1/src/IntPolyh/IntPolyh_Point.hxx --- opencascade-7.4.1+dfsg1/src/IntPolyh/IntPolyh_Point.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntPolyh/IntPolyh_Point.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -78,19 +78,7 @@ { return myPOC; } - //! Assignment operator - void Equal (const IntPolyh_Point& Pt) - { - myX = Pt.myX; - myY = Pt.myY; - myZ = Pt.myZ; - myU = Pt.myU; - myV = Pt.myV; - } - void operator = (const IntPolyh_Point& Pt) - { - Equal(Pt); - } + //! Sets the point void Set (const Standard_Real x, const Standard_Real y, diff -Nru opencascade-7.4.1+dfsg1/src/IntPolyh/IntPolyh_Triangle.cxx opencascade-7.5.1+dfsg1/src/IntPolyh/IntPolyh_Triangle.cxx --- opencascade-7.4.1+dfsg1/src/IntPolyh/IntPolyh_Triangle.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntPolyh/IntPolyh_Triangle.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -303,7 +303,7 @@ T1=FinTT; NewTriangle(numP2,numP3,FinTP,TTriangles,MySurface,TPoints); FinTT++; - T2=FinTT;; + T2=FinTT; NewTriangle(numP3,numP1,FinTP,TTriangles,MySurface,TPoints); FinTT++; diff -Nru opencascade-7.4.1+dfsg1/src/IntRes2d/IntRes2d_Intersection.hxx opencascade-7.5.1+dfsg1/src/IntRes2d/IntRes2d_Intersection.hxx --- opencascade-7.4.1+dfsg1/src/IntRes2d/IntRes2d_Intersection.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntRes2d/IntRes2d_Intersection.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -87,6 +87,16 @@ IntRes2d_Intersection(const IntRes2d_Intersection& Other); + //! Assignment + IntRes2d_Intersection& operator= (const IntRes2d_Intersection& theOther) + { + done = theOther.done; + reverse = theOther.reverse; + lpnt = theOther.lpnt; + lseg = theOther.lseg; + return *this; + } + //! Destructor is protected, for safe inheritance ~IntRes2d_Intersection () {} @@ -104,18 +114,12 @@ Standard_Boolean ReversedParameters() const; +protected: - Standard_Boolean done; - - -private: - - - - Standard_Boolean reverse; IntRes2d_SequenceOfIntersectionPoint lpnt; IntRes2d_SequenceOfIntersectionSegment lseg; - + Standard_Boolean done; + Standard_Boolean reverse; }; diff -Nru opencascade-7.4.1+dfsg1/src/IntRes2d/IntRes2d_IntersectionSegment.cxx opencascade-7.5.1+dfsg1/src/IntRes2d/IntRes2d_IntersectionSegment.cxx --- opencascade-7.4.1+dfsg1/src/IntRes2d/IntRes2d_IntersectionSegment.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntRes2d/IntRes2d_IntersectionSegment.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,9 +19,12 @@ #include #include -IntRes2d_IntersectionSegment::IntRes2d_IntersectionSegment (): - - ptfirst(),ptlast() { } +IntRes2d_IntersectionSegment::IntRes2d_IntersectionSegment () +: oppos(Standard_False), + first(Standard_False), + last(Standard_False) +{ +} diff -Nru opencascade-7.4.1+dfsg1/src/Intrv/Intrv_Intervals.cxx opencascade-7.5.1+dfsg1/src/Intrv/Intrv_Intervals.cxx --- opencascade-7.4.1+dfsg1/src/Intrv/Intrv_Intervals.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Intrv/Intrv_Intervals.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -53,14 +53,6 @@ { myInter.Append(Int); } //======================================================================= -//function : Intrv_Intervals -//purpose : -//======================================================================= - -Intrv_Intervals::Intrv_Intervals (const Intrv_Intervals& Int) -{ myInter = Int.myInter; } - -//======================================================================= //function : Intersect //purpose : //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/Intrv/Intrv_Intervals.hxx opencascade-7.5.1+dfsg1/src/Intrv/Intrv_Intervals.hxx --- opencascade-7.4.1+dfsg1/src/Intrv/Intrv_Intervals.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Intrv/Intrv_Intervals.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,11 +41,7 @@ //! Creates a sequence of one interval. Standard_EXPORT Intrv_Intervals(const Intrv_Interval& Int); - - //! Creates by copying an existing sequence of - //! intervals. - Standard_EXPORT Intrv_Intervals(const Intrv_Intervals& Int); - + //! Intersects the intervals with the interval . Standard_EXPORT void Intersect (const Intrv_Interval& Tool); diff -Nru opencascade-7.4.1+dfsg1/src/IntStart/IntStart_PathPoint.gxx opencascade-7.5.1+dfsg1/src/IntStart/IntStart_PathPoint.gxx --- opencascade-7.4.1+dfsg1/src/IntStart/IntStart_PathPoint.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntStart/IntStart_PathPoint.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -12,7 +12,11 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -IntStart_PathPoint::IntStart_PathPoint () { +IntStart_PathPoint::IntStart_PathPoint () +: tol(0.0), + isnew(Standard_True), + param(0.0) +{ } IntStart_PathPoint::IntStart_PathPoint (const gp_Pnt& P, diff -Nru opencascade-7.4.1+dfsg1/src/IntStart/IntStart_SearchOnBoundaries.gxx opencascade-7.5.1+dfsg1/src/IntStart/IntStart_SearchOnBoundaries.gxx --- opencascade-7.4.1+dfsg1/src/IntStart/IntStart_SearchOnBoundaries.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntStart/IntStart_SearchOnBoundaries.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -1076,7 +1076,8 @@ //purpose : //======================================================================= IntStart_SearchOnBoundaries::IntStart_SearchOnBoundaries () -: done(Standard_False) +: done(Standard_False), + all(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/IntStart/IntStart_Segment.gxx opencascade-7.5.1+dfsg1/src/IntStart/IntStart_Segment.gxx --- opencascade-7.4.1+dfsg1/src/IntStart/IntStart_Segment.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntStart/IntStart_Segment.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -12,7 +12,11 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -IntStart_Segment::IntStart_Segment () {} +IntStart_Segment::IntStart_Segment () +: hasfp(Standard_False), + haslp(Standard_False) +{ +} void IntStart_Segment::SetLimitPoint (const ThePathPoint& V, diff -Nru opencascade-7.4.1+dfsg1/src/IntSurf/IntSurf_InteriorPoint.cxx opencascade-7.5.1+dfsg1/src/IntSurf/IntSurf_InteriorPoint.cxx --- opencascade-7.4.1+dfsg1/src/IntSurf/IntSurf_InteriorPoint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntSurf/IntSurf_InteriorPoint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,7 +18,11 @@ #include #include -IntSurf_InteriorPoint::IntSurf_InteriorPoint () {} +IntSurf_InteriorPoint::IntSurf_InteriorPoint () +: paramu(0.0), + paramv(0.0) +{ +} IntSurf_InteriorPoint::IntSurf_InteriorPoint (const gp_Pnt& P, diff -Nru opencascade-7.4.1+dfsg1/src/IntSurf/IntSurf_Quadric.cxx opencascade-7.5.1+dfsg1/src/IntSurf/IntSurf_Quadric.cxx --- opencascade-7.4.1+dfsg1/src/IntSurf/IntSurf_Quadric.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntSurf/IntSurf_Quadric.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,8 +28,9 @@ // ============================================================ IntSurf_Quadric::IntSurf_Quadric ():typ(GeomAbs_OtherSurface), - prm1(0.), prm2(0.), prm3(0.), prm4(0.) -{} + prm1(0.), prm2(0.), prm3(0.), prm4(0.), ax3direc(Standard_False) +{ +} // ============================================================ IntSurf_Quadric::IntSurf_Quadric (const gp_Pln& P): ax3(P.Position()),typ(GeomAbs_Plane) diff -Nru opencascade-7.4.1+dfsg1/src/IntTools/IntTools_BeanFaceIntersector.cxx opencascade-7.5.1+dfsg1/src/IntTools/IntTools_BeanFaceIntersector.cxx --- opencascade-7.4.1+dfsg1/src/IntTools/IntTools_BeanFaceIntersector.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntTools/IntTools_BeanFaceIntersector.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -125,7 +125,8 @@ myVMaxParameter(0.), myBeanTolerance(0.), myFaceTolerance(0.), -myIsDone(Standard_False) +myIsDone(Standard_False), +myMinSqDistance(RealLast()) { myCriteria = Precision::Confusion(); myCurveResolution = Precision::PConfusion(); @@ -146,7 +147,8 @@ myVMaxParameter(0.), myBeanTolerance(0.), myFaceTolerance(0.), - myIsDone(Standard_False) + myIsDone(Standard_False), + myMinSqDistance(RealLast()) { Init(theEdge, theFace); } @@ -165,7 +167,8 @@ myUMaxParameter(0.), myVMinParameter(0.), myVMaxParameter(0.), - myIsDone(Standard_False) + myIsDone(Standard_False), + myMinSqDistance(RealLast()) { Init(theCurve, theSurface, theBeanTolerance, theFaceTolerance); } @@ -192,7 +195,8 @@ myVMaxParameter(theVMaxParameter), myBeanTolerance(theBeanTolerance), myFaceTolerance(theFaceTolerance), - myIsDone(Standard_False) + myIsDone(Standard_False), + myMinSqDistance(RealLast()) { myCurve = theCurve; @@ -582,10 +586,19 @@ Handle(BRepAdaptor_HSurface) aSurface = new BRepAdaptor_HSurface(mySurface); anExactIntersector.Perform(aCurve, aSurface); - - if(anExactIntersector.IsDone()) { + + if (anExactIntersector.IsDone()) { Standard_Integer i = 0; - + + if (anExactIntersector.NbPoints() > 1) + { + // To avoid unification of the intersection points in a single intersection + // range, perform exact range search considering the lowest possible tolerance + // for edge and face. + myCriteria = 3 * Precision::Confusion(); + myCurveResolution = myCurve.Resolution (myCriteria); + } + for(i = 1; i <= anExactIntersector.NbPoints(); i++) { const IntCurveSurface_IntersectionPoint& aPoint = anExactIntersector.Point(i); @@ -642,9 +655,14 @@ ComputeRangeFromStartPoint(Standard_False, aPoint.W(), U, V); ComputeRangeFromStartPoint(Standard_True, aPoint.W(), U, V); - if(aNbRanges == myRangeManager.Length()) { + if(aNbRanges == myRangeManager.Length()) + { SetEmptyResultRange(aPoint.W(), myRangeManager); - } // end if(aNbRanges == myRangeManager.Length()) + } + else + { + myMinSqDistance = 0.0; + } } } @@ -660,6 +678,7 @@ ComputeRangeFromStartPoint(Standard_False, aPoint1.W(), aPoint1.U(), aPoint1.V()); ComputeRangeFromStartPoint(Standard_True, aPoint2.W(), aPoint2.U(), aPoint2.V()); + myMinSqDistance = 0.0; } } } @@ -913,7 +932,17 @@ } GeomAdaptor_Curve aGACurve(aCurve, anarg1, anarg2); - Extrema_ExtCS theExtCS(aGACurve, aGASurface, Tol, Tol); + Extrema_ExtCS theExtCS; + theExtCS.Initialize(aGASurface, myUMinParameter, myUMaxParameter, + myVMinParameter, myVMaxParameter, Tol, Tol); + Standard_Real first = aCurve->FirstParameter(), last = aCurve->LastParameter(); + if (aCurve->IsPeriodic() || + (anarg1 >= first - Precision::PConfusion() && anarg2 <= last + Precision::PConfusion())) + { + //Extrema_ExtCS theExtCS(aGACurve, aGASurface, Tol, Tol); + theExtCS.Perform(aGACurve, anarg1, anarg2); + } + myExtrema = theExtCS; if(myExtrema.IsDone() && (myExtrema.NbExt() || myExtrema.IsParallel())) { @@ -921,6 +950,9 @@ if (myExtrema.IsParallel()) { + if (myMinSqDistance > myExtrema.SquareDistance (1)) + myMinSqDistance = myExtrema.SquareDistance (1); + if(myExtrema.SquareDistance(1) < myCriteria * myCriteria) { Standard_Real U1, V1, U2, V2; Standard_Real adistance1 = Distance(anarg1, U1, V1); @@ -1003,6 +1035,9 @@ SetEmptyResultRange(p1.Parameter(), myRangeManager); } } + + if (myMinSqDistance > myExtrema.SquareDistance (j)) + myMinSqDistance = myExtrema.SquareDistance (j); } //end for if(!solutionfound) { @@ -1105,7 +1140,7 @@ Standard_Integer aValidIndex = theIndex; Standard_Real aMinDelta = myCurveResolution * 0.5; - Standard_Real aDeltaRestrictor = myLastParameter - myFirstParameter; + Standard_Real aDeltaRestrictor = 0.1 * (myLastParameter - myFirstParameter); if(aMinDelta > aDeltaRestrictor) aMinDelta = aDeltaRestrictor * 0.5; @@ -1167,7 +1202,7 @@ aDelta = (pointfound) ? (aDelta * 2.) : (aDelta * 0.5); aDelta = (aDelta < aDeltaRestrictor) ? aDelta : aDeltaRestrictor; - + aCurPar = (ToIncreaseParameter) ? (aPrevPar + aDelta) : (aPrevPar - aDelta); diff -Nru opencascade-7.4.1+dfsg1/src/IntTools/IntTools_BeanFaceIntersector.hxx opencascade-7.5.1+dfsg1/src/IntTools/IntTools_BeanFaceIntersector.hxx --- opencascade-7.4.1+dfsg1/src/IntTools/IntTools_BeanFaceIntersector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntTools/IntTools_BeanFaceIntersector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -130,17 +130,14 @@ Standard_EXPORT void Result (IntTools_SequenceOfRanges& theResults) const; - - - -protected: - - - + //! Returns the minimal distance found between edge and face + Standard_Real MinimalSquareDistance() const + { + return myMinSqDistance; + } private: - Standard_EXPORT void ComputeAroundExactIntersection(); @@ -191,6 +188,7 @@ Handle(IntTools_Context) myContext; IntTools_SequenceOfRanges myResults; Standard_Boolean myIsDone; + Standard_Real myMinSqDistance; }; diff -Nru opencascade-7.4.1+dfsg1/src/IntTools/IntTools_Context.cxx opencascade-7.5.1+dfsg1/src/IntTools/IntTools_Context.cxx --- opencascade-7.4.1+dfsg1/src/IntTools/IntTools_Context.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntTools/IntTools_Context.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -723,14 +723,14 @@ const TopoDS_Face& aF, const Standard_Real aTol) { - Standard_Boolean bIn; + Standard_Boolean bIn = Standard_False; Standard_Real aDist; // GeomAPI_ProjectPointOnSurf& aProjector=ProjPS(aF); aProjector.Perform(aP); // - bIn = aProjector.IsDone(); - if (bIn) { + Standard_Boolean bDone = aProjector.IsDone(); + if (bDone) { aDist = aProjector.LowerDistance(); if (aDist < aTol) { Standard_Real U, V; diff -Nru opencascade-7.4.1+dfsg1/src/IntTools/IntTools_EdgeFace.cxx opencascade-7.5.1+dfsg1/src/IntTools/IntTools_EdgeFace.cxx --- opencascade-7.4.1+dfsg1/src/IntTools/IntTools_EdgeFace.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntTools/IntTools_EdgeFace.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -71,6 +71,7 @@ myIsDone=Standard_False; myErrorStatus=1; myQuickCoincidenceCheck=Standard_False; + myMinDistance = RealLast(); } //======================================================================= //function : IsCoincident @@ -92,13 +93,18 @@ myS.GetType() == GeomAbs_Plane) aNbSeg = 2; // Check only three points for Line/Plane intersection - const Standard_Real aTresh=0.5; + const Standard_Real aTresh = 0.5; const Standard_Integer aTreshIdxF = RealToInt((aNbSeg+1)*0.25), aTreshIdxL = RealToInt((aNbSeg+1)*0.75); const Handle(Geom_Surface) aSurf = BRep_Tool::Surface(myFace); aT1=myRange.First(); aT2=myRange.Last(); + Standard_Real aBndShift = 0.01 * (aT2 - aT1); + //Shifting first and last curve points in order to avoid projection + //on surface boundary and rejection projection point with minimal distance + aT1 += aBndShift; + aT2 -= aBndShift; dT=(aT2-aT1)/aNbSeg; // Standard_Boolean isClassified = Standard_False; @@ -114,8 +120,11 @@ // aD=aProjector.LowerDistance(); - if (aD>myCriteria) { - continue; + if (aD > myCriteria) { + if (aD > 100. * myCriteria) + return Standard_False; + else + continue; } // @@ -535,7 +544,10 @@ anIntersector.SetContext(myContext); // anIntersector.Perform(); - + + if (anIntersector.MinimalSquareDistance() < RealLast()) + myMinDistance = Sqrt (anIntersector.MinimalSquareDistance()); + if(!anIntersector.IsDone()) { return; } diff -Nru opencascade-7.4.1+dfsg1/src/IntTools/IntTools_EdgeFace.hxx opencascade-7.5.1+dfsg1/src/IntTools/IntTools_EdgeFace.hxx --- opencascade-7.4.1+dfsg1/src/IntTools/IntTools_EdgeFace.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntTools/IntTools_EdgeFace.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -177,6 +177,11 @@ return mySeqOfCommonPrts; } + //! Returns the minimal distance found between edge and face + Standard_Real MinimalDistance() const + { + return myMinDistance; + } protected: //! @name Protected methods performing the intersection @@ -210,6 +215,7 @@ IntTools_SequenceOfCommonPrts mySeqOfCommonPrts; IntTools_Range myRange; Standard_Boolean myQuickCoincidenceCheck; + Standard_Real myMinDistance; //!< Minimal distance found }; #endif // _IntTools_EdgeFace_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/IntTools/IntTools_TopolTool.cxx opencascade-7.5.1+dfsg1/src/IntTools/IntTools_TopolTool.cxx --- opencascade-7.4.1+dfsg1/src/IntTools/IntTools_TopolTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntTools/IntTools_TopolTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -246,6 +246,20 @@ } if(nbsu < 10) nbsu = 10; if(nbsv < 10) nbsv = 10; + // Check anisotropy + Standard_Real anULen = (usup - uinf) / myS->UResolution(1.); + Standard_Real anVLen = (vsup - vinf) / myS->VResolution(1.); + Standard_Real aRatio = anULen / anVLen; + if (aRatio >= 10.) + { + nbsu *= 2; + nbsu = Min(nbsu, aMaxNbSample); + } + else if (aRatio <= 0.1 ) + { + nbsv *= 2; + nbsv = Min(nbsv, aMaxNbSample); + } } break; case GeomAbs_SurfaceOfExtrusion: { diff -Nru opencascade-7.4.1+dfsg1/src/IntWalk/IntWalk_IWalking_1.gxx opencascade-7.5.1+dfsg1/src/IntWalk/IntWalk_IWalking_1.gxx --- opencascade-7.4.1+dfsg1/src/IntWalk/IntWalk_IWalking_1.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntWalk/IntWalk_IWalking_1.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,7 +59,7 @@ if(!theFunc.Value(aX, aVal)) continue; - if(aVal(1) > aTol) + if(Abs(theFunc.Root()) > aTol) return Standard_False; } @@ -77,9 +77,14 @@ pas(Increment), tolerance(1,2), epsilon(Epsilon*Epsilon), + reversed(Standard_False), wd1 (IntWalk_VectorOfWalkingData::allocator_type (new NCollection_IncAllocator)), wd2 (wd1.get_allocator()), nbMultiplicities (wd1.get_allocator()), + Um(0.0), + UM(0.0), + Vm(0.0), + VM(0.0), ToFillHoles(theToFillHoles) { } diff -Nru opencascade-7.4.1+dfsg1/src/IntWalk/IntWalk_IWalking_2.gxx opencascade-7.5.1+dfsg1/src/IntWalk/IntWalk_IWalking_2.gxx --- opencascade-7.4.1+dfsg1/src/IntWalk/IntWalk_IWalking_2.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntWalk/IntWalk_IWalking_2.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -141,7 +141,7 @@ } BornSup(1) = BornInf(1); // limit the parameter UVap(1) = BornInf(1); - UVap(2) += Step*Duvy*StepSign;; + UVap(2) += Step*Duvy*StepSign; return Standard_True; } else if (supu) { // jag 940616 diff -Nru opencascade-7.4.1+dfsg1/src/IntWalk/IntWalk_PWalking.cxx opencascade-7.5.1+dfsg1/src/IntWalk/IntWalk_PWalking.cxx --- opencascade-7.4.1+dfsg1/src/IntWalk/IntWalk_PWalking.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IntWalk/IntWalk_PWalking.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -202,10 +202,15 @@ done(Standard_True), close(Standard_False), +tgfirst(Standard_False), +tglast(Standard_False), +myTangentIdx(0), fleche(Deflection), +pasMax(0.0), tolconf(Epsilon), myTolTang(TolTangency), sensCheminement(1), +previoustg(Standard_False), myIntersectionOn2S(Caro1,Caro2,TolTangency), STATIC_BLOCAGE_SUR_PAS_TROP_GRAND(0), STATIC_PRECEDENT_INFLEXION(0) diff -Nru opencascade-7.4.1+dfsg1/src/IVtk/IVtk_Types.hxx opencascade-7.5.1+dfsg1/src/IVtk/IVtk_Types.hxx --- opencascade-7.4.1+dfsg1/src/IVtk/IVtk_Types.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtk/IVtk_Types.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -86,7 +86,8 @@ MT_BoundaryEdge = 4, //!< Boundary edge (related to a single face) MT_SharedEdge = 5, //!< Shared edge (related to several faces) MT_WireFrameFace = 6, //!< Wireframe face - MT_ShadedFace = 7 //!< Shaded face + MT_ShadedFace = 7, //!< Shaded face + MT_SeamEdge = 8 //!< Seam edge between faces } IVtk_MeshType; //! @enum IVtk_DisplayMode Display modes for 3D shapes diff -Nru opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw.cxx opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw.cxx --- opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,47 +13,10 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - -#ifdef NOMINMAX -#undef NOMINMAX /* avoid #define min() and max() */ -#endif -#ifdef NOMSG -#undef NOMSG /* avoid #define SendMessage etc. */ -#endif -#ifdef NODRAWTEXT -#undef NODRAWTEXT /* avoid #define DrawText etc. */ -#endif -#ifdef NONLS -#undef NONLS /* avoid #define CompareString etc. */ -#endif -#ifdef NOGDI -#undef NOGDI /* avoid #define SetPrinter (winspool.h) etc. */ -#endif -#ifdef NOSERVICE -#undef NOSERVICE -#endif -#ifdef NOKERNEL -#undef NOKERNEL -#endif -#ifdef NOUSER -#undef NOUSER -#endif -#ifdef NOMCX -#undef NOMCX -#endif -#ifdef NOIME -#undef NOIME -#endif - -#include -#ifdef HAVE_STRINGS_H -# include -#endif - #ifdef _WIN32 -#include -#include -#include + #include + #include + #include #endif #include @@ -69,6 +32,8 @@ #include #include #include +#include +#include #include #include @@ -86,10 +51,7 @@ #include // prevent disabling some MSVC warning messages by VTK headers -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable: 4244) -#endif +#include #include #include #include @@ -113,26 +75,20 @@ #include #include #ifndef _WIN32 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif -#ifdef _MSC_VER -#pragma warning(pop) + #include + #include + #include + #include + #include + #include + #include + #include + #include #endif +#include -// workaround name conflicts with OCCT methods (in class TopoDS_Shape for example) -#ifdef Convex - #undef Convex -#endif -#ifdef Status - #undef Status +#if (VTK_MAJOR_VERSION > 8) || (VTK_MAJOR_VERSION == 8 && VTK_MINOR_VERSION >= 1) + #define HAVE_VTK_SRGB #endif //================================================================ @@ -252,13 +208,13 @@ // Function : WClass // Purpose : //========================================================= -const Handle(Standard_Transient)& IVtkDraw::WClass() +const Handle(WNT_WClass)& IVtkDraw::WClass() { - static Handle(Standard_Transient) aWindowClass; + static Handle(WNT_WClass) aWindowClass; #ifdef _WIN32 if (aWindowClass.IsNull()) { - aWindowClass = new WNT_WClass ("GWVTK_Class", DefWindowProc, + aWindowClass = new WNT_WClass ("GWVTK_Class", NULL, CS_VREDRAW | CS_HREDRAW, 0, 0, ::LoadCursorW (NULL, IDC_ARROW)); } @@ -268,45 +224,36 @@ //============================================================== // Function : ViewerInit -// Purpose : +// Purpose : //============================================================== -void IVtkDraw::ViewerInit (Standard_Integer thePxLeft, - Standard_Integer thePxTop, - Standard_Integer thePxWidth, - Standard_Integer thePxHeight) +void IVtkDraw::ViewerInit (const IVtkWinParams& theParams) { - static Standard_Boolean isFirst = Standard_True; - - Standard_Integer aPxLeft = 0; - Standard_Integer aPxTop = 460; - Standard_Integer aPxWidth = 409; - Standard_Integer aPxHeight = 409; - - if (thePxLeft != 0) + Standard_Integer aPxLeft = 0, aPxTop = 460; + Standard_Integer aPxWidth = 409, aPxHeight = 409; + if (theParams.TopLeft.x() != 0) { - aPxLeft = thePxLeft; + aPxLeft = theParams.TopLeft.x(); } - if (thePxTop != 0) + if (theParams.TopLeft.y() != 0) { - aPxTop = thePxTop; + aPxTop = theParams.TopLeft.y(); } - if (thePxWidth != 0) + if (theParams.Size.x() != 0) { - aPxWidth = thePxWidth; + aPxWidth = theParams.Size.x(); } - if (thePxHeight != 0) + if (theParams.Size.y() != 0) { - aPxHeight = thePxHeight; + aPxHeight = theParams.Size.y(); } - - if (isFirst) + + if (!GetRenderer()) { SetDisplayConnection (new Aspect_DisplayConnection ()); #ifdef _WIN32 if (GetWindow().IsNull()) { - GetWindow() = new WNT_Window ("IVtkTest", - Handle(WNT_WClass)::DownCast (WClass()), + GetWindow() = new WNT_Window ("IVtkTest", WClass(), WS_OVERLAPPEDWINDOW, aPxLeft, aPxTop, aPxWidth, aPxHeight, @@ -332,6 +279,17 @@ GetRenderer()->GetActiveCamera()->ParallelProjectionOn(); aRenWin->SetSize (aPxWidth, aPxHeight); + aRenWin->SetMultiSamples (theParams.NbMsaaSample); + aRenWin->SetAlphaBitPlanes (1); + #ifdef HAVE_VTK_SRGB + aRenWin->SetUseSRGBColorSpace (theParams.UseSRGBColorSpace); + #else + if (theParams.UseSRGBColorSpace) + { + Message::SendWarning() << "Warning: skipped option -srgb unsupported by old VTK"; + } + #endif + #ifdef _WIN32 aRenWin->SetWindowId((void*)GetWindow()->HWindow()); #else @@ -383,8 +341,6 @@ aRenWin->SetOffScreenRendering(Draw_VirtualWindows); aRenWin->Render(); - - isFirst = Standard_False; } GetWindow()->Map(); @@ -395,15 +351,134 @@ // Purpose : //================================================================ static Standard_Integer VtkInit (Draw_Interpretor& , - Standard_Integer theArgNum, - const char** theArgs) + Standard_Integer theNbArgs, + const char** theArgVec) { - Standard_Integer aPxLeft = (theArgNum > 1) ? atoi(theArgs[1]) : 0; - Standard_Integer aPxTop = (theArgNum > 2) ? atoi(theArgs[2]) : 0; - Standard_Integer aPxWidth = (theArgNum > 3) ? atoi(theArgs[3]) : 0; - Standard_Integer aPxHeight = (theArgNum > 4) ? atoi(theArgs[4]) : 0; + bool hasSize = false; + IVtkDraw::IVtkWinParams aParams; + for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter) + { + TCollection_AsciiString anArg (theArgVec[anArgIter]); + anArg.LowerCase(); + if (anArg == "-msaa" + && anArgIter + 1 < theNbArgs) + { + aParams.NbMsaaSample = Draw::Atoi (theArgVec[++anArgIter]); + } + else if (anArg == "-srgb") + { + aParams.UseSRGBColorSpace = true; + if (anArgIter + 1 < theNbArgs + && Draw::ParseOnOff (theArgVec[anArgIter + 1], aParams.UseSRGBColorSpace)) + { + ++anArgIter; + } + } + else if (!hasSize + && anArgIter + 3 < theNbArgs) + { + aParams.TopLeft.SetValues (Draw::Atoi (theArgVec[anArgIter + 0]), + Draw::Atoi (theArgVec[anArgIter + 1])); + aParams.Size .SetValues (Draw::Atoi (theArgVec[anArgIter + 2]), + Draw::Atoi (theArgVec[anArgIter + 3])); + } + else + { + Message::SendFail() << "Syntax error at '" << anArg << "'"; + return 1; + } + } - IVtkDraw::ViewerInit (aPxLeft, aPxTop, aPxWidth, aPxHeight); + IVtkDraw::ViewerInit (aParams); + return 0; +} + +//================================================================ +// Function : VtkClose +// Purpose : +//================================================================ +static Standard_Integer VtkClose (Draw_Interpretor& , + Standard_Integer theNbArgs, + const char** ) +{ + if (theNbArgs > 1) + { + Message::SendFail() << "Syntax error: wrong number of arguments"; + return 1; + } + + if (GetWindow()) + { + GetWindow()->Unmap(); + } + + GetWindow().Nullify(); + if (GetInteractor()) + { + GetInteractor()->GetRenderWindow()->Finalize(); + //GetInteractor()->SetRenderWindow (NULL); + GetInteractor()->TerminateApp(); + } + + GetInteractor() = NULL; + GetRenderer() = NULL; + GetPicker() = NULL; + return 0; +} + +//================================================================ +// Function : VtkRenderParams +// Purpose : +//================================================================ +static Standard_Integer VtkRenderParams (Draw_Interpretor& , + Standard_Integer theNbArgs, + const char** theArgVec) +{ + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) + { + Message::SendFail() << "Syntax error: call ivtkinit before"; + return 1; + } + else if (theNbArgs <= 1) + { + Message::SendFail() << "Syntax error: wrong number of arguments"; + return 1; + } + + for (Standard_Integer anArgIter = 1; anArgIter < theNbArgs; ++anArgIter) + { + TCollection_AsciiString anArg (theArgVec[anArgIter]); + anArg.LowerCase(); + if (anArg == "-depthpeeling" + && anArgIter + 1 < theNbArgs) + { + Standard_Integer aNbLayers = Draw::Atoi (theArgVec[++anArgIter]); + GetRenderer()->SetUseDepthPeeling (aNbLayers > 0); + GetRenderer()->SetMaximumNumberOfPeels (aNbLayers); + } + else if (anArg == "-shadows") + { + bool toUseShadows = true; + if (anArgIter + 1 < theNbArgs + && Draw::ParseOnOff (theArgVec[anArgIter + 1], toUseShadows)) + { + ++anArgIter; + } + #if (VTK_MAJOR_VERSION >= 7) + GetRenderer()->SetUseShadows (toUseShadows); + #else + Message::SendWarning() << "Warning: skipped option -shadows unsupported by old VTK"; + #endif + } + else + { + Message::SendFail() << "Syntax error at '" << anArg << "'"; + return 1; + } + } + + GetInteractor()->GetRenderWindow()->Render(); return 0; } @@ -431,22 +506,20 @@ // Purpose : //================================================================ -static Standard_Integer VtkDisplay (Draw_Interpretor& theDI, +static Standard_Integer VtkDisplay (Draw_Interpretor& , Standard_Integer theArgNum, const char** theArgs) { - // Check viewer - if (!GetInteractor()->IsEnabled()) + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) { - theDI << theArgs[0] << " error : call ivtkinit before\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Error : call ivtkinit before"; + return 1; } - - // Check arguments if (theArgNum < 2) { - theDI << theArgs[0] << " error : expects at least 1 argument\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Error : expects at least 1 argument\n"; + return 1; } TCollection_AsciiString aName; @@ -518,21 +591,21 @@ // Function : VtkErase // Purpose : //================================================================ -static Standard_Integer VtkErase (Draw_Interpretor& theDI, +static Standard_Integer VtkErase (Draw_Interpretor& , Standard_Integer theArgNum, const char** theArgs) { - // Check viewer - if (!GetInteractor()->IsEnabled()) + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) { - theDI << theArgs[0] << " error : call ivtkinit before\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Error: call ivtkinit before"; + return 1; } vtkSmartPointer aRenderer = GetRenderer(); - // Erase all objects if (theArgNum == 1) { + // Erase all objects DoubleMapOfActorsAndNames::Iterator anIterator (GetMapOfActors()); while (anIterator.More()) { @@ -540,17 +613,20 @@ anIterator.Next(); } } - // Erase named objects else { - TCollection_AsciiString aName; + // Erase named objects for (Standard_Integer anIndex = 1; anIndex < theArgNum; ++anIndex) { - aName = theArgs[anIndex]; - if (GetMapOfActors().IsBound2 (aName)) + TCollection_AsciiString aName = theArgs[anIndex]; + vtkSmartPointer anActor; + if (!GetMapOfActors().Find2 (aName, anActor)) { - PipelineByActorName (aName)->RemoveFromRenderer (aRenderer); + Message::SendFail() << "Syntax error: object '" << aName << "' not found"; + return 1; } + + PipelineByActorName (aName)->RemoveFromRenderer (aRenderer); } } @@ -564,29 +640,26 @@ // Function : VtkRemove // Purpose : Remove the actor from memory. //================================================================ -static Standard_Integer VtkRemove(Draw_Interpretor& theDI, - Standard_Integer theArgNum, - const char** theArgs) +static Standard_Integer VtkRemove (Draw_Interpretor& , + Standard_Integer theArgNum, + const char** theArgs) { - // Check viewer - if (!GetInteractor()->IsEnabled()) + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) { - theDI << theArgs[0] << " error : call ivtkinit before\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Error: call ivtkinit before"; + return 1; } vtkSmartPointer aRenderer = GetRenderer(); - - // Remove all objects if (theArgNum == 1) { // Remove all actors from the renderer DoubleMapOfActorsAndNames::Iterator anIterator(GetMapOfActors()); while (anIterator.More()) { - vtkSmartPointer aSrc = - IVtkTools_ShapeObject::GetShapeSource(anIterator.Key1()); - if (aSrc.GetPointer() != NULL && !(aSrc->GetShape().IsNull())) + vtkSmartPointer aSrc = IVtkTools_ShapeObject::GetShapeSource (anIterator.Key1()); + if (aSrc.GetPointer() != NULL && !aSrc->GetShape().IsNull()) { GetPicker()->RemoveSelectableObject(aSrc->GetShape()); } @@ -606,34 +679,35 @@ GetMapOfActors().Clear(); GetPipelines()->Clear(); } - // Remove named objects else { - TCollection_AsciiString aName; + // Remove named objects for (Standard_Integer anIndex = 1; anIndex < theArgNum; ++anIndex) { - aName = theArgs[anIndex]; - if (GetMapOfActors().IsBound2(aName)) + TCollection_AsciiString aName = theArgs[anIndex]; + vtkSmartPointer anActor; + if (!GetMapOfActors().Find2 (aName, anActor)) { - // Remove the actor and its pipeline (if found) from the renderer - vtkSmartPointer anActor = GetMapOfActors().Find2(aName); - vtkSmartPointer aSrc = - IVtkTools_ShapeObject::GetShapeSource(anActor); - if (aSrc.GetPointer() != NULL && !(aSrc->GetShape().IsNull())) - { - IVtk_IdType aShapeID = aSrc->GetShape()->GetId(); - GetPicker()->RemoveSelectableObject(aSrc->GetShape()); - GetPipeline(aSrc->GetShape()->GetId())->RemoveFromRenderer(aRenderer); - GetPipelines()->UnBind(aShapeID); // Remove a pipepline - } - else - { - aRenderer->RemoveActor(anActor); - } - // Remove the TopoDS_Shape and the actor - GetMapOfShapes().UnBind2(aName); // Remove a TopoDS shape - GetMapOfActors().UnBind2(aName); // Remove an actor + Message::SendFail() << "Syntax error: object '" << aName << "' not found"; + return 1; } + + // Remove the actor and its pipeline (if found) from the renderer + vtkSmartPointer aSrc = IVtkTools_ShapeObject::GetShapeSource (anActor); + if (aSrc.GetPointer() != NULL && !aSrc->GetShape().IsNull()) + { + IVtk_IdType aShapeID = aSrc->GetShape()->GetId(); + GetPicker()->RemoveSelectableObject (aSrc->GetShape()); + GetPipeline (aSrc->GetShape()->GetId())->RemoveFromRenderer (aRenderer); + GetPipelines()->UnBind (aShapeID); // Remove a pipepline + } + else + { + aRenderer->RemoveActor (anActor); + } + // Remove the TopoDS_Shape and the actor + GetMapOfShapes().UnBind2 (aName); // Remove a TopoDS shape + GetMapOfActors().UnBind2 (aName); // Remove an actor } } @@ -648,34 +722,30 @@ // Purpose : // Draw args : ivtksetdispmode [name] mode(0,1) //================================================================ -static Standard_Integer VtkSetDisplayMode (Draw_Interpretor& theDI, +static Standard_Integer VtkSetDisplayMode (Draw_Interpretor& , Standard_Integer theArgNum, const char** theArgs) { - // Check viewer - if (!GetInteractor()->IsEnabled()) + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) { - theDI << theArgs[0] << " error: call ivtkinit before\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Error: call ivtkinit before"; + return 1; } - - // Check arguments - if (theArgNum != 2 && theArgNum != 3) + else if (theArgNum != 2 && theArgNum != 3) { - theDI << theArgs[0] << " error: expects 1 or 2 arguments\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Syntax error: expects 1 or 2 arguments"; + return 1; } - vtkSmartPointer anActor; - // Set disp mode for all objects if (theArgNum == 2) { - // Get mode - Standard_Integer aMode = Draw::Atoi (theArgs[1]); + // Set disp mode for all objects + Standard_Integer aMode = Draw::Atoi (theArgs[1]); // Get mode DoubleMapOfActorsAndNames::Iterator anIter (GetMapOfActors()); while (anIter.More()) { - anActor = anIter.Key1(); + vtkSmartPointer anActor = anIter.Key1(); IVtkTools_ShapeDataSource* aSrc = IVtkTools_ShapeObject::GetShapeSource (anActor); if (aSrc) { @@ -694,23 +764,113 @@ // Set disp mode for named object else { - Standard_Integer aMode = atoi(theArgs[2]); TCollection_AsciiString aName = theArgs[1]; - if (GetMapOfActors().IsBound2 (aName)) + vtkSmartPointer anActor; + if (!GetMapOfActors().Find2 (aName, anActor)) { - anActor = GetMapOfActors().Find2 (aName); - vtkSmartPointer aSrc = IVtkTools_ShapeObject::GetShapeSource (anActor); + Message::SendFail() << "Syntax error: object '" << aName << "' not found"; + return 1; + } + + Standard_Integer aMode = atoi(theArgs[2]); + vtkSmartPointer aSrc = IVtkTools_ShapeObject::GetShapeSource (anActor); + if (aSrc) + { + IVtkOCC_Shape::Handle anOccShape = aSrc->GetShape(); + if (!anOccShape.IsNull()) + { + IVtkTools_DisplayModeFilter* aFilter = GetPipeline (anOccShape->GetId())->GetDisplayModeFilter(); + aFilter->SetDisplayMode ((IVtk_DisplayMode)aMode); + aFilter->Modified(); + aFilter->Update(); + } + } + } + + // Redraw window + GetInteractor()->Render(); + return 0; +} + +//================================================================ +// Function : VtkSetBoundaryDraw +// Purpose : +//================================================================ +static Standard_Integer VtkSetBoundaryDraw (Draw_Interpretor& , + Standard_Integer theArgNum, + const char** theArgs) +{ + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) + { + Message::SendFail() << "Error: call ivtkinit before"; + return 1; + } + else if (theArgNum != 2 && theArgNum != 3) + { + Message::SendFail() << "Syntax error: expects 1 or 2 arguments"; + return 1; + } + + if (theArgNum == 2) + { + // Set disp mode for all objects + Standard_Boolean toDraw = true; + Draw::ParseOnOff (theArgs[1], toDraw); + DoubleMapOfActorsAndNames::Iterator anIter(GetMapOfActors()); + while (anIter.More()) + { + vtkSmartPointer anActor = anIter.Key1(); + // Set Red color for boundary edges + vtkLookupTable* aTable = (vtkLookupTable*)anActor->GetMapper()->GetLookupTable(); + IVtkTools::SetLookupTableColor(aTable, MT_SharedEdge, 1., 0., 0., 1.); + + IVtkTools_ShapeDataSource* aSrc = IVtkTools_ShapeObject::GetShapeSource(anActor); if (aSrc) { IVtkOCC_Shape::Handle anOccShape = aSrc->GetShape(); if (!anOccShape.IsNull()) { - IVtkTools_DisplayModeFilter* aFilter = GetPipeline (anOccShape->GetId())->GetDisplayModeFilter(); - aFilter->SetDisplayMode ((IVtk_DisplayMode)aMode); + IVtkTools_DisplayModeFilter* aFilter = GetPipeline(anOccShape->GetId())->GetDisplayModeFilter(); + aFilter->SetDisplayMode(DM_Shading); + aFilter->SetFaceBoundaryDraw(toDraw != 0); aFilter->Modified(); aFilter->Update(); } } + anIter.Next(); + } + } + else + { + // Set disp mode for named object + TCollection_AsciiString aName = theArgs[1]; + vtkSmartPointer anActor; + if (!GetMapOfActors().Find2 (aName, anActor)) + { + Message::SendFail() << "Syntax error: object '" << aName << "' not found"; + return 1; + } + + Standard_Boolean toDraw = true; + Draw::ParseOnOff (theArgs[2], toDraw); + + // Set Red color for boundary edges + vtkLookupTable* aTable = (vtkLookupTable*)anActor->GetMapper()->GetLookupTable(); + IVtkTools::SetLookupTableColor (aTable, MT_SharedEdge, 1., 0., 0., 1.); + + vtkSmartPointer aSrc = IVtkTools_ShapeObject::GetShapeSource (anActor); + if (aSrc) + { + IVtkOCC_Shape::Handle anOccShape = aSrc->GetShape(); + if (!anOccShape.IsNull()) + { + IVtkTools_DisplayModeFilter* aFilter = GetPipeline (anOccShape->GetId())->GetDisplayModeFilter(); + aFilter->SetDisplayMode (DM_Shading); + aFilter->SetFaceBoundaryDraw (toDraw != 0); + aFilter->Modified(); + aFilter->Update(); + } } } @@ -721,45 +881,38 @@ //================================================================ // Function : VtkSetSelectionMode -// Purpose : -// Draw args : ivtksetselmode [name] mode on/off(0,1) +// Purpose : //================================================================ -static Standard_Integer VtkSetSelectionMode (Draw_Interpretor& theDI, +static Standard_Integer VtkSetSelectionMode (Draw_Interpretor& , Standard_Integer theArgNum, const char** theArgs) { - // Check viewer - if (!GetInteractor()->IsEnabled()) + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) { - theDI << theArgs[0] << " error: call ivtkinit before\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Error: call ivtkinit before"; + return 1; } - - // Check arguments - if (theArgNum != 3 && theArgNum != 4) + else if (theArgNum != 3 && theArgNum != 4) { - theDI << theArgs[0] << " error: expects 2 or 3 arguments\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Syntax error: expects 2 or 3 arguments"; + return 1; } - vtkSmartPointer anActor; - Standard_Integer aMode; - Standard_Boolean isTurnOn; - // Set sel mode for all objects if (theArgNum == 3) { - aMode = atoi (theArgs[1]); - isTurnOn = (atoi (theArgs[2]) != 0); - if (aMode < 0 || aMode > 8) + // Set sel mode for all objects + const Standard_Integer aMode = Draw::Atoi (theArgs[1]); + Standard_Boolean isTurnOn = true; + if (aMode < 0 || aMode > 8 || !Draw::ParseOnOff (theArgs[2], isTurnOn)) { - theDI << theArgs[0] << " error: only 0-8 selection modes are supported\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Syntax error: only 0-8 selection modes are supported"; + return 1; } DoubleMapOfActorsAndNames::Iterator anIter (GetMapOfActors()); while (anIter.More()) { - anActor = anIter.Key1(); - + vtkSmartPointer anActor = anIter.Key1(); if (aMode == SM_Shape && isTurnOn) { IVtk_SelectionModeList aList = GetPicker()->GetSelectionModes (anActor); @@ -806,23 +959,21 @@ } } - // Set sel mode for named object if (theArgNum == 4) { - aMode = atoi (theArgs[2]); - isTurnOn = (atoi (theArgs[3]) != 0); - - if (aMode < 0 || aMode > 8) + // Set sel mode for named object + const Standard_Integer aMode = Draw::Atoi (theArgs[2]); + Standard_Boolean isTurnOn = true; + if (aMode < 0 || aMode > 8 || !Draw::ParseOnOff (theArgs[3], isTurnOn)) { - theDI << theArgs[0] << " error: only 0-8 selection modes are supported\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Syntax error: only 0-8 selection modes are supported"; + return 1; } TCollection_AsciiString aName = theArgs[1]; if (GetMapOfActors().IsBound2 (aName)) { - anActor = GetMapOfActors().Find2 (aName); - + vtkSmartPointer anActor = GetMapOfActors().Find2 (aName); if (aMode == SM_Shape && isTurnOn) { IVtk_SelectionModeList aList = GetPicker()->GetSelectionModes (anActor); @@ -870,7 +1021,127 @@ // Redraw window GetInteractor()->Render(); + return 0; +} + +//================================================================ +// Function : VtkSetColor +// Purpose : +//================================================================ +static Standard_Integer VtkSetColor (Draw_Interpretor& , + Standard_Integer theArgNb, + const char** theArgVec) +{ + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) + { + Message::SendFail() << "Error: call ivtkinit before\n"; + return 1; + } + + NCollection_Sequence< vtkSmartPointer > anActorSeq; + Quantity_Color aQColor; + bool hasColor = false; + for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) + { + TCollection_AsciiString anArg (theArgVec[anArgIter]); + vtkSmartPointer anActor; + if (hasColor) + { + Message::SendFail() << "Syntax error at '" << anArg << "'"; + return 1; + } + else if (GetMapOfActors().Find2 (anArg, anActor)) + { + anActorSeq.Append (anActor); + } + else + { + Standard_Integer aNbParsed = Draw::ParseColor (theArgNb - anArgIter, + theArgVec + anArgIter, + aQColor); + if (aNbParsed == 0) + { + Message::SendFail() << "Syntax error at '" << anArg << "'"; + return 1; + } + anArgIter += aNbParsed - 1; + hasColor = true; + } + } + if (!hasColor || anActorSeq.IsEmpty()) + { + Message::SendFail() << "Syntax error: wrong number of arguments"; + return 1; + } + + bool isSRGBAware = false; +#ifdef HAVE_VTK_SRGB + isSRGBAware = GetRenderer()->GetRenderWindow()->GetUseSRGBColorSpace(); +#endif + const Graphic3d_Vec3 aColor = isSRGBAware ? (Graphic3d_Vec3 )aQColor : Quantity_Color::Convert_LinearRGB_To_sRGB ((Graphic3d_Vec3 )aQColor); + for (NCollection_Sequence< vtkSmartPointer >::Iterator anActorIter (anActorSeq); anActorIter.More(); anActorIter.Next()) + { + const vtkSmartPointer& anActor = anActorIter.Value(); + vtkLookupTable* aTable = (vtkLookupTable* )anActor->GetMapper()->GetLookupTable(); + IVtkTools::SetLookupTableColor (aTable, MT_ShadedFace, aColor.r(), aColor.g(), aColor.b(), 1.0); + } + GetInteractor()->Render(); + return 0; +} + +//================================================================ +// Function : VtkSetTransparency +// Purpose : +//================================================================ +static Standard_Integer VtkSetTransparency (Draw_Interpretor& , + Standard_Integer theArgNb, + const char** theArgVec) +{ + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) + { + Message::SendFail() << "Error: call ivtkinit before\n"; + return 1; + } + + NCollection_Sequence< vtkSmartPointer > anActorSeq; + Standard_Real aTransparency = -1.0; + for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) + { + TCollection_AsciiString anArg (theArgVec[anArgIter]); + vtkSmartPointer anActor; + if (aTransparency >= 0.0) + { + Message::SendFail() << "Syntax error at '" << anArg << "'"; + return 1; + } + else if (GetMapOfActors().Find2 (anArg, anActor)) + { + anActorSeq.Append (anActor); + } + else if (!Draw::ParseReal (theArgVec[anArgIter], aTransparency) + || aTransparency < 0.0 + || aTransparency >= 1.0) + { + Message::SendFail() << "Syntax error at '" << anArg << "'"; + return 1; + } + } + if (aTransparency < 0.0 || aTransparency >= 1) + { + Message::SendFail() << "Syntax error: wrong number of arguments"; + return 1; + } + + for (NCollection_Sequence< vtkSmartPointer >::Iterator anActorIter (anActorSeq); anActorIter.More(); anActorIter.Next()) + { + const vtkSmartPointer& anActor = anActorIter.Value(); + anActor->GetProperty()->SetOpacity (1.0 - aTransparency); + } + + GetInteractor()->Render(); return 0; } @@ -883,18 +1154,16 @@ Standard_Integer theArgNum, const char** theArgs) { - // Check viewer - if (!GetInteractor()->IsEnabled()) + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) { - theDI << theArgs[0] << " error: call ivtkinit before\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Error: call ivtkinit before"; + return 1; } - - // Check args - if (theArgNum != 3) + else if (theArgNum != 3) { - theDI << theArgs[0] << " error: expects 2 arguments\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Syntax error: expects 2 arguments"; + return 1; } Standard_Integer anY = GetInteractor()->GetRenderWindow()->GetSize()[1] - atoi (theArgs[2]) - 1; @@ -908,25 +1177,22 @@ //================================================================ // Function : VtkSelect -// Purpose : -// Draw args : ivtkselect x y +// Purpose : //================================================================ -static Standard_Integer VtkSelect (Draw_Interpretor& theDI, +static Standard_Integer VtkSelect (Draw_Interpretor& , Standard_Integer theArgNum, const char** theArgs) { - // Check viewer - if (!GetInteractor()->IsEnabled()) + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) { - theDI << theArgs[0] << " error: call ivtkinit before\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Error: call ivtkinit before"; + return 1; } - - // Check args - if (theArgNum != 3) + else if (theArgNum != 3) { - theDI << theArgs[0] << " error: expects 3 arguments\n"; - return 1; // TCL_ERROR + Message::SendFail() << "Syntax error: expects 3 arguments"; + return 1; } Standard_Integer anY = GetInteractor()->GetRenderWindow()->GetSize()[1] - atoi (theArgs[2]) - 1; @@ -937,20 +1203,87 @@ } //=================================================================== -// Fubction : VtkFit +// Fubction : VtkViewProj // Purpose : -// Draw args : ivtkfit //=================================================================== - -static Standard_Integer VtkFit (Draw_Interpretor& theDI, - Standard_Integer, - const char** theArgs) +static Standard_Integer VtkViewProj (Draw_Interpretor& , + Standard_Integer theNbArgs, + const char** theArgVec) { - // Check viewer - if (!GetInteractor()->IsEnabled()) + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) { - theDI << theArgs[0] << " error : call ivtkinit before \n"; - return 1; //TCL_ERROR + Message::SendFail() << "Error: call ivtkinit before"; + return 1; + } + else if (theNbArgs != 1) + { + Message::SendFail() << "Syntax error: wrong number of arguments"; + return 1; + } + + TCollection_AsciiString aCmd (theArgVec[0]); + aCmd.LowerCase(); + + V3d_TypeOfOrientation aProj = V3d_Xpos; + bool hasProjDir = false; + if (aCmd == "ivtkaxo") + { + hasProjDir = true; + aProj = V3d_TypeOfOrientation_Zup_AxoRight; + } + else if (aCmd == "ivtktop") + { + hasProjDir = true; + aProj = V3d_TypeOfOrientation_Zup_Top; + } + else if (aCmd == "ivtkbottom") + { + hasProjDir = true; + aProj = V3d_TypeOfOrientation_Zup_Bottom; + } + else if (aCmd == "ivtkfront") + { + hasProjDir = true; + aProj = V3d_TypeOfOrientation_Zup_Front; + } + else if (aCmd == "ivtkback") + { + hasProjDir = true; + aProj = V3d_TypeOfOrientation_Zup_Back; + } + else if (aCmd == "ivtkleft") + { + hasProjDir = true; + aProj = V3d_TypeOfOrientation_Zup_Left; + } + else if (aCmd == "ivtkright") + { + hasProjDir = true; + aProj = V3d_TypeOfOrientation_Zup_Right; + } + + if (hasProjDir) + { + const gp_Dir aBck = V3d::GetProjAxis (aProj); + Graphic3d_Vec3d anUp (0.0, 0.0, 1.0); + if (aProj == V3d_Zpos) + { + anUp.SetValues (0.0, 1.0, 0.0); + } + else if (aProj == V3d_Zneg) + { + anUp.SetValues (0.0, -1.0, 0.0); + } + + vtkCamera* aCam = GetRenderer()->GetActiveCamera(); + const double aDist = aCam->GetDistance(); + + Graphic3d_Vec3d aNewEye = Graphic3d_Vec3d (aBck.X(), aBck.Y(), aBck.Z()) * aDist; + aCam->SetPosition (aNewEye.x(), aNewEye.y(), aNewEye.z()); + aCam->SetFocalPoint (0.0, 0.0, 0.0); + aCam->SetViewUp (anUp.x(), anUp.y(), anUp.z()); + aCam->OrthogonalizeViewUp(); } GetRenderer()->ResetCamera(); @@ -961,28 +1294,24 @@ //=================================================================== // Fubction : VtkDump // Purpose : -// Draw args : ivtkdump FullFilename.{png|bmp|jpeg|tiff|pnm} -// [buffer={rgb|rgba|depth}] [width height] -// [stereoproj={L|R}] //=================================================================== -static Standard_Integer VtkDump (Draw_Interpretor& theDI, +static Standard_Integer VtkDump (Draw_Interpretor& , Standard_Integer theArgNum, const char** theArgs) { - // Check viewer - if (!GetInteractor()->IsEnabled()) + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) { - std::cout << theArgs[0] << " error : call ivtkinit before \n"; + Message::SendFail() << "Error : call ivtkinit before"; return 1; } - - if (theArgNum < 2) + else if (theArgNum < 2) { - theDI << theArgs[0] << " error : wrong number of parameters. Type 'help" - << theArgs[0] << "' for more information.\n"; + Message::SendFail() << "Syntax error: wrong number of parameters"; + return 1; } - vtkSmartPointer anImageFilter = vtkSmartPointer::New(); + vtkSmartPointer anImageFilter = vtkSmartPointer::New(); anImageFilter->SetInput (GetInteractor()->GetRenderWindow()); // Set custom buffer type if (theArgNum > 2) @@ -1026,7 +1355,7 @@ } else { - theDI << theArgs[0] << " error: unknown value for stereo projection.\n"; + Message::SendFail() << "Syntax error: unknown value for stereo projection"; return 1; } } @@ -1063,8 +1392,8 @@ { if (aFormat.IsEmpty()) { - theDI << theArgs[0] << " warning: the image format is not set.\n" - << "The image will be saved into PNG format.\n"; + Message::SendWarning() << "Warning: the image format is not set.\n" + << "The image will be saved into PNG format."; anImageWriter = vtkSmartPointer::New(); aFormat = TCollection_AsciiString ("png"); if (anExtStart != -1) @@ -1079,8 +1408,7 @@ } else { - theDI << theArgs[0] << " error: the image format " - << aFormat.ToCString() <<" is not supported.\n"; + Message::SendFail() << "Error: the image format " << aFormat << " is not supported"; return 1; } @@ -1109,53 +1437,55 @@ anImageWriter->SetInputConnection (anImageFilter->GetOutputPort()); } anImageWriter->Write(); - return 0; } //=================================================================== // Fubction : VtkBackgroundColor // Purpose : -// Draw args : ivtkbgcolor r g b -// r,g,b = [0..255] //=================================================================== -static Standard_Integer VtkBackgroundColor (Draw_Interpretor& theDI, +static Standard_Integer VtkBackgroundColor (Draw_Interpretor& , Standard_Integer theArgNum, const char** theArgs) { - if (theArgNum != 4 && theArgNum != 7) + if (!GetInteractor() + || !GetInteractor()->IsEnabled()) { - theDI << theArgs[0] << " error : wrong number of parameters.\n" - << "Type 'help " << theArgs[0] << "' for more information.\n"; + Message::SendFail() << "Error: call ivtkinit before"; return 1; } - // Check viewer - if (!GetInteractor()->IsEnabled()) + Quantity_Color aQColor1; + const Standard_Integer aNbParsed1 = Draw::ParseColor (theArgNum - 1, theArgs + 1, aQColor1); + if (aNbParsed1 == 0) { - std::cout << theArgs[0] << " error : call ivtkinit before \n"; + Message::SendFail() << "Syntax error: wrong number of parameters"; return 1; } - Standard_Real aR = Draw::Atof(theArgs[1])/255.0; - Standard_Real aG = Draw::Atof(theArgs[2])/255.0; - Standard_Real aB = Draw::Atof(theArgs[3])/255.0; - + bool isSRGBAware = false; +#ifdef HAVE_VTK_SRGB + isSRGBAware = GetRenderer()->GetRenderWindow()->GetUseSRGBColorSpace(); +#endif + const Graphic3d_Vec3 aColor1 = isSRGBAware ? (Graphic3d_Vec3 )aQColor1 : Quantity_Color::Convert_LinearRGB_To_sRGB ((Graphic3d_Vec3 )aQColor1); GetRenderer()->SetGradientBackground(false); - GetRenderer()->SetBackground (aR, aG, aB); - - if (theArgNum == 7) + GetRenderer()->SetBackground (aColor1.r(), aColor1.g(), aColor1.b()); + if (theArgNum - 1 > aNbParsed1) { - Standard_Real aR2 = Draw::Atof(theArgs[4])/255.0; - Standard_Real aG2 = Draw::Atof(theArgs[5])/255.0; - Standard_Real aB2 = Draw::Atof(theArgs[6])/255.0; + Quantity_Color aQColor2; + const Standard_Integer aNbParsed2 = Draw::ParseColor (theArgNum - 1 - aNbParsed1, theArgs + 1 + aNbParsed1, aQColor2); + if (aNbParsed2 == 0) + { + Message::SendFail() << "Syntax error: wrong number of parameters"; + return 1; + } - GetRenderer()->SetBackground2(aR2, aG2, aB2); - GetRenderer()->SetGradientBackground(true); + const Graphic3d_Vec3 aColor2 = isSRGBAware ? (Graphic3d_Vec3 )aQColor2 : Quantity_Color::Convert_LinearRGB_To_sRGB ((Graphic3d_Vec3 )aQColor2); + GetRenderer()->SetBackground2 (aColor2.r(), aColor2.g(), aColor2.b()); + GetRenderer()->SetGradientBackground (true); } GetInteractor()->Render(); - return 0; } @@ -1166,76 +1496,127 @@ void IVtkDraw::Commands (Draw_Interpretor& theCommands) { const char *group = "VtkViewer"; - + theCommands.Add("ivtkinit", - "ivtkinit usage:\n" - "ivtkinit [leftPx topPx widthPx heightPx]" - "\n\t\t: Creates the Vtk window", + "ivtkinit [leftPx topPx widthPx heightPx] [-srgb {on|off}] [-msaa NbSamples]" + "\n\t\t: Creates the Vtk window." + "\n\t\t: -srgb Enable/disable sRGB colorspace; OFF by default." + "\n\t\t: -msaa Requests desired number of samples for multisampling buffer;" + "\n\t\t: 0 by default meaning no MSAA.", __FILE__, VtkInit, group); + theCommands.Add("ivtkclose", + "ivtkclose : Closes the Vtk window.", + __FILE__, VtkClose, group); + + theCommands.Add("ivtkrenderparams", + "ivtkrenderparams [-depthPeeling NbLayers] [-shadows {on|off}]" + "\n\t\t: Sets Vtk rendering parameters." + "\n\t\t: -shadows Turn shadows on/off; OFF by default." + "\n\t\t: -depthPeeling Enable/disable depth peeling for rendering transparent objects" + "\n\t\t: with specified number of layers;" + "\n\t\t: 0 by default meaning order-dependent transparency without depth peeling.", + __FILE__, VtkRenderParams, group); + theCommands.Add("ivtkdisplay", - "ivtkdisplay usage:\n" - "ivtkdisplay name1 name2 ..." - "\n\t\t: Displayes named objects in current view.", + "ivtkdisplay name1 [name2 ...]" + "\n\t\t: Displays named objects in Vtk view.", __FILE__, VtkDisplay, group); theCommands.Add("ivtkerase", - "ivtkerase usage:\n" - "ivtkerase [name1 name2 ...]" - "\n\t\t: Removes from renderer named objects or all objects.", + "ivtkerase [name1 name2 ...]" + "\n\t\t: Hides in Vtk renderer named objects or all objects.", __FILE__, VtkErase, group); theCommands.Add("ivtkremove", - "ivtkremove usage:\n" - "ivtkremove [name1 name2 ...]" - "\n\t\t: Removes from renderer and from memory named objects or all objects.", + "ivtkremove name1 [name2 ...]" + "\n\t\t: Removes from Vtk renderer named objects.", + __FILE__, VtkRemove, group); + + theCommands.Add("ivtkclear", + "ivtkclear : Removes all objects from Vtk renderer.", __FILE__, VtkRemove, group); theCommands.Add("ivtksetdispmode", - "ivtksetdispmode usage:\n" - "ivtksetdispmode [name] mode (0,1)" - "\n\t\t: Sets or unsets display mode 'mode' to the object with name 'name' or to all objects" - "if name is not defined.", + "ivtksetdispmode [name] mode={0|1}" + "\n\t\t: Sets or unsets display mode 'mode' to the object with name 'name' or to all objects.", __FILE__, VtkSetDisplayMode, group); + theCommands.Add("ivtksetboundingdraw", + "ivtksetboundingdraw [name] {on|off}" + "\n\t\t: Sets or unsets boundaries drawing for shading display mode" + "\n\t\t: to the object with name 'name' or to all objects.", + __FILE__, VtkSetBoundaryDraw, group); + theCommands.Add("ivtksetselmode", - "ivtksetselmode usage:\n" - " ivtksetselmode [name] mode on/off(0,1)" - "\n\t\t: Sets or unsets selection mode 'mode' to the object with name 'name' or to the all displayed objects.", + "ivtksetselmode [name] mode {on|off}" + "\n\t\t: Sets or unsets selection mode 'mode' to the object with name 'name'" + "\n\t\t: or to the all displayed objects.", __FILE__, VtkSetSelectionMode, group); theCommands.Add("ivtkmoveto", - "ivtkmoveto usage:\n" - "ivtkmoveto x y" - "\n\t\t: Moves position to the pixel with coordinates (x,y). The object on this position is highlighted.", + "ivtkmoveto x y" + "\n\t\t: Moves position to the pixel with coordinates (x,y). The object on this position is highlighted.", __FILE__, VtkMoveTo, group); theCommands.Add("ivtkselect", - "ivtkselect usage:\n" - "ivtkselect x y" - "\n\t\t: Selects object which correspond to the pixel with input coordinates (x,y).", + "ivtkselect x y" + "\n\t\t: Selects object which correspond to the pixel with input coordinates (x,y).", __FILE__, VtkSelect, group); theCommands.Add("ivtkfit", - "ivtkfit usage:\n" - "ivtkfit" - "\n\t\t: Fits view according all displayed objects.", - __FILE__, VtkFit, group); + "ivtkfit : Fits all displayed objects into Vtk view.", + __FILE__, VtkViewProj, group); + + theCommands.Add("ivtkaxo", + "ivtkaxo : Resets Vtk view orientation to axo", + __FILE__, VtkViewProj, group); + + theCommands.Add("ivtkfront", + "ivtkfront : Resets Vtk view orientation to front", + __FILE__, VtkViewProj, group); + + theCommands.Add("ivtkback", + "ivtkback : Resets Vtk view orientation to back", + __FILE__, VtkViewProj, group); + + theCommands.Add("ivtktop", + "ivtktop : Resets Vtk view orientation to top", + __FILE__, VtkViewProj, group); + + theCommands.Add("ivtkbottom", + "ivtkbottom : Resets Vtk view orientation to bottom", + __FILE__, VtkViewProj, group); + + theCommands.Add("ivtkleft", + "ivtkleft : Resets Vtk view orientation to left", + __FILE__, VtkViewProj, group); + + theCommands.Add("ivtkright", + "ivtkright : Resets Vtk view orientation to right", + __FILE__, VtkViewProj, group); theCommands.Add("ivtkdump", - "ivtkdump usage:\n" - "ivtkdump .{png|bmp|jpeg|tiff|pnm} [buffer={rgb|rgba|depth}] [width height] [stereoproj={L|R}]" - "\n\t\t: Dumps contents of viewer window to PNG, BMP, JPEG, TIFF or PNM file", + "ivtkdump .{png|bmp|jpeg|tiff|pnm} [buffer={rgb|rgba|depth}]" + "\n\t\t: [width height] [stereoproj={L|R}]" + "\n\t\t: Dumps contents of viewer window to PNG, BMP, JPEG, TIFF or PNM file.", __FILE__, VtkDump, group); theCommands.Add("ivtkbgcolor", - "ivtkbgcolor usage:\n" - "ivtkbgcolor r g b [r2 g2 b2]\n" - "\n\t\t: Sets uniform background color or gradient one if second triple of paramers is set." - "Color parameters r,g,b = [0..255].", + "ivtkbgcolor Color1 [Color2]" + "\n\t\t: Sets uniform background color or gradient one if second triple of parameters is set.", __FILE__, VtkBackgroundColor, group); -} + theCommands.Add("ivtksetcolor", + "ivtksetcolor name {ColorName|R G B}" + "\n\t\t: Sets color to the object with name 'name'.", + __FILE__, VtkSetColor, group); + + theCommands.Add("ivtksettransparency", + "ivtksettransparency name 0..1" + "\n\t\t: Sets transparency to the object with name 'name'.", + __FILE__, VtkSetTransparency, group); +} //================================================================ // Function : Factory @@ -1249,4 +1630,3 @@ // Declare entry point PLUGINFACTORY DPLUGIN(IVtkDraw) - diff -Nru opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.cxx opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.cxx --- opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,9 +16,7 @@ #include // prevent disabling some MSVC warning messages by VTK headers -#ifdef _MSC_VER -#pragma warning(push) -#endif +#include #include #include #include @@ -26,16 +24,13 @@ #include #include #include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include #include #include #include #include - IMPLEMENT_STANDARD_RTTIEXT(IVtkDraw_HighlightAndSelectionPipeline,Standard_Transient) //=========================================================== diff -Nru opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.hxx opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.hxx --- opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw_HighlightAndSelectionPipeline.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,17 +22,13 @@ #include // prevent disabling some MSVC warning messages by VTK headers -#ifdef _MSC_VER -#pragma warning(push) -#endif +#include #include #include #include #include #include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include #include #include diff -Nru opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw.hxx opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw.hxx --- opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,23 +21,44 @@ #include class Draw_Interpretor; +class WNT_WClass; class IVtkDraw { public: - DEFINE_STANDARD_ALLOC - Standard_EXPORT static void ViewerInit (Standard_Integer thePxLeft, - Standard_Integer thePxTop, - Standard_Integer thePxWidth, - Standard_Integer thePxHeight); + //! VTK window creation parameters. + struct IVtkWinParams + { + Graphic3d_Vec2i TopLeft; + Graphic3d_Vec2i Size; + Standard_Integer NbMsaaSample; + Standard_Boolean UseSRGBColorSpace; + + IVtkWinParams() : NbMsaaSample (0), UseSRGBColorSpace (false) {} + }; + +public: + + Standard_EXPORT static void ViewerInit (const IVtkWinParams& theParams); + + static void ViewerInit (Standard_Integer thePxLeft, + Standard_Integer thePxTop, + Standard_Integer thePxWidth, + Standard_Integer thePxHeight) + { + IVtkWinParams aParams; + aParams.TopLeft.SetValues (thePxLeft, thePxTop); + aParams.Size.SetValues (thePxWidth, thePxHeight); + ViewerInit (aParams); + } - Standard_EXPORT static void Factory (Draw_Interpretor& theDI); - Standard_EXPORT static void Commands (Draw_Interpretor& theCommands); + Standard_EXPORT static void Factory (Draw_Interpretor& theDI); + Standard_EXPORT static void Commands (Draw_Interpretor& theCommands); private: - Standard_EXPORT static const Handle(Standard_Transient)& WClass(); + Standard_EXPORT static const Handle(WNT_WClass)& WClass(); }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw_Interactor.cxx opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw_Interactor.cxx --- opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw_Interactor.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw_Interactor.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,9 +14,7 @@ // commercial license or contractual agreement. // prevent disabling some MSVC warning messages by VTK headers -#ifdef _MSC_VER -#pragma warning(push) -#endif +#include #ifdef _WIN32 #include #include @@ -30,13 +28,10 @@ #include #include #include +#include #include -#ifdef _MSC_VER -#pragma warning(pop) -#endif - #include #include #include @@ -187,6 +182,10 @@ this->Size[1] = aSize[1]; } +#ifdef _WIN32 +LRESULT CALLBACK WndProc(HWND theHWnd, UINT theUMsg, WPARAM theWParam, LPARAM theLParam); +#endif + //=========================================================== // Function : Enable // Purpose : @@ -249,7 +248,7 @@ Handle(Message_Messenger) anOutput = Message::DefaultMessenger(); if (!myPipelines->IsBound(aShapeID)) { - anOutput << "Warning: there is no VTK pipeline registered for highlighted shape" << Message_EndLine; + anOutput->SendWarning() << "Warning: there is no VTK pipeline registered for highlighted shape" << std::endl; continue; } @@ -314,7 +313,7 @@ Handle(Message_Messenger) anOutput = Message::DefaultMessenger(); if (!myPipelines->IsBound (aShapeID)) { - anOutput << "Warning: there is no VTK pipeline registered for picked shape" << Message_EndLine; + anOutput->SendWarning() << "Warning: there is no VTK pipeline registered for picked shape" << std::endl; continue; } @@ -622,7 +621,7 @@ LRESULT aRes = 0; IVtkDraw_Interactor *anInteractor = 0; - anInteractor = (IVtkDraw_Interactor *)GetWindowLongPtr (theHWnd, GWLP_USERDATA); + anInteractor = (IVtkDraw_Interactor *)GetWindowLongPtrW (theHWnd, GWLP_USERDATA); if (anInteractor && anInteractor->GetReferenceCount() > 0) { @@ -711,7 +710,7 @@ theInteractor->OnTimer (theHWnd, (UINT)theWParam); break; } - return DefWindowProc(theHWnd, theMsg, theWParam, theLParam); + return DefWindowProcW (theHWnd, theMsg, theWParam, theLParam); } #else diff -Nru opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw_Interactor.hxx opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw_Interactor.hxx --- opencascade-7.4.1+dfsg1/src/IVtkDraw/IVtkDraw_Interactor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkDraw/IVtkDraw_Interactor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,14 +31,10 @@ #endif // prevent disabling some MSVC warning messages by VTK headers -#ifdef _MSC_VER -#pragma warning(push) -#endif +#include #include #include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include #include #include diff -Nru opencascade-7.4.1+dfsg1/src/IVtkOCC/IVtkOCC_SelectableObject.cxx opencascade-7.5.1+dfsg1/src/IVtkOCC/IVtkOCC_SelectableObject.cxx --- opencascade-7.4.1+dfsg1/src/IVtkOCC/IVtkOCC_SelectableObject.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkOCC/IVtkOCC_SelectableObject.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,9 +13,11 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include + #include #include -#include +#include #include #include #include @@ -130,14 +132,15 @@ myOCCTDrawer->DeviationAngle(), isAutoTriangulation); } - catch (Standard_Failure) + catch (const Standard_Failure& anException) { + Message::SendFail (TCollection_AsciiString("Error: IVtkOCC_SelectableObject::ComputeSelection(") + theMode + ") has failed (" + + anException.GetMessageString() + ")"); if (theMode == 0) { Bnd_Box aBndBox = BoundingBox(); Handle(StdSelect_BRepOwner) aOwner = new StdSelect_BRepOwner (anOcctShape, this); - Handle(Select3D_SensitiveBox) aSensitiveBox = - new Select3D_SensitiveBox (aOwner, aBndBox); + Handle(Select3D_SensitiveBox) aSensitiveBox = new Select3D_SensitiveBox (aOwner, aBndBox); theSelection->Add (aSensitiveBox); } } diff -Nru opencascade-7.4.1+dfsg1/src/IVtkOCC/IVtkOCC_ShapeMesher.cxx opencascade-7.5.1+dfsg1/src/IVtkOCC/IVtkOCC_ShapeMesher.cxx --- opencascade-7.4.1+dfsg1/src/IVtkOCC/IVtkOCC_ShapeMesher.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkOCC/IVtkOCC_ShapeMesher.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,6 +13,8 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include + #include #include #include @@ -29,7 +31,7 @@ #include #include #include -#include +#include #include #include #include @@ -40,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -94,7 +97,7 @@ Handle(Prs3d_Drawer) aDefDrawer = new Prs3d_Drawer(); aDefDrawer->SetTypeOfDeflection (Aspect_TOD_RELATIVE); aDefDrawer->SetDeviationCoefficient (GetDeviationCoeff()); - myDeflection = Prs3d::GetDeflection (GetShapeObj()->GetShape(), aDefDrawer); + myDeflection = StdPrs_ToolTriangulatedShape::GetDeflection (GetShapeObj()->GetShape(), aDefDrawer); } return myDeflection; @@ -135,8 +138,11 @@ anAlgo->Perform(); } } - catch (Standard_Failure) - { } + catch (const Standard_Failure& anException) + { + Message::SendFail (TCollection_AsciiString("Error: IVtkOCC_ShapeMesher::meshShape() triangulation builder has failed (") + + anException.GetMessageString() + ")"); + } } //================================================================ @@ -179,16 +185,16 @@ TopAbs_EDGE, TopAbs_FACE, anEdgesMap); - int aNbFaces; IVtk_MeshType aType; myEdgesTypes.Clear(); - TopExp_Explorer anEdgeIter (GetShapeObj()->GetShape(), TopAbs_EDGE); - for (; anEdgeIter.More(); anEdgeIter.Next()) + TopTools_IndexedDataMapOfShapeListOfShape::Iterator aEdgeIt(anEdgesMap); + for (; aEdgeIt.More(); aEdgeIt.Next()) { - const TopoDS_Edge& anOcctEdge = TopoDS::Edge (anEdgeIter.Current()); - aNbFaces = anEdgesMap.FindFromKey (anOcctEdge).Extent(); + const TopoDS_Edge& anOcctEdge = TopoDS::Edge (aEdgeIt.Key()); + const TopTools_ListOfShape& aFaceList = aEdgeIt.Value(); + aNbFaces = aFaceList.Extent(); if (aNbFaces == 0) { aType = MT_FreeEdge; @@ -199,7 +205,8 @@ } else { - aType = MT_SharedEdge; + aType = (aNbFaces >= 2) && (BRep_Tool::MaxContinuity(anOcctEdge) > GeomAbs_G2) ? + MT_SeamEdge : MT_SharedEdge; } addEdge (anOcctEdge, GetShapeObj()->GetSubShapeId (anOcctEdge), aType); myEdgesTypes.Bind (anOcctEdge, aType); @@ -228,8 +235,11 @@ addWFFace (anOcctFace, GetShapeObj()->GetSubShapeId (anOcctFace)); } - catch (Standard_Failure) - { } + catch (const Standard_Failure& anException) + { + Message::SendFail (TCollection_AsciiString("Error: addWireFrameFaces() wireframe presentation builder has failed (") + + anException.GetMessageString() + ")"); + } } } diff -Nru opencascade-7.4.1+dfsg1/src/IVtkOCC/IVtkOCC_ShapePickerAlgo.cxx opencascade-7.5.1+dfsg1/src/IVtkOCC/IVtkOCC_ShapePickerAlgo.cxx --- opencascade-7.4.1+dfsg1/src/IVtkOCC/IVtkOCC_ShapePickerAlgo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkOCC/IVtkOCC_ShapePickerAlgo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -128,24 +128,26 @@ // Update the selection for the given mode according to its status. const Handle(SelectMgr_Selection)& aSel = aSelObj->Selection (theMode); - switch (aSel->UpdateStatus()) { case SelectMgr_TOU_Full: + { // Recompute the sensitive primitives which correspond to the mode. myViewerSelector->RemoveSelectionOfObject (aSelObj, aSelObj->Selection (theMode)); aSelObj->RecomputePrimitives (theMode); myViewerSelector->AddSelectionToObject (aSelObj, aSelObj->Selection (theMode)); myViewerSelector->RebuildObjectsTree(); myViewerSelector->RebuildSensitivesTree (aSelObj); + } + Standard_FALLTHROUGH case SelectMgr_TOU_Partial: + { + if (aSelObj->HasTransformation()) { - if (aSelObj->HasTransformation()) - { - myViewerSelector->RebuildObjectsTree(); - } - break; + myViewerSelector->RebuildObjectsTree(); } + break; + } default: break; } @@ -310,14 +312,14 @@ if (aSelectable.IsNull()) { - anOutput << "Error: EntityOwner having null SelectableObject picked!"; + anOutput->SendAlarm() << "Error: EntityOwner having null SelectableObject picked!"; continue; } Handle(IVtkOCC_Shape) aSelShape = aSelectable->GetShape(); if (aSelShape.IsNull()) { - anOutput << "Error: SelectableObject with null OccShape pointer picked!"; + anOutput->SendAlarm() << "Error: SelectableObject with null OccShape pointer picked!"; continue; } @@ -334,12 +336,12 @@ TopoDS_Shape aSubShape = anEntityOwner->Shape(); if (aTopLevelShape.IsNull()) { - anOutput << "Error: OccShape with null top-level TopoDS_Shape picked!"; + anOutput->SendAlarm() << "Error: OccShape with null top-level TopoDS_Shape picked!"; continue; } if (aSubShape.IsNull()) { - anOutput << "Error: EntityOwner with null TopoDS_Shape picked!"; + anOutput->SendAlarm() << "Error: EntityOwner with null TopoDS_Shape picked!"; continue; } diff -Nru opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_DisplayModeFilter.cxx opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_DisplayModeFilter.cxx --- opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_DisplayModeFilter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_DisplayModeFilter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,7 +35,8 @@ //============================================================================ IVtkTools_DisplayModeFilter::IVtkTools_DisplayModeFilter() : myDisplayMode (DM_Wireframe), - myDoDisplaySharedVertices (false) + myDoDisplaySharedVertices (false), + myDrawFaceBoundaries( false ) { // Filter according to values in subshapes types array. myIdsArrayName = IVtkVTK_ShapeData::ARRNAME_MESH_TYPES(); @@ -47,22 +48,25 @@ aTypes.Add (MT_FreeEdge); aTypes.Add (MT_BoundaryEdge); aTypes.Add (MT_SharedEdge); + aTypes.Add (MT_SeamEdge); aTypes.Add (MT_WireFrameFace); - myModesDefinition.Bind (DM_Wireframe, aTypes); + myModesDefinition[DM_Wireframe] = aTypes; aTypes.Clear(); aTypes.Add (MT_FreeVertex); aTypes.Add (MT_ShadedFace); - myModesDefinition.Bind (DM_Shading, aTypes); + myModesDefinition[DM_Shading] = aTypes; } //============================================================================ // Method: Destructor // Purpose: //============================================================================ -IVtkTools_DisplayModeFilter::~IVtkTools_DisplayModeFilter() { } +IVtkTools_DisplayModeFilter::~IVtkTools_DisplayModeFilter() +{ +} //============================================================================ // Method: RequestData @@ -73,7 +77,7 @@ vtkInformationVector **theInputVector, vtkInformationVector *theOutputVector) { - SetData (myModesDefinition.Find (myDisplayMode)); + SetData (myModesDefinition[myDisplayMode]); return Superclass::RequestData (theRequest, theInputVector, theOutputVector); } @@ -104,24 +108,20 @@ if (myDoDisplaySharedVertices != theDoDisplay) { myDoDisplaySharedVertices = theDoDisplay; - vtkIdType aVertexType = MT_SharedVertex; - NCollection_DataMap::Iterator aModes (myModesDefinition); - NCollection_DataMap aNewModes; IVtk_IdTypeMap aModeTypes; - for (; aModes.More(); aModes.Next()) + for (int i = 0; i < 2; i++) { - aModeTypes = aModes.Value(); - if (theDoDisplay && !aModeTypes.Contains(aVertexType)) + aModeTypes = myModesDefinition[i]; + if (theDoDisplay && !aModeTypes.Contains(MT_SharedVertex)) { - aModeTypes.Add (aVertexType); + aModeTypes.Add (MT_SharedVertex); } - else if (!theDoDisplay && aModeTypes.Contains (aVertexType)) + else if (!theDoDisplay && aModeTypes.Contains (MT_SharedVertex)) { - aModeTypes.Remove (aVertexType); + aModeTypes.Remove (MT_SharedVertex); } - aNewModes.Bind (aModes.Key(), aModeTypes); + myModesDefinition[i] = aModeTypes; } - myModesDefinition = aNewModes; Modified(); } } @@ -148,3 +148,39 @@ return myDisplayMode; } +//============================================================================ +// Method: meshTypesForMode +// Purpose: +//============================================================================ +const IVtk_IdTypeMap& IVtkTools_DisplayModeFilter::MeshTypesForMode(IVtk_DisplayMode theMode) const +{ + return myModesDefinition[theMode]; +} + +//============================================================================ +// Method: setMeshTypesForMode +// Purpose: +//============================================================================ +void IVtkTools_DisplayModeFilter::SetMeshTypesForMode(IVtk_DisplayMode theMode, const IVtk_IdTypeMap& theMeshTypes) +{ + myModesDefinition[theMode] = theMeshTypes; + Modified(); +} + +//============================================================================ +// Method: SetFaceBoundaryDraw +// Purpose: +//============================================================================ +void IVtkTools_DisplayModeFilter::SetFaceBoundaryDraw(bool theToDraw) +{ + myDrawFaceBoundaries = theToDraw; + if (theToDraw) { + myModesDefinition[DM_Shading].Add(MT_BoundaryEdge); + myModesDefinition[DM_Shading].Add(MT_SharedEdge); + } + else { + myModesDefinition[DM_Shading].Remove(MT_BoundaryEdge); + myModesDefinition[DM_Shading].Remove(MT_SharedEdge); + } + Modified(); +} diff -Nru opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_DisplayModeFilter.hxx opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_DisplayModeFilter.hxx --- opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_DisplayModeFilter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_DisplayModeFilter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,6 +46,18 @@ //! Get current display mode. IVtk_DisplayMode GetDisplayMode() const; + //! Returns list of displaying mesh element types for the given display mode + const IVtk_IdTypeMap& MeshTypesForMode(IVtk_DisplayMode theMode) const; + + //! Set a list of displaying mesh element types for the given display mode + void SetMeshTypesForMode(IVtk_DisplayMode theMode, const IVtk_IdTypeMap& theMeshTypes); + + //! Draw Boundary of faces for shading mode + void SetFaceBoundaryDraw(bool theToDraw); + + //! Returns True if drawing Boundary of faces for shading mode is defined. + bool FaceBoundaryDraw() const { return myDrawFaceBoundaries; } + protected: //! Filter cells according to the given set of ids. virtual int RequestData (vtkInformation *, vtkInformationVector **, vtkInformationVector *); @@ -55,9 +67,12 @@ protected: //! Display mode defining mesh types to pass through this filter. - IVtk_DisplayMode myDisplayMode; - NCollection_DataMap myModesDefinition; - bool myDoDisplaySharedVertices; + IVtk_DisplayMode myDisplayMode; + IVtk_IdTypeMap myModesDefinition[2]; + bool myDoDisplaySharedVertices; + + //! Draw Face boundaries flag is applicable only for shading display mode. + bool myDrawFaceBoundaries; }; #ifdef _MSC_VER diff -Nru opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_ShapeDataSource.hxx opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_ShapeDataSource.hxx --- opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_ShapeDataSource.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_ShapeDataSource.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,10 @@ #include #include #include + +#include #include +#include class vtkIdTypeArray; class vtkPolyData; diff -Nru opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_ShapeObject.hxx opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_ShapeObject.hxx --- opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_ShapeObject.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_ShapeObject.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,15 +20,11 @@ #include // prevent disabling some MSVC warning messages by VTK headers -#ifdef _MSC_VER -#pragma warning(push) -#endif +#include #include #include #include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include class vtkActor; class vtkDataSet; diff -Nru opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_ShapePicker.hxx opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_ShapePicker.hxx --- opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_ShapePicker.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_ShapePicker.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,14 +21,10 @@ #include // prevent disabling some MSVC warning messages by VTK headers -#ifdef _MSC_VER -#pragma warning(push) -#endif +#include #include #include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include class vtkRenderer; class vtkActorCollection; diff -Nru opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_SubPolyDataFilter.hxx opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_SubPolyDataFilter.hxx --- opencascade-7.4.1+dfsg1/src/IVtkTools/IVtkTools_SubPolyDataFilter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkTools/IVtkTools_SubPolyDataFilter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,7 +18,9 @@ #include -#include "vtkPolyDataAlgorithm.h" +#include +#include +#include #ifdef _MSC_VER #pragma warning(push) diff -Nru opencascade-7.4.1+dfsg1/src/IVtkVTK/IVtkVTK_ShapeData.cxx opencascade-7.5.1+dfsg1/src/IVtkVTK/IVtkVTK_ShapeData.cxx --- opencascade-7.4.1+dfsg1/src/IVtkVTK/IVtkVTK_ShapeData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkVTK/IVtkVTK_ShapeData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,17 +16,13 @@ #include // prevent disabling some MSVC warning messages by VTK headers -#ifdef _MSC_VER -#pragma warning(push) -#endif +#include #include #include #include #include #include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include IMPLEMENT_STANDARD_RTTIEXT(IVtkVTK_ShapeData,IVtk_IShapeData) diff -Nru opencascade-7.4.1+dfsg1/src/IVtkVTK/IVtkVTK_ShapeData.hxx opencascade-7.5.1+dfsg1/src/IVtkVTK/IVtkVTK_ShapeData.hxx --- opencascade-7.4.1+dfsg1/src/IVtkVTK/IVtkVTK_ShapeData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/IVtkVTK/IVtkVTK_ShapeData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,15 +19,11 @@ #include // prevent disabling some MSVC warning messages by VTK headers -#ifdef _MSC_VER -#pragma warning(push) -#endif +#include #include #include #include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include class vtkIdTypeArray; diff -Nru opencascade-7.4.1+dfsg1/src/Law/Law_BSpFunc.cxx opencascade-7.5.1+dfsg1/src/Law/Law_BSpFunc.cxx --- opencascade-7.4.1+dfsg1/src/Law/Law_BSpFunc.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Law/Law_BSpFunc.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,6 +36,8 @@ //======================================================================= Law_BSpFunc::Law_BSpFunc() +: first(0.0), + last(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/Law/Law_Constant.cxx opencascade-7.5.1+dfsg1/src/Law/Law_Constant.cxx --- opencascade-7.4.1+dfsg1/src/Law/Law_Constant.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Law/Law_Constant.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,6 +28,9 @@ //purpose : //======================================================================= Law_Constant::Law_Constant() +: radius(0.0), + first(0.0), + last(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/Law/Law_Linear.cxx opencascade-7.5.1+dfsg1/src/Law/Law_Linear.cxx --- opencascade-7.4.1+dfsg1/src/Law/Law_Linear.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Law/Law_Linear.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,7 +23,13 @@ IMPLEMENT_STANDARD_RTTIEXT(Law_Linear,Law_Function) -Law_Linear::Law_Linear () {} +Law_Linear::Law_Linear () +: valdeb(0.0), + valfin(0.0), + pdeb(0.0), + pfin(0.0) +{ +} void Law_Linear::Set (const Standard_Real Pdeb, diff -Nru opencascade-7.4.1+dfsg1/src/LDOM/LDOM_BasicAttribute.hxx opencascade-7.5.1+dfsg1/src/LDOM/LDOM_BasicAttribute.hxx --- opencascade-7.4.1+dfsg1/src/LDOM/LDOM_BasicAttribute.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LDOM/LDOM_BasicAttribute.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,7 @@ public: // ---------- PUBLIC METHODS ---------- - LDOM_BasicAttribute () : LDOM_BasicNode (LDOM_Node::UNKNOWN) {} + LDOM_BasicAttribute () : LDOM_BasicNode (LDOM_Node::UNKNOWN), myName(NULL) {} // Empty constructor LDOM_BasicAttribute& operator = (const LDOM_NullPtr * aNull); diff -Nru opencascade-7.4.1+dfsg1/src/LDOM/LDOM_CharReference.cxx opencascade-7.5.1+dfsg1/src/LDOM/LDOM_CharReference.cxx --- opencascade-7.4.1+dfsg1/src/LDOM/LDOM_CharReference.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LDOM/LDOM_CharReference.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,8 @@ // numerically as &#x..; //#define LDOM_ALLOW_LATIN_1 +namespace +{ const int NORMAL_C = 0; const int CHAR_REF = -1; const int ENTI_AMP = 1; @@ -31,12 +33,13 @@ const int ENTI_QUOT = 4; //const int ENTI_APOS = 5; -struct entityRef { - const char * name; - const int length; +struct entityRef +{ + const char* name; + int length; entityRef (const char * aName, const int aLen) : name(aName), length(aLen) {} - void operator= (const entityRef&); }; +} //======================================================================= //function : Decode diff -Nru opencascade-7.4.1+dfsg1/src/LDOM/LDOM_OSStream.cxx opencascade-7.5.1+dfsg1/src/LDOM/LDOM_OSStream.cxx --- opencascade-7.4.1+dfsg1/src/LDOM/LDOM_OSStream.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LDOM/LDOM_OSStream.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -161,3 +161,11 @@ { init(&myBuffer); } + +//======================================================================= +//function : ~LDOM_OSStream() +//purpose : Destructor - for g++ vtable generation in *this* translation unit +//======================================================================= +LDOM_OSStream::~LDOM_OSStream() +{ +} diff -Nru opencascade-7.4.1+dfsg1/src/LDOM/LDOM_OSStream.hxx opencascade-7.5.1+dfsg1/src/LDOM/LDOM_OSStream.hxx --- opencascade-7.4.1+dfsg1/src/LDOM/LDOM_OSStream.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LDOM/LDOM_OSStream.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -102,6 +102,8 @@ //! Constructor Standard_EXPORT LDOM_OSStream(const Standard_Integer theMaxBuf); + Standard_EXPORT virtual ~LDOM_OSStream(); + Standard_CString str () const {return myBuffer.str();} Standard_Integer Length () const { return myBuffer.Length(); } @@ -110,6 +112,23 @@ private: LDOM_SBuffer myBuffer; + +public: + // byte order mark defined at the start of a stream + enum BOMType { + BOM_UNDEFINED, + BOM_UTF8, + BOM_UTF16BE, + BOM_UTF16LE, + BOM_UTF32BE, + BOM_UTF32LE, + BOM_UTF7, + BOM_UTF1, + BOM_UTFEBCDIC, + BOM_SCSU, + BOM_BOCU1, + BOM_GB18030 + }; }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/LDOM/LDOMParser.cxx opencascade-7.5.1+dfsg1/src/LDOM/LDOMParser.cxx --- opencascade-7.4.1+dfsg1/src/LDOM/LDOMParser.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LDOM/LDOMParser.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -107,6 +107,18 @@ } //======================================================================= +//function : GetBOM +//purpose : Returns the byte order mask defined at the start of a stream +//======================================================================= + +LDOM_OSStream::BOMType LDOMParser::GetBOM() const +{ + if (myReader) + return myReader->GetBOM(); + return LDOM_OSStream::BOM_UNDEFINED; +} + +//======================================================================= //function : parse //purpose : //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/LDOM/LDOMParser.hxx opencascade-7.5.1+dfsg1/src/LDOM/LDOMParser.hxx --- opencascade-7.4.1+dfsg1/src/LDOM/LDOMParser.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LDOM/LDOMParser.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -64,6 +64,9 @@ GetError (TCollection_AsciiString& aData) const; // Return text describing a parsing error, or Empty if no error occurred + // Returns the byte order mask defined at the start of a stream + Standard_EXPORT LDOM_OSStream::BOMType GetBOM() const; + protected: // ---------- PROTECTED METHODS ---------- diff -Nru opencascade-7.4.1+dfsg1/src/LDOM/LDOM_XmlReader.cxx opencascade-7.5.1+dfsg1/src/LDOM/LDOM_XmlReader.cxx --- opencascade-7.4.1+dfsg1/src/LDOM/LDOM_XmlReader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LDOM/LDOM_XmlReader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -73,7 +73,8 @@ myLastChild(NULL), myPtr (&myBuffer[0]), myEndPtr (&myBuffer[0]), - myTagPerStep (theTagPerStep) + myTagPerStep (theTagPerStep), + myBOM (LDOM_OSStream::BOM_UNDEFINED) { } @@ -92,6 +93,7 @@ LDOMBasicString anAttrName, anAttrValue; char anAttDelimiter = '\0'; Standard_Boolean aHasRead = Standard_False; + Standard_Boolean isFileStart = !myEOF && theIStream.tellg() == std::iostream::pos_type(0); for(;;) { // Check if the current file buffer is exhausted @@ -112,17 +114,20 @@ } else { - // If we are reading some data, save the beginning and preserve the state + // If we are reading some data, save the beginning and preserve the state if (aStartData /* && aState != STATE_WAITING */) { if (myPtr > aStartData) theData.rdbuf()->sputn(aStartData, myPtr - aStartData); aStartData = &myBuffer[0]; } - // Copy the rest of file data to the beginning of buffer + // Copy the rest of file data to the beginning of buffer if (aBytesRest > 0) - memcpy (&myBuffer[0], myPtr, aBytesRest); + { + // do not use memcpy here because aBytesRest may be greater than myPtr-myBuffer, so, overlap + memmove (&myBuffer[0], myPtr, aBytesRest); + } - // Read the full buffer and reset start and end buffer pointers + // Read the full buffer and reset start and end buffer pointers myPtr = &myBuffer[0]; Standard_Size aNBytes; @@ -150,6 +155,98 @@ myBuffer[aBytesRest + aNBytes] = '\0'; } } + if (isFileStart) + { + isFileStart = Standard_False; + // check for BOM block + Standard_Utf8UChar aFirstChar = Standard_Utf8UChar(myPtr[0]); + switch(aFirstChar) { + case 0xEF: + if (Standard_Utf8UChar(myPtr[1]) == 0xBB && Standard_Utf8UChar(myPtr[2]) == 0xBF) + { + myBOM = LDOM_OSStream::BOM_UTF8; + myPtr += 3; + } + break; + case 0xFE: + if (Standard_Utf8UChar(myPtr[1]) == 0xFF) + { + myBOM = LDOM_OSStream::BOM_UTF16BE; + myPtr += 2; + } + break; + case 0xFF: + if (Standard_Utf8UChar(myPtr[1]) == 0xFE) + { + if (myPtr[2] == 0 && myPtr[3] == 0) + { + myBOM = LDOM_OSStream::BOM_UTF32LE; + myPtr += 4; + } + else + { + myBOM = LDOM_OSStream::BOM_UTF16LE; + myPtr += 2; + } + } + break; + case 0x00: + if (myPtr[1] == 0 && Standard_Utf8UChar(myPtr[2]) == 0xFE && Standard_Utf8UChar(myPtr[3]) == 0xFF) + { + myBOM = LDOM_OSStream::BOM_UTF32BE; + myPtr += 4; + } + break; + case 0x2B: + if (myPtr[1] == 47 && myPtr[2] == 118 && + (myPtr[3] == 43 || myPtr[3] == 47 || myPtr[3] == 56 || myPtr[3] == 57)) + { + myBOM = LDOM_OSStream::BOM_UTF7; + if (myPtr[3] == 56 && myPtr[4] == 45) + myPtr += 5; + else + myPtr += 4; + } + break; + case 0xF7: + if (myPtr[1] == 100 && myPtr[2] == 76) + { + myBOM = LDOM_OSStream::BOM_UTF1; + myPtr += 3; + } + break; + case 0xDD: + if (myPtr[1] == 115 && myPtr[2] == 102 && myPtr[3] == 115) + { + myBOM = LDOM_OSStream::BOM_UTFEBCDIC; + myPtr += 4; + } + break; + case 0x0E: + if (Standard_Utf8UChar(myPtr[1]) == 0xFE && Standard_Utf8UChar(myPtr[2]) == 0xFF) + { + myBOM = LDOM_OSStream::BOM_SCSU; + myPtr += 3; + } + break; + case 0xFB: + if (Standard_Utf8UChar(myPtr[1]) == 0xEE && myPtr[2] == 40) + { + myBOM = LDOM_OSStream::BOM_BOCU1; + myPtr += 3; + } + break; + case 0x84: + if (myPtr[1] == 49 && Standard_Utf8UChar(myPtr[2]) == 0x95 && myPtr[3] == 51) + { + myBOM = LDOM_OSStream::BOM_GB18030; + myPtr += 4; + } + break; + } + if (myBOM != LDOM_OSStream::BOM_UNDEFINED) + continue; + } // Check the character data switch (aState) { diff -Nru opencascade-7.4.1+dfsg1/src/LDOM/LDOM_XmlReader.hxx opencascade-7.5.1+dfsg1/src/LDOM/LDOM_XmlReader.hxx --- opencascade-7.4.1+dfsg1/src/LDOM/LDOM_XmlReader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LDOM/LDOM_XmlReader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,9 +23,9 @@ #define XML_BUFFER_SIZE 20480 #include +#include class TCollection_AsciiString; -class LDOM_OSStream; // Class LDOM_XmlReader // @@ -66,6 +66,9 @@ const char * theEnd); // try convert string theStart to LDOM_AsciiInteger, return False on success + // Returns the byte order mask defined at the start of a stream + LDOM_OSStream::BOMType GetBOM() const { return myBOM; } + private: // ---------- PRIVATE (PROHIBITED) METHODS ---------- LDOM_XmlReader (const LDOM_XmlReader& theOther); @@ -86,6 +89,7 @@ const char * myEndPtr; char myBuffer [XML_BUFFER_SIZE+4]; Standard_Boolean myTagPerStep; + LDOM_OSStream::BOMType myBOM; }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/LocalAnalysis/LocalAnalysis_CurveContinuity.cxx opencascade-7.5.1+dfsg1/src/LocalAnalysis/LocalAnalysis_CurveContinuity.cxx --- opencascade-7.4.1+dfsg1/src/LocalAnalysis/LocalAnalysis_CurveContinuity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocalAnalysis/LocalAnalysis_CurveContinuity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -147,6 +147,16 @@ const Standard_Real EpsG2, const Standard_Real Percent, const Standard_Real Maxlen ) +: myContC0(0.0), + myContC1(0.0), + myContC2(0.0), + myContG1(0.0), + myContG2(0.0), + myCourbC1(0.0), + myCourbC2(0.0), + myG2Variation(0.0), + myLambda1(0.0), + myLambda2(0.0) { myTypeCont = Order; myepsnul= Epsnul; myMaxLon=Maxlen; diff -Nru opencascade-7.4.1+dfsg1/src/LocalAnalysis/LocalAnalysis_SurfaceContinuity.cxx opencascade-7.5.1+dfsg1/src/LocalAnalysis/LocalAnalysis_SurfaceContinuity.cxx --- opencascade-7.4.1+dfsg1/src/LocalAnalysis/LocalAnalysis_SurfaceContinuity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocalAnalysis/LocalAnalysis_SurfaceContinuity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -193,6 +193,24 @@ const Standard_Real EpsG1, const Standard_Real Percent, const Standard_Real Maxlen) +: myContC0(0.0), + myContC1U(0.0), + myContC1V(0.0), + myContC2U(0.0), + myContC2V(0.0), + myContG1(0.0), + myLambda1U(0.0), + myLambda2U(0.0), + myLambda1V(0.0), + myLambda2V(0.0), + myETA1(0.0), + myETA2(0.0), + myETA(0.0), + myZETA1(0.0), + myZETA2(0.0), + myZETA(0.0), + myAlpha(0.0), + myGap(0.0) { myepsnul=EpsNul; myepsC0= EpsC0; myepsC1= EpsC1; @@ -247,6 +265,24 @@ const Standard_Real EpsG1, const Standard_Real Percent, const Standard_Real Maxlen ) +: myContC0(0.0), + myContC1U(0.0), + myContC1V(0.0), + myContC2U(0.0), + myContC2V(0.0), + myContG1(0.0), + myLambda1U(0.0), + myLambda2U(0.0), + myLambda1V(0.0), + myLambda2V(0.0), + myETA1(0.0), + myETA2(0.0), + myETA(0.0), + myZETA1(0.0), + myZETA2(0.0), + myZETA(0.0), + myAlpha(0.0), + myGap(0.0) { myTypeCont = Ordre; myepsnul=EpsNul; myepsC0= EpsC0; @@ -307,6 +343,24 @@ const Standard_Real EpsG1, const Standard_Real Percent, const Standard_Real Maxlen ) +: myContC0(0.0), + myContC1U(0.0), + myContC1V(0.0), + myContC2U(0.0), + myContC2V(0.0), + myContG1(0.0), + myLambda1U(0.0), + myLambda2U(0.0), + myLambda1V(0.0), + myLambda2V(0.0), + myETA1(0.0), + myETA2(0.0), + myETA(0.0), + myZETA1(0.0), + myZETA2(0.0), + myZETA(0.0), + myAlpha(0.0), + myGap(0.0) { Standard_Real pard1, parf1, pard2, parf2, u1, v1, u2, v2; myTypeCont = Ordre; diff -Nru opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_Generator.lxx opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_Generator.lxx --- opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_Generator.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_Generator.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ //======================================================================= inline LocOpe_Generator::LocOpe_Generator() +: myDone(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_LinearForm.lxx opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_LinearForm.lxx --- opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_LinearForm.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_LinearForm.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,11 @@ //purpose : //======================================================================= -inline LocOpe_LinearForm::LocOpe_LinearForm () {} +inline LocOpe_LinearForm::LocOpe_LinearForm () +: myDone(Standard_False), + myIsTrans(Standard_False) +{ +} //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_PntFace.hxx opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_PntFace.hxx --- opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_PntFace.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_PntFace.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,12 @@ //! Empty constructor. Useful only for the list. - LocOpe_PntFace() {} + LocOpe_PntFace() + : myPar(0.0), + myUPar(0.0), + myVPar(0.0) + { + } LocOpe_PntFace (const gp_Pnt& P, const TopoDS_Face& F, const TopAbs_Orientation Or, const Standard_Real Param, const Standard_Real UPar, const Standard_Real VPar) : myPnt (P), myFace (F), myOri (Or), myPar (Param), myUPar (UPar), myVPar (VPar) diff -Nru opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_Prism.cxx opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_Prism.cxx --- opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_Prism.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_Prism.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,8 +42,11 @@ //function : LocOpe_Prism //purpose : //======================================================================= -LocOpe_Prism::LocOpe_Prism(): myDone(Standard_False) -{} +LocOpe_Prism::LocOpe_Prism() +: myIsTrans(Standard_False), + myDone(Standard_False) +{ +} //======================================================================= //function : LocOpe_Prism diff -Nru opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_Revol.cxx opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_Revol.cxx --- opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_Revol.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_Revol.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,10 +49,13 @@ //purpose : //======================================================================= -LocOpe_Revol::LocOpe_Revol() : myDone(Standard_False) - -{} - +LocOpe_Revol::LocOpe_Revol() +: myAngle(0.0), + myAngTra(0.0), + myIsTrans(Standard_False), + myDone(Standard_False) +{ +} //======================================================================= //function : Perform diff -Nru opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_RevolutionForm.cxx opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_RevolutionForm.cxx --- opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_RevolutionForm.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_RevolutionForm.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,9 +43,13 @@ //function : LocOpe_Revol //purpose : //======================================================================= -LocOpe_RevolutionForm::LocOpe_RevolutionForm() : myDone(Standard_False) - -{} +LocOpe_RevolutionForm::LocOpe_RevolutionForm() +: myAngle(0.0), + myAngTra(0.0), + myDone(Standard_False), + myIsTrans(Standard_False) +{ +} //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_SplitDrafts.cxx opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_SplitDrafts.cxx --- opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_SplitDrafts.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_SplitDrafts.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1769,7 +1769,7 @@ else { Vf.Orientation(TopAbs_REVERSED); Vl.Orientation(TopAbs_FORWARD); - rev = Standard_True;; + rev = Standard_True; } B.MakeEdge(NewEdg,Cimg,Precision::Confusion()); diff -Nru opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_Spliter.lxx opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_Spliter.lxx --- opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_Spliter.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_Spliter.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ //======================================================================= inline LocOpe_Spliter::LocOpe_Spliter() +: myDone(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_WiresOnShape.cxx opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_WiresOnShape.cxx --- opencascade-7.4.1+dfsg1/src/LocOpe/LocOpe_WiresOnShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/LocOpe/LocOpe_WiresOnShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -108,9 +108,13 @@ //purpose : //======================================================================= -LocOpe_WiresOnShape::LocOpe_WiresOnShape(const TopoDS_Shape& S): - myShape(S),myCheckInterior(Standard_True),myDone(Standard_False) -{} +LocOpe_WiresOnShape::LocOpe_WiresOnShape(const TopoDS_Shape& S) +: myShape(S), + myCheckInterior(Standard_True), + myDone(Standard_False), + myIndex(-1) +{ +} //======================================================================= //function : Init diff -Nru opencascade-7.4.1+dfsg1/src/MAT/MAT_BasicElt.cxx opencascade-7.5.1+dfsg1/src/MAT/MAT_BasicElt.cxx --- opencascade-7.4.1+dfsg1/src/MAT/MAT_BasicElt.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT/MAT_BasicElt.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,8 @@ MAT_BasicElt::MAT_BasicElt(const Standard_Integer anInteger) : startLeftArc (0), endLeftArc (0), - index(anInteger) + index(anInteger), + geomIndex(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/MAT/MAT_Edge.cxx opencascade-7.5.1+dfsg1/src/MAT/MAT_Edge.cxx --- opencascade-7.4.1+dfsg1/src/MAT/MAT_Edge.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT/MAT_Edge.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,9 @@ IMPLEMENT_STANDARD_RTTIEXT(MAT_Edge,Standard_Transient) MAT_Edge::MAT_Edge() +: theedgenumber(0), + thedistance(0.0), + theintersectionpoint(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/MAT/MAT_Graph.cxx opencascade-7.5.1+dfsg1/src/MAT/MAT_Graph.cxx --- opencascade-7.4.1+dfsg1/src/MAT/MAT_Graph.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT/MAT_Graph.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,7 +43,13 @@ // ===================================================================== // Constructeur vide. // ===================================================================== -MAT_Graph::MAT_Graph() {} +MAT_Graph::MAT_Graph() +: numberOfArcs(0), + numberOfNodes(0), + numberOfBasicElts(0), + numberOfInfiniteNodes(0) +{ +} // ===================================================================== // function : Perform diff -Nru opencascade-7.4.1+dfsg1/src/MAT/MAT_ListOfBisector.hxx opencascade-7.5.1+dfsg1/src/MAT/MAT_ListOfBisector.hxx --- opencascade-7.4.1+dfsg1/src/MAT/MAT_ListOfBisector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT/MAT_ListOfBisector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,9 +36,10 @@ public: - Standard_EXPORT MAT_ListOfBisector(); + Standard_EXPORT ~MAT_ListOfBisector(); + Standard_EXPORT void First(); Standard_EXPORT void Last(); diff -Nru opencascade-7.4.1+dfsg1/src/MAT/MAT_ListOfEdge.hxx opencascade-7.5.1+dfsg1/src/MAT/MAT_ListOfEdge.hxx --- opencascade-7.4.1+dfsg1/src/MAT/MAT_ListOfEdge.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT/MAT_ListOfEdge.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,8 +36,9 @@ public: - Standard_EXPORT MAT_ListOfEdge(); + + Standard_EXPORT ~MAT_ListOfEdge(); Standard_EXPORT void First(); diff -Nru opencascade-7.4.1+dfsg1/src/MAT/MAT_Node.cxx opencascade-7.5.1+dfsg1/src/MAT/MAT_Node.cxx --- opencascade-7.4.1+dfsg1/src/MAT/MAT_Node.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT/MAT_Node.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,8 @@ MAT_Node::MAT_Node(const Standard_Integer GeomIndex, const Handle(MAT_Arc)& LinkedArc, const Standard_Real Distance) - : geomIndex(GeomIndex), + : nodeIndex(0), + geomIndex(GeomIndex), distance(Distance) { aLinkedArc = LinkedArc.get(); diff -Nru opencascade-7.4.1+dfsg1/src/MAT/MAT_TList.gxx opencascade-7.5.1+dfsg1/src/MAT/MAT_TList.gxx --- opencascade-7.4.1+dfsg1/src/MAT/MAT_TList.gxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT/MAT_TList.gxx 2021-02-02 08:51:56.000000000 +0000 @@ -197,22 +197,25 @@ Standard_Boolean nextisnull = thecurrentnode->Next().IsNull(); if(thecurrentindex) + { + if(!nextisnull) { - if(!nextisnull && !previousisnull) - { - thecurrentnode->Next()->Previous(thecurrentnode->Previous()); - thecurrentnode->Previous()->Next(thecurrentnode->Next()); - } - - if(thecurrentindex == 1) - { - thefirstnode = thecurrentnode->Next(); - } - else if(thecurrentindex == thenumberofitems) - { - thelastnode = thecurrentnode->Previous(); - } + thecurrentnode->Next()->Previous(thecurrentnode->Previous()); } + if (!previousisnull) + { + thecurrentnode->Previous()->Next(thecurrentnode->Next()); + } + + if(thecurrentindex == 1) + { + thefirstnode = thecurrentnode->Next(); + } + else if(thecurrentindex == thenumberofitems) + { + thelastnode = thecurrentnode->Previous(); + } + } thenumberofitems--; thecurrentindex--; } @@ -382,3 +385,25 @@ { for(First(); More(); Next()) Current()->Dump(ashift,alevel); } + +//======================================================================= +//function : ~MAT_TList +//purpose : +//======================================================================= + +MAT_TList::~MAT_TList() +{ + Handle(MAT_TListNode) aNode = thefirstnode; + while (!aNode.IsNull()) + { + Handle(MAT_TListNode) aNext = aNode->Next(); + aNode->Next (NULL); + aNode->Previous (NULL); + aNode = aNext; + } + thecurrentnode.Nullify(); + thefirstnode.Nullify(); + thelastnode.Nullify(); + thecurrentindex = 0; + thenumberofitems = 0; +} diff -Nru opencascade-7.4.1+dfsg1/src/MAT/MAT_Zone.cxx opencascade-7.5.1+dfsg1/src/MAT/MAT_Zone.cxx --- opencascade-7.4.1+dfsg1/src/MAT/MAT_Zone.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT/MAT_Zone.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,9 @@ // purpose : //======================================================================== MAT_Zone::MAT_Zone () -{} +: limited(Standard_True) +{ +} //======================================================================== // function: diff -Nru opencascade-7.4.1+dfsg1/src/MAT2d/MAT2d_Circuit.cxx opencascade-7.5.1+dfsg1/src/MAT2d/MAT2d_Circuit.cxx --- opencascade-7.4.1+dfsg1/src/MAT2d/MAT2d_Circuit.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT2d/MAT2d_Circuit.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -75,6 +75,7 @@ //============================================================================= MAT2d_Circuit::MAT2d_Circuit(const GeomAbs_JoinType aJoinType, const Standard_Boolean IsOpenResult) +: direction(0.0) { myJoinType = aJoinType; myIsOpenResult = IsOpenResult; @@ -268,12 +269,12 @@ D = Min(P1.Distance(P),P2.Distance(P)); D /= 10; - if (Direction > 0.) D = -D; - + if (Direction < 0.) D = -D; + Handle(Geom2dAdaptor_HCurve) HC1 = new Geom2dAdaptor_HCurve(C1); Handle(Geom2dAdaptor_HCurve) HC2 = new Geom2dAdaptor_HCurve(C2); - Adaptor2d_OffsetCurve OC1(HC1,D,MilC1,C1->LastParameter()); - Adaptor2d_OffsetCurve OC2(HC2,D,C2->FirstParameter(),MilC2); + Adaptor2d_OffsetCurve OC1(HC1, D, MilC1, C1->LastParameter()); + Adaptor2d_OffsetCurve OC2(HC2, D, C2->FirstParameter(), MilC2); Geom2dInt_GInter Intersect; Intersect.Perform(OC1,OC2,Tol,Tol); diff -Nru opencascade-7.4.1+dfsg1/src/MAT2d/MAT2d_Connexion.cxx opencascade-7.5.1+dfsg1/src/MAT2d/MAT2d_Connexion.cxx --- opencascade-7.4.1+dfsg1/src/MAT2d/MAT2d_Connexion.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT2d/MAT2d_Connexion.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,6 +27,13 @@ //purpose : //============================================================================= MAT2d_Connexion::MAT2d_Connexion() +: lineA(0), + lineB(0), + itemA(0), + itemB(0), + distance(0.0), + parameterOnA(0.0), + parameterOnB(0.0) { } diff -Nru opencascade-7.4.1+dfsg1/src/MAT2d/MAT2d_Mat2d.cxx opencascade-7.5.1+dfsg1/src/MAT2d/MAT2d_Mat2d.cxx --- opencascade-7.4.1+dfsg1/src/MAT2d/MAT2d_Mat2d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT2d/MAT2d_Mat2d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,6 +31,8 @@ // purpose : //======================================================================== MAT2d_Mat2d::MAT2d_Mat2d(const Standard_Boolean IsOpenResult) +: semiInfinite(Standard_False), + isDone(Standard_False) { myIsOpenResult = IsOpenResult; thenumberofbisectors = 0; @@ -183,6 +185,7 @@ // du contour. // -------------------------------------------------------------------- theedgelist = new MAT_ListOfEdge(); + RemovedEdgesList = new MAT_ListOfEdge(); for(i=0; iNext(); } - + + RemovedEdgesList->BackAdd(theedgelist->Current()); theedgelist->Unlink(); //----------------------------------------------------------- @@ -623,6 +627,7 @@ ->FirstBisector()); for(j=0; jBackAdd(theedgelist->Current()); theedgelist->Unlink(); theedgelist->Next(); shift++; @@ -851,6 +856,7 @@ // du contour. // -------------------------------------------------------------------- theedgelist = new MAT_ListOfEdge(); + RemovedEdgesList = new MAT_ListOfEdge(); for(i=0; iNext(); } + RemovedEdgesList->BackAdd(theedgelist->Current()); theedgelist->Unlink(); //----------------------------------------------------------- @@ -1329,6 +1336,7 @@ ->FirstBisector()); for(j=0; jBackAdd(theedgelist->Current()); theedgelist->Unlink(); theedgelist->Next(); shift++; @@ -1710,3 +1718,41 @@ return isDone; } +//======================================================================= +//function : ~MAT2d_Mat2d +//purpose : +//======================================================================= + +MAT2d_Mat2d::~MAT2d_Mat2d() +{ + MAT_DataMapIteratorOfDataMapOfIntegerBisector itmap(bisectormap); + for (; itmap.More(); itmap.Next()) + { + Handle(MAT_Bisector) aBisector = itmap.Value(); + aBisector->FirstEdge(NULL); + aBisector->SecondEdge(NULL); + } + + if (!theedgelist.IsNull()) + { + theedgelist->First(); + for (Standard_Integer i = 1; i <= theedgelist->Number(); i++) + { + Handle(MAT_Edge) anEdge = theedgelist->Current(); + anEdge->FirstBisector(NULL); + anEdge->SecondBisector(NULL); + theedgelist->Next(); + } + } + if (!RemovedEdgesList.IsNull()) + { + RemovedEdgesList->First(); + for (Standard_Integer i = 1; i <= RemovedEdgesList->Number(); i++) + { + Handle(MAT_Edge) anEdge = RemovedEdgesList->Current(); + anEdge->FirstBisector(NULL); + anEdge->SecondBisector(NULL); + RemovedEdgesList->Next(); + } + } +} diff -Nru opencascade-7.4.1+dfsg1/src/MAT2d/MAT2d_Mat2d.hxx opencascade-7.5.1+dfsg1/src/MAT2d/MAT2d_Mat2d.hxx --- opencascade-7.4.1+dfsg1/src/MAT2d/MAT2d_Mat2d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT2d/MAT2d_Mat2d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,6 +44,8 @@ //! Empty construtor. Standard_EXPORT MAT2d_Mat2d(const Standard_Boolean IsOpenResult = Standard_False); + Standard_EXPORT ~MAT2d_Mat2d(); + //! Algoritm of computation of the bisecting locus. Standard_EXPORT void CreateMat (MAT2d_Tool2d& aTool); @@ -96,6 +98,7 @@ Standard_Integer thenumberofedges; Standard_Boolean semiInfinite; Handle(MAT_ListOfEdge) theedgelist; + Handle(MAT_ListOfEdge) RemovedEdgesList; TColStd_DataMapOfIntegerInteger typeofbisectortoremove; MAT_DataMapOfIntegerBisector bisectoronetoremove; MAT_DataMapOfIntegerBisector bisectortwotoremove; diff -Nru opencascade-7.4.1+dfsg1/src/MAT2d/MAT2d_MiniPath.cxx opencascade-7.5.1+dfsg1/src/MAT2d/MAT2d_MiniPath.cxx --- opencascade-7.4.1+dfsg1/src/MAT2d/MAT2d_MiniPath.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MAT2d/MAT2d_MiniPath.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,6 +34,8 @@ //purpose : //============================================================================ MAT2d_MiniPath::MAT2d_MiniPath() +: theDirection(1.0), + indStart(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/math/FILES opencascade-7.5.1+dfsg1/src/math/FILES --- opencascade-7.4.1+dfsg1/src/math/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/math/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -64,7 +64,6 @@ math_GaussMultipleIntegration.cxx math_GaussMultipleIntegration.hxx math_GaussMultipleIntegration.lxx -math_GaussPoints.hxx math_GaussSetIntegration.cxx math_GaussSetIntegration.hxx math_GaussSetIntegration.lxx diff -Nru opencascade-7.4.1+dfsg1/src/math/math_BFGS.cxx opencascade-7.5.1+dfsg1/src/math/math_BFGS.cxx --- opencascade-7.4.1+dfsg1/src/math/math_BFGS.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/math/math_BFGS.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -452,7 +452,7 @@ o << " Status = Done \n"; o <<" Location Vector = " << Location() << "\n"; o <<" Minimum value = "<< Minimum()<<"\n"; - o <<" Number of iterations = "< #include #include +#include class math_NotSquare; class Standard_DimensionError; class StdFail_NotDone; class math_Matrix; -class Message_ProgressIndicator; //! This class implements the Gauss LU decomposition (Crout algorithm) //! with partial pivoting (rows interchange) of a square matrix and @@ -55,7 +55,7 @@ //! Exception NotSquare is raised if A is not a square matrix. Standard_EXPORT math_Gauss(const math_Matrix& A, const Standard_Real MinPivot = 1.0e-20, - const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)()); + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Returns true if the computations are successful, otherwise returns false Standard_Boolean IsDone() const { return Done; } diff -Nru opencascade-7.4.1+dfsg1/src/math/math_GaussPoints.hxx opencascade-7.5.1+dfsg1/src/math/math_GaussPoints.hxx --- opencascade-7.4.1+dfsg1/src/math/math_GaussPoints.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/math/math_GaussPoints.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef math_GaussPoints_HeaderFile -#define math_GaussPoints_HeaderFile -#include -#include - - -extern const Standard_Real Point[157]; -extern const Standard_Real Weight[157]; - -math_Vector GPoints(const Standard_Integer Index); - -math_Vector GWeights(const Standard_Integer Index); - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/math/math_IntegerVector.hxx opencascade-7.5.1+dfsg1/src/math/math_IntegerVector.hxx --- opencascade-7.4.1+dfsg1/src/math/math_IntegerVector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/math/math_IntegerVector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -133,7 +133,7 @@ } //! returns the product of an IntegerVector by an integer value. - Standard_EXPORT Standard_NODISCARD math_IntegerVector Multiplied(const Standard_Integer theRight) const; + Standard_NODISCARD Standard_EXPORT math_IntegerVector Multiplied(const Standard_Integer theRight) const; Standard_NODISCARD math_IntegerVector operator*(const Standard_Integer theRight) const { @@ -141,7 +141,7 @@ } //! returns the product of a vector and a real value. - Standard_EXPORT Standard_NODISCARD math_IntegerVector TMultiplied(const Standard_Integer theRight) const; + Standard_NODISCARD Standard_EXPORT math_IntegerVector TMultiplied(const Standard_Integer theRight) const; friend inline math_IntegerVector operator* (const Standard_Integer theLeft, const math_IntegerVector& theRight) { @@ -161,7 +161,7 @@ //! adds the IntegerVector "theRight" to an IntegerVector. //! An exception is raised if the IntegerVectors have not the same length. //! An exception is raised if the lengths are not equal. - Standard_EXPORT Standard_NODISCARD math_IntegerVector Added(const math_IntegerVector& theRight) const; + Standard_NODISCARD Standard_EXPORT math_IntegerVector Added(const math_IntegerVector& theRight) const; Standard_NODISCARD math_IntegerVector operator+(const math_IntegerVector& theRight) const { @@ -210,7 +210,7 @@ //! returns the inner product of 2 IntegerVectors. //! An exception is raised if the lengths are not equal. - Standard_EXPORT Standard_NODISCARD Standard_Integer Multiplied(const math_IntegerVector& theRight) const; + Standard_NODISCARD Standard_EXPORT Standard_Integer Multiplied(const math_IntegerVector& theRight) const; Standard_NODISCARD Standard_Integer operator*(const math_IntegerVector& theRight) const { @@ -236,7 +236,7 @@ //! returns the subtraction of "theRight" from "me". //! An exception is raised if the IntegerVectors have not the same length. - Standard_EXPORT Standard_NODISCARD math_IntegerVector Subtracted(const math_IntegerVector& theRight) const; + Standard_NODISCARD Standard_EXPORT math_IntegerVector Subtracted(const math_IntegerVector& theRight) const; Standard_NODISCARD math_IntegerVector operator-(const math_IntegerVector& theRight) const { diff -Nru opencascade-7.4.1+dfsg1/src/math/math_Matrix.hxx opencascade-7.5.1+dfsg1/src/math/math_Matrix.hxx --- opencascade-7.4.1+dfsg1/src/math/math_Matrix.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/math/math_Matrix.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -170,7 +170,7 @@ //! multiplies all the elements of a matrix by the //! value . - Standard_EXPORT Standard_NODISCARD math_Matrix Multiplied (const Standard_Real Right) const; + Standard_NODISCARD Standard_EXPORT math_Matrix Multiplied (const Standard_Real Right) const; Standard_NODISCARD math_Matrix operator* (const Standard_Real Right) const { return Multiplied(Right); @@ -194,7 +194,7 @@ //! rows of this matrix, or //! - the number of columns of matrix Right is not equal to //! the number of columns of this matrix. - Standard_EXPORT Standard_NODISCARD math_Matrix TMultiplied (const Standard_Real Right) const; + Standard_NODISCARD Standard_EXPORT math_Matrix TMultiplied (const Standard_Real Right) const; friend math_Matrix operator *(const Standard_Real Left,const math_Matrix& Right); //! divides all the elements of a matrix by the value . @@ -207,7 +207,7 @@ //! divides all the elements of a matrix by the value . //! An exception is raised if = 0. - Standard_EXPORT Standard_NODISCARD math_Matrix Divided (const Standard_Real Right) const; + Standard_NODISCARD Standard_EXPORT math_Matrix Divided (const Standard_Real Right) const; Standard_NODISCARD math_Matrix operator/ (const Standard_Real Right) const { return Divided(Right); @@ -227,7 +227,7 @@ //! adds the matrix to a matrix. //! An exception is raised if the dimensions are different. - Standard_EXPORT Standard_NODISCARD math_Matrix Added (const math_Matrix& Right) const; + Standard_NODISCARD Standard_EXPORT math_Matrix Added (const math_Matrix& Right) const; Standard_NODISCARD math_Matrix operator+ (const math_Matrix& Right) const { return Added(Right); @@ -251,7 +251,7 @@ //! Returns the result of the subtraction of from . //! An exception is raised if the dimensions are different. - Standard_EXPORT Standard_NODISCARD math_Matrix Subtracted (const math_Matrix& Right) const; + Standard_NODISCARD Standard_EXPORT math_Matrix Subtracted (const math_Matrix& Right) const; Standard_NODISCARD math_Matrix operator- (const math_Matrix& Right) const { return Subtracted(Right); @@ -304,7 +304,7 @@ //! Teturns the transposed of a matrix. //! An exception is raised if the matrix is not a square matrix. - Standard_EXPORT Standard_NODISCARD math_Matrix Transposed() const; + Standard_NODISCARD Standard_EXPORT math_Matrix Transposed() const; //! Returns the inverse of a matrix. //! Exception NotSquare is raised if the matrix is not square. @@ -363,7 +363,7 @@ //! Returns the product of 2 matrices. //! An exception is raised if the dimensions are different. - Standard_EXPORT Standard_NODISCARD math_Matrix Multiplied (const math_Matrix& Right) const; + Standard_NODISCARD Standard_EXPORT math_Matrix Multiplied (const math_Matrix& Right) const; Standard_NODISCARD math_Matrix operator* (const math_Matrix& Right) const { return Multiplied(Right); @@ -371,7 +371,7 @@ //! Returns the product of a matrix by a vector. //! An exception is raised if the dimensions are different. - Standard_EXPORT Standard_NODISCARD math_Vector Multiplied (const math_Vector& Right) const; + Standard_NODISCARD Standard_EXPORT math_Vector Multiplied (const math_Vector& Right) const; Standard_NODISCARD math_Vector operator* (const math_Vector& Right) const { return Multiplied(Right); diff -Nru opencascade-7.4.1+dfsg1/src/math/math_PSOParticlesPool.cxx opencascade-7.5.1+dfsg1/src/math/math_PSOParticlesPool.cxx --- opencascade-7.4.1+dfsg1/src/math/math_PSOParticlesPool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/math/math_PSOParticlesPool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,7 +31,7 @@ { myParticlesCount = theParticlesCount; myDimensionCount = theDimensionCount; - + myMemory.Init(0.); // Pointers adjusting. Standard_Integer aParIdx, aShiftIdx; for(aParIdx = 1; aParIdx <= myParticlesCount; ++aParIdx) diff -Nru opencascade-7.4.1+dfsg1/src/math/math_Recipes.cxx opencascade-7.5.1+dfsg1/src/math/math_Recipes.cxx --- opencascade-7.4.1+dfsg1/src/math/math_Recipes.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/math/math_Recipes.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,11 +33,11 @@ #include #include -#include #include #include #include +#include namespace { static inline Standard_Real PYTHAG (const Standard_Real a, const Standard_Real b) @@ -177,7 +177,7 @@ Standard_Real& d, math_Vector& vv, Standard_Real TINY, - const Handle(Message_ProgressIndicator) & aProgress) { + const Message_ProgressRange& theProgress) { Standard_Integer i, imax=0, j, k; Standard_Real big, dum, sum, temp; @@ -185,7 +185,7 @@ Standard_Integer n = a.RowNumber(); d = 1.0; - Message_ProgressSentry aPSentry(aProgress, "", 0, n, 1); + Message_ProgressScope aPS(theProgress, "", n); for(i = 1; i <= n; i++) { big = 0.0; @@ -197,7 +197,7 @@ vv(i) = 1.0 / big; } - for(j = 1; j <= n && aPSentry.More(); j++, aPSentry.Next()) { + for(j = 1; j <= n && aPS.More(); j++, aPS.Next()) { for(i = 1; i < j; i++) { sum = a(i,j); for(k = 1; k < i; k++) @@ -250,10 +250,10 @@ math_IntegerVector& indx, Standard_Real& d, Standard_Real TINY, - const Handle(Message_ProgressIndicator) & aProgress) { + const Message_ProgressRange& theProgress) { math_Vector vv(1, a.RowNumber()); - return LU_Decompose(a, indx, d, vv, TINY, aProgress); + return LU_Decompose(a, indx, d, vv, TINY, theProgress); } void LU_Solve(const math_Matrix& a, diff -Nru opencascade-7.4.1+dfsg1/src/math/math_Recipes.hxx opencascade-7.5.1+dfsg1/src/math/math_Recipes.hxx --- opencascade-7.4.1+dfsg1/src/math/math_Recipes.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/math/math_Recipes.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,11 +19,11 @@ #include #include #include +#include class math_IntegerVector; class math_Vector; class math_Matrix; -class Message_ProgressIndicator; const Standard_Integer math_Status_UserAborted = -1; const Standard_Integer math_Status_OK = 0; @@ -32,10 +32,10 @@ const Standard_Integer math_Status_NoConvergence = 3; Standard_EXPORT Standard_Integer LU_Decompose(math_Matrix& a, - math_IntegerVector& indx, - Standard_Real& d, - Standard_Real TINY = 1.0e-20, - const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)()); + math_IntegerVector& indx, + Standard_Real& d, + Standard_Real TINY = 1.0e-20, + const Message_ProgressRange& theProgress = Message_ProgressRange()); // Given a matrix a(1..n, 1..n), this routine computes its LU decomposition, // The matrix a is replaced by this LU decomposition and the vector indx(1..n) @@ -44,11 +44,11 @@ // interchanges was even or odd. Standard_EXPORT Standard_Integer LU_Decompose(math_Matrix& a, - math_IntegerVector& indx, - Standard_Real& d, - math_Vector& vv, - Standard_Real TINY = 1.0e-30, - const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)()); + math_IntegerVector& indx, + Standard_Real& d, + math_Vector& vv, + Standard_Real TINY = 1.0e-30, + const Message_ProgressRange& theProgress = Message_ProgressRange()); // Idem to the previous LU_Decompose function. But the input Vector vv(1..n) is // used internally as a scratch area. diff -Nru opencascade-7.4.1+dfsg1/src/math/math_TrigonometricFunctionRoots.cxx opencascade-7.5.1+dfsg1/src/math/math_TrigonometricFunctionRoots.cxx --- opencascade-7.4.1+dfsg1/src/math/math_TrigonometricFunctionRoots.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/math/math_TrigonometricFunctionRoots.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -459,7 +459,7 @@ if(NbSol<4) { Standard_Integer startIndex = NbSol + 1; for( Standard_Integer solIt = startIndex; solIt <= 4; solIt++) { - Teta = M_PI + IntegerPart(Mod)*2.0*M_PI;; + Teta = M_PI + IntegerPart(Mod)*2.0*M_PI; X = Teta - MyBorneInf; if ((X >= (-Epsilon(Delta))) && (X <= Delta + Epsilon(Delta))) { if (Abs(A-C+E) <= Eps) { diff -Nru opencascade-7.4.1+dfsg1/src/math/math_Vector.hxx opencascade-7.5.1+dfsg1/src/math/math_Vector.hxx --- opencascade-7.4.1+dfsg1/src/math/math_Vector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/math/math_Vector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -128,7 +128,7 @@ //! Exceptions //! Standard_NullValue if this vector is null (i.e. if its norm is //! less than or equal to Standard_Real::RealEpsilon(). - Standard_EXPORT Standard_NODISCARD math_Vector Normalized() const; + Standard_NODISCARD Standard_EXPORT math_Vector Normalized() const; //! Inverts this vector and assigns the result to this vector. Standard_EXPORT void Invert(); @@ -157,7 +157,7 @@ } //! returns the product of a vector and a real value. - Standard_EXPORT Standard_NODISCARD math_Vector Multiplied(const Standard_Real theRight) const; + Standard_NODISCARD Standard_EXPORT math_Vector Multiplied(const Standard_Real theRight) const; Standard_NODISCARD math_Vector operator*(const Standard_Real theRight) const { @@ -165,7 +165,7 @@ } //! returns the product of a vector and a real value. - Standard_EXPORT Standard_NODISCARD math_Vector TMultiplied(const Standard_Real theRight) const; + Standard_NODISCARD Standard_EXPORT math_Vector TMultiplied(const Standard_Real theRight) const; friend inline math_Vector operator* (const Standard_Real theLeft, const math_Vector& theRight) { @@ -183,7 +183,7 @@ //! divides a vector by the value "theRight". //! An exception is raised if "theRight" = 0. - Standard_EXPORT Standard_NODISCARD math_Vector Divided(const Standard_Real theRight) const; + Standard_NODISCARD Standard_EXPORT math_Vector Divided(const Standard_Real theRight) const; Standard_NODISCARD math_Vector operator/(const Standard_Real theRight) const { @@ -205,7 +205,7 @@ //! adds the vector theRight to a vector. //! An exception is raised if the vectors have not the same length. //! An exception is raised if the lengths are not equal. - Standard_EXPORT Standard_NODISCARD math_Vector Added(const math_Vector& theRight) const; + Standard_NODISCARD Standard_EXPORT math_Vector Added(const math_Vector& theRight) const; Standard_NODISCARD math_Vector operator+(const math_Vector& theRight) const { @@ -275,14 +275,14 @@ //! returns the inner product of 2 vectors. //! An exception is raised if the lengths are not equal. - Standard_EXPORT Standard_NODISCARD Standard_Real Multiplied(const math_Vector& theRight) const; + Standard_NODISCARD Standard_EXPORT Standard_Real Multiplied(const math_Vector& theRight) const; Standard_NODISCARD Standard_Real operator*(const math_Vector& theRight) const { return Multiplied(theRight); } //! returns the product of a vector by a matrix. - Standard_EXPORT Standard_NODISCARD math_Vector Multiplied(const math_Matrix& theRight) const; + Standard_NODISCARD Standard_EXPORT math_Vector Multiplied(const math_Matrix& theRight) const; Standard_NODISCARD math_Vector operator*(const math_Matrix& theRight) const { @@ -308,7 +308,7 @@ //! returns the subtraction of "theRight" from "me". //! An exception is raised if the vectors have not the same length. - Standard_EXPORT Standard_NODISCARD math_Vector Subtracted(const math_Vector& theRight) const; + Standard_NODISCARD Standard_EXPORT math_Vector Subtracted(const math_Vector& theRight) const; Standard_NODISCARD math_Vector operator-(const math_Vector& theRight) const { diff -Nru opencascade-7.4.1+dfsg1/src/Media/Media_CodecContext.cxx opencascade-7.5.1+dfsg1/src/Media/Media_CodecContext.cxx --- opencascade-7.4.1+dfsg1/src/Media/Media_CodecContext.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Media/Media_CodecContext.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -92,7 +92,7 @@ myStreamIndex = theStream.index; if (avcodec_parameters_to_context (myCodecCtx, theStream.codecpar) < 0) { - Message::DefaultMessenger()->Send ("Internal error: unable to copy codec parameters", Message_Fail); + Message::SendFail ("Internal error: unable to copy codec parameters"); Close(); return false; } @@ -105,7 +105,7 @@ myCodec = avcodec_find_decoder (aCodecId); if (myCodec == NULL) { - Message::DefaultMessenger()->Send ("FFmpeg: unable to find decoder", Message_Fail); + Message::Send ("FFmpeg: unable to find decoder", Message_Fail); Close(); return false; } @@ -120,7 +120,7 @@ if (avcodec_open2 (myCodecCtx, myCodec, &anOpts) < 0) { - Message::DefaultMessenger()->Send ("FFmpeg: unable to open decoder", Message_Fail); + Message::SendFail ("FFmpeg: unable to open decoder"); Close(); return false; } @@ -147,7 +147,7 @@ && (myCodecCtx->width <= 0 || myCodecCtx->height <= 0)) { - Message::DefaultMessenger()->Send ("FFmpeg: video stream has invalid dimensions", Message_Fail); + Message::SendFail ("FFmpeg: video stream has invalid dimensions"); Close(); return false; } diff -Nru opencascade-7.4.1+dfsg1/src/Media/Media_FormatContext.cxx opencascade-7.5.1+dfsg1/src/Media/Media_FormatContext.cxx --- opencascade-7.4.1+dfsg1/src/Media/Media_FormatContext.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Media/Media_FormatContext.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -257,8 +257,8 @@ const int avErrCode = avformat_open_input (&myFormatCtx, theInput.ToCString(), NULL, NULL); if (avErrCode != 0) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("FFmpeg: Couldn't open video file '") + theInput - + "'\nError: " + FormatAVErrorDescription (avErrCode), Message_Fail); + Message::SendFail (TCollection_AsciiString ("FFmpeg: Couldn't open video file '") + theInput + + "'\nError: " + FormatAVErrorDescription (avErrCode)); Close(); return false; } @@ -266,7 +266,7 @@ // retrieve stream information if (avformat_find_stream_info (myFormatCtx, NULL) < 0) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("FFmpeg: Couldn't find stream information in '") + theInput + "'", Message_Fail); + Message::SendFail (TCollection_AsciiString ("FFmpeg: Couldn't find stream information in '") + theInput + "'"); Close(); return false; } @@ -306,7 +306,7 @@ return true; #else - Message::DefaultMessenger()->Send ("Error: FFmpeg library is unavailable", Message_Fail); + Message::SendFail ("Error: FFmpeg library is unavailable"); (void )theInput; return false; #endif @@ -514,9 +514,8 @@ : (aStream.codecpar->codec_type == AVMEDIA_TYPE_AUDIO ? "Audio" : ""); - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error while seeking ") + aStreamType + " stream to " - + theSeekPts + " sec (" + (theSeekPts + StreamUnitsToSeconds (aStream, aStream.start_time)) + " sec)", - Message_Warning); + Message::SendWarning (TCollection_AsciiString ("Error while seeking ") + aStreamType + " stream to " + + theSeekPts + " sec (" + (theSeekPts + StreamUnitsToSeconds (aStream, aStream.start_time)) + " sec)"); return false; #else (void )theStreamId; @@ -548,7 +547,7 @@ myFormatCtx->filename; #endif - Message::DefaultMessenger()->Send (TCollection_AsciiString("Disaster! Seeking to ") + theSeekPts + " [" + aFileName + "] has failed.", Message_Warning); + Message::SendWarning (TCollection_AsciiString("Disaster! Seeking to ") + theSeekPts + " [" + aFileName + "] has failed."); return false; #else (void )theSeekPts; diff -Nru opencascade-7.4.1+dfsg1/src/Media/Media_Frame.cxx opencascade-7.5.1+dfsg1/src/Media/Media_Frame.cxx --- opencascade-7.4.1+dfsg1/src/Media/Media_Frame.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Media/Media_Frame.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -92,6 +92,7 @@ return AV_PIX_FMT_GRAY8; case Image_Format_GrayF: case Image_Format_AlphaF: + case Image_Format_RGF: case Image_Format_RGBAF: case Image_Format_RGBF: case Image_Format_BGRAF: diff -Nru opencascade-7.4.1+dfsg1/src/Media/Media_PlayerContext.cxx opencascade-7.5.1+dfsg1/src/Media/Media_PlayerContext.cxx --- opencascade-7.4.1+dfsg1/src/Media/Media_PlayerContext.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Media/Media_PlayerContext.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -139,7 +139,7 @@ #endif if (aVideoCtx.IsNull()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("FFmpeg: no video stream in '") + theSrcVideo + "'", Message_Fail); + Message::SendFail (TCollection_AsciiString ("FFmpeg: no video stream in '") + theSrcVideo + "'"); return Handle(Media_Frame)(); } @@ -149,7 +149,7 @@ { if (!aFormatCtx->ReadPacket (aPacket)) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("FFmpeg: unable to read from '") + theSrcVideo + "'", Message_Fail); + Message::SendFail (TCollection_AsciiString ("FFmpeg: unable to read from '") + theSrcVideo + "'"); return Handle(Media_Frame)(); } if (!aVideoCtx->CanProcessPacket (aPacket)) @@ -167,7 +167,7 @@ || aFrame->SizeX() < 1 || aFrame->SizeY() < 1) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("FFmpeg: unable to decode first video frame from '") + theSrcVideo + "'", Message_Fail); + Message::SendFail (TCollection_AsciiString ("FFmpeg: unable to decode first video frame from '") + theSrcVideo + "'"); return Handle(Media_Frame)(); } return aFrame; @@ -205,7 +205,7 @@ } if (!aPixMap->InitZero (Image_Format_RGB, aResSizeX, aResSizeY)) { - Message::DefaultMessenger()->Send ("FFmpeg: Failed allocation of RGB frame (out of memory)", Message_Fail); + Message::SendFail ("FFmpeg: Failed allocation of RGB frame (out of memory)"); return false; } @@ -218,7 +218,7 @@ Media_Scaler aScaler; if (!aScaler.Convert (aFrame, anRgbFrame)) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("FFmpeg: unable to convert frame into RGB '") + theSrcVideo + "'", Message_Fail); + Message::SendFail (TCollection_AsciiString ("FFmpeg: unable to convert frame into RGB '") + theSrcVideo + "'"); return false; } } @@ -421,7 +421,7 @@ const int aBufSize = aLineSize * aSize.y(); if (!myBufferPools[0]->Init (aBufSize)) { - Message::DefaultMessenger()->Send ("FFmpeg: unable to allocate RGB24 frame buffer", Message_Fail); + Message::SendFail ("FFmpeg: unable to allocate RGB24 frame buffer"); return false; } @@ -430,7 +430,7 @@ if (aFrame->buf[0] == NULL) { theFrame->Unref(); - Message::DefaultMessenger()->Send ("FFmpeg: unable to allocate RGB24 frame buffer", Message_Fail); + Message::SendFail ("FFmpeg: unable to allocate RGB24 frame buffer"); return false; } @@ -461,7 +461,7 @@ || !myBufferPools[1]->Init (aBufSizeUV) || !myBufferPools[2]->Init (aBufSizeUV)) { - Message::DefaultMessenger()->Send ("FFmpeg: unable to allocate YUV420P frame buffers", Message_Fail); + Message::SendFail ("FFmpeg: unable to allocate YUV420P frame buffers"); return false; } @@ -474,7 +474,7 @@ || aFrame->buf[2] == NULL) { theFrame->Unref(); - Message::DefaultMessenger()->Send ("FFmpeg: unable to allocate YUV420P frame buffers", Message_Fail); + Message::SendFail ("FFmpeg: unable to allocate YUV420P frame buffers"); return false; } @@ -567,7 +567,7 @@ #endif if (aVideoCtx.IsNull()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("FFmpeg: no video stream in '") + anInput + "'", Message_Fail); + Message::SendFail (TCollection_AsciiString ("FFmpeg: no video stream in '") + anInput + "'"); continue; } diff -Nru opencascade-7.4.1+dfsg1/src/MeshTest/MeshTest.cxx opencascade-7.5.1+dfsg1/src/MeshTest/MeshTest.cxx --- opencascade-7.4.1+dfsg1/src/MeshTest/MeshTest.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshTest/MeshTest.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,14 +32,22 @@ #include #include #include +#include #include #include #include #include +#include +#include #include #include #include +#include +#include +#include +#include + //epa Memory leaks test //OAN: for triepoints #ifdef _WIN32 @@ -88,7 +96,11 @@ -surf_def_off disables control of deflection of mesh from real\n\ surface (enabled by default)\n\ -parallel enables parallel execution (switched off by default)\n\ - -adjust_min enables local adjustment of min size depending on edge size (switched off by default)\n"; + -adjust_min enables local adjustment of min size depending on edge size (switched off by default)\n\ + -force_face_def disables usage of shape tolerances for computing face deflection (switched off by default)\n\ + -decrease enforces the meshing of the shape even if current mesh satisfies the new criteria\ + (switched off by default).\n\ + -algo {watson|delabella} changes core triangulation algorithm to one with specified id (watson is used by default)\n"; return 0; } @@ -103,6 +115,7 @@ aMeshParams.Deflection = aMeshParams.DeflectionInterior = Max(Draw::Atof(argv[2]), Precision::Confusion()); + Handle (IMeshTools_Context) aContext = new BRepMesh_Context; if (nbarg > 3) { Standard_Integer i = 3; @@ -123,25 +136,60 @@ aMeshParams.ControlSurfaceDeflection = Standard_False; else if (aOpt == "-adjust_min") aMeshParams.AdjustMinSize = Standard_True; + else if (aOpt == "-force_face_def") + aMeshParams.ForceFaceDeflection = Standard_True; + else if (aOpt == "-decrease") + aMeshParams.AllowQualityDecrease = Standard_True; else if (i < nbarg) { - Standard_Real aVal = Draw::Atof(argv[i++]); - if (aOpt == "-a") - { - aMeshParams.Angle = aVal * M_PI / 180.; - } - else if (aOpt == "-ai") + if (aOpt == "-algo") { - aMeshParams.AngleInterior = aVal * M_PI / 180.; + TCollection_AsciiString anAlgoStr (argv[i++]); + anAlgoStr.LowerCase(); + if (anAlgoStr == "watson" + || anAlgoStr == "0") + { + aMeshParams.MeshAlgo = IMeshTools_MeshAlgoType_Watson; + aContext->SetFaceDiscret (new BRepMesh_FaceDiscret (new BRepMesh_MeshAlgoFactory)); + } + else if (anAlgoStr == "delabella" + || anAlgoStr == "1") + { + aMeshParams.MeshAlgo = IMeshTools_MeshAlgoType_Delabella; + aContext->SetFaceDiscret (new BRepMesh_FaceDiscret (new BRepMesh_DelabellaMeshAlgoFactory)); + } + else if (anAlgoStr == "-1" + || anAlgoStr == "default") + { + // already handled by BRepMesh_Context constructor + //aMeshParams.MeshAlgo = IMeshTools_MeshAlgoType_DEFAULT; + } + else + { + di << "Syntax error at " << anAlgoStr; + return 1; + } } - else if (aOpt == "-min") - aMeshParams.MinSize = aVal; - else if (aOpt == "-di") + else { - aMeshParams.DeflectionInterior = aVal; + Standard_Real aVal = Draw::Atof(argv[i++]); + if (aOpt == "-a") + { + aMeshParams.Angle = aVal * M_PI / 180.; + } + else if (aOpt == "-ai") + { + aMeshParams.AngleInterior = aVal * M_PI / 180.; + } + else if (aOpt == "-min") + aMeshParams.MinSize = aVal; + else if (aOpt == "-di") + { + aMeshParams.DeflectionInterior = aVal; + } + else + --i; } - else - --i; } } } @@ -149,7 +197,12 @@ di << "Incremental Mesh, multi-threading " << (aMeshParams.InParallel ? "ON" : "OFF") << "\n"; - BRepMesh_IncrementalMesh aMesher (aShape, aMeshParams); + Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator(di, 1); + BRepMesh_IncrementalMesh aMesher; + aMesher.SetShape (aShape); + aMesher.ChangeParameters() = aMeshParams; + + aMesher.Perform (aContext, aProgress->Start()); di << "Meshing statuses: "; const Standard_Integer aStatus = aMesher.GetStatusFlags(); @@ -160,7 +213,7 @@ else { Standard_Integer i; - for (i = 0; i < 8; i++) + for (i = 0; i < 9; i++) { Standard_Integer aFlag = aStatus & (1 << i); if (aFlag) @@ -191,6 +244,9 @@ case IMeshData_Reused: di << "Reused "; break; + case IMeshData_UserBreak: + di << "User break"; + break; case IMeshData_NoError: default: break; @@ -210,7 +266,7 @@ { if (nbarg != 5) { - std::cerr << "Builds regular triangulation with specified number of triangles\n" + Message::SendFail() << "Builds regular triangulation with specified number of triangles\n" " Usage: tessellate result {surface|face} nbu nbv\n" " Triangulation is put into the face with natural bounds (result);\n" " it will have 2*nbu*nbv triangles and (nbu+1)*(nbv+1) nodes"; @@ -224,7 +280,7 @@ if (aNbU <= 0 || aNbV <= 0) { - std::cerr << "Error: Arguments nbu and nbv must be both greater than 0\n"; + Message::SendFail() << "Error: Arguments nbu and nbv must be both greater than 0"; return 1; } @@ -239,14 +295,14 @@ TopoDS_Shape aShape = DBRep::Get(aSrcName); if (aShape.IsNull() || aShape.ShapeType() != TopAbs_FACE) { - std::cerr << "Error: " << aSrcName << " is not a face\n"; + Message::SendFail() << "Error: " << aSrcName << " is not a face"; return 1; } TopoDS_Face aFace = TopoDS::Face (aShape); aSurf = BRep_Tool::Surface (aFace); if (aSurf.IsNull()) { - std::cerr << "Error: Face " << aSrcName << " has no surface\n"; + Message::SendFail() << "Error: Face " << aSrcName << " has no surface"; return 1; } @@ -255,14 +311,14 @@ if (Precision::IsInfinite (aUMin) || Precision::IsInfinite (aUMax) || Precision::IsInfinite (aVMin) || Precision::IsInfinite (aVMax)) { - std::cerr << "Error: surface has infinite parametric range, aborting\n"; + Message::SendFail() << "Error: surface has infinite parametric range, aborting"; return 1; } BRepBuilderAPI_MakeFace aFaceMaker (aSurf, aUMin, aUMax, aVMin, aVMax, Precision::Confusion()); if (! aFaceMaker.IsDone()) { - std::cerr << "Error: cannot build face with natural bounds, aborting\n"; + Message::SendFail() << "Error: cannot build face with natural bounds, aborting"; return 1; } TopoDS_Face aFace = aFaceMaker; @@ -805,7 +861,7 @@ k1 = n1+totalnodes; k2 = n2+totalnodes; k3 = n3+totalnodes; - fprintf(outfile, "%s %d%s%d %d%s%d %d%s%d\n", "fo", k1,"//", k1, k2,"//", k2, k3,"//", k3); + fprintf(outfile, "f %d%s%d %d%s%d %d%s%d\n", k1,"//", k1, k2,"//", k2, k3,"//", k3); } nbpolygons += nbTriangles; totalnodes += nbNodes; diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_CommonSensitiveEntity.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_CommonSensitiveEntity.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_CommonSensitiveEntity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_CommonSensitiveEntity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -118,7 +118,7 @@ //function : NbSubElements //purpose : //======================================================================= -Standard_Integer MeshVS_CommonSensitiveEntity::NbSubElements() +Standard_Integer MeshVS_CommonSensitiveEntity::NbSubElements() const { return myItemIndexes.Size(); } diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_CommonSensitiveEntity.hxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_CommonSensitiveEntity.hxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_CommonSensitiveEntity.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_CommonSensitiveEntity.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,7 @@ Standard_EXPORT virtual ~MeshVS_CommonSensitiveEntity(); //! Number of elements. - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; //! Returns the amount of sub-entities of the complex entity Standard_EXPORT virtual Standard_Integer Size() const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_DummySensitiveEntity.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_DummySensitiveEntity.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_DummySensitiveEntity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_DummySensitiveEntity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,7 @@ // Function : NbSubElements // Purpose : //================================================================ -Standard_Integer MeshVS_DummySensitiveEntity::NbSubElements() +Standard_Integer MeshVS_DummySensitiveEntity::NbSubElements() const { return -1; } @@ -80,7 +80,7 @@ //function : InvInitLocation //purpose : //======================================================================= -inline gp_GTrsf MeshVS_DummySensitiveEntity::InvInitLocation() const +gp_GTrsf MeshVS_DummySensitiveEntity::InvInitLocation() const { return gp_GTrsf(); } diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_DummySensitiveEntity.hxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_DummySensitiveEntity.hxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_DummySensitiveEntity.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_DummySensitiveEntity.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,12 +36,14 @@ Standard_EXPORT virtual Standard_Boolean Matches (SelectBasics_SelectingVolumeManager& theMgr, SelectBasics_PickResult& thePickResult) Standard_OVERRIDE; - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; Standard_EXPORT virtual Select3D_BndBox3d BoundingBox() Standard_OVERRIDE; Standard_EXPORT virtual void BVH() Standard_OVERRIDE; + virtual Standard_Boolean ToBuildBVH() const Standard_OVERRIDE { return Standard_False; } + Standard_EXPORT virtual void Clear() Standard_OVERRIDE; Standard_EXPORT virtual Standard_Boolean HasInitLocation() const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_ElementalColorPrsBuilder.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_ElementalColorPrsBuilder.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_ElementalColorPrsBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_ElementalColorPrsBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -216,7 +215,7 @@ PolygonVerticesFor3D, PolygonBoundsFor3D ); } - Graphic3d_MaterialAspect aMaterial[2] = { Graphic3d_NOM_PLASTIC, Graphic3d_NOM_PLASTIC }; + Graphic3d_MaterialAspect aMaterial[2] = { Graphic3d_NameOfMaterial_Plastified, Graphic3d_NameOfMaterial_Plastified }; for (Standard_Integer i = 0; i < 2; i++) { // OCC20644 "plastic" is most suitable here, as it is "non-physic" @@ -250,14 +249,14 @@ Handle(Graphic3d_Group) aGGroup, aGroup2, aLGroup, aSGroup; if (!aTwoColorsOfElements.IsEmpty()) { - aGroup2 = Prs3d_Root::NewGroup (Prs); + aGroup2 = Prs->NewGroup(); } if (!aColorsOfElements.IsEmpty()) { Handle(Graphic3d_AspectFillArea3d) aGroupFillAspect = new Graphic3d_AspectFillArea3d (Aspect_IS_SOLID, anInteriorColor, anEdgeColor, anEdgeType, anEdgeWidth, aMaterial[0], aMaterial[1]); - aGGroup = Prs3d_Root::NewGroup (Prs); - aLGroup = Prs3d_Root::NewGroup (Prs); + aGGroup = Prs->NewGroup(); + aLGroup = Prs->NewGroup(); aGGroup->SetClosed (toSupressBackFaces == Standard_True); aGGroup->SetGroupPrimitivesAspect (aGroupFillAspect); } @@ -265,7 +264,7 @@ if (anEdgeOn) { Handle(Graphic3d_AspectLine3d) anEdgeAspect = new Graphic3d_AspectLine3d (anEdgeColor, anEdgeType, anEdgeWidth); - aSGroup = Prs3d_Root::NewGroup (Prs); + aSGroup = Prs->NewGroup(); aSGroup->SetGroupPrimitivesAspect (anEdgeAspect); } @@ -479,7 +478,7 @@ CustomBuild(Prs, aCustomElements, IDsToExclude, DisplayMode); } - Graphic3d_MaterialAspect aMaterial2[2] = { Graphic3d_NOM_PLASTIC, Graphic3d_NOM_PLASTIC }; + Graphic3d_MaterialAspect aMaterial2[2] = { Graphic3d_NameOfMaterial_Plastified, Graphic3d_NameOfMaterial_Plastified }; for (Standard_Integer i = 0; i < 2; i++) { // OCC20644 "plastic" is most suitable here, as it is "non-physic" diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_Mesh.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_Mesh.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_Mesh.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_Mesh.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -83,7 +82,7 @@ SetHilightMode( MeshVS_DMF_WireFrame ); // Wireframe as default hilight mode SetColor ( Quantity_NOC_WHITE ); - SetMaterial ( Graphic3d_NOM_PLASTIC ); + SetMaterial (Graphic3d_NameOfMaterial_Plastified); myCurrentDrawer = new MeshVS_Drawer(); myCurrentDrawer->SetColor ( MeshVS_DA_InteriorColor, Quantity_NOC_BLUE4 ); @@ -124,8 +123,8 @@ myHilightDrawer->SetColor ( MeshVS_DA_EdgeColor, Quantity_NOC_GREEN ); myHilightDrawer->SetInteger ( MeshVS_DA_EdgeType, Aspect_TOL_SOLID ); myHilightDrawer->SetDouble ( MeshVS_DA_EdgeWidth, 1.0 ); - myHilightDrawer->SetMaterial ( MeshVS_DA_FrontMaterial, Graphic3d_NOM_PLASTIC ); - myHilightDrawer->SetMaterial ( MeshVS_DA_BackMaterial, Graphic3d_NOM_PLASTIC ); + myHilightDrawer->SetMaterial ( MeshVS_DA_FrontMaterial, Graphic3d_NameOfMaterial_Plastified ); + myHilightDrawer->SetMaterial ( MeshVS_DA_BackMaterial, Graphic3d_NameOfMaterial_Plastified ); myHilightDrawer->SetColor ( MeshVS_DA_BeamColor, Quantity_NOC_GRAY80 ); myHilightDrawer->SetInteger ( MeshVS_DA_BeamType, Aspect_TOL_SOLID ); @@ -653,8 +652,6 @@ } } - StdSelect_BRepSelectionTool::PreBuildBVH (theSelection); - if (toShowComputeSelectionTime) { Standard_Real sec, cpu; diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_MeshEntityOwner.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_MeshEntityOwner.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_MeshEntityOwner.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_MeshEntityOwner.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -36,7 +35,7 @@ // Purpose : //================================================================ MeshVS_MeshEntityOwner::MeshVS_MeshEntityOwner - ( const SelectMgr_SOPtr& SelObj, + ( const SelectMgr_SelectableObject* SelObj, const Standard_Integer ID, const Standard_Address MeshEntity, const MeshVS_EntityType& Type, diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_MeshEntityOwner.hxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_MeshEntityOwner.hxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_MeshEntityOwner.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_MeshEntityOwner.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,15 +16,8 @@ #ifndef _MeshVS_MeshEntityOwner_HeaderFile #define _MeshVS_MeshEntityOwner_HeaderFile -#include -#include - -#include #include -#include -#include #include -#include #include #include class PrsMgr_PresentationManager; @@ -43,7 +36,7 @@ public: - Standard_EXPORT MeshVS_MeshEntityOwner(const SelectMgr_SOPtr& SelObj, const Standard_Integer ID, const Standard_Address MeshEntity, const MeshVS_EntityType& Type, const Standard_Integer Priority = 0, const Standard_Boolean IsGroup = Standard_False); + Standard_EXPORT MeshVS_MeshEntityOwner(const SelectMgr_SelectableObject* SelObj, const Standard_Integer ID, const Standard_Address MeshEntity, const MeshVS_EntityType& Type, const Standard_Integer Priority = 0, const Standard_Boolean IsGroup = Standard_False); //! Returns an address of element or node data structure Standard_EXPORT Standard_Address Owner() const; diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_MeshOwner.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_MeshOwner.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_MeshOwner.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_MeshOwner.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,7 +35,7 @@ // Function : Constructor MeshVS_MeshOwner // Purpose : //================================================================ -MeshVS_MeshOwner::MeshVS_MeshOwner (const SelectMgr_SOPtr& theSelObj, +MeshVS_MeshOwner::MeshVS_MeshOwner (const SelectMgr_SelectableObject* theSelObj, const Handle(MeshVS_DataSource)& theDS, const Standard_Integer thePriority) : SelectMgr_EntityOwner ( theSelObj, thePriority ) diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_MeshOwner.hxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_MeshOwner.hxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_MeshOwner.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_MeshOwner.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,15 +16,10 @@ #ifndef _MeshVS_MeshOwner_HeaderFile #define _MeshVS_MeshOwner_HeaderFile -#include -#include - -#include #include -#include #include #include -#include + class MeshVS_DataSource; class TColStd_HPackedMapOfInteger; class PrsMgr_PresentationManager; @@ -42,7 +37,7 @@ public: - Standard_EXPORT MeshVS_MeshOwner(const SelectMgr_SOPtr& theSelObj, const Handle(MeshVS_DataSource)& theDS, const Standard_Integer thePriority = 0); + Standard_EXPORT MeshVS_MeshOwner(const SelectMgr_SelectableObject* theSelObj, const Handle(MeshVS_DataSource)& theDS, const Standard_Integer thePriority = 0); Standard_EXPORT const Handle(MeshVS_DataSource)& GetDataSource() const; diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_MeshPrsBuilder.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_MeshPrsBuilder.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_MeshPrsBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_MeshPrsBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,7 +39,6 @@ #include #include #include -#include #include #include #include @@ -158,8 +157,7 @@ if ( k>0 ) { - Prs3d_Root::NewGroup ( Prs ); - Handle (Graphic3d_Group) aNodeGroup = Prs3d_Root::CurrentGroup ( Prs ); + Handle (Graphic3d_Group) aNodeGroup = Prs->NewGroup(); aNodeGroup->SetPrimitivesAspect ( aNodeMark ); aNodeGroup->AddPrimitiveArray (aNodePoints); } @@ -551,8 +549,7 @@ if ( !aSource->GetGeom ( ID, IsElement, aCoords, NbNodes, aType ) ) return; - Prs3d_Root::NewGroup ( Prs ); - Handle (Graphic3d_Group) aHilightGroup = Prs3d_Root::CurrentGroup ( Prs ); + Handle (Graphic3d_Group) aHilightGroup = Prs->NewGroup(); switch ( aType ) { @@ -1065,8 +1062,7 @@ if ( IsPolygons && theFillAsp->FrontMaterial().Transparency()<0.01 ) { - Prs3d_Root::NewGroup ( Prs ); - Handle (Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup ( Prs ); + Handle (Graphic3d_Group) aGroup = Prs->NewGroup(); aGroup->SetClosed (isSupressBackFaces == Standard_True); Handle(Graphic3d_AspectFillArea3d) aFillAsp = new Graphic3d_AspectFillArea3d (*theFillAsp); //if ( IsPolygonsEdgesOff ) @@ -1094,8 +1090,7 @@ if ( IsPolylines && !IsPolygonsEdgesOff ) { - Prs3d_Root::NewGroup ( Prs ); - Handle (Graphic3d_Group) aLGroup = Prs3d_Root::CurrentGroup ( Prs ); + Handle (Graphic3d_Group) aLGroup = Prs->NewGroup(); if ( IsSelected ) aLGroup->SetPrimitivesAspect ( theLineAsp ); @@ -1110,8 +1105,7 @@ if ( IsLinkPolylines ) { - Prs3d_Root::NewGroup ( Prs ); - Handle (Graphic3d_Group) aBeamGroup = Prs3d_Root::CurrentGroup ( Prs ); + Handle (Graphic3d_Group) aBeamGroup = Prs->NewGroup(); if ( !IsSelected ) aBeamGroup->SetPrimitivesAspect ( theFillAsp ); aBeamGroup->SetPrimitivesAspect ( theLineAsp ); @@ -1120,8 +1114,7 @@ if ( IsPolygons && theFillAsp->FrontMaterial().Transparency()>=0.01 ) { - Prs3d_Root::NewGroup ( Prs ); - Handle (Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup ( Prs ); + Handle (Graphic3d_Group) aGroup = Prs->NewGroup(); aGroup->SetClosed (isSupressBackFaces == Standard_True); Handle(Graphic3d_AspectFillArea3d) aFillAsp = new Graphic3d_AspectFillArea3d (*theFillAsp); //if ( IsPolygonsEdgesOff ) diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_NodalColorPrsBuilder.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_NodalColorPrsBuilder.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_NodalColorPrsBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_NodalColorPrsBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -190,7 +189,7 @@ // Draw faces with nodal color // OCC20644 Use "plastic" material as it is "non-physic" and so it is easier to get the required colors - Graphic3d_MaterialAspect aMaterial[2] = { Graphic3d_NOM_PLASTIC, Graphic3d_NOM_PLASTIC }; + Graphic3d_MaterialAspect aMaterial[2] = { Graphic3d_NameOfMaterial_Plastified, Graphic3d_NameOfMaterial_Plastified }; for (Standard_Integer i = 0; i < 2; ++i) { aMaterial[i].SetSpecularColor (Quantity_NOC_BLACK); @@ -465,7 +464,7 @@ Handle(Graphic3d_AspectLine3d) anLAsp = new Graphic3d_AspectLine3d( anEdgeColor, anEdgeType, anEdgeWidth ); - Handle(Graphic3d_Group) aGroup1 = Prs3d_Root::NewGroup (Prs); + Handle(Graphic3d_Group) aGroup1 = Prs->NewGroup(); Standard_Boolean toSupressBackFaces = Standard_False; aDrawer->GetBoolean (MeshVS_DA_SupressBackFaces, toSupressBackFaces); @@ -477,8 +476,7 @@ if (aShowEdges) { - Prs3d_Root::NewGroup ( Prs ); - Handle(Graphic3d_Group) aGroup2 = Prs3d_Root::CurrentGroup ( Prs ); + Handle(Graphic3d_Group) aGroup2 = Prs->NewGroup(); Handle(Graphic3d_AspectFillArea3d) anAspCopy = new Graphic3d_AspectFillArea3d (*anAsp); anAspCopy->SetTextureMapOff(); diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_PrsBuilder.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_PrsBuilder.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_PrsBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_PrsBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,6 @@ #include #include #include -#include #include IMPLEMENT_STANDARD_RTTIEXT(MeshVS_PrsBuilder,Standard_Transient) diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitiveMesh.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitiveMesh.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitiveMesh.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitiveMesh.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -77,7 +77,7 @@ // function : NbSubElements // purpose : Returns the amount of mesh nodes //======================================================================= -Standard_Integer MeshVS_SensitiveMesh::NbSubElements() +Standard_Integer MeshVS_SensitiveMesh::NbSubElements() const { Handle(MeshVS_MeshOwner) anOwner = Handle(MeshVS_MeshOwner)::DownCast (OwnerId()); if (anOwner.IsNull()) diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitiveMesh.hxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitiveMesh.hxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitiveMesh.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitiveMesh.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,7 +48,7 @@ } //! Returns the amount of mesh nodes - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; //! Returns bounding box of mesh Standard_EXPORT virtual Select3D_BndBox3d BoundingBox() Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitivePolyhedron.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitivePolyhedron.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitivePolyhedron.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitivePolyhedron.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -104,7 +104,7 @@ // function : NbSubElements // purpose : Returns the amount of nodes of polyhedron //======================================================================= -Standard_Integer MeshVS_SensitivePolyhedron::NbSubElements() +Standard_Integer MeshVS_SensitivePolyhedron::NbSubElements() const { return myNodes->Length(); } diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitivePolyhedron.hxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitivePolyhedron.hxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitivePolyhedron.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitivePolyhedron.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,7 +55,7 @@ SelectBasics_PickResult& thePickResult) Standard_OVERRIDE; //! Returns the amount of nodes of polyhedron - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; Standard_EXPORT virtual Select3D_BndBox3d BoundingBox() Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitiveQuad.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitiveQuad.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitiveQuad.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitiveQuad.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -67,6 +67,12 @@ { if (!theMgr.IsOverlapAllowed()) // check for inclusion { + if (theMgr.GetActiveSelectionType() == SelectBasics_SelectingVolumeManager::Polyline) + { + SelectBasics_PickResult aDummy; + return theMgr.Overlaps (myVertices[0], myVertices[1], myVertices[2], Select3D_TOS_INTERIOR, aDummy) + && theMgr.Overlaps (myVertices[0], myVertices[2], myVertices[3], Select3D_TOS_INTERIOR, aDummy); + } for (Standard_Integer aPntIdx = 0; aPntIdx < 4; ++aPntIdx) { if (!theMgr.Overlaps (myVertices[aPntIdx])) diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitiveQuad.hxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitiveQuad.hxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_SensitiveQuad.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_SensitiveQuad.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,7 @@ const gp_Pnt& thePnt4); //! Returns the amount of sub-entities in sensitive - virtual Standard_Integer NbSubElements() Standard_OVERRIDE + virtual Standard_Integer NbSubElements() const Standard_OVERRIDE { return 1; }; diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_TextPrsBuilder.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_TextPrsBuilder.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_TextPrsBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_TextPrsBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_Tool.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_Tool.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_Tool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_Tool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -96,10 +96,10 @@ ( const Handle(MeshVS_Drawer)& theDr, const Standard_Boolean UseDefaults ) { - Graphic3d_MaterialAspect aFrMat = Graphic3d_NOM_BRASS; - Graphic3d_MaterialAspect aBackMat = Graphic3d_NOM_BRASS; - Standard_Integer aFrMatI = (Standard_Integer)Graphic3d_NOM_BRASS; - Standard_Integer aBackMatI = (Standard_Integer)Graphic3d_NOM_BRASS; + Graphic3d_MaterialAspect aFrMat = Graphic3d_NameOfMaterial_Brass; + Graphic3d_MaterialAspect aBackMat = Graphic3d_NameOfMaterial_Brass; + Standard_Integer aFrMatI = (Standard_Integer)Graphic3d_NameOfMaterial_Brass; + Standard_Integer aBackMatI = (Standard_Integer)Graphic3d_NameOfMaterial_Brass; if ( !theDr->GetInteger ( MeshVS_DA_FrontMaterial, aFrMatI ) && !UseDefaults ) return 0; diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_TwoColors.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_TwoColors.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_TwoColors.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_TwoColors.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -71,13 +71,15 @@ MeshVS_TwoColors BindTwoColors ( const Quantity_Color& theCol1, const Quantity_Color& theCol2 ) { MeshVS_TwoColors aRes; - - aRes.r1 = unsigned ( theCol1.Red() * 255.0 ); - aRes.g1 = unsigned ( theCol1.Green() * 255.0 ); - aRes.b1 = unsigned ( theCol1.Blue() * 255.0 ); - aRes.r2 = unsigned ( theCol2.Red() * 255.0 ); - aRes.g2 = unsigned ( theCol2.Green() * 255.0 ); - aRes.b2 = unsigned ( theCol2.Blue() * 255.0 ); + NCollection_Vec3 aColor_sRGB; + theCol1.Values (aColor_sRGB.r(), aColor_sRGB.g(), aColor_sRGB.b(), Quantity_TOC_sRGB); + aRes.r1 = unsigned ( aColor_sRGB.r() * 255.0 ); + aRes.g1 = unsigned ( aColor_sRGB.g() * 255.0 ); + aRes.b1 = unsigned ( aColor_sRGB.b() * 255.0 ); + theCol2.Values (aColor_sRGB.r(), aColor_sRGB.g(), aColor_sRGB.b(), Quantity_TOC_sRGB); + aRes.r2 = unsigned ( aColor_sRGB.r() * 255.0 ); + aRes.g2 = unsigned ( aColor_sRGB.g() * 255.0 ); + aRes.b2 = unsigned ( aColor_sRGB.b() * 255.0 ); return aRes; } @@ -94,11 +96,11 @@ if ( Index == 1 ) aRes.SetValues ( Standard_Real (theTwoColors.r1) / max, Standard_Real (theTwoColors.g1) / max, - Standard_Real (theTwoColors.b1) / max, Quantity_TOC_RGB ); + Standard_Real (theTwoColors.b1) / max, Quantity_TOC_sRGB ); else if (Index == 2) aRes.SetValues ( Standard_Real (theTwoColors.r2) / max, Standard_Real (theTwoColors.g2) / max, - Standard_Real (theTwoColors.b2) / max, Quantity_TOC_RGB ); + Standard_Real (theTwoColors.b2) / max, Quantity_TOC_sRGB ); return aRes; } @@ -112,8 +114,8 @@ Standard_Real max = 255.0; theCol1.SetValues ( Standard_Real (theTwoColors.r1) / max, Standard_Real (theTwoColors.g1) / max, - Standard_Real (theTwoColors.b1) / max, Quantity_TOC_RGB ); + Standard_Real (theTwoColors.b1) / max, Quantity_TOC_sRGB ); theCol2.SetValues ( Standard_Real (theTwoColors.r2) / max, Standard_Real (theTwoColors.g2) / max, - Standard_Real (theTwoColors.b2) / max, Quantity_TOC_RGB ); + Standard_Real (theTwoColors.b2) / max, Quantity_TOC_sRGB ); } diff -Nru opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_VectorPrsBuilder.cxx opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_VectorPrsBuilder.cxx --- opencascade-7.4.1+dfsg1/src/MeshVS/MeshVS_VectorPrsBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MeshVS/MeshVS_VectorPrsBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,7 +39,6 @@ #include #include #include -#include #include #include #include @@ -319,8 +318,7 @@ } } - Prs3d_Root::NewGroup ( Prs ); - Handle (Graphic3d_Group) aVGroup = Prs3d_Root::CurrentGroup ( Prs ); + Handle (Graphic3d_Group) aVGroup = Prs->NewGroup(); Quantity_Color aColor; aDrawer->GetColor ( MeshVS_DA_VectorColor, aColor ); diff -Nru opencascade-7.4.1+dfsg1/src/Message/FILES opencascade-7.5.1+dfsg1/src/Message/FILES --- opencascade-7.4.1+dfsg1/src/Message/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,15 +1,33 @@ Message.cxx Message.hxx +Message_Alert.cxx +Message_Alert.hxx +Message_AlertExtended.cxx +Message_AlertExtended.hxx Message_Algorithm.cxx Message_Algorithm.hxx Message_Algorithm.lxx +Message_ConsoleColor.hxx +Message_Attribute.cxx +Message_Attribute.hxx +Message_AttributeMeter.cxx +Message_AttributeMeter.hxx +Message_AttributeObject.cxx +Message_AttributeObject.hxx +Message_AttributeStream.cxx +Message_AttributeStream.hxx +Message_CompositeAlerts.cxx +Message_CompositeAlerts.hxx Message_ExecStatus.hxx Message_Gravity.hxx Message_HArrayOfMsg.hxx +Message_Level.cxx +Message_Level.hxx Message_ListIteratorOfListOfMsg.hxx Message_ListOfMsg.hxx Message_Messenger.cxx Message_Messenger.hxx +Message_MetricType.hxx Message_Msg.cxx Message_Msg.hxx Message_Msg.lxx @@ -19,21 +37,18 @@ Message_Printer.hxx Message_PrinterOStream.cxx Message_PrinterOStream.hxx +Message_PrinterSystemLog.cxx +Message_PrinterSystemLog.hxx +Message_PrinterToReport.cxx +Message_PrinterToReport.hxx Message_ProgressIndicator.cxx Message_ProgressIndicator.hxx -Message_ProgressIndicator.lxx -Message_ProgressScale.cxx -Message_ProgressScale.hxx -Message_ProgressScale.lxx -Message_ProgressSentry.cxx +Message_ProgressRange.hxx +Message_ProgressScope.hxx Message_ProgressSentry.hxx -Message_ProgressSentry.lxx Message_SequenceOfPrinters.hxx -Message_SequenceOfProgressScale.hxx Message_Status.hxx Message_StatusType.hxx -Message_Alert.cxx -Message_Alert.hxx Message_ListOfAlert.hxx Message_Report.cxx Message_Report.hxx diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Alert.cxx opencascade-7.5.1+dfsg1/src/Message/Message_Alert.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Alert.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Alert.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,6 +14,7 @@ // commercial license or contractual agreement. #include +#include IMPLEMENT_STANDARD_RTTIEXT(Message_Alert,Standard_Transient) @@ -48,3 +49,12 @@ // by default, merge trivially return Standard_True; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_Alert::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_AlertExtended.cxx opencascade-7.5.1+dfsg1/src/Message/Message_AlertExtended.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_AlertExtended.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_AlertExtended.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,116 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include + +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(Message_AlertExtended, Message_Alert) + +//======================================================================= +//function : AddAlert +//purpose : +//======================================================================= +Handle(Message_Alert) Message_AlertExtended::AddAlert (const Handle(Message_Report)& theReport, + const Handle(Message_Attribute)& theAttribute, + const Message_Gravity theGravity) +{ + Handle(Message_AlertExtended) anAlert = new Message_AlertExtended(); + anAlert->SetAttribute (theAttribute); + theReport->AddAlert (theGravity, anAlert); + return anAlert; +} + +//======================================================================= +//function : GetMessageKey +//purpose : +//======================================================================= +Standard_CString Message_AlertExtended::GetMessageKey() const +{ + if (myAttribute.IsNull()) + { + return Message_Alert::GetMessageKey(); + } + return myAttribute->GetMessageKey(); +} + +//======================================================================= +//function : CompositeAlerts +//purpose : +//======================================================================= +Handle(Message_CompositeAlerts) Message_AlertExtended::CompositeAlerts (const Standard_Boolean theToCreate) +{ + if (myCompositAlerts.IsNull() && theToCreate) + { + myCompositAlerts = new Message_CompositeAlerts(); + } + return myCompositAlerts; +} + +//======================================================================= +//function : SupportsMerge +//purpose : +//======================================================================= +Standard_Boolean Message_AlertExtended::SupportsMerge() const +{ + if (myCompositAlerts.IsNull()) + { + return Standard_True; + } + + // hierarchical alerts can not be merged + for (int aGravIter = Message_Trace; aGravIter <= Message_Fail; ++aGravIter) + { + if (!myCompositAlerts->Alerts ((Message_Gravity)aGravIter).IsEmpty()) + { + return Standard_False; + } + } + + return Standard_True; +} + +//======================================================================= +//function : Merge +//purpose : +//======================================================================= +Standard_Boolean Message_AlertExtended::Merge (const Handle(Message_Alert)& /*theTarget*/) +{ + // by default, merge trivially + return Standard_False; +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_AlertExtended::DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + if (!myCompositAlerts.IsNull()) + { + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myCompositAlerts.get()) + } + if (!myAttribute.IsNull()) + { + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAttribute.get()) + } +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_AlertExtended.hxx opencascade-7.5.1+dfsg1/src/Message/Message_AlertExtended.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_AlertExtended.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_AlertExtended.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,88 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_AlertExtended_HeaderFile +#define _Message_AlertExtended_HeaderFile + +#include +#include +#include + +class Message_Attribute; +class Message_Report; + +class Message_CompositeAlerts; + +//! Inherited class of Message_Alert with some additional information. +//! It has Message_Attributes to provide the alert name, and other custom information +//! It has a container of composite alerts, if the alert might provide +//! sub-alerts collecting. +class Message_AlertExtended : public Message_Alert +{ +public: + //! Creates new instance of the alert and put it into report with Message_Info gravity. + //! It does nothing if such kind of gravity is not active in the report + //! @param theReport the message report where new alert is placed + //! @param theAttribute container of additional values of the alert + //! @return created alert or NULL if Message_Info is not active in report + Standard_EXPORT static Handle(Message_Alert) AddAlert (const Handle(Message_Report)& theReport, + const Handle(Message_Attribute)& theAttribute, + const Message_Gravity theGravity); + +public: + //! Empty constructor + Message_AlertExtended() : Message_Alert() {} + + //! Return a C string to be used as a key for generating text user messages describing this alert. + //! The messages are generated with help of Message_Msg class, in Message_Report::Dump(). + //! Base implementation returns dynamic type name of the instance. + Standard_EXPORT virtual Standard_CString GetMessageKey() const Standard_OVERRIDE; + + //! Returns container of the alert attributes + const Handle(Message_Attribute)& Attribute() const { return myAttribute; } + + //! Sets container of the alert attributes + //! @param theAttributes an attribute values + void SetAttribute (const Handle(Message_Attribute)& theAttribute) { myAttribute = theAttribute; } + + //! Returns class provided hierarchy of alerts if created or create if the parameter is true + //! @param theToCreate if composite alert has not been created for this alert, it should be created + //! @return instance or NULL + Standard_EXPORT Handle(Message_CompositeAlerts) CompositeAlerts (const Standard_Boolean theToCreate = Standard_False); + + //! Return true if this type of alert can be merged with other + //! of the same type to avoid duplication. + //! Hierarchical alerts can not be merged + //! Basis implementation returns true. + Standard_EXPORT virtual Standard_Boolean SupportsMerge() const Standard_OVERRIDE; + + //! If possible, merge data contained in this alert to theTarget. + //! Base implementation always returns false. + //! @return True if merged + Standard_EXPORT virtual Standard_Boolean Merge (const Handle(Message_Alert)& theTarget) Standard_OVERRIDE; + + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth = -1) const Standard_OVERRIDE; + + DEFINE_STANDARD_RTTIEXT(Message_AlertExtended, Message_Alert) + +protected: + + Handle(Message_CompositeAlerts) myCompositAlerts; //!< class provided hierarchical structure of alerts + Handle(Message_Attribute) myAttribute; //!< container of the alert attributes +}; + +DEFINE_STANDARD_HANDLE(Message_AlertExtended, Message_Alert) + +#endif // _Message_Alert_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Alert.hxx opencascade-7.5.1+dfsg1/src/Message/Message_Alert.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Alert.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Alert.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -54,6 +54,9 @@ //! Base implementation always returns true. virtual Standard_EXPORT Standard_Boolean Merge (const Handle(Message_Alert)& theTarget); + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + // OCCT RTTI DEFINE_STANDARD_RTTIEXT(Message_Alert,Standard_Transient) }; diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Attribute.cxx opencascade-7.5.1+dfsg1/src/Message/Message_Attribute.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Attribute.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Attribute.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,47 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(Message_Attribute, Standard_Transient) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +Message_Attribute::Message_Attribute (const TCollection_AsciiString& theName) +: myName (theName) +{ +} + +//======================================================================= +//function : GetMessageKey +//purpose : +//======================================================================= +Standard_CString Message_Attribute::GetMessageKey() const +{ + return !myName.IsEmpty() ? myName.ToCString() : ""; +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_Attribute::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myName) +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Attribute.hxx opencascade-7.5.1+dfsg1/src/Message/Message_Attribute.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Attribute.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Attribute.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,52 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_Attribute_HeaderFile +#define _Message_Attribute_HeaderFile + +#include +#include + +DEFINE_STANDARD_HANDLE(Message_Attribute, Standard_Transient) + +//! Additional information of extended alert attribute +//! To provide other custom attribute container, it might be redefined. +class Message_Attribute : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(Message_Attribute, Standard_Transient) +public: + //! Empty constructor + Standard_EXPORT Message_Attribute (const TCollection_AsciiString& theName = TCollection_AsciiString()); + + //! Return a C string to be used as a key for generating text user messages describing this alert. + //! The messages are generated with help of Message_Msg class, in Message_Report::Dump(). + //! Base implementation returns dynamic type name of the instance. + Standard_EXPORT virtual Standard_CString GetMessageKey() const; + + //! Returns custom name of alert if it is set + //! @return alert name + const TCollection_AsciiString& GetName() const { return myName; } + + //! Sets the custom name of alert + //! @param theName a name for the alert + void SetName (const TCollection_AsciiString& theName) { myName = theName; } + + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + +private: + TCollection_AsciiString myName; //!< alert name, if defined is used in GetMessageKey + +}; + +#endif // _Message_Attribute_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_AttributeMeter.cxx opencascade-7.5.1+dfsg1/src/Message/Message_AttributeMeter.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_AttributeMeter.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_AttributeMeter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,256 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include + +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeMeter, Message_Attribute) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +Message_AttributeMeter::Message_AttributeMeter (const TCollection_AsciiString& theName) +: Message_Attribute(theName) +{ +} + +//======================================================================= +//function : HasMetric +//purpose : +//======================================================================= +Standard_Boolean Message_AttributeMeter::HasMetric (const Message_MetricType& theMetric) const +{ + return myMetrics.Contains (theMetric); +} + +//======================================================================= +//function : IsMetricValid +//purpose : +//======================================================================= +Standard_Boolean Message_AttributeMeter::IsMetricValid (const Message_MetricType& theMetric) const +{ + return Abs (StartValue(theMetric) - UndefinedMetricValue()) > Precision::Confusion() && + Abs (StopValue (theMetric) - UndefinedMetricValue()) > Precision::Confusion(); +} + +//======================================================================= +//function : StartValue +//purpose : +//======================================================================= +Standard_Real Message_AttributeMeter::StartValue (const Message_MetricType& theMetric) const +{ + if (!HasMetric (theMetric)) + { + return UndefinedMetricValue(); + } + + return myMetrics.Seek (theMetric)->first; +} + +//======================================================================= +//function : SetStartValue +//purpose : +//======================================================================= +void Message_AttributeMeter::SetStartValue (const Message_MetricType& theMetric, const Standard_Real theValue) +{ + if (StartToStopValue* aValPtr = myMetrics.ChangeSeek (theMetric)) + { + aValPtr->first = theValue; + } + else + { + myMetrics.Add (theMetric, std::make_pair (theValue, UndefinedMetricValue())); + } +} + +//======================================================================= +//function : StopValue +//purpose : +//======================================================================= +Standard_Real Message_AttributeMeter::StopValue (const Message_MetricType& theMetric) const +{ + if (!HasMetric (theMetric)) + { + return UndefinedMetricValue(); + } + return myMetrics.Seek (theMetric)->second; +} + +//======================================================================= +//function : SetStopValue +//purpose : +//======================================================================= +void Message_AttributeMeter::SetStopValue (const Message_MetricType& theMetric, const Standard_Real theValue) +{ + if (StartToStopValue* aValPtr = myMetrics.ChangeSeek (theMetric)) + { + aValPtr->second = theValue; + } +} + +//======================================================================= +//function : SetAlertMetrics +//purpose : +//======================================================================= +void Message_AttributeMeter::SetAlertMetrics (const Handle(Message_AlertExtended)& theAlert, + const Standard_Boolean theStartValue) +{ + if (theAlert.IsNull()) + { + return; + } + + Handle(Message_AttributeMeter) aMeterAttribute = Handle(Message_AttributeMeter)::DownCast (theAlert->Attribute()); + if (aMeterAttribute.IsNull()) + { + return; + } + + Handle(Message_Report) aReport = Message::DefaultReport (Standard_True); + const NCollection_IndexedMap& anActiveMetrics = aReport->ActiveMetrics(); + + // time metrics + if (anActiveMetrics.Contains (Message_MetricType_ProcessCPUUserTime) || + anActiveMetrics.Contains (Message_MetricType_ProcessCPUSystemTime) || + anActiveMetrics.Contains (Message_MetricType_ThreadCPUUserTime) || + anActiveMetrics.Contains (Message_MetricType_ThreadCPUSystemTime)) + { + if (anActiveMetrics.Contains (Message_MetricType_ProcessCPUUserTime) || + anActiveMetrics.Contains (Message_MetricType_ProcessCPUSystemTime)) + { + Standard_Real aProcessUserTime, aProcessSystemTime; + OSD_Chronometer::GetProcessCPU (aProcessUserTime, aProcessSystemTime); + if (anActiveMetrics.Contains (Message_MetricType_ProcessCPUUserTime)) + { + if (theStartValue) + { + aMeterAttribute->SetStartValue (Message_MetricType_ProcessCPUUserTime, aProcessUserTime); + } + else + { + aMeterAttribute->SetStopValue (Message_MetricType_ProcessCPUUserTime, aProcessUserTime); + } + } + if (anActiveMetrics.Contains (Message_MetricType_ProcessCPUSystemTime)) + { + if (theStartValue) + { + aMeterAttribute->SetStartValue (Message_MetricType_ProcessCPUSystemTime, aProcessSystemTime); + } + else + { + aMeterAttribute->SetStopValue (Message_MetricType_ProcessCPUSystemTime, aProcessSystemTime); + } + } + } + if (anActiveMetrics.Contains (Message_MetricType_ThreadCPUUserTime) || + anActiveMetrics.Contains (Message_MetricType_ThreadCPUSystemTime)) + { + Standard_Real aThreadUserTime, aThreadSystemTime; + OSD_Chronometer::GetThreadCPU (aThreadUserTime, aThreadSystemTime); + if (anActiveMetrics.Contains (Message_MetricType_ThreadCPUUserTime)) + { + if (theStartValue) + { + aMeterAttribute->SetStartValue (Message_MetricType_ThreadCPUUserTime, aThreadUserTime); + } + else + { + aMeterAttribute->SetStopValue (Message_MetricType_ThreadCPUUserTime, aThreadUserTime); + } + } + if (anActiveMetrics.Contains (Message_MetricType_ThreadCPUSystemTime)) + { + if (theStartValue) + { + aMeterAttribute->SetStartValue (Message_MetricType_ThreadCPUSystemTime, aThreadSystemTime); + } + else + { + aMeterAttribute->SetStopValue (Message_MetricType_ThreadCPUSystemTime, aThreadSystemTime); + } + } + } + } + + // memory metrics + OSD_MemInfo aMemInfo (Standard_False); + aMemInfo.SetActive (Standard_False); + NCollection_IndexedMap aCounters; + for (NCollection_IndexedMap::Iterator anIterator (anActiveMetrics); anIterator.More(); anIterator.Next()) + { + OSD_MemInfo::Counter anInfoCounter; + if (!Message::ToOSDMetric (anIterator.Value(), anInfoCounter)) + { + continue; + } + + aCounters.Add (anInfoCounter); + aMemInfo.SetActive (anInfoCounter, Standard_True); + } + if (aCounters.IsEmpty()) + { + return; + } + + aMemInfo.Update(); + Message_MetricType aMetricType; + for (NCollection_IndexedMap::Iterator anIterator (aCounters); anIterator.More(); anIterator.Next()) + { + if (!Message::ToMessageMetric (anIterator.Value(), aMetricType)) + { + continue; + } + + if (theStartValue) + { + aMeterAttribute->SetStartValue (aMetricType, (Standard_Real)aMemInfo.ValuePreciseMiB (anIterator.Value())); + } + else + { + aMeterAttribute->SetStopValue (aMetricType, (Standard_Real)aMemInfo.ValuePreciseMiB (anIterator.Value())); + } + } +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_AttributeMeter::DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute) + + for (NCollection_IndexedDataMap::Iterator anIterator (myMetrics); + anIterator.More(); anIterator.Next()) + { + Message_MetricType aMetricType = anIterator.Key(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aMetricType) + + Standard_Real aStartValue = anIterator.Value().first; + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aStartValue) + + Standard_Real aStopValue = anIterator.Value().second; + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aStopValue) + } +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_AttributeMeter.hxx opencascade-7.5.1+dfsg1/src/Message/Message_AttributeMeter.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_AttributeMeter.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_AttributeMeter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,97 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_AttributeMeter_HeaderFile +#define _Message_AttributeMeter_HeaderFile + +#include +#include + +#include + +class Message_Alert; +class Message_AlertExtended; + +//! Alert object storing alert metrics values. +//! Start and stop values for each metric. +class Message_AttributeMeter : public Message_Attribute +{ +public: + + //! Returns default value of the metric when it is not defined + //! @return undefined value + static Standard_Real UndefinedMetricValue() { return -1.0; } + +public: + + //! Constructor with string argument + Standard_EXPORT Message_AttributeMeter (const TCollection_AsciiString& theName = TCollection_AsciiString()); + + //! Checks whether the attribute has values for the metric + //! @param theMetric [in] metric type + //! @return true if the metric values exist in the attribute + Standard_EXPORT Standard_Boolean HasMetric (const Message_MetricType& theMetric) const; + + //! Returns true when both values of the metric are set. + //! @param theMetric [in] metric type + //! @return true if metric values are valid + Standard_EXPORT Standard_Boolean IsMetricValid (const Message_MetricType& theMetric) const; + + //! Returns start value for the metric + //! @param theMetric [in] metric type + //! @return real value + Standard_EXPORT Standard_Real StartValue (const Message_MetricType& theMetric) const; + + //! Sets start values for the metric + //! @param theMetric [in] metric type + Standard_EXPORT void SetStartValue (const Message_MetricType& theMetric, const Standard_Real theValue); + + //! Returns stop value for the metric + //! @param theMetric [in] metric type + //! @return real value + Standard_EXPORT Standard_Real StopValue (const Message_MetricType& theMetric) const; + + //! Sets stop values for the metric + //! @param theMetric [in] metric type + Standard_EXPORT void SetStopValue (const Message_MetricType& theMetric, const Standard_Real theValue); + +public: + + //! Sets start values of default report metrics into the alert + //! @param theAlert an alert + static void StartAlert (const Handle(Message_AlertExtended)& theAlert) { SetAlertMetrics (theAlert, Standard_True); } + + //! Sets stop values of default report metrics into the alert + //! @param theAlert an alert + static void StopAlert (const Handle(Message_AlertExtended)& theAlert) { SetAlertMetrics (theAlert, Standard_False); } + + //! Sets current values of default report metrics into the alert. + //! Processed oly alert with Message_AttributeMeter attribute + //! @param theAlert an alert + //! @param theStartValue flag, if true, the start value is collected otherwise stop + static Standard_EXPORT void SetAlertMetrics (const Handle(Message_AlertExtended)& theAlert, + const Standard_Boolean theStartValue); + + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth = -1) const Standard_OVERRIDE; + + DEFINE_STANDARD_RTTIEXT(Message_AttributeMeter, Message_Attribute) + +private: + + typedef std::pair StartToStopValue; + NCollection_IndexedDataMap myMetrics; //!< computed metrics +}; + +#endif // _Message_AttributeMeter_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_AttributeObject.cxx opencascade-7.5.1+dfsg1/src/Message/Message_AttributeObject.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_AttributeObject.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_AttributeObject.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,41 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeObject, Message_Attribute) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +Message_AttributeObject::Message_AttributeObject (const Handle(Standard_Transient)& theObject, + const TCollection_AsciiString& theName) +: Message_Attribute(theName) +{ + myObject = theObject; +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_AttributeObject::DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myObject.get()) +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_AttributeObject.hxx opencascade-7.5.1+dfsg1/src/Message/Message_AttributeObject.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_AttributeObject.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_AttributeObject.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,46 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_AttributeObject_HeaderFile +#define _Message_AttributeObject_HeaderFile + +#include + +class Standard_Transient; + +//! Alert object storing a transient object +class Message_AttributeObject : public Message_Attribute +{ + DEFINE_STANDARD_RTTIEXT(Message_AttributeObject, Message_Attribute) +public: + //! Constructor with string argument + Standard_EXPORT Message_AttributeObject (const Handle(Standard_Transient)& theObject, + const TCollection_AsciiString& theName = TCollection_AsciiString()); + + //! Returns object + //! @return the object instance + const Handle(Standard_Transient)& Object() const { return myObject; } + + //! Sets the object + //! @param theObject an instance + void SetObject (const Handle(Standard_Transient)& theObject) { myObject = theObject; } + + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth = -1) const Standard_OVERRIDE; + +private: + Handle(Standard_Transient) myObject; //!< alert object +}; + +#endif // _Message_AttributeObject_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_AttributeStream.cxx opencascade-7.5.1+dfsg1/src/Message/Message_AttributeStream.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_AttributeStream.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_AttributeStream.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,52 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(Message_AttributeStream, Message_Attribute) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +Message_AttributeStream::Message_AttributeStream (const Standard_SStream& theStream, + const TCollection_AsciiString& theName) +: Message_Attribute(theName) +{ + SetStream (theStream); +} + +//======================================================================= +//function : SetStream +//purpose : +//======================================================================= +void Message_AttributeStream::SetStream (const Standard_SStream& theStream) +{ + myStream.str (""); + myStream << theStream.str().c_str(); +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_AttributeStream::DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Message_Attribute) + + TCollection_AsciiString aStream = Standard_Dump::Text (myStream); + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, aStream) +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_AttributeStream.hxx opencascade-7.5.1+dfsg1/src/Message/Message_AttributeStream.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_AttributeStream.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_AttributeStream.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,45 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_AttributeStream_HeaderFile +#define _Message_AttributeStream_HeaderFile + +#include + +#include + +//! Alert object storing stream value +class Message_AttributeStream : public Message_Attribute +{ + DEFINE_STANDARD_RTTIEXT(Message_AttributeStream, Message_Attribute) +public: + + //! Constructor with string argument + Standard_EXPORT Message_AttributeStream (const Standard_SStream& theStream, + const TCollection_AsciiString& theName = TCollection_AsciiString()); + + //! Returns stream value + const Standard_SStream& Stream() const { return myStream; } + + //! Sets stream value + Standard_EXPORT void SetStream (const Standard_SStream& theStream); + + //! Dumps the content of me into the stream + virtual Standard_EXPORT void DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth = -1) const Standard_OVERRIDE; + +private: + Standard_SStream myStream; //!< container of values +}; + +#endif // _Message_AttributeStream_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_CompositeAlerts.cxx opencascade-7.5.1+dfsg1/src/Message/Message_CompositeAlerts.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_CompositeAlerts.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_CompositeAlerts.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,183 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(Message_CompositeAlerts, Standard_Transient) + +//======================================================================= +//function : Alerts +//purpose : +//======================================================================= +const Message_ListOfAlert& Message_CompositeAlerts::Alerts (const Message_Gravity theGravity) const +{ + static const Message_ListOfAlert anEmptyList; + Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), + "Requesting alerts for gravity not in valid range", anEmptyList); + return myAlerts[theGravity]; +} + +//======================================================================= +//function : AddAlert +//purpose : +//======================================================================= +Standard_Boolean Message_CompositeAlerts::AddAlert (Message_Gravity theGravity, const Handle(Message_Alert)& theAlert) +{ + Standard_ASSERT_RETURN (! theAlert.IsNull(), "Attempt to add null alert", Standard_False); + Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), + "Adding alert with gravity not in valid range", Standard_False); + + Message_ListOfAlert& aList = myAlerts[theGravity]; + if (theAlert->SupportsMerge() && ! aList.IsEmpty()) + { + // merge is performed only for alerts of exactly same type + const Handle(Standard_Type)& aType = theAlert->DynamicType(); + for (Message_ListOfAlert::Iterator anIt(aList); anIt.More(); anIt.Next()) + { + // if merged successfully, just return + if (aType == anIt.Value()->DynamicType() && theAlert->Merge (anIt.Value())) + return Standard_False; + } + } + + // if not merged, just add to the list + aList.Append (theAlert); + return Standard_True; +} + +//======================================================================= +//function : RemoveAlert +//purpose : +//======================================================================= +Standard_Boolean Message_CompositeAlerts::RemoveAlert (Message_Gravity theGravity, + const Handle(Message_Alert)& theAlert) +{ + Standard_ASSERT_RETURN (! theAlert.IsNull(), "Attempt to add null alert", Standard_False); + Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), + "Adding alert with gravity not in valid range", Standard_False); + + Message_ListOfAlert& anAlerts = myAlerts[theGravity]; + if (!anAlerts.Contains (theAlert)) + { + return Standard_False; + } + + return anAlerts.Remove (theAlert); +} + +//======================================================================= +//function : HasAlerts +//purpose : +//======================================================================= +Standard_Boolean Message_CompositeAlerts::HasAlert (const Handle(Message_Alert)& theAlert) +{ + for (int aGravIter = Message_Trace; aGravIter <= Message_Fail; ++aGravIter) + { + const Message_ListOfAlert& anAlerts = Alerts ((Message_Gravity)aGravIter); + if (anAlerts.Contains (theAlert)) + { + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : HasAlerts +//purpose : +//======================================================================= +Standard_Boolean Message_CompositeAlerts::HasAlert (const Handle(Standard_Type)& theType, Message_Gravity theGravity) +{ + Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), + "Requesting alerts for gravity not in valid range", Standard_False); + + for (Message_ListOfAlert::Iterator anIt (myAlerts[theGravity]); anIt.More(); anIt.Next()) + { + if (anIt.Value()->IsInstance(theType)) + { + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +//function : Clear +//purpose : +//======================================================================= +void Message_CompositeAlerts::Clear() +{ + for (unsigned int i = 0; i < sizeof(myAlerts)/sizeof(myAlerts[0]); ++i) + { + myAlerts[i].Clear(); + } +} + +//======================================================================= +//function : Clear +//purpose : +//======================================================================= +void Message_CompositeAlerts::Clear (Message_Gravity theGravity) +{ + Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), + "Requesting alerts for gravity not in valid range", ); + myAlerts[theGravity].Clear(); +} + +//======================================================================= +//function : Clear +//purpose : +//======================================================================= +void Message_CompositeAlerts::Clear (const Handle(Standard_Type)& theType) +{ + for (unsigned int i = 0; i < sizeof(myAlerts)/sizeof(myAlerts[0]); ++i) + { + for (Message_ListOfAlert::Iterator anIt (myAlerts[i]); anIt.More(); ) + { + if (anIt.Value().IsNull() || anIt.Value()->IsInstance (theType)) + { + myAlerts[i].Remove (anIt); + } + else + { + anIt.More(); + } + } + } +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_CompositeAlerts::DumpJson (Standard_OStream& theOStream, + Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + for (unsigned int i = 0; i < sizeof(myAlerts)/sizeof(myAlerts[0]); ++i) + { + Message_Gravity aGravity = (Message_Gravity)i; + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aGravity) + + for (Message_ListOfAlert::Iterator anIt (myAlerts[i]); anIt.More(); anIt.Next()) + { + const Handle(Message_Alert)& anAlert = anIt.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, anAlert.get()) + } + } +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_CompositeAlerts.hxx opencascade-7.5.1+dfsg1/src/Message/Message_CompositeAlerts.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_CompositeAlerts.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_CompositeAlerts.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,81 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_CompositeAlerts_HeaderFile +#define _Message_CompositeAlerts_HeaderFile + +#include +#include +#include +#include + +//! Class providing container of alerts +class Message_CompositeAlerts : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(Message_CompositeAlerts, Standard_Transient) +public: + //! Empty constructor + Message_CompositeAlerts() {} + + //! Returns list of collected alerts with specified gravity + Standard_EXPORT const Message_ListOfAlert& Alerts (const Message_Gravity theGravity) const; + + //! Add alert with specified gravity. If the alert supports merge it will be merged. + //! @param theGravity an alert gravity + //! @param theAlert an alert to be added as a child alert + //! @return true if the alert is added or merged + Standard_EXPORT Standard_Boolean AddAlert (Message_Gravity theGravity, + const Handle(Message_Alert)& theAlert); + + //! Removes alert with specified gravity. + //! @param theGravity an alert gravity + //! @param theAlert an alert to be removed from the children + //! @return true if the alert is removed + Standard_EXPORT Standard_Boolean RemoveAlert (Message_Gravity theGravity, + const Handle(Message_Alert)& theAlert); + + //! Returns true if the alert belong the list of the child alerts. + //! @param theAlert an alert to be checked as a child alert + //! @return true if the alert is found in a container of children + Standard_EXPORT Standard_Boolean HasAlert (const Handle(Message_Alert)& theAlert); + + //! Returns true if specific type of alert is recorded with specified gravity + //! @param theType an alert type + //! @param theGravity an alert gravity + //! @return true if the alert is found in a container of children + Standard_EXPORT Standard_Boolean HasAlert (const Handle(Standard_Type)& theType, + Message_Gravity theGravity); + + //! Clears all collected alerts + Standard_EXPORT void Clear(); + + //! Clears collected alerts with specified gravity + //! @param theGravity an alert gravity + Standard_EXPORT void Clear (Message_Gravity theGravity); + + //! Clears collected alerts with specified type + //! @param theType an alert type + Standard_EXPORT void Clear (const Handle(Standard_Type)& theType); + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + +protected: + // store messages in a lists sorted by gravity; + // here we rely on knowledge that Message_Fail is the last element of the enum + Message_ListOfAlert myAlerts[Message_Fail + 1]; //!< container of child alert for each type of gravity +}; + +DEFINE_STANDARD_HANDLE(Message_CompositeAlerts, Standard_Transient) + +#endif // _Message_CompositeAlerts_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ConsoleColor.hxx opencascade-7.5.1+dfsg1/src/Message/Message_ConsoleColor.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ConsoleColor.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ConsoleColor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,31 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_ConsoleColor_HeaderFile +#define _Message_ConsoleColor_HeaderFile + +//! Color definition for console/terminal output (limited palette). +enum Message_ConsoleColor +{ + Message_ConsoleColor_Default, //!< default (white) color + Message_ConsoleColor_Black, //!< black color + Message_ConsoleColor_White, //!< white color + Message_ConsoleColor_Red, //!< red color + Message_ConsoleColor_Blue, //!< blue color + Message_ConsoleColor_Green, //!< green color + Message_ConsoleColor_Yellow, //!< yellow color + Message_ConsoleColor_Cyan, //!< cyan color + Message_ConsoleColor_Magenta, //!< magenta color +}; + +#endif // _Message_ConsoleColor_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message.cxx opencascade-7.5.1+dfsg1/src/Message/Message.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,10 +17,21 @@ #include #include +#include #include #include #include + +namespace +{ + static Standard_CString Message_Table_PrintMetricTypeEnum[10] = + { + "NONE", "UserTimeCPU", "SystemTimeInfo", "MemPrivate", "MemVirtual", + "MemWorkingSet", "MemWorkingSetPeak", "MemSwapUsage", "MemSwapUsagePeak", "MemHeapUsage" + }; +} + //======================================================================= //function : DefaultMessenger //purpose : @@ -49,3 +60,86 @@ Sprintf (t, "%.2fs", second); return TCollection_AsciiString (t); } + +//======================================================================= +//function : DefaultReport +//purpose : +//======================================================================= +const Handle(Message_Report)& Message::DefaultReport(const Standard_Boolean theToCreate) +{ + static Handle(Message_Report) MyReport; + if (MyReport.IsNull() && theToCreate) + { + MyReport = new Message_Report(); + } + return MyReport; +} + +//======================================================================= +//function : MetricToString +//purpose : +//======================================================================= +Standard_CString Message::MetricToString (const Message_MetricType theType) +{ + return Message_Table_PrintMetricTypeEnum[theType]; +} + +//======================================================================= +//function : MetricFromString +//purpose : +//======================================================================= +Standard_Boolean Message::MetricFromString (const Standard_CString theString, + Message_MetricType& theGravity) +{ + TCollection_AsciiString aName (theString); + for (Standard_Integer aMetricIter = 0; aMetricIter <= Message_MetricType_MemHeapUsage; ++aMetricIter) + { + Standard_CString aMetricName = Message_Table_PrintMetricTypeEnum[aMetricIter]; + if (aName == aMetricName) + { + theGravity = Message_MetricType (aMetricIter); + return Standard_True; + } + } + return Standard_False; +} + +// ======================================================================= +// function : ToOSDMetric +// purpose : +// ======================================================================= +Standard_Boolean Message::ToOSDMetric (const Message_MetricType theMetric, OSD_MemInfo::Counter& theMemInfo) +{ + switch (theMetric) + { + case Message_MetricType_MemPrivate: theMemInfo = OSD_MemInfo::MemPrivate; break; + case Message_MetricType_MemVirtual: theMemInfo = OSD_MemInfo::MemVirtual; break; + case Message_MetricType_MemWorkingSet: theMemInfo = OSD_MemInfo::MemWorkingSet; break; + case Message_MetricType_MemWorkingSetPeak: theMemInfo = OSD_MemInfo::MemWorkingSetPeak; break; + case Message_MetricType_MemSwapUsage: theMemInfo = OSD_MemInfo::MemSwapUsage; break; + case Message_MetricType_MemSwapUsagePeak: theMemInfo = OSD_MemInfo::MemSwapUsagePeak; break; + case Message_MetricType_MemHeapUsage: theMemInfo = OSD_MemInfo::MemHeapUsage; break; + default: return Standard_False; + } + return Standard_True; +} + +// ======================================================================= +// function : ToMessageMetric +// purpose : +// ======================================================================= +Standard_Boolean Message::ToMessageMetric (const OSD_MemInfo::Counter theMemInfo, Message_MetricType& theMetric) +{ + switch (theMemInfo) + { + case OSD_MemInfo::MemPrivate: theMetric = Message_MetricType_MemPrivate; break; + case OSD_MemInfo::MemVirtual: theMetric = Message_MetricType_MemVirtual; break; + case OSD_MemInfo::MemWorkingSet: theMetric = Message_MetricType_MemWorkingSet; break; + case OSD_MemInfo::MemWorkingSetPeak: theMetric = Message_MetricType_MemWorkingSetPeak; break; + case OSD_MemInfo::MemSwapUsage: theMetric = Message_MetricType_MemSwapUsage; break; + case OSD_MemInfo::MemSwapUsagePeak: theMetric = Message_MetricType_MemSwapUsagePeak; break; + case OSD_MemInfo::MemHeapUsage: theMetric = Message_MetricType_MemHeapUsage; break; + default: return Standard_False; + } + return Standard_True; +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message.hxx opencascade-7.5.1+dfsg1/src/Message/Message.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,41 +17,66 @@ #ifndef _Message_HeaderFile #define _Message_HeaderFile -#include -#include -#include - -#include -#include -class Message_Messenger; -class TCollection_AsciiString; -class Message_Msg; -class Message_MsgFile; -class Message_Messenger; -class Message_Algorithm; -class Message_Printer; -class Message_PrinterOStream; -class Message_ProgressIndicator; -class Message_ProgressScale; -class Message_ProgressSentry; +#include +#include +#include +#include +#include +#include + +class Message_Report; //! Defines //! - tools to work with messages //! - basic tools intended for progress indication -class Message +class Message { public: DEFINE_STANDARD_ALLOC - //! Defines default messenger for OCCT applications. //! This is global static instance of the messenger. //! By default, it contains single printer directed to std::cout. //! It can be customized according to the application needs. + //! + //! The following syntax can be used to print messages: + //! @begincode + //! Message::DefaultMessenger()->Send ("My Warning", Message_Warning); + //! Message::SendWarning ("My Warning"); // short-cut for Message_Warning + //! Message::SendWarning() << "My Warning with " << theCounter << " arguments"; + //! Message::SendFail ("My Failure"); // short-cut for Message_Fail + //! @endcode Standard_EXPORT static const Handle(Message_Messenger)& DefaultMessenger(); - + +public: + //!@name Short-cuts to DefaultMessenger + + static Message_Messenger::StreamBuffer Send(Message_Gravity theGravity) + { + return DefaultMessenger()->Send (theGravity); + } + + static void Send(const TCollection_AsciiString& theMessage, Message_Gravity theGravity) + { + DefaultMessenger()->Send (theMessage, theGravity); + } + + static Message_Messenger::StreamBuffer SendFail() { return DefaultMessenger()->SendFail (); } + static Message_Messenger::StreamBuffer SendAlarm() { return DefaultMessenger()->SendAlarm (); } + static Message_Messenger::StreamBuffer SendWarning() { return DefaultMessenger()->SendWarning (); } + static Message_Messenger::StreamBuffer SendInfo() { return DefaultMessenger()->SendInfo (); } + static Message_Messenger::StreamBuffer SendTrace() { return DefaultMessenger()->SendTrace (); } + + static void SendFail (const TCollection_AsciiString& theMessage) { return DefaultMessenger()->SendFail (theMessage); } + static void SendAlarm (const TCollection_AsciiString& theMessage) { return DefaultMessenger()->SendAlarm (theMessage); } + static void SendWarning (const TCollection_AsciiString& theMessage) { return DefaultMessenger()->SendWarning (theMessage); } + static void SendInfo (const TCollection_AsciiString& theMessage) { return DefaultMessenger()->SendInfo (theMessage); } + static void SendTrace (const TCollection_AsciiString& theMessage) { return DefaultMessenger()->SendTrace (theMessage); } + +public: + //! Returns the string filled with values of hours, minutes and seconds. //! Example: //! 1. (5, 12, 26.3345) returns "05h:12m:26.33s", @@ -59,36 +84,45 @@ //! 3. (0, 0, 4.5 ) returns "4.50s" Standard_EXPORT static TCollection_AsciiString FillTime (const Standard_Integer Hour, const Standard_Integer Minute, const Standard_Real Second); - - - -protected: - - - - - -private: - - - - -friend class Message_Msg; -friend class Message_MsgFile; -friend class Message_Messenger; -friend class Message_Algorithm; -friend class Message_Printer; -friend class Message_PrinterOStream; -friend class Message_ProgressIndicator; -friend class Message_ProgressScale; -friend class Message_ProgressSentry; +public: + //! returns the only one instance of Report + //! When theToCreate is true - automatically creates message report when not exist. + Standard_EXPORT static const Handle(Message_Report)& DefaultReport (const Standard_Boolean theToCreate = Standard_False); + + //! Determines the metric from the given string identifier. + //! @param theString string identifier + //! @param theType detected type of metric + //! @return TRUE if string identifier is known + Standard_EXPORT static Standard_Boolean MetricFromString (const Standard_CString theString, + Message_MetricType& theType); + + //! Returns the string name for a given metric type. + //! @param theType metric type + //! @return string identifier from the list of Message_MetricType + Standard_EXPORT static Standard_CString MetricToString (const Message_MetricType theType); + + //! Returns the metric type from the given string identifier. + //! @param theString string identifier + //! @return metric type or Message_MetricType_None if string identifier is invalid + static Message_MetricType MetricFromString (const Standard_CString theString) + { + Message_MetricType aMetric = Message_MetricType_None; + MetricFromString (theString, aMetric); + return aMetric; + } + + //! Converts message metric to OSD memory info type. + //! @param theMetric [in] message metric + //! @param theMemInfo [out] filled memory info type + //! @return true if converted + static Standard_EXPORT Standard_Boolean ToOSDMetric (const Message_MetricType theMetric, OSD_MemInfo::Counter& theMemInfo); + + //! Converts OSD memory info type to message metric. + //! @param theMemInfo [int] memory info type + //! @param theMetric [out] filled message metric + //! @return true if converted + static Standard_EXPORT Standard_Boolean ToMessageMetric (const OSD_MemInfo::Counter theMemInfo, Message_MetricType& theMetric); }; - - - - - - #endif // _Message_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Level.cxx opencascade-7.5.1+dfsg1/src/Message/Message_Level.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Level.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Level.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,110 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +Message_Level::Message_Level (const TCollection_AsciiString& theName) +{ + const Handle(Message_Report)& aDefaultReport = Message::DefaultReport(); + if (!aDefaultReport.IsNull() && aDefaultReport->IsActiveInMessenger()) + { + aDefaultReport->AddLevel (this, theName); + } +} + +//======================================================================= +//function : Destructor +//purpose : +//======================================================================= +Message_Level::~Message_Level() +{ + remove(); +} + +//======================================================================= +//function : SetRootAlert +//purpose : +//======================================================================= +void Message_Level::SetRootAlert (const Handle(Message_AlertExtended)& theAlert, + const Standard_Boolean isRequiredToStart) +{ + myRootAlert = theAlert; + if (isRequiredToStart) + { + Message_AttributeMeter::StartAlert (myRootAlert); + } +} + +//======================================================================= +//function : AddAlert +//purpose : +//======================================================================= +Standard_Boolean Message_Level::AddAlert (const Message_Gravity theGravity, + const Handle(Message_Alert)& theAlert) +{ + Handle(Message_AlertExtended) anAlertExtended = Handle(Message_AlertExtended)::DownCast (theAlert); + if (anAlertExtended.IsNull()) + { + return Standard_False; + } + + // looking for the parent of the parameter alert to release the previous alert + Handle(Message_AlertExtended) aRootAlert = myRootAlert; + Handle(Message_CompositeAlerts) aCompositeAlert = aRootAlert->CompositeAlerts (Standard_True); + + // update metrics of the previous alert + Message_AttributeMeter::StopAlert (myLastAlert); + + myLastAlert = anAlertExtended; + // set start metrics of the new alert + Message_AttributeMeter::StartAlert (myLastAlert); + + // add child alert + aCompositeAlert->AddAlert (theGravity, theAlert); + + return Standard_True; +} + +//======================================================================= +//function : remove +//purpose : +//======================================================================= +void Message_Level::remove() +{ + const Handle(Message_Report)& aDefaultReport = Message::DefaultReport(); + if (aDefaultReport.IsNull() || !aDefaultReport->IsActiveInMessenger()) + { + return; + } + + Message_AttributeMeter::StopAlert (myLastAlert); + + if (!Message::DefaultReport().IsNull()) + { + Message::DefaultReport()->RemoveLevel (this); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Level.hxx opencascade-7.5.1+dfsg1/src/Message/Message_Level.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Level.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Level.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,80 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_Level_HeaderFile +#define _Message_Level_HeaderFile + +#include +#include +#include +#include +#include + +#include +#include + +//! This class is an instance of Sentry to create a level in a message report +//! Constructor of the class add new (active) level in the report, destructor removes it +//! While the level is active in the report, new alerts are added below the level root alert. +//! +//! The first added alert is a root alert, other are added below the root alert +//! +//! If alert has Message_AttributeMeter attribute, active metrics of the default report are stored in +//! the attribute: start value of metric on adding alert, stop on adding another alert or closing (delete) the level +//! in the report. +//! +//! Processing of this class is implemented in Message_Report, it is used only inside it. +//! Levels using should be only through using OCCT_ADD_MESSAGE_LEVEL_SENTRY only. No other code is required outside. +class Message_Level +{ +public: + //! Constructor. + //! One string key is used for all alert meters. + //! The perf meter is not started automatically, it will be done in AddAlert() method + Standard_EXPORT Message_Level (const TCollection_AsciiString& theName = TCollection_AsciiString()); + + //! Assures stopping upon destruction + Standard_EXPORT ~Message_Level(); + + //! Returns root alert of the level + //! @return alert instance or NULL + const Handle(Message_AlertExtended)& RootAlert() const { return myRootAlert; } + + //! Sets the root alert. Starts collects alert metrics if active. + //! @param theAlert an alert + Standard_EXPORT void SetRootAlert (const Handle(Message_AlertExtended)& theAlert, + const Standard_Boolean isRequiredToStart); + + //! Adds new alert on the level. Stops the last alert metric, appends the alert and starts the alert metrics collecting. + //! Sets root alert beforehand this method using, if the root is NULL, it does nothing. + //! @param theGravity an alert gravity + //! @param theAlert an alert + //! @return true if alert is added + Standard_EXPORT Standard_Boolean AddAlert (const Message_Gravity theGravity, + const Handle(Message_Alert)& theAlert); + +private: + //! Remove the current level from the report. It stops metric collecting for the last and the root alerts. + Standard_EXPORT void remove(); + +private: + Handle(Message_AlertExtended) myRootAlert; //!< root alert + Handle(Message_AlertExtended) myLastAlert; //!< last added alert on the root alert +}; + +//! @def MESSAGE_NEW_LEVEL +//! Creates a new level instance of Sentry. This row should be inserted before messages using in the method. +#define OCCT_ADD_MESSAGE_LEVEL_SENTRY(theMessage) \ + Message_Level aLevel(theMessage); + +#endif // _Message_Level_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Messenger.cxx opencascade-7.5.1+dfsg1/src/Message/Message_Messenger.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Messenger.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Messenger.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(Message_Messenger,Standard_Transient) @@ -111,34 +112,48 @@ //======================================================================= void Message_Messenger::Send (const Standard_CString theString, - const Message_Gravity theGravity, - const Standard_Boolean putEndl) const + const Message_Gravity theGravity) const { for (Message_SequenceOfPrinters::Iterator aPrinterIter (myPrinters); aPrinterIter.More(); aPrinterIter.Next()) { const Handle(Message_Printer)& aPrinter = aPrinterIter.Value(); if (!aPrinter.IsNull()) { - aPrinter->Send (theString, theGravity, putEndl); + aPrinter->Send (theString, theGravity); } } } //======================================================================= //function : Send -//purpose : +//purpose : //======================================================================= +void Message_Messenger::Send (const Standard_SStream& theStream, + const Message_Gravity theGravity) const +{ + for (Message_SequenceOfPrinters::Iterator aPrinterIter (myPrinters); aPrinterIter.More(); aPrinterIter.Next()) + { + const Handle(Message_Printer)& aPrinter = aPrinterIter.Value(); + if (!aPrinter.IsNull()) + { + aPrinter->SendStringStream (theStream, theGravity); + } + } +} +//======================================================================= +//function : Send +//purpose : +//======================================================================= void Message_Messenger::Send (const TCollection_AsciiString& theString, - const Message_Gravity theGravity, - const Standard_Boolean putEndl) const + const Message_Gravity theGravity) const { for (Message_SequenceOfPrinters::Iterator aPrinterIter (myPrinters); aPrinterIter.More(); aPrinterIter.Next()) { const Handle(Message_Printer)& aPrinter = aPrinterIter.Value(); if (!aPrinter.IsNull()) { - aPrinter->Send (theString, theGravity, putEndl); + aPrinter->Send (theString, theGravity); } } } @@ -149,15 +164,42 @@ //======================================================================= void Message_Messenger::Send (const TCollection_ExtendedString& theString, - const Message_Gravity theGravity, - const Standard_Boolean putEndl) const + const Message_Gravity theGravity) const +{ + for (Message_SequenceOfPrinters::Iterator aPrinterIter (myPrinters); aPrinterIter.More(); aPrinterIter.Next()) + { + const Handle(Message_Printer)& aPrinter = aPrinterIter.Value(); + if (!aPrinter.IsNull()) + { + aPrinter->Send (theString, theGravity); + } + } +} + +//======================================================================= +//function : Send +//purpose : +//======================================================================= +void Message_Messenger::Send (const Handle(Standard_Transient)& theObject, + const Message_Gravity theGravity) const { for (Message_SequenceOfPrinters::Iterator aPrinterIter (myPrinters); aPrinterIter.More(); aPrinterIter.Next()) { const Handle(Message_Printer)& aPrinter = aPrinterIter.Value(); if (!aPrinter.IsNull()) { - aPrinter->Send (theString, theGravity, putEndl); + aPrinter->SendObject (theObject, theGravity); } } } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_Messenger::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPrinters.Size()) +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Messenger.hxx opencascade-7.5.1+dfsg1/src/Message/Message_Messenger.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Messenger.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Messenger.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,11 +18,7 @@ #include #include -#include -#include -#include -#include -#include + #include #include @@ -44,14 +40,105 @@ //! customized by the application, and dispatches every received //! message to all the printers. //! -//! For convenience, a number of operators << are defined with left -//! argument being Handle(Message_Messenger); thus it can be used -//! with syntax similar to C++ streams. -//! Note that all these operators use trace level Warning. +//! For convenience, a set of methods Send...() returning a string +//! stream buffer is defined for use of stream-like syntax with operator << +//! +//! Example: +//! ~~~~~ +//! Messenger->SendFail() << " Unknown fail at line " << aLineNo << " in file " << aFile; +//! ~~~~~ +//! +//! The message is sent to messenger on destruction of the stream buffer, +//! call to Flush(), or passing manipulator std::ends, std::endl, or std::flush. +//! Empty messages are not sent except if manipulator is used. class Message_Messenger : public Standard_Transient { DEFINE_STANDARD_RTTIEXT(Message_Messenger, Standard_Transient) public: + //! Auxiliary class wrapping std::stringstream thus allowing constructing + //! message via stream interface, and putting result into its creator + //! Message_Messenger within destructor. + //! + //! It is intended to be used either as temporary object or as local + //! variable, note that content will be lost if it is copied. + class StreamBuffer + { + public: + + //! Destructor flushing constructed message. + ~StreamBuffer() { Flush(); } + + //! Flush collected string to messenger + void Flush(Standard_Boolean doForce = Standard_False) + { + myStream.flush(); + if (doForce || myStream.rdbuf()->in_avail() > 0) + { + if (myMessenger) + { + myMessenger->Send(myStream, myGravity); + } + myStream.str(std::string()); // empty the buffer for possible reuse + } + } + + //! Formal copy constructor. + //! + //! Since buffer is intended for use as temporary object or local + //! variable, copy (or move) is needed only formally to be able to + //! return the new instance from relevant creation method. + //! In practice it should never be called because modern compilers + //! create such instances in place. + //! However note that if this constructor is called, the buffer + //! content (string) will not be copied (move is not supported for + //! std::stringstream class on old compilers such as gcc 4.4, msvc 9). + StreamBuffer (const StreamBuffer& theOther) + : myMessenger(theOther.myMessenger), myGravity(theOther.myGravity) + { + } + + //! Wrapper for operator << of the stream + template + StreamBuffer& operator << (const T& theArg) + { + myStream << theArg; + return *this; + } + + //! Operator << for manipulators of ostream (ends, endl, flush), + //! flushes the buffer (sends the message) + StreamBuffer& operator << (std::ostream& (*)(std::ostream&)) + { + Flush(Standard_True); + return *this; + } + + //! Access to the stream object + Standard_SStream& Stream () { return myStream; } + + //! Cast to OStream& + operator Standard_OStream& () { return myStream; } + + //! Access to the messenger + Message_Messenger* Messenger () { return myMessenger; } + + private: + friend class Message_Messenger; + + //! Main constructor creating temporary buffer. + //! Accessible only to Messenger class. + StreamBuffer (Message_Messenger* theMessenger, Message_Gravity theGravity) + : myMessenger (theMessenger), + myGravity (theGravity) + {} + + private: + Message_Messenger* myMessenger; // don't make a Handle since this object should be created on stack + Message_Gravity myGravity; + Standard_SStream myStream; + }; + +public: //! Empty constructor; initializes by single printer directed to std::cout. //! Note: the default messenger is not empty but directed to cout @@ -87,16 +174,59 @@ //! Dispatch a message to all the printers in the list. //! Three versions of string representations are accepted for //! convenience, by default all are converted to ExtendedString. - //! The parameter putEndl specifies whether the new line should - //! be started after this message (default) or not (may have - //! sense in some conditions). - Standard_EXPORT void Send (const Standard_CString theString, const Message_Gravity theGravity = Message_Warning, const Standard_Boolean putEndl = Standard_True) const; + Standard_EXPORT void Send (const Standard_CString theString, + const Message_Gravity theGravity = Message_Warning) const; //! See above - Standard_EXPORT void Send (const TCollection_AsciiString& theString, const Message_Gravity theGravity = Message_Warning, const Standard_Boolean putEndl = Standard_True) const; + Standard_EXPORT void Send (const Standard_SStream& theStream, + const Message_Gravity theGravity = Message_Warning) const; + + //! See above + Standard_EXPORT void Send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity = Message_Warning) const; //! See above - Standard_EXPORT void Send (const TCollection_ExtendedString& theString, const Message_Gravity theGravity = Message_Warning, const Standard_Boolean putEndl = Standard_True) const; + Standard_EXPORT void Send (const TCollection_ExtendedString& theString, + const Message_Gravity theGravity = Message_Warning) const; + + //! Create string buffer for message of specified type + StreamBuffer Send (Message_Gravity theGravity) { return StreamBuffer (this, theGravity); } + + //! See above + Standard_EXPORT void Send (const Handle(Standard_Transient)& theObject, const Message_Gravity theGravity = Message_Warning) const; + + //! Create string buffer for sending Fail message + StreamBuffer SendFail () { return Send (Message_Fail); } + + //! Create string buffer for sending Alarm message + StreamBuffer SendAlarm () { return Send (Message_Alarm); } + + //! Create string buffer for sending Warning message + StreamBuffer SendWarning () { return Send (Message_Warning); } + + //! Create string buffer for sending Info message + StreamBuffer SendInfo () { return Send (Message_Info); } + + //! Create string buffer for sending Trace message + StreamBuffer SendTrace () { return Send (Message_Trace); } + + //! Short-cut to Send (theMessage, Message_Fail) + void SendFail (const TCollection_AsciiString& theMessage) { Send (theMessage, Message_Fail); } + + //! Short-cut to Send (theMessage, Message_Alarm) + void SendAlarm (const TCollection_AsciiString& theMessage) { Send (theMessage, Message_Alarm); } + + //! Short-cut to Send (theMessage, Message_Warning) + void SendWarning (const TCollection_AsciiString& theMessage) { Send (theMessage, Message_Warning); } + + //! Short-cut to Send (theMessage, Message_Info) + void SendInfo (const TCollection_AsciiString& theMessage) { Send (theMessage, Message_Info); } + + //! Short-cut to Send (theMessage, Message_Trace) + void SendTrace (const TCollection_AsciiString& theMessage) { Send (theMessage, Message_Trace); } + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; private: @@ -104,85 +234,4 @@ }; -// CString -inline const Handle(Message_Messenger)& operator<< (const Handle(Message_Messenger)& theMessenger, - const Standard_CString theStr) -{ - theMessenger->Send (theStr, Message_Info, Standard_False); - return theMessenger; -} - -// AsciiString -inline const Handle(Message_Messenger)& operator<< (const Handle(Message_Messenger)& theMessenger, - const TCollection_AsciiString& theStr) -{ - theMessenger->Send (theStr, Message_Info, Standard_False); - return theMessenger; -} - -// HAsciiString -inline const Handle(Message_Messenger)& operator<< (const Handle(Message_Messenger)& theMessenger, - const Handle(TCollection_HAsciiString)& theStr) -{ - theMessenger->Send (theStr->String(), Message_Info, Standard_False); - return theMessenger; -} - -// ExtendedString -inline const Handle(Message_Messenger)& operator<< (const Handle(Message_Messenger)& theMessenger, - const TCollection_ExtendedString& theStr) -{ - theMessenger->Send (theStr, Message_Info, Standard_False); - return theMessenger; -} - -// HExtendedString -inline const Handle(Message_Messenger)& operator<< (const Handle(Message_Messenger)& theMessenger, - const Handle(TCollection_HExtendedString)& theStr) -{ - theMessenger->Send (theStr->String(), Message_Info, Standard_False); - return theMessenger; -} - -// Integer -inline const Handle(Message_Messenger)& operator<< (const Handle(Message_Messenger)& theMessenger, - const Standard_Integer theVal) -{ - TCollection_AsciiString aStr (theVal); - theMessenger->Send (aStr, Message_Info, Standard_False); - return theMessenger; -} - -// Real -inline const Handle(Message_Messenger)& operator<< (const Handle(Message_Messenger)& theMessenger, - const Standard_Real theVal) -{ - TCollection_AsciiString aStr (theVal); - theMessenger->Send (aStr, Message_Info, Standard_False); - return theMessenger; -} - -// Stream -inline const Handle(Message_Messenger)& operator<< (const Handle(Message_Messenger)& theMessenger, - const Standard_SStream& theStream) -{ - theMessenger->Send (theStream.str().c_str(), Message_Info, Standard_False); - return theMessenger; -} - -// manipulators -inline const Handle(Message_Messenger)& - operator << (const Handle(Message_Messenger)& theMessenger, - const Handle(Message_Messenger)& (*pman) (const Handle(Message_Messenger)&)) -{ - return pman (theMessenger); -} - -// Message_EndLine -inline const Handle(Message_Messenger)& Message_EndLine (const Handle(Message_Messenger)& theMessenger) -{ - theMessenger->Send ("", Message_Info, Standard_True); - return theMessenger; -} - #endif // _Message_Messenger_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_MetricType.hxx opencascade-7.5.1+dfsg1/src/Message/Message_MetricType.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_MetricType.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_MetricType.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,34 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_MetricType_HeaderFile +#define _Message_MetricType_HeaderFile + +//! Specifies kind of report information to collect +enum Message_MetricType +{ + Message_MetricType_None, //!< no computation + Message_MetricType_ThreadCPUUserTime, //!< OSD_Chronometer::GetThreadCPU user time + Message_MetricType_ThreadCPUSystemTime, //!< OSD_Chronometer::GetThreadCPU system time + Message_MetricType_ProcessCPUUserTime, //!< OSD_Chronometer::GetProcessCPU user time + Message_MetricType_ProcessCPUSystemTime, //!< OSD_Chronometer::GetProcessCPU system time + Message_MetricType_MemPrivate, //!< OSD_MemInfo::MemPrivate + Message_MetricType_MemVirtual, //!< OSD_MemInfo::MemVirtual + Message_MetricType_MemWorkingSet, //!< OSD_MemInfo::MemWorkingSet + Message_MetricType_MemWorkingSetPeak, //!< OSD_MemInfo::MemWorkingSetPeak + Message_MetricType_MemSwapUsage, //!< OSD_MemInfo::MemSwapUsage + Message_MetricType_MemSwapUsagePeak, //!< OSD_MemInfo::MemSwapUsagePeak + Message_MetricType_MemHeapUsage //!< OSD_MemInfo::MemHeapUsage +}; + +#endif // _Message_MetricType_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_MsgFile.cxx opencascade-7.5.1+dfsg1/src/Message/Message_MsgFile.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_MsgFile.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_MsgFile.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -82,13 +82,17 @@ //Called : from loadFile() //======================================================================= -template static inline Standard_Boolean -getString (_Char *& thePtr, +template struct TCollection_String; +template <> struct TCollection_String { typedef TCollection_AsciiString type; }; +template <> struct TCollection_String { typedef TCollection_ExtendedString type; }; + +template static inline Standard_Boolean +getString (CharType *& thePtr, TCollection_ExtendedString& theString, Standard_Integer& theLeftSpaces) { - _Char * anEndPtr = thePtr; - _Char * aPtr; + CharType * anEndPtr = thePtr; + CharType * aPtr; Standard_Integer aLeftSpaces; do @@ -98,7 +102,7 @@ aLeftSpaces = 0; for (;;) { - _Char aChar = * aPtr; + CharType aChar = * aPtr; if (aChar == ' ') aLeftSpaces++; else if (aChar == '\t') aLeftSpaces += 8; else if (aChar == '\r' || * aPtr == '\n') aLeftSpaces = 0; @@ -121,7 +125,7 @@ thePtr = anEndPtr; if (*thePtr) *thePtr++ = '\0'; - theString = TCollection_ExtendedString (aPtr); + theString = typename TCollection_String::type (aPtr); theLeftSpaces = aLeftSpaces; return Standard_True; } @@ -257,7 +261,7 @@ { // Reverse the bytes throughout the buffer const Standard_ExtCharacter* const anEnd = - reinterpret_cast(&anMsgBuffer[aFileSize]); + reinterpret_cast(&anMsgBuffer[aFileSize]); for (Standard_ExtCharacter* aPtr = aUnicodeBuffer; aPtr < anEnd; aPtr++) { diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Printer.cxx opencascade-7.5.1+dfsg1/src/Message/Message_Printer.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Printer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Printer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,6 +15,7 @@ #include +#include #include #include @@ -33,14 +34,12 @@ //function : Send //purpose : //======================================================================= - void Message_Printer::Send (const Standard_CString theString, - const Message_Gravity theGravity, - const Standard_Boolean theToOutEol) const + const Message_Gravity theGravity) const { if (theGravity >= myTraceLevel) { - Send (TCollection_ExtendedString (theString, Standard_True), theGravity, theToOutEol); + send (TCollection_AsciiString (theString), theGravity); } } @@ -48,13 +47,52 @@ //function : Send //purpose : //======================================================================= +void Message_Printer::Send (const TCollection_ExtendedString& theString, + const Message_Gravity theGravity) const +{ + if (theGravity >= myTraceLevel) + { + send (TCollection_AsciiString (theString), theGravity); + } +} +//======================================================================= +//function : Send +//purpose : +//======================================================================= void Message_Printer::Send (const TCollection_AsciiString& theString, - const Message_Gravity theGravity, - const Standard_Boolean theToOutEol) const + const Message_Gravity theGravity) const { if (theGravity >= myTraceLevel) { - Send (TCollection_ExtendedString (theString), theGravity, theToOutEol); + send (theString, theGravity); + } +} + +//======================================================================= +//function : SendStringStream +//purpose : +//======================================================================= +void Message_Printer::SendStringStream (const Standard_SStream& theStream, + const Message_Gravity theGravity) const +{ + if (theGravity >= myTraceLevel) + { + send (theStream.str().c_str(), theGravity); + } +} + +//======================================================================= +//function : SendObject +//purpose : +//======================================================================= +void Message_Printer::SendObject (const Handle(Standard_Transient)& theObject, + const Message_Gravity theGravity) const +{ + if (!theObject.IsNull() + && theGravity >= myTraceLevel) + { + send (TCollection_AsciiString (theObject->DynamicType()->Name()) + + ": " + Standard_Dump::GetPointerInfo (theObject), theGravity); } } diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Printer.hxx opencascade-7.5.1+dfsg1/src/Message/Message_Printer.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Printer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Printer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,8 @@ #include #include #include +#include + class TCollection_ExtendedString; class TCollection_AsciiString; @@ -48,25 +50,43 @@ void SetTraceLevel (const Message_Gravity theTraceLevel) { myTraceLevel = theTraceLevel; } //! Send a string message with specified trace level. - //! The parameter theToPutEol specified whether end-of-line should be added to the end of the message. - //! This method must be redefined in descentant. - Standard_EXPORT virtual void Send (const TCollection_ExtendedString& theString, const Message_Gravity theGravity, const Standard_Boolean theToPutEol) const = 0; + //! The last Boolean argument is deprecated and unused. + //! Default implementation redirects to send(). + Standard_EXPORT virtual void Send (const TCollection_ExtendedString& theString, + const Message_Gravity theGravity) const; //! Send a string message with specified trace level. - //! The parameter theToPutEol specified whether end-of-line should be added to the end of the message. - //! Default implementation calls first method Send(). - Standard_EXPORT virtual void Send (const Standard_CString theString, const Message_Gravity theGravity, const Standard_Boolean theToPutEol) const; + //! The last Boolean argument is deprecated and unused. + //! Default implementation redirects to send(). + Standard_EXPORT virtual void Send (const Standard_CString theString, + const Message_Gravity theGravity) const; //! Send a string message with specified trace level. - //! The parameter theToPutEol specified whether end-of-line should be added to the end of the message. + //! The last Boolean argument is deprecated and unused. + //! Default implementation redirects to send(). + Standard_EXPORT virtual void Send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const; + + //! Send a string message with specified trace level. + //! Stream is converted to string value. //! Default implementation calls first method Send(). - Standard_EXPORT virtual void Send (const TCollection_AsciiString& theString, const Message_Gravity theGravity, const Standard_Boolean theToPutEol) const; + Standard_EXPORT virtual void SendStringStream (const Standard_SStream& theStream, const Message_Gravity theGravity) const; + + //! Send a string message with specified trace level. + //! The object is converted to string in format: : . + //! Default implementation calls first method Send(). + Standard_EXPORT virtual void SendObject (const Handle(Standard_Transient)& theObject, const Message_Gravity theGravity) const; protected: //! Empty constructor with Message_Info trace level Standard_EXPORT Message_Printer(); + //! Send a string message with specified trace level. + //! This method must be redefined in descendant. + Standard_EXPORT virtual void send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const = 0; + protected: Message_Gravity myTraceLevel; diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_PrinterOStream.cxx opencascade-7.5.1+dfsg1/src/Message/Message_PrinterOStream.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_PrinterOStream.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_PrinterOStream.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,6 +13,10 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#ifdef _WIN32 + #include +#endif + #include #include @@ -32,7 +36,7 @@ Message_PrinterOStream::Message_PrinterOStream (const Message_Gravity theTraceLevel) : myStream (&std::cout), myIsFile (Standard_False), - myUseUtf8 (Standard_False) + myToColorize (Standard_True) { myTraceLevel = theTraceLevel; } @@ -46,7 +50,8 @@ const Standard_Boolean theToAppend, const Message_Gravity theTraceLevel) : myStream (&std::cout), - myIsFile (Standard_False) + myIsFile (Standard_False), + myToColorize (Standard_True) { myTraceLevel = theTraceLevel; if (strcasecmp(theFileName, "cerr") == 0) @@ -71,6 +76,7 @@ { myStream = (Standard_OStream* )aFile; myIsFile = Standard_True; + myToColorize = Standard_False; } else { @@ -104,41 +110,150 @@ } //======================================================================= -//function : Send -//purpose : +//function : send +//purpose : //======================================================================= - -void Message_PrinterOStream::Send (const Standard_CString theString, - const Message_Gravity theGravity, - const Standard_Boolean putEndl) const +void Message_PrinterOStream::send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const { - if ( theGravity < myTraceLevel || ! myStream ) return; - Standard_OStream* ostr = (Standard_OStream*)myStream; - (*ostr) << theString; - if ( putEndl ) (*ostr) << std::endl; -} + if (theGravity < myTraceLevel + || myStream == NULL) + { + return; + } -//======================================================================= -//function : Send -//purpose : -//======================================================================= + Message_ConsoleColor aColor = Message_ConsoleColor_Default; + bool toIntense = false; + if (myToColorize && !myIsFile) + { + switch(theGravity) + { + case Message_Trace: + aColor = Message_ConsoleColor_Yellow; + break; + case Message_Info: + aColor = Message_ConsoleColor_Green; + toIntense = true; + break; + case Message_Warning: + aColor = Message_ConsoleColor_Yellow; + toIntense = true; + break; + case Message_Alarm: + aColor = Message_ConsoleColor_Red; + toIntense = true; + break; + case Message_Fail: + aColor = Message_ConsoleColor_Red; + toIntense = true; + break; + } + } -void Message_PrinterOStream::Send (const TCollection_AsciiString &theString, - const Message_Gravity theGravity, - const Standard_Boolean putEndl) const -{ - Send ( theString.ToCString(), theGravity, putEndl ); + Standard_OStream* aStream = (Standard_OStream*)myStream; + if (toIntense || aColor != Message_ConsoleColor_Default) + { + SetConsoleTextColor (aStream, aColor, toIntense); + *aStream << theString; + SetConsoleTextColor (aStream, Message_ConsoleColor_Default, false); + } + else + { + *aStream << theString; + } + (*aStream) << std::endl; } //======================================================================= -//function : Send -//purpose : +//function : SetConsoleTextColor +//purpose : //======================================================================= - -void Message_PrinterOStream::Send (const TCollection_ExtendedString &theString, - const Message_Gravity theGravity, - const Standard_Boolean putEndl) const +void Message_PrinterOStream::SetConsoleTextColor (Standard_OStream* theOStream, + Message_ConsoleColor theTextColor, + bool theIsIntenseText) { - TCollection_AsciiString aStr (theString, myUseUtf8 ? Standard_Character(0) : '?'); - Send (aStr.ToCString(), theGravity, putEndl); +#ifdef _WIN32 + // there is no difference between STD_OUTPUT_HANDLE/STD_ERROR_HANDLE for std::cout/std::cerr + (void )theOStream; + if (HANDLE anStdOut = GetStdHandle (STD_OUTPUT_HANDLE)) + { + WORD aFlags = 0; + if (theIsIntenseText) + { + aFlags |= FOREGROUND_INTENSITY; + } + switch (theTextColor) + { + case Message_ConsoleColor_Default: + case Message_ConsoleColor_White: + aFlags |= FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; + break; + case Message_ConsoleColor_Black: + break; + case Message_ConsoleColor_Red: + aFlags |= FOREGROUND_RED; + break; + case Message_ConsoleColor_Green: + aFlags |= FOREGROUND_GREEN; + break; + case Message_ConsoleColor_Blue: + aFlags |= FOREGROUND_BLUE; + break; + case Message_ConsoleColor_Yellow: + aFlags |= FOREGROUND_RED | FOREGROUND_GREEN; + break; + case Message_ConsoleColor_Cyan: + aFlags |= FOREGROUND_GREEN | FOREGROUND_BLUE; + break; + case Message_ConsoleColor_Magenta: + aFlags |= FOREGROUND_RED | FOREGROUND_BLUE; + break; + } + SetConsoleTextAttribute (anStdOut, aFlags); + } +#elif defined(__EMSCRIPTEN__) + // Terminal capabilities are undefined on this platform. + // std::cout could be redirected to HTML page, into terminal or somewhere else. + (void )theOStream; + (void )theTextColor; + (void )theIsIntenseText; +#else + if (theOStream == NULL) + { + return; + } + + const char* aCode = "\e[0m"; + switch (theTextColor) + { + case Message_ConsoleColor_Default: + aCode = theIsIntenseText ? "\e[0;1m" : "\e[0m"; + break; + case Message_ConsoleColor_Black: + aCode = theIsIntenseText ? "\e[30;1m" : "\e[30m"; + break; + case Message_ConsoleColor_Red: + aCode = theIsIntenseText ? "\e[31;1m" : "\e[31m"; + break; + case Message_ConsoleColor_Green: + aCode = theIsIntenseText ? "\e[32;1m" : "\e[32m"; + break; + case Message_ConsoleColor_Yellow: + aCode = theIsIntenseText ? "\e[33;1m" : "\e[33m"; + break; + case Message_ConsoleColor_Blue: + aCode = theIsIntenseText ? "\e[34;1m" : "\e[34m"; + break; + case Message_ConsoleColor_Magenta: + aCode = theIsIntenseText ? "\e[35;1m" : "\e[35m"; + break; + case Message_ConsoleColor_Cyan: + aCode = theIsIntenseText ? "\e[36;1m" : "\e[36m"; + break; + case Message_ConsoleColor_White: + aCode = theIsIntenseText ? "\e[37;1m" : "\e[37m"; + break; + } + *theOStream << aCode; +#endif } diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_PrinterOStream.hxx opencascade-7.5.1+dfsg1/src/Message/Message_PrinterOStream.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_PrinterOStream.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_PrinterOStream.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ #ifndef _Message_PrinterOStream_HeaderFile #define _Message_PrinterOStream_HeaderFile +#include #include #include #include @@ -30,6 +31,21 @@ { DEFINE_STANDARD_RTTIEXT(Message_PrinterOStream, Message_Printer) public: + + //! Setup console text color. + //! + //! On Windows, this would affect active terminal color output. + //! On other systems, this would put special terminal codes; + //! the terminal should support these codes or them will appear in text otherwise. + //! The same will happen when stream is redirected into text file. + //! + //! Beware that within multi-threaded environment inducing console colors + //! might lead to colored text mixture due to concurrency. + Standard_EXPORT static void SetConsoleTextColor (Standard_OStream* theOStream, + Message_ConsoleColor theTextColor, + bool theIsIntenseText = false); + +public: //! Empty constructor, defaulting to cout Standard_EXPORT Message_PrinterOStream(const Message_Gravity theTraceLevel = Message_Info); @@ -49,37 +65,27 @@ Close(); } - //! Returns option to convert non-Ascii symbols to UTF8 encoding - Standard_Boolean GetUseUtf8() const { return myUseUtf8; } - - //! Sets option to convert non-Ascii symbols to UTF8 encoding - void SetUseUtf8 (const Standard_Boolean useUtf8) { myUseUtf8 = useUtf8; } - //! Returns reference to the output stream Standard_OStream& GetStream() const { return *(Standard_OStream*)myStream; } - - //! Puts a message to the current stream - //! if its gravity is equal or greater - //! to the trace level set by SetTraceLevel() - Standard_EXPORT virtual void Send (const Standard_CString theString, const Message_Gravity theGravity, const Standard_Boolean putEndl = Standard_True) const Standard_OVERRIDE; - - //! Puts a message to the current stream - //! if its gravity is equal or greater - //! to the trace level set by SetTraceLevel() - Standard_EXPORT virtual void Send (const TCollection_AsciiString& theString, const Message_Gravity theGravity, const Standard_Boolean putEndl = Standard_True) const Standard_OVERRIDE; - + + //! Returns TRUE if text output into console should be colorized depending on message gravity; TRUE by default. + Standard_Boolean ToColorize() const { return myToColorize; } + + //! Set if text output into console should be colorized depending on message gravity. + void SetToColorize (Standard_Boolean theToColorize) { myToColorize = theToColorize; } + +protected: + //! Puts a message to the current stream //! if its gravity is equal or greater //! to the trace level set by SetTraceLevel() - //! Non-Ascii symbols are converted to UTF-8 if UseUtf8 - //! option is set, else replaced by symbols '?' - Standard_EXPORT virtual void Send (const TCollection_ExtendedString& theString, const Message_Gravity theGravity, const Standard_Boolean putEndl = Standard_True) const Standard_OVERRIDE; + Standard_EXPORT virtual void send (const TCollection_AsciiString& theString, const Message_Gravity theGravity) const Standard_OVERRIDE; private: Standard_Address myStream; Standard_Boolean myIsFile; - Standard_Boolean myUseUtf8; + Standard_Boolean myToColorize; }; diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_PrinterSystemLog.cxx opencascade-7.5.1+dfsg1/src/Message/Message_PrinterSystemLog.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_PrinterSystemLog.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_PrinterSystemLog.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,185 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifdef _WIN32 + #include +#endif + +#include + +#include + +#if defined(OCCT_UWP) + // +#elif defined(_WIN32) + //! Convert message gravity into EventLog enumeration. + static WORD getEventLogPriority (const Message_Gravity theGravity) + { + switch (theGravity) + { + case Message_Alarm: + case Message_Fail: + return EVENTLOG_ERROR_TYPE; + case Message_Warning: + return EVENTLOG_WARNING_TYPE; + case Message_Info: + case Message_Trace: + return EVENTLOG_INFORMATION_TYPE; + } + return EVENTLOG_INFORMATION_TYPE; + } +#elif defined(__ANDROID__) + #include + + //! Convert message gravity into Android log enumeration. + static android_LogPriority getAndroidLogPriority (const Message_Gravity theGravity) + { + switch (theGravity) + { + case Message_Trace: return ANDROID_LOG_DEBUG; + case Message_Info: return ANDROID_LOG_INFO; + case Message_Warning: return ANDROID_LOG_WARN; + case Message_Alarm: return ANDROID_LOG_ERROR; + case Message_Fail: return ANDROID_LOG_ERROR; + } + return ANDROID_LOG_DEBUG; + } +#elif defined(__EMSCRIPTEN__) + #include + + //! Print message to console.debug(). + EM_JS(void, occJSConsoleDebug, (const char* theStr), { + console.debug(UTF8ToString(theStr)); + }); + + //! Print message to console.info(). + EM_JS(void, occJSConsoleInfo, (const char* theStr), { + console.info(UTF8ToString(theStr)); + }); + + //! Print message to console.warn(). + EM_JS(void, occJSConsoleWarn, (const char* theStr), { + console.warn(UTF8ToString(theStr)); + }); + + //! Print message to console.error(). + EM_JS(void, occJSConsoleError, (const char* theStr), { + console.error(UTF8ToString(theStr)); + }); +#else + #include + + //! Convert message gravity into syslog() enumeration. + static int getSysLogPriority (const Message_Gravity theGravity) + { + switch (theGravity) + { + case Message_Trace: return LOG_DEBUG; + case Message_Info: return LOG_INFO; + case Message_Warning: return LOG_WARNING; + case Message_Alarm: return LOG_ERR; + case Message_Fail: return LOG_ERR; + } + return LOG_DEBUG; + } +#endif + +IMPLEMENT_STANDARD_RTTIEXT(Message_PrinterSystemLog, Message_Printer) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +Message_PrinterSystemLog::Message_PrinterSystemLog (const TCollection_AsciiString& theEventSourceName, + const Message_Gravity theTraceLevel) +: myEventSourceName (theEventSourceName) +{ + myTraceLevel = theTraceLevel; +#if defined(OCCT_UWP) + myEventSource = NULL; +#elif defined(_WIN32) + const TCollection_ExtendedString aWideSrcName (theEventSourceName); + myEventSource = (Standard_Address )RegisterEventSourceW (NULL, aWideSrcName.ToWideString()); +#elif defined(__ANDROID__) + // +#elif defined(__EMSCRIPTEN__) + // +#else + openlog (myEventSourceName.ToCString(), LOG_PID | LOG_NDELAY, LOG_USER); +#endif +} + +//======================================================================= +//function : ~Message_PrinterSystemLog +//purpose : +//======================================================================= +Message_PrinterSystemLog::~Message_PrinterSystemLog() +{ +#if defined(_WIN32) + if (myEventSource != NULL) + { + #if !defined(OCCT_UWP) + DeregisterEventSource ((HANDLE )myEventSource); + #endif + } +#elif defined(__ANDROID__) + // +#elif defined(__EMSCRIPTEN__) + // +#else + closelog(); +#endif +} + +//======================================================================= +//function : send +//purpose : +//======================================================================= +void Message_PrinterSystemLog::send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const +{ + if (theGravity < myTraceLevel) + { + return; + } + +#if defined(_WIN32) + if (myEventSource != NULL) + { + #if !defined(OCCT_UWP) + const TCollection_ExtendedString aWideString (theString); + const WORD aLogType = getEventLogPriority (theGravity); + const wchar_t* aMessage[1] = { aWideString.ToWideString() }; + ReportEventW ((HANDLE )myEventSource, aLogType, 0, 0, NULL, + 1, 0, aMessage, NULL); + #else + (void )theString; + #endif + } +#elif defined(__ANDROID__) + __android_log_write (getAndroidLogPriority (theGravity), myEventSourceName.ToCString(), theString.ToCString()); +#elif defined(__EMSCRIPTEN__) + // don't use bogus emscripten_log() corrupting UNICODE strings + switch (theGravity) + { + case Message_Trace: occJSConsoleDebug(theString.ToCString()); return; + case Message_Info: occJSConsoleInfo (theString.ToCString()); return; + case Message_Warning: occJSConsoleWarn (theString.ToCString()); return; + case Message_Alarm: occJSConsoleError(theString.ToCString()); return; + case Message_Fail: occJSConsoleError(theString.ToCString()); return; + } + occJSConsoleWarn (theString.ToCString()); +#else + syslog (getSysLogPriority (theGravity), "%s", theString.ToCString()); +#endif +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_PrinterSystemLog.hxx opencascade-7.5.1+dfsg1/src/Message/Message_PrinterSystemLog.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_PrinterSystemLog.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_PrinterSystemLog.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,54 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_PrinterSystemLog_HeaderFile +#define _Message_PrinterSystemLog_HeaderFile + +#include +#include + +DEFINE_STANDARD_HANDLE(Message_PrinterSystemLog, Message_Printer) + +//! Implementation of a message printer associated with system log. +//! Implemented for the following systems: +//! - Windows, through ReportEventW(). +//! - Android, through __android_log_write(). +//! - UNIX/Linux, through syslog(). +class Message_PrinterSystemLog : public Message_Printer +{ + DEFINE_STANDARD_RTTIEXT(Message_PrinterSystemLog, Message_Printer) +public: + + //! Main constructor. + Standard_EXPORT Message_PrinterSystemLog (const TCollection_AsciiString& theEventSourceName, + const Message_Gravity theTraceLevel = Message_Info); + + //! Destructor. + Standard_EXPORT virtual ~Message_PrinterSystemLog(); + +protected: + + //! Puts a message to the system log. + Standard_EXPORT virtual void send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const Standard_OVERRIDE; + +private: + + TCollection_AsciiString myEventSourceName; +#ifdef _WIN32 + Standard_Address myEventSource; +#endif + +}; + +#endif // _Message_PrinterSystemLog_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_PrinterToReport.cxx opencascade-7.5.1+dfsg1/src/Message/Message_PrinterToReport.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_PrinterToReport.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_PrinterToReport.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,120 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(Message_PrinterToReport, Message_Printer) + +//======================================================================= +//function : Report +//purpose : +//======================================================================= +const Handle(Message_Report)& Message_PrinterToReport::Report() const +{ + if (!myReport.IsNull()) + { + return myReport; + } + + return Message::DefaultReport (Standard_True); +} + +//======================================================================= +//function : SendStringStream +//purpose : +//======================================================================= +void Message_PrinterToReport::SendStringStream (const Standard_SStream& theStream, + const Message_Gravity theGravity) const +{ + const Handle(Message_Report)& aReport = Report(); + if (!aReport->ActiveMetrics().IsEmpty()) + { + sendMetricAlert (theStream.str().c_str(), theGravity); + return; + } + if (Standard_Dump::HasChildKey(Standard_Dump::Text (theStream))) + { + Message_AlertExtended::AddAlert (aReport, new Message_AttributeStream (theStream, myName), theGravity); + myName.Clear(); + } + else + { + if (!myName.IsEmpty()) + { + TCollection_AsciiString aName = myName; + myName.Clear(); + send (aName, theGravity); + } + myName = Standard_Dump::Text (theStream); + } +} + +//======================================================================= +//function : SendObject +//purpose : +//======================================================================= +void Message_PrinterToReport::SendObject (const Handle(Standard_Transient)& theObject, + const Message_Gravity theGravity) const +{ + const Handle(Message_Report)& aReport = Report(); + if (!aReport->ActiveMetrics().IsEmpty()) + { + sendMetricAlert (myName, theGravity); + return; + } + + Message_AlertExtended::AddAlert (aReport, new Message_AttributeObject (theObject, myName), theGravity); +} + +//======================================================================= +//function : send +//purpose : +//======================================================================= +void Message_PrinterToReport::send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const +{ + if (!myName.IsEmpty()) + { + send (myName, theGravity); + myName.Clear(); + } + + const Handle(Message_Report)& aReport = Report(); + if (!aReport->ActiveMetrics().IsEmpty()) + { + sendMetricAlert (theString, theGravity); + return; + } + Message_AlertExtended::AddAlert (aReport, new Message_Attribute (theString), theGravity); +} + +//======================================================================= +//function : sendMetricAlert +//purpose : +//======================================================================= +void Message_PrinterToReport::sendMetricAlert (const TCollection_AsciiString theValue, + const Message_Gravity theGravity) const +{ + Message_AlertExtended::AddAlert (Report(), new Message_AttributeMeter (theValue), theGravity); +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_PrinterToReport.hxx opencascade-7.5.1+dfsg1/src/Message/Message_PrinterToReport.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_PrinterToReport.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_PrinterToReport.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,75 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_PrinterToReport_HeaderFile +#define _Message_PrinterToReport_HeaderFile + +#include +#include +#include +#include + +class Message_Report; + +//! Implementation of a message printer associated with Message_Report +//! Send will create a new alert of the report. If string is sent, an alert is created by Eol only. +//! The alerts are sent into set report or default report of Message. +class Message_PrinterToReport : public Message_Printer +{ + DEFINE_STANDARD_RTTIEXT(Message_PrinterToReport, Message_Printer) +public: + //! Create printer for redirecting messages into report. + Message_PrinterToReport() {} + + //! Destructor + virtual ~Message_PrinterToReport() {} + + //! Returns the current or default report + Standard_EXPORT const Handle(Message_Report)& Report() const; + + //! Sets the printer report + //! @param theReport report for messages processing, if NULL, the default report is used + void SetReport (const Handle(Message_Report)& theReport) { myReport = theReport; } + + //! Send a string message with specified trace level. + //! Stream is converted to string value. + //! Default implementation calls first method Send(). + Standard_EXPORT virtual void SendStringStream (const Standard_SStream& theStream, + const Message_Gravity theGravity) const Standard_OVERRIDE; + + //! Send a string message with specified trace level. + //! The object is converted to string in format: : . + //! The parameter theToPutEol specified whether end-of-line should be added to the end of the message. + //! Default implementation calls first method Send(). + Standard_EXPORT virtual void SendObject (const Handle(Standard_Transient)& theObject, + const Message_Gravity theGravity) const Standard_OVERRIDE; + +protected: + + //! Send a string message with specified trace level. + //! This method must be redefined in descendant. + Standard_EXPORT virtual void send (const TCollection_AsciiString& theString, + const Message_Gravity theGravity) const Standard_OVERRIDE; + + //! Send an alert with metrics active in the current report + Standard_EXPORT void sendMetricAlert (const TCollection_AsciiString theValue, + const Message_Gravity theGravity) const; + +private: + mutable TCollection_AsciiString myName; + Handle(Message_Report) myReport; //!< the report for sending alerts +}; + +DEFINE_STANDARD_HANDLE(Message_PrinterToReport, Message_Printer) + +#endif // _Message_PrinterToReport_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressIndicator.cxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressIndicator.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressIndicator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressIndicator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -11,164 +11,52 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #include -#include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(Message_ProgressIndicator,Standard_Transient) //======================================================================= //function : Message_ProgressIndicator -//purpose : -//======================================================================= -Message_ProgressIndicator::Message_ProgressIndicator () -{ - Reset(); -} - -//======================================================================= -//function : Reset -//purpose : -//======================================================================= - -void Message_ProgressIndicator::Reset () -{ - myPosition = 0.; - - Message_ProgressScale scale; - scale.SetName ( "Step" ); - scale.SetSpan ( 0., 1. ); - - myScopes.Clear(); - myScopes.Append ( scale ); -} - -//======================================================================= -//function : SetScale -//purpose : -//======================================================================= - -void Message_ProgressIndicator::SetScale (const Standard_Real min, - const Standard_Real max, - const Standard_Real step, - const Standard_Boolean isInf) -{ - Message_ProgressScale &scale = myScopes.ChangeValue(1); - scale.SetRange ( min, max ); - scale.SetStep ( step ); - scale.SetInfinite ( isInf ); -} - -//======================================================================= -//function : GetScale -//purpose : -//======================================================================= - -void Message_ProgressIndicator::GetScale (Standard_Real &min, - Standard_Real &max, - Standard_Real &step, - Standard_Boolean &isInf) const -{ - const Message_ProgressScale &scale = myScopes(1); - min = scale.GetMin(); - max = scale.GetMax(); - step = scale.GetStep(); - isInf = scale.GetInfinite(); -} - +//purpose : //======================================================================= -//function : SetValue -//purpose : -//======================================================================= - -void Message_ProgressIndicator::SetValue (const Standard_Real val) +Message_ProgressIndicator::Message_ProgressIndicator() +: myPosition(0.), + myRootScope (NULL) { - const Message_ProgressScale &scale = myScopes(1); - Standard_Real p = scale.LocalToBase ( val ); - if ( myPosition < p ) { - myPosition = Min ( p, 1. ); - Show(Standard_False); - } + myRootScope = new Message_ProgressScope (this); } //======================================================================= -//function : GetValue -//purpose : +//function : ~Message_ProgressIndicator +//purpose : //======================================================================= - -Standard_Real Message_ProgressIndicator::GetValue () const -{ - return myScopes(1).BaseToLocal ( myPosition ); -} - -//======================================================================= -//function : NewScope -//purpose : -//======================================================================= - -Standard_Boolean Message_ProgressIndicator::NewScope (const Standard_Real span, - const Handle(TCollection_HAsciiString) &name) +Message_ProgressIndicator::~Message_ProgressIndicator() { - Message_ProgressScale scale; - scale.SetName ( name ); - scale.SetSpan ( myPosition, myScopes(1).LocalToBase ( GetValue() + span ) ); - myScopes.Prepend ( scale ); - Show(Standard_False); // to update textual representation, if any - return myPosition < 1.; + // Avoid calling Increment() from myRootScope.Close() + myRootScope->myProgress = 0; + myRootScope->myIsActive = false; + delete myRootScope; } //======================================================================= -//function : EndScope -//purpose : +//function : Start() +//purpose : //======================================================================= - -Standard_Boolean Message_ProgressIndicator::EndScope () -{ - Standard_Real end = myScopes(1).GetLast(); - Standard_Boolean ret = ( myScopes.Length() >1 ); - if ( ret ) myScopes.Remove(1); - if ( myPosition != end ) { - myPosition = end; - Show(Standard_False); - } - return ret; -} - -//======================================================================= -//function : NextScope -//purpose : -//======================================================================= - -Standard_Boolean Message_ProgressIndicator::NextScope (const Standard_Real span, - const Standard_CString name) +Message_ProgressRange Message_ProgressIndicator::Start() { - Message_ProgressScale &scale = myScopes.ChangeValue(1); - if ( myPosition != scale.GetLast() ) { - myPosition = scale.GetLast(); - Show(Standard_False); - } - if ( myScopes.Length() <2 ) return Standard_False; - - if ( name ) scale.SetName ( name ); - const Message_ProgressScale &scale2 = myScopes(2); - scale.SetSpan ( myPosition, scale2.LocalToBase ( scale2.BaseToLocal(myPosition) + span ) ); -// if ( myMax - myMin <= gp::Resolution() ) return myLast; -// Standard_Real next = ( myMax - myMin <= gp::Resolution() ? 1. - myPosition : -// span * ( scale2.GetLast() - scale2.GetFirst() ) / -// ( scale2.GetMax() - scale2.GetMin() ) ); -// scale.SetSpan ( myPosition, myPosition + next ); - return myPosition < 1.; + myPosition = 0.; + myRootScope->myValue = 0.; + Reset(); + Show (*myRootScope, Standard_False); + return myRootScope->Next(); } //======================================================================= -//function : UserBreak -//purpose : +//function : Start() +//purpose : //======================================================================= - -Standard_Boolean Message_ProgressIndicator::UserBreak () +Message_ProgressRange Message_ProgressIndicator::Start + (const Handle(Message_ProgressIndicator)& theProgress) { - return Standard_False; + return theProgress.IsNull() ? Message_ProgressRange() : theProgress->Start(); } - diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressIndicator.hxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressIndicator.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressIndicator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressIndicator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,180 +16,162 @@ #ifndef _Message_ProgressIndicator_HeaderFile #define _Message_ProgressIndicator_HeaderFile -#include -#include +#include +#include +#include -#include -#include -#include -#include -#include -#include -class TCollection_HAsciiString; -class Message_ProgressScale; - - -class Message_ProgressIndicator; DEFINE_STANDARD_HANDLE(Message_ProgressIndicator, Standard_Transient) -//! Defines abstract interface from program to the "user". +class Message_ProgressRange; +class Message_ProgressScope; + +//! Defines abstract interface from program to the user. //! This includes progress indication and user break mechanisms. //! -//! The process that uses the progress indicator interacts with it as -//! with a scale whose range and step can be configured according to -//! the nature of the process. -//! The scale can be made "infinite", which means it will grow -//! non-linearly, and end of scale will be approached asymptotically at -//! infinite number of steps. In that case the range defines -//! a number of steps corresponding to position at 1/2 of scale. -//! The current position can be either set directly (in a range from -//! current position to maximum scale value), or incremented step -//! by step. -//! -//! Progress indication mechanism is adapted for convenient -//! usage in hiererchical processes that require indication of -//! progress at several levels of the process nesting. -//! For that purpose, it is possible to create restricted sub-scope of -//! indication by specifying part of a current scale to be -//! used by the subprocess. -//! When subprocess works with progress indicator in the restricted -//! scope, it has the same interface to a scale, while actually it -//! deals only with part of the whole scale. +//! The progress indicator controls the progress scale with range from 0 to 1. //! -//! The recommended way to implement progress indication in the algorithm -//! is to use class Message_ProgressSentry that provides iterator-like -//! interface for incrementing progress and opening nested scopes. -//! -//! NOTE: -//! Currently there is no support for concurrent progress -//! indicator that could be useful in multithreaded applications. +//! Method Start() should be called once, at the top level of the call stack, +//! to reset progress indicator and get access to the root range: //! -//! The user break is implemented as virtual function that should -//! return True in case if break signal from the user is received. +//! @code{.cpp} +//! Handle(Message_ProgressIndicator) aProgress = ...; +//! anAlgorithm.Perform (aProgress->Start()); +//! @endcode //! -//! The derived class should take care of visualisation of the -//! progress indicator (e.g. show total position at the graphical bar, +//! To advance the progress indicator in the algorithm, +//! use the class Message_ProgressScope that provides iterator-like +//! interface for incrementing progress; see documentation of that +//! class for details. +//! The object of class Message_ProgressRange will automatically advance +//! the indicator if it is not passed to any Message_ProgressScope. +//! +//! The progress indicator supports concurrent processing and +//! can be used in multithreaded applications. +//! +//! The derived class should be created to connect this interface to +//! actual implementation of progress indicator, to take care of visualization +//! of the progress (e.g. show total position at the graphical bar, //! print scopes in text mode, or else), and for implementation //! of user break mechanism (if necessary). +//! +//! See details in documentation of methods Show() and UserBreak(). class Message_ProgressIndicator : public Standard_Transient { - + DEFINE_STANDARD_RTTIEXT(Message_ProgressIndicator, Standard_Transient) public: + //!@name Initialization of progress indication - - //! Drops all scopes and sets scale from 0 to 100, step 1 - //! This scale has name "Step" - Standard_EXPORT virtual void Reset(); - - void SetName (const Standard_CString name); - - //! Set (optional) name for scale - void SetName (const Handle(TCollection_HAsciiString)& name); - - //! Set range for current scale - void SetRange (const Standard_Real min, const Standard_Real max); - - //! Set step for current scale - void SetStep (const Standard_Real step); - - //! Set or drop infinite mode for the current scale - void SetInfinite (const Standard_Boolean isInf = Standard_True); - - void SetScale (const Standard_CString name, const Standard_Real min, const Standard_Real max, const Standard_Real step, const Standard_Boolean isInf = Standard_False); - - //! Set all parameters for current scale - Standard_EXPORT void SetScale (const Standard_Real min, const Standard_Real max, const Standard_Real step, const Standard_Boolean isInf = Standard_False); - - //! Returns all parameters for current scale - Standard_EXPORT void GetScale (Standard_Real& min, Standard_Real& max, Standard_Real& step, Standard_Boolean& isInf) const; - - Standard_EXPORT void SetValue (const Standard_Real val); - - //! Set and get progress value at current scale - //! If the value to be set is more than currently set one, or out - //! of range for the current scale, it is limited by that range - Standard_EXPORT Standard_Real GetValue() const; - - void Increment(); - - //! Increment the progress value by the default of specified step - void Increment (const Standard_Real step); - - Standard_Boolean NewScope (const Standard_CString name = 0); - - Standard_Boolean NewScope (const Handle(TCollection_HAsciiString)& name); - - Standard_Boolean NewScope (const Standard_Real span, const Standard_CString name = 0); - - //! Creates new scope on a part of a current scale from current - //! position with span either equal to default step, or specified - //! The scale for the new scope will have specified name and - //! ranged from 0 to 100 with step 1 - //! Returns False if something is wrong in arguments or in current - //! position of progress indicator; scope is opened anyway - Standard_EXPORT Standard_Boolean NewScope (const Standard_Real span, const Handle(TCollection_HAsciiString)& name); - - //! Close the current scope and thus return to previous scale - //! Updates position to be at the end of the closing scope - //! Returns False if no scope is opened - Standard_EXPORT Standard_Boolean EndScope(); - - Standard_Boolean NextScope (const Standard_CString name = 0); - - //! Optimized version of { return EndScope() && NewScope(); } - Standard_EXPORT Standard_Boolean NextScope (const Standard_Real span, const Standard_CString name = 0); - - //! Should return True if user has send a break signal. - //! Default implementation returns False. - Standard_EXPORT virtual Standard_Boolean UserBreak(); - - //! Update presentation of the progress indicator - //! Called when progress position is changed - //! Flag force is intended for forcing update in case if it is - //! optimized; all internal calls from ProgressIndicator are - //! done with this flag equal to False - Standard_EXPORT virtual Standard_Boolean Show (const Standard_Boolean force = Standard_True) = 0; - - //! Returns total progress position on the basic scale - //! ranged from 0. to 1. - Standard_Real GetPosition() const; - - //! Returns current number of opened scopes - //! This number is always >=1 as top-level scale is always present - Standard_Integer GetNbScopes() const; - - //! Returns data for scale of index-th scope - //! The first scope is current one, the last is the top-level one - const Message_ProgressScale& GetScope (const Standard_Integer index) const; + //! Resets the indicator to zero, calls Reset(), and returns the range. + //! This range refers to the scope that has no name and is initialized + //! with max value 1 and step 1. + //! Use this method to get the top level range for progress indication. + Standard_EXPORT Message_ProgressRange Start(); + + //! If argument is non-null handle, returns theProgress->Start(). + //! Otherwise, returns dummy range that can be safely used in the algorithms + //! but not bound to progress indicator. + Standard_EXPORT static Message_ProgressRange Start + (const Handle(Message_ProgressIndicator)& theProgress); +protected: + //!@name Virtual methods to be defined by descendant. + //! Should return True if user has sent a break signal. + //! + //! This method can be called concurrently, thus implementation should + //! be thread-safe. It should not call Show() or Position() to + //! avoid possible data races. The method should return as soon + //! as possible to avoid delaying the calling algorithm. + //! + //! Default implementation returns False. + virtual Standard_Boolean UserBreak() + { + return Standard_False; + } + + //! Virtual method to be defined by descendant. + //! Should update presentation of the progress indicator. + //! + //! It is called whenever progress position is changed. + //! Calls to this method from progress indicator are protected by mutex so that + //! it is never called concurrently for the same progress indicator instance. + //! Show() should return as soon as possible to reduce thread contention + //! in multithreaded algorithms. + //! + //! It is recommended to update (redraw, output etc.) only if progress is + //! advanced by at least 1% from previous update. + //! + //! Flag isForce is intended for forcing update in case if it is required + //! at particular step of the algorithm; all calls to it from inside the core + //! mechanism (Message_Progress... classes) are done with this flag equal to False. + //! + //! The parameter theScope is the current scope being advanced; + //! it can be used to show the names and ranges of the on-going scope and + //! its parents, providing more visibility of the current stage of the process. + virtual void Show (const Message_ProgressScope& theScope, + const Standard_Boolean isForce) = 0; + + //! Call-back method called by Start(), can be redefined by descendants + //! if some actions are needed when the indicator is restarted. + virtual void Reset() {} + +public: + //!@name Auxiliary methods + //! Returns total progress position ranged from 0 to 1. + //! Should not be called concurrently while the progress is advancing, + //! except from implementation of method Show(). + Standard_Real GetPosition() const + { + return myPosition; + } - DEFINE_STANDARD_RTTIEXT(Message_ProgressIndicator,Standard_Transient) + //! Destructor + Standard_EXPORT ~Message_ProgressIndicator(); protected: - - //! Constructor, just calls own Reset() (not yet redefined) + //! Constructor Standard_EXPORT Message_ProgressIndicator(); - - private: + //! Increment the progress value by the specified step, + //! then calls Show() to update presentation. + //! The parameter theScope is reference to the caller object; + //! it is passed to Show() where can be used to track context of the process. + void Increment (const Standard_Real theStep, const Message_ProgressScope& theScope); - Standard_Real myPosition; - Message_SequenceOfProgressScale myScopes; +private: + Standard_Real myPosition; //!< Total progress position ranged from 0 to 1 + Standard_Mutex myMutex; //!< Protection of myPosition from concurrent increment + Message_ProgressScope* myRootScope; //!< The root progress scope +private: + friend class Message_ProgressScope; //!< Friend: can call Increment() + friend class Message_ProgressRange; //!< Friend: can call Increment() }; +#include -#include - - +//======================================================================= +//function : Increment +//purpose : +//======================================================================= +inline void Message_ProgressIndicator::Increment(const Standard_Real theStep, + const Message_ProgressScope& theScope) +{ + // protect incrementation by mutex to avoid problems in multithreaded scenarios + Standard_Mutex::Sentry aSentry(myMutex); + myPosition = Min(myPosition + theStep, 1.); + // show progress indicator; note that this call is protected by + // the same mutex to avoid concurrency and ensure that this call + // to Show() will see the position exactly as it was just set above + Show(theScope, Standard_False); +} #endif // _Message_ProgressIndicator_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressIndicator.lxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressIndicator.lxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressIndicator.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressIndicator.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,174 +0,0 @@ -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -//======================================================================= -//function : SetName -//purpose : -//======================================================================= - -inline void Message_ProgressIndicator::SetName (const Standard_CString name) -{ - if (name != 0) - myScopes.ChangeValue(1).SetName ( name ); -} - -//======================================================================= -//function : SetName -//purpose : -//======================================================================= - -inline void Message_ProgressIndicator::SetName (const Handle(TCollection_HAsciiString) &name) -{ - if (!name.IsNull()) - myScopes.ChangeValue(1).SetName ( name ); -} - -//======================================================================= -//function : SetRange -//purpose : -//======================================================================= - -inline void Message_ProgressIndicator::SetRange (const Standard_Real min, - const Standard_Real max) -{ - myScopes.ChangeValue(1).SetRange ( min, max ); -} - -//======================================================================= -//function : SetStep -//purpose : -//======================================================================= - -inline void Message_ProgressIndicator::SetStep (const Standard_Real step) -{ - myScopes.ChangeValue(1).SetStep ( step ); -} - -//======================================================================= -//function : SetInfinite -//purpose : -//======================================================================= - -inline void Message_ProgressIndicator::SetInfinite (const Standard_Boolean isInf) -{ - myScopes.ChangeValue(1).SetInfinite ( isInf ); -} - -//======================================================================= -//function : SetScale -//purpose : -//======================================================================= - -inline void Message_ProgressIndicator::SetScale (const Standard_CString name, - const Standard_Real min, - const Standard_Real max, - const Standard_Real step, - const Standard_Boolean isInf) -{ - SetName ( name ); - SetScale ( min, max, step, isInf ); -} - -//======================================================================= -//function : Increment -//purpose : -//======================================================================= - -inline void Message_ProgressIndicator::Increment () -{ - Increment ( myScopes(1).GetStep() ); -} - -//======================================================================= -//function : Increment -//purpose : -//======================================================================= - -inline void Message_ProgressIndicator::Increment (const Standard_Real step) -{ - SetValue ( GetValue() + step ); -} - -//======================================================================= -//function : NewScope -//purpose : -//======================================================================= - -inline Standard_Boolean Message_ProgressIndicator::NewScope (const Standard_CString name) -{ - return NewScope ( name ? new TCollection_HAsciiString ( name ) : 0 ); -} - -//======================================================================= -//function : NewScope -//purpose : -//======================================================================= - -inline Standard_Boolean Message_ProgressIndicator::NewScope (const Handle(TCollection_HAsciiString) &name) -{ - return NewScope ( myScopes(1).GetStep(), name ); -} - -//======================================================================= -//function : NewScope -//purpose : -//======================================================================= - -inline Standard_Boolean Message_ProgressIndicator::NewScope (const Standard_Real span, - const Standard_CString name) -{ - return NewScope ( span, name ? new TCollection_HAsciiString ( name ) : 0 ); -} - -//======================================================================= -//function : NextScope -//purpose : -//======================================================================= - -inline Standard_Boolean Message_ProgressIndicator::NextScope (const Standard_CString name) -{ - return NextScope ( myScopes.Length() >1 ? myScopes(1).GetStep() : 1., name ); -} - -//======================================================================= -//function : GetPosition -//purpose : -//======================================================================= - -inline Standard_Real Message_ProgressIndicator::GetPosition () const -{ - return myPosition; -} - -//======================================================================= -//function : GetNbScopes -//purpose : -//======================================================================= - -inline Standard_Integer Message_ProgressIndicator::GetNbScopes () const -{ - return myScopes.Length(); -} - -//======================================================================= -//function : GetScope -//purpose : -//======================================================================= - -inline const Message_ProgressScale &Message_ProgressIndicator::GetScope (const Standard_Integer index) const -{ - return myScopes(index); -} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressRange.hxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressRange.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressRange.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressRange.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,145 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_ProgressRange_HeaderFile +#define _Message_ProgressRange_HeaderFile + +#include + +class Message_ProgressScope; + +//! Auxiliary class representing a part of the global progress scale allocated by +//! a step of the progress scope, see Message_ProgressScope::Next(). +//! +//! A range object takes responsibility of advancing the progress by the size of +//! allocated step, which is then performed depending on how it is used: +//! +//! - If Message_ProgressScope object is created using this range as argument, then +//! this respondibility is taken over by that scope. +//! +//! - Otherwise, a range advances progress directly upon destruction. +//! +//! A range object can be copied, the responsibility for progress advancement is +//! then taken by the copy. +//! The same range object may be used (either copied or used to create scope) only once. +//! Any consequent attempts to use range will give no result on the progress; +//! in debug mode, an assert message will be generated. +//! +//! @sa Message_ProgressScope for more details +class Message_ProgressRange +{ +public: + //! Constructor of the empty range + Message_ProgressRange() + : myParentScope (0), myStart(0.), myDelta (0.), myWasUsed (false) + {} + + //! Copy constructor disarms the source + Message_ProgressRange (const Message_ProgressRange& theOther) + : myParentScope (theOther.myParentScope), + myStart (theOther.myStart), + myDelta (theOther.myDelta), + myWasUsed (theOther.myWasUsed) + { + // discharge theOther + theOther.myWasUsed = true; + } + + //! Copy assignment disarms the source + Message_ProgressRange& operator=(const Message_ProgressRange& theOther) + { + myParentScope = theOther.myParentScope; + myStart = theOther.myStart; + myDelta = theOther.myDelta; + myWasUsed = theOther.myWasUsed; + theOther.myWasUsed = true; + return *this; + } + + //! Returns true if ProgressIndicator signals UserBreak + Standard_Boolean UserBreak() const; + + //! Returns false if ProgressIndicator signals UserBreak + Standard_Boolean More() const + { + return !UserBreak(); + } + + //! Returns true if this progress range is attached to some indicator. + Standard_Boolean IsActive() const; + + //! Closes the current range and advances indicator + void Close(); + + //! Destructor + ~Message_ProgressRange() + { + Close(); + } + +private: + //! Constructor is private + Message_ProgressRange (const Message_ProgressScope& theParent, + Standard_Real theStart, Standard_Real theDelta) + : myParentScope (&theParent), + myStart (theStart), + myDelta (theDelta), + myWasUsed (false) + {} + +private: + const Message_ProgressScope* myParentScope; //!< Pointer to parent scope + Standard_Real myStart; //!< Start point on the global scale + Standard_Real myDelta; //!< Step of incrementation on the global scale + + mutable Standard_Boolean myWasUsed; //!< Flag indicating that this range + //! was used to create a new scope + + friend class Message_ProgressScope; +}; + +#include + +//======================================================================= +//function : IsActive +//purpose : +//======================================================================= +inline Standard_Boolean Message_ProgressRange::IsActive() const +{ + return !myWasUsed && myParentScope && myParentScope->myProgress; +} + +//======================================================================= +//function : UserBreak +//purpose : +//======================================================================= +inline Standard_Boolean Message_ProgressRange::UserBreak() const +{ + return myParentScope && myParentScope->myProgress && myParentScope->myProgress->UserBreak(); +} + +//======================================================================= +//function : Close +//purpose : +//======================================================================= +inline void Message_ProgressRange::Close() +{ + if (!IsActive()) + return; + + myParentScope->myProgress->Increment(myDelta, *myParentScope); + myParentScope = 0; + myWasUsed = true; +} + +#endif // _Message_ProgressRange_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressScale.cxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressScale.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressScale.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressScale.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include - -static const Standard_Real Message_ProgressScale_ZERO = 1e-10; -static const Standard_Real Message_ProgressScale_INFINITE = 1e100; - -//======================================================================= -//function : Message_ProgressScale -//purpose : -//======================================================================= - -Message_ProgressScale::Message_ProgressScale () : - myMin(0.), myMax(100.), myStep(1.), myInfinite(Standard_False), - myFirst(0.), myLast(1.) -{ -} - -//======================================================================= -//function : LocalToBase -//purpose : -//======================================================================= - -Standard_Real Message_ProgressScale::LocalToBase (const Standard_Real val) const -{ - if ( val <= myMin ) return myFirst; - if ( myMax - myMin <= Message_ProgressScale_ZERO ) return myLast; - - if ( ! myInfinite ) { - if ( val >= myMax ) return myLast; - return myFirst + ( myLast - myFirst ) * ( val - myMin ) / ( myMax - myMin ); - } - Standard_Real x = ( val - myMin ) / ( myMax - myMin ); -// return myFirst + ( myLast - myFirst ) * ( 1. - exp ( -x ) ); // exponent - return myFirst + ( myLast - myFirst ) * x / ( 1. + x ); // hyperbola -} - -//======================================================================= -//function : BaseToLocal -//purpose : -//======================================================================= - -Standard_Real Message_ProgressScale::BaseToLocal (const Standard_Real val) const -{ - if ( myLast - val <= Message_ProgressScale_ZERO ) - return myInfinite ? Message_ProgressScale_INFINITE : myMax; - if ( ! myInfinite ) - return myMin + ( myMax - myMin ) * ( val - myFirst ) / ( myLast - myFirst ); -// Standard_Real x = log ( ( val - myFirst ) / ( myLast - val ) ); // exponent - Standard_Real x = ( val - myFirst ) / ( myLast - val ); // hyperbola - return myMin + x * ( myMax - myMin ); -} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressScale.hxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressScale.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressScale.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressScale.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,133 +0,0 @@ -// Created on: 2002-02-20 -// Created by: Andrey BETENEV -// Copyright (c) 2002-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _Message_ProgressScale_HeaderFile -#define _Message_ProgressScale_HeaderFile - -#include -#include -#include - -#include -#include -#include -class TCollection_HAsciiString; - - -//! Internal data structure for scale in ProgressIndicator -//! -//! Basically it defines three things: -//! - name that can be used for generating user messages -//! - limits and characteristics of the current scale, -//! along with derived coefficients to map it into basic scale [0-1] -//! - methods for conversion of values from current scale -//! to basic one and back -//! -//! NOTE: There is no special protection against bad input data -//! like min > max etc. except cases when it can cause exception -class Message_ProgressScale -{ -public: - - DEFINE_STANDARD_ALLOC - - - //! Creates scale ranged from 0 to 100 with step 1 - Standard_EXPORT Message_ProgressScale(); - - void SetName (const Standard_CString theName); - - //! Sets scale name - void SetName (const Handle(TCollection_HAsciiString)& theName); - - //! Gets scale name - //! Name may be Null handle if not set - Handle(TCollection_HAsciiString) GetName() const; - - //! Sets minimum value of scale - void SetMin (const Standard_Real theMin); - - //! Gets minimum value of scale - Standard_Real GetMin() const; - - //! Sets minimum value of scale - void SetMax (const Standard_Real theMax); - - //! Gets minimum value of scale - Standard_Real GetMax() const; - - //! Set both min and max - void SetRange (const Standard_Real min, const Standard_Real max); - - //! Sets default step - void SetStep (const Standard_Real theStep); - - //! Gets default step - Standard_Real GetStep() const; - - //! Sets flag for infinite scale - void SetInfinite (const Standard_Boolean theInfinite = Standard_True); - - //! Gets flag for infinite scale - Standard_Boolean GetInfinite() const; - - //! Set all scale parameters - void SetScale (const Standard_Real min, const Standard_Real max, const Standard_Real step, const Standard_Boolean theInfinite = Standard_True); - - //! Defines span occupied by the scale on the basis scale - void SetSpan (const Standard_Real first, const Standard_Real last); - - Standard_Real GetFirst() const; - - //! Return information on span occupied by the scale on the base scale - Standard_Real GetLast() const; - - Standard_EXPORT Standard_Real LocalToBase (const Standard_Real val) const; - - //! Convert value from this scale to base one and back - Standard_EXPORT Standard_Real BaseToLocal (const Standard_Real val) const; - - - - -protected: - - - - - -private: - - - - Handle(TCollection_HAsciiString) myName; - Standard_Real myMin; - Standard_Real myMax; - Standard_Real myStep; - Standard_Boolean myInfinite; - Standard_Real myFirst; - Standard_Real myLast; - - -}; - - -#include - - - - - -#endif // _Message_ProgressScale_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressScale.lxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressScale.lxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressScale.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressScale.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,185 +0,0 @@ -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -//======================================================================= -//function : SetName -//purpose : Sets scale name -//======================================================================= - -inline void Message_ProgressScale::SetName(const Standard_CString theName) -{ - myName = new TCollection_HAsciiString ( theName ); -} - -//======================================================================= -//function : SetName -//purpose : Sets scale name -//======================================================================= - -inline void Message_ProgressScale::SetName(const Handle(TCollection_HAsciiString)& theName) -{ - myName = theName; -} - -//======================================================================= -//function : GetName -//purpose : Returns scale name -//======================================================================= - -inline Handle(TCollection_HAsciiString) Message_ProgressScale::GetName() const -{ - return myName; -} - -//======================================================================= -//function : SetMin -//purpose : Sets minimum value of scale -//======================================================================= - -inline void Message_ProgressScale::SetMin(const Standard_Real theMin) -{ - myMin = theMin; -} - -//======================================================================= -//function : GetMin -//purpose : Returns minimum value of scale -//======================================================================= - -inline Standard_Real Message_ProgressScale::GetMin() const -{ - return myMin; -} - -//======================================================================= -//function : SetMax -//purpose : Sets minimum value of scale -//======================================================================= - -inline void Message_ProgressScale::SetMax(const Standard_Real theMax) -{ - myMax = theMax; -} - -//======================================================================= -//function : GetMax -//purpose : Returns minimum value of scale -//======================================================================= - -inline Standard_Real Message_ProgressScale::GetMax() const -{ - return myMax; -} - -//======================================================================= -//function : SetRange -//purpose : Sets both min and max -//======================================================================= - -inline void Message_ProgressScale::SetRange(const Standard_Real theMin, - const Standard_Real theMax) -{ - myMin = theMin; - myMax = theMax; -} - -//======================================================================= -//function : SetStep -//purpose : Sets default step -//======================================================================= - -inline void Message_ProgressScale::SetStep(const Standard_Real theStep) -{ - myStep = theStep; -} - -//======================================================================= -//function : GetStep -//purpose : Returns default step -//======================================================================= - -inline Standard_Real Message_ProgressScale::GetStep() const -{ - return myStep; -} - -//======================================================================= -//function : SetInfinite -//purpose : Sets flag for infinite scale -//======================================================================= - -inline void Message_ProgressScale::SetInfinite(const Standard_Boolean theInfinite) -{ - myInfinite = theInfinite; -} - -//======================================================================= -//function : GetInfinite -//purpose : Returns flag for infinite scale -//======================================================================= - -inline Standard_Boolean Message_ProgressScale::GetInfinite() const -{ - return myInfinite; -} - -//======================================================================= -//function : SetScale -//purpose : Set all scale parameters -//======================================================================= - -inline void Message_ProgressScale::SetScale(const Standard_Real theMin, - const Standard_Real theMax, - const Standard_Real theStep, - const Standard_Boolean theInfinite) -{ - myMin = theMin; - myMax = theMax; - myStep = theStep; - myInfinite = theInfinite; -} - -//======================================================================= -//function : SetSpan -//purpose : Sets span on a basis scale -//======================================================================= - -inline void Message_ProgressScale::SetSpan(const Standard_Real theFirst, - const Standard_Real theLast) -{ - myFirst = theFirst; - myLast = theLast; -} - -//======================================================================= -//function : GetFirst -//purpose : -//======================================================================= - -inline Standard_Real Message_ProgressScale::GetFirst () const -{ - return myFirst; -} - -//======================================================================= -//function : GetLast -//purpose : -//======================================================================= - -inline Standard_Real Message_ProgressScale::GetLast () const -{ - return myLast; -} - diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressScope.hxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressScope.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressScope.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressScope.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,634 @@ +// Created on: 2002-02-22 +// Created by: Andrey BETENEV +// Copyright (c) 2002-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Message_ProgressScope_HeaderFile +#define _Message_ProgressScope_HeaderFile + +#include +#include +#include +#include +#include +#include + +class Message_ProgressRange; +class Message_ProgressIndicator; + +//! Message_ProgressScope class provides convenient way to advance progress +//! indicator in context of complex program organized in hierarchical way, +//! where usually it is difficult (or even not possible) to consider process +//! as linear with fixed step. +//! +//! On every level (sub-operation) in hierarchy of operations +//! the local instance of the Message_ProgressScope class is created. +//! It takes a part of the upper-level scope (via Message_ProgressRange) and provides +//! a way to consider this part as independent scale with locally defined range. +//! +//! The position on the local scale may be advanced using the method Next(), +//! which allows iteration-like advancement. This method can take argument to +//! advance by the specified value (with default step equal to 1). +//! This method returns Message_ProgressRange object that takes responsibility +//! of making the specified step, either directly at its destruction or by +//! delegating this task to another sub-scope created from that range object. +//! +//! It is important that sub-scope must have life time less than +//! the life time of its parent scope that provided the range. +//! The usage pattern is to create scope objects as local variables in the +//! functions that do the job, and pass range objects returned by Next() to +//! the functions of the lower level, to allow them creating their own scopes. +//! +//! The scope has a name that can be used in visualization of the progress. +//! It can be null. Note that when C string literal is used as a name, then its +//! value is not copied, just pointer is stored. In other variants (char pointer +//! or a string class) the string is copied, which is additional overhead. +//! +//! The same instance of the progress scope! must not be used concurrently from different threads. +//! For the algorithm running its tasks in parallel threads, a common scope is +//! created before the parallel execution, and the range objects produced by method +//! Next() are used to initialise the data pertinent to each task. +//! Then the progress is advanced within each task using its own range object. +//! See example below. +//! +//! Note that while a range of the scope is specified using Standard_Real +//! (double) parameter, it is expected to be a positive integer value. +//! If the range is not an integer, method Next() shall be called with +//! explicit step argument, and the rounded value returned by method Value() +//! may be not coherent with the step and range. +//! +//! A scope can be created with option "infinite". This is useful when +//! the number of steps is not known by the time of the scope creation. +//! In this case the progress will be advanced logarithmically, approaching +//! the end of the scope at infinite number of steps. The parameter Max +//! for infinite scope indicates number of steps corresponding to mid-range. +//! +//! A progress scope created with empty constructor is not connected to any +//! progress indicator, and passing the range created on it to any algorithm +//! allows it executing safely without actual progress indication. +//! +//! Example of preparation of progress indicator: +//! +//! @code{.cpp} +//! Handle(Message_ProgressIndicator) aProgress = ...; // assume it can be null +//! func (Message_ProgressIndicator::Start (aProgress)); +//! @endcode +//! +//! Example of usage in sequential process: +//! +//! @code{.cpp} +//! Message_ProgressScope aWholePS(aRange, "Whole process", 100); +//! +//! // do one step taking 20% +//! func1 (aWholePS.Next (20)); // func1 will take 20% of the whole scope +//! if (aWholePS.UserBreak()) // exit prematurely if the user requested break +//! return; +//! +//! // ... do next step taking 50% +//! func2 (aWholePS.Next (50)); +//! if (aWholePS.UserBreak()) +//! return; +//! @endcode +//! +//! Example of usage in nested cycle: +//! +//! @code{.cpp} +//! // Outer cycle +//! Message_ProgressScope anOuter (theProgress, "Outer", nbOuter); +//! for (Standard_Integer i = 0; i < nbOuter && anOuter.More(); i++) +//! { +//! // Inner cycle +//! Message_ProgressScope anInner (anOuter.Next(), "Inner", nbInner); +//! for (Standard_Integer j = 0; j < nbInner && anInner.More(); j++) +//! { +//! // Cycle body +//! func (anInner.Next()); +//! } +//! } +//! @endcode +//! +//! Example of use in function: +//! +//! @code{.cpp} +//! //! Implementation of iterative algorithm showing its progress +//! func (const Message_ProgressRange& theProgress) +//! { +//! // Create local scope covering the given progress range. +//! // Set this scope to count aNbSteps steps. +//! Message_ProgressScope aScope (theProgress, "", aNbSteps); +//! for (Standard_Integer i = 0; i < aNbSteps && aScope.More(); i++) +//! { +//! // Optional: pass range returned by method Next() to the nested algorithm +//! // to allow it to show its progress too (by creating its own scope object). +//! // In any case the progress will advance to the next step by the end of the func2 call. +//! func2 (aScope.Next()); +//! } +//! } +//! @endcode +//! +//! Example of usage in parallel process: +//! +//! @code{.cpp} +//! struct Task +//! { +//! Data& Data; +//! Message_ProgressRange Range; +//! +//! Task (const Data& theData, const Message_ProgressRange& theRange) +//! : Data (theData), Range (theRange) {} +//! }; +//! struct Functor +//! { +//! void operator() (Task& theTask) const +//! { +//! // Note: it is essential that this method is executed only once for the same Task object +//! Message_ProgressScope aPS (theTask.Range, NULL, theTask.Data.NbItems); +//! for (Standard_Integer i = 0; i < theTask.Data.NbSteps && aPS.More(); i++) +//! { +//! do_job (theTask.Data.Item[i], aPS.Next()); +//! } +//! } +//! }; +//! ... +//! { +//! std::vector aData = ...; +//! std::vector aTasks; +//! +//! Message_ProgressScope aPS (aRootRange, "Data processing", aData.size()); +//! for (Standard_Integer i = 0; i < aData.size(); ++i) +//! aTasks.push_back (Task (aData[i], aPS.Next())); +//! +//! OSD_Parallel::ForEach (aTasks.begin(), aTasks.end(), Functor()); +//! } +//! @endcode +//! +//! For lightweight algorithms that do not need advancing the progress +//! within individual tasks the code can be simplified to avoid inner scopes: +//! +//! @code +//! struct Functor +//! { +//! void operator() (Task& theTask) const +//! { +//! if (theTask.Range.More()) +//! { +//! do_job (theTask.Data); +//! // advance the progress +//! theTask.Range.Close(); +//! } +//! } +//! }; +//! @endcode +class Message_ProgressScope +{ +public: + class NullString; //!< auxiliary type for passing NULL name to Message_ProgressScope constructor +public: //! @name Preparation methods + + //! Creates dummy scope. + //! It can be safely passed to algorithms; no progress indication will be done. + Message_ProgressScope() + : myProgress (0), + myParent (0), + myName (0), + myStart (0.), + myPortion (1.), + myMax (1.), + myValue (0.), + myIsActive (false), + myIsOwnName (false), + myIsInfinite (false) + {} + + //! Creates a new scope taking responsibility of the part of the progress + //! scale described by theRange. The new scope has own range from 0 to + //! theMax, which is mapped to the given range. + //! + //! The topmost scope is created and owned by Message_ProgressIndicator + //! and its pointer is contained in the Message_ProgressRange returned by the Start() method of progress indicator. + //! + //! @param theRange [in][out] range to fill (will be disarmed) + //! @param theName [in] new scope name + //! @param theMax [in] number of steps in scope + //! @param isInfinite [in] infinite flag + Message_ProgressScope (const Message_ProgressRange& theRange, + const TCollection_AsciiString& theName, + Standard_Real theMax, + Standard_Boolean isInfinite = false); + + //! Creates a new scope taking responsibility of the part of the progress + //! scale described by theRange. The new scope has own range from 0 to + //! theMax, which is mapped to the given range. + //! + //! The topmost scope is created and owned by Message_ProgressIndicator + //! and its pointer is contained in the Message_ProgressRange returned by the Start() method of progress indicator. + //! + //! @param theRange [in][out] range to fill (will be disarmed) + //! @param theName [in] new scope name constant (will be stored by pointer with no deep copy) + //! @param theMax [in] number of steps in scope + //! @param isInfinite [in] infinite flag + template + Message_ProgressScope (const Message_ProgressRange& theRange, + const char (&theName)[N], + Standard_Real theMax, + Standard_Boolean isInfinite = false); + + //! Creates a new scope taking responsibility of the part of the progress + //! scale described by theRange. The new scope has own range from 0 to + //! theMax, which is mapped to the given range. + //! + //! The topmost scope is created and owned by Message_ProgressIndicator + //! and its pointer is contained in the Message_ProgressRange returned by the Start() method of progress indicator. + //! + //! @param theRange [in][out] range to fill (will be disarmed) + //! @param theName [in] empty scope name (only NULL is accepted as argument) + //! @param theMax [in] number of steps in scope + //! @param isInfinite [in] infinite flag + Message_ProgressScope (const Message_ProgressRange& theRange, + const NullString* theName, + Standard_Real theMax, + Standard_Boolean isInfinite = false); + + //! Sets the name of the scope. + void SetName (const TCollection_AsciiString& theName) + { + if (myIsOwnName) + { + Standard::Free (myName); + myIsOwnName = false; + } + myName = NULL; + if (!theName.IsEmpty()) + { + myIsOwnName = true; + myName = (char* )Standard::Allocate (theName.Length() + 1); + char* aName = (char* )myName; + memcpy (aName, theName.ToCString(), theName.Length()); + aName[theName.Length()] = '\0'; + } + } + + //! Sets the name of the scope; can be null. + //! Note! Just pointer to the given string is copied, + //! so do not pass string from a temporary variable whose + //! lifetime is less than that of this object. + template + void SetName (const char (&theName)[N]) + { + if (myIsOwnName) + { + Standard::Free (myName); + myIsOwnName = false; + } + myName = theName; + } + +public: //! @name Advance by iterations + + //! Returns true if ProgressIndicator signals UserBreak + Standard_Boolean UserBreak() const; + + //! Returns false if ProgressIndicator signals UserBreak + Standard_Boolean More() const + { + return !UserBreak(); + } + + //! Advances position by specified step and returns the range + //! covering this step + Message_ProgressRange Next (Standard_Real theStep = 1.); + +public: //! @name Auxiliary methods to use in ProgressIndicator + + //! Force update of presentation of the progress indicator. + //! Should not be called concurrently. + void Show(); + + //! Returns true if this progress scope is attached to some indicator. + Standard_Boolean IsActive() const + { + return myIsActive; + } + + //! Returns the name of the scope (may be null). + //! Scopes with null name (e.g. root scope) should + //! be bypassed when reporting progress to the user. + Standard_CString Name() const + { + return myName; + } + + //! Returns parent scope (null for top-level scope) + const Message_ProgressScope* Parent() const + { + return myParent; + } + + //! Returns the maximal value of progress in this scope + Standard_Real MaxValue() const + { + return myMax; + } + + //! Returns the current value of progress in this scope. + //! + //! The value is computed by mapping current global progress into + //! this scope range; the result is rounded up to integer. + //! Note that if MaxValue() is not an integer, Value() can be + //! greater than MaxValue() due to that rounding. + //! + //! This method should not be called concurrently while the progress + //! is advancing, except from implementation of method Show() in + //! descendant of Message_ProgressIndicator. + Standard_Real Value() const; + + //! Returns the infinite flag + Standard_Boolean IsInfinite() const + { + return myIsInfinite; + } + + //! Get the portion of the indicator covered by this scope (from 0 to 1) + Standard_Real GetPortion() const + { + return myPortion; + } + +public: //! @name Destruction, allocation + + //! Destructor - closes the scope and adds its scale to the total progress + ~Message_ProgressScope() + { + Close(); + if (myIsOwnName) + { + Standard::Free (myName); + myIsOwnName = false; + myName = NULL; + } + } + + //! Closes the scope and advances the progress to its end. + //! Closed scope should not be used. + void Close(); + + DEFINE_STANDARD_ALLOC + +private: //! @name Internal methods + + //! Creates a top-level scope with default range [0,1] and step 1. + //! Called only by Message_ProgressIndicator constructor. + Message_ProgressScope (Message_ProgressIndicator* theProgress); + + //! Convert value from this scope to global scale, but disregarding + //! start position of the scope, in the range [0, myPortion] + Standard_Real localToGlobal(const Standard_Real theVal) const; + +private: + //! Copy constructor is prohibited + Message_ProgressScope (const Message_ProgressScope& theOther); + + //! Copy assignment is prohibited + Message_ProgressScope& operator= (const Message_ProgressScope& theOther); + +private: + + Message_ProgressIndicator* myProgress; //!< Pointer to progress indicator instance + const Message_ProgressScope* myParent; //!< Pointer to parent scope + Standard_CString myName; //!< Name of the operation being done in this scope, or null + + Standard_Real myStart; //!< Start position on the global scale [0, 1] + Standard_Real myPortion; //!< The portion of the global scale covered by this scope [0, 1] + + Standard_Real myMax; //!< Maximal value of progress in this scope + Standard_Real myValue; //!< Current position advanced within this scope [0, Max] + + Standard_Boolean myIsActive; //!< flag indicating armed/disarmed state + Standard_Boolean myIsOwnName; //!< flag indicating if name was allocated or not + Standard_Boolean myIsInfinite; //!< Option to advance by hyperbolic law + +private: + friend class Message_ProgressIndicator; + friend class Message_ProgressRange; +}; + +#include + +//======================================================================= +//function : Message_ProgressScope +//purpose : +//======================================================================= +inline Message_ProgressScope::Message_ProgressScope (Message_ProgressIndicator* theProgress) +: myProgress(theProgress), + myParent(0), + myName(0), + myStart(0.), + myPortion(1.), + myMax(1.), + myValue(0.), + myIsActive(theProgress != NULL), + myIsOwnName(false), + myIsInfinite(false) +{ +} + +//======================================================================= +//function : Message_ProgressScope +//purpose : +//======================================================================= +inline Message_ProgressScope::Message_ProgressScope (const Message_ProgressRange& theRange, + const TCollection_AsciiString& theName, + Standard_Real theMax, + Standard_Boolean isInfinite) +: myProgress (theRange.myParentScope != NULL ? theRange.myParentScope->myProgress : NULL), + myParent (theRange.myParentScope), + myName (NULL), + myStart (theRange.myStart), + myPortion (theRange.myDelta), + myMax (Max (1.e-6, theMax)), // protection against zero range + myValue (0.), + myIsActive (myProgress != NULL && !theRange.myWasUsed), + myIsOwnName (false), + myIsInfinite (isInfinite) +{ + SetName (theName); + Standard_ASSERT_VOID (! theRange.myWasUsed, "Message_ProgressRange is used to initialize more than one scope"); + theRange.myWasUsed = true; // Disarm the range +} + +//======================================================================= +//function : Message_ProgressScope +//purpose : +//======================================================================= +template +Message_ProgressScope::Message_ProgressScope (const Message_ProgressRange& theRange, + const char (&theName)[N], + Standard_Real theMax, + Standard_Boolean isInfinite) +: myProgress (theRange.myParentScope != NULL ? theRange.myParentScope->myProgress : NULL), + myParent (theRange.myParentScope), + myName (theName), + myStart (theRange.myStart), + myPortion (theRange.myDelta), + myMax (Max (1.e-6, theMax)), // protection against zero range + myValue (0.), + myIsActive (myProgress != NULL && !theRange.myWasUsed), + myIsOwnName (false), + myIsInfinite (isInfinite) +{ + Standard_ASSERT_VOID (! theRange.myWasUsed, "Message_ProgressRange is used to initialize more than one scope"); + theRange.myWasUsed = true; // Disarm the range +} + +//======================================================================= +//function : Message_ProgressScope +//purpose : +//======================================================================= +inline Message_ProgressScope::Message_ProgressScope (const Message_ProgressRange& theRange, + const NullString* , + Standard_Real theMax, + Standard_Boolean isInfinite) +: myProgress (theRange.myParentScope != NULL ? theRange.myParentScope->myProgress : NULL), + myParent (theRange.myParentScope), + myName (NULL), + myStart (theRange.myStart), + myPortion (theRange.myDelta), + myMax (Max (1.e-6, theMax)), // protection against zero range + myValue (0.), + myIsActive (myProgress != NULL && !theRange.myWasUsed), + myIsOwnName (false), + myIsInfinite (isInfinite) +{ + Standard_ASSERT_VOID (! theRange.myWasUsed, "Message_ProgressRange is used to initialize more than one scope"); + theRange.myWasUsed = true; // Disarm the range +} + +//======================================================================= +//function : Close +//purpose : +//======================================================================= +inline void Message_ProgressScope::Close() +{ + if (!myIsActive) + { + return; + } + + // Advance indicator to the end of the scope + Standard_Real aCurr = localToGlobal (myValue); + myValue = (myIsInfinite ? Precision::Infinite() : myMax); + Standard_Real aDelta = myPortion - aCurr; + if (aDelta > 0.) + { + myProgress->Increment (aDelta, *this); + } + Standard_ASSERT_VOID (myParent == 0 || myParent->myIsActive, + "Parent progress scope has been closed before child"); + + myIsActive = false; +} + +//======================================================================= +//function : UserBreak +//purpose : +//======================================================================= +inline Standard_Boolean Message_ProgressScope::UserBreak() const +{ + return myProgress && myProgress->UserBreak(); +} + +//======================================================================= +//function : Next +//purpose : +//======================================================================= +inline Message_ProgressRange Message_ProgressScope::Next (Standard_Real theStep) +{ + if (myIsActive && theStep > 0.) + { + Standard_Real aCurr = localToGlobal(myValue); + Standard_Real aNext = localToGlobal(myValue += theStep); + Standard_Real aDelta = aNext - aCurr; + if (aDelta > 0.) + { + return Message_ProgressRange(*this, myStart + aCurr, aDelta); + } + } + return Message_ProgressRange(); +} + +//======================================================================= +//function : Show +//purpose : +//======================================================================= + +inline void Message_ProgressScope::Show () +{ + if (myIsActive) + { + myProgress->Show (*this, Standard_True); + } +} + +//======================================================================= +//function : localToGlobal +//purpose : +//======================================================================= +inline Standard_Real Message_ProgressScope::localToGlobal (const Standard_Real theVal) const +{ + if (theVal <= 0.) + return 0.; + + if (!myIsInfinite) + { + if (myMax - theVal < RealSmall()) + return myPortion; + return myPortion * theVal / myMax; + } + + double x = theVal / myMax; + // return myPortion * ( 1. - std::exp ( -x ) ); // exponent + return myPortion * x / (1. + x); // hyperbola +} + +//======================================================================= +//function : Value +//purpose : +//======================================================================= + +inline Standard_Real Message_ProgressScope::Value () const +{ + if (!myIsActive) + { + return myIsInfinite ? Precision::Infinite() : myMax; + } + + // get current progress on the global scale counted + // from the start of this scope + Standard_Real aVal = myProgress->GetPosition() - myStart; + + // if progress has not reached yet the start of this scope, return 0 + if (aVal <= 0.) + return 0.; + + // if at end of the scope (or behind), report the maximum + Standard_Real aDist = myPortion - aVal; + if (aDist <= Precision::Confusion()) + return myIsInfinite ? Precision::Infinite() : myMax; + + // map the value to the range of this scope [0, Max], + // rounding up to integer, with small correction applied + // to avoid rounding errors + return std::ceil (myMax * aVal / (myIsInfinite ? aDist : myPortion) - Precision::Confusion()); +} + +#endif // _Message_ProgressScope_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressSentry.cxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressSentry.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressSentry.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressSentry.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include - -//======================================================================= -//function : Message_ProgressSentry -//purpose : -//======================================================================= -Message_ProgressSentry::Message_ProgressSentry (const Handle(Message_ProgressIndicator) &progress, - const Standard_CString name, - const Standard_Real min, - const Standard_Real max, - const Standard_Real step, - const Standard_Boolean isInf, - const Standard_Real newScopeSpan) : - myProgress(progress), myActive(!progress.IsNull()) -{ - if ( ! myActive ) return; - progress->SetName ( name ); - progress->SetScale ( min, max, step, isInf ); - progress->NewScope ( newScopeSpan >0 ? newScopeSpan : step ); -} - -//======================================================================= -//function : Message_ProgressSentry -//purpose : -//======================================================================= - -Message_ProgressSentry::Message_ProgressSentry (const Handle(Message_ProgressIndicator) &progress, - const Handle(TCollection_HAsciiString) &name, - const Standard_Real min, - const Standard_Real max, - const Standard_Real step, - const Standard_Boolean isInf, - const Standard_Real newScopeSpan) : - myProgress(progress), myActive(!progress.IsNull()) -{ - if ( ! myActive ) return; - progress->SetName ( name ); - progress->SetScale ( min, max, step, isInf ); - progress->NewScope ( newScopeSpan >0 ? newScopeSpan : step ); -} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressSentry.hxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressSentry.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressSentry.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressSentry.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,6 +1,4 @@ -// Created on: 2002-02-22 -// Created by: Andrey BETENEV -// Copyright (c) 2002-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -13,111 +11,45 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -#ifndef _Message_ProgressSentry_HeaderFile -#define _Message_ProgressSentry_HeaderFile +#ifndef Message_ProgressSentry_HeaderFile +#define Message_ProgressSentry_HeaderFile -#include -#include -#include - -#include -#include -#include -class Message_ProgressIndicator; -class TCollection_HAsciiString; - - -//! This class is a tool allowing to manage opening/closing -//! scopes in the ProgressIndicator in convenient and safe way. -//! -//! Its main features are: -//! - Set all parameters for the current scale on the given -//! ProgressIndicator and open a new scope at one line -//! - Iterator-like interface to opening next scopes and -//! check for user break -//! - Automatic scope closing in destructor -//! - Safe for NULL ProgressIndicator (just does nothing) -//! -//! Example of usage in nested process: -//! -//! @code{.cpp} -//! Handle(Draw_ProgressIndicator) aProgress = ...; -//! -//! // Outer cycle -//! Message_ProgressSentry anOuter (aProgress, "Outer", 0, nbOuter, 1); -//! for (int i = 0; i < nbOuter && anOuter.More(); i++, anOuter.Next()) -//! { -//! // Inner cycle -//! Message_ProgressSentry anInner (aProgress, "Inner", 0, nbInner, 1); -//! for (int j = 0; j < nbInner && anInner.More(); j++, anInner.Next()) -//! { -//! // Cycle body -//! } -//! } -//! @endcode +#include -class Message_ProgressSentry +//! Functionality of this class (Message_ProgressSentry) has been superseded by Message_ProgressScope. +//! This class is kept just to simplify transition of an old code and will be removed in future. +class Standard_DEPRECATED("Deprecated class, Message_ProgressScope should be used instead") +Message_ProgressSentry : public Message_ProgressScope { public: + //! Deprecated constructor, Message_ProgressScope should be created instead. + Message_ProgressSentry (const Message_ProgressRange& theRange, + const Standard_CString theName, + const Standard_Real theMin, + const Standard_Real theMax, + const Standard_Real theStep, + const Standard_Boolean theIsInf = Standard_False, + const Standard_Real theNewScopeSpan = 0.0) + : Message_ProgressScope (theRange, theName, theMax, theIsInf) + { + if (theMin != 0.0 || theStep != 1.0 || theNewScopeSpan != 0.0) + { + throw Standard_ProgramError ("Message_ProgressSentry, invalid parameters"); + } + } - DEFINE_STANDARD_ALLOC - - - Standard_EXPORT Message_ProgressSentry(const Handle(Message_ProgressIndicator)& PI, const Standard_CString name, const Standard_Real min, const Standard_Real max, const Standard_Real step, const Standard_Boolean isInf = Standard_False, const Standard_Real newScopeSpan = 0.0); - - //! Creates an instance of ProgressSentry attaching it to - //! the specified ProgressIndicator, selects parameters of - //! the current scale, and opens a new scope with specified - //! span (equal to step by default) - Standard_EXPORT Message_ProgressSentry(const Handle(Message_ProgressIndicator)& PI, const Handle(TCollection_HAsciiString)& name, const Standard_Real min, const Standard_Real max, const Standard_Real step, const Standard_Boolean isInf = Standard_False, const Standard_Real newScopeSpan = 0.0); - - //! Moves progress indicator to the end of the current scale - //! and relieves sentry from its duty. Methods other than Show() - //! will do nothing after this one is called. - void Relieve(); -~Message_ProgressSentry() -{ - Relieve(); -} - - void Next (const Standard_CString name = 0) const; - - void Next (const Standard_Real span, const Standard_CString name = 0) const; - - //! Closes current scope and opens next one - //! with either specified or default span - void Next (const Standard_Real span, const Handle(TCollection_HAsciiString)& name) const; - - //! Returns False if ProgressIndicator signals UserBreak - Standard_Boolean More() const; - - //! Forces update of progress indicator display - void Show() const; - - - - -protected: - - - - + //! Method Relieve() was replaced by Close() in Message_ProgressScope + void Relieve () { Close(); } private: - - - - Handle(Message_ProgressIndicator) myProgress; - Standard_Boolean myActive; - - + //! Message_ProgressRange should be passed to constructor instead of Message_ProgressIndicator. + Message_ProgressSentry (const Handle(Message_ProgressIndicator)& theProgress, + const Standard_CString theName, + const Standard_Real theMin, + const Standard_Real theMax, + const Standard_Real theStep, + const Standard_Boolean theIsInf = Standard_False, + const Standard_Real theNewScopeSpan = 0.0); }; - -#include - - - - - -#endif // _Message_ProgressSentry_HeaderFile +#endif // Message_ProgressSentry_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_ProgressSentry.lxx opencascade-7.5.1+dfsg1/src/Message/Message_ProgressSentry.lxx --- opencascade-7.4.1+dfsg1/src/Message/Message_ProgressSentry.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_ProgressSentry.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -//======================================================================= -//function : Relieve -//purpose : -//======================================================================= - -inline void Message_ProgressSentry::Relieve () -{ - if ( ! myActive ) return; - myProgress->EndScope(); - myActive = 0; -} - -//======================================================================= -//function : Next -//purpose : -//======================================================================= - -inline void Message_ProgressSentry::Next (const Standard_CString name) const -{ - if ( myActive ) myProgress->NextScope(name); -} - -//======================================================================= -//function : Next -//purpose : -//======================================================================= - -inline void Message_ProgressSentry::Next (const Standard_Real span, - const Standard_CString name) const -{ - if ( myActive ) myProgress->NextScope(span, name); -} - -//======================================================================= -//function : Next -//purpose : -//======================================================================= - -inline void Message_ProgressSentry::Next (const Standard_Real span, - const Handle(TCollection_HAsciiString)& name) const -{ - if ( myActive ) { - myProgress->EndScope(); - myProgress->NewScope(span, name); - } -} - -//======================================================================= -//function : More -//purpose : -//======================================================================= - -inline Standard_Boolean Message_ProgressSentry::More () const -{ - return myActive ? ! myProgress->UserBreak() : Standard_True; -} - -//======================================================================= -//function : Show -//purpose : -//======================================================================= - -inline void Message_ProgressSentry::Show () const -{ - if ( ! myProgress.IsNull() ) myProgress->Show(); -} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Report.cxx opencascade-7.5.1+dfsg1/src/Message/Message_Report.cxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Report.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Report.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,9 +14,18 @@ // commercial license or contractual agreement. #include + +#include +#include +#include +#include +#include #include #include -#include +#include + +#include +#include IMPLEMENT_STANDARD_RTTIEXT(Message_Report,Standard_Transient) @@ -26,6 +35,8 @@ //======================================================================= Message_Report::Message_Report () +: myLimit (-1), + myIsActiveInMessenger (Standard_False) { } @@ -36,28 +47,28 @@ void Message_Report::AddAlert (Message_Gravity theGravity, const Handle(Message_Alert)& theAlert) { - Standard_ASSERT_RETURN (! theAlert.IsNull(), "Attempt to add null alert",); - Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), - "Adding alert with gravity not in valid range",); - Standard_Mutex::Sentry aSentry (myMutex); - // iterate by already recorded alerts and try to merge new one with one of those - Message_ListOfAlert &aList = myAlerts[theGravity]; - if (theAlert->SupportsMerge() && ! aList.IsEmpty()) + // alerts of the top level + if (myAlertLevels.IsEmpty()) { - // merge is performed only for alerts of exactly same type - const Handle(Standard_Type)& aType = theAlert->DynamicType(); - for (Message_ListOfAlert::Iterator anIt(aList); anIt.More(); anIt.Next()) + Handle (Message_CompositeAlerts) aCompositeAlert = compositeAlerts (Standard_True); + if (aCompositeAlert->AddAlert (theGravity, theAlert)) + { + return; + } + + // remove alerts under the report only + const Message_ListOfAlert& anAlerts = aCompositeAlert->Alerts (theGravity); + if (anAlerts.Extent() > myLimit) { - // if merged successfully, just return - if (aType == anIt.Value()->DynamicType() && theAlert->Merge (anIt.Value())) - return; + aCompositeAlert->RemoveAlert (theGravity, anAlerts.First()); } + return; } - // if not merged, just add to the list - aList.Append (theAlert); + // if there are some levels of alerts, the new alert will be placed below the root + myAlertLevels.Last()->AddAlert (theGravity, theAlert); } //======================================================================= @@ -68,9 +79,11 @@ const Message_ListOfAlert& Message_Report::GetAlerts (Message_Gravity theGravity) const { static const Message_ListOfAlert anEmptyList; - Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), - "Requesting alerts for gravity not in valid range", anEmptyList); - return myAlerts[theGravity]; + if (myCompositAlerts.IsNull()) + { + return anEmptyList; + } + return myCompositAlerts->Alerts (theGravity); } //======================================================================= @@ -95,26 +108,131 @@ Standard_Boolean Message_Report::HasAlert (const Handle(Standard_Type)& theType, Message_Gravity theGravity) { - Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), - "Requesting alerts for gravity not in valid range", Standard_False); - for (Message_ListOfAlert::Iterator anIt (myAlerts[theGravity]); anIt.More(); anIt.Next()) + if (compositeAlerts().IsNull()) { - if (anIt.Value()->IsInstance(theType)) - return Standard_True; + return Standard_False; } - return Standard_False; + + return compositeAlerts()->HasAlert (theType, theGravity); } //======================================================================= -//function : Clear +//function : IsActiveInMessenger //purpose : //======================================================================= +Standard_Boolean Message_Report::IsActiveInMessenger (const Handle(Message_Messenger)&) const +{ + return myIsActiveInMessenger; +} -void Message_Report::Clear () +//======================================================================= +//function : ActivateInMessenger +//purpose : +//======================================================================= +void Message_Report::ActivateInMessenger (const Standard_Boolean toActivate, + const Handle(Message_Messenger)& theMessenger) { - for (unsigned int i = 0; i < sizeof(myAlerts)/sizeof(myAlerts[0]); ++i) + if (toActivate == IsActiveInMessenger()) + return; + + myIsActiveInMessenger = toActivate; + Handle(Message_Messenger) aMessenger = theMessenger.IsNull() ? Message::DefaultMessenger() : theMessenger; + if (toActivate) { - myAlerts[i].Clear(); + Handle (Message_PrinterToReport) aPrinterToReport = new Message_PrinterToReport(); + aPrinterToReport->SetReport (this); + aMessenger->AddPrinter (aPrinterToReport); + } + else // deactivate + { + Message_SequenceOfPrinters aPrintersToRemove; + for (Message_SequenceOfPrinters::Iterator anIterator (aMessenger->Printers()); anIterator.More(); anIterator.Next()) + { + const Handle(Message_Printer) aPrinter = anIterator.Value(); + if (aPrinter->IsKind(STANDARD_TYPE (Message_PrinterToReport)) && + Handle(Message_PrinterToReport)::DownCast (aPrinter)->Report() == this) + aPrintersToRemove.Append (aPrinter); + } + for (Message_SequenceOfPrinters::Iterator anIterator (aPrintersToRemove); anIterator.More(); anIterator.Next()) + { + aMessenger->RemovePrinter (anIterator.Value()); + } + } +} + +//======================================================================= +//function : UpdateActiveInMessenger +//purpose : +//======================================================================= +void Message_Report::UpdateActiveInMessenger (const Handle(Message_Messenger)& theMessenger) +{ + Handle(Message_Messenger) aMessenger = theMessenger.IsNull() ? Message::DefaultMessenger() : theMessenger; + for (Message_SequenceOfPrinters::Iterator anIterator (aMessenger->Printers()); anIterator.More(); anIterator.Next()) + { + if (anIterator.Value()->IsKind(STANDARD_TYPE (Message_PrinterToReport)) && + Handle(Message_PrinterToReport)::DownCast (anIterator.Value())->Report() == this) + { + myIsActiveInMessenger = Standard_True; + return; + } + } + myIsActiveInMessenger = Standard_False; +} + +//======================================================================= +//function : AddLevel +//purpose : +//======================================================================= +void Message_Report::AddLevel (Message_Level* theLevel, const TCollection_AsciiString& theName) +{ + myAlertLevels.Append (theLevel); + + Handle(Message_AlertExtended) aLevelRootAlert = new Message_AlertExtended(); + + Handle(Message_Attribute) anAttribute; + if (!ActiveMetrics().IsEmpty()) + { + anAttribute = new Message_AttributeMeter (theName); + } + else + { + anAttribute = new Message_Attribute (theName); + } + aLevelRootAlert->SetAttribute (anAttribute); + theLevel->SetRootAlert (aLevelRootAlert, myAlertLevels.Size() == 1); + + if (myAlertLevels.Size() == 1) // this is the first level, so root alert should be pushed in the report composite of alerts + { + compositeAlerts (Standard_True)->AddAlert (Message_Info, theLevel->RootAlert()); + } + if (myAlertLevels.Size() > 1) // this is the first level, so root alert should be pushed in the report composite of alerts + { + // root alert of next levels should be pushed under the previous level + Message_Level* aPrevLevel = myAlertLevels.Value (myAlertLevels.Size() - 1); // previous level + aPrevLevel->AddAlert (Message_Info, aLevelRootAlert); + } +} + +//======================================================================= +//function : RemoveLevel +//purpose : +//======================================================================= + +void Message_Report::RemoveLevel (Message_Level* theLevel) +{ + for (int aLevelIndex = myAlertLevels.Size(); aLevelIndex >= 1; aLevelIndex--) + { + Message_Level* aLevel = myAlertLevels.Value (aLevelIndex); + if (myAlertLevels.Size() == 1) // the last level, the root item should be stopped + { + Message_AttributeMeter::StopAlert (aLevel->RootAlert()); + } + + myAlertLevels.Remove (aLevelIndex); + if (aLevel == theLevel) + { + return; + } } } @@ -122,34 +240,66 @@ //function : Clear //purpose : //======================================================================= +void Message_Report::Clear() +{ + if (compositeAlerts().IsNull()) + { + return; + } + compositeAlerts()->Clear(); + myAlertLevels.Clear(); +} + +//======================================================================= +//function : Clear +//purpose : +//======================================================================= void Message_Report::Clear (Message_Gravity theGravity) { - Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), - "Requesting alerts for gravity not in valid range", ); - myAlerts[theGravity].Clear(); + if (compositeAlerts().IsNull()) + { + return; + } + + compositeAlerts()->Clear (theGravity); + myAlertLevels.Clear(); } //======================================================================= //function : Clear //purpose : //======================================================================= - void Message_Report::Clear (const Handle(Standard_Type)& theType) { - for (unsigned int i = 0; i < sizeof(myAlerts)/sizeof(myAlerts[0]); ++i) + if (compositeAlerts().IsNull()) { - for (Message_ListOfAlert::Iterator anIt (myAlerts[i]); anIt.More(); ) - { - if (anIt.Value().IsNull() || anIt.Value()->IsInstance (theType)) - { - myAlerts[i].Remove (anIt); - } - else - { - anIt.More(); - } - } + return; + } + + compositeAlerts()->Clear (theType); + myAlertLevels.Clear(); +} + +//======================================================================= +//function : SetActiveMetric +//purpose : +//======================================================================= +void Message_Report::SetActiveMetric (const Message_MetricType theMetricType, + const Standard_Boolean theActivate) +{ + if (theActivate == myActiveMetrics.Contains (theMetricType)) + { + return; + } + + if (theActivate) + { + myActiveMetrics.Add (theMetricType); + } + else + { + myActiveMetrics.RemoveKey (theMetricType); } } @@ -173,54 +323,45 @@ void Message_Report::Dump (Standard_OStream& theOS, Message_Gravity theGravity) { - Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), - "Requesting alerts for gravity not in valid range", ); + if (compositeAlerts().IsNull()) + { + return; + } - // report each type of warning only once - NCollection_Map aPassedAlerts; - for (Message_ListOfAlert::Iterator anIt (myAlerts[theGravity]); anIt.More(); anIt.Next()) + if (compositeAlerts().IsNull()) { - if (aPassedAlerts.Add (anIt.Value()->DynamicType())) - { - Message_Msg aMsg (anIt.Value()->GetMessageKey()); - theOS << aMsg.Original() << std::endl; - } + return; } + + dumpMessages (theOS, theGravity, compositeAlerts()); } //======================================================================= -//function : Dump +//function : SendMessages //purpose : //======================================================================= void Message_Report::SendMessages (const Handle(Message_Messenger)& theMessenger) { - for (int iGravity = Message_Trace; iGravity <= Message_Fail; ++iGravity) + for (int aGravIter = Message_Trace; aGravIter <= Message_Fail; ++aGravIter) { - SendMessages (theMessenger, (Message_Gravity)iGravity); + SendMessages (theMessenger, (Message_Gravity)aGravIter); } } //======================================================================= -//function : Dump +//function : SendMessages //purpose : //======================================================================= void Message_Report::SendMessages (const Handle(Message_Messenger)& theMessenger, Message_Gravity theGravity) { - Standard_ASSERT_RETURN (theGravity >= 0 && size_t(theGravity) < sizeof(myAlerts)/sizeof(myAlerts[0]), - "Requesting alerts for gravity not in valid range", ); - - // report each type of warning only once - NCollection_Map aPassedAlerts; - for (Message_ListOfAlert::Iterator anIt (myAlerts[theGravity]); anIt.More(); anIt.Next()) + if (compositeAlerts().IsNull()) { - if (aPassedAlerts.Add (anIt.Value()->DynamicType())) - { - Message_Msg aMsg (anIt.Value()->GetMessageKey()); - theMessenger->Send (aMsg, theGravity); - } + return; } + + sendMessages (theMessenger, theGravity, compositeAlerts()); } //======================================================================= @@ -230,9 +371,9 @@ void Message_Report::Merge (const Handle(Message_Report)& theOther) { - for (int iGravity = Message_Trace; iGravity <= Message_Fail; ++iGravity) + for (int aGravIter = Message_Trace; aGravIter <= Message_Fail; ++aGravIter) { - Merge (theOther, (Message_Gravity)iGravity); + Merge (theOther, (Message_Gravity)aGravIter); } } @@ -248,3 +389,102 @@ AddAlert (theGravity, anIt.Value()); } } + +//======================================================================= +//function : CompositeAlerts +//purpose : +//======================================================================= +const Handle(Message_CompositeAlerts)& Message_Report::compositeAlerts (const Standard_Boolean isCreate) +{ + if (myCompositAlerts.IsNull() && isCreate) + { + myCompositAlerts = new Message_CompositeAlerts(); + } + + return myCompositAlerts; +} + +//======================================================================= +//function : sendMessages +//purpose : +//======================================================================= +void Message_Report::sendMessages (const Handle(Message_Messenger)& theMessenger, Message_Gravity theGravity, + const Handle(Message_CompositeAlerts)& theCompositeAlert) +{ + if (theCompositeAlert.IsNull()) + { + return; + } + + const Message_ListOfAlert& anAlerts = theCompositeAlert->Alerts (theGravity); + for (Message_ListOfAlert::Iterator anIt (anAlerts); anIt.More(); anIt.Next()) + { + theMessenger->Send (anIt.Value()->GetMessageKey(), theGravity); + Handle(Message_AlertExtended) anExtendedAlert = Handle(Message_AlertExtended)::DownCast (anIt.Value()); + if (anExtendedAlert.IsNull()) + { + continue; + } + + Handle(Message_CompositeAlerts) aCompositeAlerts = anExtendedAlert->CompositeAlerts(); + if (aCompositeAlerts.IsNull()) + { + continue; + } + + sendMessages (theMessenger, theGravity, aCompositeAlerts); + } +} + +//======================================================================= +//function : dumpMessages +//purpose : +//======================================================================= +void Message_Report::dumpMessages (Standard_OStream& theOS, Message_Gravity theGravity, + const Handle(Message_CompositeAlerts)& theCompositeAlert) +{ + if (theCompositeAlert.IsNull()) + { + return; + } + + const Message_ListOfAlert& anAlerts = theCompositeAlert->Alerts (theGravity); + for (Message_ListOfAlert::Iterator anIt (anAlerts); anIt.More(); anIt.Next()) + { + theOS << anIt.Value()->GetMessageKey() << std::endl; + + Handle(Message_AlertExtended) anExtendedAlert = Handle(Message_AlertExtended)::DownCast (anIt.Value()); + if (anExtendedAlert.IsNull()) + { + continue; + } + + dumpMessages (theOS, theGravity, anExtendedAlert->CompositeAlerts()); + } +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Message_Report::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + if (!myCompositAlerts.IsNull()) + { + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myCompositAlerts.get()) + } + + Standard_Integer anAlertLevels = myAlertLevels.Size(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, anAlertLevels) + + for (NCollection_IndexedMap::Iterator anIterator (myActiveMetrics); anIterator.More(); anIterator.Next()) + { + Message_MetricType anActiveMetric = anIterator.Value(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, anActiveMetric) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLimit) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsActiveInMessenger) +} diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_Report.hxx opencascade-7.5.1+dfsg1/src/Message/Message_Report.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_Report.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_Report.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,12 +17,18 @@ #define _Message_Report_HeaderFile #include +#include #include +#include +#include +#include #include +class Message_CompositeAlerts; class Message_Messenger; class Message_Report; + DEFINE_STANDARD_HANDLE(Message_Report, MMgt_TShared) //! Container for alert messages, sorted according to their gravity. @@ -46,7 +52,8 @@ //! Dump() or in more advanced way, by iterating over lists returned by GetAlerts() //! //! - Report can be cleared by methods Clear() (usually after reporting) - +//! +//! Message_PrinterToReport is a printer in Messenger to convert data sent to messenger into report class Message_Report : public Standard_Transient { public: @@ -67,6 +74,28 @@ //! Returns true if specific type of alert is recorded with specified gravity Standard_EXPORT Standard_Boolean HasAlert (const Handle(Standard_Type)& theType, Message_Gravity theGravity); + //! Returns true if a report printer for the current report is registered in the messenger + //! @param theMessenger the messenger. If it's NULL, the default messenger is used + Standard_EXPORT Standard_Boolean IsActiveInMessenger (const Handle(Message_Messenger)& theMessenger = NULL) const; + + //! Creates an instance of Message_PrinterToReport with the current report and register it in messenger + //! @param toActivate if true, activated else deactivated + //! @param theMessenger the messenger. If it's NULL, the default messenger is used + Standard_EXPORT void ActivateInMessenger (const Standard_Boolean toActivate, + const Handle(Message_Messenger)& theMessenger = NULL); + + //! Updates internal flag IsActiveInMessenger. + //! It becomes true if messenger contains at least one instance of Message_PrinterToReport. + //! @param theMessenger the messenger. If it's NULL, the default messenger is used + Standard_EXPORT void UpdateActiveInMessenger (const Handle(Message_Messenger)& theMessenger = NULL); + + //! Add new level of alerts + //! @param theLevel a level + Standard_EXPORT void AddLevel (Message_Level* theLevel, const TCollection_AsciiString& theName); + + //! Remove level of alerts + Standard_EXPORT void RemoveLevel (Message_Level* theLevel); + //! Clears all collected alerts Standard_EXPORT void Clear (); @@ -76,17 +105,39 @@ //! Clears collected alerts with specified type Standard_EXPORT void Clear (const Handle(Standard_Type)& theType); + //! Returns computed metrics when alerts are performed + const NCollection_IndexedMap& ActiveMetrics() const { return myActiveMetrics; } + + //! Sets metrics to compute when alerts are performed + //! @param theMetrics container of metrics + Standard_EXPORT void SetActiveMetric (const Message_MetricType theMetricType, const Standard_Boolean theActivate); + + //! Removes all activated metrics + void ClearMetrics() { myActiveMetrics.Clear(); } + + //! Returns maximum number of collecting alerts. If the limit is achieved, + //! first alert is removed, the new alert is added in the container. + //! @return the limit value + Standard_Integer Limit() const { return myLimit; } + + //! Sets maximum number of collecting alerts. + //! @param theLimit limit value + void SetLimit(const Standard_Integer theLimit) { myLimit = theLimit; } + //! Dumps all collected alerts to stream Standard_EXPORT void Dump (Standard_OStream& theOS); //! Dumps collected alerts with specified gravity to stream Standard_EXPORT void Dump (Standard_OStream& theOS, Message_Gravity theGravity); - //! Sends all collected alerts to messenger - Standard_EXPORT void SendMessages (const Handle(Message_Messenger)& theMessenger); + //! Sends all collected alerts to messenger. + Standard_EXPORT virtual void SendMessages (const Handle(Message_Messenger)& theMessenger); - //! Dumps collected alerts with specified gravity to messenger - Standard_EXPORT void SendMessages (const Handle(Message_Messenger)& theMessenger, Message_Gravity theGravity); + //! Dumps collected alerts with specified gravity to messenger. + //! Default implementation creates Message_Msg object with a message + //! key returned by alert, and sends it in the messenger. + Standard_EXPORT virtual void SendMessages (const Handle(Message_Messenger)& theMessenger, + Message_Gravity theGravity); //! Merges data from theOther report into this Standard_EXPORT void Merge (const Handle(Message_Report)& theOther); @@ -94,15 +145,36 @@ //! Merges alerts with specified gravity from theOther report into this Standard_EXPORT void Merge (const Handle(Message_Report)& theOther, Message_Gravity theGravity); + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + // OCCT RTTI DEFINE_STANDARD_RTTIEXT(Message_Report,Standard_Transient) protected: + //! Returns class provided hierarchy of alerts if created or create if the parameter is true + //! @param isCreate if composite alert has not been created for this alert, it should be created + //! @return instance or NULL + Standard_EXPORT const Handle(Message_CompositeAlerts)& compositeAlerts (const Standard_Boolean isCreate = Standard_False); + + //! Sends alerts to messenger + Standard_EXPORT void sendMessages (const Handle(Message_Messenger)& theMessenger, Message_Gravity theGravity, + const Handle(Message_CompositeAlerts)& theCompositeAlert); + + //! Dumps collected alerts with specified gravity to stream + Standard_EXPORT void dumpMessages (Standard_OStream& theOS, Message_Gravity theGravity, + const Handle(Message_CompositeAlerts)& theCompositeAlert); + +protected: Standard_Mutex myMutex; - // store messages in a lists sorted by gravity; - // here we rely on knowledge that Message_Fail is the last element of the enum - Message_ListOfAlert myAlerts[Message_Fail + 1]; + Handle(Message_CompositeAlerts) myCompositAlerts; //!< container of alerts + + NCollection_Sequence myAlertLevels; //!< container of active levels, new alerts are added below the latest level + NCollection_IndexedMap myActiveMetrics; //!< metrics to compute on alerts + + Standard_Integer myLimit; //!< Maximum number of collected alerts on the top level + Standard_Boolean myIsActiveInMessenger; //! state whether the report is activated in messenger }; #endif // _Message_Report_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Message/Message_SequenceOfProgressScale.hxx opencascade-7.5.1+dfsg1/src/Message/Message_SequenceOfProgressScale.hxx --- opencascade-7.4.1+dfsg1/src/Message/Message_SequenceOfProgressScale.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Message/Message_SequenceOfProgressScale.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -// Created on: 1999-07-29 -// Created by: Roman LYGIN -// Copyright (c) 1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef Message_SequenceOfProgressScale_HeaderFile -#define Message_SequenceOfProgressScale_HeaderFile - -#include -#include - -typedef NCollection_Sequence Message_SequenceOfProgressScale; - - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/MoniTool/MoniTool_Element.cxx opencascade-7.5.1+dfsg1/src/MoniTool/MoniTool_Element.cxx --- opencascade-7.4.1+dfsg1/src/MoniTool/MoniTool_Element.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MoniTool/MoniTool_Element.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,11 @@ IMPLEMENT_STANDARD_RTTIEXT(MoniTool_Element,Standard_Transient) +MoniTool_Element::MoniTool_Element() +: thecode(-1) +{ +} + void MoniTool_Element::SetHashCode (const Standard_Integer code) { thecode = code; } diff -Nru opencascade-7.4.1+dfsg1/src/MoniTool/MoniTool_Element.hxx opencascade-7.5.1+dfsg1/src/MoniTool/MoniTool_Element.hxx --- opencascade-7.4.1+dfsg1/src/MoniTool/MoniTool_Element.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MoniTool/MoniTool_Element.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,6 +43,9 @@ public: + //! Empty constructor + Standard_EXPORT MoniTool_Element(); + //! Returns the HashCode which has been stored by SetHashCode //! (remark that HashCode could be deferred then be defined by //! sub-classes, the result is the same) diff -Nru opencascade-7.4.1+dfsg1/src/MoniTool/MoniTool_Stat.cxx opencascade-7.5.1+dfsg1/src/MoniTool/MoniTool_Stat.cxx --- opencascade-7.4.1+dfsg1/src/MoniTool/MoniTool_Stat.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MoniTool/MoniTool_Stat.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,9 @@ } MoniTool_Stat::MoniTool_Stat (const MoniTool_Stat& ) -{ } + : thelev(0) +{ +} MoniTool_Stat& MoniTool_Stat::Current () { diff -Nru opencascade-7.4.1+dfsg1/src/MoniTool/MoniTool_TypedValue.cxx opencascade-7.5.1+dfsg1/src/MoniTool/MoniTool_TypedValue.cxx --- opencascade-7.4.1+dfsg1/src/MoniTool/MoniTool_TypedValue.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MoniTool/MoniTool_TypedValue.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -11,10 +11,9 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include -#include #include -#include #include #include #include @@ -73,6 +72,7 @@ const MoniTool_ValueType type, const Standard_CString init) : thename (name) , thetype (type) , thelims (0), themaxlen (0) , theintlow (0) , theintup (-1) , + therealow(0.0), therealup(0.0), theinterp (NULL) , thesatisf (NULL) , theival (0), thehval (new TCollection_HAsciiString("")) @@ -228,37 +228,37 @@ // ## Print ## - void MoniTool_TypedValue::Print (const Handle(Message_Messenger)& S) const + void MoniTool_TypedValue::Print (Standard_OStream& S) const { - S<<"--- Typed Value : "< 0) S<<" Label : "< 0) S <<" Label : "<DynamicType()->Name(); + S <<" (type) "<DynamicType()->Name(); if (!thehval.IsNull()) - S<<(thetype == MoniTool_ValueIdent ? " : " : "")<ToCString(); + S <<(thetype == MoniTool_ValueIdent ? " : " : "")<ToCString(); if (HasInterpret()) { - S<<" ("; + S <<" ("; Handle(TCollection_HAsciiString) str = Interpret (thehval,Standard_True); - if (!str.IsNull() && str != thehval) S<<"Native:"<ToCString(); + if (!str.IsNull() && str != thehval) S <<"Native:"<ToCString(); str = Interpret (thehval,Standard_False); - if (!str.IsNull() && str != thehval) S<<" Coded:"<ToCString(); - S<<")"; + if (!str.IsNull() && str != thehval) S <<" Coded:"<ToCString(); + S <<")"; } } - else S<<"(not set)"; + else S <<"(not set)"; } @@ -444,7 +444,9 @@ if (theintup < num) theintup = num; if (theenums->Value(num).Length() == 0) + { theenums->SetValue(num,TCollection_AsciiString(val)); + } // On met AUSSI dans le dictionnaire // else { theeadds.Bind (val,num); diff -Nru opencascade-7.4.1+dfsg1/src/MoniTool/MoniTool_TypedValue.hxx opencascade-7.5.1+dfsg1/src/MoniTool/MoniTool_TypedValue.hxx --- opencascade-7.4.1+dfsg1/src/MoniTool/MoniTool_TypedValue.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/MoniTool/MoniTool_TypedValue.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,8 +37,6 @@ class Standard_Transient; class Standard_ConstructionError; class TCollection_AsciiString; -class Message_Messenger; - class MoniTool_TypedValue; DEFINE_STANDARD_HANDLE(MoniTool_TypedValue, Standard_Transient) @@ -93,10 +91,10 @@ Standard_EXPORT void SetDefinition (const Standard_CString deftext); //! Prints definition, specification, and actual status and value - Standard_EXPORT virtual void Print (const Handle(Message_Messenger)& S) const; + Standard_EXPORT virtual void Print (Standard_OStream& S) const; //! Prints only the Value - Standard_EXPORT void PrintValue (const Handle(Message_Messenger)& S) const; + Standard_EXPORT void PrintValue (Standard_OStream& S) const; //! Completes the definition of a TypedValue by command , //! once created with its type diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/FILES opencascade-7.5.1+dfsg1/src/NCollection/FILES --- opencascade-7.4.1+dfsg1/src/NCollection/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -16,7 +16,6 @@ NCollection_BaseVector.hxx NCollection_Buffer.hxx NCollection_CellFilter.hxx -NCollection_Comparator.hxx NCollection_DataMap.hxx NCollection_DefaultHasher.hxx NCollection_DefineAlloc.hxx diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_AccAllocator.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_AccAllocator.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_AccAllocator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_AccAllocator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -75,7 +75,7 @@ { Standard_Size myValue; public: - AlignedSize(){} + AlignedSize() : myValue(0) {} AlignedSize(const Standard_Size theValue) : myValue((theValue + Align - 1) & ~(Align - 1)) {} operator Standard_Size() const {return myValue;} @@ -86,7 +86,7 @@ { Standard_Byte* myValue; public: - AlignedPtr(){} + AlignedPtr() : myValue(0) {} AlignedPtr(const Standard_Address theValue) : myValue((Standard_Byte*)((Standard_Size)theValue & ~(Align - 1))) {} operator Standard_Address () const {return myValue;} diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Array1.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Array1.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Array1.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Array1.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -88,14 +88,6 @@ myPtrEnd = const_cast (&theArray.Last() + 1); } - //! Assignment - Iterator& operator= (const Iterator& theOther) - { - myPtrCur = theOther.myPtrCur; - myPtrEnd = theOther.myPtrEnd; - return *this; - } - //! Check end Standard_Boolean More (void) const { return myPtrCur < myPtrEnd; } diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_BaseList.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_BaseList.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_BaseList.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_BaseList.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -66,23 +66,13 @@ // ******** More Standard_Boolean More (void) const { return (myCurrent!=NULL); } - // ******** Assignment operator - Iterator& operator= (const Iterator& theIt) - { - if (&theIt != this) - { - myCurrent = theIt.myCurrent; - myPrevious = theIt.myPrevious; - } - return * this; - } -//skt---------------------------------------------------- + // ******** Comparison operator Standard_Boolean operator== (const Iterator& theIt) const { return myCurrent == theIt.myCurrent; } -//------------------------------------------------------- + //! Performs comparison of two iterators Standard_Boolean IsEqual (const Iterator& theOther) const { diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_BaseSequence.cxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_BaseSequence.cxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_BaseSequence.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_BaseSequence.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,12 +20,6 @@ #include #include -inline void NCollection_BaseSequence::Nullify () -{ - myFirstItem = myLastItem = myCurrentItem = NULL; - myCurrentIndex = mySize = 0; -} - //======================================================================= //function : ClearSeq //purpose : removes all items from the current sequence diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_BaseSequence.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_BaseSequence.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_BaseSequence.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_BaseSequence.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -75,13 +75,6 @@ myPrevious = (isStart ? NULL : theSeq.myLastItem); } - //! Assignment - Iterator& operator = (const Iterator& theOther) - { - myCurrent = theOther.myCurrent; - myPrevious = theOther.myPrevious; - return *this; - } //! Switch to previous element; note that it will reset void Previous() { @@ -163,7 +156,12 @@ // Standard_EXPORT NCollection_BaseSequence (const NCollection_BaseSequence& Other); - inline void Nullify (); + void Nullify() + { + myFirstItem = myLastItem = myCurrentItem = NULL; + myCurrentIndex = mySize = 0; + } + friend class Iterator; }; diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_BaseVector.cxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_BaseVector.cxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_BaseVector.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_BaseVector.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,24 +14,11 @@ // commercial license or contractual agreement. #include + #include #include //======================================================================= -//function : NCollection_BaseVector::Iterator::copyV -//purpose : Copy from another iterator -//======================================================================= - -void NCollection_BaseVector::Iterator::copyV (const NCollection_BaseVector::Iterator& theOth) -{ - myVector = theOth.myVector; - myICurBlock = theOth.myICurBlock; - myIEndBlock = theOth.myIEndBlock; - myCurIndex = theOth.myCurIndex; - myEndIndex = theOth.myEndIndex; -} - -//======================================================================= //function : initV //purpose : Initialisation of iterator by a vector //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_BaseVector.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_BaseVector.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_BaseVector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_BaseVector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -79,15 +79,8 @@ initV (theVector, theToEnd); } - Iterator (const Iterator& theVector) - { - copyV (theVector); - } - Standard_EXPORT void initV (const NCollection_BaseVector& theVector, Standard_Boolean theToEnd = Standard_False); - Standard_EXPORT void copyV (const Iterator&); - Standard_Boolean moreV() const { return (myICurBlock < myIEndBlock || myCurIndex < myEndIndex); @@ -136,6 +129,7 @@ return &myVector->myData[myICurBlock]; } + protected: const NCollection_BaseVector* myVector; //!< the Master vector Standard_Integer myICurBlock; //!< # of the current block Standard_Integer myIEndBlock; diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Buffer.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Buffer.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Buffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Buffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #define _NCollection_Buffer_HeaderFile #include +#include #include //! Low-level buffer object. @@ -122,6 +123,15 @@ mySize = 0; } + //! Dumps the content of me into the stream + virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const + { + (void)theDepth; + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myData) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySize) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myAllocator.get()) + } + protected: Standard_Byte* myData; //!< data pointer diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Comparator.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Comparator.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Comparator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Comparator.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -// Created on: 2011-01-27 -// Created by: KGV -// Copyright (c) 2011-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _NCollection_Comparator_HeaderFile -#define _NCollection_Comparator_HeaderFile - -#include - -/** - * Class to define basic compare operations. - * Basic implementation use redirection to standard C++ operators. - * You can use standard C++ templates mechanisms to redefine these methods - * or to inherit basic implementation to create multiple comparators - * for same type with different rules. - */ -template -class NCollection_Comparator -{ -public: - - NCollection_Comparator (const Standard_Real theTolerance = Precision::Confusion()) - : myTolerance (theTolerance) {} - - virtual ~NCollection_Comparator() {} - -public: - //! Comparison functions which should be overridden - //! if standard operators are not defined for user type. - - //! Should return true if Left value is greater than Right - virtual Standard_Boolean IsGreater (const TheItemType& theLeft, const TheItemType& theRight) const - { - return theLeft > theRight; - } - - //! Should return true if values are equal - virtual Standard_Boolean IsEqual (const TheItemType& theLeft, const TheItemType& theRight) const - { - return theLeft == theRight; - } - -public: - //! Comparison functions which may be overridden for performance reasons - - //! Should return true if Left value is lower than Right - virtual Standard_Boolean IsLower (const TheItemType& theLeft, const TheItemType& theRight) const - { - return !IsGreater (theLeft, theRight) && !IsEqual (theLeft, theRight); - } - - virtual Standard_Boolean IsLowerEqual (const TheItemType& theLeft, const TheItemType& theRight) const - { - return !IsGreater (theLeft, theRight); - } - - virtual Standard_Boolean IsGreaterEqual (const TheItemType& theLeft, const TheItemType& theRight) const - { - return IsGreater (theLeft, theRight) || IsEqual (theLeft, theRight); - } - -protected: - - Standard_Real myTolerance; - -}; - -#endif /*_NCollection_Comparator_HeaderFile*/ diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Mat4.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Mat4.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Mat4.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Mat4.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,8 @@ #define _NCollection_Mat4_HeaderFile #include +#include +#include //! Generic matrix of 4 x 4 elements. //! To be used in conjunction with NCollection_Vec4 entities. @@ -461,6 +463,16 @@ return *reinterpret_cast*> (theData); } + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer) const + { + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "NCollection_Mat4", 16, + GetValue (0, 0), GetValue (0, 1), GetValue (0, 2), GetValue (0, 3), + GetValue (1, 0), GetValue (1, 1), GetValue (1, 2), GetValue (1, 3), + GetValue (2, 0), GetValue (2, 1), GetValue (2, 2), GetValue (2, 3), + GetValue (3, 0), GetValue (3, 1), GetValue (3, 2), GetValue (3, 3)) + } + private: Element_t myMat[16]; diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_SparseArrayBase.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_SparseArrayBase.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_SparseArrayBase.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_SparseArrayBase.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -190,8 +190,8 @@ private: // Copy constructor and assignment operator are private thus not accessible - NCollection_SparseArrayBase (const NCollection_SparseArrayBase&) {} - void operator = (const NCollection_SparseArrayBase&) {} + NCollection_SparseArrayBase(const NCollection_SparseArrayBase&); + void operator = (const NCollection_SparseArrayBase&); protected: // Object life diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Vec2.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Vec2.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Vec2.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Vec2.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,8 @@ #include // std::sqrt() +#include + //! Auxiliary macros to define couple of similar access components as vector methods. //! @return 2 components by their names in specified order #define NCOLLECTION_VEC_COMPONENTS_2D(theX, theY) \ @@ -289,6 +291,13 @@ return NCollection_Vec2 (Element_t(0), Element_t(1)); } + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const + { + (void)theDepth; + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "Vec2", 2, v[0], v[1]) + } + private: Element_t v[2]; diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Vec3.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Vec3.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Vec3.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Vec3.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -403,6 +403,13 @@ return NCollection_Vec3 (Element_t(0), Element_t(0), Element_t(1)); } + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const + { + (void)theDepth; + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "Vec3", 3, v[0], v[1], v[2]) + } + private: Element_t v[3]; //!< define the vector as array to avoid structure alignment issues diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Vec4.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Vec4.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Vec4.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Vec4.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -375,6 +375,13 @@ return aResult /= theRight; } + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const + { + (void)theDepth; + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "Vec4", 4, v[0], v[1], v[2], v[3]) + } + private: Element_t v[4]; //!< define the vector as array to avoid structure alignment issues diff -Nru opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Vector.hxx opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Vector.hxx --- opencascade-7.4.1+dfsg1/src/NCollection/NCollection_Vector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NCollection/NCollection_Vector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -61,23 +61,12 @@ Iterator (const NCollection_Vector& theVector, Standard_Boolean theToEnd = Standard_False) : NCollection_BaseVector::Iterator (theVector, theToEnd) {} - //! Copy constructor - Iterator (const Iterator& theOther) - : NCollection_BaseVector::Iterator (theOther) {} - //! Initialisation void Init (const NCollection_Vector& theVector) { initV (theVector); } - //! Assignment - Iterator& operator= (const Iterator& theOther) - { - copyV (theOther); - return *this; - } - //! Check end Standard_Boolean More() const { @@ -102,6 +91,15 @@ offsetV (static_cast(theOffset)); } + // Workaround for a bug (endless compilation) occurred in MS Visual Studio 2019 / Win32 / Release configuration + // with DISABLED Whole Program Optimization (as it is by default in OCCT). The problem is + // at the line std::stable_sort(aPairList.begin(), aPairList.end(), BRepExtrema_CheckPair_Comparator); + // of BRepExtrema_DistShapeShape.cxx source file. + // To enable Whole Program Optimization use command line keys: /GL for compiler and /LTCG for linker. + // Remove this workaround after the bug in VS2019 will be fixed (see OCCT bug #0031628). +#if defined (_MSC_VER) && (_MSC_VER >= 1920) && !defined (_WIN64) && !defined (_DEBUG) + __declspec(noinline) __declspec(deprecated("TODO remove this workaround for VS2019 compiler hanging bug")) +#endif //! Difference operator. ptrdiff_t Differ (const Iterator& theOther) const { diff -Nru opencascade-7.4.1+dfsg1/src/NLPlate/NLPlate_HGPPConstraint.hxx opencascade-7.5.1+dfsg1/src/NLPlate/NLPlate_HGPPConstraint.hxx --- opencascade-7.4.1+dfsg1/src/NLPlate/NLPlate_HGPPConstraint.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/NLPlate/NLPlate_HGPPConstraint.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,6 +42,8 @@ public: + NLPlate_HGPPConstraint() : myActiveOrder(0) {} + Standard_EXPORT virtual void SetUVFreeSliding (const Standard_Boolean UVFree); Standard_EXPORT virtual void SetIncrementalLoadAllowed (const Standard_Boolean ILA); diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/FILES opencascade-7.5.1+dfsg1/src/OpenGl/FILES --- opencascade-7.4.1+dfsg1/src/OpenGl/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -52,8 +52,11 @@ OpenGl_FrameBuffer.cxx OpenGl_Texture.cxx OpenGl_Texture.hxx +OpenGl_TextureFormat.cxx +OpenGl_TextureFormat.hxx OpenGl_TextureSet.cxx OpenGl_TextureSet.hxx +OpenGl_TextureSetPairIterator.hxx OpenGl_Resource.hxx OpenGl_Resource.cxx OpenGl_NamedResource.hxx @@ -74,6 +77,7 @@ OpenGl_Context.hxx OpenGl_Context_1.mm OpenGl_ExtGS.hxx +OpenGl_GLESExtensions.hxx OpenGl_GlFunctions.hxx OpenGl_Flipper.cxx OpenGl_Flipper.hxx @@ -103,6 +107,8 @@ OpenGl_IndexBuffer.cxx OpenGl_IndexBuffer.hxx OpenGl_Layer.hxx +OpenGl_PBREnvironment.cxx +OpenGl_PBREnvironment.hxx OpenGl_RenderFilter.hxx OpenGl_Sampler.cxx OpenGl_Sampler.hxx diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ArbIns.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ArbIns.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ArbIns.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ArbIns.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,12 +19,14 @@ #include //! Instancing is available on OpenGL 3.0+ hardware +//! (in core since OpenGL 3.1 or GL_ARB_draw_instanced extension). +//! +//! Note that this structure does not include glVertexAttribDivisor(), +//! which has been introduced in later OpenGL versions (OpenGL 3.3 or OpenGL ES 3.0). struct OpenGl_ArbIns : protected OpenGl_GlFunctions { -#if !defined(GL_ES_VERSION_2_0) using OpenGl_GlFunctions::glDrawArraysInstanced; using OpenGl_GlFunctions::glDrawElementsInstanced; -#endif }; #endif // _OpenGl_ArbIns_H__ diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Aspects.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Aspects.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Aspects.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Aspects.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -115,10 +115,11 @@ // function : DumpJson // purpose : // ======================================================================= -void OpenGl_Aspects::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void OpenGl_Aspects::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_Aspects); + OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_Aspects) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, OpenGl_Element) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspect.get()); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myShadingModel); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspect.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myShadingModel) } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Aspects.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Aspects.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Aspects.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Aspects.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -90,7 +90,7 @@ virtual void SynchronizeAspects() Standard_OVERRIDE { SetAspect (myAspect); } //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_AspectsSprite.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_AspectsSprite.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_AspectsSprite.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_AspectsSprite.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1767,7 +1767,7 @@ theMarkerSize = Max ((Standard_ShortReal )anImage->Width(),(Standard_ShortReal )anImage->Height()); - aSprite->Init (theCtx, *anImage.operator->(), Graphic3d_TOT_2D); + aSprite->Init (theCtx, *anImage, Graphic3d_TOT_2D, true); if (!hadAlreadyAlpha) { if (anImageA.IsNull() @@ -1778,7 +1778,7 @@ } if (!anImageA.IsNull()) { - aSpriteA->Init (theCtx, *anImageA.operator->(), Graphic3d_TOT_2D); + aSpriteA->Init (theCtx, *anImageA, Graphic3d_TOT_2D, true); } } } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_AspectsTextureSet.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_AspectsTextureSet.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_AspectsTextureSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_AspectsTextureSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -131,6 +131,7 @@ { // just invalidate texture parameters aResource->Sampler()->SetParameters (aTexture->GetParams()); + aResIter.ChangeUnit() = aResource->Sampler()->Parameters()->TextureUnit(); } } } @@ -192,6 +193,9 @@ } } + Standard_Integer& aTextureSetBits = myTextures[0]->ChangeTextureSetBits(); + aTextureSetBits = Graphic3d_TextureSetBits_NONE; + Standard_Integer aPrevTextureUnit = -1; if (theAspect->ToMapTexture()) { Graphic3d_TextureSet::Iterator aTextureIter (aNewTextureSet); @@ -208,6 +212,12 @@ { if (aResource->Init(theCtx, aTexture)) { + aResIter0.ChangeUnit() = aResource->Sampler()->Parameters()->TextureUnit(); + if (aResIter0.Unit() < aPrevTextureUnit) + { + throw Standard_ProgramError("Graphic3d_TextureMap defines texture units in non-ascending order"); + } + aPrevTextureUnit = aResIter0.Unit(); aResource->Sampler()->SetParameters(aTexture->GetParams()); aResource->SetRevision (aTexture->Revision()); } @@ -254,6 +264,19 @@ } aResource->Sampler()->SetParameters (aTexture->GetParams()); } + + // update occupation of texture units + const Graphic3d_TextureUnit aTexUnit = aResource->Sampler()->Parameters()->TextureUnit(); + aResIter0.ChangeUnit() = aTexUnit; + if (aResIter0.Unit() < aPrevTextureUnit) + { + throw Standard_ProgramError("Graphic3d_TextureMap defines texture units in non-ascending order"); + } + aPrevTextureUnit = aResIter0.Unit(); + if (aTexUnit >= Graphic3d_TextureUnit_0 && aTexUnit <= Graphic3d_TextureUnit_5) + { + aTextureSetBits |= (1 << int(aTexUnit)); + } } } } @@ -261,6 +284,8 @@ if (hasSprite) { myTextures[0]->ChangeLast() = theSprite; + myTextures[0]->ChangeLastUnit() = theCtx->SpriteTextureUnit(); + // Graphic3d_TextureUnit_PointSprite if (!theSprite.IsNull()) { theSprite ->Sampler()->Parameters()->SetTextureUnit (theCtx->SpriteTextureUnit()); @@ -275,12 +300,15 @@ return; } + myTextures[1]->ChangeTextureSetBits() = aTextureSetBits; for (OpenGl_TextureSet::Iterator aResIter0 (myTextures[0]), aResIter1 (myTextures[1]); aResIter0.More(); aResIter0.Next(), aResIter1.Next()) { aResIter1.ChangeValue() = aResIter0.Value(); + aResIter1.ChangeUnit() = aResIter0.Unit(); } if (hasSprite) { myTextures[1]->ChangeLast() = theSpriteA; + myTextures[1]->ChangeLastUnit() = theCtx->SpriteTextureUnit(); } } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_BackgroundArray.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_BackgroundArray.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_BackgroundArray.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_BackgroundArray.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,16 +27,12 @@ // ======================================================================= OpenGl_BackgroundArray::OpenGl_BackgroundArray (const Graphic3d_TypeOfBackground theType) : OpenGl_PrimitiveArray (NULL, Graphic3d_TOPA_TRIANGLESTRIPS, NULL, NULL, NULL), - myTrsfPers (Graphic3d_TMF_2d, theType == Graphic3d_TOB_TEXTURE ? Aspect_TOTP_CENTER : Aspect_TOTP_LEFT_LOWER), myType (theType), myFillMethod (Aspect_FM_NONE), myViewWidth (0), myViewHeight (0), myToUpdate (Standard_False) { - Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16); - myAttribs = new Graphic3d_Buffer (anAlloc); - myDrawMode = GL_TRIANGLE_STRIP; myIsFillType = true; @@ -140,11 +136,12 @@ // ======================================================================= Standard_Boolean OpenGl_BackgroundArray::init (const Handle(OpenGl_Workspace)& theWorkspace) const { + const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext(); switch (myType) { case Graphic3d_TOB_GRADIENT: { - if (!createGradientArray()) + if (!createGradientArray (aCtx)) { return Standard_False; } @@ -174,7 +171,6 @@ } // Init VBO - const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext(); if (myIsVboInit) { clearMemoryGL (aCtx); @@ -191,7 +187,7 @@ // method : createGradientArray // purpose : // ======================================================================= -Standard_Boolean OpenGl_BackgroundArray::createGradientArray() const +Standard_Boolean OpenGl_BackgroundArray::createGradientArray (const Handle(OpenGl_Context)& theCtx) const { // Initialize data for primitive array Graphic3d_Attribute aGragientAttribInfo[] = @@ -200,6 +196,11 @@ { Graphic3d_TOA_COLOR, Graphic3d_TOD_VEC3 } }; + if (myAttribs.IsNull()) + { + Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16); + myAttribs = new Graphic3d_Buffer (anAlloc); + } if (!myAttribs->Init (4, aGragientAttribInfo, 2)) { return Standard_False; @@ -311,7 +312,7 @@ *aVertData = aVertices[anIt]; OpenGl_Vec3* aColorData = reinterpret_cast(myAttribs->changeValue (anIt) + myAttribs->AttributeOffset (1)); - *aColorData = OpenGl_Vec3(aCorners[anIt][0], aCorners[anIt][1], aCorners[anIt][2]); + *aColorData = theCtx->Vec4FromQuantityColor (OpenGl_Vec4(aCorners[anIt][0], aCorners[anIt][1], aCorners[anIt][2], 1.0f)).rgb(); } return Standard_True; @@ -329,6 +330,11 @@ { Graphic3d_TOA_UV, Graphic3d_TOD_VEC2 } }; + if (myAttribs.IsNull()) + { + Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16); + myAttribs = new Graphic3d_Buffer (anAlloc); + } if (!myAttribs->Init (4, aTextureAttribInfo, 2)) { return Standard_False; @@ -392,21 +398,40 @@ // ======================================================================= Standard_Boolean OpenGl_BackgroundArray::createCubeMapArray() const { - Graphic3d_Attribute aCubeMapAttribInfo[] = + const Graphic3d_Attribute aCubeMapAttribInfo[] = { - { Graphic3d_TOA_POS, Graphic3d_TOD_VEC2} + { Graphic3d_TOA_POS, Graphic3d_TOD_VEC3 } }; - if (!myAttribs->Init(4, aCubeMapAttribInfo, 1)) + if (myAttribs.IsNull()) + { + Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16); + myAttribs = new Graphic3d_Buffer (anAlloc); + myIndices = new Graphic3d_IndexBuffer (anAlloc); + } + if (!myAttribs->Init (8, aCubeMapAttribInfo, 1) + || !myIndices->Init (14)) { return Standard_False; } - OpenGl_Vec2* aData = reinterpret_cast(myAttribs->changeValue(0)); - - for (unsigned int i = 0; i < 4; ++i) { - aData[i] = (OpenGl_Vec2(Standard_ShortReal(i / 2), Standard_ShortReal(i % 2)) - OpenGl_Vec2(0.5f)) * 2.f; + OpenGl_Vec3* aData = reinterpret_cast(myAttribs->changeValue(0)); + aData[0].SetValues (-1.0, -1.0, 1.0); + aData[1].SetValues ( 1.0, -1.0, 1.0); + aData[2].SetValues (-1.0, 1.0, 1.0); + aData[3].SetValues ( 1.0, 1.0, 1.0); + aData[4].SetValues (-1.0, -1.0, -1.0); + aData[5].SetValues ( 1.0, -1.0, -1.0); + aData[6].SetValues (-1.0, 1.0, -1.0); + aData[7].SetValues ( 1.0, 1.0, -1.0); + } + { + const unsigned short THE_BOX_TRISTRIP[14] = { 0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1 }; + for (unsigned int aVertIter = 0; aVertIter < 14; ++aVertIter) + { + myIndices->SetIndex (aVertIter, THE_BOX_TRISTRIP[aVertIter]); + } } return Standard_True; @@ -416,19 +441,27 @@ // method : Render // purpose : // ======================================================================= -void OpenGl_BackgroundArray::Render (const Handle(OpenGl_Workspace)& theWorkspace) const +void OpenGl_BackgroundArray::Render (const Handle(OpenGl_Workspace)& theWorkspace, + Graphic3d_Camera::Projection theProjection) const { const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext(); Standard_Integer aViewSizeX = aCtx->Viewport()[2]; Standard_Integer aViewSizeY = aCtx->Viewport()[3]; + Graphic3d_Vec2i aTileOffset, aTileSize; + if (theWorkspace->View()->Camera()->Tile().IsValid()) { aViewSizeX = theWorkspace->View()->Camera()->Tile().TotalSize.x(); aViewSizeY = theWorkspace->View()->Camera()->Tile().TotalSize.y(); + + aTileOffset = theWorkspace->View()->Camera()->Tile().OffsetLowerLeft(); + aTileSize = theWorkspace->View()->Camera()->Tile().TileSize; } if (myToUpdate || myViewWidth != aViewSizeX - || myViewHeight != aViewSizeY) + || myViewHeight != aViewSizeY + || myAttribs.IsNull() + || myVboAttribs.IsNull()) { myViewWidth = aViewSizeX; myViewHeight = aViewSizeY; @@ -438,10 +471,71 @@ OpenGl_Mat4 aProjection = aCtx->ProjectionState.Current(); OpenGl_Mat4 aWorldView = aCtx->WorldViewState.Current(); - if (myType != Graphic3d_TOB_CUBEMAP) + if (myType == Graphic3d_TOB_CUBEMAP) + { + Graphic3d_Camera aCamera (theWorkspace->View()->Camera()); + aCamera.SetZRange (0.01, 1.0); // is needed to avoid perspective camera exception + + // cancel translation + aCamera.MoveEyeTo (gp_Pnt (0.0, 0.0, 0.0)); + + // Handle projection matrix: + // - Cancel any head-to-eye translation for HMD display; + // - Ignore stereoscopic projection in case of non-HMD 3D display + // (ideally, we would need a stereoscopic cubemap image; adding a parallax makes no sense); + // - Force perspective projection when orthographic camera is active + // (orthographic projection makes no sense for cubemap). + const bool isCustomProj = aCamera.IsCustomStereoFrustum() + || aCamera.IsCustomStereoProjection(); + aCamera.SetProjectionType (theProjection == Graphic3d_Camera::Projection_Orthographic || !isCustomProj + ? Graphic3d_Camera::Projection_Perspective + : theProjection); + + aProjection = aCamera.ProjectionMatrixF(); + aWorldView = aCamera.OrientationMatrixF(); + if (isCustomProj) + { + // get projection matrix without pre-multiplied stereoscopic head-to-eye translation + if (theProjection == Graphic3d_Camera::Projection_MonoLeftEye) + { + Graphic3d_Mat4 aMatProjL, aMatHeadToEyeL, aMatProjR, aMatHeadToEyeR; + aCamera.StereoProjectionF (aMatProjL, aMatHeadToEyeL, aMatProjR, aMatHeadToEyeR); + aProjection = aMatProjL; + } + else if (theProjection == Graphic3d_Camera::Projection_MonoRightEye) + { + Graphic3d_Mat4 aMatProjL, aMatHeadToEyeL, aMatProjR, aMatHeadToEyeR; + aCamera.StereoProjectionF (aMatProjL, aMatHeadToEyeL, aMatProjR, aMatHeadToEyeR); + aProjection = aMatProjR; + } + } + } + else { - myTrsfPers.Apply(theWorkspace->View()->Camera(), aProjection, aWorldView, - aCtx->Viewport()[2], aCtx->Viewport()[3]); + aProjection.InitIdentity(); + aWorldView.InitIdentity(); + if (theWorkspace->View()->Camera()->Tile().IsValid()) + { + aWorldView.SetDiagonal (OpenGl_Vec4 (2.0f / aTileSize.x(), 2.0f / aTileSize.y(), 1.0f, 1.0f)); + if (myType == Graphic3d_TOB_GRADIENT) + { + aWorldView.SetColumn (3, OpenGl_Vec4 (-1.0f - 2.0f * aTileOffset.x() / aTileSize.x(), + -1.0f - 2.0f * aTileOffset.y() / aTileSize.y(), 0.0f, 1.0f)); + } + else + { + aWorldView.SetColumn (3, OpenGl_Vec4 (-1.0f + (float) aViewSizeX / aTileSize.x() - 2.0f * aTileOffset.x() / aTileSize.x(), + -1.0f + (float) aViewSizeY / aTileSize.y() - 2.0f * aTileOffset.y() / aTileSize.y(), 0.0f, 1.0f)); + } + } + else + { + aWorldView.SetDiagonal (OpenGl_Vec4 (2.0f / myViewWidth, 2.0f / myViewHeight, 1.0f, 1.0f)); + if (myType == Graphic3d_TOB_GRADIENT) + { + aWorldView.SetColumn (3, OpenGl_Vec4 (-1.0f, -1.0f, 0.0f, 1.0f)); + } + } } aCtx->ProjectionState.Push(); diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_BackgroundArray.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_BackgroundArray.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_BackgroundArray.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_BackgroundArray.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,8 @@ Standard_EXPORT OpenGl_BackgroundArray (const Graphic3d_TypeOfBackground theType); //! Render primitives to the window - Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE; + Standard_EXPORT void Render (const Handle(OpenGl_Workspace)& theWorkspace, + Graphic3d_Camera::Projection theProjection) const; //! Check if background parameters are set properly Standard_EXPORT bool IsDefined() const; @@ -79,7 +80,7 @@ Standard_EXPORT Standard_Boolean init (const Handle(OpenGl_Workspace)& theWorkspace) const; //! Initializes gradient arrays. - Standard_EXPORT Standard_Boolean createGradientArray() const; + Standard_EXPORT Standard_Boolean createGradientArray (const Handle(OpenGl_Context)& theCtx) const; //! Initializes texture arrays. //! @param theWorkspace OpenGl workspace that stores texture in the current enabled face aspect. @@ -92,9 +93,10 @@ //! on next rendering stage array data is to be updated. Standard_EXPORT void invalidateData(); + using OpenGl_PrimitiveArray::Render; + protected: - Graphic3d_TransformPers myTrsfPers; //!< transformation persistence Graphic3d_TypeOfBackground myType; //!< Type of background: texture or gradient. Aspect_FillMethod myFillMethod; //!< Texture parameters mutable OpenGl_GradientParameters myGradientParams; //!< Gradient parameters diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Caps.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Caps.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Caps.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Caps.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,7 +17,6 @@ #include - IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Caps,Standard_Transient) // ======================================================================= @@ -25,7 +24,9 @@ // purpose : // ======================================================================= OpenGl_Caps::OpenGl_Caps() -: vboDisable (Standard_False), +: sRGBDisable (Standard_False), + compressedTexturesDisable (Standard_False), + vboDisable (Standard_False), pntSpritesDisable (Standard_False), keepArrayData (Standard_False), ffpEnable (Standard_False), @@ -54,6 +55,7 @@ contextNoExtensions (Standard_False), contextMajorVersionUpper (-1), contextMinorVersionUpper (-1), + isTopDownTextureUV(Standard_False), glslWarnings (Standard_False), suppressExtraMsg (Standard_True), glslDumpLevel (OpenGl_ShaderProgramDumpLevel_Off) @@ -67,6 +69,8 @@ // ======================================================================= OpenGl_Caps& OpenGl_Caps::operator= (const OpenGl_Caps& theCopy) { + sRGBDisable = theCopy.sRGBDisable; + compressedTexturesDisable = theCopy.compressedTexturesDisable; vboDisable = theCopy.vboDisable; pntSpritesDisable = theCopy.pntSpritesDisable; keepArrayData = theCopy.keepArrayData; @@ -82,6 +86,7 @@ contextNoExtensions = theCopy.contextNoExtensions; contextMajorVersionUpper = theCopy.contextMajorVersionUpper; contextMinorVersionUpper = theCopy.contextMinorVersionUpper; + isTopDownTextureUV = theCopy.isTopDownTextureUV; glslWarnings = theCopy.glslWarnings; suppressExtraMsg = theCopy.suppressExtraMsg; glslDumpLevel = theCopy.glslDumpLevel; diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Caps.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Caps.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Caps.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Caps.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,9 @@ public: //! @name flags to disable particular functionality, should be used only for testing purposes! - Standard_Boolean vboDisable; //!< flag permits VBO usage, will significantly affect performance (OFF by default) + Standard_Boolean sRGBDisable; //!< Disables sRGB rendering (OFF by default) + Standard_Boolean compressedTexturesDisable; //!< Disables uploading of compressed texture formats native to GPU (OFF by default) + Standard_Boolean vboDisable; //!< disallow VBO usage for debugging purposes (OFF by default) Standard_Boolean pntSpritesDisable; //!< flag permits Point Sprites usage, will significantly affect performance (OFF by default) Standard_Boolean keepArrayData; //!< Disables freeing CPU memory after building VBOs (OFF by default) Standard_Boolean ffpEnable; //!< Enables FFP (fixed-function pipeline), do not use built-in GLSL programs (OFF by default) @@ -124,6 +126,19 @@ Standard_Integer contextMajorVersionUpper; Standard_Integer contextMinorVersionUpper; + /** + * Define if 2D texture UV coordinates are defined top-down or bottom-up. FALSE by default. + * + * Proper rendering requires image texture uploading and UV texture coordinates being consistent, + * otherwise texture mapping might appear vertically flipped. + * Historically, OCCT used image library loading images bottom-up, + * so that applications have to generate UV accordingly (flip V when necessary, V' = 1.0 - V). + * + * Graphic driver now compares this flag with image layout reported by Image_PixMap::IsTopDown(), + * and in case of mismatch applies implicit texture coordinates conversion in GLSL program. + */ + Standard_Boolean isTopDownTextureUV; + public: //! @name flags to activate verbose output //! Print GLSL program compilation/linkage warnings, if any. OFF by default. diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Context.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Context.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Context.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Context.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,16 +31,17 @@ #include #include #include +#include #include #include + #include #include - +#include #include - #include - #include +#include IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Context,Standard_Transient) @@ -63,6 +64,30 @@ #include // glXGetProcAddress() #endif +#ifdef __EMSCRIPTEN__ + #include + #include + + //! Check if WebGL extension is available and activate it + //! (usage of extension without activation will generate errors). + static bool checkEnableWebGlExtension (const OpenGl_Context& theCtx, + const char* theExtName) + { + if (!theCtx.CheckExtension (theExtName)) + { + return false; + } + if (EMSCRIPTEN_WEBGL_CONTEXT_HANDLE aWebGlCtx = emscripten_webgl_get_current_context()) + { + if (emscripten_webgl_enable_extension (aWebGlCtx, theExtName)) + { + return true; + } + } + return false; + } +#endif + namespace { static const Handle(OpenGl_Resource) NULL_GL_RESOURCE; @@ -97,6 +122,8 @@ core15fwd (NULL), core20 (NULL), core20fwd (NULL), + core30 (NULL), + core30fwd (NULL), core32 (NULL), core32back (NULL), core33 (NULL), @@ -112,15 +139,23 @@ core45 (NULL), core45back (NULL), caps (!theCaps.IsNull() ? theCaps : new OpenGl_Caps()), + hasGetBufferData (Standard_False), #if defined(GL_ES_VERSION_2_0) hasHighp (Standard_False), hasUintIndex(Standard_False), hasTexRGBA8(Standard_False), - hasFlatShading (OpenGl_FeatureNotAvailable), #else hasHighp (Standard_True), hasUintIndex(Standard_True), hasTexRGBA8(Standard_True), +#endif + hasTexFloatLinear (Standard_False), + hasTexSRGB (Standard_False), + hasFboSRGB (Standard_False), + hasSRGBControl (Standard_False), +#if defined(GL_ES_VERSION_2_0) + hasFlatShading (OpenGl_FeatureNotAvailable), +#else hasFlatShading (OpenGl_FeatureInCore), #endif hasGlslBitwiseOps (OpenGl_FeatureNotAvailable), @@ -158,6 +193,7 @@ myClippingState (), myGlLibHandle (NULL), myFuncs (new OpenGl_GlFunctions()), + mySupportedFormats (new Image_SupportedFormats()), myAnisoMax (1), myTexClamp (GL_CLAMP_TO_EDGE), myMaxTexDim (1024), @@ -174,19 +210,28 @@ myIsInitialized (Standard_False), myIsStereoBuffers (Standard_False), myIsGlNormalizeEnabled (Standard_False), - mySpriteTexUnit (Graphic3d_TextureUnit_0), + mySpriteTexUnit (Graphic3d_TextureUnit_PointSprite), myHasRayTracing (Standard_False), myHasRayTracingTextures (Standard_False), myHasRayTracingAdaptiveSampling (Standard_False), myHasRayTracingAdaptiveSamplingAtomic (Standard_False), + myHasPBR (Standard_False), + myPBREnvLUTTexUnit (Graphic3d_TextureUnit_PbrEnvironmentLUT), + myPBRDiffIBLMapSHTexUnit (Graphic3d_TextureUnit_PbrIblDiffuseSH), + myPBRSpecIBLMapTexUnit (Graphic3d_TextureUnit_PbrIblSpecular), myFrameStats (new OpenGl_FrameStats()), + myActiveMockTextures (0), + myActiveHatchType (Aspect_HS_SOLID), + myHatchIsEnabled (false), #if !defined(GL_ES_VERSION_2_0) myPointSpriteOrig (GL_UPPER_LEFT), myRenderMode (GL_RENDER), + myShadeModel (GL_SMOOTH), myPolygonMode (GL_FILL), #else myPointSpriteOrig (0), myRenderMode (0), + myShadeModel (0), myPolygonMode (0), #endif myToCullBackFaces (false), @@ -195,7 +240,8 @@ myDefaultVao (0), myColorMask (true), myAlphaToCoverage (false), - myIsGlDebugCtx (Standard_False), + myIsGlDebugCtx (false), + myIsSRgbWindow (false), myResolution (Graphic3d_RenderingParams::THE_DEFAULT_RESOLUTION), myResolutionRatio (1.0f), myLineWidthScale (1.0f), @@ -272,6 +318,18 @@ myDefaultVao = 0; #endif + // release mock textures + if (!myTextureRgbaBlack.IsNull()) + { + myTextureRgbaBlack->Release (this); + myTextureRgbaBlack.Nullify(); + } + if (!myTextureRgbaWhite.IsNull()) + { + myTextureRgbaWhite->Release (this); + myTextureRgbaWhite.Nullify(); + } + // release default FBO if (!myDefaultFbo.IsNull()) { @@ -465,6 +523,35 @@ } // ======================================================================= +// function : SetFrameBufferSRGB +// purpose : +// ======================================================================= +void OpenGl_Context::SetFrameBufferSRGB (bool theIsFbo, bool theIsFboSRgb) +{ + if (!hasFboSRGB) + { + myIsSRgbActive = false; + return; + } + myIsSRgbActive = ToRenderSRGB() + && (theIsFbo || myIsSRgbWindow) + && theIsFboSRgb; + if (!hasSRGBControl) + { + return; + } + + if (myIsSRgbActive) + { + core11fwd->glEnable (GL_FRAMEBUFFER_SRGB); + } + else + { + core11fwd->glDisable (GL_FRAMEBUFFER_SRGB); + } +} + +// ======================================================================= // function : SetCullBackFaces // purpose : // ======================================================================= @@ -498,6 +585,7 @@ if (core11 != NULL) { ::glGetIntegerv (GL_RENDER_MODE, &myRenderMode); + ::glGetIntegerv (GL_SHADE_MODEL, &myShadeModel); } // cache read buffers state @@ -968,31 +1056,46 @@ theGlVerMajor = 0; theGlVerMinor = 0; -#ifdef GL_MAJOR_VERSION - // available since OpenGL 3.0 and OpenGL 3.0 ES - GLint aMajor = 0, aMinor = 0; - glGetIntegerv (GL_MAJOR_VERSION, &aMajor); - glGetIntegerv (GL_MINOR_VERSION, &aMinor); - // glGetError() sometimes does not report an error here even if - // GL does not know GL_MAJOR_VERSION and GL_MINOR_VERSION constants. - // This happens on some renderers like e.g. Cygwin MESA. - // Thus checking additionally if GL has put anything to - // the output variables. - if (::glGetError() == GL_NO_ERROR && aMajor != 0 && aMinor != 0) + bool toCheckVer3 = true; +#if defined(__EMSCRIPTEN__) + // WebGL 1.0 prints annoying invalid enumeration warnings to console. + toCheckVer3 = false; + if (EMSCRIPTEN_WEBGL_CONTEXT_HANDLE aWebGlCtx = emscripten_webgl_get_current_context()) { - theGlVerMajor = aMajor; - theGlVerMinor = aMinor; - return; + EmscriptenWebGLContextAttributes anAttribs = {}; + if (emscripten_webgl_get_context_attributes (aWebGlCtx, &anAttribs) == EMSCRIPTEN_RESULT_SUCCESS) + { + toCheckVer3 = anAttribs.majorVersion >= 2; + } } - for (GLenum anErr = ::glGetError(), aPrevErr = GL_NO_ERROR;; aPrevErr = anErr, anErr = ::glGetError()) +#endif + + // Available since OpenGL 3.0 and OpenGL ES 3.0. + if (toCheckVer3) { - if (anErr == GL_NO_ERROR - || anErr == aPrevErr) + GLint aMajor = 0, aMinor = 0; + glGetIntegerv (GL_MAJOR_VERSION, &aMajor); + glGetIntegerv (GL_MINOR_VERSION, &aMinor); + // glGetError() sometimes does not report an error here even if + // GL does not know GL_MAJOR_VERSION and GL_MINOR_VERSION constants. + // This happens on some renderers like e.g. Cygwin MESA. + // Thus checking additionally if GL has put anything to + // the output variables. + if (::glGetError() == GL_NO_ERROR && aMajor != 0 && aMinor != 0) { - break; + theGlVerMajor = aMajor; + theGlVerMinor = aMinor; + return; + } + for (GLenum anErr = ::glGetError(), aPrevErr = GL_NO_ERROR;; aPrevErr = anErr, anErr = ::glGetError()) + { + if (anErr == GL_NO_ERROR + || anErr == aPrevErr) + { + break; + } } } -#endif // Read version string. // Notice that only first two numbers split by point '2.1 XXXXX' are significant. @@ -1224,6 +1327,14 @@ myVendor = (const char* )::glGetString (GL_VENDOR); myVendor.LowerCase(); + // standard formats + mySupportedFormats->Clear(); + mySupportedFormats->Add (Image_PixMap::ImgGray); + mySupportedFormats->Add (Image_PixMap::ImgAlpha); + mySupportedFormats->Add (Image_PixMap::ImgRGB); + mySupportedFormats->Add (Image_PixMap::ImgRGB32); + mySupportedFormats->Add (Image_PixMap::ImgRGBA); + if (caps->contextMajorVersionUpper != -1) { // synthetically restrict OpenGL version for testing @@ -1318,6 +1429,8 @@ core15fwd = NULL; core20 = NULL; core20fwd = NULL; + core30 = NULL; + core30fwd = NULL; core32 = NULL; core32back = NULL; core33 = NULL; @@ -1349,6 +1462,9 @@ hasTexRGBA8 = IsGlGreaterEqual (3, 0) || CheckExtension ("GL_OES_rgb8_rgba8"); + hasTexSRGB = IsGlGreaterEqual (3, 0); + hasFboSRGB = IsGlGreaterEqual (3, 0); + hasSRGBControl = CheckExtension ("GL_EXT_sRGB_write_control"); // NPOT textures has limited support within OpenGL ES 2.0 // which are relaxed by OpenGL ES 3.0 or some extensions //arbNPTW = IsGlGreaterEqual (3, 0) @@ -1361,6 +1477,20 @@ extAnis = CheckExtension ("GL_EXT_texture_filter_anisotropic"); extPDS = IsGlGreaterEqual (3, 0) || CheckExtension ("GL_OES_packed_depth_stencil"); +#ifdef __EMSCRIPTEN__ + if (!extPDS + && checkEnableWebGlExtension (*this, "GL_WEBGL_depth_texture")) + { + extPDS = true; // WebGL 1.0 extension (in WebGL 2.0 core) + } +#endif + + if (extBgra) + { + // no BGR on OpenGL ES - only BGRA as extension + mySupportedFormats->Add (Image_PixMap::ImgBGR32); + mySupportedFormats->Add (Image_PixMap::ImgBGRA); + } core11fwd = (OpenGl_GlCore11Fwd* )(&(*myFuncs)); if (IsGlGreaterEqual (2, 0)) @@ -1415,25 +1545,244 @@ hasHighp = Standard_True; } - arbTexFloat = IsGlGreaterEqual (3, 0) - && FindProcShort (glTexImage3D); - - const Standard_Boolean hasTexBuffer32 = IsGlGreaterEqual (3, 2) && FindProcShort (glTexBuffer); - const Standard_Boolean hasExtTexBuffer = CheckExtension ("GL_EXT_texture_buffer") && FindProc ("glTexBufferEXT", myFuncs->glTexBuffer); + arbTexFloat = (IsGlGreaterEqual (3, 0) + && FindProcShort (glTexImage3D)) + || CheckExtension ("GL_OES_texture_float"); + hasTexFloatLinear = arbTexFloat + && CheckExtension ("GL_OES_texture_float_linear"); + const bool hasTexBuffer32 = IsGlGreaterEqual (3, 2) && FindProcShort (glTexBuffer); + const bool hasExtTexBuffer = CheckExtension ("GL_EXT_texture_buffer") && FindProc ("glTexBufferEXT", myFuncs->glTexBuffer); if (hasTexBuffer32 || hasExtTexBuffer) { arbTBO = reinterpret_cast (myFuncs.get()); } + bool hasInstanced = IsGlGreaterEqual (3, 0) + && FindProcShort (glVertexAttribDivisor) + && FindProcShort (glDrawArraysInstanced) + && FindProcShort (glDrawElementsInstanced); + if (!hasInstanced) + { + hasInstanced = CheckExtension ("GL_ANGLE_instanced_arrays") + && FindProc ("glVertexAttribDivisorANGLE", myFuncs->glVertexAttribDivisor) + && FindProc ("glDrawArraysInstancedANGLE", myFuncs->glDrawArraysInstanced) + && FindProc ("glDrawElementsInstancedANGLE", myFuncs->glDrawElementsInstanced); + } + if (hasInstanced) + { + arbIns = (OpenGl_ArbIns* )(&(*myFuncs)); + } + + const bool hasVAO = IsGlGreaterEqual (3, 0) + && FindProcShort (glBindVertexArray) + && FindProcShort (glDeleteVertexArrays) + && FindProcShort (glGenVertexArrays) + && FindProcShort (glIsVertexArray); +#ifndef __EMSCRIPTEN__ // latest Emscripten does not pretend having / simulating mapping buffer functions + const bool hasMapBufferRange = IsGlGreaterEqual (3, 0) + && FindProcShort (glMapBufferRange) + && FindProcShort (glUnmapBuffer) + && FindProcShort (glGetBufferPointerv) + && FindProcShort (glFlushMappedBufferRange); +#endif + + // load OpenGL ES 3.0 new functions + const bool has30es = IsGlGreaterEqual (3, 0) + && hasVAO + #ifndef __EMSCRIPTEN__ + && hasMapBufferRange + #endif + && hasInstanced + && arbSamplerObject != NULL + && arbFBOBlit != NULL + && FindProcShort (glReadBuffer) + && FindProcShort (glDrawRangeElements) + && FindProcShort (glTexImage3D) + && FindProcShort (glTexSubImage3D) + && FindProcShort (glCopyTexSubImage3D) + && FindProcShort (glCompressedTexImage3D) + && FindProcShort (glCompressedTexSubImage3D) + && FindProcShort (glGenQueries) + && FindProcShort (glDeleteQueries) + && FindProcShort (glIsQuery) + && FindProcShort (glBeginQuery) + && FindProcShort (glEndQuery) + && FindProcShort (glGetQueryiv) + && FindProcShort (glGetQueryObjectuiv) + && FindProcShort (glDrawBuffers) + && FindProcShort (glUniformMatrix2x3fv) + && FindProcShort (glUniformMatrix3x2fv) + && FindProcShort (glUniformMatrix2x4fv) + && FindProcShort (glUniformMatrix4x2fv) + && FindProcShort (glUniformMatrix3x4fv) + && FindProcShort (glUniformMatrix4x3fv) + && FindProcShort (glRenderbufferStorageMultisample) + && FindProcShort (glFramebufferTextureLayer) + && FindProcShort (glGetIntegeri_v) + && FindProcShort (glBeginTransformFeedback) + && FindProcShort (glEndTransformFeedback) + && FindProcShort (glBindBufferRange) + && FindProcShort (glBindBufferBase) + && FindProcShort (glTransformFeedbackVaryings) + && FindProcShort (glGetTransformFeedbackVarying) + && FindProcShort (glVertexAttribIPointer) + && FindProcShort (glGetVertexAttribIiv) + && FindProcShort (glGetVertexAttribIuiv) + && FindProcShort (glVertexAttribI4i) + && FindProcShort (glVertexAttribI4ui) + && FindProcShort (glVertexAttribI4iv) + && FindProcShort (glVertexAttribI4uiv) + && FindProcShort (glGetUniformuiv) + && FindProcShort (glGetFragDataLocation) + && FindProcShort (glUniform1ui) + && FindProcShort (glUniform2ui) + && FindProcShort (glUniform3ui) + && FindProcShort (glUniform4ui) + && FindProcShort (glUniform1uiv) + && FindProcShort (glUniform2uiv) + && FindProcShort (glUniform3uiv) + && FindProcShort (glUniform4uiv) + && FindProcShort (glClearBufferiv) + && FindProcShort (glClearBufferuiv) + && FindProcShort (glClearBufferfv) + && FindProcShort (glClearBufferfi) + && FindProcShort (glGetStringi) + && FindProcShort (glCopyBufferSubData) + && FindProcShort (glGetUniformIndices) + && FindProcShort (glGetActiveUniformsiv) + && FindProcShort (glGetUniformBlockIndex) + && FindProcShort (glGetActiveUniformBlockiv) + && FindProcShort (glGetActiveUniformBlockName) + && FindProcShort (glUniformBlockBinding) + && FindProcShort (glFenceSync) + && FindProcShort (glIsSync) + && FindProcShort (glDeleteSync) + && FindProcShort (glClientWaitSync) + && FindProcShort (glWaitSync) + && FindProcShort (glGetInteger64v) + && FindProcShort (glGetSynciv) + && FindProcShort (glGetInteger64i_v) + && FindProcShort (glGetBufferParameteri64v) + && FindProcShort (glBindTransformFeedback) + && FindProcShort (glDeleteTransformFeedbacks) + && FindProcShort (glGenTransformFeedbacks) + && FindProcShort (glIsTransformFeedback) + && FindProcShort (glPauseTransformFeedback) + && FindProcShort (glResumeTransformFeedback) + && FindProcShort (glGetProgramBinary) + && FindProcShort (glProgramBinary) + && FindProcShort (glProgramParameteri) + && FindProcShort (glInvalidateFramebuffer) + && FindProcShort (glInvalidateSubFramebuffer) + && FindProcShort (glTexStorage2D) + && FindProcShort (glTexStorage3D) + && FindProcShort (glGetInternalformativ); + if (!has30es) + { + checkWrongVersion (3, 0, aLastFailedProc); + } + else + { + core30 = (OpenGl_GlCore30* )(&(*myFuncs)); + core30fwd = (OpenGl_GlCore30Fwd* )(&(*myFuncs)); + hasGetBufferData = true; + } + + // load OpenGL ES 3.1 new functions + const bool has31es = IsGlGreaterEqual (3, 1) + && has30es + && FindProcShort (glDispatchCompute) + && FindProcShort (glDispatchComputeIndirect) + && FindProcShort (glDrawArraysIndirect) + && FindProcShort (glDrawElementsIndirect) + && FindProcShort (glFramebufferParameteri) + && FindProcShort (glGetFramebufferParameteriv) + && FindProcShort (glGetProgramInterfaceiv) + && FindProcShort (glGetProgramResourceIndex) + && FindProcShort (glGetProgramResourceName) + && FindProcShort (glGetProgramResourceiv) + && FindProcShort (glGetProgramResourceLocation) + && FindProcShort (glUseProgramStages) + && FindProcShort (glActiveShaderProgram) + && FindProcShort (glCreateShaderProgramv) + && FindProcShort (glBindProgramPipeline) + && FindProcShort (glDeleteProgramPipelines) + && FindProcShort (glGenProgramPipelines) + && FindProcShort (glIsProgramPipeline) + && FindProcShort (glGetProgramPipelineiv) + && FindProcShort (glProgramUniform1i) + && FindProcShort (glProgramUniform2i) + && FindProcShort (glProgramUniform3i) + && FindProcShort (glProgramUniform4i) + && FindProcShort (glProgramUniform1ui) + && FindProcShort (glProgramUniform2ui) + && FindProcShort (glProgramUniform3ui) + && FindProcShort (glProgramUniform4ui) + && FindProcShort (glProgramUniform1f) + && FindProcShort (glProgramUniform2f) + && FindProcShort (glProgramUniform3f) + && FindProcShort (glProgramUniform4f) + && FindProcShort (glProgramUniform1iv) + && FindProcShort (glProgramUniform2iv) + && FindProcShort (glProgramUniform3iv) + && FindProcShort (glProgramUniform4iv) + && FindProcShort (glProgramUniform1uiv) + && FindProcShort (glProgramUniform2uiv) + && FindProcShort (glProgramUniform3uiv) + && FindProcShort (glProgramUniform4uiv) + && FindProcShort (glProgramUniform1fv) + && FindProcShort (glProgramUniform2fv) + && FindProcShort (glProgramUniform3fv) + && FindProcShort (glProgramUniform4fv) + && FindProcShort (glProgramUniformMatrix2fv) + && FindProcShort (glProgramUniformMatrix3fv) + && FindProcShort (glProgramUniformMatrix4fv) + && FindProcShort (glProgramUniformMatrix2x3fv) + && FindProcShort (glProgramUniformMatrix3x2fv) + && FindProcShort (glProgramUniformMatrix2x4fv) + && FindProcShort (glProgramUniformMatrix4x2fv) + && FindProcShort (glProgramUniformMatrix3x4fv) + && FindProcShort (glProgramUniformMatrix4x3fv) + && FindProcShort (glValidateProgramPipeline) + && FindProcShort (glGetProgramPipelineInfoLog) + && FindProcShort (glBindImageTexture) + && FindProcShort (glGetBooleani_v) + && FindProcShort (glMemoryBarrier) + && FindProcShort (glMemoryBarrierByRegion) + && FindProcShort (glTexStorage2DMultisample) + && FindProcShort (glGetMultisamplefv) + && FindProcShort (glSampleMaski) + && FindProcShort (glGetTexLevelParameteriv) + && FindProcShort (glGetTexLevelParameterfv) + && FindProcShort (glBindVertexBuffer) + && FindProcShort (glVertexAttribFormat) + && FindProcShort (glVertexAttribIFormat) + && FindProcShort (glVertexAttribBinding) + && FindProcShort (glVertexBindingDivisor); + if (!has31es) + { + checkWrongVersion (3, 1, aLastFailedProc); + } + // initialize debug context extension - if (CheckExtension ("GL_KHR_debug")) + if (IsGlGreaterEqual (3, 2) + || CheckExtension ("GL_KHR_debug")) { // this functionality become a part of OpenGL ES 3.2 arbDbg = NULL; + if (IsGlGreaterEqual (3, 2) + && FindProcShort (glDebugMessageControl) + && FindProcShort (glDebugMessageInsert) + && FindProcShort (glDebugMessageCallback) + && FindProcShort (glGetDebugMessageLog)) + { + arbDbg = (OpenGl_ArbDbg* )(&(*myFuncs)); + } // According to GL_KHR_debug spec, all functions should have KHR suffix. // However, some implementations can export these functions without suffix. - if (FindProc ("glDebugMessageControlKHR", myFuncs->glDebugMessageControl) + else if (!IsGlGreaterEqual (3, 2) + && FindProc ("glDebugMessageControlKHR", myFuncs->glDebugMessageControl) && FindProc ("glDebugMessageInsertKHR", myFuncs->glDebugMessageInsert) && FindProc ("glDebugMessageCallbackKHR", myFuncs->glDebugMessageCallback) && FindProc ("glGetDebugMessageLogKHR", myFuncs->glGetDebugMessageLog)) @@ -1456,6 +1805,55 @@ } } + // load OpenGL ES 3.2 new functions + const bool has32es = IsGlGreaterEqual (3, 2) + && has31es + && hasTexBuffer32 + && arbDbg != NULL + && FindProcShort (glBlendBarrier) + && FindProcShort (glCopyImageSubData) + && FindProcShort (glPushDebugGroup) + && FindProcShort (glPopDebugGroup) + && FindProcShort (glObjectLabel) + && FindProcShort (glGetObjectLabel) + && FindProcShort (glObjectPtrLabel) + && FindProcShort (glGetObjectPtrLabel) + && FindProcShort (glGetPointerv) + && FindProcShort (glEnablei) + && FindProcShort (glDisablei) + && FindProcShort (glBlendEquationi) + && FindProcShort (glBlendEquationSeparatei) + && FindProcShort (glBlendFunci) + && FindProcShort (glBlendFuncSeparatei) + && FindProcShort (glColorMaski) + && FindProcShort (glIsEnabledi) + && FindProcShort (glDrawElementsBaseVertex) + && FindProcShort (glDrawRangeElementsBaseVertex) + && FindProcShort (glDrawElementsInstancedBaseVertex) + && FindProcShort (glFramebufferTexture) + && FindProcShort (glPrimitiveBoundingBox) + && FindProcShort (glGetGraphicsResetStatus) + && FindProcShort (glReadnPixels) + && FindProcShort (glGetnUniformfv) + && FindProcShort (glGetnUniformiv) + && FindProcShort (glGetnUniformuiv) + && FindProcShort (glMinSampleShading) + && FindProcShort (glPatchParameteri) + && FindProcShort (glTexParameterIiv) + && FindProcShort (glTexParameterIuiv) + && FindProcShort (glGetTexParameterIiv) + && FindProcShort (glGetTexParameterIuiv) + && FindProcShort (glSamplerParameterIiv) + && FindProcShort (glSamplerParameterIuiv) + && FindProcShort (glGetSamplerParameterIiv) + && FindProcShort (glGetSamplerParameterIuiv) + && FindProcShort (glTexBufferRange) + && FindProcShort (glTexStorage3DMultisample); + if (!has32es) + { + checkWrongVersion (3, 2, aLastFailedProc); + } + extDrawBuffers = CheckExtension ("GL_EXT_draw_buffers") && FindProc ("glDrawBuffersEXT", myFuncs->glDrawBuffers); arbDrawBuffers = CheckExtension ("GL_ARB_draw_buffers") && FindProc ("glDrawBuffersARB", myFuncs->glDrawBuffers); @@ -1506,17 +1904,29 @@ myTexClamp = IsGlGreaterEqual (1, 2) ? GL_CLAMP_TO_EDGE : GL_CLAMP; hasTexRGBA8 = Standard_True; + hasTexSRGB = IsGlGreaterEqual (2, 1); + hasFboSRGB = IsGlGreaterEqual (2, 1); + hasSRGBControl = hasFboSRGB; arbDrawBuffers = CheckExtension ("GL_ARB_draw_buffers"); arbNPTW = CheckExtension ("GL_ARB_texture_non_power_of_two"); arbTexFloat = IsGlGreaterEqual (3, 0) || CheckExtension ("GL_ARB_texture_float"); + hasTexFloatLinear = arbTexFloat; arbSampleShading = CheckExtension ("GL_ARB_sample_shading"); - extBgra = CheckExtension ("GL_EXT_bgra"); + extBgra = IsGlGreaterEqual (1, 2) + || CheckExtension ("GL_EXT_bgra"); extAnis = CheckExtension ("GL_EXT_texture_filter_anisotropic"); extPDS = CheckExtension ("GL_EXT_packed_depth_stencil"); atiMem = CheckExtension ("GL_ATI_meminfo"); nvxMem = CheckExtension ("GL_NVX_gpu_memory_info"); + if (extBgra) + { + mySupportedFormats->Add (Image_PixMap::ImgBGR); + mySupportedFormats->Add (Image_PixMap::ImgBGR32); + mySupportedFormats->Add (Image_PixMap::ImgBGRA); + } + hasDrawBuffers = IsGlGreaterEqual (2, 0) ? OpenGl_FeatureInCore : arbDrawBuffers ? OpenGl_FeatureInExtensions : OpenGl_FeatureNotAvailable; @@ -1572,7 +1982,7 @@ glGetIntegerv (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &myMaxTexCombined); } mySpriteTexUnit = myMaxTexCombined >= 2 - ? Graphic3d_TextureUnit_1 + ? Graphic3d_TextureUnit_PointSprite : Graphic3d_TextureUnit_0; GLint aMaxVPortSize[2] = {0, 0}; @@ -1783,6 +2193,7 @@ core15 = (OpenGl_GlCore15* )(&(*myFuncs)); } core15fwd = (OpenGl_GlCore15Fwd* )(&(*myFuncs)); + hasGetBufferData = true; } else { @@ -2047,6 +2458,12 @@ // but doesn't hardware accelerated by some ancient OpenGL 2.1 hardware (GeForce FX, RadeOn 9700 etc.) arbNPTW = Standard_True; arbTexRG = Standard_True; + + if (!isCoreProfile) + { + core30 = (OpenGl_GlCore30* )(&(*myFuncs)); + } + core30fwd = (OpenGl_GlCore30Fwd* )(&(*myFuncs)); } // load OpenGL 3.1 new functions @@ -2821,6 +3238,117 @@ myHasRayTracingAdaptiveSamplingAtomic = myHasRayTracingAdaptiveSampling && CheckExtension ("GL_NV_shader_atomic_float"); #endif + + if (arbFBO != NULL + && hasFboSRGB) + { + // Detect if window buffer is considered by OpenGL as sRGB-ready + // (linear RGB color written by shader is automatically converted into sRGB) + // or not (offscreen FBO should be blit into window buffer with gamma correction). + const GLenum aDefWinBuffer = + #if !defined(GL_ES_VERSION_2_0) + GL_BACK_LEFT; + #else + GL_BACK; + #endif + GLint aWinColorEncoding = 0; // GL_LINEAR + arbFBO->glGetFramebufferAttachmentParameteriv (GL_FRAMEBUFFER, aDefWinBuffer, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, &aWinColorEncoding); + ResetErrors (true); + myIsSRgbWindow = aWinColorEncoding == GL_SRGB; + + // On desktop OpenGL, pixel formats are almost always sRGB-ready, even when not requested; + // it is safe behavior on desktop where GL_FRAMEBUFFER_SRGB is disabled by default + // (contrary to OpenGL ES, where it is enabled by default). + // NVIDIA drivers, however, always return GL_LINEAR even for sRGB-ready pixel formats on Windows platform, + // while AMD and Intel report GL_SRGB as expected. + // macOS drivers seems to be also report GL_LINEAR even for [NSColorSpace sRGBColorSpace]. + #if !defined(GL_ES_VERSION_2_0) + #ifdef __APPLE__ + myIsSRgbWindow = true; + #else + if (!myIsSRgbWindow + && myVendor.Search ("nvidia") != -1) + { + myIsSRgbWindow = true; + } + #endif + #endif + if (!myIsSRgbWindow) + { + Message::SendTrace ("OpenGl_Context, warning: window buffer is not sRGB-ready.\n" + "Check OpenGL window creation parameters for optimal performance."); + } + } + + if (arbTexFloat) + { + mySupportedFormats->Add (Image_Format_GrayF); + mySupportedFormats->Add (Image_Format_AlphaF); + mySupportedFormats->Add (Image_Format_RGBF); + mySupportedFormats->Add (Image_Format_RGBAF); + if (arbTexRG) + { + mySupportedFormats->Add (Image_Format_RGF); + } + if (extBgra) + { + #if !defined(GL_ES_VERSION_2_0) + mySupportedFormats->Add (Image_Format_BGRF); + #endif + mySupportedFormats->Add (Image_Format_BGRAF); + } + } + +#ifdef __EMSCRIPTEN__ + if (checkEnableWebGlExtension (*this, "GL_WEBGL_compressed_texture_s3tc")) // GL_WEBGL_compressed_texture_s3tc_srgb for sRGB formats + { + mySupportedFormats->Add (Image_CompressedFormat_RGB_S3TC_DXT1); + mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT1); + mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT3); + mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT5); + } +#else + if (CheckExtension ("GL_EXT_texture_compression_s3tc")) // GL_EXT_texture_sRGB for sRGB formats + { + mySupportedFormats->Add (Image_CompressedFormat_RGB_S3TC_DXT1); + mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT1); + mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT3); + mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT5); + } + else + { + if (CheckExtension ("GL_EXT_texture_compression_dxt1")) + { + mySupportedFormats->Add (Image_CompressedFormat_RGB_S3TC_DXT1); + mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT1); + } + if (CheckExtension ("GL_ANGLE_texture_compression_dxt3")) + { + mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT3); + } + if (CheckExtension ("GL_ANGLE_texture_compression_dxt5")) + { + mySupportedFormats->Add (Image_CompressedFormat_RGBA_S3TC_DXT5); + } + } +#endif + + // check whether PBR shading model is supported + myHasPBR = arbFBO != NULL + && myMaxTexCombined >= 4 + && arbTexRG + && arbTexFloat + && (IsGlGreaterEqual (3, 0) + #if !defined(GL_ES_VERSION_2_0) + || (IsGlGreaterEqual (2, 1) && CheckExtension ("GL_EXT_gpu_shader4")) + #endif + ); + if (myHasPBR) + { + myPBREnvLUTTexUnit = static_cast(myMaxTexCombined + Graphic3d_TextureUnit_PbrEnvironmentLUT); + myPBRDiffIBLMapSHTexUnit = static_cast(myMaxTexCombined + Graphic3d_TextureUnit_PbrIblDiffuseSH); + myPBRSpecIBLMapTexUnit = static_cast(myMaxTexCombined + Graphic3d_TextureUnit_PbrIblSpecular); + } } // ======================================================================= @@ -3047,6 +3575,20 @@ ReadGlVersion (aDriverVer[0], aDriverVer[1]); addInfo (theDict, "GLvendor", (const char*)::glGetString (GL_VENDOR)); addInfo (theDict, "GLdevice", (const char*)::glGetString (GL_RENDERER)); + #ifdef __EMSCRIPTEN__ + if (checkEnableWebGlExtension (*this, "GL_WEBGL_debug_renderer_info")) + { + if (const char* aVendor = (const char*)::glGetString (0x9245)) + { + addInfo (theDict, "GLunmaskedVendor", aVendor); + } + if (const char* aDevice = (const char*)::glGetString (0x9246)) + { + addInfo (theDict, "GLunmaskedDevice", aDevice); + } + } + #endif + addInfo (theDict, "GLversion", (const char*)::glGetString (GL_VERSION)); if (myGlVerMajor != aDriverVer[0] || myGlVerMinor != aDriverVer[1]) @@ -3218,104 +3760,112 @@ // function : BindTextures // purpose : // ======================================================================= -Handle(OpenGl_TextureSet) OpenGl_Context::BindTextures (const Handle(OpenGl_TextureSet)& theTextures) +Handle(OpenGl_TextureSet) OpenGl_Context::BindTextures (const Handle(OpenGl_TextureSet)& theTextures, + const Handle(OpenGl_ShaderProgram)& theProgram) { - if (myActiveTextures == theTextures) - { - return myActiveTextures; - } - - Handle(OpenGl_Context) aThisCtx (this); - OpenGl_TextureSet::Iterator aTextureIterOld (myActiveTextures), aTextureIterNew (theTextures); - for (;;) - { - if (!aTextureIterNew.More()) + const Standard_Integer aTextureSetBits = !theTextures.IsNull() ? theTextures->TextureSetBits() : 0; + const Standard_Integer aProgramBits = !theProgram.IsNull() ? theProgram->TextureSetBits() : 0; + Standard_Integer aMissingBits = aProgramBits & ~aTextureSetBits; + if (aMissingBits != 0 + && myTextureRgbaBlack.IsNull()) + { + // allocate mock textures + myTextureRgbaBlack = new OpenGl_Texture(); + myTextureRgbaWhite = new OpenGl_Texture(); + Image_PixMap anImage; + anImage.InitZero (Image_Format_RGBA, 2, 2, 0, (Standard_Byte )0); + if (!myTextureRgbaBlack->Init (this, OpenGl_TextureFormat::Create(), Graphic3d_Vec2i (2, 2), Graphic3d_TOT_2D, &anImage)) { - for (; aTextureIterOld.More(); aTextureIterOld.Next()) - { - if (const Handle(OpenGl_Texture)& aTextureOld = aTextureIterOld.Value()) - { - aTextureOld->Unbind(aThisCtx); - #if !defined(GL_ES_VERSION_2_0) - if (core11 != NULL) - { - OpenGl_Sampler::resetGlobalTextureParams (aThisCtx, *aTextureOld, aTextureOld->Sampler()->Parameters()); - } - #endif - } - } - break; + PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_HIGH, + "Error: unable to create unit mock PBR texture map."); } + anImage.InitZero (Image_Format_RGBA, 2, 2, 0, (Standard_Byte )255); + if (!myTextureRgbaWhite->Init (this, OpenGl_TextureFormat::Create(), Graphic3d_Vec2i (2, 2), Graphic3d_TOT_2D, &anImage)) + { + PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_HIGH, + "Error: unable to create normal mock PBR texture map."); + } + } - const Handle(OpenGl_Texture)& aTextureNew = aTextureIterNew.Value(); - if (aTextureIterOld.More()) + Handle(OpenGl_TextureSet) anOldTextures = myActiveTextures; + if (myActiveTextures != theTextures) + { + Handle(OpenGl_Context) aThisCtx (this); + for (OpenGl_TextureSetPairIterator aSlotIter (myActiveTextures, theTextures); aSlotIter.More(); aSlotIter.Next()) { - const Handle(OpenGl_Texture)& aTextureOld = aTextureIterOld.Value(); + const Graphic3d_TextureUnit aTexUnit = aSlotIter.Unit(); + const OpenGl_Texture* aTextureOld = aSlotIter.Texture1(); + const OpenGl_Texture* aTextureNew = aSlotIter.Texture2(); if (aTextureNew == aTextureOld) { - aTextureIterNew.Next(); - aTextureIterOld.Next(); continue; } - else if (aTextureNew.IsNull() - || !aTextureNew->IsValid()) + + if (aTextureNew != NULL + && aTextureNew->IsValid()) { - if (!aTextureOld.IsNull()) + if (aTexUnit >= myMaxTexCombined) { - aTextureOld->Unbind(aThisCtx); - #if !defined(GL_ES_VERSION_2_0) - if (core11 != NULL) + PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString("Texture unit ") + aTexUnit + " for " + aTextureNew->ResourceId() + " exceeds hardware limit " + myMaxTexCombined); + continue; + } + + aTextureNew->Bind (aThisCtx, aTexUnit); + if (aTextureNew->Sampler()->ToUpdateParameters()) + { + if (aTextureNew->Sampler()->IsImmutable()) { - OpenGl_Sampler::resetGlobalTextureParams (aThisCtx, *aTextureOld, aTextureOld->Sampler()->Parameters()); + aTextureNew->Sampler()->Init (aThisCtx, *aTextureNew); + } + else + { + OpenGl_Sampler::applySamplerParams (aThisCtx, aTextureNew->Sampler()->Parameters(), aTextureNew->Sampler().get(), aTextureNew->GetTarget(), aTextureNew->MaxMipmapLevel()); } - #endif } - - aTextureIterNew.Next(); - aTextureIterOld.Next(); - continue; + #if !defined(GL_ES_VERSION_2_0) + if (core11 != NULL) + { + OpenGl_Sampler::applyGlobalTextureParams (aThisCtx, *aTextureNew, aTextureNew->Sampler()->Parameters()); + } + #endif + } + else if (aTextureOld != NULL + && aTextureOld->IsValid()) + { + aTextureOld->Unbind (aThisCtx, aTexUnit); + #if !defined(GL_ES_VERSION_2_0) + if (core11 != NULL) + { + OpenGl_Sampler::resetGlobalTextureParams (aThisCtx, *aTextureOld, aTextureOld->Sampler()->Parameters()); + } + #endif } - - aTextureIterOld.Next(); - } - if (aTextureNew.IsNull()) - { - aTextureIterNew.Next(); - continue; - } - - const Graphic3d_TextureUnit aTexUnit = aTextureNew->Sampler()->Parameters()->TextureUnit(); - if (aTexUnit >= myMaxTexCombined) - { - PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, - TCollection_AsciiString("Texture unit ") + aTexUnit + " for " + aTextureNew->ResourceId() + " exceeds hardware limit " + myMaxTexCombined); - aTextureIterNew.Next(); - continue; } + myActiveTextures = theTextures; + } - aTextureNew->Bind (aThisCtx); - if (aTextureNew->Sampler()->ToUpdateParameters()) + if (myActiveMockTextures != aMissingBits) + { + myActiveMockTextures = aMissingBits; + for (Standard_Integer aBitIter = 0; aMissingBits != 0; ++aBitIter) { - if (aTextureNew->Sampler()->IsImmutable()) + Standard_Integer aUnitMask = 1 << aBitIter; + if ((aUnitMask & aMissingBits) != 0) { - aTextureNew->Sampler()->Init (aThisCtx, *aTextureNew); - } - else - { - OpenGl_Sampler::applySamplerParams (aThisCtx, aTextureNew->Sampler()->Parameters(), aTextureNew->Sampler().get(), aTextureNew->GetTarget(), aTextureNew->HasMipmaps()); + aMissingBits = aMissingBits & ~aUnitMask; + if (aBitIter == Graphic3d_TextureUnit_Normal) + { + myTextureRgbaBlack->Bind (this, static_cast(aBitIter)); + } + else + { + myTextureRgbaWhite->Bind (this, static_cast(aBitIter)); + } } } - #if !defined(GL_ES_VERSION_2_0) - if (core11 != NULL) - { - OpenGl_Sampler::applyGlobalTextureParams (aThisCtx, *aTextureNew, aTextureNew->Sampler()->Parameters()); - } - #endif - aTextureIterNew.Next(); } - Handle(OpenGl_TextureSet) anOldTextures = myActiveTextures; - myActiveTextures = theTextures; return anOldTextures; } @@ -3400,10 +3950,10 @@ ? anAspect->BackInteriorColor() : aFrontIntColor; - myMatFront.Init (aMatFrontSrc, aFrontIntColor); + myMatFront.Init (*this, aMatFrontSrc, aFrontIntColor); if (toDistinguish) { - myMatBack.Init (aMatBackSrc, aBackIntColor); + myMatBack.Init (*this, aMatBackSrc, aBackIntColor); } else { @@ -3421,8 +3971,11 @@ Standard_ShortReal anAlphaBack = 1.0f; if (CheckIsTransparent (theAspect, theHighlight, anAlphaFront, anAlphaBack)) { - myMatFront.Diffuse.a() = anAlphaFront; - myMatBack .Diffuse.a() = anAlphaBack; + myMatFront.Common.Diffuse.a() = anAlphaFront; + myMatBack .Common.Diffuse.a() = anAlphaBack; + + myMatFront.Pbr.BaseColor.a() = anAlphaFront; + myMatBack .Pbr.BaseColor.a() = anAlphaBack; } // do not update material properties in case of zero reflection mode, @@ -3507,7 +4060,10 @@ { if (!myActiveProgram.IsNull()) { - myActiveProgram->SetUniform (this, myActiveProgram->GetStateLocation (OpenGl_OCCT_COLOR), theColor); + if (const OpenGl_ShaderUniformLocation& aLoc = myActiveProgram->GetStateLocation (OpenGl_OCCT_COLOR)) + { + myActiveProgram->SetUniform (this, aLoc, Vec4FromQuantityColor (theColor)); + } } #if !defined(GL_ES_VERSION_2_0) else if (core11 != NULL) @@ -3524,51 +4080,30 @@ void OpenGl_Context::SetTypeOfLine (const Aspect_TypeOfLine theType, const Standard_ShortReal theFactor) { - Standard_Integer aPattern = 0xFFFF; - switch (theType) - { - case Aspect_TOL_DASH: - { - aPattern = 0xFFC0; - break; - } - case Aspect_TOL_DOT: - { - aPattern = 0xCCCC; - break; - } - case Aspect_TOL_DOTDASH: - { - aPattern = 0xFF18; - break; - } - case Aspect_TOL_EMPTY: - case Aspect_TOL_SOLID: - { - aPattern = 0xFFFF; - break; - } - case Aspect_TOL_USERDEFINED: - { - aPattern = 0xFF24; - break; - } - } + SetLineStipple (theFactor, Graphic3d_Aspects::DefaultLinePatternForType (theType)); +} +// ======================================================================= +// function : SetLineStipple +// purpose : +// ======================================================================= +void OpenGl_Context::SetLineStipple (const Standard_ShortReal theFactor, + const uint16_t thePattern) +{ if (!myActiveProgram.IsNull()) { if (const OpenGl_ShaderUniformLocation aPatternLoc = myActiveProgram->GetStateLocation (OpenGl_OCCT_LINE_STIPPLE_PATTERN)) { if (hasGlslBitwiseOps != OpenGl_FeatureNotAvailable) { - myActiveProgram->SetUniform (this, aPatternLoc, aPattern); + myActiveProgram->SetUniform (this, aPatternLoc, (Standard_Integer )thePattern); } else { Standard_Integer aPatArr[16] = {}; for (unsigned int aBit = 0; aBit < 16; ++aBit) { - aPatArr[aBit] = ((unsigned int)(aPattern) & (1U << aBit)) != 0 ? 1 : 0; + aPatArr[aBit] = ((unsigned int)(thePattern) & (1U << aBit)) != 0 ? 1 : 0; } myActiveProgram->SetUniform (this, aPatternLoc, 16, aPatArr); } @@ -3578,14 +4113,14 @@ } #if !defined(GL_ES_VERSION_2_0) - if (aPattern != 0xFFFF) + if (thePattern != 0xFFFF) { if (core11 != NULL) { core11fwd->glEnable (GL_LINE_STIPPLE); core11->glLineStipple (static_cast (theFactor), - static_cast (aPattern)); + static_cast (thePattern)); } } else @@ -3615,13 +4150,17 @@ // function : SetTextureMatrix // purpose : // ======================================================================= -void OpenGl_Context::SetTextureMatrix (const Handle(Graphic3d_TextureParams)& theParams) +void OpenGl_Context::SetTextureMatrix (const Handle(Graphic3d_TextureParams)& theParams, + const Standard_Boolean theIsTopDown) { if (theParams.IsNull()) { return; } - else if (!myActiveProgram.IsNull()) + + const Graphic3d_Vec2& aScale = theParams->Scale(); + const Graphic3d_Vec2& aTrans = theParams->Translation(); + if (!myActiveProgram.IsNull()) { const GLint aUniLoc = myActiveProgram->GetStateLocation (OpenGl_OCCT_TEXTURE_TRSF2D); if (aUniLoc == OpenGl_ShaderProgram::INVALID_LOCATION) @@ -3632,14 +4171,17 @@ // pack transformation parameters OpenGl_Vec4 aTrsf[2] = { - OpenGl_Vec4 (-theParams->Translation().x(), - -theParams->Translation().y(), - theParams->Scale().x(), - theParams->Scale().y()), + OpenGl_Vec4 (-aTrans.x(), -aTrans.y(), aScale.x(), aScale.y()), OpenGl_Vec4 (static_cast (std::sin (-theParams->Rotation() * M_PI / 180.0)), static_cast (std::cos (-theParams->Rotation() * M_PI / 180.0)), 0.0f, 0.0f) }; + if (caps->isTopDownTextureUV != theIsTopDown) + { + // flip V + aTrsf[0].y() = -aTrans.y() + 1.0f / aScale.y(); + aTrsf[0].w() = -aScale.y(); + } myActiveProgram->SetUniform (this, aUniLoc, 2, aTrsf); return; } @@ -3652,11 +4194,18 @@ core11->glMatrixMode (GL_TEXTURE); OpenGl_Mat4 aTextureMat; - const Graphic3d_Vec2& aScale = theParams->Scale(); - const Graphic3d_Vec2& aTrans = theParams->Translation(); - Graphic3d_TransformUtils::Scale (aTextureMat, aScale.x(), aScale.y(), 1.0f); - Graphic3d_TransformUtils::Translate (aTextureMat, -aTrans.x(), -aTrans.y(), 0.0f); - Graphic3d_TransformUtils::Rotate (aTextureMat, -theParams->Rotation(), 0.0f, 0.0f, 1.0f); + if (caps->isTopDownTextureUV != theIsTopDown) + { + // flip V + Graphic3d_TransformUtils::Scale (aTextureMat, aScale.x(), -aScale.y(), 1.0f); + Graphic3d_TransformUtils::Translate (aTextureMat, -aTrans.x(), -aTrans.y() + 1.0f / aScale.y(), 0.0f); + } + else + { + Graphic3d_TransformUtils::Scale (aTextureMat, aScale.x(), aScale.y(), 1.0f); + Graphic3d_TransformUtils::Translate (aTextureMat, -aTrans.x(), -aTrans.y(), 0.0f); + } + Graphic3d_TransformUtils::Rotate (aTextureMat, -theParams->Rotation(), 0.0f, 0.0f, 1.0f); core11->glLoadMatrixf (aTextureMat); core11->glMatrixMode (aMatrixMode); } @@ -3742,6 +4291,29 @@ } // ======================================================================= +// function : SetShadeModel +// purpose : +// ======================================================================= +void OpenGl_Context::SetShadeModel (Graphic3d_TypeOfShadingModel theModel) +{ +#if !defined(GL_ES_VERSION_2_0) + if (core11 != NULL) + { + const Standard_Integer aModel = theModel == Graphic3d_TOSM_FACET + || theModel == Graphic3d_TOSM_PBR_FACET ? GL_FLAT : GL_SMOOTH; + if (myShadeModel == aModel) + { + return; + } + myShadeModel = aModel; + core11->glShadeModel (aModel); + } +#else + (void )theModel; +#endif +} + +// ======================================================================= // function : SetPolygonMode // purpose : // ======================================================================= @@ -3769,16 +4341,29 @@ // ======================================================================= bool OpenGl_Context::SetPolygonHatchEnabled (const bool theIsEnabled) { - if (myHatchStyles.IsNull()) + if (core11 == NULL) { return false; } - else if (myHatchStyles->IsEnabled() == theIsEnabled) + else if (myHatchIsEnabled == theIsEnabled) { return theIsEnabled; } - return myHatchStyles->SetEnabled (this, theIsEnabled); + const bool anOldIsEnabled = myHatchIsEnabled; +#if !defined(GL_ES_VERSION_2_0) + if (theIsEnabled + && myActiveHatchType != Aspect_HS_SOLID) + { + core11fwd->glEnable (GL_POLYGON_STIPPLE); + } + else + { + core11fwd->glDisable (GL_POLYGON_STIPPLE); + } +#endif + myHatchIsEnabled = theIsEnabled; + return anOldIsEnabled; } // ======================================================================= @@ -3787,26 +4372,43 @@ // ======================================================================= Standard_Integer OpenGl_Context::SetPolygonHatchStyle (const Handle(Graphic3d_HatchStyle)& theStyle) { - if (theStyle.IsNull()) + const Standard_Integer aNewStyle = !theStyle.IsNull() ? theStyle->HatchType() : Aspect_HS_SOLID; + if (myActiveHatchType == aNewStyle + || core11 == NULL) { - return 0; + return myActiveHatchType; } - if (myHatchStyles.IsNull()) +#if !defined(GL_ES_VERSION_2_0) + if (aNewStyle == Aspect_HS_SOLID) { - if (!GetResource ("OpenGl_LineAttributes", myHatchStyles)) + if (myHatchIsEnabled) { - // share and register for release once the resource is no longer used - myHatchStyles = new OpenGl_LineAttributes(); - ShareResource ("OpenGl_LineAttributes", myHatchStyles); + core11fwd->glDisable (GL_POLYGON_STIPPLE); } + return myActiveHatchType; } - if (myHatchStyles->TypeOfHatch() == theStyle->HatchType()) + + if (myHatchStyles.IsNull() + && !GetResource ("OpenGl_LineAttributes", myHatchStyles)) { - return theStyle->HatchType(); + // share and register for release once the resource is no longer used + myHatchStyles = new OpenGl_LineAttributes(); + ShareResource ("OpenGl_LineAttributes", myHatchStyles); } - return myHatchStyles->SetTypeOfHatch (this, theStyle); + const Standard_Integer anOldType = myActiveHatchType; + myActiveHatchType = aNewStyle; + myHatchStyles->SetTypeOfHatch (this, theStyle); + if (myHatchIsEnabled + && anOldType == Aspect_HS_SOLID) + { + core11fwd->glEnable (GL_POLYGON_STIPPLE); + } + return anOldType; +#else + return myActiveHatchType; +#endif } // ======================================================================= @@ -3868,6 +4470,22 @@ } // ======================================================================= +// function : SetCamera +// purpose : +// ======================================================================= +void OpenGl_Context::SetCamera (const Handle(Graphic3d_Camera)& theCamera) +{ + myCamera = theCamera; + if (!theCamera.IsNull()) + { + ProjectionState.SetCurrent (theCamera->ProjectionMatrixF()); + WorldViewState .SetCurrent (theCamera->OrientationMatrixF()); + ApplyProjectionMatrix(); + ApplyWorldViewMatrix(); + } +} + +// ======================================================================= // function : ApplyModelWorldMatrix // purpose : // ======================================================================= @@ -4034,3 +4652,114 @@ myAlphaToCoverage = toEnable; return anOldValue; } + +// ======================================================================= +// function : GetBufferSubData +// purpose : +// ======================================================================= +bool OpenGl_Context::GetBufferSubData (GLenum theTarget, GLintptr theOffset, GLsizeiptr theSize, void* theData) +{ + if (!hasGetBufferData) + { + return false; + } +#ifdef __EMSCRIPTEN__ + EM_ASM_( + { + Module.ctx.getBufferSubData($0, $1, HEAPU8.subarray($2, $2 + $3)); + }, theTarget, theOffset, theData, theSize); + return true; +#elif defined(GL_ES_VERSION_2_0) + if (void* aData = core30fwd->glMapBufferRange (theTarget, theOffset, theSize, GL_MAP_READ_BIT)) + { + memcpy (theData, aData, theSize); + core30fwd->glUnmapBuffer (theTarget); + return true; + } + return false; +#else + core15fwd->glGetBufferSubData (theTarget, theOffset, theSize, theData); + return true; +#endif +} + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_Context::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAnisoMax) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTexClamp) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaxTexDim) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaxTexCombined) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaxDumpSizeX) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaxDumpSizeY) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaxClipPlanes) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaxMsaaSamples) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaxDrawBuffers) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaxColorAttachments) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myGlVerMajor) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myGlVerMinor) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsInitialized) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsStereoBuffers) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsGlNormalizeEnabled) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasRayTracing) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasRayTracingTextures) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasRayTracingAdaptiveSampling) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasRayTracingAdaptiveSamplingAtomic) + + for (int i = 0; i < 4; i++) + { + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myViewport[i]) + } + + for (int i = 0; i < 4; i++) + { + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myViewportVirt[i]) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPointSpriteOrig) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRenderMode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPolygonMode) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPolygonOffset) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToCullBackFaces) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myReadBuffer) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDefaultVao) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myColorMask) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAllowAlphaToCov) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAlphaToCoverage) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsGlDebugCtx) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myResolution) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myResolutionRatio) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLineWidthScale) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLineFeather) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRenderScale) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRenderScaleInv) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &ModelWorldState) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &WorldViewState) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &ProjectionState) +} + +// ======================================================================= +// function : DumpJsonOpenGlState +// purpose : +// ======================================================================= +void OpenGl_Context::DumpJsonOpenGlState (Standard_OStream& theOStream, Standard_Integer) +{ + GLboolean isEnableBlend = glIsEnabled (GL_BLEND); + GLboolean isEnableCullFace = glIsEnabled (GL_CULL_FACE); + GLboolean isEnableDepthTest = glIsEnabled (GL_DEPTH_TEST); + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, isEnableBlend) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, isEnableCullFace) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, isEnableDepthTest) +} + diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Context.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Context.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Context.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Context.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -136,6 +136,7 @@ typedef OpenGl_TmplCore45 OpenGl_GlCore45Back; typedef OpenGl_TmplCore45 OpenGl_GlCore45; +class Graphic3d_Camera; class Graphic3d_PresentationAttributes; class OpenGl_Aspects; class OpenGl_FrameBuffer; @@ -199,6 +200,13 @@ //! //! Notice that some systems provide mechanisms to simultaneously incorporate with GL contexts with different capabilities. //! For this reason OpenGl_Context should be initialized and used for each GL context independently. +//! +//! Matrices of OpenGl transformations: +//! model -> world -> view -> projection +//! These matrices might be changed for local transformation, transform persistent using direct access to +//! current matrix of ModelWorldState, WorldViewState and ProjectionState +//! After, these matrices should be applyed using ApplyModelWorldMatrix, ApplyWorldViewMatrix, +//! ApplyModelViewMatrix or ApplyProjectionMatrix. class OpenGl_Context : public Standard_Transient { DEFINE_STANDARD_RTTIEXT(OpenGl_Context, Standard_Transient) @@ -488,6 +496,19 @@ //! Either GL_CLAMP_TO_EDGE (1.2+) or GL_CLAMP (1.1). Standard_Integer TextureWrapClamp() const { return myTexClamp; } + //! @return true if texture parameters GL_TEXTURE_BASE_LEVEL/GL_TEXTURE_MAX_LEVEL are supported. + Standard_Boolean HasTextureBaseLevel() const + { + #if !defined(GL_ES_VERSION_2_0) + return IsGlGreaterEqual (1, 2); + #else + return IsGlGreaterEqual (3, 0); + #endif + } + + //! Return map of supported texture formats. + const Handle(Image_SupportedFormats)& SupportedTextureFormats() const { return mySupportedFormats; } + //! @return maximum degree of anisotropy texture filter Standard_Integer MaxDegreeOfAnisotropy() const { return myAnisoMax; } @@ -502,7 +523,7 @@ //! @return value for GL_MAX_TEXTURE_UNITS Standard_Integer MaxTextureUnitsFFP() const { return myMaxTexUnitsFFP; } - //! @return texture unit to be used for sprites + //! Return texture unit to be used for sprites (Graphic3d_TextureUnit_PointSprite by default). Graphic3d_TextureUnit SpriteTextureUnit() const { return mySpriteTexUnit; } //! @return value for GL_MAX_SAMPLES @@ -538,6 +559,77 @@ //! @return TRUE if atomic adaptive screen sampling in ray tracing mode is supported Standard_Boolean HasRayTracingAdaptiveSamplingAtomic() const { return myHasRayTracingAdaptiveSamplingAtomic; } + //! Returns TRUE if sRGB rendering is supported. + bool HasSRGB() const + { + return hasTexSRGB + && hasFboSRGB; + } + + //! Returns TRUE if sRGB rendering is supported and permitted. + bool ToRenderSRGB() const + { + return HasSRGB() + && !caps->sRGBDisable + && !caps->ffpEnable; + } + + //! Returns TRUE if window/surface buffer is sRGB-ready. + //! + //! When offscreen FBOs are created in sRGB, but window is not sRGB-ready, + //! blitting into window should be done with manual gamma correction. + //! + //! In desktop OpenGL, window buffer can be considered as sRGB-ready by default, + //! even when application has NOT requested sRGB-ready pixel format, + //! and rendering is managed via GL_FRAMEBUFFER_SRGB state. + //! + //! In OpenGL ES, sRGB-ready window surface should be explicitly requested on construction, + //! and cannot be disabled/enabled without GL_EXT_sRGB_write_control extension afterwards + //! (GL_FRAMEBUFFER_SRGB can be considered as always tuned ON). + bool IsWindowSRGB() const { return myIsSRgbWindow; } + + //! Overrides if window/surface buffer is sRGB-ready or not (initialized with the context). + void SetWindowSRGB (bool theIsSRgb) { myIsSRgbWindow = theIsSRgb; } + + //! Convert Quantity_ColorRGBA into vec4 + //! with conversion or no conversion into non-linear sRGB + //! basing on ToRenderSRGB() flag. + OpenGl_Vec4 Vec4FromQuantityColor (const OpenGl_Vec4& theColor) const + { + return myIsSRgbActive + ? Vec4LinearFromQuantityColor(theColor) + : Vec4sRGBFromQuantityColor (theColor); + } + + //! Convert Quantity_ColorRGBA into vec4. + //! Quantity_Color is expected to be linear RGB, hence conversion is NOT required + const OpenGl_Vec4& Vec4LinearFromQuantityColor (const OpenGl_Vec4& theColor) const { return theColor; } + + //! Convert Quantity_ColorRGBA (linear RGB) into non-linear sRGB vec4. + OpenGl_Vec4 Vec4sRGBFromQuantityColor (const OpenGl_Vec4& theColor) const + { + return Quantity_ColorRGBA::Convert_LinearRGB_To_sRGB (theColor); + } + + //! Returns TRUE if PBR shading model is supported. + //! Basically, feature requires OpenGL 3.0+ / OpenGL ES 3.0+ hardware; more precisely: + //! - Graphics hardware with moderate capabilities for compiling long enough GLSL program. + //! - FBO (e.g. for baking environment). + //! - Multi-texturing with >= 4 units (LUT and IBL textures). + //! - GL_RG32F texture format (arbTexRG + arbTexFloat) + //! - Cubemap texture lookup textureCubeLod()/textureLod() with LOD index within Fragment Shader, + //! which requires GLSL OpenGL 3.0+ / OpenGL ES 3.0+ or OpenGL 2.1 + GL_EXT_gpu_shader4 extension. + Standard_Boolean HasPBR() const { return myHasPBR; } + + //! Returns texture unit where Environment Lookup Table is expected to be bound, or 0 if PBR is unavailable. + Graphic3d_TextureUnit PBREnvLUTTexUnit() const { return myPBREnvLUTTexUnit; } + + //! Returns texture unit where Diffuse (irradiance) IBL map's spherical harmonics coefficients is expected to be bound, or 0 if PBR is unavailable. + Graphic3d_TextureUnit PBRDiffIBLMapSHTexUnit() const { return myPBRDiffIBLMapSHTexUnit; } + + //! Returns texture unit where Specular IBL map is expected to be bound, or 0 if PBR is unavailable. + Graphic3d_TextureUnit PBRSpecIBLMapTexUnit() const { return myPBRSpecIBLMapTexUnit; } + //! Returns true if VBO is supported and permitted. inline bool ToUseVbo() const { @@ -560,10 +652,7 @@ Standard_EXPORT Standard_Integer SetPolygonMode (const Standard_Integer theMode); //! @return cached enabled state of polygon hatching rasterization. - bool IsPolygonHatchEnabled() const - { - return !myHatchStyles.IsNull() && myHatchStyles->TypeOfHatch() != 0; - } + bool IsPolygonHatchEnabled() const { return myHatchIsEnabled; } //! Sets enabled state of polygon hatching rasterization //! without affecting currently selected hatching pattern. @@ -571,10 +660,7 @@ Standard_EXPORT bool SetPolygonHatchEnabled (const bool theIsEnabled); //! @return cached state of polygon hatch type. - Standard_Integer PolygonHatchStyle() const - { - return myHatchStyles.IsNull() ? Aspect_HS_SOLID : myHatchStyles->TypeOfHatch(); - } + Standard_Integer PolygonHatchStyle() const { return myActiveHatchType; } //! Sets polygon hatch pattern. //! Zero-index value is a default alias for solid filling. @@ -590,16 +676,31 @@ //! Returns currently applied polygon offset parameters. const Graphic3d_PolygonOffset& PolygonOffset() const { return myPolygonOffset; } - //! Applies matrix stored in ModelWorldState to OpenGl. + //! Returns camera object. + const Handle(Graphic3d_Camera)& Camera() const { return myCamera; } + + //! Sets camera object to the context and update matrices. + Standard_EXPORT void SetCamera (const Handle(Graphic3d_Camera)& theCamera); + + //! Applies matrix into shader manager stored in ModelWorldState to OpenGl. + //! In "model -> world -> view -> projection" it performs: + //! model -> world Standard_EXPORT void ApplyModelWorldMatrix(); //! Applies matrix stored in WorldViewState to OpenGl. + //! In "model -> world -> view -> projection" it performs: + //! model -> world -> view, + //! where model -> world is identical matrix Standard_EXPORT void ApplyWorldViewMatrix(); //! Applies combination of matrices stored in ModelWorldState and WorldViewState to OpenGl. + //! In "model -> world -> view -> projection" it performs: + //! model -> world -> view Standard_EXPORT void ApplyModelViewMatrix(); //! Applies matrix stored in ProjectionState to OpenGl. + //! In "model -> world -> view -> projection" it performs: + //! view -> projection Standard_EXPORT void ApplyProjectionMatrix(); public: @@ -688,6 +789,21 @@ SetDrawBuffer (theBuffer); } + //! Returns cached GL_FRAMEBUFFER_SRGB state. + //! If TRUE, GLSL program is expected to write linear RGB color. + //! Otherwise, GLSL program might need manually converting result color into sRGB color space. + bool IsFrameBufferSRGB() const { return myIsSRgbActive; } + + //! Enables/disables GL_FRAMEBUFFER_SRGB flag. + //! This flag can be set to: + //! - TRUE when writing into offscreen FBO (always expected to be in sRGB or RGBF formats). + //! - TRUE when writing into sRGB-ready window buffer (might require choosing proper pixel format on window creation). + //! - FALSE if sRGB rendering is not supported or sRGB-not-ready window buffer is used for drawing. + //! @param theIsFbo [in] flag indicating writing into offscreen FBO (always expected sRGB-ready when sRGB FBO is supported) + //! or into window buffer (FALSE, sRGB-readiness might vary). + //! @param theIsSRgb [in] flag indicating off-screen FBO is sRGB-ready + Standard_EXPORT void SetFrameBufferSRGB (bool theIsFbo, bool theIsFboSRgb = true); + //! Return cached flag indicating writing into color buffer is enabled or disabled (glColorMask). bool ColorMask() const { return myColorMask; } @@ -721,9 +837,20 @@ //! @return active textures const Handle(OpenGl_TextureSet)& ActiveTextures() const { return myActiveTextures; } - //! Bind specified texture set to current context, - //! or unbind previous one when NULL specified. - Standard_EXPORT Handle(OpenGl_TextureSet) BindTextures (const Handle(OpenGl_TextureSet)& theTextures); + //! Bind specified texture set to current context taking into account active GLSL program. + Standard_DEPRECATED("BindTextures() with explicit GLSL program should be used instead") + Handle(OpenGl_TextureSet) BindTextures (const Handle(OpenGl_TextureSet)& theTextures) + { + return BindTextures (theTextures, myActiveProgram); + } + + //! Bind specified texture set to current context, or unbind previous one when NULL specified. + //! @param theTextures [in] texture set to bind + //! @param theProgram [in] program attributes; when not NULL, + //! mock textures will be bound to texture units expected by GLSL program, but undefined by texture set + //! @return previous texture set + Standard_EXPORT Handle(OpenGl_TextureSet) BindTextures (const Handle(OpenGl_TextureSet)& theTextures, + const Handle(OpenGl_ShaderProgram)& theProgram); //! @return active GLSL program const Handle(OpenGl_ShaderProgram)& ActiveProgram() const @@ -761,6 +888,13 @@ Standard_EXPORT void SetTypeOfLine (const Aspect_TypeOfLine theType, const Standard_ShortReal theFactor = 1.0f); + //! Setup stipple line pattern with 1.0f factor; wrapper for glLineStipple(). + void SetLineStipple (const uint16_t thePattern) { SetLineStipple (1.0f, thePattern); } + + //! Setup type of line; wrapper for glLineStipple(). + Standard_EXPORT void SetLineStipple (const Standard_ShortReal theFactor, + const uint16_t thePattern); + //! Setup width of line. Standard_EXPORT void SetLineWidth (const Standard_ShortReal theWidth); @@ -774,7 +908,10 @@ Standard_EXPORT void SetPointSpriteOrigin(); //! Setup texture matrix to active GLSL program or to FFP global state using glMatrixMode (GL_TEXTURE). - Standard_EXPORT void SetTextureMatrix (const Handle(Graphic3d_TextureParams)& theParams); + //! @param theParams [in] texture parameters + //! @param theIsTopDown [in] texture top-down flag + Standard_EXPORT void SetTextureMatrix (const Handle(Graphic3d_TextureParams)& theParams, + const Standard_Boolean theIsTopDown); //! Bind default Vertex Array Object Standard_EXPORT void BindDefaultVao(); @@ -844,9 +981,29 @@ //! Set line feater width. void SetLineFeather(Standard_ShortReal theValue) { myLineFeather = theValue; } + //! Wrapper over glGetBufferSubData(), implemented as: + //! - OpenGL 1.5+ (desktop) via glGetBufferSubData(); + //! - OpenGL ES 3.0+ via glMapBufferRange(); + //! - WebGL 2.0+ via gl.getBufferSubData(). + //! @param theTarget [in] target buffer to map + //! @param theOffset [in] offset to the beginning of sub-data + //! @param theSize [in] number of bytes to read + //! @param theData [out] destination pointer to fill + //! @return FALSE if functionality is unavailable + Standard_EXPORT bool GetBufferSubData (GLenum theTarget, GLintptr theOffset, GLsizeiptr theSize, void* theData); + //! Return Graphics Driver's vendor. const TCollection_AsciiString& Vendor() const { return myVendor; } + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + + //! Dumps the content of openGL state into the stream + Standard_EXPORT static void DumpJsonOpenGlState (Standard_OStream& theOStream, Standard_Integer theDepth = -1); + + //! Set GL_SHADE_MODEL value. + Standard_EXPORT void SetShadeModel (Graphic3d_TypeOfShadingModel theModel); + private: //! Wrapper to system function to retrieve GL function pointer by name. @@ -871,6 +1028,8 @@ OpenGl_GlCore15Fwd* core15fwd; //!< OpenGL 1.5 without deprecated entry points OpenGl_GlCore20* core20; //!< OpenGL 2.0 core functionality (includes 1.5) OpenGl_GlCore20Fwd* core20fwd; //!< OpenGL 2.0 without deprecated entry points + OpenGl_GlCore30* core30; //!< OpenGL 3.0 core functionality + OpenGl_GlCore30Fwd* core30fwd; //!< OpenGL 3.0 without deprecated entry points OpenGl_GlCore32* core32; //!< OpenGL 3.2 core profile OpenGl_GlCore32Back* core32back; //!< OpenGL 3.2 backward compatibility profile OpenGl_GlCore33* core33; //!< OpenGL 3.3 core profile @@ -890,9 +1049,14 @@ public: //! @name extensions + Standard_Boolean hasGetBufferData; //!< flag indicating if GetBufferSubData() is supported Standard_Boolean hasHighp; //!< highp in GLSL ES fragment shader is supported Standard_Boolean hasUintIndex; //!< GLuint for index buffer is supported (always available on desktop; on OpenGL ES - since 3.0 or as extension GL_OES_element_index_uint) Standard_Boolean hasTexRGBA8; //!< always available on desktop; on OpenGL ES - since 3.0 or as extension GL_OES_rgb8_rgba8 + Standard_Boolean hasTexFloatLinear; //!< texture-filterable state for 32-bit floating texture formats (always on desktop, GL_OES_texture_float_linear within OpenGL ES) + Standard_Boolean hasTexSRGB; //!< sRGB texture formats (desktop OpenGL 2.1, OpenGL ES 3.0 or GL_EXT_texture_sRGB) + Standard_Boolean hasFboSRGB; //!< sRGB FBO render targets (desktop OpenGL 2.1, OpenGL ES 3.0) + Standard_Boolean hasSRGBControl; //!< sRGB write control (any desktop OpenGL, OpenGL ES + GL_EXT_sRGB_write_control extension) OpenGl_FeatureFlag hasFlatShading; //!< Complex flag indicating support of Flat shading (Graphic3d_TOSM_FACET) (always available on desktop; on OpenGL ES - since 3.0 or as extension GL_OES_standard_derivatives) OpenGl_FeatureFlag hasGlslBitwiseOps; //!< GLSL supports bitwise operations; OpenGL 3.0 / OpenGL ES 3.0 (GLSL 130 / GLSL ES 300) or OpenGL 2.1 + GL_EXT_gpu_shader4 OpenGl_FeatureFlag hasDrawBuffers; //!< Complex flag indicating support of multiple draw buffers (desktop OpenGL 2.0, OpenGL ES 3.0, GL_ARB_draw_buffers, GL_EXT_draw_buffers) @@ -903,13 +1067,13 @@ Standard_Boolean arbDrawBuffers; //!< GL_ARB_draw_buffers Standard_Boolean arbNPTW; //!< GL_ARB_texture_non_power_of_two Standard_Boolean arbTexRG; //!< GL_ARB_texture_rg - Standard_Boolean arbTexFloat; //!< GL_ARB_texture_float (on desktop OpenGL - since 3.0 or as extension GL_ARB_texture_float; on OpenGL ES - since 3.0) + Standard_Boolean arbTexFloat; //!< GL_ARB_texture_float (on desktop OpenGL - since 3.0 or as extension GL_ARB_texture_float; on OpenGL ES - since 3.0); @sa hasTexFloatLinear for linear filtering support OpenGl_ArbSamplerObject* arbSamplerObject; //!< GL_ARB_sampler_objects (on desktop OpenGL - since 3.3 or as extension GL_ARB_sampler_objects; on OpenGL ES - since 3.0) OpenGl_ArbTexBindless* arbTexBindless; //!< GL_ARB_bindless_texture - OpenGl_ArbTBO* arbTBO; //!< GL_ARB_texture_buffer_object + OpenGl_ArbTBO* arbTBO; //!< GL_ARB_texture_buffer_object (on desktop OpenGL - since 3.1 or as extension GL_ARB_texture_buffer_object; on OpenGL ES - since 3.2) Standard_Boolean arbTboRGB32; //!< GL_ARB_texture_buffer_object_rgb32 (3-component TBO), in core since 4.0 - OpenGl_ArbIns* arbIns; //!< GL_ARB_draw_instanced - OpenGl_ArbDbg* arbDbg; //!< GL_ARB_debug_output + OpenGl_ArbIns* arbIns; //!< GL_ARB_draw_instanced (on desktop OpenGL - since 3.1 or as extebsion GL_ARB_draw_instanced; on OpenGL ES - since 3.0 or as extension GL_ANGLE_instanced_arrays to WebGL 1.0) + OpenGl_ArbDbg* arbDbg; //!< GL_ARB_debug_output (on desktop OpenGL - since 4.3 or as extension GL_ARB_debug_output; on OpenGL ES - since 3.2 or as extension GL_KHR_debug) OpenGl_ArbFBO* arbFBO; //!< GL_ARB_framebuffer_object OpenGl_ArbFBOBlit* arbFBOBlit; //!< glBlitFramebuffer function, moved out from OpenGl_ArbFBO structure for compatibility with OpenGL ES 2.0 Standard_Boolean arbSampleShading; //!< GL_ARB_sample_shading @@ -966,6 +1130,8 @@ void* myGlLibHandle; //!< optional handle to GL library NCollection_Handle myFuncs; //!< mega structure for all GL functions + Handle(Image_SupportedFormats) + mySupportedFormats; //!< map of supported texture formats Standard_Integer myAnisoMax; //!< maximum level of anisotropy texture filter Standard_Integer myTexClamp; //!< either GL_CLAMP_TO_EDGE (1.2+) or GL_CLAMP (1.1) Standard_Integer myMaxTexDim; //!< value for GL_MAX_TEXTURE_SIZE @@ -983,27 +1149,40 @@ Standard_Boolean myIsStereoBuffers; //!< context supports stereo buffering Standard_Boolean myIsGlNormalizeEnabled; //!< GL_NORMALIZE flag //!< Used to tell OpenGl that normals should be normalized - Graphic3d_TextureUnit mySpriteTexUnit; //!< texture unit for point sprite texture + Graphic3d_TextureUnit mySpriteTexUnit; //!< sampler2D occSamplerPointSprite, texture unit for point sprite texture Standard_Boolean myHasRayTracing; //! indicates whether ray tracing mode is supported Standard_Boolean myHasRayTracingTextures; //! indicates whether textures in ray tracing mode are supported Standard_Boolean myHasRayTracingAdaptiveSampling; //! indicates whether adaptive screen sampling in ray tracing mode is supported Standard_Boolean myHasRayTracingAdaptiveSamplingAtomic; //! indicates whether atomic adaptive screen sampling in ray tracing mode is supported + Standard_Boolean myHasPBR; //!< indicates whether PBR shading model is supported + Graphic3d_TextureUnit myPBREnvLUTTexUnit; //!< sampler2D occEnvLUT, texture unit where environment lookup table is expected to be binded (0 if PBR is not supported) + Graphic3d_TextureUnit myPBRDiffIBLMapSHTexUnit; //!< sampler2D occDiffIBLMapSHCoeffs, texture unit where diffuse (irradiance) IBL map's spherical harmonics coefficients is expected to be binded + //! (0 if PBR is not supported) + Graphic3d_TextureUnit myPBRSpecIBLMapTexUnit; //!< samplerCube occSpecIBLMap, texture unit where specular IBL map is expected to be binded (0 if PBR is not supported) + Handle(OpenGl_ShaderManager) myShaderManager; //! support object for managing shader programs private: //! @name fields tracking current state + Handle(Graphic3d_Camera) myCamera; //!< active camera object Handle(OpenGl_FrameStats) myFrameStats; //!< structure accumulating frame statistics Handle(OpenGl_ShaderProgram) myActiveProgram; //!< currently active GLSL program Handle(OpenGl_TextureSet) myActiveTextures; //!< currently bound textures //!< currently active sampler objects + Standard_Integer myActiveMockTextures; //!< currently active mock sampler objects Handle(OpenGl_FrameBuffer) myDefaultFbo; //!< default Frame Buffer Object Handle(OpenGl_LineAttributes) myHatchStyles; //!< resource holding predefined hatch styles patterns + Standard_Integer myActiveHatchType; //!< currently activated type of polygon hatch + Standard_Boolean myHatchIsEnabled; //!< current enabled state of polygon hatching rasterization + Handle(OpenGl_Texture) myTextureRgbaBlack;//!< mock black texture returning (0, 0, 0, 0) + Handle(OpenGl_Texture) myTextureRgbaWhite;//!< mock white texture returning (1, 1, 1, 1) Standard_Integer myViewport[4]; //!< current viewport Standard_Integer myViewportVirt[4]; //!< virtual viewport Standard_Integer myPointSpriteOrig; //!< GL_POINT_SPRITE_COORD_ORIGIN state (GL_UPPER_LEFT by default) Standard_Integer myRenderMode; //!< value for active rendering mode + Standard_Integer myShadeModel; //!< currently used shade model (glShadeModel) Standard_Integer myPolygonMode; //!< currently used polygon rasterization mode (glPolygonMode) Graphic3d_PolygonOffset myPolygonOffset; //!< currently applied polygon offset bool myToCullBackFaces; //!< back face culling mode enabled state (glIsEnabled (GL_CULL_FACE)) @@ -1015,6 +1194,8 @@ Standard_Boolean myAllowAlphaToCov; //!< flag allowing GL_SAMPLE_ALPHA_TO_COVERAGE usage Standard_Boolean myAlphaToCoverage; //!< flag indicating GL_SAMPLE_ALPHA_TO_COVERAGE state Standard_Boolean myIsGlDebugCtx; //!< debug context initialization state + Standard_Boolean myIsSRgbWindow; //!< indicates that window buffer is sRGB-ready + Standard_Boolean myIsSRgbActive; //!< flag indicating GL_FRAMEBUFFER_SRGB state TCollection_AsciiString myVendor; //!< Graphics Driver's vendor TColStd_PackedMapOfInteger myFilters[6]; //!< messages suppressing filter (for sources from GL_DEBUG_SOURCE_API_ARB to GL_DEBUG_SOURCE_OTHER_ARB) unsigned int myResolution; //!< Pixels density (PPI), defines scaling factor for parameters like text size diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Element.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Element.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Element.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Element.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,6 +15,9 @@ #include +#include +#include + // ======================================================================= // function : OpenGl_Element // purpose : @@ -32,3 +35,32 @@ { // } + +// ======================================================================= +// function : UpdateMemStats +// purpose : +// ======================================================================= +void OpenGl_Element::UpdateMemStats (Graphic3d_FrameStatsDataTmp& theStats) const +{ + theStats[Graphic3d_FrameStatsCounter_EstimatedBytesGeom] += EstimatedDataSize(); +} + +// ======================================================================= +// function : UpdateDrawStats +// purpose : +// ======================================================================= +void OpenGl_Element::UpdateDrawStats (Graphic3d_FrameStatsDataTmp& , + bool ) const +{ + // +} + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_Element::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_Element) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, this) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Element.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Element.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Element.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Element.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,7 @@ #include #include +class Graphic3d_FrameStatsDataTmp; class OpenGl_Workspace; class OpenGl_Context; @@ -60,9 +61,25 @@ //! Return TRUE if primitive type generates shaded triangulation (to be used in filters). virtual Standard_Boolean IsFillDrawMode() const { return false; } + //! Returns estimated GPU memory usage for holding data without considering overheads and allocation alignment rules. + virtual Standard_Size EstimatedDataSize() const { return 0; } + + //! Increment memory usage statistics. + //! Default implementation puts EstimatedDataSize() into Graphic3d_FrameStatsCounter_EstimatedBytesGeom. + Standard_EXPORT virtual void UpdateMemStats (Graphic3d_FrameStatsDataTmp& theStats) const; + + //! Increment draw calls statistics. + //! @param theStats [in] [out] frame counters to increment + //! @param theIsDetailed [in] indicate detailed dump (more counters - number of triangles, points, etc.) + Standard_EXPORT virtual void UpdateDrawStats (Graphic3d_FrameStatsDataTmp& theStats, + bool theIsDetailed) const; + //! Update parameters of the drawable elements. virtual void SynchronizeAspects() {} + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: Standard_EXPORT virtual ~OpenGl_Element(); diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Flipper.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Flipper.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Flipper.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Flipper.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -69,15 +69,19 @@ if (!myIsEnabled) { // restore matrix state - aContext->WorldViewState.Pop(); + aContext->ModelWorldState.Pop(); // Apply since we probably in the middle of something. - aContext->ApplyModelViewMatrix(); + aContext->ApplyModelWorldMatrix(); return; } - aContext->WorldViewState.Push(); - OpenGl_Mat4 aMatrixMV = aContext->WorldViewState.Current() * aContext->ModelWorldState.Current(); + aContext->ModelWorldState.Push(); + + OpenGl_Mat4 aModelWorldMatrix; + aModelWorldMatrix.Convert (aContext->ModelWorldState.Current()); + + OpenGl_Mat4 aMatrixMV = aContext->WorldViewState.Current() * aModelWorldMatrix; const OpenGl_Vec4 aMVReferenceOrigin = aMatrixMV * myReferenceOrigin; const OpenGl_Vec4 aMVReferenceX = aMatrixMV * OpenGl_Vec4 (myReferenceX.xyz() + myReferenceOrigin.xyz(), 1.0f); @@ -129,9 +133,20 @@ aTransform = aRefAxes * aTransform * aRefInv; // transform model-view matrix - aMatrixMV = aMatrixMV * aTransform; + aModelWorldMatrix = aModelWorldMatrix * aTransform; // load transformed model-view matrix - aContext->WorldViewState.SetCurrent (aMatrixMV); - aContext->ApplyWorldViewMatrix(); + aContext->ModelWorldState.SetCurrent (aModelWorldMatrix); + aContext->ApplyModelWorldMatrix(); +} + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_Flipper::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_Flipper) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, OpenGl_Element) } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Flipper.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Flipper.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Flipper.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Flipper.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,8 +39,11 @@ //! matrix modification should be set up or restored back. void SetOptions (const Standard_Boolean theIsEnabled) { myIsEnabled = theIsEnabled; } - Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; - Standard_EXPORT virtual void Release (OpenGl_Context* theCtx); + Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE; + Standard_EXPORT virtual void Release (OpenGl_Context* theCtx) Standard_OVERRIDE; + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; public: diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Font.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Font.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Font.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Font.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -147,15 +147,11 @@ Image_PixMap aBlackImg; if (!aBlackImg.InitZero (Image_Format_Alpha, Standard_Size(aTextureSizeX), Standard_Size(aTextureSizeY)) - || !aTexture->Init (theCtx, aBlackImg, Graphic3d_TOT_2D)) // myTextureFormat + || !aTexture->Init (theCtx, aBlackImg, Graphic3d_TOT_2D, true)) // myTextureFormat { - TCollection_ExtendedString aMsg; - aMsg += "New texture initialization of size "; - aMsg += aTextureSizeX; - aMsg += "x"; - aMsg += aTextureSizeY; - aMsg += " for textured font has failed."; - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, aMsg); + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString ("New texture initialization of size ") + + aTextureSizeX + "x" + aTextureSizeY + " for textured font has failed."); return false; } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_FrameBuffer.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_FrameBuffer.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_FrameBuffer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_FrameBuffer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,119 +38,26 @@ } return true; } -} -// ======================================================================= -// function : getDepthDataFormat -// purpose : -// ======================================================================= -bool OpenGl_FrameBuffer::getDepthDataFormat (GLint theTextFormat, - GLenum& thePixelFormat, - GLenum& theDataType) -{ - switch (theTextFormat) + //! Return TRUE if GL_DEPTH_STENCIL_ATTACHMENT can be used. + static bool hasDepthStencilAttach (const Handle(OpenGl_Context)& theCtx) { - case GL_DEPTH24_STENCIL8: - { - thePixelFormat = GL_DEPTH_STENCIL; - theDataType = GL_UNSIGNED_INT_24_8; - return true; - } - case GL_DEPTH32F_STENCIL8: - { - thePixelFormat = GL_DEPTH_STENCIL; - theDataType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV; - return true; - } - case GL_DEPTH_COMPONENT16: - { - thePixelFormat = GL_DEPTH_COMPONENT; - theDataType = GL_UNSIGNED_SHORT; - return true; - } - case GL_DEPTH_COMPONENT24: - { - thePixelFormat = GL_DEPTH_COMPONENT; - theDataType = GL_UNSIGNED_INT; - return true; - } - case GL_DEPTH_COMPONENT32F: - { - thePixelFormat = GL_DEPTH_COMPONENT; - theDataType = GL_FLOAT; - return true; - } - } - return false; -} - -// ======================================================================= -// function : getColorDataFormat -// purpose : -// ======================================================================= -bool OpenGl_FrameBuffer::getColorDataFormat (const Handle(OpenGl_Context)& theGlContext, - GLint theTextFormat, - GLenum& thePixelFormat, - GLenum& theDataType) -{ - switch (theTextFormat) - { - case GL_RGBA32F: - { - thePixelFormat = GL_RGBA; - theDataType = GL_FLOAT; - return true; - } - case GL_R32F: - { - thePixelFormat = GL_RED; - theDataType = GL_FLOAT; - return true; - } - case GL_RGBA16F: - { - thePixelFormat = GL_RGBA; - theDataType = GL_HALF_FLOAT; - if (theGlContext->hasHalfFloatBuffer == OpenGl_FeatureInExtensions) - { - #if defined(GL_ES_VERSION_2_0) - theDataType = GL_HALF_FLOAT_OES; - #else - theDataType = GL_FLOAT; - #endif - } - return true; - } - case GL_R16F: - { - thePixelFormat = GL_RED; - theDataType = GL_HALF_FLOAT; - if (theGlContext->hasHalfFloatBuffer == OpenGl_FeatureInExtensions) - { - #if defined(GL_ES_VERSION_2_0) - theDataType = GL_HALF_FLOAT_OES; - #else - theDataType = GL_FLOAT; - #endif - } - return true; - } - case GL_RGBA8: - case GL_RGBA: - { - thePixelFormat = GL_RGBA; - theDataType = GL_UNSIGNED_BYTE; - return true; - } - case GL_RGB8: - case GL_RGB: - { - thePixelFormat = GL_RGB; - theDataType = GL_UNSIGNED_BYTE; - return true; - } + #ifdef __EMSCRIPTEN__ + // supported since WebGL 2.0, + // while WebGL 1.0 + GL_WEBGL_depth_texture needs GL_DEPTH_STENCIL_ATTACHMENT + // and NOT separate GL_DEPTH_ATTACHMENT+GL_STENCIL_ATTACHMENT calls which is different to OpenGL ES 2.0 + extension + return theCtx->IsGlGreaterEqual (3, 0) || theCtx->extPDS; + #elif defined(GL_ES_VERSION_2_0) + // supported since OpenGL ES 3.0, + // while OpenGL ES 2.0 + GL_EXT_packed_depth_stencil needs separate GL_DEPTH_ATTACHMENT+GL_STENCIL_ATTACHMENT calls + return theCtx->IsGlGreaterEqual (3, 0); + #else + // available on desktop since OpenGL 3.0 + // or OpenGL 2.0 + GL_ARB_framebuffer_object (GL_EXT_framebuffer_object is unsupported by OCCT) + (void )theCtx; + return true; + #endif } - return false; } // ======================================================================= @@ -265,7 +172,7 @@ && !aColorTexture->Init2DMultisample (theGlContext, theNbSamples, aColorFormat, aSizeX, aSizeY)) { - Release (theGlContext.operator->()); + Release (theGlContext.get()); return Standard_False; } } @@ -274,17 +181,13 @@ { for (Standard_Integer aColorBufferIdx = 0; aColorBufferIdx < myColorTextures.Length(); ++aColorBufferIdx) { - GLenum aPixelFormat = 0; - GLenum aDataType = 0; const Handle(OpenGl_Texture)& aColorTexture = myColorTextures (aColorBufferIdx); const GLint aColorFormat = myColorFormats (aColorBufferIdx); - if (aColorFormat != 0 - && getColorDataFormat (theGlContext, aColorFormat, aPixelFormat, aDataType) - && !aColorTexture->Init (theGlContext, aColorFormat, - aPixelFormat, aDataType, - aSizeX, aSizeY, Graphic3d_TOT_2D)) + const OpenGl_TextureFormat aFormat = OpenGl_TextureFormat::FindSizedFormat (theGlContext, aColorFormat); + if (aFormat.IsValid() + && !aColorTexture->Init (theGlContext, aFormat, Graphic3d_Vec2i (aSizeX, aSizeY), Graphic3d_TOT_2D)) { - Release (theGlContext.operator->()); + Release (theGlContext.get()); return Standard_False; } } @@ -305,15 +208,18 @@ } if (myDepthStencilTexture->IsValid()) { - #ifdef GL_DEPTH_STENCIL_ATTACHMENT - theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, - myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); - #else - theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, - myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); - theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, - myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); - #endif + if (hasDepthStencilAttach (theGlContext)) + { + theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, + myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); + } + else + { + theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); + theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); + } } if (theGlContext->arbFBO->glCheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -402,18 +308,13 @@ } else { - GLenum aPixelFormat = 0; - GLenum aDataType = 0; - for (Standard_Integer aColorBufferIdx = 0; aColorBufferIdx < myColorTextures.Length(); ++aColorBufferIdx) { const Handle(OpenGl_Texture)& aColorTexture = myColorTextures (aColorBufferIdx); const GLint aColorFormat = myColorFormats (aColorBufferIdx); - if (aColorFormat != 0 - && getColorDataFormat (theGlContext, aColorFormat, aPixelFormat, aDataType) - && !aColorTexture->Init (theGlContext, aColorFormat, - aPixelFormat, aDataType, - aSizeX, aSizeY, Graphic3d_TOT_2D)) + const OpenGl_TextureFormat aFormat = OpenGl_TextureFormat::FindSizedFormat (theGlContext, aColorFormat); + if (aFormat.IsValid() + && !aColorTexture->Init (theGlContext, aFormat, Graphic3d_Vec2i (aSizeX, aSizeY), Graphic3d_TOT_2D)) { Release (theGlContext.operator->()); return Standard_False; @@ -422,21 +323,14 @@ // extensions (GL_OES_packed_depth_stencil, GL_OES_depth_texture) + GL version might be used to determine supported formats // instead of just trying to create such texture - if (myDepthFormat != 0 - && getDepthDataFormat (myDepthFormat, aPixelFormat, aDataType) - && !myDepthStencilTexture->Init (theGlContext, myDepthFormat, - aPixelFormat, aDataType, - aSizeX, aSizeY, Graphic3d_TOT_2D)) - { - TCollection_ExtendedString aMsg = TCollection_ExtendedString() - + "Warning! Depth textures are not supported by hardware!"; - theGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION, - GL_DEBUG_TYPE_PORTABILITY, - 0, - GL_DEBUG_SEVERITY_HIGH, - aMsg); + const OpenGl_TextureFormat aDepthFormat = OpenGl_TextureFormat::FindSizedFormat (theGlContext, myDepthFormat); + if (aDepthFormat.IsValid() + && !myDepthStencilTexture->Init (theGlContext, aDepthFormat, Graphic3d_Vec2i (aSizeX, aSizeY), Graphic3d_TOT_2D)) + { + theGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_HIGH, + "Warning! Depth textures are not supported by hardware!"); - hasStencilRB = aPixelFormat == GL_DEPTH_STENCIL + hasStencilRB = aDepthFormat.PixelFormat() == GL_DEPTH_STENCIL && theGlContext->extPDS; GLint aDepthStencilFormat = hasStencilRB ? GL_DEPTH24_STENCIL8 @@ -461,32 +355,39 @@ aColorTexture->GetTarget(), aColorTexture->TextureId(), 0); } } + if (myDepthStencilTexture->IsValid()) { - #ifdef GL_DEPTH_STENCIL_ATTACHMENT - theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, - myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); - #else - theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, - myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); - theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, - myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); - #endif + if (hasDepthStencilAttach (theGlContext)) + { + theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, + myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); + } + else + { + theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); + theGlContext->arbFBO->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + myDepthStencilTexture->GetTarget(), myDepthStencilTexture->TextureId(), 0); + } } else if (myGlDepthRBufferId != NO_RENDERBUFFER) { - #ifdef GL_DEPTH_STENCIL_ATTACHMENT - theGlContext->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, hasStencilRB ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT, - GL_RENDERBUFFER, myGlDepthRBufferId); - #else - theGlContext->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, - GL_RENDERBUFFER, myGlDepthRBufferId); - if (hasStencilRB) + if (hasDepthStencilAttach (theGlContext) && hasStencilRB) { - theGlContext->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + theGlContext->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, myGlDepthRBufferId); } - #endif + else + { + theGlContext->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, myGlDepthRBufferId); + if (hasStencilRB) + { + theGlContext->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, myGlDepthRBufferId); + } + } } if (theGlContext->arbFBO->glCheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -599,10 +500,8 @@ bool hasStencilRB = false; if (myDepthFormat != 0) { - GLenum aPixelFormat = 0; - GLenum aDataType = 0; - getDepthDataFormat (myDepthFormat, aPixelFormat, aDataType); - hasStencilRB = aPixelFormat == GL_DEPTH_STENCIL; + const OpenGl_TextureFormat aDepthFormat = OpenGl_TextureFormat::FindSizedFormat (theGlCtx, myDepthFormat); + hasStencilRB = aDepthFormat.PixelFormat() == GL_DEPTH_STENCIL; theGlCtx->arbFBO->glGenRenderbuffers (1, &myGlDepthRBufferId); theGlCtx->arbFBO->glBindRenderbuffer (GL_RENDERBUFFER, myGlDepthRBufferId); @@ -617,18 +516,21 @@ GL_RENDERBUFFER, myGlColorRBufferId); if (myGlDepthRBufferId != NO_RENDERBUFFER) { - #ifdef GL_DEPTH_STENCIL_ATTACHMENT - theGlCtx->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, hasStencilRB ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT, - GL_RENDERBUFFER, myGlDepthRBufferId); - #else - theGlCtx->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, - GL_RENDERBUFFER, myGlDepthRBufferId); - if (hasStencilRB) + if (hasDepthStencilAttach (theGlCtx) && hasStencilRB) { - theGlCtx->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + theGlCtx->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, myGlDepthRBufferId); } - #endif + else + { + theGlCtx->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, myGlDepthRBufferId); + if (hasStencilRB) + { + theGlCtx->arbFBO->glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, myGlDepthRBufferId); + } + } } if (theGlCtx->arbFBO->glCheckFramebufferStatus (GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -789,6 +691,7 @@ void OpenGl_FrameBuffer::BindBuffer (const Handle(OpenGl_Context)& theGlCtx) { theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, myGlFBufferId); + theGlCtx->SetFrameBufferSRGB (true); } // ======================================================================= @@ -798,6 +701,7 @@ void OpenGl_FrameBuffer::BindDrawBuffer (const Handle(OpenGl_Context)& theGlCtx) { theGlCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, myGlFBufferId); + theGlCtx->SetFrameBufferSRGB (true); } // ======================================================================= @@ -823,6 +727,7 @@ else { theGlCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, NO_FRAMEBUFFER); + theGlCtx->SetFrameBufferSRGB (false); } } @@ -874,11 +779,15 @@ { #if !defined(GL_ES_VERSION_2_0) case Image_Format_Gray: - aFormat = GL_DEPTH_COMPONENT; + aFormat = theBufferType == Graphic3d_BT_Depth ? GL_DEPTH_COMPONENT : GL_RED; aType = GL_UNSIGNED_BYTE; break; case Image_Format_GrayF: - aFormat = GL_DEPTH_COMPONENT; + aFormat = theBufferType == Graphic3d_BT_Depth ? GL_DEPTH_COMPONENT : GL_RED; + aType = GL_FLOAT; + break; + case Image_Format_RGF: + aFormat = GL_RG; aType = GL_FLOAT; break; case Image_Format_RGB: @@ -907,6 +816,7 @@ case Image_Format_GrayF: case Image_Format_BGRF: case Image_Format_BGRAF: + case Image_Format_RGF: return Standard_False; case Image_Format_BGRA: case Image_Format_BGR32: diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_FrameBuffer.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_FrameBuffer.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_FrameBuffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_FrameBuffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -271,19 +271,6 @@ protected: - //! Determine data type from texture sized format. - Standard_EXPORT static bool getDepthDataFormat (GLint theTextFormat, - GLenum& thePixelFormat, - GLenum& theDataType); - - //! Determine data type from texture sized format. - Standard_EXPORT static bool getColorDataFormat (const Handle(OpenGl_Context)& theCtx, - GLint theTextFormat, - GLenum& thePixelFormat, - GLenum& theDataType); - -protected: - typedef NCollection_Vector OpenGl_TextureArray; protected: diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_FrameStats.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_FrameStats.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_FrameStats.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_FrameStats.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -61,6 +61,8 @@ else if (myLastFrameIndex == thePrev->myLastFrameIndex && Abs (aFrame.FrameRate() - thePrev->myCountersTmp.FrameRate()) <= 0.001 && Abs (aFrame.FrameRateCpu() - thePrev->myCountersTmp.FrameRateCpu()) <= 0.001 + && Abs (aFrame.ImmediateFrameRate() - thePrev->myCountersTmp.ImmediateFrameRate()) <= 0.001 + && Abs (aFrame.ImmediateFrameRateCpu() - thePrev->myCountersTmp.ImmediateFrameRateCpu()) <= 0.001 && aFrame[Graphic3d_FrameStatsCounter_NbLayers] == thePrev->myCountersTmp[Graphic3d_FrameStatsCounter_NbLayers] && aFrame[Graphic3d_FrameStatsCounter_NbLayersNotCulled] == thePrev->myCountersTmp[Graphic3d_FrameStatsCounter_NbLayersNotCulled] && aFrame[Graphic3d_FrameStatsCounter_NbStructs] == thePrev->myCountersTmp[Graphic3d_FrameStatsCounter_NbStructs] @@ -92,6 +94,7 @@ const Graphic3d_RenderingParams::PerfCounters aBits = theView->RenderingParams().CollectedStats; const Standard_Boolean toCountMem = (aBits & Graphic3d_RenderingParams::PerfCounters_EstimMem) != 0; const Standard_Boolean toCountTris = (aBits & Graphic3d_RenderingParams::PerfCounters_Triangles) != 0 + || (aBits & Graphic3d_RenderingParams::PerfCounters_Lines) != 0 || (aBits & Graphic3d_RenderingParams::PerfCounters_Points) != 0; const Standard_Boolean toCountElems = (aBits & Graphic3d_RenderingParams::PerfCounters_GroupArrays) != 0 || toCountTris || toCountMem; const Standard_Boolean toCountGroups = (aBits & Graphic3d_RenderingParams::PerfCounters_Groups) != 0 || toCountElems; @@ -207,11 +210,7 @@ const OpenGl_Group* aGroup = aGroupIter.Value(); for (const OpenGl_ElementNode* aNodeIter = aGroup->FirstNode(); aNodeIter != NULL; aNodeIter = aNodeIter->next) { - if (const OpenGl_PrimitiveArray* aPrim = dynamic_cast (aNodeIter->elem)) - { - myCountersTmp[Graphic3d_FrameStatsCounter_EstimatedBytesGeom] += estimatedDataSize (aPrim->AttributesVbo()); - myCountersTmp[Graphic3d_FrameStatsCounter_EstimatedBytesGeom] += estimatedDataSize (aPrim->IndexVbo()); - } + aNodeIter->elem->UpdateMemStats (myCountersTmp); } } } @@ -229,96 +228,11 @@ const OpenGl_Group* aGroup = aGroupIter.Value(); for (const OpenGl_ElementNode* aNodeIter = aGroup->FirstNode(); aNodeIter != NULL; aNodeIter = aNodeIter->next) { - if (const OpenGl_PrimitiveArray* aPrim = dynamic_cast (aNodeIter->elem)) + if (theToCountMem) { - ++myCountersTmp[Graphic3d_FrameStatsCounter_NbElemsNotCulled]; - if (theToCountMem) - { - myCountersTmp[Graphic3d_FrameStatsCounter_EstimatedBytesGeom] += estimatedDataSize (aPrim->AttributesVbo()); - myCountersTmp[Graphic3d_FrameStatsCounter_EstimatedBytesGeom] += estimatedDataSize (aPrim->IndexVbo()); - } - - if (aPrim->IsFillDrawMode()) - { - ++myCountersTmp[Graphic3d_FrameStatsCounter_NbElemsFillNotCulled]; - if (!theToCountTris) - { - continue; - } - - const Handle(OpenGl_VertexBuffer)& anAttribs = aPrim->AttributesVbo(); - if (anAttribs.IsNull() - || !anAttribs->IsValid()) - { - continue; - } - - const Handle(OpenGl_VertexBuffer)& anIndices = aPrim->IndexVbo(); - const Standard_Integer aNbIndices = !anIndices.IsNull() ? anIndices->GetElemsNb() : anAttribs->GetElemsNb(); - const Standard_Integer aNbBounds = !aPrim->Bounds().IsNull() ? aPrim->Bounds()->NbBounds : 1; - switch (aPrim->DrawMode()) - { - case GL_TRIANGLES: - { - myCountersTmp[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aNbIndices / 3; - break; - } - case GL_TRIANGLE_STRIP: - case GL_TRIANGLE_FAN: - { - myCountersTmp[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aNbIndices - 2 * aNbBounds; - break; - } - case GL_TRIANGLES_ADJACENCY: - { - myCountersTmp[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aNbIndices / 6; - break; - } - case GL_TRIANGLE_STRIP_ADJACENCY: - { - myCountersTmp[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aNbIndices - 4 * aNbBounds; - break; - } - #if !defined(GL_ES_VERSION_2_0) - case GL_QUADS: - { - myCountersTmp[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aNbIndices / 2; - break; - } - case GL_QUAD_STRIP: - { - myCountersTmp[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += (aNbIndices / 2 - aNbBounds) * 2; - break; - } - #endif - } - } - else if (aPrim->DrawMode() == GL_POINTS) - { - ++myCountersTmp[Graphic3d_FrameStatsCounter_NbElemsPointNotCulled]; - if (theToCountTris) - { - const Handle(OpenGl_VertexBuffer)& anAttribs = aPrim->AttributesVbo(); - if (!anAttribs.IsNull() - && anAttribs->IsValid()) - { - const Handle(OpenGl_VertexBuffer)& anIndices = aPrim->IndexVbo(); - const Standard_Integer aNbIndices = !anIndices.IsNull() ? anIndices->GetElemsNb() : anAttribs->GetElemsNb(); - myCountersTmp[Graphic3d_FrameStatsCounter_NbPointsNotCulled] += aNbIndices; - } - } - } - else - { - ++myCountersTmp[Graphic3d_FrameStatsCounter_NbElemsLineNotCulled]; - } - } - else if (const OpenGl_Text* aText = dynamic_cast (aNodeIter->elem)) - { - (void )aText; - ++myCountersTmp[Graphic3d_FrameStatsCounter_NbElemsNotCulled]; - ++myCountersTmp[Graphic3d_FrameStatsCounter_NbElemsTextNotCulled]; + aNodeIter->elem->UpdateMemStats (myCountersTmp); } + aNodeIter->elem->UpdateDrawStats (myCountersTmp, theToCountTris); } } } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_FrameStatsPrs.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_FrameStatsPrs.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_FrameStatsPrs.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_FrameStatsPrs.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -389,7 +389,7 @@ aCtx->WorldViewState.Push(); if (!myCountersTrsfPers.IsNull()) { - myCountersTrsfPers->Apply (theWorkspace->View()->Camera(), + myCountersTrsfPers->Apply (aCtx->Camera(), aCtx->ProjectionState.Current(), aCtx->WorldViewState.ChangeCurrent(), aCtx->VirtualViewport()[2], aCtx->VirtualViewport()[3]); } @@ -454,3 +454,14 @@ glDepthMask (wasEnabledDepth ? GL_TRUE : GL_FALSE); } } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_FrameStatsPrs::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_FrameStatsPrs) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, OpenGl_Element) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_FrameStatsPrs.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_FrameStatsPrs.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_FrameStatsPrs.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_FrameStatsPrs.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,6 +45,9 @@ //! Assign text aspect. void SetTextAspect (const Handle(Graphic3d_AspectText3d)& theAspect) { myTextAspect.SetAspect (theAspect); } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: //! Update chart presentation. diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GlCore30.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GlCore30.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GlCore30.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GlCore30.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,8 +28,6 @@ public: //! @name GL_ARB_framebuffer_object (added to OpenGL 3.0 core) -#if !defined(GL_ES_VERSION_2_0) - using theBaseClass_t::glIsRenderbuffer; using theBaseClass_t::glBindRenderbuffer; using theBaseClass_t::glDeleteRenderbuffers; @@ -41,15 +39,17 @@ using theBaseClass_t::glDeleteFramebuffers; using theBaseClass_t::glGenFramebuffers; using theBaseClass_t::glCheckFramebufferStatus; - using theBaseClass_t::glFramebufferTexture1D; using theBaseClass_t::glFramebufferTexture2D; - using theBaseClass_t::glFramebufferTexture3D; using theBaseClass_t::glFramebufferRenderbuffer; using theBaseClass_t::glGetFramebufferAttachmentParameteriv; using theBaseClass_t::glGenerateMipmap; using theBaseClass_t::glBlitFramebuffer; using theBaseClass_t::glRenderbufferStorageMultisample; using theBaseClass_t::glFramebufferTextureLayer; +#if !defined(GL_ES_VERSION_2_0) + using theBaseClass_t::glFramebufferTexture1D; + using theBaseClass_t::glFramebufferTexture3D; +#endif public: //! @name GL_ARB_vertex_array_object (added to OpenGL 3.0 core) @@ -60,51 +60,29 @@ public: //! @name GL_ARB_map_buffer_range (added to OpenGL 3.0 core) +#ifndef __EMSCRIPTEN__ using theBaseClass_t::glMapBufferRange; using theBaseClass_t::glFlushMappedBufferRange; +#endif public: //! @name OpenGL 3.0 additives to 2.1 - using theBaseClass_t::glColorMaski; using theBaseClass_t::glGetBooleani_v; using theBaseClass_t::glGetIntegeri_v; - using theBaseClass_t::glEnablei; - using theBaseClass_t::glDisablei; - using theBaseClass_t::glIsEnabledi; using theBaseClass_t::glBeginTransformFeedback; using theBaseClass_t::glEndTransformFeedback; using theBaseClass_t::glBindBufferRange; using theBaseClass_t::glBindBufferBase; using theBaseClass_t::glTransformFeedbackVaryings; using theBaseClass_t::glGetTransformFeedbackVarying; - using theBaseClass_t::glClampColor; - using theBaseClass_t::glBeginConditionalRender; - using theBaseClass_t::glEndConditionalRender; using theBaseClass_t::glVertexAttribIPointer; using theBaseClass_t::glGetVertexAttribIiv; using theBaseClass_t::glGetVertexAttribIuiv; - using theBaseClass_t::glVertexAttribI1i; - using theBaseClass_t::glVertexAttribI2i; - using theBaseClass_t::glVertexAttribI3i; using theBaseClass_t::glVertexAttribI4i; - using theBaseClass_t::glVertexAttribI1ui; - using theBaseClass_t::glVertexAttribI2ui; - using theBaseClass_t::glVertexAttribI3ui; using theBaseClass_t::glVertexAttribI4ui; - using theBaseClass_t::glVertexAttribI1iv; - using theBaseClass_t::glVertexAttribI2iv; - using theBaseClass_t::glVertexAttribI3iv; using theBaseClass_t::glVertexAttribI4iv; - using theBaseClass_t::glVertexAttribI1uiv; - using theBaseClass_t::glVertexAttribI2uiv; - using theBaseClass_t::glVertexAttribI3uiv; using theBaseClass_t::glVertexAttribI4uiv; - using theBaseClass_t::glVertexAttribI4bv; - using theBaseClass_t::glVertexAttribI4sv; - using theBaseClass_t::glVertexAttribI4ubv; - using theBaseClass_t::glVertexAttribI4usv; using theBaseClass_t::glGetUniformuiv; - using theBaseClass_t::glBindFragDataLocation; using theBaseClass_t::glGetFragDataLocation; using theBaseClass_t::glUniform1ui; using theBaseClass_t::glUniform2ui; @@ -114,18 +92,62 @@ using theBaseClass_t::glUniform2uiv; using theBaseClass_t::glUniform3uiv; using theBaseClass_t::glUniform4uiv; - using theBaseClass_t::glTexParameterIiv; - using theBaseClass_t::glTexParameterIuiv; - using theBaseClass_t::glGetTexParameterIiv; - using theBaseClass_t::glGetTexParameterIuiv; using theBaseClass_t::glClearBufferiv; using theBaseClass_t::glClearBufferuiv; using theBaseClass_t::glClearBufferfv; using theBaseClass_t::glClearBufferfi; using theBaseClass_t::glGetStringi; +#if !defined(GL_ES_VERSION_2_0) + // the following have been added only in OpenGL ES 3.2 + using theBaseClass_t::glColorMaski; + using theBaseClass_t::glEnablei; + using theBaseClass_t::glDisablei; + using theBaseClass_t::glIsEnabledi; + + using theBaseClass_t::glTexParameterIiv; + using theBaseClass_t::glTexParameterIuiv; + using theBaseClass_t::glGetTexParameterIiv; + using theBaseClass_t::glGetTexParameterIuiv; +#endif + +#if !defined(GL_ES_VERSION_2_0) + // the following are defined only on desktop OpenGL + using theBaseClass_t::glClampColor; + using theBaseClass_t::glBeginConditionalRender; + using theBaseClass_t::glEndConditionalRender; + using theBaseClass_t::glBindFragDataLocation; + using theBaseClass_t::glVertexAttribI1i; + using theBaseClass_t::glVertexAttribI2i; + using theBaseClass_t::glVertexAttribI3i; + using theBaseClass_t::glVertexAttribI1ui; + using theBaseClass_t::glVertexAttribI2ui; + using theBaseClass_t::glVertexAttribI3ui; + using theBaseClass_t::glVertexAttribI1iv; + using theBaseClass_t::glVertexAttribI2iv; + using theBaseClass_t::glVertexAttribI3iv; + using theBaseClass_t::glVertexAttribI1uiv; + using theBaseClass_t::glVertexAttribI2uiv; + using theBaseClass_t::glVertexAttribI3uiv; + using theBaseClass_t::glVertexAttribI4bv; + using theBaseClass_t::glVertexAttribI4sv; + using theBaseClass_t::glVertexAttribI4ubv; + using theBaseClass_t::glVertexAttribI4usv; #endif +#if defined(GL_ES_VERSION_2_0) + // the following functions from OpenGL 1.5 have been added only in OpenGL ES 3.0 + using theBaseClass_t::glGenQueries; + using theBaseClass_t::glDeleteQueries; + using theBaseClass_t::glIsQuery; + using theBaseClass_t::glBeginQuery; + using theBaseClass_t::glEndQuery; + using theBaseClass_t::glGetQueryiv; + using theBaseClass_t::glGetQueryObjectuiv; +#ifndef __EMSCRIPTEN__ + using theBaseClass_t::glUnmapBuffer; +#endif +#endif }; //! OpenGL 3.0 core based on 2.1 version. diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GlCore31.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GlCore31.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GlCore31.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GlCore31.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,17 +23,17 @@ struct OpenGl_TmplCore31 : public theBaseClass_t { -#if !defined(GL_ES_VERSION_2_0) - public: //! @name GL_ARB_uniform_buffer_object (added to OpenGL 3.1 core) using theBaseClass_t::glGetUniformIndices; using theBaseClass_t::glGetActiveUniformsiv; - using theBaseClass_t::glGetActiveUniformName; using theBaseClass_t::glGetUniformBlockIndex; using theBaseClass_t::glGetActiveUniformBlockiv; using theBaseClass_t::glGetActiveUniformBlockName; using theBaseClass_t::glUniformBlockBinding; +#if !defined(GL_ES_VERSION_2_0) + using theBaseClass_t::glGetActiveUniformName; // undefined in OpenGL ES +#endif public: //! @name GL_ARB_copy_buffer (added to OpenGL 3.1 core) @@ -43,9 +43,9 @@ using theBaseClass_t::glDrawArraysInstanced; using theBaseClass_t::glDrawElementsInstanced; - using theBaseClass_t::glTexBuffer; - using theBaseClass_t::glPrimitiveRestartIndex; - +#if !defined(GL_ES_VERSION_2_0) + using theBaseClass_t::glTexBuffer; // added in OpenGL ES 3.2 + using theBaseClass_t::glPrimitiveRestartIndex; // undefined in OpenGL ES #endif }; diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GLESExtensions.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GLESExtensions.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GLESExtensions.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GLESExtensions.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,352 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _OpenGl_GLESExtensions_Header +#define _OpenGl_GLESExtensions_Header + +// define items to unify code paths with desktop OpenGL +typedef double GLdouble; +typedef double GLclampd; + +// GL_EXT_sRGB_write_control extension for OpenGL ES +// adds GL_FRAMEBUFFER_SRGB_EXT flag as on desktop OpenGL +#define GL_FRAMEBUFFER_SRGB 0x8DB9 + +// OpenGL ES 3.1+ +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 + +// OpenGL ES 3.2+ or GL_EXT_texture_buffer for OpenGL ES 3.1+ +#define GL_TEXTURE_BUFFER 0x8C2A + +// in core since OpenGL ES 3.0, extension GL_OES_rgb8_rgba8 +#define GL_LUMINANCE8 0x8040 +// GL_EXT_texture_format_BGRA8888 +#define GL_BGRA_EXT 0x80E1 // same as GL_BGRA on desktop + +#define GL_R16 0x822A +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_ALPHA8 0x803C +#define GL_ALPHA16 0x803E +#define GL_RG16 0x822C + +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B + +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 + +// GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + +// debug ARB extension +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 + +// OpenGL ES 3.0+ or OES_texture_half_float +#define GL_HALF_FLOAT_OES 0x8D61 + +// OpenGL ES 3.1+ +#define GL_COMPUTE_SHADER 0x91B9 + +// OpenGL ES 3.2+ +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PATCHES 0x000E + +// GL_EXT_texture_compression_s3tc extension +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +// +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F + +#ifndef GL_APIENTRYP + #define GL_APIENTRYP GL_APIENTRY* +#endif + +// put into namespace to avoid collisions with system headers +namespace opencascade +{ + +//#ifndef GL_ES_VERSION_3_0 +typedef void (GL_APIENTRYP PFNGLREADBUFFERPROC) (GLenum src); +typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (GL_APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GL_APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (GL_APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (GL_APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); +typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef void (GL_APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (GL_APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (GL_APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GL_APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GL_APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (GL_APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); +typedef void (GL_APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); +typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (GL_APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GL_APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GL_APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GL_APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (GL_APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GL_APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef GLuint (GL_APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (GL_APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (GL_APIENTRYP PFNGLISSYNCPROC) (GLsync sync); +typedef void (GL_APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); +typedef void (GL_APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (GL_APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (GL_APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (GL_APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (GL_APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (GL_APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +typedef void (GL_APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (GL_APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (GL_APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (GL_APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (GL_APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (GL_APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +typedef void (GL_APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (GL_APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +//#endif GL_ES_VERSION_3_0 + +//#ifndef GL_ES_VERSION_3_1 +typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GL_APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +typedef GLuint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); +typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (GL_APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (GL_APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (GL_APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); +typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC) (GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC) (GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (GL_APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); +//#endif GL_ES_VERSION_3_1 + +//#ifndef GL_ES_VERSION_3_2 +typedef void (GL_APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); + +typedef void (GL_APIENTRYP PFNGLBLENDBARRIERPROC) (void); +typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (GL_APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETPOINTERVPROC) (GLenum pname, void **params); +typedef void (GL_APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GL_APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (GL_APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (GL_APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); +typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +//#endif GL_ES_VERSION_3_2 + +} // namespace opencascade + +#endif // _OpenGl_GLESExtensions_Header diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GlFunctions.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GlFunctions.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GlFunctions.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GlFunctions.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,181 +49,32 @@ // macOS 10.4 deprecated OpenGL framework - suppress useless warnings #define GL_SILENCE_DEPRECATION #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE - #include + #include #else #include #endif #define __X_GL_H // prevent chaotic gl.h inclusions to avoid compile errors -#elif defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) +#elif defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) #if defined(_WIN32) // Angle OpenGL ES headers do not define function prototypes even for core functions, // however OCCT is expected to be linked against libGLESv2 #define GL_GLEXT_PROTOTYPES #endif - #include - //#include + #include #else #include #endif -#if defined(GL_ES_VERSION_2_0) - // define items to unify code paths with desktop OpenGL - typedef double GLdouble; - typedef double GLclampd; - typedef uint64_t GLuint64; - #define GL_NONE 0 - - // OpenGL ES 3.0+ or GL_OES_element_index_uint extension - #define GL_UNSIGNED_INT 0x1405 - - // OpenGL ES 3.1+ - #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 - #define GL_MAX_SAMPLES 0x8D57 - - // OpenGL ES 3.2+ or GL_EXT_texture_buffer for OpenGL ES 3.1+ - #define GL_TEXTURE_BUFFER 0x8C2A - - // in core since OpenGL ES 3.0, extension GL_EXT_texture_rg - #define GL_RED 0x1903 - #define GL_R8 0x8229 - // in core since OpenGL ES 3.0, extension GL_OES_rgb8_rgba8 - #define GL_RGB8 0x8051 - #define GL_RGBA8 0x8058 - #define GL_LUMINANCE8 0x8040 - // GL_EXT_texture_format_BGRA8888 - #define GL_BGRA_EXT 0x80E1 // same as GL_BGRA on desktop - - #define GL_R16 0x822A - #define GL_R16F 0x822D - #define GL_R32F 0x822E - #define GL_RGB16F 0x881B - #define GL_RGBA32F 0x8814 - #define GL_RGB32F 0x8815 - #define GL_RGBA16F 0x881A - #define GL_RGB16F 0x881B - #define GL_RGB4 0x804F - #define GL_RGB5 0x8050 - #define GL_RGB8 0x8051 - #define GL_RGB10 0x8052 - #define GL_RGB12 0x8053 - #define GL_RGB16 0x8054 - #define GL_RGBA8 0x8058 - #define GL_RGB10_A2 0x8059 - #define GL_RGBA12 0x805A - #define GL_RGBA16 0x805B - #define GL_ALPHA8 0x803C - #define GL_ALPHA16 0x803E - - #define GL_RG 0x8227 - #define GL_RG8 0x822B - #define GL_RG16 0x822C - #define GL_RG16F 0x822F - #define GL_RG32F 0x8230 - #define GL_RG_INTEGER 0x8228 - #define GL_RED_INTEGER 0x8D94 - - #define GL_R8I 0x8231 - #define GL_R8UI 0x8232 - #define GL_R16I 0x8233 - #define GL_R16UI 0x8234 - #define GL_R32I 0x8235 - #define GL_R32UI 0x8236 - #define GL_RG8I 0x8237 - #define GL_RG8UI 0x8238 - #define GL_RG16I 0x8239 - #define GL_RG16UI 0x823A - #define GL_RG32I 0x823B - #define GL_RG32UI 0x823C - #define GL_RG8_SNORM 0x8F95 - #define GL_RGBA32UI 0x8D70 - #define GL_RGB32UI 0x8D71 - #define GL_RGBA16UI 0x8D76 - #define GL_RGB16UI 0x8D77 - #define GL_RGBA8UI 0x8D7C - #define GL_RGB8UI 0x8D7D - #define GL_RGBA32I 0x8D82 - #define GL_RGB32I 0x8D83 - #define GL_RGBA16I 0x8D88 - #define GL_RGB16I 0x8D89 - #define GL_RGBA8I 0x8D8E - #define GL_RGB8I 0x8D8F - - // GL_OES_packed_depth_stencil - #define GL_DEPTH_STENCIL 0x84F9 - #define GL_UNSIGNED_INT_24_8 0x84FA - #define GL_DEPTH24_STENCIL8 0x88F0 - - // OpenGL ES 3.0+ - #define GL_DEPTH_COMPONENT24 0x81A6 - #define GL_DEPTH_COMPONENT32F 0x8CAC - #define GL_DEPTH32F_STENCIL8 0x8CAD - #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD - - #define GL_READ_FRAMEBUFFER 0x8CA8 - #define GL_DRAW_FRAMEBUFFER 0x8CA9 - - #define GL_TEXTURE_3D 0x806F - #define GL_TEXTURE_WRAP_R 0x8072 - - // GL_EXT_texture_filter_anisotropic - #define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE - #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF - - // debug ARB extension - #define GL_DEBUG_OUTPUT 0x92E0 - #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 - #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 - #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 - #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 - #define GL_DEBUG_SOURCE_API 0x8246 - #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 - #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 - #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 - #define GL_DEBUG_SOURCE_APPLICATION 0x824A - #define GL_DEBUG_SOURCE_OTHER 0x824B - #define GL_DEBUG_TYPE_ERROR 0x824C - #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D - #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E - #define GL_DEBUG_TYPE_PORTABILITY 0x824F - #define GL_DEBUG_TYPE_PERFORMANCE 0x8250 - #define GL_DEBUG_TYPE_OTHER 0x8251 - #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 - #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 - #define GL_DEBUG_LOGGED_MESSAGES 0x9145 - #define GL_DEBUG_SEVERITY_HIGH 0x9146 - #define GL_DEBUG_SEVERITY_MEDIUM 0x9147 - #define GL_DEBUG_SEVERITY_LOW 0x9148 - - // GL_ARB_draw_buffers (GL_EXT_draw_buffers) extension - #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF - #define GL_MAX_DRAW_BUFFERS 0x8824 - - // OpenGL ES 3.0+ or OES_texture_half_float - #define GL_HALF_FLOAT 0x140B - #define GL_HALF_FLOAT_OES 0x8D61 - - // OpenGL ES 3.1+ - #define GL_COMPUTE_SHADER 0x91B9 - - // OpenGL ES 3.2+ - #define GL_GEOMETRY_SHADER 0x8DD9 - #define GL_TESS_CONTROL_SHADER 0x8E88 - #define GL_TESS_EVALUATION_SHADER 0x8E87 - #define GL_LINES_ADJACENCY 0x000A - #define GL_LINE_STRIP_ADJACENCY 0x000B - #define GL_TRIANGLES_ADJACENCY 0x000C - #define GL_TRIANGLE_STRIP_ADJACENCY 0x000D - #define GL_PATCHES 0x000E -#endif - -#if !defined(HAVE_EGL) && (defined(__ANDROID__) || defined(__QNX__) || defined(HAVE_GLES2) || defined(OCCT_UWP)) +#if !defined(HAVE_EGL) && (defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(HAVE_GLES2) || defined(OCCT_UWP)) #define HAVE_EGL #endif #include -// GL version can be defined by system gl.h header -#if !defined(GL_ES_VERSION_2_0) +#if defined(GL_ES_VERSION_2_0) + #include +#else + // GL version can be defined by system gl.h header #undef GL_VERSION_1_2 #undef GL_VERSION_1_3 #undef GL_VERSION_1_4 @@ -253,87 +104,87 @@ #if defined(GL_ES_VERSION_2_0) - inline void glActiveTexture (GLenum texture) + inline void glActiveTexture (GLenum texture) const { ::glActiveTexture (texture); } - inline void glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) + inline void glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) const { ::glCompressedTexImage2D (target, level, internalformat, width, height, border, imageSize, data); } - inline void glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) + inline void glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) const { ::glCompressedTexSubImage2D (target, level, xoffset, yoffset, width, height, format, imageSize, data); } - inline void glBindBuffer (GLenum target, GLuint buffer) + inline void glBindBuffer (GLenum target, GLuint buffer) const { ::glBindBuffer (target, buffer); } - inline void glBufferData (GLenum target, GLsizeiptr size, const void* data, GLenum usage) + inline void glBufferData (GLenum target, GLsizeiptr size, const void* data, GLenum usage) const { ::glBufferData (target, size, data, usage); } - inline void glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void* data) + inline void glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void* data) const { ::glBufferSubData (target, offset, size, data); } - inline void glDeleteBuffers (GLsizei n, const GLuint *buffers) + inline void glDeleteBuffers (GLsizei n, const GLuint *buffers) const { ::glDeleteBuffers (n, buffers); } - inline void glDeleteTextures (GLsizei n, const GLuint *textures) + inline void glDeleteTextures (GLsizei n, const GLuint *textures) const { ::glDeleteTextures (n, textures); } - inline void glDepthFunc (GLenum func) + inline void glDepthFunc (GLenum func) const { ::glDepthFunc (func); } - inline void glDepthMask (GLboolean flag) + inline void glDepthMask (GLboolean flag) const { ::glDepthMask (flag); } - inline void glDepthRangef (GLfloat n, GLfloat f) + inline void glDepthRangef (GLfloat n, GLfloat f) const { ::glDepthRangef (n, f); } - inline void glGenBuffers (GLsizei n, GLuint *buffers) + inline void glGenBuffers (GLsizei n, GLuint *buffers) const { ::glGenBuffers (n, buffers); } - inline void glGenTextures (GLsizei n, GLuint *textures) + inline void glGenTextures (GLsizei n, GLuint *textures) const { ::glGenTextures (n, textures); } - inline void glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params) + inline void glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params) const { ::glGetBufferParameteriv (target, pname, params); } - inline GLboolean glIsBuffer (GLuint buffer) + inline GLboolean glIsBuffer (GLuint buffer) const { return ::glIsBuffer (buffer); } - inline void glSampleCoverage (GLfloat value, GLboolean invert) + inline void glSampleCoverage (GLfloat value, GLboolean invert) const { ::glSampleCoverage (value, invert); } - inline void glMultiDrawElements (GLenum theMode, const GLsizei* theCount, GLenum theType, const void* const* theIndices, GLsizei theDrawCount) + inline void glMultiDrawElements (GLenum theMode, const GLsizei* theCount, GLenum theType, const void* const* theIndices, GLsizei theDrawCount) const { if (theCount == NULL || theIndices == NULL) @@ -352,497 +203,653 @@ public: //! @name OpenGL ES 2.0 #if defined(GL_ES_VERSION_2_0) - inline void glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) + inline void glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) const { ::glBlendColor (red, green, blue, alpha); } - inline void glBlendEquation (GLenum mode) + inline void glBlendEquation (GLenum mode) const { ::glBlendEquation (mode); } - inline void glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) + inline void glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) const { ::glBlendFuncSeparate (sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } - inline void glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha) + inline void glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha) const { ::glBlendEquationSeparate (modeRGB, modeAlpha); } - inline void glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) + inline void glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) const { ::glStencilOpSeparate (face, sfail, dpfail, dppass); } - inline void glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask) + inline void glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask) const { ::glStencilFuncSeparate (face, func, ref, mask); } - inline void glStencilMaskSeparate (GLenum face, GLuint mask) + inline void glStencilMaskSeparate (GLenum face, GLuint mask) const { ::glStencilMaskSeparate (face, mask); } - inline void glAttachShader (GLuint program, GLuint shader) + inline void glAttachShader (GLuint program, GLuint shader) const { ::glAttachShader (program, shader); } - inline void glBindAttribLocation (GLuint program, GLuint index, const GLchar *name) + inline void glBindAttribLocation (GLuint program, GLuint index, const GLchar *name) const { ::glBindAttribLocation (program, index, name); } - inline void glBindFramebuffer (GLenum target, GLuint framebuffer) + inline void glBindFramebuffer (GLenum target, GLuint framebuffer) const { ::glBindFramebuffer (target, framebuffer); } - inline void glBindRenderbuffer (GLenum target, GLuint renderbuffer) + inline void glBindRenderbuffer (GLenum target, GLuint renderbuffer) const { ::glBindRenderbuffer (target, renderbuffer); } - inline GLenum glCheckFramebufferStatus (GLenum target) + inline GLenum glCheckFramebufferStatus (GLenum target) const { return ::glCheckFramebufferStatus (target); } - inline void glCompileShader (GLuint shader) + inline void glCompileShader (GLuint shader) const { ::glCompileShader (shader); } - inline GLuint glCreateProgram() + inline GLuint glCreateProgram() const { return ::glCreateProgram(); } - inline GLuint glCreateShader (GLenum type) + inline GLuint glCreateShader (GLenum type) const { return ::glCreateShader (type); } - inline void glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers) + inline void glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers) const { ::glDeleteFramebuffers (n, framebuffers); } - inline void glDeleteProgram (GLuint program) + inline void glDeleteProgram (GLuint program) const { ::glDeleteProgram (program); } - inline void glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers) + inline void glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers) const { ::glDeleteRenderbuffers (n, renderbuffers); } - inline void glDeleteShader (GLuint shader) + inline void glDeleteShader (GLuint shader) const { ::glDeleteShader (shader); } - inline void glDetachShader (GLuint program, GLuint shader) + inline void glDetachShader (GLuint program, GLuint shader) const { ::glDetachShader (program, shader); } - inline void glDisableVertexAttribArray (GLuint index) + inline void glDisableVertexAttribArray (GLuint index) const { ::glDisableVertexAttribArray (index); } - inline void glEnableVertexAttribArray (GLuint index) + inline void glEnableVertexAttribArray (GLuint index) const { ::glEnableVertexAttribArray (index); } - inline void glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) + inline void glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) const { ::glFramebufferRenderbuffer (target, attachment, renderbuffertarget, renderbuffer); } - inline void glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) + inline void glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) const { ::glFramebufferTexture2D (target, attachment, textarget, texture, level); } - inline void glGenerateMipmap (GLenum target) + inline void glGenerateMipmap (GLenum target) const { ::glGenerateMipmap (target); } - inline void glGenFramebuffers (GLsizei n, GLuint *framebuffers) + inline void glGenFramebuffers (GLsizei n, GLuint *framebuffers) const { ::glGenFramebuffers (n, framebuffers); } - inline void glGenRenderbuffers (GLsizei n, GLuint *renderbuffers) + inline void glGenRenderbuffers (GLsizei n, GLuint *renderbuffers) const { ::glGenRenderbuffers (n, renderbuffers); } - inline void glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint* size, GLenum *type, GLchar *name) + inline void glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint* size, GLenum *type, GLchar *name) const { ::glGetActiveAttrib (program, index, bufSize, length, size, type, name); } - inline void glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint* size, GLenum *type, GLchar *name) + inline void glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint* size, GLenum *type, GLchar *name) const { ::glGetActiveUniform (program, index, bufSize, length, size, type, name); } - inline void glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders) + inline void glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders) const { ::glGetAttachedShaders (program, maxCount, count, shaders); } - inline GLint glGetAttribLocation (GLuint program, const GLchar *name) + inline GLint glGetAttribLocation (GLuint program, const GLchar *name) const { return ::glGetAttribLocation (program, name); } - inline void glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params) + inline void glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params) const { ::glGetFramebufferAttachmentParameteriv (target, attachment, pname, params); } - inline void glGetProgramiv (GLuint program, GLenum pname, GLint* params) + inline void glGetProgramiv (GLuint program, GLenum pname, GLint* params) const { ::glGetProgramiv (program, pname, params); } - inline void glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) + inline void glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) const { ::glGetProgramInfoLog (program, bufSize, length, infoLog); } - inline void glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params) + inline void glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params) const { ::glGetRenderbufferParameteriv (target, pname, params); } - inline void glGetShaderiv (GLuint shader, GLenum pname, GLint* params) + inline void glGetShaderiv (GLuint shader, GLenum pname, GLint* params) const { ::glGetShaderiv (shader, pname, params); } - inline void glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) + inline void glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) const { ::glGetShaderInfoLog (shader, bufSize, length, infoLog); } - inline void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) + inline void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) const { ::glGetShaderPrecisionFormat (shadertype, precisiontype, range, precision); } - inline void glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source) + inline void glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source) const { ::glGetShaderSource (shader, bufSize, length, source); } - inline void glGetUniformfv (GLuint program, GLint location, GLfloat* params) + inline void glGetUniformfv (GLuint program, GLint location, GLfloat* params) const { ::glGetUniformfv (program, location, params); } - inline void glGetUniformiv (GLuint program, GLint location, GLint* params) + inline void glGetUniformiv (GLuint program, GLint location, GLint* params) const { ::glGetUniformiv (program, location, params); } - GLint glGetUniformLocation (GLuint program, const GLchar *name) + GLint glGetUniformLocation (GLuint program, const GLchar *name) const { return ::glGetUniformLocation (program, name); } - inline void glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params) + inline void glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params) const { ::glGetVertexAttribfv (index, pname, params); } - inline void glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params) + inline void glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params) const { ::glGetVertexAttribiv (index, pname, params); } - inline void glGetVertexAttribPointerv (GLuint index, GLenum pname, void* *pointer) + inline void glGetVertexAttribPointerv (GLuint index, GLenum pname, void* *pointer) const { ::glGetVertexAttribPointerv (index, pname, pointer); } - inline GLboolean glIsFramebuffer (GLuint framebuffer) + inline GLboolean glIsFramebuffer (GLuint framebuffer) const { return ::glIsFramebuffer (framebuffer); } - inline GLboolean glIsProgram (GLuint program) + inline GLboolean glIsProgram (GLuint program) const { return ::glIsProgram (program); } - inline GLboolean glIsRenderbuffer (GLuint renderbuffer) + inline GLboolean glIsRenderbuffer (GLuint renderbuffer) const { return ::glIsRenderbuffer (renderbuffer); } - inline GLboolean glIsShader (GLuint shader) + inline GLboolean glIsShader (GLuint shader) const { return ::glIsShader (shader); } - inline void glLinkProgram (GLuint program) + inline void glLinkProgram (GLuint program) const { ::glLinkProgram (program); } - inline void glReleaseShaderCompiler() + inline void glReleaseShaderCompiler() const { ::glReleaseShaderCompiler(); } - inline void glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) + inline void glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) const { ::glRenderbufferStorage (target, internalformat, width, height); } - inline void glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void* binary, GLsizei length) + inline void glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void* binary, GLsizei length) const { ::glShaderBinary (count, shaders, binaryformat, binary, length); } - inline void glShaderSource (GLuint shader, GLsizei count, const GLchar** string, const GLint* length) + inline void glShaderSource (GLuint shader, GLsizei count, const GLchar** string, const GLint* length) const { ::glShaderSource (shader, count, string, length); } - inline void glUniform1f (GLint location, GLfloat v0) + inline void glUniform1f (GLint location, GLfloat v0) const { ::glUniform1f (location, v0); } - inline void glUniform1fv (GLint location, GLsizei count, const GLfloat* value) + inline void glUniform1fv (GLint location, GLsizei count, const GLfloat* value) const { ::glUniform1fv (location, count, value); } - inline void glUniform1i (GLint location, GLint v0) + inline void glUniform1i (GLint location, GLint v0) const { ::glUniform1i (location, v0); } - inline void glUniform1iv (GLint location, GLsizei count, const GLint* value) + inline void glUniform1iv (GLint location, GLsizei count, const GLint* value) const { ::glUniform1iv (location, count, value); } - inline void glUniform2f (GLint location, GLfloat v0, GLfloat v1) + inline void glUniform2f (GLint location, GLfloat v0, GLfloat v1) const { ::glUniform2f (location, v0, v1); } - inline void glUniform2fv (GLint location, GLsizei count, const GLfloat* value) + inline void glUniform2fv (GLint location, GLsizei count, const GLfloat* value) const { ::glUniform2fv (location, count, value); } - inline void glUniform2i (GLint location, GLint v0, GLint v1) + inline void glUniform2i (GLint location, GLint v0, GLint v1) const { ::glUniform2i (location, v0, v1); } - inline void glUniform2iv (GLint location, GLsizei count, const GLint* value) + inline void glUniform2iv (GLint location, GLsizei count, const GLint* value) const { ::glUniform2iv (location, count, value); } - inline void glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2) + inline void glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2) const { ::glUniform3f (location, v0, v1, v2); } - inline void glUniform3fv (GLint location, GLsizei count, const GLfloat* value) + inline void glUniform3fv (GLint location, GLsizei count, const GLfloat* value) const { ::glUniform3fv (location, count, value); } - inline void glUniform3i (GLint location, GLint v0, GLint v1, GLint v2) + inline void glUniform3i (GLint location, GLint v0, GLint v1, GLint v2) const { ::glUniform3i (location, v0, v1, v2); } - inline void glUniform3iv (GLint location, GLsizei count, const GLint* value) + inline void glUniform3iv (GLint location, GLsizei count, const GLint* value) const { ::glUniform3iv (location, count, value); } - inline void glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) + inline void glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) const { ::glUniform4f (location, v0, v1, v2, v3); } - inline void glUniform4fv (GLint location, GLsizei count, const GLfloat* value) + inline void glUniform4fv (GLint location, GLsizei count, const GLfloat* value) const { ::glUniform4fv (location, count, value); } - inline void glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3) + inline void glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3) const { ::glUniform4i (location, v0, v1, v2, v3); } - inline void glUniform4iv (GLint location, GLsizei count, const GLint* value) + inline void glUniform4iv (GLint location, GLsizei count, const GLint* value) const { ::glUniform4iv (location, count, value); } - inline void glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) + inline void glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) const { ::glUniformMatrix2fv (location, count, transpose, value); } - inline void glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) + inline void glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) const { ::glUniformMatrix3fv (location, count, transpose, value); } - inline void glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) + inline void glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) const { ::glUniformMatrix4fv (location, count, transpose, value); } - inline void glUseProgram (GLuint program) + inline void glUseProgram (GLuint program) const { ::glUseProgram (program); } - inline void glValidateProgram (GLuint program) + inline void glValidateProgram (GLuint program) const { ::glValidateProgram (program); } - inline void glVertexAttrib1f (GLuint index, GLfloat x) + inline void glVertexAttrib1f (GLuint index, GLfloat x) const { ::glVertexAttrib1f (index, x); } - inline void glVertexAttrib1fv (GLuint index, const GLfloat* v) + inline void glVertexAttrib1fv (GLuint index, const GLfloat* v) const { ::glVertexAttrib1fv (index, v); } - inline void glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y) + inline void glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y) const { ::glVertexAttrib2f (index, x, y); } - inline void glVertexAttrib2fv (GLuint index, const GLfloat* v) + inline void glVertexAttrib2fv (GLuint index, const GLfloat* v) const { ::glVertexAttrib2fv (index, v); } - inline void glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z) + inline void glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z) const { ::glVertexAttrib3f (index, x, y, z); } - inline void glVertexAttrib3fv (GLuint index, const GLfloat* v) + inline void glVertexAttrib3fv (GLuint index, const GLfloat* v) const { ::glVertexAttrib3fv (index, v); } - inline void glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) + inline void glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) const { ::glVertexAttrib4f (index, x, y, z, w); } - inline void glVertexAttrib4fv (GLuint index, const GLfloat* v) + inline void glVertexAttrib4fv (GLuint index, const GLfloat* v) const { ::glVertexAttrib4fv (index, v); } - inline void glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer) + inline void glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer) const { ::glVertexAttribPointer (index, size, type, normalized, stride, pointer); } public: //! @name OpenGL ES 3.0 - typedef void (APIENTRY *glBlitFramebuffer_t)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); - glBlitFramebuffer_t glBlitFramebuffer; - - typedef void (APIENTRY *glTexImage3D_t)(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* data); - glTexImage3D_t glTexImage3D; - - typedef void (APIENTRY *glDrawBuffers_t)(GLsizei n, const GLenum* bufs); - glDrawBuffers_t glDrawBuffers; - - typedef void (APIENTRY *glGenSamplers_t)(GLsizei count, GLuint* samplers); - glGenSamplers_t glGenSamplers; - - typedef void (APIENTRY *glDeleteSamplers_t)(GLsizei count, const GLuint* samplers); - glDeleteSamplers_t glDeleteSamplers; - - typedef GLboolean (APIENTRY *glIsSampler_t)(GLuint sampler); - glIsSampler_t glIsSampler; - - typedef void (APIENTRY *glBindSampler_t)(GLuint unit, GLuint sampler); - glBindSampler_t glBindSampler; - - typedef void (APIENTRY *glSamplerParameteri_t)(GLuint sampler, GLenum pname, GLint param); - glSamplerParameteri_t glSamplerParameteri; - - typedef void (APIENTRY *glSamplerParameteriv_t)(GLuint sampler, GLenum pname, const GLint* param); - glSamplerParameteriv_t glSamplerParameteriv; - - typedef void (APIENTRY *glSamplerParameterf_t)(GLuint sampler, GLenum pname, GLfloat param); - glSamplerParameterf_t glSamplerParameterf; - - typedef void (APIENTRY *glSamplerParameterfv_t)(GLuint sampler, GLenum pname, const GLfloat* param); - glSamplerParameterfv_t glSamplerParameterfv; - - typedef void (APIENTRY *glGetSamplerParameteriv_t)(GLuint sampler, GLenum pname, GLint* params); - glGetSamplerParameteriv_t glGetSamplerParameteriv; - - typedef void (APIENTRY *glGetSamplerParameterfv_t)(GLuint sampler, GLenum pname, GLfloat* params); - glGetSamplerParameterfv_t glGetSamplerParameterfv; + opencascade::PFNGLREADBUFFERPROC glReadBuffer; + opencascade::PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements; + opencascade::PFNGLTEXIMAGE3DPROC glTexImage3D; + opencascade::PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D; + opencascade::PFNGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D; + opencascade::PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D; + opencascade::PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D; + opencascade::PFNGLGENQUERIESPROC glGenQueries; + opencascade::PFNGLDELETEQUERIESPROC glDeleteQueries; + opencascade::PFNGLISQUERYPROC glIsQuery; + opencascade::PFNGLBEGINQUERYPROC glBeginQuery; + opencascade::PFNGLENDQUERYPROC glEndQuery; + opencascade::PFNGLGETQUERYIVPROC glGetQueryiv; + opencascade::PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv; + opencascade::PFNGLUNMAPBUFFERPROC glUnmapBuffer; + opencascade::PFNGLGETBUFFERPOINTERVPROC glGetBufferPointerv; + opencascade::PFNGLDRAWBUFFERSPROC glDrawBuffers; + opencascade::PFNGLUNIFORMMATRIX2X3FVPROC glUniformMatrix2x3fv; + opencascade::PFNGLUNIFORMMATRIX3X2FVPROC glUniformMatrix3x2fv; + opencascade::PFNGLUNIFORMMATRIX2X4FVPROC glUniformMatrix2x4fv; + opencascade::PFNGLUNIFORMMATRIX4X2FVPROC glUniformMatrix4x2fv; + opencascade::PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv; + opencascade::PFNGLUNIFORMMATRIX4X3FVPROC glUniformMatrix4x3fv; + opencascade::PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; + opencascade::PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; + opencascade::PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; + opencascade::PFNGLMAPBUFFERRANGEPROC glMapBufferRange; + opencascade::PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange; + opencascade::PFNGLBINDVERTEXARRAYPROC glBindVertexArray; + opencascade::PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; + opencascade::PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; + opencascade::PFNGLISVERTEXARRAYPROC glIsVertexArray; + opencascade::PFNGLGETINTEGERI_VPROC glGetIntegeri_v; + opencascade::PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback; + opencascade::PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback; + opencascade::PFNGLBINDBUFFERRANGEPROC glBindBufferRange; + opencascade::PFNGLBINDBUFFERBASEPROC glBindBufferBase; + opencascade::PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings; + opencascade::PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glGetTransformFeedbackVarying; + opencascade::PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer; + opencascade::PFNGLGETVERTEXATTRIBIIVPROC glGetVertexAttribIiv; + opencascade::PFNGLGETVERTEXATTRIBIUIVPROC glGetVertexAttribIuiv; + opencascade::PFNGLVERTEXATTRIBI4IPROC glVertexAttribI4i; + opencascade::PFNGLVERTEXATTRIBI4UIPROC glVertexAttribI4ui; + opencascade::PFNGLVERTEXATTRIBI4IVPROC glVertexAttribI4iv; + opencascade::PFNGLVERTEXATTRIBI4UIVPROC glVertexAttribI4uiv; + opencascade::PFNGLGETUNIFORMUIVPROC glGetUniformuiv; + opencascade::PFNGLGETFRAGDATALOCATIONPROC glGetFragDataLocation; + opencascade::PFNGLUNIFORM1UIPROC glUniform1ui; + opencascade::PFNGLUNIFORM2UIPROC glUniform2ui; + opencascade::PFNGLUNIFORM3UIPROC glUniform3ui; + opencascade::PFNGLUNIFORM4UIPROC glUniform4ui; + opencascade::PFNGLUNIFORM1UIVPROC glUniform1uiv; + opencascade::PFNGLUNIFORM2UIVPROC glUniform2uiv; + opencascade::PFNGLUNIFORM3UIVPROC glUniform3uiv; + opencascade::PFNGLUNIFORM4UIVPROC glUniform4uiv; + opencascade::PFNGLCLEARBUFFERIVPROC glClearBufferiv; + opencascade::PFNGLCLEARBUFFERUIVPROC glClearBufferuiv; + opencascade::PFNGLCLEARBUFFERFVPROC glClearBufferfv; + opencascade::PFNGLCLEARBUFFERFIPROC glClearBufferfi; + opencascade::PFNGLGETSTRINGIPROC glGetStringi; + opencascade::PFNGLCOPYBUFFERSUBDATAPROC glCopyBufferSubData; + opencascade::PFNGLGETUNIFORMINDICESPROC glGetUniformIndices; + opencascade::PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv; + opencascade::PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; + opencascade::PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv; + opencascade::PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockName; + opencascade::PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; + opencascade::PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced; + opencascade::PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced; + opencascade::PFNGLFENCESYNCPROC glFenceSync; + opencascade::PFNGLISSYNCPROC glIsSync; + opencascade::PFNGLDELETESYNCPROC glDeleteSync; + opencascade::PFNGLCLIENTWAITSYNCPROC glClientWaitSync; + opencascade::PFNGLWAITSYNCPROC glWaitSync; + opencascade::PFNGLGETINTEGER64VPROC glGetInteger64v; + opencascade::PFNGLGETSYNCIVPROC glGetSynciv; + opencascade::PFNGLGETINTEGER64I_VPROC glGetInteger64i_v; + opencascade::PFNGLGETBUFFERPARAMETERI64VPROC glGetBufferParameteri64v; + opencascade::PFNGLGENSAMPLERSPROC glGenSamplers; + opencascade::PFNGLDELETESAMPLERSPROC glDeleteSamplers; + opencascade::PFNGLISSAMPLERPROC glIsSampler; + opencascade::PFNGLBINDSAMPLERPROC glBindSampler; + opencascade::PFNGLSAMPLERPARAMETERIPROC glSamplerParameteri; + opencascade::PFNGLSAMPLERPARAMETERIVPROC glSamplerParameteriv; + opencascade::PFNGLSAMPLERPARAMETERFPROC glSamplerParameterf; + opencascade::PFNGLSAMPLERPARAMETERFVPROC glSamplerParameterfv; + opencascade::PFNGLGETSAMPLERPARAMETERIVPROC glGetSamplerParameteriv; + opencascade::PFNGLGETSAMPLERPARAMETERFVPROC glGetSamplerParameterfv; + opencascade::PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor; + opencascade::PFNGLBINDTRANSFORMFEEDBACKPROC glBindTransformFeedback; + opencascade::PFNGLDELETETRANSFORMFEEDBACKSPROC glDeleteTransformFeedbacks; + opencascade::PFNGLGENTRANSFORMFEEDBACKSPROC glGenTransformFeedbacks; + opencascade::PFNGLISTRANSFORMFEEDBACKPROC glIsTransformFeedback; + opencascade::PFNGLPAUSETRANSFORMFEEDBACKPROC glPauseTransformFeedback; + opencascade::PFNGLRESUMETRANSFORMFEEDBACKPROC glResumeTransformFeedback; + opencascade::PFNGLGETPROGRAMBINARYPROC glGetProgramBinary; + opencascade::PFNGLPROGRAMBINARYPROC glProgramBinary; + opencascade::PFNGLPROGRAMPARAMETERIPROC glProgramParameteri; + opencascade::PFNGLINVALIDATEFRAMEBUFFERPROC glInvalidateFramebuffer; + opencascade::PFNGLINVALIDATESUBFRAMEBUFFERPROC glInvalidateSubFramebuffer; + opencascade::PFNGLTEXSTORAGE2DPROC glTexStorage2D; + opencascade::PFNGLTEXSTORAGE3DPROC glTexStorage3D; + opencascade::PFNGLGETINTERNALFORMATIVPROC glGetInternalformativ; public: //! @name OpenGL ES 3.1 - typedef void (APIENTRY *glTexStorage2DMultisample_t)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); - glTexStorage2DMultisample_t glTexStorage2DMultisample; + opencascade::PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; + opencascade::PFNGLDISPATCHCOMPUTEINDIRECTPROC glDispatchComputeIndirect; + opencascade::PFNGLDRAWARRAYSINDIRECTPROC glDrawArraysIndirect; + opencascade::PFNGLDRAWELEMENTSINDIRECTPROC glDrawElementsIndirect; + opencascade::PFNGLFRAMEBUFFERPARAMETERIPROC glFramebufferParameteri; + opencascade::PFNGLGETFRAMEBUFFERPARAMETERIVPROC glGetFramebufferParameteriv; + opencascade::PFNGLGETPROGRAMINTERFACEIVPROC glGetProgramInterfaceiv; + opencascade::PFNGLGETPROGRAMRESOURCEINDEXPROC glGetProgramResourceIndex; + opencascade::PFNGLGETPROGRAMRESOURCENAMEPROC glGetProgramResourceName; + opencascade::PFNGLGETPROGRAMRESOURCEIVPROC glGetProgramResourceiv; + opencascade::PFNGLGETPROGRAMRESOURCELOCATIONPROC glGetProgramResourceLocation; + opencascade::PFNGLUSEPROGRAMSTAGESPROC glUseProgramStages; + opencascade::PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram; + opencascade::PFNGLCREATESHADERPROGRAMVPROC glCreateShaderProgramv; + opencascade::PFNGLBINDPROGRAMPIPELINEPROC glBindProgramPipeline; + opencascade::PFNGLDELETEPROGRAMPIPELINESPROC glDeleteProgramPipelines; + opencascade::PFNGLGENPROGRAMPIPELINESPROC glGenProgramPipelines; + opencascade::PFNGLISPROGRAMPIPELINEPROC glIsProgramPipeline; + opencascade::PFNGLGETPROGRAMPIPELINEIVPROC glGetProgramPipelineiv; + opencascade::PFNGLPROGRAMUNIFORM1IPROC glProgramUniform1i; + opencascade::PFNGLPROGRAMUNIFORM2IPROC glProgramUniform2i; + opencascade::PFNGLPROGRAMUNIFORM3IPROC glProgramUniform3i; + opencascade::PFNGLPROGRAMUNIFORM4IPROC glProgramUniform4i; + opencascade::PFNGLPROGRAMUNIFORM1UIPROC glProgramUniform1ui; + opencascade::PFNGLPROGRAMUNIFORM2UIPROC glProgramUniform2ui; + opencascade::PFNGLPROGRAMUNIFORM3UIPROC glProgramUniform3ui; + opencascade::PFNGLPROGRAMUNIFORM4UIPROC glProgramUniform4ui; + opencascade::PFNGLPROGRAMUNIFORM1FPROC glProgramUniform1f; + opencascade::PFNGLPROGRAMUNIFORM2FPROC glProgramUniform2f; + opencascade::PFNGLPROGRAMUNIFORM3FPROC glProgramUniform3f; + opencascade::PFNGLPROGRAMUNIFORM4FPROC glProgramUniform4f; + opencascade::PFNGLPROGRAMUNIFORM1IVPROC glProgramUniform1iv; + opencascade::PFNGLPROGRAMUNIFORM2IVPROC glProgramUniform2iv; + opencascade::PFNGLPROGRAMUNIFORM3IVPROC glProgramUniform3iv; + opencascade::PFNGLPROGRAMUNIFORM4IVPROC glProgramUniform4iv; + opencascade::PFNGLPROGRAMUNIFORM1UIVPROC glProgramUniform1uiv; + opencascade::PFNGLPROGRAMUNIFORM2UIVPROC glProgramUniform2uiv; + opencascade::PFNGLPROGRAMUNIFORM3UIVPROC glProgramUniform3uiv; + opencascade::PFNGLPROGRAMUNIFORM4UIVPROC glProgramUniform4uiv; + opencascade::PFNGLPROGRAMUNIFORM1FVPROC glProgramUniform1fv; + opencascade::PFNGLPROGRAMUNIFORM2FVPROC glProgramUniform2fv; + opencascade::PFNGLPROGRAMUNIFORM3FVPROC glProgramUniform3fv; + opencascade::PFNGLPROGRAMUNIFORM4FVPROC glProgramUniform4fv; + opencascade::PFNGLPROGRAMUNIFORMMATRIX2FVPROC glProgramUniformMatrix2fv; + opencascade::PFNGLPROGRAMUNIFORMMATRIX3FVPROC glProgramUniformMatrix3fv; + opencascade::PFNGLPROGRAMUNIFORMMATRIX4FVPROC glProgramUniformMatrix4fv; + opencascade::PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glProgramUniformMatrix2x3fv; + opencascade::PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glProgramUniformMatrix3x2fv; + opencascade::PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glProgramUniformMatrix2x4fv; + opencascade::PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glProgramUniformMatrix4x2fv; + opencascade::PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glProgramUniformMatrix3x4fv; + opencascade::PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glProgramUniformMatrix4x3fv; + opencascade::PFNGLVALIDATEPROGRAMPIPELINEPROC glValidateProgramPipeline; + opencascade::PFNGLGETPROGRAMPIPELINEINFOLOGPROC glGetProgramPipelineInfoLog; + opencascade::PFNGLBINDIMAGETEXTUREPROC glBindImageTexture; + opencascade::PFNGLGETBOOLEANI_VPROC glGetBooleani_v; + opencascade::PFNGLMEMORYBARRIERPROC glMemoryBarrier; + opencascade::PFNGLMEMORYBARRIERBYREGIONPROC glMemoryBarrierByRegion; + opencascade::PFNGLTEXSTORAGE2DMULTISAMPLEPROC glTexStorage2DMultisample; + opencascade::PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv; + opencascade::PFNGLSAMPLEMASKIPROC glSampleMaski; + opencascade::PFNGLGETTEXLEVELPARAMETERIVPROC glGetTexLevelParameteriv; + opencascade::PFNGLGETTEXLEVELPARAMETERFVPROC glGetTexLevelParameterfv; + opencascade::PFNGLBINDVERTEXBUFFERPROC glBindVertexBuffer; + opencascade::PFNGLVERTEXATTRIBFORMATPROC glVertexAttribFormat; + opencascade::PFNGLVERTEXATTRIBIFORMATPROC glVertexAttribIFormat; + opencascade::PFNGLVERTEXATTRIBBINDINGPROC glVertexAttribBinding; + opencascade::PFNGLVERTEXBINDINGDIVISORPROC glVertexBindingDivisor; public: //! @name OpenGL ES 3.2 - typedef void (APIENTRY *glTexBuffer_t)(GLenum target, GLenum internalFormat, GLuint buffer); - glTexBuffer_t glTexBuffer; - -public: //! @name GL_KHR_debug (optional) - - typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); - - typedef void (APIENTRYP glDebugMessageControl_t ) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); - typedef void (APIENTRYP glDebugMessageInsert_t ) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); - typedef void (APIENTRYP glDebugMessageCallback_t) (GLDEBUGPROCARB callback, const void* userParam); - typedef GLuint (APIENTRYP glGetDebugMessageLog_t ) (GLuint count, - GLsizei bufSize, - GLenum* sources, - GLenum* types, - GLuint* ids, - GLenum* severities, - GLsizei* lengths, - GLchar* messageLog); - - glDebugMessageControl_t glDebugMessageControl; - glDebugMessageInsert_t glDebugMessageInsert; - glDebugMessageCallback_t glDebugMessageCallback; - glGetDebugMessageLog_t glGetDebugMessageLog; + opencascade::PFNGLBLENDBARRIERPROC glBlendBarrier; + opencascade::PFNGLCOPYIMAGESUBDATAPROC glCopyImageSubData; + opencascade::PFNGLPUSHDEBUGGROUPPROC glPushDebugGroup; + opencascade::PFNGLPOPDEBUGGROUPPROC glPopDebugGroup; + opencascade::PFNGLOBJECTLABELPROC glObjectLabel; + opencascade::PFNGLGETOBJECTLABELPROC glGetObjectLabel; + opencascade::PFNGLOBJECTPTRLABELPROC glObjectPtrLabel; + opencascade::PFNGLGETOBJECTPTRLABELPROC glGetObjectPtrLabel; + opencascade::PFNGLGETPOINTERVPROC glGetPointerv; + opencascade::PFNGLENABLEIPROC glEnablei; + opencascade::PFNGLDISABLEIPROC glDisablei; + opencascade::PFNGLBLENDEQUATIONIPROC glBlendEquationi; + opencascade::PFNGLBLENDEQUATIONSEPARATEIPROC glBlendEquationSeparatei; + opencascade::PFNGLBLENDFUNCIPROC glBlendFunci; + opencascade::PFNGLBLENDFUNCSEPARATEIPROC glBlendFuncSeparatei; + opencascade::PFNGLCOLORMASKIPROC glColorMaski; + opencascade::PFNGLISENABLEDIPROC glIsEnabledi; + opencascade::PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex; + opencascade::PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glDrawRangeElementsBaseVertex; + opencascade::PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glDrawElementsInstancedBaseVertex; + opencascade::PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture; + opencascade::PFNGLPRIMITIVEBOUNDINGBOXPROC glPrimitiveBoundingBox; + opencascade::PFNGLGETGRAPHICSRESETSTATUSPROC glGetGraphicsResetStatus; + opencascade::PFNGLREADNPIXELSPROC glReadnPixels; + opencascade::PFNGLGETNUNIFORMFVPROC glGetnUniformfv; + opencascade::PFNGLGETNUNIFORMIVPROC glGetnUniformiv; + opencascade::PFNGLGETNUNIFORMUIVPROC glGetnUniformuiv; + opencascade::PFNGLMINSAMPLESHADINGPROC glMinSampleShading; + opencascade::PFNGLPATCHPARAMETERIPROC glPatchParameteri; + opencascade::PFNGLTEXPARAMETERIIVPROC glTexParameterIiv; + opencascade::PFNGLTEXPARAMETERIUIVPROC glTexParameterIuiv; + opencascade::PFNGLGETTEXPARAMETERIIVPROC glGetTexParameterIiv; + opencascade::PFNGLGETTEXPARAMETERIUIVPROC glGetTexParameterIuiv; + opencascade::PFNGLSAMPLERPARAMETERIIVPROC glSamplerParameterIiv; + opencascade::PFNGLSAMPLERPARAMETERIUIVPROC glSamplerParameterIuiv; + opencascade::PFNGLGETSAMPLERPARAMETERIIVPROC glGetSamplerParameterIiv; + opencascade::PFNGLGETSAMPLERPARAMETERIUIVPROC glGetSamplerParameterIuiv; + opencascade::PFNGLTEXBUFFERPROC glTexBuffer; + opencascade::PFNGLTEXBUFFERRANGEPROC glTexBufferRange; + opencascade::PFNGLTEXSTORAGE3DMULTISAMPLEPROC glTexStorage3DMultisample; + +public: //! @name GL_KHR_debug (optional) or OpenGL ES 3.2+ + + opencascade::PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl; + opencascade::PFNGLDEBUGMESSAGEINSERTPROC glDebugMessageInsert; + opencascade::PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback; + opencascade::PFNGLGETDEBUGMESSAGELOGPROC glGetDebugMessageLog; #else // OpenGL ES vs. desktop diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GraduatedTrihedron.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GraduatedTrihedron.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GraduatedTrihedron.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GraduatedTrihedron.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -422,7 +422,7 @@ const Standard_Integer aHeight = theWorkspace->Height(); // Take into account Transform Persistence - aContext->ModelWorldState.SetCurrent (aTransMode.Compute (theWorkspace->View()->Camera(), aProjection, aWorldView, aWidth, aHeight)); + aContext->ModelWorldState.SetCurrent (aTransMode.Compute (aContext->Camera(), aProjection, aWorldView, aWidth, aHeight)); aContext->ApplyModelViewMatrix(); anAxis.Arrow.Render (theWorkspace); @@ -838,3 +838,14 @@ Line .Release (theCtx); Arrow .Release (theCtx); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_GraduatedTrihedron::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_GraduatedTrihedron) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, OpenGl_Element) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GraduatedTrihedron.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GraduatedTrihedron.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GraduatedTrihedron.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GraduatedTrihedron.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,25 +41,28 @@ public: //! Default constructor. - OpenGl_GraduatedTrihedron(); + Standard_EXPORT OpenGl_GraduatedTrihedron(); //! Destructor. - virtual ~OpenGl_GraduatedTrihedron(); + Standard_EXPORT virtual ~OpenGl_GraduatedTrihedron(); //! Draw the element. - virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; + Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE; //! Release OpenGL resources. - virtual void Release (OpenGl_Context* theCtx); + Standard_EXPORT virtual void Release (OpenGl_Context* theCtx) Standard_OVERRIDE; //! Setup configuration. - void SetValues (const Graphic3d_GraduatedTrihedron& theData); + Standard_EXPORT void SetValues (const Graphic3d_GraduatedTrihedron& theData); //! Sets up-to-date values of scene bounding box. //! Can be used in callback mechanism to get up-to-date values. //! @sa Graphic3d_GraduatedTrihedron::CubicAxesCallback - void SetMinMax (const OpenGl_Vec3& theMin, - const OpenGl_Vec3& theMax); + Standard_EXPORT void SetMinMax (const OpenGl_Vec3& theMin, + const OpenGl_Vec3& theMax); + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; private: diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GraphicDriver.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GraphicDriver.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GraphicDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GraphicDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,11 +44,11 @@ #include #endif -#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(__QNX__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) +#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) #include // XOpenDisplay() #endif -#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) +#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) #include #ifndef EGL_OPENGL_ES3_BIT #define EGL_OPENGL_ES3_BIT 0x00000040 @@ -59,7 +59,7 @@ { static const Handle(OpenGl_Context) TheNullGlCtx; -#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) +#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) //! Wrapper over eglChooseConfig() called with preferred defaults. static EGLConfig chooseEglSurfConfig (EGLDisplay theDisplay) { @@ -120,7 +120,7 @@ const Standard_Boolean theToInitialize) : Graphic3d_GraphicDriver (theDisp), myIsOwnContext (Standard_False), -#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) +#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) myEglDisplay ((Aspect_Display )EGL_NO_DISPLAY), myEglContext ((Aspect_RenderingContext )EGL_NO_CONTEXT), myEglConfig (NULL), @@ -129,7 +129,7 @@ myMapOfView (1, NCollection_BaseAllocator::CommonBaseAllocator()), myMapOfStructure (1, NCollection_BaseAllocator::CommonBaseAllocator()) { -#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(__QNX__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) +#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) if (myDisplayConnection.IsNull()) { //throw Aspect_GraphicDeviceDefinitionError("OpenGl_GraphicDriver: cannot connect to X server!"); @@ -146,7 +146,7 @@ int aDummy; if (!XQueryExtension (aDisplay, "GLX", &aDummy, &aDummy, &aDummy)) { - ::Message::DefaultMessenger()->Send ("OpenGl_GraphicDriver, this system doesn't appear to support OpenGL!", Message_Warning); + ::Message::SendWarning ("OpenGl_GraphicDriver, this system doesn't appear to support OpenGL"); } #endif #endif @@ -228,14 +228,14 @@ aWindow->GetGlContext()->forcedRelease(); } -#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) +#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) if (myIsOwnContext) { if (myEglContext != (Aspect_RenderingContext )EGL_NO_CONTEXT) { if (eglMakeCurrent ((EGLDisplay )myEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT) != EGL_TRUE) { - ::Message::DefaultMessenger()->Send ("OpenGl_GraphicDriver, FAILED to release OpenGL context!", Message_Warning); + ::Message::SendWarning ("OpenGl_GraphicDriver, FAILED to release OpenGL context"); } eglDestroyContext ((EGLDisplay )myEglDisplay, (EGLContext )myEglContext); } @@ -244,7 +244,7 @@ { if (eglTerminate ((EGLDisplay )myEglDisplay) != EGL_TRUE) { - ::Message::DefaultMessenger()->Send ("OpenGl_GraphicDriver, EGL, eglTerminate FAILED!", Message_Warning); + ::Message::SendWarning ("OpenGl_GraphicDriver, EGL, eglTerminate FAILED"); } } } @@ -263,9 +263,9 @@ Standard_Boolean OpenGl_GraphicDriver::InitContext() { ReleaseContext(); -#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) +#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) -#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(__QNX__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) +#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) if (myDisplayConnection.IsNull()) { return Standard_False; @@ -277,21 +277,21 @@ #endif if ((EGLDisplay )myEglDisplay == EGL_NO_DISPLAY) { - ::Message::DefaultMessenger()->Send ("Error: no EGL display!", Message_Fail); + ::Message::SendFail ("Error: no EGL display"); return Standard_False; } EGLint aVerMajor = 0; EGLint aVerMinor = 0; if (eglInitialize ((EGLDisplay )myEglDisplay, &aVerMajor, &aVerMinor) != EGL_TRUE) { - ::Message::DefaultMessenger()->Send ("Error: EGL display is unavailable!", Message_Fail); + ::Message::SendFail ("Error: EGL display is unavailable"); return Standard_False; } myEglConfig = chooseEglSurfConfig ((EGLDisplay )myEglDisplay); if (myEglConfig == NULL) { - ::Message::DefaultMessenger()->Send ("Error: EGL does not provide compatible configurations!", Message_Fail); + ::Message::SendFail ("Error: EGL does not provide compatible configurations"); return Standard_False; } @@ -300,7 +300,7 @@ EGLint anEglCtxAttribs2[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE }; if (eglBindAPI (EGL_OPENGL_ES_API) != EGL_TRUE) { - ::Message::DefaultMessenger()->Send ("Error: EGL does not provide OpenGL ES client!", Message_Fail); + ::Message::SendFail ("Error: EGL does not provide OpenGL ES client"); return Standard_False; } if (myCaps->contextMajorVersionUpper != 2) @@ -315,7 +315,7 @@ EGLint* anEglCtxAttribs = NULL; if (eglBindAPI (EGL_OPENGL_API) != EGL_TRUE) { - ::Message::DefaultMessenger()->Send ("Error: EGL does not provide OpenGL client!", Message_Fail); + ::Message::SendFail ("Error: EGL does not provide OpenGL client"); return Standard_False; } myEglContext = (Aspect_RenderingContext )eglCreateContext ((EGLDisplay )myEglDisplay, myEglConfig, EGL_NO_CONTEXT, anEglCtxAttribs); @@ -323,13 +323,13 @@ if ((EGLContext )myEglContext == EGL_NO_CONTEXT) { - ::Message::DefaultMessenger()->Send ("Error: EGL is unable to create OpenGL context!", Message_Fail); + ::Message::SendFail ("Error: EGL is unable to create OpenGL context"); return Standard_False; } // eglMakeCurrent() fails or even crash with EGL_NO_SURFACE on some implementations //if (eglMakeCurrent ((EGLDisplay )myEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, (EGLContext )myEglContext) != EGL_TRUE) //{ - // ::Message::DefaultMessenger()->Send ("Error: EGL is unable bind OpenGL context!", Message_Fail); + // ::Message::SendFail ("Error: EGL is unable bind OpenGL context"); // return Standard_False; //} #endif @@ -337,7 +337,7 @@ return Standard_True; } -#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) +#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) // ======================================================================= // function : InitEglContext // purpose : @@ -347,7 +347,7 @@ void* theEglConfig) { ReleaseContext(); -#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(__QNX__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) +#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) if (myDisplayConnection.IsNull()) { return Standard_False; @@ -367,7 +367,7 @@ myEglConfig = chooseEglSurfConfig ((EGLDisplay )myEglDisplay); if (myEglConfig == NULL) { - ::Message::DefaultMessenger()->Send ("Error: EGL does not provide compatible configurations!", Message_Fail); + ::Message::SendFail ("Error: EGL does not provide compatible configurations"); return Standard_False; } } @@ -400,6 +400,8 @@ return !aCtx.IsNull() ? aCtx->MaxDumpSizeX() : 1024; case Graphic3d_TypeOfLimit_MaxViewDumpSizeY: return !aCtx.IsNull() ? aCtx->MaxDumpSizeY() : 1024; + case Graphic3d_TypeOfLimit_HasPBR: + return (!aCtx.IsNull() && aCtx->HasPBR()) ? 1 : 0; case Graphic3d_TypeOfLimit_HasRayTracing: return (!aCtx.IsNull() && aCtx->HasRayTracing()) ? 1 : 0; case Graphic3d_TypeOfLimit_HasRayTracingTextures: @@ -408,6 +410,8 @@ return (!aCtx.IsNull() && aCtx->HasRayTracingAdaptiveSampling()) ? 1 : 0; case Graphic3d_TypeOfLimit_HasRayTracingAdaptiveSamplingAtomic: return (!aCtx.IsNull() && aCtx->HasRayTracingAdaptiveSamplingAtomic()) ? 1 : 0; + case Graphic3d_TypeOfLimit_HasSRGB: + return (!aCtx.IsNull() && aCtx->HasSRGB()) ? 1 : 0; case Graphic3d_TypeOfLimit_HasBlendedOit: return (!aCtx.IsNull() && aCtx->hasDrawBuffers != OpenGl_FeatureNotAvailable @@ -731,7 +735,7 @@ #else NSView* TheSpecifiedWindowId = THEWindow->HView(); #endif -#elif defined(__ANDROID__) || defined(__QNX__) || defined(OCCT_UWP) +#elif defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(OCCT_UWP) (void )AWindow; int TheSpecifiedWindowId = -1; #else @@ -757,7 +761,7 @@ #else NSView* TheWindowIdOfView = theWindow->HView(); #endif -#elif defined(__ANDROID__) || defined(__QNX__) || defined(OCCT_UWP) +#elif defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(OCCT_UWP) int TheWindowIdOfView = 0; #else const Handle(Xw_Window) theWindow = Handle(Xw_Window)::DownCast (AspectWindow); diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GraphicDriver.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GraphicDriver.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_GraphicDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_GraphicDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -68,7 +68,7 @@ //! Perform initialization of default OpenGL context. Standard_EXPORT Standard_Boolean InitContext(); -#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) +#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) //! Initialize default OpenGL context using existing one. //! @param theEglDisplay EGL connection to the Display //! @param theEglContext EGL rendering context @@ -168,7 +168,7 @@ //! any context will be returned otherwise Standard_EXPORT const Handle(OpenGl_Context)& GetSharedContext (bool theBound = false) const; -#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) +#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) Aspect_Display getRawGlDisplay() const { return myEglDisplay; } Aspect_RenderingContext getRawGlContext() const { return myEglContext; } void* getRawGlConfig() const { return myEglConfig; } @@ -188,7 +188,7 @@ protected: Standard_Boolean myIsOwnContext; //!< indicates that shared context has been created within OpenGl_GraphicDriver -#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) +#if defined(HAVE_EGL) || defined(HAVE_GLES2) || defined(OCCT_UWP) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) Aspect_Display myEglDisplay; //!< EGL connection to the Display : EGLDisplay Aspect_RenderingContext myEglContext; //!< EGL rendering context : EGLContext void* myEglConfig; //!< EGL configuration : EGLConfig diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Group.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Group.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Group.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Group.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -343,11 +343,17 @@ // function : DumpJson // purpose : // ======================================================================= -void OpenGl_Group::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void OpenGl_Group::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_Group); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Graphic3d_Group); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspects); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsRaytracable); + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Graphic3d_Group) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspects) + for (OpenGl_ElementNode* aNode = myFirst; aNode != NULL; aNode = aNode->next) + { + OpenGl_Element* anElement = aNode->elem; + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, anElement) + } + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsRaytracable) } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Group.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Group.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Group.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Group.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -100,7 +100,7 @@ Standard_Boolean IsRaytracable() const { return myIsRaytracable; } //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_HaltonSampler.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_HaltonSampler.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_HaltonSampler.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_HaltonSampler.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,7 +24,7 @@ #include #include -//! Compute points of the Halton sequence with with digit-permutations for different bases. +//! Compute points of the Halton sequence with digit-permutations for different bases. class OpenGl_HaltonSampler { public: @@ -35,19 +35,13 @@ public: //! Init the permutation arrays using Faure-permutations. - //! Alternatively, initRandom() can be called before the sampling functionality can be used. - void initFaure(); - - //! Init the permutation arrays using randomized permutations. - //! Alternatively, initFaure() can be called before the sampling functionality can be used. - //! The client needs to specify a random number generator function object that can be used to generate a random sequence of integers. - //! That is: if f is a random number generator and N is a positive integer, - //! then f(N) will return an integer less than N and greater than or equal to 0. - template - void initRandom (Random_number_generator& theRand); + OpenGl_HaltonSampler() + { + initFaure(); + } //! Return the Halton sample for the given dimension (component) and index. - //! The client must have called initRandom or initFaure() at least once before. + //! The client must have called initFaure() at least once before. //! dimension must be smaller than the value returned by get_num_dimensions(). float sample (unsigned theDimension, unsigned theIndex) const { @@ -62,6 +56,9 @@ private: + //! Init the permutation arrays using Faure-permutations. + void initFaure(); + static unsigned short invert (unsigned short theBase, unsigned short theDigits, unsigned short theIndex, const std::vector& thePerm) { @@ -104,7 +101,7 @@ return (myPerm3[theIndex % 243u] * 14348907u + myPerm3[(theIndex / 243u) % 243u] * 59049u + myPerm3[(theIndex / 59049u) % 243u] * 243u - + myPerm3[(theIndex / 14348907u) % 243u]) * float(0.999999999999999f / 3486784401u); // Results in [0,1). + + myPerm3[(theIndex / 14348907u) % 243u]) * float(0.999999999999999 / 3486784401u); // Results in [0,1). } float halton5 (unsigned theIndex) const @@ -112,7 +109,7 @@ return (myPerm5[theIndex % 125u] * 1953125u + myPerm5[(theIndex / 125u) % 125u] * 15625u + myPerm5[(theIndex / 15625u) % 125u] * 125u - + myPerm5[(theIndex / 1953125u) % 125u]) * float(0.999999999999999f / 244140625u); // Results in [0,1). + + myPerm5[(theIndex / 1953125u) % 125u]) * float(0.999999999999999 / 244140625u); // Results in [0,1). } private: @@ -158,31 +155,5 @@ } initTables (aPerms); } - -template -void OpenGl_HaltonSampler::initRandom (Random_number_generator& theRand) -{ - const unsigned THE_MAX_BASE = 5u; - std::vector > aPerms(THE_MAX_BASE + 1); - for (unsigned k = 1; k <= 3; ++k) // Keep identity permutations for base 1, 2, 3. - { - aPerms[k].resize (k); - for (unsigned i = 0; i < k; ++i) - { - aPerms[k][i] = i; - } - } - - for (unsigned aBase = 4; aBase <= THE_MAX_BASE; ++aBase) - { - aPerms[aBase].resize (aBase); - for (unsigned i = 0; i < aBase; ++i) - { - aPerms[aBase][i] = i; - } - std::random_shuffle (aPerms[aBase].begin(), aPerms[aBase].end(), theRand); - } - initTables (aPerms); -} #endif // _OpenGl_HaltonSampler_H diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_IndexBuffer.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_IndexBuffer.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_IndexBuffer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_IndexBuffer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,3 +35,13 @@ { return GL_ELEMENT_ARRAY_BUFFER; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_IndexBuffer::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, OpenGl_VertexBuffer) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_IndexBuffer.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_IndexBuffer.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_IndexBuffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_IndexBuffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,9 @@ Standard_EXPORT OpenGl_IndexBuffer(); Standard_EXPORT virtual GLenum GetTarget() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + public: DEFINE_STANDARD_RTTIEXT(OpenGl_IndexBuffer,OpenGl_VertexBuffer) // Type definition diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_LayerList.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_LayerList.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_LayerList.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_LayerList.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -594,7 +594,7 @@ if (hasOwnLights) { aLayerSettings.Lights()->UpdateRevision(); - aManager->UpdateLightSourceStateTo (aLayerSettings.Lights()); + aManager->UpdateLightSourceStateTo (aLayerSettings.Lights(), theWorkspace->View()->SpecIBLMapLevels()); } const Handle(Graphic3d_Camera)& aWorldCamera = theWorkspace->View()->Camera(); @@ -665,7 +665,7 @@ if (hasOwnLights) { - aManager->UpdateLightSourceStateTo (aLightsBack); + aManager->UpdateLightSourceStateTo (aLightsBack, theWorkspace->View()->SpecIBLMapLevels()); } if (hasLocalCS) { @@ -732,7 +732,7 @@ if (aPassIter == 0) { aCtx->SetColorMask (false); - aCtx->ShaderManager()->UpdateLightSourceStateTo (Handle(Graphic3d_LightSet)()); + aCtx->ShaderManager()->UpdateLightSourceStateTo (Handle(Graphic3d_LightSet)(), theWorkspace->View()->SpecIBLMapLevels()); aDefaultSettings.DepthFunc = aPrevSettings.DepthFunc; aDefaultSettings.DepthMask = GL_TRUE; } @@ -743,13 +743,13 @@ continue; } aCtx->SetColorMask (true); - aCtx->ShaderManager()->UpdateLightSourceStateTo (aLightsBack); + aCtx->ShaderManager()->UpdateLightSourceStateTo (aLightsBack, theWorkspace->View()->SpecIBLMapLevels()); aDefaultSettings = aPrevSettings; } else if (aPassIter == 2) { aCtx->SetColorMask (true); - aCtx->ShaderManager()->UpdateLightSourceStateTo (aLightsBack); + aCtx->ShaderManager()->UpdateLightSourceStateTo (aLightsBack, theWorkspace->View()->SpecIBLMapLevels()); if (toPerformDepthPrepass) { aDefaultSettings.DepthFunc = GL_EQUAL; @@ -932,7 +932,7 @@ // Bind full screen quad buffer and framebuffer resources. aVerts->BindVertexAttrib (aCtx, Graphic3d_TOA_POS); - const Handle(OpenGl_TextureSet) aTextureBack = aCtx->BindTextures (Handle(OpenGl_TextureSet)()); + const Handle(OpenGl_TextureSet) aTextureBack = aCtx->BindTextures (Handle(OpenGl_TextureSet)(), Handle(OpenGl_ShaderProgram)()); theOitAccumFbo->ColorTexture (0)->Bind (aCtx, Graphic3d_TextureUnit_0); theOitAccumFbo->ColorTexture (1)->Bind (aCtx, Graphic3d_TextureUnit_1); @@ -949,7 +949,7 @@ if (!aTextureBack.IsNull()) { - aCtx->BindTextures (aTextureBack); + aCtx->BindTextures (aTextureBack, Handle(OpenGl_ShaderProgram)()); } } else @@ -970,3 +970,23 @@ aCtx->core11fwd->glDepthMask (theGlobalSettings.DepthMask); aCtx->core11fwd->glDepthFunc (theGlobalSettings.DepthFunc); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_LayerList::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_LayerList) + + for (NCollection_List::Iterator aLayersIt (myLayers); aLayersIt.More(); aLayersIt.Next()) + { + const Handle(Graphic3d_Layer)& aLayerId = aLayersIt.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aLayerId.get()) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNbPriorities) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNbStructures) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myImmediateNbStructures) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myModifStateOfRaytraceable) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_LayerList.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_LayerList.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_LayerList.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_LayerList.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,7 @@ #include #include +class OpenGl_FrameBuffer; class OpenGl_Structure; class OpenGl_Workspace; struct OpenGl_GlobalLayerSettings; @@ -35,10 +36,10 @@ public: //! Constructor - OpenGl_LayerList (const Standard_Integer theNbPriorities); + Standard_EXPORT OpenGl_LayerList (const Standard_Integer theNbPriorities); //! Destructor - virtual ~OpenGl_LayerList(); + Standard_EXPORT virtual ~OpenGl_LayerList(); //! Method returns the number of available priorities Standard_Integer NbPriorities() const { return myNbPriorities; } @@ -50,40 +51,40 @@ Standard_Integer NbImmediateStructures() const { return myImmediateNbStructures; } //! Insert a new layer with id. - void InsertLayerBefore (const Graphic3d_ZLayerId theNewLayerId, - const Graphic3d_ZLayerSettings& theSettings, - const Graphic3d_ZLayerId theLayerAfter); + Standard_EXPORT void InsertLayerBefore (const Graphic3d_ZLayerId theNewLayerId, + const Graphic3d_ZLayerSettings& theSettings, + const Graphic3d_ZLayerId theLayerAfter); //! Insert a new layer with id. - void InsertLayerAfter (const Graphic3d_ZLayerId theNewLayerId, - const Graphic3d_ZLayerSettings& theSettings, - const Graphic3d_ZLayerId theLayerBefore); + Standard_EXPORT void InsertLayerAfter (const Graphic3d_ZLayerId theNewLayerId, + const Graphic3d_ZLayerSettings& theSettings, + const Graphic3d_ZLayerId theLayerBefore); //! Remove layer by its id. - void RemoveLayer (const Graphic3d_ZLayerId theLayerId); + Standard_EXPORT void RemoveLayer (const Graphic3d_ZLayerId theLayerId); //! Add structure to list with given priority. The structure will be inserted //! to specified layer. If the layer isn't found, the structure will be put //! to default bottom-level layer. - void AddStructure (const OpenGl_Structure* theStruct, - const Graphic3d_ZLayerId theLayerId, - const Standard_Integer thePriority, - Standard_Boolean isForChangePriority = Standard_False); + Standard_EXPORT void AddStructure (const OpenGl_Structure* theStruct, + const Graphic3d_ZLayerId theLayerId, + const Standard_Integer thePriority, + Standard_Boolean isForChangePriority = Standard_False); //! Remove structure from structure list and return its previous priority - void RemoveStructure (const OpenGl_Structure* theStructure); + Standard_EXPORT void RemoveStructure (const OpenGl_Structure* theStructure); //! Change structure z layer //! If the new layer is not presented, the structure will be displayed //! in default z layer - void ChangeLayer (const OpenGl_Structure* theStructure, - const Graphic3d_ZLayerId theOldLayerId, - const Graphic3d_ZLayerId theNewLayerId); + Standard_EXPORT void ChangeLayer (const OpenGl_Structure* theStructure, + const Graphic3d_ZLayerId theOldLayerId, + const Graphic3d_ZLayerId theNewLayerId); //! Changes structure priority within its ZLayer - void ChangePriority (const OpenGl_Structure* theStructure, - const Graphic3d_ZLayerId theLayerId, - const Standard_Integer theNewPriority); + Standard_EXPORT void ChangePriority (const OpenGl_Structure* theStructure, + const Graphic3d_ZLayerId theLayerId, + const Standard_Integer theNewPriority); //! Returns reference to the layer with given ID. OpenGl_Layer& Layer (const Graphic3d_ZLayerId theLayerId) { return *myLayerIds.Find (theLayerId); } @@ -92,19 +93,19 @@ const OpenGl_Layer& Layer (const Graphic3d_ZLayerId theLayerId) const { return *myLayerIds.Find (theLayerId); } //! Assign new settings to the layer. - void SetLayerSettings (const Graphic3d_ZLayerId theLayerId, - const Graphic3d_ZLayerSettings& theSettings); + Standard_EXPORT void SetLayerSettings (const Graphic3d_ZLayerId theLayerId, + const Graphic3d_ZLayerSettings& theSettings); //! Update culling state - should be called before rendering. - void UpdateCulling (const Handle(OpenGl_Workspace)& theWorkspace, - const Standard_Boolean theToDrawImmediate); + Standard_EXPORT void UpdateCulling (const Handle(OpenGl_Workspace)& theWorkspace, + const Standard_Boolean theToDrawImmediate); //! Render this element - void Render (const Handle(OpenGl_Workspace)& theWorkspace, - const Standard_Boolean theToDrawImmediate, - const OpenGl_LayerFilter theLayersToProcess, - OpenGl_FrameBuffer* theReadDrawFbo, - OpenGl_FrameBuffer* theOitAccumFbo) const; + Standard_EXPORT void Render (const Handle(OpenGl_Workspace)& theWorkspace, + const Standard_Boolean theToDrawImmediate, + const OpenGl_LayerFilter theLayersToProcess, + OpenGl_FrameBuffer* theReadDrawFbo, + OpenGl_FrameBuffer* theOitAccumFbo) const; //! Returns the set of OpenGL Z-layers. const NCollection_List& Layers() const { return myLayers; } @@ -114,7 +115,7 @@ //! Marks BVH tree for given priority list as dirty and //! marks primitive set for rebuild. - void InvalidateBVHData (const Graphic3d_ZLayerId theLayerId); + Standard_EXPORT void InvalidateBVHData (const Graphic3d_ZLayerId theLayerId); //! Returns structure modification state (for ray-tracing). Standard_Size ModificationStateOfRaytracable() const { return myModifStateOfRaytraceable; } @@ -123,7 +124,10 @@ const Handle(Select3D_BVHBuilder3d)& FrustumCullingBVHBuilder() const { return myBVHBuilder; } //! Assigns BVH tree builder for frustom culling. - void SetFrustumCullingBVHBuilder (const Handle(Select3D_BVHBuilder3d)& theBuilder); + Standard_EXPORT void SetFrustumCullingBVHBuilder (const Handle(Select3D_BVHBuilder3d)& theBuilder); + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; protected: @@ -184,16 +188,16 @@ //! @param theGlobalSettings [in] the set of global settings used for rendering. //! @param theReadDrawFbo [in] the framebuffer for reading depth and writing final color. //! @param theOitAccumFbo [in] the framebuffer for accumulating color and coverage for OIT process. - void renderTransparent (const Handle(OpenGl_Workspace)& theWorkspace, - OpenGl_LayerStack::iterator& theLayerIter, - const OpenGl_GlobalLayerSettings& theGlobalSettings, - OpenGl_FrameBuffer* theReadDrawFbo, - OpenGl_FrameBuffer* theOitAccumFbo) const; + Standard_EXPORT void renderTransparent (const Handle(OpenGl_Workspace)& theWorkspace, + OpenGl_LayerStack::iterator& theLayerIter, + const OpenGl_GlobalLayerSettings& theGlobalSettings, + OpenGl_FrameBuffer* theReadDrawFbo, + OpenGl_FrameBuffer* theOitAccumFbo) const; // Render structures within specified layer. - void renderLayer (const Handle(OpenGl_Workspace)& theWorkspace, - const OpenGl_GlobalLayerSettings& theDefaultSettings, - const Graphic3d_Layer& theLayer) const; + Standard_EXPORT void renderLayer (const Handle(OpenGl_Workspace)& theWorkspace, + const OpenGl_GlobalLayerSettings& theDefaultSettings, + const Graphic3d_Layer& theLayer) const; protected: diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_LineAttributes.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_LineAttributes.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_LineAttributes.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_LineAttributes.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,8 +25,6 @@ // purpose : // ======================================================================= OpenGl_LineAttributes::OpenGl_LineAttributes() -: myTypeOfHatch (0), - myIsEnabled (true) { // } @@ -46,9 +44,9 @@ // ======================================================================= void OpenGl_LineAttributes::Release (OpenGl_Context* theGlCtx) { - // Delete surface patterns #if !defined(GL_ES_VERSION_2_0) - if (theGlCtx != NULL && theGlCtx->IsValid()) + if (theGlCtx != NULL + && theGlCtx->IsValid()) { for (OpenGl_MapOfHatchStylesAndIds::Iterator anIter (myStyles); anIter.More(); anIter.Next()) { @@ -56,9 +54,9 @@ } } #else - (void )theGlCtx; + (void )theGlCtx; #endif - myStyles.Clear(); + myStyles.Clear(); } // ======================================================================= @@ -69,12 +67,7 @@ const Handle(Graphic3d_HatchStyle)& theStyle) { #if !defined(GL_ES_VERSION_2_0) - if (theGlCtx->core11 == NULL) - { - return 0; - } - - const unsigned int aListId = glGenLists(1); + const unsigned int aListId = theGlCtx->core11->glGenLists(1); theGlCtx->core11->glNewList ((GLuint)aListId, GL_COMPILE); theGlCtx->core11->glPolygonStipple ((const GLubyte*)theStyle->Pattern()); theGlCtx->core11->glEndList(); @@ -90,17 +83,16 @@ // function : SetTypeOfHatch // purpose : // ======================================================================= -int OpenGl_LineAttributes::SetTypeOfHatch (const OpenGl_Context* theGlCtx, - const Handle(Graphic3d_HatchStyle)& theStyle) +bool OpenGl_LineAttributes::SetTypeOfHatch (const OpenGl_Context* theGlCtx, + const Handle(Graphic3d_HatchStyle)& theStyle) { - // Return if not initialized - if (theStyle.IsNull()) + if (theStyle.IsNull() + || theStyle->HatchType() == Aspect_HS_SOLID + || theGlCtx->core11 == NULL) { - return 0; + return false; } - const int anOldType = myTypeOfHatch; - unsigned int aGpuListId = 0; if (!myStyles.Find (theStyle, aGpuListId)) { @@ -109,66 +101,7 @@ } #if !defined(GL_ES_VERSION_2_0) - if (theGlCtx->core11 == NULL) - { - return 0; - } - else if (theStyle->HatchType() != 0) - { - theGlCtx->core11->glCallList ((GLuint)aGpuListId); - - if (myIsEnabled) - { - theGlCtx->core11fwd->glEnable (GL_POLYGON_STIPPLE); - } - } - else - { - theGlCtx->core11fwd->glDisable (GL_POLYGON_STIPPLE); - } -#else - (void )theGlCtx; -#endif - myTypeOfHatch = theStyle->HatchType(); - - return anOldType; -} - -// ======================================================================= -// function : SetEnabled -// purpose : -// ======================================================================= -bool OpenGl_LineAttributes::SetEnabled (const OpenGl_Context* theGlCtx, - const bool theToEnable) -{ - // Return if not initialized - if (myStyles.IsEmpty()) - { - return false; - } - - const bool anOldIsEnabled = myIsEnabled; - -#if !defined(GL_ES_VERSION_2_0) - if (theGlCtx->core11 == NULL) - { - return 0; - } - else if (theToEnable) - { - if (myTypeOfHatch != 0) - { - theGlCtx->core11fwd->glEnable (GL_POLYGON_STIPPLE); - } - } - else - { - theGlCtx->core11fwd->glDisable (GL_POLYGON_STIPPLE); - } -#else - (void )theGlCtx; + theGlCtx->core11->glCallList ((GLuint)aGpuListId); #endif - myIsEnabled = theToEnable; - - return anOldIsEnabled; + return true; } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_LineAttributes.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_LineAttributes.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_LineAttributes.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_LineAttributes.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,9 +18,6 @@ #include -#include -#include -#include #include #include @@ -28,66 +25,40 @@ class OpenGl_Context; -//! Utility class to manage OpenGL state of polygon hatching rasterization -//! and keeping its cached state. The hatching rasterization is implemented -//! using glPolygonStipple function of OpenGL. State of hatching is controlled -//! by two parameters - type of hatching and IsEnabled parameter. -//! The hatching rasterization is enabled only if non-zero index pattern type -//! is selected (zero by default is reserved for solid filling) and if -//! IsEnabled flag is set to true. The IsEnabled parameter is useful for temporarily -//! turning on/off the hatching rasterization without making any costly GL calls -//! for changing the hatch pattern. This is a sharable resource class - it creates -//! OpenGL context objects for each hatch pattern to achieve quicker switching between -//! them, thesse GL objects are freed when the resource is released by owner context. -//! @note The implementation is not supported by Core Profile and by ES version. +DEFINE_STANDARD_HANDLE(OpenGl_LineAttributes, OpenGl_Resource) + +//! Utility class to manage OpenGL resources of polygon hatching styles. +//! @note the implementation is not supported by Core Profile and by ES version. class OpenGl_LineAttributes : public OpenGl_Resource { + DEFINE_STANDARD_RTTIEXT(OpenGl_LineAttributes, OpenGl_Resource) public: //! Default constructor. - //! By default the parameters are: - //! - IsEnabled (true), - //! - TypeOfHatch (0). - OpenGl_LineAttributes(); + Standard_EXPORT OpenGl_LineAttributes(); //! Default destructor. - virtual ~OpenGl_LineAttributes(); + Standard_EXPORT virtual ~OpenGl_LineAttributes(); //! Release GL resources. - virtual void Release (OpenGl_Context* theGlCtx) Standard_OVERRIDE; + Standard_EXPORT virtual void Release (OpenGl_Context* theGlCtx) Standard_OVERRIDE; //! Returns estimated GPU memory usage - not implemented. virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE { return 0; } - //! Index of currently selected type of hatch. - int TypeOfHatch() const { return myTypeOfHatch; } - //! Sets type of the hatch. - int SetTypeOfHatch (const OpenGl_Context* theGlCtx, - const Handle(Graphic3d_HatchStyle)& theStyle); - - //! Current enabled state of the hatching rasterization. - bool IsEnabled() const { return myIsEnabled; } - - //! Turns on/off the hatching rasterization rasterization. - bool SetEnabled (const OpenGl_Context* theGlCtx, const bool theToEnable); + Standard_EXPORT bool SetTypeOfHatch (const OpenGl_Context* theGlCtx, + const Handle(Graphic3d_HatchStyle)& theStyle); -protected: +private: unsigned int init (const OpenGl_Context* theGlCtx, const Handle(Graphic3d_HatchStyle)& theStyle); protected: - int myTypeOfHatch; //!< Currently activated type of hatch - bool myIsEnabled; //!< Current enabled state of hatching rasterization. OpenGl_MapOfHatchStylesAndIds myStyles; //!< Hatch patterns -public: - - DEFINE_STANDARD_RTTIEXT(OpenGl_LineAttributes,OpenGl_Resource) }; -DEFINE_STANDARD_HANDLE(OpenGl_LineAttributes, OpenGl_Resource) - #endif // _OpenGl_LineAttributes_Header diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Material.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Material.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Material.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Material.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,8 +19,10 @@ #include #include +class OpenGl_Context; + //! OpenGL material definition -struct OpenGl_Material +struct OpenGl_MaterialCommon { OpenGl_Vec4 Ambient; //!< ambient reflection coefficient @@ -35,29 +37,57 @@ float Transparency() const { return Params.y(); } float& ChangeTransparency() { return Params.y(); } + //! Empty constructor. + OpenGl_MaterialCommon() : Ambient (1.0f), Diffuse (1.0f), Specular (1.0f), Emission (1.0f), Params (1.0f, 0.0f, 0.0f, 0.0f) {} + + //! Returns packed (serialized) representation of material properties + const OpenGl_Vec4* Packed() const { return reinterpret_cast (this); } + static Standard_Integer NbOfVec4() { return 5; } + +}; + +//! OpenGL material definition +struct OpenGl_MaterialPBR +{ + + OpenGl_Vec4 BaseColor; //!< base color of PBR material with alpha component + OpenGl_Vec4 EmissionIOR; //!< light intensity which is emitted by PBR material and index of refraction + OpenGl_Vec4 Params; //!< extra packed parameters + + float Metallic() const { return Params.b(); } + float& ChangeMetallic() { return Params.b(); } + + float Roughness() const { return Params.g(); } + float& ChangeRoughness() { return Params.g(); } + + //! Empty constructor. + OpenGl_MaterialPBR() : BaseColor (1.0f), EmissionIOR (1.0f), Params (1.0f, 1.0f, 1.0f, 1.0f) {} + + //! Returns packed (serialized) representation of material properties + const OpenGl_Vec4* Packed() const { return reinterpret_cast (this); } + static Standard_Integer NbOfVec4() { return 3; } + +}; + +//! OpenGL material definition +struct OpenGl_Material +{ + OpenGl_MaterialCommon Common; + OpenGl_MaterialPBR Pbr; + //! Set material color. void SetColor (const OpenGl_Vec4& theColor) { // apply the same formula as in Graphic3d_MaterialAspect::SetColor() - Ambient.SetValues (theColor.rgb() * 0.25f, Ambient.a()); - Diffuse.SetValues (theColor.rgb(), Diffuse.a()); + Common.Ambient.SetValues (theColor.rgb() * 0.25f, Common.Ambient.a()); + Common.Diffuse.SetValues (theColor.rgb(), Common.Diffuse.a()); + Pbr .BaseColor.SetValues (theColor.rgb(), Pbr.BaseColor.a()); } - //! Empty constructor. - OpenGl_Material() - : Ambient (1.0f), - Diffuse (1.0f), - Specular(1.0f), - Emission(1.0f), - Params (1.0f, 0.0f, 0.0f, 0.0f) {} - //! Initialize material - void Init (const Graphic3d_MaterialAspect& theProp, - const Quantity_Color& theInteriorColor); - - //! Returns packed (serialized) representation of material properties - const OpenGl_Vec4* Packed() const { return reinterpret_cast (this); } - static Standard_Integer NbOfVec4() { return 5; } + void Init (const OpenGl_Context& theCtx, + const Graphic3d_MaterialAspect& theProp, + const Quantity_Color& theInteriorColor); //! Check this material for equality with another material (without tolerance!). bool IsEqual (const OpenGl_Material& theOther) const diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_MatrixState.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_MatrixState.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_MatrixState.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_MatrixState.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,7 @@ #include #include +#include //! Software implementation for OpenGL matrix stack. template @@ -84,6 +85,20 @@ myCurrent = typename OpenGl::MatrixType::Mat4(); } + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const + { + (void)theDepth; + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "myCurrent", 16, + myCurrent.GetValue (0, 0), myCurrent.GetValue (0, 1), myCurrent.GetValue (0, 2), myCurrent.GetValue (0, 3), + myCurrent.GetValue (1, 0), myCurrent.GetValue (1, 1), myCurrent.GetValue (1, 2), myCurrent.GetValue (1, 3), + myCurrent.GetValue (2, 0), myCurrent.GetValue (2, 1), myCurrent.GetValue (2, 2), myCurrent.GetValue (2, 3), + myCurrent.GetValue (3, 0), myCurrent.GetValue (3, 1), myCurrent.GetValue (3, 2), myCurrent.GetValue (3, 3)) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myStack.Size()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myStackHead) + } + private: NCollection_Vector::Mat4> myStack; //!< Collection used to maintenance matrix stack diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_PBREnvironment.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_PBREnvironment.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_PBREnvironment.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_PBREnvironment.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,487 @@ +// Author: Ilya Khramov +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +IMPLEMENT_STANDARD_RTTIEXT(OpenGl_PBREnvironment, OpenGl_NamedResource) + +//! Constructor of this class saves necessary OpenGL states components which can be changed by OpenGl_PBREnvironment. +//! Destructor restores state back. +class OpenGl_PBREnvironmentSentry +{ +public: + + OpenGl_PBREnvironmentSentry (const Handle(OpenGl_Context)& theCtx) + : myContext (theCtx) + { + backup(); + prepare(); + } + + ~OpenGl_PBREnvironmentSentry() + { + restore(); + } + +private: + + void backup() + { + myContext->core11fwd->glGetIntegerv (GL_FRAMEBUFFER_BINDING, &myFBO); + myShaderProgram = myContext->ActiveProgram(); + for (unsigned int i = 0; i < 4; ++i) + { + myViewport[i] = myContext->Viewport()[i]; + } + myContext->core11fwd->glGetFloatv (GL_COLOR_CLEAR_VALUE, myClearColor); + + GLboolean aStatus = GL_TRUE; + myContext->core11fwd->glGetBooleanv (GL_DEPTH_TEST, &aStatus); + myDepthTestWasEnabled = aStatus ? Standard_True : Standard_False; + myContext->core11fwd->glGetBooleanv (GL_DEPTH_WRITEMASK, &aStatus); + myDepthWrirtingWasEnablig = aStatus ? Standard_True : Standard_False; + myContext->core11fwd->glGetBooleanv (GL_SCISSOR_TEST, &aStatus); + myScissorTestWasEnabled = aStatus ? Standard_True : Standard_False; + myContext->core11fwd->glGetIntegerv (GL_SCISSOR_BOX, myScissorBox); + } + + void prepare() + { + myContext->BindDefaultVao(); + myContext->core11fwd->glDisable (GL_DEPTH_TEST); + myContext->core11fwd->glDepthMask (GL_FALSE); + myContext->core11fwd->glDisable (GL_BLEND); + myContext->core11fwd->glDisable (GL_SCISSOR_TEST); + } + + void restore() + { + myContext->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, myFBO); + myContext->BindProgram (myShaderProgram); + myContext->ResizeViewport (myViewport); + myContext->core11fwd->glClearColor (myClearColor.r(), myClearColor.g(), myClearColor.b(), myClearColor.a()); + if (myDepthTestWasEnabled) + { + myContext->core11fwd->glEnable (GL_DEPTH_TEST); + } + else + { + myContext->core11fwd->glDisable (GL_DEPTH_TEST); + } + myContext->core11fwd->glDepthMask (myDepthWrirtingWasEnablig ? GL_TRUE : GL_FALSE); + if (myScissorTestWasEnabled) + { + myContext->core11fwd->glEnable (GL_SCISSOR_TEST); + } + else + { + myContext->core11fwd->glDisable (GL_SCISSOR_TEST); + } + myContext->core11fwd->glScissor (myScissorBox[0], myScissorBox[1], myScissorBox[2], myScissorBox[3]); + } + +private: + + OpenGl_PBREnvironmentSentry (const OpenGl_PBREnvironmentSentry& ); + OpenGl_PBREnvironmentSentry& operator= (const OpenGl_PBREnvironmentSentry& ); + +private: + + const Handle(OpenGl_Context) myContext; + GLint myFBO; + Handle(OpenGl_ShaderProgram) myShaderProgram; + Standard_Boolean myDepthTestWasEnabled; + Standard_Boolean myDepthWrirtingWasEnablig; + Standard_Boolean myScissorTestWasEnabled; + Standard_Integer myScissorBox[4]; + Standard_Integer myViewport[4]; + Graphic3d_Vec4 myClearColor; + +}; + +// ======================================================================= +// function : Create +// purpose : +// ======================================================================= +Handle(OpenGl_PBREnvironment) OpenGl_PBREnvironment::Create (const Handle(OpenGl_Context)& theCtx, + unsigned int thePow2Size, + unsigned int theLevelsNumber, + const TCollection_AsciiString& theId) +{ + if (theCtx->arbFBO == NULL) + { + return Handle(OpenGl_PBREnvironment)(); + } + + Handle(OpenGl_PBREnvironment) anEnvironment = new OpenGl_PBREnvironment (theCtx, thePow2Size, theLevelsNumber, theId); + if (!anEnvironment->IsComplete()) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_MEDIUM, + "Warning: PBR environment is not created. PBR material system will be ignored."); + anEnvironment->Release (theCtx.get()); + anEnvironment.Nullify(); + } + + return anEnvironment; +} + +// ======================================================================= +// function : OpenGl_PBREnvironment +// purpose : +// ======================================================================= +OpenGl_PBREnvironment::OpenGl_PBREnvironment (const Handle(OpenGl_Context)& theCtx, + unsigned int thePowOf2Size, + unsigned int theSpecMapLevelsNumber, + const TCollection_AsciiString& theId) +: OpenGl_NamedResource (theId), + myPow2Size (std::max (1u, thePowOf2Size)), + mySpecMapLevelsNumber (std::max (2u, std::min (theSpecMapLevelsNumber, std::max (1u, thePowOf2Size) + 1))), + myFBO (OpenGl_FrameBuffer::NO_FRAMEBUFFER), + myIsComplete (Standard_False), + myIsNeededToBeBound (Standard_True) +{ + OpenGl_PBREnvironmentSentry aSentry (theCtx); + + myIsComplete = initVAO (theCtx) + && initTextures (theCtx) + && initFBO (theCtx); + + if (myIsComplete) + { + clear (theCtx); + } +} + +// ======================================================================= +// function : Bind +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::Bind (const Handle(OpenGl_Context)& theCtx) +{ + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Bind (theCtx); + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Bind (theCtx); + myIsNeededToBeBound = Standard_False; +} + +// ======================================================================= +// function : Unbind +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::Unbind (const Handle(OpenGl_Context)& theCtx) +{ + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Unbind (theCtx); + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Unbind (theCtx); + myIsNeededToBeBound = Standard_True; +} + +// ======================================================================= +// function : Clear +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::Clear (const Handle(OpenGl_Context)& theCtx, + const Graphic3d_Vec3& theColor) +{ + OpenGl_PBREnvironmentSentry aSentry (theCtx); + clear (theCtx, theColor); +} + +// ======================================================================= +// function : Bake +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::Bake (const Handle(OpenGl_Context)& theCtx, + const Handle(OpenGl_Texture)& theEnvMap, + Standard_Boolean theZIsInverted, + Standard_Boolean theIsTopDown, + Standard_Size theDiffMapNbSamples, + Standard_Size theSpecMapNbSamples, + Standard_ShortReal theProbability) +{ + Standard_ProgramError_Raise_if (theEnvMap.IsNull(), "'Bake' function of 'OpenGl_PBREnvironment' can't work without source environment map") + Standard_RangeError_Raise_if (theProbability > 1.f || theProbability < 0.f, "'probability' parameter in 'Bake' function of 'OpenGl_PBREnvironment' must be in range [0, 1]") + Unbind (theCtx); + OpenGl_PBREnvironmentSentry aSentry (theCtx); + bake (theCtx, theEnvMap, theZIsInverted, theIsTopDown, theDiffMapNbSamples, theSpecMapNbSamples, theProbability); +} + +// ======================================================================= +// function : SizesAreDifferent +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::SizesAreDifferent (unsigned int thePow2Size, + unsigned int theSpecMapLevelsNumber) const +{ + thePow2Size = std::max (1u, thePow2Size); + theSpecMapLevelsNumber = std::max (2u, std::min (theSpecMapLevelsNumber, std::max (1u, thePow2Size) + 1)); + return myPow2Size != thePow2Size + || mySpecMapLevelsNumber != theSpecMapLevelsNumber; +} + +// ======================================================================= +// function : Release +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::Release (OpenGl_Context* theCtx) +{ + if (myFBO != OpenGl_FrameBuffer::NO_FRAMEBUFFER) + { + if (theCtx != NULL + && theCtx->IsValid()) + { + theCtx->arbFBO->glDeleteFramebuffers (1, &myFBO); + } + myFBO = OpenGl_FrameBuffer::NO_FRAMEBUFFER; + } + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Release(theCtx); + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Release (theCtx); + myVBO.Release (theCtx); +} + +// ======================================================================= +// function : ~OpenGl_PBREnvironment +// purpose : +// ======================================================================= +OpenGl_PBREnvironment::~OpenGl_PBREnvironment() +{ + Release (NULL); +} + +// ======================================================================= +// function : initTextures +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::initTextures (const Handle(OpenGl_Context)& theCtx) +{ + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Sampler()->Parameters()->SetTextureUnit (theCtx->PBRSpecIBLMapTexUnit()); + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Sampler()->Parameters()->SetTextureUnit (theCtx->PBRDiffIBLMapSHTexUnit()); + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Sampler()->Parameters()->SetFilter (Graphic3d_TOTF_TRILINEAR); + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Sampler()->Parameters()->SetFilter(Graphic3d_TOTF_NEAREST); + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Sampler()->Parameters()->SetLevelsRange (mySpecMapLevelsNumber - 1); + + // NVIDIA's driver didn't work properly with 3 channel texture for diffuse SH coefficients so that alpha channel has been added + return myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Init (theCtx, + OpenGl_TextureFormat::FindFormat (theCtx, Image_Format_RGBAF, false), + Graphic3d_Vec2i (9, 1), + Graphic3d_TOT_2D) + && myIBLMaps[OpenGl_TypeOfIBLMap_Specular].InitCubeMap (theCtx, Handle(Graphic3d_CubeMap)(), + Standard_Size(1) << myPow2Size, Image_Format_RGB, true, false); +} + +// ======================================================================= +// function : initVAO +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::initVAO (const Handle(OpenGl_Context)& theCtx) +{ + const float aVertexPos[] = + { + -1.f, -1.f, 0.f, 0.f, + 1.f, -1.f, 0.f, 0.f, + -1.f, 1.f, 0.f, 0.f, + 1.f, 1.f, 0.f, 0.f + }; + return myVBO.Init (theCtx, 4, 4, aVertexPos); +} + +// ======================================================================= +// function : initFBO +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::initFBO (const Handle(OpenGl_Context)& theCtx) +{ + theCtx->arbFBO->glGenFramebuffers (1, &myFBO); + return checkFBOComplentess (theCtx); +} + +// ======================================================================= +// function : processDiffIBLMap +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::processDiffIBLMap (const Handle(OpenGl_Context)& theCtx, + Standard_Boolean theIsDrawAction, + Standard_Size theNbSamples) +{ + theCtx->arbFBO->glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].TextureId(), 0); + const Standard_Integer aViewport[4] = { 0, 0, 9, 1 }; + theCtx->ResizeViewport(aViewport); + if (theIsDrawAction) + { + theCtx->ActiveProgram()->SetUniform(theCtx, "occNbSpecIBLLevels", 0); + theCtx->ActiveProgram()->SetUniform(theCtx, "uSamplesNum", static_cast(theNbSamples)); + + theCtx->core11fwd->glDrawArrays (GL_TRIANGLE_STRIP, 0, 4); + } + else + { + theCtx->core11fwd->glClear (GL_COLOR_BUFFER_BIT); + + theCtx->core11fwd->glEnable (GL_SCISSOR_TEST); + theCtx->core11fwd->glClearColor (0.f, 0.f, 0.f, 1.f); + theCtx->core11fwd->glScissor (1, 0, 8, 1); + theCtx->core11fwd->glClear (GL_COLOR_BUFFER_BIT); + } + + return true; +} + +// ======================================================================= +// function : processSpecIBLMap +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::processSpecIBLMap (const Handle(OpenGl_Context)& theCtx, + Standard_Boolean theIsDrawAction, + Standard_Integer theEnvMapSize, + Standard_Size theNbSamples, + Standard_ShortReal theProbability) +{ + if (theIsDrawAction) + { + theCtx->ActiveProgram()->SetUniform (theCtx, "occNbSpecIBLLevels", Standard_Integer(mySpecMapLevelsNumber)); + theCtx->ActiveProgram()->SetUniform (theCtx, "uEnvMapSize", theEnvMapSize); + } + + for (int aLevelIter = mySpecMapLevelsNumber - 1;; --aLevelIter) + { + const Standard_Integer aSize = 1 << (myPow2Size - aLevelIter); + const Standard_Integer aViewport[4] = { 0, 0, aSize, aSize }; + theCtx->ResizeViewport (aViewport); + if (theIsDrawAction) + { + Standard_Integer aNbSamples = static_cast(Graphic3d_PBRMaterial::SpecIBLMapSamplesFactor (theProbability, aLevelIter / float (mySpecMapLevelsNumber - 1)) * theNbSamples); + theCtx->ActiveProgram()->SetUniform (theCtx, "uSamplesNum", static_cast(aNbSamples)); + theCtx->ActiveProgram()->SetUniform (theCtx, "uCurrentLevel", aLevelIter); + } + + for (Standard_Integer aSideIter = 0; aSideIter < 6; ++aSideIter) + { + theCtx->arbFBO->glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + aSideIter, + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].TextureId(), aLevelIter); + if (theIsDrawAction) + { + theCtx->ActiveProgram()->SetUniform(theCtx, "uCurrentSide", aSideIter); + theCtx->core11fwd->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + else + { + theCtx->core11fwd->glClear(GL_COLOR_BUFFER_BIT); + } + } + + if (aLevelIter == 0) + { + break; + } + } + + return true; +} + +// ======================================================================= +// function : checkFBOCompletness +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::checkFBOComplentess (const Handle(OpenGl_Context)& theCtx) const +{ + theCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, myFBO); + theCtx->arbFBO->glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].TextureId(), 0); + if (theCtx->arbFBO->glCheckFramebufferStatus (GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + { + return false; + } + for (Standard_Integer aSideIter = 0; aSideIter < 6; ++aSideIter) + { + for (unsigned int aLevel = 0; aLevel < mySpecMapLevelsNumber; ++aLevel) + { + theCtx->arbFBO->glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + aSideIter, + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].TextureId(), aLevel); + if (theCtx->arbFBO->glCheckFramebufferStatus (GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + { + return false; + } + } + } + return true; +} + +// ======================================================================= +// function : bake +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::bake (const Handle(OpenGl_Context)& theCtx, + const Handle(OpenGl_Texture)& theEnvMap, + Standard_Boolean theZIsInverted, + Standard_Boolean theIsTopDown, + Standard_Size theDiffNbSamples, + Standard_Size theSpecNbSamples, + Standard_ShortReal theProbability) +{ + myIsNeededToBeBound = Standard_True; + if (!theCtx->ShaderManager()->BindPBREnvBakingProgram()) + { + return; + } + theEnvMap->Bind (theCtx, theCtx->PBRSpecIBLMapTexUnit()); + theCtx->ActiveProgram()->SetSampler (theCtx, "uEnvMap", theCtx->PBRSpecIBLMapTexUnit()); + theCtx->ActiveProgram()->SetUniform (theCtx, "uZCoeff", theZIsInverted ? -1 : 1); + theCtx->ActiveProgram()->SetUniform (theCtx, "uYCoeff", theIsTopDown ? 1 : -1); + theCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, myFBO); + myVBO.BindAttribute (theCtx, Graphic3d_TOA_POS); + + OSD_Timer aTimer; + aTimer.Start(); + if (processSpecIBLMap (theCtx, true, theEnvMap->SizeX(), theSpecNbSamples, theProbability) + && processDiffIBLMap (theCtx, true, theDiffNbSamples)) + { + Message::SendTrace(TCollection_AsciiString() + + "IBL " + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].SizeX() + "x" + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].SizeY() + + " is baked in " + aTimer.ElapsedTime() + " s"); + } + else + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString("Error: baking PBR environment ") + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].SizeX() + + "x" + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].SizeY() + " takes too much time!."); + clear (theCtx, Graphic3d_Vec3(1.0f)); + } + + myVBO.UnbindAttribute (theCtx, Graphic3d_TOA_POS); + theEnvMap->Unbind (theCtx, theCtx->PBREnvLUTTexUnit()); +} + +// ======================================================================= +// function : clear +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::clear (const Handle(OpenGl_Context)& theCtx, + const Graphic3d_Vec3& theColor) +{ + myIsNeededToBeBound = Standard_True; + theCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, myFBO); + theCtx->core11fwd->glClearColor (theColor.r(), theColor.g(), theColor.b(), 1.f); + + processSpecIBLMap (theCtx, false); + processDiffIBLMap (theCtx, false); +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_PBREnvironment.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_PBREnvironment.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_PBREnvironment.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_PBREnvironment.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,206 @@ +// Author: Ilya Khramov +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _OpenGl_PBREnvironment_HeaderFile +#define _OpenGl_PBREnvironment_HeaderFile + +#include +#include + +//! This class contains specular and diffuse maps required for Image Base Lighting (IBL) in PBR shading model with it's generation methods. +class OpenGl_PBREnvironment : public OpenGl_NamedResource +{ + DEFINE_STANDARD_RTTIEXT(OpenGl_PBREnvironment, OpenGl_NamedResource) +public: + + //! Creates and initializes new PBR environment. It is the only way to create OpenGl_PBREnvironment. + //! @param theCtx OpenGL context where environment will be created + //! @param thePow2Size final size of texture's sides can be calculated as 2^thePow2Size; + //! if thePow2Size less than 1 it will be set to 1 + //! @param theSpecMapLevelsNum number of mipmap levels used in specular IBL map; + //! if theSpecMapLevelsNum less than 2 or less than Pow2Size + 1 it will be set to the corresponding values. + //! @param theId OpenGl_Resource name + //! @return handle to created PBR environment or NULL handle in case of fail + Standard_EXPORT static Handle(OpenGl_PBREnvironment) Create (const Handle(OpenGl_Context)& theCtx, + unsigned int thePow2Size = 9, + unsigned int theSpecMapLevelsNum = 6, + const TCollection_AsciiString& theId = "PBREnvironment"); + +public: + + //! Binds diffuse and specular IBL maps to the corresponding texture units. + Standard_EXPORT void Bind (const Handle(OpenGl_Context)& theCtx); + + //! Unbinds diffuse and specular IBL maps. + Standard_EXPORT void Unbind (const Handle(OpenGl_Context)& theCtx); + + //! Fills all mipmaps of specular IBL map and diffuse IBL map with one color. + //! So that environment illumination will be constant. + Standard_EXPORT void Clear (const Handle(OpenGl_Context)& theCtx, + const Graphic3d_Vec3& theColor = Graphic3d_Vec3 (1.f)); + + //! Generates specular and diffuse (irradiance) IBL maps. + //! @param theCtx OpenGL context + //! @param theEnvMap source environment map + //! @param theZIsInverted flags indicates whether environment cubemap has inverted Z axis or not + //! @param theIsTopDown flags indicates whether environment cubemap has top-down memory layout or not + //! @param theDiffMapNbSamples number of samples in Monte-Carlo integration for diffuse IBL spherical harmonics calculation + //! @param theSpecMapNbSamples number of samples in Monte-Carlo integration for specular IBL map generation + //! @param theProbability controls strength of samples number reducing strategy during specular IBL map baking (see 'SpecIBLMapSamplesFactor' for details) + //! theZIsInverted and theIsTopDown can be taken from Graphic3d_CubeMap source of environment cubemap. + //! theDiffMapNbSamples and theSpecMapNbSamples is the main parameter directly affected to performance. + Standard_EXPORT void Bake (const Handle(OpenGl_Context)& theCtx, + const Handle(OpenGl_Texture)& theEnvMap, + Standard_Boolean theZIsInverted = Standard_False, + Standard_Boolean theIsTopDown = Standard_True, + Standard_Size theDiffMapNbSamples = 1024, + Standard_Size theSpecMapNbSamples = 256, + Standard_ShortReal theProbability = 0.99f); + + //! Returns number of mipmap levels used in specular IBL map. + //! It can be different from value passed to creation method. + unsigned int SpecMapLevelsNumber() const { return mySpecMapLevelsNumber; } + + //! Returns size of IBL maps sides as power of 2. + //! So that the real size can be calculated as 2^Pow2Size() + unsigned int Pow2Size() const { return myPow2Size; } + + //! Checks whether the given sizes affects to the current ones. + //! It can be imagined as creation of new PBR environment. + //! If creation method with this values returns the PBR environment having real sizes which are equals to current ones + //! then this method will return false. + //! It is handful when sizes are required to be changed. + //! If this method returns false there is no reason to recreate PBR environment in order to change sizes. + Standard_EXPORT bool SizesAreDifferent (unsigned int thePow2Size, + unsigned int theSpecMapLevelsNumber) const; + + //! Indicates whether IBL map's textures have to be bound or it is not obligate. + bool IsNeededToBeBound() const + { + return myIsNeededToBeBound; + } + + //! Releases all OpenGL resources. + //! It must be called before destruction. + Standard_EXPORT virtual void Release (OpenGl_Context* theCtx) Standard_OVERRIDE; + + //! Returns estimated GPU memory usage for holding data without considering overheads and allocation alignment rules. + virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE + { + unsigned int aDiffIBLMapSidePixelsCount = 1 << myPow2Size; + aDiffIBLMapSidePixelsCount *= aDiffIBLMapSidePixelsCount; + Standard_Size anEstimatedDataSize = aDiffIBLMapSidePixelsCount; + for (unsigned int i = 0; i < mySpecMapLevelsNumber; ++i) + { + anEstimatedDataSize += aDiffIBLMapSidePixelsCount >> (2 * i); + } + anEstimatedDataSize *= 6; // cubemap sides + anEstimatedDataSize *= 3; // channels + return anEstimatedDataSize; + } + + //! Checks completeness of PBR environment. + //! Creation method returns only completed objects or null handles otherwise. + Standard_Boolean IsComplete() const { return myIsComplete; } + + //! Destructor. + //! Warning! 'Release' method must be called before destruction. + //! Otherwise unhandled critical error will be generated. + Standard_EXPORT virtual ~OpenGl_PBREnvironment(); + +private: + + //! Creates new PBR environment. + //! Parameters and logic are described in 'Create' method documentation. + Standard_EXPORT OpenGl_PBREnvironment (const Handle(OpenGl_Context)& theCtx, + unsigned int thePowOf2Size = 9, + unsigned int theSpecMapLevelsNumber = 6, + const TCollection_AsciiString& theId = "PBREnvironment"); + +private: + + //! Enum classified the type of IBL map + enum OpenGl_TypeOfIBLMap + { + OpenGl_TypeOfIBLMap_DiffuseSH, + OpenGl_TypeOfIBLMap_Specular + }; + + //! Initializes all textures. + //! @return false in case of failed texture initialization + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool initTextures (const Handle(OpenGl_Context)& theCtx); + + //! Creates frame buffer object for IBL maps generation. + //! @return false in case of failed FBO initialization + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool initFBO (const Handle(OpenGl_Context)& theCtx); + + //! Initializes vertex buffer object of screen rectangle. + //! @return false in case of failed creation + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool initVAO (const Handle(OpenGl_Context)& theCtx); + + //! Responses for diffuse (irradiance) IBL map processing. + //! @return false in case of failed baking or clearing + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool processDiffIBLMap (const Handle(OpenGl_Context)& theCtx, + Standard_Boolean theIsDrawAction, + Standard_Size theNbSamples = 0); + + //! Responses for specular IBL map processing. + //! @return false in case of failed baking or clearing + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool processSpecIBLMap (const Handle(OpenGl_Context)& theCtx, + Standard_Boolean theIsDrawAction, + Standard_Integer theEnvMapSize = 1024, + Standard_Size theNbSamples = 0, + Standard_ShortReal theProbability = 1.f); + + //! Checks completeness of frame buffer object for all targets + //! (all cube map sides and levels of IBL maps). + //! @return false in case of uncompleted frame buffer object. + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool checkFBOComplentess (const Handle(OpenGl_Context)& theCtx) const; + + //! Version of 'Bake' without OpenGl_PBREnvironmentSetnry. + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + void bake (const Handle(OpenGl_Context)& theCtx, + const Handle(OpenGl_Texture)& theEnvMap, + Standard_Boolean theZIsInverted = Standard_False, + Standard_Boolean theIsTopDown = Standard_True, + Standard_Size theDiffMapNbSamples = 1024, + Standard_Size theSpecMapNbSamples = 256, + Standard_ShortReal theProbability = 1.f); + + //! Version of 'Clear' without OpenGl_PBREnvironmentSetnry. + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + void clear (const Handle(OpenGl_Context)& theCtx, + const Graphic3d_Vec3& theColor = Graphic3d_Vec3 (1.f)); + +private: + + unsigned int myPow2Size; //!< size of IBL maps sides (real size can be calculated as 2^myPow2Size) + unsigned int mySpecMapLevelsNumber; //!< number of mipmap levels used in specular IBL map + + OpenGl_Texture myIBLMaps[2]; //!< IBL maps + OpenGl_VertexBuffer myVBO; //!< vertex buffer object of screen rectangular + GLuint myFBO; //!< frame buffer object to generate or clear IBL maps + + Standard_Boolean myIsComplete; //!< completeness of PBR environment + Standard_Boolean myIsNeededToBeBound; //!< indicates whether IBL map's textures have to be bound or it is not obligate + +}; + +#endif // _OpenGl_PBREnvironment_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_PrimitiveArray.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_PrimitiveArray.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_PrimitiveArray.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_PrimitiveArray.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -535,7 +535,7 @@ aGlContext->SetColor4fv (theWorkspace->EdgeColor().a() >= 0.1f ? theWorkspace->EdgeColor() : theWorkspace->View()->BackgroundColor()); - aGlContext->SetTypeOfLine (anAspect->Aspect()->EdgeLineType()); + aGlContext->SetLineStipple((float )anAspect->Aspect()->LineStippleFactor(), anAspect->Aspect()->LinePattern()); aGlContext->SetLineWidth (anAspect->Aspect()->EdgeWidth()); if (!myVboIndices.IsNull()) @@ -759,6 +759,117 @@ } // ======================================================================= +// function : EstimatedDataSize +// purpose : +// ======================================================================= +Standard_Size OpenGl_PrimitiveArray::EstimatedDataSize() const +{ + Standard_Size aSize = 0; + if (!myVboAttribs.IsNull()) + { + aSize += myVboAttribs->EstimatedDataSize(); + } + if (!myVboIndices.IsNull()) + { + aSize += myVboIndices->EstimatedDataSize(); + } + return aSize; +} + +// ======================================================================= +// function : UpdateDrawStats +// purpose : +// ======================================================================= +void OpenGl_PrimitiveArray::UpdateDrawStats (Graphic3d_FrameStatsDataTmp& theStats, + bool theIsDetailed) const +{ + ++theStats[Graphic3d_FrameStatsCounter_NbElemsNotCulled]; + if (myIsFillType) + { + ++theStats[Graphic3d_FrameStatsCounter_NbElemsFillNotCulled]; + } + else if (myDrawMode == GL_POINTS) + { + ++theStats[Graphic3d_FrameStatsCounter_NbElemsPointNotCulled]; + } + else + { + ++theStats[Graphic3d_FrameStatsCounter_NbElemsLineNotCulled]; + } + + if (!theIsDetailed + || myVboAttribs.IsNull() + || !myVboAttribs->IsValid()) + { + return; + } + + const Standard_Integer aNbIndices = !myVboIndices.IsNull() ? myVboIndices->GetElemsNb() : myVboAttribs->GetElemsNb(); + const Standard_Integer aNbBounds = !myBounds.IsNull() ? myBounds->NbBounds : 1; + switch (myDrawMode) + { + case GL_POINTS: + { + theStats[Graphic3d_FrameStatsCounter_NbPointsNotCulled] += aNbIndices; + break; + } + case GL_LINES: + { + theStats[Graphic3d_FrameStatsCounter_NbLinesNotCulled] += aNbIndices / 2; + break; + } + case GL_LINE_STRIP: + { + theStats[Graphic3d_FrameStatsCounter_NbLinesNotCulled] += aNbIndices - aNbBounds; + break; + } + case GL_LINES_ADJACENCY: + { + theStats[Graphic3d_FrameStatsCounter_NbLinesNotCulled] += aNbIndices / 4; + break; + } + case GL_LINE_STRIP_ADJACENCY: + { + theStats[Graphic3d_FrameStatsCounter_NbLinesNotCulled] += aNbIndices - 4 * aNbBounds; + break; + } + case GL_TRIANGLES: + { + theStats[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aNbIndices / 3; + break; + } + case GL_TRIANGLE_STRIP: + case GL_TRIANGLE_FAN: + { + theStats[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aNbIndices - 2 * aNbBounds; + break; + } + case GL_TRIANGLES_ADJACENCY: + { + theStats[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aNbIndices / 6; + break; + } + case GL_TRIANGLE_STRIP_ADJACENCY: + { + theStats[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aNbIndices - 4 * aNbBounds; + break; + } + #if !defined(GL_ES_VERSION_2_0) + case GL_QUADS: + { + theStats[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aNbIndices / 2; + break; + } + case GL_QUAD_STRIP: + { + theStats[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += (aNbIndices / 2 - aNbBounds) * 2; + break; + } + #endif + } +} + +// ======================================================================= // function : Render // purpose : // ======================================================================= @@ -769,12 +880,10 @@ return; } - const OpenGl_Aspects* anAspectFace = theWorkspace->ApplyAspects(); + const OpenGl_Aspects* anAspectFace = theWorkspace->Aspects(); const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext(); - const bool toEnableEnvMap = !aCtx->ActiveTextures().IsNull() - && aCtx->ActiveTextures() == theWorkspace->EnvironmentTexture(); - bool toDrawArray = true; + bool toDrawArray = true, toSetLinePolygMode = false; int toDrawInteriorEdges = 0; // 0 - no edges, 1 - glsl edges, 2 - polygonMode if (myIsFillType) { @@ -797,7 +906,7 @@ } else { - aCtx->SetPolygonMode (GL_LINE); + toSetLinePolygMode = true; } } } @@ -843,6 +952,10 @@ } Graphic3d_TypeOfShadingModel aShadingModel = Graphic3d_TOSM_UNLIT; + anAspectFace = theWorkspace->ApplyAspects (false); // do not bind textures before binding the program + const Handle(OpenGl_TextureSet)& aTextureSet = theWorkspace->TextureSet(); + const bool toEnableEnvMap = !aTextureSet.IsNull() + && aTextureSet == theWorkspace->EnvironmentTexture(); if (toDrawArray) { const bool hasColorAttrib = !myVboAttribs.IsNull() @@ -855,7 +968,7 @@ case GL_POINTS: { aShadingModel = aCtx->ShaderManager()->ChooseMarkerShadingModel (anAspectFace->ShadingModel(), hasVertNorm); - aCtx->ShaderManager()->BindMarkerProgram (aCtx->ActiveTextures(), + aCtx->ShaderManager()->BindMarkerProgram (aTextureSet, aShadingModel, Graphic3d_AlphaMode_Opaque, hasVertColor, anAspectFace->ShaderProgramRes (aCtx)); break; @@ -875,7 +988,7 @@ default: { aShadingModel = aCtx->ShaderManager()->ChooseFaceShadingModel (anAspectFace->ShadingModel(), hasVertNorm); - aCtx->ShaderManager()->BindFaceProgram (aCtx->ActiveTextures(), + aCtx->ShaderManager()->BindFaceProgram (aTextureSet, aShadingModel, aCtx->ShaderManager()->MaterialState().HasAlphaCutoff() ? Graphic3d_AlphaMode_Mask : Graphic3d_AlphaMode_Opaque, toDrawInteriorEdges == 1 ? anAspectFace->Aspect()->InteriorStyle() : Aspect_IS_SOLID, @@ -887,32 +1000,28 @@ { aCtx->ShaderManager()->PushInteriorState (aCtx->ActiveProgram(), anAspectFace->Aspect()); } + #if !defined (GL_ES_VERSION_2_0) + else if (toSetLinePolygMode) + { + aCtx->SetPolygonMode (GL_LINE); + } + #else + (void )toSetLinePolygMode; + #endif break; } } - #if !defined(GL_ES_VERSION_2_0) - // manage FFP lighting - if (aCtx->ActiveProgram().IsNull() - && aCtx->core11 != NULL) + // bind textures after GLSL program to set mock textures to slots used by program + aCtx->BindTextures (aTextureSet, aCtx->ActiveProgram()); + if (!aTextureSet.IsNull() + && !aTextureSet->IsEmpty() + && myDrawMode != GL_POINTS) // transformation is not supported within point sprites { - if (aShadingModel == Graphic3d_TOSM_UNLIT) + if (const Handle(OpenGl_Texture)& aFirstTexture = aTextureSet->First()) { - glDisable (GL_LIGHTING); + aCtx->SetTextureMatrix (aFirstTexture->Sampler()->Parameters(), aFirstTexture->IsTopDown()); } - else - { - glEnable (GL_LIGHTING); - } - } - #endif - - if (!aCtx->ActiveTextures().IsNull() - && !aCtx->ActiveTextures()->IsEmpty() - && !aCtx->ActiveTextures()->First().IsNull() - && myDrawMode != GL_POINTS) // transformation is not supported within point sprites - { - aCtx->SetTextureMatrix (aCtx->ActiveTextures()->First()->Sampler()->Parameters()); } aCtx->SetSampleAlphaToCoverage (aCtx->ShaderManager()->MaterialState().HasAlphaCutoff()); @@ -926,7 +1035,7 @@ if (myDrawMode == GL_LINES || myDrawMode == GL_LINE_STRIP) { - aCtx->SetTypeOfLine (anAspectFace->Aspect()->LineType()); + aCtx->SetLineStipple((float )anAspectFace->Aspect()->LineStippleFactor(), anAspectFace->Aspect()->LinePattern()); aCtx->SetLineWidth (anAspectFace->Aspect()->LineWidth()); } @@ -1115,3 +1224,26 @@ setDrawMode (theType); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_PrimitiveArray::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_PrimitiveArray) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, OpenGl_Element) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myVboIndices.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myVboAttribs.get()) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myIndices.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAttribs.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myBounds.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawMode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsFillType) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsVboInit) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUID) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_PrimitiveArray.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_PrimitiveArray.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_PrimitiveArray.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_PrimitiveArray.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,6 +58,13 @@ //! Release OpenGL resources (VBOs) Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE; + //! Returns estimated GPU memory usage for holding data without considering overheads and allocation alignment rules. + Standard_EXPORT virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE; + + //! Increment draw calls statistics. + Standard_EXPORT virtual void UpdateDrawStats (Graphic3d_FrameStatsDataTmp& theStats, + bool theIsDetailed) const Standard_OVERRIDE; + //! Return true if VBOs initialization has been performed. //! VBO initialization is performed during first Render() call. //! Notice that this flag does not indicate VBOs validity. @@ -99,6 +106,9 @@ //! Returns attributes VBO. const Handle(OpenGl_VertexBuffer)& AttributesVbo() const { return myVboAttribs; } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: //! VBO initialization procedures diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Resource.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Resource.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Resource.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Resource.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,6 +48,10 @@ //! Returns estimated GPU memory usage for holding data without considering overheads and allocation alignment rules. virtual Standard_Size EstimatedDataSize() const = 0; + //! Dumps the content of me into the stream + virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const + { (void)theOStream; (void)theDepth; }; + private: //! Copy should be performed only within Handles! diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Sampler.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Sampler.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Sampler.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Sampler.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -105,7 +105,7 @@ } else if (!myIsImmutable) { - applySamplerParams (theCtx, myParams, this, theTexture.GetTarget(), theTexture.HasMipmaps()); + applySamplerParams (theCtx, myParams, this, theTexture.GetTarget(), theTexture.MaxMipmapLevel()); return Standard_True; } Release (theCtx.get()); @@ -116,7 +116,7 @@ return Standard_False; } - applySamplerParams (theCtx, myParams, this, theTexture.GetTarget(), theTexture.HasMipmaps()); + applySamplerParams (theCtx, myParams, this, theTexture.GetTarget(), theTexture.MaxMipmapLevel()); return Standard_True; } @@ -187,7 +187,7 @@ const Handle(Graphic3d_TextureParams)& theParams, OpenGl_Sampler* theSampler, const GLenum theTarget, - const bool theHasMipMaps) + const Standard_Integer theMaxMipLevels) { if (theSampler != NULL && theSampler->Parameters() == theParams) { @@ -197,7 +197,7 @@ // setup texture filtering const GLenum aFilter = (theParams->Filter() == Graphic3d_TOTF_NEAREST) ? GL_NEAREST : GL_LINEAR; GLenum aFilterMin = aFilter; - if (theHasMipMaps) + if (theMaxMipLevels > 0) { aFilterMin = GL_NEAREST_MIPMAP_NEAREST; if (theParams->Filter() == Graphic3d_TOTF_BILINEAR) @@ -223,9 +223,13 @@ } #endif setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_WRAP_T, aWrapMode); - if (theTarget == GL_TEXTURE_3D) + if (theTarget == GL_TEXTURE_3D + || theTarget == GL_TEXTURE_CUBE_MAP) { - setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_WRAP_R, aWrapMode); + if (theCtx->HasTextureBaseLevel()) + { + setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_WRAP_R, aWrapMode); + } return; } @@ -261,6 +265,14 @@ setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, aDegree); } + + if (theCtx->HasTextureBaseLevel() + && (theSampler == NULL || !theSampler->isValidSampler())) + { + const Standard_Integer aMaxLevel = Min (theMaxMipLevels, theParams->MaxLevel()); + setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_BASE_LEVEL, theParams->BaseLevel()); + setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_MAX_LEVEL, aMaxLevel); + } } // ======================================================================= @@ -418,7 +430,8 @@ { theCtx->core11fwd->glDisable (GL_TEXTURE_GEN_S); theCtx->core11fwd->glDisable (GL_TEXTURE_GEN_T); - if (theParams->GenMode() == Graphic3d_TOTM_SPRITE) + if (theParams->GenMode() == Graphic3d_TOTM_SPRITE + && theCtx->core20fwd != NULL) { theCtx->core11fwd->glDisable (GL_POINT_SPRITE); } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Sampler.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Sampler.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Sampler.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Sampler.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -129,13 +129,17 @@ GLint theValue); //! Apply sampler parameters. - //! If Sampler Object is not NULL and valid resource, the parameters will be set to it (and it is not required Sampler Object being bound). - //! Otherwise, parameters will be applied to currently bound Texture object. + //! @param theCtx [in] active OpenGL context + //! @param theParams [in] texture parameters to apply + //! @param theSampler [in] apply parameters to Texture object (NULL) + //! or to specified Sampler object (non-NULL, sampler is not required to be bound) + //! @param theTarget [in] OpenGL texture target + //! @param theMaxMipLevel [in] maximum mipmap level defined within the texture Standard_EXPORT static void applySamplerParams (const Handle(OpenGl_Context)& theCtx, const Handle(Graphic3d_TextureParams)& theParams, OpenGl_Sampler* theSampler, const GLenum theTarget, - const bool theHasMipMaps); + const Standard_Integer theMaxMipLevel); //! Apply global texture state for deprecated OpenGL functionality. Standard_EXPORT static void applyGlobalTextureParams (const Handle(OpenGl_Context)& theCtx, diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_SceneGeometry.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_SceneGeometry.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_SceneGeometry.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_SceneGeometry.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,13 +33,13 @@ namespace OpenGl_Raytrace { //! Checks to see if the group contains ray-trace geometry. - Standard_Boolean IsRaytracedGroup (const OpenGl_Group* theGroup); + Standard_EXPORT Standard_Boolean IsRaytracedGroup (const OpenGl_Group* theGroup); //! Checks to see if the element contains ray-trace geometry. - Standard_Boolean IsRaytracedElement (const OpenGl_ElementNode* theNode); + Standard_EXPORT Standard_Boolean IsRaytracedElement (const OpenGl_ElementNode* theNode); //! Checks to see if the element contains ray-trace geometry. - Standard_Boolean IsRaytracedElement (const OpenGl_Element* theElement); + Standard_EXPORT Standard_Boolean IsRaytracedElement (const OpenGl_Element* theElement); } //! Stores properties of surface material. @@ -70,7 +70,7 @@ public: //! Empty constructor. - OpenGl_RaytraceMaterial(); + Standard_EXPORT OpenGl_RaytraceMaterial(); //! Returns packed (serialized) representation of material. const Standard_ShortReal* Packed() @@ -92,8 +92,8 @@ OpenGl_RaytraceLight() { } //! Creates new light source. - OpenGl_RaytraceLight (const BVH_Vec4f& theEmission, - const BVH_Vec4f& thePosition); + Standard_EXPORT OpenGl_RaytraceLight (const BVH_Vec4f& theEmission, + const BVH_Vec4f& thePosition); //! Returns packed (serialized) representation of light source. const Standard_ShortReal* Packed() @@ -118,8 +118,8 @@ public: //! Creates new OpenGL element triangulation. - OpenGl_TriangleSet (const Standard_Size theArrayID, - const opencascade::handle >& theBuilder); + Standard_EXPORT OpenGl_TriangleSet (const Standard_Size theArrayID, + const opencascade::handle >& theBuilder); //! Returns ID of associated primitive array. Standard_Size AssociatedPArrayID() const @@ -154,10 +154,10 @@ using BVH_Triangulation::Box; //! Returns centroid position along the given axis. - virtual Standard_ShortReal Center (const Standard_Integer theIndex, const Standard_Integer theAxis) const Standard_OVERRIDE; + Standard_EXPORT virtual Standard_ShortReal Center (const Standard_Integer theIndex, const Standard_Integer theAxis) const Standard_OVERRIDE; //! Returns quad BVH (QBVH) tree produced from binary BVH. - const QuadBvhHandle& QuadBVH(); + Standard_EXPORT const QuadBvhHandle& QuadBVH(); public: @@ -228,35 +228,35 @@ } //! Clears ray-tracing geometry. - virtual void Clear() Standard_OVERRIDE; + Standard_EXPORT virtual void Clear() Standard_OVERRIDE; public: //! @name methods related to acceleration structure //! Performs post-processing of high-level scene BVH. - Standard_Boolean ProcessAcceleration(); + Standard_EXPORT Standard_Boolean ProcessAcceleration(); //! Returns offset of bottom-level BVH for given leaf node. //! If the node index is not valid the function returns -1. //! @note Can be used after processing acceleration structure. - Standard_Integer AccelerationOffset (Standard_Integer theNodeIdx); + Standard_EXPORT Standard_Integer AccelerationOffset (Standard_Integer theNodeIdx); //! Returns offset of triangulation vertices for given leaf node. //! If the node index is not valid the function returns -1. //! @note Can be used after processing acceleration structure. - Standard_Integer VerticesOffset (Standard_Integer theNodeIdx); + Standard_EXPORT Standard_Integer VerticesOffset (Standard_Integer theNodeIdx); //! Returns offset of triangulation elements for given leaf node. //! If the node index is not valid the function returns -1. //! @note Can be used after processing acceleration structure. - Standard_Integer ElementsOffset (Standard_Integer theNodeIdx); + Standard_EXPORT Standard_Integer ElementsOffset (Standard_Integer theNodeIdx); //! Returns triangulation data for given leaf node. //! If the node index is not valid the function returns NULL. //! @note Can be used after processing acceleration structure. - OpenGl_TriangleSet* TriangleSet (Standard_Integer theNodeIdx); + Standard_EXPORT OpenGl_TriangleSet* TriangleSet (Standard_Integer theNodeIdx); //! Returns quad BVH (QBVH) tree produced from binary BVH. - const QuadBvhHandle& QuadBVH(); + Standard_EXPORT const QuadBvhHandle& QuadBVH(); public: //! @name methods related to texture management @@ -267,16 +267,16 @@ } //! Adds new OpenGL texture to the scene and returns its index. - Standard_Integer AddTexture (const Handle(OpenGl_Texture)& theTexture); + Standard_EXPORT Standard_Integer AddTexture (const Handle(OpenGl_Texture)& theTexture); //! Updates unique 64-bit texture handles to use in shaders. - Standard_Boolean UpdateTextureHandles (const Handle(OpenGl_Context)& theContext); + Standard_EXPORT Standard_Boolean UpdateTextureHandles (const Handle(OpenGl_Context)& theContext); //! Makes the OpenGL texture handles resident (must be called before using). - Standard_Boolean AcquireTextures (const Handle(OpenGl_Context)& theContext); + Standard_EXPORT Standard_Boolean AcquireTextures (const Handle(OpenGl_Context)& theContext); //! Makes the OpenGL texture handles non-resident (must be called after using). - Standard_Boolean ReleaseTextures (const Handle(OpenGl_Context)& theContext) const; + Standard_EXPORT Standard_Boolean ReleaseTextures (const Handle(OpenGl_Context)& theContext) const; //! Returns array of texture handles. const std::vector& TextureHandles() const diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_SetOfShaderPrograms.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_SetOfShaderPrograms.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_SetOfShaderPrograms.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_SetOfShaderPrograms.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,11 +24,12 @@ enum OpenGl_ProgramOptions { OpenGl_PO_VertColor = 0x0001, //!< per-vertex color - OpenGl_PO_TextureRGB = 0x0002, //!< handle RGB texturing - OpenGl_PO_PointSimple = 0x0004, //!< point marker without sprite - OpenGl_PO_PointSprite = 0x0008, //!< point sprite with RGB image + OpenGl_PO_TextureRGB = 0x0002, //!< handle RGB texturing + OpenGl_PO_TextureEnv = 0x0004, //!< handle environment map (obsolete, to be removed) + OpenGl_PO_TextureNormal = OpenGl_PO_TextureRGB|OpenGl_PO_TextureEnv, //!< extended texture set (with normal map) + OpenGl_PO_PointSimple = 0x0008, //!< point marker without sprite + OpenGl_PO_PointSprite = 0x0010, //!< point sprite with RGB image OpenGl_PO_PointSpriteA = OpenGl_PO_PointSimple|OpenGl_PO_PointSprite, //!< point sprite with Alpha image - OpenGl_PO_TextureEnv = 0x0010, //!< handle environment map OpenGl_PO_StippleLine = 0x0020, //!< stipple line OpenGl_PO_ClipPlanes1 = 0x0040, //!< handle 1 clipping plane OpenGl_PO_ClipPlanes2 = 0x0080, //!< handle 2 clipping planes @@ -40,7 +41,7 @@ // OpenGl_PO_NB = 0x1000, //!< overall number of combinations OpenGl_PO_IsPoint = OpenGl_PO_PointSimple|OpenGl_PO_PointSprite|OpenGl_PO_PointSpriteA, - OpenGl_PO_HasTextures = OpenGl_PO_TextureRGB, + OpenGl_PO_HasTextures = OpenGl_PO_TextureRGB|OpenGl_PO_TextureEnv, OpenGl_PO_NeedsGeomShader = OpenGl_PO_MeshEdges, }; diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderManager.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderManager.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderManager.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderManager.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,14 +19,24 @@ #include #include #include +#include #include #include #include #include #include - #include +#include "../Shaders/Shaders_PBRDistribution_glsl.pxx" +#include "../Shaders/Shaders_PBRGeometry_glsl.pxx" +#include "../Shaders/Shaders_PBRFresnel_glsl.pxx" +#include "../Shaders/Shaders_PBRCookTorrance_glsl.pxx" +#include "../Shaders/Shaders_PBRIllumination_glsl.pxx" +#include "../Shaders/Shaders_PBREnvBaking_fs.pxx" +#include "../Shaders/Shaders_PBREnvBaking_vs.pxx" +#include "../Shaders/Shaders_PointLightAttenuation_glsl.pxx" +#include "../Shaders/Shaders_TangentSpaceNormal_glsl.pxx" + IMPLEMENT_STANDARD_RTTIEXT(OpenGl_ShaderManager,Standard_Transient) namespace @@ -48,17 +58,16 @@ const char THE_VARY_TexCoord_Trsf[] = EOL" float aRotSin = occTextureTrsf_RotationSin();" EOL" float aRotCos = occTextureTrsf_RotationCos();" - EOL" vec2 aTex2 = (occTexCoord.xy + occTextureTrsf_Translation()) * occTextureTrsf_Scale();" - EOL" vec2 aCopy = aTex2;" - EOL" aTex2.x = aCopy.x * aRotCos - aCopy.y * aRotSin;" - EOL" aTex2.y = aCopy.x * aRotSin + aCopy.y * aRotCos;" + EOL" vec2 aTex2 = vec2 (occTexCoord.x * aRotCos - occTexCoord.y * aRotSin," + EOL" occTexCoord.x * aRotSin + occTexCoord.y * aRotCos);" + EOL" aTex2 = (aTex2 + occTextureTrsf_Translation()) * occTextureTrsf_Scale();" EOL" TexCoord = vec4(aTex2, occTexCoord.zw);"; //! Auxiliary function to flip gl_PointCoord vertically #define THE_VEC2_glPointCoord "vec2 (gl_PointCoord.x, 1.0 - gl_PointCoord.y)" -//! Auxiliary function to transform normal -const char THE_FUNC_transformNormal[] = +//! Auxiliary function to transform normal from model to view coordinate system. +const char THE_FUNC_transformNormal_view[] = EOL"vec3 transformNormal (in vec3 theNormal)" EOL"{" EOL" vec4 aResult = occWorldViewMatrixInverseTranspose" @@ -67,12 +76,32 @@ EOL" return normalize (aResult.xyz);" EOL"}"; +//! The same function as THE_FUNC_transformNormal but is used in PBR pipeline. +//! The normals are expected to be in world coordinate system in PBR pipeline. +const char THE_FUNC_transformNormal_world[] = + EOL"vec3 transformNormal (in vec3 theNormal)" + EOL"{" + EOL" vec4 aResult = occModelWorldMatrixInverseTranspose" + EOL" * vec4 (theNormal, 0.0);" + EOL" return normalize (aResult.xyz);" + EOL"}"; + //! Global shader variable for color definition with lighting enabled. const char THE_FUNC_lightDef[] = EOL"vec3 Ambient;" //!< Ambient contribution of light sources EOL"vec3 Diffuse;" //!< Diffuse contribution of light sources EOL"vec3 Specular;"; //!< Specular contribution of light sources +//! Global shader variable for color definition with lighting enabled. +const char THE_FUNC_PBR_lightDef[] = + EOL"vec3 DirectLighting;" //!< Accumulator of direct lighting from light sources + EOL"vec4 BaseColor;" //!< Base color (albedo) of material for PBR + EOL"float Metallic;" //!< Metallic coefficient of material + EOL"float NormalizedRoughness;" //!< Normalized roughness coefficient of material + EOL"float Roughness;" //!< Roughness coefficient of material + EOL"vec3 Emission;" //!< Light intensity emitted by material + EOL"float IOR;"; //!< Material's index of refraction + //! Function computes contribution of isotropic point light source const char THE_FUNC_pointLight[] = EOL"void pointLight (in int theId," @@ -81,18 +110,18 @@ EOL" in vec3 thePoint," EOL" in bool theIsFront)" EOL"{" - EOL" vec3 aLight = occLight_Position (theId).xyz;" - EOL" if (occLight_IsHeadlight (theId) == 0)" + EOL" vec3 aLight = occLight_Position (theId);" + EOL" if (!occLight_IsHeadlight (theId))" EOL" {" EOL" aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 1.0));" EOL" }" EOL" aLight -= thePoint;" EOL EOL" float aDist = length (aLight);" - EOL" aLight = aLight * (1.0 / aDist);" - EOL - EOL" float anAtten = 1.0 / (occLight_ConstAttenuation (theId)" - EOL" + occLight_LinearAttenuation (theId) * aDist);" + EOL" float aRange = occLight_Range (theId);" + EOL" float anAtten = occPointLightAttenuation (aDist, aRange, occLight_LinearAttenuation (theId), occLight_ConstAttenuation (theId));" + EOL" if (anAtten <= 0.0) return;" + EOL" aLight /= aDist;" EOL EOL" vec3 aHalf = normalize (aLight + theView);" EOL @@ -106,8 +135,36 @@ EOL" aSpecl = pow (aNdotH, theIsFront ? occFrontMaterial_Shininess() : occBackMaterial_Shininess());" EOL" }" EOL - EOL" Diffuse += occLight_Diffuse (theId).rgb * aNdotL * anAtten;" - EOL" Specular += occLight_Specular (theId).rgb * aSpecl * anAtten;" + EOL" Diffuse += occLight_Diffuse (theId) * aNdotL * anAtten;" + EOL" Specular += occLight_Specular(theId) * aSpecl * anAtten;" + EOL"}"; + +//! Function computes contribution of isotropic point light source +const char THE_FUNC_PBR_pointLight[] = + EOL"void pointLight (in int theId," + EOL" in vec3 theNormal," + EOL" in vec3 theView," + EOL" in vec3 thePoint," + EOL" in bool theIsFront)" + EOL"{" + EOL" vec3 aLight = occLight_Position (theId);" + EOL" if (occLight_IsHeadlight (theId))" + EOL" {" + EOL" aLight = vec3 (occWorldViewMatrixInverse * vec4 (aLight, 1.0));" + EOL" }" + EOL" aLight -= thePoint;" + EOL + EOL" float aDist = length (aLight);" + EOL" float aRange = occLight_Range (theId);" + EOL" float anAtten = occPointLightAttenuation (aDist, aRange);" + EOL" if (anAtten <= 0.0) return;" + EOL" aLight /= aDist;" + EOL + EOL" theNormal = theIsFront ? theNormal : -theNormal;" + EOL" DirectLighting += occPBRIllumination (theView, aLight, theNormal," + EOL" BaseColor, Metallic, Roughness, IOR," + EOL" occLight_Specular (theId)," + EOL" occLight_Intensity(theId) * anAtten);" EOL"}"; //! Function computes contribution of spotlight source @@ -118,9 +175,9 @@ EOL" in vec3 thePoint," EOL" in bool theIsFront)" EOL"{" - EOL" vec3 aLight = occLight_Position (theId).xyz;" - EOL" vec3 aSpotDir = occLight_SpotDirection (theId).xyz;" - EOL" if (occLight_IsHeadlight (theId) == 0)" + EOL" vec3 aLight = occLight_Position (theId);" + EOL" vec3 aSpotDir = occLight_SpotDirection (theId);" + EOL" if (!occLight_IsHeadlight (theId))" EOL" {" EOL" aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 1.0));" EOL" aSpotDir = vec3 (occWorldViewMatrix * vec4 (aSpotDir, 0.0));" @@ -128,7 +185,10 @@ EOL" aLight -= thePoint;" EOL EOL" float aDist = length (aLight);" - EOL" aLight = aLight * (1.0 / aDist);" + EOL" float aRange = occLight_Range (theId);" + EOL" float anAtten = occPointLightAttenuation (aDist, aRange, occLight_LinearAttenuation (theId), occLight_ConstAttenuation (theId));" + EOL" if (anAtten <= 0.0) return;" + EOL" aLight /= aDist;" EOL EOL" aSpotDir = normalize (aSpotDir);" // light cone @@ -139,8 +199,6 @@ EOL" }" EOL EOL" float anExponent = occLight_SpotExponent (theId);" - EOL" float anAtten = 1.0 / (occLight_ConstAttenuation (theId)" - EOL" + occLight_LinearAttenuation (theId) * aDist);" EOL" if (anExponent > 0.0)" EOL" {" EOL" anAtten *= pow (aCosA, anExponent * 128.0);" @@ -158,8 +216,55 @@ EOL" aSpecl = pow (aNdotH, theIsFront ? occFrontMaterial_Shininess() : occBackMaterial_Shininess());" EOL" }" EOL - EOL" Diffuse += occLight_Diffuse (theId).rgb * aNdotL * anAtten;" - EOL" Specular += occLight_Specular (theId).rgb * aSpecl * anAtten;" + EOL" Diffuse += occLight_Diffuse (theId) * aNdotL * anAtten;" + EOL" Specular += occLight_Specular(theId) * aSpecl * anAtten;" + EOL"}"; + +//! Function computes contribution of spotlight source + const char THE_FUNC_PBR_spotLight[] = + EOL"void spotLight (in int theId," + EOL" in vec3 theNormal," + EOL" in vec3 theView," + EOL" in vec3 thePoint," + EOL" in bool theIsFront)" + EOL"{" + EOL" vec3 aLight = occLight_Position (theId);" + EOL" vec3 aSpotDir = occLight_SpotDirection (theId);" + EOL" if (occLight_IsHeadlight (theId))" + EOL" {" + EOL" aLight = vec3 (occWorldViewMatrixInverse * vec4 (aLight, 1.0));" + EOL" aSpotDir = vec3 (occWorldViewMatrixInverse * vec4 (aSpotDir, 0.0));" + EOL" }" + EOL" aLight -= thePoint;" + EOL + EOL" float aDist = length (aLight);" + EOL" float aRange = occLight_Range (theId);" + EOL" float anAtten = occPointLightAttenuation (aDist, aRange);" + EOL" if (anAtten <= 0.0) return;" + EOL" aLight /= aDist;" + EOL + EOL" aSpotDir = normalize (aSpotDir);" + // light cone + EOL" float aCosA = dot (aSpotDir, -aLight);" + EOL" float aRelativeAngle = 2.0 * acos(aCosA) / occLight_SpotCutOff(theId);" + EOL" if (aCosA >= 1.0 || aRelativeAngle > 1.0)" + EOL" {" + EOL" return;" + EOL" }" + EOL" float anExponent = occLight_SpotExponent (theId);" + EOL" if ((1.0 - aRelativeAngle) <= anExponent)" + EOL" {" + EOL" float anAngularAttenuationOffset = cos(0.5 * occLight_SpotCutOff(theId));" + EOL" float anAngularAttenuationScale = 1.0 / max(0.001, cos(0.5 * occLight_SpotCutOff(theId) * (1.0 - anExponent)) - anAngularAttenuationOffset);" + EOL" anAngularAttenuationOffset *= -anAngularAttenuationScale;" + EOL" float anAngularAttenuantion = clamp(aCosA * anAngularAttenuationScale + anAngularAttenuationOffset, 0.0, 1.0);" + EOL" anAtten *= anAngularAttenuantion * anAngularAttenuantion;" + EOL" }" + EOL" theNormal = theIsFront ? theNormal : -theNormal;" + EOL" DirectLighting += occPBRIllumination (theView, aLight, theNormal," + EOL" BaseColor, Metallic, Roughness, IOR," + EOL" occLight_Specular(theId)," + EOL" occLight_Intensity(theId) * anAtten);" EOL"}"; //! Function computes contribution of directional light source @@ -169,8 +274,8 @@ EOL" in vec3 theView," EOL" in bool theIsFront)" EOL"{" - EOL" vec3 aLight = normalize (occLight_Position (theId).xyz);" - EOL" if (occLight_IsHeadlight (theId) == 0)" + EOL" vec3 aLight = normalize (occLight_Position (theId));" + EOL" if (!occLight_IsHeadlight (theId))" EOL" {" EOL" aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 0.0));" EOL" }" @@ -187,8 +292,28 @@ EOL" aSpecl = pow (aNdotH, theIsFront ? occFrontMaterial_Shininess() : occBackMaterial_Shininess());" EOL" }" EOL - EOL" Diffuse += occLight_Diffuse (theId).rgb * aNdotL;" - EOL" Specular += occLight_Specular (theId).rgb * aSpecl;" + EOL" Diffuse += occLight_Diffuse (theId) * aNdotL;" + EOL" Specular += occLight_Specular (theId) * aSpecl;" + EOL"}"; + +//! Function computes contribution of directional light source +const char THE_FUNC_PBR_directionalLight[] = + EOL"void directionalLight (in int theId," + EOL" in vec3 theNormal," + EOL" in vec3 theView," + EOL" in bool theIsFront)" + EOL"{" + EOL" vec3 aLight = normalize (occLight_Position (theId));" + EOL" if (occLight_IsHeadlight (theId))" + EOL" {" + EOL" aLight = vec3 (occWorldViewMatrixInverse * vec4 (aLight, 0.0));" + EOL" }" + EOL + EOL" theNormal = theIsFront ? theNormal : -theNormal;" + EOL" DirectLighting += occPBRIllumination (theView, aLight, theNormal," + EOL" BaseColor, Metallic, Roughness, IOR," + EOL" occLight_Specular (theId)," + EOL" occLight_Intensity(theId));" EOL"}"; //! The same as THE_FUNC_directionalLight but for the light with zero index @@ -198,8 +323,8 @@ EOL" in vec3 theView," EOL" in bool theIsFront)" EOL"{" - EOL" vec3 aLight = normalize (occLightSources[1].xyz);" - EOL" if (occLight_IsHeadlight (0) == 0)" + EOL" vec3 aLight = normalize (occLight_Position(0));" + EOL" if (!occLight_IsHeadlight (0))" EOL" {" EOL" aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 0.0));" EOL" }" @@ -216,8 +341,20 @@ EOL" aSpecl = pow (aNdotH, theIsFront ? occFrontMaterial_Shininess() : occBackMaterial_Shininess());" EOL" }" EOL - EOL" Diffuse += occLightSources[0].rgb * aNdotL;" - EOL" Specular += occLightSources[0].rgb * aSpecl;" + EOL" Diffuse += occLight_Diffuse(0) * aNdotL;" + EOL" Specular += occLight_Specular(0) * aSpecl;" + EOL"}"; + +//! Returns the real cubemap fetching direction considering sides orientation, memory layout and vertical flip. +const char THE_FUNC_cubemap_vector_transform[] = + EOL"vec3 cubemapVectorTransform (in vec3 theVector," + EOL" in int theYCoeff," + EOL" in int theZCoeff)" + EOL"{" + EOL" theVector = theVector.yzx;" + EOL" theVector.y *= float(theYCoeff);" + EOL" theVector.z *= float(theZCoeff);" + EOL" return theVector;" EOL"}"; //! Process clipping planes in Fragment Shader. @@ -331,7 +468,7 @@ case Graphic3d_TOLS_DIRECTIONAL: { // if the last parameter of GL_POSITION, is zero, the corresponding light source is a Directional one - const OpenGl_Vec4 anInfDir = -theLight.PackedDirection(); + const OpenGl_Vec4 anInfDir = -theLight.PackedDirectionRange(); // to create a realistic effect, set the GL_SPECULAR parameter to the same value as the GL_DIFFUSE. theCtx->core11->glLightfv (theLightGlId, GL_AMBIENT, THE_DEFAULT_AMBIENT); @@ -356,7 +493,7 @@ theCtx->core11->glLightf (theLightGlId, GL_SPOT_CUTOFF, THE_DEFAULT_SPOT_CUTOFF); theCtx->core11->glLightf (theLightGlId, GL_CONSTANT_ATTENUATION, theLight.ConstAttenuation()); theCtx->core11->glLightf (theLightGlId, GL_LINEAR_ATTENUATION, theLight.LinearAttenuation()); - theCtx->core11->glLightf (theLightGlId, GL_QUADRATIC_ATTENUATION, 0.0); + theCtx->core11->glLightf (theLightGlId, GL_QUADRATIC_ATTENUATION, 0.0f); break; } case Graphic3d_TOLS_SPOT: @@ -366,7 +503,7 @@ theCtx->core11->glLightfv (theLightGlId, GL_DIFFUSE, aLightColor.GetData()); theCtx->core11->glLightfv (theLightGlId, GL_SPECULAR, aLightColor.GetData()); theCtx->core11->glLightfv (theLightGlId, GL_POSITION, aPosition.GetData()); - theCtx->core11->glLightfv (theLightGlId, GL_SPOT_DIRECTION, theLight.PackedDirection().GetData()); + theCtx->core11->glLightfv (theLightGlId, GL_SPOT_DIRECTION, theLight.PackedDirectionRange().GetData()); theCtx->core11->glLightf (theLightGlId, GL_SPOT_EXPONENT, theLight.Concentration() * 128.0f); theCtx->core11->glLightf (theLightGlId, GL_SPOT_CUTOFF, (theLight.Angle() * 180.0f) / GLfloat(M_PI)); theCtx->core11->glLightf (theLightGlId, GL_CONSTANT_ATTENUATION, theLight.ConstAttenuation()); @@ -408,6 +545,7 @@ myShadingModel (Graphic3d_TOSM_VERTEX), myUnlitPrograms (new OpenGl_SetOfPrograms()), myContext (theContext), + mySRgbState (theContext->ToRenderSRGB()), myHasLocalOrigin (Standard_False), myLastView (NULL) { @@ -421,6 +559,10 @@ OpenGl_ShaderManager::~OpenGl_ShaderManager() { myProgramList.Clear(); + if (!myPBREnvironment.IsNull()) + { + myPBREnvironment->Release (myContext); + } } // ======================================================================= @@ -435,7 +577,8 @@ myOutlinePrograms.Nullify(); myMapOfLightPrograms.Clear(); myFontProgram.Nullify(); - myBlitProgram.Nullify(); + myBlitPrograms[0].Init (Handle(OpenGl_ShaderProgram)()); + myBlitPrograms[1].Init (Handle(OpenGl_ShaderProgram)()); myBoundBoxProgram.Nullify(); myBoundBoxVertBuffer.Nullify(); for (Standard_Integer aModeIter = 0; aModeIter < Graphic3d_StereoMode_NB; ++aModeIter) @@ -563,12 +706,31 @@ } // ======================================================================= +// function : UpdateSRgbState +// purpose : +// ======================================================================= +void OpenGl_ShaderManager::UpdateSRgbState() +{ + if (mySRgbState == myContext->ToRenderSRGB()) + { + return; + } + + mySRgbState = myContext->ToRenderSRGB(); + + // special cases - GLSL programs dealing with sRGB/linearRGB internally + myStereoPrograms[Graphic3d_StereoMode_Anaglyph].Nullify(); +} + +// ======================================================================= // function : UpdateLightSourceStateTo // purpose : Updates state of OCCT light sources // ======================================================================= -void OpenGl_ShaderManager::UpdateLightSourceStateTo (const Handle(Graphic3d_LightSet)& theLights) +void OpenGl_ShaderManager::UpdateLightSourceStateTo (const Handle(Graphic3d_LightSet)& theLights, + Standard_Integer theSpecIBLMapLevels) { myLightSourceState.Set (theLights); + myLightSourceState.SetSpecIBLMapLevels (theSpecIBLMapLevels); myLightSourceState.Update(); switchLightPrograms(); } @@ -698,7 +860,7 @@ } for (Standard_Integer aLightIt = 0; aLightIt < aNbLightsMax; ++aLightIt) { - myLightTypeArray.ChangeValue (aLightIt).Type = -1; + myLightTypeArray.SetValue (aLightIt, -1); } if (myLightSourceState.LightSources().IsNull() @@ -712,8 +874,8 @@ OpenGl_Vec4 (0.0f, 0.0f, 0.0f, 0.0f)); theProgram->SetUniform (myContext, theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_TYPES), - aNbLightsMax * OpenGl_ShaderLightType::NbOfVec2i(), - myLightTypeArray.First().Packed()); + aNbLightsMax, + &myLightTypeArray.First()); return; } @@ -732,43 +894,47 @@ continue; } - OpenGl_ShaderLightType& aLightType = myLightTypeArray.ChangeValue (aLightsNb); + Standard_Integer& aLightType = myLightTypeArray .ChangeValue (aLightsNb); OpenGl_ShaderLightParameters& aLightParams = myLightParamsArray.ChangeValue (aLightsNb); if (!aLight.IsEnabled()) // has no affect with Graphic3d_LightSet::IterationFilter_ExcludeDisabled - here just for consistency { // if it is desired to keep disabled light in the same order - we can replace it with a black light so that it will have no influence on result - aLightType.Type = -1; // Graphic3d_TOLS_AMBIENT can be used instead - aLightType.IsHeadlight = false; - aLightParams.Color = OpenGl_Vec4 (0.0f, 0.0f, 0.0f, 0.0f); + aLightType = -1; // Graphic3d_TOLS_AMBIENT can be used instead + aLightParams.Color = OpenGl_Vec4 (0.0f, 0.0f, 0.0f, 0.0f); ++aLightsNb; continue; } - aLightType.Type = aLight.Type(); - aLightType.IsHeadlight = aLight.IsHeadlight(); + // ignoring OpenGl_Context::ToRenderSRGB() for light colors, + // as non-absolute colors for lights are rare and require tuning anyway + aLightType = aLight.Type(); aLightParams.Color = aLight.PackedColor(); + aLightParams.Color.a() = aLight.Intensity(); // used by PBR and ignored by old shading model if (aLight.Type() == Graphic3d_TOLS_DIRECTIONAL) { - aLightParams.Position = -aLight.PackedDirection(); + aLightParams.Position = -aLight.PackedDirectionRange(); } else if (!aLight.IsHeadlight()) { aLightParams.Position.x() = static_cast(aLight.Position().X() - myLocalOrigin.X()); aLightParams.Position.y() = static_cast(aLight.Position().Y() - myLocalOrigin.Y()); aLightParams.Position.z() = static_cast(aLight.Position().Z() - myLocalOrigin.Z()); - aLightParams.Position.w() = 1.0f; } else { aLightParams.Position.x() = static_cast(aLight.Position().X()); aLightParams.Position.y() = static_cast(aLight.Position().Y()); aLightParams.Position.z() = static_cast(aLight.Position().Z()); - aLightParams.Position.w() = 1.0f; } + aLightParams.Position.w() = aLight.IsHeadlight() ? 1.0f : 0.0f; if (aLight.Type() == Graphic3d_TOLS_SPOT) { - aLightParams.Direction = aLight.PackedDirection(); + aLightParams.Direction = aLight.PackedDirectionRange(); + } + if (aLight.Type() == Graphic3d_TOLS_POSITIONAL) + { + aLightParams.Direction.w() = aLight.Range(); } aLightParams.Parameters = aLight.PackedParams(); ++aLightsNb; @@ -783,8 +949,8 @@ anAmbient); theProgram->SetUniform (myContext, theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_TYPES), - aNbLightsMax * OpenGl_ShaderLightType::NbOfVec2i(), - myLightTypeArray.First().Packed()); + aNbLightsMax, + &myLightTypeArray.First()); if (aLightsNb > 0) { theProgram->SetUniform (myContext, @@ -792,6 +958,11 @@ aLightsNb * OpenGl_ShaderLightParameters::NbOfVec4(), myLightParamsArray.First().Packed()); } + + if (const OpenGl_ShaderUniformLocation aLocation = theProgram->GetStateLocation (OpenGl_OCCT_NB_SPEC_IBL_LEVELS)) + { + theProgram->SetUniform (myContext, aLocation, myLightSourceState.SpecIBLMapLevels()); + } } // ======================================================================= @@ -1143,18 +1314,18 @@ } const GLenum aFrontFace = myMaterialState.ToDistinguish() ? GL_FRONT : GL_FRONT_AND_BACK; - myContext->core11->glMaterialfv(aFrontFace, GL_AMBIENT, aFrontMat.Ambient.GetData()); - myContext->core11->glMaterialfv(aFrontFace, GL_DIFFUSE, aFrontMat.Diffuse.GetData()); - myContext->core11->glMaterialfv(aFrontFace, GL_SPECULAR, aFrontMat.Specular.GetData()); - myContext->core11->glMaterialfv(aFrontFace, GL_EMISSION, aFrontMat.Emission.GetData()); - myContext->core11->glMaterialf (aFrontFace, GL_SHININESS, aFrontMat.Shine()); + myContext->core11->glMaterialfv(aFrontFace, GL_AMBIENT, aFrontMat.Common.Ambient.GetData()); + myContext->core11->glMaterialfv(aFrontFace, GL_DIFFUSE, aFrontMat.Common.Diffuse.GetData()); + myContext->core11->glMaterialfv(aFrontFace, GL_SPECULAR, aFrontMat.Common.Specular.GetData()); + myContext->core11->glMaterialfv(aFrontFace, GL_EMISSION, aFrontMat.Common.Emission.GetData()); + myContext->core11->glMaterialf (aFrontFace, GL_SHININESS, aFrontMat.Common.Shine()); if (myMaterialState.ToDistinguish()) { - myContext->core11->glMaterialfv(GL_BACK, GL_AMBIENT, aBackMat.Ambient.GetData()); - myContext->core11->glMaterialfv(GL_BACK, GL_DIFFUSE, aBackMat.Diffuse.GetData()); - myContext->core11->glMaterialfv(GL_BACK, GL_SPECULAR, aBackMat.Specular.GetData()); - myContext->core11->glMaterialfv(GL_BACK, GL_EMISSION, aBackMat.Emission.GetData()); - myContext->core11->glMaterialf (GL_BACK, GL_SHININESS, aBackMat.Shine()); + myContext->core11->glMaterialfv(GL_BACK, GL_AMBIENT, aBackMat.Common.Ambient.GetData()); + myContext->core11->glMaterialfv(GL_BACK, GL_DIFFUSE, aBackMat.Common.Diffuse.GetData()); + myContext->core11->glMaterialfv(GL_BACK, GL_SPECULAR, aBackMat.Common.Specular.GetData()); + myContext->core11->glMaterialfv(GL_BACK, GL_EMISSION, aBackMat.Common.Emission.GetData()); + myContext->core11->glMaterialf (GL_BACK, GL_SHININESS, aBackMat.Common.Shine()); } #endif return; @@ -1170,15 +1341,25 @@ theProgram->GetStateLocation (OpenGl_OCCT_DISTINGUISH_MODE), myMaterialState.ToDistinguish() ? 1 : 0); - if (const OpenGl_ShaderUniformLocation aLocFront = theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL)) + if (const OpenGl_ShaderUniformLocation& aLocPbrFront = theProgram->GetStateLocation (OpenGl_OCCT_PBR_FRONT_MATERIAL)) { - theProgram->SetUniform (myContext, aLocFront, OpenGl_Material::NbOfVec4(), - aFrontMat.Packed()); + theProgram->SetUniform (myContext, aLocPbrFront, OpenGl_MaterialPBR::NbOfVec4(), + aFrontMat.Pbr.Packed()); } - if (const OpenGl_ShaderUniformLocation aLocBack = theProgram->GetStateLocation (OpenGl_OCCT_BACK_MATERIAL)) + if (const OpenGl_ShaderUniformLocation aLocPbrBack = theProgram->GetStateLocation (OpenGl_OCCT_PBR_BACK_MATERIAL)) { - theProgram->SetUniform (myContext, aLocBack, OpenGl_Material::NbOfVec4(), - aBackMat.Packed()); + theProgram->SetUniform (myContext, aLocPbrBack, OpenGl_MaterialPBR::NbOfVec4(), + aBackMat.Pbr.Packed()); + } + if (const OpenGl_ShaderUniformLocation aLocFront = theProgram->GetStateLocation (OpenGl_OCCT_COMMON_FRONT_MATERIAL)) + { + theProgram->SetUniform (myContext, aLocFront, OpenGl_MaterialCommon::NbOfVec4(), + aFrontMat.Common.Packed()); + } + if (const OpenGl_ShaderUniformLocation aLocBack = theProgram->GetStateLocation (OpenGl_OCCT_COMMON_BACK_MATERIAL)) + { + theProgram->SetUniform (myContext, aLocBack, OpenGl_MaterialCommon::NbOfVec4(), + aBackMat.Common.Packed()); } } @@ -1227,7 +1408,7 @@ } else { - theProgram->SetUniform (myContext, aLocWireframeColor, theAspect->EdgeColorRGBA()); + theProgram->SetUniform (myContext, aLocWireframeColor, myContext->Vec4FromQuantityColor (theAspect->EdgeColorRGBA())); } } if (const OpenGl_ShaderUniformLocation aLocQuadModeState = theProgram->GetStateLocation (OpenGl_OCCT_QUAD_MODE_STATE)) @@ -1240,7 +1421,8 @@ // function : PushState // purpose : Pushes state of OCCT graphics parameters to the program // ======================================================================= -void OpenGl_ShaderManager::PushState (const Handle(OpenGl_ShaderProgram)& theProgram) const +void OpenGl_ShaderManager::PushState (const Handle(OpenGl_ShaderProgram)& theProgram, + Graphic3d_TypeOfShadingModel theShadingModel) const { const Handle(OpenGl_ShaderProgram)& aProgram = !theProgram.IsNull() ? theProgram : myFfpProgram; PushClippingState (aProgram); @@ -1259,6 +1441,23 @@ (float )myContext->Viewport()[2], (float )myContext->Viewport()[3])); } } +#if !defined(GL_ES_VERSION_2_0) + else if (myContext->core11 != NULL) + { + // manage FFP lighting + myContext->SetShadeModel (theShadingModel); + if (theShadingModel == Graphic3d_TOSM_UNLIT) + { + glDisable (GL_LIGHTING); + } + else + { + glEnable (GL_LIGHTING); + } + } +#else + (void )theShadingModel; +#endif } // ======================================================================= @@ -1314,10 +1513,35 @@ } // ======================================================================= +// function : BindFboBlitProgram +// purpose : +// ======================================================================= +Standard_Boolean OpenGl_ShaderManager::BindFboBlitProgram (Standard_Integer theNbSamples, + Standard_Boolean theIsFallback_sRGB) +{ + NCollection_Array1& aList = myBlitPrograms[theIsFallback_sRGB ? 1 : 0]; + Standard_Integer aNbSamples = Max (theNbSamples, 1); + if (aNbSamples > aList.Upper()) + { + aList.Resize (1, aNbSamples, true); + } + + Handle(OpenGl_ShaderProgram)& aProg = aList[aNbSamples]; + if (aProg.IsNull()) + { + prepareStdProgramFboBlit (aProg, aNbSamples, theIsFallback_sRGB); + } + return !aProg.IsNull() + && myContext->BindProgram (aProg); +} + +// ======================================================================= // function : prepareStdProgramFboBlit // purpose : // ======================================================================= -Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFboBlit() +Standard_Boolean OpenGl_ShaderManager::prepareStdProgramFboBlit (Handle(OpenGl_ShaderProgram)& theProgram, + Standard_Integer theNbSamples, + Standard_Boolean theIsFallback_sRGB) { OpenGl_ShaderObject::ShaderVariableList aUniforms, aStageInOuts; aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec2 TexCoord", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); @@ -1329,18 +1553,63 @@ EOL" gl_Position = vec4(occVertex.x, occVertex.y, 0.0, 1.0);" EOL"}"; - aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D uColorSampler", Graphic3d_TOS_FRAGMENT)); - aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D uDepthSampler", Graphic3d_TOS_FRAGMENT)); - TCollection_AsciiString aSrcFrag = - EOL"void main()" + TCollection_AsciiString aSrcFrag; + if (theNbSamples > 1) + { + #if defined(GL_ES_VERSION_2_0) + aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("highp sampler2DMS uColorSampler", Graphic3d_TOS_FRAGMENT)); + aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("highp sampler2DMS uDepthSampler", Graphic3d_TOS_FRAGMENT)); + #else + aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("sampler2DMS uColorSampler", Graphic3d_TOS_FRAGMENT)); + aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("sampler2DMS uDepthSampler", Graphic3d_TOS_FRAGMENT)); + #endif + aSrcFrag = TCollection_AsciiString() + + EOL"#define THE_NUM_SAMPLES " + theNbSamples + + (theIsFallback_sRGB ? EOL"#define THE_SHIFT_sRGB" : "") + + EOL"void main()" + EOL"{" + EOL" ivec2 aSize = textureSize (uColorSampler);" + EOL" ivec2 anUV = ivec2 (vec2 (aSize) * TexCoord);" + EOL" gl_FragDepth = texelFetch (uDepthSampler, anUV, THE_NUM_SAMPLES / 2 - 1).r;" + EOL + EOL" vec4 aColor = vec4 (0.0);" + EOL" for (int aSample = 0; aSample < THE_NUM_SAMPLES; ++aSample)" + EOL" {" + EOL" vec4 aVal = texelFetch (uColorSampler, anUV, aSample);" + EOL" aColor += aVal;" + EOL" }" + EOL" aColor /= float(THE_NUM_SAMPLES);" + EOL"#ifdef THE_SHIFT_sRGB" + EOL" aColor.rgb = pow (aColor.rgb, vec3 (1.0 / 2.2));" + EOL"#endif" + EOL" occSetFragColor (aColor);" + EOL"}"; + } + else + { + aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D uColorSampler", Graphic3d_TOS_FRAGMENT)); + aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D uDepthSampler", Graphic3d_TOS_FRAGMENT)); + aSrcFrag = TCollection_AsciiString() + + (theIsFallback_sRGB ? EOL"#define THE_SHIFT_sRGB" : "") + + EOL"void main()" EOL"{" EOL" gl_FragDepth = occTexture2D (uDepthSampler, TexCoord).r;" - EOL" occSetFragColor (occTexture2D (uColorSampler, TexCoord));" + EOL" vec4 aColor = occTexture2D (uColorSampler, TexCoord);" + EOL"#ifdef THE_SHIFT_sRGB" + EOL" aColor.rgb = pow (aColor.rgb, vec3 (1.0 / 2.2));" + EOL"#endif" + EOL" occSetFragColor (aColor);" EOL"}"; + } Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram(); #if defined(GL_ES_VERSION_2_0) - if (myContext->IsGlGreaterEqual (3, 0)) + if (myContext->IsGlGreaterEqual (3, 1)) + { + // required for MSAA sampler + aProgramSrc->SetHeader ("#version 310 es"); + } + else if (myContext->IsGlGreaterEqual (3, 0)) { aProgramSrc->SetHeader ("#version 300 es"); } @@ -1364,22 +1633,31 @@ aProgramSrc->SetHeader ("#version 150"); } #endif - aProgramSrc->SetId ("occt_blit"); + TCollection_AsciiString anId = "occt_blit"; + if (theNbSamples > 1) + { + anId += TCollection_AsciiString ("_msaa") + theNbSamples; + } + if (theIsFallback_sRGB) + { + anId += "_gamma"; + } + aProgramSrc->SetId (anId); aProgramSrc->SetDefaultSampler (false); aProgramSrc->SetNbLightsMax (0); aProgramSrc->SetNbClipPlanesMax (0); aProgramSrc->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcVert, Graphic3d_TOS_VERTEX, aUniforms, aStageInOuts)); aProgramSrc->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcFrag, Graphic3d_TOS_FRAGMENT, aUniforms, aStageInOuts)); TCollection_AsciiString aKey; - if (!Create (aProgramSrc, aKey, myBlitProgram)) + if (!Create (aProgramSrc, aKey, theProgram)) { - myBlitProgram = new OpenGl_ShaderProgram(); // just mark as invalid + theProgram = new OpenGl_ShaderProgram(); // just mark as invalid return Standard_False; } - myContext->BindProgram (myBlitProgram); - myBlitProgram->SetSampler (myContext, "uColorSampler", Graphic3d_TextureUnit_0); - myBlitProgram->SetSampler (myContext, "uDepthSampler", Graphic3d_TextureUnit_1); + myContext->BindProgram (theProgram); + theProgram->SetSampler (myContext, "uColorSampler", Graphic3d_TextureUnit_0); + theProgram->SetSampler (myContext, "uDepthSampler", Graphic3d_TextureUnit_1); myContext->BindProgram (NULL); return Standard_True; } @@ -1506,7 +1784,8 @@ { int aBits = theBits; const bool toUseDerivates = theUsesDerivates - || (theBits & OpenGl_PO_StippleLine) != 0; + || (theBits & OpenGl_PO_StippleLine) != 0 + || (theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureNormal; #if !defined(GL_ES_VERSION_2_0) if (myContext->core32 != NULL) { @@ -1514,7 +1793,8 @@ } else { - if ((theBits & OpenGl_PO_StippleLine) != 0) + if ((theBits & OpenGl_PO_StippleLine) != 0 + || theProgram->IsPBR()) { if (myContext->IsGlGreaterEqual (3, 0)) { @@ -1530,6 +1810,15 @@ } (void )toUseDerivates; #else + +#if defined(__EMSCRIPTEN__) + if (myContext->IsGlGreaterEqual (3, 0)) + { + // consider this is browser responsibility to provide working WebGL 2.0 implementation + // and black-list broken drivers (there is no OpenGL ES greater than 3.0) + theProgram->SetHeader ("#version 300 es"); + } +#endif // prefer "100 es" on OpenGL ES 3.0- devices (save the features unavailable before "300 es") // and "300 es" on OpenGL ES 3.1+ devices if (myContext->IsGlGreaterEqual (3, 1)) @@ -1545,6 +1834,11 @@ } else { + if (theProgram->IsPBR() + && myContext->IsGlGreaterEqual (3, 0)) + { + theProgram->SetHeader ("#version 300 es"); + } if ((theBits & OpenGl_PO_WriteOit) != 0 || (theBits & OpenGl_PO_StippleLine) != 0) { @@ -1691,9 +1985,10 @@ aSrcFragGetColor = EOL"vec4 getColor(void) { return occTexture2D(occSamplerPointSprite, " THE_VEC2_glPointCoord "); }"; } - else if ((theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureRGB + else if ((theBits & OpenGl_PO_TextureRGB) != 0 && (theBits & OpenGl_PO_VertColor) == 0) { + aProgramSrc->SetTextureSetBits (Graphic3d_TextureSetBits_BaseColor); aUniforms .Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D occSamplerBaseColor", Graphic3d_TOS_VERTEX)); aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec4 VertColor", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); aSrcVertExtraMain += @@ -1720,9 +2015,10 @@ } else { - if ((theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureRGB + if ((theBits & OpenGl_PO_TextureRGB) != 0 && (theBits & OpenGl_PO_VertColor) == 0) { + aProgramSrc->SetTextureSetBits (Graphic3d_TextureSetBits_BaseColor); aUniforms .Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D occSamplerBaseColor", Graphic3d_TOS_VERTEX)); aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec4 VertColor", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); aSrcVertExtraMain += @@ -1739,32 +2035,33 @@ } else { - if ((theBits & OpenGl_PO_TextureRGB) != 0 || (theBits & OpenGl_PO_TextureEnv) != 0) + if ((theBits & OpenGl_PO_HasTextures) != 0) { aUniforms .Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D occSamplerBaseColor", Graphic3d_TOS_FRAGMENT)); aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec4 TexCoord", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); - } - if ((theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureRGB) - { - aSrcVertExtraMain += THE_VARY_TexCoord_Trsf; + if ((theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureEnv) + { + aSrcVertExtraFunc = THE_FUNC_transformNormal_view; - aSrcFragGetColor = - EOL"vec4 getColor(void) { return occTexture2D(occSamplerBaseColor, TexCoord.st / TexCoord.w); }"; - } - else if ((theBits & OpenGl_PO_TextureEnv) != 0) - { - aSrcVertExtraFunc = THE_FUNC_transformNormal; + aSrcVertExtraMain += + EOL" vec4 aPosition = occWorldViewMatrix * occModelWorldMatrix * occVertex;" + EOL" vec3 aNormal = transformNormal (occNormal);" + EOL" vec3 aReflect = reflect (normalize (aPosition.xyz), aNormal);" + EOL" aReflect.z += 1.0;" + EOL" TexCoord = vec4(aReflect.xy * inversesqrt (dot (aReflect, aReflect)) * 0.5 + vec2 (0.5), 0.0, 1.0);"; - aSrcVertExtraMain += - EOL" vec4 aPosition = occWorldViewMatrix * occModelWorldMatrix * occVertex;" - EOL" vec3 aNormal = transformNormal (occNormal);" - EOL" vec3 aReflect = reflect (normalize (aPosition.xyz), aNormal);" - EOL" aReflect.z += 1.0;" - EOL" TexCoord = vec4(aReflect.xy * inversesqrt (dot (aReflect, aReflect)) * 0.5 + vec2 (0.5), 0.0, 1.0);"; + aSrcFragGetColor = + EOL"vec4 getColor(void) { return occTexture2D (occSamplerBaseColor, TexCoord.st); }"; + } + else + { + aProgramSrc->SetTextureSetBits (Graphic3d_TextureSetBits_BaseColor); + aSrcVertExtraMain += THE_VARY_TexCoord_Trsf; - aSrcFragGetColor = - EOL"vec4 getColor(void) { return occTexture2D (occSamplerBaseColor, TexCoord.st); }"; + aSrcFragGetColor = + EOL"vec4 getColor(void) { return occTexture2D(occSamplerBaseColor, TexCoord.st / TexCoord.w); }"; + } } } if ((theBits & OpenGl_PO_VertColor) != 0) @@ -1937,7 +2234,9 @@ // purpose : // ======================================================================= TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (Standard_Integer& theNbLights, - Standard_Boolean theHasVertColor) + Standard_Boolean theHasVertColor, + Standard_Boolean theIsPBR, + Standard_Boolean theHasEmissive) { TCollection_AsciiString aLightsFunc, aLightsLoop; theNbLights = 0; @@ -2013,8 +2312,19 @@ } aLightsLoop += EOL" }"; } + + if (theIsPBR) + { + aLightsFunc += Shaders_PBRDistribution_glsl; + aLightsFunc += Shaders_PBRGeometry_glsl; + aLightsFunc += Shaders_PBRFresnel_glsl; + aLightsFunc += Shaders_PBRCookTorrance_glsl; + aLightsFunc += Shaders_PBRIllumination_glsl; + } + if (aLights->NbEnabledLightsOfType (Graphic3d_TOLS_DIRECTIONAL) == 1 - && theNbLights == 1) + && theNbLights == 1 + && !theIsPBR) { // use the version with hard-coded first index aLightsLoop = EOL" directionalLightFirst(theNormal, theView, theIsFront);"; @@ -2022,15 +2332,15 @@ } else if (aLights->NbEnabledLightsOfType (Graphic3d_TOLS_DIRECTIONAL) > 0) { - aLightsFunc += THE_FUNC_directionalLight; + aLightsFunc += theIsPBR ? THE_FUNC_PBR_directionalLight : THE_FUNC_directionalLight; } if (aLights->NbEnabledLightsOfType (Graphic3d_TOLS_POSITIONAL) > 0) { - aLightsFunc += THE_FUNC_pointLight; + aLightsFunc += theIsPBR ? THE_FUNC_PBR_pointLight : THE_FUNC_pointLight; } if (aLights->NbEnabledLightsOfType (Graphic3d_TOLS_SPOT) > 0) { - aLightsFunc += THE_FUNC_spotLight; + aLightsFunc += theIsPBR ? THE_FUNC_PBR_spotLight : THE_FUNC_spotLight; } } @@ -2042,8 +2352,11 @@ aGetMatDiffuse = "getVertColor();"; } - return TCollection_AsciiString() + if (!theIsPBR) + { + return TCollection_AsciiString() + THE_FUNC_lightDef + + Shaders_PointLightAttenuation_glsl + aLightsFunc + EOL EOL"vec4 computeLighting (in vec3 theNormal," @@ -2059,13 +2372,51 @@ + EOL" vec4 aMatAmbient = " + aGetMatAmbient + EOL" vec4 aMatDiffuse = " + aGetMatDiffuse + EOL" vec4 aMatSpecular = theIsFront ? occFrontMaterial_Specular() : occBackMaterial_Specular();" - EOL" vec4 aMatEmission = theIsFront ? occFrontMaterial_Emission() : occBackMaterial_Emission();" - EOL" vec3 aColor = Ambient * aMatAmbient.rgb" - EOL" + Diffuse * aMatDiffuse.rgb" - EOL" + Specular * aMatSpecular.rgb" - EOL" + aMatEmission.rgb;" - EOL" return vec4 (aColor, aMatDiffuse.a);" + EOL" vec3 aColor = Ambient * aMatAmbient.rgb + Diffuse * aMatDiffuse.rgb + Specular * aMatSpecular.rgb;" + EOL" occTextureOcclusion(aColor, TexCoord.st);" + + (theHasEmissive + ? EOL" vec4 aMatEmission = theIsFront ? occFrontMaterial_Emission() : occBackMaterial_Emission();" + EOL" aColor += aMatEmission.rgb;" : "") + + EOL" return vec4 (aColor, aMatDiffuse.a);" + EOL"}"; + } + else + { + return TCollection_AsciiString() + + THE_FUNC_PBR_lightDef + + Shaders_PointLightAttenuation_glsl + + aLightsFunc + + EOL + EOL"vec4 computeLighting (in vec3 theNormal," + EOL" in vec3 theView," + EOL" in vec4 thePoint," + EOL" in bool theIsFront)" + EOL"{" + EOL" DirectLighting = vec3(0.0);" + EOL" BaseColor = " + (theHasVertColor ? "getVertColor();" : "occTextureColor(occPBRMaterial_Color (theIsFront), TexCoord.st / TexCoord.w);") + + EOL" Emission = occTextureEmissive(occPBRMaterial_Emission (theIsFront), TexCoord.st / TexCoord.w);" + EOL" Metallic = occTextureMetallic(occPBRMaterial_Metallic (theIsFront), TexCoord.st / TexCoord.w);" + EOL" NormalizedRoughness = occTextureRoughness(occPBRMaterial_NormalizedRoughness (theIsFront), TexCoord.st / TexCoord.w);" + EOL" Roughness = occRoughness (NormalizedRoughness);" + EOL" IOR = occPBRMaterial_IOR (theIsFront);" + EOL" vec3 aPoint = thePoint.xyz / thePoint.w;" + + aLightsLoop + + EOL" vec3 aColor = DirectLighting;" + EOL" vec3 anIndirectLightingSpec = occPBRFresnel (BaseColor.rgb, Metallic, IOR);" + EOL" vec2 aCoeff = occTexture2D (occEnvLUT, vec2(abs(dot(theView, theNormal)), NormalizedRoughness)).xy;" + EOL" anIndirectLightingSpec *= aCoeff.x;" + EOL" anIndirectLightingSpec += aCoeff.y;" + EOL" anIndirectLightingSpec *= occTextureCubeLod (occSpecIBLMap, -reflect (theView, theNormal), NormalizedRoughness * float (occNbSpecIBLLevels - 1)).rgb;" + EOL" vec3 aRefractionCoeff = 1.0 - occPBRFresnel (BaseColor.rgb, Metallic, NormalizedRoughness, IOR, abs(dot(theView, theNormal)));" + EOL" aRefractionCoeff *= (1.0 - Metallic);" + EOL" vec3 anIndirectLightingDiff = aRefractionCoeff * BaseColor.rgb * BaseColor.a;" + EOL" anIndirectLightingDiff *= occDiffIBLMap (theNormal).rgb;" + EOL" aColor += occLightAmbient.rgb * (anIndirectLightingDiff + anIndirectLightingSpec);" + EOL" aColor += Emission;" + EOL" occTextureOcclusion(aColor, TexCoord.st / TexCoord.w);" + EOL" return vec4 (aColor, mix(1.0, BaseColor.a, aRefractionCoeff.x));" EOL"}"; + } } // ======================================================================= @@ -2101,17 +2452,19 @@ aSrcFragGetColor = pointSpriteShadingSrc ("gl_FrontFacing ? FrontColor : BackColor", theBits); } - if ((theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureRGB + if ((theBits & OpenGl_PO_TextureRGB) != 0 && (theBits & OpenGl_PO_VertColor) == 0) { + aProgramSrc->SetTextureSetBits (Graphic3d_TextureSetBits_BaseColor); aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D occSamplerBaseColor", Graphic3d_TOS_VERTEX)); aSrcVertColor = EOL"vec4 getVertColor(void) { return occTexture2D (occSamplerBaseColor, occTexCoord.xy); }"; } } else { - if ((theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureRGB) + if ((theBits & OpenGl_PO_TextureRGB) != 0) { + aProgramSrc->SetTextureSetBits (Graphic3d_TextureSetBits_BaseColor); aUniforms .Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D occSamplerBaseColor", Graphic3d_TOS_FRAGMENT)); aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec4 TexCoord", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); aSrcVertExtraMain += THE_VARY_TexCoord_Trsf; @@ -2169,9 +2522,9 @@ aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec4 BackColor", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); Standard_Integer aNbLights = 0; - const TCollection_AsciiString aLights = stdComputeLighting (aNbLights, !aSrcVertColor.IsEmpty()); + const TCollection_AsciiString aLights = stdComputeLighting (aNbLights, !aSrcVertColor.IsEmpty(), false, true); aSrcVert = TCollection_AsciiString() - + THE_FUNC_transformNormal + + THE_FUNC_transformNormal_view + EOL + aSrcVertColor + aLights @@ -2225,9 +2578,12 @@ // ======================================================================= Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_ShaderProgram)& theProgram, const Standard_Integer theBits, - const Standard_Boolean theIsFlatNormal) + const Standard_Boolean theIsFlatNormal, + const Standard_Boolean theIsPBR) { - #define thePhongCompLight "computeLighting (normalize (Normal), normalize (View), Position, gl_FrontFacing)" + TCollection_AsciiString aPosition = theIsPBR ? "PositionWorld" : "Position"; + TCollection_AsciiString aPhongCompLight = TCollection_AsciiString() + + "computeLighting (normalize (Normal), normalize (View), " + aPosition + ", gl_FrontFacing)"; const bool isFlatNormal = theIsFlatNormal && myContext->hasFlatShading != OpenGl_FeatureNotAvailable; const char* aDFdxSignReversion = ""; @@ -2248,9 +2604,11 @@ } #endif Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram(); + aProgramSrc->SetPBR (theIsPBR); + TCollection_AsciiString aSrcVert, aSrcVertExtraFunc, aSrcVertExtraMain; - TCollection_AsciiString aSrcFrag, aSrcFragExtraOut, aSrcFragGetVertColor, aSrcFragExtraMain; - TCollection_AsciiString aSrcFragGetColor = EOL"vec4 getColor(void) { return " thePhongCompLight "; }"; + TCollection_AsciiString aSrcFrag, aSrcFragGetVertColor, aSrcFragExtraMain; + TCollection_AsciiString aSrcFragGetColor = TCollection_AsciiString() + EOL"vec4 getColor(void) { return " + aPhongCompLight + "; }"; OpenGl_ShaderObject::ShaderVariableList aUniforms, aStageInOuts; if ((theBits & OpenGl_PO_IsPoint) != 0) { @@ -2269,12 +2627,13 @@ #endif aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D occSamplerPointSprite", Graphic3d_TOS_FRAGMENT)); - aSrcFragGetColor = pointSpriteShadingSrc (thePhongCompLight, theBits); + aSrcFragGetColor = pointSpriteShadingSrc (aPhongCompLight, theBits); } - if ((theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureRGB + if ((theBits & OpenGl_PO_TextureRGB) != 0 && (theBits & OpenGl_PO_VertColor) == 0) { + aProgramSrc->SetTextureSetBits (Graphic3d_TextureSetBits_BaseColor); aUniforms .Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D occSamplerBaseColor", Graphic3d_TOS_VERTEX)); aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec4 VertColor", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); @@ -2284,18 +2643,44 @@ } else { - if ((theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureRGB) + if ((theBits & OpenGl_PO_TextureRGB) != 0) { aUniforms .Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D occSamplerBaseColor", Graphic3d_TOS_FRAGMENT)); aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec4 TexCoord", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); aSrcVertExtraMain += THE_VARY_TexCoord_Trsf; - aSrcFragGetColor = - EOL"vec4 getColor(void)" - EOL"{" - EOL" vec4 aColor = " thePhongCompLight ";" - EOL" return occTexture2D(occSamplerBaseColor, TexCoord.st / TexCoord.w) * aColor;" - EOL"}"; + Standard_Integer aTextureBits = Graphic3d_TextureSetBits_BaseColor | Graphic3d_TextureSetBits_Occlusion | Graphic3d_TextureSetBits_Emissive; + if (!theIsPBR) + { + aSrcFragGetColor = TCollection_AsciiString() + + EOL"vec4 getColor(void)" + EOL"{" + EOL" vec2 aTexUV = TexCoord.st / TexCoord.w;" + EOL" vec4 aColor = " + aPhongCompLight + ";" + EOL" aColor *= occTexture2D(occSamplerBaseColor, aTexUV);" + EOL" vec3 anEmission = occTextureEmissive((gl_FrontFacing ? occFrontMaterial_Emission() : occBackMaterial_Emission()).rgb, aTexUV);" + EOL" aColor.rgb += anEmission;" + EOL" return aColor;" + EOL"}"; + } + else + { + aTextureBits |= Graphic3d_TextureSetBits_MetallicRoughness; + } + if ((theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureNormal + && !isFlatNormal) + { + if (myContext->hasFlatShading != OpenGl_FeatureNotAvailable) + { + aTextureBits |= Graphic3d_TextureSetBits_Normal; + } + else + { + myContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_MEDIUM, + "Warning: ignoring Normal Map texture due to hardware capabilities"); + } + } + aProgramSrc->SetTextureSetBits (aTextureBits); } } @@ -2337,16 +2722,40 @@ if (isFlatNormal) { - aSrcFragExtraOut += EOL"vec3 Normal;"; aSrcFragExtraMain += TCollection_AsciiString() - + EOL" Normal = " + aDFdxSignReversion + "normalize (cross (dFdx (Position.xyz / Position.w), dFdy (Position.xyz / Position.w)));" + + EOL" Normal = " + aDFdxSignReversion + "normalize (cross (dFdx (" + aPosition + ".xyz / " + aPosition + ".w), dFdy (" + aPosition + ".xyz / " + aPosition + ".w)));" EOL" if (!gl_FrontFacing) { Normal = -Normal; }"; } else { - aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec3 Normal", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); - aSrcVertExtraFunc += THE_FUNC_transformNormal; - aSrcVertExtraMain += EOL" Normal = transformNormal (occNormal);"; + aStageInOuts.Append(OpenGl_ShaderObject::ShaderVariable("vec3 vNormal", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); + aSrcVertExtraFunc += THE_FUNC_transformNormal_world; + aSrcVertExtraMain += EOL" vNormal = transformNormal (occNormal);"; + aSrcFragExtraMain += EOL" Normal = vNormal;"; + + if ((theBits & OpenGl_PO_IsPoint) == 0 + && (theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureNormal + && myContext->hasFlatShading != OpenGl_FeatureNotAvailable) + { + aSrcFrag += Shaders_TangentSpaceNormal_glsl; + // apply normal map texture + aSrcFragExtraMain += + EOL"#if defined(THE_HAS_TEXTURE_NORMAL)" + EOL" vec2 aTexCoord = TexCoord.st / TexCoord.w;" + EOL" vec4 aMapNormalValue = occTextureNormal(aTexCoord);" + EOL" if (aMapNormalValue.w > 0.5)" + EOL" {" + EOL" mat2 aDeltaUVMatrix = mat2 (dFdx(aTexCoord), dFdy(aTexCoord));" + EOL" mat2x3 aDeltaVectorMatrix = mat2x3 (dFdx (PositionWorld.xyz), dFdy (PositionWorld.xyz));" + EOL" Normal = TangentSpaceNormal (aDeltaUVMatrix, aDeltaVectorMatrix, aMapNormalValue.xyz, Normal, !gl_FrontFacing);" + EOL" }" + EOL"#endif"; + } + if (!theIsPBR) + { + aSrcFragExtraMain += + EOL" Normal = normalize ((occWorldViewMatrixInverseTranspose * vec4 (Normal, 0.0)).xyz);"; + } } aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec4 PositionWorld", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); @@ -2359,7 +2768,15 @@ EOL"{" EOL" PositionWorld = occModelWorldMatrix * occVertex;" EOL" Position = occWorldViewMatrix * PositionWorld;" - + EOL" View = vec3 (0.0, 0.0, 1.0);" + EOL" if (occProjectionMatrix[3][3] == 1.0)" + EOL" {" + EOL" View = vec3(0.0, 0.0, 1.0);" + EOL" }" + EOL" else" + EOL" {" + EOL" View = -Position.xyz;" + EOL" }" + + (theIsPBR ? EOL" View = (occWorldViewMatrixInverse * vec4(View, 0.0)).xyz;" : "") + aSrcVertExtraMain + THE_VERT_gl_Position + EOL"}"; @@ -2370,11 +2787,13 @@ : EOL"#define getFinalColor getColor"; Standard_Integer aNbLights = 0; - const TCollection_AsciiString aLights = stdComputeLighting (aNbLights, !aSrcFragGetVertColor.IsEmpty()); - aSrcFrag = TCollection_AsciiString() + const TCollection_AsciiString aLights = stdComputeLighting (aNbLights, !aSrcFragGetVertColor.IsEmpty(), theIsPBR, + (theBits & OpenGl_PO_TextureRGB) == 0 + || (theBits & OpenGl_PO_IsPoint) != 0); + aSrcFrag += TCollection_AsciiString() + EOL - + aSrcFragExtraOut + aSrcFragGetVertColor + + EOL"vec3 Normal;" + aLights + aSrcFragGetColor + EOL @@ -2384,12 +2803,13 @@ + EOL" occSetFragColor (getFinalColor());" + EOL"}"; - const TCollection_AsciiString aProgId = TCollection_AsciiString (theIsFlatNormal ? "flat-" : "phong-") + genLightKey (myLightSourceState.LightSources()) + "-"; + const TCollection_AsciiString aProgId = TCollection_AsciiString (theIsFlatNormal ? "flat-" : "phong-") + (theIsPBR ? "pbr-" : "") + genLightKey (myLightSourceState.LightSources()) + "-"; defaultGlslVersion (aProgramSrc, aProgId, theBits, isFlatNormal); aProgramSrc->SetDefaultSampler (false); aProgramSrc->SetNbLightsMax (aNbLights); aProgramSrc->SetNbClipPlanesMax (aNbClipPlanes); aProgramSrc->SetAlphaTest ((theBits & OpenGl_PO_AlphaTest) != 0); + const Standard_Integer aNbGeomInputVerts = !aSrcGeom.IsEmpty() ? 3 : 0; aProgramSrc->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcVert, Graphic3d_TOS_VERTEX, aUniforms, aStageInOuts, "", "", aNbGeomInputVerts)); aProgramSrc->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcGeom, Graphic3d_TOS_GEOMETRY, aUniforms, aStageInOuts, "geomIn", "geomOut", aNbGeomInputVerts)); @@ -2432,19 +2852,21 @@ aName = "anaglyph"; aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("mat4 uMultL", Graphic3d_TOS_FRAGMENT)); aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("mat4 uMultR", Graphic3d_TOS_FRAGMENT)); - aSrcFrag = - EOL"const vec4 THE_POW_UP = vec4 (2.2, 2.2, 2.2, 1.0);" - EOL"const vec4 THE_POW_DOWN = 1.0 / vec4 (2.2, 2.2, 2.2, 1.0);" - EOL - EOL"void main()" - EOL"{" - EOL" vec4 aColorL = occTexture2D (uLeftSampler, TexCoord);" - EOL" vec4 aColorR = occTexture2D (uRightSampler, TexCoord);" - EOL" aColorL = pow (aColorL, THE_POW_UP);" // normalize - EOL" aColorR = pow (aColorR, THE_POW_UP);" - EOL" vec4 aColor = uMultR * aColorR + uMultL * aColorL;" - EOL" occSetFragColor (pow (aColor, THE_POW_DOWN));" - EOL"}"; + const TCollection_AsciiString aNormalize = mySRgbState + ? EOL"#define sRgb2linear(theColor) theColor" + EOL"#define linear2sRgb(theColor) theColor" + : EOL"#define sRgb2linear(theColor) pow(theColor, vec4(2.2, 2.2, 2.2, 1.0))" + EOL"#define linear2sRgb(theColor) pow(theColor, 1.0 / vec4(2.2, 2.2, 2.2, 1.0))"; + aSrcFrag = aNormalize + + EOL"void main()" + EOL"{" + EOL" vec4 aColorL = occTexture2D (uLeftSampler, TexCoord);" + EOL" vec4 aColorR = occTexture2D (uRightSampler, TexCoord);" + EOL" aColorL = sRgb2linear (aColorL);" + EOL" aColorR = sRgb2linear (aColorR);" + EOL" vec4 aColor = uMultR * aColorR + uMultL * aColorL;" + EOL" occSetFragColor (linear2sRgb (aColor));" + EOL"}"; break; } case Graphic3d_StereoMode_RowInterlaced: @@ -2556,6 +2978,7 @@ } case Graphic3d_StereoMode_QuadBuffer: case Graphic3d_StereoMode_SoftPageFlip: + case Graphic3d_StereoMode_OpenVR: default: { /*const Handle(OpenGl_ShaderProgram)& aProgram = myStereoPrograms[Graphic3d_StereoMode_QuadBuffer]; @@ -2677,6 +3100,48 @@ } // ======================================================================= +// function : preparePBREnvBakingProgram +// purpose : +// ======================================================================= +Standard_Boolean OpenGl_ShaderManager::preparePBREnvBakingProgram() +{ + Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram(); + OpenGl_ShaderObject::ShaderVariableList aUniforms, aStageInOuts; + + TCollection_AsciiString aSrcVert = TCollection_AsciiString() + + THE_FUNC_cubemap_vector_transform + + Shaders_PBREnvBaking_vs; + + TCollection_AsciiString aSrcFrag = TCollection_AsciiString() + + THE_FUNC_cubemap_vector_transform + + Shaders_PBRDistribution_glsl + + Shaders_PBREnvBaking_fs; + + // constant array definition requires OpenGL 2.1+ or OpenGL ES 3.0+ +#if defined(GL_ES_VERSION_2_0) + aProgramSrc->SetHeader ("#version 300 es"); +#else + aProgramSrc->SetHeader ("#version 120"); +#endif + + defaultGlslVersion (aProgramSrc, "pbr_env_baking", 0); + aProgramSrc->SetDefaultSampler (false); + aProgramSrc->SetNbLightsMax (0); + aProgramSrc->SetNbClipPlanesMax (0); + aProgramSrc->SetPBR (true); + aProgramSrc->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcVert, Graphic3d_TOS_VERTEX, aUniforms, aStageInOuts)); + aProgramSrc->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcFrag, Graphic3d_TOS_FRAGMENT, aUniforms, aStageInOuts)); + TCollection_AsciiString aKey; + if (!Create (aProgramSrc, aKey, myPBREnvBakingProgram)) + { + myPBREnvBakingProgram = new OpenGl_ShaderProgram(); // just mark as invalid + return Standard_False; + } + + return Standard_True; +} + +// ======================================================================= // function : GetBgCubeMapProgram // purpose : // ======================================================================= @@ -2684,40 +3149,36 @@ { if (myBgCubeMapProgram.IsNull()) { - myBgCubeMapProgram = new Graphic3d_ShaderProgram; + myBgCubeMapProgram = new Graphic3d_ShaderProgram(); OpenGl_ShaderObject::ShaderVariableList aUniforms, aStageInOuts; aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable("vec3 ViewDirection", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); - aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("int uZCoeff", Graphic3d_TOS_VERTEX)); // defines orientation of Z axis to make horizontal flip - aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("int uYCoeff", Graphic3d_TOS_VERTEX)); // defines orientation of Y axis to make vertical flip aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("samplerCube occSampler0", Graphic3d_TOS_FRAGMENT)); + aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("int uYCoeff", Graphic3d_TOS_VERTEX)); + aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("int uZCoeff", Graphic3d_TOS_VERTEX)); - TCollection_AsciiString aSrcVert = - EOL"void main()" + TCollection_AsciiString aSrcVert = TCollection_AsciiString() + + THE_FUNC_cubemap_vector_transform + + EOL"void main()" EOL"{" - EOL" vec4 aViewDirection = occProjectionMatrixInverse * vec4(occVertex.xy, 0.0, 1.0);" - EOL" aViewDirection /= aViewDirection.w;" - EOL" aViewDirection.w = 0.0;" - EOL" ViewDirection = normalize((occWorldViewMatrixInverse * aViewDirection).xyz);" - EOL" ViewDirection = ViewDirection.yzx;" // is needed to sync horizon and frontal camera position - EOL" ViewDirection.y *= uYCoeff;" - EOL" ViewDirection.z *= uZCoeff;" - EOL" gl_Position = vec4(occVertex.xy, 0.0, 1.0);" + EOL" ViewDirection = cubemapVectorTransform (occVertex.xyz, uYCoeff, uZCoeff);" + EOL" vec4 aPos = occProjectionMatrix * occWorldViewMatrix * vec4(occVertex.xyz, 1.0);" + EOL" gl_Position = aPos.xyww;" EOL"}"; TCollection_AsciiString aSrcFrag = EOL"#define occEnvCubemap occSampler0" EOL"void main()" EOL"{" - EOL" occSetFragColor (vec4(texture(occEnvCubemap, ViewDirection).rgb, 1.0));" + EOL" occSetFragColor (vec4(occTextureCube (occEnvCubemap, ViewDirection).rgb, 1.0));" EOL"}"; - defaultGlslVersion(myBgCubeMapProgram, "background_cubemap", 0); - myBgCubeMapProgram->SetDefaultSampler(false); - myBgCubeMapProgram->SetNbLightsMax(0); - myBgCubeMapProgram->SetNbClipPlanesMax(0); - myBgCubeMapProgram->AttachShader(OpenGl_ShaderObject::CreateFromSource(aSrcVert, Graphic3d_TOS_VERTEX, aUniforms, aStageInOuts)); - myBgCubeMapProgram->AttachShader(OpenGl_ShaderObject::CreateFromSource(aSrcFrag, Graphic3d_TOS_FRAGMENT, aUniforms, aStageInOuts)); + defaultGlslVersion (myBgCubeMapProgram, "background_cubemap", 0); + myBgCubeMapProgram->SetDefaultSampler (false); + myBgCubeMapProgram->SetNbLightsMax (0); + myBgCubeMapProgram->SetNbClipPlanesMax (0); + myBgCubeMapProgram->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcVert, Graphic3d_TOS_VERTEX, aUniforms, aStageInOuts)); + myBgCubeMapProgram->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcFrag, Graphic3d_TOS_FRAGMENT, aUniforms, aStageInOuts)); } return myBgCubeMapProgram; @@ -2727,7 +3188,8 @@ // function : bindProgramWithState // purpose : // ======================================================================= -Standard_Boolean OpenGl_ShaderManager::bindProgramWithState (const Handle(OpenGl_ShaderProgram)& theProgram) +Standard_Boolean OpenGl_ShaderManager::bindProgramWithState (const Handle(OpenGl_ShaderProgram)& theProgram, + Graphic3d_TypeOfShadingModel theShadingModel) { const Standard_Boolean isBound = myContext->BindProgram (theProgram); if (isBound @@ -2735,7 +3197,7 @@ { theProgram->ApplyVariables (myContext); } - PushState (theProgram); + PushState (theProgram, theShadingModel); return isBound; } @@ -2752,7 +3214,7 @@ if (!theCustomProgram.IsNull() || myContext->caps->ffpEnable) { - return bindProgramWithState (theCustomProgram); + return bindProgramWithState (theCustomProgram, theShadingModel); } Standard_Integer aBits = getProgramBits (theTextures, theAlphaMode, Aspect_IS_SOLID, theHasVertColor, false, false); @@ -2766,5 +3228,5 @@ aBits |= OpenGl_PO_PointSimple; } Handle(OpenGl_ShaderProgram)& aProgram = getStdProgram (theShadingModel, aBits); - return bindProgramWithState (aProgram); + return bindProgramWithState (aProgram, theShadingModel); } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderManager.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderManager.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderManager.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderManager.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -50,6 +51,9 @@ //! Release all resources. Standard_EXPORT void clear(); + //! Fetch sRGB state from caps and invalidates programs, if necessary. + Standard_EXPORT void UpdateSRgbState(); + //! Return local camera transformation. const gp_XYZ& LocalOrigin() const { return myLocalOrigin; } @@ -113,19 +117,19 @@ Standard_Boolean theEnableMeshEdges, const Handle(OpenGl_ShaderProgram)& theCustomProgram) { + const Graphic3d_TypeOfShadingModel aShadeModelOnFace = theShadingModel != Graphic3d_TOSM_UNLIT + && (theTextures.IsNull() || theTextures->IsModulate()) + ? theShadingModel + : Graphic3d_TOSM_UNLIT; if (!theCustomProgram.IsNull() || myContext->caps->ffpEnable) { - return bindProgramWithState (theCustomProgram); + return bindProgramWithState (theCustomProgram, aShadeModelOnFace); } - const Graphic3d_TypeOfShadingModel aShadeModelOnFace = theShadingModel != Graphic3d_TOSM_UNLIT - && (theTextures.IsNull() || theTextures->IsModulate()) - ? theShadingModel - : Graphic3d_TOSM_UNLIT; const Standard_Integer aBits = getProgramBits (theTextures, theAlphaMode, theInteriorStyle, theHasVertColor, theEnableEnvMap, theEnableMeshEdges); Handle(OpenGl_ShaderProgram)& aProgram = getStdProgram (aShadeModelOnFace, aBits); - return bindProgramWithState (aProgram); + return bindProgramWithState (aProgram, aShadeModelOnFace); } //! Bind program for line rendering @@ -139,7 +143,7 @@ if (!theCustomProgram.IsNull() || myContext->caps->ffpEnable) { - return bindProgramWithState (theCustomProgram); + return bindProgramWithState (theCustomProgram, theShadingModel); } Standard_Integer aBits = getProgramBits (theTextures, theAlphaMode, Aspect_IS_SOLID, theHasVertColor, false, false); @@ -149,7 +153,7 @@ } Handle(OpenGl_ShaderProgram)& aProgram = getStdProgram (theShadingModel, aBits); - return bindProgramWithState (aProgram); + return bindProgramWithState (aProgram, theShadingModel); } //! Bind program for point rendering @@ -165,7 +169,7 @@ if (!theCustomProgram.IsNull() || myContext->caps->ffpEnable) { - return bindProgramWithState (theCustomProgram); + return bindProgramWithState (theCustomProgram, Graphic3d_TOSM_UNLIT); } if (myFontProgram.IsNull()) @@ -173,7 +177,7 @@ prepareStdProgramFont(); } - return bindProgramWithState (myFontProgram); + return bindProgramWithState (myFontProgram, Graphic3d_TOSM_UNLIT); } //! Bind program for outline rendering @@ -194,19 +198,14 @@ { prepareStdProgramUnlit (aProgram, aBits, true); } - return bindProgramWithState (aProgram); + return bindProgramWithState (aProgram, Graphic3d_TOSM_UNLIT); } //! Bind program for FBO blit operation. - Standard_Boolean BindFboBlitProgram() - { - if (myBlitProgram.IsNull()) - { - prepareStdProgramFboBlit(); - } - return !myBlitProgram.IsNull() - && myContext->BindProgram (myBlitProgram); - } + //! @param theNbSamples [in] number of samples within source MSAA texture + //! @param theIsFallback_sRGB [in] flag indicating that destination buffer is not sRGB-ready + Standard_EXPORT Standard_Boolean BindFboBlitProgram (Standard_Integer theNbSamples, + Standard_Boolean theIsFallback_sRGB); //! Bind program for blended order-independent transparency buffers compositing. Standard_Boolean BindOitCompositingProgram (const Standard_Boolean theIsMSAAEnabled) @@ -245,22 +244,50 @@ { prepareStdProgramBoundBox(); } - return bindProgramWithState (myBoundBoxProgram); + return bindProgramWithState (myBoundBoxProgram, Graphic3d_TOSM_UNLIT); } //! Returns bounding box vertex buffer. const Handle(OpenGl_VertexBuffer)& BoundBoxVertBuffer() const { return myBoundBoxVertBuffer; } + //! Bind program for IBL maps generation in PBR pipeline. + Standard_Boolean BindPBREnvBakingProgram() + { + if (myPBREnvBakingProgram.IsNull()) + { + preparePBREnvBakingProgram(); + } + return myContext->BindProgram (myPBREnvBakingProgram); + } + //! Generates shader program to render environment cubemap as background. Standard_EXPORT const Handle(Graphic3d_ShaderProgram)& GetBgCubeMapProgram (); + //! Resets PBR shading models to corresponding non-PBR ones if PBR is not allowed. + static Graphic3d_TypeOfShadingModel PBRShadingModelFallback (Graphic3d_TypeOfShadingModel theShadingModel, + Standard_Boolean theIsPbrAllowed = Standard_False) + { + if (theIsPbrAllowed) + { + return theShadingModel; + } + + switch (theShadingModel) + { + case Graphic3d_TOSM_PBR: return Graphic3d_TOSM_FRAGMENT; + case Graphic3d_TOSM_PBR_FACET: return Graphic3d_TOSM_FACET; + default: return theShadingModel; + } + } + public: //! Returns current state of OCCT light sources. const OpenGl_LightSourceState& LightSourceState() const { return myLightSourceState; } //! Updates state of OCCT light sources. - Standard_EXPORT void UpdateLightSourceStateTo (const Handle(Graphic3d_LightSet)& theLights); + Standard_EXPORT void UpdateLightSourceStateTo (const Handle(Graphic3d_LightSet)& theLights, + Standard_Integer theSpecIBLMapLevels = 0); //! Invalidate state of OCCT light sources. Standard_EXPORT void UpdateLightSourceState(); @@ -427,7 +454,8 @@ public: //! Pushes current state of OCCT graphics parameters to specified program. - Standard_EXPORT void PushState (const Handle(OpenGl_ShaderProgram)& theProgram) const; + Standard_EXPORT void PushState (const Handle(OpenGl_ShaderProgram)& theProgram, + Graphic3d_TypeOfShadingModel theShadingModel = Graphic3d_TOSM_UNLIT) const; public: @@ -445,6 +473,7 @@ //! Choose Shading Model for filled primitives. //! Fallbacks to FACET model if there are no normal attributes. + //! Fallbacks to corresponding non-PBR models if PBR is unavailable. Graphic3d_TypeOfShadingModel ChooseFaceShadingModel (Graphic3d_TypeOfShadingModel theCustomModel, bool theHasNodalNormals) const { @@ -462,12 +491,17 @@ case Graphic3d_TOSM_VERTEX: case Graphic3d_TOSM_FRAGMENT: return theHasNodalNormals ? aModel : Graphic3d_TOSM_FACET; + case Graphic3d_TOSM_PBR: + return PBRShadingModelFallback (theHasNodalNormals ? aModel : Graphic3d_TOSM_PBR_FACET, IsPbrAllowed()); + case Graphic3d_TOSM_PBR_FACET: + return PBRShadingModelFallback (aModel, IsPbrAllowed()); } return Graphic3d_TOSM_UNLIT; } //! Choose Shading Model for line primitives. //! Fallbacks to UNLIT model if there are no normal attributes. + //! Fallbacks to corresponding non-PBR models if PBR is unavailable. Graphic3d_TypeOfShadingModel ChooseLineShadingModel (Graphic3d_TypeOfShadingModel theCustomModel, bool theHasNodalNormals) const { @@ -485,6 +519,10 @@ case Graphic3d_TOSM_VERTEX: case Graphic3d_TOSM_FRAGMENT: return theHasNodalNormals ? aModel : Graphic3d_TOSM_UNLIT; + case Graphic3d_TOSM_PBR: + return PBRShadingModelFallback (theHasNodalNormals ? aModel : Graphic3d_TOSM_UNLIT, IsPbrAllowed()); + case Graphic3d_TOSM_PBR_FACET: + return Graphic3d_TOSM_UNLIT; } return Graphic3d_TOSM_UNLIT; } @@ -581,6 +619,10 @@ && theTextures->HasNonPointSprite()) { aBits |= OpenGl_PO_TextureRGB; + if ((theTextures->TextureSetBits() & Graphic3d_TextureSetBits_Normal) != 0) + { + aBits |= OpenGl_PO_TextureNormal; + } } if (theHasVertColor && theInteriorStyle != Aspect_IS_HIDDENLINE) @@ -600,7 +642,7 @@ Standard_Integer theBits) { if (theShadingModel == Graphic3d_TOSM_UNLIT - || (theBits & OpenGl_PO_TextureEnv) != 0) + || (theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureEnv) { // If environment map is enabled lighting calculations are // not needed (in accordance with default OCCT behavior) @@ -631,7 +673,9 @@ Standard_EXPORT Standard_Boolean prepareStdProgramFont(); //! Prepare standard GLSL program for FBO blit operation. - Standard_EXPORT Standard_Boolean prepareStdProgramFboBlit(); + Standard_EXPORT Standard_Boolean prepareStdProgramFboBlit (Handle(OpenGl_ShaderProgram)& theProgram, + Standard_Integer theNbSamples, + Standard_Boolean theIsFallback_sRGB); //! Prepare standard GLSL programs for OIT compositing operation. Standard_EXPORT Standard_Boolean prepareStdProgramOitCompositing (const Standard_Boolean theMsaa); @@ -648,11 +692,13 @@ { switch (theShadingModel) { - case Graphic3d_TOSM_UNLIT: return prepareStdProgramUnlit (theProgram, theBits, false); - case Graphic3d_TOSM_FACET: return prepareStdProgramPhong (theProgram, theBits, true); - case Graphic3d_TOSM_VERTEX: return prepareStdProgramGouraud(theProgram, theBits); + case Graphic3d_TOSM_UNLIT: return prepareStdProgramUnlit (theProgram, theBits, false); + case Graphic3d_TOSM_FACET: return prepareStdProgramPhong (theProgram, theBits, true); + case Graphic3d_TOSM_VERTEX: return prepareStdProgramGouraud(theProgram, theBits); case Graphic3d_TOSM_DEFAULT: - case Graphic3d_TOSM_FRAGMENT: return prepareStdProgramPhong (theProgram, theBits, false); + case Graphic3d_TOSM_FRAGMENT: return prepareStdProgramPhong (theProgram, theBits, false); + case Graphic3d_TOSM_PBR: return prepareStdProgramPhong (theProgram, theBits, false, true); + case Graphic3d_TOSM_PBR_FACET: return prepareStdProgramPhong (theProgram, theBits, true, true); } return false; } @@ -663,18 +709,25 @@ //! Prepare standard GLSL program with per-pixel lighting. //! @param theIsFlatNormal when TRUE, the Vertex normals will be ignored and Face normal will be computed instead + //! @param theIsPBR when TRUE, the PBR pipeline will be activated Standard_EXPORT Standard_Boolean prepareStdProgramPhong (Handle(OpenGl_ShaderProgram)& theProgram, const Standard_Integer theBits, - const Standard_Boolean theIsFlatNormal = false); + const Standard_Boolean theIsFlatNormal = false, + const Standard_Boolean theIsPBR = false); //! Define computeLighting GLSL function depending on current lights configuration //! @param theNbLights [out] number of defined light sources //! @param theHasVertColor [in] flag to use getVertColor() instead of Ambient and Diffuse components of active material + //! @param theIsPBR [in] flag to activate PBR pipeline + //! @param theHasEmissive [in] flag to include emissive Standard_EXPORT TCollection_AsciiString stdComputeLighting (Standard_Integer& theNbLights, - Standard_Boolean theHasVertColor); + Standard_Boolean theHasVertColor, + Standard_Boolean theIsPBR, + Standard_Boolean theHasEmissive = true); //! Bind specified program to current context and apply state. - Standard_EXPORT Standard_Boolean bindProgramWithState (const Handle(OpenGl_ShaderProgram)& theProgram); + Standard_EXPORT Standard_Boolean bindProgramWithState (const Handle(OpenGl_ShaderProgram)& theProgram, + Graphic3d_TypeOfShadingModel theShadingModel); //! Set pointer myLightPrograms to active lighting programs set from myMapOfLightPrograms Standard_EXPORT void switchLightPrograms(); @@ -697,32 +750,28 @@ OpenGl_ShaderObject::ShaderVariableList& theStageInOuts, Standard_Integer theBits); + //! Prepare GLSL source for IBL generation used in PBR pipeline. + Standard_EXPORT Standard_Boolean preparePBREnvBakingProgram(); + + //! Checks whether one of PBR shading models is set as default model. + Standard_Boolean IsPbrAllowed() const { return myShadingModel == Graphic3d_TOSM_PBR + || myShadingModel == Graphic3d_TOSM_PBR_FACET; } + protected: //! Packed properties of light source struct OpenGl_ShaderLightParameters { - OpenGl_Vec4 Color; - OpenGl_Vec4 Position; - OpenGl_Vec4 Direction; - OpenGl_Vec4 Parameters; + OpenGl_Vec4 Color; //!< RGB color + Intensity (in .w) + OpenGl_Vec4 Position; //!< XYZ Direction or Position + IsHeadlight (in .w) + OpenGl_Vec4 Direction; //!< spot light XYZ direction + Range (in .w) + OpenGl_Vec4 Parameters; //!< same as Graphic3d_CLight::PackedParams() //! Returns packed (serialized) representation of light source properties const OpenGl_Vec4* Packed() const { return reinterpret_cast (this); } static Standard_Integer NbOfVec4() { return 4; } }; - //! Packed light source type information - struct OpenGl_ShaderLightType - { - Standard_Integer Type; - Standard_Integer IsHeadlight; - - //! Returns packed (serialized) representation of light source type - const OpenGl_Vec2i* Packed() const { return reinterpret_cast (this); } - static Standard_Integer NbOfVec2i() { return 1; } - }; - //! Fake OpenGL program for tracking FFP state in the way consistent to programmable pipeline. class OpenGl_ShaderProgramFFP : public OpenGl_ShaderProgram { @@ -763,18 +812,23 @@ Handle(OpenGl_SetOfPrograms) myUnlitPrograms; //!< programs matrix without lighting Handle(OpenGl_SetOfPrograms) myOutlinePrograms; //!< programs matrix without lighting for outline presentation Handle(OpenGl_ShaderProgram) myFontProgram; //!< standard program for textured text - Handle(OpenGl_ShaderProgram) myBlitProgram; //!< standard program for FBO blit emulation + NCollection_Array1 + myBlitPrograms[2]; //!< standard program for FBO blit emulation Handle(OpenGl_ShaderProgram) myBoundBoxProgram; //!< standard program for bounding box Handle(OpenGl_ShaderProgram) myOitCompositingProgram[2]; //!< standard program for OIT compositing (default and MSAA). OpenGl_MapOfShaderPrograms myMapOfLightPrograms; //!< map of lighting programs depending on lights configuration + Handle(OpenGl_ShaderProgram) myPBREnvBakingProgram;//!< program for IBL maps generation used in PBR pipeline Handle(Graphic3d_ShaderProgram) myBgCubeMapProgram; //!< program for background cubemap rendering Handle(OpenGl_ShaderProgram) myStereoPrograms[Graphic3d_StereoMode_NB]; //!< standard stereo programs Handle(OpenGl_VertexBuffer) myBoundBoxVertBuffer; //!< bounding box vertex buffer + mutable Handle(OpenGl_PBREnvironment) myPBREnvironment; //!< manager of IBL maps used in PBR pipeline + OpenGl_Context* myContext; //!< OpenGL context + Standard_Boolean mySRgbState; //!< track sRGB state protected: @@ -789,7 +843,7 @@ gp_XYZ myLocalOrigin; //!< local camera transformation Standard_Boolean myHasLocalOrigin; //!< flag indicating that local camera transformation has been set - mutable NCollection_Array1 myLightTypeArray; + mutable NCollection_Array1 myLightTypeArray; mutable NCollection_Array1 myLightParamsArray; mutable NCollection_Array1 myClipPlaneArray; mutable NCollection_Array1 myClipPlaneArrayFfp; diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderObject.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderObject.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderObject.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderObject.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -438,7 +438,7 @@ } if (!aFile.IsOpen()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Error: File '") + theFileName + "' cannot be opened to save shader", Message_Fail); + Message::SendFail (TCollection_AsciiString("Error: File '") + theFileName + "' cannot be opened to save shader"); return false; } @@ -447,7 +447,7 @@ aFile.Write (aSource.ToCString(), aSource.Length()); } aFile.Close(); - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Shader source dumped into '") + theFileName + "'", Message_Warning); + Message::SendWarning (TCollection_AsciiString ("Shader source dumped into '") + theFileName + "'"); return true; } @@ -459,7 +459,7 @@ aFile.Open (OSD_ReadOnly, OSD_Protection()); if (!aFile.IsOpen()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("File '") + theFileName + "' cannot be opened to load shader", Message_Fail); + Message::SendFail (TCollection_AsciiString ("File '") + theFileName + "' cannot be opened to load shader"); return false; } @@ -470,7 +470,7 @@ aFile.Read (theSource, aSize); } aFile.Close(); - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Restored shader dump from '") + theFileName + "'", Message_Warning); + Message::SendWarning (TCollection_AsciiString ("Restored shader dump from '") + theFileName + "'"); return true; } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderProgram.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderProgram.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderProgram.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderProgram.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -56,38 +56,42 @@ "occWorldViewMatrixInverseTranspose", // OpenGl_OCC_WORLD_VIEW_MATRIX_INVERSE_TRANSPOSE "occProjectionMatrixInverseTranspose", // OpenGl_OCC_PROJECTION_MATRIX_INVERSE_TRANSPOSE - "occClipPlaneEquations", // OpenGl_OCC_CLIP_PLANE_EQUATIONS - "occClipPlaneChains", // OpenGl_OCC_CLIP_PLANE_CHAINS - "occClipPlaneCount", // OpenGl_OCC_CLIP_PLANE_COUNT - - "occLightSourcesCount", // OpenGl_OCC_LIGHT_SOURCE_COUNT - "occLightSourcesTypes", // OpenGl_OCC_LIGHT_SOURCE_TYPES - "occLightSources", // OpenGl_OCC_LIGHT_SOURCE_PARAMS - "occLightAmbient", // OpenGl_OCC_LIGHT_AMBIENT - - "occTextureEnable", // OpenGl_OCCT_TEXTURE_ENABLE - "occDistinguishingMode", // OpenGl_OCCT_DISTINGUISH_MODE - "occFrontMaterial", // OpenGl_OCCT_FRONT_MATERIAL - "occBackMaterial", // OpenGl_OCCT_BACK_MATERIAL - "occAlphaCutoff", // OpenGl_OCCT_ALPHA_CUTOFF - "occColor", // OpenGl_OCCT_COLOR - - "occOitOutput", // OpenGl_OCCT_OIT_OUTPUT - "occOitDepthFactor", // OpenGl_OCCT_OIT_DEPTH_FACTOR - - "occTexTrsf2d", // OpenGl_OCCT_TEXTURE_TRSF2D - "occPointSize", // OpenGl_OCCT_POINT_SIZE - - "occViewport", // OpenGl_OCCT_VIEWPORT - "occLineWidth", // OpenGl_OCCT_LINE_WIDTH - "occLineFeather", // OpenGl_OCCT_LINE_FEATHER - "occStipplePattern", // OpenGl_OCCT_LINE_STIPPLE_PATTERN - "occStippleFactor", // OpenGl_OCCT_LINE_STIPPLE_FACTOR - "occWireframeColor", // OpenGl_OCCT_WIREFRAME_COLOR - "occIsQuadMode", // OpenGl_OCCT_QUAD_MODE_STATE + "occClipPlaneEquations", // OpenGl_OCC_CLIP_PLANE_EQUATIONS + "occClipPlaneChains", // OpenGl_OCC_CLIP_PLANE_CHAINS + "occClipPlaneCount", // OpenGl_OCC_CLIP_PLANE_COUNT + + "occLightSourcesCount", // OpenGl_OCC_LIGHT_SOURCE_COUNT + "occLightSourcesTypes", // OpenGl_OCC_LIGHT_SOURCE_TYPES + "occLightSources", // OpenGl_OCC_LIGHT_SOURCE_PARAMS + "occLightAmbient", // OpenGl_OCC_LIGHT_AMBIENT + + "occTextureEnable", // OpenGl_OCCT_TEXTURE_ENABLE + "occDistinguishingMode", // OpenGl_OCCT_DISTINGUISH_MODE + "occPbrFrontMaterial", // OpenGl_OCCT_PBR_FRONT_MATERIAL + "occPbrBackMaterial", // OpenGl_OCCT_PBR_BACK_MATERIAL + "occFrontMaterial", // OpenGl_OCCT_COMMON_FRONT_MATERIAL + "occBackMaterial", // OpenGl_OCCT_COMMON_BACK_MATERIAL + "occAlphaCutoff", // OpenGl_OCCT_ALPHA_CUTOFF + "occColor", // OpenGl_OCCT_COLOR + + "occOitOutput", // OpenGl_OCCT_OIT_OUTPUT + "occOitDepthFactor", // OpenGl_OCCT_OIT_DEPTH_FACTOR + + "occTexTrsf2d", // OpenGl_OCCT_TEXTURE_TRSF2D + "occPointSize", // OpenGl_OCCT_POINT_SIZE + + "occViewport", // OpenGl_OCCT_VIEWPORT + "occLineWidth", // OpenGl_OCCT_LINE_WIDTH + "occLineFeather", // OpenGl_OCCT_LINE_FEATHER + "occStipplePattern", // OpenGl_OCCT_LINE_STIPPLE_PATTERN + "occStippleFactor", // OpenGl_OCCT_LINE_STIPPLE_FACTOR + "occWireframeColor", // OpenGl_OCCT_WIREFRAME_COLOR + "occIsQuadMode", // OpenGl_OCCT_QUAD_MODE_STATE - "occOrthoScale", // OpenGl_OCCT_ORTHO_SCALE - "occSilhouetteThickness" // OpenGl_OCCT_SILHOUETTE_THICKNESS + "occOrthoScale", // OpenGl_OCCT_ORTHO_SCALE + "occSilhouetteThickness", // OpenGl_OCCT_SILHOUETTE_THICKNESS + + "occNbSpecIBLLevels" // OpenGl_OCCT_NB_SPEC_IBL_LEVELS }; namespace @@ -167,6 +171,7 @@ myNbLightsMax (0), myNbClipPlanesMax (0), myNbFragOutputs (1), + myTextureSetBits (Graphic3d_TextureSetBits_NONE), myHasAlphaTest (false), myHasWeightOitOutput (false), myHasTessShader (false) @@ -195,6 +200,7 @@ } myHasTessShader = (aShaderMask & (Graphic3d_TOS_TESS_CONTROL | Graphic3d_TOS_TESS_EVALUATION)) != 0; myNbFragOutputs = !myProxy.IsNull() ? myProxy->NbFragmentOutputs() : 1; + myTextureSetBits = Graphic3d_TextureSetBits_NONE; myHasAlphaTest = !myProxy.IsNull() && myProxy->HasAlphaTest(); myHasWeightOitOutput = !myProxy.IsNull() ? myProxy->HasWeightOitOutput() && myNbFragOutputs >= 2 : 1; @@ -409,6 +415,33 @@ { aHeaderConstants += "#define THE_HAS_DEFAULT_SAMPLER\n"; } + if (!myProxy.IsNull()) + { + if (myProxy->IsPBR()) + { + aHeaderConstants += "#define THE_IS_PBR\n"; + } + if ((myProxy->TextureSetBits() & Graphic3d_TextureSetBits_BaseColor) != 0) + { + aHeaderConstants += "#define THE_HAS_TEXTURE_COLOR\n"; + } + if ((myProxy->TextureSetBits() & Graphic3d_TextureSetBits_Emissive) != 0) + { + aHeaderConstants += "#define THE_HAS_TEXTURE_EMISSIVE\n"; + } + if ((myProxy->TextureSetBits() & Graphic3d_TextureSetBits_Normal) != 0) + { + aHeaderConstants += "#define THE_HAS_TEXTURE_NORMAL\n"; + } + if ((myProxy->TextureSetBits() & Graphic3d_TextureSetBits_Occlusion) != 0) + { + aHeaderConstants += "#define THE_HAS_TEXTURE_OCCLUSION\n"; + } + if ((myProxy->TextureSetBits() & Graphic3d_TextureSetBits_MetallicRoughness) != 0) + { + aHeaderConstants += "#define THE_HAS_TEXTURE_METALROUGHNESS\n"; + } + } const TCollection_AsciiString aSource = aHeaderVer // #version - header defining GLSL version, should be first + (!aHeaderVer.IsEmpty() ? "\n" : "") @@ -482,12 +515,47 @@ } if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occSamplerBaseColor")) { + myTextureSetBits |= Graphic3d_TextureSetBits_BaseColor; SetUniform (theCtx, aLocSampler, GLint(Graphic3d_TextureUnit_BaseColor)); } if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occSamplerPointSprite")) { + // Graphic3d_TextureUnit_PointSprite + //myTextureSetBits |= Graphic3d_TextureSetBits_PointSprite; SetUniform (theCtx, aLocSampler, GLint(theCtx->SpriteTextureUnit())); } + if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occSamplerMetallicRoughness")) + { + myTextureSetBits |= Graphic3d_TextureSetBits_MetallicRoughness; + SetUniform (theCtx, aLocSampler, GLint(Graphic3d_TextureUnit_MetallicRoughness)); + } + if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occSamplerEmissive")) + { + myTextureSetBits |= Graphic3d_TextureSetBits_Emissive; + SetUniform (theCtx, aLocSampler, GLint(Graphic3d_TextureUnit_Emissive)); + } + if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occSamplerOcclusion")) + { + myTextureSetBits |= Graphic3d_TextureSetBits_Occlusion; + SetUniform (theCtx, aLocSampler, GLint(Graphic3d_TextureUnit_Occlusion)); + } + if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occSamplerNormal")) + { + myTextureSetBits |= Graphic3d_TextureSetBits_Normal; + SetUniform (theCtx, aLocSampler, GLint(Graphic3d_TextureUnit_Normal)); + } + if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occDiffIBLMapSHCoeffs")) + { + SetUniform (theCtx, aLocSampler, GLint(theCtx->PBRDiffIBLMapSHTexUnit())); + } + if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occSpecIBLMap")) + { + SetUniform (theCtx, aLocSampler, GLint(theCtx->PBRSpecIBLMapTexUnit())); + } + if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occEnvLUT")) + { + SetUniform (theCtx, aLocSampler, GLint(theCtx->PBREnvLUTTexUnit())); + } const TCollection_AsciiString aSamplerNamePrefix ("occSampler"); const Standard_Integer aNbUnitsMax = Max (theCtx->MaxCombinedTextureUnits(), Graphic3d_TextureUnit_NB); @@ -988,18 +1056,25 @@ GLint theLocation, const OpenGl_Vec2u& theValue) { - if (theCtx->core32 == NULL || myProgramID == NO_PROGRAM || theLocation == INVALID_LOCATION) + if (myProgramID == NO_PROGRAM || theLocation == INVALID_LOCATION) { - return Standard_False; + return false; } #if !defined(GL_ES_VERSION_2_0) - theCtx->core32->glUniform2uiv (theLocation, 1, theValue.GetData()); - return Standard_True; + if (theCtx->core32 != NULL) + { + theCtx->core32->glUniform2uiv (theLocation, 1, theValue.GetData()); + return true; + } #else - (void )theValue; - return Standard_False; + if (theCtx->core30fwd != NULL) + { + theCtx->core30fwd->glUniform2uiv (theLocation, 1, theValue.GetData()); + return true; + } #endif + return false; } // ======================================================================= @@ -1023,19 +1098,25 @@ const GLsizei theCount, const OpenGl_Vec2u* theValue) { - if (theCtx->core32 == NULL || myProgramID == NO_PROGRAM || theLocation == INVALID_LOCATION) + if (myProgramID == NO_PROGRAM || theLocation == INVALID_LOCATION) { - return Standard_False; + return false; } #if !defined(GL_ES_VERSION_2_0) - theCtx->core32->glUniform2uiv (theLocation, theCount, theValue->GetData()); - return Standard_True; + if (theCtx->core32 != NULL) + { + theCtx->core32->glUniform2uiv (theLocation, theCount, theValue->GetData()); + return true; + } #else - (void )theCount; - (void )theValue; - return Standard_False; + if (theCtx->core30fwd != NULL) + { + theCtx->core30fwd->glUniform2uiv (theLocation, theCount, theValue->GetData()); + return true; + } #endif + return false; } // ======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderProgram.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderProgram.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderProgram.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderProgram.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -62,8 +63,10 @@ // Material state OpenGl_OCCT_TEXTURE_ENABLE, OpenGl_OCCT_DISTINGUISH_MODE, - OpenGl_OCCT_FRONT_MATERIAL, - OpenGl_OCCT_BACK_MATERIAL, + OpenGl_OCCT_PBR_FRONT_MATERIAL, + OpenGl_OCCT_PBR_BACK_MATERIAL, + OpenGl_OCCT_COMMON_FRONT_MATERIAL, + OpenGl_OCCT_COMMON_BACK_MATERIAL, OpenGl_OCCT_ALPHA_CUTOFF, OpenGl_OCCT_COLOR, @@ -88,6 +91,9 @@ OpenGl_OCCT_ORTHO_SCALE, OpenGl_OCCT_SILHOUETTE_THICKNESS, + // PBR state + OpenGl_OCCT_NB_SPEC_IBL_LEVELS, + // DON'T MODIFY THIS ITEM (insert new items before it) OpenGl_OCCT_NUMBER_OF_STATE_VARIABLES }; @@ -253,6 +259,9 @@ //! Fetches uniform variables from proxy shader program. Standard_EXPORT Standard_Boolean ApplyVariables (const Handle(OpenGl_Context)& theCtx); + + //! @return proxy shader program. + const Handle(Graphic3d_ShaderProgram)& Proxy() const { return myProxy; } //! @return true if current object was initialized inline bool IsValid() const @@ -289,6 +298,9 @@ //! Return true if Fragment Shader color should output the weighted OIT coverage; FALSE by default. Standard_Boolean HasWeightOitOutput() const { return myHasWeightOitOutput; } + //! Return texture units declared within the program, @sa Graphic3d_TextureSetBits. + Standard_Integer TextureSetBits() const { return myTextureSetBits; } + private: //! Returns index of last modification of variables of specified state type. @@ -651,6 +663,7 @@ Standard_Integer myNbLightsMax; //!< length of array of light sources (THE_MAX_LIGHTS) Standard_Integer myNbClipPlanesMax; //!< length of array of clipping planes (THE_MAX_CLIP_PLANES) Standard_Integer myNbFragOutputs; //!< length of array of Fragment Shader outputs (THE_NB_FRAG_OUTPUTS) + Standard_Integer myTextureSetBits;//!< texture units declared within the program, @sa Graphic3d_TextureSetBits Standard_Boolean myHasAlphaTest; //!< flag indicating that Fragment Shader should perform alpha-test Standard_Boolean myHasWeightOitOutput; //!< flag indicating that Fragment Shader includes weighted OIT coverage Standard_Boolean myHasTessShader; //!< flag indicating that program defines tessellation stage diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderStates.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderStates.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderStates.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderStates.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,27 +46,16 @@ } // ======================================================================= -// function : ProjectionMatrix -// purpose : Returns current projection matrix -// ======================================================================= -const OpenGl_Mat4& OpenGl_ProjectionState::ProjectionMatrix() const -{ - return myProjectionMatrix; -} - -// ======================================================================= // function : ProjectionMatrixInverse // purpose : Returns inverse of current projection matrix // ======================================================================= const OpenGl_Mat4& OpenGl_ProjectionState::ProjectionMatrixInverse() const { - if (!myInverseNeedUpdate) + if (myInverseNeedUpdate) { - return myProjectionMatrixInverse; + myInverseNeedUpdate = false; + myProjectionMatrix.Inverted (myProjectionMatrixInverse); } - - myProjectionMatrix.Inverted (myProjectionMatrixInverse); - return myProjectionMatrixInverse; } @@ -91,27 +80,16 @@ } // ======================================================================= -// function : ModelWorldMatrix -// purpose : Returns current model-world matrix -// ======================================================================= -const OpenGl_Mat4& OpenGl_ModelWorldState::ModelWorldMatrix() const -{ - return myModelWorldMatrix; -} - -// ======================================================================= // function : ModelWorldMatrixInverse // purpose : Returns inverse of current model-world matrix // ======================================================================= const OpenGl_Mat4& OpenGl_ModelWorldState::ModelWorldMatrixInverse() const { - if (!myInverseNeedUpdate) + if (myInverseNeedUpdate) { - return myModelWorldMatrix; + myInverseNeedUpdate = false; + myModelWorldMatrix.Inverted (myModelWorldMatrixInverse); } - - myModelWorldMatrix.Inverted (myModelWorldMatrixInverse); - return myModelWorldMatrixInverse; } @@ -136,27 +114,16 @@ } // ======================================================================= -// function : WorldViewMatrix -// purpose : Returns current world-view matrix -// ======================================================================= -const OpenGl_Mat4& OpenGl_WorldViewState::WorldViewMatrix() const -{ - return myWorldViewMatrix; -} - -// ======================================================================= // function : WorldViewMatrixInverse // purpose : Returns inverse of current world-view matrix // ======================================================================= const OpenGl_Mat4& OpenGl_WorldViewState::WorldViewMatrixInverse() const { - if (!myInverseNeedUpdate) + if (myInverseNeedUpdate) { - return myWorldViewMatrix; + myInverseNeedUpdate = false; + myWorldViewMatrix.Inverted (myWorldViewMatrixInverse); } - - myWorldViewMatrix.Inverted (myWorldViewMatrixInverse); - return myWorldViewMatrixInverse; } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderStates.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderStates.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_ShaderStates.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_ShaderStates.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -53,7 +53,7 @@ Standard_EXPORT void Set (const OpenGl_Mat4& theProjectionMatrix); //! Returns current projection matrix. - Standard_EXPORT const OpenGl_Mat4& ProjectionMatrix() const; + const OpenGl_Mat4& ProjectionMatrix() const { return myProjectionMatrix; } //! Returns inverse of current projection matrix. Standard_EXPORT const OpenGl_Mat4& ProjectionMatrixInverse() const; @@ -62,7 +62,7 @@ OpenGl_Mat4 myProjectionMatrix; //!< OCCT projection matrix mutable OpenGl_Mat4 myProjectionMatrixInverse; //!< Inverse of OCCT projection matrix - bool myInverseNeedUpdate; //!< Is inversed matrix outdated? + mutable bool myInverseNeedUpdate; //!< Is inversed matrix outdated? }; @@ -78,7 +78,7 @@ Standard_EXPORT void Set (const OpenGl_Mat4& theModelWorldMatrix); //! Returns current model-world matrix. - Standard_EXPORT const OpenGl_Mat4& ModelWorldMatrix() const; + const OpenGl_Mat4& ModelWorldMatrix() const { return myModelWorldMatrix; } //! Returns inverse of current model-world matrix. Standard_EXPORT const OpenGl_Mat4& ModelWorldMatrixInverse() const; @@ -87,7 +87,7 @@ OpenGl_Mat4 myModelWorldMatrix; //!< OCCT model-world matrix mutable OpenGl_Mat4 myModelWorldMatrixInverse; //!< Inverse of OCCT model-world matrix - bool myInverseNeedUpdate; //!< Is inversed matrix outdated? + mutable bool myInverseNeedUpdate; //!< Is inversed matrix outdated? }; @@ -103,7 +103,7 @@ Standard_EXPORT void Set (const OpenGl_Mat4& theWorldViewMatrix); //! Returns current world-view matrix. - Standard_EXPORT const OpenGl_Mat4& WorldViewMatrix() const; + const OpenGl_Mat4& WorldViewMatrix() const { return myWorldViewMatrix; } //! Returns inverse of current world-view matrix. Standard_EXPORT const OpenGl_Mat4& WorldViewMatrixInverse() const; @@ -112,7 +112,7 @@ OpenGl_Mat4 myWorldViewMatrix; //!< OCCT world-view matrix mutable OpenGl_Mat4 myWorldViewMatrixInverse; //!< Inverse of OCCT world-view matrix - bool myInverseNeedUpdate; //!< Is inversed matrix outdated? + mutable bool myInverseNeedUpdate; //!< Is inversed matrix outdated? }; @@ -122,7 +122,7 @@ public: //! Creates uninitialized state of light sources. - OpenGl_LightSourceState() {} + OpenGl_LightSourceState() : mySpecIBLMapLevels (0) {} //! Sets new light sources. void Set (const Handle(Graphic3d_LightSet)& theLightSources) { myLightSources = theLightSources; } @@ -130,9 +130,17 @@ //! Returns current list of light sources. const Handle(Graphic3d_LightSet)& LightSources() const { return myLightSources; } + //! Returns number of mipmap levels used in specular IBL map. + //! 0 by default or in case of using non-PBR shading model. + Standard_Integer SpecIBLMapLevels() const { return mySpecIBLMapLevels; } + + //! Sets number of mipmap levels used in specular IBL map. + void SetSpecIBLMapLevels(Standard_Integer theSpecIBLMapLevels) { mySpecIBLMapLevels = theSpecIBLMapLevels; } + private: - Handle(Graphic3d_LightSet) myLightSources; //!< List of OCCT light sources + Handle(Graphic3d_LightSet) myLightSources; //!< List of OCCT light sources + Standard_Integer mySpecIBLMapLevels; //!< Number of mipmap levels used in specular IBL map (0 by default or in case of using non-PBR shading model) }; diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_StencilTest.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_StencilTest.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_StencilTest.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_StencilTest.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,6 +15,7 @@ #include #include +#include OpenGl_StencilTest::OpenGl_StencilTest() { @@ -64,3 +65,15 @@ { // } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_StencilTest::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_StencilTest) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, OpenGl_Element) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsEnabled) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_StencilTest.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_StencilTest.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_StencilTest.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_StencilTest.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,19 +23,22 @@ public: //! Default constructor - OpenGl_StencilTest (); + Standard_EXPORT OpenGl_StencilTest (); //! Render primitives to the window - virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; + Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE; - virtual void Release (OpenGl_Context* theContext); + Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE; - void SetOptions (const Standard_Boolean theIsEnabled); + Standard_EXPORT void SetOptions (const Standard_Boolean theIsEnabled); + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: //! Destructor - virtual ~OpenGl_StencilTest(); + Standard_EXPORT virtual ~OpenGl_StencilTest(); private: Standard_Boolean myIsEnabled; diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Structure.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Structure.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Structure.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Structure.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,7 +39,7 @@ } const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext(); - const Handle(OpenGl_TextureSet) aPrevTexture = aCtx->BindTextures (Handle(OpenGl_TextureSet)()); + const Handle(OpenGl_TextureSet) aPrevTexture = aCtx->BindTextures (Handle(OpenGl_TextureSet)(), Handle(OpenGl_ShaderProgram)()); const Graphic3d_ZLayerSettings& aLayer = myGraphicDriver->ZLayerSettings (myZLayer); const Graphic3d_Vec3d aMoveVec = myTrsfPers.IsNull() && !aLayer.OriginTransformation().IsNull() @@ -95,7 +95,7 @@ aCtx->core11->glDisableClientState (GL_VERTEX_ARRAY); } #endif - aCtx->BindTextures (aPrevTexture); + aCtx->BindTextures (aPrevTexture, Handle(OpenGl_ShaderProgram)()); } // ======================================================================= @@ -135,16 +135,17 @@ // function : SetTransformation // purpose : // ======================================================================= -void OpenGl_Structure::SetTransformation (const Handle(Geom_Transformation)& theTrsf) +void OpenGl_Structure::SetTransformation (const Handle(TopLoc_Datum3D)& theTrsf) { myTrsf = theTrsf; myIsMirrored = Standard_False; if (!myTrsf.IsNull()) { // Determinant of transform matrix less then 0 means that mirror transform applied. - const Standard_Real aDet = myTrsf->Value(1, 1) * (myTrsf->Value (2, 2) * myTrsf->Value (3, 3) - myTrsf->Value (3, 2) * myTrsf->Value (2, 3)) - - myTrsf->Value(1, 2) * (myTrsf->Value (2, 1) * myTrsf->Value (3, 3) - myTrsf->Value (3, 1) * myTrsf->Value (2, 3)) - + myTrsf->Value(1, 3) * (myTrsf->Value (2, 1) * myTrsf->Value (3, 2) - myTrsf->Value (3, 1) * myTrsf->Value (2, 2)); + const gp_Trsf& aTrsf = myTrsf->Transformation(); + const Standard_Real aDet = aTrsf.Value(1, 1) * (aTrsf.Value (2, 2) * aTrsf.Value (3, 3) - aTrsf.Value (3, 2) * aTrsf.Value (2, 3)) + - aTrsf.Value(1, 2) * (aTrsf.Value (2, 1) * aTrsf.Value (3, 3) - aTrsf.Value (3, 1) * aTrsf.Value (2, 3)) + + aTrsf.Value(1, 3) * (aTrsf.Value (2, 1) * aTrsf.Value (3, 2) - aTrsf.Value (3, 1) * aTrsf.Value (2, 2)); myIsMirrored = aDet < 0.0; } @@ -426,7 +427,7 @@ if (aCtx->core11 != NULL && !myTrsf.IsNull()) { - const Standard_Real aScale = myTrsf->ScaleFactor(); + const Standard_Real aScale = myTrsf->Trsf().ScaleFactor(); if (Abs (aScale - 1.0) > Precision::Confusion()) { aCtx->SetGlNormalizeEnabled (Standard_True); @@ -438,7 +439,7 @@ { aCtx->WorldViewState.Push(); OpenGl_Mat4& aWorldView = aCtx->WorldViewState.ChangeCurrent(); - myTrsfPers->Apply (theWorkspace->View()->Camera(), + myTrsfPers->Apply (aCtx->Camera(), aCtx->ProjectionState.Current(), aWorldView, aCtx->VirtualViewport()[2], aCtx->VirtualViewport()[3]); @@ -639,3 +640,20 @@ { return new OpenGl_StructureShadow (theManager, this); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void OpenGl_Structure::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Graphic3d_CStructure) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myInstancedStructure) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsRaytracable) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myModificationState) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsMirrored) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Structure.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Structure.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Structure.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Structure.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,7 +65,7 @@ Standard_EXPORT virtual void Disconnect (Graphic3d_CStructure& theStructure) Standard_OVERRIDE; //! Synchronize structure transformation - Standard_EXPORT virtual void SetTransformation (const Handle(Geom_Transformation)& theTrsf) Standard_OVERRIDE; + Standard_EXPORT virtual void SetTransformation (const Handle(TopLoc_Datum3D)& theTrsf) Standard_OVERRIDE; //! Set transformation persistence. Standard_EXPORT virtual void SetTransformPersistence (const Handle(Graphic3d_TransformPers)& theTrsfPers) Standard_OVERRIDE; @@ -100,10 +100,10 @@ Standard_EXPORT void Clear (const Handle(OpenGl_Context)& theGlCtx); //! Renders the structure. - virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; + Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; //! Releases structure resources. - virtual void Release (const Handle(OpenGl_Context)& theGlCtx); + Standard_EXPORT virtual void Release (const Handle(OpenGl_Context)& theGlCtx); //! This method releases GL resources without actual elements destruction. //! As result structure could be correctly destroyed layer without GL context @@ -128,6 +128,9 @@ //! Update render transformation matrix. Standard_EXPORT virtual void updateLayerTransformation() Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: Standard_EXPORT virtual ~OpenGl_Structure(); diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_StructureShadow.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_StructureShadow.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_StructureShadow.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_StructureShadow.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,10 +31,10 @@ public: //! Raise exception on API misuse. - virtual void Connect (Graphic3d_CStructure& ) Standard_OVERRIDE; + Standard_EXPORT virtual void Connect (Graphic3d_CStructure& ) Standard_OVERRIDE; //! Raise exception on API misuse. - virtual void Disconnect (Graphic3d_CStructure& ) Standard_OVERRIDE; + Standard_EXPORT virtual void Disconnect (Graphic3d_CStructure& ) Standard_OVERRIDE; private: diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextBuilder.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextBuilder.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextBuilder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #include #include +#include namespace { @@ -44,7 +45,7 @@ // function : createGlyphs // purpose : // ======================================================================= -void OpenGl_TextBuilder::createGlyphs (const Font_TextFormatter& theFormatter, +void OpenGl_TextBuilder::createGlyphs (const Handle(Font_TextFormatter)& theFormatter, const Handle(OpenGl_Context)& theCtx, OpenGl_Font& theFont, NCollection_Vector& theTextures, @@ -58,51 +59,16 @@ theTCrdsPerTexture.Clear(); OpenGl_Font::Tile aTile = {Font_Rect(), Font_Rect(), 0u}; - OpenGl_Vec2 aPen (0.0f, 0.0f); - Standard_Integer aRectsNb = 0; - Standard_Integer aSymbolsCounter = 0; - - for (NCollection_Utf8Iter anIter = theFormatter.String().Iterator(); *anIter != 0;) + for (Font_TextFormatter::Iterator aFormatterIt (*theFormatter, Font_TextFormatter::IterationFilter_ExcludeInvisible); + aFormatterIt.More(); aFormatterIt.Next()) { - const Standard_Utf32Char aCharThis = *anIter; - const Standard_Utf32Char aCharNext = *++anIter; + theFont.RenderGlyph (theCtx, aFormatterIt.Symbol(), aTile); - if (aCharThis == '\x0D' // CR (carriage return) - || aCharThis == '\a' // BEL (alarm) - || aCharThis == '\f' // FF (form feed) NP (new page) - || aCharThis == '\b' // BS (backspace) - || aCharThis == '\v') // VT (vertical tab) - { - continue; // skip unsupported carriage control codes - } - else if (aCharThis == '\x0A') // LF (line feed, new line) - { - aSymbolsCounter = 0; - continue; // will be processed on second pass - } - else if (aCharThis == ' ') - { - ++aSymbolsCounter; - aPen.x() += theFont.FTFont()->AdvanceX (' ', aCharNext); - continue; - } - else if (aCharThis == '\t') - { - const Standard_Integer aSpacesNum = (theFormatter.TabSize() - (aSymbolsCounter - 1) % theFormatter.TabSize()); - aPen.x() += theFont.FTFont()->AdvanceX (' ', aCharNext) * Standard_ShortReal(aSpacesNum); - aSymbolsCounter += aSpacesNum; - continue; - } - - ++aSymbolsCounter; - - theFont.RenderGlyph (theCtx, aCharThis, aTile); - - const OpenGl_Vec2& aTopLeft = theFormatter.TopLeft (aRectsNb); - aTile.px.Right += aTopLeft.x(); - aTile.px.Left += aTopLeft.x(); - aTile.px.Bottom += aTopLeft.y(); - aTile.px.Top += aTopLeft.y(); + const OpenGl_Vec2& aBottomLeft = theFormatter->BottomLeft (aFormatterIt.SymbolPosition()); + aTile.px.Right += aBottomLeft.x(); + aTile.px.Left += aBottomLeft.x(); + aTile.px.Bottom += aBottomLeft.y(); + aTile.px.Top += aBottomLeft.y(); const Font_Rect& aRectUV = aTile.uv; const GLuint aTexture = aTile.texture; @@ -139,8 +105,6 @@ aTCrds.Append (aRectUV.BottomRight (aVec)); aTCrds.Append (aRectUV.TopRight (aVec)); aTCrds.Append (aRectUV.BottomLeft (aVec)); - - ++aRectsNb; } } @@ -148,7 +112,7 @@ // function : CreateTextures // purpose : // ======================================================================= -void OpenGl_TextBuilder::Perform (const Font_TextFormatter& theFormatter, +void OpenGl_TextBuilder::Perform (const Handle(Font_TextFormatter)& theFormatter, const Handle(OpenGl_Context)& theCtx, OpenGl_Font& theFont, NCollection_Vector& theTextures, diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextBuilder.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextBuilder.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextBuilder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextBuilder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,8 +16,6 @@ #ifndef OpenGl_TextBuilder_Header #define OpenGl_TextBuilder_Header -#include - #include #include #include @@ -27,6 +25,7 @@ #include #include +class Font_TextFormatter; //! This class generates primitive array required for rendering textured text using OpenGl_Font instance. class OpenGl_TextBuilder @@ -37,7 +36,7 @@ Standard_EXPORT OpenGl_TextBuilder(); //! Creates texture quads for the given text. - Standard_EXPORT void Perform (const Font_TextFormatter& theFormatter, + Standard_EXPORT void Perform (const Handle(Font_TextFormatter)& theFormatter, const Handle(OpenGl_Context)& theContext, OpenGl_Font& theFont, NCollection_Vector& theTextures, @@ -46,7 +45,7 @@ protected: //! @name class auxillary methods - Standard_EXPORT void createGlyphs (const Font_TextFormatter& theFormatter, + Standard_EXPORT void createGlyphs (const Handle(Font_TextFormatter)& theFormatter, const Handle(OpenGl_Context)& theCtx, OpenGl_Font& theFont, NCollection_Vector& theTextures, diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Text.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Text.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Text.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Text.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -207,6 +208,52 @@ } // ======================================================================= +// function : EstimatedDataSize +// purpose : +// ======================================================================= +Standard_Size OpenGl_Text::EstimatedDataSize() const +{ + Standard_Size aSize = 0; + for (Standard_Integer anIter = myVertsVbo.Lower(); anIter <= myVertsVbo.Upper(); ++anIter) + { + if (const Handle(OpenGl_VertexBuffer)& aVerts = myVertsVbo.Value (anIter)) + { + aSize += aVerts->EstimatedDataSize(); + } + if (const Handle(OpenGl_VertexBuffer)& aTCrds = myTCrdsVbo.Value (anIter)) + { + aSize += aTCrds->EstimatedDataSize(); + } + } + if (!myBndVertsVbo.IsNull()) + { + aSize += myBndVertsVbo->EstimatedDataSize(); + } + return aSize; +} + +// ======================================================================= +// function : UpdateDrawStats +// purpose : +// ======================================================================= +void OpenGl_Text::UpdateDrawStats (Graphic3d_FrameStatsDataTmp& theStats, + bool theIsDetailed) const +{ + ++theStats[Graphic3d_FrameStatsCounter_NbElemsNotCulled]; + ++theStats[Graphic3d_FrameStatsCounter_NbElemsTextNotCulled]; + if (theIsDetailed) + { + for (Standard_Integer anIter = myVertsVbo.Lower(); anIter <= myVertsVbo.Upper(); ++anIter) + { + if (const Handle(OpenGl_VertexBuffer)& aVerts = myVertsVbo.Value (anIter)) + { + theStats[Graphic3d_FrameStatsCounter_NbTrianglesNotCulled] += aVerts->GetElemsNb() / 3; // 2 non-indexed triangles per glyph + } + } + } +} + +// ======================================================================= // function : StringSize // purpose : // ======================================================================= @@ -278,16 +325,16 @@ // ======================================================================= void OpenGl_Text::Render (const Handle(OpenGl_Workspace)& theWorkspace) const { - const OpenGl_Aspects* aTextAspect = theWorkspace->ApplyAspects(); + const OpenGl_Aspects* aTextAspect = theWorkspace->ApplyAspects (false); // do not bind textures as they will be disabled anyway const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext(); - const Handle(OpenGl_TextureSet) aPrevTexture = aCtx->BindTextures (Handle(OpenGl_TextureSet)()); // Bind custom shader program or generate default version aCtx->ShaderManager()->BindFontProgram (aTextAspect->ShaderProgramRes (aCtx)); + const Handle(OpenGl_TextureSet) aPrevTexture = aCtx->BindTextures (Handle(OpenGl_TextureSet)(), Handle(OpenGl_ShaderProgram)()); if (myText->HasPlane() && myText->HasOwnAnchorPoint()) { - myOrientationMatrix = theWorkspace->View()->Camera()->OrientationMatrix(); + myOrientationMatrix = aCtx->Camera()->OrientationMatrix(); // reset translation part myOrientationMatrix.ChangeValue (0, 3) = 0.0; myOrientationMatrix.ChangeValue (1, 3) = 0.0; @@ -306,7 +353,7 @@ // restore aspects if (!aPrevTexture.IsNull()) { - aCtx->BindTextures (aPrevTexture); + aCtx->BindTextures (aPrevTexture, Handle(OpenGl_ShaderProgram)()); } // restore Z buffer settings @@ -426,6 +473,12 @@ { OpenGl_Mat4d aCurrentWorldViewMat; aCurrentWorldViewMat.Convert (theCtx->WorldViewState.Current()); + + // apply local transformation + OpenGl_Mat4d aModelWorld; + aModelWorld.Convert (theCtx->ModelWorldState.Current()); + aCurrentWorldViewMat = aCurrentWorldViewMat * aModelWorld; + theCtx->WorldViewState.SetCurrent (aCurrentWorldViewMat * aModViewMat); } else @@ -607,7 +660,7 @@ const OpenGl_Vec4& theColorSubs, unsigned int theResolution) const { - if (myText->Text().IsEmpty()) + if (myText->Text().IsEmpty() && myText->TextFormatter().IsNull()) { return; } @@ -633,13 +686,16 @@ if (myTextures.IsEmpty()) { - Font_TextFormatter aFormatter; - - aFormatter.SetupAlignment (myText->HorizontalAlignment(), myText->VerticalAlignment()); - aFormatter.Reset(); + Handle(Font_TextFormatter) aFormatter = myText->TextFormatter(); + if (aFormatter.IsNull()) + { + aFormatter = new Font_TextFormatter(); + } + aFormatter->SetupAlignment (myText->HorizontalAlignment(), myText->VerticalAlignment()); + aFormatter->Reset(); - aFormatter.Append (myText->Text(), *myFont->FTFont()); - aFormatter.Format(); + aFormatter->Append (myText->Text(), *myFont->FTFont()); + aFormatter->Format(); OpenGl_TextBuilder aBuilder; aBuilder.Perform (aFormatter, @@ -649,7 +705,7 @@ myVertsVbo, myTCrdsVbo); - aFormatter.BndBox (myBndBox); + aFormatter->BndBox (myBndBox); if (!myBndVertsVbo.IsNull()) { myBndVertsVbo->Release (theCtx.get()); @@ -833,3 +889,23 @@ theCtx->WorldViewState.Pop(); theCtx->ApplyModelViewMatrix(); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_Text::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, OpenGl_Text) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, OpenGl_Element) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTextures.Size()) + + for (NCollection_Vector::Iterator aCrdsIt (myTCrdsVbo); aCrdsIt.More(); aCrdsIt.Next()) + { + const Handle(OpenGl_VertexBuffer)& aVertexBuffer = aCrdsIt.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aVertexBuffer.get()) + } + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBndBox) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Text.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Text.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Text.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Text.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,8 +65,15 @@ Standard_EXPORT void SetFontSize (const Handle(OpenGl_Context)& theContext, const Standard_Integer theFontSize); - Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; - Standard_EXPORT virtual void Release (OpenGl_Context* theContext); + Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE; + Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE; + + //! Returns estimated GPU memory usage for holding data without considering overheads and allocation alignment rules. + Standard_EXPORT virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE; + + //! Increment draw calls statistics. + Standard_EXPORT virtual void UpdateDrawStats (Graphic3d_FrameStatsDataTmp& theStats, + bool theIsDetailed) const Standard_OVERRIDE; public: //! @name methods for compatibility with layers @@ -100,6 +107,9 @@ const OpenGl_Aspects& theTextAspect, unsigned int theResolution = Graphic3d_RenderingParams::THE_DEFAULT_RESOLUTION) const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + //! @name obsolete methods public: diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Texture.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Texture.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Texture.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Texture.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,10 +21,15 @@ #include #include #include +#include #include +#include IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Texture, OpenGl_NamedResource) +namespace +{ + //! Simple class to reset unpack alignment settings struct OpenGl_UnpackAlignmentSentry { @@ -47,6 +52,43 @@ }; +//! Compute the upper mipmap level for complete mipmap set (e.g. till the 1x1 level). +static Standard_Integer computeUpperMipMapLevel (Standard_Integer theSize) +{ + for (Standard_Integer aMipIter = 0;; ++aMipIter, theSize /= 2) + { + if (theSize <= 1) + { + return aMipIter; + } + } +} + +//! Compute the upper mipmap level for complete mipmap set (e.g. till the 1x1 level). +static Standard_Integer computeUpperMipMapLevel (Standard_Integer theSizeX, Standard_Integer theSizeY) +{ + return computeUpperMipMapLevel (Max (theSizeX, theSizeY)); +} + +//! Compute size of the smallest defined mipmap level (for verbose messages). +static Graphic3d_Vec2i computeSmallestMipMapSize (const Graphic3d_Vec2i& theBaseSize, Standard_Integer theMaxLevel) +{ + Graphic3d_Vec2i aMipSizeXY = theBaseSize; + for (Standard_Integer aMipIter = 0;; ++aMipIter) + { + if (aMipIter > theMaxLevel) + { + return aMipSizeXY; + } + + aMipSizeXY /= 2; + if (aMipSizeXY.x() == 0) { aMipSizeXY.x() = 1; } + if (aMipSizeXY.y() == 0) { aMipSizeXY.y() = 1; } + } +} + +} + // ======================================================================= // function : OpenGl_Texture // purpose : @@ -64,8 +106,9 @@ myTextFormat (GL_RGBA), mySizedFormat(GL_RGBA8), myNbSamples (1), - myHasMipmaps (Standard_False), - myIsAlpha (false) + myMaxMipLevel(0), + myIsAlpha (false), + myIsTopDown (true) { // } @@ -130,10 +173,10 @@ // ======================================================================= void OpenGl_Texture::applyDefaultSamplerParams (const Handle(OpenGl_Context)& theCtx) { - OpenGl_Sampler::applySamplerParams (theCtx, mySampler->Parameters(), NULL, myTarget, myHasMipmaps); + OpenGl_Sampler::applySamplerParams (theCtx, mySampler->Parameters(), NULL, myTarget, myMaxMipLevel); if (mySampler->IsValid() && !mySampler->IsImmutable()) { - OpenGl_Sampler::applySamplerParams (theCtx, mySampler->Parameters(), mySampler.get(), myTarget, myHasMipmaps); + OpenGl_Sampler::applySamplerParams (theCtx, mySampler->Parameters(), mySampler.get(), myTarget, myMaxMipLevel); } } @@ -177,240 +220,22 @@ && mySampler->Init (theCtx, *this); } -//======================================================================= -//function : GetDataFormat -//purpose : -//======================================================================= -bool OpenGl_Texture::GetDataFormat (const Handle(OpenGl_Context)& theCtx, - const Image_Format theFormat, - GLint& theTextFormat, - GLenum& thePixelFormat, - GLenum& theDataType) -{ - theTextFormat = GL_RGBA8; - thePixelFormat = 0; - theDataType = 0; - switch (theFormat) - { - case Image_Format_GrayF: - { - if (theCtx->core11 == NULL) - { - theTextFormat = GL_R8; // GL_R32F - thePixelFormat = GL_RED; - } - else - { - #if !defined(GL_ES_VERSION_2_0) - theTextFormat = GL_LUMINANCE8; - #else - theTextFormat = GL_LUMINANCE; - #endif - thePixelFormat = GL_LUMINANCE; - } - theDataType = GL_FLOAT; - return true; - } - case Image_Format_AlphaF: - { - if (theCtx->core11 == NULL) - { - theTextFormat = GL_R8; // GL_R32F - thePixelFormat = GL_RED; - } - else - { - #if !defined(GL_ES_VERSION_2_0) - theTextFormat = GL_ALPHA8; - #else - theTextFormat = GL_ALPHA; - #endif - thePixelFormat = GL_ALPHA; - } - theDataType = GL_FLOAT; - return true; - } - case Image_Format_RGBAF: - { - theTextFormat = GL_RGBA8; // GL_RGBA32F - thePixelFormat = GL_RGBA; - theDataType = GL_FLOAT; - return true; - } - case Image_Format_BGRAF: - { - if (!theCtx->IsGlGreaterEqual (1, 2) && !theCtx->extBgra) - { - return false; - } - theTextFormat = GL_RGBA8; // GL_RGBA32F - thePixelFormat = GL_BGRA_EXT; // equals to GL_BGRA - theDataType = GL_FLOAT; - return true; - } - case Image_Format_RGBF: - { - theTextFormat = GL_RGB8; // GL_RGB32F - thePixelFormat = GL_RGB; - theDataType = GL_FLOAT; - return true; - } - case Image_Format_BGRF: - { - #if !defined(GL_ES_VERSION_2_0) - theTextFormat = GL_RGB8; // GL_RGB32F - thePixelFormat = GL_BGR; // equals to GL_BGR_EXT - theDataType = GL_FLOAT; - return true; - #else - return false; - #endif - } - case Image_Format_RGBA: - { - theTextFormat = GL_RGBA8; - thePixelFormat = GL_RGBA; - theDataType = GL_UNSIGNED_BYTE; - return true; - } - case Image_Format_BGRA: - { - #if !defined(GL_ES_VERSION_2_0) - if (!theCtx->IsGlGreaterEqual (1, 2) && !theCtx->extBgra) - { - return false; - } - theTextFormat = GL_RGBA8; - #else - if (!theCtx->extBgra) - { - return false; - } - theTextFormat = GL_BGRA_EXT; - #endif - thePixelFormat = GL_BGRA_EXT; // equals to GL_BGRA - theDataType = GL_UNSIGNED_BYTE; - return true; - } - case Image_Format_RGB32: - { - #if !defined(GL_ES_VERSION_2_0) - // ask driver to convert data to RGB8 to save memory - theTextFormat = GL_RGB8; - #else - // conversion is not supported - theTextFormat = GL_RGBA8; - #endif - thePixelFormat = GL_RGBA; - theDataType = GL_UNSIGNED_BYTE; - return true; - } - case Image_Format_BGR32: - { - #if !defined(GL_ES_VERSION_2_0) - if (!theCtx->IsGlGreaterEqual(1, 2) && !theCtx->extBgra) - { - return false; - } - theTextFormat = GL_RGB8; - #else - if (!theCtx->extBgra) - { - return false; - } - theTextFormat = GL_BGRA_EXT; - #endif - thePixelFormat = GL_BGRA_EXT; // equals to GL_BGRA - theDataType = GL_UNSIGNED_BYTE; - return true; - } - case Image_Format_RGB: - { - theTextFormat = GL_RGB8; - thePixelFormat = GL_RGB; - theDataType = GL_UNSIGNED_BYTE; - return true; - } - case Image_Format_BGR: - { - #if !defined(GL_ES_VERSION_2_0) - if (!theCtx->IsGlGreaterEqual (1, 2) && !theCtx->extBgra) - { - return false; - } - theTextFormat = GL_RGB8; - thePixelFormat = GL_BGR; // equals to GL_BGR_EXT - theDataType = GL_UNSIGNED_BYTE; - return true; - #else - return false; - #endif - } - case Image_Format_Gray: - { - if (theCtx->core11 == NULL) - { - theTextFormat = GL_R8; - thePixelFormat = GL_RED; - } - else - { - #if !defined(GL_ES_VERSION_2_0) - theTextFormat = GL_LUMINANCE8; - #else - theTextFormat = GL_LUMINANCE; - #endif - thePixelFormat = GL_LUMINANCE; - } - theDataType = GL_UNSIGNED_BYTE; - return true; - } - case Image_Format_Alpha: - { - if (theCtx->core11 == NULL) - { - theTextFormat = GL_R8; - thePixelFormat = GL_RED; - } - else - { - #if !defined(GL_ES_VERSION_2_0) - theTextFormat = GL_ALPHA8; - #else - theTextFormat = GL_ALPHA; - #endif - thePixelFormat = GL_ALPHA; - } - theDataType = GL_UNSIGNED_BYTE; - return true; - } - case Image_Format_UNKNOWN: - { - return false; - } - } - return false; -} - // ======================================================================= // function : Init // purpose : // ======================================================================= bool OpenGl_Texture::Init (const Handle(OpenGl_Context)& theCtx, - const Standard_Integer theTextFormat, - const GLenum thePixelFormat, - const GLenum theDataType, - const Standard_Integer theSizeX, - const Standard_Integer theSizeY, + const OpenGl_TextureFormat& theFormat, + const Graphic3d_Vec2i& theSizeXY, const Graphic3d_TypeOfTexture theType, const Image_PixMap* theImage) { - if (theSizeX < 1 - || theSizeY < 1) + if (theSizeXY.x() < 1 + || theSizeXY.y() < 1) { theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, "Error: texture of 0 size cannot be created."); - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } @@ -421,16 +246,15 @@ #else const GLenum aTarget = GL_TEXTURE_2D; #endif - const Standard_Boolean toCreateMipMaps = (theType == Graphic3d_TOT_2D_MIPMAP); const bool toPatchExisting = IsValid() - && myTextFormat == thePixelFormat + && myTextFormat == theFormat.PixelFormat() && myTarget == aTarget - && myHasMipmaps == toCreateMipMaps - && mySizeX == theSizeX - && (mySizeY == theSizeY || theType == Graphic3d_TOT_1D); + && HasMipmaps() == (theType == Graphic3d_TOT_2D_MIPMAP) + && mySizeX == theSizeXY.x() + && (mySizeY == theSizeXY.y() || theType == Graphic3d_TOT_1D); if (!Create (theCtx)) { - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } @@ -438,40 +262,43 @@ { myIsAlpha = theImage->Format() == Image_Format_Alpha || theImage->Format() == Image_Format_AlphaF; + myIsTopDown = theImage->IsTopDown(); } else { - myIsAlpha = thePixelFormat == GL_ALPHA; + myIsAlpha = theFormat.PixelFormat() == GL_ALPHA; } - myHasMipmaps = toCreateMipMaps; - myTextFormat = thePixelFormat; - mySizedFormat = theTextFormat; - myNbSamples = 1; + myMaxMipLevel = theType == Graphic3d_TOT_2D_MIPMAP && theCtx->arbFBO != NULL + ? computeUpperMipMapLevel (theSizeXY.x(), theSizeXY.y()) + : 0; + myTextFormat = theFormat.PixelFormat(); + mySizedFormat = theFormat.InternalFormat(); + myNbSamples = 1; #if !defined(GL_ES_VERSION_2_0) - const GLint anIntFormat = theTextFormat; + const GLint anIntFormat = theFormat.InternalFormat(); #else // ES 2.0 does not support sized formats and format conversions - them detected from data type - const GLint anIntFormat = theCtx->IsGlGreaterEqual (3, 0) ? theTextFormat : thePixelFormat; + const GLint anIntFormat = theCtx->IsGlGreaterEqual (3, 0) ? theFormat.InternalFormat() : theFormat.PixelFormat(); #endif - if (theDataType == GL_FLOAT && !theCtx->arbTexFloat) + if (theFormat.DataType() == GL_FLOAT + && !theCtx->arbTexFloat) { theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, "Error: floating-point textures are not supported by hardware."); - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } const GLsizei aMaxSize = theCtx->MaxTextureSize(); - if (theSizeX > aMaxSize - || theSizeY > aMaxSize) + if (theSizeXY.x() > aMaxSize + || theSizeXY.y() > aMaxSize) { - TCollection_ExtendedString aWarnMessage = TCollection_ExtendedString ("Error: Texture dimension - ") - + theSizeX + "x" + theSizeY + " exceeds hardware limits (" + aMaxSize + "x" + aMaxSize + ")"; - - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, aWarnMessage); - Release (theCtx.operator->()); + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString ("Error: Texture dimension - ") + theSizeXY.x() + "x" + theSizeXY.y() + + " exceeds hardware limits (" + aMaxSize + "x" + aMaxSize + ")"); + Release (theCtx.get()); return false; } #if !defined(GL_ES_VERSION_2_0) @@ -481,18 +308,15 @@ // however some hardware (NV30 - GeForce FX, RadeOn 9xxx and Xxxx) supports GLSL but not NPOT! // Trying to create NPOT textures on such hardware will not fail // but driver will fall back into software rendering, - const GLsizei aWidthP2 = OpenGl_Context::GetPowerOfTwo (theSizeX, aMaxSize); - const GLsizei aHeightP2 = OpenGl_Context::GetPowerOfTwo (theSizeY, aMaxSize); - - if (theSizeX != aWidthP2 - || (theType != Graphic3d_TOT_1D && theSizeY != aHeightP2)) - { - TCollection_ExtendedString aWarnMessage = - TCollection_ExtendedString ("Error: NPOT Textures (") + theSizeX + "x" + theSizeY + ") are not supported by hardware."; - - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_HIGH, aWarnMessage); - - Release (theCtx.operator->()); + const GLsizei aWidthP2 = OpenGl_Context::GetPowerOfTwo (theSizeXY.x(), aMaxSize); + const GLsizei aHeightP2 = OpenGl_Context::GetPowerOfTwo (theSizeXY.y(), aMaxSize); + if (theSizeXY.x() != aWidthP2 + || (theType != Graphic3d_TOT_1D && theSizeXY.y() != aHeightP2)) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString ("Error: NPOT Textures (") + theSizeXY.x() + "x" + theSizeXY.y() + ")" + " are not supported by hardware."); + Release (theCtx.get()); return false; } } @@ -500,26 +324,22 @@ else if (!theCtx->IsGlGreaterEqual (3, 0) && theType == Graphic3d_TOT_2D_MIPMAP) { // Mipmap NPOT textures are not supported by OpenGL ES 2.0. - const GLsizei aWidthP2 = OpenGl_Context::GetPowerOfTwo (theSizeX, aMaxSize); - const GLsizei aHeightP2 = OpenGl_Context::GetPowerOfTwo (theSizeY, aMaxSize); - - if (theSizeX != aWidthP2 - || theSizeY != aHeightP2) - { - TCollection_ExtendedString aWarnMessage = - TCollection_ExtendedString ("Error: Mipmap NPOT Textures (") + theSizeX + "x" + theSizeY + ") are not supported by OpenGL ES 2.0"; - - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_HIGH, aWarnMessage); - - Release (theCtx.operator->()); + const GLsizei aWidthP2 = OpenGl_Context::GetPowerOfTwo (theSizeXY.x(), aMaxSize); + const GLsizei aHeightP2 = OpenGl_Context::GetPowerOfTwo (theSizeXY.y(), aMaxSize); + if (theSizeXY.x() != aWidthP2 + || theSizeXY.y() != aHeightP2) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString ("Error: Mipmap NPOT Textures (") + theSizeXY.x() + "x" + theSizeXY.y() + ")" + " are not supported by OpenGL ES 2.0"); + Release (theCtx.get()); return false; } } #endif #if !defined(GL_ES_VERSION_2_0) - GLint aTestWidth = 0; - GLint aTestHeight = 0; + GLint aTestWidth = 0, aTestHeight = 0; #endif GLvoid* aDataPtr = (theImage != NULL) ? (GLvoid* )theImage->Data() : NULL; @@ -551,15 +371,15 @@ if (toPatchExisting) { glTexSubImage1D (GL_TEXTURE_1D, 0, 0, - theSizeX, thePixelFormat, theDataType, aDataPtr); + theSizeXY.x(), theFormat.PixelFormat(), theFormat.DataType(), aDataPtr); Unbind (theCtx); return true; } // use proxy to check texture could be created or not glTexImage1D (GL_PROXY_TEXTURE_1D, 0, anIntFormat, - theSizeX, 0, - thePixelFormat, theDataType, NULL); + theSizeXY.x(), 0, + theFormat.PixelFormat(), theFormat.DataType(), NULL); glGetTexLevelParameteriv (GL_PROXY_TEXTURE_1D, 0, GL_TEXTURE_WIDTH, &aTestWidth); glGetTexLevelParameteriv (GL_PROXY_TEXTURE_1D, 0, GL_TEXTURE_INTERNAL_FORMAT, &mySizedFormat); if (aTestWidth == 0) @@ -571,16 +391,16 @@ } glTexImage1D (GL_TEXTURE_1D, 0, anIntFormat, - theSizeX, 0, - thePixelFormat, theDataType, aDataPtr); + theSizeXY.x(), 0, + theFormat.PixelFormat(), theFormat.DataType(), aDataPtr); if (glGetError() != GL_NO_ERROR) { Unbind (theCtx); - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } - mySizeX = theSizeX; + mySizeX = theSizeXY.x(); mySizeY = 1; Unbind (theCtx); @@ -588,62 +408,11 @@ #else theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, "Error: 1D textures are not supported by hardware."); - Release (theCtx.operator->()); + Release (theCtx.get()); return false; #endif } case Graphic3d_TOT_2D: - { - Bind (theCtx); - applyDefaultSamplerParams (theCtx); - if (toPatchExisting) - { - glTexSubImage2D (GL_TEXTURE_2D, 0, - 0, 0, - theSizeX, theSizeY, - thePixelFormat, theDataType, aDataPtr); - Unbind (theCtx); - return true; - } - - #if !defined(GL_ES_VERSION_2_0) - // use proxy to check texture could be created or not - glTexImage2D (GL_PROXY_TEXTURE_2D, 0, anIntFormat, - theSizeX, theSizeY, 0, - thePixelFormat, theDataType, NULL); - glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &aTestWidth); - glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &aTestHeight); - glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &mySizedFormat); - if (aTestWidth == 0 || aTestHeight == 0) - { - // no memory or broken input parameters - Unbind (theCtx); - Release (theCtx.operator->()); - return false; - } - #endif - - glTexImage2D (GL_TEXTURE_2D, 0, anIntFormat, - theSizeX, theSizeY, 0, - thePixelFormat, theDataType, aDataPtr); - const GLenum anErr = glGetError(); - if (anErr != GL_NO_ERROR) - { - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, - TCollection_AsciiString ("Error: 2D texture ") + theSizeX + "x" + theSizeY - + " IF: " + int(anIntFormat) + " PF: " + int(thePixelFormat) + " DT: " + int(theDataType) - + " can not be created with error " + int(anErr) + "."); - Unbind (theCtx); - Release (theCtx.operator->()); - return false; - } - - mySizeX = theSizeX; - mySizeY = theSizeY; - - Unbind (theCtx); - return true; - } case Graphic3d_TOT_2D_MIPMAP: { Bind (theCtx); @@ -652,17 +421,16 @@ { glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, - theSizeX, theSizeY, - thePixelFormat, theDataType, aDataPtr); - if (theCtx->arbFBO != NULL) + theSizeXY.x(), theSizeXY.y(), + theFormat.PixelFormat(), theFormat.DataType(), aDataPtr); + + if (myMaxMipLevel > 0) { // generate mipmaps theCtx->arbFBO->glGenerateMipmap (GL_TEXTURE_2D); if (glGetError() != GL_NO_ERROR) { - Unbind (theCtx); - Release (theCtx.operator->()); - return false; + myMaxMipLevel = 0; } } @@ -673,8 +441,8 @@ #if !defined(GL_ES_VERSION_2_0) // use proxy to check texture could be created or not glTexImage2D (GL_PROXY_TEXTURE_2D, 0, anIntFormat, - theSizeX, theSizeY, 0, - thePixelFormat, theDataType, NULL); + theSizeXY.x(), theSizeXY.y(), 0, + theFormat.PixelFormat(), theFormat.DataType(), NULL); glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &aTestWidth); glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &aTestHeight); glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &mySizedFormat); @@ -682,53 +450,43 @@ { // no memory or broken input parameters Unbind (theCtx); - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } #endif - // upload main picture glTexImage2D (GL_TEXTURE_2D, 0, anIntFormat, - theSizeX, theSizeY, 0, - thePixelFormat, theDataType, theImage->Data()); - const GLenum aTexImgErr = glGetError(); - if (aTexImgErr != GL_NO_ERROR) + theSizeXY.x(), theSizeXY.y(), 0, + theFormat.PixelFormat(), theFormat.DataType(), aDataPtr); + GLenum anErr = glGetError(); + if (anErr != GL_NO_ERROR) { theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, - TCollection_AsciiString ("Error: 2D texture ") + theSizeX + "x" + theSizeY - + " IF: " + int(anIntFormat) + " PF: " + int(thePixelFormat) + " DT: " + int(theDataType) - + " can not be created with error " + int(aTexImgErr) + "."); + TCollection_AsciiString ("Error: 2D texture ") + theSizeXY.x() + "x" + theSizeXY.y() + + " IF: " + int(anIntFormat) + " PF: " + int(theFormat.PixelFormat()) + + " DT: " + int(theFormat.DataType()) + + " can not be created with error " + int(anErr) + "."); Unbind (theCtx); - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } - mySizeX = theSizeX; - mySizeY = theSizeY; + mySizeX = theSizeXY.x(); + mySizeY = theSizeXY.y(); - if (theCtx->arbFBO != NULL) + if (myMaxMipLevel > 0) { // generate mipmaps //glHint (GL_GENERATE_MIPMAP_HINT, GL_NICEST); theCtx->arbFBO->glGenerateMipmap (GL_TEXTURE_2D); - - if (glGetError() != GL_NO_ERROR) + anErr = glGetError(); + if (anErr != GL_NO_ERROR) { - Unbind (theCtx); - Release (theCtx.operator->()); - return false; + myMaxMipLevel = 0; + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_HIGH, + "Warning: generating mipmaps requires GL_ARB_framebuffer_object extension which is missing."); } } - else - { - const TCollection_ExtendedString aWarnMessage ("Warning: generating mipmaps requires GL_ARB_framebuffer_object extension which is missing."); - - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_HIGH, aWarnMessage); - - Unbind (theCtx); - Release (theCtx.operator->()); - return false; - } Unbind (theCtx); return true; @@ -741,7 +499,7 @@ } } - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } @@ -751,27 +509,23 @@ // ======================================================================= bool OpenGl_Texture::Init (const Handle(OpenGl_Context)& theCtx, const Image_PixMap& theImage, - const Graphic3d_TypeOfTexture theType) + const Graphic3d_TypeOfTexture theType, + const Standard_Boolean theIsColorMap) { if (theImage.IsEmpty()) { - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } - GLenum aPixelFormat; - GLenum aDataType; - GLint aTextFormat; - if (!GetDataFormat (theCtx, theImage, aTextFormat, aPixelFormat, aDataType)) + const OpenGl_TextureFormat aFormat = OpenGl_TextureFormat::FindFormat (theCtx, theImage.Format(), theIsColorMap); + if (!aFormat.IsValid()) { - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } - return Init (theCtx, - aTextFormat, aPixelFormat, aDataType, - (Standard_Integer)theImage.SizeX(), - (Standard_Integer)theImage.SizeY(), + return Init (theCtx, aFormat, Graphic3d_Vec2i ((Standard_Integer)theImage.SizeX(), (Standard_Integer)theImage.SizeY()), theType, &theImage); } @@ -791,18 +545,128 @@ { case Graphic3d_TOT_CUBEMAP: { - return InitCubeMap (theCtx, Handle(Graphic3d_CubeMap)::DownCast(theTextureMap)); + return InitCubeMap (theCtx, Handle(Graphic3d_CubeMap)::DownCast(theTextureMap), + 0, Image_Format_RGB, false, theTextureMap->IsColorMap()); } default: { - Handle(Image_PixMap) anImage = theTextureMap->GetImage(); + if (theCtx->SupportedTextureFormats()->HasCompressed() + && !theCtx->caps->compressedTexturesDisable) + { + if (Handle(Image_CompressedPixMap) aCompressed = theTextureMap->GetCompressedImage (theCtx->SupportedTextureFormats())) + { + return InitCompressed (theCtx, *aCompressed, theTextureMap->IsColorMap()); + } + } + + Handle(Image_PixMap) anImage = theTextureMap->GetImage (theCtx->SupportedTextureFormats()); if (anImage.IsNull()) { return false; } - return Init (theCtx, *anImage, theTextureMap->Type()); + return Init (theCtx, *anImage, theTextureMap->Type(), theTextureMap->IsColorMap()); + } + } +} + +// ======================================================================= +// function : InitCompressed +// purpose : +// ======================================================================= +bool OpenGl_Texture::InitCompressed (const Handle(OpenGl_Context)& theCtx, + const Image_CompressedPixMap& theImage, + const Standard_Boolean theIsColorMap) +{ + if (theImage.SizeX() < 1 + || theImage.SizeY() < 1 + || theImage.FaceData().IsNull()) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + "Error: texture of 0 size cannot be created."); + Release (theCtx.get()); + return false; + } + if (theImage.SizeX() > theCtx->MaxTextureSize() + || theImage.SizeY() > theCtx->MaxTextureSize()) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString ("Error: Texture dimension - ") + theImage.SizeX() + "x" + theImage.SizeY() + + " exceeds hardware limits (" + theCtx->MaxTextureSize() + "x" + theCtx->MaxTextureSize() + ")"); + Release (theCtx.get()); + return false; + } + + const OpenGl_TextureFormat aFormat = OpenGl_TextureFormat::FindCompressedFormat (theCtx, theImage.CompressedFormat(), theIsColorMap); + if (!aFormat.IsValid()) + { + Release (theCtx.get()); + return false; + } + + if (!Create (theCtx)) + { + return false; + } + + myTarget = GL_TEXTURE_2D; + myNbSamples = 1; + myTextFormat = aFormat.Format(); + mySizedFormat = aFormat.Internal(); + myIsTopDown = theImage.IsTopDown(); + mySizeX = theImage.SizeX(); + mySizeY = theImage.SizeY(); + myMaxMipLevel = Max (theImage.MipMaps().Size() - 1, 0); + if (myMaxMipLevel > 0 + && !theImage.IsCompleteMipMapSet()) + { + const Graphic3d_Vec2i aMipSize = computeSmallestMipMapSize (Graphic3d_Vec2i (mySizeX, mySizeY), myMaxMipLevel); + if (!theCtx->HasTextureBaseLevel()) + { + myMaxMipLevel = 0; + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, 0, GL_DEBUG_SEVERITY_MEDIUM, + TCollection_AsciiString ("Warning: compressed 2D texture ") + myResourceId + " " + mySizeX + "x" + mySizeY + + " has smallest mipmap " + aMipSize.x() + "x" + aMipSize.y() + "; mipmaps will be ignored"); + } + else + { + Message::SendTrace (TCollection_AsciiString ("Warning: compressed 2D texture ") + myResourceId + " " + mySizeX + "x" + mySizeY + + " has smallest mipmap " + aMipSize.x() + "x" + aMipSize.y()); } } + + Bind (theCtx); + applyDefaultSamplerParams (theCtx); + + // setup the alignment + OpenGl_UnpackAlignmentSentry::Reset(); + + Graphic3d_Vec2i aMipSizeXY (theImage.SizeX(), theImage.SizeY()); + const Standard_Byte* aData = theImage.FaceData()->Data(); + for (Standard_Integer aMipIter = 0; aMipIter <= myMaxMipLevel; ++aMipIter) + { + const Standard_Integer aMipLength = theImage.MipMaps().Value (aMipIter); + theCtx->Functions()->glCompressedTexImage2D (GL_TEXTURE_2D, aMipIter, mySizedFormat, aMipSizeXY.x(), aMipSizeXY.y(), 0, aMipLength, aData); + const GLenum aTexImgErr = glGetError(); + if (aTexImgErr != GL_NO_ERROR) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString ("Error: 2D compressed texture ") + aMipSizeXY.x() + "x" + aMipSizeXY.y() + + " IF: " + int(aFormat.Internal()) + " PF: " + int(aFormat.PixelFormat()) + + " DT: " + int(aFormat.DataType()) + + " can not be created with error " + int(aTexImgErr) + "."); + Unbind (theCtx); + Release (theCtx.get()); + return false; + } + + aData += aMipLength; + aMipSizeXY /= 2; + if (aMipSizeXY.x() == 0) { aMipSizeXY.x() = 1; } + if (aMipSizeXY.y() == 0) { aMipSizeXY.y() = 1; } + } + + Unbind (theCtx); + return true; } // ======================================================================= @@ -824,7 +688,7 @@ myNbSamples = OpenGl_Context::GetPowerOfTwo (theNbSamples, theCtx->MaxMsaaSamples()); myTarget = GL_TEXTURE_2D_MULTISAMPLE; - myHasMipmaps = false; + myMaxMipLevel = 0; if(theSizeX > theCtx->MaxTextureSize() || theSizeY > theCtx->MaxTextureSize()) { @@ -876,7 +740,7 @@ #if !defined(GL_ES_VERSION_2_0) myTarget = GL_TEXTURE_RECTANGLE; myNbSamples = 1; - myHasMipmaps = false; + myMaxMipLevel = 0; const GLsizei aSizeX = Min (theCtx->MaxTextureSize(), theSizeX); const GLsizei aSizeY = Min (theCtx->MaxTextureSize(), theSizeY); @@ -935,24 +799,14 @@ // purpose : // ======================================================================= bool OpenGl_Texture::Init3D (const Handle(OpenGl_Context)& theCtx, - const GLint theTextFormat, - const GLenum thePixelFormat, - const GLenum theDataType, - const Standard_Integer theSizeX, - const Standard_Integer theSizeY, - const Standard_Integer theSizeZ, + const OpenGl_TextureFormat& theFormat, + const Graphic3d_Vec3i& theSizeXYZ, const void* thePixels) { if (theCtx->Functions()->glTexImage3D == NULL) { - TCollection_ExtendedString aMsg ("Error: three-dimensional textures are not supported by hardware."); - - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, - GL_DEBUG_TYPE_ERROR, - 0, - GL_DEBUG_SEVERITY_HIGH, - aMsg); - + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + "Error: three-dimensional textures are not supported by hardware."); return false; } @@ -963,71 +817,67 @@ myTarget = GL_TEXTURE_3D; myNbSamples = 1; - myHasMipmaps = false; - - const GLsizei aSizeX = Min (theCtx->MaxTextureSize(), theSizeX); - const GLsizei aSizeY = Min (theCtx->MaxTextureSize(), theSizeY); - const GLsizei aSizeZ = Min (theCtx->MaxTextureSize(), theSizeZ); + myMaxMipLevel = 0; + const Graphic3d_Vec3i aSizeXYZ = theSizeXYZ.cwiseMin (Graphic3d_Vec3i (theCtx->MaxTextureSize())); + if (aSizeXYZ != theSizeXYZ) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + "Error: 3D texture dimensions exceed hardware limits."); + Release (theCtx.get()); + Unbind (theCtx); + return false; + } Bind (theCtx); - if (theDataType == GL_FLOAT && !theCtx->arbTexFloat) + if (theFormat.DataType() == GL_FLOAT + && !theCtx->arbTexFloat) { - TCollection_ExtendedString aMsg ("Error: floating-point textures are not supported by hardware."); - - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, - GL_DEBUG_TYPE_ERROR, - 0, - GL_DEBUG_SEVERITY_HIGH, - aMsg); - - Release (theCtx.operator->()); + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + "Error: floating-point textures are not supported by hardware."); + Release (theCtx.get()); Unbind (theCtx); return false; } - mySizedFormat = theTextFormat; + mySizedFormat = theFormat.InternalFormat(); // setup the alignment OpenGl_UnpackAlignmentSentry::Reset(); #if !defined (GL_ES_VERSION_2_0) theCtx->core15fwd->glTexImage3D (GL_PROXY_TEXTURE_3D, 0, mySizedFormat, - aSizeX, aSizeY, aSizeZ, 0, - thePixelFormat, theDataType, NULL); + aSizeXYZ.x(), aSizeXYZ.y(), aSizeXYZ.z(), 0, + theFormat.PixelFormat(), theFormat.DataType(), NULL); - GLint aTestSizeX = 0; - GLint aTestSizeY = 0; - GLint aTestSizeZ = 0; - - glGetTexLevelParameteriv (GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_WIDTH, &aTestSizeX); - glGetTexLevelParameteriv (GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_HEIGHT, &aTestSizeY); - glGetTexLevelParameteriv (GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_DEPTH, &aTestSizeZ); + NCollection_Vec3 aTestSizeXYZ; + glGetTexLevelParameteriv (GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_WIDTH, &aTestSizeXYZ.x()); + glGetTexLevelParameteriv (GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_HEIGHT, &aTestSizeXYZ.y()); + glGetTexLevelParameteriv (GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_DEPTH, &aTestSizeXYZ.z()); glGetTexLevelParameteriv (GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_INTERNAL_FORMAT, &mySizedFormat); - - if (aTestSizeX == 0 || aTestSizeY == 0 || aTestSizeZ == 0) + if (aTestSizeXYZ.x() == 0 || aTestSizeXYZ.y() == 0 || aTestSizeXYZ.z() == 0) { Unbind (theCtx); - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } #endif applyDefaultSamplerParams (theCtx); theCtx->Functions()->glTexImage3D (myTarget, 0, mySizedFormat, - aSizeX, aSizeY, aSizeZ, 0, - thePixelFormat, theDataType, thePixels); + aSizeXYZ.x(), aSizeXYZ.y(), aSizeXYZ.z(), 0, + theFormat.PixelFormat(), theFormat.DataType(), thePixels); if (glGetError() != GL_NO_ERROR) { Unbind (theCtx); - Release (theCtx.operator->()); + Release (theCtx.get()); return false; } - mySizeX = aSizeX; - mySizeY = aSizeY; - mySizeZ = aSizeZ; + mySizeX = aSizeXYZ.x(); + mySizeY = aSizeXYZ.y(); + mySizeZ = aSizeXYZ.z(); Unbind (theCtx); return true; @@ -1039,9 +889,10 @@ // ======================================================================= bool OpenGl_Texture::InitCubeMap (const Handle(OpenGl_Context)& theCtx, const Handle(Graphic3d_CubeMap)& theCubeMap, - Standard_Size theSize, - Image_Format theFormat, - Standard_Boolean theToGenMipmap) + Standard_Size theSize, + Image_Format theFormat, + Standard_Boolean theToGenMipmap, + Standard_Boolean theIsColorMap) { if (!Create (theCtx)) { @@ -1049,28 +900,81 @@ return false; } + Handle(Image_PixMap) anImage; + Handle(Image_CompressedPixMap) aCompImage; + OpenGl_TextureFormat aFormat; if (!theCubeMap.IsNull()) { - Handle(Image_PixMap) anImage = theCubeMap->Reset().Value(); - if (!anImage.IsNull()) + theCubeMap->Reset(); + if (theCtx->SupportedTextureFormats()->HasCompressed() + && !theCtx->caps->compressedTexturesDisable) + { + aCompImage = theCubeMap->CompressedValue (theCtx->SupportedTextureFormats()); + } + if (!aCompImage.IsNull()) + { + aFormat = OpenGl_TextureFormat::FindCompressedFormat (theCtx, aCompImage->CompressedFormat(), theIsColorMap); + if (aFormat.IsValid()) + { + theToGenMipmap = false; + theSize = aCompImage->SizeX(); + theFormat = aCompImage->BaseFormat(); + myMaxMipLevel = Max (aCompImage->MipMaps().Size() - 1, 0); + if (myMaxMipLevel > 0 + && !aCompImage->IsCompleteMipMapSet()) + { + const Graphic3d_Vec2i aMipSize = computeSmallestMipMapSize (Graphic3d_Vec2i (aCompImage->SizeX(), aCompImage->SizeY()), myMaxMipLevel); + if (!theCtx->HasTextureBaseLevel()) + { + myMaxMipLevel = 0; + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, 0, GL_DEBUG_SEVERITY_MEDIUM, + TCollection_AsciiString ("Warning: Cubemap compressed texture ") + theCubeMap->GetId() + " " + aCompImage->SizeX() + "x" + aCompImage->SizeX() + + " has smallest mipmap " + aMipSize.x() + "x" + aMipSize.y() + "; mipmaps will be ignored"); + } + else + { + Message::SendTrace (TCollection_AsciiString ("Warning: Cubemap compressed texture ") + theCubeMap->GetId() + " " + aCompImage->SizeX() + "x" + aCompImage->SizeX() + + " has smallest mipmap " + aMipSize.x() + "x" + aMipSize.y()); + } + } + + OpenGl_UnpackAlignmentSentry::Reset(); + } + else + { + aCompImage.Nullify(); + } + } + + if (!aFormat.IsValid()) { + anImage = theCubeMap->Reset().Value (theCtx->SupportedTextureFormats()); + if (anImage.IsNull()) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + "Unable to get the first side of cubemap"); + Release(theCtx.get()); + return false; + } + theSize = anImage->SizeX(); theFormat = anImage->Format(); + theToGenMipmap = theCubeMap->HasMipmaps(); + myMaxMipLevel = theToGenMipmap ? computeUpperMipMapLevel ((Standard_Integer )theSize) : 0; } - else - { - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, - "Unable to get the first side of cubemap"); - Release(theCtx.get()); - return false; - } - } - GLenum aPixelFormat = GL_RGB; - GLenum aDataType = 0; - GLint aTextFormat = 0; + myIsTopDown = theCubeMap->IsTopDown(); + } + else + { + myMaxMipLevel = theToGenMipmap ? computeUpperMipMapLevel ((Standard_Integer )theSize) : 0; + } - if (!GetDataFormat (theCtx, theFormat, aTextFormat, aPixelFormat, aDataType)) + if (!aFormat.IsValid()) + { + aFormat = OpenGl_TextureFormat::FindFormat (theCtx, theFormat, theIsColorMap); + } + if (!aFormat.IsValid()) { Unbind(theCtx); Release(theCtx.get()); @@ -1078,19 +982,69 @@ } myTarget = GL_TEXTURE_CUBE_MAP; - myHasMipmaps = theToGenMipmap; myNbSamples = 1; + mySizeX = (GLsizei )theSize; + mySizeY = (GLsizei )theSize; + myTextFormat = aFormat.Format(); + mySizedFormat = aFormat.Internal(); +#if !defined(GL_ES_VERSION_2_0) + const GLint anIntFormat = aFormat.InternalFormat(); +#else + // ES 2.0 does not support sized formats and format conversions - them detected from data type + const GLint anIntFormat = theCtx->IsGlGreaterEqual (3, 0) ? aFormat.InternalFormat() : aFormat.PixelFormat(); +#endif + Bind (theCtx); applyDefaultSamplerParams (theCtx); for (Standard_Integer i = 0; i < 6; ++i) { - const void* aData = NULL; - Handle(Image_PixMap) anImage; + const Standard_Byte* aData = NULL; if (!theCubeMap.IsNull()) { - anImage = theCubeMap->Value(); + if (i != 0) + { + if (!aCompImage.IsNull()) + { + aCompImage = theCubeMap->CompressedValue (theCtx->SupportedTextureFormats()); + } + else + { + anImage = theCubeMap->Value (theCtx->SupportedTextureFormats()); + } + } + if (!aCompImage.IsNull()) + { + Graphic3d_Vec2i aMipSizeXY (mySizeX, mySizeY); + aData = aCompImage->FaceData()->Data(); + for (Standard_Integer aMipIter = 0; aMipIter <= myMaxMipLevel; ++aMipIter) + { + const Standard_Integer aMipLength = aCompImage->MipMaps().Value (aMipIter); + theCtx->Functions()->glCompressedTexImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, aMipIter, mySizedFormat, aMipSizeXY.x(), aMipSizeXY.y(), 0, aMipLength, aData); + const GLenum aTexImgErr = glGetError(); + if (aTexImgErr != GL_NO_ERROR) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString ("Error: cubemap compressed texture ") + aMipSizeXY.x() + "x" + aMipSizeXY.y() + + " IF: " + int(aFormat.Internal()) + " PF: " + int(aFormat.PixelFormat()) + + " DT: " + int(aFormat.DataType()) + + " can not be created with error " + int(aTexImgErr) + "."); + Unbind (theCtx); + Release (theCtx.get()); + return false; + } + + aData += aMipLength; + aMipSizeXY /= 2; + if (aMipSizeXY.x() == 0) { aMipSizeXY.x() = 1; } + if (aMipSizeXY.y() == 0) { aMipSizeXY.y() = 1; } + } + + theCubeMap->Next(); + continue; + } + if (!anImage.IsNull()) { #if !defined(GL_ES_VERSION_2_0) @@ -1123,8 +1077,8 @@ } else { - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, TCollection_AsciiString() + - "Unable to get [" + i + "] side of cubemap"); + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString() + "Unable to get [" + i + "] side of cubemap"); Unbind (theCtx); Release (theCtx.get()); return false; @@ -1133,17 +1087,18 @@ } glTexImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, - aTextFormat, + anIntFormat, GLsizei(theSize), GLsizei(theSize), - 0, aPixelFormat, aDataType, + 0, aFormat.PixelFormat(), aFormat.DataType(), aData); OpenGl_UnpackAlignmentSentry::Reset(); - if (glGetError() != GL_NO_ERROR) + const GLenum anErr = glGetError(); + if (anErr != GL_NO_ERROR) { theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, - "Unable to initialize side of cubemap"); + TCollection_AsciiString ("Unable to initialize side of cubemap. Error #") + int(anErr)); Unbind (theCtx); Release (theCtx.get()); return false; @@ -1152,16 +1107,16 @@ if (theToGenMipmap && theCtx->arbFBO != NULL) { - theCtx->arbFBO->glGenerateMipmap (myTarget); - - if (glGetError() != GL_NO_ERROR) - { - theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, - "Unable to generate mipmap of cubemap"); - Unbind(theCtx); - Release(theCtx.get()); - return false; - } + theCtx->arbFBO->glGenerateMipmap (myTarget); + const GLenum anErr = glGetError(); + if (anErr != GL_NO_ERROR) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString ("Unable to generate mipmap of cubemap. Error #") + int(anErr)); + Unbind (theCtx); + Release (theCtx.get()); + return false; + } } Unbind (theCtx.get()); @@ -1210,8 +1165,18 @@ case GL_DEPTH_COMPONENT16: return 2; case GL_DEPTH_COMPONENT24: return 3; case GL_DEPTH_COMPONENT32F: return 4; + // compressed + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // DXT1 uses circa half a byte per pixel (64 bits per 4x4 block) + case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: // DXT3/5 uses circa 1 byte per pixel (128 bits per 4x4 block) + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: + return 1; } - return 0; + return 1; } // ======================================================================= @@ -1234,7 +1199,11 @@ { aSize *= Standard_Size(mySizeZ); } - if (myHasMipmaps) + if (myTarget == GL_TEXTURE_CUBE_MAP) + { + aSize *= 6; // cube sides + } + if (myMaxMipLevel > 0) { aSize = aSize + aSize / 3; } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextureFormat.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextureFormat.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextureFormat.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextureFormat.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,528 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include + +// ======================================================================= +// function : FindFormat +// purpose : +// ======================================================================= +OpenGl_TextureFormat OpenGl_TextureFormat::FindFormat (const Handle(OpenGl_Context)& theCtx, + Image_Format theFormat, + bool theIsColorMap) +{ + OpenGl_TextureFormat aFormat; + switch (theFormat) + { + case Image_Format_GrayF: + { + aFormat.SetNbComponents (1); + if (theCtx->core11 == NULL) + { + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_R32F : GL_R8); + aFormat.SetPixelFormat (GL_RED); + } + else + { + #if !defined(GL_ES_VERSION_2_0) + aFormat.SetInternalFormat (GL_LUMINANCE8); + #else + aFormat.SetInternalFormat (GL_LUMINANCE); + #endif + aFormat.SetPixelFormat (GL_LUMINANCE); + } + aFormat.SetDataType (GL_FLOAT); + return aFormat; + } + case Image_Format_AlphaF: + { + aFormat.SetNbComponents (1); + if (theCtx->core11 == NULL) + { + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_R32F : GL_R8); + aFormat.SetPixelFormat (GL_RED); + } + else + { + #if !defined(GL_ES_VERSION_2_0) + aFormat.SetInternalFormat (GL_ALPHA8); + #else + aFormat.SetInternalFormat (GL_ALPHA); + #endif + aFormat.SetPixelFormat (GL_ALPHA); + } + aFormat.SetDataType (GL_FLOAT); + return aFormat; + } + case Image_Format_RGF: + { + if (!theCtx->arbTexRG) + { + return OpenGl_TextureFormat(); + } + aFormat.SetNbComponents (2); + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RG32F : GL_RG8); + aFormat.SetPixelFormat (GL_RG); + aFormat.SetDataType (GL_FLOAT); + return aFormat; + } + case Image_Format_RGBAF: + { + aFormat.SetNbComponents (4); + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGBA32F : GL_RGBA8); + aFormat.SetPixelFormat (GL_RGBA); + aFormat.SetDataType (GL_FLOAT); + return aFormat; + } + case Image_Format_BGRAF: + { + if (!theCtx->IsGlGreaterEqual (1, 2) && !theCtx->extBgra) + { + return OpenGl_TextureFormat(); + } + aFormat.SetNbComponents (4); + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGBA32F : GL_RGBA8); + aFormat.SetPixelFormat (GL_BGRA_EXT); // equals to GL_BGRA + aFormat.SetDataType (GL_FLOAT); + return aFormat; + } + case Image_Format_RGBF: + { + aFormat.SetNbComponents (3); + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGB32F : GL_RGB8); + aFormat.SetPixelFormat (GL_RGB); + aFormat.SetDataType (GL_FLOAT); + return aFormat; + } + case Image_Format_BGRF: + { + #if !defined(GL_ES_VERSION_2_0) + aFormat.SetNbComponents (3); + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGB32F : GL_RGB8); + aFormat.SetPixelFormat (GL_BGR); // equals to GL_BGR_EXT + aFormat.SetDataType (GL_FLOAT); + return aFormat; + #else + return OpenGl_TextureFormat(); + #endif + } + case Image_Format_RGBA: + { + aFormat.SetNbComponents (4); + aFormat.SetInternalFormat (GL_RGBA8); + aFormat.SetPixelFormat (GL_RGBA); + aFormat.SetDataType (GL_UNSIGNED_BYTE); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_SRGB8_ALPHA8); + } + return aFormat; + } + case Image_Format_BGRA: + { + #if !defined(GL_ES_VERSION_2_0) + if (!theCtx->IsGlGreaterEqual (1, 2) + && !theCtx->extBgra) + { + return OpenGl_TextureFormat(); + } + aFormat.SetNbComponents (4); + aFormat.SetInternalFormat (GL_RGBA8); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_SRGB8_ALPHA8); + } + #else + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + // GL_SRGB8_ALPHA8 with texture swizzling would be better + } + if (!theCtx->extBgra) + { + return OpenGl_TextureFormat(); + } + aFormat.SetNbComponents (4); + aFormat.SetInternalFormat (GL_BGRA_EXT); + #endif + aFormat.SetPixelFormat (GL_BGRA_EXT); // equals to GL_BGRA + aFormat.SetDataType (GL_UNSIGNED_BYTE); + return aFormat; + } + case Image_Format_RGB32: + { + #if !defined(GL_ES_VERSION_2_0) + // ask driver to convert data to RGB8 to save memory + aFormat.SetNbComponents (3); + aFormat.SetInternalFormat (GL_RGB8); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_SRGB8); + } + #else + // conversion is not supported + aFormat.SetNbComponents (4); + aFormat.SetInternalFormat (GL_RGBA8); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_SRGB8_ALPHA8); + } + #endif + aFormat.SetPixelFormat (GL_RGBA); + aFormat.SetDataType (GL_UNSIGNED_BYTE); + return aFormat; + } + case Image_Format_BGR32: + { + #if !defined(GL_ES_VERSION_2_0) + if (!theCtx->IsGlGreaterEqual(1, 2) && !theCtx->extBgra) + { + return OpenGl_TextureFormat(); + } + aFormat.SetNbComponents (3); + aFormat.SetInternalFormat (GL_RGB8); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_SRGB8); + } + #else + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + // GL_SRGB8_ALPHA8 with texture swizzling would be better + } + if (!theCtx->extBgra) + { + return OpenGl_TextureFormat(); + } + aFormat.SetNbComponents (4); + aFormat.SetInternalFormat (GL_BGRA_EXT); + #endif + aFormat.SetPixelFormat (GL_BGRA_EXT); // equals to GL_BGRA + aFormat.SetDataType (GL_UNSIGNED_BYTE); + return aFormat; + } + case Image_Format_RGB: + { + aFormat.SetNbComponents (3); + aFormat.SetInternalFormat (GL_RGB8); + aFormat.SetPixelFormat (GL_RGB); + aFormat.SetDataType (GL_UNSIGNED_BYTE); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_SRGB8); + } + return aFormat; + } + case Image_Format_BGR: + { + #if !defined(GL_ES_VERSION_2_0) + if (!theCtx->IsGlGreaterEqual (1, 2) + && !theCtx->extBgra) + { + return OpenGl_TextureFormat(); + } + aFormat.SetNbComponents (3); + aFormat.SetInternalFormat (GL_RGB8); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_SRGB8); + } + aFormat.SetPixelFormat (GL_BGR); // equals to GL_BGR_EXT + aFormat.SetDataType (GL_UNSIGNED_BYTE); + #endif + return aFormat; + } + case Image_Format_Gray: + { + aFormat.SetNbComponents (1); + if (theCtx->core11 == NULL) + { + aFormat.SetInternalFormat (GL_R8); + aFormat.SetPixelFormat (GL_RED); + } + else + { + #if !defined(GL_ES_VERSION_2_0) + aFormat.SetInternalFormat (GL_LUMINANCE8); + #else + aFormat.SetInternalFormat (GL_LUMINANCE); + #endif + aFormat.SetPixelFormat (GL_LUMINANCE); + } + aFormat.SetDataType (GL_UNSIGNED_BYTE); + return aFormat; + } + case Image_Format_Alpha: + { + aFormat.SetNbComponents (1); + if (theCtx->core11 == NULL) + { + aFormat.SetInternalFormat (GL_R8); + aFormat.SetPixelFormat (GL_RED); + } + else + { + #if !defined(GL_ES_VERSION_2_0) + aFormat.SetInternalFormat (GL_ALPHA8); + #else + aFormat.SetInternalFormat (GL_ALPHA); + #endif + aFormat.SetPixelFormat (GL_ALPHA); + } + aFormat.SetDataType (GL_UNSIGNED_BYTE); + return aFormat; + } + case Image_Format_UNKNOWN: + { + return OpenGl_TextureFormat(); + } + } + return OpenGl_TextureFormat(); +} + +// ======================================================================= +// function : FindSizedFormat +// purpose : +// ======================================================================= +OpenGl_TextureFormat OpenGl_TextureFormat::FindSizedFormat (const Handle(OpenGl_Context)& theCtx, + GLint theSizedFormat) +{ + OpenGl_TextureFormat aFormat; + switch (theSizedFormat) + { + case GL_RGBA32F: + { + aFormat.SetNbComponents (4); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_RGBA); + aFormat.SetDataType (GL_FLOAT); + return aFormat; + } + case GL_R32F: + { + aFormat.SetNbComponents (1); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_RED); + aFormat.SetDataType (GL_FLOAT); + return aFormat; + } + case GL_RGBA16F: + { + aFormat.SetNbComponents (4); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_RGBA); + aFormat.SetDataType (GL_HALF_FLOAT); + if (theCtx->hasHalfFloatBuffer == OpenGl_FeatureInExtensions) + { + #if defined(GL_ES_VERSION_2_0) + aFormat.SetDataType (GL_HALF_FLOAT_OES); + #else + aFormat.SetDataType (GL_FLOAT); + #endif + } + return aFormat; + } + case GL_R16F: + { + aFormat.SetNbComponents (1); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_RED); + aFormat.SetDataType (GL_HALF_FLOAT); + if (theCtx->hasHalfFloatBuffer == OpenGl_FeatureInExtensions) + { + #if defined(GL_ES_VERSION_2_0) + aFormat.SetDataType (GL_HALF_FLOAT_OES); + #else + aFormat.SetDataType (GL_FLOAT); + #endif + } + return aFormat; + } + case GL_SRGB8_ALPHA8: + case GL_RGBA8: + case GL_RGBA: + { + aFormat.SetNbComponents (4); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_RGBA); + aFormat.SetDataType (GL_UNSIGNED_BYTE); + if (theSizedFormat == GL_SRGB8_ALPHA8 + && !theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_RGBA8); // fallback format + } + return aFormat; + } + case GL_SRGB8: + case GL_RGB8: + case GL_RGB: + { + aFormat.SetNbComponents (3); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_RGB); + aFormat.SetDataType (GL_UNSIGNED_BYTE); + if (theSizedFormat == GL_SRGB8 + && !theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_RGB8); // fallback format + } + return aFormat; + } + // integer types + case GL_R32I: + { + aFormat.SetNbComponents (1); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_RED_INTEGER); + aFormat.SetDataType (GL_INT); + return aFormat; + } + case GL_RG32I: + { + aFormat.SetNbComponents (2); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_RG_INTEGER); + aFormat.SetDataType (GL_INT); + return aFormat; + } + // depth formats + case GL_DEPTH24_STENCIL8: + { + aFormat.SetNbComponents (2); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_DEPTH_STENCIL); + aFormat.SetDataType (GL_UNSIGNED_INT_24_8); + return aFormat; + } + case GL_DEPTH32F_STENCIL8: + { + aFormat.SetNbComponents (2); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_DEPTH_STENCIL); + aFormat.SetDataType (GL_FLOAT_32_UNSIGNED_INT_24_8_REV); + return aFormat; + } + case GL_DEPTH_COMPONENT16: + { + aFormat.SetNbComponents (1); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_DEPTH_COMPONENT); + aFormat.SetDataType (GL_UNSIGNED_SHORT); + return aFormat; + } + case GL_DEPTH_COMPONENT24: + { + aFormat.SetNbComponents (1); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_DEPTH_COMPONENT); + aFormat.SetDataType (GL_UNSIGNED_INT); + return aFormat; + } + case GL_DEPTH_COMPONENT32F: + { + aFormat.SetNbComponents (1); + aFormat.SetInternalFormat (theSizedFormat); + aFormat.SetPixelFormat (GL_DEPTH_COMPONENT); + aFormat.SetDataType (GL_FLOAT); + return aFormat; + } + } + return aFormat; +} + +// ======================================================================= +// function : FindCompressedFormat +// purpose : +// ======================================================================= +OpenGl_TextureFormat OpenGl_TextureFormat::FindCompressedFormat (const Handle(OpenGl_Context)& theCtx, + Image_CompressedFormat theFormat, + bool theIsColorMap) +{ + OpenGl_TextureFormat aFormat; + if (!theCtx->SupportedTextureFormats()->IsSupported (theFormat)) + { + return aFormat; + } + + switch (theFormat) + { + case Image_CompressedFormat_UNKNOWN: + { + return aFormat; + } + case Image_CompressedFormat_RGB_S3TC_DXT1: + { + aFormat.SetNbComponents (3); + aFormat.SetPixelFormat (GL_RGB); + aFormat.SetDataType (GL_UNSIGNED_BYTE); + aFormat.SetInternalFormat (GL_COMPRESSED_RGB_S3TC_DXT1_EXT); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_COMPRESSED_SRGB_S3TC_DXT1_EXT); + } + return aFormat; + } + case Image_CompressedFormat_RGBA_S3TC_DXT1: + { + aFormat.SetNbComponents (4); + aFormat.SetPixelFormat (GL_RGBA); + aFormat.SetDataType (GL_UNSIGNED_BYTE); + aFormat.SetInternalFormat (GL_COMPRESSED_RGBA_S3TC_DXT1_EXT); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT); + } + return aFormat; + } + case Image_CompressedFormat_RGBA_S3TC_DXT3: + { + aFormat.SetNbComponents (4); + aFormat.SetPixelFormat (GL_RGBA); + aFormat.SetDataType (GL_UNSIGNED_BYTE); + aFormat.SetInternalFormat (GL_COMPRESSED_RGBA_S3TC_DXT3_EXT); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT); + } + return aFormat; + } + case Image_CompressedFormat_RGBA_S3TC_DXT5: + { + aFormat.SetNbComponents (4); + aFormat.SetPixelFormat (GL_RGBA); + aFormat.SetDataType (GL_UNSIGNED_BYTE); + aFormat.SetInternalFormat (GL_COMPRESSED_RGBA_S3TC_DXT5_EXT); + if (theIsColorMap + && theCtx->ToRenderSRGB()) + { + aFormat.SetInternalFormat (GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT); + } + return aFormat; + } + } + return aFormat; +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextureFormat.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextureFormat.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextureFormat.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextureFormat.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,268 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _OpenGl_TextureFormat_HeaderFile +#define _OpenGl_TextureFormat_HeaderFile + +#include +#include +#include +#include + +class OpenGl_Context; + +//! Stores parameters of OpenGL texture format. +class OpenGl_TextureFormat +{ +public: + + //! Returns texture format for specified type and number of channels. + //! @tparam theCompType component type + //! @tparam theNbComps number of components + template + static OpenGl_TextureFormat Create(); + + //! Find texture format suitable to specified image format. + //! @param theCtx [in] OpenGL context defining supported texture formats + //! @param theFormat [in] image format + //! @param theIsColorMap [in] flag indicating color nature of image (to select sRGB texture) + //! @return found format or invalid format + Standard_EXPORT static OpenGl_TextureFormat FindFormat (const Handle(OpenGl_Context)& theCtx, + Image_Format theFormat, + bool theIsColorMap); + + //! Find texture format suitable to specified internal (sized) texture format. + //! @param theCtx [in] OpenGL context defining supported texture formats + //! @param theSizedFormat [in] sized (internal) texture format (example: GL_RGBA8) + //! @return found format or invalid format + Standard_EXPORT static OpenGl_TextureFormat FindSizedFormat (const Handle(OpenGl_Context)& theCtx, + GLint theSizedFormat); + + //! Find texture format suitable to specified compressed texture format. + //! @param theCtx [in] OpenGL context defining supported texture formats + //! @param theFormat [in] compressed texture format + //! @return found format or invalid format + Standard_EXPORT static OpenGl_TextureFormat FindCompressedFormat (const Handle(OpenGl_Context)& theCtx, + Image_CompressedFormat theFormat, + bool theIsColorMap); + +public: + + //! Empty constructor (invalid texture format). + OpenGl_TextureFormat() : myInternalFormat (0), myPixelFormat (0), myDataType (0), myNbComponents (0) {} + + //! Return TRUE if format is defined. + bool IsValid() const + { + return myInternalFormat != 0 + && myPixelFormat != 0 + && myDataType != 0; + } + + //! Returns OpenGL internal format of the pixel data (example: GL_R32F). + GLint InternalFormat() const { return myInternalFormat; } + + //! Sets texture internal format. + void SetInternalFormat (GLint theInternal) { myInternalFormat = theInternal; } + + //! Returns OpenGL format of the pixel data (example: GL_RED). + GLenum PixelFormat() const { return myPixelFormat; } + + //! Sets OpenGL format of the pixel data. + void SetPixelFormat (GLenum theFormat) { myPixelFormat = theFormat; } + + //! Returns OpenGL data type of the pixel data (example: GL_FLOAT). + GLint DataType() const { return myDataType; } + + //! Sets OpenGL data type of the pixel data. + void SetDataType (GLint theType) { myDataType = theType; } + + //! Returns number of components (channels). Here for debugging purposes. + GLint NbComponents() const { return myNbComponents; } + + //! Sets number of components (channels). + void SetNbComponents (GLint theNbComponents) { myNbComponents = theNbComponents; } + + //! Return TRUE if internal texture format is sRGB(A). + bool IsSRGB() const + { + return myInternalFormat == GL_SRGB8 + || myInternalFormat == GL_SRGB8_ALPHA8; + } + +public: + + //! Returns OpenGL internal format of the pixel data (example: GL_R32F). + GLint Internal() const { return myInternalFormat; } + + //! Returns OpenGL format of the pixel data (example: GL_RED). + GLenum Format() const { return myPixelFormat; } + +private: + + GLint myInternalFormat; //!< OpenGL internal format of the pixel data + GLenum myPixelFormat; //!< OpenGL pixel format + GLint myDataType; //!< OpenGL data type of input pixel data + GLint myNbComponents; //!< number of channels for each pixel (from 1 to 4) + +}; + +//! Selects preferable texture format for specified parameters. +template struct OpenGl_TextureFormatSelector +{ + // Not implemented +}; + +//! Specialization for unsigned byte. +template<> struct OpenGl_TextureFormatSelector +{ + static GLint DataType() { return GL_UNSIGNED_BYTE; } + static GLint Internal (GLuint theChannels) + { + switch (theChannels) + { + case 1: return GL_R8; + case 2: return GL_RG8; + case 3: return GL_RGB8; + case 4: return GL_RGBA8; + default: return GL_NONE; + } + } +}; + +//! Specialization for unsigned short. +template<> struct OpenGl_TextureFormatSelector +{ + static GLint DataType() { return GL_UNSIGNED_SHORT; } + static GLint Internal (GLuint theChannels) + { + switch (theChannels) + { + case 1: return GL_R16; + case 2: return GL_RG16; + case 3: return GL_RGB16; + case 4: return GL_RGBA16; + default: return GL_NONE; + } + } +}; + +//! Specialization for float. +template<> struct OpenGl_TextureFormatSelector +{ + static GLint DataType() { return GL_FLOAT; } + static GLint Internal (GLuint theChannels) + { + switch (theChannels) + { + case 1: return GL_R32F; + case 2: return GL_RG32F; + case 3: return GL_RGB32F; + case 4: return GL_RGBA32F; + default: return GL_NONE; + } + } +}; + +//! Specialization for unsigned int. +template<> struct OpenGl_TextureFormatSelector +{ + static GLint DataType() { return GL_UNSIGNED_INT; } + static GLint Internal (GLuint theChannels) + { + switch (theChannels) + { + case 1: return GL_RED; + case 2: return GL_RG; + case 3: return GL_RGB; + case 4: return GL_RGBA; + default: return GL_NONE; + } + } +}; + +//! Specialization for signed byte. +template<> struct OpenGl_TextureFormatSelector +{ + static GLint DataType() { return GL_BYTE; } + static GLint Internal (GLuint theChannels) + { + switch (theChannels) + { + case 1: return GL_R8_SNORM; + case 2: return GL_RG8_SNORM; + case 3: return GL_RGB8_SNORM; + case 4: return GL_RGBA8_SNORM; + default: return GL_NONE; + } + } +}; + +//! Specialization for signed short. +template<> struct OpenGl_TextureFormatSelector +{ + static GLint DataType() { return GL_SHORT; } + static GLint Internal (GLuint theChannels) + { + switch (theChannels) + { + case 1: return GL_R16_SNORM; + case 2: return GL_RG16_SNORM; + case 3: return GL_RGB16_SNORM; + case 4: return GL_RGBA16_SNORM; + default: return GL_NONE; + } + } +}; + +//! Specialization for signed int. +template<> struct OpenGl_TextureFormatSelector +{ + static GLint DataType() { return GL_INT; } + static GLint Internal (GLuint theChannels) + { + switch (theChannels) + { + case 1: return GL_RED_SNORM; + case 2: return GL_RG_SNORM; + case 3: return GL_RGB_SNORM; + case 4: return GL_RGBA_SNORM; + default: return GL_NONE; + } + } +}; + +// ======================================================================= +// function : Create +// purpose : +// ======================================================================= +template +inline OpenGl_TextureFormat OpenGl_TextureFormat::Create() +{ + OpenGl_TextureFormat aFormat; + aFormat.SetNbComponents (theNbComps); + aFormat.SetInternalFormat (OpenGl_TextureFormatSelector::Internal (theNbComps)); + aFormat.SetDataType (OpenGl_TextureFormatSelector::DataType()); + GLenum aPixelFormat = GL_NONE; + switch (theNbComps) + { + case 1: aPixelFormat = GL_RED; break; + case 2: aPixelFormat = GL_RG; break; + case 3: aPixelFormat = GL_RGB; break; + case 4: aPixelFormat = GL_RGBA; break; + } + aFormat.SetPixelFormat (aPixelFormat); + return aFormat; +} + +#endif // _OpenGl_TextureFormat_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Texture.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Texture.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Texture.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Texture.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,7 +16,7 @@ #define _OpenGl_Texture_H__ #include -#include +#include #include #include #include @@ -25,262 +25,6 @@ class Graphic3d_TextureParams; class Image_PixMap; -//! Selects preferable texture format for specified parameters. -template -struct OpenGl_TextureFormatSelector -{ - // Not implemented -}; - -template<> -struct OpenGl_TextureFormatSelector -{ - static GLint Internal (GLuint theChannels) - { - switch (theChannels) - { - case 1: - return GL_R8; - case 2: - return GL_RG8; - case 3: - return GL_RGB8; - case 4: - return GL_RGBA8; - default: - return GL_NONE; - } - } - - static GLint DataType() - { - return GL_UNSIGNED_BYTE; - } -}; - -template<> -struct OpenGl_TextureFormatSelector -{ - static GLint Internal (GLuint theChannels) - { - switch (theChannels) - { - case 1: - return GL_R16; - case 2: - return GL_RG16; - case 3: - return GL_RGB16; - case 4: - return GL_RGBA16; - default: - return GL_NONE; - } - } - - static GLint DataType() - { - return GL_UNSIGNED_SHORT; - } -}; - -template<> -struct OpenGl_TextureFormatSelector -{ - static GLint Internal (GLuint theChannels) - { - switch (theChannels) - { - case 1: - return GL_R32F; - case 2: - return GL_RG32F; - case 3: - return GL_RGB32F; - case 4: - return GL_RGBA32F; - default: - return GL_NONE; - } - } - - static GLint DataType() - { - return GL_FLOAT; - } -}; - -template<> -struct OpenGl_TextureFormatSelector -{ - static GLint Internal (GLuint theChannels) - { - switch (theChannels) - { - case 1: - return GL_RED; - case 2: - return GL_RG; - case 3: - return GL_RGB; - case 4: - return GL_RGBA; - default: - return GL_NONE; - } - } - - static GLint DataType() - { - return GL_UNSIGNED_INT; - } -}; - -//! Only unsigned formats are available in OpenGL ES 2.0 -#if !defined(GL_ES_VERSION_2_0) -template<> -struct OpenGl_TextureFormatSelector -{ - static GLint Internal (GLuint theChannels) - { - switch (theChannels) - { - case 1: - return GL_R8_SNORM; - case 2: - return GL_RG8_SNORM; - case 3: - return GL_RGB8_SNORM; - case 4: - return GL_RGBA8_SNORM; - default: - return GL_NONE; - } - } - - static GLint DataType() - { - return GL_BYTE; - } -}; - -template<> -struct OpenGl_TextureFormatSelector -{ - static GLint Internal (GLuint theChannels) - { - switch (theChannels) - { - case 1: - return GL_R16_SNORM; - case 2: - return GL_RG16_SNORM; - case 3: - return GL_RGB16_SNORM; - case 4: - return GL_RGBA16_SNORM; - default: - return GL_NONE; - } - } - - static GLint DataType() - { - return GL_SHORT; - } -}; - -template<> -struct OpenGl_TextureFormatSelector -{ - static GLint Internal (GLuint theChannels) - { - switch (theChannels) - { - case 1: - return GL_RED_SNORM; - case 2: - return GL_RG_SNORM; - case 3: - return GL_RGB_SNORM; - case 4: - return GL_RGBA_SNORM; - default: - return GL_NONE; - } - } - - static GLint DataType() - { - return GL_INT; - } -}; -#endif - -//! Stores parameters of OpenGL texture format. -class OpenGl_TextureFormat -{ - friend class OpenGl_Texture; - -public: - - //! Returns OpenGL format of the pixel data. - inline GLenum Format() const - { - switch (myChannels) - { - case 1: - return GL_RED; - case 2: - return GL_RG; - case 3: - return GL_RGB; - case 4: - return GL_RGBA; - default: - return GL_NONE; - } - } - - //! Returns OpenGL internal format of the pixel data. - inline GLint Internal() const - { - return myInternal; - } - - //! Returns OpenGL data type of the pixel data. - inline GLint DataType() const - { - return myDataType; - } - - //! Returns texture format for specified type and number of channels. - template - static OpenGl_TextureFormat Create() - { - return OpenGl_TextureFormat (N, - OpenGl_TextureFormatSelector::Internal(N), - OpenGl_TextureFormatSelector::DataType()); - } - -private: - - //! Creates new texture format. - OpenGl_TextureFormat (const GLint theChannels, - const GLint theInternal, - const GLint theDataType) - : myInternal (theInternal), - myChannels (theChannels), - myDataType (theDataType) {} - -private: - - GLint myInternal; //!< OpenGL internal format of the pixel data - GLint myChannels; //!< Number of channels for each pixel (from 1 to 4) - GLint myDataType; //!< OpenGL data type of input pixel data - -}; - //! Texture resource. class OpenGl_Texture : public OpenGl_NamedResource { @@ -305,59 +49,39 @@ Standard_EXPORT virtual ~OpenGl_Texture(); //! @return true if current object was initialized - inline bool IsValid() const - { - return myTextureId != NO_TEXTURE; - } + bool IsValid() const { return myTextureId != NO_TEXTURE; } //! @return target to which the texture is bound (GL_TEXTURE_1D, GL_TEXTURE_2D) - inline GLenum GetTarget() const - { - return myTarget; - } + GLenum GetTarget() const { return myTarget; } //! @return texture width (0 LOD) - inline GLsizei SizeX() const - { - return mySizeX; - } + GLsizei SizeX() const { return mySizeX; } //! @return texture height (0 LOD) - inline GLsizei SizeY() const - { - return mySizeY; - } + GLsizei SizeY() const { return mySizeY; } //! @return texture ID - inline GLuint TextureId() const - { - return myTextureId; - } + GLuint TextureId() const { return myTextureId; } //! @return texture format (not sized) - inline GLenum GetFormat() const - { - return myTextFormat; - } + GLenum GetFormat() const { return myTextFormat; } //! @return texture format (sized) - GLint SizedFormat() const - { - return mySizedFormat; - } + GLint SizedFormat() const { return mySizedFormat; } //! Return true for GL_RED and GL_ALPHA formats. - bool IsAlpha() const - { - return myIsAlpha; - } + bool IsAlpha() const { return myIsAlpha; } - //! Setup to interprete the format as Alpha by Shader Manager + //! Setup to interpret the format as Alpha by Shader Manager //! (should be GL_ALPHA within compatible context or GL_RED otherwise). - void SetAlpha (const bool theValue) - { - myIsAlpha = theValue; - } + void SetAlpha (const bool theValue) { myIsAlpha = theValue; } + + //! Return if 2D surface is defined top-down (TRUE) or bottom-up (FALSE). + //! Normally set from Image_PixMap::IsTopDown() within texture initialization. + bool IsTopDown() const { return myIsTopDown; } + + //! Set if 2D surface is defined top-down (TRUE) or bottom-up (FALSE). + void SetTopDown (bool theIsTopDown) { myIsTopDown = theIsTopDown; } //! Creates Texture id if not yet generated. //! Data should be initialized by another method. @@ -409,26 +133,29 @@ //! Notice that texture will be unbound after this call. Standard_EXPORT bool Init (const Handle(OpenGl_Context)& theCtx, const Image_PixMap& theImage, - const Graphic3d_TypeOfTexture theType); + const Graphic3d_TypeOfTexture theType, + const Standard_Boolean theIsColorMap); //! Initialize the texture with specified format, size and texture type. //! If theImage is empty the texture data will contain trash. //! Notice that texture will be unbound after this call. Standard_EXPORT bool Init (const Handle(OpenGl_Context)& theCtx, - const GLint theTextFormat, - const GLenum thePixelFormat, - const GLenum theDataType, - const GLsizei theSizeX, - const GLsizei theSizeY, + const OpenGl_TextureFormat& theFormat, + const Graphic3d_Vec2i& theSizeXY, const Graphic3d_TypeOfTexture theType, const Image_PixMap* theImage = NULL); //! Initialize the texture with Graphic3d_TextureMap. //! It is an universal way to initialize. - //! Sitable initialization method will be chosen. + //! Suitable initialization method will be chosen. Standard_EXPORT bool Init (const Handle(OpenGl_Context)& theCtx, const Handle(Graphic3d_TextureMap)& theTextureMap); + //! Initialize the texture with Image_CompressedPixMap. + Standard_EXPORT bool InitCompressed (const Handle(OpenGl_Context)& theCtx, + const Image_CompressedPixMap& theImage, + const Standard_Boolean theIsColorMap); + //! Initialize the 2D multisampling texture using glTexImage2DMultisample(). Standard_EXPORT bool Init2DMultisample (const Handle(OpenGl_Context)& theCtx, const GLsizei theNbSamples, @@ -445,60 +172,109 @@ //! Initializes 3D texture rectangle with specified format and size. Standard_EXPORT bool Init3D (const Handle(OpenGl_Context)& theCtx, - const GLint theTextFormat, - const GLenum thePixelFormat, - const GLenum theDataType, - const Standard_Integer theSizeX, - const Standard_Integer theSizeY, - const Standard_Integer theSizeZ, + const OpenGl_TextureFormat& theFormat, + const Graphic3d_Vec3i& theSizeXYZ, const void* thePixels); - //! Initializes 6 sides of cubemap. - //! If theCubeMap is not NULL then size and format will be taken from it - //! and corresponding arguments will be ignored. - //! Otherwise this parametres will be taken from arguments. - //! theToGenMipmap allows to generate mipmaped cubemap. - Standard_EXPORT bool InitCubeMap (const Handle(OpenGl_Context)& theCtx, - const Handle(Graphic3d_CubeMap)& theCubeMap, - Standard_Size theSize = 0, - Image_Format theFormat = Image_Format_RGB, - Standard_Boolean theToGenMipmap = Standard_False); - - //! The same InitCubeMap but there is another order of arguments. - bool InitCubeMap (const Handle(OpenGl_Context)& theCtx, - const Handle(Graphic3d_CubeMap)& theCubeMap, - Standard_Boolean theToGenMipmap, - Standard_Size theSize = 0, - Image_Format theFormat = Image_Format_RGB) - { - return InitCubeMap (theCtx, theCubeMap, theSize, theFormat, theToGenMipmap); - } - //! @return true if texture was generated within mipmaps - Standard_Boolean HasMipmaps() const { return myHasMipmaps; } + Standard_Boolean HasMipmaps() const { return myMaxMipLevel > 0; } - //! Return texture type and format by Image_Format. - Standard_EXPORT static bool GetDataFormat (const Handle(OpenGl_Context)& theCtx, - const Image_Format theFromat, - GLint& theTextFormat, - GLenum& thePixelFormat, - GLenum& theDataType); + //! Return upper mipmap level index (0 means no mipmaps). + Standard_Integer MaxMipmapLevel() const { return myMaxMipLevel; } + + //! Returns estimated GPU memory usage for holding data without considering overheads and allocation alignment rules. + Standard_EXPORT virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE; + + //! Returns TRUE for point sprite texture. + virtual bool IsPointSprite() const { return false; } + +public: - //! Return texture type and format by Image_PixMap data format. + Standard_DEPRECATED("Deprecated method, OpenGl_TextureFormat::FindFormat() should be used instead") static bool GetDataFormat (const Handle(OpenGl_Context)& theCtx, - const Image_PixMap& theData, + const Image_Format theFormat, GLint& theTextFormat, GLenum& thePixelFormat, GLenum& theDataType) { - return GetDataFormat (theCtx, theData.Format(), theTextFormat, thePixelFormat, theDataType); + OpenGl_TextureFormat aFormat = OpenGl_TextureFormat::FindFormat (theCtx, theFormat, false); + theTextFormat = aFormat.InternalFormat(); + thePixelFormat = aFormat.PixelFormat(); + theDataType = aFormat.DataType(); + return aFormat.IsValid(); } - //! Returns estimated GPU memory usage for holding data without considering overheads and allocation alignment rules. - Standard_EXPORT virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE; + Standard_DEPRECATED("Deprecated method, OpenGl_TextureFormat::FindFormat() should be used instead") + static bool GetDataFormat (const Handle(OpenGl_Context)& theCtx, + const Image_PixMap& theData, + GLint& theTextFormat, + GLenum& thePixelFormat, + GLenum& theDataType) + { + OpenGl_TextureFormat aFormat = OpenGl_TextureFormat::FindFormat (theCtx, theData.Format(), false); + theTextFormat = aFormat.InternalFormat(); + thePixelFormat = aFormat.PixelFormat(); + theDataType = aFormat.DataType(); + return aFormat.IsValid(); + } + + Standard_DEPRECATED("Deprecated method, OpenGl_TextureFormat should be passed instead of separate parameters") + bool Init (const Handle(OpenGl_Context)& theCtx, + const GLint theTextFormat, + const GLenum thePixelFormat, + const GLenum theDataType, + const GLsizei theSizeX, + const GLsizei theSizeY, + const Graphic3d_TypeOfTexture theType, + const Image_PixMap* theImage = NULL) + { + OpenGl_TextureFormat aFormat; + aFormat.SetInternalFormat (theTextFormat); + aFormat.SetPixelFormat (thePixelFormat); + aFormat.SetDataType (theDataType); + return Init (theCtx, aFormat, Graphic3d_Vec2i (theSizeX, theSizeY), theType, theImage); + } + + Standard_DEPRECATED("Deprecated method, theIsColorMap parameter should be explicitly specified") + bool Init (const Handle(OpenGl_Context)& theCtx, + const Image_PixMap& theImage, + const Graphic3d_TypeOfTexture theType) + { + return Init (theCtx, theImage, theType, true); + } + + Standard_DEPRECATED("Deprecated method, OpenGl_TextureFormat should be passed instead of separate parameters") + bool Init3D (const Handle(OpenGl_Context)& theCtx, + const GLint theTextFormat, + const GLenum thePixelFormat, + const GLenum theDataType, + const Standard_Integer theSizeX, + const Standard_Integer theSizeY, + const Standard_Integer theSizeZ, + const void* thePixels) + { + OpenGl_TextureFormat aFormat; + aFormat.SetInternalFormat (theTextFormat); + aFormat.SetPixelFormat (thePixelFormat); + aFormat.SetDataType (theDataType); + return Init3D (theCtx, aFormat, Graphic3d_Vec3i (theSizeX, theSizeY, theSizeZ), thePixels); + } - //! Returns TRUE for point sprite texture. - virtual bool IsPointSprite() const { return false; } + //! Initializes 6 sides of cubemap. + //! If theCubeMap is not NULL then size and format will be taken from it and corresponding arguments will be ignored. + //! Otherwise this parametres will be taken from arguments. + //! @param theCtx [in] active OpenGL context + //! @param theCubeMap [in] cubemap definition, can be NULL + //! @param theSize [in] cubemap dimensions + //! @param theFormat [in] image format + //! @param theToGenMipmap [in] flag to generate mipmaped cubemap + //! @param theIsColorMap [in] flag indicating cubemap storing color values + Standard_EXPORT bool InitCubeMap (const Handle(OpenGl_Context)& theCtx, + const Handle(Graphic3d_CubeMap)& theCubeMap, + Standard_Size theSize, + Image_Format theFormat, + Standard_Boolean theToGenMipmap, + Standard_Boolean theIsColorMap); protected: @@ -517,8 +293,9 @@ GLenum myTextFormat; //!< texture format - GL_RGB, GL_RGBA,... GLint mySizedFormat;//!< internal (sized) texture format Standard_Integer myNbSamples; //!< number of MSAA samples - Standard_Boolean myHasMipmaps; //!< flag indicates that texture was uploaded with mipmaps + Standard_Integer myMaxMipLevel;//!< upper mipmap level index (0 means no mipmaps) bool myIsAlpha; //!< indicates alpha format + bool myIsTopDown; //!< indicates if 2D surface is defined top-down (TRUE) or bottom-up (FALSE) }; diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextureSet.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextureSet.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextureSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextureSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,14 +19,29 @@ IMPLEMENT_STANDARD_RTTIEXT(OpenGl_TextureSet, Standard_Transient) // ======================================================================= +// function : OpenGl_TextureSet +// purpose : +// ======================================================================= +OpenGl_TextureSet::OpenGl_TextureSet (const Handle(OpenGl_Texture)& theTexture) +: myTextures (0, 0), + myTextureSetBits (Graphic3d_TextureSetBits_NONE) +{ + if (!theTexture.IsNull()) + { + myTextures.ChangeFirst().Texture = theTexture; + myTextures.ChangeFirst().Unit = theTexture->Sampler()->Parameters()->TextureUnit(); + } +} + +// ======================================================================= // function : IsModulate // purpose : // ======================================================================= bool OpenGl_TextureSet::IsModulate() const { return myTextures.IsEmpty() - || myTextures.First().IsNull() - || myTextures.First()->Sampler()->Parameters()->IsModulate(); + || myTextures.First().Texture.IsNull() + || myTextures.First().Texture->Sampler()->Parameters()->IsModulate(); } // ======================================================================= @@ -41,10 +56,10 @@ } else if (myTextures.Size() == 1) { - return !myTextures.First().IsNull() - && !myTextures.First()->IsPointSprite(); + return !myTextures.First().Texture.IsNull() + && !myTextures.First().Texture->IsPointSprite(); } - return !myTextures.First().IsNull(); + return !myTextures.First().Texture.IsNull(); } // ======================================================================= @@ -54,6 +69,6 @@ bool OpenGl_TextureSet::HasPointSprite() const { return !myTextures.IsEmpty() - && !myTextures.Last().IsNull() - && myTextures.Last()->IsPointSprite(); + && !myTextures.Last().Texture.IsNull() + && myTextures.Last().Texture->IsPointSprite(); } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextureSet.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextureSet.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextureSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextureSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,17 +15,31 @@ #define _OpenGl_TextureSet_Header #include +#include class OpenGl_Texture; //! Class holding array of textures to be mapped as a set. +//! Textures should be defined in ascending order of texture units within the set. class OpenGl_TextureSet : public Standard_Transient { DEFINE_STANDARD_RTTIEXT(OpenGl_TextureSet, Standard_Transient) public: + //! Texture slot - combination of Texture and binding Unit. + struct TextureSlot + { + Handle(OpenGl_Texture) Texture; + Graphic3d_TextureUnit Unit; + + operator const Handle(OpenGl_Texture)& () const { return Texture; } + operator Handle(OpenGl_Texture)& () { return Texture; } + + TextureSlot() : Unit (Graphic3d_TextureUnit_0) {} + }; + //! Class for iterating texture set. - class Iterator : public NCollection_Array1::Iterator + class Iterator : public NCollection_Array1::Iterator { public: //! Empty constructor. @@ -36,26 +50,37 @@ { if (!theSet.IsNull()) { - NCollection_Array1::Iterator::Init (theSet->myTextures); + NCollection_Array1::Iterator::Init (theSet->myTextures); } } + + //! Access texture. + const Handle(OpenGl_Texture)& Value() const { return NCollection_Array1::Iterator::Value().Texture; } + Handle(OpenGl_Texture)& ChangeValue() { return NCollection_Array1::Iterator::ChangeValue().Texture; } + + //! Access texture unit. + Graphic3d_TextureUnit Unit() const { return NCollection_Array1::Iterator::Value().Unit; } + Graphic3d_TextureUnit& ChangeUnit() { return NCollection_Array1::Iterator::ChangeValue().Unit; } }; public: //! Empty constructor. - OpenGl_TextureSet() {} + OpenGl_TextureSet() : myTextureSetBits (Graphic3d_TextureSetBits_NONE) {} //! Constructor. OpenGl_TextureSet (Standard_Integer theNbTextures) - : myTextures (0, theNbTextures - 1) {} + : myTextures (0, theNbTextures - 1), + myTextureSetBits (Graphic3d_TextureSetBits_NONE) {} //! Constructor for a single texture. - OpenGl_TextureSet (const Handle(OpenGl_Texture)& theTexture) - : myTextures (0, 0) - { - myTextures.ChangeFirst() = theTexture; - } + Standard_EXPORT OpenGl_TextureSet (const Handle(OpenGl_Texture)& theTexture); + + //! Return texture units declared within the program, @sa Graphic3d_TextureSetBits. + Standard_Integer TextureSetBits() const { return myTextureSetBits; } + + //! Return texture units declared within the program, @sa Graphic3d_TextureSetBits. + Standard_Integer& ChangeTextureSetBits() { return myTextureSetBits; } //! Return TRUE if texture array is empty. Standard_Boolean IsEmpty() const { return myTextures.IsEmpty(); } @@ -70,22 +95,31 @@ Standard_Integer Upper() const { return myTextures.Upper(); } //! Return the first texture. - const Handle(OpenGl_Texture)& First() const { return myTextures.First(); } + const Handle(OpenGl_Texture)& First() const { return myTextures.First().Texture; } //! Return the first texture. - Handle(OpenGl_Texture)& ChangeFirst() { return myTextures.ChangeFirst(); } + Handle(OpenGl_Texture)& ChangeFirst() { return myTextures.ChangeFirst().Texture; } + + //! Return the first texture unit. + Graphic3d_TextureUnit FirstUnit() const { return myTextures.First().Unit; } //! Return the last texture. - const Handle(OpenGl_Texture)& Last() const { return myTextures.Last(); } + const Handle(OpenGl_Texture)& Last() const { return myTextures.Last().Texture; } //! Return the last texture. - Handle(OpenGl_Texture)& ChangeLast() { return myTextures.ChangeLast(); } + Handle(OpenGl_Texture)& ChangeLast() { return myTextures.ChangeLast().Texture; } + + //! Return the last texture unit. + Graphic3d_TextureUnit LastUnit() const { return myTextures.Last().Unit; } + + //! Return the last texture unit. + Graphic3d_TextureUnit& ChangeLastUnit() { return myTextures.ChangeLast().Unit; } //! Return the texture at specified position within [0, Size()) range. - const Handle(OpenGl_Texture)& Value (Standard_Integer theIndex) const { return myTextures.Value (theIndex); } + const Handle(OpenGl_Texture)& Value (Standard_Integer theIndex) const { return myTextures.Value (theIndex).Texture; } //! Return the texture at specified position within [0, Size()) range. - Handle(OpenGl_Texture)& ChangeValue (Standard_Integer theIndex) { return myTextures.ChangeValue (theIndex); } + Handle(OpenGl_Texture)& ChangeValue (Standard_Integer theIndex) { return myTextures.ChangeValue (theIndex).Texture; } //! Return TRUE if texture color modulation has been enabled for the first texture //! or if texture is not set at all. @@ -100,12 +134,14 @@ //! Nullify all handles. void InitZero() { - myTextures.Init (Handle(OpenGl_Texture)()); + myTextures.Init (TextureSlot()); + myTextureSetBits = Graphic3d_TextureSetBits_NONE; } protected: - NCollection_Array1 myTextures; + NCollection_Array1 myTextures; + Standard_Integer myTextureSetBits; }; diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextureSetPairIterator.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextureSetPairIterator.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TextureSetPairIterator.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TextureSetPairIterator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,104 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _OpenGl_TextureSetPairIterator_Header +#define _OpenGl_TextureSetPairIterator_Header + +#include + +//! Class for iterating pair of texture sets through each defined texture slot. +//! Note that iterator considers texture slots being in ascending order within OpenGl_TextureSet. +class OpenGl_TextureSetPairIterator +{ +public: + + //! Constructor. + OpenGl_TextureSetPairIterator (const Handle(OpenGl_TextureSet)& theSet1, + const Handle(OpenGl_TextureSet)& theSet2) + : myIter1 (theSet1), + myIter2 (theSet2), + myTexture1 (NULL), + myTexture2 (NULL), + myUnitLower (IntegerLast()), + myUnitUpper (IntegerFirst()), + myUnitCurrent (0) + { + if (!theSet1.IsNull() + && !theSet1->IsEmpty()) + { + myUnitLower = Min (myUnitLower, theSet1->FirstUnit()); + myUnitUpper = Max (myUnitUpper, theSet1->LastUnit()); + } + if (!theSet2.IsNull() + && !theSet2->IsEmpty()) + { + myUnitLower = Min (myUnitLower, theSet2->FirstUnit()); + myUnitUpper = Max (myUnitUpper, theSet2->LastUnit()); + } + myUnitCurrent = myUnitLower; + myTexture1 = (myIter1.More() && myIter1.Unit() == myUnitCurrent) + ? myIter1.ChangeValue().get() + : NULL; + myTexture2 = (myIter2.More() && myIter2.Unit() == myUnitCurrent) + ? myIter2.ChangeValue().get() + : NULL; + } + + //! Return TRUE if there are more texture units to pass through. + bool More() const { return myUnitCurrent <= myUnitUpper; } + + //! Return current texture unit. + Graphic3d_TextureUnit Unit() const { return (Graphic3d_TextureUnit )myUnitCurrent; } + + //! Access texture from first texture set. + const OpenGl_Texture* Texture1() const { return myTexture1; } + + //! Access texture from second texture set. + const OpenGl_Texture* Texture2() const { return myTexture2; } + + //! Move iterator position to the next pair. + void Next() + { + ++myUnitCurrent; + myTexture1 = myTexture2 = NULL; + for (; myIter1.More(); myIter1.Next()) + { + if (myIter1.Unit() >= myUnitCurrent) + { + myTexture1 = myIter1.Unit() == myUnitCurrent ? myIter1.ChangeValue().get() : NULL; + break; + } + } + for (; myIter2.More(); myIter2.Next()) + { + if (myIter2.Unit() >= myUnitCurrent) + { + myTexture2 = myIter2.Unit() == myUnitCurrent ? myIter2.ChangeValue().get() : NULL; + break; + } + } + } + +private: + + OpenGl_TextureSet::Iterator myIter1; + OpenGl_TextureSet::Iterator myIter2; + OpenGl_Texture* myTexture1; + OpenGl_Texture* myTexture2; + Standard_Integer myUnitLower; + Standard_Integer myUnitUpper; + Standard_Integer myUnitCurrent; + +}; + +#endif //_OpenGl_TextureSetPairIterator_Header diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TileSampler.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TileSampler.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_TileSampler.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_TileSampler.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,7 +31,7 @@ myTileSize (0), myViewSize (0, 0) { - mySampler.initFaure(); + // } //======================================================================= @@ -301,9 +301,11 @@ || theOffsetsTexture->SizeY() != (int )anOffsets.SizeY || !theOffsetsTexture->IsValid()) { - theOffsetsTexture->Release (theContext.operator->()); - if (!theOffsetsTexture->Init (theContext, GL_RG32I, GL_RG_INTEGER, GL_INT, - (int )anOffsets.SizeX, (int )anOffsets.SizeY, Graphic3d_TOT_2D)) + theOffsetsTexture->Release (theContext.get()); + if (!theOffsetsTexture->Init (theContext, + OpenGl_TextureFormat::FindSizedFormat (theContext, GL_RG32I), + Graphic3d_Vec2i ((int )anOffsets.SizeX, (int )anOffsets.SizeY), + Graphic3d_TOT_2D)) { hasErrors = true; } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_VertexBufferCompat.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_VertexBufferCompat.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_VertexBufferCompat.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_VertexBufferCompat.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -175,3 +175,27 @@ memcpy (myData->ChangeData() + anOffset, theData, aNbBytes); return true; } + +// ======================================================================= +// function : getSubData +// purpose : +// ======================================================================= +bool OpenGl_VertexBufferCompat::getSubData (const Handle(OpenGl_Context)& , + const GLsizei theElemFrom, + const GLsizei theElemsNb, + void* theData, + const GLenum theDataType) +{ + if (!IsValid() || myDataType != theDataType + || theElemFrom < 0 || ((theElemFrom + theElemsNb) > myElemsNb) + || theData == NULL) + { + return false; + } + + const size_t aDataSize = sizeOfGlType (theDataType); + const size_t anOffset = size_t(theElemFrom) * size_t(myComponentsNb) * aDataSize; + const size_t aNbBytes = size_t(theElemsNb) * size_t(myComponentsNb) * aDataSize; + memcpy (theData, myData->Data() + anOffset, aNbBytes); + return true; +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_VertexBufferCompat.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_VertexBufferCompat.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_VertexBufferCompat.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_VertexBufferCompat.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -82,6 +82,13 @@ const void* theData, const GLenum theDataType) Standard_OVERRIDE; + //! Read back buffer sub-range. + Standard_EXPORT virtual bool getSubData (const Handle(OpenGl_Context)& theGlCtx, + const GLsizei theElemFrom, + const GLsizei theElemsNb, + void* theData, + const GLenum theDataType) Standard_OVERRIDE; + protected: Handle(NCollection_Buffer) myData; //!< buffer data diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_VertexBuffer.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_VertexBuffer.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_VertexBuffer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_VertexBuffer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -161,6 +161,33 @@ } // ======================================================================= +// function : getSubData +// purpose : +// ======================================================================= +bool OpenGl_VertexBuffer::getSubData (const Handle(OpenGl_Context)& theGlCtx, + const GLsizei theElemFrom, + const GLsizei theElemsNb, + void* theData, + const GLenum theDataType) +{ + if (!IsValid() || myDataType != theDataType + || theElemFrom < 0 || ((theElemFrom + theElemsNb) > myElemsNb) + || !theGlCtx->hasGetBufferData) + { + return false; + } + + Bind (theGlCtx); + const size_t aDataSize = sizeOfGlType (theDataType); + const GLintptr anOffset = GLintptr (theElemFrom) * GLintptr (myComponentsNb) * aDataSize; + const GLsizeiptr aSize = GLsizeiptr(theElemsNb) * GLsizeiptr(myComponentsNb) * aDataSize; + bool isDone = theGlCtx->GetBufferSubData (GetTarget(), anOffset, aSize, theData); + isDone = isDone && (glGetError() == GL_NO_ERROR); + Unbind (theGlCtx); + return isDone; +} + +// ======================================================================= // function : BindVertexAttrib // purpose : // ======================================================================= @@ -250,3 +277,21 @@ theCtx->ShaderManager()->UpdateMaterialState(); } #endif + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_VertexBuffer::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, OpenGl_Resource) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, GetTarget()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myOffset) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBufferId) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myComponentsNb) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myElemsNb) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDataType) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_VertexBuffer.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_VertexBuffer.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_VertexBuffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_VertexBuffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -154,6 +154,20 @@ return subData (theGlCtx, theElemFrom, theElemsNb, theData, GL_FLOAT); } + //! Read back buffer sub-range. + //! Notice that VBO will be unbound after this call. + //! Function reads portion of data from this VBO using glGetBufferSubData(). + //! @param theElemFrom [in] element id from which replace buffer data (>=0); + //! @param theElemsNb [in] elements count (theElemFrom + theElemsNb <= GetElemsNb()); + //! @param theData [out] destination pointer to GLfloat data. + bool GetSubData (const Handle(OpenGl_Context)& theGlCtx, + const GLsizei theElemFrom, + const GLsizei theElemsNb, + GLfloat* theData) + { + return getSubData (theGlCtx, theElemFrom, theElemsNb, theData, GL_FLOAT); + } + //! Notice that VBO will be unbound after this call. //! Function replaces portion of data within this VBO using glBufferSubData(). //! The VBO should be initialized before call. @@ -168,6 +182,20 @@ return subData (theGlCtx, theElemFrom, theElemsNb, theData, GL_UNSIGNED_INT); } + //! Read back buffer sub-range. + //! Notice that VBO will be unbound after this call. + //! Function reads portion of data from this VBO using glGetBufferSubData(). + //! @param theElemFrom [in] element id from which replace buffer data (>=0); + //! @param theElemsNb [in] elements count (theElemFrom + theElemsNb <= GetElemsNb()); + //! @param theData [out] destination pointer to GLuint data. + bool GetSubData (const Handle(OpenGl_Context)& theGlCtx, + const GLsizei theElemFrom, + const GLsizei theElemsNb, + GLuint* theData) + { + return getSubData (theGlCtx, theElemFrom, theElemsNb, theData, GL_UNSIGNED_INT); + } + //! Notice that VBO will be unbound after this call. //! Function replaces portion of data within this VBO using glBufferSubData(). //! The VBO should be initialized before call. @@ -182,6 +210,20 @@ return subData (theGlCtx, theElemFrom, theElemsNb, theData, GL_UNSIGNED_SHORT); } + //! Read back buffer sub-range. + //! Notice that VBO will be unbound after this call. + //! Function reads portion of data from this VBO using glGetBufferSubData(). + //! @param theElemFrom [in] element id from which replace buffer data (>=0); + //! @param theElemsNb [in] elements count (theElemFrom + theElemsNb <= GetElemsNb()); + //! @param theData [out] destination pointer to GLushort data. + bool GetSubData (const Handle(OpenGl_Context)& theGlCtx, + const GLsizei theElemFrom, + const GLsizei theElemsNb, + GLushort* theData) + { + return getSubData (theGlCtx, theElemFrom, theElemsNb, theData, GL_UNSIGNED_SHORT); + } + //! Notice that VBO will be unbound after this call. //! Function replaces portion of data within this VBO using glBufferSubData(). //! The VBO should be initialized before call. @@ -196,6 +238,20 @@ return subData (theGlCtx, theElemFrom, theElemsNb, theData, GL_UNSIGNED_BYTE); } + //! Read back buffer sub-range. + //! Notice that VBO will be unbound after this call. + //! Function reads portion of data from this VBO using glGetBufferSubData(). + //! @param theElemFrom [in] element id from which replace buffer data (>=0); + //! @param theElemsNb [in] elements count (theElemFrom + theElemsNb <= GetElemsNb()); + //! @param theData [out] destination pointer to GLubyte data. + bool GetSubData (const Handle(OpenGl_Context)& theGlCtx, + const GLsizei theElemFrom, + const GLsizei theElemsNb, + GLubyte* theData) + { + return getSubData (theGlCtx, theElemFrom, theElemsNb, theData, GL_UNSIGNED_BYTE); + } + //! Bind this VBO to active GLSL program. Standard_EXPORT void BindVertexAttrib (const Handle(OpenGl_Context)& theGlCtx, const GLuint theAttribLoc) const; @@ -286,6 +342,13 @@ const void* theData, const GLenum theDataType); + //! Read back buffer sub-range. + Standard_EXPORT virtual bool getSubData (const Handle(OpenGl_Context)& theGlCtx, + const GLsizei theElemFrom, + const GLsizei theElemsNb, + void* theData, + const GLenum theDataType); + //! Setup array pointer - either for active GLSL program OpenGl_Context::ActiveProgram() //! or for FFP using bindFixed() when no program bound. static void bindAttribute (const Handle(OpenGl_Context)& theGlCtx, @@ -336,6 +399,9 @@ //! Unbind all vertex attributes. Default implementation does nothing. Standard_EXPORT virtual void UnbindAllAttributes (const Handle(OpenGl_Context)& theGlCtx) const; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: GLubyte* myOffset; //!< offset to data diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_View.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_View.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_View.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_View.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,9 +57,11 @@ myCurrLightSourceState (theCounter->Increment()), myLightsRevision (0), myLastLightSourceState (0, 0), - myFboColorFormat (GL_RGBA8), + mySRgbState (-1), + myFboColorFormat (GL_SRGB8_ALPHA8), // note that GL_SRGB8 is not required to be renderable, unlike GL_RGB8, GL_RGBA8, GL_SRGB8_ALPHA8 myFboDepthFormat (GL_DEPTH24_STENCIL8), myToFlipOutput (Standard_False), + // myFrameCounter (0), myHasFboBlit (Standard_True), myToDisableOIT (Standard_False), @@ -71,6 +73,8 @@ myTextureParams (new OpenGl_Aspects()), myCubeMapParams (new OpenGl_Aspects()), myBackgroundType (Graphic3d_TOB_NONE), + myPBREnvState (OpenGl_PBREnvState_NONEXISTENT), + myPBREnvRequest (OpenGl_PBREnvRequest_NONE), // ray-tracing fields initialization myRaytraceInitStatus (OpenGl_RT_NONE), myIsRaytraceDataValid (Standard_False), @@ -96,6 +100,7 @@ Handle(Graphic3d_CLight) aLight = new Graphic3d_CLight (Graphic3d_TOLS_AMBIENT); aLight->SetHeadlight (false); aLight->SetColor (Quantity_NOC_WHITE); + myLights = new Graphic3d_LightSet(); myNoShadingLight = new Graphic3d_LightSet(); myNoShadingLight->Add (aLight); @@ -107,6 +112,7 @@ myImmediateSceneFbos[1] = new OpenGl_FrameBuffer(); myImmediateSceneFbosOit[0] = new OpenGl_FrameBuffer(); myImmediateSceneFbosOit[1] = new OpenGl_FrameBuffer(); + myXrSceneFbo = new OpenGl_FrameBuffer(); myOpenGlFBO = new OpenGl_FrameBuffer(); myOpenGlFBO2 = new OpenGl_FrameBuffer(); myRaytraceFBO1[0] = new OpenGl_FrameBuffer(); @@ -132,13 +138,12 @@ } // ======================================================================= -// function : ReleaseGlResources +// function : releaseSrgbResources // purpose : // ======================================================================= -void OpenGl_View::ReleaseGlResources (const Handle(OpenGl_Context)& theCtx) +void OpenGl_View::releaseSrgbResources (const Handle(OpenGl_Context)& theCtx) { - myGraduatedTrihedron.Release (theCtx.get()); - myFrameStatsPrs.Release (theCtx.get()); + myRenderParams.RebuildRayTracingShaders = true; if (!myTextureEnv.IsNull()) { @@ -179,12 +184,35 @@ myImmediateSceneFbos[1] ->Release (theCtx.get()); myImmediateSceneFbosOit[0]->Release (theCtx.get()); myImmediateSceneFbosOit[1]->Release (theCtx.get()); + myXrSceneFbo ->Release (theCtx.get()); myOpenGlFBO ->Release (theCtx.get()); myOpenGlFBO2 ->Release (theCtx.get()); myFullScreenQuad .Release (theCtx.get()); myFullScreenQuadFlip .Release (theCtx.get()); + // Technically we should also re-initialize all sRGB/RGB8 color textures. + // But for now consider this sRGB disabling/enabling to be done at application start-up + // and re-create dynamically only frame buffers. +} + +// ======================================================================= +// function : ReleaseGlResources +// purpose : +// ======================================================================= +void OpenGl_View::ReleaseGlResources (const Handle(OpenGl_Context)& theCtx) +{ + myGraduatedTrihedron.Release (theCtx.get()); + myFrameStatsPrs.Release (theCtx.get()); + + releaseSrgbResources (theCtx); + releaseRaytraceResources (theCtx); + + if (!myPBREnvironment.IsNull()) + { + myPBREnvironment->Release (theCtx.get()); + } + ReleaseXR(); } // ======================================================================= @@ -253,14 +281,13 @@ return; } - myTextureEnv = new OpenGl_TextureSet (1); - Handle(OpenGl_Texture)& aTextureEnv = myTextureEnv->ChangeFirst(); - aTextureEnv = new OpenGl_Texture (myTextureEnvData->GetId(), myTextureEnvData->GetParams()); - Handle(Image_PixMap) anImage = myTextureEnvData->GetImage(); - if (!anImage.IsNull()) + Handle(OpenGl_Texture) aTextureEnv = new OpenGl_Texture (myTextureEnvData->GetId(), myTextureEnvData->GetParams()); + if (Handle(Image_PixMap) anImage = myTextureEnvData->GetImage (theContext->SupportedTextureFormats())) { - aTextureEnv->Init (theContext, *anImage.operator->(), myTextureEnvData->Type()); + aTextureEnv->Init (theContext, *anImage, myTextureEnvData->Type(), true); } + myTextureEnv = new OpenGl_TextureSet (aTextureEnv); + myTextureEnv->ChangeTextureSetBits() = Graphic3d_TextureSetBits_BaseColor; } // ======================================================================= @@ -456,35 +483,71 @@ // function : SetBackgroundImage // purpose : // ======================================================================= -void OpenGl_View::SetBackgroundImage (const TCollection_AsciiString& theFilePath) +void OpenGl_View::SetBackgroundImage (const Handle(Graphic3d_TextureMap)& theTextureMap, + Standard_Boolean theToUpdatePBREnv) { - // Prepare aspect for texture storage - myBackgroundImagePath = theFilePath; + if (theTextureMap.IsNull() + || !theTextureMap->IsDone()) + { + if (myBackgroundType == Graphic3d_TOB_TEXTURE + || myBackgroundType == Graphic3d_TOB_CUBEMAP) + { + myBackgroundType = Graphic3d_TOB_NONE; + if (theToUpdatePBREnv) + { + myPBREnvRequest = OpenGl_PBREnvRequest_CLEAR; + } + } + return; + } + Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d(); - Handle(Graphic3d_Texture2Dmanual) aTextureMap = new Graphic3d_Texture2Dmanual (TCollection_AsciiString (theFilePath)); - aTextureMap->EnableRepeat(); - aTextureMap->DisableModulate(); - aTextureMap->GetParams()->SetGenMode (Graphic3d_TOTM_MANUAL, - Graphic3d_Vec4 (0.0f, 0.0f, 0.0f, 0.0f), - Graphic3d_Vec4 (0.0f, 0.0f, 0.0f, 0.0f)); - anAspect->SetTextureMap (aTextureMap); + Handle(Graphic3d_TextureSet) aTextureSet = new Graphic3d_TextureSet (theTextureMap); anAspect->SetInteriorStyle (Aspect_IS_SOLID); anAspect->SetSuppressBackFaces (false); - // Enable texture mapping - if (aTextureMap->IsDone()) + anAspect->SetShadingModel (Graphic3d_TOSM_UNLIT); + anAspect->SetTextureSet (aTextureSet); + anAspect->SetTextureMapOn (true); + + if (Handle(Graphic3d_Texture2D) aTextureMap = Handle(Graphic3d_Texture2D)::DownCast (theTextureMap)) { - anAspect->SetTextureMapOn(); + if (theToUpdatePBREnv && myBackgroundType == Graphic3d_TOB_CUBEMAP) + { + myPBREnvRequest = OpenGl_PBREnvRequest_CLEAR; + } + + myTextureParams->SetAspect (anAspect); + myBackgroundType = Graphic3d_TOB_TEXTURE; + myBackgroundImage = aTextureMap; + return; } - else + + if (Handle(Graphic3d_CubeMap) aCubeMap = Handle(Graphic3d_CubeMap)::DownCast (theTextureMap)) { - anAspect->SetTextureMapOff(); + if (theToUpdatePBREnv) + { + myPBREnvRequest = OpenGl_PBREnvRequest_BAKE; + } + + aCubeMap->SetMipmapsGeneration (Standard_True); + if (const Handle(OpenGl_Context)& aCtx = myWorkspace->GetGlContext()) + { + anAspect->SetShaderProgram (aCtx->ShaderManager()->GetBgCubeMapProgram()); + } + + myCubeMapParams->SetAspect (anAspect); + + const OpenGl_Aspects* anAspectsBackup = myWorkspace->SetAspects (myCubeMapParams); + myWorkspace->ApplyAspects(); + myWorkspace->SetAspects (anAspectsBackup); + myWorkspace->ApplyAspects(); + + myBackgroundType = Graphic3d_TOB_CUBEMAP; + myBackgroundCubeMap = aCubeMap; return; } - // Set texture parameters - myTextureParams->SetAspect (anAspect); - - myBackgroundType = Graphic3d_TOB_TEXTURE; + throw Standard_ProgramError ("OpenGl_View::SetBackgroundImage() - invalid texture map set for background"); } // ======================================================================= @@ -513,43 +576,14 @@ { return myBackgroundCubeMap; } - + // ======================================================================= -// function : SetBackgroundCubeMap +// function : SpecIBLMapLevels // purpose : // ======================================================================= -void OpenGl_View::SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap) +unsigned int OpenGl_View::SpecIBLMapLevels() const { - myBackgroundCubeMap = theCubeMap; - Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d; - Handle(Graphic3d_TextureSet) aTextureSet = new Graphic3d_TextureSet (myBackgroundCubeMap); - - anAspect->SetInteriorStyle(Aspect_IS_SOLID); - anAspect->SetSuppressBackFaces(false); - anAspect->SetTextureSet(aTextureSet); - - const Handle(OpenGl_Context)& aCtx = myWorkspace->GetGlContext(); - if (!aCtx.IsNull()) - { - anAspect->SetShaderProgram (aCtx->ShaderManager()->GetBgCubeMapProgram()); - } - - if (theCubeMap->IsDone()) - { - anAspect->SetTextureMapOn(); - } - else - { - anAspect->SetTextureMapOff(); - } - - myCubeMapParams->SetAspect(anAspect); - const OpenGl_Aspects* anAspectsBackup = myWorkspace->SetAspects (myCubeMapParams); - myWorkspace->ApplyAspects(); - myWorkspace->SetAspects (anAspectsBackup); - myWorkspace->ApplyAspects(); - - myBackgroundType = Graphic3d_TOB_CUBEMAP; + return myPBREnvironment.IsNull() ? 0 : myPBREnvironment->SpecMapLevelsNumber(); } //======================================================================= @@ -643,36 +677,6 @@ Bnd_Box aBox = base_type::MinMaxValues (theToIncludeAuxiliary); - // add bounding box of gradient/texture background for proper Z-fit - if (theToIncludeAuxiliary - && (myBackgrounds[Graphic3d_TOB_TEXTURE]->IsDefined() - || myBackgrounds[Graphic3d_TOB_GRADIENT]->IsDefined())) - { - const Handle(Graphic3d_Camera)& aCamera = Camera(); - Graphic3d_Vec2i aWinSize; - Window()->Size (aWinSize.x(), aWinSize.y()); - - // Background is drawn using 2D transformation persistence - // (e.g. it is actually placed in 3D coordinates within active camera position). - // We add here full-screen plane with 2D transformation persistence - // for simplicity (myBgTextureArray might define a little bit different options - // but it is updated within ::Render()) - const Graphic3d_Mat4d& aProjectionMat = aCamera->ProjectionMatrix(); - const Graphic3d_Mat4d& aWorldViewMat = aCamera->OrientationMatrix(); - Graphic3d_BndBox3d aBox2d (Graphic3d_Vec3d (0.0, 0.0, 0.0), - Graphic3d_Vec3d (double(aWinSize.x()), double(aWinSize.y()), 0.0)); - - Graphic3d_TransformPers aTrsfPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_LOWER); - aTrsfPers.Apply (aCamera, - aProjectionMat, - aWorldViewMat, - aWinSize.x(), - aWinSize.y(), - aBox2d); - aBox.Add (gp_Pnt (aBox2d.CornerMin().x(), aBox2d.CornerMin().y(), aBox2d.CornerMin().z())); - aBox.Add (gp_Pnt (aBox2d.CornerMax().x(), aBox2d.CornerMax().y(), aBox2d.CornerMax().z())); - } - return aBox; } @@ -766,7 +770,7 @@ void OpenGl_View::displayStructure (const Handle(Graphic3d_CStructure)& theStructure, const Standard_Integer thePriority) { - const OpenGl_Structure* aStruct = reinterpret_cast (theStructure.operator->()); + const OpenGl_Structure* aStruct = static_cast (theStructure.get()); const Graphic3d_ZLayerId aZLayer = aStruct->ZLayer(); myZLayers.AddStructure (aStruct, aZLayer, thePriority); } @@ -777,7 +781,7 @@ //======================================================================= void OpenGl_View::eraseStructure (const Handle(Graphic3d_CStructure)& theStructure) { - const OpenGl_Structure* aStruct = reinterpret_cast (theStructure.operator->()); + const OpenGl_Structure* aStruct = static_cast (theStructure.get()); myZLayers.RemoveStructure (aStruct); } @@ -789,7 +793,7 @@ const Graphic3d_ZLayerId theNewLayerId) { const Graphic3d_ZLayerId anOldLayer = theStructure->ZLayer(); - const OpenGl_Structure* aStruct = reinterpret_cast (theStructure.operator->()); + const OpenGl_Structure* aStruct = static_cast (theStructure.get()); myZLayers.ChangeLayer (aStruct, anOldLayer, theNewLayerId); Update (anOldLayer); Update (theNewLayerId); @@ -803,7 +807,7 @@ const Standard_Integer theNewPriority) { const Graphic3d_ZLayerId aLayerId = theStructure->ZLayer(); - const OpenGl_Structure* aStruct = reinterpret_cast (theStructure.operator->()); + const OpenGl_Structure* aStruct = static_cast (theStructure.get()); myZLayers.ChangePriority (aStruct, aLayerId, theNewPriority); } @@ -814,6 +818,7 @@ void OpenGl_View::DiagnosticInformation (TColStd_IndexedDataMapOfStringString& theDict, Graphic3d_DiagnosticInfo theFlags) const { + base_type::DiagnosticInformation (theDict, theFlags); Handle(OpenGl_Context) aCtx = myWorkspace->GetGlContext(); if (!myWorkspace->Activate() || aCtx.IsNull()) diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_View.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_View.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_View.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_View.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,6 +57,7 @@ class Graphic3d_StructureManager; class OpenGl_GraphicDriver; +class OpenGl_PBREnvironment; class OpenGl_StateCounter; class OpenGl_TriangleSet; class OpenGl_Workspace; @@ -78,6 +79,7 @@ //! Default destructor. Standard_EXPORT virtual ~OpenGl_View(); + //! Release OpenGL resources. Standard_EXPORT void ReleaseGlResources (const Handle(OpenGl_Context)& theCtx); //! Deletes and erases the view. @@ -209,11 +211,16 @@ //! Sets gradient background fill colors. Standard_EXPORT virtual void SetGradientBackground (const Aspect_GradientBackground& theBackground) Standard_OVERRIDE; - //! Returns background image texture file path. - virtual TCollection_AsciiString BackgroundImage() Standard_OVERRIDE { return myBackgroundImagePath; } + //! Returns background image texture map. + virtual Handle(Graphic3d_TextureMap) BackgroundImage() Standard_OVERRIDE { return myBackgroundImage; } - //! Sets background image texture file path. - Standard_EXPORT virtual void SetBackgroundImage (const TCollection_AsciiString& theFilePath) Standard_OVERRIDE; + //! Sets image texture or environment cubemap as backround. + //! @param theTextureMap [in] source to set a background; + //! should be either Graphic3d_Texture2D or Graphic3d_CubeMap + //! @param theToUpdatePBREnv [in] defines whether IBL maps will be generated or not + //! (see GeneratePBREnvironment()) + Standard_EXPORT virtual void SetBackgroundImage (const Handle(Graphic3d_TextureMap)& theTextureMap, + Standard_Boolean theToUpdatePBREnv = Standard_True) Standard_OVERRIDE; //! Returns background image fill style. Standard_EXPORT virtual Aspect_FillMethod BackgroundImageStyle() const Standard_OVERRIDE; @@ -224,8 +231,22 @@ //! Returns cubemap being set last time on background. Standard_EXPORT Handle(Graphic3d_CubeMap) BackgroundCubeMap() const Standard_OVERRIDE; - //! Sets environment cubemap as background. - Standard_EXPORT virtual void SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap) Standard_OVERRIDE; + //! Generates PBR specular probe and irradiance map + //! in order to provide environment indirect illumination in PBR shading model (Image Based Lighting). + //! The source of environment data is background cubemap. + //! If PBR is unavailable it does nothing. + //! If PBR is available but there is no cubemap being set to background it clears all IBL maps (see 'ClearPBREnvironment'). + virtual void GeneratePBREnvironment() Standard_OVERRIDE { myPBREnvRequest = OpenGl_PBREnvRequest_BAKE; } + + //! Fills PBR specular probe and irradiance map with white color. + //! So that environment indirect illumination will be constant + //! and will be fully controlled by ambient light sources. + //! If PBR is unavailable it does nothing. + virtual void ClearPBREnvironment() Standard_OVERRIDE { myPBREnvRequest = OpenGl_PBREnvRequest_CLEAR; } + + //! Returns number of mipmap levels used in specular IBL map. + //! 0 if PBR environment is not created. + Standard_EXPORT unsigned int SpecIBLMapLevels() const; //! Returns environment texture set for the view. virtual Handle(Graphic3d_TextureEnv) TextureEnv() const Standard_OVERRIDE { return myTextureEnvData; } @@ -387,7 +408,8 @@ const Standard_Boolean theToDrawImmediate); //! Draw background (gradient / image) - Standard_EXPORT virtual void drawBackground (const Handle(OpenGl_Workspace)& theWorkspace); + Standard_EXPORT virtual void drawBackground (const Handle(OpenGl_Workspace)& theWorkspace, + Graphic3d_Camera::Projection theProjection); //! Render set of structures presented in the view. //! @param theProjection [in] the projection that is used for rendering. @@ -424,6 +446,9 @@ private: + //! Release sRGB resources (frame-buffers, textures, etc.). + void releaseSrgbResources (const Handle(OpenGl_Context)& theCtx); + //! Copy content of Back buffer to the Front buffer. bool copyBackToFront(); @@ -455,7 +480,7 @@ gp_XYZ myLocalOrigin; Handle(OpenGl_FrameBuffer) myFBO; Standard_Boolean myToShowGradTrihedron; - TCollection_AsciiString myBackgroundImagePath; + Handle(Graphic3d_TextureMap) myBackgroundImage; Handle(Graphic3d_TextureEnv) myTextureEnvData; Graphic3d_GraduatedTrihedron myGTrihedronData; @@ -490,6 +515,7 @@ //! Two framebuffers (left and right views) store cached main presentation //! of the view (without presentation of immediate layers). + Standard_Integer mySRgbState; //!< track sRGB state GLint myFboColorFormat; //!< sized format for color attachments GLint myFboDepthFormat; //!< sized format for depth-stencil attachments OpenGl_ColorFormats myFboOitColorConfig; //!< selected color format configuration for OIT color attachments @@ -497,6 +523,7 @@ Handle(OpenGl_FrameBuffer) myMainSceneFbosOit[2]; //!< Additional buffers for transparent draw of main layer. Handle(OpenGl_FrameBuffer) myImmediateSceneFbos[2]; //!< Additional buffers for immediate layer in stereo mode. Handle(OpenGl_FrameBuffer) myImmediateSceneFbosOit[2]; //!< Additional buffers for transparency draw of immediate layer. + Handle(OpenGl_FrameBuffer) myXrSceneFbo; //!< additional FBO (without MSAA) for submitting to XR OpenGl_VertexBuffer myFullScreenQuad; //!< Vertices for full-screen quad rendering. OpenGl_VertexBuffer myFullScreenQuadFlip; Standard_Boolean myToFlipOutput; //!< Flag to draw result image upside-down @@ -513,10 +540,48 @@ OpenGl_Aspects* myTextureParams; //!< Stores texture and its parameters for textured background OpenGl_Aspects* myCubeMapParams; //!< Stores cubemap and its parameters for cubemap background - Handle(Graphic3d_CubeMap) myBackgroundCubeMap; //!< Cubemap has been setted as background - Graphic3d_TypeOfBackground myBackgroundType; //!< Current typy of background + Handle(Graphic3d_CubeMap) myBackgroundCubeMap; //!< Cubemap has been set as background + Graphic3d_TypeOfBackground myBackgroundType; //!< Current type of background OpenGl_BackgroundArray* myBackgrounds[Graphic3d_TypeOfBackground_NB]; //!< Array of primitive arrays of different background types +protected: //! @name methods related to PBR + + //! Checks whether PBR is available. + Standard_EXPORT Standard_Boolean checkPBRAvailability() const; + + //! Generates IBL maps used in PBR pipeline. + //! If background cubemap is not set clears all IBL maps. + Standard_EXPORT void bakePBREnvironment (const Handle(OpenGl_Context)& theCtx); + + //! Fills all IBL maps with white color. + //! So that environment lighting is considered to be constant and is completely controls by ambient light sources. + Standard_EXPORT void clearPBREnvironment (const Handle(OpenGl_Context)& theCtx); + + //! Process requests to generate or to clear PBR environment. + Standard_EXPORT void processPBREnvRequest (const Handle(OpenGl_Context)& theCtx); + +protected: //! @name fields and types related to PBR + + //! State of PBR environment. + enum PBREnvironmentState + { + OpenGl_PBREnvState_NONEXISTENT, + OpenGl_PBREnvState_UNAVAILABLE, // indicates failed try to create PBR environment + OpenGl_PBREnvState_CREATED + }; + + //! Type of action which can be done with PBR environment. + enum PBREnvironmentRequest + { + OpenGl_PBREnvRequest_NONE, + OpenGl_PBREnvRequest_BAKE, + OpenGl_PBREnvRequest_CLEAR + }; + + Handle(OpenGl_PBREnvironment) myPBREnvironment; //!< manager of IBL maps used in PBR pipeline + PBREnvironmentState myPBREnvState; //!< state of PBR environment + PBREnvironmentRequest myPBREnvRequest; //!< type of action is requested to be done with PBR environment + protected: //! @name data types related to ray-tracing //! Result of OpenGL shaders initialization. @@ -565,8 +630,8 @@ // ray-tracing params OpenGl_RT_uShadowsEnabled, OpenGl_RT_uReflectEnabled, - OpenGl_RT_uSphereMapEnabled, - OpenGl_RT_uSphereMapForBack, + OpenGl_RT_uEnvMapEnabled, + OpenGl_RT_uEnvMapForBack, OpenGl_RT_uTexSamplersArray, OpenGl_RT_uBlockedRngEnabled, @@ -692,12 +757,18 @@ //! Enables/disables environment map for background. Standard_Boolean UseEnvMapForBackground; + //! Enables/disables normal map ignoring during path tracing. + Standard_Boolean ToIgnoreNormalMap; + //! Maximum radiance value used for clamping radiance estimation. Standard_ShortReal RadianceClampingValue; //! Enables/disables depth-of-field effect (path tracing, perspective camera). Standard_Boolean DepthOfField; + //! Enables/disables cubemap backgraund. + Standard_Boolean CubemapForBack; + //! Tone mapping method for path tracing. Graphic3d_ToneMappingMethod ToneMappingMethod; @@ -712,8 +783,10 @@ AdaptiveScreenSampling (Standard_False), AdaptiveScreenSamplingAtomic (Standard_False), UseEnvMapForBackground (Standard_False), + ToIgnoreNormalMap (Standard_False), RadianceClampingValue (30.0), DepthOfField (Standard_False), + CubemapForBack (Standard_False), ToneMappingMethod (Graphic3d_ToneMappingMethod_Disabled) { } }; @@ -762,7 +835,7 @@ //! Adds OpenGL groups to ray-traced scene geometry. Standard_Boolean addRaytraceGroups (const OpenGl_Structure* theStructure, const OpenGl_RaytraceMaterial& theStructMat, - const Handle(Geom_Transformation)& theTrsf, + const Handle(TopLoc_Datum3D)& theTrsf, const Handle(OpenGl_Context)& theGlContext); //! Creates ray-tracing material properties. diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_View_Raytrace.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_View_Raytrace.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_View_Raytrace.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_View_Raytrace.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,6 +28,7 @@ #include "../Shaders/Shaders_RaytraceRender_fs.pxx" #include "../Shaders/Shaders_RaytraceSmooth_fs.pxx" #include "../Shaders/Shaders_Display_fs.pxx" +#include "../Shaders/Shaders_TangentSpaceNormal_glsl.pxx" //! Use this macro to output ray-tracing debug info // #define RAY_TRACE_PRINT_INFO @@ -45,7 +46,7 @@ namespace { //! Defines OpenGL texture samplers. - static const Graphic3d_TextureUnit OpenGl_RT_EnvironmentMapTexture = Graphic3d_TextureUnit_0; + static const Graphic3d_TextureUnit OpenGl_RT_EnvMapTexture = Graphic3d_TextureUnit_0; static const Graphic3d_TextureUnit OpenGl_RT_SceneNodeInfoTexture = Graphic3d_TextureUnit_1; static const Graphic3d_TextureUnit OpenGl_RT_SceneMinPointTexture = Graphic3d_TextureUnit_2; @@ -393,19 +394,25 @@ anIndex == 0 ? 1.0f : anIndex, anIndex == 0 ? 1.0f : 1.0f / anIndex); + aResMat.Ambient = theGlContext->Vec4FromQuantityColor (aResMat.Ambient); + aResMat.Diffuse = theGlContext->Vec4FromQuantityColor (aResMat.Diffuse); + aResMat.Specular = theGlContext->Vec4FromQuantityColor (aResMat.Specular); + aResMat.Emission = theGlContext->Vec4FromQuantityColor (aResMat.Emission); + // Serialize physically-based material properties const Graphic3d_BSDF& aBSDF = aSrcMat.BSDF(); aResMat.BSDF.Kc = aBSDF.Kc; aResMat.BSDF.Ks = aBSDF.Ks; - aResMat.BSDF.Kd = BVH_Vec4f (aBSDF.Kd, -1.f); // no texture - aResMat.BSDF.Kt = BVH_Vec4f (aBSDF.Kt, 0.f); - aResMat.BSDF.Le = BVH_Vec4f (aBSDF.Le, 0.f); + aResMat.BSDF.Kd = BVH_Vec4f (aBSDF.Kd, -1.0f); // no base color texture + aResMat.BSDF.Kt = BVH_Vec4f (aBSDF.Kt, -1.0f); // no metallic-roughness texture + aResMat.BSDF.Le = BVH_Vec4f (aBSDF.Le, -1.0f); // no emissive texture aResMat.BSDF.Absorption = aBSDF.Absorption; aResMat.BSDF.FresnelCoat = aBSDF.FresnelCoat.Serialize (); aResMat.BSDF.FresnelBase = aBSDF.FresnelBase.Serialize (); + aResMat.BSDF.FresnelBase.w() = -1.0; // no normal map texture // Handle material textures if (!theAspect->Aspect()->ToMapTexture()) @@ -423,11 +430,31 @@ if (theGlContext->HasRayTracingTextures()) { - const Handle(OpenGl_Texture)& aTexture = aTextureSet->First(); - buildTextureTransform (aTexture->Sampler()->Parameters(), aResMat.TextureTransform); - - // write texture ID to diffuse w-component - aResMat.Diffuse.w() = aResMat.BSDF.Kd.w() = static_cast (myRaytraceGeometry.AddTexture (aTexture)); + // write texture ID to diffuse w-components + for (OpenGl_TextureSet::Iterator aTexIter (aTextureSet); aTexIter.More(); aTexIter.Next()) + { + const Handle(OpenGl_Texture)& aTexture = aTexIter.Value(); + if (aTexIter.Unit() == Graphic3d_TextureUnit_BaseColor) + { + buildTextureTransform (aTexture->Sampler()->Parameters(), aResMat.TextureTransform); + aResMat.Diffuse.w() = aResMat.BSDF.Kd.w() = static_cast (myRaytraceGeometry.AddTexture (aTexture)); + } + else if (aTexIter.Unit() == Graphic3d_TextureUnit_MetallicRoughness) + { + buildTextureTransform (aTexture->Sampler()->Parameters(), aResMat.TextureTransform); + aResMat.BSDF.Kt.w() = static_cast (myRaytraceGeometry.AddTexture (aTexture)); + } + else if (aTexIter.Unit() == Graphic3d_TextureUnit_Emissive) + { + buildTextureTransform (aTexture->Sampler()->Parameters(), aResMat.TextureTransform); + aResMat.BSDF.Le.w() = static_cast (myRaytraceGeometry.AddTexture (aTexture)); + } + else if (aTexIter.Unit() == Graphic3d_TextureUnit_Normal) + { + buildTextureTransform (aTexture->Sampler()->Parameters(), aResMat.TextureTransform); + aResMat.BSDF.FresnelBase.w() = static_cast (myRaytraceGeometry.AddTexture (aTexture)); + } + } } else if (!myIsRaytraceWarnTextures) { @@ -477,7 +504,7 @@ // ======================================================================= Standard_Boolean OpenGl_View::addRaytraceGroups (const OpenGl_Structure* theStructure, const OpenGl_RaytraceMaterial& theStructMat, - const Handle(Geom_Transformation)& theTrsf, + const Handle(TopLoc_Datum3D)& theTrsf, const Handle(OpenGl_Context)& theGlContext) { OpenGl_Mat4 aMat4; @@ -1095,6 +1122,10 @@ { aPrefixString += TCollection_AsciiString ("\n#define TRANSPARENT_SHADOWS"); } + if (!theGlContext->ToRenderSRGB()) + { + aPrefixString += TCollection_AsciiString ("\n#define THE_SHIFT_sRGB"); + } // If OpenGL driver supports bindless textures and texturing // is actually used, activate texturing in ray-tracing mode @@ -1136,6 +1167,16 @@ } } + if (myRaytraceParameters.ToIgnoreNormalMap) + { + aPrefixString += TCollection_AsciiString("\n#define IGNORE_NORMAL_MAP"); + } + + if (myRaytraceParameters.CubemapForBack) + { + aPrefixString += TCollection_AsciiString("\n#define BACKGROUND_CUBEMAP"); + } + if (myRaytraceParameters.DepthOfField) { aPrefixString += TCollection_AsciiString("\n#define DEPTH_OF_FIELD"); @@ -1306,13 +1347,15 @@ || myRenderParams.IsTransparentShadowEnabled != myRaytraceParameters.TransparentShadows || myRenderParams.IsGlobalIlluminationEnabled != myRaytraceParameters.GlobalIllumination || myRenderParams.TwoSidedBsdfModels != myRaytraceParameters.TwoSidedBsdfModels - || myRaytraceGeometry.HasTextures() != myRaytraceParameters.UseBindlessTextures) + || myRaytraceGeometry.HasTextures() != myRaytraceParameters.UseBindlessTextures + || myRenderParams.ToIgnoreNormalMapInRayTracing != myRaytraceParameters.ToIgnoreNormalMap) { myRaytraceParameters.NbBounces = myRenderParams.RaytracingDepth; myRaytraceParameters.TransparentShadows = myRenderParams.IsTransparentShadowEnabled; myRaytraceParameters.GlobalIllumination = myRenderParams.IsGlobalIlluminationEnabled; myRaytraceParameters.TwoSidedBsdfModels = myRenderParams.TwoSidedBsdfModels; myRaytraceParameters.UseBindlessTextures = myRaytraceGeometry.HasTextures(); + myRaytraceParameters.ToIgnoreNormalMap = myRenderParams.ToIgnoreNormalMapInRayTracing; aToRebuildShaders = Standard_True; } @@ -1344,6 +1387,13 @@ } myTileSampler.SetSize (myRenderParams, myRaytraceParameters.AdaptiveScreenSampling ? Graphic3d_Vec2i (theSizeX, theSizeY) : Graphic3d_Vec2i (0, 0)); + const bool isCubemapForBack = !myBackgroundCubeMap.IsNull(); + if (myRaytraceParameters.CubemapForBack != isCubemapForBack) + { + myRaytraceParameters.CubemapForBack = isCubemapForBack; + aToRebuildShaders = Standard_True; + } + const bool toEnableDof = !myCamera->IsOrthographic() && myRaytraceParameters.GlobalIllumination; if (myRaytraceParameters.DepthOfField != toEnableDof) { @@ -1448,6 +1498,7 @@ if (!aShaderFolder.IsEmpty()) { const TCollection_AsciiString aFiles[] = { aShaderFolder + "/RaytraceBase.fs", + aShaderFolder + "/TangentSpaceNormal.glsl", aShaderFolder + "/PathtraceBase.fs", aShaderFolder + "/RaytraceRender.fs", "" }; @@ -1459,6 +1510,7 @@ else { const TCollection_AsciiString aSrcShaders[] = { Shaders_RaytraceBase_fs, + Shaders_TangentSpaceNormal_glsl, Shaders_PathtraceBase_fs, Shaders_RaytraceRender_fs, "" }; @@ -1582,7 +1634,7 @@ aShaderProgram->SetSampler (theGlContext, "uSceneTransformTexture", OpenGl_RT_SceneTransformTexture); aShaderProgram->SetSampler (theGlContext, - "uEnvironmentMapTexture", OpenGl_RT_EnvironmentMapTexture); + "uEnvMapTexture", OpenGl_RT_EnvMapTexture); aShaderProgram->SetSampler (theGlContext, "uRaytraceMaterialTexture", OpenGl_RT_RaytraceMaterialTexture); aShaderProgram->SetSampler (theGlContext, @@ -1646,10 +1698,10 @@ aShaderProgram->GetUniformLocation (theGlContext, "uShadowsEnabled"); myUniformLocations[anIndex][OpenGl_RT_uReflectEnabled] = aShaderProgram->GetUniformLocation (theGlContext, "uReflectEnabled"); - myUniformLocations[anIndex][OpenGl_RT_uSphereMapEnabled] = - aShaderProgram->GetUniformLocation (theGlContext, "uSphereMapEnabled"); - myUniformLocations[anIndex][OpenGl_RT_uSphereMapForBack] = - aShaderProgram->GetUniformLocation (theGlContext, "uSphereMapForBack"); + myUniformLocations[anIndex][OpenGl_RT_uEnvMapEnabled] = + aShaderProgram->GetUniformLocation (theGlContext, "uEnvMapEnabled"); + myUniformLocations[anIndex][OpenGl_RT_uEnvMapForBack] = + aShaderProgram->GetUniformLocation (theGlContext, "uEnvMapForBack"); myUniformLocations[anIndex][OpenGl_RT_uBlockedRngEnabled] = aShaderProgram->GetUniformLocation (theGlContext, "uBlockedRngEnabled"); @@ -1866,12 +1918,16 @@ // workaround for some NVIDIA drivers myRaytraceVisualErrorTexture[aViewIter]->Release (theGlContext.operator->()); myRaytraceTileSamplesTexture[aViewIter]->Release (theGlContext.operator->()); - myRaytraceVisualErrorTexture[aViewIter]->Init (theGlContext, GL_R32I, GL_RED_INTEGER, GL_INT, - myTileSampler.NbTilesX(), myTileSampler.NbTilesY(), Graphic3d_TOT_2D); + myRaytraceVisualErrorTexture[aViewIter]->Init (theGlContext, + OpenGl_TextureFormat::FindSizedFormat (theGlContext, GL_R32I), + Graphic3d_Vec2i (myTileSampler.NbTilesX(), myTileSampler.NbTilesY()), + Graphic3d_TOT_2D); if (!myRaytraceParameters.AdaptiveScreenSamplingAtomic) { - myRaytraceTileSamplesTexture[aViewIter]->Init (theGlContext, GL_R32I, GL_RED_INTEGER, GL_INT, - myTileSampler.NbTilesX(), myTileSampler.NbTilesY(), Graphic3d_TOT_2D); + myRaytraceTileSamplesTexture[aViewIter]->Init (theGlContext, + OpenGl_TextureFormat::FindSizedFormat (theGlContext, GL_R32I), + Graphic3d_Vec2i (myTileSampler.NbTilesX(), myTileSampler.NbTilesY()), + Graphic3d_TOT_2D); } } else // non-adaptive mode @@ -2349,12 +2405,11 @@ Standard_Boolean OpenGl_View::updateRaytraceLightSources (const OpenGl_Mat4& theInvModelView, const Handle(OpenGl_Context)& theGlContext) { std::vector aLightSources; - myRaytraceGeometry.Ambient = BVH_Vec4f (0.f, 0.f, 0.f, 0.f); + Graphic3d_Vec4 aNewAmbient (0.0f); if (myShadingModel != Graphic3d_TOSM_UNLIT && !myLights.IsNull()) { - const Graphic3d_Vec4& anAmbient = myLights->AmbientColor(); - myRaytraceGeometry.Ambient = BVH_Vec4f (anAmbient.r(), anAmbient.g(), anAmbient.b(), 0.0f); + aNewAmbient.SetValues (myLights->AmbientColor().rgb(), 0.0f); // move positional light sources at the front of the list aLightSources.reserve (myLights->Extent()); @@ -2378,6 +2433,12 @@ } } + if (!myRaytraceGeometry.Ambient.IsEqual (aNewAmbient)) + { + myAccumFrames = 0; + myRaytraceGeometry.Ambient = aNewAmbient; + } + // get number of 'real' (not ambient) light sources const size_t aNbLights = aLightSources.size(); Standard_Boolean wasUpdated = myRaytraceGeometry.Sources.size () != aNbLights; @@ -2395,9 +2456,9 @@ aLightColor.b() * aLight.Intensity(), 1.0f); - BVH_Vec4f aPosition (-aLight.PackedDirection().x(), - -aLight.PackedDirection().y(), - -aLight.PackedDirection().z(), + BVH_Vec4f aPosition (-aLight.PackedDirectionRange().x(), + -aLight.PackedDirectionRange().y(), + -aLight.PackedDirectionRange().z(), 0.0f); if (aLight.Type() != Graphic3d_TOLS_DIRECTIONAL) @@ -2484,6 +2545,20 @@ aDirects, aViewPrjMat, anUnviewMat); + + if (myRenderParams.UseEnvironmentMapBackground + || myRaytraceParameters.CubemapForBack) + { + OpenGl_Mat4 aTempMat; + OpenGl_Mat4 aTempInvMat; + updatePerspCameraPT (myCamera->OrientationMatrixF(), + aCntxProjectionState.Current(), + theProjection, + aTempMat, + aTempInvMat, + theWinSizeX, + theWinSizeY); + } } else { @@ -2513,7 +2588,7 @@ theProgram->SetUniform(theGlContext, "uApertureRadius", myRenderParams.CameraApertureRadius); theProgram->SetUniform(theGlContext, "uFocalPlaneDist", myRenderParams.CameraFocalPlaneDist); - + // Set camera state theProgram->SetUniform (theGlContext, myUniformLocations[theProgramId][OpenGl_RT_uOriginLB], aOrigins[0]); @@ -2564,36 +2639,54 @@ static_cast (aTextures.size()), reinterpret_cast (&aTextures.front())); } - // Set background colors (only gradient background supported) + // Set background colors (only vertical gradient background supported) + OpenGl_Vec4 aBackColorTop = myBgColor, aBackColorBot = myBgColor; if (myBackgrounds[Graphic3d_TOB_GRADIENT] != NULL && myBackgrounds[Graphic3d_TOB_GRADIENT]->IsDefined()) { - theProgram->SetUniform (theGlContext, - myUniformLocations[theProgramId][OpenGl_RT_uBackColorTop], myBackgrounds[Graphic3d_TOB_GRADIENT]->GradientColor (0)); - theProgram->SetUniform (theGlContext, - myUniformLocations[theProgramId][OpenGl_RT_uBackColorBot], myBackgrounds[Graphic3d_TOB_GRADIENT]->GradientColor (1)); + aBackColorTop = myBackgrounds[Graphic3d_TOB_GRADIENT]->GradientColor (0); + aBackColorBot = myBackgrounds[Graphic3d_TOB_GRADIENT]->GradientColor (1); + + if (myCamera->Tile().IsValid()) + { + Standard_Integer aTileOffset = myCamera->Tile().OffsetLowerLeft().y(); + Standard_Integer aTileSize = myCamera->Tile().TileSize.y(); + Standard_Integer aViewSize = myCamera->Tile().TotalSize.y(); + OpenGl_Vec4 aColorRange = aBackColorTop - aBackColorBot; + aBackColorBot = aBackColorBot + aColorRange * ((float) aTileOffset / aViewSize); + aBackColorTop = aBackColorBot + aColorRange * ((float) aTileSize / aViewSize); + } + } + aBackColorTop = theGlContext->Vec4FromQuantityColor (aBackColorTop); + aBackColorBot = theGlContext->Vec4FromQuantityColor (aBackColorBot); + theProgram->SetUniform (theGlContext, myUniformLocations[theProgramId][OpenGl_RT_uBackColorTop], aBackColorTop); + theProgram->SetUniform (theGlContext, myUniformLocations[theProgramId][OpenGl_RT_uBackColorBot], aBackColorBot); + + // Set environment map parameters + const Handle(OpenGl_TextureSet)& anEnvTextureSet = myRaytraceParameters.CubemapForBack + ? myCubeMapParams->TextureSet (theGlContext) + : myTextureEnv; + const bool toDisableEnvironmentMap = anEnvTextureSet.IsNull() + || anEnvTextureSet->IsEmpty() + || !anEnvTextureSet->First()->IsValid(); + theProgram->SetUniform (theGlContext, myUniformLocations[theProgramId][OpenGl_RT_uEnvMapEnabled], + toDisableEnvironmentMap ? 0 : 1); + if (myRaytraceParameters.CubemapForBack) + { + theProgram->SetUniform (theGlContext, "uZCoeff", myBackgroundCubeMap->ZIsInverted() ? -1 : 1); + theProgram->SetUniform (theGlContext, "uYCoeff", myBackgroundCubeMap->IsTopDown() ? 1 : -1); + theProgram->SetUniform (theGlContext, myUniformLocations[theProgramId][OpenGl_RT_uEnvMapForBack], + myBackgroundType == Graphic3d_TOB_CUBEMAP ? 1 : 0); } else { - const OpenGl_Vec4& aBackColor = myBgColor; - - theProgram->SetUniform (theGlContext, - myUniformLocations[theProgramId][OpenGl_RT_uBackColorTop], aBackColor); - theProgram->SetUniform (theGlContext, - myUniformLocations[theProgramId][OpenGl_RT_uBackColorBot], aBackColor); + theProgram->SetUniform (theGlContext, myUniformLocations[theProgramId][OpenGl_RT_uEnvMapForBack], + myRenderParams.UseEnvironmentMapBackground ? 1 : 0); } - // Set environment map parameters - const Standard_Boolean toDisableEnvironmentMap = myTextureEnv.IsNull() - || myTextureEnv->IsEmpty() - || !myTextureEnv->First()->IsValid(); - - theProgram->SetUniform (theGlContext, - myUniformLocations[theProgramId][OpenGl_RT_uSphereMapEnabled], toDisableEnvironmentMap ? 0 : 1); - + // Set ambient light source theProgram->SetUniform (theGlContext, - myUniformLocations[theProgramId][OpenGl_RT_uSphereMapForBack], myRenderParams.UseEnvironmentMapBackground ? 1 : 0); - + myUniformLocations[theProgramId][OpenGl_RT_uLightAmbnt], myRaytraceGeometry.Ambient); if (myRenderParams.IsGlobalIlluminationEnabled) // GI parameters { theProgram->SetUniform (theGlContext, @@ -2614,10 +2707,6 @@ } else // RT parameters { - // Set ambient light source - theProgram->SetUniform (theGlContext, - myUniformLocations[theProgramId][OpenGl_RT_uLightAmbnt], myRaytraceGeometry.Ambient); - // Enable/disable run-time ray-tracing effects theProgram->SetUniform (theGlContext, myUniformLocations[theProgramId][OpenGl_RT_uShadowsEnabled], myRenderParams.IsShadowEnabled ? 1 : 0); @@ -2658,11 +2747,14 @@ #endif } - if (!myTextureEnv.IsNull() - && !myTextureEnv->IsEmpty() - && myTextureEnv->First()->IsValid()) + const Handle(OpenGl_TextureSet)& anEnvTextureSet = myRaytraceParameters.CubemapForBack + ? myCubeMapParams->TextureSet (theGlContext) + : myTextureEnv; + if (!anEnvTextureSet.IsNull() + && !anEnvTextureSet->IsEmpty() + && anEnvTextureSet->First()->IsValid()) { - myTextureEnv->First()->Bind (theGlContext, OpenGl_RT_EnvironmentMapTexture); + anEnvTextureSet->First()->Bind (theGlContext, OpenGl_RT_EnvMapTexture); } mySceneMinPointTexture ->BindTexture (theGlContext, OpenGl_RT_SceneMinPointTexture); diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_View_Redraw.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_View_Redraw.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_View_Redraw.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_View_Redraw.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,7 @@ #include +#include #include #include #include @@ -39,6 +40,8 @@ #include #include +#include "../Textures/Textures_EnvLUT.pxx" + namespace { //! Format Frame Buffer format for logging messages. @@ -71,7 +74,8 @@ //function : drawBackground //purpose : //======================================================================= -void OpenGl_View::drawBackground (const Handle(OpenGl_Workspace)& theWorkspace) +void OpenGl_View::drawBackground (const Handle(OpenGl_Workspace)& theWorkspace, + Graphic3d_Camera::Projection theProjection) { const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext(); const Standard_Boolean wasUsedZBuffer = theWorkspace->SetUseZBuffer (Standard_False); @@ -82,21 +86,12 @@ if (myBackgroundType == Graphic3d_TOB_CUBEMAP) { - Graphic3d_Camera aCamera (theWorkspace->View()->Camera()); - aCamera.SetZRange (0.01, 1.0); // is needed to avoid perspective camera exception - aCamera.SetProjectionType (Graphic3d_Camera::Projection_Perspective); - - aCtx->ProjectionState.Push(); - aCtx->ProjectionState.SetCurrent (aCamera.ProjectionMatrixF()); - myCubeMapParams->Aspect()->ShaderProgram()->PushVariableInt ("uZCoeff", myBackgroundCubeMap->ZIsInverted() ? -1 : 1); myCubeMapParams->Aspect()->ShaderProgram()->PushVariableInt ("uYCoeff", myBackgroundCubeMap->IsTopDown() ? 1 : -1); const OpenGl_Aspects* anOldAspectFace = theWorkspace->SetAspects (myCubeMapParams); - myBackgrounds[Graphic3d_TOB_CUBEMAP]->Render (theWorkspace); + myBackgrounds[Graphic3d_TOB_CUBEMAP]->Render (theWorkspace, theProjection); - aCtx->ProjectionState.Pop(); - aCtx->ApplyProjectionMatrix(); theWorkspace->SetAspects (anOldAspectFace); } else if (myBackgroundType == Graphic3d_TOB_GRADIENT @@ -110,26 +105,7 @@ || myBackgrounds[Graphic3d_TOB_TEXTURE]->TextureFillMethod() == Aspect_FM_CENTERED || myBackgrounds[Graphic3d_TOB_TEXTURE]->TextureFillMethod() == Aspect_FM_NONE)) { - #if !defined(GL_ES_VERSION_2_0) - GLint aShadingModelOld = GL_SMOOTH; - if (aCtx->core11 != NULL - && aCtx->caps->ffpEnable) - { - aCtx->core11fwd->glDisable (GL_LIGHTING); - aCtx->core11fwd->glGetIntegerv (GL_SHADE_MODEL, &aShadingModelOld); - aCtx->core11->glShadeModel (GL_SMOOTH); - } - #endif - - myBackgrounds[Graphic3d_TOB_GRADIENT]->Render(theWorkspace); - - #if !defined(GL_ES_VERSION_2_0) - if (aCtx->core11 != NULL - && aCtx->caps->ffpEnable) - { - aCtx->core11->glShadeModel (aShadingModelOld); - } - #endif + myBackgrounds[Graphic3d_TOB_GRADIENT]->Render(theWorkspace, theProjection); } // Drawing background image if it is defined @@ -140,7 +116,7 @@ aCtx->core11fwd->glDisable (GL_BLEND); const OpenGl_Aspects* anOldAspectFace = theWorkspace->SetAspects (myTextureParams); - myBackgrounds[Graphic3d_TOB_TEXTURE]->Render (theWorkspace); + myBackgrounds[Graphic3d_TOB_TEXTURE]->Render (theWorkspace, theProjection); theWorkspace->SetAspects (anOldAspectFace); } } @@ -175,15 +151,26 @@ return; } - myWindow->SetSwapInterval(); + // implicitly disable VSync when using HMD composer (can be mirrored in window for debugging) + myWindow->SetSwapInterval (IsActiveXR()); ++myFrameCounter; const Graphic3d_StereoMode aStereoMode = myRenderParams.StereoMode; Graphic3d_Camera::Projection aProjectType = myCamera->ProjectionType(); - Handle(OpenGl_Context) aCtx = myWorkspace->GetGlContext(); + const Handle(OpenGl_Context)& aCtx = myWorkspace->GetGlContext(); aCtx->FrameStats()->FrameStart (myWorkspace->View(), false); aCtx->SetLineFeather (myRenderParams.LineFeather); + const Standard_Integer anSRgbState = aCtx->ToRenderSRGB() ? 1 : 0; + if (mySRgbState != -1 + && mySRgbState != anSRgbState) + { + releaseSrgbResources (aCtx); + initTextureEnv (aCtx); + } + mySRgbState = anSRgbState; + aCtx->ShaderManager()->UpdateSRgbState(); + // release pending GL resources aCtx->ReleaseDelayed(); @@ -193,10 +180,22 @@ OpenGl_FrameBuffer* aFrameBuffer = myFBO.get(); bool toSwap = aCtx->IsRender() && !aCtx->caps->buffersNoSwap - && aFrameBuffer == NULL; + && aFrameBuffer == NULL + && (!IsActiveXR() || myRenderParams.ToMirrorComposer); + + Standard_Integer aSizeX = myWindow->Width(); + Standard_Integer aSizeY = myWindow->Height(); + if (aFrameBuffer != NULL) + { + aSizeX = aFrameBuffer->GetVPSizeX(); + aSizeY = aFrameBuffer->GetVPSizeY(); + } + else if (IsActiveXR()) + { + aSizeX = myXRSession->RecommendedViewport().x(); + aSizeY = myXRSession->RecommendedViewport().y(); + } - const Standard_Integer aSizeX = aFrameBuffer != NULL ? aFrameBuffer->GetVPSizeX() : myWindow->Width(); - const Standard_Integer aSizeY = aFrameBuffer != NULL ? aFrameBuffer->GetVPSizeY() : myWindow->Height(); const Standard_Integer aRendSizeX = Standard_Integer(myRenderParams.RenderResolutionScale * aSizeX + 0.5f); const Standard_Integer aRendSizeY = Standard_Integer(myRenderParams.RenderResolutionScale * aSizeY + 0.5f); if (aSizeX < 1 @@ -282,15 +281,34 @@ myMainSceneFbos [1]->Release (aCtx.operator->()); myImmediateSceneFbos[0]->Release (aCtx.operator->()); myImmediateSceneFbos[1]->Release (aCtx.operator->()); + myXrSceneFbo ->Release (aCtx.operator->()); myMainSceneFbos [0]->ChangeViewport (0, 0); myMainSceneFbos [1]->ChangeViewport (0, 0); myImmediateSceneFbos[0]->ChangeViewport (0, 0); myImmediateSceneFbos[1]->ChangeViewport (0, 0); + myXrSceneFbo ->ChangeViewport (0, 0); } + bool hasXRBlitFbo = false; if (aProjectType == Graphic3d_Camera::Projection_Stereo + && IsActiveXR() && myMainSceneFbos[0]->IsValid()) { + if (aNbSamples != 0 + || aSizeX != aRendSizeX) + { + hasXRBlitFbo = myXrSceneFbo->InitLazy (aCtx, aSizeX, aSizeY, myFboColorFormat, myFboDepthFormat, 0); + if (!hasXRBlitFbo) + { + TCollection_ExtendedString aMsg = TCollection_ExtendedString() + "Error! VR FBO " + + printFboFormat (myXrSceneFbo) + " initialization has failed"; + aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, aMsg); + } + } + } + else if (aProjectType == Graphic3d_Camera::Projection_Stereo + && myMainSceneFbos[0]->IsValid()) + { const bool wasFailedMain1 = checkWasFailedFbo (myMainSceneFbos[1], myMainSceneFbos[0]); if (!myMainSceneFbos[1]->InitLazy (aCtx, *myMainSceneFbos[0]) && !wasFailedMain1) @@ -333,6 +351,70 @@ } } } + if (!hasXRBlitFbo) + { + myXrSceneFbo->Release (aCtx.get()); + myXrSceneFbo->ChangeViewport (0, 0); + } + + // process PBR environment + if (myShadingModel == Graphic3d_TOSM_PBR + || myShadingModel == Graphic3d_TOSM_PBR_FACET) + { + if (!myPBREnvironment.IsNull() + && myPBREnvironment->SizesAreDifferent (myRenderParams.PbrEnvPow2Size, + myRenderParams.PbrEnvSpecMapNbLevels)) + { + myPBREnvironment->Release (aCtx.get()); + myPBREnvironment.Nullify(); + myPBREnvState = OpenGl_PBREnvState_NONEXISTENT; + myPBREnvRequest = OpenGl_PBREnvRequest_BAKE; + ++myLightsRevision; + } + + if (myPBREnvState == OpenGl_PBREnvState_NONEXISTENT + && aCtx->HasPBR()) + { + myPBREnvironment = OpenGl_PBREnvironment::Create (aCtx, myRenderParams.PbrEnvPow2Size, myRenderParams.PbrEnvSpecMapNbLevels); + myPBREnvState = myPBREnvironment.IsNull() ? OpenGl_PBREnvState_UNAVAILABLE : OpenGl_PBREnvState_CREATED; + if (myPBREnvState == OpenGl_PBREnvState_CREATED) + { + Handle(OpenGl_Texture) anEnvLUT; + static const TCollection_AsciiString THE_SHARED_ENV_LUT_KEY("EnvLUT"); + if (!aCtx->GetResource (THE_SHARED_ENV_LUT_KEY, anEnvLUT)) + { + Handle(Graphic3d_TextureParams) aParams = new Graphic3d_TextureParams(); + aParams->SetFilter (Graphic3d_TOTF_BILINEAR); + aParams->SetRepeat (Standard_False); + aParams->SetTextureUnit (aCtx->PBREnvLUTTexUnit()); + anEnvLUT = new OpenGl_Texture(THE_SHARED_ENV_LUT_KEY, aParams); + Handle(Image_PixMap) aPixMap = new Image_PixMap(); + aPixMap->InitWrapper (Image_Format_RGF, (Standard_Byte*)Textures_EnvLUT, Textures_EnvLUTSize, Textures_EnvLUTSize); + OpenGl_TextureFormat aTexFormat = OpenGl_TextureFormat::FindFormat (aCtx, aPixMap->Format(), false); + #if defined(GL_ES_VERSION_2_0) + // GL_RG32F is not texture-filterable format on OpenGL ES without OES_texture_float_linear extension. + // GL_RG16F is texture-filterable since OpenGL ES 3.0 and can be initialized from 32-bit floats. + // Note that it is expected that GL_RG16F has enough precision for this table, so that it can be used also on desktop OpenGL. + //if (!aCtx->hasTexFloatLinear) + aTexFormat.SetInternalFormat (GL_RG16F); + #endif + if (!aTexFormat.IsValid() + || !anEnvLUT->Init (aCtx, aTexFormat, Graphic3d_Vec2i((Standard_Integer)Textures_EnvLUTSize), Graphic3d_TOT_2D, aPixMap.get())) + { + aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, "Failed allocation of LUT for PBR"); + anEnvLUT.Nullify(); + } + aCtx->ShareResource (THE_SHARED_ENV_LUT_KEY, anEnvLUT); + } + if (!anEnvLUT.IsNull()) + { + anEnvLUT->Bind (aCtx); + } + myWorkspace->ApplyAspects(); + } + } + processPBREnvRequest (aCtx); + } // create color and coverage accumulation buffers required for OIT algorithm if (toUseOit) @@ -448,7 +530,18 @@ myImmediateSceneFbosOit[0]->IsValid() ? myImmediateSceneFbosOit[0].operator->() : NULL }; - if (!myTransientDrawToFront) + if (IsActiveXR()) + { + // use single frame for both views - caching main scene content makes no sense + // when head position is expected to be updated each frame redraw with high accuracy + aMainFbos[1] = aMainFbos[0]; + aMainFbosOit[1] = aMainFbosOit[0]; + anImmFbos[0] = aMainFbos[0]; + anImmFbos[1] = aMainFbos[1]; + anImmFbosOit[0] = aMainFbosOit[0]; + anImmFbosOit[1] = aMainFbosOit[1]; + } + else if (!myTransientDrawToFront) { anImmFbos [0] = aMainFbos [0]; anImmFbos [1] = aMainFbos [1]; @@ -487,6 +580,23 @@ aCtx->SwapBuffers(); } + if (IsActiveXR()) + { + // push Left frame to HMD display composer + OpenGl_FrameBuffer* anXRFbo = hasXRBlitFbo ? myXrSceneFbo.get() : aMainFbos[0]; + if (anXRFbo != aMainFbos[0]) + { + blitBuffers (aMainFbos[0], anXRFbo); // resize or resolve MSAA samples + } + #if !defined(GL_ES_VERSION_2_0) + const Aspect_GraphicsLibrary aGraphicsLib = Aspect_GraphicsLibrary_OpenGL; + #else + const Aspect_GraphicsLibrary aGraphicsLib = Aspect_GraphicsLibrary_OpenGLES; + #endif + myXRSession->SubmitEye ((void* )(size_t )anXRFbo->ColorTexture()->TextureId(), + aGraphicsLib, Aspect_ColorSpace_sRGB, Aspect_Eye_Left); + } + #if !defined(GL_ES_VERSION_2_0) aCtx->SetReadDrawBuffer (aStereoMode == Graphic3d_StereoMode_QuadBuffer ? GL_BACK_RIGHT : GL_BACK); #endif @@ -503,7 +613,29 @@ toSwap = false; } - if (anImmFbos[0] != NULL) + if (IsActiveXR()) + { + // push Right frame to HMD display composer + OpenGl_FrameBuffer* anXRFbo = hasXRBlitFbo ? myXrSceneFbo.get() : aMainFbos[1]; + if (anXRFbo != aMainFbos[1]) + { + blitBuffers (aMainFbos[1], anXRFbo); // resize or resolve MSAA samples + } + #if !defined(GL_ES_VERSION_2_0) + const Aspect_GraphicsLibrary aGraphicsLib = Aspect_GraphicsLibrary_OpenGL; + #else + const Aspect_GraphicsLibrary aGraphicsLib = Aspect_GraphicsLibrary_OpenGLES; + #endif + myXRSession->SubmitEye ((void* )(size_t )anXRFbo->ColorTexture()->TextureId(), + aGraphicsLib, Aspect_ColorSpace_sRGB, Aspect_Eye_Right); + ::glFinish(); + + if (myRenderParams.ToMirrorComposer) + { + blitBuffers (anXRFbo, aFrameBuffer, myToFlipOutput); + } + } + else if (anImmFbos[0] != NULL) { aCtx->SetResolution (myRenderParams.Resolution, myRenderParams.ResolutionRatio(), 1.0f); drawStereoPair (aFrameBuffer); @@ -605,6 +737,7 @@ if (!myWorkspace->Activate()) return; + // no special handling of HMD display, since it will force full Redraw() due to no frame caching (myBackBufferRestored) Handle(OpenGl_Context) aCtx = myWorkspace->GetGlContext(); if (!myTransientDrawToFront || !myBackBufferRestored @@ -799,7 +932,7 @@ glClearDepthf (1.0f); #endif - const OpenGl_Vec4& aBgColor = myBgColor; + const OpenGl_Vec4 aBgColor = aCtx->Vec4FromQuantityColor (myBgColor); glClearColor (aBgColor.r(), aBgColor.g(), aBgColor.b(), 0.0f); glClear (toClear); @@ -820,9 +953,11 @@ const Handle(OpenGl_Context)& aCtx = myWorkspace->GetGlContext(); GLboolean toCopyBackToFront = GL_FALSE; if (theDrawFbo == theReadFbo - && theDrawFbo != NULL) + && theDrawFbo != NULL + && theDrawFbo->IsValid()) { myBackBufferRestored = Standard_False; + theDrawFbo->BindBuffer (aCtx); } else if (theReadFbo != NULL && theReadFbo->IsValid() @@ -928,7 +1063,7 @@ || aLightsRevision != myLightsRevision) { myLightsRevision = aLightsRevision; - aManager->UpdateLightSourceStateTo (aLights); + aManager->UpdateLightSourceStateTo (aLights, SpecIBLMapLevels()); myLastLightSourceState = StateInfo (myCurrLightSourceState, aManager->LightSourceState().Index()); } @@ -941,10 +1076,7 @@ } myLocalOrigin.SetCoord (0.0, 0.0, 0.0); - aContext->ProjectionState.SetCurrent (myCamera->ProjectionMatrixF()); - aContext->WorldViewState .SetCurrent (myCamera->OrientationMatrixF()); - aContext->ApplyProjectionMatrix(); - aContext->ApplyWorldViewMatrix(); + aContext->SetCamera (myCamera); if (aManager->ModelWorldState().Index() == 0) { aContext->ShaderManager()->UpdateModelWorldStateTo (OpenGl_Mat4()); @@ -957,7 +1089,7 @@ // Render background if (!theToDrawImmediate) { - drawBackground (myWorkspace); + drawBackground (myWorkspace, theProjection); } #if !defined(GL_ES_VERSION_2_0) @@ -990,7 +1122,7 @@ #if !defined(GL_ES_VERSION_2_0) // if the view is scaled normal vectors are scaled to unit // length for correct displaying of shaded objects - const gp_Pnt anAxialScale = myCamera->AxialScale(); + const gp_Pnt anAxialScale = aContext->Camera()->AxialScale(); if (anAxialScale.X() != 1.F || anAxialScale.Y() != 1.F || anAxialScale.Z() != 1.F) @@ -1001,26 +1133,19 @@ { aContext->SetGlNormalizeEnabled (Standard_False); } - - // Apply InteriorShadingMethod - if (aContext->core11 != NULL) - { - aContext->core11->glShadeModel (myShadingModel == Graphic3d_TOSM_FACET - || myShadingModel == Graphic3d_TOSM_UNLIT ? GL_FLAT : GL_SMOOTH); - } #endif - aManager->SetShadingModel (myShadingModel); + aManager->SetShadingModel (OpenGl_ShaderManager::PBRShadingModelFallback (myShadingModel, checkPBRAvailability())); // Redraw 3d scene if (theProjection == Graphic3d_Camera::Projection_MonoLeftEye) { - aContext->ProjectionState.SetCurrent (myCamera->ProjectionStereoLeftF()); + aContext->ProjectionState.SetCurrent (aContext->Camera()->ProjectionStereoLeftF()); aContext->ApplyProjectionMatrix(); } else if (theProjection == Graphic3d_Camera::Projection_MonoRightEye) { - aContext->ProjectionState.SetCurrent (myCamera->ProjectionStereoRightF()); + aContext->ProjectionState.SetCurrent (aContext->Camera()->ProjectionStereoRightF()); aContext->ApplyProjectionMatrix(); } @@ -1143,6 +1268,7 @@ else { aCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0); + aCtx->SetFrameBufferSRGB (false); } // Render non-polygonal elements in default layer @@ -1158,6 +1284,7 @@ else { aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, 0); + aCtx->SetFrameBufferSRGB (false); } // Reset OpenGl aspects state to default to avoid enabling of @@ -1238,7 +1365,7 @@ } renderStructs (theProjection, theReadDrawFbo, theOitAccumFbo, theToDrawImmediate); - aContext->BindTextures (Handle(OpenGl_TextureSet)()); + aContext->BindTextures (Handle(OpenGl_TextureSet)(), Handle(OpenGl_ShaderProgram)()); // Apply restored view matrix. aContext->ApplyWorldViewMatrix(); @@ -1355,6 +1482,7 @@ else { aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); + aCtx->SetFrameBufferSRGB (false); } const Standard_Integer aViewport[4] = { 0, 0, aDrawSizeX, aDrawSizeY }; aCtx->ResizeViewport (aViewport); @@ -1366,8 +1494,10 @@ #endif aCtx->core20fwd->glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + const bool toApplyGamma = aCtx->ToRenderSRGB() != aCtx->IsFrameBufferSRGB(); if (aCtx->arbFBOBlit != NULL - && theReadFbo->NbSamples() != 0) + && !toApplyGamma + && theReadFbo->NbSamples() != 0) { GLbitfield aCopyMask = 0; theReadFbo->BindReadBuffer (aCtx); @@ -1397,6 +1527,7 @@ aCopyMask |= GL_DEPTH_BUFFER_BIT; } aCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); + aCtx->SetFrameBufferSRGB (false); } // we don't copy stencil buffer here... does it matter for performance? @@ -1437,6 +1568,7 @@ else { aCtx->arbFBO->glBindFramebuffer (GL_FRAMEBUFFER, OpenGl_FrameBuffer::NO_FRAMEBUFFER); + aCtx->SetFrameBufferSRGB (false); } } else @@ -1452,7 +1584,7 @@ } #endif - aCtx->BindTextures (Handle(OpenGl_TextureSet)()); + aCtx->BindTextures (Handle(OpenGl_TextureSet)(), Handle(OpenGl_ShaderProgram)()); const Graphic3d_TypeOfTextureFilter aFilter = (aDrawSizeX == aReadSizeX && aDrawSizeY == aReadSizeY) ? Graphic3d_TOTF_NEAREST : Graphic3d_TOTF_BILINEAR; const GLint aFilterGl = aFilter == Graphic3d_TOTF_NEAREST ? GL_NEAREST : GL_LINEAR; @@ -1460,7 +1592,7 @@ OpenGl_VertexBuffer* aVerts = initBlitQuad (theToFlip); const Handle(OpenGl_ShaderManager)& aManager = aCtx->ShaderManager(); if (aVerts->IsValid() - && aManager->BindFboBlitProgram()) + && aManager->BindFboBlitProgram (theReadFbo != NULL ? theReadFbo->NbSamples() : 0, toApplyGamma)) { aCtx->SetSampleAlphaToCoverage (false); theReadFbo->ColorTexture()->Bind (aCtx, Graphic3d_TextureUnit_0); @@ -1596,7 +1728,7 @@ aCtx->core20fwd->glDepthMask (GL_TRUE); aCtx->core20fwd->glEnable (GL_DEPTH_TEST); - aCtx->BindTextures (Handle(OpenGl_TextureSet)()); + aCtx->BindTextures (Handle(OpenGl_TextureSet)(), Handle(OpenGl_ShaderProgram)()); OpenGl_VertexBuffer* aVerts = initBlitQuad (myToFlipOutput); const Handle(OpenGl_ShaderManager)& aManager = aCtx->ShaderManager(); @@ -1831,3 +1963,64 @@ } return false; // color combination does not exist } + +// ======================================================================= +// function : checkPBRAvailability +// purpose : +// ======================================================================= +Standard_Boolean OpenGl_View::checkPBRAvailability() const +{ + return myWorkspace->GetGlContext()->HasPBR() + && !myPBREnvironment.IsNull(); +} + +// ======================================================================= +// function : bakePBREnvironment +// purpose : +// ======================================================================= +void OpenGl_View::bakePBREnvironment (const Handle(OpenGl_Context)& theCtx) +{ + const Handle(OpenGl_TextureSet)& aTextureSet = myCubeMapParams->TextureSet (theCtx); + if (!aTextureSet.IsNull() + && !aTextureSet->IsEmpty()) + { + myPBREnvironment->Bake (theCtx, + aTextureSet->First(), + myBackgroundCubeMap->ZIsInverted(), + myBackgroundCubeMap->IsTopDown(), + myRenderParams.PbrEnvBakingDiffNbSamples, + myRenderParams.PbrEnvBakingSpecNbSamples, + myRenderParams.PbrEnvBakingProbability); + } + else + { + myPBREnvironment->Clear (theCtx); + } +} + +// ======================================================================= +// function : clearPBREnvironment +// purpose : +// ======================================================================= +void OpenGl_View::clearPBREnvironment (const Handle(OpenGl_Context)& theCtx) +{ + myPBREnvironment->Clear (theCtx); +} + +// ======================================================================= +// function : clearPBREnvironment +// purpose : +// ======================================================================= +void OpenGl_View::processPBREnvRequest (const Handle(OpenGl_Context)& theCtx) +{ + if (myPBREnvState == OpenGl_PBREnvState_CREATED) + { + switch (myPBREnvRequest) + { + case OpenGl_PBREnvRequest_NONE: return; + case OpenGl_PBREnvRequest_BAKE: bakePBREnvironment (theCtx); break; + case OpenGl_PBREnvRequest_CLEAR: clearPBREnvironment (theCtx); break; + } + } + myPBREnvRequest = OpenGl_PBREnvRequest_NONE; +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Window_1.mm opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Window_1.mm --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Window_1.mm 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Window_1.mm 2021-02-02 08:51:56.000000000 +0000 @@ -91,13 +91,19 @@ kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, NULL]; - aGLContext = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2]; + aGLContext = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES3]; if (aGLContext == NULL || ![EAGLContext setCurrentContext: aGLContext]) { - TCollection_AsciiString aMsg ("OpenGl_Window::CreateWindow: EAGLContext creation failed"); - throw Aspect_GraphicDeviceDefinitionError(aMsg.ToCString()); - return; + aGLContext = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2]; + + if (aGLContext == NULL + || ![EAGLContext setCurrentContext: aGLContext]) + { + TCollection_AsciiString aMsg ("OpenGl_Window::CreateWindow: EAGLContext creation failed"); + throw Aspect_GraphicDeviceDefinitionError(aMsg.ToCString()); + return; + } } myGlContext->Init (aGLContext, Standard_False); @@ -384,11 +390,12 @@ // function : SetSwapInterval // purpose : // ======================================================================= -void OpenGl_Window::SetSwapInterval() +void OpenGl_Window::SetSwapInterval (Standard_Boolean theToForceNoSync) { - if (mySwapInterval != myGlContext->caps->swapInterval) + const Standard_Integer aSwapInterval = theToForceNoSync ? 0 : myGlContext->caps->swapInterval; + if (mySwapInterval != aSwapInterval) { - mySwapInterval = myGlContext->caps->swapInterval; + mySwapInterval = aSwapInterval; myGlContext->SetSwapInterval (mySwapInterval); } } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Window.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Window.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Window.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Window.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,6 +28,8 @@ #include +#include + IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Window,Standard_Transient) #if defined(HAVE_EGL) @@ -192,6 +194,13 @@ EGLSurface anEglSurf = EGL_NO_SURFACE; if ((EGLContext )theGContext == EGL_NO_CONTEXT) { + // EGL_KHR_gl_colorspace extension specifies if OpenGL should write into window buffer as into sRGB or RGB framebuffer + //const int aSurfAttribs[] = + //{ + // EGL_GL_COLORSPACE_KHR, !theCaps->sRGBDisable ? EGL_GL_COLORSPACE_SRGB_KHR : EGL_GL_COLORSPACE_LINEAR_KHR, + // EGL_NONE, + //}; + // create new surface anEglSurf = eglCreateWindowSurface (anEglDisplay, anEglConfig, @@ -217,10 +226,13 @@ //throw Aspect_GraphicDeviceDefinitionError("OpenGl_Window, EGL is unable to retrieve current surface!"); if (anEglConfig != NULL) { + #if !defined(__EMSCRIPTEN__) // eglCreatePbufferSurface() is not implemented by Emscripten EGL const int aSurfAttribs[] = { EGL_WIDTH, myWidth, EGL_HEIGHT, myHeight, + // EGL_KHR_gl_colorspace extension specifies if OpenGL should write into window buffer as into sRGB or RGB framebuffer + //EGL_GL_COLORSPACE_KHR, !theCaps->sRGBDisable ? EGL_GL_COLORSPACE_SRGB_KHR : EGL_GL_COLORSPACE_LINEAR_KHR, EGL_NONE }; anEglSurf = eglCreatePbufferSurface (anEglDisplay, anEglConfig, aSurfAttribs); @@ -228,6 +240,7 @@ { throw Aspect_GraphicDeviceDefinitionError("OpenGl_Window, EGL is unable to create off-screen surface!"); } + #endif } myGlContext->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_LOW, "OpenGl_Window::CreateWindow: WARNING, a Window is created without a EGL Surface!"); @@ -365,6 +378,10 @@ WGL_COLOR_BITS_ARB, 24, WGL_DEPTH_BITS_ARB, 24, WGL_STENCIL_BITS_ARB, 8, + // WGL_EXT_colorspace extension specifies if OpenGL should write into window buffer as into sRGB or RGB framebuffer + //WGL_COLORSPACE_EXT, !theCaps->sRGBDisable ? WGL_COLORSPACE_SRGB_EXT : WGL_COLORSPACE_LINEAR_EXT, + // requires WGL_ARB_framebuffer_sRGB or WGL_EXT_framebuffer_sRGB extensions + //WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT, !theCaps->sRGBDisable ? GL_TRUE : GL_FALSE, WGL_ACCELERATION_ARB, theCaps->contextNoAccel ? WGL_NO_ACCELERATION_ARB : WGL_FULL_ACCELERATION_ARB, 0, 0, }; @@ -792,11 +809,12 @@ // function : SetSwapInterval // purpose : // ======================================================================= -void OpenGl_Window::SetSwapInterval() +void OpenGl_Window::SetSwapInterval (Standard_Boolean theToForceNoSync) { - if (mySwapInterval != myGlContext->caps->swapInterval) + const Standard_Integer aSwapInterval = theToForceNoSync ? 0 : myGlContext->caps->swapInterval; + if (mySwapInterval != aSwapInterval) { - mySwapInterval = myGlContext->caps->swapInterval; + mySwapInterval = aSwapInterval; myGlContext->SetSwapInterval (mySwapInterval); } } diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Window.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Window.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Window.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Window.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -73,7 +73,7 @@ Standard_EXPORT virtual Standard_Boolean Activate(); //! Sets swap interval for this window according to the context's settings. - Standard_EXPORT void SetSwapInterval(); + Standard_EXPORT void SetSwapInterval (Standard_Boolean theToForceNoSync); protected: diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Workspace.cxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Workspace.cxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Workspace.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Workspace.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -54,34 +54,46 @@ // function : Init // purpose : // ======================================================================= -void OpenGl_Material::Init (const Graphic3d_MaterialAspect& theMat, - const Quantity_Color& theInteriorColor) -{ - ChangeShine() = 128.0f * theMat.Shininess(); - ChangeTransparency() = theMat.Alpha(); +void OpenGl_Material::Init (const OpenGl_Context& theCtx, + const Graphic3d_MaterialAspect& theMat, + const Quantity_Color& theInteriorColor) +{ + Common.ChangeShine() = 128.0f * theMat.Shininess(); + Common.ChangeTransparency() = theMat.Alpha(); + + Pbr.ChangeMetallic() = theMat.PBRMaterial().Metallic(); + Pbr.ChangeRoughness() = theMat.PBRMaterial().NormalizedRoughness(); + Pbr.EmissionIOR = Graphic3d_Vec4 (theMat.PBRMaterial().Emission(), theMat.PBRMaterial().IOR()); const OpenGl_Vec3& aSrcAmb = theMat.AmbientColor(); const OpenGl_Vec3& aSrcDif = theMat.DiffuseColor(); const OpenGl_Vec3& aSrcSpe = theMat.SpecularColor(); const OpenGl_Vec3& aSrcEms = theMat.EmissiveColor(); - Specular.SetValues (aSrcSpe, 1.0f); // interior color is ignored for Specular + Common.Specular.SetValues (aSrcSpe, 1.0f); // interior color is ignored for Specular switch (theMat.MaterialType()) { case Graphic3d_MATERIAL_ASPECT: { - Ambient .SetValues (aSrcAmb * theInteriorColor, 1.0f); - Diffuse .SetValues (aSrcDif * theInteriorColor, 1.0f); - Emission.SetValues (aSrcEms * theInteriorColor, 1.0f); + Common.Ambient .SetValues (aSrcAmb * theInteriorColor, 1.0f); + Common.Diffuse .SetValues (aSrcDif * theInteriorColor, 1.0f); + Common.Emission.SetValues (aSrcEms * theInteriorColor, 1.0f); + Pbr .BaseColor.SetValues (theInteriorColor, theMat.Alpha()); break; } case Graphic3d_MATERIAL_PHYSIC: { - Ambient .SetValues (aSrcAmb, 1.0f); - Diffuse .SetValues (aSrcDif, 1.0f); - Emission.SetValues (aSrcEms, 1.0f); + Common.Ambient .SetValues (aSrcAmb, 1.0f); + Common.Diffuse .SetValues (aSrcDif, 1.0f); + Common.Emission.SetValues (aSrcEms, 1.0f); + Pbr.BaseColor = theMat.PBRMaterial().Color(); break; } } + + Common.Ambient = theCtx.Vec4FromQuantityColor (Common.Ambient); + Common.Diffuse = theCtx.Vec4FromQuantityColor (Common.Diffuse); + Common.Specular = theCtx.Vec4FromQuantityColor (Common.Specular); + Common.Emission = theCtx.Vec4FromQuantityColor (Common.Emission); } // ======================================================================= @@ -186,7 +198,7 @@ myGlContext->SetPolygonOffset (Graphic3d_PolygonOffset()); ApplyAspects(); - myGlContext->SetTypeOfLine (myDefaultAspects.Aspect()->LineType()); + myGlContext->SetLineStipple(myDefaultAspects.Aspect()->LinePattern()); myGlContext->SetLineWidth (myDefaultAspects.Aspect()->LineWidth()); if (myGlContext->core15fwd != NULL) { @@ -226,7 +238,7 @@ // function : ApplyAspects // purpose : // ======================================================================= -const OpenGl_Aspects* OpenGl_Workspace::ApplyAspects() +const OpenGl_Aspects* OpenGl_Workspace::ApplyAspects (bool theToBindTextures) { if (myView->BackfacingModel() == Graphic3d_TOBM_AUTOMATIC) { @@ -293,15 +305,18 @@ myGlContext->SetShadingMaterial (myAspectsSet, myHighlightStyle); } - const Handle(OpenGl_TextureSet)& aTextureSet = myAspectsSet->TextureSet (myGlContext, ToHighlight()); - if (!aTextureSet.IsNull() - || myAspectsSet->Aspect()->ToMapTexture()) + if (theToBindTextures) { - myGlContext->BindTextures (aTextureSet); + const Handle(OpenGl_TextureSet)& aTextureSet = TextureSet(); + myGlContext->BindTextures (aTextureSet, Handle(OpenGl_ShaderProgram)()); } - else + + if ((myView->myShadingModel == Graphic3d_TOSM_PBR + || myView->myShadingModel == Graphic3d_TOSM_PBR_FACET) + && !myView->myPBREnvironment.IsNull() + && myView->myPBREnvironment->IsNeededToBeBound()) { - myGlContext->BindTextures (myEnvironmentTexture); + myView->myPBREnvironment->Bind (myGlContext); } myAspectsApplied = myAspectsSet->Aspect(); @@ -339,9 +354,9 @@ // create the FBO const Handle(OpenGl_Context)& aCtx = GetGlContext(); - aCtx->BindTextures (Handle(OpenGl_TextureSet)()); + aCtx->BindTextures (Handle(OpenGl_TextureSet)(), Handle(OpenGl_ShaderProgram)()); Handle(OpenGl_FrameBuffer) aFrameBuffer = new OpenGl_FrameBuffer(); - if (!aFrameBuffer->Init (aCtx, theWidth, theHeight, GL_RGBA8, GL_DEPTH24_STENCIL8, 0)) + if (!aFrameBuffer->Init (aCtx, theWidth, theHeight, GL_SRGB8_ALPHA8, GL_DEPTH24_STENCIL8, 0)) { aFrameBuffer->Release (aCtx.operator->()); return Handle(OpenGl_FrameBuffer)(); @@ -431,3 +446,30 @@ } return true; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void OpenGl_Workspace::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUseZBuffer) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUseDepthWrite) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myNoneCulling) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myFrontCulling) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNbSkippedTranspElems) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRenderFilter) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myDefaultAspects) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspectsSet) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspectsApplied.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToAllowFaceCulling) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myAspectFaceHl) +} diff -Nru opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Workspace.hxx opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Workspace.hxx --- opencascade-7.4.1+dfsg1/src/OpenGl/OpenGl_Workspace.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OpenGl/OpenGl_Workspace.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -148,9 +148,20 @@ //! Assign new aspects (will be applied within ApplyAspects()). Standard_EXPORT const OpenGl_Aspects* SetAspects (const OpenGl_Aspects* theAspect); + //! Return TextureSet from set Aspects or Environment texture. + const Handle(OpenGl_TextureSet)& TextureSet() const + { + const Handle(OpenGl_TextureSet)& aTextureSet = myAspectsSet->TextureSet (myGlContext, ToHighlight()); + return !aTextureSet.IsNull() + || myAspectsSet->Aspect()->ToMapTexture() + ? aTextureSet + : myEnvironmentTexture; + } + //! Apply aspects. + //! @param theToBindTextures flag to bind texture set defined by applied aspect //! @return aspect set by SetAspects() - Standard_EXPORT const OpenGl_Aspects* ApplyAspects(); + Standard_EXPORT const OpenGl_Aspects* ApplyAspects (bool theToBindTextures = true); //! Clear the applied aspect state to default values. void ResetAppliedAspect(); @@ -194,6 +205,9 @@ //! Returns environment texture. const Handle(OpenGl_TextureSet)& EnvironmentTexture() const { return myEnvironmentTexture; } + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: //! @name protected fields OpenGl_View* myView; diff -Nru opencascade-7.4.1+dfsg1/src/OS/ApplicationFramework.tcl opencascade-7.5.1+dfsg1/src/OS/ApplicationFramework.tcl --- opencascade-7.4.1+dfsg1/src/OS/ApplicationFramework.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/ApplicationFramework.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -58,10 +58,6 @@ ;# ;# Returns a list of exported features. -;# source : Source files -;# runtime: Shareables -;# wokadm : WOK admin files -;# api : Public include files ;# proc ApplicationFramework:Export { } { return [list source runtime wokadm api] diff -Nru opencascade-7.4.1+dfsg1/src/OS/DataExchange.tcl opencascade-7.5.1+dfsg1/src/OS/DataExchange.tcl --- opencascade-7.4.1+dfsg1/src/OS/DataExchange.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/DataExchange.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -56,10 +56,6 @@ ;# ;# Returns a list of exported features. -;# source : Source files -;# runtime: Shareables -;# wokadm : WOK admin files -;# api : Public include files ;# proc DataExchange:Export { } { return [list source runtime wokadm api] diff -Nru opencascade-7.4.1+dfsg1/src/OS/Draw.tcl opencascade-7.5.1+dfsg1/src/OS/Draw.tcl --- opencascade-7.4.1+dfsg1/src/OS/Draw.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/Draw.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -58,10 +58,6 @@ ;# ;# Returns a list of exported features. -;# source : Source files -;# runtime: Shareables -;# wokadm : WOK admin files -;# api : Public include files ;# proc Draw:Export { } { return [list source runtime wokadm api] diff -Nru opencascade-7.4.1+dfsg1/src/OS/FoundationClasses.tcl opencascade-7.5.1+dfsg1/src/OS/FoundationClasses.tcl --- opencascade-7.4.1+dfsg1/src/OS/FoundationClasses.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/FoundationClasses.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -52,10 +52,6 @@ ;# ;# Returns a list of exported features. -;# source : Source files -;# runtime: Shareables -;# wokadm : WOK admin files -;# api : Public include files ;# proc FoundationClasses:Export { } { return [list source runtime wokadm api] diff -Nru opencascade-7.4.1+dfsg1/src/OS/ModelingAlgorithms.tcl opencascade-7.5.1+dfsg1/src/OS/ModelingAlgorithms.tcl --- opencascade-7.4.1+dfsg1/src/OS/ModelingAlgorithms.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/ModelingAlgorithms.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -50,10 +50,6 @@ ;# ;# Returns a list of exported features. -;# source : Source files -;# runtime: Shareables -;# wokadm : WOK admin files -;# api : Public include files ;# proc ModelingAlgorithms:Export { } { return [list source runtime wokadm api] diff -Nru opencascade-7.4.1+dfsg1/src/OS/ModelingData.tcl opencascade-7.5.1+dfsg1/src/OS/ModelingData.tcl --- opencascade-7.4.1+dfsg1/src/OS/ModelingData.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/ModelingData.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -42,10 +42,6 @@ ;# ;# Returns a list of exported features. -;# source : Source files -;# runtime: Shareables -;# wokadm : WOK admin files -;# api : Public include files ;# proc ModelingData:Export { } { return [list source runtime wokadm api] diff -Nru opencascade-7.4.1+dfsg1/src/OS/TApplicationFramework.tcl opencascade-7.5.1+dfsg1/src/OS/TApplicationFramework.tcl --- opencascade-7.4.1+dfsg1/src/OS/TApplicationFramework.tcl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/TApplicationFramework.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,41 @@ +# Copyright (c) 2020 OPEN CASCADE SAS +# +# This file is part of Open CASCADE Technology software library. +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License version 2.1 as published +# by the Free Software Foundation, with special exception defined in the file +# OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +# distribution for complete text of the license and disclaimer of any warranty. +# +# Alternatively, this file may be used under the terms of Open CASCADE +# commercial license or contractual agreement. + +# List of toolkits +proc TApplicationFramework:toolkits { } { + return [list TKTreeModel TKTInspectorAPI TKDFBrowser] +} + +# List of non-toolkits (resource units, executables etc., with associated info) +proc TApplicationFramework:ressources { } { +} + +# Module name +proc TApplicationFramework:name { } { + return TApplicationFramework +} + +# And short alias +proc TApplicationFramework:alias { } { + return TApplicationFramework +} + +# Dependency on other products +proc TApplicationFramework:depends { } { + return [list ApplicationFramework FoundationClasses DataExchange TModelingData Visualization] +} + +# Returns a list of exported features. +proc TApplicationFramework:Export { } { + return [list source runtime wokadm api] +} diff -Nru opencascade-7.4.1+dfsg1/src/OS/TModelingData.tcl opencascade-7.5.1+dfsg1/src/OS/TModelingData.tcl --- opencascade-7.4.1+dfsg1/src/OS/TModelingData.tcl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/TModelingData.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,41 @@ +# Copyright (c) 2020 OPEN CASCADE SAS +# +# This file is part of Open CASCADE Technology software library. +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License version 2.1 as published +# by the Free Software Foundation, with special exception defined in the file +# OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +# distribution for complete text of the license and disclaimer of any warranty. +# +# Alternatively, this file may be used under the terms of Open CASCADE +# commercial license or contractual agreement. + +# List of toolkits +proc TModelingData:toolkits { } { + return [list TKShapeView] +} + +# List of non-toolkits (resource units, executables etc., with associated info) +proc TModelingData:ressources { } { +} + +# Module name +proc TModelingData:name { } { + return TModelingData +} + +# And short alias +proc TModelingData:alias { } { + return TModelingData +} + +# Dependency on other products +proc TModelingData:depends { } { + return [list FoundationClasses ModelingData TVisualization] +} + +# Returns a list of exported features. +proc TModelingData:Export { } { + return [list source runtime wokadm api] +} diff -Nru opencascade-7.4.1+dfsg1/src/OS/Tools.tcl opencascade-7.5.1+dfsg1/src/OS/Tools.tcl --- opencascade-7.4.1+dfsg1/src/OS/Tools.tcl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/Tools.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,24 @@ +# Copyright (c) 2020 OPEN CASCADE SAS +# +# This file is part of Open CASCADE Technology software library. +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License version 2.1 as published +# by the Free Software Foundation, with special exception defined in the file +# OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +# distribution for complete text of the license and disclaimer of any warranty. +# +# Alternatively, this file may be used under the terms of Open CASCADE +# commercial license or contractual agreement. + +;# +;# Returns an ordered list of module names +;# +proc OS:Tools { {plat ""} } { + set ret [list TModelingData \ + TVisualization \ + TApplicationFramework \ + TTool \ + ] + return $ret +} diff -Nru opencascade-7.4.1+dfsg1/src/OS/TTool.tcl opencascade-7.5.1+dfsg1/src/OS/TTool.tcl --- opencascade-7.4.1+dfsg1/src/OS/TTool.tcl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/TTool.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,44 @@ +# Copyright (c) 2020 OPEN CASCADE SAS +# +# This file is part of Open CASCADE Technology software library. +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License version 2.1 as published +# by the Free Software Foundation, with special exception defined in the file +# OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +# distribution for complete text of the license and disclaimer of any warranty. +# +# Alternatively, this file may be used under the terms of Open CASCADE +# commercial license or contractual agreement. + +# List of toolkits +proc TTool:toolkits { } { + return [list TKTInspector TKToolsDraw] +} + +# List of non-toolkits (resource units, executables etc., with associated info) +proc TTool:ressources { } { + return [list \ + [list both x TInspectorEXE {}] \ + ] +} + +# Module name +proc TTool:name { } { + return TTool +} + +# And short alias +proc TTool:alias { } { + return TTool +} + +# Dependency on other products +proc TTool:depends { } { + return [list FoundationClasses Draw TApplicationFramework] +} + +# Returns a list of exported features. +proc TTool:Export { } { + return [list source runtime wokadm api] +} diff -Nru opencascade-7.4.1+dfsg1/src/OS/TVisualization.tcl opencascade-7.5.1+dfsg1/src/OS/TVisualization.tcl --- opencascade-7.4.1+dfsg1/src/OS/TVisualization.tcl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/TVisualization.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,41 @@ +# Copyright (c) 2020 OPEN CASCADE SAS +# +# This file is part of Open CASCADE Technology software library. +# +# This library is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License version 2.1 as published +# by the Free Software Foundation, with special exception defined in the file +# OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +# distribution for complete text of the license and disclaimer of any warranty. +# +# Alternatively, this file may be used under the terms of Open CASCADE +# commercial license or contractual agreement. + +# List of toolkits +proc TVisualization:toolkits { } { + return [list TKView TKVInspector] +} + +# List of non-toolkits (resource units, executables etc., with associated info) +proc TVisualization:ressources { } { +} + +# Module name +proc TVisualization:name { } { + return TVisualization +} + +# And short alias +proc TVisualization:alias { } { + return TVisualization +} + +# Dependency on other products +proc TVisualization:depends { } { + return [list FoundationClasses] +} + +# Returns a list of exported features. +proc TVisualization:Export { } { + return [list source runtime wokadm api] +} diff -Nru opencascade-7.4.1+dfsg1/src/OS/Visualization.tcl opencascade-7.5.1+dfsg1/src/OS/Visualization.tcl --- opencascade-7.4.1+dfsg1/src/OS/Visualization.tcl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OS/Visualization.tcl 2021-02-02 08:51:56.000000000 +0000 @@ -40,10 +40,11 @@ ;# Autres UDs a prendre. ;# proc Visualization:ressources { } { - return [list \ - [list both r Textures {}] \ - [list both r Shaders {}] \ - ] + return [list \ + [list both r Textures {}] \ + [list both r Shaders {}] \ + [list both r XRResources {}] \ + ] } ;# ;# Nom du module @@ -70,10 +71,6 @@ ;# ;# Returns a list of exported features. -;# source : Source files -;# runtime: Shareables -;# wokadm : WOK admin files -;# api : Public include files ;# proc Visualization:Export { } { return [list source runtime wokadm api] diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_Chronometer.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_Chronometer.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_Chronometer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_Chronometer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,7 +51,7 @@ void OSD_Chronometer::GetProcessCPU (Standard_Real& theUserSeconds, Standard_Real& theSystemSeconds) { -#if defined(__linux__) || defined(__FreeBSD__) || defined(__ANDROID__) || defined(__QNX__) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__ANDROID__) || defined(__QNX__) || defined(__EMSCRIPTEN__) static const long aCLK_TCK = sysconf(_SC_CLK_TCK); #else static const long aCLK_TCK = CLK_TCK; diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,48 +55,34 @@ return Standard_True; } +#ifdef _WIN32 + #include +#else + #include +#endif + //======================================================================= //function : OSDSecSleep //purpose : Cause the process to sleep during a amount of seconds //======================================================================= - +void OSD::SecSleep (const Standard_Integer theSeconds) +{ #ifdef _WIN32 -# include -# define SLEEP(NSEC) Sleep(1000*(NSEC)) + Sleep (theSeconds * 1000); #else -#include -# define SLEEP(NSEC) sleep(NSEC) + usleep (theSeconds * 1000 * 1000); #endif - -void OSD::SecSleep(const Standard_Integer aDelay) -{ - SLEEP(aDelay); } //======================================================================= //function : MilliSecSleep //purpose : Cause the process to sleep during a amount of milliseconds //======================================================================= - -#ifdef _WIN32 - -void OSD::MilliSecSleep(const Standard_Integer aDelay) +void OSD::MilliSecSleep (const Standard_Integer theMilliseconds) { - Sleep(aDelay) ; -} - +#ifdef _WIN32 + Sleep (theMilliseconds); #else - -#include - -void OSD::MilliSecSleep(const Standard_Integer aDelay) -{ - struct timeval timeout ; - - timeout.tv_sec = aDelay / 1000 ; - timeout.tv_usec = (aDelay % 1000) * 1000 ; - - select(0,NULL,NULL,NULL,&timeout) ; -} - + usleep (theMilliseconds * 1000); #endif +} diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_Directory.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_Directory.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_Directory.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_Directory.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,7 @@ #include #endif - void _osd_wnt_set_error (OSD_Error&, OSD_WhoAmI, ... ); + void _osd_wnt_set_error (OSD_Error&, Standard_Integer, ... ); #else #include #include diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_DirectoryIterator.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_DirectoryIterator.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_DirectoryIterator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_DirectoryIterator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -193,7 +193,7 @@ #define _FD ( ( PWIN32_FIND_DATAW )myData ) -void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... ); +void _osd_wnt_set_error ( OSD_Error&, Standard_Integer, ... ); OSD_DirectoryIterator :: OSD_DirectoryIterator ( const OSD_Path& where, @@ -318,7 +318,12 @@ } // end OSD_DirectoryIterator :: Error // For compatibility with UNIX version -OSD_DirectoryIterator::OSD_DirectoryIterator() {} +OSD_DirectoryIterator::OSD_DirectoryIterator() +: myFlag(false), + myHandle(0), + myData(0), + myFirstCall(Standard_False) +{} void OSD_DirectoryIterator::Initialize( const OSD_Path&, diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_Disk.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_Disk.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_Disk.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_Disk.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,7 @@ #ifdef _WIN32 #include - void _osd_wnt_set_error (OSD_Error&, OSD_WhoAmI, ... ); + void _osd_wnt_set_error (OSD_Error&, Standard_Integer, ... ); static TCollection_AsciiString _osd_wnt_set_disk_name (const OSD_Path& thePath) { diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_File.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_File.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_File.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_File.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,7 +42,7 @@ #define OPEN_OLD 1 #define OPEN_APPEND 2 - void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... ); + void _osd_wnt_set_error (OSD_Error&, Standard_Integer, ...); #ifndef OCCT_UWP PSECURITY_DESCRIPTOR __fastcall _osd_wnt_protection_to_sd ( const OSD_Protection&, BOOL, const wchar_t* ); diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_FileIterator.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_FileIterator.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_FileIterator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_FileIterator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -267,7 +267,7 @@ #define _FD ( ( PWIN32_FIND_DATAW )myData ) -void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... ); +void _osd_wnt_set_error ( OSD_Error&, Standard_Integer, ... ); OSD_FileIterator :: OSD_FileIterator ( const OSD_Path& where, @@ -392,7 +392,12 @@ } // end OSD_FileIterator :: Error // For compatibility with UNIX version -OSD_FileIterator::OSD_FileIterator() {} +OSD_FileIterator::OSD_FileIterator() +: myFlag(Standard_False), + myHandle(0), + myData(0), + myFirstCall(Standard_False) +{} void OSD_FileIterator::Initialize( const OSD_Path&, diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_FileNode.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_FileNode.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_FileNode.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_FileNode.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -393,7 +393,7 @@ #endif Standard_Integer __fastcall _get_file_type ( Standard_CString, HANDLE ); -void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... ); +void _osd_wnt_set_error ( OSD_Error&, Standard_Integer, ... ); static BOOL __fastcall _get_file_time (const wchar_t*, LPSYSTEMTIME, BOOL ); static void __fastcall _test_raise ( TCollection_AsciiString, Standard_CString ); @@ -448,7 +448,7 @@ { myError.Reset(); - Standard_Boolean retVal = Standard_False;; + Standard_Boolean retVal = Standard_False; TCollection_AsciiString fName; myPath.SystemName ( fName ); @@ -758,7 +758,7 @@ TEST_RAISE( "CreationMoment" ); - if (_get_file_time (fNameW.ToWideString(), &stCreationSystemMoment, TRUE)) + if (_get_file_time (fNameW.ToWideString(), &stCreationSystemMoment, FALSE)) { SYSTEMTIME * aSysTime = &stCreationMoment; BOOL aFlag = SystemTimeToTzSpecificLocalTime (NULL, @@ -825,7 +825,7 @@ } // end OSD_FileNode :: Error -void _osd_wnt_set_error ( OSD_Error& err, OSD_WhoAmI who, ... ) { +void _osd_wnt_set_error ( OSD_Error& err, Standard_Integer who, ... ) { DWORD errCode; diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_Host.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_Host.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_Host.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_Host.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -189,7 +189,7 @@ #pragma comment( lib, "WSOCK32.LIB" ) #endif -void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... ); +void _osd_wnt_set_error ( OSD_Error&, Standard_Integer, ... ); static BOOL fInit = FALSE; static TCollection_AsciiString hostName; @@ -218,11 +218,7 @@ ZeroMemory (szHostName, sizeof(char) * (MAX_COMPUTERNAME_LENGTH + 1)); // suppress GetVersionEx() deprecation warning -#if defined(__INTEL_COMPILER) - #pragma warning(disable : 1478) -#elif defined(_MSC_VER) - #pragma warning(disable : 4996) -#endif + Standard_DISABLE_DEPRECATION_WARNINGS if (!GetVersionExW (&osVerInfo)) { _osd_wnt_set_error (myError, OSD_WHost); @@ -236,9 +232,7 @@ ms.dwLength = sizeof(MEMORYSTATUS); GlobalMemoryStatus (&ms); } // end else -#ifdef _MSC_VER - #pragma warning(default : 4996) -#endif + Standard_ENABLE_DEPRECATION_WARNINGS if ( !Failed () ) { diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD.hxx opencascade-7.5.1+dfsg1/src/OSD/OSD.hxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -113,11 +113,11 @@ Standard_EXPORT static Standard_Boolean ToCatchFloatingSignals(); //! Commands the process to sleep for a number of seconds. - Standard_EXPORT static void SecSleep (const Standard_Integer aDelay); - + Standard_EXPORT static void SecSleep (const Standard_Integer theSeconds); + //! Commands the process to sleep for a number of milliseconds - Standard_EXPORT static void MilliSecSleep (const Standard_Integer aDelay); - + Standard_EXPORT static void MilliSecSleep (const Standard_Integer theMilliseconds); + //! Converts aReal into aCstring in exponential format with a period as //! decimal point, no thousand separator and no grouping of digits. //! The conversion is independant from the current locale diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_MemInfo.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_MemInfo.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_MemInfo.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_MemInfo.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,12 +37,22 @@ #include +#if defined(__EMSCRIPTEN__) + #include + + //! Return WebAssembly heap size in bytes. + EM_JS(size_t, OSD_MemInfo_getModuleHeapLength, (), { + return Module.HEAP8.length; + }); +#endif + // ======================================================================= // function : OSD_MemInfo // purpose : // ======================================================================= OSD_MemInfo::OSD_MemInfo (const Standard_Boolean theImmediateUpdate) { + SetActive (Standard_True); if (theImmediateUpdate) { Update(); @@ -53,6 +63,17 @@ } } +// ======================================================================= +// function : SetActive +// purpose : +// ======================================================================= +void OSD_MemInfo::SetActive (const Standard_Boolean theActive) +{ + for (Standard_Integer anIter = 0; anIter < MemCounter_NB; ++anIter) + { + SetActive ((Counter)anIter, theActive); + } +} // ======================================================================= // function : Clear @@ -76,47 +97,103 @@ #ifndef OCCT_UWP #if defined(_WIN32) #if (_WIN32_WINNT >= 0x0500) - MEMORYSTATUSEX aStatEx; - aStatEx.dwLength = sizeof(aStatEx); - GlobalMemoryStatusEx (&aStatEx); - myCounters[MemVirtual] = Standard_Size(aStatEx.ullTotalVirtual - aStatEx.ullAvailVirtual); + if (IsActive (MemVirtual)) + { + MEMORYSTATUSEX aStatEx; + aStatEx.dwLength = sizeof(aStatEx); + GlobalMemoryStatusEx (&aStatEx); + myCounters[MemVirtual] = Standard_Size(aStatEx.ullTotalVirtual - aStatEx.ullAvailVirtual); + } #else - MEMORYSTATUS aStat; - aStat.dwLength = sizeof(aStat); - GlobalMemoryStatus (&aStat); - myCounters[MemVirtual] = Standard_Size(aStat.dwTotalVirtual - aStat.dwAvailVirtual); + if (IsActive (MemVirtual)) + { + MEMORYSTATUS aStat; + aStat.dwLength = sizeof(aStat); + GlobalMemoryStatus (&aStat); + myCounters[MemVirtual] = Standard_Size(aStat.dwTotalVirtual - aStat.dwAvailVirtual); + } #endif - // use Psapi library - HANDLE aProcess = GetCurrentProcess(); -#if (_WIN32_WINNT >= 0x0501) - PROCESS_MEMORY_COUNTERS_EX aProcMemCnts; -#else - PROCESS_MEMORY_COUNTERS aProcMemCnts; -#endif - if (GetProcessMemoryInfo (aProcess, (PROCESS_MEMORY_COUNTERS* )&aProcMemCnts, sizeof(aProcMemCnts))) + if (IsActive (MemPrivate) + || IsActive (MemWorkingSet) + || IsActive (MemWorkingSetPeak) + || IsActive (MemSwapUsage) + || IsActive (MemSwapUsagePeak)) { + // use Psapi library + HANDLE aProcess = GetCurrentProcess(); #if (_WIN32_WINNT >= 0x0501) - myCounters[MemPrivate] = aProcMemCnts.PrivateUsage; + PROCESS_MEMORY_COUNTERS_EX aProcMemCnts; + #else + PROCESS_MEMORY_COUNTERS aProcMemCnts; #endif - myCounters[MemWorkingSet] = aProcMemCnts.WorkingSetSize; - myCounters[MemWorkingSetPeak] = aProcMemCnts.PeakWorkingSetSize; - myCounters[MemSwapUsage] = aProcMemCnts.PagefileUsage; - myCounters[MemSwapUsagePeak] = aProcMemCnts.PeakPagefileUsage; + if (GetProcessMemoryInfo (aProcess, (PROCESS_MEMORY_COUNTERS* )&aProcMemCnts, sizeof(aProcMemCnts))) + { + #if (_WIN32_WINNT >= 0x0501) + myCounters[MemPrivate] = aProcMemCnts.PrivateUsage; + #endif + myCounters[MemWorkingSet] = aProcMemCnts.WorkingSetSize; + myCounters[MemWorkingSetPeak] = aProcMemCnts.PeakWorkingSetSize; + myCounters[MemSwapUsage] = aProcMemCnts.PagefileUsage; + myCounters[MemSwapUsagePeak] = aProcMemCnts.PeakPagefileUsage; + } } - _HEAPINFO hinfo; - int heapstatus; - hinfo._pentry = NULL; - - myCounters[MemHeapUsage] = 0; - while((heapstatus = _heapwalk(&hinfo)) == _HEAPOK) + if (IsActive (MemHeapUsage)) { - if(hinfo._useflag == _USEDENTRY) - myCounters[MemHeapUsage] += hinfo._size; + _HEAPINFO hinfo; + int heapstatus; + hinfo._pentry = NULL; + + myCounters[MemHeapUsage] = 0; + while((heapstatus = _heapwalk(&hinfo)) == _HEAPOK) + { + if (hinfo._useflag == _USEDENTRY) + { + myCounters[MemHeapUsage] += hinfo._size; + } + } } +#elif defined(__EMSCRIPTEN__) + if (IsActive (MemHeapUsage) + || IsActive (MemWorkingSet) + || IsActive (MemWorkingSetPeak)) + { + // /proc/%d/status is not emulated - get more info from mallinfo() + const struct mallinfo aMI = mallinfo(); + if (IsActive (MemHeapUsage)) + { + myCounters[MemHeapUsage] = aMI.uordblks; + } + if (IsActive (MemWorkingSet)) + { + myCounters[MemWorkingSet] = aMI.uordblks; + } + if (IsActive (MemWorkingSetPeak)) + { + myCounters[MemWorkingSetPeak] = aMI.usmblks; + } + } + if (IsActive (MemVirtual)) + { + myCounters[MemVirtual] = OSD_MemInfo_getModuleHeapLength(); + } #elif (defined(__linux__) || defined(__linux)) + if (IsActive (MemHeapUsage)) + { + const struct mallinfo aMI = mallinfo(); + myCounters[MemHeapUsage] = aMI.uordblks; + } + + if (!IsActive (MemVirtual) + && !IsActive (MemWorkingSet) + && !IsActive (MemWorkingSetPeak) + && !IsActive (MemPrivate)) + { + return; + } + // use procfs on Linux char aBuff[4096]; snprintf (aBuff, sizeof(aBuff), "/proc/%d/status", getpid()); @@ -136,51 +213,57 @@ continue; } - if (strncmp (aBuff, "VmSize:", strlen ("VmSize:")) == 0) + if (IsActive (MemVirtual) + && strncmp (aBuff, "VmSize:", strlen ("VmSize:")) == 0) { myCounters[MemVirtual] = atol (aBuff + strlen ("VmSize:")) * 1024; } //else if (strncmp (aBuff, "VmPeak:", strlen ("VmPeak:")) == 0) // myVirtualPeak = atol (aBuff + strlen ("VmPeak:")) * 1024; - else if (strncmp (aBuff, "VmRSS:", strlen ("VmRSS:")) == 0) + else if (IsActive (MemWorkingSet) + && strncmp (aBuff, "VmRSS:", strlen ("VmRSS:")) == 0) { myCounters[MemWorkingSet] = atol (aBuff + strlen ("VmRSS:")) * 1024; // RSS - resident set size } - else if (strncmp (aBuff, "VmHWM:", strlen ("VmHWM:")) == 0) + else if (IsActive (MemWorkingSetPeak) + && strncmp (aBuff, "VmHWM:", strlen ("VmHWM:")) == 0) { myCounters[MemWorkingSetPeak] = atol (aBuff + strlen ("VmHWM:")) * 1024; // HWM - high water mark } - else if (strncmp (aBuff, "VmData:", strlen ("VmData:")) == 0) + else if (IsActive (MemPrivate) + && strncmp (aBuff, "VmData:", strlen ("VmData:")) == 0) { if (myCounters[MemPrivate] == Standard_Size(-1)) ++myCounters[MemPrivate]; myCounters[MemPrivate] += atol (aBuff + strlen ("VmData:")) * 1024; } - else if (strncmp (aBuff, "VmStk:", strlen ("VmStk:")) == 0) + else if (IsActive (MemPrivate) + && strncmp (aBuff, "VmStk:", strlen ("VmStk:")) == 0) { if (myCounters[MemPrivate] == Standard_Size(-1)) ++myCounters[MemPrivate]; myCounters[MemPrivate] += atol (aBuff + strlen ("VmStk:")) * 1024; } } aFile.close(); - - struct mallinfo aMI = mallinfo(); - myCounters[MemHeapUsage] = aMI.uordblks; - #elif (defined(__APPLE__)) - struct task_basic_info aTaskInfo; - mach_msg_type_number_t aTaskInfoCount = TASK_BASIC_INFO_COUNT; - if (task_info (mach_task_self(), TASK_BASIC_INFO, - (task_info_t )&aTaskInfo, &aTaskInfoCount) == KERN_SUCCESS) - { - // On Mac OS X, these values in bytes, not pages! - myCounters[MemVirtual] = aTaskInfo.virtual_size; - myCounters[MemWorkingSet] = aTaskInfo.resident_size; - - //Getting malloc statistics - malloc_statistics_t aStats; - malloc_zone_statistics (NULL, &aStats); + if (IsActive (MemVirtual) + || IsActive (MemWorkingSet) + || IsActive (MemHeapUsage)) + { + struct task_basic_info aTaskInfo; + mach_msg_type_number_t aTaskInfoCount = TASK_BASIC_INFO_COUNT; + if (task_info (mach_task_self(), TASK_BASIC_INFO, + (task_info_t )&aTaskInfo, &aTaskInfoCount) == KERN_SUCCESS) + { + // On Mac OS X, these values in bytes, not pages! + myCounters[MemVirtual] = aTaskInfo.virtual_size; + myCounters[MemWorkingSet] = aTaskInfo.resident_size; + + //Getting malloc statistics + malloc_statistics_t aStats; + malloc_zone_statistics (NULL, &aStats); - myCounters[MemHeapUsage] = aStats.size_in_use; + myCounters[MemHeapUsage] = aStats.size_in_use; + } } #endif #endif @@ -193,33 +276,33 @@ TCollection_AsciiString OSD_MemInfo::ToString() const { TCollection_AsciiString anInfo; - if (myCounters[MemPrivate] != Standard_Size(-1)) + if (hasValue (MemPrivate)) { anInfo += TCollection_AsciiString(" Private memory: ") + Standard_Integer (ValueMiB (MemPrivate)) + " MiB\n"; } - if (myCounters[MemWorkingSet] != Standard_Size(-1)) + if (hasValue (MemWorkingSet)) { anInfo += TCollection_AsciiString(" Working Set: ") + Standard_Integer (ValueMiB (MemWorkingSet)) + " MiB"; - if (myCounters[MemWorkingSetPeak] != Standard_Size(-1)) + if (hasValue (MemWorkingSetPeak)) { anInfo += TCollection_AsciiString(" (peak: ") + Standard_Integer (ValueMiB (MemWorkingSetPeak)) + " MiB)"; } anInfo += "\n"; } - if (myCounters[MemSwapUsage] != Standard_Size(-1)) + if (hasValue (MemSwapUsage)) { anInfo += TCollection_AsciiString(" Pagefile usage: ") + Standard_Integer (ValueMiB (MemSwapUsage)) + " MiB"; - if (myCounters[MemSwapUsagePeak] != Standard_Size(-1)) + if (hasValue (MemSwapUsagePeak)) { anInfo += TCollection_AsciiString(" (peak: ") + Standard_Integer (ValueMiB (MemSwapUsagePeak)) + " MiB)"; } anInfo += "\n"; } - if (myCounters[MemVirtual] != Standard_Size(-1)) + if (hasValue (MemVirtual)) { anInfo += TCollection_AsciiString(" Virtual memory: ") + Standard_Integer (ValueMiB (MemVirtual)) + " MiB\n"; } - if (myCounters[MemHeapUsage] != Standard_Size(-1)) + if (hasValue (MemHeapUsage)) { anInfo += TCollection_AsciiString(" Heap memory: ") + Standard_Integer (ValueMiB (MemHeapUsage)) + " MiB\n"; } @@ -232,7 +315,7 @@ // ======================================================================= Standard_Size OSD_MemInfo::Value (const OSD_MemInfo::Counter theCounter) const { - if (theCounter < 0 || theCounter >= MemCounter_NB) + if (theCounter < 0 || theCounter >= MemCounter_NB || !IsActive (theCounter)) { return Standard_Size(-1); } @@ -245,7 +328,7 @@ // ======================================================================= Standard_Size OSD_MemInfo::ValueMiB (const OSD_MemInfo::Counter theCounter) const { - if (theCounter < 0 || theCounter >= MemCounter_NB) + if (theCounter < 0 || theCounter >= MemCounter_NB || !IsActive (theCounter)) { return Standard_Size(-1); } @@ -259,7 +342,7 @@ // ======================================================================= Standard_Real OSD_MemInfo::ValuePreciseMiB (const OSD_MemInfo::Counter theCounter) const { - if (theCounter < 0 || theCounter >= MemCounter_NB) + if (theCounter < 0 || theCounter >= MemCounter_NB || !IsActive (theCounter)) { return -1.0; } diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_MemInfo.hxx opencascade-7.5.1+dfsg1/src/OSD/OSD_MemInfo.hxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_MemInfo.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_MemInfo.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ #ifndef _OSD_MemInfo_H__ #define _OSD_MemInfo_H__ +#include #include //! This class provide information about memory utilized by current process. @@ -65,9 +66,21 @@ public: - //! Create and initialize + //! Create and initialize. By default all countes are active Standard_EXPORT OSD_MemInfo (const Standard_Boolean theImmediateUpdate = Standard_True); + //! Return true if the counter is active + Standard_Boolean IsActive (const OSD_MemInfo::Counter theCounter) const { return myActiveCounters[theCounter]; } + + //! Set all counters active. The information is collected for active counters. + //! @param theActive state for counters + Standard_EXPORT void SetActive (const Standard_Boolean theActive); + + //! Set the counter active. The information is collected for active counters. + //! @param theCounter type of counter + //! @param theActive state for the counter + void SetActive (const OSD_MemInfo::Counter theCounter, const Standard_Boolean theActive) { myActiveCounters[theCounter] = theActive; } + //! Clear counters Standard_EXPORT void Clear(); @@ -97,9 +110,16 @@ //! Return the string representation for all available counter. Standard_EXPORT static TCollection_AsciiString PrintInfo(); +protected: + + //! Return true if the counter is active and the value is valid + Standard_Boolean hasValue (const OSD_MemInfo::Counter theCounter) const + { return IsActive (theCounter) && myCounters[theCounter] != Standard_Size(-1); } + private: Standard_Size myCounters[MemCounter_NB]; //!< Counters' values, in bytes + Standard_Boolean myActiveCounters[MemCounter_NB]; //!< container of active state for a counter }; diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_Parallel.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_Parallel.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_Parallel.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_Parallel.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,6 +31,8 @@ #endif #endif +#include + namespace { #if defined(_WIN32) && !defined(OCCT_UWP) @@ -138,7 +140,7 @@ return aCpuMask; } - // if we're not at the end of the item, expect a dash and and integer; extract end value. + // if we're not at the end of the item, expect a dash and integer; extract end value. int anIndexUpper = anIndexLower; if (aCharIter < aChunkEnd && *aCharIter == '-') { diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_Parallel_TBB.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_Parallel_TBB.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_Parallel_TBB.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_Parallel_TBB.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,10 +21,12 @@ #include #include +Standard_DISABLE_DEPRECATION_WARNINGS #include #include #include #include +Standard_ENABLE_DEPRECATION_WARNINGS //======================================================================= //function : forEachExternal diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_Path.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_Path.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_Path.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_Path.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,6 +39,8 @@ return OSD_VMS; #elif defined(__linux__) || defined(__linux) return OSD_LinuxREDHAT; +#elif defined(__EMSCRIPTEN__) + return OSD_LinuxREDHAT; #elif defined(_AIX) || defined(AIX) return OSD_Aix; #else @@ -880,8 +882,9 @@ static void __fastcall _test_raise ( OSD_SysType, Standard_CString ); static void __fastcall _remove_dup ( TCollection_AsciiString& ); -OSD_Path :: OSD_Path () { - +OSD_Path :: OSD_Path () +: myUNCFlag(Standard_False), mySysDep(OSD_WindowsNT) +{ } // end constructor ( 1 ) OSD_Path :: OSD_Path ( @@ -1672,3 +1675,34 @@ theFileName.Clear(); } } + +// ======================================================================= +// function : FileNameAndExtension +// purpose : +// ======================================================================= +void OSD_Path::FileNameAndExtension (const TCollection_AsciiString& theFilePath, + TCollection_AsciiString& theName, + TCollection_AsciiString& theExtension) +{ + const Standard_Integer THE_EXT_MAX_LEN = 20; // this method is supposed to be used with normal extension + const Standard_Integer aLen = theFilePath.Length(); + for (Standard_Integer anExtLen = 1; anExtLen < aLen && anExtLen < THE_EXT_MAX_LEN; ++anExtLen) + { + if (theFilePath.Value (aLen - anExtLen) == '.') + { + const Standard_Integer aNameUpper = aLen - anExtLen - 1; + if (aNameUpper < 1) + { + break; + } + + theName = theFilePath.SubString (1, aNameUpper); + theExtension = theFilePath.SubString (aLen - anExtLen + 1, aLen); + theExtension.LowerCase(); + return; + } + } + + theName = theFilePath; + theExtension.Clear(); +} diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_Path.hxx opencascade-7.5.1+dfsg1/src/OSD/OSD_Path.hxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_Path.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_Path.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -215,6 +215,18 @@ TCollection_AsciiString& theFolder, TCollection_AsciiString& theFileName); + //! Return file extension from the name in lower case. + //! Extension is expected to be within 20-symbols length, and determined as file name tail after last dot. + //! Example: IN theFilePath ='Image.sbs.JPG' + //! OUT theName ='Image.sbs' + //! OUT theFileName ='jpg' + //! @param theFilePath [in] file path + //! @param theName [out] file name without extension + //! @param theExtension [out] file extension in lower case and without dot + Standard_EXPORT static void FileNameAndExtension (const TCollection_AsciiString& theFilePath, + TCollection_AsciiString& theName, + TCollection_AsciiString& theExtension); + //! Detect absolute DOS-path also used in Windows. //! The total path length is limited to 256 characters. //! Sample path: @@ -228,7 +240,10 @@ //! \\?\D:\very long path //! File I/O functions in the Windows API convert "/" to "\" as part of converting the name to an NT-style name, except when using the "\\?\" prefix. //! @return true if extended-length NT path syntax detected. - static Standard_Boolean IsNtExtendedPath (const char* thePath) { return ::memcmp (thePath, "\\\\?\\", 4) == 0; } + static Standard_Boolean IsNtExtendedPath (const char* thePath) + { + return ::strncmp (thePath, "\\\\?\\", 4) == 0; + } //! UNC is a naming convention used primarily to specify and map network drives in Microsoft Windows. //! Sample path: @@ -236,31 +251,40 @@ //! @return true if UNC path syntax detected. static Standard_Boolean IsUncPath (const char* thePath) { - if (::memcmp (thePath, "\\\\", 2) == 0) + if (::strncmp (thePath, "\\\\", 2) == 0) { return thePath[2] != '?' || IsUncExtendedPath (thePath); } - return ::memcmp (thePath, "//", 2) == 0; + return ::strncmp (thePath, "//", 2) == 0; } //! Detect extended-length UNC path. //! Sample path: //! \\?\UNC\server\share //! @return true if extended-length UNC path syntax detected. - static Standard_Boolean IsUncExtendedPath (const char* thePath) { return ::memcmp (thePath, "\\\\?\\UNC\\", 8) == 0; } + static Standard_Boolean IsUncExtendedPath (const char* thePath) + { + return ::strncmp (thePath, "\\\\?\\UNC\\", 8) == 0; + } //! Detect absolute UNIX-path. //! Sample path: //! /media/cdrom/file //! @return true if UNIX path syntax detected. - static Standard_Boolean IsUnixPath (const char* thePath) { return thePath[0] == '/' && thePath[1] != '/'; } + static Standard_Boolean IsUnixPath (const char* thePath) + { + return thePath[0] == '/' && thePath[1] != '/'; + } //! Detect special URLs on Android platform. //! Sample path: //! content://filename //! @return true if content path syntax detected - static Standard_Boolean IsContentProtocolPath (const char* thePath) { return ::memcmp (thePath, "content://", 10) == 0; } + static Standard_Boolean IsContentProtocolPath (const char* thePath) + { + return ::strncmp (thePath, "content://", 10) == 0; + } //! Detect remote protocol path (http / ftp / ...). //! Actually shouldn't be remote... diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_Process.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_Process.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_Process.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_Process.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -187,7 +187,7 @@ //------------------- WNT Sources of OSD_Path --------------------------- //------------------------------------------------------------------------ -void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... ); +void _osd_wnt_set_error ( OSD_Error&, Standard_Integer, ... ); // ======================================================================= // function : OSD_Process diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_SharedLibrary.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_SharedLibrary.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_SharedLibrary.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_SharedLibrary.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -189,6 +189,8 @@ #include #include +#include + static DWORD lastDLLError; static wchar_t errMsg[1024]; diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_signal.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_signal.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_signal.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_signal.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,8 @@ #include #include +#include + static OSD_SignalMode OSD_WasSetSignal = OSD_SignalMode_AsIs; //======================================================================= @@ -703,7 +705,7 @@ #include -#if !defined(__ANDROID__) && !defined(__QNX__) +#if !defined(__ANDROID__) && !defined(__QNX__) && !defined(__EMSCRIPTEN__) #include #endif @@ -1025,7 +1027,9 @@ } if (theSignalMode == OSD_SignalMode_SetUnhandled && retcode == 0 && anActOld.sa_handler != SIG_DFL) { - retcode = sigaction (aSignalTypes[i], &anActOld, &anActOld); + struct sigaction anActOld2; + sigemptyset(&anActOld2.sa_mask); + retcode = sigaction (aSignalTypes[i], &anActOld, &anActOld2); } Standard_ASSERT(retcode == 0, "sigaction() failed", std::cout << "OSD::SetSignal(): sigaction() failed for " << aSignalTypes[i] << std::endl); } diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_Timer.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_Timer.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_Timer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_Timer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -52,10 +52,10 @@ LARGE_INTEGER time; return isOk && QueryPerformanceCounter (&time) ? (Standard_Real)time.QuadPart / (Standard_Real)freq.QuadPart : -#ifndef OCCT_UWP - 0.001 * GetTickCount(); -#else +#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) 0.001 * GetTickCount64(); +#else + 0.001 * GetTickCount(); #endif } diff -Nru opencascade-7.4.1+dfsg1/src/OSD/OSD_WNT.cxx opencascade-7.5.1+dfsg1/src/OSD/OSD_WNT.cxx --- opencascade-7.4.1+dfsg1/src/OSD/OSD_WNT.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/OSD/OSD_WNT.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -699,12 +699,13 @@ if (retVal || (!retVal && GetLastError() == ERROR_ALREADY_EXISTS)) { size_t anOldDirLength; - StringCchLengthW (oldDir, sizeof(oldDir) / sizeof(oldDir[0]), &anOldDirLength); + StringCchLengthW (oldDir, MAX_PATH, &anOldDirLength); + const size_t aNameLength = anOldDirLength + WILD_CARD_LEN + sizeof (L'\x00'); if ((pFD = (WIN32_FIND_DATAW* )HeapAlloc (hHeap, 0, sizeof(WIN32_FIND_DATAW))) != NULL - && (pName = (wchar_t* )HeapAlloc (hHeap, 0, anOldDirLength + WILD_CARD_LEN + sizeof(L'\x00'))) != NULL) + && (pName = (wchar_t* )HeapAlloc (hHeap, 0, aNameLength)) != NULL) { - StringCchCopyW (pName, sizeof(pName) / sizeof(pName[0]), oldDir); - StringCchCatW (pName, sizeof(pName), WILD_CARD); + StringCchCopyW (pName, aNameLength, oldDir); + StringCchCatW (pName, aNameLength, WILD_CARD); retVal = TRUE; hFindFile = FindFirstFileExW (pName, FindExInfoStandard, pFD, FindExSearchNameMatch, NULL, 0); for (BOOL fFind = hFindFile != INVALID_HANDLE_VALUE; fFind; fFind = FindNextFileW (hFindFile, pFD)) @@ -715,23 +716,24 @@ continue; } - size_t anOldDirLength2 = 0, aNewDirLength = 0, aFileNameLength = 0; - StringCchLengthW (oldDir, sizeof(oldDir) / sizeof(oldDir[0]), &anOldDirLength2); - StringCchLengthW (newDir, sizeof(newDir) / sizeof(newDir[0]), &aNewDirLength); + size_t aNewDirLength = 0, aFileNameLength = 0; + StringCchLengthW (newDir, MAX_PATH, &aNewDirLength); StringCchLengthW (pFD->cFileName, sizeof(pFD->cFileName) / sizeof(pFD->cFileName[0]), &aFileNameLength); - if ((pFullNameSrc = (wchar_t* )HeapAlloc (hHeap, 0, anOldDirLength2 + aFileNameLength + sizeof(L'/') + sizeof(L'\x00'))) == NULL - || (pFullNameDst = (wchar_t* )HeapAlloc (hHeap, 0, aNewDirLength + aFileNameLength + sizeof(L'/') + sizeof(L'\x00'))) == NULL) + const size_t aFullNameSrcLength = anOldDirLength + aFileNameLength + sizeof (L'/') + sizeof (L'\x00'); + const size_t aFullNameDstLength = aNewDirLength + aFileNameLength + sizeof (L'/') + sizeof (L'\x00'); + if ((pFullNameSrc = (wchar_t* )HeapAlloc (hHeap, 0, aFullNameSrcLength)) == NULL + || (pFullNameDst = (wchar_t* )HeapAlloc (hHeap, 0, aFullNameDstLength)) == NULL) { break; } - StringCchCopyW (pFullNameSrc, sizeof(pFullNameSrc) / sizeof(pFullNameSrc[0]), oldDir); - StringCchCatW (pFullNameSrc, sizeof(pFullNameSrc) / sizeof(pFullNameSrc[0]), L"/"); - StringCchCatW (pFullNameSrc, sizeof(pFullNameSrc) / sizeof(pFullNameSrc[0]), pFD->cFileName); - - StringCchCopyW (pFullNameDst, sizeof(pFullNameDst) / sizeof(pFullNameDst[0]), newDir); - StringCchCatW (pFullNameDst, sizeof(pFullNameDst) / sizeof(pFullNameDst[0]), L"/"); - StringCchCatW (pFullNameDst, sizeof(pFullNameDst) / sizeof(pFullNameDst[0]), pFD->cFileName); + StringCchCopyW (pFullNameSrc, aFullNameSrcLength, oldDir); + StringCchCatW (pFullNameSrc, aFullNameSrcLength, L"/"); + StringCchCatW (pFullNameSrc, aFullNameSrcLength, pFD->cFileName); + + StringCchCopyW (pFullNameDst, aFullNameDstLength, newDir); + StringCchCatW (pFullNameDst, aFullNameDstLength, L"/"); + StringCchCatW (pFullNameDst, aFullNameDstLength, pFD->cFileName); if ((pFD->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { @@ -853,12 +855,13 @@ if (retVal || (!retVal && GetLastError() == ERROR_ALREADY_EXISTS)) { size_t aDirSrcLength = 0; - StringCchLengthW (dirSrc, sizeof(dirSrc) / sizeof(dirSrc[0]), &aDirSrcLength); + StringCchLengthW (dirSrc, MAX_PATH, &aDirSrcLength); + const size_t aNameLength = aDirSrcLength + WILD_CARD_LEN + sizeof (L'\x00'); if ((pFD = (WIN32_FIND_DATAW* )HeapAlloc (hHeap, 0, sizeof(WIN32_FIND_DATAW))) != NULL - && (pName = (wchar_t* )HeapAlloc (hHeap, 0, aDirSrcLength + WILD_CARD_LEN + sizeof(L'\x00'))) != NULL) + && (pName = (wchar_t* )HeapAlloc (hHeap, 0, aNameLength)) != NULL) { - StringCchCopyW(pName, sizeof(pName) / sizeof(pName[0]), dirSrc); - StringCchCatW (pName, sizeof(pName) / sizeof(pName[0]), WILD_CARD); + StringCchCopyW(pName, aNameLength, dirSrc); + StringCchCatW (pName, aNameLength, WILD_CARD); retVal = TRUE; hFindFile = FindFirstFileExW (pName, FindExInfoStandard, pFD, FindExSearchNameMatch, NULL, 0); @@ -870,23 +873,24 @@ continue; } - size_t aDirSrcLength2 = 0, aDirDstLength = 0, aFileNameLength = 0; - StringCchLengthW (dirSrc, sizeof(dirSrc) / sizeof(dirSrc[0]), &aDirSrcLength2); - StringCchLengthW (dirDst, sizeof(dirDst) / sizeof(dirDst[0]), &aDirDstLength); + size_t aDirDstLength = 0, aFileNameLength = 0; + StringCchLengthW (dirDst, MAX_PATH, &aDirDstLength); StringCchLengthW (pFD->cFileName, sizeof(pFD->cFileName) / sizeof(pFD->cFileName[0]), &aFileNameLength); - if ((pFullNameSrc = (wchar_t* )HeapAlloc (hHeap, 0, aDirSrcLength2 + aFileNameLength + sizeof(L'/') + sizeof(L'\x00'))) == NULL - || (pFullNameDst = (wchar_t* )HeapAlloc (hHeap, 0, aDirDstLength + aFileNameLength + sizeof(L'/') + sizeof(L'\x00'))) == NULL) + const size_t aFullNameSrcLength = aDirSrcLength + aFileNameLength + sizeof (L'/') + sizeof (L'\x00'); + const size_t aFullNameDstLength = aDirDstLength + aFileNameLength + sizeof (L'/') + sizeof (L'\x00'); + if ((pFullNameSrc = (wchar_t* )HeapAlloc (hHeap, 0, aFullNameSrcLength)) == NULL + || (pFullNameDst = (wchar_t* )HeapAlloc (hHeap, 0, aFullNameDstLength)) == NULL) { break; } - StringCchCopyW (pFullNameSrc, sizeof(pFullNameSrc) / sizeof(pFullNameSrc[0]), dirSrc); - StringCchCatW (pFullNameSrc, sizeof(pFullNameSrc) / sizeof(pFullNameSrc[0]), L"/"); - StringCchCatW (pFullNameSrc, sizeof(pFullNameSrc) / sizeof(pFullNameSrc[0]), pFD->cFileName); - - StringCchCopyW (pFullNameDst, sizeof(pFullNameDst) / sizeof(pFullNameDst[0]), dirDst); - StringCchCatW (pFullNameDst, sizeof(pFullNameDst) / sizeof(pFullNameDst[0]), L"/"); - StringCchCatW (pFullNameDst, sizeof(pFullNameDst) / sizeof(pFullNameDst[0]), pFD->cFileName); + StringCchCopyW (pFullNameSrc, aFullNameSrcLength, dirSrc); + StringCchCatW (pFullNameSrc, aFullNameSrcLength, L"/"); + StringCchCatW (pFullNameSrc, aFullNameSrcLength, pFD->cFileName); + + StringCchCopyW (pFullNameDst, aFullNameDstLength, dirDst); + StringCchCatW (pFullNameDst, aFullNameDstLength, L"/"); + StringCchCatW (pFullNameDst, aFullNameDstLength, pFD->cFileName); if ((pFD->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { retVal = CopyDirectory (pFullNameSrc, pFullNameDst); diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_BaseDriverPointer.hxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_BaseDriverPointer.hxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_BaseDriverPointer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_BaseDriverPointer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,8 @@ #define _PCDM_BaseDriverPointer_HeaderFile class Storage_BaseDriver; -typedef Storage_BaseDriver* PCDM_BaseDriverPointer; + +Standard_DEPRECATED("Typedef PCDM_BaseDriverPointer is kept for compatibility only, instead consider using Handle(Storage_BaseDriver) explicitly") +typedef Handle(Storage_BaseDriver) PCDM_BaseDriverPointer; #endif // _PCDM_BaseDriverPointer_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM.cxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM.cxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,7 +37,8 @@ //purpose : //======================================================================= -PCDM_TypeOfFileDriver PCDM::FileDriverType(const TCollection_AsciiString& aFileName, PCDM_BaseDriverPointer& aBaseDriver) { +PCDM_TypeOfFileDriver PCDM::FileDriverType(const TCollection_AsciiString& aFileName, Handle(Storage_BaseDriver)& aBaseDriver) +{ if(FSD_CmpFile::IsGoodFileType(aFileName) == Storage_VSOk) { aBaseDriver=new FSD_CmpFile; return PCDM_TOFD_CmpFile; @@ -61,7 +62,7 @@ //purpose : //======================================================================= -PCDM_TypeOfFileDriver PCDM::FileDriverType (Standard_IStream& theIStream, PCDM_BaseDriverPointer& theBaseDriver) +PCDM_TypeOfFileDriver PCDM::FileDriverType (Standard_IStream& theIStream, Handle(Storage_BaseDriver)& theBaseDriver) { TCollection_AsciiString aReadMagicNumber; diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM.hxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM.hxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,26 +17,21 @@ #ifndef _PCDM_HeaderFile #define _PCDM_HeaderFile -#include -#include -#include - -#include - -#include +#include #include -#include + class CDM_Document; class PCDM_StorageDriver; class TCollection_AsciiString; - class PCDM { public: - Standard_EXPORT static PCDM_TypeOfFileDriver FileDriverType (const TCollection_AsciiString& aFileName, PCDM_BaseDriverPointer& aBaseDriver); + Standard_EXPORT static PCDM_TypeOfFileDriver FileDriverType (const TCollection_AsciiString& aFileName, + Handle(Storage_BaseDriver)& aBaseDriver); - Standard_EXPORT static PCDM_TypeOfFileDriver FileDriverType (Standard_IStream& theIStream, PCDM_BaseDriverPointer& theBaseDriver); + Standard_EXPORT static PCDM_TypeOfFileDriver FileDriverType (Standard_IStream& theIStream, + Handle(Storage_BaseDriver)& theBaseDriver); DEFINE_STANDARD_ALLOC }; diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_Reader.hxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_Reader.hxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_Reader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_Reader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,7 @@ #include #include #include +#include class PCDM_DriverError; class CDM_Document; @@ -45,12 +46,16 @@ Standard_EXPORT virtual Handle(CDM_Document) CreateDocument() = 0; //! retrieves the content of the file into a new Document. - Standard_EXPORT virtual void Read (const TCollection_ExtendedString& aFileName, const Handle(CDM_Document)& aNewDocument, const Handle(CDM_Application)& anApplication) = 0; + Standard_EXPORT virtual void Read (const TCollection_ExtendedString& aFileName, + const Handle(CDM_Document)& aNewDocument, + const Handle(CDM_Application)& anApplication, + const Message_ProgressRange& theProgress = Message_ProgressRange()) = 0; Standard_EXPORT virtual void Read (Standard_IStream& theIStream, - const Handle(Storage_Data)& theStorageData, - const Handle(CDM_Document)& theDoc, - const Handle(CDM_Application)& theApplication) = 0; + const Handle(Storage_Data)& theStorageData, + const Handle(CDM_Document)& theDoc, + const Handle(CDM_Application)& theApplication, + const Message_ProgressRange& theProgress = Message_ProgressRange()) = 0; PCDM_ReaderStatus GetStatus() const; diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReaderStatus.hxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReaderStatus.hxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReaderStatus.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReaderStatus.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,7 +41,8 @@ PCDM_RS_UnknownDocument, PCDM_RS_WrongResource, PCDM_RS_ReaderException, -PCDM_RS_NoModel +PCDM_RS_NoModel, +PCDM_RS_UserBreak }; #endif // _PCDM_ReaderStatus_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReadWriter_1.cxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReadWriter_1.cxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReadWriter_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReadWriter_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -226,26 +226,22 @@ Standard_Integer PCDM_ReadWriter_1::ReadReferenceCounter(const TCollection_ExtendedString& aFileName, const Handle(Message_Messenger)& theMsgDriver) const { - static Standard_Integer theReferencesCounter ; - theReferencesCounter=0; - static Standard_Integer i ; - - PCDM_BaseDriverPointer theFileDriver; + Standard_Integer theReferencesCounter(0) ; + Standard_Integer i ; + Handle(Storage_BaseDriver) theFileDriver; TCollection_AsciiString aFileNameU(aFileName); if(PCDM::FileDriverType(aFileNameU, theFileDriver) == PCDM_TOFD_Unknown) return theReferencesCounter; - static Standard_Boolean theFileIsOpen ; - theFileIsOpen=Standard_False; - + Standard_Boolean theFileIsOpen(Standard_False); try { OCC_CATCH_SIGNALS - PCDM_ReadWriter::Open(*theFileDriver,aFileName,Storage_VSRead); + PCDM_ReadWriter::Open(theFileDriver,aFileName,Storage_VSRead); theFileIsOpen=Standard_True; Handle(Storage_Schema) s = new Storage_Schema; Storage_HeaderData hd; - hd.Read (*theFileDriver); + hd.Read (theFileDriver); const TColStd_SequenceOfAsciiString &refUserInfo = hd.UserInfo(); for ( i =1; i<= refUserInfo.Length() ; i++) { @@ -264,9 +260,11 @@ } catch (Standard_Failure const&) {} - if(theFileIsOpen) theFileDriver->Close(); + if(theFileIsOpen) + { + theFileDriver->Close(); + } - delete theFileDriver; return theReferencesCounter; } @@ -338,18 +336,18 @@ const TCollection_AsciiString& Start, const TCollection_AsciiString& End, TColStd_SequenceOfExtendedString& theUserInfo, - const Handle(Message_Messenger)&) { - - static Standard_Integer i ; - PCDM_BaseDriverPointer theFileDriver; + const Handle(Message_Messenger)&) +{ + Standard_Integer i ; + Handle(Storage_BaseDriver) theFileDriver; TCollection_AsciiString aFileNameU(aFileName); if(PCDM::FileDriverType(aFileNameU, theFileDriver) == PCDM_TOFD_Unknown) return; - PCDM_ReadWriter::Open(*theFileDriver,aFileName,Storage_VSRead); + PCDM_ReadWriter::Open(theFileDriver,aFileName,Storage_VSRead); Handle(Storage_Schema) s = new Storage_Schema; Storage_HeaderData hd; - hd.Read (*theFileDriver); + hd.Read (theFileDriver); const TColStd_SequenceOfAsciiString &refUserInfo = hd.UserInfo(); Standard_Integer debut=0,fin=0; @@ -366,7 +364,6 @@ } } theFileDriver->Close(); - delete theFileDriver; } //======================================================================= @@ -376,27 +373,24 @@ Standard_Integer PCDM_ReadWriter_1::ReadDocumentVersion(const TCollection_ExtendedString& aFileName, const Handle(Message_Messenger)& theMsgDriver) const { - static Standard_Integer theVersion ; - theVersion=-1; - - PCDM_BaseDriverPointer theFileDriver; + Standard_Integer theVersion(-1); + Handle(Storage_BaseDriver) theFileDriver; TCollection_AsciiString aFileNameU(aFileName); if(PCDM::FileDriverType(aFileNameU, theFileDriver) == PCDM_TOFD_Unknown) return theVersion; - static Standard_Boolean theFileIsOpen ; - theFileIsOpen =Standard_False; + Standard_Boolean theFileIsOpen(Standard_False); try { OCC_CATCH_SIGNALS - PCDM_ReadWriter::Open(*theFileDriver,aFileName,Storage_VSRead); + PCDM_ReadWriter::Open(theFileDriver,aFileName,Storage_VSRead); theFileIsOpen=Standard_True; Handle(Storage_Schema) s = new Storage_Schema; Storage_HeaderData hd; - hd.Read (*theFileDriver); + hd.Read (theFileDriver); const TColStd_SequenceOfAsciiString &refUserInfo = hd.UserInfo(); - static Standard_Integer i ; + Standard_Integer i ; for ( i =1; i<= refUserInfo.Length() ; i++) { if(refUserInfo(i).Search(MODIFICATION_COUNTER) != -1) { try { OCC_CATCH_SIGNALS theVersion=refUserInfo(i).Token(" ",2).IntegerValue();} @@ -414,7 +408,10 @@ catch (Standard_Failure const&) {} - if(theFileIsOpen) theFileDriver->Close(); - delete theFileDriver; + if(theFileIsOpen) + { + theFileDriver->Close(); + } + return theVersion; } diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReadWriter.cxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReadWriter.cxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReadWriter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReadWriter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,7 +45,7 @@ //purpose : //======================================================================= -void PCDM_ReadWriter::Open (Storage_BaseDriver& aDriver, +void PCDM_ReadWriter::Open (const Handle(Storage_BaseDriver)& aDriver, const TCollection_ExtendedString& aFileName, const Storage_OpenMode aMode) { @@ -74,8 +74,7 @@ Handle(PCDM_ReadWriter) PCDM_ReadWriter::Reader (const TCollection_ExtendedString&) { - static Handle(PCDM_ReadWriter_1) theReader=new PCDM_ReadWriter_1; - return theReader; + return (new PCDM_ReadWriter_1); } //======================================================================= @@ -85,8 +84,7 @@ Handle(PCDM_ReadWriter) PCDM_ReadWriter::Writer () { - static Handle(PCDM_ReadWriter_1) theWriter=new PCDM_ReadWriter_1; - return theWriter; + return (new PCDM_ReadWriter_1); } //======================================================================= @@ -113,23 +111,21 @@ { TCollection_ExtendedString theFormat; - PCDM_BaseDriverPointer theFileDriver; + Handle(Storage_BaseDriver) theFileDriver; // conversion to UTF-8 is done inside TCollection_AsciiString theFileName (aFileName); if (PCDM::FileDriverType (theFileName, theFileDriver) == PCDM_TOFD_Unknown) return ::TryXmlDriverType (theFileName); - static Standard_Boolean theFileIsOpen; - theFileIsOpen=Standard_False; - + Standard_Boolean theFileIsOpen(Standard_False); try { OCC_CATCH_SIGNALS - Open(*theFileDriver,aFileName,Storage_VSRead); + Open(theFileDriver,aFileName,Storage_VSRead); theFileIsOpen=Standard_True; Storage_HeaderData hd; - hd.Read (*theFileDriver); + hd.Read (theFileDriver); const TColStd_SequenceOfAsciiString &refUserInfo = hd.UserInfo(); Standard_Boolean found=Standard_False; for (Standard_Integer i =1; !found && i<= refUserInfo.Length() ; i++) { @@ -142,16 +138,16 @@ if (!found) { Storage_TypeData td; - td.Read (*theFileDriver); + td.Read (theFileDriver); theFormat = td.Types()->Value(1); } } catch (Standard_Failure const&) {} - - if(theFileIsOpen)theFileDriver->Close(); - - delete theFileDriver; + if(theFileIsOpen) + { + theFileDriver->Close(); + } return theFormat; } @@ -165,7 +161,7 @@ { TCollection_ExtendedString aFormat; - Storage_BaseDriver* aFileDriver = 0L; + Handle(Storage_BaseDriver) aFileDriver; if (PCDM::FileDriverType (theIStream, aFileDriver) == PCDM_TOFD_XmlFile) { return ::TryXmlDriverType (theIStream); diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReadWriter.hxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReadWriter.hxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReadWriter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReadWriter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -62,7 +62,9 @@ Standard_EXPORT virtual Standard_Integer ReadDocumentVersion (const TCollection_ExtendedString& aFileName, const Handle(Message_Messenger)& theMsgDriver) const = 0; - Standard_EXPORT static void Open (Storage_BaseDriver& aDriver, const TCollection_ExtendedString& aFileName, const Storage_OpenMode anOpenMode); + Standard_EXPORT static void Open (const Handle(Storage_BaseDriver)& aDriver, + const TCollection_ExtendedString& aFileName, + const Storage_OpenMode anOpenMode); //! returns the convenient Reader for a File. Standard_EXPORT static Handle(PCDM_ReadWriter) Reader (const TCollection_ExtendedString& aFileName); diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_Reference.cxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_Reference.cxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_Reference.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_Reference.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,7 +18,12 @@ #include #include -PCDM_Reference::PCDM_Reference(){} +PCDM_Reference::PCDM_Reference() +: myReferenceIdentifier(0), + myDocumentVersion(0) +{ +} + PCDM_Reference::PCDM_Reference(const Standard_Integer aReferenceIdentifier, const TCollection_ExtendedString& aFileName, const Standard_Integer aDocumentVersion):myReferenceIdentifier(aReferenceIdentifier),myFileName(aFileName),myDocumentVersion(aDocumentVersion) {} diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReferenceIterator.cxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReferenceIterator.cxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReferenceIterator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReferenceIterator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -53,9 +53,10 @@ const Handle(CDM_MetaData)& aMetaData, const Handle(CDM_Application)& anApplication, const Standard_Boolean UseStorageConfiguration) { - for (Init(aMetaData);More();Next()) { - aDocument->CreateReference(MetaData(UseStorageConfiguration),ReferenceIdentifier(), - anApplication,DocumentVersion(),UseStorageConfiguration); + for (Init(aMetaData);More();Next()) + { + aDocument->CreateReference(MetaData(anApplication->MetaDataLookUpTable(),UseStorageConfiguration), + ReferenceIdentifier(),anApplication,DocumentVersion(),UseStorageConfiguration); } } @@ -96,7 +97,9 @@ //purpose : //======================================================================= -Handle(CDM_MetaData) PCDM_ReferenceIterator::MetaData(const Standard_Boolean ) const { +Handle(CDM_MetaData) PCDM_ReferenceIterator::MetaData(CDM_MetaDataLookUpTable& theLookUpTable, + const Standard_Boolean ) const +{ TCollection_ExtendedString theFolder,theName; TCollection_ExtendedString theFile=myReferences(myIterator).FileName(); @@ -140,8 +143,9 @@ theName = UTL::Name(p); theName+= UTL::Extension(p); #endif // _WIN32 - return CDM_MetaData::LookUp(theFolder,theName,theFile,theFile,UTL::IsReadOnly(theFile)); + return CDM_MetaData::LookUp(theLookUpTable, theFolder, theName, theFile, theFile, UTL::IsReadOnly(theFile)); } + //======================================================================= //function : ReferenceIdentifier //purpose : diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReferenceIterator.hxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReferenceIterator.hxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_ReferenceIterator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_ReferenceIterator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,15 +21,13 @@ #include #include -#include -#include -#include +#include + class Message_Messenger; class CDM_Document; class CDM_MetaData; class CDM_Application; - class PCDM_ReferenceIterator; DEFINE_STANDARD_HANDLE(PCDM_ReferenceIterator, Standard_Transient) @@ -64,18 +62,18 @@ Standard_EXPORT virtual void Next(); - Standard_EXPORT virtual Handle(CDM_MetaData) MetaData (const Standard_Boolean UseStorageConfiguration) const; + Standard_EXPORT virtual Handle(CDM_MetaData) MetaData (CDM_MetaDataLookUpTable& theLookUpTable, + const Standard_Boolean UseStorageConfiguration) const; Standard_EXPORT virtual Standard_Integer ReferenceIdentifier() const; //! returns the version of the document in the reference Standard_EXPORT virtual Standard_Integer DocumentVersion() const; +private: PCDM_SequenceOfReference myReferences; Standard_Integer myIterator; Handle(Message_Messenger) myMessageDriver; - - }; diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_StorageDriver.cxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_StorageDriver.cxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_StorageDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_StorageDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,14 +42,15 @@ -void PCDM_StorageDriver::Write(const Handle(CDM_Document)& aDocument, const TCollection_ExtendedString& aFileName) +void PCDM_StorageDriver::Write (const Handle(CDM_Document)& aDocument, + const TCollection_ExtendedString& aFileName, + const Message_ProgressRange &/*theRange*/) { Handle(Storage_Schema) theSchema = new Storage_Schema; Handle(Storage_Data) theData = new Storage_Data; - static Standard_Boolean Failure; - Failure=Standard_False; + Standard_Boolean Failure(Standard_False); Standard_SStream aMsg; aMsg << "error during Make:"; PCDM_SequenceOfDocument thePersistentDocuments; { @@ -91,10 +92,10 @@ theData->AddToComments(aComments(i)); } - FSD_CmpFile theFile; + Handle(FSD_CmpFile) theFile = new FSD_CmpFile; PCDM_ReadWriter::Open(theFile,aFileName,Storage_VSWrite); theSchema->Write(theFile,theData); - theFile.Close(); + theFile->Close(); if ( theData->ErrorStatus() != Storage_VSOk ) throw PCDM_DriverError(theData->ErrorStatusExtension().ToCString()); @@ -105,7 +106,9 @@ //function : Write //purpose : //======================================================================= -void PCDM_StorageDriver::Write (const Handle(CDM_Document)& /*aDocument*/, Standard_OStream& /*theOStream*/) +void PCDM_StorageDriver::Write (const Handle(CDM_Document)& /*aDocument*/, + Standard_OStream& /*theOStream*/, + const Message_ProgressRange& /*theRange*/) { } diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_StorageDriver.hxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_StorageDriver.hxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_StorageDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_StorageDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,10 +70,14 @@ //! //! by default Write will use Make method to build a persistent //! document and the Schema method to write the persistent document. - Standard_EXPORT virtual void Write (const Handle(CDM_Document)& aDocument, const TCollection_ExtendedString& aFileName) Standard_OVERRIDE; + Standard_EXPORT virtual void Write (const Handle(CDM_Document)& aDocument, + const TCollection_ExtendedString& aFileName, + const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; //! Write to theOStream - Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, Standard_OStream& theOStream) Standard_OVERRIDE; + Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, + Standard_OStream& theOStream, + const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; Standard_EXPORT void SetFormat (const TCollection_ExtendedString& aformat); diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_StoreStatus.hxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_StoreStatus.hxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_StoreStatus.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_StoreStatus.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,7 +26,8 @@ PCDM_SS_Failure, PCDM_SS_Doc_IsNull, PCDM_SS_No_Obj, -PCDM_SS_Info_Section_Error +PCDM_SS_Info_Section_Error, +PCDM_SS_UserBreak }; #endif // _PCDM_StoreStatus_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PCDM/PCDM_Writer.hxx opencascade-7.5.1+dfsg1/src/PCDM/PCDM_Writer.hxx --- opencascade-7.4.1+dfsg1/src/PCDM/PCDM_Writer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PCDM/PCDM_Writer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,6 +21,9 @@ #include #include + +#include + class PCDM_DriverError; class CDM_Document; class TCollection_ExtendedString; @@ -32,35 +35,19 @@ class PCDM_Writer : public Standard_Transient { - public: - - Standard_EXPORT virtual void Write (const Handle(CDM_Document)& aDocument, const TCollection_ExtendedString& aFileName) = 0; + Standard_EXPORT virtual void Write (const Handle(CDM_Document)& aDocument, + const TCollection_ExtendedString& aFileName, + const Message_ProgressRange& theRange = Message_ProgressRange()) = 0; //! Write to theOStream - Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, Standard_OStream& theOStream) = 0; - - + Standard_EXPORT virtual void Write (const Handle(CDM_Document)& theDocument, + Standard_OStream& theOStream, + const Message_ProgressRange& theRange = Message_ProgressRange()) = 0; DEFINE_STANDARD_RTTIEXT(PCDM_Writer,Standard_Transient) -protected: - - - - -private: - - - - }; - - - - - - #endif // _PCDM_Writer_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Plate/Plate_Plate.cxx opencascade-7.5.1+dfsg1/src/Plate/Plate_Plate.cxx --- opencascade-7.4.1+dfsg1/src/Plate/Plate_Plate.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Plate/Plate_Plate.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,6 @@ #include #include #include -#include //======================================================================= //function : Plate_Plate @@ -47,6 +46,8 @@ L (0.0) { PolynomialPartOnly = Standard_False; + memset (ddu, 0, sizeof (ddu)); + memset (ddv, 0, sizeof (ddv)); } //======================================================================= @@ -243,8 +244,8 @@ //======================================================================= void Plate_Plate::SolveTI(const Standard_Integer ord, - const Standard_Real anisotropie, - const Handle(Message_ProgressIndicator) & aProgress) + const Standard_Real anisotropie, + const Message_ProgressRange& theProgress) { Standard_Integer IterationNumber=0; OK = Standard_False; @@ -275,12 +276,12 @@ if(myLScalarConstraints.IsEmpty()) { if(myLXYZConstraints.IsEmpty()) - SolveTI1(IterationNumber, aProgress); + SolveTI1(IterationNumber, theProgress); else - SolveTI2(IterationNumber, aProgress); + SolveTI2(IterationNumber, theProgress); } else - SolveTI3(IterationNumber, aProgress); + SolveTI3(IterationNumber, theProgress); } @@ -290,7 +291,8 @@ // only PinPointConstraints are loaded //======================================================================= -void Plate_Plate::SolveTI1(const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress) +void Plate_Plate::SolveTI1(const Standard_Integer IterationNumber, + const Message_ProgressRange& theProgress) { // computation of square matrix members @@ -343,9 +345,10 @@ Standard_Real pivot_max = 1.e-12; OK = Standard_True; - math_Gauss algo_gauss(mat,pivot_max, aProgress); + Message_ProgressScope aScope (theProgress, NULL, 10); + math_Gauss algo_gauss(mat,pivot_max, aScope.Next (7)); - if (!aProgress.IsNull() && aProgress->UserBreak()) + if (aScope.UserBreak()) { OK = Standard_False; return; @@ -357,7 +360,14 @@ mat(i,i) = 1.e-8; } pivot_max = 1.e-18; - math_Gauss thealgo(mat,pivot_max, aProgress); + + math_Gauss thealgo(mat,pivot_max, aScope.Next (3)); + + if (aScope.UserBreak()) + { + OK = Standard_False; + return; + } algo_gauss = thealgo; OK = algo_gauss.IsDone(); } @@ -401,7 +411,8 @@ // LinearXYZ constraints are provided but no LinearScalar one //======================================================================= -void Plate_Plate::SolveTI2(const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress) +void Plate_Plate::SolveTI2(const Standard_Integer IterationNumber, + const Message_ProgressRange& theProgress) { // computation of square matrix members @@ -448,9 +459,10 @@ Standard_Real pivot_max = 1.e-12; OK = Standard_True; // ************ JHH - math_Gauss algo_gauss(mat,pivot_max, aProgress); + Message_ProgressScope aScope (theProgress, NULL, 10); + math_Gauss algo_gauss(mat,pivot_max, aScope.Next (7)); - if (!aProgress.IsNull() && aProgress->UserBreak ()) + if (aScope.UserBreak()) { OK = Standard_False; return; @@ -461,8 +473,15 @@ mat(i,i) = 1.e-8; } pivot_max = 1.e-18; - math_Gauss thealgo1(mat,pivot_max, aProgress); - algo_gauss = thealgo1; + + math_Gauss thealgo1(mat,pivot_max, aScope.Next (3)); + + if (aScope.UserBreak()) + { + OK = Standard_False; + return; + } + algo_gauss = thealgo1; OK = algo_gauss.IsDone(); } @@ -532,7 +551,8 @@ //purpose : to solve the set of constraints in the most general situation //======================================================================= -void Plate_Plate::SolveTI3(const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress) +void Plate_Plate::SolveTI3(const Standard_Integer IterationNumber, + const Message_ProgressRange& theProgress) { // computation of square matrix members @@ -713,9 +733,10 @@ Standard_Real pivot_max = 1.e-12; OK = Standard_True; // ************ JHH - math_Gauss algo_gauss(mat,pivot_max, aProgress); + Message_ProgressScope aScope (theProgress, NULL, 10); + math_Gauss algo_gauss(mat,pivot_max, aScope.Next (7)); - if (!aProgress.IsNull() && aProgress->UserBreak ()) + if (aScope.UserBreak()) { OK = Standard_False; return; @@ -728,7 +749,14 @@ mat(2*n_dimsousmat+i,2*n_dimsousmat+i) = 1.e-8; } pivot_max = 1.e-18; - math_Gauss thealgo2(mat,pivot_max, aProgress); + + math_Gauss thealgo2(mat,pivot_max, aScope.Next (3)); + + if (aScope.UserBreak()) + { + OK = Standard_False; + return; + } algo_gauss = thealgo2; OK = algo_gauss.IsDone(); } diff -Nru opencascade-7.4.1+dfsg1/src/Plate/Plate_Plate.hxx opencascade-7.5.1+dfsg1/src/Plate/Plate_Plate.hxx --- opencascade-7.4.1+dfsg1/src/Plate/Plate_Plate.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Plate/Plate_Plate.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,6 +30,7 @@ #include #include #include +#include class Plate_PinpointConstraint; class Plate_LinearXYZConstraint; @@ -43,7 +44,6 @@ class gp_XYZ; class gp_XY; class math_Matrix; -class Message_ProgressIndicator; //! This class implement a variationnal spline algorithm able @@ -86,7 +86,7 @@ Standard_EXPORT void SolveTI (const Standard_Integer ord = 4, const Standard_Real anisotropie = 1.0, - const Handle(Message_ProgressIndicator) & aProgress = Handle(Message_ProgressIndicator)()); + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! returns True if all has been correctly done. Standard_EXPORT Standard_Boolean IsDone() const; @@ -139,11 +139,14 @@ gp_XY& Points (const Standard_Integer index) const; - Standard_EXPORT void SolveTI1 (const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress = NULL); + Standard_EXPORT void SolveTI1 (const Standard_Integer IterationNumber, + const Message_ProgressRange& theProgress = Message_ProgressRange()); - Standard_EXPORT void SolveTI2 (const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress = NULL); + Standard_EXPORT void SolveTI2 (const Standard_Integer IterationNumber, + const Message_ProgressRange& theProgress = Message_ProgressRange()); - Standard_EXPORT void SolveTI3 (const Standard_Integer IterationNumber, const Handle(Message_ProgressIndicator) & aProgress = NULL); + Standard_EXPORT void SolveTI3 (const Standard_Integer IterationNumber, + const Message_ProgressRange& theProgress = Message_ProgressRange()); Standard_EXPORT void fillXYZmatrix (math_Matrix& mat, const Standard_Integer i0, const Standard_Integer j0, const Standard_Integer ncc1, const Standard_Integer ncc2) const; diff -Nru opencascade-7.4.1+dfsg1/src/PLib/PLib.cxx opencascade-7.5.1+dfsg1/src/PLib/PLib.cxx --- opencascade-7.4.1+dfsg1/src/PLib/PLib.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PLib/PLib.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -452,7 +452,7 @@ RationalArray[Index] = PolesArray[OtherIndex]; Index++; OtherIndex++; } Index -= Dimension; - OtherIndex ++;; + ++OtherIndex; for (jj = ii - 1 ; jj >= 0 ; jj--) { Factor = binomial_array[jj] * PolesArray[(ii-jj) * Dimension1 + Dimension]; diff -Nru opencascade-7.4.1+dfsg1/src/Plugin/Plugin.cxx opencascade-7.5.1+dfsg1/src/Plugin/Plugin.cxx --- opencascade-7.4.1+dfsg1/src/Plugin/Plugin.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Plugin/Plugin.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ #include #include +#include + static Standard_Character tc[1000]; static Standard_PCharacter thePluginId = tc; diff -Nru opencascade-7.4.1+dfsg1/src/Poly/FILES opencascade-7.5.1+dfsg1/src/Poly/FILES --- opencascade-7.4.1+dfsg1/src/Poly/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -19,15 +19,10 @@ Poly_MakeLoops.hxx Poly_Polygon2D.cxx Poly_Polygon2D.hxx -Poly_Polygon2D.lxx Poly_Polygon3D.cxx Poly_Polygon3D.hxx -Poly_Polygon3D.lxx Poly_PolygonOnTriangulation.cxx Poly_PolygonOnTriangulation.hxx -Poly_PolygonOnTriangulation.lxx -Poly_Triangle.cxx Poly_Triangle.hxx -Poly_Triangle.lxx Poly_Triangulation.cxx Poly_Triangulation.hxx diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Connect.cxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Connect.cxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Connect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Connect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ #include +#include #include #include @@ -23,9 +24,9 @@ struct polyedge { polyedge* next; // the next edge in the list - Standard_Integer nd; // the second node of the edge Standard_Integer nt[2]; // the two adjacent triangles Standard_Integer nn[2]; // the two adjacent nodes + Standard_Integer nd; // the second node of the edge DEFINE_STANDARD_ALLOC }; @@ -97,6 +98,8 @@ // create an array to store the edges starting from the vertices NCollection_Array1 anEdges (1, aNbNodes); anEdges.Init (NULL); + // use incremental allocator for small allocations + Handle(NCollection_IncAllocator) anIncAlloc = new NCollection_IncAllocator(); // loop on the triangles NCollection_Vec3 aTriNodes; @@ -144,7 +147,7 @@ if (ced == NULL) { // create the edge if not found - ced = new polyedge(); + ced = (polyedge* )anIncAlloc->Allocate (sizeof(polyedge)); ced->next = anEdges[anEdgeNodes[0]]; anEdges[anEdgeNodes[0]] = ced; ced->nd = anEdgeNodes[1]; @@ -196,16 +199,16 @@ anAdjIndex += 3; } - // destroy the edges array - for (Standard_Integer aNodeIter = anEdges.Lower(); aNodeIter <= anEdges.Upper(); ++aNodeIter) + // destroy the edges array - can be skipped when using NCollection_IncAllocator + /*for (Standard_Integer aNodeIter = anEdges.Lower(); aNodeIter <= anEdges.Upper(); ++aNodeIter) { for (polyedge* anEdgeIter = anEdges[aNodeIter]; anEdgeIter != NULL;) { polyedge* aTmp = anEdgeIter->next; - delete anEdgeIter; + anIncAlloc->Free (anEdgeIter); anEdgeIter = aTmp; } - } + }*/ } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon2D.cxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon2D.cxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon2D.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon2D.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,17 +14,24 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - -#include #include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(Poly_Polygon2D,Standard_Transient) //======================================================================= //function : Poly_Polygon2D -//purpose : +//purpose : +//======================================================================= +Poly_Polygon2D::Poly_Polygon2D (const Standard_Integer theNbNodes) +: myDeflection (0.0), + myNodes (1, theNbNodes) +{ + // +} + +//======================================================================= +//function : Poly_Polygon2D +//purpose : //======================================================================= Poly_Polygon2D::Poly_Polygon2D(const TColgp_Array1OfPnt2d& Nodes): myDeflection(0.), @@ -36,33 +43,13 @@ } //======================================================================= -//function : Deflection -//purpose : -//======================================================================= - -Standard_Real Poly_Polygon2D::Deflection() const -{ - return myDeflection; -} - -//======================================================================= -//function : Deflection +//function : DumpJson //purpose : //======================================================================= - -void Poly_Polygon2D::Deflection(const Standard_Real D) +void Poly_Polygon2D::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - myDeflection = D; -} - -//======================================================================= -//function : Nodes -//purpose : -//======================================================================= + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) -const TColgp_Array1OfPnt2d& Poly_Polygon2D::Nodes() const -{ - return myNodes; + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDeflection) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNodes.Size()) } - - diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon2D.hxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon2D.hxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon2D.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon2D.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,17 +17,10 @@ #ifndef _Poly_Polygon2D_HeaderFile #define _Poly_Polygon2D_HeaderFile -#include #include - -#include #include #include -#include -class Standard_NullObject; - -class Poly_Polygon2D; DEFINE_STANDARD_HANDLE(Poly_Polygon2D, Standard_Transient) //! Provides a polygon in 2D space (for example, in the @@ -38,13 +31,14 @@ //! repeated at the end of the table of nodes. class Poly_Polygon2D : public Standard_Transient { - public: - + //! Constructs a 2D polygon with specified number of nodes. + Standard_EXPORT explicit Poly_Polygon2D (const Standard_Integer theNbNodes); + //! Constructs a 2D polygon defined by the table of points, . Standard_EXPORT Poly_Polygon2D(const TColgp_Array1OfPnt2d& Nodes); - + //! Returns the deflection of this polygon. //! Deflection is used in cases where the polygon is an //! approximate representation of a curve. Deflection @@ -64,44 +58,33 @@ //! deflection to each polygon. In this case, the Deflection //! function is used to set a value on each polygon, and //! later to fetch the value. - Standard_EXPORT Standard_Real Deflection() const; - - //! Sets the deflection of this polygon to D - Standard_EXPORT void Deflection (const Standard_Real D); - + Standard_Real Deflection() const { return myDeflection; } + + //! Sets the deflection of this polygon. + void Deflection (const Standard_Real theDefl) { myDeflection = theDefl; } + //! Returns the number of nodes in this polygon. //! Note: If the polygon is closed, the point of closure is //! repeated at the end of its table of nodes. Thus, on a closed //! triangle, the function NbNodes returns 4. - Standard_Integer NbNodes() const; - - //! Returns the table of nodes for this polygon. - Standard_EXPORT const TColgp_Array1OfPnt2d& Nodes() const; - + Standard_Integer NbNodes() const { return myNodes.Length(); } + //! Returns the table of nodes for this polygon. + const TColgp_Array1OfPnt2d& Nodes() const { return myNodes; } + //! Returns the table of nodes for this polygon. + TColgp_Array1OfPnt2d& ChangeNodes() { return myNodes; } + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; DEFINE_STANDARD_RTTIEXT(Poly_Polygon2D,Standard_Transient) -protected: - - - - private: - Standard_Real myDeflection; TColgp_Array1OfPnt2d myNodes; - }; - -#include - - - - - #endif // _Poly_Polygon2D_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon2D.lxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon2D.lxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon2D.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon2D.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -// Created on: 1995-03-09 -// Created by: Laurent PAINNOT -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : NbNodes -//purpose : -//======================================================================= - -inline Standard_Integer Poly_Polygon2D::NbNodes() const -{ - return myNodes.Length(); -} - diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon3D.cxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon3D.cxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon3D.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon3D.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,16 +14,27 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - -#include #include -#include -#include IMPLEMENT_STANDARD_RTTIEXT(Poly_Polygon3D,Standard_Transient) //======================================================================= //function : Poly_Polygon3D +//purpose : +//======================================================================= +Poly_Polygon3D::Poly_Polygon3D (const Standard_Integer theNbNodes, + const Standard_Boolean theHasParams) +: myDeflection (0.0), + myNodes (1, theNbNodes) +{ + if (theHasParams) + { + myParameters = new TColStd_HArray1OfReal (1, theNbNodes); + } +} + +//======================================================================= +//function : Poly_Polygon3D //purpose : //======================================================================= Poly_Polygon3D::Poly_Polygon3D(const TColgp_Array1OfPnt& Nodes): @@ -71,66 +82,16 @@ return aCopy; } - -//======================================================================= -//function : Deflection -//purpose : -//======================================================================= - -Standard_Real Poly_Polygon3D::Deflection() const -{ - return myDeflection; -} - -//======================================================================= -//function : Deflection -//purpose : -//======================================================================= - -void Poly_Polygon3D::Deflection(const Standard_Real D) -{ - myDeflection = D; -} - -//======================================================================= -//function : Nodes -//purpose : -//======================================================================= - -const TColgp_Array1OfPnt& Poly_Polygon3D::Nodes() const -{ - return myNodes; -} - //======================================================================= -//function : HasParameters +//function : DumpJson //purpose : //======================================================================= - -Standard_Boolean Poly_Polygon3D::HasParameters() const +void Poly_Polygon3D::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - return !myParameters.IsNull(); -} - + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) -//======================================================================= -//function : Parameters -//purpose : -//======================================================================= - -const TColStd_Array1OfReal& Poly_Polygon3D::Parameters() const -{ - return myParameters->Array1(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDeflection) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNodes.Size()) + if (!myParameters.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myParameters->Size()) } - -//======================================================================= -//function : ChangeParameters -//purpose : -//======================================================================= - -TColStd_Array1OfReal& Poly_Polygon3D::ChangeParameters() const -{ - return myParameters->ChangeArray1(); -} - - diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon3D.hxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon3D.hxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon3D.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon3D.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,20 +17,12 @@ #ifndef _Poly_Polygon3D_HeaderFile #define _Poly_Polygon3D_HeaderFile -#include #include - -#include -#include -#include #include +#include #include -#include -#include -class Standard_NullObject; - +#include -class Poly_Polygon3D; DEFINE_STANDARD_HANDLE(Poly_Polygon3D, Standard_Transient) //! This class Provides a polygon in 3D space. It is generally an approximate representation of a curve. @@ -42,11 +34,13 @@ //! parameter of the corresponding point on the curve. class Poly_Polygon3D : public Standard_Transient { - public: - - //! onstructs a 3D polygon defined by the table of points, Nodes. + //! Constructs a 3D polygon with specific number of nodes. + Standard_EXPORT Poly_Polygon3D (const Standard_Integer theNbNodes, + const Standard_Boolean theHasParams); + + //! Constructs a 3D polygon defined by the table of points, Nodes. Standard_EXPORT Poly_Polygon3D(const TColgp_Array1OfPnt& Nodes); //! Constructs a 3D polygon defined by @@ -63,59 +57,48 @@ Standard_EXPORT virtual Handle(Poly_Polygon3D) Copy() const; //! Returns the deflection of this polygon - Standard_EXPORT Standard_Real Deflection() const; - - //! Sets the deflection of this polygon to D. See more on deflection in Poly_Polygon2D - Standard_EXPORT void Deflection (const Standard_Real D); + Standard_Real Deflection() const { return myDeflection; } + + //! Sets the deflection of this polygon. See more on deflection in Poly_Polygon2D + void Deflection (const Standard_Real theDefl) { myDeflection = theDefl; } //! Returns the number of nodes in this polygon. //! Note: If the polygon is closed, the point of closure is //! repeated at the end of its table of nodes. Thus, on a closed //! triangle the function NbNodes returns 4. - Standard_Integer NbNodes() const; - + Standard_Integer NbNodes() const { return myNodes.Length(); } + //! Returns the table of nodes for this polygon. - Standard_EXPORT const TColgp_Array1OfPnt& Nodes() const; - + const TColgp_Array1OfPnt& Nodes() const { return myNodes; } + + //! Returns the table of nodes for this polygon. + TColgp_Array1OfPnt& ChangeNodes() { return myNodes; } + //! Returns the table of the parameters associated with each node in this polygon. //! HasParameters function checks if parameters are associated with the nodes of this polygon. - Standard_EXPORT Standard_Boolean HasParameters() const; + Standard_Boolean HasParameters() const { return !myParameters.IsNull(); } //! Returns true if parameters are associated with the nodes //! in this polygon. - Standard_EXPORT const TColStd_Array1OfReal& Parameters() const; - + const TColStd_Array1OfReal& Parameters() const { return myParameters->Array1(); } + //! Returns the table of the parameters associated with each node in this polygon. //! ChangeParameters function returnes the array as shared. Therefore if the table is selected by //! reference you can, by simply modifying it, directly modify //! the data structure of this polygon. - Standard_EXPORT TColStd_Array1OfReal& ChangeParameters() const; - - + TColStd_Array1OfReal& ChangeParameters() const { return myParameters->ChangeArray1(); } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; DEFINE_STANDARD_RTTIEXT(Poly_Polygon3D,Standard_Transient) -protected: - - - - private: - Standard_Real myDeflection; TColgp_Array1OfPnt myNodes; Handle(TColStd_HArray1OfReal) myParameters; - }; - -#include - - - - - #endif // _Poly_Polygon3D_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon3D.lxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon3D.lxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Polygon3D.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Polygon3D.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -// Created on: 1995-03-09 -// Created by: Laurent PAINNOT -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : NbNodes -//purpose : -//======================================================================= - -inline Standard_Integer Poly_Polygon3D::NbNodes() const -{ - return myNodes.Length(); -} - diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.cxx opencascade-7.5.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.cxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,15 +14,28 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #include -#include -#include +#include IMPLEMENT_STANDARD_RTTIEXT(Poly_PolygonOnTriangulation,Standard_Transient) //======================================================================= //function : Poly_PolygonOnTriangulation +//purpose : +//======================================================================= +Poly_PolygonOnTriangulation::Poly_PolygonOnTriangulation (const Standard_Integer theNbNodes, + const Standard_Boolean theHasParams) +: myDeflection (0.0), + myNodes (1, theNbNodes) +{ + if (theHasParams) + { + myParameters = new TColStd_HArray1OfReal (1, theNbNodes); + } +} + +//======================================================================= +//function : Poly_PolygonOnTriangulation //purpose : //======================================================================= Poly_PolygonOnTriangulation::Poly_PolygonOnTriangulation @@ -66,53 +79,30 @@ } //======================================================================= -//function : Deflection -//purpose : +//function : SetParameters +//purpose : //======================================================================= - -Standard_Real Poly_PolygonOnTriangulation::Deflection() const +void Poly_PolygonOnTriangulation::SetParameters (const Handle(TColStd_HArray1OfReal)& theParameters) { - return myDeflection; + if (!theParameters.IsNull() + && (theParameters->Lower() != myNodes.Lower() + || theParameters->Upper() != myNodes.Upper())) + { + throw Standard_OutOfRange ("Poly_PolygonOnTriangulation::SetParameters() - invalid array size"); + } + myParameters = theParameters; } //======================================================================= -//function : Deflection +//function : DumpJson //purpose : //======================================================================= - -void Poly_PolygonOnTriangulation::Deflection(const Standard_Real D) +void Poly_PolygonOnTriangulation::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - myDeflection = D; -} - -//======================================================================= -//function : Nodes -//purpose : -//======================================================================= + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) -const TColStd_Array1OfInteger& Poly_PolygonOnTriangulation::Nodes() const -{ - return myNodes; + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDeflection) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNodes.Size()) + if (!myParameters.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myParameters->Size()) } - - -//======================================================================= -//function : HasParameters -//purpose : -//======================================================================= - -Standard_Boolean Poly_PolygonOnTriangulation::HasParameters() const -{ - return (!myParameters.IsNull()); -} - -//======================================================================= -//function : Parameters -//purpose : -//======================================================================= - -Handle(TColStd_HArray1OfReal) Poly_PolygonOnTriangulation::Parameters() const -{ - return myParameters; -} - diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.hxx opencascade-7.5.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.hxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,20 +17,13 @@ #ifndef _Poly_PolygonOnTriangulation_HeaderFile #define _Poly_PolygonOnTriangulation_HeaderFile -#include -#include -#include -#include -#include +#include #include +#include #include -#include -#include -class Standard_NullObject; - +#include -class Poly_PolygonOnTriangulation; DEFINE_STANDARD_HANDLE(Poly_PolygonOnTriangulation, Standard_Transient) //! This class provides a polygon in 3D space, based on the triangulation @@ -47,14 +40,15 @@ //! curve.represents a 3d Polygon class Poly_PolygonOnTriangulation : public Standard_Transient { - public: - + //! Constructs a 3D polygon on the triangulation of a shape with specified size of nodes. + Standard_EXPORT Poly_PolygonOnTriangulation (const Standard_Integer theNbNodes, + const Standard_Boolean theHasParams); + //! Constructs a 3D polygon on the triangulation of a shape, //! defined by the table of nodes, . Standard_EXPORT Poly_PolygonOnTriangulation(const TColStd_Array1OfInteger& Nodes); - //! Constructs a 3D polygon on the triangulation of a shape, defined by: //! - the table of nodes, Nodes, and the table of parameters, . @@ -73,59 +67,54 @@ Standard_EXPORT virtual Handle(Poly_PolygonOnTriangulation) Copy() const; //! Returns the deflection of this polygon - Standard_EXPORT Standard_Real Deflection() const; - - //! Sets the deflection of this polygon to D. + Standard_Real Deflection() const { return myDeflection; } + + //! Sets the deflection of this polygon. //! See more on deflection in Poly_Polygones2D. - Standard_EXPORT void Deflection (const Standard_Real D); - + void Deflection (const Standard_Real theDefl) { myDeflection = theDefl; } //! Returns the number of nodes for this polygon. //! Note: If the polygon is closed, the point of closure is //! repeated at the end of its table of nodes. Thus, on a closed //! triangle, the function NbNodes returns 4. - Standard_Integer NbNodes() const; - + Standard_Integer NbNodes() const { return myNodes.Length(); } + //! Returns the table of nodes for this polygon. A node value //! is an index in the table of nodes specific to an existing //! triangulation of a shape. - Standard_EXPORT const TColStd_Array1OfInteger& Nodes() const; - + const TColStd_Array1OfInteger& Nodes() const { return myNodes; } + + //! Returns the table of nodes for this polygon for modification. + TColStd_Array1OfInteger& ChangeNodes() { return myNodes; } //! Returns true if parameters are associated with the nodes in this polygon. - Standard_EXPORT Standard_Boolean HasParameters() const; - + Standard_Boolean HasParameters() const { return !myParameters.IsNull(); } + //! Returns the table of the parameters associated with each node in this polygon. //! Warning //! Use the function HasParameters to check if parameters //! are associated with the nodes in this polygon. - Standard_EXPORT Handle(TColStd_HArray1OfReal) Parameters() const; + const Handle(TColStd_HArray1OfReal)& Parameters() const { return myParameters; } + //! Returns the table of the parameters associated with each node in this polygon. + //! Warning! HasParameters() should be called beforehand to check if parameters array is allocated. + TColStd_Array1OfReal& ChangeParameters() { return myParameters->ChangeArray1(); } + //! Sets the table of the parameters associated with each node in this polygon. + //! Raises exception if array size doesn't much number of polygon nodes. + Standard_EXPORT void SetParameters (const Handle(TColStd_HArray1OfReal)& theParameters); + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; DEFINE_STANDARD_RTTIEXT(Poly_PolygonOnTriangulation,Standard_Transient) -protected: - - - - private: - Standard_Real myDeflection; TColStd_Array1OfInteger myNodes; Handle(TColStd_HArray1OfReal) myParameters; - }; - -#include - - - - - #endif // _Poly_PolygonOnTriangulation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.lxx opencascade-7.5.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.lxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_PolygonOnTriangulation.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright (c) 1996-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -//======================================================================= -//function : NbNodes -//purpose : -//======================================================================= - -inline Standard_Integer Poly_PolygonOnTriangulation::NbNodes() const -{ - return myNodes.Length(); -} - diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Triangle.cxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Triangle.cxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Triangle.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Triangle.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -// Created on: 1995-03-06 -// Created by: Laurent PAINNOT -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include - -//======================================================================= -//function : Poly_Triangle -//purpose : -//======================================================================= -Poly_Triangle::Poly_Triangle() -{ - myNodes[0] = myNodes[1] = myNodes[2] = 0; -} - -//======================================================================= -//function : Poly_Triangle -//purpose : -//======================================================================= - -Poly_Triangle::Poly_Triangle(const Standard_Integer N1, - const Standard_Integer N2, - const Standard_Integer N3) -{ - myNodes[0] = N1; - myNodes[1] = N2; - myNodes[2] = N3; -} - -//======================================================================= -//function : Set -//purpose : -//======================================================================= - -void Poly_Triangle::Set(const Standard_Integer N1, - const Standard_Integer N2, - const Standard_Integer N3) -{ - myNodes[0] = N1; - myNodes[1] = N2; - myNodes[2] = N3; -} - -//======================================================================= -//function : Get -//purpose : -//======================================================================= - -void Poly_Triangle::Get(Standard_Integer& N1, - Standard_Integer& N2, - Standard_Integer& N3) const -{ - N1 = myNodes[0]; - N2 = myNodes[1]; - N3 = myNodes[2]; -} - diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Triangle.hxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Triangle.hxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Triangle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Triangle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,81 +20,79 @@ #include #include #include - #include -class Standard_OutOfRange; - +#include -//! Describes a component triangle of a triangulation -//! (Poly_Triangulation object). -//! A Triangle is defined by a triplet of nodes. Each node is an -//! index in the table of nodes specific to an existing +//! Describes a component triangle of a triangulation (Poly_Triangulation object). +//! A Triangle is defined by a triplet of nodes. +//! Each node is an index in the table of nodes specific to an existing //! triangulation of a shape, and represents a point on the surface. -class Poly_Triangle +class Poly_Triangle { public: DEFINE_STANDARD_ALLOC - //! Constructs a triangle and sets all indices to zero. - Standard_EXPORT Poly_Triangle(); - - //! Constructs a triangle and sets its three indices - //! to N1, N2 and N3 respectively, where these node values - //! are indices in the table of nodes specific to an existing - //! triangulation of a shape. - Standard_EXPORT Poly_Triangle(const Standard_Integer N1, const Standard_Integer N2, const Standard_Integer N3); - - //! Sets the value of the three nodes of this triangle to N1, N2 and N3 respectively. - Standard_EXPORT void Set (const Standard_Integer N1, const Standard_Integer N2, const Standard_Integer N3); - - //! Sets the value of the Indexth node of this triangle to Node. - //! Raises OutOfRange if Index is not in 1,2,3 - void Set (const Standard_Integer Index, const Standard_Integer Node); - - //! Returns the node indices of this triangle in N1, N2 and N3. - Standard_EXPORT void Get (Standard_Integer& N1, Standard_Integer& N2, Standard_Integer& N3) const; - - //! Get the node of given Index. - //! Raises OutOfRange from Standard if Index is not in 1,2,3 - Standard_Integer Value (const Standard_Integer Index) const; - Standard_Integer operator() (const Standard_Integer Index) const -{ - return Value(Index); -} - - //! Get the node of given Index. - //! Raises OutOfRange if Index is not in 1,2,3 - Standard_Integer& ChangeValue (const Standard_Integer Index); - Standard_Integer& operator() (const Standard_Integer Index) -{ - return ChangeValue(Index); -} + Poly_Triangle() { myNodes[0] = myNodes[1] = myNodes[2] = 0; } + //! Constructs a triangle and sets its three indices, + //! where these node values are indices in the table of nodes specific to an existing triangulation of a shape. + Poly_Triangle (const Standard_Integer theN1, const Standard_Integer theN2, const Standard_Integer theN3) + { + myNodes[0] = theN1; + myNodes[1] = theN2; + myNodes[2] = theN3; + } + + //! Sets the value of the three nodes of this triangle. + void Set (const Standard_Integer theN1, const Standard_Integer theN2, const Standard_Integer theN3) + { + myNodes[0] = theN1; + myNodes[1] = theN2; + myNodes[2] = theN3; + } + + //! Sets the value of node with specified index of this triangle. + //! Raises Standard_OutOfRange if index is not in 1,2,3 + void Set (const Standard_Integer theIndex, const Standard_Integer theNode) + { + Standard_OutOfRange_Raise_if(theIndex < 1 || theIndex > 3, "Poly_Triangle::Set(), invalid index"); + myNodes[theIndex - 1] = theNode; + } + + //! Returns the node indices of this triangle. + void Get (Standard_Integer& theN1, Standard_Integer& theN2, Standard_Integer& theN3) const + { + theN1 = myNodes[0]; + theN2 = myNodes[1]; + theN3 = myNodes[2]; + } + //! Get the node of given Index. + //! Raises OutOfRange from Standard if Index is not in 1,2,3 + Standard_Integer Value (const Standard_Integer theIndex) const + { + Standard_OutOfRange_Raise_if(theIndex < 1 || theIndex > 3, "Poly_Triangle::Value(), invalid index"); + return myNodes[theIndex - 1]; + } + Standard_Integer operator() (const Standard_Integer Index) const { return Value(Index); } -protected: - - - + //! Get the node of given Index. + //! Raises OutOfRange if Index is not in 1,2,3 + Standard_Integer& ChangeValue (const Standard_Integer theIndex) + { + Standard_OutOfRange_Raise_if(theIndex < 1 || theIndex > 3, "Poly_Triangle::ChangeValue(), invalid index"); + return myNodes[theIndex - 1]; + } + Standard_Integer& operator() (const Standard_Integer Index) { return ChangeValue(Index); } private: - - Standard_Integer myNodes[3]; - }; - -#include - - - - - #endif // _Poly_Triangle_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Triangle.lxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Triangle.lxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Triangle.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Triangle.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -// Created on: 1995-03-06 -// Created by: Laurent PAINNOT -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -//======================================================================= -//function : Set -//purpose : -//======================================================================= - -inline void Poly_Triangle::Set(const Standard_Integer Index, const Standard_Integer Node) -{ - Standard_OutOfRange_Raise_if(Index < 1 || Index > 3,NULL); - myNodes[Index-1] = Node; -} - -//======================================================================= -//function : Value -//purpose : -//======================================================================= - -inline Standard_Integer Poly_Triangle::Value(const Standard_Integer Index) const -{ - Standard_OutOfRange_Raise_if(Index < 1 || Index > 3,NULL); - return myNodes[Index-1]; -} - -//======================================================================= -//function : ChangeValue -//purpose : -//======================================================================= - -inline Standard_Integer& Poly_Triangle::ChangeValue -(const Standard_Integer Index) -{ - Standard_OutOfRange_Raise_if(Index < 1 || Index > 3,NULL); - return myNodes[Index-1]; -} - diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Triangulation.cxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Triangulation.cxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Triangulation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Triangulation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -309,3 +310,21 @@ return N; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Poly_Triangulation::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDeflection) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNodes.Size()) + if (!myUVNodes.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUVNodes->Size()) + if (!myNormals.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myNormals->Size()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTriangles.Size()) +} diff -Nru opencascade-7.4.1+dfsg1/src/Poly/Poly_Triangulation.hxx opencascade-7.5.1+dfsg1/src/Poly/Poly_Triangulation.hxx --- opencascade-7.4.1+dfsg1/src/Poly/Poly_Triangulation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Poly/Poly_Triangulation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -196,6 +196,9 @@ Standard_EXPORT void SetNormal (const Standard_Integer theIndex, const gp_Dir& theNormal); + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: Standard_Real myDeflection; diff -Nru opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_CompProjectedCurve.cxx opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_CompProjectedCurve.cxx --- opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_CompProjectedCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_CompProjectedCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -81,7 +81,12 @@ NCollection_Vector &theSplits) : myCurve(theCurve), mySurface(theSurface), - mySplits(theSplits) + mySplits(theSplits), + myPerMinParam(0.0), + myPerMaxParam(0.0), + myPeriodicDir(0), + myExtCC(NULL), + myExtPS(NULL) { } // Assignment operator is forbidden. @@ -636,8 +641,8 @@ Standard_Boolean FromLastU = Standard_False, isSplitsComputed = Standard_False; - const Standard_Real aTol3D = Precision::Confusion(); - Extrema_ExtCS CExt(myCurve->Curve(), mySurface->Surface(), aTol3D, aTol3D); + const Standard_Real aTolExt = Precision::PConfusion(); + Extrema_ExtCS CExt(myCurve->Curve(), mySurface->Surface(), aTolExt, aTolExt); if (CExt.IsDone() && CExt.NbExt()) { // Search for the minimum solution. diff -Nru opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_ComputeApprox.cxx opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_ComputeApprox.cxx --- opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_ComputeApprox.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_ComputeApprox.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1156,6 +1156,10 @@ Approx_FitAndDivide2d Fit(Deg1, Deg2, myTolerance, aTol2d, Standard_True, aFistC, aLastC); Fit.SetMaxSegments(aMaxSegments); + if (simplecase) + { + Fit.SetHangChecking(Standard_False); + } Fit.Perform(F); Standard_Real aNewTol2d = 0; diff -Nru opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_ComputeApproxOnPolarSurface.cxx opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_ComputeApproxOnPolarSurface.cxx --- opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_ComputeApproxOnPolarSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_ComputeApproxOnPolarSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -84,6 +84,14 @@ struct aFuncStruct { + aFuncStruct() // Empty constructor. + : mySqProjOrtTol(0.0), + myTolU(0.0), + myTolV(0.0) + { + memset(myPeriod, 0, sizeof (myPeriod)); + } + Handle(Adaptor3d_HSurface) mySurf; // Surface where to project. Handle(Adaptor3d_HCurve) myCurve; // Curve to project. Handle(Adaptor2d_HCurve2d) myInitCurve2d; // Initial 2dcurve projection. diff -Nru opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_PrjResolve.cxx opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_PrjResolve.cxx --- opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_PrjResolve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_PrjResolve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,7 +26,9 @@ #include #include -ProjLib_PrjResolve::ProjLib_PrjResolve(const Adaptor3d_Curve& C,const Adaptor3d_Surface& S,const Standard_Integer Fix) : myFix(Fix) +ProjLib_PrjResolve::ProjLib_PrjResolve(const Adaptor3d_Curve& C,const Adaptor3d_Surface& S,const Standard_Integer Fix) +: myDone(Standard_False), + myFix(Fix) { if (myFix > 3 || myFix < 1) throw Standard_ConstructionError(); mySolution = gp_Pnt2d(0.,0.); diff -Nru opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_ProjectedCurve.cxx opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_ProjectedCurve.cxx --- opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_ProjectedCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_ProjectedCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -685,9 +685,8 @@ MaxSeg = myMaxSegments; } - Approx_CurveOnSurface appr(HProjector, mySurface, Udeb, Ufin, - myTolerance, Continuity, MaxDegree, MaxSeg, - Only3d, Only2d); + Approx_CurveOnSurface appr(HProjector, mySurface, Udeb, Ufin, myTolerance); + appr.Perform(MaxSeg, MaxDegree, Continuity, Only3d, Only2d); Handle(Geom2d_BSplineCurve) aRes = appr.Curve2d(); diff -Nru opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_ProjectOnPlane.cxx opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_ProjectOnPlane.cxx --- opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_ProjectOnPlane.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_ProjectOnPlane.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,6 +44,9 @@ #include #include #include +#include +#include +#include @@ -516,10 +519,7 @@ gp_Ax2 Axis; Standard_Real R1 =0., R2 =0.; - if ( Type != GeomAbs_Line) // on garde le parametrage - myKeepParam = Standard_True; - else // on prend le choix utilisateur. - myKeepParam = KeepParametrization; + myKeepParam = KeepParametrization; switch ( Type) { case GeomAbs_Line: @@ -648,12 +648,14 @@ Standard_Real Tol2 = myTolerance*myTolerance; if (VDx.SquareMagnitude() < Tol2 || - VDy.SquareMagnitude() < Tol2 ) { - myIsApprox = Standard_True; + VDy.SquareMagnitude() < Tol2 || + VDx.CrossSquareMagnitude(VDy) < Tol2) + { + myIsApprox = Standard_True; } - if (!myIsApprox && - gp_Dir(VDx).IsNormal(gp_Dir(VDy),Precision::Angular())) { + if (!myIsApprox) + { Dx = gp_Dir(VDx); Dy = gp_Dir(VDy); gp_Pnt O = Axis.Location(); @@ -662,39 +664,93 @@ gp_Pnt Py = ProjectPnt(myPlane,myDirection,O.Translated(R2*gp_Vec(Y))); Standard_Real Major = P.Distance(Px); Standard_Real Minor = P.Distance(Py); - gp_Ax2 Axe( P, Dx^Dy,Dx); - if ( Abs( Major - Minor) < Precision::Confusion()) { - myType = GeomAbs_Circle; - gp_Circ Circ(Axe, Major); - GeomCirclePtr = new Geom_Circle(Circ); -// Modified by Sergey KHROMOV - Tue Jan 29 16:57:29 2002 Begin - GeomAdaptor_Curve aGACurve(GeomCirclePtr); - myResult = new GeomAdaptor_HCurve(aGACurve); -// Modified by Sergey KHROMOV - Tue Jan 29 16:57:30 2002 End - } - else if ( Major > Minor) { - myType = GeomAbs_Ellipse; - Elips = gp_Elips( Axe, Major, Minor); - - GeomEllipsePtr = new Geom_Ellipse(Elips) ; -// Modified by Sergey KHROMOV - Tue Jan 29 16:57:29 2002 Begin - GeomAdaptor_Curve aGACurve(GeomEllipsePtr); - myResult = new GeomAdaptor_HCurve(aGACurve); -// Modified by Sergey KHROMOV - Tue Jan 29 16:57:30 2002 End - } - else { - myIsApprox = Standard_True; - myType = GeomAbs_BSplineCurve; - PerformApprox(myCurve,myPlane,myDirection,ApproxCurve); -// Modified by Sergey KHROMOV - Tue Jan 29 16:57:29 2002 Begin - GeomAdaptor_Curve aGACurve(ApproxCurve); - myResult = new GeomAdaptor_HCurve(aGACurve); -// Modified by Sergey KHROMOV - Tue Jan 29 16:57:30 2002 End - } - } - else { - myIsApprox = Standard_True; + if (myKeepParam) + { + myIsApprox = !gp_Dir(VDx).IsNormal(gp_Dir(VDy), Precision::Angular()); + } + else + { + // Since it is not necessary to keep the same parameter for the point on the original and on the projected curves, + // we will use the following approach to find axes of the projected ellipse and provide the canonical curve: + // https://www.geometrictools.com/Documentation/ParallelProjectionEllipse.pdf + math_Matrix aMatrA(1, 2, 1, 2); + // A = Jp^T * Pr(Je), where + // Pr(Je) - projection of axes of original ellipse to the target plane + // Jp - X and Y axes of the target plane + aMatrA(1, 1) = myPlane.XDirection().XYZ().Dot(VDx.XYZ()); + aMatrA(1, 2) = myPlane.XDirection().XYZ().Dot(VDy.XYZ()); + aMatrA(2, 1) = myPlane.YDirection().XYZ().Dot(VDx.XYZ()); + aMatrA(2, 2) = myPlane.YDirection().XYZ().Dot(VDy.XYZ()); + + math_Matrix aMatrDelta2(1, 2, 1, 2, 0.0); + // | 1/MajorRad^2 0 | + // Delta^2 = | | + // | 0 1/MajorRad^2 | + aMatrDelta2(1, 1) = 1.0 / (R1 * R1); + aMatrDelta2(2, 2) = 1.0 / (R2 * R2); + + math_Matrix aMatrAInv = aMatrA.Inverse(); + math_Matrix aMatrM = aMatrAInv.Transposed() * aMatrDelta2 * aMatrAInv; + + // perform eigenvalues calculation + math_Jacobi anEigenCalc(aMatrM); + if (anEigenCalc.IsDone()) + { + // radii of the projected ellipse + Minor = 1.0 / Sqrt(anEigenCalc.Value(1)); + Major = 1.0 / Sqrt(anEigenCalc.Value(2)); + + // calculate the rotation angle for the plane axes to meet the correct axes of the projected ellipse + // (swap eigenvectors in respect to major and minor axes) + const math_Matrix& anEigenVec = anEigenCalc.Vectors(); + gp_Trsf2d aTrsfInPlane; + aTrsfInPlane.SetValues(anEigenVec(1, 2), anEigenVec(1, 1), 0.0, + anEigenVec(2, 2), anEigenVec(2, 1), 0.0); + gp_Trsf aRot; + aRot.SetRotation(gp_Ax1(P, myPlane.Direction()), aTrsfInPlane.RotationPart()); + + Dx = myPlane.XDirection().Transformed(aRot); + Dy = myPlane.YDirection().Transformed(aRot); + } + else + { + myIsApprox = Standard_True; + } + } + + if (!myIsApprox) + { + gp_Ax2 Axe(P, Dx^Dy, Dx); + + if (Abs(Major - Minor) < Precision::Confusion()) { + myType = GeomAbs_Circle; + gp_Circ Circ(Axe, Major); + GeomCirclePtr = new Geom_Circle(Circ); +// Modified by Sergey KHROMOV - Tue Jan 29 16:57:29 2002 Begin + GeomAdaptor_Curve aGACurve(GeomCirclePtr); + myResult = new GeomAdaptor_HCurve(aGACurve); +// Modified by Sergey KHROMOV - Tue Jan 29 16:57:30 2002 End + } + else if ( Major > Minor) { + myType = GeomAbs_Ellipse; + Elips = gp_Elips( Axe, Major, Minor); + + GeomEllipsePtr = new Geom_Ellipse(Elips); +// Modified by Sergey KHROMOV - Tue Jan 29 16:57:29 2002 Begin + GeomAdaptor_Curve aGACurve(GeomEllipsePtr); + myResult = new GeomAdaptor_HCurve(aGACurve); +// Modified by Sergey KHROMOV - Tue Jan 29 16:57:30 2002 End + } + else { + myIsApprox = Standard_True; + } + } + } + + // No way to build the canonical curve, approximate as B-spline + if (myIsApprox) + { myType = GeomAbs_BSplineCurve; PerformApprox(myCurve,myPlane,myDirection,ApproxCurve); // Modified by Sergey KHROMOV - Tue Jan 29 16:57:29 2002 Begin @@ -702,10 +758,26 @@ myResult = new GeomAdaptor_HCurve(aGACurve); // Modified by Sergey KHROMOV - Tue Jan 29 16:57:30 2002 End } + else if (GeomCirclePtr || GeomEllipsePtr) + { + Handle(Geom_Curve) aResultCurve = GeomCirclePtr; + if (aResultCurve.IsNull()) + aResultCurve = GeomEllipsePtr; + // start and end parameters of the projected curve + Standard_Real aParFirst = myCurve->FirstParameter(); + Standard_Real aParLast = myCurve->LastParameter(); + gp_Pnt aPntFirst = ProjectPnt(myPlane, myDirection, myCurve->Value(aParFirst)); + gp_Pnt aPntLast = ProjectPnt(myPlane, myDirection, myCurve->Value(aParLast)); + GeomLib_Tool::Parameter(aResultCurve, aPntFirst, Precision::Confusion(), myFirstPar); + GeomLib_Tool::Parameter(aResultCurve, aPntLast, Precision::Confusion(), myLastPar); + while (myLastPar <= myFirstPar) + myLastPar += myResult->Period(); + } } break; case GeomAbs_Parabola: { + myKeepParam = Standard_True; // P(u) = O + (u*u)/(4*f) * Xc + u * Yc // ==> Q(u) = f(P(u)) // = f(O) + (u*u)/(4*f) * f(Xc) + u * f(Yc) @@ -757,6 +829,7 @@ break; case GeomAbs_Hyperbola: { + myKeepParam = Standard_True; // P(u) = O + R1 * Cosh(u) * Xc + R2 * Sinh(u) * Yc // ==> Q(u) = f(P(u)) // = f(O) + R1 * Cosh(u) * f(Xc) + R2 * Sinh(u) * f(Yc) @@ -824,6 +897,7 @@ Handle(Geom_BezierCurve) ProjCu = Handle(Geom_BezierCurve)::DownCast(BezierCurvePtr->Copy()); + myKeepParam = Standard_True; myIsApprox = Standard_False; myType = Type; for ( Standard_Integer i = 1; i <= NbPoles; i++) { @@ -847,6 +921,7 @@ Handle(Geom_BSplineCurve) ProjectedBSplinePtr = Handle(Geom_BSplineCurve)::DownCast(BSplineCurvePtr->Copy()) ; + myKeepParam = Standard_True; myIsApprox = Standard_False; myType = Type; for ( Standard_Integer i = 1; i <= BSplineCurvePtr->NbPoles(); i++) { @@ -862,6 +937,7 @@ break; default: { + myKeepParam = Standard_True; myIsApprox = Standard_True; myType = GeomAbs_BSplineCurve; PerformApprox(myCurve,myPlane,myDirection,ApproxCurve); diff -Nru opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_ProjectOnSurface.cxx opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_ProjectOnSurface.cxx --- opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_ProjectOnSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_ProjectOnSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -147,7 +147,8 @@ //======================================================================= ProjLib_ProjectOnSurface::ProjLib_ProjectOnSurface() : -myIsDone(Standard_False) +myTolerance(0.0), +myIsDone(Standard_False) { } @@ -158,7 +159,8 @@ ProjLib_ProjectOnSurface::ProjLib_ProjectOnSurface (const Handle(Adaptor3d_HSurface)& S ) : -myIsDone(Standard_False) +myTolerance(0.0), +myIsDone(Standard_False) { mySurface = S; } diff -Nru opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_Projector.cxx opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_Projector.cxx --- opencascade-7.4.1+dfsg1/src/ProjLib/ProjLib_Projector.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ProjLib/ProjLib_Projector.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,6 +38,7 @@ //purpose : //======================================================================= ProjLib_Projector::ProjLib_Projector() +: myIsPeriodic(Standard_False) { isDone = Standard_False; myType = GeomAbs_BSplineCurve; diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/FILES opencascade-7.5.1+dfsg1/src/Prs3d/FILES --- opencascade-7.4.1+dfsg1/src/Prs3d/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -6,6 +6,8 @@ Prs3d_ArrowAspect.hxx Prs3d_BasicAspect.cxx Prs3d_BasicAspect.hxx +Prs3d_BndBox.cxx +Prs3d_BndBox.hxx Prs3d_DatumAspect.cxx Prs3d_DatumAspect.hxx Prs3d_DatumAttribute.hxx @@ -35,12 +37,9 @@ Prs3d_Presentation.hxx Prs3d_PresentationShadow.cxx Prs3d_PresentationShadow.hxx -Prs3d_Projector.cxx -Prs3d_Projector.hxx Prs3d_Root.hxx Prs3d_ShadingAspect.cxx Prs3d_ShadingAspect.hxx -Prs3d_ShapeTool.cxx Prs3d_ShapeTool.hxx Prs3d_Text.cxx Prs3d_Text.hxx @@ -56,6 +55,8 @@ Prs3d_ToolSector.cxx Prs3d_ToolSphere.hxx Prs3d_ToolSphere.cxx +Prs3d_ToolTorus.hxx +Prs3d_ToolTorus.cxx Prs3d_TypeOfHighlight.hxx Prs3d_TypeOfHLR.hxx Prs3d_TypeOfLinePicking.hxx diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ArrowAspect.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ArrowAspect.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ArrowAspect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ArrowAspect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -71,11 +71,11 @@ // function : DumpJson // purpose : // ======================================================================= -void Prs3d_ArrowAspect::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Prs3d_ArrowAspect::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Prs3d_ArrowAspect); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myArrowAspect.get()); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAngle); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLength); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myArrowAspect.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAngle) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLength) } diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ArrowAspect.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ArrowAspect.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ArrowAspect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ArrowAspect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,7 +58,7 @@ void SetAspect (const Handle(Graphic3d_AspectLine3d)& theAspect) { myArrowAspect = theAspect; } //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Arrow.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Arrow.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Arrow.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Arrow.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -138,7 +138,19 @@ return Handle(Graphic3d_ArrayOfTriangles)(); } - Handle(Graphic3d_ArrayOfTriangles) anArray = new Graphic3d_ArrayOfTriangles (aNbTris * 3, 0, Standard_True); + Standard_Integer aMaxVertexs = 0; + if (aNbTrisTube > 0) + { + aMaxVertexs += Prs3d_ToolCylinder::VerticesNb (theNbFacettes, 1); + } + if (aNbTrisCone > 0) + { + // longer syntax to workaround msvc10 32-bit optimizer bug (#0031876) + aMaxVertexs += Prs3d_ToolDisk::VerticesNb (theNbFacettes, 1); + aMaxVertexs += Prs3d_ToolCylinder::VerticesNb (theNbFacettes, 1); + } + + Handle(Graphic3d_ArrayOfTriangles) anArray = new Graphic3d_ArrayOfTriangles (aMaxVertexs, aNbTris * 3, Graphic3d_ArrayFlags_VertexNormal); if (aNbTrisTube != 0) { gp_Ax3 aSystem (theAxis.Location(), theAxis.Direction()); diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Arrow.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Arrow.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Arrow.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Arrow.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,19 +17,19 @@ #ifndef _Prs3d_Arrow_HeaderFile #define _Prs3d_Arrow_HeaderFile -#include - #include #include +#include class gp_Ax1; class gp_Pnt; class gp_Dir; //! Provides class methods to draw an arrow at a given location, along a given direction and using a given angle. -class Prs3d_Arrow : public Prs3d_Root +class Prs3d_Arrow { public: + DEFINE_STANDARD_ALLOC //! Defines the representation of the arrow as shaded triangulation. //! @param theAxis axis definition (arrow origin and direction) @@ -78,7 +78,7 @@ const Standard_Real theAngle, const Standard_Real theLength) { - Draw (Prs3d_Root::CurrentGroup (thePrs), theLocation, theDirection, theAngle, theLength); + Draw (thePrs->CurrentGroup(), theLocation, theDirection, theAngle, theLength); } }; diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_BasicAspect.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_BasicAspect.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_BasicAspect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_BasicAspect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,7 @@ DEFINE_STANDARD_RTTIEXT(Prs3d_BasicAspect, Standard_Transient) //! Dumps the content of me into the stream - virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const = 0; + virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const = 0; }; diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_BndBox.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_BndBox.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_BndBox.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_BndBox.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,54 @@ +// Created on: 2014-10-14 +// Created by: Anton POLETAEV +// Copyright (c) 2013-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include + +//======================================================================= +//function : Add +//purpose : +//======================================================================= +void Prs3d_BndBox::Add (const Handle(Prs3d_Presentation)& thePresentation, + const Bnd_Box& theBndBox, + const Handle(Prs3d_Drawer)& theDrawer) +{ + if (!theBndBox.IsVoid()) + { + Handle(Graphic3d_Group) aGroup = thePresentation->CurrentGroup(); + aGroup->SetGroupPrimitivesAspect (new Graphic3d_AspectLine3d (theDrawer->LineAspect()->Aspect()->Color(), + Aspect_TOL_DOTDASH, + theDrawer->LineAspect()->Aspect()->Width())); + aGroup->AddPrimitiveArray (FillSegments (theBndBox)); + } +} + +//======================================================================= +//function : Add +//purpose : +//======================================================================= +void Prs3d_BndBox::Add (const Handle(Prs3d_Presentation)& thePresentation, + const Bnd_OBB& theBndBox, + const Handle(Prs3d_Drawer)& theDrawer) +{ + if (!theBndBox.IsVoid()) + { + Handle(Graphic3d_Group) aGroup = thePresentation->CurrentGroup(); + aGroup->SetGroupPrimitivesAspect (new Graphic3d_AspectLine3d (theDrawer->LineAspect()->Aspect()->Color(), + Aspect_TOL_DOTDASH, + theDrawer->LineAspect()->Aspect()->Width())); + aGroup->AddPrimitiveArray (FillSegments (theBndBox)); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_BndBox.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_BndBox.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_BndBox.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_BndBox.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,148 @@ +// Created on: 2014-10-14 +// Created by: Anton POLETAEV +// Copyright (c) 2013-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Prs3d_BndBox_H__ +#define _Prs3d_BndBox_H__ + +#include +#include +#include +#include +#include +#include + +//! Tool for computing bounding box presentation. +class Prs3d_BndBox : public Prs3d_Root +{ +public: + + //! Computes presentation of a bounding box. + //! @param thePresentation [in] the presentation. + //! @param theBndBox [in] the bounding box. + //! @param theDrawer [in] the drawer. + Standard_EXPORT static void Add (const Handle(Prs3d_Presentation)& thePresentation, + const Bnd_Box& theBndBox, + const Handle(Prs3d_Drawer)& theDrawer); + + //! Computes presentation of a bounding box. + //! @param thePresentation [in] the presentation. + //! @param theBndBox [in] the bounding box. + //! @param theDrawer [in] the drawer. + Standard_EXPORT static void Add (const Handle(Prs3d_Presentation)& thePresentation, + const Bnd_OBB& theBndBox, + const Handle(Prs3d_Drawer)& theDrawer); + +public: + + //! Create primitive array with line segments for displaying a box. + //! @param theBox [in] the box to add + static Handle(Graphic3d_ArrayOfSegments) FillSegments (const Bnd_OBB& theBox) + { + if (theBox.IsVoid()) + { + return Handle(Graphic3d_ArrayOfSegments)(); + } + + Handle(Graphic3d_ArrayOfSegments) aSegs = new Graphic3d_ArrayOfSegments (8, 12 * 2); + FillSegments (aSegs, theBox); + return aSegs; + } + + //! Create primitive array with line segments for displaying a box. + //! @param theBox [in] the box to add + static Handle(Graphic3d_ArrayOfSegments) FillSegments (const Bnd_Box& theBox) + { + if (theBox.IsVoid()) + { + return Handle(Graphic3d_ArrayOfSegments)(); + } + + Handle(Graphic3d_ArrayOfSegments) aSegs = new Graphic3d_ArrayOfSegments (8, 12 * 2); + FillSegments (aSegs, theBox); + return aSegs; + } + + //! Create primitive array with line segments for displaying a box. + //! @param theSegments [in] [out] primitive array to be filled; + //! should be at least 8 nodes and 24 edges in size + //! @param theBox [in] the box to add + static void FillSegments (const Handle(Graphic3d_ArrayOfSegments)& theSegments, const Bnd_OBB& theBox) + { + if (!theBox.IsVoid()) + { + gp_Pnt aXYZ[8]; + theBox.GetVertex (aXYZ); + fillSegments (theSegments, aXYZ); + } + } + + //! Create primitive array with line segments for displaying a box. + //! @param theSegments [in] [out] primitive array to be filled; + //! should be at least 8 nodes and 24 edges in size + //! @param theBox [in] the box to add + static void FillSegments (const Handle(Graphic3d_ArrayOfSegments)& theSegments, const Bnd_Box& theBox) + { + if (!theBox.IsVoid()) + { + const gp_Pnt aMin = theBox.CornerMin(); + const gp_Pnt aMax = theBox.CornerMax(); + const gp_Pnt aXYZ[8] = + { + gp_Pnt (aMin.X(), aMin.Y(), aMin.Z()), + gp_Pnt (aMax.X(), aMin.Y(), aMin.Z()), + gp_Pnt (aMin.X(), aMax.Y(), aMin.Z()), + gp_Pnt (aMax.X(), aMax.Y(), aMin.Z()), + gp_Pnt (aMin.X(), aMin.Y(), aMax.Z()), + gp_Pnt (aMax.X(), aMin.Y(), aMax.Z()), + gp_Pnt (aMin.X(), aMax.Y(), aMax.Z()), + gp_Pnt (aMax.X(), aMax.Y(), aMax.Z()), + }; + fillSegments (theSegments, aXYZ); + } + } + +public: + + //! Create primitive array with line segments for displaying a box. + //! @param theSegments [in] [out] primitive array to be filled; + //! should be at least 8 nodes and 24 edges in size + //! @param theBox [in] the box to add + static void fillSegments (const Handle(Graphic3d_ArrayOfSegments)& theSegments, const gp_Pnt* theBox) + { + const Standard_Integer aFrom = theSegments->VertexNumber(); + for (int aVertIter = 0; aVertIter < 8; ++aVertIter) + { + theSegments->AddVertex (theBox[aVertIter]); + } + + theSegments->AddEdges (aFrom + 1, aFrom + 2); + theSegments->AddEdges (aFrom + 3, aFrom + 4); + theSegments->AddEdges (aFrom + 5, aFrom + 6); + theSegments->AddEdges (aFrom + 7, aFrom + 8); + // + theSegments->AddEdges (aFrom + 1, aFrom + 3); + theSegments->AddEdges (aFrom + 2, aFrom + 4); + theSegments->AddEdges (aFrom + 5, aFrom + 7); + theSegments->AddEdges (aFrom + 6, aFrom + 8); + // + theSegments->AddEdges (aFrom + 1, aFrom + 5); + theSegments->AddEdges (aFrom + 2, aFrom + 6); + theSegments->AddEdges (aFrom + 3, aFrom + 7); + theSegments->AddEdges (aFrom + 4, aFrom + 8); + } + +}; + +#endif // _Prs3d_BndBox_H__ diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,15 +16,83 @@ #include -#include -#include #include +#include #include -#include +#include +#include #include -#include -#include -#include + +// ========================================================================= +// function : AddFreeEdges +// purpose : +// ========================================================================= +void Prs3d::AddFreeEdges (TColgp_SequenceOfPnt& theSegments, + const Handle(Poly_Triangulation)& thePolyTri, + const gp_Trsf& theLocation) +{ + if (thePolyTri.IsNull()) + { + return; + } + + const TColgp_Array1OfPnt& aNodes = thePolyTri->Nodes(); + + // Build the connect tool. + Poly_Connect aPolyConnect (thePolyTri); + + Standard_Integer aNbTriangles = thePolyTri->NbTriangles(); + Standard_Integer aT[3]; + Standard_Integer aN[3]; + + // Count the free edges. + Standard_Integer aNbFree = 0; + for (Standard_Integer anI = 1; anI <= aNbTriangles; ++anI) + { + aPolyConnect.Triangles (anI, aT[0], aT[1], aT[2]); + for (Standard_Integer aJ = 0; aJ < 3; ++aJ) + { + if (aT[aJ] == 0) + { + ++aNbFree; + } + } + } + if (aNbFree == 0) + { + return; + } + + TColStd_Array1OfInteger aFree (1, 2 * aNbFree); + + Standard_Integer aFreeIndex = 1; + const Poly_Array1OfTriangle& aTriangles = thePolyTri->Triangles(); + for (Standard_Integer anI = 1; anI <= aNbTriangles; ++anI) + { + aPolyConnect.Triangles (anI, aT[0], aT[1], aT[2]); + aTriangles (anI).Get (aN[0], aN[1], aN[2]); + for (Standard_Integer aJ = 0; aJ < 3; aJ++) + { + Standard_Integer k = (aJ + 1) % 3; + if (aT[aJ] == 0) + { + aFree (aFreeIndex) = aN[aJ]; + aFree (aFreeIndex + 1) = aN[k]; + aFreeIndex += 2; + } + } + } + + // free edges + Standard_Integer aFreeHalfNb = aFree.Length() / 2; + for (Standard_Integer anI = 1; anI <= aFreeHalfNb; ++anI) + { + const gp_Pnt aPoint1 = aNodes (aFree (2 * anI - 1)).Transformed (theLocation); + const gp_Pnt aPoint2 = aNodes (aFree (2 * anI )).Transformed (theLocation); + theSegments.Append (aPoint1); + theSegments.Append (aPoint2); + } +} //======================================================================= //function : MatchSegment @@ -55,44 +123,6 @@ return (dist < aDistance); } -//======================================================================= -//function : GetDeflection -//purpose : -//======================================================================= -Standard_Real Prs3d::GetDeflection (const TopoDS_Shape& theShape, - const Handle(Prs3d_Drawer)& theDrawer) -{ - if (theDrawer->TypeOfDeflection() != Aspect_TOD_RELATIVE) - { - return theDrawer->MaximalChordialDeviation(); - } - - Bnd_Box aBndBox; - BRepBndLib::Add (theShape, aBndBox, Standard_False); - if (aBndBox.IsVoid()) - { - return theDrawer->MaximalChordialDeviation(); - } - else if (aBndBox.IsOpen()) - { - if (!aBndBox.HasFinitePart()) - { - return theDrawer->MaximalChordialDeviation(); - } - aBndBox = aBndBox.FinitePart(); - } - - Graphic3d_Vec3d aVecMin, aVecMax; - aBndBox.Get (aVecMin.x(), aVecMin.y(), aVecMin.z(), aVecMax.x(), aVecMax.y(), aVecMax.z()); - const Graphic3d_Vec3d aDiag = aVecMax - aVecMin; - const Standard_Real aDeflection = aDiag.maxComp() * theDrawer->DeviationCoefficient() * 4.0; - - // we store computed relative deflection of shape as absolute deviation coefficient - // in case relative type to use it later on for sub-shapes. - theDrawer->SetMaximalChordialDeviation (aDeflection); - return aDeflection; -} - //================================================================== // function: PrimitivesFromPolylines // purpose: @@ -140,7 +170,7 @@ thePolylines.Clear(); if (!aPrims.IsNull()) { - Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePrs); + Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); aGroup->SetPrimitivesAspect (theAspect->Aspect()); aGroup->AddPrimitiveArray (aPrims); } diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_DatumAspect.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_DatumAspect.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_DatumAspect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_DatumAspect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -174,16 +174,15 @@ // function : DumpJson // purpose : // ======================================================================= -void Prs3d_DatumAspect::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Prs3d_DatumAspect::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Prs3d_DatumAspect); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTextAspect.get()); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPointAspect.get()); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myArrowAspect.get()); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTextAspect.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPointAspect.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myArrowAspect.get()) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAxes); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDrawLabels); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDrawArrows); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAxes) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDrawLabels) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDrawArrows) } - diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_DatumAspect.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_DatumAspect.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_DatumAspect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_DatumAspect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -154,7 +154,7 @@ Standard_EXPORT Prs3d_DatumParts ArrowPartForAxis (Prs3d_DatumParts thePart) const; //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; private: Prs3d_DatumAxes myAxes; diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_DimensionAspect.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_DimensionAspect.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_DimensionAspect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_DimensionAspect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -65,23 +65,22 @@ // function : DumpJson // purpose : // ======================================================================= -void Prs3d_DimensionAspect::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Prs3d_DimensionAspect::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Prs3d_DimensionAspect); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myLineAspect.get()); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTextAspect.get()); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myArrowAspect.get()); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myLineAspect.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTextAspect.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myArrowAspect.get()) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myValueStringFormat); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myExtensionSize); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myArrowTailSize); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myArrowOrientation); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTextHPosition); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTextVPosition); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDisplayUnits); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsText3d); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsTextShaded); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsArrows3d); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myValueStringFormat) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myExtensionSize) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myArrowTailSize) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myArrowOrientation) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTextHPosition) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTextVPosition) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDisplayUnits) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsText3d) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsTextShaded) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsArrows3d) } - diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_DimensionAspect.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_DimensionAspect.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_DimensionAspect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_DimensionAspect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -116,7 +116,7 @@ const TCollection_AsciiString& ValueStringFormat() const { return myValueStringFormat; } //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Drawer.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Drawer.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Drawer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Drawer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,12 +59,8 @@ myTypeOfHLR (Prs3d_TOH_NotSet), myDeviationCoefficient (0.001), myHasOwnDeviationCoefficient (Standard_False), - myHLRDeviationCoefficient (0.02), - myHasOwnHLRDeviationCoefficient (Standard_False), - myDeviationAngle (12.0 * M_PI / 180.0), + myDeviationAngle (20.0 * M_PI / 180.0), myHasOwnDeviationAngle (Standard_False), - myHLRAngle (20.0 * M_PI / 180.0), - myHasOwnHLRDeviationAngle (Standard_False), myIsoOnPlane (Standard_False), myHasOwnIsoOnPlane (Standard_False), myIsoOnTriangulation (Standard_False), @@ -224,18 +220,6 @@ } //======================================================================= -//function : SetHLRDeviationCoefficient -//purpose : -//======================================================================= - -void Prs3d_Drawer::SetHLRDeviationCoefficient (const Standard_Real theCoefficient) -{ - myPreviousHLRDeviationCoefficient = HLRDeviationCoefficient(); - myHLRDeviationCoefficient = theCoefficient; - myHasOwnHLRDeviationCoefficient = Standard_True; -} - -//======================================================================= //function : SetDeviationAngle //purpose : //======================================================================= @@ -247,18 +231,6 @@ myHasOwnDeviationAngle = Standard_True; } -//======================================================================= -//function : SetHLRAngle -//purpose : -//======================================================================= - -void Prs3d_Drawer::SetHLRAngle (const Standard_Real theAngle) -{ - myPreviousHLRDeviationAngle = HLRAngle(); - myHLRAngle = theAngle; - myHasOwnHLRDeviationAngle = Standard_True; -} - // ======================================================================= // function : SetAutoTriangulation // purpose : @@ -1101,9 +1073,7 @@ myHasOwnTypeOfDeflection = Standard_False; myHasOwnChordialDeviation = Standard_False; myHasOwnDeviationCoefficient = Standard_False; - myHasOwnHLRDeviationCoefficient = Standard_False; myHasOwnDeviationAngle = Standard_False; - myHasOwnHLRDeviationAngle = Standard_False; myHasOwnIsoOnPlane = Standard_False; myHasOwnIsoOnTriangulation = Standard_False; myHasOwnIsAutoTriangulated = Standard_False; @@ -1415,8 +1385,85 @@ // function : DumpJson // purpose : // ======================================================================= -void Prs3d_Drawer::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Prs3d_Drawer::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Prs3d_Drawer); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myShadingAspect.get()); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myLink.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnNbPoints) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaximalParameterValue) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnMaximalParameterValue) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myChordialDeviation) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnChordialDeviation) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTypeOfDeflection) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnTypeOfDeflection) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTypeOfHLR) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDeviationCoefficient) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPreviousDeviationCoefficient) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDeviationCoefficient) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDeviationAngle) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDeviationAngle) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPreviousDeviationAngle) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsoOnPlane) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnIsoOnPlane) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsoOnTriangulation) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnIsoOnTriangulation) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsAutoTriangulated) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnIsAutoTriangulated) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnUIsoAspect) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnVIsoAspect) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnWireAspect) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myWireDraw) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnWireDraw) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnPointAspect) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnLineAspect) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTextAspect.get()) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myShadingAspect.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnShadingAspect) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnPlaneAspect) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnSeenLineAspect) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnArrowAspect) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLineArrowDraw) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnLineArrowDraw) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnHiddenLineAspect) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawHiddenLine) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDrawHiddenLine) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnVectorAspect) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myVertexDrawMode) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDatumAspect) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnSectionAspect) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnFreeBoundaryAspect) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFreeBoundaryDraw) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnFreeBoundaryDraw) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnUnFreeBoundaryAspect) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUnFreeBoundaryDraw) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnUnFreeBoundaryDraw) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFaceBoundaryUpperContinuity) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnFaceBoundaryAspect) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFaceBoundaryDraw) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnFaceBoundaryDraw) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDimensionAspect) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDimLengthModelUnits) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDimAngleModelUnits) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDimLengthDisplayUnits) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnDimAngleDisplayUnits) } diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Drawer.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Drawer.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Drawer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Drawer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -213,61 +213,11 @@ } } - //! Sets the deviation coefficient aCoefficient for removal - //! of hidden lines created by different viewpoints in - //! different presentations. The Default value is 0.02. - //! Also sets the hasOwnHLRDeviationCoefficient flag to Standard_True and myPreviousHLRDeviationCoefficient - Standard_EXPORT void SetHLRDeviationCoefficient (const Standard_Real theCoefficient); - - //! Returns the real number value of the hidden line - //! removal deviation coefficient in this framework, if the flag - //! hasOwnHLRDeviationCoefficient is true or there is no Link. - //! Else the shape's HLR deviation coefficient is used. - //! A Deviation coefficient is used in the shading display - //! mode. The shape is seen decomposed into triangles. - //! These are used to calculate reflection of light from the - //! surface of the object. - //! The triangles are formed from chords of the curves in - //! the shape. The deviation coefficient give the highest - //! value of the angle with which a chord can deviate - //! from a tangent to a curve. If this limit is reached, a new triangle is begun. - //! To find the hidden lines, hidden line display mode - //! entails recalculation of the view at each different projector perspective. - //! Since hidden lines entail calculations of more than - //! usual complexity to decompose them into these - //! triangles, a deviation coefficient allowing greater - //! tolerance is used. This increases efficiency in calculation. - //! The Default value is 0.02. - Standard_Real HLRDeviationCoefficient() const - { - return HasOwnHLRDeviationCoefficient() || myLink.IsNull() - ? myHLRDeviationCoefficient - : myLink->HLRDeviationCoefficient(); - } - - //! Sets the hasOwnHLRDeviationCoefficient flag to Standard_False - void SetHLRDeviationCoefficient() - { - myHasOwnHLRDeviationCoefficient = Standard_False; - } - - //! Returns true if the there is a setting for HLR deviation - //! coefficient in this framework for a specific interactive object. - Standard_Boolean HasOwnHLRDeviationCoefficient() const { return myHasOwnHLRDeviationCoefficient; } - - //! Returns the previous value of the hidden line removal deviation coefficient. - Standard_Real PreviousHLRDeviationCoefficient() const - { - return myHasOwnHLRDeviationCoefficient - ? myPreviousHLRDeviationCoefficient - : 0.0; - } - //! Sets the deviation angle theAngle. //! Also sets the hasOwnDeviationAngle flag to Standard_True, and myPreviousDeviationAngle. Standard_EXPORT void SetDeviationAngle (const Standard_Real theAngle); - //! Returns the value for deviation angle. + //! Returns the value for deviation angle in radians, 20 * M_PI / 180 by default. Standard_Real DeviationAngle() const { return HasOwnDeviationAngle() || myLink.IsNull() @@ -302,39 +252,6 @@ } } - //! Sets anAngle, the angle of maximum chordal deviation for removal of hidden lines created by - //! different viewpoints in different presentations. - //! The default value is 20 * M_PI / 180. - //! Also sets the hasOwnHLRDeviationAngle flag to Standard_True and myPreviousHLRDeviationAngle. - Standard_EXPORT void SetHLRAngle (const Standard_Real theAngle); - - //! Returns the real number value of the deviation angle - //! in hidden line removal views. The default value is 20 * M_PI / 180. - Standard_Real HLRAngle() const - { - return HasOwnHLRDeviationAngle() || myLink.IsNull() - ? myHLRAngle - : myLink->HLRAngle(); - } - - //! Sets the hasOwnHLRDeviationAngle flag to Standard_False - void SetHLRAngle() - { - myHasOwnHLRDeviationAngle = Standard_False; - } - - //! Returns true if the there is a setting for HLR deviation - //! angle in this framework for a specific interactive object. - Standard_Boolean HasOwnHLRDeviationAngle() const { return myHasOwnHLRDeviationAngle; } - - //! Returns the previous value of the HLR deviation angle. - Standard_Real PreviousHLRDeviationAngle() const - { - return myHasOwnHLRDeviationAngle - ? myPreviousHLRDeviationAngle - : 0.0; - } - //! Sets IsAutoTriangulated on or off by setting the parameter theIsEnabled to true or false. //! If this flag is True automatic re-triangulation with deflection-check logic will be applied. //! Else this feature will be disable and triangulation is expected to be computed by application itself @@ -485,7 +402,7 @@ //! Returns settings for shading aspects. //! These settings can be edited. The default values are: //! - Color: Quantity_NOC_YELLOW - //! - Material: Graphic3d_NOM_BRASS + //! - Material: Graphic3d_NameOfMaterial_Brass //! Shading aspect is obtained through decomposition of //! 3d faces into triangles, each side of each triangle //! being a chord of the corresponding curved edge in the face. @@ -892,7 +809,24 @@ bool theToOverrideDefaults = false); //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + +public: //! @name deprecated methods + + Standard_DEPRECATED("SetDeviationAngle() should be used instead") + void SetHLRAngle (const Standard_Real theAngle) { SetDeviationAngle (theAngle); } + + Standard_DEPRECATED("DeviationAngle() should be used instead") + Standard_Real HLRAngle() const { return DeviationAngle(); } + + Standard_DEPRECATED("SetDeviationAngle() should be used instead") + void SetHLRAngle() { SetDeviationAngle(); } + + Standard_DEPRECATED("HasOwnDeviationAngle() should be used instead") + Standard_Boolean HasOwnHLRDeviationAngle() const { return HasOwnDeviationAngle(); } + + Standard_DEPRECATED("PreviousDeviationAngle() should be used instead") + Standard_Real PreviousHLRDeviationAngle() const { return PreviousDeviationAngle(); } protected: @@ -910,15 +844,9 @@ Standard_Real myDeviationCoefficient; Standard_Real myPreviousDeviationCoefficient; Standard_Boolean myHasOwnDeviationCoefficient; - Standard_Real myHLRDeviationCoefficient; - Standard_Boolean myHasOwnHLRDeviationCoefficient; - Standard_Real myPreviousHLRDeviationCoefficient; Standard_Real myDeviationAngle; Standard_Boolean myHasOwnDeviationAngle; Standard_Real myPreviousDeviationAngle; - Standard_Real myHLRAngle; - Standard_Boolean myHasOwnHLRDeviationAngle; - Standard_Real myPreviousHLRDeviationAngle; Standard_Boolean myIsoOnPlane; Standard_Boolean myHasOwnIsoOnPlane; Standard_Boolean myIsoOnTriangulation; diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,15 +17,14 @@ #ifndef _Prs3d_HeaderFile #define _Prs3d_HeaderFile +#include #include -#include #include -#include #include #include #include -class TopoDS_Shape; +class Poly_Triangulation; //! The Prs3d package provides the following services //! - a presentation object (the context for all @@ -49,20 +48,48 @@ //! draws an arrow at a given location, with respect //! to a given direction. Standard_EXPORT static Standard_Boolean MatchSegment (const Standard_Real X, const Standard_Real Y, const Standard_Real Z, const Standard_Real aDistance, const gp_Pnt& p1, const gp_Pnt& p2, Standard_Real& dist); - - //! Computes the absolute deflection value depending on - //! the type of deflection in theDrawer: - //!
    - //!
  • Aspect_TOD_RELATIVE: the absolute deflection is computed using the relative - //! deviation coefficient from theDrawer and the shape's bounding box;
  • - //!
  • Aspect_TOD_ABSOLUTE: the maximal chordial deviation from theDrawer is returned.
  • - //!
- //! In case of the type of deflection in theDrawer computed relative deflection for shape - //! is stored as absolute deflection. It is necessary to use it later on for sub-shapes. - //! This function should always be used to compute the deflection value for building - //! discrete representations of the shape (triangualtion, wireframe) to avoid incosistencies - //! between different representations of the shape and undesirable visual artifacts. - Standard_EXPORT static Standard_Real GetDeflection (const TopoDS_Shape& theShape, const Handle(Prs3d_Drawer)& theDrawer); + + //! Computes the absolute deflection value based on relative deflection Prs3d_Drawer::DeviationCoefficient(). + //! @param theBndMin [in] bounding box min corner + //! @param theBndMax [in] bounding box max corner + //! @param theDeviationCoefficient [in] relative deflection coefficient from Prs3d_Drawer::DeviationCoefficient() + //! @return absolute deflection coefficient based on bounding box dimensions + static Standard_Real GetDeflection (const Graphic3d_Vec3d& theBndMin, + const Graphic3d_Vec3d& theBndMax, + const Standard_Real theDeviationCoefficient) + { + const Graphic3d_Vec3d aDiag = theBndMax - theBndMin; + return aDiag.maxComp() * theDeviationCoefficient * 4.0; + } + + //! Computes the absolute deflection value based on relative deflection Prs3d_Drawer::DeviationCoefficient(). + //! @param theBndBox [in] bounding box + //! @param theDeviationCoefficient [in] relative deflection coefficient from Prs3d_Drawer::DeviationCoefficient() + //! @param theMaximalChordialDeviation [in] absolute deflection coefficient from Prs3d_Drawer::MaximalChordialDeviation() + //! @return absolute deflection coefficient based on bounding box dimensions or theMaximalChordialDeviation if bounding box is Void or Infinite + static Standard_Real GetDeflection (const Bnd_Box& theBndBox, + const Standard_Real theDeviationCoefficient, + const Standard_Real theMaximalChordialDeviation) + { + if (theBndBox.IsVoid()) + { + return theMaximalChordialDeviation; + } + + Bnd_Box aBndBox = theBndBox; + if (theBndBox.IsOpen()) + { + if (!theBndBox.HasFinitePart()) + { + return theMaximalChordialDeviation; + } + aBndBox = theBndBox.FinitePart(); + } + + Graphic3d_Vec3d aVecMin, aVecMax; + aBndBox.Get (aVecMin.x(), aVecMin.y(), aVecMin.z(), aVecMax.x(), aVecMax.y(), aVecMax.z()); + return GetDeflection (aVecMin, aVecMax, theDeviationCoefficient); + } //! Assembles array of primitives for sequence of polylines. //! @param thePoints [in] the polylines sequence @@ -74,6 +101,14 @@ const Handle(Prs3d_LineAspect)& theAspect, Prs3d_NListOfSequenceOfPnt& thePolylines); + //! Add triangulation free edges into sequence of line segments. + //! @param theSegments [out] sequence of line segments to fill + //! @param thePolyTri [in] triangulation to process + //! @param theLocation [in] transformation to apply + Standard_EXPORT static void AddFreeEdges (TColgp_SequenceOfPnt& theSegments, + const Handle(Poly_Triangulation)& thePolyTri, + const gp_Trsf& theLocation); + }; #endif // _Prs3d_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_LineAspect.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_LineAspect.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_LineAspect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_LineAspect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,9 +34,8 @@ // function : DumpJson // purpose : // ======================================================================= -void Prs3d_LineAspect::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Prs3d_LineAspect::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Prs3d_LineAspect); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspect.get()); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspect.get()) } - diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_LineAspect.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_LineAspect.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_LineAspect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_LineAspect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -64,7 +64,7 @@ void SetAspect (const Handle(Graphic3d_AspectLine3d)& theAspect) { myAspect = theAspect; } //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PlaneAspect.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PlaneAspect.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PlaneAspect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PlaneAspect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,23 +44,22 @@ // function : DumpJson // purpose : // ======================================================================= -void Prs3d_PlaneAspect::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Prs3d_PlaneAspect::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Prs3d_PlaneAspect); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myEdgesAspect.get()); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myIsoAspect.get()); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myArrowAspect.get()); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myEdgesAspect.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myIsoAspect.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myArrowAspect.get()) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myArrowsLength); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myArrowsSize); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myArrowsAngle); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPlaneXLength); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPlaneYLength); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsoDistance); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawCenterArrow); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawEdgesArrows); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawEdges); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawIso); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myArrowsLength) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myArrowsSize) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myArrowsAngle) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPlaneXLength) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPlaneYLength) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsoDistance) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawCenterArrow) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawEdgesArrows) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawEdges) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDrawIso) } - diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PlaneAspect.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PlaneAspect.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PlaneAspect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PlaneAspect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -97,7 +97,7 @@ Standard_Real IsoDistance() const { return myIsoDistance; } //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PointAspect.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PointAspect.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PointAspect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PointAspect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,9 +47,8 @@ // function : DumpJson // purpose : // ======================================================================= -void Prs3d_PointAspect::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Prs3d_PointAspect::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Prs3d_PointAspect); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspect.get()); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspect.get()) } - diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PointAspect.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PointAspect.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PointAspect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PointAspect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -62,7 +62,7 @@ const Handle(Graphic3d_MarkerImage)& GetTexture() const { return myAspect->GetMarkerImage(); } //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Point.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Point.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Point.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Point.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,10 +19,9 @@ #include #include #include -#include template -class Prs3d_Point : Prs3d_Root +class Prs3d_Point { public: DEFINE_STANDARD_ALLOC @@ -41,11 +40,11 @@ public: Standard_EXPORT static void Add - (const Handle (Prs3d_Presentation)& thePresentation, + (const Handle (Prs3d_Presentation)& thePrs, const AnyPoint& thePoint, const Handle (Prs3d_Drawer)& theDrawer) { - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup(thePresentation); + Handle(Graphic3d_Group) aGroup = thePrs->CurrentGroup(); aGroup->SetPrimitivesAspect(theDrawer->PointAspect()->Aspect()); DrawPoint(thePoint, aGroup); } diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PresentationShadow.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PresentationShadow.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PresentationShadow.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PresentationShadow.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,3 +38,17 @@ { // } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Prs3d_PresentationShadow::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Graphic3d_Structure) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myParentAffinity.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myParentStructId) +} diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PresentationShadow.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PresentationShadow.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_PresentationShadow.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_PresentationShadow.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,6 +37,9 @@ //! Do nothing - axis-aligned bounding box should be initialized from parent structure. Standard_EXPORT virtual void CalculateBoundBox() Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + private: Handle(Graphic3d_ViewAffinity) myParentAffinity; diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Projector.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Projector.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Projector.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Projector.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(Prs3d_Projector,Standard_Transient) - -Prs3d_Projector::Prs3d_Projector (const HLRAlgo_Projector& HLPr): MyProjector(HLPr) -{} - - - -Prs3d_Projector::Prs3d_Projector (const Standard_Boolean Pers, - const Standard_Real Focus, - const Standard_Real DX, - const Standard_Real DY, - const Standard_Real DZ, - const Standard_Real XAt, - const Standard_Real YAt, - const Standard_Real ZAt, - const Standard_Real XUp, - const Standard_Real YUp, - const Standard_Real ZUp) -{ - gp_Pnt At (XAt,YAt,ZAt); - gp_Dir Zpers (DX,DY,DZ); - gp_Dir Ypers (XUp,YUp,ZUp); - gp_Dir Xpers = Ypers.Crossed(Zpers); - gp_Ax3 Axe (At, Zpers, Xpers); - gp_Trsf T; - T.SetTransformation(Axe); - MyProjector = HLRAlgo_Projector(T,Pers,Focus); -} - - -HLRAlgo_Projector Prs3d_Projector::Projector () const -{ - return MyProjector; -} diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Projector.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Projector.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Projector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Projector.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -// Created on: 1993-03-19 -// Created by: Jean-Louis FRENKEL -// Copyright (c) 1993-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _Prs3d_Projector_HeaderFile -#define _Prs3d_Projector_HeaderFile - -#include -#include - -#include -#include -#include - -class Prs3d_Projector; -DEFINE_STANDARD_HANDLE(Prs3d_Projector, Standard_Transient) - -//! A projector object. -//! This object defines the parameters of a view for a -//! visualization algorithm. It is, for example, used by the -//! hidden line removal algorithms. -class Prs3d_Projector : public Standard_Transient -{ - -public: - - - Standard_EXPORT Prs3d_Projector(const HLRAlgo_Projector& Pr); - - //! Constructs a projector framework from the following parameters - //! - Pers is true if the view is a perspective view and - //! false if it is an axonometric one; - //! - Focus is the focal length if a perspective view is defined; - //! - DX, DY and DZ are the coordinates of the - //! projection vector; - //! - XAt, YAt and ZAt are the coordinates of the view point; - //! - XUp, YUp and ZUp are the coordinates of the - //! vertical direction vector. - Standard_EXPORT Prs3d_Projector(const Standard_Boolean Pers, const Standard_Real Focus, const Standard_Real DX, const Standard_Real DY, const Standard_Real DZ, const Standard_Real XAt, const Standard_Real YAt, const Standard_Real ZAt, const Standard_Real XUp, const Standard_Real YUp, const Standard_Real ZUp); - - //! Returns a projector object for use in a hidden line removal algorithm. - Standard_EXPORT HLRAlgo_Projector Projector() const; - - DEFINE_STANDARD_RTTIEXT(Prs3d_Projector,Standard_Transient) - -private: - - HLRAlgo_Projector MyProjector; - -}; - -#endif // _Prs3d_Projector_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Root.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Root.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Root.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Root.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,15 +30,13 @@ DEFINE_STANDARD_ALLOC - //! Returns the current (last created) group of primititves inside graphic objects in the display. - //! A group also contains the attributes whose ranges are limited to the primitives in it. + Standard_DEPRECATED("This method is deprecated - Prs3d_Presentation::CurrentGroup() should be called instead") static Handle(Graphic3d_Group) CurrentGroup (const Handle(Prs3d_Presentation)& thePrs3d) { return thePrs3d->CurrentGroup(); } - //! Returns the new group of primitives inside graphic objects in the display. - //! A group also contains the attributes whose ranges are limited to the primitives in it. + Standard_DEPRECATED("This method is deprecated - Prs3d_Presentation::NewGroup() should be called instead") static Handle(Graphic3d_Group) NewGroup (const Handle(Prs3d_Presentation)& thePrs3d) { return thePrs3d->NewGroup(); diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ShadingAspect.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ShadingAspect.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ShadingAspect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ShadingAspect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,7 @@ //======================================================================= Prs3d_ShadingAspect::Prs3d_ShadingAspect() { - const Graphic3d_MaterialAspect aMat (Graphic3d_NOM_BRASS); + const Graphic3d_MaterialAspect aMat (Graphic3d_NameOfMaterial_Brass); const Quantity_Color aColor = aMat.AmbientColor(); myAspect = new Graphic3d_AspectFillArea3d (Aspect_IS_SOLID, aColor, @@ -144,12 +144,14 @@ || theModel == Aspect_TOFM_BOTH_SIDE) { myAspect->ChangeFrontMaterial().SetTransparency (Standard_ShortReal(theValue)); + myAspect->SetInteriorColor (Quantity_ColorRGBA (myAspect->InteriorColor(), 1.0f - Standard_ShortReal(theValue))); } if (theModel == Aspect_TOFM_BACK_SIDE || theModel == Aspect_TOFM_BOTH_SIDE) { myAspect->ChangeBackMaterial().SetTransparency (Standard_ShortReal(theValue)); + myAspect->SetBackInteriorColor (Quantity_ColorRGBA (myAspect->BackInteriorColor(), 1.0f - Standard_ShortReal(theValue))); } } @@ -174,9 +176,9 @@ // function : DumpJson // purpose : // ======================================================================= -void Prs3d_ShadingAspect::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Prs3d_ShadingAspect::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Prs3d_ShadingAspect); - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspect.get()); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myAspect.get()) } diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ShadingAspect.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ShadingAspect.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ShadingAspect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ShadingAspect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -63,7 +63,7 @@ void SetAspect (const Handle(Graphic3d_AspectFillArea3d)& theAspect) { myAspect = theAspect; } //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ShapeTool.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ShapeTool.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ShapeTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ShapeTool.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,349 +0,0 @@ -// Created on: 1995-08-07 -// Created by: Modelistation -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//======================================================================= -//function : Prs3d_ShapeTool -//purpose : -//======================================================================= -Prs3d_ShapeTool::Prs3d_ShapeTool (const TopoDS_Shape& theShape, - const Standard_Boolean theAllVertices) -: myShape (theShape) -{ - myEdgeMap.Clear(); - myVertexMap.Clear(); - TopExp::MapShapesAndAncestors (theShape,TopAbs_EDGE,TopAbs_FACE, myEdgeMap); - - TopExp_Explorer anExpl; - if (theAllVertices) - { - for (anExpl.Init (theShape, TopAbs_VERTEX); anExpl.More(); anExpl.Next()) - { - myVertexMap.Add (anExpl.Current()); - } - } - else - { - // Extracting isolated vertices - for (anExpl.Init (theShape, TopAbs_VERTEX, TopAbs_EDGE); anExpl.More(); anExpl.Next()) - { - myVertexMap.Add (anExpl.Current()); - } - - // Extracting internal vertices - for (anExpl.Init (theShape, TopAbs_EDGE); anExpl.More(); anExpl.Next()) - { - TopoDS_Iterator aIt (anExpl.Current(), Standard_False, Standard_True); - for (; aIt.More(); aIt.Next()) - { - const TopoDS_Shape& aV = aIt.Value(); - if (aV.Orientation() == TopAbs_INTERNAL) - { - myVertexMap.Add (aV); - } - } - } - } -} - -//======================================================================= -//function : InitFace -//purpose : -//======================================================================= - -void Prs3d_ShapeTool::InitFace() -{ - myFaceExplorer.Init(myShape,TopAbs_FACE); -} - -//======================================================================= -//function : MoreFace -//purpose : -//======================================================================= - -Standard_Boolean Prs3d_ShapeTool::MoreFace() const -{ - return myFaceExplorer.More(); -} - -//======================================================================= -//function : NextFace -//purpose : -//======================================================================= - -void Prs3d_ShapeTool::NextFace() -{ - myFaceExplorer.Next(); -} - -//======================================================================= -//function : GetFace -//purpose : -//======================================================================= - -const TopoDS_Face& Prs3d_ShapeTool::GetFace () const -{ - return TopoDS::Face(myFaceExplorer.Current()); -} - - -//======================================================================= -//function : FaceBound -//purpose : -//======================================================================= - -Bnd_Box Prs3d_ShapeTool::FaceBound() const -{ - const TopoDS_Face& F = TopoDS::Face(myFaceExplorer.Current()); - Bnd_Box B; - BRepBndLib::Add(F, B); - return B; -} - -//======================================================================= -//function : IsPlanarFace -//purpose : -//======================================================================= - -Standard_Boolean Prs3d_ShapeTool::IsPlanarFace (const TopoDS_Face& theFace) -{ - TopLoc_Location l; - const Handle(Geom_Surface)& S = BRep_Tool::Surface(theFace, l); - if (S.IsNull()) - { - return Standard_False; - } - - Handle(Standard_Type) TheType = S->DynamicType(); - - if (TheType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { - Handle(Geom_RectangularTrimmedSurface) - RTS = Handle(Geom_RectangularTrimmedSurface)::DownCast (S); - TheType = RTS->BasisSurface()->DynamicType(); - } - return (TheType == STANDARD_TYPE(Geom_Plane)); -} - - - -//======================================================================= -//function : InitCurve -//purpose : -//======================================================================= - -void Prs3d_ShapeTool::InitCurve() -{ - myEdge = 1; -} - -//======================================================================= -//function : MoreCurve -//purpose : -//======================================================================= - -Standard_Boolean Prs3d_ShapeTool::MoreCurve() const -{ - return myEdge <= myEdgeMap.Extent(); -} - -//======================================================================= -//function : NextCurve -//purpose : -//======================================================================= - -void Prs3d_ShapeTool::NextCurve() -{ - myEdge++; -} - -//======================================================================= -//function : GetCurve -//purpose : -//======================================================================= - -const TopoDS_Edge& Prs3d_ShapeTool::GetCurve () const -{ - return TopoDS::Edge(myEdgeMap.FindKey(myEdge)); -} - -//======================================================================= -//function : CurveBound -//purpose : -//======================================================================= - -Bnd_Box Prs3d_ShapeTool::CurveBound () const -{ - const TopoDS_Edge& E = TopoDS::Edge(myEdgeMap.FindKey(myEdge)); - Bnd_Box B; - BRepBndLib::Add(E, B); - return B; -} - -//======================================================================= -//function : Neighbours -//purpose : -//======================================================================= - -Standard_Integer Prs3d_ShapeTool::Neighbours () const -{ - const TopTools_ListOfShape& L = myEdgeMap.FindFromIndex(myEdge); - return L.Extent(); -} - -//======================================================================= -//function : FacesOfEdge -//purpose : -//======================================================================= - -Handle(TopTools_HSequenceOfShape) Prs3d_ShapeTool::FacesOfEdge () const -{ - Handle(TopTools_HSequenceOfShape) H = new TopTools_HSequenceOfShape; - - const TopTools_ListOfShape& L = myEdgeMap.FindFromIndex(myEdge); - TopTools_ListIteratorOfListOfShape LI; - - for (LI.Initialize(L); LI.More(); LI.Next()) H->Append(LI.Value()); - return H; -} - - -//======================================================================= -//function : InitVertex -//purpose : -//======================================================================= - -void Prs3d_ShapeTool::InitVertex() -{ - myVertex = 1; -} - -//======================================================================= -//function : MoreVertex -//purpose : -//======================================================================= - -Standard_Boolean Prs3d_ShapeTool::MoreVertex() const -{ - return myVertex <= myVertexMap.Extent(); -} - -//======================================================================= -//function : NextVertex -//purpose : -//======================================================================= - -void Prs3d_ShapeTool::NextVertex() -{ - myVertex++; -} - -//======================================================================= -//function : GetVertex -//purpose : -//======================================================================= - -const TopoDS_Vertex& Prs3d_ShapeTool::GetVertex () const -{ - return TopoDS::Vertex(myVertexMap.FindKey(myVertex)); -} - - -//======================================================================= -//function : HasSurface -//purpose : -//======================================================================= - -Standard_Boolean Prs3d_ShapeTool::HasSurface() const -{ - TopLoc_Location l; - const Handle(Geom_Surface)& S = BRep_Tool::Surface(GetFace(), l); - return (!S.IsNull()); -} - - - -//======================================================================= -//function : CurrentTriangulation -//purpose : -//======================================================================= - -Handle(Poly_Triangulation) Prs3d_ShapeTool::CurrentTriangulation(TopLoc_Location& l) const -{ - return BRep_Tool::Triangulation(GetFace(), l); -} - - -//======================================================================= -//function : HasCurve -//purpose : -//======================================================================= - -Standard_Boolean Prs3d_ShapeTool::HasCurve() const -{ - return (BRep_Tool::IsGeometric(GetCurve())); -} - - - - -//======================================================================= -//function : PolygonOnTriangulation -//purpose : -//======================================================================= - -void Prs3d_ShapeTool::PolygonOnTriangulation -(Handle(Poly_PolygonOnTriangulation)& Indices, - Handle(Poly_Triangulation)& T, - TopLoc_Location& l) const -{ - BRep_Tool::PolygonOnTriangulation(GetCurve(), Indices, T, l); -} - - - -//======================================================================= -//function : Polygon3D -//purpose : -//======================================================================= - -Handle(Poly_Polygon3D) Prs3d_ShapeTool::Polygon3D(TopLoc_Location& l) const -{ - return BRep_Tool::Polygon3D(GetCurve(), l); -} diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ShapeTool.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ShapeTool.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ShapeTool.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ShapeTool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,95 +17,9 @@ #ifndef _Prs3d_ShapeTool_HeaderFile #define _Prs3d_ShapeTool_HeaderFile -#include -#include -#include -#include -#include -#include -#include -#include +#include -class Bnd_Box; -class TopoDS_Edge; -class TopoDS_Vertex; -class Poly_Triangulation; -class Poly_PolygonOnTriangulation; -class Poly_Polygon3D; - -//! describes the behaviour requested for a wireframe -//! shape presentation. -class Prs3d_ShapeTool -{ -public: - DEFINE_STANDARD_ALLOC - - //! Constructs the tool and initializes it using theShape and theAllVertices - //! (optional) arguments. By default, only isolated and internal vertices are considered, - //! however if theAllVertices argument is equal to True, all shape's vertices are taken into account. - Standard_EXPORT Prs3d_ShapeTool(const TopoDS_Shape& theShape, const Standard_Boolean theAllVertices = Standard_False); - - Standard_EXPORT void InitFace(); - - Standard_EXPORT Standard_Boolean MoreFace() const; - - Standard_EXPORT void NextFace(); - - Standard_EXPORT const TopoDS_Face& GetFace() const; - - Standard_EXPORT Bnd_Box FaceBound() const; - - Standard_Boolean IsPlanarFace() const - { - const TopoDS_Face& aFace = TopoDS::Face (myFaceExplorer.Current()); - return IsPlanarFace (aFace); - } - - Standard_EXPORT void InitCurve(); - - Standard_EXPORT Standard_Boolean MoreCurve() const; - - Standard_EXPORT void NextCurve(); - - Standard_EXPORT const TopoDS_Edge& GetCurve() const; - - Standard_EXPORT Bnd_Box CurveBound() const; - - Standard_EXPORT Standard_Integer Neighbours() const; - - Standard_EXPORT Handle(TopTools_HSequenceOfShape) FacesOfEdge() const; - - Standard_EXPORT void InitVertex(); - - Standard_EXPORT Standard_Boolean MoreVertex() const; - - Standard_EXPORT void NextVertex(); - - Standard_EXPORT const TopoDS_Vertex& GetVertex() const; - - Standard_EXPORT Standard_Boolean HasSurface() const; - - Standard_EXPORT Handle(Poly_Triangulation) CurrentTriangulation (TopLoc_Location& l) const; - - Standard_EXPORT Standard_Boolean HasCurve() const; - - Standard_EXPORT void PolygonOnTriangulation (Handle(Poly_PolygonOnTriangulation)& Indices, Handle(Poly_Triangulation)& T, TopLoc_Location& l) const; - - Standard_EXPORT Handle(Poly_Polygon3D) Polygon3D (TopLoc_Location& l) const; - -public: - - Standard_EXPORT static Standard_Boolean IsPlanarFace (const TopoDS_Face& theFace); - -private: - - TopoDS_Shape myShape; - TopExp_Explorer myFaceExplorer; - TopTools_IndexedDataMapOfShapeListOfShape myEdgeMap; - TopTools_IndexedMapOfShape myVertexMap; - Standard_Integer myEdge; - Standard_Integer myVertex; - -}; +Standard_DEPRECATED("Alias to moved class StdPrs_ShapeTool") +typedef StdPrs_ShapeTool Prs3d_ShapeTool; #endif // _Prs3d_ShapeTool_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_TextAspect.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_TextAspect.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_TextAspect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_TextAspect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -53,15 +53,14 @@ // function : DumpJson // purpose : // ======================================================================= -void Prs3d_TextAspect::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Prs3d_TextAspect::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Prs3d_TextAspect); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTextAspect.get()); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTextAspect.get()) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHeight); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHorizontalJustification); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myVerticalJustification); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myOrientation); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHeight) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHorizontalJustification) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myVerticalJustification) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myOrientation) } - diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_TextAspect.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_TextAspect.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_TextAspect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_TextAspect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -98,7 +98,7 @@ void SetAspect (const Handle(Graphic3d_AspectText3d)& theAspect) { myTextAspect = theAspect; } //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Text.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Text.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Text.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Text.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,10 +29,10 @@ // function : Draw // purpose : // ======================================================================= -void Prs3d_Text::Draw (const Handle(Graphic3d_Group)& theGroup, - const Handle(Prs3d_TextAspect)& theAspect, - const TCollection_ExtendedString& theText, - const gp_Pnt& theAttachmentPoint) +Handle(Graphic3d_Text) Prs3d_Text::Draw (const Handle(Graphic3d_Group)& theGroup, + const Handle(Prs3d_TextAspect)& theAspect, + const TCollection_ExtendedString& theText, + const gp_Pnt& theAttachmentPoint) { theGroup->SetPrimitivesAspect (theAspect->Aspect()); @@ -42,17 +42,18 @@ aText->SetHorizontalAlignment (theAspect->HorizontalJustification()); aText->SetVerticalAlignment (theAspect->VerticalJustification()); theGroup->AddText (aText); + return aText; } // ======================================================================= // function : Draw // purpose : // ======================================================================= -void Prs3d_Text::Draw (const Handle(Graphic3d_Group)& theGroup, - const Handle(Prs3d_TextAspect)& theAspect, - const TCollection_ExtendedString& theText, - const gp_Ax2& theOrientation, - const Standard_Boolean theHasOwnAnchor) +Handle(Graphic3d_Text) Prs3d_Text::Draw (const Handle(Graphic3d_Group)& theGroup, + const Handle(Prs3d_TextAspect)& theAspect, + const TCollection_ExtendedString& theText, + const gp_Ax2& theOrientation, + const Standard_Boolean theHasOwnAnchor) { theGroup->SetPrimitivesAspect (theAspect->Aspect()); @@ -63,4 +64,5 @@ aText->SetHorizontalAlignment (theAspect->HorizontalJustification()); aText->SetVerticalAlignment (theAspect->VerticalJustification()); theGroup->AddText (aText); + return aText; } diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Text.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Text.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_Text.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_Text.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,17 +17,16 @@ #ifndef _Prs3d_Text_HeaderFile #define _Prs3d_Text_HeaderFile -#include +#include #include +#include #include -#include - class TCollection_ExtendedString; class gp_Pnt; //! A framework to define the display of texts. -class Prs3d_Text : public Prs3d_Root +class Prs3d_Text { public: @@ -38,10 +37,11 @@ //! @param theAspect presentation attributes //! @param theText text to draw //! @param theAttachmentPoint attachment point - Standard_EXPORT static void Draw (const Handle(Graphic3d_Group)& theGroup, - const Handle(Prs3d_TextAspect)& theAspect, - const TCollection_ExtendedString& theText, - const gp_Pnt& theAttachmentPoint); + //! @return text to draw + Standard_EXPORT static Handle(Graphic3d_Text) Draw (const Handle(Graphic3d_Group)& theGroup, + const Handle(Prs3d_TextAspect)& theAspect, + const TCollection_ExtendedString& theText, + const gp_Pnt& theAttachmentPoint); //! Draws the text label. //! @param theGroup group to add primitives @@ -49,11 +49,12 @@ //! @param theText text to draw //! @param theOrientation location and orientation specified in the model 3D space //! @param theHasOwnAnchor - Standard_EXPORT static void Draw (const Handle(Graphic3d_Group)& theGroup, - const Handle(Prs3d_TextAspect)& theAspect, - const TCollection_ExtendedString& theText, - const gp_Ax2& theOrientation, - const Standard_Boolean theHasOwnAnchor = Standard_True); + //! @return text to draw + Standard_EXPORT static Handle(Graphic3d_Text) Draw (const Handle(Graphic3d_Group)& theGroup, + const Handle(Prs3d_TextAspect)& theAspect, + const TCollection_ExtendedString& theText, + const gp_Ax2& theOrientation, + const Standard_Boolean theHasOwnAnchor = Standard_True); public: @@ -64,7 +65,7 @@ const TCollection_ExtendedString& theText, const gp_Pnt& theAttachmentPoint) { - Draw (Prs3d_Root::CurrentGroup (thePrs), theDrawer->TextAspect(), theText, theAttachmentPoint); + Draw (thePrs->CurrentGroup(), theDrawer->TextAspect(), theText, theAttachmentPoint); } //! Alias to another method Draw() for backward compatibility. @@ -75,7 +76,7 @@ const gp_Ax2& theOrientation, const Standard_Boolean theHasOwnAnchor = Standard_True) { - Draw (Prs3d_Root::CurrentGroup (thePrs), theAspect, theText, theOrientation, theHasOwnAnchor); + Draw (thePrs->CurrentGroup(), theAspect, theText, theOrientation, theHasOwnAnchor); } //! Alias to another method Draw() for backward compatibility. @@ -85,7 +86,7 @@ const TCollection_ExtendedString& theText, const gp_Pnt& theAttachmentPoint) { - Draw (Prs3d_Root::CurrentGroup (thePrs), theAspect, theText, theAttachmentPoint); + Draw (thePrs->CurrentGroup(), theAspect, theText, theAttachmentPoint); } }; diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolCylinder.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolCylinder.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolCylinder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolCylinder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,7 +41,7 @@ //function : Vertex //purpose : //======================================================================= -gp_Pnt Prs3d_ToolCylinder::Vertex (const Standard_Real theU, const Standard_Real theV) +gp_Pnt Prs3d_ToolCylinder::Vertex (const Standard_Real theU, const Standard_Real theV) const { const Standard_Real aU = theU * M_PI * 2.0; const Standard_Real aRadius = myBottomRadius + (myTopRadius - myBottomRadius) * theV; @@ -51,10 +51,10 @@ } //======================================================================= -//function : Add +//function : Normal //purpose : //======================================================================= -gp_Dir Prs3d_ToolCylinder::Normal (const Standard_Real theU, const Standard_Real /*theV*/) +gp_Dir Prs3d_ToolCylinder::Normal (const Standard_Real theU, const Standard_Real ) const { const Standard_Real aU = theU * M_PI * 2.0; return gp_Dir (Cos (aU) * myHeight, @@ -63,7 +63,7 @@ } //======================================================================= -//function : Perform +//function : Create //purpose : //======================================================================= Handle(Graphic3d_ArrayOfTriangles) Prs3d_ToolCylinder::Create (const Standard_Real theBottomRad, diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolCylinder.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolCylinder.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolCylinder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolCylinder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,7 +16,6 @@ #ifndef _Prs3d_ToolCylinder_HeaderFile #define _Prs3d_ToolCylinder_HeaderFile -#include #include //! Standard presentation algorithm that outputs graphical primitives for cylindrical surface. @@ -25,6 +24,13 @@ public: //! Generate primitives for 3D quadric surface and return a filled array. + //! @param theBottomRad [in] cylinder bottom radius + //! @param theTopRad [in] cylinder top radius + //! @param theHeight [in] cylinder height + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + //! @param theTrsf [in] optional transformation to apply + //! @return generated triangulation Standard_EXPORT static Handle(Graphic3d_ArrayOfTriangles) Create (const Standard_Real theBottomRad, const Standard_Real theTopRad, const Standard_Real theHeight, @@ -33,7 +39,12 @@ const gp_Trsf& theTrsf); public: - //! Initializes the algorithm. + //! Initializes the algorithm creating a cylinder. + //! @param theBottomRad [in] cylinder bottom radius + //! @param theTopRad [in] cylinder top radius + //! @param theHeight [in] cylinder height + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter Standard_EXPORT Prs3d_ToolCylinder (const Standard_Real theBottomRad, const Standard_Real theTopRad, const Standard_Real theHeight, @@ -43,16 +54,16 @@ protected: //! Computes vertex at given parameter location of the surface. - Standard_EXPORT virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) Standard_OVERRIDE; + Standard_EXPORT virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) const Standard_OVERRIDE; //! Computes normal at given parameter location of the surface. - Standard_EXPORT virtual gp_Dir Normal (const Standard_Real theU, const Standard_Real theV) Standard_OVERRIDE; + Standard_EXPORT virtual gp_Dir Normal (const Standard_Real theU, const Standard_Real theV) const Standard_OVERRIDE; protected: - Standard_Real myBottomRadius; - Standard_Real myTopRadius; - Standard_Real myHeight; + Standard_Real myBottomRadius; //!< cylinder bottom radius + Standard_Real myTopRadius; //!< cylinder top radius + Standard_Real myHeight; //!< cylinder height }; diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolDisk.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolDisk.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolDisk.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolDisk.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,7 +40,7 @@ //function : Vertex //purpose : //======================================================================= -gp_Pnt Prs3d_ToolDisk::Vertex (const Standard_Real theU, const Standard_Real theV) +gp_Pnt Prs3d_ToolDisk::Vertex (const Standard_Real theU, const Standard_Real theV) const { const Standard_Real aU = myStartAngle + theU * (myEndAngle - myStartAngle); const Standard_Real aRadius = myInnerRadius + (myOuterRadius - myInnerRadius) * theV; @@ -50,7 +50,7 @@ } //======================================================================= -//function : Perform +//function : Create //purpose : //======================================================================= Handle(Graphic3d_ArrayOfTriangles) Prs3d_ToolDisk::Create (const Standard_Real theInnerRadius, diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolDisk.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolDisk.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolDisk.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolDisk.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,7 +16,6 @@ #ifndef _Prs3d_ToolDisk_HeaderFile #define _Prs3d_ToolDisk_HeaderFile -#include #include //! Standard presentation algorithm that outputs graphical primitives for disk surface. @@ -24,7 +23,13 @@ { public: - //! Generate primitives for 3D quadric surface and return a filled array. + //! Generate primitives for 3D quadric surface. + //! @param theInnerRadius [in] inner disc radius + //! @param theOuterRadius [in] outer disc radius + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + //! @param theTrsf [in] optional transformation to apply + //! @return generated triangulation Standard_EXPORT static Handle(Graphic3d_ArrayOfTriangles) Create (const Standard_Real theInnerRadius, const Standard_Real theOuterRadius, const Standard_Integer theNbSlices, @@ -32,7 +37,11 @@ const gp_Trsf& theTrsf); public: - //! Initializes the algorithm. + //! Initializes the algorithm creating a disk. + //! @param theInnerRadius [in] inner disk radius + //! @param theOuterRadius [in] outer disk radius + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter Standard_EXPORT Prs3d_ToolDisk (const Standard_Real theInnerRadius, const Standard_Real theOuterRadius, const Standard_Integer theNbSlices, @@ -51,15 +60,18 @@ protected: //! Computes vertex at given parameter location of the surface. - Standard_EXPORT virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) Standard_OVERRIDE; + Standard_EXPORT virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) const Standard_OVERRIDE; //! Computes normal at given parameter location of the surface. - virtual gp_Dir Normal (const Standard_Real , const Standard_Real ) Standard_OVERRIDE { return gp_Dir (0.0, 0.0, -1.0); } + virtual gp_Dir Normal (const Standard_Real , const Standard_Real ) const Standard_OVERRIDE + { + return gp_Dir (0.0, 0.0, -1.0); + } protected: - Standard_Real myInnerRadius; - Standard_Real myOuterRadius; + Standard_Real myInnerRadius; //!< Inner disk radius + Standard_Real myOuterRadius; //!< Outer disk radius Standard_Real myStartAngle; //!< Start angle in counter clockwise order Standard_Real myEndAngle; //!< End angle in counter clockwise order diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolQuadric.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolQuadric.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolQuadric.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolQuadric.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,101 +21,120 @@ #include //======================================================================= -//function : fillArrays +//function : FIllArray //purpose : //======================================================================= -void Prs3d_ToolQuadric::fillArrays (const gp_Trsf& theTrsf, TColgp_Array1OfPnt& theArray, NCollection_Array1& theNormals) +void Prs3d_ToolQuadric::FillArray (Handle(Graphic3d_ArrayOfTriangles)& theArray, + const gp_Trsf& theTrsf) const { - Standard_ShortReal aStepU = 1.0f / mySlicesNb; - Standard_ShortReal aStepV = 1.0f / myStacksNb; + if (theArray.IsNull()) + { + theArray = new Graphic3d_ArrayOfTriangles (VerticesNb(), TrianglesNb() * 3, Graphic3d_ArrayFlags_VertexNormal); + } - for (Standard_Integer aU = 0; aU <= mySlicesNb; aU++) + const Standard_Real aStepU = 1.0f / mySlicesNb; + const Standard_Real aStepV = 1.0f / myStacksNb; + if (theArray->EdgeNumberAllocated() > 0) { - const Standard_Real aParamU = aU * aStepU; - for (Standard_Integer aV = 0; aV <= myStacksNb; aV++) + // indexed array + for (Standard_Integer aU = 0; aU <= mySlicesNb; ++aU) { - const Standard_ShortReal aParamV = aV * aStepV; - const Standard_Integer aVertId = aU * (myStacksNb + 1) + aV + 1; - gp_Pnt aVertex = Vertex(aParamU, aParamV); - gp_Dir aNormal = Normal(aParamU, aParamV); - - aVertex.Transform (theTrsf); - aNormal.Transform (theTrsf); - - theArray.SetValue (aVertId, aVertex); - theNormals.SetValue (aVertId, aNormal); + const Standard_Real aParamU = aU * aStepU; + for (Standard_Integer aV = 0; aV <= myStacksNb; ++aV) + { + const Standard_Real aParamV = aV * aStepV; + const gp_Pnt aVertex = Vertex (aParamU, aParamV).Transformed (theTrsf); + const gp_Dir aNormal = Normal (aParamU, aParamV).Transformed (theTrsf); + theArray->AddVertex (aVertex, aNormal); + + if (aU != 0 && aV != 0) + { + const int aVertId = theArray->VertexNumber(); + theArray->AddTriangleEdges (aVertId, aVertId - myStacksNb - 2, aVertId - 1); + theArray->AddTriangleEdges (aVertId - myStacksNb - 2, aVertId, aVertId - myStacksNb - 1); + } + } + } + } + else + { + // non-indexed array + for (Standard_Integer aU = 0; aU < mySlicesNb; ++aU) + { + const Standard_Real aParamU = aU * aStepU; + for (Standard_Integer aV = 0; aV < myStacksNb; ++aV) + { + const Standard_Real aParamV = aV * aStepV; + theArray->AddVertex (Vertex (aParamU, aParamV).Transformed (theTrsf), + Normal (aParamU, aParamV).Transformed (theTrsf)); + theArray->AddVertex (Vertex (aParamU + aStepU, aParamV).Transformed (theTrsf), + Normal (aParamU + aStepU, aParamV).Transformed (theTrsf)); + theArray->AddVertex (Vertex (aParamU + aStepU, aParamV + aStepV).Transformed (theTrsf), + Normal (aParamU + aStepU, aParamV + aStepV).Transformed (theTrsf)); + theArray->AddVertex (Vertex (aParamU + aStepU, aParamV + aStepV).Transformed (theTrsf), + Normal (aParamU + aStepU, aParamV + aStepV).Transformed (theTrsf)); + theArray->AddVertex (Vertex (aParamU, aParamV + aStepV).Transformed (theTrsf), + Normal (aParamU, aParamV + aStepV).Transformed (theTrsf)); + theArray->AddVertex (Vertex (aParamU, aParamV).Transformed (theTrsf), + Normal (aParamU, aParamV).Transformed (theTrsf)); + } } } } //======================================================================= -//function : FIllArray +//function : CreateTriangulation //purpose : //======================================================================= -void Prs3d_ToolQuadric::FillArray (Handle(Graphic3d_ArrayOfTriangles)& theArray, const gp_Trsf& theTrsf) +Handle(Graphic3d_ArrayOfTriangles) Prs3d_ToolQuadric::CreateTriangulation (const gp_Trsf& theTrsf) const { - const Standard_Integer aTrianglesNb = TrianglesNb(); - if (theArray.IsNull()) - { - theArray = new Graphic3d_ArrayOfTriangles (aTrianglesNb * 3, 0, Standard_True); - } - - Poly_Array1OfTriangle aPolyTriangles (1, aTrianglesNb); - TColgp_Array1OfPnt anArray (1, aTrianglesNb * 3); - NCollection_Array1 aNormals (1, aTrianglesNb * 3); - fillArrays (theTrsf, anArray, aNormals); - - // Fill primitives - for (Standard_Integer aU = 0; aU < mySlicesNb; ++aU) - { - for (Standard_Integer aV = 1; aV <= myStacksNb; ++aV) - { - theArray->AddVertex (anArray.Value (aU * (myStacksNb + 1) + aV), aNormals.Value (aU * (myStacksNb + 1) + aV)); - theArray->AddVertex (anArray.Value ((aU + 1) * (myStacksNb + 1) + aV), aNormals.Value ((aU + 1) * (myStacksNb + 1) + aV)); - theArray->AddVertex (anArray.Value ((aU + 1) * (myStacksNb + 1) + (aV + 1)), aNormals.Value ((aU + 1) * (myStacksNb + 1) + (aV + 1))); - theArray->AddVertex (anArray.Value ((aU + 1) * (myStacksNb + 1) + (aV + 1)), aNormals.Value ((aU + 1) * (myStacksNb + 1) + (aV + 1))); - theArray->AddVertex (anArray.Value (aU * (myStacksNb + 1) + (aV + 1)), aNormals.Value (aU * (myStacksNb + 1) + (aV + 1))); - theArray->AddVertex (anArray.Value (aU * (myStacksNb + 1) + aV), aNormals.Value (aU * (myStacksNb + 1) + aV)); - } - } + Handle(Graphic3d_ArrayOfTriangles) aTriangulation; + FillArray (aTriangulation, theTrsf); + return aTriangulation; } //======================================================================= -//function : FillTriangulation +//function : CreatePolyTriangulation //purpose : //======================================================================= -void Prs3d_ToolQuadric::FillArray (Handle(Graphic3d_ArrayOfTriangles)& theArray, - Handle(Poly_Triangulation)& theTriangulation, - const gp_Trsf& theTrsf) +Handle(Poly_Triangulation) Prs3d_ToolQuadric::CreatePolyTriangulation (const gp_Trsf& theTrsf) const { - const Standard_Integer aTrianglesNb = TrianglesNb(); - theArray = new Graphic3d_ArrayOfTriangles(aTrianglesNb * 3, 0, Standard_True); + Handle(Poly_Triangulation) aTriangulation = new Poly_Triangulation (VerticesNb(), TrianglesNb(), Standard_False); + TColgp_Array1OfPnt& aNodes = aTriangulation->ChangeNodes(); + Poly_Array1OfTriangle& aTriangles = aTriangulation->ChangeTriangles(); - Poly_Array1OfTriangle aPolyTriangles(1, aTrianglesNb); - TColgp_Array1OfPnt anArray(1, aTrianglesNb * 3); - NCollection_Array1 aNormals(1, aTrianglesNb * 3); - fillArrays(theTrsf, anArray, aNormals); + Standard_ShortReal aStepU = 1.0f / mySlicesNb; + Standard_ShortReal aStepV = 1.0f / myStacksNb; // Fill triangles - for (Standard_Integer aU = 0, anIndex = 0; aU < mySlicesNb; ++aU) + for (Standard_Integer aU = 0, anIndex = 0; aU <= mySlicesNb; ++aU) { - for (Standard_Integer aV = 1; aV <= myStacksNb; ++aV) + const Standard_Real aParamU = aU * aStepU; + for (Standard_Integer aV = 0; aV <= myStacksNb; ++aV) { - theArray->AddVertex(anArray.Value(aU * (myStacksNb + 1) + aV), aNormals.Value(aU * (myStacksNb + 1) + aV)); - theArray->AddVertex(anArray.Value((aU + 1) * (myStacksNb + 1) + aV), aNormals.Value((aU + 1) * (myStacksNb + 1) + aV)); - theArray->AddVertex(anArray.Value((aU + 1) * (myStacksNb + 1) + (aV + 1)), aNormals.Value((aU + 1) * (myStacksNb + 1) + (aV + 1))); - theArray->AddVertex(anArray.Value((aU + 1) * (myStacksNb + 1) + (aV + 1)), aNormals.Value((aU + 1) * (myStacksNb + 1) + (aV + 1))); - theArray->AddVertex(anArray.Value(aU * (myStacksNb + 1) + (aV + 1)), aNormals.Value(aU * (myStacksNb + 1) + (aV + 1))); - theArray->AddVertex(anArray.Value(aU * (myStacksNb + 1) + aV), aNormals.Value(aU * (myStacksNb + 1) + aV)); - - aPolyTriangles.SetValue (++anIndex, Poly_Triangle(aU * (myStacksNb + 1) + aV, - (aU + 1) * (myStacksNb + 1) + aV, - (aU + 1) * (myStacksNb + 1) + (aV + 1))); - aPolyTriangles.SetValue (++anIndex, Poly_Triangle((aU + 1) * (myStacksNb + 1) + (aV + 1), - aU * (myStacksNb + 1) + (aV + 1), - aU * (myStacksNb + 1) + aV)); + const Standard_ShortReal aParamV = aV * aStepV; + const Standard_Integer aVertId = aU * (myStacksNb + 1) + (aV + 1); + gp_Pnt aVertex = Vertex (aParamU, aParamV).Transformed (theTrsf); + + aNodes.SetValue (aVertId, aVertex); + if (aU != 0 && aV != 0) + { + aTriangles.SetValue (++anIndex, Poly_Triangle (aVertId, aVertId - myStacksNb - 2, aVertId - 1)); + aTriangles.SetValue (++anIndex, Poly_Triangle (aVertId - myStacksNb - 2, aVertId, aVertId - myStacksNb - 1)); + } } } + return aTriangulation; +} - theTriangulation = new Poly_Triangulation (anArray, aPolyTriangles); +//======================================================================= +//function : FillArray +//purpose : +//======================================================================= +void Prs3d_ToolQuadric::FillArray (Handle(Graphic3d_ArrayOfTriangles)& theArray, + Handle(Poly_Triangulation)& theTriangulation, + const gp_Trsf& theTrsf) const +{ + theArray = CreateTriangulation (theTrsf); + theTriangulation = CreatePolyTriangulation (theTrsf); } diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolQuadric.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolQuadric.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolQuadric.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolQuadric.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,56 +16,90 @@ #ifndef _Prs3d_ToolQuadric_HeaderFile #define _Prs3d_ToolQuadric_HeaderFile -#include -#include #include #include -#include -#include -#include -#include //! Base class to build 3D surfaces presentation of quadric surfaces. class Prs3d_ToolQuadric { public: - DEFINE_STANDARD_ALLOC - //! Generate primitives for 3D quadric surface and fill the given array. Optional transformation is applied. - Standard_EXPORT void FillArray (Handle(Graphic3d_ArrayOfTriangles)& theArray, const gp_Trsf& theTrsf); - - //! Generate primitives for 3D quadric surface presentation and fill the given array and poly triangulation structure. Optional transformation is applied. - Standard_EXPORT void FillArray (Handle(Graphic3d_ArrayOfTriangles)& theArray, Handle(Poly_Triangulation)& theTriangulation, const gp_Trsf& theTrsf); - - //! Number of triangles for presentation with the given params. + //! Return number of triangles for presentation with the given params. static Standard_Integer TrianglesNb (const Standard_Integer theSlicesNb, const Standard_Integer theStacksNb) { return theSlicesNb * theStacksNb * 2; } -protected: + //! Return number of vertices for presentation with the given params. + static Standard_Integer VerticesNb (const Standard_Integer theSlicesNb, + const Standard_Integer theStacksNb, + const Standard_Boolean theIsIndexed = Standard_True) + { + return theIsIndexed + ? (theSlicesNb + 1) * (theStacksNb + 1) + : TrianglesNb (theSlicesNb, theStacksNb) * 3; + } + +public: - //! Method implements an algorithm to generate arrays of vertices and normals for 3D surface. - Standard_EXPORT void fillArrays (const gp_Trsf& theTrsf, TColgp_Array1OfPnt& theArray, NCollection_Array1& theNormals); + //! Generate primitives for 3D quadric surface presentation. + //! @param theTrsf [in] optional transformation to apply + //! @return generated triangulation + Standard_EXPORT Handle(Graphic3d_ArrayOfTriangles) CreateTriangulation (const gp_Trsf& theTrsf) const; + + //! Generate primitives for 3D quadric surface presentation. + //! @param theTrsf [in] optional transformation to apply + //! @return generated triangulation + Standard_EXPORT Handle(Poly_Triangulation) CreatePolyTriangulation (const gp_Trsf& theTrsf) const; + + //! Generate primitives for 3D quadric surface and fill the given array. + //! @param theArray [in][out] the array of vertices; + //! when NULL, function will create an indexed array; + //! when not NULL, triangles will be appended to the end of array + //! (will raise an exception if reserved array size is not large enough) + //! @param theTrsf [in] optional transformation to apply + Standard_EXPORT void FillArray (Handle(Graphic3d_ArrayOfTriangles)& theArray, + const gp_Trsf& theTrsf) const; - //! Number of triangles in generated presentation. +public: + + //! Generate primitives for 3D quadric surface presentation. + //! @param theArray [out] generated array of triangles + //! @param theTriangulation [out] generated triangulation + //! @param theTrsf [in] optional transformation to apply + Standard_DEPRECATED("Deprecated method, CreateTriangulation() and CreatePolyTriangulation() should be used instead") + Standard_EXPORT void FillArray (Handle(Graphic3d_ArrayOfTriangles)& theArray, + Handle(Poly_Triangulation)& theTriangulation, + const gp_Trsf& theTrsf) const; + +protected: + + //! Return number of triangles in generated presentation. Standard_Integer TrianglesNb() const { return mySlicesNb * myStacksNb * 2; } + //! Return number of vertices in generated presentation. + Standard_Integer VerticesNb (const Standard_Boolean theIsIndexed = Standard_True) const + { + return theIsIndexed + ? (mySlicesNb + 1) * (myStacksNb + 1) + : TrianglesNb() * 3; + } + //! Redefine this method to generate vertex at given parameters. - virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) = 0; + virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) const = 0; //! Redefine this method to generate normal at given parameters. - virtual gp_Dir Normal (const Standard_Real theU, const Standard_Real theV) = 0; + virtual gp_Dir Normal (const Standard_Real theU, const Standard_Real theV) const = 0; protected: - Standard_Integer mySlicesNb; - Standard_Integer myStacksNb; + Standard_Integer mySlicesNb; //!< number of slices within U parameter + Standard_Integer myStacksNb; //!< number of stacks within V parameter }; #endif // _Prs3d_ToolQuadric_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolSector.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolSector.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolSector.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolSector.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,7 @@ //function : Vertex //purpose : //======================================================================= -gp_Pnt Prs3d_ToolSector::Vertex (const Standard_Real theU, const Standard_Real theV) +gp_Pnt Prs3d_ToolSector::Vertex (const Standard_Real theU, const Standard_Real theV) const { const Standard_Real aU = theU * M_PI / 2.0; const Standard_Real aRadius = myRadius * theV; @@ -46,16 +46,7 @@ } //======================================================================= -//function : Add -//purpose : -//======================================================================= -gp_Dir Prs3d_ToolSector::Normal (const Standard_Real /*theU*/, const Standard_Real /*theV*/) -{ - return gp_Dir (0.0, 0.0, -1.0); -} - -//======================================================================= -//function : Perform +//function : Create //purpose : //======================================================================= Handle(Graphic3d_ArrayOfTriangles) Prs3d_ToolSector::Create (const Standard_Real theRadius, diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolSector.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolSector.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolSector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolSector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,7 +16,6 @@ #ifndef _Prs3d_ToolSector_HeaderFile #define _Prs3d_ToolSector_HeaderFile -#include #include //! Standard presentation algorithm that outputs graphical primitives for disk surface. @@ -24,28 +23,39 @@ { public: - //! Generate primitives for 3D quadric surface and return a filled array. + //! Generate primitives for 3D quadric surface. + //! @param theRadius [in] sector radius + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + //! @param theTrsf [in] optional transformation to apply + //! @return generated triangulation Standard_EXPORT static Handle(Graphic3d_ArrayOfTriangles) Create (const Standard_Real theRadius, const Standard_Integer theNbSlices, const Standard_Integer theNbStacks, const gp_Trsf& theTrsf); public: - //! Initializes the algorithm. + //! Initializes the algorithm creating a sector (quadrant). + //! @param theRadius [in] sector radius + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter Standard_EXPORT Prs3d_ToolSector (const Standard_Real theRadius, const Standard_Integer theNbSlices, const Standard_Integer theNbStacks); protected: //! Computes vertex at given parameter location of the surface. - Standard_EXPORT virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) Standard_OVERRIDE; + Standard_EXPORT virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) const Standard_OVERRIDE; //! Computes normal at given parameter location of the surface. - Standard_EXPORT virtual gp_Dir Normal (const Standard_Real theU, const Standard_Real theV) Standard_OVERRIDE; + virtual gp_Dir Normal (const Standard_Real , const Standard_Real ) const Standard_OVERRIDE + { + return gp_Dir (0.0, 0.0, -1.0); + } protected: - Standard_Real myRadius; + Standard_Real myRadius; //!< sector radius }; diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolSphere.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolSphere.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolSphere.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolSphere.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,7 @@ //function : Vertex //purpose : //======================================================================= -gp_Pnt Prs3d_ToolSphere::Vertex (const Standard_Real theU, const Standard_Real theV) +gp_Pnt Prs3d_ToolSphere::Vertex (const Standard_Real theU, const Standard_Real theV) const { const Standard_Real aU = theU * M_PI * 2.0; const Standard_Real aV = theV * M_PI; @@ -46,10 +46,10 @@ } //======================================================================= -//function : Add +//function : Normal //purpose : //======================================================================= -gp_Dir Prs3d_ToolSphere::Normal (const Standard_Real theU, const Standard_Real theV) +gp_Dir Prs3d_ToolSphere::Normal (const Standard_Real theU, const Standard_Real theV) const { const Standard_Real aU = theU * M_PI * 2.0; const Standard_Real aV = theV * M_PI; @@ -59,7 +59,7 @@ } //======================================================================= -//function : Perform +//function : Create //purpose : //======================================================================= Handle(Graphic3d_ArrayOfTriangles) Prs3d_ToolSphere::Create (const Standard_Real theRadius, diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolSphere.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolSphere.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolSphere.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolSphere.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,14 +16,6 @@ #ifndef _Prs3d_ToolSphere_HeaderFile #define _Prs3d_ToolSphere_HeaderFile -#include -#include -#include -#include -#include -#include -#include -#include #include //! Standard presentation algorithm that outputs graphical primitives for spherical surface. @@ -31,14 +23,22 @@ { public: - //! Generate primitives for 3D quadric surface and return a filled array. + //! Generate primitives for 3D quadric surface. + //! @param theRadius [in] sphere radius + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + //! @param theTrsf [in] optional transformation to apply + //! @return generated triangulation Standard_EXPORT static Handle(Graphic3d_ArrayOfTriangles) Create (const Standard_Real theRadius, const Standard_Integer theNbSlices, const Standard_Integer theNbStacks, const gp_Trsf& theTrsf); public: - //! Initializes the algorithm. + //! Initializes the algorithm creating a sphere. + //! @param theRadius [in] sphere radius + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter Standard_EXPORT Prs3d_ToolSphere (const Standard_Real theRadius, const Standard_Integer theNbSlices, const Standard_Integer theNbStacks); @@ -46,14 +46,14 @@ protected: //! Computes vertex at given parameter location of the surface. - Standard_EXPORT virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) Standard_OVERRIDE; + Standard_EXPORT virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) const Standard_OVERRIDE; //! Computes normal at given parameter location of the surface. - Standard_EXPORT virtual gp_Dir Normal (const Standard_Real theU, const Standard_Real theV) Standard_OVERRIDE; + Standard_EXPORT virtual gp_Dir Normal (const Standard_Real theU, const Standard_Real theV) const Standard_OVERRIDE; protected: - Standard_Real myRadius; + Standard_Real myRadius; //!< sphere radius }; diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolTorus.cxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolTorus.cxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolTorus.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolTorus.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,82 @@ +// Created on: 2020-09-17 +// Created by: Marina ZERNOVA +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +//======================================================================= +//function : init +//purpose : +//======================================================================= +void Prs3d_ToolTorus::init (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Real theAngle1, + const Standard_Real theAngle2, + const Standard_Real theAngle, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks) +{ + myMajorRadius = theMajorRad; + myMinorRadius = theMinorRad; + myVMin = theAngle1; + myVMax = theAngle2; + myAngle = theAngle; + mySlicesNb = theNbSlices; + myStacksNb = theNbStacks; +} + +//======================================================================= +//function : Vertex +//purpose : +//======================================================================= +gp_Pnt Prs3d_ToolTorus::Vertex (const Standard_Real theU, const Standard_Real theV) const +{ + const Standard_Real aU = theU * myAngle; + const Standard_Real aV = myVMin + theV * (myVMax - myVMin); + return gp_Pnt ((myMajorRadius + myMinorRadius * Cos (aV)) * Cos (aU), + (myMajorRadius + myMinorRadius * Cos (aV)) * Sin (aU), + myMinorRadius * Sin (aV)); +} + +//======================================================================= +//function : Normal +//purpose : +//======================================================================= +gp_Dir Prs3d_ToolTorus::Normal (const Standard_Real theU, const Standard_Real theV) const +{ + const Standard_Real aU = theU * myAngle; + const Standard_Real aV = myVMin + theV * (myVMax - myVMin); + return gp_Dir (Cos (aU) * Cos (aV), + Sin (aU) * Cos (aV), + Sin (aV)); +} + +//======================================================================= +//function : Create +//purpose : +//======================================================================= +Handle(Graphic3d_ArrayOfTriangles) Prs3d_ToolTorus::Create (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Real theAngle1, + const Standard_Real theAngle2, + const Standard_Real theAngle, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks, + const gp_Trsf& theTrsf) +{ + Handle(Graphic3d_ArrayOfTriangles) anArray; + Prs3d_ToolTorus aTool (theMajorRad, theMinorRad, theAngle1, theAngle2, theAngle, theNbSlices, theNbStacks); + aTool.FillArray (anArray, theTrsf); + return anArray; +} diff -Nru opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolTorus.hxx opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolTorus.hxx --- opencascade-7.4.1+dfsg1/src/Prs3d/Prs3d_ToolTorus.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Prs3d/Prs3d_ToolTorus.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,201 @@ +// Created on: 2020-09-17 +// Created by: Marina ZERNOVA +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Prs3d_ToolTorus_HeaderFile +#define _Prs3d_ToolTorus_HeaderFile + +#include + +//! Standard presentation algorithm that outputs graphical primitives for torus surface. +class Prs3d_ToolTorus : public Prs3d_ToolQuadric +{ +public: + + //! Generate primitives for 3D quadric surface (complete torus). + //! @param theMajorRad [in] distance from the center of the pipe to the center of the torus + //! @param theMinorRad [in] radius of the pipe + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + //! @param theTrsf [in] optional transformation to apply + //! @return generated triangulation + static Handle(Graphic3d_ArrayOfTriangles) Create (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks, + const gp_Trsf& theTrsf) + { + return Create (theMajorRad, theMinorRad, 0.0, M_PI * 2.0, M_PI * 2.0, theNbSlices, theNbStacks, theTrsf); + } + + //! Generate primitives for 3D quadric surface (torus segment). + //! @param theMajorRad [in] distance from the center of the pipe to the center of the torus + //! @param theMinorRad [in] radius of the pipe + //! @param theAngle [in] angle to create a torus pipe segment + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + //! @param theTrsf [in] optional transformation to apply + //! @return generated triangulation + static Handle(Graphic3d_ArrayOfTriangles) Create (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Real theAngle, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks, + const gp_Trsf& theTrsf) + { + return Create (theMajorRad, theMinorRad, 0.0, M_PI * 2.0, theAngle, theNbSlices, theNbStacks, theTrsf); + } + + //! Generate primitives for 3D quadric surface (torus ring segment). + //! @param theMajorRad [in] distance from the center of the pipe to the center of the torus + //! @param theMinorRad [in] radius of the pipe + //! @param theAngle1 [in] first angle to create a torus ring segment + //! @param theAngle2 [in] second angle to create a torus ring segment + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + //! @param theTrsf [in] optional transformation to apply + //! @return generated triangulation + static Handle(Graphic3d_ArrayOfTriangles) Create (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Real theAngle1, + const Standard_Real theAngle2, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks, + const gp_Trsf& theTrsf) + { + return Create (theMajorRad, theMinorRad, theAngle1, theAngle2, M_PI * 2.0, theNbSlices, theNbStacks, theTrsf); + } + + //! Generate primitives for 3D quadric surface (segment of the torus ring segment). + //! @param theMajorRad [in] distance from the center of the pipe to the center of the torus + //! @param theMinorRad [in] radius of the pipe + //! @param theAngle1 [in] first angle to create a torus ring segment + //! @param theAngle2 [in] second angle to create a torus ring segment + //! @param theAngle [in] angle to create a torus pipe segment + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + //! @param theTrsf [in] optional transformation to apply + //! @return generated triangulation + Standard_EXPORT static Handle(Graphic3d_ArrayOfTriangles) Create (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Real theAngle1, + const Standard_Real theAngle2, + const Standard_Real theAngle, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks, + const gp_Trsf& theTrsf); + +public: + + //! Initializes the algorithm creating a complete torus. + //! @param theMajorRad [in] distance from the center of the pipe to the center of the torus + //! @param theMinorRad [in] radius of the pipe + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + Prs3d_ToolTorus (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks) + { + init (theMajorRad, theMinorRad, 0.0, M_PI * 2.0, M_PI * 2.0, theNbSlices, theNbStacks); + } + + //! Initializes the algorithm creating a torus pipe segment. + //! @param theMajorRad [in] distance from the center of the pipe to the center of the torus + //! @param theMinorRad [in] radius of the pipe + //! @param theAngle [in] angle to create a torus pipe segment + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + Prs3d_ToolTorus (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Real theAngle, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks) + { + init (theMajorRad, theMinorRad, 0.0, M_PI * 2.0, theAngle, theNbSlices, theNbStacks); + } + + //! Initializes the algorithm creating a torus ring segment. + //! @param theMajorRad [in] distance from the center of the pipe to the center of the torus + //! @param theMinorRad [in] radius of the pipe + //! @param theAngle1 [in] first angle to create a torus ring segment + //! @param theAngle2 [in] second angle to create a torus ring segment + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + Prs3d_ToolTorus (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Real theAngle1, + const Standard_Real theAngle2, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks) + { + init (theMajorRad, theMinorRad, theAngle1, theAngle2, M_PI * 2.0, theNbSlices, theNbStacks); + } + + //! Initializes the algorithm creating a torus ring segment. + //! @param theMajorRad [in] distance from the center of the pipe to the center of the torus + //! @param theMinorRad [in] radius of the pipe + //! @param theAngle1 [in] first angle to create a torus ring segment + //! @param theAngle2 [in] second angle to create a torus ring segment + //! @param theAngle [in] angle to create a torus pipe segment + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + Prs3d_ToolTorus (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Real theAngle1, + const Standard_Real theAngle2, + const Standard_Real theAngle, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks) + { + init (theMajorRad, theMinorRad, theAngle1, theAngle2, theAngle, theNbSlices, theNbStacks); + } + +private: + + //! Initialisation + //! @param theMajorRad [in] distance from the center of the pipe to the center of the torus + //! @param theMinorRad [in] radius of the pipe + //! @param theAngle1 [in] first angle to create a torus ring segment + //! @param theAngle2 [in] second angle to create a torus ring segment + //! @param theAngle [in] angle to create a torus pipe segment + //! @param theNbSlices [in] number of slices within U parameter + //! @param theNbStacks [in] number of stacks within V parameter + Standard_EXPORT void init (const Standard_Real theMajorRad, + const Standard_Real theMinorRad, + const Standard_Real theAngle1, + const Standard_Real theAngle2, + const Standard_Real theAngle, + const Standard_Integer theNbSlices, + const Standard_Integer theNbStacks); + +protected: + + //! Computes vertex at given parameter location of the surface. + Standard_EXPORT virtual gp_Pnt Vertex (const Standard_Real theU, const Standard_Real theV) const Standard_OVERRIDE; + + //! Computes normal at given parameter location of the surface. + Standard_EXPORT virtual gp_Dir Normal (const Standard_Real theU, const Standard_Real theV) const Standard_OVERRIDE; + +protected: + + Standard_Real myMajorRadius; //!< distance from the center of the pipe to the center of the torus + Standard_Real myMinorRadius; //!< radius of the pipe + Standard_Real myAngle; //!< angle to create a torus pipe segment + Standard_Real myVMin; //!< first angle to create a torus ring segment + Standard_Real myVMax; //!< second angle to create a torus ring segment + +}; + +#endif // _Prs3d_ToolTorus_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/FILES opencascade-7.5.1+dfsg1/src/PrsDim/FILES --- opencascade-7.4.1+dfsg1/src/PrsDim/FILES 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,56 @@ +PrsDim.cxx +PrsDim.hxx +PrsDim_AngleDimension.cxx +PrsDim_AngleDimension.hxx +PrsDim_Chamf2dDimension.cxx +PrsDim_Chamf2dDimension.hxx +PrsDim_Chamf3dDimension.cxx +PrsDim_Chamf3dDimension.hxx +PrsDim_ConcentricRelation.cxx +PrsDim_ConcentricRelation.hxx +PrsDim_DiameterDimension.cxx +PrsDim_DiameterDimension.hxx +PrsDim_Dimension.cxx +PrsDim_Dimension.hxx +PrsDim_DimensionOwner.cxx +PrsDim_DimensionOwner.hxx +PrsDim_EllipseRadiusDimension.cxx +PrsDim_EllipseRadiusDimension.hxx +PrsDim_EqualDistanceRelation.cxx +PrsDim_EqualDistanceRelation.hxx +PrsDim_EqualRadiusRelation.cxx +PrsDim_EqualRadiusRelation.hxx +PrsDim_FixRelation.cxx +PrsDim_FixRelation.hxx +PrsDim_IdenticRelation.cxx +PrsDim_IdenticRelation.hxx +PrsDim_LengthDimension.cxx +PrsDim_LengthDimension.hxx +PrsDim_MaxRadiusDimension.cxx +PrsDim_MaxRadiusDimension.hxx +PrsDim_MidPointRelation.cxx +PrsDim_MidPointRelation.hxx +PrsDim_MinRadiusDimension.cxx +PrsDim_MinRadiusDimension.hxx +PrsDim_OffsetDimension.cxx +PrsDim_OffsetDimension.hxx +PrsDim_ParallelRelation.cxx +PrsDim_ParallelRelation.hxx +PrsDim_PerpendicularRelation.cxx +PrsDim_PerpendicularRelation.hxx +PrsDim_RadiusDimension.cxx +PrsDim_RadiusDimension.hxx +PrsDim_Relation.cxx +PrsDim_Relation.hxx +PrsDim_SymmetricRelation.cxx +PrsDim_SymmetricRelation.hxx +PrsDim_TangentRelation.cxx +PrsDim_TangentRelation.hxx +PrsDim_DimensionSelectionMode.hxx +PrsDim_DisplaySpecialSymbol.hxx +PrsDim_KindOfDimension.hxx +PrsDim_KindOfRelation.hxx +PrsDim_KindOfSurface.hxx +PrsDim_TypeOfAngle.hxx +PrsDim_TypeOfAngleArrowVisibility.hxx +PrsDim_TypeOfDist.hxx diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_AngleDimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_AngleDimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_AngleDimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_AngleDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1452 @@ +// Created on: 1996-12-05 +// Created by: Arnaud BOUZY/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_AngleDimension, PrsDim_Dimension) + +namespace +{ + static const TCollection_ExtendedString THE_EMPTY_LABEL_STRING; + static const Standard_Real THE_EMPTY_LABEL_WIDTH = 0.0; + static const Standard_ExtCharacter THE_DEGREE_SYMBOL (0x00B0); + static const Standard_Real THE_3D_TEXT_MARGIN = 0.1; + + //! Returns true if the given points lie on a same line. + static Standard_Boolean isSameLine (const gp_Pnt& theFirstPoint, + const gp_Pnt& theCenterPoint, + const gp_Pnt& theSecondPoint) + { + gp_Vec aVec1 (theFirstPoint, theCenterPoint); + gp_Vec aVec2 (theCenterPoint, theSecondPoint); + + return aVec1.IsParallel (aVec2, Precision::Angular()); + } +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theFirstEdge, theSecondEdge); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pnt& theThirdPoint) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theFirstPoint, theSecondPoint, theThirdPoint); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const TopoDS_Vertex& theFirstVertex, + const TopoDS_Vertex& theSecondVertex, + const TopoDS_Vertex& theThirdVertex) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theFirstVertex, theSecondVertex, theThirdVertex); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const TopoDS_Face& theCone) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theCone); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theFirstFace, theSecondFace); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_AngleDimension::PrsDim_AngleDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + const gp_Pnt& thePoint) +: PrsDim_Dimension (PrsDim_KOD_PLANEANGLE) +{ + Init(); + SetMeasuredGeometry (theFirstFace, theSecondFace, thePoint); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge) +{ + gp_Pln aComputedPlane; + + myFirstShape = theFirstEdge; + mySecondShape = theSecondEdge; + myThirdShape = TopoDS_Shape(); + myGeometryType = GeometryType_Edges; + myIsGeometryValid = InitTwoEdgesAngle (aComputedPlane); + + if (myIsGeometryValid && !myIsPlaneCustom) + { + myPlane = aComputedPlane; + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pnt& theThirdPoint) +{ + myFirstPoint = theFirstPoint; + myCenterPoint = theSecondPoint; + mySecondPoint = theThirdPoint; + myFirstShape = BRepLib_MakeVertex (myFirstPoint); + mySecondShape = BRepLib_MakeVertex (myCenterPoint); + myThirdShape = BRepLib_MakeVertex (mySecondPoint); + myGeometryType = GeometryType_Points; + myIsGeometryValid = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + + Standard_Boolean anIsSameLine = isSameLine (myFirstPoint, myCenterPoint, mySecondPoint); + if (myIsGeometryValid && !myIsPlaneCustom && !anIsSameLine) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const TopoDS_Vertex& theFirstVertex, + const TopoDS_Vertex& theSecondVertex, + const TopoDS_Vertex& theThirdVertex) +{ + myFirstShape = theFirstVertex; + mySecondShape = theSecondVertex; + myThirdShape = theThirdVertex; + myFirstPoint = BRep_Tool::Pnt (theFirstVertex); + myCenterPoint = BRep_Tool::Pnt (theSecondVertex); + mySecondPoint = BRep_Tool::Pnt (theThirdVertex); + myGeometryType = GeometryType_Points; + myIsGeometryValid = IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + + Standard_Boolean anIsSameLine = isSameLine (myFirstPoint, myCenterPoint, mySecondPoint); + if (myIsGeometryValid && !myIsPlaneCustom && !anIsSameLine) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theCone) +{ + myFirstShape = theCone; + mySecondShape = TopoDS_Shape(); + myThirdShape = TopoDS_Shape(); + myGeometryType = GeometryType_Face; + myIsGeometryValid = InitConeAngle(); + + if (myIsGeometryValid && !myIsPlaneCustom) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace) +{ + myFirstShape = theFirstFace; + mySecondShape = theSecondFace; + myThirdShape = TopoDS_Shape(); + myGeometryType = GeometryType_Faces; + myIsGeometryValid = InitTwoFacesAngle(); + + if (myIsGeometryValid && !myIsPlaneCustom) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + const gp_Pnt& thePoint) +{ + myFirstShape = theFirstFace; + mySecondShape = theSecondFace; + myThirdShape = TopoDS_Shape(); + myGeometryType = GeometryType_Faces; + myIsGeometryValid = InitTwoFacesAngle (thePoint); + + if (myIsGeometryValid && !myIsPlaneCustom) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : Init +//purpose : +//======================================================================= +void PrsDim_AngleDimension::Init() +{ + SetType (PrsDim_TypeOfAngle_Interior); + SetArrowsVisibility (PrsDim_TypeOfAngleArrowVisibility_Both); + SetSpecialSymbol (THE_DEGREE_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_After); + SetFlyout (15.0); +} + +//======================================================================= +//function: GetCenterOnArc +//purpose : +//======================================================================= +gp_Pnt PrsDim_AngleDimension::GetCenterOnArc (const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter) const +{ + // construct plane where the circle and the arc are located + gce_MakePln aConstructPlane (theFirstAttach, theSecondAttach, theCenter); + if (!aConstructPlane.IsDone()) + { + return gp::Origin(); + } + + gp_Pln aPlane = aConstructPlane.Value(); + // to have an exterior angle presentation, a plane for further constructed circle should be reversed + if (myType == PrsDim_TypeOfAngle_Exterior) + { + gp_Ax1 anAxis = aPlane.Axis(); + gp_Dir aDir = anAxis.Direction(); + aDir.Reverse(); + aPlane.SetAxis(gp_Ax1(anAxis.Location(), aDir)); + } + + Standard_Real aRadius = theFirstAttach.Distance (theCenter); + + // construct circle forming the arc + gce_MakeCirc aConstructCircle (theCenter, aPlane, aRadius); + if (!aConstructCircle.IsDone()) + { + return gp::Origin(); + } + + gp_Circ aCircle = aConstructCircle.Value(); + + // compute angle parameters of arc end-points on circle + Standard_Real aParamBeg = ElCLib::Parameter (aCircle, theFirstAttach); + Standard_Real aParamEnd = ElCLib::Parameter (aCircle, theSecondAttach); + ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); + + return ElCLib::Value ((aParamBeg + aParamEnd) * 0.5, aCircle); +} + +//======================================================================= +//function : GetNormalForMinAngle +//purpose : +//======================================================================= +gp_Dir PrsDim_AngleDimension::GetNormalForMinAngle() const +{ + const gp_Dir& aNormal = myPlane.Axis().Direction(); + gp_Dir aFirst (gp_Vec (myCenterPoint, myFirstPoint) ); + gp_Dir aSecond (gp_Vec (myCenterPoint, mySecondPoint) ); + + return aFirst.AngleWithRef (aSecond, aNormal) < 0.0 + ? aNormal.Reversed() + : aNormal; +} + +//======================================================================= +//function : DrawArc +//purpose : draws the arc between two attach points +//======================================================================= +void PrsDim_AngleDimension::DrawArc (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter, + const Standard_Real theRadius, + const Standard_Integer theMode) +{ + gp_Pln aPlane (myCenterPoint, GetNormalForMinAngle()); + + // to have an exterior angle presentation, a plane for further constructed circle should be reversed + if (myType == PrsDim_TypeOfAngle_Exterior) + { + gp_Ax1 anAxis = aPlane.Axis(); + gp_Dir aDir = anAxis.Direction(); + aDir.Reverse(); + aPlane.SetAxis(gp_Ax1(anAxis.Location(), aDir)); + } + + // construct circle forming the arc + gce_MakeCirc aConstructCircle (theCenter, aPlane, theRadius); + if (!aConstructCircle.IsDone()) + { + return; + } + + gp_Circ aCircle = aConstructCircle.Value(); + + // construct the arc + GC_MakeArcOfCircle aConstructArc (aCircle, theFirstAttach, theSecondAttach, Standard_True); + if (!aConstructArc.IsDone()) + { + return; + } + + // generate points with specified deflection + const Handle(Geom_TrimmedCurve)& anArcCurve = aConstructArc.Value(); + + GeomAdaptor_Curve anArcAdaptor (anArcCurve, anArcCurve->FirstParameter(), anArcCurve->LastParameter()); + + // compute number of discretization elements in old-fanshioned way + gp_Vec aCenterToFirstVec (theCenter, theFirstAttach); + gp_Vec aCenterToSecondVec (theCenter, theSecondAttach); + Standard_Real anAngle = aCenterToFirstVec.Angle (aCenterToSecondVec); + if (myType == PrsDim_TypeOfAngle_Exterior) + anAngle = 2.0 * M_PI - anAngle; + // it sets 50 points on PI, and a part of points if angle is less + const Standard_Integer aNbPoints = Max (4, Standard_Integer (50.0 * anAngle / M_PI)); + + GCPnts_UniformAbscissa aMakePnts (anArcAdaptor, aNbPoints); + if (!aMakePnts.IsDone()) + { + return; + } + + // init data arrays for graphical and selection primitives + Handle(Graphic3d_ArrayOfPolylines) aPrimSegments = new Graphic3d_ArrayOfPolylines (aNbPoints); + + SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); + + // load data into arrays + for (Standard_Integer aPntIt = 1; aPntIt <= aMakePnts.NbPoints(); ++aPntIt) + { + gp_Pnt aPnt = anArcAdaptor.Value (aMakePnts.Parameter (aPntIt)); + + aPrimSegments->AddVertex (aPnt); + + aSensitiveCurve.Append (aPnt); + } + + // add display presentation + if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) + { + thePresentation->CurrentGroup()->SetStencilTestOptions (Standard_True); + } + Handle(Graphic3d_AspectLine3d) aDimensionLineStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); + thePresentation->CurrentGroup()->SetPrimitivesAspect (aDimensionLineStyle); + thePresentation->CurrentGroup()->AddPrimitiveArray (aPrimSegments); + if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) + { + thePresentation->CurrentGroup()->SetStencilTestOptions (Standard_False); + } +} + +//======================================================================= +//function: DrawArcWithText +//purpose : +//======================================================================= +void PrsDim_AngleDimension::DrawArcWithText (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter, + const TCollection_ExtendedString& theText, + const Standard_Real theTextWidth, + const Standard_Integer theMode, + const Standard_Integer theLabelPosition) +{ + gp_Pln aPlane (myCenterPoint, GetNormalForMinAngle()); + + Standard_Real aRadius = theFirstAttach.Distance (myCenterPoint); + + // construct circle forming the arc + gce_MakeCirc aConstructCircle (theCenter, aPlane, aRadius); + if (!aConstructCircle.IsDone()) + { + return; + } + + gp_Circ aCircle = aConstructCircle.Value(); + + // compute angle parameters of arc end-points on circle + Standard_Real aParamBeg = ElCLib::Parameter (aCircle, theFirstAttach); + Standard_Real aParamEnd = ElCLib::Parameter (aCircle, theSecondAttach); + ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); + + // middle point of arc parameter on circle + Standard_Real aParamMid = (aParamBeg + aParamEnd) * 0.5; + + // add text graphical primitives + if (theMode == ComputeMode_All || theMode == ComputeMode_Text) + { + gp_Pnt aTextPos = ElCLib::Value (aParamMid, aCircle); + gp_Dir aTextDir = gce_MakeDir (theFirstAttach, theSecondAttach); + + // Drawing text + drawText (thePresentation, + aTextPos, + aTextDir, + theText, + theLabelPosition); + } + + if (theMode != ComputeMode_All && theMode != ComputeMode_Line) + { + return; + } + + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center + && aDimensionAspect->IsText3d(); + + if (isLineBreak) + { + // compute gap for label as parameteric size of sector on circle segment + Standard_Real aSectorOfText = theTextWidth / aRadius; + Standard_Real aTextBegin = aParamMid - aSectorOfText * 0.5; + Standard_Real aTextEnd = aParamMid + aSectorOfText * 0.5; + gp_Pnt aTextPntBeg = ElCLib::Value (aTextBegin, aCircle); + gp_Pnt aTextPntEnd = ElCLib::Value (aTextEnd, aCircle); + + // Drawing arcs + if (aTextBegin > aParamBeg) + { + DrawArc (thePresentation, theFirstAttach, aTextPntBeg, theCenter, aRadius, theMode); + } + if (aTextEnd < aParamEnd) + { + DrawArc (thePresentation, aTextPntEnd, theSecondAttach, theCenter, aRadius, theMode); + } + } + else + { + DrawArc (thePresentation, theFirstAttach, theSecondAttach, theCenter, aRadius, theMode); + } +} + +//======================================================================= +//function : CheckPlane +//purpose : +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::CheckPlane (const gp_Pln& thePlane)const +{ + if (!thePlane.Contains (myFirstPoint, Precision::Confusion()) && + !thePlane.Contains (mySecondPoint, Precision::Confusion()) && + !thePlane.Contains (myCenterPoint, Precision::Confusion())) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputePlane +//purpose : +//======================================================================= +void PrsDim_AngleDimension::ComputePlane() +{ + if (!myIsGeometryValid) + { + return; + } + + // Compute working plane so that Y axis is codirectional + // with Y axis of text coordinate system (necessary for text alignment) + gp_Vec aFirstVec = gp_Vec (myCenterPoint, myFirstPoint); + gp_Vec aSecondVec = gp_Vec (myCenterPoint, mySecondPoint); + gp_Vec aDirectionN = aSecondVec ^ aFirstVec; + gp_Vec aDirectionY = aFirstVec + aSecondVec; + gp_Vec aDirectionX = aDirectionY ^ aDirectionN; + + myPlane = gp_Pln (gp_Ax3 (myCenterPoint, gp_Dir (aDirectionN), gp_Dir (aDirectionX))); +} + +//======================================================================= +//function : GetModelUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_AngleDimension::GetModelUnits() const +{ + return myDrawer->DimAngleModelUnits(); +} + +//======================================================================= +//function : GetDisplayUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_AngleDimension::GetDisplayUnits() const +{ + return myDrawer->DimAngleDisplayUnits(); +} + +//======================================================================= +//function : SetModelUnits +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetModelUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimAngleModelUnits (theUnits); +} + +//======================================================================= +//function : SetDisplayUnits +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimAngleDisplayUnits (theUnits); +} + +//======================================================================= +//function : ComputeValue +//purpose : +//======================================================================= +Standard_Real PrsDim_AngleDimension::ComputeValue() const +{ + if (!IsValid()) + { + return 0.0; + } + + gp_Vec aVec1 (myCenterPoint, myFirstPoint); + gp_Vec aVec2 (myCenterPoint, mySecondPoint); + + Standard_Real anAngle = aVec1.AngleWithRef (aVec2, GetNormalForMinAngle()); + + return anAngle > 0.0 ? anAngle : (2.0 * M_PI + anAngle); +} + +//======================================================================= +//function : Compute +//purpose : Having three gp_Pnt points compute presentation +//======================================================================= +void PrsDim_AngleDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) +{ + mySelectionGeom.Clear (theMode); + + if (!IsValid()) + { + return; + } + + // Parameters for presentation + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + thePresentation->CurrentGroup()->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); + + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + + // prepare label string and compute its geometrical width + Standard_Real aLabelWidth; + TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); + + // add margins to label width + if (aDimensionAspect->IsText3d()) + { + aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; + } + + // Get parameters from aspect or adjust it according with custom text position + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + Prs3d_DimensionTextHorizontalPosition aHorisontalTextPos = aDimensionAspect->TextHorizontalPosition(); + + if (IsTextPositionCustom()) + { + AdjustParameters (myFixedTextPosition,anExtensionSize, aHorisontalTextPos, myFlyout); + } + + // Handle user-defined and automatic arrow placement + Standard_Boolean isArrowsExternal = Standard_False; + Standard_Integer aLabelPosition = LabelPosition_None; + + FitTextAlignment (aHorisontalTextPos, aLabelPosition, isArrowsExternal); + + gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); + gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); + + //Arrows positions and directions + gp_Vec aWorkingPlaneDir (GetNormalForMinAngle()); + + gp_Dir aFirstExtensionDir = aWorkingPlaneDir.Reversed() ^ gp_Vec (myCenterPoint, aFirstAttach); + gp_Dir aSecondExtensionDir = aWorkingPlaneDir ^ gp_Vec (myCenterPoint, aSecondAttach); + + gp_Vec aFirstArrowVec = gp_Vec (aFirstExtensionDir) * anArrowLength; + gp_Vec aSecondArrowVec = gp_Vec (aSecondExtensionDir) * anArrowLength; + + if (isArrowsExternal) + { + aFirstArrowVec.Reverse(); + aSecondArrowVec.Reverse(); + } + + gp_Pnt aFirstArrowBegin (0.0, 0.0, 0.0); + gp_Pnt aFirstArrowEnd (0.0, 0.0, 0.0); + gp_Pnt aSecondArrowBegin (0.0, 0.0, 0.0); + gp_Pnt aSecondArrowEnd (0.0, 0.0, 0.0); + + aFirstArrowBegin = aFirstAttach; + aSecondArrowBegin = aSecondAttach; + aFirstArrowEnd = aFirstAttach.Translated (-aFirstArrowVec); + aSecondArrowEnd = aSecondAttach.Translated (-aSecondArrowVec); + + // Group1: stenciling text and the angle dimension arc + thePresentation->NewGroup(); + + Standard_Integer aHPosition = aLabelPosition & LabelPosition_HMask; + + // draw text label + switch (aHPosition) + { + case LabelPosition_HCenter : + { + Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center + && aDimensionAspect->IsText3d(); + + if (isLineBreak) + { + DrawArcWithText (thePresentation, + aFirstAttach, + aSecondAttach, + myCenterPoint, + aLabelString, + aLabelWidth, + theMode, + aLabelPosition); + break; + } + + // compute text primitives + if (theMode == ComputeMode_All || theMode == ComputeMode_Text) + { + gp_Vec aDimensionDir (aFirstAttach, aSecondAttach); + gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition + : GetCenterOnArc (aFirstAttach, aSecondAttach, myCenterPoint); + gp_Dir aTextDir = aDimensionDir; + + drawText (thePresentation, + aTextPos, + aTextDir, + aLabelString, + aLabelPosition); + } + + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + DrawArc (thePresentation, + (isArrowsExternal || !isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_First)) ? aFirstAttach : aFirstArrowEnd, + (isArrowsExternal || !isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_Second)) ? aSecondAttach : aSecondArrowEnd, + myCenterPoint, + Abs (GetFlyout()), + theMode); + } + } + break; + + case LabelPosition_Left : + { + DrawExtension (thePresentation, + anExtensionSize, + (isArrowsExternal && isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_First)) ? aFirstArrowEnd : aFirstAttach, + aFirstExtensionDir, + aLabelString, + aLabelWidth, + theMode, + aLabelPosition); + } + break; + + case LabelPosition_Right : + { + DrawExtension (thePresentation, + anExtensionSize, + (isArrowsExternal && isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_Second)) ? aSecondArrowEnd : aSecondAttach, + aSecondExtensionDir, + aLabelString, + aLabelWidth, + theMode, + aLabelPosition); + } + break; + } + + // dimension arc without text + if ((theMode == ComputeMode_All || theMode == ComputeMode_Line) && aHPosition != LabelPosition_HCenter) + { + thePresentation->NewGroup(); + + DrawArc (thePresentation, + (isArrowsExternal || !isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_First)) ? aFirstAttach : aFirstArrowEnd, + (isArrowsExternal || !isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_Second)) ? aSecondAttach : aSecondArrowEnd, + myCenterPoint, + Abs(GetFlyout ()), + theMode); + } + + // arrows and arrow extensions + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + thePresentation->NewGroup(); + + if (isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_First)) + DrawArrow (thePresentation, aFirstArrowBegin, gp_Dir (aFirstArrowVec)); + if (isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_Second)) + DrawArrow (thePresentation, aSecondArrowBegin, gp_Dir (aSecondArrowVec)); + } + + if ((theMode == ComputeMode_All || theMode == ComputeMode_Line) && isArrowsExternal) + { + thePresentation->NewGroup(); + + if (aHPosition != LabelPosition_Left && isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_First)) + { + DrawExtension (thePresentation, + aDimensionAspect->ArrowTailSize(), + aFirstArrowEnd, + aFirstExtensionDir, + THE_EMPTY_LABEL_STRING, + THE_EMPTY_LABEL_WIDTH, + theMode, + LabelPosition_None); + } + + if (aHPosition != LabelPosition_Right && isArrowVisible(PrsDim_TypeOfAngleArrowVisibility_Second)) + { + DrawExtension (thePresentation, + aDimensionAspect->ArrowTailSize(), + aSecondArrowEnd, + aSecondExtensionDir, + THE_EMPTY_LABEL_STRING, + THE_EMPTY_LABEL_WIDTH, + theMode, + LabelPosition_None); + } + } + + // flyouts + if (theMode == ComputeMode_All) + { + thePresentation->NewGroup(); + + Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (4); + aPrimSegments->AddVertex (myCenterPoint); + aPrimSegments->AddVertex (aFirstAttach); + aPrimSegments->AddVertex (myCenterPoint); + aPrimSegments->AddVertex (aSecondAttach); + + Handle(Graphic3d_AspectLine3d) aFlyoutStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); + thePresentation->CurrentGroup()->SetPrimitivesAspect (aFlyoutStyle); + thePresentation->CurrentGroup()->AddPrimitiveArray (aPrimSegments); + } + + mySelectionGeom.IsComputed = Standard_True; +} + +//======================================================================= +//function : ComputeFlyoutSelection +//purpose : computes selection for flyouts +//======================================================================= +void PrsDim_AngleDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theOwner) +{ + gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); + gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); + + Handle(Select3D_SensitiveGroup) aSensitiveEntity = new Select3D_SensitiveGroup (theOwner); + aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, myCenterPoint, aFirstAttach)); + aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, myCenterPoint, aSecondAttach)); + + theSelection->Add (aSensitiveEntity); +} + +//======================================================================= +//function : InitTwoEdgesAngle +//purpose : +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::InitTwoEdgesAngle (gp_Pln& theComputedPlane) +{ + TopoDS_Edge aFirstEdge = TopoDS::Edge (myFirstShape); + TopoDS_Edge aSecondEdge = TopoDS::Edge (mySecondShape); + + BRepAdaptor_Curve aMakeFirstLine (aFirstEdge); + BRepAdaptor_Curve aMakeSecondLine (aSecondEdge); + + if (aMakeFirstLine.GetType() != GeomAbs_Line || aMakeSecondLine.GetType() != GeomAbs_Line) + { + return Standard_False; + } + + Handle(Geom_Line) aFirstLine = new Geom_Line (aMakeFirstLine.Line()); + Handle(Geom_Line) aSecondLine = new Geom_Line (aMakeSecondLine.Line()); + + gp_Lin aFirstLin = aFirstLine->Lin(); + gp_Lin aSecondLin = aSecondLine->Lin(); + + Standard_Boolean isParallelLines = aFirstLin.Direction().IsParallel (aSecondLin.Direction(), Precision::Angular()); + + theComputedPlane = isParallelLines ? gp_Pln(gp::XOY()) + : gp_Pln (aSecondLin.Location(), gp_Vec (aFirstLin.Direction()) ^ gp_Vec (aSecondLin.Direction())); + + // Compute geometry for this plane and edges + Standard_Boolean isInfinite1,isInfinite2; + gp_Pnt aFirstPoint1, aLastPoint1, aFirstPoint2, aLastPoint2; + Handle(Geom_Curve) aFirstCurve = aFirstLine, aSecondCurve = aSecondLine; + if (!PrsDim::ComputeGeometry (aFirstEdge, aSecondEdge, + aFirstCurve, aSecondCurve, + aFirstPoint1, aLastPoint1, + aFirstPoint2, aLastPoint2, + isInfinite1, isInfinite2)) + { + return Standard_False; + } + + Standard_Boolean isSameLines = aFirstLin.Direction().IsEqual (aSecondLin.Direction(), Precision::Angular()) + && aFirstLin.Location().IsEqual (aSecondLin.Location(),Precision::Confusion()); + + // It can be the same gp_Lin geometry but the different begin and end parameters + Standard_Boolean isSameEdges = + (aFirstPoint1.IsEqual (aFirstPoint2, Precision::Confusion()) && aLastPoint1.IsEqual (aLastPoint2, Precision::Confusion())) + || (aFirstPoint1.IsEqual (aLastPoint2, Precision::Confusion()) && aLastPoint1.IsEqual (aFirstPoint2, Precision::Confusion())); + + if (isParallelLines) + { + // Zero angle, it could not handle this geometry + if (isSameLines && isSameEdges) + { + return Standard_False; + } + + // Handle the case of Pi angle + const Standard_Real aParam11 = ElCLib::Parameter (aFirstLin, aFirstPoint1); + const Standard_Real aParam12 = ElCLib::Parameter (aFirstLin, aLastPoint1); + const Standard_Real aParam21 = ElCLib::Parameter (aFirstLin, aFirstPoint2); + const Standard_Real aParam22 = ElCLib::Parameter (aFirstLin, aLastPoint2); + myCenterPoint = ElCLib::Value ( (Min (aParam11, aParam12) + Max (aParam21, aParam22)) * 0.5, aFirstLin); + myFirstPoint = myCenterPoint.Translated (gp_Vec (aFirstLin.Direction()) * Abs (GetFlyout())); + mySecondPoint = myCenterPoint.XYZ() + (aFirstLin.Direction().IsEqual (aSecondLin.Direction(), Precision::Angular()) + ? aFirstLin.Direction().Reversed().XYZ() * Abs (GetFlyout()) + : aSecondLin.Direction().XYZ() * Abs (GetFlyout())); + } + else + { + // Find intersection + gp_Lin2d aFirstLin2d = ProjLib::Project (theComputedPlane, aFirstLin); + gp_Lin2d aSecondLin2d = ProjLib::Project (theComputedPlane, aSecondLin); + + IntAna2d_AnaIntersection anInt2d (aFirstLin2d, aSecondLin2d); + gp_Pnt2d anIntersectPoint; + if (!anInt2d.IsDone() || anInt2d.IsEmpty()) + { + return Standard_False; + } + + anIntersectPoint = gp_Pnt2d (anInt2d.Point(1).Value()); + myCenterPoint = ElCLib::To3d (theComputedPlane.Position().Ax2(), anIntersectPoint); + + if (isInfinite1 || isInfinite2) + { + myFirstPoint = myCenterPoint.Translated (gp_Vec (aFirstLin.Direction()) * Abs (GetFlyout())); + mySecondPoint = myCenterPoint.Translated (gp_Vec (aSecondLin.Direction()) * Abs (GetFlyout())); + + return IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + } + + // | + // | <- dimension should be here + // *---- + myFirstPoint = myCenterPoint.Distance (aFirstPoint1) > myCenterPoint.Distance (aLastPoint1) + ? aFirstPoint1 + : aLastPoint1; + + mySecondPoint = myCenterPoint.Distance (aFirstPoint2) > myCenterPoint.Distance (aLastPoint2) + ? aFirstPoint2 + : aLastPoint2; + } + + return IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); +} + +//======================================================================= +//function : InitTwoFacesAngle +//purpose : initialization of angle dimension between two faces +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::InitTwoFacesAngle() +{ + TopoDS_Face aFirstFace = TopoDS::Face (myFirstShape); + TopoDS_Face aSecondFace = TopoDS::Face (mySecondShape); + + gp_Dir aFirstDir, aSecondDir; + gp_Pln aFirstPln, aSecondPln; + Handle(Geom_Surface) aFirstBasisSurf, aSecondBasisSurf; + PrsDim_KindOfSurface aFirstSurfType, aSecondSurfType; + Standard_Real aFirstOffset, aSecondOffset; + + PrsDim::GetPlaneFromFace (aFirstFace, aFirstPln, + aFirstBasisSurf,aFirstSurfType,aFirstOffset); + + PrsDim::GetPlaneFromFace (aSecondFace, aSecondPln, + aSecondBasisSurf, aSecondSurfType, aSecondOffset); + + if (aFirstSurfType == PrsDim_KOS_Plane && aSecondSurfType == PrsDim_KOS_Plane) + { + //Planar faces angle + Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (aFirstBasisSurf); + Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (aSecondBasisSurf); + return PrsDim::InitAngleBetweenPlanarFaces (aFirstFace, aSecondFace, + myCenterPoint, myFirstPoint, mySecondPoint) + && IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + } + else + { + // Curvilinear faces angle + return PrsDim::InitAngleBetweenCurvilinearFaces (aFirstFace, aSecondFace, + aFirstSurfType, aSecondSurfType, + myCenterPoint, myFirstPoint, mySecondPoint) + && IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + } +} + +//======================================================================= +//function : InitTwoFacesAngle +//purpose : initialization of angle dimension between two faces +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::InitTwoFacesAngle (const gp_Pnt& thePointOnFirstFace) +{ + TopoDS_Face aFirstFace = TopoDS::Face (myFirstShape); + TopoDS_Face aSecondFace = TopoDS::Face (mySecondShape); + + gp_Dir aFirstDir, aSecondDir; + gp_Pln aFirstPln, aSecondPln; + Handle(Geom_Surface) aFirstBasisSurf, aSecondBasisSurf; + PrsDim_KindOfSurface aFirstSurfType, aSecondSurfType; + Standard_Real aFirstOffset, aSecondOffset; + + PrsDim::GetPlaneFromFace (aFirstFace, aFirstPln, + aFirstBasisSurf,aFirstSurfType,aFirstOffset); + + PrsDim::GetPlaneFromFace (aSecondFace, aSecondPln, + aSecondBasisSurf, aSecondSurfType, aSecondOffset); + + myFirstPoint = thePointOnFirstFace; + if (aFirstSurfType == PrsDim_KOS_Plane && aSecondSurfType == PrsDim_KOS_Plane) + { + //Planar faces angle + Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (aFirstBasisSurf); + Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (aSecondBasisSurf); + return PrsDim::InitAngleBetweenPlanarFaces (aFirstFace, aSecondFace, + myCenterPoint, myFirstPoint, mySecondPoint, + Standard_True) + && IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + } + else + { + // Curvilinear faces angle + return PrsDim::InitAngleBetweenCurvilinearFaces (aFirstFace, aSecondFace, + aFirstSurfType, aSecondSurfType, + myCenterPoint, myFirstPoint, mySecondPoint, + Standard_True) + && IsValidPoints (myFirstPoint, myCenterPoint, mySecondPoint); + } +} + +//======================================================================= +//function : InitConeAngle +//purpose : initialization of the cone angle +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::InitConeAngle() +{ + if (myFirstShape.IsNull()) + { + return Standard_False; + } + + TopoDS_Face aConeShape = TopoDS::Face (myFirstShape); + gp_Pln aPln; + gp_Cone aCone; + gp_Circ aCircle; + // A surface from the Face + Handle(Geom_Surface) aSurf; + Handle(Geom_OffsetSurface) aOffsetSurf; + Handle(Geom_ConicalSurface) aConicalSurf; + Handle(Geom_SurfaceOfRevolution) aRevSurf; + Handle(Geom_Line) aLine; + BRepAdaptor_Surface aConeAdaptor (aConeShape); + TopoDS_Face aFace; + PrsDim_KindOfSurface aSurfType; + Standard_Real anOffset = 0.; + Handle(Standard_Type) aType; + + const Standard_Real aMaxV = aConeAdaptor.FirstVParameter(); + const Standard_Real aMinV = aConeAdaptor.LastVParameter(); + PrsDim::GetPlaneFromFace (aConeShape, aPln, aSurf, aSurfType, anOffset); + if (aSurfType == PrsDim_KOS_Revolution) + { + // Surface of revolution + aRevSurf = Handle(Geom_SurfaceOfRevolution)::DownCast(aSurf); + gp_Lin aLin (aRevSurf->Axis()); + Handle(Geom_Curve) aBasisCurve = aRevSurf->BasisCurve(); + //Must be a part of line (basis curve should be linear) + if (aBasisCurve ->DynamicType() != STANDARD_TYPE(Geom_Line)) + return Standard_False; + + gp_Pnt aFirst1 = aConeAdaptor.Value (0., aMinV); + gp_Pnt aLast1 = aConeAdaptor.Value (0., aMaxV); + gp_Vec aVec1 (aFirst1, aLast1); + + //Projection on + gp_Pnt aFirst2 = ElCLib::Value (ElCLib::Parameter (aLin, aFirst1), aLin); + // Projection on + gp_Pnt aLast2 = ElCLib::Value (ElCLib::Parameter (aLin, aLast1), aLin); + + gp_Vec aVec2 (aFirst2, aLast2); + + // Check if two parts of revolution are parallel (it's a cylinder) or normal (it's a circle). + if (aVec1.IsParallel (aVec2, Precision::Angular()) + || aVec1.IsNormal (aVec2,Precision::Angular())) + return Standard_False; + + gce_MakeCone aMkCone (aRevSurf->Axis(), aFirst1, aLast1); + aCone = aMkCone.Value(); + myCenterPoint = aCone.Apex(); + } + else + { + aType = aSurf->DynamicType(); + if (aType == STANDARD_TYPE(Geom_OffsetSurface) || anOffset > 0.01) + { + // Offset surface + aOffsetSurf = new Geom_OffsetSurface (aSurf, anOffset); + aSurf = aOffsetSurf->Surface(); + BRepBuilderAPI_MakeFace aMkFace(aSurf, Precision::Confusion()); + aMkFace.Build(); + if (!aMkFace.IsDone()) + return Standard_False; + aConeAdaptor.Initialize (aMkFace.Face()); + } + aCone = aConeAdaptor.Cone(); + aConicalSurf = Handle(Geom_ConicalSurface)::DownCast (aSurf); + myCenterPoint = aConicalSurf->Apex(); + } + + // A circle where the angle is drawn + Handle(Geom_Curve) aCurve; + Standard_Real aMidV = ( aMinV + aMaxV ) / 2.5; + aCurve = aSurf->VIso (aMidV); + aCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); + + aCurve = aSurf->VIso(aMaxV); + gp_Circ aCircVmax = Handle(Geom_Circle)::DownCast(aCurve)->Circ(); + aCurve = aSurf->VIso(aMinV); + gp_Circ aCircVmin = Handle(Geom_Circle)::DownCast(aCurve)->Circ(); + + if (aCircVmax.Radius() < aCircVmin.Radius()) + { + gp_Circ aTmpCirc = aCircVmax; + aCircVmax = aCircVmin; + aCircVmin = aTmpCirc; + } + + myFirstPoint = ElCLib::Value (0, aCircle); + mySecondPoint = ElCLib::Value (M_PI, aCircle); + return Standard_True; +} + +//======================================================================= +//function : IsValidPoints +//purpose : +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::IsValidPoints (const gp_Pnt& theFirstPoint, + const gp_Pnt& theCenterPoint, + const gp_Pnt& theSecondPoint) const +{ + return theFirstPoint.Distance (theCenterPoint) > Precision::Confusion() + && theSecondPoint.Distance (theCenterPoint) > Precision::Confusion() + && gp_Vec (theCenterPoint, theFirstPoint).Angle ( + gp_Vec (theCenterPoint, theSecondPoint)) > Precision::Angular(); +} + +//======================================================================= +//function : isArrowVisible +//purpose : compares given and internal arrows types, returns true if the the type should be shown +//======================================================================= +Standard_Boolean PrsDim_AngleDimension::isArrowVisible(const PrsDim_TypeOfAngleArrowVisibility theArrowType) const +{ + switch (theArrowType) + { + case PrsDim_TypeOfAngleArrowVisibility_Both: + return myArrowsVisibility == PrsDim_TypeOfAngleArrowVisibility_Both; + case PrsDim_TypeOfAngleArrowVisibility_First: + return myArrowsVisibility == PrsDim_TypeOfAngleArrowVisibility_Both || myArrowsVisibility == PrsDim_TypeOfAngleArrowVisibility_First; + case PrsDim_TypeOfAngleArrowVisibility_Second: + return myArrowsVisibility == PrsDim_TypeOfAngleArrowVisibility_Both || myArrowsVisibility == PrsDim_TypeOfAngleArrowVisibility_Second; + case PrsDim_TypeOfAngleArrowVisibility_None: + return false; + } + return false; +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +gp_Pnt PrsDim_AngleDimension::GetTextPosition() const +{ + if (!IsValid()) + { + return gp::Origin(); + } + + if (IsTextPositionCustom()) + { + return myFixedTextPosition; + } + + // Counts text position according to the dimension parameters + gp_Pnt aTextPosition (gp::Origin()); + + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + // Prepare label string and compute its geometrical width + Standard_Real aLabelWidth; + TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); + + gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); + gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec(myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); + + // Handle user-defined and automatic arrow placement + Standard_Boolean isArrowsExternal = Standard_False; + Standard_Integer aLabelPosition = LabelPosition_None; + FitTextAlignment (aDimensionAspect->TextHorizontalPosition(), + aLabelPosition, isArrowsExternal); + + // Get text position + switch (aLabelPosition & LabelPosition_HMask) + { + case LabelPosition_HCenter: + { + aTextPosition = GetCenterOnArc (aFirstAttach, aSecondAttach, myCenterPoint); + } + break; + case LabelPosition_Left: + { + gp_Dir aPlaneNormal = gp_Vec (aFirstAttach, aSecondAttach) ^ gp_Vec (myCenterPoint, aFirstAttach); + gp_Dir anExtensionDir = aPlaneNormal ^ gp_Vec (myCenterPoint, aFirstAttach); + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + Standard_Real anOffset = isArrowsExternal + ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() + : anExtensionSize; + gp_Vec anExtensionVec = gp_Vec (anExtensionDir) * -anOffset; + aTextPosition = aFirstAttach.Translated (anExtensionVec); + } + break; + case LabelPosition_Right: + { + gp_Dir aPlaneNormal = gp_Vec (aFirstAttach, aSecondAttach) ^ gp_Vec (myCenterPoint, aFirstAttach); + gp_Dir anExtensionDir = aPlaneNormal ^ gp_Vec (myCenterPoint, aSecondAttach); + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + Standard_Real anOffset = isArrowsExternal + ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() + : anExtensionSize; + gp_Vec anExtensionVec = gp_Vec (anExtensionDir) * anOffset; + aTextPosition = aSecondAttach.Translated (anExtensionVec); + } + break; + } + + return aTextPosition; +} + +//======================================================================= +//function : SetTextPosition +//purpose : +//======================================================================= +void PrsDim_AngleDimension::SetTextPosition (const gp_Pnt& theTextPos) +{ + if (!IsValid()) + { + return; + } + + // The text position point for angle dimension should belong to the working plane. + if (!GetPlane().Contains (theTextPos, Precision::Confusion())) + { + throw Standard_ProgramError("The text position point for angle dimension doesn't belong to the working plane."); + } + + myIsTextPositionFixed = Standard_True; + myFixedTextPosition = theTextPos; +} + +//======================================================================= +//function : AdjustParameters +//purpose : +//======================================================================= +void PrsDim_AngleDimension::AdjustParameters (const gp_Pnt& theTextPos, + Standard_Real& theExtensionSize, + Prs3d_DimensionTextHorizontalPosition& theAlignment, + Standard_Real& theFlyout) const +{ + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + + // Build circle with radius that is equal to distance from text position to the center point. + Standard_Real aRadius = gp_Vec (myCenterPoint, theTextPos).Magnitude(); + + // Set attach points in positive direction of the flyout. + gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * aRadius); + gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * aRadius); + + gce_MakeCirc aConstructCircle (myCenterPoint, GetPlane(), aRadius); + if (!aConstructCircle.IsDone()) + { + return; + } + gp_Circ aCircle = aConstructCircle.Value(); + + // Default values + theExtensionSize = aDimensionAspect->ArrowAspect()->Length(); + theAlignment = Prs3d_DTHP_Center; + + Standard_Real aParamBeg = ElCLib::Parameter (aCircle, aFirstAttach); + Standard_Real aParamEnd = ElCLib::Parameter (aCircle, aSecondAttach); + if (aParamEnd < aParamBeg) + { + Standard_Real aParam = aParamEnd; + aParamEnd = aParamBeg; + aParamBeg = aParam; + } + + ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); + Standard_Real aTextPar = ElCLib::Parameter (aCircle , theTextPos); + + // Horizontal center + if (aTextPar > aParamBeg && aTextPar < aParamEnd) + { + theFlyout = aRadius; + return; + } + + aParamBeg += M_PI; + aParamEnd += M_PI; + ElCLib::AdjustPeriodic (0.0, M_PI * 2, Precision::PConfusion(), aParamBeg, aParamEnd); + + if (aTextPar > aParamBeg && aTextPar < aParamEnd) + { + theFlyout = -aRadius; + return; + } + + // Text on the extensions + gp_Lin aFirstLine = gce_MakeLin (myCenterPoint, myFirstPoint); + gp_Lin aSecondLine = gce_MakeLin (myCenterPoint, mySecondPoint); + gp_Pnt aFirstTextProj = PrsDim::Nearest (aFirstLine, theTextPos); + gp_Pnt aSecondTextProj = PrsDim::Nearest (aSecondLine, theTextPos); + Standard_Real aFirstDist = aFirstTextProj.Distance (theTextPos); + Standard_Real aSecondDist = aSecondTextProj.Distance (theTextPos); + + if (aFirstDist <= aSecondDist) + { + aRadius = myCenterPoint.Distance (aFirstTextProj); + Standard_Real aNewExtensionSize = aFirstDist - anArrowLength; + theExtensionSize = aNewExtensionSize < 0.0 ? 0.0 : aNewExtensionSize; + + theAlignment = Prs3d_DTHP_Left; + + gp_Vec aPosFlyoutDir = gp_Vec (myCenterPoint, myFirstPoint).Normalized().Scaled (aRadius); + + theFlyout = aFirstTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion() + ? -aRadius : aRadius; + } + else + { + aRadius = myCenterPoint.Distance (aSecondTextProj); + + Standard_Real aNewExtensionSize = aSecondDist - anArrowLength; + + theExtensionSize = aNewExtensionSize < 0.0 ? 0.0 : aNewExtensionSize; + + theAlignment = Prs3d_DTHP_Right; + + gp_Vec aPosFlyoutDir = gp_Vec (myCenterPoint, mySecondPoint).Normalized().Scaled (aRadius); + + theFlyout = aSecondTextProj.Distance (myCenterPoint.Translated (aPosFlyoutDir)) > Precision::Confusion() + ? -aRadius : aRadius; + } +} + +//======================================================================= +//function : FitTextAlignment +//purpose : +//======================================================================= +void PrsDim_AngleDimension::FitTextAlignment (const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, + Standard_Integer& theLabelPosition, + Standard_Boolean& theIsArrowsExternal) const +{ + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + + // Prepare label string and compute its geometrical width + Standard_Real aLabelWidth; + TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); + + // add margins to label width + if (aDimensionAspect->IsText3d()) + { + aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; + } + + gp_Pnt aFirstAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, myFirstPoint).Normalized() * GetFlyout()); + gp_Pnt aSecondAttach = myCenterPoint.Translated (gp_Vec (myCenterPoint, mySecondPoint).Normalized() * GetFlyout()); + + // Handle user-defined and automatic arrow placement + switch (aDimensionAspect->ArrowOrientation()) + { + case Prs3d_DAO_External: theIsArrowsExternal = true; break; + case Prs3d_DAO_Internal: theIsArrowsExternal = false; break; + case Prs3d_DAO_Fit: + { + gp_Vec anAttachVector (aFirstAttach, aSecondAttach); + Standard_Real aDimensionWidth = anAttachVector.Magnitude(); + + // Add margin to ensure a small tail between text and arrow + Standard_Real anArrowMargin = aDimensionAspect->IsText3d() + ? aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN + : 0.0; + + Standard_Real anArrowsWidth = (anArrowLength + anArrowMargin) * 2.0; + + theIsArrowsExternal = aDimensionWidth < aLabelWidth + anArrowsWidth; + break; + } + } + + // Handle user-defined and automatic text placement + switch (theHorizontalTextPos) + { + case Prs3d_DTHP_Left : theLabelPosition |= LabelPosition_Left; break; + case Prs3d_DTHP_Right : theLabelPosition |= LabelPosition_Right; break; + case Prs3d_DTHP_Center: theLabelPosition |= LabelPosition_HCenter; break; + case Prs3d_DTHP_Fit: + { + gp_Vec anAttachVector (aFirstAttach, aSecondAttach); + Standard_Real aDimensionWidth = anAttachVector.Magnitude(); + Standard_Real anArrowsWidth = anArrowLength * 2.0; + Standard_Real aContentWidth = theIsArrowsExternal ? aLabelWidth : aLabelWidth + anArrowsWidth; + + theLabelPosition |= aDimensionWidth < aContentWidth ? LabelPosition_Left : LabelPosition_HCenter; + break; + } + } + + switch (aDimensionAspect->TextVerticalPosition()) + { + case Prs3d_DTVP_Above : theLabelPosition |= LabelPosition_Above; break; + case Prs3d_DTVP_Below : theLabelPosition |= LabelPosition_Below; break; + case Prs3d_DTVP_Center : theLabelPosition |= LabelPosition_VCenter; break; + } +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_AngleDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_AngleDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_AngleDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_AngleDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,353 @@ +// Copyright (c) 1995-1999 Matra Datavision +// Copyright (c) 1999-2013 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_AngleDimension_HeaderFile +#define _PrsDim_AngleDimension_HeaderFile + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_AngleDimension, PrsDim_Dimension) + +//! Angle dimension. Can be constructed: +//! - on two intersected edges. +//! - on three points or vertices. +//! - on conical face. +//! - between two intersected faces. +//! +//! In case of three points or two intersected edges the dimension plane +//! (on which dimension presentation is built) can be computed uniquely +//! as through three defined points can be built only one plane. +//! Therefore, if user-defined plane differs from this one, the dimension can't be built. +//! +//! In cases of two planes automatic plane by default is built on point of the +//! origin of parametric space of the first face (the basis surface) so, that +//! the working plane and two faces intersection forms minimal angle between the faces. +//! User can define the other point which the dimension plane should pass through +//! using the appropriate constructor. This point can lay on the one of the faces or not. +//! Also user can define his own plane but it should pass through the three points +//! computed on the geometry initialization step (when the constructor or SetMeasuredGeometry() method +//! is called). +//! +//! In case of the conical face the center point of the angle is the apex of the conical surface. +//! The attachment points are points of the first and the last parameter of the basis circle of the cone. +class PrsDim_AngleDimension : public PrsDim_Dimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_AngleDimension, PrsDim_Dimension) +public: + + //! Constructs minimum angle dimension between two linear edges (where possible). + //! These two edges should be intersected by each other. Otherwise the geometry is not valid. + //! @param theFirstEdge [in] the first edge. + //! @param theSecondEdge [in] the second edge. + Standard_EXPORT PrsDim_AngleDimension (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge); + + //! Constructs the angle display object defined by three points. + //! @param theFirstPoint [in] the first point (point on first angle flyout). + //! @param theSecondPoint [in] the center point of angle dimension. + //! @param theThirdPoint [in] the second point (point on second angle flyout). + Standard_EXPORT PrsDim_AngleDimension (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pnt& theThirdPoint); + + //! Constructs the angle display object defined by three vertices. + //! @param theFirstVertex [in] the first vertex (vertex for first angle flyout). + //! @param theSecondVertex [in] the center vertex of angle dimension. + //! @param theThirdPoint [in] the second vertex (vertex for second angle flyout). + Standard_EXPORT PrsDim_AngleDimension (const TopoDS_Vertex& theFirstVertex, + const TopoDS_Vertex& theSecondVertex, + const TopoDS_Vertex& theThirdVertex); + + //! Constructs angle dimension for the cone face. + //! @param theCone [in] the conical face. + Standard_EXPORT PrsDim_AngleDimension (const TopoDS_Face& theCone); + + //! Constructs angle dimension between two planar faces. + //! @param theFirstFace [in] the first face. + //! @param theSecondFace [in] the second face. + Standard_EXPORT PrsDim_AngleDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace); + + //! Constructs angle dimension between two planar faces. + //! @param theFirstFace [in] the first face. + //! @param theSecondFace [in] the second face. + //! @param thePoint [in] the point which the dimension plane should pass through. + //! This point can lay on the one of the faces or not. + Standard_EXPORT PrsDim_AngleDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + const gp_Pnt& thePoint); + +public: + + //! @return first point forming the angle. + const gp_Pnt& FirstPoint() const { return myFirstPoint; } + + //! @return second point forming the angle. + const gp_Pnt& SecondPoint() const { return mySecondPoint; } + + //! @return center point forming the angle. + const gp_Pnt& CenterPoint() const { return myCenterPoint; } + + //! @return first argument shape. + const TopoDS_Shape& FirstShape() const { return myFirstShape; } + + //! @return second argument shape. + const TopoDS_Shape& SecondShape() const { return mySecondShape; } + + //! @return third argument shape. + const TopoDS_Shape& ThirdShape() const { return myThirdShape; } + +public: + + //! Measures minimum angle dimension between two linear edges. + //! These two edges should be intersected by each other. Otherwise the geometry is not valid. + //! @param theFirstEdge [in] the first edge. + //! @param theSecondEdge [in] the second edge. + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge); + + //! Measures angle defined by three points. + //! @param theFirstPoint [in] the first point (point on first angle flyout). + //! @param theSecondPoint [in] the center point of angle dimension. + //! @param theThirdPoint [in] the second point (point on second angle flyout). + Standard_EXPORT void SetMeasuredGeometry (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pnt& theThridPoint); + + //! Measures angle defined by three vertices. + //! @param theFirstVertex [in] the first vertex (vertex for first angle flyout). + //! @param theSecondVertex [in] the center vertex of angle dimension. + //! @param theThirdPoint [in] the second vertex (vertex for second angle flyout). + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Vertex& theFirstVertex, + const TopoDS_Vertex& theSecondVertex, + const TopoDS_Vertex& theThirdVertex); + + //! Measures angle of conical face. + //! @param theCone [in] the shape to measure. + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theCone); + + //! Measures angle between two planar faces. + //! @param theFirstFace [in] the first face. + //! @param theSecondFace [in] the second face.. + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace); + + //! Measures angle between two planar faces. + //! @param theFirstFace [in] the first face. + //! @param theSecondFace [in] the second face. + //! @param thePoint [in] the point which the dimension plane should pass through. + //! This point can lay on the one of the faces or not. + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + const gp_Pnt& thePoint); + + //! @return the display units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; + + //! @return the model units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; + + Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + //! Principle of horizontal text alignment settings: + //! - divide circle into two halves according to attachment points + //! - if aTextPos is between attach points -> Center + positive flyout + //! - if aTextPos is not between attach points but in this half -> Left or Right + positive flyout + //! - if aTextPos is between reflections of attach points -> Center + negative flyout + //! - if aTextPos is not between reflections of attach points -> Left or Right + negative flyout + Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; + + Standard_EXPORT virtual gp_Pnt GetTextPosition () const Standard_OVERRIDE; + + //! Sets angle type. + //! @param theType [in] the type value. + void SetType (const PrsDim_TypeOfAngle theType) { myType = theType; } + + //! @return the current angle type. + PrsDim_TypeOfAngle GetType() const { return myType; } + + //! Sets visible arrows type + //! @param theType [in] the type of visibility of arrows. + void SetArrowsVisibility (const PrsDim_TypeOfAngleArrowVisibility& theType) { myArrowsVisibility = theType; } + + //! @return the type of visibility of arrows. + PrsDim_TypeOfAngleArrowVisibility GetArrowsVisibility() const { return myArrowsVisibility; } + +protected: + + //! Initialization of fields that is common to all constructors. + Standard_EXPORT void Init(); + + //! Gets plane normal for minimal angle. + //! Dimension computation is based on three attach points and plane normal. + //! Based on this normal angle arc, arrows and extensions are constructed. + gp_Dir GetNormalForMinAngle() const; + + //! @param theFirstAttach [in] the first attachment point. + //! @param theSecondAttach [in] the second attachment point. + //! @param theCenter [in] the center point (center point of the angle). + //! @return the center of the dimension arc (the main dimension line in case of angle). + Standard_EXPORT gp_Pnt GetCenterOnArc (const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter) const; + + //! Draws main dimension line (arc). + //! @param thePresentation [in] the dimension presentation. + //! @param theFirstAttach [in] the first attachment point. + //! @param theSecondAttach [in] the second attachment point. + //! @param theCenter [in] the center point (center point of the angle). + //! @param theRadius [in] the radius of the dimension arc. + //! @param theMode [in] the display mode. + Standard_EXPORT void DrawArc (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter, + const Standard_Real theRadius, + const Standard_Integer theMode); + + //! Draws main dimension line (arc) with text. + //! @param thePresentation [in] the dimension presentation. + //! @param theFirstAttach [in] the first attachment point. + //! @param theSecondAttach [in] the second attachment point. + //! @param theCenter [in] the center point (center point of the angle). + //! @param theText [in] the text label string. + //! @param theTextWidth [in] the text label width. + //! @param theMode [in] the display mode. + //! @param theLabelPosition [in] the text label vertical and horizontal positioning option + //! respectively to the main dimension line. + Standard_EXPORT void DrawArcWithText (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theFirstAttach, + const gp_Pnt& theSecondAttach, + const gp_Pnt& theCenter, + const TCollection_ExtendedString& theText, + const Standard_Real theTextWidth, + const Standard_Integer theMode, + const Standard_Integer theLabelPosition); + + //! Fits text alignment relatively to the dimension line; + //! it computes the value of label position and arrow orientation + //! according set in the aspect and dimension properties. + //! @param theHorizontalTextPos [in] the horizontal alignment for text position. + //! @param theLabelPosition [out] the label position, contains bits that defines + //! vertical and horizontal alignment. (for internal usage in count text position). + //! @param theIsArrowExternal [out] is the arrows external, + //! if arrow orientation in the dimension aspect is Prs3d_DAO_Fit, it fits arrow + //! orientation automatically. + Standard_EXPORT void FitTextAlignment (const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, + Standard_Integer& theLabelPosition, + Standard_Boolean& theIsArrowsExternal) const; + + //! Adjusts aspect parameters according the text position: + //! extension size, vertical text alignment and flyout. + //! @param theTextPos [in] the user defined 3d point of text position. + //! @param theExtensionSize [out] the adjusted extension size. + //! @param theAlignment [out] the horizontal label alignment. + //! @param theFlyout [out] the adjusted value of flyout. + Standard_EXPORT void AdjustParameters (const gp_Pnt& theTextPos, + Standard_Real& theExtensionSize, + Prs3d_DimensionTextHorizontalPosition& theAlignment, + Standard_Real& theFlyout) const; + +protected: + + Standard_EXPORT virtual void ComputePlane(); + + //! Checks if the plane includes three angle points to build dimension. + Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; + + Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePM, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theOwner) Standard_OVERRIDE; + +protected: + + //! Init angular dimension to measure angle between two linear edges. + //! @return TRUE if the angular dimension can be constructured + //! for the passed edges. + Standard_EXPORT Standard_Boolean InitTwoEdgesAngle (gp_Pln& theComputedPlane); + + //! Init angular dimension to measure angle between two planar faces. + //! there is no user-defined poisitoning. So attach points are set + //! according to faces geometry (in origin of the first face basis surface). + //! @return TRUE if the angular dimension can be constructed + //! for the passed faces. + Standard_EXPORT Standard_Boolean InitTwoFacesAngle(); + + //! Init angular dimension to measure angle between two planar faces. + //! @param thePointOnFirstFace [in] the point which the dimension plane should pass through. + //! This point can lay on the one of the faces or not. + //! It will be projected on the first face and this point will be set + //! as the first point attach point. + //! It defines some kind of dimension positioning over the faces. + //! @return TRUE if the angular dimension can be constructed + //! for the passed faces. + Standard_EXPORT Standard_Boolean InitTwoFacesAngle (const gp_Pnt& thePointOnFirstFace); + + //! Init angular dimension to measure cone face. + //! @return TRUE if the angular dimension can be constructed + //! for the passed cone. + Standard_EXPORT Standard_Boolean InitConeAngle(); + + //! Check that the points forming angle are valid. + //! @return TRUE if the points met the following requirements: + //! The (P1, Center), (P2, Center) can be built. + //! The angle between the vectors > Precision::Angular(). + Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint, + const gp_Pnt& theCenterPoint, + const gp_Pnt& theSecondPoint) const; + + + //! Returns true if the arrow should be visible + //! @param theArrowType an arrow type + //! @return TRUE if the arrow should be visible + Standard_EXPORT Standard_Boolean isArrowVisible (const PrsDim_TypeOfAngleArrowVisibility theArrowType) const; + +private: + PrsDim_TypeOfAngle myType; //!< type of angle + PrsDim_TypeOfAngleArrowVisibility myArrowsVisibility; //!< type of arrows visibility + + gp_Pnt myFirstPoint; + gp_Pnt mySecondPoint; + gp_Pnt myCenterPoint; + TopoDS_Shape myFirstShape; + TopoDS_Shape mySecondShape; + TopoDS_Shape myThirdShape; +}; + +#endif // _PrsDim_AngleDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Chamf2dDimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Chamf2dDimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Chamf2dDimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Chamf2dDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,228 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_Chamf2dDimension, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_Chamf2dDimension::PrsDim_Chamf2dDimension(const TopoDS_Shape& aFShape, + const Handle(Geom_Plane)& aPlane, + const Standard_Real aVal, + const TCollection_ExtendedString& aText) +:PrsDim_Relation() +{ + myFShape = aFShape; + myPlane = aPlane; + myVal = aVal; + myText = aText; + mySymbolPrs = DsgPrs_AS_LASTAR; + myAutomaticPosition = Standard_True; + + myArrowSize = myVal / 100.; +} +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_Chamf2dDimension::PrsDim_Chamf2dDimension(const TopoDS_Shape& aFShape, + const Handle(Geom_Plane)& aPlane, + const Standard_Real aVal, + const TCollection_ExtendedString& aText, + const gp_Pnt& aPosition, + const DsgPrs_ArrowSide aSymbolPrs , + const Standard_Real anArrowSize) +:PrsDim_Relation() +{ + myFShape = aFShape; + myPlane = aPlane; + myVal = aVal; + myText = aText; + myPosition = aPosition; + mySymbolPrs = aSymbolPrs; + SetArrowSize( anArrowSize ); + myAutomaticPosition = Standard_False; +} + + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_Chamf2dDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& , + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + Handle(Geom_Curve) gcurv; + gp_Pnt pfirst,plast; + const TopoDS_Edge& thechamfedge = TopoDS::Edge(myFShape); + if (!PrsDim::ComputeGeometry (thechamfedge, gcurv, pfirst, plast)) + return; + + Handle(Geom_Line) glin = Handle(Geom_Line)::DownCast (gcurv); + gp_Dir dir1 (glin->Position().Direction()); + gp_Dir norm1 = myPlane->Pln().Axis().Direction(); + myDir = norm1.Crossed(dir1); + + + //------------------------------------------------- + // calcul d'une direction orthogonale a l'edge du + // chanfrein et dirigee vers l'ext. du contour + //------------------------------------------------- + + + // recup. d'une edge adjacente a l'edge du chanfrein + /*TopoDS_Edge nextedge = TopoDS::Edge(mySShape); + + gp_Pnt pfirstnext,plastnext; + Handle(Geom_Line) glinnext; + if (!PrsDim::ComputeGeometry(nextedge,glinnext,pfirstnext,plastnext) ) + return; + + gp_Vec v1(pfirst,plast); + gp_Vec v2; + if (pfirst.IsEqual(plastnext, Precision::Confusion())) + v2.SetXYZ(pfirstnext.XYZ() - pfirst.XYZ()); + else + v2.SetXYZ(plastnext.XYZ() - pfirst.XYZ()); + gp_Vec crossvec = v1.Crossed(v2); + + myDir = dimserv.GetDirection().Crossed(glin->Position().Direction()); + if (crossvec.Dot(dimserv.GetDirection()) > 0 ) + myDir.Reverse();*/ // myDir => donne a la creation + + //-------------------------------------------- + //Calcul du point de positionnement du texte + //-------------------------------------------- + gp_Pnt curpos; + if (myAutomaticPosition) { + myPntAttach.SetXYZ((pfirst.XYZ()+plast.XYZ())/2); + gp_Vec transVec(myDir); + transVec*=myVal; + curpos = myPntAttach.Translated(transVec); + + if (myIsSetBndBox) + curpos = PrsDim::TranslatePointToBound( curpos, myDir, myBndBox ); + + myPosition = curpos; + } + else { + + myPntAttach.SetXYZ((pfirst.XYZ()+plast.XYZ())/2); + Handle(Geom_Line) dimLin = new Geom_Line(myPntAttach, myDir); + Standard_Real parcurpos = ElCLib::Parameter(dimLin->Lin(),myPosition); + curpos = ElCLib::Value(parcurpos,dimLin->Lin()); + //static Standard_Real minlength = 0.005; + //taille minimale de la dimension + + if ( curpos.Distance(myPntAttach) < 5. ) { + gp_Vec transVec(myDir); + transVec*=5.; + curpos = myPntAttach.Translated(transVec); + } + myPosition = curpos; + } + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + + //------------------------------------------------- + //Calcul de la boite englobante du component pour + //determiner la taille de la fleche + //------------------------------------------------- + + if( !myArrowSizeIsDefined ) { + Standard_Real arrsize = myArrowSize; + if ( (myVal/4) < arrsize) + arrsize = myVal/4; + if (arrsize > 30.) + arrsize = 30.; + else if (arrsize < 8.) + arrsize = 8.; + myArrowSize = arrsize; + } + arr->SetLength(myArrowSize); + + //Calcul de la presentation + DsgPrs_Chamf2dPresentation::Add(aPresentation, + myDrawer, + myPntAttach, + curpos, + myText, + mySymbolPrs); + + } + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_Chamf2dDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,myPntAttach,myPosition); + aSelection->Add(seg); + + // Text + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X() + size, + myPosition.Y() + size, + myPosition.Z() + size); + aSelection->Add(box); +} + diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Chamf2dDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Chamf2dDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Chamf2dDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Chamf2dDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,69 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_Chamf2dDimension_HeaderFile +#define _PrsDim_Chamf2dDimension_HeaderFile + +#include +#include +#include +#include + +class Geom_Plane; + +DEFINE_STANDARD_HANDLE(PrsDim_Chamf2dDimension, PrsDim_Relation) + +//! A framework to define display of 2D chamfers. +//! A chamfer is displayed with arrows and text. The text +//! gives the length of the chamfer if it is a symmetrical +//! chamfer, or the angle if it is not. +class PrsDim_Chamf2dDimension : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_Chamf2dDimension, PrsDim_Relation) +public: + + //! Constructs the display object for 2D chamfers. + //! This object is defined by the face aFShape, the + //! dimension aVal, the plane aPlane and the text aText. + Standard_EXPORT PrsDim_Chamf2dDimension(const TopoDS_Shape& aFShape, const Handle(Geom_Plane)& aPlane, const Standard_Real aVal, const TCollection_ExtendedString& aText); + + //! Constructs the display object for 2D chamfers. + //! This object is defined by the face aFShape, the plane + //! aPlane, the dimension aVal, the position aPosition, + //! the type of arrow aSymbolPrs with the size + //! anArrowSize, and the text aText. + Standard_EXPORT PrsDim_Chamf2dDimension(const TopoDS_Shape& aFShape, const Handle(Geom_Plane)& aPlane, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); + + //! Indicates that we are concerned with a 2d length. + virtual PrsDim_KindOfDimension KindOfDimension() const Standard_OVERRIDE { return PrsDim_KOD_LENGTH; } + + //! Returns true if the 2d chamfer dimension is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + +private: + + gp_Pnt myPntAttach; + gp_Dir myDir; + +}; + +#endif // _PrsDim_Chamf2dDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Chamf3dDimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Chamf3dDimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Chamf3dDimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Chamf3dDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,201 @@ +// Created on: 1996-12-05 +// Created by: Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_Chamf3dDimension, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_Chamf3dDimension::PrsDim_Chamf3dDimension(const TopoDS_Shape& aFShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText) +:PrsDim_Relation() +{ + myFShape = aFShape; + myVal = aVal; + myText = aText; + mySymbolPrs = DsgPrs_AS_LASTAR; + myAutomaticPosition = Standard_True; + + myArrowSize = myVal / 100.; +} +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_Chamf3dDimension::PrsDim_Chamf3dDimension(const TopoDS_Shape& aFShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText, + const gp_Pnt& aPosition, + const DsgPrs_ArrowSide aSymbolPrs , + const Standard_Real anArrowSize) +:PrsDim_Relation() +{ + myFShape = aFShape; + myVal = aVal; + myText = aText; + myPosition = aPosition; + mySymbolPrs = aSymbolPrs; + SetArrowSize( anArrowSize ); + myAutomaticPosition = Standard_False; +} + + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_Chamf3dDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& , + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + //---------------------------- + // Calcul du centre de la face + //---------------------------- + BRepAdaptor_Surface surfAlgo (TopoDS::Face(myFShape)); + Standard_Real uFirst, uLast, vFirst, vLast; + uFirst = surfAlgo.FirstUParameter(); + uLast = surfAlgo.LastUParameter(); + vFirst = surfAlgo.FirstVParameter(); + vLast = surfAlgo.LastVParameter(); + Standard_Real uMoy = (uFirst + uLast)/2; + Standard_Real vMoy = (vFirst + vLast)/2; + gp_Pnt apos ; + gp_Vec d1u, d1v; + surfAlgo.D1(uMoy, vMoy, apos, d1u, d1v); + myPntAttach = apos; + + myDir = d1u ^ d1v; +// myDir = surfAlgo.Plane().Axis().Direction(); + + + + + //-------------------------------------------- + //Calcul du point de positionnement du texte + //-------------------------------------------- + gp_Pnt curpos; + if (myAutomaticPosition) { + gp_Vec transVec(myDir); + transVec*=myVal; + curpos = myPntAttach.Translated(transVec); + + if (myIsSetBndBox) + curpos = PrsDim::TranslatePointToBound( curpos, myDir, myBndBox ); + + myPosition = curpos; + } + else { + + Handle(Geom_Line) dimLin = new Geom_Line(myPntAttach, myDir); + Standard_Real parcurpos = ElCLib::Parameter(dimLin->Lin(),myPosition); + curpos = ElCLib::Value(parcurpos,dimLin->Lin()); + + if ( curpos.Distance(myPntAttach) < 5. ) { + gp_Vec transVec(myDir); + transVec*=5.; + curpos = myPntAttach.Translated(transVec); + } + myPosition = curpos; + } + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + + //------------------------------------------------- + //Calcul de la boite englobante du component pour + //determiner la taille de la fleche + //------------------------------------------------- + if( !myArrowSizeIsDefined ) { + Standard_Real arrsize = myArrowSize; + if ( (myVal/4) < arrsize) + arrsize = myVal/4; + if (arrsize > 30.) + arrsize = 30.; + else if (arrsize < 8.) + arrsize = 8.; + myArrowSize = arrsize; + } + arr->SetLength(myArrowSize); + + //Calcul de la presentation + DsgPrs_Chamf2dPresentation::Add(aPresentation, + myDrawer, + myPntAttach, + curpos, + myText, + mySymbolPrs); + +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_Chamf3dDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,myPntAttach,myPosition); + aSelection->Add(seg); + + // Text + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X() + size, + myPosition.Y() + size, + myPosition.Z() + size); + aSelection->Add(box); +} + diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Chamf3dDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Chamf3dDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Chamf3dDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Chamf3dDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,67 @@ +// Created on: 1996-12-05 +// Created by: Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_Chamf3dDimension_HeaderFile +#define _PrsDim_Chamf3dDimension_HeaderFile + +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_Chamf3dDimension, PrsDim_Relation) + +//! A framework to define display of 3D chamfers. +//! A chamfer is displayed with arrows and text. The text +//! gives the length of the chamfer if it is a symmetrical +//! chamfer, or the angle if it is not. +class PrsDim_Chamf3dDimension : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_Chamf3dDimension, PrsDim_Relation) +public: + + //! Constructs a display object for 3D chamfers. + //! This object is defined by the shape aFShape, the + //! dimension aVal and the text aText. + Standard_EXPORT PrsDim_Chamf3dDimension(const TopoDS_Shape& aFShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); + + //! Constructs a display object for 3D chamfers. + //! This object is defined by the shape aFShape, the + //! dimension aVal, the text aText, the point of origin of + //! the chamfer aPosition, the type of arrow aSymbolPrs + //! with the size anArrowSize. + Standard_EXPORT PrsDim_Chamf3dDimension(const TopoDS_Shape& aFShape, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); + + //! Indicates that we are concerned with a 3d length. + virtual PrsDim_KindOfDimension KindOfDimension() const Standard_OVERRIDE { return PrsDim_KOD_LENGTH; } + + //! Returns true if the 3d chamfer dimension is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + +private: + + gp_Pnt myPntAttach; + gp_Dir myDir; + +}; + +#endif // _PrsDim_Chamf3dDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_ConcentricRelation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_ConcentricRelation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_ConcentricRelation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_ConcentricRelation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,251 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_ConcentricRelation, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_ConcentricRelation::PrsDim_ConcentricRelation( + const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape, + const Handle(Geom_Plane)& aPlane) +{ + myFShape = aFShape; + mySShape = aSShape; + myPlane = aPlane; + myDir = aPlane->Pln().Axis().Direction(); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_ConcentricRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + TopAbs_ShapeEnum type2(mySShape.ShapeType()); + aPresentation->SetInfiniteState(Standard_True); + switch (myFShape.ShapeType()) { + case TopAbs_EDGE: + { + if (type2 == TopAbs_EDGE) ComputeTwoEdgesConcentric(aPresentation); + else if (type2 == TopAbs_VERTEX) ComputeEdgeVertexConcentric(aPresentation); + } + break; + + case TopAbs_VERTEX: + { + if (type2 == TopAbs_VERTEX) ComputeTwoVerticesConcentric(aPresentation); + else if (type2 == TopAbs_EDGE) ComputeEdgeVertexConcentric(aPresentation); + } + break; + default: {return;} + } +} + +//======================================================================= +//function : ComputeTwoEdgesConcentric +//purpose : +//======================================================================= +void PrsDim_ConcentricRelation::ComputeEdgeVertexConcentric(const Handle(Prs3d_Presentation)& aPresentation) +{ + TopoDS_Edge E; + TopoDS_Vertex V; + if (myFShape.ShapeType() == TopAbs_EDGE) { + E = TopoDS::Edge(myFShape); + V = TopoDS::Vertex(mySShape); + } + else { + E = TopoDS::Edge(mySShape); + V = TopoDS::Vertex(myFShape); + } + gp_Pnt p1,p2; + Handle(Geom_Curve) C; + Handle(Geom_Curve) extCurv; + Standard_Boolean isInfinite; + Standard_Boolean isOnPlanEdge, isOnPlanVertex; + if (!PrsDim::ComputeGeometry(E,C,p1,p2,extCurv,isInfinite,isOnPlanEdge,myPlane)) return; + gp_Pnt P; + PrsDim::ComputeGeometry(V,P, myPlane, isOnPlanVertex); + + Handle(Geom_Circle) CIRCLE (Handle(Geom_Circle)::DownCast (C)); + myCenter = CIRCLE->Location(); + myRad = Min(CIRCLE->Radius()/5.,15.); + gp_Dir vec(p1.XYZ() - myCenter.XYZ() ); + gp_Vec vectrans(vec); + myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); + DsgPrs_ConcentricPresentation::Add(aPresentation,myDrawer,myCenter,myRad,myDir,myPnt); + if (!isOnPlanEdge) PrsDim::ComputeProjEdgePresentation(aPresentation,myDrawer,E,CIRCLE,p1,p2); + if (!isOnPlanVertex) PrsDim::ComputeProjVertexPresentation(aPresentation,myDrawer,V,P); +} + +//======================================================================= +//function : ComputeTwoEdgesConcentric +//purpose : +//======================================================================= +void PrsDim_ConcentricRelation::ComputeTwoVerticesConcentric(const Handle(Prs3d_Presentation)& aPresentation) +{ + TopoDS_Vertex V1,V2; + V1 = TopoDS::Vertex(myFShape); + V2 = TopoDS::Vertex(myFShape); + Standard_Boolean isOnPlanVertex1(Standard_True),isOnPlanVertex2(Standard_True); + gp_Pnt P1,P2; + PrsDim::ComputeGeometry(V1,P1, myPlane,isOnPlanVertex1); + PrsDim::ComputeGeometry(V2,P2, myPlane,isOnPlanVertex2); + myCenter = P1; + myRad = 15.; + gp_Dir vec(myPlane->Pln().Position().XDirection()); + gp_Vec vectrans(vec); + myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); + DsgPrs_ConcentricPresentation::Add(aPresentation,myDrawer,myCenter,myRad,myDir,myPnt); + if (!isOnPlanVertex1) PrsDim::ComputeProjVertexPresentation(aPresentation,myDrawer,V1,P1); + if (!isOnPlanVertex2) PrsDim::ComputeProjVertexPresentation(aPresentation,myDrawer,V2,P2); +} + +//======================================================================= +//function : ComputeTwoEdgesConcentric +//purpose : +//======================================================================= +void PrsDim_ConcentricRelation::ComputeTwoEdgesConcentric(const Handle(Prs3d_Presentation)& aPresentation) +{ + BRepAdaptor_Curve curv1(TopoDS::Edge(myFShape)); + BRepAdaptor_Curve curv2(TopoDS::Edge(mySShape)); + + gp_Pnt ptat11,ptat12,ptat21,ptat22; + Handle(Geom_Curve) geom1,geom2; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myFShape), TopoDS::Edge(mySShape), + myExtShape, + geom1, geom2, + ptat11, ptat12, + ptat21, ptat22, + extCurv, + isInfinite1,isInfinite2, + myPlane)) { + return; + } + + Handle(Geom_Circle) gcirc1 (Handle(Geom_Circle)::DownCast (geom1)); + Handle(Geom_Circle) gcirc2 (Handle(Geom_Circle)::DownCast (geom2)); + + myCenter = gcirc1->Location(); + + // choose the radius equal to 1/5 of the smallest radius of + // 2 circles. Limit is imposed ( 0.02 by chance) + Standard_Real aRad1 = gcirc1->Radius(); + Standard_Real aRad2 = gcirc2->Radius(); + myRad = (aRad1 > aRad2 ) ? aRad2 : aRad1; + myRad /= 5; + if (myRad > 15.) myRad =15.; + + + //Calculate a point of circle of radius myRad + gp_Dir vec(ptat11.XYZ() - myCenter.XYZ() ); + gp_Vec vectrans(vec); + myPnt = myCenter.Translated(vectrans.Multiplied(myRad)); + + DsgPrs_ConcentricPresentation::Add(aPresentation, + myDrawer, + myCenter, + myRad, + myDir, + myPnt); + if ( (myExtShape != 0) && !extCurv.IsNull()) { + gp_Pnt pf, pl; + if ( myExtShape == 1 ) { + if (!isInfinite1) { + pf = ptat11; + pl = ptat12; + } + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),gcirc1,pf,pl); + } + else { + if (!isInfinite2) { + pf = ptat21; + pl = ptat22; + } + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),gcirc2,pf,pl); + } + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_ConcentricRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + + //Creation of 2 sensitive circles + // the greater + gp_Ax2 ax(myCenter, myDir); + gp_Circ aCirc (ax, myRad); + Handle(Select3D_SensitiveCircle) sensit = new Select3D_SensitiveCircle (own, aCirc); + aSelection->Add(sensit); + // the smaller + aCirc.SetRadius(myRad/2); + sensit = new Select3D_SensitiveCircle (own, aCirc); + aSelection->Add(sensit); + + //Creation of 2 segments sensitive for the cross + Handle(Select3D_SensitiveSegment) seg; + gp_Pnt otherPnt = myPnt.Mirrored(myCenter); + seg = new Select3D_SensitiveSegment(own, + otherPnt, + myPnt); + aSelection->Add(seg); + + gp_Ax1 RotateAxis(myCenter, myDir); + gp_Pnt FPnt = myCenter.Rotated(RotateAxis, M_PI/2); + gp_Pnt SPnt = myCenter.Rotated(RotateAxis, -M_PI/2); + seg = new Select3D_SensitiveSegment(own, + FPnt, + SPnt); + aSelection->Add(seg); + +} + diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_ConcentricRelation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_ConcentricRelation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_ConcentricRelation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_ConcentricRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,66 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_ConcentricRelation_HeaderFile +#define _PrsDim_ConcentricRelation_HeaderFile + +#include +#include + +class Geom_Plane; + +DEFINE_STANDARD_HANDLE(PrsDim_ConcentricRelation, PrsDim_Relation) + +//! A framework to define a constraint by a relation of +//! concentricity between two or more interactive datums. +//! The display of this constraint is also defined. +//! A plane is used to create an axis along which the +//! relation of concentricity can be extended. +class PrsDim_ConcentricRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_ConcentricRelation, PrsDim_Relation) +public: + + //! Constructs the display object for concentric relations + //! between shapes. + //! This object is defined by the two shapes, aFShape + //! and aSShape and the plane aPlane. + //! aPlane is provided to create an axis along which the + //! relation of concentricity can be extended. + Standard_EXPORT PrsDim_ConcentricRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoEdgesConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); + + Standard_EXPORT void ComputeEdgeVertexConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); + + Standard_EXPORT void ComputeTwoVerticesConcentric (const Handle(Prs3d_Presentation)& aPresentationManager); + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + +private: + + gp_Pnt myCenter; + Standard_Real myRad; + gp_Dir myDir; + gp_Pnt myPnt; + +}; + +#endif // _PrsDim_ConcentricRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1533 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const Standard_Real SquareTolerance = Precision::SquareConfusion(); + +//======================================================================= +//function : Nearest +//purpose : +//======================================================================= +gp_Pnt PrsDim::Nearest(const TopoDS_Shape& ashape, const gp_Pnt& apoint) +{ + Standard_Real dist2 = RealLast(); + Standard_Real curdist2; + gp_Pnt result(0.0,0.0,0.0); + gp_Pnt curpnt(0.0,0.0,0.0); + TopExp_Explorer explo(ashape,TopAbs_VERTEX); + while (explo.More()) + { + curpnt = BRep_Tool::Pnt(TopoDS::Vertex(explo.Current())); + curdist2 = apoint.SquareDistance(curpnt); + if (curdist2 < dist2) + { + result = curpnt; + dist2 = curdist2; + } + explo.Next(); + } + return result; +} + +//======================================================================= +//function : Nearest +//purpose : For finds the nearest point on . +//======================================================================= +gp_Pnt PrsDim::Nearest (const gp_Lin& theLine, const gp_Pnt& thePoint) +{ + Handle(Geom_Line) aLine = new Geom_Line (theLine); + + GeomAPI_ProjectPointOnCurve aPointProj (thePoint, aLine); + return aPointProj.Point (1); +} + +//======================================================================= +//function : Nearest +//purpose : For the given point finds nearest point on the curve, +// return TRUE if found point is belongs to curve +// and FALSE otherwise. +//======================================================================= +Standard_Boolean PrsDim::Nearest (const Handle(Geom_Curve)& theCurve, + const gp_Pnt& thePoint, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theLastPoint, + gp_Pnt& theNearestPoint) +{ + GeomAPI_ProjectPointOnCurve aPointProj (thePoint, theCurve); + theNearestPoint = theCurve->Value (aPointProj.LowerDistanceParameter()); + + Standard_Real aLength = theFirstPoint.Distance (theLastPoint); + if (theNearestPoint.Distance (theFirstPoint) > aLength + || theNearestPoint.Distance (theLastPoint) > aLength) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : Farest +//purpose : +//======================================================================= +gp_Pnt PrsDim::Farest( const TopoDS_Shape& aShape, const gp_Pnt& aPoint ) +{ + Standard_Real MaxDist2 = 0.0e0, curdist2; + gp_Pnt Result(0.0,0.0,0.0); + gp_Pnt curpnt(0.0,0.0,0.0); + TopExp_Explorer Explo( aShape, TopAbs_VERTEX ); + for (; Explo.More(); Explo.Next()) + { + curpnt = BRep_Tool::Pnt( TopoDS::Vertex( Explo.Current() ) ); + curdist2 = aPoint.SquareDistance( curpnt ); + if (curdist2 > MaxDist2) + { + MaxDist2 = curdist2; + Result = curpnt; + } + } + return Result; +} + + +//======================================================================= +//function : ComputeGeometry +//purpose : for line, circle, ellipse. +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theEdge, + Handle(Geom_Curve)& theCurve, + gp_Pnt& theFirstPnt, + gp_Pnt& theLastPnt) +{ + TopLoc_Location anEdgeLoc; + Standard_Real aFirst, aLast; + theCurve = BRep_Tool::Curve (theEdge, anEdgeLoc, aFirst, aLast); + if (theCurve.IsNull()) + { + return Standard_False; + } + + if (!anEdgeLoc.IsIdentity()) + { + Handle(Geom_Geometry) aGeometry = theCurve->Transformed (anEdgeLoc.Transformation()); + theCurve = Handle(Geom_Curve)::DownCast (aGeometry); + } + + if (theCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theCurve = Handle(Geom_TrimmedCurve)::DownCast (theCurve)->BasisCurve(); + } + + if (theCurve->IsInstance (STANDARD_TYPE (Geom_Line))) + { + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theCurve); + theFirstPnt = ElCLib::Value (aFirst, aLine->Lin()); + theLastPnt = ElCLib::Value (aLast, aLine->Lin()); + } + else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) + { + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theCurve); + + theFirstPnt = ElCLib::Value (aFirst, aCirc->Circ()); + theLastPnt = ElCLib::Value (aLast, aCirc->Circ()); + } + else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Ellipse))) + { + Handle(Geom_Ellipse) anEllipse = Handle(Geom_Ellipse)::DownCast (theCurve); + theFirstPnt = ElCLib::Value (aFirst, anEllipse->Elips()); + theLastPnt = ElCLib::Value (aLast, anEllipse->Elips()); + } + else + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : for line, circle, ellipse. +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theEdge, + Handle(Geom_Curve)& theCurve, + gp_Pnt& theFirstPnt, + gp_Pnt& theLastPnt, + Standard_Boolean& theIsInfinite) +{ + Standard_Real aFirst, aLast; + + BRepAdaptor_Curve anAdaptor (theEdge); + + theCurve = Handle(Geom_Curve)::DownCast + (anAdaptor.Curve().Curve()->Transformed (anAdaptor.Trsf())); + + if (theCurve.IsNull()) + { + return Standard_False; + } + + aFirst = anAdaptor.FirstParameter(); + aLast = anAdaptor.LastParameter(); + + theIsInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); + + if (theCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theCurve = Handle(Geom_TrimmedCurve)::DownCast (theCurve)->BasisCurve(); + } + + if (!theIsInfinite) + { + theFirstPnt = theCurve->Value (aFirst); + theLastPnt = theCurve->Value (aLast); + } + else + { + theFirstPnt = gp::Origin(); + theLastPnt = gp::Origin(); + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : +//======================================================================= + +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theEdge, + Handle(Geom_Curve)& theCurve, + gp_Pnt& theFirstPnt, + gp_Pnt& theLastPnt, + Handle(Geom_Curve)& theExtCurve, + Standard_Boolean& theIsInfinite, + Standard_Boolean& theIsOnPlane, + const Handle(Geom_Plane)& thePlane) +{ + if (thePlane.IsNull()) + { + return Standard_False; + } + + Standard_Real aFirst, aLast; + BRepAdaptor_Curve aCurveAdaptor (theEdge); + theCurve = Handle(Geom_Curve)::DownCast (aCurveAdaptor.Curve().Curve()->Transformed (aCurveAdaptor.Trsf())); + aFirst = aCurveAdaptor.FirstParameter(); + aLast = aCurveAdaptor.LastParameter(); + + if (theCurve.IsNull()) + { + return Standard_False; + } + + theExtCurve = theCurve; + theIsInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); + + // Checks that the projected curve is not in the plane. + theIsOnPlane = Standard_True; + if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theExtCurve = Handle(Geom_TrimmedCurve)::DownCast (theExtCurve)->BasisCurve(); + } + + if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_Line))) + { + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theExtCurve); + theIsOnPlane = thePlane->Pln().Contains (aLine->Lin(), + Precision::Confusion(), + Precision::Angular()); + } + else if (theExtCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) + { + Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast (theExtCurve); + + gp_Ax3 aCircPos (aCircle->Position()); + theIsOnPlane = aCircPos.IsCoplanar (thePlane->Pln().Position(), + Precision::Confusion(), + Precision::Angular()); + } + + if (theIsOnPlane) + { + theExtCurve.Nullify(); + } + + theCurve = GeomProjLib::ProjectOnPlane (theCurve, thePlane, + thePlane->Pln().Axis().Direction(), + Standard_False); + + if (theCurve->IsInstance (STANDARD_TYPE (Geom_Line))) + { + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theCurve); + if (!theIsInfinite) + { + theFirstPnt = ElCLib::Value (aFirst, aLine->Lin()); + theLastPnt = ElCLib::Value (aLast, aLine->Lin()); + } + } + else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) + { + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theCurve); + + theFirstPnt = ElCLib::Value (aFirst, aCirc->Circ()); + theLastPnt = ElCLib::Value (aLast, aCirc->Circ()); + } + else if (theCurve->IsInstance (STANDARD_TYPE (Geom_Ellipse))) + { + Handle(Geom_Ellipse) anEllipse = Handle(Geom_Ellipse)::DownCast (theCurve); + + theFirstPnt = ElCLib::Value (aFirst, anEllipse->Elips()); + theLastPnt = ElCLib::Value (aLast, anEllipse->Elips()); + } + else + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge, + Handle(Geom_Curve)& theFirstCurve, + Handle(Geom_Curve)& theSecondCurve, + gp_Pnt& theFirstPnt1, + gp_Pnt& theLastPnt1, + gp_Pnt& theFirstPnt2, + gp_Pnt& theLastPnt2, + const Handle(Geom_Plane)& thePlane) +{ + if (thePlane.IsNull()) + { + return Standard_False; + } + + TopLoc_Location aFirstEdgeLoc, aSecondEdgeLoc; + Standard_Real aFirst1, aLast1, aFirst2, aLast2; + + theFirstCurve = BRep_Tool::Curve (theFirstEdge, aFirstEdgeLoc, aFirst1, aLast1); + theSecondCurve = BRep_Tool::Curve (theSecondEdge, aSecondEdgeLoc, aFirst2, aLast2); + + if (theFirstCurve.IsNull()) + { + return Standard_False; + } + + if (theSecondCurve.IsNull()) + { + return Standard_False; + } + + if (!aFirstEdgeLoc.IsIdentity()) + { + Handle(Geom_Geometry) aGeomGeometry = theFirstCurve->Transformed (aFirstEdgeLoc.Transformation()); + theFirstCurve = Handle(Geom_Curve)::DownCast (aGeomGeometry); + } + + if (!aSecondEdgeLoc.IsIdentity()) + { + Handle(Geom_Geometry) aGeomGeometry = theSecondCurve->Transformed (aSecondEdgeLoc.Transformation()); + theSecondCurve = Handle(Geom_Curve)::DownCast (aGeomGeometry); + } + + theFirstCurve = GeomProjLib::ProjectOnPlane (theFirstCurve, thePlane, + thePlane->Pln().Axis().Direction(), + Standard_False); + + + theSecondCurve = GeomProjLib::ProjectOnPlane (theSecondCurve, thePlane, + thePlane->Pln().Axis().Direction(), + Standard_False); + + + if (theFirstCurve->IsInstance (STANDARD_TYPE(Geom_TrimmedCurve))) + { + theFirstCurve = Handle(Geom_TrimmedCurve)::DownCast (theFirstCurve)->BasisCurve(); + } + + if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theSecondCurve = Handle(Geom_TrimmedCurve)::DownCast (theSecondCurve)->BasisCurve(); + } + + if (theFirstCurve->IsInstance(STANDARD_TYPE(Geom_Line))) + { + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theFirstCurve); + + theFirstPnt1 = ElCLib::Value (aFirst1, aLine->Lin()); + theLastPnt1 = ElCLib::Value (aLast1, aLine->Lin()); + } + else if (theFirstCurve->IsInstance(STANDARD_TYPE(Geom_Circle))) + { + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theFirstCurve); + + theFirstPnt1 = ElCLib::Value (aFirst1, aCirc->Circ()); + theLastPnt1 = ElCLib::Value (aLast1, aCirc->Circ()); + } + else + { + return Standard_False; + } + + if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_Line))) +{ + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast (theSecondCurve); + + theFirstPnt2 = ElCLib::Value (aFirst2, aLine->Lin()); + theLastPnt2 = ElCLib::Value (aLast2, aLine->Lin()); + } + else if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_Circle))) + { + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast (theSecondCurve); + + theFirstPnt2 = ElCLib::Value (aFirst2, aCirc->Circ()); + theLastPnt2 = ElCLib::Value (aLast2, aCirc->Circ()); + } + else + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : Computes the geometry of the 2 edges. +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge, + Handle(Geom_Curve)& theFirstCurve, + Handle(Geom_Curve)& theSecondCurve, + gp_Pnt& theFirstPnt1, + gp_Pnt& theLastPnt1, + gp_Pnt& theFirstPnt2, + gp_Pnt& theLastPnt2, + Standard_Boolean& theIsInfinite1, + Standard_Boolean& theIsInfinite2) +{ + theIsInfinite1 = theIsInfinite2 = Standard_False; + + if (!PrsDim::ComputeGeometry (theFirstEdge, theFirstCurve,theFirstPnt1, theLastPnt1, theIsInfinite1)) + { + return Standard_False; + } + + if (!PrsDim::ComputeGeometry (theSecondEdge, theSecondCurve,theFirstPnt2, theLastPnt2, theIsInfinite2)) + { + return Standard_False; + } + + if (theIsInfinite1 || theIsInfinite2) + { + if (theFirstCurve->DynamicType() == theSecondCurve->DynamicType()) + { + gp_Lin aLin1 = Handle(Geom_Line)::DownCast (theFirstCurve)->Lin(); + gp_Lin aLin2 = Handle(Geom_Line)::DownCast (theSecondCurve)->Lin(); + + if (theIsInfinite1) + { + theFirstPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theFirstPnt2), aLin1); + theLastPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theLastPnt2), aLin1); + } + else if (theIsInfinite2) + { + theFirstPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theFirstPnt1), aLin2); + theLastPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theLastPnt1), aLin2); + } + } + else + { + if (theIsInfinite1 && !theIsInfinite2) + { + GeomAPI_ProjectPointOnCurve aProjector (theFirstPnt2, theFirstCurve); + theFirstPnt1 = theFirstCurve->Value (aProjector.LowerDistanceParameter ()); + + aProjector.Init (theLastPnt2, theFirstCurve); + theLastPnt1 = theFirstCurve->Value (aProjector.LowerDistanceParameter ()); + } + else if (!theIsInfinite1 && theIsInfinite2) + { + GeomAPI_ProjectPointOnCurve aProjector (theFirstPnt1, theSecondCurve); + theFirstPnt2 = theSecondCurve->Value (aProjector.LowerDistanceParameter ()); + + aProjector.Init (theLastPnt1, theSecondCurve); + theLastPnt2 = theSecondCurve->Value (aProjector.LowerDistanceParameter ()); + } + else + { + return Standard_False; + } + } + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : Computes the geometry of the 2 edges in the current wp +// and the 'right' geometry of the edges if one doesn't +// belong to the current working plane. +// There may be only one curve that can't belong to the +// current working plane ( attachement constraint) +// if the 2 edges belong to the current WP, = 0 +// +// indexExt = 0 2 edges are in the current wp +// indexExt = 1 first edge is not in the current wp +// indexExt = 2 second edge is not in the current wp +// if none of the two edges is in the current wp , +// it returns Standard_False +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge, + Standard_Integer& theExtIndex, + Handle(Geom_Curve)& theFirstCurve, + Handle(Geom_Curve)& theSecondCurve, + gp_Pnt& theFirstPnt1, + gp_Pnt& theLastPnt1, + gp_Pnt& theFirstPnt2, + gp_Pnt& theLastPnt2, + Handle(Geom_Curve)& theExtCurve, + Standard_Boolean& theIsInfinite1, + Standard_Boolean& theIsInfinite2, + const Handle(Geom_Plane)& thePlane) +{ + if (thePlane.IsNull()) + { + return Standard_False; + } + + theExtCurve.Nullify(); + theExtIndex = 0; + + Standard_Real aFirst1, aLast1, aFirst2, aLast2; + theIsInfinite1 = theIsInfinite2 = Standard_False; + + BRepAdaptor_Curve aFirstAdaptor (theFirstEdge); + BRepAdaptor_Curve aSecondAdaptor (theSecondEdge); + + theFirstCurve = Handle(Geom_Curve)::DownCast + (aFirstAdaptor.Curve().Curve()->Transformed (aFirstAdaptor.Trsf())); + theSecondCurve = Handle(Geom_Curve)::DownCast + (aSecondAdaptor.Curve().Curve()->Transformed (aSecondAdaptor.Trsf())); + + if (theFirstCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theFirstCurve = Handle(Geom_TrimmedCurve)::DownCast (theFirstCurve)->BasisCurve(); + } + if (theSecondCurve->IsInstance (STANDARD_TYPE (Geom_TrimmedCurve))) + { + theSecondCurve = Handle(Geom_TrimmedCurve)::DownCast (theSecondCurve)->BasisCurve(); + } + + aFirst1 = aFirstAdaptor.FirstParameter(); + aLast1 = aFirstAdaptor.LastParameter(); + + aFirst2 = aSecondAdaptor.FirstParameter(); + aLast2 = aSecondAdaptor.LastParameter(); + + if (theFirstCurve.IsNull() || theSecondCurve.IsNull()) + { + return Standard_False; + } + + Handle(Geom_Curve) aFirstSaved = theFirstCurve; + Handle(Geom_Curve) aSecondSaved = theSecondCurve; + + // Checks that the projected curve is not in the plane + Standard_Boolean isFirstOnPlane,isSecondOnPlane; + + if ((!ComputeGeomCurve (theFirstCurve, aFirst1, aLast1, theFirstPnt1, theLastPnt1, thePlane, isFirstOnPlane)) + || (!ComputeGeomCurve( theSecondCurve, aFirst2, aLast2, theFirstPnt2, theLastPnt2, thePlane,isSecondOnPlane))) + { + return Standard_False; + } + + if (Precision::IsInfinite (aFirst1) || Precision::IsInfinite (aLast1)) + { + theIsInfinite1 = Standard_True; + theExtIndex = 1; + } + if (Precision::IsInfinite (aFirst2) || Precision::IsInfinite (aLast2)) + { + theIsInfinite2 = Standard_True; + theExtIndex = 2; + } + if (theIsInfinite1 && theIsInfinite2) + { + theExtIndex = 0; + } + + if (theIsInfinite1 || theIsInfinite2) + { + if (theFirstCurve->DynamicType() == theSecondCurve->DynamicType()) + { + gp_Lin aLin1 = Handle(Geom_Line)::DownCast (theFirstCurve)->Lin(); + gp_Lin aLin2 = Handle(Geom_Line)::DownCast (theSecondCurve)->Lin(); + + if (theExtIndex == 1) + { + theFirstPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theFirstPnt2), aLin1); + theLastPnt1 = ElCLib::Value (ElCLib::Parameter (aLin2, theLastPnt2), aLin1); + } + else if (theExtIndex == 2) + { + theFirstPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theFirstPnt1), aLin2); + theLastPnt2 = ElCLib::Value (ElCLib::Parameter (aLin1, theLastPnt1), aLin2); + } + } + } + + if (isFirstOnPlane && isSecondOnPlane) + { + return Standard_True; + } + + if (!isFirstOnPlane && isSecondOnPlane) + {// curve 2 only in the plane + theExtIndex = 1; + theExtCurve = aFirstSaved; + } + else if (isFirstOnPlane && !isSecondOnPlane) + {// curve 1 only in the plane + theExtIndex = 2; + theExtCurve = aSecondSaved; + } + else + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeGeomCurve +//purpose : Checks if aCurve belongs to aPlane; if not, projects aCurve in aPlane +// and returns aCurveproj; +// Return TRUE if ok +//======================================================================= +Standard_Boolean PrsDim::ComputeGeomCurve (Handle(Geom_Curve)& aCurve, + const Standard_Real first1, + const Standard_Real last1, + gp_Pnt& FirstPnt1, + gp_Pnt& LastPnt1, + const Handle(Geom_Plane)& aPlane, + Standard_Boolean& isOnPlane) +{ + isOnPlane = Standard_True; + const Standard_Integer NodeNumber = 20; + Standard_Real Delta = (last1 - first1) / (NodeNumber - 1); + if (Delta <= Precision::PConfusion()) + { + Delta = last1 - first1; + } + + gp_Pnt CurPnt(0.0, 0.0, 0.0); + Standard_Real CurPar = first1; + for (Standard_Integer i = 1; i <= NodeNumber; i++) + { + CurPnt = aCurve->Value( CurPar ); + if (aPlane->Pln().SquareDistance( CurPnt ) > SquareTolerance) + { + isOnPlane = Standard_False; + break; + } + CurPar += Delta; + } + + if (!Precision::IsInfinite(first1) && !Precision::IsInfinite(last1)) + { + FirstPnt1 = aCurve->Value (first1); + LastPnt1 = aCurve->Value (last1); + } + + if (!isOnPlane) + { + Handle(Geom_Curve) aGeomCurve = GeomProjLib::ProjectOnPlane (aCurve, + aPlane, + aPlane->Pln().Axis().Direction(), + Standard_False); + aCurve = aGeomCurve; + if (aCurve->IsInstance(STANDARD_TYPE(Geom_TrimmedCurve))) + { + aCurve = Handle(Geom_TrimmedCurve)::DownCast (aCurve)->BasisCurve(); + } + if (! Precision::IsInfinite(first1) && ! Precision::IsInfinite(last1)) + { + FirstPnt1 = PrsDim::ProjectPointOnPlane( FirstPnt1, aPlane->Pln() ); + LastPnt1 = PrsDim::ProjectPointOnPlane( LastPnt1, aPlane->Pln() ); + } + } + return Standard_True; +} + +//======================================================================= +//function : ComputeGeometry +//purpose : computes the point corresponding to the vertex +// in the plane . If the vertex is already in the plane +// , = true. +// is the projected vertex in the plane. +//======================================================================= +Standard_Boolean PrsDim::ComputeGeometry (const TopoDS_Vertex& aVertex, + gp_Pnt& point, + const Handle(Geom_Plane)& aPlane, + Standard_Boolean& isOnPlane) +{ + point = BRep_Tool::Pnt(aVertex); + isOnPlane = aPlane->Pln().Contains(point, Precision::Confusion()); + if ( !isOnPlane) { + point = PrsDim::ProjectPointOnPlane( point, aPlane->Pln() ); + } + return Standard_True; +} + +//======================================================================= +//function : GetPlaneFromFace +//purpose : +// Returns type of surface which can be Plane or OtherSurface +//======================================================================= +Standard_Boolean PrsDim::GetPlaneFromFace (const TopoDS_Face& aFace, + gp_Pln& aPlane, + Handle(Geom_Surface)& aSurf, + PrsDim_KindOfSurface& aSurfType, + Standard_Real& Offset) + +{ + Standard_Boolean Result = Standard_False; + BRepAdaptor_Surface surf1( aFace ); + Handle( Adaptor3d_HSurface ) surf2; + Standard_Boolean isOffset = Standard_False; + Offset = 0.0; + + if (surf1.GetType() == GeomAbs_OffsetSurface) + { + // Extracting Basis Surface + surf2 = surf1.BasisSurface(); + isOffset = Standard_True; + } + else + surf2 = new BRepAdaptor_HSurface( surf1 ); + + aSurf = surf1.Surface().Surface(); + // aSurf->Transform(surf1.Trsf()) ; + aSurf = Handle( Geom_Surface )::DownCast( aSurf->Transformed( surf1.Trsf() ) ); + + if (surf2->GetType() == GeomAbs_Plane) + { + aPlane = surf2->Plane(); + aSurfType = PrsDim_KOS_Plane; + Result = Standard_True; + } + else if (surf2->GetType() == GeomAbs_SurfaceOfExtrusion) + { + Handle( Adaptor3d_HCurve ) BasisCurve = surf2->BasisCurve(); + gp_Dir ExtrusionDir = surf2->Direction(); + if (BasisCurve->GetType() == GeomAbs_Line) + { + gp_Lin BasisLine = BasisCurve->Line(); + gp_Dir LineDir = BasisLine.Direction(); + gp_Pnt LinePos = BasisLine.Location(); + gp_Pln thePlane( LinePos, LineDir ^ ExtrusionDir); + aPlane = thePlane; + aSurfType = PrsDim_KOS_Plane; + Result = Standard_True; + } + } + + if (Result == Standard_True && isOffset) + { + aSurf = (Handle( Geom_OffsetSurface )::DownCast( aSurf ))->Surface(); + aPlane = (Handle( Geom_Plane )::DownCast( aSurf ))->Pln(); + } + if (Result == Standard_False) + { + if (isOffset) + { + Handle( Standard_Type ) TheType = aSurf->DynamicType(); + if (TheType == STANDARD_TYPE(Geom_CylindricalSurface) || + TheType == STANDARD_TYPE(Geom_ConicalSurface) || + TheType == STANDARD_TYPE(Geom_SphericalSurface) || + TheType == STANDARD_TYPE(Geom_ToroidalSurface)) + { + aSurf = Handle(Geom_OffsetSurface)::DownCast(aSurf)->Surface(); + } + else + { + Offset = Handle(Geom_OffsetSurface)::DownCast(aSurf)->Offset(); + aSurf = Handle(Geom_OffsetSurface)::DownCast(aSurf)->BasisSurface(); + } + } + Handle( Standard_Type ) TheType = aSurf->DynamicType(); + if (TheType == STANDARD_TYPE(Geom_CylindricalSurface)) + aSurfType = PrsDim_KOS_Cylinder; + else if (TheType == STANDARD_TYPE(Geom_ConicalSurface)) + aSurfType = PrsDim_KOS_Cone; + else if (TheType == STANDARD_TYPE(Geom_SphericalSurface)) + aSurfType = PrsDim_KOS_Sphere; + else if (TheType == STANDARD_TYPE(Geom_ToroidalSurface)) + aSurfType = PrsDim_KOS_Torus; + else if (TheType == STANDARD_TYPE(Geom_SurfaceOfRevolution)) + aSurfType = PrsDim_KOS_Revolution; + else if (TheType == STANDARD_TYPE(Geom_SurfaceOfLinearExtrusion)) + aSurfType = PrsDim_KOS_Extrusion; + else + aSurfType = PrsDim_KOS_OtherSurface; + } + return Result; +} + + +//======================================================================= +//function : ProjectPointOnPlane +//purpose : +//======================================================================= + +gp_Pnt PrsDim::ProjectPointOnPlane( const gp_Pnt & aPoint, const gp_Pln & aPlane ) +{ + gp_Vec aVec( aPlane.Location(), aPoint ); + gp_Vec Normal = aPlane.Axis().Direction(); + Normal = (aVec * Normal) * Normal; + + return ( aPoint.Translated( -Normal ) ); +} + +//======================================================================= +//function : ProjectPointOnLine +//purpose : +//======================================================================= + +gp_Pnt PrsDim::ProjectPointOnLine( const gp_Pnt & aPoint, const gp_Lin & aLine ) +{ + gp_XYZ LinLoc = aLine.Location().XYZ(); + gp_XYZ LinDir = aLine.Direction().XYZ(); + Standard_Real Parameter = (aPoint.XYZ() - LinLoc) * LinDir; + gp_Pnt Result( LinLoc + Parameter * LinDir ); + return Result; +} + +//======================================================================= +//function : InitFaceLength +//purpose : +//======================================================================= +void PrsDim::InitFaceLength (const TopoDS_Face& theFace, + gp_Pln& thePlane, + Handle(Geom_Surface)& theSurface, + PrsDim_KindOfSurface& theSurfaceType, + Standard_Real& theOffset) +{ + if (PrsDim::GetPlaneFromFace (theFace, thePlane, theSurface, theSurfaceType, theOffset) + && Abs (theOffset) > Precision::Confusion()) + { + theSurface = new Geom_OffsetSurface (theSurface, theOffset); + theOffset = 0.0e0; + } +} + +//======================================================================= +//function : InitAngleBetweenPlanarFaces +//purpose : +//======================================================================= +Standard_Boolean PrsDim::InitAngleBetweenPlanarFaces (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + gp_Pnt& theCenter, + gp_Pnt& theFirstAttach, + gp_Pnt& theSecondAttach, + const Standard_Boolean theIsFirstPointSet) +{ + Handle(Geom_Plane) aFirstPlane = Handle(Geom_Plane)::DownCast (BRep_Tool::Surface (theFirstFace)); + Handle(Geom_Plane) aSecondPlane = Handle(Geom_Plane)::DownCast (BRep_Tool::Surface (theSecondFace)); + + GeomAPI_IntSS aPlaneIntersector (aFirstPlane, aSecondPlane, Precision::Confusion()); + + // Fails if two planes haven't only one intersection line. + if (!aPlaneIntersector.IsDone()) + { + return Standard_False; + } + + if (aPlaneIntersector.NbLines() != 1) + { + return Standard_False; + } + + // Get intersect line. + Handle(Geom_Curve) anIntersectCurve = aPlaneIntersector.Line (1); + + Handle(Geom_Line) anIntersectLine = Handle(Geom_Line)::DownCast (anIntersectCurve); + + if (anIntersectLine.IsNull()) + { + return Standard_False; + } + + gp_Lin anIntersectLin = anIntersectLine->Lin(); + + gp_Pnt aFirstCenter, aSecondCenter; + Standard_Real anU1Min, anU1Max, aV1Min, aV1Max; + Standard_Real anU2Min, anU2Max, aV2Min, aV2Max; + + BRepTools::UVBounds (theFirstFace, anU1Min, anU1Max, aV1Min, aV1Max); + BRepTools::UVBounds (theSecondFace, anU2Min, anU2Max, aV2Min, aV2Max); + + // Get first and second attach. + if (theIsFirstPointSet) + { + GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aFirstPlane); + if (!aProjector.IsDone()) + { + return Standard_False; + } + + aFirstCenter = aProjector.Point (1); + } + else + { + aFirstCenter = aFirstPlane->Value ((anU1Min + anU1Max) * 0.5, (aV1Min + aV1Max) * 0.5); + } + + aSecondCenter = aSecondPlane->Value ((anU2Min + anU2Max) * 0.5, (aV2Min + aV2Max) * 0.5); + + GeomAPI_ProjectPointOnCurve aProj (aFirstCenter, anIntersectCurve); + theCenter = aProj.NearestPoint(); + + gp_Vec aFirstNormal = anIntersectLin.Direction() ^ aFirstPlane->Pln().Axis().Direction(); + if (aFirstNormal * gp_Vec (theCenter, aFirstCenter) < 0.0) + { + aFirstNormal.Reverse(); + } + theFirstAttach = theCenter.Translated (aFirstNormal); + + gp_Vec aSecondNormal = anIntersectLin.Direction() ^ aSecondPlane->Pln().Axis().Direction(); + if (aSecondNormal * gp_Vec (theCenter, aSecondCenter) < 0.0) + { + aSecondNormal.Reverse(); + } + theSecondAttach = theCenter.Translated (aSecondNormal); + + return Standard_True; +} + +//======================================================================= +//function : InitAngleBetweenCurvilinearFaces +//purpose : +//======================================================================= +Standard_Boolean PrsDim::InitAngleBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + const PrsDim_KindOfSurface theFirstSurfType, + const PrsDim_KindOfSurface theSecondSurfType, + gp_Pnt& theCenter, + gp_Pnt& theFirstAttach, + gp_Pnt& theSecondAttach, + const Standard_Boolean theIsFirstPointSet) +{ + Handle(Geom_Surface) aFirstSurf = BRep_Tool::Surface (theFirstFace); + Handle(Geom_Surface) aSecondSurf = BRep_Tool::Surface (theSecondFace); + + // Find intersection curve between two surfaces. + GeomAPI_IntSS aSurfaceIntersector (aFirstSurf, aSecondSurf, Precision::Confusion()); + + // Fails if two planes haven't only one intersection line. + if (!aSurfaceIntersector.IsDone()) + { + return Standard_False; + } + + if (aSurfaceIntersector.NbLines() != 1) + { + return Standard_False; + } + + // Get intersect line. + Handle(Geom_Curve) anIntersectCurve = aSurfaceIntersector.Line (1); + + Handle(Geom_Line) aFirstLine, aSecondLine; + Standard_Real aFirstU = 0.0; + Standard_Real aFirstV = 0.0; + + if (theIsFirstPointSet) + { + GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aFirstSurf); + if (!aProjector.IsDone()) + { + return Standard_False; + } + + theFirstAttach = aProjector.Point (1); + } + else + { + theFirstAttach = aFirstSurf->Value (aFirstU, aFirstV); + } + + aFirstLine = Handle(Geom_Line)::DownCast (aFirstSurf->UIso (aFirstU)); + + if (theSecondSurfType == PrsDim_KOS_Cylinder) + { + Handle(Geom_CylindricalSurface) aCylinder = Handle(Geom_CylindricalSurface)::DownCast (aSecondSurf); + + Standard_Real aSecondU = aCylinder->Cylinder().XAxis().Direction().Angle( + gce_MakeDir (ProjectPointOnLine (theFirstAttach, + gp_Lin (aCylinder->Cylinder().Axis())), + theFirstAttach)); + + aSecondLine = Handle(Geom_Line)::DownCast (aCylinder->UIso (aSecondU)); + } + else if (theSecondSurfType == PrsDim_KOS_Cone) + { + Handle(Geom_ConicalSurface) aCone = Handle(Geom_ConicalSurface)::DownCast (aSecondSurf); + + gp_Dir anXdirection = aCone->Cone().XAxis().Direction(); + + gp_Dir aToFirstAttach = gce_MakeDir (ProjectPointOnLine (theFirstAttach, + gp_Lin (aCone->Cone().Axis())), + theFirstAttach); + + Standard_Real aSecondU = anXdirection.Angle (aToFirstAttach); + + // Check sign + if (!anXdirection.IsEqual (aToFirstAttach, Precision::Angular()) && + !anXdirection.IsOpposite (aToFirstAttach, Precision::Angular()) && + (anXdirection ^ aToFirstAttach) * aCone->Cone().Axis().Direction() < 0.0) + { + aSecondU = 2*M_PI - aSecondU; + } + aSecondLine = Handle( Geom_Line )::DownCast (aCone->UIso(aSecondU)); + } + else + { + return Standard_False; + } + + // If angle can be computed between two lines. + if (!(aFirstLine->Lin().Direction().IsEqual (aSecondLine->Lin().Direction(), Precision::Angular() )) && + !(aFirstLine->Lin().Direction().IsOpposite (aSecondLine->Lin().Direction(), Precision::Angular()))) + { + GeomAPI_ExtremaCurveCurve anIntersector (aFirstLine, aSecondLine); + anIntersector.Points (1, theCenter, theCenter); + + // Move theFirstAttach on aFirstLine if it is on theCenter. + if (theCenter.SquareDistance(theFirstAttach ) <= SquareTolerance) + { + gp_Vec aDir (aFirstLine->Lin().Direction()); + theFirstAttach = theCenter.Translated (aDir); + + // theFirstAttach should be on theFirstSurf. + Standard_Real anU, aV; + if (theFirstSurfType == PrsDim_KOS_Cylinder) + { + ElSLib::Parameters ((Handle(Geom_CylindricalSurface)::DownCast (aFirstSurf))->Cylinder(), + theFirstAttach, anU, aV); + + theFirstAttach = ElSLib::Value (aFirstU, aV, + (Handle( Geom_CylindricalSurface )::DownCast (aFirstSurf))->Cylinder() ); + } + else if (theFirstSurfType == PrsDim_KOS_Cone) + { + ElSLib::Parameters ((Handle(Geom_ConicalSurface)::DownCast (aFirstSurf))->Cone(), + theFirstAttach, anU, aV); + theFirstAttach = ElSLib::Value (aFirstU, aV, + (Handle(Geom_ConicalSurface)::DownCast (aFirstSurf))->Cone()); + } + else + { + return Standard_False; + } + } + + // Find theSecondAttach + GeomAPI_ProjectPointOnSurf aProjector (theFirstAttach, aSecondSurf); + if (!aProjector.IsDone()) + { + return Standard_False; + } + Standard_Real anU, aV; + aProjector.LowerDistanceParameters (anU, aV); + theSecondAttach = aSecondSurf->Value (anU, aV); + } + else // aFirstLine and aSecondLine are coincident + { + gp_Vec aDir (aFirstLine->Lin().Direction()); + theFirstAttach = theCenter.Translated (aDir); + theSecondAttach = theCenter.Translated (-aDir); + } + return Standard_True; +} + +//======================================================================= +//function : ComputeLengthBetweenCurvilinearFaces +//purpose : +//======================================================================= +void PrsDim::InitLengthBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace, + Handle(Geom_Surface)& theFirstSurf, + Handle(Geom_Surface)& theSecondSurf, + gp_Pnt& theFirstAttach, + gp_Pnt& theSecondAttach, + gp_Dir& theDirOnPlane) +{ + GeomAPI_ProjectPointOnSurf aProjector; + Standard_Real aPU, aPV; + + TopExp_Explorer anExplorer (theFirstFace, TopAbs_VERTEX); + + theFirstAttach = BRep_Tool::Pnt (TopoDS::Vertex (anExplorer.Current())); + aProjector.Init (theFirstAttach, theFirstSurf); + + theFirstAttach = aProjector.NearestPoint(); + aProjector.LowerDistanceParameters (aPU, aPV); + + gp_Vec aD1U, aD1V; + theFirstSurf->D1 (aPU, aPV, theFirstAttach, aD1U, aD1V); + + if (aD1U.SquareMagnitude() <= SquareTolerance || aD1V.SquareMagnitude() <= SquareTolerance) + { + theFirstAttach = PrsDim::Farest (theFirstFace, theFirstAttach); + aProjector.Init (theFirstAttach, theFirstSurf); + aProjector.LowerDistanceParameters (aPU, aPV); + theFirstSurf->D1 (aPU, aPV, theFirstAttach, aD1U, aD1V); + } + + aD1U.Normalize(); + aD1V.Normalize(); + + theDirOnPlane = gp_Dir (aD1U); + + gp_Dir aFirstSurfN = gp_Dir (aD1U ^ aD1V); + + aProjector.Init (theFirstAttach, theSecondSurf); + + Standard_Integer aBestPointIndex = 0; + Standard_Real aMinDist = RealLast(); + gp_Dir aLocalDir; + + for (Standard_Integer aPointIt = 1; aPointIt <= aProjector.NbPoints(); aPointIt++) + { + aProjector.Parameters (aPointIt, aPU, aPV); + + theSecondSurf->D1 (aPU, aPV, theSecondAttach, aD1U, aD1V); + + aLocalDir = aD1U.SquareMagnitude() <= SquareTolerance || aD1V.SquareMagnitude() <= SquareTolerance + ? gp_Dir (gp_Vec (theFirstAttach, aProjector.Point (aPointIt))) + : gp_Dir (aD1U ^ aD1V); + + if (aFirstSurfN.IsParallel (aLocalDir, Precision::Angular()) && aProjector.Distance (aPointIt) < aMinDist) + { + aBestPointIndex = aPointIt; + aMinDist = aProjector.Distance (aPointIt); + } + } + + if (aBestPointIndex == 0) + { + theSecondAttach = theFirstAttach; + } + else + { + theSecondAttach = aProjector.Point (aBestPointIndex); + aProjector.Parameters (aBestPointIndex, aPU, aPV); + + // Now there is projection of FirstAttach onto SecondSurf in aProjector + BRepTopAdaptor_FClass2d aClassifier (theSecondFace, Precision::Confusion()); + + TopAbs_State aState = + aClassifier.Perform (gp_Pnt2d (aPU, aPV), theSecondSurf->IsUPeriodic() || theSecondSurf->IsVPeriodic()); + + if (aState == TopAbs_OUT || aState == TopAbs_UNKNOWN) + { + theSecondAttach = PrsDim::Nearest (theSecondFace, theSecondAttach); + } + } +} + +gp_Pnt PrsDim::TranslatePointToBound( const gp_Pnt & aPoint, const gp_Dir & aDir, const Bnd_Box & aBndBox ) +{ + if (aBndBox.IsOut( aPoint )) + return aPoint; + else + { + gp_Pnt Result(0.0,0.0,0.0); + TColStd_Array2OfReal Bound( 1, 3, 1, 2 ); + TColStd_Array1OfReal Origin( 1, 3 ); + TColStd_Array1OfReal Dir( 1, 3 ); + Standard_Real t; + + aBndBox.Get( Bound(1,1), Bound(2,1), Bound(3,1), Bound(1,2), Bound(2,2), Bound(3,2) ); + aPoint.Coord( Origin(1), Origin(2), Origin(3) ); + aDir.Coord( Dir(1), Dir(2), Dir(3) ); + + Bnd_Box EnlargedBox = aBndBox; + EnlargedBox.Enlarge( aBndBox.GetGap() + Precision::Confusion() ); + + Standard_Boolean IsFound = Standard_False; + for (Standard_Integer i = 1; i <= 3; i++) + { + if (Abs( Dir( i ) ) <= gp::Resolution()) + continue; + for (Standard_Integer j = 1; j <= 2; j++) + { + t = (Bound( i, j ) - Origin( i )) / Dir( i ); + if (t < 0.0e0) + continue; + Result = aPoint.Translated( gp_Vec( aDir ) * t ); + if (! EnlargedBox.IsOut( Result )) + { + IsFound = Standard_True; + break; + } + } + if (IsFound) break; + } + return Result; + } +} + + +//======================================================================= +//function : InDomain +//purpose : +//======================================================================= + +Standard_Boolean PrsDim::InDomain(const Standard_Real fpar, + const Standard_Real lpar, + const Standard_Real para) +{ + if (fpar >= 0.) { + if(lpar > fpar) + return ((para >= fpar) && (para <= lpar)); + else { // fpar > lpar + Standard_Real delta = 2*M_PI-fpar; + Standard_Real lp, par, fp; + lp = lpar + delta; + par = para + delta; + while(lp > 2*M_PI) lp-=2*M_PI; + while(par > 2*M_PI) par-=2*M_PI; + fp = 0.; + return ((par >= fp) && (par <= lp)); + } + + } + if (para >= (fpar+2*M_PI)) return Standard_True; + if (para <= lpar) return Standard_True; + return Standard_False; +} + +//======================================================================= +//function : DistanceFromApex +//purpose : calculates parametric length arc of ellipse +//======================================================================= + +Standard_Real PrsDim::DistanceFromApex(const gp_Elips & elips, + const gp_Pnt & Apex, + const Standard_Real par) +{ + Standard_Real dist; + Standard_Real parApex = ElCLib::Parameter ( elips, Apex ); + if(parApex == 0.0 || parApex == M_PI) + {//Major case + if(parApex == 0.0) //pos Apex + dist = (par < M_PI) ? par : (2*M_PI - par); + else //neg Apex + dist = (par < M_PI) ? ( M_PI - par) : ( par - M_PI ); + } + else + {// Minor case + if(parApex == M_PI / 2) //pos Apex + { + if(par <= parApex + M_PI && par > parApex) // 3/2*M_PI < par < M_PI/2 + dist = par - parApex; + else + { + if(par > parApex + M_PI) // 3/2*M_PI < par < 2*M_PI + dist = 2*M_PI - par + parApex; + else + dist = parApex - par; + } + } + else //neg Apex == 3/2*M_PI + { + if(par <= parApex && par >= M_PI/2) // M_PI/2 < par < 3/2*M_PI + dist = parApex - par; + else + { + if(par > parApex) // 3/2*M_PI < par < 2*M_PI + dist = par - parApex; + else + dist = par + M_PI/2; // 0 < par < M_PI/2 + } + } + } + return dist; +} + +//======================================================================= +//function : NearestApex +//purpose : +//======================================================================= + +gp_Pnt PrsDim::NearestApex(const gp_Elips & elips, + const gp_Pnt & pApex, + const gp_Pnt & nApex, + const Standard_Real fpara, + const Standard_Real lpara, + Standard_Boolean & IsInDomain) +{ + Standard_Real parP, parN; + gp_Pnt EndOfArrow(0.0,0.0,0.0); + IsInDomain = Standard_True; + parP = ElCLib::Parameter ( elips, pApex ); + if(InDomain(fpara, lpara, parP)) EndOfArrow = pApex; + else + { + parN = ElCLib::Parameter ( elips, nApex ); + if(InDomain(fpara, lpara, parN)) EndOfArrow = nApex; + else { + IsInDomain = Standard_False; + Standard_Real posd = Min(DistanceFromApex (elips,pApex, fpara), + DistanceFromApex (elips,pApex, lpara)); + Standard_Real negd = Min(DistanceFromApex (elips,nApex, fpara), + DistanceFromApex (elips,nApex, lpara)); + if( posd < negd ) + EndOfArrow = pApex; + else + EndOfArrow = nApex; + } + } + return EndOfArrow; +} + +//======================================================================= +//function : ComputeProjEdgePresentation +//purpose : +//======================================================================= + +void PrsDim::ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPresentation, + const Handle(Prs3d_Drawer)& aDrawer, + const TopoDS_Edge& anEdge, + const Handle(Geom_Curve)& ProjCurve, + const gp_Pnt& FirstP, + const gp_Pnt& LastP, + const Quantity_NameOfColor aColor, + const Standard_Real aWidth, + const Aspect_TypeOfLine aProjTOL, + const Aspect_TypeOfLine aCallTOL) +{ + if (!aDrawer->HasOwnWireAspect()){ + aDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));} + else { + // CLE + // const Handle(Prs3d_LineAspect)& li = aDrawer->WireAspect(); + Handle(Prs3d_LineAspect) li = aDrawer->WireAspect(); + // ENDCLE + li->SetColor(aColor); + li->SetTypeOfLine(aProjTOL); + li->SetWidth(aWidth); + } + + Standard_Real pf, pl; + TopLoc_Location loc; + Handle(Geom_Curve) curve; + Standard_Boolean isInfinite; + curve = BRep_Tool::Curve(anEdge,loc,pf,pl); + isInfinite = (Precision::IsInfinite(pf) || Precision::IsInfinite(pl)); + + TopoDS_Edge E; + + // Calculate presentation of the edge + if (ProjCurve->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + // CLE + // Handle(Geom_Line) gl (Handle(Geom_Line)::DownCast (ProjCurve)); + Handle(Geom_Line) gl = Handle(Geom_Line)::DownCast (ProjCurve); + // ENDCLE + if ( !isInfinite) { + pf = ElCLib::Parameter(gl->Lin(),FirstP); + pl = ElCLib::Parameter(gl->Lin(),LastP); + BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl); + E = MakEd.Edge(); + } + else { + BRepBuilderAPI_MakeEdge MakEd(gl->Lin()); + E = MakEd.Edge(); + } + } + else if (ProjCurve->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + // CLE + // Handle(Geom_Circle) gc (Handle(Geom_Circle)::DownCast (ProjCurve)); + Handle(Geom_Circle) gc = Handle(Geom_Circle)::DownCast (ProjCurve); + // ENDCLE + pf = ElCLib::Parameter(gc->Circ(),FirstP); + pl = ElCLib::Parameter(gc->Circ(),LastP); + BRepBuilderAPI_MakeEdge MakEd(gc->Circ(),pf, pl); + E = MakEd.Edge(); + } + StdPrs_WFShape::Add (aPresentation, E, aDrawer); + + //Calculate the presentation of line connections + aDrawer->WireAspect()->SetTypeOfLine(aCallTOL); + if (!isInfinite) { + gp_Pnt ppf(0.0,0.0,0.0), ppl(0.0,0.0,0.0); + ppf = BRep_Tool::Pnt( TopExp::FirstVertex(TopoDS::Edge(anEdge))); + ppl = BRep_Tool::Pnt( TopExp::LastVertex(TopoDS::Edge(anEdge))); + + // it is patch! + if (FirstP.SquareDistance (ppf) > SquareTolerance) + { + BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); + StdPrs_WFShape::Add (aPresentation, MakEd1.Edge(), aDrawer); + } + else + { + BRepBuilderAPI_MakeVertex MakVert1 (FirstP); + StdPrs_WFShape::Add (aPresentation, MakVert1.Vertex(), aDrawer); + } + if (LastP.SquareDistance (ppl) > SquareTolerance) + { + BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); + StdPrs_WFShape::Add (aPresentation, MakEd2.Edge(), aDrawer); + } + else + { + BRepBuilderAPI_MakeVertex MakVert2 (LastP); + StdPrs_WFShape::Add (aPresentation, MakVert2.Vertex(), aDrawer); + } +/* + BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); + StdPrs_WFShape::Add (aPresentation, MakEd1.Edge(), aDrawer); + BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); + StdPrs_WFShape::Add (aPresentation, MakEd2.Edge(), aDrawer); +*/ + } +} + +//======================================================================= +//function : ComputeProjVertexPresentation +//purpose : +//======================================================================= + +void PrsDim::ComputeProjVertexPresentation (const Handle( Prs3d_Presentation )& aPresentation, + const Handle( Prs3d_Drawer )& aDrawer, + const TopoDS_Vertex& aVertex, + const gp_Pnt& ProjPoint, + const Quantity_NameOfColor aColor, + const Standard_Real aWidth, + const Aspect_TypeOfMarker aProjTOM, + const Aspect_TypeOfLine aCallTOL) +{ + if (!aDrawer->HasOwnPointAspect()){ + aDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));} + else { + // CLE + // const Handle(Prs3d_PointAspect)& pa = aDrawer->PointAspect(); + Handle(Prs3d_PointAspect) pa = aDrawer->PointAspect(); + // ENDCLE + pa->SetColor(aColor); + pa->SetTypeOfMarker(aProjTOM); + } + + // calculate the projection + StdPrs_Point::Add(aPresentation, new Geom_CartesianPoint(ProjPoint), aDrawer); + + if (!aDrawer->HasOwnWireAspect()){ + aDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));} + else { + // CLE + // const Handle(Prs3d_LineAspect)& li = aDrawer->WireAspect(); + Handle(Prs3d_LineAspect) li = aDrawer->WireAspect(); + // ENDCLE + li->SetColor(aColor); + li->SetTypeOfLine(aCallTOL); + li->SetWidth(aWidth); + } + + // If the points are not mixed... + if (!ProjPoint.IsEqual (BRep_Tool::Pnt (aVertex), Precision::Confusion())) + { + // calculate the lines of recall + BRepBuilderAPI_MakeEdge MakEd (ProjPoint, BRep_Tool::Pnt (aVertex)); + StdPrs_WFShape::Add (aPresentation, MakEd.Edge(), aDrawer); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DiameterDimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DiameterDimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DiameterDimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DiameterDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,385 @@ +// Created on: 1996-12-05 +// Created by: Jacques MINOT/Odile Olivier/Sergey ZARITCHNY +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_DiameterDimension, PrsDim_Dimension) + +namespace +{ + static const Standard_ExtCharacter THE_DIAMETER_SYMBOL (0x00D8); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_DiameterDimension::PrsDim_DiameterDimension (const gp_Circ& theCircle) +: PrsDim_Dimension (PrsDim_KOD_DIAMETER) +{ + SetMeasuredGeometry (theCircle); + SetSpecialSymbol (THE_DIAMETER_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_DiameterDimension::PrsDim_DiameterDimension (const gp_Circ& theCircle, + const gp_Pln& thePlane) +: PrsDim_Dimension (PrsDim_KOD_DIAMETER) +{ + SetCustomPlane (thePlane); + SetMeasuredGeometry (theCircle); + SetSpecialSymbol (THE_DIAMETER_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_DiameterDimension::PrsDim_DiameterDimension (const TopoDS_Shape& theShape) +: PrsDim_Dimension (PrsDim_KOD_DIAMETER) +{ + SetMeasuredGeometry (theShape); + SetSpecialSymbol (THE_DIAMETER_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_DiameterDimension::PrsDim_DiameterDimension (const TopoDS_Shape& theShape, + const gp_Pln& thePlane) +: PrsDim_Dimension (PrsDim_KOD_DIAMETER) +{ + SetCustomPlane (thePlane); + SetMeasuredGeometry (theShape); + SetSpecialSymbol (THE_DIAMETER_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : AnchorPoint +//purpose : +//======================================================================= +gp_Pnt PrsDim_DiameterDimension::AnchorPoint() +{ + if (!IsValid()) + { + return gp::Origin(); + } + + return myAnchorPoint; +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::SetMeasuredGeometry (const gp_Circ& theCircle) +{ + myCircle = theCircle; + myGeometryType = GeometryType_Edge; + myShape = BRepLib_MakeEdge (theCircle); + myAnchorPoint = gp::Origin(); + myIsGeometryValid = IsValidCircle (myCircle); + + if (myIsGeometryValid && myIsPlaneCustom) + { + ComputeAnchorPoint(); + } + else if (!myIsPlaneCustom) + { + ComputePlane(); + myAnchorPoint = ElCLib::Value (0.0, myCircle); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape) +{ + gp_Pnt aDummyPnt (gp::Origin()); + Standard_Boolean isClosed = Standard_False; + + myGeometryType = GeometryType_UndefShapes; + myShape = theShape; + myAnchorPoint = gp::Origin(); + myIsGeometryValid = InitCircularDimension (theShape, myCircle, aDummyPnt, isClosed) + && IsValidCircle (myCircle) + && isClosed; + + if (myIsGeometryValid && myIsPlaneCustom) + { + ComputeAnchorPoint(); + } + else if (!myIsPlaneCustom) + { + ComputePlane(); + myAnchorPoint = ElCLib::Value (0.0, myCircle); + } + + SetToUpdate(); +} + +//======================================================================= +//function : CheckPlane +//purpose : +//======================================================================= +Standard_Boolean PrsDim_DiameterDimension::CheckPlane (const gp_Pln& thePlane) const +{ + // Check if the circle center point belongs to plane. + if (!thePlane.Contains (myCircle.Location(), Precision::Confusion())) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputePlane +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::ComputePlane() +{ + if (!myIsGeometryValid) + { + return; + } + + myPlane = gp_Pln (gp_Ax3 (myCircle.Position())); +} + +//======================================================================= +//function : ComputeAnchorPoint +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::ComputeAnchorPoint() +{ + // Anchor point is an intersection of dimension plane and circle. + Handle(Geom_Circle) aCircle = new Geom_Circle (myCircle); + Handle(Geom_Plane) aPlane = new Geom_Plane (myPlane); + GeomAPI_IntCS anIntersector (aCircle, aPlane); + if (!anIntersector.IsDone()) + { + myIsGeometryValid = Standard_False; + return; + } + + // The circle lays on the plane. + if (anIntersector.NbPoints() != 2) + { + myAnchorPoint = ElCLib::Value (0.0, myCircle); + myIsGeometryValid = Standard_True; + return; + } + + gp_Pnt aFirstPoint = anIntersector.Point (1); + gp_Pnt aSecondPoint = anIntersector.Point (2); + + // Choose one of two intersection points that stands with + // positive direction of flyout. + // An anchor point is supposed to be the left attachment point. + gp_Dir aFirstDir = gce_MakeDir (aFirstPoint, myCircle.Location()); + gp_Dir aDir = myPlane.Axis().Direction() ^ aFirstDir; + myAnchorPoint = (gp_Vec (aDir) * gp_Vec(myCircle.Position().Direction()) > 0.0) + ? aFirstPoint + : aSecondPoint; + +} + +//======================================================================= +//function : GetModelUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_DiameterDimension::GetModelUnits() const +{ + return myDrawer->DimLengthModelUnits(); +} + +//======================================================================= +//function : GetDisplayUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_DiameterDimension::GetDisplayUnits() const +{ + return myDrawer->DimLengthDisplayUnits(); +} + +//======================================================================= +//function : SetModelUnits +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::SetModelUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthModelUnits (theUnits); +} + +//======================================================================= +//function : SetDisplayUnits +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthDisplayUnits (theUnits); +} + +//======================================================================= +//function : ComputeValue +//purpose : +//======================================================================= +Standard_Real PrsDim_DiameterDimension::ComputeValue() const +{ + if (!IsValid()) + { + return 0.0; + } + + return myCircle.Radius() * 2.0; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) +{ + mySelectionGeom.Clear (theMode); + + if (!IsValid()) + { + return; + } + + gp_Pnt aFirstPnt (gp::Origin()); + gp_Pnt aSecondPnt (gp::Origin()); + ComputeSidePoints (myCircle, aFirstPnt, aSecondPnt); + + DrawLinearDimension (thePresentation, theMode, aFirstPnt, aSecondPnt); +} + +//======================================================================= +//function : ComputeFlyoutSelection +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theEntityOwner) +{ + if (!IsValid()) + { + return; + } + + gp_Pnt aFirstPnt (gp::Origin()); + gp_Pnt aSecondPnt (gp::Origin()); + ComputeSidePoints (myCircle, aFirstPnt, aSecondPnt); + + ComputeLinearFlyouts (theSelection, theEntityOwner, aFirstPnt, aSecondPnt); +} + +//======================================================================= +//function : ComputeSidePoints +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::ComputeSidePoints (const gp_Circ& theCircle, + gp_Pnt& theFirstPnt, + gp_Pnt& theSecondPnt) +{ + theFirstPnt = AnchorPoint(); + + gp_Vec aRadiusVector (theCircle.Location(), theFirstPnt); + theSecondPnt = theCircle.Location().Translated (-aRadiusVector); +} + +//======================================================================= +//function : IsValidCircle +//purpose : +//======================================================================= +Standard_Boolean PrsDim_DiameterDimension::IsValidCircle (const gp_Circ& theCircle) const +{ + return (theCircle.Radius() * 2.0) > Precision::Confusion(); +} + +//======================================================================= +//function : IsValidAnchor +//purpose : +//======================================================================= +Standard_Boolean PrsDim_DiameterDimension::IsValidAnchor (const gp_Circ& theCircle, + const gp_Pnt& theAnchor) const +{ + gp_Pln aCirclePlane (theCircle.Location(), theCircle.Axis().Direction()); + Standard_Real anAnchorDist = theAnchor.Distance (theCircle.Location()); + Standard_Real aRadius = myCircle.Radius(); + + return Abs (anAnchorDist - aRadius) > Precision::Confusion() + && aCirclePlane.Contains (theAnchor, Precision::Confusion()); +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +gp_Pnt PrsDim_DiameterDimension::GetTextPosition() const +{ + if (IsTextPositionCustom()) + { + return myFixedTextPosition; + } + + // Counts text position according to the dimension parameters + return GetTextPositionForLinear (myAnchorPoint, myCircle.Location()); +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +void PrsDim_DiameterDimension::SetTextPosition (const gp_Pnt& theTextPos) +{ + if (!IsValid()) + { + return; + } + + myIsTextPositionFixed = Standard_True; + myFixedTextPosition = theTextPos; + + SetToUpdate(); +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DiameterDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DiameterDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DiameterDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DiameterDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,172 @@ +// Copyright (c) 1995-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_DiameterDimension_HeaderFile +#define _PrsDim_DiameterDimension_HeaderFile + +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_DiameterDimension, PrsDim_Dimension) + +//! Diameter dimension. Can be constructued: +//! - On generic circle. +//! - On generic circle with user-defined anchor point on that circle +//! (dimension plane is oriented to follow the anchor point). +//! - On generic circle in the specified plane. +//! - On generic shape containing geometry that can be measured +//! by diameter dimension: circle wire, circular face, etc. +//! The anchor point is the location of the left attachement point of +//! dimension on the circle. +//! The anchor point computation is processed after dimension plane setting +//! so that positive flyout direction stands with normal of the circle and +//! the normal of the plane. +//! If the plane is user-defined the anchor point was computed as intersection +//! of the plane and the basis circle. Among two intersection points +//! the one is selected so that positive flyout direction vector and +//! the circle normal on the one side form the circle plane. +//! (corner between positive flyout directio nand the circle normal is acute.) +//! If the plane is computed automatically (by default it is the circle plane), +//! the anchor point is the zero parameter point of the circle. +//! +//! The dimension is considered as invalid if the user-defined plane +//! does not include th enachor point and th ecircle center, +//! if the diameter of the circle is less than Precision::Confusion(). +//! In case if the dimension is built on the arbitrary shape, it can be considered +//! as invalid if the shape does not contain circle geometry. +class PrsDim_DiameterDimension : public PrsDim_Dimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_DiameterDimension, PrsDim_Dimension) +public: + + //! Construct diameter dimension for the circle. + //! @param theCircle [in] the circle to measure. + Standard_EXPORT PrsDim_DiameterDimension (const gp_Circ& theCircle); + + //! Construct diameter dimension for the circle and orient it correspondingly + //! to the passed plane. + //! @param theCircle [in] the circle to measure. + //! @param thePlane [in] the plane defining preferred orientation + //! for dimension. + Standard_EXPORT PrsDim_DiameterDimension (const gp_Circ& theCircle, + const gp_Pln& thePlane); + + //! Construct diameter on the passed shape, if applicable. + //! @param theShape [in] the shape to measure. + Standard_EXPORT PrsDim_DiameterDimension (const TopoDS_Shape& theShape); + + //! Construct diameter on the passed shape, if applicable - and + //! define the preferred plane to orient the dimension. + //! @param theShape [in] the shape to measure. + //! @param thePlane [in] the plane defining preferred orientation + //! for dimension. + Standard_EXPORT PrsDim_DiameterDimension (const TopoDS_Shape& theShape, + const gp_Pln& thePlane); + +public: + + //! @return measured geometry circle. + const gp_Circ& Circle() const { return myCircle; } + + //! @return anchor point on circle for diameter dimension. + Standard_EXPORT gp_Pnt AnchorPoint(); + + //! @return the measured shape. + const TopoDS_Shape& Shape() const { return myShape; } + +public: + + //! Measure diameter of the circle. + //! The actual dimension plane is used for determining anchor points + //! on the circle to attach the dimension lines to. + //! The dimension will become invalid if the diameter of the circle + //! is less than Precision::Confusion(). + //! @param theCircle [in] the circle to measure. + Standard_EXPORT void SetMeasuredGeometry (const gp_Circ& theCircle); + + //! Measure diameter on the passed shape, if applicable. + //! The dimension will become invalid if the passed shape is not + //! measurable or if measured diameter value is less than Precision::Confusion(). + //! @param theShape [in] the shape to measure. + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Shape& theShape); + + //! @return the display units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; + + //! @return the model units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; + + Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; + + Standard_EXPORT virtual gp_Pnt GetTextPosition() const Standard_OVERRIDE; + +protected: + + //! Override this method to change logic of anchor point computation. + //! Computes anchor point. Its computation is based on the current + //! dimension plane. Therfore, anchor point is an intersection of plane + //! and circle. + //! ATTENTION! + //! 1) The plane should be set or computed before. + //! 2) The plane should inclide th ecircle center to be valid. + Standard_EXPORT virtual void ComputeAnchorPoint(); + + Standard_EXPORT virtual void ComputePlane(); + + //! Checks if the center of the circle is on the plane. + Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; + + Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theEntityOwner) Standard_OVERRIDE; + +protected: + + //! Compute points on the circle sides for the dimension plane. + //! Program error exception is raised if the dimension plane "x" direction + //! is orthogonal to plane (the "impossible" case). The passed dimension plane + //! is the one specially computed to locate dimension presentation in circle. + //! @param theCircle [in] the circle. + //! @param theFirstPnt [out] the first point. + //! @param theSecondPnt [out] the second point. + Standard_EXPORT void ComputeSidePoints (const gp_Circ& theCircle, + gp_Pnt& theFirstPnt, + gp_Pnt& theSecondPnt); + + Standard_EXPORT Standard_Boolean IsValidCircle (const gp_Circ& theCircle) const; + + Standard_EXPORT Standard_Boolean IsValidAnchor (const gp_Circ& theCircle, + const gp_Pnt& thePnt) const; + +private: + + gp_Circ myCircle; + gp_Pnt myAnchorPoint; + TopoDS_Shape myShape; +}; + +#endif // _PrsDim_DiameterDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Dimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Dimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Dimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Dimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1680 @@ +// Created on: 2013-11-11 +// Created by: Anastasia BORISOVA +// Copyright (c) 2013-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_Dimension, AIS_InteractiveObject) + +namespace +{ + // default text strings + static const TCollection_ExtendedString THE_EMPTY_LABEL; + static const TCollection_AsciiString THE_UNDEFINED_UNITS; + + // default text margin and resolution + static const Standard_Real THE_3D_TEXT_MARGIN = 0.1; + static const unsigned int THE_2D_TEXT_RESOLUTION = 72; + + // default selection priorities + static const Standard_Integer THE_NEUTRAL_SEL_PRIORITY = 5; + static const Standard_Integer THE_LOCAL_SEL_PRIORITY = 6; +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_Dimension::PrsDim_Dimension (const PrsDim_KindOfDimension theType) +: AIS_InteractiveObject (), + mySelToleranceForText2d(0.0), + myValueType (ValueType_Computed), + myCustomValue (0.0), + myCustomStringValue (), + myIsTextPositionFixed (Standard_False), + mySpecialSymbol (' '), + myDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_No), + myGeometryType (GeometryType_UndefShapes), + myIsPlaneCustom (Standard_False), + myFlyout (0.0), + myIsGeometryValid (Standard_False), + myKindOfDimension (theType) +{ +} + +//======================================================================= +//function : SetCustomValue +//purpose : +//======================================================================= +void PrsDim_Dimension::SetCustomValue (const Standard_Real theValue) +{ + if (myValueType == ValueType_CustomReal && myCustomValue == theValue) + { + return; + } + + myValueType = ValueType_CustomReal; + myCustomValue = theValue; + + SetToUpdate(); +} + +//======================================================================= +//function : SetCustomValue +//purpose : +//======================================================================= +void PrsDim_Dimension::SetCustomValue (const TCollection_ExtendedString& theValue) +{ + if (myValueType == ValueType_CustomText && myCustomStringValue == theValue) + { + return; + } + + myValueType = ValueType_CustomText; + myCustomStringValue = theValue; + + SetToUpdate(); +} + +//======================================================================= +//function : SetUserPlane +//purpose : +//======================================================================= +void PrsDim_Dimension::SetCustomPlane (const gp_Pln& thePlane) +{ + myPlane = thePlane; + myIsPlaneCustom = Standard_True; + + // Disable fixed (custom) text position + UnsetFixedTextPosition(); + + // Check validity if geometry has been set already. + if (IsValid()) + { + SetToUpdate(); + } +} + +//======================================================================= +//function : SetDimensionAspect +//purpose : +//======================================================================= +void PrsDim_Dimension::SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theDimensionAspect) +{ + myDrawer->SetDimensionAspect (theDimensionAspect); + + SetToUpdate(); +} + +//======================================================================= +//function : SetDisplaySpecialSymbol +//purpose : +//======================================================================= +void PrsDim_Dimension::SetDisplaySpecialSymbol (const PrsDim_DisplaySpecialSymbol theDisplaySpecSymbol) +{ + if (myDisplaySpecialSymbol == theDisplaySpecSymbol) + { + return; + } + + myDisplaySpecialSymbol = theDisplaySpecSymbol; + + SetToUpdate(); +} + +//======================================================================= +//function : SetSpecialSymbol +//purpose : +//======================================================================= +void PrsDim_Dimension::SetSpecialSymbol (const Standard_ExtCharacter theSpecialSymbol) +{ + if (mySpecialSymbol == theSpecialSymbol) + { + return; + } + + mySpecialSymbol = theSpecialSymbol; + + SetToUpdate(); +} + +//======================================================================= +//function : SetSelToleranceForText2d +//purpose : +//======================================================================= +void PrsDim_Dimension::SetSelToleranceForText2d (const Standard_Real theTol) +{ + if (mySelToleranceForText2d == theTol) + { + return; + } + + mySelToleranceForText2d = theTol; + + SetToUpdate(); +} + +//======================================================================= +//function : SetFlyout +//purpose : +//======================================================================= +void PrsDim_Dimension::SetFlyout (const Standard_Real theFlyout) +{ + if (myFlyout == theFlyout) + { + return; + } + + myFlyout = theFlyout; + + // Disable fixed text position + UnsetFixedTextPosition(); + + SetToUpdate(); +} + +//======================================================================= +//function : GetDisplayUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_Dimension::GetDisplayUnits() const +{ + return THE_UNDEFINED_UNITS; +} + +//======================================================================= +//function : GetModelUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_Dimension::GetModelUnits() const +{ + return THE_UNDEFINED_UNITS; +} + +//======================================================================= +//function : ValueToDisplayUnits +//purpose : +//======================================================================= +Standard_Real PrsDim_Dimension::ValueToDisplayUnits() const +{ + return UnitsAPI::AnyToAny (GetValue(), + GetModelUnits().ToCString(), + GetDisplayUnits().ToCString()); +} + +//======================================================================= +//function : GetValueString +//purpose : +//======================================================================= +TCollection_ExtendedString PrsDim_Dimension::GetValueString (Standard_Real& theWidth) const +{ + TCollection_ExtendedString aValueStr; + if (myValueType == ValueType_CustomText) + { + aValueStr = myCustomStringValue; + } + else + { + // format value string using "sprintf" + TCollection_AsciiString aFormatStr = myDrawer->DimensionAspect()->ValueStringFormat(); + + char aFmtBuffer[256]; + sprintf (aFmtBuffer, aFormatStr.ToCString(), ValueToDisplayUnits()); + aValueStr = TCollection_ExtendedString (aFmtBuffer); + } + + // add units to values string + if (myDrawer->DimensionAspect()->IsUnitsDisplayed()) + { + aValueStr += " "; + aValueStr += TCollection_ExtendedString (GetDisplayUnits()); + } + + switch (myDisplaySpecialSymbol) + { + case PrsDim_DisplaySpecialSymbol_Before: aValueStr.Insert (1, mySpecialSymbol); break; + case PrsDim_DisplaySpecialSymbol_After: aValueStr.Insert (aValueStr.Length() + 1, mySpecialSymbol); break; + case PrsDim_DisplaySpecialSymbol_No: break; + } + + // Get text style parameters + Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect(); + NCollection_Utf8String anUTFString (aValueStr.ToExtString()); + + theWidth = 0.0; + + if (myDrawer->DimensionAspect()->IsText3d()) + { + // text width produced by BRepFont + Font_BRepFont aFont; + if (aFont.FindAndInit (aTextAspect->Aspect()->Font(), aTextAspect->Aspect()->GetTextFontAspect(), aTextAspect->Height(), Font_StrictLevel_Any)) + { + for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) + { + Standard_Utf32Char aCurrChar = *anIter; + Standard_Utf32Char aNextChar = *(++anIter); + theWidth += aFont.AdvanceX (aCurrChar, aNextChar); + } + } + } + else + { + // Text width for 1:1 scale 2D case + Font_FTFontParams aFontParams; + aFontParams.PointSize = (unsigned int )aTextAspect->Height(); + aFontParams.Resolution = THE_2D_TEXT_RESOLUTION; + if (Handle(Font_FTFont) aFont = Font_FTFont::FindAndCreate (aTextAspect->Aspect()->Font(), aTextAspect->Aspect()->GetTextFontAspect(), aFontParams, Font_StrictLevel_Any)) + { + for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) + { + Standard_Utf32Char aCurrChar = *anIter; + Standard_Utf32Char aNextChar = *(++anIter); + theWidth += (Standard_Real) aFont->AdvanceX (aCurrChar, aNextChar); + } + } + } + + return aValueStr; +} + +//======================================================================= +//function : DrawArrow +//purpose : +//======================================================================= +void PrsDim_Dimension::DrawArrow (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theLocation, + const gp_Dir& theDirection) +{ + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + + Standard_Real aLength = myDrawer->DimensionAspect()->ArrowAspect()->Length(); + Standard_Real anAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle(); + + if (myDrawer->DimensionAspect()->IsArrows3d()) + { + Prs3d_Arrow::Draw (aGroup, + theLocation, + theDirection, + anAngle, + aLength); + aGroup->SetGroupPrimitivesAspect (myDrawer->DimensionAspect()->ArrowAspect()->Aspect()); + } + else + { + gp_Pnt aLeftPoint (gp::Origin()); + gp_Pnt aRightPoint (gp::Origin()); + const gp_Dir& aPlane = GetPlane().Axis().Direction(); + + PointsForArrow (theLocation, theDirection, aPlane, aLength, anAngle, aLeftPoint, aRightPoint); + + Handle(Graphic3d_ArrayOfTriangles) anArrow = new Graphic3d_ArrayOfTriangles(3); + + anArrow->AddVertex (aLeftPoint); + anArrow->AddVertex (theLocation); + anArrow->AddVertex (aRightPoint); + + // Set aspect for arrow triangles + Graphic3d_PolygonOffset aPolOffset; + aPolOffset.Mode = Aspect_POM_Off; + aPolOffset.Factor = 0.0f; + aPolOffset.Units = 0.0f; + Handle(Graphic3d_AspectFillArea3d) aShadingStyle = new Graphic3d_AspectFillArea3d(); + aShadingStyle->SetInteriorStyle (Aspect_IS_SOLID); + aShadingStyle->SetColor (myDrawer->DimensionAspect()->ArrowAspect()->Aspect()->Color()); + aShadingStyle->SetShadingModel (Graphic3d_TOSM_UNLIT); + aShadingStyle->SetPolygonOffset (aPolOffset); + + aGroup->SetPrimitivesAspect (aShadingStyle); + aGroup->AddPrimitiveArray (anArrow); + } + + SelectionGeometry::Arrow& aSensitiveArrow = mySelectionGeom.NewArrow(); + aSensitiveArrow.Position = theLocation; + aSensitiveArrow.Direction = theDirection; +} + +//======================================================================= +//function : drawText +//purpose : +//======================================================================= +void PrsDim_Dimension::drawText (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theTextPos, + const gp_Dir& theTextDir, + const TCollection_ExtendedString& theText, + const Standard_Integer theLabelPosition) +{ + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + if (myDrawer->DimensionAspect()->IsText3d()) + { + // getting font parameters + Handle(Prs3d_TextAspect) aTextAspect = myDrawer->DimensionAspect()->TextAspect(); + Quantity_Color aColor = aTextAspect->Aspect()->Color(); + Font_FontAspect aFontAspect = aTextAspect->Aspect()->GetTextFontAspect(); + Standard_Real aFontHeight = aTextAspect->Height(); + + // creating TopoDS_Shape for text + Font_BRepFont aFont (aTextAspect->Aspect()->Font().ToCString(), + aFontAspect, aFontHeight); + NCollection_Utf8String anUTFString (theText.ToExtString()); + + Font_BRepTextBuilder aBuilder; + TopoDS_Shape aTextShape = aBuilder.Perform (aFont, anUTFString); + + // compute text width with kerning + Standard_Real aTextWidth = 0.0; + Standard_Real aTextHeight = aFont.Ascender() + aFont.Descender(); + + for (NCollection_Utf8Iter anIter = anUTFString.Iterator(); *anIter != 0; ) + { + Standard_Utf32Char aCurrChar = *anIter; + Standard_Utf32Char aNextChar = *(++anIter); + aTextWidth += aFont.AdvanceX (aCurrChar, aNextChar); + } + + // formating text position in XOY plane + Standard_Integer aHLabelPos = theLabelPosition & LabelPosition_HMask; + Standard_Integer aVLabelPos = theLabelPosition & LabelPosition_VMask; + + gp_Dir aTextDir (aHLabelPos == LabelPosition_Left ? -theTextDir : theTextDir); + + // compute label offsets + Standard_Real aMarginSize = aFontHeight * THE_3D_TEXT_MARGIN; + Standard_Real aCenterHOffset = 0.0; + Standard_Real aCenterVOffset = 0.0; + switch (aHLabelPos) + { + case LabelPosition_HCenter : aCenterHOffset = 0.0; break; + case LabelPosition_Right : aCenterHOffset = aTextWidth / 2.0 + aMarginSize; break; + case LabelPosition_Left : aCenterHOffset = -aTextWidth / 2.0 - aMarginSize; break; + } + switch (aVLabelPos) + { + case LabelPosition_VCenter : aCenterVOffset = 0.0; break; + case LabelPosition_Above : aCenterVOffset = aTextHeight / 2.0 + aMarginSize; break; + case LabelPosition_Below : aCenterVOffset = -aTextHeight / 2.0 - aMarginSize; break; + } + + // compute shape offset transformation + Standard_Real aShapeHOffset = aCenterHOffset - aTextWidth / 2.0; + Standard_Real aShapeVOffset = aCenterVOffset - aTextHeight / 2.0; + + // center shape in its bounding box (suppress border spacing added by FT_Font) + Bnd_Box aShapeBnd; + BRepBndLib::AddClose (aTextShape, aShapeBnd); + + Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; + aShapeBnd.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax); + + Standard_Real aXalign = aTextWidth * 0.5 - (aXmax + aXmin) * 0.5; + Standard_Real aYalign = aTextHeight * 0.5 - (aYmax + aYmin) * 0.5; + aShapeHOffset += aXalign; + aShapeVOffset += aYalign; + + gp_Trsf anOffsetTrsf; + anOffsetTrsf.SetTranslation (gp::Origin(), gp_Pnt (aShapeHOffset, aShapeVOffset, 0.0)); + aTextShape.Move (anOffsetTrsf); + + // transform text to myWorkingPlane coordinate system + gp_Ax3 aTextCoordSystem (theTextPos, GetPlane().Axis().Direction(), aTextDir); + gp_Trsf aTextPlaneTrsf; + aTextPlaneTrsf.SetTransformation (aTextCoordSystem, gp_Ax3 (gp::XOY())); + aTextShape.Move (aTextPlaneTrsf); + + // set text flipping anchors + gp_Trsf aCenterOffsetTrsf; + gp_Pnt aCenterOffset (aCenterHOffset, aCenterVOffset, 0.0); + aCenterOffsetTrsf.SetTranslation (gp::Origin(), aCenterOffset); + + gp_Pnt aCenterOfLabel (gp::Origin()); + aCenterOfLabel.Transform (aCenterOffsetTrsf); + aCenterOfLabel.Transform (aTextPlaneTrsf); + + gp_Ax2 aFlippingAxes (aCenterOfLabel, GetPlane().Axis().Direction(), aTextDir); + aGroup->SetFlippingOptions (Standard_True, aFlippingAxes); + + // draw text + if (myDrawer->DimensionAspect()->IsTextShaded()) + { + // Setting text shading and color parameters + if (!myDrawer->HasOwnShadingAspect()) + { + myDrawer->SetShadingAspect (new Prs3d_ShadingAspect()); + } + + Graphic3d_MaterialAspect aShadeMat (Graphic3d_NameOfMaterial_DEFAULT); + aShadeMat.SetAmbientColor (Quantity_NOC_BLACK); + aShadeMat.SetDiffuseColor (Quantity_NOC_BLACK); + aShadeMat.SetSpecularColor(Quantity_NOC_BLACK); + myDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aColor); + myDrawer->ShadingAspect()->Aspect()->SetBackInteriorColor (aColor); + myDrawer->ShadingAspect()->SetMaterial (aShadeMat); + + // drawing text + StdPrs_ShadedShape::Add (thePresentation, aTextShape, myDrawer); + } + else + { + // Setting color for text + if (!myDrawer->HasOwnFreeBoundaryAspect()) + { + myDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (aColor, Aspect_TOL_SOLID, 1.0)); + } + myDrawer->FreeBoundaryAspect()->Aspect()->SetColor (aColor); + + // drawing text + if (Handle(Graphic3d_ArrayOfPrimitives) anEdges = StdPrs_WFShape::AddAllEdges (aTextShape, myDrawer)) + { + aGroup->SetGroupPrimitivesAspect (myDrawer->FreeBoundaryAspect()->Aspect()); + aGroup->AddPrimitiveArray (anEdges); + } + } + thePresentation->CurrentGroup()->SetFlippingOptions (Standard_False, gp_Ax2()); + + mySelectionGeom.TextPos = aCenterOfLabel; + mySelectionGeom.TextDir = aTextDir; + mySelectionGeom.TextWidth = aTextWidth + aMarginSize * 2.0; + mySelectionGeom.TextHeight = aTextHeight; + + return; + } + + // generate primitives for 2D text + myDrawer->DimensionAspect()->TextAspect()->Aspect()->SetDisplayType (Aspect_TODT_DIMENSION); + + Prs3d_Text::Draw (aGroup, + myDrawer->DimensionAspect()->TextAspect(), + theText, + theTextPos); + + mySelectionGeom.TextPos = theTextPos; + mySelectionGeom.TextDir = theTextDir; + mySelectionGeom.TextWidth = 0.0; + mySelectionGeom.TextHeight = 0.0; +} + +//======================================================================= +//function : DrawExtension +//purpose : +//======================================================================= +void PrsDim_Dimension::DrawExtension (const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Real theExtensionSize, + const gp_Pnt& theExtensionStart, + const gp_Dir& theExtensionDir, + const TCollection_ExtendedString& theLabelString, + const Standard_Real theLabelWidth, + const Standard_Integer theMode, + const Standard_Integer theLabelPosition) +{ + // reference line for extension starting at its connection point + gp_Lin anExtensionLine (theExtensionStart, theExtensionDir); + + Standard_Boolean hasLabel = theLabelString.Length() > 0; + if (hasLabel && (theMode == ComputeMode_All || theMode == ComputeMode_Text)) + { + // compute text primitives; get its model width + gp_Pnt aTextPos = ElCLib::Value (theExtensionSize, anExtensionLine); + gp_Dir aTextDir = theExtensionDir; + + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + drawText (thePresentation, + aTextPos, + aTextDir, + theLabelString, + theLabelPosition); + } + + if (theMode != ComputeMode_All && theMode != ComputeMode_Line) + { + return; + } + + Standard_Boolean isShortLine = !myDrawer->DimensionAspect()->IsText3d() + || theLabelPosition & LabelPosition_VCenter; + + // compute graphical primitives and sensitives for extension line + gp_Pnt anExtStart = theExtensionStart; + gp_Pnt anExtEnd = !hasLabel || isShortLine + ? ElCLib::Value (theExtensionSize, anExtensionLine) + : ElCLib::Value (theExtensionSize + theLabelWidth, anExtensionLine); + + // add graphical primitives + Handle(Graphic3d_ArrayOfSegments) anExtPrimitive = new Graphic3d_ArrayOfSegments (2); + anExtPrimitive->AddVertex (anExtStart); + anExtPrimitive->AddVertex (anExtEnd); + + // add selection primitives + SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); + aSensitiveCurve.Append (anExtStart); + aSensitiveCurve.Append (anExtEnd); + + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) + { + aGroup->SetStencilTestOptions (Standard_True); + } + Handle(Graphic3d_AspectLine3d) aDimensionLineStyle = myDrawer->DimensionAspect()->LineAspect()->Aspect(); + aGroup->SetPrimitivesAspect (aDimensionLineStyle); + aGroup->AddPrimitiveArray (anExtPrimitive); + if (!myDrawer->DimensionAspect()->IsText3d() && theMode == ComputeMode_All) + { + aGroup->SetStencilTestOptions (Standard_False); + } +} + +//======================================================================= +//function : DrawLinearDimension +//purpose : +//======================================================================= +void PrsDim_Dimension::DrawLinearDimension (const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide) +{ + // do not build any dimension for equal points + if (theFirstPoint.IsEqual (theSecondPoint, Precision::Confusion())) + { + throw Standard_ProgramError("Can not build presentation for equal points."); + } + + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + // For extensions we need to know arrow size, text size and extension size: get it from aspect + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + // prepare label string and compute its geometrical width + Standard_Real aLabelWidth; + TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); + + // add margins to cut dimension lines for 3d text + if (aDimensionAspect->IsText3d()) + { + aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; + } + + // handle user-defined and automatic arrow placement + Standard_Boolean isArrowsExternal = Standard_False; + Standard_Integer aLabelPosition = LabelPosition_None; + + Prs3d_DimensionTextHorizontalPosition aHorisontalTextPos = aDimensionAspect->TextHorizontalPosition(); + if (IsTextPositionCustom()) + { + if (!AdjustParametersForLinear (myFixedTextPosition, theFirstPoint, theSecondPoint, + anExtensionSize, aHorisontalTextPos, myFlyout, myPlane, myIsPlaneCustom)) + { + throw Standard_ProgramError("Can not adjust plane to the custom label position."); + } + } + + FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide, aHorisontalTextPos, + aLabelPosition, isArrowsExternal); + + // compute dimension line points + gp_Pnt aLineBegPoint, aLineEndPoint; + ComputeFlyoutLinePoints (theFirstPoint, theSecondPoint, aLineBegPoint, aLineEndPoint); + gp_Lin aDimensionLine = gce_MakeLin (aLineBegPoint, aLineEndPoint); + + // compute arrows positions and directions + gp_Dir aFirstArrowDir = aDimensionLine.Direction().Reversed(); + gp_Dir aSecondArrowDir = aDimensionLine.Direction(); + gp_Dir aFirstExtensionDir = aDimensionLine.Direction().Reversed(); + gp_Dir aSecondExtensionDir = aDimensionLine.Direction(); + + gp_Pnt aFirstArrowBegin (0.0, 0.0, 0.0); + gp_Pnt aFirstArrowEnd (0.0, 0.0, 0.0); + gp_Pnt aSecondArrowBegin (0.0, 0.0, 0.0); + gp_Pnt aSecondArrowEnd (0.0, 0.0, 0.0); + + if (isArrowsExternal) + { + aFirstArrowDir.Reverse(); + aSecondArrowDir.Reverse(); + } + + aFirstArrowBegin = aLineBegPoint; + aSecondArrowBegin = aLineEndPoint; + aFirstArrowEnd = aLineBegPoint.Translated (-gp_Vec (aFirstArrowDir).Scaled (anArrowLength)); + aSecondArrowEnd = aLineEndPoint.Translated (-gp_Vec (aSecondArrowDir).Scaled (anArrowLength)); + + gp_Pnt aCenterLineBegin = isArrowsExternal + ? aLineBegPoint : aFirstArrowEnd; + + gp_Pnt aCenterLineEnd = isArrowsExternal || theIsOneSide + ? aLineEndPoint : aSecondArrowEnd; + + + switch (aLabelPosition & LabelPosition_HMask) + { + // ------------------------------------------------------------------------ // + // CENTER // + // -------------------------------------------------------------------------// + case LabelPosition_HCenter: + { + // add label on dimension or extension line to presentation + gp_Pnt aTextPos = IsTextPositionCustom() ? myFixedTextPosition + : (aCenterLineBegin.XYZ() + aCenterLineEnd.XYZ()) * 0.5; + gp_Dir aTextDir = aDimensionLine.Direction(); + + // add text primitives + if (theMode == ComputeMode_All || theMode == ComputeMode_Text) + { + thePresentation->NewGroup(); + drawText (thePresentation, + aTextPos, + aTextDir, + aLabelString, + aLabelPosition); + } + + // add dimension line primitives + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + Standard_Boolean isLineBreak = aDimensionAspect->TextVerticalPosition() == Prs3d_DTVP_Center + && aDimensionAspect->IsText3d(); + + Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (isLineBreak ? 4 : 2); + + // compute continuous or sectioned main line segments + if (isLineBreak) + { + Standard_Real aPTextPosition = ElCLib::Parameter (aDimensionLine, aTextPos); + gp_Pnt aSection1Beg = aCenterLineBegin; + gp_Pnt aSection1End = ElCLib::Value (aPTextPosition - (aLabelWidth * 0.5), aDimensionLine); + gp_Pnt aSection2Beg = ElCLib::Value (aPTextPosition + (aLabelWidth * 0.5), aDimensionLine); + gp_Pnt aSection2End = aCenterLineEnd; + + aPrimSegments->AddVertex (aSection1Beg); + aPrimSegments->AddVertex (aSection1End); + aPrimSegments->AddVertex (aSection2Beg); + aPrimSegments->AddVertex (aSection2End); + + SelectionGeometry::Curve& aLeftSensitiveCurve = mySelectionGeom.NewCurve(); + SelectionGeometry::Curve& aRightSensitiveCurve = mySelectionGeom.NewCurve(); + aLeftSensitiveCurve.Append (aSection1Beg); + aLeftSensitiveCurve.Append (aSection1End); + aRightSensitiveCurve.Append (aSection2Beg); + aRightSensitiveCurve.Append (aSection2End); + } + else + { + aPrimSegments->AddVertex (aCenterLineBegin); + aPrimSegments->AddVertex (aCenterLineEnd); + + SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); + aSensitiveCurve.Append (aCenterLineBegin); + aSensitiveCurve.Append (aCenterLineEnd); + } + + // set text label justification + Graphic3d_VerticalTextAlignment aTextJustificaton = Graphic3d_VTA_BOTTOM; + switch (aLabelPosition & LabelPosition_VMask) + { + case LabelPosition_Above : + case LabelPosition_VCenter : aTextJustificaton = Graphic3d_VTA_BOTTOM; break; + case LabelPosition_Below : aTextJustificaton = Graphic3d_VTA_TOP; break; + } + aDimensionAspect->TextAspect()->SetVerticalJustification (aTextJustificaton); + + // main dimension line, short extension + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All) + { + aGroup->SetStencilTestOptions (Standard_True); + } + aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); + aGroup->AddPrimitiveArray (aPrimSegments); + if (!aDimensionAspect->IsText3d() && theMode == ComputeMode_All) + { + aGroup->SetStencilTestOptions (Standard_False); + } + } + + // add arrows to presentation + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); + if (!theIsOneSide) + { + DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); + } + } + + if (!isArrowsExternal) + { + break; + } + + // add arrow extension lines to presentation + { + DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), + aFirstArrowEnd, aFirstExtensionDir, + THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); + if (!theIsOneSide) + { + DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), + aSecondArrowEnd, aSecondExtensionDir, + THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); + } + } + } + break; + } + // ------------------------------------------------------------------------ // + // LEFT // + // -------------------------------------------------------------------------// + + case LabelPosition_Left: + { + // add label on dimension or extension line to presentation + { + // Left extension with the text + DrawExtension (thePresentation, anExtensionSize, + isArrowsExternal + ? aFirstArrowEnd + : aFirstArrowBegin, + aFirstExtensionDir, + aLabelString, + aLabelWidth, + theMode, + aLabelPosition); + } + + // add dimension line primitives + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + // add central dimension line + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + + // add graphical primitives + Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2); + aPrimSegments->AddVertex (aCenterLineBegin); + aPrimSegments->AddVertex (aCenterLineEnd); + + aGroup->SetPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); + aGroup->AddPrimitiveArray (aPrimSegments); + + // add selection primitives + SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); + aSensitiveCurve.Append (aCenterLineBegin); + aSensitiveCurve.Append (aCenterLineEnd); + } + + // add arrows to presentation + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); + if (!theIsOneSide) + { + DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); + } + } + + if (!isArrowsExternal || theIsOneSide) + { + break; + } + + // add extension lines for external arrows + { + DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), + aSecondArrowEnd, aSecondExtensionDir, + THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); + } + } + + break; + } + // ------------------------------------------------------------------------ // + // RIGHT // + // -------------------------------------------------------------------------// + + case LabelPosition_Right: + { + // add label on dimension or extension line to presentation + + // Right extension with text + DrawExtension (thePresentation, anExtensionSize, + isArrowsExternal + ? aSecondArrowEnd + : aSecondArrowBegin, + aSecondExtensionDir, + aLabelString, aLabelWidth, + theMode, + aLabelPosition); + + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + // add central dimension line + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + + // add graphical primitives + Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments (2); + aPrimSegments->AddVertex (aCenterLineBegin); + aPrimSegments->AddVertex (aCenterLineEnd); + aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); + aGroup->AddPrimitiveArray (aPrimSegments); + + // add selection primitives + SelectionGeometry::Curve& aSensitiveCurve = mySelectionGeom.NewCurve(); + aSensitiveCurve.Append (aCenterLineBegin); + aSensitiveCurve.Append (aCenterLineEnd); + } + + // add arrows to presentation + { + thePresentation->NewGroup(); + DrawArrow (thePresentation, aSecondArrowBegin, aSecondArrowDir); + if (!theIsOneSide) + { + DrawArrow (thePresentation, aFirstArrowBegin, aFirstArrowDir); + } + } + + if (!isArrowsExternal || theIsOneSide) + { + break; + } + + // add extension lines for external arrows + { + DrawExtension (thePresentation, aDimensionAspect->ArrowTailSize(), + aFirstArrowEnd, aFirstExtensionDir, + THE_EMPTY_LABEL, 0.0, theMode, LabelPosition_None); + } + } + + break; + } + } + + // add flyout lines to presentation + if (theMode == ComputeMode_All) + { + Handle(Graphic3d_Group) aGroup = thePresentation->NewGroup(); + + Handle(Graphic3d_ArrayOfSegments) aPrimSegments = new Graphic3d_ArrayOfSegments(4); + aPrimSegments->AddVertex (theFirstPoint); + aPrimSegments->AddVertex (aLineBegPoint); + + aPrimSegments->AddVertex (theSecondPoint); + aPrimSegments->AddVertex (aLineEndPoint); + + aGroup->SetGroupPrimitivesAspect (aDimensionAspect->LineAspect()->Aspect()); + aGroup->AddPrimitiveArray (aPrimSegments); + } + + mySelectionGeom.IsComputed = Standard_True; +} + +//======================================================================= +//function : ComputeFlyoutLinePoints +//purpose : +//======================================================================= +void PrsDim_Dimension::ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, + gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) +{ + // compute dimension line points + gp_Ax1 aPlaneNormal = GetPlane().Axis(); + // compute flyout direction vector + gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); + gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; + // create lines for layouts + gp_Lin aLine1 (theFirstPoint, aFlyoutVector); + gp_Lin aLine2 (theSecondPoint, aFlyoutVector); + + // Get flyout end points + theLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); + theLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); +} + +//======================================================================= +//function : ComputeLinearFlyouts +//purpose : +//======================================================================= +void PrsDim_Dimension::ComputeLinearFlyouts (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theOwner, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint) +{ + // count flyout direction + gp_Ax1 aPlaneNormal = GetPlane().Axis(); + gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); + + // count a flyout direction vector. + gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; + + // create lines for layouts + gp_Lin aLine1 (theFirstPoint, aFlyoutVector); + gp_Lin aLine2 (theSecondPoint, aFlyoutVector); + + // get flyout end points + gp_Pnt aFlyoutEnd1 = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); + gp_Pnt aFlyoutEnd2 = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); + + // fill sensitive entity for flyouts + Handle(Select3D_SensitiveGroup) aSensitiveEntity = new Select3D_SensitiveGroup (theOwner); + aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, theFirstPoint, aFlyoutEnd1)); + aSensitiveEntity->Add (new Select3D_SensitiveSegment (theOwner, theSecondPoint, aFlyoutEnd2)); + theSelection->Add (aSensitiveEntity); +} + +//======================================================================= +//function : CircleFromPlanarFace +//purpose : if possible computes circle from planar face +//======================================================================= +Standard_Boolean PrsDim_Dimension::CircleFromPlanarFace (const TopoDS_Face& theFace, + Handle(Geom_Curve)& theCurve, + gp_Pnt& theFirstPoint, + gp_Pnt& theLastPoint) +{ + TopExp_Explorer anIt (theFace, TopAbs_EDGE); + for ( ; anIt.More(); anIt.Next()) + { + TopoDS_Edge aCurEdge = TopoDS::Edge (anIt.Current()); + if (PrsDim::ComputeGeometry (aCurEdge, theCurve, theFirstPoint, theLastPoint)) + { + if (theCurve->IsInstance (STANDARD_TYPE(Geom_Circle))) + { + return Standard_True; + } + } + } + return Standard_False; +} + +//======================================================================= +//function : CircleFromEdge +//purpose : if possible computes circle from edge +//======================================================================= +Standard_Boolean PrsDim_Dimension::CircleFromEdge (const TopoDS_Edge& theEdge, + gp_Circ& theCircle, + gp_Pnt& theFirstPoint, + gp_Pnt& theLastPoint) +{ + BRepAdaptor_Curve anAdaptedCurve (theEdge); + switch (anAdaptedCurve.GetType()) + { + case GeomAbs_Circle: + { + theCircle = anAdaptedCurve.Circle(); + break; + } + case GeomAbs_Ellipse: + { + gp_Elips anEll = anAdaptedCurve.Ellipse(); + if ((anEll.MinorRadius() - anEll.MajorRadius()) >= Precision::Confusion()) + { + return Standard_False; + } + theCircle = gp_Circ(anEll.Position(),anEll.MinorRadius()); + break; + } + case GeomAbs_Line: + case GeomAbs_Hyperbola: + case GeomAbs_Parabola: + case GeomAbs_BezierCurve: + case GeomAbs_BSplineCurve: + case GeomAbs_OtherCurve: + default: + return Standard_False; + } + + theFirstPoint = anAdaptedCurve.Value (anAdaptedCurve.FirstParameter()); + theLastPoint = anAdaptedCurve.Value (anAdaptedCurve.LastParameter()); + return Standard_True; +} + +//======================================================================= +//function : InitCircularDimension +//purpose : +//======================================================================= +Standard_Boolean PrsDim_Dimension::InitCircularDimension (const TopoDS_Shape& theShape, + gp_Circ& theCircle, + gp_Pnt& theMiddleArcPoint, + Standard_Boolean& theIsClosed) +{ + gp_Pln aPln; + Handle(Geom_Surface) aBasisSurf; + PrsDim_KindOfSurface aSurfType = PrsDim_KOS_OtherSurface; + gp_Pnt aFirstPoint, aLastPoint; + Standard_Real anOffset = 0.0; + Standard_Real aFirstParam = 0.0; + Standard_Real aLastParam = 0.0; + + // Discover circular geometry + switch (theShape.ShapeType()) + { + case TopAbs_FACE: + { + PrsDim::GetPlaneFromFace (TopoDS::Face (theShape), aPln, aBasisSurf, aSurfType, anOffset); + + if (aSurfType == PrsDim_KOS_Plane) + { + Handle(Geom_Curve) aCurve; + if (!CircleFromPlanarFace (TopoDS::Face (theShape), aCurve, aFirstPoint, aLastPoint)) + { + return Standard_False; + } + + theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); + } + else + { + gp_Pnt aCurPos; + BRepAdaptor_Surface aSurf1 (TopoDS::Face (theShape)); + Standard_Real aFirstU = aSurf1.FirstUParameter(); + Standard_Real aLastU = aSurf1.LastUParameter(); + Standard_Real aFirstV = aSurf1.FirstVParameter(); + Standard_Real aLastV = aSurf1.LastVParameter(); + Standard_Real aMidU = (aFirstU + aLastU) * 0.5; + Standard_Real aMidV = (aFirstV + aLastV) * 0.5; + aSurf1.D0 (aMidU, aMidV, aCurPos); + Handle (Adaptor3d_HCurve) aBasisCurve; + Standard_Boolean isExpectedType = Standard_False; + if (aSurfType == PrsDim_KOS_Cylinder) + { + isExpectedType = Standard_True; + } + else + { + if (aSurfType == PrsDim_KOS_Revolution) + { + aBasisCurve = aSurf1.BasisCurve(); + if (aBasisCurve->GetType() == GeomAbs_Line) + { + isExpectedType = Standard_True; + } + } + else if (aSurfType == PrsDim_KOS_Extrusion) + { + aBasisCurve = aSurf1.BasisCurve(); + if (aBasisCurve->GetType() == GeomAbs_Circle) + { + isExpectedType = Standard_True; + } + } + } + + if (!isExpectedType) + { + return Standard_False; + } + + Handle(Geom_Curve) aCurve = aBasisSurf->VIso(aMidV); + if (aCurve->DynamicType() == STANDARD_TYPE (Geom_Circle)) + { + theCircle = Handle(Geom_Circle)::DownCast (aCurve)->Circ(); + } + else if (aCurve->DynamicType() == STANDARD_TYPE (Geom_TrimmedCurve)) + { + Handle(Geom_TrimmedCurve) aTrimmedCurve = Handle(Geom_TrimmedCurve)::DownCast (aCurve); + aFirstU = aTrimmedCurve->FirstParameter(); + aLastU = aTrimmedCurve->LastParameter(); + if (aTrimmedCurve->BasisCurve()->DynamicType() == STANDARD_TYPE (Geom_Circle)) + { + theCircle = Handle(Geom_Circle)::DownCast(aTrimmedCurve->BasisCurve())->Circ(); + } + } + else + { + // Compute a circle from 3 points on "aCurve" + gp_Pnt aP1, aP2; + aSurf1.D0 (aFirstU, aMidV, aP1); + aSurf1.D0 (aLastU, aMidV, aP2); + GC_MakeCircle aMkCirc (aP1, aCurPos, aP2); + theCircle = aMkCirc.Value()->Circ(); + } + + aFirstPoint = ElCLib::Value (aFirstU, theCircle); + aLastPoint = ElCLib::Value (aLastU, theCircle); + } + break; + } + case TopAbs_WIRE: + { + TopoDS_Edge anEdge; + TopExp_Explorer anIt (theShape, TopAbs_EDGE); + if (anIt.More()) + { + anEdge = TopoDS::Edge (anIt.Current()); + } + if (!PrsDim_Dimension::CircleFromEdge (anEdge, theCircle, aFirstPoint, aLastPoint)) + { + return Standard_False; + } + break; + } + case TopAbs_EDGE: + { + TopoDS_Edge anEdge = TopoDS::Edge (theShape); + if (!PrsDim_Dimension::CircleFromEdge (anEdge, theCircle, aFirstPoint, aLastPoint)) + { + return Standard_False; + } + break; + } + case TopAbs_COMPOUND: + case TopAbs_COMPSOLID: + case TopAbs_SOLID: + case TopAbs_SHELL: + case TopAbs_VERTEX: + case TopAbs_SHAPE: + default: + return Standard_False; + } + + theIsClosed = aFirstPoint.IsEqual (aLastPoint, Precision::Confusion()); + + gp_Pnt aCenter = theCircle.Location(); + + if (theIsClosed) // Circle + { + gp_Dir anXDir = theCircle.XAxis().Direction(); + theMiddleArcPoint = aCenter.Translated (gp_Vec (anXDir) * theCircle.Radius()); + } + else // Arc + { + aFirstParam = ElCLib::Parameter (theCircle, aFirstPoint); + aLastParam = ElCLib::Parameter (theCircle, aLastPoint); + if (aFirstParam > aLastParam) + { + aFirstParam -= 2.0 * M_PI; + } + + Standard_Real aParCurPos = (aFirstParam + aLastParam) * 0.5; + gp_Vec aVec = gp_Vec (aCenter, ElCLib::Value (aParCurPos, theCircle)).Normalized () * theCircle.Radius (); + theMiddleArcPoint = aCenter.Translated (aVec); + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_Dimension::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, + const Standard_Integer theMode) +{ + if (!mySelectionGeom.IsComputed) + { + return; + } + + PrsDim_DimensionSelectionMode aSelectionMode = (PrsDim_DimensionSelectionMode)theMode; + + // init appropriate entity owner + Handle(SelectMgr_EntityOwner) aSensitiveOwner; + + switch (aSelectionMode) + { + // neutral selection owner + case PrsDim_DimensionSelectionMode_All: + aSensitiveOwner = new SelectMgr_EntityOwner (this, THE_NEUTRAL_SEL_PRIORITY); + break; + + // local selection owners + case PrsDim_DimensionSelectionMode_Line: + case PrsDim_DimensionSelectionMode_Text: + aSensitiveOwner = new PrsDim_DimensionOwner (this, aSelectionMode, THE_LOCAL_SEL_PRIORITY); + break; + } + + if (aSelectionMode == PrsDim_DimensionSelectionMode_All || aSelectionMode == PrsDim_DimensionSelectionMode_Line) + { + // sensitives for dimension line segments + Handle(Select3D_SensitiveGroup) aGroupOfSensitives = new Select3D_SensitiveGroup (aSensitiveOwner); + + SelectionGeometry::SeqOfCurves::Iterator aCurveIt (mySelectionGeom.DimensionLine); + for (; aCurveIt.More(); aCurveIt.Next()) + { + const SelectionGeometry::HCurve& aCurveData = aCurveIt.Value(); + + TColgp_Array1OfPnt aSensitivePnts (1, aCurveData->Length()); + for (Standard_Integer aPntIt = 1; aPntIt <= aCurveData->Length(); ++aPntIt) + { + aSensitivePnts.ChangeValue (aPntIt) = aCurveData->Value (aPntIt); + } + + aGroupOfSensitives->Add (new Select3D_SensitiveCurve (aSensitiveOwner, aSensitivePnts)); + } + + Standard_Real anArrowLength = myDrawer->DimensionAspect()->ArrowAspect()->Length(); + Standard_Real anArrowAngle = myDrawer->DimensionAspect()->ArrowAspect()->Angle(); + + // sensitives for arrows + SelectionGeometry::SeqOfArrows::Iterator anArrowIt (mySelectionGeom.Arrows); + for (; anArrowIt.More(); anArrowIt.Next()) + { + const SelectionGeometry::HArrow& anArrow = anArrowIt.Value(); + + gp_Pnt aSidePnt1 (gp::Origin()); + gp_Pnt aSidePnt2 (gp::Origin()); + const gp_Dir& aPlane = GetPlane().Axis().Direction(); + const gp_Pnt& aPeak = anArrow->Position; + const gp_Dir& aDir = anArrow->Direction; + + // compute points for arrow in plane + PointsForArrow (aPeak, aDir, aPlane, anArrowLength, anArrowAngle, aSidePnt1, aSidePnt2); + + aGroupOfSensitives->Add (new Select3D_SensitiveTriangle (aSensitiveOwner, aPeak, aSidePnt1, aSidePnt2)); + + if (!myDrawer->DimensionAspect()->IsArrows3d()) + { + continue; + } + + // compute points for orthogonal sensitive plane + gp_Dir anOrthoPlane = anArrow->Direction.Crossed (aPlane); + + PointsForArrow (aPeak, aDir, anOrthoPlane, anArrowLength, anArrowAngle, aSidePnt1, aSidePnt2); + + aGroupOfSensitives->Add (new Select3D_SensitiveTriangle (aSensitiveOwner, aPeak, aSidePnt1, aSidePnt2)); + } + + theSelection->Add (aGroupOfSensitives); + } + + // sensitives for text element + if (aSelectionMode == PrsDim_DimensionSelectionMode_All || aSelectionMode == PrsDim_DimensionSelectionMode_Text) + { + Handle(Select3D_SensitiveEntity) aTextSensitive; + + gp_Ax2 aTextAxes (mySelectionGeom.TextPos, + GetPlane().Axis().Direction(), + mySelectionGeom.TextDir); + + if (myDrawer->DimensionAspect()->IsText3d()) + { + // sensitive planar rectangle for text + Standard_Real aDx = mySelectionGeom.TextWidth * 0.5; + Standard_Real aDy = mySelectionGeom.TextHeight * 0.5; + + gp_Trsf aLabelPlane; + aLabelPlane.SetTransformation (aTextAxes, gp::XOY()); + + TColgp_Array1OfPnt aRectanglePoints(1, 4); + aRectanglePoints.ChangeValue(1) = gp_Pnt (-aDx, -aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue(2) = gp_Pnt (-aDx, aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue(3) = gp_Pnt ( aDx, aDy, 0.0).Transformed (aLabelPlane); + aRectanglePoints.ChangeValue(4) = gp_Pnt ( aDx, -aDy, 0.0).Transformed (aLabelPlane); + + Poly_Array1OfTriangle aTriangles(1, 2); + aTriangles.ChangeValue(1) = Poly_Triangle(1, 2, 3); + aTriangles.ChangeValue(2) = Poly_Triangle(1, 3, 4); + + Handle(Poly_Triangulation) aRectanglePoly = + new Poly_Triangulation(aRectanglePoints, aTriangles); + + aTextSensitive = + new Select3D_SensitiveTriangulation (aSensitiveOwner, aRectanglePoly, TopLoc_Location(), Standard_True); + } + else + { + gp_Circ aTextGeom (aTextAxes, mySelToleranceForText2d != 0.0 + ? mySelToleranceForText2d : 1.0); + aTextSensitive = new Select3D_SensitiveCircle (aSensitiveOwner, aTextGeom, Standard_True); + } + + theSelection->Add (aTextSensitive); + } + + // callback for flyout sensitive calculation + if (aSelectionMode == PrsDim_DimensionSelectionMode_All) + { + ComputeFlyoutSelection (theSelection, aSensitiveOwner); + } +} + +//======================================================================= +//function : PointsForArrow +//purpose : +//======================================================================= +void PrsDim_Dimension::PointsForArrow (const gp_Pnt& thePeakPnt, + const gp_Dir& theDirection, + const gp_Dir& thePlane, + const Standard_Real theArrowLength, + const Standard_Real theArrowAngle, + gp_Pnt& theSidePnt1, + gp_Pnt& theSidePnt2) +{ + gp_Lin anArrowLin (thePeakPnt, theDirection.Reversed()); + gp_Pnt anArrowEnd = ElCLib::Value (theArrowLength, anArrowLin); + gp_Lin anEdgeLin (anArrowEnd, theDirection.Crossed (thePlane)); + + Standard_Real anEdgeLength = Tan (theArrowAngle) * theArrowLength; + + theSidePnt1 = ElCLib::Value ( anEdgeLength, anEdgeLin); + theSidePnt2 = ElCLib::Value (-anEdgeLength, anEdgeLin); +} + +//======================================================================= +//function : GetTextPositionForLinear +//purpose : +//======================================================================= +gp_Pnt PrsDim_Dimension::GetTextPositionForLinear (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide) const +{ + if (!IsValid()) + { + return gp::Origin(); + } + + gp_Pnt aTextPosition (gp::Origin()); + + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + // Get label alignment and arrow orientation. + Standard_Integer aLabelPosition = 0; + Standard_Boolean isArrowsExternal = Standard_False; + FitTextAlignmentForLinear (theFirstPoint, theSecondPoint, theIsOneSide, + aDimensionAspect->TextHorizontalPosition(), + aLabelPosition, isArrowsExternal); + + // Compute dimension line points. + gp_Dir aPlaneNormal = GetPlane().Axis().Direction(); + gp_Vec aTargetPointsVec (theFirstPoint, theSecondPoint); + + // Compute flyout direction vector + gp_Dir aFlyoutVector = aPlaneNormal ^ gp_Dir (aTargetPointsVec); + + // create lines for layouts + gp_Lin aLine1 (theFirstPoint, aFlyoutVector); + gp_Lin aLine2 (theSecondPoint, aFlyoutVector); + // Get flyout end points + gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); + gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); + + // Get text position. + switch (aLabelPosition & LabelPosition_HMask) + { + case LabelPosition_Left: + { + gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + + Standard_Real anOffset = isArrowsExternal + ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() + : anExtensionSize; + gp_Vec anExtensionVec = gp_Vec (aTargetPointsDir) * -anOffset; + aTextPosition = aLineEndPoint.Translated (anExtensionVec); + } + break; + case LabelPosition_Right: + { + gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); + Standard_Real anExtensionSize = aDimensionAspect->ExtensionSize(); + + Standard_Real anOffset = isArrowsExternal + ? anExtensionSize + aDimensionAspect->ArrowAspect()->Length() + : anExtensionSize; + gp_Vec anExtensionVec = gp_Vec (aTargetPointsDir) * anOffset; + aTextPosition = aLineBegPoint.Translated (anExtensionVec); + } + break; + case LabelPosition_HCenter: + { + aTextPosition = (aLineBegPoint.XYZ() + aLineEndPoint.XYZ()) * 0.5; + } + break; + } + + return aTextPosition; +} + +//======================================================================= +//function : AdjustParametersForLinear +//purpose : +//======================================================================= +Standard_Boolean PrsDim_Dimension::AdjustParametersForLinear (const gp_Pnt& theTextPos, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + Standard_Real& theExtensionSize, + Prs3d_DimensionTextHorizontalPosition& theAlignment, + Standard_Real& theFlyout, + gp_Pln& thePlane, + Standard_Boolean& theIsPlaneOld) const +{ + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + + gp_Dir aTargetPointsDir = gce_MakeDir (theFirstPoint, theSecondPoint); + gp_Vec aTargetPointsVec (theFirstPoint, theSecondPoint); + + // Don't set new plane if the text position lies on the attachment points line. + gp_Lin aTargetPointsLin (theFirstPoint, aTargetPointsDir); + if (!aTargetPointsLin.Contains (theTextPos, Precision::Confusion())) + { + //Set new automatic plane. + thePlane = gce_MakePln (theTextPos, theFirstPoint, theSecondPoint); + theIsPlaneOld = Standard_False; + } + + // Compute flyout direction vector. + gp_Dir aPlaneNormal = GetPlane().Axis().Direction(); + gp_Dir aPositiveFlyout = aPlaneNormal ^ aTargetPointsDir; + + // Additional check of collinearity of the plane normal and attachment points vector. + if (aPlaneNormal.IsParallel (aTargetPointsDir, Precision::Angular())) + { + return Standard_False; + } + + // Set flyout. + gp_Vec aFirstToTextVec (theFirstPoint, theTextPos); + + Standard_Real aCos = aFirstToTextVec.Normalized() * gp_Vec (aTargetPointsDir); + + gp_Pnt aTextPosProj = theFirstPoint.Translated + (gp_Vec (aTargetPointsDir) * aFirstToTextVec.Magnitude() * aCos); + + // Compute flyout value and direction. + gp_Vec aFlyoutVector = gp_Vec (aTextPosProj, theTextPos); + + theFlyout = 0.0; + if (aFlyoutVector.Magnitude() > Precision::Confusion()) + { + theFlyout = gp_Dir (aFlyoutVector).IsOpposite (aPositiveFlyout, Precision::Angular()) + ? -aFlyoutVector.Magnitude() + : aFlyoutVector.Magnitude(); + } + + // Compute attach points (through which main dimension line passes). + gp_Pnt aFirstAttach = theFirstPoint.Translated (aFlyoutVector); + gp_Pnt aSecondAttach = theSecondPoint.Translated (aFlyoutVector); + + // Set horizontal text alignment. + if (aCos < 0.0) + { + theAlignment = Prs3d_DTHP_Left; + + Standard_Real aNewExtSize = theTextPos.Distance (aFirstAttach) - anArrowLength; + theExtensionSize = aNewExtSize < 0.0 ? 0.0 : aNewExtSize; + } + else if (aTextPosProj.Distance (theFirstPoint) > theFirstPoint.Distance (theSecondPoint)) + { + theAlignment = Prs3d_DTHP_Right; + + Standard_Real aNewExtSize = theTextPos.Distance (aSecondAttach) - anArrowLength; + theExtensionSize = aNewExtSize < 0.0 ? 0.0 : aNewExtSize; + } + else + { + theAlignment = Prs3d_DTHP_Center; + } + return Standard_True; +} + +//======================================================================= +//function : FitTextAlignmentForLinear +//purpose : +//======================================================================= +void PrsDim_Dimension::FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide, + const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, + Standard_Integer& theLabelPosition, + Standard_Boolean& theIsArrowsExternal) const +{ + theLabelPosition = LabelPosition_None; + theIsArrowsExternal = Standard_False; + + // Compute dimension line points + gp_Ax1 aPlaneNormal = GetPlane().Axis(); + gp_Dir aTargetPointsVector = gce_MakeDir (theFirstPoint, theSecondPoint); + + // compute flyout direction vector + gp_Dir aFlyoutVector = aPlaneNormal.Direction() ^ aTargetPointsVector; + + // create lines for layouts + gp_Lin aLine1 (theFirstPoint, aFlyoutVector); + gp_Lin aLine2 (theSecondPoint, aFlyoutVector); + + // Get flyout end points + gp_Pnt aLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout(), aLine1); + gp_Pnt aLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); + + Handle(Prs3d_DimensionAspect) aDimensionAspect = myDrawer->DimensionAspect(); + + // For extensions we need to know arrow size, text size and extension size: get it from aspect + Standard_Real anArrowLength = aDimensionAspect->ArrowAspect()->Length(); + + // prepare label string and compute its geometrical width + Standard_Real aLabelWidth; + TCollection_ExtendedString aLabelString = GetValueString (aLabelWidth); + + // Add margins to cut dimension lines for 3d text + if (aDimensionAspect->IsText3d()) + { + aLabelWidth += aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN * 2.0; + } + + // Handle user-defined and automatic arrow placement + switch (aDimensionAspect->ArrowOrientation()) + { + case Prs3d_DAO_External: theIsArrowsExternal = true; break; + case Prs3d_DAO_Internal: theIsArrowsExternal = false; break; + case Prs3d_DAO_Fit: + { + // Add margin to ensure a small tail between text and arrow + Standard_Real anArrowMargin = aDimensionAspect->IsText3d() + ? aDimensionAspect->TextAspect()->Height() * THE_3D_TEXT_MARGIN + : 0.0; + + Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint); + Standard_Real anArrowsWidth = theIsOneSide + ? anArrowLength + anArrowMargin + : (anArrowLength + anArrowMargin) * 2.0; + + theIsArrowsExternal = aDimensionWidth < aLabelWidth + anArrowsWidth; + break; + } + } + + // Handle user-defined and automatic text placement + switch (theHorizontalTextPos) + { + case Prs3d_DTHP_Left : theLabelPosition |= LabelPosition_Left; break; + case Prs3d_DTHP_Right : theLabelPosition |= LabelPosition_Right; break; + case Prs3d_DTHP_Center: theLabelPosition |= LabelPosition_HCenter; break; + case Prs3d_DTHP_Fit: + { + Standard_Real aDimensionWidth = aLineBegPoint.Distance (aLineEndPoint); + Standard_Real anArrowsWidth = theIsOneSide ? anArrowLength : 2.0 * anArrowLength; + Standard_Real aContentWidth = theIsArrowsExternal ? aLabelWidth : aLabelWidth + anArrowsWidth; + + theLabelPosition |= aDimensionWidth < aContentWidth ? LabelPosition_Left : LabelPosition_HCenter; + break; + } + } + + // Handle vertical text placement options + switch (aDimensionAspect->TextVerticalPosition()) + { + case Prs3d_DTVP_Above : theLabelPosition |= LabelPosition_Above; break; + case Prs3d_DTVP_Below : theLabelPosition |= LabelPosition_Below; break; + case Prs3d_DTVP_Center : theLabelPosition |= LabelPosition_VCenter; break; + } +} + +//======================================================================= +//function : UnsetFixedTextPosition +//purpose : +//======================================================================= +void PrsDim_Dimension::UnsetFixedTextPosition() +{ + myIsTextPositionFixed = Standard_False; + myFixedTextPosition = gp::Origin(); +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Dimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Dimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Dimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Dimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,697 @@ +// Created on: 2013-11-11 +// Created by: Anastasia BORISOVA +// Copyright (c) 2013-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_Dimension_HeaderFile +#define _PrsDim_Dimension_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_Dimension, AIS_InteractiveObject) + +//! PrsDim_Dimension is a base class for 2D presentations of linear (length, diameter, radius) +//! and angular dimensions. +//! +//! The dimensions provide measurement of quantities, such as lengths or plane angles. +//! The measurement of dimension "value" is done in model space "as is". +//! These "value" are said to be represented in "model units", which can be specified by user. +//! During the display the measured value converted from "model units" to "display units". +//! The display and model units are stored in common Prs3d_Drawer (drawer of the context) +//! to share it between all dimensions. +//! The specified by user units are stored in the dimension's drawer. +//! +//! As a drawing, the dimension is composed from the following components: +//! - Attachment (binding) points. The points where the dimension lines attaches to, for +//! length dimensions the distances are measured between these points. +//! - Main dimension line. The which extends from the attachment points in "up" direction, +//! and which contains text label on it with value string. +//! - Flyouts. The lines connecting the attachment points with main dimension line. +//! - Extension. The lines used to extend the main dimension line in the cases when text +//! or arrows do not fit into the main dimension line due to their size. +//! - Arrows. +//! +//!
+//!  Linear dimensions:
+//!
+//!  extension
+//!   line                                     arrow
+//!       -->|------- main dimension line -------|<--
+//!          |                                   |
+//!          |flyout                       flyout|
+//!          |                                   |
+//!          +-----------------------------------+
+//! attachment                                attachment
+//!  point                                       point
+//!
+//!  Angular dimensions:
+//!
+//!                  extension
+//!                     line
+//!                        -->|+++++
+//!                     arrow |     +++
+//!                           |        90(deg) - main dimension line
+//!                    flyout |         +++
+//!                           |           +
+//!                           o---flyout---
+//!                         center         ^ 
+//!                         point          | extension
+//!                                          line
+//! 
+//! +//! Being a 2D drawings, the dimensions are created on imaginary plane, called "dimension plane", +//! which can be thought of as reference system of axes (X,Y,N) for constructing the presentation. +//! +//! The role of axes of the dimension plane is to guide you through the encapsualted automations +//! of presentation building to help you understand how is the presentation will look and how it +//! will be oriented in model space during construction. +//! +//! Orientation of dimension line in model space relatively to the base shapes is defined +//! with the flyouts. Flyouts specify length of flyout lines and their orientation relatively +//! to the attachment points on the working plane. +//! For linear dimensions: +//! Direction of flyouts is specified with direction of main dimension line +//! (vector from the first attachment to the second attachment) and the normal of the dimension plane. +//! Positive direction of flyouts is defined by vector multiplication: AttachVector * PlaneNormal. +//! For angular dimensions: +//! Flyouts are defined by vectors from the center point to the attachment points. +//! These vectors directions are supposed to be the positive directions of flyouts. +//! Negative flyouts directions means that these vectors should be reversed +//! (and dimension will be built out of the angle constructed with center and two attach points). +//! +//! The dimension plane can be constructed automatically by application (where possible, +//! it depends on the measured geometry). +//! It can be also set by user. However, if the user-defined plane does not fit the +//! geometry of the dimension (attach points do not belong to it), the dimension could not +//! be built. +//! If it is not possible to compute automatic plane (for example, in case of length between +//! two points) the user is supposed to specify the custom plane. +//! +//! Since the dimensions feature automated construction procedures from an arbitrary shapes, +//! the interfaces to check the validness are also implemented. Once the measured geometry is +//! specified, the one can inquire the validness status by calling "IsValid()" method. If the result +//! is TRUE, then all of public parameters should be pre-computed and ready. The presentation +//! should be also computable. Otherwise, the parameters may return invalid values. In this case, +//! the presentation will not be computed and displayed. +//! +//! The dimension support two local selection modes: main dimension line selection and text label +//! selection. These modes can be used to develop interactive modification of dimension presentations. +//! The component highlighting in these selection modes is provided by PrsDim_DimensionOwner class. +//! Please note that selection is unavailable until the presentation is computed. +//! +//! The specific drawing attributes are controlled through Prs3d_DimensionAspect. The one can change +//! color, arrows, text and arrow style and specify positioning of value label by setting corresponding +//! values to the aspect. +//! +//! Such set of parameters that consists of: +//! - flyout size and direction, +//! - user-defined dimension plane, +//! - horizontal and vertical text alignment +//! can be uniquely replaced with text position in 3d space. Therefore, there are methods to convert +//! this set of parameters to the text position and vice versa: +//! +//! - If the fixed text position is defined by user, called SetTextPosition (theTextPos) method converts +//! this 3d point to the set of parameters including adjusting of the dimension plane (this plane will be +//! automatic plane, NOT user-defined one). +//! If the fixed text position is set, the flag myIsFixedTextPosition is set to TRUE. +//! ATTENSION! myIsFixedTextPosition fixes all parameters of the set from recomputing inside +//! SetMeasureGeometry() methods. Parameters in dimension aspect (they are horizontal text position +//! and extension size) are adjusted on presentation computing step, user-defined values in +//! dimension aspect are not changed. +//! But plane and flyout as dimension position parameters are changed by SetTextPosition() method +//! according with user-defined text position. +//! If parameters from the set are changed by user with calls of setters, it leads to disabling of +//! fixed text position (myIsFixedTextPosition is set to FALSE). +//! If the fixed text position is set and geometry is changed by user (SetMeasureGeometry() method +//! is called) and the geometry doesn't satisfy computed dimension plane, the dimension is not valid. +//! +//! - If the set of parameters was set by user (may be without the user-defined plane or with it), +//! it can be converted to the text position by calling the method GetTextPosition(). In this case +//! the text position is NOT fixed, and SetMeasureGeometry() without user-defined plane adjusts +//! the automatic plane according input geometry (if it is possible). +class PrsDim_Dimension : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_Dimension, AIS_InteractiveObject) +protected: + + //! Geometry type defines type of shapes on which the dimension is to be built. + //! Some type of geometry allows automatic plane computing and + //! can be built without user-defined plane + //! Another types can't be built without user-defined plane. + enum GeometryType + { + GeometryType_UndefShapes, + GeometryType_Edge, + GeometryType_Face, + GeometryType_Points, + GeometryType_Edges, + GeometryType_Faces, + GeometryType_EdgeFace, + GeometryType_EdgeVertex + }; + + //! Specifies supported at base level horizontal and vertical + //! label positions for drawing extension lines and centered text. + enum LabelPosition + { + LabelPosition_None = 0x00, + + LabelPosition_Left = 0x01, + LabelPosition_Right = 0x02, + LabelPosition_HCenter = 0x04, + LabelPosition_HMask = LabelPosition_Left | LabelPosition_Right | LabelPosition_HCenter, + + LabelPosition_Above = 0x10, + LabelPosition_Below = 0x20, + LabelPosition_VCenter = 0x40, + LabelPosition_VMask = LabelPosition_Above | LabelPosition_Below | LabelPosition_VCenter + }; + + enum ValueType + { + ValueType_Computed, + ValueType_CustomReal, + ValueType_CustomText + }; + +public: + + //! Specifies supported presentation compute modes. + //! Used to compute only parts of presentation for + //! advanced highlighting. + enum ComputeMode + { + ComputeMode_All = 0, //!< "0" is reserved as neutral mode + ComputeMode_Line = 1, //!< corresponds to selection mode + ComputeMode_Text = 2 //!< corresponds to selection mode + }; + +public: + + //! Constructor with default parameters values. + //! @param theType [in] the type of dimension. + Standard_EXPORT PrsDim_Dimension (const PrsDim_KindOfDimension theType); + + //! Gets dimension measurement value. If the value to display is not + //! specified by user, then the dimension object is responsible to + //! compute it on its own in model space coordinates. + //! @return the dimension value (in model units) which is used + //! during display of the presentation. + Standard_Real GetValue() const + { + return myValueType == ValueType_CustomReal ? myCustomValue : ComputeValue(); + } + + //! Sets computed dimension value. Resets custom value mode if it was set. + void SetComputedValue () + { + myValueType = ValueType_Computed; + } + + //! Sets user-defined dimension value. + //! The user-defined dimension value is specified in model space, + //! and affect by unit conversion during the display. + //! @param theValue [in] the user-defined value to display. + Standard_EXPORT void SetCustomValue (const Standard_Real theValue); + + //! Sets user-defined dimension value. + //! Unit conversion during the display is not applyed. + //! @param theValue [in] the user-defined value to display. + Standard_EXPORT void SetCustomValue (const TCollection_ExtendedString& theValue); + + //! Gets user-defined dimension value. + //! @return dimension value string. + const TCollection_ExtendedString& GetCustomValue() const { return myCustomStringValue; } + + //! Get the dimension plane in which the 2D dimension presentation is computed. + //! By default, if plane is not defined by user, it is computed automatically + //! after dimension geometry is computed. + //! If computed dimension geometry (points) can't be placed on the user-defined + //! plane, dimension geometry was set as invalid (validity flag is set to false) + //! and dimension presentation will not be computed. + //! If user-defined plane allow geometry placement on it, it will be used for + //! computing of the dimension presentation. + //! @return dimension plane used for presentation computing. + const gp_Pln& GetPlane() const { return myPlane; } + + //! Geometry type defines type of shapes on which the dimension is to be built. + //! @return type of geometry on which the dimension will be built. + Standard_Integer GetGeometryType () const { return myGeometryType; } + + //! Sets user-defined plane where the 2D dimension presentation will be placed. + //! Checks validity of this plane if geometry has been set already. + //! Validity of the plane is checked according to the geometry set + //! and has different criteria for different kinds of dimensions. + Standard_EXPORT virtual void SetCustomPlane (const gp_Pln& thePlane); + + //! Unsets user-defined plane. Therefore the plane for dimension will be + //! computed automatically. + void UnsetCustomPlane() { myIsPlaneCustom = Standard_False; } + + //! @return TRUE if text position is set by user with method SetTextPosition(). + Standard_Boolean IsTextPositionCustom() const + { + return myIsTextPositionFixed; + } + + //! Fixes the absolute text position and adjusts flyout, plane and text alignment + //! according to it. Updates presentation if the text position is valid. + //! ATTENTION! It does not change vertical text alignment. + //! @param theTextPos [in] the point of text position. + virtual void SetTextPosition (const gp_Pnt& /*theTextPos*/) { } + + //! Computes absolute text position from dimension parameters + //! (flyout, plane and text alignment). + virtual gp_Pnt GetTextPosition () const { return gp_Pnt(); } + +public: + + //! Gets the dimension aspect from AIS object drawer. + //! Dimension aspect contains aspects of line, text and arrows for dimension presentation. + Handle(Prs3d_DimensionAspect) DimensionAspect() const + { + return myDrawer->DimensionAspect(); + } + + //! Sets new dimension aspect for the interactive object drawer. + //! The dimension aspect provides dynamic properties which are generally + //! used during computation of dimension presentations. + Standard_EXPORT void SetDimensionAspect (const Handle(Prs3d_DimensionAspect)& theDimensionAspect); + + //! @return the kind of dimension. + PrsDim_KindOfDimension KindOfDimension() const { return myKindOfDimension; } + + //! @return the kind of interactive. + virtual AIS_KindOfInteractive Type() const Standard_OVERRIDE { return AIS_KOI_Dimension; } + + //! Returns true if the class of objects accepts the display mode theMode. + //! The interactive context can have a default mode of representation for + //! the set of Interactive Objects. This mode may not be accepted by object. + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE + { + return theMode == ComputeMode_All; + } + +public: + + //! @return dimension special symbol display options. + PrsDim_DisplaySpecialSymbol DisplaySpecialSymbol() const { return myDisplaySpecialSymbol; } + + //! Specifies whether to display special symbol or not. + Standard_EXPORT void SetDisplaySpecialSymbol (const PrsDim_DisplaySpecialSymbol theDisplaySpecSymbol); + + //! @return special symbol. + Standard_ExtCharacter SpecialSymbol() const + { + return mySpecialSymbol; + } + + //! Specifies special symbol. + Standard_EXPORT void SetSpecialSymbol (const Standard_ExtCharacter theSpecialSymbol); + + Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const; + + Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const; + + virtual void SetDisplayUnits (const TCollection_AsciiString& /*theUnits*/) { } + + virtual void SetModelUnits (const TCollection_AsciiString& /*theUnits*/) { } + + //! Unsets user defined text positioning and enables text positioning + //! by other parameters: text alignment, extension size, flyout and custom plane. + Standard_EXPORT void UnsetFixedTextPosition(); + +public: + + //! Returns selection tolerance for text2d: + //! For 2d text selection detection sensitive point with tolerance is used + //! Important! Only for 2d text. + Standard_Real SelToleranceForText2d() const + { + return mySelToleranceForText2d; + } + + //! Sets selection tolerance for text2d: + //! For 2d text selection detection sensitive point with tolerance is used + //! to change this tolerance use this method + //! Important! Only for 2d text. + Standard_EXPORT void SetSelToleranceForText2d (const Standard_Real theTol); + + //! @return flyout value for dimension. + Standard_Real GetFlyout() const + { + return myFlyout; + } + + //! Sets flyout value for dimension. + Standard_EXPORT void SetFlyout (const Standard_Real theFlyout); + + //! Check that the input geometry for dimension is valid and the + //! presentation can be successfully computed. + //! @return TRUE if dimension geometry is ok. + virtual Standard_Boolean IsValid() const + { + return myIsGeometryValid && CheckPlane (GetPlane()); + } + +protected: + + Standard_EXPORT Standard_Real ValueToDisplayUnits() const; + + //! Get formatted value string and its model space width. + //! @param theWidth [out] the model space with of the string. + //! @return formatted dimension value string. + Standard_EXPORT TCollection_ExtendedString GetValueString (Standard_Real& theWidth) const; + + //! Performs drawing of 2d or 3d arrows on the working plane + //! @param theLocation [in] the location of the arrow tip. + //! @param theDirection [in] the direction from the tip to the bottom of the arrow. + Standard_EXPORT void DrawArrow (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theLocation, + const gp_Dir& theDirection); + + //! Performs drawing of 2d or 3d text on the working plane + //! @param theTextPos [in] the position of the text label. + //! @param theTestDir [in] the direction of the text label. + //! @param theText [in] the text label string. + //! @param theLabelPosition [in] the text label vertical and horizontal positioning option + //! respectively to the main dimension line. + //! @return text width relative to the dimension working plane. For 2d text this value will be zero. + Standard_EXPORT void drawText (const Handle(Prs3d_Presentation)& thePresentation, + const gp_Pnt& theTextPos, + const gp_Dir& theTextDir, + const TCollection_ExtendedString& theText, + const Standard_Integer theLabelPosition); + + //! Performs computing of dimension linear extension with text + //! @param thePresentation [in] the presentation to fill with graphical primitives. + //! @param theExtensionSize [in] the size of extension line. + //! @param theExtensionStart [in] the point where extension line connects to dimension. + //! @param theExtensionDir [in] the direction of extension line. + //! @param theLabelString [in] the string with value. + //! @param theLabelWidth [in] the geometrical width computed for value string. + //! @param theMode [in] the display mode. + //! @param theLabelPosition [in] position flags for the text label. + Standard_EXPORT void DrawExtension (const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Real theExtensionSize, + const gp_Pnt& theExtensionStart, + const gp_Dir& theExtensionDir, + const TCollection_ExtendedString& theLabelString, + const Standard_Real theLabelWidth, + const Standard_Integer theMode, + const Standard_Integer theLabelPosition); + + //! Performs computing of linear dimension (for length, diameter, radius and so on). + //! Please note that this method uses base dimension properties, like working plane + //! flyout length, drawer attributes. + //! @param thePresentation [in] the presentation to fill with primitives. + //! @param theMode [in] the presentation compute mode. + //! @param theFirstPoint [in] the first attach point of linear dimension. + //! @param theSecondPoint [in] the second attach point of linear dimension. + //! @param theIsOneSide [in] specifies whether the dimension has only one flyout line. + Standard_EXPORT void DrawLinearDimension (const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide = Standard_False); + + //! Computes points bounded the flyout line for linear dimension. + //! @param theFirstPoint [in] the first attach point of linear dimension. + //! @param theSecondPoint [in] the second attach point of linear dimension. + //! @param theLineBegPoint [out] the first attach point of linear dimension. + //! @param theLineEndPoint [out] the second attach point of linear dimension. + Standard_EXPORT virtual void ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, + gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint); + + //! Compute selection sensitives for linear dimension flyout lines (length, diameter, radius). + //! Please note that this method uses base dimension properties: working plane and flyout length. + //! @param theSelection [in] the selection structure to fill with selection primitives. + //! @param theOwner [in] the selection entity owner. + //! @param theFirstPoint [in] the first attach point of linear dimension. + //! @param theSecondPoint [in] the second attach point of linear dimension. + Standard_EXPORT void ComputeLinearFlyouts (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theOwner, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint); + + + //! Performs initialization of circle and middle arc point from the passed + //! shape which is assumed to contain circular geometry. + //! @param theShape [in] the shape to explore. + //! @param theCircle [out] the circle geometry. + //! @param theMiddleArcPoint [out] the middle point of the arc. + //! @param theIsClosed [out] returns TRUE if the geometry is closed circle. + //! @return TRUE if the the circle is successfully got from the input shape. + Standard_EXPORT Standard_Boolean InitCircularDimension (const TopoDS_Shape& theShape, + gp_Circ& theCircle, + gp_Pnt& theMiddleArcPoint, + Standard_Boolean& theIsClosed); + + //! Produce points for triangular arrow face. + //! @param thePeakPnt [in] the arrow peak position. + //! @param theDirection [in] the arrow direction. + //! @param thePlane [in] the face plane. + //! @param theArrowLength [in] the length of arrow. + //! @param theArrowAngle [in] the angle of arrow. + //! @param theSidePnt1 [out] the first side point. + //! @param theSidePnt2 [out] the second side point. + Standard_EXPORT void PointsForArrow (const gp_Pnt& thePeakPnt, + const gp_Dir& theDirection, + const gp_Dir& thePlane, + const Standard_Real theArrowLength, + const Standard_Real theArrowAngle, + gp_Pnt& theSidePnt1, + gp_Pnt& theSidePnt2); + + //! Compute point of text position for dimension parameters + //! for linear kinds of dimensions (length, radius, diameter). + Standard_EXPORT gp_Pnt GetTextPositionForLinear (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide = Standard_False) const; + + //! Fits text alignment relatively to the dimension line. + //! @param theFirstPoint [in] the first attachment point. + //! @param theSecondPoint [in] the second attachment point. + //! @param theIsOneSide [in] is the arrow displayed only on the one side of the dimension. + //! @param theHorizontalTextPos [in] the text horizontal position (alignment). + //! @param theLabelPosition [out] the label position, contains bits that defines + //! vertical and horizontal alignment. (for internal usage in count text position) + //! @param theIsArrowExternal [out] is the arrows external, + //! if arrow orientation in the dimension aspect is Prs3d_DAO_Fit, it fits arrow + //! orientation automatically. + Standard_EXPORT void FitTextAlignmentForLinear (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const Standard_Boolean theIsOneSide, + const Prs3d_DimensionTextHorizontalPosition& theHorizontalTextPos, + Standard_Integer& theLabelPosition, + Standard_Boolean& theIsArrowsExternal) const; + + //! Adjusts aspect parameters according the text position: + //! extension size, vertical text alignment and flyout. + //! @param theTextPos [in] the user defined 3d point of text position + //! @param theFirstPoint [in] the first point of linear measurement. + //! @param theSecondPoint [in] the second point of linear measurement. + //! @param theExtensionSize [out] the adjusted extension size + //! @param theAlignment [out] the horizontal label alignment. + //! @param theFlyout [out] the adjusted value of flyout. + //! @param thePlane [out] the new plane that contains theTextPos and attachment points. + //! @param theIsPlaneOld [out] shows if new plane is computed. + Standard_EXPORT Standard_Boolean AdjustParametersForLinear (const gp_Pnt& theTextPos, + const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + Standard_Real& theExtensionSize, + Prs3d_DimensionTextHorizontalPosition& theAlignment, + Standard_Real& theFlyout, + gp_Pln& thePlane, + Standard_Boolean& theIsPlaneOld) const; + +protected: //! @name Static auxilliary methods for geometry extraction + + //! If it is possible extracts circle from planar face. + //! @param theFace [in] the planar face + //! @param theCurve [out] the circular curve + //! @param theFirstPoint [out] the point of the first parameter of the circlular curve + //! @param theSecondPoint [out] the point of the last parameter of the circlular curve + //! @return TRUE in case of successful circle extraction + static Standard_Boolean CircleFromPlanarFace (const TopoDS_Face& theFace, + Handle(Geom_Curve)& theCurve, + gp_Pnt& theFirstPoint, + gp_Pnt& theLastPoint); + + //! If it is possible extracts circle from the edge. + //! @param theEdge [in] input edge to extract circle from + //! @param theCircle [out] circle + //! @param theFirstPoint [out] the point of the first parameter of the circlular curve + //! @param theSecondPoint [out] the point of the last parameter of the circlular curve + //! @return TRUE in case of successful circle extraction. + static Standard_Boolean CircleFromEdge (const TopoDS_Edge& theEdge, + gp_Circ& theCircle, + gp_Pnt& theFirstPoint, + gp_Pnt& theLastPoint); + +protected: //! @name Behavior to implement + + //! Override this method to check if user-defined plane + //! is valid for the dimension geometry. + //! @param thePlane [in] the working plane for positioning every + //! dimension in the application. + //! @return true is the plane is suitable for building dimension + //! with computed dimension geometry. + virtual Standard_Boolean CheckPlane (const gp_Pln& /*thePlane*/) const { return Standard_True; } + + //! Override this method to computed value of dimension. + //! @return value from the measured geometry. + virtual Standard_Real ComputeValue() const + { + return 0.0; + } + + //! Override this method to compute selection primitives for + //! flyout lines (if the dimension provides it). + //! This callback is a only a part of base selection + //! computation routine. + virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)&, + const Handle(SelectMgr_EntityOwner)&) {} + + + //! Base procedure of computing selection (based on selection geometry data). + //! @param theSelection [in] the selection structure to will with primitives. + //! @param theMode [in] the selection mode. + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, + const Standard_Integer theMode) Standard_OVERRIDE; + +protected: //! @name Selection geometry + + //! Selection geometry of dimension presentation. The structure is filled with data + //! during compute of presentation, then this data is used to generate selection + //! sensitives when computing selection. + struct SelectionGeometry + { + //! Arrows are represented by directed triangles. + struct Arrow + { + gp_Pnt Position; + gp_Dir Direction; + }; + typedef NCollection_Sequence Curve; + typedef NCollection_Handle HCurve; + typedef NCollection_Handle HArrow; + typedef NCollection_Sequence SeqOfCurves; + typedef NCollection_Sequence SeqOfArrows; + + gp_Pnt TextPos; //!< Center of text label. + gp_Dir TextDir; //!< Direction of text label. + Standard_Real TextWidth; //!< Width of text label. + Standard_Real TextHeight; //!< Height of text label. + SeqOfCurves DimensionLine; //!< Sequence of points for composing the segments of dimension line. + SeqOfArrows Arrows; //!< Sequence of arrow geometries. + Standard_Boolean IsComputed; //!< Shows if the selection geometry was filled. + + public: + + //! Clear geometry of sensitives for the specified compute mode. + //! @param theMode [in] the compute mode to clear. + void Clear (const Standard_Integer theMode) + { + if (theMode == ComputeMode_All || theMode == ComputeMode_Line) + { + DimensionLine.Clear(); + Arrows.Clear(); + } + + if (theMode == ComputeMode_All || theMode == ComputeMode_Text) + { + TextPos = gp::Origin(); + TextDir = gp::DX(); + TextWidth = 0.0; + TextHeight = 0.0; + } + + IsComputed = Standard_False; + } + + //! Add new curve entry and return the reference to populate it. + Curve& NewCurve() + { + DimensionLine.Append( new Curve ); + HCurve& aLastCurve = DimensionLine.ChangeLast(); + return *aLastCurve; + } + + //! Add new arrow entry and return the reference to populate it. + Arrow& NewArrow() + { + Arrows.Append( new Arrow ); + HArrow& aLastArrow = Arrows.ChangeLast(); + return *aLastArrow; + } + } mySelectionGeom; + + Standard_Real mySelToleranceForText2d; //!< Sensitive point tolerance for 2d text selection. + +protected: //! @name Value properties + + ValueType myValueType; //! type of value (computed or user-defined) + Standard_Real myCustomValue; //!< Value of the dimension (computed or user-defined). + + TCollection_ExtendedString myCustomStringValue; //!< Value of the dimension (computed or user-defined). + +protected: //! @name Fixed text position properties + + gp_Pnt myFixedTextPosition; //!< Stores text position fixed by user. + Standard_Boolean myIsTextPositionFixed; //!< Is the text label position fixed by user. + +protected: //! @name Units properties + + Standard_ExtCharacter mySpecialSymbol; //!< Special symbol. + PrsDim_DisplaySpecialSymbol myDisplaySpecialSymbol; //!< Special symbol display options. + +protected: //! @name Geometrical properties + + GeometryType myGeometryType; //!< defines type of shapes on which the dimension is to be built. + + gp_Pln myPlane; //!< Plane where dimension will be built (computed or user defined). + Standard_Boolean myIsPlaneCustom; //!< Is plane defined by user (otherwise it will be computed automatically). + Standard_Real myFlyout; //!< Flyout distance. + Standard_Boolean myIsGeometryValid; //!< Is dimension geometry properly defined. + +private: + + PrsDim_KindOfDimension myKindOfDimension; +}; + +#endif // _PrsDim_Dimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DimensionOwner.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DimensionOwner.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DimensionOwner.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DimensionOwner.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,97 @@ +// Created on: 1996-12-05 +// Created by: Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_DimensionOwner, SelectMgr_EntityOwner) + +namespace +{ + //======================================================================= + //function : HighlightMode + //purpose : Return corresponding compute mode for selection type. + //======================================================================= + static PrsDim_Dimension::ComputeMode HighlightMode (const Standard_Integer theSelMode) + { + switch (theSelMode) + { + case PrsDim_DimensionSelectionMode_Line: return PrsDim_Dimension::ComputeMode_Line; + case PrsDim_DimensionSelectionMode_Text: return PrsDim_Dimension::ComputeMode_Text; + default: + return PrsDim_Dimension::ComputeMode_All; + } + } +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_DimensionOwner::PrsDim_DimensionOwner (const Handle(SelectMgr_SelectableObject)& theSelObject, + const PrsDim_DimensionSelectionMode theMode, + const Standard_Integer thePriority) +: SelectMgr_EntityOwner(theSelObject, thePriority), + mySelectionMode (theMode) +{ +} + +//======================================================================= +//function : IsHilighted +//purpose : +//======================================================================= +Standard_Boolean PrsDim_DimensionOwner::IsHilighted (const Handle(PrsMgr_PresentationManager)& thePM, + const Standard_Integer /*theMode*/) const +{ + if (!HasSelectable()) + { + return Standard_False; + } + + return thePM->IsHighlighted (Selectable(), HighlightMode (mySelectionMode)); +} + +//======================================================================= +//function : Unhilight +//purpose : +//======================================================================= +void PrsDim_DimensionOwner::Unhilight (const Handle(PrsMgr_PresentationManager)& thePM, + const Standard_Integer /*theMode*/) +{ + if (!HasSelectable()) + { + return; + } + + thePM->Unhighlight (Selectable()); +} + +//======================================================================= +//function : HilightWithColor +//purpose : +//======================================================================= +void PrsDim_DimensionOwner::HilightWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, + const Handle(Prs3d_Drawer)& theStyle, + const Standard_Integer /*theMode*/) +{ + thePM->Color (Selectable(), theStyle, HighlightMode (mySelectionMode)); +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DimensionOwner.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DimensionOwner.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DimensionOwner.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DimensionOwner.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,74 @@ +// Created on: 1996-12-05 +// Created by: Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_DimensionOwner_HeaderFile +#define _PrsDim_DimensionOwner_HeaderFile + +#include +#include + +#include +#include +#include +#include +#include +#include + +class SelectMgr_SelectableObject; +class PrsMgr_PresentationManager; + +DEFINE_STANDARD_HANDLE(PrsDim_DimensionOwner, SelectMgr_EntityOwner) + +//! The owner is the entity which makes it possible to link +//! the sensitive primitives and the reference shapes that +//! you want to detect. It stocks the various pieces of +//! information which make it possible to find objects. An +//! owner has a priority which you can modulate, so as to +//! make one entity more selectable than another. You +//! might want to make edges more selectable than +//! faces, for example. In that case, you could attribute sa +//! higher priority to the one compared to the other. An +//! edge, could have priority 5, for example, and a face, +//! priority 4. The default priority is 5. +class PrsDim_DimensionOwner : public SelectMgr_EntityOwner +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_DimensionOwner, SelectMgr_EntityOwner) +public: + + //! Initializes the dimension owner, theSO, and attributes it + //! the priority, thePriority. + Standard_EXPORT PrsDim_DimensionOwner(const Handle(SelectMgr_SelectableObject)& theSelObject, const PrsDim_DimensionSelectionMode theSelMode, const Standard_Integer thePriority = 0); + + PrsDim_DimensionSelectionMode SelectionMode() const { return mySelectionMode; } + + Standard_EXPORT virtual void HilightWithColor (const Handle(PrsMgr_PresentationManager3d)& thePM, + const Handle(Prs3d_Drawer)& theStyle, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + + //! Returns true if an object with the selection mode + //! aMode is highlighted in the presentation manager aPM. + Standard_EXPORT virtual Standard_Boolean IsHilighted (const Handle(PrsMgr_PresentationManager)& thePM, const Standard_Integer theMode = 0) const Standard_OVERRIDE; + + //! Removes highlighting from the selected part of dimension. + Standard_EXPORT virtual void Unhilight (const Handle(PrsMgr_PresentationManager)& thePM, const Standard_Integer theMode = 0) Standard_OVERRIDE; + +private: + + PrsDim_DimensionSelectionMode mySelectionMode; + +}; + +#endif // _AIS_DimensionOwner_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DimensionSelectionMode.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DimensionSelectionMode.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DimensionSelectionMode.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DimensionSelectionMode.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,28 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_DimensionSelectionMode_HeaderFile +#define _PrsDim_DimensionSelectionMode_HeaderFile + +//! Specifies dimension selection modes. +enum PrsDim_DimensionSelectionMode +{ + PrsDim_DimensionSelectionMode_All, + PrsDim_DimensionSelectionMode_Line, + PrsDim_DimensionSelectionMode_Text +}; + +#endif // _PrsDim_DimensionSelectionMode_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DisplaySpecialSymbol.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DisplaySpecialSymbol.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_DisplaySpecialSymbol.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_DisplaySpecialSymbol.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,28 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_DisplaySpecialSymbol_HeaderFile +#define _PrsDim_DisplaySpecialSymbol_HeaderFile + +//! Specifies dimension special symbol display options +enum PrsDim_DisplaySpecialSymbol +{ + PrsDim_DisplaySpecialSymbol_No, + PrsDim_DisplaySpecialSymbol_Before, + PrsDim_DisplaySpecialSymbol_After +}; + +#endif // _PrsDim_DisplaySpecialSymbol_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_EllipseRadiusDimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_EllipseRadiusDimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_EllipseRadiusDimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_EllipseRadiusDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,273 @@ +// Created on: 1998-01-22 +// Created by: Sergey ZARITCHNY +// Copyright (c) 1998-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_EllipseRadiusDimension, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_EllipseRadiusDimension +//purpose : +//======================================================================= +PrsDim_EllipseRadiusDimension::PrsDim_EllipseRadiusDimension(const TopoDS_Shape& aShape, + const TCollection_ExtendedString& aText) +:PrsDim_Relation() +{ + myFShape = aShape; + myText = aText; +// ComputeGeometry( ); +} + +//======================================================================= +//function : ComputeGeometry +//purpose : +//======================================================================= + +void PrsDim_EllipseRadiusDimension::ComputeGeometry() +{ + + switch (myFShape.ShapeType()) { + case TopAbs_FACE : + { + // compute one face case + ComputeFaceGeometry (); + break; + } + case TopAbs_EDGE: + { + ComputeEdgeGeometry (); + break; + } + default: + break; + } + while (myFirstPar > 2*M_PI) myFirstPar -= 2*M_PI; + while (myLastPar > 2*M_PI) myLastPar -= 2*M_PI; + while (myFirstPar < 0.0) myFirstPar += 2*M_PI; + while (myLastPar < 0.0) myLastPar += 2*M_PI; +} + +//======================================================================= +//function : ComputeFaceGeometry +//purpose : +//======================================================================= + +void PrsDim_EllipseRadiusDimension::ComputeFaceGeometry() +{ + + gp_Pln aPln; + Handle( Geom_Surface ) aBasisSurf; + PrsDim_KindOfSurface aSurfType; + Standard_Real Offset; + PrsDim::GetPlaneFromFace( TopoDS::Face( myFShape), + aPln, + aBasisSurf, + aSurfType, + Offset ) ; + + if ( aSurfType == PrsDim_KOS_Plane ) + ComputePlanarFaceGeometry( ); + else + ComputeCylFaceGeometry( aSurfType, aBasisSurf, Offset ); + +} + +//======================================================================= +//function : ComputeCylFaceGeometry +//purpose : defines Ellipse and plane of dimension +//======================================================================= + +void PrsDim_EllipseRadiusDimension::ComputeCylFaceGeometry(const PrsDim_KindOfSurface aSurfType, + const Handle( Geom_Surface )& aBasisSurf, + const Standard_Real Offset) +{ + + BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); + Standard_Real vFirst, vLast; + vFirst = surf1.FirstVParameter(); + vLast = surf1.LastVParameter(); + Standard_Real vMid = (vFirst + vLast)*0.5; + gp_Pln aPlane; + gp_Ax1 Axis; +// Standard_Real Param; + if (aSurfType == PrsDim_KOS_Extrusion) + { + Axis.SetDirection((Handle( Geom_SurfaceOfLinearExtrusion )::DownCast( aBasisSurf )) + ->Direction() ); + Axis.SetLocation( gp_Pnt((Handle( Geom_SurfaceOfLinearExtrusion )::DownCast( aBasisSurf )) + ->Direction().XYZ() ) ); + + aPlane.SetAxis(Axis); + aPlane.SetLocation(myEllipse.Location()); + myPlane = new Geom_Plane(aPlane); + + Handle(Geom_Curve) aCurve; + aCurve = aBasisSurf->VIso(vMid); + if (aCurve->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) + { + myEllipse = Handle(Geom_Ellipse)::DownCast(aCurve)-> Elips();//gp_Elips + myIsAnArc = Standard_False; + } + else if (aCurve->DynamicType() == STANDARD_TYPE(Geom_TrimmedCurve)) { + Handle(Geom_TrimmedCurve) tCurve = Handle(Geom_TrimmedCurve)::DownCast(aCurve); + aCurve = tCurve->BasisCurve(); + myFirstPar = tCurve->FirstParameter(); + myLastPar = tCurve->LastParameter(); + myIsAnArc = Standard_True; + if (aCurve->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) + { + myEllipse = Handle(Geom_Ellipse)::DownCast(aCurve)->Elips();//gp_Elips + } + } + else + { + throw Standard_ConstructionError("PrsDim:: Not expected type of surface") ; + return; + } + +// Offset + + if(surf1.GetType() == GeomAbs_OffsetSurface) + { + if(Offset <0.0 && Abs(Offset) > myEllipse.MinorRadius ()) + { + throw Standard_ConstructionError("PrsDim:: Absolute value of negative offset is larger than MinorRadius"); + return; + } + + myOffsetCurve = new Geom_OffsetCurve(new Geom_Ellipse(myEllipse), Offset, + myPlane->Pln().Axis().Direction()); + myOffset = Offset; + myIsOffset = Standard_True; + gp_Elips elips = myEllipse; + Standard_Real Val = Offset + elips.MajorRadius ();//simulation + myEllipse.SetMajorRadius (Val); + Val = Offset + elips.MinorRadius (); + myEllipse.SetMinorRadius (Val); + } + else + myIsOffset = Standard_False; + } +} + + +//======================================================================= +//function : ComputePlanarFaceGeometry +//purpose : +//======================================================================= + +void PrsDim_EllipseRadiusDimension::ComputePlanarFaceGeometry() +{ + + Standard_Boolean find = Standard_False; + gp_Pnt ptfirst,ptend; + TopExp_Explorer ExploEd( TopoDS::Face(myFShape), TopAbs_EDGE ); + for ( ; ExploEd.More(); ExploEd.Next()) + { + TopoDS_Edge curedge = TopoDS::Edge( ExploEd.Current() ); + Handle(Geom_Curve) curv; + Handle(Geom_Ellipse) ellips; + if (PrsDim::ComputeGeometry(curedge,curv,ptfirst,ptend)) + { + if (curv->DynamicType() == STANDARD_TYPE(Geom_Ellipse)) + { + ellips = Handle(Geom_Ellipse)::DownCast(curv); + if ( !ellips.IsNull() ) { + myEllipse = ellips->Elips(); + find = Standard_True; + break; + } + } + } + } + if( !find ) + { + throw Standard_ConstructionError("PrsDim:: Curve is not an ellipsee or is Null") ; + return; + } + + if ( !ptfirst.IsEqual(ptend, Precision::Confusion()) ) + { + myIsAnArc = Standard_True; + myFirstPar = ElCLib::Parameter(myEllipse, ptfirst); + myLastPar = ElCLib::Parameter(myEllipse, ptend); + } + else + myIsAnArc = Standard_False; + + BRepAdaptor_Surface surfAlgo (TopoDS::Face(myFShape)); + myPlane = new Geom_Plane( surfAlgo.Plane() ); + +} + +//======================================================================= +//function : ComputeEdgeGeometry +//purpose : +//======================================================================= + +void PrsDim_EllipseRadiusDimension::ComputeEdgeGeometry() +{ + gp_Pnt ptfirst,ptend; + Handle(Geom_Curve) curv; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myFShape),curv,ptfirst,ptend)) return; + + Handle(Geom_Ellipse) elips = Handle(Geom_Ellipse)::DownCast(curv); + if ( elips.IsNull()) return; + + myEllipse = elips->Elips(); + gp_Pln aPlane; + aPlane.SetPosition(gp_Ax3(myEllipse.Position())); + myPlane = new Geom_Plane(aPlane); + + + if ( ptfirst.IsEqual(ptend, Precision::Confusion()) ) { + myIsAnArc = Standard_False; + } + else { + myIsAnArc = Standard_True; + myFirstPar = ElCLib::Parameter(myEllipse, ptfirst); + myLastPar = ElCLib::Parameter(myEllipse, ptend); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_EllipseRadiusDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_EllipseRadiusDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_EllipseRadiusDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_EllipseRadiusDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,71 @@ +// Created on: 1998-01-22 +// Created by: Sergey ZARITCHNY +// Copyright (c) 1998-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_EllipseRadiusDimension_HeaderFile +#define _PrsDim_EllipseRadiusDimension_HeaderFile + +#include +#include +#include + +class Geom_OffsetCurve; +class TopoDS_Shape; +class TCollection_ExtendedString; +class Geom_Surface; + +DEFINE_STANDARD_HANDLE(PrsDim_EllipseRadiusDimension, PrsDim_Relation) + +//! Computes geometry ( basis curve and plane of dimension) +//! for input shape aShape from TopoDS +//! Root class for MinRadiusDimension and MaxRadiusDimension +class PrsDim_EllipseRadiusDimension : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_EllipseRadiusDimension, PrsDim_Relation) +public: + + virtual PrsDim_KindOfDimension KindOfDimension() const Standard_OVERRIDE { return PrsDim_KOD_ELLIPSERADIUS; } + + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + + Standard_EXPORT void ComputeGeometry(); + +protected: + + Standard_EXPORT PrsDim_EllipseRadiusDimension(const TopoDS_Shape& aShape, const TCollection_ExtendedString& aText); + +protected: + + gp_Elips myEllipse; + Standard_Real myFirstPar; + Standard_Real myLastPar; + Standard_Boolean myIsAnArc; + Handle(Geom_OffsetCurve) myOffsetCurve; + Standard_Real myOffset; + Standard_Boolean myIsOffset; + +private: + + Standard_EXPORT void ComputeFaceGeometry(); + + Standard_EXPORT void ComputeCylFaceGeometry (const PrsDim_KindOfSurface aSurfType, const Handle(Geom_Surface)& aSurf, const Standard_Real Offset); + + Standard_EXPORT void ComputePlanarFaceGeometry(); + + Standard_EXPORT void ComputeEdgeGeometry(); + +}; + +#endif // _PrsDim_EllipseRadiusDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_EqualDistanceRelation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_EqualDistanceRelation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_EqualDistanceRelation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_EqualDistanceRelation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,795 @@ +// Created on: 1998-01-24 +// Created by: Julia GERASIMOVA +// Copyright (c) 1998-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_EqualDistanceRelation, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_EqualDistanceRelation +//purpose : +//======================================================================= +PrsDim_EqualDistanceRelation::PrsDim_EqualDistanceRelation( const TopoDS_Shape& aShape1, + const TopoDS_Shape& aShape2, + const TopoDS_Shape& aShape3, + const TopoDS_Shape& aShape4, + const Handle( Geom_Plane )& aPlane ) +: PrsDim_Relation() +{ + myFShape = aShape1; + mySShape = aShape2; + myShape3 = aShape3; + myShape4 = aShape4; + myPlane = aPlane; + + //Temporary + myArrowSize = 3.0; //set the concrete value + mySymbolPrs = DsgPrs_AS_BOTHAR; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_EqualDistanceRelation::Compute( const Handle( PrsMgr_PresentationManager3d )&, + const Handle( Prs3d_Presentation )& aPresentation, + const Standard_Integer ) +{ + gp_Pnt Position12 = myPosition, Position34 = myPosition; + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); +// -- ota -- begin + if (!myAutomaticPosition ){ + gp_Pnt aMiddle12 ((myPoint1.XYZ() + myPoint2.XYZ())*0.5); + gp_Pnt aMiddle34 ((myPoint3.XYZ() + myPoint4.XYZ())*0.5); + + if (myPosition.Distance(aMiddle12) > myPosition.Distance(aMiddle34)) + Position12.SetXYZ((myPoint1.XYZ() + myPoint2.XYZ())*0.5); + else + Position34.SetXYZ((myPoint3.XYZ() + myPoint4.XYZ())*0.5); + + } + + if (myFShape.ShapeType() == TopAbs_EDGE && mySShape.ShapeType() == TopAbs_EDGE) + PrsDim_EqualDistanceRelation::ComputeTwoEdgesLength(aPresentation, + myDrawer, + myArrowSize, + TopoDS::Edge(myFShape), + TopoDS::Edge(mySShape), + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + Position12, + myAttachPoint1, + myAttachPoint2, + myPoint1, + myPoint2, + mySymbolPrs ); + + + else if (myFShape.ShapeType() == TopAbs_VERTEX && mySShape.ShapeType() == TopAbs_VERTEX) + PrsDim_EqualDistanceRelation::ComputeTwoVerticesLength( aPresentation, + myDrawer, + myArrowSize, + TopoDS::Vertex(myFShape), + TopoDS::Vertex(mySShape), + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + PrsDim_TypeOfDist_Unknown, + Position12, + myAttachPoint1, + myAttachPoint2, + myPoint1, + myPoint2, + mySymbolPrs ); + else + PrsDim_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( aPresentation, + myDrawer, + myArrowSize, + myFShape, + mySShape, + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + Position12, + myAttachPoint1, + myAttachPoint2, + myPoint1, + myPoint2, + mySymbolPrs ); + + if (myShape3.ShapeType() == TopAbs_EDGE && myShape4.ShapeType() == TopAbs_EDGE) + PrsDim_EqualDistanceRelation::ComputeTwoEdgesLength(aPresentation, + myDrawer, + myArrowSize, + TopoDS::Edge(myShape3), + TopoDS::Edge(myShape4), + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + Position34, + myAttachPoint3, + myAttachPoint4, + myPoint3, + myPoint4, + mySymbolPrs ); + + else if (myShape3.ShapeType() == TopAbs_VERTEX && myShape4.ShapeType() == TopAbs_VERTEX) + PrsDim_EqualDistanceRelation::ComputeTwoVerticesLength( aPresentation, + myDrawer, + myArrowSize, + TopoDS::Vertex(myShape3), + TopoDS::Vertex(myShape4), + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + PrsDim_TypeOfDist_Unknown, + Position34, + myAttachPoint3, + myAttachPoint4, + myPoint3, + myPoint4, + mySymbolPrs ); + + else + PrsDim_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( aPresentation, + myDrawer, + myArrowSize, + myShape3, + myShape4, + myPlane, + myAutomaticPosition, + myIsSetBndBox, + myBndBox, + Position34, + myAttachPoint3, + myAttachPoint4, + myPoint3, + myPoint4, + mySymbolPrs ); + + DsgPrs_EqualDistancePresentation::Add( aPresentation, myDrawer, + myPoint1, myPoint2, myPoint3, myPoint4, myPlane ); +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_EqualDistanceRelation::ComputeSelection( const Handle( SelectMgr_Selection )& aSelection, + const Standard_Integer ) +{ + Handle( SelectMgr_EntityOwner ) own = new SelectMgr_EntityOwner( this, 7 ); + Handle( Select3D_SensitiveSegment ) seg; + + seg = new Select3D_SensitiveSegment( own, myPoint1, myPoint2 ); + aSelection->Add( seg ); + + seg = new Select3D_SensitiveSegment( own, myPoint3, myPoint4 ); + aSelection->Add( seg ); + + // Line between two middles + gp_Pnt Middle12( (myPoint1.XYZ() + myPoint2.XYZ()) * 0.5 ), + Middle34( (myPoint3.XYZ() + myPoint4.XYZ()) *0.5 ); + seg = new Select3D_SensitiveSegment( own, Middle12, Middle34 ); + aSelection->Add( seg ); + + gp_Pnt Middle((Middle12.XYZ() + Middle34.XYZ())*0.5); + Standard_Real SmallDist = .001; + Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, + Middle.X() - SmallDist, + Middle.Y() - SmallDist, + Middle.Z() - SmallDist, + Middle.X() + SmallDist, + Middle.Y() + SmallDist, + Middle.Z() + SmallDist ); + aSelection->Add(box); + + if (myFShape.ShapeType() == TopAbs_EDGE){ + BRepAdaptor_Curve aCurve(TopoDS::Edge(myFShape)); + if (aCurve.GetType() == GeomAbs_Line){ + //add sensetive element - line + seg = new Select3D_SensitiveSegment( own, myAttachPoint1, myPoint1); + aSelection->Add( seg ); + } + else if (aCurve.GetType() == GeomAbs_Circle){ + Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); + Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint1), + LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint1); + if (LastPar < FirstPar ) LastPar+=M_PI*2; + Handle(Select3D_SensitiveCircle) circ = new Select3D_SensitiveCircle (own, aCircle->Circ(), FirstPar, LastPar); + aSelection->Add( circ ); + } + } + else { + seg = new Select3D_SensitiveSegment( own, myAttachPoint1, myPoint1); + aSelection->Add( seg ); + } + + if (mySShape.ShapeType() == TopAbs_EDGE){ + BRepAdaptor_Curve aCurve(TopoDS::Edge(mySShape)); + if (aCurve.GetType() == GeomAbs_Line) { + //add sensetive element - line + seg = new Select3D_SensitiveSegment( own, myAttachPoint2, myPoint2); + aSelection->Add( seg ); + } + else if (aCurve.GetType() == GeomAbs_Circle){ + Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); + Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint2), + LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint2); + if (LastPar < FirstPar ) LastPar+=M_PI*2; + Handle(Select3D_SensitiveCircle) circ = new Select3D_SensitiveCircle (own, aCircle->Circ(), FirstPar, LastPar); + aSelection->Add( circ ); + } + } + else { + seg = new Select3D_SensitiveSegment( own, myAttachPoint2, myPoint2); + aSelection->Add( seg ); + } + + if (myShape3.ShapeType() == TopAbs_EDGE){ + BRepAdaptor_Curve aCurve(TopoDS::Edge(myShape3)); + if (aCurve.GetType() == GeomAbs_Line) { + //add sensetive element - line + seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); + aSelection->Add( seg ); + } + else if (aCurve.GetType() == GeomAbs_Circle){ + Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); + Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint3), + LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint3); + if (LastPar < FirstPar ) LastPar+=M_PI*2; + Handle(Select3D_SensitiveCircle) circ = new Select3D_SensitiveCircle (own, aCircle->Circ(), FirstPar, LastPar); + aSelection->Add( circ ); + } + else { + seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); + aSelection->Add( seg ); + } + } + else { + seg = new Select3D_SensitiveSegment( own, myAttachPoint3, myPoint3); + aSelection->Add( seg ); + } + + if (myShape4.ShapeType() == TopAbs_EDGE){ + BRepAdaptor_Curve aCurve(TopoDS::Edge(myShape4)); + if (aCurve.GetType() == GeomAbs_Line) { + //add sensetive element - line + seg = new Select3D_SensitiveSegment( own, myAttachPoint4, myPoint4); + aSelection->Add( seg ); + } + else if (aCurve.GetType() == GeomAbs_Circle){ + Handle(Geom_Circle) aCircle = Handle(Geom_Circle)::DownCast(aCurve.Curve().Curve()); + Standard_Real FirstPar = ElCLib::Parameter(aCircle->Circ(), myAttachPoint4), + LastPar = ElCLib::Parameter(aCircle->Circ(), myPoint4); + if (LastPar < FirstPar ) LastPar+=M_PI*2; + Handle(Select3D_SensitiveCircle) circ = new Select3D_SensitiveCircle (own, aCircle->Circ(), FirstPar, LastPar); + aSelection->Add( circ ); + } + } + else { + seg = new Select3D_SensitiveSegment( own, myAttachPoint4, myPoint4); + aSelection->Add( seg ); + } +} + +//======================================================================= +//function : ComputeTwoEdgesLength +//purpose : +//======================================================================= +void PrsDim_EqualDistanceRelation::ComputeTwoEdgesLength( const Handle( Prs3d_Presentation )& aPresentation, + const Handle( Prs3d_Drawer )& aDrawer, + const Standard_Real ArrowSize, + const TopoDS_Edge & FirstEdge, + const TopoDS_Edge & SecondEdge, + const Handle( Geom_Plane )& Plane, + const Standard_Boolean AutomaticPos, + const Standard_Boolean IsSetBndBox, + const Bnd_Box & BndBox, + gp_Pnt& Position, + gp_Pnt& FirstAttach, + gp_Pnt& SecondAttach, + gp_Pnt& FirstExtreme, + gp_Pnt& SecondExtreme, + DsgPrs_ArrowSide & SymbolPrs ) +{ + gp_Dir DirAttach; + BRepAdaptor_Curve cu1( FirstEdge ); + BRepAdaptor_Curve cu2( SecondEdge ); + + // 3d lines + Handle(Geom_Curve) geom1,geom2; + gp_Pnt ptat11,ptat12,ptat21,ptat22; + + Standard_Boolean isInfinite1(Standard_False),isInfinite2(Standard_False); + Handle(Geom_Curve) extCurv; + Standard_Real arrsize = ArrowSize;// size + Standard_Real Val=0.; + Standard_Boolean isInPlane1, isInPlane2; + + if(!PrsDim::ComputeGeometry(FirstEdge,geom1, ptat11, ptat12,extCurv,isInfinite1,isInPlane1, Plane )) + return; + if(!PrsDim::ComputeGeometry(SecondEdge, geom2, ptat21, ptat22, extCurv, isInfinite2,isInPlane2, Plane)) + return; + + aPresentation->SetInfiniteState(isInfinite1 || isInfinite2); + + if (cu1.GetType() == GeomAbs_Line && cu2.GetType() == GeomAbs_Line) + { + Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); + Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); + const gp_Lin& l1 = geom_lin1->Lin(); + const gp_Lin& l2 = geom_lin2->Lin(); + + //Get Val value + Val = l1.Distance( l2 ); + + DirAttach = l1.Direction(); + + if (AutomaticPos) { + // compute position of offset point + gp_Pnt curpos; + Standard_Real par1=0., par2=0.; + if(!(isInfinite1 || isInfinite2)) + { + par1 = ElCLib::Parameter(l1,ptat11); + par2 = ElCLib::Parameter(l1,ptat21); + if (par1 Pln() ); + } + + // find attach points + if (!isInfinite1) { + if (Position.Distance(ptat11) > Position.Distance(ptat12)) FirstAttach = ptat12; + else FirstAttach = ptat11; + } + else { + FirstAttach = ElCLib::Value(ElCLib::Parameter(l1,Position),l1); + } + + if (!isInfinite2) { + if (Position.Distance(ptat21) > Position.Distance(ptat22)) SecondAttach = ptat22; + else SecondAttach = ptat21; + } + else { + SecondAttach = ElCLib::Value(ElCLib::Parameter(l2,Position),l2); + } + + Standard_Real confusion(Precision::Confusion()); + if (arrsize < confusion) arrsize = Val*0.1; + if (Abs(Val) <= confusion) {arrsize = 0.;} + + Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(arrsize); + arr = la->ArrowAspect(); + arr->SetLength(arrsize); + + if (AutomaticPos && IsSetBndBox) + Position = PrsDim::TranslatePointToBound( Position, DirAttach, BndBox ); + + DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, + aDrawer, + FirstAttach, + SecondAttach, + DirAttach, + Position, + SymbolPrs, + FirstExtreme, + SecondExtreme); + + +} + if (cu1.GetType() == GeomAbs_Circle && cu2.GetType() == GeomAbs_Circle){ + //Get first and last points of circles + Handle(Geom_Circle) aCir1 (Handle(Geom_Circle)::DownCast(geom1)); + Handle(Geom_Circle) aCir2 (Handle(Geom_Circle)::DownCast(geom2)); + gp_Circ aCirc1 = aCir1->Circ(); + gp_Circ aCirc2 = aCir2->Circ(); + + //To avoid circles with different orientaion + Standard_Real aTol = Precision::Confusion(); + if(aCirc2.Axis().IsOpposite(aCirc1.Axis(), aTol) || + aCirc2.XAxis().IsOpposite(aCirc1.XAxis(), aTol) || + aCirc2.YAxis().IsOpposite(aCirc1.YAxis(), aTol) ) + { + aCirc2.SetPosition(aCirc1.Position()); + aCirc2.SetAxis(aCirc1.Axis()); + } + + if (AutomaticPos){ + Standard_Real par1 = 0, par2 = 0; + gp_Pln aPln = Plane->Pln(); + //Project ptat12 and ptat22 on constraint plane + gp_Pnt PrPnt12 = PrsDim::ProjectPointOnPlane(ptat12, aPln); + gp_Pnt PrPnt22 = PrsDim::ProjectPointOnPlane(ptat22, aPln); + //Project circles center on constraint plane + gp_Pnt PrCenter = PrsDim::ProjectPointOnPlane(aCirc1.Location(), aPln); + + gp_Dir XDir = aPln.XAxis().Direction(); + gp_Dir YDir = aPln.YAxis().Direction(); + + + if (PrPnt12.Distance(PrCenter) >Precision::Confusion()) + { + gp_Dir aDir1(PrPnt12.XYZ() - PrCenter.XYZ()); + Standard_Real anAngle = aDir1.Angle(XDir); //Get the angle in range [0, M_PI] + if (aDir1.Dot(YDir) < 0) + anAngle = 2 * M_PI - anAngle; + par1 = anAngle; + } + + if (PrPnt22.Distance(PrCenter) >Precision::Confusion()) + { + gp_Dir aDir2(PrPnt22.XYZ() - PrCenter.XYZ()); + Standard_Real anAngle = aDir2.Angle(XDir); //Get the angle in range [0, M_PI] + if (aDir2.Dot(YDir) < 0) + anAngle = 2 * M_PI - anAngle; + par2 = anAngle; + } + + + if(par1 > par2 ){ + FirstExtreme = ptat12; + Standard_Real aPar1 = ElCLib::Parameter(aCirc2, ptat12); + SecondExtreme = ElCLib::Value(aPar1, aCirc2); + } + else { + Standard_Real aPar2 = ElCLib::Parameter(aCirc1, ptat22); + FirstExtreme = ElCLib::Value(aPar2, aCirc1); + SecondExtreme = ptat22; + } + } + else { + Standard_Real pospar = ElCLib::Parameter(aCirc1, Position); + FirstExtreme = ElCLib::Value(pospar, aCirc1); + pospar = ElCLib::Parameter(aCirc2, Position); + SecondExtreme = ElCLib::Value(pospar, aCirc2); + } + + DsgPrs_EqualDistancePresentation::AddIntervalBetweenTwoArcs(aPresentation, + aDrawer, + aCirc1, + aCirc2, + ptat12, + FirstExtreme, + ptat22, + SecondExtreme, + SymbolPrs); + + FirstAttach = ptat12; SecondAttach = ptat22; //assign attach points + Position.SetXYZ( (FirstAttach.XYZ() + SecondAttach.XYZ())*0.5); + } + + if (arrsize < Precision::Confusion()) arrsize = Val*0.1; + if (Abs(Val) <= Precision::Confusion()) {arrsize = 0.;} + +// gp_Pnt pf, pl; + if (!isInPlane1) { + PrsDim::ComputeProjEdgePresentation( aPresentation, aDrawer, FirstEdge, geom1, ptat11, ptat12); + } + if(!isInPlane2) { + PrsDim::ComputeProjEdgePresentation( aPresentation, aDrawer, SecondEdge, geom2, ptat21, ptat22); + } +} + +//======================================================================= +//function : ComputeTwoVerticesLength +//purpose : +//======================================================================= + +void PrsDim_EqualDistanceRelation::ComputeTwoVerticesLength( const Handle( Prs3d_Presentation )& aPresentation, + const Handle( Prs3d_Drawer )& aDrawer, + const Standard_Real ArrowSize, + const TopoDS_Vertex& FirstVertex, + const TopoDS_Vertex& SecondVertex, + const Handle( Geom_Plane )& Plane, + const Standard_Boolean AutomaticPos, + const Standard_Boolean IsSetBndBox, + const Bnd_Box& BndBox, + const PrsDim_TypeOfDist TypeDist, + gp_Pnt& Position, + gp_Pnt& FirstAttach, + gp_Pnt& SecondAttach, + gp_Pnt& FirstExtreme, + gp_Pnt& SecondExtreme, + DsgPrs_ArrowSide& SymbolPrs ) +{ + Standard_Boolean isOnPlane1, isOnPlane2; + gp_Dir DirAttach; + PrsDim::ComputeGeometry( FirstVertex, FirstAttach, Plane, isOnPlane1); + PrsDim::ComputeGeometry( SecondVertex, SecondAttach, Plane, isOnPlane2); + + Standard_Real confusion(Precision::Confusion()); + Standard_Boolean samePoint(FirstAttach.IsEqual(SecondAttach,confusion)); + + if (TypeDist == PrsDim_TypeOfDist_Vertical) DirAttach = Plane->Pln().XAxis().Direction(); + else if (TypeDist == PrsDim_TypeOfDist_Horizontal) DirAttach = Plane->Pln().YAxis().Direction(); + else { + if (!samePoint) { + DirAttach.SetXYZ(SecondAttach.XYZ() - FirstAttach.XYZ()); + DirAttach.Rotate(Plane->Pln().Axis(),M_PI/2.); + } + } + + // size + if (AutomaticPos) { + if (!samePoint) { + gp_Pnt curpos((FirstAttach.XYZ()+SecondAttach.XYZ())*0.5); + // make offset of curpos + gp_Vec offset(DirAttach); + offset = offset*ArrowSize*(-10.); + curpos.Translate(offset); + Position = curpos; + } + else { + gp_Dir aDir = Plane->Pln().Axis().Direction(); + gp_Vec aVec (aDir.XYZ()*10*ArrowSize); + //Position = gp_Pnt(FirstAttach.XYZ()+gp_XYZ(1.,1.,1.)); // not correct + Position = FirstAttach.Translated(aVec); + Position = PrsDim::ProjectPointOnPlane( Position, Plane->Pln() );//not needed really + DirAttach.SetXYZ(Position.XYZ() - FirstAttach.XYZ()); + } + } + else { + Position = PrsDim::ProjectPointOnPlane( Position, Plane->Pln() ); + } + + + Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(ArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(ArrowSize); + + if (AutomaticPos && IsSetBndBox) + Position = PrsDim::TranslatePointToBound( Position, DirAttach, BndBox ); + + DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, + aDrawer, + FirstAttach, + SecondAttach, + DirAttach, + Position, + SymbolPrs, + FirstExtreme, //returned + SecondExtreme); //returned + + // Compute projection + if ( !isOnPlane1) + PrsDim::ComputeProjVertexPresentation(aPresentation, aDrawer, FirstVertex, FirstAttach); + if ( !isOnPlane2) + PrsDim::ComputeProjVertexPresentation(aPresentation, aDrawer, SecondVertex, SecondAttach); + +} + + +//======================================================================= +//function : ComputeOneEdgeOneVertexLength +//purpose : +//======================================================================= + +void PrsDim_EqualDistanceRelation::ComputeOneEdgeOneVertexLength( const Handle( Prs3d_Presentation )& aPresentation, + const Handle( Prs3d_Drawer )& aDrawer, + const Standard_Real ArrowSize, + const TopoDS_Shape & FirstShape, + const TopoDS_Shape & SecondShape, + const Handle( Geom_Plane )& Plane, + const Standard_Boolean AutomaticPos, + const Standard_Boolean IsSetBndBox, + const Bnd_Box & BndBox, + gp_Pnt & Position, + gp_Pnt & FirstAttach, + gp_Pnt & SecondAttach, + gp_Pnt& FirstExtreme, + gp_Pnt& SecondExtreme, + DsgPrs_ArrowSide & SymbolPrs ) +{ + TopoDS_Vertex thevertex; + TopoDS_Edge theedge; + + gp_Pnt ptonedge1,ptonedge2; + Handle(Geom_Curve) aCurve; + Handle(Geom_Curve) extCurv; + Standard_Boolean isInfinite; + Standard_Real Val; + Standard_Boolean isOnPlanEdge, isOnPlanVertex; + Standard_Integer edgenum ; + + if (FirstShape.ShapeType() == TopAbs_VERTEX) { + thevertex = TopoDS::Vertex(FirstShape); + theedge = TopoDS::Edge(SecondShape); + edgenum = 2; //edge is the second shape + } + else { + thevertex = TopoDS::Vertex(SecondShape); + theedge = TopoDS::Edge(FirstShape); + edgenum = 1;//edge is the first shape + } + if (!PrsDim::ComputeGeometry(theedge,aCurve,ptonedge1,ptonedge2,extCurv,isInfinite,isOnPlanEdge,Plane)) + return; + aPresentation->SetInfiniteState(isInfinite); + PrsDim::ComputeGeometry(thevertex, FirstAttach, Plane, isOnPlanVertex); + + if ( aCurve->IsInstance(STANDARD_TYPE(Geom_Line)) ) + { + Handle(Geom_Line) geom_lin (Handle(Geom_Line)::DownCast (aCurve)); + const gp_Lin& l = geom_lin->Lin(); + + // computation of Val + Val = l.Distance( FirstAttach ); + + gp_Dir DirAttach = l.Direction(); + // size + Standard_Real arrsize = ArrowSize; + if (Abs(Val) <= Precision::Confusion()) {arrsize = 0.;} + + if (AutomaticPos) { + gp_Pnt p = ElCLib::Value(ElCLib::Parameter(l,FirstAttach),l); + gp_Pnt curpos((FirstAttach.XYZ()+p.XYZ())*0.5); + // make offset + gp_Vec offset(DirAttach); + offset = offset*ArrowSize*(-10.); + curpos.Translate(offset); + Position = curpos; + } + else { // project point on the plane + Position = PrsDim::ProjectPointOnPlane( Position, Plane->Pln() ); + } + + if (!isInfinite) { + if (Position.Distance(ptonedge1) > Position.Distance(ptonedge2)) SecondAttach = ptonedge2; + else SecondAttach = ptonedge1; + } + else { + SecondAttach = ElCLib::Value(ElCLib::Parameter(l,Position),l); + } + + Handle(Prs3d_DimensionAspect) la = aDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(arrsize); + arr = la->ArrowAspect(); + arr->SetLength(arrsize); + + if (AutomaticPos && IsSetBndBox) + Position = PrsDim::TranslatePointToBound( Position, DirAttach, BndBox ); + DsgPrs_EqualDistancePresentation::AddInterval(aPresentation, + aDrawer, + FirstAttach, + SecondAttach, + DirAttach, + Position, + SymbolPrs, + FirstExtreme, + SecondExtreme); + +} + if (aCurve->IsInstance(STANDARD_TYPE(Geom_Circle))){ + gp_Circ aCirc1 = (Handle(Geom_Circle)::DownCast(aCurve))->Circ(); + gp_Circ aCirc2(aCirc1); aCirc2.SetRadius(0); //create the second formal circle + if(AutomaticPos) + { + SecondAttach = ptonedge2; //a vertex + Position.SetXYZ((SecondAttach.XYZ() + aCirc1.Location().XYZ())*0.5); + } + else { + Standard_Real aPar = ElCLib::Parameter(aCirc1, Position); + SecondAttach = ElCLib::Value(aPar, aCirc1); + } + + Handle(Geom_Circle) aCurve2 = new Geom_Circle(aCirc2); + DsgPrs_EqualDistancePresentation::AddIntervalBetweenTwoArcs(aPresentation, + aDrawer, + aCirc1, //circle or arc + aCirc2, //really vertex + ptonedge2, //last point of aCirc1 + SecondAttach, + FirstAttach, //vertex really + FirstAttach, + SymbolPrs); + + //Assign arc points + if (edgenum == 1){ + FirstExtreme = SecondAttach; SecondExtreme = FirstAttach; + SecondAttach = FirstAttach; FirstAttach = ptonedge2; + } else { //vertex is the first shape, circle is sthe last. + FirstExtreme = FirstAttach; SecondExtreme = SecondAttach; + SecondAttach = ptonedge2; + } + } + + // computation of Val + Val = FirstAttach.Distance(SecondAttach); + + //Display the pieces of attached to the curve if it is not + // in the WP + if (!isOnPlanEdge) { // add presentation of projection of the edge in WP + PrsDim::ComputeProjEdgePresentation(aPresentation,aDrawer,theedge,aCurve,ptonedge1,ptonedge2); + } + if (!isOnPlanVertex) { // add presentation of projection of the vertex in WP + PrsDim::ComputeProjVertexPresentation(aPresentation,aDrawer,thevertex,FirstAttach); + } + +} +// -- ota -- end diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_EqualDistanceRelation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_EqualDistanceRelation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_EqualDistanceRelation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_EqualDistanceRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,97 @@ +// Created on: 1998-01-24 +// Created by: Julia GERASIMOVA +// Copyright (c) 1998-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_EqualDistanceRelation_HeaderFile +#define _PrsDim_EqualDistanceRelation_HeaderFile + +#include +#include +#include + +class Geom_Plane; + +DEFINE_STANDARD_HANDLE(PrsDim_EqualDistanceRelation, PrsDim_Relation) + +//! A framework to display equivalent distances between +//! shapes and a given plane. +//! The distance is the length of a projection from the +//! shape to the plane. +//! These distances are used to compare shapes by this vector alone. +class PrsDim_EqualDistanceRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_EqualDistanceRelation, PrsDim_Relation) +public: + + //! Constructs a framework to display equivalent + //! distances between the shapes aShape1, aShape2, + //! aShape3, aShape4 and the plane aPlane. + //! The distance is the length of a projection from the + //! shape to the plane. + Standard_EXPORT PrsDim_EqualDistanceRelation(const TopoDS_Shape& aShape1, const TopoDS_Shape& aShape2, const TopoDS_Shape& aShape3, const TopoDS_Shape& aShape4, const Handle(Geom_Plane)& aPlane); + + //! Sets the shape aShape to be used as the shape + //! aShape3 in the framework created at construction time. + void SetShape3 (const TopoDS_Shape& aShape) { myShape3 = aShape; } + + //! Returns the shape aShape3 from the framework + //! created at construction time. + const TopoDS_Shape& Shape3() const { return myShape3; } + + //! Sets the shape aShape to be used as the shape + //! aShape4 in the framework created at construction time. + void SetShape4 (const TopoDS_Shape& aShape) { myShape4 = aShape; } + + //! Returns the shape aShape4 from the framework + //! created at construction time. + const TopoDS_Shape& Shape4() const { return myShape4; } + +public: + + //! Computes the location of an intreval between + //! between two edges. FirstAttach , SecondAttach + //! are the returned extreme points of the interval. + Standard_EXPORT static void ComputeTwoEdgesLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Edge& FirstEdge, const TopoDS_Edge& SecondEdge, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); + + //! Computes the interval position between two vertexs. FirstAttach, + //! SecondAttach are the returned extreme points of the interval. + Standard_EXPORT static void ComputeTwoVerticesLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Vertex& FirstVertex, const TopoDS_Vertex& SecondVertex, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, const PrsDim_TypeOfDist TypeDist, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); + + //! Compute the interval location between a vertex and an edge. Edge may be + //! a line or a circle. + Standard_EXPORT static void ComputeOneEdgeOneVertexLength (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Prs3d_Drawer)& aDrawer, const Standard_Real ArrowSize, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& Plane, const Standard_Boolean AutomaticPos, const Standard_Boolean IsSetBndBox, const Bnd_Box& BndBox, gp_Pnt& Position, gp_Pnt& FirstAttach, gp_Pnt& SecondAttach, gp_Pnt& FirstExtreme, gp_Pnt& SecondExtreme, DsgPrs_ArrowSide& SymbolPrs); + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + +private: + + TopoDS_Shape myShape3; + TopoDS_Shape myShape4; + gp_Pnt myAttachPoint1; + gp_Pnt myAttachPoint2; + gp_Pnt myAttachPoint3; + gp_Pnt myAttachPoint4; + gp_Pnt myPoint1; + gp_Pnt myPoint2; + gp_Pnt myPoint3; + gp_Pnt myPoint4; + +}; + +#endif // _PrsDim_EqualDistanceRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_EqualRadiusRelation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_EqualRadiusRelation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_EqualRadiusRelation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_EqualRadiusRelation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,222 @@ +// Created on: 1998-01-20 +// Created by: Julia GERASIMOVA +// Copyright (c) 1998-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_EqualRadiusRelation, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_EqualRadiusRelation +//purpose : +//======================================================================= +PrsDim_EqualRadiusRelation::PrsDim_EqualRadiusRelation( const TopoDS_Edge& aFirstEdge, + const TopoDS_Edge& aSecondEdge, + const Handle( Geom_Plane )& aPlane ) +: PrsDim_Relation() +{ + myFShape = aFirstEdge; + mySShape = aSecondEdge; + myPlane = aPlane; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_EqualRadiusRelation::Compute( const Handle( PrsMgr_PresentationManager3d )&, + const Handle( Prs3d_Presentation )& aPresentation, + const Standard_Integer ) +{ + BRepAdaptor_Curve FirstCurve( TopoDS::Edge( myFShape ) ), SecondCurve( TopoDS::Edge( mySShape ) ); + + Standard_Real FirstPar1 = FirstCurve.FirstParameter(), LastPar1 = FirstCurve.LastParameter(), + FirstPar2 = SecondCurve.FirstParameter(), LastPar2 = SecondCurve.LastParameter(); + + Handle( Geom_Curve ) FirstProjCurve = FirstCurve.Curve().Curve(), + SecondProjCurve = SecondCurve.Curve().Curve(); + gp_Pnt FirstPoint1, LastPoint1, FirstPoint2, LastPoint2; + Standard_Boolean isFirstOnPlane, isSecondOnPlane; + + PrsDim::ComputeGeomCurve (FirstProjCurve, FirstPar1, LastPar1, FirstPoint1, LastPoint1, myPlane, isFirstOnPlane); + PrsDim::ComputeGeomCurve (SecondProjCurve, FirstPar2, LastPar2, FirstPoint2, LastPoint2, myPlane, isSecondOnPlane); + + if (!isFirstOnPlane) + ComputeProjEdgePresentation( aPresentation, TopoDS::Edge( myFShape ), FirstProjCurve, FirstPoint1, LastPoint1 ); + if (! isSecondOnPlane) + ComputeProjEdgePresentation( aPresentation, TopoDS::Edge( mySShape ), SecondProjCurve, FirstPoint2, LastPoint2 ); + + gp_Circ FirstCirc = (Handle( Geom_Circle )::DownCast( FirstProjCurve ))->Circ(); + gp_Circ SecondCirc = (Handle( Geom_Circle )::DownCast( SecondProjCurve ))->Circ(); + + myFirstCenter = FirstCirc.Location(); + mySecondCenter = SecondCirc.Location(); + + //ota -- begin -- + if (myAutomaticPosition) + { + myFirstPoint = ElCLib::Value( (FirstPar1 + LastPar1)*0.5, FirstCirc ); + mySecondPoint = ElCLib::Value( (FirstPar2 + LastPar2)*0.5, SecondCirc ); + } + else { + Standard_Real aPar = ElCLib::Parameter(FirstCirc, myFirstPoint); + if (IntegerPart(0.5*LastPar1/M_PI) != 0 && aPar < FirstPar1 ) + aPar +=2*M_PI*IntegerPart(0.5*LastPar1/M_PI); + Standard_Real aRadius = FirstCirc.Radius(); + + if (Abs(myFirstPoint.Distance(myFirstCenter) - aRadius) >= Precision::Confusion()) + myFirstPoint = ElCLib::Value(aPar, FirstCirc); + if ( FirstPoint1.Distance(LastPoint1) > Precision::Confusion()){ + //check where is myFirstPoint + if (aPar > LastPar1 || aPar < FirstPar1) + { + //myFirstPoint is out of Arc of FirstCircle + if (FirstPoint1.Distance(myFirstPoint)< LastPoint1.Distance(myFirstPoint)) + myFirstPoint = FirstPoint1; + else + myFirstPoint = LastPoint1; + } + } + + + aPar = ElCLib::Parameter(SecondCirc, mySecondPoint); + if (IntegerPart(0.5*LastPar2/M_PI) != 0 && aPar < FirstPar2 ) + aPar +=2*M_PI*IntegerPart(0.5*LastPar2/M_PI); + + aRadius = SecondCirc.Radius(); + if (Abs(mySecondPoint.Distance(mySecondCenter) - aRadius) >= Precision::Confusion()) + mySecondPoint = ElCLib::Value(aPar, SecondCirc); + if (FirstPoint2.Distance(LastPoint2) > Precision::Confusion()){ + if (aPar > LastPar2 || aPar < FirstPar2) + { //mySecondPoint is out of Arc of mySecondCircle + if (FirstPoint2.Distance(mySecondPoint)< LastPoint2.Distance(mySecondPoint)) + mySecondPoint = FirstPoint2; + else + mySecondPoint = LastPoint2; + } + } + } + if( !myArrowSizeIsDefined ) + myArrowSize = (Min(myFirstCenter.Distance(myFirstPoint), + mySecondCenter.Distance(mySecondPoint)))*0.05; + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + + //ota -- end -- + + DsgPrs_EqualRadiusPresentation::Add(aPresentation, myDrawer, + myFirstCenter, mySecondCenter, myFirstPoint, mySecondPoint, myPlane ); +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_EqualRadiusRelation::ComputeSelection( const Handle( SelectMgr_Selection )& aSelection, + const Standard_Integer ) +{ + Handle( SelectMgr_EntityOwner ) own = new SelectMgr_EntityOwner( this, 7 ); + Handle( Select3D_SensitiveSegment ) seg; + + seg = new Select3D_SensitiveSegment( own, myFirstCenter, myFirstPoint ); + aSelection->Add( seg ); + + if(!myAutomaticPosition) + ComputeRadiusPosition(); + + seg = new Select3D_SensitiveSegment( own, mySecondCenter, mySecondPoint ); + aSelection->Add( seg ); + + seg = new Select3D_SensitiveSegment( own, myFirstCenter, mySecondCenter ); + aSelection->Add( seg ); + + + // Two small lines + gp_Pnt Middle( (myFirstCenter.XYZ() + mySecondCenter.XYZ())*0.5 ); + + Standard_Real SmallDist = .001; + //Should be changed as the domain of small lines could be changed. + Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox(own, + Middle.X() - SmallDist, + Middle.Y() - SmallDist, + Middle.Z() - SmallDist, + Middle.X() + SmallDist, + Middle.Y() + SmallDist, + Middle.Z() + SmallDist ); + aSelection->Add(box); +} + +//================================================================= +//function : ComputeRadiusPosition +//purpose : +//================================================================= +void PrsDim_EqualRadiusRelation::ComputeRadiusPosition() +{ + if (myAutomaticPosition || + myFirstCenter.Distance(myPosition) < Precision::Confusion() || + mySecondCenter.Distance(myPosition) < Precision::Confusion()) + return; + + gp_Pnt aPosition; + + //project myPosition to the plane of constraint + GeomAPI_ProjectPointOnSurf aProj(myPosition, myPlane); + aPosition = aProj.NearestPoint(); + + Standard_Real aDist1 = myFirstPoint.Distance(aPosition); + Standard_Real aDist2 = mySecondPoint.Distance(aPosition); + + if(aDist1 + +class Geom_Plane; + +DEFINE_STANDARD_HANDLE(PrsDim_EqualRadiusRelation, PrsDim_Relation) + +class PrsDim_EqualRadiusRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_EqualRadiusRelation, PrsDim_Relation) +public: + + //! Creates equal relation of two arc's radiuses. + //! If one of edges is not in the given plane, + //! the presentation method projects it onto the plane. + Standard_EXPORT PrsDim_EqualRadiusRelation(const TopoDS_Edge& aFirstEdge, const TopoDS_Edge& aSecondEdge, const Handle(Geom_Plane)& aPlane); + +private: + + Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeRadiusPosition(); + +private: + + gp_Pnt myFirstCenter; + gp_Pnt mySecondCenter; + gp_Pnt myFirstPoint; + gp_Pnt mySecondPoint; + +}; + +#endif // _PrsDim_EqualRadiusRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_FixRelation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_FixRelation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_FixRelation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_FixRelation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,554 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_FixRelation, PrsDim_Relation) + +static Standard_Boolean InDomain(const Standard_Real fpar, + const Standard_Real lpar, + const Standard_Real para) +{ + if (fpar >= 0.) { + return ((para >= fpar) && (para <= lpar)); + } + if (para >= (fpar+2*M_PI)) return Standard_True; + if (para <= lpar) return Standard_True; + return Standard_False; +} + +//======================================================================= +//function : Constructor +//purpose : vertex Fix Relation +//======================================================================= + +PrsDim_FixRelation::PrsDim_FixRelation(const TopoDS_Shape& aShape, + const Handle(Geom_Plane)& aPlane, + const TopoDS_Wire& aWire) +: PrsDim_Relation(), + myWire(aWire) +{ + myFShape = aShape; + myPlane = aPlane; + myAutomaticPosition = Standard_True; + myArrowSize = 5.; +} + +//======================================================================= +//function : Constructor +//purpose : vertex Fix Relation +//======================================================================= + +PrsDim_FixRelation::PrsDim_FixRelation(const TopoDS_Shape& aShape, + const Handle(Geom_Plane)& aPlane, + const TopoDS_Wire& aWire, + const gp_Pnt& aPosition, + const Standard_Real anArrowSize) +: PrsDim_Relation(), + myWire(aWire) +{ + myFShape = aShape; + myPlane = aPlane; + myPosition = aPosition; + SetArrowSize( anArrowSize ); + myAutomaticPosition = Standard_False; +} + + +//======================================================================= +//function : Constructor +//purpose : edge (line or circle) Fix Relation +//======================================================================= + +PrsDim_FixRelation::PrsDim_FixRelation (const TopoDS_Shape& aShape, + const Handle(Geom_Plane)& aPlane) +{ + myFShape = aShape; + myPlane = aPlane; + myAutomaticPosition = Standard_True; + myArrowSize = 5.; +} + +//======================================================================= +//function : Constructor +//purpose : edge (line or circle) Fix Relation +//======================================================================= + +PrsDim_FixRelation::PrsDim_FixRelation( + const TopoDS_Shape& aShape, + const Handle(Geom_Plane)& aPlane, + const gp_Pnt& aPosition, + const Standard_Real anArrowSize) +{ + myFShape = aShape; + myPlane = aPlane; + myPosition = aPosition; + SetArrowSize( anArrowSize ); + myAutomaticPosition = Standard_False; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_FixRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + // Calculate position of the symbol and + // point of attach of the segment on the shape + gp_Pnt curpos; + if (myFShape.ShapeType() == TopAbs_VERTEX) + ComputeVertex(TopoDS::Vertex(myFShape), curpos); + else if (myFShape.ShapeType() == TopAbs_EDGE) + ComputeEdge(TopoDS::Edge(myFShape), curpos); + + const gp_Dir& nor = myPlane->Axis().Direction(); + + + // calculate presentation + // definition of the symbol size + if( !myArrowSizeIsDefined ) + myArrowSize = 5.; + + //creation of the presentation + DsgPrs_FixPresentation::Add(aPresentation, + myDrawer, + myPntAttach, + curpos, + nor, + myArrowSize); +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_FixRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + + // creation of segment sensible for the linked segment + // of the shape fixed to symbol 'Fix' + Handle(Select3D_SensitiveSegment) seg; + seg = new Select3D_SensitiveSegment(own, + myPntAttach, + myPosition); + aSelection->Add(seg); + + // Creation of the sensible zone of symbol 'Fix' + gp_Dir norm = myPlane->Axis().Direction(); + + gp_Vec dirac(myPntAttach,myPosition); + dirac.Normalize(); + gp_Vec norac = dirac.Crossed(gp_Vec(norm)); + gp_Ax1 ax(myPosition, norm); + norac.Rotate(ax, M_PI/8); + + norac*=(myArrowSize/2); + gp_Pnt P1 = myPosition.Translated(norac); + gp_Pnt P2 = myPosition.Translated(-norac); + seg = new Select3D_SensitiveSegment(own, + P1, + P2); + aSelection->Add(seg); + + norac*=0.8; + P1 = myPosition.Translated(norac); + P2 = myPosition.Translated(-norac); + dirac*=(myArrowSize/2); + gp_Pnt PF(P1.XYZ()); + gp_Pnt PL = PF.Translated(dirac); + PL.Translate(norac); + seg = new Select3D_SensitiveSegment(own, + PF, + PL); + aSelection->Add(seg); + + + PF.SetXYZ(P2.XYZ()); + PL = PF.Translated(dirac); + PL.Translate(norac); + seg = new Select3D_SensitiveSegment(own, + PF, + PL); + aSelection->Add(seg); + + PF.SetXYZ( (P1.XYZ() + P2.XYZ()) /2 ); + PL = PF.Translated(dirac); + PL.Translate(norac); + seg = new Select3D_SensitiveSegment(own, + PF, + PL); +} + +//======================================================================= +//function : ComputeVertex +//purpose : computes myPntAttach and the position of the presentation +// when you fix a vertex +//======================================================================= + +void PrsDim_FixRelation::ComputeVertex(const TopoDS_Vertex& /*FixVertex*/, + gp_Pnt& curpos) +{ + myPntAttach = BRep_Tool::Pnt(TopoDS::Vertex(myFShape)); + curpos = myPosition; + if (myAutomaticPosition) { + gp_Pln pln(myPlane->Pln()); + gp_Dir dir(pln.XAxis().Direction()); + gp_Vec transvec = gp_Vec(dir)*myArrowSize; + curpos = myPntAttach.Translated(transvec); + myPosition = curpos; + myAutomaticPosition = Standard_True; + } +} + +//======================================================================= +//function : ComputePosition +//purpose : +//======================================================================= + +gp_Pnt PrsDim_FixRelation::ComputePosition(const Handle(Geom_Curve)& curv1, + const Handle(Geom_Curve)& curv2, + const gp_Pnt& firstp1, + const gp_Pnt& lastp1, + const gp_Pnt& firstp2, + const gp_Pnt& lastp2) const +{ + //--------------------------------------------------------- + // calculate the point of attach + //--------------------------------------------------------- + gp_Pnt curpos; + + if (curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) || curv2->IsInstance(STANDARD_TYPE(Geom_Circle))) { + Handle(Geom_Circle) gcirc = Handle(Geom_Circle)::DownCast(curv1); + if (gcirc.IsNull()) gcirc = Handle(Geom_Circle)::DownCast(curv2); + gp_Dir dir( gcirc->Location().XYZ() + myPntAttach.XYZ() ); + gp_Vec transvec = gp_Vec(dir)*myArrowSize; + curpos = myPntAttach.Translated(transvec); + } + + else { + gp_Vec vec1(firstp1,lastp1); + gp_Vec vec2(firstp2,lastp2); + + if (!vec1.IsParallel(vec2, Precision::Angular()) ) { + gp_Dir dir; + Standard_Real conf =Precision::Confusion(); + if (lastp1.IsEqual(firstp2,conf) || firstp1.IsEqual(lastp2,conf)) dir.SetXYZ(vec1.XYZ() - vec2.XYZ()); + else dir.SetXYZ(vec1.XYZ() + vec2.XYZ()); + gp_Vec transvec = gp_Vec(dir)*myArrowSize; + curpos = myPntAttach.Translated(transvec); + } + else { + gp_Vec crossvec = vec1.Crossed(vec2); + vec1.Cross(crossvec); + gp_Dir dir(vec1); + curpos = myPntAttach.Translated(gp_Vec(dir)*myArrowSize); + } + } + + return curpos; +} + +//======================================================================= +//function : ComputePosition +//purpose : Computes the position of the "fix dimension" when the +// fixed object is a vertex which is set at the intersection +// of two curves. +// The "dimension" is in the "middle" of the two edges. +//======================================================================= + +gp_Pnt PrsDim_FixRelation::ComputePosition(const Handle(Geom_Curve)& curv, + const gp_Pnt& firstp, + const gp_Pnt& lastp) const +{ + //--------------------------------------------------------- + // calculate the point of attach + //--------------------------------------------------------- + gp_Pnt curpos; + + if (curv->IsKind(STANDARD_TYPE(Geom_Circle))) { + + Handle(Geom_Circle) gcirc = Handle(Geom_Circle)::DownCast(curv); + gp_Dir dir( gcirc->Location().XYZ() + myPntAttach.XYZ() ); + gp_Vec transvec = gp_Vec(dir)*myArrowSize; + curpos = myPntAttach.Translated(transvec); + + } //if (curv->IsKind(STANDARD_TYPE(Geom_Circle)) + + else { +// gp_Pln pln(Component()->WorkingPlane()->Plane()->GetValue()->Pln()); + gp_Pln pln(myPlane->Pln()); + gp_Dir NormPln = pln.Axis().Direction(); + gp_Vec vec(firstp,lastp); + vec.Cross( gp_Vec(NormPln)); + vec.Normalize(); + gp_Vec transvec = vec*myArrowSize; + curpos = myPntAttach.Translated(transvec); + gp_Ax1 RotAx( myPntAttach, NormPln); + curpos.Rotate(RotAx, M_PI/10); + } + + return curpos; + } + +//======================================================================= +//function : ComputeEdge +//purpose : computes myPntAttach and the position of the presentation +// when you fix an edge +//======================================================================= + +void PrsDim_FixRelation::ComputeEdge(const TopoDS_Edge& FixEdge, gp_Pnt& curpos) +{ + Handle(Geom_Curve) curEdge; + gp_Pnt ptbeg,ptend; + if (!PrsDim::ComputeGeometry(FixEdge,curEdge,ptbeg,ptend)) return; + + //--------------------------------------------------------- + // calcul du point de positionnement du symbole 'fix' + //--------------------------------------------------------- + //--> In case of a straight line + if (curEdge->IsKind(STANDARD_TYPE(Geom_Line))){ + gp_Lin glin = Handle(Geom_Line)::DownCast(curEdge)->Lin(); + Standard_Real pfirst(ElCLib::Parameter(glin,ptbeg)); + Standard_Real plast(ElCLib::Parameter(glin,ptend)); + ComputeLinePosition(glin, curpos, pfirst, plast); + } + + //--> In case of a circle + else if (curEdge->IsKind(STANDARD_TYPE(Geom_Circle))) { + gp_Circ gcirc = Handle(Geom_Circle)::DownCast(curEdge)->Circ(); + Standard_Real pfirst, plast; + BRepAdaptor_Curve cu(FixEdge); + pfirst = cu.FirstParameter(); + plast = cu.LastParameter(); + ComputeCirclePosition(gcirc, curpos, pfirst, plast); + } + + else + return; + +} + +//======================================================================= +//function : ComputeLinePosition +//purpose : compute the values of myPntAttach and the position of +// the symbol when the fixed edge has a geometric support equal +// to a line. +//======================================================================= + +void PrsDim_FixRelation::ComputeLinePosition(const gp_Lin& glin, + gp_Pnt& pos, + Standard_Real& pfirst, + Standard_Real& plast) +{ + if (myAutomaticPosition) { + // point of attach is chosen as middle of the segment + myPntAttach = ElCLib::Value((pfirst+ plast)/2, glin); + + gp_Dir norm = myPlane ->Axis().Direction(); + + norm.Cross(glin.Position().Direction()); + pos = myPntAttach.Translated(gp_Vec(norm)*myArrowSize); + myAutomaticPosition = Standard_True; + } // if (myAutomaticPosition) + + else { + pos = myPosition; + Standard_Real linparam = ElCLib::Parameter(glin, pos); + + // case if the projection of position is located between 2 vertices + // de l'edge + if ( (linparam >= pfirst) && (linparam <= plast) ) + myPntAttach = ElCLib::Value(linparam,glin); + + // case if the projection of Position is outside of the limits + // of the edge : the point closest to the projection is chosen + // as the attach point + else { + Standard_Real pOnLin; + if (linparam > plast) + pOnLin = plast; + else + pOnLin = pfirst; + myPntAttach = ElCLib::Value(pOnLin,glin); + gp_Dir norm = myPlane->Axis().Direction(); + + norm.Cross(glin.Position().Direction()); + gp_Lin lsup(myPntAttach, norm); + Standard_Real parpos = ElCLib::Parameter(lsup,myPosition); + pos = ElCLib::Value(parpos,lsup); + } + + } + myPosition = pos; +} + +//======================================================================= +//function : ComputeCirclePosition +//purpose : compute the values of myPntAttach and the position of +// the symbol when the fixed edge has a geometric support equal +// to a circle. +//======================================================================= + +void PrsDim_FixRelation::ComputeCirclePosition( + const gp_Circ& gcirc, + gp_Pnt& pos, + Standard_Real& pfirst, + Standard_Real& plast) +{ + // readjust parametres on the circle + if (plast > 2*M_PI ) { + Standard_Real nbtours = Floor(plast / (2*M_PI)); + plast -= nbtours*2*M_PI; + pfirst -= nbtours*2*M_PI; + } + + if (myAutomaticPosition) { + // the point attach is the "middle" of the segment (relatively + // to the parametres of start and end vertices of the edge + + Standard_Real circparam = (pfirst + plast)/2.; + + if ( !InDomain(pfirst,plast,circparam)) { + Standard_Real otherpar = circparam + M_PI; + if (otherpar > 2*M_PI) otherpar -= 2*M_PI; + circparam = otherpar; + } + + myPntAttach = ElCLib::Value(circparam, gcirc ); + + gp_Vec dir( gcirc.Location().XYZ(), myPntAttach.XYZ() ); + dir.Normalize(); + gp_Vec transvec = dir*myArrowSize; + pos = myPntAttach.Translated(transvec); + myPosition = pos; + myAutomaticPosition = Standard_True; + } // if (myAutomaticPosition) + + else { + // case if the projection of myPosition is outside of 2 + // vertices of the edge. In this case the parameter is readjusted + // in the valid part of the circle + pos = myPosition; + + Standard_Real circparam = ElCLib::Parameter(gcirc, pos); + + if ( !InDomain(pfirst,plast,circparam)) { + Standard_Real otherpar = circparam + M_PI; + if (otherpar > 2*M_PI) otherpar -= 2*M_PI; + circparam = otherpar; + } + + myPntAttach = ElCLib::Value(circparam,gcirc); + } +} + +//======================================================================= +//function : ConnectedEdges +//purpose : +//======================================================================= +Standard_Boolean PrsDim_FixRelation::ConnectedEdges(const TopoDS_Wire& WIRE, + const TopoDS_Vertex& V, + TopoDS_Edge& E1, + TopoDS_Edge& E2) +{ + TopTools_IndexedDataMapOfShapeListOfShape vertexMap; + TopExp::MapShapesAndAncestors (WIRE,TopAbs_VERTEX,TopAbs_EDGE,vertexMap); + + Standard_Boolean found(Standard_False); + TopoDS_Vertex theVertex; + for (Standard_Integer i=1; i<=vertexMap.Extent() && !found; i++) { + if (vertexMap.FindKey(i).IsSame(V)) { + theVertex = TopoDS::Vertex(vertexMap.FindKey(i)); + found = Standard_True; + } + } + if (!found) { + E1.Nullify(); + E2.Nullify(); + return Standard_False; + } + + TopTools_ListIteratorOfListOfShape iterator(vertexMap.FindFromKey(theVertex)); + if (iterator.More()) { + E1 = TopoDS::Edge(iterator.Value()); + BRepAdaptor_Curve curv(E1); + iterator.Next(); + } + else { + E1.Nullify(); + return Standard_False; + } + + if (iterator.More()) { + E2 = TopoDS::Edge(iterator.Value()); + BRepAdaptor_Curve curv(E2); + iterator.Next(); + } + else { + E2.Nullify(); + return Standard_False; + } + + if (iterator.More()) { + E1.Nullify(); + E2.Nullify(); + return Standard_False; + } + return Standard_True; +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_FixRelation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_FixRelation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_FixRelation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_FixRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,101 @@ +// Created on: 1996-12-05 +// Created by: Flore Lantheaume/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_FixRelation_HeaderFile +#define _PrsDim_FixRelation_HeaderFile + +#include +#include + +class Geom_Plane; + +DEFINE_STANDARD_HANDLE(PrsDim_FixRelation, PrsDim_Relation) + +//! Constructs and manages a constraint by a fixed +//! relation between two or more interactive datums. This +//! constraint is represented by a wire from a shape - +//! point, vertex, or edge - in the first datum and a +//! corresponding shape in the second. +//! Warning: This relation is not bound with any kind of parametric +//! constraint : it represents the "status" of an parametric +//! object. +class PrsDim_FixRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_FixRelation, PrsDim_Relation) +public: + + //! initializes the vertex aShape, the + //! plane aPlane and the wire aWire, which connects + //! the two vertices in a fixed relation. + Standard_EXPORT PrsDim_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const TopoDS_Wire& aWire); + + //! initializes the vertex aShape, the + //! plane aPlane and the wire aWire, the position + //! aPosition, the arrow size anArrowSize and the + //! wire aWire, which connects the two vertices in a fixed relation. + Standard_EXPORT PrsDim_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const TopoDS_Wire& aWire, const gp_Pnt& aPosition, const Standard_Real anArrowSize = 0.01); + + //! initializes the edge aShape and the plane aPlane. + Standard_EXPORT PrsDim_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane); + + //! initializes the edge aShape, the + //! plane aPlane, the position aPosition and the arrow + //! size anArrowSize. + Standard_EXPORT PrsDim_FixRelation(const TopoDS_Shape& aShape, const Handle(Geom_Plane)& aPlane, const gp_Pnt& aPosition, const Standard_Real anArrowSize = 0.01); + + //! Returns the wire which connects vertices in a fixed relation. + const TopoDS_Wire& Wire() { return myWire; } + + //! Constructs the wire aWire. This connects vertices + //! which are in a fixed relation. + void SetWire (const TopoDS_Wire& aWire) { myWire = aWire; } + + //! Returns true if the Interactive Objects in the relation + //! are movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + //! computes the presentation for if it's a + //! vertex. + Standard_EXPORT void ComputeVertex (const TopoDS_Vertex& FixVertex, gp_Pnt& curpos); + + Standard_EXPORT gp_Pnt ComputePosition (const Handle(Geom_Curve)& curv1, const Handle(Geom_Curve)& curv2, const gp_Pnt& firstp1, const gp_Pnt& lastp1, const gp_Pnt& firstp2, const gp_Pnt& lastp2) const; + + Standard_EXPORT gp_Pnt ComputePosition (const Handle(Geom_Curve)& curv, const gp_Pnt& firstp, const gp_Pnt& lastp) const; + + //! computes the presentation for if it's a + //! edge. + Standard_EXPORT void ComputeEdge (const TopoDS_Edge& FixEdge, gp_Pnt& curpos); + + Standard_EXPORT void ComputeLinePosition (const gp_Lin& glin, gp_Pnt& pos, Standard_Real& pfirst, Standard_Real& plast); + + Standard_EXPORT void ComputeCirclePosition (const gp_Circ& gcirc, gp_Pnt& pos, Standard_Real& pfirst, Standard_Real& plast); + + Standard_EXPORT static Standard_Boolean ConnectedEdges (const TopoDS_Wire& aWire, const TopoDS_Vertex& aVertex, TopoDS_Edge& Edge1, TopoDS_Edge& Edge2); + +private: + + TopoDS_Wire myWire; + gp_Pnt myPntAttach; + +}; + +#endif // _PrsDim_FixRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,159 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_HeaderFile +#define _PrsDim_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Bnd_Box; +class Geom_Curve; +class Geom_Plane; +class Geom_Surface; +class TopoDS_Edge; +class TopoDS_Face; +class TopoDS_Shape; +class TopoDS_Vertex; + +//! Auxiliary methods for computing dimensions. +class PrsDim +{ +public: + + DEFINE_STANDARD_ALLOC + + //! Returns the nearest point in a shape. This is used by + //! several classes in calculation of dimensions. + Standard_EXPORT static gp_Pnt Nearest (const TopoDS_Shape& aShape, const gp_Pnt& aPoint); + + //! @return the nearest point on the line. + Standard_EXPORT static gp_Pnt Nearest (const gp_Lin& theLine, const gp_Pnt& thePoint); + + //! For the given point finds nearest point on the curve, + //! @return TRUE if found point is belongs to the curve + //! and FALSE otherwise. + Standard_EXPORT static Standard_Boolean Nearest (const Handle(Geom_Curve)& theCurve, const gp_Pnt& thePoint, const gp_Pnt& theFirstPoint, const gp_Pnt& theLastPoint, gp_Pnt& theNearestPoint); + + Standard_EXPORT static gp_Pnt Farest (const TopoDS_Shape& aShape, const gp_Pnt& aPoint); + + //! Used by 2d Relation only + //! Computes the 3d geometry of in the current WorkingPlane + //! and the extremities if any + //! Return TRUE if ok. + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt); + + //! Used by dimensions only. + //! Computes the 3d geometry of . + //! Return TRUE if ok. + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt, Standard_Boolean& theIsInfinite); + + //! Used by 2d Relation only + //! Computes the 3d geometry of in the current WorkingPlane + //! and the extremities if any. + //! If is not in the current plane, contains + //! the not projected curve associated to . + //! If is infinite, = true and the 2 + //! parameters and have no signification. + //! Return TRUE if ok. + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theEdge, Handle(Geom_Curve)& theCurve, gp_Pnt& theFirstPnt, gp_Pnt& theLastPnt, Handle(Geom_Curve)& theExtCurve, Standard_Boolean& theIsInfinite, Standard_Boolean& theIsOnPlane, const Handle(Geom_Plane)& thePlane); + + //! Used by 2d Relation only + //! Computes the 3d geometry of in the current WorkingPlane + //! and the extremities if any + //! Return TRUE if ok. + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, const Handle(Geom_Plane)& thePlane); + + //! Used by dimensions only.Computes the 3d geometry + //! of and and checks if they are infinite. + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, Standard_Boolean& theIsinfinite1, Standard_Boolean& theIsinfinite2); + + //! Used by 2d Relation only Computes the 3d geometry + //! of and in the current Plane and the + //! extremities if any. Return in ExtCurve the 3d curve + //! (not projected in the plane) of the first edge if + //! =1 or of the 2nd edge if = 2. If + //! = 0, ExtCurve is Null. if there is an edge + //! external to the plane, is true if this + //! edge is infinite. So, the extremities of it are not + //! significant. Return TRUE if ok + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Edge& theFirstEdge, const TopoDS_Edge& theSecondEdge, Standard_Integer& theExtIndex, Handle(Geom_Curve)& theFirstCurve, Handle(Geom_Curve)& theSecondCurve, gp_Pnt& theFirstPnt1, gp_Pnt& theLastPnt1, gp_Pnt& theFirstPnt2, gp_Pnt& theLastPnt2, Handle(Geom_Curve)& theExtCurve, Standard_Boolean& theIsinfinite1, Standard_Boolean& theIsinfinite2, const Handle(Geom_Plane)& thePlane); + + //! Checks if aCurve belongs to aPlane; if not, projects aCurve in aPlane + //! and returns aCurve; + //! Return TRUE if ok + Standard_EXPORT static Standard_Boolean ComputeGeomCurve (Handle(Geom_Curve)& aCurve, const Standard_Real first1, const Standard_Real last1, gp_Pnt& FirstPnt1, gp_Pnt& LastPnt1, const Handle(Geom_Plane)& aPlane, Standard_Boolean& isOnPlane); + + Standard_EXPORT static Standard_Boolean ComputeGeometry (const TopoDS_Vertex& aVertex, gp_Pnt& point, const Handle(Geom_Plane)& aPlane, Standard_Boolean& isOnPlane); + + //! Tryes to get Plane from Face. Returns Surface of Face + //! in aSurf. Returns Standard_True and Plane of Face in + //! aPlane in following cases: + //! Face is Plane, Offset of Plane, + //! Extrusion of Line and Offset of Extrusion of Line + //! Returns pure type of Surface which can be: + //! Plane, Cylinder, Cone, Sphere, Torus, + //! SurfaceOfRevolution, SurfaceOfExtrusion + Standard_EXPORT static Standard_Boolean GetPlaneFromFace (const TopoDS_Face& aFace, gp_Pln& aPlane, Handle(Geom_Surface)& aSurf, PrsDim_KindOfSurface& aSurfType, Standard_Real& Offset); + + Standard_EXPORT static void InitFaceLength (const TopoDS_Face& aFace, gp_Pln& aPlane, Handle(Geom_Surface)& aSurface, PrsDim_KindOfSurface& aSurfaceType, Standard_Real& anOffset); + + //! Finds attachment points on two curvilinear faces for length dimension. + //! @param thePlaneDir [in] the direction on the dimension plane to + //! compute the plane automatically. It will not be taken into account if + //! plane is defined by user. + Standard_EXPORT static void InitLengthBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, Handle(Geom_Surface)& theFirstSurf, Handle(Geom_Surface)& theSecondSurf, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, gp_Dir& theDirOnPlane); + + //! Finds three points for the angle dimension between + //! two planes. + Standard_EXPORT static Standard_Boolean InitAngleBetweenPlanarFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, gp_Pnt& theCenter, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, const Standard_Boolean theIsFirstPointSet = Standard_False); + + //! Finds three points for the angle dimension between + //! two curvilinear surfaces. + Standard_EXPORT static Standard_Boolean InitAngleBetweenCurvilinearFaces (const TopoDS_Face& theFirstFace, const TopoDS_Face& theSecondFace, const PrsDim_KindOfSurface theFirstSurfType, const PrsDim_KindOfSurface theSecondSurfType, gp_Pnt& theCenter, gp_Pnt& theFirstAttach, gp_Pnt& theSecondAttach, const Standard_Boolean theIsFirstPointSet = Standard_False); + + Standard_EXPORT static gp_Pnt ProjectPointOnPlane (const gp_Pnt& aPoint, const gp_Pln& aPlane); + + Standard_EXPORT static gp_Pnt ProjectPointOnLine (const gp_Pnt& aPoint, const gp_Lin& aLine); + + Standard_EXPORT static gp_Pnt TranslatePointToBound (const gp_Pnt& aPoint, const gp_Dir& aDir, const Bnd_Box& aBndBox); + + //! returns True if point with anAttachPar is + //! in domain of arc + Standard_EXPORT static Standard_Boolean InDomain (const Standard_Real aFirstPar, const Standard_Real aLastPar, const Standard_Real anAttachPar); + + //! computes nearest to ellipse arc apex + Standard_EXPORT static gp_Pnt NearestApex (const gp_Elips& elips, const gp_Pnt& pApex, const gp_Pnt& nApex, const Standard_Real fpara, const Standard_Real lpara, Standard_Boolean& IsInDomain); + + //! computes length of ellipse arc in parametric units + Standard_EXPORT static Standard_Real DistanceFromApex (const gp_Elips& elips, const gp_Pnt& Apex, const Standard_Real par); + + Standard_EXPORT static void ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPres, const Handle(Prs3d_Drawer)& aDrawer, const TopoDS_Edge& anEdge, const Handle(Geom_Curve)& ProjCurve, const gp_Pnt& FirstP, const gp_Pnt& LastP, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfLine aProjTOL = Aspect_TOL_DASH, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT); + + Standard_EXPORT static void ComputeProjVertexPresentation (const Handle(Prs3d_Presentation)& aPres, const Handle(Prs3d_Drawer)& aDrawer, const TopoDS_Vertex& aVertex, const gp_Pnt& ProjPoint, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfMarker aProjTOM = Aspect_TOM_PLUS, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT); + +}; + +#endif // _PrsDim_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_IdenticRelation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_IdenticRelation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_IdenticRelation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_IdenticRelation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1711 @@ +// Created on: 1997-03-03 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_IdenticRelation, PrsDim_Relation) + +// jfa 15/10/2000 +static Standard_Real Modulo2PI(const Standard_Real ANGLE) +{ + if ( ANGLE < 0 ) return Modulo2PI(ANGLE + 2*M_PI); + else if ( ANGLE >= 2*M_PI ) return Modulo2PI(ANGLE - 2*M_PI); + return ANGLE; +} + +static Standard_Boolean IsEqual2PI(const Standard_Real angle1, + const Standard_Real angle2, const Standard_Real precision) +{ + Standard_Real diff = Abs(angle1-angle2); + if ( diff < precision ) return Standard_True; + else if ( Abs(diff-2*M_PI) < precision ) return Standard_True; + return Standard_False; +} +// jfa 15/10/2000 end + +//======================================================================= +//function : PrsDim_Sort +//purpose : sort an array of parameters in increasing order +// updates and according to +//======================================================================= +static void PrsDim_Sort(Standard_Real tab1[4], + gp_Pnt tab2[4], + Standard_Integer tab3[4]) +{ + Standard_Boolean found = Standard_True; + Standard_Real cur; gp_Pnt cur1; Standard_Integer cur2; + + while (found) { + found = Standard_False; + for (Standard_Integer i=0; i< 3; i++) { + if (tab1[i+1] < tab1[i]) { + found = Standard_True; + cur = tab1[i]; cur1 = tab2[i]; cur2 = tab3[i]; + tab1[i] = tab1[i+1]; tab2[i] = tab2[i+1]; tab3[i] = tab3[i+1]; + tab1[i+1] = cur; tab2[i+1] = cur1; tab3[i+1] = cur2; + } + } + } +} + +//======================================================================= +//function : ConnectedEdges +//purpose : +//======================================================================= +static Standard_Boolean ConnectedEdges(const TopoDS_Wire& WIRE, + const TopoDS_Vertex& V, + TopoDS_Edge& E1, + TopoDS_Edge& E2) +{ + TopTools_IndexedDataMapOfShapeListOfShape vertexMap; + TopExp::MapShapesAndAncestors (WIRE,TopAbs_VERTEX,TopAbs_EDGE,vertexMap); + + Standard_Boolean found(Standard_False); + TopoDS_Vertex theVertex; + for (Standard_Integer i=1; i<=vertexMap.Extent() && !found; i++) { + if (vertexMap.FindKey(i).IsSame(V)) { + theVertex = TopoDS::Vertex(vertexMap.FindKey(i)); + found = Standard_True; + } + } + if (!found) { + E1.Nullify(); + E2.Nullify(); + return Standard_False; + } + + TopTools_ListIteratorOfListOfShape iterator(vertexMap.FindFromKey(theVertex)); + if (iterator.More()) { + E1 = TopoDS::Edge(iterator.Value()); + iterator.Next(); + } + else { + E1.Nullify(); + return Standard_False; + } + + if (iterator.More()) { + E2 = TopoDS::Edge(iterator.Value()); + iterator.Next(); + } + else { + E2.Nullify(); + return Standard_False; + } + + if (iterator.More()) { + E1.Nullify(); + E2.Nullify(); + return Standard_False; + } + return Standard_True; +} + +// jfa 16/10/2000 +//======================================================================= +//function : ComputeAttach +//purpose : Compute a point on the arc of +// between and +// corresponding to +// Returns result into +// Note : This function is to be used only in the case of circles. +// The parameter is in/out. +//======================================================================= +static Standard_Boolean ComputeAttach(const gp_Circ& thecirc, + const gp_Pnt& aFAttach, + const gp_Pnt& aSAttach, + gp_Pnt& aPosition) +{ + gp_Pnt curpos = aPosition; + + // Case of confusion between the current position and the center + // of the circle -> we move the current position + Standard_Real confusion (Precision::Confusion()); + gp_Pnt aCenter = thecirc.Location(); + if ( aCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(aCenter, aFAttach); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + + Standard_Real pcurpos = ElCLib::Parameter(thecirc,curpos); + Standard_Real pFAttach = ElCLib::Parameter(thecirc,aFAttach); + Standard_Real pSAttach = ElCLib::Parameter(thecirc,aSAttach); + + Standard_Real pSAttachM = pSAttach; + Standard_Real deltap = pSAttachM - pFAttach; + if ( deltap < 0 ) + { + deltap += 2 * M_PI; + pSAttachM += 2 * M_PI; + } + pSAttachM -= pFAttach; + + Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; + + Standard_Real pcurpos1 = pcurpos; + // define where curpos lays + if ( pcurpos1 < pFAttach ) + { + pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; + if ( pcurpos1 > pSAttachM ) // out + { + if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; + else pcurpos = pSAttach; + } + } + else if ( pcurpos1 > (pFAttach + deltap) ) // out + { + pcurpos1 -= pFAttach; + if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; + else pcurpos = pSAttach; + } + + aPosition = ElCLib::Value(pcurpos,thecirc); + return Standard_True; +} + +//======================================================================= +//function : ComputeAttach +//purpose : Compute a point on the arc of ellipse +// between and +// corresponding to +// Returns result into +// Note : This function is to be used only in the case of ellipses. +// The parameter is in/out. +//======================================================================= +static Standard_Boolean ComputeAttach(const gp_Elips& theEll, + const gp_Pnt& aFAttach, + const gp_Pnt& aSAttach, + gp_Pnt& aPosition) +{ + gp_Pnt curpos = aPosition; + + // Case of confusion between the current position and the center + // of the circle -> we move the current position + Standard_Real confusion (Precision::Confusion()); + gp_Pnt aCenter = theEll.Location(); + if ( aCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(aCenter, aFAttach); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + +// for ellipses it's not good Standard_Real pcurpos = ElCLib::Parameter(theEll,curpos); + Handle(Geom_Ellipse) theEllg = new Geom_Ellipse(theEll); + GeomAPI_ProjectPointOnCurve aProj (curpos, theEllg); + Standard_Real pcurpos = aProj.LowerDistanceParameter(); + + Standard_Real pFAttach = ElCLib::Parameter(theEll,aFAttach); + Standard_Real pSAttach = ElCLib::Parameter(theEll,aSAttach); + + Standard_Real pSAttachM = pSAttach; + Standard_Real deltap = pSAttachM - pFAttach; + if ( deltap < 0 ) + { + deltap += 2 * M_PI; + pSAttachM += 2 * M_PI; + } + pSAttachM -= pFAttach; + + Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; + + Standard_Real pcurpos1 = pcurpos; + // define where curpos lays + if ( pcurpos1 < pFAttach ) + { + pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; + if ( pcurpos1 > pSAttachM ) // out + { + if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; + else pcurpos = pSAttach; + } + } + else if ( pcurpos1 > (pFAttach + deltap) ) // out + { + pcurpos1 -= pFAttach; + if ( pcurpos1 > pmiddleout ) pcurpos = pFAttach; + else pcurpos = pSAttach; + } + + aPosition = ElCLib::Value(pcurpos,theEll); + return Standard_True; +} +// jfa 16/10/2000 end + +//======================================================================= +//function : PrsDim_IdenticRelation +//purpose : +//======================================================================= +PrsDim_IdenticRelation::PrsDim_IdenticRelation(const TopoDS_Shape& FirstShape, + const TopoDS_Shape& SecondShape, + const Handle(Geom_Plane)& aPlane) + :isCircle(Standard_False) +{ + myFShape = FirstShape; + mySShape = SecondShape; + myPlane = aPlane; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_IdenticRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aprs, + const Standard_Integer) +{ + switch ( myFShape.ShapeType() ) { + + case TopAbs_VERTEX: + { + switch ( mySShape.ShapeType() ) { + case TopAbs_VERTEX: + { + ComputeTwoVerticesPresentation(aprs); + } + break; + case TopAbs_EDGE: + { + ComputeOneEdgeOVertexPresentation(aprs); + } + break; + default: + break; + } + } + break; + + case TopAbs_EDGE: + { + switch ( mySShape.ShapeType() ) { + case TopAbs_VERTEX: + { + ComputeOneEdgeOVertexPresentation(aprs); + } + break; + case TopAbs_EDGE: + { + ComputeTwoEdgesPresentation(aprs); + } + break; + default: + break; + } + } + break; + default: break; + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : function used to compute the selection associated to the +// "identic" presentation +// note : if we are in the case of lines, we create a segment between +// myFAttach and mySAttach. In the case of Circles, we create +// an arc of circle between the sames points. We Add a segment +// to link Position to its projection on the curve described +// before. +//======================================================================= + +void PrsDim_IdenticRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + + Handle(Select3D_SensitiveSegment) seg; + // attachement point of the segment linking position to the curve + gp_Pnt attach; + Standard_Real confusion (Precision::Confusion()); + + if ( myFAttach.IsEqual(mySAttach, confusion) ) + { + attach = myFAttach; + } + else + { +// jfa 24/10/2000 + if ( myFShape.ShapeType() == TopAbs_EDGE ) + { + Handle(Geom_Curve) curv1,curv2; + gp_Pnt firstp1,lastp1,firstp2,lastp2; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if ( !PrsDim::ComputeGeometry(TopoDS::Edge(myFShape),TopoDS::Edge(mySShape), + myExtShape,curv1,curv2, + firstp1,lastp1,firstp2,lastp2, + extCurv,isInfinite1,isInfinite2,myPlane) ) return; + + if ( isCircle ) // case of Circles + { + Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv1); + Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),myFAttach); + Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),mySAttach); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); + + Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecu); + aSelection->Add(scurv); + + attach = myPosition; + ComputeAttach(thecirc->Circ(),myFAttach,mySAttach,attach); + } + else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipses + { + Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv1); + + Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),myFAttach); + Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),mySAttach); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); + + Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecu); + aSelection->Add(scurv); + + attach = myPosition; + ComputeAttach(theEll->Elips(),myFAttach,mySAttach,attach); + } + else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of Lines + { + seg = new Select3D_SensitiveSegment(own, myFAttach, mySAttach); + aSelection->Add(seg); + + //attach = projection of Position() on the curve; + gp_Vec v1 (myFAttach, mySAttach); + gp_Vec v2 (myFAttach, myPosition); + if ( v1.IsParallel(v2, Precision::Angular()) ) + { + attach = mySAttach; + } + else + { + gp_Lin ll (myFAttach, gp_Dir(v1)); + attach = ElCLib::Value(ElCLib::Parameter(ll,myPosition), ll); + } + } + else return; + } +// else if ( myFShape.ShapeType() == TopAbs_VERTEX ) +// { +// } +// jfa 24/10/2000 end + } + + // Creation of the segment linking the attachement point with the + // position + if ( !attach.IsEqual(myPosition, confusion) ) + { + seg = new Select3D_SensitiveSegment(own, attach, myPosition); + aSelection->Add(seg); + } +} + +//======================================================================= +//function : ComputeTwoEdgesPresentation +//purpose : +//======================================================================= +void PrsDim_IdenticRelation::ComputeTwoEdgesPresentation(const Handle(Prs3d_Presentation)& aPrs) +{ + Handle(Geom_Curve) curv1,curv2; + gp_Pnt firstp1,lastp1,firstp2,lastp2; + Standard_Boolean isInfinite1,isInfinite2; + + Handle(Geom_Curve) extCurv; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myFShape), + TopoDS::Edge(mySShape), + myExtShape, + curv1, + curv2, + firstp1, + lastp1, + firstp2, + lastp2, + extCurv, + isInfinite1,isInfinite2, + myPlane)) + return; + aPrs->SetInfiniteState((isInfinite1 || isInfinite2) && myExtShape != 0); + + // Treatement of the case of lines + if ( curv1->IsInstance(STANDARD_TYPE(Geom_Line)) && curv2->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + // we take the line curv1 like support + Handle(Geom_Line) thelin; + if (isInfinite1 && !isInfinite2) thelin = Handle(Geom_Line)::DownCast (curv2); + else if (!isInfinite1 && isInfinite2) thelin = Handle(Geom_Line)::DownCast (curv1); + else thelin = Handle(Geom_Line)::DownCast (curv1); + ComputeTwoLinesPresentation(aPrs, thelin, firstp1, lastp1, firstp2, lastp2, isInfinite1, isInfinite2); + } + + // Treatement of the case of circles + else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) && curv2->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + //gp_Pnt curpos; + isCircle = Standard_True; // useful for ComputeSelection + Handle(Geom_Circle) thecirc (Handle(Geom_Circle)::DownCast (curv1)); + ComputeTwoCirclesPresentation(aPrs, thecirc, firstp1, lastp1, firstp2, lastp2); + } + + // jfa 10/10/2000 + // Treatement of the case of ellipses + else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) && curv2->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) + { + Handle(Geom_Ellipse) theEll (Handle(Geom_Ellipse)::DownCast (curv1)); + ComputeTwoEllipsesPresentation(aPrs, theEll, firstp1, lastp1, firstp2, lastp2); + } + // jfa 10/10/2000 end + else + return; + + // Calculate presentation of projected edges + if ( (myExtShape != 0) && !extCurv.IsNull()) { + if (myExtShape == 1 ) + ComputeProjEdgePresentation(aPrs, TopoDS::Edge(myFShape), curv1, firstp1, lastp1); + else + ComputeProjEdgePresentation(aPrs, TopoDS::Edge(mySShape), curv2, firstp2, lastp2); + } +} + +//======================================================================= +//function : ComputeTwoLinesPresentation +//purpose : Compute the presentation of the 'identic' constraint +// between two lines ( which are equal) +//input : : the +// : first extremity of the 1st curve of the constraint +// : last extremity of the 1st curve of the constraint +// : first extremity of the 2nd curve of the constraint +// :last extremity of the 2nd curve of the constraint +//======================================================================= +void PrsDim_IdenticRelation::ComputeTwoLinesPresentation(const Handle(Prs3d_Presentation)& aPrs, + const Handle(Geom_Line)& thelin, + gp_Pnt& firstp1, + gp_Pnt& lastp1, + gp_Pnt& firstp2, + gp_Pnt& lastp2, + const Standard_Boolean isInfinite1, + const Standard_Boolean isInfinite2) +{ + if (isInfinite1 && isInfinite2) { + if ( myAutomaticPosition ) { + myFAttach = mySAttach = thelin->Lin().Location(); + gp_Pnt curpos; + gp_Pln pln(myPlane->Pln()); + gp_Dir dir(pln.XAxis().Direction()); + gp_Vec transvec = gp_Vec(dir)*myArrowSize; + curpos = myFAttach.Translated(transvec); + myPosition = curpos; + myAutomaticPosition = Standard_True; + } + else { + myFAttach = mySAttach = ElCLib::Value(ElCLib::Parameter(thelin->Lin(),myPosition),thelin->Lin()); + } + TCollection_ExtendedString vals(" =="); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + myFAttach, + myPosition); + } + else { + // Computation of the parameters of the 4 points on the line + Standard_Real pf1, pf2, pl1, pl2; + + pf1 = ElCLib::Parameter(thelin->Lin(), firstp1); + pl1 = ElCLib::Parameter(thelin->Lin(), lastp1); + + pf2 = ElCLib::Parameter(thelin->Lin(), firstp2); + pl2 = ElCLib::Parameter(thelin->Lin(), lastp2); + + if (isInfinite1) { + pf1 = pf2; + pl1 = pl2; + firstp1 = firstp2; + lastp1 = lastp2; + } + else if (isInfinite2) { + pf2 = pf1; + pl2 = pl1; + firstp2 = firstp1; + lastp2 = lastp1; + } + + Standard_Real tabRang1[4]; // array taht contains the parameters of the 4 points + // ordered by increasing abscisses. + + gp_Pnt tabRang2[4]; // array containing the points corresponding to the + // parameters in tabRang1 + + Standard_Integer tabRang3[4]; // array containing the number of the curve( 1 or 2) + // of which belongs each point of tabRang2 + + // Filling of the arrays + tabRang1[0] = pf1; tabRang2[0] = firstp1; tabRang3[0] = 1; + tabRang1[1] = pf2; tabRang2[1] = firstp2; tabRang3[1] = 2; + tabRang1[2] = pl1; tabRang2[2] = lastp1; tabRang3[2] = 1; + tabRang1[3] = pl2; tabRang2[3] = lastp2; tabRang3[3] = 2; + + // Sort of the array of parameters (tabRang1) + PrsDim_Sort(tabRang1, tabRang2, tabRang3); + + // Computation of myFAttach and mySAttach according to the + // position of the 2 linear edges + gp_Pnt curpos; + gp_Pnt middle; + + if ( (tabRang1[0] == tabRang1[1]) && (tabRang1[2] == tabRang1[3]) ) { + middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); + Standard_Real pmiddle = (tabRang1[1] + tabRang1[2]) / 2.; + Standard_Real delta = (tabRang1[3] - tabRang1[0])/ 5.; + myFAttach = ElCLib::Value(pmiddle-delta, thelin->Lin()); + mySAttach = ElCLib::Value(pmiddle+delta, thelin->Lin()); + } + + else if ( tabRang1[1] == tabRang1[2] ) { + middle = tabRang2[1]; + Standard_Real delta1 = tabRang1[1] - tabRang1[0]; + Standard_Real delta2 = tabRang1[3] - tabRang1[2]; + if ( delta1 > delta2 ) delta1 = delta2; + myFAttach = ElCLib::Value(tabRang1[1]-delta1/2., thelin->Lin()); + mySAttach = ElCLib::Value(tabRang1[1]+delta1/2., thelin->Lin()); + } + + // Case of 2 disconnected segments -> the symbol completes the gap + // between the 2 edges + //-------------------------------- + else if ( (tabRang3[0] == tabRang3[1]) && (tabRang1[1] != tabRang1[2])) { + middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); + myFAttach = tabRang2[1]; + mySAttach = tabRang2[2]; + } + else if ( (tabRang3[0] != tabRang3[1]) + && (tabRang3[1] != tabRang3[2]) // Intersection + && (tabRang1[1] != tabRang1[2]) ) { + middle.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); + myFAttach = tabRang2[1]; + mySAttach = tabRang2[2]; + } + else { // Inclusion + myFAttach.SetXYZ((tabRang2[0].XYZ() + tabRang2[1].XYZ())/2. ); + mySAttach.SetXYZ((tabRang2[1].XYZ() + tabRang2[2].XYZ())/2. ); + middle.SetXYZ( (myFAttach.XYZ() + mySAttach.XYZ() )/2.); + } + + + if ( myAutomaticPosition ) { + + gp_Vec vtrans(myFAttach, mySAttach); + vtrans.Normalize(); + vtrans.Cross(gp_Vec(myPlane->Pln().Axis().Direction())); + vtrans *= ComputeSegSize(); + curpos = middle.Translated(vtrans); + myPosition = curpos; + myAutomaticPosition = Standard_True; + } + + else { + + curpos = myPosition; + Standard_Real pcurpos = ElCLib::Parameter(thelin->Lin() ,curpos); + Standard_Real dist = thelin->Lin().Distance(curpos); + gp_Pnt proj = ElCLib::Value( pcurpos, thelin->Lin()); + gp_Vec trans; + Standard_Real confusion(Precision::Confusion()); + if ( dist >= confusion ) { + trans = gp_Vec(proj, curpos); + trans.Normalize(); + } + Standard_Real pf = ElCLib::Parameter(thelin->Lin() ,myFAttach); + Standard_Real pl = ElCLib::Parameter(thelin->Lin() ,mySAttach); + if ( pcurpos <= pf ) { + pcurpos = pf + 1e-5; + curpos = ElCLib::Value( pcurpos, thelin->Lin()); + if ( dist >= confusion ) curpos.Translate(trans*dist); + } + else if ( pcurpos >= pl ) { + pcurpos = pl - 1e-5; + curpos = ElCLib::Value( pcurpos, thelin->Lin()); + if ( dist >= confusion ) curpos.Translate(trans*dist); + } + SetPosition(curpos); + } + + // Display of the presentation + TCollection_ExtendedString vals(" =="); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + myFAttach, + mySAttach, + curpos); + } +} + +// jfa 17/10/2000 +//======================================================================= +//function : ComputeTwoCirclesPresentation +//purpose : Compute the presentation of the 'identic' constraint +// between two circles ( which are equal) +//input : : the circle +// : first extremity of the 1st curve of the constraint +// : last extremity of the 1st curve of the constraint +// : first extremity of the 2nd curve of the constraint +// :last extremity of the 2nd curve of the constraint +//======================================================================= +void PrsDim_IdenticRelation::ComputeTwoCirclesPresentation(const Handle(Prs3d_Presentation)& aPrs, + const Handle(Geom_Circle)& thecirc, + const gp_Pnt& firstp1, + const gp_Pnt& lastp1, + const gp_Pnt& firstp2, + const gp_Pnt& lastp2) +{ + Standard_Real confusion (Precision::Confusion()); + + // Searching of complete circles + Standard_Boolean circ1complete = (firstp1.IsEqual(lastp1, confusion)); + Standard_Boolean circ2complete = (firstp2.IsEqual(lastp2, confusion)); + + myCenter = thecirc->Location(); + Standard_Real aSegSize = thecirc->Radius()/5.0; + Standard_Real rad = M_PI / 5.0; + + // I. Case of 2 complete circles + if ( circ1complete && circ2complete ) + { + if (myAutomaticPosition) + { + Standard_Real pfirst1 = ElCLib::Parameter(thecirc->Circ(), firstp1); + myFAttach = ElCLib::Value(Modulo2PI(pfirst1-rad), thecirc->Circ()); + mySAttach = ElCLib::Value(Modulo2PI(pfirst1+rad), thecirc->Circ()); + + gp_Pnt curpos = ElCLib::Value(pfirst1,thecirc->Circ()); + gp_Vec vtrans(myCenter, curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + curpos.Translate(vtrans); + myPosition = curpos; + } + else ComputeNotAutoCircPresentation(thecirc); + } + + // II. Case of one complete circle and one arc + else if ( (circ1complete && !circ2complete) || (!circ1complete && circ2complete) ) + { + gp_Pnt firstp, lastp; + if ( circ1complete && !circ2complete) + { + firstp = firstp2; + lastp = lastp2; + } + else + { + firstp = firstp1; + lastp = lastp1; + } + + if (myAutomaticPosition) + { + ComputeAutoArcPresentation(thecirc, firstp, lastp); + } + else + { + ComputeNotAutoArcPresentation(thecirc, firstp, lastp); + } + } + + // III and IV. Case of two arcs + else if ( !circ1complete && !circ2complete ) + { + // We project all the points on the circle + Standard_Real pf1, pf2, pl1, pl2; + pf1 = ElCLib::Parameter(thecirc->Circ(), firstp1); + pf2 = ElCLib::Parameter(thecirc->Circ(), firstp2); + pl1 = ElCLib::Parameter(thecirc->Circ(), lastp1); + pl2 = ElCLib::Parameter(thecirc->Circ(), lastp2); + + // III. Arcs with common ends + // III.1. First of one and last of another + if ( IsEqual2PI(pl1,pf2,confusion) || IsEqual2PI(pf1,pl2,confusion) ) + { + gp_Pnt curpos(0.,0.,0.); + Standard_Real att=0.; + if ( IsEqual2PI(pl1,pf2,confusion) ) + { + att = pl1; + curpos = lastp1; + } + else if ( IsEqual2PI(pf1,pl2,confusion) ) + { + att = pf1; + curpos = firstp1; + } + Standard_Real maxrad = Min(Modulo2PI(pl1 - pf1),Modulo2PI(pl2 - pf2))*3/4; + if ( rad > maxrad ) rad = maxrad; + Standard_Real pFAttach = Modulo2PI(att - rad); + Standard_Real pSAttach = Modulo2PI(att + rad); + myFAttach = ElCLib::Value(pFAttach, thecirc->Circ()); + mySAttach = ElCLib::Value(pSAttach, thecirc->Circ()); + if ( myAutomaticPosition ) + { + gp_Vec vtrans(myCenter,curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + curpos.Translate(vtrans); + myPosition = curpos; + } + } + // III.2. Two first or two last + else if ( IsEqual2PI(pf1,pf2,confusion) || IsEqual2PI(pl1,pl2,confusion) ) + { + Standard_Real l1 = Modulo2PI(pl1 - pf1); + Standard_Real l2 = Modulo2PI(pl2 - pf2); + gp_Pnt firstp,lastp; + if ( l1 < l2 ) + { + firstp = firstp1; + lastp = lastp1; + } + else + { + firstp = firstp2; + lastp = lastp2; + } + + if ( myAutomaticPosition ) + { + ComputeAutoArcPresentation(thecirc, firstp, lastp); + } + else + { + ComputeNotAutoArcPresentation(thecirc, firstp, lastp); + } + } + // IV. All others arcs (without common ends) + else + { + // order the parameters; first will be pf1 + Standard_Real pl1m = Modulo2PI(pl1 - pf1); + Standard_Real pf2m = Modulo2PI(pf2 - pf1); + Standard_Real pl2m = Modulo2PI(pl2 - pf1); + + Standard_Boolean case1 = Standard_False; + // 1 - not intersecting arcs + // 2 - intersecting arcs, but one doesn't contain another + // 3a - first arc contains the second one + // 3b - second arc contains the first one + // 4 - two intersections + + gp_Pnt firstp, lastp; + + if ( pl1m < pf2m ) // 1 or 2b or 3b + { + if ( pl1m < pl2m ) // 1 or 3b + { + if ( pl2m < pf2m ) // 3b + { + firstp = firstp1; + lastp = lastp1; + } + else // 1 + { + case1 = Standard_True; + Standard_Real deltap1 = Modulo2PI(pf1 - pl2); + Standard_Real deltap2 = Modulo2PI(pf2 - pl1); + if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || + ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 + { + firstp = lastp1; + lastp = firstp2; + } + else // deltap1 + { + firstp = lastp2; + lastp = firstp1; + } + } + } + else // 2b + { + firstp = firstp1; + lastp = lastp2; + } + } + else // 2a or 3a or 4 + { + if ( pl1m < pl2m ) // 2a + { + firstp = firstp2; + lastp = lastp1; + } + else // 3a or 4 + { + if ( pl2m > pf2m ) // 3a + { + firstp = firstp2; + lastp = lastp2; + } + else // 4 + { + Standard_Real deltap1 = Modulo2PI(pl1 - pf2); + Standard_Real deltap2 = Modulo2PI(pl2 - pf1); + if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || + ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 + { + firstp = firstp1; + lastp = lastp2; + } + else // deltap1 + { + firstp = firstp2; + lastp = lastp1; + } + } + } + } + + if ( myAutomaticPosition ) + { + ComputeAutoArcPresentation(thecirc,firstp,lastp,case1); + } + else + { + if ( case1 ) + { + myFAttach = firstp; + mySAttach = lastp; + } + else ComputeNotAutoArcPresentation(thecirc, firstp, lastp); + } + } + } + + // Display of the presentation + TCollection_ExtendedString vals(" =="); + gp_Pnt attach = myPosition; + ComputeAttach(thecirc->Circ(),myFAttach,mySAttach,attach); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + myPlane->Pln().Position().Ax2(), + myCenter, + myFAttach, + mySAttach, + myPosition, + attach); +} + +//======================================================================= +//function : ComputeAutoArcPresentation +//purpose : Compute the presentation of the constraint where we are +// not in the case of dragging. +//======================================================================= +void PrsDim_IdenticRelation::ComputeAutoArcPresentation(const Handle(Geom_Circle)& thecirc, + const gp_Pnt& firstp, + const gp_Pnt& lastp, + const Standard_Boolean isstatic) +{ + Standard_Real aSegSize = thecirc->Radius()/5.0; + Standard_Real rad = M_PI / 5.0; + + Standard_Real pFA = ElCLib::Parameter(thecirc->Circ(),firstp); + Standard_Real pSA = ElCLib::Parameter(thecirc->Circ(),lastp); + Standard_Real maxrad = Modulo2PI(pSA - pFA)/2.0; + + if ( (rad > maxrad) || isstatic ) rad = maxrad; + Standard_Real pmiddle = Modulo2PI(pFA + Modulo2PI(pSA - pFA)/2.0); + + myFAttach = ElCLib::Value(Modulo2PI(pmiddle - rad),thecirc->Circ()); + mySAttach = ElCLib::Value(Modulo2PI(pmiddle + rad),thecirc->Circ()); + + gp_Pnt curpos = ElCLib::Value(pmiddle,thecirc->Circ()); + gp_Vec vtrans(myCenter, curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + myPosition = curpos.Translated(vtrans); +} + +//======================================================================= +//function : ComputeNotAutoCircPresentation +//purpose : Compute the presentation of the constraint where we are +// in the case of dragging. +// Note : This function is to be used only in the case of full circles. +// The symbol of the constraint moves together with arc +// representing the constraint around all the circle. +//======================================================================= +void PrsDim_IdenticRelation::ComputeNotAutoCircPresentation(const Handle(Geom_Circle)& thecirc) +{ + gp_Pnt curpos = myPosition; + + Handle(Geom_Circle) cirNotAuto = new Geom_Circle(thecirc->Circ()); + + // Case of confusion between the current position and the center + // of the circle -> we move the current position + Standard_Real confusion (Precision::Confusion()); + if ( myCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(myCenter, myFAttach); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + + Standard_Real rad = M_PI / 5.0; + Standard_Real pcurpos = ElCLib::Parameter(cirNotAuto->Circ(),curpos); + Standard_Real pFAttach = pcurpos - rad; + Standard_Real pSAttach = pcurpos + rad; + myFAttach = ElCLib::Value(pFAttach,cirNotAuto->Circ()); + mySAttach = ElCLib::Value(pSAttach,cirNotAuto->Circ()); +} + +//======================================================================= +//function : ComputeNotAutoArcPresentation +//purpose : Compute the presentation of the constraint where we are +// in the case of dragging. +// Note : This function is to be used only in the case of circles. +// The symbol of the constraint moves only between myFAttach +// and mySAttach. +//======================================================================= +void PrsDim_IdenticRelation::ComputeNotAutoArcPresentation(const Handle(Geom_Circle)& thecirc, + const gp_Pnt& pntfirst, + const gp_Pnt& pntlast) +{ + gp_Pnt curpos = myPosition; + + gp_Circ cirNotAuto = thecirc->Circ(); + + Standard_Real pFPnt = ElCLib::Parameter(cirNotAuto, pntfirst); + Standard_Real pSPnt = ElCLib::Parameter(cirNotAuto, pntlast); + Standard_Real deltap = Modulo2PI(pSPnt - pFPnt)/2.0; + + Standard_Real rad = M_PI / 5; + if ( deltap < rad ) + { + myFAttach = pntfirst; + mySAttach = pntlast; + } + else + { + gp_Pnt aFPnt = ElCLib::Value(Modulo2PI(pFPnt + rad), cirNotAuto); + gp_Pnt aSPnt = ElCLib::Value(Modulo2PI(pSPnt - rad), cirNotAuto); + + ComputeAttach(cirNotAuto,aFPnt,aSPnt,curpos); + + Standard_Real pcurpos = ElCLib::Parameter(cirNotAuto,curpos); + myFAttach = ElCLib::Value(pcurpos - rad, cirNotAuto); + mySAttach = ElCLib::Value(pcurpos + rad, cirNotAuto); + } +} +// jfa 17/10/2000 end + +// jfa 18/10/2000 +//======================================================================= +//function : ComputeTwoEllipsesPresentation +//purpose : Compute the presentation of the 'identic' constraint +// between two ellipses (which are equal) +//input : : the ellipse +// : first extremity of the 1st curve of the constraint +// : last extremity of the 1st curve of the constraint +// : first extremity of the 2nd curve of the constraint +// :last extremity of the 2nd curve of the constraint +//======================================================================= +void PrsDim_IdenticRelation::ComputeTwoEllipsesPresentation(const Handle(Prs3d_Presentation)& aPrs, + const Handle(Geom_Ellipse)& theEll, + const gp_Pnt& firstp1, + const gp_Pnt& lastp1, + const gp_Pnt& firstp2, + const gp_Pnt& lastp2) +{ + Standard_Real confusion (Precision::Confusion()); + + // Searching of complete ellipses + Standard_Boolean circ1complete = (firstp1.IsEqual(lastp1, confusion)); + Standard_Boolean circ2complete = (firstp2.IsEqual(lastp2, confusion)); + + myCenter = theEll->Location(); + Standard_Real aSegSize = theEll->MajorRadius()/5.0; + Standard_Real rad = M_PI / 5.0; + + // I. Case of 2 complete ellipses + if ( circ1complete && circ2complete ) + { + if (myAutomaticPosition) + { + Standard_Real pfirst1 = ElCLib::Parameter(theEll->Elips(), firstp1); + myFAttach = ElCLib::Value(Modulo2PI(pfirst1-rad), theEll->Elips()); + mySAttach = ElCLib::Value(Modulo2PI(pfirst1+rad), theEll->Elips()); + + gp_Pnt curpos = ElCLib::Value(pfirst1,theEll->Elips()); + gp_Vec vtrans(myCenter, curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + curpos.Translate(vtrans); + myPosition = curpos; + } + else ComputeNotAutoElipsPresentation(theEll); + } + + // II. Case of one complete circle and one arc + else if ( (circ1complete && !circ2complete) || (!circ1complete && circ2complete) ) + { + gp_Pnt firstp, lastp; + if ( circ1complete && !circ2complete) + { + firstp = firstp2; + lastp = lastp2; + } + else + { + firstp = firstp1; + lastp = lastp1; + } + + if (myAutomaticPosition) + { + ComputeAutoArcPresentation(theEll, firstp, lastp); + } + else + { + ComputeNotAutoArcPresentation(theEll, firstp, lastp); + } + } + + // III and IV. Case of two arcs + else if ( !circ1complete && !circ2complete ) + { + // We project all the points on the circle + Standard_Real pf1, pf2, pl1, pl2; + pf1 = ElCLib::Parameter(theEll->Elips(), firstp1); + pf2 = ElCLib::Parameter(theEll->Elips(), firstp2); + pl1 = ElCLib::Parameter(theEll->Elips(), lastp1); + pl2 = ElCLib::Parameter(theEll->Elips(), lastp2); + + // III. Arcs with common ends + // III.1. First of one and last of another + if ( IsEqual2PI(pl1,pf2,confusion) || IsEqual2PI(pf1,pl2,confusion) ) + { + gp_Pnt curpos; + Standard_Real att=0.; + if ( IsEqual2PI(pl1,pf2,confusion) ) + { + att = pl1; + curpos = lastp1; + } + else if ( IsEqual2PI(pf1,pl2,confusion) ) + { + att = pf1; + curpos = firstp1; + } + Standard_Real maxrad = Min(Modulo2PI(pl1 - pf1),Modulo2PI(pl2 - pf2))*3/4; + if ( rad > maxrad ) rad = maxrad; + Standard_Real pFAttach = Modulo2PI(att - rad); + Standard_Real pSAttach = Modulo2PI(att + rad); + myFAttach = ElCLib::Value(pFAttach, theEll->Elips()); + mySAttach = ElCLib::Value(pSAttach, theEll->Elips()); + if ( myAutomaticPosition ) + { + gp_Vec vtrans(myCenter,curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + curpos.Translate(vtrans); + myPosition = curpos; + } + } + // III.2. Two first or two last + else if ( IsEqual2PI(pf1,pf2,confusion) || IsEqual2PI(pl1,pl2,confusion) ) + { + Standard_Real l1 = Modulo2PI(pl1 - pf1); + Standard_Real l2 = Modulo2PI(pl2 - pf2); + gp_Pnt firstp,lastp; + if ( l1 < l2 ) + { + firstp = firstp1; + lastp = lastp1; + } + else + { + firstp = firstp2; + lastp = lastp2; + } + + if ( myAutomaticPosition ) + { + ComputeAutoArcPresentation(theEll, firstp, lastp); + } + else + { + ComputeNotAutoArcPresentation(theEll, firstp, lastp); + } + } + // IV. All others arcs (without common ends) + else + { + // order the parameters; first will be pf1 + Standard_Real pl1m = Modulo2PI(pl1 - pf1); + Standard_Real pf2m = Modulo2PI(pf2 - pf1); + Standard_Real pl2m = Modulo2PI(pl2 - pf1); + + Standard_Boolean case1 = Standard_False; + // 1 - not intersecting arcs + // 2 - intersecting arcs, but one doesn't contain another + // 3a - first arc contains the second one + // 3b - second arc contains the first one + // 4 - two intersections + + gp_Pnt firstp, lastp; + + if ( pl1m < pf2m ) // 1 or 2b or 3b + { + if ( pl1m < pl2m ) // 1 or 3b + { + if ( pl2m < pf2m ) // 3b + { + firstp = firstp1; + lastp = lastp1; + } + else // 1 + { + case1 = Standard_True; + Standard_Real deltap1 = Modulo2PI(pf1 - pl2); + Standard_Real deltap2 = Modulo2PI(pf2 - pl1); + if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || + ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 + { + firstp = lastp1; + lastp = firstp2; + } + else // deltap1 + { + firstp = lastp2; + lastp = firstp1; + } + } + } + else // 2b + { + firstp = firstp1; + lastp = lastp2; + } + } + else // 2a or 3a or 4 + { + if ( pl1m < pl2m ) // 2a + { + firstp = firstp2; + lastp = lastp1; + } + else // 3a or 4 + { + if ( pl2m > pf2m ) // 3a + { + firstp = firstp2; + lastp = lastp2; + } + else // 4 + { + Standard_Real deltap1 = Modulo2PI(pl1 - pf2); + Standard_Real deltap2 = Modulo2PI(pl2 - pf1); + if ( ((deltap1 < deltap2) && (deltap1 < 2*rad)) || + ((deltap2 < deltap1) && (deltap2 > 2*rad)) ) // deltap2 + { + firstp = firstp1; + lastp = lastp2; + } + else // deltap1 + { + firstp = firstp2; + lastp = lastp1; + } + } + } + } + + if ( myAutomaticPosition ) + { + ComputeAutoArcPresentation(theEll,firstp,lastp,case1); + } + else + { + if ( case1 ) + { + myFAttach = firstp; + mySAttach = lastp; + } + else ComputeNotAutoArcPresentation(theEll, firstp, lastp); + } + } + } + + // Display of the presentation + TCollection_ExtendedString vals(" =="); + gp_Pnt attach = myPosition; + ComputeAttach(theEll->Elips(),myFAttach,mySAttach,attach); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + theEll->Elips(), + myFAttach, + mySAttach, + myPosition, + attach); +} + +//======================================================================= +//function : ComputeAutoArcPresentation +//purpose : Compute the presentation of the constraint where we are +// not in the case of dragging. +//======================================================================= +void PrsDim_IdenticRelation::ComputeAutoArcPresentation(const Handle(Geom_Ellipse)& theEll, + const gp_Pnt& firstp, + const gp_Pnt& lastp, + const Standard_Boolean isstatic) +{ + Standard_Real aSegSize = theEll->MajorRadius()/5.0; + Standard_Real rad = M_PI / 5.0; + + gp_Elips anEll = theEll->Elips(); + + Standard_Real pFA = ElCLib::Parameter(anEll,firstp); + Standard_Real pSA = ElCLib::Parameter(anEll,lastp); + Standard_Real maxrad = Modulo2PI(pSA - pFA)/2.0; + + if ( (rad > maxrad) || isstatic ) rad = maxrad; + Standard_Real pmiddle = Modulo2PI(pFA + Modulo2PI(pSA - pFA)/2.0); + + myFAttach = ElCLib::Value(Modulo2PI(pmiddle - rad),anEll); + mySAttach = ElCLib::Value(Modulo2PI(pmiddle + rad),anEll); + + gp_Pnt curpos = ElCLib::Value(pmiddle,anEll); + gp_Vec vtrans(myCenter, curpos); + vtrans.Normalize(); + vtrans *= aSegSize; + myPosition = curpos.Translated(vtrans); +} + +//======================================================================= +//function : ComputeNotAutoElipsPresentation +//purpose : Compute the presentation of the constraint where we are +// in the case of dragging. +// Note : This function is to be used only in the case of ellipses. +// The symbol of the constraint moves only between myFAttach +// and mySAttach. +//======================================================================= +void PrsDim_IdenticRelation::ComputeNotAutoElipsPresentation(const Handle(Geom_Ellipse)& theEll) +{ + gp_Pnt curpos = myPosition; + + gp_Elips anEll = theEll->Elips(); + + // Case of confusion between the current position and the center + // of the ellipse -> we move the current position + Standard_Real confusion (Precision::Confusion()); + if ( myCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(myCenter, myFAttach); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + + Standard_Real rad = M_PI / 5.0; +// Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); + GeomAPI_ProjectPointOnCurve aProj (curpos, theEll); + Standard_Real pcurpos = aProj.LowerDistanceParameter(); + + Standard_Real pFAttach = pcurpos - rad; + Standard_Real pSAttach = pcurpos + rad; + myFAttach = ElCLib::Value(pFAttach,anEll); + mySAttach = ElCLib::Value(pSAttach,anEll); +} + +//======================================================================= +//function : ComputeNotAutoArcPresentation +//purpose : Compute the presentation of the constraint where we are +// in the case of dragging. +// Note : This function is to be used only in the case of ellipses. +// The symbol of the constraint moves only between myFAttach +// and mySAttach. +//======================================================================= +void PrsDim_IdenticRelation::ComputeNotAutoArcPresentation(const Handle(Geom_Ellipse)& theEll, + const gp_Pnt& pntfirst, + const gp_Pnt& pntlast) +{ + gp_Pnt curpos = myPosition; + + gp_Elips anEll = theEll->Elips(); + + Standard_Real pFPnt = ElCLib::Parameter(anEll, pntfirst); + Standard_Real pSPnt = ElCLib::Parameter(anEll, pntlast); + Standard_Real deltap = Modulo2PI(pSPnt - pFPnt)/2.0; + + Standard_Real rad = M_PI / 5; + if ( deltap < rad ) + { + myFAttach = pntfirst; + mySAttach = pntlast; + } + else + { + gp_Pnt aFPnt = ElCLib::Value(Modulo2PI(pFPnt + rad), anEll); + gp_Pnt aSPnt = ElCLib::Value(Modulo2PI(pSPnt - rad), anEll); + + ComputeAttach(anEll,aFPnt,aSPnt,curpos); + +// Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); + GeomAPI_ProjectPointOnCurve aProj (curpos, theEll); + Standard_Real pcurpos = aProj.LowerDistanceParameter(); + + myFAttach = ElCLib::Value(pcurpos - rad, anEll); + mySAttach = ElCLib::Value(pcurpos + rad, anEll); + } +} +// jfa 18/10/2000 end + +//======================================================================= +//function : ComputeTwoVerticesPresentation +//purpose : +//======================================================================= +void PrsDim_IdenticRelation::ComputeTwoVerticesPresentation(const Handle(Prs3d_Presentation)& aPrs) +{ + Standard_Boolean isOnPlane1, isOnPlane2; + const TopoDS_Vertex& FVertex = TopoDS::Vertex(myFShape); + const TopoDS_Vertex& SVertex = TopoDS::Vertex(mySShape); + + PrsDim::ComputeGeometry(FVertex, myFAttach, myPlane, isOnPlane1); + PrsDim::ComputeGeometry(SVertex, mySAttach, myPlane, isOnPlane2); + + if (isOnPlane1 && isOnPlane2) + myExtShape = 0; + else if ( isOnPlane1 && !isOnPlane2) + myExtShape = 2; + else if (!isOnPlane1 && isOnPlane2) + myExtShape = 1; + else + return ; + + + // The attachement points are the points themselves that must be + //identical + myFAttach = BRep_Tool::Pnt(FVertex); + mySAttach = myFAttach; + + gp_Pnt curpos; + if (myAutomaticPosition) + { + //Computation of the size of the symbol + Standard_Real symbsize = ComputeSegSize(); + if (symbsize <= Precision::Confusion()) symbsize = 1.; + symbsize*=5; + // Computation of the direction of the segment of the presentation + // we take the median of the edges connected to vertices + gp_Dir dF, dS; + gp_Dir myDir; + TColStd_ListIteratorOfListOfTransient it(Users()); + if (it.More()) + { + Handle(AIS_Shape) USER (Handle(AIS_Shape)::DownCast(it.Value())); + if (!USER.IsNull()) + { + const TopoDS_Shape& SH =USER->Shape(); + if ( (!SH.IsNull()) && (SH.ShapeType() == TopAbs_WIRE) ) + { + const TopoDS_Wire& WIRE = TopoDS::Wire(USER->Shape()); + Standard_Boolean done = ComputeDirection(WIRE,FVertex,dF); + if (!done) return; + done = ComputeDirection(WIRE,SVertex,dS); + if (!done) return; + } + else return; + } + else return; + + // computation of the segment direction like average + // of the 2 computed directions. + if ( dF.IsParallel(dS, Precision::Angular()) ) + { + myDir = dF.Crossed(myPlane->Pln().Axis().Direction()); + } + else + { + myDir.SetXYZ(dF.XYZ() + dS.XYZ()); + } + curpos = myFAttach.Translated(gp_Vec(myDir)*symbsize) ; + } +// jfa 11/10/2000 + else + { + curpos = myFAttach; + } +// jfa 11/10/2000 end + + myPosition = curpos; + myAutomaticPosition = Standard_False; + } + else + { + curpos = myPosition; + } + + // Presentation computation + TCollection_ExtendedString vals(" ++"); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + myFAttach, + curpos); + // Calculate the projection of vertex + if ( myExtShape == 1) + ComputeProjVertexPresentation(aPrs,FVertex,myFAttach); + else if ( myExtShape == 2) + ComputeProjVertexPresentation(aPrs,SVertex,mySAttach); +} + + + +//======================================================================= +//function : ComputeSegSize +//purpose : +//======================================================================= +Standard_Real PrsDim_IdenticRelation::ComputeSegSize() const +{ + return 1.; +} + +//======================================================================= +//function : ComputeDirection +//purpose : Compute a direction according to the different geometric +// elements connected to the vertex , in way to not have +// overlap between the symbol and them. +//======================================================================= +Standard_Boolean PrsDim_IdenticRelation::ComputeDirection(const TopoDS_Wire& aWire, + const TopoDS_Vertex& VERT, + gp_Dir& dF) const +{ + // we take the median of the edges connected to vertices + TopoDS_Edge edg1,edg2; + ConnectedEdges(aWire,VERT,edg1,edg2); + + if ( edg1.IsNull() && edg2.IsNull() ) { + return Standard_False; + } + + Handle(Geom_Curve) curv1,curv2; + gp_Pnt firstp1,lastp1,firstp2,lastp2; + + // Case with 2 edges connected to the vertex + if ( !edg1.IsNull() && !edg2.IsNull() ) { + if ( !PrsDim::ComputeGeometry(edg1,edg2, + curv1,curv2, + firstp1, lastp1, + firstp2, lastp2,myPlane)) + return Standard_False; + + gp_Dir d1, d2; + if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + d1 = ComputeCircleDirection(Handle(Geom_Circle)::DownCast (curv1), VERT); + } + else if (curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + d1 = ComputeLineDirection(Handle(Geom_Line)::DownCast (curv1), firstp1); + } + else + return Standard_False; + + if ( curv2->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + d2 = ComputeCircleDirection( Handle(Geom_Circle)::DownCast (curv2), VERT); + } + else if (curv2->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + d2 =ComputeLineDirection( Handle(Geom_Line)::DownCast (curv2), firstp2); + } + else + return Standard_False; + + if ( !d1.IsParallel(d2, Precision::Angular() )) + dF.SetXYZ( (d1.XYZ() + d2.XYZ())/2 ); + else { + dF= d1.Crossed(myPlane->Pln().Axis().Direction()); + } + } + + // Case where is at an extremity of a wire. + else { + TopoDS_Edge VEdge; + if ( !edg1.IsNull() ) + VEdge = edg1; + else if (!edg2.IsNull() ) + VEdge = edg2; + else + return Standard_False; + + if ( !PrsDim::ComputeGeometry(VEdge, curv1, firstp1, lastp1) ) + return Standard_False; + if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + dF = ComputeCircleDirection( Handle(Geom_Circle)::DownCast (curv1), VERT); + } + else if (curv1->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + dF = ComputeLineDirection( Handle(Geom_Line)::DownCast (curv1), firstp1); + } + else + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputeLineDirection +//purpose : +//======================================================================= +gp_Dir PrsDim_IdenticRelation::ComputeLineDirection(const Handle(Geom_Line)& lin, + const gp_Pnt& firstP) const +{ + gp_Dir dir; + dir = lin->Lin().Direction(); + if ( !myFAttach.IsEqual(firstP, Precision::Confusion()) ) + dir.Reverse(); + return dir; +} + +//======================================================================= +//function : ComputeCircleDirection +//purpose : +//======================================================================= +gp_Dir PrsDim_IdenticRelation::ComputeCircleDirection(const Handle(Geom_Circle)& circ, + const TopoDS_Vertex& VERT) const +{ + gp_Vec V(circ->Location(),BRep_Tool::Pnt(VERT)); + return gp_Dir(V); +} + +//======================================================================= +//function : ComputeOneEdgeOVertexPresentation +//purpose : +//======================================================================= +void PrsDim_IdenticRelation::ComputeOneEdgeOVertexPresentation(const Handle(Prs3d_Presentation)& aPrs) +{ + TopoDS_Vertex V; + TopoDS_Edge E; + Standard_Integer numedge; + + if (myFShape.ShapeType() == TopAbs_VERTEX) { + V = TopoDS::Vertex(myFShape); + E = TopoDS::Edge(mySShape); + numedge = 2;// edge = 2nd shape + } + else { + V = TopoDS::Vertex(mySShape); + E = TopoDS::Edge(myFShape); + numedge = 1; // edge = 1st shape + } + gp_Pnt ptonedge1,ptonedge2; + Handle(Geom_Curve) aCurve; + Handle(Geom_Curve) extCurv; + Standard_Boolean isInfinite; + Standard_Boolean isOnPlanEdge, isOnPlanVertex; + if (!PrsDim::ComputeGeometry(E,aCurve,ptonedge1,ptonedge2,extCurv,isInfinite,isOnPlanEdge,myPlane)) + return; + aPrs->SetInfiniteState(isInfinite); + PrsDim::ComputeGeometry(V, myFAttach, myPlane, isOnPlanVertex); + + // only the curve can be projected + if (!isOnPlanEdge && !isOnPlanVertex) return; + + if (!isOnPlanEdge) { + if (numedge == 1) myExtShape = 1; + else myExtShape = 2; + } + else if (!isOnPlanVertex) { + if (numedge == 1) myExtShape = 2; + else myExtShape = 1; + } + // The attachement points are the point + myFAttach = BRep_Tool::Pnt(V); + mySAttach = myFAttach; + + gp_Pnt curpos; + if (myAutomaticPosition) { + //Computation of the size of the symbol + Standard_Real symbsize = ComputeSegSize(); + symbsize*=5; + // Computation of the direction of the segment of the presentation + // we take the median of the edges connected to vertices + gp_Dir myDir; + if ( aCurve->IsKind(STANDARD_TYPE(Geom_Line))) { + myDir = Handle(Geom_Line)::DownCast (aCurve)->Lin().Direction(); + myDir.Cross(myPlane->Pln().Axis().Direction()); + } + else if (aCurve->IsKind(STANDARD_TYPE(Geom_Circle))) { + Handle(Geom_Circle) CIR = Handle(Geom_Circle)::DownCast (aCurve); + myDir.SetXYZ(myFAttach.XYZ() - CIR->Location().XYZ()); + } + // jfa 10/10/2000 + else if (aCurve->IsKind(STANDARD_TYPE(Geom_Ellipse))) { + Handle(Geom_Ellipse) CIR = Handle(Geom_Ellipse)::DownCast (aCurve); + myDir.SetXYZ(myFAttach.XYZ() - CIR->Location().XYZ()); + } + // jfa 10/10/2000 end + + curpos = myFAttach.Translated(gp_Vec(myDir)*symbsize) ; + myPosition = curpos; + myAutomaticPosition = Standard_True; + } + else { + curpos = myPosition; + } + + // Presentation computation + TCollection_ExtendedString vals(" -+-"); + DsgPrs_IdenticPresentation::Add(aPrs, + myDrawer, + vals, + myFAttach, + curpos); + if (myExtShape != 0) { + if (!extCurv.IsNull()) { // the edge is not in the WP + ComputeProjEdgePresentation(aPrs,E,Handle(Geom_Line)::DownCast (aCurve),ptonedge1,ptonedge2); + } + } +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_IdenticRelation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_IdenticRelation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_IdenticRelation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_IdenticRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,124 @@ +// Created on: 1997-03-03 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_IdenticRelation_HeaderFile +#define _PrsDim_IdenticRelation_HeaderFile + +#include +#include +#include +#include +#include + +class TopoDS_Shape; +class Geom_Plane; +class Geom_Line; +class gp_Pnt; +class Geom_Circle; +class Geom_Ellipse; +class TopoDS_Wire; +class TopoDS_Vertex; +class gp_Dir; + +DEFINE_STANDARD_HANDLE(PrsDim_IdenticRelation, PrsDim_Relation) + +//! Constructs a constraint by a relation of identity +//! between two or more datums figuring in shape +//! Interactive Objects. +class PrsDim_IdenticRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_IdenticRelation, PrsDim_Relation) +public: + + //! Initializes the relation of identity between the two + //! entities, FirstShape and SecondShape. The plane + //! aPlane is initialized in case a visual reference is + //! needed to show identity. + Standard_EXPORT PrsDim_IdenticRelation(const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); + + Standard_Boolean HasUsers() const { return !myUsers.IsEmpty(); } + + const TColStd_ListOfTransient& Users() const { return myUsers; } + + void AddUser (const Handle(Standard_Transient)& theUser) { myUsers.Append (theUser); } + + void ClearUsers() { myUsers.Clear(); } + + //! Returns true if the interactive object is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + +private: + + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeOneEdgeOVertexPresentation (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeTwoEdgesPresentation (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeTwoLinesPresentation (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Geom_Line)& aLin, gp_Pnt& Pnt1On1, gp_Pnt& Pnt2On1, gp_Pnt& Pnt1On2, gp_Pnt& Pnt2On2, const Standard_Boolean isInf1, const Standard_Boolean isInf2); + + Standard_EXPORT void ComputeTwoCirclesPresentation (const Handle(Prs3d_Presentation)& aPresentation, const Handle(Geom_Circle)& aCircle, const gp_Pnt& Pnt1On1, const gp_Pnt& Pnt2On1, const gp_Pnt& Pnt1On2, const gp_Pnt& Pnt2On2); + + //! Computes the presentation of the identic constraint + //! between 2 arcs in the case of automatic presentation + Standard_EXPORT void ComputeAutoArcPresentation (const Handle(Geom_Circle)& aCircle, const gp_Pnt& firstp, const gp_Pnt& lastp, const Standard_Boolean isstatic = Standard_False); + + //! Computes the presentation of the identic constraint + //! between 2 circles in the case of non automatic presentation + Standard_EXPORT void ComputeNotAutoCircPresentation (const Handle(Geom_Circle)& aCircle); + + //! Computes the presentation of the identic constraint + //! between 2 arcs in the case of non automatic presentation + Standard_EXPORT void ComputeNotAutoArcPresentation (const Handle(Geom_Circle)& aCircle, const gp_Pnt& pntfirst, const gp_Pnt& pntlast); + + Standard_EXPORT void ComputeTwoEllipsesPresentation (const Handle(Prs3d_Presentation)& aPrs, const Handle(Geom_Ellipse)& anEll, const gp_Pnt& Pnt1On1, const gp_Pnt& Pnt2On1, const gp_Pnt& Pnt1On2, const gp_Pnt& Pnt2On2); + + //! Computes the presentation of the identic constraint + //! between 2 arcs in the case of automatic presentation + Standard_EXPORT void ComputeAutoArcPresentation (const Handle(Geom_Ellipse)& theEll, const gp_Pnt& firstp, const gp_Pnt& lastp, const Standard_Boolean isstatic = Standard_False); + + //! Computes the presentation of the identic constraint + //! between 2 ellipses in the case of non automatic presentation + Standard_EXPORT void ComputeNotAutoElipsPresentation (const Handle(Geom_Ellipse)& theEll); + + //! Computes the presentation of the identic constraint + //! between 2 arcs in the case of non automatic presentation + Standard_EXPORT void ComputeNotAutoArcPresentation (const Handle(Geom_Ellipse)& theEll, const gp_Pnt& pntfirst, const gp_Pnt& pntlast); + + Standard_EXPORT void ComputeTwoVerticesPresentation (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT Standard_Real ComputeSegSize() const; + + Standard_EXPORT Standard_Boolean ComputeDirection (const TopoDS_Wire& aWire, const TopoDS_Vertex& aVertex, gp_Dir& aDir) const; + + Standard_EXPORT gp_Dir ComputeLineDirection (const Handle(Geom_Line)& aLin, const gp_Pnt& anExtremity) const; + + Standard_EXPORT gp_Dir ComputeCircleDirection (const Handle(Geom_Circle)& aCirc, const TopoDS_Vertex& ConnectedVertex) const; + +private: + + TColStd_ListOfTransient myUsers; + Standard_Boolean isCircle; + gp_Pnt myFAttach; + gp_Pnt mySAttach; + gp_Pnt myCenter; + +}; + +#endif // _PrsDim_IdenticRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_KindOfDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_KindOfDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_KindOfDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_KindOfDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,40 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_KindOfDimension_HeaderFile +#define _PrsDim_KindOfDimension_HeaderFile + +//! Declares the kinds of dimensions needed in the +//! display of Interactive Objects. +enum PrsDim_KindOfDimension +{ + PrsDim_KOD_NONE, + PrsDim_KOD_LENGTH, + PrsDim_KOD_PLANEANGLE, + PrsDim_KOD_SOLIDANGLE, + PrsDim_KOD_AREA, + PrsDim_KOD_VOLUME, + PrsDim_KOD_MASS, + PrsDim_KOD_TIME, + PrsDim_KOD_RADIUS, + PrsDim_KOD_DIAMETER, + PrsDim_KOD_CHAMF2D, + PrsDim_KOD_CHAMF3D, + PrsDim_KOD_OFFSET, + PrsDim_KOD_ELLIPSERADIUS +}; + +#endif // _PrsDim_KindOfDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_KindOfRelation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_KindOfRelation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_KindOfRelation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_KindOfRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,33 @@ +// Created on: 2016-11-25 +// Copyright (c) 2016 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_KindOfRelation_HeaderFile +#define _PrsDim_KindOfRelation_HeaderFile + +enum PrsDim_KindOfRelation +{ + PrsDim_KOR_NONE = 0, + PrsDim_KOR_CONCENTRIC, + PrsDim_KOR_EQUALDISTANCE, + PrsDim_KOR_EQUALRADIUS, + PrsDim_KOR_FIX, + PrsDim_KOR_IDENTIC, + PrsDim_KOR_OFFSET, + PrsDim_KOR_PARALLEL, + PrsDim_KOR_PERPENDICULAR, + PrsDim_KOR_TANGENT, + PrsDim_KOR_SYMMETRIC +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_KindOfSurface.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_KindOfSurface.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_KindOfSurface.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_KindOfSurface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,32 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_KindOfSurface_HeaderFile +#define _PrsDim_KindOfSurface_HeaderFile + +enum PrsDim_KindOfSurface +{ + PrsDim_KOS_Plane, + PrsDim_KOS_Cylinder, + PrsDim_KOS_Cone, + PrsDim_KOS_Sphere, + PrsDim_KOS_Torus, + PrsDim_KOS_Revolution, + PrsDim_KOS_Extrusion, + PrsDim_KOS_OtherSurface +}; + +#endif // _PrsDim_KindOfSurface_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_LengthDimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_LengthDimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_LengthDimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_LengthDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,825 @@ +// Created on: 1996-12-05 +// Created by: Arnaud BOUZY/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2013 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_LengthDimension, PrsDim_Dimension) + +//======================================================================= +//function : Constructor +//purpose : Dimension between two faces +//======================================================================= +PrsDim_LengthDimension::PrsDim_LengthDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace) +: PrsDim_Dimension (PrsDim_KOD_LENGTH), + myHasCustomDirection (Standard_False) +{ + SetMeasuredGeometry (theFirstFace, theSecondFace); + SetFlyout (15.0); +} + +//======================================================================= +//function : Constructor +//purpose : Dimension between two shape +//======================================================================= +PrsDim_LengthDimension::PrsDim_LengthDimension (const TopoDS_Face& theFace, + const TopoDS_Edge& theEdge) +: PrsDim_Dimension (PrsDim_KOD_LENGTH), + myHasCustomDirection (Standard_False) +{ + SetMeasuredGeometry (theFace, theEdge); + SetFlyout (15.0); +} + +//======================================================================= +//function : Constructor +//purpose : Dimension between two points +//======================================================================= +PrsDim_LengthDimension::PrsDim_LengthDimension (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pln& thePlane) +: PrsDim_Dimension (PrsDim_KOD_LENGTH), + myHasCustomDirection (Standard_False) +{ + SetMeasuredGeometry (theFirstPoint, theSecondPoint, thePlane); + SetFlyout (15.0); +} + +//======================================================================= +//function : Constructor +//purpose : Dimension between two shape +//======================================================================= +PrsDim_LengthDimension::PrsDim_LengthDimension (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape, + const gp_Pln& thePlane) +: PrsDim_Dimension (PrsDim_KOD_LENGTH), + myHasCustomDirection (Standard_False) +{ + SetCustomPlane (thePlane); + SetMeasuredShapes (theFirstShape, theSecondShape); + SetFlyout (15.0); +} + +//======================================================================= +//function : Constructor +//purpose : Dimension of one edge +//======================================================================= +PrsDim_LengthDimension::PrsDim_LengthDimension (const TopoDS_Edge& theEdge, + const gp_Pln& thePlane) +: PrsDim_Dimension (PrsDim_KOD_LENGTH), + myHasCustomDirection (Standard_False) +{ + SetMeasuredGeometry (theEdge, thePlane); + SetFlyout (15.0); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetMeasuredGeometry (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pln& thePlane) +{ + myFirstPoint = theFirstPoint; + mySecondPoint = theSecondPoint; + myFirstShape = BRepLib_MakeVertex (myFirstPoint); + mySecondShape = BRepLib_MakeVertex (mySecondPoint); + myGeometryType = GeometryType_Points; + SetCustomPlane (thePlane); + myIsGeometryValid = IsValidPoints (theFirstPoint, theSecondPoint); + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetMeasuredGeometry (const TopoDS_Edge& theEdge, + const gp_Pln& thePlane) +{ + myFirstShape = theEdge; + mySecondShape = TopoDS_Shape(); + myGeometryType = GeometryType_Edge; + SetCustomPlane (thePlane); + myIsGeometryValid = InitOneShapePoints (myFirstShape); + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace) +{ + SetMeasuredShapes (theFirstFace, theSecondFace); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetMeasuredGeometry (const TopoDS_Face& theFace, + const TopoDS_Edge& theEdge) +{ + SetMeasuredShapes (theFace, theEdge); +} + +//======================================================================= +//function : SetMeasuredShapes +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetMeasuredShapes (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape) +{ + gp_Pln aComputedPlane; + Standard_Boolean isPlaneReturned = Standard_False; + + myFirstShape = theFirstShape; + mySecondShape = theSecondShape; + myIsGeometryValid = InitTwoShapesPoints (myFirstShape, mySecondShape, aComputedPlane, isPlaneReturned); + + if (myIsGeometryValid && !myIsPlaneCustom) + { + if (isPlaneReturned) + { + myPlane = aComputedPlane; + } + else + { + myIsGeometryValid = Standard_False; + } + } + + SetToUpdate(); +} + +//======================================================================= +//function : CheckPlane +//purpose : +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::CheckPlane (const gp_Pln& thePlane) const +{ + Standard_Boolean anIsFaultyNormal = + thePlane.Axis().Direction().IsParallel(gce_MakeDir (myFirstPoint, mySecondPoint), Precision::Angular()); + + if ((!thePlane.Contains (myFirstPoint, Precision::Confusion()) && !thePlane.Contains (mySecondPoint, Precision::Confusion())) + || anIsFaultyNormal) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputePlane +//purpose : +//======================================================================= +gp_Pln PrsDim_LengthDimension::ComputePlane (const gp_Dir& theAttachDir) const +{ + if (!IsValidPoints (myFirstPoint, mySecondPoint)) + { + return gp_Pln(); + } + + gp_Pnt aThirdPoint (myFirstPoint.Translated (gp_Vec(theAttachDir))); + gce_MakePln aPlaneConstrustor (myFirstPoint, mySecondPoint, aThirdPoint); + return aPlaneConstrustor.Value(); +} + +//======================================================================= +//function : GetModelUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_LengthDimension::GetModelUnits() const +{ + return myDrawer->DimLengthModelUnits(); +} + +//======================================================================= +//function : GetDisplayUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_LengthDimension::GetDisplayUnits() const +{ + return myDrawer->DimLengthDisplayUnits(); +} + +//======================================================================= +//function : SetModelUnits +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetModelUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthModelUnits (theUnits); +} + +//======================================================================= +//function : SetDisplayUnits +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthDisplayUnits (theUnits); +} + +//======================================================================= +//function : ComputeValue +//purpose : +//======================================================================= +Standard_Real PrsDim_LengthDimension::ComputeValue() const +{ + if (!IsValid()) + return 0.0; + + if (!myHasCustomDirection) + return myFirstPoint.Distance (mySecondPoint); + + return fabs (gp_Vec(myFirstPoint, mySecondPoint).Dot (myDirection)); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_LengthDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) +{ + mySelectionGeom.Clear (theMode); + + if (!IsValid()) + { + return; + } + + DrawLinearDimension (thePresentation, theMode, myFirstPoint, mySecondPoint); +} + + //======================================================================= +//function : ComputeFlyoutLinePoints +//purpose : +//======================================================================= +void PrsDim_LengthDimension::ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, + gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) +{ + if (!myHasCustomDirection) + { + PrsDim_Dimension::ComputeFlyoutLinePoints (theFirstPoint, theSecondPoint, theLineBegPoint, theLineEndPoint); + return; + } + + // find scalar of projection target vector (from start to second point) to flyout vector + gp_Ax1 aPlaneNormal = GetPlane().Axis(); + gp_Vec aFlyoutNormalizedDir(aPlaneNormal.Direction() ^ myDirection); + aFlyoutNormalizedDir.Normalize(); + Standard_Real aTargetProjectedToFlyout = gp_Vec(theFirstPoint, theSecondPoint).Dot (aFlyoutNormalizedDir); + + gp_Dir aFlyoutVector = aFlyoutNormalizedDir; + // create lines for layouts + gp_Lin aLine1 (theFirstPoint, aFlyoutVector); + gp_Lin aLine2 (theSecondPoint, aFlyoutVector); + + // Get flyout end points + theLineBegPoint = ElCLib::Value (ElCLib::Parameter (aLine1, theFirstPoint) + GetFlyout() + aTargetProjectedToFlyout, aLine1); + theLineEndPoint = ElCLib::Value (ElCLib::Parameter (aLine2, theSecondPoint) + GetFlyout(), aLine2); +} + +//======================================================================= +//function : ComputeFlyoutSelection +//purpose : +//======================================================================= +void PrsDim_LengthDimension::ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theEntityOwner) +{ + if (!IsValid()) + { + return; + } + + ComputeLinearFlyouts (theSelection, theEntityOwner, myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : IsValidPoints +//purpose : +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::IsValidPoints (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint) const +{ + return theFirstPoint.Distance (theSecondPoint) > Precision::Confusion(); +} + +//======================================================================= +//function : InitTwoEdgesLength +//purpose : Initialization of dimension between two linear edges +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::InitTwoEdgesLength (const TopoDS_Edge& theFirstEdge, + const TopoDS_Edge& theSecondEdge, + gp_Dir& theDirAttach) +{ + BRepAdaptor_Curve aFirstCurveAdapt (theFirstEdge); + if (aFirstCurveAdapt.GetType() != GeomAbs_Line) + { + return Standard_False; + } + + BRepAdaptor_Curve aSecondCurveAdapt (theSecondEdge); + if (aSecondCurveAdapt.GetType() != GeomAbs_Line) + { + return Standard_False; + } + + Handle(Geom_Curve) aFirstCurve; + Handle(Geom_Curve) aSecondCurve; + + gp_Pnt aPoint11 (gp::Origin()); + gp_Pnt aPoint12 (gp::Origin()); + gp_Pnt aPoint21 (gp::Origin()); + gp_Pnt aPoint22 (gp::Origin()); + Standard_Boolean isFirstInfinite = Standard_False; + Standard_Boolean isSecondInfinite = Standard_False; + + if (!PrsDim::ComputeGeometry (theFirstEdge, theSecondEdge, + aFirstCurve, aSecondCurve, + aPoint11, aPoint12, + aPoint21, aPoint22, + isFirstInfinite, + isSecondInfinite)) + { + return Standard_False; + } + + const Handle(Geom_Line) aFirstLine = Handle(Geom_Line)::DownCast (aFirstCurve); + const Handle(Geom_Line) aSecondLine = Handle(Geom_Line)::DownCast (aSecondCurve); + + if (!aFirstLine->Lin().Direction().IsParallel (aSecondLine->Lin().Direction(),Precision::Angular())) + { + return Standard_False; + } + + theDirAttach = aFirstLine->Lin().Direction(); + + gp_Pnt aPoint; + + if (!isFirstInfinite) + { + if (PrsDim::Nearest (aSecondCurve, aPoint11, aPoint21, aPoint22, aPoint)) + { + myFirstPoint = aPoint11; + mySecondPoint = aPoint; + return IsValidPoints (myFirstPoint, mySecondPoint); + } + else if (PrsDim::Nearest (aSecondCurve, aPoint12, aPoint21, aPoint22, aPoint)) + { + myFirstPoint = aPoint12; + mySecondPoint = aPoint; + return IsValidPoints (myFirstPoint, mySecondPoint); + } + } + + if (!isSecondInfinite) + { + if (PrsDim::Nearest (aFirstCurve, aPoint21, aPoint11, aPoint12, aPoint)) + { + myFirstPoint = aPoint; + mySecondPoint = aPoint21; + return IsValidPoints (myFirstPoint, mySecondPoint); + } + if (PrsDim::Nearest (aFirstCurve, aPoint22, aPoint11, aPoint12, aPoint)) + { + myFirstPoint = aPoint; + mySecondPoint = aPoint22; + return IsValidPoints (myFirstPoint, mySecondPoint); + } + } + + GeomAPI_ExtremaCurveCurve anExtrema (aFirstCurve, aSecondCurve); + anExtrema.NearestPoints (myFirstPoint, mySecondPoint); + return IsValidPoints (myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : InitEdgeVertexLength +//purpose : for first edge and second vertex shapes +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::InitEdgeVertexLength (const TopoDS_Edge& theEdge, + const TopoDS_Vertex& theVertex, + gp_Dir& theEdgeDir, + Standard_Boolean isInfinite) +{ + gp_Pnt anEdgePoint1 (gp::Origin()); + gp_Pnt anEdgePoint2 (gp::Origin()); + Handle(Geom_Curve) aCurve; + + if (!PrsDim::ComputeGeometry (theEdge, aCurve, anEdgePoint1, anEdgePoint2, isInfinite)) + { + return Standard_False; + } + + myFirstPoint = BRep_Tool::Pnt (theVertex); + + Handle(Geom_Line) aGeomLine (Handle(Geom_Line)::DownCast (aCurve)); + const gp_Lin& aLin = aGeomLine->Lin(); + + // Get direction of edge to build plane automatically. + theEdgeDir = aLin.Direction(); + + mySecondPoint = PrsDim::Nearest (aLin, myFirstPoint); + + return IsValidPoints (myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : InitEdgeFaceLength +//purpose : +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::InitEdgeFaceLength (const TopoDS_Edge& theEdge, + const TopoDS_Face& theFace, + gp_Dir& theEdgeDir) +{ + theEdgeDir = gp::DX(); + + // Find attachment points (closest distance between the edge and the face) + BRepExtrema_DistShapeShape aDistAdaptor (theEdge, theFace, Extrema_ExtFlag_MIN); + if (!aDistAdaptor.IsDone() || aDistAdaptor.NbSolution() <1) + { + return Standard_False; + } + myFirstPoint = aDistAdaptor.PointOnShape1 (1); + mySecondPoint = aDistAdaptor.PointOnShape2 (1); + + // Take direction for dimension line (will be orthogonalized later) parallel to edge + BRepAdaptor_Curve aCurveAdaptor (theEdge); + Standard_Real aParam; + if (aDistAdaptor.SupportOnShape1 (1).ShapeType() == TopAbs_EDGE) + { + aDistAdaptor.ParOnEdgeS1 (1, aParam); + } + else + { + Standard_Real aD1 = aCurveAdaptor.Value(aCurveAdaptor.FirstParameter()).SquareDistance (myFirstPoint); + Standard_Real aD2 = aCurveAdaptor.Value(aCurveAdaptor.LastParameter()).SquareDistance (myFirstPoint); + aParam = (aD1 < aD2 ? aCurveAdaptor.FirstParameter() : aCurveAdaptor.LastParameter()); + } + gp_Pnt aP; + gp_Vec aV; + aCurveAdaptor.D1 (aParam, aP, aV); + if (aV.SquareMagnitude() > gp::Resolution()) + { + theEdgeDir = aV; + } + + // reverse direction if parameter is close to the end of the curve, + // to reduce chances to have overlapping between dimension line and edge + if (Abs (aParam - aCurveAdaptor.FirstParameter()) < Abs (aParam - aCurveAdaptor.LastParameter())) + { + theEdgeDir.Reverse(); + } + + return IsValidPoints (myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : InitTwoShapesPoints +//purpose : Initialization of two points where dimension layouts +// will be attached +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::InitTwoShapesPoints (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape, + gp_Pln& theComputedPlane, + Standard_Boolean& theIsPlaneComputed) +{ + theIsPlaneComputed = Standard_False; + gp_Dir aDirAttach; + Standard_Boolean isInfinite = Standard_False; + Standard_Boolean isSuccess = Standard_False; + switch (theFirstShape.ShapeType()) + { + case TopAbs_FACE: + { + // Initialization for face + gp_Pln aFirstPlane; + Handle(Geom_Surface) aFirstSurface; + PrsDim_KindOfSurface aFirstSurfKind; + Standard_Real aFirstOffset; + + TopoDS_Face aFirstFace = TopoDS::Face (theFirstShape); + + PrsDim::InitFaceLength (TopoDS::Face (theFirstShape), + aFirstPlane, + aFirstSurface, + aFirstSurfKind, + aFirstOffset); + + if (theSecondShape.ShapeType() == TopAbs_FACE) + { + // Initialization for face + myGeometryType = GeometryType_Faces; + gp_Pln aSecondPlane; + Handle(Geom_Surface) aSecondSurface; + PrsDim_KindOfSurface aSecondSurfKind; + Standard_Real aSecondOffset; + + TopoDS_Face aSecondFace = TopoDS::Face (theSecondShape); + + PrsDim::InitFaceLength (aSecondFace, + aSecondPlane, + aSecondSurface, + aSecondSurfKind, + aSecondOffset); + + if (aFirstSurfKind == PrsDim_KOS_Plane) + { + if (!aFirstPlane.Axis().Direction().IsParallel (aSecondPlane.Axis().Direction(), Precision::Angular())) + { + return Standard_False; + } + + TopExp_Explorer anExplorer (theFirstShape, TopAbs_VERTEX); + + // In case of infinite planes + if (!anExplorer.More()) + { + myFirstPoint = aFirstPlane.Location(); + } + else + { + myFirstPoint = BRep_Tool::Pnt (TopoDS::Vertex (anExplorer.Current())); + } + + mySecondPoint = PrsDim::ProjectPointOnPlane (myFirstPoint, aSecondPlane); + + Standard_Real anU, aV; + ElSLib::Parameters (aSecondPlane, mySecondPoint, anU, aV); + + BRepTopAdaptor_FClass2d aClassifier (aSecondFace, Precision::Confusion()); + TopAbs_State aState = aClassifier.Perform (gp_Pnt2d (anU, aV), Standard_False); + + if (aState == TopAbs_OUT || aState == TopAbs_UNKNOWN) + { + mySecondPoint = PrsDim::Nearest (aSecondFace, myFirstPoint); + } + + isSuccess = IsValidPoints (myFirstPoint, mySecondPoint); + if (isSuccess) + { + theComputedPlane = ComputePlane (aFirstPlane.Position().XDirection()); + theIsPlaneComputed = Standard_True; + } + } + else // curvilinear faces + { + Standard_Real aU1Min, aV1Min, aU1Max, aV1Max; + Standard_Real aU2Min, aV2Min, aU2Max, aV2Max; + BRepTools::UVBounds (aFirstFace, aU1Min, aU1Max, aV1Min, aV1Max); + BRepTools::UVBounds (aSecondFace, aU2Min, aU2Max, aV2Min, aV2Max); + + GeomAPI_ExtremaSurfaceSurface anExtrema (aFirstSurface, aSecondSurface, + aU1Min, aU1Max, aV1Min, aV1Max, + aU2Min, aU2Max, aV2Min, aV2Max); + + Standard_Real aU1, aV1, aU2, aV2; + anExtrema.LowerDistanceParameters (aU1, aV1, aU2, aV2); + myFirstPoint = BRep_Tool::Surface (aFirstFace)->Value (aU1, aV1); + mySecondPoint = BRep_Tool::Surface (aSecondFace)->Value (aU2, aV2); + + // Adjust automatic plane + gp_Ax2 aLocalAxes (myFirstPoint, gce_MakeDir (myFirstPoint, mySecondPoint)); + aDirAttach = gce_MakeDir (aLocalAxes.XDirection ()); + + // Check points + isSuccess = IsValidPoints (myFirstPoint, mySecondPoint); + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + } + + return isSuccess && IsValidPoints (myFirstPoint, mySecondPoint); + } + else if (theSecondShape.ShapeType() == TopAbs_EDGE) + { + myGeometryType = GeometryType_EdgeFace; + isSuccess = InitEdgeFaceLength (TopoDS::Edge (theSecondShape), + TopoDS::Face (theFirstShape), + aDirAttach); + + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + + return isSuccess; + } + } + break; + + case TopAbs_EDGE: + { + if (theSecondShape.ShapeType() == TopAbs_VERTEX) + { + myGeometryType = GeometryType_EdgeVertex; + isSuccess = InitEdgeVertexLength (TopoDS::Edge (theFirstShape), + TopoDS::Vertex (theSecondShape), + aDirAttach, + isInfinite); + + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + + return isSuccess; + } + else if (theSecondShape.ShapeType() == TopAbs_EDGE) + { + myGeometryType = GeometryType_Edges; + isSuccess = InitTwoEdgesLength (TopoDS::Edge (theFirstShape), + TopoDS::Edge (theSecondShape), + aDirAttach); + + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + + return isSuccess; + } + else if (theSecondShape.ShapeType() == TopAbs_FACE) + { + myGeometryType = GeometryType_EdgeFace; + isSuccess = InitEdgeFaceLength (TopoDS::Edge (theFirstShape), + TopoDS::Face (theSecondShape), + aDirAttach); + + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + + return isSuccess; + } + } + break; + + case TopAbs_VERTEX: + { + if (theSecondShape.ShapeType() == TopAbs_VERTEX) + { + myGeometryType = GeometryType_Points; + myFirstPoint = BRep_Tool::Pnt (TopoDS::Vertex (theFirstShape)); + mySecondPoint = BRep_Tool::Pnt (TopoDS::Vertex (theSecondShape)); + + return IsValidPoints (myFirstPoint, mySecondPoint); + } + else if (theSecondShape.ShapeType() == TopAbs_EDGE) + { + myGeometryType = GeometryType_EdgeVertex; + isSuccess = InitEdgeVertexLength (TopoDS::Edge(theSecondShape), + TopoDS::Vertex(theFirstShape), + aDirAttach, + isInfinite); + if (isSuccess) + { + theComputedPlane = ComputePlane (aDirAttach); + theIsPlaneComputed = Standard_True; + } + + return isSuccess; + } + } + break; + + case TopAbs_COMPOUND: + case TopAbs_COMPSOLID: + case TopAbs_SOLID: + case TopAbs_SHELL: + case TopAbs_WIRE: + case TopAbs_SHAPE: + break; + } + + return Standard_False; +} + +//======================================================================= +//function : InitOneShapePoints +//purpose : Initialization of two points where dimension layouts +// will be attached +// Attention: 1) can be only the edge in currect implementation +// 2) No length for infinite edge +//======================================================================= +Standard_Boolean PrsDim_LengthDimension::InitOneShapePoints (const TopoDS_Shape& theShape) +{ + if (theShape.ShapeType() != TopAbs_EDGE) + { + return Standard_False; + } + + TopoDS_Edge anEdge = TopoDS::Edge (theShape); + + BRepAdaptor_Curve aBrepCurve(anEdge); + Standard_Real aFirst = aBrepCurve.FirstParameter(); + Standard_Real aLast = aBrepCurve.LastParameter(); + + if (aBrepCurve.GetType() != GeomAbs_Line) + { + return Standard_False; + } + + Standard_Boolean isInfinite = (Precision::IsInfinite (aFirst) || Precision::IsInfinite (aLast)); + if (isInfinite) + { + return Standard_False; + } + + myFirstPoint = aBrepCurve.Value (aBrepCurve.FirstParameter()); + mySecondPoint = aBrepCurve.Value (aBrepCurve.LastParameter()); + + return IsValidPoints (myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +gp_Pnt PrsDim_LengthDimension::GetTextPosition() const +{ + if (IsTextPositionCustom()) + { + return myFixedTextPosition; + } + + // Counts text position according to the dimension parameters + return GetTextPositionForLinear (myFirstPoint, mySecondPoint); +} + +//======================================================================= +//function : SetTextPosition +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetTextPosition (const gp_Pnt& theTextPos) +{ + if (!IsValid()) + { + return; + } + + myIsTextPositionFixed = Standard_True; + myFixedTextPosition = theTextPos; + + SetToUpdate(); +} + +//======================================================================= +//function : SetDirection +//purpose : +//======================================================================= +void PrsDim_LengthDimension::SetDirection (const gp_Dir& theDirection, const Standard_Boolean theUseDirection) +{ + myHasCustomDirection = theUseDirection; + if (myHasCustomDirection) + myDirection = theDirection; +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_LengthDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_LengthDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_LengthDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_LengthDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,249 @@ +// Copyright (c) 1999-2013 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_LengthDimension_HeaderFile +#define _PrsDim_LengthDimension_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE (PrsDim_LengthDimension, PrsDim_Dimension) + +//! Length dimension. Can be constructued: +//! - Between two generic points. +//! - Between two vertices. +//! - Between two faces. +//! - Between two parallel edges. +//! - Between face and edge. +//! +//! In case of two points (vertices) or one linear edge the user-defined plane +//! that includes this geometry is necessary to be set. +//! +//! In case of face-edge, edge-vertex or face-face lengthes the automatic plane +//! computing is allowed. For this plane the third point is found on the +//! edge or on the face. +//! +//! Please note that if the inappropriate geometry is defined +//! or the distance between measured points is less than +//! Precision::Confusion(), the dimension is invalid and its +//! presentation can not be computed. +class PrsDim_LengthDimension : public PrsDim_Dimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_LengthDimension, PrsDim_Dimension) +public: + + //! Construct length dimension between face and edge. + //! Here dimension can be built without user-defined plane. + //! @param theFace [in] the face (first shape). + //! @param theEdge [in] the edge (second shape). + Standard_EXPORT PrsDim_LengthDimension (const TopoDS_Face& theFace, + const TopoDS_Edge& theEdge); + + //! Construct length dimension between two faces. + //! @param theFirstFace [in] the first face (first shape). + //! @param theSecondFace [in] the second face (second shape). + Standard_EXPORT PrsDim_LengthDimension (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace); + + //! Construct length dimension between two points in + //! the specified plane. + //! @param theFirstPoint [in] the first point. + //! @param theSecondPoint [in] the second point. + //! @param thePlane [in] the plane to orient dimension. + Standard_EXPORT PrsDim_LengthDimension (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pln& thePlane); + + //! Construct length dimension between two arbitrary shapes in + //! the specified plane. + //! @param theFirstShape [in] the first shape. + //! @param theSecondShape [in] the second shape. + //! @param thePlane [in] the plane to orient dimension. + Standard_EXPORT PrsDim_LengthDimension (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape, + const gp_Pln& thePlane); + + //! Construct length dimension of linear edge. + //! @param theEdge [in] the edge to measure. + //! @param thePlane [in] the plane to orient dimension. + Standard_EXPORT PrsDim_LengthDimension (const TopoDS_Edge& theEdge, + const gp_Pln& thePlane); + +public: + + //! @return first attachement point. + const gp_Pnt& FirstPoint() const { return myFirstPoint; } + + //! @return second attachement point. + const gp_Pnt& SecondPoint() const { return mySecondPoint; } + + //! @return first attachement shape. + const TopoDS_Shape& FirstShape() const { return myFirstShape; } + + //! @return second attachement shape. + const TopoDS_Shape& SecondShape() const { return mySecondShape; } + +public: + + //! Measure distance between two points. + //! The dimension will become invalid if the new distance between + //! attachement points is less than Precision::Confusion(). + //! @param theFirstPoint [in] the first point. + //! @param theSecondPoint [in] the second point. + //! @param thePlane [in] the user-defined plane + Standard_EXPORT void SetMeasuredGeometry (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint, + const gp_Pln& thePlane); + + //! Measure length of edge. + //! The dimension will become invalid if the new length of edge + //! is less than Precision::Confusion(). + //! @param theEdge [in] the edge to measure. + //! @param thePlane [in] the user-defined plane + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Edge& theEdge, + const gp_Pln& thePlane); + + //! Measure distance between two faces. + //! The dimension will become invalid if the distance can not + //! be measured or it is less than Precision::Confusion(). + //! @param theFirstFace [in] the first face (first shape). + //! @param theSecondFace [in] the second face (second shape). + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFirstFace, + const TopoDS_Face& theSecondFace); + + //! Measure distance between face and edge. + //! The dimension will become invalid if the distance can not + //! be measured or it is less than Precision::Confusion(). + //! @param theFace [in] the face (first shape). + //! @param theEdge [in] the edge (second shape). + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Face& theFace, + const TopoDS_Edge& theEdge); + + //! Measure distance between generic pair of shapes (edges, vertices, length), + //! where measuring is applicable. + //! @param theFirstShape [in] the first shape. + //! @param theSecondShape [in] the second shape. + Standard_EXPORT void SetMeasuredShapes (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape); + + //! @return the display units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; + + //! @return the model units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; + + Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; + + Standard_EXPORT virtual gp_Pnt GetTextPosition() const Standard_OVERRIDE; + + //! Set custom direction for dimension. If it is not set, the direction is obtained + //! from the measured geometry (e.g. line between points of dimension) + //! The direction does not change flyout direction of dimension. + //! @param theDirection [in] the dimension direction. + //! @param theUseDirection [in] boolean value if custom direction should be used. + Standard_EXPORT void SetDirection (const gp_Dir& theDirection, const Standard_Boolean theUseDirection = Standard_True); + +protected: + + //! Checks if the plane includes first and second points to build dimension. + Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; + + Standard_EXPORT virtual gp_Pln ComputePlane(const gp_Dir& theAttachDir) const; + + //! Computes distance between dimension points. If custom direction is defined, the distance + //! is a projection value of the distance between points to this direction + //! @return dimension value + Standard_EXPORT Standard_Real ComputeValue() const Standard_OVERRIDE; + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + + //! Computes points bounded the flyout line for linear dimension. + //! Direction of flyout line equal to the custom direction of dimension if defined or + //! parallel to the main direction line + //! @param theFirstPoint [in] the first attach point of linear dimension. + //! @param theSecondPoint [in] the second attach point of linear dimension. + //! @param theLineBegPoint [out] the first attach point of linear dimension. + //! @param theLineEndPoint [out] the second attach point of linear dimension. + Standard_EXPORT virtual void ComputeFlyoutLinePoints (const gp_Pnt& theFirstPoint, const gp_Pnt& theSecondPoint, + gp_Pnt& theLineBegPoint, gp_Pnt& theLineEndPoint) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeFlyoutSelection (const Handle(SelectMgr_Selection)& theSelection, + const Handle(SelectMgr_EntityOwner)& theEntityOwner) Standard_OVERRIDE; + +protected: + + //! Checks that distance between two points is valid. + //! @param theFirstPoint [in] the first point. + //! @param theSecondPoint [in] the second point. + Standard_EXPORT Standard_Boolean IsValidPoints (const gp_Pnt& theFirstPoint, + const gp_Pnt& theSecondPoint) const; + + Standard_EXPORT Standard_Boolean InitTwoEdgesLength (const TopoDS_Edge & theFirstEdge, + const TopoDS_Edge& theSecondEdge, + gp_Dir& theEdgeDir); + + //! Auxiliary method for InitTwoShapesPoints() + //! in case of the distance between edge and vertex. + //! Finds the point on the edge that is the closest one to . + //! @param theEdgeDir [out] is the direction on the edge to build + //! automatical plane. + Standard_EXPORT Standard_Boolean InitEdgeVertexLength (const TopoDS_Edge& theEdge, + const TopoDS_Vertex& theVertex, + gp_Dir& theEdgeDir, + Standard_Boolean isInfinite); + + //! Auxiliary method for InitTwoShapesPoints() + //! in case of the distance between face and edge. + //! The first attachment point is first parameter point from . + //! Find the second attachment point which belongs to + //! Iterate over the edges of the face and find the closest point according + //! to finded point on edge. + //! @param theEdgeDir [out] is the direction on the edge to build + //! automatical plane. + Standard_EXPORT Standard_Boolean InitEdgeFaceLength (const TopoDS_Edge& theEdge, + const TopoDS_Face& theFace, + gp_Dir& theEdgeDir); + + //! Initialization of two attach points in case of two owner shapes. + Standard_EXPORT Standard_Boolean InitTwoShapesPoints (const TopoDS_Shape& theFirstShape, + const TopoDS_Shape& theSecondShape, + gp_Pln& theComputedPlane, + Standard_Boolean& theIsPlaneComputed); + + //! Initialization of two attach points in case of one owner shape. + Standard_EXPORT Standard_Boolean InitOneShapePoints (const TopoDS_Shape& theShape); + +private: + + gp_Pnt myFirstPoint; + gp_Pnt mySecondPoint; + TopoDS_Shape myFirstShape; + TopoDS_Shape mySecondShape; + gp_Dir myDirection; + Standard_Boolean myHasCustomDirection; +}; + +#endif // _PrsDim_LengthDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MaxRadiusDimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MaxRadiusDimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MaxRadiusDimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MaxRadiusDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,310 @@ +// Created on: 1998-01-23 +// Created by: Sergey ZARITCHNY +// Copyright (c) 1998-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_MaxRadiusDimension, PrsDim_EllipseRadiusDimension) + +//======================================================================= +//function : PrsDim_MaxRadiusDimension +//purpose : +//======================================================================= +PrsDim_MaxRadiusDimension::PrsDim_MaxRadiusDimension(const TopoDS_Shape& aShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText) +:PrsDim_EllipseRadiusDimension(aShape, aText) +{ + myVal = aVal; + mySymbolPrs = DsgPrs_AS_LASTAR; + myAutomaticPosition = Standard_True; + myArrowSize = myVal / 100.; +} + +//======================================================================= +//function : PrsDim_MaxRadiusDimension +//purpose : +//======================================================================= + +PrsDim_MaxRadiusDimension::PrsDim_MaxRadiusDimension(const TopoDS_Shape& aShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText, + const gp_Pnt& aPosition, + const DsgPrs_ArrowSide aSymbolPrs, + const Standard_Real anArrowSize) +:PrsDim_EllipseRadiusDimension(aShape, aText) +{ + myVal = aVal; + mySymbolPrs = aSymbolPrs; + myPosition = aPosition; + myAutomaticPosition = Standard_False; + SetArrowSize( anArrowSize ); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_MaxRadiusDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer /*aMode*/) +{ +// if( myAutomaticPosition ) + {//ota : recompute in any case + ComputeGeometry(); + myEllipse.SetMajorRadius(myVal); + gp_Vec v1(myEllipse.XAxis().Direction()); + v1 *=myVal; + myApexP = myEllipse.Location().Translated(v1); + myApexN = myEllipse.Location().Translated(-v1); + } + if(myIsAnArc) ComputeArcOfEllipse(aPresentation); + else + ComputeEllipse(aPresentation); +} + +//======================================================================= +//function : ComputeEllipse +//purpose : +//======================================================================= + +void PrsDim_MaxRadiusDimension::ComputeEllipse(const Handle(Prs3d_Presentation)& aPresentation) +{ + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + + // size + if( !myArrowSizeIsDefined ) { + myArrowSize = Min(myArrowSize,myVal / 5.); + } + arr->SetLength(myArrowSize); + + Standard_Real U;//,V; + gp_Pnt curPos, Center; + Center = myEllipse.Location(); + if( myAutomaticPosition ) + { + myPosition = Center; + myEndOfArrow = myApexP; + myAutomaticPosition = Standard_True; + + if ( myIsSetBndBox ) + myPosition = PrsDim::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )), + myBndBox ); + curPos = myPosition; + } + else //!AutomaticPosition + { + curPos = myPosition; + gp_Lin L1(myEllipse.XAxis()); + U = ElCLib::Parameter ( L1, curPos ); + curPos = ElCLib::Value (U, L1); + if (curPos.Distance(myApexP) < curPos.Distance(myApexN)) + myEndOfArrow = myApexP ; + else + myEndOfArrow = myApexN ; + } + + // Presenatation + DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, curPos, + myEndOfArrow, Center, Standard_True, mySymbolPrs); + +} + +//======================================================================= +//function : ComputeArcOfEllipse +//purpose : +//======================================================================= + +void PrsDim_MaxRadiusDimension::ComputeArcOfEllipse(const Handle(Prs3d_Presentation)& aPresentation) +{ + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + + // size + if( !myArrowSizeIsDefined ) { + myArrowSize = Min(myArrowSize,myVal / 5.); + } + arr->SetLength(myArrowSize); + + Standard_Real par; + gp_Pnt curPos, Center; + Center = myEllipse.Location(); + Standard_Boolean IsInDomain = Standard_True; + if( myAutomaticPosition ) + { + myEndOfArrow = PrsDim::NearestApex(myEllipse, myApexP, myApexN, + myFirstPar, myLastPar, IsInDomain); + myPosition = Center; + myAutomaticPosition = Standard_True; + if ( myIsSetBndBox ) + myPosition = PrsDim::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )), + myBndBox ); + curPos = myPosition; + } + else //!AutomaticPosition + { + curPos = myPosition; +// ElSLib::Parameters ( myPlane->Pln(), curPos, U, V ); +// curPos = ElSLib::Value (U, V, myPlane->Pln()); + gp_Lin L1(myEllipse.XAxis()); + par = ElCLib::Parameter ( L1, curPos ); + curPos = ElCLib::Value (par, L1); + if (curPos.Distance(myApexP) < curPos.Distance(myApexN)) + myEndOfArrow = myApexP ; + else + myEndOfArrow = myApexN ; + par = ElCLib::Parameter ( myEllipse, myEndOfArrow ); + IsInDomain = PrsDim::InDomain( myFirstPar, myLastPar, par ); + myPosition = curPos; + } + +// Standard_Real parEnd = ElCLib::Parameter ( myEllipse, myEndOfArrow ); + Standard_Real parStart = 0.; + if( !IsInDomain ) + { + if(PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < + PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar)) + parStart = myFirstPar; + else + parStart = myLastPar; + } + if(!myIsOffset) + DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myEllipse, + curPos, myEndOfArrow, Center, parStart, IsInDomain, + Standard_True, mySymbolPrs); + else + DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myOffsetCurve, + curPos, myEndOfArrow, Center, parStart, IsInDomain, + Standard_True, mySymbolPrs); +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_MaxRadiusDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer /*aMode*/) +{ + + gp_Pnt center = myEllipse.Location(); + gp_Pnt AttachmentPoint = myPosition; + Standard_Real dist = center.Distance(AttachmentPoint); + Standard_Real aRadius = myVal; + //Standard_Real inside = Standard_False; + gp_Pnt pt1; + if (dist > aRadius) pt1 = AttachmentPoint; + else + pt1 = myEndOfArrow; + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + Handle(Select3D_SensitiveSegment) + seg = new Select3D_SensitiveSegment(own, center , pt1); + aSelection->Add(seg); + + // Text + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, + AttachmentPoint.X(), + AttachmentPoint.Y(), + AttachmentPoint.Z(), + AttachmentPoint.X()+size, + AttachmentPoint.Y()+size, + AttachmentPoint.Z()+size); + aSelection->Add(box); + + // Arc of Ellipse + if(myIsAnArc) + { + + Standard_Real parEnd = ElCLib::Parameter ( myEllipse, myEndOfArrow ); + if(!PrsDim::InDomain(myFirstPar, myLastPar, parEnd)) + { + Standard_Real parStart, par; + if(PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < + PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar)) + par = myFirstPar; + else + par = myLastPar; + gp_Vec Vapex(center, ElCLib::Value( parEnd, myEllipse )) ; + gp_Vec Vpnt (center, ElCLib::Value( par, myEllipse )) ; + gp_Dir dir(Vpnt ^ Vapex); + if(myEllipse.Position().Direction().IsOpposite( dir, Precision::Angular())) { + parStart = parEnd; + parEnd = par; + } + else + parStart = par; + + Handle(Geom_Curve)TrimCurve; + if(myIsOffset) + { + Handle(Geom_Curve) aCurve = myOffsetCurve; + TrimCurve = new Geom_TrimmedCurve( aCurve, parStart, parEnd ); + } + else + { + Handle(Geom_Ellipse) Ellipse = new Geom_Ellipse( myEllipse ); + TrimCurve = new Geom_TrimmedCurve( Ellipse, parStart, parEnd ); + } + Handle( Select3D_SensitiveCurve ) SensArc; + SensArc = new Select3D_SensitiveCurve( own, TrimCurve ); + aSelection->Add( SensArc ); + } + } + +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MaxRadiusDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MaxRadiusDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MaxRadiusDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MaxRadiusDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,59 @@ +// Created on: 1998-01-22 +// Created by: Sergey ZARITCHNY +// Copyright (c) 1998-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_MaxRadiusDimension_HeaderFile +#define _PrsDim_MaxRadiusDimension_HeaderFile + +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_MaxRadiusDimension, PrsDim_EllipseRadiusDimension) + +//! Ellipse Max radius dimension of a Shape which can be Edge +//! or Face (planar or cylindrical(surface of extrusion or +//! surface of offset)) +class PrsDim_MaxRadiusDimension : public PrsDim_EllipseRadiusDimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_MaxRadiusDimension, PrsDim_EllipseRadiusDimension) +public: + + //! Max Ellipse radius dimension + //! Shape can be edge , planar face or cylindrical face + Standard_EXPORT PrsDim_MaxRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); + + //! Max Ellipse radius dimension with position + //! Shape can be edge , planar face or cylindrical face + Standard_EXPORT PrsDim_MaxRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeEllipse (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeArcOfEllipse (const Handle(Prs3d_Presentation)& aPresentation); + +private: + + gp_Pnt myApexP; + gp_Pnt myApexN; + gp_Pnt myEndOfArrow; + +}; + +#endif // _PrsDim_MaxRadiusDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MidPointRelation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MidPointRelation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MidPointRelation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MidPointRelation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,693 @@ +// Created on: 2000-10-20 +// Created by: Julia DOROVSKIKH +// Copyright (c) 2000-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_MidPointRelation, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_MidPointRelation +//purpose : +//======================================================================= +PrsDim_MidPointRelation::PrsDim_MidPointRelation(const TopoDS_Shape& aMidPointTool, + const TopoDS_Shape& FirstShape, + const TopoDS_Shape& SecondShape, + const Handle(Geom_Plane)& aPlane) +:PrsDim_Relation(), + myTool(aMidPointTool) +{ + SetFirstShape(FirstShape); + SetSecondShape(SecondShape); + SetPlane(aPlane); + myPosition = aPlane->Pln().Location(); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aprs, + const Standard_Integer) +{ + if (myTool.ShapeType() == TopAbs_VERTEX) + { + gp_Pnt pp; + Standard_Boolean isonplane; + if ( PrsDim::ComputeGeometry(TopoDS::Vertex(myTool),pp,myPlane,isonplane) ) + { + if ( !isonplane ) ComputeProjVertexPresentation(aprs,TopoDS::Vertex(myTool),pp); + } + myMidPoint = pp; + } + else return; + + if ( myAutomaticPosition ) myPosition = myMidPoint; + + switch (myFShape.ShapeType()) + { + case TopAbs_FACE : + { + ComputeFaceFromPnt(aprs, Standard_True); + } + break; + case TopAbs_EDGE : + { + ComputeEdgeFromPnt(aprs, Standard_True); + } + break; + case TopAbs_VERTEX : + { + ComputeVertexFromPnt(aprs, Standard_True); + } + break; + default: + break; + } + + switch (mySShape.ShapeType()) + { + case TopAbs_FACE : + { + ComputeFaceFromPnt(aprs, Standard_False); + } + break; + case TopAbs_EDGE : + { + ComputeEdgeFromPnt(aprs, Standard_False); + } + break; + case TopAbs_VERTEX : + { + ComputeVertexFromPnt(aprs, Standard_False); + } + break; + default: + break; + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSel, + const Standard_Integer) +{ + Handle(Select3D_SensitiveSegment) seg; + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + + if ( !myMidPoint.IsEqual(myFAttach,Precision::Confusion()) ) + { + // segment from mid point to the first geometry + seg = new Select3D_SensitiveSegment(own,myFAttach,myMidPoint); + aSel->Add(seg); + // segment from mid point to the second geometry + seg = new Select3D_SensitiveSegment(own,mySAttach,myMidPoint); + aSel->Add(seg); + } + if ( !myMidPoint.IsEqual(myPosition,Precision::Confusion()) ) + { + // segment from mid point to the text position + seg = new Select3D_SensitiveSegment(own,myMidPoint,myPosition); + aSel->Add(seg); + } + + // center of the symmetry - circle around the MidPoint + gp_Ax2 ax = myPlane->Pln().Position().Ax2(); + ax.SetLocation(myMidPoint); + Standard_Real rad = myFAttach.Distance(myMidPoint)/20.0; + gp_Circ aCircleM (ax,rad); + Handle(Geom_Curve) thecir = new Geom_Circle(aCircleM); + Handle(Select3D_SensitiveCurve) scurv = new Select3D_SensitiveCurve(own, thecir); + aSel->Add(scurv); + + Handle(Geom_Curve) curv; + gp_Pnt firstp,lastp; + Standard_Boolean isInfinite,isOnPlane; + Handle(Geom_Curve) extCurv; + + // segment on first curve + if ( myFShape.ShapeType() == TopAbs_EDGE ) + { + TopoDS_Edge E = TopoDS::Edge(myFShape); + if ( !PrsDim::ComputeGeometry(E,curv,firstp,lastp,extCurv,isInfinite,isOnPlane,myPlane) ) return; + if ( curv->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of line + { + // segment on line + seg = new Select3D_SensitiveSegment(own,myFirstPnt1,myFirstPnt2); + aSel->Add(seg); + } + else if ( curv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) // case of circle + { + // segment on circle + Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv); + Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),myFirstPnt1); + Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),myFirstPnt2); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); + + scurv = new Select3D_SensitiveCurve(own, thecu); + aSel->Add(scurv); + } + else if ( curv->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipse + { + // segment on ellipse + Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv); + Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),myFirstPnt1); + Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),myFirstPnt2); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); + + scurv = new Select3D_SensitiveCurve(own, thecu); + aSel->Add(scurv); + } + } + + // segment on second curve + if ( mySShape.ShapeType() == TopAbs_EDGE ) + { + TopoDS_Edge E = TopoDS::Edge(mySShape); + if ( !PrsDim::ComputeGeometry(E,curv,firstp,lastp,extCurv,isInfinite,isOnPlane,myPlane) ) return; + if ( curv->IsInstance(STANDARD_TYPE(Geom_Line)) ) // case of line + { + // segment on line + seg = new Select3D_SensitiveSegment(own,mySecondPnt1,mySecondPnt2); + aSel->Add(seg); + } + else if ( curv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) // case of circle + { + // segment on circle + Handle(Geom_Circle) thecirc = Handle(Geom_Circle)::DownCast (curv); + Standard_Real udeb = ElCLib::Parameter(thecirc->Circ(),mySecondPnt1); + Standard_Real ufin = ElCLib::Parameter(thecirc->Circ(),mySecondPnt2); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(thecirc,udeb,ufin); + + scurv = new Select3D_SensitiveCurve(own, thecu); + aSel->Add(scurv); + } + else if ( curv->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) // case of ellipse + { + // segment on ellipse + Handle(Geom_Ellipse) theEll = Handle(Geom_Ellipse)::DownCast (curv); + Standard_Real udeb = ElCLib::Parameter(theEll->Elips(),mySecondPnt1); + Standard_Real ufin = ElCLib::Parameter(theEll->Elips(),mySecondPnt2); + Handle(Geom_Curve) thecu = new Geom_TrimmedCurve(theEll,udeb,ufin); + + scurv = new Select3D_SensitiveCurve(own, thecu); + aSel->Add(scurv); + } + } +} + +//======================================================================= +//function : ComputeFaceFromPnt +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputeFaceFromPnt(const Handle(Prs3d_Presentation)&, + const Standard_Boolean /*first*/) +{ +} + +//======================================================================= +//function : ComputeEdgeFromPnt +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputeEdgeFromPnt(const Handle(Prs3d_Presentation)& aprs, + const Standard_Boolean first) +{ + TopoDS_Edge E; + if ( first ) E = TopoDS::Edge(myFShape); + else E = TopoDS::Edge(mySShape); + + Handle(Geom_Curve) geom; + gp_Pnt ptat1,ptat2; + Handle(Geom_Curve) extCurv; + Standard_Boolean isInfinite,isOnPlane; + if ( !PrsDim::ComputeGeometry(E, geom, ptat1, ptat2, extCurv, isInfinite, isOnPlane, myPlane) ) return; + + gp_Ax2 ax = myPlane->Pln().Position().Ax2(); + + if ( geom->IsInstance(STANDARD_TYPE(Geom_Line)) ) + { + if ( !isInfinite ) ComputePointsOnLine(ptat1,ptat2,first); + else + { + const gp_Lin& line = Handle(Geom_Line)::DownCast (geom)->Lin(); + ComputePointsOnLine(line,first); + } + if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition, + myFAttach,myFirstPnt1,myFirstPnt2,first); + else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition, + mySAttach,mySecondPnt1,mySecondPnt2,first); + } + else if ( geom->IsInstance(STANDARD_TYPE(Geom_Circle)) ) + { + Handle(Geom_Circle) geom_cir (Handle(Geom_Circle)::DownCast (geom)); + gp_Circ circ (geom_cir->Circ()); + ComputePointsOnCirc(circ,ptat1,ptat2,first); + if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,circ,myMidPoint,myPosition, + myFAttach,myFirstPnt1,myFirstPnt2,first); + else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,circ,myMidPoint,myPosition, + mySAttach,mySecondPnt1,mySecondPnt2,first); + } + else if ( geom->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) + { + Handle(Geom_Ellipse) geom_ell (Handle(Geom_Ellipse)::DownCast (geom)); + gp_Elips elips (geom_ell->Elips()); + ComputePointsOnElips(elips,ptat1,ptat2,first); + if ( first ) DsgPrs_MidPointPresentation::Add(aprs,myDrawer,elips,myMidPoint,myPosition, + myFAttach,myFirstPnt1,myFirstPnt2,first); + else DsgPrs_MidPointPresentation::Add(aprs,myDrawer,elips,myMidPoint,myPosition, + mySAttach,mySecondPnt1,mySecondPnt2,first); + } + else return; + + // projection on myPlane + if ( !isOnPlane ) ComputeProjEdgePresentation(aprs,E,geom,ptat1,ptat2); +} + +//======================================================================= +//function : ComputeVertexFromPnt +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputeVertexFromPnt(const Handle(Prs3d_Presentation)& aprs, + const Standard_Boolean first) +{ + gp_Ax2 ax = myPlane->Pln().Position().Ax2(); + if ( first ) + { + Standard_Boolean isOnPlane; + TopoDS_Vertex V = TopoDS::Vertex(myFShape); + PrsDim::ComputeGeometry(V, myFAttach, myPlane, isOnPlane); + DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition,myFAttach,first); + if ( !isOnPlane ) ComputeProjVertexPresentation(aprs,V,myFAttach); + } + else + { + Standard_Boolean isOnPlane; + TopoDS_Vertex V = TopoDS::Vertex(mySShape); + PrsDim::ComputeGeometry(V, mySAttach, myPlane, isOnPlane); + DsgPrs_MidPointPresentation::Add(aprs,myDrawer,ax,myMidPoint,myPosition,mySAttach,first); + if ( !isOnPlane ) ComputeProjVertexPresentation(aprs,V,mySAttach); + } +} + +//======================================================================= +//function : ComputePointsOnLine +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputePointsOnLine(const gp_Lin& aLin, + const Standard_Boolean first) +{ + Standard_Real ppar = ElCLib::Parameter(aLin,myMidPoint); + gp_Pnt anAttach = ElCLib::Value(ppar,aLin); + + Standard_Real dist = anAttach.Distance(myMidPoint)/10.0; + if ( dist < Precision::Confusion() ) dist = 10.0; + + Standard_Real fpar = ppar + dist; + Standard_Real spar = ppar - dist; + + gp_Pnt aPnt1 = ElCLib::Value(fpar,aLin); + gp_Pnt aPnt2 = ElCLib::Value(spar,aLin); + + if ( first ) + { + myFAttach = anAttach; + myFirstPnt1 = aPnt1; + myFirstPnt2 = aPnt2; + } + else + { + mySAttach = anAttach; + mySecondPnt1 = aPnt1; + mySecondPnt2 = aPnt2; + } +} + +//======================================================================= +//function : ComputePointsOnLine +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputePointsOnLine(const gp_Pnt& pnt1, const gp_Pnt& pnt2, + const Standard_Boolean first) +{ + gp_Vec aVec (pnt1,pnt2); + gp_Lin aLin (pnt1,gp_Dir(aVec)); + + Standard_Real fpar = ElCLib::Parameter(aLin,pnt1); + Standard_Real spar = ElCLib::Parameter(aLin,pnt2); + Standard_Real ppar = ElCLib::Parameter(aLin,myMidPoint); + + gp_Pnt aProjPnt = ElCLib::Value(ppar,aLin); + Standard_Real dist = myMidPoint.Distance(aProjPnt); + Standard_Real ll = pnt1.Distance(pnt2); + Standard_Real segm = Min(dist,ll)*0.75; + if ( dist < Precision::Confusion() ) segm = ll*0.75; + + gp_Pnt anAttach,aPnt1,aPnt2; + anAttach = aProjPnt; + gp_Vec aVecTr; + if ( ppar <= fpar ) + { + aPnt2 = pnt1; + aVecTr = gp_Vec(pnt2,pnt1); + aVecTr.Normalize(); + aPnt1 = aProjPnt.Translated(aVecTr*segm); + } + else if ( ppar >= spar ) + { + aPnt1 = pnt2; + aVecTr = gp_Vec(pnt1,pnt2); + aVecTr.Normalize(); + aPnt2 = aProjPnt.Translated(aVecTr*segm); + } + else + { + Standard_Real dp1 = aProjPnt.Distance(pnt1); + Standard_Real dp2 = aProjPnt.Distance(pnt2); + + segm = Min(dist,dp1)*0.75; + aVecTr = gp_Vec(aProjPnt,pnt1); + aVecTr.Normalize(); + aPnt1 = aProjPnt.Translated(aVecTr*segm); + + segm = Min(dist,dp2)*0.75; + aVecTr = gp_Vec(aProjPnt,pnt2); + aVecTr.Normalize(); + aPnt2 = aProjPnt.Translated(aVecTr*segm); + } + + if ( first ) + { + myFAttach = anAttach; + myFirstPnt1 = aPnt1; + myFirstPnt2 = aPnt2; + } + else + { + mySAttach = anAttach; + mySecondPnt1 = aPnt1; + mySecondPnt2 = aPnt2; + } +} + +//======================================================================= +//function : ComputePointsOnCirc +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputePointsOnCirc(const gp_Circ& aCirc, + const gp_Pnt& pnt1, const gp_Pnt& pnt2, + const Standard_Boolean first) +{ + gp_Pnt curpos = myMidPoint; + + // Case of confusion between the current position and the center + // of the circle -> we move the current position + Standard_Real confusion (Precision::Confusion()); + gp_Pnt aCenter = aCirc.Location(); + if ( aCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(aCenter, pnt1); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + + Standard_Real pcurpos = ElCLib::Parameter(aCirc,curpos); + + Standard_Real rad = M_PI / 5.0; + Standard_Real segm; + + Standard_Real pFPnt; + Standard_Real pSPnt; + + if ( pnt1.IsEqual(pnt2,confusion) ) // full circle + { + pFPnt = pcurpos - rad; + pSPnt = pcurpos + rad; + } + else + { + Standard_Real pFAttach = ElCLib::Parameter(aCirc,pnt1); + Standard_Real pSAttach = ElCLib::Parameter(aCirc,pnt2); + + Standard_Real pSAttachM = pSAttach; + Standard_Real deltap = pSAttachM - pFAttach; + if ( deltap < 0 ) + { + deltap += 2 * M_PI; + pSAttachM += 2 * M_PI; + } + pSAttachM -= pFAttach; + + Standard_Real pmiddleout = pSAttachM/2.0 + M_PI; + + Standard_Real pcurpos1 = pcurpos; + // define where curpos lays + if ( pcurpos1 < pFAttach ) + { + pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; + if ( pcurpos1 > pSAttachM ) // out + { + segm = Min(rad,deltap*0.75); + if ( pcurpos1 > pmiddleout ) + { + pcurpos = pFAttach; + pFPnt = pFAttach; + pSPnt = pFAttach + segm; + } + else + { + pcurpos = pSAttach; + pFPnt = pSAttach - segm; + pSPnt = pSAttach; + } + } + else // on arc + { + Standard_Real dp1 = pcurpos1 - pFAttach; + Standard_Real dp2 = pSAttachM - pcurpos1; + + segm = Min(rad,dp1*0.75); + pFPnt = pcurpos - segm; + + segm = Min(rad,dp2*0.75); + pSPnt = pcurpos + segm; + } + } + else if ( pcurpos1 > (pFAttach + deltap) ) // out + { + pcurpos1 -= pFAttach; + segm = Min(rad,deltap*0.75); + if ( pcurpos1 > pmiddleout ) + { + pcurpos = pFAttach; + pFPnt = pFAttach; + pSPnt = pFAttach + segm; + } + else + { + pcurpos = pSAttach; + pFPnt = pSAttach - segm; + pSPnt = pSAttach; + } + } + else // on arc + { + Standard_Real dp1 = pcurpos1 - pFAttach; + Standard_Real dp2 = pSAttach - pcurpos1; + + segm = Min(rad,dp1*0.75); + pFPnt = pcurpos - segm; + + segm = Min(rad,dp2*0.75); + pSPnt = pcurpos + segm; + } + } + + if ( first ) + { + myFAttach = ElCLib::Value(pcurpos,aCirc); + myFirstPnt1 = ElCLib::Value(pFPnt,aCirc); + myFirstPnt2 = ElCLib::Value(pSPnt,aCirc); + } + else + { + mySAttach = ElCLib::Value(pcurpos,aCirc); + mySecondPnt1 = ElCLib::Value(pFPnt,aCirc); + mySecondPnt2 = ElCLib::Value(pSPnt,aCirc); + } +} + +//======================================================================= +//function : ComputePointsOnElips +//purpose : +//======================================================================= +void PrsDim_MidPointRelation::ComputePointsOnElips(const gp_Elips& anEll, + const gp_Pnt& pnt1, const gp_Pnt& pnt2, + const Standard_Boolean first) +{ + gp_Pnt curpos = myMidPoint; + + // Case of confusion between the current position and the center + // of the circle -> we move the current position + Standard_Real confusion (Precision::Confusion()); + gp_Pnt aCenter = anEll.Location(); + if ( aCenter.Distance(curpos) <= confusion ) + { + gp_Vec vprec(aCenter, pnt1); + vprec.Normalize(); + curpos.Translate(vprec*1e-5); + } + + Standard_Real pcurpos = ElCLib::Parameter(anEll,curpos); + + Standard_Real rad = M_PI / 5.0; + Standard_Real segm; + + Standard_Real pFPnt; + Standard_Real pSPnt; + + if ( pnt1.IsEqual(pnt2,confusion) ) // full circle + { + pFPnt = pcurpos - rad; + pSPnt = pcurpos + rad; + } + else + { + Standard_Real pFAttach = ElCLib::Parameter(anEll,pnt1); + Standard_Real pSAttach = ElCLib::Parameter(anEll,pnt2); + + Standard_Real pSAttachM = pSAttach; + Standard_Real deltap = pSAttachM - pFAttach; + if ( deltap < 0 ) + { + deltap += 2 * M_PI; + pSAttachM += 2 * M_PI; + } + pSAttachM -= pFAttach; + + Standard_Real pmiddleout = pSAttachM / 2.0 + M_PI; + + Standard_Real pcurpos1 = pcurpos; + // define where curpos lays + if ( pcurpos1 < pFAttach ) + { + pcurpos1 = pcurpos1 + 2 * M_PI - pFAttach; + if ( pcurpos1 > pSAttachM ) // out + { + segm = Min(rad,deltap*0.75); + if ( pcurpos1 > pmiddleout ) + { + pcurpos = pFAttach; + pFPnt = pFAttach; + pSPnt = pFAttach + segm; + } + else + { + pcurpos = pSAttach; + pFPnt = pSAttach - segm; + pSPnt = pSAttach; + } + } + else // on arc + { + Standard_Real dp1 = pcurpos1 - pFAttach; + Standard_Real dp2 = pSAttachM - pcurpos1; + + segm = Min(rad,dp1*0.75); + pFPnt = pcurpos - segm; + + segm = Min(rad,dp2*0.75); + pSPnt = pcurpos + segm; + } + } + else if ( pcurpos1 > (pFAttach + deltap) ) // out + { + pcurpos1 -= pFAttach; + segm = Min(rad,deltap*0.75); + if ( pcurpos1 > pmiddleout ) + { + pcurpos = pFAttach; + pFPnt = pFAttach; + pSPnt = pFAttach + segm; + } + else + { + pcurpos = pSAttach; + pFPnt = pSAttach - segm; + pSPnt = pSAttach; + } + } + else // on arc + { + Standard_Real dp1 = pcurpos1 - pFAttach; + Standard_Real dp2 = pSAttach - pcurpos1; + + segm = Min(rad,dp1*0.75); + pFPnt = pcurpos - segm; + + segm = Min(rad,dp2*0.75); + pSPnt = pcurpos + segm; + } + } + + if ( first ) + { + myFAttach = ElCLib::Value(pcurpos,anEll); + myFirstPnt1 = ElCLib::Value(pFPnt,anEll); + myFirstPnt2 = ElCLib::Value(pSPnt,anEll); + } + else + { + mySAttach = ElCLib::Value(pcurpos,anEll); + mySecondPnt1 = ElCLib::Value(pFPnt,anEll); + mySecondPnt2 = ElCLib::Value(pSPnt,anEll); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MidPointRelation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MidPointRelation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MidPointRelation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MidPointRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,88 @@ +// Created on: 2000-10-20 +// Created by: Julia DOROVSKIKH +// Copyright (c) 2000-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_MidPointRelation_HeaderFile +#define _PrsDim_MidPointRelation_HeaderFile + +#include + +class Geom_Plane; +class gp_Lin; +class gp_Pnt; +class gp_Circ; +class gp_Elips; + +DEFINE_STANDARD_HANDLE(PrsDim_MidPointRelation, PrsDim_Relation) + +//! presentation of equal distance to point myMidPoint +class PrsDim_MidPointRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_MidPointRelation, PrsDim_Relation) +public: + + Standard_EXPORT PrsDim_MidPointRelation(const TopoDS_Shape& aSymmTool, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); + + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + + void SetTool (const TopoDS_Shape& aMidPointTool) { myTool = aMidPointTool; } + + const TopoDS_Shape& GetTool() const { return myTool; } + +private: + + Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeFaceFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); + + Standard_EXPORT void ComputeEdgeFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); + + Standard_EXPORT void ComputeVertexFromPnt (const Handle(Prs3d_Presentation)& aprs, const Standard_Boolean first); + + Standard_EXPORT void ComputePointsOnLine (const gp_Lin& aLin, const Standard_Boolean first); + + Standard_EXPORT void ComputePointsOnLine (const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); + + Standard_EXPORT void ComputePointsOnCirc (const gp_Circ& aCirc, const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); + + //! ComputePointsOn... methods set myFAttach, myFirstPnt and myLastPnt + //! from the following initial data: curve, end points, myMidPoint. + //! End points (pnt1 & pnt2) and curve define the trimmed curve. + //! If end points are equal, curve is not trimmed (line - special case). + //! + //! .------. pnt2 + //! / + //! . circle . myLastPnt + //! | | + //! . pnt1 . myFAttach + //! \ arc / . myMidPoint + //! .______. myFirstPnt + Standard_EXPORT void ComputePointsOnElips (const gp_Elips& anEll, const gp_Pnt& pnt1, const gp_Pnt& pnt2, const Standard_Boolean first); + +private: + + TopoDS_Shape myTool; + gp_Pnt myMidPoint; + gp_Pnt myFAttach; + gp_Pnt myFirstPnt1; + gp_Pnt myFirstPnt2; + gp_Pnt mySAttach; + gp_Pnt mySecondPnt1; + gp_Pnt mySecondPnt2; + +}; + +#endif // _AIS_MidPointRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MinRadiusDimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MinRadiusDimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MinRadiusDimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MinRadiusDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,311 @@ +// Created on: 1998-01-27 +// Created by: Sergey ZARITCHNY +// Copyright (c) 1998-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_MinRadiusDimension, PrsDim_EllipseRadiusDimension) + +//======================================================================= +//function : PrsDim_MinRadiusDimension +//purpose : +//======================================================================= +PrsDim_MinRadiusDimension::PrsDim_MinRadiusDimension(const TopoDS_Shape& aShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText) +:PrsDim_EllipseRadiusDimension(aShape, aText) +{ + myVal = aVal; + mySymbolPrs = DsgPrs_AS_LASTAR; + myAutomaticPosition = Standard_True; + myArrowSize = myVal / 100.; +} + +//======================================================================= +//function : PrsDim_MinRadiusDimension +//purpose : +//======================================================================= + +PrsDim_MinRadiusDimension::PrsDim_MinRadiusDimension(const TopoDS_Shape& aShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText, + const gp_Pnt& aPosition, + const DsgPrs_ArrowSide aSymbolPrs, + const Standard_Real anArrowSize) +:PrsDim_EllipseRadiusDimension(aShape, aText) +{ + myVal = aVal; + mySymbolPrs = aSymbolPrs; + myPosition = aPosition; + myAutomaticPosition = Standard_False; + SetArrowSize( anArrowSize ); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= + +void PrsDim_MinRadiusDimension::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer /*aMode*/) +{ +// if( myAutomaticPosition ) + //{ //ota : recompute ellipse always + ComputeGeometry(); + myEllipse.SetMinorRadius(myVal); + gp_Vec v1(myEllipse.YAxis().Direction()); + v1 *=myVal; + myApexP = myEllipse.Location().Translated(v1); + myApexN = myEllipse.Location().Translated(-v1); +// } + if(myIsAnArc) ComputeArcOfEllipse(aPresentation); + else + ComputeEllipse(aPresentation); +} + +//======================================================================= +//function : ComputeEllipse +//purpose : +//======================================================================= + +void PrsDim_MinRadiusDimension::ComputeEllipse(const Handle(Prs3d_Presentation)& aPresentation) +{ + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + + // size + if( !myArrowSizeIsDefined ) { + myArrowSize = Min(myArrowSize,myVal/5.); + } + arr->SetLength(myArrowSize); + + Standard_Real U;//,V; + gp_Pnt curPos, Center; + Center = myEllipse.Location(); + if( myAutomaticPosition ) + { + myPosition = Center; + myEndOfArrow = myApexP; + myAutomaticPosition = Standard_True; + + if ( myIsSetBndBox ) + myPosition = PrsDim::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )), + myBndBox ); + curPos = myPosition; + } + else //!AutomaticPosition + { + curPos = myPosition; + gp_Lin L1(myEllipse.YAxis()); + U = ElCLib::Parameter ( L1, curPos ); + curPos = ElCLib::Value (U, L1); + if (curPos.Distance(myApexP) < curPos.Distance(myApexN)) + myEndOfArrow = myApexP ; + else + myEndOfArrow = myApexN ; + myPosition = curPos; + } + + // Presenatation + DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, curPos, + myEndOfArrow, Center, Standard_False, mySymbolPrs); + +} + +//======================================================================= +//function : ComputeArcOfEllipse +//purpose : +//======================================================================= + +void PrsDim_MinRadiusDimension::ComputeArcOfEllipse(const Handle(Prs3d_Presentation)& aPresentation) +{ + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + + // size + if( !myArrowSizeIsDefined ) { + myArrowSize = Min(myArrowSize,myVal/5.); + } + arr->SetLength(myArrowSize); + + Standard_Real par; + gp_Pnt curPos, Center; + Center = myEllipse.Location(); + Standard_Boolean IsInDomain = Standard_True; + if( myAutomaticPosition ) + { + myEndOfArrow = PrsDim::NearestApex(myEllipse, myApexP, myApexN, + myFirstPar, myLastPar, IsInDomain); + myPosition = Center; + myAutomaticPosition = Standard_True; + if ( myIsSetBndBox ) + myPosition = PrsDim::TranslatePointToBound(myPosition, gp_Dir(gp_Vec( Center, myPosition )), + myBndBox ); + curPos = myPosition; + + } + else //!AutomaticPosition + { + curPos = myPosition; + gp_Lin L1(myEllipse.YAxis()); + par = ElCLib::Parameter ( L1, curPos ); + curPos = ElCLib::Value (par, L1); + if (curPos.Distance(myApexP) < curPos.Distance(myApexN)) + myEndOfArrow = myApexP ; + else + myEndOfArrow = myApexN ; + par = ElCLib::Parameter ( myEllipse, myEndOfArrow ); + IsInDomain = PrsDim::InDomain(myFirstPar, myLastPar, par); + myPosition = curPos; + } + + Standard_Real parStart =0.; + if( !IsInDomain ) + { + if(PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < + PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar)) + parStart = myFirstPar; + else + parStart = myLastPar; + + } + + if(!myIsOffset) + DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myEllipse, + curPos, myEndOfArrow, Center, parStart, IsInDomain, + Standard_True, mySymbolPrs); + else + DsgPrs_EllipseRadiusPresentation::Add(aPresentation, myDrawer, myVal, myText, myOffsetCurve, + curPos, myEndOfArrow, Center, parStart, IsInDomain, + Standard_True, mySymbolPrs); +} + + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= + +void PrsDim_MinRadiusDimension::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer /*aMode*/) +{ + + gp_Pnt center = myEllipse.Location(); + gp_Pnt AttachmentPoint = myPosition; + Standard_Real dist = center.Distance(AttachmentPoint); + Standard_Real aRadius = myVal; + //Standard_Real inside = Standard_False; + gp_Pnt pt1; + if (dist > aRadius) pt1 = AttachmentPoint; + else + pt1 = myEndOfArrow; + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + Handle(Select3D_SensitiveSegment) + seg = new Select3D_SensitiveSegment(own, center , pt1); + aSelection->Add(seg); + + // Text + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle( Select3D_SensitiveBox ) box = new Select3D_SensitiveBox( own, + AttachmentPoint.X(), + AttachmentPoint.Y(), + AttachmentPoint.Z(), + AttachmentPoint.X()+size, + AttachmentPoint.Y()+size, + AttachmentPoint.Z()+size); + aSelection->Add(box); + + // Arc of Ellipse + if(myIsAnArc) + { + + Standard_Real parEnd = ElCLib::Parameter ( myEllipse, myEndOfArrow ); + if(!PrsDim::InDomain(myFirstPar, myLastPar, parEnd)) + { + Standard_Real parStart, par; + if(PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myFirstPar) < + PrsDim::DistanceFromApex (myEllipse, myEndOfArrow, myLastPar)) + par = myFirstPar; + else + par = myLastPar; + gp_Vec Vapex(center, ElCLib::Value( parEnd, myEllipse )) ; + gp_Vec Vpnt (center, ElCLib::Value( par, myEllipse )) ; + gp_Dir dir(Vpnt ^ Vapex); + if(myEllipse.Position().Direction().IsOpposite( dir, Precision::Angular())) { + parStart = parEnd; + parEnd = par; + } + else + parStart = par; + Handle(Geom_Curve)TrimCurve; + if(myIsOffset) + { + Handle(Geom_Curve) aCurve = myOffsetCurve; + TrimCurve = new Geom_TrimmedCurve( aCurve, parStart, parEnd ); + } + else + { + Handle(Geom_Ellipse) Ellipse = new Geom_Ellipse( myEllipse ); + TrimCurve = new Geom_TrimmedCurve( Ellipse, parStart, parEnd ); + } + Handle( Select3D_SensitiveCurve ) SensArc; + SensArc = new Select3D_SensitiveCurve( own, TrimCurve ); + aSelection->Add( SensArc ); + } + } + +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MinRadiusDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MinRadiusDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_MinRadiusDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_MinRadiusDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,59 @@ +// Created on: 1998-01-22 +// Created by: Sergey ZARITCHNY +// Copyright (c) 1998-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_MinRadiusDimension_HeaderFile +#define _PrsDim_MinRadiusDimension_HeaderFile + +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_MinRadiusDimension, PrsDim_EllipseRadiusDimension) + +//! -- Ellipse Min radius dimension of a Shape which +//! can be Edge or Face (planar or cylindrical(surface of +//! extrusion or surface of offset)) +class PrsDim_MinRadiusDimension : public PrsDim_EllipseRadiusDimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_MinRadiusDimension, PrsDim_EllipseRadiusDimension) +public: + + //! Max Ellipse radius dimension + //! Shape can be edge , planar face or cylindrical face + Standard_EXPORT PrsDim_MinRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); + + //! Max Ellipse radius dimension with position + //! Shape can be edge , planar face or cylindrical face + Standard_EXPORT PrsDim_MinRadiusDimension(const TopoDS_Shape& aShape, const Standard_Real aVal, const TCollection_ExtendedString& aText, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.0); + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeEllipse (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeArcOfEllipse (const Handle(Prs3d_Presentation)& aPresentation); + +private: + + gp_Pnt myApexP; + gp_Pnt myApexN; + gp_Pnt myEndOfArrow; + +}; + +#endif // _PrsDim_MinRadiusDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_OffsetDimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_OffsetDimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_OffsetDimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_OffsetDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,463 @@ +// Created on: 1997-03-04 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_OffsetDimension, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_OffsetDimension +//purpose : +//======================================================================= +PrsDim_OffsetDimension::PrsDim_OffsetDimension(const TopoDS_Shape& FistShape, + const TopoDS_Shape& SecondShape, + const Standard_Real aVal, + const TCollection_ExtendedString& aText) +:PrsDim_Relation(), +myFAttach(0.,0.,0.), +mySAttach(0.,0.,0.) +{ + myFShape = FistShape; + mySShape = SecondShape; + mySymbolPrs = DsgPrs_AS_BOTHAR; + myVal = aVal; + myText = aText; + //myArrowSize = fabs (myVal/5.); + myArrowSize = fabs (myVal/10.0); + if (myArrowSize > 30.) myArrowSize = 30.; + if (myArrowSize < 15.) myArrowSize = 15.; + //std::cout<<"PrsDim_OffsetDimension::PrsDim_OffsetDimension " << myArrowSize << " myArrowSize"< 30.) myArrowSize = 30.; + if (myArrowSize < 15.) myArrowSize = 15.; + //std::cout<<"PrsDim_OffsetDimension::PrsDim_OffsetDimension " << myArrowSize << " myArrowSize"< 30.) myArrowSize = 30.; + if (myArrowSize < 15.) myArrowSize = 15.; + //std::cout<<"PrsDim_OffsetDimension::PrsDim_OffsetDimension " << myArrowSize << " myArrowSize"<Add(box); + } + + Standard_Real parmin,parmax,parcur; + parmin = ElCLib::Parameter(L3,Proj1); + parmax = parmin; + + parcur = ElCLib::Parameter(L3,Proj2); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + parcur = ElCLib::Parameter(L3,Tcurpos); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + gp_Pnt PointMin = ElCLib::Value(parmin,L3); + gp_Pnt PointMax = ElCLib::Value(parmax,L3); + + Handle(Select3D_SensitiveSegment) seg; + if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + PointMin, + PointMax); + aSel->Add(seg); + } + + if (!myTFAttach.IsEqual(Proj1,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + myTFAttach, + Proj1); + aSel->Add(seg); + } + if (!myTSAttach.IsEqual(Proj2,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + myTSAttach, + Proj2); + aSel->Add(seg); + } +} + +//======================================================================= +//function : ComputeTwoAxesOffset +//purpose : +//======================================================================= +void PrsDim_OffsetDimension::ComputeTwoAxesOffset(const Handle(Prs3d_Presentation)& aprs, + const gp_Trsf& aTrsf) +{ + BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); + BRepAdaptor_Surface surf2(TopoDS::Face(mySShape)); + + gp_Ax1 Ax1Surf1, Ax1Surf2; + + if (surf1.GetType() == GeomAbs_Cylinder) { + gp_Cylinder aCyl= surf1.Cylinder(); + Ax1Surf1 = aCyl.Axis(); + } else if (surf1.GetType() == GeomAbs_Cone) { + gp_Cone aCone= surf1.Cone(); + Ax1Surf1 = aCone.Axis(); + } else if (surf1.GetType() == GeomAbs_Torus) { + gp_Torus aTore= surf1.Torus(); + Ax1Surf1 = aTore.Axis(); + } + Standard_Real FirstUParam = surf1.FirstUParameter(); + Standard_Real FirstVParam = surf1.FirstVParameter(); + Standard_Real LastVParam = surf1.LastVParameter(); + gp_Pnt P1First = surf1.Value(FirstUParam,FirstVParam); + gp_Pnt P1Last = surf1.Value(FirstUParam,LastVParam); + + + if (surf2.GetType() == GeomAbs_Cylinder) { + gp_Cylinder aCyl= surf2.Cylinder(); + Ax1Surf2 = aCyl.Axis(); + } else if (surf2.GetType() == GeomAbs_Cone) { + gp_Cone aCone= surf2.Cone(); + Ax1Surf2 = aCone.Axis(); + } else if (surf2.GetType() == GeomAbs_Torus) { + gp_Torus aTore= surf2.Torus(); + Ax1Surf2 = aTore.Axis(); + } + FirstUParam = surf2.FirstUParameter(); + FirstVParam = surf2.FirstVParameter(); + LastVParam = surf2.LastVParameter(); + gp_Pnt P2First = surf2.Value(FirstUParam,FirstVParam); + gp_Pnt P2Last = surf2.Value(FirstUParam,LastVParam); + + + + myFAttach = Ax1Surf1.Location(); + mySAttach = Ax1Surf2.Location(); + myDirAttach = Ax1Surf1.Direction(); + myDirAttach2 = myDirAttach; + gp_Pnt curpos; + gp_Lin aProjLine = gce_MakeLin(myFAttach,myDirAttach); + + if (myAutomaticPosition) { + curpos.SetX ( (myFAttach.X() + mySAttach.X()) /2. + 0.01); + curpos.SetY ( (myFAttach.Y() + mySAttach.Y()) /2. + 0.01); + curpos.SetZ ( (myFAttach.Z() + mySAttach.Z()) /2. + 0.01); + // + 0.01 pour eviter un raise de ComputeSelection... + + myPosition = curpos; + } + else { + curpos = myPosition; + } + + curpos = ElCLib::Value(ElCLib::Parameter(aProjLine,curpos),aProjLine); + // on projette pour la presentation + + gp_Pnt P1FirstProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P1First),aProjLine); + gp_Pnt P1LastProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P1Last),aProjLine); + if (P1FirstProj.Distance(curpos) > P1LastProj.Distance(curpos)) + myFAttach = P1FirstProj; + else + myFAttach = P1LastProj; + + gp_Pnt P2FirstProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P2First),aProjLine); + gp_Pnt P2LastProj = ElCLib::Value(ElCLib::Parameter(aProjLine,P2Last),aProjLine); + if (P2FirstProj.Distance(curpos) > P2LastProj.Distance(curpos)) + mySAttach = P2FirstProj; + else + mySAttach = P2LastProj; + + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + //std::cout<<"PrsDim_OffsetDimension::PrsDim_OffsetDimension " << myArrowSize << " myArrowSize"<SetLength(myArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + + gp_Pnt myTFAttach = myFAttach.Transformed (aTrsf); + gp_Pnt myTSAttach = mySAttach.Transformed (aTrsf); + gp_Dir myTDirAttach = myDirAttach.Transformed (aTrsf); + gp_Dir myTDirAttach2 = myTDirAttach; + gp_Pnt Tcurpos = curpos.Transformed (aTrsf); + + if (myIsSetBndBox) + Tcurpos = PrsDim::TranslatePointToBound( Tcurpos, myDirAttach, myBndBox ); + + DsgPrs_OffsetPresentation::AddAxes(aprs, + myDrawer, + myText, + myTFAttach, + myTSAttach, + myTDirAttach, + myTDirAttach2, + Tcurpos); + + BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); + TopoDS_Shape myTFShape = transform1.Shape(); + BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); + TopoDS_Shape myTSShape = transform2.Shape(); + + StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); + StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); +} + +//======================================================================= +//function : ComputeTwoFacesOffset +//purpose : +//======================================================================= +void PrsDim_OffsetDimension::ComputeTwoFacesOffset(const Handle(Prs3d_Presentation)& aprs, + const gp_Trsf& aTrsf) +{ + gp_Dir norm1 = myDirAttach; + gp_Pnt curpos; + gp_Ax2 myax2; + if (myAutomaticPosition && ! myIsSetBndBox) { + TopExp_Explorer explo(myFShape,TopAbs_VERTEX); + if (explo.More()) { + TopoDS_Vertex vertref = TopoDS::Vertex(explo.Current()); + myFAttach = BRep_Tool::Pnt(vertref); + gp_Vec trans = norm1.XYZ()*fabs(myVal/2); + gp_Ax2 ax2(myFAttach,norm1); + myDirAttach = ax2.XDirection(); + curpos = myFAttach.Translated(trans); + if (myVal <= Precision::Confusion()) { + gp_Vec vecnorm1 = norm1.XYZ()*.001; + curpos.Translate(vecnorm1); + } + myPosition = curpos; + myax2 = ax2; + } + } + else { + if (myAutomaticPosition && myIsSetBndBox) + { + Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax; + myBndBox.Get( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax ); + myPosition.SetCoord( aXmax, aYmax, aZmax ); + } + + curpos = myPosition; + myFAttach = PrsDim::Nearest(myFShape,curpos); + if (myFAttach.Distance(curpos) <= Precision::Confusion()) { + gp_Ax2 ax2(myFAttach,norm1); + myDirAttach = ax2.XDirection(); + myax2 = ax2; + } + else { + gp_Dir orient(myFAttach.XYZ()-curpos.XYZ()); + gp_Ax2 ax2(myFAttach,norm1); + if (orient.Angle(norm1) <= Precision::Angular()) { + myDirAttach = ax2.XDirection(); + } + else { + gp_Dir adir = norm1 ^ orient; + myDirAttach = adir ^ norm1; + } + myax2 = ax2; + } + } + // en attendant mieux + mySAttach = PrsDim::Nearest(mySShape,curpos); + gp_Ax3 anax3 (myax2); + gp_Pln apln (anax3); + + //gp_Pnt proj2; + Standard_Real u2,v2, uatt, vatt; + ElSLib::Parameters (apln , mySAttach, uatt,vatt); + ElSLib::Parameters (apln , curpos , u2,v2); + + if (uatt== u2 && vatt == v2) { + myDirAttach2 = myDirAttach; + } else { + gp_Vec avec (ElSLib::Value (uatt,vatt, apln) , ElSLib::Value (u2,v2, apln)); + myDirAttach2.SetCoord (avec.X(),avec.Y(),avec.Z()); + } + + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + //std::cout<<"PrsDim_OffsetDimension::PrsDim_OffsetDimension " << myArrowSize << " myArrowSize"<SetLength(myArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + + gp_Pnt myTFAttach = myFAttach.Transformed (aTrsf); + gp_Pnt myTSAttach = mySAttach.Transformed (aTrsf); + gp_Dir myTDirAttach = myDirAttach.Transformed (aTrsf); + gp_Dir myTDirAttach2 = myDirAttach2.Transformed (aTrsf); + gp_Pnt Tcurpos = curpos.Transformed (aTrsf); + +/* + if (myIsSetBndBox) + { + BRepAdaptor_Surface surf1(TopoDS::Face(myFShape)); + Tcurpos = PrsDim::TranslatePointToBound( Tcurpos, surf1.Plane().XAxis().Direction(), myBndBox ); + } +*/ + DsgPrs_OffsetPresentation::Add(aprs, + myDrawer, + myText, + myTFAttach, + myTSAttach, + myTDirAttach, + myTDirAttach2, + Tcurpos); + + + BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); + TopoDS_Shape myTFShape = transform1.Shape(); + BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); + TopoDS_Shape myTSShape = transform2.Shape(); + + StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); + StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); +} + +//======================================================================= +//function : ComputeAxeFaceOffset +//purpose : +//======================================================================= +void PrsDim_OffsetDimension::ComputeAxeFaceOffset(const Handle(Prs3d_Presentation)& aprs, + const gp_Trsf& aTrsf) +{ + BRepBuilderAPI_Transform transform1 (myFShape, aTrsf, Standard_True); + TopoDS_Shape myTFShape = transform1.Shape(); + BRepBuilderAPI_Transform transform2 (mySShape, aTrsf, Standard_True); + TopoDS_Shape myTSShape = transform2.Shape(); + + StdPrs_WFShape::Add (aprs, myTFShape, myDrawer); + StdPrs_WFShape::Add (aprs, myTSShape, myDrawer); +} + diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_OffsetDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_OffsetDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_OffsetDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_OffsetDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,72 @@ +// Created on: 1997-03-04 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_OffsetDimension_HeaderFile +#define _PrsDim_OffsetDimension_HeaderFile + +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_OffsetDimension, PrsDim_Relation) + +//! A framework to display dimensions of offsets. +//! The relation between the offset and the basis shape +//! is indicated. This relation is displayed with arrows and +//! text. The text gives the dsitance between the offset +//! and the basis shape. +class PrsDim_OffsetDimension : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_OffsetDimension, PrsDim_Relation) +public: + + //! Constructs the offset display object defined by the + //! first shape aFShape, the second shape aSShape, the + //! dimension aVal, and the text aText. + Standard_EXPORT PrsDim_OffsetDimension(const TopoDS_Shape& FistShape, const TopoDS_Shape& SecondShape, const Standard_Real aVal, const TCollection_ExtendedString& aText); + + //! Indicates that the dimension we are concerned with is an offset. + virtual PrsDim_KindOfDimension KindOfDimension() const Standard_OVERRIDE { return PrsDim_KOD_OFFSET; } + + //! Returns true if the offset datum is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + + //! Sets a transformation aTrsf for presentation and + //! selection to a relative position. + void SetRelativePos (const gp_Trsf& aTrsf) { myRelativePos = aTrsf; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoFacesOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); + + Standard_EXPORT void ComputeTwoAxesOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); + + Standard_EXPORT void ComputeAxeFaceOffset (const Handle(Prs3d_Presentation)& aPresentation, const gp_Trsf& aTrsf); + +private: + + gp_Pnt myFAttach; + gp_Pnt mySAttach; + gp_Dir myDirAttach; + gp_Dir myDirAttach2; + gp_Trsf myRelativePos; + +}; + +#endif // _PrsDim_OffsetDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_ParallelRelation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_ParallelRelation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_ParallelRelation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_ParallelRelation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,380 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_ParallelRelation, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_ParallelRelation::PrsDim_ParallelRelation(const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape, + const Handle(Geom_Plane)& aPlane) +{ + myFShape = aFShape; + mySShape = aSShape; + myPlane = aPlane; + myAutomaticPosition = Standard_True; + myArrowSize = 0.01; + mySymbolPrs = DsgPrs_AS_BOTHAR; +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_ParallelRelation::PrsDim_ParallelRelation(const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape, + const Handle(Geom_Plane)& aPlane, + const gp_Pnt& aPosition, + const DsgPrs_ArrowSide aSymbolPrs, + const Standard_Real anArrowSize) +{ + myFShape = aFShape; + mySShape = aSShape; + myPlane = aPlane; + myAutomaticPosition = Standard_False; + SetArrowSize( anArrowSize ); + myPosition = aPosition; + mySymbolPrs = aSymbolPrs; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_ParallelRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + switch (myFShape.ShapeType()) + { + case TopAbs_FACE : + { + // cas longueur entre deux faces + ComputeTwoFacesParallel(aPresentation); + } + break; + case TopAbs_EDGE : + { + // cas longueur entre deux edges + ComputeTwoEdgesParallel(aPresentation); + } + break; + default: + break; + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_ParallelRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + gp_Lin L1 (myFAttach,myDirAttach); + gp_Lin L2 (mySAttach,myDirAttach); + gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,myPosition),L1); + gp_Pnt Proj2 = ElCLib::Value(ElCLib::Parameter(L2,myPosition),L2); + + gp_Lin L3; + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + + if (!Proj1.IsEqual(Proj2,Precision::Confusion())) + { + L3 = gce_MakeLin(Proj1,Proj2); + } + else + { + L3 = gce_MakeLin(Proj1,myDirAttach); + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle(Select3D_SensitiveBox) box = + new Select3D_SensitiveBox(own, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X()+size, + myPosition.Y()+size, + myPosition.Z()+size); + aSelection->Add(box); + } + Standard_Real parmin,parmax,parcur; + parmin = ElCLib::Parameter(L3,Proj1); + parmax = parmin; + + parcur = ElCLib::Parameter(L3,Proj2); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + parcur = ElCLib::Parameter(L3,myPosition); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + gp_Pnt PointMin = ElCLib::Value(parmin,L3); + gp_Pnt PointMax = ElCLib::Value(parmax,L3); + + Handle(Select3D_SensitiveSegment) seg; + + if (!PointMin.IsEqual(PointMax,Precision::Confusion())) + { + seg = new Select3D_SensitiveSegment(own, + PointMin, + PointMax); + aSelection->Add(seg); + } + if (!myFAttach.IsEqual(Proj1,Precision::Confusion())) + { + seg = new Select3D_SensitiveSegment(own, myFAttach, Proj1); + aSelection->Add(seg); + } + if (!mySAttach.IsEqual(Proj2,Precision::Confusion())) + { + seg = new Select3D_SensitiveSegment(own, mySAttach, Proj2); + aSelection->Add(seg); + } +} + +//======================================================================= +//function : ComputeTwoFacesParallel +//purpose : +//======================================================================= +void PrsDim_ParallelRelation::ComputeTwoFacesParallel(const Handle(Prs3d_Presentation)&) +{ + throw Standard_NotImplemented("PrsDim_ParallelRelation::ComputeTwoFacesParallel not implemented"); +} + +//======================================================================= +//function : ComputeTwoEdgesParallel +//purpose : +//======================================================================= +void PrsDim_ParallelRelation::ComputeTwoEdgesParallel(const Handle(Prs3d_Presentation)& aPresentation) +{ + TopoDS_Edge E1 = TopoDS::Edge(myFShape); + TopoDS_Edge E2 = TopoDS::Edge(mySShape); + + gp_Pnt ptat11,ptat12,ptat21,ptat22;//,pint3d; + Handle(Geom_Curve) geom1,geom2; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if (!PrsDim::ComputeGeometry(E1,E2,myExtShape, + geom1,geom2, + ptat11,ptat12,ptat21,ptat22, + extCurv, + isInfinite1,isInfinite2, + myPlane)) + { + return; + } + + aPresentation->SetInfiniteState((isInfinite1 || isInfinite2) && (myExtShape != 0)); + + gp_Lin l1; + gp_Lin l2; + Standard_Boolean isEl1 = Standard_False, isEl2 = Standard_False; + + if (geom1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + Handle(Geom_Ellipse) geom_el1 (Handle(Geom_Ellipse)::DownCast (geom1)); + // construct lines through focuses + gp_Ax1 elAx = geom_el1->XAxis(); + l1 = gp_Lin(elAx); + Standard_Real focex = geom_el1->MajorRadius() - geom_el1->Focal()/2.0; + gp_Vec transvec = gp_Vec(elAx.Direction())*focex; + ptat11 = geom_el1->Focus1().Translated(transvec); + ptat12 = geom_el1->Focus2().Translated(-transvec); + isEl1 = Standard_True; + } + else if (geom1->IsInstance(STANDARD_TYPE(Geom_Line))) + { + Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); + l1 = geom_lin1->Lin(); + } + else return; + + if (geom2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + Handle(Geom_Ellipse) geom_el2 (Handle(Geom_Ellipse)::DownCast (geom2)); + // construct lines through focuses + gp_Ax1 elAx = geom_el2->XAxis(); + l2 = gp_Lin(elAx); + Standard_Real focex = geom_el2->MajorRadius() - geom_el2->Focal()/2.0; + gp_Vec transvec = gp_Vec(elAx.Direction())*focex; + ptat21 = geom_el2->Focus1().Translated(transvec); + ptat22 = geom_el2->Focus2().Translated(-transvec); + isEl2 = Standard_True; + } + else if (geom2->IsInstance(STANDARD_TYPE(Geom_Line))) + { + Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); + l2 = geom_lin2->Lin(); + } + else return; + + const Handle(Geom_Line)& geom_lin1 = new Geom_Line(l1); + const Handle(Geom_Line)& geom_lin2 = new Geom_Line(l2); + + myDirAttach = l1.Direction(); + // size + if( !myArrowSizeIsDefined ) { + Standard_Real arrSize1 (myArrowSize), arrSize2 (myArrowSize); + if (!isInfinite1) arrSize1 = ptat11.Distance(ptat12)/50.; + if (!isInfinite2) arrSize2 = ptat21.Distance(ptat22)/50.; + myArrowSize = Max(myArrowSize,Max(arrSize1,arrSize2)); +// myArrowSize = Min(myArrowSize,Min(arrSize1,arrSize2)); + } + + if ( myAutomaticPosition ) + { + gp_Pnt curpos; + if ( !isInfinite1 ) + { + gp_Pnt p2 = ElCLib::Value(ElCLib::Parameter(l2,ptat11),l2); + curpos.SetXYZ((ptat11.XYZ() + p2.XYZ())/2.); + } + else if ( !isInfinite2 ) + { + gp_Pnt p2 = ElCLib::Value(ElCLib::Parameter(l1,ptat21),l1); + curpos.SetXYZ((ptat21.XYZ()+p2.XYZ())/2.); + } + else + { + curpos.SetXYZ((l1.Location().XYZ()+l2.Location().XYZ())/2.); + } + // offset pour eviter confusion Edge et Dimension + gp_Vec offset (myDirAttach); + offset = offset*myArrowSize*(-10.); + curpos.Translate(offset); + myPosition = curpos; + } + + // recherche points attache + if (!isInfinite1) + { + if ( isEl1 ) + { + if (myPosition.Distance(ptat11) < myPosition.Distance(ptat12)) myFAttach = ptat12; + else myFAttach = ptat11; + } + else + { + if (myPosition.Distance(ptat11) > myPosition.Distance(ptat12)) myFAttach = ptat12; + else myFAttach = ptat11; + } + } + else + { + myFAttach = ElCLib::Value(ElCLib::Parameter(l1,myPosition),l1); + } + + if (!isInfinite2) + { + if ( isEl2 ) + { + if (myPosition.Distance(ptat21) < myPosition.Distance(ptat22)) mySAttach = ptat22; + else mySAttach = ptat21; + } + else + { + if (myPosition.Distance(ptat21) > myPosition.Distance(ptat22)) mySAttach = ptat22; + else mySAttach = ptat21; + } + } + else + { + mySAttach = ElCLib::Value(ElCLib::Parameter(l2,myPosition),l2); + } + TCollection_ExtendedString aText (" //"); + + if (l1.Distance(l2) <= Precision::Confusion()) + { + myArrowSize = 0.; + } + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + if ( myExtShape == 1) + mySymbolPrs = DsgPrs_AS_FIRSTPT_LASTAR; + else if ( myExtShape == 2) + mySymbolPrs = DsgPrs_AS_FIRSTAR_LASTPT; + + DsgPrs_LengthPresentation::Add(aPresentation, + myDrawer, + aText, + myFAttach, + mySAttach, + myDirAttach, + myPosition, + mySymbolPrs); + if ( (myExtShape != 0) && !extCurv.IsNull()) + { + gp_Pnt pf, pl; + if ( myExtShape == 1 ) + { + if (!isInfinite1) + { + pf = ptat11; + pl = ptat12; + } + ComputeProjEdgePresentation(aPresentation,E1,geom_lin1,pf,pl); + } + else + { + if (!isInfinite2) + { + pf = ptat21; + pl = ptat22; + } + ComputeProjEdgePresentation(aPresentation,E2,geom_lin2,pf,pl); + } + } +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_ParallelRelation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_ParallelRelation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_ParallelRelation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_ParallelRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,67 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_ParallelRelation_HeaderFile +#define _PrsDim_ParallelRelation_HeaderFile + +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_ParallelRelation, PrsDim_Relation) + +//! A framework to display constraints of parallelism +//! between two or more Interactive Objects. These +//! entities can be faces or edges. +class PrsDim_ParallelRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_ParallelRelation, PrsDim_Relation) +public: + + + //! Constructs an object to display parallel constraints. + //! This object is defined by the first shape aFShape and + //! the second shape aSShape and the plane aPlane. + Standard_EXPORT PrsDim_ParallelRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); + + //! Constructs an object to display parallel constraints. + //! This object is defined by the first shape aFShape and + //! the second shape aSShape the plane aPlane, the + //! position aPosition, the type of arrow, aSymbolPrs and + //! its size anArrowSize. + Standard_EXPORT PrsDim_ParallelRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane, const gp_Pnt& aPosition, const DsgPrs_ArrowSide aSymbolPrs, const Standard_Real anArrowSize = 0.01); + + //! Returns true if the parallelism is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoFacesParallel (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeTwoEdgesParallel (const Handle(Prs3d_Presentation)& aPresentation); + +private: + + gp_Pnt myFAttach; + gp_Pnt mySAttach; + gp_Dir myDirAttach; + +}; + +#endif // _PrsDim_ParallelRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_PerpendicularRelation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_PerpendicularRelation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_PerpendicularRelation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_PerpendicularRelation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,346 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_PerpendicularRelation, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : TwoEdgesPerpendicular +//======================================================================= +PrsDim_PerpendicularRelation::PrsDim_PerpendicularRelation(const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape, + const Handle(Geom_Plane)& aPlane) +:PrsDim_Relation() +{ + myFShape = aFShape; + mySShape = aSShape; + myPlane = aPlane; +} + +//======================================================================= +//function : Constructor +//purpose : TwoFacesPerpendicular +//======================================================================= +PrsDim_PerpendicularRelation::PrsDim_PerpendicularRelation(const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape) +:PrsDim_Relation() +{ + myFShape = aFShape; + mySShape = aSShape; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_PerpendicularRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + if (myFShape.ShapeType() == mySShape.ShapeType()) { + switch (myFShape.ShapeType()) { + case TopAbs_FACE : + { + // cas perpendiculaire entre deux faces + ComputeTwoFacesPerpendicular(aPresentation); + } + break; + case TopAbs_EDGE : + { + // cas perpendiculaire entre deux edges + ComputeTwoEdgesPerpendicular(aPresentation); + } + break; + default: + break; + } + } + // Cas pas traite - Edge/Face +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_PerpendicularRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + const gp_Pnt& pos = myPosition; + Handle(Select3D_SensitiveSegment) seg; + Standard_Boolean ok1(Standard_False),ok2(Standard_False); + + if (!myFAttach.IsEqual(pos,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + myFAttach, + pos); + aSelection->Add(seg); + ok1 = Standard_True; + } + if (!mySAttach.IsEqual(myPosition,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + mySAttach, + pos); + aSelection->Add(seg); + ok2 = Standard_True; + } + + if (ok1 && ok2) { + gp_Vec vec1(gce_MakeDir(pos,myFAttach)); + gp_Vec vec2(gce_MakeDir(pos,mySAttach)); + Standard_Real dist1(pos.Distance(myFAttach)); + Standard_Real dist2(pos.Distance(mySAttach)); + vec1 *= dist1; + vec1 *= .2; + vec2 *= dist2; + vec2 *= .2; + + gp_Pnt pAx11 = pos.Translated(vec1); + gp_Pnt pAx22 = pos.Translated(vec2); + gp_Pnt p_symb = pAx22.Translated(vec1); + seg = new Select3D_SensitiveSegment(own,pAx11,p_symb); + aSelection->Add(seg); + seg = new Select3D_SensitiveSegment(own,p_symb,pAx22); + aSelection->Add(seg); + } +} + +//======================================================================= +//function : ComputeTwoFacesPerpendicular +//purpose : +//======================================================================= +void PrsDim_PerpendicularRelation::ComputeTwoFacesPerpendicular + (const Handle(Prs3d_Presentation)& /*aPresentation*/) +{ +} + +//======================================================================= +//function : ComputeTwoEdgesPerpendicular +//purpose : +//======================================================================= +void PrsDim_PerpendicularRelation::ComputeTwoEdgesPerpendicular(const Handle(Prs3d_Presentation)& aPresentation) +{ + // 3d lines + Handle(Geom_Curve) geom1,geom2; + gp_Pnt pint3d,p1,p2,pAx1,pAx2,ptat11,ptat12,ptat21,ptat22; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if ( !PrsDim::ComputeGeometry(TopoDS::Edge(myFShape),TopoDS::Edge(mySShape), + myExtShape, + geom1,geom2, + ptat11,ptat12,ptat21,ptat22, + extCurv, + isInfinite1,isInfinite2, + myPlane) ) return; + + Standard_Boolean interOut1(Standard_False),interOut2(Standard_False); + + Handle(Geom_Line) geom_lin1; + Handle(Geom_Line) geom_lin2; + if ( geom1->IsInstance(STANDARD_TYPE(Geom_Ellipse)) ) + { + Handle(Geom_Ellipse) geom_el (Handle(Geom_Ellipse)::DownCast (geom1)); + // construct lines through focuses + gp_Ax1 elAx = geom_el->XAxis(); + gp_Lin ll (elAx); + geom_lin1 = new Geom_Line(ll); + Standard_Real focex = geom_el->MajorRadius() - geom_el->Focal()/2.0; + gp_Vec transvec = gp_Vec(elAx.Direction())*focex; + ptat11 = geom_el->Focus1().Translated(transvec); + ptat12 = geom_el->Focus2().Translated(-transvec); + interOut1 = Standard_True; + } + else if ( geom1->IsInstance(STANDARD_TYPE(Geom_Line)) ) + { + geom_lin1 = Handle(Geom_Line)::DownCast (geom1); + } + else return; + + if (geom2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + Handle(Geom_Ellipse) geom_el (Handle(Geom_Ellipse)::DownCast (geom2)); + // construct lines through focuses + gp_Ax1 elAx = geom_el->XAxis(); + gp_Lin ll (elAx); + geom_lin2 = new Geom_Line(ll); + Standard_Real focex = geom_el->MajorRadius() - geom_el->Focal()/2.0; + gp_Vec transvec = gp_Vec(elAx.Direction())*focex; + ptat21 = geom_el->Focus1().Translated(transvec); + ptat22 = geom_el->Focus2().Translated(-transvec); + interOut2 = Standard_True; + } + else if ( geom2->IsInstance(STANDARD_TYPE(Geom_Line)) ) + { + geom_lin2 = Handle(Geom_Line)::DownCast (geom2); + } + else return; + + // current face + BRepBuilderAPI_MakeFace makeface (myPlane->Pln()); + TopoDS_Face face (makeface.Face()); + BRepAdaptor_Surface adp (makeface.Face()); + + // 2d lines => projection of 3d on current plane + Handle(Geom2d_Curve) aGeom2dCurve = GeomAPI::To2d(geom_lin1,myPlane->Pln()); + Handle(Geom2d_Line) lin1_2d = Handle(Geom2d_Line)::DownCast (aGeom2dCurve) ; + aGeom2dCurve = GeomAPI::To2d(geom_lin2,myPlane->Pln()); + Handle(Geom2d_Line) lin2_2d = Handle(Geom2d_Line)::DownCast (aGeom2dCurve) ; + IntAna2d_AnaIntersection inter(lin1_2d->Lin2d(),lin2_2d->Lin2d()); + if (!inter.IsDone()) return; + if (!inter.NbPoints()) return; + + gp_Pnt2d pint(inter.Point(1).Value()); + pint3d = adp.Value(pint.X(),pint.Y()); + + myPosition = pint3d; + // recherche points attache + Standard_Real par1,par2,curpar,pmin,pmax;//,dist,sign; + Standard_Real length(0.); + + if ( isInfinite1 && isInfinite2 ) + { + Standard_Real curpar1 = ElCLib::Parameter(geom_lin1->Lin(),pint3d); + Standard_Real curpar2 = ElCLib::Parameter(geom_lin2->Lin(),pint3d); + par1 = par2 = 50.; + p1 = p2 = pint3d; + myFAttach = ElCLib::Value(curpar1+par1,geom_lin1->Lin()); + mySAttach = ElCLib::Value(curpar2+par2,geom_lin2->Lin()); + } + else + { + Standard_Boolean lengthComputed (Standard_False); + if ( !isInfinite1 ) + { + curpar = ElCLib::Parameter(geom_lin1->Lin(),pint3d); + par1 = ElCLib::Parameter(geom_lin1->Lin(),ptat11); + par2 = ElCLib::Parameter(geom_lin1->Lin(),ptat12); + pmin = Min(par1,par2); + pmax = Max(par1,par2); + + if ( myPosition.SquareDistance(ptat11) > myPosition.SquareDistance(ptat12) ) + p1 = ptat11; + else + p1 = ptat12; + if ( (curpar < pmin) || (curpar > pmax) ) + { + interOut1 = Standard_True; + } + if ( !isInfinite2 ) length = 2.*Min(ptat11.Distance(ptat12),ptat21.Distance(ptat22))/5.; + else length = 2.*ptat11.Distance(ptat12)/5.; + lengthComputed = Standard_True; + gp_Vec vec1 (gce_MakeDir(myPosition,p1)); + vec1.Multiply(length); + pAx1 = myPosition.Translated(vec1); + myFAttach = pAx1; + } + if ( !isInfinite2 ) + { + curpar = ElCLib::Parameter(geom_lin2->Lin(),pint3d); + par1 = ElCLib::Parameter(geom_lin2->Lin(),ptat21); + par2 = ElCLib::Parameter(geom_lin2->Lin(),ptat22); + pmin = Min(par1,par2); + pmax = Max(par1,par2); + + if ( myPosition.SquareDistance(ptat21) > myPosition.SquareDistance(ptat22) ) p2 = ptat21; + else p2 = ptat22; + if ( (curpar < pmin) || (curpar > pmax) ) + { + interOut2 = Standard_True; + } + gp_Vec vec2 (gce_MakeDir(myPosition,p2)); + if ( !lengthComputed ) + { + if ( !isInfinite1 ) length = 2.*Min(ptat11.Distance(ptat12),ptat21.Distance(ptat22))/5.; + else length = 2.*ptat21.Distance(ptat22)/5.; + } + vec2.Multiply(length); + pAx2 = myPosition.Translated(vec2); + mySAttach = pAx2; + } + if ( isInfinite1 ) + { + p1 = myPosition; + gp_Vec vec1(geom_lin1->Lin().Direction()); + vec1.Multiply(length); + myFAttach = myPosition.Translated(vec1); + } + if ( isInfinite2 ) + { + p2 = myPosition; + gp_Vec vec2(geom_lin2->Lin().Direction()); + vec2.Multiply(length); + mySAttach = myPosition.Translated(vec2); + } + } + DsgPrs_PerpenPresentation::Add(aPresentation,myDrawer, + myFAttach,mySAttach, + p1,p2, + myPosition, + interOut1,interOut2); + + if ( (myExtShape != 0) && !extCurv.IsNull()) { + gp_Pnt pf,pl; + if ( myExtShape == 1 ) { + if (!isInfinite1) { + pf = ptat11; + pl = ptat12; + } + aPresentation->SetInfiniteState(isInfinite1); + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),geom_lin1,pf,pl); + } + else { + if (!isInfinite2) { + pf = ptat21; + pl = ptat22; + } + aPresentation->SetInfiniteState(isInfinite2); + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),geom_lin2,pf,pl); + } + } +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_PerpendicularRelation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_PerpendicularRelation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_PerpendicularRelation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_PerpendicularRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,64 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_PerpendicularRelation_HeaderFile +#define _PrsDim_PerpendicularRelation_HeaderFile + +#include + +DEFINE_STANDARD_HANDLE(PrsDim_PerpendicularRelation, PrsDim_Relation) + +//! A framework to display constraints of perpendicularity +//! between two or more interactive datums. These +//! datums can be edges or faces. +class PrsDim_PerpendicularRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_PerpendicularRelation, PrsDim_Relation) +public: + + //! Constructs an object to display constraints of + //! perpendicularity on shapes. + //! This object is defined by a first shape aFShape, a + //! second shape aSShape, and a plane aPlane. + //! aPlane is the plane of reference to show and test the + //! perpendicular relation between two shapes, at least + //! one of which has a revolved surface. + Standard_EXPORT PrsDim_PerpendicularRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane); + + //! Constructs an object to display constraints of + //! perpendicularity on shapes. + //! This object is defined by a first shape aFShape and a + //! second shape aSShape. + Standard_EXPORT PrsDim_PerpendicularRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape); + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoFacesPerpendicular (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeTwoEdgesPerpendicular (const Handle(Prs3d_Presentation)& aPresentation); + +private: + + gp_Pnt myFAttach; + gp_Pnt mySAttach; + +}; + +#endif // _PrsDim_PerpendicularRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_RadiusDimension.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_RadiusDimension.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_RadiusDimension.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_RadiusDimension.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,275 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier/Serguei Zaritchny +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_RadiusDimension, PrsDim_Dimension) + +namespace +{ + static const Standard_ExtCharacter THE_RADIUS_SYMBOL ('R'); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_RadiusDimension::PrsDim_RadiusDimension (const gp_Circ& theCircle) +: PrsDim_Dimension (PrsDim_KOD_RADIUS) +{ + SetMeasuredGeometry (theCircle); + SetSpecialSymbol (THE_RADIUS_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_RadiusDimension::PrsDim_RadiusDimension (const gp_Circ& theCircle, + const gp_Pnt& theAttachPoint) +: PrsDim_Dimension (PrsDim_KOD_RADIUS) +{ + SetMeasuredGeometry (theCircle, theAttachPoint); + SetSpecialSymbol (THE_RADIUS_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_RadiusDimension::PrsDim_RadiusDimension (const TopoDS_Shape& theShape) +: PrsDim_Dimension (PrsDim_KOD_RADIUS) +{ + SetMeasuredGeometry (theShape); + SetSpecialSymbol (THE_RADIUS_SYMBOL); + SetDisplaySpecialSymbol (PrsDim_DisplaySpecialSymbol_Before); + SetFlyout (0.0); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::SetMeasuredGeometry (const gp_Circ& theCircle, + const gp_Pnt& theAnchorPoint, + const Standard_Boolean theHasAnchor) +{ + myCircle = theCircle; + myGeometryType = GeometryType_Edge; + myShape = BRepLib_MakeEdge (theCircle); + myAnchorPoint = theHasAnchor ? theAnchorPoint : ElCLib::Value (0, myCircle); + myIsGeometryValid = IsValidCircle (myCircle) && IsValidAnchor (myCircle, myAnchorPoint); + + if (myIsGeometryValid) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : SetMeasuredGeometry +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::SetMeasuredGeometry (const TopoDS_Shape& theShape, + const gp_Pnt& theAnchorPoint, + const Standard_Boolean theHasAnchor) +{ + Standard_Boolean isClosed = Standard_False; + myShape = theShape; + myGeometryType = GeometryType_UndefShapes; + myIsGeometryValid = InitCircularDimension (theShape, myCircle, myAnchorPoint, isClosed) + && IsValidCircle (myCircle); + if (theHasAnchor) + { + myAnchorPoint = theAnchorPoint; + myIsGeometryValid = myIsGeometryValid && IsValidAnchor (myCircle, myAnchorPoint); + } + + if (myIsGeometryValid) + { + ComputePlane(); + } + + SetToUpdate(); +} + +//======================================================================= +//function : CheckPlane +//purpose : +//======================================================================= +Standard_Boolean PrsDim_RadiusDimension::CheckPlane (const gp_Pln& thePlane) const +{ + // Check if anchor point and circle center point belong to plane. + if (!thePlane.Contains (myAnchorPoint, Precision::Confusion()) && + !thePlane.Contains (myCircle.Location(), Precision::Confusion())) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : ComputePlane +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::ComputePlane() +{ + if (!myIsGeometryValid) + { + return; + } + + gp_Dir aDimensionX = gce_MakeDir (myAnchorPoint, myCircle.Location()); + + myPlane = gp_Pln (gp_Ax3 (myCircle.Location(), + myCircle.Axis().Direction(), + aDimensionX)); +} + +//======================================================================= +//function : GetModelUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_RadiusDimension::GetModelUnits() const +{ + return myDrawer->DimLengthModelUnits(); +} + +//======================================================================= +//function : GetDisplayUnits +//purpose : +//======================================================================= +const TCollection_AsciiString& PrsDim_RadiusDimension::GetDisplayUnits() const +{ + return myDrawer->DimLengthDisplayUnits(); +} + +//======================================================================= +//function : SetModelUnits +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::SetModelUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthModelUnits (theUnits); +} + +//======================================================================= +//function : SetDisplayUnits +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::SetDisplayUnits (const TCollection_AsciiString& theUnits) +{ + myDrawer->SetDimLengthDisplayUnits(theUnits); +} + +//======================================================================= +//function : ComputeValue +//purpose : +//======================================================================= +Standard_Real PrsDim_RadiusDimension::ComputeValue() const +{ + if (!IsValid()) + { + return 0.0; + } + + return myCircle.Radius(); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::Compute (const Handle(PrsMgr_PresentationManager3d)& /*thePM*/, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode) +{ + mySelectionGeom.Clear (theMode); + + if (!IsValid()) + { + return; + } + + DrawLinearDimension (thePresentation, theMode, myAnchorPoint, myCircle.Location(), Standard_True); +} + +//======================================================================= +//function : IsValidCircle +//purpose : +//======================================================================= +Standard_Boolean PrsDim_RadiusDimension::IsValidCircle (const gp_Circ& theCircle) const +{ + return theCircle.Radius() > Precision::Confusion(); +} + +//======================================================================= +//function : IsValidAnchor +//purpose : +//======================================================================= +Standard_Boolean PrsDim_RadiusDimension::IsValidAnchor (const gp_Circ& theCircle, + const gp_Pnt& theAnchor) const +{ + gp_Pln aCirclePlane (theCircle.Location(), theCircle.Axis().Direction()); + Standard_Real anAnchorDist = theAnchor.Distance (theCircle.Location()); + + return anAnchorDist > Precision::Confusion() + && aCirclePlane.Contains (theAnchor, Precision::Confusion()); +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +gp_Pnt PrsDim_RadiusDimension::GetTextPosition() const +{ + if (IsTextPositionCustom()) + { + return myFixedTextPosition; + } + + // Counts text position according to the dimension parameters + return GetTextPositionForLinear (myAnchorPoint, myCircle.Location(), Standard_True); +} + +//======================================================================= +//function : GetTextPosition +//purpose : +//======================================================================= +void PrsDim_RadiusDimension::SetTextPosition (const gp_Pnt& theTextPos) +{ + if (!myIsGeometryValid) + { + return; + } + + myIsTextPositionFixed = Standard_True; + myFixedTextPosition = theTextPos; + + SetToUpdate(); +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_RadiusDimension.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_RadiusDimension.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_RadiusDimension.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_RadiusDimension.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,148 @@ +// Copyright (c) 1995-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_RadiusDimension_HeaderFile +#define _PrsDim_RadiusDimension_HeaderFile + +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_RadiusDimension, PrsDim_Dimension) + +//! Radius dimension. Can be constructued: +//! - On generic circle. +//! - On generic circle with user-defined anchor point on that circle. +//! - On generic shape containing geometry that can be measured +//! by diameter dimension: circle wire, arc, circular face, etc. +//! The anchor point is the location of left attachement point of +//! dimension on the circle. It can be user-specified, or computed as +//! middle point on the arc. The radius dimension always lies in the +//! plane of the measured circle. The dimension is considered as +//! invalid if the user-specified anchor point is not lying on the circle, +//! if the radius of the circle is less than Precision::Confusion(). +//! In case if the dimension is built on the arbitrary shape, +//! it can be considered as invalid if the shape does not contain +//! circle geometry. +class PrsDim_RadiusDimension : public PrsDim_Dimension +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_RadiusDimension, PrsDim_Dimension) +public: + + //! Create radius dimension for the circle geometry. + //! @param theCircle [in] the circle to measure. + Standard_EXPORT PrsDim_RadiusDimension (const gp_Circ& theCircle); + + //! Create radius dimension for the circle geometry and define its + //! orientation by location of the first point on that circle. + //! @param theCircle [in] the circle to measure. + //! @param theAnchorPoint [in] the point to define the position + //! of the dimension attachment on the circle. + Standard_EXPORT PrsDim_RadiusDimension (const gp_Circ& theCircle, + const gp_Pnt& theAnchorPoint); + + //! Create radius dimension for the arbitrary shape (if possible). + //! @param theShape [in] the shape to measure. + Standard_EXPORT PrsDim_RadiusDimension (const TopoDS_Shape& theShape); + +public: + + //! @return measured geometry circle. + const gp_Circ& Circle() const { return myCircle; } + + //! @return anchor point on circle for radius dimension. + const gp_Pnt& AnchorPoint() const { return myAnchorPoint; } + + //! @return the measured shape. + const TopoDS_Shape& Shape() const { return myShape; } + +public: + + //! Measure radius of the circle. + //! The dimension will become invalid if the radius of the circle + //! is less than Precision::Confusion(). + //! @param theCircle [in] the circle to measure. + void SetMeasuredGeometry (const gp_Circ& theCircle) { SetMeasuredGeometry (theCircle, gp_Pnt(), Standard_False); } + + //! Measure radius of the circle and orient the dimension so + //! the dimension lines attaches to anchor point on the circle. + //! The dimension will become invalid if the radius of the circle + //! is less than Precision::Confusion(). + //! @param theCircle [in] the circle to measure. + //! @param theAnchorPoint [in] the point to attach the dimension lines, should be on the circle + //! @param theHasAnchor [in] should be set TRUE if theAnchorPoint should be used + Standard_EXPORT void SetMeasuredGeometry (const gp_Circ& theCircle, + const gp_Pnt& theAnchorPoint, + const Standard_Boolean theHasAnchor = Standard_True); + + //! Measure radius on the passed shape, if applicable. + //! The dimension will become invalid if the passed shape is not + //! measurable or if measured diameter value is less than Precision::Confusion(). + //! @param theShape [in] the shape to measure. + void SetMeasuredGeometry (const TopoDS_Shape& theShape) { SetMeasuredGeometry (theShape, gp_Pnt(), Standard_False); } + + //! Measure radius on the passed shape, if applicable. + //! The dimension will become invalid if the passed shape is not + //! measurable or if measured diameter value is less than Precision::Confusion(). + //! @param theShape [in] the shape to measure. + //! @param theAnchorPoint [in] the point to attach the dimension lines, should be on the circle + //! @param theHasAnchor [in] should be set TRUE if theAnchorPoint should be used + Standard_EXPORT void SetMeasuredGeometry (const TopoDS_Shape& theShape, + const gp_Pnt& theAnchorPoint, + const Standard_Boolean theHasAnchor = Standard_True); + + //! @return the display units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetDisplayUnits() const Standard_OVERRIDE; + + //! @return the model units string. + Standard_EXPORT virtual const TCollection_AsciiString& GetModelUnits() const Standard_OVERRIDE; + + Standard_EXPORT virtual void SetDisplayUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetModelUnits (const TCollection_AsciiString& theUnits) Standard_OVERRIDE; + + Standard_EXPORT virtual void SetTextPosition (const gp_Pnt& theTextPos) Standard_OVERRIDE; + + Standard_EXPORT virtual gp_Pnt GetTextPosition() const Standard_OVERRIDE; + +protected: + + Standard_EXPORT virtual void ComputePlane(); + + //! Checks if anchor point and the center of the circle are on the plane. + Standard_EXPORT virtual Standard_Boolean CheckPlane (const gp_Pln& thePlane) const Standard_OVERRIDE; + + Standard_EXPORT virtual Standard_Real ComputeValue() const Standard_OVERRIDE; + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, + const Handle(Prs3d_Presentation)& thePresentation, + const Standard_Integer theMode = 0) Standard_OVERRIDE; + +protected: + + Standard_EXPORT Standard_Boolean IsValidCircle (const gp_Circ& theCircle) const; + + Standard_EXPORT Standard_Boolean IsValidAnchor (const gp_Circ& theCircle, + const gp_Pnt& thePnt) const; + +private: + + gp_Circ myCircle; + gp_Pnt myAnchorPoint; + TopoDS_Shape myShape; +}; + +#endif // _PrsDim_RadiusDimension_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Relation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Relation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Relation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Relation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,262 @@ +// Created on: 1996-12-05 +// Created by: Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_Relation, AIS_InteractiveObject) + +//======================================================================= +//function : PrsDim_Relation +//purpose : +//======================================================================= +PrsDim_Relation::PrsDim_Relation(const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d) +:AIS_InteractiveObject(aTypeOfPresentation3d), + myVal(1.), + myPosition(0.,0.,0.), + myArrowSize( myVal / 10. ), + myAutomaticPosition(Standard_True), + myExtShape(0), + myFirstOffset(0.),mySecondOffset(0.), + myIsSetBndBox( Standard_False ), + myArrowSizeIsDefined( Standard_False) +{ +} + +//======================================================================= +//function : ComputeProjEdgePresentation +//purpose : +//======================================================================= + +void PrsDim_Relation::ComputeProjEdgePresentation(const Handle(Prs3d_Presentation)& aPrs, + const TopoDS_Edge& anEdge, + const Handle(Geom_Curve)& ProjCurv, + const gp_Pnt& FirstP, + const gp_Pnt& LastP, + const Quantity_NameOfColor aColor, + const Standard_Real width, + const Aspect_TypeOfLine aProjTOL, + const Aspect_TypeOfLine aCallTOL) const +{ + if (!myDrawer->HasOwnWireAspect()){ + myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aProjTOL,2.));} + else { + const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect(); + li->SetColor(aColor); + li->SetTypeOfLine(aProjTOL); + li->SetWidth(width); + } + + Standard_Real pf, pl; + TopLoc_Location loc; + Handle(Geom_Curve) curve; + Standard_Boolean isInfinite; + curve = BRep_Tool::Curve(anEdge,loc,pf,pl); + isInfinite = (Precision::IsInfinite(pf) || Precision::IsInfinite(pl)); + + TopoDS_Edge E; + + // Calcul de la presentation de l'edge + if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Line)) ) { + Handle(Geom_Line) gl (Handle(Geom_Line)::DownCast (ProjCurv)); + if ( !isInfinite) { + pf = ElCLib::Parameter(gl->Lin(),FirstP); + pl = ElCLib::Parameter(gl->Lin(),LastP); + BRepBuilderAPI_MakeEdge MakEd(gl->Lin(), pf, pl); + E = MakEd.Edge(); + } + else { + BRepBuilderAPI_MakeEdge MakEd(gl->Lin()); + E = MakEd.Edge(); + } + } + else if (ProjCurv->IsInstance(STANDARD_TYPE(Geom_Circle)) ) { + Handle(Geom_Circle) gc (Handle(Geom_Circle)::DownCast (ProjCurv)); + pf = ElCLib::Parameter(gc->Circ(),FirstP); + pl = ElCLib::Parameter(gc->Circ(),LastP); + BRepBuilderAPI_MakeEdge MakEd(gc->Circ(),pf, pl); + E = MakEd.Edge(); + } + StdPrs_WFShape::Add (aPrs, E, myDrawer); + + //Calcul de la presentation des lignes de raccord + myDrawer->WireAspect()->SetTypeOfLine(aCallTOL); + if (!isInfinite) { + gp_Pnt ppf, ppl; + ppf = BRep_Tool::Pnt( TopExp::FirstVertex(TopoDS::Edge(anEdge))); + ppl = BRep_Tool::Pnt( TopExp::LastVertex(TopoDS::Edge(anEdge))); + if (FirstP.Distance (ppf) > gp::Resolution()) + { + BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); + StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer); + } + else + { + BRepBuilderAPI_MakeVertex MakVert1 (FirstP); + StdPrs_WFShape::Add (aPrs, MakVert1.Vertex(), myDrawer); + } + if (LastP.Distance (ppl) > gp::Resolution()) + { + BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); + StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer); + } + else + { + BRepBuilderAPI_MakeVertex MakVert2 (LastP); + StdPrs_WFShape::Add (aPrs, MakVert2.Vertex(), myDrawer); + } +/* + BRepBuilderAPI_MakeEdge MakEd1 (FirstP, ppf); + StdPrs_WFShape::Add (aPrs, MakEd1.Edge(), myDrawer); + BRepBuilderAPI_MakeEdge MakEd2 (LastP, ppl); + StdPrs_WFShape::Add (aPrs, MakEd2.Edge(), myDrawer); +*/ + } +} + + +//======================================================================= +//function : ComputeProjVertexPresentation +//purpose : +//======================================================================= + +void PrsDim_Relation::ComputeProjVertexPresentation(const Handle(Prs3d_Presentation)& aPrs, + const TopoDS_Vertex& aVertex, + const gp_Pnt& ProjPoint, + const Quantity_NameOfColor aColor, + const Standard_Real width, + const Aspect_TypeOfMarker aProjTOM, + const Aspect_TypeOfLine aCallTOL) const +{ + if (!myDrawer->HasOwnPointAspect()){ + myDrawer->SetPointAspect(new Prs3d_PointAspect(aProjTOM, aColor,1));} + else { + const Handle(Prs3d_PointAspect)& pa = myDrawer->PointAspect(); + pa->SetColor(aColor); + pa->SetTypeOfMarker(aProjTOM); + } + + { + Handle(Graphic3d_Group) aGroup = aPrs->NewGroup(); + Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); + anArrayOfPoints->AddVertex (ProjPoint); + aGroup->SetGroupPrimitivesAspect (myDrawer->PointAspect()->Aspect()); + aGroup->AddPrimitiveArray (anArrayOfPoints); + } + + if (!myDrawer->HasOwnWireAspect()){ + myDrawer->SetWireAspect(new Prs3d_LineAspect(aColor,aCallTOL,2.));} + else { + const Handle(Prs3d_LineAspect)& li = myDrawer->WireAspect(); + li->SetColor(aColor); + li->SetTypeOfLine(aCallTOL); + li->SetWidth(width); + } + + // Si les points ne sont pas confondus... + if (!ProjPoint.IsEqual (BRep_Tool::Pnt(aVertex),Precision::Confusion())) + { + Handle(Graphic3d_Group) aGroup = aPrs->NewGroup(); + Handle(Graphic3d_ArrayOfSegments) anArrayOfLines = new Graphic3d_ArrayOfSegments (2); + anArrayOfLines->AddVertex (ProjPoint); + anArrayOfLines->AddVertex (BRep_Tool::Pnt(aVertex)); + aGroup->SetGroupPrimitivesAspect (myDrawer->WireAspect()->Aspect()); + aGroup->AddPrimitiveArray (anArrayOfLines); + } +} + +//======================================================================= +//function : SetColor +//purpose : +//======================================================================= +void PrsDim_Relation::SetColor(const Quantity_Color &aCol) +{ + if(hasOwnColor && myDrawer->Color() == aCol) return; + + if (!myDrawer->HasOwnTextAspect()) myDrawer->SetTextAspect(new Prs3d_TextAspect()); + hasOwnColor=Standard_True; + myDrawer->SetColor (aCol); + myDrawer->TextAspect()->SetColor(aCol); + + Standard_Real WW = HasWidth()? Width(): myDrawer->HasLink() ? + AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Line) : 1.; + if (!myDrawer->HasOwnLineAspect()) { + myDrawer->SetLineAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW)); + } + if (!myDrawer->HasOwnDimensionAspect()) { + myDrawer->SetDimensionAspect(new Prs3d_DimensionAspect); + } + + myDrawer->LineAspect()->SetColor(aCol); + const Handle(Prs3d_DimensionAspect)& DIMENSION = myDrawer->DimensionAspect(); + const Handle(Prs3d_LineAspect)& LINE = myDrawer->LineAspect(); + const Handle(Prs3d_TextAspect)& TEXT = myDrawer->TextAspect(); + + DIMENSION->SetLineAspect(LINE); + DIMENSION->SetTextAspect(TEXT); +} + +//======================================================================= +//function : UnsetColor +//purpose : +//======================================================================= +void PrsDim_Relation::UnsetColor() +{ + if (!hasOwnColor) return; + hasOwnColor = Standard_False; + const Handle(Prs3d_LineAspect)& LA = myDrawer->LineAspect(); + Quantity_Color CC = Quantity_NOC_YELLOW; + if (myDrawer->HasLink()) + { + AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC); + myDrawer->SetTextAspect(myDrawer->Link()->TextAspect()); + } + LA->SetColor(CC); + myDrawer->DimensionAspect()->SetLineAspect(LA); +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Relation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Relation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_Relation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_Relation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,222 @@ +// Created on: 1997-02-27 +// Created by: Odile Olivier +// Copyright (c) 1997-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_Relation_HeaderFile +#define _PrsDim_Relation_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Geom_Curve; +class Geom_Plane; +class Geom_Surface; +class TopoDS_Edge; +class TopoDS_Vertex; + +//! One of the four types of interactive object in +//! AIS,comprising dimensions and constraints. Serves +//! as the abstract class for the seven relation classes as +//! well as the seven dimension classes. +//! The statuses available for relations between shapes are as follows: +//! - 0 - there is no connection to a shape; +//! - 1 - there is a connection to the first shape; +//! - 2 - there is a connection to the second shape. +//! The connection takes the form of an edge between the two shapes. +class PrsDim_Relation : public AIS_InteractiveObject +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_Relation, AIS_InteractiveObject) +public: + + //! Allows you to provide settings for the color theColor + //! of the lines representing the relation between the two shapes. + Standard_EXPORT void SetColor (const Quantity_Color& theColor) Standard_OVERRIDE; + + //! Allows you to remove settings for the color of the + //! lines representing the relation between the two shapes. + Standard_EXPORT void UnsetColor() Standard_OVERRIDE; + + virtual AIS_KindOfInteractive Type() const Standard_OVERRIDE { return AIS_KOI_Relation; } + + //! Indicates that the type of dimension is unknown. + virtual PrsDim_KindOfDimension KindOfDimension() const { return PrsDim_KOD_NONE; } + + //! Returns true if the interactive object is movable. + virtual Standard_Boolean IsMovable() const { return Standard_False; } + + const TopoDS_Shape& FirstShape() const { return myFShape; } + + virtual void SetFirstShape (const TopoDS_Shape& aFShape) { myFShape = aFShape; } + + //! Returns the second shape. + const TopoDS_Shape& SecondShape() const { return mySShape; } + + //! Allows you to identify the second shape aSShape + //! relative to the first. + virtual void SetSecondShape (const TopoDS_Shape& aSShape) { mySShape = aSShape; } + + void SetBndBox (const Standard_Real theXmin, const Standard_Real theYmin, const Standard_Real theZmin, + const Standard_Real theXmax, const Standard_Real theYmax, const Standard_Real theZmax) + { + myBndBox.Update (theXmin, theYmin, theZmin, theXmax, theYmax, theZmax); + myIsSetBndBox = Standard_True; + } + + void UnsetBndBox() { myIsSetBndBox = Standard_False; } + + //! Returns the plane. + const Handle(Geom_Plane)& Plane() const { return myPlane; } + + //! Allows you to set the plane thePlane. This is used to + //! define relations and dimensions in several daughter classes. + void SetPlane (const Handle(Geom_Plane)& thePlane) { myPlane = thePlane; } + + //! Returns the value of each object in the relation. + Standard_Real Value() const { return myVal; } + + //! Allows you to provide settings for the value theVal for each object in the relation. + void SetValue (const Standard_Real theVal) { myVal = theVal; } + + //! Returns the position set using SetPosition. + const gp_Pnt& Position() const { return myPosition; } + + //! Allows you to provide the objects in the relation with + //! settings for a non-default position. + void SetPosition (const gp_Pnt& thePosition) + { + myPosition = thePosition; + myAutomaticPosition = Standard_False; + } + + //! Returns settings for text aspect. + const TCollection_ExtendedString& Text() const { return myText; } + + //! Allows you to provide the settings theText for text aspect. + void SetText (const TCollection_ExtendedString& theText) { myText = theText; } + + //! Returns the value for the size of the arrow identifying + //! the relation between the two shapes. + Standard_Real ArrowSize() const { return myArrowSize; } + + //! Allows you to provide settings for the size of the + //! arrow theArrowSize identifying the relation between the two shapes. + void SetArrowSize (const Standard_Real theArrowSize) + { + myArrowSize = theArrowSize; + myArrowSizeIsDefined = Standard_True; + } + + //! Returns the value of the symbol presentation. This will be one of: + //! - AS_NONE - none + //! - AS_FIRSTAR - first arrow + //! - AS_LASTAR - last arrow + //! - AS_BOTHAR - both arrows + //! - AS_FIRSTPT - first point + //! - AS_LASTPT - last point + //! - AS_BOTHPT - both points + //! - AS_FIRSTAR_LASTPT - first arrow, last point + //! - AS_FIRSTPT_LASTAR - first point, last arrow + DsgPrs_ArrowSide SymbolPrs() const { return mySymbolPrs; } + + //! Allows you to provide settings for the symbol presentation. + void SetSymbolPrs (const DsgPrs_ArrowSide theSymbolPrs) { mySymbolPrs = theSymbolPrs; } + + //! Allows you to set the status of the extension shape by + //! the index aIndex. + //! The status will be one of the following: + //! - 0 - there is no connection to a shape; + //! - 1 - there is a connection to the first shape; + //! - 2 - there is a connection to the second shape. + void SetExtShape (const Standard_Integer theIndex) { myExtShape = theIndex; } + + //! Returns the status index of the extension shape. + Standard_Integer ExtShape() const { return myExtShape; } + + //! Returns true if the display mode aMode is accepted + //! for the Interactive Objects in the relation. + //! ComputeProjPresentation(me; + //! aPres : Presentation from Prs3d; + //! Curve1 : Curve from Geom; + //! Curve2 : Curve from Geom; + //! FirstP1 : Pnt from gp; + //! LastP1 : Pnt from gp; + //! FirstP2 : Pnt from gp; + //! LastP2 : Pnt from gp; + //! aColor : NameOfColor from Quantity = Quantity_NOC_PURPLE; + //! aWidth : Real from Standard = 2; + //! aProjTOL : TypeOfLine from Aspect = Aspect_TOL_DASH; + //! aCallTOL : TypeOfLine from Aspect = Aspect_TOL_DOT) + virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode == 0; } + + void SetAutomaticPosition (const Standard_Boolean theStatus) { myAutomaticPosition = theStatus; } + + Standard_Boolean AutomaticPosition() const { return myAutomaticPosition; } + +protected: + + Standard_EXPORT PrsDim_Relation (const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d = PrsMgr_TOP_AllView); + + //! Calculates the presentation aPres of the the edge + //! anEdge and the curve it defines, ProjCurve. The later + //! is also specified by the first point FirstP and the last point LastP. + //! The presentation includes settings for color aColor, + //! type - aProjTOL and aCallTOL - and width of line, aWidth. + Standard_EXPORT void ComputeProjEdgePresentation (const Handle(Prs3d_Presentation)& aPres, const TopoDS_Edge& anEdge, const Handle(Geom_Curve)& ProjCurve, const gp_Pnt& FirstP, const gp_Pnt& LastP, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfLine aProjTOL = Aspect_TOL_DASH, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT) const; + + //! Calculates the presentation aPres of the the vertex + //! aVertex and the point it defines, ProjPoint. + //! The presentation includes settings for color aColor, + //! type - aProjTOM and aCallTOL - and width of line, aWidth. + Standard_EXPORT void ComputeProjVertexPresentation (const Handle(Prs3d_Presentation)& aPres, const TopoDS_Vertex& aVertex, const gp_Pnt& ProjPoint, const Quantity_NameOfColor aColor = Quantity_NOC_PURPLE, const Standard_Real aWidth = 2, const Aspect_TypeOfMarker aProjTOM = Aspect_TOM_PLUS, const Aspect_TypeOfLine aCallTOL = Aspect_TOL_DOT) const; + +protected: + + TopoDS_Shape myFShape; + TopoDS_Shape mySShape; + Handle(Geom_Plane) myPlane; + Standard_Real myVal; + gp_Pnt myPosition; + TCollection_ExtendedString myText; + Standard_Real myArrowSize; + Standard_Boolean myAutomaticPosition; + DsgPrs_ArrowSide mySymbolPrs; + Standard_Integer myExtShape; + gp_Pln myFirstPlane; + gp_Pln mySecondPlane; + Handle(Geom_Surface) myFirstBasisSurf; + Handle(Geom_Surface) mySecondBasisSurf; + PrsDim_KindOfSurface myFirstSurfType; + PrsDim_KindOfSurface mySecondSurfType; + Standard_Real myFirstOffset; + Standard_Real mySecondOffset; + Bnd_Box myBndBox; + Standard_Boolean myIsSetBndBox; + Standard_Boolean myArrowSizeIsDefined; + +}; + +DEFINE_STANDARD_HANDLE(PrsDim_Relation, AIS_InteractiveObject) + +#endif // _AIS_Relation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_SymmetricRelation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_SymmetricRelation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_SymmetricRelation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_SymmetricRelation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,622 @@ +// Created on: 1997-03-03 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_SymmetricRelation, PrsDim_Relation) + +//======================================================================= +//function : PrsDim_SymmetricRelation +//purpose : +//======================================================================= +PrsDim_SymmetricRelation::PrsDim_SymmetricRelation(const TopoDS_Shape& aSymmTool, + const TopoDS_Shape& FirstShape, + const TopoDS_Shape& SecondShape, + const Handle(Geom_Plane)& aPlane) +:PrsDim_Relation(), + myTool(aSymmTool) +{ + SetFirstShape(FirstShape); + SetSecondShape(SecondShape); + SetPlane(aPlane); + myPosition = aPlane->Pln().Location(); +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_SymmetricRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aprs, + const Standard_Integer) +{ + switch (myFShape.ShapeType()) { + case TopAbs_FACE : + { + // cas symetrie entre deux faces + ComputeTwoFacesSymmetric(aprs); + } + break; + case TopAbs_EDGE : + { + // cas symetrie entre deux edges + ComputeTwoEdgesSymmetric(aprs); + } + break; + case TopAbs_VERTEX : + { + // cas symetrie entre deux vertexs + ComputeTwoVerticesSymmetric(aprs); + } + break; + default: + break; + } + if (myTool.ShapeType() == TopAbs_EDGE) { + Handle(Geom_Curve) aCurve,extcurve; + gp_Pnt p1,p2; + Standard_Boolean isinfinite,isonplane; + if (PrsDim::ComputeGeometry(TopoDS::Edge(myTool), + aCurve,p1,p2, + extcurve, + isinfinite, + isonplane, + myPlane)) { + if (!extcurve.IsNull()) { + gp_Pnt pf, pl; + if (!isinfinite) { + pf = p1; + pl = p2; + } + if (isinfinite) aprs->SetInfiniteState(Standard_True); + ComputeProjEdgePresentation(aprs,TopoDS::Edge(myTool),aCurve,pf,pl); + } + } + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_SymmetricRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSel, + const Standard_Integer) +{ + Handle(Select3D_SensitiveSegment) seg; + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + Standard_Real F,L; + + Handle(Geom_Curve) geom_axis, extcurve; + gp_Pnt p1,p2; + Standard_Boolean isinfinite,isonplane; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myTool), + geom_axis,p1,p2, + extcurve, + isinfinite, + isonplane, + myPlane)) return; + + Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); + gp_Lin laxis (geom_line->Lin()); + + if(myFShape.ShapeType() != TopAbs_VERTEX){ + BRepAdaptor_Curve cu1(TopoDS::Edge(myFShape)); + + if(cu1.GetType() == GeomAbs_Line) { +// gp_Lin L1 (myFAttach,myFDirAttach); + gp_Pnt PjAttachPnt1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + gp_Pnt PjOffSetPnt = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); + Standard_Real h = fabs(PjOffSetPnt.Distance(PjAttachPnt1)/cos(myAxisDirAttach.Angle(myFDirAttach))); + gp_Vec VL1(myFDirAttach); + gp_Vec VLa(PjAttachPnt1,PjOffSetPnt); + Standard_Real scal = VL1.Dot(VLa); + if(scal < 0) VL1.Reverse(); + VL1.Multiply(h); + gp_Pnt P1 = myFAttach.Translated(VL1); + gp_Pnt ProjAxis = ElCLib::Value(ElCLib::Parameter(laxis,P1),laxis); + gp_Vec v(P1,ProjAxis); + gp_Pnt P2 = ProjAxis.Translated(v); + + gp_Lin L3; + + if (!P1.IsEqual(P2,Precision::Confusion())) { + L3 = gce_MakeLin(P1,P2); + } + else { + L3 = gce_MakeLin(P1,myFDirAttach); + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle(Select3D_SensitiveBox) box = + new Select3D_SensitiveBox(own, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X()+size, + myPosition.Y()+size, + myPosition.Z()+size); + aSel->Add(box); + } + Standard_Real parmin,parmax,parcur; + parmin = ElCLib::Parameter(L3,P1); + parmax = parmin; + + parcur = ElCLib::Parameter(L3,P2); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + parcur = ElCLib::Parameter(L3,myPosition); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + gp_Pnt PointMin = ElCLib::Value(parmin,L3); + gp_Pnt PointMax = ElCLib::Value(parmax,L3); + + if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + PointMin, + PointMax); + aSel->Add(seg); + } + if (!myFAttach.IsEqual(P1,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + myFAttach, + P1); + aSel->Add(seg); + } + if (!mySAttach.IsEqual(P2,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + mySAttach, + P2); + aSel->Add(seg); + } + } + + //=======================Pour les arcs====================== + if(cu1.GetType() == GeomAbs_Circle) { + Handle(Geom_Curve) aGeomCurve = BRep_Tool::Curve(TopoDS::Edge(myFShape),F,L); + Handle(Geom_Circle) geom_circ1 = Handle(Geom_Circle)::DownCast (aGeomCurve) ; +// Handle(Geom_Circle) geom_circ1 = (const Handle(Geom_Circle)&) BRep_Tool::Curve(TopoDS::Edge(myFShape),F,L); + gp_Circ circ1(geom_circ1->Circ()); + gp_Pnt OffsetPnt(myPosition.X(),myPosition.Y(),myPosition.Z()); + gp_Pnt Center1 = circ1.Location(); + gp_Pnt ProjOffsetPoint = ElCLib::Value(ElCLib::Parameter(laxis,OffsetPnt),laxis); + gp_Pnt ProjCenter1 = ElCLib::Value(ElCLib::Parameter(laxis,Center1),laxis); + gp_Vec Vp(ProjCenter1,Center1); + if (Vp.Magnitude() <= Precision::Confusion()) Vp = gp_Vec(laxis.Direction())^myPlane->Pln().Position().Direction(); + Standard_Real Dt,R,h; + Dt = ProjCenter1.Distance(ProjOffsetPoint); + R = circ1.Radius(); + if (Dt > .999*R) { + Dt = .999*R; + gp_Vec Vout(ProjCenter1,ProjOffsetPoint); + ProjOffsetPoint = ProjCenter1.Translated(Vout.Divided(Vout.Magnitude()).Multiplied(Dt)); + OffsetPnt = ProjOffsetPoint; + } + h = Sqrt(R*R - Dt*Dt); + gp_Pnt P1 = ProjOffsetPoint.Translated(Vp.Added(Vp.Divided(Vp.Magnitude()).Multiplied(h))); + gp_Vec v(P1,ProjOffsetPoint); + gp_Pnt P2 = ProjOffsetPoint.Translated(v); + + gp_Lin L3; + if (!P1.IsEqual(P2,Precision::Confusion())) { + L3 = gce_MakeLin(P1,P2); + } + else { + L3 = gce_MakeLin(P1,laxis.Direction()); + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle(Select3D_SensitiveBox) box = + new Select3D_SensitiveBox(own, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X()+size, + myPosition.Y()+size, + myPosition.Z()+size); + aSel->Add(box); + } + Standard_Real parmin,parmax,parcur; + parmin = ElCLib::Parameter(L3,P1); + parmax = parmin; + + parcur = ElCLib::Parameter(L3,P2); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + parcur = ElCLib::Parameter(L3,myPosition); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + gp_Pnt PointMin = ElCLib::Value(parmin,L3); + gp_Pnt PointMax = ElCLib::Value(parmax,L3); + + if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own, + PointMin, + PointMax); + aSel->Add(seg); + } + } + } + //=======================Pour les points====================== + else { + if (myFAttach.IsEqual(mySAttach,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own,myPosition,myFAttach); + aSel->Add(seg); + } + else{ + gp_Pnt ProjOffsetPoint = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); + gp_Pnt ProjAttachmentPoint1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + gp_Vec PjAtt1_Att1(ProjAttachmentPoint1,myFAttach); + gp_Pnt P1 = ProjOffsetPoint.Translated(PjAtt1_Att1); + gp_Pnt P2 = ProjOffsetPoint.Translated(PjAtt1_Att1.Reversed()); + gp_Lin L3; + + if (!P1.IsEqual(P2,Precision::Confusion())) { + L3 = gce_MakeLin(P1,P2); + } + else { + L3 = gce_MakeLin(P1,myFDirAttach); + Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6)); + Handle(Select3D_SensitiveBox) box = + new Select3D_SensitiveBox(own, + myPosition.X(), + myPosition.Y(), + myPosition.Z(), + myPosition.X()+size, + myPosition.Y()+size, + myPosition.Z()+size); + aSel->Add(box); + } + Standard_Real parmin,parmax,parcur; + parmin = ElCLib::Parameter(L3,P1); + parmax = parmin; + + parcur = ElCLib::Parameter(L3,P2); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + parcur = ElCLib::Parameter(L3,myPosition); + parmin = Min(parmin,parcur); + parmax = Max(parmax,parcur); + + gp_Pnt PointMin = ElCLib::Value(parmin,L3); + gp_Pnt PointMax = ElCLib::Value(parmax,L3); + + if (!PointMin.IsEqual(PointMax,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own,PointMin,PointMax); + aSel->Add(seg); + } + if (!myFAttach.IsEqual(P1,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own,myFAttach,P1); + aSel->Add(seg); + } + if (!mySAttach.IsEqual(P2,Precision::Confusion())) { + seg = new Select3D_SensitiveSegment(own,mySAttach,P2); + aSel->Add(seg); + } + } + } +} + +//======================================================================= +//function : ComputeTwoFacesSymmetric +//purpose : +//======================================================================= +void PrsDim_SymmetricRelation::ComputeTwoFacesSymmetric(const Handle(Prs3d_Presentation)&) +{ +} + +//======================================================================= +//function : ComputeTwoEdgesSymmetric +//purpose : +//======================================================================= +void PrsDim_SymmetricRelation::ComputeTwoEdgesSymmetric(const Handle(Prs3d_Presentation)& aprs) +{ + BRepAdaptor_Curve cu1(TopoDS::Edge(myFShape)); + if (cu1.GetType() != GeomAbs_Line && cu1.GetType() != GeomAbs_Circle) return; + BRepAdaptor_Curve cu2(TopoDS::Edge(mySShape)); + if (cu2.GetType() != GeomAbs_Line && cu2.GetType() != GeomAbs_Circle) return; +// gp_Pnt pint3d,ptat11,ptat12,ptat21,ptat22; + gp_Pnt ptat11,ptat12,ptat21,ptat22; + Handle(Geom_Curve) geom1,geom2; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myFShape), + TopoDS::Edge(mySShape), + myExtShape, + geom1, + geom2, + ptat11, + ptat12, + ptat21, + ptat22, + extCurv, + isInfinite1,isInfinite2, + myPlane)) { + return; + } + aprs->SetInfiniteState((isInfinite1 || isInfinite2) && (myExtShape !=0)); + Handle(Geom_Curve) geom_axis,extcurve; + gp_Pnt p1,p2; + Standard_Boolean isinfinite,isonplane; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myTool), + geom_axis,p1,p2, + extcurve, + isinfinite, + isonplane, + myPlane)) return; + + Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); + gp_Lin laxis (geom_line->Lin()); + myAxisDirAttach = laxis.Direction(); + + if(cu1.GetType() == GeomAbs_Line){ + Handle(Geom_Line) geom_lin1 (Handle(Geom_Line)::DownCast (geom1)); + gp_Lin l1(geom_lin1->Lin()); + myFDirAttach = l1.Direction(); + } + gp_Circ circ; + if(cu1.GetType() == GeomAbs_Circle){ + Handle(Geom_Circle) geom_cir1 (Handle(Geom_Circle)::DownCast (geom1)); + gp_Circ c(geom_cir1->Circ()); + circ = c; + } + + // recherche points attache + gp_Pnt ProjOffset = ElCLib::Value(ElCLib::Parameter(laxis,myPosition),laxis); + +/*//---------------------------------------------------- + //Quand on fait la symetrie de 2 edges consecutifs: + // + // :<-- Axe + // : + // /:\ + // Edge n --->/ : \ + // / : \<-- Edge n+1 + // : + //---------------------------------------------------- +*/ + Standard_Boolean idem = Standard_False; + if (isInfinite1 && isInfinite2) { // geom1 et geom2 sont des lignes + const gp_Lin& line2 = Handle(Geom_Line)::DownCast (geom2)->Lin(); + if (myAutomaticPosition) { + myFAttach = Handle(Geom_Line)::DownCast (geom1)->Lin().Location(); + mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); + } + else { + const gp_Lin& line1 = Handle(Geom_Line)::DownCast (geom1)->Lin(); + myFAttach = ElCLib::Value(ElCLib::Parameter(line1,myPosition),line1); + mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); + } + } + else if (!isInfinite1 && !isInfinite2) { + if (ptat11.IsEqual(ptat21,Precision::Confusion())) { + myFAttach = ptat12; + mySAttach = ptat22; + idem = Standard_True; + } + if (ptat11.IsEqual(ptat22,Precision::Confusion())) { + myFAttach = ptat12; + mySAttach = ptat21; + idem = Standard_True; + } + if (ptat12.IsEqual(ptat21,Precision::Confusion())) { + myFAttach = ptat11; + mySAttach = ptat22; + idem = Standard_True; + } + if (ptat12.IsEqual(ptat22,Precision::Confusion())) { + myFAttach = ptat11; + mySAttach = ptat21; + idem = Standard_True; + } + if(!idem){ + if( ProjOffset.SquareDistance(ptat11) > ProjOffset.SquareDistance(ptat12)) myFAttach = ptat12; + else myFAttach = ptat11; + + if (ProjOffset.SquareDistance(ptat21) > ProjOffset.SquareDistance(ptat22)) mySAttach = ptat22; + else mySAttach = ptat21; + } + } + else if (isInfinite1) {// geom1 et geom2 sont des lignes + mySAttach = ptat21; + const gp_Lin& line1 = Handle(Geom_Line)::DownCast (geom1)->Lin(); + myFAttach = ElCLib::Value(ElCLib::Parameter(line1,mySAttach),line1); + } + else if (isInfinite2) {// geom1 et geom2 sont des lignes + myFAttach = ptat11; + const gp_Lin& line2 = Handle(Geom_Line)::DownCast (geom2)->Lin(); + mySAttach = ElCLib::Value(ElCLib::Parameter(line2,myFAttach),line2); + } + + if( !myArrowSizeIsDefined ) + myArrowSize = myFAttach.Distance(mySAttach)/50.; + //---------------------------------------------------- + + //---------------------------------------------------- + // Si myFAttach <> mySAttach et PjFAttach = myFAttach + //---------------------------------------------------- + gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + + if (PjFAttach.IsEqual(myFAttach,Precision::Confusion())){ + Handle(Geom_Line) geom_lin2 (Handle(Geom_Line)::DownCast (geom2)); + gp_Lin l2(geom_lin2->Lin()); + myFDirAttach = l2.Direction(); + gp_Pnt PntTempo; + PntTempo = myFAttach; + myFAttach = mySAttach; + mySAttach = PntTempo; + PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + } + + //---------------------------------------------------- +// gp_Pnt curpos; + + if (myAutomaticPosition) { + //gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + // offset pour eviter confusion Edge et Dimension + gp_Vec offset(myAxisDirAttach); + offset = offset * myArrowSize * (-5); + gp_Vec Vt(myFAttach, PjFAttach); + gp_Pnt curpos = PjFAttach.Translated(offset.Added(Vt.Multiplied(.15))); + myPosition = curpos; + } + + gp_Pnt Pj1 = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + gp_Pnt Pj2 = ElCLib::Value(ElCLib::Parameter(laxis,mySAttach),laxis); + if ((myFAttach.SquareDistance(Pj1)+mySAttach.SquareDistance(Pj2)) <= Precision::Confusion()) myArrowSize = 0.; + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + if(cu1.GetType() == GeomAbs_Line) + DsgPrs_SymmetricPresentation::Add(aprs, + myDrawer, + myFAttach, + mySAttach, + myFDirAttach, + laxis, + myPosition); + + if(cu1.GetType() == GeomAbs_Circle) + DsgPrs_SymmetricPresentation::Add(aprs, + myDrawer, + myFAttach, + mySAttach, + circ, + laxis, + myPosition); + if ( (myExtShape != 0) && !extCurv.IsNull()) { + gp_Pnt pf, pl; + if ( myExtShape == 1 ) { + if (!isInfinite1) { + pf = ptat11; + pl = ptat12; + } + ComputeProjEdgePresentation(aprs,TopoDS::Edge(myFShape),geom1,pf,pl); + } + else { + if (!isInfinite2) { + pf = ptat21; + pl = ptat22; + } + ComputeProjEdgePresentation(aprs,TopoDS::Edge(mySShape),geom2,pf,pl); + } + } +} + +//======================================================================= +//function : ComputeTwoVertexsSymmetric +//purpose : +//======================================================================= +void PrsDim_SymmetricRelation::ComputeTwoVerticesSymmetric(const Handle(Prs3d_Presentation)& aprs) +{ + if(myFShape.ShapeType() != TopAbs_VERTEX || mySShape.ShapeType() != TopAbs_VERTEX) return; + Handle(Geom_Curve) geom_axis,extcurve; + gp_Pnt p1,p2; + Standard_Boolean isinfinite,isonplane; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myTool), + geom_axis,p1,p2, + extcurve, + isinfinite, + isonplane, + myPlane)) return; + + Standard_Boolean isOnPlane1, isOnPlane2; + + PrsDim::ComputeGeometry(TopoDS::Vertex(myFShape), myFAttach, myPlane, isOnPlane1); + PrsDim::ComputeGeometry(TopoDS::Vertex(mySShape), mySAttach, myPlane, isOnPlane2); + + if( !myArrowSizeIsDefined ) + myArrowSize = myFAttach.Distance(mySAttach)/50.; + + if (isOnPlane1 && isOnPlane2) + myExtShape = 0; + else if ( isOnPlane1 && !isOnPlane2) + myExtShape = 2; + else if (!isOnPlane1 && isOnPlane2) + myExtShape = 1; + else + return ; + + Handle(Geom_Line) geom_line = Handle(Geom_Line)::DownCast (geom_axis); + gp_Lin laxis (geom_line->Lin()); + myAxisDirAttach = laxis.Direction(); + + // recherche points attache +// gp_Pnt curpos; + if (myAutomaticPosition) { + gp_Pnt PjFAttach = ElCLib::Value(ElCLib::Parameter(laxis,myFAttach),laxis); + // offset pour eviter confusion Edge et Dimension + gp_Vec offset(myAxisDirAttach); + offset = offset * myArrowSize * (-5); + gp_Vec Vt(myFAttach, PjFAttach); + gp_Pnt curpos = PjFAttach.Translated(offset.Added(Vt.Multiplied(.15))); + myPosition = curpos; + } + if (2*(myFAttach.Distance(mySAttach)) <= Precision::Confusion()) myArrowSize = 0.; + Handle(Prs3d_DimensionAspect) la = myDrawer->DimensionAspect(); + Handle(Prs3d_ArrowAspect) arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + arr = la->ArrowAspect(); + arr->SetLength(myArrowSize); + DsgPrs_SymmetricPresentation::Add(aprs, + myDrawer, + myFAttach, + mySAttach, + laxis, + myPosition); + if ( myExtShape == 1) + ComputeProjVertexPresentation(aprs,TopoDS::Vertex(myFShape),myFAttach); + else if ( myExtShape == 2) + ComputeProjVertexPresentation(aprs,TopoDS::Vertex(mySShape),mySAttach); +} + + + + + + diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_SymmetricRelation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_SymmetricRelation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_SymmetricRelation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_SymmetricRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,80 @@ +// Created on: 1997-03-03 +// Created by: Jean-Pierre COMBE +// Copyright (c) 1997-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_SymmetricRelation_HeaderFile +#define _PrsDim_SymmetricRelation_HeaderFile + +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(PrsDim_SymmetricRelation, PrsDim_Relation) + +//! A framework to display constraints of symmetricity +//! between two or more datum Interactive Objects. +//! A plane serves as the axis of symmetry between the +//! shapes of which the datums are parts. +class PrsDim_SymmetricRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_SymmetricRelation, PrsDim_Relation) +public: + + //! Constructs an object to display constraints of symmetricity. + //! This object is defined by a tool aSymmTool, a first + //! shape FirstShape, a second shape SecondShape, and a plane aPlane. + //! aPlane serves as the axis of symmetry. + //! aSymmTool is the shape composed of FirstShape + //! SecondShape and aPlane. It may be queried and + //! edited using the functions GetTool and SetTool. + //! The two shapes are typically two edges, two vertices or two points. + Standard_EXPORT PrsDim_SymmetricRelation(const TopoDS_Shape& aSymmTool, const TopoDS_Shape& FirstShape, const TopoDS_Shape& SecondShape, const Handle(Geom_Plane)& aPlane); + + //! Returns true if the symmetric constraint display is movable. + virtual Standard_Boolean IsMovable() const Standard_OVERRIDE { return Standard_True; } + + //! Sets the tool aSymmetricTool composed of a first + //! shape, a second shape, and a plane. + //! This tool is initially created at construction time. + void SetTool (const TopoDS_Shape& aSymmetricTool) { myTool = aSymmetricTool; } + + //! Returns the tool composed of a first shape, a second + //! shape, and a plane. This tool is created at construction time. + const TopoDS_Shape& GetTool() const { return myTool; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoFacesSymmetric (const Handle(Prs3d_Presentation)& aprs); + + Standard_EXPORT void ComputeTwoEdgesSymmetric (const Handle(Prs3d_Presentation)& aprs); + + Standard_EXPORT void ComputeTwoVerticesSymmetric (const Handle(Prs3d_Presentation)& aprs); + +private: + + TopoDS_Shape myTool; + gp_Pnt myFAttach; + gp_Pnt mySAttach; + gp_Dir myFDirAttach; + gp_Dir myAxisDirAttach; + +}; + +#endif // _PrsDim_SymmetricRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_TangentRelation.cxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_TangentRelation.cxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_TangentRelation.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_TangentRelation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,545 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(PrsDim_TangentRelation, PrsDim_Relation) + +//======================================================================= +//function : Constructor +//purpose : +//======================================================================= +PrsDim_TangentRelation::PrsDim_TangentRelation(const TopoDS_Shape& aFShape, + const TopoDS_Shape& aSShape, + const Handle(Geom_Plane)& aPlane, + const Standard_Integer anExternRef) + :myExternRef(anExternRef) +{ + myFShape = aFShape; + mySShape = aSShape; + myPlane = aPlane; + myAutomaticPosition = Standard_False; +} + +//======================================================================= +//function : Compute +//purpose : +//======================================================================= +void PrsDim_TangentRelation::Compute(const Handle(PrsMgr_PresentationManager3d)&, + const Handle(Prs3d_Presentation)& aPresentation, + const Standard_Integer) +{ + switch (myFShape.ShapeType()) + { + case TopAbs_FACE : + { + ComputeTwoFacesTangent(aPresentation); + } + break; + case TopAbs_EDGE : + { + ComputeTwoEdgesTangent(aPresentation); + } + break; + default: + break; + } +} + +//======================================================================= +//function : ComputeSelection +//purpose : +//======================================================================= +void PrsDim_TangentRelation::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, + const Standard_Integer) +{ + gp_Vec vec(myDir); + gp_Vec vec1 = vec.Multiplied(myLength); + gp_Vec vec2 = vec.Multiplied(-myLength); + gp_Pnt p1 = myPosition.Translated(vec1); + gp_Pnt p2 = myPosition.Translated(vec2); + + Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7); + Handle(Select3D_SensitiveSegment) seg = new Select3D_SensitiveSegment(own,p1,p2); + aSelection->Add(seg); +} + +//======================================================================= +//function : ComputeTwoFacesTangent +//purpose : +//======================================================================= +void PrsDim_TangentRelation::ComputeTwoFacesTangent + (const Handle(Prs3d_Presentation)& /*aPresentation*/) +{ +} + +// jfa 19/10/2000 begin +//======================================================================= +//function : ComputeTangencyPoint +//purpose : +//======================================================================= +static Standard_Boolean ComputeTangencyPoint(const Handle(Geom_Curve)& GC1, + const Handle(Geom_Curve)& GC2, + gp_Pnt& aPoint) +{ + Standard_Real U1f = GC1->FirstParameter(); + Standard_Real U1l = GC1->LastParameter(); + Standard_Real U2f = GC2->FirstParameter(); + Standard_Real U2l = GC2->LastParameter(); + + gp_Pnt PC1; + Standard_Real mindist=0; + GeomAPI_ExtremaCurveCurve Ex(GC1,GC2,U1f,U1l,U2f,U2l); + for ( Standard_Integer i = 1; i <= Ex.NbExtrema(); i++) + { + gp_Pnt P1,P2; + Ex.Points(i,P1,P2); + Standard_Real dist = P1.Distance(P2); + if ( i == 1 ) + { + mindist = dist; + PC1 = P1; + } + else + { + if ( (dist < mindist) || (dist < Precision::Confusion()) ) + { + mindist = dist; + PC1 = P1; + } + } + if ( dist < Precision::Confusion() ) + { + if (GC1->IsInstance(STANDARD_TYPE(Geom_Line))) + { + continue; // tangent line and conic can have only one point with zero distance + } + gp_Vec aVector1,aVector2; + if (GC1->IsInstance(STANDARD_TYPE(Geom_Circle))) + { + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (GC1)); + Standard_Real par_inter = ElCLib::Parameter(circle->Circ(), P1); + ElCLib::D1(par_inter,circle->Circ(),P1,aVector1); + } + else if (GC1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (GC1)); + Standard_Real par_inter = ElCLib::Parameter(ellipse->Elips(), P1); + ElCLib::D1(par_inter,ellipse->Elips(),P1,aVector1); + } + if (GC2->IsInstance(STANDARD_TYPE(Geom_Circle))) + { + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (GC2)); + Standard_Real par_inter = ElCLib::Parameter(circle->Circ(), P2); + ElCLib::D1(par_inter,circle->Circ(),P2,aVector2); + } + else if (GC2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (GC2)); + Standard_Real par_inter = ElCLib::Parameter(ellipse->Elips(), P2); + ElCLib::D1(par_inter,ellipse->Elips(),P2,aVector2); + } +// if ( aVector1.IsParallel(aVector2, 100*Precision::Angular()) ) break; + if ( aVector1.IsParallel(aVector2, M_PI / 360.0) ) break; // 0.5 graduce + } + } + aPoint = PC1; + return Standard_True; +} +// jfa 19/10/2000 end + +//======================================================================= +//function : ComputeTwoEdgesTangent +//purpose : +//======================================================================= +void PrsDim_TangentRelation::ComputeTwoEdgesTangent(const Handle(Prs3d_Presentation)& aPresentation) +{ + Handle(Geom_Curve) copy1,copy2; + gp_Pnt ptat11,ptat12,ptat21,ptat22; + Standard_Boolean isInfinite1,isInfinite2; + Handle(Geom_Curve) extCurv; + if (!PrsDim::ComputeGeometry(TopoDS::Edge(myFShape), + TopoDS::Edge(mySShape), + myExtShape, + copy1, + copy2, + ptat11, + ptat12, + ptat21, + ptat22, + extCurv, + isInfinite1,isInfinite2, + myPlane)) + { + return; + } + + aPresentation->SetInfiniteState(isInfinite1 || isInfinite2); + // current face + BRepBuilderAPI_MakeFace makeface(myPlane->Pln()); + TopoDS_Face face(makeface.Face()); + BRepAdaptor_Surface adp(makeface.Face()); + + Standard_Integer typArg(0); + + if (copy1->IsInstance(STANDARD_TYPE(Geom_Line))) + { + typArg = 10; + } + else if (copy1->IsInstance(STANDARD_TYPE(Geom_Circle))) + { + typArg = 20; + } + else if (copy1->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + typArg = 30; + } + else return; + + if (copy2->IsInstance(STANDARD_TYPE(Geom_Line))) + { + typArg += 1; + } + else if (copy2->IsInstance(STANDARD_TYPE(Geom_Circle))) + { + typArg += 2; + } + else if (copy2->IsInstance(STANDARD_TYPE(Geom_Ellipse))) + { + typArg += 3; + } + else return; + + //First find the tangengy vector if exists + TopoDS_Vertex VCom; + TopExp_Explorer expF(TopoDS::Edge(myFShape),TopAbs_VERTEX); + TopExp_Explorer expS(TopoDS::Edge(mySShape),TopAbs_VERTEX); + TopoDS_Shape tab[2]; + Standard_Integer p ; + for (p = 0; expF.More(); expF.Next(),p++) + { + tab[p] = TopoDS::Vertex(expF.Current()); + } + Standard_Boolean found(Standard_False); + for ( ; expS.More() && !found; expS.Next()) + { + for ( Standard_Integer l = 0; l<=p && !found; l++) + { + found = ( expS.Current().IsSame(tab[l])); + if (found) VCom = TopoDS::Vertex(expS.Current()); + } + } + + gp_Vec theVector; + gp_Pnt pint3d; // tangency point + gp_Dir theDir; // tangency direction + Standard_Real par_inter = 0.0; // parameter of tangency point + + if (found) + { + pint3d = BRep_Tool::Pnt(VCom); + } + + // Otherwise it is found as if it was known that 2 curves + // are tangents (which must be the cases) + switch (typArg) + { + case 12: // circle line + { + Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy1)); + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy2)); + + if ( !found ) + { + // it is enough to project the circus center on the straight line + par_inter = ElCLib::Parameter(line->Lin(), circle->Location()); + pint3d = ElCLib::Value(par_inter, line->Lin()); + } + + theDir = line->Lin().Direction(); + myLength = circle->Radius()/5.; + if ( !isInfinite1 ) + { + Standard_Real copy1Length = ptat12.Distance(ptat11); + if ( copy1Length < myLength ) + myLength = copy1Length/3.; + } + } + break; + case 21: // circle line + { + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy1)); + Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy2)); + + if (!found) + { + // it is enough to project the circus center on the straight line + par_inter = ElCLib::Parameter(line->Lin(), circle->Location()); + pint3d = ElCLib::Value(par_inter, line->Lin()); + } + + theDir = line->Lin().Direction(); + myLength = circle->Radius()/5.; + if (!isInfinite2) + { + Standard_Real copy2Length = ptat21.Distance(ptat22); + if ( copy2Length < myLength ) + myLength = copy2Length/3.; + } + } + break; + // jfa 19/10/2000 begin + case 13: // line ellipse + { + Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy1)); + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy2)); + + if (!found) + { + ComputeTangencyPoint(line,ellipse,pint3d); + } + + theDir = line->Lin().Direction(); + myLength = ellipse->MajorRadius()/5.; + + if (!isInfinite1) + { + Standard_Real copy1Length = ptat12.Distance(ptat11); + if ( copy1Length < myLength ) + myLength = copy1Length/3.; + } + } + break; + case 31: // ellipse line + { + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy1)); + Handle(Geom_Line) line (Handle(Geom_Line)::DownCast (copy2)); + + if (!found) + { + ComputeTangencyPoint(line,ellipse,pint3d); + } + + theDir = line->Lin().Direction(); + myLength = ellipse->MajorRadius()/5.; + + if (!isInfinite2) + { + Standard_Real copy2Length = ptat21.Distance(ptat22); + if ( copy2Length < myLength ) + myLength = copy2Length/3.; + } + } + break; + case 22: // circle circle + { + Handle(Geom_Circle) circle1 (Handle(Geom_Circle)::DownCast (copy1)); + Handle(Geom_Circle) circle2 (Handle(Geom_Circle)::DownCast (copy2)); + Standard_Real R1 = circle1->Radius(); + Standard_Real R2 = circle2->Radius(); + myLength = Max(R1,R2)/5.0; + if ( !found ) + { + if ( (circle1->Location()).IsEqual(circle2->Location(),Precision::Confusion()) ) + { + if ( R1 >= R2 ) + { + ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); + } + else + { + ElCLib::D1(par_inter,circle2->Circ(),pint3d,theVector); + } + } + else + { + if ( R1 >= R2 ) + { + par_inter = ElCLib::Parameter(circle1->Circ(), circle2->Location()); + ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); + } + else + { + par_inter = ElCLib::Parameter(circle2->Circ(), circle1->Location()); + ElCLib::D1(par_inter,circle2->Circ(),pint3d,theVector); + } + } + } + else + { + par_inter = ElCLib::Parameter(circle1->Circ(), pint3d); + ElCLib::D1(par_inter,circle1->Circ(),pint3d,theVector); + } + theDir = gp_Dir(theVector); + } + break; + case 23: // circle ellipse + { + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy1)); + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy2)); + Standard_Real R1 = circle->Radius(); + Standard_Real R2 = ellipse->MajorRadius(); + myLength = Max(R1,R2)/5.0; + if (!found) + { + if ( R1 >= R2 ) + { + ComputeTangencyPoint(circle,ellipse,pint3d); + par_inter = ElCLib::Parameter(circle->Circ(), pint3d); + ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); + } + else + { + ComputeTangencyPoint(ellipse,circle,pint3d); + par_inter = ElCLib::Parameter(ellipse->Elips(), pint3d); + ElCLib::D1(par_inter,ellipse->Elips(),pint3d,theVector); + } + } + else + { + par_inter = ElCLib::Parameter(circle->Circ(), pint3d); + ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); + } + theDir = gp_Dir(theVector); + } + break; + case 32: // ellipse circle + { + Handle(Geom_Ellipse) ellipse (Handle(Geom_Ellipse)::DownCast (copy1)); + Handle(Geom_Circle) circle (Handle(Geom_Circle)::DownCast (copy2)); + Standard_Real R1 = ellipse->MajorRadius(); + Standard_Real R2 = circle->Radius(); + myLength = Max(R1,R2)/5.0; + if (!found) + { + if ( R1 >= R2 ) + { + ComputeTangencyPoint(ellipse,circle,pint3d); + par_inter = ElCLib::Parameter( ellipse->Elips(), pint3d); + ElCLib::D1(par_inter,ellipse->Elips(),pint3d,theVector); + } + else + { + ComputeTangencyPoint(circle,ellipse,pint3d); + par_inter = ElCLib::Parameter( circle->Circ(), pint3d); + ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); + } + } + else + { + par_inter = ElCLib::Parameter(circle->Circ(), pint3d); + ElCLib::D1(par_inter,circle->Circ(),pint3d,theVector); + } + theDir = gp_Dir(theVector); + } + break; + case 33: // ellipse ellipse + { + Handle(Geom_Ellipse) ellipse1 (Handle(Geom_Ellipse)::DownCast (copy1)); + Handle(Geom_Ellipse) ellipse2 (Handle(Geom_Ellipse)::DownCast (copy2)); + Standard_Real R1 = ellipse1->MajorRadius(); + Standard_Real R2 = ellipse2->MajorRadius(); + myLength = Max(R1,R2)/5.0; + if (!found) + { + if ( R1 > R2 ) + { + ComputeTangencyPoint(ellipse1,ellipse2,pint3d); + par_inter = ElCLib::Parameter( ellipse1->Elips(), pint3d); + ElCLib::D1(par_inter,ellipse1->Elips(),pint3d,theVector); + } + else + { + ComputeTangencyPoint(ellipse2,ellipse1,pint3d); + par_inter = ElCLib::Parameter( ellipse2->Elips(), pint3d); + ElCLib::D1(par_inter,ellipse2->Elips(),pint3d,theVector); + } + } + else + { + par_inter = ElCLib::Parameter(ellipse1->Elips(), pint3d); + ElCLib::D1(par_inter,ellipse1->Elips(),pint3d,theVector); + } + theDir = gp_Dir(theVector); + } + break; + // jfa 19/10/2000 end + default: + return; + } + + myAttach = pint3d; + myDir = theDir; + myPosition = pint3d; + myLength = Min(myLength,myArrowSize); + + DsgPrs_TangentPresentation::Add(aPresentation,myDrawer,myAttach,myDir,myLength); + if ( (myExtShape != 0) && !extCurv.IsNull()) + { + gp_Pnt pf, pl; + if ( myExtShape == 1 ) + { + if (!isInfinite1) + { + pf = ptat11; + pl = ptat12; + } + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(myFShape),copy1,pf,pl); + } + else + { + if (!isInfinite2) + { + pf = ptat21; + pl = ptat22; + } + ComputeProjEdgePresentation(aPresentation,TopoDS::Edge(mySShape),copy2,pf,pl); + } + } +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_TangentRelation.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_TangentRelation.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_TangentRelation.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_TangentRelation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,75 @@ +// Created on: 1996-12-05 +// Created by: Jean-Pierre COMBE/Odile Olivier +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_TangentRelation_HeaderFile +#define _PrsDim_TangentRelation_HeaderFile + +#include + +DEFINE_STANDARD_HANDLE(PrsDim_TangentRelation, PrsDim_Relation) + +//! A framework to display tangency constraints between +//! two or more Interactive Objects of the datum type. +//! The datums are normally faces or edges. +class PrsDim_TangentRelation : public PrsDim_Relation +{ + DEFINE_STANDARD_RTTIEXT(PrsDim_TangentRelation, PrsDim_Relation) +public: + + //! TwoFacesTangent or TwoEdgesTangent relation + //! Constructs an object to display tangency constraints. + //! This object is defined by the first shape aFShape, the + //! second shape aSShape, the plane aPlane and the index anExternRef. + //! aPlane serves as an optional axis. + //! anExternRef set to 0 indicates that there is no relation. + Standard_EXPORT PrsDim_TangentRelation(const TopoDS_Shape& aFShape, const TopoDS_Shape& aSShape, const Handle(Geom_Plane)& aPlane, const Standard_Integer anExternRef = 0); + + //! Returns the external reference for tangency. + //! The values are as follows: + //! - 0 - there is no connection; + //! - 1 - there is a connection to the first shape; + //! - 2 - there is a connection to the second shape. + //! This reference is defined at construction time. + Standard_Integer ExternRef() { return myExternRef; } + + //! Sets the external reference for tangency, aRef. + //! The values are as follows: + //! - 0 - there is no connection; + //! - 1 - there is a connection to the first shape; + //! - 2 - there is a connection to the second shape. + //! This reference is initially defined at construction time. + void SetExternRef (const Standard_Integer aRef) { myExternRef = aRef; } + +private: + + Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; + + Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) Standard_OVERRIDE; + + Standard_EXPORT void ComputeTwoFacesTangent (const Handle(Prs3d_Presentation)& aPresentation); + + Standard_EXPORT void ComputeTwoEdgesTangent (const Handle(Prs3d_Presentation)& aPresentation); + +private: + + gp_Pnt myAttach; + gp_Dir myDir; + Standard_Real myLength; + Standard_Integer myExternRef; + +}; + +#endif // _PrsDim_TangentRelation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_TypeOfAngleArrowVisibility.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_TypeOfAngleArrowVisibility.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_TypeOfAngleArrowVisibility.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_TypeOfAngleArrowVisibility.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,29 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_TypeOfAngleArrowVisibility_HeaderFile +#define _PrsDim_TypeOfAngleArrowVisibility_HeaderFile + +//! Declares what arrows are visible on angle presentation +enum PrsDim_TypeOfAngleArrowVisibility +{ + PrsDim_TypeOfAngleArrowVisibility_Both, //!< both arrows of the first and the second angle tips + PrsDim_TypeOfAngleArrowVisibility_First, //!< only first point arrow + PrsDim_TypeOfAngleArrowVisibility_Second, //!< only second point arrow + PrsDim_TypeOfAngleArrowVisibility_None, //!< arrows are not visible +}; + +#endif // _PrsDim_TypeOfAngleArrowVisibility_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_TypeOfAngle.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_TypeOfAngle.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_TypeOfAngle.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_TypeOfAngle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,27 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_TypeOfAngle_HeaderFile +#define _PrsDim_TypeOfAngle_HeaderFile + +//! Declares the type of angle. +enum PrsDim_TypeOfAngle +{ + PrsDim_TypeOfAngle_Interior, //!< the angle between two lines built on geometry parameters + PrsDim_TypeOfAngle_Exterior, //!< the angle equal 2 PI minus the interior angle +}; + +#endif // _PrsDim_TypeOfAngle_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_TypeOfDist.hxx opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_TypeOfDist.hxx --- opencascade-7.4.1+dfsg1/src/PrsDim/PrsDim_TypeOfDist.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsDim/PrsDim_TypeOfDist.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,28 @@ +// Created on: 1996-12-11 +// Created by: Robert COUBLANC +// Copyright (c) 1996-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _PrsDim_TypeOfDist_HeaderFile +#define _PrsDim_TypeOfDist_HeaderFile + +//! To declare the type of distance. +enum PrsDim_TypeOfDist +{ + PrsDim_TypeOfDist_Unknown, + PrsDim_TypeOfDist_Horizontal, + PrsDim_TypeOfDist_Vertical +}; + +#endif // _PrsDim_TypeOfDist_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_PresentableObject.cxx opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_PresentableObject.cxx --- opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_PresentableObject.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_PresentableObject.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -78,7 +77,7 @@ for (PrsMgr_ListOfPresentableObjectsIter anIter (myChildren); anIter.More(); anIter.Next()) { - anIter.Value()->SetCombinedParentTransform (Handle(Geom_Transformation)()); + anIter.Value()->SetCombinedParentTransform (Handle(TopLoc_Datum3D)()); anIter.Value()->myParent = NULL; } } @@ -99,22 +98,12 @@ } //======================================================================= -//function : Compute -//purpose : -//======================================================================= -void PrsMgr_PresentableObject::Compute(const Handle(Prs3d_Projector)& /*aProjector*/, - const Handle(Prs3d_Presentation)& /*aPresentation*/) -{ - throw Standard_NotImplemented("cannot compute under a specific projector"); -} - -//======================================================================= -//function : Compute -//purpose : +//function : computeHLR +//purpose : //======================================================================= -void PrsMgr_PresentableObject::Compute(const Handle(Prs3d_Projector)& /* aProjector*/, - const Handle(Geom_Transformation)& /*aTrsf*/, - const Handle(Prs3d_Presentation)& /*aPresentation*/) +void PrsMgr_PresentableObject::computeHLR (const Handle(Graphic3d_Camera)& , + const Handle(TopLoc_Datum3D)& , + const Handle(Prs3d_Presentation)& ) { throw Standard_NotImplemented("cannot compute under a specific projector"); } @@ -257,7 +246,7 @@ //function : setLocalTransformation //purpose : //======================================================================= -void PrsMgr_PresentableObject::setLocalTransformation (const Handle(Geom_Transformation)& theTransformation) +void PrsMgr_PresentableObject::setLocalTransformation (const Handle(TopLoc_Datum3D)& theTransformation) { myLocalTransformation = theTransformation; UpdateTransformation(); @@ -269,14 +258,14 @@ //======================================================================= void PrsMgr_PresentableObject::ResetTransformation() { - setLocalTransformation (Handle(Geom_Transformation)()); + setLocalTransformation (Handle(TopLoc_Datum3D)()); } //======================================================================= //function : SetCombinedParentTransform //purpose : //======================================================================= -void PrsMgr_PresentableObject::SetCombinedParentTransform (const Handle(Geom_Transformation)& theTrsf) +void PrsMgr_PresentableObject::SetCombinedParentTransform (const Handle(TopLoc_Datum3D)& theTrsf) { myCombinedParentTransform = theTrsf; UpdateTransformation(); @@ -295,7 +284,7 @@ if (!myLocalTransformation.IsNull() && myLocalTransformation->Form() != gp_Identity) { const gp_Trsf aTrsf = myCombinedParentTransform->Trsf() * myLocalTransformation->Trsf(); - myTransformation = new Geom_Transformation (aTrsf); + myTransformation = new TopLoc_Datum3D (aTrsf); myInvTransformation = aTrsf.Inverted(); } else @@ -431,7 +420,7 @@ if (anIter.Value() == theObject) { theObject->myParent = NULL; - theObject->SetCombinedParentTransform (Handle(Geom_Transformation)()); + theObject->SetCombinedParentTransform (Handle(TopLoc_Datum3D)()); myChildren.Remove (anIter); break; } @@ -842,17 +831,48 @@ // function : DumpJson // purpose : // ======================================================================= -void PrsMgr_PresentableObject::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const +void PrsMgr_PresentableObject::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, PrsMgr_PresentableObject); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myParent) + + for (PrsMgr_Presentations::Iterator anIterator (myPresentations); anIterator.More(); anIterator.Next()) + { + const Handle(PrsMgr_Presentation)& aPresentation = anIterator.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aPresentation.get()) + } + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myClipPlanes.get()) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myDrawer.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myHilightDrawer.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myDynHilightDrawer.get()) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTransformPersistence.get()) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myLocalTransformation.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTransformation.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myCombinedParentTransform.get()) + + for (PrsMgr_ListOfPresentableObjects::Iterator anIterator (myChildren); anIterator.More(); anIterator.Next()) + { + const Handle(PrsMgr_PresentableObject)& aChildObject = anIterator.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aChildObject.get()) + } + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myInvTransformation) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTypeOfPresentation3d) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCurrentFacingModel) - OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myParent); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myOwnWidth) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, hasOwnColor) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, hasOwnMaterial) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myOwnWidth); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, hasOwnColor); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, hasOwnMaterial); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myInfiniteState) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsMutable) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnPresentations) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myInfiniteState); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsMutable); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myHasOwnPresentations); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToPropagateVisualState) } diff -Nru opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_PresentableObject.hxx opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_PresentableObject.hxx --- opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_PresentableObject.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_PresentableObject.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -209,17 +209,17 @@ //! Return the local transformation. //! Note that the local transformation of the object having Transformation Persistence //! is applied within Local Coordinate system defined by this Persistence. - const Handle(Geom_Transformation)& LocalTransformationGeom() const { return myLocalTransformation; } + const Handle(TopLoc_Datum3D)& LocalTransformationGeom() const { return myLocalTransformation; } //! Sets local transformation to theTransformation. //! Note that the local transformation of the object having Transformation Persistence //! is applied within Local Coordinate system defined by this Persistence. - void SetLocalTransformation (const gp_Trsf& theTrsf) { setLocalTransformation (new Geom_Transformation (theTrsf)); } + void SetLocalTransformation (const gp_Trsf& theTrsf) { setLocalTransformation (new TopLoc_Datum3D (theTrsf)); } //! Sets local transformation to theTransformation. //! Note that the local transformation of the object having Transformation Persistence //! is applied within Local Coordinate system defined by this Persistence. - void SetLocalTransformation (const Handle(Geom_Transformation)& theTrsf) { setLocalTransformation (theTrsf); } + void SetLocalTransformation (const Handle(TopLoc_Datum3D)& theTrsf) { setLocalTransformation (theTrsf); } //! Returns true if object has a transformation that is different from the identity. Standard_Boolean HasTransformation() const { return !myTransformation.IsNull() && myTransformation->Form() != gp_Identity; } @@ -227,7 +227,7 @@ //! Return the transformation taking into account transformation of parent object(s). //! Note that the local transformation of the object having Transformation Persistence //! is applied within Local Coordinate system defined by this Persistence. - const Handle(Geom_Transformation)& TransformationGeom() const { return myTransformation; } + const Handle(TopLoc_Datum3D)& TransformationGeom() const { return myTransformation; } //! Return the local transformation. //! Note that the local transformation of the object having Transformation Persistence @@ -247,7 +247,7 @@ const gp_GTrsf& InversedTransformation() const { return myInvTransformation; } //! Return combined parent transformation. - const Handle(Geom_Transformation)& CombinedParentTransformation() const { return myCombinedParentTransform; } + const Handle(TopLoc_Datum3D)& CombinedParentTransformation() const { return myCombinedParentTransform; } //! resets local transformation to identity. Standard_EXPORT virtual void ResetTransformation(); @@ -341,21 +341,16 @@ const Handle(Prs3d_Presentation)& thePrs, const Standard_Integer theMode) = 0; - //! Calculates the 3D view presentation. + //! Calculates hidden line removal presentation for specific camera position. //! Each of the views in the viewer and every modification such as rotation, for example, entails recalculation. - //! It must be redefined to implement hidden line removal for the object. The user never calls this method himself. - //! This is done via the InteractiveContext object and is dependent on the point of view from which the object is displayed. - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& theProjector, - const Handle(Prs3d_Presentation)& thePrs); - - //! Calculates the 3D view presentation. - //! A point of view is provided by the projector, and the geometric transformation which has transformed associated presentable objects is specified by transformation. - //! This function is to be used in case where a hidden line removal display cannot be calculated automatically. - //! This occurs when associated presentable objects have been transformed geometrically, but not translated. + //! Default implementation throws Standard_NotImplemented exception //! Warning! The transformation must be applied to the object before computation. - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& theProjector, - const Handle(Geom_Transformation)& theTrsf, - const Handle(Prs3d_Presentation)& thePrs); + //! @param theProjector [in] view orientation + //! @param theTrsf [in] additional transformation, or NULL if undefined + //! @param thePrs [in] presentation to fill + Standard_EXPORT virtual void computeHLR (const Handle(Graphic3d_Camera)& theProjector, + const Handle(TopLoc_Datum3D)& theTrsf, + const Handle(Prs3d_Presentation)& thePrs); //! Recomputes invalidated presentations of the object. //! @param theToIncludeHidden if TRUE, then even hidden invalidated presentations will be updated @@ -369,10 +364,10 @@ //! Sets myCombinedParentTransform to theTransformation. Thus object receives transformation //! from parent node and able to derive its own. - Standard_EXPORT virtual void SetCombinedParentTransform (const Handle(Geom_Transformation)& theTrsf); + Standard_EXPORT virtual void SetCombinedParentTransform (const Handle(TopLoc_Datum3D)& theTrsf); //! Sets local transformation to theTransformation. - Standard_EXPORT virtual void setLocalTransformation (const Handle(Geom_Transformation)& theTransformation); + Standard_EXPORT virtual void setLocalTransformation (const Handle(TopLoc_Datum3D)& theTransformation); //! Return the identity transformation. Standard_EXPORT static const gp_Trsf& getIdentityTrsf(); @@ -480,7 +475,7 @@ Standard_EXPORT virtual void UnsetAttributes(); //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; public: //! @name deprecated methods @@ -564,9 +559,9 @@ Handle(Prs3d_Drawer) myHilightDrawer; //!< (optional) custom presentation attributes for highlighting selected object Handle(Prs3d_Drawer) myDynHilightDrawer; //!< (optional) custom presentation attributes for highlighting detected object Handle(Graphic3d_TransformPers) myTransformPersistence; //!< transformation persistence - Handle(Geom_Transformation) myLocalTransformation; //!< local transformation relative to parent object - Handle(Geom_Transformation) myTransformation; //!< absolute transformation of this object (combined parents + local transformations) - Handle(Geom_Transformation) myCombinedParentTransform; //!< transformation of parent object (combined for all parents) + Handle(TopLoc_Datum3D) myLocalTransformation; //!< local transformation relative to parent object + Handle(TopLoc_Datum3D) myTransformation; //!< absolute transformation of this object (combined parents + local transformations) + Handle(TopLoc_Datum3D) myCombinedParentTransform; //!< transformation of parent object (combined for all parents) PrsMgr_ListOfPresentableObjects myChildren; //!< list of children gp_GTrsf myInvTransformation; //!< inversion of absolute transformation (combined parents + local transformations) PrsMgr_TypeOfPresentation3d myTypeOfPresentation3d; //!< presentation type diff -Nru opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_Presentation.cxx opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_Presentation.cxx --- opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_Presentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_Presentation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,11 +14,9 @@ #include -#include #include #include #include -#include #include #include #include @@ -104,12 +102,12 @@ } // Erase structure from structure manager - base_type::Erase(); - base_type::Clear(); + erase(); + clear (true); // Disconnect other structures - base_type::DisconnectAll (Graphic3d_TOC_DESCENDANT); + DisconnectAll (Graphic3d_TOC_DESCENDANT); // Clear groups and remove graphic structure - base_type::Remove(); + Remove(); } //======================================================================= @@ -142,7 +140,7 @@ base_type::SetVisible (Standard_False); break; case State_Empty: - base_type::Erase(); + base_type::erase(); break; } } @@ -164,8 +162,8 @@ return; } - base_type::Clear (theWithDestruction); - base_type::DisconnectAll (Graphic3d_TOC_DESCENDANT); + clear (theWithDestruction); + DisconnectAll (Graphic3d_TOC_DESCENDANT); } //======================================================================= @@ -190,69 +188,18 @@ //======================================================================= //function : Compute -//purpose : Methods for hidden parts... -//======================================================================= -Handle(Graphic3d_Structure) PrsMgr_Presentation::Compute (const Handle(Graphic3d_DataStructureManager)& theProjector) -{ - Handle(Graphic3d_Structure) aPrs = new Graphic3d_Structure (myPresentationManager->StructureManager()); - myPresentableObject->Compute (Projector (theProjector), aPrs); - return aPrs; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void PrsMgr_Presentation::Compute (const Handle(Graphic3d_DataStructureManager)& theProjector, - Handle(Graphic3d_Structure)& theStructToFill) -{ - theStructToFill->Clear(); - Handle(Prs3d_Presentation) aPrs = theStructToFill; - myPresentableObject->Compute (Projector (theProjector), aPrs); -} - -//======================================================================= -//function : Compute //purpose : //======================================================================= -Handle(Graphic3d_Structure) PrsMgr_Presentation::Compute (const Handle(Graphic3d_DataStructureManager)& theProjector, - const Handle(Geom_Transformation)& theTrsf) +void PrsMgr_Presentation::computeHLR (const Handle(Graphic3d_Camera)& theProjector, + Handle(Graphic3d_Structure)& theStructToFill) { - Handle(Prs3d_Presentation) aPrs3d = new Prs3d_Presentation (myPresentationManager->StructureManager()); - myPresentableObject->Compute (Projector (theProjector), theTrsf, aPrs3d); - return aPrs3d; -} - -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -void PrsMgr_Presentation::Compute (const Handle(Graphic3d_DataStructureManager)& theProjector, - const Handle(Geom_Transformation)& theTrsf, - Handle(Graphic3d_Structure)& theStructToFill) -{ - // recompute HLR after transformation in all the case + if (theStructToFill.IsNull()) + { + theStructToFill = new Prs3d_Presentation (myPresentationManager->StructureManager()); + } Handle(Graphic3d_Structure) aPrs = theStructToFill; theStructToFill->Clear(); - myPresentableObject->Compute (Projector (theProjector), theTrsf, aPrs); -} - -//======================================================================= -//function : Projector -//purpose : -//======================================================================= -Handle(Prs3d_Projector) PrsMgr_Presentation::Projector (const Handle(Graphic3d_DataStructureManager)& theProjector) -{ - Handle(Graphic3d_Camera) aCamera = Handle(Graphic3d_CView)::DownCast (theProjector)->Camera(); - const gp_Dir aDir = aCamera->Direction().Reversed(); - const gp_Pnt anAt = aCamera->Center(); - const gp_Dir anUp = aCamera->Up(); - Handle(Prs3d_Projector) aProj = new Prs3d_Projector (!aCamera->IsOrthographic(), - aCamera->Scale(), - aDir.X(), aDir.Y(), aDir.Z(), - anAt.X(), anAt.Y(), anAt.Z(), - anUp.X(), anUp.Y(), anUp.Z()); - return aProj; + myPresentableObject->computeHLR (theProjector, Transformation(), aPrs); } //======================================================================= @@ -263,3 +210,19 @@ { Erase(); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void PrsMgr_Presentation::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Graphic3d_Structure) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myPresentableObject) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBeforeHighlightState) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMustBeUpdated) +} diff -Nru opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_Presentation.hxx opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_Presentation.hxx --- opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_Presentation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_Presentation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,11 +23,10 @@ class PrsMgr_PresentationManager; class PrsMgr_PresentableObject; class Quantity_Color; -class Geom_Transformation; +class Graphic3d_Camera; class Prs3d_Drawer; class Graphic3d_Structure; class Graphic3d_DataStructureManager; -class Prs3d_Projector; DEFINE_STANDARD_HANDLE(PrsMgr_Presentation, Graphic3d_Structure) @@ -80,6 +79,9 @@ //! Compute structure using presentation manager. Standard_EXPORT virtual void Compute() Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: //! Main constructor. @@ -90,20 +92,8 @@ //! Displays myStructure. Standard_EXPORT void display (const Standard_Boolean theIsHighlight); - Standard_EXPORT virtual Handle(Graphic3d_Structure) Compute (const Handle(Graphic3d_DataStructureManager)& theProjector) Standard_OVERRIDE; - - Standard_EXPORT virtual Handle(Graphic3d_Structure) Compute (const Handle(Graphic3d_DataStructureManager)& theProjector, - const Handle(Geom_Transformation)& theTrsf) Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(Graphic3d_DataStructureManager)& theProjector, - Handle(Graphic3d_Structure)& theGivenStruct) Standard_OVERRIDE; - - Standard_EXPORT virtual void Compute (const Handle(Graphic3d_DataStructureManager)& theProjector, - const Handle(Geom_Transformation)& theTrsf, - Handle(Graphic3d_Structure)& theGivenStruct) Standard_OVERRIDE; - - Standard_EXPORT static Handle(Prs3d_Projector) Projector (const Handle(Graphic3d_DataStructureManager)& theProjector); - + Standard_EXPORT virtual void computeHLR (const Handle(Graphic3d_Camera)& theProjector, + Handle(Graphic3d_Structure)& theGivenStruct) Standard_OVERRIDE; protected: Handle(PrsMgr_PresentationManager) myPresentationManager; diff -Nru opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_PresentationManager.cxx opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_PresentationManager.cxx --- opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_PresentationManager.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_PresentationManager.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,7 +14,7 @@ #include -#include +#include #include #include #include @@ -368,9 +368,11 @@ Handle(Prs3d_PresentationShadow) aShadowPrs = Handle(Prs3d_PresentationShadow)::DownCast (aPrs); if (!aShadowPrs.IsNull() && aView->IsComputed (aShadowPrs->ParentId(), aViewDepPrs)) { + const Graphic3d_ZLayerId aZLayer = aShadowPrs->GetZLayer(); aShadowPrs.Nullify(); + aShadowPrs = new Prs3d_PresentationShadow (myStructureManager, aViewDepPrs); - aShadowPrs->SetZLayer (aViewDepPrs->CStructure()->ZLayer()); + aShadowPrs->SetZLayer (aZLayer); aShadowPrs->SetClipPlanes (aViewDepPrs->ClipPlanes()); aShadowPrs->CStructure()->IsForHighlight = 1; aShadowPrs->Highlight (aPrs->HighlightStyle()); @@ -594,8 +596,8 @@ // purpose : // ======================================================================= void PrsMgr_PresentationManager::Transform (const Handle(PrsMgr_PresentableObject)& thePrsObj, - const Handle(Geom_Transformation)& theTransformation, - const Standard_Integer theMode) + const Handle(TopLoc_Datum3D)& theTransformation, + const Standard_Integer theMode) { Presentation (thePrsObj, theMode)->SetTransformation (theTransformation); } @@ -645,15 +647,12 @@ namespace { - // ======================================================================= - // function : updatePrsTransformation - // purpose : Internal function that scans thePrsList for shadow presentations - // and applies transformation theTrsf to them in case if parent ID - // of shadow presentation is equal to theRefId - // ======================================================================= - void updatePrsTransformation (const PrsMgr_ListOfPresentations& thePrsList, - const Standard_Integer theRefId, - const Handle(Geom_Transformation)& theTrsf) + //! Internal function that scans thePrsList for shadow presentations + //! and applies transformation theTrsf to them in case if parent ID + //! of shadow presentation is equal to theRefId + static void updatePrsTransformation (const PrsMgr_ListOfPresentations& thePrsList, + const Standard_Integer theRefId, + const Handle(TopLoc_Datum3D)& theTrsf) { for (PrsMgr_ListOfPresentations::Iterator anIter (thePrsList); anIter.More(); anIter.Next()) { @@ -688,7 +687,7 @@ return; } - Handle(Geom_Transformation) aTrsf = theObj->LocalTransformationGeom(); + Handle(TopLoc_Datum3D) aTrsf = theObj->LocalTransformationGeom(); const Standard_Integer aParentId = aPrs->CStructure()->Id; updatePrsTransformation (myImmediateList, aParentId, aTrsf); diff -Nru opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_PresentationManager.hxx opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_PresentationManager.hxx --- opencascade-7.4.1+dfsg1/src/PrsMgr/PrsMgr_PresentationManager.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/PrsMgr/PrsMgr_PresentationManager.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,7 @@ class Graphic3d_Structure; typedef Graphic3d_Structure Prs3d_Presentation; -class Geom_Transformation; +class TopLoc_Datum3D; class Prs3d_Drawer; class PrsMgr_Presentation; class PrsMgr_PresentableObject; @@ -136,7 +136,9 @@ //! Sets the transformation theTransformation for the presentable object thePrsObject. //! thePrsObject has the display mode theMode; this has the default value of 0, that is, the wireframe display mode. - Standard_EXPORT void Transform (const Handle(PrsMgr_PresentableObject)& thePrsObject, const Handle(Geom_Transformation)& theTransformation, const Standard_Integer theMode = 0); + Standard_EXPORT void Transform (const Handle(PrsMgr_PresentableObject)& thePrsObject, + const Handle(TopLoc_Datum3D)& theTransformation, + const Standard_Integer theMode = 0); //! Returns the structure manager. const Handle(Graphic3d_StructureManager)& StructureManager() const { return myStructureManager; } diff -Nru opencascade-7.4.1+dfsg1/src/QABugs/QABugs_11.cxx opencascade-7.5.1+dfsg1/src/QABugs/QABugs_11.cxx --- opencascade-7.4.1+dfsg1/src/QABugs/QABugs_11.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/QABugs/QABugs_11.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,7 +55,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -91,6 +93,8 @@ #include #include #include +#include +#include #if ! defined(_WIN32) extern ViewerTest_DoubleMapOfInteractiveAndName& GetMapOfAIS(); @@ -120,7 +124,7 @@ TopoDS_Shape shape1 = BRepPrimAPI_MakeBox(50,50,50).Shape(); Handle(AIS_Shape) AS = new AIS_Shape(shape1); AS->SetDisplayMode(1); - Graphic3d_MaterialAspect mat(Graphic3d_NOM_PLASTIC); + Graphic3d_MaterialAspect mat (Graphic3d_NameOfMaterial_Plastified); AS->SetMaterial(mat); AS->SetColor(Quantity_NOC_RED); myAISContext->Display (AS, Standard_False); @@ -1671,6 +1675,7 @@ #include #include #include +#include //======================================================================= //function : OCC902 //purpose : @@ -1683,16 +1688,32 @@ return 1; } - TCollection_AsciiString myStr(argv[1]); + TCollection_AsciiString anExpStr(argv[1]); + anExpStr.AssignCat("*x"); + anExpStr.Prepend("Exp("); + anExpStr.AssignCat(")"); + + Handle(ExprIntrp_GenExp) exprIntrp = ExprIntrp_GenExp::Create(); - Handle (Expr_NamedUnknown) myNamed = new Expr_NamedUnknown(myStr); - Handle (Expr_Exponential) oldExpr = new Expr_Exponential(myNamed); - Handle (Expr_GeneralExpression) newExpr = oldExpr->Derivative(myNamed); + // + // Create the expression + exprIntrp->Process(anExpStr); + + if (!exprIntrp->IsDone()) + { + di << "Interpretation of expression " << argv[1] << " failed\n"; + return 1; + } + + + Handle(Expr_GeneralExpression) anExpr = exprIntrp->Expression(); + Handle(Expr_NamedUnknown) aVar = new Expr_NamedUnknown("x"); + Handle (Expr_GeneralExpression) newExpr = anExpr->Derivative(aVar); TCollection_AsciiString res = newExpr->String(); Standard_CString resStr = res.ToCString(); - TCollection_AsciiString res_old = oldExpr->String(); + TCollection_AsciiString res_old = anExpr->String(); Standard_CString res_oldStr = res_old.ToCString(); @@ -1742,39 +1763,6 @@ } //======================================================================= -//function : OCC1030_AISColor -//purpose : OCC1030_AISColor (DOC,entry,[color]) -//======================================================================= - -static Standard_Integer OCC1030_AISColor (Draw_Interpretor& di, - Standard_Integer nb, - const char ** arg) -{ - if (nb >= 3) { - Handle(TDocStd_Document) D; - if (!DDocStd::GetDocument(arg[1],D)) return 1; - TDF_Label L; - if (!DDF::FindLabel(D->GetData(),arg[2],L)) return 1; - - Handle(TPrsStd_AISViewer) viewer; - if( !TPrsStd_AISViewer::Find(L, viewer) ) return 1; - - Handle(TPrsStd_AISPresentation) prs; - if(L.FindAttribute( TPrsStd_AISPresentation::GetID(), prs) ) { - if( nb == 4 ) { - prs->SetColor((Quantity_NameOfColor)Draw::Atoi(arg[3])); - TPrsStd_AISViewer::Update(L); - } - else - di << "Color = " << prs->Color() << "\n"; - return 0; - } - } - di << arg[0] << " : Error\n"; - return 1; -} - -//======================================================================= //function : OCC1031_AISMaterial //purpose : OCC1031_AISMaterial (DOC,entry,[material]) //======================================================================= @@ -2207,7 +2195,7 @@ #endif // this code does not work with optimize mode on Windows -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) #pragma optimize( "", off ) #endif static Standard_Integer OCC6143 (Draw_Interpretor& di, Standard_Integer argc, const char ** argv) @@ -2521,7 +2509,7 @@ return 0; } -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) #pragma optimize( "", on ) #endif @@ -4468,7 +4456,7 @@ #include #include #include -#include +#include #include #include @@ -4781,18 +4769,18 @@ { Standard_Integer nbOuter = (argc > 1 ? Draw::Atoi(argv[1]) : 3); Standard_Integer nbInner = (argc > 2 ? Draw::Atoi(argv[2]) : 2); + Standard_Boolean isInf = (argc > 3 && ! strcmp (argv[3], "-inf")); - // test behavior of progress indicator when using nested scopes with names set by Sentry objects + // test behavior of progress indicator when using nested scopes with names Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di, 1); - aProgress->SetTextMode (Standard_True); // Outer cycle - Message_ProgressSentry anOuter (aProgress, "Outer", 0, nbOuter, 1); - for (int i = 0; i < nbOuter && anOuter.More(); i++, anOuter.Next()) + Message_ProgressScope anOuter (aProgress->Start(), "Outer", nbOuter); + for (int i = 0; i < nbOuter && anOuter.More(); i++) { // Inner cycle - Message_ProgressSentry anInner (aProgress, "Inner", 0, nbInner, 1); - for (int j = 0; j < nbInner && anInner.More(); j++, anInner.Next()) + Message_ProgressScope anInner (anOuter.Next(), "Inner", nbInner, isInf); + for (int j = 0; j < (isInf ? 2 * nbInner : nbInner) && anInner.More(); j++, anInner.Next()) { // Cycle body } @@ -4801,6 +4789,133 @@ return 0; } +Standard_Integer OCC31189 (Draw_Interpretor& theDI, Standard_Integer /*argc*/, const char ** /*argv*/) +{ + // redirect output of default messenger to DRAW (temporarily) + const Handle(Message_Messenger)& aMsgMgr = Message::DefaultMessenger(); + Message_SequenceOfPrinters aPrinters; + aPrinters.Append (aMsgMgr->ChangePrinters()); + aMsgMgr->AddPrinter (new Draw_Printer (theDI)); + + // scope block to test output of message on destruction of a stream buffer + { + Message_Messenger::StreamBuffer aSender = Message::SendInfo(); + + // check that messages output to sender and directly to messenger do not intermix + aSender << "Sender message 1: start ..."; + aMsgMgr->Send ("Direct message 1"); + aSender << "... end" << std::endl; // endl should send the message + + // check that empty stream buffer does not produce output on destruction + Message::SendInfo(); + + // additional message to check that they go in expected order + aMsgMgr->Send ("Direct message 2"); + + // check that empty stream buffer does produce empty line if std::endl is passed + Message::SendInfo() << std::endl; + + // last message should be sent on destruction of a sender + aSender << "Sender message 2"; + } + + // restore initial output queue + aMsgMgr->RemovePrinters (STANDARD_TYPE(Draw_Printer)); + aMsgMgr->ChangePrinters().Append (aPrinters); + + return 0; +} + +namespace +{ + struct Task + { + Message_ProgressRange Range; + math_Matrix Mat1, Mat2, Mat3; + + Task(const Message_ProgressRange& thePR, int theSize) + : Range(thePR), + Mat1(1, theSize, 1, theSize, 0.12345), Mat2(1, theSize, 1, theSize, 12345), + Mat3(1, theSize, 1, theSize) + {} + }; + struct Functor + { + void operator()(Task& theTask) const + { + if (theTask.Range.More()) + { + if (theTask.Mat1.RowNumber() > 1) + theTask.Mat3 = theTask.Mat1 * theTask.Mat2; + } + theTask.Range.Close(); + } + }; +} + +Standard_Integer OCC25748(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) +{ + // test behavior of progress indicator in multi-threaded execution + Standard_Integer nIter = 1000; + Standard_Integer aMatSize = 1; + Standard_Boolean isProgress = false; + Standard_Boolean isParallel = false; + + for (int i = 1; i < argc; i++) + { + if (strcmp(argv[i], "-niter") == 0) + nIter = Draw::Atoi(argv[++i]); + else if (strcmp(argv[i], "-matsize") == 0) + aMatSize = Draw::Atoi(argv[++i]); + else if (strcmp(argv[i], "-progr") == 0) + isProgress = true; + else if (strcmp(argv[i], "-parallel") == 0) + isParallel = true; + else + { + di.PrintHelp("OCC25748"); + return 1; + } + } + + OSD_Timer aTimerWhole; + aTimerWhole.Start(); + + Handle(Draw_ProgressIndicator) aProgress; + if (isProgress) + { + aProgress = new Draw_ProgressIndicator(di, 1); + } + Message_ProgressScope aPS(Message_ProgressIndicator::Start(aProgress), + "Parallel data processing", nIter); + + std::vector aTasks; + aTasks.reserve (nIter); + for (int i = 0; i < nIter; i++) + { + aTasks.push_back (Task (aPS.Next(), aMatSize)); + } + + OSD_Timer aTimer; + aTimer.Start(); + OSD_Parallel::ForEach(aTasks.begin(), aTasks.end(), Functor(), !isParallel); + aTimer.Stop(); + + aTimerWhole.Stop(); + + TCollection_AsciiString aText(nIter); + aText += (isParallel ? " parallel" : " sequential"); + if (aMatSize > 1) + aText = aText + " calculations on matrices " + aMatSize + "x" + aMatSize; + else + aText += " empty tasks"; + if (isProgress) + aText += " with progress"; + di << "COUNTER " << aText << ": " << aTimer.ElapsedTime(); + di << "\nCOUNTER " << "including preparations" << ": " << aTimerWhole.ElapsedTime(); + return 0; +} + void QABugs::Commands_11(Draw_Interpretor& theCommands) { const char *group = "QABugs"; @@ -4812,14 +4927,6 @@ theCommands.Add("OCC136", "OCC136", __FILE__, OCC136, group); theCommands.Add("BUC60610","BUC60610 iges_input [name]",__FILE__,BUC60610,group); -//==================================================== -// -// Following commands are inserted from -// /dn03/KAS/dev/QAopt/src/QADraw/QADraw_TOPOLOGY.cxx -// ( 75455 Apr 16 18:59) -// -//==================================================== - theCommands.Add("OCC105","OCC105 shape",__FILE__,OCC105,group); theCommands.Add("OCC9"," result path cur1 cur2 radius [tolerance]:\t test GeomFill_Pipe", __FILE__, pipe_OCC9,group); @@ -4866,7 +4973,6 @@ theCommands.Add("OCC902", "OCC902 expression", __FILE__, OCC902, group); theCommands.Add ("OCC1029_AISTransparency","OCC1029_AISTransparency (DOC, entry, [real])",__FILE__, OCC1029_AISTransparency, group); - theCommands.Add ("OCC1030_AISColor", "OCC1030_AISColor (DOC, entry, [color])", __FILE__, OCC1030_AISColor, group); theCommands.Add ("OCC1031_AISMaterial", "OCC1031_AISMaterial (DOC, entry, [material])", __FILE__, OCC1031_AISMaterial, group); theCommands.Add ("OCC1032_AISWidth", "OCC1032_AISWidth (DOC, entry, [width])", __FILE__, OCC1032_AISWidth, group); theCommands.Add ("OCC1033_AISMode", "OCC1033_AISMode (DOC, entry, [mode])", __FILE__, OCC1033_AISMode, group); @@ -4904,6 +5010,9 @@ theCommands.Add("OCC22558", "OCC22558 x_vec y_vec z_vec x_dir y_dir z_dit x_pnt y_pnt z_pnt", __FILE__, OCC22558, group); theCommands.Add("CR23403", "CR23403 string", __FILE__, CR23403, group); theCommands.Add("OCC23429", "OCC23429 res shape tool [appr]", __FILE__, OCC23429, group); - theCommands.Add("OCC28478", "OCC28478 [nb_outer=3 [nb_inner=2]: test progress indicator on nested cycles", __FILE__, OCC28478, group); + theCommands.Add("OCC28478", "OCC28478 [nb_outer=3 [nb_inner=2] [-inf]: test progress indicator on nested cycles", __FILE__, OCC28478, group); + theCommands.Add("OCC31189", "OCC31189: check stream buffer interface of Message_Messenger", __FILE__, OCC31189, group); + theCommands.Add("OCC25748", "OCC25748 [-niter val] [-matsize val] [-progr] [-parallel]\n" + "\t\ttest progress indicator in parallel execution", __FILE__, OCC25748, group); return; } diff -Nru opencascade-7.4.1+dfsg1/src/QABugs/QABugs_14.cxx opencascade-7.5.1+dfsg1/src/QABugs/QABugs_14.cxx --- opencascade-7.4.1+dfsg1/src/QABugs/QABugs_14.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/QABugs/QABugs_14.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -239,7 +239,8 @@ else return 1; } - for (i++; i #include #include -#include +#include #include #include @@ -241,7 +241,7 @@ //di << ExtString_aText << " " << Draw::Atof(argv[4]) << "\n"; di << argv[5] << " " << Draw::Atof(argv[4]) << "\n"; - Handle(AIS_AngleDimension) aDim = new AIS_AngleDimension(aFirst, aSecond); + Handle(PrsDim_AngleDimension) aDim = new PrsDim_AngleDimension(aFirst, aSecond); aContext->Display (aDim, Standard_True); return 0; @@ -586,7 +586,7 @@ aSfwr->CheckSmallEdges(theSmallEdges,theEdgeToFaces,theFaceWithSmall, theMultyEdges); aSfwr->MergeSmallEdges (theSmallEdges,theEdgeToFaces,theFaceWithSmall, theMultyEdges, aModeDrop,tolang); //aSfwr->FixSmallEdges(); - TopoDS_Shape resShape = aSfwr->Shape();; + TopoDS_Shape resShape = aSfwr->Shape(); DBRep::Set ( argv[1], resShape ); return 0; } @@ -620,7 +620,7 @@ gp_Dir plndir(0, 0, 1); Handle(Geom_Plane) pln = new Geom_Plane(plnpt,plndir); - Handle(AIS_AngleDimension) anAngleDimension = new AIS_AngleDimension (p1.Mirrored (p2), p2, p3); + Handle(PrsDim_AngleDimension) anAngleDimension = new PrsDim_AngleDimension (p1.Mirrored (p2), p2, p3); Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect; anAspect->MakeArrows3d (Standard_True); diff -Nru opencascade-7.4.1+dfsg1/src/QABugs/QABugs_17.cxx opencascade-7.5.1+dfsg1/src/QABugs/QABugs_17.cxx --- opencascade-7.4.1+dfsg1/src/QABugs/QABugs_17.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/QABugs/QABugs_17.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -56,8 +56,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -68,8 +68,6 @@ #include #include -#include -#include #include #include #include @@ -287,14 +285,14 @@ /***************************************/ //dimension "L 502.51" /***************************************/ - Handle(AIS_LengthDimension) len = new AIS_LengthDimension(V2, V3, pln->Pln()); + Handle(PrsDim_LengthDimension) len = new PrsDim_LengthDimension(V2, V3, pln->Pln()); anAspect->ArrowAspect()->SetLength (30.0); len->SetDimensionAspect (anAspect); context->Display (len, Standard_False); /***************************************/ //dimension "L 90" /***************************************/ - Handle(AIS_LengthDimension) len1 = new AIS_LengthDimension(V7, V4, pln->Pln()); + Handle(PrsDim_LengthDimension) len1 = new PrsDim_LengthDimension(V7, V4, pln->Pln()); len1->SetDimensionAspect (anAspect); len1->SetFlyout (30.0); anAspect->ArrowAspect()->SetLength (100.0); @@ -302,7 +300,7 @@ /***************************************/ //dimension "L 150" /***************************************/ - Handle(AIS_LengthDimension) len2 = new AIS_LengthDimension(V1, V2, pln->Pln()); + Handle(PrsDim_LengthDimension) len2 = new PrsDim_LengthDimension(V1, V2, pln->Pln()); len2->SetDimensionAspect (anAspect); context->Display (len2, Standard_False); /***************************************/ @@ -310,7 +308,7 @@ /***************************************/ gp_Circ cir = gp_Circ(gp_Ax2(gp_Pnt(191.09, -88.58, 0), gp_Dir(0, 0, 1)), 88.58); TopoDS_Edge E1 = BRepBuilderAPI_MakeEdge(cir,gp_Pnt(191.09,0,0.),gp_Pnt(191.09,-177.16,0.) ); - Handle(AIS_RadiusDimension) dim1 = new AIS_RadiusDimension(E1); + Handle(PrsDim_RadiusDimension) dim1 = new PrsDim_RadiusDimension(E1); dim1->SetDimensionAspect (anAspect); context->Display (dim1, Standard_False); /***************************************/ @@ -318,7 +316,7 @@ /***************************************/ gp_Circ cir1 = gp_Circ(gp_Ax2(gp_Pnt(191.09, -88.58, 0), gp_Dir(0, 0, 1)), 43.80); TopoDS_Edge E_cir1 = BRepBuilderAPI_MakeEdge(cir1); - dim1 = new AIS_RadiusDimension(E_cir1); + dim1 = new PrsDim_RadiusDimension(E_cir1); anAspect->ArrowAspect()->SetLength (60.0); dim1->SetDimensionAspect (anAspect); context->Display (dim1, Standard_False); @@ -327,7 +325,7 @@ /***************************************/ gp_Circ cir2 = gp_Circ(gp_Ax2(gp_Pnt(566.11, -88.58, 0), gp_Dir(0, 0, -1)), 17.86); TopoDS_Edge E_cir2 = BRepBuilderAPI_MakeEdge(cir2); - dim1 = new AIS_RadiusDimension(E_cir2); + dim1 = new PrsDim_RadiusDimension(E_cir2); anAspect->ArrowAspect()->SetLength (40.0); dim1->SetDimensionAspect (anAspect); context->Display (dim1, Standard_True); @@ -1103,8 +1101,8 @@ Handle(AIS_Shape) anAisIO = new AIS_Shape(aShape); - Quantity_Color aColF(0.0, 0.4, 0.0, Quantity_TOC_RGB); - Quantity_Color aColB(0.0, 0.0, 0.6, Quantity_TOC_RGB); + Quantity_Color aColF(0.0, 0.4, 0.0, Quantity_TOC_sRGB); + Quantity_Color aColB(0.0, 0.0, 0.6, Quantity_TOC_sRGB); Handle(Prs3d_Drawer) aDrawer = anAisIO->Attributes(); Handle(Prs3d_ShadingAspect) aShadingAspect = aDrawer->ShadingAspect(); @@ -1130,9 +1128,9 @@ anAISContext->Display (anAisIO, 1, 0, Standard_True); Standard_Real r, g, b; - aShadingAspect->Color(Aspect_TOFM_FRONT_SIDE).Values(r,g,b, Quantity_TOC_RGB); + aShadingAspect->Color(Aspect_TOFM_FRONT_SIDE).Values(r,g,b, Quantity_TOC_sRGB); di << "Info: color on front side (" << r << "," << g << "," << b << ")\n"; - aShadingAspect->Color(Aspect_TOFM_BACK_SIDE).Values(r,g,b, Quantity_TOC_RGB); + aShadingAspect->Color(Aspect_TOFM_BACK_SIDE).Values(r,g,b, Quantity_TOC_sRGB); di << "Info: color on back side (" << r << "," << g << "," << b << ")\n"; return 0; @@ -1161,10 +1159,10 @@ Handle(AIS_Shape) ais = new AIS_Shape(sh); AISContext->Display (ais, 1, 0, Standard_False); - AISContext->SetMaterial (ais, Graphic3d_NOM_SHINY_PLASTIC, Standard_False); + AISContext->SetMaterial (ais, Graphic3d_NameOfMaterial_ShinyPlastified, Standard_False); - Quantity_Color colf(0.0, 0.4, 0.0, Quantity_TOC_RGB); - Quantity_Color colb(0.0, 0.0, 0.6, Quantity_TOC_RGB); + Quantity_Color colf(0.0, 0.4, 0.0, Quantity_TOC_sRGB); + Quantity_Color colb(0.0, 0.0, 0.6, Quantity_TOC_sRGB); Handle(Prs3d_ShadingAspect) sa = ais->Attributes()->ShadingAspect(); Graphic3d_MaterialAspect front = sa->Material(Aspect_TOFM_FRONT_SIDE); diff -Nru opencascade-7.4.1+dfsg1/src/QABugs/QABugs_18.cxx opencascade-7.5.1+dfsg1/src/QABugs/QABugs_18.cxx --- opencascade-7.4.1+dfsg1/src/QABugs/QABugs_18.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/QABugs/QABugs_18.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,6 @@ #include #include #include -#include #include #include diff -Nru opencascade-7.4.1+dfsg1/src/QABugs/QABugs_19.cxx opencascade-7.5.1+dfsg1/src/QABugs/QABugs_19.cxx --- opencascade-7.4.1+dfsg1/src/QABugs/QABugs_19.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/QABugs/QABugs_19.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -57,9 +61,11 @@ #include #ifdef HAVE_TBB + Standard_DISABLE_DEPRECATION_WARNINGS #include #include #include + Standard_ENABLE_DEPRECATION_WARNINGS #endif #include @@ -387,6 +393,7 @@ struct GeomConvertTest_Data { + GeomConvertTest_Data() : nbupoles(0) {} Standard_Integer nbupoles; Handle(Geom_Surface) surf; }; @@ -461,6 +468,7 @@ struct GeomIntSSTest_Data { + GeomIntSSTest_Data() : nbsol(0) {} Standard_Integer nbsol; Handle(Geom_Surface) surf1, surf2; }; @@ -1682,13 +1690,13 @@ di << "Usage: " << argv[0] << " invalid number of arguments\n"; return 1; } - Handle(TDocStd_Document) aDoc = new TDocStd_Document("dummy");; + Handle(TDocStd_Document) aDoc = new TDocStd_Document("dummy"); TopoDS_Shape s1 = BRepPrimAPI_MakeBox(1,1,1).Shape(); TDF_Label lab1 = XCAFDoc_DocumentTool::ShapeTool (aDoc->Main ())->NewShape(); XCAFDoc_DocumentTool::ShapeTool (aDoc->Main ())->SetShape(lab1, s1); TDataStd_Name::Set(lab1, "Box1"); - Quantity_Color yellow(1,1,0, Quantity_TOC_RGB); + Quantity_Color yellow(Quantity_NOC_YELLOW); XCAFDoc_DocumentTool::ColorTool (aDoc->Main())->SetColor(lab1, yellow, XCAFDoc_ColorGen); XCAFDoc_DocumentTool::ColorTool(aDoc->Main())->SetVisibility(lab1, 0); @@ -1700,7 +1708,16 @@ return 1; } - writer.Write(argv[1]); + const Handle(Message_Messenger)& aMsgMgr = Message::DefaultMessenger(); + Message_SequenceOfPrinters aPrinters; + aPrinters.Append (aMsgMgr->ChangePrinters()); + aMsgMgr->AddPrinter (new Draw_Printer (di)); + + writer.Write (argv[1]); + + aMsgMgr->RemovePrinters (STANDARD_TYPE(Draw_Printer)); + aMsgMgr->ChangePrinters().Append (aPrinters); + return 0; } @@ -1731,7 +1748,7 @@ TDF_Label component01 = XCAFDoc_DocumentTool::ShapeTool (aDoc->Main ())->AddComponent (labelA0, lab1, location0); XCAFDoc_DocumentTool::ShapeTool (aDoc->Main ())->UpdateAssemblies(); - Quantity_Color yellow(1,1,0, Quantity_TOC_RGB); + Quantity_Color yellow(Quantity_NOC_YELLOW); XCAFDoc_DocumentTool::ColorTool (labelA0)->SetColor (component01, yellow, XCAFDoc_ColorGen); XCAFDoc_DocumentTool::ColorTool (labelA0)->SetVisibility (component01, 0); @@ -1743,7 +1760,16 @@ return 1; } + const Handle(Message_Messenger)& aMsgMgr = Message::DefaultMessenger(); + Message_SequenceOfPrinters aPrinters; + aPrinters.Append (aMsgMgr->ChangePrinters()); + aMsgMgr->AddPrinter (new Draw_Printer (di)); + writer.Write (argv[1]); + + aMsgMgr->RemovePrinters (STANDARD_TYPE(Draw_Printer)); + aMsgMgr->ChangePrinters().Append (aPrinters); + return 0; } @@ -2206,6 +2232,13 @@ return new XmlDrivers_DocumentStorageDriver ("Test"); } virtual Standard_CString ResourcesName() Standard_OVERRIDE { return ""; } + + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const + { + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDocStd_Application) + } }; //======================================================================= @@ -5024,14 +5057,14 @@ aFillAspect->SetInteriorStyle (Aspect_IS_POINT); // create separate group for frame elements - Handle(Graphic3d_Group) aFrameGroup = Prs3d_Root::NewGroup (thePresentation); + Handle(Graphic3d_Group) aFrameGroup = thePresentation->NewGroup(); aFrameGroup->AddPrimitiveArray (aFrame); aFrameGroup->SetGroupPrimitivesAspect (aFillAspect); // create separate group for text elements - Handle(Graphic3d_Group) aTextGroup = Prs3d_Root::NewGroup (thePresentation); + Handle(Graphic3d_Group) aTextGroup = thePresentation->NewGroup(); TCollection_ExtendedString aString ("YOU SHOULD SEE THIS TEXT", Standard_True); - Prs3d_Text::Draw (Prs3d_Root::CurrentGroup (thePresentation), myDrawer->TextAspect(), aString, gp_Ax2 (gp::Origin(), gp::DZ())); + Prs3d_Text::Draw (aTextGroup, myDrawer->TextAspect(), aString, gp_Ax2 (gp::Origin(), gp::DZ())); } virtual void ComputeSelection (const Handle(SelectMgr_Selection)& /*theSelection*/, diff -Nru opencascade-7.4.1+dfsg1/src/QABugs/QABugs_1.cxx opencascade-7.5.1+dfsg1/src/QABugs/QABugs_1.cxx --- opencascade-7.4.1+dfsg1/src/QABugs/QABugs_1.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/QABugs/QABugs_1.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -86,6 +86,7 @@ } else { di << "DocOwner1 = NOTNULL\n"; } + OwnerD1.Nullify(); Handle(TDocStd_Application) A = DDocStd::GetApplication(); A->Close(D); diff -Nru opencascade-7.4.1+dfsg1/src/QABugs/QABugs_20.cxx opencascade-7.5.1+dfsg1/src/QABugs/QABugs_20.cxx --- opencascade-7.4.1+dfsg1/src/QABugs/QABugs_20.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/QABugs/QABugs_20.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -2716,7 +2716,7 @@ if (aMem1 > aMem0) theDI << "Error: memory increased by " << (int)(aMem1 - aMem0) << " bytes\n"; -}; +} static Standard_Integer OCC29064 (Draw_Interpretor& theDI, Standard_Integer theArgc, const char** theArgv) { @@ -2976,6 +2976,216 @@ return 0; } +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +typedef NCollection_Sequence SequenceOfDocNames; + +typedef struct +{ + Standard_ThreadId ID; + int iThread; + TCollection_AsciiString inFile[3]; + TCollection_AsciiString outFile[2]; + bool finished; + int* res; +} Args; + +static void printMsg(const char* msg) +{ + printf("%s\n", msg); +} + +static Standard_Integer nbREP(50); + +void* threadFunction(void* theArgs) +{ + Args* args = (Args*)theArgs; + try + { + if(args->inFile[0].IsEmpty()) + { + *(args->res) = -1; + return args->res; + } + + Handle(TDocStd_Application) anApp = new TDocStd_Application(); + OCC_CATCH_SIGNALS; + BinLDrivers::DefineFormat(anApp); + BinDrivers::DefineFormat(anApp); + XmlLDrivers::DefineFormat(anApp); + XmlDrivers::DefineFormat(anApp); + StdLDrivers::DefineFormat(anApp); + StdDrivers::DefineFormat(anApp); + + for (int aFileIndex = 0; aFileIndex < 3; aFileIndex++) + { + TCollection_AsciiString aDocName = args->inFile[aFileIndex]; + Handle(TDocStd_Document) aDoc; + for (int i = 1; i <= nbREP; i++) { + + PCDM_ReaderStatus aStatus = anApp->Open(aDocName, aDoc); + if (aStatus != PCDM_RS_OK) { + args->finished = true; + *(args->res) = -1; + return args->res; + } + else { + TDF_Label aLabel = aDoc->Main(); + TDF_ChildIterator anIt(aLabel, Standard_True); + for (; anIt.More(); anIt.Next()) { + const TDF_Label& aLab = anIt.Value(); + Handle(TDataStd_AsciiString) anAtt; + aLab.FindAttribute(TDataStd_AsciiString::GetID(), anAtt); + if (!anAtt.IsNull()) { + TCollection_AsciiString aStr = anAtt->Get(); + if (aStr.IsEqual(aDocName)) { + *(args->res) = (int)aLab.Tag(); + break; + } + } + } + + if (aFileIndex != 2) { + TCollection_AsciiString anOutDocName = args->outFile[aFileIndex]; + anApp->SaveAs(aDoc, anOutDocName); + } + anApp->Close(aDoc); + } + } + } + args->finished = true; + } + catch (...) + { + args->finished = true; + *(args->res) = -1; + return args->res; + } + args->finished = true; + return args->res; +} + +int getNumCores() +{ +#ifdef WIN32 + SYSTEM_INFO sysinfo; + GetSystemInfo(&sysinfo); + return sysinfo.dwNumberOfProcessors; +#elif MACOS + int nm[2]; + size_t len = 4; + uint32_t count; + + nm[0] = CTL_HW; nm[1] = HW_AVAILCPU; + sysctl(nm, 2, &count, &len, NULL, 0); + + if (count < 1) { + nm[1] = HW_NCPU; + sysctl(nm, 2, &count, &len, NULL, 0); + if (count < 1) { count = 1; } + } + return count; +#else + return sysconf(_SC_NPROCESSORS_ONLN); +#endif +} + +//======================================================================= +//function : OCC29195 +//purpose : +//======================================================================= +static Standard_Integer OCC29195(Draw_Interpretor&, Standard_Integer theArgC, const char** theArgV) +{ + if (theArgC < 2) + { + std::cout << "\nOCC29195 [nbRep] doc1.cbf doc1.xml doc1.std outDoc1.cbf outDoc1.xml doc2.cbf doc2.xml doc2.std outDoc2.cbf outDoc2.xml ...], where:"; + std::cout << "\nnbRep - number repetitions of a thread function (by default - 50)"; + std::cout << "\ndocN - names (5 in each group) of OCAF documents names (3 input files, 2 output)\n" << std::endl; + return 1; + } + int iThread(0), nbThreads(0), off(0); + if (TCollection_AsciiString(theArgV[1]).IsIntegerValue()) + { + nbREP = TCollection_AsciiString(theArgV[1]).IntegerValue(); + off = 1; + } + if (theArgC - off - 1 < 5 || (theArgC - off - 1) % 5 != 0 ) + { + printMsg("TEST is FAILED: number of arguments is invalid\n"); + return 0; + } + Standard_Integer aNbFiles = (theArgC - off - 1) / 5; + nbThreads = getNumCores(); + if (aNbFiles < nbThreads) + { + nbThreads = aNbFiles; + } + // Allocate data + Args* args = new Args[nbThreads]; + OSD_Thread* threads = new OSD_Thread[nbThreads]; + while (iThread < nbThreads) + { + if (iThread < aNbFiles) + { + args[iThread].inFile[0] = theArgV[iThread * 5 + off + 1]; + args[iThread].inFile[1] = theArgV[iThread * 5 + off + 2]; + args[iThread].inFile[2] = theArgV[iThread * 5 + off + 3]; + args[iThread].outFile[0] = theArgV[iThread * 5 + off + 4]; + args[iThread].outFile[1] = theArgV[iThread * 5 + off + 5]; + } + args[iThread].iThread = iThread; + args[iThread].ID = threads[iThread].GetId(); + args[iThread].finished = false; + args[iThread].res = new int; + threads[iThread].SetFunction(&threadFunction); + iThread++; + } + for (iThread = 0; iThread < nbThreads; iThread++) + { + args[iThread].finished = false; + threads[iThread].Run((void*)&(args[iThread])); + } + // Sleep while the threads are run. + bool finished = false; + while (!finished) + { + OSD::MilliSecSleep(100); + finished = true; + for (iThread = 0; iThread < nbThreads && finished; iThread++) + { + finished = args[iThread].finished; + } + } + OSD_Environment anEnv("Result29195"); + for (iThread = 0; iThread < nbThreads; iThread++) + { + if (*(args[iThread].res) == -1) + { + printMsg("OCC29195 is FAILED\n"); + anEnv.SetValue("FAILED_ERR"); + break; + } + } + if (iThread == nbThreads) + { + printMsg("OCC29195 is finished OK\n"); + anEnv.SetValue("OK"); + } + anEnv.Build(); + return 0; +} + //======================================================================= //function : QAStartsWith string startstring //======================================================================= @@ -3154,7 +3364,7 @@ it.Initialize (empty); } - catch (Standard_Failure) + catch (const Standard_Failure&) { di << "Cannot initialize TopoDS_Iterator with null shape\n"; return 0; @@ -3179,7 +3389,7 @@ TopoDS_Wire empty; BRepLib_MakeWire aWBuilder (empty); } - catch (Standard_Failure) + catch (const Standard_Failure&) { di << "Cannot initialize BRepLib_MakeWire with null wire\n"; } @@ -3471,6 +3681,195 @@ return 0; } +#include +#include +#include +//======================================================================= +//function : OCC31697 +//purpose : +//======================================================================= +static Standard_Integer OCC31697(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) +{ + if (argc < 3) + { + di << "Usage : " << argv[0] << " expression variable\n"; + return 1; + } + + TCollection_AsciiString anExpStr(argv[1]); + TCollection_AsciiString aVarStr(argv[2]); + + Handle(ExprIntrp_GenExp) exprIntrp = ExprIntrp_GenExp::Create(); + + // + // Create the expression + exprIntrp->Process(anExpStr); + + if (!exprIntrp->IsDone()) + { + di << "Interpretation of expression " << argv[1] << " failed\n"; + return 1; + } + + Handle(Expr_GeneralExpression) anExpr = exprIntrp->Expression(); + Handle(Expr_NamedUnknown) aVar = new Expr_NamedUnknown(aVarStr); + + if (!anExpr->Contains(aVar)) + { + di << "Expression " << argv[1] << " does not contain variable " << argv[2] << "\n"; + return 1; + } + + Handle(Expr_GeneralExpression) aDer = anExpr->Derivative(aVar); + + TCollection_AsciiString aDerStr = aDer->String(); + + di << "The derivative of the " << argv[1] << " by " << argv[2] << " is equal to " << aDerStr << "\n"; + + return 0; +} + +#include +#include +#include +//======================================================================= +//function : OCC31320 +//purpose : +//======================================================================= +static Standard_Integer OCC31320(Draw_Interpretor& di, Standard_Integer argc, const char ** argv) +{ + if (argc < 3) + { + di << "Usage : " << argv[0] << " DocName ObjName\n"; + return 1; + } + Handle(TObj_Model) aModel; + Handle(TDocStd_Document) D; + if (!DDocStd::GetDocument (argv[1], D)) + { + di << "Error: document " << argv[1] << " not found\n"; + return 1; + } + + TDF_Label aLabel = D->Main(); + Handle(TObj_TModel) aModelAttr; + if (!aLabel.IsNull() && aLabel.FindAttribute (TObj_TModel::GetID(), aModelAttr)) + aModel = aModelAttr->Model(); + + if (aModel.IsNull()) + { + di << "Error: TObj model " << argv[1] << " not found\n"; + return 1; + } + + Handle(TCollection_HExtendedString) aName = new TCollection_HExtendedString (argv[2]); + Handle(TObj_TNameContainer) aDict; + Handle(TObj_Object) anObj = aModel->FindObject (aName, aDict); + + if (aModel.IsNull()) + { + di << "Error: object " << argv[2] << " not found\n"; + return 1; + } + + // do a test: find the first child of an object, remove object and get the father of this child + Handle(TObj_ObjectIterator) aChildrenIter = anObj->GetChildren(); + if (!aChildrenIter->More()) + { + di << "Error: object " << argv[2] << " has no children\n"; + return 1; + } + + Handle(TObj_Object) aChild = aChildrenIter->Value(); + anObj->Detach(); + Handle(TObj_Object) aFather = aChild->GetFatherObject(); + if (!aFather.IsNull()) + { + di << "Error: father is not null\n"; + return 1; + } + + return 0; + +} + +#include +#include +namespace +{ + class QABugs_XdeLoader : public OSD_Thread + { + public: + QABugs_XdeLoader (const Handle(TDocStd_Application)& theXdeApp, + const Handle(TDocStd_Document)& theXdeDoc, + const TCollection_AsciiString& theFilePath) + : OSD_Thread (performThread), + myXdeApp (theXdeApp), myXdeDoc (theXdeDoc), myFilePath (theFilePath) {} + + private: + void perform() + { + Handle(TDocStd_Document) aNewDoc; + const PCDM_ReaderStatus aReaderStatus = myXdeApp->Open (myFilePath, aNewDoc); + if (aReaderStatus != PCDM_RS_OK) + { + Message::SendFail ("Error occurred while reading the file"); + return; + } + myXdeDoc = aNewDoc; + Message::SendInfo() << "Info: document has been opened"; + } + + static Standard_Address performThread (Standard_Address theData) + { + QABugs_XdeLoader* aLoader = (QABugs_XdeLoader* )theData; + OSD::SetThreadLocalSignal (OSD_SignalMode_Set, false); + try + { + OCC_CATCH_SIGNALS + aLoader->perform(); + } + catch (Standard_Failure const& theExcep) + { + Message::SendFail() << "Error: unexpected exception " << theExcep; + return 0; + } + return 0; + } + private: + Handle(TDocStd_Application) myXdeApp; + Handle(TDocStd_Document) myXdeDoc; + TCollection_AsciiString myFilePath; + }; +} + +//======================================================================= +//function : OCC31785 +//purpose : Try reading XBF file in background thread +//======================================================================= +static Standard_Integer OCC31785 (Draw_Interpretor& theDI, + Standard_Integer theNbArgs, + const char** theArgVec) +{ + if (theNbArgs != 2) + { + theDI << "Syntax error: wrong number of arguments\n"; + return 1; + } + + TCollection_AsciiString aFileName (theArgVec[1]); + + Handle(TDocStd_Application) anXdeApp = new TDocStd_Application(); + BinXCAFDrivers::DefineFormat (anXdeApp); + + Handle(TDocStd_Document) anXdeDoc; + anXdeApp->NewDocument (TCollection_ExtendedString ("BinXCAF"), anXdeDoc); + QABugs_XdeLoader aLoader (anXdeApp, anXdeDoc, aFileName); + aLoader.Run (&aLoader); + aLoader.Wait(); + return 0; +} + void QABugs::Commands_20(Draw_Interpretor& theCommands) { const char *group = "QABugs"; @@ -3508,6 +3907,7 @@ theCommands.Add("OCC29807", "OCC29807 surface1 surface2 u1 v1 u2 v2", __FILE__, OCC29807, group); theCommands.Add("OCC29311", "OCC29311 shape counter nbiter: check performance of OBB calculation", __FILE__, OCC29311, group); theCommands.Add("OCC30391", "OCC30391 result face LenBeforeUfirst LenAfterUlast LenBeforeVfirst LenAfterVlast", __FILE__, OCC30391, group); + theCommands.Add("OCC29195", "OCC29195 [nbRep] doc1 [doc2 [doc3 [doc4]]]", __FILE__, OCC29195, group); theCommands.Add("OCC30435", "OCC30435 result curve inverse nbit", __FILE__, OCC30435, group); theCommands.Add("OCC30990", "OCC30990 surface", __FILE__, OCC30990, group); @@ -3537,5 +3937,13 @@ theCommands.Add("OCC30704_1", "OCC30704_1", __FILE__, OCC30704_1, group); theCommands.Add("OCC31294", "OCC31294", __FILE__, OCC31294, group); + theCommands.Add("OCC31697", "OCC31697 expression variable", __FILE__, OCC31697, group); + + theCommands.Add("OCC31320", "OCC31320 DocName ObjName : tests remove of the children GetFather method if father is removed", __FILE__, OCC31320, group); + + theCommands.Add("OCC31785", + "OCC31785 file.xbf : test reading XBF file in another thread", + __FILE__, OCC31785, group); + return; } diff -Nru opencascade-7.4.1+dfsg1/src/QABugs/QABugs_3.cxx opencascade-7.5.1+dfsg1/src/QABugs/QABugs_3.cxx --- opencascade-7.4.1+dfsg1/src/QABugs/QABugs_3.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/QABugs/QABugs_3.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -69,7 +69,7 @@ #include #include #include -#include +#include static Standard_Integer BUC60632(Draw_Interpretor& di, Standard_Integer /*n*/, const char ** a) { @@ -92,7 +92,7 @@ Handle(Geom_Plane) Plane1 = new Geom_Plane(gp_Pnt(0,0,0),gp_Dir(0,0,1)); TCollection_ExtendedString Ext1("Dim1"); - Handle(AIS_LengthDimension) Dim1 = new AIS_LengthDimension(V1,V2,Plane1->Pln()); + Handle(PrsDim_LengthDimension) Dim1 = new PrsDim_LengthDimension(V1,V2,Plane1->Pln()); Dim1->SetCustomValue (Draw::Atof(a[2])); Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect(); @@ -310,7 +310,7 @@ TopoDS_Face F1= bzf1.Face(); ais1 = new AIS_Shape(F1); DBRep::Set("F1",F1); - aContext->SetMaterial(ais1,Graphic3d_NOM_ALUMINIUM,Standard_False); + aContext->SetMaterial (ais1, Graphic3d_NameOfMaterial_Aluminum, Standard_False); aContext->Display (ais1, Standard_False); BRep_Builder B; TopoDS_Shell shell; @@ -347,7 +347,7 @@ mkw.Add(*E6); FP = BRepBuilderAPI_MakeFace(mkw.Wire()); ais2 = new AIS_Shape( FP ); - aContext->SetMaterial(ais2,Graphic3d_NOM_ALUMINIUM,Standard_False); + aContext->SetMaterial (ais2, Graphic3d_NameOfMaterial_Aluminum, Standard_False); aContext->Display (ais2, Standard_False); DBRep::Set("FP",FP); @@ -378,7 +378,7 @@ fillet.Build(); FP1 = fillet.Shape(); ais2 = new AIS_Shape( FP1 ); - aContext->SetMaterial(ais2,Graphic3d_NOM_ALUMINIUM,Standard_False); + aContext->SetMaterial (ais2, Graphic3d_NameOfMaterial_Aluminum, Standard_False); aContext->Display (ais2, Standard_False); DBRep::Set("FP1",FP1); diff -Nru opencascade-7.4.1+dfsg1/src/Quantity/FILES opencascade-7.5.1+dfsg1/src/Quantity/FILES --- opencascade-7.4.1+dfsg1/src/Quantity/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Quantity/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -13,11 +13,11 @@ Quantity_CoefficientOfExpansion.hxx Quantity_Color.cxx Quantity_Color.hxx +Quantity_ColorTable.pxx Quantity_ColorHasher.hxx Quantity_ColorRGBA.cxx Quantity_ColorRGBA.hxx Quantity_ColorRGBAHasher.hxx -Quantity_ColorDefinitionError.hxx Quantity_Concentration.hxx Quantity_Conductivity.hxx Quantity_Constant.hxx diff -Nru opencascade-7.4.1+dfsg1/src/Quantity/Quantity_Color.cxx opencascade-7.5.1+dfsg1/src/Quantity/Quantity_Color.cxx --- opencascade-7.4.1+dfsg1/src/Quantity/Quantity_Color.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Quantity/Quantity_Color.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,7 +15,6 @@ #include -#include #include #include #include @@ -23,29 +22,124 @@ #include #include -// for Test method (suite et fin) -void call_hlsrgb(float h, float l, float s, float& r, float& g, float& b); -void call_rgbhls(float r, float g, float b, float& h, float& l, float& s); - -//-Aliases - -//-Global data definitions #define RGBHLS_H_UNDEFINED -1.0 static Standard_Real TheEpsilon = 0.0001; -// -- les composantes RGB -// MyRed : Standard_ShortReal; -// MyGreen : Standard_ShortReal; -// MyBlue : Standard_ShortReal; +// Throw exception if RGB values are out of range. +#define Quantity_ColorValidateRgbRange(theR, theG, theB) \ + if (theR < 0.0 || theR > 1.0 \ + || theG < 0.0 || theG > 1.0 \ + || theB < 0.0 || theB > 1.0) { throw Standard_OutOfRange("Color out"); } + +// Throw exception if HLS values are out of range. +#define Quantity_ColorValidateHlsRange(theH, theL, theS) \ + if ((theH < 0.0 && theH != RGBHLS_H_UNDEFINED && theS != 0.0) \ + || (theH > 360.0) \ + || theL < 0.0 || theL > 1.0 \ + || theS < 0.0 || theS > 1.0) { throw Standard_OutOfRange("Color out"); } + +// Throw exception if CIELab color values are out of range. +#define Quantity_ColorValidateLabRange(theL, thea, theb) \ + if (theL < 0. || theL > 100. || thea < -100. || thea > 100. || theb < -110. || theb > 100.) \ + { throw Standard_OutOfRange("Color out"); } + +// Throw exception if CIELch color values are out of range. +#define Quantity_ColorValidateLchRange(theL, thec, theh) \ + if (theL < 0. || theL > 100. || thec < 0. || thec > 135. || \ + theh < 0.0 || theh > 360.) { throw Standard_OutOfRange("Color out"); } + +namespace +{ + //! Raw color for defining list of standard color + struct Quantity_StandardColor + { + const char* StringName; + NCollection_Vec3 sRgbValues; + NCollection_Vec3 RgbValues; + Quantity_NameOfColor EnumName; + + Quantity_StandardColor (Quantity_NameOfColor theName, + const char* theStringName, + const NCollection_Vec3& thesRGB, + const NCollection_Vec3& theRGB) + : StringName (theStringName), + sRgbValues (thesRGB), + RgbValues (theRGB), + EnumName (theName) {} + }; +} + +// Note that HTML/hex sRGB representation is ignored +#define RawColor(theName, theHex, SRGB, sR, sG, sB, RGB, theR, theG, theB) \ + Quantity_StandardColor(Quantity_NOC_##theName, #theName, NCollection_Vec3(sR##f, sG##f, sB##f), NCollection_Vec3(theR##f, theG##f, theB##f)) + +//! Name list of standard materials (defined within enumeration). +static const Quantity_StandardColor THE_COLORS[] = +{ +#include "Quantity_ColorTable.pxx" +}; + +// ======================================================================= +// function : Epsilon +// purpose : +// ======================================================================= +Standard_Real Quantity_Color::Epsilon() +{ + return TheEpsilon; +} + +// ======================================================================= +// function : SetEpsilon +// purpose : +// ======================================================================= +void Quantity_Color::SetEpsilon (const Standard_Real theEpsilon) +{ + TheEpsilon = theEpsilon; +} -//-Constructors +// ======================================================================= +// function : valuesOf +// purpose : +// ======================================================================= +NCollection_Vec3 Quantity_Color::valuesOf (const Quantity_NameOfColor theName, + const Quantity_TypeOfColor theType) +{ + if ((Standard_Integer )theName < 0 || (Standard_Integer )theName > Quantity_NOC_WHITE) + { + throw Standard_OutOfRange("Bad name"); + } -//-Destructors + const NCollection_Vec3& anRgb = THE_COLORS[theName].RgbValues; + switch (theType) + { + case Quantity_TOC_RGB: return anRgb; + case Quantity_TOC_sRGB: return Convert_LinearRGB_To_sRGB (anRgb); + case Quantity_TOC_HLS: return Convert_LinearRGB_To_HLS (anRgb); + case Quantity_TOC_CIELab: return Convert_LinearRGB_To_Lab (anRgb); + case Quantity_TOC_CIELch: return Convert_Lab_To_Lch (Convert_LinearRGB_To_Lab (anRgb)); + } + throw Standard_ProgramError("Internal error"); +} -//-Methods, in order +// ======================================================================= +// function : StringName +// purpose : +// ======================================================================= +Standard_CString Quantity_Color::StringName (const Quantity_NameOfColor theName) +{ + if ((Standard_Integer )theName < 0 || (Standard_Integer )theName > Quantity_NOC_WHITE) + { + throw Standard_OutOfRange("Bad name"); + } + return THE_COLORS[theName].StringName; +} +// ======================================================================= +// function : ColorFromName +// purpose : +// ======================================================================= Standard_Boolean Quantity_Color::ColorFromName (const Standard_CString theName, Quantity_NameOfColor& theColor) { @@ -58,21 +152,41 @@ for (Standard_Integer anIter = Quantity_NOC_BLACK; anIter <= Quantity_NOC_WHITE; ++anIter) { - Standard_CString aColorName = Quantity_Color::StringName (Quantity_NameOfColor (anIter)); + Standard_CString aColorName = THE_COLORS[anIter].StringName; if (aName == aColorName) { theColor = (Quantity_NameOfColor )anIter; return Standard_True; } } - return Standard_False; + + // aliases + if (aName == "BLUE1") { theColor = Quantity_NOC_BLUE1; } + else if (aName == "CHARTREUSE1") { theColor = Quantity_NOC_CHARTREUSE1; } + else if (aName == "CYAN1") { theColor = Quantity_NOC_CYAN1; } + else if (aName == "GOLD1") { theColor = Quantity_NOC_GOLD1; } + else if (aName == "GREEN1") { theColor = Quantity_NOC_GREEN1; } + else if (aName == "LIGHTCYAN1") { theColor = Quantity_NOC_LIGHTCYAN1; } + else if (aName == "MAGENTA1") { theColor = Quantity_NOC_MAGENTA1; } + else if (aName == "ORANGE1") { theColor = Quantity_NOC_ORANGE1; } + else if (aName == "ORANGERED1") { theColor = Quantity_NOC_ORANGERED1; } + else if (aName == "RED1") { theColor = Quantity_NOC_RED1; } + else if (aName == "TOMATO1") { theColor = Quantity_NOC_TOMATO1; } + else if (aName == "YELLOW1") { theColor = Quantity_NOC_YELLOW1; } + else + { + return Standard_False; + } + + return Standard_True; } //======================================================================= // function : ColorFromHex // purpose : //======================================================================= -bool Quantity_Color::ColorFromHex (const Standard_CString theHexColorString, Quantity_Color& theColor) +bool Quantity_Color::ColorFromHex (const Standard_CString theHexColorString, + Quantity_Color& theColor) { Quantity_ColorRGBA aColorRGBA; if (!Quantity_ColorRGBA::ColorFromHex (theHexColorString, aColorRGBA, true)) @@ -83,3855 +197,496 @@ return true; } -Quantity_Color::Quantity_Color () { - - Quantity_Color::ValuesOf - (Quantity_NOC_YELLOW, Quantity_TOC_RGB, MyRed, MyGreen, MyBlue); +// ======================================================================= +// function : Quantity_Color +// purpose : +// ======================================================================= +Quantity_Color::Quantity_Color (const Standard_Real theC1, const Standard_Real theC2, const Standard_Real theC3, + const Quantity_TypeOfColor theType) +{ + SetValues (theC1, theC2, theC3, theType); } -Quantity_Color::Quantity_Color (const Quantity_NameOfColor AName) { - - Quantity_Color::ValuesOf - (AName, Quantity_TOC_RGB, MyRed, MyGreen, MyBlue); -} - -Quantity_Color::Quantity_Color (const Standard_Real R1, const Standard_Real R2, const Standard_Real R3, const Quantity_TypeOfColor AType) { - - switch (AType) { - - case Quantity_TOC_RGB : - if ( R1 < 0. || R1 > 1. || - R2 < 0. || R2 > 1. || - R3 < 0. || R3 > 1. ) - throw Standard_OutOfRange("Color out"); - MyRed = Standard_ShortReal (R1); - MyGreen = Standard_ShortReal (R2); - MyBlue = Standard_ShortReal (R3); - break; - - case Quantity_TOC_HLS : - if ( (R1 < 0. && R1 != RGBHLS_H_UNDEFINED && R3 != 0.0) - || (R1 > 360.) || - R2 < 0. || R2 > 1. || - R3 < 0. || R3 > 1. ) - throw Standard_OutOfRange("Color out"); - Quantity_Color::hlsrgb - (Standard_ShortReal (R1), - Standard_ShortReal (R2), - Standard_ShortReal (R3), - MyRed, MyGreen, MyBlue); - break; - } - +// ======================================================================= +// function : Quantity_Color +// purpose : +// ======================================================================= +Quantity_Color::Quantity_Color (const NCollection_Vec3& theRgb) +: myRgb (theRgb) +{ + Quantity_ColorValidateRgbRange(theRgb.r(), theRgb.g(), theRgb.b()); } -Quantity_Color::Quantity_Color (const NCollection_Vec3& theRgb) -: MyRed (theRgb.r()), - MyGreen(theRgb.g()), - MyBlue (theRgb.b()) -{ - if (theRgb.r() < 0.0f || theRgb.r() > 1.0f - || theRgb.g() < 0.0f || theRgb.g() > 1.0f - || theRgb.b() < 0.0f || theRgb.b() > 1.0f) +// ======================================================================= +// function : ChangeContrast +// purpose : +// ======================================================================= +void Quantity_Color::ChangeContrast (const Standard_Real theDelta) +{ + NCollection_Vec3 aHls = Convert_LinearRGB_To_HLS (myRgb); + aHls[2] += aHls[2] * Standard_ShortReal (theDelta) / 100.0f; // saturation + if (!((aHls[2] > 1.0f) || (aHls[2] < 0.0f))) { - throw Standard_OutOfRange("Color out"); + myRgb = Convert_HLS_To_LinearRGB (aHls); } } -void Quantity_Color::ChangeContrast (const Standard_Real ADelta) { - -Standard_ShortReal MyHue, MyLight, MySaturation; - - Quantity_Color::rgbhls - (MyRed, MyGreen, MyBlue, MyHue, MyLight, MySaturation); - - MySaturation += MySaturation * Standard_ShortReal (ADelta) / (float ) 100.0; - - if ( !((MySaturation > 1.0) || (MySaturation < 0.0) )) { - Quantity_Color::hlsrgb - (MyHue, MyLight, MySaturation, MyRed, MyGreen, MyBlue); - } -} - -void Quantity_Color::ChangeIntensity (const Standard_Real ADelta) { - -Standard_ShortReal MyHue, MyLight, MySaturation; - - Quantity_Color::rgbhls - (MyRed, MyGreen, MyBlue, MyHue, MyLight, MySaturation); - - - MyLight += MyLight * Standard_ShortReal (ADelta) / (float ) 100.0; - if ( !((MyLight > 1.0) || (MyLight < 0.0) )) { - Quantity_Color::hlsrgb - (MyHue, MyLight, MySaturation, MyRed, MyGreen, MyBlue); - } - -} - -void Quantity_Color::SetValues (const Quantity_NameOfColor AName) { - - Quantity_Color::ValuesOf - (AName, Quantity_TOC_RGB, MyRed, MyGreen, MyBlue); - -} - -void Quantity_Color::SetValues (const Standard_Real R1, const Standard_Real R2, const Standard_Real R3, const Quantity_TypeOfColor AType) { - - switch (AType) { - - case Quantity_TOC_RGB : - if ( R1 < 0. || R1 > 1. || - R2 < 0. || R2 > 1. || - R3 < 0. || R3 > 1. ) - throw Standard_OutOfRange("Color out"); - else { - MyRed = Standard_ShortReal (R1); - MyGreen = Standard_ShortReal (R2); - MyBlue = Standard_ShortReal (R3); - } - break; - - case Quantity_TOC_HLS : - if ( R1 < 0. || R1 > 360. || - R2 < 0. || R2 > 1. || - R3 < 0. || R3 > 1. ) - throw Standard_OutOfRange("Color out"); - else { - Quantity_Color::hlsrgb - (Standard_ShortReal (R1), - Standard_ShortReal (R2), - Standard_ShortReal (R3), - MyRed, MyGreen, MyBlue); - } - break; - } - -} - -Standard_Real Quantity_Color::Distance (const Quantity_Color& AColor) const { - -Standard_Real R1, G1, B1; -Standard_Real R2, G2, B2; - - R1 = Standard_Real (MyRed); - G1 = Standard_Real (MyGreen); - B1 = Standard_Real (MyBlue); - - R2 = Standard_Real (AColor.MyRed); - G2 = Standard_Real (AColor.MyGreen); - B2 = Standard_Real (AColor.MyBlue); - - return Sqrt ( - ((R1 - R2) * (R1 - R2)) + - ((G1 - G2) * (G1 - G2)) + - ((B1 - B2) * (B1 - B2)) - ); - -} - -Standard_Real Quantity_Color::SquareDistance (const Quantity_Color& AColor) const { - -Standard_Real R1, G1, B1; -Standard_Real R2, G2, B2; - - R1 = Standard_Real (MyRed); - G1 = Standard_Real (MyGreen); - B1 = Standard_Real (MyBlue); - - R2 = Standard_Real (AColor.MyRed); - G2 = Standard_Real (AColor.MyGreen); - B2 = Standard_Real (AColor.MyBlue); - - return ( - ((R1 - R2) * (R1 - R2)) + - ((G1 - G2) * (G1 - G2)) + - ((B1 - B2) * (B1 - B2)) - ); - -} - -void Quantity_Color::Delta (const Quantity_Color& AColor, Standard_Real& DC, Standard_Real& DI) const { - -Standard_ShortReal MyHue, MyLight, MySaturation; - - Quantity_Color::rgbhls - (MyRed, MyGreen, MyBlue, MyHue, MyLight, MySaturation); - - DC = Standard_Real (MySaturation - AColor.Saturation ()); - DI = Standard_Real (MyLight - AColor.Light ()); - -} - -Standard_Boolean Quantity_Color::IsDifferent (const Quantity_Color& Other) const { - - return (Distance (Other) > Epsilon ()); - -} - -Standard_Boolean Quantity_Color::IsEqual (const Quantity_Color& Other) const { - - return (Distance (Other) <= Epsilon ()); - -} - -Quantity_NameOfColor Quantity_Color::Name () const { - -Quantity_NameOfColor MyNewName = Quantity_NOC_BLACK; // Nom courant. -Quantity_Color Col; // Couleur courante. -Standard_Real NewDist = 4.0; // Distance courante. -Standard_Real Dist = 4.0; // Distance la plus courte. - -Standard_Integer Begin, End, Current; - - // - // Parcours de l'enumeration - // - Begin = Standard_Integer (Quantity_NOC_BLACK); - End = Standard_Integer (Quantity_NOC_WHITE); - - for (Current = Begin; - ((Current <= End) && (NewDist != 0.0)); Current++) { - - Col.SetValues (Quantity_NameOfColor (Current)); - NewDist = - ((MyRed - Col.MyRed) * (MyRed - Col.MyRed)) + - ((MyGreen - Col.MyGreen) * (MyGreen - Col.MyGreen)) + - ((MyBlue - Col.MyBlue) * (MyBlue - Col.MyBlue)); - - if (NewDist < Dist) { - MyNewName = Quantity_NameOfColor (Current); - Dist = NewDist; - } - } // Fin de boucle for - - return (MyNewName); - -} - -Standard_Real Quantity_Color::Epsilon() +// ======================================================================= +// function : ChangeIntensity +// purpose : +// ======================================================================= +void Quantity_Color::ChangeIntensity (const Standard_Real theDelta) { - return TheEpsilon; + NCollection_Vec3 aHls = Convert_LinearRGB_To_HLS (myRgb); + aHls[1] += aHls[1] * Standard_ShortReal (theDelta) / 100.0f; // light + if (!((aHls[1] > 1.0f) || (aHls[1] < 0.0f))) + { + myRgb = Convert_HLS_To_LinearRGB (aHls); + } } -void Quantity_Color::SetEpsilon (const Standard_Real AnEpsilon) { - - TheEpsilon = AnEpsilon; - +// ======================================================================= +// function : SetValues +// purpose : +// ======================================================================= +void Quantity_Color::SetValues (const Standard_Real theC1, const Standard_Real theC2, const Standard_Real theC3, + const Quantity_TypeOfColor theType) +{ + switch (theType) + { + case Quantity_TOC_RGB: + { + Quantity_ColorValidateRgbRange(theC1, theC2, theC3); + myRgb.SetValues (float(theC1), float(theC2), float(theC3)); + break; + } + case Quantity_TOC_sRGB: + { + Quantity_ColorValidateRgbRange(theC1, theC2, theC3); + myRgb.SetValues ((float )Convert_sRGB_To_LinearRGB (theC1), + (float )Convert_sRGB_To_LinearRGB (theC2), + (float )Convert_sRGB_To_LinearRGB (theC3)); + break; + } + case Quantity_TOC_HLS: + { + Quantity_ColorValidateHlsRange(theC1, theC2, theC3); + myRgb = Convert_HLS_To_LinearRGB (NCollection_Vec3 (float(theC1), float(theC2), float(theC3))); + break; + } + case Quantity_TOC_CIELab: + { + Quantity_ColorValidateLabRange(theC1, theC2, theC3); + myRgb = Convert_Lab_To_LinearRGB (NCollection_Vec3 (float(theC1), float(theC2), float(theC3))); + break; + } + case Quantity_TOC_CIELch: + { + Quantity_ColorValidateLchRange(theC1, theC2, theC3); + myRgb = Convert_Lab_To_LinearRGB (Convert_Lch_To_Lab (NCollection_Vec3 (float(theC1), float(theC2), float(theC3)))); + break; + } + } } -Quantity_NameOfColor Quantity_Color::Name (const Standard_Real R, const Standard_Real G, const Standard_Real B) { - - if ( R < 0. || R > 1. || - G < 0. || G > 1. || - B < 0. || B > 1. ) - throw Standard_OutOfRange("Color out"); - -Quantity_Color AColor (R, G, B, Quantity_TOC_RGB); // Couleur definie en RGB. - - return (AColor.Name ()); - +// ======================================================================= +// function : Delta +// purpose : +// ======================================================================= +void Quantity_Color::Delta (const Quantity_Color& theColor, + Standard_Real& theDC, + Standard_Real& theDI) const +{ + const NCollection_Vec3 aHls1 = Convert_LinearRGB_To_HLS (myRgb); + const NCollection_Vec3 aHls2 = Convert_LinearRGB_To_HLS (theColor.myRgb); + theDC = Standard_Real (aHls1[2] - aHls2[2]); // saturation + theDI = Standard_Real (aHls1[1] - aHls2[1]); // light } -Standard_Real Quantity_Color::Red () const { - - return (Standard_Real (MyRed)); +// ======================================================================= +// function : DeltaE2000 +// purpose : color difference according to CIE Delta E 2000 formula +// see http://brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html +// ======================================================================= +Standard_Real Quantity_Color::DeltaE2000 (const Quantity_Color& theOther) const +{ + // get color components in CIE Lch space + Standard_Real aL1, aL2, aa1, aa2, ab1, ab2; + this ->Values (aL1, aa1, ab1, Quantity_TOC_CIELab); + theOther.Values (aL2, aa2, ab2, Quantity_TOC_CIELab); + + // mean L + Standard_Real aLx_mean = 0.5 * (aL1 + aL2); + + // mean C + Standard_Real aC1 = Sqrt (aa1 * aa1 + ab1 * ab1); + Standard_Real aC2 = Sqrt (aa2 * aa2 + ab2 * ab2); + Standard_Real aC_mean = 0.5 * (aC1 + aC2); + Standard_Real aC_mean_pow7 = Pow (aC_mean, 7); + static const double a25_pow7 = Pow (25., 7); + Standard_Real aG = 0.5 * (1. - Sqrt (aC_mean_pow7 / (aC_mean_pow7 + a25_pow7))); + Standard_Real aa1x = aa1 * (1. + aG); + Standard_Real aa2x = aa2 * (1. + aG); + Standard_Real aC1x = Sqrt (aa1x * aa1x + ab1 * ab1); + Standard_Real aC2x = Sqrt (aa2x * aa2x + ab2 * ab2); + Standard_Real aCx_mean = 0.5 * (aC1x + aC2x); + + // mean H + Standard_Real ah1x = (aC1x > TheEpsilon ? ATan2 (ab1, aa1x) * 180. / M_PI : 270.); + Standard_Real ah2x = (aC2x > TheEpsilon ? ATan2 (ab2, aa2x) * 180. / M_PI : 270.); + if (ah1x < 0.) ah1x += 360.; + if (ah2x < 0.) ah2x += 360.; + Standard_Real aHx_mean = 0.5 * (ah1x + ah2x); + Standard_Real aDeltahx = ah2x - ah1x; + if (Abs (aDeltahx) > 180.) + { + aHx_mean += (aHx_mean < 180. ? 180. : -180.); + aDeltahx += (ah1x >= ah2x ? 360. : -360.); + } + // deltas + Standard_Real aDeltaLx = aL2 - aL1; + Standard_Real aDeltaCx = aC2x - aC1x; + Standard_Real aDeltaHx = 2. * Sqrt (aC1x * aC2x) * Sin (0.5 * aDeltahx * M_PI / 180.); + + // factors + Standard_Real aT = 1. - 0.17 * Cos (( aHx_mean - 30.) * M_PI / 180.) + + 0.24 * Cos ((2. * aHx_mean ) * M_PI / 180.) + + 0.32 * Cos ((3. * aHx_mean + 6.) * M_PI / 180.) - + 0.20 * Cos ((4. * aHx_mean - 63.) * M_PI / 180.); + + Standard_Real aLx_mean50_2 = (aLx_mean - 50.) * (aLx_mean - 50.); + Standard_Real aS_L = 1. + 0.015 * aLx_mean50_2 / Sqrt (20. + aLx_mean50_2); + Standard_Real aS_C = 1. + 0.045 * aCx_mean; + Standard_Real aS_H = 1. + 0.015 * aCx_mean * aT; + + Standard_Real aDelta_theta = 30. * Exp (-(aHx_mean - 275.) * (aHx_mean - 275.) / 625.); + Standard_Real aCx_mean_pow7 = Pow(aCx_mean, 7); + Standard_Real aR_C = 2. * Sqrt (aCx_mean_pow7 / (aCx_mean_pow7 + a25_pow7)); + Standard_Real aR_T = -aR_C * Sin (2. * aDelta_theta * M_PI / 180.); + + // finally, the difference + Standard_Real aDL = aDeltaLx / aS_L; + Standard_Real aDC = aDeltaCx / aS_C; + Standard_Real aDH = aDeltaHx / aS_H; + Standard_Real aDeltaE2000 = Sqrt (aDL * aDL + aDC * aDC + aDH * aDH + aR_T * aDC * aDH); + return aDeltaE2000; } -Standard_Real Quantity_Color::Green () const { - - return (Standard_Real (MyGreen)); - +// ======================================================================= +// function : Name +// purpose : +// ======================================================================= +Quantity_NameOfColor Quantity_Color::Name() const +{ + // it is better finding closest sRGB color (closest to human eye) instead of linear RGB color, + // as enumeration defines color names for human + const NCollection_Vec3 ansRgbVec (Convert_LinearRGB_To_sRGB (NCollection_Vec3 (myRgb))); + Standard_ShortReal aDist2 = ShortRealLast(); + Quantity_NameOfColor aResName = Quantity_NOC_BLACK; + for (Standard_Integer aColIter = Quantity_NOC_BLACK; aColIter <= Quantity_NOC_WHITE; ++aColIter) + { + const Standard_ShortReal aNewDist2 = (ansRgbVec - THE_COLORS[aColIter].sRgbValues).SquareModulus(); + if (aNewDist2 < aDist2) + { + aResName = Quantity_NameOfColor (aColIter); + aDist2 = aNewDist2; + if (aNewDist2 == 0.0f) + { + break; + } + } + } + return aResName; } -Standard_Real Quantity_Color::Blue () const { - - return (Standard_Real (MyBlue)); - +// ======================================================================= +// function : Values +// purpose : +// ======================================================================= +void Quantity_Color::Values (Standard_Real& theR1, Standard_Real& theR2, Standard_Real& theR3, + const Quantity_TypeOfColor theType) const +{ + switch (theType) + { + case Quantity_TOC_RGB: + { + theR1 = myRgb.r(); + theR2 = myRgb.g(); + theR3 = myRgb.b(); + break; + } + case Quantity_TOC_sRGB: + { + theR1 = Convert_LinearRGB_To_sRGB ((Standard_Real )myRgb.r()); + theR2 = Convert_LinearRGB_To_sRGB ((Standard_Real )myRgb.g()); + theR3 = Convert_LinearRGB_To_sRGB ((Standard_Real )myRgb.b()); + break; + } + case Quantity_TOC_HLS: + { + const NCollection_Vec3 aHls = Convert_LinearRGB_To_HLS (myRgb); + theR1 = aHls[0]; + theR2 = aHls[1]; + theR3 = aHls[2]; + break; + } + case Quantity_TOC_CIELab: + { + const NCollection_Vec3 aLab = Convert_LinearRGB_To_Lab (myRgb); + theR1 = aLab[0]; + theR2 = aLab[1]; + theR3 = aLab[2]; + break; + } + case Quantity_TOC_CIELch: + { + const NCollection_Vec3 aLch = Convert_Lab_To_Lch (Convert_LinearRGB_To_Lab (myRgb)); + theR1 = aLch[0]; + theR2 = aLch[1]; + theR3 = aLch[2]; + break; + } + } } -Standard_Real Quantity_Color::Hue () const { - -Standard_ShortReal MyHue, MyLight, MySaturation; - - Quantity_Color::rgbhls - (MyRed, MyGreen, MyBlue, MyHue, MyLight, MySaturation); +// ======================================================================= +// function : Convert_HLS_To_sRGB +// purpose : Reference: La synthese d'images, Collection Hermes +// ======================================================================= +NCollection_Vec3 Quantity_Color::Convert_HLS_To_sRGB (const NCollection_Vec3& theHls) +{ + float aHue = theHls[0]; + const float aLight = theHls[1]; + const float aSaturation = theHls[2]; + if (aSaturation == 0.0f + && aHue == RGBHLS_H_UNDEFINED) + { + return NCollection_Vec3 (aLight, aLight, aLight); + } - return (Standard_Real (MyHue)); + int aHueIndex = 0; + float lmuls = aLight * aSaturation; + if (aHue == 360.0f) + { + aHue = 0.0; + aHueIndex = 0; + } + else + { + aHue /= 60.0f; + aHueIndex = (int )aHue; + } + switch (aHueIndex) + { + case 0: return NCollection_Vec3 (aLight, + aLight - lmuls + lmuls * aHue, + aLight - lmuls); + case 1: return NCollection_Vec3 (aLight + lmuls - lmuls * aHue, + aLight, + aLight - lmuls); + case 2: return NCollection_Vec3 (aLight - lmuls, + aLight, + aLight - 3 * lmuls + lmuls * aHue); + case 3: return NCollection_Vec3 (aLight - lmuls, + aLight + 3 * lmuls - lmuls * aHue, + aLight); + case 4: return NCollection_Vec3 (aLight - 5 * lmuls + lmuls * aHue, + aLight - lmuls, + aLight); + case 5 : return NCollection_Vec3 (aLight, + aLight - lmuls, + aLight + 5 * lmuls - lmuls * aHue); + } + throw Standard_OutOfRange("Color out"); } -Standard_Real Quantity_Color::Light () const { - -Standard_ShortReal MyHue, MyLight, MySaturation; - - Quantity_Color::rgbhls - (MyRed, MyGreen, MyBlue, MyHue, MyLight, MySaturation); - - return (Standard_Real (MyLight)); +// ======================================================================= +// function : Convert_sRGB_To_HLS +// purpose : Reference: La synthese d'images, Collection Hermes +// ======================================================================= +NCollection_Vec3 Quantity_Color::Convert_sRGB_To_HLS (const NCollection_Vec3& theRgb) +{ + float aPlus = 0.0f; + float aDiff = theRgb.g() - theRgb.b(); + // compute maximum from RGB components, which will be a luminance + float aMax = theRgb.r(); + if (theRgb.g() > aMax) { aPlus = 2.0; aDiff = theRgb.b() - theRgb.r(); aMax = theRgb.g(); } + if (theRgb.b() > aMax) { aPlus = 4.0; aDiff = theRgb.r() - theRgb.g(); aMax = theRgb.b(); } + + // compute minimum from RGB components + float min = theRgb.r(); + if (theRgb.g() < min) min = theRgb.g(); + if (theRgb.b() < min) min = theRgb.b(); + + const float aDelta = aMax - min; + + // compute saturation + float aSaturation = 0.0f; + if (aMax != 0.0f) aSaturation = aDelta / aMax; + + // compute hue + float aHue = RGBHLS_H_UNDEFINED; + if (aSaturation != 0.0f) + { + aHue = 60.0f * (aPlus + aDiff / aDelta); + if (aHue < 0.0f) aHue += 360.0f; + } + return NCollection_Vec3 (aHue, aMax, aSaturation); } -Standard_Real Quantity_Color::Saturation () const { - -Standard_ShortReal MyHue, MyLight, MySaturation; - - Quantity_Color::rgbhls - (MyRed, MyGreen, MyBlue, MyHue, MyLight, MySaturation); - - return (Standard_Real (MySaturation)); - +// ======================================================================= +// function : CIELab_f +// purpose : non-linear function transforming XYZ coordinates to CIE Lab +// see http://www.brucelindbloom.com/index.html?Equations.html +// ======================================================================= +static inline double CIELab_f (double theValue) +{ + return theValue > 0.008856451679035631 ? Pow (theValue, 1./3.) : (7.787037037037037 * theValue) + 16. / 116.; } -void Quantity_Color::Values (Standard_Real& R1, Standard_Real& R2, Standard_Real& R3, const Quantity_TypeOfColor AType) const { - - - switch (AType) { - - case Quantity_TOC_RGB : - R1 = Standard_Real (MyRed); - R2 = Standard_Real (MyGreen); - R3 = Standard_Real (MyBlue); - break; - - case Quantity_TOC_HLS : - { Standard_ShortReal MyHue, MyLight, MySaturation; - - Quantity_Color::rgbhls - (MyRed, MyGreen, MyBlue, MyHue, MyLight, MySaturation); - - R1 = Standard_Real (MyHue); - R2 = Standard_Real (MyLight); - R3 = Standard_Real (MySaturation); - } - break; - } - +// ======================================================================= +// function : CIELab_invertf +// purpose : inverse of non-linear function transforming XYZ coordinates to CIE Lab +// see http://www.brucelindbloom.com/index.html?Equations.html +// ======================================================================= +static inline double CIELab_invertf (double theValue) +{ + double aV3 = theValue * theValue * theValue; + return aV3 > 0.008856451679035631 ? aV3 : (theValue - 16. / 116.) / 7.787037037037037; } -void Quantity_Color::RgbHls (const Standard_Real R, const Standard_Real G, const Standard_Real B, Standard_Real& H, Standard_Real& L, Standard_Real& S) { - -Standard_ShortReal HH, LL, SS; - - call_rgbhls (Standard_ShortReal (R), - Standard_ShortReal (G), - Standard_ShortReal (B), - HH, LL, SS); - - H = Standard_Real (HH); - L = Standard_Real (LL); - S = Standard_Real (SS); +// ======================================================================= +// function : Convert_LinearRGB_To_Lab +// purpose : convert RGB color to CIE Lab color +// see https://www.easyrgb.com/en/math.php +// ======================================================================= +NCollection_Vec3 Quantity_Color::Convert_LinearRGB_To_Lab (const NCollection_Vec3& theRgb) +{ + double aR = theRgb[0]; + double aG = theRgb[1]; + double aB = theRgb[2]; + + // convert to XYZ normalized to D65 / 2 deg (CIE 1931) standard illuminant intensities + // see http://www.brucelindbloom.com/index.html?Equations.html + double aX = (aR * 0.4124564 + aG * 0.3575761 + aB * 0.1804375) * 100. / 95.047; + double aY = (aR * 0.2126729 + aG * 0.7151522 + aB * 0.0721750) * 100. / 100.000; + double aZ = (aR * 0.0193339 + aG * 0.1191920 + aB * 0.9503041) * 100. / 108.883; + + // convert to Lab + double afX = CIELab_f (aX); + double afY = CIELab_f (aY); + double afZ = CIELab_f (aZ); + + double aL = 116. * afY - 16.; + double aa = 500. * (afX - afY); + double ab = 200. * (afY - afZ); + + return NCollection_Vec3 ((float)aL, (float)aa, (float)ab); +} + +// ======================================================================= +// function : Convert_Lab_To_LinearRGB +// purpose : convert CIE Lab color to RGB +// see https://www.easyrgb.com/en/math.php +// ======================================================================= +NCollection_Vec3 Quantity_Color::Convert_Lab_To_LinearRGB (const NCollection_Vec3& theLab) +{ + double aL = theLab[0]; + double aa = theLab[1]; + double ab = theLab[2]; + + // conversion from Lab to RGB can yield point outside of RGB cube, + // in such case we will reduce a and b components gradually + // (by 0.1% at each step) until we fit into the range; + // NB: the procedure could be improved to get more precise + // result but this does not seem really crucial + const int NBSTEPS = 1000; + for (Standard_Integer aRate = NBSTEPS; ; aRate--) + { + double aC = aRate / (double)NBSTEPS; + // convert to XYZ for D65 / 2 deg (CIE 1931) standard illuminant + double afY = (aL + 16.) / 116.; + double afX = aC * aa / 500. + afY; + double afZ = afY - aC * ab / 200.; + + double aX = CIELab_invertf(afX) * 95.047; + double aY = CIELab_invertf(afY) * 100.000; + double aZ = CIELab_invertf(afZ) * 108.883; + + // convert to RGB + // see http://www.brucelindbloom.com/index.html?Equations.html + double aR = (aX * 3.2404542 + aY * -1.5371385 + aZ * -0.4985314) / 100.; + double aG = (aX * -0.9692660 + aY * 1.8760108 + aZ * 0.0415560) / 100.; + double aB = (aX * 0.0556434 + aY * -0.2040259 + aZ * 1.0572252) / 100.; + + // exit if we are in range or at zero C + if (aRate == 0 || + (aR >= 0. && aR <= 1. && aG >= 0. && aG <= 1. && aB >= 0. && aB <= 1.)) + { + return NCollection_Vec3((float)aR, (float)aG, (float)aB); + } + } } -void Quantity_Color::HlsRgb (const Standard_Real H, const Standard_Real L, const Standard_Real S, Standard_Real& R, Standard_Real& G, Standard_Real& B) { - -Standard_ShortReal RR, GG, BB; +// ======================================================================= +// function : Convert_Lab_To_Lch +// purpose : convert CIE Lab color to CIE Lch color +// see https://www.easyrgb.com/en/math.php +// ======================================================================= +NCollection_Vec3 Quantity_Color::Convert_Lab_To_Lch (const NCollection_Vec3& theLab) +{ + double aa = theLab[1]; + double ab = theLab[2]; - call_hlsrgb (Standard_ShortReal (H), - Standard_ShortReal (L), - Standard_ShortReal (S), - RR, GG, BB); + double aC = Sqrt (aa * aa + ab * ab); + double aH = (aC > TheEpsilon ? ATan2 (ab, aa) * 180. / M_PI : 0.); - R = Standard_Real (RR); - G = Standard_Real (GG); - B = Standard_Real (BB); + if (aH < 0.) aH += 360.; + return NCollection_Vec3 (theLab[0], (float)aC, (float)aH); } -void Quantity_Color::rgbhls (const Standard_ShortReal R, const Standard_ShortReal G, const Standard_ShortReal B, Standard_ShortReal& H, Standard_ShortReal& L, Standard_ShortReal& S) { - - call_rgbhls (R, G, B, H, L, S); - -} +// ======================================================================= +// function : Convert_Lch_To_Lab +// purpose : convert CIE Lch color to CIE Lab color +// see https://www.easyrgb.com/en/math.php +// ======================================================================= +NCollection_Vec3 Quantity_Color::Convert_Lch_To_Lab (const NCollection_Vec3& theLch) +{ + double aC = theLch[1]; + double aH = theLch[2]; -void Quantity_Color::hlsrgb (const Standard_ShortReal H, const Standard_ShortReal L, const Standard_ShortReal S, Standard_ShortReal& R, Standard_ShortReal& G, Standard_ShortReal& B) { + aH *= M_PI / 180.; - call_hlsrgb (H, L, S, R, G, B); + double aa = aC * Cos (aH); + double ab = aC * Sin (aH); + return NCollection_Vec3 (theLch[0], (float)aa, (float)ab); } //======================================================================= -//function : Color2argb +//function : DumpJson //purpose : //======================================================================= - -void Quantity_Color::Color2argb (const Quantity_Color& theColor, - Standard_Integer& theARGB) +void Quantity_Color::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - const Standard_Integer aColor[3] = { - static_cast (255 * theColor.MyRed), - static_cast (255 * theColor.MyGreen), - static_cast (255 * theColor.MyBlue) - }; - theARGB = (((aColor[0] & 0xff) << 16) | - ((aColor[1] & 0xff) << 8) | - (aColor[2] & 0xff)); + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "RGB", 3, myRgb.r(), myRgb.g(), myRgb.b()) } //======================================================================= -//function : Argb2color +//function : InitFromJson //purpose : //======================================================================= - -void Quantity_Color::Argb2color (const Standard_Integer theARGB, - Quantity_Color& theColor) +Standard_Boolean Quantity_Color::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) { - const Standard_Real aColor[3] = { - static_cast ((theARGB & 0xff0000) >> 16), - static_cast ((theARGB & 0x00ff00) >> 8), - static_cast ((theARGB & 0x0000ff)) - }; - theColor.SetValues(aColor[0] / 255.0, aColor[1] / 255.0, aColor[2] / 255.0, - Quantity_TOC_RGB); -} - -void Quantity_Color::ValuesOf (const Quantity_NameOfColor AName, const Quantity_TypeOfColor AType, Standard_ShortReal& R1, Standard_ShortReal& R2, Standard_ShortReal& R3) { + Standard_Integer aPos = theStreamPos; + Standard_Real aRed, aGreen, aBlue; + OCCT_INIT_VECTOR_CLASS (Standard_Dump::Text (theSStream), "RGB", aPos, 3, &aRed, &aGreen, &aBlue) -Standard_ShortReal RR = 0 ; -Standard_ShortReal RG = 0 ; -Standard_ShortReal RB = 0 ; - -switch (AName) { - - case Quantity_NOC_BLACK : - RR = R1 = 0.000000; RG = R2 = 0.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_MATRAGRAY : - RR = R1 = (float ) 0.600000; RG = R2 = (float ) 0.600000; RB = R3 = (float ) 0.600000; - break; - case Quantity_NOC_MATRABLUE : - RR = R1 = 0.000000; RG = R2 = 0.000000; RB = R3 = 0.750000; - break; - case Quantity_NOC_ALICEBLUE : - RR = R1 = (float ) 0.941176; RG = R2 = (float ) 0.972549; RB = R3 = 1.000000; - break; - case Quantity_NOC_ANTIQUEWHITE : - RR = R1 = (float ) 0.980392; RG = R2 = (float ) 0.921569; RB = R3 = (float ) 0.843137; - break; - case Quantity_NOC_ANTIQUEWHITE1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.937255; RB = R3 = (float ) 0.858824; - break; - case Quantity_NOC_ANTIQUEWHITE2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.874510; RB = R3 = (float ) 0.800000; - break; - case Quantity_NOC_ANTIQUEWHITE3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.752941; RB = R3 = (float ) 0.690196; - break; - case Quantity_NOC_ANTIQUEWHITE4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.513725; RB = R3 = (float ) 0.470588; - break; - case Quantity_NOC_AQUAMARINE1 : - RR = R1 = (float ) 0.498039; RG = R2 = 1.000000; RB = R3 = (float ) 0.831373; - break; - case Quantity_NOC_AQUAMARINE2 : - RR = R1 = (float ) 0.462745; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.776471; - break; - case Quantity_NOC_AQUAMARINE4 : - RR = R1 = (float ) 0.270588; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.454902; - break; - case Quantity_NOC_AZURE : - RR = R1 = (float ) 0.941176; RG = R2 = 1.000000; RB = R3 = 1.000000; - break; - case Quantity_NOC_AZURE2 : - RR = R1 = (float ) 0.878431; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_AZURE3 : - RR = R1 = (float ) 0.756863; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_AZURE4 : - RR = R1 = (float ) 0.513725; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_BEIGE : - RR = R1 = (float ) 0.960784; RG = R2 = (float ) 0.960784; RB = R3 = (float ) 0.862745; - break; - case Quantity_NOC_BISQUE : - RR = R1 = 1.000000; RG = R2 = (float ) 0.894118; RB = R3 = (float ) 0.768627; - break; - case Quantity_NOC_BISQUE2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.835294; RB = R3 = (float ) 0.717647; - break; - case Quantity_NOC_BISQUE3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.717647; RB = R3 = (float ) 0.619608; - break; - case Quantity_NOC_BISQUE4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.490196; RB = R3 = (float ) 0.419608; - break; - case Quantity_NOC_BLANCHEDALMOND : - RR = R1 = 1.000000; RG = R2 = (float ) 0.921569; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_BLUE1 : - RR = R1 = 0.000000; RG = R2 = 0.000000; RB = R3 = 1.000000; - break; - case Quantity_NOC_BLUE2 : - RR = R1 = 0.000000; RG = R2 = 0.000000; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_BLUE3 : - RR = R1 = 0.000000; RG = R2 = 0.000000; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_BLUE4 : - RR = R1 = 0.000000; RG = R2 = 0.000000; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_BLUEVIOLET : - RR = R1 = (float ) 0.541176; RG = R2 = (float ) 0.168627; RB = R3 = (float ) 0.886275; - break; - case Quantity_NOC_BROWN : - RR = R1 = (float ) 0.647059; RG = R2 = (float ) 0.164706; RB = R3 = (float ) 0.164706; - break; - case Quantity_NOC_BROWN1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.250980; RB = R3 = (float ) 0.250980; - break; - case Quantity_NOC_BROWN2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.231373; RB = R3 = (float ) 0.231373; - break; - case Quantity_NOC_BROWN3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.200000; RB = R3 = (float ) 0.200000; - break; - case Quantity_NOC_BROWN4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.137255; RB = R3 = (float ) 0.137255; - break; - case Quantity_NOC_BURLYWOOD : - RR = R1 = (float ) 0.870588; RG = R2 = (float ) 0.721569; RB = R3 = (float ) 0.529412; - break; - case Quantity_NOC_BURLYWOOD1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.827451; RB = R3 = (float ) 0.607843; - break; - case Quantity_NOC_BURLYWOOD2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.772549; RB = R3 = (float ) 0.568627; - break; - case Quantity_NOC_BURLYWOOD3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.666667; RB = R3 = (float ) 0.490196; - break; - case Quantity_NOC_BURLYWOOD4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.450980; RB = R3 = (float ) 0.333333; - break; - case Quantity_NOC_CADETBLUE : - RR = R1 = (float ) 0.372549; RG = R2 = (float ) 0.619608; RB = R3 = (float ) 0.627451; - break; - case Quantity_NOC_CADETBLUE1 : - RR = R1 = (float ) 0.596078; RG = R2 = (float ) 0.960784; RB = R3 = 1.000000; - break; - case Quantity_NOC_CADETBLUE2 : - RR = R1 = (float ) 0.556863; RG = R2 = (float ) 0.898039; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_CADETBLUE3 : - RR = R1 = (float ) 0.478431; RG = R2 = (float ) 0.772549; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_CADETBLUE4 : - RR = R1 = (float ) 0.325490; RG = R2 = (float ) 0.525490; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_CHARTREUSE : - RR = R1 = (float ) 0.498039; RG = R2 = 1.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_CHARTREUSE1 : - RR = R1 = (float ) 0.498039; RG = R2 = 1.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_CHARTREUSE2 : - RR = R1 = (float ) 0.462745; RG = R2 = (float ) 0.933333; RB = R3 = 0.000000; - break; - case Quantity_NOC_CHARTREUSE3 : - RR = R1 = (float ) 0.400000; RG = R2 = (float ) 0.803922; RB = R3 = 0.000000; - break; - case Quantity_NOC_CHARTREUSE4 : - RR = R1 = (float ) 0.270588; RG = R2 = (float ) 0.545098; RB = R3 = 0.000000; - break; - case Quantity_NOC_CHOCOLATE : - RR = R1 = (float ) 0.823529; RG = R2 = (float ) 0.411765; RB = R3 = (float ) 0.117647; - break; - case Quantity_NOC_CHOCOLATE1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.498039; RB = R3 = (float ) 0.141176; - break; - case Quantity_NOC_CHOCOLATE2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.462745; RB = R3 = (float ) 0.129412; - break; - case Quantity_NOC_CHOCOLATE3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.400000; RB = R3 = (float ) 0.113725; - break; - case Quantity_NOC_CHOCOLATE4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.270588; RB = R3 = (float ) 0.074510; - break; - case Quantity_NOC_CORAL : - RR = R1 = 1.000000; RG = R2 = (float ) 0.498039; RB = R3 = (float ) 0.313725; - break; - case Quantity_NOC_CORAL1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.447059; RB = R3 = (float ) 0.337255; - break; - case Quantity_NOC_CORAL2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.415686; RB = R3 = (float ) 0.313725; - break; - case Quantity_NOC_CORAL3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.356863; RB = R3 = (float ) 0.270588; - break; - case Quantity_NOC_CORAL4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.243137; RB = R3 = (float ) 0.184314; - break; - case Quantity_NOC_CORNFLOWERBLUE : - RR = R1 = (float ) 0.392157; RG = R2 = (float ) 0.584314; RB = R3 = (float ) 0.929412; - break; - case Quantity_NOC_CORNSILK1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.972549; RB = R3 = (float ) 0.862745; - break; - case Quantity_NOC_CORNSILK2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.909804; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_CORNSILK3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.784314; RB = R3 = (float ) 0.694118; - break; - case Quantity_NOC_CORNSILK4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.533333; RB = R3 = (float ) 0.470588; - break; - case Quantity_NOC_CYAN1 : - RR = R1 = 0.000000; RG = R2 = 1.000000; RB = R3 = 1.000000; - break; - case Quantity_NOC_CYAN2 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_CYAN3 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_CYAN4 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_DARKGOLDENROD : - RR = R1 = (float ) 0.721569; RG = R2 = (float ) 0.525490; RB = R3 = (float ) 0.043137; - break; - case Quantity_NOC_DARKGOLDENROD1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.725490; RB = R3 = (float ) 0.058824; - break; - case Quantity_NOC_DARKGOLDENROD2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.678431; RB = R3 = (float ) 0.054902; - break; - case Quantity_NOC_DARKGOLDENROD3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.584314; RB = R3 = (float ) 0.047059; - break; - case Quantity_NOC_DARKGOLDENROD4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.396078; RB = R3 = (float ) 0.031373; - break; - case Quantity_NOC_DARKGREEN : - RR = R1 = 0.000000; RG = R2 = (float ) 0.392157; RB = R3 = 0.000000; - break; - case Quantity_NOC_DARKKHAKI : - RR = R1 = (float ) 0.741176; RG = R2 = (float ) 0.717647; RB = R3 = (float ) 0.419608; - break; - case Quantity_NOC_DARKOLIVEGREEN : - RR = R1 = (float ) 0.333333; RG = R2 = (float ) 0.419608; RB = R3 = (float ) 0.184314; - break; - case Quantity_NOC_DARKOLIVEGREEN1 : - RR = R1 = (float ) 0.792157; RG = R2 = 1.000000; RB = R3 = (float ) 0.439216; - break; - case Quantity_NOC_DARKOLIVEGREEN2 : - RR = R1 = (float ) 0.737255; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.407843; - break; - case Quantity_NOC_DARKOLIVEGREEN3 : - RR = R1 = (float ) 0.635294; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.352941; - break; - case Quantity_NOC_DARKOLIVEGREEN4 : - RR = R1 = (float ) 0.431373; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.239216; - break; - case Quantity_NOC_DARKORANGE : - RR = R1 = 1.000000; RG = R2 = (float ) 0.549020; RB = R3 = 0.000000; - break; - case Quantity_NOC_DARKORANGE1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.498039; RB = R3 = 0.000000; - break; - case Quantity_NOC_DARKORANGE2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.462745; RB = R3 = 0.000000; - break; - case Quantity_NOC_DARKORANGE3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.400000; RB = R3 = 0.000000; - break; - case Quantity_NOC_DARKORANGE4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.270588; RB = R3 = 0.000000; - break; - case Quantity_NOC_DARKORCHID : - RR = R1 = (float ) 0.600000; RG = R2 = (float ) 0.196078; RB = R3 = (float ) 0.800000; - break; - case Quantity_NOC_DARKORCHID1 : - RR = R1 = (float ) 0.749020; RG = R2 = (float ) 0.243137; RB = R3 = 1.000000; - break; - case Quantity_NOC_DARKORCHID2 : - RR = R1 = (float ) 0.698039; RG = R2 = (float ) 0.227451; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_DARKORCHID3 : - RR = R1 = (float ) 0.603922; RG = R2 = (float ) 0.196078; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_DARKORCHID4 : - RR = R1 = (float ) 0.407843; RG = R2 = (float ) 0.133333; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_DARKSALMON : - RR = R1 = (float ) 0.913725; RG = R2 = (float ) 0.588235; RB = R3 = (float ) 0.478431; - break; - case Quantity_NOC_DARKSEAGREEN : - RR = R1 = (float ) 0.560784; RG = R2 = (float ) 0.737255; RB = R3 = (float ) 0.560784; - break; - case Quantity_NOC_DARKSEAGREEN1 : - RR = R1 = (float ) 0.756863; RG = R2 = 1.000000; RB = R3 = (float ) 0.756863; - break; - case Quantity_NOC_DARKSEAGREEN2 : - RR = R1 = (float ) 0.705882; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.705882; - break; - case Quantity_NOC_DARKSEAGREEN3 : - RR = R1 = (float ) 0.607843; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.607843; - break; - case Quantity_NOC_DARKSEAGREEN4 : - RR = R1 = (float ) 0.411765; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.411765; - break; - case Quantity_NOC_DARKSLATEBLUE : - RR = R1 = (float ) 0.282353; RG = R2 = (float ) 0.239216; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_DARKSLATEGRAY1 : - RR = R1 = (float ) 0.592157; RG = R2 = 1.000000; RB = R3 = 1.000000; - break; - case Quantity_NOC_DARKSLATEGRAY2 : - RR = R1 = (float ) 0.552941; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_DARKSLATEGRAY3 : - RR = R1 = (float ) 0.474510; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_DARKSLATEGRAY4 : - RR = R1 = (float ) 0.321569; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_DARKSLATEGRAY : - RR = R1 = (float ) 0.184314; RG = R2 = (float ) 0.309804; RB = R3 = (float ) 0.309804; - break; - case Quantity_NOC_DARKTURQUOISE : - RR = R1 = 0.000000; RG = R2 = (float ) 0.807843; RB = R3 = (float ) 0.819608; - break; - case Quantity_NOC_DARKVIOLET : - RR = R1 = (float ) 0.580392; RG = R2 = 0.000000; RB = R3 = (float ) 0.827451; - break; - case Quantity_NOC_DEEPPINK : - RR = R1 = 1.000000; RG = R2 = (float ) 0.078431; RB = R3 = (float ) 0.576471; - break; - case Quantity_NOC_DEEPPINK2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.070588; RB = R3 = (float ) 0.537255; - break; - case Quantity_NOC_DEEPPINK3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.062745; RB = R3 = (float ) 0.462745; - break; - case Quantity_NOC_DEEPPINK4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.039216; RB = R3 = (float ) 0.313725; - break; - case Quantity_NOC_DEEPSKYBLUE1 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.749020; RB = R3 = 1.000000; - break; - case Quantity_NOC_DEEPSKYBLUE2 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.698039; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_DEEPSKYBLUE3 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.603922; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_DEEPSKYBLUE4 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.407843; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_DODGERBLUE1 : - RR = R1 = (float ) 0.117647; RG = R2 = (float ) 0.564706; RB = R3 = 1.000000; - break; - case Quantity_NOC_DODGERBLUE2 : - RR = R1 = (float ) 0.109804; RG = R2 = (float ) 0.525490; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_DODGERBLUE3 : - RR = R1 = (float ) 0.094118; RG = R2 = (float ) 0.454902; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_DODGERBLUE4 : - RR = R1 = (float ) 0.062745; RG = R2 = (float ) 0.305882; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_FIREBRICK : - RR = R1 = (float ) 0.698039; RG = R2 = (float ) 0.133333; RB = R3 = (float ) 0.133333; - break; - case Quantity_NOC_FIREBRICK1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.188235; RB = R3 = (float ) 0.188235; - break; - case Quantity_NOC_FIREBRICK2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.172549; RB = R3 = (float ) 0.172549; - break; - case Quantity_NOC_FIREBRICK3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.149020; RB = R3 = (float ) 0.149020; - break; - case Quantity_NOC_FIREBRICK4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.101961; RB = R3 = (float ) 0.101961; - break; - case Quantity_NOC_FLORALWHITE : - RR = R1 = 1.000000; RG = R2 = (float ) 0.980392; RB = R3 = (float ) 0.941176; - break; - case Quantity_NOC_FORESTGREEN : - RR = R1 = (float ) 0.133333; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.133333; - break; - case Quantity_NOC_GAINSBORO : - RR = R1 = (float ) 0.862745; RG = R2 = (float ) 0.862745; RB = R3 = (float ) 0.862745; - break; - case Quantity_NOC_GHOSTWHITE : - RR = R1 = (float ) 0.972549; RG = R2 = (float ) 0.972549; RB = R3 = 1.000000; - break; - case Quantity_NOC_GOLD : - RR = R1 = 1.000000; RG = R2 = (float ) 0.843137; RB = R3 = 0.000000; - break; - case Quantity_NOC_GOLD1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.843137; RB = R3 = 0.000000; - break; - case Quantity_NOC_GOLD2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.788235; RB = R3 = 0.000000; - break; - case Quantity_NOC_GOLD3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.678431; RB = R3 = 0.000000; - break; - case Quantity_NOC_GOLD4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.458824; RB = R3 = 0.000000; - break; - case Quantity_NOC_GOLDENROD : - RR = R1 = (float ) 0.854902; RG = R2 = (float ) 0.647059; RB = R3 = (float ) 0.125490; - break; - case Quantity_NOC_GOLDENROD1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.756863; RB = R3 = (float ) 0.145098; - break; - case Quantity_NOC_GOLDENROD2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.705882; RB = R3 = (float ) 0.133333; - break; - case Quantity_NOC_GOLDENROD3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.607843; RB = R3 = (float ) 0.113725; - break; - case Quantity_NOC_GOLDENROD4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.411765; RB = R3 = (float ) 0.078431; - break; - case Quantity_NOC_GRAY : - RR = R1 = (float ) 0.752941; RG = R2 = (float ) 0.752941; RB = R3 = (float ) 0.752941; - break; - case Quantity_NOC_GRAY0 : - RR = R1 = 0.000000; RG = R2 = 0.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_GRAY1 : - RR = R1 = (float ) 0.011765; RG = R2 = (float ) 0.011765; RB = R3 = (float ) 0.011765; - break; - case Quantity_NOC_GRAY10 : - RR = R1 = (float ) 0.101961; RG = R2 = (float ) 0.101961; RB = R3 = (float ) 0.101961; - break; - case Quantity_NOC_GRAY11 : - RR = R1 = (float ) 0.109804; RG = R2 = (float ) 0.109804; RB = R3 = (float ) 0.109804; - break; - case Quantity_NOC_GRAY12 : - RR = R1 = (float ) 0.121569; RG = R2 = (float ) 0.121569; RB = R3 = (float ) 0.121569; - break; - case Quantity_NOC_GRAY13 : - RR = R1 = (float ) 0.129412; RG = R2 = (float ) 0.129412; RB = R3 = (float ) 0.129412; - break; - case Quantity_NOC_GRAY14 : - RR = R1 = (float ) 0.141176; RG = R2 = (float ) 0.141176; RB = R3 = (float ) 0.141176; - break; - case Quantity_NOC_GRAY15 : - RR = R1 = (float ) 0.149020; RG = R2 = (float ) 0.149020; RB = R3 = (float ) 0.149020; - break; - case Quantity_NOC_GRAY16 : - RR = R1 = (float ) 0.160784; RG = R2 = (float ) 0.160784; RB = R3 = (float ) 0.160784; - break; - case Quantity_NOC_GRAY17 : - RR = R1 = (float ) 0.168627; RG = R2 = (float ) 0.168627; RB = R3 = (float ) 0.168627; - break; - case Quantity_NOC_GRAY18 : - RR = R1 = (float ) 0.180392; RG = R2 = (float ) 0.180392; RB = R3 = (float ) 0.180392; - break; - case Quantity_NOC_GRAY19 : - RR = R1 = (float ) 0.188235; RG = R2 = (float ) 0.188235; RB = R3 = (float ) 0.188235; - break; - case Quantity_NOC_GRAY2 : - RR = R1 = (float ) 0.019608; RG = R2 = (float ) 0.019608; RB = R3 = (float ) 0.019608; - break; - case Quantity_NOC_GRAY20 : - RR = R1 = (float ) 0.200000; RG = R2 = (float ) 0.200000; RB = R3 = (float ) 0.200000; - break; - case Quantity_NOC_GRAY21 : - RR = R1 = (float ) 0.211765; RG = R2 = (float ) 0.211765; RB = R3 = (float ) 0.211765; - break; - case Quantity_NOC_GRAY22 : - RR = R1 = (float ) 0.219608; RG = R2 = (float ) 0.219608; RB = R3 = (float ) 0.219608; - break; - case Quantity_NOC_GRAY23 : - RR = R1 = (float ) 0.231373; RG = R2 = (float ) 0.231373; RB = R3 = (float ) 0.231373; - break; - case Quantity_NOC_GRAY24 : - RR = R1 = (float ) 0.239216; RG = R2 = (float ) 0.239216; RB = R3 = (float ) 0.239216; - break; - case Quantity_NOC_GRAY25 : - RR = R1 = (float ) 0.250980; RG = R2 = (float ) 0.250980; RB = R3 = (float ) 0.250980; - break; - case Quantity_NOC_GRAY26 : - RR = R1 = (float ) 0.258824; RG = R2 = (float ) 0.258824; RB = R3 = (float ) 0.258824; - break; - case Quantity_NOC_GRAY27 : - RR = R1 = (float ) 0.270588; RG = R2 = (float ) 0.270588; RB = R3 = (float ) 0.270588; - break; - case Quantity_NOC_GRAY28 : - RR = R1 = (float ) 0.278431; RG = R2 = (float ) 0.278431; RB = R3 = (float ) 0.278431; - break; - case Quantity_NOC_GRAY29 : - RR = R1 = (float ) 0.290196; RG = R2 = (float ) 0.290196; RB = R3 = (float ) 0.290196; - break; - case Quantity_NOC_GRAY3 : - RR = R1 = (float ) 0.031373; RG = R2 = (float ) 0.031373; RB = R3 = (float ) 0.031373; - break; - case Quantity_NOC_GRAY30 : - RR = R1 = (float ) 0.301961; RG = R2 = (float ) 0.301961; RB = R3 = (float ) 0.301961; - break; - case Quantity_NOC_GRAY31 : - RR = R1 = (float ) 0.309804; RG = R2 = (float ) 0.309804; RB = R3 = (float ) 0.309804; - break; - case Quantity_NOC_GRAY32 : - RR = R1 = (float ) 0.321569; RG = R2 = (float ) 0.321569; RB = R3 = (float ) 0.321569; - break; - case Quantity_NOC_GRAY33 : - RR = R1 = (float ) 0.329412; RG = R2 = (float ) 0.329412; RB = R3 = (float ) 0.329412; - break; - case Quantity_NOC_GRAY34 : - RR = R1 = (float ) 0.341176; RG = R2 = (float ) 0.341176; RB = R3 = (float ) 0.341176; - break; - case Quantity_NOC_GRAY35 : - RR = R1 = (float ) 0.349020; RG = R2 = (float ) 0.349020; RB = R3 = (float ) 0.349020; - break; - case Quantity_NOC_GRAY36 : - RR = R1 = (float ) 0.360784; RG = R2 = (float ) 0.360784; RB = R3 = (float ) 0.360784; - break; - case Quantity_NOC_GRAY37 : - RR = R1 = (float ) 0.368627; RG = R2 = (float ) 0.368627; RB = R3 = (float ) 0.368627; - break; - case Quantity_NOC_GRAY38 : - RR = R1 = (float ) 0.380392; RG = R2 = (float ) 0.380392; RB = R3 = (float ) 0.380392; - break; - case Quantity_NOC_GRAY39 : - RR = R1 = (float ) 0.388235; RG = R2 = (float ) 0.388235; RB = R3 = (float ) 0.388235; - break; - case Quantity_NOC_GRAY4 : - RR = R1 = (float ) 0.039216; RG = R2 = (float ) 0.039216; RB = R3 = (float ) 0.039216; - break; - case Quantity_NOC_GRAY40 : - RR = R1 = (float ) 0.400000; RG = R2 = (float ) 0.400000; RB = R3 = (float ) 0.400000; - break; - case Quantity_NOC_GRAY41 : - RR = R1 = (float ) 0.411765; RG = R2 = (float ) 0.411765; RB = R3 = (float ) 0.411765; - break; - case Quantity_NOC_GRAY42 : - RR = R1 = (float ) 0.419608; RG = R2 = (float ) 0.419608; RB = R3 = (float ) 0.419608; - break; - case Quantity_NOC_GRAY43 : - RR = R1 = (float ) 0.431373; RG = R2 = (float ) 0.431373; RB = R3 = (float ) 0.431373; - break; - case Quantity_NOC_GRAY44 : - RR = R1 = (float ) 0.439216; RG = R2 = (float ) 0.439216; RB = R3 = (float ) 0.439216; - break; - case Quantity_NOC_GRAY45 : - RR = R1 = (float ) 0.450980; RG = R2 = (float ) 0.450980; RB = R3 = (float ) 0.450980; - break; - case Quantity_NOC_GRAY46 : - RR = R1 = (float ) 0.458824; RG = R2 = (float ) 0.458824; RB = R3 = (float ) 0.458824; - break; - case Quantity_NOC_GRAY47 : - RR = R1 = (float ) 0.470588; RG = R2 = (float ) 0.470588; RB = R3 = (float ) 0.470588; - break; - case Quantity_NOC_GRAY48 : - RR = R1 = (float ) 0.478431; RG = R2 = (float ) 0.478431; RB = R3 = (float ) 0.478431; - break; - case Quantity_NOC_GRAY49 : - RR = R1 = (float ) 0.490196; RG = R2 = (float ) 0.490196; RB = R3 = (float ) 0.490196; - break; - case Quantity_NOC_GRAY5 : - RR = R1 = (float ) 0.050980; RG = R2 = (float ) 0.050980; RB = R3 = (float ) 0.050980; - break; - case Quantity_NOC_GRAY50 : - RR = R1 = (float ) 0.498039; RG = R2 = (float ) 0.498039; RB = R3 = (float ) 0.498039; - break; - case Quantity_NOC_GRAY51 : - RR = R1 = (float ) 0.509804; RG = R2 = (float ) 0.509804; RB = R3 = (float ) 0.509804; - break; - case Quantity_NOC_GRAY52 : - RR = R1 = (float ) 0.521569; RG = R2 = (float ) 0.521569; RB = R3 = (float ) 0.521569; - break; - case Quantity_NOC_GRAY53 : - RR = R1 = (float ) 0.529412; RG = R2 = (float ) 0.529412; RB = R3 = (float ) 0.529412; - break; - case Quantity_NOC_GRAY54 : - RR = R1 = (float ) 0.541176; RG = R2 = (float ) 0.541176; RB = R3 = (float ) 0.541176; - break; - case Quantity_NOC_GRAY55 : - RR = R1 = (float ) 0.549020; RG = R2 = (float ) 0.549020; RB = R3 = (float ) 0.549020; - break; - case Quantity_NOC_GRAY56 : - RR = R1 = (float ) 0.560784; RG = R2 = (float ) 0.560784; RB = R3 = (float ) 0.560784; - break; - case Quantity_NOC_GRAY57 : - RR = R1 = (float ) 0.568627; RG = R2 = (float ) 0.568627; RB = R3 = (float ) 0.568627; - break; - case Quantity_NOC_GRAY58 : - RR = R1 = (float ) 0.580392; RG = R2 = (float ) 0.580392; RB = R3 = (float ) 0.580392; - break; - case Quantity_NOC_GRAY59 : - RR = R1 = (float ) 0.588235; RG = R2 = (float ) 0.588235; RB = R3 = (float ) 0.588235; - break; - case Quantity_NOC_GRAY6 : - RR = R1 = (float ) 0.058824; RG = R2 = (float ) 0.058824; RB = R3 = (float ) 0.058824; - break; - case Quantity_NOC_GRAY60 : - RR = R1 = (float ) 0.600000; RG = R2 = (float ) 0.600000; RB = R3 = (float ) 0.600000; - break; - case Quantity_NOC_GRAY61 : - RR = R1 = (float ) 0.611765; RG = R2 = (float ) 0.611765; RB = R3 = (float ) 0.611765; - break; - case Quantity_NOC_GRAY62 : - RR = R1 = (float ) 0.619608; RG = R2 = (float ) 0.619608; RB = R3 = (float ) 0.619608; - break; - case Quantity_NOC_GRAY63 : - RR = R1 = (float ) 0.631373; RG = R2 = (float ) 0.631373; RB = R3 = (float ) 0.631373; - break; - case Quantity_NOC_GRAY64 : - RR = R1 = (float ) 0.639216; RG = R2 = (float ) 0.639216; RB = R3 = (float ) 0.639216; - break; - case Quantity_NOC_GRAY65 : - RR = R1 = (float ) 0.650980; RG = R2 = (float ) 0.650980; RB = R3 = (float ) 0.650980; - break; - case Quantity_NOC_GRAY66 : - RR = R1 = (float ) 0.658824; RG = R2 = (float ) 0.658824; RB = R3 = (float ) 0.658824; - break; - case Quantity_NOC_GRAY67 : - RR = R1 = (float ) 0.670588; RG = R2 = (float ) 0.670588; RB = R3 = (float ) 0.670588; - break; - case Quantity_NOC_GRAY68 : - RR = R1 = (float ) 0.678431; RG = R2 = (float ) 0.678431; RB = R3 = (float ) 0.678431; - break; - case Quantity_NOC_GRAY69 : - RR = R1 = (float ) 0.690196; RG = R2 = (float ) 0.690196; RB = R3 = (float ) 0.690196; - break; - case Quantity_NOC_GRAY7 : - RR = R1 = (float ) 0.070588; RG = R2 = (float ) 0.070588; RB = R3 = (float ) 0.070588; - break; - case Quantity_NOC_GRAY70 : - RR = R1 = (float ) 0.701961; RG = R2 = (float ) 0.701961; RB = R3 = (float ) 0.701961; - break; - case Quantity_NOC_GRAY71 : - RR = R1 = (float ) 0.709804; RG = R2 = (float ) 0.709804; RB = R3 = (float ) 0.709804; - break; - case Quantity_NOC_GRAY72 : - RR = R1 = (float ) 0.721569; RG = R2 = (float ) 0.721569; RB = R3 = (float ) 0.721569; - break; - case Quantity_NOC_GRAY73 : - RR = R1 = (float ) 0.729412; RG = R2 = (float ) 0.729412; RB = R3 = (float ) 0.729412; - break; - case Quantity_NOC_GRAY74 : - RR = R1 = (float ) 0.741176; RG = R2 = (float ) 0.741176; RB = R3 = (float ) 0.741176; - break; - case Quantity_NOC_GRAY75 : - RR = R1 = (float ) 0.749020; RG = R2 = (float ) 0.749020; RB = R3 = (float ) 0.749020; - break; - case Quantity_NOC_GRAY76 : - RR = R1 = (float ) 0.760784; RG = R2 = (float ) 0.760784; RB = R3 = (float ) 0.760784; - break; - case Quantity_NOC_GRAY77 : - RR = R1 = (float ) 0.768627; RG = R2 = (float ) 0.768627; RB = R3 = (float ) 0.768627; - break; - case Quantity_NOC_GRAY78 : - RR = R1 = (float ) 0.780392; RG = R2 = (float ) 0.780392; RB = R3 = (float ) 0.780392; - break; - case Quantity_NOC_GRAY79 : - RR = R1 = (float ) 0.788235; RG = R2 = (float ) 0.788235; RB = R3 = (float ) 0.788235; - break; - case Quantity_NOC_GRAY8 : - RR = R1 = (float ) 0.078431; RG = R2 = (float ) 0.078431; RB = R3 = (float ) 0.078431; - break; - case Quantity_NOC_GRAY80 : - RR = R1 = (float ) 0.800000; RG = R2 = (float ) 0.800000; RB = R3 = (float ) 0.800000; - break; - case Quantity_NOC_GRAY81 : - RR = R1 = (float ) 0.811765; RG = R2 = (float ) 0.811765; RB = R3 = (float ) 0.811765; - break; - case Quantity_NOC_GRAY82 : - RR = R1 = (float ) 0.819608; RG = R2 = (float ) 0.819608; RB = R3 = (float ) 0.819608; - break; - case Quantity_NOC_GRAY83 : - RR = R1 = (float ) 0.831373; RG = R2 = (float ) 0.831373; RB = R3 = (float ) 0.831373; - break; - case Quantity_NOC_GRAY85 : - RR = R1 = (float ) 0.850980; RG = R2 = (float ) 0.850980; RB = R3 = (float ) 0.850980; - break; - case Quantity_NOC_GRAY86 : - RR = R1 = (float ) 0.858824; RG = R2 = (float ) 0.858824; RB = R3 = (float ) 0.858824; - break; - case Quantity_NOC_GRAY87 : - RR = R1 = (float ) 0.870588; RG = R2 = (float ) 0.870588; RB = R3 = (float ) 0.870588; - break; - case Quantity_NOC_GRAY88 : - RR = R1 = (float ) 0.878431; RG = R2 = (float ) 0.878431; RB = R3 = (float ) 0.878431; - break; - case Quantity_NOC_GRAY89 : - RR = R1 = (float ) 0.890196; RG = R2 = (float ) 0.890196; RB = R3 = (float ) 0.890196; - break; - case Quantity_NOC_GRAY9 : - RR = R1 = (float ) 0.090196; RG = R2 = (float ) 0.090196; RB = R3 = (float ) 0.090196; - break; - case Quantity_NOC_GRAY90 : - RR = R1 = (float ) 0.898039; RG = R2 = (float ) 0.898039; RB = R3 = (float ) 0.898039; - break; - case Quantity_NOC_GRAY91 : - RR = R1 = (float ) 0.909804; RG = R2 = (float ) 0.909804; RB = R3 = (float ) 0.909804; - break; - case Quantity_NOC_GRAY92 : - RR = R1 = (float ) 0.921569; RG = R2 = (float ) 0.921569; RB = R3 = (float ) 0.921569; - break; - case Quantity_NOC_GRAY93 : - RR = R1 = (float ) 0.929412; RG = R2 = (float ) 0.929412; RB = R3 = (float ) 0.929412; - break; - case Quantity_NOC_GRAY94 : - RR = R1 = (float ) 0.941176; RG = R2 = (float ) 0.941176; RB = R3 = (float ) 0.941176; - break; - case Quantity_NOC_GRAY95 : - RR = R1 = (float ) 0.949020; RG = R2 = (float ) 0.949020; RB = R3 = (float ) 0.949020; - break; - case Quantity_NOC_GREEN : - RR = R1 = 0.000000; RG = R2 = 1.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_GREEN1 : - RR = R1 = 0.000000; RG = R2 = 1.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_GREEN2 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.933333; RB = R3 = 0.000000; - break; - case Quantity_NOC_GREEN3 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.803922; RB = R3 = 0.000000; - break; - case Quantity_NOC_GREEN4 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.545098; RB = R3 = 0.000000; - break; - case Quantity_NOC_GREENYELLOW : - RR = R1 = (float ) 0.678431; RG = R2 = 1.000000; RB = R3 = (float ) 0.184314; - break; - case Quantity_NOC_GRAY97 : - RR = R1 = (float ) 0.968627; RG = R2 = (float ) 0.968627; RB = R3 = (float ) 0.968627; - break; - case Quantity_NOC_GRAY98 : - RR = R1 = (float ) 0.980392; RG = R2 = (float ) 0.980392; RB = R3 = (float ) 0.980392; - break; - case Quantity_NOC_GRAY99 : - RR = R1 = (float ) 0.988235; RG = R2 = (float ) 0.988235; RB = R3 = (float ) 0.988235; - break; - case Quantity_NOC_HONEYDEW : - RR = R1 = (float ) 0.941176; RG = R2 = 1.000000; RB = R3 = (float ) 0.941176; - break; - case Quantity_NOC_HONEYDEW2 : - RR = R1 = (float ) 0.878431; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.878431; - break; - case Quantity_NOC_HONEYDEW3 : - RR = R1 = (float ) 0.756863; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.756863; - break; - case Quantity_NOC_HONEYDEW4 : - RR = R1 = (float ) 0.513725; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.513725; - break; - case Quantity_NOC_HOTPINK : - RR = R1 = 1.000000; RG = R2 = (float ) 0.411765; RB = R3 = (float ) 0.705882; - break; - case Quantity_NOC_HOTPINK1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.431373; RB = R3 = (float ) 0.705882; - break; - case Quantity_NOC_HOTPINK2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.415686; RB = R3 = (float ) 0.654902; - break; - case Quantity_NOC_HOTPINK3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.376471; RB = R3 = (float ) 0.564706; - break; - case Quantity_NOC_HOTPINK4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.227451; RB = R3 = (float ) 0.384314; - break; - case Quantity_NOC_INDIANRED : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.360784; RB = R3 = (float ) 0.360784; - break; - case Quantity_NOC_INDIANRED1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.415686; RB = R3 = (float ) 0.415686; - break; - case Quantity_NOC_INDIANRED2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.388235; RB = R3 = (float ) 0.388235; - break; - case Quantity_NOC_INDIANRED3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.333333; RB = R3 = (float ) 0.333333; - break; - case Quantity_NOC_INDIANRED4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.227451; RB = R3 = (float ) 0.227451; - break; - case Quantity_NOC_IVORY : - RR = R1 = 1.000000; RG = R2 = 1.000000; RB = R3 = (float ) 0.941176; - break; - case Quantity_NOC_IVORY2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.878431; - break; - case Quantity_NOC_IVORY3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.756863; - break; - case Quantity_NOC_IVORY4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.513725; - break; - case Quantity_NOC_KHAKI : - RR = R1 = (float ) 0.941176; RG = R2 = (float ) 0.901961; RB = R3 = (float ) 0.549020; - break; - case Quantity_NOC_KHAKI1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.964706; RB = R3 = (float ) 0.560784; - break; - case Quantity_NOC_KHAKI2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.901961; RB = R3 = (float ) 0.521569; - break; - case Quantity_NOC_KHAKI3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.776471; RB = R3 = (float ) 0.450980; - break; - case Quantity_NOC_KHAKI4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.525490; RB = R3 = (float ) 0.305882; - break; - case Quantity_NOC_LAVENDER : - RR = R1 = (float ) 0.901961; RG = R2 = (float ) 0.901961; RB = R3 = (float ) 0.980392; - break; - case Quantity_NOC_LAVENDERBLUSH1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.941176; RB = R3 = (float ) 0.960784; - break; - case Quantity_NOC_LAVENDERBLUSH2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.878431; RB = R3 = (float ) 0.898039; - break; - case Quantity_NOC_LAVENDERBLUSH3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.756863; RB = R3 = (float ) 0.772549; - break; - case Quantity_NOC_LAVENDERBLUSH4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.513725; RB = R3 = (float ) 0.525490; - break; - case Quantity_NOC_LAWNGREEN : - RR = R1 = (float ) 0.486275; RG = R2 = (float ) 0.988235; RB = R3 = 0.000000; - break; - case Quantity_NOC_LEMONCHIFFON1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.980392; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_LEMONCHIFFON2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.913725; RB = R3 = (float ) 0.749020; - break; - case Quantity_NOC_LEMONCHIFFON3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.788235; RB = R3 = (float ) 0.647059; - break; - case Quantity_NOC_LEMONCHIFFON4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.537255; RB = R3 = (float ) 0.439216; - break; - case Quantity_NOC_LIGHTBLUE : - RR = R1 = (float ) 0.678431; RG = R2 = (float ) 0.847059; RB = R3 = (float ) 0.901961; - break; - case Quantity_NOC_LIGHTBLUE1 : - RR = R1 = (float ) 0.749020; RG = R2 = (float ) 0.937255; RB = R3 = 1.000000; - break; - case Quantity_NOC_LIGHTBLUE2 : - RR = R1 = (float ) 0.698039; RG = R2 = (float ) 0.874510; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_LIGHTBLUE3 : - RR = R1 = (float ) 0.603922; RG = R2 = (float ) 0.752941; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_LIGHTBLUE4 : - RR = R1 = (float ) 0.407843; RG = R2 = (float ) 0.513725; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_LIGHTCORAL : - RR = R1 = (float ) 0.941176; RG = R2 = (float ) 0.501961; RB = R3 = (float ) 0.501961; - break; - case Quantity_NOC_LIGHTCYAN1 : - RR = R1 = (float ) 0.878431; RG = R2 = 1.000000; RB = R3 = 1.000000; - break; - case Quantity_NOC_LIGHTCYAN2 : - RR = R1 = (float ) 0.819608; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_LIGHTCYAN3 : - RR = R1 = (float ) 0.705882; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_LIGHTCYAN4 : - RR = R1 = (float ) 0.478431; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_LIGHTGOLDENROD : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.866667; RB = R3 = (float ) 0.509804; - break; - case Quantity_NOC_LIGHTGOLDENROD1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.925490; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_LIGHTGOLDENROD2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.862745; RB = R3 = (float ) 0.509804; - break; - case Quantity_NOC_LIGHTGOLDENROD3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.745098; RB = R3 = (float ) 0.439216; - break; - case Quantity_NOC_LIGHTGOLDENROD4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.505882; RB = R3 = (float ) 0.298039; - break; - case Quantity_NOC_LIGHTGOLDENRODYELLOW : - RR = R1 = (float ) 0.980392; RG = R2 = (float ) 0.980392; RB = R3 = (float ) 0.823529; - break; - case Quantity_NOC_LIGHTGRAY : - RR = R1 = (float ) 0.827451; RG = R2 = (float ) 0.827451; RB = R3 = (float ) 0.827451; - break; - case Quantity_NOC_LIGHTPINK : - RR = R1 = 1.000000; RG = R2 = (float ) 0.713725; RB = R3 = (float ) 0.756863; - break; - case Quantity_NOC_LIGHTPINK1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.682353; RB = R3 = (float ) 0.725490; - break; - case Quantity_NOC_LIGHTPINK2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.635294; RB = R3 = (float ) 0.678431; - break; - case Quantity_NOC_LIGHTPINK3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.549020; RB = R3 = (float ) 0.584314; - break; - case Quantity_NOC_LIGHTPINK4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.372549; RB = R3 = (float ) 0.396078; - break; - case Quantity_NOC_LIGHTSALMON1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.627451; RB = R3 = (float ) 0.478431; - break; - case Quantity_NOC_LIGHTSALMON2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.584314; RB = R3 = (float ) 0.447059; - break; - case Quantity_NOC_LIGHTSALMON3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.505882; RB = R3 = (float ) 0.384314; - break; - case Quantity_NOC_LIGHTSALMON4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.341176; RB = R3 = (float ) 0.258824; - break; - case Quantity_NOC_LIGHTSEAGREEN : - RR = R1 = (float ) 0.125490; RG = R2 = (float ) 0.698039; RB = R3 = (float ) 0.666667; - break; - case Quantity_NOC_LIGHTSKYBLUE : - RR = R1 = (float ) 0.529412; RG = R2 = (float ) 0.807843; RB = R3 = (float ) 0.980392; - break; - case Quantity_NOC_LIGHTSKYBLUE1 : - RR = R1 = (float ) 0.690196; RG = R2 = (float ) 0.886275; RB = R3 = 1.000000; - break; - case Quantity_NOC_LIGHTSKYBLUE2 : - RR = R1 = (float ) 0.643137; RG = R2 = (float ) 0.827451; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_LIGHTSKYBLUE3 : - RR = R1 = (float ) 0.552941; RG = R2 = (float ) 0.713725; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_LIGHTSKYBLUE4 : - RR = R1 = (float ) 0.376471; RG = R2 = (float ) 0.482353; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_LIGHTSLATEBLUE : - RR = R1 = (float ) 0.517647; RG = R2 = (float ) 0.439216; RB = R3 = 1.000000; - break; - case Quantity_NOC_LIGHTSLATEGRAY : - RR = R1 = (float ) 0.466667; RG = R2 = (float ) 0.533333; RB = R3 = (float ) 0.600000; - break; - case Quantity_NOC_LIGHTSTEELBLUE : - RR = R1 = (float ) 0.690196; RG = R2 = (float ) 0.768627; RB = R3 = (float ) 0.870588; - break; - case Quantity_NOC_LIGHTSTEELBLUE1 : - RR = R1 = (float ) 0.792157; RG = R2 = (float ) 0.882353; RB = R3 = 1.000000; - break; - case Quantity_NOC_LIGHTSTEELBLUE2 : - RR = R1 = (float ) 0.737255; RG = R2 = (float ) 0.823529; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_LIGHTSTEELBLUE3 : - RR = R1 = (float ) 0.635294; RG = R2 = (float ) 0.709804; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_LIGHTSTEELBLUE4 : - RR = R1 = (float ) 0.431373; RG = R2 = (float ) 0.482353; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_LIGHTYELLOW : - RR = R1 = 1.000000; RG = R2 = 1.000000; RB = R3 = (float ) 0.878431; - break; - case Quantity_NOC_LIGHTYELLOW2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.819608; - break; - case Quantity_NOC_LIGHTYELLOW3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.705882; - break; - case Quantity_NOC_LIGHTYELLOW4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.478431; - break; - case Quantity_NOC_LIMEGREEN : - RR = R1 = (float ) 0.196078; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.196078; - break; - case Quantity_NOC_LINEN : - RR = R1 = (float ) 0.980392; RG = R2 = (float ) 0.941176; RB = R3 = (float ) 0.901961; - break; - case Quantity_NOC_MAGENTA1 : - RR = R1 = 1.000000; RG = R2 = 0.000000; RB = R3 = 1.000000; - break; - case Quantity_NOC_MAGENTA2 : - RR = R1 = (float ) 0.933333; RG = R2 = 0.000000; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_MAGENTA3 : - RR = R1 = (float ) 0.803922; RG = R2 = 0.000000; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_MAGENTA4 : - RR = R1 = (float ) 0.545098; RG = R2 = 0.000000; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_MAROON : - RR = R1 = (float ) 0.690196; RG = R2 = (float ) 0.188235; RB = R3 = (float ) 0.376471; - break; - case Quantity_NOC_MAROON1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.203922; RB = R3 = (float ) 0.701961; - break; - case Quantity_NOC_MAROON2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.188235; RB = R3 = (float ) 0.654902; - break; - case Quantity_NOC_MAROON3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.160784; RB = R3 = (float ) 0.564706; - break; - case Quantity_NOC_MAROON4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.109804; RB = R3 = (float ) 0.384314; - break; - case Quantity_NOC_MEDIUMAQUAMARINE : - RR = R1 = (float ) 0.400000; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.666667; - break; - case Quantity_NOC_MEDIUMORCHID : - RR = R1 = (float ) 0.729412; RG = R2 = (float ) 0.333333; RB = R3 = (float ) 0.827451; - break; - case Quantity_NOC_MEDIUMORCHID1 : - RR = R1 = (float ) 0.878431; RG = R2 = (float ) 0.400000; RB = R3 = 1.000000; - break; - case Quantity_NOC_MEDIUMORCHID2 : - RR = R1 = (float ) 0.819608; RG = R2 = (float ) 0.372549; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_MEDIUMORCHID3 : - RR = R1 = (float ) 0.705882; RG = R2 = (float ) 0.321569; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_MEDIUMORCHID4 : - RR = R1 = (float ) 0.478431; RG = R2 = (float ) 0.215686; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_MEDIUMPURPLE : - RR = R1 = (float ) 0.576471; RG = R2 = (float ) 0.439216; RB = R3 = (float ) 0.858824; - break; - case Quantity_NOC_MEDIUMPURPLE1 : - RR = R1 = (float ) 0.670588; RG = R2 = (float ) 0.509804; RB = R3 = 1.000000; - break; - case Quantity_NOC_MEDIUMPURPLE2 : - RR = R1 = (float ) 0.623529; RG = R2 = (float ) 0.474510; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_MEDIUMPURPLE3 : - RR = R1 = (float ) 0.537255; RG = R2 = (float ) 0.407843; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_MEDIUMPURPLE4 : - RR = R1 = (float ) 0.364706; RG = R2 = (float ) 0.278431; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_MEDIUMSEAGREEN : - RR = R1 = (float ) 0.235294; RG = R2 = (float ) 0.701961; RB = R3 = (float ) 0.443137; - break; - case Quantity_NOC_MEDIUMSLATEBLUE : - RR = R1 = (float ) 0.482353; RG = R2 = (float ) 0.407843; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_MEDIUMSPRINGGREEN : - RR = R1 = 0.000000; RG = R2 = (float ) 0.980392; RB = R3 = (float ) 0.603922; - break; - case Quantity_NOC_MEDIUMTURQUOISE : - RR = R1 = (float ) 0.282353; RG = R2 = (float ) 0.819608; RB = R3 = (float ) 0.800000; - break; - case Quantity_NOC_MEDIUMVIOLETRED : - RR = R1 = (float ) 0.780392; RG = R2 = (float ) 0.082353; RB = R3 = (float ) 0.521569; - break; - case Quantity_NOC_MIDNIGHTBLUE : - RR = R1 = (float ) 0.098039; RG = R2 = (float ) 0.098039; RB = R3 = (float ) 0.439216; - break; - case Quantity_NOC_MINTCREAM : - RR = R1 = (float ) 0.960784; RG = R2 = 1.000000; RB = R3 = (float ) 0.980392; - break; - case Quantity_NOC_MISTYROSE : - RR = R1 = 1.000000; RG = R2 = (float ) 0.894118; RB = R3 = (float ) 0.882353; - break; - case Quantity_NOC_MISTYROSE2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.835294; RB = R3 = (float ) 0.823529; - break; - case Quantity_NOC_MISTYROSE3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.717647; RB = R3 = (float ) 0.709804; - break; - case Quantity_NOC_MISTYROSE4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.490196; RB = R3 = (float ) 0.482353; - break; - case Quantity_NOC_MOCCASIN : - RR = R1 = 1.000000; RG = R2 = (float ) 0.894118; RB = R3 = (float ) 0.709804; - break; - case Quantity_NOC_NAVAJOWHITE1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.870588; RB = R3 = (float ) 0.678431; - break; - case Quantity_NOC_NAVAJOWHITE2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.811765; RB = R3 = (float ) 0.631373; - break; - case Quantity_NOC_NAVAJOWHITE3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.701961; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_NAVAJOWHITE4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.474510; RB = R3 = (float ) 0.368627; - break; - case Quantity_NOC_NAVYBLUE : - RR = R1 = 0.000000; RG = R2 = 0.000000; RB = R3 = (float ) 0.501961; - break; - case Quantity_NOC_OLDLACE : - RR = R1 = (float ) 0.992157; RG = R2 = (float ) 0.960784; RB = R3 = (float ) 0.901961; - break; - case Quantity_NOC_OLIVEDRAB : - RR = R1 = (float ) 0.419608; RG = R2 = (float ) 0.556863; RB = R3 = (float ) 0.137255; - break; - case Quantity_NOC_OLIVEDRAB1 : - RR = R1 = (float ) 0.752941; RG = R2 = 1.000000; RB = R3 = (float ) 0.243137; - break; - case Quantity_NOC_OLIVEDRAB2 : - RR = R1 = (float ) 0.701961; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.227451; - break; - case Quantity_NOC_OLIVEDRAB3 : - RR = R1 = (float ) 0.603922; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.196078; - break; - case Quantity_NOC_OLIVEDRAB4 : - RR = R1 = (float ) 0.411765; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.133333; - break; - case Quantity_NOC_ORANGE : - RR = R1 = 1.000000; RG = R2 = (float ) 0.647059; RB = R3 = 0.000000; - break; - case Quantity_NOC_ORANGE1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.647059; RB = R3 = 0.000000; - break; - case Quantity_NOC_ORANGE2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.603922; RB = R3 = 0.000000; - break; - case Quantity_NOC_ORANGE3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.521569; RB = R3 = 0.000000; - break; - case Quantity_NOC_ORANGE4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.352941; RB = R3 = 0.000000; - break; - case Quantity_NOC_ORANGERED : - RR = R1 = 1.000000; RG = R2 = (float ) 0.270588; RB = R3 = 0.000000; - break; - case Quantity_NOC_ORANGERED1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.270588; RB = R3 = 0.000000; - break; - case Quantity_NOC_ORANGERED2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.250980; RB = R3 = 0.000000; - break; - case Quantity_NOC_ORANGERED3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.215686; RB = R3 = 0.000000; - break; - case Quantity_NOC_ORANGERED4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.145098; RB = R3 = 0.000000; - break; - case Quantity_NOC_ORCHID : - RR = R1 = (float ) 0.854902; RG = R2 = (float ) 0.439216; RB = R3 = (float ) 0.839216; - break; - case Quantity_NOC_ORCHID1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.513725; RB = R3 = (float ) 0.980392; - break; - case Quantity_NOC_ORCHID2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.478431; RB = R3 = (float ) 0.913725; - break; - case Quantity_NOC_ORCHID3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.411765; RB = R3 = (float ) 0.788235; - break; - case Quantity_NOC_ORCHID4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.278431; RB = R3 = (float ) 0.537255; - break; - case Quantity_NOC_PALEGOLDENROD : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.909804; RB = R3 = (float ) 0.666667; - break; - case Quantity_NOC_PALEGREEN : - RR = R1 = (float ) 0.596078; RG = R2 = (float ) 0.984314; RB = R3 = (float ) 0.596078; - break; - case Quantity_NOC_PALEGREEN1 : - RR = R1 = (float ) 0.603922; RG = R2 = 1.000000; RB = R3 = (float ) 0.603922; - break; - case Quantity_NOC_PALEGREEN2 : - RR = R1 = (float ) 0.564706; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.564706; - break; - case Quantity_NOC_PALEGREEN3 : - RR = R1 = (float ) 0.486275; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.486275; - break; - case Quantity_NOC_PALEGREEN4 : - RR = R1 = (float ) 0.329412; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.329412; - break; - case Quantity_NOC_PALETURQUOISE : - RR = R1 = (float ) 0.686275; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_PALETURQUOISE1 : - RR = R1 = (float ) 0.733333; RG = R2 = 1.000000; RB = R3 = 1.000000; - break; - case Quantity_NOC_PALETURQUOISE2 : - RR = R1 = (float ) 0.682353; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_PALETURQUOISE3 : - RR = R1 = (float ) 0.588235; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_PALETURQUOISE4 : - RR = R1 = (float ) 0.400000; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_PALEVIOLETRED : - RR = R1 = (float ) 0.858824; RG = R2 = (float ) 0.439216; RB = R3 = (float ) 0.576471; - break; - case Quantity_NOC_PALEVIOLETRED1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.509804; RB = R3 = (float ) 0.670588; - break; - case Quantity_NOC_PALEVIOLETRED2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.474510; RB = R3 = (float ) 0.623529; - break; - case Quantity_NOC_PALEVIOLETRED3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.407843; RB = R3 = (float ) 0.537255; - break; - case Quantity_NOC_PALEVIOLETRED4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.278431; RB = R3 = (float ) 0.364706; - break; - case Quantity_NOC_PAPAYAWHIP : - RR = R1 = 1.000000; RG = R2 = (float ) 0.937255; RB = R3 = (float ) 0.835294; - break; - case Quantity_NOC_PEACHPUFF : - RR = R1 = 1.000000; RG = R2 = (float ) 0.854902; RB = R3 = (float ) 0.725490; - break; - case Quantity_NOC_PEACHPUFF2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.796078; RB = R3 = (float ) 0.678431; - break; - case Quantity_NOC_PEACHPUFF3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.686275; RB = R3 = (float ) 0.584314; - break; - case Quantity_NOC_PEACHPUFF4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.466667; RB = R3 = (float ) 0.396078; - break; - case Quantity_NOC_PERU : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.521569; RB = R3 = (float ) 0.247059; - break; - case Quantity_NOC_PINK : - RR = R1 = 1.000000; RG = R2 = (float ) 0.752941; RB = R3 = (float ) 0.796078; - break; - case Quantity_NOC_PINK1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.709804; RB = R3 = (float ) 0.772549; - break; - case Quantity_NOC_PINK2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.662745; RB = R3 = (float ) 0.721569; - break; - case Quantity_NOC_PINK3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.568627; RB = R3 = (float ) 0.619608; - break; - case Quantity_NOC_PINK4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.388235; RB = R3 = (float ) 0.423529; - break; - case Quantity_NOC_PLUM : - RR = R1 = (float ) 0.866667; RG = R2 = (float ) 0.627451; RB = R3 = (float ) 0.866667; - break; - case Quantity_NOC_PLUM1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.733333; RB = R3 = 1.000000; - break; - case Quantity_NOC_PLUM2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.682353; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_PLUM3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.588235; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_PLUM4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.400000; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_POWDERBLUE : - RR = R1 = (float ) 0.690196; RG = R2 = (float ) 0.878431; RB = R3 = (float ) 0.901961; - break; - case Quantity_NOC_PURPLE : - RR = R1 = (float ) 0.627451; RG = R2 = (float ) 0.125490; RB = R3 = (float ) 0.941176; - break; - case Quantity_NOC_PURPLE1 : - RR = R1 = (float ) 0.607843; RG = R2 = (float ) 0.188235; RB = R3 = 1.000000; - break; - case Quantity_NOC_PURPLE2 : - RR = R1 = (float ) 0.568627; RG = R2 = (float ) 0.172549; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_PURPLE3 : - RR = R1 = (float ) 0.490196; RG = R2 = (float ) 0.149020; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_PURPLE4 : - RR = R1 = (float ) 0.333333; RG = R2 = (float ) 0.101961; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_RED : - RR = R1 = 1.000000; RG = R2 = 0.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_RED1 : - RR = R1 = 1.000000; RG = R2 = 0.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_RED2 : - RR = R1 = (float ) 0.933333; RG = R2 = 0.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_RED3 : - RR = R1 = (float ) 0.803922; RG = R2 = 0.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_RED4 : - RR = R1 = (float ) 0.545098; RG = R2 = 0.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_ROSYBROWN : - RR = R1 = (float ) 0.737255; RG = R2 = (float ) 0.560784; RB = R3 = (float ) 0.560784; - break; - case Quantity_NOC_ROSYBROWN1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.756863; RB = R3 = (float ) 0.756863; - break; - case Quantity_NOC_ROSYBROWN2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.705882; RB = R3 = (float ) 0.705882; - break; - case Quantity_NOC_ROSYBROWN3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.607843; RB = R3 = (float ) 0.607843; - break; - case Quantity_NOC_ROSYBROWN4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.411765; RB = R3 = (float ) 0.411765; - break; - case Quantity_NOC_ROYALBLUE : - RR = R1 = (float ) 0.254902; RG = R2 = (float ) 0.411765; RB = R3 = (float ) 0.882353; - break; - case Quantity_NOC_ROYALBLUE1 : - RR = R1 = (float ) 0.282353; RG = R2 = (float ) 0.462745; RB = R3 = 1.000000; - break; - case Quantity_NOC_ROYALBLUE2 : - RR = R1 = (float ) 0.262745; RG = R2 = (float ) 0.431373; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_ROYALBLUE3 : - RR = R1 = (float ) 0.227451; RG = R2 = (float ) 0.372549; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_ROYALBLUE4 : - RR = R1 = (float ) 0.152941; RG = R2 = (float ) 0.250980; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_SADDLEBROWN : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.270588; RB = R3 = (float ) 0.074510; - break; - case Quantity_NOC_SALMON : - RR = R1 = (float ) 0.980392; RG = R2 = (float ) 0.501961; RB = R3 = (float ) 0.447059; - break; - case Quantity_NOC_SALMON1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.549020; RB = R3 = (float ) 0.411765; - break; - case Quantity_NOC_SALMON2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.509804; RB = R3 = (float ) 0.384314; - break; - case Quantity_NOC_SALMON3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.439216; RB = R3 = (float ) 0.329412; - break; - case Quantity_NOC_SALMON4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.298039; RB = R3 = (float ) 0.223529; - break; - case Quantity_NOC_SANDYBROWN : - RR = R1 = (float ) 0.956863; RG = R2 = (float ) 0.643137; RB = R3 = (float ) 0.376471; - break; - case Quantity_NOC_SEAGREEN : - RR = R1 = (float ) 0.180392; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.341176; - break; - case Quantity_NOC_SEAGREEN1 : - RR = R1 = (float ) 0.329412; RG = R2 = 1.000000; RB = R3 = (float ) 0.623529; - break; - case Quantity_NOC_SEAGREEN2 : - RR = R1 = (float ) 0.305882; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.580392; - break; - case Quantity_NOC_SEAGREEN3 : - RR = R1 = (float ) 0.262745; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.501961; - break; - case Quantity_NOC_SEAGREEN4 : - RR = R1 = (float ) 0.180392; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.341176; - break; - case Quantity_NOC_SEASHELL : - RR = R1 = 1.000000; RG = R2 = (float ) 0.960784; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_SEASHELL2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.898039; RB = R3 = (float ) 0.870588; - break; - case Quantity_NOC_SEASHELL3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.772549; RB = R3 = (float ) 0.749020; - break; - case Quantity_NOC_SEASHELL4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.525490; RB = R3 = (float ) 0.509804; - break; - case Quantity_NOC_BEET : - RR = R1 = (float ) 0.556863; RG = R2 = (float ) 0.219608; RB = R3 = (float ) 0.556863; - break; - case Quantity_NOC_TEAL : - RR = R1 = (float ) 0.219608; RG = R2 = (float ) 0.556863; RB = R3 = (float ) 0.556863; - break; - case Quantity_NOC_SIENNA : - RR = R1 = (float ) 0.627451; RG = R2 = (float ) 0.321569; RB = R3 = (float ) 0.176471; - break; - case Quantity_NOC_SIENNA1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.509804; RB = R3 = (float ) 0.278431; - break; - case Quantity_NOC_SIENNA2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.474510; RB = R3 = (float ) 0.258824; - break; - case Quantity_NOC_SIENNA3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.407843; RB = R3 = (float ) 0.223529; - break; - case Quantity_NOC_SIENNA4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.278431; RB = R3 = (float ) 0.149020; - break; - case Quantity_NOC_SKYBLUE : - RR = R1 = (float ) 0.529412; RG = R2 = (float ) 0.807843; RB = R3 = (float ) 0.921569; - break; - case Quantity_NOC_SKYBLUE1 : - RR = R1 = (float ) 0.529412; RG = R2 = (float ) 0.807843; RB = R3 = 1.000000; - break; - case Quantity_NOC_SKYBLUE2 : - RR = R1 = (float ) 0.494118; RG = R2 = (float ) 0.752941; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_SKYBLUE3 : - RR = R1 = (float ) 0.423529; RG = R2 = (float ) 0.650980; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_SKYBLUE4 : - RR = R1 = (float ) 0.290196; RG = R2 = (float ) 0.439216; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_SLATEBLUE : - RR = R1 = (float ) 0.415686; RG = R2 = (float ) 0.352941; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_SLATEBLUE1 : - RR = R1 = (float ) 0.513725; RG = R2 = (float ) 0.435294; RB = R3 = 1.000000; - break; - case Quantity_NOC_SLATEBLUE2 : - RR = R1 = (float ) 0.478431; RG = R2 = (float ) 0.403922; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_SLATEBLUE3 : - RR = R1 = (float ) 0.411765; RG = R2 = (float ) 0.349020; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_SLATEBLUE4 : - RR = R1 = (float ) 0.278431; RG = R2 = (float ) 0.235294; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_SLATEGRAY1 : - RR = R1 = (float ) 0.776471; RG = R2 = (float ) 0.886275; RB = R3 = 1.000000; - break; - case Quantity_NOC_SLATEGRAY2 : - RR = R1 = (float ) 0.725490; RG = R2 = (float ) 0.827451; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_SLATEGRAY3 : - RR = R1 = (float ) 0.623529; RG = R2 = (float ) 0.713725; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_SLATEGRAY4 : - RR = R1 = (float ) 0.423529; RG = R2 = (float ) 0.482353; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_SLATEGRAY : - RR = R1 = (float ) 0.439216; RG = R2 = (float ) 0.501961; RB = R3 = (float ) 0.564706; - break; - case Quantity_NOC_SNOW : - RR = R1 = 1.000000; RG = R2 = (float ) 0.980392; RB = R3 = (float ) 0.980392; - break; - case Quantity_NOC_SNOW2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.913725; RB = R3 = (float ) 0.913725; - break; - case Quantity_NOC_SNOW3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.788235; RB = R3 = (float ) 0.788235; - break; - case Quantity_NOC_SNOW4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.537255; RB = R3 = (float ) 0.537255; - break; - case Quantity_NOC_SPRINGGREEN : - RR = R1 = 0.000000; RG = R2 = 1.000000; RB = R3 = (float ) 0.498039; - break; - case Quantity_NOC_SPRINGGREEN2 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.933333; RB = R3 = (float ) 0.462745; - break; - case Quantity_NOC_SPRINGGREEN3 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.400000; - break; - case Quantity_NOC_SPRINGGREEN4 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.545098; RB = R3 = (float ) 0.270588; - break; - case Quantity_NOC_STEELBLUE : - RR = R1 = (float ) 0.274510; RG = R2 = (float ) 0.509804; RB = R3 = (float ) 0.705882; - break; - case Quantity_NOC_STEELBLUE1 : - RR = R1 = (float ) 0.388235; RG = R2 = (float ) 0.721569; RB = R3 = 1.000000; - break; - case Quantity_NOC_STEELBLUE2 : - RR = R1 = (float ) 0.360784; RG = R2 = (float ) 0.674510; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_STEELBLUE3 : - RR = R1 = (float ) 0.309804; RG = R2 = (float ) 0.580392; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_STEELBLUE4 : - RR = R1 = (float ) 0.211765; RG = R2 = (float ) 0.392157; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_TAN : - RR = R1 = (float ) 0.823529; RG = R2 = (float ) 0.705882; RB = R3 = (float ) 0.549020; - break; - case Quantity_NOC_TAN1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.647059; RB = R3 = (float ) 0.309804; - break; - case Quantity_NOC_TAN2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.603922; RB = R3 = (float ) 0.286275; - break; - case Quantity_NOC_TAN3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.521569; RB = R3 = (float ) 0.247059; - break; - case Quantity_NOC_TAN4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.352941; RB = R3 = (float ) 0.168627; - break; - case Quantity_NOC_THISTLE : - RR = R1 = (float ) 0.847059; RG = R2 = (float ) 0.749020; RB = R3 = (float ) 0.847059; - break; - case Quantity_NOC_THISTLE1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.882353; RB = R3 = 1.000000; - break; - case Quantity_NOC_THISTLE2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.823529; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_THISTLE3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.709804; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_THISTLE4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.482353; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_TOMATO : - RR = R1 = 1.000000; RG = R2 = (float ) 0.388235; RB = R3 = (float ) 0.278431; - break; - case Quantity_NOC_TOMATO1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.388235; RB = R3 = (float ) 0.278431; - break; - case Quantity_NOC_TOMATO2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.360784; RB = R3 = (float ) 0.258824; - break; - case Quantity_NOC_TOMATO3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.309804; RB = R3 = (float ) 0.223529; - break; - case Quantity_NOC_TOMATO4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.211765; RB = R3 = (float ) 0.149020; - break; - case Quantity_NOC_TURQUOISE : - RR = R1 = (float ) 0.250980; RG = R2 = (float ) 0.878431; RB = R3 = (float ) 0.815686; - break; - case Quantity_NOC_TURQUOISE1 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.960784; RB = R3 = 1.000000; - break; - case Quantity_NOC_TURQUOISE2 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.898039; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_TURQUOISE3 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.772549; RB = R3 = (float ) 0.803922; - break; - case Quantity_NOC_TURQUOISE4 : - RR = R1 = 0.000000; RG = R2 = (float ) 0.525490; RB = R3 = (float ) 0.545098; - break; - case Quantity_NOC_VIOLET : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.509804; RB = R3 = (float ) 0.933333; - break; - case Quantity_NOC_VIOLETRED : - RR = R1 = (float ) 0.815686; RG = R2 = (float ) 0.125490; RB = R3 = (float ) 0.564706; - break; - case Quantity_NOC_VIOLETRED1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.243137; RB = R3 = (float ) 0.588235; - break; - case Quantity_NOC_VIOLETRED2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.227451; RB = R3 = (float ) 0.549020; - break; - case Quantity_NOC_VIOLETRED3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.196078; RB = R3 = (float ) 0.470588; - break; - case Quantity_NOC_VIOLETRED4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.133333; RB = R3 = (float ) 0.321569; - break; - case Quantity_NOC_WHEAT : - RR = R1 = (float ) 0.960784; RG = R2 = (float ) 0.870588; RB = R3 = (float ) 0.701961; - break; - case Quantity_NOC_WHEAT1 : - RR = R1 = 1.000000; RG = R2 = (float ) 0.905882; RB = R3 = (float ) 0.729412; - break; - case Quantity_NOC_WHEAT2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.847059; RB = R3 = (float ) 0.682353; - break; - case Quantity_NOC_WHEAT3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.729412; RB = R3 = (float ) 0.588235; - break; - case Quantity_NOC_WHEAT4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.494118; RB = R3 = (float ) 0.400000; - break; - case Quantity_NOC_WHITE : - RR = R1 = 1.000000; RG = R2 = 1.000000; RB = R3 = 1.000000; - break; - case Quantity_NOC_WHITESMOKE : - RR = R1 = (float ) 0.960784; RG = R2 = (float ) 0.960784; RB = R3 = (float ) 0.960784; - break; - case Quantity_NOC_YELLOW : - RR = R1 = 1.000000; RG = R2 = 1.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_YELLOW1 : - RR = R1 = 1.000000; RG = R2 = 1.000000; RB = R3 = 0.000000; - break; - case Quantity_NOC_YELLOW2 : - RR = R1 = (float ) 0.933333; RG = R2 = (float ) 0.933333; RB = R3 = 0.000000; - break; - case Quantity_NOC_YELLOW3 : - RR = R1 = (float ) 0.803922; RG = R2 = (float ) 0.803922; RB = R3 = 0.000000; - break; - case Quantity_NOC_YELLOW4 : - RR = R1 = (float ) 0.545098; RG = R2 = (float ) 0.545098; RB = R3 = 0.000000; - break; - case Quantity_NOC_YELLOWGREEN : - RR = R1 = (float ) 0.603922; RG = R2 = (float ) 0.803922; RB = R3 = (float ) 0.196078; - break; - default : - throw Standard_OutOfRange("Bad name"); - break; -} - if (AType == Quantity_TOC_HLS) - Quantity_Color::rgbhls (RR, RG, RB, R1, R2, R3); -} - -Standard_CString Quantity_Color::StringName ( - const Quantity_NameOfColor AName) { - -Standard_CString TheName; - -switch (AName) { - - case Quantity_NOC_BLACK : - TheName = "BLACK"; - break; - case Quantity_NOC_MATRAGRAY : - TheName = "MATRAGRAY"; - break; - case Quantity_NOC_MATRABLUE : - TheName = "MATRABLUE"; - break; - case Quantity_NOC_ALICEBLUE : - TheName = "ALICEBLUE"; - break; - case Quantity_NOC_ANTIQUEWHITE : - TheName = "ANTIQUEWHITE"; - break; - case Quantity_NOC_ANTIQUEWHITE1 : - TheName = "ANTIQUEWHITE1"; - break; - case Quantity_NOC_ANTIQUEWHITE2 : - TheName = "ANTIQUEWHITE2"; - break; - case Quantity_NOC_ANTIQUEWHITE3 : - TheName = "ANTIQUEWHITE3"; - break; - case Quantity_NOC_ANTIQUEWHITE4 : - TheName = "ANTIQUEWHITE4"; - break; - case Quantity_NOC_AQUAMARINE1 : - TheName = "AQUAMARINE1"; - break; - case Quantity_NOC_AQUAMARINE2 : - TheName = "AQUAMARINE2"; - break; - case Quantity_NOC_AQUAMARINE4 : - TheName = "AQUAMARINE4"; - break; - case Quantity_NOC_AZURE : - TheName = "AZURE"; - break; - case Quantity_NOC_AZURE2 : - TheName = "AZURE2"; - break; - case Quantity_NOC_AZURE3 : - TheName = "AZURE3"; - break; - case Quantity_NOC_AZURE4 : - TheName = "AZURE4"; - break; - case Quantity_NOC_BEIGE : - TheName = "BEIGE"; - break; - case Quantity_NOC_BISQUE : - TheName = "BISQUE"; - break; - case Quantity_NOC_BISQUE2 : - TheName = "BISQUE2"; - break; - case Quantity_NOC_BISQUE3 : - TheName = "BISQUE3"; - break; - case Quantity_NOC_BISQUE4 : - TheName = "BISQUE4"; - break; - case Quantity_NOC_BLANCHEDALMOND : - TheName = "BLANCHEDALMOND"; - break; - case Quantity_NOC_BLUE1 : - TheName = "BLUE1"; - break; - case Quantity_NOC_BLUE2 : - TheName = "BLUE2"; - break; - case Quantity_NOC_BLUE3 : - TheName = "BLUE3"; - break; - case Quantity_NOC_BLUE4 : - TheName = "BLUE4"; - break; - case Quantity_NOC_BLUEVIOLET : - TheName = "BLUEVIOLET"; - break; - case Quantity_NOC_BROWN : - TheName = "BROWN"; - break; - case Quantity_NOC_BROWN1 : - TheName = "BROWN1"; - break; - case Quantity_NOC_BROWN2 : - TheName = "BROWN2"; - break; - case Quantity_NOC_BROWN3 : - TheName = "BROWN3"; - break; - case Quantity_NOC_BROWN4 : - TheName = "BROWN4"; - break; - case Quantity_NOC_BURLYWOOD : - TheName = "BURLYWOOD"; - break; - case Quantity_NOC_BURLYWOOD1 : - TheName = "BURLYWOOD1"; - break; - case Quantity_NOC_BURLYWOOD2 : - TheName = "BURLYWOOD2"; - break; - case Quantity_NOC_BURLYWOOD3 : - TheName = "BURLYWOOD3"; - break; - case Quantity_NOC_BURLYWOOD4 : - TheName = "BURLYWOOD4"; - break; - case Quantity_NOC_CADETBLUE : - TheName = "CADETBLUE"; - break; - case Quantity_NOC_CADETBLUE1 : - TheName = "CADETBLUE1"; - break; - case Quantity_NOC_CADETBLUE2 : - TheName = "CADETBLUE2"; - break; - case Quantity_NOC_CADETBLUE3 : - TheName = "CADETBLUE3"; - break; - case Quantity_NOC_CADETBLUE4 : - TheName = "CADETBLUE4"; - break; - case Quantity_NOC_CHARTREUSE : - TheName = "CHARTREUSE"; - break; - case Quantity_NOC_CHARTREUSE1 : - TheName = "CHARTREUSE1"; - break; - case Quantity_NOC_CHARTREUSE2 : - TheName = "CHARTREUSE2"; - break; - case Quantity_NOC_CHARTREUSE3 : - TheName = "CHARTREUSE3"; - break; - case Quantity_NOC_CHARTREUSE4 : - TheName = "CHARTREUSE4"; - break; - case Quantity_NOC_CHOCOLATE : - TheName = "CHOCOLATE"; - break; - case Quantity_NOC_CHOCOLATE1 : - TheName = "CHOCOLATE1"; - break; - case Quantity_NOC_CHOCOLATE2 : - TheName = "CHOCOLATE2"; - break; - case Quantity_NOC_CHOCOLATE3 : - TheName = "CHOCOLATE3"; - break; - case Quantity_NOC_CHOCOLATE4 : - TheName = "CHOCOLATE4"; - break; - case Quantity_NOC_CORAL : - TheName = "CORAL"; - break; - case Quantity_NOC_CORAL1 : - TheName = "CORAL1"; - break; - case Quantity_NOC_CORAL2 : - TheName = "CORAL2"; - break; - case Quantity_NOC_CORAL3 : - TheName = "CORAL3"; - break; - case Quantity_NOC_CORAL4 : - TheName = "CORAL4"; - break; - case Quantity_NOC_CORNFLOWERBLUE : - TheName = "CORNFLOWERBLUE"; - break; - case Quantity_NOC_CORNSILK1 : - TheName = "CORNSILK1"; - break; - case Quantity_NOC_CORNSILK2 : - TheName = "CORNSILK2"; - break; - case Quantity_NOC_CORNSILK3 : - TheName = "CORNSILK3"; - break; - case Quantity_NOC_CORNSILK4 : - TheName = "CORNSILK4"; - break; - case Quantity_NOC_CYAN1 : - TheName = "CYAN1"; - break; - case Quantity_NOC_CYAN2 : - TheName = "CYAN2"; - break; - case Quantity_NOC_CYAN3 : - TheName = "CYAN3"; - break; - case Quantity_NOC_CYAN4 : - TheName = "CYAN4"; - break; - case Quantity_NOC_DARKGOLDENROD : - TheName = "DARKGOLDENROD"; - break; - case Quantity_NOC_DARKGOLDENROD1 : - TheName = "DARKGOLDENROD1"; - break; - case Quantity_NOC_DARKGOLDENROD2 : - TheName = "DARKGOLDENROD2"; - break; - case Quantity_NOC_DARKGOLDENROD3 : - TheName = "DARKGOLDENROD3"; - break; - case Quantity_NOC_DARKGOLDENROD4 : - TheName = "DARKGOLDENROD4"; - break; - case Quantity_NOC_DARKGREEN : - TheName = "DARKGREEN"; - break; - case Quantity_NOC_DARKKHAKI : - TheName = "DARKKHAKI"; - break; - case Quantity_NOC_DARKOLIVEGREEN : - TheName = "DARKOLIVEGREEN"; - break; - case Quantity_NOC_DARKOLIVEGREEN1 : - TheName = "DARKOLIVEGREEN1"; - break; - case Quantity_NOC_DARKOLIVEGREEN2 : - TheName = "DARKOLIVEGREEN2"; - break; - case Quantity_NOC_DARKOLIVEGREEN3 : - TheName = "DARKOLIVEGREEN3"; - break; - case Quantity_NOC_DARKOLIVEGREEN4 : - TheName = "DARKOLIVEGREEN4"; - break; - case Quantity_NOC_DARKORANGE : - TheName = "DARKORANGE"; - break; - case Quantity_NOC_DARKORANGE1 : - TheName = "DARKORANGE1"; - break; - case Quantity_NOC_DARKORANGE2 : - TheName = "DARKORANGE2"; - break; - case Quantity_NOC_DARKORANGE3 : - TheName = "DARKORANGE3"; - break; - case Quantity_NOC_DARKORANGE4 : - TheName = "DARKORANGE4"; - break; - case Quantity_NOC_DARKORCHID : - TheName = "DARKORCHID"; - break; - case Quantity_NOC_DARKORCHID1 : - TheName = "DARKORCHID1"; - break; - case Quantity_NOC_DARKORCHID2 : - TheName = "DARKORCHID2"; - break; - case Quantity_NOC_DARKORCHID3 : - TheName = "DARKORCHID3"; - break; - case Quantity_NOC_DARKORCHID4 : - TheName = "DARKORCHID4"; - break; - case Quantity_NOC_DARKSALMON : - TheName = "DARKSALMON"; - break; - case Quantity_NOC_DARKSEAGREEN : - TheName = "DARKSEAGREEN"; - break; - case Quantity_NOC_DARKSEAGREEN1 : - TheName = "DARKSEAGREEN1"; - break; - case Quantity_NOC_DARKSEAGREEN2 : - TheName = "DARKSEAGREEN2"; - break; - case Quantity_NOC_DARKSEAGREEN3 : - TheName = "DARKSEAGREEN3"; - break; - case Quantity_NOC_DARKSEAGREEN4 : - TheName = "DARKSEAGREEN4"; - break; - case Quantity_NOC_DARKSLATEBLUE : - TheName = "DARKSLATEBLUE"; - break; - case Quantity_NOC_DARKSLATEGRAY1 : - TheName = "DARKSLATEGRAY1"; - break; - case Quantity_NOC_DARKSLATEGRAY2 : - TheName = "DARKSLATEGRAY2"; - break; - case Quantity_NOC_DARKSLATEGRAY3 : - TheName = "DARKSLATEGRAY3"; - break; - case Quantity_NOC_DARKSLATEGRAY4 : - TheName = "DARKSLATEGRAY4"; - break; - case Quantity_NOC_DARKSLATEGRAY : - TheName = "DARKSLATEGRAY"; - break; - case Quantity_NOC_DARKTURQUOISE : - TheName = "DARKTURQUOISE"; - break; - case Quantity_NOC_DARKVIOLET : - TheName = "DARKVIOLET"; - break; - case Quantity_NOC_DEEPPINK : - TheName = "DEEPPINK"; - break; - case Quantity_NOC_DEEPPINK2 : - TheName = "DEEPPINK2"; - break; - case Quantity_NOC_DEEPPINK3 : - TheName = "DEEPPINK3"; - break; - case Quantity_NOC_DEEPPINK4 : - TheName = "DEEPPINK4"; - break; - case Quantity_NOC_DEEPSKYBLUE1 : - TheName = "DEEPSKYBLUE1"; - break; - case Quantity_NOC_DEEPSKYBLUE2 : - TheName = "DEEPSKYBLUE2"; - break; - case Quantity_NOC_DEEPSKYBLUE3 : - TheName = "DEEPSKYBLUE3"; - break; - case Quantity_NOC_DEEPSKYBLUE4 : - TheName = "DEEPSKYBLUE4"; - break; - case Quantity_NOC_DODGERBLUE1 : - TheName = "DODGERBLUE1"; - break; - case Quantity_NOC_DODGERBLUE2 : - TheName = "DODGERBLUE2"; - break; - case Quantity_NOC_DODGERBLUE3 : - TheName = "DODGERBLUE3"; - break; - case Quantity_NOC_DODGERBLUE4 : - TheName = "DODGERBLUE4"; - break; - case Quantity_NOC_FIREBRICK : - TheName = "FIREBRICK"; - break; - case Quantity_NOC_FIREBRICK1 : - TheName = "FIREBRICK1"; - break; - case Quantity_NOC_FIREBRICK2 : - TheName = "FIREBRICK2"; - break; - case Quantity_NOC_FIREBRICK3 : - TheName = "FIREBRICK3"; - break; - case Quantity_NOC_FIREBRICK4 : - TheName = "FIREBRICK4"; - break; - case Quantity_NOC_FLORALWHITE : - TheName = "FLORALWHITE"; - break; - case Quantity_NOC_FORESTGREEN : - TheName = "FORESTGREEN"; - break; - case Quantity_NOC_GAINSBORO : - TheName = "GAINSBORO"; - break; - case Quantity_NOC_GHOSTWHITE : - TheName = "GHOSTWHITE"; - break; - case Quantity_NOC_GOLD : - TheName = "GOLD"; - break; - case Quantity_NOC_GOLD1 : - TheName = "GOLD1"; - break; - case Quantity_NOC_GOLD2 : - TheName = "GOLD2"; - break; - case Quantity_NOC_GOLD3 : - TheName = "GOLD3"; - break; - case Quantity_NOC_GOLD4 : - TheName = "GOLD4"; - break; - case Quantity_NOC_GOLDENROD : - TheName = "GOLDENROD"; - break; - case Quantity_NOC_GOLDENROD1 : - TheName = "GOLDENROD1"; - break; - case Quantity_NOC_GOLDENROD2 : - TheName = "GOLDENROD2"; - break; - case Quantity_NOC_GOLDENROD3 : - TheName = "GOLDENROD3"; - break; - case Quantity_NOC_GOLDENROD4 : - TheName = "GOLDENROD4"; - break; - case Quantity_NOC_GRAY : - TheName = "GRAY"; - break; - case Quantity_NOC_GRAY0 : - TheName = "GRAY0"; - break; - case Quantity_NOC_GRAY1 : - TheName = "GRAY1"; - break; - case Quantity_NOC_GRAY10 : - TheName = "GRAY10"; - break; - case Quantity_NOC_GRAY11 : - TheName = "GRAY11"; - break; - case Quantity_NOC_GRAY12 : - TheName = "GRAY12"; - break; - case Quantity_NOC_GRAY13 : - TheName = "GRAY13"; - break; - case Quantity_NOC_GRAY14 : - TheName = "GRAY14"; - break; - case Quantity_NOC_GRAY15 : - TheName = "GRAY15"; - break; - case Quantity_NOC_GRAY16 : - TheName = "GRAY16"; - break; - case Quantity_NOC_GRAY17 : - TheName = "GRAY17"; - break; - case Quantity_NOC_GRAY18 : - TheName = "GRAY18"; - break; - case Quantity_NOC_GRAY19 : - TheName = "GRAY19"; - break; - case Quantity_NOC_GRAY2 : - TheName = "GRAY2"; - break; - case Quantity_NOC_GRAY20 : - TheName = "GRAY20"; - break; - case Quantity_NOC_GRAY21 : - TheName = "GRAY21"; - break; - case Quantity_NOC_GRAY22 : - TheName = "GRAY22"; - break; - case Quantity_NOC_GRAY23 : - TheName = "GRAY23"; - break; - case Quantity_NOC_GRAY24 : - TheName = "GRAY24"; - break; - case Quantity_NOC_GRAY25 : - TheName = "GRAY25"; - break; - case Quantity_NOC_GRAY26 : - TheName = "GRAY26"; - break; - case Quantity_NOC_GRAY27 : - TheName = "GRAY27"; - break; - case Quantity_NOC_GRAY28 : - TheName = "GRAY28"; - break; - case Quantity_NOC_GRAY29 : - TheName = "GRAY29"; - break; - case Quantity_NOC_GRAY3 : - TheName = "GRAY3"; - break; - case Quantity_NOC_GRAY30 : - TheName = "GRAY30"; - break; - case Quantity_NOC_GRAY31 : - TheName = "GRAY31"; - break; - case Quantity_NOC_GRAY32 : - TheName = "GRAY32"; - break; - case Quantity_NOC_GRAY33 : - TheName = "GRAY33"; - break; - case Quantity_NOC_GRAY34 : - TheName = "GRAY34"; - break; - case Quantity_NOC_GRAY35 : - TheName = "GRAY35"; - break; - case Quantity_NOC_GRAY36 : - TheName = "GRAY36"; - break; - case Quantity_NOC_GRAY37 : - TheName = "GRAY37"; - break; - case Quantity_NOC_GRAY38 : - TheName = "GRAY38"; - break; - case Quantity_NOC_GRAY39 : - TheName = "GRAY39"; - break; - case Quantity_NOC_GRAY4 : - TheName = "GRAY4"; - break; - case Quantity_NOC_GRAY40 : - TheName = "GRAY40"; - break; - case Quantity_NOC_GRAY41 : - TheName = "GRAY41"; - break; - case Quantity_NOC_GRAY42 : - TheName = "GRAY42"; - break; - case Quantity_NOC_GRAY43 : - TheName = "GRAY43"; - break; - case Quantity_NOC_GRAY44 : - TheName = "GRAY44"; - break; - case Quantity_NOC_GRAY45 : - TheName = "GRAY45"; - break; - case Quantity_NOC_GRAY46 : - TheName = "GRAY46"; - break; - case Quantity_NOC_GRAY47 : - TheName = "GRAY47"; - break; - case Quantity_NOC_GRAY48 : - TheName = "GRAY48"; - break; - case Quantity_NOC_GRAY49 : - TheName = "GRAY49"; - break; - case Quantity_NOC_GRAY5 : - TheName = "GRAY5"; - break; - case Quantity_NOC_GRAY50 : - TheName = "GRAY50"; - break; - case Quantity_NOC_GRAY51 : - TheName = "GRAY51"; - break; - case Quantity_NOC_GRAY52 : - TheName = "GRAY52"; - break; - case Quantity_NOC_GRAY53 : - TheName = "GRAY53"; - break; - case Quantity_NOC_GRAY54 : - TheName = "GRAY54"; - break; - case Quantity_NOC_GRAY55 : - TheName = "GRAY55"; - break; - case Quantity_NOC_GRAY56 : - TheName = "GRAY56"; - break; - case Quantity_NOC_GRAY57 : - TheName = "GRAY57"; - break; - case Quantity_NOC_GRAY58 : - TheName = "GRAY58"; - break; - case Quantity_NOC_GRAY59 : - TheName = "GRAY59"; - break; - case Quantity_NOC_GRAY6 : - TheName = "GRAY6"; - break; - case Quantity_NOC_GRAY60 : - TheName = "GRAY60"; - break; - case Quantity_NOC_GRAY61 : - TheName = "GRAY61"; - break; - case Quantity_NOC_GRAY62 : - TheName = "GRAY62"; - break; - case Quantity_NOC_GRAY63 : - TheName = "GRAY63"; - break; - case Quantity_NOC_GRAY64 : - TheName = "GRAY64"; - break; - case Quantity_NOC_GRAY65 : - TheName = "GRAY65"; - break; - case Quantity_NOC_GRAY66 : - TheName = "GRAY66"; - break; - case Quantity_NOC_GRAY67 : - TheName = "GRAY67"; - break; - case Quantity_NOC_GRAY68 : - TheName = "GRAY68"; - break; - case Quantity_NOC_GRAY69 : - TheName = "GRAY69"; - break; - case Quantity_NOC_GRAY7 : - TheName = "GRAY7"; - break; - case Quantity_NOC_GRAY70 : - TheName = "GRAY70"; - break; - case Quantity_NOC_GRAY71 : - TheName = "GRAY71"; - break; - case Quantity_NOC_GRAY72 : - TheName = "GRAY72"; - break; - case Quantity_NOC_GRAY73 : - TheName = "GRAY73"; - break; - case Quantity_NOC_GRAY74 : - TheName = "GRAY74"; - break; - case Quantity_NOC_GRAY75 : - TheName = "GRAY75"; - break; - case Quantity_NOC_GRAY76 : - TheName = "GRAY76"; - break; - case Quantity_NOC_GRAY77 : - TheName = "GRAY77"; - break; - case Quantity_NOC_GRAY78 : - TheName = "GRAY78"; - break; - case Quantity_NOC_GRAY79 : - TheName = "GRAY79"; - break; - case Quantity_NOC_GRAY8 : - TheName = "GRAY8"; - break; - case Quantity_NOC_GRAY80 : - TheName = "GRAY80"; - break; - case Quantity_NOC_GRAY81 : - TheName = "GRAY81"; - break; - case Quantity_NOC_GRAY82 : - TheName = "GRAY82"; - break; - case Quantity_NOC_GRAY83 : - TheName = "GRAY83"; - break; - case Quantity_NOC_GRAY85 : - TheName = "GRAY85"; - break; - case Quantity_NOC_GRAY86 : - TheName = "GRAY86"; - break; - case Quantity_NOC_GRAY87 : - TheName = "GRAY87"; - break; - case Quantity_NOC_GRAY88 : - TheName = "GRAY88"; - break; - case Quantity_NOC_GRAY89 : - TheName = "GRAY89"; - break; - case Quantity_NOC_GRAY9 : - TheName = "GRAY9"; - break; - case Quantity_NOC_GRAY90 : - TheName = "GRAY90"; - break; - case Quantity_NOC_GRAY91 : - TheName = "GRAY91"; - break; - case Quantity_NOC_GRAY92 : - TheName = "GRAY92"; - break; - case Quantity_NOC_GRAY93 : - TheName = "GRAY93"; - break; - case Quantity_NOC_GRAY94 : - TheName = "GRAY94"; - break; - case Quantity_NOC_GRAY95 : - TheName = "GRAY95"; - break; - case Quantity_NOC_GREEN : - TheName = "GREEN"; - break; - case Quantity_NOC_GREEN1 : - TheName = "GREEN1"; - break; - case Quantity_NOC_GREEN2 : - TheName = "GREEN2"; - break; - case Quantity_NOC_GREEN3 : - TheName = "GREEN3"; - break; - case Quantity_NOC_GREEN4 : - TheName = "GREEN4"; - break; - case Quantity_NOC_GREENYELLOW : - TheName = "GREENYELLOW"; - break; - case Quantity_NOC_GRAY97 : - TheName = "GRAY97"; - break; - case Quantity_NOC_GRAY98 : - TheName = "GRAY98"; - break; - case Quantity_NOC_GRAY99 : - TheName = "GRAY99"; - break; - case Quantity_NOC_HONEYDEW : - TheName = "HONEYDEW"; - break; - case Quantity_NOC_HONEYDEW2 : - TheName = "HONEYDEW2"; - break; - case Quantity_NOC_HONEYDEW3 : - TheName = "HONEYDEW3"; - break; - case Quantity_NOC_HONEYDEW4 : - TheName = "HONEYDEW4"; - break; - case Quantity_NOC_HOTPINK : - TheName = "HOTPINK"; - break; - case Quantity_NOC_HOTPINK1 : - TheName = "HOTPINK1"; - break; - case Quantity_NOC_HOTPINK2 : - TheName = "HOTPINK2"; - break; - case Quantity_NOC_HOTPINK3 : - TheName = "HOTPINK3"; - break; - case Quantity_NOC_HOTPINK4 : - TheName = "HOTPINK4"; - break; - case Quantity_NOC_INDIANRED : - TheName = "INDIANRED"; - break; - case Quantity_NOC_INDIANRED1 : - TheName = "INDIANRED1"; - break; - case Quantity_NOC_INDIANRED2 : - TheName = "INDIANRED2"; - break; - case Quantity_NOC_INDIANRED3 : - TheName = "INDIANRED3"; - break; - case Quantity_NOC_INDIANRED4 : - TheName = "INDIANRED4"; - break; - case Quantity_NOC_IVORY : - TheName = "IVORY"; - break; - case Quantity_NOC_IVORY2 : - TheName = "IVORY2"; - break; - case Quantity_NOC_IVORY3 : - TheName = "IVORY3"; - break; - case Quantity_NOC_IVORY4 : - TheName = "IVORY4"; - break; - case Quantity_NOC_KHAKI : - TheName = "KHAKI"; - break; - case Quantity_NOC_KHAKI1 : - TheName = "KHAKI1"; - break; - case Quantity_NOC_KHAKI2 : - TheName = "KHAKI2"; - break; - case Quantity_NOC_KHAKI3 : - TheName = "KHAKI3"; - break; - case Quantity_NOC_KHAKI4 : - TheName = "KHAKI4"; - break; - case Quantity_NOC_LAVENDER : - TheName = "LAVENDER"; - break; - case Quantity_NOC_LAVENDERBLUSH1 : - TheName = "LAVENDERBLUSH1"; - break; - case Quantity_NOC_LAVENDERBLUSH2 : - TheName = "LAVENDERBLUSH2"; - break; - case Quantity_NOC_LAVENDERBLUSH3 : - TheName = "LAVENDERBLUSH3"; - break; - case Quantity_NOC_LAVENDERBLUSH4 : - TheName = "LAVENDERBLUSH4"; - break; - case Quantity_NOC_LAWNGREEN : - TheName = "LAWNGREEN"; - break; - case Quantity_NOC_LEMONCHIFFON1 : - TheName = "LEMONCHIFFON1"; - break; - case Quantity_NOC_LEMONCHIFFON2 : - TheName = "LEMONCHIFFON2"; - break; - case Quantity_NOC_LEMONCHIFFON3 : - TheName = "LEMONCHIFFON3"; - break; - case Quantity_NOC_LEMONCHIFFON4 : - TheName = "LEMONCHIFFON4"; - break; - case Quantity_NOC_LIGHTBLUE : - TheName = "LIGHTBLUE"; - break; - case Quantity_NOC_LIGHTBLUE1 : - TheName = "LIGHTBLUE1"; - break; - case Quantity_NOC_LIGHTBLUE2 : - TheName = "LIGHTBLUE2"; - break; - case Quantity_NOC_LIGHTBLUE3 : - TheName = "LIGHTBLUE3"; - break; - case Quantity_NOC_LIGHTBLUE4 : - TheName = "LIGHTBLUE4"; - break; - case Quantity_NOC_LIGHTCORAL : - TheName = "LIGHTCORAL"; - break; - case Quantity_NOC_LIGHTCYAN1 : - TheName = "LIGHTCYAN1"; - break; - case Quantity_NOC_LIGHTCYAN2 : - TheName = "LIGHTCYAN2"; - break; - case Quantity_NOC_LIGHTCYAN3 : - TheName = "LIGHTCYAN3"; - break; - case Quantity_NOC_LIGHTCYAN4 : - TheName = "LIGHTCYAN4"; - break; - case Quantity_NOC_LIGHTGOLDENROD : - TheName = "LIGHTGOLDENROD"; - break; - case Quantity_NOC_LIGHTGOLDENROD1 : - TheName = "LIGHTGOLDENROD1"; - break; - case Quantity_NOC_LIGHTGOLDENROD2 : - TheName = "LIGHTGOLDENROD2"; - break; - case Quantity_NOC_LIGHTGOLDENROD3 : - TheName = "LIGHTGOLDENROD3"; - break; - case Quantity_NOC_LIGHTGOLDENROD4 : - TheName = "LIGHTGOLDENROD4"; - break; - case Quantity_NOC_LIGHTGOLDENRODYELLOW : - TheName = "LIGHTGOLDENRODYELLOW"; - break; - case Quantity_NOC_LIGHTGRAY : - TheName = "LIGHTGRAY"; - break; - case Quantity_NOC_LIGHTPINK : - TheName = "LIGHTPINK"; - break; - case Quantity_NOC_LIGHTPINK1 : - TheName = "LIGHTPINK1"; - break; - case Quantity_NOC_LIGHTPINK2 : - TheName = "LIGHTPINK2"; - break; - case Quantity_NOC_LIGHTPINK3 : - TheName = "LIGHTPINK3"; - break; - case Quantity_NOC_LIGHTPINK4 : - TheName = "LIGHTPINK4"; - break; - case Quantity_NOC_LIGHTSALMON1 : - TheName = "LIGHTSALMON1"; - break; - case Quantity_NOC_LIGHTSALMON2 : - TheName = "LIGHTSALMON2"; - break; - case Quantity_NOC_LIGHTSALMON3 : - TheName = "LIGHTSALMON3"; - break; - case Quantity_NOC_LIGHTSALMON4 : - TheName = "LIGHTSALMON4"; - break; - case Quantity_NOC_LIGHTSEAGREEN : - TheName = "LIGHTSEAGREEN"; - break; - case Quantity_NOC_LIGHTSKYBLUE : - TheName = "LIGHTSKYBLUE"; - break; - case Quantity_NOC_LIGHTSKYBLUE1 : - TheName = "LIGHTSKYBLUE1"; - break; - case Quantity_NOC_LIGHTSKYBLUE2 : - TheName = "LIGHTSKYBLUE2"; - break; - case Quantity_NOC_LIGHTSKYBLUE3 : - TheName = "LIGHTSKYBLUE3"; - break; - case Quantity_NOC_LIGHTSKYBLUE4 : - TheName = "LIGHTSKYBLUE4"; - break; - case Quantity_NOC_LIGHTSLATEBLUE : - TheName = "LIGHTSLATEBLUE"; - break; - case Quantity_NOC_LIGHTSLATEGRAY : - TheName = "LIGHTSLATEGRAY"; - break; - case Quantity_NOC_LIGHTSTEELBLUE : - TheName = "LIGHTSTEELBLUE"; - break; - case Quantity_NOC_LIGHTSTEELBLUE1 : - TheName = "LIGHTSTEELBLUE1"; - break; - case Quantity_NOC_LIGHTSTEELBLUE2 : - TheName = "LIGHTSTEELBLUE2"; - break; - case Quantity_NOC_LIGHTSTEELBLUE3 : - TheName = "LIGHTSTEELBLUE3"; - break; - case Quantity_NOC_LIGHTSTEELBLUE4 : - TheName = "LIGHTSTEELBLUE4"; - break; - case Quantity_NOC_LIGHTYELLOW : - TheName = "LIGHTYELLOW"; - break; - case Quantity_NOC_LIGHTYELLOW2 : - TheName = "LIGHTYELLOW2"; - break; - case Quantity_NOC_LIGHTYELLOW3 : - TheName = "LIGHTYELLOW3"; - break; - case Quantity_NOC_LIGHTYELLOW4 : - TheName = "LIGHTYELLOW4"; - break; - case Quantity_NOC_LIMEGREEN : - TheName = "LIMEGREEN"; - break; - case Quantity_NOC_LINEN : - TheName = "LINEN"; - break; - case Quantity_NOC_MAGENTA1 : - TheName = "MAGENTA1"; - break; - case Quantity_NOC_MAGENTA2 : - TheName = "MAGENTA2"; - break; - case Quantity_NOC_MAGENTA3 : - TheName = "MAGENTA3"; - break; - case Quantity_NOC_MAGENTA4 : - TheName = "MAGENTA4"; - break; - case Quantity_NOC_MAROON : - TheName = "MAROON"; - break; - case Quantity_NOC_MAROON1 : - TheName = "MAROON1"; - break; - case Quantity_NOC_MAROON2 : - TheName = "MAROON2"; - break; - case Quantity_NOC_MAROON3 : - TheName = "MAROON3"; - break; - case Quantity_NOC_MAROON4 : - TheName = "MAROON4"; - break; - case Quantity_NOC_MEDIUMAQUAMARINE : - TheName = "MEDIUMAQUAMARINE"; - break; - case Quantity_NOC_MEDIUMORCHID : - TheName = "MEDIUMORCHID"; - break; - case Quantity_NOC_MEDIUMORCHID1 : - TheName = "MEDIUMORCHID1"; - break; - case Quantity_NOC_MEDIUMORCHID2 : - TheName = "MEDIUMORCHID2"; - break; - case Quantity_NOC_MEDIUMORCHID3 : - TheName = "MEDIUMORCHID3"; - break; - case Quantity_NOC_MEDIUMORCHID4 : - TheName = "MEDIUMORCHID4"; - break; - case Quantity_NOC_MEDIUMPURPLE : - TheName = "MEDIUMPURPLE"; - break; - case Quantity_NOC_MEDIUMPURPLE1 : - TheName = "MEDIUMPURPLE1"; - break; - case Quantity_NOC_MEDIUMPURPLE2 : - TheName = "MEDIUMPURPLE2"; - break; - case Quantity_NOC_MEDIUMPURPLE3 : - TheName = "MEDIUMPURPLE3"; - break; - case Quantity_NOC_MEDIUMPURPLE4 : - TheName = "MEDIUMPURPLE4"; - break; - case Quantity_NOC_MEDIUMSEAGREEN : - TheName = "MEDIUMSEAGREEN"; - break; - case Quantity_NOC_MEDIUMSLATEBLUE : - TheName = "MEDIUMSLATEBLUE"; - break; - case Quantity_NOC_MEDIUMSPRINGGREEN : - TheName = "MEDIUMSPRINGGREEN"; - break; - case Quantity_NOC_MEDIUMTURQUOISE : - TheName = "MEDIUMTURQUOISE"; - break; - case Quantity_NOC_MEDIUMVIOLETRED : - TheName = "MEDIUMVIOLETRED"; - break; - case Quantity_NOC_MIDNIGHTBLUE : - TheName = "MIDNIGHTBLUE"; - break; - case Quantity_NOC_MINTCREAM : - TheName = "MINTCREAM"; - break; - case Quantity_NOC_MISTYROSE : - TheName = "MISTYROSE"; - break; - case Quantity_NOC_MISTYROSE2 : - TheName = "MISTYROSE2"; - break; - case Quantity_NOC_MISTYROSE3 : - TheName = "MISTYROSE3"; - break; - case Quantity_NOC_MISTYROSE4 : - TheName = "MISTYROSE4"; - break; - case Quantity_NOC_MOCCASIN : - TheName = "MOCCASIN"; - break; - case Quantity_NOC_NAVAJOWHITE1 : - TheName = "NAVAJOWHITE1"; - break; - case Quantity_NOC_NAVAJOWHITE2 : - TheName = "NAVAJOWHITE2"; - break; - case Quantity_NOC_NAVAJOWHITE3 : - TheName = "NAVAJOWHITE3"; - break; - case Quantity_NOC_NAVAJOWHITE4 : - TheName = "NAVAJOWHITE4"; - break; - case Quantity_NOC_NAVYBLUE : - TheName = "NAVYBLUE"; - break; - case Quantity_NOC_OLDLACE : - TheName = "OLDLACE"; - break; - case Quantity_NOC_OLIVEDRAB : - TheName = "OLIVEDRAB"; - break; - case Quantity_NOC_OLIVEDRAB1 : - TheName = "OLIVEDRAB1"; - break; - case Quantity_NOC_OLIVEDRAB2 : - TheName = "OLIVEDRAB2"; - break; - case Quantity_NOC_OLIVEDRAB3 : - TheName = "OLIVEDRAB3"; - break; - case Quantity_NOC_OLIVEDRAB4 : - TheName = "OLIVEDRAB4"; - break; - case Quantity_NOC_ORANGE : - TheName = "ORANGE"; - break; - case Quantity_NOC_ORANGE1 : - TheName = "ORANGE1"; - break; - case Quantity_NOC_ORANGE2 : - TheName = "ORANGE2"; - break; - case Quantity_NOC_ORANGE3 : - TheName = "ORANGE3"; - break; - case Quantity_NOC_ORANGE4 : - TheName = "ORANGE4"; - break; - case Quantity_NOC_ORANGERED : - TheName = "ORANGERED"; - break; - case Quantity_NOC_ORANGERED1 : - TheName = "ORANGERED1"; - break; - case Quantity_NOC_ORANGERED2 : - TheName = "ORANGERED2"; - break; - case Quantity_NOC_ORANGERED3 : - TheName = "ORANGERED3"; - break; - case Quantity_NOC_ORANGERED4 : - TheName = "ORANGERED4"; - break; - case Quantity_NOC_ORCHID : - TheName = "ORCHID"; - break; - case Quantity_NOC_ORCHID1 : - TheName = "ORCHID1"; - break; - case Quantity_NOC_ORCHID2 : - TheName = "ORCHID2"; - break; - case Quantity_NOC_ORCHID3 : - TheName = "ORCHID3"; - break; - case Quantity_NOC_ORCHID4 : - TheName = "ORCHID4"; - break; - case Quantity_NOC_PALEGOLDENROD : - TheName = "PALEGOLDENROD"; - break; - case Quantity_NOC_PALEGREEN : - TheName = "PALEGREEN"; - break; - case Quantity_NOC_PALEGREEN1 : - TheName = "PALEGREEN1"; - break; - case Quantity_NOC_PALEGREEN2 : - TheName = "PALEGREEN2"; - break; - case Quantity_NOC_PALEGREEN3 : - TheName = "PALEGREEN3"; - break; - case Quantity_NOC_PALEGREEN4 : - TheName = "PALEGREEN4"; - break; - case Quantity_NOC_PALETURQUOISE : - TheName = "PALETURQUOISE"; - break; - case Quantity_NOC_PALETURQUOISE1 : - TheName = "PALETURQUOISE1"; - break; - case Quantity_NOC_PALETURQUOISE2 : - TheName = "PALETURQUOISE2"; - break; - case Quantity_NOC_PALETURQUOISE3 : - TheName = "PALETURQUOISE3"; - break; - case Quantity_NOC_PALETURQUOISE4 : - TheName = "PALETURQUOISE4"; - break; - case Quantity_NOC_PALEVIOLETRED : - TheName = "PALEVIOLETRED"; - break; - case Quantity_NOC_PALEVIOLETRED1 : - TheName = "PALEVIOLETRED1"; - break; - case Quantity_NOC_PALEVIOLETRED2 : - TheName = "PALEVIOLETRED2"; - break; - case Quantity_NOC_PALEVIOLETRED3 : - TheName = "PALEVIOLETRED3"; - break; - case Quantity_NOC_PALEVIOLETRED4 : - TheName = "PALEVIOLETRED4"; - break; - case Quantity_NOC_PAPAYAWHIP : - TheName = "PAPAYAWHIP"; - break; - case Quantity_NOC_PEACHPUFF : - TheName = "PEACHPUFF"; - break; - case Quantity_NOC_PEACHPUFF2 : - TheName = "PEACHPUFF2"; - break; - case Quantity_NOC_PEACHPUFF3 : - TheName = "PEACHPUFF3"; - break; - case Quantity_NOC_PEACHPUFF4 : - TheName = "PEACHPUFF4"; - break; - case Quantity_NOC_PERU : - TheName = "PERU"; - break; - case Quantity_NOC_PINK : - TheName = "PINK"; - break; - case Quantity_NOC_PINK1 : - TheName = "PINK1"; - break; - case Quantity_NOC_PINK2 : - TheName = "PINK2"; - break; - case Quantity_NOC_PINK3 : - TheName = "PINK3"; - break; - case Quantity_NOC_PINK4 : - TheName = "PINK4"; - break; - case Quantity_NOC_PLUM : - TheName = "PLUM"; - break; - case Quantity_NOC_PLUM1 : - TheName = "PLUM1"; - break; - case Quantity_NOC_PLUM2 : - TheName = "PLUM2"; - break; - case Quantity_NOC_PLUM3 : - TheName = "PLUM3"; - break; - case Quantity_NOC_PLUM4 : - TheName = "PLUM4"; - break; - case Quantity_NOC_POWDERBLUE : - TheName = "POWDERBLUE"; - break; - case Quantity_NOC_PURPLE : - TheName = "PURPLE"; - break; - case Quantity_NOC_PURPLE1 : - TheName = "PURPLE1"; - break; - case Quantity_NOC_PURPLE2 : - TheName = "PURPLE2"; - break; - case Quantity_NOC_PURPLE3 : - TheName = "PURPLE3"; - break; - case Quantity_NOC_PURPLE4 : - TheName = "PURPLE4"; - break; - case Quantity_NOC_RED : - TheName = "RED"; - break; - case Quantity_NOC_RED1 : - TheName = "RED1"; - break; - case Quantity_NOC_RED2 : - TheName = "RED2"; - break; - case Quantity_NOC_RED3 : - TheName = "RED3"; - break; - case Quantity_NOC_RED4 : - TheName = "RED4"; - break; - case Quantity_NOC_ROSYBROWN : - TheName = "ROSYBROWN"; - break; - case Quantity_NOC_ROSYBROWN1 : - TheName = "ROSYBROWN1"; - break; - case Quantity_NOC_ROSYBROWN2 : - TheName = "ROSYBROWN2"; - break; - case Quantity_NOC_ROSYBROWN3 : - TheName = "ROSYBROWN3"; - break; - case Quantity_NOC_ROSYBROWN4 : - TheName = "ROSYBROWN4"; - break; - case Quantity_NOC_ROYALBLUE : - TheName = "ROYALBLUE"; - break; - case Quantity_NOC_ROYALBLUE1 : - TheName = "ROYALBLUE1"; - break; - case Quantity_NOC_ROYALBLUE2 : - TheName = "ROYALBLUE2"; - break; - case Quantity_NOC_ROYALBLUE3 : - TheName = "ROYALBLUE3"; - break; - case Quantity_NOC_ROYALBLUE4 : - TheName = "ROYALBLUE4"; - break; - case Quantity_NOC_SADDLEBROWN : - TheName = "SADDLEBROWN"; - break; - case Quantity_NOC_SALMON : - TheName = "SALMON"; - break; - case Quantity_NOC_SALMON1 : - TheName = "SALMON1"; - break; - case Quantity_NOC_SALMON2 : - TheName = "SALMON2"; - break; - case Quantity_NOC_SALMON3 : - TheName = "SALMON3"; - break; - case Quantity_NOC_SALMON4 : - TheName = "SALMON4"; - break; - case Quantity_NOC_SANDYBROWN : - TheName = "SANDYBROWN"; - break; - case Quantity_NOC_SEAGREEN : - TheName = "SEAGREEN"; - break; - case Quantity_NOC_SEAGREEN1 : - TheName = "SEAGREEN1"; - break; - case Quantity_NOC_SEAGREEN2 : - TheName = "SEAGREEN2"; - break; - case Quantity_NOC_SEAGREEN3 : - TheName = "SEAGREEN3"; - break; - case Quantity_NOC_SEAGREEN4 : - TheName = "SEAGREEN4"; - break; - case Quantity_NOC_SEASHELL : - TheName = "SEASHELL"; - break; - case Quantity_NOC_SEASHELL2 : - TheName = "SEASHELL2"; - break; - case Quantity_NOC_SEASHELL3 : - TheName = "SEASHELL3"; - break; - case Quantity_NOC_SEASHELL4 : - TheName = "SEASHELL4"; - break; - case Quantity_NOC_BEET : - TheName = "BEET"; - break; - case Quantity_NOC_TEAL : - TheName = "TEAL"; - break; - case Quantity_NOC_SIENNA : - TheName = "SIENNA"; - break; - case Quantity_NOC_SIENNA1 : - TheName = "SIENNA1"; - break; - case Quantity_NOC_SIENNA2 : - TheName = "SIENNA2"; - break; - case Quantity_NOC_SIENNA3 : - TheName = "SIENNA3"; - break; - case Quantity_NOC_SIENNA4 : - TheName = "SIENNA4"; - break; - case Quantity_NOC_SKYBLUE : - TheName = "SKYBLUE"; - break; - case Quantity_NOC_SKYBLUE1 : - TheName = "SKYBLUE1"; - break; - case Quantity_NOC_SKYBLUE2 : - TheName = "SKYBLUE2"; - break; - case Quantity_NOC_SKYBLUE3 : - TheName = "SKYBLUE3"; - break; - case Quantity_NOC_SKYBLUE4 : - TheName = "SKYBLUE4"; - break; - case Quantity_NOC_SLATEBLUE : - TheName = "SLATEBLUE"; - break; - case Quantity_NOC_SLATEBLUE1 : - TheName = "SLATEBLUE1"; - break; - case Quantity_NOC_SLATEBLUE2 : - TheName = "SLATEBLUE2"; - break; - case Quantity_NOC_SLATEBLUE3 : - TheName = "SLATEBLUE3"; - break; - case Quantity_NOC_SLATEBLUE4 : - TheName = "SLATEBLUE4"; - break; - case Quantity_NOC_SLATEGRAY1 : - TheName = "SLATEGRAY1"; - break; - case Quantity_NOC_SLATEGRAY2 : - TheName = "SLATEGRAY2"; - break; - case Quantity_NOC_SLATEGRAY3 : - TheName = "SLATEGRAY3"; - break; - case Quantity_NOC_SLATEGRAY4 : - TheName = "SLATEGRAY4"; - break; - case Quantity_NOC_SLATEGRAY : - TheName = "SLATEGRAY"; - break; - case Quantity_NOC_SNOW : - TheName = "SNOW"; - break; - case Quantity_NOC_SNOW2 : - TheName = "SNOW2"; - break; - case Quantity_NOC_SNOW3 : - TheName = "SNOW3"; - break; - case Quantity_NOC_SNOW4 : - TheName = "SNOW4"; - break; - case Quantity_NOC_SPRINGGREEN : - TheName = "SPRINGGREEN"; - break; - case Quantity_NOC_SPRINGGREEN2 : - TheName = "SPRINGGREEN2"; - break; - case Quantity_NOC_SPRINGGREEN3 : - TheName = "SPRINGGREEN3"; - break; - case Quantity_NOC_SPRINGGREEN4 : - TheName = "SPRINGGREEN4"; - break; - case Quantity_NOC_STEELBLUE : - TheName = "STEELBLUE"; - break; - case Quantity_NOC_STEELBLUE1 : - TheName = "STEELBLUE1"; - break; - case Quantity_NOC_STEELBLUE2 : - TheName = "STEELBLUE2"; - break; - case Quantity_NOC_STEELBLUE3 : - TheName = "STEELBLUE3"; - break; - case Quantity_NOC_STEELBLUE4 : - TheName = "STEELBLUE4"; - break; - case Quantity_NOC_TAN : - TheName = "TAN"; - break; - case Quantity_NOC_TAN1 : - TheName = "TAN1"; - break; - case Quantity_NOC_TAN2 : - TheName = "TAN2"; - break; - case Quantity_NOC_TAN3 : - TheName = "TAN3"; - break; - case Quantity_NOC_TAN4 : - TheName = "TAN4"; - break; - case Quantity_NOC_THISTLE : - TheName = "THISTLE"; - break; - case Quantity_NOC_THISTLE1 : - TheName = "THISTLE1"; - break; - case Quantity_NOC_THISTLE2 : - TheName = "THISTLE2"; - break; - case Quantity_NOC_THISTLE3 : - TheName = "THISTLE3"; - break; - case Quantity_NOC_THISTLE4 : - TheName = "THISTLE4"; - break; - case Quantity_NOC_TOMATO : - TheName = "TOMATO"; - break; - case Quantity_NOC_TOMATO1 : - TheName = "TOMATO1"; - break; - case Quantity_NOC_TOMATO2 : - TheName = "TOMATO2"; - break; - case Quantity_NOC_TOMATO3 : - TheName = "TOMATO3"; - break; - case Quantity_NOC_TOMATO4 : - TheName = "TOMATO4"; - break; - case Quantity_NOC_TURQUOISE : - TheName = "TURQUOISE"; - break; - case Quantity_NOC_TURQUOISE1 : - TheName = "TURQUOISE1"; - break; - case Quantity_NOC_TURQUOISE2 : - TheName = "TURQUOISE2"; - break; - case Quantity_NOC_TURQUOISE3 : - TheName = "TURQUOISE3"; - break; - case Quantity_NOC_TURQUOISE4 : - TheName = "TURQUOISE4"; - break; - case Quantity_NOC_VIOLET : - TheName = "VIOLET"; - break; - case Quantity_NOC_VIOLETRED : - TheName = "VIOLETRED"; - break; - case Quantity_NOC_VIOLETRED1 : - TheName = "VIOLETRED1"; - break; - case Quantity_NOC_VIOLETRED2 : - TheName = "VIOLETRED2"; - break; - case Quantity_NOC_VIOLETRED3 : - TheName = "VIOLETRED3"; - break; - case Quantity_NOC_VIOLETRED4 : - TheName = "VIOLETRED4"; - break; - case Quantity_NOC_WHEAT : - TheName = "WHEAT"; - break; - case Quantity_NOC_WHEAT1 : - TheName = "WHEAT1"; - break; - case Quantity_NOC_WHEAT2 : - TheName = "WHEAT2"; - break; - case Quantity_NOC_WHEAT3 : - TheName = "WHEAT3"; - break; - case Quantity_NOC_WHEAT4 : - TheName = "WHEAT4"; - break; - case Quantity_NOC_WHITE : - TheName = "WHITE"; - break; - case Quantity_NOC_WHITESMOKE : - TheName = "WHITESMOKE"; - break; - case Quantity_NOC_YELLOW : - TheName = "YELLOW"; - break; - case Quantity_NOC_YELLOW1 : - TheName = "YELLOW1"; - break; - case Quantity_NOC_YELLOW2 : - TheName = "YELLOW2"; - break; - case Quantity_NOC_YELLOW3 : - TheName = "YELLOW3"; - break; - case Quantity_NOC_YELLOW4 : - TheName = "YELLOW4"; - break; - case Quantity_NOC_YELLOWGREEN : - TheName = "YELLOWGREEN"; - break; - default : - TheName = "UNDEFINED"; - throw Standard_OutOfRange("Bad name"); - break; -} -return (TheName); -} - -// -/////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////// TESTS //////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -void Quantity_Color::Test () { - -void TestOfColor (); - - try { - OCC_CATCH_SIGNALS - TestOfColor (); - } - - catch (Standard_Failure const& anException) { - std::cout << anException << std::endl; - } - -} - -void TestOfColor () { - -Standard_Real H, L, S; -Standard_Real R, G, B; -Standard_Real DC, DI; -Standard_Integer i; - -std::cout << "definition color tests\n----------------------\n"; - -Quantity_Color C1; -Quantity_Color C2 (Quantity_NOC_ROYALBLUE2); -Quantity_Color C3 (Quantity_NOC_SANDYBROWN); - -// An Introduction to Standard_Object-Oriented Programming and C++ p43 -// a comment for the "const char *const" declaration -const char *const cyan = "YELLOW"; -const char *const blue = "ROYALBLUE2"; -const char *const brown = "SANDYBROWN"; - -Standard_Real RR, GG, BB; - -const Standard_Real DELTA = 1.0e-4; - -std::cout << "Get values and names of color tests\n-----------------------------------\n"; - - C1.Values (R, G, B, Quantity_TOC_RGB); - if ( (R!=1.0) || (G!=1.0) || (B!=0.0) ) { - std::cout << "TEST_ERROR : Values () bad default color\n"; - std::cout << "R, G, B values: " << R << " " << G << " " << B << "\n"; - } - if ( (C1.Red ()!=1.0) || (C1.Green ()!=1.0) || (C1.Blue ()!=0.0) ) { - std::cout << "TEST_ERROR : Values () bad default color\n"; - std::cout << "R, G, B values: " << C1.Red () << " " << C1.Green () - << " " << C1.Blue () << "\n"; - } - if (strcmp (Quantity_Color::StringName (C1.Name()), cyan) != 0) - std::cout << "TEST_ERROR : StringName () " << - Quantity_Color::StringName (C1.Name()) << - " != YELLOW\n"; - - RR=0.262745; GG=0.431373; BB=0.933333; - C1.SetValues (RR, GG, BB, Quantity_TOC_RGB); - C2.Values (R, G, B, Quantity_TOC_RGB); - if ( (Abs (RR-R) > DELTA) || - (Abs (GG-G) > DELTA) || - (Abs (BB-B) > DELTA) ) { - std::cout << "TEST_ERROR : Values () bad default color\n"; - std::cout << "R, G, B values: " << R << " " << G << " " << B << "\n"; - } - - if (C2 != C1) { - std::cout << "TEST_ERROR : IsDifferent ()\n"; - } - if (C3 == C1) { - std::cout << "TEST_ERROR : IsEqual ()\n"; - } - - std::cout << "Distance C1,C2 " << C1.Distance (C2) << "\n"; - std::cout << "Distance C1,C3 " << C1.Distance (C3) << "\n"; - std::cout << "Distance C2,C3 " << C2.Distance (C3) << "\n"; - std::cout << "SquareDistance C1,C2 " << C1.SquareDistance (C2) << "\n"; - std::cout << "SquareDistance C1,C3 " << C1.SquareDistance (C3) << "\n"; - std::cout << "SquareDistance C2,C3 " << C2.SquareDistance (C3) << "\n"; - - if (strcmp (Quantity_Color::StringName (C2.Name()), blue) != 0) - std::cout << "TEST_ERROR : StringName () " << - Quantity_Color::StringName (C2.Name()) << - " != ROYALBLUE2\n"; - -std::cout << "conversion rgbhls tests\n-----------------------\n"; - Quantity_Color::RgbHls (R, G, B, H, L, S); - Quantity_Color::HlsRgb (H, L, S, R, G, B); - RR=0.262745; GG=0.431373; BB=0.933333; - if ( (Abs (RR-R) > DELTA) || - (Abs (GG-G) > DELTA) || - (Abs (BB-B) > DELTA) ) { - std::cout << "TEST_ERROR : RgbHls or HlsRgb bad conversion\n"; - std::cout << "RGB init : " << RR << " " << GG << " " << BB << "\n"; - std::cout << "RGB values : " << R << " " << G << " " << B << "\n"; - std::cout << "Difference RGB : " - << RR-R << " " << GG-G << " " << BB-B << "\n"; - } - -std::cout << "distance tests\n--------------\n"; - R = (float ) 0.9568631; G = (float ) 0.6431371; B = (float ) 0.3764711; - C2.SetValues (R, G, B, Quantity_TOC_RGB); - if (C2.Distance (C3) > DELTA) { - std::cout << "TEST_ERROR : Distance () bad result\n"; - std::cout << "Distance C2 and C3 : " << C2.Distance (C3) << "\n"; - } - - C2.Delta (C3, DC, DI); - if (Abs (DC) > DELTA) - std::cout << "TEST_ERROR : Delta () bad result for DC\n"; - if (Abs (DI) > DELTA) - std::cout << "TEST_ERROR : Delta () bad result for DI\n"; - -std::cout << "name tests\n----------\n"; - R = (float ) 0.9568631; G = (float ) 0.6431371; B = (float ) 0.3764711; - C2.SetValues (R, G, B, Quantity_TOC_RGB); - if (strcmp (Quantity_Color::StringName (C2.Name()), brown) != 0) - std::cout << "TEST_ERROR : StringName () " << - Quantity_Color::StringName (C2.Name()) << - " != SANDYBROWN\n"; - -std::cout << "contrast change tests\n---------------------\n"; - for (i=1; i<=10; i++) { - C2.ChangeContrast (10.); - C2.ChangeContrast (-9.09090909); - } - C2.Values (R, G, B, Quantity_TOC_RGB); - RR=0.956863; GG=0.6431371; BB=0.3764711; - if ( (Abs (RR-R) > DELTA) || - (Abs (GG-G) > DELTA) || - (Abs (BB-B) > DELTA) ) { - std::cout << "TEST_ERROR : ChangeContrast () bad values\n"; - std::cout << "RGB init : " << RR << " " << GG << " " << BB << "\n"; - std::cout << "RGB values : " << R << " " << G << " " << B << "\n"; - } - -} - -/* - * - * Objet : Algorithme de conversion HLS vers RGB - * - * Rappels : RGB et HLS sont 2 modeles de representation - * des couleurs - * - * Parametres : h, l, s connus avec h dans [0,360] et l et s dans [0,1] - * r, g, b dans [0,1] - * - * Reference : La synthese d'images, Collection Hermes - * - * Adaptation : Cal 07 fevrier 1992 - * - * Modification : ? - */ - -void call_hlsrgb (float h, float l, float s, float& r, float& g, float& b) -/* parametres d'entree : h, l, s connus avec h dans [0,360] - * et l et s dans [0,1] */ -/* parametres de sortie : r, g, b dans [0,1] */ -{ - - float hcopy; - float lmuls; - int hi; - - hcopy = h; - lmuls = l * s; - - if (s == 0.0 && h == RGBHLS_H_UNDEFINED) { - /* cas achromatique */ - r = g = b = l; - } - else { - /* cas chromatique */ - if (hcopy == 360.0) { - hcopy = 0.0; - hi = 0; - } - else { - hcopy /= 60.0; - hi = (int)hcopy; - } - - switch (hi) { - case 0 : - /* - r = l; - g = l * (1 - (s * (1 - (hcopy - hi)))); - b = l * (1 - s); - */ - r = l; - b = l - lmuls; - g = b + lmuls * hcopy; - break; - case 1 : - /* - r = l * (1 - (s * (hcopy - hi))); - g = l; - b = l * (1 - s); - */ - r = l + lmuls - lmuls * hcopy; - g = l; - b = l - lmuls; - break; - case 2 : - /* - r = l * (1 - s); - g = l; - b = l * (1 - (s * (1 - (hcopy - hi)))); - */ - r = l - lmuls; - g = l; - b = l - 3 * lmuls + lmuls * hcopy; - break; - case 3 : - /* - r = l * (1 - s); - g = l * (1 - (s * (hcopy - hi))); - b = l; - */ - r = l - lmuls; - g = l + 3 * lmuls - lmuls * hcopy; - b = l; - break; - case 4 : - /* - r = l * (1 - (s * (1 - (hcopy - hi)))); - g = l * (1 - s); - b = l; - */ - r = l - 5 * lmuls + lmuls * hcopy; - g = l - lmuls; - b = l; - break; - case 5 : - /* - r = l; - g = l * (1 - s); - b = l * (1 - (s * (hcopy - hi))); - */ - r = l; - g = l - lmuls; - b = l + 5 * lmuls - lmuls * hcopy; - break; - } - } -} - -/* - * Objet : Algorithme de conversion RGB vers HLS - * - * Rappels : RGB et HLS sont 2 modeles de representation - * des couleurs - * - * Parametres : r, g, b connus dans [0,1] - * h, l, s avec h dans [0,360] et l et s dans [0,1] - * - * Reference : La synthese d'images, Collection Hermes - * - * Creation : Cal 04 fevrier 1992 - * - * Modification : ? - */ - -void call_rgbhls (float r, float g, float b, float& h, float& l, float& s) -/* parametres d'entree : r, g, b connus dans [0,1] */ -/* parametres de sortie : h, l, s avec h dans [0,360] et l et s dans [0,1] */ -{ - - float max, min; - float plus, diff; - float delta; - - /* calcul du max entre r, g et b */ - { plus = 0.0; diff = g - b; max = r; } - if (g > max) { plus = 2.0; diff = b - r; max = g; } - if (b > max) { plus = 4.0; diff = r - g; max = b; } - - /* calcul du min entre r, g et b */ - min = r; - if (g < min) min = g; - if (b < min) min = b; - - delta = max - min; - - /* calcul de la luminance */ - l = max; - - /* calcul de la saturation */ - s = 0.0; - if (max != 0.0) s = delta / max; - - /* calcul de la teinte */ - if (s == 0.0) - /* cas des gris */ - h = RGBHLS_H_UNDEFINED; - else { - h = (float ) 60.0 * ( plus + diff / delta ); - if (h < 0.0) h += 360.0; - } -} - -//======================================================================= -//function : DumpJson -//purpose : -//======================================================================= -void Quantity_Color::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const -{ - OCCT_DUMP_CLASS_BEGIN (theOStream, Quantity_Color); - OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "RGB", 3, MyRed, MyGreen, MyBlue) + SetValues ((Standard_ShortReal)aRed, (Standard_ShortReal)aGreen, (Standard_ShortReal)aBlue, Quantity_TOC_RGB); + return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/src/Quantity/Quantity_ColorDefinitionError.hxx opencascade-7.5.1+dfsg1/src/Quantity/Quantity_ColorDefinitionError.hxx --- opencascade-7.4.1+dfsg1/src/Quantity/Quantity_ColorDefinitionError.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Quantity/Quantity_ColorDefinitionError.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -// Created on: 1994-02-08 -// Created by: Gilles DEBARBOUILLE -// Copyright (c) 1994-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _Quantity_ColorDefinitionError_HeaderFile -#define _Quantity_ColorDefinitionError_HeaderFile - -#include -#include -#include -#include - -class Quantity_ColorDefinitionError; -DEFINE_STANDARD_HANDLE(Quantity_ColorDefinitionError, Standard_DomainError) - -#if !defined No_Exception && !defined No_Quantity_ColorDefinitionError - #define Quantity_ColorDefinitionError_Raise_if(CONDITION, MESSAGE) \ - if (CONDITION) throw Quantity_ColorDefinitionError(MESSAGE); -#else - #define Quantity_ColorDefinitionError_Raise_if(CONDITION, MESSAGE) -#endif - -DEFINE_STANDARD_EXCEPTION(Quantity_ColorDefinitionError, Standard_DomainError) - -#endif // _Quantity_ColorDefinitionError_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Quantity/Quantity_Color.hxx opencascade-7.5.1+dfsg1/src/Quantity/Quantity_Color.hxx --- opencascade-7.4.1+dfsg1/src/Quantity/Quantity_Color.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Quantity/Quantity_Color.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,204 +25,148 @@ #include #include #include -class Quantity_ColorDefinitionError; - -//! This class allows the definition of a colour. -//! The names of the colours are from the X11 specification. -//! color object may be used for numerous applicative purposes. -//! A color is defined by: -//! - its respective quantities of red, green and blue (R-G-B values), or -//! - its hue angle and its values of lightness and saturation (H-L-S values). -//! These two color definition systems are equivalent. -//! Use this class in conjunction with: -//! - the Quantity_TypeOfColor enumeration -//! which identifies the color definition system you are using, -//! - the Quantity_NameOfColor enumeration -//! which lists numerous predefined colors and -//! identifies them by their name. -class Quantity_Color +//! This class allows the definition of an RGB color as triplet of 3 normalized floating point values (red, green, blue). +//! +//! Although Quantity_Color can be technically used for pass-through storage of RGB triplet in any color space, +//! other OCCT interfaces taking/returning Quantity_Color would expect them in linear space. +//! Therefore, take a look into methods converting to and from non-linear sRGB color space, if needed; +//! for instance, application usually providing color picking within 0..255 range in sRGB color space. +class Quantity_Color { public: DEFINE_STANDARD_ALLOC - - //! Creates Quantity_NOC_YELLOW color. - Standard_EXPORT Quantity_Color(); - + //! Creates Quantity_NOC_YELLOW color (for historical reasons). + Quantity_Color() : myRgb (valuesOf (Quantity_NOC_YELLOW, Quantity_TOC_RGB)) {} + //! Creates the color from enumeration value. - Standard_EXPORT Quantity_Color(const Quantity_NameOfColor AName); - + Quantity_Color (const Quantity_NameOfColor theName) : myRgb (valuesOf (theName, Quantity_TOC_RGB)) {} + //! Creates a color according to the definition system theType. - //! Quantity_TOC_RGB: - //! - theR1 the value of Red within range [0.0; 1.0] - //! - theR2 the value of Green within range [0.0; 1.0] - //! - theR3 the value of Blue within range [0.0; 1.0] - //! - //! Quantity_TOC_HLS: - //! - theR1 is the Hue (H) angle in degrees within range [0.0; 360.0], 0.0 being Red. - //! Value -1.0 is a special value reserved for grayscale color (S should be 0.0). - //! - theR2 is the Lightness (L) within range [0.0; 1.0] - //! - theR3 is the Saturation (S) within range [0.0; 1.0] - Standard_EXPORT Quantity_Color (const Standard_Real theR1, - const Standard_Real theR2, - const Standard_Real theR3, + //! Throws exception if values are out of range. + Standard_EXPORT Quantity_Color (const Standard_Real theC1, + const Standard_Real theC2, + const Standard_Real theC3, const Quantity_TypeOfColor theType); - //! Define color from RGB values. + //! Define color from linear RGB values. Standard_EXPORT explicit Quantity_Color (const NCollection_Vec3& theRgb); - //! Increases or decreases the contrast by . - //! is a percentage. Any value greater than zero - //! will increase the contrast. - //! The variation is expressed as a percentage of the - //! current value. - //! It is a variation of the saturation. - Standard_EXPORT void ChangeContrast (const Standard_Real ADelta); - - //! Increases or decreases the intensity by . - //! is a percentage. Any value greater than zero - //! will increase the intensity. - //! The variation is expressed as a percentage of the - //! current value. - //! It is a variation of the lightness. - Standard_EXPORT void ChangeIntensity (const Standard_Real ADelta); - - //! Updates the colour from the definition of the - //! colour . - Standard_EXPORT void SetValues (const Quantity_NameOfColor AName); - + //! Returns the name of the nearest color from the Quantity_NameOfColor enumeration. + Standard_EXPORT Quantity_NameOfColor Name() const; + + //! Updates the color from specified named color. + void SetValues (const Quantity_NameOfColor theName) { myRgb = valuesOf (theName, Quantity_TOC_RGB); } + + //! Return the color as vector of 3 float elements. + const NCollection_Vec3& Rgb () const { return myRgb; } + + //! Return the color as vector of 3 float elements. + operator const NCollection_Vec3&() const { return myRgb; } + + //! Returns in theC1, theC2 and theC3 the components of this color + //! according to the color system definition theType. + Standard_EXPORT void Values (Standard_Real& theC1, + Standard_Real& theC2, + Standard_Real& theC3, + const Quantity_TypeOfColor theType) const; + //! Updates a color according to the mode specified by theType. - //! Quantity_TOC_RGB: - //! - theR1 the value of Red within range [0.0; 1.0] - //! - theR2 the value of Green within range [0.0; 1.0] - //! - theR3 the value of Blue within range [0.0; 1.0] - //! - //! Quantity_TOC_HLS: - //! - theR1 is the Hue (H) angle in degrees within range [0.0; 360.0], 0.0 being Red. - //! -1.0 is a special value reserved for grayscale color (S should be 0.0). - //! - theR2 is the Lightness (L) within range [0.0; 1.0] - //! - theR3 is the Saturation (S) within range [0.0; 1.0] - Standard_EXPORT void SetValues (const Standard_Real theR1, - const Standard_Real theR2, - const Standard_Real theR3, + //! Throws exception if values are out of range. + Standard_EXPORT void SetValues (const Standard_Real theC1, + const Standard_Real theC2, + const Standard_Real theC3, const Quantity_TypeOfColor theType); - - //! Returns the percentage change of contrast and intensity - //! between and . - //! and are percentages, either positive or negative. - //! The calculation is with respect to the current value of - //! If is positive then is more contrasty. - //! If is positive then is more intense. - Standard_EXPORT void Delta (const Quantity_Color& AColor, Standard_Real& DC, Standard_Real& DI) const; - - //! Returns the distance between two colours. It's a - //! value between 0 and the square root of 3 - //! (the black/white distance) - Standard_EXPORT Standard_Real Distance (const Quantity_Color& AColor) const; - - //! Returns the square of distance between two colours. - Standard_EXPORT Standard_Real SquareDistance (const Quantity_Color& AColor) const; - - //! Returns the Blue component (quantity of blue) of the color within range [0.0; 1.0]. - Standard_EXPORT Standard_Real Blue() const; - + + //! Returns the Red component (quantity of red) of the color within range [0.0; 1.0]. + Standard_Real Red() const { return myRgb.r(); } + //! Returns the Green component (quantity of green) of the color within range [0.0; 1.0]. - Standard_EXPORT Standard_Real Green() const; - + Standard_Real Green() const { return myRgb.g(); } + + //! Returns the Blue component (quantity of blue) of the color within range [0.0; 1.0]. + Standard_Real Blue() const { return myRgb.b(); } + //! Returns the Hue component (hue angle) of the color //! in degrees within range [0.0; 360.0], 0.0 being Red. //! -1.0 is a special value reserved for grayscale color (S should be 0.0) - Standard_EXPORT Standard_Real Hue() const; - - //! Returns Standard_True if the distance between and - //! is greater than Epsilon (). - Standard_EXPORT Standard_Boolean IsDifferent (const Quantity_Color& Other) const; -Standard_Boolean operator != (const Quantity_Color& Other) const -{ - return IsDifferent(Other); -} - - //! Returns true if the Other color is - //! - different from, or - //! - equal to this color. - //! Two colors are considered to be equal if their - //! distance is no greater than Epsilon(). - //! These methods are aliases of operator != and operator ==. - Standard_EXPORT Standard_Boolean IsEqual (const Quantity_Color& Other) const; -Standard_Boolean operator == (const Quantity_Color& Other) const -{ - return IsEqual(Other); -} - + Standard_Real Hue() const { return Convert_LinearRGB_To_HLS (myRgb)[0]; } + //! Returns the Light component (value of the lightness) of the color within range [0.0; 1.0]. - Standard_EXPORT Standard_Real Light() const; - - //! Returns the name of the color defined by its - //! quantities of red R, green G and blue B; more - //! precisely this is the nearest color from the - //! Quantity_NameOfColor enumeration. - //! Exceptions - //! Standard_OutOfRange if R, G or B is less than 0. or greater than 1. - Standard_EXPORT Quantity_NameOfColor Name() const; - - //! Returns the Red component (quantity of red) of the color within range [0.0; 1.0]. - Standard_EXPORT Standard_Real Red() const; - + Standard_Real Light() const { return Convert_LinearRGB_To_HLS (myRgb)[1]; } + + //! Increases or decreases the intensity (variation of the lightness). + //! The delta is a percentage. Any value greater than zero will increase the intensity. + //! The variation is expressed as a percentage of the current value. + Standard_EXPORT void ChangeIntensity (const Standard_Real theDelta); + //! Returns the Saturation component (value of the saturation) of the color within range [0.0; 1.0]. - Standard_EXPORT Standard_Real Saturation() const; + Standard_Real Saturation() const { return Convert_LinearRGB_To_HLS (myRgb)[2]; } - //! Return the color as vector of 3 float elements. - operator const NCollection_Vec3&() const { return *(const NCollection_Vec3* )this; } + //! Increases or decreases the contrast (variation of the saturation). + //! The delta is a percentage. Any value greater than zero will increase the contrast. + //! The variation is expressed as a percentage of the current value. + Standard_EXPORT void ChangeContrast (const Standard_Real theDelta); - //! Returns in theR1, theR2 and theR3 the components of this color according to the color system definition theType. - //! If theType is Quantity_TOC_RGB: - //! - theR1 the value of Red between 0.0 and 1.0 - //! - theR2 the value of Green between 0.0 and 1.0 - //! - theR3 the value of Blue between 0.0 and 1.0 - //! If theType is Quantity_TOC_HLS: - //! - theR1 is the Hue (H) angle in degrees within range [0.0; 360.0], 0.0 being Red. - //! -1.0 is a special value reserved for grayscale color (S should be 0.0). - //! - theR2 is the Lightness (L) within range [0.0; 1.0] - //! - theR3 is the Saturation (S) within range [0.0; 1.0] - Standard_EXPORT void Values (Standard_Real& theR1, - Standard_Real& theR2, - Standard_Real& theR3, - const Quantity_TypeOfColor theType) const; - - //! Sets the specified value used to compare and - //! an other color in IsDifferent and in IsEqual methods. - //! Warning: The default value is 0.0001 - Standard_EXPORT static void SetEpsilon (const Standard_Real AnEpsilon); - - //! Returns the specified value used to compare and - //! an other color in IsDifferent and in IsEqual methods. - Standard_EXPORT static Standard_Real Epsilon(); - - //! Returns the name of the colour for which the RGB components - //! are nearest to , and . - Standard_EXPORT static Quantity_NameOfColor Name (const Standard_Real R, const Standard_Real G, const Standard_Real B); - - //! Returns the name of the color identified by - //! AName in the Quantity_NameOfColor enumeration. - //! For example, the name of the color which - //! corresponds to Quantity_NOC_BLACK is "BLACK". - //! Exceptions - //! Standard_OutOfRange if AName in not known - //! in the Quantity_NameOfColor enumeration. - Standard_EXPORT static Standard_CString StringName (const Quantity_NameOfColor AColor); + //! Returns TRUE if the distance between two colors is greater than Epsilon(). + Standard_Boolean IsDifferent (const Quantity_Color& theOther) const { return (SquareDistance (theOther) > Epsilon() * Epsilon()); } + + //! Alias to IsDifferent(). + Standard_Boolean operator!= (const Quantity_Color& theOther) const { return IsDifferent (theOther); } + + //! Returns TRUE if the distance between two colors is no greater than Epsilon(). + Standard_Boolean IsEqual (const Quantity_Color& theOther) const { return (SquareDistance (theOther) <= Epsilon() * Epsilon()); } + + //! Alias to IsEqual(). + Standard_Boolean operator== (const Quantity_Color& theOther) const { return IsEqual (theOther); } + //! Returns the distance between two colors. It's a value between 0 and the square root of 3 (the black/white distance). + Standard_Real Distance (const Quantity_Color& theColor) const + { + return (NCollection_Vec3 (myRgb) - NCollection_Vec3 (theColor.myRgb)).Modulus(); + } + + //! Returns the square of distance between two colors. + Standard_Real SquareDistance (const Quantity_Color& theColor) const + { + return (NCollection_Vec3 (myRgb) - NCollection_Vec3 (theColor.myRgb)).SquareModulus(); + } + + //! Returns the percentage change of contrast and intensity between this and another color. + //! and are percentages, either positive or negative. + //! The calculation is with respect to this color. + //! If is positive then is more contrasty. + //! If is positive then is more intense. + Standard_EXPORT void Delta (const Quantity_Color& theColor, + Standard_Real& DC, Standard_Real& DI) const; + + //! Returns the value of the perceptual difference between this color + //! and @p theOther, computed using the CIEDE2000 formula. + //! The difference is in range [0, 100.], with 1 approximately corresponding + //! to the minimal percievable difference (usually difference 5 or greater is + //! needed for the difference to be recognizable in practice). + Standard_EXPORT Standard_Real DeltaE2000 (const Quantity_Color& theOther) const; + +public: + + //! Returns the color from Quantity_NameOfColor enumeration nearest to specified RGB values. + static Quantity_NameOfColor Name (const Standard_Real theR, const Standard_Real theG, const Standard_Real theB) + { + const Quantity_Color aColor (theR, theG, theB, Quantity_TOC_RGB); + return aColor.Name(); + } + + //! Returns the name of the color identified by the given Quantity_NameOfColor enumeration value. + Standard_EXPORT static Standard_CString StringName (const Quantity_NameOfColor theColor); + //! Finds color from predefined names. - //! For example, the name of the color which - //! corresponds to "BLACK" is Quantity_NOC_BLACK. - //! Returns false if name is unknown. + //! For example, the name of the color which corresponds to "BLACK" is Quantity_NOC_BLACK. + //! Returns FALSE if name is unknown. Standard_EXPORT static Standard_Boolean ColorFromName (const Standard_CString theName, Quantity_NameOfColor& theColor); //! Finds color from predefined names. - //! For example, the name of the color which - //! corresponds to "BLACK" is Quantity_NOC_BLACK. - //! Returns false if name is unknown. //! @param theColorNameString the color name //! @param theColor a found color //! @return false if the color name is unknown, or true if the search by color name was successful @@ -237,7 +181,10 @@ return true; } - //! Parses the string as a hex color (like "#FF0" for short RGB color, or "#FFFF00" for RGB color) +public: + //!@name Routines converting colors between different encodings and color spaces + + //! Parses the string as a hex color (like "#FF0" for short sRGB color, or "#FFFF00" for sRGB color) //! @param theHexColorString the string to be parsed //! @param theColor a color that is a result of parsing //! @return true if parsing was successful, or false otherwise @@ -247,7 +194,7 @@ static TCollection_AsciiString ColorToHex (const Quantity_Color& theColor, const bool theToPrefixHash = true) { - NCollection_Vec3 anSRgb = (NCollection_Vec3 )theColor; + NCollection_Vec3 anSRgb = Convert_LinearRGB_To_sRGB ((NCollection_Vec3 )theColor); NCollection_Vec3 anSRgbInt (anSRgb * 255.0f + NCollection_Vec3 (0.5f)); char aBuff[10]; Sprintf (aBuff, theToPrefixHash ? "#%02X%02X%02X" : "%02X%02X%02X", @@ -255,49 +202,181 @@ return aBuff; } + //! Converts sRGB components into HLS ones. + Standard_EXPORT static NCollection_Vec3 Convert_sRGB_To_HLS (const NCollection_Vec3& theRgb); + //! Converts HLS components into RGB ones. - Standard_EXPORT static void HlsRgb (const Standard_Real H, const Standard_Real L, const Standard_Real S, Standard_Real& R, Standard_Real& G, Standard_Real& B); - - //! Converts RGB components into HLS ones. - Standard_EXPORT static void RgbHls (const Standard_Real R, const Standard_Real G, const Standard_Real B, Standard_Real& H, Standard_Real& L, Standard_Real& S); - - //! Convert the Color value to ARGB integer value. - //! theARGB has Alpha equal to zero, so the output is - //! formatted as 0x00RRGGBB - Standard_EXPORT static void Color2argb (const Quantity_Color& theColor, Standard_Integer& theARGB); - - //! Convert integer ARGB value to Color. Alpha bits are ignored - Standard_EXPORT static void Argb2color (const Standard_Integer theARGB, Quantity_Color& theColor); - - //! Internal test - Standard_EXPORT static void Test(); + Standard_EXPORT static NCollection_Vec3 Convert_HLS_To_sRGB (const NCollection_Vec3& theHls); + + //! Converts Linear RGB components into HLS ones. + static NCollection_Vec3 Convert_LinearRGB_To_HLS (const NCollection_Vec3& theRgb) + { + return Convert_sRGB_To_HLS (Convert_LinearRGB_To_sRGB (theRgb)); + } + + //! Converts HLS components into linear RGB ones. + static NCollection_Vec3 Convert_HLS_To_LinearRGB (const NCollection_Vec3& theHls) + { + return Convert_sRGB_To_LinearRGB (Convert_HLS_To_sRGB (theHls)); + } + + //! Converts linear RGB components into CIE Lab ones. + Standard_EXPORT static NCollection_Vec3 Convert_LinearRGB_To_Lab (const NCollection_Vec3& theRgb); + + //! Converts CIE Lab components into CIE Lch ones. + Standard_EXPORT static NCollection_Vec3 Convert_Lab_To_Lch (const NCollection_Vec3& theLab); + + //! Converts CIE Lab components into linear RGB ones. + //! Note that the resulting values may be out of the valid range for RGB. + Standard_EXPORT static NCollection_Vec3 Convert_Lab_To_LinearRGB (const NCollection_Vec3& theLab); + + //! Converts CIE Lch components into CIE Lab ones. + Standard_EXPORT static NCollection_Vec3 Convert_Lch_To_Lab (const NCollection_Vec3& theLch); + + //! Convert the color value to ARGB integer value, with alpha equals to 0. + //! So the output is formatted as 0x00RRGGBB. + //! Note that this unpacking does NOT involve non-linear sRGB -> linear RGB conversion, + //! as would be usually expected for RGB color packed into 4 bytes. + //! @param theColor [in] color to convert + //! @param theARGB [out] result color encoded as integer + static void Color2argb (const Quantity_Color& theColor, + Standard_Integer& theARGB) + { + const NCollection_Vec3 aColor (static_cast (255.0f * theColor.myRgb.r() + 0.5f), + static_cast (255.0f * theColor.myRgb.g() + 0.5f), + static_cast (255.0f * theColor.myRgb.b() + 0.5f)); + theARGB = (((aColor.r() & 0xff) << 16) + | ((aColor.g() & 0xff) << 8) + | (aColor.b() & 0xff)); + } + + //! Convert integer ARGB value to Color. Alpha bits are ignored. + //! Note that this packing does NOT involve linear -> non-linear sRGB conversion, + //! as would be usually expected to preserve higher (for human eye) color precision in 4 bytes. + static void Argb2color (const Standard_Integer theARGB, + Quantity_Color& theColor) + { + const NCollection_Vec3 aColor (static_cast ((theARGB & 0xff0000) >> 16), + static_cast ((theARGB & 0x00ff00) >> 8), + static_cast ((theARGB & 0x0000ff))); + theColor.SetValues (aColor.r() / 255.0, aColor.g() / 255.0, aColor.b() / 255.0, Quantity_TOC_sRGB); + } + + //! Convert linear RGB component into sRGB using OpenGL specs formula (double precision), also known as gamma correction. + static Standard_Real Convert_LinearRGB_To_sRGB (Standard_Real theLinearValue) + { + return theLinearValue <= 0.0031308 + ? theLinearValue * 12.92 + : Pow (theLinearValue, 1.0/2.4) * 1.055 - 0.055; + } + + //! Convert linear RGB component into sRGB using OpenGL specs formula (single precision), also known as gamma correction. + static float Convert_LinearRGB_To_sRGB (float theLinearValue) + { + return theLinearValue <= 0.0031308f + ? theLinearValue * 12.92f + : powf (theLinearValue, 1.0f/2.4f) * 1.055f - 0.055f; + } + + //! Convert sRGB component into linear RGB using OpenGL specs formula (double precision), also known as gamma correction. + static Standard_Real Convert_sRGB_To_LinearRGB (Standard_Real thesRGBValue) + { + return thesRGBValue <= 0.04045 + ? thesRGBValue / 12.92 + : Pow ((thesRGBValue + 0.055) / 1.055, 2.4); + } + + //! Convert sRGB component into linear RGB using OpenGL specs formula (single precision), also known as gamma correction. + static float Convert_sRGB_To_LinearRGB (float thesRGBValue) + { + return thesRGBValue <= 0.04045f + ? thesRGBValue / 12.92f + : powf ((thesRGBValue + 0.055f) / 1.055f, 2.4f); + } + + //! Convert linear RGB components into sRGB using OpenGL specs formula. + template + static NCollection_Vec3 Convert_LinearRGB_To_sRGB (const NCollection_Vec3& theRGB) + { + return NCollection_Vec3 (Convert_LinearRGB_To_sRGB (theRGB.r()), + Convert_LinearRGB_To_sRGB (theRGB.g()), + Convert_LinearRGB_To_sRGB (theRGB.b())); + } + + //! Convert sRGB components into linear RGB using OpenGL specs formula. + template + static NCollection_Vec3 Convert_sRGB_To_LinearRGB (const NCollection_Vec3& theRGB) + { + return NCollection_Vec3 (Convert_sRGB_To_LinearRGB (theRGB.r()), + Convert_sRGB_To_LinearRGB (theRGB.g()), + Convert_sRGB_To_LinearRGB (theRGB.b())); + } + + //! Convert linear RGB component into sRGB using approximated uniform gamma coefficient 2.2. + static float Convert_LinearRGB_To_sRGB_approx22 (float theLinearValue) { return powf (theLinearValue, 2.2f); } + + //! Convert sRGB component into linear RGB using approximated uniform gamma coefficient 2.2 + static float Convert_sRGB_To_LinearRGB_approx22 (float thesRGBValue) { return powf (thesRGBValue, 1.0f/2.2f); } + + //! Convert linear RGB components into sRGB using approximated uniform gamma coefficient 2.2 + static NCollection_Vec3 Convert_LinearRGB_To_sRGB_approx22 (const NCollection_Vec3& theRGB) + { + return NCollection_Vec3 (Convert_LinearRGB_To_sRGB_approx22 (theRGB.r()), + Convert_LinearRGB_To_sRGB_approx22 (theRGB.g()), + Convert_LinearRGB_To_sRGB_approx22 (theRGB.b())); + } + + //! Convert sRGB components into linear RGB using approximated uniform gamma coefficient 2.2 + static NCollection_Vec3 Convert_sRGB_To_LinearRGB_approx22 (const NCollection_Vec3& theRGB) + { + return NCollection_Vec3 (Convert_sRGB_To_LinearRGB_approx22 (theRGB.r()), + Convert_sRGB_To_LinearRGB_approx22 (theRGB.g()), + Convert_sRGB_To_LinearRGB_approx22 (theRGB.b())); + } + + //! Converts HLS components into sRGB ones. + static void HlsRgb (const Standard_Real theH, const Standard_Real theL, const Standard_Real theS, + Standard_Real& theR, Standard_Real& theG, Standard_Real& theB) + { + const NCollection_Vec3 anRgb = Convert_HLS_To_sRGB (NCollection_Vec3 ((float )theH, (float )theL, (float )theS)); + theR = anRgb[0]; + theG = anRgb[1]; + theB = anRgb[2]; + } + + //! Converts sRGB components into HLS ones. + static void RgbHls (const Standard_Real theR, const Standard_Real theG, const Standard_Real theB, + Standard_Real& theH, Standard_Real& theL, Standard_Real& theS) + { + const NCollection_Vec3 aHls = Convert_sRGB_To_HLS (NCollection_Vec3 ((float )theR, (float )theG, (float )theB)); + theH = aHls[0]; + theL = aHls[1]; + theS = aHls[2]; + } + +public: + + //! Returns the value used to compare two colors for equality; 0.0001 by default. + Standard_EXPORT static Standard_Real Epsilon(); + + //! Set the value used to compare two colors for equality. + Standard_EXPORT static void SetEpsilon (const Standard_Real theEpsilon); //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + + //! Inits the content of me from the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); private: - //! Converts HLS components into RGB ones. - Standard_EXPORT static void hlsrgb (const Standard_ShortReal H, const Standard_ShortReal L, const Standard_ShortReal S, Standard_ShortReal& R, Standard_ShortReal& G, Standard_ShortReal& B); - - //! Converts RGB components into HLS ones. - Standard_EXPORT static void rgbhls (const Standard_ShortReal R, const Standard_ShortReal G, const Standard_ShortReal B, Standard_ShortReal& H, Standard_ShortReal& L, Standard_ShortReal& S); - - //! Returns the values of a predefined colour according to - //! the mode specified by TypeOfColor - //! TOC_RGB : the value of red between 0. and 1. - //! the value of green between 0. and 1. - //! the value of blue between 0. and 1. - //! - //! TOC_HLS : is the hue angle in degrees, 0. being red - //! is the lightness between 0. and 1. - //! is the saturation between 0. and 1. - Standard_EXPORT static void ValuesOf (const Quantity_NameOfColor AName, const Quantity_TypeOfColor AType, Standard_ShortReal& R1, Standard_ShortReal& R2, Standard_ShortReal& R3); + //! Returns the values of a predefined color according to the mode. + Standard_EXPORT static NCollection_Vec3 valuesOf (const Quantity_NameOfColor theName, + const Quantity_TypeOfColor theType); +private: - Standard_ShortReal MyRed; - Standard_ShortReal MyGreen; - Standard_ShortReal MyBlue; + NCollection_Vec3 myRgb; }; diff -Nru opencascade-7.4.1+dfsg1/src/Quantity/Quantity_ColorRGBA.cxx opencascade-7.5.1+dfsg1/src/Quantity/Quantity_ColorRGBA.cxx --- opencascade-7.4.1+dfsg1/src/Quantity/Quantity_ColorRGBA.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Quantity/Quantity_ColorRGBA.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,7 +15,7 @@ #include -#include +#include #include #include @@ -44,7 +44,7 @@ const ColorInteger theColorComponentBase) { Standard_ASSERT_RETURN (theColorComponentBase >= 2, - __FUNCTION__ ": 'theColorComponentBase' must be greater than 1.", + "'theColorComponentBase' must be greater than 1.", 0.0f); const ColorInteger aColorComponentMaxValue = theColorComponentBase - 1; const ColorInteger aColorComponentAsInteger = theColorInteger % theColorComponentBase; @@ -67,9 +67,9 @@ Quantity_ColorRGBA& theColor) { Standard_ASSERT_RETURN (theColorComponentBase >= 2, - __FUNCTION__ ": 'theColorComponentBase' must be greater than 1.", + "'theColorComponentBase' must be greater than 1.", 0.0f); - Graphic3d_Vec4 aColor (1.0f); + NCollection_Vec4 aColor (1.0f); if (hasAlphaComponent) { const Standard_ShortReal anAlphaComponent = takeColorComponentFromInteger (theColorInteger, @@ -79,7 +79,7 @@ for (Standard_Integer aColorComponentIndex = 2; aColorComponentIndex >= 0; --aColorComponentIndex) { const Standard_ShortReal aColorComponent = takeColorComponentFromInteger (theColorInteger, theColorComponentBase); - aColor[aColorComponentIndex] = aColorComponent; + aColor[aColorComponentIndex] = Quantity_Color::Convert_sRGB_To_LinearRGB (aColorComponent); } if (theColorInteger != 0) { @@ -204,10 +204,22 @@ //function : DumpJson //purpose : //======================================================================= -void Quantity_ColorRGBA::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void Quantity_ColorRGBA::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, Quantity_ColorRGBA); + OCCT_DUMP_FIELD_VALUES_NUMERICAL (theOStream, "RGBA", 4, myRgb.Red(), myRgb.Green(), myRgb.Blue(), myAlpha) +} + +//======================================================================= +//function : InitFromJson +//purpose : +//======================================================================= +Standard_Boolean Quantity_ColorRGBA::InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos) +{ + Standard_Integer aPos = theStreamPos; + + Standard_Real aRed, aGreen, aBlue, anAlpha; + OCCT_INIT_VECTOR_CLASS (Standard_Dump::Text (theSStream), "RGBA", aPos, 4, &aRed, &aGreen, &aBlue, &anAlpha) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myRgb); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAlpha); + SetValues ((Standard_ShortReal)aRed, (Standard_ShortReal)aGreen, (Standard_ShortReal)aBlue, (Standard_ShortReal)anAlpha); + return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/src/Quantity/Quantity_ColorRGBA.hxx opencascade-7.5.1+dfsg1/src/Quantity/Quantity_ColorRGBA.hxx --- opencascade-7.4.1+dfsg1/src/Quantity/Quantity_ColorRGBA.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Quantity/Quantity_ColorRGBA.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -91,10 +91,10 @@ //! Two colors are considered to be equal if their distance is no greater than Epsilon(). bool operator== (const Quantity_ColorRGBA& theOther) const { return IsEqual (theOther); } +public: + //! Finds color from predefined names. - //! For example, the name of the color which - //! corresponds to "BLACK" is Quantity_NOC_BLACK. - //! Returns false if name is unknown. + //! For example, the name of the color which corresponds to "BLACK" is Quantity_NOC_BLACK. //! An alpha component is set to 1.0. //! @param theColorNameString the color name //! @param theColor a found color @@ -110,7 +110,7 @@ return true; } - //! Parses the string as a hex color (like "#FF0" for short RGB color, "#FF0F" for short RGBA color, + //! Parses the string as a hex color (like "#FF0" for short sRGB color, "#FF0F" for short sRGBA color, //! "#FFFF00" for RGB color, or "#FFFF00FF" for RGBA color) //! @param theHexColorString the string to be parsed //! @param theColor a color that is a result of parsing @@ -125,7 +125,7 @@ static TCollection_AsciiString ColorToHex (const Quantity_ColorRGBA& theColor, const bool theToPrefixHash = true) { - NCollection_Vec4 anSRgb = (NCollection_Vec4 )theColor; + NCollection_Vec4 anSRgb = Convert_LinearRGB_To_sRGB ((NCollection_Vec4 )theColor); NCollection_Vec4 anSRgbInt (anSRgb * 255.0f + NCollection_Vec4 (0.5f)); char aBuff[12]; Sprintf (aBuff, theToPrefixHash ? "#%02X%02X%02X%02X" : "%02X%02X%02X%02X", @@ -133,8 +133,33 @@ return aBuff; } +public: + + //! Convert linear RGB components into sRGB using OpenGL specs formula. + static NCollection_Vec4 Convert_LinearRGB_To_sRGB (const NCollection_Vec4& theRGB) + { + return NCollection_Vec4 (Quantity_Color::Convert_LinearRGB_To_sRGB (theRGB.r()), + Quantity_Color::Convert_LinearRGB_To_sRGB (theRGB.g()), + Quantity_Color::Convert_LinearRGB_To_sRGB (theRGB.b()), + theRGB.a()); + } + + //! Convert sRGB components into linear RGB using OpenGL specs formula. + static NCollection_Vec4 Convert_sRGB_To_LinearRGB (const NCollection_Vec4& theRGB) + { + return NCollection_Vec4 (Quantity_Color::Convert_sRGB_To_LinearRGB (theRGB.r()), + Quantity_Color::Convert_sRGB_To_LinearRGB (theRGB.g()), + Quantity_Color::Convert_sRGB_To_LinearRGB (theRGB.b()), + theRGB.a()); + } + +public: + //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + + //! Inits the content of me from the stream + Standard_EXPORT Standard_Boolean InitFromJson (const Standard_SStream& theSStream, Standard_Integer& theStreamPos); private: diff -Nru opencascade-7.4.1+dfsg1/src/Quantity/Quantity_ColorTable.pxx opencascade-7.5.1+dfsg1/src/Quantity/Quantity_ColorTable.pxx --- opencascade-7.4.1+dfsg1/src/Quantity/Quantity_ColorTable.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Quantity/Quantity_ColorTable.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,509 @@ +RawColor(BLACK , sRGB, 0x000000, 0.000000, 0.000000, 0.000000, RGB, 0.000000, 0.000000, 0.000000), +RawColor(MATRABLUE , sRGB, 0x0000BF, 0.000000, 0.000000, 0.750000, RGB, 0.000000, 0.000000, 0.522522), +RawColor(MATRAGRAY , sRGB, 0x999999, 0.600000, 0.600000, 0.600000, RGB, 0.318547, 0.318547, 0.318547), +RawColor(ALICEBLUE , sRGB, 0xF0F8FF, 0.941176, 0.972549, 1.000000, RGB, 0.871366, 0.938686, 1.000000), +RawColor(ANTIQUEWHITE , sRGB, 0xFAEBD7, 0.980392, 0.921569, 0.843137, RGB, 0.955973, 0.830771, 0.679542), +RawColor(ANTIQUEWHITE1 , sRGB, 0xFFEFDB, 1.000000, 0.937255, 0.858824, RGB, 1.000000, 0.863158, 0.708377), +RawColor(ANTIQUEWHITE2 , sRGB, 0xEEDFCC, 0.933333, 0.874510, 0.800000, RGB, 0.854992, 0.737911, 0.603827), +RawColor(ANTIQUEWHITE3 , sRGB, 0xCDC0B0, 0.803922, 0.752941, 0.690196, RGB, 0.610496, 0.527115, 0.434154), +RawColor(ANTIQUEWHITE4 , sRGB, 0x8B8378, 0.545098, 0.513725, 0.470588, RGB, 0.258183, 0.226965, 0.187821), +RawColor(AQUAMARINE1 , sRGB, 0x7FFFD4, 0.498039, 1.000000, 0.831373, RGB, 0.212231, 1.000000, 0.658376), +RawColor(AQUAMARINE2 , sRGB, 0x76EEC6, 0.462745, 0.933333, 0.776471, RGB, 0.181164, 0.854992, 0.564712), +RawColor(AQUAMARINE4 , sRGB, 0x458B74, 0.270588, 0.545098, 0.454902, RGB, 0.059511, 0.258183, 0.174647), +RawColor(AZURE , sRGB, 0xF0FFFF, 0.941176, 1.000000, 1.000000, RGB, 0.871366, 1.000000, 1.000000), +RawColor(AZURE2 , sRGB, 0xE0EEEE, 0.878431, 0.933333, 0.933333, RGB, 0.745404, 0.854992, 0.854992), +RawColor(AZURE3 , sRGB, 0xC1CDCD, 0.756863, 0.803922, 0.803922, RGB, 0.533277, 0.610496, 0.610496), +RawColor(AZURE4 , sRGB, 0x838B8B, 0.513725, 0.545098, 0.545098, RGB, 0.226965, 0.258183, 0.258183), +RawColor(BEIGE , sRGB, 0xF5F5DC, 0.960784, 0.960784, 0.862745, RGB, 0.913098, 0.913098, 0.715693), +RawColor(BISQUE , sRGB, 0xFFE4C4, 1.000000, 0.894118, 0.768627, RGB, 1.000000, 0.775823, 0.552011), +RawColor(BISQUE2 , sRGB, 0xEED5B7, 0.933333, 0.835294, 0.717647, RGB, 0.854992, 0.665387, 0.473531), +RawColor(BISQUE3 , sRGB, 0xCDB79E, 0.803922, 0.717647, 0.619608, RGB, 0.610496, 0.473531, 0.341915), +RawColor(BISQUE4 , sRGB, 0x8B7D6B, 0.545098, 0.490196, 0.419608, RGB, 0.258183, 0.205079, 0.147027), +RawColor(BLANCHEDALMOND , sRGB, 0xFFEBCD, 1.000000, 0.921569, 0.803922, RGB, 1.000000, 0.830771, 0.610496), +RawColor(BLUE , sRGB, 0x0000FF, 0.000000, 0.000000, 1.000000, RGB, 0.000000, 0.000000, 1.000000), +RawColor(BLUE2 , sRGB, 0x0000EE, 0.000000, 0.000000, 0.933333, RGB, 0.000000, 0.000000, 0.854992), +RawColor(BLUE3 , sRGB, 0x0000CD, 0.000000, 0.000000, 0.803922, RGB, 0.000000, 0.000000, 0.610496), +RawColor(BLUE4 , sRGB, 0x00008B, 0.000000, 0.000000, 0.545098, RGB, 0.000000, 0.000000, 0.258183), +RawColor(BLUEVIOLET , sRGB, 0x8A2BE2, 0.541176, 0.168627, 0.886275, RGB, 0.254152, 0.024158, 0.760525), +RawColor(BROWN , sRGB, 0xA52A2A, 0.647059, 0.164706, 0.164706, RGB, 0.376262, 0.023153, 0.023153), +RawColor(BROWN1 , sRGB, 0xFF4040, 1.000000, 0.250980, 0.250980, RGB, 1.000000, 0.051269, 0.051269), +RawColor(BROWN2 , sRGB, 0xEE3B3B, 0.933333, 0.231373, 0.231373, RGB, 0.854992, 0.043735, 0.043735), +RawColor(BROWN3 , sRGB, 0xCD3333, 0.803922, 0.200000, 0.200000, RGB, 0.610496, 0.033105, 0.033105), +RawColor(BROWN4 , sRGB, 0x8B2323, 0.545098, 0.137255, 0.137255, RGB, 0.258183, 0.016807, 0.016807), +RawColor(BURLYWOOD , sRGB, 0xDEB887, 0.870588, 0.721569, 0.529412, RGB, 0.730460, 0.479321, 0.242281), +RawColor(BURLYWOOD1 , sRGB, 0xFFD39B, 1.000000, 0.827451, 0.607843, RGB, 1.000000, 0.651406, 0.327778), +RawColor(BURLYWOOD2 , sRGB, 0xEEC591, 0.933333, 0.772549, 0.568627, RGB, 0.854992, 0.558340, 0.283148), +RawColor(BURLYWOOD3 , sRGB, 0xCDAA7D, 0.803922, 0.666667, 0.490196, RGB, 0.610496, 0.401978, 0.205079), +RawColor(BURLYWOOD4 , sRGB, 0x8B7355, 0.545098, 0.450980, 0.333333, RGB, 0.258183, 0.171441, 0.090842), +RawColor(CADETBLUE , sRGB, 0x5F9EA0, 0.372549, 0.619608, 0.627451, RGB, 0.114435, 0.341915, 0.351533), +RawColor(CADETBLUE1 , sRGB, 0x98F5FF, 0.596078, 0.960784, 1.000000, RGB, 0.313988, 0.913098, 1.000000), +RawColor(CADETBLUE2 , sRGB, 0x8EE5EE, 0.556863, 0.898039, 0.933333, RGB, 0.270498, 0.783537, 0.854992), +RawColor(CADETBLUE3 , sRGB, 0x7AC5CD, 0.478431, 0.772549, 0.803922, RGB, 0.194617, 0.558340, 0.610496), +RawColor(CADETBLUE4 , sRGB, 0x53868B, 0.325490, 0.525490, 0.545098, RGB, 0.086500, 0.238397, 0.258183), +RawColor(CHARTREUSE , sRGB, 0x7FFF00, 0.498039, 1.000000, 0.000000, RGB, 0.212231, 1.000000, 0.000000), +RawColor(CHARTREUSE2 , sRGB, 0x76EE00, 0.462745, 0.933333, 0.000000, RGB, 0.181164, 0.854992, 0.000000), +RawColor(CHARTREUSE3 , sRGB, 0x66CD00, 0.400000, 0.803922, 0.000000, RGB, 0.132868, 0.610496, 0.000000), +RawColor(CHARTREUSE4 , sRGB, 0x458B00, 0.270588, 0.545098, 0.000000, RGB, 0.059511, 0.258183, 0.000000), +RawColor(CHOCOLATE , sRGB, 0xD2691E, 0.823529, 0.411765, 0.117647, RGB, 0.644479, 0.141264, 0.012983), +RawColor(CHOCOLATE1 , sRGB, 0xFF7F24, 1.000000, 0.498039, 0.141176, RGB, 1.000000, 0.212231, 0.017642), +RawColor(CHOCOLATE2 , sRGB, 0xEE7621, 0.933333, 0.462745, 0.129412, RGB, 0.854992, 0.181164, 0.015209), +RawColor(CHOCOLATE3 , sRGB, 0xCD661D, 0.803922, 0.400000, 0.113725, RGB, 0.610496, 0.132868, 0.012286), +RawColor(CHOCOLATE4 , sRGB, 0x8B4513, 0.545098, 0.270588, 0.074510, RGB, 0.258183, 0.059511, 0.006512), +RawColor(CORAL , sRGB, 0xFF7F50, 1.000000, 0.498039, 0.313725, RGB, 1.000000, 0.212231, 0.080220), +RawColor(CORAL1 , sRGB, 0xFF7256, 1.000000, 0.447059, 0.337255, RGB, 1.000000, 0.168270, 0.093059), +RawColor(CORAL2 , sRGB, 0xEE6A50, 0.933333, 0.415686, 0.313725, RGB, 0.854992, 0.144128, 0.080220), +RawColor(CORAL3 , sRGB, 0xCD5B45, 0.803922, 0.356863, 0.270588, RGB, 0.610496, 0.104617, 0.059511), +RawColor(CORAL4 , sRGB, 0x8B3E2F, 0.545098, 0.243137, 0.184314, RGB, 0.258183, 0.048172, 0.028426), +RawColor(CORNFLOWERBLUE , sRGB, 0x6495ED, 0.392157, 0.584314, 0.929412, RGB, 0.127438, 0.300544, 0.846874), +RawColor(CORNSILK1 , sRGB, 0xFFF8DC, 1.000000, 0.972549, 0.862745, RGB, 1.000000, 0.938686, 0.715693), +RawColor(CORNSILK2 , sRGB, 0xEEE8CD, 0.933333, 0.909804, 0.803922, RGB, 0.854992, 0.806952, 0.610496), +RawColor(CORNSILK3 , sRGB, 0xCDC8B1, 0.803922, 0.784314, 0.694118, RGB, 0.610496, 0.577581, 0.439658), +RawColor(CORNSILK4 , sRGB, 0x8B8878, 0.545098, 0.533333, 0.470588, RGB, 0.258183, 0.246201, 0.187821), +RawColor(CYAN , sRGB, 0x00FFFF, 0.000000, 1.000000, 1.000000, RGB, 0.000000, 1.000000, 1.000000), +RawColor(CYAN2 , sRGB, 0x00EEEE, 0.000000, 0.933333, 0.933333, RGB, 0.000000, 0.854992, 0.854992), +RawColor(CYAN3 , sRGB, 0x00CDCD, 0.000000, 0.803922, 0.803922, RGB, 0.000000, 0.610496, 0.610496), +RawColor(CYAN4 , sRGB, 0x008B8B, 0.000000, 0.545098, 0.545098, RGB, 0.000000, 0.258183, 0.258183), +RawColor(DARKGOLDENROD , sRGB, 0xB8860B, 0.721569, 0.525490, 0.043137, RGB, 0.479321, 0.238397, 0.003347), +RawColor(DARKGOLDENROD1 , sRGB, 0xFFB90F, 1.000000, 0.725490, 0.058824, RGB, 1.000000, 0.485150, 0.004777), +RawColor(DARKGOLDENROD2 , sRGB, 0xEEAD0E, 0.933333, 0.678431, 0.054902, RGB, 0.854992, 0.417885, 0.004391), +RawColor(DARKGOLDENROD3 , sRGB, 0xCD950C, 0.803922, 0.584314, 0.047059, RGB, 0.610496, 0.300544, 0.003677), +RawColor(DARKGOLDENROD4 , sRGB, 0x8B6508, 0.545098, 0.396078, 0.031373, RGB, 0.258183, 0.130136, 0.002428), +RawColor(DARKGREEN , sRGB, 0x006400, 0.000000, 0.392157, 0.000000, RGB, 0.000000, 0.127438, 0.000000), +RawColor(DARKKHAKI , sRGB, 0xBDB76B, 0.741176, 0.717647, 0.419608, RGB, 0.508881, 0.473531, 0.147027), +RawColor(DARKOLIVEGREEN , sRGB, 0x556B2F, 0.333333, 0.419608, 0.184314, RGB, 0.090842, 0.147027, 0.028426), +RawColor(DARKOLIVEGREEN1 , sRGB, 0xCAFF70, 0.792157, 1.000000, 0.439216, RGB, 0.590619, 1.000000, 0.162030), +RawColor(DARKOLIVEGREEN2 , sRGB, 0xBCEE68, 0.737255, 0.933333, 0.407843, RGB, 0.502887, 0.854992, 0.138432), +RawColor(DARKOLIVEGREEN3 , sRGB, 0xA2CD5A, 0.635294, 0.803922, 0.352941, RGB, 0.361307, 0.610496, 0.102242), +RawColor(DARKOLIVEGREEN4 , sRGB, 0x6E8B3D, 0.431373, 0.545098, 0.239216, RGB, 0.155927, 0.258183, 0.046665), +RawColor(DARKORANGE , sRGB, 0xFF8C00, 1.000000, 0.549020, 0.000000, RGB, 1.000000, 0.262251, 0.000000), +RawColor(DARKORANGE1 , sRGB, 0xFF7F00, 1.000000, 0.498039, 0.000000, RGB, 1.000000, 0.212231, 0.000000), +RawColor(DARKORANGE2 , sRGB, 0xEE7600, 0.933333, 0.462745, 0.000000, RGB, 0.854992, 0.181164, 0.000000), +RawColor(DARKORANGE3 , sRGB, 0xCD6600, 0.803922, 0.400000, 0.000000, RGB, 0.610496, 0.132868, 0.000000), +RawColor(DARKORANGE4 , sRGB, 0x8B4500, 0.545098, 0.270588, 0.000000, RGB, 0.258183, 0.059511, 0.000000), +RawColor(DARKORCHID , sRGB, 0x9932CC, 0.600000, 0.196078, 0.800000, RGB, 0.318547, 0.031896, 0.603827), +RawColor(DARKORCHID1 , sRGB, 0xBF3EFF, 0.749020, 0.243137, 1.000000, RGB, 0.520996, 0.048172, 1.000000), +RawColor(DARKORCHID2 , sRGB, 0xB23AEE, 0.698039, 0.227451, 0.933333, RGB, 0.445201, 0.042311, 0.854992), +RawColor(DARKORCHID3 , sRGB, 0x9A32CD, 0.603922, 0.196078, 0.803922, RGB, 0.323144, 0.031896, 0.610496), +RawColor(DARKORCHID4 , sRGB, 0x68228B, 0.407843, 0.133333, 0.545098, RGB, 0.138432, 0.015996, 0.258183), +RawColor(DARKSALMON , sRGB, 0xE9967A, 0.913725, 0.588235, 0.478431, RGB, 0.814846, 0.304987, 0.194617), +RawColor(DARKSEAGREEN , sRGB, 0x8FBC8F, 0.560784, 0.737255, 0.560784, RGB, 0.274677, 0.502887, 0.274677), +RawColor(DARKSEAGREEN1 , sRGB, 0xC1FFC1, 0.756863, 1.000000, 0.756863, RGB, 0.533277, 1.000000, 0.533277), +RawColor(DARKSEAGREEN2 , sRGB, 0xB4EEB4, 0.705882, 0.933333, 0.705882, RGB, 0.456411, 0.854992, 0.456411), +RawColor(DARKSEAGREEN3 , sRGB, 0x9BCD9B, 0.607843, 0.803922, 0.607843, RGB, 0.327778, 0.610496, 0.327778), +RawColor(DARKSEAGREEN4 , sRGB, 0x698B69, 0.411765, 0.545098, 0.411765, RGB, 0.141264, 0.258183, 0.141264), +RawColor(DARKSLATEBLUE , sRGB, 0x483D8B, 0.282353, 0.239216, 0.545098, RGB, 0.064803, 0.046665, 0.258183), +RawColor(DARKSLATEGRAY1 , sRGB, 0x97FFFF, 0.592157, 1.000000, 1.000000, RGB, 0.309469, 1.000000, 1.000000), +RawColor(DARKSLATEGRAY2 , sRGB, 0x8DEEEE, 0.552941, 0.933333, 0.933333, RGB, 0.266355, 0.854992, 0.854992), +RawColor(DARKSLATEGRAY3 , sRGB, 0x79CDCD, 0.474510, 0.803922, 0.803922, RGB, 0.191202, 0.610496, 0.610496), +RawColor(DARKSLATEGRAY4 , sRGB, 0x528B8B, 0.321569, 0.545098, 0.545098, RGB, 0.084376, 0.258183, 0.258183), +RawColor(DARKSLATEGRAY , sRGB, 0x2F4F4F, 0.184314, 0.309804, 0.309804, RGB, 0.028426, 0.078187, 0.078187), +RawColor(DARKTURQUOISE , sRGB, 0x00CED1, 0.000000, 0.807843, 0.819608, RGB, 0.000000, 0.617206, 0.637597), +RawColor(DARKVIOLET , sRGB, 0x9400D3, 0.580392, 0.000000, 0.827451, RGB, 0.296138, 0.000000, 0.651406), +RawColor(DEEPPINK , sRGB, 0xFF1493, 1.000000, 0.078431, 0.576471, RGB, 1.000000, 0.006995, 0.291771), +RawColor(DEEPPINK2 , sRGB, 0xEE1289, 0.933333, 0.070588, 0.537255, RGB, 0.854992, 0.006049, 0.250158), +RawColor(DEEPPINK3 , sRGB, 0xCD1076, 0.803922, 0.062745, 0.462745, RGB, 0.610496, 0.005182, 0.181164), +RawColor(DEEPPINK4 , sRGB, 0x8B0A50, 0.545098, 0.039216, 0.313725, RGB, 0.258183, 0.003035, 0.080220), +RawColor(DEEPSKYBLUE1 , sRGB, 0x00BFFF, 0.000000, 0.749020, 1.000000, RGB, 0.000000, 0.520996, 1.000000), +RawColor(DEEPSKYBLUE2 , sRGB, 0x00B2EE, 0.000000, 0.698039, 0.933333, RGB, 0.000000, 0.445201, 0.854992), +RawColor(DEEPSKYBLUE3 , sRGB, 0x009ACD, 0.000000, 0.603922, 0.803922, RGB, 0.000000, 0.323144, 0.610496), +RawColor(DEEPSKYBLUE4 , sRGB, 0x00688B, 0.000000, 0.407843, 0.545098, RGB, 0.000000, 0.138432, 0.258183), +RawColor(DODGERBLUE1 , sRGB, 0x1E90FF, 0.117647, 0.564706, 1.000000, RGB, 0.012983, 0.278894, 1.000000), +RawColor(DODGERBLUE2 , sRGB, 0x1C86EE, 0.109804, 0.525490, 0.933333, RGB, 0.011612, 0.238397, 0.854992), +RawColor(DODGERBLUE3 , sRGB, 0x1874CD, 0.094118, 0.454902, 0.803922, RGB, 0.009134, 0.174647, 0.610496), +RawColor(DODGERBLUE4 , sRGB, 0x104E8B, 0.062745, 0.305882, 0.545098, RGB, 0.005182, 0.076185, 0.258183), +RawColor(FIREBRICK , sRGB, 0xB22222, 0.698039, 0.133333, 0.133333, RGB, 0.445201, 0.015996, 0.015996), +RawColor(FIREBRICK1 , sRGB, 0xFF3030, 1.000000, 0.188235, 0.188235, RGB, 1.000000, 0.029557, 0.029557), +RawColor(FIREBRICK2 , sRGB, 0xEE2C2C, 0.933333, 0.172549, 0.172549, RGB, 0.854992, 0.025187, 0.025187), +RawColor(FIREBRICK3 , sRGB, 0xCD2626, 0.803922, 0.149020, 0.149020, RGB, 0.610496, 0.019382, 0.019382), +RawColor(FIREBRICK4 , sRGB, 0x8B1A1A, 0.545098, 0.101961, 0.101961, RGB, 0.258183, 0.010330, 0.010330), +RawColor(FLORALWHITE , sRGB, 0xFFFAF0, 1.000000, 0.980392, 0.941176, RGB, 1.000000, 0.955973, 0.871366), +RawColor(FORESTGREEN , sRGB, 0x228B22, 0.133333, 0.545098, 0.133333, RGB, 0.015996, 0.258183, 0.015996), +RawColor(GAINSBORO , sRGB, 0xDCDCDC, 0.862745, 0.862745, 0.862745, RGB, 0.715693, 0.715693, 0.715693), +RawColor(GHOSTWHITE , sRGB, 0xF8F8FF, 0.972549, 0.972549, 1.000000, RGB, 0.938686, 0.938686, 1.000000), +RawColor(GOLD , sRGB, 0xFFD700, 1.000000, 0.843137, 0.000000, RGB, 1.000000, 0.679542, 0.000000), +RawColor(GOLD2 , sRGB, 0xEEC900, 0.933333, 0.788235, 0.000000, RGB, 0.854992, 0.584078, 0.000000), +RawColor(GOLD3 , sRGB, 0xCDAD00, 0.803922, 0.678431, 0.000000, RGB, 0.610496, 0.417885, 0.000000), +RawColor(GOLD4 , sRGB, 0x8B7500, 0.545098, 0.458824, 0.000000, RGB, 0.258183, 0.177889, 0.000000), +RawColor(GOLDENROD , sRGB, 0xDAA520, 0.854902, 0.647059, 0.125490, RGB, 0.701102, 0.376262, 0.014444), +RawColor(GOLDENROD1 , sRGB, 0xFFC125, 1.000000, 0.756863, 0.145098, RGB, 1.000000, 0.533277, 0.018500), +RawColor(GOLDENROD2 , sRGB, 0xEEB422, 0.933333, 0.705882, 0.133333, RGB, 0.854992, 0.456411, 0.015996), +RawColor(GOLDENROD3 , sRGB, 0xCD9B1D, 0.803922, 0.607843, 0.113725, RGB, 0.610496, 0.327778, 0.012286), +RawColor(GOLDENROD4 , sRGB, 0x8B6914, 0.545098, 0.411765, 0.078431, RGB, 0.258183, 0.141264, 0.006995), +RawColor(GRAY , sRGB, 0xC0C0C0, 0.752941, 0.752941, 0.752941, RGB, 0.527115, 0.527115, 0.527115), +RawColor(GRAY0 , sRGB, 0x000000, 0.000000, 0.000000, 0.000000, RGB, 0.000000, 0.000000, 0.000000), +RawColor(GRAY1 , sRGB, 0x030303, 0.011765, 0.011765, 0.011765, RGB, 0.000911, 0.000911, 0.000911), +RawColor(GRAY2 , sRGB, 0x050505, 0.019608, 0.019608, 0.019608, RGB, 0.001518, 0.001518, 0.001518), +RawColor(GRAY3 , sRGB, 0x080808, 0.031373, 0.031373, 0.031373, RGB, 0.002428, 0.002428, 0.002428), +RawColor(GRAY4 , sRGB, 0x0A0A0A, 0.039216, 0.039216, 0.039216, RGB, 0.003035, 0.003035, 0.003035), +RawColor(GRAY5 , sRGB, 0x0D0D0D, 0.050980, 0.050980, 0.050980, RGB, 0.004025, 0.004025, 0.004025), +RawColor(GRAY6 , sRGB, 0x0F0F0F, 0.058824, 0.058824, 0.058824, RGB, 0.004777, 0.004777, 0.004777), +RawColor(GRAY7 , sRGB, 0x121212, 0.070588, 0.070588, 0.070588, RGB, 0.006049, 0.006049, 0.006049), +RawColor(GRAY8 , sRGB, 0x141414, 0.078431, 0.078431, 0.078431, RGB, 0.006995, 0.006995, 0.006995), +RawColor(GRAY9 , sRGB, 0x171717, 0.090196, 0.090196, 0.090196, RGB, 0.008568, 0.008568, 0.008568), +RawColor(GRAY10 , sRGB, 0x1A1A1A, 0.101961, 0.101961, 0.101961, RGB, 0.010330, 0.010330, 0.010330), +RawColor(GRAY11 , sRGB, 0x1C1C1C, 0.109804, 0.109804, 0.109804, RGB, 0.011612, 0.011612, 0.011612), +RawColor(GRAY12 , sRGB, 0x1F1F1F, 0.121569, 0.121569, 0.121569, RGB, 0.013702, 0.013702, 0.013702), +RawColor(GRAY13 , sRGB, 0x212121, 0.129412, 0.129412, 0.129412, RGB, 0.015209, 0.015209, 0.015209), +RawColor(GRAY14 , sRGB, 0x242424, 0.141176, 0.141176, 0.141176, RGB, 0.017642, 0.017642, 0.017642), +RawColor(GRAY15 , sRGB, 0x262626, 0.149020, 0.149020, 0.149020, RGB, 0.019382, 0.019382, 0.019382), +RawColor(GRAY16 , sRGB, 0x292929, 0.160784, 0.160784, 0.160784, RGB, 0.022174, 0.022174, 0.022174), +RawColor(GRAY17 , sRGB, 0x2B2B2B, 0.168627, 0.168627, 0.168627, RGB, 0.024158, 0.024158, 0.024158), +RawColor(GRAY18 , sRGB, 0x2E2E2E, 0.180392, 0.180392, 0.180392, RGB, 0.027321, 0.027321, 0.027321), +RawColor(GRAY19 , sRGB, 0x303030, 0.188235, 0.188235, 0.188235, RGB, 0.029557, 0.029557, 0.029557), +RawColor(GRAY20 , sRGB, 0x333333, 0.200000, 0.200000, 0.200000, RGB, 0.033105, 0.033105, 0.033105), +RawColor(GRAY21 , sRGB, 0x363636, 0.211765, 0.211765, 0.211765, RGB, 0.036890, 0.036890, 0.036890), +RawColor(GRAY22 , sRGB, 0x383838, 0.219608, 0.219608, 0.219608, RGB, 0.039546, 0.039546, 0.039546), +RawColor(GRAY23 , sRGB, 0x3B3B3B, 0.231373, 0.231373, 0.231373, RGB, 0.043735, 0.043735, 0.043735), +RawColor(GRAY24 , sRGB, 0x3D3D3D, 0.239216, 0.239216, 0.239216, RGB, 0.046665, 0.046665, 0.046665), +RawColor(GRAY25 , sRGB, 0x404040, 0.250980, 0.250980, 0.250980, RGB, 0.051269, 0.051269, 0.051269), +RawColor(GRAY26 , sRGB, 0x424242, 0.258824, 0.258824, 0.258824, RGB, 0.054480, 0.054480, 0.054480), +RawColor(GRAY27 , sRGB, 0x454545, 0.270588, 0.270588, 0.270588, RGB, 0.059511, 0.059511, 0.059511), +RawColor(GRAY28 , sRGB, 0x474747, 0.278431, 0.278431, 0.278431, RGB, 0.063010, 0.063010, 0.063010), +RawColor(GRAY29 , sRGB, 0x4A4A4A, 0.290196, 0.290196, 0.290196, RGB, 0.068478, 0.068478, 0.068478), +RawColor(GRAY30 , sRGB, 0x4D4D4D, 0.301961, 0.301961, 0.301961, RGB, 0.074214, 0.074214, 0.074214), +RawColor(GRAY31 , sRGB, 0x4F4F4F, 0.309804, 0.309804, 0.309804, RGB, 0.078187, 0.078187, 0.078187), +RawColor(GRAY32 , sRGB, 0x525252, 0.321569, 0.321569, 0.321569, RGB, 0.084376, 0.084376, 0.084376), +RawColor(GRAY33 , sRGB, 0x545454, 0.329412, 0.329412, 0.329412, RGB, 0.088656, 0.088656, 0.088656), +RawColor(GRAY34 , sRGB, 0x575757, 0.341176, 0.341176, 0.341176, RGB, 0.095307, 0.095307, 0.095307), +RawColor(GRAY35 , sRGB, 0x595959, 0.349020, 0.349020, 0.349020, RGB, 0.099899, 0.099899, 0.099899), +RawColor(GRAY36 , sRGB, 0x5C5C5C, 0.360784, 0.360784, 0.360784, RGB, 0.107023, 0.107023, 0.107023), +RawColor(GRAY37 , sRGB, 0x5E5E5E, 0.368627, 0.368627, 0.368627, RGB, 0.111932, 0.111932, 0.111932), +RawColor(GRAY38 , sRGB, 0x616161, 0.380392, 0.380392, 0.380392, RGB, 0.119538, 0.119538, 0.119538), +RawColor(GRAY39 , sRGB, 0x636363, 0.388235, 0.388235, 0.388235, RGB, 0.124772, 0.124772, 0.124772), +RawColor(GRAY40 , sRGB, 0x666666, 0.400000, 0.400000, 0.400000, RGB, 0.132868, 0.132868, 0.132868), +RawColor(GRAY41 , sRGB, 0x696969, 0.411765, 0.411765, 0.411765, RGB, 0.141264, 0.141264, 0.141264), +RawColor(GRAY42 , sRGB, 0x6B6B6B, 0.419608, 0.419608, 0.419608, RGB, 0.147027, 0.147027, 0.147027), +RawColor(GRAY43 , sRGB, 0x6E6E6E, 0.431373, 0.431373, 0.431373, RGB, 0.155927, 0.155927, 0.155927), +RawColor(GRAY44 , sRGB, 0x707070, 0.439216, 0.439216, 0.439216, RGB, 0.162030, 0.162030, 0.162030), +RawColor(GRAY45 , sRGB, 0x737373, 0.450980, 0.450980, 0.450980, RGB, 0.171441, 0.171441, 0.171441), +RawColor(GRAY46 , sRGB, 0x757575, 0.458824, 0.458824, 0.458824, RGB, 0.177889, 0.177889, 0.177889), +RawColor(GRAY47 , sRGB, 0x787878, 0.470588, 0.470588, 0.470588, RGB, 0.187821, 0.187821, 0.187821), +RawColor(GRAY48 , sRGB, 0x7A7A7A, 0.478431, 0.478431, 0.478431, RGB, 0.194617, 0.194617, 0.194617), +RawColor(GRAY49 , sRGB, 0x7D7D7D, 0.490196, 0.490196, 0.490196, RGB, 0.205079, 0.205079, 0.205079), +RawColor(GRAY50 , sRGB, 0x7F7F7F, 0.498039, 0.498039, 0.498039, RGB, 0.212231, 0.212231, 0.212231), +RawColor(GRAY51 , sRGB, 0x828282, 0.509804, 0.509804, 0.509804, RGB, 0.223228, 0.223228, 0.223228), +RawColor(GRAY52 , sRGB, 0x858585, 0.521569, 0.521569, 0.521569, RGB, 0.234551, 0.234551, 0.234551), +RawColor(GRAY53 , sRGB, 0x878787, 0.529412, 0.529412, 0.529412, RGB, 0.242281, 0.242281, 0.242281), +RawColor(GRAY54 , sRGB, 0x8A8A8A, 0.541176, 0.541176, 0.541176, RGB, 0.254152, 0.254152, 0.254152), +RawColor(GRAY55 , sRGB, 0x8C8C8C, 0.549020, 0.549020, 0.549020, RGB, 0.262251, 0.262251, 0.262251), +RawColor(GRAY56 , sRGB, 0x8F8F8F, 0.560784, 0.560784, 0.560784, RGB, 0.274677, 0.274677, 0.274677), +RawColor(GRAY57 , sRGB, 0x919191, 0.568627, 0.568627, 0.568627, RGB, 0.283148, 0.283148, 0.283148), +RawColor(GRAY58 , sRGB, 0x949494, 0.580392, 0.580392, 0.580392, RGB, 0.296138, 0.296138, 0.296138), +RawColor(GRAY59 , sRGB, 0x969696, 0.588235, 0.588235, 0.588235, RGB, 0.304987, 0.304987, 0.304987), +RawColor(GRAY60 , sRGB, 0x999999, 0.600000, 0.600000, 0.600000, RGB, 0.318547, 0.318547, 0.318547), +RawColor(GRAY61 , sRGB, 0x9C9C9C, 0.611765, 0.611765, 0.611765, RGB, 0.332452, 0.332452, 0.332452), +RawColor(GRAY62 , sRGB, 0x9E9E9E, 0.619608, 0.619608, 0.619608, RGB, 0.341915, 0.341915, 0.341915), +RawColor(GRAY63 , sRGB, 0xA1A1A1, 0.631373, 0.631373, 0.631373, RGB, 0.356401, 0.356401, 0.356401), +RawColor(GRAY64 , sRGB, 0xA3A3A3, 0.639216, 0.639216, 0.639216, RGB, 0.366253, 0.366253, 0.366253), +RawColor(GRAY65 , sRGB, 0xA6A6A6, 0.650980, 0.650980, 0.650980, RGB, 0.381326, 0.381326, 0.381326), +RawColor(GRAY66 , sRGB, 0xA8A8A8, 0.658824, 0.658824, 0.658824, RGB, 0.391573, 0.391573, 0.391573), +RawColor(GRAY67 , sRGB, 0xABABAB, 0.670588, 0.670588, 0.670588, RGB, 0.407240, 0.407240, 0.407240), +RawColor(GRAY68 , sRGB, 0xADADAD, 0.678431, 0.678431, 0.678431, RGB, 0.417885, 0.417885, 0.417885), +RawColor(GRAY69 , sRGB, 0xB0B0B0, 0.690196, 0.690196, 0.690196, RGB, 0.434154, 0.434154, 0.434154), +RawColor(GRAY70 , sRGB, 0xB3B3B3, 0.701961, 0.701961, 0.701961, RGB, 0.450786, 0.450786, 0.450786), +RawColor(GRAY71 , sRGB, 0xB5B5B5, 0.709804, 0.709804, 0.709804, RGB, 0.462077, 0.462077, 0.462077), +RawColor(GRAY72 , sRGB, 0xB8B8B8, 0.721569, 0.721569, 0.721569, RGB, 0.479321, 0.479321, 0.479321), +RawColor(GRAY73 , sRGB, 0xBABABA, 0.729412, 0.729412, 0.729412, RGB, 0.491021, 0.491021, 0.491021), +RawColor(GRAY74 , sRGB, 0xBDBDBD, 0.741176, 0.741176, 0.741176, RGB, 0.508881, 0.508881, 0.508881), +RawColor(GRAY75 , sRGB, 0xBFBFBF, 0.749020, 0.749020, 0.749020, RGB, 0.520996, 0.520996, 0.520996), +RawColor(GRAY76 , sRGB, 0xC2C2C2, 0.760784, 0.760784, 0.760784, RGB, 0.539479, 0.539479, 0.539479), +RawColor(GRAY77 , sRGB, 0xC4C4C4, 0.768627, 0.768627, 0.768627, RGB, 0.552011, 0.552011, 0.552011), +RawColor(GRAY78 , sRGB, 0xC7C7C7, 0.780392, 0.780392, 0.780392, RGB, 0.571125, 0.571125, 0.571125), +RawColor(GRAY79 , sRGB, 0xC9C9C9, 0.788235, 0.788235, 0.788235, RGB, 0.584078, 0.584078, 0.584078), +RawColor(GRAY80 , sRGB, 0xCCCCCC, 0.800000, 0.800000, 0.800000, RGB, 0.603827, 0.603827, 0.603827), +RawColor(GRAY81 , sRGB, 0xCFCFCF, 0.811765, 0.811765, 0.811765, RGB, 0.623961, 0.623961, 0.623961), +RawColor(GRAY82 , sRGB, 0xD1D1D1, 0.819608, 0.819608, 0.819608, RGB, 0.637597, 0.637597, 0.637597), +RawColor(GRAY83 , sRGB, 0xD4D4D4, 0.831373, 0.831373, 0.831373, RGB, 0.658376, 0.658376, 0.658376), +RawColor(GRAY85 , sRGB, 0xD9D9D9, 0.850980, 0.850980, 0.850980, RGB, 0.693871, 0.693871, 0.693871), +RawColor(GRAY86 , sRGB, 0xDBDBDB, 0.858824, 0.858824, 0.858824, RGB, 0.708377, 0.708377, 0.708377), +RawColor(GRAY87 , sRGB, 0xDEDEDE, 0.870588, 0.870588, 0.870588, RGB, 0.730460, 0.730460, 0.730460), +RawColor(GRAY88 , sRGB, 0xE0E0E0, 0.878431, 0.878431, 0.878431, RGB, 0.745404, 0.745404, 0.745404), +RawColor(GRAY89 , sRGB, 0xE3E3E3, 0.890196, 0.890196, 0.890196, RGB, 0.768151, 0.768151, 0.768151), +RawColor(GRAY90 , sRGB, 0xE5E5E5, 0.898039, 0.898039, 0.898039, RGB, 0.783537, 0.783537, 0.783537), +RawColor(GRAY91 , sRGB, 0xE8E8E8, 0.909804, 0.909804, 0.909804, RGB, 0.806952, 0.806952, 0.806952), +RawColor(GRAY92 , sRGB, 0xEBEBEB, 0.921569, 0.921569, 0.921569, RGB, 0.830771, 0.830771, 0.830771), +RawColor(GRAY93 , sRGB, 0xEDEDED, 0.929412, 0.929412, 0.929412, RGB, 0.846874, 0.846874, 0.846874), +RawColor(GRAY94 , sRGB, 0xF0F0F0, 0.941176, 0.941176, 0.941176, RGB, 0.871366, 0.871366, 0.871366), +RawColor(GRAY95 , sRGB, 0xF2F2F2, 0.949020, 0.949020, 0.949020, RGB, 0.887924, 0.887924, 0.887924), +RawColor(GRAY97 , sRGB, 0xF7F7F7, 0.968627, 0.968627, 0.968627, RGB, 0.930110, 0.930110, 0.930110), +RawColor(GRAY98 , sRGB, 0xFAFAFA, 0.980392, 0.980392, 0.980392, RGB, 0.955973, 0.955973, 0.955973), +RawColor(GRAY99 , sRGB, 0xFCFCFC, 0.988235, 0.988235, 0.988235, RGB, 0.973445, 0.973445, 0.973445), +RawColor(GREEN , sRGB, 0x00FF00, 0.000000, 1.000000, 0.000000, RGB, 0.000000, 1.000000, 0.000000), +RawColor(GREEN2 , sRGB, 0x00EE00, 0.000000, 0.933333, 0.000000, RGB, 0.000000, 0.854992, 0.000000), +RawColor(GREEN3 , sRGB, 0x00CD00, 0.000000, 0.803922, 0.000000, RGB, 0.000000, 0.610496, 0.000000), +RawColor(GREEN4 , sRGB, 0x008B00, 0.000000, 0.545098, 0.000000, RGB, 0.000000, 0.258183, 0.000000), +RawColor(GREENYELLOW , sRGB, 0xADFF2F, 0.678431, 1.000000, 0.184314, RGB, 0.417885, 1.000000, 0.028426), +RawColor(HONEYDEW , sRGB, 0xF0FFF0, 0.941176, 1.000000, 0.941176, RGB, 0.871366, 1.000000, 0.871366), +RawColor(HONEYDEW2 , sRGB, 0xE0EEE0, 0.878431, 0.933333, 0.878431, RGB, 0.745404, 0.854992, 0.745404), +RawColor(HONEYDEW3 , sRGB, 0xC1CDC1, 0.756863, 0.803922, 0.756863, RGB, 0.533277, 0.610496, 0.533277), +RawColor(HONEYDEW4 , sRGB, 0x838B83, 0.513725, 0.545098, 0.513725, RGB, 0.226965, 0.258183, 0.226965), +RawColor(HOTPINK , sRGB, 0xFF69B4, 1.000000, 0.411765, 0.705882, RGB, 1.000000, 0.141264, 0.456411), +RawColor(HOTPINK1 , sRGB, 0xFF6EB4, 1.000000, 0.431373, 0.705882, RGB, 1.000000, 0.155927, 0.456411), +RawColor(HOTPINK2 , sRGB, 0xEE6AA7, 0.933333, 0.415686, 0.654902, RGB, 0.854992, 0.144128, 0.386430), +RawColor(HOTPINK3 , sRGB, 0xCD6090, 0.803922, 0.376471, 0.564706, RGB, 0.610496, 0.116971, 0.278894), +RawColor(HOTPINK4 , sRGB, 0x8B3A62, 0.545098, 0.227451, 0.384314, RGB, 0.258183, 0.042311, 0.122139), +RawColor(INDIANRED , sRGB, 0xCD5C5C, 0.803922, 0.360784, 0.360784, RGB, 0.610496, 0.107023, 0.107023), +RawColor(INDIANRED1 , sRGB, 0xFF6A6A, 1.000000, 0.415686, 0.415686, RGB, 1.000000, 0.144128, 0.144128), +RawColor(INDIANRED2 , sRGB, 0xEE6363, 0.933333, 0.388235, 0.388235, RGB, 0.854992, 0.124772, 0.124772), +RawColor(INDIANRED3 , sRGB, 0xCD5555, 0.803922, 0.333333, 0.333333, RGB, 0.610496, 0.090842, 0.090842), +RawColor(INDIANRED4 , sRGB, 0x8B3A3A, 0.545098, 0.227451, 0.227451, RGB, 0.258183, 0.042311, 0.042311), +RawColor(IVORY , sRGB, 0xFFFFF0, 1.000000, 1.000000, 0.941176, RGB, 1.000000, 1.000000, 0.871366), +RawColor(IVORY2 , sRGB, 0xEEEEE0, 0.933333, 0.933333, 0.878431, RGB, 0.854992, 0.854992, 0.745404), +RawColor(IVORY3 , sRGB, 0xCDCDC1, 0.803922, 0.803922, 0.756863, RGB, 0.610496, 0.610496, 0.533277), +RawColor(IVORY4 , sRGB, 0x8B8B83, 0.545098, 0.545098, 0.513725, RGB, 0.258183, 0.258183, 0.226965), +RawColor(KHAKI , sRGB, 0xF0E68C, 0.941176, 0.901961, 0.549020, RGB, 0.871366, 0.791299, 0.262251), +RawColor(KHAKI1 , sRGB, 0xFFF68F, 1.000000, 0.964706, 0.560784, RGB, 1.000000, 0.921582, 0.274677), +RawColor(KHAKI2 , sRGB, 0xEEE685, 0.933333, 0.901961, 0.521569, RGB, 0.854992, 0.791299, 0.234551), +RawColor(KHAKI3 , sRGB, 0xCDC673, 0.803922, 0.776471, 0.450980, RGB, 0.610496, 0.564712, 0.171441), +RawColor(KHAKI4 , sRGB, 0x8B864E, 0.545098, 0.525490, 0.305882, RGB, 0.258183, 0.238397, 0.076185), +RawColor(LAVENDER , sRGB, 0xE6E6FA, 0.901961, 0.901961, 0.980392, RGB, 0.791299, 0.791299, 0.955973), +RawColor(LAVENDERBLUSH1 , sRGB, 0xFFF0F5, 1.000000, 0.941176, 0.960784, RGB, 1.000000, 0.871366, 0.913098), +RawColor(LAVENDERBLUSH2 , sRGB, 0xEEE0E5, 0.933333, 0.878431, 0.898039, RGB, 0.854992, 0.745404, 0.783537), +RawColor(LAVENDERBLUSH3 , sRGB, 0xCDC1C5, 0.803922, 0.756863, 0.772549, RGB, 0.610496, 0.533277, 0.558340), +RawColor(LAVENDERBLUSH4 , sRGB, 0x8B8386, 0.545098, 0.513725, 0.525490, RGB, 0.258183, 0.226965, 0.238397), +RawColor(LAWNGREEN , sRGB, 0x7CFC00, 0.486275, 0.988235, 0.000000, RGB, 0.201557, 0.973445, 0.000000), +RawColor(LEMONCHIFFON1 , sRGB, 0xFFFACD, 1.000000, 0.980392, 0.803922, RGB, 1.000000, 0.955973, 0.610496), +RawColor(LEMONCHIFFON2 , sRGB, 0xEEE9BF, 0.933333, 0.913725, 0.749020, RGB, 0.854992, 0.814846, 0.520996), +RawColor(LEMONCHIFFON3 , sRGB, 0xCDC9A5, 0.803922, 0.788235, 0.647059, RGB, 0.610496, 0.584078, 0.376262), +RawColor(LEMONCHIFFON4 , sRGB, 0x8B8970, 0.545098, 0.537255, 0.439216, RGB, 0.258183, 0.250158, 0.162030), +RawColor(LIGHTBLUE , sRGB, 0xADD8E6, 0.678431, 0.847059, 0.901961, RGB, 0.417885, 0.686686, 0.791299), +RawColor(LIGHTBLUE1 , sRGB, 0xBFEFFF, 0.749020, 0.937255, 1.000000, RGB, 0.520996, 0.863158, 1.000000), +RawColor(LIGHTBLUE2 , sRGB, 0xB2DFEE, 0.698039, 0.874510, 0.933333, RGB, 0.445201, 0.737911, 0.854992), +RawColor(LIGHTBLUE3 , sRGB, 0x9AC0CD, 0.603922, 0.752941, 0.803922, RGB, 0.323144, 0.527115, 0.610496), +RawColor(LIGHTBLUE4 , sRGB, 0x68838B, 0.407843, 0.513725, 0.545098, RGB, 0.138432, 0.226965, 0.258183), +RawColor(LIGHTCORAL , sRGB, 0xF08080, 0.941176, 0.501961, 0.501961, RGB, 0.871366, 0.215861, 0.215861), +RawColor(LIGHTCYAN , sRGB, 0xE0FFFF, 0.878431, 1.000000, 1.000000, RGB, 0.745404, 1.000000, 1.000000), +RawColor(LIGHTCYAN2 , sRGB, 0xD1EEEE, 0.819608, 0.933333, 0.933333, RGB, 0.637597, 0.854992, 0.854992), +RawColor(LIGHTCYAN3 , sRGB, 0xB4CDCD, 0.705882, 0.803922, 0.803922, RGB, 0.456411, 0.610496, 0.610496), +RawColor(LIGHTCYAN4 , sRGB, 0x7A8B8B, 0.478431, 0.545098, 0.545098, RGB, 0.194617, 0.258183, 0.258183), +RawColor(LIGHTGOLDENROD , sRGB, 0xEEDD82, 0.933333, 0.866667, 0.509804, RGB, 0.854992, 0.723056, 0.223228), +RawColor(LIGHTGOLDENROD1 , sRGB, 0xFFEC8B, 1.000000, 0.925490, 0.545098, RGB, 1.000000, 0.838799, 0.258183), +RawColor(LIGHTGOLDENROD2 , sRGB, 0xEEDC82, 0.933333, 0.862745, 0.509804, RGB, 0.854992, 0.715693, 0.223228), +RawColor(LIGHTGOLDENROD3 , sRGB, 0xCDBE70, 0.803922, 0.745098, 0.439216, RGB, 0.610496, 0.514918, 0.162030), +RawColor(LIGHTGOLDENROD4 , sRGB, 0x8B814C, 0.545098, 0.505882, 0.298039, RGB, 0.258183, 0.219526, 0.072272), +RawColor(LIGHTGOLDENRODYELLOW, sRGB, 0xFAFAD2, 0.980392, 0.980392, 0.823529, RGB, 0.955973, 0.955973, 0.644479), +RawColor(LIGHTGRAY , sRGB, 0xD3D3D3, 0.827451, 0.827451, 0.827451, RGB, 0.651406, 0.651406, 0.651406), +RawColor(LIGHTPINK , sRGB, 0xFFB6C1, 1.000000, 0.713725, 0.756863, RGB, 1.000000, 0.467783, 0.533277), +RawColor(LIGHTPINK1 , sRGB, 0xFFAEB9, 1.000000, 0.682353, 0.725490, RGB, 1.000000, 0.423268, 0.485150), +RawColor(LIGHTPINK2 , sRGB, 0xEEA2AD, 0.933333, 0.635294, 0.678431, RGB, 0.854992, 0.361307, 0.417885), +RawColor(LIGHTPINK3 , sRGB, 0xCD8C95, 0.803922, 0.549020, 0.584314, RGB, 0.610496, 0.262251, 0.300544), +RawColor(LIGHTPINK4 , sRGB, 0x8B5F65, 0.545098, 0.372549, 0.396078, RGB, 0.258183, 0.114435, 0.130136), +RawColor(LIGHTSALMON1 , sRGB, 0xFFA07A, 1.000000, 0.627451, 0.478431, RGB, 1.000000, 0.351533, 0.194617), +RawColor(LIGHTSALMON2 , sRGB, 0xEE9572, 0.933333, 0.584314, 0.447059, RGB, 0.854992, 0.300544, 0.168270), +RawColor(LIGHTSALMON3 , sRGB, 0xCD8162, 0.803922, 0.505882, 0.384314, RGB, 0.610496, 0.219526, 0.122139), +RawColor(LIGHTSALMON4 , sRGB, 0x8B5742, 0.545098, 0.341176, 0.258824, RGB, 0.258183, 0.095307, 0.054480), +RawColor(LIGHTSEAGREEN , sRGB, 0x20B2AA, 0.125490, 0.698039, 0.666667, RGB, 0.014444, 0.445201, 0.401978), +RawColor(LIGHTSKYBLUE , sRGB, 0x87CEFA, 0.529412, 0.807843, 0.980392, RGB, 0.242281, 0.617206, 0.955973), +RawColor(LIGHTSKYBLUE1 , sRGB, 0xB0E2FF, 0.690196, 0.886275, 1.000000, RGB, 0.434154, 0.760525, 1.000000), +RawColor(LIGHTSKYBLUE2 , sRGB, 0xA4D3EE, 0.643137, 0.827451, 0.933333, RGB, 0.371237, 0.651406, 0.854992), +RawColor(LIGHTSKYBLUE3 , sRGB, 0x8DB6CD, 0.552941, 0.713725, 0.803922, RGB, 0.266355, 0.467783, 0.610496), +RawColor(LIGHTSKYBLUE4 , sRGB, 0x607B8B, 0.376471, 0.482353, 0.545098, RGB, 0.116971, 0.198069, 0.258183), +RawColor(LIGHTSLATEBLUE , sRGB, 0x8470FF, 0.517647, 0.439216, 1.000000, RGB, 0.230740, 0.162030, 1.000000), +RawColor(LIGHTSLATEGRAY , sRGB, 0x778899, 0.466667, 0.533333, 0.600000, RGB, 0.184475, 0.246201, 0.318547), +RawColor(LIGHTSTEELBLUE , sRGB, 0xB0C4DE, 0.690196, 0.768627, 0.870588, RGB, 0.434154, 0.552011, 0.730460), +RawColor(LIGHTSTEELBLUE1 , sRGB, 0xCAE1FF, 0.792157, 0.882353, 1.000000, RGB, 0.590619, 0.752942, 1.000000), +RawColor(LIGHTSTEELBLUE2 , sRGB, 0xBCD2EE, 0.737255, 0.823529, 0.933333, RGB, 0.502887, 0.644479, 0.854992), +RawColor(LIGHTSTEELBLUE3 , sRGB, 0xA2B5CD, 0.635294, 0.709804, 0.803922, RGB, 0.361307, 0.462077, 0.610496), +RawColor(LIGHTSTEELBLUE4 , sRGB, 0x6E7B8B, 0.431373, 0.482353, 0.545098, RGB, 0.155927, 0.198069, 0.258183), +RawColor(LIGHTYELLOW , sRGB, 0xFFFFE0, 1.000000, 1.000000, 0.878431, RGB, 1.000000, 1.000000, 0.745404), +RawColor(LIGHTYELLOW2 , sRGB, 0xEEEED1, 0.933333, 0.933333, 0.819608, RGB, 0.854992, 0.854992, 0.637597), +RawColor(LIGHTYELLOW3 , sRGB, 0xCDCDB4, 0.803922, 0.803922, 0.705882, RGB, 0.610496, 0.610496, 0.456411), +RawColor(LIGHTYELLOW4 , sRGB, 0x8B8B7A, 0.545098, 0.545098, 0.478431, RGB, 0.258183, 0.258183, 0.194617), +RawColor(LIMEGREEN , sRGB, 0x32CD32, 0.196078, 0.803922, 0.196078, RGB, 0.031896, 0.610496, 0.031896), +RawColor(LINEN , sRGB, 0xFAF0E6, 0.980392, 0.941176, 0.901961, RGB, 0.955973, 0.871366, 0.791299), +RawColor(MAGENTA , sRGB, 0xFF00FF, 1.000000, 0.000000, 1.000000, RGB, 1.000000, 0.000000, 1.000000), +RawColor(MAGENTA2 , sRGB, 0xEE00EE, 0.933333, 0.000000, 0.933333, RGB, 0.854992, 0.000000, 0.854992), +RawColor(MAGENTA3 , sRGB, 0xCD00CD, 0.803922, 0.000000, 0.803922, RGB, 0.610496, 0.000000, 0.610496), +RawColor(MAGENTA4 , sRGB, 0x8B008B, 0.545098, 0.000000, 0.545098, RGB, 0.258183, 0.000000, 0.258183), +RawColor(MAROON , sRGB, 0xB03060, 0.690196, 0.188235, 0.376471, RGB, 0.434154, 0.029557, 0.116971), +RawColor(MAROON1 , sRGB, 0xFF34B3, 1.000000, 0.203922, 0.701961, RGB, 1.000000, 0.034340, 0.450786), +RawColor(MAROON2 , sRGB, 0xEE30A7, 0.933333, 0.188235, 0.654902, RGB, 0.854992, 0.029557, 0.386430), +RawColor(MAROON3 , sRGB, 0xCD2990, 0.803922, 0.160784, 0.564706, RGB, 0.610496, 0.022174, 0.278894), +RawColor(MAROON4 , sRGB, 0x8B1C62, 0.545098, 0.109804, 0.384314, RGB, 0.258183, 0.011612, 0.122139), +RawColor(MEDIUMAQUAMARINE , sRGB, 0x66CDAA, 0.400000, 0.803922, 0.666667, RGB, 0.132868, 0.610496, 0.401978), +RawColor(MEDIUMORCHID , sRGB, 0xBA55D3, 0.729412, 0.333333, 0.827451, RGB, 0.491021, 0.090842, 0.651406), +RawColor(MEDIUMORCHID1 , sRGB, 0xE066FF, 0.878431, 0.400000, 1.000000, RGB, 0.745404, 0.132868, 1.000000), +RawColor(MEDIUMORCHID2 , sRGB, 0xD15FEE, 0.819608, 0.372549, 0.933333, RGB, 0.637597, 0.114435, 0.854992), +RawColor(MEDIUMORCHID3 , sRGB, 0xB452CD, 0.705882, 0.321569, 0.803922, RGB, 0.456411, 0.084376, 0.610496), +RawColor(MEDIUMORCHID4 , sRGB, 0x7A378B, 0.478431, 0.215686, 0.545098, RGB, 0.194617, 0.038204, 0.258183), +RawColor(MEDIUMPURPLE , sRGB, 0x9370DB, 0.576471, 0.439216, 0.858824, RGB, 0.291771, 0.162030, 0.708377), +RawColor(MEDIUMPURPLE1 , sRGB, 0xAB82FF, 0.670588, 0.509804, 1.000000, RGB, 0.407240, 0.223228, 1.000000), +RawColor(MEDIUMPURPLE2 , sRGB, 0x9F79EE, 0.623529, 0.474510, 0.933333, RGB, 0.346704, 0.191202, 0.854992), +RawColor(MEDIUMPURPLE3 , sRGB, 0x8968CD, 0.537255, 0.407843, 0.803922, RGB, 0.250158, 0.138432, 0.610496), +RawColor(MEDIUMPURPLE4 , sRGB, 0x5D478B, 0.364706, 0.278431, 0.545098, RGB, 0.109462, 0.063010, 0.258183), +RawColor(MEDIUMSEAGREEN , sRGB, 0x3CB371, 0.235294, 0.701961, 0.443137, RGB, 0.045186, 0.450786, 0.165132), +RawColor(MEDIUMSLATEBLUE , sRGB, 0x7B68EE, 0.482353, 0.407843, 0.933333, RGB, 0.198069, 0.138432, 0.854992), +RawColor(MEDIUMSPRINGGREEN , sRGB, 0x00FA9A, 0.000000, 0.980392, 0.603922, RGB, 0.000000, 0.955973, 0.323144), +RawColor(MEDIUMTURQUOISE , sRGB, 0x48D1CC, 0.282353, 0.819608, 0.800000, RGB, 0.064803, 0.637597, 0.603827), +RawColor(MEDIUMVIOLETRED , sRGB, 0xC71585, 0.780392, 0.082353, 0.521569, RGB, 0.571125, 0.007499, 0.234551), +RawColor(MIDNIGHTBLUE , sRGB, 0x191970, 0.098039, 0.098039, 0.439216, RGB, 0.009721, 0.009721, 0.162030), +RawColor(MINTCREAM , sRGB, 0xF5FFFA, 0.960784, 1.000000, 0.980392, RGB, 0.913098, 1.000000, 0.955973), +RawColor(MISTYROSE , sRGB, 0xFFE4E1, 1.000000, 0.894118, 0.882353, RGB, 1.000000, 0.775823, 0.752942), +RawColor(MISTYROSE2 , sRGB, 0xEED5D2, 0.933333, 0.835294, 0.823529, RGB, 0.854992, 0.665387, 0.644479), +RawColor(MISTYROSE3 , sRGB, 0xCDB7B5, 0.803922, 0.717647, 0.709804, RGB, 0.610496, 0.473531, 0.462077), +RawColor(MISTYROSE4 , sRGB, 0x8B7D7B, 0.545098, 0.490196, 0.482353, RGB, 0.258183, 0.205079, 0.198069), +RawColor(MOCCASIN , sRGB, 0xFFE4B5, 1.000000, 0.894118, 0.709804, RGB, 1.000000, 0.775823, 0.462077), +RawColor(NAVAJOWHITE1 , sRGB, 0xFFDEAD, 1.000000, 0.870588, 0.678431, RGB, 1.000000, 0.730460, 0.417885), +RawColor(NAVAJOWHITE2 , sRGB, 0xEECFA1, 0.933333, 0.811765, 0.631373, RGB, 0.854992, 0.623961, 0.356401), +RawColor(NAVAJOWHITE3 , sRGB, 0xCDB38B, 0.803922, 0.701961, 0.545098, RGB, 0.610496, 0.450786, 0.258183), +RawColor(NAVAJOWHITE4 , sRGB, 0x8B795E, 0.545098, 0.474510, 0.368627, RGB, 0.258183, 0.191202, 0.111932), +RawColor(NAVYBLUE , sRGB, 0x000080, 0.000000, 0.000000, 0.501961, RGB, 0.000000, 0.000000, 0.215861), +RawColor(OLDLACE , sRGB, 0xFDF5E6, 0.992157, 0.960784, 0.901961, RGB, 0.982251, 0.913098, 0.791299), +RawColor(OLIVEDRAB , sRGB, 0x6B8E23, 0.419608, 0.556863, 0.137255, RGB, 0.147027, 0.270498, 0.016807), +RawColor(OLIVEDRAB1 , sRGB, 0xC0FF3E, 0.752941, 1.000000, 0.243137, RGB, 0.527115, 1.000000, 0.048172), +RawColor(OLIVEDRAB2 , sRGB, 0xB3EE3A, 0.701961, 0.933333, 0.227451, RGB, 0.450786, 0.854992, 0.042311), +RawColor(OLIVEDRAB3 , sRGB, 0x9ACD32, 0.603922, 0.803922, 0.196078, RGB, 0.323144, 0.610496, 0.031896), +RawColor(OLIVEDRAB4 , sRGB, 0x698B22, 0.411765, 0.545098, 0.133333, RGB, 0.141264, 0.258183, 0.015996), +RawColor(ORANGE , sRGB, 0xFFA500, 1.000000, 0.647059, 0.000000, RGB, 1.000000, 0.376262, 0.000000), +RawColor(ORANGE2 , sRGB, 0xEE9A00, 0.933333, 0.603922, 0.000000, RGB, 0.854992, 0.323144, 0.000000), +RawColor(ORANGE3 , sRGB, 0xCD8500, 0.803922, 0.521569, 0.000000, RGB, 0.610496, 0.234551, 0.000000), +RawColor(ORANGE4 , sRGB, 0x8B5A00, 0.545098, 0.352941, 0.000000, RGB, 0.258183, 0.102242, 0.000000), +RawColor(ORANGERED , sRGB, 0xFF4500, 1.000000, 0.270588, 0.000000, RGB, 1.000000, 0.059511, 0.000000), +RawColor(ORANGERED2 , sRGB, 0xEE4000, 0.933333, 0.250980, 0.000000, RGB, 0.854992, 0.051269, 0.000000), +RawColor(ORANGERED3 , sRGB, 0xCD3700, 0.803922, 0.215686, 0.000000, RGB, 0.610496, 0.038204, 0.000000), +RawColor(ORANGERED4 , sRGB, 0x8B2500, 0.545098, 0.145098, 0.000000, RGB, 0.258183, 0.018500, 0.000000), +RawColor(ORCHID , sRGB, 0xDA70D6, 0.854902, 0.439216, 0.839216, RGB, 0.701102, 0.162030, 0.672444), +RawColor(ORCHID1 , sRGB, 0xFF83FA, 1.000000, 0.513725, 0.980392, RGB, 1.000000, 0.226965, 0.955973), +RawColor(ORCHID2 , sRGB, 0xEE7AE9, 0.933333, 0.478431, 0.913725, RGB, 0.854992, 0.194617, 0.814846), +RawColor(ORCHID3 , sRGB, 0xCD69C9, 0.803922, 0.411765, 0.788235, RGB, 0.610496, 0.141264, 0.584078), +RawColor(ORCHID4 , sRGB, 0x8B4789, 0.545098, 0.278431, 0.537255, RGB, 0.258183, 0.063010, 0.250158), +RawColor(PALEGOLDENROD , sRGB, 0xEEE8AA, 0.933333, 0.909804, 0.666667, RGB, 0.854992, 0.806952, 0.401978), +RawColor(PALEGREEN , sRGB, 0x98FB98, 0.596078, 0.984314, 0.596078, RGB, 0.313988, 0.964687, 0.313988), +RawColor(PALEGREEN1 , sRGB, 0x9AFF9A, 0.603922, 1.000000, 0.603922, RGB, 0.323144, 1.000000, 0.323144), +RawColor(PALEGREEN2 , sRGB, 0x90EE90, 0.564706, 0.933333, 0.564706, RGB, 0.278894, 0.854992, 0.278894), +RawColor(PALEGREEN3 , sRGB, 0x7CCD7C, 0.486275, 0.803922, 0.486275, RGB, 0.201557, 0.610496, 0.201557), +RawColor(PALEGREEN4 , sRGB, 0x548B54, 0.329412, 0.545098, 0.329412, RGB, 0.088656, 0.258183, 0.088656), +RawColor(PALETURQUOISE , sRGB, 0xAFEEEE, 0.686275, 0.933333, 0.933333, RGB, 0.428691, 0.854992, 0.854992), +RawColor(PALETURQUOISE1 , sRGB, 0xBBFFFF, 0.733333, 1.000000, 1.000000, RGB, 0.496933, 1.000000, 1.000000), +RawColor(PALETURQUOISE2 , sRGB, 0xAEEEEE, 0.682353, 0.933333, 0.933333, RGB, 0.423268, 0.854992, 0.854992), +RawColor(PALETURQUOISE3 , sRGB, 0x96CDCD, 0.588235, 0.803922, 0.803922, RGB, 0.304987, 0.610496, 0.610496), +RawColor(PALETURQUOISE4 , sRGB, 0x668B8B, 0.400000, 0.545098, 0.545098, RGB, 0.132868, 0.258183, 0.258183), +RawColor(PALEVIOLETRED , sRGB, 0xDB7093, 0.858824, 0.439216, 0.576471, RGB, 0.708377, 0.162030, 0.291771), +RawColor(PALEVIOLETRED1 , sRGB, 0xFF82AB, 1.000000, 0.509804, 0.670588, RGB, 1.000000, 0.223228, 0.407240), +RawColor(PALEVIOLETRED2 , sRGB, 0xEE799F, 0.933333, 0.474510, 0.623529, RGB, 0.854992, 0.191202, 0.346704), +RawColor(PALEVIOLETRED3 , sRGB, 0xCD6889, 0.803922, 0.407843, 0.537255, RGB, 0.610496, 0.138432, 0.250158), +RawColor(PALEVIOLETRED4 , sRGB, 0x8B475D, 0.545098, 0.278431, 0.364706, RGB, 0.258183, 0.063010, 0.109462), +RawColor(PAPAYAWHIP , sRGB, 0xFFEFD5, 1.000000, 0.937255, 0.835294, RGB, 1.000000, 0.863158, 0.665387), +RawColor(PEACHPUFF , sRGB, 0xFFDAB9, 1.000000, 0.854902, 0.725490, RGB, 1.000000, 0.701102, 0.485150), +RawColor(PEACHPUFF2 , sRGB, 0xEECBAD, 0.933333, 0.796078, 0.678431, RGB, 0.854992, 0.597201, 0.417885), +RawColor(PEACHPUFF3 , sRGB, 0xCDAF95, 0.803922, 0.686275, 0.584314, RGB, 0.610496, 0.428691, 0.300544), +RawColor(PEACHPUFF4 , sRGB, 0x8B7765, 0.545098, 0.466667, 0.396078, RGB, 0.258183, 0.184475, 0.130136), +RawColor(PERU , sRGB, 0xCD853F, 0.803922, 0.521569, 0.247059, RGB, 0.610496, 0.234551, 0.049707), +RawColor(PINK , sRGB, 0xFFC0CB, 1.000000, 0.752941, 0.796078, RGB, 1.000000, 0.527115, 0.597201), +RawColor(PINK1 , sRGB, 0xFFB5C5, 1.000000, 0.709804, 0.772549, RGB, 1.000000, 0.462077, 0.558340), +RawColor(PINK2 , sRGB, 0xEEA9B8, 0.933333, 0.662745, 0.721569, RGB, 0.854992, 0.396755, 0.479321), +RawColor(PINK3 , sRGB, 0xCD919E, 0.803922, 0.568627, 0.619608, RGB, 0.610496, 0.283148, 0.341915), +RawColor(PINK4 , sRGB, 0x8B636C, 0.545098, 0.388235, 0.423529, RGB, 0.258183, 0.124772, 0.149959), +RawColor(PLUM , sRGB, 0xDDA0DD, 0.866667, 0.627451, 0.866667, RGB, 0.723056, 0.351533, 0.723056), +RawColor(PLUM1 , sRGB, 0xFFBBFF, 1.000000, 0.733333, 1.000000, RGB, 1.000000, 0.496933, 1.000000), +RawColor(PLUM2 , sRGB, 0xEEAEEE, 0.933333, 0.682353, 0.933333, RGB, 0.854992, 0.423268, 0.854992), +RawColor(PLUM3 , sRGB, 0xCD96CD, 0.803922, 0.588235, 0.803922, RGB, 0.610496, 0.304987, 0.610496), +RawColor(PLUM4 , sRGB, 0x8B668B, 0.545098, 0.400000, 0.545098, RGB, 0.258183, 0.132868, 0.258183), +RawColor(POWDERBLUE , sRGB, 0xB0E0E6, 0.690196, 0.878431, 0.901961, RGB, 0.434154, 0.745404, 0.791299), +RawColor(PURPLE , sRGB, 0xA020F0, 0.627451, 0.125490, 0.941176, RGB, 0.351533, 0.014444, 0.871366), +RawColor(PURPLE1 , sRGB, 0x9B30FF, 0.607843, 0.188235, 1.000000, RGB, 0.327778, 0.029557, 1.000000), +RawColor(PURPLE2 , sRGB, 0x912CEE, 0.568627, 0.172549, 0.933333, RGB, 0.283148, 0.025187, 0.854992), +RawColor(PURPLE3 , sRGB, 0x7D26CD, 0.490196, 0.149020, 0.803922, RGB, 0.205079, 0.019382, 0.610496), +RawColor(PURPLE4 , sRGB, 0x551A8B, 0.333333, 0.101961, 0.545098, RGB, 0.090842, 0.010330, 0.258183), +RawColor(RED , sRGB, 0xFF0000, 1.000000, 0.000000, 0.000000, RGB, 1.000000, 0.000000, 0.000000), +RawColor(RED2 , sRGB, 0xEE0000, 0.933333, 0.000000, 0.000000, RGB, 0.854992, 0.000000, 0.000000), +RawColor(RED3 , sRGB, 0xCD0000, 0.803922, 0.000000, 0.000000, RGB, 0.610496, 0.000000, 0.000000), +RawColor(RED4 , sRGB, 0x8B0000, 0.545098, 0.000000, 0.000000, RGB, 0.258183, 0.000000, 0.000000), +RawColor(ROSYBROWN , sRGB, 0xBC8F8F, 0.737255, 0.560784, 0.560784, RGB, 0.502887, 0.274677, 0.274677), +RawColor(ROSYBROWN1 , sRGB, 0xFFC1C1, 1.000000, 0.756863, 0.756863, RGB, 1.000000, 0.533277, 0.533277), +RawColor(ROSYBROWN2 , sRGB, 0xEEB4B4, 0.933333, 0.705882, 0.705882, RGB, 0.854992, 0.456411, 0.456411), +RawColor(ROSYBROWN3 , sRGB, 0xCD9B9B, 0.803922, 0.607843, 0.607843, RGB, 0.610496, 0.327778, 0.327778), +RawColor(ROSYBROWN4 , sRGB, 0x8B6969, 0.545098, 0.411765, 0.411765, RGB, 0.258183, 0.141264, 0.141264), +RawColor(ROYALBLUE , sRGB, 0x4169E1, 0.254902, 0.411765, 0.882353, RGB, 0.052861, 0.141264, 0.752942), +RawColor(ROYALBLUE1 , sRGB, 0x4876FF, 0.282353, 0.462745, 1.000000, RGB, 0.064803, 0.181164, 1.000000), +RawColor(ROYALBLUE2 , sRGB, 0x436EEE, 0.262745, 0.431373, 0.933333, RGB, 0.056128, 0.155927, 0.854992), +RawColor(ROYALBLUE3 , sRGB, 0x3A5FCD, 0.227451, 0.372549, 0.803922, RGB, 0.042311, 0.114435, 0.610496), +RawColor(ROYALBLUE4 , sRGB, 0x27408B, 0.152941, 0.250980, 0.545098, RGB, 0.020289, 0.051269, 0.258183), +RawColor(SADDLEBROWN , sRGB, 0x8B4513, 0.545098, 0.270588, 0.074510, RGB, 0.258183, 0.059511, 0.006512), +RawColor(SALMON , sRGB, 0xFA8072, 0.980392, 0.501961, 0.447059, RGB, 0.955973, 0.215861, 0.168270), +RawColor(SALMON1 , sRGB, 0xFF8C69, 1.000000, 0.549020, 0.411765, RGB, 1.000000, 0.262251, 0.141264), +RawColor(SALMON2 , sRGB, 0xEE8262, 0.933333, 0.509804, 0.384314, RGB, 0.854992, 0.223228, 0.122139), +RawColor(SALMON3 , sRGB, 0xCD7054, 0.803922, 0.439216, 0.329412, RGB, 0.610496, 0.162030, 0.088656), +RawColor(SALMON4 , sRGB, 0x8B4C39, 0.545098, 0.298039, 0.223529, RGB, 0.258183, 0.072272, 0.040915), +RawColor(SANDYBROWN , sRGB, 0xF4A460, 0.956863, 0.643137, 0.376471, RGB, 0.904662, 0.371237, 0.116971), +RawColor(SEAGREEN , sRGB, 0x2E8B57, 0.180392, 0.545098, 0.341176, RGB, 0.027321, 0.258183, 0.095307), +RawColor(SEAGREEN1 , sRGB, 0x54FF9F, 0.329412, 1.000000, 0.623529, RGB, 0.088656, 1.000000, 0.346704), +RawColor(SEAGREEN2 , sRGB, 0x4EEE94, 0.305882, 0.933333, 0.580392, RGB, 0.076185, 0.854992, 0.296138), +RawColor(SEAGREEN3 , sRGB, 0x43CD80, 0.262745, 0.803922, 0.501961, RGB, 0.056128, 0.610496, 0.215861), +RawColor(SEAGREEN4 , sRGB, 0x2E8B57, 0.180392, 0.545098, 0.341176, RGB, 0.027321, 0.258183, 0.095307), +RawColor(SEASHELL , sRGB, 0xFFF5EE, 1.000000, 0.960784, 0.933333, RGB, 1.000000, 0.913098, 0.854992), +RawColor(SEASHELL2 , sRGB, 0xEEE5DE, 0.933333, 0.898039, 0.870588, RGB, 0.854992, 0.783537, 0.730460), +RawColor(SEASHELL3 , sRGB, 0xCDC5BF, 0.803922, 0.772549, 0.749020, RGB, 0.610496, 0.558340, 0.520996), +RawColor(SEASHELL4 , sRGB, 0x8B8682, 0.545098, 0.525490, 0.509804, RGB, 0.258183, 0.238397, 0.223228), +RawColor(BEET , sRGB, 0x8E388E, 0.556863, 0.219608, 0.556863, RGB, 0.270498, 0.039546, 0.270498), +RawColor(TEAL , sRGB, 0x388E8E, 0.219608, 0.556863, 0.556863, RGB, 0.039546, 0.270498, 0.270498), +RawColor(SIENNA , sRGB, 0xA0522D, 0.627451, 0.321569, 0.176471, RGB, 0.351533, 0.084376, 0.026241), +RawColor(SIENNA1 , sRGB, 0xFF8247, 1.000000, 0.509804, 0.278431, RGB, 1.000000, 0.223228, 0.063010), +RawColor(SIENNA2 , sRGB, 0xEE7942, 0.933333, 0.474510, 0.258824, RGB, 0.854992, 0.191202, 0.054480), +RawColor(SIENNA3 , sRGB, 0xCD6839, 0.803922, 0.407843, 0.223529, RGB, 0.610496, 0.138432, 0.040915), +RawColor(SIENNA4 , sRGB, 0x8B4726, 0.545098, 0.278431, 0.149020, RGB, 0.258183, 0.063010, 0.019382), +RawColor(SKYBLUE , sRGB, 0x87CEEB, 0.529412, 0.807843, 0.921569, RGB, 0.242281, 0.617206, 0.830771), +RawColor(SKYBLUE1 , sRGB, 0x87CEFF, 0.529412, 0.807843, 1.000000, RGB, 0.242281, 0.617206, 1.000000), +RawColor(SKYBLUE2 , sRGB, 0x7EC0EE, 0.494118, 0.752941, 0.933333, RGB, 0.208637, 0.527115, 0.854992), +RawColor(SKYBLUE3 , sRGB, 0x6CA6CD, 0.423529, 0.650980, 0.803922, RGB, 0.149959, 0.381326, 0.610496), +RawColor(SKYBLUE4 , sRGB, 0x4A708B, 0.290196, 0.439216, 0.545098, RGB, 0.068478, 0.162030, 0.258183), +RawColor(SLATEBLUE , sRGB, 0x6A5ACD, 0.415686, 0.352941, 0.803922, RGB, 0.144128, 0.102242, 0.610496), +RawColor(SLATEBLUE1 , sRGB, 0x836FFF, 0.513725, 0.435294, 1.000000, RGB, 0.226965, 0.158961, 1.000000), +RawColor(SLATEBLUE2 , sRGB, 0x7A67EE, 0.478431, 0.403922, 0.933333, RGB, 0.194617, 0.135634, 0.854992), +RawColor(SLATEBLUE3 , sRGB, 0x6959CD, 0.411765, 0.349020, 0.803922, RGB, 0.141264, 0.099899, 0.610496), +RawColor(SLATEBLUE4 , sRGB, 0x473C8B, 0.278431, 0.235294, 0.545098, RGB, 0.063010, 0.045186, 0.258183), +RawColor(SLATEGRAY1 , sRGB, 0xC6E2FF, 0.776471, 0.886275, 1.000000, RGB, 0.564712, 0.760525, 1.000000), +RawColor(SLATEGRAY2 , sRGB, 0xB9D3EE, 0.725490, 0.827451, 0.933333, RGB, 0.485150, 0.651406, 0.854992), +RawColor(SLATEGRAY3 , sRGB, 0x9FB6CD, 0.623529, 0.713725, 0.803922, RGB, 0.346704, 0.467783, 0.610496), +RawColor(SLATEGRAY4 , sRGB, 0x6C7B8B, 0.423529, 0.482353, 0.545098, RGB, 0.149959, 0.198069, 0.258183), +RawColor(SLATEGRAY , sRGB, 0x708090, 0.439216, 0.501961, 0.564706, RGB, 0.162030, 0.215861, 0.278894), +RawColor(SNOW , sRGB, 0xFFFAFA, 1.000000, 0.980392, 0.980392, RGB, 1.000000, 0.955973, 0.955973), +RawColor(SNOW2 , sRGB, 0xEEE9E9, 0.933333, 0.913725, 0.913725, RGB, 0.854992, 0.814846, 0.814846), +RawColor(SNOW3 , sRGB, 0xCDC9C9, 0.803922, 0.788235, 0.788235, RGB, 0.610496, 0.584078, 0.584078), +RawColor(SNOW4 , sRGB, 0x8B8989, 0.545098, 0.537255, 0.537255, RGB, 0.258183, 0.250158, 0.250158), +RawColor(SPRINGGREEN , sRGB, 0x00FF7F, 0.000000, 1.000000, 0.498039, RGB, 0.000000, 1.000000, 0.212231), +RawColor(SPRINGGREEN2 , sRGB, 0x00EE76, 0.000000, 0.933333, 0.462745, RGB, 0.000000, 0.854992, 0.181164), +RawColor(SPRINGGREEN3 , sRGB, 0x00CD66, 0.000000, 0.803922, 0.400000, RGB, 0.000000, 0.610496, 0.132868), +RawColor(SPRINGGREEN4 , sRGB, 0x008B45, 0.000000, 0.545098, 0.270588, RGB, 0.000000, 0.258183, 0.059511), +RawColor(STEELBLUE , sRGB, 0x4682B4, 0.274510, 0.509804, 0.705882, RGB, 0.061246, 0.223228, 0.456411), +RawColor(STEELBLUE1 , sRGB, 0x63B8FF, 0.388235, 0.721569, 1.000000, RGB, 0.124772, 0.479321, 1.000000), +RawColor(STEELBLUE2 , sRGB, 0x5CACEE, 0.360784, 0.674510, 0.933333, RGB, 0.107023, 0.412543, 0.854992), +RawColor(STEELBLUE3 , sRGB, 0x4F94CD, 0.309804, 0.580392, 0.803922, RGB, 0.078187, 0.296138, 0.610496), +RawColor(STEELBLUE4 , sRGB, 0x36648B, 0.211765, 0.392157, 0.545098, RGB, 0.036890, 0.127438, 0.258183), +RawColor(TAN , sRGB, 0xD2B48C, 0.823529, 0.705882, 0.549020, RGB, 0.644479, 0.456411, 0.262251), +RawColor(TAN1 , sRGB, 0xFFA54F, 1.000000, 0.647059, 0.309804, RGB, 1.000000, 0.376262, 0.078187), +RawColor(TAN2 , sRGB, 0xEE9A49, 0.933333, 0.603922, 0.286275, RGB, 0.854992, 0.323144, 0.066626), +RawColor(TAN3 , sRGB, 0xCD853F, 0.803922, 0.521569, 0.247059, RGB, 0.610496, 0.234551, 0.049707), +RawColor(TAN4 , sRGB, 0x8B5A2B, 0.545098, 0.352941, 0.168627, RGB, 0.258183, 0.102242, 0.024158), +RawColor(THISTLE , sRGB, 0xD8BFD8, 0.847059, 0.749020, 0.847059, RGB, 0.686686, 0.520996, 0.686686), +RawColor(THISTLE1 , sRGB, 0xFFE1FF, 1.000000, 0.882353, 1.000000, RGB, 1.000000, 0.752942, 1.000000), +RawColor(THISTLE2 , sRGB, 0xEED2EE, 0.933333, 0.823529, 0.933333, RGB, 0.854992, 0.644479, 0.854992), +RawColor(THISTLE3 , sRGB, 0xCDB5CD, 0.803922, 0.709804, 0.803922, RGB, 0.610496, 0.462077, 0.610496), +RawColor(THISTLE4 , sRGB, 0x8B7B8B, 0.545098, 0.482353, 0.545098, RGB, 0.258183, 0.198069, 0.258183), +RawColor(TOMATO , sRGB, 0xFF6347, 1.000000, 0.388235, 0.278431, RGB, 1.000000, 0.124772, 0.063010), +RawColor(TOMATO2 , sRGB, 0xEE5C42, 0.933333, 0.360784, 0.258824, RGB, 0.854992, 0.107023, 0.054480), +RawColor(TOMATO3 , sRGB, 0xCD4F39, 0.803922, 0.309804, 0.223529, RGB, 0.610496, 0.078187, 0.040915), +RawColor(TOMATO4 , sRGB, 0x8B3626, 0.545098, 0.211765, 0.149020, RGB, 0.258183, 0.036890, 0.019382), +RawColor(TURQUOISE , sRGB, 0x40E0D0, 0.250980, 0.878431, 0.815686, RGB, 0.051269, 0.745404, 0.630757), +RawColor(TURQUOISE1 , sRGB, 0x00F5FF, 0.000000, 0.960784, 1.000000, RGB, 0.000000, 0.913098, 1.000000), +RawColor(TURQUOISE2 , sRGB, 0x00E5EE, 0.000000, 0.898039, 0.933333, RGB, 0.000000, 0.783537, 0.854992), +RawColor(TURQUOISE3 , sRGB, 0x00C5CD, 0.000000, 0.772549, 0.803922, RGB, 0.000000, 0.558340, 0.610496), +RawColor(TURQUOISE4 , sRGB, 0x00868B, 0.000000, 0.525490, 0.545098, RGB, 0.000000, 0.238397, 0.258183), +RawColor(VIOLET , sRGB, 0xEE82EE, 0.933333, 0.509804, 0.933333, RGB, 0.854992, 0.223228, 0.854992), +RawColor(VIOLETRED , sRGB, 0xD02090, 0.815686, 0.125490, 0.564706, RGB, 0.630757, 0.014444, 0.278894), +RawColor(VIOLETRED1 , sRGB, 0xFF3E96, 1.000000, 0.243137, 0.588235, RGB, 1.000000, 0.048172, 0.304987), +RawColor(VIOLETRED2 , sRGB, 0xEE3A8C, 0.933333, 0.227451, 0.549020, RGB, 0.854992, 0.042311, 0.262251), +RawColor(VIOLETRED3 , sRGB, 0xCD3278, 0.803922, 0.196078, 0.470588, RGB, 0.610496, 0.031896, 0.187821), +RawColor(VIOLETRED4 , sRGB, 0x8B2252, 0.545098, 0.133333, 0.321569, RGB, 0.258183, 0.015996, 0.084376), +RawColor(WHEAT , sRGB, 0xF5DEB3, 0.960784, 0.870588, 0.701961, RGB, 0.913098, 0.730460, 0.450786), +RawColor(WHEAT1 , sRGB, 0xFFE7BA, 1.000000, 0.905882, 0.729412, RGB, 1.000000, 0.799102, 0.491021), +RawColor(WHEAT2 , sRGB, 0xEED8AE, 0.933333, 0.847059, 0.682353, RGB, 0.854992, 0.686686, 0.423268), +RawColor(WHEAT3 , sRGB, 0xCDBA96, 0.803922, 0.729412, 0.588235, RGB, 0.610496, 0.491021, 0.304987), +RawColor(WHEAT4 , sRGB, 0x8B7E66, 0.545098, 0.494118, 0.400000, RGB, 0.258183, 0.208637, 0.132868), +RawColor(WHITESMOKE , sRGB, 0xF5F5F5, 0.960784, 0.960784, 0.960784, RGB, 0.913098, 0.913098, 0.913098), +RawColor(YELLOW , sRGB, 0xFFFF00, 1.000000, 1.000000, 0.000000, RGB, 1.000000, 1.000000, 0.000000), +RawColor(YELLOW2 , sRGB, 0xEEEE00, 0.933333, 0.933333, 0.000000, RGB, 0.854992, 0.854992, 0.000000), +RawColor(YELLOW3 , sRGB, 0xCDCD00, 0.803922, 0.803922, 0.000000, RGB, 0.610496, 0.610496, 0.000000), +RawColor(YELLOW4 , sRGB, 0x8B8B00, 0.545098, 0.545098, 0.000000, RGB, 0.258183, 0.258183, 0.000000), +RawColor(YELLOWGREEN , sRGB, 0x9ACD32, 0.603922, 0.803922, 0.196078, RGB, 0.323144, 0.610496, 0.031896), +RawColor(WHITE , sRGB, 0xFFFFFF, 1.000000, 1.000000, 1.000000, RGB, 1.000000, 1.000000, 1.000000), diff -Nru opencascade-7.4.1+dfsg1/src/Quantity/Quantity_NameOfColor.hxx opencascade-7.5.1+dfsg1/src/Quantity/Quantity_NameOfColor.hxx --- opencascade-7.4.1+dfsg1/src/Quantity/Quantity_NameOfColor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Quantity/Quantity_NameOfColor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,7 +43,8 @@ Quantity_NOC_BISQUE3, Quantity_NOC_BISQUE4, Quantity_NOC_BLANCHEDALMOND, -Quantity_NOC_BLUE1, +Quantity_NOC_BLUE, +Quantity_NOC_BLUE1 = Quantity_NOC_BLUE, Quantity_NOC_BLUE2, Quantity_NOC_BLUE3, Quantity_NOC_BLUE4, @@ -64,7 +65,7 @@ Quantity_NOC_CADETBLUE3, Quantity_NOC_CADETBLUE4, Quantity_NOC_CHARTREUSE, -Quantity_NOC_CHARTREUSE1, +Quantity_NOC_CHARTREUSE1 = Quantity_NOC_CHARTREUSE, Quantity_NOC_CHARTREUSE2, Quantity_NOC_CHARTREUSE3, Quantity_NOC_CHARTREUSE4, @@ -83,7 +84,8 @@ Quantity_NOC_CORNSILK2, Quantity_NOC_CORNSILK3, Quantity_NOC_CORNSILK4, -Quantity_NOC_CYAN1, +Quantity_NOC_CYAN, +Quantity_NOC_CYAN1 = Quantity_NOC_CYAN, Quantity_NOC_CYAN2, Quantity_NOC_CYAN3, Quantity_NOC_CYAN4, @@ -145,7 +147,7 @@ Quantity_NOC_GAINSBORO, Quantity_NOC_GHOSTWHITE, Quantity_NOC_GOLD, -Quantity_NOC_GOLD1, +Quantity_NOC_GOLD1 = Quantity_NOC_GOLD, Quantity_NOC_GOLD2, Quantity_NOC_GOLD3, Quantity_NOC_GOLD4, @@ -157,6 +159,14 @@ Quantity_NOC_GRAY, Quantity_NOC_GRAY0, Quantity_NOC_GRAY1, +Quantity_NOC_GRAY2, +Quantity_NOC_GRAY3, +Quantity_NOC_GRAY4, +Quantity_NOC_GRAY5, +Quantity_NOC_GRAY6, +Quantity_NOC_GRAY7, +Quantity_NOC_GRAY8, +Quantity_NOC_GRAY9, Quantity_NOC_GRAY10, Quantity_NOC_GRAY11, Quantity_NOC_GRAY12, @@ -167,7 +177,6 @@ Quantity_NOC_GRAY17, Quantity_NOC_GRAY18, Quantity_NOC_GRAY19, -Quantity_NOC_GRAY2, Quantity_NOC_GRAY20, Quantity_NOC_GRAY21, Quantity_NOC_GRAY22, @@ -178,7 +187,6 @@ Quantity_NOC_GRAY27, Quantity_NOC_GRAY28, Quantity_NOC_GRAY29, -Quantity_NOC_GRAY3, Quantity_NOC_GRAY30, Quantity_NOC_GRAY31, Quantity_NOC_GRAY32, @@ -189,7 +197,6 @@ Quantity_NOC_GRAY37, Quantity_NOC_GRAY38, Quantity_NOC_GRAY39, -Quantity_NOC_GRAY4, Quantity_NOC_GRAY40, Quantity_NOC_GRAY41, Quantity_NOC_GRAY42, @@ -200,7 +207,6 @@ Quantity_NOC_GRAY47, Quantity_NOC_GRAY48, Quantity_NOC_GRAY49, -Quantity_NOC_GRAY5, Quantity_NOC_GRAY50, Quantity_NOC_GRAY51, Quantity_NOC_GRAY52, @@ -211,7 +217,6 @@ Quantity_NOC_GRAY57, Quantity_NOC_GRAY58, Quantity_NOC_GRAY59, -Quantity_NOC_GRAY6, Quantity_NOC_GRAY60, Quantity_NOC_GRAY61, Quantity_NOC_GRAY62, @@ -222,7 +227,6 @@ Quantity_NOC_GRAY67, Quantity_NOC_GRAY68, Quantity_NOC_GRAY69, -Quantity_NOC_GRAY7, Quantity_NOC_GRAY70, Quantity_NOC_GRAY71, Quantity_NOC_GRAY72, @@ -233,7 +237,6 @@ Quantity_NOC_GRAY77, Quantity_NOC_GRAY78, Quantity_NOC_GRAY79, -Quantity_NOC_GRAY8, Quantity_NOC_GRAY80, Quantity_NOC_GRAY81, Quantity_NOC_GRAY82, @@ -243,22 +246,21 @@ Quantity_NOC_GRAY87, Quantity_NOC_GRAY88, Quantity_NOC_GRAY89, -Quantity_NOC_GRAY9, Quantity_NOC_GRAY90, Quantity_NOC_GRAY91, Quantity_NOC_GRAY92, Quantity_NOC_GRAY93, Quantity_NOC_GRAY94, Quantity_NOC_GRAY95, +Quantity_NOC_GRAY97, +Quantity_NOC_GRAY98, +Quantity_NOC_GRAY99, Quantity_NOC_GREEN, -Quantity_NOC_GREEN1, +Quantity_NOC_GREEN1 = Quantity_NOC_GREEN, Quantity_NOC_GREEN2, Quantity_NOC_GREEN3, Quantity_NOC_GREEN4, Quantity_NOC_GREENYELLOW, -Quantity_NOC_GRAY97, -Quantity_NOC_GRAY98, -Quantity_NOC_GRAY99, Quantity_NOC_HONEYDEW, Quantity_NOC_HONEYDEW2, Quantity_NOC_HONEYDEW3, @@ -298,7 +300,8 @@ Quantity_NOC_LIGHTBLUE3, Quantity_NOC_LIGHTBLUE4, Quantity_NOC_LIGHTCORAL, -Quantity_NOC_LIGHTCYAN1, +Quantity_NOC_LIGHTCYAN, +Quantity_NOC_LIGHTCYAN1 = Quantity_NOC_LIGHTCYAN, Quantity_NOC_LIGHTCYAN2, Quantity_NOC_LIGHTCYAN3, Quantity_NOC_LIGHTCYAN4, @@ -337,7 +340,8 @@ Quantity_NOC_LIGHTYELLOW4, Quantity_NOC_LIMEGREEN, Quantity_NOC_LINEN, -Quantity_NOC_MAGENTA1, +Quantity_NOC_MAGENTA, +Quantity_NOC_MAGENTA1 = Quantity_NOC_MAGENTA, Quantity_NOC_MAGENTA2, Quantity_NOC_MAGENTA3, Quantity_NOC_MAGENTA4, @@ -381,12 +385,12 @@ Quantity_NOC_OLIVEDRAB3, Quantity_NOC_OLIVEDRAB4, Quantity_NOC_ORANGE, -Quantity_NOC_ORANGE1, +Quantity_NOC_ORANGE1 = Quantity_NOC_ORANGE, Quantity_NOC_ORANGE2, Quantity_NOC_ORANGE3, Quantity_NOC_ORANGE4, Quantity_NOC_ORANGERED, -Quantity_NOC_ORANGERED1, +Quantity_NOC_ORANGERED1 = Quantity_NOC_ORANGERED, Quantity_NOC_ORANGERED2, Quantity_NOC_ORANGERED3, Quantity_NOC_ORANGERED4, @@ -434,7 +438,7 @@ Quantity_NOC_PURPLE3, Quantity_NOC_PURPLE4, Quantity_NOC_RED, -Quantity_NOC_RED1, +Quantity_NOC_RED1 = Quantity_NOC_RED, Quantity_NOC_RED2, Quantity_NOC_RED3, Quantity_NOC_RED4, @@ -510,7 +514,7 @@ Quantity_NOC_THISTLE3, Quantity_NOC_THISTLE4, Quantity_NOC_TOMATO, -Quantity_NOC_TOMATO1, +Quantity_NOC_TOMATO1 = Quantity_NOC_TOMATO, Quantity_NOC_TOMATO2, Quantity_NOC_TOMATO3, Quantity_NOC_TOMATO4, @@ -532,7 +536,7 @@ Quantity_NOC_WHEAT4, Quantity_NOC_WHITESMOKE, Quantity_NOC_YELLOW, -Quantity_NOC_YELLOW1, +Quantity_NOC_YELLOW1 = Quantity_NOC_YELLOW, Quantity_NOC_YELLOW2, Quantity_NOC_YELLOW3, Quantity_NOC_YELLOW4, diff -Nru opencascade-7.4.1+dfsg1/src/Quantity/Quantity_TypeOfColor.hxx opencascade-7.5.1+dfsg1/src/Quantity/Quantity_TypeOfColor.hxx --- opencascade-7.4.1+dfsg1/src/Quantity/Quantity_TypeOfColor.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Quantity/Quantity_TypeOfColor.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,19 +17,53 @@ #ifndef _Quantity_TypeOfColor_HeaderFile #define _Quantity_TypeOfColor_HeaderFile -//! Identifies color definition systems -//! - Quantity_TOC_RGB: with this system a -//! color is defined by its quantities of red, green and blue (R-G-B values). -//! - Quantity_TOC_HLS: with this system a -//! color is defined by its hue angle and its -//! lightness and saturation values (H-L-S values). -//! A Quantity_Color object may define a color -//! from three values R-G-B or H-L-S according -//! to a given color definition system. +//! Identifies color definition systems. enum Quantity_TypeOfColor { -Quantity_TOC_RGB, -Quantity_TOC_HLS + //! Normalized linear RGB (red, green, blue) values within range [0..1] for each component + Quantity_TOC_RGB, + + //! Normalized non-linear gamma-shifted RGB (red, green, blue) values within range [0..1] for each component + Quantity_TOC_sRGB, + + //! Hue + light + saturation components, where: + //! - First component is the Hue (H) angle in degrees within range [0.0; 360.0], 0.0 being Red; + //! value -1.0 is a special value reserved for grayscale color (S should be 0.0). + //! - Second component is the Lightness (L) within range [0.0; 1.0] + //! - Third component is the Saturation (S) within range [0.0; 1.0] + Quantity_TOC_HLS, + + //! CIE L*a*b* color space, constructed to be perceptually uniform for human eye. + //! The values are assumed to be with respect to D65 2° white point. + //! + //! The color is defined by: + //! - L: lightness in range [0, 100] (from black to white) + //! - a: green-to-red axis, approximately in range [-90, 100] + //! - b: blue-to-yellow axis, approximately in range [-110, 95] + //! + //! Note that not all combinations of L, a, and b values represent visible + //! colors, and RGB cube takes only part of visible color space. + //! + //! When Lab color is converted to RGB, a and b components may be reduced + //! (with the same proportion) to fit the result into the RGB range. + Quantity_TOC_CIELab, + + //! CIE L*c*h* color space, same as L*a*b* in cylindrical coordinates: + //! - L: lightness in range [0, 100] (from black to white) + //! - c: chroma, approximately in range [0, 135], 0 corresponds to greyscale + //! - h: hue angle, in range [0., 360.] + //! + //! The hue values of standard colors are approximately: + //! - red at 40, + //! - yellow at 103, + //! - green at 136, + //! - cyan at 196, + //! - blue at 306, + //! - magenta at 328. + //! + //! When Lch color is converted to RGB, chroma component may be reduced + //! to fit the color into the RGB range. + Quantity_TOC_CIELch }; #endif // _Quantity_TypeOfColor_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Resource/FILES opencascade-7.5.1+dfsg1/src/Resource/FILES --- opencascade-7.4.1+dfsg1/src/Resource/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,18 +1,17 @@ -Resource_Big5.h +Resource_Big5.pxx +Resource_CodePages.pxx Resource_ConvertUnicode.c Resource_ConvertUnicode.hxx -Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString.hxx -Resource_DataMapIteratorOfDataMapOfAsciiStringExtendedString.hxx Resource_DataMapOfAsciiStringAsciiString.hxx Resource_DataMapOfAsciiStringExtendedString.hxx Resource_FormatType.hxx -Resource_GB2312.h -Resource_GBK.h +Resource_GB2312.pxx +Resource_GBK.pxx Resource_LexicalCompare.cxx Resource_LexicalCompare.hxx Resource_Manager.cxx Resource_Manager.hxx Resource_NoSuchResource.hxx -Resource_Shiftjis.h +Resource_Shiftjis.pxx Resource_Unicode.cxx Resource_Unicode.hxx diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_Big5.h opencascade-7.5.1+dfsg1/src/Resource/Resource_Big5.h --- opencascade-7.4.1+dfsg1/src/Resource/Resource_Big5.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_Big5.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,4963 +0,0 @@ -// Created on: 2017-11-17 -// Created by: Artem NOVIKOV -// Copyright (c) 2013-2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -static unsigned int big5uni [19782] = { -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x43F0, 0x4C32, -0x4603, 0x45A6, 0x4578, 0x27267, -0x4D77, 0x45B3, 0x27CB1, 0x4CE2, -0x27CC5, 0x3B95, 0x4736, 0x4744, -0x4C47, 0x4C40, 0x242BF, 0x23617, -0x27352, 0x26E8B, 0x270D2, 0x4C57, -0x2A351, 0x474F, 0x45DA, 0x4C85, -0x27C6C, 0x4D07, 0x4AA4, 0x46A1, -0x26B23, 0x7225, 0x25A54, 0x21A63, -0x23E06, 0x23F61, 0x664D, 0x56FB, -0x0000, 0x7D95, 0x591D, 0x28BB9, -0x3DF4, 0x9734, 0x27BEF, 0x5BDB, -0x21D5E, 0x5AA4, 0x3625, 0x29EB0, -0x5AD1, 0x5BB7, 0x5CFC, 0x676E, -0x8593, 0x29945, 0x7461, 0x749D, -0x3875, 0x21D53, 0x2369E, 0x26021, -0x3EEC, 0x258DE, 0x3AF5, 0x7AFC, -0x9F97, 0x24161, 0x2890D, 0x231EA, -0x20A8A, 0x2325E, 0x430A, 0x8484, -0x9F96, 0x942F, 0x4930, 0x8613, -0x5896, 0x974A, 0x9218, 0x79D0, -0x7A32, 0x6660, 0x6A29, 0x889D, -0x744C, 0x7BC5, 0x6782, 0x7A2C, -0x524F, 0x9046, 0x34E6, 0x73C4, -0x25DB9, 0x74C6, 0x9FC7, 0x57B3, -0x492F, 0x544C, 0x4131, 0x2368E, -0x5818, 0x7A72, 0x27B65, 0x8B8F, -0x46AE, 0x26E88, 0x4181, 0x25D99, -0x7BAE, 0x224BC, 0x9FC8, 0x224C1, -0x224C9, 0x224CC, 0x9FC9, 0x8504, -0x235BB, 0x40B4, 0x9FCA, 0x44E1, -0x2ADFF, 0x62C1, 0x706E, 0x9FCB, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x31C0, -0x31C1, 0x31C2, 0x31C3, 0x31C4, -0x2010C, 0x31C5, 0x200D1, 0x200CD, -0x31C6, 0x31C7, 0x200CB, 0x21FE8, -0x31C8, 0x200CA, 0x31C9, 0x31CA, -0x31CB, 0x31CC, 0x2010E, 0x31CD, -0x31CE, 0x0100, 0x00C1, 0x01CD, -0x00C0, 0x0112, 0x00C9, 0x011A, -0x00C8, 0x014C, 0x00D3, 0x01D1, -0x00D2, 0x0000, 0x1EBE, 0x0000, -0x1EC0, 0x00CA, 0x0101, 0x00E1, -0x01CE, 0x00E0, 0x0251, 0x0113, -0x00E9, 0x011B, 0x00E8, 0x012B, -0x00ED, 0x01D0, 0x00EC, 0x014D, -0x00F3, 0x01D2, 0x00F2, 0x016B, -0x00FA, 0x01D4, 0x00F9, 0x01D6, -0x01D8, 0x01DA, 0x01DC, 0x00FC, -0x0000, 0x1EBF, 0x0000, 0x1EC1, -0x00EA, 0x0261, 0x23DA, 0x23DB, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x2A3A9, 0x21145, 0x0000, 0x650A, -0x0000, 0x0000, 0x4E3D, 0x6EDD, -0x9D4E, 0x91DF, 0x0000, 0x0000, -0x27735, 0x6491, 0x4F1A, 0x4F28, -0x4FA8, 0x5156, 0x5174, 0x519C, -0x51E4, 0x52A1, 0x52A8, 0x533B, -0x534E, 0x53D1, 0x53D8, 0x56E2, -0x58F0, 0x5904, 0x5907, 0x5932, -0x5934, 0x5B66, 0x5B9E, 0x5B9F, -0x5C9A, 0x5E86, 0x603B, 0x6589, -0x67FE, 0x6804, 0x6865, 0x6D4E, -0x70BC, 0x7535, 0x7EA4, 0x7EAC, -0x7EBA, 0x7EC7, 0x7ECF, 0x7EDF, -0x7F06, 0x7F37, 0x827A, 0x82CF, -0x836F, 0x89C6, 0x8BBE, 0x8BE2, -0x8F66, 0x8F67, 0x8F6E, 0x7411, -0x7CFC, 0x7DCD, 0x6946, 0x7AC9, -0x5227, 0x0000, 0x0000, 0x0000, -0x0000, 0x918C, 0x78B8, 0x915E, -0x80BC, 0x0000, 0x8D0B, 0x80F6, -0x209E7, 0x0000, 0x0000, 0x809F, -0x9EC7, 0x4CCD, 0x9DC9, 0x9E0C, -0x4C3E, 0x29DF6, 0x2700E, 0x9E0A, -0x2A133, 0x35C1, 0x0000, 0x6E9A, -0x823E, 0x7519, 0x0000, 0x4911, -0x9A6C, 0x9A8F, 0x9F99, 0x7987, -0x2846C, 0x21DCA, 0x205D0, 0x22AE6, -0x4E24, 0x4E81, 0x4E80, 0x4E87, -0x4EBF, 0x4EEB, 0x4F37, 0x344C, -0x4FBD, 0x3E48, 0x5003, 0x5088, -0x347D, 0x3493, 0x34A5, 0x5186, -0x5905, 0x51DB, 0x51FC, 0x5205, -0x4E89, 0x5279, 0x5290, 0x5327, -0x35C7, 0x53A9, 0x3551, 0x53B0, -0x3553, 0x53C2, 0x5423, 0x356D, -0x3572, 0x3681, 0x5493, 0x54A3, -0x54B4, 0x54B9, 0x54D0, 0x54EF, -0x5518, 0x5523, 0x5528, 0x3598, -0x553F, 0x35A5, 0x35BF, 0x55D7, -0x35C5, 0x27D84, 0x5525, 0x0000, -0x20C42, 0x20D15, 0x2512B, 0x5590, -0x22CC6, 0x39EC, 0x20341, 0x8E46, -0x24DB8, 0x294E5, 0x4053, 0x280BE, -0x777A, 0x22C38, 0x3A34, 0x47D5, -0x2815D, 0x269F2, 0x24DEA, 0x64DD, -0x20D7C, 0x20FB4, 0x20CD5, 0x210F4, -0x648D, 0x8E7E, 0x20E96, 0x20C0B, -0x20F64, 0x22CA9, 0x28256, 0x244D3, -0x0000, 0x20D46, 0x29A4D, 0x280E9, -0x47F4, 0x24EA7, 0x22CC2, 0x9AB2, -0x3A67, 0x295F4, 0x3FED, 0x3506, -0x252C7, 0x297D4, 0x278C8, 0x22D44, -0x9D6E, 0x9815, 0x0000, 0x43D9, -0x260A5, 0x64B4, 0x54E3, 0x22D4C, -0x22BCA, 0x21077, 0x39FB, 0x2106F, -0x266DA, 0x26716, 0x279A0, 0x64EA, -0x25052, 0x20C43, 0x8E68, 0x221A1, -0x28B4C, 0x20731, 0x0000, 0x480B, -0x201A9, 0x3FFA, 0x5873, 0x22D8D, -0x0000, 0x245C8, 0x204FC, 0x26097, -0x20F4C, 0x20D96, 0x5579, 0x40BB, -0x43BA, 0x0000, 0x4AB4, 0x22A66, -0x2109D, 0x81AA, 0x98F5, 0x20D9C, -0x6379, 0x39FE, 0x22775, 0x8DC0, -0x56A1, 0x647C, 0x3E43, 0x0000, -0x2A601, 0x20E09, 0x22ACF, 0x22CC9, -0x0000, 0x210C8, 0x239C2, 0x3992, -0x3A06, 0x2829B, 0x3578, 0x25E49, -0x220C7, 0x5652, 0x20F31, 0x22CB2, -0x29720, 0x34BC, 0x6C3D, 0x24E3B, -0x0000, 0x0000, 0x27574, 0x22E8B, -0x22208, 0x2A65B, 0x28CCD, 0x20E7A, -0x20C34, 0x2681C, 0x7F93, 0x210CF, -0x22803, 0x22939, 0x35FB, 0x251E3, -0x20E8C, 0x20F8D, 0x20EAA, 0x3F93, -0x20F30, 0x20D47, 0x2114F, 0x20E4C, -0x0000, 0x20EAB, 0x20BA9, 0x20D48, -0x210C0, 0x2113D, 0x3FF9, 0x22696, -0x6432, 0x20FAD, 0x233F4, 0x27639, -0x22BCE, 0x20D7E, 0x20D7F, 0x22C51, -0x22C55, 0x3A18, 0x20E98, 0x210C7, -0x20F2E, 0x2A632, 0x26B50, 0x28CD2, -0x28D99, 0x28CCA, 0x95AA, 0x54CC, -0x82C4, 0x55B9, 0x0000, 0x29EC3, -0x9C26, 0x9AB6, 0x2775E, 0x22DEE, -0x7140, 0x816D, 0x80EC, 0x5C1C, -0x26572, 0x8134, 0x3797, 0x535F, -0x280BD, 0x91B6, 0x20EFA, 0x20E0F, -0x20E77, 0x20EFB, 0x35DD, 0x24DEB, -0x3609, 0x20CD6, 0x56AF, 0x227B5, -0x210C9, 0x20E10, 0x20E78, 0x21078, -0x21148, 0x28207, 0x21455, 0x20E79, -0x24E50, 0x22DA4, 0x5A54, 0x2101D, -0x2101E, 0x210F5, 0x210F6, 0x579C, -0x20E11, 0x27694, 0x282CD, 0x20FB5, -0x20E7B, 0x2517E, 0x3703, 0x20FB6, -0x21180, 0x252D8, 0x2A2BD, 0x249DA, -0x2183A, 0x24177, 0x2827C, 0x5899, -0x5268, 0x361A, 0x2573D, 0x7BB2, -0x5B68, 0x4800, 0x4B2C, 0x9F27, -0x49E7, 0x9C1F, 0x9B8D, 0x25B74, -0x2313D, 0x55FB, 0x35F2, 0x5689, -0x4E28, 0x5902, 0x21BC1, 0x2F878, -0x9751, 0x20086, 0x4E5B, 0x4EBB, -0x353E, 0x5C23, 0x5F51, 0x5FC4, -0x38FA, 0x624C, 0x6535, 0x6B7A, -0x6C35, 0x6C3A, 0x706C, 0x722B, -0x4E2C, 0x72AD, 0x248E9, 0x7F52, -0x793B, 0x7CF9, 0x7F53, 0x2626A, -0x34C1, 0x0000, 0x2634B, 0x8002, -0x8080, 0x26612, 0x26951, 0x535D, -0x8864, 0x89C1, 0x278B2, 0x8BA0, -0x8D1D, 0x9485, 0x9578, 0x957F, -0x95E8, 0x28E0F, 0x97E6, 0x9875, -0x98CE, 0x98DE, 0x9963, 0x29810, -0x9C7C, 0x9E1F, 0x9EC4, 0x6B6F, -0xF907, 0x4E37, 0x20087, 0x961D, -0x6237, 0x94A2, 0x0000, 0x503B, -0x6DFE, 0x29C73, 0x9FA6, 0x3DC9, -0x888F, 0x2414E, 0x7077, 0x5CF5, -0x4B20, 0x251CD, 0x3559, 0x25D30, -0x6122, 0x28A32, 0x8FA7, 0x91F6, -0x7191, 0x6719, 0x73BA, 0x23281, -0x2A107, 0x3C8B, 0x21980, 0x4B10, -0x78E4, 0x7402, 0x51AE, 0x2870F, -0x4009, 0x6A63, 0x2A2BA, 0x4223, -0x860F, 0x20A6F, 0x7A2A, 0x29947, -0x28AEA, 0x9755, 0x704D, 0x5324, -0x2207E, 0x93F4, 0x76D9, 0x289E3, -0x9FA7, 0x77DD, 0x4EA3, 0x4FF0, -0x50BC, 0x4E2F, 0x4F17, 0x9FA8, -0x5434, 0x7D8B, 0x5892, 0x58D0, -0x21DB6, 0x5E92, 0x5E99, 0x5FC2, -0x22712, 0x658B, 0x233F9, 0x6919, -0x6A43, 0x23C63, 0x6CFF, 0x0000, -0x7200, 0x24505, 0x738C, 0x3EDB, -0x24A13, 0x5B15, 0x74B9, 0x8B83, -0x25CA4, 0x25695, 0x7A93, 0x7BEC, -0x7CC3, 0x7E6C, 0x82F8, 0x8597, -0x9FA9, 0x8890, 0x9FAA, 0x8EB9, -0x9FAB, 0x8FCF, 0x855F, 0x99E0, -0x9221, 0x9FAC, 0x28DB9, 0x2143F, -0x4071, 0x42A2, 0x5A1A, 0x0000, -0x0000, 0x0000, 0x9868, 0x676B, -0x4276, 0x573D, 0x0000, 0x85D6, -0x2497B, 0x82BF, 0x2710D, 0x4C81, -0x26D74, 0x5D7B, 0x26B15, 0x26FBE, -0x9FAD, 0x9FAE, 0x5B96, 0x9FAF, -0x66E7, 0x7E5B, 0x6E57, 0x79CA, -0x3D88, 0x44C3, 0x23256, 0x22796, -0x439A, 0x4536, 0x0000, 0x5CD5, -0x23B1A, 0x8AF9, 0x5C78, 0x3D12, -0x23551, 0x5D78, 0x9FB2, 0x7157, -0x4558, 0x240EC, 0x21E23, 0x4C77, -0x3978, 0x344A, 0x201A4, 0x26C41, -0x8ACC, 0x4FB4, 0x20239, 0x59BF, -0x816C, 0x9856, 0x298FA, 0x5F3B, -0x20B9F, 0x0000, 0x221C1, 0x2896D, -0x4102, 0x46BB, 0x29079, 0x3F07, -0x9FB3, 0x2A1B5, 0x40F8, 0x37D6, -0x46F7, 0x26C46, 0x417C, 0x286B2, -0x273FF, 0x456D, 0x38D4, 0x2549A, -0x4561, 0x451B, 0x4D89, 0x4C7B, -0x4D76, 0x45EA, 0x3FC8, 0x24B0F, -0x3661, 0x44DE, 0x44BD, 0x41ED, -0x5D3E, 0x5D48, 0x5D56, 0x3DFC, -0x380F, 0x5DA4, 0x5DB9, 0x3820, -0x3838, 0x5E42, 0x5EBD, 0x5F25, -0x5F83, 0x3908, 0x3914, 0x393F, -0x394D, 0x60D7, 0x613D, 0x5CE5, -0x3989, 0x61B7, 0x61B9, 0x61CF, -0x39B8, 0x622C, 0x6290, 0x62E5, -0x6318, 0x39F8, 0x56B1, 0x3A03, -0x63E2, 0x63FB, 0x6407, 0x645A, -0x3A4B, 0x64C0, 0x5D15, 0x5621, -0x9F9F, 0x3A97, 0x6586, 0x3ABD, -0x65FF, 0x6653, 0x3AF2, 0x6692, -0x3B22, 0x6716, 0x3B42, 0x67A4, -0x6800, 0x3B58, 0x684A, 0x6884, -0x3B72, 0x3B71, 0x3B7B, 0x6909, -0x6943, 0x725C, 0x6964, 0x699F, -0x6985, 0x3BBC, 0x69D6, 0x3BDD, -0x6A65, 0x6A74, 0x6A71, 0x6A82, -0x3BEC, 0x6A99, 0x3BF2, 0x6AAB, -0x6AB5, 0x6AD4, 0x6AF6, 0x6B81, -0x6BC1, 0x6BEA, 0x6C75, 0x6CAA, -0x3CCB, 0x6D02, 0x6D06, 0x6D26, -0x6D81, 0x3CEF, 0x6DA4, 0x6DB1, -0x6E15, 0x6E18, 0x6E29, 0x6E86, -0x289C0, 0x6EBB, 0x6EE2, 0x6EDA, -0x9F7F, 0x6EE8, 0x6EE9, 0x6F24, -0x6F34, 0x3D46, 0x23F41, 0x6F81, -0x6FBE, 0x3D6A, 0x3D75, 0x71B7, -0x5C99, 0x3D8A, 0x702C, 0x3D91, -0x7050, 0x7054, 0x706F, 0x707F, -0x7089, 0x20325, 0x43C1, 0x35F1, -0x20ED8, 0x23ED7, 0x57BE, 0x26ED3, -0x713E, 0x257E0, 0x364E, 0x69A2, -0x28BE9, 0x5B74, 0x7A49, 0x258E1, -0x294D9, 0x7A65, 0x7A7D, 0x259AC, -0x7ABB, 0x7AB0, 0x7AC2, 0x7AC3, -0x71D1, 0x2648D, 0x41CA, 0x7ADA, -0x7ADD, 0x7AEA, 0x41EF, 0x54B2, -0x25C01, 0x7B0B, 0x7B55, 0x7B29, -0x2530E, 0x25CFE, 0x7BA2, 0x7B6F, -0x839C, 0x25BB4, 0x26C7F, 0x7BD0, -0x8421, 0x7B92, 0x7BB8, 0x25D20, -0x3DAD, 0x25C65, 0x8492, 0x7BFA, -0x7C06, 0x7C35, 0x25CC1, 0x7C44, -0x7C83, 0x24882, 0x7CA6, 0x667D, -0x24578, 0x7CC9, 0x7CC7, 0x7CE6, -0x7C74, 0x7CF3, 0x7CF5, 0x7CCE, -0x7E67, 0x451D, 0x26E44, 0x7D5D, -0x26ED6, 0x748D, 0x7D89, 0x7DAB, -0x7135, 0x7DB3, 0x7DD2, 0x24057, -0x26029, 0x7DE4, 0x3D13, 0x7DF5, -0x217F9, 0x7DE5, 0x2836D, 0x7E1D, -0x26121, 0x2615A, 0x7E6E, 0x7E92, -0x432B, 0x946C, 0x7E27, 0x7F40, -0x7F41, 0x7F47, 0x7936, 0x262D0, -0x99E1, 0x7F97, 0x26351, 0x7FA3, -0x21661, 0x20068, 0x455C, 0x23766, -0x4503, 0x2833A, 0x7FFA, 0x26489, -0x8005, 0x8008, 0x801D, 0x8028, -0x802F, 0x2A087, 0x26CC3, 0x803B, -0x803C, 0x8061, 0x22714, 0x4989, -0x26626, 0x23DE3, 0x266E8, 0x6725, -0x80A7, 0x28A48, 0x8107, 0x811A, -0x58B0, 0x226F6, 0x6C7F, 0x26498, -0x24FB8, 0x64E7, 0x2148A, 0x8218, -0x2185E, 0x6A53, 0x24A65, 0x24A95, -0x447A, 0x8229, 0x20B0D, 0x26A52, -0x23D7E, 0x4FF9, 0x214FD, 0x84E2, -0x8362, 0x26B0A, 0x249A7, 0x23530, -0x21773, 0x23DF8, 0x82AA, 0x691B, -0x2F994, 0x41DB, 0x854B, 0x82D0, -0x831A, 0x20E16, 0x217B4, 0x36C1, -0x2317D, 0x2355A, 0x827B, 0x82E2, -0x8318, 0x23E8B, 0x26DA3, 0x26B05, -0x26B97, 0x235CE, 0x3DBF, 0x831D, -0x55EC, 0x8385, 0x450B, 0x26DA5, -0x83AC, 0x83C1, 0x83D3, 0x347E, -0x26ED4, 0x6A57, 0x855A, 0x3496, -0x26E42, 0x22EEF, 0x8458, 0x25BE4, -0x8471, 0x3DD3, 0x44E4, 0x6AA7, -0x844A, 0x23CB5, 0x7958, 0x84A8, -0x26B96, 0x26E77, 0x26E43, 0x84DE, -0x840F, 0x8391, 0x44A0, 0x8493, -0x84E4, 0x25C91, 0x4240, 0x25CC0, -0x4543, 0x8534, 0x5AF2, 0x26E99, -0x4527, 0x8573, 0x4516, 0x67BF, -0x8616, 0x28625, 0x2863B, 0x85C1, -0x27088, 0x8602, 0x21582, 0x270CD, -0x2F9B2, 0x456A, 0x8628, 0x3648, -0x218A2, 0x53F7, 0x2739A, 0x867E, -0x8771, 0x2A0F8, 0x87EE, 0x22C27, -0x87B1, 0x87DA, 0x880F, 0x5661, -0x866C, 0x6856, 0x460F, 0x8845, -0x8846, 0x275E0, 0x23DB9, 0x275E4, -0x885E, 0x889C, 0x465B, 0x88B4, -0x88B5, 0x63C1, 0x88C5, 0x7777, -0x2770F, 0x8987, 0x898A, 0x89A6, -0x89A9, 0x89A7, 0x89BC, 0x28A25, -0x89E7, 0x27924, 0x27ABD, 0x8A9C, -0x7793, 0x91FE, 0x8A90, 0x27A59, -0x7AE9, 0x27B3A, 0x23F8F, 0x4713, -0x27B38, 0x717C, 0x8B0C, 0x8B1F, -0x25430, 0x25565, 0x8B3F, 0x8B4C, -0x8B4D, 0x8AA9, 0x24A7A, 0x8B90, -0x8B9B, 0x8AAF, 0x216DF, 0x4615, -0x884F, 0x8C9B, 0x27D54, 0x27D8F, -0x2F9D4, 0x3725, 0x27D53, 0x8CD6, -0x27D98, 0x27DBD, 0x8D12, 0x8D03, -0x21910, 0x8CDB, 0x705C, 0x8D11, -0x24CC9, 0x3ED0, 0x8D77, 0x8DA9, -0x28002, 0x21014, 0x2498A, 0x3B7C, -0x281BC, 0x2710C, 0x7AE7, 0x8EAD, -0x8EB6, 0x8EC3, 0x92D4, 0x8F19, -0x8F2D, 0x28365, 0x28412, 0x8FA5, -0x9303, 0x2A29F, 0x20A50, 0x8FB3, -0x492A, 0x289DE, 0x2853D, 0x23DBB, -0x5EF8, 0x23262, 0x8FF9, 0x2A014, -0x286BC, 0x28501, 0x22325, 0x3980, -0x26ED7, 0x9037, 0x2853C, 0x27ABE, -0x9061, 0x2856C, 0x2860B, 0x90A8, -0x28713, 0x90C4, 0x286E6, 0x90AE, -0x90FD, 0x9167, 0x3AF0, 0x91A9, -0x91C4, 0x7CAC, 0x28933, 0x21E89, -0x920E, 0x6C9F, 0x9241, 0x9262, -0x255B9, 0x92B9, 0x28AC6, 0x23C9B, -0x28B0C, 0x255DB, 0x20D31, 0x932C, -0x936B, 0x28AE1, 0x28BEB, 0x708F, -0x5AC3, 0x28AE2, 0x28AE5, 0x4965, -0x9244, 0x28BEC, 0x28C39, 0x28BFF, -0x9373, 0x945B, 0x8EBC, 0x9585, -0x95A6, 0x9426, 0x95A0, 0x6FF6, -0x42B9, 0x2267A, 0x286D8, 0x2127C, -0x23E2E, 0x49DF, 0x6C1C, 0x967B, -0x9696, 0x416C, 0x96A3, 0x26ED5, -0x61DA, 0x96B6, 0x78F5, 0x28AE0, -0x96BD, 0x53CC, 0x49A1, 0x26CB8, -0x20274, 0x26410, 0x290AF, 0x290E5, -0x24AD1, 0x21915, 0x2330A, 0x9731, -0x8642, 0x9736, 0x4A0F, 0x453D, -0x4585, 0x24AE9, 0x7075, 0x5B41, -0x971B, 0x975C, 0x291D5, 0x9757, -0x5B4A, 0x291EB, 0x975F, 0x9425, -0x50D0, 0x230B7, 0x230BC, 0x9789, -0x979F, 0x97B1, 0x97BE, 0x97C0, -0x97D2, 0x97E0, 0x2546C, 0x97EE, -0x741C, 0x29433, 0x97FF, 0x97F5, -0x2941D, 0x2797A, 0x4AD1, 0x9834, -0x9833, 0x984B, 0x9866, 0x3B0E, -0x27175, 0x3D51, 0x20630, 0x2415C, -0x25706, 0x98CA, 0x98B7, 0x98C8, -0x98C7, 0x4AFF, 0x26D27, 0x216D3, -0x55B0, 0x98E1, 0x98E6, 0x98EC, -0x9378, 0x9939, 0x24A29, 0x4B72, -0x29857, 0x29905, 0x99F5, 0x9A0C, -0x9A3B, 0x9A10, 0x9A58, 0x25725, -0x36C4, 0x290B1, 0x29BD5, 0x9AE0, -0x9AE2, 0x29B05, 0x9AF4, 0x4C0E, -0x9B14, 0x9B2D, 0x28600, 0x5034, -0x9B34, 0x269A8, 0x38C3, 0x2307D, -0x9B50, 0x9B40, 0x29D3E, 0x5A45, -0x21863, 0x9B8E, 0x2424B, 0x9C02, -0x9BFF, 0x9C0C, 0x29E68, 0x9DD4, -0x29FB7, 0x2A192, 0x2A1AB, 0x2A0E1, -0x2A123, 0x2A1DF, 0x9D7E, 0x9D83, -0x2A134, 0x9E0E, 0x6888, 0x9DC4, -0x2215B, 0x2A193, 0x2A220, 0x2193B, -0x2A233, 0x9D39, 0x2A0B9, 0x2A2B4, -0x9E90, 0x9E95, 0x9E9E, 0x9EA2, -0x4D34, 0x9EAA, 0x9EAF, 0x24364, -0x9EC1, 0x3B60, 0x39E5, 0x3D1D, -0x4F32, 0x37BE, 0x28C2B, 0x9F02, -0x9F08, 0x4B96, 0x9424, 0x26DA2, -0x9F17, 0x9F16, 0x9F39, 0x569F, -0x568A, 0x9F45, 0x99B8, 0x2908B, -0x97F2, 0x847F, 0x9F62, 0x9F69, -0x7ADC, 0x9F8E, 0x7216, 0x4BBE, -0x24975, 0x249BB, 0x7177, 0x249F8, -0x24348, 0x24A51, 0x739E, 0x28BDA, -0x218FA, 0x799F, 0x2897E, 0x28E36, -0x9369, 0x93F3, 0x28A44, 0x92EC, -0x9381, 0x93CB, 0x2896C, 0x244B9, -0x7217, 0x3EEB, 0x7772, 0x7A43, -0x70D0, 0x24473, 0x243F8, 0x717E, -0x217EF, 0x70A3, 0x218BE, 0x23599, -0x3EC7, 0x21885, 0x2542F, 0x217F8, -0x3722, 0x216FB, 0x21839, 0x36E1, -0x21774, 0x218D1, 0x25F4B, 0x3723, -0x216C0, 0x575B, 0x24A25, 0x213FE, -0x212A8, 0x213C6, 0x214B6, 0x8503, -0x236A6, 0x8503, 0x8455, 0x24994, -0x27165, 0x23E31, 0x2555C, 0x23EFB, -0x27052, 0x44F4, 0x236EE, 0x2999D, -0x26F26, 0x67F9, 0x3733, 0x3C15, -0x3DE7, 0x586C, 0x21922, 0x6810, -0x4057, 0x2373F, 0x240E1, 0x2408B, -0x2410F, 0x26C21, 0x54CB, 0x569E, -0x266B1, 0x5692, 0x20FDF, 0x20BA8, -0x20E0D, 0x93C6, 0x28B13, 0x939C, -0x4EF8, 0x512B, 0x3819, 0x24436, -0x4EBC, 0x20465, 0x2037F, 0x4F4B, -0x4F8A, 0x25651, 0x5A68, 0x201AB, -0x203CB, 0x3999, 0x2030A, 0x20414, -0x3435, 0x4F29, 0x202C0, 0x28EB3, -0x20275, 0x8ADA, 0x2020C, 0x4E98, -0x50CD, 0x510D, 0x4FA2, 0x4F03, -0x24A0E, 0x23E8A, 0x4F42, 0x502E, -0x506C, 0x5081, 0x4FCC, 0x4FE5, -0x5058, 0x50FC, 0x5159, 0x515B, -0x515D, 0x515E, 0x6E76, 0x23595, -0x23E39, 0x23EBF, 0x6D72, 0x21884, -0x23E89, 0x51A8, 0x51C3, 0x205E0, -0x44DD, 0x204A3, 0x20492, 0x20491, -0x8D7A, 0x28A9C, 0x2070E, 0x5259, -0x52A4, 0x20873, 0x52E1, 0x936E, -0x467A, 0x718C, 0x2438C, 0x20C20, -0x249AC, 0x210E4, 0x69D1, 0x20E1D, -0x7479, 0x3EDE, 0x7499, 0x7414, -0x7456, 0x7398, 0x4B8E, 0x24ABC, -0x2408D, 0x53D0, 0x3584, 0x720F, -0x240C9, 0x55B4, 0x20345, 0x54CD, -0x20BC6, 0x571D, 0x925D, 0x96F4, -0x9366, 0x57DD, 0x578D, 0x577F, -0x363E, 0x58CB, 0x5A99, 0x28A46, -0x216FA, 0x2176F, 0x21710, 0x5A2C, -0x59B8, 0x928F, 0x5A7E, 0x5ACF, -0x5A12, 0x25946, 0x219F3, 0x21861, -0x24295, 0x36F5, 0x6D05, 0x7443, -0x5A21, 0x25E83, 0x5A81, 0x28BD7, -0x20413, 0x93E0, 0x748C, 0x21303, -0x7105, 0x4972, 0x9408, 0x289FB, -0x93BD, 0x37A0, 0x5C1E, 0x5C9E, -0x5E5E, 0x5E48, 0x21996, 0x2197C, -0x23AEE, 0x5ECD, 0x5B4F, 0x21903, -0x21904, 0x3701, 0x218A0, 0x36DD, -0x216FE, 0x36D3, 0x812A, 0x28A47, -0x21DBA, 0x23472, 0x289A8, 0x5F0C, -0x5F0E, 0x21927, 0x217AB, 0x5A6B, -0x2173B, 0x5B44, 0x8614, 0x275FD, -0x8860, 0x607E, 0x22860, 0x2262B, -0x5FDB, 0x3EB8, 0x225AF, 0x225BE, -0x29088, 0x26F73, 0x61C0, 0x2003E, -0x20046, 0x2261B, 0x6199, 0x6198, -0x6075, 0x22C9B, 0x22D07, 0x246D4, -0x2914D, 0x6471, 0x24665, 0x22B6A, -0x3A29, 0x22B22, 0x23450, 0x298EA, -0x22E78, 0x6337, 0x2A45B, 0x64B6, -0x6331, 0x63D1, 0x249E3, 0x22D67, -0x62A4, 0x22CA1, 0x643B, 0x656B, -0x6972, 0x3BF4, 0x2308E, 0x232AD, -0x24989, 0x232AB, 0x550D, 0x232E0, -0x218D9, 0x2943F, 0x66CE, 0x23289, -0x231B3, 0x3AE0, 0x4190, 0x25584, -0x28B22, 0x2558F, 0x216FC, 0x2555B, -0x25425, 0x78EE, 0x23103, 0x2182A, -0x23234, 0x3464, 0x2320F, 0x23182, -0x242C9, 0x668E, 0x26D24, 0x666B, -0x4B93, 0x6630, 0x27870, 0x21DEB, -0x6663, 0x232D2, 0x232E1, 0x661E, -0x25872, 0x38D1, 0x2383A, 0x237BC, -0x3B99, 0x237A2, 0x233FE, 0x74D0, -0x3B96, 0x678F, 0x2462A, 0x68B6, -0x681E, 0x3BC4, 0x6ABE, 0x3863, -0x237D5, 0x24487, 0x6A33, 0x6A52, -0x6AC9, 0x6B05, 0x21912, 0x6511, -0x6898, 0x6A4C, 0x3BD7, 0x6A7A, -0x6B57, 0x23FC0, 0x23C9A, 0x93A0, -0x92F2, 0x28BEA, 0x28ACB, 0x9289, -0x2801E, 0x289DC, 0x9467, 0x6DA5, -0x6F0B, 0x249EC, 0x6D67, 0x23F7F, -0x3D8F, 0x6E04, 0x2403C, 0x5A3D, -0x6E0A, 0x5847, 0x6D24, 0x7842, -0x713B, 0x2431A, 0x24276, 0x70F1, -0x7250, 0x7287, 0x7294, 0x2478F, -0x24725, 0x5179, 0x24AA4, 0x205EB, -0x747A, 0x23EF8, 0x2365F, 0x24A4A, -0x24917, 0x25FE1, 0x3F06, 0x3EB1, -0x24ADF, 0x28C23, 0x23F35, 0x60A7, -0x3EF3, 0x74CC, 0x743C, 0x9387, -0x7437, 0x449F, 0x26DEA, 0x4551, -0x7583, 0x3F63, 0x24CD9, 0x24D06, -0x3F58, 0x7555, 0x7673, 0x2A5C6, -0x3B19, 0x7468, 0x28ACC, 0x249AB, -0x2498E, 0x3AFB, 0x3DCD, 0x24A4E, -0x3EFF, 0x249C5, 0x248F3, 0x91FA, -0x5732, 0x9342, 0x28AE3, 0x21864, -0x50DF, 0x25221, 0x251E7, 0x7778, -0x23232, 0x770E, 0x770F, 0x777B, -0x24697, 0x23781, 0x3A5E, 0x248F0, -0x7438, 0x749B, 0x3EBF, 0x24ABA, -0x24AC7, 0x40C8, 0x24A96, 0x261AE, -0x9307, 0x25581, 0x781E, 0x788D, -0x7888, 0x78D2, 0x73D0, 0x7959, -0x27741, 0x256E3, 0x410E, 0x799B, -0x8496, 0x79A5, 0x6A2D, 0x23EFA, -0x7A3A, 0x79F4, 0x416E, 0x216E6, -0x4132, 0x9235, 0x79F1, 0x20D4C, -0x2498C, 0x20299, 0x23DBA, 0x2176E, -0x3597, 0x556B, 0x3570, 0x36AA, -0x201D4, 0x20C0D, 0x7AE2, 0x5A59, -0x226F5, 0x25AAF, 0x25A9C, 0x5A0D, -0x2025B, 0x78F0, 0x5A2A, 0x25BC6, -0x7AFE, 0x41F9, 0x7C5D, 0x7C6D, -0x4211, 0x25BB3, 0x25EBC, 0x25EA6, -0x7CCD, 0x249F9, 0x217B0, 0x7C8E, -0x7C7C, 0x7CAE, 0x6AB2, 0x7DDC, -0x7E07, 0x7DD3, 0x7F4E, 0x26261, -0x2615C, 0x27B48, 0x7D97, 0x25E82, -0x426A, 0x26B75, 0x20916, 0x67D6, -0x2004E, 0x235CF, 0x57C4, 0x26412, -0x263F8, 0x24962, 0x7FDD, 0x7B27, -0x2082C, 0x25AE9, 0x25D43, 0x7B0C, -0x25E0E, 0x99E6, 0x8645, 0x9A63, -0x6A1C, 0x2343F, 0x39E2, 0x249F7, -0x265AD, 0x9A1F, 0x265A0, 0x8480, -0x27127, 0x26CD1, 0x44EA, 0x8137, -0x4402, 0x80C6, 0x8109, 0x8142, -0x267B4, 0x98C3, 0x26A42, 0x8262, -0x8265, 0x26A51, 0x8453, 0x26DA7, -0x8610, 0x2721B, 0x5A86, 0x417F, -0x21840, 0x5B2B, 0x218A1, 0x5AE4, -0x218D8, 0x86A0, 0x2F9BC, 0x23D8F, -0x882D, 0x27422, 0x5A02, 0x886E, -0x4F45, 0x8887, 0x88BF, 0x88E6, -0x8965, 0x894D, 0x25683, 0x8954, -0x27785, 0x27784, 0x28BF5, 0x28BD9, -0x28B9C, 0x289F9, 0x3EAD, 0x84A3, -0x46F5, 0x46CF, 0x37F2, 0x8A3D, -0x8A1C, 0x29448, 0x5F4D, 0x922B, -0x24284, 0x65D4, 0x7129, 0x70C4, -0x21845, 0x9D6D, 0x8C9F, 0x8CE9, -0x27DDC, 0x599A, 0x77C3, 0x59F0, -0x436E, 0x36D4, 0x8E2A, 0x8EA7, -0x24C09, 0x8F30, 0x8F4A, 0x42F4, -0x6C58, 0x6FBB, 0x22321, 0x489B, -0x6F79, 0x6E8B, 0x217DA, 0x9BE9, -0x36B5, 0x2492F, 0x90BB, 0x9097, -0x5571, 0x4906, 0x91BB, 0x9404, -0x28A4B, 0x4062, 0x28AFC, 0x9427, -0x28C1D, 0x28C3B, 0x84E5, 0x8A2B, -0x9599, 0x95A7, 0x9597, 0x9596, -0x28D34, 0x7445, 0x3EC2, 0x248FF, -0x24A42, 0x243EA, 0x3EE7, 0x23225, -0x968F, 0x28EE7, 0x28E66, 0x28E65, -0x3ECC, 0x249ED, 0x24A78, 0x23FEE, -0x7412, 0x746B, 0x3EFC, 0x9741, -0x290B0, 0x6847, 0x4A1D, 0x29093, -0x257DF, 0x975D, 0x9368, 0x28989, -0x28C26, 0x28B2F, 0x263BE, 0x92BA, -0x5B11, 0x8B69, 0x493C, 0x73F9, -0x2421B, 0x979B, 0x9771, 0x9938, -0x20F26, 0x5DC1, 0x28BC5, 0x24AB2, -0x981F, 0x294DA, 0x92F6, 0x295D7, -0x91E5, 0x44C0, 0x28B50, 0x24A67, -0x28B64, 0x98DC, 0x28A45, 0x3F00, -0x922A, 0x4925, 0x8414, 0x993B, -0x994D, 0x27B06, 0x3DFD, 0x999B, -0x4B6F, 0x99AA, 0x9A5C, 0x28B65, -0x258C8, 0x6A8F, 0x9A21, 0x5AFE, -0x9A2F, 0x298F1, 0x4B90, 0x29948, -0x99BC, 0x4BBD, 0x4B97, 0x937D, -0x5872, 0x21302, 0x5822, 0x249B8, -0x214E8, 0x7844, 0x2271F, 0x23DB8, -0x68C5, 0x3D7D, 0x9458, 0x3927, -0x6150, 0x22781, 0x2296B, 0x6107, -0x9C4F, 0x9C53, 0x9C7B, 0x9C35, -0x9C10, 0x9B7F, 0x9BCF, 0x29E2D, -0x9B9F, 0x2A1F5, 0x2A0FE, 0x9D21, -0x4CAE, 0x24104, 0x9E18, 0x4CB0, -0x9D0C, 0x2A1B4, 0x2A0ED, 0x2A0F3, -0x2992F, 0x9DA5, 0x84BD, 0x26E12, -0x26FDF, 0x26B82, 0x85FC, 0x4533, -0x26DA4, 0x26E84, 0x26DF0, 0x8420, -0x85EE, 0x26E00, 0x237D7, 0x26064, -0x79E2, 0x2359C, 0x23640, 0x492D, -0x249DE, 0x3D62, 0x93DB, 0x92BE, -0x9348, 0x202BF, 0x78B9, 0x9277, -0x944D, 0x4FE4, 0x3440, 0x9064, -0x2555D, 0x783D, 0x7854, 0x78B6, -0x784B, 0x21757, 0x231C9, 0x24941, -0x369A, 0x4F72, 0x6FDA, 0x6FD9, -0x701E, 0x701E, 0x5414, 0x241B5, -0x57BB, 0x58F3, 0x578A, 0x9D16, -0x57D7, 0x7134, 0x34AF, 0x241AC, -0x71EB, 0x26C40, 0x24F97, 0x5B28, -0x217B5, 0x28A49, 0x610C, 0x5ACE, -0x5A0B, 0x42BC, 0x24488, 0x372C, -0x4B7B, 0x289FC, 0x93BB, 0x93B8, -0x218D6, 0x20F1D, 0x8472, 0x26CC0, -0x21413, 0x242FA, 0x22C26, 0x243C1, -0x5994, 0x23DB7, 0x26741, 0x7DA8, -0x2615B, 0x260A4, 0x249B9, 0x2498B, -0x289FA, 0x92E5, 0x73E2, 0x3EE9, -0x74B4, 0x28B63, 0x2189F, 0x3EE1, -0x24AB3, 0x6AD8, 0x73F3, 0x73FB, -0x3ED6, 0x24A3E, 0x24A94, 0x217D9, -0x24A66, 0x203A7, 0x21424, 0x249E5, -0x7448, 0x24916, 0x70A5, 0x24976, -0x9284, 0x73E6, 0x935F, 0x204FE, -0x9331, 0x28ACE, 0x28A16, 0x9386, -0x28BE7, 0x255D5, 0x4935, 0x28A82, -0x716B, 0x24943, 0x20CFF, 0x56A4, -0x2061A, 0x20BEB, 0x20CB8, 0x5502, -0x79C4, 0x217FA, 0x7DFE, 0x216C2, -0x24A50, 0x21852, 0x452E, 0x9401, -0x370A, 0x28AC0, 0x249AD, 0x59B0, -0x218BF, 0x21883, 0x27484, 0x5AA1, -0x36E2, 0x23D5B, 0x36B0, 0x925F, -0x5A79, 0x28A81, 0x21862, 0x9374, -0x3CCD, 0x20AB4, 0x4A96, 0x398A, -0x50F4, 0x3D69, 0x3D4C, 0x2139C, -0x7175, 0x42FB, 0x28218, 0x6E0F, -0x290E4, 0x44EB, 0x6D57, 0x27E4F, -0x7067, 0x6CAF, 0x3CD6, 0x23FED, -0x23E2D, 0x6E02, 0x6F0C, 0x3D6F, -0x203F5, 0x7551, 0x36BC, 0x34C8, -0x4680, 0x3EDA, 0x4871, 0x59C4, -0x926E, 0x493E, 0x8F41, 0x28C1C, -0x26BC0, 0x5812, 0x57C8, 0x36D6, -0x21452, 0x70FE, 0x24362, 0x24A71, -0x22FE3, 0x212B0, 0x223BD, 0x68B9, -0x6967, 0x21398, 0x234E5, 0x27BF4, -0x236DF, 0x28A83, 0x237D6, 0x233FA, -0x24C9F, 0x6A1A, 0x236AD, 0x26CB7, -0x843E, 0x44DF, 0x44CE, 0x26D26, -0x26D51, 0x26C82, 0x26FDE, 0x6F17, -0x27109, 0x833D, 0x2173A, 0x83ED, -0x26C80, 0x27053, 0x217DB, 0x5989, -0x5A82, 0x217B3, 0x5A61, 0x5A71, -0x21905, 0x241FC, 0x372D, 0x59EF, -0x2173C, 0x36C7, 0x718E, 0x9390, -0x669A, 0x242A5, 0x5A6E, 0x5A2B, -0x24293, 0x6A2B, 0x23EF9, 0x27736, -0x2445B, 0x242CA, 0x711D, 0x24259, -0x289E1, 0x4FB0, 0x26D28, 0x5CC2, -0x244CE, 0x27E4D, 0x243BD, 0x6A0C, -0x24256, 0x21304, 0x70A6, 0x7133, -0x243E9, 0x3DA5, 0x6CDF, 0x2F825, -0x24A4F, 0x7E65, 0x59EB, 0x5D2F, -0x3DF3, 0x5F5C, 0x24A5D, 0x217DF, -0x7DA4, 0x8426, 0x5485, 0x23AFA, -0x23300, 0x20214, 0x577E, 0x208D5, -0x20619, 0x3FE5, 0x21F9E, 0x2A2B6, -0x7003, 0x2915B, 0x5D70, 0x738F, -0x7CD3, 0x28A59, 0x29420, 0x4FC8, -0x7FE7, 0x72CD, 0x7310, 0x27AF4, -0x7338, 0x7339, 0x256F6, 0x7341, -0x7348, 0x3EA9, 0x27B18, 0x906C, -0x71F5, 0x248F2, 0x73E1, 0x81F6, -0x3ECA, 0x770C, 0x3ED1, 0x6CA2, -0x56FD, 0x7419, 0x741E, 0x741F, -0x3EE2, 0x3EF0, 0x3EF4, 0x3EFA, -0x74D3, 0x3F0E, 0x3F53, 0x7542, -0x756D, 0x7572, 0x758D, 0x3F7C, -0x75C8, 0x75DC, 0x3FC0, 0x764D, -0x3FD7, 0x7674, 0x3FDC, 0x767A, -0x24F5C, 0x7188, 0x5623, 0x8980, -0x5869, 0x401D, 0x7743, 0x4039, -0x6761, 0x4045, 0x35DB, 0x7798, -0x406A, 0x406F, 0x5C5E, 0x77BE, -0x77CB, 0x58F2, 0x7818, 0x70B9, -0x781C, 0x40A8, 0x7839, 0x7847, -0x7851, 0x7866, 0x8448, 0x25535, -0x7933, 0x6803, 0x7932, 0x4103, -0x4109, 0x7991, 0x7999, 0x8FBB, -0x7A06, 0x8FBC, 0x4167, 0x7A91, -0x41B2, 0x7ABC, 0x8279, 0x41C4, -0x7ACF, 0x7ADB, 0x41CF, 0x4E21, -0x7B62, 0x7B6C, 0x7B7B, 0x7C12, -0x7C1B, 0x4260, 0x427A, 0x7C7B, -0x7C9C, 0x428C, 0x7CB8, 0x4294, -0x7CED, 0x8F93, 0x70C0, 0x20CCF, -0x7DCF, 0x7DD4, 0x7DD0, 0x7DFD, -0x7FAE, 0x7FB4, 0x729F, 0x4397, -0x8020, 0x8025, 0x7B39, 0x802E, -0x8031, 0x8054, 0x3DCC, 0x57B4, -0x70A0, 0x80B7, 0x80E9, 0x43ED, -0x810C, 0x732A, 0x810E, 0x8112, -0x7560, 0x8114, 0x4401, 0x3B39, -0x8156, 0x8159, 0x815A, 0x4413, -0x583A, 0x817C, 0x8184, 0x4425, -0x8193, 0x442D, 0x81A5, 0x57EF, -0x81C1, 0x81E4, 0x8254, 0x448F, -0x82A6, 0x8276, 0x82CA, 0x82D8, -0x82FF, 0x44B0, 0x8357, 0x9669, -0x698A, 0x8405, 0x70F5, 0x8464, -0x60E3, 0x8488, 0x4504, 0x84BE, -0x84E1, 0x84F8, 0x8510, 0x8538, -0x8552, 0x453B, 0x856F, 0x8570, -0x85E0, 0x4577, 0x8672, 0x8692, -0x86B2, 0x86EF, 0x9645, 0x878B, -0x4606, 0x4617, 0x88AE, 0x88FF, -0x8924, 0x8947, 0x8991, 0x27967, -0x8A29, 0x8A38, 0x8A94, 0x8AB4, -0x8C51, 0x8CD4, 0x8CF2, 0x8D1C, -0x4798, 0x585F, 0x8DC3, 0x47ED, -0x4EEE, 0x8E3A, 0x55D8, 0x5754, -0x8E71, 0x55F5, 0x8EB0, 0x4837, -0x8ECE, 0x8EE2, 0x8EE4, 0x8EED, -0x8EF2, 0x8FB7, 0x8FC1, 0x8FCA, -0x8FCC, 0x9033, 0x99C4, 0x48AD, -0x98E0, 0x9213, 0x491E, 0x9228, -0x9258, 0x926B, 0x92B1, 0x92AE, -0x92BF, 0x92E3, 0x92EB, 0x92F3, -0x92F4, 0x92FD, 0x9343, 0x9384, -0x93AD, 0x4945, 0x4951, 0x9EBF, -0x9417, 0x5301, 0x941D, 0x942D, -0x943E, 0x496A, 0x9454, 0x9479, -0x952D, 0x95A2, 0x49A7, 0x95F4, -0x9633, 0x49E5, 0x67A0, 0x4A24, -0x9740, 0x4A35, 0x97B2, 0x97C2, -0x5654, 0x4AE4, 0x60E8, 0x98B9, -0x4B19, 0x98F1, 0x5844, 0x990E, -0x9919, 0x51B4, 0x991C, 0x9937, -0x9942, 0x995D, 0x9962, 0x4B70, -0x99C5, 0x4B9D, 0x9A3C, 0x9B0F, -0x7A83, 0x9B69, 0x9B81, 0x9BDD, -0x9BF1, 0x9BF4, 0x4C6D, 0x9C20, -0x376F, 0x21BC2, 0x9D49, 0x9C3A, -0x9EFE, 0x5650, 0x9D93, 0x9DBD, -0x9DC0, 0x9DFC, 0x94F6, 0x8FB6, -0x9E7B, 0x9EAC, 0x9EB1, 0x9EBD, -0x9EC6, 0x94DC, 0x9EE2, 0x9EF1, -0x9EF8, 0x7AC8, 0x9F44, 0x20094, -0x202B7, 0x203A0, 0x691A, 0x94C3, -0x59AC, 0x204D7, 0x5840, 0x94C1, -0x37B9, 0x205D5, 0x20615, 0x20676, -0x216BA, 0x5757, 0x7173, 0x20AC2, -0x20ACD, 0x20BBF, 0x546A, 0x2F83B, -0x20BCB, 0x549E, 0x20BFB, 0x20C3B, -0x20C53, 0x20C65, 0x20C7C, 0x60E7, -0x20C8D, 0x567A, 0x20CB5, 0x20CDD, -0x20CED, 0x20D6F, 0x20DB2, 0x20DC8, -0x6955, 0x9C2F, 0x87A5, 0x20E04, -0x20E0E, 0x20ED7, 0x20F90, 0x20F2D, -0x20E73, 0x5C20, 0x20FBC, 0x5E0B, -0x2105C, 0x2104F, 0x21076, 0x671E, -0x2107B, 0x21088, 0x21096, 0x3647, -0x210BF, 0x210D3, 0x2112F, 0x2113B, -0x5364, 0x84AD, 0x212E3, 0x21375, -0x21336, 0x8B81, 0x21577, 0x21619, -0x217C3, 0x217C7, 0x4E78, 0x70BB, -0x2182D, 0x2196A, 0x21A2D, 0x21A45, -0x21C2A, 0x21C70, 0x21CAC, 0x21EC8, -0x62C3, 0x21ED5, 0x21F15, 0x7198, -0x6855, 0x22045, 0x69E9, 0x36C8, -0x2227C, 0x223D7, 0x223FA, 0x2272A, -0x22871, 0x2294F, 0x82FD, 0x22967, -0x22993, 0x22AD5, 0x89A5, 0x22AE8, -0x8FA0, 0x22B0E, 0x97B8, 0x22B3F, -0x9847, 0x9ABD, 0x22C4C, 0x0000, -0x22C88, 0x22CB7, 0x25BE8, 0x22D08, -0x22D12, 0x22DB7, 0x22D95, 0x22E42, -0x22F74, 0x22FCC, 0x23033, 0x23066, -0x2331F, 0x233DE, 0x5FB1, 0x6648, -0x66BF, 0x27A79, 0x23567, 0x235F3, -0x7201, 0x249BA, 0x77D7, 0x2361A, -0x23716, 0x7E87, 0x20346, 0x58B5, -0x670E, 0x6918, 0x23AA7, 0x27657, -0x25FE2, 0x23E11, 0x23EB9, 0x275FE, -0x2209A, 0x48D0, 0x4AB8, 0x24119, -0x28A9A, 0x242EE, 0x2430D, 0x2403B, -0x24334, 0x24396, 0x24A45, 0x205CA, -0x51D2, 0x20611, 0x599F, 0x21EA8, -0x3BBE, 0x23CFF, 0x24404, 0x244D6, -0x5788, 0x24674, 0x399B, 0x2472F, -0x285E8, 0x299C9, 0x3762, 0x221C3, -0x8B5E, 0x28B4E, 0x99D6, 0x24812, -0x248FB, 0x24A15, 0x7209, 0x24AC0, -0x20C78, 0x5965, 0x24EA5, 0x24F86, -0x20779, 0x8EDA, 0x2502C, 0x528F, -0x573F, 0x7171, 0x25299, 0x25419, -0x23F4A, 0x24AA7, 0x55BC, 0x25446, -0x2546E, 0x26B52, 0x91D4, 0x3473, -0x2553F, 0x27632, 0x2555E, 0x4718, -0x25562, 0x25566, 0x257C7, 0x2493F, -0x2585D, 0x5066, 0x34FB, 0x233CC, -0x60DE, 0x25903, 0x477C, 0x28948, -0x25AAE, 0x25B89, 0x25C06, 0x21D90, -0x57A1, 0x7151, 0x6FB6, 0x26102, -0x27C12, 0x9056, 0x261B2, 0x24F9A, -0x8B62, 0x26402, 0x2644A, 0x5D5B, -0x26BF7, 0x8F36, 0x26484, 0x2191C, -0x8AEA, 0x249F6, 0x26488, 0x23FEF, -0x26512, 0x4BC0, 0x265BF, 0x266B5, -0x2271B, 0x9465, 0x257E1, 0x6195, -0x5A27, 0x2F8CD, 0x4FBB, 0x56B9, -0x24521, 0x266FC, 0x4E6A, 0x24934, -0x9656, 0x6D8F, 0x26CBD, 0x3618, -0x8977, 0x26799, 0x2686E, 0x26411, -0x2685E, 0x71DF, 0x268C7, 0x7B42, -0x290C0, 0x20A11, 0x26926, 0x9104, -0x26939, 0x7A45, 0x9DF0, 0x269FA, -0x9A26, 0x26A2D, 0x365F, 0x26469, -0x20021, 0x7983, 0x26A34, 0x26B5B, -0x5D2C, 0x23519, 0x83CF, 0x26B9D, -0x46D0, 0x26CA4, 0x753B, 0x8865, -0x26DAE, 0x58B6, 0x371C, 0x2258D, -0x2704B, 0x271CD, 0x3C54, 0x27280, -0x27285, 0x9281, 0x2217A, 0x2728B, -0x9330, 0x272E6, 0x249D0, 0x6C39, -0x949F, 0x27450, 0x20EF8, 0x8827, -0x88F5, 0x22926, 0x28473, 0x217B1, -0x6EB8, 0x24A2A, 0x21820, 0x39A4, -0x36B9, 0x5C10, 0x79E3, 0x453F, -0x66B6, 0x29CAD, 0x298A4, 0x8943, -0x277CC, 0x27858, 0x56D6, 0x40DF, -0x2160A, 0x39A1, 0x2372F, 0x280E8, -0x213C5, 0x71AD, 0x8366, 0x279DD, -0x291A8, 0x5A67, 0x4CB7, 0x270AF, -0x289AB, 0x279FD, 0x27A0A, 0x27B0B, -0x27D66, 0x2417A, 0x7B43, 0x797E, -0x28009, 0x6FB5, 0x2A2DF, 0x6A03, -0x28318, 0x53A2, 0x26E07, 0x93BF, -0x6836, 0x975D, 0x2816F, 0x28023, -0x269B5, 0x213ED, 0x2322F, 0x28048, -0x5D85, 0x28C30, 0x28083, 0x5715, -0x9823, 0x28949, 0x5DAB, 0x24988, -0x65BE, 0x69D5, 0x53D2, 0x24AA5, -0x23F81, 0x3C11, 0x6736, 0x28090, -0x280F4, 0x2812E, 0x21FA1, 0x2814F, -0x28189, 0x281AF, 0x2821A, 0x28306, -0x2832F, 0x2838A, 0x35CA, 0x28468, -0x286AA, 0x48FA, 0x63E6, 0x28956, -0x7808, 0x9255, 0x289B8, 0x43F2, -0x289E7, 0x43DF, 0x289E8, 0x28B46, -0x28BD4, 0x59F8, 0x28C09, 0x8F0B, -0x28FC5, 0x290EC, 0x7B51, 0x29110, -0x2913C, 0x3DF7, 0x2915E, 0x24ACA, -0x8FD0, 0x728F, 0x568B, 0x294E7, -0x295E9, 0x295B0, 0x295B8, 0x29732, -0x298D1, 0x29949, 0x2996A, 0x299C3, -0x29A28, 0x29B0E, 0x29D5A, 0x29D9B, -0x7E9F, 0x29EF8, 0x29F23, 0x4CA4, -0x9547, 0x2A293, 0x71A2, 0x2A2FF, -0x4D91, 0x9012, 0x2A5CB, 0x4D9C, -0x20C9C, 0x8FBE, 0x55C1, 0x8FBA, -0x224B0, 0x8FB9, 0x24A93, 0x4509, -0x7E7F, 0x6F56, 0x6AB1, 0x4EEA, -0x34E4, 0x28B2C, 0x2789D, 0x373A, -0x8E80, 0x217F5, 0x28024, 0x28B6C, -0x28B99, 0x27A3E, 0x266AF, 0x3DEB, -0x27655, 0x23CB7, 0x25635, 0x25956, -0x4E9A, 0x25E81, 0x26258, 0x56BF, -0x20E6D, 0x8E0E, 0x5B6D, 0x23E88, -0x24C9E, 0x63DE, 0x62D0, 0x217F6, -0x2187B, 0x6530, 0x562D, 0x25C4A, -0x541A, 0x25311, 0x3DC6, 0x29D98, -0x4C7D, 0x5622, 0x561E, 0x7F49, -0x25ED8, 0x5975, 0x23D40, 0x8770, -0x4E1C, 0x20FEA, 0x20D49, 0x236BA, -0x8117, 0x9D5E, 0x8D18, 0x763B, -0x9C45, 0x764E, 0x77B9, 0x9345, -0x5432, 0x8148, 0x82F7, 0x5625, -0x8132, 0x8418, 0x80BD, 0x55EA, -0x7962, 0x5643, 0x5416, 0x20E9D, -0x35CE, 0x5605, 0x55F1, 0x66F1, -0x282E2, 0x362D, 0x7534, 0x55F0, -0x55BA, 0x5497, 0x5572, 0x20C41, -0x20C96, 0x5ED0, 0x25148, 0x20E76, -0x22C62, 0x20EA2, 0x9EAB, 0x7D5A, -0x55DE, 0x21075, 0x629D, 0x976D, -0x5494, 0x8CCD, 0x71F6, 0x9176, -0x63FC, 0x63B9, 0x63FE, 0x5569, -0x22B43, 0x9C72, 0x22EB3, 0x519A, -0x34DF, 0x20DA7, 0x51A7, 0x544D, -0x551E, 0x5513, 0x7666, 0x8E2D, -0x2688A, 0x75B1, 0x80B6, 0x8804, -0x8786, 0x88C7, 0x81B6, 0x841C, -0x210C1, 0x44EC, 0x7304, 0x24706, -0x5B90, 0x830B, 0x26893, 0x567B, -0x226F4, 0x27D2F, 0x241A3, 0x27D73, -0x26ED0, 0x272B6, 0x9170, 0x211D9, -0x9208, 0x23CFC, 0x2A6A9, 0x20EAC, -0x20EF9, 0x7266, 0x21CA2, 0x474E, -0x24FC2, 0x27FF9, 0x20FEB, 0x40FA, -0x9C5D, 0x651F, 0x22DA0, 0x48F3, -0x247E0, 0x29D7C, 0x20FEC, 0x20E0A, -0x6062, 0x275A3, 0x20FED, 0x0000, -0x26048, 0x21187, 0x71A3, 0x7E8E, -0x9D50, 0x4E1A, 0x4E04, 0x3577, -0x5B0D, 0x6CB2, 0x5367, 0x36AC, -0x39DC, 0x537D, 0x36A5, 0x24618, -0x589A, 0x24B6E, 0x822D, 0x544B, -0x57AA, 0x25A95, 0x20979, 0x0000, -0x3A52, 0x22465, 0x7374, 0x29EAC, -0x4D09, 0x9BED, 0x23CFE, 0x29F30, -0x4C5B, 0x24FA9, 0x2959E, 0x29FDE, -0x845C, 0x23DB6, 0x272B2, 0x267B3, -0x23720, 0x632E, 0x7D25, 0x23EF7, -0x23E2C, 0x3A2A, 0x9008, 0x52CC, -0x3E74, 0x367A, 0x45E9, 0x2048E, -0x7640, 0x5AF0, 0x20EB6, 0x787A, -0x27F2E, 0x58A7, 0x40BF, 0x567C, -0x9B8B, 0x5D74, 0x7654, 0x2A434, -0x9E85, 0x4CE1, 0x75F9, 0x37FB, -0x6119, 0x230DA, 0x243F2, 0x0000, -0x565D, 0x212A9, 0x57A7, 0x24963, -0x29E06, 0x5234, 0x270AE, 0x35AD, -0x6C4A, 0x9D7C, 0x7C56, 0x9B39, -0x57DE, 0x2176C, 0x5C53, 0x64D3, -0x294D0, 0x26335, 0x27164, 0x86AD, -0x20D28, 0x26D22, 0x24AE2, 0x20D71, -0x0000, 0x51FE, 0x21F0F, 0x5D8E, -0x9703, 0x21DD1, 0x9E81, 0x904C, -0x7B1F, 0x9B02, 0x5CD1, 0x7BA3, -0x6268, 0x6335, 0x9AFF, 0x7BCF, -0x9B2A, 0x7C7E, 0x9B2E, 0x7C42, -0x7C86, 0x9C15, 0x7BFC, 0x9B09, -0x9F17, 0x9C1B, 0x2493E, 0x9F5A, -0x5573, 0x5BC3, 0x4FFD, 0x9E98, -0x4FF2, 0x5260, 0x3E06, 0x52D1, -0x5767, 0x5056, 0x59B7, 0x5E12, -0x97C8, 0x9DAB, 0x8F5C, 0x5469, -0x97B4, 0x9940, 0x97BA, 0x532C, -0x6130, 0x692C, 0x53DA, 0x9C0A, -0x9D02, 0x4C3B, 0x9641, 0x6980, -0x50A6, 0x7546, 0x2176D, 0x99DA, -0x5273, 0x0000, 0x9159, 0x9681, -0x915C, 0x0000, 0x9151, 0x28E97, -0x637F, 0x26D23, 0x6ACA, 0x5611, -0x918E, 0x757A, 0x6285, 0x203FC, -0x734F, 0x7C70, 0x25C21, 0x23CFD, -0x0000, 0x24919, 0x76D6, 0x9B9D, -0x4E2A, 0x20CD4, 0x83BE, 0x8842, -0x0000, 0x5C4A, 0x69C0, 0x50ED, -0x577A, 0x521F, 0x5DF5, 0x4ECE, -0x6C31, 0x201F2, 0x4F39, 0x549C, -0x54DA, 0x529A, 0x8D82, 0x35FE, -0x5F0C, 0x35F3, 0x0000, 0x6B52, -0x917C, 0x9FA5, 0x9B97, 0x982E, -0x98B4, 0x9ABA, 0x9EA8, 0x9E84, -0x717A, 0x7B14, 0x0000, 0x6BFA, -0x8818, 0x7F78, 0x0000, 0x5620, -0x2A64A, 0x8E77, 0x9F53, 0x0000, -0x8DD4, 0x8E4F, 0x9E1C, 0x8E01, -0x6282, 0x2837D, 0x8E28, 0x8E75, -0x7AD3, 0x24A77, 0x7A3E, 0x78D8, -0x6CEA, 0x8A67, 0x7607, 0x28A5A, -0x9F26, 0x6CCE, 0x87D6, 0x75C3, -0x2A2B2, 0x7853, 0x2F840, 0x8D0C, -0x72E2, 0x7371, 0x8B2D, 0x7302, -0x74F1, 0x8CEB, 0x24ABB, 0x862F, -0x5FBA, 0x88A0, 0x44B7, 0x0000, -0x2183B, 0x26E05, 0x0000, 0x8A7E, -0x2251B, 0x0000, 0x60FD, 0x7667, -0x9AD7, 0x9D44, 0x936E, 0x9B8F, -0x87F5, 0x0000, 0x880F, 0x8CF7, -0x732C, 0x9721, 0x9BB0, 0x35D6, -0x72B2, 0x4C07, 0x7C51, 0x994A, -0x26159, 0x6159, 0x4C04, 0x9E96, -0x617D, 0x0000, 0x575F, 0x616F, -0x62A6, 0x6239, 0x62CE, 0x3A5C, -0x61E2, 0x53AA, 0x233F5, 0x6364, -0x6802, 0x35D2, 0x5D57, 0x28BC2, -0x8FDA, 0x28E39, 0x0000, 0x50D9, -0x21D46, 0x7906, 0x5332, 0x9638, -0x20F3B, 0x4065, 0x0000, 0x77FE, -0x0000, 0x7CC2, 0x25F1A, 0x7CDA, -0x7A2D, 0x8066, 0x8063, 0x7D4D, -0x7505, 0x74F2, 0x8994, 0x821A, -0x670C, 0x8062, 0x27486, 0x805B, -0x74F0, 0x8103, 0x7724, 0x8989, -0x267CC, 0x7553, 0x26ED1, 0x87A9, -0x87CE, 0x81C8, 0x878C, 0x8A49, -0x8CAD, 0x8B43, 0x772B, 0x74F8, -0x84DA, 0x3635, 0x69B2, 0x8DA6, -0x0000, 0x89A9, 0x7468, 0x6DB9, -0x87C1, 0x24011, 0x74E7, 0x3DDB, -0x7176, 0x60A4, 0x619C, 0x3CD1, -0x7162, 0x6077, 0x0000, 0x7F71, -0x28B2D, 0x7250, 0x60E9, 0x4B7E, -0x5220, 0x3C18, 0x23CC7, 0x25ED7, -0x27656, 0x25531, 0x21944, 0x212FE, -0x29903, 0x26DDC, 0x270AD, 0x5CC1, -0x261AD, 0x28A0F, 0x23677, 0x200EE, -0x26846, 0x24F0E, 0x4562, 0x5B1F, -0x2634C, 0x9F50, 0x9EA6, 0x2626B, -0x3000, 0xFF0C, 0x3001, 0x3002, -0xFF0E, 0x2027, 0xFF1B, 0xFF1A, -0xFF1F, 0xFF01, 0xFE30, 0x2026, -0x2025, 0xFE50, 0xFE51, 0xFE52, -0x00B7, 0xFE54, 0xFE55, 0xFE56, -0xFE57, 0xFF5C, 0x2013, 0xFE31, -0x2014, 0xFE33, 0x2574, 0xFE34, -0xFE4F, 0xFF08, 0xFF09, 0xFE35, -0xFE36, 0xFF5B, 0xFF5D, 0xFE37, -0xFE38, 0x3014, 0x3015, 0xFE39, -0xFE3A, 0x3010, 0x3011, 0xFE3B, -0xFE3C, 0x300A, 0x300B, 0xFE3D, -0xFE3E, 0x3008, 0x3009, 0xFE3F, -0xFE40, 0x300C, 0x300D, 0xFE41, -0xFE42, 0x300E, 0x300F, 0xFE43, -0xFE44, 0xFE59, 0xFE5A, 0xFE5B, -0xFE5C, 0xFE5D, 0xFE5E, 0x2018, -0x2019, 0x201C, 0x201D, 0x301D, -0x301E, 0x2035, 0x2032, 0xFF03, -0xFF06, 0xFF0A, 0x203B, 0x00A7, -0x3003, 0x25CB, 0x25CF, 0x25B3, -0x25B2, 0x25CE, 0x2606, 0x2605, -0x25C7, 0x25C6, 0x25A1, 0x25A0, -0x25BD, 0x25BC, 0x32A3, 0x2105, -0x00AF, 0xFFE3, 0xFF3F, 0x02CD, -0xFE49, 0xFE4A, 0xFE4D, 0xFE4E, -0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, -0xFE61, 0xFF0B, 0xFF0D, 0x00D7, -0x00F7, 0x00B1, 0x221A, 0xFF1C, -0xFF1E, 0xFF1D, 0x2266, 0x2267, -0x2260, 0x221E, 0x2252, 0x2261, -0xFE62, 0xFE63, 0xFE64, 0xFE65, -0xFE66, 0xFF5E, 0x2229, 0x222A, -0x22A5, 0x2220, 0x221F, 0x22BF, -0x33D2, 0x33D1, 0x222B, 0x222E, -0x2235, 0x2234, 0x2640, 0x2642, -0x2295, 0x2299, 0x2191, 0x2193, -0x2190, 0x2192, 0x2196, 0x2197, -0x2199, 0x2198, 0x2225, 0x2223, -0xFF0F, 0xFF3C, 0x2215, 0xFE68, -0xFF04, 0xFFE5, 0x3012, 0xFFE0, -0xFFE1, 0xFF05, 0xFF20, 0x2103, -0x2109, 0xFE69, 0xFE6A, 0xFE6B, -0x33D5, 0x339C, 0x339D, 0x339E, -0x33CE, 0x33A1, 0x338E, 0x338F, -0x33C4, 0x00B0, 0x5159, 0x515B, -0x515E, 0x515D, 0x5161, 0x5163, -0x55E7, 0x74E9, 0x7CCE, 0x2581, -0x2582, 0x2583, 0x2584, 0x2585, -0x2586, 0x2587, 0x2588, 0x258F, -0x258E, 0x258D, 0x258C, 0x258B, -0x258A, 0x2589, 0x253C, 0x2534, -0x252C, 0x2524, 0x251C, 0x2594, -0x2500, 0x2502, 0x2595, 0x250C, -0x2510, 0x2514, 0x2518, 0x256D, -0x256E, 0x2570, 0x256F, 0x2550, -0x255E, 0x256A, 0x2561, 0x25E2, -0x25E3, 0x25E5, 0x25E4, 0x2571, -0x2572, 0x2573, 0xFF10, 0xFF11, -0xFF12, 0xFF13, 0xFF14, 0xFF15, -0xFF16, 0xFF17, 0xFF18, 0xFF19, -0x2160, 0x2161, 0x2162, 0x2163, -0x2164, 0x2165, 0x2166, 0x2167, -0x2168, 0x2169, 0x3021, 0x3022, -0x3023, 0x3024, 0x3025, 0x3026, -0x3027, 0x3028, 0x3029, 0x5341, -0x5344, 0x5345, 0xFF21, 0xFF22, -0xFF23, 0xFF24, 0xFF25, 0xFF26, -0xFF27, 0xFF28, 0xFF29, 0xFF2A, -0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, -0xFF2F, 0xFF30, 0xFF31, 0xFF32, -0xFF33, 0xFF34, 0xFF35, 0xFF36, -0xFF37, 0xFF38, 0xFF39, 0xFF3A, -0xFF41, 0xFF42, 0xFF43, 0xFF44, -0xFF45, 0xFF46, 0xFF47, 0xFF48, -0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, -0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, -0xFF51, 0xFF52, 0xFF53, 0xFF54, -0xFF55, 0xFF56, 0xFF57, 0xFF58, -0xFF59, 0xFF5A, 0x0391, 0x0392, -0x0393, 0x0394, 0x0395, 0x0396, -0x0397, 0x0398, 0x0399, 0x039A, -0x039B, 0x039C, 0x039D, 0x039E, -0x039F, 0x03A0, 0x03A1, 0x03A3, -0x03A4, 0x03A5, 0x03A6, 0x03A7, -0x03A8, 0x03A9, 0x03B1, 0x03B2, -0x03B3, 0x03B4, 0x03B5, 0x03B6, -0x03B7, 0x03B8, 0x03B9, 0x03BA, -0x03BB, 0x03BC, 0x03BD, 0x03BE, -0x03BF, 0x03C0, 0x03C1, 0x03C3, -0x03C4, 0x03C5, 0x03C6, 0x03C7, -0x03C8, 0x03C9, 0x3105, 0x3106, -0x3107, 0x3108, 0x3109, 0x310A, -0x310B, 0x310C, 0x310D, 0x310E, -0x310F, 0x3110, 0x3111, 0x3112, -0x3113, 0x3114, 0x3115, 0x3116, -0x3117, 0x3118, 0x3119, 0x311A, -0x311B, 0x311C, 0x311D, 0x311E, -0x311F, 0x3120, 0x3121, 0x3122, -0x3123, 0x3124, 0x3125, 0x3126, -0x3127, 0x3128, 0x3129, 0x02D9, -0x02C9, 0x02CA, 0x02C7, 0x02CB, -0x2400, 0x2401, 0x2402, 0x2403, -0x2404, 0x2405, 0x2406, 0x2407, -0x2408, 0x2409, 0x240A, 0x240B, -0x240C, 0x240D, 0x240E, 0x240F, -0x2410, 0x2411, 0x2412, 0x2413, -0x2414, 0x2415, 0x2416, 0x2417, -0x2418, 0x2419, 0x241A, 0x241B, -0x241C, 0x241D, 0x241E, 0x241F, -0x2421, 0x20AC, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x4E00, -0x4E59, 0x4E01, 0x4E03, 0x4E43, -0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, -0x513F, 0x5165, 0x516B, 0x51E0, -0x5200, 0x5201, 0x529B, 0x5315, -0x5341, 0x535C, 0x53C8, 0x4E09, -0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, -0x4E38, 0x51E1, 0x4E45, 0x4E48, -0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, -0x5140, 0x5203, 0x52FA, 0x5343, -0x53C9, 0x53E3, 0x571F, 0x58EB, -0x5915, 0x5927, 0x5973, 0x5B50, -0x5B51, 0x5B53, 0x5BF8, 0x5C0F, -0x5C22, 0x5C38, 0x5C71, 0x5DDD, -0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, -0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, -0x5F13, 0x624D, 0x4E11, 0x4E10, -0x4E0D, 0x4E2D, 0x4E30, 0x4E39, -0x4E4B, 0x5C39, 0x4E88, 0x4E91, -0x4E95, 0x4E92, 0x4E94, 0x4EA2, -0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, -0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, -0x4EC4, 0x5143, 0x5141, 0x5167, -0x516D, 0x516E, 0x516C, 0x5197, -0x51F6, 0x5206, 0x5207, 0x5208, -0x52FB, 0x52FE, 0x52FF, 0x5316, -0x5339, 0x5348, 0x5347, 0x5345, -0x535E, 0x5384, 0x53CB, 0x53CA, -0x53CD, 0x58EC, 0x5929, 0x592B, -0x592A, 0x592D, 0x5B54, 0x5C11, -0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, -0x5E7B, 0x5EFF, 0x5F14, 0x5F15, -0x5FC3, 0x6208, 0x6236, 0x624B, -0x624E, 0x652F, 0x6587, 0x6597, -0x65A4, 0x65B9, 0x65E5, 0x66F0, -0x6708, 0x6728, 0x6B20, 0x6B62, -0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, -0x6C0F, 0x6C34, 0x706B, 0x722A, -0x7236, 0x723B, 0x7247, 0x7259, -0x725B, 0x72AC, 0x738B, 0x4E19, -0x4E16, 0x4E15, 0x4E14, 0x4E18, -0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, -0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, -0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, -0x4ED9, 0x4EDE, 0x5145, 0x5144, -0x5189, 0x518A, 0x51AC, 0x51F9, -0x51FA, 0x51F8, 0x520A, 0x52A0, -0x529F, 0x5305, 0x5306, 0x5317, -0x531D, 0x4EDF, 0x534A, 0x5349, -0x5361, 0x5360, 0x536F, 0x536E, -0x53BB, 0x53EF, 0x53E4, 0x53F3, -0x53EC, 0x53EE, 0x53E9, 0x53E8, -0x53FC, 0x53F8, 0x53F5, 0x53EB, -0x53E6, 0x53EA, 0x53F2, 0x53F1, -0x53F0, 0x53E5, 0x53ED, 0x53FB, -0x56DB, 0x56DA, 0x5916, 0x592E, -0x5931, 0x5974, 0x5976, 0x5B55, -0x5B83, 0x5C3C, 0x5DE8, 0x5DE7, -0x5DE6, 0x5E02, 0x5E03, 0x5E73, -0x5E7C, 0x5F01, 0x5F18, 0x5F17, -0x5FC5, 0x620A, 0x6253, 0x6254, -0x6252, 0x6251, 0x65A5, 0x65E6, -0x672E, 0x672C, 0x672A, 0x672B, -0x672D, 0x6B63, 0x6BCD, 0x6C11, -0x6C10, 0x6C38, 0x6C41, 0x6C40, -0x6C3E, 0x72AF, 0x7384, 0x7389, -0x74DC, 0x74E6, 0x7518, 0x751F, -0x7528, 0x7529, 0x7530, 0x7531, -0x7532, 0x7533, 0x758B, 0x767D, -0x76AE, 0x76BF, 0x76EE, 0x77DB, -0x77E2, 0x77F3, 0x793A, 0x79BE, -0x7A74, 0x7ACB, 0x4E1E, 0x4E1F, -0x4E52, 0x4E53, 0x4E69, 0x4E99, -0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF, -0x4F09, 0x4F19, 0x4F0A, 0x4F15, -0x4F0D, 0x4F10, 0x4F11, 0x4F0F, -0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, -0x4EF3, 0x4EFD, 0x4F01, 0x4F0B, -0x5149, 0x5147, 0x5146, 0x5148, -0x5168, 0x5171, 0x518D, 0x51B0, -0x5217, 0x5211, 0x5212, 0x520E, -0x5216, 0x52A3, 0x5308, 0x5321, -0x5320, 0x5370, 0x5371, 0x5409, -0x540F, 0x540C, 0x540A, 0x5410, -0x5401, 0x540B, 0x5404, 0x5411, -0x540D, 0x5408, 0x5403, 0x540E, -0x5406, 0x5412, 0x56E0, 0x56DE, -0x56DD, 0x5733, 0x5730, 0x5728, -0x572D, 0x572C, 0x572F, 0x5729, -0x5919, 0x591A, 0x5937, 0x5938, -0x5984, 0x5978, 0x5983, 0x597D, -0x5979, 0x5982, 0x5981, 0x5B57, -0x5B58, 0x5B87, 0x5B88, 0x5B85, -0x5B89, 0x5BFA, 0x5C16, 0x5C79, -0x5DDE, 0x5E06, 0x5E76, 0x5E74, -0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, -0x620E, 0x620C, 0x620D, 0x6210, -0x6263, 0x625B, 0x6258, 0x6536, -0x65E9, 0x65E8, 0x65EC, 0x65ED, -0x66F2, 0x66F3, 0x6709, 0x673D, -0x6734, 0x6731, 0x6735, 0x6B21, -0x6B64, 0x6B7B, 0x6C16, 0x6C5D, -0x6C57, 0x6C59, 0x6C5F, 0x6C60, -0x6C50, 0x6C55, 0x6C61, 0x6C5B, -0x6C4D, 0x6C4E, 0x7070, 0x725F, -0x725D, 0x767E, 0x7AF9, 0x7C73, -0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, -0x8001, 0x8003, 0x800C, 0x8012, -0x8033, 0x807F, 0x8089, 0x808B, -0x808C, 0x81E3, 0x81EA, 0x81F3, -0x81FC, 0x820C, 0x821B, 0x821F, -0x826E, 0x8272, 0x827E, 0x866B, -0x8840, 0x884C, 0x8863, 0x897F, -0x9621, 0x4E32, 0x4EA8, 0x4F4D, -0x4F4F, 0x4F47, 0x4F57, 0x4F5E, -0x4F34, 0x4F5B, 0x4F55, 0x4F30, -0x4F50, 0x4F51, 0x4F3D, 0x4F3A, -0x4F38, 0x4F43, 0x4F54, 0x4F3C, -0x4F46, 0x4F63, 0x4F5C, 0x4F60, -0x4F2F, 0x4F4E, 0x4F36, 0x4F59, -0x4F5D, 0x4F48, 0x4F5A, 0x514C, -0x514B, 0x514D, 0x5175, 0x51B6, -0x51B7, 0x5225, 0x5224, 0x5229, -0x522A, 0x5228, 0x52AB, 0x52A9, -0x52AA, 0x52AC, 0x5323, 0x5373, -0x5375, 0x541D, 0x542D, 0x541E, -0x543E, 0x5426, 0x544E, 0x5427, -0x5446, 0x5443, 0x5433, 0x5448, -0x5442, 0x541B, 0x5429, 0x544A, -0x5439, 0x543B, 0x5438, 0x542E, -0x5435, 0x5436, 0x5420, 0x543C, -0x5440, 0x5431, 0x542B, 0x541F, -0x542C, 0x56EA, 0x56F0, 0x56E4, -0x56EB, 0x574A, 0x5751, 0x5740, -0x574D, 0x5747, 0x574E, 0x573E, -0x5750, 0x574F, 0x573B, 0x58EF, -0x593E, 0x599D, 0x5992, 0x59A8, -0x599E, 0x59A3, 0x5999, 0x5996, -0x598D, 0x59A4, 0x5993, 0x598A, -0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, -0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, -0x5C2C, 0x5C40, 0x5C41, 0x5C3F, -0x5C3E, 0x5C90, 0x5C91, 0x5C94, -0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, -0x5E87, 0x5E8A, 0x5EF7, 0x5F04, -0x5F1F, 0x5F64, 0x5F62, 0x5F77, -0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, -0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, -0x5FEA, 0x6212, 0x6211, 0x6284, -0x6297, 0x6296, 0x6280, 0x6276, -0x6289, 0x626D, 0x628A, 0x627C, -0x627E, 0x6279, 0x6273, 0x6292, -0x626F, 0x6298, 0x626E, 0x6295, -0x6293, 0x6291, 0x6286, 0x6539, -0x653B, 0x6538, 0x65F1, 0x66F4, -0x675F, 0x674E, 0x674F, 0x6750, -0x6751, 0x675C, 0x6756, 0x675E, -0x6749, 0x6746, 0x6760, 0x6753, -0x6757, 0x6B65, 0x6BCF, 0x6C42, -0x6C5E, 0x6C99, 0x6C81, 0x6C88, -0x6C89, 0x6C85, 0x6C9B, 0x6C6A, -0x6C7A, 0x6C90, 0x6C70, 0x6C8C, -0x6C68, 0x6C96, 0x6C92, 0x6C7D, -0x6C83, 0x6C72, 0x6C7E, 0x6C74, -0x6C86, 0x6C76, 0x6C8D, 0x6C94, -0x6C98, 0x6C82, 0x7076, 0x707C, -0x707D, 0x7078, 0x7262, 0x7261, -0x7260, 0x72C4, 0x72C2, 0x7396, -0x752C, 0x752B, 0x7537, 0x7538, -0x7682, 0x76EF, 0x77E3, 0x79C1, -0x79C0, 0x79BF, 0x7A76, 0x7CFB, -0x7F55, 0x8096, 0x8093, 0x809D, -0x8098, 0x809B, 0x809A, 0x80B2, -0x826F, 0x8292, 0x828B, 0x828D, -0x898B, 0x89D2, 0x8A00, 0x8C37, -0x8C46, 0x8C55, 0x8C9D, 0x8D64, -0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, -0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6, -0x8FC5, 0x8FC4, 0x5DE1, 0x9091, -0x90A2, 0x90AA, 0x90A6, 0x90A3, -0x9149, 0x91C6, 0x91CC, 0x9632, -0x962E, 0x9631, 0x962A, 0x962C, -0x4E26, 0x4E56, 0x4E73, 0x4E8B, -0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC, -0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, -0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B, -0x4F86, 0x4F83, 0x4F70, 0x4F75, -0x4F88, 0x4F69, 0x4F7B, 0x4F96, -0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, -0x5154, 0x5152, 0x5155, 0x5169, -0x5177, 0x5176, 0x5178, 0x51BD, -0x51FD, 0x523B, 0x5238, 0x5237, -0x523A, 0x5230, 0x522E, 0x5236, -0x5241, 0x52BE, 0x52BB, 0x5352, -0x5354, 0x5353, 0x5351, 0x5366, -0x5377, 0x5378, 0x5379, 0x53D6, -0x53D4, 0x53D7, 0x5473, 0x5475, -0x5496, 0x5478, 0x5495, 0x5480, -0x547B, 0x5477, 0x5484, 0x5492, -0x5486, 0x547C, 0x5490, 0x5471, -0x5476, 0x548C, 0x549A, 0x5462, -0x5468, 0x548B, 0x547D, 0x548E, -0x56FA, 0x5783, 0x5777, 0x576A, -0x5769, 0x5761, 0x5766, 0x5764, -0x577C, 0x591C, 0x5949, 0x5947, -0x5948, 0x5944, 0x5954, 0x59BE, -0x59BB, 0x59D4, 0x59B9, 0x59AE, -0x59D1, 0x59C6, 0x59D0, 0x59CD, -0x59CB, 0x59D3, 0x59CA, 0x59AF, -0x59B3, 0x59D2, 0x59C5, 0x5B5F, -0x5B64, 0x5B63, 0x5B97, 0x5B9A, -0x5B98, 0x5B9C, 0x5B99, 0x5B9B, -0x5C1A, 0x5C48, 0x5C45, 0x5C46, -0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, -0x5CAB, 0x5CB1, 0x5CB3, 0x5E18, -0x5E1A, 0x5E16, 0x5E15, 0x5E1B, -0x5E11, 0x5E78, 0x5E9A, 0x5E97, -0x5E9C, 0x5E95, 0x5E96, 0x5EF6, -0x5F26, 0x5F27, 0x5F29, 0x5F80, -0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, -0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, -0x600F, 0x6014, 0x602F, 0x6035, -0x6016, 0x602A, 0x6015, 0x6021, -0x6027, 0x6029, 0x602B, 0x601B, -0x6216, 0x6215, 0x623F, 0x623E, -0x6240, 0x627F, 0x62C9, 0x62CC, -0x62C4, 0x62BF, 0x62C2, 0x62B9, -0x62D2, 0x62DB, 0x62AB, 0x62D3, -0x62D4, 0x62CB, 0x62C8, 0x62A8, -0x62BD, 0x62BC, 0x62D0, 0x62D9, -0x62C7, 0x62CD, 0x62B5, 0x62DA, -0x62B1, 0x62D8, 0x62D6, 0x62D7, -0x62C6, 0x62AC, 0x62CE, 0x653E, -0x65A7, 0x65BC, 0x65FA, 0x6614, -0x6613, 0x660C, 0x6606, 0x6602, -0x660E, 0x6600, 0x660F, 0x6615, -0x660A, 0x6607, 0x670D, 0x670B, -0x676D, 0x678B, 0x6795, 0x6771, -0x679C, 0x6773, 0x6777, 0x6787, -0x679D, 0x6797, 0x676F, 0x6770, -0x677F, 0x6789, 0x677E, 0x6790, -0x6775, 0x679A, 0x6793, 0x677C, -0x676A, 0x6772, 0x6B23, 0x6B66, -0x6B67, 0x6B7F, 0x6C13, 0x6C1B, -0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, -0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, -0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, -0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, -0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, -0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, -0x6CE1, 0x6CDB, 0x6CCA, 0x6CAC, -0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, -0x7095, 0x708E, 0x7092, 0x708A, -0x7099, 0x722C, 0x722D, 0x7238, -0x7248, 0x7267, 0x7269, 0x72C0, -0x72CE, 0x72D9, 0x72D7, 0x72D0, -0x73A9, 0x73A8, 0x739F, 0x73AB, -0x73A5, 0x753D, 0x759D, 0x7599, -0x759A, 0x7684, 0x76C2, 0x76F2, -0x76F4, 0x77E5, 0x77FD, 0x793E, -0x7940, 0x7941, 0x79C9, 0x79C8, -0x7A7A, 0x7A79, 0x7AFA, 0x7CFE, -0x7F54, 0x7F8C, 0x7F8B, 0x8005, -0x80BA, 0x80A5, 0x80A2, 0x80B1, -0x80A1, 0x80AB, 0x80A9, 0x80B4, -0x80AA, 0x80AF, 0x81E5, 0x81FE, -0x820D, 0x82B3, 0x829D, 0x8299, -0x82AD, 0x82BD, 0x829F, 0x82B9, -0x82B1, 0x82AC, 0x82A5, 0x82AF, -0x82B8, 0x82A3, 0x82B0, 0x82BE, -0x82B7, 0x864E, 0x8671, 0x521D, -0x8868, 0x8ECB, 0x8FCE, 0x8FD4, -0x8FD1, 0x90B5, 0x90B8, 0x90B1, -0x90B6, 0x91C7, 0x91D1, 0x9577, -0x9580, 0x961C, 0x9640, 0x963F, -0x963B, 0x9644, 0x9642, 0x96B9, -0x96E8, 0x9752, 0x975E, 0x4E9F, -0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5, -0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, -0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6, -0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, -0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2, -0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, -0x5157, 0x5192, 0x5191, 0x51A0, -0x524E, 0x5243, 0x524A, 0x524D, -0x524C, 0x524B, 0x5247, 0x52C7, -0x52C9, 0x52C3, 0x52C1, 0x530D, -0x5357, 0x537B, 0x539A, 0x53DB, -0x54AC, 0x54C0, 0x54A8, 0x54CE, -0x54C9, 0x54B8, 0x54A6, 0x54B3, -0x54C7, 0x54C2, 0x54BD, 0x54AA, -0x54C1, 0x54C4, 0x54C8, 0x54AF, -0x54AB, 0x54B1, 0x54BB, 0x54A9, -0x54A7, 0x54BF, 0x56FF, 0x5782, -0x578B, 0x57A0, 0x57A3, 0x57A2, -0x57CE, 0x57AE, 0x5793, 0x5955, -0x5951, 0x594F, 0x594E, 0x5950, -0x59DC, 0x59D8, 0x59FF, 0x59E3, -0x59E8, 0x5A03, 0x59E5, 0x59EA, -0x59DA, 0x59E6, 0x5A01, 0x59FB, -0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, -0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, -0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, -0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, -0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, -0x5EFA, 0x5F08, 0x5F2D, 0x5F65, -0x5F88, 0x5F85, 0x5F8A, 0x5F8B, -0x5F87, 0x5F8C, 0x5F89, 0x6012, -0x601D, 0x6020, 0x6025, 0x600E, -0x6028, 0x604D, 0x6070, 0x6068, -0x6062, 0x6046, 0x6043, 0x606C, -0x606B, 0x606A, 0x6064, 0x6241, -0x62DC, 0x6316, 0x6309, 0x62FC, -0x62ED, 0x6301, 0x62EE, 0x62FD, -0x6307, 0x62F1, 0x62F7, 0x62EF, -0x62EC, 0x62FE, 0x62F4, 0x6311, -0x6302, 0x653F, 0x6545, 0x65AB, -0x65BD, 0x65E2, 0x6625, 0x662D, -0x6620, 0x6627, 0x662F, 0x661F, -0x6628, 0x6631, 0x6624, 0x66F7, -0x67FF, 0x67D3, 0x67F1, 0x67D4, -0x67D0, 0x67EC, 0x67B6, 0x67AF, -0x67F5, 0x67E9, 0x67EF, 0x67C4, -0x67D1, 0x67B4, 0x67DA, 0x67E5, -0x67B8, 0x67CF, 0x67DE, 0x67F3, -0x67B0, 0x67D9, 0x67E2, 0x67DD, -0x67D2, 0x6B6A, 0x6B83, 0x6B86, -0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, -0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, -0x6D41, 0x6D25, 0x6D0C, 0x6D31, -0x6D1E, 0x6D17, 0x6D3B, 0x6D3D, -0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, -0x6D39, 0x6D27, 0x6D38, 0x6D29, -0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, -0x70AB, 0x70BA, 0x70B3, 0x70AC, -0x70AF, 0x70AD, 0x70B8, 0x70AE, -0x70A4, 0x7230, 0x7272, 0x726F, -0x7274, 0x72E9, 0x72E0, 0x72E1, -0x73B7, 0x73CA, 0x73BB, 0x73B2, -0x73CD, 0x73C0, 0x73B3, 0x751A, -0x752D, 0x754F, 0x754C, 0x754E, -0x754B, 0x75AB, 0x75A4, 0x75A5, -0x75A2, 0x75A3, 0x7678, 0x7686, -0x7687, 0x7688, 0x76C8, 0x76C6, -0x76C3, 0x76C5, 0x7701, 0x76F9, -0x76F8, 0x7709, 0x770B, 0x76FE, -0x76FC, 0x7707, 0x77DC, 0x7802, -0x7814, 0x780C, 0x780D, 0x7946, -0x7949, 0x7948, 0x7947, 0x79B9, -0x79BA, 0x79D1, 0x79D2, 0x79CB, -0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, -0x7C7D, 0x7D02, 0x7D05, 0x7D00, -0x7D09, 0x7D07, 0x7D04, 0x7D06, -0x7F38, 0x7F8E, 0x7FBF, 0x8004, -0x8010, 0x800D, 0x8011, 0x8036, -0x80D6, 0x80E5, 0x80DA, 0x80C3, -0x80C4, 0x80CC, 0x80E1, 0x80DB, -0x80CE, 0x80DE, 0x80E4, 0x80DD, -0x81F4, 0x8222, 0x82E7, 0x8303, -0x8305, 0x82E3, 0x82DB, 0x82E6, -0x8304, 0x82E5, 0x8302, 0x8309, -0x82D2, 0x82D7, 0x82F1, 0x8301, -0x82DC, 0x82D4, 0x82D1, 0x82DE, -0x82D3, 0x82DF, 0x82EF, 0x8306, -0x8650, 0x8679, 0x867B, 0x867A, -0x884D, 0x886B, 0x8981, 0x89D4, -0x8A08, 0x8A02, 0x8A03, 0x8C9E, -0x8CA0, 0x8D74, 0x8D73, 0x8DB4, -0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, -0x8FE2, 0x8FEA, 0x8FE5, 0x8FED, -0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, -0x90CE, 0x90C1, 0x90C3, 0x914B, -0x914A, 0x91CD, 0x9582, 0x9650, -0x964B, 0x964C, 0x964D, 0x9762, -0x9769, 0x97CB, 0x97ED, 0x97F3, -0x9801, 0x98A8, 0x98DB, 0x98DF, -0x9996, 0x9999, 0x4E58, 0x4EB3, -0x500C, 0x500D, 0x5023, 0x4FEF, -0x5026, 0x5025, 0x4FF8, 0x5029, -0x5016, 0x5006, 0x503C, 0x501F, -0x501A, 0x5012, 0x5011, 0x4FFA, -0x5000, 0x5014, 0x5028, 0x4FF1, -0x5021, 0x500B, 0x5019, 0x5018, -0x4FF3, 0x4FEE, 0x502D, 0x502A, -0x4FFE, 0x502B, 0x5009, 0x517C, -0x51A4, 0x51A5, 0x51A2, 0x51CD, -0x51CC, 0x51C6, 0x51CB, 0x5256, -0x525C, 0x5254, 0x525B, 0x525D, -0x532A, 0x537F, 0x539F, 0x539D, -0x53DF, 0x54E8, 0x5510, 0x5501, -0x5537, 0x54FC, 0x54E5, 0x54F2, -0x5506, 0x54FA, 0x5514, 0x54E9, -0x54ED, 0x54E1, 0x5509, 0x54EE, -0x54EA, 0x54E6, 0x5527, 0x5507, -0x54FD, 0x550F, 0x5703, 0x5704, -0x57C2, 0x57D4, 0x57CB, 0x57C3, -0x5809, 0x590F, 0x5957, 0x5958, -0x595A, 0x5A11, 0x5A18, 0x5A1C, -0x5A1F, 0x5A1B, 0x5A13, 0x59EC, -0x5A20, 0x5A23, 0x5A29, 0x5A25, -0x5A0C, 0x5A09, 0x5B6B, 0x5C58, -0x5BB0, 0x5BB3, 0x5BB6, 0x5BB4, -0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, -0x5C04, 0x5C51, 0x5C55, 0x5C50, -0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, -0x5CE8, 0x5CF0, 0x5CF6, 0x5D01, -0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, -0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, -0x5F92, 0x5F91, 0x5F90, 0x6059, -0x6063, 0x6065, 0x6050, 0x6055, -0x606D, 0x6069, 0x606F, 0x6084, -0x609F, 0x609A, 0x608D, 0x6094, -0x608C, 0x6085, 0x6096, 0x6247, -0x62F3, 0x6308, 0x62FF, 0x634E, -0x633E, 0x632F, 0x6355, 0x6342, -0x6346, 0x634F, 0x6349, 0x633A, -0x6350, 0x633D, 0x632A, 0x632B, -0x6328, 0x634D, 0x634C, 0x6548, -0x6549, 0x6599, 0x65C1, 0x65C5, -0x6642, 0x6649, 0x664F, 0x6643, -0x6652, 0x664C, 0x6645, 0x6641, -0x66F8, 0x6714, 0x6715, 0x6717, -0x6821, 0x6838, 0x6848, 0x6846, -0x6853, 0x6839, 0x6842, 0x6854, -0x6829, 0x68B3, 0x6817, 0x684C, -0x6851, 0x683D, 0x67F4, 0x6850, -0x6840, 0x683C, 0x6843, 0x682A, -0x6845, 0x6813, 0x6818, 0x6841, -0x6B8A, 0x6B89, 0x6BB7, 0x6C23, -0x6C27, 0x6C28, 0x6C26, 0x6C24, -0x6CF0, 0x6D6A, 0x6D95, 0x6D88, -0x6D87, 0x6D66, 0x6D78, 0x6D77, -0x6D59, 0x6D93, 0x6D6C, 0x6D89, -0x6D6E, 0x6D5A, 0x6D74, 0x6D69, -0x6D8C, 0x6D8A, 0x6D79, 0x6D85, -0x6D65, 0x6D94, 0x70CA, 0x70D8, -0x70E4, 0x70D9, 0x70C8, 0x70CF, -0x7239, 0x7279, 0x72FC, 0x72F9, -0x72FD, 0x72F8, 0x72F7, 0x7386, -0x73ED, 0x7409, 0x73EE, 0x73E0, -0x73EA, 0x73DE, 0x7554, 0x755D, -0x755C, 0x755A, 0x7559, 0x75BE, -0x75C5, 0x75C7, 0x75B2, 0x75B3, -0x75BD, 0x75BC, 0x75B9, 0x75C2, -0x75B8, 0x768B, 0x76B0, 0x76CA, -0x76CD, 0x76CE, 0x7729, 0x771F, -0x7720, 0x7728, 0x77E9, 0x7830, -0x7827, 0x7838, 0x781D, 0x7834, -0x7837, 0x7825, 0x782D, 0x7820, -0x781F, 0x7832, 0x7955, 0x7950, -0x7960, 0x795F, 0x7956, 0x795E, -0x795D, 0x7957, 0x795A, 0x79E4, -0x79E3, 0x79E7, 0x79DF, 0x79E6, -0x79E9, 0x79D8, 0x7A84, 0x7A88, -0x7AD9, 0x7B06, 0x7B11, 0x7C89, -0x7D21, 0x7D17, 0x7D0B, 0x7D0A, -0x7D20, 0x7D22, 0x7D14, 0x7D10, -0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, -0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, -0x7F94, 0x7FC5, 0x7FC1, 0x8006, -0x8018, 0x8015, 0x8019, 0x8017, -0x803D, 0x803F, 0x80F1, 0x8102, -0x80F0, 0x8105, 0x80ED, 0x80F4, -0x8106, 0x80F8, 0x80F3, 0x8108, -0x80FD, 0x810A, 0x80FC, 0x80EF, -0x81ED, 0x81EC, 0x8200, 0x8210, -0x822A, 0x822B, 0x8228, 0x822C, -0x82BB, 0x832B, 0x8352, 0x8354, -0x834A, 0x8338, 0x8350, 0x8349, -0x8335, 0x8334, 0x834F, 0x8332, -0x8339, 0x8336, 0x8317, 0x8340, -0x8331, 0x8328, 0x8343, 0x8654, -0x868A, 0x86AA, 0x8693, 0x86A4, -0x86A9, 0x868C, 0x86A3, 0x869C, -0x8870, 0x8877, 0x8881, 0x8882, -0x887D, 0x8879, 0x8A18, 0x8A10, -0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, -0x8A17, 0x8A13, 0x8A16, 0x8A0F, -0x8A11, 0x8C48, 0x8C7A, 0x8C79, -0x8CA1, 0x8CA2, 0x8D77, 0x8EAC, -0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, -0x9001, 0x9006, 0x8FF7, 0x9000, -0x8FFA, 0x8FF4, 0x9003, 0x8FFD, -0x9005, 0x8FF8, 0x9095, 0x90E1, -0x90DD, 0x90E2, 0x9152, 0x914D, -0x914C, 0x91D8, 0x91DD, 0x91D7, -0x91DC, 0x91D9, 0x9583, 0x9662, -0x9663, 0x9661, 0x965B, 0x965D, -0x9664, 0x9658, 0x965E, 0x96BB, -0x98E2, 0x99AC, 0x9AA8, 0x9AD8, -0x9B25, 0x9B32, 0x9B3C, 0x4E7E, -0x507A, 0x507D, 0x505C, 0x5047, -0x5043, 0x504C, 0x505A, 0x5049, -0x5065, 0x5076, 0x504E, 0x5055, -0x5075, 0x5074, 0x5077, 0x504F, -0x500F, 0x506F, 0x506D, 0x515C, -0x5195, 0x51F0, 0x526A, 0x526F, -0x52D2, 0x52D9, 0x52D8, 0x52D5, -0x5310, 0x530F, 0x5319, 0x533F, -0x5340, 0x533E, 0x53C3, 0x66FC, -0x5546, 0x556A, 0x5566, 0x5544, -0x555E, 0x5561, 0x5543, 0x554A, -0x5531, 0x5556, 0x554F, 0x5555, -0x552F, 0x5564, 0x5538, 0x552E, -0x555C, 0x552C, 0x5563, 0x5533, -0x5541, 0x5557, 0x5708, 0x570B, -0x5709, 0x57DF, 0x5805, 0x580A, -0x5806, 0x57E0, 0x57E4, 0x57FA, -0x5802, 0x5835, 0x57F7, 0x57F9, -0x5920, 0x5962, 0x5A36, 0x5A41, -0x5A49, 0x5A66, 0x5A6A, 0x5A40, -0x5A3C, 0x5A62, 0x5A5A, 0x5A46, -0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, -0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, -0x5C09, 0x5C08, 0x5C07, 0x5C60, -0x5C5C, 0x5C5D, 0x5D07, 0x5D06, -0x5D0E, 0x5D1B, 0x5D16, 0x5D22, -0x5D11, 0x5D29, 0x5D14, 0x5D19, -0x5D24, 0x5D27, 0x5D17, 0x5DE2, -0x5E38, 0x5E36, 0x5E33, 0x5E37, -0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, -0x5EBE, 0x5F35, 0x5F37, 0x5F57, -0x5F6C, 0x5F69, 0x5F6B, 0x5F97, -0x5F99, 0x5F9E, 0x5F98, 0x5FA1, -0x5FA0, 0x5F9C, 0x607F, 0x60A3, -0x6089, 0x60A0, 0x60A8, 0x60CB, -0x60B4, 0x60E6, 0x60BD, 0x60C5, -0x60BB, 0x60B5, 0x60DC, 0x60BC, -0x60D8, 0x60D5, 0x60C6, 0x60DF, -0x60B8, 0x60DA, 0x60C7, 0x621A, -0x621B, 0x6248, 0x63A0, 0x63A7, -0x6372, 0x6396, 0x63A2, 0x63A5, -0x6377, 0x6367, 0x6398, 0x63AA, -0x6371, 0x63A9, 0x6389, 0x6383, -0x639B, 0x636B, 0x63A8, 0x6384, -0x6388, 0x6399, 0x63A1, 0x63AC, -0x6392, 0x638F, 0x6380, 0x637B, -0x6369, 0x6368, 0x637A, 0x655D, -0x6556, 0x6551, 0x6559, 0x6557, -0x555F, 0x654F, 0x6558, 0x6555, -0x6554, 0x659C, 0x659B, 0x65AC, -0x65CF, 0x65CB, 0x65CC, 0x65CE, -0x665D, 0x665A, 0x6664, 0x6668, -0x6666, 0x665E, 0x66F9, 0x52D7, -0x671B, 0x6881, 0x68AF, 0x68A2, -0x6893, 0x68B5, 0x687F, 0x6876, -0x68B1, 0x68A7, 0x6897, 0x68B0, -0x6883, 0x68C4, 0x68AD, 0x6886, -0x6885, 0x6894, 0x689D, 0x68A8, -0x689F, 0x68A1, 0x6882, 0x6B32, -0x6BBA, 0x6BEB, 0x6BEC, 0x6C2B, -0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, -0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, -0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, -0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, -0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, -0x6DF5, 0x6DC5, 0x6DD2, 0x6E1A, -0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, -0x6DEA, 0x6DF1, 0x6DEE, 0x6DE8, -0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, -0x6DBF, 0x6DE6, 0x70F9, 0x7109, -0x710A, 0x70FD, 0x70EF, 0x723D, -0x727D, 0x7281, 0x731C, 0x731B, -0x7316, 0x7313, 0x7319, 0x7387, -0x7405, 0x740A, 0x7403, 0x7406, -0x73FE, 0x740D, 0x74E0, 0x74F6, -0x74F7, 0x751C, 0x7522, 0x7565, -0x7566, 0x7562, 0x7570, 0x758F, -0x75D4, 0x75D5, 0x75B5, 0x75CA, -0x75CD, 0x768E, 0x76D4, 0x76D2, -0x76DB, 0x7737, 0x773E, 0x773C, -0x7736, 0x7738, 0x773A, 0x786B, -0x7843, 0x784E, 0x7965, 0x7968, -0x796D, 0x79FB, 0x7A92, 0x7A95, -0x7B20, 0x7B28, 0x7B1B, 0x7B2C, -0x7B26, 0x7B19, 0x7B1E, 0x7B2E, -0x7C92, 0x7C97, 0x7C95, 0x7D46, -0x7D43, 0x7D71, 0x7D2E, 0x7D39, -0x7D3C, 0x7D40, 0x7D30, 0x7D33, -0x7D44, 0x7D2F, 0x7D42, 0x7D32, -0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, -0x7FCC, 0x7FCE, 0x7FD2, 0x801C, -0x804A, 0x8046, 0x812F, 0x8116, -0x8123, 0x812B, 0x8129, 0x8130, -0x8124, 0x8202, 0x8235, 0x8237, -0x8236, 0x8239, 0x838E, 0x839E, -0x8398, 0x8378, 0x83A2, 0x8396, -0x83BD, 0x83AB, 0x8392, 0x838A, -0x8393, 0x8389, 0x83A0, 0x8377, -0x837B, 0x837C, 0x8386, 0x83A7, -0x8655, 0x5F6A, 0x86C7, 0x86C0, -0x86B6, 0x86C4, 0x86B5, 0x86C6, -0x86CB, 0x86B1, 0x86AF, 0x86C9, -0x8853, 0x889E, 0x8888, 0x88AB, -0x8892, 0x8896, 0x888D, 0x888B, -0x8993, 0x898F, 0x8A2A, 0x8A1D, -0x8A23, 0x8A25, 0x8A31, 0x8A2D, -0x8A1F, 0x8A1B, 0x8A22, 0x8C49, -0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, -0x8CA8, 0x8CAA, 0x8CA7, 0x8D67, -0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, -0x8EDF, 0x9019, 0x900D, 0x901A, -0x9017, 0x9023, 0x901F, 0x901D, -0x9010, 0x9015, 0x901E, 0x9020, -0x900F, 0x9022, 0x9016, 0x901B, -0x9014, 0x90E8, 0x90ED, 0x90FD, -0x9157, 0x91CE, 0x91F5, 0x91E6, -0x91E3, 0x91E7, 0x91ED, 0x91E9, -0x9589, 0x966A, 0x9675, 0x9673, -0x9678, 0x9670, 0x9674, 0x9676, -0x9677, 0x966C, 0x96C0, 0x96EA, -0x96E9, 0x7AE0, 0x7ADF, 0x9802, -0x9803, 0x9B5A, 0x9CE5, 0x9E75, -0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, -0x508D, 0x5085, 0x5099, 0x5091, -0x5080, 0x5096, 0x5098, 0x509A, -0x6700, 0x51F1, 0x5272, 0x5274, -0x5275, 0x5269, 0x52DE, 0x52DD, -0x52DB, 0x535A, 0x53A5, 0x557B, -0x5580, 0x55A7, 0x557C, 0x558A, -0x559D, 0x5598, 0x5582, 0x559C, -0x55AA, 0x5594, 0x5587, 0x558B, -0x5583, 0x55B3, 0x55AE, 0x559F, -0x553E, 0x55B2, 0x559A, 0x55BB, -0x55AC, 0x55B1, 0x557E, 0x5589, -0x55AB, 0x5599, 0x570D, 0x582F, -0x582A, 0x5834, 0x5824, 0x5830, -0x5831, 0x5821, 0x581D, 0x5820, -0x58F9, 0x58FA, 0x5960, 0x5A77, -0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, -0x5AA7, 0x5B73, 0x5B71, 0x5BD2, -0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, -0x5C0B, 0x5C31, 0x5D4C, 0x5D50, -0x5D34, 0x5D47, 0x5DFD, 0x5E45, -0x5E3D, 0x5E40, 0x5E43, 0x5E7E, -0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, -0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, -0x5FA8, 0x60D1, 0x60E1, 0x60B2, -0x60B6, 0x60E0, 0x611C, 0x6123, -0x60FA, 0x6115, 0x60F0, 0x60FB, -0x60F4, 0x6168, 0x60F1, 0x610E, -0x60F6, 0x6109, 0x6100, 0x6112, -0x621F, 0x6249, 0x63A3, 0x638C, -0x63CF, 0x63C0, 0x63E9, 0x63C9, -0x63C6, 0x63CD, 0x63D2, 0x63E3, -0x63D0, 0x63E1, 0x63D6, 0x63ED, -0x63EE, 0x6376, 0x63F4, 0x63EA, -0x63DB, 0x6452, 0x63DA, 0x63F9, -0x655E, 0x6566, 0x6562, 0x6563, -0x6591, 0x6590, 0x65AF, 0x666E, -0x6670, 0x6674, 0x6676, 0x666F, -0x6691, 0x667A, 0x667E, 0x6677, -0x66FE, 0x66FF, 0x671F, 0x671D, -0x68FA, 0x68D5, 0x68E0, 0x68D8, -0x68D7, 0x6905, 0x68DF, 0x68F5, -0x68EE, 0x68E7, 0x68F9, 0x68D2, -0x68F2, 0x68E3, 0x68CB, 0x68CD, -0x690D, 0x6912, 0x690E, 0x68C9, -0x68DA, 0x696E, 0x68FB, 0x6B3E, -0x6B3A, 0x6B3D, 0x6B98, 0x6B96, -0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, -0x6C2C, 0x6E2F, 0x6E38, 0x6E54, -0x6E21, 0x6E32, 0x6E67, 0x6E4A, -0x6E20, 0x6E25, 0x6E23, 0x6E1B, -0x6E5B, 0x6E58, 0x6E24, 0x6E56, -0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, -0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, -0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, -0x6E89, 0x6E19, 0x6E4E, 0x6E63, -0x6E44, 0x6E72, 0x6E69, 0x6E5F, -0x7119, 0x711A, 0x7126, 0x7130, -0x7121, 0x7136, 0x716E, 0x711C, -0x724C, 0x7284, 0x7280, 0x7336, -0x7325, 0x7334, 0x7329, 0x743A, -0x742A, 0x7433, 0x7422, 0x7425, -0x7435, 0x7436, 0x7434, 0x742F, -0x741B, 0x7426, 0x7428, 0x7525, -0x7526, 0x756B, 0x756A, 0x75E2, -0x75DB, 0x75E3, 0x75D9, 0x75D8, -0x75DE, 0x75E0, 0x767B, 0x767C, -0x7696, 0x7693, 0x76B4, 0x76DC, -0x774F, 0x77ED, 0x785D, 0x786C, -0x786F, 0x7A0D, 0x7A08, 0x7A0B, -0x7A05, 0x7A00, 0x7A98, 0x7A97, -0x7A96, 0x7AE5, 0x7AE3, 0x7B49, -0x7B56, 0x7B46, 0x7B50, 0x7B52, -0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, -0x7B51, 0x7C9F, 0x7CA5, 0x7D5E, -0x7D50, 0x7D68, 0x7D55, 0x7D2B, -0x7D6E, 0x7D72, 0x7D61, 0x7D66, -0x7D62, 0x7D70, 0x7D73, 0x5584, -0x7FD4, 0x7FD5, 0x800B, 0x8052, -0x8085, 0x8155, 0x8154, 0x814B, -0x8151, 0x814E, 0x8139, 0x8146, -0x813E, 0x814C, 0x8153, 0x8174, -0x8212, 0x821C, 0x83E9, 0x8403, -0x83F8, 0x840D, 0x83E0, 0x83C5, -0x840B, 0x83C1, 0x83EF, 0x83F1, -0x83F4, 0x8457, 0x840A, 0x83F0, -0x840C, 0x83CC, 0x83FD, 0x83F2, -0x83CA, 0x8438, 0x840E, 0x8404, -0x83DC, 0x8407, 0x83D4, 0x83DF, -0x865B, 0x86DF, 0x86D9, 0x86ED, -0x86D4, 0x86DB, 0x86E4, 0x86D0, -0x86DE, 0x8857, 0x88C1, 0x88C2, -0x88B1, 0x8983, 0x8996, 0x8A3B, -0x8A60, 0x8A55, 0x8A5E, 0x8A3C, -0x8A41, 0x8A54, 0x8A5B, 0x8A50, -0x8A46, 0x8A34, 0x8A3A, 0x8A36, -0x8A56, 0x8C61, 0x8C82, 0x8CAF, -0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, -0x8CBB, 0x8CC0, 0x8CB4, 0x8CB7, -0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, -0x8D85, 0x8D81, 0x8DCE, 0x8DDD, -0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, -0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8, -0x8EFC, 0x8F9C, 0x902E, 0x9035, -0x9031, 0x9038, 0x9032, 0x9036, -0x9102, 0x90F5, 0x9109, 0x90FE, -0x9163, 0x9165, 0x91CF, 0x9214, -0x9215, 0x9223, 0x9209, 0x921E, -0x920D, 0x9210, 0x9207, 0x9211, -0x9594, 0x958F, 0x958B, 0x9591, -0x9593, 0x9592, 0x958E, 0x968A, -0x968E, 0x968B, 0x967D, 0x9685, -0x9686, 0x968D, 0x9672, 0x9684, -0x96C1, 0x96C5, 0x96C4, 0x96C6, -0x96C7, 0x96EF, 0x96F2, 0x97CC, -0x9805, 0x9806, 0x9808, 0x98E7, -0x98EA, 0x98EF, 0x98E9, 0x98F2, -0x98ED, 0x99AE, 0x99AD, 0x9EC3, -0x9ECD, 0x9ED1, 0x4E82, 0x50AD, -0x50B5, 0x50B2, 0x50B3, 0x50C5, -0x50BE, 0x50AC, 0x50B7, 0x50BB, -0x50AF, 0x50C7, 0x527F, 0x5277, -0x527D, 0x52DF, 0x52E6, 0x52E4, -0x52E2, 0x52E3, 0x532F, 0x55DF, -0x55E8, 0x55D3, 0x55E6, 0x55CE, -0x55DC, 0x55C7, 0x55D1, 0x55E3, -0x55E4, 0x55EF, 0x55DA, 0x55E1, -0x55C5, 0x55C6, 0x55E5, 0x55C9, -0x5712, 0x5713, 0x585E, 0x5851, -0x5858, 0x5857, 0x585A, 0x5854, -0x586B, 0x584C, 0x586D, 0x584A, -0x5862, 0x5852, 0x584B, 0x5967, -0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, -0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, -0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, -0x5E79, 0x5EC9, 0x5EC8, 0x5F12, -0x5F59, 0x5FAC, 0x5FAE, 0x611A, -0x610F, 0x6148, 0x611F, 0x60F3, -0x611B, 0x60F9, 0x6101, 0x6108, -0x614E, 0x614C, 0x6144, 0x614D, -0x613E, 0x6134, 0x6127, 0x610D, -0x6106, 0x6137, 0x6221, 0x6222, -0x6413, 0x643E, 0x641E, 0x642A, -0x642D, 0x643D, 0x642C, 0x640F, -0x641C, 0x6414, 0x640D, 0x6436, -0x6416, 0x6417, 0x6406, 0x656C, -0x659F, 0x65B0, 0x6697, 0x6689, -0x6687, 0x6688, 0x6696, 0x6684, -0x6698, 0x668D, 0x6703, 0x6994, -0x696D, 0x695A, 0x6977, 0x6960, -0x6954, 0x6975, 0x6930, 0x6982, -0x694A, 0x6968, 0x696B, 0x695E, -0x6953, 0x6979, 0x6986, 0x695D, -0x6963, 0x695B, 0x6B47, 0x6B72, -0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD, -0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, -0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, -0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, -0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, -0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, -0x6EA7, 0x6EB4, 0x714E, 0x7159, -0x7169, 0x7164, 0x7149, 0x7167, -0x715C, 0x716C, 0x7166, 0x714C, -0x7165, 0x715E, 0x7146, 0x7168, -0x7156, 0x723A, 0x7252, 0x7337, -0x7345, 0x733F, 0x733E, 0x746F, -0x745A, 0x7455, 0x745F, 0x745E, -0x7441, 0x743F, 0x7459, 0x745B, -0x745C, 0x7576, 0x7578, 0x7600, -0x75F0, 0x7601, 0x75F2, 0x75F1, -0x75FA, 0x75FF, 0x75F4, 0x75F3, -0x76DE, 0x76DF, 0x775B, 0x776B, -0x7766, 0x775E, 0x7763, 0x7779, -0x776A, 0x776C, 0x775C, 0x7765, -0x7768, 0x7762, 0x77EE, 0x788E, -0x78B0, 0x7897, 0x7898, 0x788C, -0x7889, 0x787C, 0x7891, 0x7893, -0x787F, 0x797A, 0x797F, 0x7981, -0x842C, 0x79BD, 0x7A1C, 0x7A1A, -0x7A20, 0x7A14, 0x7A1F, 0x7A1E, -0x7A9F, 0x7AA0, 0x7B77, 0x7BC0, -0x7B60, 0x7B6E, 0x7B67, 0x7CB1, -0x7CB3, 0x7CB5, 0x7D93, 0x7D79, -0x7D91, 0x7D81, 0x7D8F, 0x7D5B, -0x7F6E, 0x7F69, 0x7F6A, 0x7F72, -0x7FA9, 0x7FA8, 0x7FA4, 0x8056, -0x8058, 0x8086, 0x8084, 0x8171, -0x8170, 0x8178, 0x8165, 0x816E, -0x8173, 0x816B, 0x8179, 0x817A, -0x8166, 0x8205, 0x8247, 0x8482, -0x8477, 0x843D, 0x8431, 0x8475, -0x8466, 0x846B, 0x8449, 0x846C, -0x845B, 0x843C, 0x8435, 0x8461, -0x8463, 0x8469, 0x846D, 0x8446, -0x865E, 0x865C, 0x865F, 0x86F9, -0x8713, 0x8708, 0x8707, 0x8700, -0x86FE, 0x86FB, 0x8702, 0x8703, -0x8706, 0x870A, 0x8859, 0x88DF, -0x88D4, 0x88D9, 0x88DC, 0x88D8, -0x88DD, 0x88E1, 0x88CA, 0x88D5, -0x88D2, 0x899C, 0x89E3, 0x8A6B, -0x8A72, 0x8A73, 0x8A66, 0x8A69, -0x8A70, 0x8A87, 0x8A7C, 0x8A63, -0x8AA0, 0x8A71, 0x8A85, 0x8A6D, -0x8A62, 0x8A6E, 0x8A6C, 0x8A79, -0x8A7B, 0x8A3E, 0x8A68, 0x8C62, -0x8C8A, 0x8C89, 0x8CCA, 0x8CC7, -0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, -0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF, -0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, -0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2, -0x8F03, 0x8F09, 0x8EFE, 0x8F0A, -0x8F9F, 0x8FB2, 0x904B, 0x904A, -0x9053, 0x9042, 0x9054, 0x903C, -0x9055, 0x9050, 0x9047, 0x904F, -0x904E, 0x904D, 0x9051, 0x903E, -0x9041, 0x9112, 0x9117, 0x916C, -0x916A, 0x9169, 0x91C9, 0x9237, -0x9257, 0x9238, 0x923D, 0x9240, -0x923E, 0x925B, 0x924B, 0x9264, -0x9251, 0x9234, 0x9249, 0x924D, -0x9245, 0x9239, 0x923F, 0x925A, -0x9598, 0x9698, 0x9694, 0x9695, -0x96CD, 0x96CB, 0x96C9, 0x96CA, -0x96F7, 0x96FB, 0x96F9, 0x96F6, -0x9756, 0x9774, 0x9776, 0x9810, -0x9811, 0x9813, 0x980A, 0x9812, -0x980C, 0x98FC, 0x98F4, 0x98FD, -0x98FE, 0x99B3, 0x99B1, 0x99B4, -0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, -0x9F13, 0x9F20, 0x50E7, 0x50EE, -0x50E5, 0x50D6, 0x50ED, 0x50DA, -0x50D5, 0x50CF, 0x50D1, 0x50F1, -0x50CE, 0x50E9, 0x5162, 0x51F3, -0x5283, 0x5282, 0x5331, 0x53AD, -0x55FE, 0x5600, 0x561B, 0x5617, -0x55FD, 0x5614, 0x5606, 0x5609, -0x560D, 0x560E, 0x55F7, 0x5616, -0x561F, 0x5608, 0x5610, 0x55F6, -0x5718, 0x5716, 0x5875, 0x587E, -0x5883, 0x5893, 0x588A, 0x5879, -0x5885, 0x587D, 0x58FD, 0x5925, -0x5922, 0x5924, 0x596A, 0x5969, -0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, -0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, -0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, -0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, -0x5BDF, 0x5C0D, 0x5C62, 0x5D84, -0x5D87, 0x5E5B, 0x5E63, 0x5E55, -0x5E57, 0x5E54, 0x5ED3, 0x5ED6, -0x5F0A, 0x5F46, 0x5F70, 0x5FB9, -0x6147, 0x613F, 0x614B, 0x6177, -0x6162, 0x6163, 0x615F, 0x615A, -0x6158, 0x6175, 0x622A, 0x6487, -0x6458, 0x6454, 0x64A4, 0x6478, -0x645F, 0x647A, 0x6451, 0x6467, -0x6434, 0x646D, 0x647B, 0x6572, -0x65A1, 0x65D7, 0x65D6, 0x66A2, -0x66A8, 0x669D, 0x699C, 0x69A8, -0x6995, 0x69C1, 0x69AE, 0x69D3, -0x69CB, 0x699B, 0x69B7, 0x69BB, -0x69AB, 0x69B4, 0x69D0, 0x69CD, -0x69AD, 0x69CC, 0x69A6, 0x69C3, -0x69A3, 0x6B49, 0x6B4C, 0x6C33, -0x6F33, 0x6F14, 0x6EFE, 0x6F13, -0x6EF4, 0x6F29, 0x6F3E, 0x6F20, -0x6F2C, 0x6F0F, 0x6F02, 0x6F22, -0x6EFF, 0x6EEF, 0x6F06, 0x6F31, -0x6F38, 0x6F32, 0x6F23, 0x6F15, -0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, -0x6EEC, 0x6F01, 0x6EF2, 0x6ECC, -0x6EF7, 0x7194, 0x7199, 0x717D, -0x718A, 0x7184, 0x7192, 0x723E, -0x7292, 0x7296, 0x7344, 0x7350, -0x7464, 0x7463, 0x746A, 0x7470, -0x746D, 0x7504, 0x7591, 0x7627, -0x760D, 0x760B, 0x7609, 0x7613, -0x76E1, 0x76E3, 0x7784, 0x777D, -0x777F, 0x7761, 0x78C1, 0x789F, -0x78A7, 0x78B3, 0x78A9, 0x78A3, -0x798E, 0x798F, 0x798D, 0x7A2E, -0x7A31, 0x7AAA, 0x7AA9, 0x7AED, -0x7AEF, 0x7BA1, 0x7B95, 0x7B8B, -0x7B75, 0x7B97, 0x7B9D, 0x7B94, -0x7B8F, 0x7BB8, 0x7B87, 0x7B84, -0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, -0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE, -0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, -0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF, -0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, -0x7DC7, 0x7DAC, 0x7F70, 0x7FE0, -0x7FE1, 0x7FDF, 0x805E, 0x805A, -0x8087, 0x8150, 0x8180, 0x818F, -0x8188, 0x818A, 0x817F, 0x8182, -0x81E7, 0x81FA, 0x8207, 0x8214, -0x821E, 0x824B, 0x84C9, 0x84BF, -0x84C6, 0x84C4, 0x8499, 0x849E, -0x84B2, 0x849C, 0x84CB, 0x84B8, -0x84C0, 0x84D3, 0x8490, 0x84BC, -0x84D1, 0x84CA, 0x873F, 0x871C, -0x873B, 0x8722, 0x8725, 0x8734, -0x8718, 0x8755, 0x8737, 0x8729, -0x88F3, 0x8902, 0x88F4, 0x88F9, -0x88F8, 0x88FD, 0x88E8, 0x891A, -0x88EF, 0x8AA6, 0x8A8C, 0x8A9E, -0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, -0x8AA4, 0x8AAA, 0x8AA5, 0x8AA8, -0x8A98, 0x8A91, 0x8A9A, 0x8AA7, -0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, -0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, -0x8D95, 0x8DFC, 0x8F14, 0x8F12, -0x8F15, 0x8F13, 0x8FA3, 0x9060, -0x9058, 0x905C, 0x9063, 0x9059, -0x905E, 0x9062, 0x905D, 0x905B, -0x9119, 0x9118, 0x911E, 0x9175, -0x9178, 0x9177, 0x9174, 0x9278, -0x9280, 0x9285, 0x9298, 0x9296, -0x927B, 0x9293, 0x929C, 0x92A8, -0x927C, 0x9291, 0x95A1, 0x95A8, -0x95A9, 0x95A3, 0x95A5, 0x95A4, -0x9699, 0x969C, 0x969B, 0x96CC, -0x96D2, 0x9700, 0x977C, 0x9785, -0x97F6, 0x9817, 0x9818, 0x98AF, -0x98B1, 0x9903, 0x9905, 0x990C, -0x9909, 0x99C1, 0x9AAF, 0x9AB0, -0x9AE6, 0x9B41, 0x9B42, 0x9CF4, -0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, -0x9F4A, 0x5104, 0x5100, 0x50FB, -0x50F5, 0x50F9, 0x5102, 0x5108, -0x5109, 0x5105, 0x51DC, 0x5287, -0x5288, 0x5289, 0x528D, 0x528A, -0x52F0, 0x53B2, 0x562E, 0x563B, -0x5639, 0x5632, 0x563F, 0x5634, -0x5629, 0x5653, 0x564E, 0x5657, -0x5674, 0x5636, 0x562F, 0x5630, -0x5880, 0x589F, 0x589E, 0x58B3, -0x589C, 0x58AE, 0x58A9, 0x58A6, -0x596D, 0x5B09, 0x5AFB, 0x5B0B, -0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, -0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, -0x5C65, 0x5D9D, 0x5D94, 0x5E62, -0x5E5F, 0x5E61, 0x5EE2, 0x5EDA, -0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, -0x5F48, 0x5F71, 0x5FB7, 0x5FB5, -0x6176, 0x6167, 0x616E, 0x615D, -0x6155, 0x6182, 0x617C, 0x6170, -0x616B, 0x617E, 0x61A7, 0x6190, -0x61AB, 0x618E, 0x61AC, 0x619A, -0x61A4, 0x6194, 0x61AE, 0x622E, -0x6469, 0x646F, 0x6479, 0x649E, -0x64B2, 0x6488, 0x6490, 0x64B0, -0x64A5, 0x6493, 0x6495, 0x64A9, -0x6492, 0x64AE, 0x64AD, 0x64AB, -0x649A, 0x64AC, 0x6499, 0x64A2, -0x64B3, 0x6575, 0x6577, 0x6578, -0x66AE, 0x66AB, 0x66B4, 0x66B1, -0x6A23, 0x6A1F, 0x69E8, 0x6A01, -0x6A1E, 0x6A19, 0x69FD, 0x6A21, -0x6A13, 0x6A0A, 0x69F3, 0x6A02, -0x6A05, 0x69ED, 0x6A11, 0x6B50, -0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, -0x6F3F, 0x6F7C, 0x6F84, 0x6F51, -0x6F66, 0x6F54, 0x6F86, 0x6F6D, -0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, -0x6F7A, 0x6F70, 0x6F64, 0x6F97, -0x6F58, 0x6ED5, 0x6F6F, 0x6F60, -0x6F5F, 0x719F, 0x71AC, 0x71B1, -0x71A8, 0x7256, 0x729B, 0x734E, -0x7357, 0x7469, 0x748B, 0x7483, -0x747E, 0x7480, 0x757F, 0x7620, -0x7629, 0x761F, 0x7624, 0x7626, -0x7621, 0x7622, 0x769A, 0x76BA, -0x76E4, 0x778E, 0x7787, 0x778C, -0x7791, 0x778B, 0x78CB, 0x78C5, -0x78BA, 0x78CA, 0x78BE, 0x78D5, -0x78BC, 0x78D0, 0x7A3F, 0x7A3C, -0x7A40, 0x7A3D, 0x7A37, 0x7A3B, -0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, -0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, -0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, -0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, -0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, -0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, -0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, -0x7F75, 0x7F77, 0x7FAF, 0x7FE9, -0x8026, 0x819B, 0x819C, 0x819D, -0x81A0, 0x819A, 0x8198, 0x8517, -0x853D, 0x851A, 0x84EE, 0x852C, -0x852D, 0x8513, 0x8511, 0x8523, -0x8521, 0x8514, 0x84EC, 0x8525, -0x84FF, 0x8506, 0x8782, 0x8774, -0x8776, 0x8760, 0x8766, 0x8778, -0x8768, 0x8759, 0x8757, 0x874C, -0x8753, 0x885B, 0x885D, 0x8910, -0x8907, 0x8912, 0x8913, 0x8915, -0x890A, 0x8ABC, 0x8AD2, 0x8AC7, -0x8AC4, 0x8A95, 0x8ACB, 0x8AF8, -0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, -0x8AB0, 0x8AD6, 0x8ACD, 0x8AB6, -0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, -0x8C6C, 0x8CE0, 0x8CDE, 0x8CE6, -0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, -0x8CE3, 0x8CDC, 0x8CEA, 0x8CE1, -0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, -0x8E10, 0x8E1D, 0x8E22, 0x8E0F, -0x8E29, 0x8E1F, 0x8E21, 0x8E1E, -0x8EBA, 0x8F1D, 0x8F1B, 0x8F1F, -0x8F29, 0x8F26, 0x8F2A, 0x8F1C, -0x8F1E, 0x8F25, 0x9069, 0x906E, -0x9068, 0x906D, 0x9077, 0x9130, -0x912D, 0x9127, 0x9131, 0x9187, -0x9189, 0x918B, 0x9183, 0x92C5, -0x92BB, 0x92B7, 0x92EA, 0x92AC, -0x92E4, 0x92C1, 0x92B3, 0x92BC, -0x92D2, 0x92C7, 0x92F0, 0x92B2, -0x95AD, 0x95B1, 0x9704, 0x9706, -0x9707, 0x9709, 0x9760, 0x978D, -0x978B, 0x978F, 0x9821, 0x982B, -0x981C, 0x98B3, 0x990A, 0x9913, -0x9912, 0x9918, 0x99DD, 0x99D0, -0x99DF, 0x99DB, 0x99D1, 0x99D5, -0x99D2, 0x99D9, 0x9AB7, 0x9AEE, -0x9AEF, 0x9B27, 0x9B45, 0x9B44, -0x9B77, 0x9B6F, 0x9D06, 0x9D09, -0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, -0x58A8, 0x9F52, 0x5112, 0x5118, -0x5114, 0x5110, 0x5115, 0x5180, -0x51AA, 0x51DD, 0x5291, 0x5293, -0x52F3, 0x5659, 0x566B, 0x5679, -0x5669, 0x5664, 0x5678, 0x566A, -0x5668, 0x5665, 0x5671, 0x566F, -0x566C, 0x5662, 0x5676, 0x58C1, -0x58BE, 0x58C7, 0x58C5, 0x596E, -0x5B1D, 0x5B34, 0x5B78, 0x5BF0, -0x5C0E, 0x5F4A, 0x61B2, 0x6191, -0x61A9, 0x618A, 0x61CD, 0x61B6, -0x61BE, 0x61CA, 0x61C8, 0x6230, -0x64C5, 0x64C1, 0x64CB, 0x64BB, -0x64BC, 0x64DA, 0x64C4, 0x64C7, -0x64C2, 0x64CD, 0x64BF, 0x64D2, -0x64D4, 0x64BE, 0x6574, 0x66C6, -0x66C9, 0x66B9, 0x66C4, 0x66C7, -0x66B8, 0x6A3D, 0x6A38, 0x6A3A, -0x6A59, 0x6A6B, 0x6A58, 0x6A39, -0x6A44, 0x6A62, 0x6A61, 0x6A4B, -0x6A47, 0x6A35, 0x6A5F, 0x6A48, -0x6B59, 0x6B77, 0x6C05, 0x6FC2, -0x6FB1, 0x6FA1, 0x6FC3, 0x6FA4, -0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, -0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, -0x6FB4, 0x71BE, 0x71C9, 0x71D0, -0x71D2, 0x71C8, 0x71D5, 0x71B9, -0x71CE, 0x71D9, 0x71DC, 0x71C3, -0x71C4, 0x7368, 0x749C, 0x74A3, -0x7498, 0x749F, 0x749E, 0x74E2, -0x750C, 0x750D, 0x7634, 0x7638, -0x763A, 0x76E7, 0x76E5, 0x77A0, -0x779E, 0x779F, 0x77A5, 0x78E8, -0x78DA, 0x78EC, 0x78E7, 0x79A6, -0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, -0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, -0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, -0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, -0x7E0A, 0x7E11, 0x7E08, 0x7E1B, -0x7E23, 0x7E1E, 0x7E1D, 0x7E09, -0x7E10, 0x7F79, 0x7FB2, 0x7FF0, -0x7FF1, 0x7FEE, 0x8028, 0x81B3, -0x81A9, 0x81A8, 0x81FB, 0x8208, -0x8258, 0x8259, 0x854A, 0x8559, -0x8548, 0x8568, 0x8569, 0x8543, -0x8549, 0x856D, 0x856A, 0x855E, -0x8783, 0x879F, 0x879E, 0x87A2, -0x878D, 0x8861, 0x892A, 0x8932, -0x8925, 0x892B, 0x8921, 0x89AA, -0x89A6, 0x8AE6, 0x8AFA, 0x8AEB, -0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, -0x8AEE, 0x8AFE, 0x8B01, 0x8B02, -0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, -0x8AFC, 0x8C6B, 0x8C6D, 0x8C93, -0x8CF4, 0x8E44, 0x8E31, 0x8E34, -0x8E42, 0x8E39, 0x8E35, 0x8F3B, -0x8F2F, 0x8F38, 0x8F33, 0x8FA8, -0x8FA6, 0x9075, 0x9074, 0x9078, -0x9072, 0x907C, 0x907A, 0x9134, -0x9192, 0x9320, 0x9336, 0x92F8, -0x9333, 0x932F, 0x9322, 0x92FC, -0x932B, 0x9304, 0x931A, 0x9310, -0x9326, 0x9321, 0x9315, 0x932E, -0x9319, 0x95BB, 0x96A7, 0x96A8, -0x96AA, 0x96D5, 0x970E, 0x9711, -0x9716, 0x970D, 0x9713, 0x970F, -0x975B, 0x975C, 0x9766, 0x9798, -0x9830, 0x9838, 0x983B, 0x9837, -0x982D, 0x9839, 0x9824, 0x9910, -0x9928, 0x991E, 0x991B, 0x9921, -0x991A, 0x99ED, 0x99E2, 0x99F1, -0x9AB8, 0x9ABC, 0x9AFB, 0x9AED, -0x9B28, 0x9B91, 0x9D15, 0x9D23, -0x9D26, 0x9D28, 0x9D12, 0x9D1B, -0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, -0x512A, 0x511F, 0x5121, 0x5132, -0x52F5, 0x568E, 0x5680, 0x5690, -0x5685, 0x5687, 0x568F, 0x58D5, -0x58D3, 0x58D1, 0x58CE, 0x5B30, -0x5B2A, 0x5B24, 0x5B7A, 0x5C37, -0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, -0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD, -0x61C9, 0x61C2, 0x61C7, 0x61E6, -0x61CB, 0x6232, 0x6234, 0x64CE, -0x64CA, 0x64D8, 0x64E0, 0x64F0, -0x64E6, 0x64EC, 0x64F1, 0x64E2, -0x64ED, 0x6582, 0x6583, 0x66D9, -0x66D6, 0x6A80, 0x6A94, 0x6A84, -0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, -0x6A7E, 0x6A97, 0x6A90, 0x6AA0, -0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, -0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0, -0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, -0x6F80, 0x6FEC, 0x6FE1, 0x6FE9, -0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, -0x71DF, 0x71EE, 0x71E6, 0x71E5, -0x71ED, 0x71EC, 0x71F4, 0x71E0, -0x7235, 0x7246, 0x7370, 0x7372, -0x74A9, 0x74B0, 0x74A6, 0x74A8, -0x7646, 0x7642, 0x764C, 0x76EA, -0x77B3, 0x77AA, 0x77B0, 0x77AC, -0x77A7, 0x77AD, 0x77EF, 0x78F7, -0x78FA, 0x78F4, 0x78EF, 0x7901, -0x79A7, 0x79AA, 0x7A57, 0x7ABF, -0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, -0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, -0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, -0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, -0x7E37, 0x7E32, 0x7E43, 0x7E2B, -0x7E3D, 0x7E31, 0x7E45, 0x7E41, -0x7E34, 0x7E39, 0x7E48, 0x7E35, -0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, -0x7FFC, 0x8071, 0x8072, 0x8070, -0x806F, 0x8073, 0x81C6, 0x81C3, -0x81BA, 0x81C2, 0x81C0, 0x81BF, -0x81BD, 0x81C9, 0x81BE, 0x81E8, -0x8209, 0x8271, 0x85AA, 0x8584, -0x857E, 0x859C, 0x8591, 0x8594, -0x85AF, 0x859B, 0x8587, 0x85A8, -0x858A, 0x8667, 0x87C0, 0x87D1, -0x87B3, 0x87D2, 0x87C6, 0x87AB, -0x87BB, 0x87BA, 0x87C8, 0x87CB, -0x893B, 0x8936, 0x8944, 0x8938, -0x893D, 0x89AC, 0x8B0E, 0x8B17, -0x8B19, 0x8B1B, 0x8B0A, 0x8B20, -0x8B1D, 0x8B04, 0x8B10, 0x8C41, -0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, -0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, -0x8E49, 0x8E4B, 0x8E48, 0x8E4A, -0x8F44, 0x8F3E, 0x8F42, 0x8F45, -0x8F3F, 0x907F, 0x907D, 0x9084, -0x9081, 0x9082, 0x9080, 0x9139, -0x91A3, 0x919E, 0x919C, 0x934D, -0x9382, 0x9328, 0x9375, 0x934A, -0x9365, 0x934B, 0x9318, 0x937E, -0x936C, 0x935B, 0x9370, 0x935A, -0x9354, 0x95CA, 0x95CB, 0x95CC, -0x95C8, 0x95C6, 0x96B1, 0x96B8, -0x96D6, 0x971C, 0x971E, 0x97A0, -0x97D3, 0x9846, 0x98B6, 0x9935, -0x9A01, 0x99FF, 0x9BAE, 0x9BAB, -0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, -0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, -0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, -0x53E2, 0x5695, 0x56AE, 0x58D9, -0x58D8, 0x5B38, 0x5F5D, 0x61E3, -0x6233, 0x64F4, 0x64F2, 0x64FE, -0x6506, 0x64FA, 0x64FB, 0x64F7, -0x65B7, 0x66DC, 0x6726, 0x6AB3, -0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, -0x6AC2, 0x6AAE, 0x6AAF, 0x6B5F, -0x6B78, 0x6BAF, 0x7009, 0x700B, -0x6FFE, 0x7006, 0x6FFA, 0x7011, -0x700F, 0x71FB, 0x71FC, 0x71FE, -0x71F8, 0x7377, 0x7375, 0x74A7, -0x74BF, 0x7515, 0x7656, 0x7658, -0x7652, 0x77BD, 0x77BF, 0x77BB, -0x77BC, 0x790E, 0x79AE, 0x7A61, -0x7A62, 0x7A60, 0x7AC4, 0x7AC5, -0x7C2B, 0x7C27, 0x7C2A, 0x7C1E, -0x7C23, 0x7C21, 0x7CE7, 0x7E54, -0x7E55, 0x7E5E, 0x7E5A, 0x7E61, -0x7E52, 0x7E59, 0x7F48, 0x7FF9, -0x7FFB, 0x8077, 0x8076, 0x81CD, -0x81CF, 0x820A, 0x85CF, 0x85A9, -0x85CD, 0x85D0, 0x85C9, 0x85B0, -0x85BA, 0x85B9, 0x85A6, 0x87EF, -0x87EC, 0x87F2, 0x87E0, 0x8986, -0x89B2, 0x89F4, 0x8B28, 0x8B39, -0x8B2C, 0x8B2B, 0x8C50, 0x8D05, -0x8E59, 0x8E63, 0x8E66, 0x8E64, -0x8E5F, 0x8E55, 0x8EC0, 0x8F49, -0x8F4D, 0x9087, 0x9083, 0x9088, -0x91AB, 0x91AC, 0x91D0, 0x9394, -0x938A, 0x9396, 0x93A2, 0x93B3, -0x93AE, 0x93AC, 0x93B0, 0x9398, -0x939A, 0x9397, 0x95D4, 0x95D6, -0x95D0, 0x95D5, 0x96E2, 0x96DC, -0x96D9, 0x96DB, 0x96DE, 0x9724, -0x97A3, 0x97A6, 0x97AD, 0x97F9, -0x984D, 0x984F, 0x984C, 0x984E, -0x9853, 0x98BA, 0x993E, 0x993F, -0x993D, 0x992E, 0x99A5, 0x9A0E, -0x9AC1, 0x9B03, 0x9B06, 0x9B4F, -0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, -0x9BFD, 0x9BC8, 0x9BC0, 0x9D51, -0x9D5D, 0x9D60, 0x9EE0, 0x9F15, -0x9F2C, 0x5133, 0x56A5, 0x58DE, -0x58DF, 0x58E2, 0x5BF5, 0x9F90, -0x5EEC, 0x61F2, 0x61F7, 0x61F6, -0x61F5, 0x6500, 0x650F, 0x66E0, -0x66DD, 0x6AE5, 0x6ADD, 0x6ADA, -0x6AD3, 0x701B, 0x701F, 0x7028, -0x701A, 0x701D, 0x7015, 0x7018, -0x7206, 0x720D, 0x7258, 0x72A2, -0x7378, 0x737A, 0x74BD, 0x74CA, -0x74E3, 0x7587, 0x7586, 0x765F, -0x7661, 0x77C7, 0x7919, 0x79B1, -0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, -0x7C38, 0x7C3D, 0x7C37, 0x7C40, -0x7E6B, 0x7E6D, 0x7E79, 0x7E69, -0x7E6A, 0x7F85, 0x7E73, 0x7FB6, -0x7FB9, 0x7FB8, 0x81D8, 0x85E9, -0x85DD, 0x85EA, 0x85D5, 0x85E4, -0x85E5, 0x85F7, 0x87FB, 0x8805, -0x880D, 0x87F9, 0x87FE, 0x8960, -0x895F, 0x8956, 0x895E, 0x8B41, -0x8B5C, 0x8B58, 0x8B49, 0x8B5A, -0x8B4E, 0x8B4F, 0x8B46, 0x8B59, -0x8D08, 0x8D0A, 0x8E7C, 0x8E72, -0x8E87, 0x8E76, 0x8E6C, 0x8E7A, -0x8E74, 0x8F54, 0x8F4E, 0x8FAD, -0x908A, 0x908B, 0x91B1, 0x91AE, -0x93E1, 0x93D1, 0x93DF, 0x93C3, -0x93C8, 0x93DC, 0x93DD, 0x93D6, -0x93E2, 0x93CD, 0x93D8, 0x93E4, -0x93D7, 0x93E8, 0x95DC, 0x96B4, -0x96E3, 0x972A, 0x9727, 0x9761, -0x97DC, 0x97FB, 0x985E, 0x9858, -0x985B, 0x98BC, 0x9945, 0x9949, -0x9A16, 0x9A19, 0x9B0D, 0x9BE8, -0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, -0x9D61, 0x9D72, 0x9D6A, 0x9D6C, -0x9E92, 0x9E97, 0x9E93, 0x9EB4, -0x52F8, 0x56A8, 0x56B7, 0x56B6, -0x56B4, 0x56BC, 0x58E4, 0x5B40, -0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, -0x61F8, 0x61FA, 0x6518, 0x6514, -0x6519, 0x66E6, 0x6727, 0x6AEC, -0x703E, 0x7030, 0x7032, 0x7210, -0x737B, 0x74CF, 0x7662, 0x7665, -0x7926, 0x792A, 0x792C, 0x792B, -0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, -0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, -0x7E7D, 0x7E7C, 0x7E82, 0x7F4C, -0x8000, 0x81DA, 0x8266, 0x85FB, -0x85F9, 0x8611, 0x85FA, 0x8606, -0x860B, 0x8607, 0x860A, 0x8814, -0x8815, 0x8964, 0x89BA, 0x89F8, -0x8B70, 0x8B6C, 0x8B66, 0x8B6F, -0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, -0x8E89, 0x8E81, 0x8E85, 0x8E82, -0x91B4, 0x91CB, 0x9418, 0x9403, -0x93FD, 0x95E1, 0x9730, 0x98C4, -0x9952, 0x9951, 0x99A8, 0x9A2B, -0x9A30, 0x9A37, 0x9A35, 0x9C13, -0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, -0x9F2F, 0x9F5F, 0x9F63, 0x9F61, -0x5137, 0x5138, 0x56C1, 0x56C0, -0x56C2, 0x5914, 0x5C6C, 0x5DCD, -0x61FC, 0x61FE, 0x651D, 0x651C, -0x6595, 0x66E9, 0x6AFB, 0x6B04, -0x6AFA, 0x6BB2, 0x704C, 0x721B, -0x72A7, 0x74D6, 0x74D4, 0x7669, -0x77D3, 0x7C50, 0x7E8F, 0x7E8C, -0x7FBC, 0x8617, 0x862D, 0x861A, -0x8823, 0x8822, 0x8821, 0x881F, -0x896A, 0x896C, 0x89BD, 0x8B74, -0x8B77, 0x8B7D, 0x8D13, 0x8E8A, -0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, -0x91BA, 0x942E, 0x9433, 0x9435, -0x943A, 0x9438, 0x9432, 0x942B, -0x95E2, 0x9738, 0x9739, 0x9732, -0x97FF, 0x9867, 0x9865, 0x9957, -0x9A45, 0x9A43, 0x9A40, 0x9A3E, -0x9ACF, 0x9B54, 0x9B51, 0x9C2D, -0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, -0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, -0x9F5C, 0x9F66, 0x9F67, 0x513C, -0x513B, 0x56C8, 0x56CA, 0x56C9, -0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, -0x61FF, 0x6524, 0x6B0A, 0x6B61, -0x7051, 0x7058, 0x7380, 0x74E4, -0x758A, 0x766E, 0x766C, 0x79B3, -0x7C60, 0x7C5F, 0x807E, 0x807D, -0x81DF, 0x8972, 0x896F, 0x89FC, -0x8B80, 0x8D16, 0x8D17, 0x8E91, -0x8E93, 0x8F61, 0x9148, 0x9444, -0x9451, 0x9452, 0x973D, 0x973E, -0x97C3, 0x97C1, 0x986B, 0x9955, -0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, -0x9C49, 0x9C31, 0x9C3E, 0x9C3B, -0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, -0x9F6A, 0x9F94, 0x56CC, 0x5DD6, -0x6200, 0x6523, 0x652B, 0x652A, -0x66EC, 0x6B10, 0x74DA, 0x7ACA, -0x7C64, 0x7C63, 0x7C65, 0x7E93, -0x7E96, 0x7E94, 0x81E2, 0x8638, -0x863F, 0x8831, 0x8B8A, 0x9090, -0x908F, 0x9463, 0x9460, 0x9464, -0x9768, 0x986F, 0x995C, 0x9A5A, -0x9A5B, 0x9A57, 0x9AD3, 0x9AD4, -0x9AD1, 0x9C54, 0x9C57, 0x9C56, -0x9DE5, 0x9E9F, 0x9EF4, 0x56D1, -0x58E9, 0x652C, 0x705E, 0x7671, -0x7672, 0x77D7, 0x7F50, 0x7F88, -0x8836, 0x8839, 0x8862, 0x8B93, -0x8B92, 0x8B96, 0x8277, 0x8D1B, -0x91C0, 0x946A, 0x9742, 0x9748, -0x9744, 0x97C6, 0x9870, 0x9A5F, -0x9B22, 0x9B58, 0x9C5F, 0x9DF9, -0x9DFA, 0x9E7C, 0x9E7D, 0x9F07, -0x9F77, 0x9F72, 0x5EF3, 0x6B16, -0x7063, 0x7C6C, 0x7C6E, 0x883B, -0x89C0, 0x8EA1, 0x91C1, 0x9472, -0x9470, 0x9871, 0x995E, 0x9AD6, -0x9B23, 0x9ECC, 0x7064, 0x77DA, -0x8B9A, 0x9477, 0x97C9, 0x9A62, -0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, -0x91C5, 0x947D, 0x947E, 0x947C, -0x9C77, 0x9C78, 0x9EF7, 0x8C54, -0x947F, 0x9E1A, 0x7228, 0x9A6A, -0x9B31, 0x9E1B, 0x9E1E, 0x7C72, -0x2460, 0x2461, 0x2462, 0x2463, -0x2464, 0x2465, 0x2466, 0x2467, -0x2468, 0x2469, 0x2474, 0x2475, -0x2476, 0x2477, 0x2478, 0x2479, -0x247A, 0x247B, 0x247C, 0x247D, -0x2170, 0x2171, 0x2172, 0x2173, -0x2174, 0x2175, 0x2176, 0x2177, -0x2178, 0x2179, 0x4E36, 0x4E3F, -0x4E85, 0x4EA0, 0x5182, 0x5196, -0x51AB, 0x52F9, 0x5338, 0x5369, -0x53B6, 0x590A, 0x5B80, 0x5DDB, -0x2F33, 0x5E7F, 0x5EF4, 0x5F50, -0x5F61, 0x6534, 0x65E0, 0x7592, -0x7676, 0x8FB5, 0x96B6, 0x00A8, -0x02C6, 0x30FD, 0x30FE, 0x309D, -0x309E, 0x3003, 0x4EDD, 0x3005, -0x3006, 0x3007, 0x30FC, 0xFF3B, -0xFF3D, 0x273D, 0x3041, 0x3042, -0x3043, 0x3044, 0x3045, 0x3046, -0x3047, 0x3048, 0x3049, 0x304A, -0x304B, 0x304C, 0x304D, 0x304E, -0x304F, 0x3050, 0x3051, 0x3052, -0x3053, 0x3054, 0x3055, 0x3056, -0x3057, 0x3058, 0x3059, 0x305A, -0x305B, 0x305C, 0x305D, 0x305E, -0x305F, 0x3060, 0x3061, 0x3062, -0x3063, 0x3064, 0x3065, 0x3066, -0x3067, 0x3068, 0x3069, 0x306A, -0x306B, 0x306C, 0x306D, 0x306E, -0x306F, 0x3070, 0x3071, 0x3072, -0x3073, 0x3074, 0x3075, 0x3076, -0x3077, 0x3078, 0x3079, 0x307A, -0x307B, 0x307C, 0x307D, 0x307E, -0x307F, 0x3080, 0x3081, 0x3082, -0x3083, 0x3084, 0x3085, 0x3086, -0x3087, 0x3088, 0x3089, 0x308A, -0x308B, 0x308C, 0x308D, 0x308E, -0x308F, 0x3090, 0x3091, 0x3092, -0x3093, 0x30A1, 0x30A2, 0x30A3, -0x30A4, 0x30A5, 0x30A6, 0x30A7, -0x30A8, 0x30A9, 0x30AA, 0x30AB, -0x30AC, 0x30AD, 0x30AE, 0x30AF, -0x30B0, 0x30B1, 0x30B2, 0x30B3, -0x30B4, 0x30B5, 0x30B6, 0x30B7, -0x30B8, 0x30B9, 0x30BA, 0x30BB, -0x30BC, 0x30BD, 0x30BE, 0x30BF, -0x30C0, 0x30C1, 0x30C2, 0x30C3, -0x30C4, 0x30C5, 0x30C6, 0x30C7, -0x30C8, 0x30C9, 0x30CA, 0x30CB, -0x30CC, 0x30CD, 0x30CE, 0x30CF, -0x30D0, 0x30D1, 0x30D2, 0x30D3, -0x30D4, 0x30D5, 0x30D6, 0x30D7, -0x30D8, 0x30D9, 0x30DA, 0x30DB, -0x30DC, 0x30DD, 0x30DE, 0x30DF, -0x30E0, 0x30E1, 0x30E2, 0x30E3, -0x30E4, 0x30E5, 0x30E6, 0x30E7, -0x30E8, 0x30E9, 0x30EA, 0x30EB, -0x30EC, 0x30ED, 0x30EE, 0x30EF, -0x30F0, 0x30F1, 0x30F2, 0x30F3, -0x30F4, 0x30F5, 0x30F6, 0x0410, -0x0411, 0x0412, 0x0413, 0x0414, -0x0415, 0x0401, 0x0416, 0x0417, -0x0418, 0x0419, 0x041A, 0x041B, -0x041C, 0x041D, 0x041E, 0x041F, -0x0420, 0x0421, 0x0422, 0x0423, -0x0424, 0x0425, 0x0426, 0x0427, -0x0428, 0x0429, 0x042A, 0x042B, -0x042C, 0x042D, 0x042E, 0x042F, -0x0430, 0x0431, 0x0432, 0x0433, -0x0434, 0x0435, 0x0451, 0x0436, -0x0437, 0x0438, 0x0439, 0x043A, -0x043B, 0x043C, 0x043D, 0x043E, -0x043F, 0x0440, 0x0441, 0x0442, -0x0443, 0x0444, 0x0445, 0x0446, -0x0447, 0x0448, 0x0449, 0x044A, -0x044B, 0x044C, 0x044D, 0x044E, -0x044F, 0x21E7, 0x21B8, 0x21B9, -0x31CF, 0x200CC, 0x4E5A, 0x2008A, -0x5202, 0x4491, 0x9FB0, 0x5188, -0x9FB1, 0x27607, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0x0000, 0x0000, -0x0000, 0x0000, 0xFFE2, 0xFFE4, -0xFF07, 0xFF02, 0x3231, 0x2116, -0x2121, 0x309B, 0x309C, 0x2E80, -0x2E84, 0x2E86, 0x2E87, 0x2E88, -0x2E8A, 0x2E8C, 0x2E8D, 0x2E95, -0x2E9C, 0x2E9D, 0x2EA5, 0x2EA7, -0x2EAA, 0x2EAC, 0x2EAE, 0x2EB6, -0x2EBC, 0x2EBE, 0x2EC6, 0x2ECA, -0x2ECC, 0x2ECD, 0x2ECF, 0x2ED6, -0x2ED7, 0x2EDE, 0x2EE3, 0x0000, -0x0000, 0x0000, 0x0283, 0x0250, -0x025B, 0x0254, 0x0275, 0x0153, -0x00F8, 0x014B, 0x028A, 0x026A, -0x4E42, 0x4E5C, 0x51F5, 0x531A, -0x5382, 0x4E07, 0x4E0C, 0x4E47, -0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, -0x5F73, 0x4E0F, 0x5187, 0x4E0E, -0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, -0x4EC8, 0x5198, 0x52FC, 0x536C, -0x53B9, 0x5720, 0x5903, 0x592C, -0x5C10, 0x5DFF, 0x65E1, 0x6BB3, -0x6BCC, 0x6C14, 0x723F, 0x4E31, -0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, -0x4EE1, 0x4EDD, 0x4EDA, 0x520C, -0x531C, 0x534C, 0x5722, 0x5723, -0x5917, 0x592F, 0x5B81, 0x5B84, -0x5C12, 0x5C3B, 0x5C74, 0x5C73, -0x5E04, 0x5E80, 0x5E82, 0x5FC9, -0x6209, 0x6250, 0x6C15, 0x6C36, -0x6C43, 0x6C3F, 0x6C3B, 0x72AE, -0x72B0, 0x738A, 0x79B8, 0x808A, -0x961E, 0x4F0E, 0x4F18, 0x4F2C, -0x4EF5, 0x4F14, 0x4EF1, 0x4F00, -0x4EF7, 0x4F08, 0x4F1D, 0x4F02, -0x4F05, 0x4F22, 0x4F13, 0x4F04, -0x4EF4, 0x4F12, 0x51B1, 0x5213, -0x5209, 0x5210, 0x52A6, 0x5322, -0x531F, 0x534D, 0x538A, 0x5407, -0x56E1, 0x56DF, 0x572E, 0x572A, -0x5734, 0x593C, 0x5980, 0x597C, -0x5985, 0x597B, 0x597E, 0x5977, -0x597F, 0x5B56, 0x5C15, 0x5C25, -0x5C7C, 0x5C7A, 0x5C7B, 0x5C7E, -0x5DDF, 0x5E75, 0x5E84, 0x5F02, -0x5F1A, 0x5F74, 0x5FD5, 0x5FD4, -0x5FCF, 0x625C, 0x625E, 0x6264, -0x6261, 0x6266, 0x6262, 0x6259, -0x6260, 0x625A, 0x6265, 0x65EF, -0x65EE, 0x673E, 0x6739, 0x6738, -0x673B, 0x673A, 0x673F, 0x673C, -0x6733, 0x6C18, 0x6C46, 0x6C52, -0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, -0x6C4B, 0x6C4C, 0x7071, 0x725E, -0x72B4, 0x72B5, 0x738E, 0x752A, -0x767F, 0x7A75, 0x7F51, 0x8278, -0x827C, 0x8280, 0x827D, 0x827F, -0x864D, 0x897E, 0x9099, 0x9097, -0x9098, 0x909B, 0x9094, 0x9622, -0x9624, 0x9620, 0x9623, 0x4F56, -0x4F3B, 0x4F62, 0x4F49, 0x4F53, -0x4F64, 0x4F3E, 0x4F67, 0x4F52, -0x4F5F, 0x4F41, 0x4F58, 0x4F2D, -0x4F33, 0x4F3F, 0x4F61, 0x518F, -0x51B9, 0x521C, 0x521E, 0x5221, -0x52AD, 0x52AE, 0x5309, 0x5363, -0x5372, 0x538E, 0x538F, 0x5430, -0x5437, 0x542A, 0x5454, 0x5445, -0x5419, 0x541C, 0x5425, 0x5418, -0x543D, 0x544F, 0x5441, 0x5428, -0x5424, 0x5447, 0x56EE, 0x56E7, -0x56E5, 0x5741, 0x5745, 0x574C, -0x5749, 0x574B, 0x5752, 0x5906, -0x5940, 0x59A6, 0x5998, 0x59A0, -0x5997, 0x598E, 0x59A2, 0x5990, -0x598F, 0x59A7, 0x59A1, 0x5B8E, -0x5B92, 0x5C28, 0x5C2A, 0x5C8D, -0x5C8F, 0x5C88, 0x5C8B, 0x5C89, -0x5C92, 0x5C8A, 0x5C86, 0x5C93, -0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, -0x5E8B, 0x5E89, 0x5E8C, 0x5E88, -0x5E8D, 0x5F05, 0x5F1D, 0x5F78, -0x5F76, 0x5FD2, 0x5FD1, 0x5FD0, -0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, -0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA, -0x5FEF, 0x5FF7, 0x5FFB, 0x6000, -0x5FF4, 0x623A, 0x6283, 0x628C, -0x628E, 0x628F, 0x6294, 0x6287, -0x6271, 0x627B, 0x627A, 0x6270, -0x6281, 0x6288, 0x6277, 0x627D, -0x6272, 0x6274, 0x6537, 0x65F0, -0x65F4, 0x65F3, 0x65F2, 0x65F5, -0x6745, 0x6747, 0x6759, 0x6755, -0x674C, 0x6748, 0x675D, 0x674D, -0x675A, 0x674B, 0x6BD0, 0x6C19, -0x6C1A, 0x6C78, 0x6C67, 0x6C6B, -0x6C84, 0x6C8B, 0x6C8F, 0x6C71, -0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, -0x6C87, 0x6C95, 0x6C9C, 0x6C66, -0x6C73, 0x6C65, 0x6C7B, 0x6C8E, -0x7074, 0x707A, 0x7263, 0x72BF, -0x72BD, 0x72C3, 0x72C6, 0x72C1, -0x72BA, 0x72C5, 0x7395, 0x7397, -0x7393, 0x7394, 0x7392, 0x753A, -0x7539, 0x7594, 0x7595, 0x7681, -0x793D, 0x8034, 0x8095, 0x8099, -0x8090, 0x8092, 0x809C, 0x8290, -0x828F, 0x8285, 0x828E, 0x8291, -0x8293, 0x828A, 0x8283, 0x8284, -0x8C78, 0x8FC9, 0x8FBF, 0x909F, -0x90A1, 0x90A5, 0x909E, 0x90A7, -0x90A0, 0x9630, 0x9628, 0x962F, -0x962D, 0x4E33, 0x4F98, 0x4F7C, -0x4F85, 0x4F7D, 0x4F80, 0x4F87, -0x4F76, 0x4F74, 0x4F89, 0x4F84, -0x4F77, 0x4F4C, 0x4F97, 0x4F6A, -0x4F9A, 0x4F79, 0x4F81, 0x4F78, -0x4F90, 0x4F9C, 0x4F94, 0x4F9E, -0x4F92, 0x4F82, 0x4F95, 0x4F6B, -0x4F6E, 0x519E, 0x51BC, 0x51BE, -0x5235, 0x5232, 0x5233, 0x5246, -0x5231, 0x52BC, 0x530A, 0x530B, -0x533C, 0x5392, 0x5394, 0x5487, -0x547F, 0x5481, 0x5491, 0x5482, -0x5488, 0x546B, 0x547A, 0x547E, -0x5465, 0x546C, 0x5474, 0x5466, -0x548D, 0x546F, 0x5461, 0x5460, -0x5498, 0x5463, 0x5467, 0x5464, -0x56F7, 0x56F9, 0x576F, 0x5772, -0x576D, 0x576B, 0x5771, 0x5770, -0x5776, 0x5780, 0x5775, 0x577B, -0x5773, 0x5774, 0x5762, 0x5768, -0x577D, 0x590C, 0x5945, 0x59B5, -0x59BA, 0x59CF, 0x59CE, 0x59B2, -0x59CC, 0x59C1, 0x59B6, 0x59BC, -0x59C3, 0x59D6, 0x59B1, 0x59BD, -0x59C0, 0x59C8, 0x59B4, 0x59C7, -0x5B62, 0x5B65, 0x5B93, 0x5B95, -0x5C44, 0x5C47, 0x5CAE, 0x5CA4, -0x5CA0, 0x5CB5, 0x5CAF, 0x5CA8, -0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, -0x5CA2, 0x5CAA, 0x5CA7, 0x5C9D, -0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, -0x5E17, 0x5E14, 0x5E19, 0x5F28, -0x5F22, 0x5F23, 0x5F24, 0x5F54, -0x5F82, 0x5F7E, 0x5F7D, 0x5FDE, -0x5FE5, 0x602D, 0x6026, 0x6019, -0x6032, 0x600B, 0x6034, 0x600A, -0x6017, 0x6033, 0x601A, 0x601E, -0x602C, 0x6022, 0x600D, 0x6010, -0x602E, 0x6013, 0x6011, 0x600C, -0x6009, 0x601C, 0x6214, 0x623D, -0x62AD, 0x62B4, 0x62D1, 0x62BE, -0x62AA, 0x62B6, 0x62CA, 0x62AE, -0x62B3, 0x62AF, 0x62BB, 0x62A9, -0x62B0, 0x62B8, 0x653D, 0x65A8, -0x65BB, 0x6609, 0x65FC, 0x6604, -0x6612, 0x6608, 0x65FB, 0x6603, -0x660B, 0x660D, 0x6605, 0x65FD, -0x6611, 0x6610, 0x66F6, 0x670A, -0x6785, 0x676C, 0x678E, 0x6792, -0x6776, 0x677B, 0x6798, 0x6786, -0x6784, 0x6774, 0x678D, 0x678C, -0x677A, 0x679F, 0x6791, 0x6799, -0x6783, 0x677D, 0x6781, 0x6778, -0x6779, 0x6794, 0x6B25, 0x6B80, -0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, -0x6CEC, 0x6CEB, 0x6CEE, 0x6CD9, -0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, -0x6CB7, 0x6CD0, 0x6CC2, 0x6CBA, -0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, -0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, -0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, -0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, -0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, -0x7094, 0x7098, 0x7085, 0x7093, -0x7086, 0x7084, 0x7091, 0x7096, -0x7082, 0x709A, 0x7083, 0x726A, -0x72D6, 0x72CB, 0x72D8, 0x72C9, -0x72DC, 0x72D2, 0x72D4, 0x72DA, -0x72CC, 0x72D1, 0x73A4, 0x73A1, -0x73AD, 0x73A6, 0x73A2, 0x73A0, -0x73AC, 0x739D, 0x74DD, 0x74E8, -0x753F, 0x7540, 0x753E, 0x758C, -0x7598, 0x76AF, 0x76F3, 0x76F1, -0x76F0, 0x76F5, 0x77F8, 0x77FC, -0x77F9, 0x77FB, 0x77FA, 0x77F7, -0x7942, 0x793F, 0x79C5, 0x7A78, -0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, -0x8035, 0x808F, 0x80AE, 0x80A3, -0x80B8, 0x80B5, 0x80AD, 0x8220, -0x82A0, 0x82C0, 0x82AB, 0x829A, -0x8298, 0x829B, 0x82B5, 0x82A7, -0x82AE, 0x82BC, 0x829E, 0x82BA, -0x82B4, 0x82A8, 0x82A1, 0x82A9, -0x82C2, 0x82A4, 0x82C3, 0x82B6, -0x82A2, 0x8670, 0x866F, 0x866D, -0x866E, 0x8C56, 0x8FD2, 0x8FCB, -0x8FD3, 0x8FCD, 0x8FD6, 0x8FD5, -0x8FD7, 0x90B2, 0x90B4, 0x90AF, -0x90B3, 0x90B0, 0x9639, 0x963D, -0x963C, 0x963A, 0x9643, 0x4FCD, -0x4FC5, 0x4FD3, 0x4FB2, 0x4FC9, -0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, -0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, -0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, -0x4FB9, 0x4FEC, 0x5244, 0x5249, -0x52C0, 0x52C2, 0x533D, 0x537C, -0x5397, 0x5396, 0x5399, 0x5398, -0x54BA, 0x54A1, 0x54AD, 0x54A5, -0x54CF, 0x54C3, 0x830D, 0x54B7, -0x54AE, 0x54D6, 0x54B6, 0x54C5, -0x54C6, 0x54A0, 0x5470, 0x54BC, -0x54A2, 0x54BE, 0x5472, 0x54DE, -0x54B0, 0x57B5, 0x579E, 0x579F, -0x57A4, 0x578C, 0x5797, 0x579D, -0x579B, 0x5794, 0x5798, 0x578F, -0x5799, 0x57A5, 0x579A, 0x5795, -0x58F4, 0x590D, 0x5953, 0x59E1, -0x59DE, 0x59EE, 0x5A00, 0x59F1, -0x59DD, 0x59FA, 0x59FD, 0x59FC, -0x59F6, 0x59E4, 0x59F2, 0x59F7, -0x59DB, 0x59E9, 0x59F3, 0x59F5, -0x59E0, 0x59FE, 0x59F4, 0x59ED, -0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, -0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, -0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, -0x5CCA, 0x5CD6, 0x5CD3, 0x5CD4, -0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, -0x5CDF, 0x5CF8, 0x5DF9, 0x5E21, -0x5E22, 0x5E23, 0x5E20, 0x5E24, -0x5EB0, 0x5EA4, 0x5EA2, 0x5E9B, -0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, -0x5F56, 0x5F86, 0x6037, 0x6039, -0x6054, 0x6072, 0x605E, 0x6045, -0x6053, 0x6047, 0x6049, 0x605B, -0x604C, 0x6040, 0x6042, 0x605F, -0x6024, 0x6044, 0x6058, 0x6066, -0x606E, 0x6242, 0x6243, 0x62CF, -0x630D, 0x630B, 0x62F5, 0x630E, -0x6303, 0x62EB, 0x62F9, 0x630F, -0x630C, 0x62F8, 0x62F6, 0x6300, -0x6313, 0x6314, 0x62FA, 0x6315, -0x62FB, 0x62F0, 0x6541, 0x6543, -0x65AA, 0x65BF, 0x6636, 0x6621, -0x6632, 0x6635, 0x661C, 0x6626, -0x6622, 0x6633, 0x662B, 0x663A, -0x661D, 0x6634, 0x6639, 0x662E, -0x670F, 0x6710, 0x67C1, 0x67F2, -0x67C8, 0x67BA, 0x67DC, 0x67BB, -0x67F8, 0x67D8, 0x67C0, 0x67B7, -0x67C5, 0x67EB, 0x67E4, 0x67DF, -0x67B5, 0x67CD, 0x67B3, 0x67F7, -0x67F6, 0x67EE, 0x67E3, 0x67C2, -0x67B9, 0x67CE, 0x67E7, 0x67F0, -0x67B2, 0x67FC, 0x67C6, 0x67ED, -0x67CC, 0x67AE, 0x67E6, 0x67DB, -0x67FA, 0x67C9, 0x67CA, 0x67C3, -0x67EA, 0x67CB, 0x6B28, 0x6B82, -0x6B84, 0x6BB6, 0x6BD6, 0x6BD8, -0x6BE0, 0x6C20, 0x6C21, 0x6D28, -0x6D34, 0x6D2D, 0x6D1F, 0x6D3C, -0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, -0x6D33, 0x6D04, 0x6D19, 0x6D3A, -0x6D1A, 0x6D11, 0x6D00, 0x6D1D, -0x6D42, 0x6D01, 0x6D18, 0x6D37, -0x6D03, 0x6D0F, 0x6D40, 0x6D07, -0x6D20, 0x6D2C, 0x6D08, 0x6D22, -0x6D09, 0x6D10, 0x70B7, 0x709F, -0x70BE, 0x70B1, 0x70B0, 0x70A1, -0x70B4, 0x70B5, 0x70A9, 0x7241, -0x7249, 0x724A, 0x726C, 0x7270, -0x7273, 0x726E, 0x72CA, 0x72E4, -0x72E8, 0x72EB, 0x72DF, 0x72EA, -0x72E6, 0x72E3, 0x7385, 0x73CC, -0x73C2, 0x73C8, 0x73C5, 0x73B9, -0x73B6, 0x73B5, 0x73B4, 0x73EB, -0x73BF, 0x73C7, 0x73BE, 0x73C3, -0x73C6, 0x73B8, 0x73CB, 0x74EC, -0x74EE, 0x752E, 0x7547, 0x7548, -0x75A7, 0x75AA, 0x7679, 0x76C4, -0x7708, 0x7703, 0x7704, 0x7705, -0x770A, 0x76F7, 0x76FB, 0x76FA, -0x77E7, 0x77E8, 0x7806, 0x7811, -0x7812, 0x7805, 0x7810, 0x780F, -0x780E, 0x7809, 0x7803, 0x7813, -0x794A, 0x794C, 0x794B, 0x7945, -0x7944, 0x79D5, 0x79CD, 0x79CF, -0x79D6, 0x79CE, 0x7A80, 0x7A7E, -0x7AD1, 0x7B00, 0x7B01, 0x7C7A, -0x7C78, 0x7C79, 0x7C7F, 0x7C80, -0x7C81, 0x7D03, 0x7D08, 0x7D01, -0x7F58, 0x7F91, 0x7F8D, 0x7FBE, -0x8007, 0x800E, 0x800F, 0x8014, -0x8037, 0x80D8, 0x80C7, 0x80E0, -0x80D1, 0x80C8, 0x80C2, 0x80D0, -0x80C5, 0x80E3, 0x80D9, 0x80DC, -0x80CA, 0x80D5, 0x80C9, 0x80CF, -0x80D7, 0x80E6, 0x80CD, 0x81FF, -0x8221, 0x8294, 0x82D9, 0x82FE, -0x82F9, 0x8307, 0x82E8, 0x8300, -0x82D5, 0x833A, 0x82EB, 0x82D6, -0x82F4, 0x82EC, 0x82E1, 0x82F2, -0x82F5, 0x830C, 0x82FB, 0x82F6, -0x82F0, 0x82EA, 0x82E4, 0x82E0, -0x82FA, 0x82F3, 0x82ED, 0x8677, -0x8674, 0x867C, 0x8673, 0x8841, -0x884E, 0x8867, 0x886A, 0x8869, -0x89D3, 0x8A04, 0x8A07, 0x8D72, -0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, -0x90F1, 0x90BD, 0x90BF, 0x90D5, -0x90C5, 0x90BE, 0x90C7, 0x90CB, -0x90C8, 0x91D4, 0x91D3, 0x9654, -0x964F, 0x9651, 0x9653, 0x964A, -0x964E, 0x501E, 0x5005, 0x5007, -0x5013, 0x5022, 0x5030, 0x501B, -0x4FF5, 0x4FF4, 0x5033, 0x5037, -0x502C, 0x4FF6, 0x4FF7, 0x5017, -0x501C, 0x5020, 0x5027, 0x5035, -0x502F, 0x5031, 0x500E, 0x515A, -0x5194, 0x5193, 0x51CA, 0x51C4, -0x51C5, 0x51C8, 0x51CE, 0x5261, -0x525A, 0x5252, 0x525E, 0x525F, -0x5255, 0x5262, 0x52CD, 0x530E, -0x539E, 0x5526, 0x54E2, 0x5517, -0x5512, 0x54E7, 0x54F3, 0x54E4, -0x551A, 0x54FF, 0x5504, 0x5508, -0x54EB, 0x5511, 0x5505, 0x54F1, -0x550A, 0x54FB, 0x54F7, 0x54F8, -0x54E0, 0x550E, 0x5503, 0x550B, -0x5701, 0x5702, 0x57CC, 0x5832, -0x57D5, 0x57D2, 0x57BA, 0x57C6, -0x57BD, 0x57BC, 0x57B8, 0x57B6, -0x57BF, 0x57C7, 0x57D0, 0x57B9, -0x57C1, 0x590E, 0x594A, 0x5A19, -0x5A16, 0x5A2D, 0x5A2E, 0x5A15, -0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, -0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, -0x5BAC, 0x5C03, 0x5C56, 0x5C54, -0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, -0x5CF7, 0x5D00, 0x5CF9, 0x5E29, -0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, -0x5EAC, 0x5F33, 0x5F30, 0x5F67, -0x605D, 0x605A, 0x6067, 0x6041, -0x60A2, 0x6088, 0x6080, 0x6092, -0x6081, 0x609D, 0x6083, 0x6095, -0x609B, 0x6097, 0x6087, 0x609C, -0x608E, 0x6219, 0x6246, 0x62F2, -0x6310, 0x6356, 0x632C, 0x6344, -0x6345, 0x6336, 0x6343, 0x63E4, -0x6339, 0x634B, 0x634A, 0x633C, -0x6329, 0x6341, 0x6334, 0x6358, -0x6354, 0x6359, 0x632D, 0x6347, -0x6333, 0x635A, 0x6351, 0x6338, -0x6357, 0x6340, 0x6348, 0x654A, -0x6546, 0x65C6, 0x65C3, 0x65C4, -0x65C2, 0x664A, 0x665F, 0x6647, -0x6651, 0x6712, 0x6713, 0x681F, -0x681A, 0x6849, 0x6832, 0x6833, -0x683B, 0x684B, 0x684F, 0x6816, -0x6831, 0x681C, 0x6835, 0x682B, -0x682D, 0x682F, 0x684E, 0x6844, -0x6834, 0x681D, 0x6812, 0x6814, -0x6826, 0x6828, 0x682E, 0x684D, -0x683A, 0x6825, 0x6820, 0x6B2C, -0x6B2F, 0x6B2D, 0x6B31, 0x6B34, -0x6B6D, 0x8082, 0x6B88, 0x6BE6, -0x6BE4, 0x6BE8, 0x6BE3, 0x6BE2, -0x6BE7, 0x6C25, 0x6D7A, 0x6D63, -0x6D64, 0x6D76, 0x6D0D, 0x6D61, -0x6D92, 0x6D58, 0x6D62, 0x6D6D, -0x6D6F, 0x6D91, 0x6D8D, 0x6DEF, -0x6D7F, 0x6D86, 0x6D5E, 0x6D67, -0x6D60, 0x6D97, 0x6D70, 0x6D7C, -0x6D5F, 0x6D82, 0x6D98, 0x6D2F, -0x6D68, 0x6D8B, 0x6D7E, 0x6D80, -0x6D84, 0x6D16, 0x6D83, 0x6D7B, -0x6D7D, 0x6D75, 0x6D90, 0x70DC, -0x70D3, 0x70D1, 0x70DD, 0x70CB, -0x7F39, 0x70E2, 0x70D7, 0x70D2, -0x70DE, 0x70E0, 0x70D4, 0x70CD, -0x70C5, 0x70C6, 0x70C7, 0x70DA, -0x70CE, 0x70E1, 0x7242, 0x7278, -0x7277, 0x7276, 0x7300, 0x72FA, -0x72F4, 0x72FE, 0x72F6, 0x72F3, -0x72FB, 0x7301, 0x73D3, 0x73D9, -0x73E5, 0x73D6, 0x73BC, 0x73E7, -0x73E3, 0x73E9, 0x73DC, 0x73D2, -0x73DB, 0x73D4, 0x73DD, 0x73DA, -0x73D7, 0x73D8, 0x73E8, 0x74DE, -0x74DF, 0x74F4, 0x74F5, 0x7521, -0x755B, 0x755F, 0x75B0, 0x75C1, -0x75BB, 0x75C4, 0x75C0, 0x75BF, -0x75B6, 0x75BA, 0x768A, 0x76C9, -0x771D, 0x771B, 0x7710, 0x7713, -0x7712, 0x7723, 0x7711, 0x7715, -0x7719, 0x771A, 0x7722, 0x7727, -0x7823, 0x782C, 0x7822, 0x7835, -0x782F, 0x7828, 0x782E, 0x782B, -0x7821, 0x7829, 0x7833, 0x782A, -0x7831, 0x7954, 0x795B, 0x794F, -0x795C, 0x7953, 0x7952, 0x7951, -0x79EB, 0x79EC, 0x79E0, 0x79EE, -0x79ED, 0x79EA, 0x79DC, 0x79DE, -0x79DD, 0x7A86, 0x7A89, 0x7A85, -0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, -0x7AD8, 0x7B10, 0x7B04, 0x7B13, -0x7B05, 0x7B0F, 0x7B08, 0x7B0A, -0x7B0E, 0x7B09, 0x7B12, 0x7C84, -0x7C91, 0x7C8A, 0x7C8C, 0x7C88, -0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, -0x7D11, 0x7D0E, 0x7D18, 0x7D16, -0x7D13, 0x7D1F, 0x7D12, 0x7D0F, -0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, -0x7F60, 0x7F5D, 0x7F5B, 0x7F96, -0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, -0x8016, 0x803E, 0x8039, 0x80FA, -0x80F2, 0x80F9, 0x80F5, 0x8101, -0x80FB, 0x8100, 0x8201, 0x822F, -0x8225, 0x8333, 0x832D, 0x8344, -0x8319, 0x8351, 0x8325, 0x8356, -0x833F, 0x8341, 0x8326, 0x831C, -0x8322, 0x8342, 0x834E, 0x831B, -0x832A, 0x8308, 0x833C, 0x834D, -0x8316, 0x8324, 0x8320, 0x8337, -0x832F, 0x8329, 0x8347, 0x8345, -0x834C, 0x8353, 0x831E, 0x832C, -0x834B, 0x8327, 0x8348, 0x8653, -0x8652, 0x86A2, 0x86A8, 0x8696, -0x868D, 0x8691, 0x869E, 0x8687, -0x8697, 0x8686, 0x868B, 0x869A, -0x8685, 0x86A5, 0x8699, 0x86A1, -0x86A7, 0x8695, 0x8698, 0x868E, -0x869D, 0x8690, 0x8694, 0x8843, -0x8844, 0x886D, 0x8875, 0x8876, -0x8872, 0x8880, 0x8871, 0x887F, -0x886F, 0x8883, 0x887E, 0x8874, -0x887C, 0x8A12, 0x8C47, 0x8C57, -0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, -0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, -0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, -0x9002, 0x8FFF, 0x8FFB, 0x9004, -0x8FFC, 0x8FF6, 0x90D6, 0x90E0, -0x90D9, 0x90DA, 0x90E3, 0x90DF, -0x90E5, 0x90D8, 0x90DB, 0x90D7, -0x90DC, 0x90E4, 0x9150, 0x914E, -0x914F, 0x91D5, 0x91E2, 0x91DA, -0x965C, 0x965F, 0x96BC, 0x98E3, -0x9ADF, 0x9B2F, 0x4E7F, 0x5070, -0x506A, 0x5061, 0x505E, 0x5060, -0x5053, 0x504B, 0x505D, 0x5072, -0x5048, 0x504D, 0x5041, 0x505B, -0x504A, 0x5062, 0x5015, 0x5045, -0x505F, 0x5069, 0x506B, 0x5063, -0x5064, 0x5046, 0x5040, 0x506E, -0x5073, 0x5057, 0x5051, 0x51D0, -0x526B, 0x526D, 0x526C, 0x526E, -0x52D6, 0x52D3, 0x532D, 0x539C, -0x5575, 0x5576, 0x553C, 0x554D, -0x5550, 0x5534, 0x552A, 0x5551, -0x5562, 0x5536, 0x5535, 0x5530, -0x5552, 0x5545, 0x550C, 0x5532, -0x5565, 0x554E, 0x5539, 0x5548, -0x552D, 0x553B, 0x5540, 0x554B, -0x570A, 0x5707, 0x57FB, 0x5814, -0x57E2, 0x57F6, 0x57DC, 0x57F4, -0x5800, 0x57ED, 0x57FD, 0x5808, -0x57F8, 0x580B, 0x57F3, 0x57CF, -0x5807, 0x57EE, 0x57E3, 0x57F2, -0x57E5, 0x57EC, 0x57E1, 0x580E, -0x57FC, 0x5810, 0x57E7, 0x5801, -0x580C, 0x57F1, 0x57E9, 0x57F0, -0x580D, 0x5804, 0x595C, 0x5A60, -0x5A58, 0x5A55, 0x5A67, 0x5A5E, -0x5A38, 0x5A35, 0x5A6D, 0x5A50, -0x5A5F, 0x5A65, 0x5A6C, 0x5A53, -0x5A64, 0x5A57, 0x5A43, 0x5A5D, -0x5A52, 0x5A44, 0x5A5B, 0x5A48, -0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, -0x5A4C, 0x5A70, 0x5A69, 0x5A47, -0x5A51, 0x5A56, 0x5A42, 0x5A5C, -0x5B72, 0x5B6E, 0x5BC1, 0x5BC0, -0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, -0x5D1A, 0x5D20, 0x5D0C, 0x5D28, -0x5D0D, 0x5D26, 0x5D25, 0x5D0F, -0x5D30, 0x5D12, 0x5D23, 0x5D1F, -0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, -0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, -0x5F36, 0x5F38, 0x5F9B, 0x5F96, -0x5F9F, 0x608A, 0x6090, 0x6086, -0x60BE, 0x60B0, 0x60BA, 0x60D3, -0x60D4, 0x60CF, 0x60E4, 0x60D9, -0x60DD, 0x60C8, 0x60B1, 0x60DB, -0x60B7, 0x60CA, 0x60BF, 0x60C3, -0x60CD, 0x60C0, 0x6332, 0x6365, -0x638A, 0x6382, 0x637D, 0x63BD, -0x639E, 0x63AD, 0x639D, 0x6397, -0x63AB, 0x638E, 0x636F, 0x6387, -0x6390, 0x636E, 0x63AF, 0x6375, -0x639C, 0x636D, 0x63AE, 0x637C, -0x63A4, 0x633B, 0x639F, 0x6378, -0x6385, 0x6381, 0x6391, 0x638D, -0x6370, 0x6553, 0x65CD, 0x6665, -0x6661, 0x665B, 0x6659, 0x665C, -0x6662, 0x6718, 0x6879, 0x6887, -0x6890, 0x689C, 0x686D, 0x686E, -0x68AE, 0x68AB, 0x6956, 0x686F, -0x68A3, 0x68AC, 0x68A9, 0x6875, -0x6874, 0x68B2, 0x688F, 0x6877, -0x6892, 0x687C, 0x686B, 0x6872, -0x68AA, 0x6880, 0x6871, 0x687E, -0x689B, 0x6896, 0x688B, 0x68A0, -0x6889, 0x68A4, 0x6878, 0x687B, -0x6891, 0x688C, 0x688A, 0x687D, -0x6B36, 0x6B33, 0x6B37, 0x6B38, -0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, -0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, -0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, -0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, -0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, -0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, -0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, -0x6DCA, 0x6DBD, 0x6DED, 0x6DF0, -0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, -0x6DC9, 0x6DD0, 0x6DF2, 0x6DD3, -0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, -0x6DBB, 0x70FA, 0x710D, 0x70F7, -0x7117, 0x70F4, 0x710C, 0x70F0, -0x7104, 0x70F3, 0x7110, 0x70FC, -0x70FF, 0x7106, 0x7113, 0x7100, -0x70F8, 0x70F6, 0x710B, 0x7102, -0x710E, 0x727E, 0x727B, 0x727C, -0x727F, 0x731D, 0x7317, 0x7307, -0x7311, 0x7318, 0x730A, 0x7308, -0x72FF, 0x730F, 0x731E, 0x7388, -0x73F6, 0x73F8, 0x73F5, 0x7404, -0x7401, 0x73FD, 0x7407, 0x7400, -0x73FA, 0x73FC, 0x73FF, 0x740C, -0x740B, 0x73F4, 0x7408, 0x7564, -0x7563, 0x75CE, 0x75D2, 0x75CF, -0x75CB, 0x75CC, 0x75D1, 0x75D0, -0x768F, 0x7689, 0x76D3, 0x7739, -0x772F, 0x772D, 0x7731, 0x7732, -0x7734, 0x7733, 0x773D, 0x7725, -0x773B, 0x7735, 0x7848, 0x7852, -0x7849, 0x784D, 0x784A, 0x784C, -0x7826, 0x7845, 0x7850, 0x7964, -0x7967, 0x7969, 0x796A, 0x7963, -0x796B, 0x7961, 0x79BB, 0x79FA, -0x79F8, 0x79F6, 0x79F7, 0x7A8F, -0x7A94, 0x7A90, 0x7B35, 0x7B47, -0x7B34, 0x7B25, 0x7B30, 0x7B22, -0x7B24, 0x7B33, 0x7B18, 0x7B2A, -0x7B1D, 0x7B31, 0x7B2B, 0x7B2D, -0x7B2F, 0x7B32, 0x7B38, 0x7B1A, -0x7B23, 0x7C94, 0x7C98, 0x7C96, -0x7CA3, 0x7D35, 0x7D3D, 0x7D38, -0x7D36, 0x7D3A, 0x7D45, 0x7D2C, -0x7D29, 0x7D41, 0x7D47, 0x7D3E, -0x7D3F, 0x7D4A, 0x7D3B, 0x7D28, -0x7F63, 0x7F95, 0x7F9C, 0x7F9D, -0x7F9B, 0x7FCA, 0x7FCB, 0x7FCD, -0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, -0x7FC9, 0x801F, 0x801E, 0x801B, -0x8047, 0x8043, 0x8048, 0x8118, -0x8125, 0x8119, 0x811B, 0x812D, -0x811F, 0x812C, 0x811E, 0x8121, -0x8115, 0x8127, 0x811D, 0x8122, -0x8211, 0x8238, 0x8233, 0x823A, -0x8234, 0x8232, 0x8274, 0x8390, -0x83A3, 0x83A8, 0x838D, 0x837A, -0x8373, 0x83A4, 0x8374, 0x838F, -0x8381, 0x8395, 0x8399, 0x8375, -0x8394, 0x83A9, 0x837D, 0x8383, -0x838C, 0x839D, 0x839B, 0x83AA, -0x838B, 0x837E, 0x83A5, 0x83AF, -0x8388, 0x8397, 0x83B0, 0x837F, -0x83A6, 0x8387, 0x83AE, 0x8376, -0x839A, 0x8659, 0x8656, 0x86BF, -0x86B7, 0x86C2, 0x86C1, 0x86C5, -0x86BA, 0x86B0, 0x86C8, 0x86B9, -0x86B3, 0x86B8, 0x86CC, 0x86B4, -0x86BB, 0x86BC, 0x86C3, 0x86BD, -0x86BE, 0x8852, 0x8889, 0x8895, -0x88A8, 0x88A2, 0x88AA, 0x889A, -0x8891, 0x88A1, 0x889F, 0x8898, -0x88A7, 0x8899, 0x889B, 0x8897, -0x88A4, 0x88AC, 0x888C, 0x8893, -0x888E, 0x8982, 0x89D6, 0x89D9, -0x89D5, 0x8A30, 0x8A27, 0x8A2C, -0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, -0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, -0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, -0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, -0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, -0x8EE0, 0x8EE1, 0x9024, 0x900B, -0x9011, 0x901C, 0x900C, 0x9021, -0x90EF, 0x90EA, 0x90F0, 0x90F4, -0x90F2, 0x90F3, 0x90D4, 0x90EB, -0x90EC, 0x90E9, 0x9156, 0x9158, -0x915A, 0x9153, 0x9155, 0x91EC, -0x91F4, 0x91F1, 0x91F3, 0x91F8, -0x91E4, 0x91F9, 0x91EA, 0x91EB, -0x91F7, 0x91E8, 0x91EE, 0x957A, -0x9586, 0x9588, 0x967C, 0x966D, -0x966B, 0x9671, 0x966F, 0x96BF, -0x976A, 0x9804, 0x98E5, 0x9997, -0x509B, 0x5095, 0x5094, 0x509E, -0x508B, 0x50A3, 0x5083, 0x508C, -0x508E, 0x509D, 0x5068, 0x509C, -0x5092, 0x5082, 0x5087, 0x515F, -0x51D4, 0x5312, 0x5311, 0x53A4, -0x53A7, 0x5591, 0x55A8, 0x55A5, -0x55AD, 0x5577, 0x5645, 0x55A2, -0x5593, 0x5588, 0x558F, 0x55B5, -0x5581, 0x55A3, 0x5592, 0x55A4, -0x557D, 0x558C, 0x55A6, 0x557F, -0x5595, 0x55A1, 0x558E, 0x570C, -0x5829, 0x5837, 0x5819, 0x581E, -0x5827, 0x5823, 0x5828, 0x57F5, -0x5848, 0x5825, 0x581C, 0x581B, -0x5833, 0x583F, 0x5836, 0x582E, -0x5839, 0x5838, 0x582D, 0x582C, -0x583B, 0x5961, 0x5AAF, 0x5A94, -0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, -0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, -0x5AAC, 0x5A95, 0x5AAE, 0x5A37, -0x5A84, 0x5A8A, 0x5A97, 0x5A83, -0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, -0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, -0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, -0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, -0x5C0C, 0x5C30, 0x5D37, 0x5D43, -0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, -0x5D35, 0x5D51, 0x5D4E, 0x5D55, -0x5D33, 0x5D3A, 0x5D52, 0x5D3D, -0x5D31, 0x5D59, 0x5D42, 0x5D39, -0x5D49, 0x5D38, 0x5D3C, 0x5D32, -0x5D36, 0x5D40, 0x5D45, 0x5E44, -0x5E41, 0x5F58, 0x5FA6, 0x5FA5, -0x5FAB, 0x60C9, 0x60B9, 0x60CC, -0x60E2, 0x60CE, 0x60C4, 0x6114, -0x60F2, 0x610A, 0x6116, 0x6105, -0x60F5, 0x6113, 0x60F8, 0x60FC, -0x60FE, 0x60C1, 0x6103, 0x6118, -0x611D, 0x6110, 0x60FF, 0x6104, -0x610B, 0x624A, 0x6394, 0x63B1, -0x63B0, 0x63CE, 0x63E5, 0x63E8, -0x63EF, 0x63C3, 0x649D, 0x63F3, -0x63CA, 0x63E0, 0x63F6, 0x63D5, -0x63F2, 0x63F5, 0x6461, 0x63DF, -0x63BE, 0x63DD, 0x63DC, 0x63C4, -0x63D8, 0x63D3, 0x63C2, 0x63C7, -0x63CC, 0x63CB, 0x63C8, 0x63F0, -0x63D7, 0x63D9, 0x6532, 0x6567, -0x656A, 0x6564, 0x655C, 0x6568, -0x6565, 0x658C, 0x659D, 0x659E, -0x65AE, 0x65D0, 0x65D2, 0x667C, -0x666C, 0x667B, 0x6680, 0x6671, -0x6679, 0x666A, 0x6672, 0x6701, -0x690C, 0x68D3, 0x6904, 0x68DC, -0x692A, 0x68EC, 0x68EA, 0x68F1, -0x690F, 0x68D6, 0x68F7, 0x68EB, -0x68E4, 0x68F6, 0x6913, 0x6910, -0x68F3, 0x68E1, 0x6907, 0x68CC, -0x6908, 0x6970, 0x68B4, 0x6911, -0x68EF, 0x68C6, 0x6914, 0x68F8, -0x68D0, 0x68FD, 0x68FC, 0x68E8, -0x690B, 0x690A, 0x6917, 0x68CE, -0x68C8, 0x68DD, 0x68DE, 0x68E6, -0x68F4, 0x68D1, 0x6906, 0x68D4, -0x68E9, 0x6915, 0x6925, 0x68C7, -0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, -0x6B94, 0x6B97, 0x6B99, 0x6B95, -0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, -0x6C30, 0x6DFC, 0x6E46, 0x6E47, -0x6E1F, 0x6E49, 0x6E88, 0x6E3C, -0x6E3D, 0x6E45, 0x6E62, 0x6E2B, -0x6E3F, 0x6E41, 0x6E5D, 0x6E73, -0x6E1C, 0x6E33, 0x6E4B, 0x6E40, -0x6E51, 0x6E3B, 0x6E03, 0x6E2E, -0x6E5E, 0x6E68, 0x6E5C, 0x6E61, -0x6E31, 0x6E28, 0x6E60, 0x6E71, -0x6E6B, 0x6E39, 0x6E22, 0x6E30, -0x6E53, 0x6E65, 0x6E27, 0x6E78, -0x6E64, 0x6E77, 0x6E55, 0x6E79, -0x6E52, 0x6E66, 0x6E35, 0x6E36, -0x6E5A, 0x7120, 0x711E, 0x712F, -0x70FB, 0x712E, 0x7131, 0x7123, -0x7125, 0x7122, 0x7132, 0x711F, -0x7128, 0x713A, 0x711B, 0x724B, -0x725A, 0x7288, 0x7289, 0x7286, -0x7285, 0x728B, 0x7312, 0x730B, -0x7330, 0x7322, 0x7331, 0x7333, -0x7327, 0x7332, 0x732D, 0x7326, -0x7323, 0x7335, 0x730C, 0x742E, -0x742C, 0x7430, 0x742B, 0x7416, -0x741A, 0x7421, 0x742D, 0x7431, -0x7424, 0x7423, 0x741D, 0x7429, -0x7420, 0x7432, 0x74FB, 0x752F, -0x756F, 0x756C, 0x75E7, 0x75DA, -0x75E1, 0x75E6, 0x75DD, 0x75DF, -0x75E4, 0x75D7, 0x7695, 0x7692, -0x76DA, 0x7746, 0x7747, 0x7744, -0x774D, 0x7745, 0x774A, 0x774E, -0x774B, 0x774C, 0x77DE, 0x77EC, -0x7860, 0x7864, 0x7865, 0x785C, -0x786D, 0x7871, 0x786A, 0x786E, -0x7870, 0x7869, 0x7868, 0x785E, -0x7862, 0x7974, 0x7973, 0x7972, -0x7970, 0x7A02, 0x7A0A, 0x7A03, -0x7A0C, 0x7A04, 0x7A99, 0x7AE6, -0x7AE4, 0x7B4A, 0x7B3B, 0x7B44, -0x7B48, 0x7B4C, 0x7B4E, 0x7B40, -0x7B58, 0x7B45, 0x7CA2, 0x7C9E, -0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, -0x7D63, 0x7D53, 0x7D56, 0x7D67, -0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, -0x7D6B, 0x7D52, 0x7D54, 0x7D69, -0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, -0x7F3F, 0x7F65, 0x7F66, 0x7FA2, -0x7FA0, 0x7FA1, 0x7FD7, 0x8051, -0x804F, 0x8050, 0x80FE, 0x80D4, -0x8143, 0x814A, 0x8152, 0x814F, -0x8147, 0x813D, 0x814D, 0x813A, -0x81E6, 0x81EE, 0x81F7, 0x81F8, -0x81F9, 0x8204, 0x823C, 0x823D, -0x823F, 0x8275, 0x833B, 0x83CF, -0x83F9, 0x8423, 0x83C0, 0x83E8, -0x8412, 0x83E7, 0x83E4, 0x83FC, -0x83F6, 0x8410, 0x83C6, 0x83C8, -0x83EB, 0x83E3, 0x83BF, 0x8401, -0x83DD, 0x83E5, 0x83D8, 0x83FF, -0x83E1, 0x83CB, 0x83CE, 0x83D6, -0x83F5, 0x83C9, 0x8409, 0x840F, -0x83DE, 0x8411, 0x8406, 0x83C2, -0x83F3, 0x83D5, 0x83FA, 0x83C7, -0x83D1, 0x83EA, 0x8413, 0x83C3, -0x83EC, 0x83EE, 0x83C4, 0x83FB, -0x83D7, 0x83E2, 0x841B, 0x83DB, -0x83FE, 0x86D8, 0x86E2, 0x86E6, -0x86D3, 0x86E3, 0x86DA, 0x86EA, -0x86DD, 0x86EB, 0x86DC, 0x86EC, -0x86E9, 0x86D7, 0x86E8, 0x86D1, -0x8848, 0x8856, 0x8855, 0x88BA, -0x88D7, 0x88B9, 0x88B8, 0x88C0, -0x88BE, 0x88B6, 0x88BC, 0x88B7, -0x88BD, 0x88B2, 0x8901, 0x88C9, -0x8995, 0x8998, 0x8997, 0x89DD, -0x89DA, 0x89DB, 0x8A4E, 0x8A4D, -0x8A39, 0x8A59, 0x8A40, 0x8A57, -0x8A58, 0x8A44, 0x8A45, 0x8A52, -0x8A48, 0x8A51, 0x8A4A, 0x8A4C, -0x8A4F, 0x8C5F, 0x8C81, 0x8C80, -0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, -0x8CB5, 0x8D84, 0x8D80, 0x8D89, -0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, -0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, -0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, -0x8EEF, 0x8EF7, 0x8EFA, 0x8EF9, -0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, -0x8EE7, 0x8EE8, 0x8EF6, 0x8EEB, -0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, -0x902D, 0x9034, 0x902F, 0x9106, -0x912C, 0x9104, 0x90FF, 0x90FC, -0x9108, 0x90F9, 0x90FB, 0x9101, -0x9100, 0x9107, 0x9105, 0x9103, -0x9161, 0x9164, 0x915F, 0x9162, -0x9160, 0x9201, 0x920A, 0x9225, -0x9203, 0x921A, 0x9226, 0x920F, -0x920C, 0x9200, 0x9212, 0x91FF, -0x91FD, 0x9206, 0x9204, 0x9227, -0x9202, 0x921C, 0x9224, 0x9219, -0x9217, 0x9205, 0x9216, 0x957B, -0x958D, 0x958C, 0x9590, 0x9687, -0x967E, 0x9688, 0x9689, 0x9683, -0x9680, 0x96C2, 0x96C8, 0x96C3, -0x96F1, 0x96F0, 0x976C, 0x9770, -0x976E, 0x9807, 0x98A9, 0x98EB, -0x9CE6, 0x9EF9, 0x4E83, 0x4E84, -0x4EB6, 0x50BD, 0x50BF, 0x50C6, -0x50AE, 0x50C4, 0x50CA, 0x50B4, -0x50C8, 0x50C2, 0x50B0, 0x50C1, -0x50BA, 0x50B1, 0x50CB, 0x50C9, -0x50B6, 0x50B8, 0x51D7, 0x527A, -0x5278, 0x527B, 0x527C, 0x55C3, -0x55DB, 0x55CC, 0x55D0, 0x55CB, -0x55CA, 0x55DD, 0x55C0, 0x55D4, -0x55C4, 0x55E9, 0x55BF, 0x55D2, -0x558D, 0x55CF, 0x55D5, 0x55E2, -0x55D6, 0x55C8, 0x55F2, 0x55CD, -0x55D9, 0x55C2, 0x5714, 0x5853, -0x5868, 0x5864, 0x584F, 0x584D, -0x5849, 0x586F, 0x5855, 0x584E, -0x585D, 0x5859, 0x5865, 0x585B, -0x583D, 0x5863, 0x5871, 0x58FC, -0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, -0x5AB8, 0x5AB1, 0x5AB5, 0x5AB0, -0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, -0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, -0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, -0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, -0x5C33, 0x5D71, 0x5D63, 0x5D4A, -0x5D65, 0x5D72, 0x5D6C, 0x5D5E, -0x5D68, 0x5D67, 0x5D62, 0x5DF0, -0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, -0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, -0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, -0x5FAD, 0x60F7, 0x6149, 0x614A, -0x612B, 0x6145, 0x6136, 0x6132, -0x612E, 0x6146, 0x612F, 0x614F, -0x6129, 0x6140, 0x6220, 0x9168, -0x6223, 0x6225, 0x6224, 0x63C5, -0x63F1, 0x63EB, 0x6410, 0x6412, -0x6409, 0x6420, 0x6424, 0x6433, -0x6443, 0x641F, 0x6415, 0x6418, -0x6439, 0x6437, 0x6422, 0x6423, -0x640C, 0x6426, 0x6430, 0x6428, -0x6441, 0x6435, 0x642F, 0x640A, -0x641A, 0x6440, 0x6425, 0x6427, -0x640B, 0x63E7, 0x641B, 0x642E, -0x6421, 0x640E, 0x656F, 0x6592, -0x65D3, 0x6686, 0x668C, 0x6695, -0x6690, 0x668B, 0x668A, 0x6699, -0x6694, 0x6678, 0x6720, 0x6966, -0x695F, 0x6938, 0x694E, 0x6962, -0x6971, 0x693F, 0x6945, 0x696A, -0x6939, 0x6942, 0x6957, 0x6959, -0x697A, 0x6948, 0x6949, 0x6935, -0x696C, 0x6933, 0x693D, 0x6965, -0x68F0, 0x6978, 0x6934, 0x6969, -0x6940, 0x696F, 0x6944, 0x6976, -0x6958, 0x6941, 0x6974, 0x694C, -0x693B, 0x694B, 0x6937, 0x695C, -0x694F, 0x6951, 0x6932, 0x6952, -0x692F, 0x697B, 0x693C, 0x6B46, -0x6B45, 0x6B43, 0x6B42, 0x6B48, -0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, -0x6BFC, 0x6BF9, 0x6BF7, 0x6BF8, -0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, -0x6EC0, 0x6E9F, 0x6E93, 0x6E94, -0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, -0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, -0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, -0x6EA6, 0x6ECF, 0x6EB2, 0x6EBE, -0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, -0x6E92, 0x6E8E, 0x6E8D, 0x6EA4, -0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, -0x6ECA, 0x6E97, 0x6EAE, 0x6EA3, -0x7147, 0x7154, 0x7152, 0x7163, -0x7160, 0x7141, 0x715D, 0x7162, -0x7172, 0x7178, 0x716A, 0x7161, -0x7142, 0x7158, 0x7143, 0x714B, -0x7170, 0x715F, 0x7150, 0x7153, -0x7144, 0x714D, 0x715A, 0x724F, -0x728D, 0x728C, 0x7291, 0x7290, -0x728E, 0x733C, 0x7342, 0x733B, -0x733A, 0x7340, 0x734A, 0x7349, -0x7444, 0x744A, 0x744B, 0x7452, -0x7451, 0x7457, 0x7440, 0x744F, -0x7450, 0x744E, 0x7442, 0x7446, -0x744D, 0x7454, 0x74E1, 0x74FF, -0x74FE, 0x74FD, 0x751D, 0x7579, -0x7577, 0x6983, 0x75EF, 0x760F, -0x7603, 0x75F7, 0x75FE, 0x75FC, -0x75F9, 0x75F8, 0x7610, 0x75FB, -0x75F6, 0x75ED, 0x75F5, 0x75FD, -0x7699, 0x76B5, 0x76DD, 0x7755, -0x775F, 0x7760, 0x7752, 0x7756, -0x775A, 0x7769, 0x7767, 0x7754, -0x7759, 0x776D, 0x77E0, 0x7887, -0x789A, 0x7894, 0x788F, 0x7884, -0x7895, 0x7885, 0x7886, 0x78A1, -0x7883, 0x7879, 0x7899, 0x7880, -0x7896, 0x787B, 0x797C, 0x7982, -0x797D, 0x7979, 0x7A11, 0x7A18, -0x7A19, 0x7A12, 0x7A17, 0x7A15, -0x7A22, 0x7A13, 0x7A1B, 0x7A10, -0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, -0x7B66, 0x7B64, 0x7B6D, 0x7B74, -0x7B69, 0x7B72, 0x7B65, 0x7B73, -0x7B71, 0x7B70, 0x7B61, 0x7B78, -0x7B76, 0x7B63, 0x7CB2, 0x7CB4, -0x7CAF, 0x7D88, 0x7D86, 0x7D80, -0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, -0x7D8E, 0x7D7B, 0x7D83, 0x7D7C, -0x7D8C, 0x7D94, 0x7D84, 0x7D7D, -0x7D92, 0x7F6D, 0x7F6B, 0x7F67, -0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, -0x7FA7, 0x7FDB, 0x7FDC, 0x8021, -0x8164, 0x8160, 0x8177, 0x815C, -0x8169, 0x815B, 0x8162, 0x8172, -0x6721, 0x815E, 0x8176, 0x8167, -0x816F, 0x8144, 0x8161, 0x821D, -0x8249, 0x8244, 0x8240, 0x8242, -0x8245, 0x84F1, 0x843F, 0x8456, -0x8476, 0x8479, 0x848F, 0x848D, -0x8465, 0x8451, 0x8440, 0x8486, -0x8467, 0x8430, 0x844D, 0x847D, -0x845A, 0x8459, 0x8474, 0x8473, -0x845D, 0x8507, 0x845E, 0x8437, -0x843A, 0x8434, 0x847A, 0x8443, -0x8478, 0x8432, 0x8445, 0x8429, -0x83D9, 0x844B, 0x842F, 0x8442, -0x842D, 0x845F, 0x8470, 0x8439, -0x844E, 0x844C, 0x8452, 0x846F, -0x84C5, 0x848E, 0x843B, 0x8447, -0x8436, 0x8433, 0x8468, 0x847E, -0x8444, 0x842B, 0x8460, 0x8454, -0x846E, 0x8450, 0x870B, 0x8704, -0x86F7, 0x870C, 0x86FA, 0x86D6, -0x86F5, 0x874D, 0x86F8, 0x870E, -0x8709, 0x8701, 0x86F6, 0x870D, -0x8705, 0x88D6, 0x88CB, 0x88CD, -0x88CE, 0x88DE, 0x88DB, 0x88DA, -0x88CC, 0x88D0, 0x8985, 0x899B, -0x89DF, 0x89E5, 0x89E4, 0x89E1, -0x89E0, 0x89E2, 0x89DC, 0x89E6, -0x8A76, 0x8A86, 0x8A7F, 0x8A61, -0x8A3F, 0x8A77, 0x8A82, 0x8A84, -0x8A75, 0x8A83, 0x8A81, 0x8A74, -0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, -0x8C65, 0x8C64, 0x8C66, 0x8C86, -0x8C84, 0x8C85, 0x8CCC, 0x8D68, -0x8D69, 0x8D91, 0x8D8C, 0x8D8E, -0x8D8F, 0x8D8D, 0x8D93, 0x8D94, -0x8D90, 0x8D92, 0x8DF0, 0x8DE0, -0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, -0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, -0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, -0x8EFF, 0x8F01, 0x8F00, 0x8F05, -0x8F07, 0x8F08, 0x8F02, 0x8F0B, -0x9052, 0x903F, 0x9044, 0x9049, -0x903D, 0x9110, 0x910D, 0x910F, -0x9111, 0x9116, 0x9114, 0x910B, -0x910E, 0x916E, 0x916F, 0x9248, -0x9252, 0x9230, 0x923A, 0x9266, -0x9233, 0x9265, 0x925E, 0x9283, -0x922E, 0x924A, 0x9246, 0x926D, -0x926C, 0x924F, 0x9260, 0x9267, -0x926F, 0x9236, 0x9261, 0x9270, -0x9231, 0x9254, 0x9263, 0x9250, -0x9272, 0x924E, 0x9253, 0x924C, -0x9256, 0x9232, 0x959F, 0x959C, -0x959E, 0x959B, 0x9692, 0x9693, -0x9691, 0x9697, 0x96CE, 0x96FA, -0x96FD, 0x96F8, 0x96F5, 0x9773, -0x9777, 0x9778, 0x9772, 0x980F, -0x980D, 0x980E, 0x98AC, 0x98F6, -0x98F9, 0x99AF, 0x99B2, 0x99B0, -0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, -0x9CEA, 0x9CED, 0x9CE7, 0x9E80, -0x9EFD, 0x50E6, 0x50D4, 0x50D7, -0x50E8, 0x50F3, 0x50DB, 0x50EA, -0x50DD, 0x50E4, 0x50D3, 0x50EC, -0x50F0, 0x50EF, 0x50E3, 0x50E0, -0x51D8, 0x5280, 0x5281, 0x52E9, -0x52EB, 0x5330, 0x53AC, 0x5627, -0x5615, 0x560C, 0x5612, 0x55FC, -0x560F, 0x561C, 0x5601, 0x5613, -0x5602, 0x55FA, 0x561D, 0x5604, -0x55FF, 0x55F9, 0x5889, 0x587C, -0x5890, 0x5898, 0x5886, 0x5881, -0x587F, 0x5874, 0x588B, 0x587A, -0x5887, 0x5891, 0x588E, 0x5876, -0x5882, 0x5888, 0x587B, 0x5894, -0x588F, 0x58FE, 0x596B, 0x5ADC, -0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, -0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, -0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, -0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, -0x5ADF, 0x5B77, 0x5BE0, 0x5BE3, -0x5C63, 0x5D82, 0x5D80, 0x5D7D, -0x5D86, 0x5D7A, 0x5D81, 0x5D77, -0x5D8A, 0x5D89, 0x5D88, 0x5D7E, -0x5D7C, 0x5D8D, 0x5D79, 0x5D7F, -0x5E58, 0x5E59, 0x5E53, 0x5ED8, -0x5ED1, 0x5ED7, 0x5ECE, 0x5EDC, -0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, -0x5F44, 0x5F43, 0x5F6F, 0x5FB6, -0x612C, 0x6128, 0x6141, 0x615E, -0x6171, 0x6173, 0x6152, 0x6153, -0x6172, 0x616C, 0x6180, 0x6174, -0x6154, 0x617A, 0x615B, 0x6165, -0x613B, 0x616A, 0x6161, 0x6156, -0x6229, 0x6227, 0x622B, 0x642B, -0x644D, 0x645B, 0x645D, 0x6474, -0x6476, 0x6472, 0x6473, 0x647D, -0x6475, 0x6466, 0x64A6, 0x644E, -0x6482, 0x645E, 0x645C, 0x644B, -0x6453, 0x6460, 0x6450, 0x647F, -0x643F, 0x646C, 0x646B, 0x6459, -0x6465, 0x6477, 0x6573, 0x65A0, -0x66A1, 0x66A0, 0x669F, 0x6705, -0x6704, 0x6722, 0x69B1, 0x69B6, -0x69C9, 0x69A0, 0x69CE, 0x6996, -0x69B0, 0x69AC, 0x69BC, 0x6991, -0x6999, 0x698E, 0x69A7, 0x698D, -0x69A9, 0x69BE, 0x69AF, 0x69BF, -0x69C4, 0x69BD, 0x69A4, 0x69D4, -0x69B9, 0x69CA, 0x699A, 0x69CF, -0x69B3, 0x6993, 0x69AA, 0x69A1, -0x699E, 0x69D9, 0x6997, 0x6990, -0x69C2, 0x69B5, 0x69A5, 0x69C6, -0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, -0x6B9F, 0x6BA0, 0x6BC3, 0x6BC4, -0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, -0x6F03, 0x6F25, 0x6EF8, 0x6F37, -0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, -0x6F19, 0x6F1A, 0x6F27, 0x6F18, -0x6F3B, 0x6F12, 0x6EED, 0x6F0A, -0x6F36, 0x6F73, 0x6EF9, 0x6EEE, -0x6F2D, 0x6F40, 0x6F30, 0x6F3C, -0x6F35, 0x6EEB, 0x6F07, 0x6F0E, -0x6F43, 0x6F05, 0x6EFD, 0x6EF6, -0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, -0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, -0x6F21, 0x7187, 0x7190, 0x7189, -0x7180, 0x7185, 0x7182, 0x718F, -0x717B, 0x7186, 0x7181, 0x7197, -0x7244, 0x7253, 0x7297, 0x7295, -0x7293, 0x7343, 0x734D, 0x7351, -0x734C, 0x7462, 0x7473, 0x7471, -0x7475, 0x7472, 0x7467, 0x746E, -0x7500, 0x7502, 0x7503, 0x757D, -0x7590, 0x7616, 0x7608, 0x760C, -0x7615, 0x7611, 0x760A, 0x7614, -0x76B8, 0x7781, 0x777C, 0x7785, -0x7782, 0x776E, 0x7780, 0x776F, -0x777E, 0x7783, 0x78B2, 0x78AA, -0x78B4, 0x78AD, 0x78A8, 0x787E, -0x78AB, 0x789E, 0x78A5, 0x78A0, -0x78AC, 0x78A2, 0x78A4, 0x7998, -0x798A, 0x798B, 0x7996, 0x7995, -0x7994, 0x7993, 0x7997, 0x7988, -0x7992, 0x7990, 0x7A2B, 0x7A4A, -0x7A30, 0x7A2F, 0x7A28, 0x7A26, -0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, -0x7B88, 0x7B9C, 0x7B8A, 0x7B91, -0x7B90, 0x7B96, 0x7B8D, 0x7B8C, -0x7B9B, 0x7B8E, 0x7B85, 0x7B98, -0x5284, 0x7B99, 0x7BA4, 0x7B82, -0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, -0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, -0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, -0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, -0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, -0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, -0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, -0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, -0x7FDE, 0x8024, 0x805D, 0x805C, -0x8189, 0x8186, 0x8183, 0x8187, -0x818D, 0x818C, 0x818B, 0x8215, -0x8497, 0x84A4, 0x84A1, 0x849F, -0x84BA, 0x84CE, 0x84C2, 0x84AC, -0x84AE, 0x84AB, 0x84B9, 0x84B4, -0x84C1, 0x84CD, 0x84AA, 0x849A, -0x84B1, 0x84D0, 0x849D, 0x84A7, -0x84BB, 0x84A2, 0x8494, 0x84C7, -0x84CC, 0x849B, 0x84A9, 0x84AF, -0x84A8, 0x84D6, 0x8498, 0x84B6, -0x84CF, 0x84A0, 0x84D7, 0x84D4, -0x84D2, 0x84DB, 0x84B0, 0x8491, -0x8661, 0x8733, 0x8723, 0x8728, -0x876B, 0x8740, 0x872E, 0x871E, -0x8721, 0x8719, 0x871B, 0x8743, -0x872C, 0x8741, 0x873E, 0x8746, -0x8720, 0x8732, 0x872A, 0x872D, -0x873C, 0x8712, 0x873A, 0x8731, -0x8735, 0x8742, 0x8726, 0x8727, -0x8738, 0x8724, 0x871A, 0x8730, -0x8711, 0x88F7, 0x88E7, 0x88F1, -0x88F2, 0x88FA, 0x88FE, 0x88EE, -0x88FC, 0x88F6, 0x88FB, 0x88F0, -0x88EC, 0x88EB, 0x899D, 0x89A1, -0x899F, 0x899E, 0x89E9, 0x89EB, -0x89E8, 0x8AAB, 0x8A99, 0x8A8B, -0x8A92, 0x8A8F, 0x8A96, 0x8C3D, -0x8C68, 0x8C69, 0x8CD5, 0x8CCF, -0x8CD7, 0x8D96, 0x8E09, 0x8E02, -0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, -0x8E03, 0x8E07, 0x8E06, 0x8E05, -0x8DFE, 0x8E00, 0x8E04, 0x8F10, -0x8F11, 0x8F0E, 0x8F0D, 0x9123, -0x911C, 0x9120, 0x9122, 0x911F, -0x911D, 0x911A, 0x9124, 0x9121, -0x911B, 0x917A, 0x9172, 0x9179, -0x9173, 0x92A5, 0x92A4, 0x9276, -0x929B, 0x927A, 0x92A0, 0x9294, -0x92AA, 0x928D, 0x92A6, 0x929A, -0x92AB, 0x9279, 0x9297, 0x927F, -0x92A3, 0x92EE, 0x928E, 0x9282, -0x9295, 0x92A2, 0x927D, 0x9288, -0x92A1, 0x928A, 0x9286, 0x928C, -0x9299, 0x92A7, 0x927E, 0x9287, -0x92A9, 0x929D, 0x928B, 0x922D, -0x969E, 0x96A1, 0x96FF, 0x9758, -0x977D, 0x977A, 0x977E, 0x9783, -0x9780, 0x9782, 0x977B, 0x9784, -0x9781, 0x977F, 0x97CE, 0x97CD, -0x9816, 0x98AD, 0x98AE, 0x9902, -0x9900, 0x9907, 0x999D, 0x999C, -0x99C3, 0x99B9, 0x99BB, 0x99BA, -0x99C2, 0x99BD, 0x99C7, 0x9AB1, -0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, -0x9B60, 0x9B61, 0x9B5F, 0x9CF1, -0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, -0x5103, 0x5130, 0x50F8, 0x5106, -0x5107, 0x50F6, 0x50FE, 0x510B, -0x510C, 0x50FD, 0x510A, 0x528B, -0x528C, 0x52F1, 0x52EF, 0x5648, -0x5642, 0x564C, 0x5635, 0x5641, -0x564A, 0x5649, 0x5646, 0x5658, -0x565A, 0x5640, 0x5633, 0x563D, -0x562C, 0x563E, 0x5638, 0x562A, -0x563A, 0x571A, 0x58AB, 0x589D, -0x58B1, 0x58A0, 0x58A3, 0x58AF, -0x58AC, 0x58A5, 0x58A1, 0x58FF, -0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, -0x5AF6, 0x5B03, 0x5AF8, 0x5B02, -0x5AF9, 0x5B01, 0x5B07, 0x5B05, -0x5B0F, 0x5C67, 0x5D99, 0x5D97, -0x5D9F, 0x5D92, 0x5DA2, 0x5D93, -0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, -0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, -0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, -0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, -0x618B, 0x6183, 0x6179, 0x61B1, -0x61B0, 0x61A2, 0x6189, 0x619B, -0x6193, 0x61AF, 0x61AD, 0x619F, -0x6192, 0x61AA, 0x61A1, 0x618D, -0x6166, 0x61B3, 0x622D, 0x646E, -0x6470, 0x6496, 0x64A0, 0x6485, -0x6497, 0x649C, 0x648F, 0x648B, -0x648A, 0x648C, 0x64A3, 0x649F, -0x6468, 0x64B1, 0x6498, 0x6576, -0x657A, 0x6579, 0x657B, 0x65B2, -0x65B3, 0x66B5, 0x66B0, 0x66A9, -0x66B2, 0x66B7, 0x66AA, 0x66AF, -0x6A00, 0x6A06, 0x6A17, 0x69E5, -0x69F8, 0x6A15, 0x69F1, 0x69E4, -0x6A20, 0x69FF, 0x69EC, 0x69E2, -0x6A1B, 0x6A1D, 0x69FE, 0x6A27, -0x69F2, 0x69EE, 0x6A14, 0x69F7, -0x69E7, 0x6A40, 0x6A08, 0x69E6, -0x69FB, 0x6A0D, 0x69FC, 0x69EB, -0x6A09, 0x6A04, 0x6A18, 0x6A25, -0x6A0F, 0x69F6, 0x6A26, 0x6A07, -0x69F4, 0x6A16, 0x6B51, 0x6BA5, -0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, -0x6C00, 0x6BFF, 0x6C02, 0x6F41, -0x6F26, 0x6F7E, 0x6F87, 0x6FC6, -0x6F92, 0x6F8D, 0x6F89, 0x6F8C, -0x6F62, 0x6F4F, 0x6F85, 0x6F5A, -0x6F96, 0x6F76, 0x6F6C, 0x6F82, -0x6F55, 0x6F72, 0x6F52, 0x6F50, -0x6F57, 0x6F94, 0x6F93, 0x6F5D, -0x6F00, 0x6F61, 0x6F6B, 0x6F7D, -0x6F67, 0x6F90, 0x6F53, 0x6F8B, -0x6F69, 0x6F7F, 0x6F95, 0x6F63, -0x6F77, 0x6F6A, 0x6F7B, 0x71B2, -0x71AF, 0x719B, 0x71B0, 0x71A0, -0x719A, 0x71A9, 0x71B5, 0x719D, -0x71A5, 0x719E, 0x71A4, 0x71A1, -0x71AA, 0x719C, 0x71A7, 0x71B3, -0x7298, 0x729A, 0x7358, 0x7352, -0x735E, 0x735F, 0x7360, 0x735D, -0x735B, 0x7361, 0x735A, 0x7359, -0x7362, 0x7487, 0x7489, 0x748A, -0x7486, 0x7481, 0x747D, 0x7485, -0x7488, 0x747C, 0x7479, 0x7508, -0x7507, 0x757E, 0x7625, 0x761E, -0x7619, 0x761D, 0x761C, 0x7623, -0x761A, 0x7628, 0x761B, 0x769C, -0x769D, 0x769E, 0x769B, 0x778D, -0x778F, 0x7789, 0x7788, 0x78CD, -0x78BB, 0x78CF, 0x78CC, 0x78D1, -0x78CE, 0x78D4, 0x78C8, 0x78C3, -0x78C4, 0x78C9, 0x799A, 0x79A1, -0x79A0, 0x799C, 0x79A2, 0x799B, -0x6B76, 0x7A39, 0x7AB2, 0x7AB4, -0x7AB3, 0x7BB7, 0x7BCB, 0x7BBE, -0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, -0x7BCA, 0x7BB5, 0x7CC5, 0x7CC8, -0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, -0x7DEA, 0x7DE7, 0x7DD7, 0x7DE1, -0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, -0x7DF1, 0x7DF0, 0x7DEE, 0x7DDF, -0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, -0x7FED, 0x7FEB, 0x7FEA, 0x7FEC, -0x7FE6, 0x7FE8, 0x8064, 0x8067, -0x81A3, 0x819F, 0x819E, 0x8195, -0x81A2, 0x8199, 0x8197, 0x8216, -0x824F, 0x8253, 0x8252, 0x8250, -0x824E, 0x8251, 0x8524, 0x853B, -0x850F, 0x8500, 0x8529, 0x850E, -0x8509, 0x850D, 0x851F, 0x850A, -0x8527, 0x851C, 0x84FB, 0x852B, -0x84FA, 0x8508, 0x850C, 0x84F4, -0x852A, 0x84F2, 0x8515, 0x84F7, -0x84EB, 0x84F3, 0x84FC, 0x8512, -0x84EA, 0x84E9, 0x8516, 0x84FE, -0x8528, 0x851D, 0x852E, 0x8502, -0x84FD, 0x851E, 0x84F6, 0x8531, -0x8526, 0x84E7, 0x84E8, 0x84F0, -0x84EF, 0x84F9, 0x8518, 0x8520, -0x8530, 0x850B, 0x8519, 0x852F, -0x8662, 0x8756, 0x8763, 0x8764, -0x8777, 0x87E1, 0x8773, 0x8758, -0x8754, 0x875B, 0x8752, 0x8761, -0x875A, 0x8751, 0x875E, 0x876D, -0x876A, 0x8750, 0x874E, 0x875F, -0x875D, 0x876F, 0x876C, 0x877A, -0x876E, 0x875C, 0x8765, 0x874F, -0x877B, 0x8775, 0x8762, 0x8767, -0x8769, 0x885A, 0x8905, 0x890C, -0x8914, 0x890B, 0x8917, 0x8918, -0x8919, 0x8906, 0x8916, 0x8911, -0x890E, 0x8909, 0x89A2, 0x89A4, -0x89A3, 0x89ED, 0x89F0, 0x89EC, -0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, -0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, -0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, -0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, -0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, -0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, -0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, -0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, -0x8E23, 0x8E25, 0x8E24, 0x8E2E, -0x8E15, 0x8E1B, 0x8E16, 0x8E11, -0x8E19, 0x8E26, 0x8E27, 0x8E14, -0x8E12, 0x8E18, 0x8E13, 0x8E1C, -0x8E17, 0x8E1A, 0x8F2C, 0x8F24, -0x8F18, 0x8F1A, 0x8F20, 0x8F23, -0x8F16, 0x8F17, 0x9073, 0x9070, -0x906F, 0x9067, 0x906B, 0x912F, -0x912B, 0x9129, 0x912A, 0x9132, -0x9126, 0x912E, 0x9185, 0x9186, -0x918A, 0x9181, 0x9182, 0x9184, -0x9180, 0x92D0, 0x92C3, 0x92C4, -0x92C0, 0x92D9, 0x92B6, 0x92CF, -0x92F1, 0x92DF, 0x92D8, 0x92E9, -0x92D7, 0x92DD, 0x92CC, 0x92EF, -0x92C2, 0x92E8, 0x92CA, 0x92C8, -0x92CE, 0x92E6, 0x92CD, 0x92D5, -0x92C9, 0x92E0, 0x92DE, 0x92E7, -0x92D1, 0x92D3, 0x92B5, 0x92E1, -0x92C6, 0x92B4, 0x957C, 0x95AC, -0x95AB, 0x95AE, 0x95B0, 0x96A4, -0x96A2, 0x96D3, 0x9705, 0x9708, -0x9702, 0x975A, 0x978A, 0x978E, -0x9788, 0x97D0, 0x97CF, 0x981E, -0x981D, 0x9826, 0x9829, 0x9828, -0x9820, 0x981B, 0x9827, 0x98B2, -0x9908, 0x98FA, 0x9911, 0x9914, -0x9916, 0x9917, 0x9915, 0x99DC, -0x99CD, 0x99CF, 0x99D3, 0x99D4, -0x99CE, 0x99C9, 0x99D6, 0x99D8, -0x99CB, 0x99D7, 0x99CC, 0x9AB3, -0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, -0x9AF1, 0x9B46, 0x9B43, 0x9B67, -0x9B74, 0x9B71, 0x9B66, 0x9B76, -0x9B75, 0x9B70, 0x9B68, 0x9B64, -0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, -0x9CFF, 0x9CF7, 0x9D07, 0x9D00, -0x9CF9, 0x9CFB, 0x9D08, 0x9D05, -0x9D04, 0x9E83, 0x9ED3, 0x9F0F, -0x9F10, 0x511C, 0x5113, 0x5117, -0x511A, 0x5111, 0x51DE, 0x5334, -0x53E1, 0x5670, 0x5660, 0x566E, -0x5673, 0x5666, 0x5663, 0x566D, -0x5672, 0x565E, 0x5677, 0x571C, -0x571B, 0x58C8, 0x58BD, 0x58C9, -0x58BF, 0x58BA, 0x58C2, 0x58BC, -0x58C6, 0x5B17, 0x5B19, 0x5B1B, -0x5B21, 0x5B14, 0x5B13, 0x5B10, -0x5B16, 0x5B28, 0x5B1A, 0x5B20, -0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, -0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, -0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, -0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, -0x5E68, 0x5E66, 0x5E6F, 0x5EE9, -0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, -0x5F4B, 0x5FBC, 0x619D, 0x61A8, -0x6196, 0x61C5, 0x61B4, 0x61C6, -0x61C1, 0x61CC, 0x61BA, 0x61BF, -0x61B8, 0x618C, 0x64D7, 0x64D6, -0x64D0, 0x64CF, 0x64C9, 0x64BD, -0x6489, 0x64C3, 0x64DB, 0x64F3, -0x64D9, 0x6533, 0x657F, 0x657C, -0x65A2, 0x66C8, 0x66BE, 0x66C0, -0x66CA, 0x66CB, 0x66CF, 0x66BD, -0x66BB, 0x66BA, 0x66CC, 0x6723, -0x6A34, 0x6A66, 0x6A49, 0x6A67, -0x6A32, 0x6A68, 0x6A3E, 0x6A5D, -0x6A6D, 0x6A76, 0x6A5B, 0x6A51, -0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, -0x6A41, 0x6A6A, 0x6A64, 0x6A50, -0x6A4F, 0x6A54, 0x6A6F, 0x6A69, -0x6A60, 0x6A3C, 0x6A5E, 0x6A56, -0x6A55, 0x6A4D, 0x6A4E, 0x6A46, -0x6B55, 0x6B54, 0x6B56, 0x6BA7, -0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, -0x6C04, 0x6C03, 0x6C06, 0x6FAD, -0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, -0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, -0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, -0x7004, 0x6FA5, 0x6FAE, 0x6FBA, -0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, -0x6FB8, 0x6FA2, 0x6FC9, 0x6FAB, -0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, -0x71C5, 0x71C2, 0x71BF, 0x71B8, -0x71D6, 0x71C0, 0x71C1, 0x71CB, -0x71D4, 0x71CA, 0x71C7, 0x71CF, -0x71BD, 0x71D8, 0x71BC, 0x71C6, -0x71DA, 0x71DB, 0x729D, 0x729E, -0x7369, 0x7366, 0x7367, 0x736C, -0x7365, 0x736B, 0x736A, 0x747F, -0x749A, 0x74A0, 0x7494, 0x7492, -0x7495, 0x74A1, 0x750B, 0x7580, -0x762F, 0x762D, 0x7631, 0x763D, -0x7633, 0x763C, 0x7635, 0x7632, -0x7630, 0x76BB, 0x76E6, 0x779A, -0x779D, 0x77A1, 0x779C, 0x779B, -0x77A2, 0x77A3, 0x7795, 0x7799, -0x7797, 0x78DD, 0x78E9, 0x78E5, -0x78EA, 0x78DE, 0x78E3, 0x78DB, -0x78E1, 0x78E2, 0x78ED, 0x78DF, -0x78E0, 0x79A4, 0x7A44, 0x7A48, -0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, -0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3, -0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, -0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4, -0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, -0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4, -0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, -0x7E21, 0x7E17, 0x7E0C, 0x7E1F, -0x7E20, 0x7E13, 0x7E0E, 0x7E1C, -0x7E15, 0x7E1A, 0x7E22, 0x7E0B, -0x7E0F, 0x7E16, 0x7E0D, 0x7E14, -0x7E25, 0x7E24, 0x7F43, 0x7F7B, -0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, -0x802A, 0x8029, 0x806C, 0x81B1, -0x81A6, 0x81AE, 0x81B9, 0x81B5, -0x81AB, 0x81B0, 0x81AC, 0x81B4, -0x81B2, 0x81B7, 0x81A7, 0x81F2, -0x8255, 0x8256, 0x8257, 0x8556, -0x8545, 0x856B, 0x854D, 0x8553, -0x8561, 0x8558, 0x8540, 0x8546, -0x8564, 0x8541, 0x8562, 0x8544, -0x8551, 0x8547, 0x8563, 0x853E, -0x855B, 0x8571, 0x854E, 0x856E, -0x8575, 0x8555, 0x8567, 0x8560, -0x858C, 0x8566, 0x855D, 0x8554, -0x8565, 0x856C, 0x8663, 0x8665, -0x8664, 0x879B, 0x878F, 0x8797, -0x8793, 0x8792, 0x8788, 0x8781, -0x8796, 0x8798, 0x8779, 0x8787, -0x87A3, 0x8785, 0x8790, 0x8791, -0x879D, 0x8784, 0x8794, 0x879C, -0x879A, 0x8789, 0x891E, 0x8926, -0x8930, 0x892D, 0x892E, 0x8927, -0x8931, 0x8922, 0x8929, 0x8923, -0x892F, 0x892C, 0x891F, 0x89F1, -0x8AE0, 0x8AE2, 0x8AF2, 0x8AF4, -0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, -0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, -0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, -0x8AFB, 0x8C91, 0x8C92, 0x8C90, -0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, -0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, -0x8DA7, 0x8E33, 0x8E3E, 0x8E38, -0x8E40, 0x8E45, 0x8E36, 0x8E3C, -0x8E3D, 0x8E41, 0x8E30, 0x8E3F, -0x8EBD, 0x8F36, 0x8F2E, 0x8F35, -0x8F32, 0x8F39, 0x8F37, 0x8F34, -0x9076, 0x9079, 0x907B, 0x9086, -0x90FA, 0x9133, 0x9135, 0x9136, -0x9193, 0x9190, 0x9191, 0x918D, -0x918F, 0x9327, 0x931E, 0x9308, -0x931F, 0x9306, 0x930F, 0x937A, -0x9338, 0x933C, 0x931B, 0x9323, -0x9312, 0x9301, 0x9346, 0x932D, -0x930E, 0x930D, 0x92CB, 0x931D, -0x92FA, 0x9325, 0x9313, 0x92F9, -0x92F7, 0x9334, 0x9302, 0x9324, -0x92FF, 0x9329, 0x9339, 0x9335, -0x932A, 0x9314, 0x930C, 0x930B, -0x92FE, 0x9309, 0x9300, 0x92FB, -0x9316, 0x95BC, 0x95CD, 0x95BE, -0x95B9, 0x95BA, 0x95B6, 0x95BF, -0x95B5, 0x95BD, 0x96A9, 0x96D4, -0x970B, 0x9712, 0x9710, 0x9799, -0x9797, 0x9794, 0x97F0, 0x97F8, -0x9835, 0x982F, 0x9832, 0x9924, -0x991F, 0x9927, 0x9929, 0x999E, -0x99EE, 0x99EC, 0x99E5, 0x99E4, -0x99F0, 0x99E3, 0x99EA, 0x99E9, -0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, -0x9ABB, 0x9AF6, 0x9AFA, 0x9AF9, -0x9AF7, 0x9B33, 0x9B80, 0x9B85, -0x9B87, 0x9B7C, 0x9B7E, 0x9B7B, -0x9B82, 0x9B93, 0x9B92, 0x9B90, -0x9B7A, 0x9B95, 0x9B7D, 0x9B88, -0x9D25, 0x9D17, 0x9D20, 0x9D1E, -0x9D14, 0x9D29, 0x9D1D, 0x9D18, -0x9D22, 0x9D10, 0x9D19, 0x9D1F, -0x9E88, 0x9E86, 0x9E87, 0x9EAE, -0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, -0x9F12, 0x9F3D, 0x5126, 0x5125, -0x5122, 0x5124, 0x5120, 0x5129, -0x52F4, 0x5693, 0x568C, 0x568D, -0x5686, 0x5684, 0x5683, 0x567E, -0x5682, 0x567F, 0x5681, 0x58D6, -0x58D4, 0x58CF, 0x58D2, 0x5B2D, -0x5B25, 0x5B32, 0x5B23, 0x5B2C, -0x5B27, 0x5B26, 0x5B2F, 0x5B2E, -0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, -0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, -0x61C3, 0x61B5, 0x61BC, 0x61E7, -0x61E0, 0x61E5, 0x61E4, 0x61E8, -0x61DE, 0x64EF, 0x64E9, 0x64E3, -0x64EB, 0x64E4, 0x64E8, 0x6581, -0x6580, 0x65B6, 0x65DA, 0x66D2, -0x6A8D, 0x6A96, 0x6A81, 0x6AA5, -0x6A89, 0x6A9F, 0x6A9B, 0x6AA1, -0x6A9E, 0x6A87, 0x6A93, 0x6A8E, -0x6A95, 0x6A83, 0x6AA8, 0x6AA4, -0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, -0x6A85, 0x6A8C, 0x6A92, 0x6B5B, -0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, -0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, -0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, -0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, -0x71E1, 0x71F1, 0x71E8, 0x71F2, -0x71E4, 0x71F0, 0x71E2, 0x7373, -0x736E, 0x736F, 0x7497, 0x74B2, -0x74AB, 0x7490, 0x74AA, 0x74AD, -0x74B1, 0x74A5, 0x74AF, 0x7510, -0x7511, 0x7512, 0x750F, 0x7584, -0x7643, 0x7648, 0x7649, 0x7647, -0x76A4, 0x76E9, 0x77B5, 0x77AB, -0x77B2, 0x77B7, 0x77B6, 0x77B4, -0x77B1, 0x77A8, 0x77F0, 0x78F3, -0x78FD, 0x7902, 0x78FB, 0x78FC, -0x78F2, 0x7905, 0x78F9, 0x78FE, -0x7904, 0x79AB, 0x79A8, 0x7A5C, -0x7A5B, 0x7A56, 0x7A58, 0x7A54, -0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1, -0x7C05, 0x7C0F, 0x7BF2, 0x7C00, -0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4, -0x7C0B, 0x7BF3, 0x7C02, 0x7C09, -0x7C03, 0x7C01, 0x7BF8, 0x7BFD, -0x7C06, 0x7BF0, 0x7BF1, 0x7C10, -0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C, -0x7E42, 0x7E33, 0x9848, 0x7E38, -0x7E2A, 0x7E49, 0x7E40, 0x7E47, -0x7E29, 0x7E4C, 0x7E30, 0x7E3B, -0x7E36, 0x7E44, 0x7E3A, 0x7F45, -0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, -0x7FF2, 0x802C, 0x81BB, 0x81C4, -0x81CC, 0x81CA, 0x81C5, 0x81C7, -0x81BC, 0x81E9, 0x825B, 0x825A, -0x825C, 0x8583, 0x8580, 0x858F, -0x85A7, 0x8595, 0x85A0, 0x858B, -0x85A3, 0x857B, 0x85A4, 0x859A, -0x859E, 0x8577, 0x857C, 0x8589, -0x85A1, 0x857A, 0x8578, 0x8557, -0x858E, 0x8596, 0x8586, 0x858D, -0x8599, 0x859D, 0x8581, 0x85A2, -0x8582, 0x8588, 0x8585, 0x8579, -0x8576, 0x8598, 0x8590, 0x859F, -0x8668, 0x87BE, 0x87AA, 0x87AD, -0x87C5, 0x87B0, 0x87AC, 0x87B9, -0x87B5, 0x87BC, 0x87AE, 0x87C9, -0x87C3, 0x87C2, 0x87CC, 0x87B7, -0x87AF, 0x87C4, 0x87CA, 0x87B4, -0x87B6, 0x87BF, 0x87B8, 0x87BD, -0x87DE, 0x87B2, 0x8935, 0x8933, -0x893C, 0x893E, 0x8941, 0x8952, -0x8937, 0x8942, 0x89AD, 0x89AF, -0x89AE, 0x89F2, 0x89F3, 0x8B1E, -0x8B18, 0x8B16, 0x8B11, 0x8B05, -0x8B0B, 0x8B22, 0x8B0F, 0x8B12, -0x8B15, 0x8B07, 0x8B0D, 0x8B08, -0x8B06, 0x8B1C, 0x8B13, 0x8B1A, -0x8C4F, 0x8C70, 0x8C72, 0x8C71, -0x8C6F, 0x8C95, 0x8C94, 0x8CF9, -0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, -0x8E50, 0x8E4C, 0x8E47, 0x8F43, -0x8F40, 0x9085, 0x907E, 0x9138, -0x919A, 0x91A2, 0x919B, 0x9199, -0x919F, 0x91A1, 0x919D, 0x91A0, -0x93A1, 0x9383, 0x93AF, 0x9364, -0x9356, 0x9347, 0x937C, 0x9358, -0x935C, 0x9376, 0x9349, 0x9350, -0x9351, 0x9360, 0x936D, 0x938F, -0x934C, 0x936A, 0x9379, 0x9357, -0x9355, 0x9352, 0x934F, 0x9371, -0x9377, 0x937B, 0x9361, 0x935E, -0x9363, 0x9367, 0x9380, 0x934E, -0x9359, 0x95C7, 0x95C0, 0x95C9, -0x95C3, 0x95C5, 0x95B7, 0x96AE, -0x96B0, 0x96AC, 0x9720, 0x971F, -0x9718, 0x971D, 0x9719, 0x979A, -0x97A1, 0x979C, 0x979E, 0x979D, -0x97D5, 0x97D4, 0x97F1, 0x9841, -0x9844, 0x984A, 0x9849, 0x9845, -0x9843, 0x9925, 0x992B, 0x992C, -0x992A, 0x9933, 0x9932, 0x992F, -0x992D, 0x9931, 0x9930, 0x9998, -0x99A3, 0x99A1, 0x9A02, 0x99FA, -0x99F4, 0x99F7, 0x99F9, 0x99F8, -0x99F6, 0x99FB, 0x99FD, 0x99FE, -0x99FC, 0x9A03, 0x9ABE, 0x9AFE, -0x9AFD, 0x9B01, 0x9AFC, 0x9B48, -0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, -0x9BA6, 0x9BA1, 0x9BA5, 0x9BA4, -0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, -0x9D33, 0x9D41, 0x9D67, 0x9D36, -0x9D2E, 0x9D2F, 0x9D31, 0x9D38, -0x9D30, 0x9D45, 0x9D42, 0x9D43, -0x9D3E, 0x9D37, 0x9D40, 0x9D3D, -0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, -0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, -0x9EFB, 0x9EFF, 0x9F24, 0x9F23, -0x9F22, 0x9F54, 0x9FA0, 0x5131, -0x512D, 0x512E, 0x5698, 0x569C, -0x5697, 0x569A, 0x569D, 0x5699, -0x5970, 0x5B3C, 0x5C69, 0x5C6A, -0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, -0x61DF, 0x61ED, 0x61EE, 0x61F1, -0x61EA, 0x61F0, 0x61EB, 0x61D6, -0x61E9, 0x64FF, 0x6504, 0x64FD, -0x64F8, 0x6501, 0x6503, 0x64FC, -0x6594, 0x65DB, 0x66DA, 0x66DB, -0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, -0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, -0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, -0x6B5E, 0x6BC9, 0x6C0B, 0x7007, -0x700C, 0x700D, 0x7001, 0x7005, -0x7014, 0x700E, 0x6FFF, 0x7000, -0x6FFB, 0x7026, 0x6FFC, 0x6FF7, -0x700A, 0x7201, 0x71FF, 0x71F9, -0x7203, 0x71FD, 0x7376, 0x74B8, -0x74C0, 0x74B5, 0x74C1, 0x74BE, -0x74B6, 0x74BB, 0x74C2, 0x7514, -0x7513, 0x765C, 0x7664, 0x7659, -0x7650, 0x7653, 0x7657, 0x765A, -0x76A6, 0x76BD, 0x76EC, 0x77C2, -0x77BA, 0x78FF, 0x790C, 0x7913, -0x7914, 0x7909, 0x7910, 0x7912, -0x7911, 0x79AD, 0x79AC, 0x7A5F, -0x7C1C, 0x7C29, 0x7C19, 0x7C20, -0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, -0x7C28, 0x7C22, 0x7C25, 0x7C30, -0x7E5C, 0x7E50, 0x7E56, 0x7E63, -0x7E58, 0x7E62, 0x7E5F, 0x7E51, -0x7E60, 0x7E57, 0x7E53, 0x7FB5, -0x7FB3, 0x7FF7, 0x7FF8, 0x8075, -0x81D1, 0x81D2, 0x81D0, 0x825F, -0x825E, 0x85B4, 0x85C6, 0x85C0, -0x85C3, 0x85C2, 0x85B3, 0x85B5, -0x85BD, 0x85C7, 0x85C4, 0x85BF, -0x85CB, 0x85CE, 0x85C8, 0x85C5, -0x85B1, 0x85B6, 0x85D2, 0x8624, -0x85B8, 0x85B7, 0x85BE, 0x8669, -0x87E7, 0x87E6, 0x87E2, 0x87DB, -0x87EB, 0x87EA, 0x87E5, 0x87DF, -0x87F3, 0x87E4, 0x87D4, 0x87DC, -0x87D3, 0x87ED, 0x87D8, 0x87E3, -0x87A4, 0x87D7, 0x87D9, 0x8801, -0x87F4, 0x87E8, 0x87DD, 0x8953, -0x894B, 0x894F, 0x894C, 0x8946, -0x8950, 0x8951, 0x8949, 0x8B2A, -0x8B27, 0x8B23, 0x8B33, 0x8B30, -0x8B35, 0x8B47, 0x8B2F, 0x8B3C, -0x8B3E, 0x8B31, 0x8B25, 0x8B37, -0x8B26, 0x8B36, 0x8B2E, 0x8B24, -0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, -0x8C75, 0x8C99, 0x8C98, 0x8C97, -0x8CFE, 0x8D04, 0x8D02, 0x8D00, -0x8E5C, 0x8E62, 0x8E60, 0x8E57, -0x8E56, 0x8E5E, 0x8E65, 0x8E67, -0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, -0x8E69, 0x8E54, 0x8F46, 0x8F47, -0x8F48, 0x8F4B, 0x9128, 0x913A, -0x913B, 0x913E, 0x91A8, 0x91A5, -0x91A7, 0x91AF, 0x91AA, 0x93B5, -0x938C, 0x9392, 0x93B7, 0x939B, -0x939D, 0x9389, 0x93A7, 0x938E, -0x93AA, 0x939E, 0x93A6, 0x9395, -0x9388, 0x9399, 0x939F, 0x938D, -0x93B1, 0x9391, 0x93B2, 0x93A4, -0x93A8, 0x93B4, 0x93A3, 0x93A5, -0x95D2, 0x95D3, 0x95D1, 0x96B3, -0x96D7, 0x96DA, 0x5DC2, 0x96DF, -0x96D8, 0x96DD, 0x9723, 0x9722, -0x9725, 0x97AC, 0x97AE, 0x97A8, -0x97AB, 0x97A4, 0x97AA, 0x97A2, -0x97A5, 0x97D7, 0x97D9, 0x97D6, -0x97D8, 0x97FA, 0x9850, 0x9851, -0x9852, 0x98B8, 0x9941, 0x993C, -0x993A, 0x9A0F, 0x9A0B, 0x9A09, -0x9A0D, 0x9A04, 0x9A11, 0x9A0A, -0x9A05, 0x9A07, 0x9A06, 0x9AC0, -0x9ADC, 0x9B08, 0x9B04, 0x9B05, -0x9B29, 0x9B35, 0x9B4A, 0x9B4C, -0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, -0x9BBF, 0x9BC1, 0x9BB5, 0x9BB8, -0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, -0x9BBD, 0x9D5C, 0x9D53, 0x9D4F, -0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, -0x9D56, 0x9D4C, 0x9D57, 0x9D52, -0x9D54, 0x9D5F, 0x9D58, 0x9D5A, -0x9E8E, 0x9E8C, 0x9EDF, 0x9F01, -0x9F00, 0x9F16, 0x9F25, 0x9F2B, -0x9F2A, 0x9F29, 0x9F28, 0x9F4C, -0x9F55, 0x5134, 0x5135, 0x5296, -0x52F7, 0x53B4, 0x56AB, 0x56AD, -0x56A6, 0x56A7, 0x56AA, 0x56AC, -0x58DA, 0x58DD, 0x58DB, 0x5912, -0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, -0x5E70, 0x5FBF, 0x61FB, 0x6507, -0x6510, 0x650D, 0x6509, 0x650C, -0x650E, 0x6584, 0x65DE, 0x65DD, -0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, -0x6AD1, 0x6AD9, 0x6ACB, 0x6ADF, -0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, -0x6ACD, 0x6ADE, 0x6B60, 0x6BB0, -0x6C0C, 0x7019, 0x7027, 0x7020, -0x7016, 0x702B, 0x7021, 0x7022, -0x7023, 0x7029, 0x7017, 0x7024, -0x701C, 0x702A, 0x720C, 0x720A, -0x7207, 0x7202, 0x7205, 0x72A5, -0x72A6, 0x72A4, 0x72A3, 0x72A1, -0x74CB, 0x74C5, 0x74B7, 0x74C3, -0x7516, 0x7660, 0x77C9, 0x77CA, -0x77C4, 0x77F1, 0x791D, 0x791B, -0x7921, 0x791C, 0x7917, 0x791E, -0x79B0, 0x7A67, 0x7A68, 0x7C33, -0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, -0x7CEC, 0x7CEA, 0x7E76, 0x7E75, -0x7E78, 0x7E70, 0x7E77, 0x7E6F, -0x7E7A, 0x7E72, 0x7E74, 0x7E68, -0x7F4B, 0x7F4A, 0x7F83, 0x7F86, -0x7FB7, 0x7FFD, 0x7FFE, 0x8078, -0x81D7, 0x81D5, 0x8264, 0x8261, -0x8263, 0x85EB, 0x85F1, 0x85ED, -0x85D9, 0x85E1, 0x85E8, 0x85DA, -0x85D7, 0x85EC, 0x85F2, 0x85F8, -0x85D8, 0x85DF, 0x85E3, 0x85DC, -0x85D1, 0x85F0, 0x85E6, 0x85EF, -0x85DE, 0x85E2, 0x8800, 0x87FA, -0x8803, 0x87F6, 0x87F7, 0x8809, -0x880C, 0x880B, 0x8806, 0x87FC, -0x8808, 0x87FF, 0x880A, 0x8802, -0x8962, 0x895A, 0x895B, 0x8957, -0x8961, 0x895C, 0x8958, 0x895D, -0x8959, 0x8988, 0x89B7, 0x89B6, -0x89F6, 0x8B50, 0x8B48, 0x8B4A, -0x8B40, 0x8B53, 0x8B56, 0x8B54, -0x8B4B, 0x8B55, 0x8B51, 0x8B42, -0x8B52, 0x8B57, 0x8C43, 0x8C77, -0x8C76, 0x8C9A, 0x8D06, 0x8D07, -0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, -0x8DAB, 0x8E6D, 0x8E78, 0x8E73, -0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, -0x8F52, 0x8F51, 0x8F4F, 0x8F50, -0x8F53, 0x8FB4, 0x9140, 0x913F, -0x91B0, 0x91AD, 0x93DE, 0x93C7, -0x93CF, 0x93C2, 0x93DA, 0x93D0, -0x93F9, 0x93EC, 0x93CC, 0x93D9, -0x93A9, 0x93E6, 0x93CA, 0x93D4, -0x93EE, 0x93E3, 0x93D5, 0x93C4, -0x93CE, 0x93C0, 0x93D2, 0x93E7, -0x957D, 0x95DA, 0x95DB, 0x96E1, -0x9729, 0x972B, 0x972C, 0x9728, -0x9726, 0x97B3, 0x97B7, 0x97B6, -0x97DD, 0x97DE, 0x97DF, 0x985C, -0x9859, 0x985D, 0x9857, 0x98BF, -0x98BD, 0x98BB, 0x98BE, 0x9948, -0x9947, 0x9943, 0x99A6, 0x99A7, -0x9A1A, 0x9A15, 0x9A25, 0x9A1D, -0x9A24, 0x9A1B, 0x9A22, 0x9A20, -0x9A27, 0x9A23, 0x9A1E, 0x9A1C, -0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, -0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, -0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, -0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, -0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, -0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, -0x9D77, 0x9D81, 0x9D8A, 0x9D84, -0x9D88, 0x9D71, 0x9D80, 0x9D78, -0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, -0x9D6B, 0x9D74, 0x9D75, 0x9D70, -0x9D69, 0x9D85, 0x9D73, 0x9D7B, -0x9D82, 0x9D6F, 0x9D79, 0x9D7F, -0x9D87, 0x9D68, 0x9E94, 0x9E91, -0x9EC0, 0x9EFC, 0x9F2D, 0x9F40, -0x9F41, 0x9F4D, 0x9F56, 0x9F57, -0x9F58, 0x5337, 0x56B2, 0x56B5, -0x56B3, 0x58E3, 0x5B45, 0x5DC6, -0x5DC7, 0x5EEE, 0x5EEF, 0x5FC0, -0x5FC1, 0x61F9, 0x6517, 0x6516, -0x6515, 0x6513, 0x65DF, 0x66E8, -0x66E3, 0x66E4, 0x6AF3, 0x6AF0, -0x6AEA, 0x6AE8, 0x6AF9, 0x6AF1, -0x6AEE, 0x6AEF, 0x703C, 0x7035, -0x702F, 0x7037, 0x7034, 0x7031, -0x7042, 0x7038, 0x703F, 0x703A, -0x7039, 0x7040, 0x703B, 0x7033, -0x7041, 0x7213, 0x7214, 0x72A8, -0x737D, 0x737C, 0x74BA, 0x76AB, -0x76AA, 0x76BE, 0x76ED, 0x77CC, -0x77CE, 0x77CF, 0x77CD, 0x77F2, -0x7925, 0x7923, 0x7927, 0x7928, -0x7924, 0x7929, 0x79B2, 0x7A6E, -0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, -0x7C48, 0x7C4A, 0x7C47, 0x7C45, -0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, -0x7E80, 0x7FBA, 0x7FFF, 0x8079, -0x81DB, 0x81D9, 0x820B, 0x8268, -0x8269, 0x8622, 0x85FF, 0x8601, -0x85FE, 0x861B, 0x8600, 0x85F6, -0x8604, 0x8609, 0x8605, 0x860C, -0x85FD, 0x8819, 0x8810, 0x8811, -0x8817, 0x8813, 0x8816, 0x8963, -0x8966, 0x89B9, 0x89F7, 0x8B60, -0x8B6A, 0x8B5D, 0x8B68, 0x8B63, -0x8B65, 0x8B67, 0x8B6D, 0x8DAE, -0x8E86, 0x8E88, 0x8E84, 0x8F59, -0x8F56, 0x8F57, 0x8F55, 0x8F58, -0x8F5A, 0x908D, 0x9143, 0x9141, -0x91B7, 0x91B5, 0x91B2, 0x91B3, -0x940B, 0x9413, 0x93FB, 0x9420, -0x940F, 0x9414, 0x93FE, 0x9415, -0x9410, 0x9428, 0x9419, 0x940D, -0x93F5, 0x9400, 0x93F7, 0x9407, -0x940E, 0x9416, 0x9412, 0x93FA, -0x9409, 0x93F8, 0x940A, 0x93FF, -0x93FC, 0x940C, 0x93F6, 0x9411, -0x9406, 0x95DE, 0x95E0, 0x95DF, -0x972E, 0x972F, 0x97B9, 0x97BB, -0x97FD, 0x97FE, 0x9860, 0x9862, -0x9863, 0x985F, 0x98C1, 0x98C2, -0x9950, 0x994E, 0x9959, 0x994C, -0x994B, 0x9953, 0x9A32, 0x9A34, -0x9A31, 0x9A2C, 0x9A2A, 0x9A36, -0x9A29, 0x9A2E, 0x9A38, 0x9A2D, -0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, -0x9B12, 0x9B11, 0x9C0B, 0x9C08, -0x9BF7, 0x9C05, 0x9C12, 0x9BF8, -0x9C40, 0x9C07, 0x9C0E, 0x9C06, -0x9C17, 0x9C14, 0x9C09, 0x9D9F, -0x9D99, 0x9DA4, 0x9D9D, 0x9D92, -0x9D98, 0x9D90, 0x9D9B, 0x9DA0, -0x9D94, 0x9D9C, 0x9DAA, 0x9D97, -0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, -0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, -0x9D96, 0x9DA6, 0x9DA7, 0x9E99, -0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, -0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, -0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, -0x9F59, 0x9F91, 0x513A, 0x5139, -0x5298, 0x5297, 0x56C3, 0x56BD, -0x56BE, 0x5B48, 0x5B47, 0x5DCB, -0x5DCF, 0x5EF1, 0x61FD, 0x651B, -0x6B02, 0x6AFC, 0x6B03, 0x6AF8, -0x6B00, 0x7043, 0x7044, 0x704A, -0x7048, 0x7049, 0x7045, 0x7046, -0x721D, 0x721A, 0x7219, 0x737E, -0x7517, 0x766A, 0x77D0, 0x792D, -0x7931, 0x792F, 0x7C54, 0x7C53, -0x7CF2, 0x7E8A, 0x7E87, 0x7E88, -0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, -0x7FBB, 0x8030, 0x81DD, 0x8618, -0x862A, 0x8626, 0x861F, 0x8623, -0x861C, 0x8619, 0x8627, 0x862E, -0x8621, 0x8620, 0x8629, 0x861E, -0x8625, 0x8829, 0x881D, 0x881B, -0x8820, 0x8824, 0x881C, 0x882B, -0x884A, 0x896D, 0x8969, 0x896E, -0x896B, 0x89FA, 0x8B79, 0x8B78, -0x8B45, 0x8B7A, 0x8B7B, 0x8D10, -0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, -0x8F5E, 0x8F5B, 0x8F5D, 0x9146, -0x9144, 0x9145, 0x91B9, 0x943F, -0x943B, 0x9436, 0x9429, 0x943D, -0x943C, 0x9430, 0x9439, 0x942A, -0x9437, 0x942C, 0x9440, 0x9431, -0x95E5, 0x95E4, 0x95E3, 0x9735, -0x973A, 0x97BF, 0x97E1, 0x9864, -0x98C9, 0x98C6, 0x98C0, 0x9958, -0x9956, 0x9A39, 0x9A3D, 0x9A46, -0x9A44, 0x9A42, 0x9A41, 0x9A3A, -0x9A3F, 0x9ACD, 0x9B15, 0x9B17, -0x9B18, 0x9B16, 0x9B3A, 0x9B52, -0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, -0x9C23, 0x9C28, 0x9C29, 0x9C24, -0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, -0x9DC1, 0x9DC7, 0x9DCA, 0x9DCF, -0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, -0x9DB5, 0x9DCE, 0x9DB9, 0x9DBA, -0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, -0x9DCC, 0x9DB3, 0x9DCD, 0x9DB2, -0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, -0x9EED, 0x9F1B, 0x9F18, 0x9F1A, -0x9F31, 0x9F4E, 0x9F65, 0x9F64, -0x9F92, 0x4EB9, 0x56C6, 0x56C5, -0x56CB, 0x5971, 0x5B4B, 0x5B4C, -0x5DD5, 0x5DD1, 0x5EF2, 0x6521, -0x6520, 0x6526, 0x6522, 0x6B0B, -0x6B08, 0x6B09, 0x6C0D, 0x7055, -0x7056, 0x7057, 0x7052, 0x721E, -0x721F, 0x72A9, 0x737F, 0x74D8, -0x74D5, 0x74D9, 0x74D7, 0x766D, -0x76AD, 0x7935, 0x79B4, 0x7A70, -0x7A71, 0x7C57, 0x7C5C, 0x7C59, -0x7C5B, 0x7C5A, 0x7CF4, 0x7CF1, -0x7E91, 0x7F4F, 0x7F87, 0x81DE, -0x826B, 0x8634, 0x8635, 0x8633, -0x862C, 0x8632, 0x8636, 0x882C, -0x8828, 0x8826, 0x882A, 0x8825, -0x8971, 0x89BF, 0x89BE, 0x89FB, -0x8B7E, 0x8B84, 0x8B82, 0x8B86, -0x8B85, 0x8B7F, 0x8D15, 0x8E95, -0x8E94, 0x8E9A, 0x8E92, 0x8E90, -0x8E96, 0x8E97, 0x8F60, 0x8F62, -0x9147, 0x944C, 0x9450, 0x944A, -0x944B, 0x944F, 0x9447, 0x9445, -0x9448, 0x9449, 0x9446, 0x973F, -0x97E3, 0x986A, 0x9869, 0x98CB, -0x9954, 0x995B, 0x9A4E, 0x9A53, -0x9A54, 0x9A4C, 0x9A4F, 0x9A48, -0x9A4A, 0x9A49, 0x9A52, 0x9A50, -0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, -0x9B56, 0x9B55, 0x9C46, 0x9C48, -0x9C3F, 0x9C44, 0x9C39, 0x9C33, -0x9C41, 0x9C3C, 0x9C37, 0x9C34, -0x9C32, 0x9C3D, 0x9C36, 0x9DDB, -0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, -0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, -0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, -0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, -0x9EF0, 0x9F35, 0x9F33, 0x9F32, -0x9F42, 0x9F6B, 0x9F95, 0x9FA2, -0x513D, 0x5299, 0x58E8, 0x58E7, -0x5972, 0x5B4D, 0x5DD8, 0x882F, -0x5F4F, 0x6201, 0x6203, 0x6204, -0x6529, 0x6525, 0x6596, 0x66EB, -0x6B11, 0x6B12, 0x6B0F, 0x6BCA, -0x705B, 0x705A, 0x7222, 0x7382, -0x7381, 0x7383, 0x7670, 0x77D4, -0x7C67, 0x7C66, 0x7E95, 0x826C, -0x863A, 0x8640, 0x8639, 0x863C, -0x8631, 0x863B, 0x863E, 0x8830, -0x8832, 0x882E, 0x8833, 0x8976, -0x8974, 0x8973, 0x89FE, 0x8B8C, -0x8B8E, 0x8B8B, 0x8B88, 0x8C45, -0x8D19, 0x8E98, 0x8F64, 0x8F63, -0x91BC, 0x9462, 0x9455, 0x945D, -0x9457, 0x945E, 0x97C4, 0x97C5, -0x9800, 0x9A56, 0x9A59, 0x9B1E, -0x9B1F, 0x9B20, 0x9C52, 0x9C58, -0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, -0x9C55, 0x9C59, 0x9C4C, 0x9C4E, -0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, -0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, -0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, -0x9DF0, 0x9DE2, 0x9DEC, 0x9DF4, -0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, -0x9ED0, 0x9EF2, 0x9EF3, 0x9F06, -0x9F1C, 0x9F38, 0x9F37, 0x9F36, -0x9F43, 0x9F4F, 0x9F71, 0x9F70, -0x9F6E, 0x9F6F, 0x56D3, 0x56CD, -0x5B4E, 0x5C6D, 0x652D, 0x66ED, -0x66EE, 0x6B13, 0x705F, 0x7061, -0x705D, 0x7060, 0x7223, 0x74DB, -0x74E5, 0x77D5, 0x7938, 0x79B7, -0x79B6, 0x7C6A, 0x7E97, 0x7F89, -0x826D, 0x8643, 0x8838, 0x8837, -0x8835, 0x884B, 0x8B94, 0x8B95, -0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, -0x91BE, 0x91BD, 0x91C2, 0x946B, -0x9468, 0x9469, 0x96E5, 0x9746, -0x9743, 0x9747, 0x97C7, 0x97E5, -0x9A5E, 0x9AD5, 0x9B59, 0x9C63, -0x9C67, 0x9C66, 0x9C62, 0x9C5E, -0x9C60, 0x9E02, 0x9DFE, 0x9E07, -0x9E03, 0x9E06, 0x9E05, 0x9E00, -0x9E01, 0x9E09, 0x9DFF, 0x9DFD, -0x9E04, 0x9EA0, 0x9F1E, 0x9F46, -0x9F74, 0x9F75, 0x9F76, 0x56D4, -0x652E, 0x65B8, 0x6B18, 0x6B19, -0x6B17, 0x6B1A, 0x7062, 0x7226, -0x72AA, 0x77D8, 0x77D9, 0x7939, -0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, -0x7E98, 0x7E9B, 0x7E99, 0x81E0, -0x81E1, 0x8646, 0x8647, 0x8648, -0x8979, 0x897A, 0x897C, 0x897B, -0x89FF, 0x8B98, 0x8B99, 0x8EA5, -0x8EA4, 0x8EA3, 0x946E, 0x946D, -0x946F, 0x9471, 0x9473, 0x9749, -0x9872, 0x995F, 0x9C68, 0x9C6E, -0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, -0x9E0F, 0x9E12, 0x9E11, 0x9EA1, -0x9EF5, 0x9F09, 0x9F47, 0x9F78, -0x9F7B, 0x9F7A, 0x9F79, 0x571E, -0x7066, 0x7C6F, 0x883C, 0x8DB2, -0x8EA6, 0x91C3, 0x9474, 0x9478, -0x9476, 0x9475, 0x9A60, 0x9C74, -0x9C73, 0x9C71, 0x9C75, 0x9E14, -0x9E13, 0x9EF6, 0x9F0A, 0x9FA4, -0x7068, 0x7065, 0x7CF7, 0x866A, -0x883E, 0x883D, 0x883F, 0x8B9E, -0x8C9C, 0x8EA9, 0x8EC9, 0x974B, -0x9873, 0x9874, 0x98CC, 0x9961, -0x99AB, 0x9A64, 0x9A66, 0x9A67, -0x9B24, 0x9E15, 0x9E17, 0x9F48, -0x6207, 0x6B1E, 0x7227, 0x864C, -0x8EA8, 0x9482, 0x9480, 0x9481, -0x9A69, 0x9A68, 0x9B2E, 0x9E19, -0x7229, 0x864B, 0x8B9F, 0x9483, -0x9C79, 0x9EB7, 0x7675, 0x9A6B, -0x9C7A, 0x9E1D, 0x7069, 0x706A, -0x9EA4, 0x9F7E, 0x9F49, 0x9F98, -0x7881, 0x92B9, 0x88CF, 0x58BB, -0x6052, 0x7CA7, 0x5AFA, 0x2554, -0x2566, 0x2557, 0x2560, 0x256C, -0x2563, 0x255A, 0x2569, 0x255D, -0x2552, 0x2564, 0x2555, 0x255E, -0x256A, 0x2561, 0x2558, 0x2567, -0x255B, 0x2553, 0x2565, 0x2556, -0x255F, 0x256B, 0x2562, 0x2559, -0x2568, 0x255C, 0x2551, 0x2550, -0x256D, 0x256E, 0x2570, 0x256F, -0xFFED, 0x20547, 0x92DB, 0x205DF, -0x23FC5, 0x854C, 0x42B5, 0x73EF, -0x51B5, 0x3649, 0x24942, 0x289E4, -0x9344, 0x219DB, 0x82EE, 0x23CC8, -0x783C, 0x6744, 0x62DF, 0x24933, -0x289AA, 0x202A0, 0x26BB3, 0x21305, -0x4FAB, 0x224ED, 0x5008, 0x26D29, -0x27A84, 0x23600, 0x24AB1, 0x22513, -0x5029, 0x2037E, 0x5FA4, 0x20380, -0x20347, 0x6EDB, 0x2041F, 0x507D, -0x5101, 0x347A, 0x510E, 0x986C, -0x3743, 0x8416, 0x249A4, 0x20487, -0x5160, 0x233B4, 0x516A, 0x20BFF, -0x220FC, 0x202E5, 0x22530, 0x2058E, -0x23233, 0x21983, 0x5B82, 0x877D, -0x205B3, 0x23C99, 0x51B2, 0x51B8, -0x9D34, 0x51C9, 0x51CF, 0x51D1, -0x3CDC, 0x51D3, 0x24AA6, 0x51B3, -0x51E2, 0x5342, 0x51ED, 0x83CD, -0x693E, 0x2372D, 0x5F7B, 0x520B, -0x5226, 0x523C, 0x52B5, 0x5257, -0x5294, 0x52B9, 0x52C5, 0x7C15, -0x8542, 0x52E0, 0x860D, 0x26B13, -0x5305, 0x28ADE, 0x5549, 0x6ED9, -0x23F80, 0x20954, 0x23FEC, 0x5333, -0x5344, 0x20BE2, 0x6CCB, 0x21726, -0x681B, 0x73D5, 0x604A, 0x3EAA, -0x38CC, 0x216E8, 0x71DD, 0x44A2, -0x536D, 0x5374, 0x286AB, 0x537E, -0x537F, 0x21596, 0x21613, 0x77E6, -0x5393, 0x28A9B, 0x53A0, 0x53AB, -0x53AE, 0x73A7, 0x25772, 0x3F59, -0x739C, 0x53C1, 0x53C5, 0x6C49, -0x4E49, 0x57FE, 0x53D9, 0x3AAB, -0x20B8F, 0x53E0, 0x23FEB, 0x22DA3, -0x53F6, 0x20C77, 0x5413, 0x7079, -0x552B, 0x6657, 0x6D5B, 0x546D, -0x26B53, 0x20D74, 0x555D, 0x548F, -0x54A4, 0x47A6, 0x2170D, 0x20EDD, -0x3DB4, 0x20D4D, 0x289BC, 0x22698, -0x5547, 0x4CED, 0x542F, 0x7417, -0x5586, 0x55A9, 0x5605, 0x218D7, -0x2403A, 0x4552, 0x24435, 0x66B3, -0x210B4, 0x5637, 0x66CD, 0x2328A, -0x66A4, 0x66AD, 0x564D, 0x564F, -0x78F1, 0x56F1, 0x9787, 0x53FE, -0x5700, 0x56EF, 0x56ED, 0x28B66, -0x3623, 0x2124F, 0x5746, 0x241A5, -0x6C6E, 0x708B, 0x5742, 0x36B1, -0x26C7E, 0x57E6, 0x21416, 0x5803, -0x21454, 0x24363, 0x5826, 0x24BF5, -0x585C, 0x58AA, 0x3561, 0x58E0, -0x58DC, 0x2123C, 0x58FB, 0x5BFF, -0x5743, 0x2A150, 0x24278, 0x93D3, -0x35A1, 0x591F, 0x68A6, 0x36C3, -0x6E59, 0x2163E, 0x5A24, 0x5553, -0x21692, 0x8505, 0x59C9, 0x20D4E, -0x26C81, 0x26D2A, 0x217DC, 0x59D9, -0x217FB, 0x217B2, 0x26DA6, 0x6D71, -0x21828, 0x216D5, 0x59F9, 0x26E45, -0x5AAB, 0x5A63, 0x36E6, 0x249A9, -0x5A77, 0x3708, 0x5A96, 0x7465, -0x5AD3, 0x26FA1, 0x22554, 0x3D85, -0x21911, 0x3732, 0x216B8, 0x5E83, -0x52D0, 0x5B76, 0x6588, 0x5B7C, -0x27A0E, 0x4004, 0x485D, 0x20204, -0x5BD5, 0x6160, 0x21A34, 0x259CC, -0x205A5, 0x5BF3, 0x5B9D, 0x4D10, -0x5C05, 0x21B44, 0x5C13, 0x73CE, -0x5C14, 0x21CA5, 0x26B28, 0x5C49, -0x48DD, 0x5C85, 0x5CE9, 0x5CEF, -0x5D8B, 0x21DF9, 0x21E37, 0x5D10, -0x5D18, 0x5D46, 0x21EA4, 0x5CBA, -0x5DD7, 0x82FC, 0x382D, 0x24901, -0x22049, 0x22173, 0x8287, 0x3836, -0x3BC2, 0x5E2E, 0x6A8A, 0x5E75, -0x5E7A, 0x244BC, 0x20CD3, 0x53A6, -0x4EB7, 0x5ED0, 0x53A8, 0x21771, -0x5E09, 0x5EF4, 0x28482, 0x5EF9, -0x5EFB, 0x38A0, 0x5EFC, 0x683E, -0x941B, 0x5F0D, 0x201C1, 0x2F894, -0x3ADE, 0x48AE, 0x2133A, 0x5F3A, -0x26888, 0x223D0, 0x5F58, 0x22471, -0x5F63, 0x97BD, 0x26E6E, 0x5F72, -0x9340, 0x28A36, 0x5FA7, 0x5DB6, -0x3D5F, 0x25250, 0x21F6A, 0x270F8, -0x22668, 0x91D6, 0x2029E, 0x28A29, -0x6031, 0x6685, 0x21877, 0x3963, -0x3DC7, 0x3639, 0x5790, 0x227B4, -0x7971, 0x3E40, 0x609E, 0x60A4, -0x60B3, 0x24982, 0x2498F, 0x27A53, -0x74A4, 0x50E1, 0x5AA0, 0x6164, -0x8424, 0x6142, 0x2F8A6, 0x26ED2, -0x6181, 0x51F4, 0x20656, 0x6187, -0x5BAA, 0x23FB7, 0x2285F, 0x61D3, -0x28B9D, 0x2995D, 0x61D0, 0x3932, -0x22980, 0x228C1, 0x6023, 0x615C, -0x651E, 0x638B, 0x20118, 0x62C5, -0x21770, 0x62D5, 0x22E0D, 0x636C, -0x249DF, 0x3A17, 0x6438, 0x63F8, -0x2138E, 0x217FC, 0x6490, 0x6F8A, -0x22E36, 0x9814, 0x2408C, 0x2571D, -0x64E1, 0x64E5, 0x947B, 0x3A66, -0x643A, 0x3A57, 0x654D, 0x6F16, -0x24A28, 0x24A23, 0x6585, 0x656D, -0x655F, 0x2307E, 0x65B5, 0x24940, -0x4B37, 0x65D1, 0x40D8, 0x21829, -0x65E0, 0x65E3, 0x5FDF, 0x23400, -0x6618, 0x231F7, 0x231F8, 0x6644, -0x231A4, 0x231A5, 0x664B, 0x20E75, -0x6667, 0x251E6, 0x6673, 0x6674, -0x21E3D, 0x23231, 0x285F4, 0x231C8, -0x25313, 0x77C5, 0x228F7, 0x99A4, -0x6702, 0x2439C, 0x24A21, 0x3B2B, -0x69FA, 0x237C2, 0x675E, 0x6767, -0x6762, 0x241CD, 0x290ED, 0x67D7, -0x44E9, 0x6822, 0x6E50, 0x923C, -0x6801, 0x233E6, 0x26DA0, 0x685D, -0x2346F, 0x69E1, 0x6A0B, 0x28ADF, -0x6973, 0x68C3, 0x235CD, 0x6901, -0x6900, 0x3D32, 0x3A01, 0x2363C, -0x3B80, 0x67AC, 0x6961, 0x28A4A, -0x42FC, 0x6936, 0x6998, 0x3BA1, -0x203C9, 0x8363, 0x5090, 0x69F9, -0x23659, 0x2212A, 0x6A45, 0x23703, -0x6A9D, 0x3BF3, 0x67B1, 0x6AC8, -0x2919C, 0x3C0D, 0x6B1D, 0x20923, -0x60DE, 0x6B35, 0x6B74, 0x227CD, -0x6EB5, 0x23ADB, 0x203B5, 0x21958, -0x3740, 0x5421, 0x23B5A, 0x6BE1, -0x23EFC, 0x6BDC, 0x6C37, 0x2248B, -0x248F1, 0x26B51, 0x6C5A, 0x8226, -0x6C79, 0x23DBC, 0x44C5, 0x23DBD, -0x241A4, 0x2490C, 0x24900, 0x23CC9, -0x36E5, 0x3CEB, 0x20D32, 0x9B83, -0x231F9, 0x22491, 0x7F8F, 0x6837, -0x26D25, 0x26DA1, 0x26DEB, 0x6D96, -0x6D5C, 0x6E7C, 0x6F04, 0x2497F, -0x24085, 0x26E72, 0x8533, 0x26F74, -0x51C7, 0x6C9C, 0x6E1D, 0x842E, -0x28B21, 0x6E2F, 0x23E2F, 0x7453, -0x23F82, 0x79CC, 0x6E4F, 0x5A91, -0x2304B, 0x6FF8, 0x370D, 0x6F9D, -0x23E30, 0x6EFA, 0x21497, 0x2403D, -0x4555, 0x93F0, 0x6F44, 0x6F5C, -0x3D4E, 0x6F74, 0x29170, 0x3D3B, -0x6F9F, 0x24144, 0x6FD3, 0x24091, -0x24155, 0x24039, 0x23FF0, 0x23FB4, -0x2413F, 0x51DF, 0x24156, 0x24157, -0x24140, 0x261DD, 0x704B, 0x707E, -0x70A7, 0x7081, 0x70CC, 0x70D5, -0x70D6, 0x70DF, 0x4104, 0x3DE8, -0x71B4, 0x7196, 0x24277, 0x712B, -0x7145, 0x5A88, 0x714A, 0x716E, -0x5C9C, 0x24365, 0x714F, 0x9362, -0x242C1, 0x712C, 0x2445A, 0x24A27, -0x24A22, 0x71BA, 0x28BE8, 0x70BD, -0x720E, 0x9442, 0x7215, 0x5911, -0x9443, 0x7224, 0x9341, 0x25605, -0x722E, 0x7240, 0x24974, 0x68BD, -0x7255, 0x7257, 0x3E55, 0x23044, -0x680D, 0x6F3D, 0x7282, 0x732A, -0x732B, 0x24823, 0x2882B, 0x48ED, -0x28804, 0x7328, 0x732E, 0x73CF, -0x73AA, 0x20C3A, 0x26A2E, 0x73C9, -0x7449, 0x241E2, 0x216E7, 0x24A24, -0x6623, 0x36C5, 0x249B7, 0x2498D, -0x249FB, 0x73F7, 0x7415, 0x6903, -0x24A26, 0x7439, 0x205C3, 0x3ED7, -0x745C, 0x228AD, 0x7460, 0x28EB2, -0x7447, 0x73E4, 0x7476, 0x83B9, -0x746C, 0x3730, 0x7474, 0x93F1, -0x6A2C, 0x7482, 0x4953, 0x24A8C, -0x2415F, 0x24A79, 0x28B8F, 0x5B46, -0x28C03, 0x2189E, 0x74C8, 0x21988, -0x750E, 0x74E9, 0x751E, 0x28ED9, -0x21A4B, 0x5BD7, 0x28EAC, 0x9385, -0x754D, 0x754A, 0x7567, 0x756E, -0x24F82, 0x3F04, 0x24D13, 0x758E, -0x745D, 0x759E, 0x75B4, 0x7602, -0x762C, 0x7651, 0x764F, 0x766F, -0x7676, 0x263F5, 0x7690, 0x81EF, -0x37F8, 0x26911, 0x2690E, 0x76A1, -0x76A5, 0x76B7, 0x76CC, 0x26F9F, -0x8462, 0x2509D, 0x2517D, 0x21E1C, -0x771E, 0x7726, 0x7740, 0x64AF, -0x25220, 0x7758, 0x232AC, 0x77AF, -0x28964, 0x28968, 0x216C1, 0x77F4, -0x7809, 0x21376, 0x24A12, 0x68CA, -0x78AF, 0x78C7, 0x78D3, 0x96A5, -0x792E, 0x255E0, 0x78D7, 0x7934, -0x78B1, 0x2760C, 0x8FB8, 0x8884, -0x28B2B, 0x26083, 0x2261C, 0x7986, -0x8900, 0x6902, 0x7980, 0x25857, -0x799D, 0x27B39, 0x793C, 0x79A9, -0x6E2A, 0x27126, 0x3EA8, 0x79C6, -0x2910D, 0x79D4 -} ; diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_Big5.pxx opencascade-7.5.1+dfsg1/src/Resource/Resource_Big5.pxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_Big5.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_Big5.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,4963 @@ +// Created on: 2017-11-17 +// Created by: Artem NOVIKOV +// Copyright (c) 2013-2017 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +static const unsigned int big5uni [19782] = { +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x43F0, 0x4C32, +0x4603, 0x45A6, 0x4578, 0x27267, +0x4D77, 0x45B3, 0x27CB1, 0x4CE2, +0x27CC5, 0x3B95, 0x4736, 0x4744, +0x4C47, 0x4C40, 0x242BF, 0x23617, +0x27352, 0x26E8B, 0x270D2, 0x4C57, +0x2A351, 0x474F, 0x45DA, 0x4C85, +0x27C6C, 0x4D07, 0x4AA4, 0x46A1, +0x26B23, 0x7225, 0x25A54, 0x21A63, +0x23E06, 0x23F61, 0x664D, 0x56FB, +0x0000, 0x7D95, 0x591D, 0x28BB9, +0x3DF4, 0x9734, 0x27BEF, 0x5BDB, +0x21D5E, 0x5AA4, 0x3625, 0x29EB0, +0x5AD1, 0x5BB7, 0x5CFC, 0x676E, +0x8593, 0x29945, 0x7461, 0x749D, +0x3875, 0x21D53, 0x2369E, 0x26021, +0x3EEC, 0x258DE, 0x3AF5, 0x7AFC, +0x9F97, 0x24161, 0x2890D, 0x231EA, +0x20A8A, 0x2325E, 0x430A, 0x8484, +0x9F96, 0x942F, 0x4930, 0x8613, +0x5896, 0x974A, 0x9218, 0x79D0, +0x7A32, 0x6660, 0x6A29, 0x889D, +0x744C, 0x7BC5, 0x6782, 0x7A2C, +0x524F, 0x9046, 0x34E6, 0x73C4, +0x25DB9, 0x74C6, 0x9FC7, 0x57B3, +0x492F, 0x544C, 0x4131, 0x2368E, +0x5818, 0x7A72, 0x27B65, 0x8B8F, +0x46AE, 0x26E88, 0x4181, 0x25D99, +0x7BAE, 0x224BC, 0x9FC8, 0x224C1, +0x224C9, 0x224CC, 0x9FC9, 0x8504, +0x235BB, 0x40B4, 0x9FCA, 0x44E1, +0x2ADFF, 0x62C1, 0x706E, 0x9FCB, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x31C0, +0x31C1, 0x31C2, 0x31C3, 0x31C4, +0x2010C, 0x31C5, 0x200D1, 0x200CD, +0x31C6, 0x31C7, 0x200CB, 0x21FE8, +0x31C8, 0x200CA, 0x31C9, 0x31CA, +0x31CB, 0x31CC, 0x2010E, 0x31CD, +0x31CE, 0x0100, 0x00C1, 0x01CD, +0x00C0, 0x0112, 0x00C9, 0x011A, +0x00C8, 0x014C, 0x00D3, 0x01D1, +0x00D2, 0x0000, 0x1EBE, 0x0000, +0x1EC0, 0x00CA, 0x0101, 0x00E1, +0x01CE, 0x00E0, 0x0251, 0x0113, +0x00E9, 0x011B, 0x00E8, 0x012B, +0x00ED, 0x01D0, 0x00EC, 0x014D, +0x00F3, 0x01D2, 0x00F2, 0x016B, +0x00FA, 0x01D4, 0x00F9, 0x01D6, +0x01D8, 0x01DA, 0x01DC, 0x00FC, +0x0000, 0x1EBF, 0x0000, 0x1EC1, +0x00EA, 0x0261, 0x23DA, 0x23DB, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x2A3A9, 0x21145, 0x0000, 0x650A, +0x0000, 0x0000, 0x4E3D, 0x6EDD, +0x9D4E, 0x91DF, 0x0000, 0x0000, +0x27735, 0x6491, 0x4F1A, 0x4F28, +0x4FA8, 0x5156, 0x5174, 0x519C, +0x51E4, 0x52A1, 0x52A8, 0x533B, +0x534E, 0x53D1, 0x53D8, 0x56E2, +0x58F0, 0x5904, 0x5907, 0x5932, +0x5934, 0x5B66, 0x5B9E, 0x5B9F, +0x5C9A, 0x5E86, 0x603B, 0x6589, +0x67FE, 0x6804, 0x6865, 0x6D4E, +0x70BC, 0x7535, 0x7EA4, 0x7EAC, +0x7EBA, 0x7EC7, 0x7ECF, 0x7EDF, +0x7F06, 0x7F37, 0x827A, 0x82CF, +0x836F, 0x89C6, 0x8BBE, 0x8BE2, +0x8F66, 0x8F67, 0x8F6E, 0x7411, +0x7CFC, 0x7DCD, 0x6946, 0x7AC9, +0x5227, 0x0000, 0x0000, 0x0000, +0x0000, 0x918C, 0x78B8, 0x915E, +0x80BC, 0x0000, 0x8D0B, 0x80F6, +0x209E7, 0x0000, 0x0000, 0x809F, +0x9EC7, 0x4CCD, 0x9DC9, 0x9E0C, +0x4C3E, 0x29DF6, 0x2700E, 0x9E0A, +0x2A133, 0x35C1, 0x0000, 0x6E9A, +0x823E, 0x7519, 0x0000, 0x4911, +0x9A6C, 0x9A8F, 0x9F99, 0x7987, +0x2846C, 0x21DCA, 0x205D0, 0x22AE6, +0x4E24, 0x4E81, 0x4E80, 0x4E87, +0x4EBF, 0x4EEB, 0x4F37, 0x344C, +0x4FBD, 0x3E48, 0x5003, 0x5088, +0x347D, 0x3493, 0x34A5, 0x5186, +0x5905, 0x51DB, 0x51FC, 0x5205, +0x4E89, 0x5279, 0x5290, 0x5327, +0x35C7, 0x53A9, 0x3551, 0x53B0, +0x3553, 0x53C2, 0x5423, 0x356D, +0x3572, 0x3681, 0x5493, 0x54A3, +0x54B4, 0x54B9, 0x54D0, 0x54EF, +0x5518, 0x5523, 0x5528, 0x3598, +0x553F, 0x35A5, 0x35BF, 0x55D7, +0x35C5, 0x27D84, 0x5525, 0x0000, +0x20C42, 0x20D15, 0x2512B, 0x5590, +0x22CC6, 0x39EC, 0x20341, 0x8E46, +0x24DB8, 0x294E5, 0x4053, 0x280BE, +0x777A, 0x22C38, 0x3A34, 0x47D5, +0x2815D, 0x269F2, 0x24DEA, 0x64DD, +0x20D7C, 0x20FB4, 0x20CD5, 0x210F4, +0x648D, 0x8E7E, 0x20E96, 0x20C0B, +0x20F64, 0x22CA9, 0x28256, 0x244D3, +0x0000, 0x20D46, 0x29A4D, 0x280E9, +0x47F4, 0x24EA7, 0x22CC2, 0x9AB2, +0x3A67, 0x295F4, 0x3FED, 0x3506, +0x252C7, 0x297D4, 0x278C8, 0x22D44, +0x9D6E, 0x9815, 0x0000, 0x43D9, +0x260A5, 0x64B4, 0x54E3, 0x22D4C, +0x22BCA, 0x21077, 0x39FB, 0x2106F, +0x266DA, 0x26716, 0x279A0, 0x64EA, +0x25052, 0x20C43, 0x8E68, 0x221A1, +0x28B4C, 0x20731, 0x0000, 0x480B, +0x201A9, 0x3FFA, 0x5873, 0x22D8D, +0x0000, 0x245C8, 0x204FC, 0x26097, +0x20F4C, 0x20D96, 0x5579, 0x40BB, +0x43BA, 0x0000, 0x4AB4, 0x22A66, +0x2109D, 0x81AA, 0x98F5, 0x20D9C, +0x6379, 0x39FE, 0x22775, 0x8DC0, +0x56A1, 0x647C, 0x3E43, 0x0000, +0x2A601, 0x20E09, 0x22ACF, 0x22CC9, +0x0000, 0x210C8, 0x239C2, 0x3992, +0x3A06, 0x2829B, 0x3578, 0x25E49, +0x220C7, 0x5652, 0x20F31, 0x22CB2, +0x29720, 0x34BC, 0x6C3D, 0x24E3B, +0x0000, 0x0000, 0x27574, 0x22E8B, +0x22208, 0x2A65B, 0x28CCD, 0x20E7A, +0x20C34, 0x2681C, 0x7F93, 0x210CF, +0x22803, 0x22939, 0x35FB, 0x251E3, +0x20E8C, 0x20F8D, 0x20EAA, 0x3F93, +0x20F30, 0x20D47, 0x2114F, 0x20E4C, +0x0000, 0x20EAB, 0x20BA9, 0x20D48, +0x210C0, 0x2113D, 0x3FF9, 0x22696, +0x6432, 0x20FAD, 0x233F4, 0x27639, +0x22BCE, 0x20D7E, 0x20D7F, 0x22C51, +0x22C55, 0x3A18, 0x20E98, 0x210C7, +0x20F2E, 0x2A632, 0x26B50, 0x28CD2, +0x28D99, 0x28CCA, 0x95AA, 0x54CC, +0x82C4, 0x55B9, 0x0000, 0x29EC3, +0x9C26, 0x9AB6, 0x2775E, 0x22DEE, +0x7140, 0x816D, 0x80EC, 0x5C1C, +0x26572, 0x8134, 0x3797, 0x535F, +0x280BD, 0x91B6, 0x20EFA, 0x20E0F, +0x20E77, 0x20EFB, 0x35DD, 0x24DEB, +0x3609, 0x20CD6, 0x56AF, 0x227B5, +0x210C9, 0x20E10, 0x20E78, 0x21078, +0x21148, 0x28207, 0x21455, 0x20E79, +0x24E50, 0x22DA4, 0x5A54, 0x2101D, +0x2101E, 0x210F5, 0x210F6, 0x579C, +0x20E11, 0x27694, 0x282CD, 0x20FB5, +0x20E7B, 0x2517E, 0x3703, 0x20FB6, +0x21180, 0x252D8, 0x2A2BD, 0x249DA, +0x2183A, 0x24177, 0x2827C, 0x5899, +0x5268, 0x361A, 0x2573D, 0x7BB2, +0x5B68, 0x4800, 0x4B2C, 0x9F27, +0x49E7, 0x9C1F, 0x9B8D, 0x25B74, +0x2313D, 0x55FB, 0x35F2, 0x5689, +0x4E28, 0x5902, 0x21BC1, 0x2F878, +0x9751, 0x20086, 0x4E5B, 0x4EBB, +0x353E, 0x5C23, 0x5F51, 0x5FC4, +0x38FA, 0x624C, 0x6535, 0x6B7A, +0x6C35, 0x6C3A, 0x706C, 0x722B, +0x4E2C, 0x72AD, 0x248E9, 0x7F52, +0x793B, 0x7CF9, 0x7F53, 0x2626A, +0x34C1, 0x0000, 0x2634B, 0x8002, +0x8080, 0x26612, 0x26951, 0x535D, +0x8864, 0x89C1, 0x278B2, 0x8BA0, +0x8D1D, 0x9485, 0x9578, 0x957F, +0x95E8, 0x28E0F, 0x97E6, 0x9875, +0x98CE, 0x98DE, 0x9963, 0x29810, +0x9C7C, 0x9E1F, 0x9EC4, 0x6B6F, +0xF907, 0x4E37, 0x20087, 0x961D, +0x6237, 0x94A2, 0x0000, 0x503B, +0x6DFE, 0x29C73, 0x9FA6, 0x3DC9, +0x888F, 0x2414E, 0x7077, 0x5CF5, +0x4B20, 0x251CD, 0x3559, 0x25D30, +0x6122, 0x28A32, 0x8FA7, 0x91F6, +0x7191, 0x6719, 0x73BA, 0x23281, +0x2A107, 0x3C8B, 0x21980, 0x4B10, +0x78E4, 0x7402, 0x51AE, 0x2870F, +0x4009, 0x6A63, 0x2A2BA, 0x4223, +0x860F, 0x20A6F, 0x7A2A, 0x29947, +0x28AEA, 0x9755, 0x704D, 0x5324, +0x2207E, 0x93F4, 0x76D9, 0x289E3, +0x9FA7, 0x77DD, 0x4EA3, 0x4FF0, +0x50BC, 0x4E2F, 0x4F17, 0x9FA8, +0x5434, 0x7D8B, 0x5892, 0x58D0, +0x21DB6, 0x5E92, 0x5E99, 0x5FC2, +0x22712, 0x658B, 0x233F9, 0x6919, +0x6A43, 0x23C63, 0x6CFF, 0x0000, +0x7200, 0x24505, 0x738C, 0x3EDB, +0x24A13, 0x5B15, 0x74B9, 0x8B83, +0x25CA4, 0x25695, 0x7A93, 0x7BEC, +0x7CC3, 0x7E6C, 0x82F8, 0x8597, +0x9FA9, 0x8890, 0x9FAA, 0x8EB9, +0x9FAB, 0x8FCF, 0x855F, 0x99E0, +0x9221, 0x9FAC, 0x28DB9, 0x2143F, +0x4071, 0x42A2, 0x5A1A, 0x0000, +0x0000, 0x0000, 0x9868, 0x676B, +0x4276, 0x573D, 0x0000, 0x85D6, +0x2497B, 0x82BF, 0x2710D, 0x4C81, +0x26D74, 0x5D7B, 0x26B15, 0x26FBE, +0x9FAD, 0x9FAE, 0x5B96, 0x9FAF, +0x66E7, 0x7E5B, 0x6E57, 0x79CA, +0x3D88, 0x44C3, 0x23256, 0x22796, +0x439A, 0x4536, 0x0000, 0x5CD5, +0x23B1A, 0x8AF9, 0x5C78, 0x3D12, +0x23551, 0x5D78, 0x9FB2, 0x7157, +0x4558, 0x240EC, 0x21E23, 0x4C77, +0x3978, 0x344A, 0x201A4, 0x26C41, +0x8ACC, 0x4FB4, 0x20239, 0x59BF, +0x816C, 0x9856, 0x298FA, 0x5F3B, +0x20B9F, 0x0000, 0x221C1, 0x2896D, +0x4102, 0x46BB, 0x29079, 0x3F07, +0x9FB3, 0x2A1B5, 0x40F8, 0x37D6, +0x46F7, 0x26C46, 0x417C, 0x286B2, +0x273FF, 0x456D, 0x38D4, 0x2549A, +0x4561, 0x451B, 0x4D89, 0x4C7B, +0x4D76, 0x45EA, 0x3FC8, 0x24B0F, +0x3661, 0x44DE, 0x44BD, 0x41ED, +0x5D3E, 0x5D48, 0x5D56, 0x3DFC, +0x380F, 0x5DA4, 0x5DB9, 0x3820, +0x3838, 0x5E42, 0x5EBD, 0x5F25, +0x5F83, 0x3908, 0x3914, 0x393F, +0x394D, 0x60D7, 0x613D, 0x5CE5, +0x3989, 0x61B7, 0x61B9, 0x61CF, +0x39B8, 0x622C, 0x6290, 0x62E5, +0x6318, 0x39F8, 0x56B1, 0x3A03, +0x63E2, 0x63FB, 0x6407, 0x645A, +0x3A4B, 0x64C0, 0x5D15, 0x5621, +0x9F9F, 0x3A97, 0x6586, 0x3ABD, +0x65FF, 0x6653, 0x3AF2, 0x6692, +0x3B22, 0x6716, 0x3B42, 0x67A4, +0x6800, 0x3B58, 0x684A, 0x6884, +0x3B72, 0x3B71, 0x3B7B, 0x6909, +0x6943, 0x725C, 0x6964, 0x699F, +0x6985, 0x3BBC, 0x69D6, 0x3BDD, +0x6A65, 0x6A74, 0x6A71, 0x6A82, +0x3BEC, 0x6A99, 0x3BF2, 0x6AAB, +0x6AB5, 0x6AD4, 0x6AF6, 0x6B81, +0x6BC1, 0x6BEA, 0x6C75, 0x6CAA, +0x3CCB, 0x6D02, 0x6D06, 0x6D26, +0x6D81, 0x3CEF, 0x6DA4, 0x6DB1, +0x6E15, 0x6E18, 0x6E29, 0x6E86, +0x289C0, 0x6EBB, 0x6EE2, 0x6EDA, +0x9F7F, 0x6EE8, 0x6EE9, 0x6F24, +0x6F34, 0x3D46, 0x23F41, 0x6F81, +0x6FBE, 0x3D6A, 0x3D75, 0x71B7, +0x5C99, 0x3D8A, 0x702C, 0x3D91, +0x7050, 0x7054, 0x706F, 0x707F, +0x7089, 0x20325, 0x43C1, 0x35F1, +0x20ED8, 0x23ED7, 0x57BE, 0x26ED3, +0x713E, 0x257E0, 0x364E, 0x69A2, +0x28BE9, 0x5B74, 0x7A49, 0x258E1, +0x294D9, 0x7A65, 0x7A7D, 0x259AC, +0x7ABB, 0x7AB0, 0x7AC2, 0x7AC3, +0x71D1, 0x2648D, 0x41CA, 0x7ADA, +0x7ADD, 0x7AEA, 0x41EF, 0x54B2, +0x25C01, 0x7B0B, 0x7B55, 0x7B29, +0x2530E, 0x25CFE, 0x7BA2, 0x7B6F, +0x839C, 0x25BB4, 0x26C7F, 0x7BD0, +0x8421, 0x7B92, 0x7BB8, 0x25D20, +0x3DAD, 0x25C65, 0x8492, 0x7BFA, +0x7C06, 0x7C35, 0x25CC1, 0x7C44, +0x7C83, 0x24882, 0x7CA6, 0x667D, +0x24578, 0x7CC9, 0x7CC7, 0x7CE6, +0x7C74, 0x7CF3, 0x7CF5, 0x7CCE, +0x7E67, 0x451D, 0x26E44, 0x7D5D, +0x26ED6, 0x748D, 0x7D89, 0x7DAB, +0x7135, 0x7DB3, 0x7DD2, 0x24057, +0x26029, 0x7DE4, 0x3D13, 0x7DF5, +0x217F9, 0x7DE5, 0x2836D, 0x7E1D, +0x26121, 0x2615A, 0x7E6E, 0x7E92, +0x432B, 0x946C, 0x7E27, 0x7F40, +0x7F41, 0x7F47, 0x7936, 0x262D0, +0x99E1, 0x7F97, 0x26351, 0x7FA3, +0x21661, 0x20068, 0x455C, 0x23766, +0x4503, 0x2833A, 0x7FFA, 0x26489, +0x8005, 0x8008, 0x801D, 0x8028, +0x802F, 0x2A087, 0x26CC3, 0x803B, +0x803C, 0x8061, 0x22714, 0x4989, +0x26626, 0x23DE3, 0x266E8, 0x6725, +0x80A7, 0x28A48, 0x8107, 0x811A, +0x58B0, 0x226F6, 0x6C7F, 0x26498, +0x24FB8, 0x64E7, 0x2148A, 0x8218, +0x2185E, 0x6A53, 0x24A65, 0x24A95, +0x447A, 0x8229, 0x20B0D, 0x26A52, +0x23D7E, 0x4FF9, 0x214FD, 0x84E2, +0x8362, 0x26B0A, 0x249A7, 0x23530, +0x21773, 0x23DF8, 0x82AA, 0x691B, +0x2F994, 0x41DB, 0x854B, 0x82D0, +0x831A, 0x20E16, 0x217B4, 0x36C1, +0x2317D, 0x2355A, 0x827B, 0x82E2, +0x8318, 0x23E8B, 0x26DA3, 0x26B05, +0x26B97, 0x235CE, 0x3DBF, 0x831D, +0x55EC, 0x8385, 0x450B, 0x26DA5, +0x83AC, 0x83C1, 0x83D3, 0x347E, +0x26ED4, 0x6A57, 0x855A, 0x3496, +0x26E42, 0x22EEF, 0x8458, 0x25BE4, +0x8471, 0x3DD3, 0x44E4, 0x6AA7, +0x844A, 0x23CB5, 0x7958, 0x84A8, +0x26B96, 0x26E77, 0x26E43, 0x84DE, +0x840F, 0x8391, 0x44A0, 0x8493, +0x84E4, 0x25C91, 0x4240, 0x25CC0, +0x4543, 0x8534, 0x5AF2, 0x26E99, +0x4527, 0x8573, 0x4516, 0x67BF, +0x8616, 0x28625, 0x2863B, 0x85C1, +0x27088, 0x8602, 0x21582, 0x270CD, +0x2F9B2, 0x456A, 0x8628, 0x3648, +0x218A2, 0x53F7, 0x2739A, 0x867E, +0x8771, 0x2A0F8, 0x87EE, 0x22C27, +0x87B1, 0x87DA, 0x880F, 0x5661, +0x866C, 0x6856, 0x460F, 0x8845, +0x8846, 0x275E0, 0x23DB9, 0x275E4, +0x885E, 0x889C, 0x465B, 0x88B4, +0x88B5, 0x63C1, 0x88C5, 0x7777, +0x2770F, 0x8987, 0x898A, 0x89A6, +0x89A9, 0x89A7, 0x89BC, 0x28A25, +0x89E7, 0x27924, 0x27ABD, 0x8A9C, +0x7793, 0x91FE, 0x8A90, 0x27A59, +0x7AE9, 0x27B3A, 0x23F8F, 0x4713, +0x27B38, 0x717C, 0x8B0C, 0x8B1F, +0x25430, 0x25565, 0x8B3F, 0x8B4C, +0x8B4D, 0x8AA9, 0x24A7A, 0x8B90, +0x8B9B, 0x8AAF, 0x216DF, 0x4615, +0x884F, 0x8C9B, 0x27D54, 0x27D8F, +0x2F9D4, 0x3725, 0x27D53, 0x8CD6, +0x27D98, 0x27DBD, 0x8D12, 0x8D03, +0x21910, 0x8CDB, 0x705C, 0x8D11, +0x24CC9, 0x3ED0, 0x8D77, 0x8DA9, +0x28002, 0x21014, 0x2498A, 0x3B7C, +0x281BC, 0x2710C, 0x7AE7, 0x8EAD, +0x8EB6, 0x8EC3, 0x92D4, 0x8F19, +0x8F2D, 0x28365, 0x28412, 0x8FA5, +0x9303, 0x2A29F, 0x20A50, 0x8FB3, +0x492A, 0x289DE, 0x2853D, 0x23DBB, +0x5EF8, 0x23262, 0x8FF9, 0x2A014, +0x286BC, 0x28501, 0x22325, 0x3980, +0x26ED7, 0x9037, 0x2853C, 0x27ABE, +0x9061, 0x2856C, 0x2860B, 0x90A8, +0x28713, 0x90C4, 0x286E6, 0x90AE, +0x90FD, 0x9167, 0x3AF0, 0x91A9, +0x91C4, 0x7CAC, 0x28933, 0x21E89, +0x920E, 0x6C9F, 0x9241, 0x9262, +0x255B9, 0x92B9, 0x28AC6, 0x23C9B, +0x28B0C, 0x255DB, 0x20D31, 0x932C, +0x936B, 0x28AE1, 0x28BEB, 0x708F, +0x5AC3, 0x28AE2, 0x28AE5, 0x4965, +0x9244, 0x28BEC, 0x28C39, 0x28BFF, +0x9373, 0x945B, 0x8EBC, 0x9585, +0x95A6, 0x9426, 0x95A0, 0x6FF6, +0x42B9, 0x2267A, 0x286D8, 0x2127C, +0x23E2E, 0x49DF, 0x6C1C, 0x967B, +0x9696, 0x416C, 0x96A3, 0x26ED5, +0x61DA, 0x96B6, 0x78F5, 0x28AE0, +0x96BD, 0x53CC, 0x49A1, 0x26CB8, +0x20274, 0x26410, 0x290AF, 0x290E5, +0x24AD1, 0x21915, 0x2330A, 0x9731, +0x8642, 0x9736, 0x4A0F, 0x453D, +0x4585, 0x24AE9, 0x7075, 0x5B41, +0x971B, 0x975C, 0x291D5, 0x9757, +0x5B4A, 0x291EB, 0x975F, 0x9425, +0x50D0, 0x230B7, 0x230BC, 0x9789, +0x979F, 0x97B1, 0x97BE, 0x97C0, +0x97D2, 0x97E0, 0x2546C, 0x97EE, +0x741C, 0x29433, 0x97FF, 0x97F5, +0x2941D, 0x2797A, 0x4AD1, 0x9834, +0x9833, 0x984B, 0x9866, 0x3B0E, +0x27175, 0x3D51, 0x20630, 0x2415C, +0x25706, 0x98CA, 0x98B7, 0x98C8, +0x98C7, 0x4AFF, 0x26D27, 0x216D3, +0x55B0, 0x98E1, 0x98E6, 0x98EC, +0x9378, 0x9939, 0x24A29, 0x4B72, +0x29857, 0x29905, 0x99F5, 0x9A0C, +0x9A3B, 0x9A10, 0x9A58, 0x25725, +0x36C4, 0x290B1, 0x29BD5, 0x9AE0, +0x9AE2, 0x29B05, 0x9AF4, 0x4C0E, +0x9B14, 0x9B2D, 0x28600, 0x5034, +0x9B34, 0x269A8, 0x38C3, 0x2307D, +0x9B50, 0x9B40, 0x29D3E, 0x5A45, +0x21863, 0x9B8E, 0x2424B, 0x9C02, +0x9BFF, 0x9C0C, 0x29E68, 0x9DD4, +0x29FB7, 0x2A192, 0x2A1AB, 0x2A0E1, +0x2A123, 0x2A1DF, 0x9D7E, 0x9D83, +0x2A134, 0x9E0E, 0x6888, 0x9DC4, +0x2215B, 0x2A193, 0x2A220, 0x2193B, +0x2A233, 0x9D39, 0x2A0B9, 0x2A2B4, +0x9E90, 0x9E95, 0x9E9E, 0x9EA2, +0x4D34, 0x9EAA, 0x9EAF, 0x24364, +0x9EC1, 0x3B60, 0x39E5, 0x3D1D, +0x4F32, 0x37BE, 0x28C2B, 0x9F02, +0x9F08, 0x4B96, 0x9424, 0x26DA2, +0x9F17, 0x9F16, 0x9F39, 0x569F, +0x568A, 0x9F45, 0x99B8, 0x2908B, +0x97F2, 0x847F, 0x9F62, 0x9F69, +0x7ADC, 0x9F8E, 0x7216, 0x4BBE, +0x24975, 0x249BB, 0x7177, 0x249F8, +0x24348, 0x24A51, 0x739E, 0x28BDA, +0x218FA, 0x799F, 0x2897E, 0x28E36, +0x9369, 0x93F3, 0x28A44, 0x92EC, +0x9381, 0x93CB, 0x2896C, 0x244B9, +0x7217, 0x3EEB, 0x7772, 0x7A43, +0x70D0, 0x24473, 0x243F8, 0x717E, +0x217EF, 0x70A3, 0x218BE, 0x23599, +0x3EC7, 0x21885, 0x2542F, 0x217F8, +0x3722, 0x216FB, 0x21839, 0x36E1, +0x21774, 0x218D1, 0x25F4B, 0x3723, +0x216C0, 0x575B, 0x24A25, 0x213FE, +0x212A8, 0x213C6, 0x214B6, 0x8503, +0x236A6, 0x8503, 0x8455, 0x24994, +0x27165, 0x23E31, 0x2555C, 0x23EFB, +0x27052, 0x44F4, 0x236EE, 0x2999D, +0x26F26, 0x67F9, 0x3733, 0x3C15, +0x3DE7, 0x586C, 0x21922, 0x6810, +0x4057, 0x2373F, 0x240E1, 0x2408B, +0x2410F, 0x26C21, 0x54CB, 0x569E, +0x266B1, 0x5692, 0x20FDF, 0x20BA8, +0x20E0D, 0x93C6, 0x28B13, 0x939C, +0x4EF8, 0x512B, 0x3819, 0x24436, +0x4EBC, 0x20465, 0x2037F, 0x4F4B, +0x4F8A, 0x25651, 0x5A68, 0x201AB, +0x203CB, 0x3999, 0x2030A, 0x20414, +0x3435, 0x4F29, 0x202C0, 0x28EB3, +0x20275, 0x8ADA, 0x2020C, 0x4E98, +0x50CD, 0x510D, 0x4FA2, 0x4F03, +0x24A0E, 0x23E8A, 0x4F42, 0x502E, +0x506C, 0x5081, 0x4FCC, 0x4FE5, +0x5058, 0x50FC, 0x5159, 0x515B, +0x515D, 0x515E, 0x6E76, 0x23595, +0x23E39, 0x23EBF, 0x6D72, 0x21884, +0x23E89, 0x51A8, 0x51C3, 0x205E0, +0x44DD, 0x204A3, 0x20492, 0x20491, +0x8D7A, 0x28A9C, 0x2070E, 0x5259, +0x52A4, 0x20873, 0x52E1, 0x936E, +0x467A, 0x718C, 0x2438C, 0x20C20, +0x249AC, 0x210E4, 0x69D1, 0x20E1D, +0x7479, 0x3EDE, 0x7499, 0x7414, +0x7456, 0x7398, 0x4B8E, 0x24ABC, +0x2408D, 0x53D0, 0x3584, 0x720F, +0x240C9, 0x55B4, 0x20345, 0x54CD, +0x20BC6, 0x571D, 0x925D, 0x96F4, +0x9366, 0x57DD, 0x578D, 0x577F, +0x363E, 0x58CB, 0x5A99, 0x28A46, +0x216FA, 0x2176F, 0x21710, 0x5A2C, +0x59B8, 0x928F, 0x5A7E, 0x5ACF, +0x5A12, 0x25946, 0x219F3, 0x21861, +0x24295, 0x36F5, 0x6D05, 0x7443, +0x5A21, 0x25E83, 0x5A81, 0x28BD7, +0x20413, 0x93E0, 0x748C, 0x21303, +0x7105, 0x4972, 0x9408, 0x289FB, +0x93BD, 0x37A0, 0x5C1E, 0x5C9E, +0x5E5E, 0x5E48, 0x21996, 0x2197C, +0x23AEE, 0x5ECD, 0x5B4F, 0x21903, +0x21904, 0x3701, 0x218A0, 0x36DD, +0x216FE, 0x36D3, 0x812A, 0x28A47, +0x21DBA, 0x23472, 0x289A8, 0x5F0C, +0x5F0E, 0x21927, 0x217AB, 0x5A6B, +0x2173B, 0x5B44, 0x8614, 0x275FD, +0x8860, 0x607E, 0x22860, 0x2262B, +0x5FDB, 0x3EB8, 0x225AF, 0x225BE, +0x29088, 0x26F73, 0x61C0, 0x2003E, +0x20046, 0x2261B, 0x6199, 0x6198, +0x6075, 0x22C9B, 0x22D07, 0x246D4, +0x2914D, 0x6471, 0x24665, 0x22B6A, +0x3A29, 0x22B22, 0x23450, 0x298EA, +0x22E78, 0x6337, 0x2A45B, 0x64B6, +0x6331, 0x63D1, 0x249E3, 0x22D67, +0x62A4, 0x22CA1, 0x643B, 0x656B, +0x6972, 0x3BF4, 0x2308E, 0x232AD, +0x24989, 0x232AB, 0x550D, 0x232E0, +0x218D9, 0x2943F, 0x66CE, 0x23289, +0x231B3, 0x3AE0, 0x4190, 0x25584, +0x28B22, 0x2558F, 0x216FC, 0x2555B, +0x25425, 0x78EE, 0x23103, 0x2182A, +0x23234, 0x3464, 0x2320F, 0x23182, +0x242C9, 0x668E, 0x26D24, 0x666B, +0x4B93, 0x6630, 0x27870, 0x21DEB, +0x6663, 0x232D2, 0x232E1, 0x661E, +0x25872, 0x38D1, 0x2383A, 0x237BC, +0x3B99, 0x237A2, 0x233FE, 0x74D0, +0x3B96, 0x678F, 0x2462A, 0x68B6, +0x681E, 0x3BC4, 0x6ABE, 0x3863, +0x237D5, 0x24487, 0x6A33, 0x6A52, +0x6AC9, 0x6B05, 0x21912, 0x6511, +0x6898, 0x6A4C, 0x3BD7, 0x6A7A, +0x6B57, 0x23FC0, 0x23C9A, 0x93A0, +0x92F2, 0x28BEA, 0x28ACB, 0x9289, +0x2801E, 0x289DC, 0x9467, 0x6DA5, +0x6F0B, 0x249EC, 0x6D67, 0x23F7F, +0x3D8F, 0x6E04, 0x2403C, 0x5A3D, +0x6E0A, 0x5847, 0x6D24, 0x7842, +0x713B, 0x2431A, 0x24276, 0x70F1, +0x7250, 0x7287, 0x7294, 0x2478F, +0x24725, 0x5179, 0x24AA4, 0x205EB, +0x747A, 0x23EF8, 0x2365F, 0x24A4A, +0x24917, 0x25FE1, 0x3F06, 0x3EB1, +0x24ADF, 0x28C23, 0x23F35, 0x60A7, +0x3EF3, 0x74CC, 0x743C, 0x9387, +0x7437, 0x449F, 0x26DEA, 0x4551, +0x7583, 0x3F63, 0x24CD9, 0x24D06, +0x3F58, 0x7555, 0x7673, 0x2A5C6, +0x3B19, 0x7468, 0x28ACC, 0x249AB, +0x2498E, 0x3AFB, 0x3DCD, 0x24A4E, +0x3EFF, 0x249C5, 0x248F3, 0x91FA, +0x5732, 0x9342, 0x28AE3, 0x21864, +0x50DF, 0x25221, 0x251E7, 0x7778, +0x23232, 0x770E, 0x770F, 0x777B, +0x24697, 0x23781, 0x3A5E, 0x248F0, +0x7438, 0x749B, 0x3EBF, 0x24ABA, +0x24AC7, 0x40C8, 0x24A96, 0x261AE, +0x9307, 0x25581, 0x781E, 0x788D, +0x7888, 0x78D2, 0x73D0, 0x7959, +0x27741, 0x256E3, 0x410E, 0x799B, +0x8496, 0x79A5, 0x6A2D, 0x23EFA, +0x7A3A, 0x79F4, 0x416E, 0x216E6, +0x4132, 0x9235, 0x79F1, 0x20D4C, +0x2498C, 0x20299, 0x23DBA, 0x2176E, +0x3597, 0x556B, 0x3570, 0x36AA, +0x201D4, 0x20C0D, 0x7AE2, 0x5A59, +0x226F5, 0x25AAF, 0x25A9C, 0x5A0D, +0x2025B, 0x78F0, 0x5A2A, 0x25BC6, +0x7AFE, 0x41F9, 0x7C5D, 0x7C6D, +0x4211, 0x25BB3, 0x25EBC, 0x25EA6, +0x7CCD, 0x249F9, 0x217B0, 0x7C8E, +0x7C7C, 0x7CAE, 0x6AB2, 0x7DDC, +0x7E07, 0x7DD3, 0x7F4E, 0x26261, +0x2615C, 0x27B48, 0x7D97, 0x25E82, +0x426A, 0x26B75, 0x20916, 0x67D6, +0x2004E, 0x235CF, 0x57C4, 0x26412, +0x263F8, 0x24962, 0x7FDD, 0x7B27, +0x2082C, 0x25AE9, 0x25D43, 0x7B0C, +0x25E0E, 0x99E6, 0x8645, 0x9A63, +0x6A1C, 0x2343F, 0x39E2, 0x249F7, +0x265AD, 0x9A1F, 0x265A0, 0x8480, +0x27127, 0x26CD1, 0x44EA, 0x8137, +0x4402, 0x80C6, 0x8109, 0x8142, +0x267B4, 0x98C3, 0x26A42, 0x8262, +0x8265, 0x26A51, 0x8453, 0x26DA7, +0x8610, 0x2721B, 0x5A86, 0x417F, +0x21840, 0x5B2B, 0x218A1, 0x5AE4, +0x218D8, 0x86A0, 0x2F9BC, 0x23D8F, +0x882D, 0x27422, 0x5A02, 0x886E, +0x4F45, 0x8887, 0x88BF, 0x88E6, +0x8965, 0x894D, 0x25683, 0x8954, +0x27785, 0x27784, 0x28BF5, 0x28BD9, +0x28B9C, 0x289F9, 0x3EAD, 0x84A3, +0x46F5, 0x46CF, 0x37F2, 0x8A3D, +0x8A1C, 0x29448, 0x5F4D, 0x922B, +0x24284, 0x65D4, 0x7129, 0x70C4, +0x21845, 0x9D6D, 0x8C9F, 0x8CE9, +0x27DDC, 0x599A, 0x77C3, 0x59F0, +0x436E, 0x36D4, 0x8E2A, 0x8EA7, +0x24C09, 0x8F30, 0x8F4A, 0x42F4, +0x6C58, 0x6FBB, 0x22321, 0x489B, +0x6F79, 0x6E8B, 0x217DA, 0x9BE9, +0x36B5, 0x2492F, 0x90BB, 0x9097, +0x5571, 0x4906, 0x91BB, 0x9404, +0x28A4B, 0x4062, 0x28AFC, 0x9427, +0x28C1D, 0x28C3B, 0x84E5, 0x8A2B, +0x9599, 0x95A7, 0x9597, 0x9596, +0x28D34, 0x7445, 0x3EC2, 0x248FF, +0x24A42, 0x243EA, 0x3EE7, 0x23225, +0x968F, 0x28EE7, 0x28E66, 0x28E65, +0x3ECC, 0x249ED, 0x24A78, 0x23FEE, +0x7412, 0x746B, 0x3EFC, 0x9741, +0x290B0, 0x6847, 0x4A1D, 0x29093, +0x257DF, 0x975D, 0x9368, 0x28989, +0x28C26, 0x28B2F, 0x263BE, 0x92BA, +0x5B11, 0x8B69, 0x493C, 0x73F9, +0x2421B, 0x979B, 0x9771, 0x9938, +0x20F26, 0x5DC1, 0x28BC5, 0x24AB2, +0x981F, 0x294DA, 0x92F6, 0x295D7, +0x91E5, 0x44C0, 0x28B50, 0x24A67, +0x28B64, 0x98DC, 0x28A45, 0x3F00, +0x922A, 0x4925, 0x8414, 0x993B, +0x994D, 0x27B06, 0x3DFD, 0x999B, +0x4B6F, 0x99AA, 0x9A5C, 0x28B65, +0x258C8, 0x6A8F, 0x9A21, 0x5AFE, +0x9A2F, 0x298F1, 0x4B90, 0x29948, +0x99BC, 0x4BBD, 0x4B97, 0x937D, +0x5872, 0x21302, 0x5822, 0x249B8, +0x214E8, 0x7844, 0x2271F, 0x23DB8, +0x68C5, 0x3D7D, 0x9458, 0x3927, +0x6150, 0x22781, 0x2296B, 0x6107, +0x9C4F, 0x9C53, 0x9C7B, 0x9C35, +0x9C10, 0x9B7F, 0x9BCF, 0x29E2D, +0x9B9F, 0x2A1F5, 0x2A0FE, 0x9D21, +0x4CAE, 0x24104, 0x9E18, 0x4CB0, +0x9D0C, 0x2A1B4, 0x2A0ED, 0x2A0F3, +0x2992F, 0x9DA5, 0x84BD, 0x26E12, +0x26FDF, 0x26B82, 0x85FC, 0x4533, +0x26DA4, 0x26E84, 0x26DF0, 0x8420, +0x85EE, 0x26E00, 0x237D7, 0x26064, +0x79E2, 0x2359C, 0x23640, 0x492D, +0x249DE, 0x3D62, 0x93DB, 0x92BE, +0x9348, 0x202BF, 0x78B9, 0x9277, +0x944D, 0x4FE4, 0x3440, 0x9064, +0x2555D, 0x783D, 0x7854, 0x78B6, +0x784B, 0x21757, 0x231C9, 0x24941, +0x369A, 0x4F72, 0x6FDA, 0x6FD9, +0x701E, 0x701E, 0x5414, 0x241B5, +0x57BB, 0x58F3, 0x578A, 0x9D16, +0x57D7, 0x7134, 0x34AF, 0x241AC, +0x71EB, 0x26C40, 0x24F97, 0x5B28, +0x217B5, 0x28A49, 0x610C, 0x5ACE, +0x5A0B, 0x42BC, 0x24488, 0x372C, +0x4B7B, 0x289FC, 0x93BB, 0x93B8, +0x218D6, 0x20F1D, 0x8472, 0x26CC0, +0x21413, 0x242FA, 0x22C26, 0x243C1, +0x5994, 0x23DB7, 0x26741, 0x7DA8, +0x2615B, 0x260A4, 0x249B9, 0x2498B, +0x289FA, 0x92E5, 0x73E2, 0x3EE9, +0x74B4, 0x28B63, 0x2189F, 0x3EE1, +0x24AB3, 0x6AD8, 0x73F3, 0x73FB, +0x3ED6, 0x24A3E, 0x24A94, 0x217D9, +0x24A66, 0x203A7, 0x21424, 0x249E5, +0x7448, 0x24916, 0x70A5, 0x24976, +0x9284, 0x73E6, 0x935F, 0x204FE, +0x9331, 0x28ACE, 0x28A16, 0x9386, +0x28BE7, 0x255D5, 0x4935, 0x28A82, +0x716B, 0x24943, 0x20CFF, 0x56A4, +0x2061A, 0x20BEB, 0x20CB8, 0x5502, +0x79C4, 0x217FA, 0x7DFE, 0x216C2, +0x24A50, 0x21852, 0x452E, 0x9401, +0x370A, 0x28AC0, 0x249AD, 0x59B0, +0x218BF, 0x21883, 0x27484, 0x5AA1, +0x36E2, 0x23D5B, 0x36B0, 0x925F, +0x5A79, 0x28A81, 0x21862, 0x9374, +0x3CCD, 0x20AB4, 0x4A96, 0x398A, +0x50F4, 0x3D69, 0x3D4C, 0x2139C, +0x7175, 0x42FB, 0x28218, 0x6E0F, +0x290E4, 0x44EB, 0x6D57, 0x27E4F, +0x7067, 0x6CAF, 0x3CD6, 0x23FED, +0x23E2D, 0x6E02, 0x6F0C, 0x3D6F, +0x203F5, 0x7551, 0x36BC, 0x34C8, +0x4680, 0x3EDA, 0x4871, 0x59C4, +0x926E, 0x493E, 0x8F41, 0x28C1C, +0x26BC0, 0x5812, 0x57C8, 0x36D6, +0x21452, 0x70FE, 0x24362, 0x24A71, +0x22FE3, 0x212B0, 0x223BD, 0x68B9, +0x6967, 0x21398, 0x234E5, 0x27BF4, +0x236DF, 0x28A83, 0x237D6, 0x233FA, +0x24C9F, 0x6A1A, 0x236AD, 0x26CB7, +0x843E, 0x44DF, 0x44CE, 0x26D26, +0x26D51, 0x26C82, 0x26FDE, 0x6F17, +0x27109, 0x833D, 0x2173A, 0x83ED, +0x26C80, 0x27053, 0x217DB, 0x5989, +0x5A82, 0x217B3, 0x5A61, 0x5A71, +0x21905, 0x241FC, 0x372D, 0x59EF, +0x2173C, 0x36C7, 0x718E, 0x9390, +0x669A, 0x242A5, 0x5A6E, 0x5A2B, +0x24293, 0x6A2B, 0x23EF9, 0x27736, +0x2445B, 0x242CA, 0x711D, 0x24259, +0x289E1, 0x4FB0, 0x26D28, 0x5CC2, +0x244CE, 0x27E4D, 0x243BD, 0x6A0C, +0x24256, 0x21304, 0x70A6, 0x7133, +0x243E9, 0x3DA5, 0x6CDF, 0x2F825, +0x24A4F, 0x7E65, 0x59EB, 0x5D2F, +0x3DF3, 0x5F5C, 0x24A5D, 0x217DF, +0x7DA4, 0x8426, 0x5485, 0x23AFA, +0x23300, 0x20214, 0x577E, 0x208D5, +0x20619, 0x3FE5, 0x21F9E, 0x2A2B6, +0x7003, 0x2915B, 0x5D70, 0x738F, +0x7CD3, 0x28A59, 0x29420, 0x4FC8, +0x7FE7, 0x72CD, 0x7310, 0x27AF4, +0x7338, 0x7339, 0x256F6, 0x7341, +0x7348, 0x3EA9, 0x27B18, 0x906C, +0x71F5, 0x248F2, 0x73E1, 0x81F6, +0x3ECA, 0x770C, 0x3ED1, 0x6CA2, +0x56FD, 0x7419, 0x741E, 0x741F, +0x3EE2, 0x3EF0, 0x3EF4, 0x3EFA, +0x74D3, 0x3F0E, 0x3F53, 0x7542, +0x756D, 0x7572, 0x758D, 0x3F7C, +0x75C8, 0x75DC, 0x3FC0, 0x764D, +0x3FD7, 0x7674, 0x3FDC, 0x767A, +0x24F5C, 0x7188, 0x5623, 0x8980, +0x5869, 0x401D, 0x7743, 0x4039, +0x6761, 0x4045, 0x35DB, 0x7798, +0x406A, 0x406F, 0x5C5E, 0x77BE, +0x77CB, 0x58F2, 0x7818, 0x70B9, +0x781C, 0x40A8, 0x7839, 0x7847, +0x7851, 0x7866, 0x8448, 0x25535, +0x7933, 0x6803, 0x7932, 0x4103, +0x4109, 0x7991, 0x7999, 0x8FBB, +0x7A06, 0x8FBC, 0x4167, 0x7A91, +0x41B2, 0x7ABC, 0x8279, 0x41C4, +0x7ACF, 0x7ADB, 0x41CF, 0x4E21, +0x7B62, 0x7B6C, 0x7B7B, 0x7C12, +0x7C1B, 0x4260, 0x427A, 0x7C7B, +0x7C9C, 0x428C, 0x7CB8, 0x4294, +0x7CED, 0x8F93, 0x70C0, 0x20CCF, +0x7DCF, 0x7DD4, 0x7DD0, 0x7DFD, +0x7FAE, 0x7FB4, 0x729F, 0x4397, +0x8020, 0x8025, 0x7B39, 0x802E, +0x8031, 0x8054, 0x3DCC, 0x57B4, +0x70A0, 0x80B7, 0x80E9, 0x43ED, +0x810C, 0x732A, 0x810E, 0x8112, +0x7560, 0x8114, 0x4401, 0x3B39, +0x8156, 0x8159, 0x815A, 0x4413, +0x583A, 0x817C, 0x8184, 0x4425, +0x8193, 0x442D, 0x81A5, 0x57EF, +0x81C1, 0x81E4, 0x8254, 0x448F, +0x82A6, 0x8276, 0x82CA, 0x82D8, +0x82FF, 0x44B0, 0x8357, 0x9669, +0x698A, 0x8405, 0x70F5, 0x8464, +0x60E3, 0x8488, 0x4504, 0x84BE, +0x84E1, 0x84F8, 0x8510, 0x8538, +0x8552, 0x453B, 0x856F, 0x8570, +0x85E0, 0x4577, 0x8672, 0x8692, +0x86B2, 0x86EF, 0x9645, 0x878B, +0x4606, 0x4617, 0x88AE, 0x88FF, +0x8924, 0x8947, 0x8991, 0x27967, +0x8A29, 0x8A38, 0x8A94, 0x8AB4, +0x8C51, 0x8CD4, 0x8CF2, 0x8D1C, +0x4798, 0x585F, 0x8DC3, 0x47ED, +0x4EEE, 0x8E3A, 0x55D8, 0x5754, +0x8E71, 0x55F5, 0x8EB0, 0x4837, +0x8ECE, 0x8EE2, 0x8EE4, 0x8EED, +0x8EF2, 0x8FB7, 0x8FC1, 0x8FCA, +0x8FCC, 0x9033, 0x99C4, 0x48AD, +0x98E0, 0x9213, 0x491E, 0x9228, +0x9258, 0x926B, 0x92B1, 0x92AE, +0x92BF, 0x92E3, 0x92EB, 0x92F3, +0x92F4, 0x92FD, 0x9343, 0x9384, +0x93AD, 0x4945, 0x4951, 0x9EBF, +0x9417, 0x5301, 0x941D, 0x942D, +0x943E, 0x496A, 0x9454, 0x9479, +0x952D, 0x95A2, 0x49A7, 0x95F4, +0x9633, 0x49E5, 0x67A0, 0x4A24, +0x9740, 0x4A35, 0x97B2, 0x97C2, +0x5654, 0x4AE4, 0x60E8, 0x98B9, +0x4B19, 0x98F1, 0x5844, 0x990E, +0x9919, 0x51B4, 0x991C, 0x9937, +0x9942, 0x995D, 0x9962, 0x4B70, +0x99C5, 0x4B9D, 0x9A3C, 0x9B0F, +0x7A83, 0x9B69, 0x9B81, 0x9BDD, +0x9BF1, 0x9BF4, 0x4C6D, 0x9C20, +0x376F, 0x21BC2, 0x9D49, 0x9C3A, +0x9EFE, 0x5650, 0x9D93, 0x9DBD, +0x9DC0, 0x9DFC, 0x94F6, 0x8FB6, +0x9E7B, 0x9EAC, 0x9EB1, 0x9EBD, +0x9EC6, 0x94DC, 0x9EE2, 0x9EF1, +0x9EF8, 0x7AC8, 0x9F44, 0x20094, +0x202B7, 0x203A0, 0x691A, 0x94C3, +0x59AC, 0x204D7, 0x5840, 0x94C1, +0x37B9, 0x205D5, 0x20615, 0x20676, +0x216BA, 0x5757, 0x7173, 0x20AC2, +0x20ACD, 0x20BBF, 0x546A, 0x2F83B, +0x20BCB, 0x549E, 0x20BFB, 0x20C3B, +0x20C53, 0x20C65, 0x20C7C, 0x60E7, +0x20C8D, 0x567A, 0x20CB5, 0x20CDD, +0x20CED, 0x20D6F, 0x20DB2, 0x20DC8, +0x6955, 0x9C2F, 0x87A5, 0x20E04, +0x20E0E, 0x20ED7, 0x20F90, 0x20F2D, +0x20E73, 0x5C20, 0x20FBC, 0x5E0B, +0x2105C, 0x2104F, 0x21076, 0x671E, +0x2107B, 0x21088, 0x21096, 0x3647, +0x210BF, 0x210D3, 0x2112F, 0x2113B, +0x5364, 0x84AD, 0x212E3, 0x21375, +0x21336, 0x8B81, 0x21577, 0x21619, +0x217C3, 0x217C7, 0x4E78, 0x70BB, +0x2182D, 0x2196A, 0x21A2D, 0x21A45, +0x21C2A, 0x21C70, 0x21CAC, 0x21EC8, +0x62C3, 0x21ED5, 0x21F15, 0x7198, +0x6855, 0x22045, 0x69E9, 0x36C8, +0x2227C, 0x223D7, 0x223FA, 0x2272A, +0x22871, 0x2294F, 0x82FD, 0x22967, +0x22993, 0x22AD5, 0x89A5, 0x22AE8, +0x8FA0, 0x22B0E, 0x97B8, 0x22B3F, +0x9847, 0x9ABD, 0x22C4C, 0x0000, +0x22C88, 0x22CB7, 0x25BE8, 0x22D08, +0x22D12, 0x22DB7, 0x22D95, 0x22E42, +0x22F74, 0x22FCC, 0x23033, 0x23066, +0x2331F, 0x233DE, 0x5FB1, 0x6648, +0x66BF, 0x27A79, 0x23567, 0x235F3, +0x7201, 0x249BA, 0x77D7, 0x2361A, +0x23716, 0x7E87, 0x20346, 0x58B5, +0x670E, 0x6918, 0x23AA7, 0x27657, +0x25FE2, 0x23E11, 0x23EB9, 0x275FE, +0x2209A, 0x48D0, 0x4AB8, 0x24119, +0x28A9A, 0x242EE, 0x2430D, 0x2403B, +0x24334, 0x24396, 0x24A45, 0x205CA, +0x51D2, 0x20611, 0x599F, 0x21EA8, +0x3BBE, 0x23CFF, 0x24404, 0x244D6, +0x5788, 0x24674, 0x399B, 0x2472F, +0x285E8, 0x299C9, 0x3762, 0x221C3, +0x8B5E, 0x28B4E, 0x99D6, 0x24812, +0x248FB, 0x24A15, 0x7209, 0x24AC0, +0x20C78, 0x5965, 0x24EA5, 0x24F86, +0x20779, 0x8EDA, 0x2502C, 0x528F, +0x573F, 0x7171, 0x25299, 0x25419, +0x23F4A, 0x24AA7, 0x55BC, 0x25446, +0x2546E, 0x26B52, 0x91D4, 0x3473, +0x2553F, 0x27632, 0x2555E, 0x4718, +0x25562, 0x25566, 0x257C7, 0x2493F, +0x2585D, 0x5066, 0x34FB, 0x233CC, +0x60DE, 0x25903, 0x477C, 0x28948, +0x25AAE, 0x25B89, 0x25C06, 0x21D90, +0x57A1, 0x7151, 0x6FB6, 0x26102, +0x27C12, 0x9056, 0x261B2, 0x24F9A, +0x8B62, 0x26402, 0x2644A, 0x5D5B, +0x26BF7, 0x8F36, 0x26484, 0x2191C, +0x8AEA, 0x249F6, 0x26488, 0x23FEF, +0x26512, 0x4BC0, 0x265BF, 0x266B5, +0x2271B, 0x9465, 0x257E1, 0x6195, +0x5A27, 0x2F8CD, 0x4FBB, 0x56B9, +0x24521, 0x266FC, 0x4E6A, 0x24934, +0x9656, 0x6D8F, 0x26CBD, 0x3618, +0x8977, 0x26799, 0x2686E, 0x26411, +0x2685E, 0x71DF, 0x268C7, 0x7B42, +0x290C0, 0x20A11, 0x26926, 0x9104, +0x26939, 0x7A45, 0x9DF0, 0x269FA, +0x9A26, 0x26A2D, 0x365F, 0x26469, +0x20021, 0x7983, 0x26A34, 0x26B5B, +0x5D2C, 0x23519, 0x83CF, 0x26B9D, +0x46D0, 0x26CA4, 0x753B, 0x8865, +0x26DAE, 0x58B6, 0x371C, 0x2258D, +0x2704B, 0x271CD, 0x3C54, 0x27280, +0x27285, 0x9281, 0x2217A, 0x2728B, +0x9330, 0x272E6, 0x249D0, 0x6C39, +0x949F, 0x27450, 0x20EF8, 0x8827, +0x88F5, 0x22926, 0x28473, 0x217B1, +0x6EB8, 0x24A2A, 0x21820, 0x39A4, +0x36B9, 0x5C10, 0x79E3, 0x453F, +0x66B6, 0x29CAD, 0x298A4, 0x8943, +0x277CC, 0x27858, 0x56D6, 0x40DF, +0x2160A, 0x39A1, 0x2372F, 0x280E8, +0x213C5, 0x71AD, 0x8366, 0x279DD, +0x291A8, 0x5A67, 0x4CB7, 0x270AF, +0x289AB, 0x279FD, 0x27A0A, 0x27B0B, +0x27D66, 0x2417A, 0x7B43, 0x797E, +0x28009, 0x6FB5, 0x2A2DF, 0x6A03, +0x28318, 0x53A2, 0x26E07, 0x93BF, +0x6836, 0x975D, 0x2816F, 0x28023, +0x269B5, 0x213ED, 0x2322F, 0x28048, +0x5D85, 0x28C30, 0x28083, 0x5715, +0x9823, 0x28949, 0x5DAB, 0x24988, +0x65BE, 0x69D5, 0x53D2, 0x24AA5, +0x23F81, 0x3C11, 0x6736, 0x28090, +0x280F4, 0x2812E, 0x21FA1, 0x2814F, +0x28189, 0x281AF, 0x2821A, 0x28306, +0x2832F, 0x2838A, 0x35CA, 0x28468, +0x286AA, 0x48FA, 0x63E6, 0x28956, +0x7808, 0x9255, 0x289B8, 0x43F2, +0x289E7, 0x43DF, 0x289E8, 0x28B46, +0x28BD4, 0x59F8, 0x28C09, 0x8F0B, +0x28FC5, 0x290EC, 0x7B51, 0x29110, +0x2913C, 0x3DF7, 0x2915E, 0x24ACA, +0x8FD0, 0x728F, 0x568B, 0x294E7, +0x295E9, 0x295B0, 0x295B8, 0x29732, +0x298D1, 0x29949, 0x2996A, 0x299C3, +0x29A28, 0x29B0E, 0x29D5A, 0x29D9B, +0x7E9F, 0x29EF8, 0x29F23, 0x4CA4, +0x9547, 0x2A293, 0x71A2, 0x2A2FF, +0x4D91, 0x9012, 0x2A5CB, 0x4D9C, +0x20C9C, 0x8FBE, 0x55C1, 0x8FBA, +0x224B0, 0x8FB9, 0x24A93, 0x4509, +0x7E7F, 0x6F56, 0x6AB1, 0x4EEA, +0x34E4, 0x28B2C, 0x2789D, 0x373A, +0x8E80, 0x217F5, 0x28024, 0x28B6C, +0x28B99, 0x27A3E, 0x266AF, 0x3DEB, +0x27655, 0x23CB7, 0x25635, 0x25956, +0x4E9A, 0x25E81, 0x26258, 0x56BF, +0x20E6D, 0x8E0E, 0x5B6D, 0x23E88, +0x24C9E, 0x63DE, 0x62D0, 0x217F6, +0x2187B, 0x6530, 0x562D, 0x25C4A, +0x541A, 0x25311, 0x3DC6, 0x29D98, +0x4C7D, 0x5622, 0x561E, 0x7F49, +0x25ED8, 0x5975, 0x23D40, 0x8770, +0x4E1C, 0x20FEA, 0x20D49, 0x236BA, +0x8117, 0x9D5E, 0x8D18, 0x763B, +0x9C45, 0x764E, 0x77B9, 0x9345, +0x5432, 0x8148, 0x82F7, 0x5625, +0x8132, 0x8418, 0x80BD, 0x55EA, +0x7962, 0x5643, 0x5416, 0x20E9D, +0x35CE, 0x5605, 0x55F1, 0x66F1, +0x282E2, 0x362D, 0x7534, 0x55F0, +0x55BA, 0x5497, 0x5572, 0x20C41, +0x20C96, 0x5ED0, 0x25148, 0x20E76, +0x22C62, 0x20EA2, 0x9EAB, 0x7D5A, +0x55DE, 0x21075, 0x629D, 0x976D, +0x5494, 0x8CCD, 0x71F6, 0x9176, +0x63FC, 0x63B9, 0x63FE, 0x5569, +0x22B43, 0x9C72, 0x22EB3, 0x519A, +0x34DF, 0x20DA7, 0x51A7, 0x544D, +0x551E, 0x5513, 0x7666, 0x8E2D, +0x2688A, 0x75B1, 0x80B6, 0x8804, +0x8786, 0x88C7, 0x81B6, 0x841C, +0x210C1, 0x44EC, 0x7304, 0x24706, +0x5B90, 0x830B, 0x26893, 0x567B, +0x226F4, 0x27D2F, 0x241A3, 0x27D73, +0x26ED0, 0x272B6, 0x9170, 0x211D9, +0x9208, 0x23CFC, 0x2A6A9, 0x20EAC, +0x20EF9, 0x7266, 0x21CA2, 0x474E, +0x24FC2, 0x27FF9, 0x20FEB, 0x40FA, +0x9C5D, 0x651F, 0x22DA0, 0x48F3, +0x247E0, 0x29D7C, 0x20FEC, 0x20E0A, +0x6062, 0x275A3, 0x20FED, 0x0000, +0x26048, 0x21187, 0x71A3, 0x7E8E, +0x9D50, 0x4E1A, 0x4E04, 0x3577, +0x5B0D, 0x6CB2, 0x5367, 0x36AC, +0x39DC, 0x537D, 0x36A5, 0x24618, +0x589A, 0x24B6E, 0x822D, 0x544B, +0x57AA, 0x25A95, 0x20979, 0x0000, +0x3A52, 0x22465, 0x7374, 0x29EAC, +0x4D09, 0x9BED, 0x23CFE, 0x29F30, +0x4C5B, 0x24FA9, 0x2959E, 0x29FDE, +0x845C, 0x23DB6, 0x272B2, 0x267B3, +0x23720, 0x632E, 0x7D25, 0x23EF7, +0x23E2C, 0x3A2A, 0x9008, 0x52CC, +0x3E74, 0x367A, 0x45E9, 0x2048E, +0x7640, 0x5AF0, 0x20EB6, 0x787A, +0x27F2E, 0x58A7, 0x40BF, 0x567C, +0x9B8B, 0x5D74, 0x7654, 0x2A434, +0x9E85, 0x4CE1, 0x75F9, 0x37FB, +0x6119, 0x230DA, 0x243F2, 0x0000, +0x565D, 0x212A9, 0x57A7, 0x24963, +0x29E06, 0x5234, 0x270AE, 0x35AD, +0x6C4A, 0x9D7C, 0x7C56, 0x9B39, +0x57DE, 0x2176C, 0x5C53, 0x64D3, +0x294D0, 0x26335, 0x27164, 0x86AD, +0x20D28, 0x26D22, 0x24AE2, 0x20D71, +0x0000, 0x51FE, 0x21F0F, 0x5D8E, +0x9703, 0x21DD1, 0x9E81, 0x904C, +0x7B1F, 0x9B02, 0x5CD1, 0x7BA3, +0x6268, 0x6335, 0x9AFF, 0x7BCF, +0x9B2A, 0x7C7E, 0x9B2E, 0x7C42, +0x7C86, 0x9C15, 0x7BFC, 0x9B09, +0x9F17, 0x9C1B, 0x2493E, 0x9F5A, +0x5573, 0x5BC3, 0x4FFD, 0x9E98, +0x4FF2, 0x5260, 0x3E06, 0x52D1, +0x5767, 0x5056, 0x59B7, 0x5E12, +0x97C8, 0x9DAB, 0x8F5C, 0x5469, +0x97B4, 0x9940, 0x97BA, 0x532C, +0x6130, 0x692C, 0x53DA, 0x9C0A, +0x9D02, 0x4C3B, 0x9641, 0x6980, +0x50A6, 0x7546, 0x2176D, 0x99DA, +0x5273, 0x0000, 0x9159, 0x9681, +0x915C, 0x0000, 0x9151, 0x28E97, +0x637F, 0x26D23, 0x6ACA, 0x5611, +0x918E, 0x757A, 0x6285, 0x203FC, +0x734F, 0x7C70, 0x25C21, 0x23CFD, +0x0000, 0x24919, 0x76D6, 0x9B9D, +0x4E2A, 0x20CD4, 0x83BE, 0x8842, +0x0000, 0x5C4A, 0x69C0, 0x50ED, +0x577A, 0x521F, 0x5DF5, 0x4ECE, +0x6C31, 0x201F2, 0x4F39, 0x549C, +0x54DA, 0x529A, 0x8D82, 0x35FE, +0x5F0C, 0x35F3, 0x0000, 0x6B52, +0x917C, 0x9FA5, 0x9B97, 0x982E, +0x98B4, 0x9ABA, 0x9EA8, 0x9E84, +0x717A, 0x7B14, 0x0000, 0x6BFA, +0x8818, 0x7F78, 0x0000, 0x5620, +0x2A64A, 0x8E77, 0x9F53, 0x0000, +0x8DD4, 0x8E4F, 0x9E1C, 0x8E01, +0x6282, 0x2837D, 0x8E28, 0x8E75, +0x7AD3, 0x24A77, 0x7A3E, 0x78D8, +0x6CEA, 0x8A67, 0x7607, 0x28A5A, +0x9F26, 0x6CCE, 0x87D6, 0x75C3, +0x2A2B2, 0x7853, 0x2F840, 0x8D0C, +0x72E2, 0x7371, 0x8B2D, 0x7302, +0x74F1, 0x8CEB, 0x24ABB, 0x862F, +0x5FBA, 0x88A0, 0x44B7, 0x0000, +0x2183B, 0x26E05, 0x0000, 0x8A7E, +0x2251B, 0x0000, 0x60FD, 0x7667, +0x9AD7, 0x9D44, 0x936E, 0x9B8F, +0x87F5, 0x0000, 0x880F, 0x8CF7, +0x732C, 0x9721, 0x9BB0, 0x35D6, +0x72B2, 0x4C07, 0x7C51, 0x994A, +0x26159, 0x6159, 0x4C04, 0x9E96, +0x617D, 0x0000, 0x575F, 0x616F, +0x62A6, 0x6239, 0x62CE, 0x3A5C, +0x61E2, 0x53AA, 0x233F5, 0x6364, +0x6802, 0x35D2, 0x5D57, 0x28BC2, +0x8FDA, 0x28E39, 0x0000, 0x50D9, +0x21D46, 0x7906, 0x5332, 0x9638, +0x20F3B, 0x4065, 0x0000, 0x77FE, +0x0000, 0x7CC2, 0x25F1A, 0x7CDA, +0x7A2D, 0x8066, 0x8063, 0x7D4D, +0x7505, 0x74F2, 0x8994, 0x821A, +0x670C, 0x8062, 0x27486, 0x805B, +0x74F0, 0x8103, 0x7724, 0x8989, +0x267CC, 0x7553, 0x26ED1, 0x87A9, +0x87CE, 0x81C8, 0x878C, 0x8A49, +0x8CAD, 0x8B43, 0x772B, 0x74F8, +0x84DA, 0x3635, 0x69B2, 0x8DA6, +0x0000, 0x89A9, 0x7468, 0x6DB9, +0x87C1, 0x24011, 0x74E7, 0x3DDB, +0x7176, 0x60A4, 0x619C, 0x3CD1, +0x7162, 0x6077, 0x0000, 0x7F71, +0x28B2D, 0x7250, 0x60E9, 0x4B7E, +0x5220, 0x3C18, 0x23CC7, 0x25ED7, +0x27656, 0x25531, 0x21944, 0x212FE, +0x29903, 0x26DDC, 0x270AD, 0x5CC1, +0x261AD, 0x28A0F, 0x23677, 0x200EE, +0x26846, 0x24F0E, 0x4562, 0x5B1F, +0x2634C, 0x9F50, 0x9EA6, 0x2626B, +0x3000, 0xFF0C, 0x3001, 0x3002, +0xFF0E, 0x2027, 0xFF1B, 0xFF1A, +0xFF1F, 0xFF01, 0xFE30, 0x2026, +0x2025, 0xFE50, 0xFE51, 0xFE52, +0x00B7, 0xFE54, 0xFE55, 0xFE56, +0xFE57, 0xFF5C, 0x2013, 0xFE31, +0x2014, 0xFE33, 0x2574, 0xFE34, +0xFE4F, 0xFF08, 0xFF09, 0xFE35, +0xFE36, 0xFF5B, 0xFF5D, 0xFE37, +0xFE38, 0x3014, 0x3015, 0xFE39, +0xFE3A, 0x3010, 0x3011, 0xFE3B, +0xFE3C, 0x300A, 0x300B, 0xFE3D, +0xFE3E, 0x3008, 0x3009, 0xFE3F, +0xFE40, 0x300C, 0x300D, 0xFE41, +0xFE42, 0x300E, 0x300F, 0xFE43, +0xFE44, 0xFE59, 0xFE5A, 0xFE5B, +0xFE5C, 0xFE5D, 0xFE5E, 0x2018, +0x2019, 0x201C, 0x201D, 0x301D, +0x301E, 0x2035, 0x2032, 0xFF03, +0xFF06, 0xFF0A, 0x203B, 0x00A7, +0x3003, 0x25CB, 0x25CF, 0x25B3, +0x25B2, 0x25CE, 0x2606, 0x2605, +0x25C7, 0x25C6, 0x25A1, 0x25A0, +0x25BD, 0x25BC, 0x32A3, 0x2105, +0x00AF, 0xFFE3, 0xFF3F, 0x02CD, +0xFE49, 0xFE4A, 0xFE4D, 0xFE4E, +0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, +0xFE61, 0xFF0B, 0xFF0D, 0x00D7, +0x00F7, 0x00B1, 0x221A, 0xFF1C, +0xFF1E, 0xFF1D, 0x2266, 0x2267, +0x2260, 0x221E, 0x2252, 0x2261, +0xFE62, 0xFE63, 0xFE64, 0xFE65, +0xFE66, 0xFF5E, 0x2229, 0x222A, +0x22A5, 0x2220, 0x221F, 0x22BF, +0x33D2, 0x33D1, 0x222B, 0x222E, +0x2235, 0x2234, 0x2640, 0x2642, +0x2295, 0x2299, 0x2191, 0x2193, +0x2190, 0x2192, 0x2196, 0x2197, +0x2199, 0x2198, 0x2225, 0x2223, +0xFF0F, 0xFF3C, 0x2215, 0xFE68, +0xFF04, 0xFFE5, 0x3012, 0xFFE0, +0xFFE1, 0xFF05, 0xFF20, 0x2103, +0x2109, 0xFE69, 0xFE6A, 0xFE6B, +0x33D5, 0x339C, 0x339D, 0x339E, +0x33CE, 0x33A1, 0x338E, 0x338F, +0x33C4, 0x00B0, 0x5159, 0x515B, +0x515E, 0x515D, 0x5161, 0x5163, +0x55E7, 0x74E9, 0x7CCE, 0x2581, +0x2582, 0x2583, 0x2584, 0x2585, +0x2586, 0x2587, 0x2588, 0x258F, +0x258E, 0x258D, 0x258C, 0x258B, +0x258A, 0x2589, 0x253C, 0x2534, +0x252C, 0x2524, 0x251C, 0x2594, +0x2500, 0x2502, 0x2595, 0x250C, +0x2510, 0x2514, 0x2518, 0x256D, +0x256E, 0x2570, 0x256F, 0x2550, +0x255E, 0x256A, 0x2561, 0x25E2, +0x25E3, 0x25E5, 0x25E4, 0x2571, +0x2572, 0x2573, 0xFF10, 0xFF11, +0xFF12, 0xFF13, 0xFF14, 0xFF15, +0xFF16, 0xFF17, 0xFF18, 0xFF19, +0x2160, 0x2161, 0x2162, 0x2163, +0x2164, 0x2165, 0x2166, 0x2167, +0x2168, 0x2169, 0x3021, 0x3022, +0x3023, 0x3024, 0x3025, 0x3026, +0x3027, 0x3028, 0x3029, 0x5341, +0x5344, 0x5345, 0xFF21, 0xFF22, +0xFF23, 0xFF24, 0xFF25, 0xFF26, +0xFF27, 0xFF28, 0xFF29, 0xFF2A, +0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, +0xFF2F, 0xFF30, 0xFF31, 0xFF32, +0xFF33, 0xFF34, 0xFF35, 0xFF36, +0xFF37, 0xFF38, 0xFF39, 0xFF3A, +0xFF41, 0xFF42, 0xFF43, 0xFF44, +0xFF45, 0xFF46, 0xFF47, 0xFF48, +0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, +0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, +0xFF51, 0xFF52, 0xFF53, 0xFF54, +0xFF55, 0xFF56, 0xFF57, 0xFF58, +0xFF59, 0xFF5A, 0x0391, 0x0392, +0x0393, 0x0394, 0x0395, 0x0396, +0x0397, 0x0398, 0x0399, 0x039A, +0x039B, 0x039C, 0x039D, 0x039E, +0x039F, 0x03A0, 0x03A1, 0x03A3, +0x03A4, 0x03A5, 0x03A6, 0x03A7, +0x03A8, 0x03A9, 0x03B1, 0x03B2, +0x03B3, 0x03B4, 0x03B5, 0x03B6, +0x03B7, 0x03B8, 0x03B9, 0x03BA, +0x03BB, 0x03BC, 0x03BD, 0x03BE, +0x03BF, 0x03C0, 0x03C1, 0x03C3, +0x03C4, 0x03C5, 0x03C6, 0x03C7, +0x03C8, 0x03C9, 0x3105, 0x3106, +0x3107, 0x3108, 0x3109, 0x310A, +0x310B, 0x310C, 0x310D, 0x310E, +0x310F, 0x3110, 0x3111, 0x3112, +0x3113, 0x3114, 0x3115, 0x3116, +0x3117, 0x3118, 0x3119, 0x311A, +0x311B, 0x311C, 0x311D, 0x311E, +0x311F, 0x3120, 0x3121, 0x3122, +0x3123, 0x3124, 0x3125, 0x3126, +0x3127, 0x3128, 0x3129, 0x02D9, +0x02C9, 0x02CA, 0x02C7, 0x02CB, +0x2400, 0x2401, 0x2402, 0x2403, +0x2404, 0x2405, 0x2406, 0x2407, +0x2408, 0x2409, 0x240A, 0x240B, +0x240C, 0x240D, 0x240E, 0x240F, +0x2410, 0x2411, 0x2412, 0x2413, +0x2414, 0x2415, 0x2416, 0x2417, +0x2418, 0x2419, 0x241A, 0x241B, +0x241C, 0x241D, 0x241E, 0x241F, +0x2421, 0x20AC, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x4E00, +0x4E59, 0x4E01, 0x4E03, 0x4E43, +0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, +0x513F, 0x5165, 0x516B, 0x51E0, +0x5200, 0x5201, 0x529B, 0x5315, +0x5341, 0x535C, 0x53C8, 0x4E09, +0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, +0x4E38, 0x51E1, 0x4E45, 0x4E48, +0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, +0x5140, 0x5203, 0x52FA, 0x5343, +0x53C9, 0x53E3, 0x571F, 0x58EB, +0x5915, 0x5927, 0x5973, 0x5B50, +0x5B51, 0x5B53, 0x5BF8, 0x5C0F, +0x5C22, 0x5C38, 0x5C71, 0x5DDD, +0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, +0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, +0x5F13, 0x624D, 0x4E11, 0x4E10, +0x4E0D, 0x4E2D, 0x4E30, 0x4E39, +0x4E4B, 0x5C39, 0x4E88, 0x4E91, +0x4E95, 0x4E92, 0x4E94, 0x4EA2, +0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, +0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, +0x4EC4, 0x5143, 0x5141, 0x5167, +0x516D, 0x516E, 0x516C, 0x5197, +0x51F6, 0x5206, 0x5207, 0x5208, +0x52FB, 0x52FE, 0x52FF, 0x5316, +0x5339, 0x5348, 0x5347, 0x5345, +0x535E, 0x5384, 0x53CB, 0x53CA, +0x53CD, 0x58EC, 0x5929, 0x592B, +0x592A, 0x592D, 0x5B54, 0x5C11, +0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, +0x5E7B, 0x5EFF, 0x5F14, 0x5F15, +0x5FC3, 0x6208, 0x6236, 0x624B, +0x624E, 0x652F, 0x6587, 0x6597, +0x65A4, 0x65B9, 0x65E5, 0x66F0, +0x6708, 0x6728, 0x6B20, 0x6B62, +0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, +0x6C0F, 0x6C34, 0x706B, 0x722A, +0x7236, 0x723B, 0x7247, 0x7259, +0x725B, 0x72AC, 0x738B, 0x4E19, +0x4E16, 0x4E15, 0x4E14, 0x4E18, +0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, +0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, +0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, +0x4ED9, 0x4EDE, 0x5145, 0x5144, +0x5189, 0x518A, 0x51AC, 0x51F9, +0x51FA, 0x51F8, 0x520A, 0x52A0, +0x529F, 0x5305, 0x5306, 0x5317, +0x531D, 0x4EDF, 0x534A, 0x5349, +0x5361, 0x5360, 0x536F, 0x536E, +0x53BB, 0x53EF, 0x53E4, 0x53F3, +0x53EC, 0x53EE, 0x53E9, 0x53E8, +0x53FC, 0x53F8, 0x53F5, 0x53EB, +0x53E6, 0x53EA, 0x53F2, 0x53F1, +0x53F0, 0x53E5, 0x53ED, 0x53FB, +0x56DB, 0x56DA, 0x5916, 0x592E, +0x5931, 0x5974, 0x5976, 0x5B55, +0x5B83, 0x5C3C, 0x5DE8, 0x5DE7, +0x5DE6, 0x5E02, 0x5E03, 0x5E73, +0x5E7C, 0x5F01, 0x5F18, 0x5F17, +0x5FC5, 0x620A, 0x6253, 0x6254, +0x6252, 0x6251, 0x65A5, 0x65E6, +0x672E, 0x672C, 0x672A, 0x672B, +0x672D, 0x6B63, 0x6BCD, 0x6C11, +0x6C10, 0x6C38, 0x6C41, 0x6C40, +0x6C3E, 0x72AF, 0x7384, 0x7389, +0x74DC, 0x74E6, 0x7518, 0x751F, +0x7528, 0x7529, 0x7530, 0x7531, +0x7532, 0x7533, 0x758B, 0x767D, +0x76AE, 0x76BF, 0x76EE, 0x77DB, +0x77E2, 0x77F3, 0x793A, 0x79BE, +0x7A74, 0x7ACB, 0x4E1E, 0x4E1F, +0x4E52, 0x4E53, 0x4E69, 0x4E99, +0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF, +0x4F09, 0x4F19, 0x4F0A, 0x4F15, +0x4F0D, 0x4F10, 0x4F11, 0x4F0F, +0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, +0x4EF3, 0x4EFD, 0x4F01, 0x4F0B, +0x5149, 0x5147, 0x5146, 0x5148, +0x5168, 0x5171, 0x518D, 0x51B0, +0x5217, 0x5211, 0x5212, 0x520E, +0x5216, 0x52A3, 0x5308, 0x5321, +0x5320, 0x5370, 0x5371, 0x5409, +0x540F, 0x540C, 0x540A, 0x5410, +0x5401, 0x540B, 0x5404, 0x5411, +0x540D, 0x5408, 0x5403, 0x540E, +0x5406, 0x5412, 0x56E0, 0x56DE, +0x56DD, 0x5733, 0x5730, 0x5728, +0x572D, 0x572C, 0x572F, 0x5729, +0x5919, 0x591A, 0x5937, 0x5938, +0x5984, 0x5978, 0x5983, 0x597D, +0x5979, 0x5982, 0x5981, 0x5B57, +0x5B58, 0x5B87, 0x5B88, 0x5B85, +0x5B89, 0x5BFA, 0x5C16, 0x5C79, +0x5DDE, 0x5E06, 0x5E76, 0x5E74, +0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, +0x620E, 0x620C, 0x620D, 0x6210, +0x6263, 0x625B, 0x6258, 0x6536, +0x65E9, 0x65E8, 0x65EC, 0x65ED, +0x66F2, 0x66F3, 0x6709, 0x673D, +0x6734, 0x6731, 0x6735, 0x6B21, +0x6B64, 0x6B7B, 0x6C16, 0x6C5D, +0x6C57, 0x6C59, 0x6C5F, 0x6C60, +0x6C50, 0x6C55, 0x6C61, 0x6C5B, +0x6C4D, 0x6C4E, 0x7070, 0x725F, +0x725D, 0x767E, 0x7AF9, 0x7C73, +0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, +0x8001, 0x8003, 0x800C, 0x8012, +0x8033, 0x807F, 0x8089, 0x808B, +0x808C, 0x81E3, 0x81EA, 0x81F3, +0x81FC, 0x820C, 0x821B, 0x821F, +0x826E, 0x8272, 0x827E, 0x866B, +0x8840, 0x884C, 0x8863, 0x897F, +0x9621, 0x4E32, 0x4EA8, 0x4F4D, +0x4F4F, 0x4F47, 0x4F57, 0x4F5E, +0x4F34, 0x4F5B, 0x4F55, 0x4F30, +0x4F50, 0x4F51, 0x4F3D, 0x4F3A, +0x4F38, 0x4F43, 0x4F54, 0x4F3C, +0x4F46, 0x4F63, 0x4F5C, 0x4F60, +0x4F2F, 0x4F4E, 0x4F36, 0x4F59, +0x4F5D, 0x4F48, 0x4F5A, 0x514C, +0x514B, 0x514D, 0x5175, 0x51B6, +0x51B7, 0x5225, 0x5224, 0x5229, +0x522A, 0x5228, 0x52AB, 0x52A9, +0x52AA, 0x52AC, 0x5323, 0x5373, +0x5375, 0x541D, 0x542D, 0x541E, +0x543E, 0x5426, 0x544E, 0x5427, +0x5446, 0x5443, 0x5433, 0x5448, +0x5442, 0x541B, 0x5429, 0x544A, +0x5439, 0x543B, 0x5438, 0x542E, +0x5435, 0x5436, 0x5420, 0x543C, +0x5440, 0x5431, 0x542B, 0x541F, +0x542C, 0x56EA, 0x56F0, 0x56E4, +0x56EB, 0x574A, 0x5751, 0x5740, +0x574D, 0x5747, 0x574E, 0x573E, +0x5750, 0x574F, 0x573B, 0x58EF, +0x593E, 0x599D, 0x5992, 0x59A8, +0x599E, 0x59A3, 0x5999, 0x5996, +0x598D, 0x59A4, 0x5993, 0x598A, +0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, +0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, +0x5C2C, 0x5C40, 0x5C41, 0x5C3F, +0x5C3E, 0x5C90, 0x5C91, 0x5C94, +0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, +0x5E87, 0x5E8A, 0x5EF7, 0x5F04, +0x5F1F, 0x5F64, 0x5F62, 0x5F77, +0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, +0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, +0x5FEA, 0x6212, 0x6211, 0x6284, +0x6297, 0x6296, 0x6280, 0x6276, +0x6289, 0x626D, 0x628A, 0x627C, +0x627E, 0x6279, 0x6273, 0x6292, +0x626F, 0x6298, 0x626E, 0x6295, +0x6293, 0x6291, 0x6286, 0x6539, +0x653B, 0x6538, 0x65F1, 0x66F4, +0x675F, 0x674E, 0x674F, 0x6750, +0x6751, 0x675C, 0x6756, 0x675E, +0x6749, 0x6746, 0x6760, 0x6753, +0x6757, 0x6B65, 0x6BCF, 0x6C42, +0x6C5E, 0x6C99, 0x6C81, 0x6C88, +0x6C89, 0x6C85, 0x6C9B, 0x6C6A, +0x6C7A, 0x6C90, 0x6C70, 0x6C8C, +0x6C68, 0x6C96, 0x6C92, 0x6C7D, +0x6C83, 0x6C72, 0x6C7E, 0x6C74, +0x6C86, 0x6C76, 0x6C8D, 0x6C94, +0x6C98, 0x6C82, 0x7076, 0x707C, +0x707D, 0x7078, 0x7262, 0x7261, +0x7260, 0x72C4, 0x72C2, 0x7396, +0x752C, 0x752B, 0x7537, 0x7538, +0x7682, 0x76EF, 0x77E3, 0x79C1, +0x79C0, 0x79BF, 0x7A76, 0x7CFB, +0x7F55, 0x8096, 0x8093, 0x809D, +0x8098, 0x809B, 0x809A, 0x80B2, +0x826F, 0x8292, 0x828B, 0x828D, +0x898B, 0x89D2, 0x8A00, 0x8C37, +0x8C46, 0x8C55, 0x8C9D, 0x8D64, +0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, +0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6, +0x8FC5, 0x8FC4, 0x5DE1, 0x9091, +0x90A2, 0x90AA, 0x90A6, 0x90A3, +0x9149, 0x91C6, 0x91CC, 0x9632, +0x962E, 0x9631, 0x962A, 0x962C, +0x4E26, 0x4E56, 0x4E73, 0x4E8B, +0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC, +0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, +0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B, +0x4F86, 0x4F83, 0x4F70, 0x4F75, +0x4F88, 0x4F69, 0x4F7B, 0x4F96, +0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, +0x5154, 0x5152, 0x5155, 0x5169, +0x5177, 0x5176, 0x5178, 0x51BD, +0x51FD, 0x523B, 0x5238, 0x5237, +0x523A, 0x5230, 0x522E, 0x5236, +0x5241, 0x52BE, 0x52BB, 0x5352, +0x5354, 0x5353, 0x5351, 0x5366, +0x5377, 0x5378, 0x5379, 0x53D6, +0x53D4, 0x53D7, 0x5473, 0x5475, +0x5496, 0x5478, 0x5495, 0x5480, +0x547B, 0x5477, 0x5484, 0x5492, +0x5486, 0x547C, 0x5490, 0x5471, +0x5476, 0x548C, 0x549A, 0x5462, +0x5468, 0x548B, 0x547D, 0x548E, +0x56FA, 0x5783, 0x5777, 0x576A, +0x5769, 0x5761, 0x5766, 0x5764, +0x577C, 0x591C, 0x5949, 0x5947, +0x5948, 0x5944, 0x5954, 0x59BE, +0x59BB, 0x59D4, 0x59B9, 0x59AE, +0x59D1, 0x59C6, 0x59D0, 0x59CD, +0x59CB, 0x59D3, 0x59CA, 0x59AF, +0x59B3, 0x59D2, 0x59C5, 0x5B5F, +0x5B64, 0x5B63, 0x5B97, 0x5B9A, +0x5B98, 0x5B9C, 0x5B99, 0x5B9B, +0x5C1A, 0x5C48, 0x5C45, 0x5C46, +0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, +0x5CAB, 0x5CB1, 0x5CB3, 0x5E18, +0x5E1A, 0x5E16, 0x5E15, 0x5E1B, +0x5E11, 0x5E78, 0x5E9A, 0x5E97, +0x5E9C, 0x5E95, 0x5E96, 0x5EF6, +0x5F26, 0x5F27, 0x5F29, 0x5F80, +0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, +0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, +0x600F, 0x6014, 0x602F, 0x6035, +0x6016, 0x602A, 0x6015, 0x6021, +0x6027, 0x6029, 0x602B, 0x601B, +0x6216, 0x6215, 0x623F, 0x623E, +0x6240, 0x627F, 0x62C9, 0x62CC, +0x62C4, 0x62BF, 0x62C2, 0x62B9, +0x62D2, 0x62DB, 0x62AB, 0x62D3, +0x62D4, 0x62CB, 0x62C8, 0x62A8, +0x62BD, 0x62BC, 0x62D0, 0x62D9, +0x62C7, 0x62CD, 0x62B5, 0x62DA, +0x62B1, 0x62D8, 0x62D6, 0x62D7, +0x62C6, 0x62AC, 0x62CE, 0x653E, +0x65A7, 0x65BC, 0x65FA, 0x6614, +0x6613, 0x660C, 0x6606, 0x6602, +0x660E, 0x6600, 0x660F, 0x6615, +0x660A, 0x6607, 0x670D, 0x670B, +0x676D, 0x678B, 0x6795, 0x6771, +0x679C, 0x6773, 0x6777, 0x6787, +0x679D, 0x6797, 0x676F, 0x6770, +0x677F, 0x6789, 0x677E, 0x6790, +0x6775, 0x679A, 0x6793, 0x677C, +0x676A, 0x6772, 0x6B23, 0x6B66, +0x6B67, 0x6B7F, 0x6C13, 0x6C1B, +0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, +0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, +0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, +0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, +0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, +0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, +0x6CE1, 0x6CDB, 0x6CCA, 0x6CAC, +0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, +0x7095, 0x708E, 0x7092, 0x708A, +0x7099, 0x722C, 0x722D, 0x7238, +0x7248, 0x7267, 0x7269, 0x72C0, +0x72CE, 0x72D9, 0x72D7, 0x72D0, +0x73A9, 0x73A8, 0x739F, 0x73AB, +0x73A5, 0x753D, 0x759D, 0x7599, +0x759A, 0x7684, 0x76C2, 0x76F2, +0x76F4, 0x77E5, 0x77FD, 0x793E, +0x7940, 0x7941, 0x79C9, 0x79C8, +0x7A7A, 0x7A79, 0x7AFA, 0x7CFE, +0x7F54, 0x7F8C, 0x7F8B, 0x8005, +0x80BA, 0x80A5, 0x80A2, 0x80B1, +0x80A1, 0x80AB, 0x80A9, 0x80B4, +0x80AA, 0x80AF, 0x81E5, 0x81FE, +0x820D, 0x82B3, 0x829D, 0x8299, +0x82AD, 0x82BD, 0x829F, 0x82B9, +0x82B1, 0x82AC, 0x82A5, 0x82AF, +0x82B8, 0x82A3, 0x82B0, 0x82BE, +0x82B7, 0x864E, 0x8671, 0x521D, +0x8868, 0x8ECB, 0x8FCE, 0x8FD4, +0x8FD1, 0x90B5, 0x90B8, 0x90B1, +0x90B6, 0x91C7, 0x91D1, 0x9577, +0x9580, 0x961C, 0x9640, 0x963F, +0x963B, 0x9644, 0x9642, 0x96B9, +0x96E8, 0x9752, 0x975E, 0x4E9F, +0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5, +0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, +0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6, +0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, +0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2, +0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, +0x5157, 0x5192, 0x5191, 0x51A0, +0x524E, 0x5243, 0x524A, 0x524D, +0x524C, 0x524B, 0x5247, 0x52C7, +0x52C9, 0x52C3, 0x52C1, 0x530D, +0x5357, 0x537B, 0x539A, 0x53DB, +0x54AC, 0x54C0, 0x54A8, 0x54CE, +0x54C9, 0x54B8, 0x54A6, 0x54B3, +0x54C7, 0x54C2, 0x54BD, 0x54AA, +0x54C1, 0x54C4, 0x54C8, 0x54AF, +0x54AB, 0x54B1, 0x54BB, 0x54A9, +0x54A7, 0x54BF, 0x56FF, 0x5782, +0x578B, 0x57A0, 0x57A3, 0x57A2, +0x57CE, 0x57AE, 0x5793, 0x5955, +0x5951, 0x594F, 0x594E, 0x5950, +0x59DC, 0x59D8, 0x59FF, 0x59E3, +0x59E8, 0x5A03, 0x59E5, 0x59EA, +0x59DA, 0x59E6, 0x5A01, 0x59FB, +0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, +0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, +0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, +0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, +0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, +0x5EFA, 0x5F08, 0x5F2D, 0x5F65, +0x5F88, 0x5F85, 0x5F8A, 0x5F8B, +0x5F87, 0x5F8C, 0x5F89, 0x6012, +0x601D, 0x6020, 0x6025, 0x600E, +0x6028, 0x604D, 0x6070, 0x6068, +0x6062, 0x6046, 0x6043, 0x606C, +0x606B, 0x606A, 0x6064, 0x6241, +0x62DC, 0x6316, 0x6309, 0x62FC, +0x62ED, 0x6301, 0x62EE, 0x62FD, +0x6307, 0x62F1, 0x62F7, 0x62EF, +0x62EC, 0x62FE, 0x62F4, 0x6311, +0x6302, 0x653F, 0x6545, 0x65AB, +0x65BD, 0x65E2, 0x6625, 0x662D, +0x6620, 0x6627, 0x662F, 0x661F, +0x6628, 0x6631, 0x6624, 0x66F7, +0x67FF, 0x67D3, 0x67F1, 0x67D4, +0x67D0, 0x67EC, 0x67B6, 0x67AF, +0x67F5, 0x67E9, 0x67EF, 0x67C4, +0x67D1, 0x67B4, 0x67DA, 0x67E5, +0x67B8, 0x67CF, 0x67DE, 0x67F3, +0x67B0, 0x67D9, 0x67E2, 0x67DD, +0x67D2, 0x6B6A, 0x6B83, 0x6B86, +0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, +0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, +0x6D41, 0x6D25, 0x6D0C, 0x6D31, +0x6D1E, 0x6D17, 0x6D3B, 0x6D3D, +0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, +0x6D39, 0x6D27, 0x6D38, 0x6D29, +0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, +0x70AB, 0x70BA, 0x70B3, 0x70AC, +0x70AF, 0x70AD, 0x70B8, 0x70AE, +0x70A4, 0x7230, 0x7272, 0x726F, +0x7274, 0x72E9, 0x72E0, 0x72E1, +0x73B7, 0x73CA, 0x73BB, 0x73B2, +0x73CD, 0x73C0, 0x73B3, 0x751A, +0x752D, 0x754F, 0x754C, 0x754E, +0x754B, 0x75AB, 0x75A4, 0x75A5, +0x75A2, 0x75A3, 0x7678, 0x7686, +0x7687, 0x7688, 0x76C8, 0x76C6, +0x76C3, 0x76C5, 0x7701, 0x76F9, +0x76F8, 0x7709, 0x770B, 0x76FE, +0x76FC, 0x7707, 0x77DC, 0x7802, +0x7814, 0x780C, 0x780D, 0x7946, +0x7949, 0x7948, 0x7947, 0x79B9, +0x79BA, 0x79D1, 0x79D2, 0x79CB, +0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, +0x7C7D, 0x7D02, 0x7D05, 0x7D00, +0x7D09, 0x7D07, 0x7D04, 0x7D06, +0x7F38, 0x7F8E, 0x7FBF, 0x8004, +0x8010, 0x800D, 0x8011, 0x8036, +0x80D6, 0x80E5, 0x80DA, 0x80C3, +0x80C4, 0x80CC, 0x80E1, 0x80DB, +0x80CE, 0x80DE, 0x80E4, 0x80DD, +0x81F4, 0x8222, 0x82E7, 0x8303, +0x8305, 0x82E3, 0x82DB, 0x82E6, +0x8304, 0x82E5, 0x8302, 0x8309, +0x82D2, 0x82D7, 0x82F1, 0x8301, +0x82DC, 0x82D4, 0x82D1, 0x82DE, +0x82D3, 0x82DF, 0x82EF, 0x8306, +0x8650, 0x8679, 0x867B, 0x867A, +0x884D, 0x886B, 0x8981, 0x89D4, +0x8A08, 0x8A02, 0x8A03, 0x8C9E, +0x8CA0, 0x8D74, 0x8D73, 0x8DB4, +0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, +0x8FE2, 0x8FEA, 0x8FE5, 0x8FED, +0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, +0x90CE, 0x90C1, 0x90C3, 0x914B, +0x914A, 0x91CD, 0x9582, 0x9650, +0x964B, 0x964C, 0x964D, 0x9762, +0x9769, 0x97CB, 0x97ED, 0x97F3, +0x9801, 0x98A8, 0x98DB, 0x98DF, +0x9996, 0x9999, 0x4E58, 0x4EB3, +0x500C, 0x500D, 0x5023, 0x4FEF, +0x5026, 0x5025, 0x4FF8, 0x5029, +0x5016, 0x5006, 0x503C, 0x501F, +0x501A, 0x5012, 0x5011, 0x4FFA, +0x5000, 0x5014, 0x5028, 0x4FF1, +0x5021, 0x500B, 0x5019, 0x5018, +0x4FF3, 0x4FEE, 0x502D, 0x502A, +0x4FFE, 0x502B, 0x5009, 0x517C, +0x51A4, 0x51A5, 0x51A2, 0x51CD, +0x51CC, 0x51C6, 0x51CB, 0x5256, +0x525C, 0x5254, 0x525B, 0x525D, +0x532A, 0x537F, 0x539F, 0x539D, +0x53DF, 0x54E8, 0x5510, 0x5501, +0x5537, 0x54FC, 0x54E5, 0x54F2, +0x5506, 0x54FA, 0x5514, 0x54E9, +0x54ED, 0x54E1, 0x5509, 0x54EE, +0x54EA, 0x54E6, 0x5527, 0x5507, +0x54FD, 0x550F, 0x5703, 0x5704, +0x57C2, 0x57D4, 0x57CB, 0x57C3, +0x5809, 0x590F, 0x5957, 0x5958, +0x595A, 0x5A11, 0x5A18, 0x5A1C, +0x5A1F, 0x5A1B, 0x5A13, 0x59EC, +0x5A20, 0x5A23, 0x5A29, 0x5A25, +0x5A0C, 0x5A09, 0x5B6B, 0x5C58, +0x5BB0, 0x5BB3, 0x5BB6, 0x5BB4, +0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, +0x5C04, 0x5C51, 0x5C55, 0x5C50, +0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, +0x5CE8, 0x5CF0, 0x5CF6, 0x5D01, +0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, +0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, +0x5F92, 0x5F91, 0x5F90, 0x6059, +0x6063, 0x6065, 0x6050, 0x6055, +0x606D, 0x6069, 0x606F, 0x6084, +0x609F, 0x609A, 0x608D, 0x6094, +0x608C, 0x6085, 0x6096, 0x6247, +0x62F3, 0x6308, 0x62FF, 0x634E, +0x633E, 0x632F, 0x6355, 0x6342, +0x6346, 0x634F, 0x6349, 0x633A, +0x6350, 0x633D, 0x632A, 0x632B, +0x6328, 0x634D, 0x634C, 0x6548, +0x6549, 0x6599, 0x65C1, 0x65C5, +0x6642, 0x6649, 0x664F, 0x6643, +0x6652, 0x664C, 0x6645, 0x6641, +0x66F8, 0x6714, 0x6715, 0x6717, +0x6821, 0x6838, 0x6848, 0x6846, +0x6853, 0x6839, 0x6842, 0x6854, +0x6829, 0x68B3, 0x6817, 0x684C, +0x6851, 0x683D, 0x67F4, 0x6850, +0x6840, 0x683C, 0x6843, 0x682A, +0x6845, 0x6813, 0x6818, 0x6841, +0x6B8A, 0x6B89, 0x6BB7, 0x6C23, +0x6C27, 0x6C28, 0x6C26, 0x6C24, +0x6CF0, 0x6D6A, 0x6D95, 0x6D88, +0x6D87, 0x6D66, 0x6D78, 0x6D77, +0x6D59, 0x6D93, 0x6D6C, 0x6D89, +0x6D6E, 0x6D5A, 0x6D74, 0x6D69, +0x6D8C, 0x6D8A, 0x6D79, 0x6D85, +0x6D65, 0x6D94, 0x70CA, 0x70D8, +0x70E4, 0x70D9, 0x70C8, 0x70CF, +0x7239, 0x7279, 0x72FC, 0x72F9, +0x72FD, 0x72F8, 0x72F7, 0x7386, +0x73ED, 0x7409, 0x73EE, 0x73E0, +0x73EA, 0x73DE, 0x7554, 0x755D, +0x755C, 0x755A, 0x7559, 0x75BE, +0x75C5, 0x75C7, 0x75B2, 0x75B3, +0x75BD, 0x75BC, 0x75B9, 0x75C2, +0x75B8, 0x768B, 0x76B0, 0x76CA, +0x76CD, 0x76CE, 0x7729, 0x771F, +0x7720, 0x7728, 0x77E9, 0x7830, +0x7827, 0x7838, 0x781D, 0x7834, +0x7837, 0x7825, 0x782D, 0x7820, +0x781F, 0x7832, 0x7955, 0x7950, +0x7960, 0x795F, 0x7956, 0x795E, +0x795D, 0x7957, 0x795A, 0x79E4, +0x79E3, 0x79E7, 0x79DF, 0x79E6, +0x79E9, 0x79D8, 0x7A84, 0x7A88, +0x7AD9, 0x7B06, 0x7B11, 0x7C89, +0x7D21, 0x7D17, 0x7D0B, 0x7D0A, +0x7D20, 0x7D22, 0x7D14, 0x7D10, +0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, +0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, +0x7F94, 0x7FC5, 0x7FC1, 0x8006, +0x8018, 0x8015, 0x8019, 0x8017, +0x803D, 0x803F, 0x80F1, 0x8102, +0x80F0, 0x8105, 0x80ED, 0x80F4, +0x8106, 0x80F8, 0x80F3, 0x8108, +0x80FD, 0x810A, 0x80FC, 0x80EF, +0x81ED, 0x81EC, 0x8200, 0x8210, +0x822A, 0x822B, 0x8228, 0x822C, +0x82BB, 0x832B, 0x8352, 0x8354, +0x834A, 0x8338, 0x8350, 0x8349, +0x8335, 0x8334, 0x834F, 0x8332, +0x8339, 0x8336, 0x8317, 0x8340, +0x8331, 0x8328, 0x8343, 0x8654, +0x868A, 0x86AA, 0x8693, 0x86A4, +0x86A9, 0x868C, 0x86A3, 0x869C, +0x8870, 0x8877, 0x8881, 0x8882, +0x887D, 0x8879, 0x8A18, 0x8A10, +0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, +0x8A17, 0x8A13, 0x8A16, 0x8A0F, +0x8A11, 0x8C48, 0x8C7A, 0x8C79, +0x8CA1, 0x8CA2, 0x8D77, 0x8EAC, +0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, +0x9001, 0x9006, 0x8FF7, 0x9000, +0x8FFA, 0x8FF4, 0x9003, 0x8FFD, +0x9005, 0x8FF8, 0x9095, 0x90E1, +0x90DD, 0x90E2, 0x9152, 0x914D, +0x914C, 0x91D8, 0x91DD, 0x91D7, +0x91DC, 0x91D9, 0x9583, 0x9662, +0x9663, 0x9661, 0x965B, 0x965D, +0x9664, 0x9658, 0x965E, 0x96BB, +0x98E2, 0x99AC, 0x9AA8, 0x9AD8, +0x9B25, 0x9B32, 0x9B3C, 0x4E7E, +0x507A, 0x507D, 0x505C, 0x5047, +0x5043, 0x504C, 0x505A, 0x5049, +0x5065, 0x5076, 0x504E, 0x5055, +0x5075, 0x5074, 0x5077, 0x504F, +0x500F, 0x506F, 0x506D, 0x515C, +0x5195, 0x51F0, 0x526A, 0x526F, +0x52D2, 0x52D9, 0x52D8, 0x52D5, +0x5310, 0x530F, 0x5319, 0x533F, +0x5340, 0x533E, 0x53C3, 0x66FC, +0x5546, 0x556A, 0x5566, 0x5544, +0x555E, 0x5561, 0x5543, 0x554A, +0x5531, 0x5556, 0x554F, 0x5555, +0x552F, 0x5564, 0x5538, 0x552E, +0x555C, 0x552C, 0x5563, 0x5533, +0x5541, 0x5557, 0x5708, 0x570B, +0x5709, 0x57DF, 0x5805, 0x580A, +0x5806, 0x57E0, 0x57E4, 0x57FA, +0x5802, 0x5835, 0x57F7, 0x57F9, +0x5920, 0x5962, 0x5A36, 0x5A41, +0x5A49, 0x5A66, 0x5A6A, 0x5A40, +0x5A3C, 0x5A62, 0x5A5A, 0x5A46, +0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, +0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, +0x5C09, 0x5C08, 0x5C07, 0x5C60, +0x5C5C, 0x5C5D, 0x5D07, 0x5D06, +0x5D0E, 0x5D1B, 0x5D16, 0x5D22, +0x5D11, 0x5D29, 0x5D14, 0x5D19, +0x5D24, 0x5D27, 0x5D17, 0x5DE2, +0x5E38, 0x5E36, 0x5E33, 0x5E37, +0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, +0x5EBE, 0x5F35, 0x5F37, 0x5F57, +0x5F6C, 0x5F69, 0x5F6B, 0x5F97, +0x5F99, 0x5F9E, 0x5F98, 0x5FA1, +0x5FA0, 0x5F9C, 0x607F, 0x60A3, +0x6089, 0x60A0, 0x60A8, 0x60CB, +0x60B4, 0x60E6, 0x60BD, 0x60C5, +0x60BB, 0x60B5, 0x60DC, 0x60BC, +0x60D8, 0x60D5, 0x60C6, 0x60DF, +0x60B8, 0x60DA, 0x60C7, 0x621A, +0x621B, 0x6248, 0x63A0, 0x63A7, +0x6372, 0x6396, 0x63A2, 0x63A5, +0x6377, 0x6367, 0x6398, 0x63AA, +0x6371, 0x63A9, 0x6389, 0x6383, +0x639B, 0x636B, 0x63A8, 0x6384, +0x6388, 0x6399, 0x63A1, 0x63AC, +0x6392, 0x638F, 0x6380, 0x637B, +0x6369, 0x6368, 0x637A, 0x655D, +0x6556, 0x6551, 0x6559, 0x6557, +0x555F, 0x654F, 0x6558, 0x6555, +0x6554, 0x659C, 0x659B, 0x65AC, +0x65CF, 0x65CB, 0x65CC, 0x65CE, +0x665D, 0x665A, 0x6664, 0x6668, +0x6666, 0x665E, 0x66F9, 0x52D7, +0x671B, 0x6881, 0x68AF, 0x68A2, +0x6893, 0x68B5, 0x687F, 0x6876, +0x68B1, 0x68A7, 0x6897, 0x68B0, +0x6883, 0x68C4, 0x68AD, 0x6886, +0x6885, 0x6894, 0x689D, 0x68A8, +0x689F, 0x68A1, 0x6882, 0x6B32, +0x6BBA, 0x6BEB, 0x6BEC, 0x6C2B, +0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, +0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, +0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, +0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, +0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, +0x6DF5, 0x6DC5, 0x6DD2, 0x6E1A, +0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, +0x6DEA, 0x6DF1, 0x6DEE, 0x6DE8, +0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, +0x6DBF, 0x6DE6, 0x70F9, 0x7109, +0x710A, 0x70FD, 0x70EF, 0x723D, +0x727D, 0x7281, 0x731C, 0x731B, +0x7316, 0x7313, 0x7319, 0x7387, +0x7405, 0x740A, 0x7403, 0x7406, +0x73FE, 0x740D, 0x74E0, 0x74F6, +0x74F7, 0x751C, 0x7522, 0x7565, +0x7566, 0x7562, 0x7570, 0x758F, +0x75D4, 0x75D5, 0x75B5, 0x75CA, +0x75CD, 0x768E, 0x76D4, 0x76D2, +0x76DB, 0x7737, 0x773E, 0x773C, +0x7736, 0x7738, 0x773A, 0x786B, +0x7843, 0x784E, 0x7965, 0x7968, +0x796D, 0x79FB, 0x7A92, 0x7A95, +0x7B20, 0x7B28, 0x7B1B, 0x7B2C, +0x7B26, 0x7B19, 0x7B1E, 0x7B2E, +0x7C92, 0x7C97, 0x7C95, 0x7D46, +0x7D43, 0x7D71, 0x7D2E, 0x7D39, +0x7D3C, 0x7D40, 0x7D30, 0x7D33, +0x7D44, 0x7D2F, 0x7D42, 0x7D32, +0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, +0x7FCC, 0x7FCE, 0x7FD2, 0x801C, +0x804A, 0x8046, 0x812F, 0x8116, +0x8123, 0x812B, 0x8129, 0x8130, +0x8124, 0x8202, 0x8235, 0x8237, +0x8236, 0x8239, 0x838E, 0x839E, +0x8398, 0x8378, 0x83A2, 0x8396, +0x83BD, 0x83AB, 0x8392, 0x838A, +0x8393, 0x8389, 0x83A0, 0x8377, +0x837B, 0x837C, 0x8386, 0x83A7, +0x8655, 0x5F6A, 0x86C7, 0x86C0, +0x86B6, 0x86C4, 0x86B5, 0x86C6, +0x86CB, 0x86B1, 0x86AF, 0x86C9, +0x8853, 0x889E, 0x8888, 0x88AB, +0x8892, 0x8896, 0x888D, 0x888B, +0x8993, 0x898F, 0x8A2A, 0x8A1D, +0x8A23, 0x8A25, 0x8A31, 0x8A2D, +0x8A1F, 0x8A1B, 0x8A22, 0x8C49, +0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, +0x8CA8, 0x8CAA, 0x8CA7, 0x8D67, +0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, +0x8EDF, 0x9019, 0x900D, 0x901A, +0x9017, 0x9023, 0x901F, 0x901D, +0x9010, 0x9015, 0x901E, 0x9020, +0x900F, 0x9022, 0x9016, 0x901B, +0x9014, 0x90E8, 0x90ED, 0x90FD, +0x9157, 0x91CE, 0x91F5, 0x91E6, +0x91E3, 0x91E7, 0x91ED, 0x91E9, +0x9589, 0x966A, 0x9675, 0x9673, +0x9678, 0x9670, 0x9674, 0x9676, +0x9677, 0x966C, 0x96C0, 0x96EA, +0x96E9, 0x7AE0, 0x7ADF, 0x9802, +0x9803, 0x9B5A, 0x9CE5, 0x9E75, +0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, +0x508D, 0x5085, 0x5099, 0x5091, +0x5080, 0x5096, 0x5098, 0x509A, +0x6700, 0x51F1, 0x5272, 0x5274, +0x5275, 0x5269, 0x52DE, 0x52DD, +0x52DB, 0x535A, 0x53A5, 0x557B, +0x5580, 0x55A7, 0x557C, 0x558A, +0x559D, 0x5598, 0x5582, 0x559C, +0x55AA, 0x5594, 0x5587, 0x558B, +0x5583, 0x55B3, 0x55AE, 0x559F, +0x553E, 0x55B2, 0x559A, 0x55BB, +0x55AC, 0x55B1, 0x557E, 0x5589, +0x55AB, 0x5599, 0x570D, 0x582F, +0x582A, 0x5834, 0x5824, 0x5830, +0x5831, 0x5821, 0x581D, 0x5820, +0x58F9, 0x58FA, 0x5960, 0x5A77, +0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, +0x5AA7, 0x5B73, 0x5B71, 0x5BD2, +0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, +0x5C0B, 0x5C31, 0x5D4C, 0x5D50, +0x5D34, 0x5D47, 0x5DFD, 0x5E45, +0x5E3D, 0x5E40, 0x5E43, 0x5E7E, +0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, +0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, +0x5FA8, 0x60D1, 0x60E1, 0x60B2, +0x60B6, 0x60E0, 0x611C, 0x6123, +0x60FA, 0x6115, 0x60F0, 0x60FB, +0x60F4, 0x6168, 0x60F1, 0x610E, +0x60F6, 0x6109, 0x6100, 0x6112, +0x621F, 0x6249, 0x63A3, 0x638C, +0x63CF, 0x63C0, 0x63E9, 0x63C9, +0x63C6, 0x63CD, 0x63D2, 0x63E3, +0x63D0, 0x63E1, 0x63D6, 0x63ED, +0x63EE, 0x6376, 0x63F4, 0x63EA, +0x63DB, 0x6452, 0x63DA, 0x63F9, +0x655E, 0x6566, 0x6562, 0x6563, +0x6591, 0x6590, 0x65AF, 0x666E, +0x6670, 0x6674, 0x6676, 0x666F, +0x6691, 0x667A, 0x667E, 0x6677, +0x66FE, 0x66FF, 0x671F, 0x671D, +0x68FA, 0x68D5, 0x68E0, 0x68D8, +0x68D7, 0x6905, 0x68DF, 0x68F5, +0x68EE, 0x68E7, 0x68F9, 0x68D2, +0x68F2, 0x68E3, 0x68CB, 0x68CD, +0x690D, 0x6912, 0x690E, 0x68C9, +0x68DA, 0x696E, 0x68FB, 0x6B3E, +0x6B3A, 0x6B3D, 0x6B98, 0x6B96, +0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, +0x6C2C, 0x6E2F, 0x6E38, 0x6E54, +0x6E21, 0x6E32, 0x6E67, 0x6E4A, +0x6E20, 0x6E25, 0x6E23, 0x6E1B, +0x6E5B, 0x6E58, 0x6E24, 0x6E56, +0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, +0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, +0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, +0x6E89, 0x6E19, 0x6E4E, 0x6E63, +0x6E44, 0x6E72, 0x6E69, 0x6E5F, +0x7119, 0x711A, 0x7126, 0x7130, +0x7121, 0x7136, 0x716E, 0x711C, +0x724C, 0x7284, 0x7280, 0x7336, +0x7325, 0x7334, 0x7329, 0x743A, +0x742A, 0x7433, 0x7422, 0x7425, +0x7435, 0x7436, 0x7434, 0x742F, +0x741B, 0x7426, 0x7428, 0x7525, +0x7526, 0x756B, 0x756A, 0x75E2, +0x75DB, 0x75E3, 0x75D9, 0x75D8, +0x75DE, 0x75E0, 0x767B, 0x767C, +0x7696, 0x7693, 0x76B4, 0x76DC, +0x774F, 0x77ED, 0x785D, 0x786C, +0x786F, 0x7A0D, 0x7A08, 0x7A0B, +0x7A05, 0x7A00, 0x7A98, 0x7A97, +0x7A96, 0x7AE5, 0x7AE3, 0x7B49, +0x7B56, 0x7B46, 0x7B50, 0x7B52, +0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, +0x7B51, 0x7C9F, 0x7CA5, 0x7D5E, +0x7D50, 0x7D68, 0x7D55, 0x7D2B, +0x7D6E, 0x7D72, 0x7D61, 0x7D66, +0x7D62, 0x7D70, 0x7D73, 0x5584, +0x7FD4, 0x7FD5, 0x800B, 0x8052, +0x8085, 0x8155, 0x8154, 0x814B, +0x8151, 0x814E, 0x8139, 0x8146, +0x813E, 0x814C, 0x8153, 0x8174, +0x8212, 0x821C, 0x83E9, 0x8403, +0x83F8, 0x840D, 0x83E0, 0x83C5, +0x840B, 0x83C1, 0x83EF, 0x83F1, +0x83F4, 0x8457, 0x840A, 0x83F0, +0x840C, 0x83CC, 0x83FD, 0x83F2, +0x83CA, 0x8438, 0x840E, 0x8404, +0x83DC, 0x8407, 0x83D4, 0x83DF, +0x865B, 0x86DF, 0x86D9, 0x86ED, +0x86D4, 0x86DB, 0x86E4, 0x86D0, +0x86DE, 0x8857, 0x88C1, 0x88C2, +0x88B1, 0x8983, 0x8996, 0x8A3B, +0x8A60, 0x8A55, 0x8A5E, 0x8A3C, +0x8A41, 0x8A54, 0x8A5B, 0x8A50, +0x8A46, 0x8A34, 0x8A3A, 0x8A36, +0x8A56, 0x8C61, 0x8C82, 0x8CAF, +0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, +0x8CBB, 0x8CC0, 0x8CB4, 0x8CB7, +0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, +0x8D85, 0x8D81, 0x8DCE, 0x8DDD, +0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, +0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8, +0x8EFC, 0x8F9C, 0x902E, 0x9035, +0x9031, 0x9038, 0x9032, 0x9036, +0x9102, 0x90F5, 0x9109, 0x90FE, +0x9163, 0x9165, 0x91CF, 0x9214, +0x9215, 0x9223, 0x9209, 0x921E, +0x920D, 0x9210, 0x9207, 0x9211, +0x9594, 0x958F, 0x958B, 0x9591, +0x9593, 0x9592, 0x958E, 0x968A, +0x968E, 0x968B, 0x967D, 0x9685, +0x9686, 0x968D, 0x9672, 0x9684, +0x96C1, 0x96C5, 0x96C4, 0x96C6, +0x96C7, 0x96EF, 0x96F2, 0x97CC, +0x9805, 0x9806, 0x9808, 0x98E7, +0x98EA, 0x98EF, 0x98E9, 0x98F2, +0x98ED, 0x99AE, 0x99AD, 0x9EC3, +0x9ECD, 0x9ED1, 0x4E82, 0x50AD, +0x50B5, 0x50B2, 0x50B3, 0x50C5, +0x50BE, 0x50AC, 0x50B7, 0x50BB, +0x50AF, 0x50C7, 0x527F, 0x5277, +0x527D, 0x52DF, 0x52E6, 0x52E4, +0x52E2, 0x52E3, 0x532F, 0x55DF, +0x55E8, 0x55D3, 0x55E6, 0x55CE, +0x55DC, 0x55C7, 0x55D1, 0x55E3, +0x55E4, 0x55EF, 0x55DA, 0x55E1, +0x55C5, 0x55C6, 0x55E5, 0x55C9, +0x5712, 0x5713, 0x585E, 0x5851, +0x5858, 0x5857, 0x585A, 0x5854, +0x586B, 0x584C, 0x586D, 0x584A, +0x5862, 0x5852, 0x584B, 0x5967, +0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, +0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, +0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, +0x5E79, 0x5EC9, 0x5EC8, 0x5F12, +0x5F59, 0x5FAC, 0x5FAE, 0x611A, +0x610F, 0x6148, 0x611F, 0x60F3, +0x611B, 0x60F9, 0x6101, 0x6108, +0x614E, 0x614C, 0x6144, 0x614D, +0x613E, 0x6134, 0x6127, 0x610D, +0x6106, 0x6137, 0x6221, 0x6222, +0x6413, 0x643E, 0x641E, 0x642A, +0x642D, 0x643D, 0x642C, 0x640F, +0x641C, 0x6414, 0x640D, 0x6436, +0x6416, 0x6417, 0x6406, 0x656C, +0x659F, 0x65B0, 0x6697, 0x6689, +0x6687, 0x6688, 0x6696, 0x6684, +0x6698, 0x668D, 0x6703, 0x6994, +0x696D, 0x695A, 0x6977, 0x6960, +0x6954, 0x6975, 0x6930, 0x6982, +0x694A, 0x6968, 0x696B, 0x695E, +0x6953, 0x6979, 0x6986, 0x695D, +0x6963, 0x695B, 0x6B47, 0x6B72, +0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD, +0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, +0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, +0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, +0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, +0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, +0x6EA7, 0x6EB4, 0x714E, 0x7159, +0x7169, 0x7164, 0x7149, 0x7167, +0x715C, 0x716C, 0x7166, 0x714C, +0x7165, 0x715E, 0x7146, 0x7168, +0x7156, 0x723A, 0x7252, 0x7337, +0x7345, 0x733F, 0x733E, 0x746F, +0x745A, 0x7455, 0x745F, 0x745E, +0x7441, 0x743F, 0x7459, 0x745B, +0x745C, 0x7576, 0x7578, 0x7600, +0x75F0, 0x7601, 0x75F2, 0x75F1, +0x75FA, 0x75FF, 0x75F4, 0x75F3, +0x76DE, 0x76DF, 0x775B, 0x776B, +0x7766, 0x775E, 0x7763, 0x7779, +0x776A, 0x776C, 0x775C, 0x7765, +0x7768, 0x7762, 0x77EE, 0x788E, +0x78B0, 0x7897, 0x7898, 0x788C, +0x7889, 0x787C, 0x7891, 0x7893, +0x787F, 0x797A, 0x797F, 0x7981, +0x842C, 0x79BD, 0x7A1C, 0x7A1A, +0x7A20, 0x7A14, 0x7A1F, 0x7A1E, +0x7A9F, 0x7AA0, 0x7B77, 0x7BC0, +0x7B60, 0x7B6E, 0x7B67, 0x7CB1, +0x7CB3, 0x7CB5, 0x7D93, 0x7D79, +0x7D91, 0x7D81, 0x7D8F, 0x7D5B, +0x7F6E, 0x7F69, 0x7F6A, 0x7F72, +0x7FA9, 0x7FA8, 0x7FA4, 0x8056, +0x8058, 0x8086, 0x8084, 0x8171, +0x8170, 0x8178, 0x8165, 0x816E, +0x8173, 0x816B, 0x8179, 0x817A, +0x8166, 0x8205, 0x8247, 0x8482, +0x8477, 0x843D, 0x8431, 0x8475, +0x8466, 0x846B, 0x8449, 0x846C, +0x845B, 0x843C, 0x8435, 0x8461, +0x8463, 0x8469, 0x846D, 0x8446, +0x865E, 0x865C, 0x865F, 0x86F9, +0x8713, 0x8708, 0x8707, 0x8700, +0x86FE, 0x86FB, 0x8702, 0x8703, +0x8706, 0x870A, 0x8859, 0x88DF, +0x88D4, 0x88D9, 0x88DC, 0x88D8, +0x88DD, 0x88E1, 0x88CA, 0x88D5, +0x88D2, 0x899C, 0x89E3, 0x8A6B, +0x8A72, 0x8A73, 0x8A66, 0x8A69, +0x8A70, 0x8A87, 0x8A7C, 0x8A63, +0x8AA0, 0x8A71, 0x8A85, 0x8A6D, +0x8A62, 0x8A6E, 0x8A6C, 0x8A79, +0x8A7B, 0x8A3E, 0x8A68, 0x8C62, +0x8C8A, 0x8C89, 0x8CCA, 0x8CC7, +0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, +0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF, +0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, +0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2, +0x8F03, 0x8F09, 0x8EFE, 0x8F0A, +0x8F9F, 0x8FB2, 0x904B, 0x904A, +0x9053, 0x9042, 0x9054, 0x903C, +0x9055, 0x9050, 0x9047, 0x904F, +0x904E, 0x904D, 0x9051, 0x903E, +0x9041, 0x9112, 0x9117, 0x916C, +0x916A, 0x9169, 0x91C9, 0x9237, +0x9257, 0x9238, 0x923D, 0x9240, +0x923E, 0x925B, 0x924B, 0x9264, +0x9251, 0x9234, 0x9249, 0x924D, +0x9245, 0x9239, 0x923F, 0x925A, +0x9598, 0x9698, 0x9694, 0x9695, +0x96CD, 0x96CB, 0x96C9, 0x96CA, +0x96F7, 0x96FB, 0x96F9, 0x96F6, +0x9756, 0x9774, 0x9776, 0x9810, +0x9811, 0x9813, 0x980A, 0x9812, +0x980C, 0x98FC, 0x98F4, 0x98FD, +0x98FE, 0x99B3, 0x99B1, 0x99B4, +0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, +0x9F13, 0x9F20, 0x50E7, 0x50EE, +0x50E5, 0x50D6, 0x50ED, 0x50DA, +0x50D5, 0x50CF, 0x50D1, 0x50F1, +0x50CE, 0x50E9, 0x5162, 0x51F3, +0x5283, 0x5282, 0x5331, 0x53AD, +0x55FE, 0x5600, 0x561B, 0x5617, +0x55FD, 0x5614, 0x5606, 0x5609, +0x560D, 0x560E, 0x55F7, 0x5616, +0x561F, 0x5608, 0x5610, 0x55F6, +0x5718, 0x5716, 0x5875, 0x587E, +0x5883, 0x5893, 0x588A, 0x5879, +0x5885, 0x587D, 0x58FD, 0x5925, +0x5922, 0x5924, 0x596A, 0x5969, +0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, +0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, +0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, +0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, +0x5BDF, 0x5C0D, 0x5C62, 0x5D84, +0x5D87, 0x5E5B, 0x5E63, 0x5E55, +0x5E57, 0x5E54, 0x5ED3, 0x5ED6, +0x5F0A, 0x5F46, 0x5F70, 0x5FB9, +0x6147, 0x613F, 0x614B, 0x6177, +0x6162, 0x6163, 0x615F, 0x615A, +0x6158, 0x6175, 0x622A, 0x6487, +0x6458, 0x6454, 0x64A4, 0x6478, +0x645F, 0x647A, 0x6451, 0x6467, +0x6434, 0x646D, 0x647B, 0x6572, +0x65A1, 0x65D7, 0x65D6, 0x66A2, +0x66A8, 0x669D, 0x699C, 0x69A8, +0x6995, 0x69C1, 0x69AE, 0x69D3, +0x69CB, 0x699B, 0x69B7, 0x69BB, +0x69AB, 0x69B4, 0x69D0, 0x69CD, +0x69AD, 0x69CC, 0x69A6, 0x69C3, +0x69A3, 0x6B49, 0x6B4C, 0x6C33, +0x6F33, 0x6F14, 0x6EFE, 0x6F13, +0x6EF4, 0x6F29, 0x6F3E, 0x6F20, +0x6F2C, 0x6F0F, 0x6F02, 0x6F22, +0x6EFF, 0x6EEF, 0x6F06, 0x6F31, +0x6F38, 0x6F32, 0x6F23, 0x6F15, +0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, +0x6EEC, 0x6F01, 0x6EF2, 0x6ECC, +0x6EF7, 0x7194, 0x7199, 0x717D, +0x718A, 0x7184, 0x7192, 0x723E, +0x7292, 0x7296, 0x7344, 0x7350, +0x7464, 0x7463, 0x746A, 0x7470, +0x746D, 0x7504, 0x7591, 0x7627, +0x760D, 0x760B, 0x7609, 0x7613, +0x76E1, 0x76E3, 0x7784, 0x777D, +0x777F, 0x7761, 0x78C1, 0x789F, +0x78A7, 0x78B3, 0x78A9, 0x78A3, +0x798E, 0x798F, 0x798D, 0x7A2E, +0x7A31, 0x7AAA, 0x7AA9, 0x7AED, +0x7AEF, 0x7BA1, 0x7B95, 0x7B8B, +0x7B75, 0x7B97, 0x7B9D, 0x7B94, +0x7B8F, 0x7BB8, 0x7B87, 0x7B84, +0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, +0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE, +0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, +0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF, +0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, +0x7DC7, 0x7DAC, 0x7F70, 0x7FE0, +0x7FE1, 0x7FDF, 0x805E, 0x805A, +0x8087, 0x8150, 0x8180, 0x818F, +0x8188, 0x818A, 0x817F, 0x8182, +0x81E7, 0x81FA, 0x8207, 0x8214, +0x821E, 0x824B, 0x84C9, 0x84BF, +0x84C6, 0x84C4, 0x8499, 0x849E, +0x84B2, 0x849C, 0x84CB, 0x84B8, +0x84C0, 0x84D3, 0x8490, 0x84BC, +0x84D1, 0x84CA, 0x873F, 0x871C, +0x873B, 0x8722, 0x8725, 0x8734, +0x8718, 0x8755, 0x8737, 0x8729, +0x88F3, 0x8902, 0x88F4, 0x88F9, +0x88F8, 0x88FD, 0x88E8, 0x891A, +0x88EF, 0x8AA6, 0x8A8C, 0x8A9E, +0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, +0x8AA4, 0x8AAA, 0x8AA5, 0x8AA8, +0x8A98, 0x8A91, 0x8A9A, 0x8AA7, +0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, +0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, +0x8D95, 0x8DFC, 0x8F14, 0x8F12, +0x8F15, 0x8F13, 0x8FA3, 0x9060, +0x9058, 0x905C, 0x9063, 0x9059, +0x905E, 0x9062, 0x905D, 0x905B, +0x9119, 0x9118, 0x911E, 0x9175, +0x9178, 0x9177, 0x9174, 0x9278, +0x9280, 0x9285, 0x9298, 0x9296, +0x927B, 0x9293, 0x929C, 0x92A8, +0x927C, 0x9291, 0x95A1, 0x95A8, +0x95A9, 0x95A3, 0x95A5, 0x95A4, +0x9699, 0x969C, 0x969B, 0x96CC, +0x96D2, 0x9700, 0x977C, 0x9785, +0x97F6, 0x9817, 0x9818, 0x98AF, +0x98B1, 0x9903, 0x9905, 0x990C, +0x9909, 0x99C1, 0x9AAF, 0x9AB0, +0x9AE6, 0x9B41, 0x9B42, 0x9CF4, +0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, +0x9F4A, 0x5104, 0x5100, 0x50FB, +0x50F5, 0x50F9, 0x5102, 0x5108, +0x5109, 0x5105, 0x51DC, 0x5287, +0x5288, 0x5289, 0x528D, 0x528A, +0x52F0, 0x53B2, 0x562E, 0x563B, +0x5639, 0x5632, 0x563F, 0x5634, +0x5629, 0x5653, 0x564E, 0x5657, +0x5674, 0x5636, 0x562F, 0x5630, +0x5880, 0x589F, 0x589E, 0x58B3, +0x589C, 0x58AE, 0x58A9, 0x58A6, +0x596D, 0x5B09, 0x5AFB, 0x5B0B, +0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, +0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, +0x5C65, 0x5D9D, 0x5D94, 0x5E62, +0x5E5F, 0x5E61, 0x5EE2, 0x5EDA, +0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, +0x5F48, 0x5F71, 0x5FB7, 0x5FB5, +0x6176, 0x6167, 0x616E, 0x615D, +0x6155, 0x6182, 0x617C, 0x6170, +0x616B, 0x617E, 0x61A7, 0x6190, +0x61AB, 0x618E, 0x61AC, 0x619A, +0x61A4, 0x6194, 0x61AE, 0x622E, +0x6469, 0x646F, 0x6479, 0x649E, +0x64B2, 0x6488, 0x6490, 0x64B0, +0x64A5, 0x6493, 0x6495, 0x64A9, +0x6492, 0x64AE, 0x64AD, 0x64AB, +0x649A, 0x64AC, 0x6499, 0x64A2, +0x64B3, 0x6575, 0x6577, 0x6578, +0x66AE, 0x66AB, 0x66B4, 0x66B1, +0x6A23, 0x6A1F, 0x69E8, 0x6A01, +0x6A1E, 0x6A19, 0x69FD, 0x6A21, +0x6A13, 0x6A0A, 0x69F3, 0x6A02, +0x6A05, 0x69ED, 0x6A11, 0x6B50, +0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, +0x6F3F, 0x6F7C, 0x6F84, 0x6F51, +0x6F66, 0x6F54, 0x6F86, 0x6F6D, +0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, +0x6F7A, 0x6F70, 0x6F64, 0x6F97, +0x6F58, 0x6ED5, 0x6F6F, 0x6F60, +0x6F5F, 0x719F, 0x71AC, 0x71B1, +0x71A8, 0x7256, 0x729B, 0x734E, +0x7357, 0x7469, 0x748B, 0x7483, +0x747E, 0x7480, 0x757F, 0x7620, +0x7629, 0x761F, 0x7624, 0x7626, +0x7621, 0x7622, 0x769A, 0x76BA, +0x76E4, 0x778E, 0x7787, 0x778C, +0x7791, 0x778B, 0x78CB, 0x78C5, +0x78BA, 0x78CA, 0x78BE, 0x78D5, +0x78BC, 0x78D0, 0x7A3F, 0x7A3C, +0x7A40, 0x7A3D, 0x7A37, 0x7A3B, +0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, +0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, +0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, +0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, +0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, +0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, +0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, +0x7F75, 0x7F77, 0x7FAF, 0x7FE9, +0x8026, 0x819B, 0x819C, 0x819D, +0x81A0, 0x819A, 0x8198, 0x8517, +0x853D, 0x851A, 0x84EE, 0x852C, +0x852D, 0x8513, 0x8511, 0x8523, +0x8521, 0x8514, 0x84EC, 0x8525, +0x84FF, 0x8506, 0x8782, 0x8774, +0x8776, 0x8760, 0x8766, 0x8778, +0x8768, 0x8759, 0x8757, 0x874C, +0x8753, 0x885B, 0x885D, 0x8910, +0x8907, 0x8912, 0x8913, 0x8915, +0x890A, 0x8ABC, 0x8AD2, 0x8AC7, +0x8AC4, 0x8A95, 0x8ACB, 0x8AF8, +0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, +0x8AB0, 0x8AD6, 0x8ACD, 0x8AB6, +0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, +0x8C6C, 0x8CE0, 0x8CDE, 0x8CE6, +0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, +0x8CE3, 0x8CDC, 0x8CEA, 0x8CE1, +0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, +0x8E10, 0x8E1D, 0x8E22, 0x8E0F, +0x8E29, 0x8E1F, 0x8E21, 0x8E1E, +0x8EBA, 0x8F1D, 0x8F1B, 0x8F1F, +0x8F29, 0x8F26, 0x8F2A, 0x8F1C, +0x8F1E, 0x8F25, 0x9069, 0x906E, +0x9068, 0x906D, 0x9077, 0x9130, +0x912D, 0x9127, 0x9131, 0x9187, +0x9189, 0x918B, 0x9183, 0x92C5, +0x92BB, 0x92B7, 0x92EA, 0x92AC, +0x92E4, 0x92C1, 0x92B3, 0x92BC, +0x92D2, 0x92C7, 0x92F0, 0x92B2, +0x95AD, 0x95B1, 0x9704, 0x9706, +0x9707, 0x9709, 0x9760, 0x978D, +0x978B, 0x978F, 0x9821, 0x982B, +0x981C, 0x98B3, 0x990A, 0x9913, +0x9912, 0x9918, 0x99DD, 0x99D0, +0x99DF, 0x99DB, 0x99D1, 0x99D5, +0x99D2, 0x99D9, 0x9AB7, 0x9AEE, +0x9AEF, 0x9B27, 0x9B45, 0x9B44, +0x9B77, 0x9B6F, 0x9D06, 0x9D09, +0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, +0x58A8, 0x9F52, 0x5112, 0x5118, +0x5114, 0x5110, 0x5115, 0x5180, +0x51AA, 0x51DD, 0x5291, 0x5293, +0x52F3, 0x5659, 0x566B, 0x5679, +0x5669, 0x5664, 0x5678, 0x566A, +0x5668, 0x5665, 0x5671, 0x566F, +0x566C, 0x5662, 0x5676, 0x58C1, +0x58BE, 0x58C7, 0x58C5, 0x596E, +0x5B1D, 0x5B34, 0x5B78, 0x5BF0, +0x5C0E, 0x5F4A, 0x61B2, 0x6191, +0x61A9, 0x618A, 0x61CD, 0x61B6, +0x61BE, 0x61CA, 0x61C8, 0x6230, +0x64C5, 0x64C1, 0x64CB, 0x64BB, +0x64BC, 0x64DA, 0x64C4, 0x64C7, +0x64C2, 0x64CD, 0x64BF, 0x64D2, +0x64D4, 0x64BE, 0x6574, 0x66C6, +0x66C9, 0x66B9, 0x66C4, 0x66C7, +0x66B8, 0x6A3D, 0x6A38, 0x6A3A, +0x6A59, 0x6A6B, 0x6A58, 0x6A39, +0x6A44, 0x6A62, 0x6A61, 0x6A4B, +0x6A47, 0x6A35, 0x6A5F, 0x6A48, +0x6B59, 0x6B77, 0x6C05, 0x6FC2, +0x6FB1, 0x6FA1, 0x6FC3, 0x6FA4, +0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, +0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, +0x6FB4, 0x71BE, 0x71C9, 0x71D0, +0x71D2, 0x71C8, 0x71D5, 0x71B9, +0x71CE, 0x71D9, 0x71DC, 0x71C3, +0x71C4, 0x7368, 0x749C, 0x74A3, +0x7498, 0x749F, 0x749E, 0x74E2, +0x750C, 0x750D, 0x7634, 0x7638, +0x763A, 0x76E7, 0x76E5, 0x77A0, +0x779E, 0x779F, 0x77A5, 0x78E8, +0x78DA, 0x78EC, 0x78E7, 0x79A6, +0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, +0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, +0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, +0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, +0x7E0A, 0x7E11, 0x7E08, 0x7E1B, +0x7E23, 0x7E1E, 0x7E1D, 0x7E09, +0x7E10, 0x7F79, 0x7FB2, 0x7FF0, +0x7FF1, 0x7FEE, 0x8028, 0x81B3, +0x81A9, 0x81A8, 0x81FB, 0x8208, +0x8258, 0x8259, 0x854A, 0x8559, +0x8548, 0x8568, 0x8569, 0x8543, +0x8549, 0x856D, 0x856A, 0x855E, +0x8783, 0x879F, 0x879E, 0x87A2, +0x878D, 0x8861, 0x892A, 0x8932, +0x8925, 0x892B, 0x8921, 0x89AA, +0x89A6, 0x8AE6, 0x8AFA, 0x8AEB, +0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, +0x8AEE, 0x8AFE, 0x8B01, 0x8B02, +0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, +0x8AFC, 0x8C6B, 0x8C6D, 0x8C93, +0x8CF4, 0x8E44, 0x8E31, 0x8E34, +0x8E42, 0x8E39, 0x8E35, 0x8F3B, +0x8F2F, 0x8F38, 0x8F33, 0x8FA8, +0x8FA6, 0x9075, 0x9074, 0x9078, +0x9072, 0x907C, 0x907A, 0x9134, +0x9192, 0x9320, 0x9336, 0x92F8, +0x9333, 0x932F, 0x9322, 0x92FC, +0x932B, 0x9304, 0x931A, 0x9310, +0x9326, 0x9321, 0x9315, 0x932E, +0x9319, 0x95BB, 0x96A7, 0x96A8, +0x96AA, 0x96D5, 0x970E, 0x9711, +0x9716, 0x970D, 0x9713, 0x970F, +0x975B, 0x975C, 0x9766, 0x9798, +0x9830, 0x9838, 0x983B, 0x9837, +0x982D, 0x9839, 0x9824, 0x9910, +0x9928, 0x991E, 0x991B, 0x9921, +0x991A, 0x99ED, 0x99E2, 0x99F1, +0x9AB8, 0x9ABC, 0x9AFB, 0x9AED, +0x9B28, 0x9B91, 0x9D15, 0x9D23, +0x9D26, 0x9D28, 0x9D12, 0x9D1B, +0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, +0x512A, 0x511F, 0x5121, 0x5132, +0x52F5, 0x568E, 0x5680, 0x5690, +0x5685, 0x5687, 0x568F, 0x58D5, +0x58D3, 0x58D1, 0x58CE, 0x5B30, +0x5B2A, 0x5B24, 0x5B7A, 0x5C37, +0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, +0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD, +0x61C9, 0x61C2, 0x61C7, 0x61E6, +0x61CB, 0x6232, 0x6234, 0x64CE, +0x64CA, 0x64D8, 0x64E0, 0x64F0, +0x64E6, 0x64EC, 0x64F1, 0x64E2, +0x64ED, 0x6582, 0x6583, 0x66D9, +0x66D6, 0x6A80, 0x6A94, 0x6A84, +0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, +0x6A7E, 0x6A97, 0x6A90, 0x6AA0, +0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, +0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0, +0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, +0x6F80, 0x6FEC, 0x6FE1, 0x6FE9, +0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, +0x71DF, 0x71EE, 0x71E6, 0x71E5, +0x71ED, 0x71EC, 0x71F4, 0x71E0, +0x7235, 0x7246, 0x7370, 0x7372, +0x74A9, 0x74B0, 0x74A6, 0x74A8, +0x7646, 0x7642, 0x764C, 0x76EA, +0x77B3, 0x77AA, 0x77B0, 0x77AC, +0x77A7, 0x77AD, 0x77EF, 0x78F7, +0x78FA, 0x78F4, 0x78EF, 0x7901, +0x79A7, 0x79AA, 0x7A57, 0x7ABF, +0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, +0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, +0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, +0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, +0x7E37, 0x7E32, 0x7E43, 0x7E2B, +0x7E3D, 0x7E31, 0x7E45, 0x7E41, +0x7E34, 0x7E39, 0x7E48, 0x7E35, +0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, +0x7FFC, 0x8071, 0x8072, 0x8070, +0x806F, 0x8073, 0x81C6, 0x81C3, +0x81BA, 0x81C2, 0x81C0, 0x81BF, +0x81BD, 0x81C9, 0x81BE, 0x81E8, +0x8209, 0x8271, 0x85AA, 0x8584, +0x857E, 0x859C, 0x8591, 0x8594, +0x85AF, 0x859B, 0x8587, 0x85A8, +0x858A, 0x8667, 0x87C0, 0x87D1, +0x87B3, 0x87D2, 0x87C6, 0x87AB, +0x87BB, 0x87BA, 0x87C8, 0x87CB, +0x893B, 0x8936, 0x8944, 0x8938, +0x893D, 0x89AC, 0x8B0E, 0x8B17, +0x8B19, 0x8B1B, 0x8B0A, 0x8B20, +0x8B1D, 0x8B04, 0x8B10, 0x8C41, +0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, +0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, +0x8E49, 0x8E4B, 0x8E48, 0x8E4A, +0x8F44, 0x8F3E, 0x8F42, 0x8F45, +0x8F3F, 0x907F, 0x907D, 0x9084, +0x9081, 0x9082, 0x9080, 0x9139, +0x91A3, 0x919E, 0x919C, 0x934D, +0x9382, 0x9328, 0x9375, 0x934A, +0x9365, 0x934B, 0x9318, 0x937E, +0x936C, 0x935B, 0x9370, 0x935A, +0x9354, 0x95CA, 0x95CB, 0x95CC, +0x95C8, 0x95C6, 0x96B1, 0x96B8, +0x96D6, 0x971C, 0x971E, 0x97A0, +0x97D3, 0x9846, 0x98B6, 0x9935, +0x9A01, 0x99FF, 0x9BAE, 0x9BAB, +0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, +0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, +0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, +0x53E2, 0x5695, 0x56AE, 0x58D9, +0x58D8, 0x5B38, 0x5F5D, 0x61E3, +0x6233, 0x64F4, 0x64F2, 0x64FE, +0x6506, 0x64FA, 0x64FB, 0x64F7, +0x65B7, 0x66DC, 0x6726, 0x6AB3, +0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, +0x6AC2, 0x6AAE, 0x6AAF, 0x6B5F, +0x6B78, 0x6BAF, 0x7009, 0x700B, +0x6FFE, 0x7006, 0x6FFA, 0x7011, +0x700F, 0x71FB, 0x71FC, 0x71FE, +0x71F8, 0x7377, 0x7375, 0x74A7, +0x74BF, 0x7515, 0x7656, 0x7658, +0x7652, 0x77BD, 0x77BF, 0x77BB, +0x77BC, 0x790E, 0x79AE, 0x7A61, +0x7A62, 0x7A60, 0x7AC4, 0x7AC5, +0x7C2B, 0x7C27, 0x7C2A, 0x7C1E, +0x7C23, 0x7C21, 0x7CE7, 0x7E54, +0x7E55, 0x7E5E, 0x7E5A, 0x7E61, +0x7E52, 0x7E59, 0x7F48, 0x7FF9, +0x7FFB, 0x8077, 0x8076, 0x81CD, +0x81CF, 0x820A, 0x85CF, 0x85A9, +0x85CD, 0x85D0, 0x85C9, 0x85B0, +0x85BA, 0x85B9, 0x85A6, 0x87EF, +0x87EC, 0x87F2, 0x87E0, 0x8986, +0x89B2, 0x89F4, 0x8B28, 0x8B39, +0x8B2C, 0x8B2B, 0x8C50, 0x8D05, +0x8E59, 0x8E63, 0x8E66, 0x8E64, +0x8E5F, 0x8E55, 0x8EC0, 0x8F49, +0x8F4D, 0x9087, 0x9083, 0x9088, +0x91AB, 0x91AC, 0x91D0, 0x9394, +0x938A, 0x9396, 0x93A2, 0x93B3, +0x93AE, 0x93AC, 0x93B0, 0x9398, +0x939A, 0x9397, 0x95D4, 0x95D6, +0x95D0, 0x95D5, 0x96E2, 0x96DC, +0x96D9, 0x96DB, 0x96DE, 0x9724, +0x97A3, 0x97A6, 0x97AD, 0x97F9, +0x984D, 0x984F, 0x984C, 0x984E, +0x9853, 0x98BA, 0x993E, 0x993F, +0x993D, 0x992E, 0x99A5, 0x9A0E, +0x9AC1, 0x9B03, 0x9B06, 0x9B4F, +0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, +0x9BFD, 0x9BC8, 0x9BC0, 0x9D51, +0x9D5D, 0x9D60, 0x9EE0, 0x9F15, +0x9F2C, 0x5133, 0x56A5, 0x58DE, +0x58DF, 0x58E2, 0x5BF5, 0x9F90, +0x5EEC, 0x61F2, 0x61F7, 0x61F6, +0x61F5, 0x6500, 0x650F, 0x66E0, +0x66DD, 0x6AE5, 0x6ADD, 0x6ADA, +0x6AD3, 0x701B, 0x701F, 0x7028, +0x701A, 0x701D, 0x7015, 0x7018, +0x7206, 0x720D, 0x7258, 0x72A2, +0x7378, 0x737A, 0x74BD, 0x74CA, +0x74E3, 0x7587, 0x7586, 0x765F, +0x7661, 0x77C7, 0x7919, 0x79B1, +0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, +0x7C38, 0x7C3D, 0x7C37, 0x7C40, +0x7E6B, 0x7E6D, 0x7E79, 0x7E69, +0x7E6A, 0x7F85, 0x7E73, 0x7FB6, +0x7FB9, 0x7FB8, 0x81D8, 0x85E9, +0x85DD, 0x85EA, 0x85D5, 0x85E4, +0x85E5, 0x85F7, 0x87FB, 0x8805, +0x880D, 0x87F9, 0x87FE, 0x8960, +0x895F, 0x8956, 0x895E, 0x8B41, +0x8B5C, 0x8B58, 0x8B49, 0x8B5A, +0x8B4E, 0x8B4F, 0x8B46, 0x8B59, +0x8D08, 0x8D0A, 0x8E7C, 0x8E72, +0x8E87, 0x8E76, 0x8E6C, 0x8E7A, +0x8E74, 0x8F54, 0x8F4E, 0x8FAD, +0x908A, 0x908B, 0x91B1, 0x91AE, +0x93E1, 0x93D1, 0x93DF, 0x93C3, +0x93C8, 0x93DC, 0x93DD, 0x93D6, +0x93E2, 0x93CD, 0x93D8, 0x93E4, +0x93D7, 0x93E8, 0x95DC, 0x96B4, +0x96E3, 0x972A, 0x9727, 0x9761, +0x97DC, 0x97FB, 0x985E, 0x9858, +0x985B, 0x98BC, 0x9945, 0x9949, +0x9A16, 0x9A19, 0x9B0D, 0x9BE8, +0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, +0x9D61, 0x9D72, 0x9D6A, 0x9D6C, +0x9E92, 0x9E97, 0x9E93, 0x9EB4, +0x52F8, 0x56A8, 0x56B7, 0x56B6, +0x56B4, 0x56BC, 0x58E4, 0x5B40, +0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, +0x61F8, 0x61FA, 0x6518, 0x6514, +0x6519, 0x66E6, 0x6727, 0x6AEC, +0x703E, 0x7030, 0x7032, 0x7210, +0x737B, 0x74CF, 0x7662, 0x7665, +0x7926, 0x792A, 0x792C, 0x792B, +0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, +0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, +0x7E7D, 0x7E7C, 0x7E82, 0x7F4C, +0x8000, 0x81DA, 0x8266, 0x85FB, +0x85F9, 0x8611, 0x85FA, 0x8606, +0x860B, 0x8607, 0x860A, 0x8814, +0x8815, 0x8964, 0x89BA, 0x89F8, +0x8B70, 0x8B6C, 0x8B66, 0x8B6F, +0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, +0x8E89, 0x8E81, 0x8E85, 0x8E82, +0x91B4, 0x91CB, 0x9418, 0x9403, +0x93FD, 0x95E1, 0x9730, 0x98C4, +0x9952, 0x9951, 0x99A8, 0x9A2B, +0x9A30, 0x9A37, 0x9A35, 0x9C13, +0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, +0x9F2F, 0x9F5F, 0x9F63, 0x9F61, +0x5137, 0x5138, 0x56C1, 0x56C0, +0x56C2, 0x5914, 0x5C6C, 0x5DCD, +0x61FC, 0x61FE, 0x651D, 0x651C, +0x6595, 0x66E9, 0x6AFB, 0x6B04, +0x6AFA, 0x6BB2, 0x704C, 0x721B, +0x72A7, 0x74D6, 0x74D4, 0x7669, +0x77D3, 0x7C50, 0x7E8F, 0x7E8C, +0x7FBC, 0x8617, 0x862D, 0x861A, +0x8823, 0x8822, 0x8821, 0x881F, +0x896A, 0x896C, 0x89BD, 0x8B74, +0x8B77, 0x8B7D, 0x8D13, 0x8E8A, +0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, +0x91BA, 0x942E, 0x9433, 0x9435, +0x943A, 0x9438, 0x9432, 0x942B, +0x95E2, 0x9738, 0x9739, 0x9732, +0x97FF, 0x9867, 0x9865, 0x9957, +0x9A45, 0x9A43, 0x9A40, 0x9A3E, +0x9ACF, 0x9B54, 0x9B51, 0x9C2D, +0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, +0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, +0x9F5C, 0x9F66, 0x9F67, 0x513C, +0x513B, 0x56C8, 0x56CA, 0x56C9, +0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, +0x61FF, 0x6524, 0x6B0A, 0x6B61, +0x7051, 0x7058, 0x7380, 0x74E4, +0x758A, 0x766E, 0x766C, 0x79B3, +0x7C60, 0x7C5F, 0x807E, 0x807D, +0x81DF, 0x8972, 0x896F, 0x89FC, +0x8B80, 0x8D16, 0x8D17, 0x8E91, +0x8E93, 0x8F61, 0x9148, 0x9444, +0x9451, 0x9452, 0x973D, 0x973E, +0x97C3, 0x97C1, 0x986B, 0x9955, +0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, +0x9C49, 0x9C31, 0x9C3E, 0x9C3B, +0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, +0x9F6A, 0x9F94, 0x56CC, 0x5DD6, +0x6200, 0x6523, 0x652B, 0x652A, +0x66EC, 0x6B10, 0x74DA, 0x7ACA, +0x7C64, 0x7C63, 0x7C65, 0x7E93, +0x7E96, 0x7E94, 0x81E2, 0x8638, +0x863F, 0x8831, 0x8B8A, 0x9090, +0x908F, 0x9463, 0x9460, 0x9464, +0x9768, 0x986F, 0x995C, 0x9A5A, +0x9A5B, 0x9A57, 0x9AD3, 0x9AD4, +0x9AD1, 0x9C54, 0x9C57, 0x9C56, +0x9DE5, 0x9E9F, 0x9EF4, 0x56D1, +0x58E9, 0x652C, 0x705E, 0x7671, +0x7672, 0x77D7, 0x7F50, 0x7F88, +0x8836, 0x8839, 0x8862, 0x8B93, +0x8B92, 0x8B96, 0x8277, 0x8D1B, +0x91C0, 0x946A, 0x9742, 0x9748, +0x9744, 0x97C6, 0x9870, 0x9A5F, +0x9B22, 0x9B58, 0x9C5F, 0x9DF9, +0x9DFA, 0x9E7C, 0x9E7D, 0x9F07, +0x9F77, 0x9F72, 0x5EF3, 0x6B16, +0x7063, 0x7C6C, 0x7C6E, 0x883B, +0x89C0, 0x8EA1, 0x91C1, 0x9472, +0x9470, 0x9871, 0x995E, 0x9AD6, +0x9B23, 0x9ECC, 0x7064, 0x77DA, +0x8B9A, 0x9477, 0x97C9, 0x9A62, +0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, +0x91C5, 0x947D, 0x947E, 0x947C, +0x9C77, 0x9C78, 0x9EF7, 0x8C54, +0x947F, 0x9E1A, 0x7228, 0x9A6A, +0x9B31, 0x9E1B, 0x9E1E, 0x7C72, +0x2460, 0x2461, 0x2462, 0x2463, +0x2464, 0x2465, 0x2466, 0x2467, +0x2468, 0x2469, 0x2474, 0x2475, +0x2476, 0x2477, 0x2478, 0x2479, +0x247A, 0x247B, 0x247C, 0x247D, +0x2170, 0x2171, 0x2172, 0x2173, +0x2174, 0x2175, 0x2176, 0x2177, +0x2178, 0x2179, 0x4E36, 0x4E3F, +0x4E85, 0x4EA0, 0x5182, 0x5196, +0x51AB, 0x52F9, 0x5338, 0x5369, +0x53B6, 0x590A, 0x5B80, 0x5DDB, +0x2F33, 0x5E7F, 0x5EF4, 0x5F50, +0x5F61, 0x6534, 0x65E0, 0x7592, +0x7676, 0x8FB5, 0x96B6, 0x00A8, +0x02C6, 0x30FD, 0x30FE, 0x309D, +0x309E, 0x3003, 0x4EDD, 0x3005, +0x3006, 0x3007, 0x30FC, 0xFF3B, +0xFF3D, 0x273D, 0x3041, 0x3042, +0x3043, 0x3044, 0x3045, 0x3046, +0x3047, 0x3048, 0x3049, 0x304A, +0x304B, 0x304C, 0x304D, 0x304E, +0x304F, 0x3050, 0x3051, 0x3052, +0x3053, 0x3054, 0x3055, 0x3056, +0x3057, 0x3058, 0x3059, 0x305A, +0x305B, 0x305C, 0x305D, 0x305E, +0x305F, 0x3060, 0x3061, 0x3062, +0x3063, 0x3064, 0x3065, 0x3066, +0x3067, 0x3068, 0x3069, 0x306A, +0x306B, 0x306C, 0x306D, 0x306E, +0x306F, 0x3070, 0x3071, 0x3072, +0x3073, 0x3074, 0x3075, 0x3076, +0x3077, 0x3078, 0x3079, 0x307A, +0x307B, 0x307C, 0x307D, 0x307E, +0x307F, 0x3080, 0x3081, 0x3082, +0x3083, 0x3084, 0x3085, 0x3086, +0x3087, 0x3088, 0x3089, 0x308A, +0x308B, 0x308C, 0x308D, 0x308E, +0x308F, 0x3090, 0x3091, 0x3092, +0x3093, 0x30A1, 0x30A2, 0x30A3, +0x30A4, 0x30A5, 0x30A6, 0x30A7, +0x30A8, 0x30A9, 0x30AA, 0x30AB, +0x30AC, 0x30AD, 0x30AE, 0x30AF, +0x30B0, 0x30B1, 0x30B2, 0x30B3, +0x30B4, 0x30B5, 0x30B6, 0x30B7, +0x30B8, 0x30B9, 0x30BA, 0x30BB, +0x30BC, 0x30BD, 0x30BE, 0x30BF, +0x30C0, 0x30C1, 0x30C2, 0x30C3, +0x30C4, 0x30C5, 0x30C6, 0x30C7, +0x30C8, 0x30C9, 0x30CA, 0x30CB, +0x30CC, 0x30CD, 0x30CE, 0x30CF, +0x30D0, 0x30D1, 0x30D2, 0x30D3, +0x30D4, 0x30D5, 0x30D6, 0x30D7, +0x30D8, 0x30D9, 0x30DA, 0x30DB, +0x30DC, 0x30DD, 0x30DE, 0x30DF, +0x30E0, 0x30E1, 0x30E2, 0x30E3, +0x30E4, 0x30E5, 0x30E6, 0x30E7, +0x30E8, 0x30E9, 0x30EA, 0x30EB, +0x30EC, 0x30ED, 0x30EE, 0x30EF, +0x30F0, 0x30F1, 0x30F2, 0x30F3, +0x30F4, 0x30F5, 0x30F6, 0x0410, +0x0411, 0x0412, 0x0413, 0x0414, +0x0415, 0x0401, 0x0416, 0x0417, +0x0418, 0x0419, 0x041A, 0x041B, +0x041C, 0x041D, 0x041E, 0x041F, +0x0420, 0x0421, 0x0422, 0x0423, +0x0424, 0x0425, 0x0426, 0x0427, +0x0428, 0x0429, 0x042A, 0x042B, +0x042C, 0x042D, 0x042E, 0x042F, +0x0430, 0x0431, 0x0432, 0x0433, +0x0434, 0x0435, 0x0451, 0x0436, +0x0437, 0x0438, 0x0439, 0x043A, +0x043B, 0x043C, 0x043D, 0x043E, +0x043F, 0x0440, 0x0441, 0x0442, +0x0443, 0x0444, 0x0445, 0x0446, +0x0447, 0x0448, 0x0449, 0x044A, +0x044B, 0x044C, 0x044D, 0x044E, +0x044F, 0x21E7, 0x21B8, 0x21B9, +0x31CF, 0x200CC, 0x4E5A, 0x2008A, +0x5202, 0x4491, 0x9FB0, 0x5188, +0x9FB1, 0x27607, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0xFFE2, 0xFFE4, +0xFF07, 0xFF02, 0x3231, 0x2116, +0x2121, 0x309B, 0x309C, 0x2E80, +0x2E84, 0x2E86, 0x2E87, 0x2E88, +0x2E8A, 0x2E8C, 0x2E8D, 0x2E95, +0x2E9C, 0x2E9D, 0x2EA5, 0x2EA7, +0x2EAA, 0x2EAC, 0x2EAE, 0x2EB6, +0x2EBC, 0x2EBE, 0x2EC6, 0x2ECA, +0x2ECC, 0x2ECD, 0x2ECF, 0x2ED6, +0x2ED7, 0x2EDE, 0x2EE3, 0x0000, +0x0000, 0x0000, 0x0283, 0x0250, +0x025B, 0x0254, 0x0275, 0x0153, +0x00F8, 0x014B, 0x028A, 0x026A, +0x4E42, 0x4E5C, 0x51F5, 0x531A, +0x5382, 0x4E07, 0x4E0C, 0x4E47, +0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, +0x5F73, 0x4E0F, 0x5187, 0x4E0E, +0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, +0x4EC8, 0x5198, 0x52FC, 0x536C, +0x53B9, 0x5720, 0x5903, 0x592C, +0x5C10, 0x5DFF, 0x65E1, 0x6BB3, +0x6BCC, 0x6C14, 0x723F, 0x4E31, +0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, +0x4EE1, 0x4EDD, 0x4EDA, 0x520C, +0x531C, 0x534C, 0x5722, 0x5723, +0x5917, 0x592F, 0x5B81, 0x5B84, +0x5C12, 0x5C3B, 0x5C74, 0x5C73, +0x5E04, 0x5E80, 0x5E82, 0x5FC9, +0x6209, 0x6250, 0x6C15, 0x6C36, +0x6C43, 0x6C3F, 0x6C3B, 0x72AE, +0x72B0, 0x738A, 0x79B8, 0x808A, +0x961E, 0x4F0E, 0x4F18, 0x4F2C, +0x4EF5, 0x4F14, 0x4EF1, 0x4F00, +0x4EF7, 0x4F08, 0x4F1D, 0x4F02, +0x4F05, 0x4F22, 0x4F13, 0x4F04, +0x4EF4, 0x4F12, 0x51B1, 0x5213, +0x5209, 0x5210, 0x52A6, 0x5322, +0x531F, 0x534D, 0x538A, 0x5407, +0x56E1, 0x56DF, 0x572E, 0x572A, +0x5734, 0x593C, 0x5980, 0x597C, +0x5985, 0x597B, 0x597E, 0x5977, +0x597F, 0x5B56, 0x5C15, 0x5C25, +0x5C7C, 0x5C7A, 0x5C7B, 0x5C7E, +0x5DDF, 0x5E75, 0x5E84, 0x5F02, +0x5F1A, 0x5F74, 0x5FD5, 0x5FD4, +0x5FCF, 0x625C, 0x625E, 0x6264, +0x6261, 0x6266, 0x6262, 0x6259, +0x6260, 0x625A, 0x6265, 0x65EF, +0x65EE, 0x673E, 0x6739, 0x6738, +0x673B, 0x673A, 0x673F, 0x673C, +0x6733, 0x6C18, 0x6C46, 0x6C52, +0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, +0x6C4B, 0x6C4C, 0x7071, 0x725E, +0x72B4, 0x72B5, 0x738E, 0x752A, +0x767F, 0x7A75, 0x7F51, 0x8278, +0x827C, 0x8280, 0x827D, 0x827F, +0x864D, 0x897E, 0x9099, 0x9097, +0x9098, 0x909B, 0x9094, 0x9622, +0x9624, 0x9620, 0x9623, 0x4F56, +0x4F3B, 0x4F62, 0x4F49, 0x4F53, +0x4F64, 0x4F3E, 0x4F67, 0x4F52, +0x4F5F, 0x4F41, 0x4F58, 0x4F2D, +0x4F33, 0x4F3F, 0x4F61, 0x518F, +0x51B9, 0x521C, 0x521E, 0x5221, +0x52AD, 0x52AE, 0x5309, 0x5363, +0x5372, 0x538E, 0x538F, 0x5430, +0x5437, 0x542A, 0x5454, 0x5445, +0x5419, 0x541C, 0x5425, 0x5418, +0x543D, 0x544F, 0x5441, 0x5428, +0x5424, 0x5447, 0x56EE, 0x56E7, +0x56E5, 0x5741, 0x5745, 0x574C, +0x5749, 0x574B, 0x5752, 0x5906, +0x5940, 0x59A6, 0x5998, 0x59A0, +0x5997, 0x598E, 0x59A2, 0x5990, +0x598F, 0x59A7, 0x59A1, 0x5B8E, +0x5B92, 0x5C28, 0x5C2A, 0x5C8D, +0x5C8F, 0x5C88, 0x5C8B, 0x5C89, +0x5C92, 0x5C8A, 0x5C86, 0x5C93, +0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, +0x5E8B, 0x5E89, 0x5E8C, 0x5E88, +0x5E8D, 0x5F05, 0x5F1D, 0x5F78, +0x5F76, 0x5FD2, 0x5FD1, 0x5FD0, +0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, +0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA, +0x5FEF, 0x5FF7, 0x5FFB, 0x6000, +0x5FF4, 0x623A, 0x6283, 0x628C, +0x628E, 0x628F, 0x6294, 0x6287, +0x6271, 0x627B, 0x627A, 0x6270, +0x6281, 0x6288, 0x6277, 0x627D, +0x6272, 0x6274, 0x6537, 0x65F0, +0x65F4, 0x65F3, 0x65F2, 0x65F5, +0x6745, 0x6747, 0x6759, 0x6755, +0x674C, 0x6748, 0x675D, 0x674D, +0x675A, 0x674B, 0x6BD0, 0x6C19, +0x6C1A, 0x6C78, 0x6C67, 0x6C6B, +0x6C84, 0x6C8B, 0x6C8F, 0x6C71, +0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, +0x6C87, 0x6C95, 0x6C9C, 0x6C66, +0x6C73, 0x6C65, 0x6C7B, 0x6C8E, +0x7074, 0x707A, 0x7263, 0x72BF, +0x72BD, 0x72C3, 0x72C6, 0x72C1, +0x72BA, 0x72C5, 0x7395, 0x7397, +0x7393, 0x7394, 0x7392, 0x753A, +0x7539, 0x7594, 0x7595, 0x7681, +0x793D, 0x8034, 0x8095, 0x8099, +0x8090, 0x8092, 0x809C, 0x8290, +0x828F, 0x8285, 0x828E, 0x8291, +0x8293, 0x828A, 0x8283, 0x8284, +0x8C78, 0x8FC9, 0x8FBF, 0x909F, +0x90A1, 0x90A5, 0x909E, 0x90A7, +0x90A0, 0x9630, 0x9628, 0x962F, +0x962D, 0x4E33, 0x4F98, 0x4F7C, +0x4F85, 0x4F7D, 0x4F80, 0x4F87, +0x4F76, 0x4F74, 0x4F89, 0x4F84, +0x4F77, 0x4F4C, 0x4F97, 0x4F6A, +0x4F9A, 0x4F79, 0x4F81, 0x4F78, +0x4F90, 0x4F9C, 0x4F94, 0x4F9E, +0x4F92, 0x4F82, 0x4F95, 0x4F6B, +0x4F6E, 0x519E, 0x51BC, 0x51BE, +0x5235, 0x5232, 0x5233, 0x5246, +0x5231, 0x52BC, 0x530A, 0x530B, +0x533C, 0x5392, 0x5394, 0x5487, +0x547F, 0x5481, 0x5491, 0x5482, +0x5488, 0x546B, 0x547A, 0x547E, +0x5465, 0x546C, 0x5474, 0x5466, +0x548D, 0x546F, 0x5461, 0x5460, +0x5498, 0x5463, 0x5467, 0x5464, +0x56F7, 0x56F9, 0x576F, 0x5772, +0x576D, 0x576B, 0x5771, 0x5770, +0x5776, 0x5780, 0x5775, 0x577B, +0x5773, 0x5774, 0x5762, 0x5768, +0x577D, 0x590C, 0x5945, 0x59B5, +0x59BA, 0x59CF, 0x59CE, 0x59B2, +0x59CC, 0x59C1, 0x59B6, 0x59BC, +0x59C3, 0x59D6, 0x59B1, 0x59BD, +0x59C0, 0x59C8, 0x59B4, 0x59C7, +0x5B62, 0x5B65, 0x5B93, 0x5B95, +0x5C44, 0x5C47, 0x5CAE, 0x5CA4, +0x5CA0, 0x5CB5, 0x5CAF, 0x5CA8, +0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, +0x5CA2, 0x5CAA, 0x5CA7, 0x5C9D, +0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, +0x5E17, 0x5E14, 0x5E19, 0x5F28, +0x5F22, 0x5F23, 0x5F24, 0x5F54, +0x5F82, 0x5F7E, 0x5F7D, 0x5FDE, +0x5FE5, 0x602D, 0x6026, 0x6019, +0x6032, 0x600B, 0x6034, 0x600A, +0x6017, 0x6033, 0x601A, 0x601E, +0x602C, 0x6022, 0x600D, 0x6010, +0x602E, 0x6013, 0x6011, 0x600C, +0x6009, 0x601C, 0x6214, 0x623D, +0x62AD, 0x62B4, 0x62D1, 0x62BE, +0x62AA, 0x62B6, 0x62CA, 0x62AE, +0x62B3, 0x62AF, 0x62BB, 0x62A9, +0x62B0, 0x62B8, 0x653D, 0x65A8, +0x65BB, 0x6609, 0x65FC, 0x6604, +0x6612, 0x6608, 0x65FB, 0x6603, +0x660B, 0x660D, 0x6605, 0x65FD, +0x6611, 0x6610, 0x66F6, 0x670A, +0x6785, 0x676C, 0x678E, 0x6792, +0x6776, 0x677B, 0x6798, 0x6786, +0x6784, 0x6774, 0x678D, 0x678C, +0x677A, 0x679F, 0x6791, 0x6799, +0x6783, 0x677D, 0x6781, 0x6778, +0x6779, 0x6794, 0x6B25, 0x6B80, +0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, +0x6CEC, 0x6CEB, 0x6CEE, 0x6CD9, +0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, +0x6CB7, 0x6CD0, 0x6CC2, 0x6CBA, +0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, +0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, +0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, +0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, +0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, +0x7094, 0x7098, 0x7085, 0x7093, +0x7086, 0x7084, 0x7091, 0x7096, +0x7082, 0x709A, 0x7083, 0x726A, +0x72D6, 0x72CB, 0x72D8, 0x72C9, +0x72DC, 0x72D2, 0x72D4, 0x72DA, +0x72CC, 0x72D1, 0x73A4, 0x73A1, +0x73AD, 0x73A6, 0x73A2, 0x73A0, +0x73AC, 0x739D, 0x74DD, 0x74E8, +0x753F, 0x7540, 0x753E, 0x758C, +0x7598, 0x76AF, 0x76F3, 0x76F1, +0x76F0, 0x76F5, 0x77F8, 0x77FC, +0x77F9, 0x77FB, 0x77FA, 0x77F7, +0x7942, 0x793F, 0x79C5, 0x7A78, +0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, +0x8035, 0x808F, 0x80AE, 0x80A3, +0x80B8, 0x80B5, 0x80AD, 0x8220, +0x82A0, 0x82C0, 0x82AB, 0x829A, +0x8298, 0x829B, 0x82B5, 0x82A7, +0x82AE, 0x82BC, 0x829E, 0x82BA, +0x82B4, 0x82A8, 0x82A1, 0x82A9, +0x82C2, 0x82A4, 0x82C3, 0x82B6, +0x82A2, 0x8670, 0x866F, 0x866D, +0x866E, 0x8C56, 0x8FD2, 0x8FCB, +0x8FD3, 0x8FCD, 0x8FD6, 0x8FD5, +0x8FD7, 0x90B2, 0x90B4, 0x90AF, +0x90B3, 0x90B0, 0x9639, 0x963D, +0x963C, 0x963A, 0x9643, 0x4FCD, +0x4FC5, 0x4FD3, 0x4FB2, 0x4FC9, +0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, +0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, +0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, +0x4FB9, 0x4FEC, 0x5244, 0x5249, +0x52C0, 0x52C2, 0x533D, 0x537C, +0x5397, 0x5396, 0x5399, 0x5398, +0x54BA, 0x54A1, 0x54AD, 0x54A5, +0x54CF, 0x54C3, 0x830D, 0x54B7, +0x54AE, 0x54D6, 0x54B6, 0x54C5, +0x54C6, 0x54A0, 0x5470, 0x54BC, +0x54A2, 0x54BE, 0x5472, 0x54DE, +0x54B0, 0x57B5, 0x579E, 0x579F, +0x57A4, 0x578C, 0x5797, 0x579D, +0x579B, 0x5794, 0x5798, 0x578F, +0x5799, 0x57A5, 0x579A, 0x5795, +0x58F4, 0x590D, 0x5953, 0x59E1, +0x59DE, 0x59EE, 0x5A00, 0x59F1, +0x59DD, 0x59FA, 0x59FD, 0x59FC, +0x59F6, 0x59E4, 0x59F2, 0x59F7, +0x59DB, 0x59E9, 0x59F3, 0x59F5, +0x59E0, 0x59FE, 0x59F4, 0x59ED, +0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, +0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, +0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, +0x5CCA, 0x5CD6, 0x5CD3, 0x5CD4, +0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, +0x5CDF, 0x5CF8, 0x5DF9, 0x5E21, +0x5E22, 0x5E23, 0x5E20, 0x5E24, +0x5EB0, 0x5EA4, 0x5EA2, 0x5E9B, +0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, +0x5F56, 0x5F86, 0x6037, 0x6039, +0x6054, 0x6072, 0x605E, 0x6045, +0x6053, 0x6047, 0x6049, 0x605B, +0x604C, 0x6040, 0x6042, 0x605F, +0x6024, 0x6044, 0x6058, 0x6066, +0x606E, 0x6242, 0x6243, 0x62CF, +0x630D, 0x630B, 0x62F5, 0x630E, +0x6303, 0x62EB, 0x62F9, 0x630F, +0x630C, 0x62F8, 0x62F6, 0x6300, +0x6313, 0x6314, 0x62FA, 0x6315, +0x62FB, 0x62F0, 0x6541, 0x6543, +0x65AA, 0x65BF, 0x6636, 0x6621, +0x6632, 0x6635, 0x661C, 0x6626, +0x6622, 0x6633, 0x662B, 0x663A, +0x661D, 0x6634, 0x6639, 0x662E, +0x670F, 0x6710, 0x67C1, 0x67F2, +0x67C8, 0x67BA, 0x67DC, 0x67BB, +0x67F8, 0x67D8, 0x67C0, 0x67B7, +0x67C5, 0x67EB, 0x67E4, 0x67DF, +0x67B5, 0x67CD, 0x67B3, 0x67F7, +0x67F6, 0x67EE, 0x67E3, 0x67C2, +0x67B9, 0x67CE, 0x67E7, 0x67F0, +0x67B2, 0x67FC, 0x67C6, 0x67ED, +0x67CC, 0x67AE, 0x67E6, 0x67DB, +0x67FA, 0x67C9, 0x67CA, 0x67C3, +0x67EA, 0x67CB, 0x6B28, 0x6B82, +0x6B84, 0x6BB6, 0x6BD6, 0x6BD8, +0x6BE0, 0x6C20, 0x6C21, 0x6D28, +0x6D34, 0x6D2D, 0x6D1F, 0x6D3C, +0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, +0x6D33, 0x6D04, 0x6D19, 0x6D3A, +0x6D1A, 0x6D11, 0x6D00, 0x6D1D, +0x6D42, 0x6D01, 0x6D18, 0x6D37, +0x6D03, 0x6D0F, 0x6D40, 0x6D07, +0x6D20, 0x6D2C, 0x6D08, 0x6D22, +0x6D09, 0x6D10, 0x70B7, 0x709F, +0x70BE, 0x70B1, 0x70B0, 0x70A1, +0x70B4, 0x70B5, 0x70A9, 0x7241, +0x7249, 0x724A, 0x726C, 0x7270, +0x7273, 0x726E, 0x72CA, 0x72E4, +0x72E8, 0x72EB, 0x72DF, 0x72EA, +0x72E6, 0x72E3, 0x7385, 0x73CC, +0x73C2, 0x73C8, 0x73C5, 0x73B9, +0x73B6, 0x73B5, 0x73B4, 0x73EB, +0x73BF, 0x73C7, 0x73BE, 0x73C3, +0x73C6, 0x73B8, 0x73CB, 0x74EC, +0x74EE, 0x752E, 0x7547, 0x7548, +0x75A7, 0x75AA, 0x7679, 0x76C4, +0x7708, 0x7703, 0x7704, 0x7705, +0x770A, 0x76F7, 0x76FB, 0x76FA, +0x77E7, 0x77E8, 0x7806, 0x7811, +0x7812, 0x7805, 0x7810, 0x780F, +0x780E, 0x7809, 0x7803, 0x7813, +0x794A, 0x794C, 0x794B, 0x7945, +0x7944, 0x79D5, 0x79CD, 0x79CF, +0x79D6, 0x79CE, 0x7A80, 0x7A7E, +0x7AD1, 0x7B00, 0x7B01, 0x7C7A, +0x7C78, 0x7C79, 0x7C7F, 0x7C80, +0x7C81, 0x7D03, 0x7D08, 0x7D01, +0x7F58, 0x7F91, 0x7F8D, 0x7FBE, +0x8007, 0x800E, 0x800F, 0x8014, +0x8037, 0x80D8, 0x80C7, 0x80E0, +0x80D1, 0x80C8, 0x80C2, 0x80D0, +0x80C5, 0x80E3, 0x80D9, 0x80DC, +0x80CA, 0x80D5, 0x80C9, 0x80CF, +0x80D7, 0x80E6, 0x80CD, 0x81FF, +0x8221, 0x8294, 0x82D9, 0x82FE, +0x82F9, 0x8307, 0x82E8, 0x8300, +0x82D5, 0x833A, 0x82EB, 0x82D6, +0x82F4, 0x82EC, 0x82E1, 0x82F2, +0x82F5, 0x830C, 0x82FB, 0x82F6, +0x82F0, 0x82EA, 0x82E4, 0x82E0, +0x82FA, 0x82F3, 0x82ED, 0x8677, +0x8674, 0x867C, 0x8673, 0x8841, +0x884E, 0x8867, 0x886A, 0x8869, +0x89D3, 0x8A04, 0x8A07, 0x8D72, +0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, +0x90F1, 0x90BD, 0x90BF, 0x90D5, +0x90C5, 0x90BE, 0x90C7, 0x90CB, +0x90C8, 0x91D4, 0x91D3, 0x9654, +0x964F, 0x9651, 0x9653, 0x964A, +0x964E, 0x501E, 0x5005, 0x5007, +0x5013, 0x5022, 0x5030, 0x501B, +0x4FF5, 0x4FF4, 0x5033, 0x5037, +0x502C, 0x4FF6, 0x4FF7, 0x5017, +0x501C, 0x5020, 0x5027, 0x5035, +0x502F, 0x5031, 0x500E, 0x515A, +0x5194, 0x5193, 0x51CA, 0x51C4, +0x51C5, 0x51C8, 0x51CE, 0x5261, +0x525A, 0x5252, 0x525E, 0x525F, +0x5255, 0x5262, 0x52CD, 0x530E, +0x539E, 0x5526, 0x54E2, 0x5517, +0x5512, 0x54E7, 0x54F3, 0x54E4, +0x551A, 0x54FF, 0x5504, 0x5508, +0x54EB, 0x5511, 0x5505, 0x54F1, +0x550A, 0x54FB, 0x54F7, 0x54F8, +0x54E0, 0x550E, 0x5503, 0x550B, +0x5701, 0x5702, 0x57CC, 0x5832, +0x57D5, 0x57D2, 0x57BA, 0x57C6, +0x57BD, 0x57BC, 0x57B8, 0x57B6, +0x57BF, 0x57C7, 0x57D0, 0x57B9, +0x57C1, 0x590E, 0x594A, 0x5A19, +0x5A16, 0x5A2D, 0x5A2E, 0x5A15, +0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, +0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, +0x5BAC, 0x5C03, 0x5C56, 0x5C54, +0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, +0x5CF7, 0x5D00, 0x5CF9, 0x5E29, +0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, +0x5EAC, 0x5F33, 0x5F30, 0x5F67, +0x605D, 0x605A, 0x6067, 0x6041, +0x60A2, 0x6088, 0x6080, 0x6092, +0x6081, 0x609D, 0x6083, 0x6095, +0x609B, 0x6097, 0x6087, 0x609C, +0x608E, 0x6219, 0x6246, 0x62F2, +0x6310, 0x6356, 0x632C, 0x6344, +0x6345, 0x6336, 0x6343, 0x63E4, +0x6339, 0x634B, 0x634A, 0x633C, +0x6329, 0x6341, 0x6334, 0x6358, +0x6354, 0x6359, 0x632D, 0x6347, +0x6333, 0x635A, 0x6351, 0x6338, +0x6357, 0x6340, 0x6348, 0x654A, +0x6546, 0x65C6, 0x65C3, 0x65C4, +0x65C2, 0x664A, 0x665F, 0x6647, +0x6651, 0x6712, 0x6713, 0x681F, +0x681A, 0x6849, 0x6832, 0x6833, +0x683B, 0x684B, 0x684F, 0x6816, +0x6831, 0x681C, 0x6835, 0x682B, +0x682D, 0x682F, 0x684E, 0x6844, +0x6834, 0x681D, 0x6812, 0x6814, +0x6826, 0x6828, 0x682E, 0x684D, +0x683A, 0x6825, 0x6820, 0x6B2C, +0x6B2F, 0x6B2D, 0x6B31, 0x6B34, +0x6B6D, 0x8082, 0x6B88, 0x6BE6, +0x6BE4, 0x6BE8, 0x6BE3, 0x6BE2, +0x6BE7, 0x6C25, 0x6D7A, 0x6D63, +0x6D64, 0x6D76, 0x6D0D, 0x6D61, +0x6D92, 0x6D58, 0x6D62, 0x6D6D, +0x6D6F, 0x6D91, 0x6D8D, 0x6DEF, +0x6D7F, 0x6D86, 0x6D5E, 0x6D67, +0x6D60, 0x6D97, 0x6D70, 0x6D7C, +0x6D5F, 0x6D82, 0x6D98, 0x6D2F, +0x6D68, 0x6D8B, 0x6D7E, 0x6D80, +0x6D84, 0x6D16, 0x6D83, 0x6D7B, +0x6D7D, 0x6D75, 0x6D90, 0x70DC, +0x70D3, 0x70D1, 0x70DD, 0x70CB, +0x7F39, 0x70E2, 0x70D7, 0x70D2, +0x70DE, 0x70E0, 0x70D4, 0x70CD, +0x70C5, 0x70C6, 0x70C7, 0x70DA, +0x70CE, 0x70E1, 0x7242, 0x7278, +0x7277, 0x7276, 0x7300, 0x72FA, +0x72F4, 0x72FE, 0x72F6, 0x72F3, +0x72FB, 0x7301, 0x73D3, 0x73D9, +0x73E5, 0x73D6, 0x73BC, 0x73E7, +0x73E3, 0x73E9, 0x73DC, 0x73D2, +0x73DB, 0x73D4, 0x73DD, 0x73DA, +0x73D7, 0x73D8, 0x73E8, 0x74DE, +0x74DF, 0x74F4, 0x74F5, 0x7521, +0x755B, 0x755F, 0x75B0, 0x75C1, +0x75BB, 0x75C4, 0x75C0, 0x75BF, +0x75B6, 0x75BA, 0x768A, 0x76C9, +0x771D, 0x771B, 0x7710, 0x7713, +0x7712, 0x7723, 0x7711, 0x7715, +0x7719, 0x771A, 0x7722, 0x7727, +0x7823, 0x782C, 0x7822, 0x7835, +0x782F, 0x7828, 0x782E, 0x782B, +0x7821, 0x7829, 0x7833, 0x782A, +0x7831, 0x7954, 0x795B, 0x794F, +0x795C, 0x7953, 0x7952, 0x7951, +0x79EB, 0x79EC, 0x79E0, 0x79EE, +0x79ED, 0x79EA, 0x79DC, 0x79DE, +0x79DD, 0x7A86, 0x7A89, 0x7A85, +0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, +0x7AD8, 0x7B10, 0x7B04, 0x7B13, +0x7B05, 0x7B0F, 0x7B08, 0x7B0A, +0x7B0E, 0x7B09, 0x7B12, 0x7C84, +0x7C91, 0x7C8A, 0x7C8C, 0x7C88, +0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, +0x7D11, 0x7D0E, 0x7D18, 0x7D16, +0x7D13, 0x7D1F, 0x7D12, 0x7D0F, +0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, +0x7F60, 0x7F5D, 0x7F5B, 0x7F96, +0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, +0x8016, 0x803E, 0x8039, 0x80FA, +0x80F2, 0x80F9, 0x80F5, 0x8101, +0x80FB, 0x8100, 0x8201, 0x822F, +0x8225, 0x8333, 0x832D, 0x8344, +0x8319, 0x8351, 0x8325, 0x8356, +0x833F, 0x8341, 0x8326, 0x831C, +0x8322, 0x8342, 0x834E, 0x831B, +0x832A, 0x8308, 0x833C, 0x834D, +0x8316, 0x8324, 0x8320, 0x8337, +0x832F, 0x8329, 0x8347, 0x8345, +0x834C, 0x8353, 0x831E, 0x832C, +0x834B, 0x8327, 0x8348, 0x8653, +0x8652, 0x86A2, 0x86A8, 0x8696, +0x868D, 0x8691, 0x869E, 0x8687, +0x8697, 0x8686, 0x868B, 0x869A, +0x8685, 0x86A5, 0x8699, 0x86A1, +0x86A7, 0x8695, 0x8698, 0x868E, +0x869D, 0x8690, 0x8694, 0x8843, +0x8844, 0x886D, 0x8875, 0x8876, +0x8872, 0x8880, 0x8871, 0x887F, +0x886F, 0x8883, 0x887E, 0x8874, +0x887C, 0x8A12, 0x8C47, 0x8C57, +0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, +0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, +0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, +0x9002, 0x8FFF, 0x8FFB, 0x9004, +0x8FFC, 0x8FF6, 0x90D6, 0x90E0, +0x90D9, 0x90DA, 0x90E3, 0x90DF, +0x90E5, 0x90D8, 0x90DB, 0x90D7, +0x90DC, 0x90E4, 0x9150, 0x914E, +0x914F, 0x91D5, 0x91E2, 0x91DA, +0x965C, 0x965F, 0x96BC, 0x98E3, +0x9ADF, 0x9B2F, 0x4E7F, 0x5070, +0x506A, 0x5061, 0x505E, 0x5060, +0x5053, 0x504B, 0x505D, 0x5072, +0x5048, 0x504D, 0x5041, 0x505B, +0x504A, 0x5062, 0x5015, 0x5045, +0x505F, 0x5069, 0x506B, 0x5063, +0x5064, 0x5046, 0x5040, 0x506E, +0x5073, 0x5057, 0x5051, 0x51D0, +0x526B, 0x526D, 0x526C, 0x526E, +0x52D6, 0x52D3, 0x532D, 0x539C, +0x5575, 0x5576, 0x553C, 0x554D, +0x5550, 0x5534, 0x552A, 0x5551, +0x5562, 0x5536, 0x5535, 0x5530, +0x5552, 0x5545, 0x550C, 0x5532, +0x5565, 0x554E, 0x5539, 0x5548, +0x552D, 0x553B, 0x5540, 0x554B, +0x570A, 0x5707, 0x57FB, 0x5814, +0x57E2, 0x57F6, 0x57DC, 0x57F4, +0x5800, 0x57ED, 0x57FD, 0x5808, +0x57F8, 0x580B, 0x57F3, 0x57CF, +0x5807, 0x57EE, 0x57E3, 0x57F2, +0x57E5, 0x57EC, 0x57E1, 0x580E, +0x57FC, 0x5810, 0x57E7, 0x5801, +0x580C, 0x57F1, 0x57E9, 0x57F0, +0x580D, 0x5804, 0x595C, 0x5A60, +0x5A58, 0x5A55, 0x5A67, 0x5A5E, +0x5A38, 0x5A35, 0x5A6D, 0x5A50, +0x5A5F, 0x5A65, 0x5A6C, 0x5A53, +0x5A64, 0x5A57, 0x5A43, 0x5A5D, +0x5A52, 0x5A44, 0x5A5B, 0x5A48, +0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, +0x5A4C, 0x5A70, 0x5A69, 0x5A47, +0x5A51, 0x5A56, 0x5A42, 0x5A5C, +0x5B72, 0x5B6E, 0x5BC1, 0x5BC0, +0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, +0x5D1A, 0x5D20, 0x5D0C, 0x5D28, +0x5D0D, 0x5D26, 0x5D25, 0x5D0F, +0x5D30, 0x5D12, 0x5D23, 0x5D1F, +0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, +0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, +0x5F36, 0x5F38, 0x5F9B, 0x5F96, +0x5F9F, 0x608A, 0x6090, 0x6086, +0x60BE, 0x60B0, 0x60BA, 0x60D3, +0x60D4, 0x60CF, 0x60E4, 0x60D9, +0x60DD, 0x60C8, 0x60B1, 0x60DB, +0x60B7, 0x60CA, 0x60BF, 0x60C3, +0x60CD, 0x60C0, 0x6332, 0x6365, +0x638A, 0x6382, 0x637D, 0x63BD, +0x639E, 0x63AD, 0x639D, 0x6397, +0x63AB, 0x638E, 0x636F, 0x6387, +0x6390, 0x636E, 0x63AF, 0x6375, +0x639C, 0x636D, 0x63AE, 0x637C, +0x63A4, 0x633B, 0x639F, 0x6378, +0x6385, 0x6381, 0x6391, 0x638D, +0x6370, 0x6553, 0x65CD, 0x6665, +0x6661, 0x665B, 0x6659, 0x665C, +0x6662, 0x6718, 0x6879, 0x6887, +0x6890, 0x689C, 0x686D, 0x686E, +0x68AE, 0x68AB, 0x6956, 0x686F, +0x68A3, 0x68AC, 0x68A9, 0x6875, +0x6874, 0x68B2, 0x688F, 0x6877, +0x6892, 0x687C, 0x686B, 0x6872, +0x68AA, 0x6880, 0x6871, 0x687E, +0x689B, 0x6896, 0x688B, 0x68A0, +0x6889, 0x68A4, 0x6878, 0x687B, +0x6891, 0x688C, 0x688A, 0x687D, +0x6B36, 0x6B33, 0x6B37, 0x6B38, +0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, +0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, +0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, +0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, +0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, +0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, +0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, +0x6DCA, 0x6DBD, 0x6DED, 0x6DF0, +0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, +0x6DC9, 0x6DD0, 0x6DF2, 0x6DD3, +0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, +0x6DBB, 0x70FA, 0x710D, 0x70F7, +0x7117, 0x70F4, 0x710C, 0x70F0, +0x7104, 0x70F3, 0x7110, 0x70FC, +0x70FF, 0x7106, 0x7113, 0x7100, +0x70F8, 0x70F6, 0x710B, 0x7102, +0x710E, 0x727E, 0x727B, 0x727C, +0x727F, 0x731D, 0x7317, 0x7307, +0x7311, 0x7318, 0x730A, 0x7308, +0x72FF, 0x730F, 0x731E, 0x7388, +0x73F6, 0x73F8, 0x73F5, 0x7404, +0x7401, 0x73FD, 0x7407, 0x7400, +0x73FA, 0x73FC, 0x73FF, 0x740C, +0x740B, 0x73F4, 0x7408, 0x7564, +0x7563, 0x75CE, 0x75D2, 0x75CF, +0x75CB, 0x75CC, 0x75D1, 0x75D0, +0x768F, 0x7689, 0x76D3, 0x7739, +0x772F, 0x772D, 0x7731, 0x7732, +0x7734, 0x7733, 0x773D, 0x7725, +0x773B, 0x7735, 0x7848, 0x7852, +0x7849, 0x784D, 0x784A, 0x784C, +0x7826, 0x7845, 0x7850, 0x7964, +0x7967, 0x7969, 0x796A, 0x7963, +0x796B, 0x7961, 0x79BB, 0x79FA, +0x79F8, 0x79F6, 0x79F7, 0x7A8F, +0x7A94, 0x7A90, 0x7B35, 0x7B47, +0x7B34, 0x7B25, 0x7B30, 0x7B22, +0x7B24, 0x7B33, 0x7B18, 0x7B2A, +0x7B1D, 0x7B31, 0x7B2B, 0x7B2D, +0x7B2F, 0x7B32, 0x7B38, 0x7B1A, +0x7B23, 0x7C94, 0x7C98, 0x7C96, +0x7CA3, 0x7D35, 0x7D3D, 0x7D38, +0x7D36, 0x7D3A, 0x7D45, 0x7D2C, +0x7D29, 0x7D41, 0x7D47, 0x7D3E, +0x7D3F, 0x7D4A, 0x7D3B, 0x7D28, +0x7F63, 0x7F95, 0x7F9C, 0x7F9D, +0x7F9B, 0x7FCA, 0x7FCB, 0x7FCD, +0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, +0x7FC9, 0x801F, 0x801E, 0x801B, +0x8047, 0x8043, 0x8048, 0x8118, +0x8125, 0x8119, 0x811B, 0x812D, +0x811F, 0x812C, 0x811E, 0x8121, +0x8115, 0x8127, 0x811D, 0x8122, +0x8211, 0x8238, 0x8233, 0x823A, +0x8234, 0x8232, 0x8274, 0x8390, +0x83A3, 0x83A8, 0x838D, 0x837A, +0x8373, 0x83A4, 0x8374, 0x838F, +0x8381, 0x8395, 0x8399, 0x8375, +0x8394, 0x83A9, 0x837D, 0x8383, +0x838C, 0x839D, 0x839B, 0x83AA, +0x838B, 0x837E, 0x83A5, 0x83AF, +0x8388, 0x8397, 0x83B0, 0x837F, +0x83A6, 0x8387, 0x83AE, 0x8376, +0x839A, 0x8659, 0x8656, 0x86BF, +0x86B7, 0x86C2, 0x86C1, 0x86C5, +0x86BA, 0x86B0, 0x86C8, 0x86B9, +0x86B3, 0x86B8, 0x86CC, 0x86B4, +0x86BB, 0x86BC, 0x86C3, 0x86BD, +0x86BE, 0x8852, 0x8889, 0x8895, +0x88A8, 0x88A2, 0x88AA, 0x889A, +0x8891, 0x88A1, 0x889F, 0x8898, +0x88A7, 0x8899, 0x889B, 0x8897, +0x88A4, 0x88AC, 0x888C, 0x8893, +0x888E, 0x8982, 0x89D6, 0x89D9, +0x89D5, 0x8A30, 0x8A27, 0x8A2C, +0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, +0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, +0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, +0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, +0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, +0x8EE0, 0x8EE1, 0x9024, 0x900B, +0x9011, 0x901C, 0x900C, 0x9021, +0x90EF, 0x90EA, 0x90F0, 0x90F4, +0x90F2, 0x90F3, 0x90D4, 0x90EB, +0x90EC, 0x90E9, 0x9156, 0x9158, +0x915A, 0x9153, 0x9155, 0x91EC, +0x91F4, 0x91F1, 0x91F3, 0x91F8, +0x91E4, 0x91F9, 0x91EA, 0x91EB, +0x91F7, 0x91E8, 0x91EE, 0x957A, +0x9586, 0x9588, 0x967C, 0x966D, +0x966B, 0x9671, 0x966F, 0x96BF, +0x976A, 0x9804, 0x98E5, 0x9997, +0x509B, 0x5095, 0x5094, 0x509E, +0x508B, 0x50A3, 0x5083, 0x508C, +0x508E, 0x509D, 0x5068, 0x509C, +0x5092, 0x5082, 0x5087, 0x515F, +0x51D4, 0x5312, 0x5311, 0x53A4, +0x53A7, 0x5591, 0x55A8, 0x55A5, +0x55AD, 0x5577, 0x5645, 0x55A2, +0x5593, 0x5588, 0x558F, 0x55B5, +0x5581, 0x55A3, 0x5592, 0x55A4, +0x557D, 0x558C, 0x55A6, 0x557F, +0x5595, 0x55A1, 0x558E, 0x570C, +0x5829, 0x5837, 0x5819, 0x581E, +0x5827, 0x5823, 0x5828, 0x57F5, +0x5848, 0x5825, 0x581C, 0x581B, +0x5833, 0x583F, 0x5836, 0x582E, +0x5839, 0x5838, 0x582D, 0x582C, +0x583B, 0x5961, 0x5AAF, 0x5A94, +0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, +0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, +0x5AAC, 0x5A95, 0x5AAE, 0x5A37, +0x5A84, 0x5A8A, 0x5A97, 0x5A83, +0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, +0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, +0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, +0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, +0x5C0C, 0x5C30, 0x5D37, 0x5D43, +0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, +0x5D35, 0x5D51, 0x5D4E, 0x5D55, +0x5D33, 0x5D3A, 0x5D52, 0x5D3D, +0x5D31, 0x5D59, 0x5D42, 0x5D39, +0x5D49, 0x5D38, 0x5D3C, 0x5D32, +0x5D36, 0x5D40, 0x5D45, 0x5E44, +0x5E41, 0x5F58, 0x5FA6, 0x5FA5, +0x5FAB, 0x60C9, 0x60B9, 0x60CC, +0x60E2, 0x60CE, 0x60C4, 0x6114, +0x60F2, 0x610A, 0x6116, 0x6105, +0x60F5, 0x6113, 0x60F8, 0x60FC, +0x60FE, 0x60C1, 0x6103, 0x6118, +0x611D, 0x6110, 0x60FF, 0x6104, +0x610B, 0x624A, 0x6394, 0x63B1, +0x63B0, 0x63CE, 0x63E5, 0x63E8, +0x63EF, 0x63C3, 0x649D, 0x63F3, +0x63CA, 0x63E0, 0x63F6, 0x63D5, +0x63F2, 0x63F5, 0x6461, 0x63DF, +0x63BE, 0x63DD, 0x63DC, 0x63C4, +0x63D8, 0x63D3, 0x63C2, 0x63C7, +0x63CC, 0x63CB, 0x63C8, 0x63F0, +0x63D7, 0x63D9, 0x6532, 0x6567, +0x656A, 0x6564, 0x655C, 0x6568, +0x6565, 0x658C, 0x659D, 0x659E, +0x65AE, 0x65D0, 0x65D2, 0x667C, +0x666C, 0x667B, 0x6680, 0x6671, +0x6679, 0x666A, 0x6672, 0x6701, +0x690C, 0x68D3, 0x6904, 0x68DC, +0x692A, 0x68EC, 0x68EA, 0x68F1, +0x690F, 0x68D6, 0x68F7, 0x68EB, +0x68E4, 0x68F6, 0x6913, 0x6910, +0x68F3, 0x68E1, 0x6907, 0x68CC, +0x6908, 0x6970, 0x68B4, 0x6911, +0x68EF, 0x68C6, 0x6914, 0x68F8, +0x68D0, 0x68FD, 0x68FC, 0x68E8, +0x690B, 0x690A, 0x6917, 0x68CE, +0x68C8, 0x68DD, 0x68DE, 0x68E6, +0x68F4, 0x68D1, 0x6906, 0x68D4, +0x68E9, 0x6915, 0x6925, 0x68C7, +0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, +0x6B94, 0x6B97, 0x6B99, 0x6B95, +0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, +0x6C30, 0x6DFC, 0x6E46, 0x6E47, +0x6E1F, 0x6E49, 0x6E88, 0x6E3C, +0x6E3D, 0x6E45, 0x6E62, 0x6E2B, +0x6E3F, 0x6E41, 0x6E5D, 0x6E73, +0x6E1C, 0x6E33, 0x6E4B, 0x6E40, +0x6E51, 0x6E3B, 0x6E03, 0x6E2E, +0x6E5E, 0x6E68, 0x6E5C, 0x6E61, +0x6E31, 0x6E28, 0x6E60, 0x6E71, +0x6E6B, 0x6E39, 0x6E22, 0x6E30, +0x6E53, 0x6E65, 0x6E27, 0x6E78, +0x6E64, 0x6E77, 0x6E55, 0x6E79, +0x6E52, 0x6E66, 0x6E35, 0x6E36, +0x6E5A, 0x7120, 0x711E, 0x712F, +0x70FB, 0x712E, 0x7131, 0x7123, +0x7125, 0x7122, 0x7132, 0x711F, +0x7128, 0x713A, 0x711B, 0x724B, +0x725A, 0x7288, 0x7289, 0x7286, +0x7285, 0x728B, 0x7312, 0x730B, +0x7330, 0x7322, 0x7331, 0x7333, +0x7327, 0x7332, 0x732D, 0x7326, +0x7323, 0x7335, 0x730C, 0x742E, +0x742C, 0x7430, 0x742B, 0x7416, +0x741A, 0x7421, 0x742D, 0x7431, +0x7424, 0x7423, 0x741D, 0x7429, +0x7420, 0x7432, 0x74FB, 0x752F, +0x756F, 0x756C, 0x75E7, 0x75DA, +0x75E1, 0x75E6, 0x75DD, 0x75DF, +0x75E4, 0x75D7, 0x7695, 0x7692, +0x76DA, 0x7746, 0x7747, 0x7744, +0x774D, 0x7745, 0x774A, 0x774E, +0x774B, 0x774C, 0x77DE, 0x77EC, +0x7860, 0x7864, 0x7865, 0x785C, +0x786D, 0x7871, 0x786A, 0x786E, +0x7870, 0x7869, 0x7868, 0x785E, +0x7862, 0x7974, 0x7973, 0x7972, +0x7970, 0x7A02, 0x7A0A, 0x7A03, +0x7A0C, 0x7A04, 0x7A99, 0x7AE6, +0x7AE4, 0x7B4A, 0x7B3B, 0x7B44, +0x7B48, 0x7B4C, 0x7B4E, 0x7B40, +0x7B58, 0x7B45, 0x7CA2, 0x7C9E, +0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, +0x7D63, 0x7D53, 0x7D56, 0x7D67, +0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, +0x7D6B, 0x7D52, 0x7D54, 0x7D69, +0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, +0x7F3F, 0x7F65, 0x7F66, 0x7FA2, +0x7FA0, 0x7FA1, 0x7FD7, 0x8051, +0x804F, 0x8050, 0x80FE, 0x80D4, +0x8143, 0x814A, 0x8152, 0x814F, +0x8147, 0x813D, 0x814D, 0x813A, +0x81E6, 0x81EE, 0x81F7, 0x81F8, +0x81F9, 0x8204, 0x823C, 0x823D, +0x823F, 0x8275, 0x833B, 0x83CF, +0x83F9, 0x8423, 0x83C0, 0x83E8, +0x8412, 0x83E7, 0x83E4, 0x83FC, +0x83F6, 0x8410, 0x83C6, 0x83C8, +0x83EB, 0x83E3, 0x83BF, 0x8401, +0x83DD, 0x83E5, 0x83D8, 0x83FF, +0x83E1, 0x83CB, 0x83CE, 0x83D6, +0x83F5, 0x83C9, 0x8409, 0x840F, +0x83DE, 0x8411, 0x8406, 0x83C2, +0x83F3, 0x83D5, 0x83FA, 0x83C7, +0x83D1, 0x83EA, 0x8413, 0x83C3, +0x83EC, 0x83EE, 0x83C4, 0x83FB, +0x83D7, 0x83E2, 0x841B, 0x83DB, +0x83FE, 0x86D8, 0x86E2, 0x86E6, +0x86D3, 0x86E3, 0x86DA, 0x86EA, +0x86DD, 0x86EB, 0x86DC, 0x86EC, +0x86E9, 0x86D7, 0x86E8, 0x86D1, +0x8848, 0x8856, 0x8855, 0x88BA, +0x88D7, 0x88B9, 0x88B8, 0x88C0, +0x88BE, 0x88B6, 0x88BC, 0x88B7, +0x88BD, 0x88B2, 0x8901, 0x88C9, +0x8995, 0x8998, 0x8997, 0x89DD, +0x89DA, 0x89DB, 0x8A4E, 0x8A4D, +0x8A39, 0x8A59, 0x8A40, 0x8A57, +0x8A58, 0x8A44, 0x8A45, 0x8A52, +0x8A48, 0x8A51, 0x8A4A, 0x8A4C, +0x8A4F, 0x8C5F, 0x8C81, 0x8C80, +0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, +0x8CB5, 0x8D84, 0x8D80, 0x8D89, +0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, +0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, +0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, +0x8EEF, 0x8EF7, 0x8EFA, 0x8EF9, +0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, +0x8EE7, 0x8EE8, 0x8EF6, 0x8EEB, +0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, +0x902D, 0x9034, 0x902F, 0x9106, +0x912C, 0x9104, 0x90FF, 0x90FC, +0x9108, 0x90F9, 0x90FB, 0x9101, +0x9100, 0x9107, 0x9105, 0x9103, +0x9161, 0x9164, 0x915F, 0x9162, +0x9160, 0x9201, 0x920A, 0x9225, +0x9203, 0x921A, 0x9226, 0x920F, +0x920C, 0x9200, 0x9212, 0x91FF, +0x91FD, 0x9206, 0x9204, 0x9227, +0x9202, 0x921C, 0x9224, 0x9219, +0x9217, 0x9205, 0x9216, 0x957B, +0x958D, 0x958C, 0x9590, 0x9687, +0x967E, 0x9688, 0x9689, 0x9683, +0x9680, 0x96C2, 0x96C8, 0x96C3, +0x96F1, 0x96F0, 0x976C, 0x9770, +0x976E, 0x9807, 0x98A9, 0x98EB, +0x9CE6, 0x9EF9, 0x4E83, 0x4E84, +0x4EB6, 0x50BD, 0x50BF, 0x50C6, +0x50AE, 0x50C4, 0x50CA, 0x50B4, +0x50C8, 0x50C2, 0x50B0, 0x50C1, +0x50BA, 0x50B1, 0x50CB, 0x50C9, +0x50B6, 0x50B8, 0x51D7, 0x527A, +0x5278, 0x527B, 0x527C, 0x55C3, +0x55DB, 0x55CC, 0x55D0, 0x55CB, +0x55CA, 0x55DD, 0x55C0, 0x55D4, +0x55C4, 0x55E9, 0x55BF, 0x55D2, +0x558D, 0x55CF, 0x55D5, 0x55E2, +0x55D6, 0x55C8, 0x55F2, 0x55CD, +0x55D9, 0x55C2, 0x5714, 0x5853, +0x5868, 0x5864, 0x584F, 0x584D, +0x5849, 0x586F, 0x5855, 0x584E, +0x585D, 0x5859, 0x5865, 0x585B, +0x583D, 0x5863, 0x5871, 0x58FC, +0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, +0x5AB8, 0x5AB1, 0x5AB5, 0x5AB0, +0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, +0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, +0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, +0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, +0x5C33, 0x5D71, 0x5D63, 0x5D4A, +0x5D65, 0x5D72, 0x5D6C, 0x5D5E, +0x5D68, 0x5D67, 0x5D62, 0x5DF0, +0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, +0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, +0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, +0x5FAD, 0x60F7, 0x6149, 0x614A, +0x612B, 0x6145, 0x6136, 0x6132, +0x612E, 0x6146, 0x612F, 0x614F, +0x6129, 0x6140, 0x6220, 0x9168, +0x6223, 0x6225, 0x6224, 0x63C5, +0x63F1, 0x63EB, 0x6410, 0x6412, +0x6409, 0x6420, 0x6424, 0x6433, +0x6443, 0x641F, 0x6415, 0x6418, +0x6439, 0x6437, 0x6422, 0x6423, +0x640C, 0x6426, 0x6430, 0x6428, +0x6441, 0x6435, 0x642F, 0x640A, +0x641A, 0x6440, 0x6425, 0x6427, +0x640B, 0x63E7, 0x641B, 0x642E, +0x6421, 0x640E, 0x656F, 0x6592, +0x65D3, 0x6686, 0x668C, 0x6695, +0x6690, 0x668B, 0x668A, 0x6699, +0x6694, 0x6678, 0x6720, 0x6966, +0x695F, 0x6938, 0x694E, 0x6962, +0x6971, 0x693F, 0x6945, 0x696A, +0x6939, 0x6942, 0x6957, 0x6959, +0x697A, 0x6948, 0x6949, 0x6935, +0x696C, 0x6933, 0x693D, 0x6965, +0x68F0, 0x6978, 0x6934, 0x6969, +0x6940, 0x696F, 0x6944, 0x6976, +0x6958, 0x6941, 0x6974, 0x694C, +0x693B, 0x694B, 0x6937, 0x695C, +0x694F, 0x6951, 0x6932, 0x6952, +0x692F, 0x697B, 0x693C, 0x6B46, +0x6B45, 0x6B43, 0x6B42, 0x6B48, +0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, +0x6BFC, 0x6BF9, 0x6BF7, 0x6BF8, +0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, +0x6EC0, 0x6E9F, 0x6E93, 0x6E94, +0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, +0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, +0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, +0x6EA6, 0x6ECF, 0x6EB2, 0x6EBE, +0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, +0x6E92, 0x6E8E, 0x6E8D, 0x6EA4, +0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, +0x6ECA, 0x6E97, 0x6EAE, 0x6EA3, +0x7147, 0x7154, 0x7152, 0x7163, +0x7160, 0x7141, 0x715D, 0x7162, +0x7172, 0x7178, 0x716A, 0x7161, +0x7142, 0x7158, 0x7143, 0x714B, +0x7170, 0x715F, 0x7150, 0x7153, +0x7144, 0x714D, 0x715A, 0x724F, +0x728D, 0x728C, 0x7291, 0x7290, +0x728E, 0x733C, 0x7342, 0x733B, +0x733A, 0x7340, 0x734A, 0x7349, +0x7444, 0x744A, 0x744B, 0x7452, +0x7451, 0x7457, 0x7440, 0x744F, +0x7450, 0x744E, 0x7442, 0x7446, +0x744D, 0x7454, 0x74E1, 0x74FF, +0x74FE, 0x74FD, 0x751D, 0x7579, +0x7577, 0x6983, 0x75EF, 0x760F, +0x7603, 0x75F7, 0x75FE, 0x75FC, +0x75F9, 0x75F8, 0x7610, 0x75FB, +0x75F6, 0x75ED, 0x75F5, 0x75FD, +0x7699, 0x76B5, 0x76DD, 0x7755, +0x775F, 0x7760, 0x7752, 0x7756, +0x775A, 0x7769, 0x7767, 0x7754, +0x7759, 0x776D, 0x77E0, 0x7887, +0x789A, 0x7894, 0x788F, 0x7884, +0x7895, 0x7885, 0x7886, 0x78A1, +0x7883, 0x7879, 0x7899, 0x7880, +0x7896, 0x787B, 0x797C, 0x7982, +0x797D, 0x7979, 0x7A11, 0x7A18, +0x7A19, 0x7A12, 0x7A17, 0x7A15, +0x7A22, 0x7A13, 0x7A1B, 0x7A10, +0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, +0x7B66, 0x7B64, 0x7B6D, 0x7B74, +0x7B69, 0x7B72, 0x7B65, 0x7B73, +0x7B71, 0x7B70, 0x7B61, 0x7B78, +0x7B76, 0x7B63, 0x7CB2, 0x7CB4, +0x7CAF, 0x7D88, 0x7D86, 0x7D80, +0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, +0x7D8E, 0x7D7B, 0x7D83, 0x7D7C, +0x7D8C, 0x7D94, 0x7D84, 0x7D7D, +0x7D92, 0x7F6D, 0x7F6B, 0x7F67, +0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, +0x7FA7, 0x7FDB, 0x7FDC, 0x8021, +0x8164, 0x8160, 0x8177, 0x815C, +0x8169, 0x815B, 0x8162, 0x8172, +0x6721, 0x815E, 0x8176, 0x8167, +0x816F, 0x8144, 0x8161, 0x821D, +0x8249, 0x8244, 0x8240, 0x8242, +0x8245, 0x84F1, 0x843F, 0x8456, +0x8476, 0x8479, 0x848F, 0x848D, +0x8465, 0x8451, 0x8440, 0x8486, +0x8467, 0x8430, 0x844D, 0x847D, +0x845A, 0x8459, 0x8474, 0x8473, +0x845D, 0x8507, 0x845E, 0x8437, +0x843A, 0x8434, 0x847A, 0x8443, +0x8478, 0x8432, 0x8445, 0x8429, +0x83D9, 0x844B, 0x842F, 0x8442, +0x842D, 0x845F, 0x8470, 0x8439, +0x844E, 0x844C, 0x8452, 0x846F, +0x84C5, 0x848E, 0x843B, 0x8447, +0x8436, 0x8433, 0x8468, 0x847E, +0x8444, 0x842B, 0x8460, 0x8454, +0x846E, 0x8450, 0x870B, 0x8704, +0x86F7, 0x870C, 0x86FA, 0x86D6, +0x86F5, 0x874D, 0x86F8, 0x870E, +0x8709, 0x8701, 0x86F6, 0x870D, +0x8705, 0x88D6, 0x88CB, 0x88CD, +0x88CE, 0x88DE, 0x88DB, 0x88DA, +0x88CC, 0x88D0, 0x8985, 0x899B, +0x89DF, 0x89E5, 0x89E4, 0x89E1, +0x89E0, 0x89E2, 0x89DC, 0x89E6, +0x8A76, 0x8A86, 0x8A7F, 0x8A61, +0x8A3F, 0x8A77, 0x8A82, 0x8A84, +0x8A75, 0x8A83, 0x8A81, 0x8A74, +0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, +0x8C65, 0x8C64, 0x8C66, 0x8C86, +0x8C84, 0x8C85, 0x8CCC, 0x8D68, +0x8D69, 0x8D91, 0x8D8C, 0x8D8E, +0x8D8F, 0x8D8D, 0x8D93, 0x8D94, +0x8D90, 0x8D92, 0x8DF0, 0x8DE0, +0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, +0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, +0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, +0x8EFF, 0x8F01, 0x8F00, 0x8F05, +0x8F07, 0x8F08, 0x8F02, 0x8F0B, +0x9052, 0x903F, 0x9044, 0x9049, +0x903D, 0x9110, 0x910D, 0x910F, +0x9111, 0x9116, 0x9114, 0x910B, +0x910E, 0x916E, 0x916F, 0x9248, +0x9252, 0x9230, 0x923A, 0x9266, +0x9233, 0x9265, 0x925E, 0x9283, +0x922E, 0x924A, 0x9246, 0x926D, +0x926C, 0x924F, 0x9260, 0x9267, +0x926F, 0x9236, 0x9261, 0x9270, +0x9231, 0x9254, 0x9263, 0x9250, +0x9272, 0x924E, 0x9253, 0x924C, +0x9256, 0x9232, 0x959F, 0x959C, +0x959E, 0x959B, 0x9692, 0x9693, +0x9691, 0x9697, 0x96CE, 0x96FA, +0x96FD, 0x96F8, 0x96F5, 0x9773, +0x9777, 0x9778, 0x9772, 0x980F, +0x980D, 0x980E, 0x98AC, 0x98F6, +0x98F9, 0x99AF, 0x99B2, 0x99B0, +0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, +0x9CEA, 0x9CED, 0x9CE7, 0x9E80, +0x9EFD, 0x50E6, 0x50D4, 0x50D7, +0x50E8, 0x50F3, 0x50DB, 0x50EA, +0x50DD, 0x50E4, 0x50D3, 0x50EC, +0x50F0, 0x50EF, 0x50E3, 0x50E0, +0x51D8, 0x5280, 0x5281, 0x52E9, +0x52EB, 0x5330, 0x53AC, 0x5627, +0x5615, 0x560C, 0x5612, 0x55FC, +0x560F, 0x561C, 0x5601, 0x5613, +0x5602, 0x55FA, 0x561D, 0x5604, +0x55FF, 0x55F9, 0x5889, 0x587C, +0x5890, 0x5898, 0x5886, 0x5881, +0x587F, 0x5874, 0x588B, 0x587A, +0x5887, 0x5891, 0x588E, 0x5876, +0x5882, 0x5888, 0x587B, 0x5894, +0x588F, 0x58FE, 0x596B, 0x5ADC, +0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, +0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, +0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, +0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, +0x5ADF, 0x5B77, 0x5BE0, 0x5BE3, +0x5C63, 0x5D82, 0x5D80, 0x5D7D, +0x5D86, 0x5D7A, 0x5D81, 0x5D77, +0x5D8A, 0x5D89, 0x5D88, 0x5D7E, +0x5D7C, 0x5D8D, 0x5D79, 0x5D7F, +0x5E58, 0x5E59, 0x5E53, 0x5ED8, +0x5ED1, 0x5ED7, 0x5ECE, 0x5EDC, +0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, +0x5F44, 0x5F43, 0x5F6F, 0x5FB6, +0x612C, 0x6128, 0x6141, 0x615E, +0x6171, 0x6173, 0x6152, 0x6153, +0x6172, 0x616C, 0x6180, 0x6174, +0x6154, 0x617A, 0x615B, 0x6165, +0x613B, 0x616A, 0x6161, 0x6156, +0x6229, 0x6227, 0x622B, 0x642B, +0x644D, 0x645B, 0x645D, 0x6474, +0x6476, 0x6472, 0x6473, 0x647D, +0x6475, 0x6466, 0x64A6, 0x644E, +0x6482, 0x645E, 0x645C, 0x644B, +0x6453, 0x6460, 0x6450, 0x647F, +0x643F, 0x646C, 0x646B, 0x6459, +0x6465, 0x6477, 0x6573, 0x65A0, +0x66A1, 0x66A0, 0x669F, 0x6705, +0x6704, 0x6722, 0x69B1, 0x69B6, +0x69C9, 0x69A0, 0x69CE, 0x6996, +0x69B0, 0x69AC, 0x69BC, 0x6991, +0x6999, 0x698E, 0x69A7, 0x698D, +0x69A9, 0x69BE, 0x69AF, 0x69BF, +0x69C4, 0x69BD, 0x69A4, 0x69D4, +0x69B9, 0x69CA, 0x699A, 0x69CF, +0x69B3, 0x6993, 0x69AA, 0x69A1, +0x699E, 0x69D9, 0x6997, 0x6990, +0x69C2, 0x69B5, 0x69A5, 0x69C6, +0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, +0x6B9F, 0x6BA0, 0x6BC3, 0x6BC4, +0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, +0x6F03, 0x6F25, 0x6EF8, 0x6F37, +0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, +0x6F19, 0x6F1A, 0x6F27, 0x6F18, +0x6F3B, 0x6F12, 0x6EED, 0x6F0A, +0x6F36, 0x6F73, 0x6EF9, 0x6EEE, +0x6F2D, 0x6F40, 0x6F30, 0x6F3C, +0x6F35, 0x6EEB, 0x6F07, 0x6F0E, +0x6F43, 0x6F05, 0x6EFD, 0x6EF6, +0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, +0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, +0x6F21, 0x7187, 0x7190, 0x7189, +0x7180, 0x7185, 0x7182, 0x718F, +0x717B, 0x7186, 0x7181, 0x7197, +0x7244, 0x7253, 0x7297, 0x7295, +0x7293, 0x7343, 0x734D, 0x7351, +0x734C, 0x7462, 0x7473, 0x7471, +0x7475, 0x7472, 0x7467, 0x746E, +0x7500, 0x7502, 0x7503, 0x757D, +0x7590, 0x7616, 0x7608, 0x760C, +0x7615, 0x7611, 0x760A, 0x7614, +0x76B8, 0x7781, 0x777C, 0x7785, +0x7782, 0x776E, 0x7780, 0x776F, +0x777E, 0x7783, 0x78B2, 0x78AA, +0x78B4, 0x78AD, 0x78A8, 0x787E, +0x78AB, 0x789E, 0x78A5, 0x78A0, +0x78AC, 0x78A2, 0x78A4, 0x7998, +0x798A, 0x798B, 0x7996, 0x7995, +0x7994, 0x7993, 0x7997, 0x7988, +0x7992, 0x7990, 0x7A2B, 0x7A4A, +0x7A30, 0x7A2F, 0x7A28, 0x7A26, +0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, +0x7B88, 0x7B9C, 0x7B8A, 0x7B91, +0x7B90, 0x7B96, 0x7B8D, 0x7B8C, +0x7B9B, 0x7B8E, 0x7B85, 0x7B98, +0x5284, 0x7B99, 0x7BA4, 0x7B82, +0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, +0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, +0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, +0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, +0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, +0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, +0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, +0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, +0x7FDE, 0x8024, 0x805D, 0x805C, +0x8189, 0x8186, 0x8183, 0x8187, +0x818D, 0x818C, 0x818B, 0x8215, +0x8497, 0x84A4, 0x84A1, 0x849F, +0x84BA, 0x84CE, 0x84C2, 0x84AC, +0x84AE, 0x84AB, 0x84B9, 0x84B4, +0x84C1, 0x84CD, 0x84AA, 0x849A, +0x84B1, 0x84D0, 0x849D, 0x84A7, +0x84BB, 0x84A2, 0x8494, 0x84C7, +0x84CC, 0x849B, 0x84A9, 0x84AF, +0x84A8, 0x84D6, 0x8498, 0x84B6, +0x84CF, 0x84A0, 0x84D7, 0x84D4, +0x84D2, 0x84DB, 0x84B0, 0x8491, +0x8661, 0x8733, 0x8723, 0x8728, +0x876B, 0x8740, 0x872E, 0x871E, +0x8721, 0x8719, 0x871B, 0x8743, +0x872C, 0x8741, 0x873E, 0x8746, +0x8720, 0x8732, 0x872A, 0x872D, +0x873C, 0x8712, 0x873A, 0x8731, +0x8735, 0x8742, 0x8726, 0x8727, +0x8738, 0x8724, 0x871A, 0x8730, +0x8711, 0x88F7, 0x88E7, 0x88F1, +0x88F2, 0x88FA, 0x88FE, 0x88EE, +0x88FC, 0x88F6, 0x88FB, 0x88F0, +0x88EC, 0x88EB, 0x899D, 0x89A1, +0x899F, 0x899E, 0x89E9, 0x89EB, +0x89E8, 0x8AAB, 0x8A99, 0x8A8B, +0x8A92, 0x8A8F, 0x8A96, 0x8C3D, +0x8C68, 0x8C69, 0x8CD5, 0x8CCF, +0x8CD7, 0x8D96, 0x8E09, 0x8E02, +0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, +0x8E03, 0x8E07, 0x8E06, 0x8E05, +0x8DFE, 0x8E00, 0x8E04, 0x8F10, +0x8F11, 0x8F0E, 0x8F0D, 0x9123, +0x911C, 0x9120, 0x9122, 0x911F, +0x911D, 0x911A, 0x9124, 0x9121, +0x911B, 0x917A, 0x9172, 0x9179, +0x9173, 0x92A5, 0x92A4, 0x9276, +0x929B, 0x927A, 0x92A0, 0x9294, +0x92AA, 0x928D, 0x92A6, 0x929A, +0x92AB, 0x9279, 0x9297, 0x927F, +0x92A3, 0x92EE, 0x928E, 0x9282, +0x9295, 0x92A2, 0x927D, 0x9288, +0x92A1, 0x928A, 0x9286, 0x928C, +0x9299, 0x92A7, 0x927E, 0x9287, +0x92A9, 0x929D, 0x928B, 0x922D, +0x969E, 0x96A1, 0x96FF, 0x9758, +0x977D, 0x977A, 0x977E, 0x9783, +0x9780, 0x9782, 0x977B, 0x9784, +0x9781, 0x977F, 0x97CE, 0x97CD, +0x9816, 0x98AD, 0x98AE, 0x9902, +0x9900, 0x9907, 0x999D, 0x999C, +0x99C3, 0x99B9, 0x99BB, 0x99BA, +0x99C2, 0x99BD, 0x99C7, 0x9AB1, +0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, +0x9B60, 0x9B61, 0x9B5F, 0x9CF1, +0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, +0x5103, 0x5130, 0x50F8, 0x5106, +0x5107, 0x50F6, 0x50FE, 0x510B, +0x510C, 0x50FD, 0x510A, 0x528B, +0x528C, 0x52F1, 0x52EF, 0x5648, +0x5642, 0x564C, 0x5635, 0x5641, +0x564A, 0x5649, 0x5646, 0x5658, +0x565A, 0x5640, 0x5633, 0x563D, +0x562C, 0x563E, 0x5638, 0x562A, +0x563A, 0x571A, 0x58AB, 0x589D, +0x58B1, 0x58A0, 0x58A3, 0x58AF, +0x58AC, 0x58A5, 0x58A1, 0x58FF, +0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, +0x5AF6, 0x5B03, 0x5AF8, 0x5B02, +0x5AF9, 0x5B01, 0x5B07, 0x5B05, +0x5B0F, 0x5C67, 0x5D99, 0x5D97, +0x5D9F, 0x5D92, 0x5DA2, 0x5D93, +0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, +0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, +0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, +0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, +0x618B, 0x6183, 0x6179, 0x61B1, +0x61B0, 0x61A2, 0x6189, 0x619B, +0x6193, 0x61AF, 0x61AD, 0x619F, +0x6192, 0x61AA, 0x61A1, 0x618D, +0x6166, 0x61B3, 0x622D, 0x646E, +0x6470, 0x6496, 0x64A0, 0x6485, +0x6497, 0x649C, 0x648F, 0x648B, +0x648A, 0x648C, 0x64A3, 0x649F, +0x6468, 0x64B1, 0x6498, 0x6576, +0x657A, 0x6579, 0x657B, 0x65B2, +0x65B3, 0x66B5, 0x66B0, 0x66A9, +0x66B2, 0x66B7, 0x66AA, 0x66AF, +0x6A00, 0x6A06, 0x6A17, 0x69E5, +0x69F8, 0x6A15, 0x69F1, 0x69E4, +0x6A20, 0x69FF, 0x69EC, 0x69E2, +0x6A1B, 0x6A1D, 0x69FE, 0x6A27, +0x69F2, 0x69EE, 0x6A14, 0x69F7, +0x69E7, 0x6A40, 0x6A08, 0x69E6, +0x69FB, 0x6A0D, 0x69FC, 0x69EB, +0x6A09, 0x6A04, 0x6A18, 0x6A25, +0x6A0F, 0x69F6, 0x6A26, 0x6A07, +0x69F4, 0x6A16, 0x6B51, 0x6BA5, +0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, +0x6C00, 0x6BFF, 0x6C02, 0x6F41, +0x6F26, 0x6F7E, 0x6F87, 0x6FC6, +0x6F92, 0x6F8D, 0x6F89, 0x6F8C, +0x6F62, 0x6F4F, 0x6F85, 0x6F5A, +0x6F96, 0x6F76, 0x6F6C, 0x6F82, +0x6F55, 0x6F72, 0x6F52, 0x6F50, +0x6F57, 0x6F94, 0x6F93, 0x6F5D, +0x6F00, 0x6F61, 0x6F6B, 0x6F7D, +0x6F67, 0x6F90, 0x6F53, 0x6F8B, +0x6F69, 0x6F7F, 0x6F95, 0x6F63, +0x6F77, 0x6F6A, 0x6F7B, 0x71B2, +0x71AF, 0x719B, 0x71B0, 0x71A0, +0x719A, 0x71A9, 0x71B5, 0x719D, +0x71A5, 0x719E, 0x71A4, 0x71A1, +0x71AA, 0x719C, 0x71A7, 0x71B3, +0x7298, 0x729A, 0x7358, 0x7352, +0x735E, 0x735F, 0x7360, 0x735D, +0x735B, 0x7361, 0x735A, 0x7359, +0x7362, 0x7487, 0x7489, 0x748A, +0x7486, 0x7481, 0x747D, 0x7485, +0x7488, 0x747C, 0x7479, 0x7508, +0x7507, 0x757E, 0x7625, 0x761E, +0x7619, 0x761D, 0x761C, 0x7623, +0x761A, 0x7628, 0x761B, 0x769C, +0x769D, 0x769E, 0x769B, 0x778D, +0x778F, 0x7789, 0x7788, 0x78CD, +0x78BB, 0x78CF, 0x78CC, 0x78D1, +0x78CE, 0x78D4, 0x78C8, 0x78C3, +0x78C4, 0x78C9, 0x799A, 0x79A1, +0x79A0, 0x799C, 0x79A2, 0x799B, +0x6B76, 0x7A39, 0x7AB2, 0x7AB4, +0x7AB3, 0x7BB7, 0x7BCB, 0x7BBE, +0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, +0x7BCA, 0x7BB5, 0x7CC5, 0x7CC8, +0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, +0x7DEA, 0x7DE7, 0x7DD7, 0x7DE1, +0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, +0x7DF1, 0x7DF0, 0x7DEE, 0x7DDF, +0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, +0x7FED, 0x7FEB, 0x7FEA, 0x7FEC, +0x7FE6, 0x7FE8, 0x8064, 0x8067, +0x81A3, 0x819F, 0x819E, 0x8195, +0x81A2, 0x8199, 0x8197, 0x8216, +0x824F, 0x8253, 0x8252, 0x8250, +0x824E, 0x8251, 0x8524, 0x853B, +0x850F, 0x8500, 0x8529, 0x850E, +0x8509, 0x850D, 0x851F, 0x850A, +0x8527, 0x851C, 0x84FB, 0x852B, +0x84FA, 0x8508, 0x850C, 0x84F4, +0x852A, 0x84F2, 0x8515, 0x84F7, +0x84EB, 0x84F3, 0x84FC, 0x8512, +0x84EA, 0x84E9, 0x8516, 0x84FE, +0x8528, 0x851D, 0x852E, 0x8502, +0x84FD, 0x851E, 0x84F6, 0x8531, +0x8526, 0x84E7, 0x84E8, 0x84F0, +0x84EF, 0x84F9, 0x8518, 0x8520, +0x8530, 0x850B, 0x8519, 0x852F, +0x8662, 0x8756, 0x8763, 0x8764, +0x8777, 0x87E1, 0x8773, 0x8758, +0x8754, 0x875B, 0x8752, 0x8761, +0x875A, 0x8751, 0x875E, 0x876D, +0x876A, 0x8750, 0x874E, 0x875F, +0x875D, 0x876F, 0x876C, 0x877A, +0x876E, 0x875C, 0x8765, 0x874F, +0x877B, 0x8775, 0x8762, 0x8767, +0x8769, 0x885A, 0x8905, 0x890C, +0x8914, 0x890B, 0x8917, 0x8918, +0x8919, 0x8906, 0x8916, 0x8911, +0x890E, 0x8909, 0x89A2, 0x89A4, +0x89A3, 0x89ED, 0x89F0, 0x89EC, +0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, +0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, +0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, +0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, +0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, +0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, +0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, +0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, +0x8E23, 0x8E25, 0x8E24, 0x8E2E, +0x8E15, 0x8E1B, 0x8E16, 0x8E11, +0x8E19, 0x8E26, 0x8E27, 0x8E14, +0x8E12, 0x8E18, 0x8E13, 0x8E1C, +0x8E17, 0x8E1A, 0x8F2C, 0x8F24, +0x8F18, 0x8F1A, 0x8F20, 0x8F23, +0x8F16, 0x8F17, 0x9073, 0x9070, +0x906F, 0x9067, 0x906B, 0x912F, +0x912B, 0x9129, 0x912A, 0x9132, +0x9126, 0x912E, 0x9185, 0x9186, +0x918A, 0x9181, 0x9182, 0x9184, +0x9180, 0x92D0, 0x92C3, 0x92C4, +0x92C0, 0x92D9, 0x92B6, 0x92CF, +0x92F1, 0x92DF, 0x92D8, 0x92E9, +0x92D7, 0x92DD, 0x92CC, 0x92EF, +0x92C2, 0x92E8, 0x92CA, 0x92C8, +0x92CE, 0x92E6, 0x92CD, 0x92D5, +0x92C9, 0x92E0, 0x92DE, 0x92E7, +0x92D1, 0x92D3, 0x92B5, 0x92E1, +0x92C6, 0x92B4, 0x957C, 0x95AC, +0x95AB, 0x95AE, 0x95B0, 0x96A4, +0x96A2, 0x96D3, 0x9705, 0x9708, +0x9702, 0x975A, 0x978A, 0x978E, +0x9788, 0x97D0, 0x97CF, 0x981E, +0x981D, 0x9826, 0x9829, 0x9828, +0x9820, 0x981B, 0x9827, 0x98B2, +0x9908, 0x98FA, 0x9911, 0x9914, +0x9916, 0x9917, 0x9915, 0x99DC, +0x99CD, 0x99CF, 0x99D3, 0x99D4, +0x99CE, 0x99C9, 0x99D6, 0x99D8, +0x99CB, 0x99D7, 0x99CC, 0x9AB3, +0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, +0x9AF1, 0x9B46, 0x9B43, 0x9B67, +0x9B74, 0x9B71, 0x9B66, 0x9B76, +0x9B75, 0x9B70, 0x9B68, 0x9B64, +0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, +0x9CFF, 0x9CF7, 0x9D07, 0x9D00, +0x9CF9, 0x9CFB, 0x9D08, 0x9D05, +0x9D04, 0x9E83, 0x9ED3, 0x9F0F, +0x9F10, 0x511C, 0x5113, 0x5117, +0x511A, 0x5111, 0x51DE, 0x5334, +0x53E1, 0x5670, 0x5660, 0x566E, +0x5673, 0x5666, 0x5663, 0x566D, +0x5672, 0x565E, 0x5677, 0x571C, +0x571B, 0x58C8, 0x58BD, 0x58C9, +0x58BF, 0x58BA, 0x58C2, 0x58BC, +0x58C6, 0x5B17, 0x5B19, 0x5B1B, +0x5B21, 0x5B14, 0x5B13, 0x5B10, +0x5B16, 0x5B28, 0x5B1A, 0x5B20, +0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, +0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, +0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, +0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, +0x5E68, 0x5E66, 0x5E6F, 0x5EE9, +0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, +0x5F4B, 0x5FBC, 0x619D, 0x61A8, +0x6196, 0x61C5, 0x61B4, 0x61C6, +0x61C1, 0x61CC, 0x61BA, 0x61BF, +0x61B8, 0x618C, 0x64D7, 0x64D6, +0x64D0, 0x64CF, 0x64C9, 0x64BD, +0x6489, 0x64C3, 0x64DB, 0x64F3, +0x64D9, 0x6533, 0x657F, 0x657C, +0x65A2, 0x66C8, 0x66BE, 0x66C0, +0x66CA, 0x66CB, 0x66CF, 0x66BD, +0x66BB, 0x66BA, 0x66CC, 0x6723, +0x6A34, 0x6A66, 0x6A49, 0x6A67, +0x6A32, 0x6A68, 0x6A3E, 0x6A5D, +0x6A6D, 0x6A76, 0x6A5B, 0x6A51, +0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, +0x6A41, 0x6A6A, 0x6A64, 0x6A50, +0x6A4F, 0x6A54, 0x6A6F, 0x6A69, +0x6A60, 0x6A3C, 0x6A5E, 0x6A56, +0x6A55, 0x6A4D, 0x6A4E, 0x6A46, +0x6B55, 0x6B54, 0x6B56, 0x6BA7, +0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, +0x6C04, 0x6C03, 0x6C06, 0x6FAD, +0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, +0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, +0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, +0x7004, 0x6FA5, 0x6FAE, 0x6FBA, +0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, +0x6FB8, 0x6FA2, 0x6FC9, 0x6FAB, +0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, +0x71C5, 0x71C2, 0x71BF, 0x71B8, +0x71D6, 0x71C0, 0x71C1, 0x71CB, +0x71D4, 0x71CA, 0x71C7, 0x71CF, +0x71BD, 0x71D8, 0x71BC, 0x71C6, +0x71DA, 0x71DB, 0x729D, 0x729E, +0x7369, 0x7366, 0x7367, 0x736C, +0x7365, 0x736B, 0x736A, 0x747F, +0x749A, 0x74A0, 0x7494, 0x7492, +0x7495, 0x74A1, 0x750B, 0x7580, +0x762F, 0x762D, 0x7631, 0x763D, +0x7633, 0x763C, 0x7635, 0x7632, +0x7630, 0x76BB, 0x76E6, 0x779A, +0x779D, 0x77A1, 0x779C, 0x779B, +0x77A2, 0x77A3, 0x7795, 0x7799, +0x7797, 0x78DD, 0x78E9, 0x78E5, +0x78EA, 0x78DE, 0x78E3, 0x78DB, +0x78E1, 0x78E2, 0x78ED, 0x78DF, +0x78E0, 0x79A4, 0x7A44, 0x7A48, +0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, +0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3, +0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, +0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4, +0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, +0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4, +0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, +0x7E21, 0x7E17, 0x7E0C, 0x7E1F, +0x7E20, 0x7E13, 0x7E0E, 0x7E1C, +0x7E15, 0x7E1A, 0x7E22, 0x7E0B, +0x7E0F, 0x7E16, 0x7E0D, 0x7E14, +0x7E25, 0x7E24, 0x7F43, 0x7F7B, +0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, +0x802A, 0x8029, 0x806C, 0x81B1, +0x81A6, 0x81AE, 0x81B9, 0x81B5, +0x81AB, 0x81B0, 0x81AC, 0x81B4, +0x81B2, 0x81B7, 0x81A7, 0x81F2, +0x8255, 0x8256, 0x8257, 0x8556, +0x8545, 0x856B, 0x854D, 0x8553, +0x8561, 0x8558, 0x8540, 0x8546, +0x8564, 0x8541, 0x8562, 0x8544, +0x8551, 0x8547, 0x8563, 0x853E, +0x855B, 0x8571, 0x854E, 0x856E, +0x8575, 0x8555, 0x8567, 0x8560, +0x858C, 0x8566, 0x855D, 0x8554, +0x8565, 0x856C, 0x8663, 0x8665, +0x8664, 0x879B, 0x878F, 0x8797, +0x8793, 0x8792, 0x8788, 0x8781, +0x8796, 0x8798, 0x8779, 0x8787, +0x87A3, 0x8785, 0x8790, 0x8791, +0x879D, 0x8784, 0x8794, 0x879C, +0x879A, 0x8789, 0x891E, 0x8926, +0x8930, 0x892D, 0x892E, 0x8927, +0x8931, 0x8922, 0x8929, 0x8923, +0x892F, 0x892C, 0x891F, 0x89F1, +0x8AE0, 0x8AE2, 0x8AF2, 0x8AF4, +0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, +0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, +0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, +0x8AFB, 0x8C91, 0x8C92, 0x8C90, +0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, +0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, +0x8DA7, 0x8E33, 0x8E3E, 0x8E38, +0x8E40, 0x8E45, 0x8E36, 0x8E3C, +0x8E3D, 0x8E41, 0x8E30, 0x8E3F, +0x8EBD, 0x8F36, 0x8F2E, 0x8F35, +0x8F32, 0x8F39, 0x8F37, 0x8F34, +0x9076, 0x9079, 0x907B, 0x9086, +0x90FA, 0x9133, 0x9135, 0x9136, +0x9193, 0x9190, 0x9191, 0x918D, +0x918F, 0x9327, 0x931E, 0x9308, +0x931F, 0x9306, 0x930F, 0x937A, +0x9338, 0x933C, 0x931B, 0x9323, +0x9312, 0x9301, 0x9346, 0x932D, +0x930E, 0x930D, 0x92CB, 0x931D, +0x92FA, 0x9325, 0x9313, 0x92F9, +0x92F7, 0x9334, 0x9302, 0x9324, +0x92FF, 0x9329, 0x9339, 0x9335, +0x932A, 0x9314, 0x930C, 0x930B, +0x92FE, 0x9309, 0x9300, 0x92FB, +0x9316, 0x95BC, 0x95CD, 0x95BE, +0x95B9, 0x95BA, 0x95B6, 0x95BF, +0x95B5, 0x95BD, 0x96A9, 0x96D4, +0x970B, 0x9712, 0x9710, 0x9799, +0x9797, 0x9794, 0x97F0, 0x97F8, +0x9835, 0x982F, 0x9832, 0x9924, +0x991F, 0x9927, 0x9929, 0x999E, +0x99EE, 0x99EC, 0x99E5, 0x99E4, +0x99F0, 0x99E3, 0x99EA, 0x99E9, +0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, +0x9ABB, 0x9AF6, 0x9AFA, 0x9AF9, +0x9AF7, 0x9B33, 0x9B80, 0x9B85, +0x9B87, 0x9B7C, 0x9B7E, 0x9B7B, +0x9B82, 0x9B93, 0x9B92, 0x9B90, +0x9B7A, 0x9B95, 0x9B7D, 0x9B88, +0x9D25, 0x9D17, 0x9D20, 0x9D1E, +0x9D14, 0x9D29, 0x9D1D, 0x9D18, +0x9D22, 0x9D10, 0x9D19, 0x9D1F, +0x9E88, 0x9E86, 0x9E87, 0x9EAE, +0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, +0x9F12, 0x9F3D, 0x5126, 0x5125, +0x5122, 0x5124, 0x5120, 0x5129, +0x52F4, 0x5693, 0x568C, 0x568D, +0x5686, 0x5684, 0x5683, 0x567E, +0x5682, 0x567F, 0x5681, 0x58D6, +0x58D4, 0x58CF, 0x58D2, 0x5B2D, +0x5B25, 0x5B32, 0x5B23, 0x5B2C, +0x5B27, 0x5B26, 0x5B2F, 0x5B2E, +0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, +0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, +0x61C3, 0x61B5, 0x61BC, 0x61E7, +0x61E0, 0x61E5, 0x61E4, 0x61E8, +0x61DE, 0x64EF, 0x64E9, 0x64E3, +0x64EB, 0x64E4, 0x64E8, 0x6581, +0x6580, 0x65B6, 0x65DA, 0x66D2, +0x6A8D, 0x6A96, 0x6A81, 0x6AA5, +0x6A89, 0x6A9F, 0x6A9B, 0x6AA1, +0x6A9E, 0x6A87, 0x6A93, 0x6A8E, +0x6A95, 0x6A83, 0x6AA8, 0x6AA4, +0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, +0x6A85, 0x6A8C, 0x6A92, 0x6B5B, +0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, +0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, +0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, +0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, +0x71E1, 0x71F1, 0x71E8, 0x71F2, +0x71E4, 0x71F0, 0x71E2, 0x7373, +0x736E, 0x736F, 0x7497, 0x74B2, +0x74AB, 0x7490, 0x74AA, 0x74AD, +0x74B1, 0x74A5, 0x74AF, 0x7510, +0x7511, 0x7512, 0x750F, 0x7584, +0x7643, 0x7648, 0x7649, 0x7647, +0x76A4, 0x76E9, 0x77B5, 0x77AB, +0x77B2, 0x77B7, 0x77B6, 0x77B4, +0x77B1, 0x77A8, 0x77F0, 0x78F3, +0x78FD, 0x7902, 0x78FB, 0x78FC, +0x78F2, 0x7905, 0x78F9, 0x78FE, +0x7904, 0x79AB, 0x79A8, 0x7A5C, +0x7A5B, 0x7A56, 0x7A58, 0x7A54, +0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1, +0x7C05, 0x7C0F, 0x7BF2, 0x7C00, +0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4, +0x7C0B, 0x7BF3, 0x7C02, 0x7C09, +0x7C03, 0x7C01, 0x7BF8, 0x7BFD, +0x7C06, 0x7BF0, 0x7BF1, 0x7C10, +0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C, +0x7E42, 0x7E33, 0x9848, 0x7E38, +0x7E2A, 0x7E49, 0x7E40, 0x7E47, +0x7E29, 0x7E4C, 0x7E30, 0x7E3B, +0x7E36, 0x7E44, 0x7E3A, 0x7F45, +0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, +0x7FF2, 0x802C, 0x81BB, 0x81C4, +0x81CC, 0x81CA, 0x81C5, 0x81C7, +0x81BC, 0x81E9, 0x825B, 0x825A, +0x825C, 0x8583, 0x8580, 0x858F, +0x85A7, 0x8595, 0x85A0, 0x858B, +0x85A3, 0x857B, 0x85A4, 0x859A, +0x859E, 0x8577, 0x857C, 0x8589, +0x85A1, 0x857A, 0x8578, 0x8557, +0x858E, 0x8596, 0x8586, 0x858D, +0x8599, 0x859D, 0x8581, 0x85A2, +0x8582, 0x8588, 0x8585, 0x8579, +0x8576, 0x8598, 0x8590, 0x859F, +0x8668, 0x87BE, 0x87AA, 0x87AD, +0x87C5, 0x87B0, 0x87AC, 0x87B9, +0x87B5, 0x87BC, 0x87AE, 0x87C9, +0x87C3, 0x87C2, 0x87CC, 0x87B7, +0x87AF, 0x87C4, 0x87CA, 0x87B4, +0x87B6, 0x87BF, 0x87B8, 0x87BD, +0x87DE, 0x87B2, 0x8935, 0x8933, +0x893C, 0x893E, 0x8941, 0x8952, +0x8937, 0x8942, 0x89AD, 0x89AF, +0x89AE, 0x89F2, 0x89F3, 0x8B1E, +0x8B18, 0x8B16, 0x8B11, 0x8B05, +0x8B0B, 0x8B22, 0x8B0F, 0x8B12, +0x8B15, 0x8B07, 0x8B0D, 0x8B08, +0x8B06, 0x8B1C, 0x8B13, 0x8B1A, +0x8C4F, 0x8C70, 0x8C72, 0x8C71, +0x8C6F, 0x8C95, 0x8C94, 0x8CF9, +0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, +0x8E50, 0x8E4C, 0x8E47, 0x8F43, +0x8F40, 0x9085, 0x907E, 0x9138, +0x919A, 0x91A2, 0x919B, 0x9199, +0x919F, 0x91A1, 0x919D, 0x91A0, +0x93A1, 0x9383, 0x93AF, 0x9364, +0x9356, 0x9347, 0x937C, 0x9358, +0x935C, 0x9376, 0x9349, 0x9350, +0x9351, 0x9360, 0x936D, 0x938F, +0x934C, 0x936A, 0x9379, 0x9357, +0x9355, 0x9352, 0x934F, 0x9371, +0x9377, 0x937B, 0x9361, 0x935E, +0x9363, 0x9367, 0x9380, 0x934E, +0x9359, 0x95C7, 0x95C0, 0x95C9, +0x95C3, 0x95C5, 0x95B7, 0x96AE, +0x96B0, 0x96AC, 0x9720, 0x971F, +0x9718, 0x971D, 0x9719, 0x979A, +0x97A1, 0x979C, 0x979E, 0x979D, +0x97D5, 0x97D4, 0x97F1, 0x9841, +0x9844, 0x984A, 0x9849, 0x9845, +0x9843, 0x9925, 0x992B, 0x992C, +0x992A, 0x9933, 0x9932, 0x992F, +0x992D, 0x9931, 0x9930, 0x9998, +0x99A3, 0x99A1, 0x9A02, 0x99FA, +0x99F4, 0x99F7, 0x99F9, 0x99F8, +0x99F6, 0x99FB, 0x99FD, 0x99FE, +0x99FC, 0x9A03, 0x9ABE, 0x9AFE, +0x9AFD, 0x9B01, 0x9AFC, 0x9B48, +0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, +0x9BA6, 0x9BA1, 0x9BA5, 0x9BA4, +0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, +0x9D33, 0x9D41, 0x9D67, 0x9D36, +0x9D2E, 0x9D2F, 0x9D31, 0x9D38, +0x9D30, 0x9D45, 0x9D42, 0x9D43, +0x9D3E, 0x9D37, 0x9D40, 0x9D3D, +0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, +0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, +0x9EFB, 0x9EFF, 0x9F24, 0x9F23, +0x9F22, 0x9F54, 0x9FA0, 0x5131, +0x512D, 0x512E, 0x5698, 0x569C, +0x5697, 0x569A, 0x569D, 0x5699, +0x5970, 0x5B3C, 0x5C69, 0x5C6A, +0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, +0x61DF, 0x61ED, 0x61EE, 0x61F1, +0x61EA, 0x61F0, 0x61EB, 0x61D6, +0x61E9, 0x64FF, 0x6504, 0x64FD, +0x64F8, 0x6501, 0x6503, 0x64FC, +0x6594, 0x65DB, 0x66DA, 0x66DB, +0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, +0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, +0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, +0x6B5E, 0x6BC9, 0x6C0B, 0x7007, +0x700C, 0x700D, 0x7001, 0x7005, +0x7014, 0x700E, 0x6FFF, 0x7000, +0x6FFB, 0x7026, 0x6FFC, 0x6FF7, +0x700A, 0x7201, 0x71FF, 0x71F9, +0x7203, 0x71FD, 0x7376, 0x74B8, +0x74C0, 0x74B5, 0x74C1, 0x74BE, +0x74B6, 0x74BB, 0x74C2, 0x7514, +0x7513, 0x765C, 0x7664, 0x7659, +0x7650, 0x7653, 0x7657, 0x765A, +0x76A6, 0x76BD, 0x76EC, 0x77C2, +0x77BA, 0x78FF, 0x790C, 0x7913, +0x7914, 0x7909, 0x7910, 0x7912, +0x7911, 0x79AD, 0x79AC, 0x7A5F, +0x7C1C, 0x7C29, 0x7C19, 0x7C20, +0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, +0x7C28, 0x7C22, 0x7C25, 0x7C30, +0x7E5C, 0x7E50, 0x7E56, 0x7E63, +0x7E58, 0x7E62, 0x7E5F, 0x7E51, +0x7E60, 0x7E57, 0x7E53, 0x7FB5, +0x7FB3, 0x7FF7, 0x7FF8, 0x8075, +0x81D1, 0x81D2, 0x81D0, 0x825F, +0x825E, 0x85B4, 0x85C6, 0x85C0, +0x85C3, 0x85C2, 0x85B3, 0x85B5, +0x85BD, 0x85C7, 0x85C4, 0x85BF, +0x85CB, 0x85CE, 0x85C8, 0x85C5, +0x85B1, 0x85B6, 0x85D2, 0x8624, +0x85B8, 0x85B7, 0x85BE, 0x8669, +0x87E7, 0x87E6, 0x87E2, 0x87DB, +0x87EB, 0x87EA, 0x87E5, 0x87DF, +0x87F3, 0x87E4, 0x87D4, 0x87DC, +0x87D3, 0x87ED, 0x87D8, 0x87E3, +0x87A4, 0x87D7, 0x87D9, 0x8801, +0x87F4, 0x87E8, 0x87DD, 0x8953, +0x894B, 0x894F, 0x894C, 0x8946, +0x8950, 0x8951, 0x8949, 0x8B2A, +0x8B27, 0x8B23, 0x8B33, 0x8B30, +0x8B35, 0x8B47, 0x8B2F, 0x8B3C, +0x8B3E, 0x8B31, 0x8B25, 0x8B37, +0x8B26, 0x8B36, 0x8B2E, 0x8B24, +0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, +0x8C75, 0x8C99, 0x8C98, 0x8C97, +0x8CFE, 0x8D04, 0x8D02, 0x8D00, +0x8E5C, 0x8E62, 0x8E60, 0x8E57, +0x8E56, 0x8E5E, 0x8E65, 0x8E67, +0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, +0x8E69, 0x8E54, 0x8F46, 0x8F47, +0x8F48, 0x8F4B, 0x9128, 0x913A, +0x913B, 0x913E, 0x91A8, 0x91A5, +0x91A7, 0x91AF, 0x91AA, 0x93B5, +0x938C, 0x9392, 0x93B7, 0x939B, +0x939D, 0x9389, 0x93A7, 0x938E, +0x93AA, 0x939E, 0x93A6, 0x9395, +0x9388, 0x9399, 0x939F, 0x938D, +0x93B1, 0x9391, 0x93B2, 0x93A4, +0x93A8, 0x93B4, 0x93A3, 0x93A5, +0x95D2, 0x95D3, 0x95D1, 0x96B3, +0x96D7, 0x96DA, 0x5DC2, 0x96DF, +0x96D8, 0x96DD, 0x9723, 0x9722, +0x9725, 0x97AC, 0x97AE, 0x97A8, +0x97AB, 0x97A4, 0x97AA, 0x97A2, +0x97A5, 0x97D7, 0x97D9, 0x97D6, +0x97D8, 0x97FA, 0x9850, 0x9851, +0x9852, 0x98B8, 0x9941, 0x993C, +0x993A, 0x9A0F, 0x9A0B, 0x9A09, +0x9A0D, 0x9A04, 0x9A11, 0x9A0A, +0x9A05, 0x9A07, 0x9A06, 0x9AC0, +0x9ADC, 0x9B08, 0x9B04, 0x9B05, +0x9B29, 0x9B35, 0x9B4A, 0x9B4C, +0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, +0x9BBF, 0x9BC1, 0x9BB5, 0x9BB8, +0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, +0x9BBD, 0x9D5C, 0x9D53, 0x9D4F, +0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, +0x9D56, 0x9D4C, 0x9D57, 0x9D52, +0x9D54, 0x9D5F, 0x9D58, 0x9D5A, +0x9E8E, 0x9E8C, 0x9EDF, 0x9F01, +0x9F00, 0x9F16, 0x9F25, 0x9F2B, +0x9F2A, 0x9F29, 0x9F28, 0x9F4C, +0x9F55, 0x5134, 0x5135, 0x5296, +0x52F7, 0x53B4, 0x56AB, 0x56AD, +0x56A6, 0x56A7, 0x56AA, 0x56AC, +0x58DA, 0x58DD, 0x58DB, 0x5912, +0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, +0x5E70, 0x5FBF, 0x61FB, 0x6507, +0x6510, 0x650D, 0x6509, 0x650C, +0x650E, 0x6584, 0x65DE, 0x65DD, +0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, +0x6AD1, 0x6AD9, 0x6ACB, 0x6ADF, +0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, +0x6ACD, 0x6ADE, 0x6B60, 0x6BB0, +0x6C0C, 0x7019, 0x7027, 0x7020, +0x7016, 0x702B, 0x7021, 0x7022, +0x7023, 0x7029, 0x7017, 0x7024, +0x701C, 0x702A, 0x720C, 0x720A, +0x7207, 0x7202, 0x7205, 0x72A5, +0x72A6, 0x72A4, 0x72A3, 0x72A1, +0x74CB, 0x74C5, 0x74B7, 0x74C3, +0x7516, 0x7660, 0x77C9, 0x77CA, +0x77C4, 0x77F1, 0x791D, 0x791B, +0x7921, 0x791C, 0x7917, 0x791E, +0x79B0, 0x7A67, 0x7A68, 0x7C33, +0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, +0x7CEC, 0x7CEA, 0x7E76, 0x7E75, +0x7E78, 0x7E70, 0x7E77, 0x7E6F, +0x7E7A, 0x7E72, 0x7E74, 0x7E68, +0x7F4B, 0x7F4A, 0x7F83, 0x7F86, +0x7FB7, 0x7FFD, 0x7FFE, 0x8078, +0x81D7, 0x81D5, 0x8264, 0x8261, +0x8263, 0x85EB, 0x85F1, 0x85ED, +0x85D9, 0x85E1, 0x85E8, 0x85DA, +0x85D7, 0x85EC, 0x85F2, 0x85F8, +0x85D8, 0x85DF, 0x85E3, 0x85DC, +0x85D1, 0x85F0, 0x85E6, 0x85EF, +0x85DE, 0x85E2, 0x8800, 0x87FA, +0x8803, 0x87F6, 0x87F7, 0x8809, +0x880C, 0x880B, 0x8806, 0x87FC, +0x8808, 0x87FF, 0x880A, 0x8802, +0x8962, 0x895A, 0x895B, 0x8957, +0x8961, 0x895C, 0x8958, 0x895D, +0x8959, 0x8988, 0x89B7, 0x89B6, +0x89F6, 0x8B50, 0x8B48, 0x8B4A, +0x8B40, 0x8B53, 0x8B56, 0x8B54, +0x8B4B, 0x8B55, 0x8B51, 0x8B42, +0x8B52, 0x8B57, 0x8C43, 0x8C77, +0x8C76, 0x8C9A, 0x8D06, 0x8D07, +0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, +0x8DAB, 0x8E6D, 0x8E78, 0x8E73, +0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, +0x8F52, 0x8F51, 0x8F4F, 0x8F50, +0x8F53, 0x8FB4, 0x9140, 0x913F, +0x91B0, 0x91AD, 0x93DE, 0x93C7, +0x93CF, 0x93C2, 0x93DA, 0x93D0, +0x93F9, 0x93EC, 0x93CC, 0x93D9, +0x93A9, 0x93E6, 0x93CA, 0x93D4, +0x93EE, 0x93E3, 0x93D5, 0x93C4, +0x93CE, 0x93C0, 0x93D2, 0x93E7, +0x957D, 0x95DA, 0x95DB, 0x96E1, +0x9729, 0x972B, 0x972C, 0x9728, +0x9726, 0x97B3, 0x97B7, 0x97B6, +0x97DD, 0x97DE, 0x97DF, 0x985C, +0x9859, 0x985D, 0x9857, 0x98BF, +0x98BD, 0x98BB, 0x98BE, 0x9948, +0x9947, 0x9943, 0x99A6, 0x99A7, +0x9A1A, 0x9A15, 0x9A25, 0x9A1D, +0x9A24, 0x9A1B, 0x9A22, 0x9A20, +0x9A27, 0x9A23, 0x9A1E, 0x9A1C, +0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, +0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, +0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, +0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, +0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, +0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, +0x9D77, 0x9D81, 0x9D8A, 0x9D84, +0x9D88, 0x9D71, 0x9D80, 0x9D78, +0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, +0x9D6B, 0x9D74, 0x9D75, 0x9D70, +0x9D69, 0x9D85, 0x9D73, 0x9D7B, +0x9D82, 0x9D6F, 0x9D79, 0x9D7F, +0x9D87, 0x9D68, 0x9E94, 0x9E91, +0x9EC0, 0x9EFC, 0x9F2D, 0x9F40, +0x9F41, 0x9F4D, 0x9F56, 0x9F57, +0x9F58, 0x5337, 0x56B2, 0x56B5, +0x56B3, 0x58E3, 0x5B45, 0x5DC6, +0x5DC7, 0x5EEE, 0x5EEF, 0x5FC0, +0x5FC1, 0x61F9, 0x6517, 0x6516, +0x6515, 0x6513, 0x65DF, 0x66E8, +0x66E3, 0x66E4, 0x6AF3, 0x6AF0, +0x6AEA, 0x6AE8, 0x6AF9, 0x6AF1, +0x6AEE, 0x6AEF, 0x703C, 0x7035, +0x702F, 0x7037, 0x7034, 0x7031, +0x7042, 0x7038, 0x703F, 0x703A, +0x7039, 0x7040, 0x703B, 0x7033, +0x7041, 0x7213, 0x7214, 0x72A8, +0x737D, 0x737C, 0x74BA, 0x76AB, +0x76AA, 0x76BE, 0x76ED, 0x77CC, +0x77CE, 0x77CF, 0x77CD, 0x77F2, +0x7925, 0x7923, 0x7927, 0x7928, +0x7924, 0x7929, 0x79B2, 0x7A6E, +0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, +0x7C48, 0x7C4A, 0x7C47, 0x7C45, +0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, +0x7E80, 0x7FBA, 0x7FFF, 0x8079, +0x81DB, 0x81D9, 0x820B, 0x8268, +0x8269, 0x8622, 0x85FF, 0x8601, +0x85FE, 0x861B, 0x8600, 0x85F6, +0x8604, 0x8609, 0x8605, 0x860C, +0x85FD, 0x8819, 0x8810, 0x8811, +0x8817, 0x8813, 0x8816, 0x8963, +0x8966, 0x89B9, 0x89F7, 0x8B60, +0x8B6A, 0x8B5D, 0x8B68, 0x8B63, +0x8B65, 0x8B67, 0x8B6D, 0x8DAE, +0x8E86, 0x8E88, 0x8E84, 0x8F59, +0x8F56, 0x8F57, 0x8F55, 0x8F58, +0x8F5A, 0x908D, 0x9143, 0x9141, +0x91B7, 0x91B5, 0x91B2, 0x91B3, +0x940B, 0x9413, 0x93FB, 0x9420, +0x940F, 0x9414, 0x93FE, 0x9415, +0x9410, 0x9428, 0x9419, 0x940D, +0x93F5, 0x9400, 0x93F7, 0x9407, +0x940E, 0x9416, 0x9412, 0x93FA, +0x9409, 0x93F8, 0x940A, 0x93FF, +0x93FC, 0x940C, 0x93F6, 0x9411, +0x9406, 0x95DE, 0x95E0, 0x95DF, +0x972E, 0x972F, 0x97B9, 0x97BB, +0x97FD, 0x97FE, 0x9860, 0x9862, +0x9863, 0x985F, 0x98C1, 0x98C2, +0x9950, 0x994E, 0x9959, 0x994C, +0x994B, 0x9953, 0x9A32, 0x9A34, +0x9A31, 0x9A2C, 0x9A2A, 0x9A36, +0x9A29, 0x9A2E, 0x9A38, 0x9A2D, +0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, +0x9B12, 0x9B11, 0x9C0B, 0x9C08, +0x9BF7, 0x9C05, 0x9C12, 0x9BF8, +0x9C40, 0x9C07, 0x9C0E, 0x9C06, +0x9C17, 0x9C14, 0x9C09, 0x9D9F, +0x9D99, 0x9DA4, 0x9D9D, 0x9D92, +0x9D98, 0x9D90, 0x9D9B, 0x9DA0, +0x9D94, 0x9D9C, 0x9DAA, 0x9D97, +0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, +0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, +0x9D96, 0x9DA6, 0x9DA7, 0x9E99, +0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, +0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, +0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, +0x9F59, 0x9F91, 0x513A, 0x5139, +0x5298, 0x5297, 0x56C3, 0x56BD, +0x56BE, 0x5B48, 0x5B47, 0x5DCB, +0x5DCF, 0x5EF1, 0x61FD, 0x651B, +0x6B02, 0x6AFC, 0x6B03, 0x6AF8, +0x6B00, 0x7043, 0x7044, 0x704A, +0x7048, 0x7049, 0x7045, 0x7046, +0x721D, 0x721A, 0x7219, 0x737E, +0x7517, 0x766A, 0x77D0, 0x792D, +0x7931, 0x792F, 0x7C54, 0x7C53, +0x7CF2, 0x7E8A, 0x7E87, 0x7E88, +0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, +0x7FBB, 0x8030, 0x81DD, 0x8618, +0x862A, 0x8626, 0x861F, 0x8623, +0x861C, 0x8619, 0x8627, 0x862E, +0x8621, 0x8620, 0x8629, 0x861E, +0x8625, 0x8829, 0x881D, 0x881B, +0x8820, 0x8824, 0x881C, 0x882B, +0x884A, 0x896D, 0x8969, 0x896E, +0x896B, 0x89FA, 0x8B79, 0x8B78, +0x8B45, 0x8B7A, 0x8B7B, 0x8D10, +0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, +0x8F5E, 0x8F5B, 0x8F5D, 0x9146, +0x9144, 0x9145, 0x91B9, 0x943F, +0x943B, 0x9436, 0x9429, 0x943D, +0x943C, 0x9430, 0x9439, 0x942A, +0x9437, 0x942C, 0x9440, 0x9431, +0x95E5, 0x95E4, 0x95E3, 0x9735, +0x973A, 0x97BF, 0x97E1, 0x9864, +0x98C9, 0x98C6, 0x98C0, 0x9958, +0x9956, 0x9A39, 0x9A3D, 0x9A46, +0x9A44, 0x9A42, 0x9A41, 0x9A3A, +0x9A3F, 0x9ACD, 0x9B15, 0x9B17, +0x9B18, 0x9B16, 0x9B3A, 0x9B52, +0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, +0x9C23, 0x9C28, 0x9C29, 0x9C24, +0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, +0x9DC1, 0x9DC7, 0x9DCA, 0x9DCF, +0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, +0x9DB5, 0x9DCE, 0x9DB9, 0x9DBA, +0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, +0x9DCC, 0x9DB3, 0x9DCD, 0x9DB2, +0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, +0x9EED, 0x9F1B, 0x9F18, 0x9F1A, +0x9F31, 0x9F4E, 0x9F65, 0x9F64, +0x9F92, 0x4EB9, 0x56C6, 0x56C5, +0x56CB, 0x5971, 0x5B4B, 0x5B4C, +0x5DD5, 0x5DD1, 0x5EF2, 0x6521, +0x6520, 0x6526, 0x6522, 0x6B0B, +0x6B08, 0x6B09, 0x6C0D, 0x7055, +0x7056, 0x7057, 0x7052, 0x721E, +0x721F, 0x72A9, 0x737F, 0x74D8, +0x74D5, 0x74D9, 0x74D7, 0x766D, +0x76AD, 0x7935, 0x79B4, 0x7A70, +0x7A71, 0x7C57, 0x7C5C, 0x7C59, +0x7C5B, 0x7C5A, 0x7CF4, 0x7CF1, +0x7E91, 0x7F4F, 0x7F87, 0x81DE, +0x826B, 0x8634, 0x8635, 0x8633, +0x862C, 0x8632, 0x8636, 0x882C, +0x8828, 0x8826, 0x882A, 0x8825, +0x8971, 0x89BF, 0x89BE, 0x89FB, +0x8B7E, 0x8B84, 0x8B82, 0x8B86, +0x8B85, 0x8B7F, 0x8D15, 0x8E95, +0x8E94, 0x8E9A, 0x8E92, 0x8E90, +0x8E96, 0x8E97, 0x8F60, 0x8F62, +0x9147, 0x944C, 0x9450, 0x944A, +0x944B, 0x944F, 0x9447, 0x9445, +0x9448, 0x9449, 0x9446, 0x973F, +0x97E3, 0x986A, 0x9869, 0x98CB, +0x9954, 0x995B, 0x9A4E, 0x9A53, +0x9A54, 0x9A4C, 0x9A4F, 0x9A48, +0x9A4A, 0x9A49, 0x9A52, 0x9A50, +0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, +0x9B56, 0x9B55, 0x9C46, 0x9C48, +0x9C3F, 0x9C44, 0x9C39, 0x9C33, +0x9C41, 0x9C3C, 0x9C37, 0x9C34, +0x9C32, 0x9C3D, 0x9C36, 0x9DDB, +0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, +0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, +0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, +0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, +0x9EF0, 0x9F35, 0x9F33, 0x9F32, +0x9F42, 0x9F6B, 0x9F95, 0x9FA2, +0x513D, 0x5299, 0x58E8, 0x58E7, +0x5972, 0x5B4D, 0x5DD8, 0x882F, +0x5F4F, 0x6201, 0x6203, 0x6204, +0x6529, 0x6525, 0x6596, 0x66EB, +0x6B11, 0x6B12, 0x6B0F, 0x6BCA, +0x705B, 0x705A, 0x7222, 0x7382, +0x7381, 0x7383, 0x7670, 0x77D4, +0x7C67, 0x7C66, 0x7E95, 0x826C, +0x863A, 0x8640, 0x8639, 0x863C, +0x8631, 0x863B, 0x863E, 0x8830, +0x8832, 0x882E, 0x8833, 0x8976, +0x8974, 0x8973, 0x89FE, 0x8B8C, +0x8B8E, 0x8B8B, 0x8B88, 0x8C45, +0x8D19, 0x8E98, 0x8F64, 0x8F63, +0x91BC, 0x9462, 0x9455, 0x945D, +0x9457, 0x945E, 0x97C4, 0x97C5, +0x9800, 0x9A56, 0x9A59, 0x9B1E, +0x9B1F, 0x9B20, 0x9C52, 0x9C58, +0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, +0x9C55, 0x9C59, 0x9C4C, 0x9C4E, +0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, +0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, +0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, +0x9DF0, 0x9DE2, 0x9DEC, 0x9DF4, +0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, +0x9ED0, 0x9EF2, 0x9EF3, 0x9F06, +0x9F1C, 0x9F38, 0x9F37, 0x9F36, +0x9F43, 0x9F4F, 0x9F71, 0x9F70, +0x9F6E, 0x9F6F, 0x56D3, 0x56CD, +0x5B4E, 0x5C6D, 0x652D, 0x66ED, +0x66EE, 0x6B13, 0x705F, 0x7061, +0x705D, 0x7060, 0x7223, 0x74DB, +0x74E5, 0x77D5, 0x7938, 0x79B7, +0x79B6, 0x7C6A, 0x7E97, 0x7F89, +0x826D, 0x8643, 0x8838, 0x8837, +0x8835, 0x884B, 0x8B94, 0x8B95, +0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, +0x91BE, 0x91BD, 0x91C2, 0x946B, +0x9468, 0x9469, 0x96E5, 0x9746, +0x9743, 0x9747, 0x97C7, 0x97E5, +0x9A5E, 0x9AD5, 0x9B59, 0x9C63, +0x9C67, 0x9C66, 0x9C62, 0x9C5E, +0x9C60, 0x9E02, 0x9DFE, 0x9E07, +0x9E03, 0x9E06, 0x9E05, 0x9E00, +0x9E01, 0x9E09, 0x9DFF, 0x9DFD, +0x9E04, 0x9EA0, 0x9F1E, 0x9F46, +0x9F74, 0x9F75, 0x9F76, 0x56D4, +0x652E, 0x65B8, 0x6B18, 0x6B19, +0x6B17, 0x6B1A, 0x7062, 0x7226, +0x72AA, 0x77D8, 0x77D9, 0x7939, +0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, +0x7E98, 0x7E9B, 0x7E99, 0x81E0, +0x81E1, 0x8646, 0x8647, 0x8648, +0x8979, 0x897A, 0x897C, 0x897B, +0x89FF, 0x8B98, 0x8B99, 0x8EA5, +0x8EA4, 0x8EA3, 0x946E, 0x946D, +0x946F, 0x9471, 0x9473, 0x9749, +0x9872, 0x995F, 0x9C68, 0x9C6E, +0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, +0x9E0F, 0x9E12, 0x9E11, 0x9EA1, +0x9EF5, 0x9F09, 0x9F47, 0x9F78, +0x9F7B, 0x9F7A, 0x9F79, 0x571E, +0x7066, 0x7C6F, 0x883C, 0x8DB2, +0x8EA6, 0x91C3, 0x9474, 0x9478, +0x9476, 0x9475, 0x9A60, 0x9C74, +0x9C73, 0x9C71, 0x9C75, 0x9E14, +0x9E13, 0x9EF6, 0x9F0A, 0x9FA4, +0x7068, 0x7065, 0x7CF7, 0x866A, +0x883E, 0x883D, 0x883F, 0x8B9E, +0x8C9C, 0x8EA9, 0x8EC9, 0x974B, +0x9873, 0x9874, 0x98CC, 0x9961, +0x99AB, 0x9A64, 0x9A66, 0x9A67, +0x9B24, 0x9E15, 0x9E17, 0x9F48, +0x6207, 0x6B1E, 0x7227, 0x864C, +0x8EA8, 0x9482, 0x9480, 0x9481, +0x9A69, 0x9A68, 0x9B2E, 0x9E19, +0x7229, 0x864B, 0x8B9F, 0x9483, +0x9C79, 0x9EB7, 0x7675, 0x9A6B, +0x9C7A, 0x9E1D, 0x7069, 0x706A, +0x9EA4, 0x9F7E, 0x9F49, 0x9F98, +0x7881, 0x92B9, 0x88CF, 0x58BB, +0x6052, 0x7CA7, 0x5AFA, 0x2554, +0x2566, 0x2557, 0x2560, 0x256C, +0x2563, 0x255A, 0x2569, 0x255D, +0x2552, 0x2564, 0x2555, 0x255E, +0x256A, 0x2561, 0x2558, 0x2567, +0x255B, 0x2553, 0x2565, 0x2556, +0x255F, 0x256B, 0x2562, 0x2559, +0x2568, 0x255C, 0x2551, 0x2550, +0x256D, 0x256E, 0x2570, 0x256F, +0xFFED, 0x20547, 0x92DB, 0x205DF, +0x23FC5, 0x854C, 0x42B5, 0x73EF, +0x51B5, 0x3649, 0x24942, 0x289E4, +0x9344, 0x219DB, 0x82EE, 0x23CC8, +0x783C, 0x6744, 0x62DF, 0x24933, +0x289AA, 0x202A0, 0x26BB3, 0x21305, +0x4FAB, 0x224ED, 0x5008, 0x26D29, +0x27A84, 0x23600, 0x24AB1, 0x22513, +0x5029, 0x2037E, 0x5FA4, 0x20380, +0x20347, 0x6EDB, 0x2041F, 0x507D, +0x5101, 0x347A, 0x510E, 0x986C, +0x3743, 0x8416, 0x249A4, 0x20487, +0x5160, 0x233B4, 0x516A, 0x20BFF, +0x220FC, 0x202E5, 0x22530, 0x2058E, +0x23233, 0x21983, 0x5B82, 0x877D, +0x205B3, 0x23C99, 0x51B2, 0x51B8, +0x9D34, 0x51C9, 0x51CF, 0x51D1, +0x3CDC, 0x51D3, 0x24AA6, 0x51B3, +0x51E2, 0x5342, 0x51ED, 0x83CD, +0x693E, 0x2372D, 0x5F7B, 0x520B, +0x5226, 0x523C, 0x52B5, 0x5257, +0x5294, 0x52B9, 0x52C5, 0x7C15, +0x8542, 0x52E0, 0x860D, 0x26B13, +0x5305, 0x28ADE, 0x5549, 0x6ED9, +0x23F80, 0x20954, 0x23FEC, 0x5333, +0x5344, 0x20BE2, 0x6CCB, 0x21726, +0x681B, 0x73D5, 0x604A, 0x3EAA, +0x38CC, 0x216E8, 0x71DD, 0x44A2, +0x536D, 0x5374, 0x286AB, 0x537E, +0x537F, 0x21596, 0x21613, 0x77E6, +0x5393, 0x28A9B, 0x53A0, 0x53AB, +0x53AE, 0x73A7, 0x25772, 0x3F59, +0x739C, 0x53C1, 0x53C5, 0x6C49, +0x4E49, 0x57FE, 0x53D9, 0x3AAB, +0x20B8F, 0x53E0, 0x23FEB, 0x22DA3, +0x53F6, 0x20C77, 0x5413, 0x7079, +0x552B, 0x6657, 0x6D5B, 0x546D, +0x26B53, 0x20D74, 0x555D, 0x548F, +0x54A4, 0x47A6, 0x2170D, 0x20EDD, +0x3DB4, 0x20D4D, 0x289BC, 0x22698, +0x5547, 0x4CED, 0x542F, 0x7417, +0x5586, 0x55A9, 0x5605, 0x218D7, +0x2403A, 0x4552, 0x24435, 0x66B3, +0x210B4, 0x5637, 0x66CD, 0x2328A, +0x66A4, 0x66AD, 0x564D, 0x564F, +0x78F1, 0x56F1, 0x9787, 0x53FE, +0x5700, 0x56EF, 0x56ED, 0x28B66, +0x3623, 0x2124F, 0x5746, 0x241A5, +0x6C6E, 0x708B, 0x5742, 0x36B1, +0x26C7E, 0x57E6, 0x21416, 0x5803, +0x21454, 0x24363, 0x5826, 0x24BF5, +0x585C, 0x58AA, 0x3561, 0x58E0, +0x58DC, 0x2123C, 0x58FB, 0x5BFF, +0x5743, 0x2A150, 0x24278, 0x93D3, +0x35A1, 0x591F, 0x68A6, 0x36C3, +0x6E59, 0x2163E, 0x5A24, 0x5553, +0x21692, 0x8505, 0x59C9, 0x20D4E, +0x26C81, 0x26D2A, 0x217DC, 0x59D9, +0x217FB, 0x217B2, 0x26DA6, 0x6D71, +0x21828, 0x216D5, 0x59F9, 0x26E45, +0x5AAB, 0x5A63, 0x36E6, 0x249A9, +0x5A77, 0x3708, 0x5A96, 0x7465, +0x5AD3, 0x26FA1, 0x22554, 0x3D85, +0x21911, 0x3732, 0x216B8, 0x5E83, +0x52D0, 0x5B76, 0x6588, 0x5B7C, +0x27A0E, 0x4004, 0x485D, 0x20204, +0x5BD5, 0x6160, 0x21A34, 0x259CC, +0x205A5, 0x5BF3, 0x5B9D, 0x4D10, +0x5C05, 0x21B44, 0x5C13, 0x73CE, +0x5C14, 0x21CA5, 0x26B28, 0x5C49, +0x48DD, 0x5C85, 0x5CE9, 0x5CEF, +0x5D8B, 0x21DF9, 0x21E37, 0x5D10, +0x5D18, 0x5D46, 0x21EA4, 0x5CBA, +0x5DD7, 0x82FC, 0x382D, 0x24901, +0x22049, 0x22173, 0x8287, 0x3836, +0x3BC2, 0x5E2E, 0x6A8A, 0x5E75, +0x5E7A, 0x244BC, 0x20CD3, 0x53A6, +0x4EB7, 0x5ED0, 0x53A8, 0x21771, +0x5E09, 0x5EF4, 0x28482, 0x5EF9, +0x5EFB, 0x38A0, 0x5EFC, 0x683E, +0x941B, 0x5F0D, 0x201C1, 0x2F894, +0x3ADE, 0x48AE, 0x2133A, 0x5F3A, +0x26888, 0x223D0, 0x5F58, 0x22471, +0x5F63, 0x97BD, 0x26E6E, 0x5F72, +0x9340, 0x28A36, 0x5FA7, 0x5DB6, +0x3D5F, 0x25250, 0x21F6A, 0x270F8, +0x22668, 0x91D6, 0x2029E, 0x28A29, +0x6031, 0x6685, 0x21877, 0x3963, +0x3DC7, 0x3639, 0x5790, 0x227B4, +0x7971, 0x3E40, 0x609E, 0x60A4, +0x60B3, 0x24982, 0x2498F, 0x27A53, +0x74A4, 0x50E1, 0x5AA0, 0x6164, +0x8424, 0x6142, 0x2F8A6, 0x26ED2, +0x6181, 0x51F4, 0x20656, 0x6187, +0x5BAA, 0x23FB7, 0x2285F, 0x61D3, +0x28B9D, 0x2995D, 0x61D0, 0x3932, +0x22980, 0x228C1, 0x6023, 0x615C, +0x651E, 0x638B, 0x20118, 0x62C5, +0x21770, 0x62D5, 0x22E0D, 0x636C, +0x249DF, 0x3A17, 0x6438, 0x63F8, +0x2138E, 0x217FC, 0x6490, 0x6F8A, +0x22E36, 0x9814, 0x2408C, 0x2571D, +0x64E1, 0x64E5, 0x947B, 0x3A66, +0x643A, 0x3A57, 0x654D, 0x6F16, +0x24A28, 0x24A23, 0x6585, 0x656D, +0x655F, 0x2307E, 0x65B5, 0x24940, +0x4B37, 0x65D1, 0x40D8, 0x21829, +0x65E0, 0x65E3, 0x5FDF, 0x23400, +0x6618, 0x231F7, 0x231F8, 0x6644, +0x231A4, 0x231A5, 0x664B, 0x20E75, +0x6667, 0x251E6, 0x6673, 0x6674, +0x21E3D, 0x23231, 0x285F4, 0x231C8, +0x25313, 0x77C5, 0x228F7, 0x99A4, +0x6702, 0x2439C, 0x24A21, 0x3B2B, +0x69FA, 0x237C2, 0x675E, 0x6767, +0x6762, 0x241CD, 0x290ED, 0x67D7, +0x44E9, 0x6822, 0x6E50, 0x923C, +0x6801, 0x233E6, 0x26DA0, 0x685D, +0x2346F, 0x69E1, 0x6A0B, 0x28ADF, +0x6973, 0x68C3, 0x235CD, 0x6901, +0x6900, 0x3D32, 0x3A01, 0x2363C, +0x3B80, 0x67AC, 0x6961, 0x28A4A, +0x42FC, 0x6936, 0x6998, 0x3BA1, +0x203C9, 0x8363, 0x5090, 0x69F9, +0x23659, 0x2212A, 0x6A45, 0x23703, +0x6A9D, 0x3BF3, 0x67B1, 0x6AC8, +0x2919C, 0x3C0D, 0x6B1D, 0x20923, +0x60DE, 0x6B35, 0x6B74, 0x227CD, +0x6EB5, 0x23ADB, 0x203B5, 0x21958, +0x3740, 0x5421, 0x23B5A, 0x6BE1, +0x23EFC, 0x6BDC, 0x6C37, 0x2248B, +0x248F1, 0x26B51, 0x6C5A, 0x8226, +0x6C79, 0x23DBC, 0x44C5, 0x23DBD, +0x241A4, 0x2490C, 0x24900, 0x23CC9, +0x36E5, 0x3CEB, 0x20D32, 0x9B83, +0x231F9, 0x22491, 0x7F8F, 0x6837, +0x26D25, 0x26DA1, 0x26DEB, 0x6D96, +0x6D5C, 0x6E7C, 0x6F04, 0x2497F, +0x24085, 0x26E72, 0x8533, 0x26F74, +0x51C7, 0x6C9C, 0x6E1D, 0x842E, +0x28B21, 0x6E2F, 0x23E2F, 0x7453, +0x23F82, 0x79CC, 0x6E4F, 0x5A91, +0x2304B, 0x6FF8, 0x370D, 0x6F9D, +0x23E30, 0x6EFA, 0x21497, 0x2403D, +0x4555, 0x93F0, 0x6F44, 0x6F5C, +0x3D4E, 0x6F74, 0x29170, 0x3D3B, +0x6F9F, 0x24144, 0x6FD3, 0x24091, +0x24155, 0x24039, 0x23FF0, 0x23FB4, +0x2413F, 0x51DF, 0x24156, 0x24157, +0x24140, 0x261DD, 0x704B, 0x707E, +0x70A7, 0x7081, 0x70CC, 0x70D5, +0x70D6, 0x70DF, 0x4104, 0x3DE8, +0x71B4, 0x7196, 0x24277, 0x712B, +0x7145, 0x5A88, 0x714A, 0x716E, +0x5C9C, 0x24365, 0x714F, 0x9362, +0x242C1, 0x712C, 0x2445A, 0x24A27, +0x24A22, 0x71BA, 0x28BE8, 0x70BD, +0x720E, 0x9442, 0x7215, 0x5911, +0x9443, 0x7224, 0x9341, 0x25605, +0x722E, 0x7240, 0x24974, 0x68BD, +0x7255, 0x7257, 0x3E55, 0x23044, +0x680D, 0x6F3D, 0x7282, 0x732A, +0x732B, 0x24823, 0x2882B, 0x48ED, +0x28804, 0x7328, 0x732E, 0x73CF, +0x73AA, 0x20C3A, 0x26A2E, 0x73C9, +0x7449, 0x241E2, 0x216E7, 0x24A24, +0x6623, 0x36C5, 0x249B7, 0x2498D, +0x249FB, 0x73F7, 0x7415, 0x6903, +0x24A26, 0x7439, 0x205C3, 0x3ED7, +0x745C, 0x228AD, 0x7460, 0x28EB2, +0x7447, 0x73E4, 0x7476, 0x83B9, +0x746C, 0x3730, 0x7474, 0x93F1, +0x6A2C, 0x7482, 0x4953, 0x24A8C, +0x2415F, 0x24A79, 0x28B8F, 0x5B46, +0x28C03, 0x2189E, 0x74C8, 0x21988, +0x750E, 0x74E9, 0x751E, 0x28ED9, +0x21A4B, 0x5BD7, 0x28EAC, 0x9385, +0x754D, 0x754A, 0x7567, 0x756E, +0x24F82, 0x3F04, 0x24D13, 0x758E, +0x745D, 0x759E, 0x75B4, 0x7602, +0x762C, 0x7651, 0x764F, 0x766F, +0x7676, 0x263F5, 0x7690, 0x81EF, +0x37F8, 0x26911, 0x2690E, 0x76A1, +0x76A5, 0x76B7, 0x76CC, 0x26F9F, +0x8462, 0x2509D, 0x2517D, 0x21E1C, +0x771E, 0x7726, 0x7740, 0x64AF, +0x25220, 0x7758, 0x232AC, 0x77AF, +0x28964, 0x28968, 0x216C1, 0x77F4, +0x7809, 0x21376, 0x24A12, 0x68CA, +0x78AF, 0x78C7, 0x78D3, 0x96A5, +0x792E, 0x255E0, 0x78D7, 0x7934, +0x78B1, 0x2760C, 0x8FB8, 0x8884, +0x28B2B, 0x26083, 0x2261C, 0x7986, +0x8900, 0x6902, 0x7980, 0x25857, +0x799D, 0x27B39, 0x793C, 0x79A9, +0x6E2A, 0x27126, 0x3EA8, 0x79C6, +0x2910D, 0x79D4 +} ; diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_CodePages.pxx opencascade-7.5.1+dfsg1/src/Resource/Resource_CodePages.pxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_CodePages.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_CodePages.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,666 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +// Code pages ANSI -> UTF16 +static const Standard_ExtCharacter THE_CODEPAGES_ANSI[Resource_FormatType_iso8859_9 - Resource_FormatType_CP1250 + 1][128] = +{ + { + // code page: cp1250 + 0x20ac, 0x81, 0x201a, 0x83, + 0x201e, 0x2026, 0x2020, 0x2021, + 0x88, 0x2030, 0x160, 0x2039, + 0x15a, 0x164, 0x17d, 0x179, + 0x90, 0x2018, 0x2019, 0x201c, + 0x201d, 0x2022, 0x2013, 0x2014, + 0x98, 0x2122, 0x161, 0x203a, + 0x15b, 0x165, 0x17e, 0x17a, + 0xa0, 0x2c7, 0x2d8, 0x141, + 0xa4, 0x104, 0xa6, 0xa7, + 0xa8, 0xa9, 0x15e, 0xab, + 0xac, 0xad, 0xae, 0x17b, + 0xb0, 0xb1, 0x2db, 0x142, + 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0x105, 0x15f, 0xbb, + 0x13d, 0x2dd, 0x13e, 0x17c, + 0x154, 0xc1, 0xc2, 0x102, + 0xc4, 0x139, 0x106, 0xc7, + 0x10c, 0xc9, 0x118, 0xcb, + 0x11a, 0xcd, 0xce, 0x10e, + 0x110, 0x143, 0x147, 0xd3, + 0xd4, 0x150, 0xd6, 0xd7, + 0x158, 0x16e, 0xda, 0x170, + 0xdc, 0xdd, 0x162, 0xdf, + 0x155, 0xe1, 0xe2, 0x103, + 0xe4, 0x13a, 0x107, 0xe7, + 0x10d, 0xe9, 0x119, 0xeb, + 0x11b, 0xed, 0xee, 0x10f, + 0x111, 0x144, 0x148, 0xf3, + 0xf4, 0x151, 0xf6, 0xf7, + 0x159, 0x16f, 0xfa, 0x171, + 0xfc, 0xfd, 0x163, 0x2d9 + }, + + { + // code page: cp1251 + 0x402, 0x403, 0x201a, 0x453, + 0x201e, 0x2026, 0x2020, 0x2021, + 0x20ac, 0x2030, 0x409, 0x2039, + 0x40a, 0x40c, 0x40b, 0x40f, + 0x452, 0x2018, 0x2019, 0x201c, + 0x201d, 0x2022, 0x2013, 0x2014, + 0x98, 0x2122, 0x459, 0x203a, + 0x45a, 0x45c, 0x45b, 0x45f, + 0xa0, 0x40e, 0x45e, 0x408, + 0xa4, 0x490, 0xa6, 0xa7, + 0x401, 0xa9, 0x404, 0xab, + 0xac, 0xad, 0xae, 0x407, + 0xb0, 0xb1, 0x406, 0x456, + 0x491, 0xb5, 0xb6, 0xb7, + 0x451, 0x2116, 0x454, 0xbb, + 0x458, 0x405, 0x455, 0x457, + 0x410, 0x411, 0x412, 0x413, + 0x414, 0x415, 0x416, 0x417, + 0x418, 0x419, 0x41a, 0x41b, + 0x41c, 0x41d, 0x41e, 0x41f, + 0x420, 0x421, 0x422, 0x423, + 0x424, 0x425, 0x426, 0x427, + 0x428, 0x429, 0x42a, 0x42b, + 0x42c, 0x42d, 0x42e, 0x42f, + 0x430, 0x431, 0x432, 0x433, + 0x434, 0x435, 0x436, 0x437, + 0x438, 0x439, 0x43a, 0x43b, + 0x43c, 0x43d, 0x43e, 0x43f, + 0x440, 0x441, 0x442, 0x443, + 0x444, 0x445, 0x446, 0x447, + 0x448, 0x449, 0x44a, 0x44b, + 0x44c, 0x44d, 0x44e, 0x44f + }, + + { + // code page: cp1252 + 0x20ac, 0x81, 0x201a, 0x192, + 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x160, 0x2039, + 0x152, 0x8d, 0x17d, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, + 0x201d, 0x2022, 0x2013, 0x2014, + 0x2dc, 0x2122, 0x161, 0x203a, + 0x153, 0x9d, 0x17e, 0x178, + 0xa0, 0xa1, 0xa2, 0xa3, + 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, + 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, + 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, + 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, + 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, + 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, + 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff + }, + + { + // code page: cp1253 + 0x20ac, 0x81, 0x201a, 0x192, + 0x201e, 0x2026, 0x2020, 0x2021, + 0x88, 0x2030, 0x8a, 0x2039, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, + 0x201d, 0x2022, 0x2013, 0x2014, + 0x98, 0x2122, 0x9a, 0x203a, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0x385, 0x386, 0xa3, + 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0x0, 0xab, + 0xac, 0xad, 0xae, 0x2015, + 0xb0, 0xb1, 0xb2, 0xb3, + 0x384, 0xb5, 0xb6, 0xb7, + 0x388, 0x389, 0x38a, 0xbb, + 0x38c, 0xbd, 0x38e, 0x38f, + 0x390, 0x391, 0x392, 0x393, + 0x394, 0x395, 0x396, 0x397, + 0x398, 0x399, 0x39a, 0x39b, + 0x39c, 0x39d, 0x39e, 0x39f, + 0x3a0, 0x3a1, 0x0, 0x3a3, + 0x3a4, 0x3a5, 0x3a6, 0x3a7, + 0x3a8, 0x3a9, 0x3aa, 0x3ab, + 0x3ac, 0x3ad, 0x3ae, 0x3af, + 0x3b0, 0x3b1, 0x3b2, 0x3b3, + 0x3b4, 0x3b5, 0x3b6, 0x3b7, + 0x3b8, 0x3b9, 0x3ba, 0x3bb, + 0x3bc, 0x3bd, 0x3be, 0x3bf, + 0x3c0, 0x3c1, 0x3c2, 0x3c3, + 0x3c4, 0x3c5, 0x3c6, 0x3c7, + 0x3c8, 0x3c9, 0x3ca, 0x3cb, + 0x3cc, 0x3cd, 0x3ce, 0x0 + }, + + { + // code page: cp1254 + 0x20ac, 0x81, 0x201a, 0x192, + 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x160, 0x2039, + 0x152, 0x8d, 0x8e, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, + 0x201d, 0x2022, 0x2013, 0x2014, + 0x2dc, 0x2122, 0x161, 0x203a, + 0x153, 0x9d, 0x9e, 0x178, + 0xa0, 0xa1, 0xa2, 0xa3, + 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, + 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, + 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, + 0xcc, 0xcd, 0xce, 0xcf, + 0x11e, 0xd1, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, + 0xdc, 0x130, 0x15e, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, + 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, + 0xec, 0xed, 0xee, 0xef, + 0x11f, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0x131, 0x15f, 0xff + }, + + { + // code page: cp1255 + 0x20ac, 0x81, 0x201a, 0x192, + 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x8a, 0x2039, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, + 0x201d, 0x2022, 0x2013, 0x2014, + 0x2dc, 0x2122, 0x9a, 0x203a, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, + 0x20aa, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xd7, 0xab, + 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xf7, 0xbb, + 0xbc, 0xbd, 0xbe, 0xbf, + 0x5b0, 0x5b1, 0x5b2, 0x5b3, + 0x5b4, 0x5b5, 0x5b6, 0x5b7, + 0x5b8, 0x5b9, 0x5ba, 0x5bb, + 0x5bc, 0x5bd, 0x5be, 0x5bf, + 0x5c0, 0x5c1, 0x5c2, 0x5c3, + 0x5f0, 0x5f1, 0x5f2, 0x5f3, + 0x5f4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x5d0, 0x5d1, 0x5d2, 0x5d3, + 0x5d4, 0x5d5, 0x5d6, 0x5d7, + 0x5d8, 0x5d9, 0x5da, 0x5db, + 0x5dc, 0x5dd, 0x5de, 0x5df, + 0x5e0, 0x5e1, 0x5e2, 0x5e3, + 0x5e4, 0x5e5, 0x5e6, 0x5e7, + 0x5e8, 0x5e9, 0x5ea, 0x0, + 0x0, 0x200e, 0x200f, 0x0 + }, + + { + // code page: cp1256 + 0x20ac, 0x67e, 0x201a, 0x192, + 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x679, 0x2039, + 0x152, 0x686, 0x698, 0x688, + 0x6af, 0x2018, 0x2019, 0x201c, + 0x201d, 0x2022, 0x2013, 0x2014, + 0x6a9, 0x2122, 0x691, 0x203a, + 0x153, 0x200c, 0x200d, 0x6ba, + 0xa0, 0x60c, 0xa2, 0xa3, + 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0x6be, 0xab, + 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0x61b, 0xbb, + 0xbc, 0xbd, 0xbe, 0x61f, + 0x6c1, 0x621, 0x622, 0x623, + 0x624, 0x625, 0x626, 0x627, + 0x628, 0x629, 0x62a, 0x62b, + 0x62c, 0x62d, 0x62e, 0x62f, + 0x630, 0x631, 0x632, 0x633, + 0x634, 0x635, 0x636, 0xd7, + 0x637, 0x638, 0x639, 0x63a, + 0x640, 0x641, 0x642, 0x643, + 0xe0, 0x644, 0xe2, 0x645, + 0x646, 0x647, 0x648, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, + 0x649, 0x64a, 0xee, 0xef, + 0x64b, 0x64c, 0x64d, 0x64e, + 0xf4, 0x64f, 0x650, 0xf7, + 0x651, 0xf9, 0x652, 0xfb, + 0xfc, 0x200e, 0x200f, 0x6d2 + }, + + { + // code page: cp1257 + 0x20ac, 0x81, 0x201a, 0x83, + 0x201e, 0x2026, 0x2020, 0x2021, + 0x88, 0x2030, 0x8a, 0x2039, + 0x8c, 0xa8, 0x2c7, 0xb8, + 0x90, 0x2018, 0x2019, 0x201c, + 0x201d, 0x2022, 0x2013, 0x2014, + 0x98, 0x2122, 0x9a, 0x203a, + 0x9c, 0xaf, 0x2db, 0x9f, + 0xa0, 0x0, 0xa2, 0xa3, + 0xa4, 0x0, 0xa6, 0xa7, + 0xd8, 0xa9, 0x156, 0xab, + 0xac, 0xad, 0xae, 0xc6, + 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, + 0xf8, 0xb9, 0x157, 0xbb, + 0xbc, 0xbd, 0xbe, 0xe6, + 0x104, 0x12e, 0x100, 0x106, + 0xc4, 0xc5, 0x118, 0x112, + 0x10c, 0xc9, 0x179, 0x116, + 0x122, 0x136, 0x12a, 0x13b, + 0x160, 0x143, 0x145, 0xd3, + 0x14c, 0xd5, 0xd6, 0xd7, + 0x172, 0x141, 0x15a, 0x16a, + 0xdc, 0x17b, 0x17d, 0xdf, + 0x105, 0x12f, 0x101, 0x107, + 0xe4, 0xe5, 0x119, 0x113, + 0x10d, 0xe9, 0x17a, 0x117, + 0x123, 0x137, 0x12b, 0x13c, + 0x161, 0x144, 0x146, 0xf3, + 0x14d, 0xf5, 0xf6, 0xf7, + 0x173, 0x142, 0x15b, 0x16b, + 0xfc, 0x17c, 0x17e, 0x2d9 + }, + + { + // code page: cp1258 + 0x20ac, 0x81, 0x201a, 0x192, + 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x8a, 0x2039, + 0x152, 0x8d, 0x8e, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, + 0x201d, 0x2022, 0x2013, 0x2014, + 0x2dc, 0x2122, 0x9a, 0x203a, + 0x153, 0x9d, 0x9e, 0x178, + 0xa0, 0xa1, 0xa2, 0xa3, + 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, + 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, + 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0x102, + 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, + 0x300, 0xcd, 0xce, 0xcf, + 0x110, 0xd1, 0x309, 0xd3, + 0xd4, 0x1a0, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, + 0xdc, 0x1af, 0x303, 0xdf, + 0xe0, 0xe1, 0xe2, 0x103, + 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, + 0x301, 0xed, 0xee, 0xef, + 0x111, 0xf1, 0x323, 0xf3, + 0xf4, 0x1a1, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0x1b0, 0x20ab, 0xff + }, + + { + // code page: ISO 8859-1 + 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, + 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, + 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, + 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, + 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, + 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, + 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, + 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff + }, + + { + // code page: ISO 8859-2 + 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0x104, 0x2d8, 0x141, + 0xa4, 0x13d, 0x15a, 0xa7, + 0xa8, 0x160, 0x15e, 0x164, + 0x179, 0xad, 0x17d, 0x17b, + 0xb0, 0x105, 0x2db, 0x142, + 0xb4, 0x13e, 0x15b, 0x2c7, + 0xb8, 0x161, 0x15f, 0x165, + 0x17a, 0x2dd, 0x17e, 0x17c, + 0x154, 0xc1, 0xc2, 0x102, + 0xc4, 0x139, 0x106, 0xc7, + 0x10c, 0xc9, 0x118, 0xcb, + 0x11a, 0xcd, 0xce, 0x10e, + 0x110, 0x143, 0x147, 0xd3, + 0xd4, 0x150, 0xd6, 0xd7, + 0x158, 0x16e, 0xda, 0x170, + 0xdc, 0xdd, 0x162, 0xdf, + 0x155, 0xe1, 0xe2, 0x103, + 0xe4, 0x13a, 0x107, 0xe7, + 0x10d, 0xe9, 0x119, 0xeb, + 0x11b, 0xed, 0xee, 0x10f, + 0x111, 0x144, 0x148, 0xf3, + 0xf4, 0x151, 0xf6, 0xf7, + 0x159, 0x16f, 0xfa, 0x171, + 0xfc, 0xfd, 0x163, 0x2d9 + }, + + { + // code page: ISO 8859-3 + 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0x126, 0x2d8, 0xa3, + 0xa4, 0x0, 0x124, 0xa7, + 0xa8, 0x130, 0x15e, 0x11e, + 0x134, 0xad, 0x0, 0x17b, + 0xb0, 0x127, 0xb2, 0xb3, + 0xb4, 0xb5, 0x125, 0xb7, + 0xb8, 0x131, 0x15f, 0x11f, + 0x135, 0xbd, 0x0, 0x17c, + 0xc0, 0xc1, 0xc2, 0x0, + 0xc4, 0x10a, 0x108, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, + 0xcc, 0xcd, 0xce, 0xcf, + 0x0, 0xd1, 0xd2, 0xd3, + 0xd4, 0x120, 0xd6, 0xd7, + 0x11c, 0xd9, 0xda, 0xdb, + 0xdc, 0x16c, 0x15c, 0xdf, + 0xe0, 0xe1, 0xe2, 0x0, + 0xe4, 0x10b, 0x109, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, + 0xec, 0xed, 0xee, 0xef, + 0x0, 0xf1, 0xf2, 0xf3, + 0xf4, 0x121, 0xf6, 0xf7, + 0x11d, 0xf9, 0xfa, 0xfb, + 0xfc, 0x16d, 0x15d, 0x2d9 + }, + + { + // code page: ISO 8859-4 + 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0x104, 0x138, 0x156, + 0xa4, 0x128, 0x13b, 0xa7, + 0xa8, 0x160, 0x112, 0x122, + 0x166, 0xad, 0x17d, 0xaf, + 0xb0, 0x105, 0x2db, 0x157, + 0xb4, 0x129, 0x13c, 0x2c7, + 0xb8, 0x161, 0x113, 0x123, + 0x167, 0x14a, 0x17e, 0x14b, + 0x100, 0xc1, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0x12e, + 0x10c, 0xc9, 0x118, 0xcb, + 0x116, 0xcd, 0xce, 0x12a, + 0x110, 0x145, 0x14c, 0x136, + 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0x172, 0xda, 0xdb, + 0xdc, 0x168, 0x16a, 0xdf, + 0x101, 0xe1, 0xe2, 0xe3, + 0xe4, 0xe5, 0xe6, 0x12f, + 0x10d, 0xe9, 0x119, 0xeb, + 0x117, 0xed, 0xee, 0x12b, + 0x111, 0x146, 0x14d, 0x137, + 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0x173, 0xfa, 0xfb, + 0xfc, 0x169, 0x16b, 0x2d9 + }, + + { + // code page: ISO 8859-5 + 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0x401, 0x402, 0x403, + 0x404, 0x405, 0x406, 0x407, + 0x408, 0x409, 0x40a, 0x40b, + 0x40c, 0xad, 0x40e, 0x40f, + 0x410, 0x411, 0x412, 0x413, + 0x414, 0x415, 0x416, 0x417, + 0x418, 0x419, 0x41a, 0x41b, + 0x41c, 0x41d, 0x41e, 0x41f, + 0x420, 0x421, 0x422, 0x423, + 0x424, 0x425, 0x426, 0x427, + 0x428, 0x429, 0x42a, 0x42b, + 0x42c, 0x42d, 0x42e, 0x42f, + 0x430, 0x431, 0x432, 0x433, + 0x434, 0x435, 0x436, 0x437, + 0x438, 0x439, 0x43a, 0x43b, + 0x43c, 0x43d, 0x43e, 0x43f, + 0x440, 0x441, 0x442, 0x443, + 0x444, 0x445, 0x446, 0x447, + 0x448, 0x449, 0x44a, 0x44b, + 0x44c, 0x44d, 0x44e, 0x44f, + 0x2116, 0x451, 0x452, 0x453, + 0x454, 0x455, 0x456, 0x457, + 0x458, 0x459, 0x45a, 0x45b, + 0x45c, 0xa7, 0x45e, 0x45f + }, + + { + // code page: ISO 8859-6 + 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0x0, 0x0, 0x0, + 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x60c, 0xad, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x61b, + 0x0, 0x0, 0x0, 0x61f, + 0x0, 0x621, 0x622, 0x623, + 0x624, 0x625, 0x626, 0x627, + 0x628, 0x629, 0x62a, 0x62b, + 0x62c, 0x62d, 0x62e, 0x62f, + 0x630, 0x631, 0x632, 0x633, + 0x634, 0x635, 0x636, 0x637, + 0x638, 0x639, 0x63a, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x640, 0x641, 0x642, 0x643, + 0x644, 0x645, 0x646, 0x647, + 0x648, 0x649, 0x64a, 0x64b, + 0x64c, 0x64d, 0x64e, 0x64f, + 0x650, 0x651, 0x652, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0 + }, + + { + // code page: ISO 8859-7 + 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0x2018, 0x2019, 0xa3, + 0x0, 0x0, 0xa6, 0xa7, + 0xa8, 0xa9, 0x0, 0xab, + 0xac, 0xad, 0x0, 0x2015, + 0xb0, 0xb1, 0xb2, 0xb3, + 0x384, 0x385, 0x386, 0xb7, + 0x388, 0x389, 0x38a, 0xbb, + 0x38c, 0xbd, 0x38e, 0x38f, + 0x390, 0x391, 0x392, 0x393, + 0x394, 0x395, 0x396, 0x397, + 0x398, 0x399, 0x39a, 0x39b, + 0x39c, 0x39d, 0x39e, 0x39f, + 0x3a0, 0x3a1, 0x0, 0x3a3, + 0x3a4, 0x3a5, 0x3a6, 0x3a7, + 0x3a8, 0x3a9, 0x3aa, 0x3ab, + 0x3ac, 0x3ad, 0x3ae, 0x3af, + 0x3b0, 0x3b1, 0x3b2, 0x3b3, + 0x3b4, 0x3b5, 0x3b6, 0x3b7, + 0x3b8, 0x3b9, 0x3ba, 0x3bb, + 0x3bc, 0x3bd, 0x3be, 0x3bf, + 0x3c0, 0x3c1, 0x3c2, 0x3c3, + 0x3c4, 0x3c5, 0x3c6, 0x3c7, + 0x3c8, 0x3c9, 0x3ca, 0x3cb, + 0x3cc, 0x3cd, 0x3ce, 0x0 + }, + + { + // code page: ISO 8859-8 + 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0x0, 0xa2, 0xa3, + 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xd7, 0xab, + 0xac, 0xad, 0xae, 0x203e, + 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xf7, 0xbb, + 0xbc, 0xbd, 0xbe, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2017, + 0x5d0, 0x5d1, 0x5d2, 0x5d3, + 0x5d4, 0x5d5, 0x5d6, 0x5d7, + 0x5d8, 0x5d9, 0x5da, 0x5db, + 0x5dc, 0x5dd, 0x5de, 0x5df, + 0x5e0, 0x5e1, 0x5e2, 0x5e3, + 0x5e4, 0x5e5, 0x5e6, 0x5e7, + 0x5e8, 0x5e9, 0x5ea, 0x0, + 0x0, 0x0, 0x0, 0x0 + }, + + { + // code page: ISO 8859-9 + 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, + 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, + 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, + 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, + 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, + 0xcc, 0xcd, 0xce, 0xcf, + 0x11e, 0xd1, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, + 0xdc, 0x130, 0x15e, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, + 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, + 0xec, 0xed, 0xee, 0xef, + 0x11f, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0x131, 0x15f, 0xff + } +}; \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_ConvertUnicode.c opencascade-7.5.1+dfsg1/src/Resource/Resource_ConvertUnicode.c --- opencascade-7.4.1+dfsg1/src/Resource/Resource_ConvertUnicode.c 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_ConvertUnicode.c 2021-02-02 08:51:56.000000000 +0000 @@ -20,8 +20,8 @@ typedef unsigned short char16 ; -#include -#include +#include "Resource_Shiftjis.pxx" +#include "Resource_GB2312.pxx" #define isjis(c) (((c)>=0x21 && (c)<=0x7e)) #define iseuc(c) (((c)>=0xa1 && (c)<=0xfe)) diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString.hxx opencascade-7.5.1+dfsg1/src/Resource/Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString.hxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright (c) 2015 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#ifndef Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString_HeaderFile -#define Resource_DataMapIteratorOfDataMapOfAsciiStringAsciiString_HeaderFile - -#include - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_DataMapIteratorOfDataMapOfAsciiStringExtendedString.hxx opencascade-7.5.1+dfsg1/src/Resource/Resource_DataMapIteratorOfDataMapOfAsciiStringExtendedString.hxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_DataMapIteratorOfDataMapOfAsciiStringExtendedString.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_DataMapIteratorOfDataMapOfAsciiStringExtendedString.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright (c) 2015 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#ifndef Resource_DataMapIteratorOfDataMapOfAsciiStringExtendedString_HeaderFile -#define Resource_DataMapIteratorOfDataMapOfAsciiStringExtendedString_HeaderFile - -#include - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_DataMapOfAsciiStringAsciiString.hxx opencascade-7.5.1+dfsg1/src/Resource/Resource_DataMapOfAsciiStringAsciiString.hxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_DataMapOfAsciiStringAsciiString.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_DataMapOfAsciiStringAsciiString.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,8 +18,6 @@ #define Resource_DataMapOfAsciiStringAsciiString_HeaderFile #include -#include -#include #include typedef NCollection_DataMap Resource_DataMapOfAsciiStringAsciiString; diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_DataMapOfAsciiStringExtendedString.hxx opencascade-7.5.1+dfsg1/src/Resource/Resource_DataMapOfAsciiStringExtendedString.hxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_DataMapOfAsciiStringExtendedString.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_DataMapOfAsciiStringExtendedString.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,6 @@ #include #include -#include #include typedef NCollection_DataMap Resource_DataMapOfAsciiStringExtendedString; diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_FormatType.hxx opencascade-7.5.1+dfsg1/src/Resource/Resource_FormatType.hxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_FormatType.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_FormatType.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,12 +24,39 @@ { Resource_FormatType_SJIS, //!< SJIS (Shift Japanese Industrial Standards) encoding Resource_FormatType_EUC, //!< EUC (Extended Unix Code) multi-byte encoding primarily for Japanese, Korean, and simplified Chinese - Resource_FormatType_ANSI, //!< ANSI encoding (pass through without conversion) + Resource_FormatType_NoConversion, //!< format type indicating non-conversion behavior Resource_FormatType_GB, //!< GB (Guobiao) encoding for Simplified Chinese Resource_FormatType_UTF8, //!< multi-byte UTF-8 encoding Resource_FormatType_SystemLocale, //!< active system-defined locale; this value is strongly NOT recommended to use + // Windows-native ("ANSI") 8-bit code pages + Resource_FormatType_CP1250, //!< cp1250 (Central European) encoding + Resource_FormatType_CP1251, //!< cp1251 (Cyrillic) encoding + Resource_FormatType_CP1252, //!< cp1252 (Western European) encoding + Resource_FormatType_CP1253, //!< cp1253 (Greek) encoding + Resource_FormatType_CP1254, //!< cp1254 (Turkish) encoding + Resource_FormatType_CP1255, //!< cp1255 (Hebrew) encoding + Resource_FormatType_CP1256, //!< cp1256 (Arabic) encoding + Resource_FormatType_CP1257, //!< cp1257 (Baltic) encoding + Resource_FormatType_CP1258, //!< cp1258 (Vietnamese) encoding + + // ISO8859 8-bit code pages + Resource_FormatType_iso8859_1, //!< ISO 8859-1 (Western European) encoding + Resource_FormatType_iso8859_2, //!< ISO 8859-2 (Central European) encoding + Resource_FormatType_iso8859_3, //!< ISO 8859-3 (Turkish) encoding + Resource_FormatType_iso8859_4, //!< ISO 8859-4 (Northern European) encoding + Resource_FormatType_iso8859_5, //!< ISO 8859-5 (Cyrillic) encoding + Resource_FormatType_iso8859_6, //!< ISO 8859-6 (Arabic) encoding + Resource_FormatType_iso8859_7, //!< ISO 8859-7 (Greek) encoding + Resource_FormatType_iso8859_8, //!< ISO 8859-8 (Hebrew) encoding + Resource_FormatType_iso8859_9, //!< ISO 8859-9 (Turkish) encoding + + // Addition code pages + Resource_FormatType_GBK, //!< GBK (UnifiedChinese) encoding + Resource_FormatType_Big5, //!< Big5 (TradChinese) encoding + // old aliases + Resource_FormatType_ANSI = Resource_FormatType_NoConversion, Resource_SJIS = Resource_FormatType_SJIS, Resource_EUC = Resource_FormatType_EUC, Resource_ANSI = Resource_FormatType_ANSI, diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_GB2312.h opencascade-7.5.1+dfsg1/src/Resource/Resource_GB2312.h --- opencascade-7.4.1+dfsg1/src/Resource/Resource_GB2312.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_GB2312.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,32788 +0,0 @@ -/* - Copyright (c) 1998-1999 Matra Datavision - Copyright (c) 1999-2014 OPEN CASCADE SAS - - This file is part of Open CASCADE Technology software library. - - This library is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License version 2.1 as published - by the Free Software Foundation, with special exception defined in the file - OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT - distribution for complete text of the license and disclaimer of any warranty. - - Alternatively, this file may be used under the terms of Open CASCADE - commercial license or contractual agreement. -*/ - -static char16 unigb [65536] = { -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2168 , 0x0 , 0x0 , 0x216c , -0x2127 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2163 , 0x2140 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2141 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2824 , 0x2822 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2828 , 0x2826 , 0x283a , 0x0 , -0x282c , 0x282a , 0x0 , 0x0 , -0x0 , 0x0 , 0x2830 , 0x282e , -0x0 , 0x0 , 0x0 , 0x2142 , -0x0 , 0x2834 , 0x2832 , 0x0 , -0x2839 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2821 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2825 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2827 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2829 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x282d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2831 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x2823 , 0x0 , -0x282b , 0x0 , 0x282f , 0x0 , -0x2833 , 0x0 , 0x2835 , 0x0 , -0x2836 , 0x0 , 0x2837 , 0x0 , -0x2838 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2126 , -0x0 , 0x2125 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2621 , 0x2622 , 0x2623 , -0x2624 , 0x2625 , 0x2626 , 0x2627 , -0x2628 , 0x2629 , 0x262a , 0x262b , -0x262c , 0x262d , 0x262e , 0x262f , -0x2630 , 0x2631 , 0x0 , 0x2632 , -0x2633 , 0x2634 , 0x2635 , 0x2636 , -0x2637 , 0x2638 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2641 , 0x2642 , 0x2643 , -0x2644 , 0x2645 , 0x2646 , 0x2647 , -0x2648 , 0x2649 , 0x264a , 0x264b , -0x264c , 0x264d , 0x264e , 0x264f , -0x2650 , 0x2651 , 0x0 , 0x2652 , -0x2653 , 0x2654 , 0x2655 , 0x2656 , -0x2657 , 0x2658 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2727 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2721 , 0x2722 , 0x2723 , 0x2724 , -0x2725 , 0x2726 , 0x2728 , 0x2729 , -0x272a , 0x272b , 0x272c , 0x272d , -0x272e , 0x272f , 0x2730 , 0x2731 , -0x2732 , 0x2733 , 0x2734 , 0x2735 , -0x2736 , 0x2737 , 0x2738 , 0x2739 , -0x273a , 0x273b , 0x273c , 0x273d , -0x273e , 0x273f , 0x2740 , 0x2741 , -0x2751 , 0x2752 , 0x2753 , 0x2754 , -0x2755 , 0x2756 , 0x2758 , 0x2759 , -0x275a , 0x275b , 0x275c , 0x275d , -0x275e , 0x275f , 0x2760 , 0x2761 , -0x2762 , 0x2763 , 0x2764 , 0x2765 , -0x2766 , 0x2767 , 0x2768 , 0x2769 , -0x276a , 0x276b , 0x276c , 0x276d , -0x276e , 0x276f , 0x2770 , 0x2771 , -0x0 , 0x2757 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x212a , 0x0 , 0x0 , -0x212e , 0x212f , 0x0 , 0x0 , -0x2130 , 0x2131 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x212d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x216b , 0x0 , 0x2164 , 0x2165 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2179 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2166 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x216d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2271 , 0x2272 , 0x2273 , 0x2274 , -0x2275 , 0x2276 , 0x2277 , 0x2278 , -0x2279 , 0x227a , 0x227b , 0x227c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x217b , 0x217c , 0x217a , 0x217d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x214a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2147 , -0x0 , 0x2146 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x214c , 0x0 , -0x0 , 0x2158 , 0x215e , 0x0 , -0x214f , 0x0 , 0x0 , 0x0 , -0x0 , 0x214e , 0x0 , 0x2144 , -0x2145 , 0x2149 , 0x2148 , 0x2152 , -0x0 , 0x0 , 0x2153 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2160 , 0x215f , 0x2143 , 0x214b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2157 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2156 , 0x0 , 0x0 , 0x0 , -0x2155 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2159 , 0x2154 , 0x0 , 0x0 , -0x215c , 0x215d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x215a , 0x215b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2151 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x214d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x2150 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2259 , 0x225a , 0x225b , 0x225c , -0x225d , 0x225e , 0x225f , 0x2260 , -0x2261 , 0x2262 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2245 , 0x2246 , 0x2247 , 0x2248 , -0x2249 , 0x224a , 0x224b , 0x224c , -0x224d , 0x224e , 0x224f , 0x2250 , -0x2251 , 0x2252 , 0x2253 , 0x2254 , -0x2255 , 0x2256 , 0x2257 , 0x2258 , -0x2231 , 0x2232 , 0x2233 , 0x2234 , -0x2235 , 0x2236 , 0x2237 , 0x2238 , -0x2239 , 0x223a , 0x223b , 0x223c , -0x223d , 0x223e , 0x223f , 0x2240 , -0x2241 , 0x2242 , 0x2243 , 0x2244 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2924 , 0x2925 , 0x2926 , 0x2927 , -0x2928 , 0x2929 , 0x292a , 0x292b , -0x292c , 0x292d , 0x292e , 0x292f , -0x2930 , 0x2931 , 0x2932 , 0x2933 , -0x2934 , 0x2935 , 0x2936 , 0x2937 , -0x2938 , 0x2939 , 0x293a , 0x293b , -0x293c , 0x293d , 0x293e , 0x293f , -0x2940 , 0x2941 , 0x2942 , 0x2943 , -0x2944 , 0x2945 , 0x2946 , 0x2947 , -0x2948 , 0x2949 , 0x294a , 0x294b , -0x294c , 0x294d , 0x294e , 0x294f , -0x2950 , 0x2951 , 0x2952 , 0x2953 , -0x2954 , 0x2955 , 0x2956 , 0x2957 , -0x2958 , 0x2959 , 0x295a , 0x295b , -0x295c , 0x295d , 0x295e , 0x295f , -0x2960 , 0x2961 , 0x2962 , 0x2963 , -0x2964 , 0x2965 , 0x2966 , 0x2967 , -0x2968 , 0x2969 , 0x296a , 0x296b , -0x296c , 0x296d , 0x296e , 0x296f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2176 , 0x2175 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x2178 , 0x2177 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x2174 , 0x2173 , -0x0 , 0x0 , 0x0 , 0x2170 , -0x0 , 0x0 , 0x2172 , 0x2171 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x216f , 0x216e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2162 , 0x0 , 0x2161 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2121 , 0x2122 , 0x2123 , 0x2128 , -0x0 , 0x2129 , 0x0 , 0x0 , -0x2134 , 0x2135 , 0x2136 , 0x2137 , -0x2138 , 0x2139 , 0x213a , 0x213b , -0x213e , 0x213f , 0x0 , 0x217e , -0x2132 , 0x2133 , 0x213c , 0x213d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2421 , 0x2422 , 0x2423 , -0x2424 , 0x2425 , 0x2426 , 0x2427 , -0x2428 , 0x2429 , 0x242a , 0x242b , -0x242c , 0x242d , 0x242e , 0x242f , -0x2430 , 0x2431 , 0x2432 , 0x2433 , -0x2434 , 0x2435 , 0x2436 , 0x2437 , -0x2438 , 0x2439 , 0x243a , 0x243b , -0x243c , 0x243d , 0x243e , 0x243f , -0x2440 , 0x2441 , 0x2442 , 0x2443 , -0x2444 , 0x2445 , 0x2446 , 0x2447 , -0x2448 , 0x2449 , 0x244a , 0x244b , -0x244c , 0x244d , 0x244e , 0x244f , -0x2450 , 0x2451 , 0x2452 , 0x2453 , -0x2454 , 0x2455 , 0x2456 , 0x2457 , -0x2458 , 0x2459 , 0x245a , 0x245b , -0x245c , 0x245d , 0x245e , 0x245f , -0x2460 , 0x2461 , 0x2462 , 0x2463 , -0x2464 , 0x2465 , 0x2466 , 0x2467 , -0x2468 , 0x2469 , 0x246a , 0x246b , -0x246c , 0x246d , 0x246e , 0x246f , -0x2470 , 0x2471 , 0x2472 , 0x2473 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2521 , 0x2522 , 0x2523 , -0x2524 , 0x2525 , 0x2526 , 0x2527 , -0x2528 , 0x2529 , 0x252a , 0x252b , -0x252c , 0x252d , 0x252e , 0x252f , -0x2530 , 0x2531 , 0x2532 , 0x2533 , -0x2534 , 0x2535 , 0x2536 , 0x2537 , -0x2538 , 0x2539 , 0x253a , 0x253b , -0x253c , 0x253d , 0x253e , 0x253f , -0x2540 , 0x2541 , 0x2542 , 0x2543 , -0x2544 , 0x2545 , 0x2546 , 0x2547 , -0x2548 , 0x2549 , 0x254a , 0x254b , -0x254c , 0x254d , 0x254e , 0x254f , -0x2550 , 0x2551 , 0x2552 , 0x2553 , -0x2554 , 0x2555 , 0x2556 , 0x2557 , -0x2558 , 0x2559 , 0x255a , 0x255b , -0x255c , 0x255d , 0x255e , 0x255f , -0x2560 , 0x2561 , 0x2562 , 0x2563 , -0x2564 , 0x2565 , 0x2566 , 0x2567 , -0x2568 , 0x2569 , 0x256a , 0x256b , -0x256c , 0x256d , 0x256e , 0x256f , -0x2570 , 0x2571 , 0x2572 , 0x2573 , -0x2574 , 0x2575 , 0x2576 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2124 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2845 , 0x2846 , 0x2847 , -0x2848 , 0x2849 , 0x284a , 0x284b , -0x284c , 0x284d , 0x284e , 0x284f , -0x2850 , 0x2851 , 0x2852 , 0x2853 , -0x2854 , 0x2855 , 0x2856 , 0x2857 , -0x2858 , 0x2859 , 0x285a , 0x285b , -0x285c , 0x285d , 0x285e , 0x285f , -0x2860 , 0x2861 , 0x2862 , 0x2863 , -0x2864 , 0x2865 , 0x2866 , 0x2867 , -0x2868 , 0x2869 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2265 , 0x2266 , 0x2267 , 0x2268 , -0x2269 , 0x226a , 0x226b , 0x226c , -0x226d , 0x226e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x523b , 0x3621 , 0x0 , 0x465f , -0x0 , 0x0 , 0x0 , 0x4d72 , -0x5549 , 0x487d , 0x494f , 0x4f42 , -0x5822 , 0x323b , 0x536b , 0x0 , -0x5824 , 0x3373 , 0x0 , 0x5728 , -0x4752 , 0x5827 , 0x4a40 , 0x0 , -0x4770 , 0x317b , 0x5235 , 0x3454 , -0x362b , 0x4b3f , 0x5829 , 0x0 , -0x0 , 0x0 , 0x362a , 0x0 , -0x413d , 0x514f , 0x0 , 0x4925 , -0x582d , 0x0 , 0x3876 , 0x513e , -0x635c , 0x5650 , 0x0 , 0x0 , -0x3761 , 0x0 , 0x342e , 0x0 , -0x4159 , 0x0 , 0x583c , 0x0 , -0x4d68 , 0x3524 , 0x4e2a , 0x5677 , -0x0 , 0x4076 , 0x3e59 , 0x582f , -0x0 , 0x0 , 0x0 , 0x444b , -0x0 , 0x3e43 , 0x0 , 0x5831 , -0x4334 , 0x5265 , 0x0 , 0x562e , -0x4e5a , 0x5527 , 0x3a75 , 0x3726 , -0x4056 , 0x0 , 0x4639 , 0x4552 , -0x4747 , 0x0 , 0x3954 , 0x0 , -0x334b , 0x5252 , 0x0 , 0x0 , -0x583f , 0x3e45 , 0x4672 , 0x5232 , -0x4f30 , 0x4f67 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4a69 , 0x0 , -0x0 , 0x5840 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4272 , 0x4252 , 0x0 , 0x4869 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x472c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x414b , 0x0 , -0x5368 , 0x5579 , 0x0 , 0x4a42 , -0x367e , 0x5821 , 0x535a , 0x3f77 , -0x0 , 0x5446 , 0x3b25 , 0x5841 , -0x4e65 , 0x3e2e , 0x0 , 0x0 , -0x5828 , 0x0 , 0x5147 , 0x5029 , -0x0 , 0x0 , 0x0 , 0x583d , -0x596f , 0x4d76 , 0x3f3a , 0x0 , -0x3d3b , 0x3a25 , 0x5260 , 0x327a , -0x3a60 , 0x4436 , 0x0 , 0x4f6d , -0x3e29 , 0x4d24 , 0x4141 , 0x0 , -0x0 , 0x0 , 0x4757 , 0x5971 , -0x0 , 0x5974 , 0x0 , 0x0 , -0x0 , 0x0 , 0x484b , 0x5869 , -0x0 , 0x0 , 0x0 , 0x525a , -0x4a32 , 0x484a , 0x586c , 0x586a , -0x5846 , 0x3d76 , 0x464d , 0x3370 , -0x0 , 0x586b , 0x3d71 , 0x3d69 , -0x0 , 0x4854 , 0x3453 , 0x0 , -0x0 , 0x4258 , 0x0 , 0x3256 , -0x5750 , 0x4a4b , 0x4b7b , 0x554c , -0x3836 , 0x4f49 , 0x0 , 0x0 , -0x0 , 0x595a , 0x5870 , 0x472a , -0x0 , 0x586e , 0x0 , 0x347a , -0x416e , 0x5254 , 0x0 , 0x0 , -0x586d , 0x0 , 0x5247 , 0x586f , -0x4347 , 0x0 , 0x0 , 0x0 , -0x5176 , 0x0 , 0x5659 , 0x5872 , -0x0 , 0x5875 , 0x3c7e , 0x3c5b , -0x0 , 0x0 , 0x0 , 0x484e , -0x0 , 0x375d , 0x0 , 0x3742 , -0x0 , 0x4673 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5878 , 0x5241 , 0x0 , -0x0 , 0x4e69 , 0x3c3f , 0x377c , -0x3725 , 0x505d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x565a , -0x5345 , 0x3b6f , 0x3b61 , 0x5871 , -0x0 , 0x0 , 0x4921 , 0x4e30 , -0x342b , 0x0 , 0x5873 , 0x0 , -0x494b , 0x5876 , 0x4257 , 0x5877 , -0x0 , 0x0 , 0x4e31 , 0x5879 , -0x0 , 0x0 , 0x0 , 0x322e , -0x3940 , 0x0 , 0x5923 , 0x0 , -0x3069 , 0x0 , 0x4166 , 0x0 , -0x496c , 0x0 , 0x4b45 , 0x0 , -0x4b46 , 0x5924 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3568 , -0x0 , 0x0 , 0x352b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4e3b , 0x354d , 0x5721 , -0x5774 , 0x5353 , 0x0 , 0x4c65 , -0x0 , 0x3a4e , 0x0 , 0x5922 , -0x595c , 0x5360 , 0x587d , 0x3770 , -0x5777 , 0x587e , 0x587a , 0x5921 , -0x4463 , 0x0 , 0x0 , 0x5336 , -0x5874 , 0x595d , 0x0 , 0x587b , -0x0 , 0x4565 , 0x0 , 0x0 , -0x4050 , 0x0 , 0x0 , 0x5170 , -0x305b , 0x0 , 0x0 , 0x3c51 , -0x5926 , 0x0 , 0x5925 , 0x0 , -0x0 , 0x0 , 0x0 , 0x592c , -0x592e , 0x0 , 0x592b , 0x4a39 , -0x0 , 0x0 , 0x0 , 0x5929 , -0x5636 , 0x0 , 0x0 , 0x0 , -0x335e , 0x5928 , 0x0 , 0x407d , -0x0 , 0x4a4c , 0x0 , 0x592a , -0x0 , 0x5927 , 0x0 , 0x0 , -0x5930 , 0x0 , 0x0 , 0x3631 , -0x0 , 0x0 , 0x0 , 0x3929 , -0x0 , 0x5240 , 0x0 , 0x0 , -0x4f40 , 0x0 , 0x0 , 0x4242 , -0x0 , 0x3d44 , 0x556c , 0x3260 , -0x4748 , 0x3f6b , 0x592d , 0x0 , -0x592f , 0x0 , 0x4e6a , 0x3a6e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4756 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3163 , -0x0 , 0x0 , 0x0 , 0x3459 , -0x366d , 0x5934 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3f21 , 0x0 , -0x0 , 0x0 , 0x595e , 0x474e , -0x407e , 0x5938 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4b57 , -0x377d , 0x0 , 0x5935 , 0x0 , -0x5937 , 0x3123 , 0x5361 , 0x5939 , -0x0 , 0x5045 , 0x0 , 0x5936 , -0x0 , 0x0 , 0x5931 , 0x0 , -0x5932 , 0x4129 , 0x5933 , 0x0 , -0x0 , 0x3c73 , 0x505e , 0x3829 , -0x0 , 0x3e63 , 0x0 , 0x593d , -0x0 , 0x0 , 0x0 , 0x0 , -0x593a , 0x0 , 0x3033 , 0x0 , -0x0 , 0x0 , 0x5942 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5944 , 0x3136 , 0x0 , 0x593f , -0x0 , 0x0 , 0x3539 , 0x0 , -0x3e73 , 0x0 , 0x0 , 0x0 , -0x4c48 , 0x3a72 , 0x5250 , 0x0 , -0x5943 , 0x0 , 0x0 , 0x3d68 , -0x0 , 0x332b , 0x0 , 0x0 , -0x0 , 0x5945 , 0x3e6b , 0x0 , -0x5946 , 0x593b , 0x445f , 0x0 , -0x593e , 0x5941 , 0x5940 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x552e , 0x0 , -0x5635 , 0x0 , 0x4763 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5948 , -0x0 , 0x0 , 0x0 , 0x3c59 , -0x594a , 0x0 , 0x0 , 0x0 , -0x593c , 0x0 , 0x594b , 0x462b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5949 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5776 , 0x0 , -0x4d23 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3d21 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x594c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x453c , 0x4d35 , -0x0 , 0x0 , 0x0 , 0x594d , -0x0 , 0x0 , 0x5947 , 0x3325 , -0x3f7e , 0x0 , 0x0 , 0x0 , -0x0 , 0x3835 , 0x0 , 0x0 , -0x407c , 0x0 , 0x0 , 0x0 , -0x0 , 0x3078 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3476 , -0x0 , 0x594e , 0x0 , 0x594f , -0x3422 , 0x5950 , 0x0 , 0x0 , -0x345f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3041 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5951 , 0x4935 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4f71 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5952 , 0x0 , -0x0 , 0x0 , 0x4145 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5956 , 0x492e , -0x0 , 0x0 , 0x0 , 0x0 , -0x5955 , 0x5954 , 0x5957 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4b5b , -0x0 , 0x3d29 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4627 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5953 , 0x5958 , -0x0 , 0x0 , 0x0 , 0x5959 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4865 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x405c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3679 , -0x5823 , 0x544a , 0x0 , 0x542a , -0x5056 , 0x3364 , 0x5557 , 0x0 , -0x4f48 , 0x3962 , 0x0 , 0x3f4b , -0x0 , 0x4362 , 0x0 , 0x0 , -0x0 , 0x3652 , 0x0 , 0x0 , -0x4d43 , 0x596e , 0x5970 , 0x0 , -0x0 , 0x0 , 0x3533 , 0x0 , -0x3635 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3e24 , 0x0 , -0x0 , 0x486b , 0x0 , 0x0 , -0x482b , 0x0 , 0x0 , 0x304b , -0x392b , 0x4179 , 0x5962 , 0x0 , -0x403c , 0x3932 , 0x0 , 0x3958 , -0x504b , 0x3178 , 0x4664 , 0x3e5f , -0x3564 , 0x5748 , 0x0 , 0x5178 , -0x3c66 , 0x4a5e , 0x0 , 0x0 , -0x3c3d , 0x5966 , 0x5867 , 0x0 , -0x0 , 0x445a , 0x0 , 0x0 , -0x3854 , 0x483d , 0x0 , 0x0 , -0x3261 , 0x5459 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4330 , 0x0 , -0x0 , 0x4361 , 0x5a22 , 0x485f , -0x0 , 0x5034 , 0x0 , 0x3e7c , -0x4529 , 0x0 , 0x0 , 0x0 , -0x395a , 0x0 , 0x5a23 , 0x0 , -0x5429 , 0x5a24 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x597b , -0x362c , 0x0 , 0x0 , 0x376b , -0x3179 , 0x597c , 0x3365 , 0x3e76 , -0x0 , 0x3f76 , 0x5231 , 0x4064 , -0x0 , 0x0 , 0x0 , 0x3633 , -0x597e , 0x597d , 0x0 , 0x0 , -0x3e3b , 0x0 , 0x0 , 0x0 , -0x4660 , 0x0 , 0x573c , 0x5a21 , -0x0 , 0x4139 , 0x0 , 0x3572 , -0x4168 , 0x0 , 0x0 , 0x3c75 , -0x0 , 0x3455 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x415d , -0x0 , 0x447d , 0x0 , 0x0 , -0x3c38 , 0x3732 , 0x0 , 0x0 , -0x376f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x596c , -0x0 , 0x463e , 0x0 , 0x3f2d , -0x3b4b , 0x0 , 0x0 , 0x354a , -0x0 , 0x5b49 , 0x5057 , 0x0 , -0x4d39 , 0x303c , 0x3376 , 0x3b77 , -0x5b4a , 0x3a2f , 0x0 , 0x5464 , -0x3536 , 0x3573 , 0x5856 , 0x4850 , -0x0 , 0x0 , 0x3756 , 0x4750 , -0x5857 , 0x0 , 0x3f2f , 0x0 , -0x0 , 0x5b3b , 0x5858 , 0x0 , -0x0 , 0x504c , 0x3b2e , 0x0 , -0x0 , 0x0 , 0x6b3e , 0x4150 , -0x4175 , 0x5472 , 0x3855 , 0x3434 , -0x0 , 0x3375 , 0x0 , 0x0 , -0x493e , 0x0 , 0x0 , 0x0 , -0x4550 , 0x0 , 0x0 , 0x0 , -0x4559 , 0x407b , 0x0 , 0x3170 , -0x0 , 0x5859 , 0x394e , 0x0 , -0x353d , 0x0 , 0x0 , 0x585a , -0x0 , 0x0 , 0x5646 , 0x4b22 , -0x482f , 0x4932 , 0x344c , 0x3f4c , -0x0 , 0x3974 , 0x0 , 0x585b , -0x585c , 0x3667 , 0x3c41 , 0x4c6a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4f77 , 0x0 , -0x585d , 0x4730 , 0x0 , 0x0 , -0x3950 , 0x3d23 , 0x0 , 0x0 , -0x4c5e , 0x0 , 0x464a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5860 , 0x0 , 0x585e , 0x0 , -0x0 , 0x585f , 0x0 , 0x0 , -0x0 , 0x307e , 0x0 , 0x3e67 , -0x0 , 0x4a23 , 0x3c74 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3831 , -0x0 , 0x0 , 0x386e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5862 , 0x0 , 0x3d4b , -0x0 , 0x5864 , 0x5863 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x457c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5865 , 0x0 , 0x0 , 0x5866 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4126 , -0x0 , 0x4830 , 0x306c , 0x3926 , -0x3c53 , 0x4e71 , 0x5b3d , 0x4153 , -0x0 , 0x0 , 0x0 , 0x0 , -0x362f , 0x567a , 0x452c , 0x3d59 , -0x5b3e , 0x5b3f , 0x0 , 0x0 , -0x0 , 0x4078 , 0x3e22 , 0x404d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5b40 , 0x4a46 , -0x0 , 0x0 , 0x0 , 0x322a , -0x0 , 0x0 , 0x0 , 0x5342 , -0x0 , 0x4363 , 0x0 , 0x512b , -0x0 , 0x0 , 0x0 , 0x0 , -0x5b42 , 0x0 , 0x4055 , 0x0 , -0x0 , 0x0 , 0x5b43 , 0x0 , -0x3f31 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x443c , -0x0 , 0x0 , 0x0 , 0x0 , -0x475a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5b44 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5968 , 0x4957 , 0x0 , -0x0 , 0x0 , 0x3934 , 0x4e70 , -0x5448 , 0x0 , 0x0 , 0x0 , -0x0 , 0x307c , 0x3452 , 0x0 , -0x5059 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5969 , 0x0 , 0x5e4b , -0x596b , 0x0 , 0x0 , 0x0 , -0x0 , 0x5830 , 0x3b2f , 0x3131 , -0x0 , 0x3357 , 0x584e , 0x0 , -0x0 , 0x5451 , 0x0 , 0x0 , -0x3d33 , 0x3f6f , 0x0 , 0x4f3b , -0x0 , 0x0 , 0x5850 , 0x0 , -0x0 , 0x0 , 0x374b , 0x0 , -0x0 , 0x0 , 0x5851 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4625 , 0x4778 , 0x523d , -0x0 , 0x0 , 0x5852 , 0x4464 , -0x0 , 0x4a2e , 0x0 , 0x4727 , -0x0 , 0x5826 , 0x0 , 0x497d , -0x4e67 , 0x3b5c , 0x306b , 0x0 , -0x0 , 0x0 , 0x3b2a , 0x502d , -0x0 , 0x3130 , 0x5764 , 0x573f , -0x0 , 0x3525 , 0x4274 , 0x444f , -0x0 , 0x0 , 0x3229 , 0x0 , -0x3237 , 0x0 , 0x3165 , 0x5f32 , -0x553c , 0x3f28 , 0x422c , 0x5855 , -0x4231 , 0x0 , 0x5854 , 0x4e54 , -0x0 , 0x5a60 , 0x0 , 0x4e40 , -0x0 , 0x0 , 0x5834 , 0x432e , -0x5321 , 0x4e23 , 0x0 , 0x3c34 , -0x4834 , 0x4251 , 0x0 , 0x3e6d , -0x5036 , 0x0 , 0x5a61 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4764 , -0x0 , 0x0 , 0x3327 , 0x0 , -0x3672 , 0x4c7c , 0x407a , 0x0 , -0x0 , 0x4077 , 0x0 , 0x5139 , -0x5161 , 0x5847 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x325e , 0x0 , 0x0 , -0x4065 , 0x0 , 0x3a71 , 0x0 , -0x0 , 0x5848 , 0x0 , 0x542d , -0x0 , 0x0 , 0x4f61 , 0x5849 , -0x0 , 0x584a , 0x4f43 , 0x0 , -0x3378 , 0x3e47 , 0x0 , 0x0 , -0x0 , 0x0 , 0x584b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5b4c , 0x0 , -0x0 , 0x0 , 0x0 , 0x4825 , -0x0 , 0x0 , 0x0 , 0x4f58 , -0x0 , 0x487e , 0x324e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5356 , 0x3266 , 0x3c30 , 0x5351 , -0x4b2b , 0x3734 , 0x0 , 0x0 , -0x0 , 0x3722 , 0x0 , 0x0 , -0x4a65 , 0x0 , 0x4821 , 0x4a5c , -0x3164 , 0x5070 , 0x0 , 0x4551 , -0x0 , 0x0 , 0x0 , 0x5b45 , -0x357e , 0x0 , 0x0 , 0x3f5a , -0x3945 , 0x3e64 , 0x416d , 0x0 , -0x5f36 , 0x5f35 , 0x563b , 0x3d50 , -0x5559 , 0x3048 , 0x3623 , 0x3f49 , -0x4c28 , 0x5f33 , 0x4a37 , 0x5352 , -0x0 , 0x584f , 0x5236 , 0x3a45 , -0x4b3e , 0x4c3e , 0x0 , 0x5f37 , -0x3570 , 0x5f34 , 0x0 , 0x0 , -0x0 , 0x5375 , 0x0 , 0x3354 , -0x3877 , 0x0 , 0x5f3a , 0x0 , -0x3a4f , 0x3c2a , 0x3575 , 0x0 , -0x4d2c , 0x437b , 0x3a73 , 0x4074 , -0x4d42 , 0x4f72 , 0x5f38 , 0x4f45 , -0x0 , 0x4240 , 0x5f39 , 0x4270 , -0x0 , 0x0 , 0x0 , 0x3e7d , -0x0 , 0x415f , 0x4d4c , 0x5277 , -0x374d , 0x5f41 , 0x0 , 0x5f44 , -0x0 , 0x0 , 0x3771 , 0x3049 , -0x3656 , 0x3754 , 0x0 , 0x3a2c , -0x4c7d , 0x3f54 , 0x4b31 , 0x4674 , -0x0 , 0x5628 , 0x5f45 , 0x0 , -0x4e62 , 0x3333 , 0x0 , 0x0 , -0x4e7c , 0x3435 , 0x0 , 0x4e47 , -0x3a70 , 0x0 , 0x4e61 , 0x0 , -0x513d , 0x0 , 0x0 , 0x5f40 , -0x0 , 0x0 , 0x3474 , 0x0 , -0x334a , 0x0 , 0x3866 , 0x5f3b , -0x0 , 0x0 , 0x0 , 0x0 , -0x4445 , 0x0 , 0x5f3c , 0x5f3d , -0x5f3e , 0x453b , 0x5f3f , 0x5f42 , -0x5431 , 0x5f43 , 0x0 , 0x473a , -0x4e58 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4458 , 0x0 , -0x5f4a , 0x0 , 0x5f4f , 0x0 , -0x565c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5f49 , 0x5f5a , 0x4e36 , -0x0 , 0x3a47 , 0x5f4e , 0x5f48 , -0x455e , 0x0 , 0x0 , 0x496b , -0x3a74 , 0x437c , 0x0 , 0x0 , -0x3e57 , 0x0 , 0x5f46 , 0x0 , -0x5f4d , 0x0 , 0x4558 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5526 , -0x3a4d , 0x0 , 0x3e4c , 0x533d , -0x3840 , 0x0 , 0x5664 , 0x0 , -0x5f47 , 0x393e , 0x3f27 , 0x0 , -0x0 , 0x417c , 0x5f4b , 0x5f4c , -0x0 , 0x5f50 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5f5b , -0x5f65 , 0x0 , 0x5f57 , 0x5f56 , -0x5749 , 0x5f63 , 0x5f64 , 0x656b , -0x5227 , 0x5f52 , 0x0 , 0x3f29 , -0x0 , 0x545b , 0x0 , 0x3f48 , -0x5f54 , 0x0 , 0x0 , 0x0 , -0x4f4c , 0x0 , 0x0 , 0x5f5d , -0x0 , 0x514a , 0x0 , 0x5f5e , -0x3027 , 0x4637 , 0x5f53 , 0x0 , -0x3a65 , 0x0 , 0x365f , 0x4d5b , -0x397e , 0x5455 , 0x0 , 0x0 , -0x5f5f , 0x4f6c , 0x3025 , 0x5f67 , -0x5f51 , 0x5146 , 0x5f55 , 0x5f58 , -0x5f59 , 0x5f5c , 0x0 , 0x3b29 , -0x0 , 0x5f60 , 0x5f61 , 0x0 , -0x5f62 , 0x5f66 , 0x5f68 , 0x5334 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3867 , 0x4536 , 0x5f6a , -0x495a , 0x4128 , 0x4444 , 0x0 , -0x0 , 0x3f5e , 0x4f78 , 0x0 , -0x0 , 0x0 , 0x555c , 0x5f6e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3238 , 0x0 , -0x3a5f , 0x5f6c , 0x0 , 0x5b41 , -0x0 , 0x5164 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4b74 , 0x343d , -0x0 , 0x3026 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5f71 , -0x4c46 , 0x5f72 , 0x0 , 0x0 , -0x5f6d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5f69 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5f6b , 0x0 , 0x5f6f , 0x5f70 , -0x3b3d , 0x0 , 0x0 , 0x5f73 , -0x0 , 0x0 , 0x5f74 , 0x0 , -0x3b23 , 0x0 , 0x4a5b , 0x4e28 , -0x6027 , 0x332a , 0x0 , 0x6026 , -0x0 , 0x0 , 0x0 , 0x6021 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5f7e , 0x0 , 0x4d59 , 0x5f7c , -0x0 , 0x5f7a , 0x0 , 0x3f50 , -0x5744 , 0x0 , 0x494c , 0x0 , -0x0 , 0x5f78 , 0x3021 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5f7d , 0x0 , 0x0 , 0x0 , -0x0 , 0x5f7b , 0x6022 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6028 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3748 , 0x0 , 0x0 , -0x4621 , 0x4936 , 0x4032 , 0x5f75 , -0x0 , 0x0 , 0x453e , 0x0 , -0x5844 , 0x5f79 , 0x4476 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6023 , 0x6024 , 0x6025 , -0x5025 , 0x0 , 0x0 , 0x6034 , -0x4c64 , 0x0 , 0x6031 , 0x0 , -0x3f26 , 0x602f , 0x4e39 , 0x602b , -0x4946 , 0x0 , 0x0 , 0x402e , -0x602e , 0x3a6d , 0x3a30 , 0x6029 , -0x0 , 0x0 , 0x0 , 0x5f76 , -0x0 , 0x6033 , 0x0 , 0x0 , -0x6038 , 0x0 , 0x0 , 0x0 , -0x342d , 0x6039 , 0x0 , 0x0 , -0x4f32 , 0x3a48 , 0x0 , 0x6030 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x507a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x602c , 0x0 , 0x547b , -0x0 , 0x5f77 , 0x0 , 0x4567 , -0x0 , 0x602d , 0x0 , 0x5377 , -0x0 , 0x6036 , 0x6037 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6044 , 0x5061 , 0x0 , 0x0 , -0x0 , 0x603c , 0x0 , 0x0 , -0x6049 , 0x604a , 0x0 , 0x0 , -0x0 , 0x603e , 0x602a , 0x4924 , -0x6041 , 0x0 , 0x6032 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4a48 , 0x6043 , 0x0 , 0x6035 , -0x0 , 0x4e4b , 0x0 , 0x4b43 , -0x604d , 0x6046 , 0x6042 , 0x0 , -0x604b , 0x0 , 0x603a , 0x603f , -0x6040 , 0x0 , 0x0 , 0x6045 , -0x0 , 0x0 , 0x6047 , 0x6048 , -0x0 , 0x604c , 0x0 , 0x603b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4b54 , 0x6055 , 0x0 , -0x6056 , 0x6052 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6050 , 0x3c4e , 0x0 , 0x0 , -0x6051 , 0x0 , 0x3842 , 0x5845 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x506a , 0x0 , 0x0 , 0x426f , -0x0 , 0x0 , 0x604f , 0x603d , -0x0 , 0x0 , 0x0 , 0x6054 , -0x6053 , 0x0 , 0x0 , 0x6057 , -0x0 , 0x0 , 0x0 , 0x0 , -0x605c , 0x6058 , 0x0 , 0x0 , -0x0 , 0x5676 , 0x3330 , 0x0 , -0x576c , 0x0 , 0x4b3b , 0x0 , -0x0 , 0x605a , 0x0 , 0x4e7b , -0x0 , 0x0 , 0x0 , 0x3a59 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6061 , 0x605d , 0x522d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6062 , 0x0 , 0x0 , 0x605b , -0x6059 , 0x605f , 0x0 , 0x0 , -0x6060 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x605e , 0x0 , -0x6064 , 0x0 , 0x0 , 0x0 , -0x4677 , 0x582c , 0x546b , 0x6066 , -0x4a49 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6065 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3841 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6067 , -0x6068 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6069 , 0x6063 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3a3f , 0x4c67 , -0x0 , 0x0 , 0x0 , 0x606a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4f79 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x606b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4842 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3d40 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4452 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x606c , 0x0 , 0x0 , 0x606d , -0x0 , 0x0 , 0x4774 , 0x4b44 , -0x0 , 0x606e , 0x3b58 , 0x5836 , -0x5272 , 0x606f , 0x4d45 , 0x0 , -0x365a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6071 , -0x0 , 0x5430 , 0x0 , 0x0 , -0x4027 , 0x3451 , 0x0 , 0x0 , -0x4e27 , 0x6070 , 0x0 , 0x0 , -0x0 , 0x6072 , 0x394c , 0x0 , -0x0 , 0x397a , 0x4d3c , 0x6073 , -0x0 , 0x0 , 0x0 , 0x4654 , -0x6074 , 0x0 , 0x5432 , 0x0 , -0x4826 , 0x6076 , 0x6075 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6077 , 0x0 , 0x0 , 0x4d41 , -0x0 , 0x0 , 0x0 , 0x4a25 , -0x0 , 0x0 , 0x0 , 0x0 , -0x545a , 0x5b57 , 0x5b59 , 0x0 , -0x5b58 , 0x3967 , 0x5b5c , 0x5b5d , -0x3558 , 0x0 , 0x0 , 0x5b5a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5b5b , 0x3321 , 0x5b5f , -0x0 , 0x0 , 0x3b78 , 0x0 , -0x5637 , 0x0 , 0x5b60 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3e79 , -0x0 , 0x0 , 0x373b , 0x0 , -0x5b50 , 0x4c2e , 0x3f32 , 0x3b35 , -0x5778 , 0x3f53 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3f69 , -0x0 , 0x0 , 0x3c61 , 0x4c33 , -0x5b5e , 0x3053 , 0x4e6b , 0x3758 , -0x5739 , 0x4642 , 0x0 , 0x0 , -0x4024 , 0x0 , 0x4c39 , 0x0 , -0x5b67 , 0x5b61 , 0x463a , 0x5b63 , -0x0 , 0x5b68 , 0x0 , 0x4577 , -0x0 , 0x0 , 0x0 , 0x5b6a , -0x0 , 0x0 , 0x5b69 , 0x3f40 , -0x0 , 0x0 , 0x0 , 0x5b66 , -0x5b65 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3439 , 0x402c , -0x4222 , 0x5b62 , 0x5b64 , 0x0 , -0x0 , 0x0 , 0x0 , 0x504d , -0x5b6d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x405d , 0x5b72 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3662 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5b73 , 0x5b52 , 0x3938 , 0x542b , -0x5b6c , 0x0 , 0x3f51 , 0x5b70 , -0x0 , 0x5b51 , 0x0 , 0x3566 , -0x0 , 0x5b6b , 0x3f65 , 0x0 , -0x0 , 0x0 , 0x5b6e , 0x0 , -0x5b71 , 0x0 , 0x0 , 0x0 , -0x5b79 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3921 , 0x3023 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4271 , -0x0 , 0x0 , 0x3347 , 0x5b6f , -0x0 , 0x0 , 0x5b78 , 0x0 , -0x4652 , 0x5b74 , 0x0 , 0x0 , -0x5b75 , 0x5b77 , 0x5b76 , 0x0 , -0x0 , 0x5b7e , 0x0 , 0x5372 , -0x323a , 0x0 , 0x0 , 0x0 , -0x5b7d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5c24 , 0x0 , 0x5b7b , -0x0 , 0x0 , 0x0 , 0x0 , -0x5b7a , 0x0 , 0x0 , 0x0 , -0x5b7c , 0x4560 , 0x3b79 , 0x0 , -0x0 , 0x5c23 , 0x0 , 0x0 , -0x5c25 , 0x0 , 0x4c43 , 0x0 , -0x0 , 0x0 , 0x3651 , 0x5d40 , -0x0 , 0x0 , 0x0 , 0x5c21 , -0x0 , 0x5c22 , 0x0 , 0x0 , -0x0 , 0x4735 , 0x0 , 0x0 , -0x0 , 0x3669 , 0x0 , 0x0 , -0x0 , 0x5c27 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5c26 , 0x0 , -0x5c29 , 0x3124 , 0x0 , 0x0 , -0x354c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3f30 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x515f , 0x0 , 0x0 , 0x0 , -0x0 , 0x3642 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5c28 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4b7a , 0x6b73 , 0x0 , 0x0 , -0x0 , 0x4b5c , 0x0 , 0x0 , -0x4b7e , 0x0 , 0x0 , 0x0 , -0x4c41 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x487b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5c2a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4c6e , -0x5c2b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5b53 , 0x0 , -0x5c2f , 0x5c2c , 0x0 , 0x3e33 , -0x0 , 0x4a7b , 0x0 , 0x0 , -0x0 , 0x5c2d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x494a , 0x4439 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x473d , 0x5c2e , 0x0 , -0x0 , 0x0 , 0x5476 , 0x5066 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x442b , 0x3655 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5b54 , 0x0 , 0x0 , 0x0 , -0x0 , 0x315a , 0x0 , 0x0 , -0x0 , 0x5b55 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5b56 , 0x0 , 0x0 , -0x0 , 0x3a3e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4840 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4a3f , -0x4849 , 0x0 , 0x5733 , 0x0 , -0x4979 , 0x0 , 0x0 , 0x3f47 , -0x0 , 0x0 , 0x3a78 , 0x0 , -0x0 , 0x523c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x623a , 0x0 , -0x3426 , 0x0 , 0x0 , 0x3138 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3834 , 0x0 , 0x4f44 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5967 , 0x4f26 , 0x4d62 , 0x0 , -0x0 , 0x596d , 0x3660 , 0x0 , -0x5239 , 0x0 , 0x0 , 0x393b , -0x0 , 0x0 , 0x0 , 0x0 , -0x6239 , 0x6237 , 0x0 , 0x3473 , -0x0 , 0x4c6c , 0x4c2b , 0x3772 , -0x0 , 0x5832 , 0x516b , 0x3a3b , -0x0 , 0x4a27 , 0x0 , 0x0 , -0x4d37 , 0x0 , 0x0 , 0x5244 , -0x3f64 , 0x3c50 , 0x3661 , 0x0 , -0x5e45 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5e46 , 0x5b3c , 0x0 , -0x5159 , 0x0 , 0x0 , 0x4666 , -0x444e , 0x376e , 0x0 , 0x375c , -0x0 , 0x0 , 0x3f7c , 0x5760 , -0x0 , 0x4675 , 0x0 , 0x0 , -0x313c , 0x5e48 , 0x3d31 , 0x4c57 , -0x5e4a , 0x0 , 0x5e49 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x356c , 0x0 , 0x495d , 0x0 , -0x0 , 0x3042 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x452e , -0x452b , 0x0 , 0x444c , 0x0 , -0x3c69 , 0x4b7d , 0x0 , 0x0 , -0x0 , 0x3a43 , 0x0 , 0x0 , -0x0 , 0x6579 , 0x4867 , 0x657a , -0x4d7d , 0x0 , 0x5731 , 0x383e , -0x4268 , 0x0 , 0x4851 , 0x0 , -0x0 , 0x657b , 0x0 , 0x0 , -0x0 , 0x0 , 0x364a , 0x3c4b , -0x0 , 0x0 , 0x517d , 0x6621 , -0x0 , 0x436e , 0x0 , 0x0 , -0x0 , 0x0 , 0x6624 , 0x0 , -0x0 , 0x0 , 0x0 , 0x657e , -0x6625 , 0x4d57 , 0x0 , 0x0 , -0x3741 , 0x657c , 0x657d , 0x6623 , -0x0 , 0x0 , 0x445d , 0x6628 , -0x0 , 0x0 , 0x6627 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4343 , 0x0 , 0x465e , -0x0 , 0x0 , 0x662a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4437 , 0x0 , -0x0 , 0x0 , 0x6622 , 0x4a3c , -0x0 , 0x0 , 0x0 , 0x0 , -0x3d63 , 0x3943 , 0x6626 , 0x5055 , -0x4e2f , 0x0 , 0x0 , 0x6629 , -0x6630 , 0x0 , 0x5226 , 0x0 , -0x3d2a , 0x662d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x662f , -0x0 , 0x4051 , 0x0 , 0x0 , -0x524c , 0x0 , 0x0 , 0x0 , -0x3c27 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6631 , 0x0 , 0x5276 , -0x0 , 0x0 , 0x0 , 0x574b , -0x0 , 0x4d7e , 0x0 , 0x4d5e , -0x4226 , 0x662b , 0x662c , 0x3d3f , -0x662e , 0x6633 , 0x0 , 0x0 , -0x6632 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6636 , 0x0 , 0x6638 , -0x0 , 0x0 , 0x0 , 0x0 , -0x446f , 0x0 , 0x0 , 0x0 , -0x4448 , 0x0 , 0x0 , 0x3e6a , -0x496f , 0x0 , 0x0 , 0x6637 , -0x0 , 0x3670 , 0x0 , 0x0 , -0x0 , 0x4364 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5369 , 0x6634 , 0x0 , -0x6635 , 0x0 , 0x4822 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x663d , 0x0 , 0x0 , 0x0 , -0x6639 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4645 , 0x0 , -0x0 , 0x4d71 , 0x663b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x663c , 0x0 , 0x0 , -0x0 , 0x0 , 0x3b69 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x663e , 0x0 , -0x0 , 0x0 , 0x0 , 0x663a , -0x0 , 0x0 , 0x4037 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5324 , 0x663f , 0x4974 , 0x6643 , -0x0 , 0x0 , 0x6644 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5076 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x433d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4344 , 0x6642 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6641 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6647 , 0x4f31 , -0x0 , 0x6b74 , 0x0 , 0x0 , -0x664a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6645 , 0x0 , -0x0 , 0x3c5e , 0x4929 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3c35 , 0x0 , 0x0 , -0x4f53 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6648 , 0x0 , -0x6649 , 0x0 , 0x664e , 0x0 , -0x6650 , 0x0 , 0x0 , 0x0 , -0x6651 , 0x0 , 0x0 , 0x0 , -0x664b , 0x3555 , 0x0 , 0x664c , -0x0 , 0x0 , 0x664f , 0x0 , -0x0 , 0x445b , 0x0 , 0x6646 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x664d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6652 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6654 , 0x6653 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6655 , 0x0 , -0x5978 , 0x0 , 0x0 , 0x6656 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6657 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5753 , 0x665d , 0x0 , 0x665e , -0x3f57 , 0x5450 , 0x0 , 0x5756 , -0x3466 , 0x4b6f , 0x665a , 0x5843 , -0x574e , 0x5022 , 0x0 , 0x434f , -0x0 , 0x0 , 0x665f , 0x3c3e , -0x3942 , 0x665b , 0x5127 , 0x0 , -0x0 , 0x3a22 , 0x424f , 0x0 , -0x582b , 0x0 , 0x0 , 0x0 , -0x4a6b , 0x656e , 0x0 , 0x665c , -0x0 , 0x3775 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4866 , 0x0 , -0x0 , 0x4475 , 0x0 , 0x0 , -0x6532 , 0x447e , 0x0 , 0x4b7c , -0x6533 , 0x552c , 0x0 , 0x536e , -0x4a58 , 0x3032 , 0x0 , 0x4b4e , -0x4d6a , 0x0 , 0x0 , 0x3a6a , -0x0 , 0x0 , 0x0 , 0x6535 , -0x0 , 0x6534 , 0x0 , 0x575a , -0x3959 , 0x5666 , 0x3628 , 0x4d70 , -0x524b , 0x3126 , 0x4a35 , 0x0 , -0x3368 , 0x4973 , 0x3f4d , 0x507b , -0x4a52 , 0x6536 , 0x3b42 , 0x0 , -0x0 , 0x0 , 0x4f5c , 0x392c , -0x0 , 0x0 , 0x0 , 0x0 , -0x5457 , 0x0 , 0x0 , 0x3a26 , -0x5167 , 0x4f7c , 0x3c52 , 0x0 , -0x6537 , 0x485d , 0x0 , 0x0 , -0x0 , 0x3f6d , 0x3176 , 0x4b5e , -0x0 , 0x0 , 0x3c45 , 0x0 , -0x3c44 , 0x527a , 0x435c , 0x3f5c , -0x0 , 0x0 , 0x0 , 0x0 , -0x383b , 0x0 , 0x0 , 0x0 , -0x4342 , 0x0 , 0x3a2e , 0x5422 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x475e , 0x442f , 0x326c , -0x0 , 0x3951 , 0x0 , 0x0 , -0x653b , 0x4148 , 0x0 , 0x0 , -0x552f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x653c , 0x0 , -0x653e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3467 , 0x3654 , 0x4b42 , 0x5130 , -0x353c , 0x0 , 0x0 , 0x4a59 , -0x0 , 0x3762 , 0x0 , 0x0 , -0x4964 , 0x0 , 0x3d2b , 0x0 , -0x0 , 0x4e3e , 0x5770 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5021 , -0x0 , 0x4959 , 0x0 , 0x0 , -0x367b , 0x6658 , 0x3c62 , 0x0 , -0x333e , 0x0 , 0x4950 , 0x0 , -0x6659 , 0x3322 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5e4c , 0x0 , -0x5348 , 0x5e4d , 0x0 , 0x5222 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5e4e , 0x0 , 0x0 , 0x0 , -0x0 , 0x3e4d , 0x0 , 0x0 , -0x5e4f , 0x0 , 0x0 , 0x0 , -0x4a2c , 0x527c , 0x335f , 0x656a , -0x4461 , 0x3e21 , 0x4e32 , 0x4472 , -0x3e56 , 0x4628 , 0x3263 , 0x0 , -0x0 , 0x3e53 , 0x0 , 0x0 , -0x477c , 0x4c6b , 0x3d6c , 0x4e5d , -0x0 , 0x0 , 0x4a3a , 0x4641 , -0x656c , 0x503c , 0x0 , 0x0 , -0x0 , 0x5539 , 0x0 , 0x0 , -0x0 , 0x656d , 0x0 , 0x0 , -0x0 , 0x0 , 0x4a74 , 0x0 , -0x4d40 , 0x4245 , 0x0 , 0x656f , -0x0 , 0x4244 , 0x6570 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6578 , 0x4d4d , -0x0 , 0x493d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5259 , 0x6128 , 0x0 , -0x0 , 0x0 , 0x0 , 0x536c , -0x0 , 0x4b6a , 0x4671 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x612c , 0x0 , 0x0 , 0x0 , -0x6127 , 0x6129 , 0x0 , 0x0 , -0x612a , 0x612f , 0x0 , 0x0 , -0x326d , 0x0 , 0x612b , 0x385a , -0x612d , 0x612e , 0x6130 , 0x353a , -0x6131 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6133 , 0x6138 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5152 , 0x0 , 0x6136 , -0x6135 , 0x416b , 0x0 , 0x0 , -0x0 , 0x6137 , 0x0 , 0x5440 , -0x0 , 0x6132 , 0x0 , 0x613a , -0x3036 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6134 , 0x0 , 0x3f79 , -0x0 , 0x6139 , 0x0 , 0x0 , -0x613b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x613e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x613c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5645 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4f3f , 0x0 , 0x0 , -0x613d , 0x613f , 0x424d , 0x0 , -0x366b , 0x0 , 0x5378 , 0x0 , -0x0 , 0x474d , 0x0 , 0x0 , -0x3765 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3e7e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6140 , 0x6141 , -0x0 , 0x0 , 0x6147 , 0x3367 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4669 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x345e , 0x0 , 0x5142 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6148 , -0x0 , 0x0 , 0x6146 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6145 , 0x0 , 0x6143 , 0x6142 , -0x0 , 0x3140 , 0x0 , 0x0 , -0x0 , 0x5538 , 0x6144 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x614b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x614c , 0x614a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6f7a , -0x0 , 0x0 , 0x6153 , 0x6152 , -0x4736 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6149 , 0x0 , 0x0 , 0x614e , -0x0 , 0x6150 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6154 , 0x0 , 0x6151 , -0x614d , 0x0 , 0x0 , 0x614f , -0x0 , 0x0 , 0x0 , 0x0 , -0x6155 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6156 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6157 , 0x0 , 0x0 , -0x0 , 0x6158 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x615a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x615b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4e21 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x675d , -0x0 , 0x3428 , 0x565d , 0x0 , -0x0 , 0x5132 , 0x3332 , 0x0 , -0x0 , 0x3924 , 0x5773 , 0x4749 , -0x3e5e , 0x392e , 0x0 , 0x4e57 , -0x0 , 0x0 , 0x326e , 0x5b4f , -0x0 , 0x3c3a , 0x5251 , 0x4b48 , -0x304d , 0x0 , 0x0 , 0x4f6f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5963 , 0x3d6d , 0x0 , -0x0 , 0x3152 , 0x4a50 , 0x323c , -0x0 , 0x4b27 , 0x372b , 0x0 , -0x4a26 , 0x0 , 0x0 , 0x0 , -0x4f23 , 0x0 , 0x0 , 0x6078 , -0x554a , 0x607b , 0x0 , 0x0 , -0x607a , 0x4541 , 0x4c7b , 0x0 , -0x4131 , 0x6079 , 0x5663 , 0x322f , -0x5644 , 0x355b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3478 , 0x5621 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4f2f , 0x306f , 0x0 , -0x0 , 0x607c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6121 , -0x3323 , 0x0 , 0x0 , 0x607d , -0x607e , 0x4331 , 0x0 , 0x0 , -0x0 , 0x0 , 0x435d , 0x0 , -0x6122 , 0x3779 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3b4f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6123 , 0x443b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6124 , -0x0 , 0x0 , 0x6125 , 0x0 , -0x0 , 0x6126 , 0x3431 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3849 , 0x463d , -0x446a , 0x0 , 0x3222 , 0x0 , -0x5052 , 0x0 , 0x675b , 0x3b43 , -0x5357 , 0x5344 , 0x0 , 0x3963 , -0x624f , 0x0 , 0x0 , 0x0 , -0x572f , 0x0 , 0x476c , 0x3153 , -0x0 , 0x0 , 0x3432 , 0x6251 , -0x0 , 0x0 , 0x0 , 0x5072 , -0x422e , 0x6250 , 0x0 , 0x3f62 , -0x5326 , 0x3557 , 0x6252 , 0x356a , -0x0 , 0x436d , 0x387d , 0x0 , -0x382e , 0x0 , 0x4553 , 0x374f , -0x6254 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6253 , 0x3648 , 0x5779 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4d25 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6258 , -0x0 , 0x6256 , 0x4a7c , 0x3f35 , -0x5339 , 0x6255 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6257 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x412e , 0x4048 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x625b , 0x625a , 0x402a , -0x0 , 0x0 , 0x414e , 0x0 , -0x0 , 0x0 , 0x0 , 0x625c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x625d , 0x0 , 0x625e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5b48 , 0x0 , 0x5153 , 0x4d22 , -0x0 , 0x0 , 0x3d28 , 0x0 , -0x0 , 0x0 , 0x5e43 , 0x5825 , -0x3f2a , 0x5b4d , 0x526c , 0x467a , -0x452a , 0x0 , 0x0 , 0x0 , -0x5e44 , 0x0 , 0x3157 , 0x5f2e , -0x0 , 0x0 , 0x0 , 0x4a3d , -0x0 , 0x5f31 , 0x0 , 0x392d , -0x0 , 0x527d , 0x0 , 0x3825 , -0x3a6b , 0x0 , 0x0 , 0x335a , -0x0 , 0x0 , 0x0 , 0x355c , -0x5545 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4356 , 0x4f52 , 0x3b21 , -0x0 , 0x6573 , 0x6572 , 0x0 , -0x0 , 0x6574 , 0x0 , 0x4d64 , -0x0 , 0x4875 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x352f , 0x473f , 0x0 , -0x6576 , 0x0 , 0x0 , 0x0 , -0x6c30 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6566 , 0x0 , 0x3969 , 0x3531 , -0x0 , 0x423c , 0x6568 , 0x6567 , -0x6569 , 0x0 , 0x0 , 0x0 , -0x0 , 0x524d , 0x0 , 0x0 , -0x0 , 0x616a , 0x504e , 0x0 , -0x4d2e , 0x0 , 0x5165 , 0x0 , -0x0 , 0x324a , 0x316b , 0x0 , -0x3172 , 0x456d , 0x0 , 0x0 , -0x5543 , 0x5330 , 0x0 , 0x615c , -0x0 , 0x0 , 0x0 , 0x615d , -0x0 , 0x525b , 0x0 , 0x3339 , -0x314b , 0x0 , 0x0 , 0x0 , -0x4d79 , 0x5577 , 0x615e , 0x0 , -0x3e36 , 0x347d , 0x0 , 0x615f , -0x3a5c , 0x6160 , 0x3b32 , 0x4249 , -0x6161 , 0x0 , 0x0 , 0x0 , -0x506c , 0x0 , 0x4d3d , 0x0 , -0x0 , 0x6162 , 0x0 , 0x3543 , -0x4547 , 0x6163 , 0x0 , 0x0 , -0x6164 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5379 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6165 , 0x0 , 0x512d , 0x0 , -0x0 , 0x6166 , 0x4e22 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6167 , 0x0 , 0x3542 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6168 , 0x3b55 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5044 , -0x6260 , 0x3158 , 0x5264 , 0x0 , -0x0 , 0x6261 , 0x0 , 0x0 , -0x3c49 , 0x484c , 0x0 , 0x6263 , -0x6c7e , 0x6c7d , 0x5f2f , 0x0 , -0x0 , 0x0 , 0x6262 , 0x563e , -0x4d7c , 0x4326 , 0x0 , 0x0 , -0x0 , 0x6343 , 0x0 , 0x0 , -0x5652 , 0x6267 , 0x0 , 0x0 , -0x6268 , 0x0 , 0x0 , 0x5347 , -0x0 , 0x0 , 0x626c , 0x3f6c , -0x0 , 0x626d , 0x6265 , 0x0 , -0x0 , 0x3340 , 0x0 , 0x0 , -0x0 , 0x446e , 0x0 , 0x0 , -0x626e , 0x0 , 0x0 , 0x5043 , -0x0 , 0x3a76 , 0x6269 , 0x375e , -0x3b33 , 0x4c2c , 0x4b4b , 0x6264 , -0x6266 , 0x626a , 0x626b , 0x0 , -0x0 , 0x0 , 0x6277 , 0x0 , -0x0 , 0x6274 , 0x5475 , 0x6273 , -0x0 , 0x0 , 0x452d , 0x0 , -0x557a , 0x4542 , 0x3240 , 0x0 , -0x0 , 0x626f , 0x0 , 0x6272 , -0x412f , 0x4b3c , 0x0 , 0x0 , -0x3521 , 0x6279 , 0x0 , 0x0 , -0x0 , 0x3c31 , 0x6271 , 0x5054 , -0x5439 , 0x6275 , 0x3956 , 0x6276 , -0x0 , 0x0 , 0x0 , 0x4753 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6270 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x575c , -0x6d21 , 0x0 , 0x0 , 0x6278 , -0x0 , 0x6d25 , 0x627e , 0x4a51 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4135 , -0x0 , 0x3b50 , 0x0 , 0x0 , -0x3f56 , 0x0 , 0x3a63 , 0x0 , -0x0 , 0x4b21 , 0x0 , 0x0 , -0x0 , 0x6d26 , 0x6d23 , 0x0 , -0x0 , 0x6d22 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3b56 , 0x6d27 , -0x5074 , 0x0 , 0x0 , 0x6d24 , -0x3a5e , 0x3677 , 0x6321 , 0x3632 , -0x4c71 , 0x3927 , 0x0 , 0x4f22 , -0x4721 , 0x0 , 0x0 , 0x3f52 , -0x0 , 0x0 , 0x3671 , 0x0 , -0x627a , 0x627b , 0x627d , 0x627c , -0x4455 , 0x6322 , 0x0 , 0x5341 , -0x0 , 0x0 , 0x0 , 0x6327 , -0x4744 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4f24 , 0x0 , 0x0 , -0x6329 , 0x3a37 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6328 , 0x0 , -0x3b5a , 0x0 , 0x6323 , 0x0 , -0x0 , 0x0 , 0x6324 , 0x632a , -0x0 , 0x6326 , 0x0 , 0x4e72 , -0x5346 , 0x0 , 0x0 , 0x3b3c , -0x0 , 0x0 , 0x5443 , 0x0 , -0x447a , 0x0 , 0x0 , 0x6d28 , -0x507c , 0x6325 , 0x0 , 0x4375 , -0x0 , 0x632d , 0x312f , 0x0 , -0x6332 , 0x0 , 0x0 , 0x0 , -0x3c42 , 0x0 , 0x0 , 0x632c , -0x353f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4769 , 0x6330 , 0x0 , -0x0 , 0x0 , 0x3e2a , 0x4d6f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3b73 , 0x0 , 0x0 , -0x0 , 0x4c68 , 0x0 , 0x0 , -0x632f , 0x0 , 0x6331 , 0x0 , -0x4f27 , 0x632e , 0x0 , 0x4e29 , -0x3b5d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x356b , 0x3e65 , -0x3252 , 0x334d , 0x0 , 0x3139 , -0x632b , 0x3251 , 0x352c , 0x395f , -0x3668 , 0x0 , 0x0 , 0x4f6b , -0x6337 , 0x0 , 0x3b4c , 0x0 , -0x0 , 0x4847 , 0x504a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6338 , 0x336e , 0x0 , 0x0 , -0x0 , 0x0 , 0x6d29 , 0x0 , -0x537a , 0x5364 , 0x0 , 0x0 , -0x0 , 0x6d2a , 0x6339 , 0x5262 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6335 , 0x0 , 0x0 , -0x0 , 0x0 , 0x535e , 0x0 , -0x0 , 0x0 , 0x0 , 0x3850 , -0x6333 , 0x0 , 0x0 , 0x6336 , -0x375f , 0x0 , 0x6334 , 0x4022 , -0x0 , 0x0 , 0x0 , 0x633a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5438 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3448 , 0x0 , 0x633b , 0x0 , -0x3b45 , 0x0 , 0x4977 , 0x0 , -0x0 , 0x4965 , 0x0 , 0x0 , -0x0 , 0x443d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d2b , 0x0 , 0x0 , -0x0 , 0x0 , 0x427d , 0x0 , -0x0 , 0x0 , 0x0 , 0x3b5b , -0x3f2e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4e3f , 0x0 , 0x0 , 0x0 , -0x0 , 0x633c , 0x0 , 0x3f36 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x316f , -0x0 , 0x0 , 0x5477 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x633e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d2d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x633f , -0x3a29 , 0x6d2c , 0x0 , 0x0 , -0x633d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6340 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3a36 , 0x0 , -0x0 , 0x0 , 0x362e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5038 , 0x0 , 0x3043 , 0x6d2e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d2f , 0x4041 , 0x0 , -0x6341 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4533 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6342 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5c32 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6d30 , 0x0 , -0x386a , 0x0 , 0x4e6c , 0x6a27 , -0x5067 , 0x4a79 , 0x4856 , 0x4f37 , -0x3349 , 0x4e52 , 0x3d64 , 0x0 , -0x0 , 0x635e , 0x3b72 , 0x6a28 , -0x553d , 0x0 , 0x465d , 0x6a29 , -0x0 , 0x0 , 0x0 , 0x6a2a , -0x0 , 0x6a2c , 0x6a2b , 0x0 , -0x6a2e , 0x6a2d , 0x0 , 0x0 , -0x0 , 0x0 , 0x3d58 , 0x0 , -0x6a2f , 0x0 , 0x423e , 0x0 , -0x0 , 0x0 , 0x0 , 0x3441 , -0x3477 , 0x0 , 0x0 , 0x3b27 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6c66 , 0x6c65 , 0x373f , -0x4b79 , 0x3162 , 0x0 , 0x6c67 , -0x0 , 0x0 , 0x0 , 0x4948 , -0x6c68 , 0x6c69 , 0x0 , 0x4a56 , -0x5e50 , 0x3245 , 0x547a , 0x0 , -0x0 , 0x464b , 0x3047 , 0x3472 , -0x4853 , 0x0 , 0x0 , 0x0 , -0x4d50 , 0x0 , 0x0 , 0x3f38 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3f5b , -0x0 , 0x0 , 0x4724 , 0x5634 , -0x0 , 0x4029 , 0x5e51 , 0x4928 , -0x516f , 0x4524 , 0x3067 , 0x3336 , -0x4845 , 0x0 , 0x0 , 0x3062 , -0x0 , 0x0 , 0x3776 , 0x0 , -0x0 , 0x457a , 0x0 , 0x0 , -0x3673 , 0x0 , 0x5552 , 0x3350 , -0x3c3c , 0x0 , 0x0 , 0x0 , -0x332d , 0x0 , 0x0 , 0x0 , -0x0 , 0x3e71 , 0x3051 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5256 , 0x4a63 , 0x5725 , -0x0 , 0x4d36 , 0x3636 , 0x3f39 , -0x555b , 0x0 , 0x3827 , 0x4557 , -0x0 , 0x0 , 0x0 , 0x5e52 , -0x3f59 , 0x4255 , 0x4740 , 0x0 , -0x3b24 , 0x3128 , 0x0 , 0x0 , -0x456a , 0x0 , 0x0 , 0x457b , -0x4c27 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3127 , 0x0 , 0x0 , -0x0 , 0x3556 , 0x0 , 0x0 , -0x0 , 0x4428 , 0x0 , 0x5e53 , -0x513a , 0x3369 , 0x0 , 0x4372 , -0x0 , 0x0 , 0x3777 , 0x0 , -0x5674 , 0x3523 , 0x3270 , 0x4434 , -0x4469 , 0x402d , 0x5e54 , 0x0 , -0x3068 , 0x4544 , 0x4160 , 0x0 , -0x3955 , 0x0 , 0x3e5c , 0x4d58 , -0x304e , 0x0 , 0x4d4f , 0x5e56 , -0x3e50 , 0x573e , 0x5e55 , 0x5550 , -0x305d , 0x0 , 0x0 , 0x4462 , -0x0 , 0x0 , 0x4223 , 0x3c70 , -0x0 , 0x5335 , 0x4039 , 0x4521 , -0x3226 , 0x5471 , 0x0 , 0x0 , -0x4028 , 0x4a43 , 0x5e57 , 0x557c , -0x0 , 0x3930 , 0x0 , 0x482d , -0x4b29 , 0x0 , 0x5e59 , 0x3f3d , -0x0 , 0x0 , 0x0 , 0x0 , -0x4634 , 0x5727 , 0x4a30 , 0x4443 , -0x0 , 0x3356 , 0x3952 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5638 , -0x6a7c , 0x3034 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3f66 , 0x0 , -0x0 , 0x4c74 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4d5a , 0x0 , -0x0 , 0x0 , 0x563f , 0x424e , -0x0 , 0x4e4e , 0x4c22 , 0x502e , -0x4453 , 0x3532 , 0x5e58 , 0x5575 , -0x3c37 , 0x3b53 , 0x0 , 0x0 , -0x3024 , 0x0 , 0x4532 , 0x346c , -0x0 , 0x0 , 0x0 , 0x5571 , -0x0 , 0x0 , 0x6a7d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5e5a , 0x4d26 , 0x0 , -0x0 , 0x4d6c , 0x0 , 0x0 , -0x0 , 0x0 , 0x4e66 , 0x5e5c , -0x0 , 0x4d31 , 0x4026 , 0x0 , -0x0 , 0x573d , 0x0 , 0x5e5b , -0x3046 , 0x3a34 , 0x4953 , 0x4473 , -0x3e68 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3236 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x404c , 0x4b70 , -0x0 , 0x3c71 , 0x3b3b , 0x3537 , -0x0 , 0x0 , 0x0 , 0x4575 , -0x0 , 0x5e66 , 0x0 , 0x0 , -0x0 , 0x5e63 , 0x3e5d , 0x0 , -0x0 , 0x5e5f , 0x0 , 0x0 , -0x0 , 0x0 , 0x3437 , 0x3d5d , -0x0 , 0x0 , 0x5e60 , 0x446d , -0x0 , 0x0 , 0x0 , 0x0 , -0x4f46 , 0x0 , 0x3560 , 0x0 , -0x0 , 0x0 , 0x0 , 0x365e , -0x4a5a , 0x3574 , 0x5e65 , 0x0 , -0x5546 , 0x0 , 0x5e61 , 0x4c4d , -0x467e , 0x0 , 0x4545 , 0x0 , -0x0 , 0x0 , 0x5234 , 0x0 , -0x3e72 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4253 , 0x0 , 0x4c3d , 0x3338 , -0x0 , 0x3d53 , 0x0 , 0x3f58 , -0x4d46 , 0x515a , 0x346b , 0x0 , -0x5e64 , 0x5e5d , 0x5e67 , 0x0 , -0x6a7e , 0x0 , 0x0 , 0x4230 , -0x5e62 , 0x0 , 0x0 , 0x5640 , -0x3527 , 0x0 , 0x3274 , 0x0 , -0x5e68 , 0x0 , 0x5e72 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5e6d , 0x0 , 0x5e71 , 0x0 , -0x0 , 0x4860 , 0x0 , 0x0 , -0x0 , 0x5761 , 0x5e6f , 0x4368 , -0x4c61 , 0x0 , 0x3265 , 0x0 , -0x0 , 0x0 , 0x523e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5e6e , 0x0 , -0x5e6b , 0x4e55 , 0x0 , 0x3427 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3f2b , 0x3e3e , 0x0 , -0x0 , 0x3d52 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5e69 , 0x0 , -0x542e , 0x0 , 0x5e5e , 0x0 , -0x5e6a , 0x0 , 0x0 , 0x0 , -0x0 , 0x403f , 0x0 , 0x5e6c , -0x3273 , 0x3869 , 0x4227 , 0x0 , -0x0 , 0x3d41 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5e75 , -0x5e78 , 0x0 , 0x0 , 0x322b , -0x3424 , 0x0 , 0x0 , 0x346a , -0x4926 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5e76 , -0x4b51 , 0x0 , 0x3863 , 0x0 , -0x5e77 , 0x5e7a , 0x0 , 0x0 , -0x0 , 0x0 , 0x5e79 , 0x0 , -0x0 , 0x0 , 0x4c42 , 0x0 , -0x3061 , 0x346e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x653a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x502f , 0x0 , -0x0 , 0x326b , 0x0 , 0x6b21 , -0x0 , 0x5e74 , 0x0 , 0x0 , -0x4963 , 0x5e73 , 0x305a , 0x5221 , -0x3177 , 0x0 , 0x4c2f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5e70 , 0x0 , -0x4b24 , 0x0 , 0x0 , 0x0 , -0x552a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5e7b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x345d , -0x0 , 0x4426 , 0x0 , 0x0 , -0x0 , 0x5e7d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x437e , 0x4421 , 0x5f21 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x414c , 0x0 , -0x5e7c , 0x3e6f , 0x0 , 0x4632 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3345 , 0x4876 , 0x0 , -0x0 , 0x4b3a , 0x5e7e , 0x0 , -0x0 , 0x5f24 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5732 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3337 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4143 , 0x0 , 0x0 , -0x474b , 0x3225 , 0x3469 , 0x0 , -0x572b , 0x0 , 0x0 , 0x0 , -0x0 , 0x446c , 0x0 , 0x5f22 , -0x5f23 , 0x0 , 0x5f25 , 0x0 , -0x3a33 , 0x0 , 0x0 , 0x0 , -0x5f26 , 0x0 , 0x405e , 0x0 , -0x0 , 0x4943 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3259 , 0x4766 , 0x0 , -0x5f27 , 0x0 , 0x475c , 0x0 , -0x0 , 0x0 , 0x0 , 0x5f28 , -0x6b22 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4b53 , 0x0 , -0x0 , 0x0 , 0x5f2a , 0x0 , -0x5f29 , 0x0 , 0x3241 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x454a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5f2b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x545c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4841 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5f2c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3e70 , -0x0 , 0x0 , 0x5f2d , 0x5627 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6a37 , 0x6b36 , 0x4a55 , 0x0 , -0x587c , 0x3844 , 0x0 , 0x3925 , -0x0 , 0x0 , 0x3745 , 0x557e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x394a , 0x0 , 0x0 , -0x5027 , 0x744d , 0x0 , 0x0 , -0x3550 , 0x0 , 0x0 , 0x4374 , -0x0 , 0x3e48 , 0x0 , 0x0 , -0x0 , 0x6b37 , 0x303d , 0x0 , -0x0 , 0x3d4c , 0x0 , 0x4132 , -0x0 , 0x3156 , 0x3328 , 0x0 , -0x0 , 0x0 , 0x3852 , 0x4922 , -0x0 , 0x0 , 0x3658 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6b38 , -0x3e34 , 0x0 , 0x0 , 0x0 , -0x4a7d , 0x0 , 0x4743 , 0x0 , -0x557b , 0x0 , 0x0 , 0x3773 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4e44 , -0x0 , 0x0 , 0x0 , 0x552b , -0x3173 , 0x0 , 0x0 , 0x0 , -0x6c33 , 0x305f , 0x0 , 0x6c35 , -0x0 , 0x0 , 0x0 , 0x3637 , -0x0 , 0x414f , 0x0 , 0x757a , -0x5031 , 0x0 , 0x0 , 0x5565 , -0x0 , 0x4e53 , 0x0 , 0x0 , -0x3d6f , 0x3362 , 0x0 , 0x382b , -0x0 , 0x5536 , 0x0 , 0x6d3d , -0x0 , 0x364f , 0x0 , 0x4b39 , -0x5042 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x373d , 0x0 , 0x0 , -0x6c36 , 0x4a29 , 0x0 , 0x0 , -0x0 , 0x4554 , 0x0 , 0x6c39 , -0x6c38 , 0x4243 , 0x6c37 , 0x0 , -0x0 , 0x0 , 0x0 , 0x507d , -0x6c3a , 0x0 , 0x6c3b , 0x5765 , -0x0 , 0x0 , 0x6c3c , 0x0 , -0x0 , 0x0 , 0x6c3d , 0x466c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4e5e , 0x0 , 0x3c48 , 0x0 , -0x0 , 0x4855 , 0x3529 , 0x3e49 , -0x563c , 0x5467 , 0x0 , 0x0 , -0x512e , 0x5071 , 0x6a38 , 0x6a39 , -0x6a3a , 0x3a35 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4a31 , 0x3f75 , -0x0 , 0x0 , 0x4d7a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6a40 , 0x0 , 0x303a , 0x6a3e , -0x0 , 0x0 , 0x4025 , 0x0 , -0x0 , 0x0 , 0x6a3b , 0x0 , -0x327d , 0x0 , 0x4377 , 0x3b68 , -0x0 , 0x0 , 0x0 , 0x5257 , -0x4e74 , 0x6a3f , 0x0 , 0x0 , -0x0 , 0x6a3c , 0x0 , 0x0 , -0x0 , 0x6a43 , 0x0 , 0x5047 , -0x5333 , 0x0 , 0x0 , 0x0 , -0x0 , 0x343a , 0x0 , 0x4341 , -0x5772 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5551 , 0x0 , 0x4a47 , -0x0 , 0x6a45 , 0x0 , 0x0 , -0x6a44 , 0x6a47 , 0x6a46 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5667 , 0x0 , 0x4f54 , 0x0 , -0x0 , 0x6a4b , 0x0 , 0x3b4e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3d7a , -0x494e , 0x0 , 0x0 , 0x6a4c , -0x0 , 0x0 , 0x4939 , 0x4f7e , -0x6a4a , 0x544e , 0x6a4d , 0x6a4f , -0x0 , 0x0 , 0x4d6d , 0x0 , -0x0 , 0x0 , 0x0 , 0x6a49 , -0x0 , 0x6a4e , 0x0 , 0x0 , -0x4e6e , 0x0 , 0x3b5e , 0x0 , -0x333f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4655 , 0x3e30 , -0x4e7a , 0x0 , 0x0 , 0x0 , -0x4767 , 0x0 , 0x3e27 , 0x6a50 , -0x0 , 0x0 , 0x5647 , 0x0 , -0x0 , 0x0 , 0x4140 , 0x0 , -0x0 , 0x0 , 0x545d , 0x0 , -0x6a51 , 0x0 , 0x0 , 0x4f3e , -0x0 , 0x0 , 0x0 , 0x0 , -0x6a52 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4a6e , 0x0 , 0x0 , -0x0 , 0x0 , 0x452f , 0x3035 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6a54 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6a53 , -0x745f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x443a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3129 , 0x0 , 0x0 , 0x0 , -0x0 , 0x655f , 0x0 , 0x0 , -0x0 , 0x0 , 0x6a55 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4a6f , 0x0 , 0x6a56 , -0x6a57 , 0x4658 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6a58 , 0x0 , -0x0 , 0x6a59 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x543b , 0x0 , 0x477a , 0x5237 , -0x387c , 0x0 , 0x0 , 0x6a42 , -0x0 , 0x325c , 0x0 , 0x0 , -0x427c , 0x0 , 0x5478 , 0x4c66 , -0x576e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5442 , 0x5350 , 0x6b43 , 0x4573 , -0x0 , 0x377e , 0x0 , 0x0 , -0x6b54 , 0x0 , 0x0 , 0x0 , -0x4b37 , 0x6b5e , 0x0 , 0x404a , -0x0 , 0x0 , 0x0 , 0x4d7b , -0x0 , 0x332f , 0x0 , 0x465a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6b7c , 0x0 , -0x443e , 0x0 , 0x4e34 , 0x4429 , -0x313e , 0x547d , 0x0 , 0x4a75 , -0x0 , 0x566c , 0x0 , 0x0 , -0x4653 , 0x3664 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3b7a , 0x0 , -0x0 , 0x5060 , 0x0 , 0x0 , -0x4931 , 0x0 , 0x5453 , 0x4828 , -0x0 , 0x0 , 0x384b , 0x0 , -0x683e , 0x493c , 0x0 , 0x0 , -0x683b , 0x0 , 0x406e , 0x5053 , -0x3244 , 0x3465 , 0x0 , 0x683c , -0x0 , 0x0 , 0x5548 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3645 , 0x0 , 0x683d , 0x4a78 , -0x385c , 0x4c75 , 0x0 , 0x0 , -0x0 , 0x4034 , 0x0 , 0x0 , -0x516e , 0x683f , 0x6842 , 0x0 , -0x0 , 0x3a3c , 0x0 , 0x312d , -0x3d5c , 0x0 , 0x6a3d , 0x6843 , -0x0 , 0x6846 , 0x0 , 0x684b , -0x0 , 0x0 , 0x0 , 0x0 , -0x684c , 0x0 , 0x4b49 , 0x3065 , -0x0 , 0x3c2b , 0x0 , 0x0 , -0x3939 , 0x0 , 0x0 , 0x6841 , -0x0 , 0x4d77 , 0x0 , 0x684a , -0x0 , 0x0 , 0x0 , 0x0 , -0x4e76 , 0x0 , 0x0 , 0x0 , -0x0 , 0x556d , 0x0 , 0x4156 , -0x6844 , 0x0 , 0x4336 , 0x0 , -0x397b , 0x5626 , 0x6848 , 0x0 , -0x0 , 0x0 , 0x4a60 , 0x5466 , -0x0 , 0x6840 , 0x0 , 0x6845 , -0x6847 , 0x0 , 0x4739 , 0x3763 , -0x0 , 0x6849 , 0x0 , 0x3f5d , -0x6852 , 0x0 , 0x0 , 0x6857 , -0x0 , 0x6855 , 0x3c5c , 0x3c4f , -0x685b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x685e , 0x0 , 0x685a , -0x317a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3058 , -0x4433 , 0x384c , 0x4662 , 0x483e , -0x4861 , 0x0 , 0x0 , 0x0 , -0x684f , 0x6854 , 0x6856 , 0x0 , -0x3971 , 0x6858 , 0x5775 , 0x0 , -0x447b , 0x0 , 0x685c , 0x0 , -0x0 , 0x3269 , 0x0 , 0x0 , -0x0 , 0x6851 , 0x0 , 0x0 , -0x3c6d , 0x0 , 0x0 , 0x3f42 , -0x684d , 0x5679 , 0x0 , 0x4178 , -0x3271 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x685f , 0x0 , 0x4a41 , -0x6859 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5524 , 0x0 , 0x316a , -0x553b , 0x684e , 0x6850 , 0x3630 , -0x6853 , 0x0 , 0x685d , 0x4038 , -0x0 , 0x4a77 , 0x0 , 0x4b28 , -0x0 , 0x0 , 0x465c , 0x4075 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6869 , 0x0 , 0x0 , -0x0 , 0x5023 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6872 , 0x566a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6860 , 0x6861 , -0x0 , 0x0 , 0x0 , 0x5179 , -0x3a4b , 0x3879 , 0x0 , 0x0 , -0x3871 , 0x5454 , 0x686f , 0x0 , -0x686e , 0x686c , 0x3970 , 0x4c52 , -0x6866 , 0x4e26 , 0x3f72 , 0x0 , -0x3038 , 0x6871 , 0x6870 , 0x0 , -0x5740 , 0x0 , 0x6864 , 0x0 , -0x4d29 , 0x4923 , 0x0 , 0x3b38 , -0x3d5b , 0x686a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6862 , 0x6863 , 0x6865 , 0x3535 , -0x6867 , 0x4745 , 0x686b , 0x686d , -0x3d30 , 0x572e , 0x0 , 0x6878 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6875 , 0x0 , 0x4d30 , 0x6876 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x413a , 0x0 , 0x6868 , -0x0 , 0x4337 , 0x3070 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6874 , -0x0 , 0x0 , 0x0 , 0x6877 , -0x0 , 0x0 , 0x0 , 0x3923 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4952 , 0x0 , -0x0 , 0x0 , 0x434e , 0x4e60 , -0x4066 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4b73 , 0x0 , 0x4c5d , -0x5035 , 0x0 , 0x0 , 0x4a61 , -0x0 , 0x6873 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3c6c , 0x0 , 0x6879 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x435e , 0x0 , 0x4665 , -0x0 , 0x3977 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3074 , 0x0 , -0x0 , 0x5758 , 0x0 , 0x0 , -0x3c2c , 0x0 , 0x456f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4c44 , 0x0 , 0x0 , 0x6926 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x492d , 0x0 , -0x6922 , 0x4062 , 0x0 , 0x0 , -0x0 , 0x3f43 , 0x0 , 0x0 , -0x0 , 0x687e , 0x3957 , 0x0 , -0x687b , 0x0 , 0x0 , 0x0 , -0x0 , 0x6924 , 0x0 , 0x0 , -0x0 , 0x524e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6923 , -0x0 , 0x5632 , 0x5735 , 0x0 , -0x6927 , 0x0 , 0x3d37 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x687c , -0x687d , 0x0 , 0x0 , 0x0 , -0x6921 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4d56 , 0x0 , 0x0 , -0x522c , 0x0 , 0x0 , 0x0 , -0x6932 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6929 , 0x0 , 0x0 , -0x0 , 0x342a , 0x0 , 0x343b , -0x0 , 0x0 , 0x692b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5028 , 0x0 , 0x0 , 0x6925 , -0x0 , 0x0 , 0x337e , 0x0 , -0x0 , 0x692c , 0x4063 , 0x0 , -0x692a , 0x0 , 0x0 , 0x6939 , -0x0 , 0x0 , 0x6938 , 0x0 , -0x0 , 0x0 , 0x0 , 0x692e , -0x0 , 0x0 , 0x687a , 0x0 , -0x0 , 0x6928 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3f2c , -0x6931 , 0x693a , 0x0 , 0x0 , -0x4225 , 0x0 , 0x0 , 0x0 , -0x692f , 0x0 , 0x3845 , 0x0 , -0x692d , 0x0 , 0x535c , 0x6934 , -0x6935 , 0x6937 , 0x0 , 0x0 , -0x0 , 0x6947 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4046 , 0x6945 , 0x0 , 0x0 , -0x6930 , 0x0 , 0x0 , 0x693b , -0x3071 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x693c , -0x5525 , 0x0 , 0x0 , 0x693e , -0x0 , 0x693f , 0x0 , 0x0 , -0x0 , 0x6941 , 0x0 , 0x0 , -0x4171 , 0x0 , 0x0 , 0x4836 , -0x0 , 0x0 , 0x0 , 0x693d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6942 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6943 , 0x0 , -0x6933 , 0x0 , 0x6936 , 0x0 , -0x3b31 , 0x0 , 0x0 , 0x0 , -0x6940 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3c77 , -0x0 , 0x0 , 0x0 , 0x6944 , -0x6946 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x694a , 0x0 , 0x0 , -0x0 , 0x0 , 0x694e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x325b , 0x0 , 0x6948 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x372e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x694b , -0x694c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5541 , -0x0 , 0x4423 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6958 , 0x0 , 0x3a61 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6949 , -0x0 , 0x5323 , 0x0 , 0x0 , -0x0 , 0x6954 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6957 , 0x6950 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x694f , 0x0 , 0x0 , 0x4741 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6952 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6959 , 0x3348 , 0x0 , 0x6953 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4f70 , 0x0 , 0x0 , -0x0 , 0x694d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3377 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6956 , 0x0 , 0x0 , -0x695a , 0x0 , 0x0 , 0x0 , -0x4c34 , 0x0 , 0x0 , 0x0 , -0x4f2d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6955 , 0x0 , -0x695c , 0x695b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x695e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6951 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x695d , 0x0 , 0x695f , -0x434a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4737 , 0x344e , 0x3b36 , 0x5040 , -0x6c23 , 0x0 , 0x0 , 0x4537 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x537b , 0x0 , -0x0 , 0x0 , 0x0 , 0x6c24 , -0x0 , 0x6c25 , 0x465b , 0x0 , -0x0 , 0x0 , 0x3f6e , 0x0 , -0x0 , 0x0 , 0x0 , 0x6c26 , -0x0 , 0x0 , 0x6c27 , 0x502a , -0x0 , 0x4738 , 0x0 , 0x0 , -0x3868 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6c28 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5639 , 0x557d , -0x344b , 0x323d , 0x4e64 , 0x4667 , -0x0 , 0x0 , 0x4d61 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3475 , 0x0 , 0x4b40 , -0x3c5f , 0x0 , 0x0 , 0x0 , -0x0 , 0x6962 , 0x6963 , 0x516a , -0x6965 , 0x0 , 0x3479 , 0x6964 , -0x0 , 0x5133 , 0x4a62 , 0x3250 , -0x0 , 0x6968 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6966 , 0x6967 , -0x0 , 0x0 , 0x5633 , 0x0 , -0x0 , 0x0 , 0x6969 , 0x696a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x696b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x696c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6c2f , -0x4539 , 0x364e , 0x0 , 0x5273 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x356e , -0x0 , 0x3b59 , 0x6c31 , 0x0 , -0x0 , 0x5263 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4e63 , -0x0 , 0x4438 , 0x0 , 0x433f , -0x0 , 0x0 , 0x363e , 0x5839 , -0x3148 , 0x314f , 0x3151 , 0x457e , -0x0 , 0x3150 , 0x0 , 0x432b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5531 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6b24 , 0x3a41 , -0x0 , 0x0 , 0x0 , 0x4c3a , -0x0 , 0x0 , 0x0 , 0x6b25 , -0x0 , 0x6b27 , 0x0 , 0x0 , -0x0 , 0x6b28 , 0x0 , 0x0 , -0x0 , 0x6b26 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6b29 , 0x6b2b , 0x6b2a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6b2c , 0x0 , 0x4a4f , -0x5835 , 0x4371 , 0x0 , 0x4325 , -0x4678 , 0x6b2d , 0x444a , 0x0 , -0x6b2e , 0x6b2f , 0x6b30 , 0x3755 , -0x0 , 0x0 , 0x0 , 0x377a , -0x0 , 0x6b31 , 0x4762 , 0x0 , -0x6b33 , 0x0 , 0x3a24 , 0x5175 , -0x3031 , 0x6b32 , 0x6b34 , 0x0 , -0x0 , 0x0 , 0x352a , 0x4248 , -0x4768 , 0x0 , 0x6b35 , 0x0 , -0x4b2e , 0x635f , 0x0 , 0x0 , -0x5340 , 0x0 , 0x0 , 0x0 , -0x0 , 0x595b , 0x0 , 0x0 , -0x4d21 , 0x562d , 0x4773 , 0x0 , -0x0 , 0x0 , 0x5960 , 0x3b63 , -0x0 , 0x3a3a , 0x6362 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4f2b , 0x0 , 0x0 , 0x0 , -0x6360 , 0x4947 , 0x0 , 0x3a39 , -0x0 , 0x0 , 0x0 , 0x5134 , -0x6361 , 0x486a , 0x392f , 0x3d2d , -0x3358 , 0x4e5b , 0x0 , 0x0 , -0x4c40 , 0x0 , 0x0 , 0x0 , -0x6368 , 0x6369 , 0x4d74 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4c2d , 0x0 , 0x3c33 , 0x0 , -0x636a , 0x0 , 0x636b , 0x0 , -0x0 , 0x505a , 0x0 , 0x0 , -0x0 , 0x467b , 0x375a , 0x0 , -0x0 , 0x475f , 0x524a , 0x4e56 , -0x0 , 0x6364 , 0x636c , 0x0 , -0x4972 , 0x3341 , 0x0 , 0x0 , -0x6367 , 0x0 , 0x0 , 0x4663 , -0x6365 , 0x0 , 0x0 , 0x6d33 , -0x6366 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4933 , 0x0 , 0x4566 , -0x0 , 0x0 , 0x0 , 0x3935 , -0x0 , 0x433b , 0x0 , 0x6363 , -0x453d , 0x4124 , 0x4259 , 0x3257 , -0x0 , 0x636d , 0x3b26 , 0x442d , -0x0 , 0x6370 , 0x3e5a , 0x0 , -0x0 , 0x637b , 0x6375 , 0x3a53 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3750 , 0x534d , 0x0 , 0x564e , -0x5553 , 0x3941 , 0x5534 , 0x5158 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5039 , 0x4776 , 0x0 , 0x0 , -0x0 , 0x482a , 0x3234 , 0x0 , -0x435a , 0x0 , 0x0 , 0x0 , -0x636e , 0x0 , 0x0 , 0x637c , -0x636f , 0x3728 , 0x6377 , 0x6374 , -0x0 , 0x0 , 0x0 , 0x373a , -0x0 , 0x0 , 0x4522 , 0x0 , -0x6376 , 0x455d , 0x3228 , 0x467c , -0x0 , 0x4460 , 0x0 , 0x0 , -0x5722 , 0x0 , 0x4061 , 0x6379 , -0x0 , 0x0 , 0x637a , 0x637d , -0x4c29 , 0x6373 , 0x0 , 0x533e , -0x0 , 0x3143 , 0x6d34 , 0x6371 , -0x6372 , 0x0 , 0x6378 , 0x503a , -0x4643 , 0x5473 , 0x637e , 0x0 , -0x0 , 0x3d60 , 0x0 , 0x0 , -0x6427 , 0x0 , 0x0 , 0x6426 , -0x0 , 0x0 , 0x0 , 0x5173 , -0x6423 , 0x0 , 0x6429 , 0x0 , -0x0 , 0x0 , 0x4877 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4f34 , -0x0 , 0x6428 , 0x642e , 0x4265 , -0x0 , 0x0 , 0x3634 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3d72 , 0x0 , 0x6422 , -0x0 , 0x0 , 0x3a69 , 0x642a , -0x0 , 0x0 , 0x642c , 0x0 , -0x0 , 0x367d , 0x565e , 0x6432 , -0x0 , 0x642d , 0x0 , 0x0 , -0x0 , 0x6421 , 0x0 , 0x3b6e , -0x4d5d , 0x4722 , 0x4549 , 0x0 , -0x0 , 0x4177 , 0x0 , 0x6424 , -0x0 , 0x4733 , 0x3d2c , 0x3d3d , -0x6425 , 0x0 , 0x5747 , 0x3262 , -0x0 , 0x642b , 0x3c43 , 0x642f , -0x0 , 0x3b6b , 0x6430 , 0x4528 , -0x6431 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5563 , 0x3f23 , 0x0 , -0x643a , 0x0 , 0x6437 , 0x0 , -0x643b , 0x0 , 0x0 , 0x643d , -0x0 , 0x0 , 0x4656 , 0x0 , -0x0 , 0x3a46 , 0x404b , 0x0 , -0x0 , 0x0 , 0x3821 , 0x6434 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5421 , 0x0 , 0x0 , 0x3a23 , -0x3d7e , 0x0 , 0x0 , 0x0 , -0x643c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4d3f , 0x0 , -0x0 , 0x4479 , 0x0 , 0x0 , -0x4f7b , 0x4966 , 0x0 , 0x0 , -0x533f , 0x0 , 0x4f51 , 0x0 , -0x0 , 0x6433 , 0x0 , 0x6438 , -0x6439 , 0x4c69 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4c4e , -0x0 , 0x4054 , 0x6435 , 0x4130 , -0x6436 , 0x4e50 , 0x0 , 0x3b41 , -0x3553 , 0x0 , 0x4873 , 0x3d27 , -0x5547 , 0x492c , 0x3822 , 0x644a , -0x0 , 0x0 , 0x644c , 0x5144 , -0x0 , 0x0 , 0x523a , 0x0 , -0x0 , 0x3a2d , 0x0 , 0x0 , -0x3a54 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6443 , -0x356d , 0x0 , 0x0 , 0x0 , -0x574d , 0x6440 , 0x4f7d , 0x643f , -0x0 , 0x0 , 0x0 , 0x415c , -0x4c4a , 0x0 , 0x0 , 0x0 , -0x0 , 0x4a67 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4457 , 0x0 , -0x4c54 , 0x6448 , 0x0 , 0x0 , -0x0 , 0x6447 , 0x6441 , 0x0 , -0x6444 , 0x352d , 0x0 , 0x0 , -0x5359 , 0x0 , 0x6446 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5279 , -0x3463 , 0x0 , 0x3b34 , 0x0 , -0x0 , 0x496e , 0x0 , 0x343e , -0x0 , 0x0 , 0x0 , 0x3b6c , -0x0 , 0x514d , 0x0 , 0x4c6d , -0x6d35 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4765 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5428 , 0x0 , -0x644b , 0x5755 , 0x6442 , 0x0 , -0x3d25 , 0x6445 , 0x0 , 0x0 , -0x5366 , 0x0 , 0x6449 , 0x4978 , -0x0 , 0x0 , 0x643e , 0x0 , -0x0 , 0x5365 , 0x0 , 0x0 , -0x477e , 0x3649 , 0x0 , 0x547c , -0x3233 , 0x6457 , 0x0 , 0x0 , -0x0 , 0x4e42 , 0x0 , 0x644d , -0x0 , 0x4e3c , 0x0 , 0x385b , -0x0 , 0x0 , 0x6456 , 0x0 , -0x3f4a , 0x0 , 0x0 , 0x0 , -0x534e , 0x0 , 0x436c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4548 , -0x6458 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4d44 , 0x644f , 0x0 , -0x0 , 0x0 , 0x0 , 0x6454 , -0x6455 , 0x0 , 0x3a7e , 0x0 , -0x4f66 , 0x0 , 0x0 , 0x553f , -0x0 , 0x0 , 0x0 , 0x6452 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6450 , -0x0 , 0x0 , 0x644e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4d65 , 0x4a2a , -0x0 , 0x0 , 0x0 , 0x4023 , -0x0 , 0x3d26 , 0x6453 , 0x0 , -0x0 , 0x3848 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6467 , -0x5434 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x645b , 0x0 , 0x0 , 0x0 , -0x416f , 0x0 , 0x0 , 0x6469 , -0x0 , 0x0 , 0x5267 , 0x0 , -0x0 , 0x645f , 0x0 , 0x6460 , -0x0 , 0x0 , 0x4f2a , 0x0 , -0x0 , 0x0 , 0x0 , 0x4b5d , -0x0 , 0x645a , 0x6451 , 0x0 , -0x6465 , 0x0 , 0x485c , 0x6463 , -0x0 , 0x0 , 0x4467 , 0x6462 , -0x0 , 0x6461 , 0x0 , 0x0 , -0x0 , 0x337c , 0x6468 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3561 , -0x0 , 0x0 , 0x0 , 0x574c , -0x0 , 0x0 , 0x0 , 0x6466 , -0x0 , 0x3b2c , 0x0 , 0x5752 , -0x4c4f , 0x6b78 , 0x0 , 0x6464 , -0x0 , 0x0 , 0x3976 , 0x0 , -0x0 , 0x0 , 0x564d , 0x6459 , -0x645c , 0x427a , 0x645e , 0x0 , -0x424b , 0x4044 , 0x4250 , 0x0 , -0x3175 , 0x4c32 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x354e , 0x0 , 0x0 , 0x0 , -0x0 , 0x646f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x462f , 0x0 , -0x0 , 0x0 , 0x4661 , 0x0 , -0x0 , 0x6475 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4229 , -0x0 , 0x0 , 0x0 , 0x406c , -0x515d , 0x646e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x442e , 0x0 , 0x0 , 0x0 , -0x646d , 0x0 , 0x0 , 0x0 , -0x0 , 0x6476 , 0x6474 , 0x427e , -0x0 , 0x645d , 0x0 , 0x6470 , -0x0 , 0x4a7e , 0x0 , 0x5544 , -0x0 , 0x0 , 0x6471 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x517a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x646b , 0x646c , -0x0 , 0x0 , 0x0 , 0x6472 , -0x0 , 0x4e2b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x454b , 0x0 , 0x0 , 0x0 , -0x4731 , 0x0 , 0x423a , 0x0 , -0x0 , 0x0 , 0x646a , 0x0 , -0x0 , 0x0 , 0x414a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4c36 , 0x3331 , 0x0 , -0x0 , 0x0 , 0x647b , 0x0 , -0x6473 , 0x0 , 0x0 , 0x0 , -0x647a , 0x0 , 0x647d , 0x0 , -0x647c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x334e , 0x0 , 0x0 , 0x0 , -0x333a , 0x6477 , 0x0 , 0x0 , -0x6479 , 0x6478 , 0x456c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x403d , 0x0 , 0x0 , 0x0 , -0x0 , 0x5468 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6522 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3044 , -0x0 , 0x0 , 0x6524 , 0x0 , -0x0 , 0x6523 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3c24 , 0x0 , 0x6525 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6521 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x647e , 0x3174 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6528 , 0x0 , -0x6529 , 0x6526 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6527 , 0x652a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4659 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x652b , 0x652d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x652c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x652f , 0x0 , 0x0 , -0x0 , 0x652e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3960 , 0x0 , 0x0 , 0x6530 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6531 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3b70 , -0x6c61 , 0x4370 , 0x0 , 0x3546 , -0x3b52 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4169 , 0x546e , 0x0 , -0x3e44 , 0x0 , 0x0 , 0x0 , -0x5746 , 0x0 , 0x5456 , 0x3253 , -0x6c3e , 0x0 , 0x0 , 0x0 , -0x0 , 0x6a41 , 0x0 , 0x0 , -0x0 , 0x422f , 0x3436 , 0x0 , -0x0 , 0x0 , 0x5157 , 0x0 , -0x0 , 0x0 , 0x3334 , 0x0 , -0x4832 , 0x3f3b , 0x6c40 , 0x0 , -0x0 , 0x564b , 0x0 , 0x0 , -0x6c3f , 0x6c41 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6c45 , -0x3e66 , 0x4c3f , 0x455a , 0x3e3c , -0x0 , 0x6c46 , 0x0 , 0x317e , -0x0 , 0x0 , 0x0 , 0x6c44 , -0x5528 , 0x3563 , 0x0 , 0x6c42 , -0x4136 , 0x3363 , 0x0 , 0x0 , -0x6c43 , 0x4b38 , 0x4043 , 0x4c7e , -0x0 , 0x0 , 0x0 , 0x0 , -0x4152 , 0x0 , 0x6c48 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3a66 , 0x4053 , 0x0 , 0x5672 , -0x0 , 0x0 , 0x0 , 0x514c , -0x0 , 0x0 , 0x0 , 0x0 , -0x3f3e , 0x0 , 0x3733 , 0x4955 , -0x6c47 , 0x3b62 , 0x0 , 0x4c4c , -0x3d7d , 0x4848 , 0x0 , 0x4f29 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4d69 , -0x0 , 0x456b , 0x0 , 0x0 , -0x0 , 0x3769 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5149 , 0x3a38 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6c49 , 0x0 , 0x0 , 0x6c4a , -0x0 , 0x3b40 , 0x6c4b , 0x0 , -0x6c62 , 0x313a , 0x3759 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3d39 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6c4c , -0x5166 , 0x6c4d , 0x0 , 0x0 , -0x0 , 0x0 , 0x483b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6c51 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6c53 , 0x0 , -0x3b4d , 0x0 , 0x3c65 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6c4f , 0x0 , 0x4937 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x433a , 0x0 , 0x6c63 , 0x5555 , -0x6c50 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5673 , 0x0 , -0x0 , 0x0 , 0x6c52 , 0x6c4e , -0x0 , 0x0 , 0x0 , 0x0 , -0x6c54 , 0x0 , 0x6c55 , 0x0 , -0x0 , 0x493f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4f28 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x505c , 0x0 , -0x0 , 0x0 , 0x0 , 0x512c , -0x0 , 0x0 , 0x0 , 0x0 , -0x485b , 0x0 , 0x0 , 0x0 , -0x6c56 , 0x4e75 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4a6c , -0x6c5a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6c59 , 0x0 , 0x0 , 0x0 , -0x303e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6c57 , -0x0 , 0x6c58 , 0x0 , 0x0 , -0x0 , 0x6c64 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x483c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4147 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6c5c , 0x5160 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6c5b , 0x0 , 0x0 , 0x0 , -0x0 , 0x546f , 0x0 , 0x6c5d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5b46 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6c5e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x312c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6c5f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6c60 , 0x0 , 0x5726 , 0x0 , -0x4540 , 0x0 , 0x0 , 0x0 , -0x6b3c , 0x302e , 0x0 , 0x0 , -0x0 , 0x3e74 , 0x3838 , 0x522f , -0x3056 , 0x3579 , 0x0 , 0x5833 , -0x0 , 0x4b2c , 0x0 , 0x635d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x462c , -0x3066 , 0x0 , 0x0 , 0x0 , -0x4546 , 0x6b39 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6b3a , 0x0 , -0x0 , 0x0 , 0x6b3b , 0x0 , -0x0 , 0x5140 , 0x0 , 0x4523 , -0x0 , 0x6a72 , 0x0 , 0x4432 , -0x0 , 0x4435 , 0x404e , 0x0 , -0x0 , 0x0 , 0x6a73 , 0x4441 , -0x0 , 0x4e6f , 0x0 , 0x0 , -0x0 , 0x0 , 0x6a70 , 0x6a74 , -0x0 , 0x0 , 0x497c , 0x0 , -0x0 , 0x4723 , 0x0 , 0x0 , -0x0 , 0x4c58 , 0x4e7e , 0x0 , -0x0 , 0x0 , 0x6a75 , 0x6a76 , -0x4f2c , 0x4067 , 0x0 , 0x0 , -0x6a77 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x363f , 0x6a78 , -0x0 , 0x6a79 , 0x0 , 0x6a7a , -0x0 , 0x0 , 0x6a7b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6a71 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x482e , 0x616b , 0x0 , 0x3738 , -0x616c , 0x0 , 0x0 , 0x0 , -0x616d , 0x0 , 0x5734 , 0x616e , -0x616f , 0x534c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6171 , 0x3f71 , 0x6170 , -0x3552 , 0x0 , 0x0 , 0x0 , -0x3137 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6173 , 0x6172 , 0x0 , -0x3a7c , 0x0 , 0x6174 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3937 , -0x0 , 0x3e51 , 0x0 , 0x0 , -0x0 , 0x0 , 0x447c , 0x0 , -0x3a5d , 0x3d46 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6175 , 0x6177 , 0x0 , 0x0 , -0x3640 , 0x4f41 , 0x4a28 , 0x6176 , -0x5578 , 0x537c , 0x6178 , 0x617c , -0x6179 , 0x0 , 0x0 , 0x617a , -0x406a , 0x0 , 0x617e , 0x6221 , -0x4047 , 0x0 , 0x0 , 0x0 , -0x0 , 0x617b , 0x0 , 0x617d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6225 , 0x0 , -0x0 , 0x0 , 0x4154 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6223 , -0x0 , 0x6228 , 0x327e , 0x6222 , -0x0 , 0x0 , 0x0 , 0x434d , -0x3242 , 0x6227 , 0x6226 , 0x0 , -0x0 , 0x6224 , 0x6229 , 0x0 , -0x0 , 0x622b , 0x0 , 0x0 , -0x0 , 0x5049 , 0x566d , 0x4328 , -0x622c , 0x0 , 0x4f57 , 0x0 , -0x0 , 0x622e , 0x0 , 0x0 , -0x3a6f , 0x0 , 0x0 , 0x6960 , -0x622d , 0x622a , 0x0 , 0x0 , -0x0 , 0x0 , 0x3b2b , 0x5433 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6230 , 0x0 , 0x0 , -0x622f , 0x0 , 0x6961 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6231 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6232 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6233 , 0x4c21 , 0x0 , 0x6234 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6235 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x507e , 0x0 , 0x0 , 0x424a , -0x0 , 0x5371 , 0x0 , 0x4d75 , -0x0 , 0x0 , 0x6760 , 0x0 , -0x0 , 0x6761 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3e41 , 0x0 , -0x0 , 0x0 , 0x0 , 0x426a , -0x0 , 0x0 , 0x0 , 0x6764 , -0x0 , 0x0 , 0x6763 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4d66 , 0x0 , 0x4335 , -0x0 , 0x0 , 0x6762 , 0x3b37 , -0x4f56 , 0x0 , 0x4161 , 0x6769 , -0x0 , 0x0 , 0x0 , 0x6768 , -0x0 , 0x0 , 0x6774 , 0x3223 , -0x0 , 0x0 , 0x0 , 0x0 , -0x676a , 0x0 , 0x6766 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x676c , 0x676b , 0x493a , 0x0 , -0x0 , 0x5564 , 0x0 , 0x6765 , -0x3729 , 0x6767 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x676e , 0x0 , 0x0 , -0x0 , 0x0 , 0x6773 , 0x0 , -0x5669 , 0x0 , 0x0 , 0x0 , -0x0 , 0x676d , 0x0 , 0x6772 , -0x0 , 0x6771 , 0x0 , 0x0 , -0x0 , 0x3060 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6775 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4772 , -0x0 , 0x4045 , 0x406d , 0x0 , -0x0 , 0x4170 , 0x6770 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6776 , -0x4b76 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6822 , 0x6821 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5741 , 0x0 , -0x0 , 0x677a , 0x6779 , 0x0 , -0x677b , 0x0 , 0x6777 , 0x0 , -0x677e , 0x0 , 0x677d , 0x0 , -0x677c , 0x0 , 0x0 , 0x4155 , -0x4759 , 0x457d , 0x4543 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x476d , 0x0 , 0x0 , 0x0 , -0x0 , 0x6823 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6826 , 0x0 , 0x6825 , -0x0 , 0x6827 , 0x3a77 , 0x6778 , -0x6824 , 0x0 , 0x4870 , 0x492a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6829 , 0x0 , 0x0 , -0x3965 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x517e , 0x6828 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x682a , 0x0 , -0x682d , 0x682e , 0x0 , 0x4127 , -0x0 , 0x0 , 0x0 , 0x682f , -0x0 , 0x0 , 0x0 , 0x6830 , -0x0 , 0x0 , 0x682c , 0x0 , -0x6834 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x682b , 0x0 , 0x6831 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6835 , -0x6832 , 0x6833 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6837 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6836 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x394f , 0x0 , 0x702c , 0x0 , -0x702d , 0x0 , 0x4630 , 0x306a , -0x483f , 0x0 , 0x4d5f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4e4d , 0x6a31 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6a32 , 0x0 , 0x463f , 0x3449 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6a33 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5567 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5d79 , 0x0 , 0x6a34 , -0x0 , 0x6a35 , 0x0 , 0x6a36 , -0x0 , 0x0 , 0x0 , 0x0 , -0x384a , 0x5f30 , 0x4975 , 0x0 , -0x4c70 , 0x0 , 0x0 , 0x497a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x497b , 0x0 , 0x0 , -0x5343 , 0x4b26 , 0x0 , 0x3826 , -0x702e , 0x3142 , 0x0 , 0x6538 , -0x4c6f , 0x5349 , 0x3c57 , 0x496a , -0x0 , 0x3567 , 0x0 , 0x4450 , -0x3569 , 0x0 , 0x6e2e , 0x3b2d , -0x0 , 0x0 , 0x675e , 0x0 , -0x6e2f , 0x0 , 0x0 , 0x0 , -0x0 , 0x3329 , 0x0 , 0x0 , -0x6e32 , 0x0 , 0x0 , 0x6e31 , -0x3d67 , 0x0 , 0x6e30 , 0x4e37 , -0x0 , 0x0 , 0x0 , 0x0 , -0x454f , 0x0 , 0x0 , 0x0 , -0x0 , 0x4174 , 0x5b4e , 0x6e33 , -0x5073 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4254 , 0x4668 , 0x0 , -0x0 , 0x0 , 0x372c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6e34 , 0x0 , -0x336b , 0x0 , 0x0 , 0x0 , -0x3b7b , 0x6e35 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x675c , -0x0 , 0x0 , 0x0 , 0x6e36 , -0x0 , 0x0 , 0x3d2e , 0x0 , -0x0 , 0x0 , 0x0 , 0x7162 , -0x0 , 0x0 , 0x0 , 0x4a68 , -0x0 , 0x5249 , 0x705a , 0x0 , -0x705b , 0x0 , 0x705c , 0x4146 , -0x0 , 0x386d , 0x3e4e , 0x0 , -0x0 , 0x705e , 0x0 , 0x4531 , -0x705d , 0x5171 , 0x0 , 0x7060 , -0x304c , 0x3d6a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x525f , -0x705f , 0x0 , 0x342f , 0x3768 , -0x7066 , 0x7065 , 0x4623 , 0x7061 , -0x7062 , 0x3443 , 0x0 , 0x0 , -0x7063 , 0x556e , 0x0 , 0x0 , -0x4c5b , 0x3e52 , 0x3c32 , 0x0 , -0x0 , 0x0 , 0x7068 , 0x7067 , -0x7064 , 0x3221 , 0x0 , 0x5622 , -0x5338 , 0x3e37 , 0x482c , 0x0 , -0x0 , 0x706a , 0x0 , 0x0 , -0x0 , 0x0 , 0x5177 , 0x0 , -0x564c , 0x3a5b , 0x7069 , 0x0 , -0x363b , 0x0 , 0x0 , 0x4d34 , -0x0 , 0x0 , 0x4626 , 0x0 , -0x0 , 0x0 , 0x4121 , 0x706b , -0x706e , 0x0 , 0x706d , 0x7070 , -0x706c , 0x0 , 0x3b3e , 0x706f , -0x0 , 0x0 , 0x0 , 0x0 , -0x4c35 , 0x7072 , 0x0 , 0x0 , -0x3355 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3154 , 0x0 , 0x0 , -0x7073 , 0x0 , 0x0 , 0x7074 , -0x7076 , 0x3461 , 0x0 , 0x7071 , -0x0 , 0x7077 , 0x0 , 0x0 , -0x0 , 0x0 , 0x707a , 0x0 , -0x7078 , 0x0 , 0x0 , 0x0 , -0x7075 , 0x0 , 0x0 , 0x0 , -0x0 , 0x707d , 0x0 , 0x7079 , -0x707c , 0x707e , 0x0 , 0x7121 , -0x0 , 0x0 , 0x0 , 0x4e41 , -0x7124 , 0x0 , 0x7123 , 0x0 , -0x4176 , 0x707b , 0x4a5d , 0x0 , -0x0 , 0x3471 , 0x3171 , 0x4c31 , -0x0 , 0x7126 , 0x0 , 0x0 , -0x7127 , 0x0 , 0x0 , 0x712c , -0x554e , 0x7129 , 0x0 , 0x0 , -0x4833 , 0x0 , 0x0 , 0x0 , -0x7122 , 0x0 , 0x712b , 0x7128 , -0x7125 , 0x0 , 0x0 , 0x712a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3029 , 0x712d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x712f , 0x0 , 0x7131 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7130 , 0x0 , 0x712e , 0x0 , -0x0 , 0x0 , 0x0 , 0x5122 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7132 , -0x0 , 0x0 , 0x0 , 0x7133 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x396f , 0x0 , 0x0 , 0x3547 , -0x0 , 0x3057 , 0x3059 , 0x0 , -0x0 , 0x0 , 0x546d , 0x0 , -0x3544 , 0x0 , 0x3d54 , 0x3b4a , -0x7027 , 0x0 , 0x0 , 0x385e , -0x0 , 0x0 , 0x7028 , 0x0 , -0x0 , 0x3028 , 0x0 , 0x7029 , -0x0 , 0x0 , 0x4d6e , 0x0 , -0x0 , 0x702a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x702b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4624 , 0x0 , -0x0 , 0x5665 , 0x7164 , 0x0 , -0x7165 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4373 , -0x0 , 0x0 , 0x535b , 0x0 , -0x0 , 0x5651 , 0x4568 , 0x0 , -0x532f , 0x0 , 0x5266 , 0x0 , -0x0 , 0x6e41 , 0x303b , 0x5535 , -0x514e , 0x3c60 , 0x3a50 , 0x0 , -0x3f78 , 0x0 , 0x3847 , 0x3541 , -0x454c , 0x0 , 0x0 , 0x4a22 , -0x0 , 0x0 , 0x0 , 0x434b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6e42 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x443f , 0x3622 , -0x0 , 0x6d6c , 0x4324 , 0x0 , -0x5631 , 0x0 , 0x0 , 0x0 , -0x4f60 , 0x6d6f , 0x0 , 0x0 , -0x454e , 0x0 , 0x365c , 0x0 , -0x0 , 0x4a21 , 0x0 , 0x0 , -0x6d6d , 0x0 , 0x0 , 0x6d70 , -0x6d71 , 0x433c , 0x0 , 0x3f34 , -0x0 , 0x6d6e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d74 , 0x6d72 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5566 , -0x435f , 0x0 , 0x6d73 , 0x0 , -0x0 , 0x0 , 0x6d76 , 0x0 , -0x5523 , 0x5123 , 0x0 , 0x0 , -0x0 , 0x6d75 , 0x0 , 0x4350 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d77 , 0x3f74 , 0x3e6c , -0x6d78 , 0x0 , 0x4c77 , 0x0 , -0x515b , 0x0 , 0x0 , 0x0 , -0x5745 , 0x5576 , 0x0 , 0x6d7c , -0x0 , 0x0 , 0x0 , 0x6d7b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6d79 , 0x6d7a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6d7d , 0x3e26 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4b2f , 0x6e21 , 0x363d , -0x0 , 0x6e22 , 0x4440 , 0x0 , -0x6d7e , 0x0 , 0x0 , 0x3d5e , -0x3247 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3643 , 0x0 , 0x0 , -0x0 , 0x6e25 , 0x583a , 0x6e23 , -0x6e26 , 0x0 , 0x0 , 0x0 , -0x4369 , 0x3372 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6e27 , 0x6e24 , 0x4f39 , 0x0 , -0x0 , 0x6e28 , 0x4277 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6e29 , -0x6e2a , 0x0 , 0x5e2b , 0x0 , -0x0 , 0x4633 , 0x0 , 0x4746 , -0x0 , 0x5675 , 0x3549 , 0x0 , -0x4b32 , 0x0 , 0x0 , 0x0 , -0x6e2b , 0x0 , 0x0 , 0x4d2b , -0x0 , 0x6e2c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5530 , -0x0 , 0x6e2d , 0x0 , 0x7644 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5b47 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3423 , -0x0 , 0x0 , 0x0 , 0x432c , -0x7166 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4a38 , 0x5253 , -0x0 , 0x562a , 0x0 , 0x6f72 , -0x0 , 0x3e58 , 0x0 , 0x3d43 , -0x6f73 , 0x364c , 0x302b , 0x0 , -0x0 , 0x0 , 0x0 , 0x4a2f , -0x0 , 0x0 , 0x6d36 , 0x0 , -0x6d37 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4e79 , 0x372f , 0x3f73 , -0x6d38 , 0x426b , 0x4930 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d39 , 0x0 , 0x0 , -0x4676 , 0x3f33 , 0x0 , 0x0 , -0x0 , 0x6d3c , 0x4578 , 0x0 , -0x5150 , 0x0 , 0x5729 , 0x6d3a , -0x6d3b , 0x0 , 0x5162 , 0x0 , -0x6d3f , 0x6d40 , 0x0 , 0x6d44 , -0x0 , 0x0 , 0x0 , 0x6d48 , -0x0 , 0x6d46 , 0x6d4e , 0x5568 , -0x0 , 0x6d49 , 0x0 , 0x0 , -0x6d47 , 0x6d3e , 0x0 , 0x0 , -0x4569 , 0x0 , 0x0 , 0x0 , -0x4646 , 0x0 , 0x0 , 0x4969 , -0x5452 , 0x6d41 , 0x6d42 , 0x6d43 , -0x6d45 , 0x0 , 0x4079 , 0x0 , -0x3421 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3968 , 0x0 , 0x6d50 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6d51 , 0x0 , 0x6d4a , 0x0 , -0x6d4f , 0x0 , 0x4e78 , 0x0 , -0x0 , 0x4b36 , 0x6d4c , 0x6d4d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4f75 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6d52 , 0x4172 , -0x5332 , 0x6d4b , 0x4837 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3c6f , -0x0 , 0x0 , 0x0 , 0x0 , -0x4570 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6d56 , -0x0 , 0x356f , 0x0 , 0x0 , -0x4235 , 0x302d , 0x4b69 , 0x0 , -0x0 , 0x312e , 0x0 , 0x6d54 , -0x0 , 0x0 , 0x0 , 0x4d6b , -0x3562 , 0x0 , 0x6d55 , 0x6d53 , -0x6d57 , 0x0 , 0x0 , 0x357a , -0x0 , 0x6d58 , 0x0 , 0x6d59 , -0x0 , 0x6d5c , 0x0 , 0x314c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4576 , 0x3c6e , 0x6d5a , 0x4c3c , -0x326a , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d5b , 0x0 , 0x0 , -0x0 , 0x0 , 0x446b , 0x0 , -0x0 , 0x3445 , 0x0 , 0x0 , -0x0 , 0x3075 , 0x0 , 0x0 , -0x0 , 0x6d5f , 0x405a , 0x3468 , -0x0 , 0x0 , 0x0 , 0x0 , -0x454d , 0x0 , 0x0 , 0x0 , -0x6d5d , 0x3f44 , 0x0 , 0x0 , -0x0 , 0x6d5e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4425 , 0x0 , 0x0 , 0x0 , -0x6d60 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6d61 , 0x0 , -0x6d63 , 0x0 , 0x0 , 0x4157 , -0x0 , 0x0 , 0x3b47 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3d38 , 0x0 , 0x0 , -0x0 , 0x6d62 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6d64 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6d66 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6d65 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6d67 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4a3e , 0x6c6a , -0x4071 , 0x0 , 0x4967 , 0x0 , -0x6c6b , 0x466e , 0x0 , 0x0 , -0x0 , 0x0 , 0x6c6c , 0x0 , -0x466d , 0x6c6d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6c70 , -0x0 , 0x0 , 0x5766 , 0x6c73 , -0x0 , 0x0 , 0x6c71 , 0x6c6e , -0x6c6f , 0x5723 , 0x4971 , 0x4b6e , -0x6c74 , 0x0 , 0x6c72 , 0x0 , -0x0 , 0x4f69 , 0x0 , 0x6c76 , -0x4631 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3c40 , 0x0 , 0x6c75 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x353b , -0x3b76 , 0x0 , 0x6c77 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5977 , 0x3d7b , 0x0 , 0x0 , -0x423b , 0x6c78 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6c79 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3823 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6c7a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6c7b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6c7c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x536d , 0x582e , 0x406b , -0x0 , 0x475d , 0x3a4c , 0x0 , -0x5063 , 0x4b3d , 0x0 , 0x4d3a , -0x0 , 0x0 , 0x3851 , 0x0 , -0x0 , 0x317c , 0x0 , 0x476f , -0x0 , 0x5656 , 0x0 , 0x0 , -0x0 , 0x3f46 , 0x436b , 0x0 , -0x0 , 0x6f75 , 0x0 , 0x0 , -0x4358 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5762 , -0x0 , 0x0 , 0x0 , 0x6f77 , -0x3353 , 0x0 , 0x4758 , 0x516d , -0x0 , 0x5648 , 0x0 , 0x6f78 , -0x0 , 0x6f76 , 0x0 , 0x3b7d , -0x3346 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3d55 , 0x0 , 0x0 , 0x5246 , -0x0 , 0x3b60 , 0x0 , 0x0 , -0x4f21 , 0x0 , 0x6f7c , 0x6f7b , -0x0 , 0x0 , 0x6f79 , 0x0 , -0x0 , 0x0 , 0x0 , 0x334c , -0x0 , 0x4954 , 0x4b30 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6f7e , 0x0 , 0x0 , 0x305e , -0x0 , 0x0 , 0x5649 , 0x0 , -0x0 , 0x0 , 0x6f7d , 0x0 , -0x336d , 0x0 , 0x0 , 0x7655 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4e48 , -0x0 , 0x0 , 0x0 , 0x7022 , -0x0 , 0x7021 , 0x0 , 0x353e , -0x3c5a , 0x3b7c , 0x0 , 0x3865 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4442 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7023 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4b6b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7026 , 0x0 , 0x0 , 0x0 , -0x5128 , 0x0 , 0x3e3f , 0x476e , -0x7136 , 0x7137 , 0x3f55 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3429 , -0x7138 , 0x4d3b , 0x0 , 0x4754 , -0x552d , 0x0 , 0x7139 , 0x0 , -0x713a , 0x0 , 0x0 , 0x0 , -0x0 , 0x474f , 0x0 , 0x0 , -0x0 , 0x5224 , 0x564f , 0x0 , -0x0 , 0x713b , 0x3d51 , 0x3430 , -0x3e3d , 0x0 , 0x0 , 0x0 , -0x345c , 0x4e51 , 0x0 , 0x3f5f , -0x713d , 0x0 , 0x0 , 0x0 , -0x0 , 0x3f7a , 0x713c , 0x0 , -0x713f , 0x0 , 0x0 , 0x0 , -0x713e , 0x7140 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7141 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x417e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4122 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4a7a , 0x0 , -0x0 , 0x553e , 0x0 , 0x0 , -0x0 , 0x0 , 0x3e3a , 0x3e39 , -0x5542 , 0x0 , 0x0 , 0x3f22 , -0x0 , 0x4d2f , 0x7135 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3d5f , 0x0 , 0x364b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5671 , 0x7343 , 0x0 , -0x0 , 0x7344 , 0x0 , 0x384d , -0x0 , 0x0 , 0x0 , 0x7346 , -0x7347 , 0x0 , 0x304a , 0x0 , -0x7345 , 0x0 , 0x7349 , 0x4b71 , -0x0 , 0x0 , 0x0 , 0x734b , -0x0 , 0x5026 , 0x0 , 0x0 , -0x314a , 0x7348 , 0x0 , 0x0 , -0x0 , 0x734f , 0x0 , 0x3551 , -0x0 , 0x0 , 0x7357 , 0x0 , -0x7352 , 0x0 , 0x0 , 0x0 , -0x7354 , 0x7353 , 0x377b , 0x0 , -0x313f , 0x0 , 0x734e , 0x734a , -0x355a , 0x0 , 0x7350 , 0x0 , -0x0 , 0x7351 , 0x0 , 0x7355 , -0x0 , 0x0 , 0x0 , 0x0 , -0x734d , 0x0 , 0x3c63 , 0x0 , -0x417d , 0x0 , 0x7356 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x735a , 0x0 , 0x734c , -0x0 , 0x3548 , 0x0 , 0x3d6e , -0x735c , 0x0 , 0x0 , 0x3724 , -0x3f70 , 0x567e , 0x4d32 , 0x0 , -0x3470 , 0x0 , 0x325f , 0x0 , -0x7358 , 0x0 , 0x7359 , 0x4938 , -0x0 , 0x735d , 0x0 , 0x0 , -0x735e , 0x0 , 0x7361 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x735f , 0x0 , -0x0 , 0x7363 , 0x7362 , 0x0 , -0x0 , 0x735b , 0x0 , 0x3f6a , -0x0 , 0x336f , 0x0 , 0x7360 , -0x0 , 0x0 , 0x4729 , 0x0 , -0x3c72 , 0x0 , 0x0 , 0x0 , -0x0 , 0x736b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x393f , 0x0 , 0x0 , -0x7364 , 0x0 , 0x0 , 0x0 , -0x322d , 0x3b7e , 0x0 , 0x4b63 , -0x0 , 0x0 , 0x0 , 0x0 , -0x736d , 0x7369 , 0x0 , 0x0 , -0x0 , 0x395c , 0x736e , 0x0 , -0x0 , 0x0 , 0x7365 , 0x7366 , -0x736a , 0x4261 , 0x736c , 0x736f , -0x7368 , 0x3c7d , 0x0 , 0x0 , -0x0 , 0x4f64 , 0x0 , 0x0 , -0x7370 , 0x0 , 0x0 , 0x0 , -0x7367 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7372 , 0x0 , 0x0 , -0x0 , 0x0 , 0x572d , 0x462a , -0x0 , 0x0 , 0x0 , 0x0 , -0x7373 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7371 , 0x0 , 0x4228 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x385d , 0x7375 , 0x0 , -0x0 , 0x7374 , 0x0 , 0x0 , -0x0 , 0x345b , 0x0 , 0x0 , -0x0 , 0x7376 , 0x7377 , 0x0 , -0x0 , 0x0 , 0x7378 , 0x0 , -0x0 , 0x0 , 0x403a , 0x0 , -0x0 , 0x4069 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4571 , -0x0 , 0x0 , 0x0 , 0x0 , -0x737b , 0x0 , 0x737a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3458 , -0x0 , 0x0 , 0x0 , 0x737e , -0x7379 , 0x0 , 0x0 , 0x737c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x737d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7421 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7423 , 0x3b49 , -0x0 , 0x0 , 0x7422 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7424 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x323e , -0x7426 , 0x7425 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3c2e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4357 , -0x5961 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4060 , -0x744c , 0x5751 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x375b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x744e , 0x4123 , 0x0 , -0x0 , 0x4649 , 0x0 , 0x3456 , -0x5533 , 0x0 , 0x0 , 0x0 , -0x7450 , 0x744f , 0x7451 , 0x4b5a , -0x0 , 0x0 , 0x7452 , 0x0 , -0x5441 , 0x5660 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3760 , 0x0 , -0x0 , 0x0 , 0x4138 , 0x0 , -0x0 , 0x413b , 0x7453 , 0x3e2c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3462 , 0x0 , 0x0 , -0x7454 , 0x7455 , 0x3e2b , 0x0 , -0x0 , 0x7456 , 0x0 , 0x0 , -0x0 , 0x745b , 0x0 , 0x7457 , -0x745a , 0x0 , 0x3a7d , 0x0 , -0x7458 , 0x7459 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3862 , 0x4c47 , 0x745c , -0x0 , 0x325a , 0x0 , 0x0 , -0x4353 , 0x0 , 0x0 , 0x5463 , -0x3f37 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x745d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4534 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7469 , 0x0 , 0x0 , 0x4f35 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4e49 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4b58 , 0x0 , 0x4b77 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3d74 , -0x0 , 0x0 , 0x0 , 0x574f , -0x0 , 0x0 , 0x0 , 0x405b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5075 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x746a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x746b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x746c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7763 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3731 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x746d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x576b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x746e , -0x0 , 0x0 , 0x0 , 0x6679 , -0x3e40 , 0x667a , 0x3a6c , 0x667b , -0x4f4b , 0x667c , 0x543c , 0x3c36 , -0x667d , 0x667e , 0x3c4d , 0x4852 , -0x4e33 , 0x6721 , 0x0 , 0x343f , -0x6722 , 0x4934 , 0x3859 , 0x4449 , -0x0 , 0x575d , 0x425a , 0x3757 , -0x563d , 0x4e46 , 0x3744 , 0x0 , -0x0 , 0x4526 , 0x6723 , 0x4f5f , -0x6724 , 0x6725 , 0x6726 , 0x4137 , -0x5769 , 0x4970 , 0x4f38 , 0x562f , -0x5655 , 0x6727 , 0x306d , 0x6728 , -0x6729 , 0x495c , 0x526f , 0x3e2d , -0x672a , 0x3073 , 0x485e , 0x3d61 , -0x672b , 0x4846 , 0x0 , 0x672c , -0x3b66 , 0x3878 , 0x5124 , 0x672d , -0x4267 , 0x3e78 , 0x3d4a , 0x4d33 , -0x672e , 0x672f , 0x3e6e , 0x5065 , -0x0 , 0x4b67 , 0x4c50 , 0x3c4c , -0x6730 , 0x3c28 , 0x5077 , 0x6731 , -0x0 , 0x5078 , 0x6732 , 0x6733 , -0x3442 , 0x6734 , 0x6735 , 0x497e , -0x4e2c , 0x4360 , 0x6737 , 0x3141 , -0x3371 , 0x0 , 0x6738 , 0x6739 , -0x575b , 0x5540 , 0x673a , 0x424c , -0x573a , 0x673b , 0x673c , 0x673d , -0x3c6a , 0x4365 , 0x4042 , 0x673e , -0x673f , 0x3c29 , 0x0 , 0x6740 , -0x6741 , 0x6736 , 0x3650 , 0x6742 , -0x0 , 0x6743 , 0x6744 , 0x3b3a , -0x355e , 0x4246 , 0x3160 , 0x6745 , -0x5435 , 0x6746 , 0x383f , 0x6748 , -0x6747 , 0x376c , 0x0 , 0x6749 , -0x3278 , 0x674a , 0x674b , 0x674c , -0x674d , 0x674e , 0x674f , 0x6750 , -0x5327 , 0x4b75 , 0x6751 , 0x6752 , -0x6753 , 0x6754 , 0x4949 , 0x6755 , -0x6756 , 0x6757 , 0x6758 , 0x6759 , -0x3d49 , 0x675a , 0x733e , 0x0 , -0x3857 , 0x0 , 0x4831 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x733f , 0x0 , -0x7340 , 0x7341 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x395e , 0x4d78 , 0x0 , 0x0 , -0x5868 , 0x3a31 , 0x0 , 0x425e , -0x6e37 , 0x0 , 0x3723 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6e39 , -0x0 , 0x6e38 , 0x3055 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6e3b , 0x5556 , 0x576f , 0x0 , -0x0 , 0x0 , 0x5643 , 0x0 , -0x0 , 0x6e3d , 0x4a70 , 0x0 , -0x6e3c , 0x0 , 0x0 , 0x0 , -0x0 , 0x6e3e , 0x0 , 0x0 , -0x0 , 0x0 , 0x6e40 , 0x0 , -0x0 , 0x6e3f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5172 , 0x0 , -0x473c , 0x0 , 0x4340 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3861 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4167 , 0x0 , -0x0 , 0x7446 , 0x505f , 0x7447 , -0x0 , 0x4f5b , 0x0 , 0x0 , -0x483a , 0x0 , 0x0 , 0x7448 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7449 , -0x744a , 0x0 , 0x744b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x597a , 0x387e , 0x0 , 0x0 , -0x6571 , 0x5370 , 0x0 , 0x7460 , -0x0 , 0x4e4c , 0x0 , 0x0 , -0x0 , 0x3361 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7134 , 0x0 , -0x526e , 0x0 , 0x7461 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4f68 , 0x7462 , 0x0 , 0x0 , -0x474c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3554 , -0x3464 , 0x7464 , 0x0 , 0x0 , -0x0 , 0x7463 , 0x7465 , 0x0 , -0x0 , 0x7466 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7467 , 0x0 , -0x3a32 , 0x303f , 0x0 , 0x7468 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x372d , -0x526d , 0x0 , 0x0 , 0x0 , -0x522b , 0x404f , 0x0 , 0x3f3c , -0x6b23 , 0x555f , 0x6a48 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7173 , -0x3678 , 0x4b23 , 0x0 , 0x0 , -0x444d , 0x0 , 0x7167 , 0x0 , -0x7168 , 0x387b , 0x7169 , 0x3a44 , -0x5445 , 0x3052 , 0x0 , 0x0 , -0x716a , 0x0 , 0x0 , 0x0 , -0x716b , 0x0 , 0x716c , 0x0 , -0x0 , 0x716d , 0x716e , 0x716f , -0x7171 , 0x7170 , 0x4555 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7172 , 0x0 , 0x367a , -0x0 , 0x7174 , 0x522e , 0x5e47 , -0x4b4a , 0x0 , 0x0 , 0x335c , -0x0 , 0x3522 , 0x0 , 0x3922 , -0x0 , 0x0 , 0x4474 , 0x7175 , -0x0 , 0x0 , 0x7176 , 0x0 , -0x0 , 0x0 , 0x4144 , 0x417b , -0x5630 , 0x7177 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7178 , 0x0 , -0x412a , 0x0 , 0x0 , 0x0 , -0x4638 , 0x0 , 0x3e5b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7179 , 0x344f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x717a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6d32 , -0x6d31 , 0x0 , 0x0 , 0x4b60 , -0x525e , 0x0 , 0x4b41 , 0x5558 , -0x0 , 0x4862 , 0x0 , 0x405f , -0x3c21 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6b41 , -0x0 , 0x0 , 0x5024 , 0x0 , -0x5662 , 0x0 , 0x3647 , 0x3858 , -0x6b40 , 0x384e , 0x0 , 0x6b3f , -0x3326 , 0x3949 , 0x562b , 0x0 , -0x3774 , 0x374a , 0x0 , 0x0 , -0x0 , 0x3c67 , 0x373e , 0x6b46 , -0x0 , 0x6b47 , 0x3039 , 0x3f4f , -0x0 , 0x6b45 , 0x537d , 0x0 , -0x6b48 , 0x0 , 0x0 , 0x6b49 , -0x0 , 0x0 , 0x374e , 0x0 , -0x6b42 , 0x6b44 , 0x4976 , 0x5657 , -0x554d , 0x5032 , 0x6b4f , 0x4e38 , -0x6b50 , 0x0 , 0x3528 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3133 , 0x6b52 , 0x4c25 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4556 , 0x6b53 , -0x0 , 0x6b51 , 0x455f , 0x6b4e , -0x4a24 , 0x6b55 , 0x307b , 0x0 , -0x0 , 0x3a7a , 0x0 , 0x0 , -0x5837 , 0x7163 , 0x0 , 0x6b4a , -0x6b4b , 0x6b4c , 0x6b4d , 0x6b56 , -0x6640 , 0x6b59 , 0x0 , 0x3f68 , -0x5248 , 0x6b57 , 0x6b5c , 0x386c , -0x6b58 , 0x0 , 0x3d3a , 0x0 , -0x5058 , 0x0 , 0x3037 , 0x0 , -0x6b5d , 0x445c , 0x0 , 0x0 , -0x0 , 0x0 , 0x562c , 0x0 , -0x0 , 0x0 , 0x3460 , 0x0 , -0x0 , 0x4276 , 0x3c39 , 0x0 , -0x0 , 0x6b5a , 0x6b5b , 0x5460 , -0x466a , 0x4454 , 0x6b5f , 0x4527 , -0x5975 , 0x0 , 0x3231 , 0x0 , -0x6b64 , 0x0 , 0x3d45 , 0x0 , -0x0 , 0x0 , 0x6b62 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6b63 , 0x0 , 0x0 , 0x382c , -0x0 , 0x4d51 , 0x6b65 , 0x0 , -0x0 , 0x0 , 0x6b61 , 0x0 , -0x4133 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4622 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4c73 , 0x0 , -0x6b66 , 0x0 , 0x4030 , 0x5238 , -0x6b67 , 0x0 , 0x0 , 0x0 , -0x382f , 0x382d , 0x0 , 0x6b68 , -0x473b , 0x4d73 , 0x0 , 0x0 , -0x0 , 0x6b6a , 0x6b6b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6b6d , 0x0 , 0x0 , 0x0 , -0x0 , 0x5048 , 0x0 , 0x6b72 , -0x0 , 0x6b6e , 0x0 , 0x0 , -0x0 , 0x6b71 , 0x4879 , 0x0 , -0x517c , 0x6b6c , 0x0 , 0x0 , -0x6b69 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3839 , 0x4f59 , 0x4465 , -0x6b6f , 0x6b70 , 0x4c5a , 0x4d48 , -0x3072 , 0x0 , 0x6b76 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6b75 , 0x0 , 0x3232 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3860 , -0x0 , 0x6b77 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x316c , 0x0 , 0x0 , 0x4c45 , -0x4424 , 0x4f25 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6b79 , -0x0 , 0x0 , 0x6c22 , 0x0 , -0x4572 , 0x0 , 0x6b7a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4945 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x625f , 0x6b7e , -0x0 , 0x0 , 0x0 , 0x0 , -0x4d4e , 0x6c21 , 0x315b , 0x5337 , -0x0 , 0x0 , 0x525c , 0x0 , -0x0 , 0x0 , 0x6b7d , 0x0 , -0x6b7b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x333c , -0x0 , 0x0 , 0x0 , 0x6a30 , -0x0 , 0x0 , 0x5754 , 0x0 , -0x742b , 0x3374 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5641 , -0x5642 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5569 , -0x3e4a , 0x0 , 0x7427 , 0x0 , -0x5228 , 0x7428 , 0x7429 , 0x0 , -0x742a , 0x3e4b , 0x535f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4960 , 0x4961 , 0x0 , 0x0 , -0x7342 , 0x0 , 0x4a66 , 0x0 , -0x4c72 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6236 , -0x4b34 , 0x0 , 0x4e68 , 0x565b , -0x0 , 0x742d , 0x742e , 0x742f , -0x0 , 0x0 , 0x0 , 0x0 , -0x7432 , 0x0 , 0x3a3d , 0x7433 , -0x3063 , 0x7430 , 0x0 , 0x7431 , -0x3d22 , 0x3255 , 0x0 , 0x7436 , -0x7437 , 0x3666 , 0x3230 , 0x4f4f , -0x7434 , 0x342c , 0x0 , 0x7435 , -0x0 , 0x0 , 0x7438 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7439 , 0x0 , 0x0 , 0x4d27 , -0x0 , 0x743a , 0x0 , 0x743b , -0x0 , 0x0 , 0x0 , 0x743c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4b52 , 0x0 , 0x743d , 0x0 , -0x0 , 0x0 , 0x0 , 0x743e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x743f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x745e , 0x413c , -0x3c68 , 0x0 , 0x492b , 0x515e , -0x6575 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5c33 , 0x5255 , 0x0 , -0x0 , 0x5c34 , 0x302c , 0x5c35 , -0x0 , 0x0 , 0x3d5a , 0x0 , -0x5c39 , 0x0 , 0x0 , 0x0 , -0x5842 , 0x0 , 0x5c37 , 0x5373 , -0x0 , 0x4956 , 0x5c3a , 0x5c36 , -0x0 , 0x5c3b , 0x4322 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5c3c , -0x5c45 , 0x5c3d , 0x0 , 0x0 , -0x4e5f , 0x5625 , 0x0 , 0x5c4f , -0x0 , 0x5c4d , 0x0 , 0x0 , -0x5c52 , 0x3d66 , 0x422b , 0x0 , -0x5c38 , 0x5c4b , 0x5c4e , 0x5c3e , -0x3752 , 0x3045 , 0x5c47 , 0x503e , -0x5c41 , 0x3b28 , 0x0 , 0x373c , -0x5c4c , 0x0 , 0x0 , 0x5c46 , -0x5c3f , 0x475b , 0x0 , 0x0 , -0x0 , 0x513f , 0x5c40 , 0x0 , -0x0 , 0x5c4a , 0x0 , 0x0 , -0x5c50 , 0x0 , 0x0 , 0x4e2d , -0x5c42 , 0x0 , 0x5c43 , 0x5c48 , -0x5c49 , 0x3254 , 0x5c51 , 0x4b55 , -0x0 , 0x5437 , 0x5c5b , 0x5c5f , -0x4c26 , 0x5c66 , 0x0 , 0x4367 , -0x5c5c , 0x0 , 0x0 , 0x3f41 , -0x5c59 , 0x0 , 0x307a , 0x3936 , -0x5c65 , 0x5c53 , 0x0 , 0x5c44 , -0x5c56 , 0x4874 , 0x3f60 , 0x0 , -0x0 , 0x0 , 0x0 , 0x493b , -0x0 , 0x0 , 0x0 , 0x313d , -0x0 , 0x5322 , 0x0 , 0x0 , -0x5c5a , 0x0 , 0x0 , 0x5c55 , -0x0 , 0x463b , 0x0 , 0x5c5e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5742 , 0x432f , 0x3736 , -0x4751 , 0x4329 , 0x5c62 , 0x5c58 , -0x5c6b , 0x5c54 , 0x0 , 0x0 , -0x5c5d , 0x0 , 0x3e25 , 0x5c57 , -0x0 , 0x5c60 , 0x0 , 0x0 , -0x5c63 , 0x5c64 , 0x0 , 0x5c78 , -0x0 , 0x0 , 0x5c61 , 0x5d22 , -0x5c67 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3c6b , -0x3444 , 0x0 , 0x0 , 0x4323 , -0x3267 , 0x5c7a , 0x0 , 0x5c72 , -0x0 , 0x5c6f , 0x0 , 0x5c7c , -0x5c6e , 0x5270 , 0x3268 , 0x0 , -0x4857 , 0x4863 , 0x5c7b , 0x0 , -0x5c6d , 0x0 , 0x0 , 0x0 , -0x5c77 , 0x0 , 0x0 , 0x5c75 , -0x0 , 0x0 , 0x3e23 , 0x5c74 , -0x0 , 0x325d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5c73 , -0x3c76 , 0x5c68 , 0x3b44 , 0x0 , -0x4073 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3c54 , 0x5c69 , -0x5c6a , 0x0 , 0x5c71 , 0x5c76 , -0x5c79 , 0x3534 , 0x0 , 0x4859 , -0x3b67 , 0x5c7e , 0x5c7d , 0x532b , -0x5d21 , 0x5d23 , 0x5d25 , 0x5271 , -0x5d24 , 0x5d26 , 0x5d27 , 0x5229 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3a49 , -0x5d29 , 0x0 , 0x0 , 0x5d36 , -0x5d31 , 0x5d34 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5d30 , 0x464e , 0x0 , -0x0 , 0x4072 , 0x0 , 0x0 , -0x0 , 0x0 , 0x492f , 0x0 , -0x0 , 0x0 , 0x5c6c , 0x5d2e , -0x0 , 0x0 , 0x0 , 0x0 , -0x5d37 , 0x0 , 0x0 , 0x5c70 , -0x5d2f , 0x0 , 0x5d38 , 0x0 , -0x5d2c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5d39 , 0x5d33 , 0x5d2d , 0x442a , -0x0 , 0x0 , 0x0 , 0x0 , -0x5d28 , 0x4033 , 0x412b , 0x5d2a , -0x5d2b , 0x0 , 0x5d32 , 0x3b71 , -0x5d35 , 0x5328 , 0x5d3a , 0x0 , -0x5d3b , 0x4327 , 0x0 , 0x0 , -0x5d52 , 0x5d3c , 0x0 , 0x0 , -0x0 , 0x5d51 , 0x0 , 0x393d , -0x0 , 0x0 , 0x3e55 , 0x0 , -0x3e7a , 0x0 , 0x0 , 0x3a4a , -0x0 , 0x0 , 0x0 , 0x0 , -0x5d4a , 0x0 , 0x5d45 , 0x0 , -0x5d3f , 0x0 , 0x0 , 0x0 , -0x324b , 0x5d43 , 0x0 , 0x5d4b , -0x3224 , 0x5d55 , 0x0 , 0x0 , -0x0 , 0x5d3e , 0x0 , 0x0 , -0x0 , 0x4650 , 0x5d50 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5d54 , 0x4162 , 0x3746 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5d4e , 0x5d4f , 0x0 , 0x0 , -0x0 , 0x5d44 , 0x0 , 0x0 , -0x0 , 0x5d3d , 0x0 , 0x5d4d , -0x4c51 , 0x0 , 0x5d49 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5d42 , -0x4348 , 0x463c , 0x4e2e , 0x5d4c , -0x0 , 0x5d48 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5d41 , 0x0 , 0x0 , 0x0 , -0x5d46 , 0x425c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5329 , 0x532a , 0x5d53 , 0x4f74 , -0x4878 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5d66 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5d47 , 0x0 , 0x0 , 0x0 , -0x5d60 , 0x4264 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5d61 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5d57 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5678 , -0x0 , 0x5d59 , 0x5d58 , 0x3870 , -0x5d56 , 0x0 , 0x0 , 0x0 , -0x0 , 0x464f , 0x0 , 0x362d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5d62 , 0x0 , 0x3a79 , -0x5461 , 0x5d67 , 0x0 , 0x0 , -0x0 , 0x3450 , 0x0 , 0x5d5a , -0x0 , 0x3f7b , 0x5d63 , 0x0 , -0x5d5f , 0x0 , 0x5d5d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3559 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5d5b , -0x5d5c , 0x5d5e , 0x0 , 0x3d2f , -0x5d64 , 0x0 , 0x5d65 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5d75 , -0x0 , 0x4349 , 0x0 , 0x0 , -0x4b62 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5d72 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5861 , -0x0 , 0x0 , 0x4651 , 0x0 , -0x5d74 , 0x0 , 0x0 , 0x0 , -0x5574 , 0x5d73 , 0x5d70 , 0x0 , -0x0 , 0x5d6c , 0x0 , 0x5d6f , -0x0 , 0x5d68 , 0x0 , 0x0 , -0x506e , 0x0 , 0x0 , 0x0 , -0x0 , 0x4858 , 0x5d6e , 0x0 , -0x0 , 0x5d69 , 0x0 , 0x0 , -0x5d6a , 0x4b72 , 0x0 , 0x5d6d , -0x0 , 0x0 , 0x314d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4036 , 0x0 , 0x3c3b , -0x5d71 , 0x0 , 0x0 , 0x5d77 , -0x0 , 0x5d76 , 0x5d6b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x456e , 0x0 , 0x0 , 0x0 , -0x5d7b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5e24 , 0x0 , 0x0 , 0x5e23 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5d78 , 0x0 , 0x0 , 0x0 , -0x0 , 0x436f , 0x0 , 0x427b , -0x0 , 0x0 , 0x0 , 0x5561 , -0x0 , 0x0 , 0x4e35 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5d7d , -0x0 , 0x324c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4468 , -0x4a5f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x473e , -0x5d7a , 0x5d7c , 0x5d7e , 0x5e22 , -0x302a , 0x314e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5e2c , -0x0 , 0x0 , 0x0 , 0x0 , -0x5e26 , 0x3d36 , 0x486f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5e21 , 0x0 , -0x0 , 0x5e25 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5e29 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5e28 , 0x0 , 0x0 , 0x0 , -0x5e27 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5e2d , 0x0 , -0x544c , 0x0 , 0x0 , 0x0 , -0x0 , 0x5e33 , 0x5e2a , 0x5e2e , -0x0 , 0x0 , 0x4059 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3121 , 0x5e36 , 0x0 , 0x5e31 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5e32 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5126 , -0x5e35 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5e2f , 0x0 , 0x0 , 0x0 , -0x5e30 , 0x0 , 0x503d , 0x0 , -0x0 , 0x0 , 0x5e34 , 0x4a6d , -0x5e39 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5e38 , -0x0 , 0x5e37 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5e3b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3d65 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3258 , -0x436a , 0x0 , 0x0 , 0x5e3a , -0x0 , 0x453a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5e3c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4c59 , 0x0 , 0x0 , 0x0 , -0x0 , 0x372a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5465 , -0x0 , 0x0 , 0x0 , 0x5e3d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5e3f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4422 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5e41 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5e3e , -0x0 , 0x5e40 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x553a , 0x0 , 0x0 , 0x0 , -0x5e42 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x722e , 0x3b22 , 0x4232 , -0x4530 , 0x4247 , 0x0 , 0x0 , -0x722f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5069 , 0x0 , -0x0 , 0x0 , 0x535d , 0x0 , -0x0 , 0x0 , 0x6b3d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3366 , -0x7230 , 0x0 , 0x7231 , 0x0 , -0x0 , 0x4a2d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3a67 , 0x7233 , 0x7235 , -0x7234 , 0x4b64 , 0x4f3a , 0x7232 , -0x4a34 , 0x524f , 0x426c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4e43 , 0x7238 , -0x3076 , 0x7237 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x723e , -0x0 , 0x324f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5141 , 0x723a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x723c , -0x5469 , 0x0 , 0x0 , 0x723b , -0x7236 , 0x723f , 0x723d , 0x0 , -0x7239 , 0x0 , 0x0 , 0x7247 , -0x7244 , 0x7246 , 0x0 , 0x0 , -0x724a , 0x7242 , 0x7240 , 0x0 , -0x0 , 0x0 , 0x7245 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x567b , 0x0 , 0x0 , 0x0 , -0x7241 , 0x0 , 0x4779 , 0x495f , -0x0 , 0x7248 , 0x3946 , 0x3530 , -0x0 , 0x0 , 0x7243 , 0x7249 , -0x7250 , 0x7256 , 0x0 , 0x0 , -0x3b57 , 0x0 , 0x0 , 0x0 , -0x7255 , 0x4d5c , 0x0 , 0x566b , -0x0 , 0x0 , 0x7252 , 0x7254 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3872 , 0x0 , 0x0 , 0x0 , -0x0 , 0x724b , 0x0 , 0x0 , -0x0 , 0x724e , 0x4279 , 0x0 , -0x555d , 0x724c , 0x724d , 0x724f , -0x7253 , 0x0 , 0x0 , 0x0 , -0x7259 , 0x533c , 0x0 , 0x0 , -0x0 , 0x0 , 0x366a , 0x0 , -0x4a71 , 0x0 , 0x3764 , 0x7257 , -0x0 , 0x0 , 0x0 , 0x7258 , -0x725a , 0x725d , 0x725b , 0x0 , -0x0 , 0x725c , 0x0 , 0x0 , -0x0 , 0x0 , 0x5151 , 0x7251 , -0x0 , 0x4d49 , 0x0 , 0x4e4f , -0x5629 , 0x0 , 0x7263 , 0x0 , -0x435b , 0x0 , 0x7260 , 0x0 , -0x0 , 0x402f , 0x726c , 0x725e , -0x0 , 0x7261 , 0x0 , 0x0 , -0x0 , 0x7268 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7262 , 0x0 , -0x0 , 0x7267 , 0x0 , 0x0 , -0x7266 , 0x0 , 0x0 , 0x7269 , -0x0 , 0x0 , 0x0 , 0x725f , -0x0 , 0x0 , 0x7264 , 0x726a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x532c , -0x7265 , 0x3275 , 0x0 , 0x0 , -0x7272 , 0x0 , 0x502b , 0x0 , -0x0 , 0x0 , 0x0 , 0x7275 , -0x0 , 0x0 , 0x0 , 0x3b48 , -0x0 , 0x7279 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7270 , 0x0 , 0x0 , 0x7276 , -0x7278 , 0x727a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7273 , 0x0 , -0x7271 , 0x0 , 0x0 , 0x0 , -0x3a7b , 0x0 , 0x357b , 0x0 , -0x0 , 0x0 , 0x0 , 0x726f , -0x7277 , 0x726d , 0x726e , 0x0 , -0x0 , 0x0 , 0x726b , 0x7326 , -0x0 , 0x7323 , 0x0 , 0x0 , -0x7322 , 0x0 , 0x0 , 0x7274 , -0x0 , 0x485a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x727b , -0x0 , 0x0 , 0x0 , 0x7325 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4378 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x727d , 0x0 , 0x0 , 0x7327 , -0x7329 , 0x7324 , 0x0 , 0x727c , -0x0 , 0x0 , 0x0 , 0x732b , -0x0 , 0x732a , 0x0 , 0x0 , -0x0 , 0x0 , 0x425d , 0x0 , -0x0 , 0x732e , 0x0 , 0x0 , -0x7330 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7321 , 0x0 , -0x0 , 0x0 , 0x7331 , 0x732c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x732f , 0x727e , 0x732d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7332 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7334 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7328 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7333 , 0x0 , -0x0 , 0x0 , 0x7335 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5037 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7338 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5979 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7339 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7337 , -0x0 , 0x4864 , 0x7336 , 0x0 , -0x0 , 0x0 , 0x0 , 0x733a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x733b , 0x3440 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6e43 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x733c , 0x0 , 0x0 , -0x733d , 0x0 , 0x0 , 0x0 , -0x512a , 0x0 , 0x0 , 0x0 , -0x742c , 0x5046 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5050 , 0x515c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4f4e , 0x0 , 0x0 , 0x3d56 , -0x0 , 0x5143 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3a62 , 0x6169 , 0x5242 , -0x7142 , 0x3239 , 0x0 , 0x0 , -0x316d , 0x7143 , 0x0 , 0x4940 , -0x3344 , 0x0 , 0x5972 , 0x0 , -0x4b25 , 0x0 , 0x7144 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5654 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7145 , 0x7440 , 0x7146 , -0x0 , 0x542c , 0x7147 , 0x0 , -0x3040 , 0x7441 , 0x0 , 0x0 , -0x7442 , 0x0 , 0x0 , 0x347c , -0x0 , 0x455b , 0x0 , 0x0 , -0x0 , 0x0 , 0x4c3b , 0x0 , -0x0 , 0x0 , 0x5064 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4d60 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7148 , 0x0 , -0x5973 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x313b , -0x0 , 0x4f2e , 0x0 , 0x0 , -0x0 , 0x3824 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x714a , -0x0 , 0x0 , 0x0 , 0x0 , -0x714b , 0x0 , 0x0 , 0x0 , -0x0 , 0x3243 , 0x4151 , 0x0 , -0x0 , 0x5730 , 0x7149 , 0x0 , -0x0 , 0x714c , 0x0 , 0x0 , -0x0 , 0x0 , 0x714e , 0x0 , -0x0 , 0x0 , 0x5976 , 0x0 , -0x5261 , 0x5423 , 0x0 , 0x0 , -0x7443 , 0x4839 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7444 , -0x0 , 0x0 , 0x714d , 0x714f , -0x3f63 , 0x7150 , 0x0 , 0x0 , -0x7154 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7156 , 0x7151 , 0x0 , 0x4951 , -0x4561 , 0x0 , 0x0 , 0x0 , -0x4263 , 0x397c , 0x0 , 0x0 , -0x7153 , 0x0 , 0x7155 , 0x0 , -0x0 , 0x0 , 0x3953 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x715b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3a56 , 0x0 , 0x307d , 0x7159 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7158 , 0x7152 , 0x715a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7157 , 0x0 , 0x0 , -0x0 , 0x486c , 0x0 , 0x0 , -0x0 , 0x0 , 0x4d4a , 0x715d , -0x0 , 0x0 , 0x0 , 0x0 , -0x653d , 0x0 , 0x0 , 0x0 , -0x715c , 0x0 , 0x715e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x715f , 0x0 , 0x0 , -0x4f65 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7445 , 0x3d73 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7160 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7161 , -0x0 , 0x0 , 0x0 , 0x4e77 , -0x0 , 0x522a , 0x0 , 0x717b , -0x0 , 0x0 , 0x3832 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3c7b , 0x395b , 0x0 , -0x3966 , 0x4359 , 0x4a53 , 0x6a68 , -0x4040 , 0x3e75 , 0x6a69 , 0x6a6a , -0x6a6b , 0x0 , 0x6a6c , 0x6a6d , -0x6a6e , 0x6a6f , 0x3d47 , 0x0 , -0x0 , 0x0 , 0x757b , 0x0 , -0x0 , 0x0 , 0x757d , 0x0 , -0x757e , 0x0 , 0x757c , 0x0 , -0x0 , 0x0 , 0x0 , 0x3d62 , -0x0 , 0x7621 , 0x3425 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7622 , -0x0 , 0x0 , 0x0 , 0x7623 , -0x0 , 0x0 , 0x0 , 0x6c32 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5154 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x596a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7624 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6e3a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5532 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x537e , 0x4c5c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4a44 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6540 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7625 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3e2f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4629 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5a25 , 0x3c46 , 0x3629 , 0x383c , -0x484f , 0x3c25 , 0x5a26 , 0x5a27 , -0x4c56 , 0x4843 , 0x5a28 , 0x467d , -0x0 , 0x5135 , 0x5269 , 0x5136 , -0x3c47 , 0x0 , 0x3d32 , 0x3b64 , -0x5a29 , 0x5a2a , 0x5148 , 0x5a2b , -0x506d , 0x366f , 0x425b , 0x0 , -0x4b4f , 0x376d , 0x4968 , 0x3743 , -0x3e77 , 0x5624 , 0x5a2c , 0x5a2d , -0x4640 , 0x5767 , 0x4a36 , 0x0 , -0x5529 , 0x4b5f , 0x556f , 0x5a2e , -0x565f , 0x344a , 0x5a30 , 0x5a2f , -0x0 , 0x526b , 0x5a31 , 0x5a32 , -0x5a33 , 0x4a54 , 0x5a34 , 0x4a2b , -0x5a35 , 0x5a36 , 0x334f , 0x566f , -0x5a37 , 0x3b30 , 0x352e , 0x5a38 , -0x5a39 , 0x396e , 0x512f , 0x5268 , -0x5a3a , 0x3843 , 0x4f6a , 0x326f , -0x5a3b , 0x5a3c , 0x0 , 0x3d6b , -0x4e5c , 0x536f , 0x5a3d , 0x4e73 , -0x5a3e , 0x5355 , 0x3b65 , 0x5a3f , -0x4b35 , 0x4b50 , 0x5a40 , 0x476b , -0x566e , 0x5a41 , 0x4535 , 0x3641 , -0x5a42 , 0x374c , 0x3f4e , 0x5a43 , -0x5a44 , 0x4b2d , 0x5a45 , 0x3577 , -0x5a46 , 0x4142 , 0x573b , 0x5a47 , -0x4c38 , 0x0 , 0x526a , 0x4431 , -0x5a48 , 0x357d , 0x3b51 , 0x5a49 , -0x5033 , 0x5a4a , 0x5a4b , 0x4e3d , -0x5a4c , 0x5a4d , 0x5a4e , 0x3277 , -0x5a51 , 0x5a4f , 0x5168 , 0x5a50 , -0x4355 , 0x5a52 , 0x0 , 0x5a53 , -0x5a54 , 0x5a55 , 0x503b , 0x5225 , -0x3079 , 0x5a56 , 0x472b , 0x5a57 , -0x3d77 , 0x4321 , 0x5a58 , 0x5a59 , -0x437d , 0x4c37 , 0x5a5a , 0x5a5b , -0x403e , 0x4657 , 0x5a5c , 0x5a5d , -0x4734 , 0x5a5e , 0x5a5f , 0x3948 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3b6d , 0x0 , 0x0 , -0x0 , 0x0 , 0x3639 , 0x7478 , -0x0 , 0x7479 , 0x0 , 0x0 , -0x4d63 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7539 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6b60 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4f73 , 0x3b3f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3a40 , 0x5425 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6159 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7574 , 0x312a , 0x3272 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7575 , 0x0 , -0x0 , 0x7577 , 0x0 , 0x0 , -0x0 , 0x3a51 , 0x7576 , 0x0 , -0x4332 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7579 , 0x0 , 0x0 , 0x0 , -0x7578 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3134 , 0x556a , 0x383a , -0x0 , 0x3931 , 0x3246 , 0x5470 , -0x4f4d , 0x305c , 0x554b , 0x3b75 , -0x564a , 0x3737 , 0x4c30 , 0x4636 , -0x3161 , 0x393a , 0x567c , 0x3961 , -0x3721 , 0x3c7a , 0x6a5a , 0x6a5b , -0x4c79 , 0x3973 , 0x6a5c , 0x347b , -0x4333 , 0x3751 , 0x3a58 , 0x6a5d , -0x5474 , 0x6a5e , 0x3c56 , 0x3b5f , -0x6a5f , 0x415e , 0x4238 , 0x545f , -0x574a , 0x6a60 , 0x6a61 , 0x6a64 , -0x6a62 , 0x6a63 , 0x495e , 0x3833 , -0x3644 , 0x6a65 , 0x4a6a , 0x494d , -0x344d , 0x0 , 0x0 , 0x6259 , -0x4562 , 0x6a66 , 0x4035 , 0x0 , -0x5738 , 0x6a67 , 0x572c , 0x487c , -0x5853 , 0x584d , 0x545e , 0x0 , -0x5479 , 0x4944 , 0x532e , 0x3853 , -0x3360 , 0x0 , 0x4962 , 0x7476 , -0x0 , 0x0 , 0x0 , 0x3a55 , -0x0 , 0x7477 , 0x0 , 0x0 , -0x575f , 0x0 , 0x0 , 0x7471 , -0x3830 , 0x5554 , 0x384f , 0x4670 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3343 , 0x0 , 0x0 , -0x7472 , 0x332c , 0x0 , 0x0 , -0x0 , 0x0 , 0x543d , 0x4777 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7474 , 0x0 , 0x0 , -0x7473 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4c4b , -0x0 , 0x0 , 0x0 , 0x4824 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7475 , 0x0 , 0x5763 , -0x453f , 0x7540 , 0x0 , 0x0 , -0x753b , 0x0 , 0x7543 , 0x0 , -0x7542 , 0x0 , 0x563a , 0x7541 , -0x0 , 0x0 , 0x0 , 0x543e , -0x7544 , 0x0 , 0x754c , 0x0 , -0x0 , 0x0 , 0x0 , 0x304f , -0x3578 , 0x0 , 0x7549 , 0x754a , -0x0 , 0x455c , 0x0 , 0x0 , -0x0 , 0x0 , 0x7545 , 0x7546 , -0x0 , 0x0 , 0x7547 , 0x754b , -0x0 , 0x3e60 , 0x7548 , 0x387a , -0x0 , 0x0 , 0x0 , 0x7550 , -0x7553 , 0x0 , 0x0 , 0x0 , -0x3f67 , 0x0 , 0x3972 , 0x753c , -0x754d , 0x0 , 0x0 , 0x4237 , -0x0 , 0x0 , 0x0 , 0x4c78 , -0x0 , 0x3c79 , 0x0 , 0x754e , -0x754f , 0x7551 , 0x3665 , 0x7552 , -0x0 , 0x7555 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x753d , 0x0 , 0x0 , -0x0 , 0x7554 , 0x533b , 0x0 , -0x336c , 0x0 , 0x0 , 0x4c24 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7556 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7557 , 0x3e61 , 0x7558 , -0x0 , 0x0 , 0x4c5f , 0x755b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3248 , 0x5759 , 0x0 , -0x7559 , 0x0 , 0x755a , 0x755c , -0x0 , 0x7562 , 0x0 , 0x0 , -0x0 , 0x7560 , 0x0 , 0x0 , -0x0 , 0x755f , 0x755d , 0x0 , -0x0 , 0x7561 , 0x0 , 0x0 , -0x755e , 0x7564 , 0x7565 , 0x0 , -0x4c63 , 0x0 , 0x0 , 0x653f , -0x3538 , 0x7563 , 0x7568 , 0x4c23 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7566 , 0x7567 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x753e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3144 , 0x0 , -0x0 , 0x753f , 0x0 , 0x0 , -0x3545 , 0x3264 , 0x0 , 0x756c , -0x7569 , 0x0 , 0x3657 , 0x0 , -0x756d , 0x0 , 0x756a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x756b , 0x0 , 0x0 , 0x345a , -0x0 , 0x546a , 0x0 , 0x0 , -0x0 , 0x756e , 0x0 , 0x3379 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x756f , -0x7571 , 0x0 , 0x0 , 0x0 , -0x7570 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7572 , 0x0 , 0x7573 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x496d , -0x392a , 0x0 , 0x0 , 0x477b , -0x0 , 0x0 , 0x3663 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4c49 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6a26 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3335 , 0x547e , -0x396c , 0x5079 , 0x0 , 0x696d , -0x572a , 0x696e , 0x4256 , 0x486d , -0x3a64 , 0x696f , 0x6970 , 0x6971 , -0x5661 , 0x6972 , 0x6973 , 0x6975 , -0x6974 , 0x6976 , 0x6977 , 0x4761 , -0x6978 , 0x5458 , 0x6979 , 0x3d4e , -0x0 , 0x697a , 0x697b , 0x3d4f , -0x697c , 0x3828 , 0x413e , 0x697d , -0x3132 , 0x3b54 , 0x3975 , 0x697e , -0x0 , 0x6a21 , 0x6a22 , 0x6a23 , -0x3778 , 0x3c2d , 0x0 , 0x4a64 , -0x604e , 0x542f , 0x4f3d , 0x5537 , -0x6a24 , 0x555e , 0x6a25 , 0x5041 , -0x393c , 0x0 , 0x3447 , 0x3159 , -0x0 , 0x0 , 0x0 , 0x4031 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3166 , 0x3167 , 0x0 , 0x3168 , -0x0 , 0x0 , 0x0 , 0x0 , -0x333d , 0x4868 , 0x0 , 0x0 , -0x0 , 0x0 , 0x6541 , 0x0 , -0x0 , 0x315f , 0x0 , 0x0 , -0x0 , 0x4149 , 0x346f , 0x0 , -0x0 , 0x4728 , 0x5358 , 0x0 , -0x4679 , 0x5138 , 0x0 , 0x397d , -0x4275 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x532d , 0x0 , -0x544b , 0x3d7c , 0x0 , 0x6542 , -0x3735 , 0x6543 , 0x0 , 0x0 , -0x3b39 , 0x5562 , 0x0 , 0x3d78 , -0x5436 , 0x4e25 , 0x412c , 0x3359 , -0x0 , 0x0 , 0x4c76 , 0x0 , -0x6546 , 0x6544 , 0x6548 , 0x0 , -0x654a , 0x6547 , 0x354f , 0x4648 , -0x0 , 0x357c , 0x6545 , 0x0 , -0x4a76 , 0x0 , 0x0 , 0x6549 , -0x0 , 0x0 , 0x0 , 0x4354 , -0x3145 , 0x3c23 , 0x0 , 0x0 , -0x0 , 0x5737 , 0x0 , 0x0 , -0x4d4b , 0x4b4d , 0x4a4a , 0x4c53 , -0x654c , 0x654b , 0x4466 , 0x0 , -0x0 , 0x5121 , 0x5137 , 0x654d , -0x0 , 0x6550 , 0x0 , 0x4d38 , -0x5670 , 0x654f , 0x355d , 0x0 , -0x4d3e , 0x0 , 0x6551 , 0x363a , -0x0 , 0x0 , 0x4d28 , 0x3964 , -0x0 , 0x4a45 , 0x3351 , 0x4b59 , -0x546c , 0x6552 , 0x376a , 0x0 , -0x0 , 0x0 , 0x654e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6555 , 0x347e , 0x6556 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6553 , 0x6554 , 0x0 , -0x525d , 0x0 , 0x0 , 0x425f , -0x3146 , 0x0 , 0x5362 , 0x0 , -0x0 , 0x365d , 0x4b6c , 0x0 , -0x6557 , 0x0 , 0x0 , 0x5376 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3169 , 0x0 , 0x3674 , -0x655a , 0x6558 , 0x6559 , 0x3540 , -0x0 , 0x0 , 0x0 , 0x5245 , -0x655c , 0x0 , 0x0 , 0x655e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x655d , 0x4732 , -0x0 , 0x5223 , 0x0 , 0x0 , -0x655b , 0x0 , 0x0 , 0x0 , -0x0 , 0x5462 , 0x555a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6560 , 0x5771 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6561 , 0x0 , 0x315c , -0x517b , 0x0 , 0x6562 , 0x6564 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6563 , 0x0 , 0x0 , 0x6565 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5258 , 0x0 , 0x354b , -0x0 , 0x675f , 0x0 , 0x5a75 , -0x0 , 0x5a78 , 0x0 , 0x5a76 , -0x0 , 0x5a77 , 0x0 , 0x0 , -0x0 , 0x5a7a , 0x504f , 0x4447 , -0x0 , 0x0 , 0x306e , 0x0 , -0x0 , 0x0 , 0x5030 , 0x0 , -0x5a79 , 0x0 , 0x534a , 0x3a2a , -0x5b22 , 0x4771 , 0x0 , 0x5a7c , -0x5a7b , 0x495b , 0x5a7d , 0x0 , -0x5b21 , 0x575e , 0x5a7e , 0x415a , -0x0 , 0x0 , 0x5b25 , 0x0 , -0x0 , 0x5374 , 0x0 , 0x0 , -0x5b27 , 0x5b24 , 0x0 , 0x5b28 , -0x0 , 0x0 , 0x3d3c , 0x0 , -0x0 , 0x0 , 0x4049 , 0x5b23 , -0x5b26 , 0x5623 , 0x0 , 0x5b29 , -0x0 , 0x0 , 0x0 , 0x5b2d , -0x0 , 0x0 , 0x0 , 0x5b2e , -0x5b2c , 0x3a42 , 0x0 , 0x0 , -0x0 , 0x3f24 , 0x5b2b , 0x0 , -0x0 , 0x0 , 0x5b2a , 0x5447 , -0x323f , 0x0 , 0x0 , 0x5b2f , -0x0 , 0x3979 , 0x0 , 0x5b30 , -0x0 , 0x0 , 0x0 , 0x0 , -0x333b , 0x0 , 0x0 , 0x0 , -0x3526 , 0x0 , 0x0 , 0x0 , -0x0 , 0x363c , 0x5b31 , 0x0 , -0x0 , 0x0 , 0x3675 , 0x0 , -0x5b32 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3149 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5b34 , 0x0 , -0x0 , 0x0 , 0x5b33 , 0x5b35 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5b37 , -0x0 , 0x5b36 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5b38 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5b39 , -0x0 , 0x0 , 0x5b3a , 0x0 , -0x0 , 0x534f , 0x747a , 0x4775 , -0x5743 , 0x4564 , 0x747c , 0x747d , -0x747b , 0x0 , 0x3e46 , 0x0 , -0x0 , 0x0 , 0x0 , 0x506f , -0x0 , 0x0 , 0x3753 , 0x0 , -0x0 , 0x544d , 0x4c2a , 0x0 , -0x0 , 0x7522 , 0x7521 , 0x3a28 , -0x747e , 0x4b56 , 0x0 , 0x0 , -0x0 , 0x7524 , 0x4052 , 0x0 , -0x336a , 0x0 , 0x4d2a , 0x7525 , -0x7523 , 0x3d34 , 0x7528 , 0x0 , -0x7529 , 0x3d4d , 0x4338 , 0x3f61 , -0x4b61 , 0x752a , 0x0 , 0x0 , -0x0 , 0x7526 , 0x7527 , 0x4470 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x752c , 0x0 , 0x343c , -0x0 , 0x576d , 0x0 , 0x3457 , -0x752b , 0x752e , 0x0 , 0x0 , -0x752d , 0x752f , 0x5051 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4351 , 0x4829 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7530 , 0x7531 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7532 , 0x0 , -0x0 , 0x7533 , 0x7534 , 0x7535 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7537 , 0x7536 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7538 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3249 , -0x0 , 0x5354 , 0x4a4d , 0x0 , -0x406f , 0x5658 , 0x5230 , 0x413f , -0x0 , 0x3d70 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x382a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3c78 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7646 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7647 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7648 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7649 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x764a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x764c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x764b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7769 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x764d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x764e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6e44 , 0x6e45 , 0x6e46 , -0x556b , 0x3624 , 0x6e48 , 0x6e47 , -0x6e49 , 0x6e4a , 0x4725 , 0x6e4b , -0x6e4c , 0x0 , 0x3730 , 0x3576 , -0x6e4d , 0x6e4f , 0x0 , 0x6e4e , -0x0 , 0x3846 , 0x6e50 , 0x6e51 , -0x6e52 , 0x365b , 0x332e , 0x5653 , -0x4446 , 0x3135 , 0x3856 , 0x6e53 , -0x6e54 , 0x543f , 0x4755 , 0x3e7b , -0x4e59 , 0x3933 , 0x6e56 , 0x6e55 , -0x6e58 , 0x6e57 , 0x4525 , 0x6e59 , -0x6e5a , 0x472e , 0x6e5b , 0x472f , -0x6e5c , 0x3227 , 0x6e5d , 0x6e5e , -0x6e5f , 0x6e60 , 0x6e61 , 0x576a , -0x6e62 , 0x6e63 , 0x3c58 , 0x6e64 , -0x534b , 0x4c7a , 0x322c , 0x4165 , -0x6e65 , 0x4726 , 0x432d , 0x0 , -0x6e66 , 0x6e67 , 0x6e68 , 0x6e69 , -0x6e6a , 0x6e6b , 0x6e6c , 0x0 , -0x6e6d , 0x6e6e , 0x6e6f , 0x0 , -0x0 , 0x6e70 , 0x6e71 , 0x6e72 , -0x6e74 , 0x6e73 , 0x0 , 0x6e75 , -0x4d2d , 0x4241 , 0x6e76 , 0x6e77 , -0x6e78 , 0x5521 , 0x6e79 , 0x4f33 , -0x6e7a , 0x6e7b , 0x0 , 0x6e7c , -0x6e7d , 0x6f21 , 0x6e7e , 0x6f22 , -0x3875 , 0x437a , 0x6f23 , 0x6f24 , -0x3d42 , 0x523f , 0x3279 , 0x6f25 , -0x6f26 , 0x6f27 , 0x5278 , 0x6f28 , -0x567d , 0x6f29 , 0x464c , 0x0 , -0x6f2a , 0x6f2b , 0x4134 , 0x6f2c , -0x4f7a , 0x4b78 , 0x6f2e , 0x6f2d , -0x337a , 0x3978 , 0x6f2f , 0x6f30 , -0x5062 , 0x6f31 , 0x6f32 , 0x3766 , -0x503f , 0x6f33 , 0x6f34 , 0x6f35 , -0x4871 , 0x4c60 , 0x6f36 , 0x6f37 , -0x6f38 , 0x6f39 , 0x6f3a , 0x5560 , -0x6f3b , 0x346d , 0x432a , 0x6f3c , -0x0 , 0x6f3d , 0x6f3e , 0x6f3f , -0x0 , 0x4e7d , 0x6f40 , 0x4260 , -0x3438 , 0x5736 , 0x3d75 , 0x0 , -0x4f47 , 0x6f43 , 0x6f41 , 0x6f42 , -0x6f44 , 0x3627 , 0x3c7c , 0x3e62 , -0x434c , 0x6f45 , 0x6f46 , 0x0 , -0x6f47 , 0x6f4f , 0x6f48 , 0x6f49 , -0x6f4a , 0x4742 , 0x6f71 , 0x364d , -0x6f4b , 0x0 , 0x6f4c , 0x6f4d , -0x3646 , 0x433e , 0x6f4e , 0x0 , -0x6f50 , 0x6f51 , 0x6f52 , 0x5572 , -0x0 , 0x6f53 , 0x4477 , 0x0 , -0x6f54 , 0x4478 , 0x6f55 , 0x6f56 , -0x3864 , 0x3077 , 0x6f57 , 0x6f58 , -0x6f59 , 0x0 , 0x6f5a , 0x6f5b , -0x6f5c , 0x6f5d , 0x0 , 0x6f5e , -0x3e35 , 0x6f61 , 0x6f5f , 0x6f60 , -0x0 , 0x6f62 , 0x6f63 , 0x414d , -0x6f64 , 0x6f65 , 0x6f66 , 0x6f67 , -0x6f68 , 0x6f69 , 0x6f6a , 0x6f6b , -0x6f6c , 0x4058 , 0x0 , 0x6f6d , -0x412d , 0x6f6e , 0x6f6f , 0x6f70 , -0x0 , 0x0 , 0x4f62 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3324 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4345 , 0x6345 , 0x4941 , 0x6346 , -0x0 , 0x3155 , 0x4e4a , 0x3433 , -0x4872 , 0x6347 , 0x4f50 , 0x6348 , -0x3c64 , 0x6349 , 0x634a , 0x4346 , -0x5522 , 0x4456 , 0x396b , 0x4e45 , -0x634b , 0x4376 , 0x634c , 0x0 , -0x3727 , 0x3873 , 0x3a52 , 0x634d , -0x634e , 0x5444 , 0x634f , 0x0 , -0x6350 , 0x514b , 0x6351 , 0x6352 , -0x6353 , 0x6354 , 0x5156 , 0x6355 , -0x327b , 0x403b , 0x6356 , 0x0 , -0x402b , 0x6357 , 0x6358 , 0x6359 , -0x0 , 0x635a , 0x635b , 0x0 , -0x3837 , 0x5a62 , 0x0 , 0x3653 , -0x0 , 0x5a64 , 0x5a63 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5a66 , 0x0 , -0x0 , 0x0 , 0x486e , 0x0 , -0x0 , 0x5a65 , 0x3740 , 0x5174 , -0x5275 , 0x5573 , 0x3d57 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5768 , -0x5a68 , 0x5a67 , 0x0 , 0x3022 , -0x4d53 , 0x0 , 0x5a69 , 0x0 , -0x383d , 0x3c4a , 0x423d , 0x4224 , -0x3342 , 0x5a6a , 0x0 , 0x422a , -0x4430 , 0x3d35 , 0x0 , 0x0 , -0x4f5e , 0x0 , 0x0 , 0x0 , -0x5a6b , 0x4942 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x315d , -0x0 , 0x0 , 0x0 , 0x5a6c , -0x0 , 0x3638 , 0x543a , 0x0 , -0x337d , 0x0 , 0x0 , 0x5a6d , -0x5449 , 0x4f55 , 0x4563 , 0x0 , -0x5a6e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x5a6f , 0x0 , -0x5a70 , 0x416a , 0x4c55 , 0x4f5d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5367 , 0x4221 , 0x0 , -0x5a71 , 0x0 , 0x0 , 0x4b65 , -0x0 , 0x5a72 , 0x0 , 0x4b66 , -0x527e , 0x0 , 0x0 , 0x0 , -0x3874 , 0x0 , 0x0 , 0x5a73 , -0x302f , 0x4f36 , 0x0 , 0x0 , -0x554f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4b6d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5a74 , 0x0 , 0x0 , 0x6344 , -0x0 , 0x0 , 0x4125 , 0x0 , -0x0 , 0x763f , 0x0 , 0x0 , -0x7640 , 0x7641 , 0x4451 , 0x0 , -0x4838 , 0x5163 , 0x0 , 0x0 , -0x505b , 0x5145 , 0x3c2f , 0x394d , -0x0 , 0x6f74 , 0x0 , 0x0 , -0x3446 , 0x533a , 0x7642 , 0x337b , -0x0 , 0x0 , 0x7643 , 0x0 , -0x0 , 0x3571 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7645 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x536a , 0x7627 , 0x5129 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7629 , -0x0 , 0x0 , 0x0 , 0x7628 , -0x0 , 0x0 , 0x4163 , 0x4057 , -0x0 , 0x3122 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4e6d , 0x0 , -0x5068 , 0x762b , 0x0 , 0x0 , -0x4f76 , 0x0 , 0x762a , 0x5570 , -0x762c , 0x4339 , 0x0 , 0x0 , -0x0 , 0x3b74 , 0x762e , 0x762d , -0x0 , 0x0 , 0x0 , 0x445e , -0x0 , 0x0 , 0x4158 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4b2a , 0x0 , 0x4f3c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x762f , 0x0 , -0x0 , 0x7630 , 0x0 , 0x0 , -0x7631 , 0x0 , 0x4236 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3054 , 0x4579 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7632 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4760 , 0x7626 , -0x0 , 0x0 , 0x3e38 , 0x0 , -0x0 , 0x3e32 , 0x0 , 0x3565 , -0x0 , 0x0 , 0x3747 , 0x0 , -0x3f3f , 0x4352 , 0x4366 , 0x0 , -0x0 , 0x584c , 0x0 , 0x0 , -0x0 , 0x386f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3d79 , -0x5125 , 0x0 , 0x3050 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7730 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7731 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x502c , -0x0 , 0x3030 , 0x0 , 0x0 , -0x0 , 0x7732 , 0x7733 , 0x0 , -0x7734 , 0x0 , 0x0 , 0x0 , -0x474a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3e4f , 0x0 , 0x0 , 0x7737 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7736 , -0x0 , 0x315e , 0x0 , 0x7735 , -0x0 , 0x0 , 0x7738 , 0x0 , -0x7739 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4e24 , 0x484d , -0x0 , 0x3a2b , 0x6838 , 0x6839 , -0x683a , 0x3e42 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5274 , -0x0 , 0x544f , 0x4958 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5233 , 0x3625 , 0x476a , -0x717c , 0x4f6e , 0x4b33 , 0x506b , -0x676f , 0x4d67 , 0x394b , 0x3659 , -0x717d , 0x3064 , 0x4b4c , 0x717e , -0x5424 , 0x422d , 0x416c , 0x4644 , -0x3e31 , 0x7221 , 0x3c55 , 0x0 , -0x7222 , 0x7223 , 0x0 , 0x7224 , -0x5243 , 0x4635 , 0x0 , 0x4d47 , -0x7225 , 0x0 , 0x5331 , 0x3f45 , -0x4c62 , 0x0 , 0x7226 , 0x7227 , -0x5155 , 0x366e , 0x7228 , 0x7229 , -0x355f , 0x722a , 0x722b , 0x0 , -0x327c , 0x722c , 0x722d , 0x4827 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x3767 , 0x0 , -0x0 , 0x6c29 , 0x6c2a , 0x6c2b , -0x0 , 0x6c2c , 0x0 , 0x0 , -0x462e , 0x6c2d , 0x6c2e , 0x0 , -0x0 , 0x0 , 0x3749 , 0x4a33 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6238 , -0x774f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7750 , 0x0 , 0x0 , -0x324d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7751 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7753 , 0x7752 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x623b , -0x0 , 0x3c22 , 0x0 , 0x623c , -0x623d , 0x623e , 0x623f , 0x6240 , -0x6241 , 0x3739 , 0x527b , 0x3d24 , -0x4a4e , 0x3125 , 0x4b47 , 0x0 , -0x6242 , 0x367c , 0x4844 , 0x6243 , -0x0 , 0x0 , 0x3d48 , 0x0 , -0x317d , 0x6244 , 0x0 , 0x3676 , -0x6245 , 0x4459 , 0x0 , 0x0 , -0x6246 , 0x4f5a , 0x395d , 0x6247 , -0x4021 , 0x0 , 0x6248 , 0x3276 , -0x0 , 0x6249 , 0x0 , 0x4173 , -0x624a , 0x624b , 0x4278 , 0x624c , -0x624d , 0x624e , 0x4a57 , 0x5838 , -0x5965 , 0x4f63 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7025 , 0x0 , 0x0 , -0x5c30 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x426d , 0x5426 , 0x4d54 , 0x5131 , -0x335b , 0x477d , 0x0 , 0x3235 , -0x423f , 0x6660 , 0x4a3b , 0x6661 , -0x6662 , 0x3e54 , 0x6663 , 0x5724 , -0x4d55 , 0x6665 , 0x3c5d , 0x6664 , -0x6666 , 0x6667 , 0x426e , 0x0 , -0x3d3e , 0x6668 , 0x4266 , 0x3a27 , -0x6669 , 0x0 , 0x666a , 0x3352 , -0x5169 , 0x0 , 0x0 , 0x3f25 , -0x666b , 0x466f , 0x666c , 0x666d , -0x0 , 0x0 , 0x666e , 0x462d , -0x666f , 0x0 , 0x4927 , 0x6670 , -0x6671 , 0x6672 , 0x6539 , 0x6673 , -0x6674 , 0x4262 , 0x6675 , 0x6676 , -0x5668 , 0x6677 , 0x0 , 0x6678 , -0x3947 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x773b , 0x773a , 0x0 , 0x0 , -0x0 , 0x0 , 0x773e , 0x773c , -0x3a21 , 0x0 , 0x773f , 0x0 , -0x7740 , 0x0 , 0x0 , 0x0 , -0x7742 , 0x7741 , 0x7744 , 0x0 , -0x0 , 0x7743 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7745 , -0x7746 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7747 , 0x0 , 0x4b68 , -0x0 , 0x0 , 0x0 , 0x0 , -0x385f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7754 , -0x0 , 0x7755 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7756 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7758 , -0x0 , 0x775a , 0x0 , 0x7757 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x775b , 0x0 , 0x7759 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5757 , -0x0 , 0x0 , 0x0 , 0x0 , -0x775c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x775d , -0x0 , 0x0 , 0x0 , 0x775e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x775f , -0x0 , 0x0 , 0x0 , 0x7760 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5b4b , -0x0 , 0x0 , 0x582a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x6577 , -0x396d , 0x0 , 0x0 , 0x0 , -0x0 , 0x3f7d , 0x3b6a , 0x7749 , -0x4647 , 0x7748 , 0x0 , 0x774a , -0x774c , 0x774b , 0x0 , 0x0 , -0x0 , 0x774d , 0x0 , 0x4e3a , -0x0 , 0x774e , 0x0 , 0x0 , -0x4427 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5363 , 0x0 , 0x0 , 0x764f , -0x0 , 0x4233 , 0x7650 , 0x0 , -0x0 , 0x7651 , 0x7652 , 0x7653 , -0x7654 , 0x0 , 0x0 , 0x7656 , -0x0 , 0x312b , 0x7657 , 0x0 , -0x7658 , 0x7659 , 0x765a , 0x0 , -0x765b , 0x765c , 0x0 , 0x0 , -0x0 , 0x0 , 0x765d , 0x765e , -0x4f4a , 0x0 , 0x765f , 0x7660 , -0x7661 , 0x7662 , 0x7663 , 0x7664 , -0x4070 , 0x7665 , 0x7666 , 0x7667 , -0x7668 , 0x7669 , 0x0 , 0x766a , -0x0 , 0x766b , 0x766c , 0x0 , -0x766d , 0x766e , 0x766f , 0x7670 , -0x7671 , 0x7672 , 0x7673 , 0x7674 , -0x3e28 , 0x0 , 0x7675 , 0x7676 , -0x7677 , 0x7678 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x487a , -0x7679 , 0x767a , 0x767b , 0x767c , -0x0 , 0x0 , 0x767d , 0x767e , -0x7721 , 0x7722 , 0x7723 , 0x7724 , -0x7725 , 0x0 , 0x0 , 0x7726 , -0x7727 , 0x7728 , 0x316e , 0x7729 , -0x772a , 0x772b , 0x0 , 0x0 , -0x772c , 0x772d , 0x415b , 0x772e , -0x0 , 0x0 , 0x772f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4471 , -0x702f , 0x3c26 , 0x7030 , 0x4379 , -0x0 , 0x4538 , 0x513b , 0x0 , -0x7031 , 0x7032 , 0x7033 , 0x7034 , -0x7035 , 0x513c , 0x0 , 0x516c , -0x0 , 0x7037 , 0x7036 , 0x5427 , -0x0 , 0x4d52 , 0x7038 , 0x703a , -0x7039 , 0x703b , 0x703c , 0x0 , -0x0 , 0x386b , 0x703d , 0x3a68 , -0x0 , 0x703e , 0x703f , 0x3e69 , -0x7040 , 0x366c , 0x7041 , 0x7042 , -0x7043 , 0x7044 , 0x4835 , 0x7045 , -0x7046 , 0x0 , 0x7047 , 0x4574 , -0x0 , 0x7048 , 0x0 , 0x0 , -0x0 , 0x7049 , 0x0 , 0x704a , -0x773d , 0x0 , 0x704b , 0x704c , -0x704d , 0x0 , 0x704e , 0x0 , -0x0 , 0x0 , 0x0 , 0x704f , -0x3a57 , 0x0 , 0x7050 , 0x7051 , -0x7052 , 0x7053 , 0x7054 , 0x7055 , -0x7056 , 0x7058 , 0x0 , 0x0 , -0x5325 , 0x7057 , 0x0 , 0x7059 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x753a , 0x4239 , -0x0 , 0x0 , 0x7764 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7765 , -0x7766 , 0x0 , 0x0 , 0x7767 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x7768 , 0x4234 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x776a , 0x0 , 0x776b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x4273 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7470 , 0x0 , 0x0 , 0x0 , -0x746f , 0x0 , 0x0 , 0x4269 , -0x0 , 0x7761 , 0x7762 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3b46 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5964 , 0x0 , 0x0 , -0x0 , 0x4a72 , 0x4068 , 0x7024 , -0x0 , 0x3a5a , 0x0 , 0x0 , -0x472d , 0x0 , 0x0 , 0x0 , -0x442c , 0x0 , 0x0 , 0x776c , -0x776d , 0x776e , 0x0 , 0x7770 , -0x776f , 0x0 , 0x7771 , 0x0 , -0x0 , 0x7774 , 0x0 , 0x7773 , -0x0 , 0x7772 , 0x7775 , 0x0 , -0x0 , 0x0 , 0x0 , 0x7776 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d69 , 0x0 , 0x6d6a , -0x6d6b , 0x0 , 0x763c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x763d , -0x0 , 0x763e , 0x3626 , 0x0 , -0x583e , 0x0 , 0x0 , 0x3944 , -0x0 , 0x0 , 0x0 , 0x583b , -0x0 , 0x5c31 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x4a73 , 0x0 , 0x7777 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7778 , 0x0 , 0x0 , 0x7779 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x777b , -0x0 , 0x777a , 0x0 , 0x3147 , -0x0 , 0x777c , 0x777d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x777e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x466b , 0x6c34 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x335d , -0x7633 , 0x0 , 0x0 , 0x7634 , -0x4164 , 0x7635 , 0x7636 , 0x7637 , -0x7638 , 0x7639 , 0x763a , 0x4823 , -0x763b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x417a , 0x3928 , 0x6d68 , -0x0 , 0x0 , 0x0 , 0x396a , -0x595f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2321 , 0x2322 , 0x2323 , -0x2167 , 0x2325 , 0x2326 , 0x2327 , -0x2328 , 0x2329 , 0x232a , 0x232b , -0x232c , 0x232d , 0x232e , 0x232f , -0x2330 , 0x2331 , 0x2332 , 0x2333 , -0x2334 , 0x2335 , 0x2336 , 0x2337 , -0x2338 , 0x2339 , 0x233a , 0x233b , -0x233c , 0x233d , 0x233e , 0x233f , -0x2340 , 0x2341 , 0x2342 , 0x2343 , -0x2344 , 0x2345 , 0x2346 , 0x2347 , -0x2348 , 0x2349 , 0x234a , 0x234b , -0x234c , 0x234d , 0x234e , 0x234f , -0x2350 , 0x2351 , 0x2352 , 0x2353 , -0x2354 , 0x2355 , 0x2356 , 0x2357 , -0x2358 , 0x2359 , 0x235a , 0x235b , -0x235c , 0x235d , 0x235e , 0x235f , -0x2360 , 0x2361 , 0x2362 , 0x2363 , -0x2364 , 0x2365 , 0x2366 , 0x2367 , -0x2368 , 0x2369 , 0x236a , 0x236b , -0x236c , 0x236d , 0x236e , 0x236f , -0x2370 , 0x2371 , 0x2372 , 0x2373 , -0x2374 , 0x2375 , 0x2376 , 0x2377 , -0x2378 , 0x2379 , 0x237a , 0x237b , -0x237c , 0x237d , 0x212b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2169 , 0x216a , 0x0 , 0x237e , -0x0 , 0x2324 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -} ; -static char16 gbuni [65536] = { -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3000 , 0x3001 , 0x3002 , -0x30fb , 0x2c9 , 0x2c7 , 0xa8 , -0x3003 , 0x3005 , 0x2015 , 0xff5e , -0x2225 , 0x2026 , 0x2018 , 0x2019 , -0x201c , 0x201d , 0x3014 , 0x3015 , -0x3008 , 0x3009 , 0x300a , 0x300b , -0x300c , 0x300d , 0x300e , 0x300f , -0x3016 , 0x3017 , 0x3010 , 0x3011 , -0xb1 , 0xd7 , 0xf7 , 0x2236 , -0x2227 , 0x2228 , 0x2211 , 0x220f , -0x222a , 0x2229 , 0x2208 , 0x2237 , -0x221a , 0x22a5 , 0x2225 , 0x2220 , -0x2312 , 0x2299 , 0x222b , 0x222e , -0x2261 , 0x224c , 0x2248 , 0x223d , -0x221d , 0x2260 , 0x226e , 0x226f , -0x2264 , 0x2265 , 0x221e , 0x2235 , -0x2234 , 0x2642 , 0x2640 , 0xb0 , -0x2032 , 0x2033 , 0x2103 , 0xff04 , -0xa4 , 0xffe0 , 0xffe1 , 0x2030 , -0xa7 , 0x2116 , 0x2606 , 0x2605 , -0x25cb , 0x25cf , 0x25ce , 0x25c7 , -0x25c6 , 0x25a1 , 0x25a0 , 0x25b3 , -0x25b2 , 0x203b , 0x2192 , 0x2190 , -0x2191 , 0x2193 , 0x3013 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x2488 , 0x2489 , 0x248a , -0x248b , 0x248c , 0x248d , 0x248e , -0x248f , 0x2490 , 0x2491 , 0x2492 , -0x2493 , 0x2494 , 0x2495 , 0x2496 , -0x2497 , 0x2498 , 0x2499 , 0x249a , -0x249b , 0x2474 , 0x2475 , 0x2476 , -0x2477 , 0x2478 , 0x2479 , 0x247a , -0x247b , 0x247c , 0x247d , 0x247e , -0x247f , 0x2480 , 0x2481 , 0x2482 , -0x2483 , 0x2484 , 0x2485 , 0x2486 , -0x2487 , 0x2460 , 0x2461 , 0x2462 , -0x2463 , 0x2464 , 0x2465 , 0x2466 , -0x2467 , 0x2468 , 0x2469 , 0x0 , -0x0 , 0x3220 , 0x3221 , 0x3222 , -0x3223 , 0x3224 , 0x3225 , 0x3226 , -0x3227 , 0x3228 , 0x3229 , 0x0 , -0x0 , 0x2160 , 0x2161 , 0x2162 , -0x2163 , 0x2164 , 0x2165 , 0x2166 , -0x2167 , 0x2168 , 0x2169 , 0x216a , -0x216b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xff01 , 0xff02 , 0xff03 , -0xffe5 , 0xff05 , 0xff06 , 0xff07 , -0xff08 , 0xff09 , 0xff0a , 0xff0b , -0xff0c , 0xff0d , 0xff0e , 0xff0f , -0xff10 , 0xff11 , 0xff12 , 0xff13 , -0xff14 , 0xff15 , 0xff16 , 0xff17 , -0xff18 , 0xff19 , 0xff1a , 0xff1b , -0xff1c , 0xff1d , 0xff1e , 0xff1f , -0xff20 , 0xff21 , 0xff22 , 0xff23 , -0xff24 , 0xff25 , 0xff26 , 0xff27 , -0xff28 , 0xff29 , 0xff2a , 0xff2b , -0xff2c , 0xff2d , 0xff2e , 0xff2f , -0xff30 , 0xff31 , 0xff32 , 0xff33 , -0xff34 , 0xff35 , 0xff36 , 0xff37 , -0xff38 , 0xff39 , 0xff3a , 0xff3b , -0xff3c , 0xff3d , 0xff3e , 0xff3f , -0xff40 , 0xff41 , 0xff42 , 0xff43 , -0xff44 , 0xff45 , 0xff46 , 0xff47 , -0xff48 , 0xff49 , 0xff4a , 0xff4b , -0xff4c , 0xff4d , 0xff4e , 0xff4f , -0xff50 , 0xff51 , 0xff52 , 0xff53 , -0xff54 , 0xff55 , 0xff56 , 0xff57 , -0xff58 , 0xff59 , 0xff5a , 0xff5b , -0xff5c , 0xff5d , 0xffe3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3041 , 0x3042 , 0x3043 , -0x3044 , 0x3045 , 0x3046 , 0x3047 , -0x3048 , 0x3049 , 0x304a , 0x304b , -0x304c , 0x304d , 0x304e , 0x304f , -0x3050 , 0x3051 , 0x3052 , 0x3053 , -0x3054 , 0x3055 , 0x3056 , 0x3057 , -0x3058 , 0x3059 , 0x305a , 0x305b , -0x305c , 0x305d , 0x305e , 0x305f , -0x3060 , 0x3061 , 0x3062 , 0x3063 , -0x3064 , 0x3065 , 0x3066 , 0x3067 , -0x3068 , 0x3069 , 0x306a , 0x306b , -0x306c , 0x306d , 0x306e , 0x306f , -0x3070 , 0x3071 , 0x3072 , 0x3073 , -0x3074 , 0x3075 , 0x3076 , 0x3077 , -0x3078 , 0x3079 , 0x307a , 0x307b , -0x307c , 0x307d , 0x307e , 0x307f , -0x3080 , 0x3081 , 0x3082 , 0x3083 , -0x3084 , 0x3085 , 0x3086 , 0x3087 , -0x3088 , 0x3089 , 0x308a , 0x308b , -0x308c , 0x308d , 0x308e , 0x308f , -0x3090 , 0x3091 , 0x3092 , 0x3093 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x30a1 , 0x30a2 , 0x30a3 , -0x30a4 , 0x30a5 , 0x30a6 , 0x30a7 , -0x30a8 , 0x30a9 , 0x30aa , 0x30ab , -0x30ac , 0x30ad , 0x30ae , 0x30af , -0x30b0 , 0x30b1 , 0x30b2 , 0x30b3 , -0x30b4 , 0x30b5 , 0x30b6 , 0x30b7 , -0x30b8 , 0x30b9 , 0x30ba , 0x30bb , -0x30bc , 0x30bd , 0x30be , 0x30bf , -0x30c0 , 0x30c1 , 0x30c2 , 0x30c3 , -0x30c4 , 0x30c5 , 0x30c6 , 0x30c7 , -0x30c8 , 0x30c9 , 0x30ca , 0x30cb , -0x30cc , 0x30cd , 0x30ce , 0x30cf , -0x30d0 , 0x30d1 , 0x30d2 , 0x30d3 , -0x30d4 , 0x30d5 , 0x30d6 , 0x30d7 , -0x30d8 , 0x30d9 , 0x30da , 0x30db , -0x30dc , 0x30dd , 0x30de , 0x30df , -0x30e0 , 0x30e1 , 0x30e2 , 0x30e3 , -0x30e4 , 0x30e5 , 0x30e6 , 0x30e7 , -0x30e8 , 0x30e9 , 0x30ea , 0x30eb , -0x30ec , 0x30ed , 0x30ee , 0x30ef , -0x30f0 , 0x30f1 , 0x30f2 , 0x30f3 , -0x30f4 , 0x30f5 , 0x30f6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x391 , 0x392 , 0x393 , -0x394 , 0x395 , 0x396 , 0x397 , -0x398 , 0x399 , 0x39a , 0x39b , -0x39c , 0x39d , 0x39e , 0x39f , -0x3a0 , 0x3a1 , 0x3a3 , 0x3a4 , -0x3a5 , 0x3a6 , 0x3a7 , 0x3a8 , -0x3a9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3b1 , 0x3b2 , 0x3b3 , -0x3b4 , 0x3b5 , 0x3b6 , 0x3b7 , -0x3b8 , 0x3b9 , 0x3ba , 0x3bb , -0x3bc , 0x3bd , 0x3be , 0x3bf , -0x3c0 , 0x3c1 , 0x3c3 , 0x3c4 , -0x3c5 , 0x3c6 , 0x3c7 , 0x3c8 , -0x3c9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x410 , 0x411 , 0x412 , -0x413 , 0x414 , 0x415 , 0x401 , -0x416 , 0x417 , 0x418 , 0x419 , -0x41a , 0x41b , 0x41c , 0x41d , -0x41e , 0x41f , 0x420 , 0x421 , -0x422 , 0x423 , 0x424 , 0x425 , -0x426 , 0x427 , 0x428 , 0x429 , -0x42a , 0x42b , 0x42c , 0x42d , -0x42e , 0x42f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x430 , 0x431 , 0x432 , -0x433 , 0x434 , 0x435 , 0x451 , -0x436 , 0x437 , 0x438 , 0x439 , -0x43a , 0x43b , 0x43c , 0x43d , -0x43e , 0x43f , 0x440 , 0x441 , -0x442 , 0x443 , 0x444 , 0x445 , -0x446 , 0x447 , 0x448 , 0x449 , -0x44a , 0x44b , 0x44c , 0x44d , -0x44e , 0x44f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x101 , 0xe1 , 0x1ce , -0xe0 , 0x113 , 0xe9 , 0x11b , -0xe8 , 0x12b , 0xed , 0x1d0 , -0xec , 0x14d , 0xf3 , 0x1d2 , -0xf2 , 0x16b , 0xfa , 0x1d4 , -0xf9 , 0x1d6 , 0x1d8 , 0x1da , -0x1dc , 0xfc , 0xea , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x3105 , 0x3106 , 0x3107 , -0x3108 , 0x3109 , 0x310a , 0x310b , -0x310c , 0x310d , 0x310e , 0x310f , -0x3110 , 0x3111 , 0x3112 , 0x3113 , -0x3114 , 0x3115 , 0x3116 , 0x3117 , -0x3118 , 0x3119 , 0x311a , 0x311b , -0x311c , 0x311d , 0x311e , 0x311f , -0x3120 , 0x3121 , 0x3122 , 0x3123 , -0x3124 , 0x3125 , 0x3126 , 0x3127 , -0x3128 , 0x3129 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2500 , 0x2501 , 0x2502 , 0x2503 , -0x2504 , 0x2505 , 0x2506 , 0x2507 , -0x2508 , 0x2509 , 0x250a , 0x250b , -0x250c , 0x250d , 0x250e , 0x250f , -0x2510 , 0x2511 , 0x2512 , 0x2513 , -0x2514 , 0x2515 , 0x2516 , 0x2517 , -0x2518 , 0x2519 , 0x251a , 0x251b , -0x251c , 0x251d , 0x251e , 0x251f , -0x2520 , 0x2521 , 0x2522 , 0x2523 , -0x2524 , 0x2525 , 0x2526 , 0x2527 , -0x2528 , 0x2529 , 0x252a , 0x252b , -0x252c , 0x252d , 0x252e , 0x252f , -0x2530 , 0x2531 , 0x2532 , 0x2533 , -0x2534 , 0x2535 , 0x2536 , 0x2537 , -0x2538 , 0x2539 , 0x253a , 0x253b , -0x253c , 0x253d , 0x253e , 0x253f , -0x2540 , 0x2541 , 0x2542 , 0x2543 , -0x2544 , 0x2545 , 0x2546 , 0x2547 , -0x2548 , 0x2549 , 0x254a , 0x254b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x554a , 0x963f , 0x57c3 , -0x6328 , 0x54ce , 0x5509 , 0x54c0 , -0x7691 , 0x764c , 0x853c , 0x77ee , -0x827e , 0x788d , 0x7231 , 0x9698 , -0x978d , 0x6c28 , 0x5b89 , 0x4ffa , -0x6309 , 0x6697 , 0x5cb8 , 0x80fa , -0x6848 , 0x80ae , 0x6602 , 0x76ce , -0x51f9 , 0x6556 , 0x71ac , 0x7ff1 , -0x8884 , 0x50b2 , 0x5965 , 0x61ca , -0x6fb3 , 0x82ad , 0x634c , 0x6252 , -0x53ed , 0x5427 , 0x7b06 , 0x516b , -0x75a4 , 0x5df4 , 0x62d4 , 0x8dcb , -0x9776 , 0x628a , 0x8019 , 0x575d , -0x9738 , 0x7f62 , 0x7238 , 0x767d , -0x67cf , 0x767e , 0x6446 , 0x4f70 , -0x8d25 , 0x62dc , 0x7a17 , 0x6591 , -0x73ed , 0x642c , 0x6273 , 0x822c , -0x9881 , 0x677f , 0x7248 , 0x626e , -0x62cc , 0x4f34 , 0x74e3 , 0x534a , -0x529e , 0x7eca , 0x90a6 , 0x5e2e , -0x6886 , 0x699c , 0x8180 , 0x7ed1 , -0x68d2 , 0x78c5 , 0x868c , 0x9551 , -0x508d , 0x8c24 , 0x82de , 0x80de , -0x5305 , 0x8912 , 0x5265 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8584 , 0x96f9 , 0x4fdd , -0x5821 , 0x9971 , 0x5b9d , 0x62b1 , -0x62a5 , 0x66b4 , 0x8c79 , 0x9c8d , -0x7206 , 0x676f , 0x7891 , 0x60b2 , -0x5351 , 0x5317 , 0x8f88 , 0x80cc , -0x8d1d , 0x94a1 , 0x500d , 0x72c8 , -0x5907 , 0x60eb , 0x7119 , 0x88ab , -0x5954 , 0x82ef , 0x672c , 0x7b28 , -0x5d29 , 0x7ef7 , 0x752d , 0x6cf5 , -0x8e66 , 0x8ff8 , 0x903c , 0x9f3b , -0x6bd4 , 0x9119 , 0x7b14 , 0x5f7c , -0x78a7 , 0x84d6 , 0x853d , 0x6bd5 , -0x6bd9 , 0x6bd6 , 0x5e01 , 0x5e87 , -0x75f9 , 0x95ed , 0x655d , 0x5f0a , -0x5fc5 , 0x8f9f , 0x58c1 , 0x81c2 , -0x907f , 0x965b , 0x97ad , 0x8fb9 , -0x7f16 , 0x8d2c , 0x6241 , 0x4fbf , -0x53d8 , 0x535e , 0x8fa8 , 0x8fa9 , -0x8fab , 0x904d , 0x6807 , 0x5f6a , -0x8198 , 0x8868 , 0x9cd6 , 0x618b , -0x522b , 0x762a , 0x5f6c , 0x658c , -0x6fd2 , 0x6ee8 , 0x5bbe , 0x6448 , -0x5175 , 0x51b0 , 0x67c4 , 0x4e19 , -0x79c9 , 0x997c , 0x70b3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x75c5 , 0x5e76 , 0x73bb , -0x83e0 , 0x64ad , 0x62e8 , 0x94b5 , -0x6ce2 , 0x535a , 0x52c3 , 0x640f , -0x94c2 , 0x7b94 , 0x4f2f , 0x5e1b , -0x8236 , 0x8116 , 0x818a , 0x6e24 , -0x6cca , 0x9a73 , 0x6355 , 0x535c , -0x54fa , 0x8865 , 0x57e0 , 0x4e0d , -0x5e03 , 0x6b65 , 0x7c3f , 0x90e8 , -0x6016 , 0x64e6 , 0x731c , 0x88c1 , -0x6750 , 0x624d , 0x8d22 , 0x776c , -0x8e29 , 0x91c7 , 0x5f69 , 0x83dc , -0x8521 , 0x9910 , 0x53c2 , 0x8695 , -0x6b8b , 0x60ed , 0x60e8 , 0x707f , -0x82cd , 0x8231 , 0x4ed3 , 0x6ca7 , -0x85cf , 0x64cd , 0x7cd9 , 0x69fd , -0x66f9 , 0x8349 , 0x5395 , 0x7b56 , -0x4fa7 , 0x518c , 0x6d4b , 0x5c42 , -0x8e6d , 0x63d2 , 0x53c9 , 0x832c , -0x8336 , 0x67e5 , 0x78b4 , 0x643d , -0x5bdf , 0x5c94 , 0x5dee , 0x8be7 , -0x62c6 , 0x67f4 , 0x8c7a , 0x6400 , -0x63ba , 0x8749 , 0x998b , 0x8c17 , -0x7f20 , 0x94f2 , 0x4ea7 , 0x9610 , -0x98a4 , 0x660c , 0x7316 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x573a , 0x5c1d , 0x5e38 , -0x957f , 0x507f , 0x80a0 , 0x5382 , -0x655e , 0x7545 , 0x5531 , 0x5021 , -0x8d85 , 0x6284 , 0x949e , 0x671d , -0x5632 , 0x6f6e , 0x5de2 , 0x5435 , -0x7092 , 0x8f66 , 0x626f , 0x64a4 , -0x63a3 , 0x5f7b , 0x6f88 , 0x90f4 , -0x81e3 , 0x8fb0 , 0x5c18 , 0x6668 , -0x5ff1 , 0x6c89 , 0x9648 , 0x8d81 , -0x886c , 0x6491 , 0x79f0 , 0x57ce , -0x6a59 , 0x6210 , 0x5448 , 0x4e58 , -0x7a0b , 0x60e9 , 0x6f84 , 0x8bda , -0x627f , 0x901e , 0x9a8b , 0x79e4 , -0x5403 , 0x75f4 , 0x6301 , 0x5319 , -0x6c60 , 0x8fdf , 0x5f1b , 0x9a70 , -0x803b , 0x9f7f , 0x4f88 , 0x5c3a , -0x8d64 , 0x7fc5 , 0x65a5 , 0x70bd , -0x5145 , 0x51b2 , 0x866b , 0x5d07 , -0x5ba0 , 0x62bd , 0x916c , 0x7574 , -0x8e0c , 0x7a20 , 0x6101 , 0x7b79 , -0x4ec7 , 0x7ef8 , 0x7785 , 0x4e11 , -0x81ed , 0x521d , 0x51fa , 0x6a71 , -0x53a8 , 0x8e87 , 0x9504 , 0x96cf , -0x6ec1 , 0x9664 , 0x695a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7840 , 0x50a8 , 0x77d7 , -0x6410 , 0x89e6 , 0x5904 , 0x63e3 , -0x5ddd , 0x7a7f , 0x693d , 0x4f20 , -0x8239 , 0x5598 , 0x4e32 , 0x75ae , -0x7a97 , 0x5e62 , 0x5e8a , 0x95ef , -0x521b , 0x5439 , 0x708a , 0x6376 , -0x9524 , 0x5782 , 0x6625 , 0x693f , -0x9187 , 0x5507 , 0x6df3 , 0x7eaf , -0x8822 , 0x6233 , 0x7ef0 , 0x75b5 , -0x8328 , 0x78c1 , 0x96cc , 0x8f9e , -0x6148 , 0x74f7 , 0x8bcd , 0x6b64 , -0x523a , 0x8d50 , 0x6b21 , 0x806a , -0x8471 , 0x56f1 , 0x5306 , 0x4ece , -0x4e1b , 0x51d1 , 0x7c97 , 0x918b , -0x7c07 , 0x4fc3 , 0x8e7f , 0x7be1 , -0x7a9c , 0x6467 , 0x5d14 , 0x50ac , -0x8106 , 0x7601 , 0x7cb9 , 0x6dec , -0x7fe0 , 0x6751 , 0x5b58 , 0x5bf8 , -0x78cb , 0x64ae , 0x6413 , 0x63aa , -0x632b , 0x9519 , 0x642d , 0x8fbe , -0x7b54 , 0x7629 , 0x6253 , 0x5927 , -0x5446 , 0x6b79 , 0x50a3 , 0x6234 , -0x5e26 , 0x6b86 , 0x4ee3 , 0x8d37 , -0x888b , 0x5f85 , 0x902e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6020 , 0x803d , 0x62c5 , -0x4e39 , 0x5355 , 0x90f8 , 0x63b8 , -0x80c6 , 0x65e6 , 0x6c2e , 0x4f46 , -0x60ee , 0x6de1 , 0x8bde , 0x5f39 , -0x86cb , 0x5f53 , 0x6321 , 0x515a , -0x8361 , 0x6863 , 0x5200 , 0x6363 , -0x8e48 , 0x5012 , 0x5c9b , 0x7977 , -0x5bfc , 0x5230 , 0x7a3b , 0x60bc , -0x9053 , 0x76d7 , 0x5fb7 , 0x5f97 , -0x7684 , 0x8e6c , 0x706f , 0x767b , -0x7b49 , 0x77aa , 0x51f3 , 0x9093 , -0x5824 , 0x4f4e , 0x6ef4 , 0x8fea , -0x654c , 0x7b1b , 0x72c4 , 0x6da4 , -0x7fdf , 0x5ae1 , 0x62b5 , 0x5e95 , -0x5730 , 0x8482 , 0x7b2c , 0x5e1d , -0x5f1f , 0x9012 , 0x7f14 , 0x98a0 , -0x6382 , 0x6ec7 , 0x7898 , 0x70b9 , -0x5178 , 0x975b , 0x57ab , 0x7535 , -0x4f43 , 0x7538 , 0x5e97 , 0x60e6 , -0x5960 , 0x6dc0 , 0x6bbf , 0x7889 , -0x53fc , 0x96d5 , 0x51cb , 0x5201 , -0x6389 , 0x540a , 0x9493 , 0x8c03 , -0x8dcc , 0x7239 , 0x789f , 0x8776 , -0x8fed , 0x8c0d , 0x53e0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4e01 , 0x76ef , 0x53ee , -0x9489 , 0x9876 , 0x9f0e , 0x952d , -0x5b9a , 0x8ba2 , 0x4e22 , 0x4e1c , -0x51ac , 0x8463 , 0x61c2 , 0x52a8 , -0x680b , 0x4f97 , 0x606b , 0x51bb , -0x6d1e , 0x515c , 0x6296 , 0x6597 , -0x9661 , 0x8c46 , 0x9017 , 0x75d8 , -0x90fd , 0x7763 , 0x6bd2 , 0x728a , -0x72ec , 0x8bfb , 0x5835 , 0x7779 , -0x8d4c , 0x675c , 0x9540 , 0x809a , -0x5ea6 , 0x6e21 , 0x5992 , 0x7aef , -0x77ed , 0x953b , 0x6bb5 , 0x65ad , -0x7f0e , 0x5806 , 0x5151 , 0x961f , -0x5bf9 , 0x58a9 , 0x5428 , 0x8e72 , -0x6566 , 0x987f , 0x56e4 , 0x949d , -0x76fe , 0x9041 , 0x6387 , 0x54c6 , -0x591a , 0x593a , 0x579b , 0x8eb2 , -0x6735 , 0x8dfa , 0x8235 , 0x5241 , -0x60f0 , 0x5815 , 0x86fe , 0x5ce8 , -0x9e45 , 0x4fc4 , 0x989d , 0x8bb9 , -0x5a25 , 0x6076 , 0x5384 , 0x627c , -0x904f , 0x9102 , 0x997f , 0x6069 , -0x800c , 0x513f , 0x8033 , 0x5c14 , -0x9975 , 0x6d31 , 0x4e8c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8d30 , 0x53d1 , 0x7f5a , -0x7b4f , 0x4f10 , 0x4e4f , 0x9600 , -0x6cd5 , 0x73d0 , 0x85e9 , 0x5e06 , -0x756a , 0x7ffb , 0x6a0a , 0x77fe , -0x9492 , 0x7e41 , 0x51e1 , 0x70e6 , -0x53cd , 0x8fd4 , 0x8303 , 0x8d29 , -0x72af , 0x996d , 0x6cdb , 0x574a , -0x82b3 , 0x65b9 , 0x80aa , 0x623f , -0x9632 , 0x59a8 , 0x4eff , 0x8bbf , -0x7eba , 0x653e , 0x83f2 , 0x975e , -0x5561 , 0x98de , 0x80a5 , 0x532a , -0x8bfd , 0x5420 , 0x80ba , 0x5e9f , -0x6cb8 , 0x8d39 , 0x82ac , 0x915a , -0x5429 , 0x6c1b , 0x5206 , 0x7eb7 , -0x575f , 0x711a , 0x6c7e , 0x7c89 , -0x594b , 0x4efd , 0x5fff , 0x6124 , -0x7caa , 0x4e30 , 0x5c01 , 0x67ab , -0x8702 , 0x5cf0 , 0x950b , 0x98ce , -0x75af , 0x70fd , 0x9022 , 0x51af , -0x7f1d , 0x8bbd , 0x5949 , 0x51e4 , -0x4f5b , 0x5426 , 0x592b , 0x6577 , -0x80a4 , 0x5b75 , 0x6276 , 0x62c2 , -0x8f90 , 0x5e45 , 0x6c1f , 0x7b26 , -0x4f0f , 0x4fd8 , 0x670d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d6e , 0x6daa , 0x798f , -0x88b1 , 0x5f17 , 0x752b , 0x629a , -0x8f85 , 0x4fef , 0x91dc , 0x65a7 , -0x812f , 0x8151 , 0x5e9c , 0x8150 , -0x8d74 , 0x526f , 0x8986 , 0x8d4b , -0x590d , 0x5085 , 0x4ed8 , 0x961c , -0x7236 , 0x8179 , 0x8d1f , 0x5bcc , -0x8ba3 , 0x9644 , 0x5987 , 0x7f1a , -0x5490 , 0x5676 , 0x560e , 0x8be5 , -0x6539 , 0x6982 , 0x9499 , 0x76d6 , -0x6e89 , 0x5e72 , 0x7518 , 0x6746 , -0x67d1 , 0x7aff , 0x809d , 0x8d76 , -0x611f , 0x79c6 , 0x6562 , 0x8d63 , -0x5188 , 0x521a , 0x94a2 , 0x7f38 , -0x809b , 0x7eb2 , 0x5c97 , 0x6e2f , -0x6760 , 0x7bd9 , 0x768b , 0x9ad8 , -0x818f , 0x7f94 , 0x7cd5 , 0x641e , -0x9550 , 0x7a3f , 0x544a , 0x54e5 , -0x6b4c , 0x6401 , 0x6208 , 0x9e3d , -0x80f3 , 0x7599 , 0x5272 , 0x9769 , -0x845b , 0x683c , 0x86e4 , 0x9601 , -0x9694 , 0x94ec , 0x4e2a , 0x5404 , -0x7ed9 , 0x6839 , 0x8ddf , 0x8015 , -0x66f4 , 0x5e9a , 0x7fb9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x57c2 , 0x803f , 0x6897 , -0x5de5 , 0x653b , 0x529f , 0x606d , -0x9f9a , 0x4f9b , 0x8eac , 0x516c , -0x5bab , 0x5f13 , 0x5de9 , 0x6c5e , -0x62f1 , 0x8d21 , 0x5171 , 0x94a9 , -0x52fe , 0x6c9f , 0x82df , 0x72d7 , -0x57a2 , 0x6784 , 0x8d2d , 0x591f , -0x8f9c , 0x83c7 , 0x5495 , 0x7b8d , -0x4f30 , 0x6cbd , 0x5b64 , 0x59d1 , -0x9f13 , 0x53e4 , 0x86ca , 0x9aa8 , -0x8c37 , 0x80a1 , 0x6545 , 0x987e , -0x56fa , 0x96c7 , 0x522e , 0x74dc , -0x5250 , 0x5be1 , 0x6302 , 0x8902 , -0x4e56 , 0x62d0 , 0x602a , 0x68fa , -0x5173 , 0x5b98 , 0x51a0 , 0x89c2 , -0x7ba1 , 0x9986 , 0x7f50 , 0x60ef , -0x704c , 0x8d2f , 0x5149 , 0x5e7f , -0x901b , 0x7470 , 0x89c4 , 0x572d , -0x7845 , 0x5f52 , 0x9f9f , 0x95fa , -0x8f68 , 0x9b3c , 0x8be1 , 0x7678 , -0x6842 , 0x67dc , 0x8dea , 0x8d35 , -0x523d , 0x8f8a , 0x6eda , 0x68cd , -0x9505 , 0x90ed , 0x56fd , 0x679c , -0x88f9 , 0x8fc7 , 0x54c8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9ab8 , 0x5b69 , 0x6d77 , -0x6c26 , 0x4ea5 , 0x5bb3 , 0x9a87 , -0x9163 , 0x61a8 , 0x90af , 0x97e9 , -0x542b , 0x6db5 , 0x5bd2 , 0x51fd , -0x558a , 0x7f55 , 0x7ff0 , 0x64bc , -0x634d , 0x65f1 , 0x61be , 0x608d , -0x710a , 0x6c57 , 0x6c49 , 0x592f , -0x676d , 0x822a , 0x58d5 , 0x568e , -0x8c6a , 0x6beb , 0x90dd , 0x597d , -0x8017 , 0x53f7 , 0x6d69 , 0x5475 , -0x559d , 0x8377 , 0x83cf , 0x6838 , -0x79be , 0x548c , 0x4f55 , 0x5408 , -0x76d2 , 0x8c89 , 0x9602 , 0x6cb3 , -0x6db8 , 0x8d6b , 0x8910 , 0x9e64 , -0x8d3a , 0x563f , 0x9ed1 , 0x75d5 , -0x5f88 , 0x72e0 , 0x6068 , 0x54fc , -0x4ea8 , 0x6a2a , 0x8861 , 0x6052 , -0x8f70 , 0x54c4 , 0x70d8 , 0x8679 , -0x9e3f , 0x6d2a , 0x5b8f , 0x5f18 , -0x7ea2 , 0x5589 , 0x4faf , 0x7334 , -0x543c , 0x539a , 0x5019 , 0x540e , -0x547c , 0x4e4e , 0x5ffd , 0x745a , -0x58f6 , 0x846b , 0x80e1 , 0x8774 , -0x72d0 , 0x7cca , 0x6e56 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5f27 , 0x864e , 0x552c , -0x62a4 , 0x4e92 , 0x6caa , 0x6237 , -0x82b1 , 0x54d7 , 0x534e , 0x733e , -0x6ed1 , 0x753b , 0x5212 , 0x5316 , -0x8bdd , 0x69d0 , 0x5f8a , 0x6000 , -0x6dee , 0x574f , 0x6b22 , 0x73af , -0x6853 , 0x8fd8 , 0x7f13 , 0x6362 , -0x60a3 , 0x5524 , 0x75ea , 0x8c62 , -0x7115 , 0x6da3 , 0x5ba6 , 0x5e7b , -0x8352 , 0x614c , 0x9ec4 , 0x78fa , -0x8757 , 0x7c27 , 0x7687 , 0x51f0 , -0x60f6 , 0x714c , 0x6643 , 0x5e4c , -0x604d , 0x8c0e , 0x7070 , 0x6325 , -0x8f89 , 0x5fbd , 0x6062 , 0x86d4 , -0x56de , 0x6bc1 , 0x6094 , 0x6167 , -0x5349 , 0x60e0 , 0x6666 , 0x8d3f , -0x79fd , 0x4f1a , 0x70e9 , 0x6c47 , -0x8bb3 , 0x8bf2 , 0x7ed8 , 0x8364 , -0x660f , 0x5a5a , 0x9b42 , 0x6d51 , -0x6df7 , 0x8c41 , 0x6d3b , 0x4f19 , -0x706b , 0x83b7 , 0x6216 , 0x60d1 , -0x970d , 0x8d27 , 0x7978 , 0x51fb , -0x573e , 0x57fa , 0x673a , 0x7578 , -0x7a3d , 0x79ef , 0x7b95 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x808c , 0x9965 , 0x8ff9 , -0x6fc0 , 0x8ba5 , 0x9e21 , 0x59ec , -0x7ee9 , 0x7f09 , 0x5409 , 0x6781 , -0x68d8 , 0x8f91 , 0x7c4d , 0x96c6 , -0x53ca , 0x6025 , 0x75be , 0x6c72 , -0x5373 , 0x5ac9 , 0x7ea7 , 0x6324 , -0x51e0 , 0x810a , 0x5df1 , 0x84df , -0x6280 , 0x5180 , 0x5b63 , 0x4f0e , -0x796d , 0x5242 , 0x60b8 , 0x6d4e , -0x5bc4 , 0x5bc2 , 0x8ba1 , 0x8bb0 , -0x65e2 , 0x5fcc , 0x9645 , 0x5993 , -0x7ee7 , 0x7eaa , 0x5609 , 0x67b7 , -0x5939 , 0x4f73 , 0x5bb6 , 0x52a0 , -0x835a , 0x988a , 0x8d3e , 0x7532 , -0x94be , 0x5047 , 0x7a3c , 0x4ef7 , -0x67b6 , 0x9a7e , 0x5ac1 , 0x6b7c , -0x76d1 , 0x575a , 0x5c16 , 0x7b3a , -0x95f4 , 0x714e , 0x517c , 0x80a9 , -0x8270 , 0x5978 , 0x7f04 , 0x8327 , -0x68c0 , 0x67ec , 0x78b1 , 0x7877 , -0x62e3 , 0x6361 , 0x7b80 , 0x4fed , -0x526a , 0x51cf , 0x8350 , 0x69db , -0x9274 , 0x8df5 , 0x8d31 , 0x89c1 , -0x952e , 0x7bad , 0x4ef6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5065 , 0x8230 , 0x5251 , -0x996f , 0x6e10 , 0x6e85 , 0x6da7 , -0x5efa , 0x50f5 , 0x59dc , 0x5c06 , -0x6d46 , 0x6c5f , 0x7586 , 0x848b , -0x6868 , 0x5956 , 0x8bb2 , 0x5320 , -0x9171 , 0x964d , 0x8549 , 0x6912 , -0x7901 , 0x7126 , 0x80f6 , 0x4ea4 , -0x90ca , 0x6d47 , 0x9a84 , 0x5a07 , -0x56bc , 0x6405 , 0x94f0 , 0x77eb , -0x4fa5 , 0x811a , 0x72e1 , 0x89d2 , -0x997a , 0x7f34 , 0x7ede , 0x527f , -0x6559 , 0x9175 , 0x8f7f , 0x8f83 , -0x53eb , 0x7a96 , 0x63ed , 0x63a5 , -0x7686 , 0x79f8 , 0x8857 , 0x9636 , -0x622a , 0x52ab , 0x8282 , 0x6854 , -0x6770 , 0x6377 , 0x776b , 0x7aed , -0x6d01 , 0x7ed3 , 0x89e3 , 0x59d0 , -0x6212 , 0x85c9 , 0x82a5 , 0x754c , -0x501f , 0x4ecb , 0x75a5 , 0x8beb , -0x5c4a , 0x5dfe , 0x7b4b , 0x65a4 , -0x91d1 , 0x4eca , 0x6d25 , 0x895f , -0x7d27 , 0x9526 , 0x4ec5 , 0x8c28 , -0x8fdb , 0x9773 , 0x664b , 0x7981 , -0x8fd1 , 0x70ec , 0x6d78 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5c3d , 0x52b2 , 0x8346 , -0x5162 , 0x830e , 0x775b , 0x6676 , -0x9cb8 , 0x4eac , 0x60ca , 0x7cbe , -0x7cb3 , 0x7ecf , 0x4e95 , 0x8b66 , -0x666f , 0x9888 , 0x9759 , 0x5883 , -0x656c , 0x955c , 0x5f84 , 0x75c9 , -0x9756 , 0x7adf , 0x7ade , 0x51c0 , -0x70af , 0x7a98 , 0x63ea , 0x7a76 , -0x7ea0 , 0x7396 , 0x97ed , 0x4e45 , -0x7078 , 0x4e5d , 0x9152 , 0x53a9 , -0x6551 , 0x65e7 , 0x81fc , 0x8205 , -0x548e , 0x5c31 , 0x759a , 0x97a0 , -0x62d8 , 0x72d9 , 0x75bd , 0x5c45 , -0x9a79 , 0x83ca , 0x5c40 , 0x5480 , -0x77e9 , 0x4e3e , 0x6cae , 0x805a , -0x62d2 , 0x636e , 0x5de8 , 0x5177 , -0x8ddd , 0x8e1e , 0x952f , 0x4ff1 , -0x53e5 , 0x60e7 , 0x70ac , 0x5267 , -0x6350 , 0x9e43 , 0x5a1f , 0x5026 , -0x7737 , 0x5377 , 0x7ee2 , 0x6485 , -0x652b , 0x6289 , 0x6398 , 0x5014 , -0x7235 , 0x89c9 , 0x51b3 , 0x8bc0 , -0x7edd , 0x5747 , 0x83cc , 0x94a7 , -0x519b , 0x541b , 0x5cfb , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4fca , 0x7ae3 , 0x6d5a , -0x90e1 , 0x9a8f , 0x5580 , 0x5496 , -0x5361 , 0x54af , 0x5f00 , 0x63e9 , -0x6977 , 0x51ef , 0x6168 , 0x520a , -0x582a , 0x52d8 , 0x574e , 0x780d , -0x770b , 0x5eb7 , 0x6177 , 0x7ce0 , -0x625b , 0x6297 , 0x4ea2 , 0x7095 , -0x8003 , 0x62f7 , 0x70e4 , 0x9760 , -0x5777 , 0x82db , 0x67ef , 0x68f5 , -0x78d5 , 0x9897 , 0x79d1 , 0x58f3 , -0x54b3 , 0x53ef , 0x6e34 , 0x514b , -0x523b , 0x5ba2 , 0x8bfe , 0x80af , -0x5543 , 0x57a6 , 0x6073 , 0x5751 , -0x542d , 0x7a7a , 0x6050 , 0x5b54 , -0x63a7 , 0x62a0 , 0x53e3 , 0x6263 , -0x5bc7 , 0x67af , 0x54ed , 0x7a9f , -0x82e6 , 0x9177 , 0x5e93 , 0x88e4 , -0x5938 , 0x57ae , 0x630e , 0x8de8 , -0x80ef , 0x5757 , 0x7b77 , 0x4fa9 , -0x5feb , 0x5bbd , 0x6b3e , 0x5321 , -0x7b50 , 0x72c2 , 0x6846 , 0x77ff , -0x7736 , 0x65f7 , 0x51b5 , 0x4e8f , -0x76d4 , 0x5cbf , 0x7aa5 , 0x8475 , -0x594e , 0x9b41 , 0x5080 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9988 , 0x6127 , 0x6e83 , -0x5764 , 0x6606 , 0x6346 , 0x56f0 , -0x62ec , 0x6269 , 0x5ed3 , 0x9614 , -0x5783 , 0x62c9 , 0x5587 , 0x8721 , -0x814a , 0x8fa3 , 0x5566 , 0x83b1 , -0x6765 , 0x8d56 , 0x84dd , 0x5a6a , -0x680f , 0x62e6 , 0x7bee , 0x9611 , -0x5170 , 0x6f9c , 0x8c30 , 0x63fd , -0x89c8 , 0x61d2 , 0x7f06 , 0x70c2 , -0x6ee5 , 0x7405 , 0x6994 , 0x72fc , -0x5eca , 0x90ce , 0x6717 , 0x6d6a , -0x635e , 0x52b3 , 0x7262 , 0x8001 , -0x4f6c , 0x59e5 , 0x916a , 0x70d9 , -0x6d9d , 0x52d2 , 0x4e50 , 0x96f7 , -0x956d , 0x857e , 0x78ca , 0x7d2f , -0x5121 , 0x5792 , 0x64c2 , 0x808b , -0x7c7b , 0x6cea , 0x68f1 , 0x695e , -0x51b7 , 0x5398 , 0x68a8 , 0x7281 , -0x9ece , 0x7bf1 , 0x72f8 , 0x79bb , -0x6f13 , 0x7406 , 0x674e , 0x91cc , -0x9ca4 , 0x793c , 0x8389 , 0x8354 , -0x540f , 0x6817 , 0x4e3d , 0x5389 , -0x52b1 , 0x783e , 0x5386 , 0x5229 , -0x5088 , 0x4f8b , 0x4fd0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x75e2 , 0x7acb , 0x7c92 , -0x6ca5 , 0x96b6 , 0x529b , 0x7483 , -0x54e9 , 0x4fe9 , 0x8054 , 0x83b2 , -0x8fde , 0x9570 , 0x5ec9 , 0x601c , -0x6d9f , 0x5e18 , 0x655b , 0x8138 , -0x94fe , 0x604b , 0x70bc , 0x7ec3 , -0x7cae , 0x51c9 , 0x6881 , 0x7cb1 , -0x826f , 0x4e24 , 0x8f86 , 0x91cf , -0x667e , 0x4eae , 0x8c05 , 0x64a9 , -0x804a , 0x50da , 0x7597 , 0x71ce , -0x5be5 , 0x8fbd , 0x6f66 , 0x4e86 , -0x6482 , 0x9563 , 0x5ed6 , 0x6599 , -0x5217 , 0x88c2 , 0x70c8 , 0x52a3 , -0x730e , 0x7433 , 0x6797 , 0x78f7 , -0x9716 , 0x4e34 , 0x90bb , 0x9cde , -0x6dcb , 0x51db , 0x8d41 , 0x541d , -0x62ce , 0x73b2 , 0x83f1 , 0x96f6 , -0x9f84 , 0x94c3 , 0x4f36 , 0x7f9a , -0x51cc , 0x7075 , 0x9675 , 0x5cad , -0x9886 , 0x53e6 , 0x4ee4 , 0x6e9c , -0x7409 , 0x69b4 , 0x786b , 0x998f , -0x7559 , 0x5218 , 0x7624 , 0x6d41 , -0x67f3 , 0x516d , 0x9f99 , 0x804b , -0x5499 , 0x7b3c , 0x7abf , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9686 , 0x5784 , 0x62e2 , -0x9647 , 0x697c , 0x5a04 , 0x6402 , -0x7bd3 , 0x6f0f , 0x964b , 0x82a6 , -0x5362 , 0x9885 , 0x5e90 , 0x7089 , -0x63b3 , 0x5364 , 0x864f , 0x9c81 , -0x9e93 , 0x788c , 0x9732 , 0x8def , -0x8d42 , 0x9e7f , 0x6f5e , 0x7984 , -0x5f55 , 0x9646 , 0x622e , 0x9a74 , -0x5415 , 0x94dd , 0x4fa3 , 0x65c5 , -0x5c65 , 0x5c61 , 0x7f15 , 0x8651 , -0x6c2f , 0x5f8b , 0x7387 , 0x6ee4 , -0x7eff , 0x5ce6 , 0x631b , 0x5b6a , -0x6ee6 , 0x5375 , 0x4e71 , 0x63a0 , -0x7565 , 0x62a1 , 0x8f6e , 0x4f26 , -0x4ed1 , 0x6ca6 , 0x7eb6 , 0x8bba , -0x841d , 0x87ba , 0x7f57 , 0x903b , -0x9523 , 0x7ba9 , 0x9aa1 , 0x88f8 , -0x843d , 0x6d1b , 0x9a86 , 0x7edc , -0x5988 , 0x9ebb , 0x739b , 0x7801 , -0x8682 , 0x9a6c , 0x9a82 , 0x561b , -0x5417 , 0x57cb , 0x4e70 , 0x9ea6 , -0x5356 , 0x8fc8 , 0x8109 , 0x7792 , -0x9992 , 0x86ee , 0x6ee1 , 0x8513 , -0x66fc , 0x6162 , 0x6f2b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8c29 , 0x8292 , 0x832b , -0x76f2 , 0x6c13 , 0x5fd9 , 0x83bd , -0x732b , 0x8305 , 0x951a , 0x6bdb , -0x77db , 0x94c6 , 0x536f , 0x8302 , -0x5192 , 0x5e3d , 0x8c8c , 0x8d38 , -0x4e48 , 0x73ab , 0x679a , 0x6885 , -0x9176 , 0x9709 , 0x7164 , 0x6ca1 , -0x7709 , 0x5a92 , 0x9541 , 0x6bcf , -0x7f8e , 0x6627 , 0x5bd0 , 0x59b9 , -0x5a9a , 0x95e8 , 0x95f7 , 0x4eec , -0x840c , 0x8499 , 0x6aac , 0x76df , -0x9530 , 0x731b , 0x68a6 , 0x5b5f , -0x772f , 0x919a , 0x9761 , 0x7cdc , -0x8ff7 , 0x8c1c , 0x5f25 , 0x7c73 , -0x79d8 , 0x89c5 , 0x6ccc , 0x871c , -0x5bc6 , 0x5e42 , 0x68c9 , 0x7720 , -0x7ef5 , 0x5195 , 0x514d , 0x52c9 , -0x5a29 , 0x7f05 , 0x9762 , 0x82d7 , -0x63cf , 0x7784 , 0x85d0 , 0x79d2 , -0x6e3a , 0x5e99 , 0x5999 , 0x8511 , -0x706d , 0x6c11 , 0x62bf , 0x76bf , -0x654f , 0x60af , 0x95fd , 0x660e , -0x879f , 0x9e23 , 0x94ed , 0x540d , -0x547d , 0x8c2c , 0x6478 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6479 , 0x8611 , 0x6a21 , -0x819c , 0x78e8 , 0x6469 , 0x9b54 , -0x62b9 , 0x672b , 0x83ab , 0x58a8 , -0x9ed8 , 0x6cab , 0x6f20 , 0x5bde , -0x964c , 0x8c0b , 0x725f , 0x67d0 , -0x62c7 , 0x7261 , 0x4ea9 , 0x59c6 , -0x6bcd , 0x5893 , 0x66ae , 0x5e55 , -0x52df , 0x6155 , 0x6728 , 0x76ee , -0x7766 , 0x7267 , 0x7a46 , 0x62ff , -0x54ea , 0x5450 , 0x94a0 , 0x90a3 , -0x5a1c , 0x7eb3 , 0x6c16 , 0x4e43 , -0x5976 , 0x8010 , 0x5948 , 0x5357 , -0x7537 , 0x96be , 0x56ca , 0x6320 , -0x8111 , 0x607c , 0x95f9 , 0x6dd6 , -0x5462 , 0x9981 , 0x5185 , 0x5ae9 , -0x80fd , 0x59ae , 0x9713 , 0x502a , -0x6ce5 , 0x5c3c , 0x62df , 0x4f60 , -0x533f , 0x817b , 0x9006 , 0x6eba , -0x852b , 0x62c8 , 0x5e74 , 0x78be , -0x64b5 , 0x637b , 0x5ff5 , 0x5a18 , -0x917f , 0x9e1f , 0x5c3f , 0x634f , -0x8042 , 0x5b7d , 0x556e , 0x954a , -0x954d , 0x6d85 , 0x60a8 , 0x67e0 , -0x72de , 0x51dd , 0x5b81 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x62e7 , 0x6cde , 0x725b , -0x626d , 0x94ae , 0x7ebd , 0x8113 , -0x6d53 , 0x519c , 0x5f04 , 0x5974 , -0x52aa , 0x6012 , 0x5973 , 0x6696 , -0x8650 , 0x759f , 0x632a , 0x61e6 , -0x7cef , 0x8bfa , 0x54e6 , 0x6b27 , -0x9e25 , 0x6bb4 , 0x85d5 , 0x5455 , -0x5076 , 0x6ca4 , 0x556a , 0x8db4 , -0x722c , 0x5e15 , 0x6015 , 0x7436 , -0x62cd , 0x6392 , 0x724c , 0x5f98 , -0x6e43 , 0x6d3e , 0x6500 , 0x6f58 , -0x76d8 , 0x78d0 , 0x76fc , 0x7554 , -0x5224 , 0x53db , 0x4e53 , 0x5e9e , -0x65c1 , 0x802a , 0x80d6 , 0x629b , -0x5486 , 0x5228 , 0x70ae , 0x888d , -0x8dd1 , 0x6ce1 , 0x5478 , 0x80da , -0x57f9 , 0x88f4 , 0x8d54 , 0x966a , -0x914d , 0x4f69 , 0x6c9b , 0x55b7 , -0x76c6 , 0x7830 , 0x62a8 , 0x70f9 , -0x6f8e , 0x5f6d , 0x84ec , 0x68da , -0x787c , 0x7bf7 , 0x81a8 , 0x670b , -0x9e4f , 0x6367 , 0x78b0 , 0x576f , -0x7812 , 0x9739 , 0x6279 , 0x62ab , -0x5288 , 0x7435 , 0x6bd7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5564 , 0x813e , 0x75b2 , -0x76ae , 0x5339 , 0x75de , 0x50fb , -0x5c41 , 0x8b6c , 0x7bc7 , 0x504f , -0x7247 , 0x9a97 , 0x98d8 , 0x6f02 , -0x74e2 , 0x7968 , 0x6487 , 0x77a5 , -0x62fc , 0x9891 , 0x8d2b , 0x54c1 , -0x8058 , 0x4e52 , 0x576a , 0x82f9 , -0x840d , 0x5e73 , 0x51ed , 0x74f6 , -0x8bc4 , 0x5c4f , 0x5761 , 0x6cfc , -0x9887 , 0x5a46 , 0x7834 , 0x9b44 , -0x8feb , 0x7c95 , 0x5256 , 0x6251 , -0x94fa , 0x4ec6 , 0x8386 , 0x8461 , -0x83e9 , 0x84b2 , 0x57d4 , 0x6734 , -0x5703 , 0x666e , 0x6d66 , 0x8c31 , -0x66dd , 0x7011 , 0x671f , 0x6b3a , -0x6816 , 0x621a , 0x59bb , 0x4e03 , -0x51c4 , 0x6f06 , 0x67d2 , 0x6c8f , -0x5176 , 0x68cb , 0x5947 , 0x6b67 , -0x7566 , 0x5d0e , 0x8110 , 0x9f50 , -0x65d7 , 0x7948 , 0x7941 , 0x9a91 , -0x8d77 , 0x5c82 , 0x4e5e , 0x4f01 , -0x542f , 0x5951 , 0x780c , 0x5668 , -0x6c14 , 0x8fc4 , 0x5f03 , 0x6c7d , -0x6ce3 , 0x8bab , 0x6390 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6070 , 0x6d3d , 0x7275 , -0x6266 , 0x948e , 0x94c5 , 0x5343 , -0x8fc1 , 0x7b7e , 0x4edf , 0x8c26 , -0x4e7e , 0x9ed4 , 0x94b1 , 0x94b3 , -0x524d , 0x6f5c , 0x9063 , 0x6d45 , -0x8c34 , 0x5811 , 0x5d4c , 0x6b20 , -0x6b49 , 0x67aa , 0x545b , 0x8154 , -0x7f8c , 0x5899 , 0x8537 , 0x5f3a , -0x62a2 , 0x6a47 , 0x9539 , 0x6572 , -0x6084 , 0x6865 , 0x77a7 , 0x4e54 , -0x4fa8 , 0x5de7 , 0x9798 , 0x64ac , -0x7fd8 , 0x5ced , 0x4fcf , 0x7a8d , -0x5207 , 0x8304 , 0x4e14 , 0x602f , -0x7a83 , 0x94a6 , 0x4fb5 , 0x4eb2 , -0x79e6 , 0x7434 , 0x52e4 , 0x82b9 , -0x64d2 , 0x79bd , 0x5bdd , 0x6c81 , -0x9752 , 0x8f7b , 0x6c22 , 0x503e , -0x537f , 0x6e05 , 0x64ce , 0x6674 , -0x6c30 , 0x60c5 , 0x9877 , 0x8bf7 , -0x5e86 , 0x743c , 0x7a77 , 0x79cb , -0x4e18 , 0x90b1 , 0x7403 , 0x6c42 , -0x56da , 0x914b , 0x6cc5 , 0x8d8b , -0x533a , 0x86c6 , 0x66f2 , 0x8eaf , -0x5c48 , 0x9a71 , 0x6e20 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x53d6 , 0x5a36 , 0x9f8b , -0x8da3 , 0x53bb , 0x5708 , 0x98a7 , -0x6743 , 0x919b , 0x6cc9 , 0x5168 , -0x75ca , 0x62f3 , 0x72ac , 0x5238 , -0x529d , 0x7f3a , 0x7094 , 0x7638 , -0x5374 , 0x9e4a , 0x69b7 , 0x786e , -0x96c0 , 0x88d9 , 0x7fa4 , 0x7136 , -0x71c3 , 0x5189 , 0x67d3 , 0x74e4 , -0x58e4 , 0x6518 , 0x56b7 , 0x8ba9 , -0x9976 , 0x6270 , 0x7ed5 , 0x60f9 , -0x70ed , 0x58ec , 0x4ec1 , 0x4eba , -0x5fcd , 0x97e7 , 0x4efb , 0x8ba4 , -0x5203 , 0x598a , 0x7eab , 0x6254 , -0x4ecd , 0x65e5 , 0x620e , 0x8338 , -0x84c9 , 0x8363 , 0x878d , 0x7194 , -0x6eb6 , 0x5bb9 , 0x7ed2 , 0x5197 , -0x63c9 , 0x67d4 , 0x8089 , 0x8339 , -0x8815 , 0x5112 , 0x5b7a , 0x5982 , -0x8fb1 , 0x4e73 , 0x6c5d , 0x5165 , -0x8925 , 0x8f6f , 0x962e , 0x854a , -0x745e , 0x9510 , 0x95f0 , 0x6da6 , -0x82e5 , 0x5f31 , 0x6492 , 0x6d12 , -0x8428 , 0x816e , 0x9cc3 , 0x585e , -0x8d5b , 0x4e09 , 0x53c1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4f1e , 0x6563 , 0x6851 , -0x55d3 , 0x4e27 , 0x6414 , 0x9a9a , -0x626b , 0x5ac2 , 0x745f , 0x8272 , -0x6da9 , 0x68ee , 0x50e7 , 0x838e , -0x7802 , 0x6740 , 0x5239 , 0x6c99 , -0x7eb1 , 0x50bb , 0x5565 , 0x715e , -0x7b5b , 0x6652 , 0x73ca , 0x82eb , -0x6749 , 0x5c71 , 0x5220 , 0x717d , -0x886b , 0x95ea , 0x9655 , 0x64c5 , -0x8d61 , 0x81b3 , 0x5584 , 0x6c55 , -0x6247 , 0x7f2e , 0x5892 , 0x4f24 , -0x5546 , 0x8d4f , 0x664c , 0x4e0a , -0x5c1a , 0x88f3 , 0x68a2 , 0x634e , -0x7a0d , 0x70e7 , 0x828d , 0x52fa , -0x97f6 , 0x5c11 , 0x54e8 , 0x90b5 , -0x7ecd , 0x5962 , 0x8d4a , 0x86c7 , -0x820c , 0x820d , 0x8d66 , 0x6444 , -0x5c04 , 0x6151 , 0x6d89 , 0x793e , -0x8bbe , 0x7837 , 0x7533 , 0x547b , -0x4f38 , 0x8eab , 0x6df1 , 0x5a20 , -0x7ec5 , 0x795e , 0x6c88 , 0x5ba1 , -0x5a76 , 0x751a , 0x80be , 0x614e , -0x6e17 , 0x58f0 , 0x751f , 0x7525 , -0x7272 , 0x5347 , 0x7ef3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7701 , 0x76db , 0x5269 , -0x80dc , 0x5723 , 0x5e08 , 0x5931 , -0x72ee , 0x65bd , 0x6e7f , 0x8bd7 , -0x5c38 , 0x8671 , 0x5341 , 0x77f3 , -0x62fe , 0x65f6 , 0x4ec0 , 0x98df , -0x8680 , 0x5b9e , 0x8bc6 , 0x53f2 , -0x77e2 , 0x4f7f , 0x5c4e , 0x9a76 , -0x59cb , 0x5f0f , 0x793a , 0x58eb , -0x4e16 , 0x67ff , 0x4e8b , 0x62ed , -0x8a93 , 0x901d , 0x52bf , 0x662f , -0x55dc , 0x566c , 0x9002 , 0x4ed5 , -0x4f8d , 0x91ca , 0x9970 , 0x6c0f , -0x5e02 , 0x6043 , 0x5ba4 , 0x89c6 , -0x8bd5 , 0x6536 , 0x624b , 0x9996 , -0x5b88 , 0x5bff , 0x6388 , 0x552e , -0x53d7 , 0x7626 , 0x517d , 0x852c , -0x67a2 , 0x68b3 , 0x6b8a , 0x6292 , -0x8f93 , 0x53d4 , 0x8212 , 0x6dd1 , -0x758f , 0x4e66 , 0x8d4e , 0x5b70 , -0x719f , 0x85af , 0x6691 , 0x66d9 , -0x7f72 , 0x8700 , 0x9ecd , 0x9f20 , -0x5c5e , 0x672f , 0x8ff0 , 0x6811 , -0x675f , 0x620d , 0x7ad6 , 0x5885 , -0x5eb6 , 0x6570 , 0x6f31 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6055 , 0x5237 , 0x800d , -0x6454 , 0x8870 , 0x7529 , 0x5e05 , -0x6813 , 0x62f4 , 0x971c , 0x53cc , -0x723d , 0x8c01 , 0x6c34 , 0x7761 , -0x7a0e , 0x542e , 0x77ac , 0x987a , -0x821c , 0x8bf4 , 0x7855 , 0x6714 , -0x70c1 , 0x65af , 0x6495 , 0x5636 , -0x601d , 0x79c1 , 0x53f8 , 0x4e1d , -0x6b7b , 0x8086 , 0x5bfa , 0x55e3 , -0x56db , 0x4f3a , 0x4f3c , 0x9972 , -0x5df3 , 0x677e , 0x8038 , 0x6002 , -0x9882 , 0x9001 , 0x5b8b , 0x8bbc , -0x8bf5 , 0x641c , 0x8258 , 0x64de , -0x55fd , 0x82cf , 0x9165 , 0x4fd7 , -0x7d20 , 0x901f , 0x7c9f , 0x50f3 , -0x5851 , 0x6eaf , 0x5bbf , 0x8bc9 , -0x8083 , 0x9178 , 0x849c , 0x7b97 , -0x867d , 0x968b , 0x968f , 0x7ee5 , -0x9ad3 , 0x788e , 0x5c81 , 0x7a57 , -0x9042 , 0x96a7 , 0x795f , 0x5b59 , -0x635f , 0x7b0b , 0x84d1 , 0x68ad , -0x5506 , 0x7f29 , 0x7410 , 0x7d22 , -0x9501 , 0x6240 , 0x584c , 0x4ed6 , -0x5b83 , 0x5979 , 0x5854 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x736d , 0x631e , 0x8e4b , -0x8e0f , 0x80ce , 0x82d4 , 0x62ac , -0x53f0 , 0x6cf0 , 0x915e , 0x592a , -0x6001 , 0x6c70 , 0x574d , 0x644a , -0x8d2a , 0x762b , 0x6ee9 , 0x575b , -0x6a80 , 0x75f0 , 0x6f6d , 0x8c2d , -0x8c08 , 0x5766 , 0x6bef , 0x8892 , -0x78b3 , 0x63a2 , 0x53f9 , 0x70ad , -0x6c64 , 0x5858 , 0x642a , 0x5802 , -0x68e0 , 0x819b , 0x5510 , 0x7cd6 , -0x5018 , 0x8eba , 0x6dcc , 0x8d9f , -0x70eb , 0x638f , 0x6d9b , 0x6ed4 , -0x7ee6 , 0x8404 , 0x6843 , 0x9003 , -0x6dd8 , 0x9676 , 0x8ba8 , 0x5957 , -0x7279 , 0x85e4 , 0x817e , 0x75bc , -0x8a8a , 0x68af , 0x5254 , 0x8e22 , -0x9511 , 0x63d0 , 0x9898 , 0x8e44 , -0x557c , 0x4f53 , 0x66ff , 0x568f , -0x60d5 , 0x6d95 , 0x5243 , 0x5c49 , -0x5929 , 0x6dfb , 0x586b , 0x7530 , -0x751c , 0x606c , 0x8214 , 0x8146 , -0x6311 , 0x6761 , 0x8fe2 , 0x773a , -0x8df3 , 0x8d34 , 0x94c1 , 0x5e16 , -0x5385 , 0x542c , 0x70c3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6c40 , 0x5ef7 , 0x505c , -0x4ead , 0x5ead , 0x633a , 0x8247 , -0x901a , 0x6850 , 0x916e , 0x77b3 , -0x540c , 0x94dc , 0x5f64 , 0x7ae5 , -0x6876 , 0x6345 , 0x7b52 , 0x7edf , -0x75db , 0x5077 , 0x6295 , 0x5934 , -0x900f , 0x51f8 , 0x79c3 , 0x7a81 , -0x56fe , 0x5f92 , 0x9014 , 0x6d82 , -0x5c60 , 0x571f , 0x5410 , 0x5154 , -0x6e4d , 0x56e2 , 0x63a8 , 0x9893 , -0x817f , 0x8715 , 0x892a , 0x9000 , -0x541e , 0x5c6f , 0x81c0 , 0x62d6 , -0x6258 , 0x8131 , 0x9e35 , 0x9640 , -0x9a6e , 0x9a7c , 0x692d , 0x59a5 , -0x62d3 , 0x553e , 0x6316 , 0x54c7 , -0x86d9 , 0x6d3c , 0x5a03 , 0x74e6 , -0x889c , 0x6b6a , 0x5916 , 0x8c4c , -0x5f2f , 0x6e7e , 0x73a9 , 0x987d , -0x4e38 , 0x70f7 , 0x5b8c , 0x7897 , -0x633d , 0x665a , 0x7696 , 0x60cb , -0x5b9b , 0x5a49 , 0x4e07 , 0x8155 , -0x6c6a , 0x738b , 0x4ea1 , 0x6789 , -0x7f51 , 0x5f80 , 0x65fa , 0x671b , -0x5fd8 , 0x5984 , 0x5a01 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5dcd , 0x5fae , 0x5371 , -0x97e6 , 0x8fdd , 0x6845 , 0x56f4 , -0x552f , 0x60df , 0x4e3a , 0x6f4d , -0x7ef4 , 0x82c7 , 0x840e , 0x59d4 , -0x4f1f , 0x4f2a , 0x5c3e , 0x7eac , -0x672a , 0x851a , 0x5473 , 0x754f , -0x80c3 , 0x5582 , 0x9b4f , 0x4f4d , -0x6e2d , 0x8c13 , 0x5c09 , 0x6170 , -0x536b , 0x761f , 0x6e29 , 0x868a , -0x6587 , 0x95fb , 0x7eb9 , 0x543b , -0x7a33 , 0x7d0a , 0x95ee , 0x55e1 , -0x7fc1 , 0x74ee , 0x631d , 0x8717 , -0x6da1 , 0x7a9d , 0x6211 , 0x65a1 , -0x5367 , 0x63e1 , 0x6c83 , 0x5deb , -0x545c , 0x94a8 , 0x4e4c , 0x6c61 , -0x8bec , 0x5c4b , 0x65e0 , 0x829c , -0x68a7 , 0x543e , 0x5434 , 0x6bcb , -0x6b66 , 0x4e94 , 0x6342 , 0x5348 , -0x821e , 0x4f0d , 0x4fae , 0x575e , -0x620a , 0x96fe , 0x6664 , 0x7269 , -0x52ff , 0x52a1 , 0x609f , 0x8bef , -0x6614 , 0x7199 , 0x6790 , 0x897f , -0x7852 , 0x77fd , 0x6670 , 0x563b , -0x5438 , 0x9521 , 0x727a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7a00 , 0x606f , 0x5e0c , -0x6089 , 0x819d , 0x5915 , 0x60dc , -0x7184 , 0x70ef , 0x6eaa , 0x6c50 , -0x7280 , 0x6a84 , 0x88ad , 0x5e2d , -0x4e60 , 0x5ab3 , 0x559c , 0x94e3 , -0x6d17 , 0x7cfb , 0x9699 , 0x620f , -0x7ec6 , 0x778e , 0x867e , 0x5323 , -0x971e , 0x8f96 , 0x6687 , 0x5ce1 , -0x4fa0 , 0x72ed , 0x4e0b , 0x53a6 , -0x590f , 0x5413 , 0x6380 , 0x9528 , -0x5148 , 0x4ed9 , 0x9c9c , 0x7ea4 , -0x54b8 , 0x8d24 , 0x8854 , 0x8237 , -0x95f2 , 0x6d8e , 0x5f26 , 0x5acc , -0x663e , 0x9669 , 0x73b0 , 0x732e , -0x53bf , 0x817a , 0x9985 , 0x7fa1 , -0x5baa , 0x9677 , 0x9650 , 0x7ebf , -0x76f8 , 0x53a2 , 0x9576 , 0x9999 , -0x7bb1 , 0x8944 , 0x6e58 , 0x4e61 , -0x7fd4 , 0x7965 , 0x8be6 , 0x60f3 , -0x54cd , 0x4eab , 0x9879 , 0x5df7 , -0x6a61 , 0x50cf , 0x5411 , 0x8c61 , -0x8427 , 0x785d , 0x9704 , 0x524a , -0x54ee , 0x56a3 , 0x9500 , 0x6d88 , -0x5bb5 , 0x6dc6 , 0x6653 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5c0f , 0x5b5d , 0x6821 , -0x8096 , 0x5578 , 0x7b11 , 0x6548 , -0x6954 , 0x4e9b , 0x6b47 , 0x874e , -0x978b , 0x534f , 0x631f , 0x643a , -0x90aa , 0x659c , 0x80c1 , 0x8c10 , -0x5199 , 0x68b0 , 0x5378 , 0x87f9 , -0x61c8 , 0x6cc4 , 0x6cfb , 0x8c22 , -0x5c51 , 0x85aa , 0x82af , 0x950c , -0x6b23 , 0x8f9b , 0x65b0 , 0x5ffb , -0x5fc3 , 0x4fe1 , 0x8845 , 0x661f , -0x8165 , 0x7329 , 0x60fa , 0x5174 , -0x5211 , 0x578b , 0x5f62 , 0x90a2 , -0x884c , 0x9192 , 0x5e78 , 0x674f , -0x6027 , 0x59d3 , 0x5144 , 0x51f6 , -0x80f8 , 0x5308 , 0x6c79 , 0x96c4 , -0x718a , 0x4f11 , 0x4fee , 0x7f9e , -0x673d , 0x55c5 , 0x9508 , 0x79c0 , -0x8896 , 0x7ee3 , 0x589f , 0x620c , -0x9700 , 0x865a , 0x5618 , 0x987b , -0x5f90 , 0x8bb8 , 0x84c4 , 0x9157 , -0x53d9 , 0x65ed , 0x5e8f , 0x755c , -0x6064 , 0x7d6e , 0x5a7f , 0x7eea , -0x7eed , 0x8f69 , 0x55a7 , 0x5ba3 , -0x60ac , 0x65cb , 0x7384 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9009 , 0x7663 , 0x7729 , -0x7eda , 0x9774 , 0x859b , 0x5b66 , -0x7a74 , 0x96ea , 0x8840 , 0x52cb , -0x718f , 0x5faa , 0x65ec , 0x8be2 , -0x5bfb , 0x9a6f , 0x5de1 , 0x6b89 , -0x6c5b , 0x8bad , 0x8baf , 0x900a , -0x8fc5 , 0x538b , 0x62bc , 0x9e26 , -0x9e2d , 0x5440 , 0x4e2b , 0x82bd , -0x7259 , 0x869c , 0x5d16 , 0x8859 , -0x6daf , 0x96c5 , 0x54d1 , 0x4e9a , -0x8bb6 , 0x7109 , 0x54bd , 0x9609 , -0x70df , 0x6df9 , 0x76d0 , 0x4e25 , -0x7814 , 0x8712 , 0x5ca9 , 0x5ef6 , -0x8a00 , 0x989c , 0x960e , 0x708e , -0x6cbf , 0x5944 , 0x63a9 , 0x773c , -0x884d , 0x6f14 , 0x8273 , 0x5830 , -0x71d5 , 0x538c , 0x781a , 0x96c1 , -0x5501 , 0x5f66 , 0x7130 , 0x5bb4 , -0x8c1a , 0x9a8c , 0x6b83 , 0x592e , -0x9e2f , 0x79e7 , 0x6768 , 0x626c , -0x4f6f , 0x75a1 , 0x7f8a , 0x6d0b , -0x9633 , 0x6c27 , 0x4ef0 , 0x75d2 , -0x517b , 0x6837 , 0x6f3e , 0x9080 , -0x8170 , 0x5996 , 0x7476 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6447 , 0x5c27 , 0x9065 , -0x7a91 , 0x8c23 , 0x59da , 0x54ac , -0x8200 , 0x836f , 0x8981 , 0x8000 , -0x6930 , 0x564e , 0x8036 , 0x7237 , -0x91ce , 0x51b6 , 0x4e5f , 0x9875 , -0x6396 , 0x4e1a , 0x53f6 , 0x66f3 , -0x814b , 0x591c , 0x6db2 , 0x4e00 , -0x58f9 , 0x533b , 0x63d6 , 0x94f1 , -0x4f9d , 0x4f0a , 0x8863 , 0x9890 , -0x5937 , 0x9057 , 0x79fb , 0x4eea , -0x80f0 , 0x7591 , 0x6c82 , 0x5b9c , -0x59e8 , 0x5f5d , 0x6905 , 0x8681 , -0x501a , 0x5df2 , 0x4e59 , 0x77e3 , -0x4ee5 , 0x827a , 0x6291 , 0x6613 , -0x9091 , 0x5c79 , 0x4ebf , 0x5f79 , -0x81c6 , 0x9038 , 0x8084 , 0x75ab , -0x4ea6 , 0x88d4 , 0x610f , 0x6bc5 , -0x5fc6 , 0x4e49 , 0x76ca , 0x6ea2 , -0x8be3 , 0x8bae , 0x8c0a , 0x8bd1 , -0x5f02 , 0x7ffc , 0x7fcc , 0x7ece , -0x8335 , 0x836b , 0x56e0 , 0x6bb7 , -0x97f3 , 0x9634 , 0x59fb , 0x541f , -0x94f6 , 0x6deb , 0x5bc5 , 0x996e , -0x5c39 , 0x5f15 , 0x9690 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5370 , 0x82f1 , 0x6a31 , -0x5a74 , 0x9e70 , 0x5e94 , 0x7f28 , -0x83b9 , 0x8424 , 0x8425 , 0x8367 , -0x8747 , 0x8fce , 0x8d62 , 0x76c8 , -0x5f71 , 0x9896 , 0x786c , 0x6620 , -0x54df , 0x62e5 , 0x4f63 , 0x81c3 , -0x75c8 , 0x5eb8 , 0x96cd , 0x8e0a , -0x86f9 , 0x548f , 0x6cf3 , 0x6d8c , -0x6c38 , 0x607f , 0x52c7 , 0x7528 , -0x5e7d , 0x4f18 , 0x60a0 , 0x5fe7 , -0x5c24 , 0x7531 , 0x90ae , 0x94c0 , -0x72b9 , 0x6cb9 , 0x6e38 , 0x9149 , -0x6709 , 0x53cb , 0x53f3 , 0x4f51 , -0x91c9 , 0x8bf1 , 0x53c8 , 0x5e7c , -0x8fc2 , 0x6de4 , 0x4e8e , 0x76c2 , -0x6986 , 0x865e , 0x611a , 0x8206 , -0x4f59 , 0x4fde , 0x903e , 0x9c7c , -0x6109 , 0x6e1d , 0x6e14 , 0x9685 , -0x4e88 , 0x5a31 , 0x96e8 , 0x4e0e , -0x5c7f , 0x79b9 , 0x5b87 , 0x8bed , -0x7fbd , 0x7389 , 0x57df , 0x828b , -0x90c1 , 0x5401 , 0x9047 , 0x55bb , -0x5cea , 0x5fa1 , 0x6108 , 0x6b32 , -0x72f1 , 0x80b2 , 0x8a89 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d74 , 0x5bd3 , 0x88d5 , -0x9884 , 0x8c6b , 0x9a6d , 0x9e33 , -0x6e0a , 0x51a4 , 0x5143 , 0x57a3 , -0x8881 , 0x539f , 0x63f4 , 0x8f95 , -0x56ed , 0x5458 , 0x5706 , 0x733f , -0x6e90 , 0x7f18 , 0x8fdc , 0x82d1 , -0x613f , 0x6028 , 0x9662 , 0x66f0 , -0x7ea6 , 0x8d8a , 0x8dc3 , 0x94a5 , -0x5cb3 , 0x7ca4 , 0x6708 , 0x60a6 , -0x9605 , 0x8018 , 0x4e91 , 0x90e7 , -0x5300 , 0x9668 , 0x5141 , 0x8fd0 , -0x8574 , 0x915d , 0x6655 , 0x97f5 , -0x5b55 , 0x531d , 0x7838 , 0x6742 , -0x683d , 0x54c9 , 0x707e , 0x5bb0 , -0x8f7d , 0x518d , 0x5728 , 0x54b1 , -0x6512 , 0x6682 , 0x8d5e , 0x8d43 , -0x810f , 0x846c , 0x906d , 0x7cdf , -0x51ff , 0x85fb , 0x67a3 , 0x65e9 , -0x6fa1 , 0x86a4 , 0x8e81 , 0x566a , -0x9020 , 0x7682 , 0x7076 , 0x71e5 , -0x8d23 , 0x62e9 , 0x5219 , 0x6cfd , -0x8d3c , 0x600e , 0x589e , 0x618e , -0x66fe , 0x8d60 , 0x624e , 0x55b3 , -0x6e23 , 0x672d , 0x8f67 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x94e1 , 0x95f8 , 0x7728 , -0x6805 , 0x69a8 , 0x548b , 0x4e4d , -0x70b8 , 0x8bc8 , 0x6458 , 0x658b , -0x5b85 , 0x7a84 , 0x503a , 0x5be8 , -0x77bb , 0x6be1 , 0x8a79 , 0x7c98 , -0x6cbe , 0x76cf , 0x65a9 , 0x8f97 , -0x5d2d , 0x5c55 , 0x8638 , 0x6808 , -0x5360 , 0x6218 , 0x7ad9 , 0x6e5b , -0x7efd , 0x6a1f , 0x7ae0 , 0x5f70 , -0x6f33 , 0x5f20 , 0x638c , 0x6da8 , -0x6756 , 0x4e08 , 0x5e10 , 0x8d26 , -0x4ed7 , 0x80c0 , 0x7634 , 0x969c , -0x62db , 0x662d , 0x627e , 0x6cbc , -0x8d75 , 0x7167 , 0x7f69 , 0x5146 , -0x8087 , 0x53ec , 0x906e , 0x6298 , -0x54f2 , 0x86f0 , 0x8f99 , 0x8005 , -0x9517 , 0x8517 , 0x8fd9 , 0x6d59 , -0x73cd , 0x659f , 0x771f , 0x7504 , -0x7827 , 0x81fb , 0x8d1e , 0x9488 , -0x4fa6 , 0x6795 , 0x75b9 , 0x8bca , -0x9707 , 0x632f , 0x9547 , 0x9635 , -0x84b8 , 0x6323 , 0x7741 , 0x5f81 , -0x72f0 , 0x4e89 , 0x6014 , 0x6574 , -0x62ef , 0x6b63 , 0x653f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5e27 , 0x75c7 , 0x90d1 , -0x8bc1 , 0x829d , 0x679d , 0x652f , -0x5431 , 0x8718 , 0x77e5 , 0x80a2 , -0x8102 , 0x6c41 , 0x4e4b , 0x7ec7 , -0x804c , 0x76f4 , 0x690d , 0x6b96 , -0x6267 , 0x503c , 0x4f84 , 0x5740 , -0x6307 , 0x6b62 , 0x8dbe , 0x53ea , -0x65e8 , 0x7eb8 , 0x5fd7 , 0x631a , -0x63b7 , 0x81f3 , 0x81f4 , 0x7f6e , -0x5e1c , 0x5cd9 , 0x5236 , 0x667a , -0x79e9 , 0x7a1a , 0x8d28 , 0x7099 , -0x75d4 , 0x6ede , 0x6cbb , 0x7a92 , -0x4e2d , 0x76c5 , 0x5fe0 , 0x949f , -0x8877 , 0x7ec8 , 0x79cd , 0x80bf , -0x91cd , 0x4ef2 , 0x4f17 , 0x821f , -0x5468 , 0x5dde , 0x6d32 , 0x8bcc , -0x7ca5 , 0x8f74 , 0x8098 , 0x5e1a , -0x5492 , 0x76b1 , 0x5b99 , 0x663c , -0x9aa4 , 0x73e0 , 0x682a , 0x86db , -0x6731 , 0x732a , 0x8bf8 , 0x8bdb , -0x9010 , 0x7af9 , 0x70db , 0x716e , -0x62c4 , 0x77a9 , 0x5631 , 0x4e3b , -0x8457 , 0x67f1 , 0x52a9 , 0x86c0 , -0x8d2e , 0x94f8 , 0x7b51 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4f4f , 0x6ce8 , 0x795d , -0x9a7b , 0x6293 , 0x722a , 0x62fd , -0x4e13 , 0x7816 , 0x8f6c , 0x64b0 , -0x8d5a , 0x7bc6 , 0x6869 , 0x5e84 , -0x88c5 , 0x5986 , 0x649e , 0x58ee , -0x72b6 , 0x690e , 0x9525 , 0x8ffd , -0x8d58 , 0x5760 , 0x7f00 , 0x8c06 , -0x51c6 , 0x6349 , 0x62d9 , 0x5353 , -0x684c , 0x7422 , 0x8301 , 0x914c , -0x5544 , 0x7740 , 0x707c , 0x6d4a , -0x5179 , 0x54a8 , 0x8d44 , 0x59ff , -0x6ecb , 0x6dc4 , 0x5b5c , 0x7d2b , -0x4ed4 , 0x7c7d , 0x6ed3 , 0x5b50 , -0x81ea , 0x6e0d , 0x5b57 , 0x9b03 , -0x68d5 , 0x8e2a , 0x5b97 , 0x7efc , -0x603b , 0x7eb5 , 0x90b9 , 0x8d70 , -0x594f , 0x63cd , 0x79df , 0x8db3 , -0x5352 , 0x65cf , 0x7956 , 0x8bc5 , -0x963b , 0x7ec4 , 0x94bb , 0x7e82 , -0x5634 , 0x9189 , 0x6700 , 0x7f6a , -0x5c0a , 0x9075 , 0x6628 , 0x5de6 , -0x4f50 , 0x67de , 0x505a , 0x4f5c , -0x5750 , 0x5ea7 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4e8d , 0x4e0c , 0x5140 , -0x4e10 , 0x5eff , 0x5345 , 0x4e15 , -0x4e98 , 0x4e1e , 0x9b32 , 0x5b6c , -0x5669 , 0x4e28 , 0x79ba , 0x4e3f , -0x5315 , 0x4e47 , 0x592d , 0x723b , -0x536e , 0x6c10 , 0x56df , 0x80e4 , -0x9997 , 0x6bd3 , 0x777e , 0x9f17 , -0x4e36 , 0x4e9f , 0x9f10 , 0x4e5c , -0x4e69 , 0x4e93 , 0x8288 , 0x5b5b , -0x556c , 0x560f , 0x4ec4 , 0x538d , -0x539d , 0x53a3 , 0x53a5 , 0x53ae , -0x9765 , 0x8d5d , 0x531a , 0x53f5 , -0x5326 , 0x532e , 0x533e , 0x8d5c , -0x5366 , 0x5363 , 0x5202 , 0x5208 , -0x520e , 0x522d , 0x5233 , 0x523f , -0x5240 , 0x524c , 0x525e , 0x5261 , -0x525c , 0x84af , 0x527d , 0x5282 , -0x5281 , 0x5290 , 0x5293 , 0x5182 , -0x7f54 , 0x4ebb , 0x4ec3 , 0x4ec9 , -0x4ec2 , 0x4ee8 , 0x4ee1 , 0x4eeb , -0x4ede , 0x4f1b , 0x4ef3 , 0x4f22 , -0x4f64 , 0x4ef5 , 0x4f25 , 0x4f27 , -0x4f09 , 0x4f2b , 0x4f5e , 0x4f67 , -0x6538 , 0x4f5a , 0x4f5d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x4f5f , 0x4f57 , 0x4f32 , -0x4f3d , 0x4f76 , 0x4f74 , 0x4f91 , -0x4f89 , 0x4f83 , 0x4f8f , 0x4f7e , -0x4f7b , 0x4faa , 0x4f7c , 0x4fac , -0x4f94 , 0x4fe6 , 0x4fe8 , 0x4fea , -0x4fc5 , 0x4fda , 0x4fe3 , 0x4fdc , -0x4fd1 , 0x4fdf , 0x4ff8 , 0x5029 , -0x504c , 0x4ff3 , 0x502c , 0x500f , -0x502e , 0x502d , 0x4ffe , 0x501c , -0x500c , 0x5025 , 0x5028 , 0x507e , -0x5043 , 0x5055 , 0x5048 , 0x504e , -0x506c , 0x507b , 0x50a5 , 0x50a7 , -0x50a9 , 0x50ba , 0x50d6 , 0x5106 , -0x50ed , 0x50ec , 0x50e6 , 0x50ee , -0x5107 , 0x510b , 0x4edd , 0x6c3d , -0x4f58 , 0x4f65 , 0x4fce , 0x9fa0 , -0x6c46 , 0x7c74 , 0x516e , 0x5dfd , -0x9ec9 , 0x9998 , 0x5181 , 0x5914 , -0x52f9 , 0x530d , 0x8a07 , 0x5310 , -0x51eb , 0x5919 , 0x5155 , 0x4ea0 , -0x5156 , 0x4eb3 , 0x886e , 0x88a4 , -0x4eb5 , 0x8114 , 0x88d2 , 0x7980 , -0x5b34 , 0x8803 , 0x7fb8 , 0x51ab , -0x51b1 , 0x51bd , 0x51bc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x51c7 , 0x5196 , 0x51a2 , -0x51a5 , 0x8ba0 , 0x8ba6 , 0x8ba7 , -0x8baa , 0x8bb4 , 0x8bb5 , 0x8bb7 , -0x8bc2 , 0x8bc3 , 0x8bcb , 0x8bcf , -0x8bce , 0x8bd2 , 0x8bd3 , 0x8bd4 , -0x8bd6 , 0x8bd8 , 0x8bd9 , 0x8bdc , -0x8bdf , 0x8be0 , 0x8be4 , 0x8be8 , -0x8be9 , 0x8bee , 0x8bf0 , 0x8bf3 , -0x8bf6 , 0x8bf9 , 0x8bfc , 0x8bff , -0x8c00 , 0x8c02 , 0x8c04 , 0x8c07 , -0x8c0c , 0x8c0f , 0x8c11 , 0x8c12 , -0x8c14 , 0x8c15 , 0x8c16 , 0x8c19 , -0x8c1b , 0x8c18 , 0x8c1d , 0x8c1f , -0x8c20 , 0x8c21 , 0x8c25 , 0x8c27 , -0x8c2a , 0x8c2b , 0x8c2e , 0x8c2f , -0x8c32 , 0x8c33 , 0x8c35 , 0x8c36 , -0x5369 , 0x537a , 0x961d , 0x9622 , -0x9621 , 0x9631 , 0x962a , 0x963d , -0x963c , 0x9642 , 0x9649 , 0x9654 , -0x965f , 0x9667 , 0x966c , 0x9672 , -0x9674 , 0x9688 , 0x968d , 0x9697 , -0x96b0 , 0x9097 , 0x909b , 0x909d , -0x9099 , 0x90ac , 0x90a1 , 0x90b4 , -0x90b3 , 0x90b6 , 0x90ba , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x90b8 , 0x90b0 , 0x90cf , -0x90c5 , 0x90be , 0x90d0 , 0x90c4 , -0x90c7 , 0x90d3 , 0x90e6 , 0x90e2 , -0x90dc , 0x90d7 , 0x90db , 0x90eb , -0x90ef , 0x90fe , 0x9104 , 0x9122 , -0x911e , 0x9123 , 0x9131 , 0x912f , -0x9139 , 0x9143 , 0x9146 , 0x520d , -0x5942 , 0x52a2 , 0x52ac , 0x52ad , -0x52be , 0x54ff , 0x52d0 , 0x52d6 , -0x52f0 , 0x53df , 0x71ee , 0x77cd , -0x5ef4 , 0x51f5 , 0x51fc , 0x9b2f , -0x53b6 , 0x5f01 , 0x755a , 0x5def , -0x574c , 0x57a9 , 0x57a1 , 0x587e , -0x58bc , 0x58c5 , 0x58d1 , 0x5729 , -0x572c , 0x572a , 0x5733 , 0x5739 , -0x572e , 0x572f , 0x575c , 0x573b , -0x5742 , 0x5769 , 0x5785 , 0x576b , -0x5786 , 0x577c , 0x577b , 0x5768 , -0x576d , 0x5776 , 0x5773 , 0x57ad , -0x57a4 , 0x578c , 0x57b2 , 0x57cf , -0x57a7 , 0x57b4 , 0x5793 , 0x57a0 , -0x57d5 , 0x57d8 , 0x57da , 0x57d9 , -0x57d2 , 0x57b8 , 0x57f4 , 0x57ef , -0x57f8 , 0x57e4 , 0x57dd , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x580b , 0x580d , 0x57fd , -0x57ed , 0x5800 , 0x581e , 0x5819 , -0x5844 , 0x5820 , 0x5865 , 0x586c , -0x5881 , 0x5889 , 0x589a , 0x5880 , -0x99a8 , 0x9f19 , 0x61ff , 0x8279 , -0x827d , 0x827f , 0x828f , 0x828a , -0x82a8 , 0x8284 , 0x828e , 0x8291 , -0x8297 , 0x8299 , 0x82ab , 0x82b8 , -0x82be , 0x82b0 , 0x82c8 , 0x82ca , -0x82e3 , 0x8298 , 0x82b7 , 0x82ae , -0x82cb , 0x82cc , 0x82c1 , 0x82a9 , -0x82b4 , 0x82a1 , 0x82aa , 0x829f , -0x82c4 , 0x82ce , 0x82a4 , 0x82e1 , -0x8309 , 0x82f7 , 0x82e4 , 0x830f , -0x8307 , 0x82dc , 0x82f4 , 0x82d2 , -0x82d8 , 0x830c , 0x82fb , 0x82d3 , -0x8311 , 0x831a , 0x8306 , 0x8314 , -0x8315 , 0x82e0 , 0x82d5 , 0x831c , -0x8351 , 0x835b , 0x835c , 0x8308 , -0x8392 , 0x833c , 0x8334 , 0x8331 , -0x839b , 0x835e , 0x832f , 0x834f , -0x8347 , 0x8343 , 0x835f , 0x8340 , -0x8317 , 0x8360 , 0x832d , 0x833a , -0x8333 , 0x8366 , 0x8365 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8368 , 0x831b , 0x8369 , -0x836c , 0x836a , 0x836d , 0x836e , -0x83b0 , 0x8378 , 0x83b3 , 0x83b4 , -0x83a0 , 0x83aa , 0x8393 , 0x839c , -0x8385 , 0x837c , 0x83b6 , 0x83a9 , -0x837d , 0x83b8 , 0x837b , 0x8398 , -0x839e , 0x83a8 , 0x83ba , 0x83bc , -0x83c1 , 0x8401 , 0x83e5 , 0x83d8 , -0x5807 , 0x8418 , 0x840b , 0x83dd , -0x83fd , 0x83d6 , 0x841c , 0x8438 , -0x8411 , 0x8406 , 0x83d4 , 0x83df , -0x840f , 0x8403 , 0x83f8 , 0x83f9 , -0x83ea , 0x83c5 , 0x83c0 , 0x8426 , -0x83f0 , 0x83e1 , 0x845c , 0x8451 , -0x845a , 0x8459 , 0x8473 , 0x8487 , -0x8488 , 0x847a , 0x8489 , 0x8478 , -0x843c , 0x8446 , 0x8469 , 0x8476 , -0x848c , 0x848e , 0x8431 , 0x846d , -0x84c1 , 0x84cd , 0x84d0 , 0x84e6 , -0x84bd , 0x84d3 , 0x84ca , 0x84bf , -0x84ba , 0x84e0 , 0x84a1 , 0x84b9 , -0x84b4 , 0x8497 , 0x84e5 , 0x84e3 , -0x850c , 0x750d , 0x8538 , 0x84f0 , -0x8539 , 0x851f , 0x853a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8556 , 0x853b , 0x84ff , -0x84fc , 0x8559 , 0x8548 , 0x8568 , -0x8564 , 0x855e , 0x857a , 0x77a2 , -0x8543 , 0x8572 , 0x857b , 0x85a4 , -0x85a8 , 0x8587 , 0x858f , 0x8579 , -0x85ae , 0x859c , 0x8585 , 0x85b9 , -0x85b7 , 0x85b0 , 0x85d3 , 0x85c1 , -0x85dc , 0x85ff , 0x8627 , 0x8605 , -0x8629 , 0x8616 , 0x863c , 0x5efe , -0x5f08 , 0x593c , 0x5941 , 0x8037 , -0x5955 , 0x595a , 0x5958 , 0x530f , -0x5c22 , 0x5c25 , 0x5c2c , 0x5c34 , -0x624c , 0x626a , 0x629f , 0x62bb , -0x62ca , 0x62da , 0x62d7 , 0x62ee , -0x6322 , 0x62f6 , 0x6339 , 0x634b , -0x6343 , 0x63ad , 0x63f6 , 0x6371 , -0x637a , 0x638e , 0x63b4 , 0x636d , -0x63ac , 0x638a , 0x6369 , 0x63ae , -0x63bc , 0x63f2 , 0x63f8 , 0x63e0 , -0x63ff , 0x63c4 , 0x63de , 0x63ce , -0x6452 , 0x63c6 , 0x63be , 0x6445 , -0x6441 , 0x640b , 0x641b , 0x6420 , -0x640c , 0x6426 , 0x6421 , 0x645e , -0x6484 , 0x646d , 0x6496 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x647a , 0x64b7 , 0x64b8 , -0x6499 , 0x64ba , 0x64c0 , 0x64d0 , -0x64d7 , 0x64e4 , 0x64e2 , 0x6509 , -0x6525 , 0x652e , 0x5f0b , 0x5fd2 , -0x7519 , 0x5f11 , 0x535f , 0x53f1 , -0x53fd , 0x53e9 , 0x53e8 , 0x53fb , -0x5412 , 0x5416 , 0x5406 , 0x544b , -0x5452 , 0x5453 , 0x5454 , 0x5456 , -0x5443 , 0x5421 , 0x5457 , 0x5459 , -0x5423 , 0x5432 , 0x5482 , 0x5494 , -0x5477 , 0x5471 , 0x5464 , 0x549a , -0x549b , 0x5484 , 0x5476 , 0x5466 , -0x549d , 0x54d0 , 0x54ad , 0x54c2 , -0x54b4 , 0x54d2 , 0x54a7 , 0x54a6 , -0x54d3 , 0x54d4 , 0x5472 , 0x54a3 , -0x54d5 , 0x54bb , 0x54bf , 0x54cc , -0x54d9 , 0x54da , 0x54dc , 0x54a9 , -0x54aa , 0x54a4 , 0x54dd , 0x54cf , -0x54de , 0x551b , 0x54e7 , 0x5520 , -0x54fd , 0x5514 , 0x54f3 , 0x5522 , -0x5523 , 0x550f , 0x5511 , 0x5527 , -0x552a , 0x5567 , 0x558f , 0x55b5 , -0x5549 , 0x556d , 0x5541 , 0x5555 , -0x553f , 0x5550 , 0x553c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5537 , 0x5556 , 0x5575 , -0x5576 , 0x5577 , 0x5533 , 0x5530 , -0x555c , 0x558b , 0x55d2 , 0x5583 , -0x55b1 , 0x55b9 , 0x5588 , 0x5581 , -0x559f , 0x557e , 0x55d6 , 0x5591 , -0x557b , 0x55df , 0x55bd , 0x55be , -0x5594 , 0x5599 , 0x55ea , 0x55f7 , -0x55c9 , 0x561f , 0x55d1 , 0x55eb , -0x55ec , 0x55d4 , 0x55e6 , 0x55dd , -0x55c4 , 0x55ef , 0x55e5 , 0x55f2 , -0x55f3 , 0x55cc , 0x55cd , 0x55e8 , -0x55f5 , 0x55e4 , 0x8f94 , 0x561e , -0x5608 , 0x560c , 0x5601 , 0x5624 , -0x5623 , 0x55fe , 0x5600 , 0x5627 , -0x562d , 0x5658 , 0x5639 , 0x5657 , -0x562c , 0x564d , 0x5662 , 0x5659 , -0x565c , 0x564c , 0x5654 , 0x5686 , -0x5664 , 0x5671 , 0x566b , 0x567b , -0x567c , 0x5685 , 0x5693 , 0x56af , -0x56d4 , 0x56d7 , 0x56dd , 0x56e1 , -0x56f5 , 0x56eb , 0x56f9 , 0x56ff , -0x5704 , 0x570a , 0x5709 , 0x571c , -0x5e0f , 0x5e19 , 0x5e14 , 0x5e11 , -0x5e31 , 0x5e3b , 0x5e3c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5e37 , 0x5e44 , 0x5e54 , -0x5e5b , 0x5e5e , 0x5e61 , 0x5c8c , -0x5c7a , 0x5c8d , 0x5c90 , 0x5c96 , -0x5c88 , 0x5c98 , 0x5c99 , 0x5c91 , -0x5c9a , 0x5c9c , 0x5cb5 , 0x5ca2 , -0x5cbd , 0x5cac , 0x5cab , 0x5cb1 , -0x5ca3 , 0x5cc1 , 0x5cb7 , 0x5cc4 , -0x5cd2 , 0x5ce4 , 0x5ccb , 0x5ce5 , -0x5d02 , 0x5d03 , 0x5d27 , 0x5d26 , -0x5d2e , 0x5d24 , 0x5d1e , 0x5d06 , -0x5d1b , 0x5d58 , 0x5d3e , 0x5d34 , -0x5d3d , 0x5d6c , 0x5d5b , 0x5d6f , -0x5d5d , 0x5d6b , 0x5d4b , 0x5d4a , -0x5d69 , 0x5d74 , 0x5d82 , 0x5d99 , -0x5d9d , 0x8c73 , 0x5db7 , 0x5dc5 , -0x5f73 , 0x5f77 , 0x5f82 , 0x5f87 , -0x5f89 , 0x5f8c , 0x5f95 , 0x5f99 , -0x5f9c , 0x5fa8 , 0x5fad , 0x5fb5 , -0x5fbc , 0x8862 , 0x5f61 , 0x72ad , -0x72b0 , 0x72b4 , 0x72b7 , 0x72b8 , -0x72c3 , 0x72c1 , 0x72ce , 0x72cd , -0x72d2 , 0x72e8 , 0x72ef , 0x72e9 , -0x72f2 , 0x72f4 , 0x72f7 , 0x7301 , -0x72f3 , 0x7303 , 0x72fa , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x72fb , 0x7317 , 0x7313 , -0x7321 , 0x730a , 0x731e , 0x731d , -0x7315 , 0x7322 , 0x7339 , 0x7325 , -0x732c , 0x7338 , 0x7331 , 0x7350 , -0x734d , 0x7357 , 0x7360 , 0x736c , -0x736f , 0x737e , 0x821b , 0x5925 , -0x98e7 , 0x5924 , 0x5902 , 0x9963 , -0x9967 , 0x9968 , 0x9969 , 0x996a , -0x996b , 0x996c , 0x9974 , 0x9977 , -0x997d , 0x9980 , 0x9984 , 0x9987 , -0x998a , 0x998d , 0x9990 , 0x9991 , -0x9993 , 0x9994 , 0x9995 , 0x5e80 , -0x5e91 , 0x5e8b , 0x5e96 , 0x5ea5 , -0x5ea0 , 0x5eb9 , 0x5eb5 , 0x5ebe , -0x5eb3 , 0x8d53 , 0x5ed2 , 0x5ed1 , -0x5edb , 0x5ee8 , 0x5eea , 0x81ba , -0x5fc4 , 0x5fc9 , 0x5fd6 , 0x5fcf , -0x6003 , 0x5fee , 0x6004 , 0x5fe1 , -0x5fe4 , 0x5ffe , 0x6005 , 0x6006 , -0x5fea , 0x5fed , 0x5ff8 , 0x6019 , -0x6035 , 0x6026 , 0x601b , 0x600f , -0x600d , 0x6029 , 0x602b , 0x600a , -0x603f , 0x6021 , 0x6078 , 0x6079 , -0x607b , 0x607a , 0x6042 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x606a , 0x607d , 0x6096 , -0x609a , 0x60ad , 0x609d , 0x6083 , -0x6092 , 0x608c , 0x609b , 0x60ec , -0x60bb , 0x60b1 , 0x60dd , 0x60d8 , -0x60c6 , 0x60da , 0x60b4 , 0x6120 , -0x6126 , 0x6115 , 0x6123 , 0x60f4 , -0x6100 , 0x610e , 0x612b , 0x614a , -0x6175 , 0x61ac , 0x6194 , 0x61a7 , -0x61b7 , 0x61d4 , 0x61f5 , 0x5fdd , -0x96b3 , 0x95e9 , 0x95eb , 0x95f1 , -0x95f3 , 0x95f5 , 0x95f6 , 0x95fc , -0x95fe , 0x9603 , 0x9604 , 0x9606 , -0x9608 , 0x960a , 0x960b , 0x960c , -0x960d , 0x960f , 0x9612 , 0x9615 , -0x9616 , 0x9617 , 0x9619 , 0x961a , -0x4e2c , 0x723f , 0x6215 , 0x6c35 , -0x6c54 , 0x6c5c , 0x6c4a , 0x6ca3 , -0x6c85 , 0x6c90 , 0x6c94 , 0x6c8c , -0x6c68 , 0x6c69 , 0x6c74 , 0x6c76 , -0x6c86 , 0x6ca9 , 0x6cd0 , 0x6cd4 , -0x6cad , 0x6cf7 , 0x6cf8 , 0x6cf1 , -0x6cd7 , 0x6cb2 , 0x6ce0 , 0x6cd6 , -0x6cfa , 0x6ceb , 0x6cee , 0x6cb1 , -0x6cd3 , 0x6cef , 0x6cfe , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6d39 , 0x6d27 , 0x6d0c , -0x6d43 , 0x6d48 , 0x6d07 , 0x6d04 , -0x6d19 , 0x6d0e , 0x6d2b , 0x6d4d , -0x6d2e , 0x6d35 , 0x6d1a , 0x6d4f , -0x6d52 , 0x6d54 , 0x6d33 , 0x6d91 , -0x6d6f , 0x6d9e , 0x6da0 , 0x6d5e , -0x6d93 , 0x6d94 , 0x6d5c , 0x6d60 , -0x6d7c , 0x6d63 , 0x6e1a , 0x6dc7 , -0x6dc5 , 0x6dde , 0x6e0e , 0x6dbf , -0x6de0 , 0x6e11 , 0x6de6 , 0x6ddd , -0x6dd9 , 0x6e16 , 0x6dab , 0x6e0c , -0x6dae , 0x6e2b , 0x6e6e , 0x6e4e , -0x6e6b , 0x6eb2 , 0x6e5f , 0x6e86 , -0x6e53 , 0x6e54 , 0x6e32 , 0x6e25 , -0x6e44 , 0x6edf , 0x6eb1 , 0x6e98 , -0x6ee0 , 0x6f2d , 0x6ee2 , 0x6ea5 , -0x6ea7 , 0x6ebd , 0x6ebb , 0x6eb7 , -0x6ed7 , 0x6eb4 , 0x6ecf , 0x6e8f , -0x6ec2 , 0x6e9f , 0x6f62 , 0x6f46 , -0x6f47 , 0x6f24 , 0x6f15 , 0x6ef9 , -0x6f2f , 0x6f36 , 0x6f4b , 0x6f74 , -0x6f2a , 0x6f09 , 0x6f29 , 0x6f89 , -0x6f8d , 0x6f8c , 0x6f78 , 0x6f72 , -0x6f7c , 0x6f7a , 0x6fd1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6fc9 , 0x6fa7 , 0x6fb9 , -0x6fb6 , 0x6fc2 , 0x6fe1 , 0x6fee , -0x6fde , 0x6fe0 , 0x6fef , 0x701a , -0x7023 , 0x701b , 0x7039 , 0x7035 , -0x704f , 0x705e , 0x5b80 , 0x5b84 , -0x5b95 , 0x5b93 , 0x5ba5 , 0x5bb8 , -0x752f , 0x9a9e , 0x6434 , 0x5be4 , -0x5bee , 0x8930 , 0x5bf0 , 0x8e47 , -0x8b07 , 0x8fb6 , 0x8fd3 , 0x8fd5 , -0x8fe5 , 0x8fee , 0x8fe4 , 0x8fe9 , -0x8fe6 , 0x8ff3 , 0x8fe8 , 0x9005 , -0x9004 , 0x900b , 0x9026 , 0x9011 , -0x900d , 0x9016 , 0x9021 , 0x9035 , -0x9036 , 0x902d , 0x902f , 0x9044 , -0x9051 , 0x9052 , 0x9050 , 0x9068 , -0x9058 , 0x9062 , 0x905b , 0x66b9 , -0x9074 , 0x907d , 0x9082 , 0x9088 , -0x9083 , 0x908b , 0x5f50 , 0x5f57 , -0x5f56 , 0x5f58 , 0x5c3b , 0x54ab , -0x5c50 , 0x5c59 , 0x5b71 , 0x5c63 , -0x5c66 , 0x7fbc , 0x5f2a , 0x5f29 , -0x5f2d , 0x8274 , 0x5f3c , 0x9b3b , -0x5c6e , 0x5981 , 0x5983 , 0x598d , -0x59a9 , 0x59aa , 0x59a3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x5997 , 0x59ca , 0x59ab , -0x599e , 0x59a4 , 0x59d2 , 0x59b2 , -0x59af , 0x59d7 , 0x59be , 0x5a05 , -0x5a06 , 0x59dd , 0x5a08 , 0x59e3 , -0x59d8 , 0x59f9 , 0x5a0c , 0x5a09 , -0x5a32 , 0x5a34 , 0x5a11 , 0x5a23 , -0x5a13 , 0x5a40 , 0x5a67 , 0x5a4a , -0x5a55 , 0x5a3c , 0x5a62 , 0x5a75 , -0x80ec , 0x5aaa , 0x5a9b , 0x5a77 , -0x5a7a , 0x5abe , 0x5aeb , 0x5ab2 , -0x5ad2 , 0x5ad4 , 0x5ab8 , 0x5ae0 , -0x5ae3 , 0x5af1 , 0x5ad6 , 0x5ae6 , -0x5ad8 , 0x5adc , 0x5b09 , 0x5b17 , -0x5b16 , 0x5b32 , 0x5b37 , 0x5b40 , -0x5c15 , 0x5c1c , 0x5b5a , 0x5b65 , -0x5b73 , 0x5b51 , 0x5b53 , 0x5b62 , -0x9a75 , 0x9a77 , 0x9a78 , 0x9a7a , -0x9a7f , 0x9a7d , 0x9a80 , 0x9a81 , -0x9a85 , 0x9a88 , 0x9a8a , 0x9a90 , -0x9a92 , 0x9a93 , 0x9a96 , 0x9a98 , -0x9a9b , 0x9a9c , 0x9a9d , 0x9a9f , -0x9aa0 , 0x9aa2 , 0x9aa3 , 0x9aa5 , -0x9aa7 , 0x7e9f , 0x7ea1 , 0x7ea3 , -0x7ea5 , 0x7ea8 , 0x7ea9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7ead , 0x7eb0 , 0x7ebe , -0x7ec0 , 0x7ec1 , 0x7ec2 , 0x7ec9 , -0x7ecb , 0x7ecc , 0x7ed0 , 0x7ed4 , -0x7ed7 , 0x7edb , 0x7ee0 , 0x7ee1 , -0x7ee8 , 0x7eeb , 0x7eee , 0x7eef , -0x7ef1 , 0x7ef2 , 0x7f0d , 0x7ef6 , -0x7efa , 0x7efb , 0x7efe , 0x7f01 , -0x7f02 , 0x7f03 , 0x7f07 , 0x7f08 , -0x7f0b , 0x7f0c , 0x7f0f , 0x7f11 , -0x7f12 , 0x7f17 , 0x7f19 , 0x7f1c , -0x7f1b , 0x7f1f , 0x7f21 , 0x7f22 , -0x7f23 , 0x7f24 , 0x7f25 , 0x7f26 , -0x7f27 , 0x7f2a , 0x7f2b , 0x7f2c , -0x7f2d , 0x7f2f , 0x7f30 , 0x7f31 , -0x7f32 , 0x7f33 , 0x7f35 , 0x5e7a , -0x757f , 0x5ddb , 0x753e , 0x9095 , -0x738e , 0x7391 , 0x73ae , 0x73a2 , -0x739f , 0x73cf , 0x73c2 , 0x73d1 , -0x73b7 , 0x73b3 , 0x73c0 , 0x73c9 , -0x73c8 , 0x73e5 , 0x73d9 , 0x987c , -0x740a , 0x73e9 , 0x73e7 , 0x73de , -0x73ba , 0x73f2 , 0x740f , 0x742a , -0x745b , 0x7426 , 0x7425 , 0x7428 , -0x7430 , 0x742e , 0x742c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x741b , 0x741a , 0x7441 , -0x745c , 0x7457 , 0x7455 , 0x7459 , -0x7477 , 0x746d , 0x747e , 0x749c , -0x748e , 0x7480 , 0x7481 , 0x7487 , -0x748b , 0x749e , 0x74a8 , 0x74a9 , -0x7490 , 0x74a7 , 0x74d2 , 0x74ba , -0x97ea , 0x97eb , 0x97ec , 0x674c , -0x6753 , 0x675e , 0x6748 , 0x6769 , -0x67a5 , 0x6787 , 0x676a , 0x6773 , -0x6798 , 0x67a7 , 0x6775 , 0x67a8 , -0x679e , 0x67ad , 0x678b , 0x6777 , -0x677c , 0x67f0 , 0x6809 , 0x67d8 , -0x680a , 0x67e9 , 0x67b0 , 0x680c , -0x67d9 , 0x67b5 , 0x67da , 0x67b3 , -0x67dd , 0x6800 , 0x67c3 , 0x67b8 , -0x67e2 , 0x680e , 0x67c1 , 0x67fd , -0x6832 , 0x6833 , 0x6860 , 0x6861 , -0x684e , 0x6862 , 0x6844 , 0x6864 , -0x6883 , 0x681d , 0x6855 , 0x6866 , -0x6841 , 0x6867 , 0x6840 , 0x683e , -0x684a , 0x6849 , 0x6829 , 0x68b5 , -0x688f , 0x6874 , 0x6877 , 0x6893 , -0x686b , 0x68c2 , 0x696e , 0x68fc , -0x691f , 0x6920 , 0x68f9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x6924 , 0x68f0 , 0x690b , -0x6901 , 0x6957 , 0x68e3 , 0x6910 , -0x6971 , 0x6939 , 0x6960 , 0x6942 , -0x695d , 0x6984 , 0x696b , 0x6980 , -0x6998 , 0x6978 , 0x6934 , 0x69cc , -0x6987 , 0x6988 , 0x69ce , 0x6989 , -0x6966 , 0x6963 , 0x6979 , 0x699b , -0x69a7 , 0x69bb , 0x69ab , 0x69ad , -0x69d4 , 0x69b1 , 0x69c1 , 0x69ca , -0x69df , 0x6995 , 0x69e0 , 0x698d , -0x69ff , 0x6a2f , 0x69ed , 0x6a17 , -0x6a18 , 0x6a65 , 0x69f2 , 0x6a44 , -0x6a3e , 0x6aa0 , 0x6a50 , 0x6a5b , -0x6a35 , 0x6a8e , 0x6a79 , 0x6a3d , -0x6a28 , 0x6a58 , 0x6a7c , 0x6a91 , -0x6a90 , 0x6aa9 , 0x6a97 , 0x6aab , -0x7337 , 0x7352 , 0x6b81 , 0x6b82 , -0x6b87 , 0x6b84 , 0x6b92 , 0x6b93 , -0x6b8d , 0x6b9a , 0x6b9b , 0x6ba1 , -0x6baa , 0x8f6b , 0x8f6d , 0x8f71 , -0x8f72 , 0x8f73 , 0x8f75 , 0x8f76 , -0x8f78 , 0x8f77 , 0x8f79 , 0x8f7a , -0x8f7c , 0x8f7e , 0x8f81 , 0x8f82 , -0x8f84 , 0x8f87 , 0x8f8b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8f8d , 0x8f8e , 0x8f8f , -0x8f98 , 0x8f9a , 0x8ece , 0x620b , -0x6217 , 0x621b , 0x621f , 0x6222 , -0x6221 , 0x6225 , 0x6224 , 0x622c , -0x81e7 , 0x74ef , 0x74f4 , 0x74ff , -0x750f , 0x7511 , 0x7513 , 0x6534 , -0x65ee , 0x65ef , 0x65f0 , 0x660a , -0x6619 , 0x6772 , 0x6603 , 0x6615 , -0x6600 , 0x7085 , 0x66f7 , 0x661d , -0x6634 , 0x6631 , 0x6636 , 0x6635 , -0x8006 , 0x665f , 0x6654 , 0x6641 , -0x664f , 0x6656 , 0x6661 , 0x6657 , -0x6677 , 0x6684 , 0x668c , 0x66a7 , -0x669d , 0x66be , 0x66db , 0x66dc , -0x66e6 , 0x66e9 , 0x8d32 , 0x8d33 , -0x8d36 , 0x8d3b , 0x8d3d , 0x8d40 , -0x8d45 , 0x8d46 , 0x8d48 , 0x8d49 , -0x8d47 , 0x8d4d , 0x8d55 , 0x8d59 , -0x89c7 , 0x89ca , 0x89cb , 0x89cc , -0x89ce , 0x89cf , 0x89d0 , 0x89d1 , -0x726e , 0x729f , 0x725d , 0x7266 , -0x726f , 0x727e , 0x727f , 0x7284 , -0x728b , 0x728d , 0x728f , 0x7292 , -0x6308 , 0x6332 , 0x63b0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x643f , 0x64d8 , 0x8004 , -0x6bea , 0x6bf3 , 0x6bfd , 0x6bf5 , -0x6bf9 , 0x6c05 , 0x6c07 , 0x6c06 , -0x6c0d , 0x6c15 , 0x6c18 , 0x6c19 , -0x6c1a , 0x6c21 , 0x6c29 , 0x6c24 , -0x6c2a , 0x6c32 , 0x6535 , 0x6555 , -0x656b , 0x724d , 0x7252 , 0x7256 , -0x7230 , 0x8662 , 0x5216 , 0x809f , -0x809c , 0x8093 , 0x80bc , 0x670a , -0x80bd , 0x80b1 , 0x80ab , 0x80ad , -0x80b4 , 0x80b7 , 0x80e7 , 0x80e8 , -0x80e9 , 0x80ea , 0x80db , 0x80c2 , -0x80c4 , 0x80d9 , 0x80cd , 0x80d7 , -0x6710 , 0x80dd , 0x80eb , 0x80f1 , -0x80f4 , 0x80ed , 0x810d , 0x810e , -0x80f2 , 0x80fc , 0x6715 , 0x8112 , -0x8c5a , 0x8136 , 0x811e , 0x812c , -0x8118 , 0x8132 , 0x8148 , 0x814c , -0x8153 , 0x8174 , 0x8159 , 0x815a , -0x8171 , 0x8160 , 0x8169 , 0x817c , -0x817d , 0x816d , 0x8167 , 0x584d , -0x5ab5 , 0x8188 , 0x8182 , 0x8191 , -0x6ed5 , 0x81a3 , 0x81aa , 0x81cc , -0x6726 , 0x81ca , 0x81bb , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x81c1 , 0x81a6 , 0x6b24 , -0x6b37 , 0x6b39 , 0x6b43 , 0x6b46 , -0x6b59 , 0x98d1 , 0x98d2 , 0x98d3 , -0x98d5 , 0x98d9 , 0x98da , 0x6bb3 , -0x5f40 , 0x6bc2 , 0x89f3 , 0x6590 , -0x9f51 , 0x6593 , 0x65bc , 0x65c6 , -0x65c4 , 0x65c3 , 0x65cc , 0x65ce , -0x65d2 , 0x65d6 , 0x7080 , 0x709c , -0x7096 , 0x709d , 0x70bb , 0x70c0 , -0x70b7 , 0x70ab , 0x70b1 , 0x70e8 , -0x70ca , 0x7110 , 0x7113 , 0x7116 , -0x712f , 0x7131 , 0x7173 , 0x715c , -0x7168 , 0x7145 , 0x7172 , 0x714a , -0x7178 , 0x717a , 0x7198 , 0x71b3 , -0x71b5 , 0x71a8 , 0x71a0 , 0x71e0 , -0x71d4 , 0x71e7 , 0x71f9 , 0x721d , -0x7228 , 0x706c , 0x7118 , 0x7166 , -0x71b9 , 0x623e , 0x623d , 0x6243 , -0x6248 , 0x6249 , 0x793b , 0x7940 , -0x7946 , 0x7949 , 0x795b , 0x795c , -0x7953 , 0x795a , 0x7962 , 0x7957 , -0x7960 , 0x796f , 0x7967 , 0x797a , -0x7985 , 0x798a , 0x799a , 0x79a7 , -0x79b3 , 0x5fd1 , 0x5fd0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x603c , 0x605d , 0x605a , -0x6067 , 0x6041 , 0x6059 , 0x6063 , -0x60ab , 0x6106 , 0x610d , 0x615d , -0x61a9 , 0x619d , 0x61cb , 0x61d1 , -0x6206 , 0x8080 , 0x807f , 0x6c93 , -0x6cf6 , 0x6dfc , 0x77f6 , 0x77f8 , -0x7800 , 0x7809 , 0x7817 , 0x7818 , -0x7811 , 0x65ab , 0x782d , 0x781c , -0x781d , 0x7839 , 0x783a , 0x783b , -0x781f , 0x783c , 0x7825 , 0x782c , -0x7823 , 0x7829 , 0x784e , 0x786d , -0x7856 , 0x7857 , 0x7826 , 0x7850 , -0x7847 , 0x784c , 0x786a , 0x789b , -0x7893 , 0x789a , 0x7887 , 0x789c , -0x78a1 , 0x78a3 , 0x78b2 , 0x78b9 , -0x78a5 , 0x78d4 , 0x78d9 , 0x78c9 , -0x78ec , 0x78f2 , 0x7905 , 0x78f4 , -0x7913 , 0x7924 , 0x791e , 0x7934 , -0x9f9b , 0x9ef9 , 0x9efb , 0x9efc , -0x76f1 , 0x7704 , 0x770d , 0x76f9 , -0x7707 , 0x7708 , 0x771a , 0x7722 , -0x7719 , 0x772d , 0x7726 , 0x7735 , -0x7738 , 0x7750 , 0x7751 , 0x7747 , -0x7743 , 0x775a , 0x7768 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7762 , 0x7765 , 0x777f , -0x778d , 0x777d , 0x7780 , 0x778c , -0x7791 , 0x779f , 0x77a0 , 0x77b0 , -0x77b5 , 0x77bd , 0x753a , 0x7540 , -0x754e , 0x754b , 0x7548 , 0x755b , -0x7572 , 0x7579 , 0x7583 , 0x7f58 , -0x7f61 , 0x7f5f , 0x8a48 , 0x7f68 , -0x7f74 , 0x7f71 , 0x7f79 , 0x7f81 , -0x7f7e , 0x76cd , 0x76e5 , 0x8832 , -0x9485 , 0x9486 , 0x9487 , 0x948b , -0x948a , 0x948c , 0x948d , 0x948f , -0x9490 , 0x9494 , 0x9497 , 0x9495 , -0x949a , 0x949b , 0x949c , 0x94a3 , -0x94a4 , 0x94ab , 0x94aa , 0x94ad , -0x94ac , 0x94af , 0x94b0 , 0x94b2 , -0x94b4 , 0x94b6 , 0x94b7 , 0x94b8 , -0x94b9 , 0x94ba , 0x94bc , 0x94bd , -0x94bf , 0x94c4 , 0x94c8 , 0x94c9 , -0x94ca , 0x94cb , 0x94cc , 0x94cd , -0x94ce , 0x94d0 , 0x94d1 , 0x94d2 , -0x94d5 , 0x94d6 , 0x94d7 , 0x94d9 , -0x94d8 , 0x94db , 0x94de , 0x94df , -0x94e0 , 0x94e2 , 0x94e4 , 0x94e5 , -0x94e7 , 0x94e8 , 0x94ea , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x94e9 , 0x94eb , 0x94ee , -0x94ef , 0x94f3 , 0x94f4 , 0x94f5 , -0x94f7 , 0x94f9 , 0x94fc , 0x94fd , -0x94ff , 0x9503 , 0x9502 , 0x9506 , -0x9507 , 0x9509 , 0x950a , 0x950d , -0x950e , 0x950f , 0x9512 , 0x9513 , -0x9514 , 0x9515 , 0x9516 , 0x9518 , -0x951b , 0x951d , 0x951e , 0x951f , -0x9522 , 0x952a , 0x952b , 0x9529 , -0x952c , 0x9531 , 0x9532 , 0x9534 , -0x9536 , 0x9537 , 0x9538 , 0x953c , -0x953e , 0x953f , 0x9542 , 0x9535 , -0x9544 , 0x9545 , 0x9546 , 0x9549 , -0x954c , 0x954e , 0x954f , 0x9552 , -0x9553 , 0x9554 , 0x9556 , 0x9557 , -0x9558 , 0x9559 , 0x955b , 0x955e , -0x955f , 0x955d , 0x9561 , 0x9562 , -0x9564 , 0x9565 , 0x9566 , 0x9567 , -0x9568 , 0x9569 , 0x956a , 0x956b , -0x956c , 0x956f , 0x9571 , 0x9572 , -0x9573 , 0x953a , 0x77e7 , 0x77ec , -0x96c9 , 0x79d5 , 0x79ed , 0x79e3 , -0x79eb , 0x7a06 , 0x5d47 , 0x7a03 , -0x7a02 , 0x7a1e , 0x7a14 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7a39 , 0x7a37 , 0x7a51 , -0x9ecf , 0x99a5 , 0x7a70 , 0x7688 , -0x768e , 0x7693 , 0x7699 , 0x76a4 , -0x74de , 0x74e0 , 0x752c , 0x9e20 , -0x9e22 , 0x9e28 , 0x9e29 , 0x9e2a , -0x9e2b , 0x9e2c , 0x9e32 , 0x9e31 , -0x9e36 , 0x9e38 , 0x9e37 , 0x9e39 , -0x9e3a , 0x9e3e , 0x9e41 , 0x9e42 , -0x9e44 , 0x9e46 , 0x9e47 , 0x9e48 , -0x9e49 , 0x9e4b , 0x9e4c , 0x9e4e , -0x9e51 , 0x9e55 , 0x9e57 , 0x9e5a , -0x9e5b , 0x9e5c , 0x9e5e , 0x9e63 , -0x9e66 , 0x9e67 , 0x9e68 , 0x9e69 , -0x9e6a , 0x9e6b , 0x9e6c , 0x9e71 , -0x9e6d , 0x9e73 , 0x7592 , 0x7594 , -0x7596 , 0x75a0 , 0x759d , 0x75ac , -0x75a3 , 0x75b3 , 0x75b4 , 0x75b8 , -0x75c4 , 0x75b1 , 0x75b0 , 0x75c3 , -0x75c2 , 0x75d6 , 0x75cd , 0x75e3 , -0x75e8 , 0x75e6 , 0x75e4 , 0x75eb , -0x75e7 , 0x7603 , 0x75f1 , 0x75fc , -0x75ff , 0x7610 , 0x7600 , 0x7605 , -0x760c , 0x7617 , 0x760a , 0x7625 , -0x7618 , 0x7615 , 0x7619 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x761b , 0x763c , 0x7622 , -0x7620 , 0x7640 , 0x762d , 0x7630 , -0x763f , 0x7635 , 0x7643 , 0x763e , -0x7633 , 0x764d , 0x765e , 0x7654 , -0x765c , 0x7656 , 0x766b , 0x766f , -0x7fca , 0x7ae6 , 0x7a78 , 0x7a79 , -0x7a80 , 0x7a86 , 0x7a88 , 0x7a95 , -0x7aa6 , 0x7aa0 , 0x7aac , 0x7aa8 , -0x7aad , 0x7ab3 , 0x8864 , 0x8869 , -0x8872 , 0x887d , 0x887f , 0x8882 , -0x88a2 , 0x88c6 , 0x88b7 , 0x88bc , -0x88c9 , 0x88e2 , 0x88ce , 0x88e3 , -0x88e5 , 0x88f1 , 0x891a , 0x88fc , -0x88e8 , 0x88fe , 0x88f0 , 0x8921 , -0x8919 , 0x8913 , 0x891b , 0x890a , -0x8934 , 0x892b , 0x8936 , 0x8941 , -0x8966 , 0x897b , 0x758b , 0x80e5 , -0x76b2 , 0x76b4 , 0x77dc , 0x8012 , -0x8014 , 0x8016 , 0x801c , 0x8020 , -0x8022 , 0x8025 , 0x8026 , 0x8027 , -0x8029 , 0x8028 , 0x8031 , 0x800b , -0x8035 , 0x8043 , 0x8046 , 0x804d , -0x8052 , 0x8069 , 0x8071 , 0x8983 , -0x9878 , 0x9880 , 0x9883 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9889 , 0x988c , 0x988d , -0x988f , 0x9894 , 0x989a , 0x989b , -0x989e , 0x989f , 0x98a1 , 0x98a2 , -0x98a5 , 0x98a6 , 0x864d , 0x8654 , -0x866c , 0x866e , 0x867f , 0x867a , -0x867c , 0x867b , 0x86a8 , 0x868d , -0x868b , 0x86ac , 0x869d , 0x86a7 , -0x86a3 , 0x86aa , 0x8693 , 0x86a9 , -0x86b6 , 0x86c4 , 0x86b5 , 0x86ce , -0x86b0 , 0x86ba , 0x86b1 , 0x86af , -0x86c9 , 0x86cf , 0x86b4 , 0x86e9 , -0x86f1 , 0x86f2 , 0x86ed , 0x86f3 , -0x86d0 , 0x8713 , 0x86de , 0x86f4 , -0x86df , 0x86d8 , 0x86d1 , 0x8703 , -0x8707 , 0x86f8 , 0x8708 , 0x870a , -0x870d , 0x8709 , 0x8723 , 0x873b , -0x871e , 0x8725 , 0x872e , 0x871a , -0x873e , 0x8748 , 0x8734 , 0x8731 , -0x8729 , 0x8737 , 0x873f , 0x8782 , -0x8722 , 0x877d , 0x877e , 0x877b , -0x8760 , 0x8770 , 0x874c , 0x876e , -0x878b , 0x8753 , 0x8763 , 0x877c , -0x8764 , 0x8759 , 0x8765 , 0x8793 , -0x87af , 0x87a8 , 0x87d2 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x87c6 , 0x8788 , 0x8785 , -0x87ad , 0x8797 , 0x8783 , 0x87ab , -0x87e5 , 0x87ac , 0x87b5 , 0x87b3 , -0x87cb , 0x87d3 , 0x87bd , 0x87d1 , -0x87c0 , 0x87ca , 0x87db , 0x87ea , -0x87e0 , 0x87ee , 0x8816 , 0x8813 , -0x87fe , 0x880a , 0x881b , 0x8821 , -0x8839 , 0x883c , 0x7f36 , 0x7f42 , -0x7f44 , 0x7f45 , 0x8210 , 0x7afa , -0x7afd , 0x7b08 , 0x7b03 , 0x7b04 , -0x7b15 , 0x7b0a , 0x7b2b , 0x7b0f , -0x7b47 , 0x7b38 , 0x7b2a , 0x7b19 , -0x7b2e , 0x7b31 , 0x7b20 , 0x7b25 , -0x7b24 , 0x7b33 , 0x7b3e , 0x7b1e , -0x7b58 , 0x7b5a , 0x7b45 , 0x7b75 , -0x7b4c , 0x7b5d , 0x7b60 , 0x7b6e , -0x7b7b , 0x7b62 , 0x7b72 , 0x7b71 , -0x7b90 , 0x7ba6 , 0x7ba7 , 0x7bb8 , -0x7bac , 0x7b9d , 0x7ba8 , 0x7b85 , -0x7baa , 0x7b9c , 0x7ba2 , 0x7bab , -0x7bb4 , 0x7bd1 , 0x7bc1 , 0x7bcc , -0x7bdd , 0x7bda , 0x7be5 , 0x7be6 , -0x7bea , 0x7c0c , 0x7bfe , 0x7bfc , -0x7c0f , 0x7c16 , 0x7c0b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x7c1f , 0x7c2a , 0x7c26 , -0x7c38 , 0x7c41 , 0x7c40 , 0x81fe , -0x8201 , 0x8202 , 0x8204 , 0x81ec , -0x8844 , 0x8221 , 0x8222 , 0x8223 , -0x822d , 0x822f , 0x8228 , 0x822b , -0x8238 , 0x823b , 0x8233 , 0x8234 , -0x823e , 0x8244 , 0x8249 , 0x824b , -0x824f , 0x825a , 0x825f , 0x8268 , -0x887e , 0x8885 , 0x8888 , 0x88d8 , -0x88df , 0x895e , 0x7f9d , 0x7f9f , -0x7fa7 , 0x7faf , 0x7fb0 , 0x7fb2 , -0x7c7c , 0x6549 , 0x7c91 , 0x7c9d , -0x7c9c , 0x7c9e , 0x7ca2 , 0x7cb2 , -0x7cbc , 0x7cbd , 0x7cc1 , 0x7cc7 , -0x7ccc , 0x7ccd , 0x7cc8 , 0x7cc5 , -0x7cd7 , 0x7ce8 , 0x826e , 0x66a8 , -0x7fbf , 0x7fce , 0x7fd5 , 0x7fe5 , -0x7fe1 , 0x7fe6 , 0x7fe9 , 0x7fee , -0x7ff3 , 0x7cf8 , 0x7d77 , 0x7da6 , -0x7dae , 0x7e47 , 0x7e9b , 0x9eb8 , -0x9eb4 , 0x8d73 , 0x8d84 , 0x8d94 , -0x8d91 , 0x8db1 , 0x8d67 , 0x8d6d , -0x8c47 , 0x8c49 , 0x914a , 0x9150 , -0x914e , 0x914f , 0x9164 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9162 , 0x9161 , 0x9170 , -0x9169 , 0x916f , 0x917d , 0x917e , -0x9172 , 0x9174 , 0x9179 , 0x918c , -0x9185 , 0x9190 , 0x918d , 0x9191 , -0x91a2 , 0x91a3 , 0x91aa , 0x91ad , -0x91ae , 0x91af , 0x91b5 , 0x91b4 , -0x91ba , 0x8c55 , 0x9e7e , 0x8db8 , -0x8deb , 0x8e05 , 0x8e59 , 0x8e69 , -0x8db5 , 0x8dbf , 0x8dbc , 0x8dba , -0x8dc4 , 0x8dd6 , 0x8dd7 , 0x8dda , -0x8dde , 0x8dce , 0x8dcf , 0x8ddb , -0x8dc6 , 0x8dec , 0x8df7 , 0x8df8 , -0x8de3 , 0x8df9 , 0x8dfb , 0x8de4 , -0x8e09 , 0x8dfd , 0x8e14 , 0x8e1d , -0x8e1f , 0x8e2c , 0x8e2e , 0x8e23 , -0x8e2f , 0x8e3a , 0x8e40 , 0x8e39 , -0x8e35 , 0x8e3d , 0x8e31 , 0x8e49 , -0x8e41 , 0x8e42 , 0x8e51 , 0x8e52 , -0x8e4a , 0x8e70 , 0x8e76 , 0x8e7c , -0x8e6f , 0x8e74 , 0x8e85 , 0x8e8f , -0x8e94 , 0x8e90 , 0x8e9c , 0x8e9e , -0x8c78 , 0x8c82 , 0x8c8a , 0x8c85 , -0x8c98 , 0x8c94 , 0x659b , 0x89d6 , -0x89de , 0x89da , 0x89dc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x89e5 , 0x89eb , 0x89ef , -0x8a3e , 0x8b26 , 0x9753 , 0x96e9 , -0x96f3 , 0x96ef , 0x9706 , 0x9701 , -0x9708 , 0x970f , 0x970e , 0x972a , -0x972d , 0x9730 , 0x973e , 0x9f80 , -0x9f83 , 0x9f85 , 0x9f86 , 0x9f87 , -0x9f88 , 0x9f89 , 0x9f8a , 0x9f8c , -0x9efe , 0x9f0b , 0x9f0d , 0x96b9 , -0x96bc , 0x96bd , 0x96ce , 0x96d2 , -0x77bf , 0x96e0 , 0x928e , 0x92ae , -0x92c8 , 0x933e , 0x936a , 0x93ca , -0x938f , 0x943e , 0x946b , 0x9c7f , -0x9c82 , 0x9c85 , 0x9c86 , 0x9c87 , -0x9c88 , 0x7a23 , 0x9c8b , 0x9c8e , -0x9c90 , 0x9c91 , 0x9c92 , 0x9c94 , -0x9c95 , 0x9c9a , 0x9c9b , 0x9c9e , -0x9c9f , 0x9ca0 , 0x9ca1 , 0x9ca2 , -0x9ca3 , 0x9ca5 , 0x9ca6 , 0x9ca7 , -0x9ca8 , 0x9ca9 , 0x9cab , 0x9cad , -0x9cae , 0x9cb0 , 0x9cb1 , 0x9cb2 , -0x9cb3 , 0x9cb4 , 0x9cb5 , 0x9cb6 , -0x9cb7 , 0x9cba , 0x9cbb , 0x9cbc , -0x9cbd , 0x9cc4 , 0x9cc5 , 0x9cc6 , -0x9cc7 , 0x9cca , 0x9ccb , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9ccc , 0x9ccd , 0x9cce , -0x9ccf , 0x9cd0 , 0x9cd3 , 0x9cd4 , -0x9cd5 , 0x9cd7 , 0x9cd8 , 0x9cd9 , -0x9cdc , 0x9cdd , 0x9cdf , 0x9ce2 , -0x977c , 0x9785 , 0x9791 , 0x9792 , -0x9794 , 0x97af , 0x97ab , 0x97a3 , -0x97b2 , 0x97b4 , 0x9ab1 , 0x9ab0 , -0x9ab7 , 0x9e58 , 0x9ab6 , 0x9aba , -0x9abc , 0x9ac1 , 0x9ac0 , 0x9ac5 , -0x9ac2 , 0x9acb , 0x9acc , 0x9ad1 , -0x9b45 , 0x9b43 , 0x9b47 , 0x9b49 , -0x9b48 , 0x9b4d , 0x9b51 , 0x98e8 , -0x990d , 0x992e , 0x9955 , 0x9954 , -0x9adf , 0x9ae1 , 0x9ae6 , 0x9aef , -0x9aeb , 0x9afb , 0x9aed , 0x9af9 , -0x9b08 , 0x9b0f , 0x9b13 , 0x9b1f , -0x9b23 , 0x9ebd , 0x9ebe , 0x7e3b , -0x9e82 , 0x9e87 , 0x9e88 , 0x9e8b , -0x9e92 , 0x93d6 , 0x9e9d , 0x9e9f , -0x9edb , 0x9edc , 0x9edd , 0x9ee0 , -0x9edf , 0x9ee2 , 0x9ee9 , 0x9ee7 , -0x9ee5 , 0x9eea , 0x9eef , 0x9f22 , -0x9f2c , 0x9f2f , 0x9f39 , 0x9f37 , -0x9f3d , 0x9f3e , 0x9f44 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -} ; diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_GB2312.pxx opencascade-7.5.1+dfsg1/src/Resource/Resource_GB2312.pxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_GB2312.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_GB2312.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,32788 @@ +/* + Copyright (c) 1998-1999 Matra Datavision + Copyright (c) 1999-2014 OPEN CASCADE SAS + + This file is part of Open CASCADE Technology software library. + + This library is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License version 2.1 as published + by the Free Software Foundation, with special exception defined in the file + OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT + distribution for complete text of the license and disclaimer of any warranty. + + Alternatively, this file may be used under the terms of Open CASCADE + commercial license or contractual agreement. +*/ + +static const char16 unigb [65536] = { +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2168 , 0x0 , 0x0 , 0x216c , +0x2127 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2163 , 0x2140 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2141 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2824 , 0x2822 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2828 , 0x2826 , 0x283a , 0x0 , +0x282c , 0x282a , 0x0 , 0x0 , +0x0 , 0x0 , 0x2830 , 0x282e , +0x0 , 0x0 , 0x0 , 0x2142 , +0x0 , 0x2834 , 0x2832 , 0x0 , +0x2839 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2821 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2825 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2827 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2829 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x282d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2831 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x2823 , 0x0 , +0x282b , 0x0 , 0x282f , 0x0 , +0x2833 , 0x0 , 0x2835 , 0x0 , +0x2836 , 0x0 , 0x2837 , 0x0 , +0x2838 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2126 , +0x0 , 0x2125 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2621 , 0x2622 , 0x2623 , +0x2624 , 0x2625 , 0x2626 , 0x2627 , +0x2628 , 0x2629 , 0x262a , 0x262b , +0x262c , 0x262d , 0x262e , 0x262f , +0x2630 , 0x2631 , 0x0 , 0x2632 , +0x2633 , 0x2634 , 0x2635 , 0x2636 , +0x2637 , 0x2638 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2641 , 0x2642 , 0x2643 , +0x2644 , 0x2645 , 0x2646 , 0x2647 , +0x2648 , 0x2649 , 0x264a , 0x264b , +0x264c , 0x264d , 0x264e , 0x264f , +0x2650 , 0x2651 , 0x0 , 0x2652 , +0x2653 , 0x2654 , 0x2655 , 0x2656 , +0x2657 , 0x2658 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2727 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2721 , 0x2722 , 0x2723 , 0x2724 , +0x2725 , 0x2726 , 0x2728 , 0x2729 , +0x272a , 0x272b , 0x272c , 0x272d , +0x272e , 0x272f , 0x2730 , 0x2731 , +0x2732 , 0x2733 , 0x2734 , 0x2735 , +0x2736 , 0x2737 , 0x2738 , 0x2739 , +0x273a , 0x273b , 0x273c , 0x273d , +0x273e , 0x273f , 0x2740 , 0x2741 , +0x2751 , 0x2752 , 0x2753 , 0x2754 , +0x2755 , 0x2756 , 0x2758 , 0x2759 , +0x275a , 0x275b , 0x275c , 0x275d , +0x275e , 0x275f , 0x2760 , 0x2761 , +0x2762 , 0x2763 , 0x2764 , 0x2765 , +0x2766 , 0x2767 , 0x2768 , 0x2769 , +0x276a , 0x276b , 0x276c , 0x276d , +0x276e , 0x276f , 0x2770 , 0x2771 , +0x0 , 0x2757 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x212a , 0x0 , 0x0 , +0x212e , 0x212f , 0x0 , 0x0 , +0x2130 , 0x2131 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x212d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x216b , 0x0 , 0x2164 , 0x2165 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2179 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2166 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x216d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2271 , 0x2272 , 0x2273 , 0x2274 , +0x2275 , 0x2276 , 0x2277 , 0x2278 , +0x2279 , 0x227a , 0x227b , 0x227c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x217b , 0x217c , 0x217a , 0x217d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x214a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2147 , +0x0 , 0x2146 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x214c , 0x0 , +0x0 , 0x2158 , 0x215e , 0x0 , +0x214f , 0x0 , 0x0 , 0x0 , +0x0 , 0x214e , 0x0 , 0x2144 , +0x2145 , 0x2149 , 0x2148 , 0x2152 , +0x0 , 0x0 , 0x2153 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2160 , 0x215f , 0x2143 , 0x214b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2157 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2156 , 0x0 , 0x0 , 0x0 , +0x2155 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2159 , 0x2154 , 0x0 , 0x0 , +0x215c , 0x215d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x215a , 0x215b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2151 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x214d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x2150 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2259 , 0x225a , 0x225b , 0x225c , +0x225d , 0x225e , 0x225f , 0x2260 , +0x2261 , 0x2262 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2245 , 0x2246 , 0x2247 , 0x2248 , +0x2249 , 0x224a , 0x224b , 0x224c , +0x224d , 0x224e , 0x224f , 0x2250 , +0x2251 , 0x2252 , 0x2253 , 0x2254 , +0x2255 , 0x2256 , 0x2257 , 0x2258 , +0x2231 , 0x2232 , 0x2233 , 0x2234 , +0x2235 , 0x2236 , 0x2237 , 0x2238 , +0x2239 , 0x223a , 0x223b , 0x223c , +0x223d , 0x223e , 0x223f , 0x2240 , +0x2241 , 0x2242 , 0x2243 , 0x2244 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2924 , 0x2925 , 0x2926 , 0x2927 , +0x2928 , 0x2929 , 0x292a , 0x292b , +0x292c , 0x292d , 0x292e , 0x292f , +0x2930 , 0x2931 , 0x2932 , 0x2933 , +0x2934 , 0x2935 , 0x2936 , 0x2937 , +0x2938 , 0x2939 , 0x293a , 0x293b , +0x293c , 0x293d , 0x293e , 0x293f , +0x2940 , 0x2941 , 0x2942 , 0x2943 , +0x2944 , 0x2945 , 0x2946 , 0x2947 , +0x2948 , 0x2949 , 0x294a , 0x294b , +0x294c , 0x294d , 0x294e , 0x294f , +0x2950 , 0x2951 , 0x2952 , 0x2953 , +0x2954 , 0x2955 , 0x2956 , 0x2957 , +0x2958 , 0x2959 , 0x295a , 0x295b , +0x295c , 0x295d , 0x295e , 0x295f , +0x2960 , 0x2961 , 0x2962 , 0x2963 , +0x2964 , 0x2965 , 0x2966 , 0x2967 , +0x2968 , 0x2969 , 0x296a , 0x296b , +0x296c , 0x296d , 0x296e , 0x296f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2176 , 0x2175 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x2178 , 0x2177 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x2174 , 0x2173 , +0x0 , 0x0 , 0x0 , 0x2170 , +0x0 , 0x0 , 0x2172 , 0x2171 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x216f , 0x216e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2162 , 0x0 , 0x2161 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2121 , 0x2122 , 0x2123 , 0x2128 , +0x0 , 0x2129 , 0x0 , 0x0 , +0x2134 , 0x2135 , 0x2136 , 0x2137 , +0x2138 , 0x2139 , 0x213a , 0x213b , +0x213e , 0x213f , 0x0 , 0x217e , +0x2132 , 0x2133 , 0x213c , 0x213d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2421 , 0x2422 , 0x2423 , +0x2424 , 0x2425 , 0x2426 , 0x2427 , +0x2428 , 0x2429 , 0x242a , 0x242b , +0x242c , 0x242d , 0x242e , 0x242f , +0x2430 , 0x2431 , 0x2432 , 0x2433 , +0x2434 , 0x2435 , 0x2436 , 0x2437 , +0x2438 , 0x2439 , 0x243a , 0x243b , +0x243c , 0x243d , 0x243e , 0x243f , +0x2440 , 0x2441 , 0x2442 , 0x2443 , +0x2444 , 0x2445 , 0x2446 , 0x2447 , +0x2448 , 0x2449 , 0x244a , 0x244b , +0x244c , 0x244d , 0x244e , 0x244f , +0x2450 , 0x2451 , 0x2452 , 0x2453 , +0x2454 , 0x2455 , 0x2456 , 0x2457 , +0x2458 , 0x2459 , 0x245a , 0x245b , +0x245c , 0x245d , 0x245e , 0x245f , +0x2460 , 0x2461 , 0x2462 , 0x2463 , +0x2464 , 0x2465 , 0x2466 , 0x2467 , +0x2468 , 0x2469 , 0x246a , 0x246b , +0x246c , 0x246d , 0x246e , 0x246f , +0x2470 , 0x2471 , 0x2472 , 0x2473 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2521 , 0x2522 , 0x2523 , +0x2524 , 0x2525 , 0x2526 , 0x2527 , +0x2528 , 0x2529 , 0x252a , 0x252b , +0x252c , 0x252d , 0x252e , 0x252f , +0x2530 , 0x2531 , 0x2532 , 0x2533 , +0x2534 , 0x2535 , 0x2536 , 0x2537 , +0x2538 , 0x2539 , 0x253a , 0x253b , +0x253c , 0x253d , 0x253e , 0x253f , +0x2540 , 0x2541 , 0x2542 , 0x2543 , +0x2544 , 0x2545 , 0x2546 , 0x2547 , +0x2548 , 0x2549 , 0x254a , 0x254b , +0x254c , 0x254d , 0x254e , 0x254f , +0x2550 , 0x2551 , 0x2552 , 0x2553 , +0x2554 , 0x2555 , 0x2556 , 0x2557 , +0x2558 , 0x2559 , 0x255a , 0x255b , +0x255c , 0x255d , 0x255e , 0x255f , +0x2560 , 0x2561 , 0x2562 , 0x2563 , +0x2564 , 0x2565 , 0x2566 , 0x2567 , +0x2568 , 0x2569 , 0x256a , 0x256b , +0x256c , 0x256d , 0x256e , 0x256f , +0x2570 , 0x2571 , 0x2572 , 0x2573 , +0x2574 , 0x2575 , 0x2576 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2124 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2845 , 0x2846 , 0x2847 , +0x2848 , 0x2849 , 0x284a , 0x284b , +0x284c , 0x284d , 0x284e , 0x284f , +0x2850 , 0x2851 , 0x2852 , 0x2853 , +0x2854 , 0x2855 , 0x2856 , 0x2857 , +0x2858 , 0x2859 , 0x285a , 0x285b , +0x285c , 0x285d , 0x285e , 0x285f , +0x2860 , 0x2861 , 0x2862 , 0x2863 , +0x2864 , 0x2865 , 0x2866 , 0x2867 , +0x2868 , 0x2869 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2265 , 0x2266 , 0x2267 , 0x2268 , +0x2269 , 0x226a , 0x226b , 0x226c , +0x226d , 0x226e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x523b , 0x3621 , 0x0 , 0x465f , +0x0 , 0x0 , 0x0 , 0x4d72 , +0x5549 , 0x487d , 0x494f , 0x4f42 , +0x5822 , 0x323b , 0x536b , 0x0 , +0x5824 , 0x3373 , 0x0 , 0x5728 , +0x4752 , 0x5827 , 0x4a40 , 0x0 , +0x4770 , 0x317b , 0x5235 , 0x3454 , +0x362b , 0x4b3f , 0x5829 , 0x0 , +0x0 , 0x0 , 0x362a , 0x0 , +0x413d , 0x514f , 0x0 , 0x4925 , +0x582d , 0x0 , 0x3876 , 0x513e , +0x635c , 0x5650 , 0x0 , 0x0 , +0x3761 , 0x0 , 0x342e , 0x0 , +0x4159 , 0x0 , 0x583c , 0x0 , +0x4d68 , 0x3524 , 0x4e2a , 0x5677 , +0x0 , 0x4076 , 0x3e59 , 0x582f , +0x0 , 0x0 , 0x0 , 0x444b , +0x0 , 0x3e43 , 0x0 , 0x5831 , +0x4334 , 0x5265 , 0x0 , 0x562e , +0x4e5a , 0x5527 , 0x3a75 , 0x3726 , +0x4056 , 0x0 , 0x4639 , 0x4552 , +0x4747 , 0x0 , 0x3954 , 0x0 , +0x334b , 0x5252 , 0x0 , 0x0 , +0x583f , 0x3e45 , 0x4672 , 0x5232 , +0x4f30 , 0x4f67 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4a69 , 0x0 , +0x0 , 0x5840 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4272 , 0x4252 , 0x0 , 0x4869 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x472c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x414b , 0x0 , +0x5368 , 0x5579 , 0x0 , 0x4a42 , +0x367e , 0x5821 , 0x535a , 0x3f77 , +0x0 , 0x5446 , 0x3b25 , 0x5841 , +0x4e65 , 0x3e2e , 0x0 , 0x0 , +0x5828 , 0x0 , 0x5147 , 0x5029 , +0x0 , 0x0 , 0x0 , 0x583d , +0x596f , 0x4d76 , 0x3f3a , 0x0 , +0x3d3b , 0x3a25 , 0x5260 , 0x327a , +0x3a60 , 0x4436 , 0x0 , 0x4f6d , +0x3e29 , 0x4d24 , 0x4141 , 0x0 , +0x0 , 0x0 , 0x4757 , 0x5971 , +0x0 , 0x5974 , 0x0 , 0x0 , +0x0 , 0x0 , 0x484b , 0x5869 , +0x0 , 0x0 , 0x0 , 0x525a , +0x4a32 , 0x484a , 0x586c , 0x586a , +0x5846 , 0x3d76 , 0x464d , 0x3370 , +0x0 , 0x586b , 0x3d71 , 0x3d69 , +0x0 , 0x4854 , 0x3453 , 0x0 , +0x0 , 0x4258 , 0x0 , 0x3256 , +0x5750 , 0x4a4b , 0x4b7b , 0x554c , +0x3836 , 0x4f49 , 0x0 , 0x0 , +0x0 , 0x595a , 0x5870 , 0x472a , +0x0 , 0x586e , 0x0 , 0x347a , +0x416e , 0x5254 , 0x0 , 0x0 , +0x586d , 0x0 , 0x5247 , 0x586f , +0x4347 , 0x0 , 0x0 , 0x0 , +0x5176 , 0x0 , 0x5659 , 0x5872 , +0x0 , 0x5875 , 0x3c7e , 0x3c5b , +0x0 , 0x0 , 0x0 , 0x484e , +0x0 , 0x375d , 0x0 , 0x3742 , +0x0 , 0x4673 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5878 , 0x5241 , 0x0 , +0x0 , 0x4e69 , 0x3c3f , 0x377c , +0x3725 , 0x505d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x565a , +0x5345 , 0x3b6f , 0x3b61 , 0x5871 , +0x0 , 0x0 , 0x4921 , 0x4e30 , +0x342b , 0x0 , 0x5873 , 0x0 , +0x494b , 0x5876 , 0x4257 , 0x5877 , +0x0 , 0x0 , 0x4e31 , 0x5879 , +0x0 , 0x0 , 0x0 , 0x322e , +0x3940 , 0x0 , 0x5923 , 0x0 , +0x3069 , 0x0 , 0x4166 , 0x0 , +0x496c , 0x0 , 0x4b45 , 0x0 , +0x4b46 , 0x5924 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3568 , +0x0 , 0x0 , 0x352b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4e3b , 0x354d , 0x5721 , +0x5774 , 0x5353 , 0x0 , 0x4c65 , +0x0 , 0x3a4e , 0x0 , 0x5922 , +0x595c , 0x5360 , 0x587d , 0x3770 , +0x5777 , 0x587e , 0x587a , 0x5921 , +0x4463 , 0x0 , 0x0 , 0x5336 , +0x5874 , 0x595d , 0x0 , 0x587b , +0x0 , 0x4565 , 0x0 , 0x0 , +0x4050 , 0x0 , 0x0 , 0x5170 , +0x305b , 0x0 , 0x0 , 0x3c51 , +0x5926 , 0x0 , 0x5925 , 0x0 , +0x0 , 0x0 , 0x0 , 0x592c , +0x592e , 0x0 , 0x592b , 0x4a39 , +0x0 , 0x0 , 0x0 , 0x5929 , +0x5636 , 0x0 , 0x0 , 0x0 , +0x335e , 0x5928 , 0x0 , 0x407d , +0x0 , 0x4a4c , 0x0 , 0x592a , +0x0 , 0x5927 , 0x0 , 0x0 , +0x5930 , 0x0 , 0x0 , 0x3631 , +0x0 , 0x0 , 0x0 , 0x3929 , +0x0 , 0x5240 , 0x0 , 0x0 , +0x4f40 , 0x0 , 0x0 , 0x4242 , +0x0 , 0x3d44 , 0x556c , 0x3260 , +0x4748 , 0x3f6b , 0x592d , 0x0 , +0x592f , 0x0 , 0x4e6a , 0x3a6e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4756 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3163 , +0x0 , 0x0 , 0x0 , 0x3459 , +0x366d , 0x5934 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3f21 , 0x0 , +0x0 , 0x0 , 0x595e , 0x474e , +0x407e , 0x5938 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4b57 , +0x377d , 0x0 , 0x5935 , 0x0 , +0x5937 , 0x3123 , 0x5361 , 0x5939 , +0x0 , 0x5045 , 0x0 , 0x5936 , +0x0 , 0x0 , 0x5931 , 0x0 , +0x5932 , 0x4129 , 0x5933 , 0x0 , +0x0 , 0x3c73 , 0x505e , 0x3829 , +0x0 , 0x3e63 , 0x0 , 0x593d , +0x0 , 0x0 , 0x0 , 0x0 , +0x593a , 0x0 , 0x3033 , 0x0 , +0x0 , 0x0 , 0x5942 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5944 , 0x3136 , 0x0 , 0x593f , +0x0 , 0x0 , 0x3539 , 0x0 , +0x3e73 , 0x0 , 0x0 , 0x0 , +0x4c48 , 0x3a72 , 0x5250 , 0x0 , +0x5943 , 0x0 , 0x0 , 0x3d68 , +0x0 , 0x332b , 0x0 , 0x0 , +0x0 , 0x5945 , 0x3e6b , 0x0 , +0x5946 , 0x593b , 0x445f , 0x0 , +0x593e , 0x5941 , 0x5940 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x552e , 0x0 , +0x5635 , 0x0 , 0x4763 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5948 , +0x0 , 0x0 , 0x0 , 0x3c59 , +0x594a , 0x0 , 0x0 , 0x0 , +0x593c , 0x0 , 0x594b , 0x462b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5949 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5776 , 0x0 , +0x4d23 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3d21 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x594c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x453c , 0x4d35 , +0x0 , 0x0 , 0x0 , 0x594d , +0x0 , 0x0 , 0x5947 , 0x3325 , +0x3f7e , 0x0 , 0x0 , 0x0 , +0x0 , 0x3835 , 0x0 , 0x0 , +0x407c , 0x0 , 0x0 , 0x0 , +0x0 , 0x3078 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3476 , +0x0 , 0x594e , 0x0 , 0x594f , +0x3422 , 0x5950 , 0x0 , 0x0 , +0x345f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3041 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5951 , 0x4935 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4f71 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5952 , 0x0 , +0x0 , 0x0 , 0x4145 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5956 , 0x492e , +0x0 , 0x0 , 0x0 , 0x0 , +0x5955 , 0x5954 , 0x5957 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4b5b , +0x0 , 0x3d29 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4627 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5953 , 0x5958 , +0x0 , 0x0 , 0x0 , 0x5959 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4865 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x405c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3679 , +0x5823 , 0x544a , 0x0 , 0x542a , +0x5056 , 0x3364 , 0x5557 , 0x0 , +0x4f48 , 0x3962 , 0x0 , 0x3f4b , +0x0 , 0x4362 , 0x0 , 0x0 , +0x0 , 0x3652 , 0x0 , 0x0 , +0x4d43 , 0x596e , 0x5970 , 0x0 , +0x0 , 0x0 , 0x3533 , 0x0 , +0x3635 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3e24 , 0x0 , +0x0 , 0x486b , 0x0 , 0x0 , +0x482b , 0x0 , 0x0 , 0x304b , +0x392b , 0x4179 , 0x5962 , 0x0 , +0x403c , 0x3932 , 0x0 , 0x3958 , +0x504b , 0x3178 , 0x4664 , 0x3e5f , +0x3564 , 0x5748 , 0x0 , 0x5178 , +0x3c66 , 0x4a5e , 0x0 , 0x0 , +0x3c3d , 0x5966 , 0x5867 , 0x0 , +0x0 , 0x445a , 0x0 , 0x0 , +0x3854 , 0x483d , 0x0 , 0x0 , +0x3261 , 0x5459 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4330 , 0x0 , +0x0 , 0x4361 , 0x5a22 , 0x485f , +0x0 , 0x5034 , 0x0 , 0x3e7c , +0x4529 , 0x0 , 0x0 , 0x0 , +0x395a , 0x0 , 0x5a23 , 0x0 , +0x5429 , 0x5a24 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x597b , +0x362c , 0x0 , 0x0 , 0x376b , +0x3179 , 0x597c , 0x3365 , 0x3e76 , +0x0 , 0x3f76 , 0x5231 , 0x4064 , +0x0 , 0x0 , 0x0 , 0x3633 , +0x597e , 0x597d , 0x0 , 0x0 , +0x3e3b , 0x0 , 0x0 , 0x0 , +0x4660 , 0x0 , 0x573c , 0x5a21 , +0x0 , 0x4139 , 0x0 , 0x3572 , +0x4168 , 0x0 , 0x0 , 0x3c75 , +0x0 , 0x3455 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x415d , +0x0 , 0x447d , 0x0 , 0x0 , +0x3c38 , 0x3732 , 0x0 , 0x0 , +0x376f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x596c , +0x0 , 0x463e , 0x0 , 0x3f2d , +0x3b4b , 0x0 , 0x0 , 0x354a , +0x0 , 0x5b49 , 0x5057 , 0x0 , +0x4d39 , 0x303c , 0x3376 , 0x3b77 , +0x5b4a , 0x3a2f , 0x0 , 0x5464 , +0x3536 , 0x3573 , 0x5856 , 0x4850 , +0x0 , 0x0 , 0x3756 , 0x4750 , +0x5857 , 0x0 , 0x3f2f , 0x0 , +0x0 , 0x5b3b , 0x5858 , 0x0 , +0x0 , 0x504c , 0x3b2e , 0x0 , +0x0 , 0x0 , 0x6b3e , 0x4150 , +0x4175 , 0x5472 , 0x3855 , 0x3434 , +0x0 , 0x3375 , 0x0 , 0x0 , +0x493e , 0x0 , 0x0 , 0x0 , +0x4550 , 0x0 , 0x0 , 0x0 , +0x4559 , 0x407b , 0x0 , 0x3170 , +0x0 , 0x5859 , 0x394e , 0x0 , +0x353d , 0x0 , 0x0 , 0x585a , +0x0 , 0x0 , 0x5646 , 0x4b22 , +0x482f , 0x4932 , 0x344c , 0x3f4c , +0x0 , 0x3974 , 0x0 , 0x585b , +0x585c , 0x3667 , 0x3c41 , 0x4c6a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4f77 , 0x0 , +0x585d , 0x4730 , 0x0 , 0x0 , +0x3950 , 0x3d23 , 0x0 , 0x0 , +0x4c5e , 0x0 , 0x464a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5860 , 0x0 , 0x585e , 0x0 , +0x0 , 0x585f , 0x0 , 0x0 , +0x0 , 0x307e , 0x0 , 0x3e67 , +0x0 , 0x4a23 , 0x3c74 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3831 , +0x0 , 0x0 , 0x386e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5862 , 0x0 , 0x3d4b , +0x0 , 0x5864 , 0x5863 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x457c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5865 , 0x0 , 0x0 , 0x5866 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4126 , +0x0 , 0x4830 , 0x306c , 0x3926 , +0x3c53 , 0x4e71 , 0x5b3d , 0x4153 , +0x0 , 0x0 , 0x0 , 0x0 , +0x362f , 0x567a , 0x452c , 0x3d59 , +0x5b3e , 0x5b3f , 0x0 , 0x0 , +0x0 , 0x4078 , 0x3e22 , 0x404d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5b40 , 0x4a46 , +0x0 , 0x0 , 0x0 , 0x322a , +0x0 , 0x0 , 0x0 , 0x5342 , +0x0 , 0x4363 , 0x0 , 0x512b , +0x0 , 0x0 , 0x0 , 0x0 , +0x5b42 , 0x0 , 0x4055 , 0x0 , +0x0 , 0x0 , 0x5b43 , 0x0 , +0x3f31 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x443c , +0x0 , 0x0 , 0x0 , 0x0 , +0x475a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5b44 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5968 , 0x4957 , 0x0 , +0x0 , 0x0 , 0x3934 , 0x4e70 , +0x5448 , 0x0 , 0x0 , 0x0 , +0x0 , 0x307c , 0x3452 , 0x0 , +0x5059 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5969 , 0x0 , 0x5e4b , +0x596b , 0x0 , 0x0 , 0x0 , +0x0 , 0x5830 , 0x3b2f , 0x3131 , +0x0 , 0x3357 , 0x584e , 0x0 , +0x0 , 0x5451 , 0x0 , 0x0 , +0x3d33 , 0x3f6f , 0x0 , 0x4f3b , +0x0 , 0x0 , 0x5850 , 0x0 , +0x0 , 0x0 , 0x374b , 0x0 , +0x0 , 0x0 , 0x5851 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4625 , 0x4778 , 0x523d , +0x0 , 0x0 , 0x5852 , 0x4464 , +0x0 , 0x4a2e , 0x0 , 0x4727 , +0x0 , 0x5826 , 0x0 , 0x497d , +0x4e67 , 0x3b5c , 0x306b , 0x0 , +0x0 , 0x0 , 0x3b2a , 0x502d , +0x0 , 0x3130 , 0x5764 , 0x573f , +0x0 , 0x3525 , 0x4274 , 0x444f , +0x0 , 0x0 , 0x3229 , 0x0 , +0x3237 , 0x0 , 0x3165 , 0x5f32 , +0x553c , 0x3f28 , 0x422c , 0x5855 , +0x4231 , 0x0 , 0x5854 , 0x4e54 , +0x0 , 0x5a60 , 0x0 , 0x4e40 , +0x0 , 0x0 , 0x5834 , 0x432e , +0x5321 , 0x4e23 , 0x0 , 0x3c34 , +0x4834 , 0x4251 , 0x0 , 0x3e6d , +0x5036 , 0x0 , 0x5a61 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4764 , +0x0 , 0x0 , 0x3327 , 0x0 , +0x3672 , 0x4c7c , 0x407a , 0x0 , +0x0 , 0x4077 , 0x0 , 0x5139 , +0x5161 , 0x5847 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x325e , 0x0 , 0x0 , +0x4065 , 0x0 , 0x3a71 , 0x0 , +0x0 , 0x5848 , 0x0 , 0x542d , +0x0 , 0x0 , 0x4f61 , 0x5849 , +0x0 , 0x584a , 0x4f43 , 0x0 , +0x3378 , 0x3e47 , 0x0 , 0x0 , +0x0 , 0x0 , 0x584b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5b4c , 0x0 , +0x0 , 0x0 , 0x0 , 0x4825 , +0x0 , 0x0 , 0x0 , 0x4f58 , +0x0 , 0x487e , 0x324e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5356 , 0x3266 , 0x3c30 , 0x5351 , +0x4b2b , 0x3734 , 0x0 , 0x0 , +0x0 , 0x3722 , 0x0 , 0x0 , +0x4a65 , 0x0 , 0x4821 , 0x4a5c , +0x3164 , 0x5070 , 0x0 , 0x4551 , +0x0 , 0x0 , 0x0 , 0x5b45 , +0x357e , 0x0 , 0x0 , 0x3f5a , +0x3945 , 0x3e64 , 0x416d , 0x0 , +0x5f36 , 0x5f35 , 0x563b , 0x3d50 , +0x5559 , 0x3048 , 0x3623 , 0x3f49 , +0x4c28 , 0x5f33 , 0x4a37 , 0x5352 , +0x0 , 0x584f , 0x5236 , 0x3a45 , +0x4b3e , 0x4c3e , 0x0 , 0x5f37 , +0x3570 , 0x5f34 , 0x0 , 0x0 , +0x0 , 0x5375 , 0x0 , 0x3354 , +0x3877 , 0x0 , 0x5f3a , 0x0 , +0x3a4f , 0x3c2a , 0x3575 , 0x0 , +0x4d2c , 0x437b , 0x3a73 , 0x4074 , +0x4d42 , 0x4f72 , 0x5f38 , 0x4f45 , +0x0 , 0x4240 , 0x5f39 , 0x4270 , +0x0 , 0x0 , 0x0 , 0x3e7d , +0x0 , 0x415f , 0x4d4c , 0x5277 , +0x374d , 0x5f41 , 0x0 , 0x5f44 , +0x0 , 0x0 , 0x3771 , 0x3049 , +0x3656 , 0x3754 , 0x0 , 0x3a2c , +0x4c7d , 0x3f54 , 0x4b31 , 0x4674 , +0x0 , 0x5628 , 0x5f45 , 0x0 , +0x4e62 , 0x3333 , 0x0 , 0x0 , +0x4e7c , 0x3435 , 0x0 , 0x4e47 , +0x3a70 , 0x0 , 0x4e61 , 0x0 , +0x513d , 0x0 , 0x0 , 0x5f40 , +0x0 , 0x0 , 0x3474 , 0x0 , +0x334a , 0x0 , 0x3866 , 0x5f3b , +0x0 , 0x0 , 0x0 , 0x0 , +0x4445 , 0x0 , 0x5f3c , 0x5f3d , +0x5f3e , 0x453b , 0x5f3f , 0x5f42 , +0x5431 , 0x5f43 , 0x0 , 0x473a , +0x4e58 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4458 , 0x0 , +0x5f4a , 0x0 , 0x5f4f , 0x0 , +0x565c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5f49 , 0x5f5a , 0x4e36 , +0x0 , 0x3a47 , 0x5f4e , 0x5f48 , +0x455e , 0x0 , 0x0 , 0x496b , +0x3a74 , 0x437c , 0x0 , 0x0 , +0x3e57 , 0x0 , 0x5f46 , 0x0 , +0x5f4d , 0x0 , 0x4558 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5526 , +0x3a4d , 0x0 , 0x3e4c , 0x533d , +0x3840 , 0x0 , 0x5664 , 0x0 , +0x5f47 , 0x393e , 0x3f27 , 0x0 , +0x0 , 0x417c , 0x5f4b , 0x5f4c , +0x0 , 0x5f50 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5f5b , +0x5f65 , 0x0 , 0x5f57 , 0x5f56 , +0x5749 , 0x5f63 , 0x5f64 , 0x656b , +0x5227 , 0x5f52 , 0x0 , 0x3f29 , +0x0 , 0x545b , 0x0 , 0x3f48 , +0x5f54 , 0x0 , 0x0 , 0x0 , +0x4f4c , 0x0 , 0x0 , 0x5f5d , +0x0 , 0x514a , 0x0 , 0x5f5e , +0x3027 , 0x4637 , 0x5f53 , 0x0 , +0x3a65 , 0x0 , 0x365f , 0x4d5b , +0x397e , 0x5455 , 0x0 , 0x0 , +0x5f5f , 0x4f6c , 0x3025 , 0x5f67 , +0x5f51 , 0x5146 , 0x5f55 , 0x5f58 , +0x5f59 , 0x5f5c , 0x0 , 0x3b29 , +0x0 , 0x5f60 , 0x5f61 , 0x0 , +0x5f62 , 0x5f66 , 0x5f68 , 0x5334 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3867 , 0x4536 , 0x5f6a , +0x495a , 0x4128 , 0x4444 , 0x0 , +0x0 , 0x3f5e , 0x4f78 , 0x0 , +0x0 , 0x0 , 0x555c , 0x5f6e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3238 , 0x0 , +0x3a5f , 0x5f6c , 0x0 , 0x5b41 , +0x0 , 0x5164 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4b74 , 0x343d , +0x0 , 0x3026 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5f71 , +0x4c46 , 0x5f72 , 0x0 , 0x0 , +0x5f6d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5f69 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5f6b , 0x0 , 0x5f6f , 0x5f70 , +0x3b3d , 0x0 , 0x0 , 0x5f73 , +0x0 , 0x0 , 0x5f74 , 0x0 , +0x3b23 , 0x0 , 0x4a5b , 0x4e28 , +0x6027 , 0x332a , 0x0 , 0x6026 , +0x0 , 0x0 , 0x0 , 0x6021 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5f7e , 0x0 , 0x4d59 , 0x5f7c , +0x0 , 0x5f7a , 0x0 , 0x3f50 , +0x5744 , 0x0 , 0x494c , 0x0 , +0x0 , 0x5f78 , 0x3021 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5f7d , 0x0 , 0x0 , 0x0 , +0x0 , 0x5f7b , 0x6022 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6028 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3748 , 0x0 , 0x0 , +0x4621 , 0x4936 , 0x4032 , 0x5f75 , +0x0 , 0x0 , 0x453e , 0x0 , +0x5844 , 0x5f79 , 0x4476 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6023 , 0x6024 , 0x6025 , +0x5025 , 0x0 , 0x0 , 0x6034 , +0x4c64 , 0x0 , 0x6031 , 0x0 , +0x3f26 , 0x602f , 0x4e39 , 0x602b , +0x4946 , 0x0 , 0x0 , 0x402e , +0x602e , 0x3a6d , 0x3a30 , 0x6029 , +0x0 , 0x0 , 0x0 , 0x5f76 , +0x0 , 0x6033 , 0x0 , 0x0 , +0x6038 , 0x0 , 0x0 , 0x0 , +0x342d , 0x6039 , 0x0 , 0x0 , +0x4f32 , 0x3a48 , 0x0 , 0x6030 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x507a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x602c , 0x0 , 0x547b , +0x0 , 0x5f77 , 0x0 , 0x4567 , +0x0 , 0x602d , 0x0 , 0x5377 , +0x0 , 0x6036 , 0x6037 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6044 , 0x5061 , 0x0 , 0x0 , +0x0 , 0x603c , 0x0 , 0x0 , +0x6049 , 0x604a , 0x0 , 0x0 , +0x0 , 0x603e , 0x602a , 0x4924 , +0x6041 , 0x0 , 0x6032 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4a48 , 0x6043 , 0x0 , 0x6035 , +0x0 , 0x4e4b , 0x0 , 0x4b43 , +0x604d , 0x6046 , 0x6042 , 0x0 , +0x604b , 0x0 , 0x603a , 0x603f , +0x6040 , 0x0 , 0x0 , 0x6045 , +0x0 , 0x0 , 0x6047 , 0x6048 , +0x0 , 0x604c , 0x0 , 0x603b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4b54 , 0x6055 , 0x0 , +0x6056 , 0x6052 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6050 , 0x3c4e , 0x0 , 0x0 , +0x6051 , 0x0 , 0x3842 , 0x5845 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x506a , 0x0 , 0x0 , 0x426f , +0x0 , 0x0 , 0x604f , 0x603d , +0x0 , 0x0 , 0x0 , 0x6054 , +0x6053 , 0x0 , 0x0 , 0x6057 , +0x0 , 0x0 , 0x0 , 0x0 , +0x605c , 0x6058 , 0x0 , 0x0 , +0x0 , 0x5676 , 0x3330 , 0x0 , +0x576c , 0x0 , 0x4b3b , 0x0 , +0x0 , 0x605a , 0x0 , 0x4e7b , +0x0 , 0x0 , 0x0 , 0x3a59 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6061 , 0x605d , 0x522d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6062 , 0x0 , 0x0 , 0x605b , +0x6059 , 0x605f , 0x0 , 0x0 , +0x6060 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x605e , 0x0 , +0x6064 , 0x0 , 0x0 , 0x0 , +0x4677 , 0x582c , 0x546b , 0x6066 , +0x4a49 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6065 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3841 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6067 , +0x6068 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6069 , 0x6063 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3a3f , 0x4c67 , +0x0 , 0x0 , 0x0 , 0x606a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4f79 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x606b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4842 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3d40 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4452 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x606c , 0x0 , 0x0 , 0x606d , +0x0 , 0x0 , 0x4774 , 0x4b44 , +0x0 , 0x606e , 0x3b58 , 0x5836 , +0x5272 , 0x606f , 0x4d45 , 0x0 , +0x365a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6071 , +0x0 , 0x5430 , 0x0 , 0x0 , +0x4027 , 0x3451 , 0x0 , 0x0 , +0x4e27 , 0x6070 , 0x0 , 0x0 , +0x0 , 0x6072 , 0x394c , 0x0 , +0x0 , 0x397a , 0x4d3c , 0x6073 , +0x0 , 0x0 , 0x0 , 0x4654 , +0x6074 , 0x0 , 0x5432 , 0x0 , +0x4826 , 0x6076 , 0x6075 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6077 , 0x0 , 0x0 , 0x4d41 , +0x0 , 0x0 , 0x0 , 0x4a25 , +0x0 , 0x0 , 0x0 , 0x0 , +0x545a , 0x5b57 , 0x5b59 , 0x0 , +0x5b58 , 0x3967 , 0x5b5c , 0x5b5d , +0x3558 , 0x0 , 0x0 , 0x5b5a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5b5b , 0x3321 , 0x5b5f , +0x0 , 0x0 , 0x3b78 , 0x0 , +0x5637 , 0x0 , 0x5b60 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3e79 , +0x0 , 0x0 , 0x373b , 0x0 , +0x5b50 , 0x4c2e , 0x3f32 , 0x3b35 , +0x5778 , 0x3f53 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3f69 , +0x0 , 0x0 , 0x3c61 , 0x4c33 , +0x5b5e , 0x3053 , 0x4e6b , 0x3758 , +0x5739 , 0x4642 , 0x0 , 0x0 , +0x4024 , 0x0 , 0x4c39 , 0x0 , +0x5b67 , 0x5b61 , 0x463a , 0x5b63 , +0x0 , 0x5b68 , 0x0 , 0x4577 , +0x0 , 0x0 , 0x0 , 0x5b6a , +0x0 , 0x0 , 0x5b69 , 0x3f40 , +0x0 , 0x0 , 0x0 , 0x5b66 , +0x5b65 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3439 , 0x402c , +0x4222 , 0x5b62 , 0x5b64 , 0x0 , +0x0 , 0x0 , 0x0 , 0x504d , +0x5b6d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x405d , 0x5b72 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3662 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5b73 , 0x5b52 , 0x3938 , 0x542b , +0x5b6c , 0x0 , 0x3f51 , 0x5b70 , +0x0 , 0x5b51 , 0x0 , 0x3566 , +0x0 , 0x5b6b , 0x3f65 , 0x0 , +0x0 , 0x0 , 0x5b6e , 0x0 , +0x5b71 , 0x0 , 0x0 , 0x0 , +0x5b79 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3921 , 0x3023 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4271 , +0x0 , 0x0 , 0x3347 , 0x5b6f , +0x0 , 0x0 , 0x5b78 , 0x0 , +0x4652 , 0x5b74 , 0x0 , 0x0 , +0x5b75 , 0x5b77 , 0x5b76 , 0x0 , +0x0 , 0x5b7e , 0x0 , 0x5372 , +0x323a , 0x0 , 0x0 , 0x0 , +0x5b7d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5c24 , 0x0 , 0x5b7b , +0x0 , 0x0 , 0x0 , 0x0 , +0x5b7a , 0x0 , 0x0 , 0x0 , +0x5b7c , 0x4560 , 0x3b79 , 0x0 , +0x0 , 0x5c23 , 0x0 , 0x0 , +0x5c25 , 0x0 , 0x4c43 , 0x0 , +0x0 , 0x0 , 0x3651 , 0x5d40 , +0x0 , 0x0 , 0x0 , 0x5c21 , +0x0 , 0x5c22 , 0x0 , 0x0 , +0x0 , 0x4735 , 0x0 , 0x0 , +0x0 , 0x3669 , 0x0 , 0x0 , +0x0 , 0x5c27 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5c26 , 0x0 , +0x5c29 , 0x3124 , 0x0 , 0x0 , +0x354c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3f30 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x515f , 0x0 , 0x0 , 0x0 , +0x0 , 0x3642 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5c28 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4b7a , 0x6b73 , 0x0 , 0x0 , +0x0 , 0x4b5c , 0x0 , 0x0 , +0x4b7e , 0x0 , 0x0 , 0x0 , +0x4c41 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x487b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5c2a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4c6e , +0x5c2b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5b53 , 0x0 , +0x5c2f , 0x5c2c , 0x0 , 0x3e33 , +0x0 , 0x4a7b , 0x0 , 0x0 , +0x0 , 0x5c2d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x494a , 0x4439 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x473d , 0x5c2e , 0x0 , +0x0 , 0x0 , 0x5476 , 0x5066 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x442b , 0x3655 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5b54 , 0x0 , 0x0 , 0x0 , +0x0 , 0x315a , 0x0 , 0x0 , +0x0 , 0x5b55 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5b56 , 0x0 , 0x0 , +0x0 , 0x3a3e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4840 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4a3f , +0x4849 , 0x0 , 0x5733 , 0x0 , +0x4979 , 0x0 , 0x0 , 0x3f47 , +0x0 , 0x0 , 0x3a78 , 0x0 , +0x0 , 0x523c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x623a , 0x0 , +0x3426 , 0x0 , 0x0 , 0x3138 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3834 , 0x0 , 0x4f44 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5967 , 0x4f26 , 0x4d62 , 0x0 , +0x0 , 0x596d , 0x3660 , 0x0 , +0x5239 , 0x0 , 0x0 , 0x393b , +0x0 , 0x0 , 0x0 , 0x0 , +0x6239 , 0x6237 , 0x0 , 0x3473 , +0x0 , 0x4c6c , 0x4c2b , 0x3772 , +0x0 , 0x5832 , 0x516b , 0x3a3b , +0x0 , 0x4a27 , 0x0 , 0x0 , +0x4d37 , 0x0 , 0x0 , 0x5244 , +0x3f64 , 0x3c50 , 0x3661 , 0x0 , +0x5e45 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5e46 , 0x5b3c , 0x0 , +0x5159 , 0x0 , 0x0 , 0x4666 , +0x444e , 0x376e , 0x0 , 0x375c , +0x0 , 0x0 , 0x3f7c , 0x5760 , +0x0 , 0x4675 , 0x0 , 0x0 , +0x313c , 0x5e48 , 0x3d31 , 0x4c57 , +0x5e4a , 0x0 , 0x5e49 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x356c , 0x0 , 0x495d , 0x0 , +0x0 , 0x3042 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x452e , +0x452b , 0x0 , 0x444c , 0x0 , +0x3c69 , 0x4b7d , 0x0 , 0x0 , +0x0 , 0x3a43 , 0x0 , 0x0 , +0x0 , 0x6579 , 0x4867 , 0x657a , +0x4d7d , 0x0 , 0x5731 , 0x383e , +0x4268 , 0x0 , 0x4851 , 0x0 , +0x0 , 0x657b , 0x0 , 0x0 , +0x0 , 0x0 , 0x364a , 0x3c4b , +0x0 , 0x0 , 0x517d , 0x6621 , +0x0 , 0x436e , 0x0 , 0x0 , +0x0 , 0x0 , 0x6624 , 0x0 , +0x0 , 0x0 , 0x0 , 0x657e , +0x6625 , 0x4d57 , 0x0 , 0x0 , +0x3741 , 0x657c , 0x657d , 0x6623 , +0x0 , 0x0 , 0x445d , 0x6628 , +0x0 , 0x0 , 0x6627 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4343 , 0x0 , 0x465e , +0x0 , 0x0 , 0x662a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4437 , 0x0 , +0x0 , 0x0 , 0x6622 , 0x4a3c , +0x0 , 0x0 , 0x0 , 0x0 , +0x3d63 , 0x3943 , 0x6626 , 0x5055 , +0x4e2f , 0x0 , 0x0 , 0x6629 , +0x6630 , 0x0 , 0x5226 , 0x0 , +0x3d2a , 0x662d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x662f , +0x0 , 0x4051 , 0x0 , 0x0 , +0x524c , 0x0 , 0x0 , 0x0 , +0x3c27 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6631 , 0x0 , 0x5276 , +0x0 , 0x0 , 0x0 , 0x574b , +0x0 , 0x4d7e , 0x0 , 0x4d5e , +0x4226 , 0x662b , 0x662c , 0x3d3f , +0x662e , 0x6633 , 0x0 , 0x0 , +0x6632 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6636 , 0x0 , 0x6638 , +0x0 , 0x0 , 0x0 , 0x0 , +0x446f , 0x0 , 0x0 , 0x0 , +0x4448 , 0x0 , 0x0 , 0x3e6a , +0x496f , 0x0 , 0x0 , 0x6637 , +0x0 , 0x3670 , 0x0 , 0x0 , +0x0 , 0x4364 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5369 , 0x6634 , 0x0 , +0x6635 , 0x0 , 0x4822 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x663d , 0x0 , 0x0 , 0x0 , +0x6639 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4645 , 0x0 , +0x0 , 0x4d71 , 0x663b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x663c , 0x0 , 0x0 , +0x0 , 0x0 , 0x3b69 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x663e , 0x0 , +0x0 , 0x0 , 0x0 , 0x663a , +0x0 , 0x0 , 0x4037 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5324 , 0x663f , 0x4974 , 0x6643 , +0x0 , 0x0 , 0x6644 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5076 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x433d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4344 , 0x6642 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6641 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6647 , 0x4f31 , +0x0 , 0x6b74 , 0x0 , 0x0 , +0x664a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6645 , 0x0 , +0x0 , 0x3c5e , 0x4929 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3c35 , 0x0 , 0x0 , +0x4f53 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6648 , 0x0 , +0x6649 , 0x0 , 0x664e , 0x0 , +0x6650 , 0x0 , 0x0 , 0x0 , +0x6651 , 0x0 , 0x0 , 0x0 , +0x664b , 0x3555 , 0x0 , 0x664c , +0x0 , 0x0 , 0x664f , 0x0 , +0x0 , 0x445b , 0x0 , 0x6646 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x664d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6652 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6654 , 0x6653 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6655 , 0x0 , +0x5978 , 0x0 , 0x0 , 0x6656 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6657 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5753 , 0x665d , 0x0 , 0x665e , +0x3f57 , 0x5450 , 0x0 , 0x5756 , +0x3466 , 0x4b6f , 0x665a , 0x5843 , +0x574e , 0x5022 , 0x0 , 0x434f , +0x0 , 0x0 , 0x665f , 0x3c3e , +0x3942 , 0x665b , 0x5127 , 0x0 , +0x0 , 0x3a22 , 0x424f , 0x0 , +0x582b , 0x0 , 0x0 , 0x0 , +0x4a6b , 0x656e , 0x0 , 0x665c , +0x0 , 0x3775 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4866 , 0x0 , +0x0 , 0x4475 , 0x0 , 0x0 , +0x6532 , 0x447e , 0x0 , 0x4b7c , +0x6533 , 0x552c , 0x0 , 0x536e , +0x4a58 , 0x3032 , 0x0 , 0x4b4e , +0x4d6a , 0x0 , 0x0 , 0x3a6a , +0x0 , 0x0 , 0x0 , 0x6535 , +0x0 , 0x6534 , 0x0 , 0x575a , +0x3959 , 0x5666 , 0x3628 , 0x4d70 , +0x524b , 0x3126 , 0x4a35 , 0x0 , +0x3368 , 0x4973 , 0x3f4d , 0x507b , +0x4a52 , 0x6536 , 0x3b42 , 0x0 , +0x0 , 0x0 , 0x4f5c , 0x392c , +0x0 , 0x0 , 0x0 , 0x0 , +0x5457 , 0x0 , 0x0 , 0x3a26 , +0x5167 , 0x4f7c , 0x3c52 , 0x0 , +0x6537 , 0x485d , 0x0 , 0x0 , +0x0 , 0x3f6d , 0x3176 , 0x4b5e , +0x0 , 0x0 , 0x3c45 , 0x0 , +0x3c44 , 0x527a , 0x435c , 0x3f5c , +0x0 , 0x0 , 0x0 , 0x0 , +0x383b , 0x0 , 0x0 , 0x0 , +0x4342 , 0x0 , 0x3a2e , 0x5422 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x475e , 0x442f , 0x326c , +0x0 , 0x3951 , 0x0 , 0x0 , +0x653b , 0x4148 , 0x0 , 0x0 , +0x552f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x653c , 0x0 , +0x653e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3467 , 0x3654 , 0x4b42 , 0x5130 , +0x353c , 0x0 , 0x0 , 0x4a59 , +0x0 , 0x3762 , 0x0 , 0x0 , +0x4964 , 0x0 , 0x3d2b , 0x0 , +0x0 , 0x4e3e , 0x5770 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5021 , +0x0 , 0x4959 , 0x0 , 0x0 , +0x367b , 0x6658 , 0x3c62 , 0x0 , +0x333e , 0x0 , 0x4950 , 0x0 , +0x6659 , 0x3322 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5e4c , 0x0 , +0x5348 , 0x5e4d , 0x0 , 0x5222 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5e4e , 0x0 , 0x0 , 0x0 , +0x0 , 0x3e4d , 0x0 , 0x0 , +0x5e4f , 0x0 , 0x0 , 0x0 , +0x4a2c , 0x527c , 0x335f , 0x656a , +0x4461 , 0x3e21 , 0x4e32 , 0x4472 , +0x3e56 , 0x4628 , 0x3263 , 0x0 , +0x0 , 0x3e53 , 0x0 , 0x0 , +0x477c , 0x4c6b , 0x3d6c , 0x4e5d , +0x0 , 0x0 , 0x4a3a , 0x4641 , +0x656c , 0x503c , 0x0 , 0x0 , +0x0 , 0x5539 , 0x0 , 0x0 , +0x0 , 0x656d , 0x0 , 0x0 , +0x0 , 0x0 , 0x4a74 , 0x0 , +0x4d40 , 0x4245 , 0x0 , 0x656f , +0x0 , 0x4244 , 0x6570 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6578 , 0x4d4d , +0x0 , 0x493d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5259 , 0x6128 , 0x0 , +0x0 , 0x0 , 0x0 , 0x536c , +0x0 , 0x4b6a , 0x4671 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x612c , 0x0 , 0x0 , 0x0 , +0x6127 , 0x6129 , 0x0 , 0x0 , +0x612a , 0x612f , 0x0 , 0x0 , +0x326d , 0x0 , 0x612b , 0x385a , +0x612d , 0x612e , 0x6130 , 0x353a , +0x6131 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6133 , 0x6138 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5152 , 0x0 , 0x6136 , +0x6135 , 0x416b , 0x0 , 0x0 , +0x0 , 0x6137 , 0x0 , 0x5440 , +0x0 , 0x6132 , 0x0 , 0x613a , +0x3036 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6134 , 0x0 , 0x3f79 , +0x0 , 0x6139 , 0x0 , 0x0 , +0x613b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x613e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x613c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5645 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4f3f , 0x0 , 0x0 , +0x613d , 0x613f , 0x424d , 0x0 , +0x366b , 0x0 , 0x5378 , 0x0 , +0x0 , 0x474d , 0x0 , 0x0 , +0x3765 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3e7e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6140 , 0x6141 , +0x0 , 0x0 , 0x6147 , 0x3367 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4669 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x345e , 0x0 , 0x5142 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6148 , +0x0 , 0x0 , 0x6146 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6145 , 0x0 , 0x6143 , 0x6142 , +0x0 , 0x3140 , 0x0 , 0x0 , +0x0 , 0x5538 , 0x6144 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x614b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x614c , 0x614a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6f7a , +0x0 , 0x0 , 0x6153 , 0x6152 , +0x4736 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6149 , 0x0 , 0x0 , 0x614e , +0x0 , 0x6150 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6154 , 0x0 , 0x6151 , +0x614d , 0x0 , 0x0 , 0x614f , +0x0 , 0x0 , 0x0 , 0x0 , +0x6155 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6156 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6157 , 0x0 , 0x0 , +0x0 , 0x6158 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x615a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x615b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4e21 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x675d , +0x0 , 0x3428 , 0x565d , 0x0 , +0x0 , 0x5132 , 0x3332 , 0x0 , +0x0 , 0x3924 , 0x5773 , 0x4749 , +0x3e5e , 0x392e , 0x0 , 0x4e57 , +0x0 , 0x0 , 0x326e , 0x5b4f , +0x0 , 0x3c3a , 0x5251 , 0x4b48 , +0x304d , 0x0 , 0x0 , 0x4f6f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5963 , 0x3d6d , 0x0 , +0x0 , 0x3152 , 0x4a50 , 0x323c , +0x0 , 0x4b27 , 0x372b , 0x0 , +0x4a26 , 0x0 , 0x0 , 0x0 , +0x4f23 , 0x0 , 0x0 , 0x6078 , +0x554a , 0x607b , 0x0 , 0x0 , +0x607a , 0x4541 , 0x4c7b , 0x0 , +0x4131 , 0x6079 , 0x5663 , 0x322f , +0x5644 , 0x355b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3478 , 0x5621 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4f2f , 0x306f , 0x0 , +0x0 , 0x607c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6121 , +0x3323 , 0x0 , 0x0 , 0x607d , +0x607e , 0x4331 , 0x0 , 0x0 , +0x0 , 0x0 , 0x435d , 0x0 , +0x6122 , 0x3779 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3b4f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6123 , 0x443b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6124 , +0x0 , 0x0 , 0x6125 , 0x0 , +0x0 , 0x6126 , 0x3431 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3849 , 0x463d , +0x446a , 0x0 , 0x3222 , 0x0 , +0x5052 , 0x0 , 0x675b , 0x3b43 , +0x5357 , 0x5344 , 0x0 , 0x3963 , +0x624f , 0x0 , 0x0 , 0x0 , +0x572f , 0x0 , 0x476c , 0x3153 , +0x0 , 0x0 , 0x3432 , 0x6251 , +0x0 , 0x0 , 0x0 , 0x5072 , +0x422e , 0x6250 , 0x0 , 0x3f62 , +0x5326 , 0x3557 , 0x6252 , 0x356a , +0x0 , 0x436d , 0x387d , 0x0 , +0x382e , 0x0 , 0x4553 , 0x374f , +0x6254 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6253 , 0x3648 , 0x5779 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4d25 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6258 , +0x0 , 0x6256 , 0x4a7c , 0x3f35 , +0x5339 , 0x6255 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6257 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x412e , 0x4048 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x625b , 0x625a , 0x402a , +0x0 , 0x0 , 0x414e , 0x0 , +0x0 , 0x0 , 0x0 , 0x625c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x625d , 0x0 , 0x625e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5b48 , 0x0 , 0x5153 , 0x4d22 , +0x0 , 0x0 , 0x3d28 , 0x0 , +0x0 , 0x0 , 0x5e43 , 0x5825 , +0x3f2a , 0x5b4d , 0x526c , 0x467a , +0x452a , 0x0 , 0x0 , 0x0 , +0x5e44 , 0x0 , 0x3157 , 0x5f2e , +0x0 , 0x0 , 0x0 , 0x4a3d , +0x0 , 0x5f31 , 0x0 , 0x392d , +0x0 , 0x527d , 0x0 , 0x3825 , +0x3a6b , 0x0 , 0x0 , 0x335a , +0x0 , 0x0 , 0x0 , 0x355c , +0x5545 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4356 , 0x4f52 , 0x3b21 , +0x0 , 0x6573 , 0x6572 , 0x0 , +0x0 , 0x6574 , 0x0 , 0x4d64 , +0x0 , 0x4875 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x352f , 0x473f , 0x0 , +0x6576 , 0x0 , 0x0 , 0x0 , +0x6c30 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6566 , 0x0 , 0x3969 , 0x3531 , +0x0 , 0x423c , 0x6568 , 0x6567 , +0x6569 , 0x0 , 0x0 , 0x0 , +0x0 , 0x524d , 0x0 , 0x0 , +0x0 , 0x616a , 0x504e , 0x0 , +0x4d2e , 0x0 , 0x5165 , 0x0 , +0x0 , 0x324a , 0x316b , 0x0 , +0x3172 , 0x456d , 0x0 , 0x0 , +0x5543 , 0x5330 , 0x0 , 0x615c , +0x0 , 0x0 , 0x0 , 0x615d , +0x0 , 0x525b , 0x0 , 0x3339 , +0x314b , 0x0 , 0x0 , 0x0 , +0x4d79 , 0x5577 , 0x615e , 0x0 , +0x3e36 , 0x347d , 0x0 , 0x615f , +0x3a5c , 0x6160 , 0x3b32 , 0x4249 , +0x6161 , 0x0 , 0x0 , 0x0 , +0x506c , 0x0 , 0x4d3d , 0x0 , +0x0 , 0x6162 , 0x0 , 0x3543 , +0x4547 , 0x6163 , 0x0 , 0x0 , +0x6164 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5379 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6165 , 0x0 , 0x512d , 0x0 , +0x0 , 0x6166 , 0x4e22 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6167 , 0x0 , 0x3542 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6168 , 0x3b55 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5044 , +0x6260 , 0x3158 , 0x5264 , 0x0 , +0x0 , 0x6261 , 0x0 , 0x0 , +0x3c49 , 0x484c , 0x0 , 0x6263 , +0x6c7e , 0x6c7d , 0x5f2f , 0x0 , +0x0 , 0x0 , 0x6262 , 0x563e , +0x4d7c , 0x4326 , 0x0 , 0x0 , +0x0 , 0x6343 , 0x0 , 0x0 , +0x5652 , 0x6267 , 0x0 , 0x0 , +0x6268 , 0x0 , 0x0 , 0x5347 , +0x0 , 0x0 , 0x626c , 0x3f6c , +0x0 , 0x626d , 0x6265 , 0x0 , +0x0 , 0x3340 , 0x0 , 0x0 , +0x0 , 0x446e , 0x0 , 0x0 , +0x626e , 0x0 , 0x0 , 0x5043 , +0x0 , 0x3a76 , 0x6269 , 0x375e , +0x3b33 , 0x4c2c , 0x4b4b , 0x6264 , +0x6266 , 0x626a , 0x626b , 0x0 , +0x0 , 0x0 , 0x6277 , 0x0 , +0x0 , 0x6274 , 0x5475 , 0x6273 , +0x0 , 0x0 , 0x452d , 0x0 , +0x557a , 0x4542 , 0x3240 , 0x0 , +0x0 , 0x626f , 0x0 , 0x6272 , +0x412f , 0x4b3c , 0x0 , 0x0 , +0x3521 , 0x6279 , 0x0 , 0x0 , +0x0 , 0x3c31 , 0x6271 , 0x5054 , +0x5439 , 0x6275 , 0x3956 , 0x6276 , +0x0 , 0x0 , 0x0 , 0x4753 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6270 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x575c , +0x6d21 , 0x0 , 0x0 , 0x6278 , +0x0 , 0x6d25 , 0x627e , 0x4a51 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4135 , +0x0 , 0x3b50 , 0x0 , 0x0 , +0x3f56 , 0x0 , 0x3a63 , 0x0 , +0x0 , 0x4b21 , 0x0 , 0x0 , +0x0 , 0x6d26 , 0x6d23 , 0x0 , +0x0 , 0x6d22 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3b56 , 0x6d27 , +0x5074 , 0x0 , 0x0 , 0x6d24 , +0x3a5e , 0x3677 , 0x6321 , 0x3632 , +0x4c71 , 0x3927 , 0x0 , 0x4f22 , +0x4721 , 0x0 , 0x0 , 0x3f52 , +0x0 , 0x0 , 0x3671 , 0x0 , +0x627a , 0x627b , 0x627d , 0x627c , +0x4455 , 0x6322 , 0x0 , 0x5341 , +0x0 , 0x0 , 0x0 , 0x6327 , +0x4744 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4f24 , 0x0 , 0x0 , +0x6329 , 0x3a37 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6328 , 0x0 , +0x3b5a , 0x0 , 0x6323 , 0x0 , +0x0 , 0x0 , 0x6324 , 0x632a , +0x0 , 0x6326 , 0x0 , 0x4e72 , +0x5346 , 0x0 , 0x0 , 0x3b3c , +0x0 , 0x0 , 0x5443 , 0x0 , +0x447a , 0x0 , 0x0 , 0x6d28 , +0x507c , 0x6325 , 0x0 , 0x4375 , +0x0 , 0x632d , 0x312f , 0x0 , +0x6332 , 0x0 , 0x0 , 0x0 , +0x3c42 , 0x0 , 0x0 , 0x632c , +0x353f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4769 , 0x6330 , 0x0 , +0x0 , 0x0 , 0x3e2a , 0x4d6f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3b73 , 0x0 , 0x0 , +0x0 , 0x4c68 , 0x0 , 0x0 , +0x632f , 0x0 , 0x6331 , 0x0 , +0x4f27 , 0x632e , 0x0 , 0x4e29 , +0x3b5d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x356b , 0x3e65 , +0x3252 , 0x334d , 0x0 , 0x3139 , +0x632b , 0x3251 , 0x352c , 0x395f , +0x3668 , 0x0 , 0x0 , 0x4f6b , +0x6337 , 0x0 , 0x3b4c , 0x0 , +0x0 , 0x4847 , 0x504a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6338 , 0x336e , 0x0 , 0x0 , +0x0 , 0x0 , 0x6d29 , 0x0 , +0x537a , 0x5364 , 0x0 , 0x0 , +0x0 , 0x6d2a , 0x6339 , 0x5262 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6335 , 0x0 , 0x0 , +0x0 , 0x0 , 0x535e , 0x0 , +0x0 , 0x0 , 0x0 , 0x3850 , +0x6333 , 0x0 , 0x0 , 0x6336 , +0x375f , 0x0 , 0x6334 , 0x4022 , +0x0 , 0x0 , 0x0 , 0x633a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5438 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3448 , 0x0 , 0x633b , 0x0 , +0x3b45 , 0x0 , 0x4977 , 0x0 , +0x0 , 0x4965 , 0x0 , 0x0 , +0x0 , 0x443d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d2b , 0x0 , 0x0 , +0x0 , 0x0 , 0x427d , 0x0 , +0x0 , 0x0 , 0x0 , 0x3b5b , +0x3f2e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4e3f , 0x0 , 0x0 , 0x0 , +0x0 , 0x633c , 0x0 , 0x3f36 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x316f , +0x0 , 0x0 , 0x5477 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x633e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d2d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x633f , +0x3a29 , 0x6d2c , 0x0 , 0x0 , +0x633d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6340 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3a36 , 0x0 , +0x0 , 0x0 , 0x362e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5038 , 0x0 , 0x3043 , 0x6d2e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d2f , 0x4041 , 0x0 , +0x6341 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4533 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6342 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5c32 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6d30 , 0x0 , +0x386a , 0x0 , 0x4e6c , 0x6a27 , +0x5067 , 0x4a79 , 0x4856 , 0x4f37 , +0x3349 , 0x4e52 , 0x3d64 , 0x0 , +0x0 , 0x635e , 0x3b72 , 0x6a28 , +0x553d , 0x0 , 0x465d , 0x6a29 , +0x0 , 0x0 , 0x0 , 0x6a2a , +0x0 , 0x6a2c , 0x6a2b , 0x0 , +0x6a2e , 0x6a2d , 0x0 , 0x0 , +0x0 , 0x0 , 0x3d58 , 0x0 , +0x6a2f , 0x0 , 0x423e , 0x0 , +0x0 , 0x0 , 0x0 , 0x3441 , +0x3477 , 0x0 , 0x0 , 0x3b27 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6c66 , 0x6c65 , 0x373f , +0x4b79 , 0x3162 , 0x0 , 0x6c67 , +0x0 , 0x0 , 0x0 , 0x4948 , +0x6c68 , 0x6c69 , 0x0 , 0x4a56 , +0x5e50 , 0x3245 , 0x547a , 0x0 , +0x0 , 0x464b , 0x3047 , 0x3472 , +0x4853 , 0x0 , 0x0 , 0x0 , +0x4d50 , 0x0 , 0x0 , 0x3f38 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3f5b , +0x0 , 0x0 , 0x4724 , 0x5634 , +0x0 , 0x4029 , 0x5e51 , 0x4928 , +0x516f , 0x4524 , 0x3067 , 0x3336 , +0x4845 , 0x0 , 0x0 , 0x3062 , +0x0 , 0x0 , 0x3776 , 0x0 , +0x0 , 0x457a , 0x0 , 0x0 , +0x3673 , 0x0 , 0x5552 , 0x3350 , +0x3c3c , 0x0 , 0x0 , 0x0 , +0x332d , 0x0 , 0x0 , 0x0 , +0x0 , 0x3e71 , 0x3051 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5256 , 0x4a63 , 0x5725 , +0x0 , 0x4d36 , 0x3636 , 0x3f39 , +0x555b , 0x0 , 0x3827 , 0x4557 , +0x0 , 0x0 , 0x0 , 0x5e52 , +0x3f59 , 0x4255 , 0x4740 , 0x0 , +0x3b24 , 0x3128 , 0x0 , 0x0 , +0x456a , 0x0 , 0x0 , 0x457b , +0x4c27 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3127 , 0x0 , 0x0 , +0x0 , 0x3556 , 0x0 , 0x0 , +0x0 , 0x4428 , 0x0 , 0x5e53 , +0x513a , 0x3369 , 0x0 , 0x4372 , +0x0 , 0x0 , 0x3777 , 0x0 , +0x5674 , 0x3523 , 0x3270 , 0x4434 , +0x4469 , 0x402d , 0x5e54 , 0x0 , +0x3068 , 0x4544 , 0x4160 , 0x0 , +0x3955 , 0x0 , 0x3e5c , 0x4d58 , +0x304e , 0x0 , 0x4d4f , 0x5e56 , +0x3e50 , 0x573e , 0x5e55 , 0x5550 , +0x305d , 0x0 , 0x0 , 0x4462 , +0x0 , 0x0 , 0x4223 , 0x3c70 , +0x0 , 0x5335 , 0x4039 , 0x4521 , +0x3226 , 0x5471 , 0x0 , 0x0 , +0x4028 , 0x4a43 , 0x5e57 , 0x557c , +0x0 , 0x3930 , 0x0 , 0x482d , +0x4b29 , 0x0 , 0x5e59 , 0x3f3d , +0x0 , 0x0 , 0x0 , 0x0 , +0x4634 , 0x5727 , 0x4a30 , 0x4443 , +0x0 , 0x3356 , 0x3952 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5638 , +0x6a7c , 0x3034 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3f66 , 0x0 , +0x0 , 0x4c74 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4d5a , 0x0 , +0x0 , 0x0 , 0x563f , 0x424e , +0x0 , 0x4e4e , 0x4c22 , 0x502e , +0x4453 , 0x3532 , 0x5e58 , 0x5575 , +0x3c37 , 0x3b53 , 0x0 , 0x0 , +0x3024 , 0x0 , 0x4532 , 0x346c , +0x0 , 0x0 , 0x0 , 0x5571 , +0x0 , 0x0 , 0x6a7d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5e5a , 0x4d26 , 0x0 , +0x0 , 0x4d6c , 0x0 , 0x0 , +0x0 , 0x0 , 0x4e66 , 0x5e5c , +0x0 , 0x4d31 , 0x4026 , 0x0 , +0x0 , 0x573d , 0x0 , 0x5e5b , +0x3046 , 0x3a34 , 0x4953 , 0x4473 , +0x3e68 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3236 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x404c , 0x4b70 , +0x0 , 0x3c71 , 0x3b3b , 0x3537 , +0x0 , 0x0 , 0x0 , 0x4575 , +0x0 , 0x5e66 , 0x0 , 0x0 , +0x0 , 0x5e63 , 0x3e5d , 0x0 , +0x0 , 0x5e5f , 0x0 , 0x0 , +0x0 , 0x0 , 0x3437 , 0x3d5d , +0x0 , 0x0 , 0x5e60 , 0x446d , +0x0 , 0x0 , 0x0 , 0x0 , +0x4f46 , 0x0 , 0x3560 , 0x0 , +0x0 , 0x0 , 0x0 , 0x365e , +0x4a5a , 0x3574 , 0x5e65 , 0x0 , +0x5546 , 0x0 , 0x5e61 , 0x4c4d , +0x467e , 0x0 , 0x4545 , 0x0 , +0x0 , 0x0 , 0x5234 , 0x0 , +0x3e72 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4253 , 0x0 , 0x4c3d , 0x3338 , +0x0 , 0x3d53 , 0x0 , 0x3f58 , +0x4d46 , 0x515a , 0x346b , 0x0 , +0x5e64 , 0x5e5d , 0x5e67 , 0x0 , +0x6a7e , 0x0 , 0x0 , 0x4230 , +0x5e62 , 0x0 , 0x0 , 0x5640 , +0x3527 , 0x0 , 0x3274 , 0x0 , +0x5e68 , 0x0 , 0x5e72 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5e6d , 0x0 , 0x5e71 , 0x0 , +0x0 , 0x4860 , 0x0 , 0x0 , +0x0 , 0x5761 , 0x5e6f , 0x4368 , +0x4c61 , 0x0 , 0x3265 , 0x0 , +0x0 , 0x0 , 0x523e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5e6e , 0x0 , +0x5e6b , 0x4e55 , 0x0 , 0x3427 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3f2b , 0x3e3e , 0x0 , +0x0 , 0x3d52 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5e69 , 0x0 , +0x542e , 0x0 , 0x5e5e , 0x0 , +0x5e6a , 0x0 , 0x0 , 0x0 , +0x0 , 0x403f , 0x0 , 0x5e6c , +0x3273 , 0x3869 , 0x4227 , 0x0 , +0x0 , 0x3d41 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5e75 , +0x5e78 , 0x0 , 0x0 , 0x322b , +0x3424 , 0x0 , 0x0 , 0x346a , +0x4926 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5e76 , +0x4b51 , 0x0 , 0x3863 , 0x0 , +0x5e77 , 0x5e7a , 0x0 , 0x0 , +0x0 , 0x0 , 0x5e79 , 0x0 , +0x0 , 0x0 , 0x4c42 , 0x0 , +0x3061 , 0x346e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x653a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x502f , 0x0 , +0x0 , 0x326b , 0x0 , 0x6b21 , +0x0 , 0x5e74 , 0x0 , 0x0 , +0x4963 , 0x5e73 , 0x305a , 0x5221 , +0x3177 , 0x0 , 0x4c2f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5e70 , 0x0 , +0x4b24 , 0x0 , 0x0 , 0x0 , +0x552a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5e7b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x345d , +0x0 , 0x4426 , 0x0 , 0x0 , +0x0 , 0x5e7d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x437e , 0x4421 , 0x5f21 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x414c , 0x0 , +0x5e7c , 0x3e6f , 0x0 , 0x4632 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3345 , 0x4876 , 0x0 , +0x0 , 0x4b3a , 0x5e7e , 0x0 , +0x0 , 0x5f24 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5732 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3337 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4143 , 0x0 , 0x0 , +0x474b , 0x3225 , 0x3469 , 0x0 , +0x572b , 0x0 , 0x0 , 0x0 , +0x0 , 0x446c , 0x0 , 0x5f22 , +0x5f23 , 0x0 , 0x5f25 , 0x0 , +0x3a33 , 0x0 , 0x0 , 0x0 , +0x5f26 , 0x0 , 0x405e , 0x0 , +0x0 , 0x4943 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3259 , 0x4766 , 0x0 , +0x5f27 , 0x0 , 0x475c , 0x0 , +0x0 , 0x0 , 0x0 , 0x5f28 , +0x6b22 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4b53 , 0x0 , +0x0 , 0x0 , 0x5f2a , 0x0 , +0x5f29 , 0x0 , 0x3241 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x454a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5f2b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x545c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4841 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5f2c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3e70 , +0x0 , 0x0 , 0x5f2d , 0x5627 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6a37 , 0x6b36 , 0x4a55 , 0x0 , +0x587c , 0x3844 , 0x0 , 0x3925 , +0x0 , 0x0 , 0x3745 , 0x557e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x394a , 0x0 , 0x0 , +0x5027 , 0x744d , 0x0 , 0x0 , +0x3550 , 0x0 , 0x0 , 0x4374 , +0x0 , 0x3e48 , 0x0 , 0x0 , +0x0 , 0x6b37 , 0x303d , 0x0 , +0x0 , 0x3d4c , 0x0 , 0x4132 , +0x0 , 0x3156 , 0x3328 , 0x0 , +0x0 , 0x0 , 0x3852 , 0x4922 , +0x0 , 0x0 , 0x3658 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6b38 , +0x3e34 , 0x0 , 0x0 , 0x0 , +0x4a7d , 0x0 , 0x4743 , 0x0 , +0x557b , 0x0 , 0x0 , 0x3773 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4e44 , +0x0 , 0x0 , 0x0 , 0x552b , +0x3173 , 0x0 , 0x0 , 0x0 , +0x6c33 , 0x305f , 0x0 , 0x6c35 , +0x0 , 0x0 , 0x0 , 0x3637 , +0x0 , 0x414f , 0x0 , 0x757a , +0x5031 , 0x0 , 0x0 , 0x5565 , +0x0 , 0x4e53 , 0x0 , 0x0 , +0x3d6f , 0x3362 , 0x0 , 0x382b , +0x0 , 0x5536 , 0x0 , 0x6d3d , +0x0 , 0x364f , 0x0 , 0x4b39 , +0x5042 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x373d , 0x0 , 0x0 , +0x6c36 , 0x4a29 , 0x0 , 0x0 , +0x0 , 0x4554 , 0x0 , 0x6c39 , +0x6c38 , 0x4243 , 0x6c37 , 0x0 , +0x0 , 0x0 , 0x0 , 0x507d , +0x6c3a , 0x0 , 0x6c3b , 0x5765 , +0x0 , 0x0 , 0x6c3c , 0x0 , +0x0 , 0x0 , 0x6c3d , 0x466c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4e5e , 0x0 , 0x3c48 , 0x0 , +0x0 , 0x4855 , 0x3529 , 0x3e49 , +0x563c , 0x5467 , 0x0 , 0x0 , +0x512e , 0x5071 , 0x6a38 , 0x6a39 , +0x6a3a , 0x3a35 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4a31 , 0x3f75 , +0x0 , 0x0 , 0x4d7a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6a40 , 0x0 , 0x303a , 0x6a3e , +0x0 , 0x0 , 0x4025 , 0x0 , +0x0 , 0x0 , 0x6a3b , 0x0 , +0x327d , 0x0 , 0x4377 , 0x3b68 , +0x0 , 0x0 , 0x0 , 0x5257 , +0x4e74 , 0x6a3f , 0x0 , 0x0 , +0x0 , 0x6a3c , 0x0 , 0x0 , +0x0 , 0x6a43 , 0x0 , 0x5047 , +0x5333 , 0x0 , 0x0 , 0x0 , +0x0 , 0x343a , 0x0 , 0x4341 , +0x5772 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5551 , 0x0 , 0x4a47 , +0x0 , 0x6a45 , 0x0 , 0x0 , +0x6a44 , 0x6a47 , 0x6a46 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5667 , 0x0 , 0x4f54 , 0x0 , +0x0 , 0x6a4b , 0x0 , 0x3b4e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3d7a , +0x494e , 0x0 , 0x0 , 0x6a4c , +0x0 , 0x0 , 0x4939 , 0x4f7e , +0x6a4a , 0x544e , 0x6a4d , 0x6a4f , +0x0 , 0x0 , 0x4d6d , 0x0 , +0x0 , 0x0 , 0x0 , 0x6a49 , +0x0 , 0x6a4e , 0x0 , 0x0 , +0x4e6e , 0x0 , 0x3b5e , 0x0 , +0x333f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4655 , 0x3e30 , +0x4e7a , 0x0 , 0x0 , 0x0 , +0x4767 , 0x0 , 0x3e27 , 0x6a50 , +0x0 , 0x0 , 0x5647 , 0x0 , +0x0 , 0x0 , 0x4140 , 0x0 , +0x0 , 0x0 , 0x545d , 0x0 , +0x6a51 , 0x0 , 0x0 , 0x4f3e , +0x0 , 0x0 , 0x0 , 0x0 , +0x6a52 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4a6e , 0x0 , 0x0 , +0x0 , 0x0 , 0x452f , 0x3035 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6a54 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6a53 , +0x745f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x443a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3129 , 0x0 , 0x0 , 0x0 , +0x0 , 0x655f , 0x0 , 0x0 , +0x0 , 0x0 , 0x6a55 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4a6f , 0x0 , 0x6a56 , +0x6a57 , 0x4658 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6a58 , 0x0 , +0x0 , 0x6a59 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x543b , 0x0 , 0x477a , 0x5237 , +0x387c , 0x0 , 0x0 , 0x6a42 , +0x0 , 0x325c , 0x0 , 0x0 , +0x427c , 0x0 , 0x5478 , 0x4c66 , +0x576e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5442 , 0x5350 , 0x6b43 , 0x4573 , +0x0 , 0x377e , 0x0 , 0x0 , +0x6b54 , 0x0 , 0x0 , 0x0 , +0x4b37 , 0x6b5e , 0x0 , 0x404a , +0x0 , 0x0 , 0x0 , 0x4d7b , +0x0 , 0x332f , 0x0 , 0x465a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6b7c , 0x0 , +0x443e , 0x0 , 0x4e34 , 0x4429 , +0x313e , 0x547d , 0x0 , 0x4a75 , +0x0 , 0x566c , 0x0 , 0x0 , +0x4653 , 0x3664 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3b7a , 0x0 , +0x0 , 0x5060 , 0x0 , 0x0 , +0x4931 , 0x0 , 0x5453 , 0x4828 , +0x0 , 0x0 , 0x384b , 0x0 , +0x683e , 0x493c , 0x0 , 0x0 , +0x683b , 0x0 , 0x406e , 0x5053 , +0x3244 , 0x3465 , 0x0 , 0x683c , +0x0 , 0x0 , 0x5548 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3645 , 0x0 , 0x683d , 0x4a78 , +0x385c , 0x4c75 , 0x0 , 0x0 , +0x0 , 0x4034 , 0x0 , 0x0 , +0x516e , 0x683f , 0x6842 , 0x0 , +0x0 , 0x3a3c , 0x0 , 0x312d , +0x3d5c , 0x0 , 0x6a3d , 0x6843 , +0x0 , 0x6846 , 0x0 , 0x684b , +0x0 , 0x0 , 0x0 , 0x0 , +0x684c , 0x0 , 0x4b49 , 0x3065 , +0x0 , 0x3c2b , 0x0 , 0x0 , +0x3939 , 0x0 , 0x0 , 0x6841 , +0x0 , 0x4d77 , 0x0 , 0x684a , +0x0 , 0x0 , 0x0 , 0x0 , +0x4e76 , 0x0 , 0x0 , 0x0 , +0x0 , 0x556d , 0x0 , 0x4156 , +0x6844 , 0x0 , 0x4336 , 0x0 , +0x397b , 0x5626 , 0x6848 , 0x0 , +0x0 , 0x0 , 0x4a60 , 0x5466 , +0x0 , 0x6840 , 0x0 , 0x6845 , +0x6847 , 0x0 , 0x4739 , 0x3763 , +0x0 , 0x6849 , 0x0 , 0x3f5d , +0x6852 , 0x0 , 0x0 , 0x6857 , +0x0 , 0x6855 , 0x3c5c , 0x3c4f , +0x685b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x685e , 0x0 , 0x685a , +0x317a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3058 , +0x4433 , 0x384c , 0x4662 , 0x483e , +0x4861 , 0x0 , 0x0 , 0x0 , +0x684f , 0x6854 , 0x6856 , 0x0 , +0x3971 , 0x6858 , 0x5775 , 0x0 , +0x447b , 0x0 , 0x685c , 0x0 , +0x0 , 0x3269 , 0x0 , 0x0 , +0x0 , 0x6851 , 0x0 , 0x0 , +0x3c6d , 0x0 , 0x0 , 0x3f42 , +0x684d , 0x5679 , 0x0 , 0x4178 , +0x3271 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x685f , 0x0 , 0x4a41 , +0x6859 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5524 , 0x0 , 0x316a , +0x553b , 0x684e , 0x6850 , 0x3630 , +0x6853 , 0x0 , 0x685d , 0x4038 , +0x0 , 0x4a77 , 0x0 , 0x4b28 , +0x0 , 0x0 , 0x465c , 0x4075 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6869 , 0x0 , 0x0 , +0x0 , 0x5023 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6872 , 0x566a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6860 , 0x6861 , +0x0 , 0x0 , 0x0 , 0x5179 , +0x3a4b , 0x3879 , 0x0 , 0x0 , +0x3871 , 0x5454 , 0x686f , 0x0 , +0x686e , 0x686c , 0x3970 , 0x4c52 , +0x6866 , 0x4e26 , 0x3f72 , 0x0 , +0x3038 , 0x6871 , 0x6870 , 0x0 , +0x5740 , 0x0 , 0x6864 , 0x0 , +0x4d29 , 0x4923 , 0x0 , 0x3b38 , +0x3d5b , 0x686a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6862 , 0x6863 , 0x6865 , 0x3535 , +0x6867 , 0x4745 , 0x686b , 0x686d , +0x3d30 , 0x572e , 0x0 , 0x6878 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6875 , 0x0 , 0x4d30 , 0x6876 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x413a , 0x0 , 0x6868 , +0x0 , 0x4337 , 0x3070 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6874 , +0x0 , 0x0 , 0x0 , 0x6877 , +0x0 , 0x0 , 0x0 , 0x3923 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4952 , 0x0 , +0x0 , 0x0 , 0x434e , 0x4e60 , +0x4066 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4b73 , 0x0 , 0x4c5d , +0x5035 , 0x0 , 0x0 , 0x4a61 , +0x0 , 0x6873 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3c6c , 0x0 , 0x6879 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x435e , 0x0 , 0x4665 , +0x0 , 0x3977 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3074 , 0x0 , +0x0 , 0x5758 , 0x0 , 0x0 , +0x3c2c , 0x0 , 0x456f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4c44 , 0x0 , 0x0 , 0x6926 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x492d , 0x0 , +0x6922 , 0x4062 , 0x0 , 0x0 , +0x0 , 0x3f43 , 0x0 , 0x0 , +0x0 , 0x687e , 0x3957 , 0x0 , +0x687b , 0x0 , 0x0 , 0x0 , +0x0 , 0x6924 , 0x0 , 0x0 , +0x0 , 0x524e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6923 , +0x0 , 0x5632 , 0x5735 , 0x0 , +0x6927 , 0x0 , 0x3d37 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x687c , +0x687d , 0x0 , 0x0 , 0x0 , +0x6921 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4d56 , 0x0 , 0x0 , +0x522c , 0x0 , 0x0 , 0x0 , +0x6932 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6929 , 0x0 , 0x0 , +0x0 , 0x342a , 0x0 , 0x343b , +0x0 , 0x0 , 0x692b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5028 , 0x0 , 0x0 , 0x6925 , +0x0 , 0x0 , 0x337e , 0x0 , +0x0 , 0x692c , 0x4063 , 0x0 , +0x692a , 0x0 , 0x0 , 0x6939 , +0x0 , 0x0 , 0x6938 , 0x0 , +0x0 , 0x0 , 0x0 , 0x692e , +0x0 , 0x0 , 0x687a , 0x0 , +0x0 , 0x6928 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3f2c , +0x6931 , 0x693a , 0x0 , 0x0 , +0x4225 , 0x0 , 0x0 , 0x0 , +0x692f , 0x0 , 0x3845 , 0x0 , +0x692d , 0x0 , 0x535c , 0x6934 , +0x6935 , 0x6937 , 0x0 , 0x0 , +0x0 , 0x6947 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4046 , 0x6945 , 0x0 , 0x0 , +0x6930 , 0x0 , 0x0 , 0x693b , +0x3071 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x693c , +0x5525 , 0x0 , 0x0 , 0x693e , +0x0 , 0x693f , 0x0 , 0x0 , +0x0 , 0x6941 , 0x0 , 0x0 , +0x4171 , 0x0 , 0x0 , 0x4836 , +0x0 , 0x0 , 0x0 , 0x693d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6942 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6943 , 0x0 , +0x6933 , 0x0 , 0x6936 , 0x0 , +0x3b31 , 0x0 , 0x0 , 0x0 , +0x6940 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3c77 , +0x0 , 0x0 , 0x0 , 0x6944 , +0x6946 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x694a , 0x0 , 0x0 , +0x0 , 0x0 , 0x694e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x325b , 0x0 , 0x6948 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x372e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x694b , +0x694c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5541 , +0x0 , 0x4423 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6958 , 0x0 , 0x3a61 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6949 , +0x0 , 0x5323 , 0x0 , 0x0 , +0x0 , 0x6954 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6957 , 0x6950 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x694f , 0x0 , 0x0 , 0x4741 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6952 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6959 , 0x3348 , 0x0 , 0x6953 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4f70 , 0x0 , 0x0 , +0x0 , 0x694d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3377 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6956 , 0x0 , 0x0 , +0x695a , 0x0 , 0x0 , 0x0 , +0x4c34 , 0x0 , 0x0 , 0x0 , +0x4f2d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6955 , 0x0 , +0x695c , 0x695b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x695e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6951 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x695d , 0x0 , 0x695f , +0x434a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4737 , 0x344e , 0x3b36 , 0x5040 , +0x6c23 , 0x0 , 0x0 , 0x4537 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x537b , 0x0 , +0x0 , 0x0 , 0x0 , 0x6c24 , +0x0 , 0x6c25 , 0x465b , 0x0 , +0x0 , 0x0 , 0x3f6e , 0x0 , +0x0 , 0x0 , 0x0 , 0x6c26 , +0x0 , 0x0 , 0x6c27 , 0x502a , +0x0 , 0x4738 , 0x0 , 0x0 , +0x3868 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6c28 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5639 , 0x557d , +0x344b , 0x323d , 0x4e64 , 0x4667 , +0x0 , 0x0 , 0x4d61 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3475 , 0x0 , 0x4b40 , +0x3c5f , 0x0 , 0x0 , 0x0 , +0x0 , 0x6962 , 0x6963 , 0x516a , +0x6965 , 0x0 , 0x3479 , 0x6964 , +0x0 , 0x5133 , 0x4a62 , 0x3250 , +0x0 , 0x6968 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6966 , 0x6967 , +0x0 , 0x0 , 0x5633 , 0x0 , +0x0 , 0x0 , 0x6969 , 0x696a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x696b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x696c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6c2f , +0x4539 , 0x364e , 0x0 , 0x5273 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x356e , +0x0 , 0x3b59 , 0x6c31 , 0x0 , +0x0 , 0x5263 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4e63 , +0x0 , 0x4438 , 0x0 , 0x433f , +0x0 , 0x0 , 0x363e , 0x5839 , +0x3148 , 0x314f , 0x3151 , 0x457e , +0x0 , 0x3150 , 0x0 , 0x432b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5531 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6b24 , 0x3a41 , +0x0 , 0x0 , 0x0 , 0x4c3a , +0x0 , 0x0 , 0x0 , 0x6b25 , +0x0 , 0x6b27 , 0x0 , 0x0 , +0x0 , 0x6b28 , 0x0 , 0x0 , +0x0 , 0x6b26 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6b29 , 0x6b2b , 0x6b2a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6b2c , 0x0 , 0x4a4f , +0x5835 , 0x4371 , 0x0 , 0x4325 , +0x4678 , 0x6b2d , 0x444a , 0x0 , +0x6b2e , 0x6b2f , 0x6b30 , 0x3755 , +0x0 , 0x0 , 0x0 , 0x377a , +0x0 , 0x6b31 , 0x4762 , 0x0 , +0x6b33 , 0x0 , 0x3a24 , 0x5175 , +0x3031 , 0x6b32 , 0x6b34 , 0x0 , +0x0 , 0x0 , 0x352a , 0x4248 , +0x4768 , 0x0 , 0x6b35 , 0x0 , +0x4b2e , 0x635f , 0x0 , 0x0 , +0x5340 , 0x0 , 0x0 , 0x0 , +0x0 , 0x595b , 0x0 , 0x0 , +0x4d21 , 0x562d , 0x4773 , 0x0 , +0x0 , 0x0 , 0x5960 , 0x3b63 , +0x0 , 0x3a3a , 0x6362 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4f2b , 0x0 , 0x0 , 0x0 , +0x6360 , 0x4947 , 0x0 , 0x3a39 , +0x0 , 0x0 , 0x0 , 0x5134 , +0x6361 , 0x486a , 0x392f , 0x3d2d , +0x3358 , 0x4e5b , 0x0 , 0x0 , +0x4c40 , 0x0 , 0x0 , 0x0 , +0x6368 , 0x6369 , 0x4d74 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4c2d , 0x0 , 0x3c33 , 0x0 , +0x636a , 0x0 , 0x636b , 0x0 , +0x0 , 0x505a , 0x0 , 0x0 , +0x0 , 0x467b , 0x375a , 0x0 , +0x0 , 0x475f , 0x524a , 0x4e56 , +0x0 , 0x6364 , 0x636c , 0x0 , +0x4972 , 0x3341 , 0x0 , 0x0 , +0x6367 , 0x0 , 0x0 , 0x4663 , +0x6365 , 0x0 , 0x0 , 0x6d33 , +0x6366 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4933 , 0x0 , 0x4566 , +0x0 , 0x0 , 0x0 , 0x3935 , +0x0 , 0x433b , 0x0 , 0x6363 , +0x453d , 0x4124 , 0x4259 , 0x3257 , +0x0 , 0x636d , 0x3b26 , 0x442d , +0x0 , 0x6370 , 0x3e5a , 0x0 , +0x0 , 0x637b , 0x6375 , 0x3a53 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3750 , 0x534d , 0x0 , 0x564e , +0x5553 , 0x3941 , 0x5534 , 0x5158 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5039 , 0x4776 , 0x0 , 0x0 , +0x0 , 0x482a , 0x3234 , 0x0 , +0x435a , 0x0 , 0x0 , 0x0 , +0x636e , 0x0 , 0x0 , 0x637c , +0x636f , 0x3728 , 0x6377 , 0x6374 , +0x0 , 0x0 , 0x0 , 0x373a , +0x0 , 0x0 , 0x4522 , 0x0 , +0x6376 , 0x455d , 0x3228 , 0x467c , +0x0 , 0x4460 , 0x0 , 0x0 , +0x5722 , 0x0 , 0x4061 , 0x6379 , +0x0 , 0x0 , 0x637a , 0x637d , +0x4c29 , 0x6373 , 0x0 , 0x533e , +0x0 , 0x3143 , 0x6d34 , 0x6371 , +0x6372 , 0x0 , 0x6378 , 0x503a , +0x4643 , 0x5473 , 0x637e , 0x0 , +0x0 , 0x3d60 , 0x0 , 0x0 , +0x6427 , 0x0 , 0x0 , 0x6426 , +0x0 , 0x0 , 0x0 , 0x5173 , +0x6423 , 0x0 , 0x6429 , 0x0 , +0x0 , 0x0 , 0x4877 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4f34 , +0x0 , 0x6428 , 0x642e , 0x4265 , +0x0 , 0x0 , 0x3634 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3d72 , 0x0 , 0x6422 , +0x0 , 0x0 , 0x3a69 , 0x642a , +0x0 , 0x0 , 0x642c , 0x0 , +0x0 , 0x367d , 0x565e , 0x6432 , +0x0 , 0x642d , 0x0 , 0x0 , +0x0 , 0x6421 , 0x0 , 0x3b6e , +0x4d5d , 0x4722 , 0x4549 , 0x0 , +0x0 , 0x4177 , 0x0 , 0x6424 , +0x0 , 0x4733 , 0x3d2c , 0x3d3d , +0x6425 , 0x0 , 0x5747 , 0x3262 , +0x0 , 0x642b , 0x3c43 , 0x642f , +0x0 , 0x3b6b , 0x6430 , 0x4528 , +0x6431 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5563 , 0x3f23 , 0x0 , +0x643a , 0x0 , 0x6437 , 0x0 , +0x643b , 0x0 , 0x0 , 0x643d , +0x0 , 0x0 , 0x4656 , 0x0 , +0x0 , 0x3a46 , 0x404b , 0x0 , +0x0 , 0x0 , 0x3821 , 0x6434 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5421 , 0x0 , 0x0 , 0x3a23 , +0x3d7e , 0x0 , 0x0 , 0x0 , +0x643c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4d3f , 0x0 , +0x0 , 0x4479 , 0x0 , 0x0 , +0x4f7b , 0x4966 , 0x0 , 0x0 , +0x533f , 0x0 , 0x4f51 , 0x0 , +0x0 , 0x6433 , 0x0 , 0x6438 , +0x6439 , 0x4c69 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4c4e , +0x0 , 0x4054 , 0x6435 , 0x4130 , +0x6436 , 0x4e50 , 0x0 , 0x3b41 , +0x3553 , 0x0 , 0x4873 , 0x3d27 , +0x5547 , 0x492c , 0x3822 , 0x644a , +0x0 , 0x0 , 0x644c , 0x5144 , +0x0 , 0x0 , 0x523a , 0x0 , +0x0 , 0x3a2d , 0x0 , 0x0 , +0x3a54 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6443 , +0x356d , 0x0 , 0x0 , 0x0 , +0x574d , 0x6440 , 0x4f7d , 0x643f , +0x0 , 0x0 , 0x0 , 0x415c , +0x4c4a , 0x0 , 0x0 , 0x0 , +0x0 , 0x4a67 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4457 , 0x0 , +0x4c54 , 0x6448 , 0x0 , 0x0 , +0x0 , 0x6447 , 0x6441 , 0x0 , +0x6444 , 0x352d , 0x0 , 0x0 , +0x5359 , 0x0 , 0x6446 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5279 , +0x3463 , 0x0 , 0x3b34 , 0x0 , +0x0 , 0x496e , 0x0 , 0x343e , +0x0 , 0x0 , 0x0 , 0x3b6c , +0x0 , 0x514d , 0x0 , 0x4c6d , +0x6d35 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4765 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5428 , 0x0 , +0x644b , 0x5755 , 0x6442 , 0x0 , +0x3d25 , 0x6445 , 0x0 , 0x0 , +0x5366 , 0x0 , 0x6449 , 0x4978 , +0x0 , 0x0 , 0x643e , 0x0 , +0x0 , 0x5365 , 0x0 , 0x0 , +0x477e , 0x3649 , 0x0 , 0x547c , +0x3233 , 0x6457 , 0x0 , 0x0 , +0x0 , 0x4e42 , 0x0 , 0x644d , +0x0 , 0x4e3c , 0x0 , 0x385b , +0x0 , 0x0 , 0x6456 , 0x0 , +0x3f4a , 0x0 , 0x0 , 0x0 , +0x534e , 0x0 , 0x436c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4548 , +0x6458 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4d44 , 0x644f , 0x0 , +0x0 , 0x0 , 0x0 , 0x6454 , +0x6455 , 0x0 , 0x3a7e , 0x0 , +0x4f66 , 0x0 , 0x0 , 0x553f , +0x0 , 0x0 , 0x0 , 0x6452 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6450 , +0x0 , 0x0 , 0x644e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4d65 , 0x4a2a , +0x0 , 0x0 , 0x0 , 0x4023 , +0x0 , 0x3d26 , 0x6453 , 0x0 , +0x0 , 0x3848 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6467 , +0x5434 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x645b , 0x0 , 0x0 , 0x0 , +0x416f , 0x0 , 0x0 , 0x6469 , +0x0 , 0x0 , 0x5267 , 0x0 , +0x0 , 0x645f , 0x0 , 0x6460 , +0x0 , 0x0 , 0x4f2a , 0x0 , +0x0 , 0x0 , 0x0 , 0x4b5d , +0x0 , 0x645a , 0x6451 , 0x0 , +0x6465 , 0x0 , 0x485c , 0x6463 , +0x0 , 0x0 , 0x4467 , 0x6462 , +0x0 , 0x6461 , 0x0 , 0x0 , +0x0 , 0x337c , 0x6468 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3561 , +0x0 , 0x0 , 0x0 , 0x574c , +0x0 , 0x0 , 0x0 , 0x6466 , +0x0 , 0x3b2c , 0x0 , 0x5752 , +0x4c4f , 0x6b78 , 0x0 , 0x6464 , +0x0 , 0x0 , 0x3976 , 0x0 , +0x0 , 0x0 , 0x564d , 0x6459 , +0x645c , 0x427a , 0x645e , 0x0 , +0x424b , 0x4044 , 0x4250 , 0x0 , +0x3175 , 0x4c32 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x354e , 0x0 , 0x0 , 0x0 , +0x0 , 0x646f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x462f , 0x0 , +0x0 , 0x0 , 0x4661 , 0x0 , +0x0 , 0x6475 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4229 , +0x0 , 0x0 , 0x0 , 0x406c , +0x515d , 0x646e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x442e , 0x0 , 0x0 , 0x0 , +0x646d , 0x0 , 0x0 , 0x0 , +0x0 , 0x6476 , 0x6474 , 0x427e , +0x0 , 0x645d , 0x0 , 0x6470 , +0x0 , 0x4a7e , 0x0 , 0x5544 , +0x0 , 0x0 , 0x6471 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x517a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x646b , 0x646c , +0x0 , 0x0 , 0x0 , 0x6472 , +0x0 , 0x4e2b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x454b , 0x0 , 0x0 , 0x0 , +0x4731 , 0x0 , 0x423a , 0x0 , +0x0 , 0x0 , 0x646a , 0x0 , +0x0 , 0x0 , 0x414a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4c36 , 0x3331 , 0x0 , +0x0 , 0x0 , 0x647b , 0x0 , +0x6473 , 0x0 , 0x0 , 0x0 , +0x647a , 0x0 , 0x647d , 0x0 , +0x647c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x334e , 0x0 , 0x0 , 0x0 , +0x333a , 0x6477 , 0x0 , 0x0 , +0x6479 , 0x6478 , 0x456c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x403d , 0x0 , 0x0 , 0x0 , +0x0 , 0x5468 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6522 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3044 , +0x0 , 0x0 , 0x6524 , 0x0 , +0x0 , 0x6523 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3c24 , 0x0 , 0x6525 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6521 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x647e , 0x3174 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6528 , 0x0 , +0x6529 , 0x6526 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6527 , 0x652a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4659 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x652b , 0x652d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x652c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x652f , 0x0 , 0x0 , +0x0 , 0x652e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3960 , 0x0 , 0x0 , 0x6530 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6531 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3b70 , +0x6c61 , 0x4370 , 0x0 , 0x3546 , +0x3b52 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4169 , 0x546e , 0x0 , +0x3e44 , 0x0 , 0x0 , 0x0 , +0x5746 , 0x0 , 0x5456 , 0x3253 , +0x6c3e , 0x0 , 0x0 , 0x0 , +0x0 , 0x6a41 , 0x0 , 0x0 , +0x0 , 0x422f , 0x3436 , 0x0 , +0x0 , 0x0 , 0x5157 , 0x0 , +0x0 , 0x0 , 0x3334 , 0x0 , +0x4832 , 0x3f3b , 0x6c40 , 0x0 , +0x0 , 0x564b , 0x0 , 0x0 , +0x6c3f , 0x6c41 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6c45 , +0x3e66 , 0x4c3f , 0x455a , 0x3e3c , +0x0 , 0x6c46 , 0x0 , 0x317e , +0x0 , 0x0 , 0x0 , 0x6c44 , +0x5528 , 0x3563 , 0x0 , 0x6c42 , +0x4136 , 0x3363 , 0x0 , 0x0 , +0x6c43 , 0x4b38 , 0x4043 , 0x4c7e , +0x0 , 0x0 , 0x0 , 0x0 , +0x4152 , 0x0 , 0x6c48 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3a66 , 0x4053 , 0x0 , 0x5672 , +0x0 , 0x0 , 0x0 , 0x514c , +0x0 , 0x0 , 0x0 , 0x0 , +0x3f3e , 0x0 , 0x3733 , 0x4955 , +0x6c47 , 0x3b62 , 0x0 , 0x4c4c , +0x3d7d , 0x4848 , 0x0 , 0x4f29 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4d69 , +0x0 , 0x456b , 0x0 , 0x0 , +0x0 , 0x3769 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5149 , 0x3a38 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6c49 , 0x0 , 0x0 , 0x6c4a , +0x0 , 0x3b40 , 0x6c4b , 0x0 , +0x6c62 , 0x313a , 0x3759 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3d39 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6c4c , +0x5166 , 0x6c4d , 0x0 , 0x0 , +0x0 , 0x0 , 0x483b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6c51 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6c53 , 0x0 , +0x3b4d , 0x0 , 0x3c65 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6c4f , 0x0 , 0x4937 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x433a , 0x0 , 0x6c63 , 0x5555 , +0x6c50 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5673 , 0x0 , +0x0 , 0x0 , 0x6c52 , 0x6c4e , +0x0 , 0x0 , 0x0 , 0x0 , +0x6c54 , 0x0 , 0x6c55 , 0x0 , +0x0 , 0x493f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4f28 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x505c , 0x0 , +0x0 , 0x0 , 0x0 , 0x512c , +0x0 , 0x0 , 0x0 , 0x0 , +0x485b , 0x0 , 0x0 , 0x0 , +0x6c56 , 0x4e75 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4a6c , +0x6c5a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6c59 , 0x0 , 0x0 , 0x0 , +0x303e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6c57 , +0x0 , 0x6c58 , 0x0 , 0x0 , +0x0 , 0x6c64 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x483c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4147 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6c5c , 0x5160 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6c5b , 0x0 , 0x0 , 0x0 , +0x0 , 0x546f , 0x0 , 0x6c5d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5b46 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6c5e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x312c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6c5f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6c60 , 0x0 , 0x5726 , 0x0 , +0x4540 , 0x0 , 0x0 , 0x0 , +0x6b3c , 0x302e , 0x0 , 0x0 , +0x0 , 0x3e74 , 0x3838 , 0x522f , +0x3056 , 0x3579 , 0x0 , 0x5833 , +0x0 , 0x4b2c , 0x0 , 0x635d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x462c , +0x3066 , 0x0 , 0x0 , 0x0 , +0x4546 , 0x6b39 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6b3a , 0x0 , +0x0 , 0x0 , 0x6b3b , 0x0 , +0x0 , 0x5140 , 0x0 , 0x4523 , +0x0 , 0x6a72 , 0x0 , 0x4432 , +0x0 , 0x4435 , 0x404e , 0x0 , +0x0 , 0x0 , 0x6a73 , 0x4441 , +0x0 , 0x4e6f , 0x0 , 0x0 , +0x0 , 0x0 , 0x6a70 , 0x6a74 , +0x0 , 0x0 , 0x497c , 0x0 , +0x0 , 0x4723 , 0x0 , 0x0 , +0x0 , 0x4c58 , 0x4e7e , 0x0 , +0x0 , 0x0 , 0x6a75 , 0x6a76 , +0x4f2c , 0x4067 , 0x0 , 0x0 , +0x6a77 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x363f , 0x6a78 , +0x0 , 0x6a79 , 0x0 , 0x6a7a , +0x0 , 0x0 , 0x6a7b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6a71 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x482e , 0x616b , 0x0 , 0x3738 , +0x616c , 0x0 , 0x0 , 0x0 , +0x616d , 0x0 , 0x5734 , 0x616e , +0x616f , 0x534c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6171 , 0x3f71 , 0x6170 , +0x3552 , 0x0 , 0x0 , 0x0 , +0x3137 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6173 , 0x6172 , 0x0 , +0x3a7c , 0x0 , 0x6174 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3937 , +0x0 , 0x3e51 , 0x0 , 0x0 , +0x0 , 0x0 , 0x447c , 0x0 , +0x3a5d , 0x3d46 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6175 , 0x6177 , 0x0 , 0x0 , +0x3640 , 0x4f41 , 0x4a28 , 0x6176 , +0x5578 , 0x537c , 0x6178 , 0x617c , +0x6179 , 0x0 , 0x0 , 0x617a , +0x406a , 0x0 , 0x617e , 0x6221 , +0x4047 , 0x0 , 0x0 , 0x0 , +0x0 , 0x617b , 0x0 , 0x617d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6225 , 0x0 , +0x0 , 0x0 , 0x4154 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6223 , +0x0 , 0x6228 , 0x327e , 0x6222 , +0x0 , 0x0 , 0x0 , 0x434d , +0x3242 , 0x6227 , 0x6226 , 0x0 , +0x0 , 0x6224 , 0x6229 , 0x0 , +0x0 , 0x622b , 0x0 , 0x0 , +0x0 , 0x5049 , 0x566d , 0x4328 , +0x622c , 0x0 , 0x4f57 , 0x0 , +0x0 , 0x622e , 0x0 , 0x0 , +0x3a6f , 0x0 , 0x0 , 0x6960 , +0x622d , 0x622a , 0x0 , 0x0 , +0x0 , 0x0 , 0x3b2b , 0x5433 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6230 , 0x0 , 0x0 , +0x622f , 0x0 , 0x6961 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6231 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6232 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6233 , 0x4c21 , 0x0 , 0x6234 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6235 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x507e , 0x0 , 0x0 , 0x424a , +0x0 , 0x5371 , 0x0 , 0x4d75 , +0x0 , 0x0 , 0x6760 , 0x0 , +0x0 , 0x6761 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3e41 , 0x0 , +0x0 , 0x0 , 0x0 , 0x426a , +0x0 , 0x0 , 0x0 , 0x6764 , +0x0 , 0x0 , 0x6763 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4d66 , 0x0 , 0x4335 , +0x0 , 0x0 , 0x6762 , 0x3b37 , +0x4f56 , 0x0 , 0x4161 , 0x6769 , +0x0 , 0x0 , 0x0 , 0x6768 , +0x0 , 0x0 , 0x6774 , 0x3223 , +0x0 , 0x0 , 0x0 , 0x0 , +0x676a , 0x0 , 0x6766 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x676c , 0x676b , 0x493a , 0x0 , +0x0 , 0x5564 , 0x0 , 0x6765 , +0x3729 , 0x6767 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x676e , 0x0 , 0x0 , +0x0 , 0x0 , 0x6773 , 0x0 , +0x5669 , 0x0 , 0x0 , 0x0 , +0x0 , 0x676d , 0x0 , 0x6772 , +0x0 , 0x6771 , 0x0 , 0x0 , +0x0 , 0x3060 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6775 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4772 , +0x0 , 0x4045 , 0x406d , 0x0 , +0x0 , 0x4170 , 0x6770 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6776 , +0x4b76 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6822 , 0x6821 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5741 , 0x0 , +0x0 , 0x677a , 0x6779 , 0x0 , +0x677b , 0x0 , 0x6777 , 0x0 , +0x677e , 0x0 , 0x677d , 0x0 , +0x677c , 0x0 , 0x0 , 0x4155 , +0x4759 , 0x457d , 0x4543 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x476d , 0x0 , 0x0 , 0x0 , +0x0 , 0x6823 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6826 , 0x0 , 0x6825 , +0x0 , 0x6827 , 0x3a77 , 0x6778 , +0x6824 , 0x0 , 0x4870 , 0x492a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6829 , 0x0 , 0x0 , +0x3965 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x517e , 0x6828 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x682a , 0x0 , +0x682d , 0x682e , 0x0 , 0x4127 , +0x0 , 0x0 , 0x0 , 0x682f , +0x0 , 0x0 , 0x0 , 0x6830 , +0x0 , 0x0 , 0x682c , 0x0 , +0x6834 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x682b , 0x0 , 0x6831 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6835 , +0x6832 , 0x6833 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6837 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6836 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x394f , 0x0 , 0x702c , 0x0 , +0x702d , 0x0 , 0x4630 , 0x306a , +0x483f , 0x0 , 0x4d5f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4e4d , 0x6a31 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6a32 , 0x0 , 0x463f , 0x3449 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6a33 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5567 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5d79 , 0x0 , 0x6a34 , +0x0 , 0x6a35 , 0x0 , 0x6a36 , +0x0 , 0x0 , 0x0 , 0x0 , +0x384a , 0x5f30 , 0x4975 , 0x0 , +0x4c70 , 0x0 , 0x0 , 0x497a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x497b , 0x0 , 0x0 , +0x5343 , 0x4b26 , 0x0 , 0x3826 , +0x702e , 0x3142 , 0x0 , 0x6538 , +0x4c6f , 0x5349 , 0x3c57 , 0x496a , +0x0 , 0x3567 , 0x0 , 0x4450 , +0x3569 , 0x0 , 0x6e2e , 0x3b2d , +0x0 , 0x0 , 0x675e , 0x0 , +0x6e2f , 0x0 , 0x0 , 0x0 , +0x0 , 0x3329 , 0x0 , 0x0 , +0x6e32 , 0x0 , 0x0 , 0x6e31 , +0x3d67 , 0x0 , 0x6e30 , 0x4e37 , +0x0 , 0x0 , 0x0 , 0x0 , +0x454f , 0x0 , 0x0 , 0x0 , +0x0 , 0x4174 , 0x5b4e , 0x6e33 , +0x5073 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4254 , 0x4668 , 0x0 , +0x0 , 0x0 , 0x372c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6e34 , 0x0 , +0x336b , 0x0 , 0x0 , 0x0 , +0x3b7b , 0x6e35 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x675c , +0x0 , 0x0 , 0x0 , 0x6e36 , +0x0 , 0x0 , 0x3d2e , 0x0 , +0x0 , 0x0 , 0x0 , 0x7162 , +0x0 , 0x0 , 0x0 , 0x4a68 , +0x0 , 0x5249 , 0x705a , 0x0 , +0x705b , 0x0 , 0x705c , 0x4146 , +0x0 , 0x386d , 0x3e4e , 0x0 , +0x0 , 0x705e , 0x0 , 0x4531 , +0x705d , 0x5171 , 0x0 , 0x7060 , +0x304c , 0x3d6a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x525f , +0x705f , 0x0 , 0x342f , 0x3768 , +0x7066 , 0x7065 , 0x4623 , 0x7061 , +0x7062 , 0x3443 , 0x0 , 0x0 , +0x7063 , 0x556e , 0x0 , 0x0 , +0x4c5b , 0x3e52 , 0x3c32 , 0x0 , +0x0 , 0x0 , 0x7068 , 0x7067 , +0x7064 , 0x3221 , 0x0 , 0x5622 , +0x5338 , 0x3e37 , 0x482c , 0x0 , +0x0 , 0x706a , 0x0 , 0x0 , +0x0 , 0x0 , 0x5177 , 0x0 , +0x564c , 0x3a5b , 0x7069 , 0x0 , +0x363b , 0x0 , 0x0 , 0x4d34 , +0x0 , 0x0 , 0x4626 , 0x0 , +0x0 , 0x0 , 0x4121 , 0x706b , +0x706e , 0x0 , 0x706d , 0x7070 , +0x706c , 0x0 , 0x3b3e , 0x706f , +0x0 , 0x0 , 0x0 , 0x0 , +0x4c35 , 0x7072 , 0x0 , 0x0 , +0x3355 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3154 , 0x0 , 0x0 , +0x7073 , 0x0 , 0x0 , 0x7074 , +0x7076 , 0x3461 , 0x0 , 0x7071 , +0x0 , 0x7077 , 0x0 , 0x0 , +0x0 , 0x0 , 0x707a , 0x0 , +0x7078 , 0x0 , 0x0 , 0x0 , +0x7075 , 0x0 , 0x0 , 0x0 , +0x0 , 0x707d , 0x0 , 0x7079 , +0x707c , 0x707e , 0x0 , 0x7121 , +0x0 , 0x0 , 0x0 , 0x4e41 , +0x7124 , 0x0 , 0x7123 , 0x0 , +0x4176 , 0x707b , 0x4a5d , 0x0 , +0x0 , 0x3471 , 0x3171 , 0x4c31 , +0x0 , 0x7126 , 0x0 , 0x0 , +0x7127 , 0x0 , 0x0 , 0x712c , +0x554e , 0x7129 , 0x0 , 0x0 , +0x4833 , 0x0 , 0x0 , 0x0 , +0x7122 , 0x0 , 0x712b , 0x7128 , +0x7125 , 0x0 , 0x0 , 0x712a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3029 , 0x712d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x712f , 0x0 , 0x7131 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7130 , 0x0 , 0x712e , 0x0 , +0x0 , 0x0 , 0x0 , 0x5122 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7132 , +0x0 , 0x0 , 0x0 , 0x7133 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x396f , 0x0 , 0x0 , 0x3547 , +0x0 , 0x3057 , 0x3059 , 0x0 , +0x0 , 0x0 , 0x546d , 0x0 , +0x3544 , 0x0 , 0x3d54 , 0x3b4a , +0x7027 , 0x0 , 0x0 , 0x385e , +0x0 , 0x0 , 0x7028 , 0x0 , +0x0 , 0x3028 , 0x0 , 0x7029 , +0x0 , 0x0 , 0x4d6e , 0x0 , +0x0 , 0x702a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x702b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4624 , 0x0 , +0x0 , 0x5665 , 0x7164 , 0x0 , +0x7165 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4373 , +0x0 , 0x0 , 0x535b , 0x0 , +0x0 , 0x5651 , 0x4568 , 0x0 , +0x532f , 0x0 , 0x5266 , 0x0 , +0x0 , 0x6e41 , 0x303b , 0x5535 , +0x514e , 0x3c60 , 0x3a50 , 0x0 , +0x3f78 , 0x0 , 0x3847 , 0x3541 , +0x454c , 0x0 , 0x0 , 0x4a22 , +0x0 , 0x0 , 0x0 , 0x434b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6e42 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x443f , 0x3622 , +0x0 , 0x6d6c , 0x4324 , 0x0 , +0x5631 , 0x0 , 0x0 , 0x0 , +0x4f60 , 0x6d6f , 0x0 , 0x0 , +0x454e , 0x0 , 0x365c , 0x0 , +0x0 , 0x4a21 , 0x0 , 0x0 , +0x6d6d , 0x0 , 0x0 , 0x6d70 , +0x6d71 , 0x433c , 0x0 , 0x3f34 , +0x0 , 0x6d6e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d74 , 0x6d72 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5566 , +0x435f , 0x0 , 0x6d73 , 0x0 , +0x0 , 0x0 , 0x6d76 , 0x0 , +0x5523 , 0x5123 , 0x0 , 0x0 , +0x0 , 0x6d75 , 0x0 , 0x4350 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d77 , 0x3f74 , 0x3e6c , +0x6d78 , 0x0 , 0x4c77 , 0x0 , +0x515b , 0x0 , 0x0 , 0x0 , +0x5745 , 0x5576 , 0x0 , 0x6d7c , +0x0 , 0x0 , 0x0 , 0x6d7b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6d79 , 0x6d7a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6d7d , 0x3e26 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4b2f , 0x6e21 , 0x363d , +0x0 , 0x6e22 , 0x4440 , 0x0 , +0x6d7e , 0x0 , 0x0 , 0x3d5e , +0x3247 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3643 , 0x0 , 0x0 , +0x0 , 0x6e25 , 0x583a , 0x6e23 , +0x6e26 , 0x0 , 0x0 , 0x0 , +0x4369 , 0x3372 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6e27 , 0x6e24 , 0x4f39 , 0x0 , +0x0 , 0x6e28 , 0x4277 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6e29 , +0x6e2a , 0x0 , 0x5e2b , 0x0 , +0x0 , 0x4633 , 0x0 , 0x4746 , +0x0 , 0x5675 , 0x3549 , 0x0 , +0x4b32 , 0x0 , 0x0 , 0x0 , +0x6e2b , 0x0 , 0x0 , 0x4d2b , +0x0 , 0x6e2c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5530 , +0x0 , 0x6e2d , 0x0 , 0x7644 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5b47 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3423 , +0x0 , 0x0 , 0x0 , 0x432c , +0x7166 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4a38 , 0x5253 , +0x0 , 0x562a , 0x0 , 0x6f72 , +0x0 , 0x3e58 , 0x0 , 0x3d43 , +0x6f73 , 0x364c , 0x302b , 0x0 , +0x0 , 0x0 , 0x0 , 0x4a2f , +0x0 , 0x0 , 0x6d36 , 0x0 , +0x6d37 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4e79 , 0x372f , 0x3f73 , +0x6d38 , 0x426b , 0x4930 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d39 , 0x0 , 0x0 , +0x4676 , 0x3f33 , 0x0 , 0x0 , +0x0 , 0x6d3c , 0x4578 , 0x0 , +0x5150 , 0x0 , 0x5729 , 0x6d3a , +0x6d3b , 0x0 , 0x5162 , 0x0 , +0x6d3f , 0x6d40 , 0x0 , 0x6d44 , +0x0 , 0x0 , 0x0 , 0x6d48 , +0x0 , 0x6d46 , 0x6d4e , 0x5568 , +0x0 , 0x6d49 , 0x0 , 0x0 , +0x6d47 , 0x6d3e , 0x0 , 0x0 , +0x4569 , 0x0 , 0x0 , 0x0 , +0x4646 , 0x0 , 0x0 , 0x4969 , +0x5452 , 0x6d41 , 0x6d42 , 0x6d43 , +0x6d45 , 0x0 , 0x4079 , 0x0 , +0x3421 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3968 , 0x0 , 0x6d50 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6d51 , 0x0 , 0x6d4a , 0x0 , +0x6d4f , 0x0 , 0x4e78 , 0x0 , +0x0 , 0x4b36 , 0x6d4c , 0x6d4d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4f75 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6d52 , 0x4172 , +0x5332 , 0x6d4b , 0x4837 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3c6f , +0x0 , 0x0 , 0x0 , 0x0 , +0x4570 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6d56 , +0x0 , 0x356f , 0x0 , 0x0 , +0x4235 , 0x302d , 0x4b69 , 0x0 , +0x0 , 0x312e , 0x0 , 0x6d54 , +0x0 , 0x0 , 0x0 , 0x4d6b , +0x3562 , 0x0 , 0x6d55 , 0x6d53 , +0x6d57 , 0x0 , 0x0 , 0x357a , +0x0 , 0x6d58 , 0x0 , 0x6d59 , +0x0 , 0x6d5c , 0x0 , 0x314c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4576 , 0x3c6e , 0x6d5a , 0x4c3c , +0x326a , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d5b , 0x0 , 0x0 , +0x0 , 0x0 , 0x446b , 0x0 , +0x0 , 0x3445 , 0x0 , 0x0 , +0x0 , 0x3075 , 0x0 , 0x0 , +0x0 , 0x6d5f , 0x405a , 0x3468 , +0x0 , 0x0 , 0x0 , 0x0 , +0x454d , 0x0 , 0x0 , 0x0 , +0x6d5d , 0x3f44 , 0x0 , 0x0 , +0x0 , 0x6d5e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4425 , 0x0 , 0x0 , 0x0 , +0x6d60 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6d61 , 0x0 , +0x6d63 , 0x0 , 0x0 , 0x4157 , +0x0 , 0x0 , 0x3b47 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3d38 , 0x0 , 0x0 , +0x0 , 0x6d62 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6d64 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6d66 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6d65 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6d67 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4a3e , 0x6c6a , +0x4071 , 0x0 , 0x4967 , 0x0 , +0x6c6b , 0x466e , 0x0 , 0x0 , +0x0 , 0x0 , 0x6c6c , 0x0 , +0x466d , 0x6c6d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6c70 , +0x0 , 0x0 , 0x5766 , 0x6c73 , +0x0 , 0x0 , 0x6c71 , 0x6c6e , +0x6c6f , 0x5723 , 0x4971 , 0x4b6e , +0x6c74 , 0x0 , 0x6c72 , 0x0 , +0x0 , 0x4f69 , 0x0 , 0x6c76 , +0x4631 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3c40 , 0x0 , 0x6c75 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x353b , +0x3b76 , 0x0 , 0x6c77 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5977 , 0x3d7b , 0x0 , 0x0 , +0x423b , 0x6c78 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6c79 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3823 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6c7a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6c7b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6c7c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x536d , 0x582e , 0x406b , +0x0 , 0x475d , 0x3a4c , 0x0 , +0x5063 , 0x4b3d , 0x0 , 0x4d3a , +0x0 , 0x0 , 0x3851 , 0x0 , +0x0 , 0x317c , 0x0 , 0x476f , +0x0 , 0x5656 , 0x0 , 0x0 , +0x0 , 0x3f46 , 0x436b , 0x0 , +0x0 , 0x6f75 , 0x0 , 0x0 , +0x4358 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5762 , +0x0 , 0x0 , 0x0 , 0x6f77 , +0x3353 , 0x0 , 0x4758 , 0x516d , +0x0 , 0x5648 , 0x0 , 0x6f78 , +0x0 , 0x6f76 , 0x0 , 0x3b7d , +0x3346 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3d55 , 0x0 , 0x0 , 0x5246 , +0x0 , 0x3b60 , 0x0 , 0x0 , +0x4f21 , 0x0 , 0x6f7c , 0x6f7b , +0x0 , 0x0 , 0x6f79 , 0x0 , +0x0 , 0x0 , 0x0 , 0x334c , +0x0 , 0x4954 , 0x4b30 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6f7e , 0x0 , 0x0 , 0x305e , +0x0 , 0x0 , 0x5649 , 0x0 , +0x0 , 0x0 , 0x6f7d , 0x0 , +0x336d , 0x0 , 0x0 , 0x7655 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4e48 , +0x0 , 0x0 , 0x0 , 0x7022 , +0x0 , 0x7021 , 0x0 , 0x353e , +0x3c5a , 0x3b7c , 0x0 , 0x3865 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4442 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7023 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4b6b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7026 , 0x0 , 0x0 , 0x0 , +0x5128 , 0x0 , 0x3e3f , 0x476e , +0x7136 , 0x7137 , 0x3f55 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3429 , +0x7138 , 0x4d3b , 0x0 , 0x4754 , +0x552d , 0x0 , 0x7139 , 0x0 , +0x713a , 0x0 , 0x0 , 0x0 , +0x0 , 0x474f , 0x0 , 0x0 , +0x0 , 0x5224 , 0x564f , 0x0 , +0x0 , 0x713b , 0x3d51 , 0x3430 , +0x3e3d , 0x0 , 0x0 , 0x0 , +0x345c , 0x4e51 , 0x0 , 0x3f5f , +0x713d , 0x0 , 0x0 , 0x0 , +0x0 , 0x3f7a , 0x713c , 0x0 , +0x713f , 0x0 , 0x0 , 0x0 , +0x713e , 0x7140 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7141 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x417e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4122 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4a7a , 0x0 , +0x0 , 0x553e , 0x0 , 0x0 , +0x0 , 0x0 , 0x3e3a , 0x3e39 , +0x5542 , 0x0 , 0x0 , 0x3f22 , +0x0 , 0x4d2f , 0x7135 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3d5f , 0x0 , 0x364b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5671 , 0x7343 , 0x0 , +0x0 , 0x7344 , 0x0 , 0x384d , +0x0 , 0x0 , 0x0 , 0x7346 , +0x7347 , 0x0 , 0x304a , 0x0 , +0x7345 , 0x0 , 0x7349 , 0x4b71 , +0x0 , 0x0 , 0x0 , 0x734b , +0x0 , 0x5026 , 0x0 , 0x0 , +0x314a , 0x7348 , 0x0 , 0x0 , +0x0 , 0x734f , 0x0 , 0x3551 , +0x0 , 0x0 , 0x7357 , 0x0 , +0x7352 , 0x0 , 0x0 , 0x0 , +0x7354 , 0x7353 , 0x377b , 0x0 , +0x313f , 0x0 , 0x734e , 0x734a , +0x355a , 0x0 , 0x7350 , 0x0 , +0x0 , 0x7351 , 0x0 , 0x7355 , +0x0 , 0x0 , 0x0 , 0x0 , +0x734d , 0x0 , 0x3c63 , 0x0 , +0x417d , 0x0 , 0x7356 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x735a , 0x0 , 0x734c , +0x0 , 0x3548 , 0x0 , 0x3d6e , +0x735c , 0x0 , 0x0 , 0x3724 , +0x3f70 , 0x567e , 0x4d32 , 0x0 , +0x3470 , 0x0 , 0x325f , 0x0 , +0x7358 , 0x0 , 0x7359 , 0x4938 , +0x0 , 0x735d , 0x0 , 0x0 , +0x735e , 0x0 , 0x7361 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x735f , 0x0 , +0x0 , 0x7363 , 0x7362 , 0x0 , +0x0 , 0x735b , 0x0 , 0x3f6a , +0x0 , 0x336f , 0x0 , 0x7360 , +0x0 , 0x0 , 0x4729 , 0x0 , +0x3c72 , 0x0 , 0x0 , 0x0 , +0x0 , 0x736b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x393f , 0x0 , 0x0 , +0x7364 , 0x0 , 0x0 , 0x0 , +0x322d , 0x3b7e , 0x0 , 0x4b63 , +0x0 , 0x0 , 0x0 , 0x0 , +0x736d , 0x7369 , 0x0 , 0x0 , +0x0 , 0x395c , 0x736e , 0x0 , +0x0 , 0x0 , 0x7365 , 0x7366 , +0x736a , 0x4261 , 0x736c , 0x736f , +0x7368 , 0x3c7d , 0x0 , 0x0 , +0x0 , 0x4f64 , 0x0 , 0x0 , +0x7370 , 0x0 , 0x0 , 0x0 , +0x7367 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7372 , 0x0 , 0x0 , +0x0 , 0x0 , 0x572d , 0x462a , +0x0 , 0x0 , 0x0 , 0x0 , +0x7373 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7371 , 0x0 , 0x4228 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x385d , 0x7375 , 0x0 , +0x0 , 0x7374 , 0x0 , 0x0 , +0x0 , 0x345b , 0x0 , 0x0 , +0x0 , 0x7376 , 0x7377 , 0x0 , +0x0 , 0x0 , 0x7378 , 0x0 , +0x0 , 0x0 , 0x403a , 0x0 , +0x0 , 0x4069 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4571 , +0x0 , 0x0 , 0x0 , 0x0 , +0x737b , 0x0 , 0x737a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3458 , +0x0 , 0x0 , 0x0 , 0x737e , +0x7379 , 0x0 , 0x0 , 0x737c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x737d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7421 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7423 , 0x3b49 , +0x0 , 0x0 , 0x7422 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7424 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x323e , +0x7426 , 0x7425 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3c2e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4357 , +0x5961 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4060 , +0x744c , 0x5751 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x375b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x744e , 0x4123 , 0x0 , +0x0 , 0x4649 , 0x0 , 0x3456 , +0x5533 , 0x0 , 0x0 , 0x0 , +0x7450 , 0x744f , 0x7451 , 0x4b5a , +0x0 , 0x0 , 0x7452 , 0x0 , +0x5441 , 0x5660 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3760 , 0x0 , +0x0 , 0x0 , 0x4138 , 0x0 , +0x0 , 0x413b , 0x7453 , 0x3e2c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3462 , 0x0 , 0x0 , +0x7454 , 0x7455 , 0x3e2b , 0x0 , +0x0 , 0x7456 , 0x0 , 0x0 , +0x0 , 0x745b , 0x0 , 0x7457 , +0x745a , 0x0 , 0x3a7d , 0x0 , +0x7458 , 0x7459 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3862 , 0x4c47 , 0x745c , +0x0 , 0x325a , 0x0 , 0x0 , +0x4353 , 0x0 , 0x0 , 0x5463 , +0x3f37 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x745d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4534 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7469 , 0x0 , 0x0 , 0x4f35 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4e49 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4b58 , 0x0 , 0x4b77 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3d74 , +0x0 , 0x0 , 0x0 , 0x574f , +0x0 , 0x0 , 0x0 , 0x405b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5075 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x746a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x746b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x746c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7763 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3731 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x746d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x576b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x746e , +0x0 , 0x0 , 0x0 , 0x6679 , +0x3e40 , 0x667a , 0x3a6c , 0x667b , +0x4f4b , 0x667c , 0x543c , 0x3c36 , +0x667d , 0x667e , 0x3c4d , 0x4852 , +0x4e33 , 0x6721 , 0x0 , 0x343f , +0x6722 , 0x4934 , 0x3859 , 0x4449 , +0x0 , 0x575d , 0x425a , 0x3757 , +0x563d , 0x4e46 , 0x3744 , 0x0 , +0x0 , 0x4526 , 0x6723 , 0x4f5f , +0x6724 , 0x6725 , 0x6726 , 0x4137 , +0x5769 , 0x4970 , 0x4f38 , 0x562f , +0x5655 , 0x6727 , 0x306d , 0x6728 , +0x6729 , 0x495c , 0x526f , 0x3e2d , +0x672a , 0x3073 , 0x485e , 0x3d61 , +0x672b , 0x4846 , 0x0 , 0x672c , +0x3b66 , 0x3878 , 0x5124 , 0x672d , +0x4267 , 0x3e78 , 0x3d4a , 0x4d33 , +0x672e , 0x672f , 0x3e6e , 0x5065 , +0x0 , 0x4b67 , 0x4c50 , 0x3c4c , +0x6730 , 0x3c28 , 0x5077 , 0x6731 , +0x0 , 0x5078 , 0x6732 , 0x6733 , +0x3442 , 0x6734 , 0x6735 , 0x497e , +0x4e2c , 0x4360 , 0x6737 , 0x3141 , +0x3371 , 0x0 , 0x6738 , 0x6739 , +0x575b , 0x5540 , 0x673a , 0x424c , +0x573a , 0x673b , 0x673c , 0x673d , +0x3c6a , 0x4365 , 0x4042 , 0x673e , +0x673f , 0x3c29 , 0x0 , 0x6740 , +0x6741 , 0x6736 , 0x3650 , 0x6742 , +0x0 , 0x6743 , 0x6744 , 0x3b3a , +0x355e , 0x4246 , 0x3160 , 0x6745 , +0x5435 , 0x6746 , 0x383f , 0x6748 , +0x6747 , 0x376c , 0x0 , 0x6749 , +0x3278 , 0x674a , 0x674b , 0x674c , +0x674d , 0x674e , 0x674f , 0x6750 , +0x5327 , 0x4b75 , 0x6751 , 0x6752 , +0x6753 , 0x6754 , 0x4949 , 0x6755 , +0x6756 , 0x6757 , 0x6758 , 0x6759 , +0x3d49 , 0x675a , 0x733e , 0x0 , +0x3857 , 0x0 , 0x4831 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x733f , 0x0 , +0x7340 , 0x7341 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x395e , 0x4d78 , 0x0 , 0x0 , +0x5868 , 0x3a31 , 0x0 , 0x425e , +0x6e37 , 0x0 , 0x3723 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6e39 , +0x0 , 0x6e38 , 0x3055 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6e3b , 0x5556 , 0x576f , 0x0 , +0x0 , 0x0 , 0x5643 , 0x0 , +0x0 , 0x6e3d , 0x4a70 , 0x0 , +0x6e3c , 0x0 , 0x0 , 0x0 , +0x0 , 0x6e3e , 0x0 , 0x0 , +0x0 , 0x0 , 0x6e40 , 0x0 , +0x0 , 0x6e3f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5172 , 0x0 , +0x473c , 0x0 , 0x4340 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3861 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4167 , 0x0 , +0x0 , 0x7446 , 0x505f , 0x7447 , +0x0 , 0x4f5b , 0x0 , 0x0 , +0x483a , 0x0 , 0x0 , 0x7448 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7449 , +0x744a , 0x0 , 0x744b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x597a , 0x387e , 0x0 , 0x0 , +0x6571 , 0x5370 , 0x0 , 0x7460 , +0x0 , 0x4e4c , 0x0 , 0x0 , +0x0 , 0x3361 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7134 , 0x0 , +0x526e , 0x0 , 0x7461 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4f68 , 0x7462 , 0x0 , 0x0 , +0x474c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3554 , +0x3464 , 0x7464 , 0x0 , 0x0 , +0x0 , 0x7463 , 0x7465 , 0x0 , +0x0 , 0x7466 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7467 , 0x0 , +0x3a32 , 0x303f , 0x0 , 0x7468 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x372d , +0x526d , 0x0 , 0x0 , 0x0 , +0x522b , 0x404f , 0x0 , 0x3f3c , +0x6b23 , 0x555f , 0x6a48 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7173 , +0x3678 , 0x4b23 , 0x0 , 0x0 , +0x444d , 0x0 , 0x7167 , 0x0 , +0x7168 , 0x387b , 0x7169 , 0x3a44 , +0x5445 , 0x3052 , 0x0 , 0x0 , +0x716a , 0x0 , 0x0 , 0x0 , +0x716b , 0x0 , 0x716c , 0x0 , +0x0 , 0x716d , 0x716e , 0x716f , +0x7171 , 0x7170 , 0x4555 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7172 , 0x0 , 0x367a , +0x0 , 0x7174 , 0x522e , 0x5e47 , +0x4b4a , 0x0 , 0x0 , 0x335c , +0x0 , 0x3522 , 0x0 , 0x3922 , +0x0 , 0x0 , 0x4474 , 0x7175 , +0x0 , 0x0 , 0x7176 , 0x0 , +0x0 , 0x0 , 0x4144 , 0x417b , +0x5630 , 0x7177 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7178 , 0x0 , +0x412a , 0x0 , 0x0 , 0x0 , +0x4638 , 0x0 , 0x3e5b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7179 , 0x344f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x717a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6d32 , +0x6d31 , 0x0 , 0x0 , 0x4b60 , +0x525e , 0x0 , 0x4b41 , 0x5558 , +0x0 , 0x4862 , 0x0 , 0x405f , +0x3c21 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6b41 , +0x0 , 0x0 , 0x5024 , 0x0 , +0x5662 , 0x0 , 0x3647 , 0x3858 , +0x6b40 , 0x384e , 0x0 , 0x6b3f , +0x3326 , 0x3949 , 0x562b , 0x0 , +0x3774 , 0x374a , 0x0 , 0x0 , +0x0 , 0x3c67 , 0x373e , 0x6b46 , +0x0 , 0x6b47 , 0x3039 , 0x3f4f , +0x0 , 0x6b45 , 0x537d , 0x0 , +0x6b48 , 0x0 , 0x0 , 0x6b49 , +0x0 , 0x0 , 0x374e , 0x0 , +0x6b42 , 0x6b44 , 0x4976 , 0x5657 , +0x554d , 0x5032 , 0x6b4f , 0x4e38 , +0x6b50 , 0x0 , 0x3528 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3133 , 0x6b52 , 0x4c25 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4556 , 0x6b53 , +0x0 , 0x6b51 , 0x455f , 0x6b4e , +0x4a24 , 0x6b55 , 0x307b , 0x0 , +0x0 , 0x3a7a , 0x0 , 0x0 , +0x5837 , 0x7163 , 0x0 , 0x6b4a , +0x6b4b , 0x6b4c , 0x6b4d , 0x6b56 , +0x6640 , 0x6b59 , 0x0 , 0x3f68 , +0x5248 , 0x6b57 , 0x6b5c , 0x386c , +0x6b58 , 0x0 , 0x3d3a , 0x0 , +0x5058 , 0x0 , 0x3037 , 0x0 , +0x6b5d , 0x445c , 0x0 , 0x0 , +0x0 , 0x0 , 0x562c , 0x0 , +0x0 , 0x0 , 0x3460 , 0x0 , +0x0 , 0x4276 , 0x3c39 , 0x0 , +0x0 , 0x6b5a , 0x6b5b , 0x5460 , +0x466a , 0x4454 , 0x6b5f , 0x4527 , +0x5975 , 0x0 , 0x3231 , 0x0 , +0x6b64 , 0x0 , 0x3d45 , 0x0 , +0x0 , 0x0 , 0x6b62 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6b63 , 0x0 , 0x0 , 0x382c , +0x0 , 0x4d51 , 0x6b65 , 0x0 , +0x0 , 0x0 , 0x6b61 , 0x0 , +0x4133 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4622 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4c73 , 0x0 , +0x6b66 , 0x0 , 0x4030 , 0x5238 , +0x6b67 , 0x0 , 0x0 , 0x0 , +0x382f , 0x382d , 0x0 , 0x6b68 , +0x473b , 0x4d73 , 0x0 , 0x0 , +0x0 , 0x6b6a , 0x6b6b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6b6d , 0x0 , 0x0 , 0x0 , +0x0 , 0x5048 , 0x0 , 0x6b72 , +0x0 , 0x6b6e , 0x0 , 0x0 , +0x0 , 0x6b71 , 0x4879 , 0x0 , +0x517c , 0x6b6c , 0x0 , 0x0 , +0x6b69 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3839 , 0x4f59 , 0x4465 , +0x6b6f , 0x6b70 , 0x4c5a , 0x4d48 , +0x3072 , 0x0 , 0x6b76 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6b75 , 0x0 , 0x3232 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3860 , +0x0 , 0x6b77 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x316c , 0x0 , 0x0 , 0x4c45 , +0x4424 , 0x4f25 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6b79 , +0x0 , 0x0 , 0x6c22 , 0x0 , +0x4572 , 0x0 , 0x6b7a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4945 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x625f , 0x6b7e , +0x0 , 0x0 , 0x0 , 0x0 , +0x4d4e , 0x6c21 , 0x315b , 0x5337 , +0x0 , 0x0 , 0x525c , 0x0 , +0x0 , 0x0 , 0x6b7d , 0x0 , +0x6b7b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x333c , +0x0 , 0x0 , 0x0 , 0x6a30 , +0x0 , 0x0 , 0x5754 , 0x0 , +0x742b , 0x3374 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5641 , +0x5642 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5569 , +0x3e4a , 0x0 , 0x7427 , 0x0 , +0x5228 , 0x7428 , 0x7429 , 0x0 , +0x742a , 0x3e4b , 0x535f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4960 , 0x4961 , 0x0 , 0x0 , +0x7342 , 0x0 , 0x4a66 , 0x0 , +0x4c72 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6236 , +0x4b34 , 0x0 , 0x4e68 , 0x565b , +0x0 , 0x742d , 0x742e , 0x742f , +0x0 , 0x0 , 0x0 , 0x0 , +0x7432 , 0x0 , 0x3a3d , 0x7433 , +0x3063 , 0x7430 , 0x0 , 0x7431 , +0x3d22 , 0x3255 , 0x0 , 0x7436 , +0x7437 , 0x3666 , 0x3230 , 0x4f4f , +0x7434 , 0x342c , 0x0 , 0x7435 , +0x0 , 0x0 , 0x7438 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7439 , 0x0 , 0x0 , 0x4d27 , +0x0 , 0x743a , 0x0 , 0x743b , +0x0 , 0x0 , 0x0 , 0x743c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4b52 , 0x0 , 0x743d , 0x0 , +0x0 , 0x0 , 0x0 , 0x743e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x743f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x745e , 0x413c , +0x3c68 , 0x0 , 0x492b , 0x515e , +0x6575 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5c33 , 0x5255 , 0x0 , +0x0 , 0x5c34 , 0x302c , 0x5c35 , +0x0 , 0x0 , 0x3d5a , 0x0 , +0x5c39 , 0x0 , 0x0 , 0x0 , +0x5842 , 0x0 , 0x5c37 , 0x5373 , +0x0 , 0x4956 , 0x5c3a , 0x5c36 , +0x0 , 0x5c3b , 0x4322 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5c3c , +0x5c45 , 0x5c3d , 0x0 , 0x0 , +0x4e5f , 0x5625 , 0x0 , 0x5c4f , +0x0 , 0x5c4d , 0x0 , 0x0 , +0x5c52 , 0x3d66 , 0x422b , 0x0 , +0x5c38 , 0x5c4b , 0x5c4e , 0x5c3e , +0x3752 , 0x3045 , 0x5c47 , 0x503e , +0x5c41 , 0x3b28 , 0x0 , 0x373c , +0x5c4c , 0x0 , 0x0 , 0x5c46 , +0x5c3f , 0x475b , 0x0 , 0x0 , +0x0 , 0x513f , 0x5c40 , 0x0 , +0x0 , 0x5c4a , 0x0 , 0x0 , +0x5c50 , 0x0 , 0x0 , 0x4e2d , +0x5c42 , 0x0 , 0x5c43 , 0x5c48 , +0x5c49 , 0x3254 , 0x5c51 , 0x4b55 , +0x0 , 0x5437 , 0x5c5b , 0x5c5f , +0x4c26 , 0x5c66 , 0x0 , 0x4367 , +0x5c5c , 0x0 , 0x0 , 0x3f41 , +0x5c59 , 0x0 , 0x307a , 0x3936 , +0x5c65 , 0x5c53 , 0x0 , 0x5c44 , +0x5c56 , 0x4874 , 0x3f60 , 0x0 , +0x0 , 0x0 , 0x0 , 0x493b , +0x0 , 0x0 , 0x0 , 0x313d , +0x0 , 0x5322 , 0x0 , 0x0 , +0x5c5a , 0x0 , 0x0 , 0x5c55 , +0x0 , 0x463b , 0x0 , 0x5c5e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5742 , 0x432f , 0x3736 , +0x4751 , 0x4329 , 0x5c62 , 0x5c58 , +0x5c6b , 0x5c54 , 0x0 , 0x0 , +0x5c5d , 0x0 , 0x3e25 , 0x5c57 , +0x0 , 0x5c60 , 0x0 , 0x0 , +0x5c63 , 0x5c64 , 0x0 , 0x5c78 , +0x0 , 0x0 , 0x5c61 , 0x5d22 , +0x5c67 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3c6b , +0x3444 , 0x0 , 0x0 , 0x4323 , +0x3267 , 0x5c7a , 0x0 , 0x5c72 , +0x0 , 0x5c6f , 0x0 , 0x5c7c , +0x5c6e , 0x5270 , 0x3268 , 0x0 , +0x4857 , 0x4863 , 0x5c7b , 0x0 , +0x5c6d , 0x0 , 0x0 , 0x0 , +0x5c77 , 0x0 , 0x0 , 0x5c75 , +0x0 , 0x0 , 0x3e23 , 0x5c74 , +0x0 , 0x325d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5c73 , +0x3c76 , 0x5c68 , 0x3b44 , 0x0 , +0x4073 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3c54 , 0x5c69 , +0x5c6a , 0x0 , 0x5c71 , 0x5c76 , +0x5c79 , 0x3534 , 0x0 , 0x4859 , +0x3b67 , 0x5c7e , 0x5c7d , 0x532b , +0x5d21 , 0x5d23 , 0x5d25 , 0x5271 , +0x5d24 , 0x5d26 , 0x5d27 , 0x5229 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3a49 , +0x5d29 , 0x0 , 0x0 , 0x5d36 , +0x5d31 , 0x5d34 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5d30 , 0x464e , 0x0 , +0x0 , 0x4072 , 0x0 , 0x0 , +0x0 , 0x0 , 0x492f , 0x0 , +0x0 , 0x0 , 0x5c6c , 0x5d2e , +0x0 , 0x0 , 0x0 , 0x0 , +0x5d37 , 0x0 , 0x0 , 0x5c70 , +0x5d2f , 0x0 , 0x5d38 , 0x0 , +0x5d2c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5d39 , 0x5d33 , 0x5d2d , 0x442a , +0x0 , 0x0 , 0x0 , 0x0 , +0x5d28 , 0x4033 , 0x412b , 0x5d2a , +0x5d2b , 0x0 , 0x5d32 , 0x3b71 , +0x5d35 , 0x5328 , 0x5d3a , 0x0 , +0x5d3b , 0x4327 , 0x0 , 0x0 , +0x5d52 , 0x5d3c , 0x0 , 0x0 , +0x0 , 0x5d51 , 0x0 , 0x393d , +0x0 , 0x0 , 0x3e55 , 0x0 , +0x3e7a , 0x0 , 0x0 , 0x3a4a , +0x0 , 0x0 , 0x0 , 0x0 , +0x5d4a , 0x0 , 0x5d45 , 0x0 , +0x5d3f , 0x0 , 0x0 , 0x0 , +0x324b , 0x5d43 , 0x0 , 0x5d4b , +0x3224 , 0x5d55 , 0x0 , 0x0 , +0x0 , 0x5d3e , 0x0 , 0x0 , +0x0 , 0x4650 , 0x5d50 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5d54 , 0x4162 , 0x3746 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5d4e , 0x5d4f , 0x0 , 0x0 , +0x0 , 0x5d44 , 0x0 , 0x0 , +0x0 , 0x5d3d , 0x0 , 0x5d4d , +0x4c51 , 0x0 , 0x5d49 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5d42 , +0x4348 , 0x463c , 0x4e2e , 0x5d4c , +0x0 , 0x5d48 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5d41 , 0x0 , 0x0 , 0x0 , +0x5d46 , 0x425c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5329 , 0x532a , 0x5d53 , 0x4f74 , +0x4878 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5d66 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5d47 , 0x0 , 0x0 , 0x0 , +0x5d60 , 0x4264 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5d61 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5d57 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5678 , +0x0 , 0x5d59 , 0x5d58 , 0x3870 , +0x5d56 , 0x0 , 0x0 , 0x0 , +0x0 , 0x464f , 0x0 , 0x362d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5d62 , 0x0 , 0x3a79 , +0x5461 , 0x5d67 , 0x0 , 0x0 , +0x0 , 0x3450 , 0x0 , 0x5d5a , +0x0 , 0x3f7b , 0x5d63 , 0x0 , +0x5d5f , 0x0 , 0x5d5d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3559 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5d5b , +0x5d5c , 0x5d5e , 0x0 , 0x3d2f , +0x5d64 , 0x0 , 0x5d65 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5d75 , +0x0 , 0x4349 , 0x0 , 0x0 , +0x4b62 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5d72 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5861 , +0x0 , 0x0 , 0x4651 , 0x0 , +0x5d74 , 0x0 , 0x0 , 0x0 , +0x5574 , 0x5d73 , 0x5d70 , 0x0 , +0x0 , 0x5d6c , 0x0 , 0x5d6f , +0x0 , 0x5d68 , 0x0 , 0x0 , +0x506e , 0x0 , 0x0 , 0x0 , +0x0 , 0x4858 , 0x5d6e , 0x0 , +0x0 , 0x5d69 , 0x0 , 0x0 , +0x5d6a , 0x4b72 , 0x0 , 0x5d6d , +0x0 , 0x0 , 0x314d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4036 , 0x0 , 0x3c3b , +0x5d71 , 0x0 , 0x0 , 0x5d77 , +0x0 , 0x5d76 , 0x5d6b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x456e , 0x0 , 0x0 , 0x0 , +0x5d7b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5e24 , 0x0 , 0x0 , 0x5e23 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5d78 , 0x0 , 0x0 , 0x0 , +0x0 , 0x436f , 0x0 , 0x427b , +0x0 , 0x0 , 0x0 , 0x5561 , +0x0 , 0x0 , 0x4e35 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5d7d , +0x0 , 0x324c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4468 , +0x4a5f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x473e , +0x5d7a , 0x5d7c , 0x5d7e , 0x5e22 , +0x302a , 0x314e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5e2c , +0x0 , 0x0 , 0x0 , 0x0 , +0x5e26 , 0x3d36 , 0x486f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5e21 , 0x0 , +0x0 , 0x5e25 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5e29 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5e28 , 0x0 , 0x0 , 0x0 , +0x5e27 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5e2d , 0x0 , +0x544c , 0x0 , 0x0 , 0x0 , +0x0 , 0x5e33 , 0x5e2a , 0x5e2e , +0x0 , 0x0 , 0x4059 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3121 , 0x5e36 , 0x0 , 0x5e31 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5e32 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5126 , +0x5e35 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5e2f , 0x0 , 0x0 , 0x0 , +0x5e30 , 0x0 , 0x503d , 0x0 , +0x0 , 0x0 , 0x5e34 , 0x4a6d , +0x5e39 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5e38 , +0x0 , 0x5e37 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5e3b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3d65 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3258 , +0x436a , 0x0 , 0x0 , 0x5e3a , +0x0 , 0x453a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5e3c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4c59 , 0x0 , 0x0 , 0x0 , +0x0 , 0x372a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5465 , +0x0 , 0x0 , 0x0 , 0x5e3d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5e3f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4422 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5e41 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5e3e , +0x0 , 0x5e40 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x553a , 0x0 , 0x0 , 0x0 , +0x5e42 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x722e , 0x3b22 , 0x4232 , +0x4530 , 0x4247 , 0x0 , 0x0 , +0x722f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5069 , 0x0 , +0x0 , 0x0 , 0x535d , 0x0 , +0x0 , 0x0 , 0x6b3d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3366 , +0x7230 , 0x0 , 0x7231 , 0x0 , +0x0 , 0x4a2d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3a67 , 0x7233 , 0x7235 , +0x7234 , 0x4b64 , 0x4f3a , 0x7232 , +0x4a34 , 0x524f , 0x426c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4e43 , 0x7238 , +0x3076 , 0x7237 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x723e , +0x0 , 0x324f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5141 , 0x723a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x723c , +0x5469 , 0x0 , 0x0 , 0x723b , +0x7236 , 0x723f , 0x723d , 0x0 , +0x7239 , 0x0 , 0x0 , 0x7247 , +0x7244 , 0x7246 , 0x0 , 0x0 , +0x724a , 0x7242 , 0x7240 , 0x0 , +0x0 , 0x0 , 0x7245 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x567b , 0x0 , 0x0 , 0x0 , +0x7241 , 0x0 , 0x4779 , 0x495f , +0x0 , 0x7248 , 0x3946 , 0x3530 , +0x0 , 0x0 , 0x7243 , 0x7249 , +0x7250 , 0x7256 , 0x0 , 0x0 , +0x3b57 , 0x0 , 0x0 , 0x0 , +0x7255 , 0x4d5c , 0x0 , 0x566b , +0x0 , 0x0 , 0x7252 , 0x7254 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3872 , 0x0 , 0x0 , 0x0 , +0x0 , 0x724b , 0x0 , 0x0 , +0x0 , 0x724e , 0x4279 , 0x0 , +0x555d , 0x724c , 0x724d , 0x724f , +0x7253 , 0x0 , 0x0 , 0x0 , +0x7259 , 0x533c , 0x0 , 0x0 , +0x0 , 0x0 , 0x366a , 0x0 , +0x4a71 , 0x0 , 0x3764 , 0x7257 , +0x0 , 0x0 , 0x0 , 0x7258 , +0x725a , 0x725d , 0x725b , 0x0 , +0x0 , 0x725c , 0x0 , 0x0 , +0x0 , 0x0 , 0x5151 , 0x7251 , +0x0 , 0x4d49 , 0x0 , 0x4e4f , +0x5629 , 0x0 , 0x7263 , 0x0 , +0x435b , 0x0 , 0x7260 , 0x0 , +0x0 , 0x402f , 0x726c , 0x725e , +0x0 , 0x7261 , 0x0 , 0x0 , +0x0 , 0x7268 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7262 , 0x0 , +0x0 , 0x7267 , 0x0 , 0x0 , +0x7266 , 0x0 , 0x0 , 0x7269 , +0x0 , 0x0 , 0x0 , 0x725f , +0x0 , 0x0 , 0x7264 , 0x726a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x532c , +0x7265 , 0x3275 , 0x0 , 0x0 , +0x7272 , 0x0 , 0x502b , 0x0 , +0x0 , 0x0 , 0x0 , 0x7275 , +0x0 , 0x0 , 0x0 , 0x3b48 , +0x0 , 0x7279 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7270 , 0x0 , 0x0 , 0x7276 , +0x7278 , 0x727a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7273 , 0x0 , +0x7271 , 0x0 , 0x0 , 0x0 , +0x3a7b , 0x0 , 0x357b , 0x0 , +0x0 , 0x0 , 0x0 , 0x726f , +0x7277 , 0x726d , 0x726e , 0x0 , +0x0 , 0x0 , 0x726b , 0x7326 , +0x0 , 0x7323 , 0x0 , 0x0 , +0x7322 , 0x0 , 0x0 , 0x7274 , +0x0 , 0x485a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x727b , +0x0 , 0x0 , 0x0 , 0x7325 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4378 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x727d , 0x0 , 0x0 , 0x7327 , +0x7329 , 0x7324 , 0x0 , 0x727c , +0x0 , 0x0 , 0x0 , 0x732b , +0x0 , 0x732a , 0x0 , 0x0 , +0x0 , 0x0 , 0x425d , 0x0 , +0x0 , 0x732e , 0x0 , 0x0 , +0x7330 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7321 , 0x0 , +0x0 , 0x0 , 0x7331 , 0x732c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x732f , 0x727e , 0x732d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7332 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7334 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7328 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7333 , 0x0 , +0x0 , 0x0 , 0x7335 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5037 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7338 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5979 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7339 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7337 , +0x0 , 0x4864 , 0x7336 , 0x0 , +0x0 , 0x0 , 0x0 , 0x733a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x733b , 0x3440 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6e43 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x733c , 0x0 , 0x0 , +0x733d , 0x0 , 0x0 , 0x0 , +0x512a , 0x0 , 0x0 , 0x0 , +0x742c , 0x5046 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5050 , 0x515c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4f4e , 0x0 , 0x0 , 0x3d56 , +0x0 , 0x5143 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3a62 , 0x6169 , 0x5242 , +0x7142 , 0x3239 , 0x0 , 0x0 , +0x316d , 0x7143 , 0x0 , 0x4940 , +0x3344 , 0x0 , 0x5972 , 0x0 , +0x4b25 , 0x0 , 0x7144 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5654 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7145 , 0x7440 , 0x7146 , +0x0 , 0x542c , 0x7147 , 0x0 , +0x3040 , 0x7441 , 0x0 , 0x0 , +0x7442 , 0x0 , 0x0 , 0x347c , +0x0 , 0x455b , 0x0 , 0x0 , +0x0 , 0x0 , 0x4c3b , 0x0 , +0x0 , 0x0 , 0x5064 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4d60 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7148 , 0x0 , +0x5973 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x313b , +0x0 , 0x4f2e , 0x0 , 0x0 , +0x0 , 0x3824 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x714a , +0x0 , 0x0 , 0x0 , 0x0 , +0x714b , 0x0 , 0x0 , 0x0 , +0x0 , 0x3243 , 0x4151 , 0x0 , +0x0 , 0x5730 , 0x7149 , 0x0 , +0x0 , 0x714c , 0x0 , 0x0 , +0x0 , 0x0 , 0x714e , 0x0 , +0x0 , 0x0 , 0x5976 , 0x0 , +0x5261 , 0x5423 , 0x0 , 0x0 , +0x7443 , 0x4839 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7444 , +0x0 , 0x0 , 0x714d , 0x714f , +0x3f63 , 0x7150 , 0x0 , 0x0 , +0x7154 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7156 , 0x7151 , 0x0 , 0x4951 , +0x4561 , 0x0 , 0x0 , 0x0 , +0x4263 , 0x397c , 0x0 , 0x0 , +0x7153 , 0x0 , 0x7155 , 0x0 , +0x0 , 0x0 , 0x3953 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x715b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3a56 , 0x0 , 0x307d , 0x7159 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7158 , 0x7152 , 0x715a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7157 , 0x0 , 0x0 , +0x0 , 0x486c , 0x0 , 0x0 , +0x0 , 0x0 , 0x4d4a , 0x715d , +0x0 , 0x0 , 0x0 , 0x0 , +0x653d , 0x0 , 0x0 , 0x0 , +0x715c , 0x0 , 0x715e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x715f , 0x0 , 0x0 , +0x4f65 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7445 , 0x3d73 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7160 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7161 , +0x0 , 0x0 , 0x0 , 0x4e77 , +0x0 , 0x522a , 0x0 , 0x717b , +0x0 , 0x0 , 0x3832 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3c7b , 0x395b , 0x0 , +0x3966 , 0x4359 , 0x4a53 , 0x6a68 , +0x4040 , 0x3e75 , 0x6a69 , 0x6a6a , +0x6a6b , 0x0 , 0x6a6c , 0x6a6d , +0x6a6e , 0x6a6f , 0x3d47 , 0x0 , +0x0 , 0x0 , 0x757b , 0x0 , +0x0 , 0x0 , 0x757d , 0x0 , +0x757e , 0x0 , 0x757c , 0x0 , +0x0 , 0x0 , 0x0 , 0x3d62 , +0x0 , 0x7621 , 0x3425 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7622 , +0x0 , 0x0 , 0x0 , 0x7623 , +0x0 , 0x0 , 0x0 , 0x6c32 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5154 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x596a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7624 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6e3a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5532 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x537e , 0x4c5c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4a44 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6540 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7625 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3e2f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4629 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5a25 , 0x3c46 , 0x3629 , 0x383c , +0x484f , 0x3c25 , 0x5a26 , 0x5a27 , +0x4c56 , 0x4843 , 0x5a28 , 0x467d , +0x0 , 0x5135 , 0x5269 , 0x5136 , +0x3c47 , 0x0 , 0x3d32 , 0x3b64 , +0x5a29 , 0x5a2a , 0x5148 , 0x5a2b , +0x506d , 0x366f , 0x425b , 0x0 , +0x4b4f , 0x376d , 0x4968 , 0x3743 , +0x3e77 , 0x5624 , 0x5a2c , 0x5a2d , +0x4640 , 0x5767 , 0x4a36 , 0x0 , +0x5529 , 0x4b5f , 0x556f , 0x5a2e , +0x565f , 0x344a , 0x5a30 , 0x5a2f , +0x0 , 0x526b , 0x5a31 , 0x5a32 , +0x5a33 , 0x4a54 , 0x5a34 , 0x4a2b , +0x5a35 , 0x5a36 , 0x334f , 0x566f , +0x5a37 , 0x3b30 , 0x352e , 0x5a38 , +0x5a39 , 0x396e , 0x512f , 0x5268 , +0x5a3a , 0x3843 , 0x4f6a , 0x326f , +0x5a3b , 0x5a3c , 0x0 , 0x3d6b , +0x4e5c , 0x536f , 0x5a3d , 0x4e73 , +0x5a3e , 0x5355 , 0x3b65 , 0x5a3f , +0x4b35 , 0x4b50 , 0x5a40 , 0x476b , +0x566e , 0x5a41 , 0x4535 , 0x3641 , +0x5a42 , 0x374c , 0x3f4e , 0x5a43 , +0x5a44 , 0x4b2d , 0x5a45 , 0x3577 , +0x5a46 , 0x4142 , 0x573b , 0x5a47 , +0x4c38 , 0x0 , 0x526a , 0x4431 , +0x5a48 , 0x357d , 0x3b51 , 0x5a49 , +0x5033 , 0x5a4a , 0x5a4b , 0x4e3d , +0x5a4c , 0x5a4d , 0x5a4e , 0x3277 , +0x5a51 , 0x5a4f , 0x5168 , 0x5a50 , +0x4355 , 0x5a52 , 0x0 , 0x5a53 , +0x5a54 , 0x5a55 , 0x503b , 0x5225 , +0x3079 , 0x5a56 , 0x472b , 0x5a57 , +0x3d77 , 0x4321 , 0x5a58 , 0x5a59 , +0x437d , 0x4c37 , 0x5a5a , 0x5a5b , +0x403e , 0x4657 , 0x5a5c , 0x5a5d , +0x4734 , 0x5a5e , 0x5a5f , 0x3948 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3b6d , 0x0 , 0x0 , +0x0 , 0x0 , 0x3639 , 0x7478 , +0x0 , 0x7479 , 0x0 , 0x0 , +0x4d63 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7539 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6b60 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4f73 , 0x3b3f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3a40 , 0x5425 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6159 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7574 , 0x312a , 0x3272 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7575 , 0x0 , +0x0 , 0x7577 , 0x0 , 0x0 , +0x0 , 0x3a51 , 0x7576 , 0x0 , +0x4332 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7579 , 0x0 , 0x0 , 0x0 , +0x7578 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3134 , 0x556a , 0x383a , +0x0 , 0x3931 , 0x3246 , 0x5470 , +0x4f4d , 0x305c , 0x554b , 0x3b75 , +0x564a , 0x3737 , 0x4c30 , 0x4636 , +0x3161 , 0x393a , 0x567c , 0x3961 , +0x3721 , 0x3c7a , 0x6a5a , 0x6a5b , +0x4c79 , 0x3973 , 0x6a5c , 0x347b , +0x4333 , 0x3751 , 0x3a58 , 0x6a5d , +0x5474 , 0x6a5e , 0x3c56 , 0x3b5f , +0x6a5f , 0x415e , 0x4238 , 0x545f , +0x574a , 0x6a60 , 0x6a61 , 0x6a64 , +0x6a62 , 0x6a63 , 0x495e , 0x3833 , +0x3644 , 0x6a65 , 0x4a6a , 0x494d , +0x344d , 0x0 , 0x0 , 0x6259 , +0x4562 , 0x6a66 , 0x4035 , 0x0 , +0x5738 , 0x6a67 , 0x572c , 0x487c , +0x5853 , 0x584d , 0x545e , 0x0 , +0x5479 , 0x4944 , 0x532e , 0x3853 , +0x3360 , 0x0 , 0x4962 , 0x7476 , +0x0 , 0x0 , 0x0 , 0x3a55 , +0x0 , 0x7477 , 0x0 , 0x0 , +0x575f , 0x0 , 0x0 , 0x7471 , +0x3830 , 0x5554 , 0x384f , 0x4670 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3343 , 0x0 , 0x0 , +0x7472 , 0x332c , 0x0 , 0x0 , +0x0 , 0x0 , 0x543d , 0x4777 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7474 , 0x0 , 0x0 , +0x7473 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4c4b , +0x0 , 0x0 , 0x0 , 0x4824 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7475 , 0x0 , 0x5763 , +0x453f , 0x7540 , 0x0 , 0x0 , +0x753b , 0x0 , 0x7543 , 0x0 , +0x7542 , 0x0 , 0x563a , 0x7541 , +0x0 , 0x0 , 0x0 , 0x543e , +0x7544 , 0x0 , 0x754c , 0x0 , +0x0 , 0x0 , 0x0 , 0x304f , +0x3578 , 0x0 , 0x7549 , 0x754a , +0x0 , 0x455c , 0x0 , 0x0 , +0x0 , 0x0 , 0x7545 , 0x7546 , +0x0 , 0x0 , 0x7547 , 0x754b , +0x0 , 0x3e60 , 0x7548 , 0x387a , +0x0 , 0x0 , 0x0 , 0x7550 , +0x7553 , 0x0 , 0x0 , 0x0 , +0x3f67 , 0x0 , 0x3972 , 0x753c , +0x754d , 0x0 , 0x0 , 0x4237 , +0x0 , 0x0 , 0x0 , 0x4c78 , +0x0 , 0x3c79 , 0x0 , 0x754e , +0x754f , 0x7551 , 0x3665 , 0x7552 , +0x0 , 0x7555 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x753d , 0x0 , 0x0 , +0x0 , 0x7554 , 0x533b , 0x0 , +0x336c , 0x0 , 0x0 , 0x4c24 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7556 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7557 , 0x3e61 , 0x7558 , +0x0 , 0x0 , 0x4c5f , 0x755b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3248 , 0x5759 , 0x0 , +0x7559 , 0x0 , 0x755a , 0x755c , +0x0 , 0x7562 , 0x0 , 0x0 , +0x0 , 0x7560 , 0x0 , 0x0 , +0x0 , 0x755f , 0x755d , 0x0 , +0x0 , 0x7561 , 0x0 , 0x0 , +0x755e , 0x7564 , 0x7565 , 0x0 , +0x4c63 , 0x0 , 0x0 , 0x653f , +0x3538 , 0x7563 , 0x7568 , 0x4c23 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7566 , 0x7567 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x753e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3144 , 0x0 , +0x0 , 0x753f , 0x0 , 0x0 , +0x3545 , 0x3264 , 0x0 , 0x756c , +0x7569 , 0x0 , 0x3657 , 0x0 , +0x756d , 0x0 , 0x756a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x756b , 0x0 , 0x0 , 0x345a , +0x0 , 0x546a , 0x0 , 0x0 , +0x0 , 0x756e , 0x0 , 0x3379 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x756f , +0x7571 , 0x0 , 0x0 , 0x0 , +0x7570 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7572 , 0x0 , 0x7573 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x496d , +0x392a , 0x0 , 0x0 , 0x477b , +0x0 , 0x0 , 0x3663 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4c49 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6a26 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3335 , 0x547e , +0x396c , 0x5079 , 0x0 , 0x696d , +0x572a , 0x696e , 0x4256 , 0x486d , +0x3a64 , 0x696f , 0x6970 , 0x6971 , +0x5661 , 0x6972 , 0x6973 , 0x6975 , +0x6974 , 0x6976 , 0x6977 , 0x4761 , +0x6978 , 0x5458 , 0x6979 , 0x3d4e , +0x0 , 0x697a , 0x697b , 0x3d4f , +0x697c , 0x3828 , 0x413e , 0x697d , +0x3132 , 0x3b54 , 0x3975 , 0x697e , +0x0 , 0x6a21 , 0x6a22 , 0x6a23 , +0x3778 , 0x3c2d , 0x0 , 0x4a64 , +0x604e , 0x542f , 0x4f3d , 0x5537 , +0x6a24 , 0x555e , 0x6a25 , 0x5041 , +0x393c , 0x0 , 0x3447 , 0x3159 , +0x0 , 0x0 , 0x0 , 0x4031 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3166 , 0x3167 , 0x0 , 0x3168 , +0x0 , 0x0 , 0x0 , 0x0 , +0x333d , 0x4868 , 0x0 , 0x0 , +0x0 , 0x0 , 0x6541 , 0x0 , +0x0 , 0x315f , 0x0 , 0x0 , +0x0 , 0x4149 , 0x346f , 0x0 , +0x0 , 0x4728 , 0x5358 , 0x0 , +0x4679 , 0x5138 , 0x0 , 0x397d , +0x4275 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x532d , 0x0 , +0x544b , 0x3d7c , 0x0 , 0x6542 , +0x3735 , 0x6543 , 0x0 , 0x0 , +0x3b39 , 0x5562 , 0x0 , 0x3d78 , +0x5436 , 0x4e25 , 0x412c , 0x3359 , +0x0 , 0x0 , 0x4c76 , 0x0 , +0x6546 , 0x6544 , 0x6548 , 0x0 , +0x654a , 0x6547 , 0x354f , 0x4648 , +0x0 , 0x357c , 0x6545 , 0x0 , +0x4a76 , 0x0 , 0x0 , 0x6549 , +0x0 , 0x0 , 0x0 , 0x4354 , +0x3145 , 0x3c23 , 0x0 , 0x0 , +0x0 , 0x5737 , 0x0 , 0x0 , +0x4d4b , 0x4b4d , 0x4a4a , 0x4c53 , +0x654c , 0x654b , 0x4466 , 0x0 , +0x0 , 0x5121 , 0x5137 , 0x654d , +0x0 , 0x6550 , 0x0 , 0x4d38 , +0x5670 , 0x654f , 0x355d , 0x0 , +0x4d3e , 0x0 , 0x6551 , 0x363a , +0x0 , 0x0 , 0x4d28 , 0x3964 , +0x0 , 0x4a45 , 0x3351 , 0x4b59 , +0x546c , 0x6552 , 0x376a , 0x0 , +0x0 , 0x0 , 0x654e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6555 , 0x347e , 0x6556 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6553 , 0x6554 , 0x0 , +0x525d , 0x0 , 0x0 , 0x425f , +0x3146 , 0x0 , 0x5362 , 0x0 , +0x0 , 0x365d , 0x4b6c , 0x0 , +0x6557 , 0x0 , 0x0 , 0x5376 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3169 , 0x0 , 0x3674 , +0x655a , 0x6558 , 0x6559 , 0x3540 , +0x0 , 0x0 , 0x0 , 0x5245 , +0x655c , 0x0 , 0x0 , 0x655e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x655d , 0x4732 , +0x0 , 0x5223 , 0x0 , 0x0 , +0x655b , 0x0 , 0x0 , 0x0 , +0x0 , 0x5462 , 0x555a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6560 , 0x5771 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6561 , 0x0 , 0x315c , +0x517b , 0x0 , 0x6562 , 0x6564 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6563 , 0x0 , 0x0 , 0x6565 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5258 , 0x0 , 0x354b , +0x0 , 0x675f , 0x0 , 0x5a75 , +0x0 , 0x5a78 , 0x0 , 0x5a76 , +0x0 , 0x5a77 , 0x0 , 0x0 , +0x0 , 0x5a7a , 0x504f , 0x4447 , +0x0 , 0x0 , 0x306e , 0x0 , +0x0 , 0x0 , 0x5030 , 0x0 , +0x5a79 , 0x0 , 0x534a , 0x3a2a , +0x5b22 , 0x4771 , 0x0 , 0x5a7c , +0x5a7b , 0x495b , 0x5a7d , 0x0 , +0x5b21 , 0x575e , 0x5a7e , 0x415a , +0x0 , 0x0 , 0x5b25 , 0x0 , +0x0 , 0x5374 , 0x0 , 0x0 , +0x5b27 , 0x5b24 , 0x0 , 0x5b28 , +0x0 , 0x0 , 0x3d3c , 0x0 , +0x0 , 0x0 , 0x4049 , 0x5b23 , +0x5b26 , 0x5623 , 0x0 , 0x5b29 , +0x0 , 0x0 , 0x0 , 0x5b2d , +0x0 , 0x0 , 0x0 , 0x5b2e , +0x5b2c , 0x3a42 , 0x0 , 0x0 , +0x0 , 0x3f24 , 0x5b2b , 0x0 , +0x0 , 0x0 , 0x5b2a , 0x5447 , +0x323f , 0x0 , 0x0 , 0x5b2f , +0x0 , 0x3979 , 0x0 , 0x5b30 , +0x0 , 0x0 , 0x0 , 0x0 , +0x333b , 0x0 , 0x0 , 0x0 , +0x3526 , 0x0 , 0x0 , 0x0 , +0x0 , 0x363c , 0x5b31 , 0x0 , +0x0 , 0x0 , 0x3675 , 0x0 , +0x5b32 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3149 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5b34 , 0x0 , +0x0 , 0x0 , 0x5b33 , 0x5b35 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5b37 , +0x0 , 0x5b36 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5b38 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5b39 , +0x0 , 0x0 , 0x5b3a , 0x0 , +0x0 , 0x534f , 0x747a , 0x4775 , +0x5743 , 0x4564 , 0x747c , 0x747d , +0x747b , 0x0 , 0x3e46 , 0x0 , +0x0 , 0x0 , 0x0 , 0x506f , +0x0 , 0x0 , 0x3753 , 0x0 , +0x0 , 0x544d , 0x4c2a , 0x0 , +0x0 , 0x7522 , 0x7521 , 0x3a28 , +0x747e , 0x4b56 , 0x0 , 0x0 , +0x0 , 0x7524 , 0x4052 , 0x0 , +0x336a , 0x0 , 0x4d2a , 0x7525 , +0x7523 , 0x3d34 , 0x7528 , 0x0 , +0x7529 , 0x3d4d , 0x4338 , 0x3f61 , +0x4b61 , 0x752a , 0x0 , 0x0 , +0x0 , 0x7526 , 0x7527 , 0x4470 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x752c , 0x0 , 0x343c , +0x0 , 0x576d , 0x0 , 0x3457 , +0x752b , 0x752e , 0x0 , 0x0 , +0x752d , 0x752f , 0x5051 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4351 , 0x4829 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7530 , 0x7531 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7532 , 0x0 , +0x0 , 0x7533 , 0x7534 , 0x7535 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7537 , 0x7536 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7538 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3249 , +0x0 , 0x5354 , 0x4a4d , 0x0 , +0x406f , 0x5658 , 0x5230 , 0x413f , +0x0 , 0x3d70 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x382a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3c78 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7646 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7647 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7648 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7649 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x764a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x764c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x764b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7769 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x764d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x764e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6e44 , 0x6e45 , 0x6e46 , +0x556b , 0x3624 , 0x6e48 , 0x6e47 , +0x6e49 , 0x6e4a , 0x4725 , 0x6e4b , +0x6e4c , 0x0 , 0x3730 , 0x3576 , +0x6e4d , 0x6e4f , 0x0 , 0x6e4e , +0x0 , 0x3846 , 0x6e50 , 0x6e51 , +0x6e52 , 0x365b , 0x332e , 0x5653 , +0x4446 , 0x3135 , 0x3856 , 0x6e53 , +0x6e54 , 0x543f , 0x4755 , 0x3e7b , +0x4e59 , 0x3933 , 0x6e56 , 0x6e55 , +0x6e58 , 0x6e57 , 0x4525 , 0x6e59 , +0x6e5a , 0x472e , 0x6e5b , 0x472f , +0x6e5c , 0x3227 , 0x6e5d , 0x6e5e , +0x6e5f , 0x6e60 , 0x6e61 , 0x576a , +0x6e62 , 0x6e63 , 0x3c58 , 0x6e64 , +0x534b , 0x4c7a , 0x322c , 0x4165 , +0x6e65 , 0x4726 , 0x432d , 0x0 , +0x6e66 , 0x6e67 , 0x6e68 , 0x6e69 , +0x6e6a , 0x6e6b , 0x6e6c , 0x0 , +0x6e6d , 0x6e6e , 0x6e6f , 0x0 , +0x0 , 0x6e70 , 0x6e71 , 0x6e72 , +0x6e74 , 0x6e73 , 0x0 , 0x6e75 , +0x4d2d , 0x4241 , 0x6e76 , 0x6e77 , +0x6e78 , 0x5521 , 0x6e79 , 0x4f33 , +0x6e7a , 0x6e7b , 0x0 , 0x6e7c , +0x6e7d , 0x6f21 , 0x6e7e , 0x6f22 , +0x3875 , 0x437a , 0x6f23 , 0x6f24 , +0x3d42 , 0x523f , 0x3279 , 0x6f25 , +0x6f26 , 0x6f27 , 0x5278 , 0x6f28 , +0x567d , 0x6f29 , 0x464c , 0x0 , +0x6f2a , 0x6f2b , 0x4134 , 0x6f2c , +0x4f7a , 0x4b78 , 0x6f2e , 0x6f2d , +0x337a , 0x3978 , 0x6f2f , 0x6f30 , +0x5062 , 0x6f31 , 0x6f32 , 0x3766 , +0x503f , 0x6f33 , 0x6f34 , 0x6f35 , +0x4871 , 0x4c60 , 0x6f36 , 0x6f37 , +0x6f38 , 0x6f39 , 0x6f3a , 0x5560 , +0x6f3b , 0x346d , 0x432a , 0x6f3c , +0x0 , 0x6f3d , 0x6f3e , 0x6f3f , +0x0 , 0x4e7d , 0x6f40 , 0x4260 , +0x3438 , 0x5736 , 0x3d75 , 0x0 , +0x4f47 , 0x6f43 , 0x6f41 , 0x6f42 , +0x6f44 , 0x3627 , 0x3c7c , 0x3e62 , +0x434c , 0x6f45 , 0x6f46 , 0x0 , +0x6f47 , 0x6f4f , 0x6f48 , 0x6f49 , +0x6f4a , 0x4742 , 0x6f71 , 0x364d , +0x6f4b , 0x0 , 0x6f4c , 0x6f4d , +0x3646 , 0x433e , 0x6f4e , 0x0 , +0x6f50 , 0x6f51 , 0x6f52 , 0x5572 , +0x0 , 0x6f53 , 0x4477 , 0x0 , +0x6f54 , 0x4478 , 0x6f55 , 0x6f56 , +0x3864 , 0x3077 , 0x6f57 , 0x6f58 , +0x6f59 , 0x0 , 0x6f5a , 0x6f5b , +0x6f5c , 0x6f5d , 0x0 , 0x6f5e , +0x3e35 , 0x6f61 , 0x6f5f , 0x6f60 , +0x0 , 0x6f62 , 0x6f63 , 0x414d , +0x6f64 , 0x6f65 , 0x6f66 , 0x6f67 , +0x6f68 , 0x6f69 , 0x6f6a , 0x6f6b , +0x6f6c , 0x4058 , 0x0 , 0x6f6d , +0x412d , 0x6f6e , 0x6f6f , 0x6f70 , +0x0 , 0x0 , 0x4f62 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3324 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4345 , 0x6345 , 0x4941 , 0x6346 , +0x0 , 0x3155 , 0x4e4a , 0x3433 , +0x4872 , 0x6347 , 0x4f50 , 0x6348 , +0x3c64 , 0x6349 , 0x634a , 0x4346 , +0x5522 , 0x4456 , 0x396b , 0x4e45 , +0x634b , 0x4376 , 0x634c , 0x0 , +0x3727 , 0x3873 , 0x3a52 , 0x634d , +0x634e , 0x5444 , 0x634f , 0x0 , +0x6350 , 0x514b , 0x6351 , 0x6352 , +0x6353 , 0x6354 , 0x5156 , 0x6355 , +0x327b , 0x403b , 0x6356 , 0x0 , +0x402b , 0x6357 , 0x6358 , 0x6359 , +0x0 , 0x635a , 0x635b , 0x0 , +0x3837 , 0x5a62 , 0x0 , 0x3653 , +0x0 , 0x5a64 , 0x5a63 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5a66 , 0x0 , +0x0 , 0x0 , 0x486e , 0x0 , +0x0 , 0x5a65 , 0x3740 , 0x5174 , +0x5275 , 0x5573 , 0x3d57 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5768 , +0x5a68 , 0x5a67 , 0x0 , 0x3022 , +0x4d53 , 0x0 , 0x5a69 , 0x0 , +0x383d , 0x3c4a , 0x423d , 0x4224 , +0x3342 , 0x5a6a , 0x0 , 0x422a , +0x4430 , 0x3d35 , 0x0 , 0x0 , +0x4f5e , 0x0 , 0x0 , 0x0 , +0x5a6b , 0x4942 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x315d , +0x0 , 0x0 , 0x0 , 0x5a6c , +0x0 , 0x3638 , 0x543a , 0x0 , +0x337d , 0x0 , 0x0 , 0x5a6d , +0x5449 , 0x4f55 , 0x4563 , 0x0 , +0x5a6e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x5a6f , 0x0 , +0x5a70 , 0x416a , 0x4c55 , 0x4f5d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5367 , 0x4221 , 0x0 , +0x5a71 , 0x0 , 0x0 , 0x4b65 , +0x0 , 0x5a72 , 0x0 , 0x4b66 , +0x527e , 0x0 , 0x0 , 0x0 , +0x3874 , 0x0 , 0x0 , 0x5a73 , +0x302f , 0x4f36 , 0x0 , 0x0 , +0x554f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4b6d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5a74 , 0x0 , 0x0 , 0x6344 , +0x0 , 0x0 , 0x4125 , 0x0 , +0x0 , 0x763f , 0x0 , 0x0 , +0x7640 , 0x7641 , 0x4451 , 0x0 , +0x4838 , 0x5163 , 0x0 , 0x0 , +0x505b , 0x5145 , 0x3c2f , 0x394d , +0x0 , 0x6f74 , 0x0 , 0x0 , +0x3446 , 0x533a , 0x7642 , 0x337b , +0x0 , 0x0 , 0x7643 , 0x0 , +0x0 , 0x3571 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7645 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x536a , 0x7627 , 0x5129 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7629 , +0x0 , 0x0 , 0x0 , 0x7628 , +0x0 , 0x0 , 0x4163 , 0x4057 , +0x0 , 0x3122 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4e6d , 0x0 , +0x5068 , 0x762b , 0x0 , 0x0 , +0x4f76 , 0x0 , 0x762a , 0x5570 , +0x762c , 0x4339 , 0x0 , 0x0 , +0x0 , 0x3b74 , 0x762e , 0x762d , +0x0 , 0x0 , 0x0 , 0x445e , +0x0 , 0x0 , 0x4158 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4b2a , 0x0 , 0x4f3c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x762f , 0x0 , +0x0 , 0x7630 , 0x0 , 0x0 , +0x7631 , 0x0 , 0x4236 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3054 , 0x4579 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7632 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4760 , 0x7626 , +0x0 , 0x0 , 0x3e38 , 0x0 , +0x0 , 0x3e32 , 0x0 , 0x3565 , +0x0 , 0x0 , 0x3747 , 0x0 , +0x3f3f , 0x4352 , 0x4366 , 0x0 , +0x0 , 0x584c , 0x0 , 0x0 , +0x0 , 0x386f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3d79 , +0x5125 , 0x0 , 0x3050 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7730 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7731 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x502c , +0x0 , 0x3030 , 0x0 , 0x0 , +0x0 , 0x7732 , 0x7733 , 0x0 , +0x7734 , 0x0 , 0x0 , 0x0 , +0x474a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3e4f , 0x0 , 0x0 , 0x7737 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7736 , +0x0 , 0x315e , 0x0 , 0x7735 , +0x0 , 0x0 , 0x7738 , 0x0 , +0x7739 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4e24 , 0x484d , +0x0 , 0x3a2b , 0x6838 , 0x6839 , +0x683a , 0x3e42 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5274 , +0x0 , 0x544f , 0x4958 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5233 , 0x3625 , 0x476a , +0x717c , 0x4f6e , 0x4b33 , 0x506b , +0x676f , 0x4d67 , 0x394b , 0x3659 , +0x717d , 0x3064 , 0x4b4c , 0x717e , +0x5424 , 0x422d , 0x416c , 0x4644 , +0x3e31 , 0x7221 , 0x3c55 , 0x0 , +0x7222 , 0x7223 , 0x0 , 0x7224 , +0x5243 , 0x4635 , 0x0 , 0x4d47 , +0x7225 , 0x0 , 0x5331 , 0x3f45 , +0x4c62 , 0x0 , 0x7226 , 0x7227 , +0x5155 , 0x366e , 0x7228 , 0x7229 , +0x355f , 0x722a , 0x722b , 0x0 , +0x327c , 0x722c , 0x722d , 0x4827 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x3767 , 0x0 , +0x0 , 0x6c29 , 0x6c2a , 0x6c2b , +0x0 , 0x6c2c , 0x0 , 0x0 , +0x462e , 0x6c2d , 0x6c2e , 0x0 , +0x0 , 0x0 , 0x3749 , 0x4a33 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6238 , +0x774f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7750 , 0x0 , 0x0 , +0x324d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7751 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7753 , 0x7752 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x623b , +0x0 , 0x3c22 , 0x0 , 0x623c , +0x623d , 0x623e , 0x623f , 0x6240 , +0x6241 , 0x3739 , 0x527b , 0x3d24 , +0x4a4e , 0x3125 , 0x4b47 , 0x0 , +0x6242 , 0x367c , 0x4844 , 0x6243 , +0x0 , 0x0 , 0x3d48 , 0x0 , +0x317d , 0x6244 , 0x0 , 0x3676 , +0x6245 , 0x4459 , 0x0 , 0x0 , +0x6246 , 0x4f5a , 0x395d , 0x6247 , +0x4021 , 0x0 , 0x6248 , 0x3276 , +0x0 , 0x6249 , 0x0 , 0x4173 , +0x624a , 0x624b , 0x4278 , 0x624c , +0x624d , 0x624e , 0x4a57 , 0x5838 , +0x5965 , 0x4f63 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7025 , 0x0 , 0x0 , +0x5c30 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x426d , 0x5426 , 0x4d54 , 0x5131 , +0x335b , 0x477d , 0x0 , 0x3235 , +0x423f , 0x6660 , 0x4a3b , 0x6661 , +0x6662 , 0x3e54 , 0x6663 , 0x5724 , +0x4d55 , 0x6665 , 0x3c5d , 0x6664 , +0x6666 , 0x6667 , 0x426e , 0x0 , +0x3d3e , 0x6668 , 0x4266 , 0x3a27 , +0x6669 , 0x0 , 0x666a , 0x3352 , +0x5169 , 0x0 , 0x0 , 0x3f25 , +0x666b , 0x466f , 0x666c , 0x666d , +0x0 , 0x0 , 0x666e , 0x462d , +0x666f , 0x0 , 0x4927 , 0x6670 , +0x6671 , 0x6672 , 0x6539 , 0x6673 , +0x6674 , 0x4262 , 0x6675 , 0x6676 , +0x5668 , 0x6677 , 0x0 , 0x6678 , +0x3947 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x773b , 0x773a , 0x0 , 0x0 , +0x0 , 0x0 , 0x773e , 0x773c , +0x3a21 , 0x0 , 0x773f , 0x0 , +0x7740 , 0x0 , 0x0 , 0x0 , +0x7742 , 0x7741 , 0x7744 , 0x0 , +0x0 , 0x7743 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7745 , +0x7746 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7747 , 0x0 , 0x4b68 , +0x0 , 0x0 , 0x0 , 0x0 , +0x385f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7754 , +0x0 , 0x7755 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7756 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7758 , +0x0 , 0x775a , 0x0 , 0x7757 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x775b , 0x0 , 0x7759 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5757 , +0x0 , 0x0 , 0x0 , 0x0 , +0x775c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x775d , +0x0 , 0x0 , 0x0 , 0x775e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x775f , +0x0 , 0x0 , 0x0 , 0x7760 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5b4b , +0x0 , 0x0 , 0x582a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x6577 , +0x396d , 0x0 , 0x0 , 0x0 , +0x0 , 0x3f7d , 0x3b6a , 0x7749 , +0x4647 , 0x7748 , 0x0 , 0x774a , +0x774c , 0x774b , 0x0 , 0x0 , +0x0 , 0x774d , 0x0 , 0x4e3a , +0x0 , 0x774e , 0x0 , 0x0 , +0x4427 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5363 , 0x0 , 0x0 , 0x764f , +0x0 , 0x4233 , 0x7650 , 0x0 , +0x0 , 0x7651 , 0x7652 , 0x7653 , +0x7654 , 0x0 , 0x0 , 0x7656 , +0x0 , 0x312b , 0x7657 , 0x0 , +0x7658 , 0x7659 , 0x765a , 0x0 , +0x765b , 0x765c , 0x0 , 0x0 , +0x0 , 0x0 , 0x765d , 0x765e , +0x4f4a , 0x0 , 0x765f , 0x7660 , +0x7661 , 0x7662 , 0x7663 , 0x7664 , +0x4070 , 0x7665 , 0x7666 , 0x7667 , +0x7668 , 0x7669 , 0x0 , 0x766a , +0x0 , 0x766b , 0x766c , 0x0 , +0x766d , 0x766e , 0x766f , 0x7670 , +0x7671 , 0x7672 , 0x7673 , 0x7674 , +0x3e28 , 0x0 , 0x7675 , 0x7676 , +0x7677 , 0x7678 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x487a , +0x7679 , 0x767a , 0x767b , 0x767c , +0x0 , 0x0 , 0x767d , 0x767e , +0x7721 , 0x7722 , 0x7723 , 0x7724 , +0x7725 , 0x0 , 0x0 , 0x7726 , +0x7727 , 0x7728 , 0x316e , 0x7729 , +0x772a , 0x772b , 0x0 , 0x0 , +0x772c , 0x772d , 0x415b , 0x772e , +0x0 , 0x0 , 0x772f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4471 , +0x702f , 0x3c26 , 0x7030 , 0x4379 , +0x0 , 0x4538 , 0x513b , 0x0 , +0x7031 , 0x7032 , 0x7033 , 0x7034 , +0x7035 , 0x513c , 0x0 , 0x516c , +0x0 , 0x7037 , 0x7036 , 0x5427 , +0x0 , 0x4d52 , 0x7038 , 0x703a , +0x7039 , 0x703b , 0x703c , 0x0 , +0x0 , 0x386b , 0x703d , 0x3a68 , +0x0 , 0x703e , 0x703f , 0x3e69 , +0x7040 , 0x366c , 0x7041 , 0x7042 , +0x7043 , 0x7044 , 0x4835 , 0x7045 , +0x7046 , 0x0 , 0x7047 , 0x4574 , +0x0 , 0x7048 , 0x0 , 0x0 , +0x0 , 0x7049 , 0x0 , 0x704a , +0x773d , 0x0 , 0x704b , 0x704c , +0x704d , 0x0 , 0x704e , 0x0 , +0x0 , 0x0 , 0x0 , 0x704f , +0x3a57 , 0x0 , 0x7050 , 0x7051 , +0x7052 , 0x7053 , 0x7054 , 0x7055 , +0x7056 , 0x7058 , 0x0 , 0x0 , +0x5325 , 0x7057 , 0x0 , 0x7059 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x753a , 0x4239 , +0x0 , 0x0 , 0x7764 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7765 , +0x7766 , 0x0 , 0x0 , 0x7767 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x7768 , 0x4234 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x776a , 0x0 , 0x776b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x4273 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7470 , 0x0 , 0x0 , 0x0 , +0x746f , 0x0 , 0x0 , 0x4269 , +0x0 , 0x7761 , 0x7762 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3b46 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5964 , 0x0 , 0x0 , +0x0 , 0x4a72 , 0x4068 , 0x7024 , +0x0 , 0x3a5a , 0x0 , 0x0 , +0x472d , 0x0 , 0x0 , 0x0 , +0x442c , 0x0 , 0x0 , 0x776c , +0x776d , 0x776e , 0x0 , 0x7770 , +0x776f , 0x0 , 0x7771 , 0x0 , +0x0 , 0x7774 , 0x0 , 0x7773 , +0x0 , 0x7772 , 0x7775 , 0x0 , +0x0 , 0x0 , 0x0 , 0x7776 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d69 , 0x0 , 0x6d6a , +0x6d6b , 0x0 , 0x763c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x763d , +0x0 , 0x763e , 0x3626 , 0x0 , +0x583e , 0x0 , 0x0 , 0x3944 , +0x0 , 0x0 , 0x0 , 0x583b , +0x0 , 0x5c31 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x4a73 , 0x0 , 0x7777 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7778 , 0x0 , 0x0 , 0x7779 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x777b , +0x0 , 0x777a , 0x0 , 0x3147 , +0x0 , 0x777c , 0x777d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x777e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x466b , 0x6c34 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x335d , +0x7633 , 0x0 , 0x0 , 0x7634 , +0x4164 , 0x7635 , 0x7636 , 0x7637 , +0x7638 , 0x7639 , 0x763a , 0x4823 , +0x763b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x417a , 0x3928 , 0x6d68 , +0x0 , 0x0 , 0x0 , 0x396a , +0x595f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2321 , 0x2322 , 0x2323 , +0x2167 , 0x2325 , 0x2326 , 0x2327 , +0x2328 , 0x2329 , 0x232a , 0x232b , +0x232c , 0x232d , 0x232e , 0x232f , +0x2330 , 0x2331 , 0x2332 , 0x2333 , +0x2334 , 0x2335 , 0x2336 , 0x2337 , +0x2338 , 0x2339 , 0x233a , 0x233b , +0x233c , 0x233d , 0x233e , 0x233f , +0x2340 , 0x2341 , 0x2342 , 0x2343 , +0x2344 , 0x2345 , 0x2346 , 0x2347 , +0x2348 , 0x2349 , 0x234a , 0x234b , +0x234c , 0x234d , 0x234e , 0x234f , +0x2350 , 0x2351 , 0x2352 , 0x2353 , +0x2354 , 0x2355 , 0x2356 , 0x2357 , +0x2358 , 0x2359 , 0x235a , 0x235b , +0x235c , 0x235d , 0x235e , 0x235f , +0x2360 , 0x2361 , 0x2362 , 0x2363 , +0x2364 , 0x2365 , 0x2366 , 0x2367 , +0x2368 , 0x2369 , 0x236a , 0x236b , +0x236c , 0x236d , 0x236e , 0x236f , +0x2370 , 0x2371 , 0x2372 , 0x2373 , +0x2374 , 0x2375 , 0x2376 , 0x2377 , +0x2378 , 0x2379 , 0x237a , 0x237b , +0x237c , 0x237d , 0x212b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2169 , 0x216a , 0x0 , 0x237e , +0x0 , 0x2324 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +} ; +static char16 gbuni [65536] = { +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3000 , 0x3001 , 0x3002 , +0x30fb , 0x2c9 , 0x2c7 , 0xa8 , +0x3003 , 0x3005 , 0x2015 , 0xff5e , +0x2225 , 0x2026 , 0x2018 , 0x2019 , +0x201c , 0x201d , 0x3014 , 0x3015 , +0x3008 , 0x3009 , 0x300a , 0x300b , +0x300c , 0x300d , 0x300e , 0x300f , +0x3016 , 0x3017 , 0x3010 , 0x3011 , +0xb1 , 0xd7 , 0xf7 , 0x2236 , +0x2227 , 0x2228 , 0x2211 , 0x220f , +0x222a , 0x2229 , 0x2208 , 0x2237 , +0x221a , 0x22a5 , 0x2225 , 0x2220 , +0x2312 , 0x2299 , 0x222b , 0x222e , +0x2261 , 0x224c , 0x2248 , 0x223d , +0x221d , 0x2260 , 0x226e , 0x226f , +0x2264 , 0x2265 , 0x221e , 0x2235 , +0x2234 , 0x2642 , 0x2640 , 0xb0 , +0x2032 , 0x2033 , 0x2103 , 0xff04 , +0xa4 , 0xffe0 , 0xffe1 , 0x2030 , +0xa7 , 0x2116 , 0x2606 , 0x2605 , +0x25cb , 0x25cf , 0x25ce , 0x25c7 , +0x25c6 , 0x25a1 , 0x25a0 , 0x25b3 , +0x25b2 , 0x203b , 0x2192 , 0x2190 , +0x2191 , 0x2193 , 0x3013 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x2488 , 0x2489 , 0x248a , +0x248b , 0x248c , 0x248d , 0x248e , +0x248f , 0x2490 , 0x2491 , 0x2492 , +0x2493 , 0x2494 , 0x2495 , 0x2496 , +0x2497 , 0x2498 , 0x2499 , 0x249a , +0x249b , 0x2474 , 0x2475 , 0x2476 , +0x2477 , 0x2478 , 0x2479 , 0x247a , +0x247b , 0x247c , 0x247d , 0x247e , +0x247f , 0x2480 , 0x2481 , 0x2482 , +0x2483 , 0x2484 , 0x2485 , 0x2486 , +0x2487 , 0x2460 , 0x2461 , 0x2462 , +0x2463 , 0x2464 , 0x2465 , 0x2466 , +0x2467 , 0x2468 , 0x2469 , 0x0 , +0x0 , 0x3220 , 0x3221 , 0x3222 , +0x3223 , 0x3224 , 0x3225 , 0x3226 , +0x3227 , 0x3228 , 0x3229 , 0x0 , +0x0 , 0x2160 , 0x2161 , 0x2162 , +0x2163 , 0x2164 , 0x2165 , 0x2166 , +0x2167 , 0x2168 , 0x2169 , 0x216a , +0x216b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xff01 , 0xff02 , 0xff03 , +0xffe5 , 0xff05 , 0xff06 , 0xff07 , +0xff08 , 0xff09 , 0xff0a , 0xff0b , +0xff0c , 0xff0d , 0xff0e , 0xff0f , +0xff10 , 0xff11 , 0xff12 , 0xff13 , +0xff14 , 0xff15 , 0xff16 , 0xff17 , +0xff18 , 0xff19 , 0xff1a , 0xff1b , +0xff1c , 0xff1d , 0xff1e , 0xff1f , +0xff20 , 0xff21 , 0xff22 , 0xff23 , +0xff24 , 0xff25 , 0xff26 , 0xff27 , +0xff28 , 0xff29 , 0xff2a , 0xff2b , +0xff2c , 0xff2d , 0xff2e , 0xff2f , +0xff30 , 0xff31 , 0xff32 , 0xff33 , +0xff34 , 0xff35 , 0xff36 , 0xff37 , +0xff38 , 0xff39 , 0xff3a , 0xff3b , +0xff3c , 0xff3d , 0xff3e , 0xff3f , +0xff40 , 0xff41 , 0xff42 , 0xff43 , +0xff44 , 0xff45 , 0xff46 , 0xff47 , +0xff48 , 0xff49 , 0xff4a , 0xff4b , +0xff4c , 0xff4d , 0xff4e , 0xff4f , +0xff50 , 0xff51 , 0xff52 , 0xff53 , +0xff54 , 0xff55 , 0xff56 , 0xff57 , +0xff58 , 0xff59 , 0xff5a , 0xff5b , +0xff5c , 0xff5d , 0xffe3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3041 , 0x3042 , 0x3043 , +0x3044 , 0x3045 , 0x3046 , 0x3047 , +0x3048 , 0x3049 , 0x304a , 0x304b , +0x304c , 0x304d , 0x304e , 0x304f , +0x3050 , 0x3051 , 0x3052 , 0x3053 , +0x3054 , 0x3055 , 0x3056 , 0x3057 , +0x3058 , 0x3059 , 0x305a , 0x305b , +0x305c , 0x305d , 0x305e , 0x305f , +0x3060 , 0x3061 , 0x3062 , 0x3063 , +0x3064 , 0x3065 , 0x3066 , 0x3067 , +0x3068 , 0x3069 , 0x306a , 0x306b , +0x306c , 0x306d , 0x306e , 0x306f , +0x3070 , 0x3071 , 0x3072 , 0x3073 , +0x3074 , 0x3075 , 0x3076 , 0x3077 , +0x3078 , 0x3079 , 0x307a , 0x307b , +0x307c , 0x307d , 0x307e , 0x307f , +0x3080 , 0x3081 , 0x3082 , 0x3083 , +0x3084 , 0x3085 , 0x3086 , 0x3087 , +0x3088 , 0x3089 , 0x308a , 0x308b , +0x308c , 0x308d , 0x308e , 0x308f , +0x3090 , 0x3091 , 0x3092 , 0x3093 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x30a1 , 0x30a2 , 0x30a3 , +0x30a4 , 0x30a5 , 0x30a6 , 0x30a7 , +0x30a8 , 0x30a9 , 0x30aa , 0x30ab , +0x30ac , 0x30ad , 0x30ae , 0x30af , +0x30b0 , 0x30b1 , 0x30b2 , 0x30b3 , +0x30b4 , 0x30b5 , 0x30b6 , 0x30b7 , +0x30b8 , 0x30b9 , 0x30ba , 0x30bb , +0x30bc , 0x30bd , 0x30be , 0x30bf , +0x30c0 , 0x30c1 , 0x30c2 , 0x30c3 , +0x30c4 , 0x30c5 , 0x30c6 , 0x30c7 , +0x30c8 , 0x30c9 , 0x30ca , 0x30cb , +0x30cc , 0x30cd , 0x30ce , 0x30cf , +0x30d0 , 0x30d1 , 0x30d2 , 0x30d3 , +0x30d4 , 0x30d5 , 0x30d6 , 0x30d7 , +0x30d8 , 0x30d9 , 0x30da , 0x30db , +0x30dc , 0x30dd , 0x30de , 0x30df , +0x30e0 , 0x30e1 , 0x30e2 , 0x30e3 , +0x30e4 , 0x30e5 , 0x30e6 , 0x30e7 , +0x30e8 , 0x30e9 , 0x30ea , 0x30eb , +0x30ec , 0x30ed , 0x30ee , 0x30ef , +0x30f0 , 0x30f1 , 0x30f2 , 0x30f3 , +0x30f4 , 0x30f5 , 0x30f6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x391 , 0x392 , 0x393 , +0x394 , 0x395 , 0x396 , 0x397 , +0x398 , 0x399 , 0x39a , 0x39b , +0x39c , 0x39d , 0x39e , 0x39f , +0x3a0 , 0x3a1 , 0x3a3 , 0x3a4 , +0x3a5 , 0x3a6 , 0x3a7 , 0x3a8 , +0x3a9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3b1 , 0x3b2 , 0x3b3 , +0x3b4 , 0x3b5 , 0x3b6 , 0x3b7 , +0x3b8 , 0x3b9 , 0x3ba , 0x3bb , +0x3bc , 0x3bd , 0x3be , 0x3bf , +0x3c0 , 0x3c1 , 0x3c3 , 0x3c4 , +0x3c5 , 0x3c6 , 0x3c7 , 0x3c8 , +0x3c9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x410 , 0x411 , 0x412 , +0x413 , 0x414 , 0x415 , 0x401 , +0x416 , 0x417 , 0x418 , 0x419 , +0x41a , 0x41b , 0x41c , 0x41d , +0x41e , 0x41f , 0x420 , 0x421 , +0x422 , 0x423 , 0x424 , 0x425 , +0x426 , 0x427 , 0x428 , 0x429 , +0x42a , 0x42b , 0x42c , 0x42d , +0x42e , 0x42f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x430 , 0x431 , 0x432 , +0x433 , 0x434 , 0x435 , 0x451 , +0x436 , 0x437 , 0x438 , 0x439 , +0x43a , 0x43b , 0x43c , 0x43d , +0x43e , 0x43f , 0x440 , 0x441 , +0x442 , 0x443 , 0x444 , 0x445 , +0x446 , 0x447 , 0x448 , 0x449 , +0x44a , 0x44b , 0x44c , 0x44d , +0x44e , 0x44f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x101 , 0xe1 , 0x1ce , +0xe0 , 0x113 , 0xe9 , 0x11b , +0xe8 , 0x12b , 0xed , 0x1d0 , +0xec , 0x14d , 0xf3 , 0x1d2 , +0xf2 , 0x16b , 0xfa , 0x1d4 , +0xf9 , 0x1d6 , 0x1d8 , 0x1da , +0x1dc , 0xfc , 0xea , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x3105 , 0x3106 , 0x3107 , +0x3108 , 0x3109 , 0x310a , 0x310b , +0x310c , 0x310d , 0x310e , 0x310f , +0x3110 , 0x3111 , 0x3112 , 0x3113 , +0x3114 , 0x3115 , 0x3116 , 0x3117 , +0x3118 , 0x3119 , 0x311a , 0x311b , +0x311c , 0x311d , 0x311e , 0x311f , +0x3120 , 0x3121 , 0x3122 , 0x3123 , +0x3124 , 0x3125 , 0x3126 , 0x3127 , +0x3128 , 0x3129 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2500 , 0x2501 , 0x2502 , 0x2503 , +0x2504 , 0x2505 , 0x2506 , 0x2507 , +0x2508 , 0x2509 , 0x250a , 0x250b , +0x250c , 0x250d , 0x250e , 0x250f , +0x2510 , 0x2511 , 0x2512 , 0x2513 , +0x2514 , 0x2515 , 0x2516 , 0x2517 , +0x2518 , 0x2519 , 0x251a , 0x251b , +0x251c , 0x251d , 0x251e , 0x251f , +0x2520 , 0x2521 , 0x2522 , 0x2523 , +0x2524 , 0x2525 , 0x2526 , 0x2527 , +0x2528 , 0x2529 , 0x252a , 0x252b , +0x252c , 0x252d , 0x252e , 0x252f , +0x2530 , 0x2531 , 0x2532 , 0x2533 , +0x2534 , 0x2535 , 0x2536 , 0x2537 , +0x2538 , 0x2539 , 0x253a , 0x253b , +0x253c , 0x253d , 0x253e , 0x253f , +0x2540 , 0x2541 , 0x2542 , 0x2543 , +0x2544 , 0x2545 , 0x2546 , 0x2547 , +0x2548 , 0x2549 , 0x254a , 0x254b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x554a , 0x963f , 0x57c3 , +0x6328 , 0x54ce , 0x5509 , 0x54c0 , +0x7691 , 0x764c , 0x853c , 0x77ee , +0x827e , 0x788d , 0x7231 , 0x9698 , +0x978d , 0x6c28 , 0x5b89 , 0x4ffa , +0x6309 , 0x6697 , 0x5cb8 , 0x80fa , +0x6848 , 0x80ae , 0x6602 , 0x76ce , +0x51f9 , 0x6556 , 0x71ac , 0x7ff1 , +0x8884 , 0x50b2 , 0x5965 , 0x61ca , +0x6fb3 , 0x82ad , 0x634c , 0x6252 , +0x53ed , 0x5427 , 0x7b06 , 0x516b , +0x75a4 , 0x5df4 , 0x62d4 , 0x8dcb , +0x9776 , 0x628a , 0x8019 , 0x575d , +0x9738 , 0x7f62 , 0x7238 , 0x767d , +0x67cf , 0x767e , 0x6446 , 0x4f70 , +0x8d25 , 0x62dc , 0x7a17 , 0x6591 , +0x73ed , 0x642c , 0x6273 , 0x822c , +0x9881 , 0x677f , 0x7248 , 0x626e , +0x62cc , 0x4f34 , 0x74e3 , 0x534a , +0x529e , 0x7eca , 0x90a6 , 0x5e2e , +0x6886 , 0x699c , 0x8180 , 0x7ed1 , +0x68d2 , 0x78c5 , 0x868c , 0x9551 , +0x508d , 0x8c24 , 0x82de , 0x80de , +0x5305 , 0x8912 , 0x5265 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8584 , 0x96f9 , 0x4fdd , +0x5821 , 0x9971 , 0x5b9d , 0x62b1 , +0x62a5 , 0x66b4 , 0x8c79 , 0x9c8d , +0x7206 , 0x676f , 0x7891 , 0x60b2 , +0x5351 , 0x5317 , 0x8f88 , 0x80cc , +0x8d1d , 0x94a1 , 0x500d , 0x72c8 , +0x5907 , 0x60eb , 0x7119 , 0x88ab , +0x5954 , 0x82ef , 0x672c , 0x7b28 , +0x5d29 , 0x7ef7 , 0x752d , 0x6cf5 , +0x8e66 , 0x8ff8 , 0x903c , 0x9f3b , +0x6bd4 , 0x9119 , 0x7b14 , 0x5f7c , +0x78a7 , 0x84d6 , 0x853d , 0x6bd5 , +0x6bd9 , 0x6bd6 , 0x5e01 , 0x5e87 , +0x75f9 , 0x95ed , 0x655d , 0x5f0a , +0x5fc5 , 0x8f9f , 0x58c1 , 0x81c2 , +0x907f , 0x965b , 0x97ad , 0x8fb9 , +0x7f16 , 0x8d2c , 0x6241 , 0x4fbf , +0x53d8 , 0x535e , 0x8fa8 , 0x8fa9 , +0x8fab , 0x904d , 0x6807 , 0x5f6a , +0x8198 , 0x8868 , 0x9cd6 , 0x618b , +0x522b , 0x762a , 0x5f6c , 0x658c , +0x6fd2 , 0x6ee8 , 0x5bbe , 0x6448 , +0x5175 , 0x51b0 , 0x67c4 , 0x4e19 , +0x79c9 , 0x997c , 0x70b3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x75c5 , 0x5e76 , 0x73bb , +0x83e0 , 0x64ad , 0x62e8 , 0x94b5 , +0x6ce2 , 0x535a , 0x52c3 , 0x640f , +0x94c2 , 0x7b94 , 0x4f2f , 0x5e1b , +0x8236 , 0x8116 , 0x818a , 0x6e24 , +0x6cca , 0x9a73 , 0x6355 , 0x535c , +0x54fa , 0x8865 , 0x57e0 , 0x4e0d , +0x5e03 , 0x6b65 , 0x7c3f , 0x90e8 , +0x6016 , 0x64e6 , 0x731c , 0x88c1 , +0x6750 , 0x624d , 0x8d22 , 0x776c , +0x8e29 , 0x91c7 , 0x5f69 , 0x83dc , +0x8521 , 0x9910 , 0x53c2 , 0x8695 , +0x6b8b , 0x60ed , 0x60e8 , 0x707f , +0x82cd , 0x8231 , 0x4ed3 , 0x6ca7 , +0x85cf , 0x64cd , 0x7cd9 , 0x69fd , +0x66f9 , 0x8349 , 0x5395 , 0x7b56 , +0x4fa7 , 0x518c , 0x6d4b , 0x5c42 , +0x8e6d , 0x63d2 , 0x53c9 , 0x832c , +0x8336 , 0x67e5 , 0x78b4 , 0x643d , +0x5bdf , 0x5c94 , 0x5dee , 0x8be7 , +0x62c6 , 0x67f4 , 0x8c7a , 0x6400 , +0x63ba , 0x8749 , 0x998b , 0x8c17 , +0x7f20 , 0x94f2 , 0x4ea7 , 0x9610 , +0x98a4 , 0x660c , 0x7316 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x573a , 0x5c1d , 0x5e38 , +0x957f , 0x507f , 0x80a0 , 0x5382 , +0x655e , 0x7545 , 0x5531 , 0x5021 , +0x8d85 , 0x6284 , 0x949e , 0x671d , +0x5632 , 0x6f6e , 0x5de2 , 0x5435 , +0x7092 , 0x8f66 , 0x626f , 0x64a4 , +0x63a3 , 0x5f7b , 0x6f88 , 0x90f4 , +0x81e3 , 0x8fb0 , 0x5c18 , 0x6668 , +0x5ff1 , 0x6c89 , 0x9648 , 0x8d81 , +0x886c , 0x6491 , 0x79f0 , 0x57ce , +0x6a59 , 0x6210 , 0x5448 , 0x4e58 , +0x7a0b , 0x60e9 , 0x6f84 , 0x8bda , +0x627f , 0x901e , 0x9a8b , 0x79e4 , +0x5403 , 0x75f4 , 0x6301 , 0x5319 , +0x6c60 , 0x8fdf , 0x5f1b , 0x9a70 , +0x803b , 0x9f7f , 0x4f88 , 0x5c3a , +0x8d64 , 0x7fc5 , 0x65a5 , 0x70bd , +0x5145 , 0x51b2 , 0x866b , 0x5d07 , +0x5ba0 , 0x62bd , 0x916c , 0x7574 , +0x8e0c , 0x7a20 , 0x6101 , 0x7b79 , +0x4ec7 , 0x7ef8 , 0x7785 , 0x4e11 , +0x81ed , 0x521d , 0x51fa , 0x6a71 , +0x53a8 , 0x8e87 , 0x9504 , 0x96cf , +0x6ec1 , 0x9664 , 0x695a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7840 , 0x50a8 , 0x77d7 , +0x6410 , 0x89e6 , 0x5904 , 0x63e3 , +0x5ddd , 0x7a7f , 0x693d , 0x4f20 , +0x8239 , 0x5598 , 0x4e32 , 0x75ae , +0x7a97 , 0x5e62 , 0x5e8a , 0x95ef , +0x521b , 0x5439 , 0x708a , 0x6376 , +0x9524 , 0x5782 , 0x6625 , 0x693f , +0x9187 , 0x5507 , 0x6df3 , 0x7eaf , +0x8822 , 0x6233 , 0x7ef0 , 0x75b5 , +0x8328 , 0x78c1 , 0x96cc , 0x8f9e , +0x6148 , 0x74f7 , 0x8bcd , 0x6b64 , +0x523a , 0x8d50 , 0x6b21 , 0x806a , +0x8471 , 0x56f1 , 0x5306 , 0x4ece , +0x4e1b , 0x51d1 , 0x7c97 , 0x918b , +0x7c07 , 0x4fc3 , 0x8e7f , 0x7be1 , +0x7a9c , 0x6467 , 0x5d14 , 0x50ac , +0x8106 , 0x7601 , 0x7cb9 , 0x6dec , +0x7fe0 , 0x6751 , 0x5b58 , 0x5bf8 , +0x78cb , 0x64ae , 0x6413 , 0x63aa , +0x632b , 0x9519 , 0x642d , 0x8fbe , +0x7b54 , 0x7629 , 0x6253 , 0x5927 , +0x5446 , 0x6b79 , 0x50a3 , 0x6234 , +0x5e26 , 0x6b86 , 0x4ee3 , 0x8d37 , +0x888b , 0x5f85 , 0x902e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6020 , 0x803d , 0x62c5 , +0x4e39 , 0x5355 , 0x90f8 , 0x63b8 , +0x80c6 , 0x65e6 , 0x6c2e , 0x4f46 , +0x60ee , 0x6de1 , 0x8bde , 0x5f39 , +0x86cb , 0x5f53 , 0x6321 , 0x515a , +0x8361 , 0x6863 , 0x5200 , 0x6363 , +0x8e48 , 0x5012 , 0x5c9b , 0x7977 , +0x5bfc , 0x5230 , 0x7a3b , 0x60bc , +0x9053 , 0x76d7 , 0x5fb7 , 0x5f97 , +0x7684 , 0x8e6c , 0x706f , 0x767b , +0x7b49 , 0x77aa , 0x51f3 , 0x9093 , +0x5824 , 0x4f4e , 0x6ef4 , 0x8fea , +0x654c , 0x7b1b , 0x72c4 , 0x6da4 , +0x7fdf , 0x5ae1 , 0x62b5 , 0x5e95 , +0x5730 , 0x8482 , 0x7b2c , 0x5e1d , +0x5f1f , 0x9012 , 0x7f14 , 0x98a0 , +0x6382 , 0x6ec7 , 0x7898 , 0x70b9 , +0x5178 , 0x975b , 0x57ab , 0x7535 , +0x4f43 , 0x7538 , 0x5e97 , 0x60e6 , +0x5960 , 0x6dc0 , 0x6bbf , 0x7889 , +0x53fc , 0x96d5 , 0x51cb , 0x5201 , +0x6389 , 0x540a , 0x9493 , 0x8c03 , +0x8dcc , 0x7239 , 0x789f , 0x8776 , +0x8fed , 0x8c0d , 0x53e0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4e01 , 0x76ef , 0x53ee , +0x9489 , 0x9876 , 0x9f0e , 0x952d , +0x5b9a , 0x8ba2 , 0x4e22 , 0x4e1c , +0x51ac , 0x8463 , 0x61c2 , 0x52a8 , +0x680b , 0x4f97 , 0x606b , 0x51bb , +0x6d1e , 0x515c , 0x6296 , 0x6597 , +0x9661 , 0x8c46 , 0x9017 , 0x75d8 , +0x90fd , 0x7763 , 0x6bd2 , 0x728a , +0x72ec , 0x8bfb , 0x5835 , 0x7779 , +0x8d4c , 0x675c , 0x9540 , 0x809a , +0x5ea6 , 0x6e21 , 0x5992 , 0x7aef , +0x77ed , 0x953b , 0x6bb5 , 0x65ad , +0x7f0e , 0x5806 , 0x5151 , 0x961f , +0x5bf9 , 0x58a9 , 0x5428 , 0x8e72 , +0x6566 , 0x987f , 0x56e4 , 0x949d , +0x76fe , 0x9041 , 0x6387 , 0x54c6 , +0x591a , 0x593a , 0x579b , 0x8eb2 , +0x6735 , 0x8dfa , 0x8235 , 0x5241 , +0x60f0 , 0x5815 , 0x86fe , 0x5ce8 , +0x9e45 , 0x4fc4 , 0x989d , 0x8bb9 , +0x5a25 , 0x6076 , 0x5384 , 0x627c , +0x904f , 0x9102 , 0x997f , 0x6069 , +0x800c , 0x513f , 0x8033 , 0x5c14 , +0x9975 , 0x6d31 , 0x4e8c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8d30 , 0x53d1 , 0x7f5a , +0x7b4f , 0x4f10 , 0x4e4f , 0x9600 , +0x6cd5 , 0x73d0 , 0x85e9 , 0x5e06 , +0x756a , 0x7ffb , 0x6a0a , 0x77fe , +0x9492 , 0x7e41 , 0x51e1 , 0x70e6 , +0x53cd , 0x8fd4 , 0x8303 , 0x8d29 , +0x72af , 0x996d , 0x6cdb , 0x574a , +0x82b3 , 0x65b9 , 0x80aa , 0x623f , +0x9632 , 0x59a8 , 0x4eff , 0x8bbf , +0x7eba , 0x653e , 0x83f2 , 0x975e , +0x5561 , 0x98de , 0x80a5 , 0x532a , +0x8bfd , 0x5420 , 0x80ba , 0x5e9f , +0x6cb8 , 0x8d39 , 0x82ac , 0x915a , +0x5429 , 0x6c1b , 0x5206 , 0x7eb7 , +0x575f , 0x711a , 0x6c7e , 0x7c89 , +0x594b , 0x4efd , 0x5fff , 0x6124 , +0x7caa , 0x4e30 , 0x5c01 , 0x67ab , +0x8702 , 0x5cf0 , 0x950b , 0x98ce , +0x75af , 0x70fd , 0x9022 , 0x51af , +0x7f1d , 0x8bbd , 0x5949 , 0x51e4 , +0x4f5b , 0x5426 , 0x592b , 0x6577 , +0x80a4 , 0x5b75 , 0x6276 , 0x62c2 , +0x8f90 , 0x5e45 , 0x6c1f , 0x7b26 , +0x4f0f , 0x4fd8 , 0x670d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d6e , 0x6daa , 0x798f , +0x88b1 , 0x5f17 , 0x752b , 0x629a , +0x8f85 , 0x4fef , 0x91dc , 0x65a7 , +0x812f , 0x8151 , 0x5e9c , 0x8150 , +0x8d74 , 0x526f , 0x8986 , 0x8d4b , +0x590d , 0x5085 , 0x4ed8 , 0x961c , +0x7236 , 0x8179 , 0x8d1f , 0x5bcc , +0x8ba3 , 0x9644 , 0x5987 , 0x7f1a , +0x5490 , 0x5676 , 0x560e , 0x8be5 , +0x6539 , 0x6982 , 0x9499 , 0x76d6 , +0x6e89 , 0x5e72 , 0x7518 , 0x6746 , +0x67d1 , 0x7aff , 0x809d , 0x8d76 , +0x611f , 0x79c6 , 0x6562 , 0x8d63 , +0x5188 , 0x521a , 0x94a2 , 0x7f38 , +0x809b , 0x7eb2 , 0x5c97 , 0x6e2f , +0x6760 , 0x7bd9 , 0x768b , 0x9ad8 , +0x818f , 0x7f94 , 0x7cd5 , 0x641e , +0x9550 , 0x7a3f , 0x544a , 0x54e5 , +0x6b4c , 0x6401 , 0x6208 , 0x9e3d , +0x80f3 , 0x7599 , 0x5272 , 0x9769 , +0x845b , 0x683c , 0x86e4 , 0x9601 , +0x9694 , 0x94ec , 0x4e2a , 0x5404 , +0x7ed9 , 0x6839 , 0x8ddf , 0x8015 , +0x66f4 , 0x5e9a , 0x7fb9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x57c2 , 0x803f , 0x6897 , +0x5de5 , 0x653b , 0x529f , 0x606d , +0x9f9a , 0x4f9b , 0x8eac , 0x516c , +0x5bab , 0x5f13 , 0x5de9 , 0x6c5e , +0x62f1 , 0x8d21 , 0x5171 , 0x94a9 , +0x52fe , 0x6c9f , 0x82df , 0x72d7 , +0x57a2 , 0x6784 , 0x8d2d , 0x591f , +0x8f9c , 0x83c7 , 0x5495 , 0x7b8d , +0x4f30 , 0x6cbd , 0x5b64 , 0x59d1 , +0x9f13 , 0x53e4 , 0x86ca , 0x9aa8 , +0x8c37 , 0x80a1 , 0x6545 , 0x987e , +0x56fa , 0x96c7 , 0x522e , 0x74dc , +0x5250 , 0x5be1 , 0x6302 , 0x8902 , +0x4e56 , 0x62d0 , 0x602a , 0x68fa , +0x5173 , 0x5b98 , 0x51a0 , 0x89c2 , +0x7ba1 , 0x9986 , 0x7f50 , 0x60ef , +0x704c , 0x8d2f , 0x5149 , 0x5e7f , +0x901b , 0x7470 , 0x89c4 , 0x572d , +0x7845 , 0x5f52 , 0x9f9f , 0x95fa , +0x8f68 , 0x9b3c , 0x8be1 , 0x7678 , +0x6842 , 0x67dc , 0x8dea , 0x8d35 , +0x523d , 0x8f8a , 0x6eda , 0x68cd , +0x9505 , 0x90ed , 0x56fd , 0x679c , +0x88f9 , 0x8fc7 , 0x54c8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9ab8 , 0x5b69 , 0x6d77 , +0x6c26 , 0x4ea5 , 0x5bb3 , 0x9a87 , +0x9163 , 0x61a8 , 0x90af , 0x97e9 , +0x542b , 0x6db5 , 0x5bd2 , 0x51fd , +0x558a , 0x7f55 , 0x7ff0 , 0x64bc , +0x634d , 0x65f1 , 0x61be , 0x608d , +0x710a , 0x6c57 , 0x6c49 , 0x592f , +0x676d , 0x822a , 0x58d5 , 0x568e , +0x8c6a , 0x6beb , 0x90dd , 0x597d , +0x8017 , 0x53f7 , 0x6d69 , 0x5475 , +0x559d , 0x8377 , 0x83cf , 0x6838 , +0x79be , 0x548c , 0x4f55 , 0x5408 , +0x76d2 , 0x8c89 , 0x9602 , 0x6cb3 , +0x6db8 , 0x8d6b , 0x8910 , 0x9e64 , +0x8d3a , 0x563f , 0x9ed1 , 0x75d5 , +0x5f88 , 0x72e0 , 0x6068 , 0x54fc , +0x4ea8 , 0x6a2a , 0x8861 , 0x6052 , +0x8f70 , 0x54c4 , 0x70d8 , 0x8679 , +0x9e3f , 0x6d2a , 0x5b8f , 0x5f18 , +0x7ea2 , 0x5589 , 0x4faf , 0x7334 , +0x543c , 0x539a , 0x5019 , 0x540e , +0x547c , 0x4e4e , 0x5ffd , 0x745a , +0x58f6 , 0x846b , 0x80e1 , 0x8774 , +0x72d0 , 0x7cca , 0x6e56 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5f27 , 0x864e , 0x552c , +0x62a4 , 0x4e92 , 0x6caa , 0x6237 , +0x82b1 , 0x54d7 , 0x534e , 0x733e , +0x6ed1 , 0x753b , 0x5212 , 0x5316 , +0x8bdd , 0x69d0 , 0x5f8a , 0x6000 , +0x6dee , 0x574f , 0x6b22 , 0x73af , +0x6853 , 0x8fd8 , 0x7f13 , 0x6362 , +0x60a3 , 0x5524 , 0x75ea , 0x8c62 , +0x7115 , 0x6da3 , 0x5ba6 , 0x5e7b , +0x8352 , 0x614c , 0x9ec4 , 0x78fa , +0x8757 , 0x7c27 , 0x7687 , 0x51f0 , +0x60f6 , 0x714c , 0x6643 , 0x5e4c , +0x604d , 0x8c0e , 0x7070 , 0x6325 , +0x8f89 , 0x5fbd , 0x6062 , 0x86d4 , +0x56de , 0x6bc1 , 0x6094 , 0x6167 , +0x5349 , 0x60e0 , 0x6666 , 0x8d3f , +0x79fd , 0x4f1a , 0x70e9 , 0x6c47 , +0x8bb3 , 0x8bf2 , 0x7ed8 , 0x8364 , +0x660f , 0x5a5a , 0x9b42 , 0x6d51 , +0x6df7 , 0x8c41 , 0x6d3b , 0x4f19 , +0x706b , 0x83b7 , 0x6216 , 0x60d1 , +0x970d , 0x8d27 , 0x7978 , 0x51fb , +0x573e , 0x57fa , 0x673a , 0x7578 , +0x7a3d , 0x79ef , 0x7b95 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x808c , 0x9965 , 0x8ff9 , +0x6fc0 , 0x8ba5 , 0x9e21 , 0x59ec , +0x7ee9 , 0x7f09 , 0x5409 , 0x6781 , +0x68d8 , 0x8f91 , 0x7c4d , 0x96c6 , +0x53ca , 0x6025 , 0x75be , 0x6c72 , +0x5373 , 0x5ac9 , 0x7ea7 , 0x6324 , +0x51e0 , 0x810a , 0x5df1 , 0x84df , +0x6280 , 0x5180 , 0x5b63 , 0x4f0e , +0x796d , 0x5242 , 0x60b8 , 0x6d4e , +0x5bc4 , 0x5bc2 , 0x8ba1 , 0x8bb0 , +0x65e2 , 0x5fcc , 0x9645 , 0x5993 , +0x7ee7 , 0x7eaa , 0x5609 , 0x67b7 , +0x5939 , 0x4f73 , 0x5bb6 , 0x52a0 , +0x835a , 0x988a , 0x8d3e , 0x7532 , +0x94be , 0x5047 , 0x7a3c , 0x4ef7 , +0x67b6 , 0x9a7e , 0x5ac1 , 0x6b7c , +0x76d1 , 0x575a , 0x5c16 , 0x7b3a , +0x95f4 , 0x714e , 0x517c , 0x80a9 , +0x8270 , 0x5978 , 0x7f04 , 0x8327 , +0x68c0 , 0x67ec , 0x78b1 , 0x7877 , +0x62e3 , 0x6361 , 0x7b80 , 0x4fed , +0x526a , 0x51cf , 0x8350 , 0x69db , +0x9274 , 0x8df5 , 0x8d31 , 0x89c1 , +0x952e , 0x7bad , 0x4ef6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5065 , 0x8230 , 0x5251 , +0x996f , 0x6e10 , 0x6e85 , 0x6da7 , +0x5efa , 0x50f5 , 0x59dc , 0x5c06 , +0x6d46 , 0x6c5f , 0x7586 , 0x848b , +0x6868 , 0x5956 , 0x8bb2 , 0x5320 , +0x9171 , 0x964d , 0x8549 , 0x6912 , +0x7901 , 0x7126 , 0x80f6 , 0x4ea4 , +0x90ca , 0x6d47 , 0x9a84 , 0x5a07 , +0x56bc , 0x6405 , 0x94f0 , 0x77eb , +0x4fa5 , 0x811a , 0x72e1 , 0x89d2 , +0x997a , 0x7f34 , 0x7ede , 0x527f , +0x6559 , 0x9175 , 0x8f7f , 0x8f83 , +0x53eb , 0x7a96 , 0x63ed , 0x63a5 , +0x7686 , 0x79f8 , 0x8857 , 0x9636 , +0x622a , 0x52ab , 0x8282 , 0x6854 , +0x6770 , 0x6377 , 0x776b , 0x7aed , +0x6d01 , 0x7ed3 , 0x89e3 , 0x59d0 , +0x6212 , 0x85c9 , 0x82a5 , 0x754c , +0x501f , 0x4ecb , 0x75a5 , 0x8beb , +0x5c4a , 0x5dfe , 0x7b4b , 0x65a4 , +0x91d1 , 0x4eca , 0x6d25 , 0x895f , +0x7d27 , 0x9526 , 0x4ec5 , 0x8c28 , +0x8fdb , 0x9773 , 0x664b , 0x7981 , +0x8fd1 , 0x70ec , 0x6d78 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5c3d , 0x52b2 , 0x8346 , +0x5162 , 0x830e , 0x775b , 0x6676 , +0x9cb8 , 0x4eac , 0x60ca , 0x7cbe , +0x7cb3 , 0x7ecf , 0x4e95 , 0x8b66 , +0x666f , 0x9888 , 0x9759 , 0x5883 , +0x656c , 0x955c , 0x5f84 , 0x75c9 , +0x9756 , 0x7adf , 0x7ade , 0x51c0 , +0x70af , 0x7a98 , 0x63ea , 0x7a76 , +0x7ea0 , 0x7396 , 0x97ed , 0x4e45 , +0x7078 , 0x4e5d , 0x9152 , 0x53a9 , +0x6551 , 0x65e7 , 0x81fc , 0x8205 , +0x548e , 0x5c31 , 0x759a , 0x97a0 , +0x62d8 , 0x72d9 , 0x75bd , 0x5c45 , +0x9a79 , 0x83ca , 0x5c40 , 0x5480 , +0x77e9 , 0x4e3e , 0x6cae , 0x805a , +0x62d2 , 0x636e , 0x5de8 , 0x5177 , +0x8ddd , 0x8e1e , 0x952f , 0x4ff1 , +0x53e5 , 0x60e7 , 0x70ac , 0x5267 , +0x6350 , 0x9e43 , 0x5a1f , 0x5026 , +0x7737 , 0x5377 , 0x7ee2 , 0x6485 , +0x652b , 0x6289 , 0x6398 , 0x5014 , +0x7235 , 0x89c9 , 0x51b3 , 0x8bc0 , +0x7edd , 0x5747 , 0x83cc , 0x94a7 , +0x519b , 0x541b , 0x5cfb , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4fca , 0x7ae3 , 0x6d5a , +0x90e1 , 0x9a8f , 0x5580 , 0x5496 , +0x5361 , 0x54af , 0x5f00 , 0x63e9 , +0x6977 , 0x51ef , 0x6168 , 0x520a , +0x582a , 0x52d8 , 0x574e , 0x780d , +0x770b , 0x5eb7 , 0x6177 , 0x7ce0 , +0x625b , 0x6297 , 0x4ea2 , 0x7095 , +0x8003 , 0x62f7 , 0x70e4 , 0x9760 , +0x5777 , 0x82db , 0x67ef , 0x68f5 , +0x78d5 , 0x9897 , 0x79d1 , 0x58f3 , +0x54b3 , 0x53ef , 0x6e34 , 0x514b , +0x523b , 0x5ba2 , 0x8bfe , 0x80af , +0x5543 , 0x57a6 , 0x6073 , 0x5751 , +0x542d , 0x7a7a , 0x6050 , 0x5b54 , +0x63a7 , 0x62a0 , 0x53e3 , 0x6263 , +0x5bc7 , 0x67af , 0x54ed , 0x7a9f , +0x82e6 , 0x9177 , 0x5e93 , 0x88e4 , +0x5938 , 0x57ae , 0x630e , 0x8de8 , +0x80ef , 0x5757 , 0x7b77 , 0x4fa9 , +0x5feb , 0x5bbd , 0x6b3e , 0x5321 , +0x7b50 , 0x72c2 , 0x6846 , 0x77ff , +0x7736 , 0x65f7 , 0x51b5 , 0x4e8f , +0x76d4 , 0x5cbf , 0x7aa5 , 0x8475 , +0x594e , 0x9b41 , 0x5080 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9988 , 0x6127 , 0x6e83 , +0x5764 , 0x6606 , 0x6346 , 0x56f0 , +0x62ec , 0x6269 , 0x5ed3 , 0x9614 , +0x5783 , 0x62c9 , 0x5587 , 0x8721 , +0x814a , 0x8fa3 , 0x5566 , 0x83b1 , +0x6765 , 0x8d56 , 0x84dd , 0x5a6a , +0x680f , 0x62e6 , 0x7bee , 0x9611 , +0x5170 , 0x6f9c , 0x8c30 , 0x63fd , +0x89c8 , 0x61d2 , 0x7f06 , 0x70c2 , +0x6ee5 , 0x7405 , 0x6994 , 0x72fc , +0x5eca , 0x90ce , 0x6717 , 0x6d6a , +0x635e , 0x52b3 , 0x7262 , 0x8001 , +0x4f6c , 0x59e5 , 0x916a , 0x70d9 , +0x6d9d , 0x52d2 , 0x4e50 , 0x96f7 , +0x956d , 0x857e , 0x78ca , 0x7d2f , +0x5121 , 0x5792 , 0x64c2 , 0x808b , +0x7c7b , 0x6cea , 0x68f1 , 0x695e , +0x51b7 , 0x5398 , 0x68a8 , 0x7281 , +0x9ece , 0x7bf1 , 0x72f8 , 0x79bb , +0x6f13 , 0x7406 , 0x674e , 0x91cc , +0x9ca4 , 0x793c , 0x8389 , 0x8354 , +0x540f , 0x6817 , 0x4e3d , 0x5389 , +0x52b1 , 0x783e , 0x5386 , 0x5229 , +0x5088 , 0x4f8b , 0x4fd0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x75e2 , 0x7acb , 0x7c92 , +0x6ca5 , 0x96b6 , 0x529b , 0x7483 , +0x54e9 , 0x4fe9 , 0x8054 , 0x83b2 , +0x8fde , 0x9570 , 0x5ec9 , 0x601c , +0x6d9f , 0x5e18 , 0x655b , 0x8138 , +0x94fe , 0x604b , 0x70bc , 0x7ec3 , +0x7cae , 0x51c9 , 0x6881 , 0x7cb1 , +0x826f , 0x4e24 , 0x8f86 , 0x91cf , +0x667e , 0x4eae , 0x8c05 , 0x64a9 , +0x804a , 0x50da , 0x7597 , 0x71ce , +0x5be5 , 0x8fbd , 0x6f66 , 0x4e86 , +0x6482 , 0x9563 , 0x5ed6 , 0x6599 , +0x5217 , 0x88c2 , 0x70c8 , 0x52a3 , +0x730e , 0x7433 , 0x6797 , 0x78f7 , +0x9716 , 0x4e34 , 0x90bb , 0x9cde , +0x6dcb , 0x51db , 0x8d41 , 0x541d , +0x62ce , 0x73b2 , 0x83f1 , 0x96f6 , +0x9f84 , 0x94c3 , 0x4f36 , 0x7f9a , +0x51cc , 0x7075 , 0x9675 , 0x5cad , +0x9886 , 0x53e6 , 0x4ee4 , 0x6e9c , +0x7409 , 0x69b4 , 0x786b , 0x998f , +0x7559 , 0x5218 , 0x7624 , 0x6d41 , +0x67f3 , 0x516d , 0x9f99 , 0x804b , +0x5499 , 0x7b3c , 0x7abf , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9686 , 0x5784 , 0x62e2 , +0x9647 , 0x697c , 0x5a04 , 0x6402 , +0x7bd3 , 0x6f0f , 0x964b , 0x82a6 , +0x5362 , 0x9885 , 0x5e90 , 0x7089 , +0x63b3 , 0x5364 , 0x864f , 0x9c81 , +0x9e93 , 0x788c , 0x9732 , 0x8def , +0x8d42 , 0x9e7f , 0x6f5e , 0x7984 , +0x5f55 , 0x9646 , 0x622e , 0x9a74 , +0x5415 , 0x94dd , 0x4fa3 , 0x65c5 , +0x5c65 , 0x5c61 , 0x7f15 , 0x8651 , +0x6c2f , 0x5f8b , 0x7387 , 0x6ee4 , +0x7eff , 0x5ce6 , 0x631b , 0x5b6a , +0x6ee6 , 0x5375 , 0x4e71 , 0x63a0 , +0x7565 , 0x62a1 , 0x8f6e , 0x4f26 , +0x4ed1 , 0x6ca6 , 0x7eb6 , 0x8bba , +0x841d , 0x87ba , 0x7f57 , 0x903b , +0x9523 , 0x7ba9 , 0x9aa1 , 0x88f8 , +0x843d , 0x6d1b , 0x9a86 , 0x7edc , +0x5988 , 0x9ebb , 0x739b , 0x7801 , +0x8682 , 0x9a6c , 0x9a82 , 0x561b , +0x5417 , 0x57cb , 0x4e70 , 0x9ea6 , +0x5356 , 0x8fc8 , 0x8109 , 0x7792 , +0x9992 , 0x86ee , 0x6ee1 , 0x8513 , +0x66fc , 0x6162 , 0x6f2b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8c29 , 0x8292 , 0x832b , +0x76f2 , 0x6c13 , 0x5fd9 , 0x83bd , +0x732b , 0x8305 , 0x951a , 0x6bdb , +0x77db , 0x94c6 , 0x536f , 0x8302 , +0x5192 , 0x5e3d , 0x8c8c , 0x8d38 , +0x4e48 , 0x73ab , 0x679a , 0x6885 , +0x9176 , 0x9709 , 0x7164 , 0x6ca1 , +0x7709 , 0x5a92 , 0x9541 , 0x6bcf , +0x7f8e , 0x6627 , 0x5bd0 , 0x59b9 , +0x5a9a , 0x95e8 , 0x95f7 , 0x4eec , +0x840c , 0x8499 , 0x6aac , 0x76df , +0x9530 , 0x731b , 0x68a6 , 0x5b5f , +0x772f , 0x919a , 0x9761 , 0x7cdc , +0x8ff7 , 0x8c1c , 0x5f25 , 0x7c73 , +0x79d8 , 0x89c5 , 0x6ccc , 0x871c , +0x5bc6 , 0x5e42 , 0x68c9 , 0x7720 , +0x7ef5 , 0x5195 , 0x514d , 0x52c9 , +0x5a29 , 0x7f05 , 0x9762 , 0x82d7 , +0x63cf , 0x7784 , 0x85d0 , 0x79d2 , +0x6e3a , 0x5e99 , 0x5999 , 0x8511 , +0x706d , 0x6c11 , 0x62bf , 0x76bf , +0x654f , 0x60af , 0x95fd , 0x660e , +0x879f , 0x9e23 , 0x94ed , 0x540d , +0x547d , 0x8c2c , 0x6478 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6479 , 0x8611 , 0x6a21 , +0x819c , 0x78e8 , 0x6469 , 0x9b54 , +0x62b9 , 0x672b , 0x83ab , 0x58a8 , +0x9ed8 , 0x6cab , 0x6f20 , 0x5bde , +0x964c , 0x8c0b , 0x725f , 0x67d0 , +0x62c7 , 0x7261 , 0x4ea9 , 0x59c6 , +0x6bcd , 0x5893 , 0x66ae , 0x5e55 , +0x52df , 0x6155 , 0x6728 , 0x76ee , +0x7766 , 0x7267 , 0x7a46 , 0x62ff , +0x54ea , 0x5450 , 0x94a0 , 0x90a3 , +0x5a1c , 0x7eb3 , 0x6c16 , 0x4e43 , +0x5976 , 0x8010 , 0x5948 , 0x5357 , +0x7537 , 0x96be , 0x56ca , 0x6320 , +0x8111 , 0x607c , 0x95f9 , 0x6dd6 , +0x5462 , 0x9981 , 0x5185 , 0x5ae9 , +0x80fd , 0x59ae , 0x9713 , 0x502a , +0x6ce5 , 0x5c3c , 0x62df , 0x4f60 , +0x533f , 0x817b , 0x9006 , 0x6eba , +0x852b , 0x62c8 , 0x5e74 , 0x78be , +0x64b5 , 0x637b , 0x5ff5 , 0x5a18 , +0x917f , 0x9e1f , 0x5c3f , 0x634f , +0x8042 , 0x5b7d , 0x556e , 0x954a , +0x954d , 0x6d85 , 0x60a8 , 0x67e0 , +0x72de , 0x51dd , 0x5b81 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x62e7 , 0x6cde , 0x725b , +0x626d , 0x94ae , 0x7ebd , 0x8113 , +0x6d53 , 0x519c , 0x5f04 , 0x5974 , +0x52aa , 0x6012 , 0x5973 , 0x6696 , +0x8650 , 0x759f , 0x632a , 0x61e6 , +0x7cef , 0x8bfa , 0x54e6 , 0x6b27 , +0x9e25 , 0x6bb4 , 0x85d5 , 0x5455 , +0x5076 , 0x6ca4 , 0x556a , 0x8db4 , +0x722c , 0x5e15 , 0x6015 , 0x7436 , +0x62cd , 0x6392 , 0x724c , 0x5f98 , +0x6e43 , 0x6d3e , 0x6500 , 0x6f58 , +0x76d8 , 0x78d0 , 0x76fc , 0x7554 , +0x5224 , 0x53db , 0x4e53 , 0x5e9e , +0x65c1 , 0x802a , 0x80d6 , 0x629b , +0x5486 , 0x5228 , 0x70ae , 0x888d , +0x8dd1 , 0x6ce1 , 0x5478 , 0x80da , +0x57f9 , 0x88f4 , 0x8d54 , 0x966a , +0x914d , 0x4f69 , 0x6c9b , 0x55b7 , +0x76c6 , 0x7830 , 0x62a8 , 0x70f9 , +0x6f8e , 0x5f6d , 0x84ec , 0x68da , +0x787c , 0x7bf7 , 0x81a8 , 0x670b , +0x9e4f , 0x6367 , 0x78b0 , 0x576f , +0x7812 , 0x9739 , 0x6279 , 0x62ab , +0x5288 , 0x7435 , 0x6bd7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5564 , 0x813e , 0x75b2 , +0x76ae , 0x5339 , 0x75de , 0x50fb , +0x5c41 , 0x8b6c , 0x7bc7 , 0x504f , +0x7247 , 0x9a97 , 0x98d8 , 0x6f02 , +0x74e2 , 0x7968 , 0x6487 , 0x77a5 , +0x62fc , 0x9891 , 0x8d2b , 0x54c1 , +0x8058 , 0x4e52 , 0x576a , 0x82f9 , +0x840d , 0x5e73 , 0x51ed , 0x74f6 , +0x8bc4 , 0x5c4f , 0x5761 , 0x6cfc , +0x9887 , 0x5a46 , 0x7834 , 0x9b44 , +0x8feb , 0x7c95 , 0x5256 , 0x6251 , +0x94fa , 0x4ec6 , 0x8386 , 0x8461 , +0x83e9 , 0x84b2 , 0x57d4 , 0x6734 , +0x5703 , 0x666e , 0x6d66 , 0x8c31 , +0x66dd , 0x7011 , 0x671f , 0x6b3a , +0x6816 , 0x621a , 0x59bb , 0x4e03 , +0x51c4 , 0x6f06 , 0x67d2 , 0x6c8f , +0x5176 , 0x68cb , 0x5947 , 0x6b67 , +0x7566 , 0x5d0e , 0x8110 , 0x9f50 , +0x65d7 , 0x7948 , 0x7941 , 0x9a91 , +0x8d77 , 0x5c82 , 0x4e5e , 0x4f01 , +0x542f , 0x5951 , 0x780c , 0x5668 , +0x6c14 , 0x8fc4 , 0x5f03 , 0x6c7d , +0x6ce3 , 0x8bab , 0x6390 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6070 , 0x6d3d , 0x7275 , +0x6266 , 0x948e , 0x94c5 , 0x5343 , +0x8fc1 , 0x7b7e , 0x4edf , 0x8c26 , +0x4e7e , 0x9ed4 , 0x94b1 , 0x94b3 , +0x524d , 0x6f5c , 0x9063 , 0x6d45 , +0x8c34 , 0x5811 , 0x5d4c , 0x6b20 , +0x6b49 , 0x67aa , 0x545b , 0x8154 , +0x7f8c , 0x5899 , 0x8537 , 0x5f3a , +0x62a2 , 0x6a47 , 0x9539 , 0x6572 , +0x6084 , 0x6865 , 0x77a7 , 0x4e54 , +0x4fa8 , 0x5de7 , 0x9798 , 0x64ac , +0x7fd8 , 0x5ced , 0x4fcf , 0x7a8d , +0x5207 , 0x8304 , 0x4e14 , 0x602f , +0x7a83 , 0x94a6 , 0x4fb5 , 0x4eb2 , +0x79e6 , 0x7434 , 0x52e4 , 0x82b9 , +0x64d2 , 0x79bd , 0x5bdd , 0x6c81 , +0x9752 , 0x8f7b , 0x6c22 , 0x503e , +0x537f , 0x6e05 , 0x64ce , 0x6674 , +0x6c30 , 0x60c5 , 0x9877 , 0x8bf7 , +0x5e86 , 0x743c , 0x7a77 , 0x79cb , +0x4e18 , 0x90b1 , 0x7403 , 0x6c42 , +0x56da , 0x914b , 0x6cc5 , 0x8d8b , +0x533a , 0x86c6 , 0x66f2 , 0x8eaf , +0x5c48 , 0x9a71 , 0x6e20 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x53d6 , 0x5a36 , 0x9f8b , +0x8da3 , 0x53bb , 0x5708 , 0x98a7 , +0x6743 , 0x919b , 0x6cc9 , 0x5168 , +0x75ca , 0x62f3 , 0x72ac , 0x5238 , +0x529d , 0x7f3a , 0x7094 , 0x7638 , +0x5374 , 0x9e4a , 0x69b7 , 0x786e , +0x96c0 , 0x88d9 , 0x7fa4 , 0x7136 , +0x71c3 , 0x5189 , 0x67d3 , 0x74e4 , +0x58e4 , 0x6518 , 0x56b7 , 0x8ba9 , +0x9976 , 0x6270 , 0x7ed5 , 0x60f9 , +0x70ed , 0x58ec , 0x4ec1 , 0x4eba , +0x5fcd , 0x97e7 , 0x4efb , 0x8ba4 , +0x5203 , 0x598a , 0x7eab , 0x6254 , +0x4ecd , 0x65e5 , 0x620e , 0x8338 , +0x84c9 , 0x8363 , 0x878d , 0x7194 , +0x6eb6 , 0x5bb9 , 0x7ed2 , 0x5197 , +0x63c9 , 0x67d4 , 0x8089 , 0x8339 , +0x8815 , 0x5112 , 0x5b7a , 0x5982 , +0x8fb1 , 0x4e73 , 0x6c5d , 0x5165 , +0x8925 , 0x8f6f , 0x962e , 0x854a , +0x745e , 0x9510 , 0x95f0 , 0x6da6 , +0x82e5 , 0x5f31 , 0x6492 , 0x6d12 , +0x8428 , 0x816e , 0x9cc3 , 0x585e , +0x8d5b , 0x4e09 , 0x53c1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4f1e , 0x6563 , 0x6851 , +0x55d3 , 0x4e27 , 0x6414 , 0x9a9a , +0x626b , 0x5ac2 , 0x745f , 0x8272 , +0x6da9 , 0x68ee , 0x50e7 , 0x838e , +0x7802 , 0x6740 , 0x5239 , 0x6c99 , +0x7eb1 , 0x50bb , 0x5565 , 0x715e , +0x7b5b , 0x6652 , 0x73ca , 0x82eb , +0x6749 , 0x5c71 , 0x5220 , 0x717d , +0x886b , 0x95ea , 0x9655 , 0x64c5 , +0x8d61 , 0x81b3 , 0x5584 , 0x6c55 , +0x6247 , 0x7f2e , 0x5892 , 0x4f24 , +0x5546 , 0x8d4f , 0x664c , 0x4e0a , +0x5c1a , 0x88f3 , 0x68a2 , 0x634e , +0x7a0d , 0x70e7 , 0x828d , 0x52fa , +0x97f6 , 0x5c11 , 0x54e8 , 0x90b5 , +0x7ecd , 0x5962 , 0x8d4a , 0x86c7 , +0x820c , 0x820d , 0x8d66 , 0x6444 , +0x5c04 , 0x6151 , 0x6d89 , 0x793e , +0x8bbe , 0x7837 , 0x7533 , 0x547b , +0x4f38 , 0x8eab , 0x6df1 , 0x5a20 , +0x7ec5 , 0x795e , 0x6c88 , 0x5ba1 , +0x5a76 , 0x751a , 0x80be , 0x614e , +0x6e17 , 0x58f0 , 0x751f , 0x7525 , +0x7272 , 0x5347 , 0x7ef3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7701 , 0x76db , 0x5269 , +0x80dc , 0x5723 , 0x5e08 , 0x5931 , +0x72ee , 0x65bd , 0x6e7f , 0x8bd7 , +0x5c38 , 0x8671 , 0x5341 , 0x77f3 , +0x62fe , 0x65f6 , 0x4ec0 , 0x98df , +0x8680 , 0x5b9e , 0x8bc6 , 0x53f2 , +0x77e2 , 0x4f7f , 0x5c4e , 0x9a76 , +0x59cb , 0x5f0f , 0x793a , 0x58eb , +0x4e16 , 0x67ff , 0x4e8b , 0x62ed , +0x8a93 , 0x901d , 0x52bf , 0x662f , +0x55dc , 0x566c , 0x9002 , 0x4ed5 , +0x4f8d , 0x91ca , 0x9970 , 0x6c0f , +0x5e02 , 0x6043 , 0x5ba4 , 0x89c6 , +0x8bd5 , 0x6536 , 0x624b , 0x9996 , +0x5b88 , 0x5bff , 0x6388 , 0x552e , +0x53d7 , 0x7626 , 0x517d , 0x852c , +0x67a2 , 0x68b3 , 0x6b8a , 0x6292 , +0x8f93 , 0x53d4 , 0x8212 , 0x6dd1 , +0x758f , 0x4e66 , 0x8d4e , 0x5b70 , +0x719f , 0x85af , 0x6691 , 0x66d9 , +0x7f72 , 0x8700 , 0x9ecd , 0x9f20 , +0x5c5e , 0x672f , 0x8ff0 , 0x6811 , +0x675f , 0x620d , 0x7ad6 , 0x5885 , +0x5eb6 , 0x6570 , 0x6f31 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6055 , 0x5237 , 0x800d , +0x6454 , 0x8870 , 0x7529 , 0x5e05 , +0x6813 , 0x62f4 , 0x971c , 0x53cc , +0x723d , 0x8c01 , 0x6c34 , 0x7761 , +0x7a0e , 0x542e , 0x77ac , 0x987a , +0x821c , 0x8bf4 , 0x7855 , 0x6714 , +0x70c1 , 0x65af , 0x6495 , 0x5636 , +0x601d , 0x79c1 , 0x53f8 , 0x4e1d , +0x6b7b , 0x8086 , 0x5bfa , 0x55e3 , +0x56db , 0x4f3a , 0x4f3c , 0x9972 , +0x5df3 , 0x677e , 0x8038 , 0x6002 , +0x9882 , 0x9001 , 0x5b8b , 0x8bbc , +0x8bf5 , 0x641c , 0x8258 , 0x64de , +0x55fd , 0x82cf , 0x9165 , 0x4fd7 , +0x7d20 , 0x901f , 0x7c9f , 0x50f3 , +0x5851 , 0x6eaf , 0x5bbf , 0x8bc9 , +0x8083 , 0x9178 , 0x849c , 0x7b97 , +0x867d , 0x968b , 0x968f , 0x7ee5 , +0x9ad3 , 0x788e , 0x5c81 , 0x7a57 , +0x9042 , 0x96a7 , 0x795f , 0x5b59 , +0x635f , 0x7b0b , 0x84d1 , 0x68ad , +0x5506 , 0x7f29 , 0x7410 , 0x7d22 , +0x9501 , 0x6240 , 0x584c , 0x4ed6 , +0x5b83 , 0x5979 , 0x5854 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x736d , 0x631e , 0x8e4b , +0x8e0f , 0x80ce , 0x82d4 , 0x62ac , +0x53f0 , 0x6cf0 , 0x915e , 0x592a , +0x6001 , 0x6c70 , 0x574d , 0x644a , +0x8d2a , 0x762b , 0x6ee9 , 0x575b , +0x6a80 , 0x75f0 , 0x6f6d , 0x8c2d , +0x8c08 , 0x5766 , 0x6bef , 0x8892 , +0x78b3 , 0x63a2 , 0x53f9 , 0x70ad , +0x6c64 , 0x5858 , 0x642a , 0x5802 , +0x68e0 , 0x819b , 0x5510 , 0x7cd6 , +0x5018 , 0x8eba , 0x6dcc , 0x8d9f , +0x70eb , 0x638f , 0x6d9b , 0x6ed4 , +0x7ee6 , 0x8404 , 0x6843 , 0x9003 , +0x6dd8 , 0x9676 , 0x8ba8 , 0x5957 , +0x7279 , 0x85e4 , 0x817e , 0x75bc , +0x8a8a , 0x68af , 0x5254 , 0x8e22 , +0x9511 , 0x63d0 , 0x9898 , 0x8e44 , +0x557c , 0x4f53 , 0x66ff , 0x568f , +0x60d5 , 0x6d95 , 0x5243 , 0x5c49 , +0x5929 , 0x6dfb , 0x586b , 0x7530 , +0x751c , 0x606c , 0x8214 , 0x8146 , +0x6311 , 0x6761 , 0x8fe2 , 0x773a , +0x8df3 , 0x8d34 , 0x94c1 , 0x5e16 , +0x5385 , 0x542c , 0x70c3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6c40 , 0x5ef7 , 0x505c , +0x4ead , 0x5ead , 0x633a , 0x8247 , +0x901a , 0x6850 , 0x916e , 0x77b3 , +0x540c , 0x94dc , 0x5f64 , 0x7ae5 , +0x6876 , 0x6345 , 0x7b52 , 0x7edf , +0x75db , 0x5077 , 0x6295 , 0x5934 , +0x900f , 0x51f8 , 0x79c3 , 0x7a81 , +0x56fe , 0x5f92 , 0x9014 , 0x6d82 , +0x5c60 , 0x571f , 0x5410 , 0x5154 , +0x6e4d , 0x56e2 , 0x63a8 , 0x9893 , +0x817f , 0x8715 , 0x892a , 0x9000 , +0x541e , 0x5c6f , 0x81c0 , 0x62d6 , +0x6258 , 0x8131 , 0x9e35 , 0x9640 , +0x9a6e , 0x9a7c , 0x692d , 0x59a5 , +0x62d3 , 0x553e , 0x6316 , 0x54c7 , +0x86d9 , 0x6d3c , 0x5a03 , 0x74e6 , +0x889c , 0x6b6a , 0x5916 , 0x8c4c , +0x5f2f , 0x6e7e , 0x73a9 , 0x987d , +0x4e38 , 0x70f7 , 0x5b8c , 0x7897 , +0x633d , 0x665a , 0x7696 , 0x60cb , +0x5b9b , 0x5a49 , 0x4e07 , 0x8155 , +0x6c6a , 0x738b , 0x4ea1 , 0x6789 , +0x7f51 , 0x5f80 , 0x65fa , 0x671b , +0x5fd8 , 0x5984 , 0x5a01 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5dcd , 0x5fae , 0x5371 , +0x97e6 , 0x8fdd , 0x6845 , 0x56f4 , +0x552f , 0x60df , 0x4e3a , 0x6f4d , +0x7ef4 , 0x82c7 , 0x840e , 0x59d4 , +0x4f1f , 0x4f2a , 0x5c3e , 0x7eac , +0x672a , 0x851a , 0x5473 , 0x754f , +0x80c3 , 0x5582 , 0x9b4f , 0x4f4d , +0x6e2d , 0x8c13 , 0x5c09 , 0x6170 , +0x536b , 0x761f , 0x6e29 , 0x868a , +0x6587 , 0x95fb , 0x7eb9 , 0x543b , +0x7a33 , 0x7d0a , 0x95ee , 0x55e1 , +0x7fc1 , 0x74ee , 0x631d , 0x8717 , +0x6da1 , 0x7a9d , 0x6211 , 0x65a1 , +0x5367 , 0x63e1 , 0x6c83 , 0x5deb , +0x545c , 0x94a8 , 0x4e4c , 0x6c61 , +0x8bec , 0x5c4b , 0x65e0 , 0x829c , +0x68a7 , 0x543e , 0x5434 , 0x6bcb , +0x6b66 , 0x4e94 , 0x6342 , 0x5348 , +0x821e , 0x4f0d , 0x4fae , 0x575e , +0x620a , 0x96fe , 0x6664 , 0x7269 , +0x52ff , 0x52a1 , 0x609f , 0x8bef , +0x6614 , 0x7199 , 0x6790 , 0x897f , +0x7852 , 0x77fd , 0x6670 , 0x563b , +0x5438 , 0x9521 , 0x727a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7a00 , 0x606f , 0x5e0c , +0x6089 , 0x819d , 0x5915 , 0x60dc , +0x7184 , 0x70ef , 0x6eaa , 0x6c50 , +0x7280 , 0x6a84 , 0x88ad , 0x5e2d , +0x4e60 , 0x5ab3 , 0x559c , 0x94e3 , +0x6d17 , 0x7cfb , 0x9699 , 0x620f , +0x7ec6 , 0x778e , 0x867e , 0x5323 , +0x971e , 0x8f96 , 0x6687 , 0x5ce1 , +0x4fa0 , 0x72ed , 0x4e0b , 0x53a6 , +0x590f , 0x5413 , 0x6380 , 0x9528 , +0x5148 , 0x4ed9 , 0x9c9c , 0x7ea4 , +0x54b8 , 0x8d24 , 0x8854 , 0x8237 , +0x95f2 , 0x6d8e , 0x5f26 , 0x5acc , +0x663e , 0x9669 , 0x73b0 , 0x732e , +0x53bf , 0x817a , 0x9985 , 0x7fa1 , +0x5baa , 0x9677 , 0x9650 , 0x7ebf , +0x76f8 , 0x53a2 , 0x9576 , 0x9999 , +0x7bb1 , 0x8944 , 0x6e58 , 0x4e61 , +0x7fd4 , 0x7965 , 0x8be6 , 0x60f3 , +0x54cd , 0x4eab , 0x9879 , 0x5df7 , +0x6a61 , 0x50cf , 0x5411 , 0x8c61 , +0x8427 , 0x785d , 0x9704 , 0x524a , +0x54ee , 0x56a3 , 0x9500 , 0x6d88 , +0x5bb5 , 0x6dc6 , 0x6653 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5c0f , 0x5b5d , 0x6821 , +0x8096 , 0x5578 , 0x7b11 , 0x6548 , +0x6954 , 0x4e9b , 0x6b47 , 0x874e , +0x978b , 0x534f , 0x631f , 0x643a , +0x90aa , 0x659c , 0x80c1 , 0x8c10 , +0x5199 , 0x68b0 , 0x5378 , 0x87f9 , +0x61c8 , 0x6cc4 , 0x6cfb , 0x8c22 , +0x5c51 , 0x85aa , 0x82af , 0x950c , +0x6b23 , 0x8f9b , 0x65b0 , 0x5ffb , +0x5fc3 , 0x4fe1 , 0x8845 , 0x661f , +0x8165 , 0x7329 , 0x60fa , 0x5174 , +0x5211 , 0x578b , 0x5f62 , 0x90a2 , +0x884c , 0x9192 , 0x5e78 , 0x674f , +0x6027 , 0x59d3 , 0x5144 , 0x51f6 , +0x80f8 , 0x5308 , 0x6c79 , 0x96c4 , +0x718a , 0x4f11 , 0x4fee , 0x7f9e , +0x673d , 0x55c5 , 0x9508 , 0x79c0 , +0x8896 , 0x7ee3 , 0x589f , 0x620c , +0x9700 , 0x865a , 0x5618 , 0x987b , +0x5f90 , 0x8bb8 , 0x84c4 , 0x9157 , +0x53d9 , 0x65ed , 0x5e8f , 0x755c , +0x6064 , 0x7d6e , 0x5a7f , 0x7eea , +0x7eed , 0x8f69 , 0x55a7 , 0x5ba3 , +0x60ac , 0x65cb , 0x7384 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9009 , 0x7663 , 0x7729 , +0x7eda , 0x9774 , 0x859b , 0x5b66 , +0x7a74 , 0x96ea , 0x8840 , 0x52cb , +0x718f , 0x5faa , 0x65ec , 0x8be2 , +0x5bfb , 0x9a6f , 0x5de1 , 0x6b89 , +0x6c5b , 0x8bad , 0x8baf , 0x900a , +0x8fc5 , 0x538b , 0x62bc , 0x9e26 , +0x9e2d , 0x5440 , 0x4e2b , 0x82bd , +0x7259 , 0x869c , 0x5d16 , 0x8859 , +0x6daf , 0x96c5 , 0x54d1 , 0x4e9a , +0x8bb6 , 0x7109 , 0x54bd , 0x9609 , +0x70df , 0x6df9 , 0x76d0 , 0x4e25 , +0x7814 , 0x8712 , 0x5ca9 , 0x5ef6 , +0x8a00 , 0x989c , 0x960e , 0x708e , +0x6cbf , 0x5944 , 0x63a9 , 0x773c , +0x884d , 0x6f14 , 0x8273 , 0x5830 , +0x71d5 , 0x538c , 0x781a , 0x96c1 , +0x5501 , 0x5f66 , 0x7130 , 0x5bb4 , +0x8c1a , 0x9a8c , 0x6b83 , 0x592e , +0x9e2f , 0x79e7 , 0x6768 , 0x626c , +0x4f6f , 0x75a1 , 0x7f8a , 0x6d0b , +0x9633 , 0x6c27 , 0x4ef0 , 0x75d2 , +0x517b , 0x6837 , 0x6f3e , 0x9080 , +0x8170 , 0x5996 , 0x7476 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6447 , 0x5c27 , 0x9065 , +0x7a91 , 0x8c23 , 0x59da , 0x54ac , +0x8200 , 0x836f , 0x8981 , 0x8000 , +0x6930 , 0x564e , 0x8036 , 0x7237 , +0x91ce , 0x51b6 , 0x4e5f , 0x9875 , +0x6396 , 0x4e1a , 0x53f6 , 0x66f3 , +0x814b , 0x591c , 0x6db2 , 0x4e00 , +0x58f9 , 0x533b , 0x63d6 , 0x94f1 , +0x4f9d , 0x4f0a , 0x8863 , 0x9890 , +0x5937 , 0x9057 , 0x79fb , 0x4eea , +0x80f0 , 0x7591 , 0x6c82 , 0x5b9c , +0x59e8 , 0x5f5d , 0x6905 , 0x8681 , +0x501a , 0x5df2 , 0x4e59 , 0x77e3 , +0x4ee5 , 0x827a , 0x6291 , 0x6613 , +0x9091 , 0x5c79 , 0x4ebf , 0x5f79 , +0x81c6 , 0x9038 , 0x8084 , 0x75ab , +0x4ea6 , 0x88d4 , 0x610f , 0x6bc5 , +0x5fc6 , 0x4e49 , 0x76ca , 0x6ea2 , +0x8be3 , 0x8bae , 0x8c0a , 0x8bd1 , +0x5f02 , 0x7ffc , 0x7fcc , 0x7ece , +0x8335 , 0x836b , 0x56e0 , 0x6bb7 , +0x97f3 , 0x9634 , 0x59fb , 0x541f , +0x94f6 , 0x6deb , 0x5bc5 , 0x996e , +0x5c39 , 0x5f15 , 0x9690 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5370 , 0x82f1 , 0x6a31 , +0x5a74 , 0x9e70 , 0x5e94 , 0x7f28 , +0x83b9 , 0x8424 , 0x8425 , 0x8367 , +0x8747 , 0x8fce , 0x8d62 , 0x76c8 , +0x5f71 , 0x9896 , 0x786c , 0x6620 , +0x54df , 0x62e5 , 0x4f63 , 0x81c3 , +0x75c8 , 0x5eb8 , 0x96cd , 0x8e0a , +0x86f9 , 0x548f , 0x6cf3 , 0x6d8c , +0x6c38 , 0x607f , 0x52c7 , 0x7528 , +0x5e7d , 0x4f18 , 0x60a0 , 0x5fe7 , +0x5c24 , 0x7531 , 0x90ae , 0x94c0 , +0x72b9 , 0x6cb9 , 0x6e38 , 0x9149 , +0x6709 , 0x53cb , 0x53f3 , 0x4f51 , +0x91c9 , 0x8bf1 , 0x53c8 , 0x5e7c , +0x8fc2 , 0x6de4 , 0x4e8e , 0x76c2 , +0x6986 , 0x865e , 0x611a , 0x8206 , +0x4f59 , 0x4fde , 0x903e , 0x9c7c , +0x6109 , 0x6e1d , 0x6e14 , 0x9685 , +0x4e88 , 0x5a31 , 0x96e8 , 0x4e0e , +0x5c7f , 0x79b9 , 0x5b87 , 0x8bed , +0x7fbd , 0x7389 , 0x57df , 0x828b , +0x90c1 , 0x5401 , 0x9047 , 0x55bb , +0x5cea , 0x5fa1 , 0x6108 , 0x6b32 , +0x72f1 , 0x80b2 , 0x8a89 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d74 , 0x5bd3 , 0x88d5 , +0x9884 , 0x8c6b , 0x9a6d , 0x9e33 , +0x6e0a , 0x51a4 , 0x5143 , 0x57a3 , +0x8881 , 0x539f , 0x63f4 , 0x8f95 , +0x56ed , 0x5458 , 0x5706 , 0x733f , +0x6e90 , 0x7f18 , 0x8fdc , 0x82d1 , +0x613f , 0x6028 , 0x9662 , 0x66f0 , +0x7ea6 , 0x8d8a , 0x8dc3 , 0x94a5 , +0x5cb3 , 0x7ca4 , 0x6708 , 0x60a6 , +0x9605 , 0x8018 , 0x4e91 , 0x90e7 , +0x5300 , 0x9668 , 0x5141 , 0x8fd0 , +0x8574 , 0x915d , 0x6655 , 0x97f5 , +0x5b55 , 0x531d , 0x7838 , 0x6742 , +0x683d , 0x54c9 , 0x707e , 0x5bb0 , +0x8f7d , 0x518d , 0x5728 , 0x54b1 , +0x6512 , 0x6682 , 0x8d5e , 0x8d43 , +0x810f , 0x846c , 0x906d , 0x7cdf , +0x51ff , 0x85fb , 0x67a3 , 0x65e9 , +0x6fa1 , 0x86a4 , 0x8e81 , 0x566a , +0x9020 , 0x7682 , 0x7076 , 0x71e5 , +0x8d23 , 0x62e9 , 0x5219 , 0x6cfd , +0x8d3c , 0x600e , 0x589e , 0x618e , +0x66fe , 0x8d60 , 0x624e , 0x55b3 , +0x6e23 , 0x672d , 0x8f67 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x94e1 , 0x95f8 , 0x7728 , +0x6805 , 0x69a8 , 0x548b , 0x4e4d , +0x70b8 , 0x8bc8 , 0x6458 , 0x658b , +0x5b85 , 0x7a84 , 0x503a , 0x5be8 , +0x77bb , 0x6be1 , 0x8a79 , 0x7c98 , +0x6cbe , 0x76cf , 0x65a9 , 0x8f97 , +0x5d2d , 0x5c55 , 0x8638 , 0x6808 , +0x5360 , 0x6218 , 0x7ad9 , 0x6e5b , +0x7efd , 0x6a1f , 0x7ae0 , 0x5f70 , +0x6f33 , 0x5f20 , 0x638c , 0x6da8 , +0x6756 , 0x4e08 , 0x5e10 , 0x8d26 , +0x4ed7 , 0x80c0 , 0x7634 , 0x969c , +0x62db , 0x662d , 0x627e , 0x6cbc , +0x8d75 , 0x7167 , 0x7f69 , 0x5146 , +0x8087 , 0x53ec , 0x906e , 0x6298 , +0x54f2 , 0x86f0 , 0x8f99 , 0x8005 , +0x9517 , 0x8517 , 0x8fd9 , 0x6d59 , +0x73cd , 0x659f , 0x771f , 0x7504 , +0x7827 , 0x81fb , 0x8d1e , 0x9488 , +0x4fa6 , 0x6795 , 0x75b9 , 0x8bca , +0x9707 , 0x632f , 0x9547 , 0x9635 , +0x84b8 , 0x6323 , 0x7741 , 0x5f81 , +0x72f0 , 0x4e89 , 0x6014 , 0x6574 , +0x62ef , 0x6b63 , 0x653f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5e27 , 0x75c7 , 0x90d1 , +0x8bc1 , 0x829d , 0x679d , 0x652f , +0x5431 , 0x8718 , 0x77e5 , 0x80a2 , +0x8102 , 0x6c41 , 0x4e4b , 0x7ec7 , +0x804c , 0x76f4 , 0x690d , 0x6b96 , +0x6267 , 0x503c , 0x4f84 , 0x5740 , +0x6307 , 0x6b62 , 0x8dbe , 0x53ea , +0x65e8 , 0x7eb8 , 0x5fd7 , 0x631a , +0x63b7 , 0x81f3 , 0x81f4 , 0x7f6e , +0x5e1c , 0x5cd9 , 0x5236 , 0x667a , +0x79e9 , 0x7a1a , 0x8d28 , 0x7099 , +0x75d4 , 0x6ede , 0x6cbb , 0x7a92 , +0x4e2d , 0x76c5 , 0x5fe0 , 0x949f , +0x8877 , 0x7ec8 , 0x79cd , 0x80bf , +0x91cd , 0x4ef2 , 0x4f17 , 0x821f , +0x5468 , 0x5dde , 0x6d32 , 0x8bcc , +0x7ca5 , 0x8f74 , 0x8098 , 0x5e1a , +0x5492 , 0x76b1 , 0x5b99 , 0x663c , +0x9aa4 , 0x73e0 , 0x682a , 0x86db , +0x6731 , 0x732a , 0x8bf8 , 0x8bdb , +0x9010 , 0x7af9 , 0x70db , 0x716e , +0x62c4 , 0x77a9 , 0x5631 , 0x4e3b , +0x8457 , 0x67f1 , 0x52a9 , 0x86c0 , +0x8d2e , 0x94f8 , 0x7b51 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4f4f , 0x6ce8 , 0x795d , +0x9a7b , 0x6293 , 0x722a , 0x62fd , +0x4e13 , 0x7816 , 0x8f6c , 0x64b0 , +0x8d5a , 0x7bc6 , 0x6869 , 0x5e84 , +0x88c5 , 0x5986 , 0x649e , 0x58ee , +0x72b6 , 0x690e , 0x9525 , 0x8ffd , +0x8d58 , 0x5760 , 0x7f00 , 0x8c06 , +0x51c6 , 0x6349 , 0x62d9 , 0x5353 , +0x684c , 0x7422 , 0x8301 , 0x914c , +0x5544 , 0x7740 , 0x707c , 0x6d4a , +0x5179 , 0x54a8 , 0x8d44 , 0x59ff , +0x6ecb , 0x6dc4 , 0x5b5c , 0x7d2b , +0x4ed4 , 0x7c7d , 0x6ed3 , 0x5b50 , +0x81ea , 0x6e0d , 0x5b57 , 0x9b03 , +0x68d5 , 0x8e2a , 0x5b97 , 0x7efc , +0x603b , 0x7eb5 , 0x90b9 , 0x8d70 , +0x594f , 0x63cd , 0x79df , 0x8db3 , +0x5352 , 0x65cf , 0x7956 , 0x8bc5 , +0x963b , 0x7ec4 , 0x94bb , 0x7e82 , +0x5634 , 0x9189 , 0x6700 , 0x7f6a , +0x5c0a , 0x9075 , 0x6628 , 0x5de6 , +0x4f50 , 0x67de , 0x505a , 0x4f5c , +0x5750 , 0x5ea7 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4e8d , 0x4e0c , 0x5140 , +0x4e10 , 0x5eff , 0x5345 , 0x4e15 , +0x4e98 , 0x4e1e , 0x9b32 , 0x5b6c , +0x5669 , 0x4e28 , 0x79ba , 0x4e3f , +0x5315 , 0x4e47 , 0x592d , 0x723b , +0x536e , 0x6c10 , 0x56df , 0x80e4 , +0x9997 , 0x6bd3 , 0x777e , 0x9f17 , +0x4e36 , 0x4e9f , 0x9f10 , 0x4e5c , +0x4e69 , 0x4e93 , 0x8288 , 0x5b5b , +0x556c , 0x560f , 0x4ec4 , 0x538d , +0x539d , 0x53a3 , 0x53a5 , 0x53ae , +0x9765 , 0x8d5d , 0x531a , 0x53f5 , +0x5326 , 0x532e , 0x533e , 0x8d5c , +0x5366 , 0x5363 , 0x5202 , 0x5208 , +0x520e , 0x522d , 0x5233 , 0x523f , +0x5240 , 0x524c , 0x525e , 0x5261 , +0x525c , 0x84af , 0x527d , 0x5282 , +0x5281 , 0x5290 , 0x5293 , 0x5182 , +0x7f54 , 0x4ebb , 0x4ec3 , 0x4ec9 , +0x4ec2 , 0x4ee8 , 0x4ee1 , 0x4eeb , +0x4ede , 0x4f1b , 0x4ef3 , 0x4f22 , +0x4f64 , 0x4ef5 , 0x4f25 , 0x4f27 , +0x4f09 , 0x4f2b , 0x4f5e , 0x4f67 , +0x6538 , 0x4f5a , 0x4f5d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x4f5f , 0x4f57 , 0x4f32 , +0x4f3d , 0x4f76 , 0x4f74 , 0x4f91 , +0x4f89 , 0x4f83 , 0x4f8f , 0x4f7e , +0x4f7b , 0x4faa , 0x4f7c , 0x4fac , +0x4f94 , 0x4fe6 , 0x4fe8 , 0x4fea , +0x4fc5 , 0x4fda , 0x4fe3 , 0x4fdc , +0x4fd1 , 0x4fdf , 0x4ff8 , 0x5029 , +0x504c , 0x4ff3 , 0x502c , 0x500f , +0x502e , 0x502d , 0x4ffe , 0x501c , +0x500c , 0x5025 , 0x5028 , 0x507e , +0x5043 , 0x5055 , 0x5048 , 0x504e , +0x506c , 0x507b , 0x50a5 , 0x50a7 , +0x50a9 , 0x50ba , 0x50d6 , 0x5106 , +0x50ed , 0x50ec , 0x50e6 , 0x50ee , +0x5107 , 0x510b , 0x4edd , 0x6c3d , +0x4f58 , 0x4f65 , 0x4fce , 0x9fa0 , +0x6c46 , 0x7c74 , 0x516e , 0x5dfd , +0x9ec9 , 0x9998 , 0x5181 , 0x5914 , +0x52f9 , 0x530d , 0x8a07 , 0x5310 , +0x51eb , 0x5919 , 0x5155 , 0x4ea0 , +0x5156 , 0x4eb3 , 0x886e , 0x88a4 , +0x4eb5 , 0x8114 , 0x88d2 , 0x7980 , +0x5b34 , 0x8803 , 0x7fb8 , 0x51ab , +0x51b1 , 0x51bd , 0x51bc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x51c7 , 0x5196 , 0x51a2 , +0x51a5 , 0x8ba0 , 0x8ba6 , 0x8ba7 , +0x8baa , 0x8bb4 , 0x8bb5 , 0x8bb7 , +0x8bc2 , 0x8bc3 , 0x8bcb , 0x8bcf , +0x8bce , 0x8bd2 , 0x8bd3 , 0x8bd4 , +0x8bd6 , 0x8bd8 , 0x8bd9 , 0x8bdc , +0x8bdf , 0x8be0 , 0x8be4 , 0x8be8 , +0x8be9 , 0x8bee , 0x8bf0 , 0x8bf3 , +0x8bf6 , 0x8bf9 , 0x8bfc , 0x8bff , +0x8c00 , 0x8c02 , 0x8c04 , 0x8c07 , +0x8c0c , 0x8c0f , 0x8c11 , 0x8c12 , +0x8c14 , 0x8c15 , 0x8c16 , 0x8c19 , +0x8c1b , 0x8c18 , 0x8c1d , 0x8c1f , +0x8c20 , 0x8c21 , 0x8c25 , 0x8c27 , +0x8c2a , 0x8c2b , 0x8c2e , 0x8c2f , +0x8c32 , 0x8c33 , 0x8c35 , 0x8c36 , +0x5369 , 0x537a , 0x961d , 0x9622 , +0x9621 , 0x9631 , 0x962a , 0x963d , +0x963c , 0x9642 , 0x9649 , 0x9654 , +0x965f , 0x9667 , 0x966c , 0x9672 , +0x9674 , 0x9688 , 0x968d , 0x9697 , +0x96b0 , 0x9097 , 0x909b , 0x909d , +0x9099 , 0x90ac , 0x90a1 , 0x90b4 , +0x90b3 , 0x90b6 , 0x90ba , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x90b8 , 0x90b0 , 0x90cf , +0x90c5 , 0x90be , 0x90d0 , 0x90c4 , +0x90c7 , 0x90d3 , 0x90e6 , 0x90e2 , +0x90dc , 0x90d7 , 0x90db , 0x90eb , +0x90ef , 0x90fe , 0x9104 , 0x9122 , +0x911e , 0x9123 , 0x9131 , 0x912f , +0x9139 , 0x9143 , 0x9146 , 0x520d , +0x5942 , 0x52a2 , 0x52ac , 0x52ad , +0x52be , 0x54ff , 0x52d0 , 0x52d6 , +0x52f0 , 0x53df , 0x71ee , 0x77cd , +0x5ef4 , 0x51f5 , 0x51fc , 0x9b2f , +0x53b6 , 0x5f01 , 0x755a , 0x5def , +0x574c , 0x57a9 , 0x57a1 , 0x587e , +0x58bc , 0x58c5 , 0x58d1 , 0x5729 , +0x572c , 0x572a , 0x5733 , 0x5739 , +0x572e , 0x572f , 0x575c , 0x573b , +0x5742 , 0x5769 , 0x5785 , 0x576b , +0x5786 , 0x577c , 0x577b , 0x5768 , +0x576d , 0x5776 , 0x5773 , 0x57ad , +0x57a4 , 0x578c , 0x57b2 , 0x57cf , +0x57a7 , 0x57b4 , 0x5793 , 0x57a0 , +0x57d5 , 0x57d8 , 0x57da , 0x57d9 , +0x57d2 , 0x57b8 , 0x57f4 , 0x57ef , +0x57f8 , 0x57e4 , 0x57dd , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x580b , 0x580d , 0x57fd , +0x57ed , 0x5800 , 0x581e , 0x5819 , +0x5844 , 0x5820 , 0x5865 , 0x586c , +0x5881 , 0x5889 , 0x589a , 0x5880 , +0x99a8 , 0x9f19 , 0x61ff , 0x8279 , +0x827d , 0x827f , 0x828f , 0x828a , +0x82a8 , 0x8284 , 0x828e , 0x8291 , +0x8297 , 0x8299 , 0x82ab , 0x82b8 , +0x82be , 0x82b0 , 0x82c8 , 0x82ca , +0x82e3 , 0x8298 , 0x82b7 , 0x82ae , +0x82cb , 0x82cc , 0x82c1 , 0x82a9 , +0x82b4 , 0x82a1 , 0x82aa , 0x829f , +0x82c4 , 0x82ce , 0x82a4 , 0x82e1 , +0x8309 , 0x82f7 , 0x82e4 , 0x830f , +0x8307 , 0x82dc , 0x82f4 , 0x82d2 , +0x82d8 , 0x830c , 0x82fb , 0x82d3 , +0x8311 , 0x831a , 0x8306 , 0x8314 , +0x8315 , 0x82e0 , 0x82d5 , 0x831c , +0x8351 , 0x835b , 0x835c , 0x8308 , +0x8392 , 0x833c , 0x8334 , 0x8331 , +0x839b , 0x835e , 0x832f , 0x834f , +0x8347 , 0x8343 , 0x835f , 0x8340 , +0x8317 , 0x8360 , 0x832d , 0x833a , +0x8333 , 0x8366 , 0x8365 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8368 , 0x831b , 0x8369 , +0x836c , 0x836a , 0x836d , 0x836e , +0x83b0 , 0x8378 , 0x83b3 , 0x83b4 , +0x83a0 , 0x83aa , 0x8393 , 0x839c , +0x8385 , 0x837c , 0x83b6 , 0x83a9 , +0x837d , 0x83b8 , 0x837b , 0x8398 , +0x839e , 0x83a8 , 0x83ba , 0x83bc , +0x83c1 , 0x8401 , 0x83e5 , 0x83d8 , +0x5807 , 0x8418 , 0x840b , 0x83dd , +0x83fd , 0x83d6 , 0x841c , 0x8438 , +0x8411 , 0x8406 , 0x83d4 , 0x83df , +0x840f , 0x8403 , 0x83f8 , 0x83f9 , +0x83ea , 0x83c5 , 0x83c0 , 0x8426 , +0x83f0 , 0x83e1 , 0x845c , 0x8451 , +0x845a , 0x8459 , 0x8473 , 0x8487 , +0x8488 , 0x847a , 0x8489 , 0x8478 , +0x843c , 0x8446 , 0x8469 , 0x8476 , +0x848c , 0x848e , 0x8431 , 0x846d , +0x84c1 , 0x84cd , 0x84d0 , 0x84e6 , +0x84bd , 0x84d3 , 0x84ca , 0x84bf , +0x84ba , 0x84e0 , 0x84a1 , 0x84b9 , +0x84b4 , 0x8497 , 0x84e5 , 0x84e3 , +0x850c , 0x750d , 0x8538 , 0x84f0 , +0x8539 , 0x851f , 0x853a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8556 , 0x853b , 0x84ff , +0x84fc , 0x8559 , 0x8548 , 0x8568 , +0x8564 , 0x855e , 0x857a , 0x77a2 , +0x8543 , 0x8572 , 0x857b , 0x85a4 , +0x85a8 , 0x8587 , 0x858f , 0x8579 , +0x85ae , 0x859c , 0x8585 , 0x85b9 , +0x85b7 , 0x85b0 , 0x85d3 , 0x85c1 , +0x85dc , 0x85ff , 0x8627 , 0x8605 , +0x8629 , 0x8616 , 0x863c , 0x5efe , +0x5f08 , 0x593c , 0x5941 , 0x8037 , +0x5955 , 0x595a , 0x5958 , 0x530f , +0x5c22 , 0x5c25 , 0x5c2c , 0x5c34 , +0x624c , 0x626a , 0x629f , 0x62bb , +0x62ca , 0x62da , 0x62d7 , 0x62ee , +0x6322 , 0x62f6 , 0x6339 , 0x634b , +0x6343 , 0x63ad , 0x63f6 , 0x6371 , +0x637a , 0x638e , 0x63b4 , 0x636d , +0x63ac , 0x638a , 0x6369 , 0x63ae , +0x63bc , 0x63f2 , 0x63f8 , 0x63e0 , +0x63ff , 0x63c4 , 0x63de , 0x63ce , +0x6452 , 0x63c6 , 0x63be , 0x6445 , +0x6441 , 0x640b , 0x641b , 0x6420 , +0x640c , 0x6426 , 0x6421 , 0x645e , +0x6484 , 0x646d , 0x6496 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x647a , 0x64b7 , 0x64b8 , +0x6499 , 0x64ba , 0x64c0 , 0x64d0 , +0x64d7 , 0x64e4 , 0x64e2 , 0x6509 , +0x6525 , 0x652e , 0x5f0b , 0x5fd2 , +0x7519 , 0x5f11 , 0x535f , 0x53f1 , +0x53fd , 0x53e9 , 0x53e8 , 0x53fb , +0x5412 , 0x5416 , 0x5406 , 0x544b , +0x5452 , 0x5453 , 0x5454 , 0x5456 , +0x5443 , 0x5421 , 0x5457 , 0x5459 , +0x5423 , 0x5432 , 0x5482 , 0x5494 , +0x5477 , 0x5471 , 0x5464 , 0x549a , +0x549b , 0x5484 , 0x5476 , 0x5466 , +0x549d , 0x54d0 , 0x54ad , 0x54c2 , +0x54b4 , 0x54d2 , 0x54a7 , 0x54a6 , +0x54d3 , 0x54d4 , 0x5472 , 0x54a3 , +0x54d5 , 0x54bb , 0x54bf , 0x54cc , +0x54d9 , 0x54da , 0x54dc , 0x54a9 , +0x54aa , 0x54a4 , 0x54dd , 0x54cf , +0x54de , 0x551b , 0x54e7 , 0x5520 , +0x54fd , 0x5514 , 0x54f3 , 0x5522 , +0x5523 , 0x550f , 0x5511 , 0x5527 , +0x552a , 0x5567 , 0x558f , 0x55b5 , +0x5549 , 0x556d , 0x5541 , 0x5555 , +0x553f , 0x5550 , 0x553c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5537 , 0x5556 , 0x5575 , +0x5576 , 0x5577 , 0x5533 , 0x5530 , +0x555c , 0x558b , 0x55d2 , 0x5583 , +0x55b1 , 0x55b9 , 0x5588 , 0x5581 , +0x559f , 0x557e , 0x55d6 , 0x5591 , +0x557b , 0x55df , 0x55bd , 0x55be , +0x5594 , 0x5599 , 0x55ea , 0x55f7 , +0x55c9 , 0x561f , 0x55d1 , 0x55eb , +0x55ec , 0x55d4 , 0x55e6 , 0x55dd , +0x55c4 , 0x55ef , 0x55e5 , 0x55f2 , +0x55f3 , 0x55cc , 0x55cd , 0x55e8 , +0x55f5 , 0x55e4 , 0x8f94 , 0x561e , +0x5608 , 0x560c , 0x5601 , 0x5624 , +0x5623 , 0x55fe , 0x5600 , 0x5627 , +0x562d , 0x5658 , 0x5639 , 0x5657 , +0x562c , 0x564d , 0x5662 , 0x5659 , +0x565c , 0x564c , 0x5654 , 0x5686 , +0x5664 , 0x5671 , 0x566b , 0x567b , +0x567c , 0x5685 , 0x5693 , 0x56af , +0x56d4 , 0x56d7 , 0x56dd , 0x56e1 , +0x56f5 , 0x56eb , 0x56f9 , 0x56ff , +0x5704 , 0x570a , 0x5709 , 0x571c , +0x5e0f , 0x5e19 , 0x5e14 , 0x5e11 , +0x5e31 , 0x5e3b , 0x5e3c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5e37 , 0x5e44 , 0x5e54 , +0x5e5b , 0x5e5e , 0x5e61 , 0x5c8c , +0x5c7a , 0x5c8d , 0x5c90 , 0x5c96 , +0x5c88 , 0x5c98 , 0x5c99 , 0x5c91 , +0x5c9a , 0x5c9c , 0x5cb5 , 0x5ca2 , +0x5cbd , 0x5cac , 0x5cab , 0x5cb1 , +0x5ca3 , 0x5cc1 , 0x5cb7 , 0x5cc4 , +0x5cd2 , 0x5ce4 , 0x5ccb , 0x5ce5 , +0x5d02 , 0x5d03 , 0x5d27 , 0x5d26 , +0x5d2e , 0x5d24 , 0x5d1e , 0x5d06 , +0x5d1b , 0x5d58 , 0x5d3e , 0x5d34 , +0x5d3d , 0x5d6c , 0x5d5b , 0x5d6f , +0x5d5d , 0x5d6b , 0x5d4b , 0x5d4a , +0x5d69 , 0x5d74 , 0x5d82 , 0x5d99 , +0x5d9d , 0x8c73 , 0x5db7 , 0x5dc5 , +0x5f73 , 0x5f77 , 0x5f82 , 0x5f87 , +0x5f89 , 0x5f8c , 0x5f95 , 0x5f99 , +0x5f9c , 0x5fa8 , 0x5fad , 0x5fb5 , +0x5fbc , 0x8862 , 0x5f61 , 0x72ad , +0x72b0 , 0x72b4 , 0x72b7 , 0x72b8 , +0x72c3 , 0x72c1 , 0x72ce , 0x72cd , +0x72d2 , 0x72e8 , 0x72ef , 0x72e9 , +0x72f2 , 0x72f4 , 0x72f7 , 0x7301 , +0x72f3 , 0x7303 , 0x72fa , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x72fb , 0x7317 , 0x7313 , +0x7321 , 0x730a , 0x731e , 0x731d , +0x7315 , 0x7322 , 0x7339 , 0x7325 , +0x732c , 0x7338 , 0x7331 , 0x7350 , +0x734d , 0x7357 , 0x7360 , 0x736c , +0x736f , 0x737e , 0x821b , 0x5925 , +0x98e7 , 0x5924 , 0x5902 , 0x9963 , +0x9967 , 0x9968 , 0x9969 , 0x996a , +0x996b , 0x996c , 0x9974 , 0x9977 , +0x997d , 0x9980 , 0x9984 , 0x9987 , +0x998a , 0x998d , 0x9990 , 0x9991 , +0x9993 , 0x9994 , 0x9995 , 0x5e80 , +0x5e91 , 0x5e8b , 0x5e96 , 0x5ea5 , +0x5ea0 , 0x5eb9 , 0x5eb5 , 0x5ebe , +0x5eb3 , 0x8d53 , 0x5ed2 , 0x5ed1 , +0x5edb , 0x5ee8 , 0x5eea , 0x81ba , +0x5fc4 , 0x5fc9 , 0x5fd6 , 0x5fcf , +0x6003 , 0x5fee , 0x6004 , 0x5fe1 , +0x5fe4 , 0x5ffe , 0x6005 , 0x6006 , +0x5fea , 0x5fed , 0x5ff8 , 0x6019 , +0x6035 , 0x6026 , 0x601b , 0x600f , +0x600d , 0x6029 , 0x602b , 0x600a , +0x603f , 0x6021 , 0x6078 , 0x6079 , +0x607b , 0x607a , 0x6042 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x606a , 0x607d , 0x6096 , +0x609a , 0x60ad , 0x609d , 0x6083 , +0x6092 , 0x608c , 0x609b , 0x60ec , +0x60bb , 0x60b1 , 0x60dd , 0x60d8 , +0x60c6 , 0x60da , 0x60b4 , 0x6120 , +0x6126 , 0x6115 , 0x6123 , 0x60f4 , +0x6100 , 0x610e , 0x612b , 0x614a , +0x6175 , 0x61ac , 0x6194 , 0x61a7 , +0x61b7 , 0x61d4 , 0x61f5 , 0x5fdd , +0x96b3 , 0x95e9 , 0x95eb , 0x95f1 , +0x95f3 , 0x95f5 , 0x95f6 , 0x95fc , +0x95fe , 0x9603 , 0x9604 , 0x9606 , +0x9608 , 0x960a , 0x960b , 0x960c , +0x960d , 0x960f , 0x9612 , 0x9615 , +0x9616 , 0x9617 , 0x9619 , 0x961a , +0x4e2c , 0x723f , 0x6215 , 0x6c35 , +0x6c54 , 0x6c5c , 0x6c4a , 0x6ca3 , +0x6c85 , 0x6c90 , 0x6c94 , 0x6c8c , +0x6c68 , 0x6c69 , 0x6c74 , 0x6c76 , +0x6c86 , 0x6ca9 , 0x6cd0 , 0x6cd4 , +0x6cad , 0x6cf7 , 0x6cf8 , 0x6cf1 , +0x6cd7 , 0x6cb2 , 0x6ce0 , 0x6cd6 , +0x6cfa , 0x6ceb , 0x6cee , 0x6cb1 , +0x6cd3 , 0x6cef , 0x6cfe , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6d39 , 0x6d27 , 0x6d0c , +0x6d43 , 0x6d48 , 0x6d07 , 0x6d04 , +0x6d19 , 0x6d0e , 0x6d2b , 0x6d4d , +0x6d2e , 0x6d35 , 0x6d1a , 0x6d4f , +0x6d52 , 0x6d54 , 0x6d33 , 0x6d91 , +0x6d6f , 0x6d9e , 0x6da0 , 0x6d5e , +0x6d93 , 0x6d94 , 0x6d5c , 0x6d60 , +0x6d7c , 0x6d63 , 0x6e1a , 0x6dc7 , +0x6dc5 , 0x6dde , 0x6e0e , 0x6dbf , +0x6de0 , 0x6e11 , 0x6de6 , 0x6ddd , +0x6dd9 , 0x6e16 , 0x6dab , 0x6e0c , +0x6dae , 0x6e2b , 0x6e6e , 0x6e4e , +0x6e6b , 0x6eb2 , 0x6e5f , 0x6e86 , +0x6e53 , 0x6e54 , 0x6e32 , 0x6e25 , +0x6e44 , 0x6edf , 0x6eb1 , 0x6e98 , +0x6ee0 , 0x6f2d , 0x6ee2 , 0x6ea5 , +0x6ea7 , 0x6ebd , 0x6ebb , 0x6eb7 , +0x6ed7 , 0x6eb4 , 0x6ecf , 0x6e8f , +0x6ec2 , 0x6e9f , 0x6f62 , 0x6f46 , +0x6f47 , 0x6f24 , 0x6f15 , 0x6ef9 , +0x6f2f , 0x6f36 , 0x6f4b , 0x6f74 , +0x6f2a , 0x6f09 , 0x6f29 , 0x6f89 , +0x6f8d , 0x6f8c , 0x6f78 , 0x6f72 , +0x6f7c , 0x6f7a , 0x6fd1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6fc9 , 0x6fa7 , 0x6fb9 , +0x6fb6 , 0x6fc2 , 0x6fe1 , 0x6fee , +0x6fde , 0x6fe0 , 0x6fef , 0x701a , +0x7023 , 0x701b , 0x7039 , 0x7035 , +0x704f , 0x705e , 0x5b80 , 0x5b84 , +0x5b95 , 0x5b93 , 0x5ba5 , 0x5bb8 , +0x752f , 0x9a9e , 0x6434 , 0x5be4 , +0x5bee , 0x8930 , 0x5bf0 , 0x8e47 , +0x8b07 , 0x8fb6 , 0x8fd3 , 0x8fd5 , +0x8fe5 , 0x8fee , 0x8fe4 , 0x8fe9 , +0x8fe6 , 0x8ff3 , 0x8fe8 , 0x9005 , +0x9004 , 0x900b , 0x9026 , 0x9011 , +0x900d , 0x9016 , 0x9021 , 0x9035 , +0x9036 , 0x902d , 0x902f , 0x9044 , +0x9051 , 0x9052 , 0x9050 , 0x9068 , +0x9058 , 0x9062 , 0x905b , 0x66b9 , +0x9074 , 0x907d , 0x9082 , 0x9088 , +0x9083 , 0x908b , 0x5f50 , 0x5f57 , +0x5f56 , 0x5f58 , 0x5c3b , 0x54ab , +0x5c50 , 0x5c59 , 0x5b71 , 0x5c63 , +0x5c66 , 0x7fbc , 0x5f2a , 0x5f29 , +0x5f2d , 0x8274 , 0x5f3c , 0x9b3b , +0x5c6e , 0x5981 , 0x5983 , 0x598d , +0x59a9 , 0x59aa , 0x59a3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x5997 , 0x59ca , 0x59ab , +0x599e , 0x59a4 , 0x59d2 , 0x59b2 , +0x59af , 0x59d7 , 0x59be , 0x5a05 , +0x5a06 , 0x59dd , 0x5a08 , 0x59e3 , +0x59d8 , 0x59f9 , 0x5a0c , 0x5a09 , +0x5a32 , 0x5a34 , 0x5a11 , 0x5a23 , +0x5a13 , 0x5a40 , 0x5a67 , 0x5a4a , +0x5a55 , 0x5a3c , 0x5a62 , 0x5a75 , +0x80ec , 0x5aaa , 0x5a9b , 0x5a77 , +0x5a7a , 0x5abe , 0x5aeb , 0x5ab2 , +0x5ad2 , 0x5ad4 , 0x5ab8 , 0x5ae0 , +0x5ae3 , 0x5af1 , 0x5ad6 , 0x5ae6 , +0x5ad8 , 0x5adc , 0x5b09 , 0x5b17 , +0x5b16 , 0x5b32 , 0x5b37 , 0x5b40 , +0x5c15 , 0x5c1c , 0x5b5a , 0x5b65 , +0x5b73 , 0x5b51 , 0x5b53 , 0x5b62 , +0x9a75 , 0x9a77 , 0x9a78 , 0x9a7a , +0x9a7f , 0x9a7d , 0x9a80 , 0x9a81 , +0x9a85 , 0x9a88 , 0x9a8a , 0x9a90 , +0x9a92 , 0x9a93 , 0x9a96 , 0x9a98 , +0x9a9b , 0x9a9c , 0x9a9d , 0x9a9f , +0x9aa0 , 0x9aa2 , 0x9aa3 , 0x9aa5 , +0x9aa7 , 0x7e9f , 0x7ea1 , 0x7ea3 , +0x7ea5 , 0x7ea8 , 0x7ea9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7ead , 0x7eb0 , 0x7ebe , +0x7ec0 , 0x7ec1 , 0x7ec2 , 0x7ec9 , +0x7ecb , 0x7ecc , 0x7ed0 , 0x7ed4 , +0x7ed7 , 0x7edb , 0x7ee0 , 0x7ee1 , +0x7ee8 , 0x7eeb , 0x7eee , 0x7eef , +0x7ef1 , 0x7ef2 , 0x7f0d , 0x7ef6 , +0x7efa , 0x7efb , 0x7efe , 0x7f01 , +0x7f02 , 0x7f03 , 0x7f07 , 0x7f08 , +0x7f0b , 0x7f0c , 0x7f0f , 0x7f11 , +0x7f12 , 0x7f17 , 0x7f19 , 0x7f1c , +0x7f1b , 0x7f1f , 0x7f21 , 0x7f22 , +0x7f23 , 0x7f24 , 0x7f25 , 0x7f26 , +0x7f27 , 0x7f2a , 0x7f2b , 0x7f2c , +0x7f2d , 0x7f2f , 0x7f30 , 0x7f31 , +0x7f32 , 0x7f33 , 0x7f35 , 0x5e7a , +0x757f , 0x5ddb , 0x753e , 0x9095 , +0x738e , 0x7391 , 0x73ae , 0x73a2 , +0x739f , 0x73cf , 0x73c2 , 0x73d1 , +0x73b7 , 0x73b3 , 0x73c0 , 0x73c9 , +0x73c8 , 0x73e5 , 0x73d9 , 0x987c , +0x740a , 0x73e9 , 0x73e7 , 0x73de , +0x73ba , 0x73f2 , 0x740f , 0x742a , +0x745b , 0x7426 , 0x7425 , 0x7428 , +0x7430 , 0x742e , 0x742c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x741b , 0x741a , 0x7441 , +0x745c , 0x7457 , 0x7455 , 0x7459 , +0x7477 , 0x746d , 0x747e , 0x749c , +0x748e , 0x7480 , 0x7481 , 0x7487 , +0x748b , 0x749e , 0x74a8 , 0x74a9 , +0x7490 , 0x74a7 , 0x74d2 , 0x74ba , +0x97ea , 0x97eb , 0x97ec , 0x674c , +0x6753 , 0x675e , 0x6748 , 0x6769 , +0x67a5 , 0x6787 , 0x676a , 0x6773 , +0x6798 , 0x67a7 , 0x6775 , 0x67a8 , +0x679e , 0x67ad , 0x678b , 0x6777 , +0x677c , 0x67f0 , 0x6809 , 0x67d8 , +0x680a , 0x67e9 , 0x67b0 , 0x680c , +0x67d9 , 0x67b5 , 0x67da , 0x67b3 , +0x67dd , 0x6800 , 0x67c3 , 0x67b8 , +0x67e2 , 0x680e , 0x67c1 , 0x67fd , +0x6832 , 0x6833 , 0x6860 , 0x6861 , +0x684e , 0x6862 , 0x6844 , 0x6864 , +0x6883 , 0x681d , 0x6855 , 0x6866 , +0x6841 , 0x6867 , 0x6840 , 0x683e , +0x684a , 0x6849 , 0x6829 , 0x68b5 , +0x688f , 0x6874 , 0x6877 , 0x6893 , +0x686b , 0x68c2 , 0x696e , 0x68fc , +0x691f , 0x6920 , 0x68f9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x6924 , 0x68f0 , 0x690b , +0x6901 , 0x6957 , 0x68e3 , 0x6910 , +0x6971 , 0x6939 , 0x6960 , 0x6942 , +0x695d , 0x6984 , 0x696b , 0x6980 , +0x6998 , 0x6978 , 0x6934 , 0x69cc , +0x6987 , 0x6988 , 0x69ce , 0x6989 , +0x6966 , 0x6963 , 0x6979 , 0x699b , +0x69a7 , 0x69bb , 0x69ab , 0x69ad , +0x69d4 , 0x69b1 , 0x69c1 , 0x69ca , +0x69df , 0x6995 , 0x69e0 , 0x698d , +0x69ff , 0x6a2f , 0x69ed , 0x6a17 , +0x6a18 , 0x6a65 , 0x69f2 , 0x6a44 , +0x6a3e , 0x6aa0 , 0x6a50 , 0x6a5b , +0x6a35 , 0x6a8e , 0x6a79 , 0x6a3d , +0x6a28 , 0x6a58 , 0x6a7c , 0x6a91 , +0x6a90 , 0x6aa9 , 0x6a97 , 0x6aab , +0x7337 , 0x7352 , 0x6b81 , 0x6b82 , +0x6b87 , 0x6b84 , 0x6b92 , 0x6b93 , +0x6b8d , 0x6b9a , 0x6b9b , 0x6ba1 , +0x6baa , 0x8f6b , 0x8f6d , 0x8f71 , +0x8f72 , 0x8f73 , 0x8f75 , 0x8f76 , +0x8f78 , 0x8f77 , 0x8f79 , 0x8f7a , +0x8f7c , 0x8f7e , 0x8f81 , 0x8f82 , +0x8f84 , 0x8f87 , 0x8f8b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8f8d , 0x8f8e , 0x8f8f , +0x8f98 , 0x8f9a , 0x8ece , 0x620b , +0x6217 , 0x621b , 0x621f , 0x6222 , +0x6221 , 0x6225 , 0x6224 , 0x622c , +0x81e7 , 0x74ef , 0x74f4 , 0x74ff , +0x750f , 0x7511 , 0x7513 , 0x6534 , +0x65ee , 0x65ef , 0x65f0 , 0x660a , +0x6619 , 0x6772 , 0x6603 , 0x6615 , +0x6600 , 0x7085 , 0x66f7 , 0x661d , +0x6634 , 0x6631 , 0x6636 , 0x6635 , +0x8006 , 0x665f , 0x6654 , 0x6641 , +0x664f , 0x6656 , 0x6661 , 0x6657 , +0x6677 , 0x6684 , 0x668c , 0x66a7 , +0x669d , 0x66be , 0x66db , 0x66dc , +0x66e6 , 0x66e9 , 0x8d32 , 0x8d33 , +0x8d36 , 0x8d3b , 0x8d3d , 0x8d40 , +0x8d45 , 0x8d46 , 0x8d48 , 0x8d49 , +0x8d47 , 0x8d4d , 0x8d55 , 0x8d59 , +0x89c7 , 0x89ca , 0x89cb , 0x89cc , +0x89ce , 0x89cf , 0x89d0 , 0x89d1 , +0x726e , 0x729f , 0x725d , 0x7266 , +0x726f , 0x727e , 0x727f , 0x7284 , +0x728b , 0x728d , 0x728f , 0x7292 , +0x6308 , 0x6332 , 0x63b0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x643f , 0x64d8 , 0x8004 , +0x6bea , 0x6bf3 , 0x6bfd , 0x6bf5 , +0x6bf9 , 0x6c05 , 0x6c07 , 0x6c06 , +0x6c0d , 0x6c15 , 0x6c18 , 0x6c19 , +0x6c1a , 0x6c21 , 0x6c29 , 0x6c24 , +0x6c2a , 0x6c32 , 0x6535 , 0x6555 , +0x656b , 0x724d , 0x7252 , 0x7256 , +0x7230 , 0x8662 , 0x5216 , 0x809f , +0x809c , 0x8093 , 0x80bc , 0x670a , +0x80bd , 0x80b1 , 0x80ab , 0x80ad , +0x80b4 , 0x80b7 , 0x80e7 , 0x80e8 , +0x80e9 , 0x80ea , 0x80db , 0x80c2 , +0x80c4 , 0x80d9 , 0x80cd , 0x80d7 , +0x6710 , 0x80dd , 0x80eb , 0x80f1 , +0x80f4 , 0x80ed , 0x810d , 0x810e , +0x80f2 , 0x80fc , 0x6715 , 0x8112 , +0x8c5a , 0x8136 , 0x811e , 0x812c , +0x8118 , 0x8132 , 0x8148 , 0x814c , +0x8153 , 0x8174 , 0x8159 , 0x815a , +0x8171 , 0x8160 , 0x8169 , 0x817c , +0x817d , 0x816d , 0x8167 , 0x584d , +0x5ab5 , 0x8188 , 0x8182 , 0x8191 , +0x6ed5 , 0x81a3 , 0x81aa , 0x81cc , +0x6726 , 0x81ca , 0x81bb , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x81c1 , 0x81a6 , 0x6b24 , +0x6b37 , 0x6b39 , 0x6b43 , 0x6b46 , +0x6b59 , 0x98d1 , 0x98d2 , 0x98d3 , +0x98d5 , 0x98d9 , 0x98da , 0x6bb3 , +0x5f40 , 0x6bc2 , 0x89f3 , 0x6590 , +0x9f51 , 0x6593 , 0x65bc , 0x65c6 , +0x65c4 , 0x65c3 , 0x65cc , 0x65ce , +0x65d2 , 0x65d6 , 0x7080 , 0x709c , +0x7096 , 0x709d , 0x70bb , 0x70c0 , +0x70b7 , 0x70ab , 0x70b1 , 0x70e8 , +0x70ca , 0x7110 , 0x7113 , 0x7116 , +0x712f , 0x7131 , 0x7173 , 0x715c , +0x7168 , 0x7145 , 0x7172 , 0x714a , +0x7178 , 0x717a , 0x7198 , 0x71b3 , +0x71b5 , 0x71a8 , 0x71a0 , 0x71e0 , +0x71d4 , 0x71e7 , 0x71f9 , 0x721d , +0x7228 , 0x706c , 0x7118 , 0x7166 , +0x71b9 , 0x623e , 0x623d , 0x6243 , +0x6248 , 0x6249 , 0x793b , 0x7940 , +0x7946 , 0x7949 , 0x795b , 0x795c , +0x7953 , 0x795a , 0x7962 , 0x7957 , +0x7960 , 0x796f , 0x7967 , 0x797a , +0x7985 , 0x798a , 0x799a , 0x79a7 , +0x79b3 , 0x5fd1 , 0x5fd0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x603c , 0x605d , 0x605a , +0x6067 , 0x6041 , 0x6059 , 0x6063 , +0x60ab , 0x6106 , 0x610d , 0x615d , +0x61a9 , 0x619d , 0x61cb , 0x61d1 , +0x6206 , 0x8080 , 0x807f , 0x6c93 , +0x6cf6 , 0x6dfc , 0x77f6 , 0x77f8 , +0x7800 , 0x7809 , 0x7817 , 0x7818 , +0x7811 , 0x65ab , 0x782d , 0x781c , +0x781d , 0x7839 , 0x783a , 0x783b , +0x781f , 0x783c , 0x7825 , 0x782c , +0x7823 , 0x7829 , 0x784e , 0x786d , +0x7856 , 0x7857 , 0x7826 , 0x7850 , +0x7847 , 0x784c , 0x786a , 0x789b , +0x7893 , 0x789a , 0x7887 , 0x789c , +0x78a1 , 0x78a3 , 0x78b2 , 0x78b9 , +0x78a5 , 0x78d4 , 0x78d9 , 0x78c9 , +0x78ec , 0x78f2 , 0x7905 , 0x78f4 , +0x7913 , 0x7924 , 0x791e , 0x7934 , +0x9f9b , 0x9ef9 , 0x9efb , 0x9efc , +0x76f1 , 0x7704 , 0x770d , 0x76f9 , +0x7707 , 0x7708 , 0x771a , 0x7722 , +0x7719 , 0x772d , 0x7726 , 0x7735 , +0x7738 , 0x7750 , 0x7751 , 0x7747 , +0x7743 , 0x775a , 0x7768 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7762 , 0x7765 , 0x777f , +0x778d , 0x777d , 0x7780 , 0x778c , +0x7791 , 0x779f , 0x77a0 , 0x77b0 , +0x77b5 , 0x77bd , 0x753a , 0x7540 , +0x754e , 0x754b , 0x7548 , 0x755b , +0x7572 , 0x7579 , 0x7583 , 0x7f58 , +0x7f61 , 0x7f5f , 0x8a48 , 0x7f68 , +0x7f74 , 0x7f71 , 0x7f79 , 0x7f81 , +0x7f7e , 0x76cd , 0x76e5 , 0x8832 , +0x9485 , 0x9486 , 0x9487 , 0x948b , +0x948a , 0x948c , 0x948d , 0x948f , +0x9490 , 0x9494 , 0x9497 , 0x9495 , +0x949a , 0x949b , 0x949c , 0x94a3 , +0x94a4 , 0x94ab , 0x94aa , 0x94ad , +0x94ac , 0x94af , 0x94b0 , 0x94b2 , +0x94b4 , 0x94b6 , 0x94b7 , 0x94b8 , +0x94b9 , 0x94ba , 0x94bc , 0x94bd , +0x94bf , 0x94c4 , 0x94c8 , 0x94c9 , +0x94ca , 0x94cb , 0x94cc , 0x94cd , +0x94ce , 0x94d0 , 0x94d1 , 0x94d2 , +0x94d5 , 0x94d6 , 0x94d7 , 0x94d9 , +0x94d8 , 0x94db , 0x94de , 0x94df , +0x94e0 , 0x94e2 , 0x94e4 , 0x94e5 , +0x94e7 , 0x94e8 , 0x94ea , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x94e9 , 0x94eb , 0x94ee , +0x94ef , 0x94f3 , 0x94f4 , 0x94f5 , +0x94f7 , 0x94f9 , 0x94fc , 0x94fd , +0x94ff , 0x9503 , 0x9502 , 0x9506 , +0x9507 , 0x9509 , 0x950a , 0x950d , +0x950e , 0x950f , 0x9512 , 0x9513 , +0x9514 , 0x9515 , 0x9516 , 0x9518 , +0x951b , 0x951d , 0x951e , 0x951f , +0x9522 , 0x952a , 0x952b , 0x9529 , +0x952c , 0x9531 , 0x9532 , 0x9534 , +0x9536 , 0x9537 , 0x9538 , 0x953c , +0x953e , 0x953f , 0x9542 , 0x9535 , +0x9544 , 0x9545 , 0x9546 , 0x9549 , +0x954c , 0x954e , 0x954f , 0x9552 , +0x9553 , 0x9554 , 0x9556 , 0x9557 , +0x9558 , 0x9559 , 0x955b , 0x955e , +0x955f , 0x955d , 0x9561 , 0x9562 , +0x9564 , 0x9565 , 0x9566 , 0x9567 , +0x9568 , 0x9569 , 0x956a , 0x956b , +0x956c , 0x956f , 0x9571 , 0x9572 , +0x9573 , 0x953a , 0x77e7 , 0x77ec , +0x96c9 , 0x79d5 , 0x79ed , 0x79e3 , +0x79eb , 0x7a06 , 0x5d47 , 0x7a03 , +0x7a02 , 0x7a1e , 0x7a14 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7a39 , 0x7a37 , 0x7a51 , +0x9ecf , 0x99a5 , 0x7a70 , 0x7688 , +0x768e , 0x7693 , 0x7699 , 0x76a4 , +0x74de , 0x74e0 , 0x752c , 0x9e20 , +0x9e22 , 0x9e28 , 0x9e29 , 0x9e2a , +0x9e2b , 0x9e2c , 0x9e32 , 0x9e31 , +0x9e36 , 0x9e38 , 0x9e37 , 0x9e39 , +0x9e3a , 0x9e3e , 0x9e41 , 0x9e42 , +0x9e44 , 0x9e46 , 0x9e47 , 0x9e48 , +0x9e49 , 0x9e4b , 0x9e4c , 0x9e4e , +0x9e51 , 0x9e55 , 0x9e57 , 0x9e5a , +0x9e5b , 0x9e5c , 0x9e5e , 0x9e63 , +0x9e66 , 0x9e67 , 0x9e68 , 0x9e69 , +0x9e6a , 0x9e6b , 0x9e6c , 0x9e71 , +0x9e6d , 0x9e73 , 0x7592 , 0x7594 , +0x7596 , 0x75a0 , 0x759d , 0x75ac , +0x75a3 , 0x75b3 , 0x75b4 , 0x75b8 , +0x75c4 , 0x75b1 , 0x75b0 , 0x75c3 , +0x75c2 , 0x75d6 , 0x75cd , 0x75e3 , +0x75e8 , 0x75e6 , 0x75e4 , 0x75eb , +0x75e7 , 0x7603 , 0x75f1 , 0x75fc , +0x75ff , 0x7610 , 0x7600 , 0x7605 , +0x760c , 0x7617 , 0x760a , 0x7625 , +0x7618 , 0x7615 , 0x7619 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x761b , 0x763c , 0x7622 , +0x7620 , 0x7640 , 0x762d , 0x7630 , +0x763f , 0x7635 , 0x7643 , 0x763e , +0x7633 , 0x764d , 0x765e , 0x7654 , +0x765c , 0x7656 , 0x766b , 0x766f , +0x7fca , 0x7ae6 , 0x7a78 , 0x7a79 , +0x7a80 , 0x7a86 , 0x7a88 , 0x7a95 , +0x7aa6 , 0x7aa0 , 0x7aac , 0x7aa8 , +0x7aad , 0x7ab3 , 0x8864 , 0x8869 , +0x8872 , 0x887d , 0x887f , 0x8882 , +0x88a2 , 0x88c6 , 0x88b7 , 0x88bc , +0x88c9 , 0x88e2 , 0x88ce , 0x88e3 , +0x88e5 , 0x88f1 , 0x891a , 0x88fc , +0x88e8 , 0x88fe , 0x88f0 , 0x8921 , +0x8919 , 0x8913 , 0x891b , 0x890a , +0x8934 , 0x892b , 0x8936 , 0x8941 , +0x8966 , 0x897b , 0x758b , 0x80e5 , +0x76b2 , 0x76b4 , 0x77dc , 0x8012 , +0x8014 , 0x8016 , 0x801c , 0x8020 , +0x8022 , 0x8025 , 0x8026 , 0x8027 , +0x8029 , 0x8028 , 0x8031 , 0x800b , +0x8035 , 0x8043 , 0x8046 , 0x804d , +0x8052 , 0x8069 , 0x8071 , 0x8983 , +0x9878 , 0x9880 , 0x9883 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9889 , 0x988c , 0x988d , +0x988f , 0x9894 , 0x989a , 0x989b , +0x989e , 0x989f , 0x98a1 , 0x98a2 , +0x98a5 , 0x98a6 , 0x864d , 0x8654 , +0x866c , 0x866e , 0x867f , 0x867a , +0x867c , 0x867b , 0x86a8 , 0x868d , +0x868b , 0x86ac , 0x869d , 0x86a7 , +0x86a3 , 0x86aa , 0x8693 , 0x86a9 , +0x86b6 , 0x86c4 , 0x86b5 , 0x86ce , +0x86b0 , 0x86ba , 0x86b1 , 0x86af , +0x86c9 , 0x86cf , 0x86b4 , 0x86e9 , +0x86f1 , 0x86f2 , 0x86ed , 0x86f3 , +0x86d0 , 0x8713 , 0x86de , 0x86f4 , +0x86df , 0x86d8 , 0x86d1 , 0x8703 , +0x8707 , 0x86f8 , 0x8708 , 0x870a , +0x870d , 0x8709 , 0x8723 , 0x873b , +0x871e , 0x8725 , 0x872e , 0x871a , +0x873e , 0x8748 , 0x8734 , 0x8731 , +0x8729 , 0x8737 , 0x873f , 0x8782 , +0x8722 , 0x877d , 0x877e , 0x877b , +0x8760 , 0x8770 , 0x874c , 0x876e , +0x878b , 0x8753 , 0x8763 , 0x877c , +0x8764 , 0x8759 , 0x8765 , 0x8793 , +0x87af , 0x87a8 , 0x87d2 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x87c6 , 0x8788 , 0x8785 , +0x87ad , 0x8797 , 0x8783 , 0x87ab , +0x87e5 , 0x87ac , 0x87b5 , 0x87b3 , +0x87cb , 0x87d3 , 0x87bd , 0x87d1 , +0x87c0 , 0x87ca , 0x87db , 0x87ea , +0x87e0 , 0x87ee , 0x8816 , 0x8813 , +0x87fe , 0x880a , 0x881b , 0x8821 , +0x8839 , 0x883c , 0x7f36 , 0x7f42 , +0x7f44 , 0x7f45 , 0x8210 , 0x7afa , +0x7afd , 0x7b08 , 0x7b03 , 0x7b04 , +0x7b15 , 0x7b0a , 0x7b2b , 0x7b0f , +0x7b47 , 0x7b38 , 0x7b2a , 0x7b19 , +0x7b2e , 0x7b31 , 0x7b20 , 0x7b25 , +0x7b24 , 0x7b33 , 0x7b3e , 0x7b1e , +0x7b58 , 0x7b5a , 0x7b45 , 0x7b75 , +0x7b4c , 0x7b5d , 0x7b60 , 0x7b6e , +0x7b7b , 0x7b62 , 0x7b72 , 0x7b71 , +0x7b90 , 0x7ba6 , 0x7ba7 , 0x7bb8 , +0x7bac , 0x7b9d , 0x7ba8 , 0x7b85 , +0x7baa , 0x7b9c , 0x7ba2 , 0x7bab , +0x7bb4 , 0x7bd1 , 0x7bc1 , 0x7bcc , +0x7bdd , 0x7bda , 0x7be5 , 0x7be6 , +0x7bea , 0x7c0c , 0x7bfe , 0x7bfc , +0x7c0f , 0x7c16 , 0x7c0b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x7c1f , 0x7c2a , 0x7c26 , +0x7c38 , 0x7c41 , 0x7c40 , 0x81fe , +0x8201 , 0x8202 , 0x8204 , 0x81ec , +0x8844 , 0x8221 , 0x8222 , 0x8223 , +0x822d , 0x822f , 0x8228 , 0x822b , +0x8238 , 0x823b , 0x8233 , 0x8234 , +0x823e , 0x8244 , 0x8249 , 0x824b , +0x824f , 0x825a , 0x825f , 0x8268 , +0x887e , 0x8885 , 0x8888 , 0x88d8 , +0x88df , 0x895e , 0x7f9d , 0x7f9f , +0x7fa7 , 0x7faf , 0x7fb0 , 0x7fb2 , +0x7c7c , 0x6549 , 0x7c91 , 0x7c9d , +0x7c9c , 0x7c9e , 0x7ca2 , 0x7cb2 , +0x7cbc , 0x7cbd , 0x7cc1 , 0x7cc7 , +0x7ccc , 0x7ccd , 0x7cc8 , 0x7cc5 , +0x7cd7 , 0x7ce8 , 0x826e , 0x66a8 , +0x7fbf , 0x7fce , 0x7fd5 , 0x7fe5 , +0x7fe1 , 0x7fe6 , 0x7fe9 , 0x7fee , +0x7ff3 , 0x7cf8 , 0x7d77 , 0x7da6 , +0x7dae , 0x7e47 , 0x7e9b , 0x9eb8 , +0x9eb4 , 0x8d73 , 0x8d84 , 0x8d94 , +0x8d91 , 0x8db1 , 0x8d67 , 0x8d6d , +0x8c47 , 0x8c49 , 0x914a , 0x9150 , +0x914e , 0x914f , 0x9164 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9162 , 0x9161 , 0x9170 , +0x9169 , 0x916f , 0x917d , 0x917e , +0x9172 , 0x9174 , 0x9179 , 0x918c , +0x9185 , 0x9190 , 0x918d , 0x9191 , +0x91a2 , 0x91a3 , 0x91aa , 0x91ad , +0x91ae , 0x91af , 0x91b5 , 0x91b4 , +0x91ba , 0x8c55 , 0x9e7e , 0x8db8 , +0x8deb , 0x8e05 , 0x8e59 , 0x8e69 , +0x8db5 , 0x8dbf , 0x8dbc , 0x8dba , +0x8dc4 , 0x8dd6 , 0x8dd7 , 0x8dda , +0x8dde , 0x8dce , 0x8dcf , 0x8ddb , +0x8dc6 , 0x8dec , 0x8df7 , 0x8df8 , +0x8de3 , 0x8df9 , 0x8dfb , 0x8de4 , +0x8e09 , 0x8dfd , 0x8e14 , 0x8e1d , +0x8e1f , 0x8e2c , 0x8e2e , 0x8e23 , +0x8e2f , 0x8e3a , 0x8e40 , 0x8e39 , +0x8e35 , 0x8e3d , 0x8e31 , 0x8e49 , +0x8e41 , 0x8e42 , 0x8e51 , 0x8e52 , +0x8e4a , 0x8e70 , 0x8e76 , 0x8e7c , +0x8e6f , 0x8e74 , 0x8e85 , 0x8e8f , +0x8e94 , 0x8e90 , 0x8e9c , 0x8e9e , +0x8c78 , 0x8c82 , 0x8c8a , 0x8c85 , +0x8c98 , 0x8c94 , 0x659b , 0x89d6 , +0x89de , 0x89da , 0x89dc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x89e5 , 0x89eb , 0x89ef , +0x8a3e , 0x8b26 , 0x9753 , 0x96e9 , +0x96f3 , 0x96ef , 0x9706 , 0x9701 , +0x9708 , 0x970f , 0x970e , 0x972a , +0x972d , 0x9730 , 0x973e , 0x9f80 , +0x9f83 , 0x9f85 , 0x9f86 , 0x9f87 , +0x9f88 , 0x9f89 , 0x9f8a , 0x9f8c , +0x9efe , 0x9f0b , 0x9f0d , 0x96b9 , +0x96bc , 0x96bd , 0x96ce , 0x96d2 , +0x77bf , 0x96e0 , 0x928e , 0x92ae , +0x92c8 , 0x933e , 0x936a , 0x93ca , +0x938f , 0x943e , 0x946b , 0x9c7f , +0x9c82 , 0x9c85 , 0x9c86 , 0x9c87 , +0x9c88 , 0x7a23 , 0x9c8b , 0x9c8e , +0x9c90 , 0x9c91 , 0x9c92 , 0x9c94 , +0x9c95 , 0x9c9a , 0x9c9b , 0x9c9e , +0x9c9f , 0x9ca0 , 0x9ca1 , 0x9ca2 , +0x9ca3 , 0x9ca5 , 0x9ca6 , 0x9ca7 , +0x9ca8 , 0x9ca9 , 0x9cab , 0x9cad , +0x9cae , 0x9cb0 , 0x9cb1 , 0x9cb2 , +0x9cb3 , 0x9cb4 , 0x9cb5 , 0x9cb6 , +0x9cb7 , 0x9cba , 0x9cbb , 0x9cbc , +0x9cbd , 0x9cc4 , 0x9cc5 , 0x9cc6 , +0x9cc7 , 0x9cca , 0x9ccb , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9ccc , 0x9ccd , 0x9cce , +0x9ccf , 0x9cd0 , 0x9cd3 , 0x9cd4 , +0x9cd5 , 0x9cd7 , 0x9cd8 , 0x9cd9 , +0x9cdc , 0x9cdd , 0x9cdf , 0x9ce2 , +0x977c , 0x9785 , 0x9791 , 0x9792 , +0x9794 , 0x97af , 0x97ab , 0x97a3 , +0x97b2 , 0x97b4 , 0x9ab1 , 0x9ab0 , +0x9ab7 , 0x9e58 , 0x9ab6 , 0x9aba , +0x9abc , 0x9ac1 , 0x9ac0 , 0x9ac5 , +0x9ac2 , 0x9acb , 0x9acc , 0x9ad1 , +0x9b45 , 0x9b43 , 0x9b47 , 0x9b49 , +0x9b48 , 0x9b4d , 0x9b51 , 0x98e8 , +0x990d , 0x992e , 0x9955 , 0x9954 , +0x9adf , 0x9ae1 , 0x9ae6 , 0x9aef , +0x9aeb , 0x9afb , 0x9aed , 0x9af9 , +0x9b08 , 0x9b0f , 0x9b13 , 0x9b1f , +0x9b23 , 0x9ebd , 0x9ebe , 0x7e3b , +0x9e82 , 0x9e87 , 0x9e88 , 0x9e8b , +0x9e92 , 0x93d6 , 0x9e9d , 0x9e9f , +0x9edb , 0x9edc , 0x9edd , 0x9ee0 , +0x9edf , 0x9ee2 , 0x9ee9 , 0x9ee7 , +0x9ee5 , 0x9eea , 0x9eef , 0x9f22 , +0x9f2c , 0x9f2f , 0x9f39 , 0x9f37 , +0x9f3d , 0x9f3e , 0x9f44 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +} ; diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_GBK.h opencascade-7.5.1+dfsg1/src/Resource/Resource_GBK.h --- opencascade-7.4.1+dfsg1/src/Resource/Resource_GBK.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_GBK.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,6002 +0,0 @@ -// Created on: 2017-11-17 -// Created by: Artem NOVIKOV -// Copyright (c) 2013-2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -static unsigned short gbkuni [23940] = { -0x4E02, 0x4E04, 0x4E05, 0x4E06, -0x4E0F, 0x4E12, 0x4E17, 0x4E1F, -0x4E20, 0x4E21, 0x4E23, 0x4E26, -0x4E29, 0x4E2E, 0x4E2F, 0x4E31, -0x4E33, 0x4E35, 0x4E37, 0x4E3C, -0x4E40, 0x4E41, 0x4E42, 0x4E44, -0x4E46, 0x4E4A, 0x4E51, 0x4E55, -0x4E57, 0x4E5A, 0x4E5B, 0x4E62, -0x4E63, 0x4E64, 0x4E65, 0x4E67, -0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, -0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, -0x4E74, 0x4E75, 0x4E76, 0x4E77, -0x4E78, 0x4E79, 0x4E7A, 0x4E7B, -0x4E7C, 0x4E7D, 0x4E7F, 0x4E80, -0x4E81, 0x4E82, 0x4E83, 0x4E84, -0x4E85, 0x4E87, 0x4E8A, 0x4E90, -0x4E96, 0x4E97, 0x4E99, 0x4E9C, -0x4E9D, 0x4E9E, 0x4EA3, 0x4EAA, -0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, -0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, -0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, -0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, -0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, -0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, -0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, -0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, -0x4EFC, 0x4EFE, 0x4F00, 0x4F02, -0x4F03, 0x4F04, 0x4F05, 0x4F06, -0x4F07, 0x4F08, 0x4F0B, 0x4F0C, -0x4F12, 0x4F13, 0x4F14, 0x4F15, -0x4F16, 0x4F1C, 0x4F1D, 0x4F21, -0x4F23, 0x4F28, 0x4F29, 0x4F2C, -0x4F2D, 0x4F2E, 0x4F31, 0x4F33, -0x4F35, 0x4F37, 0x4F39, 0x4F3B, -0x4F3E, 0x4F3F, 0x4F40, 0x4F41, -0x4F42, 0x4F44, 0x4F45, 0x4F47, -0x4F48, 0x4F49, 0x4F4A, 0x4F4B, -0x4F4C, 0x4F52, 0x4F54, 0x4F56, -0x4F61, 0x4F62, 0x4F66, 0x4F68, -0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, -0x4F71, 0x4F72, 0x4F75, 0x4F77, -0x4F78, 0x4F79, 0x4F7A, 0x4F7D, -0x4F80, 0x4F81, 0x4F82, 0x4F85, -0x4F86, 0x4F87, 0x4F8A, 0x4F8C, -0x4F8E, 0x4F90, 0x4F92, 0x4F93, -0x4F95, 0x4F96, 0x4F98, 0x4F99, -0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, -0x4FA1, 0x4FA2, 0x4FA4, 0x4FAB, -0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, -0x4FB3, 0x4FB4, 0x4FB6, 0x4FB7, -0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB, -0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, -0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, -0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, -0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, -0x4FD5, 0x4FD6, 0x4FD9, 0x4FDB, -0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, -0x4FE7, 0x4FEB, 0x4FEC, 0x4FF0, -0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, -0x4FF7, 0x4FF9, 0x4FFB, 0x4FFC, -0x4FFD, 0x4FFF, 0x5000, 0x5001, -0x5002, 0x5003, 0x5004, 0x5005, -0x5006, 0x5007, 0x5008, 0x5009, -0x500A, 0x500B, 0x500E, 0x5010, -0x5011, 0x5013, 0x5015, 0x5016, -0x5017, 0x501B, 0x501D, 0x501E, -0x5020, 0x5022, 0x5023, 0x5024, -0x5027, 0x502B, 0x502F, 0x5030, -0x5031, 0x5032, 0x5033, 0x5034, -0x5035, 0x5036, 0x5037, 0x5038, -0x5039, 0x503B, 0x503D, 0x503F, -0x5040, 0x5041, 0x5042, 0x5044, -0x5045, 0x5046, 0x5049, 0x504A, -0x504B, 0x504D, 0x5050, 0x5051, -0x5052, 0x5053, 0x5054, 0x5056, -0x5057, 0x5058, 0x5059, 0x505B, -0x505D, 0x505E, 0x505F, 0x5060, -0x5061, 0x5062, 0x5063, 0x5064, -0x5066, 0x5067, 0x5068, 0x5069, -0x506A, 0x506B, 0x506D, 0x506E, -0x506F, 0x5070, 0x5071, 0x5072, -0x5073, 0x5074, 0x5075, 0x5078, -0x5079, 0x507A, 0x507C, 0x507D, -0x5081, 0x5082, 0x5083, 0x5084, -0x5086, 0x5087, 0x5089, 0x508A, -0x508B, 0x508C, 0x508E, 0x508F, -0x5090, 0x5091, 0x5092, 0x5093, -0x5094, 0x5095, 0x5096, 0x5097, -0x5098, 0x5099, 0x509A, 0x509B, -0x509C, 0x509D, 0x509E, 0x509F, -0x50A0, 0x50A1, 0x50A2, 0x50A4, -0x50A6, 0x50AA, 0x50AB, 0x50AD, -0x50AE, 0x50AF, 0x50B0, 0x50B1, -0x50B3, 0x50B4, 0x50B5, 0x50B6, -0x50B7, 0x50B8, 0x50B9, 0x50BC, -0x50BD, 0x50BE, 0x50BF, 0x50C0, -0x50C1, 0x50C2, 0x50C3, 0x50C4, -0x50C5, 0x50C6, 0x50C7, 0x50C8, -0x50C9, 0x50CA, 0x50CB, 0x50CC, -0x50CD, 0x50CE, 0x50D0, 0x50D1, -0x50D2, 0x50D3, 0x50D4, 0x50D5, -0x50D7, 0x50D8, 0x50D9, 0x50DB, -0x50DC, 0x50DD, 0x50DE, 0x50DF, -0x50E0, 0x50E1, 0x50E2, 0x50E3, -0x50E4, 0x50E5, 0x50E8, 0x50E9, -0x50EA, 0x50EB, 0x50EF, 0x50F0, -0x50F1, 0x50F2, 0x50F4, 0x50F6, -0x50F7, 0x50F8, 0x50F9, 0x50FA, -0x50FC, 0x50FD, 0x50FE, 0x50FF, -0x5100, 0x5101, 0x5102, 0x5103, -0x5104, 0x5105, 0x5108, 0x5109, -0x510A, 0x510C, 0x510D, 0x510E, -0x510F, 0x5110, 0x5111, 0x5113, -0x5114, 0x5115, 0x5116, 0x5117, -0x5118, 0x5119, 0x511A, 0x511B, -0x511C, 0x511D, 0x511E, 0x511F, -0x5120, 0x5122, 0x5123, 0x5124, -0x5125, 0x5126, 0x5127, 0x5128, -0x5129, 0x512A, 0x512B, 0x512C, -0x512D, 0x512E, 0x512F, 0x5130, -0x5131, 0x5132, 0x5133, 0x5134, -0x5135, 0x5136, 0x5137, 0x5138, -0x5139, 0x513A, 0x513B, 0x513C, -0x513D, 0x513E, 0x5142, 0x5147, -0x514A, 0x514C, 0x514E, 0x514F, -0x5150, 0x5152, 0x5153, 0x5157, -0x5158, 0x5159, 0x515B, 0x515D, -0x515E, 0x515F, 0x5160, 0x5161, -0x5163, 0x5164, 0x5166, 0x5167, -0x5169, 0x516A, 0x516F, 0x5172, -0x517A, 0x517E, 0x517F, 0x5183, -0x5184, 0x5186, 0x5187, 0x518A, -0x518B, 0x518E, 0x518F, 0x5190, -0x5191, 0x5193, 0x5194, 0x5198, -0x519A, 0x519D, 0x519E, 0x519F, -0x51A1, 0x51A3, 0x51A6, 0x51A7, -0x51A8, 0x51A9, 0x51AA, 0x51AD, -0x51AE, 0x51B4, 0x51B8, 0x51B9, -0x51BA, 0x51BE, 0x51BF, 0x51C1, -0x51C2, 0x51C3, 0x51C5, 0x51C8, -0x51CA, 0x51CD, 0x51CE, 0x51D0, -0x51D2, 0x51D3, 0x51D4, 0x51D5, -0x51D6, 0x51D7, 0x51D8, 0x51D9, -0x51DA, 0x51DC, 0x51DE, 0x51DF, -0x51E2, 0x51E3, 0x51E5, 0x51E6, -0x51E7, 0x51E8, 0x51E9, 0x51EA, -0x51EC, 0x51EE, 0x51F1, 0x51F2, -0x51F4, 0x51F7, 0x51FE, 0x5204, -0x5205, 0x5209, 0x520B, 0x520C, -0x520F, 0x5210, 0x5213, 0x5214, -0x5215, 0x521C, 0x521E, 0x521F, -0x5221, 0x5222, 0x5223, 0x5225, -0x5226, 0x5227, 0x522A, 0x522C, -0x522F, 0x5231, 0x5232, 0x5234, -0x5235, 0x523C, 0x523E, 0x5244, -0x5245, 0x5246, 0x5247, 0x5248, -0x5249, 0x524B, 0x524E, 0x524F, -0x5252, 0x5253, 0x5255, 0x5257, -0x5258, 0x5259, 0x525A, 0x525B, -0x525D, 0x525F, 0x5260, 0x5262, -0x5263, 0x5264, 0x5266, 0x5268, -0x526B, 0x526C, 0x526D, 0x526E, -0x5270, 0x5271, 0x5273, 0x5274, -0x5275, 0x5276, 0x5277, 0x5278, -0x5279, 0x527A, 0x527B, 0x527C, -0x527E, 0x5280, 0x5283, 0x5284, -0x5285, 0x5286, 0x5287, 0x5289, -0x528A, 0x528B, 0x528C, 0x528D, -0x528E, 0x528F, 0x5291, 0x5292, -0x5294, 0x5295, 0x5296, 0x5297, -0x5298, 0x5299, 0x529A, 0x529C, -0x52A4, 0x52A5, 0x52A6, 0x52A7, -0x52AE, 0x52AF, 0x52B0, 0x52B4, -0x52B5, 0x52B6, 0x52B7, 0x52B8, -0x52B9, 0x52BA, 0x52BB, 0x52BC, -0x52BD, 0x52C0, 0x52C1, 0x52C2, -0x52C4, 0x52C5, 0x52C6, 0x52C8, -0x52CA, 0x52CC, 0x52CD, 0x52CE, -0x52CF, 0x52D1, 0x52D3, 0x52D4, -0x52D5, 0x52D7, 0x52D9, 0x52DA, -0x52DB, 0x52DC, 0x52DD, 0x52DE, -0x52E0, 0x52E1, 0x52E2, 0x52E3, -0x52E5, 0x52E6, 0x52E7, 0x52E8, -0x52E9, 0x52EA, 0x52EB, 0x52EC, -0x52ED, 0x52EE, 0x52EF, 0x52F1, -0x52F2, 0x52F3, 0x52F4, 0x52F5, -0x52F6, 0x52F7, 0x52F8, 0x52FB, -0x52FC, 0x52FD, 0x5301, 0x5302, -0x5303, 0x5304, 0x5307, 0x5309, -0x530A, 0x530B, 0x530C, 0x530E, -0x5311, 0x5312, 0x5313, 0x5314, -0x5318, 0x531B, 0x531C, 0x531E, -0x531F, 0x5322, 0x5324, 0x5325, -0x5327, 0x5328, 0x5329, 0x532B, -0x532C, 0x532D, 0x532F, 0x5330, -0x5331, 0x5332, 0x5333, 0x5334, -0x5335, 0x5336, 0x5337, 0x5338, -0x533C, 0x533D, 0x5340, 0x5342, -0x5344, 0x5346, 0x534B, 0x534C, -0x534D, 0x5350, 0x5354, 0x5358, -0x5359, 0x535B, 0x535D, 0x5365, -0x5368, 0x536A, 0x536C, 0x536D, -0x5372, 0x5376, 0x5379, 0x537B, -0x537C, 0x537D, 0x537E, 0x5380, -0x5381, 0x5383, 0x5387, 0x5388, -0x538A, 0x538E, 0x538F, 0x5390, -0x5391, 0x5392, 0x5393, 0x5394, -0x5396, 0x5397, 0x5399, 0x539B, -0x539C, 0x539E, 0x53A0, 0x53A1, -0x53A4, 0x53A7, 0x53AA, 0x53AB, -0x53AC, 0x53AD, 0x53AF, 0x53B0, -0x53B1, 0x53B2, 0x53B3, 0x53B4, -0x53B5, 0x53B7, 0x53B8, 0x53B9, -0x53BA, 0x53BC, 0x53BD, 0x53BE, -0x53C0, 0x53C3, 0x53C4, 0x53C5, -0x53C6, 0x53C7, 0x53CE, 0x53CF, -0x53D0, 0x53D2, 0x53D3, 0x53D5, -0x53DA, 0x53DC, 0x53DD, 0x53DE, -0x53E1, 0x53E2, 0x53E7, 0x53F4, -0x53FA, 0x53FE, 0x53FF, 0x5400, -0x5402, 0x5405, 0x5407, 0x540B, -0x5414, 0x5418, 0x5419, 0x541A, -0x541C, 0x5422, 0x5424, 0x5425, -0x542A, 0x5430, 0x5433, 0x5436, -0x5437, 0x543A, 0x543D, 0x543F, -0x5441, 0x5442, 0x5444, 0x5445, -0x5447, 0x5449, 0x544C, 0x544D, -0x544E, 0x544F, 0x5451, 0x545A, -0x545D, 0x545E, 0x545F, 0x5460, -0x5461, 0x5463, 0x5465, 0x5467, -0x5469, 0x546A, 0x546B, 0x546C, -0x546D, 0x546E, 0x546F, 0x5470, -0x5474, 0x5479, 0x547A, 0x547E, -0x547F, 0x5481, 0x5483, 0x5485, -0x5487, 0x5488, 0x5489, 0x548A, -0x548D, 0x5491, 0x5493, 0x5497, -0x5498, 0x549C, 0x549E, 0x549F, -0x54A0, 0x54A1, 0x54A2, 0x54A5, -0x54AE, 0x54B0, 0x54B2, 0x54B5, -0x54B6, 0x54B7, 0x54B9, 0x54BA, -0x54BC, 0x54BE, 0x54C3, 0x54C5, -0x54CA, 0x54CB, 0x54D6, 0x54D8, -0x54DB, 0x54E0, 0x54E1, 0x54E2, -0x54E3, 0x54E4, 0x54EB, 0x54EC, -0x54EF, 0x54F0, 0x54F1, 0x54F4, -0x54F5, 0x54F6, 0x54F7, 0x54F8, -0x54F9, 0x54FB, 0x54FE, 0x5500, -0x5502, 0x5503, 0x5504, 0x5505, -0x5508, 0x550A, 0x550B, 0x550C, -0x550D, 0x550E, 0x5512, 0x5513, -0x5515, 0x5516, 0x5517, 0x5518, -0x5519, 0x551A, 0x551C, 0x551D, -0x551E, 0x551F, 0x5521, 0x5525, -0x5526, 0x5528, 0x5529, 0x552B, -0x552D, 0x5532, 0x5534, 0x5535, -0x5536, 0x5538, 0x5539, 0x553A, -0x553B, 0x553D, 0x5540, 0x5542, -0x5545, 0x5547, 0x5548, 0x554B, -0x554C, 0x554D, 0x554E, 0x554F, -0x5551, 0x5552, 0x5553, 0x5554, -0x5557, 0x5558, 0x5559, 0x555A, -0x555B, 0x555D, 0x555E, 0x555F, -0x5560, 0x5562, 0x5563, 0x5568, -0x5569, 0x556B, 0x556F, 0x5570, -0x5571, 0x5572, 0x5573, 0x5574, -0x5579, 0x557A, 0x557D, 0x557F, -0x5585, 0x5586, 0x558C, 0x558D, -0x558E, 0x5590, 0x5592, 0x5593, -0x5595, 0x5596, 0x5597, 0x559A, -0x559B, 0x559E, 0x55A0, 0x55A1, -0x55A2, 0x55A3, 0x55A4, 0x55A5, -0x55A6, 0x55A8, 0x55A9, 0x55AA, -0x55AB, 0x55AC, 0x55AD, 0x55AE, -0x55AF, 0x55B0, 0x55B2, 0x55B4, -0x55B6, 0x55B8, 0x55BA, 0x55BC, -0x55BF, 0x55C0, 0x55C1, 0x55C2, -0x55C3, 0x55C6, 0x55C7, 0x55C8, -0x55CA, 0x55CB, 0x55CE, 0x55CF, -0x55D0, 0x55D5, 0x55D7, 0x55D8, -0x55D9, 0x55DA, 0x55DB, 0x55DE, -0x55E0, 0x55E2, 0x55E7, 0x55E9, -0x55ED, 0x55EE, 0x55F0, 0x55F1, -0x55F4, 0x55F6, 0x55F8, 0x55F9, -0x55FA, 0x55FB, 0x55FC, 0x55FF, -0x5602, 0x5603, 0x5604, 0x5605, -0x5606, 0x5607, 0x560A, 0x560B, -0x560D, 0x5610, 0x5611, 0x5612, -0x5613, 0x5614, 0x5615, 0x5616, -0x5617, 0x5619, 0x561A, 0x561C, -0x561D, 0x5620, 0x5621, 0x5622, -0x5625, 0x5626, 0x5628, 0x5629, -0x562A, 0x562B, 0x562E, 0x562F, -0x5630, 0x5633, 0x5635, 0x5637, -0x5638, 0x563A, 0x563C, 0x563D, -0x563E, 0x5640, 0x5641, 0x5642, -0x5643, 0x5644, 0x5645, 0x5646, -0x5647, 0x5648, 0x5649, 0x564A, -0x564B, 0x564F, 0x5650, 0x5651, -0x5652, 0x5653, 0x5655, 0x5656, -0x565A, 0x565B, 0x565D, 0x565E, -0x565F, 0x5660, 0x5661, 0x5663, -0x5665, 0x5666, 0x5667, 0x566D, -0x566E, 0x566F, 0x5670, 0x5672, -0x5673, 0x5674, 0x5675, 0x5677, -0x5678, 0x5679, 0x567A, 0x567D, -0x567E, 0x567F, 0x5680, 0x5681, -0x5682, 0x5683, 0x5684, 0x5687, -0x5688, 0x5689, 0x568A, 0x568B, -0x568C, 0x568D, 0x5690, 0x5691, -0x5692, 0x5694, 0x5695, 0x5696, -0x5697, 0x5698, 0x5699, 0x569A, -0x569B, 0x569C, 0x569D, 0x569E, -0x569F, 0x56A0, 0x56A1, 0x56A2, -0x56A4, 0x56A5, 0x56A6, 0x56A7, -0x56A8, 0x56A9, 0x56AA, 0x56AB, -0x56AC, 0x56AD, 0x56AE, 0x56B0, -0x56B1, 0x56B2, 0x56B3, 0x56B4, -0x56B5, 0x56B6, 0x56B8, 0x56B9, -0x56BA, 0x56BB, 0x56BD, 0x56BE, -0x56BF, 0x56C0, 0x56C1, 0x56C2, -0x56C3, 0x56C4, 0x56C5, 0x56C6, -0x56C7, 0x56C8, 0x56C9, 0x56CB, -0x56CC, 0x56CD, 0x56CE, 0x56CF, -0x56D0, 0x56D1, 0x56D2, 0x56D3, -0x56D5, 0x56D6, 0x56D8, 0x56D9, -0x56DC, 0x56E3, 0x56E5, 0x56E6, -0x56E7, 0x56E8, 0x56E9, 0x56EA, -0x56EC, 0x56EE, 0x56EF, 0x56F2, -0x56F3, 0x56F6, 0x56F7, 0x56F8, -0x56FB, 0x56FC, 0x5700, 0x5701, -0x5702, 0x5705, 0x5707, 0x570B, -0x570C, 0x570D, 0x570E, 0x570F, -0x5710, 0x5711, 0x5712, 0x5713, -0x5714, 0x5715, 0x5716, 0x5717, -0x5718, 0x5719, 0x571A, 0x571B, -0x571D, 0x571E, 0x5720, 0x5721, -0x5722, 0x5724, 0x5725, 0x5726, -0x5727, 0x572B, 0x5731, 0x5732, -0x5734, 0x5735, 0x5736, 0x5737, -0x5738, 0x573C, 0x573D, 0x573F, -0x5741, 0x5743, 0x5744, 0x5745, -0x5746, 0x5748, 0x5749, 0x574B, -0x5752, 0x5753, 0x5754, 0x5755, -0x5756, 0x5758, 0x5759, 0x5762, -0x5763, 0x5765, 0x5767, 0x576C, -0x576E, 0x5770, 0x5771, 0x5772, -0x5774, 0x5775, 0x5778, 0x5779, -0x577A, 0x577D, 0x577E, 0x577F, -0x5780, 0x5781, 0x5787, 0x5788, -0x5789, 0x578A, 0x578D, 0x578E, -0x578F, 0x5790, 0x5791, 0x5794, -0x5795, 0x5796, 0x5797, 0x5798, -0x5799, 0x579A, 0x579C, 0x579D, -0x579E, 0x579F, 0x57A5, 0x57A8, -0x57AA, 0x57AC, 0x57AF, 0x57B0, -0x57B1, 0x57B3, 0x57B5, 0x57B6, -0x57B7, 0x57B9, 0x57BA, 0x57BB, -0x57BC, 0x57BD, 0x57BE, 0x57BF, -0x57C0, 0x57C1, 0x57C4, 0x57C5, -0x57C6, 0x57C7, 0x57C8, 0x57C9, -0x57CA, 0x57CC, 0x57CD, 0x57D0, -0x57D1, 0x57D3, 0x57D6, 0x57D7, -0x57DB, 0x57DC, 0x57DE, 0x57E1, -0x57E2, 0x57E3, 0x57E5, 0x57E6, -0x57E7, 0x57E8, 0x57E9, 0x57EA, -0x57EB, 0x57EC, 0x57EE, 0x57F0, -0x57F1, 0x57F2, 0x57F3, 0x57F5, -0x57F6, 0x57F7, 0x57FB, 0x57FC, -0x57FE, 0x57FF, 0x5801, 0x5803, -0x5804, 0x5805, 0x5808, 0x5809, -0x580A, 0x580C, 0x580E, 0x580F, -0x5810, 0x5812, 0x5813, 0x5814, -0x5816, 0x5817, 0x5818, 0x581A, -0x581B, 0x581C, 0x581D, 0x581F, -0x5822, 0x5823, 0x5825, 0x5826, -0x5827, 0x5828, 0x5829, 0x582B, -0x582C, 0x582D, 0x582E, 0x582F, -0x5831, 0x5832, 0x5833, 0x5834, -0x5836, 0x5837, 0x5838, 0x5839, -0x583A, 0x583B, 0x583C, 0x583D, -0x583E, 0x583F, 0x5840, 0x5841, -0x5842, 0x5843, 0x5845, 0x5846, -0x5847, 0x5848, 0x5849, 0x584A, -0x584B, 0x584E, 0x584F, 0x5850, -0x5852, 0x5853, 0x5855, 0x5856, -0x5857, 0x5859, 0x585A, 0x585B, -0x585C, 0x585D, 0x585F, 0x5860, -0x5861, 0x5862, 0x5863, 0x5864, -0x5866, 0x5867, 0x5868, 0x5869, -0x586A, 0x586D, 0x586E, 0x586F, -0x5870, 0x5871, 0x5872, 0x5873, -0x5874, 0x5875, 0x5876, 0x5877, -0x5878, 0x5879, 0x587A, 0x587B, -0x587C, 0x587D, 0x587F, 0x5882, -0x5884, 0x5886, 0x5887, 0x5888, -0x588A, 0x588B, 0x588C, 0x588D, -0x588E, 0x588F, 0x5890, 0x5891, -0x5894, 0x5895, 0x5896, 0x5897, -0x5898, 0x589B, 0x589C, 0x589D, -0x58A0, 0x58A1, 0x58A2, 0x58A3, -0x58A4, 0x58A5, 0x58A6, 0x58A7, -0x58AA, 0x58AB, 0x58AC, 0x58AD, -0x58AE, 0x58AF, 0x58B0, 0x58B1, -0x58B2, 0x58B3, 0x58B4, 0x58B5, -0x58B6, 0x58B7, 0x58B8, 0x58B9, -0x58BA, 0x58BB, 0x58BD, 0x58BE, -0x58BF, 0x58C0, 0x58C2, 0x58C3, -0x58C4, 0x58C6, 0x58C7, 0x58C8, -0x58C9, 0x58CA, 0x58CB, 0x58CC, -0x58CD, 0x58CE, 0x58CF, 0x58D0, -0x58D2, 0x58D3, 0x58D4, 0x58D6, -0x58D7, 0x58D8, 0x58D9, 0x58DA, -0x58DB, 0x58DC, 0x58DD, 0x58DE, -0x58DF, 0x58E0, 0x58E1, 0x58E2, -0x58E3, 0x58E5, 0x58E6, 0x58E7, -0x58E8, 0x58E9, 0x58EA, 0x58ED, -0x58EF, 0x58F1, 0x58F2, 0x58F4, -0x58F5, 0x58F7, 0x58F8, 0x58FA, -0x58FB, 0x58FC, 0x58FD, 0x58FE, -0x58FF, 0x5900, 0x5901, 0x5903, -0x5905, 0x5906, 0x5908, 0x5909, -0x590A, 0x590B, 0x590C, 0x590E, -0x5910, 0x5911, 0x5912, 0x5913, -0x5917, 0x5918, 0x591B, 0x591D, -0x591E, 0x5920, 0x5921, 0x5922, -0x5923, 0x5926, 0x5928, 0x592C, -0x5930, 0x5932, 0x5933, 0x5935, -0x5936, 0x593B, 0x593D, 0x593E, -0x593F, 0x5940, 0x5943, 0x5945, -0x5946, 0x594A, 0x594C, 0x594D, -0x5950, 0x5952, 0x5953, 0x5959, -0x595B, 0x595C, 0x595D, 0x595E, -0x595F, 0x5961, 0x5963, 0x5964, -0x5966, 0x5967, 0x5968, 0x5969, -0x596A, 0x596B, 0x596C, 0x596D, -0x596E, 0x596F, 0x5970, 0x5971, -0x5972, 0x5975, 0x5977, 0x597A, -0x597B, 0x597C, 0x597E, 0x597F, -0x5980, 0x5985, 0x5989, 0x598B, -0x598C, 0x598E, 0x598F, 0x5990, -0x5991, 0x5994, 0x5995, 0x5998, -0x599A, 0x599B, 0x599C, 0x599D, -0x599F, 0x59A0, 0x59A1, 0x59A2, -0x59A6, 0x59A7, 0x59AC, 0x59AD, -0x59B0, 0x59B1, 0x59B3, 0x59B4, -0x59B5, 0x59B6, 0x59B7, 0x59B8, -0x59BA, 0x59BC, 0x59BD, 0x59BF, -0x59C0, 0x59C1, 0x59C2, 0x59C3, -0x59C4, 0x59C5, 0x59C7, 0x59C8, -0x59C9, 0x59CC, 0x59CD, 0x59CE, -0x59CF, 0x59D5, 0x59D6, 0x59D9, -0x59DB, 0x59DE, 0x59DF, 0x59E0, -0x59E1, 0x59E2, 0x59E4, 0x59E6, -0x59E7, 0x59E9, 0x59EA, 0x59EB, -0x59ED, 0x59EE, 0x59EF, 0x59F0, -0x59F1, 0x59F2, 0x59F3, 0x59F4, -0x59F5, 0x59F6, 0x59F7, 0x59F8, -0x59FA, 0x59FC, 0x59FD, 0x59FE, -0x5A00, 0x5A02, 0x5A0A, 0x5A0B, -0x5A0D, 0x5A0E, 0x5A0F, 0x5A10, -0x5A12, 0x5A14, 0x5A15, 0x5A16, -0x5A17, 0x5A19, 0x5A1A, 0x5A1B, -0x5A1D, 0x5A1E, 0x5A21, 0x5A22, -0x5A24, 0x5A26, 0x5A27, 0x5A28, -0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, -0x5A2E, 0x5A2F, 0x5A30, 0x5A33, -0x5A35, 0x5A37, 0x5A38, 0x5A39, -0x5A3A, 0x5A3B, 0x5A3D, 0x5A3E, -0x5A3F, 0x5A41, 0x5A42, 0x5A43, -0x5A44, 0x5A45, 0x5A47, 0x5A48, -0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, -0x5A4F, 0x5A50, 0x5A51, 0x5A52, -0x5A53, 0x5A54, 0x5A56, 0x5A57, -0x5A58, 0x5A59, 0x5A5B, 0x5A5C, -0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, -0x5A61, 0x5A63, 0x5A64, 0x5A65, -0x5A66, 0x5A68, 0x5A69, 0x5A6B, -0x5A6C, 0x5A6D, 0x5A6E, 0x5A6F, -0x5A70, 0x5A71, 0x5A72, 0x5A73, -0x5A78, 0x5A79, 0x5A7B, 0x5A7C, -0x5A7D, 0x5A7E, 0x5A80, 0x5A81, -0x5A82, 0x5A83, 0x5A84, 0x5A85, -0x5A86, 0x5A87, 0x5A88, 0x5A89, -0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, -0x5A8E, 0x5A8F, 0x5A90, 0x5A91, -0x5A93, 0x5A94, 0x5A95, 0x5A96, -0x5A97, 0x5A98, 0x5A99, 0x5A9C, -0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, -0x5AA1, 0x5AA2, 0x5AA3, 0x5AA4, -0x5AA5, 0x5AA6, 0x5AA7, 0x5AA8, -0x5AA9, 0x5AAB, 0x5AAC, 0x5AAD, -0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, -0x5AB4, 0x5AB6, 0x5AB7, 0x5AB9, -0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, -0x5ABF, 0x5AC0, 0x5AC3, 0x5AC4, -0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, -0x5ACA, 0x5ACB, 0x5ACD, 0x5ACE, -0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, -0x5AD5, 0x5AD7, 0x5AD9, 0x5ADA, -0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, -0x5AE2, 0x5AE4, 0x5AE5, 0x5AE7, -0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, -0x5AEE, 0x5AEF, 0x5AF0, 0x5AF2, -0x5AF3, 0x5AF4, 0x5AF5, 0x5AF6, -0x5AF7, 0x5AF8, 0x5AF9, 0x5AFA, -0x5AFB, 0x5AFC, 0x5AFD, 0x5AFE, -0x5AFF, 0x5B00, 0x5B01, 0x5B02, -0x5B03, 0x5B04, 0x5B05, 0x5B06, -0x5B07, 0x5B08, 0x5B0A, 0x5B0B, -0x5B0C, 0x5B0D, 0x5B0E, 0x5B0F, -0x5B10, 0x5B11, 0x5B12, 0x5B13, -0x5B14, 0x5B15, 0x5B18, 0x5B19, -0x5B1A, 0x5B1B, 0x5B1C, 0x5B1D, -0x5B1E, 0x5B1F, 0x5B20, 0x5B21, -0x5B22, 0x5B23, 0x5B24, 0x5B25, -0x5B26, 0x5B27, 0x5B28, 0x5B29, -0x5B2A, 0x5B2B, 0x5B2C, 0x5B2D, -0x5B2E, 0x5B2F, 0x5B30, 0x5B31, -0x5B33, 0x5B35, 0x5B36, 0x5B38, -0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, -0x5B3D, 0x5B3E, 0x5B3F, 0x5B41, -0x5B42, 0x5B43, 0x5B44, 0x5B45, -0x5B46, 0x5B47, 0x5B48, 0x5B49, -0x5B4A, 0x5B4B, 0x5B4C, 0x5B4D, -0x5B4E, 0x5B4F, 0x5B52, 0x5B56, -0x5B5E, 0x5B60, 0x5B61, 0x5B67, -0x5B68, 0x5B6B, 0x5B6D, 0x5B6E, -0x5B6F, 0x5B72, 0x5B74, 0x5B76, -0x5B77, 0x5B78, 0x5B79, 0x5B7B, -0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, -0x5B86, 0x5B8A, 0x5B8D, 0x5B8E, -0x5B90, 0x5B91, 0x5B92, 0x5B94, -0x5B96, 0x5B9F, 0x5BA7, 0x5BA8, -0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, -0x5BAF, 0x5BB1, 0x5BB2, 0x5BB7, -0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, -0x5BC1, 0x5BC3, 0x5BC8, 0x5BC9, -0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, -0x5BCF, 0x5BD1, 0x5BD4, 0x5BD5, -0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, -0x5BDA, 0x5BDB, 0x5BDC, 0x5BE0, -0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, -0x5BE9, 0x5BEA, 0x5BEB, 0x5BEC, -0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, -0x5BF3, 0x5BF4, 0x5BF5, 0x5BF6, -0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, -0x5C02, 0x5C03, 0x5C05, 0x5C07, -0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, -0x5C0E, 0x5C10, 0x5C12, 0x5C13, -0x5C17, 0x5C19, 0x5C1B, 0x5C1E, -0x5C1F, 0x5C20, 0x5C21, 0x5C23, -0x5C26, 0x5C28, 0x5C29, 0x5C2A, -0x5C2B, 0x5C2D, 0x5C2E, 0x5C2F, -0x5C30, 0x5C32, 0x5C33, 0x5C35, -0x5C36, 0x5C37, 0x5C43, 0x5C44, -0x5C46, 0x5C47, 0x5C4C, 0x5C4D, -0x5C52, 0x5C53, 0x5C54, 0x5C56, -0x5C57, 0x5C58, 0x5C5A, 0x5C5B, -0x5C5C, 0x5C5D, 0x5C5F, 0x5C62, -0x5C64, 0x5C67, 0x5C68, 0x5C69, -0x5C6A, 0x5C6B, 0x5C6C, 0x5C6D, -0x5C70, 0x5C72, 0x5C73, 0x5C74, -0x5C75, 0x5C76, 0x5C77, 0x5C78, -0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, -0x5C80, 0x5C83, 0x5C84, 0x5C85, -0x5C86, 0x5C87, 0x5C89, 0x5C8A, -0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, -0x5C93, 0x5C95, 0x5C9D, 0x5C9E, -0x5C9F, 0x5CA0, 0x5CA1, 0x5CA4, -0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8, -0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, -0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, -0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, -0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, -0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, -0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, -0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, -0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, -0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, -0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, -0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, -0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF, -0x5CF1, 0x5CF2, 0x5CF3, 0x5CF4, -0x5CF5, 0x5CF6, 0x5CF7, 0x5CF8, -0x5CF9, 0x5CFA, 0x5CFC, 0x5CFD, -0x5CFE, 0x5CFF, 0x5D00, 0x5D01, -0x5D04, 0x5D05, 0x5D08, 0x5D09, -0x5D0A, 0x5D0B, 0x5D0C, 0x5D0D, -0x5D0F, 0x5D10, 0x5D11, 0x5D12, -0x5D13, 0x5D15, 0x5D17, 0x5D18, -0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, -0x5D1F, 0x5D20, 0x5D21, 0x5D22, -0x5D23, 0x5D25, 0x5D28, 0x5D2A, -0x5D2B, 0x5D2C, 0x5D2F, 0x5D30, -0x5D31, 0x5D32, 0x5D33, 0x5D35, -0x5D36, 0x5D37, 0x5D38, 0x5D39, -0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, -0x5D40, 0x5D41, 0x5D42, 0x5D43, -0x5D44, 0x5D45, 0x5D46, 0x5D48, -0x5D49, 0x5D4D, 0x5D4E, 0x5D4F, -0x5D50, 0x5D51, 0x5D52, 0x5D53, -0x5D54, 0x5D55, 0x5D56, 0x5D57, -0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, -0x5D5F, 0x5D60, 0x5D61, 0x5D62, -0x5D63, 0x5D64, 0x5D65, 0x5D66, -0x5D67, 0x5D68, 0x5D6A, 0x5D6D, -0x5D6E, 0x5D70, 0x5D71, 0x5D72, -0x5D73, 0x5D75, 0x5D76, 0x5D77, -0x5D78, 0x5D79, 0x5D7A, 0x5D7B, -0x5D7C, 0x5D7D, 0x5D7E, 0x5D7F, -0x5D80, 0x5D81, 0x5D83, 0x5D84, -0x5D85, 0x5D86, 0x5D87, 0x5D88, -0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, -0x5D8D, 0x5D8E, 0x5D8F, 0x5D90, -0x5D91, 0x5D92, 0x5D93, 0x5D94, -0x5D95, 0x5D96, 0x5D97, 0x5D98, -0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, -0x5D9F, 0x5DA0, 0x5DA1, 0x5DA2, -0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, -0x5DA7, 0x5DA8, 0x5DA9, 0x5DAA, -0x5DAB, 0x5DAC, 0x5DAD, 0x5DAE, -0x5DAF, 0x5DB0, 0x5DB1, 0x5DB2, -0x5DB3, 0x5DB4, 0x5DB5, 0x5DB6, -0x5DB8, 0x5DB9, 0x5DBA, 0x5DBB, -0x5DBC, 0x5DBD, 0x5DBE, 0x5DBF, -0x5DC0, 0x5DC1, 0x5DC2, 0x5DC3, -0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, -0x5DC9, 0x5DCA, 0x5DCB, 0x5DCC, -0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, -0x5DD2, 0x5DD3, 0x5DD4, 0x5DD5, -0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, -0x5DDA, 0x5DDC, 0x5DDF, 0x5DE0, -0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, -0x5DED, 0x5DF0, 0x5DF5, 0x5DF6, -0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, -0x5DFC, 0x5DFF, 0x5E00, 0x5E04, -0x5E07, 0x5E09, 0x5E0A, 0x5E0B, -0x5E0D, 0x5E0E, 0x5E12, 0x5E13, -0x5E17, 0x5E1E, 0x5E1F, 0x5E20, -0x5E21, 0x5E22, 0x5E23, 0x5E24, -0x5E25, 0x5E28, 0x5E29, 0x5E2A, -0x5E2B, 0x5E2C, 0x5E2F, 0x5E30, -0x5E32, 0x5E33, 0x5E34, 0x5E35, -0x5E36, 0x5E39, 0x5E3A, 0x5E3E, -0x5E3F, 0x5E40, 0x5E41, 0x5E43, -0x5E46, 0x5E47, 0x5E48, 0x5E49, -0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, -0x5E4F, 0x5E50, 0x5E51, 0x5E52, -0x5E53, 0x5E56, 0x5E57, 0x5E58, -0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, -0x5E5F, 0x5E60, 0x5E63, 0x5E64, -0x5E65, 0x5E66, 0x5E67, 0x5E68, -0x5E69, 0x5E6A, 0x5E6B, 0x5E6C, -0x5E6D, 0x5E6E, 0x5E6F, 0x5E70, -0x5E71, 0x5E75, 0x5E77, 0x5E79, -0x5E7E, 0x5E81, 0x5E82, 0x5E83, -0x5E85, 0x5E88, 0x5E89, 0x5E8C, -0x5E8D, 0x5E8E, 0x5E92, 0x5E98, -0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, -0x5EA3, 0x5EA4, 0x5EA8, 0x5EA9, -0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, -0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, -0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, -0x5EBD, 0x5EBF, 0x5EC0, 0x5EC1, -0x5EC2, 0x5EC3, 0x5EC4, 0x5EC5, -0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, -0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF, -0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, -0x5ED8, 0x5ED9, 0x5EDA, 0x5EDC, -0x5EDD, 0x5EDE, 0x5EDF, 0x5EE0, -0x5EE1, 0x5EE2, 0x5EE3, 0x5EE4, -0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, -0x5EEB, 0x5EEC, 0x5EED, 0x5EEE, -0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, -0x5EF3, 0x5EF5, 0x5EF8, 0x5EF9, -0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, -0x5F06, 0x5F07, 0x5F09, 0x5F0C, -0x5F0D, 0x5F0E, 0x5F10, 0x5F12, -0x5F14, 0x5F16, 0x5F19, 0x5F1A, -0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, -0x5F22, 0x5F23, 0x5F24, 0x5F28, -0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, -0x5F32, 0x5F33, 0x5F34, 0x5F35, -0x5F36, 0x5F37, 0x5F38, 0x5F3B, -0x5F3D, 0x5F3E, 0x5F3F, 0x5F41, -0x5F42, 0x5F43, 0x5F44, 0x5F45, -0x5F46, 0x5F47, 0x5F48, 0x5F49, -0x5F4A, 0x5F4B, 0x5F4C, 0x5F4D, -0x5F4E, 0x5F4F, 0x5F51, 0x5F54, -0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, -0x5F5E, 0x5F5F, 0x5F60, 0x5F63, -0x5F65, 0x5F67, 0x5F68, 0x5F6B, -0x5F6E, 0x5F6F, 0x5F72, 0x5F74, -0x5F75, 0x5F76, 0x5F78, 0x5F7A, -0x5F7D, 0x5F7E, 0x5F7F, 0x5F83, -0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, -0x5F91, 0x5F93, 0x5F94, 0x5F96, -0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, -0x5F9F, 0x5FA0, 0x5FA2, 0x5FA3, -0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, -0x5FA9, 0x5FAB, 0x5FAC, 0x5FAF, -0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, -0x5FB4, 0x5FB6, 0x5FB8, 0x5FB9, -0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, -0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7, -0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, -0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA, -0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, -0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6, -0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, -0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4, -0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, -0x5FFC, 0x6007, 0x6008, 0x6009, -0x600B, 0x600C, 0x6010, 0x6011, -0x6013, 0x6017, 0x6018, 0x601A, -0x601E, 0x601F, 0x6022, 0x6023, -0x6024, 0x602C, 0x602D, 0x602E, -0x6030, 0x6031, 0x6032, 0x6033, -0x6034, 0x6036, 0x6037, 0x6038, -0x6039, 0x603A, 0x603D, 0x603E, -0x6040, 0x6044, 0x6045, 0x6046, -0x6047, 0x6048, 0x6049, 0x604A, -0x604C, 0x604E, 0x604F, 0x6051, -0x6053, 0x6054, 0x6056, 0x6057, -0x6058, 0x605B, 0x605C, 0x605E, -0x605F, 0x6060, 0x6061, 0x6065, -0x6066, 0x606E, 0x6071, 0x6072, -0x6074, 0x6075, 0x6077, 0x607E, -0x6080, 0x6081, 0x6082, 0x6085, -0x6086, 0x6087, 0x6088, 0x608A, -0x608B, 0x608E, 0x608F, 0x6090, -0x6091, 0x6093, 0x6095, 0x6097, -0x6098, 0x6099, 0x609C, 0x609E, -0x60A1, 0x60A2, 0x60A4, 0x60A5, -0x60A7, 0x60A9, 0x60AA, 0x60AE, -0x60B0, 0x60B3, 0x60B5, 0x60B6, -0x60B7, 0x60B9, 0x60BA, 0x60BD, -0x60BE, 0x60BF, 0x60C0, 0x60C1, -0x60C2, 0x60C3, 0x60C4, 0x60C7, -0x60C8, 0x60C9, 0x60CC, 0x60CD, -0x60CE, 0x60CF, 0x60D0, 0x60D2, -0x60D3, 0x60D4, 0x60D6, 0x60D7, -0x60D9, 0x60DB, 0x60DE, 0x60E1, -0x60E2, 0x60E3, 0x60E4, 0x60E5, -0x60EA, 0x60F1, 0x60F2, 0x60F5, -0x60F7, 0x60F8, 0x60FB, 0x60FC, -0x60FD, 0x60FE, 0x60FF, 0x6102, -0x6103, 0x6104, 0x6105, 0x6107, -0x610A, 0x610B, 0x610C, 0x6110, -0x6111, 0x6112, 0x6113, 0x6114, -0x6116, 0x6117, 0x6118, 0x6119, -0x611B, 0x611C, 0x611D, 0x611E, -0x6121, 0x6122, 0x6125, 0x6128, -0x6129, 0x612A, 0x612C, 0x612D, -0x612E, 0x612F, 0x6130, 0x6131, -0x6132, 0x6133, 0x6134, 0x6135, -0x6136, 0x6137, 0x6138, 0x6139, -0x613A, 0x613B, 0x613C, 0x613D, -0x613E, 0x6140, 0x6141, 0x6142, -0x6143, 0x6144, 0x6145, 0x6146, -0x6147, 0x6149, 0x614B, 0x614D, -0x614F, 0x6150, 0x6152, 0x6153, -0x6154, 0x6156, 0x6157, 0x6158, -0x6159, 0x615A, 0x615B, 0x615C, -0x615E, 0x615F, 0x6160, 0x6161, -0x6163, 0x6164, 0x6165, 0x6166, -0x6169, 0x616A, 0x616B, 0x616C, -0x616D, 0x616E, 0x616F, 0x6171, -0x6172, 0x6173, 0x6174, 0x6176, -0x6178, 0x6179, 0x617A, 0x617B, -0x617C, 0x617D, 0x617E, 0x617F, -0x6180, 0x6181, 0x6182, 0x6183, -0x6184, 0x6185, 0x6186, 0x6187, -0x6188, 0x6189, 0x618A, 0x618C, -0x618D, 0x618F, 0x6190, 0x6191, -0x6192, 0x6193, 0x6195, 0x6196, -0x6197, 0x6198, 0x6199, 0x619A, -0x619B, 0x619C, 0x619E, 0x619F, -0x61A0, 0x61A1, 0x61A2, 0x61A3, -0x61A4, 0x61A5, 0x61A6, 0x61AA, -0x61AB, 0x61AD, 0x61AE, 0x61AF, -0x61B0, 0x61B1, 0x61B2, 0x61B3, -0x61B4, 0x61B5, 0x61B6, 0x61B8, -0x61B9, 0x61BA, 0x61BB, 0x61BC, -0x61BD, 0x61BF, 0x61C0, 0x61C1, -0x61C3, 0x61C4, 0x61C5, 0x61C6, -0x61C7, 0x61C9, 0x61CC, 0x61CD, -0x61CE, 0x61CF, 0x61D0, 0x61D3, -0x61D5, 0x61D6, 0x61D7, 0x61D8, -0x61D9, 0x61DA, 0x61DB, 0x61DC, -0x61DD, 0x61DE, 0x61DF, 0x61E0, -0x61E1, 0x61E2, 0x61E3, 0x61E4, -0x61E5, 0x61E7, 0x61E8, 0x61E9, -0x61EA, 0x61EB, 0x61EC, 0x61ED, -0x61EE, 0x61EF, 0x61F0, 0x61F1, -0x61F2, 0x61F3, 0x61F4, 0x61F6, -0x61F7, 0x61F8, 0x61F9, 0x61FA, -0x61FB, 0x61FC, 0x61FD, 0x61FE, -0x6200, 0x6201, 0x6202, 0x6203, -0x6204, 0x6205, 0x6207, 0x6209, -0x6213, 0x6214, 0x6219, 0x621C, -0x621D, 0x621E, 0x6220, 0x6223, -0x6226, 0x6227, 0x6228, 0x6229, -0x622B, 0x622D, 0x622F, 0x6230, -0x6231, 0x6232, 0x6235, 0x6236, -0x6238, 0x6239, 0x623A, 0x623B, -0x623C, 0x6242, 0x6244, 0x6245, -0x6246, 0x624A, 0x624F, 0x6250, -0x6255, 0x6256, 0x6257, 0x6259, -0x625A, 0x625C, 0x625D, 0x625E, -0x625F, 0x6260, 0x6261, 0x6262, -0x6264, 0x6265, 0x6268, 0x6271, -0x6272, 0x6274, 0x6275, 0x6277, -0x6278, 0x627A, 0x627B, 0x627D, -0x6281, 0x6282, 0x6283, 0x6285, -0x6286, 0x6287, 0x6288, 0x628B, -0x628C, 0x628D, 0x628E, 0x628F, -0x6290, 0x6294, 0x6299, 0x629C, -0x629D, 0x629E, 0x62A3, 0x62A6, -0x62A7, 0x62A9, 0x62AA, 0x62AD, -0x62AE, 0x62AF, 0x62B0, 0x62B2, -0x62B3, 0x62B4, 0x62B6, 0x62B7, -0x62B8, 0x62BA, 0x62BE, 0x62C0, -0x62C1, 0x62C3, 0x62CB, 0x62CF, -0x62D1, 0x62D5, 0x62DD, 0x62DE, -0x62E0, 0x62E1, 0x62E4, 0x62EA, -0x62EB, 0x62F0, 0x62F2, 0x62F5, -0x62F8, 0x62F9, 0x62FA, 0x62FB, -0x6300, 0x6303, 0x6304, 0x6305, -0x6306, 0x630A, 0x630B, 0x630C, -0x630D, 0x630F, 0x6310, 0x6312, -0x6313, 0x6314, 0x6315, 0x6317, -0x6318, 0x6319, 0x631C, 0x6326, -0x6327, 0x6329, 0x632C, 0x632D, -0x632E, 0x6330, 0x6331, 0x6333, -0x6334, 0x6335, 0x6336, 0x6337, -0x6338, 0x633B, 0x633C, 0x633E, -0x633F, 0x6340, 0x6341, 0x6344, -0x6347, 0x6348, 0x634A, 0x6351, -0x6352, 0x6353, 0x6354, 0x6356, -0x6357, 0x6358, 0x6359, 0x635A, -0x635B, 0x635C, 0x635D, 0x6360, -0x6364, 0x6365, 0x6366, 0x6368, -0x636A, 0x636B, 0x636C, 0x636F, -0x6370, 0x6372, 0x6373, 0x6374, -0x6375, 0x6378, 0x6379, 0x637C, -0x637D, 0x637E, 0x637F, 0x6381, -0x6383, 0x6384, 0x6385, 0x6386, -0x638B, 0x638D, 0x6391, 0x6393, -0x6394, 0x6395, 0x6397, 0x6399, -0x639A, 0x639B, 0x639C, 0x639D, -0x639E, 0x639F, 0x63A1, 0x63A4, -0x63A6, 0x63AB, 0x63AF, 0x63B1, -0x63B2, 0x63B5, 0x63B6, 0x63B9, -0x63BB, 0x63BD, 0x63BF, 0x63C0, -0x63C1, 0x63C2, 0x63C3, 0x63C5, -0x63C7, 0x63C8, 0x63CA, 0x63CB, -0x63CC, 0x63D1, 0x63D3, 0x63D4, -0x63D5, 0x63D7, 0x63D8, 0x63D9, -0x63DA, 0x63DB, 0x63DC, 0x63DD, -0x63DF, 0x63E2, 0x63E4, 0x63E5, -0x63E6, 0x63E7, 0x63E8, 0x63EB, -0x63EC, 0x63EE, 0x63EF, 0x63F0, -0x63F1, 0x63F3, 0x63F5, 0x63F7, -0x63F9, 0x63FA, 0x63FB, 0x63FC, -0x63FE, 0x6403, 0x6404, 0x6406, -0x6407, 0x6408, 0x6409, 0x640A, -0x640D, 0x640E, 0x6411, 0x6412, -0x6415, 0x6416, 0x6417, 0x6418, -0x6419, 0x641A, 0x641D, 0x641F, -0x6422, 0x6423, 0x6424, 0x6425, -0x6427, 0x6428, 0x6429, 0x642B, -0x642E, 0x642F, 0x6430, 0x6431, -0x6432, 0x6433, 0x6435, 0x6436, -0x6437, 0x6438, 0x6439, 0x643B, -0x643C, 0x643E, 0x6440, 0x6442, -0x6443, 0x6449, 0x644B, 0x644C, -0x644D, 0x644E, 0x644F, 0x6450, -0x6451, 0x6453, 0x6455, 0x6456, -0x6457, 0x6459, 0x645A, 0x645B, -0x645C, 0x645D, 0x645F, 0x6460, -0x6461, 0x6462, 0x6463, 0x6464, -0x6465, 0x6466, 0x6468, 0x646A, -0x646B, 0x646C, 0x646E, 0x646F, -0x6470, 0x6471, 0x6472, 0x6473, -0x6474, 0x6475, 0x6476, 0x6477, -0x647B, 0x647C, 0x647D, 0x647E, -0x647F, 0x6480, 0x6481, 0x6483, -0x6486, 0x6488, 0x6489, 0x648A, -0x648B, 0x648C, 0x648D, 0x648E, -0x648F, 0x6490, 0x6493, 0x6494, -0x6497, 0x6498, 0x649A, 0x649B, -0x649C, 0x649D, 0x649F, 0x64A0, -0x64A1, 0x64A2, 0x64A3, 0x64A5, -0x64A6, 0x64A7, 0x64A8, 0x64AA, -0x64AB, 0x64AF, 0x64B1, 0x64B2, -0x64B3, 0x64B4, 0x64B6, 0x64B9, -0x64BB, 0x64BD, 0x64BE, 0x64BF, -0x64C1, 0x64C3, 0x64C4, 0x64C6, -0x64C7, 0x64C8, 0x64C9, 0x64CA, -0x64CB, 0x64CC, 0x64CF, 0x64D1, -0x64D3, 0x64D4, 0x64D5, 0x64D6, -0x64D9, 0x64DA, 0x64DB, 0x64DC, -0x64DD, 0x64DF, 0x64E0, 0x64E1, -0x64E3, 0x64E5, 0x64E7, 0x64E8, -0x64E9, 0x64EA, 0x64EB, 0x64EC, -0x64ED, 0x64EE, 0x64EF, 0x64F0, -0x64F1, 0x64F2, 0x64F3, 0x64F4, -0x64F5, 0x64F6, 0x64F7, 0x64F8, -0x64F9, 0x64FA, 0x64FB, 0x64FC, -0x64FD, 0x64FE, 0x64FF, 0x6501, -0x6502, 0x6503, 0x6504, 0x6505, -0x6506, 0x6507, 0x6508, 0x650A, -0x650B, 0x650C, 0x650D, 0x650E, -0x650F, 0x6510, 0x6511, 0x6513, -0x6514, 0x6515, 0x6516, 0x6517, -0x6519, 0x651A, 0x651B, 0x651C, -0x651D, 0x651E, 0x651F, 0x6520, -0x6521, 0x6522, 0x6523, 0x6524, -0x6526, 0x6527, 0x6528, 0x6529, -0x652A, 0x652C, 0x652D, 0x6530, -0x6531, 0x6532, 0x6533, 0x6537, -0x653A, 0x653C, 0x653D, 0x6540, -0x6541, 0x6542, 0x6543, 0x6544, -0x6546, 0x6547, 0x654A, 0x654B, -0x654D, 0x654E, 0x6550, 0x6552, -0x6553, 0x6554, 0x6557, 0x6558, -0x655A, 0x655C, 0x655F, 0x6560, -0x6561, 0x6564, 0x6565, 0x6567, -0x6568, 0x6569, 0x656A, 0x656D, -0x656E, 0x656F, 0x6571, 0x6573, -0x6575, 0x6576, 0x6578, 0x6579, -0x657A, 0x657B, 0x657C, 0x657D, -0x657E, 0x657F, 0x6580, 0x6581, -0x6582, 0x6583, 0x6584, 0x6585, -0x6586, 0x6588, 0x6589, 0x658A, -0x658D, 0x658E, 0x658F, 0x6592, -0x6594, 0x6595, 0x6596, 0x6598, -0x659A, 0x659D, 0x659E, 0x65A0, -0x65A2, 0x65A3, 0x65A6, 0x65A8, -0x65AA, 0x65AC, 0x65AE, 0x65B1, -0x65B2, 0x65B3, 0x65B4, 0x65B5, -0x65B6, 0x65B7, 0x65B8, 0x65BA, -0x65BB, 0x65BE, 0x65BF, 0x65C0, -0x65C2, 0x65C7, 0x65C8, 0x65C9, -0x65CA, 0x65CD, 0x65D0, 0x65D1, -0x65D3, 0x65D4, 0x65D5, 0x65D8, -0x65D9, 0x65DA, 0x65DB, 0x65DC, -0x65DD, 0x65DE, 0x65DF, 0x65E1, -0x65E3, 0x65E4, 0x65EA, 0x65EB, -0x65F2, 0x65F3, 0x65F4, 0x65F5, -0x65F8, 0x65F9, 0x65FB, 0x65FC, -0x65FD, 0x65FE, 0x65FF, 0x6601, -0x6604, 0x6605, 0x6607, 0x6608, -0x6609, 0x660B, 0x660D, 0x6610, -0x6611, 0x6612, 0x6616, 0x6617, -0x6618, 0x661A, 0x661B, 0x661C, -0x661E, 0x6621, 0x6622, 0x6623, -0x6624, 0x6626, 0x6629, 0x662A, -0x662B, 0x662C, 0x662E, 0x6630, -0x6632, 0x6633, 0x6637, 0x6638, -0x6639, 0x663A, 0x663B, 0x663D, -0x663F, 0x6640, 0x6642, 0x6644, -0x6645, 0x6646, 0x6647, 0x6648, -0x6649, 0x664A, 0x664D, 0x664E, -0x6650, 0x6651, 0x6658, 0x6659, -0x665B, 0x665C, 0x665D, 0x665E, -0x6660, 0x6662, 0x6663, 0x6665, -0x6667, 0x6669, 0x666A, 0x666B, -0x666C, 0x666D, 0x6671, 0x6672, -0x6673, 0x6675, 0x6678, 0x6679, -0x667B, 0x667C, 0x667D, 0x667F, -0x6680, 0x6681, 0x6683, 0x6685, -0x6686, 0x6688, 0x6689, 0x668A, -0x668B, 0x668D, 0x668E, 0x668F, -0x6690, 0x6692, 0x6693, 0x6694, -0x6695, 0x6698, 0x6699, 0x669A, -0x669B, 0x669C, 0x669E, 0x669F, -0x66A0, 0x66A1, 0x66A2, 0x66A3, -0x66A4, 0x66A5, 0x66A6, 0x66A9, -0x66AA, 0x66AB, 0x66AC, 0x66AD, -0x66AF, 0x66B0, 0x66B1, 0x66B2, -0x66B3, 0x66B5, 0x66B6, 0x66B7, -0x66B8, 0x66BA, 0x66BB, 0x66BC, -0x66BD, 0x66BF, 0x66C0, 0x66C1, -0x66C2, 0x66C3, 0x66C4, 0x66C5, -0x66C6, 0x66C7, 0x66C8, 0x66C9, -0x66CA, 0x66CB, 0x66CC, 0x66CD, -0x66CE, 0x66CF, 0x66D0, 0x66D1, -0x66D2, 0x66D3, 0x66D4, 0x66D5, -0x66D6, 0x66D7, 0x66D8, 0x66DA, -0x66DE, 0x66DF, 0x66E0, 0x66E1, -0x66E2, 0x66E3, 0x66E4, 0x66E5, -0x66E7, 0x66E8, 0x66EA, 0x66EB, -0x66EC, 0x66ED, 0x66EE, 0x66EF, -0x66F1, 0x66F5, 0x66F6, 0x66F8, -0x66FA, 0x66FB, 0x66FD, 0x6701, -0x6702, 0x6703, 0x6704, 0x6705, -0x6706, 0x6707, 0x670C, 0x670E, -0x670F, 0x6711, 0x6712, 0x6713, -0x6716, 0x6718, 0x6719, 0x671A, -0x671C, 0x671E, 0x6720, 0x6721, -0x6722, 0x6723, 0x6724, 0x6725, -0x6727, 0x6729, 0x672E, 0x6730, -0x6732, 0x6733, 0x6736, 0x6737, -0x6738, 0x6739, 0x673B, 0x673C, -0x673E, 0x673F, 0x6741, 0x6744, -0x6745, 0x6747, 0x674A, 0x674B, -0x674D, 0x6752, 0x6754, 0x6755, -0x6757, 0x6758, 0x6759, 0x675A, -0x675B, 0x675D, 0x6762, 0x6763, -0x6764, 0x6766, 0x6767, 0x676B, -0x676C, 0x676E, 0x6771, 0x6774, -0x6776, 0x6778, 0x6779, 0x677A, -0x677B, 0x677D, 0x6780, 0x6782, -0x6783, 0x6785, 0x6786, 0x6788, -0x678A, 0x678C, 0x678D, 0x678E, -0x678F, 0x6791, 0x6792, 0x6793, -0x6794, 0x6796, 0x6799, 0x679B, -0x679F, 0x67A0, 0x67A1, 0x67A4, -0x67A6, 0x67A9, 0x67AC, 0x67AE, -0x67B1, 0x67B2, 0x67B4, 0x67B9, -0x67BA, 0x67BB, 0x67BC, 0x67BD, -0x67BE, 0x67BF, 0x67C0, 0x67C2, -0x67C5, 0x67C6, 0x67C7, 0x67C8, -0x67C9, 0x67CA, 0x67CB, 0x67CC, -0x67CD, 0x67CE, 0x67D5, 0x67D6, -0x67D7, 0x67DB, 0x67DF, 0x67E1, -0x67E3, 0x67E4, 0x67E6, 0x67E7, -0x67E8, 0x67EA, 0x67EB, 0x67ED, -0x67EE, 0x67F2, 0x67F5, 0x67F6, -0x67F7, 0x67F8, 0x67F9, 0x67FA, -0x67FB, 0x67FC, 0x67FE, 0x6801, -0x6802, 0x6803, 0x6804, 0x6806, -0x680D, 0x6810, 0x6812, 0x6814, -0x6815, 0x6818, 0x6819, 0x681A, -0x681B, 0x681C, 0x681E, 0x681F, -0x6820, 0x6822, 0x6823, 0x6824, -0x6825, 0x6826, 0x6827, 0x6828, -0x682B, 0x682C, 0x682D, 0x682E, -0x682F, 0x6830, 0x6831, 0x6834, -0x6835, 0x6836, 0x683A, 0x683B, -0x683F, 0x6847, 0x684B, 0x684D, -0x684F, 0x6852, 0x6856, 0x6857, -0x6858, 0x6859, 0x685A, 0x685B, -0x685C, 0x685D, 0x685E, 0x685F, -0x686A, 0x686C, 0x686D, 0x686E, -0x686F, 0x6870, 0x6871, 0x6872, -0x6873, 0x6875, 0x6878, 0x6879, -0x687A, 0x687B, 0x687C, 0x687D, -0x687E, 0x687F, 0x6880, 0x6882, -0x6884, 0x6887, 0x6888, 0x6889, -0x688A, 0x688B, 0x688C, 0x688D, -0x688E, 0x6890, 0x6891, 0x6892, -0x6894, 0x6895, 0x6896, 0x6898, -0x6899, 0x689A, 0x689B, 0x689C, -0x689D, 0x689E, 0x689F, 0x68A0, -0x68A1, 0x68A3, 0x68A4, 0x68A5, -0x68A9, 0x68AA, 0x68AB, 0x68AC, -0x68AE, 0x68B1, 0x68B2, 0x68B4, -0x68B6, 0x68B7, 0x68B8, 0x68B9, -0x68BA, 0x68BB, 0x68BC, 0x68BD, -0x68BE, 0x68BF, 0x68C1, 0x68C3, -0x68C4, 0x68C5, 0x68C6, 0x68C7, -0x68C8, 0x68CA, 0x68CC, 0x68CE, -0x68CF, 0x68D0, 0x68D1, 0x68D3, -0x68D4, 0x68D6, 0x68D7, 0x68D9, -0x68DB, 0x68DC, 0x68DD, 0x68DE, -0x68DF, 0x68E1, 0x68E2, 0x68E4, -0x68E5, 0x68E6, 0x68E7, 0x68E8, -0x68E9, 0x68EA, 0x68EB, 0x68EC, -0x68ED, 0x68EF, 0x68F2, 0x68F3, -0x68F4, 0x68F6, 0x68F7, 0x68F8, -0x68FB, 0x68FD, 0x68FE, 0x68FF, -0x6900, 0x6902, 0x6903, 0x6904, -0x6906, 0x6907, 0x6908, 0x6909, -0x690A, 0x690C, 0x690F, 0x6911, -0x6913, 0x6914, 0x6915, 0x6916, -0x6917, 0x6918, 0x6919, 0x691A, -0x691B, 0x691C, 0x691D, 0x691E, -0x6921, 0x6922, 0x6923, 0x6925, -0x6926, 0x6927, 0x6928, 0x6929, -0x692A, 0x692B, 0x692C, 0x692E, -0x692F, 0x6931, 0x6932, 0x6933, -0x6935, 0x6936, 0x6937, 0x6938, -0x693A, 0x693B, 0x693C, 0x693E, -0x6940, 0x6941, 0x6943, 0x6944, -0x6945, 0x6946, 0x6947, 0x6948, -0x6949, 0x694A, 0x694B, 0x694C, -0x694D, 0x694E, 0x694F, 0x6950, -0x6951, 0x6952, 0x6953, 0x6955, -0x6956, 0x6958, 0x6959, 0x695B, -0x695C, 0x695F, 0x6961, 0x6962, -0x6964, 0x6965, 0x6967, 0x6968, -0x6969, 0x696A, 0x696C, 0x696D, -0x696F, 0x6970, 0x6972, 0x6973, -0x6974, 0x6975, 0x6976, 0x697A, -0x697B, 0x697D, 0x697E, 0x697F, -0x6981, 0x6983, 0x6985, 0x698A, -0x698B, 0x698C, 0x698E, 0x698F, -0x6990, 0x6991, 0x6992, 0x6993, -0x6996, 0x6997, 0x6999, 0x699A, -0x699D, 0x699E, 0x699F, 0x69A0, -0x69A1, 0x69A2, 0x69A3, 0x69A4, -0x69A5, 0x69A6, 0x69A9, 0x69AA, -0x69AC, 0x69AE, 0x69AF, 0x69B0, -0x69B2, 0x69B3, 0x69B5, 0x69B6, -0x69B8, 0x69B9, 0x69BA, 0x69BC, -0x69BD, 0x69BE, 0x69BF, 0x69C0, -0x69C2, 0x69C3, 0x69C4, 0x69C5, -0x69C6, 0x69C7, 0x69C8, 0x69C9, -0x69CB, 0x69CD, 0x69CF, 0x69D1, -0x69D2, 0x69D3, 0x69D5, 0x69D6, -0x69D7, 0x69D8, 0x69D9, 0x69DA, -0x69DC, 0x69DD, 0x69DE, 0x69E1, -0x69E2, 0x69E3, 0x69E4, 0x69E5, -0x69E6, 0x69E7, 0x69E8, 0x69E9, -0x69EA, 0x69EB, 0x69EC, 0x69EE, -0x69EF, 0x69F0, 0x69F1, 0x69F3, -0x69F4, 0x69F5, 0x69F6, 0x69F7, -0x69F8, 0x69F9, 0x69FA, 0x69FB, -0x69FC, 0x69FE, 0x6A00, 0x6A01, -0x6A02, 0x6A03, 0x6A04, 0x6A05, -0x6A06, 0x6A07, 0x6A08, 0x6A09, -0x6A0B, 0x6A0C, 0x6A0D, 0x6A0E, -0x6A0F, 0x6A10, 0x6A11, 0x6A12, -0x6A13, 0x6A14, 0x6A15, 0x6A16, -0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, -0x6A1D, 0x6A1E, 0x6A20, 0x6A22, -0x6A23, 0x6A24, 0x6A25, 0x6A26, -0x6A27, 0x6A29, 0x6A2B, 0x6A2C, -0x6A2D, 0x6A2E, 0x6A30, 0x6A32, -0x6A33, 0x6A34, 0x6A36, 0x6A37, -0x6A38, 0x6A39, 0x6A3A, 0x6A3B, -0x6A3C, 0x6A3F, 0x6A40, 0x6A41, -0x6A42, 0x6A43, 0x6A45, 0x6A46, -0x6A48, 0x6A49, 0x6A4A, 0x6A4B, -0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, -0x6A51, 0x6A52, 0x6A53, 0x6A54, -0x6A55, 0x6A56, 0x6A57, 0x6A5A, -0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, -0x6A60, 0x6A62, 0x6A63, 0x6A64, -0x6A66, 0x6A67, 0x6A68, 0x6A69, -0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, -0x6A6E, 0x6A6F, 0x6A70, 0x6A72, -0x6A73, 0x6A74, 0x6A75, 0x6A76, -0x6A77, 0x6A78, 0x6A7A, 0x6A7B, -0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, -0x6A82, 0x6A83, 0x6A85, 0x6A86, -0x6A87, 0x6A88, 0x6A89, 0x6A8A, -0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, -0x6A92, 0x6A93, 0x6A94, 0x6A95, -0x6A96, 0x6A98, 0x6A99, 0x6A9A, -0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E, -0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, -0x6AA4, 0x6AA5, 0x6AA6, 0x6AA7, -0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, -0x6AAF, 0x6AB0, 0x6AB1, 0x6AB2, -0x6AB3, 0x6AB4, 0x6AB5, 0x6AB6, -0x6AB7, 0x6AB8, 0x6AB9, 0x6ABA, -0x6ABB, 0x6ABC, 0x6ABD, 0x6ABE, -0x6ABF, 0x6AC0, 0x6AC1, 0x6AC2, -0x6AC3, 0x6AC4, 0x6AC5, 0x6AC6, -0x6AC7, 0x6AC8, 0x6AC9, 0x6ACA, -0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, -0x6ACF, 0x6AD0, 0x6AD1, 0x6AD2, -0x6AD3, 0x6AD4, 0x6AD5, 0x6AD6, -0x6AD7, 0x6AD8, 0x6AD9, 0x6ADA, -0x6ADB, 0x6ADC, 0x6ADD, 0x6ADE, -0x6ADF, 0x6AE0, 0x6AE1, 0x6AE2, -0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, -0x6AE7, 0x6AE8, 0x6AE9, 0x6AEA, -0x6AEB, 0x6AEC, 0x6AED, 0x6AEE, -0x6AEF, 0x6AF0, 0x6AF1, 0x6AF2, -0x6AF3, 0x6AF4, 0x6AF5, 0x6AF6, -0x6AF7, 0x6AF8, 0x6AF9, 0x6AFA, -0x6AFB, 0x6AFC, 0x6AFD, 0x6AFE, -0x6AFF, 0x6B00, 0x6B01, 0x6B02, -0x6B03, 0x6B04, 0x6B05, 0x6B06, -0x6B07, 0x6B08, 0x6B09, 0x6B0A, -0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, -0x6B0F, 0x6B10, 0x6B11, 0x6B12, -0x6B13, 0x6B14, 0x6B15, 0x6B16, -0x6B17, 0x6B18, 0x6B19, 0x6B1A, -0x6B1B, 0x6B1C, 0x6B1D, 0x6B1E, -0x6B1F, 0x6B25, 0x6B26, 0x6B28, -0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, -0x6B2D, 0x6B2E, 0x6B2F, 0x6B30, -0x6B31, 0x6B33, 0x6B34, 0x6B35, -0x6B36, 0x6B38, 0x6B3B, 0x6B3C, -0x6B3D, 0x6B3F, 0x6B40, 0x6B41, -0x6B42, 0x6B44, 0x6B45, 0x6B48, -0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, -0x6B4F, 0x6B50, 0x6B51, 0x6B52, -0x6B53, 0x6B54, 0x6B55, 0x6B56, -0x6B57, 0x6B58, 0x6B5A, 0x6B5B, -0x6B5C, 0x6B5D, 0x6B5E, 0x6B5F, -0x6B60, 0x6B61, 0x6B68, 0x6B69, -0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, -0x6B6F, 0x6B70, 0x6B71, 0x6B72, -0x6B73, 0x6B74, 0x6B75, 0x6B76, -0x6B77, 0x6B78, 0x6B7A, 0x6B7D, -0x6B7E, 0x6B7F, 0x6B80, 0x6B85, -0x6B88, 0x6B8C, 0x6B8E, 0x6B8F, -0x6B90, 0x6B91, 0x6B94, 0x6B95, -0x6B97, 0x6B98, 0x6B99, 0x6B9C, -0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, -0x6BA2, 0x6BA3, 0x6BA4, 0x6BA5, -0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, -0x6BAB, 0x6BAC, 0x6BAD, 0x6BAE, -0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, -0x6BB6, 0x6BB8, 0x6BB9, 0x6BBA, -0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, -0x6BC0, 0x6BC3, 0x6BC4, 0x6BC6, -0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, -0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1, -0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, -0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2, -0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, -0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC, -0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, -0x6BF2, 0x6BF4, 0x6BF6, 0x6BF7, -0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, -0x6BFE, 0x6BFF, 0x6C00, 0x6C01, -0x6C02, 0x6C03, 0x6C04, 0x6C08, -0x6C09, 0x6C0A, 0x6C0B, 0x6C0C, -0x6C0E, 0x6C12, 0x6C17, 0x6C1C, -0x6C1D, 0x6C1E, 0x6C20, 0x6C23, -0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, -0x6C31, 0x6C33, 0x6C36, 0x6C37, -0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, -0x6C3E, 0x6C3F, 0x6C43, 0x6C44, -0x6C45, 0x6C48, 0x6C4B, 0x6C4C, -0x6C4D, 0x6C4E, 0x6C4F, 0x6C51, -0x6C52, 0x6C53, 0x6C56, 0x6C58, -0x6C59, 0x6C5A, 0x6C62, 0x6C63, -0x6C65, 0x6C66, 0x6C67, 0x6C6B, -0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, -0x6C71, 0x6C73, 0x6C75, 0x6C77, -0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, -0x6C7F, 0x6C80, 0x6C84, 0x6C87, -0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, -0x6C91, 0x6C92, 0x6C95, 0x6C96, -0x6C97, 0x6C98, 0x6C9A, 0x6C9C, -0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, -0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, -0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, -0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, -0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, -0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, -0x6CD1, 0x6CD2, 0x6CD8, 0x6CD9, -0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, -0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, -0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, -0x6CF9, 0x6CFF, 0x6D00, 0x6D02, -0x6D03, 0x6D05, 0x6D06, 0x6D08, -0x6D09, 0x6D0A, 0x6D0D, 0x6D0F, -0x6D10, 0x6D11, 0x6D13, 0x6D14, -0x6D15, 0x6D16, 0x6D18, 0x6D1C, -0x6D1D, 0x6D1F, 0x6D20, 0x6D21, -0x6D22, 0x6D23, 0x6D24, 0x6D26, -0x6D28, 0x6D29, 0x6D2C, 0x6D2D, -0x6D2F, 0x6D30, 0x6D34, 0x6D36, -0x6D37, 0x6D38, 0x6D3A, 0x6D3F, -0x6D40, 0x6D42, 0x6D44, 0x6D49, -0x6D4C, 0x6D50, 0x6D55, 0x6D56, -0x6D57, 0x6D58, 0x6D5B, 0x6D5D, -0x6D5F, 0x6D61, 0x6D62, 0x6D64, -0x6D65, 0x6D67, 0x6D68, 0x6D6B, -0x6D6C, 0x6D6D, 0x6D70, 0x6D71, -0x6D72, 0x6D73, 0x6D75, 0x6D76, -0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, -0x6D7E, 0x6D7F, 0x6D80, 0x6D81, -0x6D83, 0x6D84, 0x6D86, 0x6D87, -0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, -0x6D90, 0x6D92, 0x6D96, 0x6D97, -0x6D98, 0x6D99, 0x6D9A, 0x6D9C, -0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, -0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, -0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, -0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, -0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, -0x6DC9, 0x6DCA, 0x6DCD, 0x6DCE, -0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, -0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, -0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, -0x6DE3, 0x6DE5, 0x6DE7, 0x6DE8, -0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, -0x6DF0, 0x6DF2, 0x6DF4, 0x6DF5, -0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, -0x6DFE, 0x6DFF, 0x6E00, 0x6E01, -0x6E02, 0x6E03, 0x6E04, 0x6E06, -0x6E07, 0x6E08, 0x6E09, 0x6E0B, -0x6E0F, 0x6E12, 0x6E13, 0x6E15, -0x6E18, 0x6E19, 0x6E1B, 0x6E1C, -0x6E1E, 0x6E1F, 0x6E22, 0x6E26, -0x6E27, 0x6E28, 0x6E2A, 0x6E2C, -0x6E2E, 0x6E30, 0x6E31, 0x6E33, -0x6E35, 0x6E36, 0x6E37, 0x6E39, -0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, -0x6E3F, 0x6E40, 0x6E41, 0x6E42, -0x6E45, 0x6E46, 0x6E47, 0x6E48, -0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, -0x6E4F, 0x6E50, 0x6E51, 0x6E52, -0x6E55, 0x6E57, 0x6E59, 0x6E5A, -0x6E5C, 0x6E5D, 0x6E5E, 0x6E60, -0x6E61, 0x6E62, 0x6E63, 0x6E64, -0x6E65, 0x6E66, 0x6E67, 0x6E68, -0x6E69, 0x6E6A, 0x6E6C, 0x6E6D, -0x6E6F, 0x6E70, 0x6E71, 0x6E72, -0x6E73, 0x6E74, 0x6E75, 0x6E76, -0x6E77, 0x6E78, 0x6E79, 0x6E7A, -0x6E7B, 0x6E7C, 0x6E7D, 0x6E80, -0x6E81, 0x6E82, 0x6E84, 0x6E87, -0x6E88, 0x6E8A, 0x6E8B, 0x6E8C, -0x6E8D, 0x6E8E, 0x6E91, 0x6E92, -0x6E93, 0x6E94, 0x6E95, 0x6E96, -0x6E97, 0x6E99, 0x6E9A, 0x6E9B, -0x6E9D, 0x6E9E, 0x6EA0, 0x6EA1, -0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, -0x6EA9, 0x6EAB, 0x6EAC, 0x6EAD, -0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, -0x6EB8, 0x6EB9, 0x6EBC, 0x6EBE, -0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, -0x6EC5, 0x6EC6, 0x6EC8, 0x6EC9, -0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, -0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, -0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, -0x6EE3, 0x6EE7, 0x6EEA, 0x6EEB, -0x6EEC, 0x6EED, 0x6EEE, 0x6EEF, -0x6EF0, 0x6EF1, 0x6EF2, 0x6EF3, -0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8, -0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, -0x6EFE, 0x6EFF, 0x6F00, 0x6F01, -0x6F03, 0x6F04, 0x6F05, 0x6F07, -0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, -0x6F0D, 0x6F0E, 0x6F10, 0x6F11, -0x6F12, 0x6F16, 0x6F17, 0x6F18, -0x6F19, 0x6F1A, 0x6F1B, 0x6F1C, -0x6F1D, 0x6F1E, 0x6F1F, 0x6F21, -0x6F22, 0x6F23, 0x6F25, 0x6F26, -0x6F27, 0x6F28, 0x6F2C, 0x6F2E, -0x6F30, 0x6F32, 0x6F34, 0x6F35, -0x6F37, 0x6F38, 0x6F39, 0x6F3A, -0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, -0x6F40, 0x6F41, 0x6F42, 0x6F43, -0x6F44, 0x6F45, 0x6F48, 0x6F49, -0x6F4A, 0x6F4C, 0x6F4E, 0x6F4F, -0x6F50, 0x6F51, 0x6F52, 0x6F53, -0x6F54, 0x6F55, 0x6F56, 0x6F57, -0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, -0x6F5F, 0x6F60, 0x6F61, 0x6F63, -0x6F64, 0x6F65, 0x6F67, 0x6F68, -0x6F69, 0x6F6A, 0x6F6B, 0x6F6C, -0x6F6F, 0x6F70, 0x6F71, 0x6F73, -0x6F75, 0x6F76, 0x6F77, 0x6F79, -0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, -0x6F80, 0x6F81, 0x6F82, 0x6F83, -0x6F85, 0x6F86, 0x6F87, 0x6F8A, -0x6F8B, 0x6F8F, 0x6F90, 0x6F91, -0x6F92, 0x6F93, 0x6F94, 0x6F95, -0x6F96, 0x6F97, 0x6F98, 0x6F99, -0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, -0x6F9F, 0x6FA0, 0x6FA2, 0x6FA3, -0x6FA4, 0x6FA5, 0x6FA6, 0x6FA8, -0x6FA9, 0x6FAA, 0x6FAB, 0x6FAC, -0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, -0x6FB1, 0x6FB2, 0x6FB4, 0x6FB5, -0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, -0x6FBC, 0x6FBD, 0x6FBE, 0x6FBF, -0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, -0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, -0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, -0x6FCF, 0x6FD0, 0x6FD3, 0x6FD4, -0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, -0x6FD9, 0x6FDA, 0x6FDB, 0x6FDC, -0x6FDD, 0x6FDF, 0x6FE2, 0x6FE3, -0x6FE4, 0x6FE5, 0x6FE6, 0x6FE7, -0x6FE8, 0x6FE9, 0x6FEA, 0x6FEB, -0x6FEC, 0x6FED, 0x6FF0, 0x6FF1, -0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, -0x6FF6, 0x6FF7, 0x6FF8, 0x6FF9, -0x6FFA, 0x6FFB, 0x6FFC, 0x6FFD, -0x6FFE, 0x6FFF, 0x7000, 0x7001, -0x7002, 0x7003, 0x7004, 0x7005, -0x7006, 0x7007, 0x7008, 0x7009, -0x700A, 0x700B, 0x700C, 0x700D, -0x700E, 0x700F, 0x7010, 0x7012, -0x7013, 0x7014, 0x7015, 0x7016, -0x7017, 0x7018, 0x7019, 0x701C, -0x701D, 0x701E, 0x701F, 0x7020, -0x7021, 0x7022, 0x7024, 0x7025, -0x7026, 0x7027, 0x7028, 0x7029, -0x702A, 0x702B, 0x702C, 0x702D, -0x702E, 0x702F, 0x7030, 0x7031, -0x7032, 0x7033, 0x7034, 0x7036, -0x7037, 0x7038, 0x703A, 0x703B, -0x703C, 0x703D, 0x703E, 0x703F, -0x7040, 0x7041, 0x7042, 0x7043, -0x7044, 0x7045, 0x7046, 0x7047, -0x7048, 0x7049, 0x704A, 0x704B, -0x704D, 0x704E, 0x7050, 0x7051, -0x7052, 0x7053, 0x7054, 0x7055, -0x7056, 0x7057, 0x7058, 0x7059, -0x705A, 0x705B, 0x705C, 0x705D, -0x705F, 0x7060, 0x7061, 0x7062, -0x7063, 0x7064, 0x7065, 0x7066, -0x7067, 0x7068, 0x7069, 0x706A, -0x706E, 0x7071, 0x7072, 0x7073, -0x7074, 0x7077, 0x7079, 0x707A, -0x707B, 0x707D, 0x7081, 0x7082, -0x7083, 0x7084, 0x7086, 0x7087, -0x7088, 0x708B, 0x708C, 0x708D, -0x708F, 0x7090, 0x7091, 0x7093, -0x7097, 0x7098, 0x709A, 0x709B, -0x709E, 0x709F, 0x70A0, 0x70A1, -0x70A2, 0x70A3, 0x70A4, 0x70A5, -0x70A6, 0x70A7, 0x70A8, 0x70A9, -0x70AA, 0x70B0, 0x70B2, 0x70B4, -0x70B5, 0x70B6, 0x70BA, 0x70BE, -0x70BF, 0x70C4, 0x70C5, 0x70C6, -0x70C7, 0x70C9, 0x70CB, 0x70CC, -0x70CD, 0x70CE, 0x70CF, 0x70D0, -0x70D1, 0x70D2, 0x70D3, 0x70D4, -0x70D5, 0x70D6, 0x70D7, 0x70DA, -0x70DC, 0x70DD, 0x70DE, 0x70E0, -0x70E1, 0x70E2, 0x70E3, 0x70E5, -0x70EA, 0x70EE, 0x70F0, 0x70F1, -0x70F2, 0x70F3, 0x70F4, 0x70F5, -0x70F6, 0x70F8, 0x70FA, 0x70FB, -0x70FC, 0x70FE, 0x70FF, 0x7100, -0x7101, 0x7102, 0x7103, 0x7104, -0x7105, 0x7106, 0x7107, 0x7108, -0x710B, 0x710C, 0x710D, 0x710E, -0x710F, 0x7111, 0x7112, 0x7114, -0x7117, 0x711B, 0x711C, 0x711D, -0x711E, 0x711F, 0x7120, 0x7121, -0x7122, 0x7123, 0x7124, 0x7125, -0x7127, 0x7128, 0x7129, 0x712A, -0x712B, 0x712C, 0x712D, 0x712E, -0x7132, 0x7133, 0x7134, 0x7135, -0x7137, 0x7138, 0x7139, 0x713A, -0x713B, 0x713C, 0x713D, 0x713E, -0x713F, 0x7140, 0x7141, 0x7142, -0x7143, 0x7144, 0x7146, 0x7147, -0x7148, 0x7149, 0x714B, 0x714D, -0x714F, 0x7150, 0x7151, 0x7152, -0x7153, 0x7154, 0x7155, 0x7156, -0x7157, 0x7158, 0x7159, 0x715A, -0x715B, 0x715D, 0x715F, 0x7160, -0x7161, 0x7162, 0x7163, 0x7165, -0x7169, 0x716A, 0x716B, 0x716C, -0x716D, 0x716F, 0x7170, 0x7171, -0x7174, 0x7175, 0x7176, 0x7177, -0x7179, 0x717B, 0x717C, 0x717E, -0x717F, 0x7180, 0x7181, 0x7182, -0x7183, 0x7185, 0x7186, 0x7187, -0x7188, 0x7189, 0x718B, 0x718C, -0x718D, 0x718E, 0x7190, 0x7191, -0x7192, 0x7193, 0x7195, 0x7196, -0x7197, 0x719A, 0x719B, 0x719C, -0x719D, 0x719E, 0x71A1, 0x71A2, -0x71A3, 0x71A4, 0x71A5, 0x71A6, -0x71A7, 0x71A9, 0x71AA, 0x71AB, -0x71AD, 0x71AE, 0x71AF, 0x71B0, -0x71B1, 0x71B2, 0x71B4, 0x71B6, -0x71B7, 0x71B8, 0x71BA, 0x71BB, -0x71BC, 0x71BD, 0x71BE, 0x71BF, -0x71C0, 0x71C1, 0x71C2, 0x71C4, -0x71C5, 0x71C6, 0x71C7, 0x71C8, -0x71C9, 0x71CA, 0x71CB, 0x71CC, -0x71CD, 0x71CF, 0x71D0, 0x71D1, -0x71D2, 0x71D3, 0x71D6, 0x71D7, -0x71D8, 0x71D9, 0x71DA, 0x71DB, -0x71DC, 0x71DD, 0x71DE, 0x71DF, -0x71E1, 0x71E2, 0x71E3, 0x71E4, -0x71E6, 0x71E8, 0x71E9, 0x71EA, -0x71EB, 0x71EC, 0x71ED, 0x71EF, -0x71F0, 0x71F1, 0x71F2, 0x71F3, -0x71F4, 0x71F5, 0x71F6, 0x71F7, -0x71F8, 0x71FA, 0x71FB, 0x71FC, -0x71FD, 0x71FE, 0x71FF, 0x7200, -0x7201, 0x7202, 0x7203, 0x7204, -0x7205, 0x7207, 0x7208, 0x7209, -0x720A, 0x720B, 0x720C, 0x720D, -0x720E, 0x720F, 0x7210, 0x7211, -0x7212, 0x7213, 0x7214, 0x7215, -0x7216, 0x7217, 0x7218, 0x7219, -0x721A, 0x721B, 0x721C, 0x721E, -0x721F, 0x7220, 0x7221, 0x7222, -0x7223, 0x7224, 0x7225, 0x7226, -0x7227, 0x7229, 0x722B, 0x722D, -0x722E, 0x722F, 0x7232, 0x7233, -0x7234, 0x723A, 0x723C, 0x723E, -0x7240, 0x7241, 0x7242, 0x7243, -0x7244, 0x7245, 0x7246, 0x7249, -0x724A, 0x724B, 0x724E, 0x724F, -0x7250, 0x7251, 0x7253, 0x7254, -0x7255, 0x7257, 0x7258, 0x725A, -0x725C, 0x725E, 0x7260, 0x7263, -0x7264, 0x7265, 0x7268, 0x726A, -0x726B, 0x726C, 0x726D, 0x7270, -0x7271, 0x7273, 0x7274, 0x7276, -0x7277, 0x7278, 0x727B, 0x727C, -0x727D, 0x7282, 0x7283, 0x7285, -0x7286, 0x7287, 0x7288, 0x7289, -0x728C, 0x728E, 0x7290, 0x7291, -0x7293, 0x7294, 0x7295, 0x7296, -0x7297, 0x7298, 0x7299, 0x729A, -0x729B, 0x729C, 0x729D, 0x729E, -0x72A0, 0x72A1, 0x72A2, 0x72A3, -0x72A4, 0x72A5, 0x72A6, 0x72A7, -0x72A8, 0x72A9, 0x72AA, 0x72AB, -0x72AE, 0x72B1, 0x72B2, 0x72B3, -0x72B5, 0x72BA, 0x72BB, 0x72BC, -0x72BD, 0x72BE, 0x72BF, 0x72C0, -0x72C5, 0x72C6, 0x72C7, 0x72C9, -0x72CA, 0x72CB, 0x72CC, 0x72CF, -0x72D1, 0x72D3, 0x72D4, 0x72D5, -0x72D6, 0x72D8, 0x72DA, 0x72DB, -0xE4C6, 0xE4C7, 0xE4C8, 0xE4C9, -0xE4CA, 0xE4CB, 0xE4CC, 0xE4CD, -0xE4CE, 0xE4CF, 0xE4D0, 0xE4D1, -0xE4D2, 0xE4D3, 0xE4D4, 0xE4D5, -0xE4D6, 0xE4D7, 0xE4D8, 0xE4D9, -0xE4DA, 0xE4DB, 0xE4DC, 0xE4DD, -0xE4DE, 0xE4DF, 0xE4E0, 0xE4E1, -0xE4E2, 0xE4E3, 0xE4E4, 0xE4E5, -0xE4E6, 0xE4E7, 0xE4E8, 0xE4E9, -0xE4EA, 0xE4EB, 0xE4EC, 0xE4ED, -0xE4EE, 0xE4EF, 0xE4F0, 0xE4F1, -0xE4F2, 0xE4F3, 0xE4F4, 0xE4F5, -0xE4F6, 0xE4F7, 0xE4F8, 0xE4F9, -0xE4FA, 0xE4FB, 0xE4FC, 0xE4FD, -0xE4FE, 0xE4FF, 0xE500, 0xE501, -0xE502, 0xE503, 0xE504, 0xE505, -0xE506, 0xE507, 0xE508, 0xE509, -0xE50A, 0xE50B, 0xE50C, 0xE50D, -0xE50E, 0xE50F, 0xE510, 0xE511, -0xE512, 0xE513, 0xE514, 0xE515, -0xE516, 0xE517, 0xE518, 0xE519, -0xE51A, 0xE51B, 0xE51C, 0xE51D, -0xE51E, 0xE51F, 0xE520, 0xE521, -0xE522, 0xE523, 0xE524, 0xE525, -0x3000, 0x3001, 0x3002, 0x00B7, -0x02C9, 0x02C7, 0x00A8, 0x3003, -0x3005, 0x2014, 0xFF5E, 0x2016, -0x2026, 0x2018, 0x2019, 0x201C, -0x201D, 0x3014, 0x3015, 0x3008, -0x3009, 0x300A, 0x300B, 0x300C, -0x300D, 0x300E, 0x300F, 0x3016, -0x3017, 0x3010, 0x3011, 0x00B1, -0x00D7, 0x00F7, 0x2236, 0x2227, -0x2228, 0x2211, 0x220F, 0x222A, -0x2229, 0x2208, 0x2237, 0x221A, -0x22A5, 0x2225, 0x2220, 0x2312, -0x2299, 0x222B, 0x222E, 0x2261, -0x224C, 0x2248, 0x223D, 0x221D, -0x2260, 0x226E, 0x226F, 0x2264, -0x2265, 0x221E, 0x2235, 0x2234, -0x2642, 0x2640, 0x00B0, 0x2032, -0x2033, 0x2103, 0xFF04, 0x00A4, -0xFFE0, 0xFFE1, 0x2030, 0x00A7, -0x2116, 0x2606, 0x2605, 0x25CB, -0x25CF, 0x25CE, 0x25C7, 0x25C6, -0x25A1, 0x25A0, 0x25B3, 0x25B2, -0x203B, 0x2192, 0x2190, 0x2191, -0x2193, 0x3013, 0xE526, 0xE527, -0xE528, 0xE529, 0xE52A, 0xE52B, -0xE52C, 0xE52D, 0xE52E, 0xE52F, -0xE530, 0xE531, 0xE532, 0xE533, -0xE534, 0xE535, 0xE536, 0xE537, -0xE538, 0xE539, 0xE53A, 0xE53B, -0xE53C, 0xE53D, 0xE53E, 0xE53F, -0xE540, 0xE541, 0xE542, 0xE543, -0xE544, 0xE545, 0xE546, 0xE547, -0xE548, 0xE549, 0xE54A, 0xE54B, -0xE54C, 0xE54D, 0xE54E, 0xE54F, -0xE550, 0xE551, 0xE552, 0xE553, -0xE554, 0xE555, 0xE556, 0xE557, -0xE558, 0xE559, 0xE55A, 0xE55B, -0xE55C, 0xE55D, 0xE55E, 0xE55F, -0xE560, 0xE561, 0xE562, 0xE563, -0xE564, 0xE565, 0xE566, 0xE567, -0xE568, 0xE569, 0xE56A, 0xE56B, -0xE56C, 0xE56D, 0xE56E, 0xE56F, -0xE570, 0xE571, 0xE572, 0xE573, -0xE574, 0xE575, 0xE576, 0xE577, -0xE578, 0xE579, 0xE57A, 0xE57B, -0xE57C, 0xE57D, 0xE57E, 0xE57F, -0xE580, 0xE581, 0xE582, 0xE583, -0xE584, 0xE585, 0x2170, 0x2171, -0x2172, 0x2173, 0x2174, 0x2175, -0x2176, 0x2177, 0x2178, 0x2179, -0xE766, 0xE767, 0xE768, 0xE769, -0xE76A, 0xE76B, 0x2488, 0x2489, -0x248A, 0x248B, 0x248C, 0x248D, -0x248E, 0x248F, 0x2490, 0x2491, -0x2492, 0x2493, 0x2494, 0x2495, -0x2496, 0x2497, 0x2498, 0x2499, -0x249A, 0x249B, 0x2474, 0x2475, -0x2476, 0x2477, 0x2478, 0x2479, -0x247A, 0x247B, 0x247C, 0x247D, -0x247E, 0x247F, 0x2480, 0x2481, -0x2482, 0x2483, 0x2484, 0x2485, -0x2486, 0x2487, 0x2460, 0x2461, -0x2462, 0x2463, 0x2464, 0x2465, -0x2466, 0x2467, 0x2468, 0x2469, -0x20AC, 0xE76D, 0x3220, 0x3221, -0x3222, 0x3223, 0x3224, 0x3225, -0x3226, 0x3227, 0x3228, 0x3229, -0xE76E, 0xE76F, 0x2160, 0x2161, -0x2162, 0x2163, 0x2164, 0x2165, -0x2166, 0x2167, 0x2168, 0x2169, -0x216A, 0x216B, 0xE770, 0xE771, -0xE586, 0xE587, 0xE588, 0xE589, -0xE58A, 0xE58B, 0xE58C, 0xE58D, -0xE58E, 0xE58F, 0xE590, 0xE591, -0xE592, 0xE593, 0xE594, 0xE595, -0xE596, 0xE597, 0xE598, 0xE599, -0xE59A, 0xE59B, 0xE59C, 0xE59D, -0xE59E, 0xE59F, 0xE5A0, 0xE5A1, -0xE5A2, 0xE5A3, 0xE5A4, 0xE5A5, -0xE5A6, 0xE5A7, 0xE5A8, 0xE5A9, -0xE5AA, 0xE5AB, 0xE5AC, 0xE5AD, -0xE5AE, 0xE5AF, 0xE5B0, 0xE5B1, -0xE5B2, 0xE5B3, 0xE5B4, 0xE5B5, -0xE5B6, 0xE5B7, 0xE5B8, 0xE5B9, -0xE5BA, 0xE5BB, 0xE5BC, 0xE5BD, -0xE5BE, 0xE5BF, 0xE5C0, 0xE5C1, -0xE5C2, 0xE5C3, 0xE5C4, 0xE5C5, -0xE5C6, 0xE5C7, 0xE5C8, 0xE5C9, -0xE5CA, 0xE5CB, 0xE5CC, 0xE5CD, -0xE5CE, 0xE5CF, 0xE5D0, 0xE5D1, -0xE5D2, 0xE5D3, 0xE5D4, 0xE5D5, -0xE5D6, 0xE5D7, 0xE5D8, 0xE5D9, -0xE5DA, 0xE5DB, 0xE5DC, 0xE5DD, -0xE5DE, 0xE5DF, 0xE5E0, 0xE5E1, -0xE5E2, 0xE5E3, 0xE5E4, 0x3000, -0xFF01, 0xFF02, 0xFF03, 0xFFE5, -0xFF05, 0xFF06, 0xFF07, 0xFF08, -0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, -0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, -0xFF11, 0xFF12, 0xFF13, 0xFF14, -0xFF15, 0xFF16, 0xFF17, 0xFF18, -0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, -0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, -0xFF21, 0xFF22, 0xFF23, 0xFF24, -0xFF25, 0xFF26, 0xFF27, 0xFF28, -0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, -0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, -0xFF31, 0xFF32, 0xFF33, 0xFF34, -0xFF35, 0xFF36, 0xFF37, 0xFF38, -0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, -0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, -0xFF41, 0xFF42, 0xFF43, 0xFF44, -0xFF45, 0xFF46, 0xFF47, 0xFF48, -0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, -0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, -0xFF51, 0xFF52, 0xFF53, 0xFF54, -0xFF55, 0xFF56, 0xFF57, 0xFF58, -0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, -0xFF5D, 0xFFE3, 0xE5E6, 0xE5E7, -0xE5E8, 0xE5E9, 0xE5EA, 0xE5EB, -0xE5EC, 0xE5ED, 0xE5EE, 0xE5EF, -0xE5F0, 0xE5F1, 0xE5F2, 0xE5F3, -0xE5F4, 0xE5F5, 0xE5F6, 0xE5F7, -0xE5F8, 0xE5F9, 0xE5FA, 0xE5FB, -0xE5FC, 0xE5FD, 0xE5FE, 0xE5FF, -0xE600, 0xE601, 0xE602, 0xE603, -0xE604, 0xE605, 0xE606, 0xE607, -0xE608, 0xE609, 0xE60A, 0xE60B, -0xE60C, 0xE60D, 0xE60E, 0xE60F, -0xE610, 0xE611, 0xE612, 0xE613, -0xE614, 0xE615, 0xE616, 0xE617, -0xE618, 0xE619, 0xE61A, 0xE61B, -0xE61C, 0xE61D, 0xE61E, 0xE61F, -0xE620, 0xE621, 0xE622, 0xE623, -0xE624, 0xE625, 0xE626, 0xE627, -0xE628, 0xE629, 0xE62A, 0xE62B, -0xE62C, 0xE62D, 0xE62E, 0xE62F, -0xE630, 0xE631, 0xE632, 0xE633, -0xE634, 0xE635, 0xE636, 0xE637, -0xE638, 0xE639, 0xE63A, 0xE63B, -0xE63C, 0xE63D, 0xE63E, 0xE63F, -0xE640, 0xE641, 0xE642, 0xE643, -0xE644, 0xE645, 0x3041, 0x3042, -0x3043, 0x3044, 0x3045, 0x3046, -0x3047, 0x3048, 0x3049, 0x304A, -0x304B, 0x304C, 0x304D, 0x304E, -0x304F, 0x3050, 0x3051, 0x3052, -0x3053, 0x3054, 0x3055, 0x3056, -0x3057, 0x3058, 0x3059, 0x305A, -0x305B, 0x305C, 0x305D, 0x305E, -0x305F, 0x3060, 0x3061, 0x3062, -0x3063, 0x3064, 0x3065, 0x3066, -0x3067, 0x3068, 0x3069, 0x306A, -0x306B, 0x306C, 0x306D, 0x306E, -0x306F, 0x3070, 0x3071, 0x3072, -0x3073, 0x3074, 0x3075, 0x3076, -0x3077, 0x3078, 0x3079, 0x307A, -0x307B, 0x307C, 0x307D, 0x307E, -0x307F, 0x3080, 0x3081, 0x3082, -0x3083, 0x3084, 0x3085, 0x3086, -0x3087, 0x3088, 0x3089, 0x308A, -0x308B, 0x308C, 0x308D, 0x308E, -0x308F, 0x3090, 0x3091, 0x3092, -0x3093, 0xE772, 0xE773, 0xE774, -0xE775, 0xE776, 0xE777, 0xE778, -0xE779, 0xE77A, 0xE77B, 0xE77C, -0xE646, 0xE647, 0xE648, 0xE649, -0xE64A, 0xE64B, 0xE64C, 0xE64D, -0xE64E, 0xE64F, 0xE650, 0xE651, -0xE652, 0xE653, 0xE654, 0xE655, -0xE656, 0xE657, 0xE658, 0xE659, -0xE65A, 0xE65B, 0xE65C, 0xE65D, -0xE65E, 0xE65F, 0xE660, 0xE661, -0xE662, 0xE663, 0xE664, 0xE665, -0xE666, 0xE667, 0xE668, 0xE669, -0xE66A, 0xE66B, 0xE66C, 0xE66D, -0xE66E, 0xE66F, 0xE670, 0xE671, -0xE672, 0xE673, 0xE674, 0xE675, -0xE676, 0xE677, 0xE678, 0xE679, -0xE67A, 0xE67B, 0xE67C, 0xE67D, -0xE67E, 0xE67F, 0xE680, 0xE681, -0xE682, 0xE683, 0xE684, 0xE685, -0xE686, 0xE687, 0xE688, 0xE689, -0xE68A, 0xE68B, 0xE68C, 0xE68D, -0xE68E, 0xE68F, 0xE690, 0xE691, -0xE692, 0xE693, 0xE694, 0xE695, -0xE696, 0xE697, 0xE698, 0xE699, -0xE69A, 0xE69B, 0xE69C, 0xE69D, -0xE69E, 0xE69F, 0xE6A0, 0xE6A1, -0xE6A2, 0xE6A3, 0xE6A4, 0xE6A5, -0x30A1, 0x30A2, 0x30A3, 0x30A4, -0x30A5, 0x30A6, 0x30A7, 0x30A8, -0x30A9, 0x30AA, 0x30AB, 0x30AC, -0x30AD, 0x30AE, 0x30AF, 0x30B0, -0x30B1, 0x30B2, 0x30B3, 0x30B4, -0x30B5, 0x30B6, 0x30B7, 0x30B8, -0x30B9, 0x30BA, 0x30BB, 0x30BC, -0x30BD, 0x30BE, 0x30BF, 0x30C0, -0x30C1, 0x30C2, 0x30C3, 0x30C4, -0x30C5, 0x30C6, 0x30C7, 0x30C8, -0x30C9, 0x30CA, 0x30CB, 0x30CC, -0x30CD, 0x30CE, 0x30CF, 0x30D0, -0x30D1, 0x30D2, 0x30D3, 0x30D4, -0x30D5, 0x30D6, 0x30D7, 0x30D8, -0x30D9, 0x30DA, 0x30DB, 0x30DC, -0x30DD, 0x30DE, 0x30DF, 0x30E0, -0x30E1, 0x30E2, 0x30E3, 0x30E4, -0x30E5, 0x30E6, 0x30E7, 0x30E8, -0x30E9, 0x30EA, 0x30EB, 0x30EC, -0x30ED, 0x30EE, 0x30EF, 0x30F0, -0x30F1, 0x30F2, 0x30F3, 0x30F4, -0x30F5, 0x30F6, 0xE77D, 0xE77E, -0xE77F, 0xE780, 0xE781, 0xE782, -0xE783, 0xE784, 0xE6A6, 0xE6A7, -0xE6A8, 0xE6A9, 0xE6AA, 0xE6AB, -0xE6AC, 0xE6AD, 0xE6AE, 0xE6AF, -0xE6B0, 0xE6B1, 0xE6B2, 0xE6B3, -0xE6B4, 0xE6B5, 0xE6B6, 0xE6B7, -0xE6B8, 0xE6B9, 0xE6BA, 0xE6BB, -0xE6BC, 0xE6BD, 0xE6BE, 0xE6BF, -0xE6C0, 0xE6C1, 0xE6C2, 0xE6C3, -0xE6C4, 0xE6C5, 0xE6C6, 0xE6C7, -0xE6C8, 0xE6C9, 0xE6CA, 0xE6CB, -0xE6CC, 0xE6CD, 0xE6CE, 0xE6CF, -0xE6D0, 0xE6D1, 0xE6D2, 0xE6D3, -0xE6D4, 0xE6D5, 0xE6D6, 0xE6D7, -0xE6D8, 0xE6D9, 0xE6DA, 0xE6DB, -0xE6DC, 0xE6DD, 0xE6DE, 0xE6DF, -0xE6E0, 0xE6E1, 0xE6E2, 0xE6E3, -0xE6E4, 0xE6E5, 0xE6E6, 0xE6E7, -0xE6E8, 0xE6E9, 0xE6EA, 0xE6EB, -0xE6EC, 0xE6ED, 0xE6EE, 0xE6EF, -0xE6F0, 0xE6F1, 0xE6F2, 0xE6F3, -0xE6F4, 0xE6F5, 0xE6F6, 0xE6F7, -0xE6F8, 0xE6F9, 0xE6FA, 0xE6FB, -0xE6FC, 0xE6FD, 0xE6FE, 0xE6FF, -0xE700, 0xE701, 0xE702, 0xE703, -0xE704, 0xE705, 0x0391, 0x0392, -0x0393, 0x0394, 0x0395, 0x0396, -0x0397, 0x0398, 0x0399, 0x039A, -0x039B, 0x039C, 0x039D, 0x039E, -0x039F, 0x03A0, 0x03A1, 0x03A3, -0x03A4, 0x03A5, 0x03A6, 0x03A7, -0x03A8, 0x03A9, 0xE785, 0xE786, -0xE787, 0xE788, 0xE789, 0xE78A, -0xE78B, 0xE78C, 0x03B1, 0x03B2, -0x03B3, 0x03B4, 0x03B5, 0x03B6, -0x03B7, 0x03B8, 0x03B9, 0x03BA, -0x03BB, 0x03BC, 0x03BD, 0x03BE, -0x03BF, 0x03C0, 0x03C1, 0x03C3, -0x03C4, 0x03C5, 0x03C6, 0x03C7, -0x03C8, 0x03C9, 0xE78D, 0xE78E, -0xE78F, 0xE790, 0xE791, 0xE792, -0xE793, 0xFE35, 0xFE36, 0xFE39, -0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, -0xFE3E, 0xFE41, 0xFE42, 0xFE43, -0xFE44, 0xE794, 0xE795, 0xFE3B, -0xFE3C, 0xFE37, 0xFE38, 0xFE31, -0xE796, 0xFE33, 0xFE34, 0xE797, -0xE798, 0xE799, 0xE79A, 0xE79B, -0xE79C, 0xE79D, 0xE79E, 0xE79F, -0xE706, 0xE707, 0xE708, 0xE709, -0xE70A, 0xE70B, 0xE70C, 0xE70D, -0xE70E, 0xE70F, 0xE710, 0xE711, -0xE712, 0xE713, 0xE714, 0xE715, -0xE716, 0xE717, 0xE718, 0xE719, -0xE71A, 0xE71B, 0xE71C, 0xE71D, -0xE71E, 0xE71F, 0xE720, 0xE721, -0xE722, 0xE723, 0xE724, 0xE725, -0xE726, 0xE727, 0xE728, 0xE729, -0xE72A, 0xE72B, 0xE72C, 0xE72D, -0xE72E, 0xE72F, 0xE730, 0xE731, -0xE732, 0xE733, 0xE734, 0xE735, -0xE736, 0xE737, 0xE738, 0xE739, -0xE73A, 0xE73B, 0xE73C, 0xE73D, -0xE73E, 0xE73F, 0xE740, 0xE741, -0xE742, 0xE743, 0xE744, 0xE745, -0xE746, 0xE747, 0xE748, 0xE749, -0xE74A, 0xE74B, 0xE74C, 0xE74D, -0xE74E, 0xE74F, 0xE750, 0xE751, -0xE752, 0xE753, 0xE754, 0xE755, -0xE756, 0xE757, 0xE758, 0xE759, -0xE75A, 0xE75B, 0xE75C, 0xE75D, -0xE75E, 0xE75F, 0xE760, 0xE761, -0xE762, 0xE763, 0xE764, 0xE765, -0x0410, 0x0411, 0x0412, 0x0413, -0x0414, 0x0415, 0x0401, 0x0416, -0x0417, 0x0418, 0x0419, 0x041A, -0x041B, 0x041C, 0x041D, 0x041E, -0x041F, 0x0420, 0x0421, 0x0422, -0x0423, 0x0424, 0x0425, 0x0426, -0x0427, 0x0428, 0x0429, 0x042A, -0x042B, 0x042C, 0x042D, 0x042E, -0x042F, 0xE7A0, 0xE7A1, 0xE7A2, -0xE7A3, 0xE7A4, 0xE7A5, 0xE7A6, -0xE7A7, 0xE7A8, 0xE7A9, 0xE7AA, -0xE7AB, 0xE7AC, 0xE7AD, 0xE7AE, -0x0430, 0x0431, 0x0432, 0x0433, -0x0434, 0x0435, 0x0451, 0x0436, -0x0437, 0x0438, 0x0439, 0x043A, -0x043B, 0x043C, 0x043D, 0x043E, -0x043F, 0x0440, 0x0441, 0x0442, -0x0443, 0x0444, 0x0445, 0x0446, -0x0447, 0x0448, 0x0449, 0x044A, -0x044B, 0x044C, 0x044D, 0x044E, -0x044F, 0xE7AF, 0xE7B0, 0xE7B1, -0xE7B2, 0xE7B3, 0xE7B4, 0xE7B5, -0xE7B6, 0xE7B7, 0xE7B8, 0xE7B9, -0xE7BA, 0xE7BB, 0x02CA, 0x02CB, -0x02D9, 0x2013, 0x2015, 0x2025, -0x2035, 0x2105, 0x2109, 0x2196, -0x2197, 0x2198, 0x2199, 0x2215, -0x221F, 0x2223, 0x2252, 0x2266, -0x2267, 0x22BF, 0x2550, 0x2551, -0x2552, 0x2553, 0x2554, 0x2555, -0x2556, 0x2557, 0x2558, 0x2559, -0x255A, 0x255B, 0x255C, 0x255D, -0x255E, 0x255F, 0x2560, 0x2561, -0x2562, 0x2563, 0x2564, 0x2565, -0x2566, 0x2567, 0x2568, 0x2569, -0x256A, 0x256B, 0x256C, 0x256D, -0x256E, 0x256F, 0x2570, 0x2571, -0x2572, 0x2573, 0x2581, 0x2582, -0x2583, 0x2584, 0x2585, 0x2586, -0x2587, 0x2588, 0x2589, 0x258A, -0x258B, 0x258C, 0x258D, 0x258E, -0x258F, 0x2593, 0x2594, 0x2595, -0x25BC, 0x25BD, 0x25E2, 0x25E3, -0x25E4, 0x25E5, 0x2609, 0x2295, -0x3012, 0x301D, 0x301E, 0xE7BC, -0xE7BD, 0xE7BE, 0xE7BF, 0xE7C0, -0xE7C1, 0xE7C2, 0xE7C3, 0xE7C4, -0xE7C5, 0xE7C6, 0x0101, 0x00E1, -0x01CE, 0x00E0, 0x0113, 0x00E9, -0x011B, 0x00E8, 0x012B, 0x00ED, -0x01D0, 0x00EC, 0x014D, 0x00F3, -0x01D2, 0x00F2, 0x016B, 0x00FA, -0x01D4, 0x00F9, 0x01D6, 0x01D8, -0x01DA, 0x01DC, 0x00FC, 0x00EA, -0x0251, 0x1E3F, 0x0144, 0x0148, -0x01F9, 0x0261, 0xE7C9, 0xE7CA, -0xE7CB, 0xE7CC, 0x3105, 0x3106, -0x3107, 0x3108, 0x3109, 0x310A, -0x310B, 0x310C, 0x310D, 0x310E, -0x310F, 0x3110, 0x3111, 0x3112, -0x3113, 0x3114, 0x3115, 0x3116, -0x3117, 0x3118, 0x3119, 0x311A, -0x311B, 0x311C, 0x311D, 0x311E, -0x311F, 0x3120, 0x3121, 0x3122, -0x3123, 0x3124, 0x3125, 0x3126, -0x3127, 0x3128, 0x3129, 0xE7CD, -0xE7CE, 0xE7CF, 0xE7D0, 0xE7D1, -0xE7D2, 0xE7D3, 0xE7D4, 0xE7D5, -0xE7D6, 0xE7D7, 0xE7D8, 0xE7D9, -0xE7DA, 0xE7DB, 0xE7DC, 0xE7DD, -0xE7DE, 0xE7DF, 0xE7E0, 0xE7E1, -0x3021, 0x3022, 0x3023, 0x3024, -0x3025, 0x3026, 0x3027, 0x3028, -0x3029, 0x32A3, 0x338E, 0x338F, -0x339C, 0x339D, 0x339E, 0x33A1, -0x33C4, 0x33CE, 0x33D1, 0x33D2, -0x33D5, 0xFE30, 0xFFE2, 0xFFE4, -0xE7E2, 0x2121, 0x3231, 0xE7E3, -0x2010, 0xE7E4, 0xE7E5, 0xE7E6, -0x30FC, 0x309B, 0x309C, 0x30FD, -0x30FE, 0x3006, 0x309D, 0x309E, -0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, -0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, -0xFE51, 0xFE52, 0xFE54, 0xFE55, -0xFE56, 0xFE57, 0xFE59, 0xFE5A, -0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, -0xFE5F, 0xFE60, 0xFE61, 0xFE62, -0xFE63, 0xFE64, 0xFE65, 0xFE66, -0xFE68, 0xFE69, 0xFE6A, 0xFE6B, -0x303E, 0x2FF0, 0x2FF1, 0x2FF2, -0x2FF3, 0x2FF4, 0x2FF5, 0x2FF6, -0x2FF7, 0x2FF8, 0x2FF9, 0x2FFA, -0x2FFB, 0x3007, 0xE7F4, 0xE7F5, -0xE7F6, 0xE7F7, 0xE7F8, 0xE7F9, -0xE7FA, 0xE7FB, 0xE7FC, 0xE7FD, -0xE7FE, 0xE7FF, 0xE800, 0x2500, -0x2501, 0x2502, 0x2503, 0x2504, -0x2505, 0x2506, 0x2507, 0x2508, -0x2509, 0x250A, 0x250B, 0x250C, -0x250D, 0x250E, 0x250F, 0x2510, -0x2511, 0x2512, 0x2513, 0x2514, -0x2515, 0x2516, 0x2517, 0x2518, -0x2519, 0x251A, 0x251B, 0x251C, -0x251D, 0x251E, 0x251F, 0x2520, -0x2521, 0x2522, 0x2523, 0x2524, -0x2525, 0x2526, 0x2527, 0x2528, -0x2529, 0x252A, 0x252B, 0x252C, -0x252D, 0x252E, 0x252F, 0x2530, -0x2531, 0x2532, 0x2533, 0x2534, -0x2535, 0x2536, 0x2537, 0x2538, -0x2539, 0x253A, 0x253B, 0x253C, -0x253D, 0x253E, 0x253F, 0x2540, -0x2541, 0x2542, 0x2543, 0x2544, -0x2545, 0x2546, 0x2547, 0x2548, -0x2549, 0x254A, 0x254B, 0xE801, -0xE802, 0xE803, 0xE804, 0xE805, -0xE806, 0xE807, 0xE808, 0xE809, -0xE80A, 0xE80B, 0xE80C, 0xE80D, -0xE80E, 0xE80F, 0x72DC, 0x72DD, -0x72DF, 0x72E2, 0x72E3, 0x72E4, -0x72E5, 0x72E6, 0x72E7, 0x72EA, -0x72EB, 0x72F5, 0x72F6, 0x72F9, -0x72FD, 0x72FE, 0x72FF, 0x7300, -0x7302, 0x7304, 0x7305, 0x7306, -0x7307, 0x7308, 0x7309, 0x730B, -0x730C, 0x730D, 0x730F, 0x7310, -0x7311, 0x7312, 0x7314, 0x7318, -0x7319, 0x731A, 0x731F, 0x7320, -0x7323, 0x7324, 0x7326, 0x7327, -0x7328, 0x732D, 0x732F, 0x7330, -0x7332, 0x7333, 0x7335, 0x7336, -0x733A, 0x733B, 0x733C, 0x733D, -0x7340, 0x7341, 0x7342, 0x7343, -0x7344, 0x7345, 0x7346, 0x7347, -0x7348, 0x7349, 0x734A, 0x734B, -0x734C, 0x734E, 0x734F, 0x7351, -0x7353, 0x7354, 0x7355, 0x7356, -0x7358, 0x7359, 0x735A, 0x735B, -0x735C, 0x735D, 0x735E, 0x735F, -0x7361, 0x7362, 0x7363, 0x7364, -0x7365, 0x7366, 0x7367, 0x7368, -0x7369, 0x736A, 0x736B, 0x736E, -0x7370, 0x7371, 0xE000, 0xE001, -0xE002, 0xE003, 0xE004, 0xE005, -0xE006, 0xE007, 0xE008, 0xE009, -0xE00A, 0xE00B, 0xE00C, 0xE00D, -0xE00E, 0xE00F, 0xE010, 0xE011, -0xE012, 0xE013, 0xE014, 0xE015, -0xE016, 0xE017, 0xE018, 0xE019, -0xE01A, 0xE01B, 0xE01C, 0xE01D, -0xE01E, 0xE01F, 0xE020, 0xE021, -0xE022, 0xE023, 0xE024, 0xE025, -0xE026, 0xE027, 0xE028, 0xE029, -0xE02A, 0xE02B, 0xE02C, 0xE02D, -0xE02E, 0xE02F, 0xE030, 0xE031, -0xE032, 0xE033, 0xE034, 0xE035, -0xE036, 0xE037, 0xE038, 0xE039, -0xE03A, 0xE03B, 0xE03C, 0xE03D, -0xE03E, 0xE03F, 0xE040, 0xE041, -0xE042, 0xE043, 0xE044, 0xE045, -0xE046, 0xE047, 0xE048, 0xE049, -0xE04A, 0xE04B, 0xE04C, 0xE04D, -0xE04E, 0xE04F, 0xE050, 0xE051, -0xE052, 0xE053, 0xE054, 0xE055, -0xE056, 0xE057, 0xE058, 0xE059, -0xE05A, 0xE05B, 0xE05C, 0xE05D, -0x7372, 0x7373, 0x7374, 0x7375, -0x7376, 0x7377, 0x7378, 0x7379, -0x737A, 0x737B, 0x737C, 0x737D, -0x737F, 0x7380, 0x7381, 0x7382, -0x7383, 0x7385, 0x7386, 0x7388, -0x738A, 0x738C, 0x738D, 0x738F, -0x7390, 0x7392, 0x7393, 0x7394, -0x7395, 0x7397, 0x7398, 0x7399, -0x739A, 0x739C, 0x739D, 0x739E, -0x73A0, 0x73A1, 0x73A3, 0x73A4, -0x73A5, 0x73A6, 0x73A7, 0x73A8, -0x73AA, 0x73AC, 0x73AD, 0x73B1, -0x73B4, 0x73B5, 0x73B6, 0x73B8, -0x73B9, 0x73BC, 0x73BD, 0x73BE, -0x73BF, 0x73C1, 0x73C3, 0x73C4, -0x73C5, 0x73C6, 0x73C7, 0x73CB, -0x73CC, 0x73CE, 0x73D2, 0x73D3, -0x73D4, 0x73D5, 0x73D6, 0x73D7, -0x73D8, 0x73DA, 0x73DB, 0x73DC, -0x73DD, 0x73DF, 0x73E1, 0x73E2, -0x73E3, 0x73E4, 0x73E6, 0x73E8, -0x73EA, 0x73EB, 0x73EC, 0x73EE, -0x73EF, 0x73F0, 0x73F1, 0x73F3, -0x73F4, 0x73F5, 0x73F6, 0x73F7, -0xE05E, 0xE05F, 0xE060, 0xE061, -0xE062, 0xE063, 0xE064, 0xE065, -0xE066, 0xE067, 0xE068, 0xE069, -0xE06A, 0xE06B, 0xE06C, 0xE06D, -0xE06E, 0xE06F, 0xE070, 0xE071, -0xE072, 0xE073, 0xE074, 0xE075, -0xE076, 0xE077, 0xE078, 0xE079, -0xE07A, 0xE07B, 0xE07C, 0xE07D, -0xE07E, 0xE07F, 0xE080, 0xE081, -0xE082, 0xE083, 0xE084, 0xE085, -0xE086, 0xE087, 0xE088, 0xE089, -0xE08A, 0xE08B, 0xE08C, 0xE08D, -0xE08E, 0xE08F, 0xE090, 0xE091, -0xE092, 0xE093, 0xE094, 0xE095, -0xE096, 0xE097, 0xE098, 0xE099, -0xE09A, 0xE09B, 0xE09C, 0xE09D, -0xE09E, 0xE09F, 0xE0A0, 0xE0A1, -0xE0A2, 0xE0A3, 0xE0A4, 0xE0A5, -0xE0A6, 0xE0A7, 0xE0A8, 0xE0A9, -0xE0AA, 0xE0AB, 0xE0AC, 0xE0AD, -0xE0AE, 0xE0AF, 0xE0B0, 0xE0B1, -0xE0B2, 0xE0B3, 0xE0B4, 0xE0B5, -0xE0B6, 0xE0B7, 0xE0B8, 0xE0B9, -0xE0BA, 0xE0BB, 0x73F8, 0x73F9, -0x73FA, 0x73FB, 0x73FC, 0x73FD, -0x73FE, 0x73FF, 0x7400, 0x7401, -0x7402, 0x7404, 0x7407, 0x7408, -0x740B, 0x740C, 0x740D, 0x740E, -0x7411, 0x7412, 0x7413, 0x7414, -0x7415, 0x7416, 0x7417, 0x7418, -0x7419, 0x741C, 0x741D, 0x741E, -0x741F, 0x7420, 0x7421, 0x7423, -0x7424, 0x7427, 0x7429, 0x742B, -0x742D, 0x742F, 0x7431, 0x7432, -0x7437, 0x7438, 0x7439, 0x743A, -0x743B, 0x743D, 0x743E, 0x743F, -0x7440, 0x7442, 0x7443, 0x7444, -0x7445, 0x7446, 0x7447, 0x7448, -0x7449, 0x744A, 0x744B, 0x744C, -0x744D, 0x744E, 0x744F, 0x7450, -0x7451, 0x7452, 0x7453, 0x7454, -0x7456, 0x7458, 0x745D, 0x7460, -0x7461, 0x7462, 0x7463, 0x7464, -0x7465, 0x7466, 0x7467, 0x7468, -0x7469, 0x746A, 0x746B, 0x746C, -0x746E, 0x746F, 0x7471, 0x7472, -0x7473, 0x7474, 0x7475, 0x7478, -0x7479, 0x747A, 0xE0BC, 0xE0BD, -0xE0BE, 0xE0BF, 0xE0C0, 0xE0C1, -0xE0C2, 0xE0C3, 0xE0C4, 0xE0C5, -0xE0C6, 0xE0C7, 0xE0C8, 0xE0C9, -0xE0CA, 0xE0CB, 0xE0CC, 0xE0CD, -0xE0CE, 0xE0CF, 0xE0D0, 0xE0D1, -0xE0D2, 0xE0D3, 0xE0D4, 0xE0D5, -0xE0D6, 0xE0D7, 0xE0D8, 0xE0D9, -0xE0DA, 0xE0DB, 0xE0DC, 0xE0DD, -0xE0DE, 0xE0DF, 0xE0E0, 0xE0E1, -0xE0E2, 0xE0E3, 0xE0E4, 0xE0E5, -0xE0E6, 0xE0E7, 0xE0E8, 0xE0E9, -0xE0EA, 0xE0EB, 0xE0EC, 0xE0ED, -0xE0EE, 0xE0EF, 0xE0F0, 0xE0F1, -0xE0F2, 0xE0F3, 0xE0F4, 0xE0F5, -0xE0F6, 0xE0F7, 0xE0F8, 0xE0F9, -0xE0FA, 0xE0FB, 0xE0FC, 0xE0FD, -0xE0FE, 0xE0FF, 0xE100, 0xE101, -0xE102, 0xE103, 0xE104, 0xE105, -0xE106, 0xE107, 0xE108, 0xE109, -0xE10A, 0xE10B, 0xE10C, 0xE10D, -0xE10E, 0xE10F, 0xE110, 0xE111, -0xE112, 0xE113, 0xE114, 0xE115, -0xE116, 0xE117, 0xE118, 0xE119, -0x747B, 0x747C, 0x747D, 0x747F, -0x7482, 0x7484, 0x7485, 0x7486, -0x7488, 0x7489, 0x748A, 0x748C, -0x748D, 0x748F, 0x7491, 0x7492, -0x7493, 0x7494, 0x7495, 0x7496, -0x7497, 0x7498, 0x7499, 0x749A, -0x749B, 0x749D, 0x749F, 0x74A0, -0x74A1, 0x74A2, 0x74A3, 0x74A4, -0x74A5, 0x74A6, 0x74AA, 0x74AB, -0x74AC, 0x74AD, 0x74AE, 0x74AF, -0x74B0, 0x74B1, 0x74B2, 0x74B3, -0x74B4, 0x74B5, 0x74B6, 0x74B7, -0x74B8, 0x74B9, 0x74BB, 0x74BC, -0x74BD, 0x74BE, 0x74BF, 0x74C0, -0x74C1, 0x74C2, 0x74C3, 0x74C4, -0x74C5, 0x74C6, 0x74C7, 0x74C8, -0x74C9, 0x74CA, 0x74CB, 0x74CC, -0x74CD, 0x74CE, 0x74CF, 0x74D0, -0x74D1, 0x74D3, 0x74D4, 0x74D5, -0x74D6, 0x74D7, 0x74D8, 0x74D9, -0x74DA, 0x74DB, 0x74DD, 0x74DF, -0x74E1, 0x74E5, 0x74E7, 0x74E8, -0x74E9, 0x74EA, 0x74EB, 0x74EC, -0x74ED, 0x74F0, 0x74F1, 0x74F2, -0xE11A, 0xE11B, 0xE11C, 0xE11D, -0xE11E, 0xE11F, 0xE120, 0xE121, -0xE122, 0xE123, 0xE124, 0xE125, -0xE126, 0xE127, 0xE128, 0xE129, -0xE12A, 0xE12B, 0xE12C, 0xE12D, -0xE12E, 0xE12F, 0xE130, 0xE131, -0xE132, 0xE133, 0xE134, 0xE135, -0xE136, 0xE137, 0xE138, 0xE139, -0xE13A, 0xE13B, 0xE13C, 0xE13D, -0xE13E, 0xE13F, 0xE140, 0xE141, -0xE142, 0xE143, 0xE144, 0xE145, -0xE146, 0xE147, 0xE148, 0xE149, -0xE14A, 0xE14B, 0xE14C, 0xE14D, -0xE14E, 0xE14F, 0xE150, 0xE151, -0xE152, 0xE153, 0xE154, 0xE155, -0xE156, 0xE157, 0xE158, 0xE159, -0xE15A, 0xE15B, 0xE15C, 0xE15D, -0xE15E, 0xE15F, 0xE160, 0xE161, -0xE162, 0xE163, 0xE164, 0xE165, -0xE166, 0xE167, 0xE168, 0xE169, -0xE16A, 0xE16B, 0xE16C, 0xE16D, -0xE16E, 0xE16F, 0xE170, 0xE171, -0xE172, 0xE173, 0xE174, 0xE175, -0xE176, 0xE177, 0x74F3, 0x74F5, -0x74F8, 0x74F9, 0x74FA, 0x74FB, -0x74FC, 0x74FD, 0x74FE, 0x7500, -0x7501, 0x7502, 0x7503, 0x7505, -0x7506, 0x7507, 0x7508, 0x7509, -0x750A, 0x750B, 0x750C, 0x750E, -0x7510, 0x7512, 0x7514, 0x7515, -0x7516, 0x7517, 0x751B, 0x751D, -0x751E, 0x7520, 0x7521, 0x7522, -0x7523, 0x7524, 0x7526, 0x7527, -0x752A, 0x752E, 0x7534, 0x7536, -0x7539, 0x753C, 0x753D, 0x753F, -0x7541, 0x7542, 0x7543, 0x7544, -0x7546, 0x7547, 0x7549, 0x754A, -0x754D, 0x7550, 0x7551, 0x7552, -0x7553, 0x7555, 0x7556, 0x7557, -0x7558, 0x755D, 0x755E, 0x755F, -0x7560, 0x7561, 0x7562, 0x7563, -0x7564, 0x7567, 0x7568, 0x7569, -0x756B, 0x756C, 0x756D, 0x756E, -0x756F, 0x7570, 0x7571, 0x7573, -0x7575, 0x7576, 0x7577, 0x757A, -0x757B, 0x757C, 0x757D, 0x757E, -0x7580, 0x7581, 0x7582, 0x7584, -0x7585, 0x7587, 0xE178, 0xE179, -0xE17A, 0xE17B, 0xE17C, 0xE17D, -0xE17E, 0xE17F, 0xE180, 0xE181, -0xE182, 0xE183, 0xE184, 0xE185, -0xE186, 0xE187, 0xE188, 0xE189, -0xE18A, 0xE18B, 0xE18C, 0xE18D, -0xE18E, 0xE18F, 0xE190, 0xE191, -0xE192, 0xE193, 0xE194, 0xE195, -0xE196, 0xE197, 0xE198, 0xE199, -0xE19A, 0xE19B, 0xE19C, 0xE19D, -0xE19E, 0xE19F, 0xE1A0, 0xE1A1, -0xE1A2, 0xE1A3, 0xE1A4, 0xE1A5, -0xE1A6, 0xE1A7, 0xE1A8, 0xE1A9, -0xE1AA, 0xE1AB, 0xE1AC, 0xE1AD, -0xE1AE, 0xE1AF, 0xE1B0, 0xE1B1, -0xE1B2, 0xE1B3, 0xE1B4, 0xE1B5, -0xE1B6, 0xE1B7, 0xE1B8, 0xE1B9, -0xE1BA, 0xE1BB, 0xE1BC, 0xE1BD, -0xE1BE, 0xE1BF, 0xE1C0, 0xE1C1, -0xE1C2, 0xE1C3, 0xE1C4, 0xE1C5, -0xE1C6, 0xE1C7, 0xE1C8, 0xE1C9, -0xE1CA, 0xE1CB, 0xE1CC, 0xE1CD, -0xE1CE, 0xE1CF, 0xE1D0, 0xE1D1, -0xE1D2, 0xE1D3, 0xE1D4, 0xE1D5, -0x7588, 0x7589, 0x758A, 0x758C, -0x758D, 0x758E, 0x7590, 0x7593, -0x7595, 0x7598, 0x759B, 0x759C, -0x759E, 0x75A2, 0x75A6, 0x75A7, -0x75A8, 0x75A9, 0x75AA, 0x75AD, -0x75B6, 0x75B7, 0x75BA, 0x75BB, -0x75BF, 0x75C0, 0x75C1, 0x75C6, -0x75CB, 0x75CC, 0x75CE, 0x75CF, -0x75D0, 0x75D1, 0x75D3, 0x75D7, -0x75D9, 0x75DA, 0x75DC, 0x75DD, -0x75DF, 0x75E0, 0x75E1, 0x75E5, -0x75E9, 0x75EC, 0x75ED, 0x75EE, -0x75EF, 0x75F2, 0x75F3, 0x75F5, -0x75F6, 0x75F7, 0x75F8, 0x75FA, -0x75FB, 0x75FD, 0x75FE, 0x7602, -0x7604, 0x7606, 0x7607, 0x7608, -0x7609, 0x760B, 0x760D, 0x760E, -0x760F, 0x7611, 0x7612, 0x7613, -0x7614, 0x7616, 0x761A, 0x761C, -0x761D, 0x761E, 0x7621, 0x7623, -0x7627, 0x7628, 0x762C, 0x762E, -0x762F, 0x7631, 0x7632, 0x7636, -0x7637, 0x7639, 0x763A, 0x763B, -0x763D, 0x7641, 0x7642, 0x7644, -0xE1D6, 0xE1D7, 0xE1D8, 0xE1D9, -0xE1DA, 0xE1DB, 0xE1DC, 0xE1DD, -0xE1DE, 0xE1DF, 0xE1E0, 0xE1E1, -0xE1E2, 0xE1E3, 0xE1E4, 0xE1E5, -0xE1E6, 0xE1E7, 0xE1E8, 0xE1E9, -0xE1EA, 0xE1EB, 0xE1EC, 0xE1ED, -0xE1EE, 0xE1EF, 0xE1F0, 0xE1F1, -0xE1F2, 0xE1F3, 0xE1F4, 0xE1F5, -0xE1F6, 0xE1F7, 0xE1F8, 0xE1F9, -0xE1FA, 0xE1FB, 0xE1FC, 0xE1FD, -0xE1FE, 0xE1FF, 0xE200, 0xE201, -0xE202, 0xE203, 0xE204, 0xE205, -0xE206, 0xE207, 0xE208, 0xE209, -0xE20A, 0xE20B, 0xE20C, 0xE20D, -0xE20E, 0xE20F, 0xE210, 0xE211, -0xE212, 0xE213, 0xE214, 0xE215, -0xE216, 0xE217, 0xE218, 0xE219, -0xE21A, 0xE21B, 0xE21C, 0xE21D, -0xE21E, 0xE21F, 0xE220, 0xE221, -0xE222, 0xE223, 0xE224, 0xE225, -0xE226, 0xE227, 0xE228, 0xE229, -0xE22A, 0xE22B, 0xE22C, 0xE22D, -0xE22E, 0xE22F, 0xE230, 0xE231, -0xE232, 0xE233, 0x7645, 0x7646, -0x7647, 0x7648, 0x7649, 0x764A, -0x764B, 0x764E, 0x764F, 0x7650, -0x7651, 0x7652, 0x7653, 0x7655, -0x7657, 0x7658, 0x7659, 0x765A, -0x765B, 0x765D, 0x765F, 0x7660, -0x7661, 0x7662, 0x7664, 0x7665, -0x7666, 0x7667, 0x7668, 0x7669, -0x766A, 0x766C, 0x766D, 0x766E, -0x7670, 0x7671, 0x7672, 0x7673, -0x7674, 0x7675, 0x7676, 0x7677, -0x7679, 0x767A, 0x767C, 0x767F, -0x7680, 0x7681, 0x7683, 0x7685, -0x7689, 0x768A, 0x768C, 0x768D, -0x768F, 0x7690, 0x7692, 0x7694, -0x7695, 0x7697, 0x7698, 0x769A, -0x769B, 0x769C, 0x769D, 0x769E, -0x769F, 0x76A0, 0x76A1, 0x76A2, -0x76A3, 0x76A5, 0x76A6, 0x76A7, -0x76A8, 0x76A9, 0x76AA, 0x76AB, -0x76AC, 0x76AD, 0x76AF, 0x76B0, -0x76B3, 0x76B5, 0x76B6, 0x76B7, -0x76B8, 0x76B9, 0x76BA, 0x76BB, -0x76BC, 0x76BD, 0x76BE, 0x76C0, -0x76C1, 0x76C3, 0x554A, 0x963F, -0x57C3, 0x6328, 0x54CE, 0x5509, -0x54C0, 0x7691, 0x764C, 0x853C, -0x77EE, 0x827E, 0x788D, 0x7231, -0x9698, 0x978D, 0x6C28, 0x5B89, -0x4FFA, 0x6309, 0x6697, 0x5CB8, -0x80FA, 0x6848, 0x80AE, 0x6602, -0x76CE, 0x51F9, 0x6556, 0x71AC, -0x7FF1, 0x8884, 0x50B2, 0x5965, -0x61CA, 0x6FB3, 0x82AD, 0x634C, -0x6252, 0x53ED, 0x5427, 0x7B06, -0x516B, 0x75A4, 0x5DF4, 0x62D4, -0x8DCB, 0x9776, 0x628A, 0x8019, -0x575D, 0x9738, 0x7F62, 0x7238, -0x767D, 0x67CF, 0x767E, 0x6446, -0x4F70, 0x8D25, 0x62DC, 0x7A17, -0x6591, 0x73ED, 0x642C, 0x6273, -0x822C, 0x9881, 0x677F, 0x7248, -0x626E, 0x62CC, 0x4F34, 0x74E3, -0x534A, 0x529E, 0x7ECA, 0x90A6, -0x5E2E, 0x6886, 0x699C, 0x8180, -0x7ED1, 0x68D2, 0x78C5, 0x868C, -0x9551, 0x508D, 0x8C24, 0x82DE, -0x80DE, 0x5305, 0x8912, 0x5265, -0x76C4, 0x76C7, 0x76C9, 0x76CB, -0x76CC, 0x76D3, 0x76D5, 0x76D9, -0x76DA, 0x76DC, 0x76DD, 0x76DE, -0x76E0, 0x76E1, 0x76E2, 0x76E3, -0x76E4, 0x76E6, 0x76E7, 0x76E8, -0x76E9, 0x76EA, 0x76EB, 0x76EC, -0x76ED, 0x76F0, 0x76F3, 0x76F5, -0x76F6, 0x76F7, 0x76FA, 0x76FB, -0x76FD, 0x76FF, 0x7700, 0x7702, -0x7703, 0x7705, 0x7706, 0x770A, -0x770C, 0x770E, 0x770F, 0x7710, -0x7711, 0x7712, 0x7713, 0x7714, -0x7715, 0x7716, 0x7717, 0x7718, -0x771B, 0x771C, 0x771D, 0x771E, -0x7721, 0x7723, 0x7724, 0x7725, -0x7727, 0x772A, 0x772B, 0x772C, -0x772E, 0x7730, 0x7731, 0x7732, -0x7733, 0x7734, 0x7739, 0x773B, -0x773D, 0x773E, 0x773F, 0x7742, -0x7744, 0x7745, 0x7746, 0x7748, -0x7749, 0x774A, 0x774B, 0x774C, -0x774D, 0x774E, 0x774F, 0x7752, -0x7753, 0x7754, 0x7755, 0x7756, -0x7757, 0x7758, 0x7759, 0x775C, -0x8584, 0x96F9, 0x4FDD, 0x5821, -0x9971, 0x5B9D, 0x62B1, 0x62A5, -0x66B4, 0x8C79, 0x9C8D, 0x7206, -0x676F, 0x7891, 0x60B2, 0x5351, -0x5317, 0x8F88, 0x80CC, 0x8D1D, -0x94A1, 0x500D, 0x72C8, 0x5907, -0x60EB, 0x7119, 0x88AB, 0x5954, -0x82EF, 0x672C, 0x7B28, 0x5D29, -0x7EF7, 0x752D, 0x6CF5, 0x8E66, -0x8FF8, 0x903C, 0x9F3B, 0x6BD4, -0x9119, 0x7B14, 0x5F7C, 0x78A7, -0x84D6, 0x853D, 0x6BD5, 0x6BD9, -0x6BD6, 0x5E01, 0x5E87, 0x75F9, -0x95ED, 0x655D, 0x5F0A, 0x5FC5, -0x8F9F, 0x58C1, 0x81C2, 0x907F, -0x965B, 0x97AD, 0x8FB9, 0x7F16, -0x8D2C, 0x6241, 0x4FBF, 0x53D8, -0x535E, 0x8FA8, 0x8FA9, 0x8FAB, -0x904D, 0x6807, 0x5F6A, 0x8198, -0x8868, 0x9CD6, 0x618B, 0x522B, -0x762A, 0x5F6C, 0x658C, 0x6FD2, -0x6EE8, 0x5BBE, 0x6448, 0x5175, -0x51B0, 0x67C4, 0x4E19, 0x79C9, -0x997C, 0x70B3, 0x775D, 0x775E, -0x775F, 0x7760, 0x7764, 0x7767, -0x7769, 0x776A, 0x776D, 0x776E, -0x776F, 0x7770, 0x7771, 0x7772, -0x7773, 0x7774, 0x7775, 0x7776, -0x7777, 0x7778, 0x777A, 0x777B, -0x777C, 0x7781, 0x7782, 0x7783, -0x7786, 0x7787, 0x7788, 0x7789, -0x778A, 0x778B, 0x778F, 0x7790, -0x7793, 0x7794, 0x7795, 0x7796, -0x7797, 0x7798, 0x7799, 0x779A, -0x779B, 0x779C, 0x779D, 0x779E, -0x77A1, 0x77A3, 0x77A4, 0x77A6, -0x77A8, 0x77AB, 0x77AD, 0x77AE, -0x77AF, 0x77B1, 0x77B2, 0x77B4, -0x77B6, 0x77B7, 0x77B8, 0x77B9, -0x77BA, 0x77BC, 0x77BE, 0x77C0, -0x77C1, 0x77C2, 0x77C3, 0x77C4, -0x77C5, 0x77C6, 0x77C7, 0x77C8, -0x77C9, 0x77CA, 0x77CB, 0x77CC, -0x77CE, 0x77CF, 0x77D0, 0x77D1, -0x77D2, 0x77D3, 0x77D4, 0x77D5, -0x77D6, 0x77D8, 0x77D9, 0x77DA, -0x77DD, 0x77DE, 0x77DF, 0x77E0, -0x77E1, 0x77E4, 0x75C5, 0x5E76, -0x73BB, 0x83E0, 0x64AD, 0x62E8, -0x94B5, 0x6CE2, 0x535A, 0x52C3, -0x640F, 0x94C2, 0x7B94, 0x4F2F, -0x5E1B, 0x8236, 0x8116, 0x818A, -0x6E24, 0x6CCA, 0x9A73, 0x6355, -0x535C, 0x54FA, 0x8865, 0x57E0, -0x4E0D, 0x5E03, 0x6B65, 0x7C3F, -0x90E8, 0x6016, 0x64E6, 0x731C, -0x88C1, 0x6750, 0x624D, 0x8D22, -0x776C, 0x8E29, 0x91C7, 0x5F69, -0x83DC, 0x8521, 0x9910, 0x53C2, -0x8695, 0x6B8B, 0x60ED, 0x60E8, -0x707F, 0x82CD, 0x8231, 0x4ED3, -0x6CA7, 0x85CF, 0x64CD, 0x7CD9, -0x69FD, 0x66F9, 0x8349, 0x5395, -0x7B56, 0x4FA7, 0x518C, 0x6D4B, -0x5C42, 0x8E6D, 0x63D2, 0x53C9, -0x832C, 0x8336, 0x67E5, 0x78B4, -0x643D, 0x5BDF, 0x5C94, 0x5DEE, -0x8BE7, 0x62C6, 0x67F4, 0x8C7A, -0x6400, 0x63BA, 0x8749, 0x998B, -0x8C17, 0x7F20, 0x94F2, 0x4EA7, -0x9610, 0x98A4, 0x660C, 0x7316, -0x77E6, 0x77E8, 0x77EA, 0x77EF, -0x77F0, 0x77F1, 0x77F2, 0x77F4, -0x77F5, 0x77F7, 0x77F9, 0x77FA, -0x77FB, 0x77FC, 0x7803, 0x7804, -0x7805, 0x7806, 0x7807, 0x7808, -0x780A, 0x780B, 0x780E, 0x780F, -0x7810, 0x7813, 0x7815, 0x7819, -0x781B, 0x781E, 0x7820, 0x7821, -0x7822, 0x7824, 0x7828, 0x782A, -0x782B, 0x782E, 0x782F, 0x7831, -0x7832, 0x7833, 0x7835, 0x7836, -0x783D, 0x783F, 0x7841, 0x7842, -0x7843, 0x7844, 0x7846, 0x7848, -0x7849, 0x784A, 0x784B, 0x784D, -0x784F, 0x7851, 0x7853, 0x7854, -0x7858, 0x7859, 0x785A, 0x785B, -0x785C, 0x785E, 0x785F, 0x7860, -0x7861, 0x7862, 0x7863, 0x7864, -0x7865, 0x7866, 0x7867, 0x7868, -0x7869, 0x786F, 0x7870, 0x7871, -0x7872, 0x7873, 0x7874, 0x7875, -0x7876, 0x7878, 0x7879, 0x787A, -0x787B, 0x787D, 0x787E, 0x787F, -0x7880, 0x7881, 0x7882, 0x7883, -0x573A, 0x5C1D, 0x5E38, 0x957F, -0x507F, 0x80A0, 0x5382, 0x655E, -0x7545, 0x5531, 0x5021, 0x8D85, -0x6284, 0x949E, 0x671D, 0x5632, -0x6F6E, 0x5DE2, 0x5435, 0x7092, -0x8F66, 0x626F, 0x64A4, 0x63A3, -0x5F7B, 0x6F88, 0x90F4, 0x81E3, -0x8FB0, 0x5C18, 0x6668, 0x5FF1, -0x6C89, 0x9648, 0x8D81, 0x886C, -0x6491, 0x79F0, 0x57CE, 0x6A59, -0x6210, 0x5448, 0x4E58, 0x7A0B, -0x60E9, 0x6F84, 0x8BDA, 0x627F, -0x901E, 0x9A8B, 0x79E4, 0x5403, -0x75F4, 0x6301, 0x5319, 0x6C60, -0x8FDF, 0x5F1B, 0x9A70, 0x803B, -0x9F7F, 0x4F88, 0x5C3A, 0x8D64, -0x7FC5, 0x65A5, 0x70BD, 0x5145, -0x51B2, 0x866B, 0x5D07, 0x5BA0, -0x62BD, 0x916C, 0x7574, 0x8E0C, -0x7A20, 0x6101, 0x7B79, 0x4EC7, -0x7EF8, 0x7785, 0x4E11, 0x81ED, -0x521D, 0x51FA, 0x6A71, 0x53A8, -0x8E87, 0x9504, 0x96CF, 0x6EC1, -0x9664, 0x695A, 0x7884, 0x7885, -0x7886, 0x7888, 0x788A, 0x788B, -0x788F, 0x7890, 0x7892, 0x7894, -0x7895, 0x7896, 0x7899, 0x789D, -0x789E, 0x78A0, 0x78A2, 0x78A4, -0x78A6, 0x78A8, 0x78A9, 0x78AA, -0x78AB, 0x78AC, 0x78AD, 0x78AE, -0x78AF, 0x78B5, 0x78B6, 0x78B7, -0x78B8, 0x78BA, 0x78BB, 0x78BC, -0x78BD, 0x78BF, 0x78C0, 0x78C2, -0x78C3, 0x78C4, 0x78C6, 0x78C7, -0x78C8, 0x78CC, 0x78CD, 0x78CE, -0x78CF, 0x78D1, 0x78D2, 0x78D3, -0x78D6, 0x78D7, 0x78D8, 0x78DA, -0x78DB, 0x78DC, 0x78DD, 0x78DE, -0x78DF, 0x78E0, 0x78E1, 0x78E2, -0x78E3, 0x78E4, 0x78E5, 0x78E6, -0x78E7, 0x78E9, 0x78EA, 0x78EB, -0x78ED, 0x78EE, 0x78EF, 0x78F0, -0x78F1, 0x78F3, 0x78F5, 0x78F6, -0x78F8, 0x78F9, 0x78FB, 0x78FC, -0x78FD, 0x78FE, 0x78FF, 0x7900, -0x7902, 0x7903, 0x7904, 0x7906, -0x7907, 0x7908, 0x7909, 0x790A, -0x790B, 0x790C, 0x7840, 0x50A8, -0x77D7, 0x6410, 0x89E6, 0x5904, -0x63E3, 0x5DDD, 0x7A7F, 0x693D, -0x4F20, 0x8239, 0x5598, 0x4E32, -0x75AE, 0x7A97, 0x5E62, 0x5E8A, -0x95EF, 0x521B, 0x5439, 0x708A, -0x6376, 0x9524, 0x5782, 0x6625, -0x693F, 0x9187, 0x5507, 0x6DF3, -0x7EAF, 0x8822, 0x6233, 0x7EF0, -0x75B5, 0x8328, 0x78C1, 0x96CC, -0x8F9E, 0x6148, 0x74F7, 0x8BCD, -0x6B64, 0x523A, 0x8D50, 0x6B21, -0x806A, 0x8471, 0x56F1, 0x5306, -0x4ECE, 0x4E1B, 0x51D1, 0x7C97, -0x918B, 0x7C07, 0x4FC3, 0x8E7F, -0x7BE1, 0x7A9C, 0x6467, 0x5D14, -0x50AC, 0x8106, 0x7601, 0x7CB9, -0x6DEC, 0x7FE0, 0x6751, 0x5B58, -0x5BF8, 0x78CB, 0x64AE, 0x6413, -0x63AA, 0x632B, 0x9519, 0x642D, -0x8FBE, 0x7B54, 0x7629, 0x6253, -0x5927, 0x5446, 0x6B79, 0x50A3, -0x6234, 0x5E26, 0x6B86, 0x4EE3, -0x8D37, 0x888B, 0x5F85, 0x902E, -0x790D, 0x790E, 0x790F, 0x7910, -0x7911, 0x7912, 0x7914, 0x7915, -0x7916, 0x7917, 0x7918, 0x7919, -0x791A, 0x791B, 0x791C, 0x791D, -0x791F, 0x7920, 0x7921, 0x7922, -0x7923, 0x7925, 0x7926, 0x7927, -0x7928, 0x7929, 0x792A, 0x792B, -0x792C, 0x792D, 0x792E, 0x792F, -0x7930, 0x7931, 0x7932, 0x7933, -0x7935, 0x7936, 0x7937, 0x7938, -0x7939, 0x793D, 0x793F, 0x7942, -0x7943, 0x7944, 0x7945, 0x7947, -0x794A, 0x794B, 0x794C, 0x794D, -0x794E, 0x794F, 0x7950, 0x7951, -0x7952, 0x7954, 0x7955, 0x7958, -0x7959, 0x7961, 0x7963, 0x7964, -0x7966, 0x7969, 0x796A, 0x796B, -0x796C, 0x796E, 0x7970, 0x7971, -0x7972, 0x7973, 0x7974, 0x7975, -0x7976, 0x7979, 0x797B, 0x797C, -0x797D, 0x797E, 0x797F, 0x7982, -0x7983, 0x7986, 0x7987, 0x7988, -0x7989, 0x798B, 0x798C, 0x798D, -0x798E, 0x7990, 0x7991, 0x7992, -0x6020, 0x803D, 0x62C5, 0x4E39, -0x5355, 0x90F8, 0x63B8, 0x80C6, -0x65E6, 0x6C2E, 0x4F46, 0x60EE, -0x6DE1, 0x8BDE, 0x5F39, 0x86CB, -0x5F53, 0x6321, 0x515A, 0x8361, -0x6863, 0x5200, 0x6363, 0x8E48, -0x5012, 0x5C9B, 0x7977, 0x5BFC, -0x5230, 0x7A3B, 0x60BC, 0x9053, -0x76D7, 0x5FB7, 0x5F97, 0x7684, -0x8E6C, 0x706F, 0x767B, 0x7B49, -0x77AA, 0x51F3, 0x9093, 0x5824, -0x4F4E, 0x6EF4, 0x8FEA, 0x654C, -0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, -0x5AE1, 0x62B5, 0x5E95, 0x5730, -0x8482, 0x7B2C, 0x5E1D, 0x5F1F, -0x9012, 0x7F14, 0x98A0, 0x6382, -0x6EC7, 0x7898, 0x70B9, 0x5178, -0x975B, 0x57AB, 0x7535, 0x4F43, -0x7538, 0x5E97, 0x60E6, 0x5960, -0x6DC0, 0x6BBF, 0x7889, 0x53FC, -0x96D5, 0x51CB, 0x5201, 0x6389, -0x540A, 0x9493, 0x8C03, 0x8DCC, -0x7239, 0x789F, 0x8776, 0x8FED, -0x8C0D, 0x53E0, 0x7993, 0x7994, -0x7995, 0x7996, 0x7997, 0x7998, -0x7999, 0x799B, 0x799C, 0x799D, -0x799E, 0x799F, 0x79A0, 0x79A1, -0x79A2, 0x79A3, 0x79A4, 0x79A5, -0x79A6, 0x79A8, 0x79A9, 0x79AA, -0x79AB, 0x79AC, 0x79AD, 0x79AE, -0x79AF, 0x79B0, 0x79B1, 0x79B2, -0x79B4, 0x79B5, 0x79B6, 0x79B7, -0x79B8, 0x79BC, 0x79BF, 0x79C2, -0x79C4, 0x79C5, 0x79C7, 0x79C8, -0x79CA, 0x79CC, 0x79CE, 0x79CF, -0x79D0, 0x79D3, 0x79D4, 0x79D6, -0x79D7, 0x79D9, 0x79DA, 0x79DB, -0x79DC, 0x79DD, 0x79DE, 0x79E0, -0x79E1, 0x79E2, 0x79E5, 0x79E8, -0x79EA, 0x79EC, 0x79EE, 0x79F1, -0x79F2, 0x79F3, 0x79F4, 0x79F5, -0x79F6, 0x79F7, 0x79F9, 0x79FA, -0x79FC, 0x79FE, 0x79FF, 0x7A01, -0x7A04, 0x7A05, 0x7A07, 0x7A08, -0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, -0x7A10, 0x7A11, 0x7A12, 0x7A13, -0x7A15, 0x7A16, 0x7A18, 0x7A19, -0x7A1B, 0x7A1C, 0x4E01, 0x76EF, -0x53EE, 0x9489, 0x9876, 0x9F0E, -0x952D, 0x5B9A, 0x8BA2, 0x4E22, -0x4E1C, 0x51AC, 0x8463, 0x61C2, -0x52A8, 0x680B, 0x4F97, 0x606B, -0x51BB, 0x6D1E, 0x515C, 0x6296, -0x6597, 0x9661, 0x8C46, 0x9017, -0x75D8, 0x90FD, 0x7763, 0x6BD2, -0x728A, 0x72EC, 0x8BFB, 0x5835, -0x7779, 0x8D4C, 0x675C, 0x9540, -0x809A, 0x5EA6, 0x6E21, 0x5992, -0x7AEF, 0x77ED, 0x953B, 0x6BB5, -0x65AD, 0x7F0E, 0x5806, 0x5151, -0x961F, 0x5BF9, 0x58A9, 0x5428, -0x8E72, 0x6566, 0x987F, 0x56E4, -0x949D, 0x76FE, 0x9041, 0x6387, -0x54C6, 0x591A, 0x593A, 0x579B, -0x8EB2, 0x6735, 0x8DFA, 0x8235, -0x5241, 0x60F0, 0x5815, 0x86FE, -0x5CE8, 0x9E45, 0x4FC4, 0x989D, -0x8BB9, 0x5A25, 0x6076, 0x5384, -0x627C, 0x904F, 0x9102, 0x997F, -0x6069, 0x800C, 0x513F, 0x8033, -0x5C14, 0x9975, 0x6D31, 0x4E8C, -0x7A1D, 0x7A1F, 0x7A21, 0x7A22, -0x7A24, 0x7A25, 0x7A26, 0x7A27, -0x7A28, 0x7A29, 0x7A2A, 0x7A2B, -0x7A2C, 0x7A2D, 0x7A2E, 0x7A2F, -0x7A30, 0x7A31, 0x7A32, 0x7A34, -0x7A35, 0x7A36, 0x7A38, 0x7A3A, -0x7A3E, 0x7A40, 0x7A41, 0x7A42, -0x7A43, 0x7A44, 0x7A45, 0x7A47, -0x7A48, 0x7A49, 0x7A4A, 0x7A4B, -0x7A4C, 0x7A4D, 0x7A4E, 0x7A4F, -0x7A50, 0x7A52, 0x7A53, 0x7A54, -0x7A55, 0x7A56, 0x7A58, 0x7A59, -0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, -0x7A5E, 0x7A5F, 0x7A60, 0x7A61, -0x7A62, 0x7A63, 0x7A64, 0x7A65, -0x7A66, 0x7A67, 0x7A68, 0x7A69, -0x7A6A, 0x7A6B, 0x7A6C, 0x7A6D, -0x7A6E, 0x7A6F, 0x7A71, 0x7A72, -0x7A73, 0x7A75, 0x7A7B, 0x7A7C, -0x7A7D, 0x7A7E, 0x7A82, 0x7A85, -0x7A87, 0x7A89, 0x7A8A, 0x7A8B, -0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, -0x7A93, 0x7A94, 0x7A99, 0x7A9A, -0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, -0x8D30, 0x53D1, 0x7F5A, 0x7B4F, -0x4F10, 0x4E4F, 0x9600, 0x6CD5, -0x73D0, 0x85E9, 0x5E06, 0x756A, -0x7FFB, 0x6A0A, 0x77FE, 0x9492, -0x7E41, 0x51E1, 0x70E6, 0x53CD, -0x8FD4, 0x8303, 0x8D29, 0x72AF, -0x996D, 0x6CDB, 0x574A, 0x82B3, -0x65B9, 0x80AA, 0x623F, 0x9632, -0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, -0x653E, 0x83F2, 0x975E, 0x5561, -0x98DE, 0x80A5, 0x532A, 0x8BFD, -0x5420, 0x80BA, 0x5E9F, 0x6CB8, -0x8D39, 0x82AC, 0x915A, 0x5429, -0x6C1B, 0x5206, 0x7EB7, 0x575F, -0x711A, 0x6C7E, 0x7C89, 0x594B, -0x4EFD, 0x5FFF, 0x6124, 0x7CAA, -0x4E30, 0x5C01, 0x67AB, 0x8702, -0x5CF0, 0x950B, 0x98CE, 0x75AF, -0x70FD, 0x9022, 0x51AF, 0x7F1D, -0x8BBD, 0x5949, 0x51E4, 0x4F5B, -0x5426, 0x592B, 0x6577, 0x80A4, -0x5B75, 0x6276, 0x62C2, 0x8F90, -0x5E45, 0x6C1F, 0x7B26, 0x4F0F, -0x4FD8, 0x670D, 0x7AA3, 0x7AA4, -0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, -0x7AAE, 0x7AAF, 0x7AB0, 0x7AB1, -0x7AB2, 0x7AB4, 0x7AB5, 0x7AB6, -0x7AB7, 0x7AB8, 0x7AB9, 0x7ABA, -0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE, -0x7AC0, 0x7AC1, 0x7AC2, 0x7AC3, -0x7AC4, 0x7AC5, 0x7AC6, 0x7AC7, -0x7AC8, 0x7AC9, 0x7ACA, 0x7ACC, -0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, -0x7AD1, 0x7AD2, 0x7AD3, 0x7AD4, -0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, -0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, -0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, -0x7AE9, 0x7AEA, 0x7AEB, 0x7AEC, -0x7AEE, 0x7AF0, 0x7AF1, 0x7AF2, -0x7AF3, 0x7AF4, 0x7AF5, 0x7AF6, -0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, -0x7AFE, 0x7B00, 0x7B01, 0x7B02, -0x7B05, 0x7B07, 0x7B09, 0x7B0C, -0x7B0D, 0x7B0E, 0x7B10, 0x7B12, -0x7B13, 0x7B16, 0x7B17, 0x7B18, -0x7B1A, 0x7B1C, 0x7B1D, 0x7B1F, -0x7B21, 0x7B22, 0x7B23, 0x7B27, -0x7B29, 0x7B2D, 0x6D6E, 0x6DAA, -0x798F, 0x88B1, 0x5F17, 0x752B, -0x629A, 0x8F85, 0x4FEF, 0x91DC, -0x65A7, 0x812F, 0x8151, 0x5E9C, -0x8150, 0x8D74, 0x526F, 0x8986, -0x8D4B, 0x590D, 0x5085, 0x4ED8, -0x961C, 0x7236, 0x8179, 0x8D1F, -0x5BCC, 0x8BA3, 0x9644, 0x5987, -0x7F1A, 0x5490, 0x5676, 0x560E, -0x8BE5, 0x6539, 0x6982, 0x9499, -0x76D6, 0x6E89, 0x5E72, 0x7518, -0x6746, 0x67D1, 0x7AFF, 0x809D, -0x8D76, 0x611F, 0x79C6, 0x6562, -0x8D63, 0x5188, 0x521A, 0x94A2, -0x7F38, 0x809B, 0x7EB2, 0x5C97, -0x6E2F, 0x6760, 0x7BD9, 0x768B, -0x9AD8, 0x818F, 0x7F94, 0x7CD5, -0x641E, 0x9550, 0x7A3F, 0x544A, -0x54E5, 0x6B4C, 0x6401, 0x6208, -0x9E3D, 0x80F3, 0x7599, 0x5272, -0x9769, 0x845B, 0x683C, 0x86E4, -0x9601, 0x9694, 0x94EC, 0x4E2A, -0x5404, 0x7ED9, 0x6839, 0x8DDF, -0x8015, 0x66F4, 0x5E9A, 0x7FB9, -0x7B2F, 0x7B30, 0x7B32, 0x7B34, -0x7B35, 0x7B36, 0x7B37, 0x7B39, -0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, -0x7B41, 0x7B42, 0x7B43, 0x7B44, -0x7B46, 0x7B48, 0x7B4A, 0x7B4D, -0x7B4E, 0x7B53, 0x7B55, 0x7B57, -0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, -0x7B61, 0x7B63, 0x7B64, 0x7B65, -0x7B66, 0x7B67, 0x7B68, 0x7B69, -0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D, -0x7B6F, 0x7B70, 0x7B73, 0x7B74, -0x7B76, 0x7B78, 0x7B7A, 0x7B7C, -0x7B7D, 0x7B7F, 0x7B81, 0x7B82, -0x7B83, 0x7B84, 0x7B86, 0x7B87, -0x7B88, 0x7B89, 0x7B8A, 0x7B8B, -0x7B8C, 0x7B8E, 0x7B8F, 0x7B91, -0x7B92, 0x7B93, 0x7B96, 0x7B98, -0x7B99, 0x7B9A, 0x7B9B, 0x7B9E, -0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, -0x7BA5, 0x7BAE, 0x7BAF, 0x7BB0, -0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, -0x7BB7, 0x7BB9, 0x7BBA, 0x7BBB, -0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, -0x7BC0, 0x7BC2, 0x7BC3, 0x7BC4, -0x57C2, 0x803F, 0x6897, 0x5DE5, -0x653B, 0x529F, 0x606D, 0x9F9A, -0x4F9B, 0x8EAC, 0x516C, 0x5BAB, -0x5F13, 0x5DE9, 0x6C5E, 0x62F1, -0x8D21, 0x5171, 0x94A9, 0x52FE, -0x6C9F, 0x82DF, 0x72D7, 0x57A2, -0x6784, 0x8D2D, 0x591F, 0x8F9C, -0x83C7, 0x5495, 0x7B8D, 0x4F30, -0x6CBD, 0x5B64, 0x59D1, 0x9F13, -0x53E4, 0x86CA, 0x9AA8, 0x8C37, -0x80A1, 0x6545, 0x987E, 0x56FA, -0x96C7, 0x522E, 0x74DC, 0x5250, -0x5BE1, 0x6302, 0x8902, 0x4E56, -0x62D0, 0x602A, 0x68FA, 0x5173, -0x5B98, 0x51A0, 0x89C2, 0x7BA1, -0x9986, 0x7F50, 0x60EF, 0x704C, -0x8D2F, 0x5149, 0x5E7F, 0x901B, -0x7470, 0x89C4, 0x572D, 0x7845, -0x5F52, 0x9F9F, 0x95FA, 0x8F68, -0x9B3C, 0x8BE1, 0x7678, 0x6842, -0x67DC, 0x8DEA, 0x8D35, 0x523D, -0x8F8A, 0x6EDA, 0x68CD, 0x9505, -0x90ED, 0x56FD, 0x679C, 0x88F9, -0x8FC7, 0x54C8, 0x7BC5, 0x7BC8, -0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, -0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, -0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, -0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, -0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, -0x7BE4, 0x7BE7, 0x7BE8, 0x7BE9, -0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, -0x7BF0, 0x7BF2, 0x7BF3, 0x7BF4, -0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, -0x7BFA, 0x7BFB, 0x7BFD, 0x7BFF, -0x7C00, 0x7C01, 0x7C02, 0x7C03, -0x7C04, 0x7C05, 0x7C06, 0x7C08, -0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, -0x7C10, 0x7C11, 0x7C12, 0x7C13, -0x7C14, 0x7C15, 0x7C17, 0x7C18, -0x7C19, 0x7C1A, 0x7C1B, 0x7C1C, -0x7C1D, 0x7C1E, 0x7C20, 0x7C21, -0x7C22, 0x7C23, 0x7C24, 0x7C25, -0x7C28, 0x7C29, 0x7C2B, 0x7C2C, -0x7C2D, 0x7C2E, 0x7C2F, 0x7C30, -0x7C31, 0x7C32, 0x7C33, 0x7C34, -0x7C35, 0x7C36, 0x7C37, 0x7C39, -0x7C3A, 0x7C3B, 0x7C3C, 0x7C3D, -0x7C3E, 0x7C42, 0x9AB8, 0x5B69, -0x6D77, 0x6C26, 0x4EA5, 0x5BB3, -0x9A87, 0x9163, 0x61A8, 0x90AF, -0x97E9, 0x542B, 0x6DB5, 0x5BD2, -0x51FD, 0x558A, 0x7F55, 0x7FF0, -0x64BC, 0x634D, 0x65F1, 0x61BE, -0x608D, 0x710A, 0x6C57, 0x6C49, -0x592F, 0x676D, 0x822A, 0x58D5, -0x568E, 0x8C6A, 0x6BEB, 0x90DD, -0x597D, 0x8017, 0x53F7, 0x6D69, -0x5475, 0x559D, 0x8377, 0x83CF, -0x6838, 0x79BE, 0x548C, 0x4F55, -0x5408, 0x76D2, 0x8C89, 0x9602, -0x6CB3, 0x6DB8, 0x8D6B, 0x8910, -0x9E64, 0x8D3A, 0x563F, 0x9ED1, -0x75D5, 0x5F88, 0x72E0, 0x6068, -0x54FC, 0x4EA8, 0x6A2A, 0x8861, -0x6052, 0x8F70, 0x54C4, 0x70D8, -0x8679, 0x9E3F, 0x6D2A, 0x5B8F, -0x5F18, 0x7EA2, 0x5589, 0x4FAF, -0x7334, 0x543C, 0x539A, 0x5019, -0x540E, 0x547C, 0x4E4E, 0x5FFD, -0x745A, 0x58F6, 0x846B, 0x80E1, -0x8774, 0x72D0, 0x7CCA, 0x6E56, -0x7C43, 0x7C44, 0x7C45, 0x7C46, -0x7C47, 0x7C48, 0x7C49, 0x7C4A, -0x7C4B, 0x7C4C, 0x7C4E, 0x7C4F, -0x7C50, 0x7C51, 0x7C52, 0x7C53, -0x7C54, 0x7C55, 0x7C56, 0x7C57, -0x7C58, 0x7C59, 0x7C5A, 0x7C5B, -0x7C5C, 0x7C5D, 0x7C5E, 0x7C5F, -0x7C60, 0x7C61, 0x7C62, 0x7C63, -0x7C64, 0x7C65, 0x7C66, 0x7C67, -0x7C68, 0x7C69, 0x7C6A, 0x7C6B, -0x7C6C, 0x7C6D, 0x7C6E, 0x7C6F, -0x7C70, 0x7C71, 0x7C72, 0x7C75, -0x7C76, 0x7C77, 0x7C78, 0x7C79, -0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, -0x7C81, 0x7C82, 0x7C83, 0x7C84, -0x7C85, 0x7C86, 0x7C87, 0x7C88, -0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, -0x7C8E, 0x7C8F, 0x7C90, 0x7C93, -0x7C94, 0x7C96, 0x7C99, 0x7C9A, -0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, -0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, -0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, -0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, -0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, -0x5F27, 0x864E, 0x552C, 0x62A4, -0x4E92, 0x6CAA, 0x6237, 0x82B1, -0x54D7, 0x534E, 0x733E, 0x6ED1, -0x753B, 0x5212, 0x5316, 0x8BDD, -0x69D0, 0x5F8A, 0x6000, 0x6DEE, -0x574F, 0x6B22, 0x73AF, 0x6853, -0x8FD8, 0x7F13, 0x6362, 0x60A3, -0x5524, 0x75EA, 0x8C62, 0x7115, -0x6DA3, 0x5BA6, 0x5E7B, 0x8352, -0x614C, 0x9EC4, 0x78FA, 0x8757, -0x7C27, 0x7687, 0x51F0, 0x60F6, -0x714C, 0x6643, 0x5E4C, 0x604D, -0x8C0E, 0x7070, 0x6325, 0x8F89, -0x5FBD, 0x6062, 0x86D4, 0x56DE, -0x6BC1, 0x6094, 0x6167, 0x5349, -0x60E0, 0x6666, 0x8D3F, 0x79FD, -0x4F1A, 0x70E9, 0x6C47, 0x8BB3, -0x8BF2, 0x7ED8, 0x8364, 0x660F, -0x5A5A, 0x9B42, 0x6D51, 0x6DF7, -0x8C41, 0x6D3B, 0x4F19, 0x706B, -0x83B7, 0x6216, 0x60D1, 0x970D, -0x8D27, 0x7978, 0x51FB, 0x573E, -0x57FA, 0x673A, 0x7578, 0x7A3D, -0x79EF, 0x7B95, 0x7CBF, 0x7CC0, -0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, -0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF, -0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, -0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB, -0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, -0x7CE3, 0x7CE4, 0x7CE5, 0x7CE6, -0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, -0x7CEC, 0x7CED, 0x7CEE, 0x7CF0, -0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, -0x7CF5, 0x7CF6, 0x7CF7, 0x7CF9, -0x7CFA, 0x7CFC, 0x7CFD, 0x7CFE, -0x7CFF, 0x7D00, 0x7D01, 0x7D02, -0x7D03, 0x7D04, 0x7D05, 0x7D06, -0x7D07, 0x7D08, 0x7D09, 0x7D0B, -0x7D0C, 0x7D0D, 0x7D0E, 0x7D0F, -0x7D10, 0x7D11, 0x7D12, 0x7D13, -0x7D14, 0x7D15, 0x7D16, 0x7D17, -0x7D18, 0x7D19, 0x7D1A, 0x7D1B, -0x7D1C, 0x7D1D, 0x7D1E, 0x7D1F, -0x7D21, 0x7D23, 0x7D24, 0x7D25, -0x7D26, 0x7D28, 0x7D29, 0x7D2A, -0x7D2C, 0x7D2D, 0x7D2E, 0x7D30, -0x7D31, 0x7D32, 0x7D33, 0x7D34, -0x7D35, 0x7D36, 0x808C, 0x9965, -0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, -0x59EC, 0x7EE9, 0x7F09, 0x5409, -0x6781, 0x68D8, 0x8F91, 0x7C4D, -0x96C6, 0x53CA, 0x6025, 0x75BE, -0x6C72, 0x5373, 0x5AC9, 0x7EA7, -0x6324, 0x51E0, 0x810A, 0x5DF1, -0x84DF, 0x6280, 0x5180, 0x5B63, -0x4F0E, 0x796D, 0x5242, 0x60B8, -0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, -0x8BB0, 0x65E2, 0x5FCC, 0x9645, -0x5993, 0x7EE7, 0x7EAA, 0x5609, -0x67B7, 0x5939, 0x4F73, 0x5BB6, -0x52A0, 0x835A, 0x988A, 0x8D3E, -0x7532, 0x94BE, 0x5047, 0x7A3C, -0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, -0x6B7C, 0x76D1, 0x575A, 0x5C16, -0x7B3A, 0x95F4, 0x714E, 0x517C, -0x80A9, 0x8270, 0x5978, 0x7F04, -0x8327, 0x68C0, 0x67EC, 0x78B1, -0x7877, 0x62E3, 0x6361, 0x7B80, -0x4FED, 0x526A, 0x51CF, 0x8350, -0x69DB, 0x9274, 0x8DF5, 0x8D31, -0x89C1, 0x952E, 0x7BAD, 0x4EF6, -0x7D37, 0x7D38, 0x7D39, 0x7D3A, -0x7D3B, 0x7D3C, 0x7D3D, 0x7D3E, -0x7D3F, 0x7D40, 0x7D41, 0x7D42, -0x7D43, 0x7D44, 0x7D45, 0x7D46, -0x7D47, 0x7D48, 0x7D49, 0x7D4A, -0x7D4B, 0x7D4C, 0x7D4D, 0x7D4E, -0x7D4F, 0x7D50, 0x7D51, 0x7D52, -0x7D53, 0x7D54, 0x7D55, 0x7D56, -0x7D57, 0x7D58, 0x7D59, 0x7D5A, -0x7D5B, 0x7D5C, 0x7D5D, 0x7D5E, -0x7D5F, 0x7D60, 0x7D61, 0x7D62, -0x7D63, 0x7D64, 0x7D65, 0x7D66, -0x7D67, 0x7D68, 0x7D69, 0x7D6A, -0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, -0x7D70, 0x7D71, 0x7D72, 0x7D73, -0x7D74, 0x7D75, 0x7D76, 0x7D78, -0x7D79, 0x7D7A, 0x7D7B, 0x7D7C, -0x7D7D, 0x7D7E, 0x7D7F, 0x7D80, -0x7D81, 0x7D82, 0x7D83, 0x7D84, -0x7D85, 0x7D86, 0x7D87, 0x7D88, -0x7D89, 0x7D8A, 0x7D8B, 0x7D8C, -0x7D8D, 0x7D8E, 0x7D8F, 0x7D90, -0x7D91, 0x7D92, 0x7D93, 0x7D94, -0x7D95, 0x7D96, 0x7D97, 0x7D98, -0x5065, 0x8230, 0x5251, 0x996F, -0x6E10, 0x6E85, 0x6DA7, 0x5EFA, -0x50F5, 0x59DC, 0x5C06, 0x6D46, -0x6C5F, 0x7586, 0x848B, 0x6868, -0x5956, 0x8BB2, 0x5320, 0x9171, -0x964D, 0x8549, 0x6912, 0x7901, -0x7126, 0x80F6, 0x4EA4, 0x90CA, -0x6D47, 0x9A84, 0x5A07, 0x56BC, -0x6405, 0x94F0, 0x77EB, 0x4FA5, -0x811A, 0x72E1, 0x89D2, 0x997A, -0x7F34, 0x7EDE, 0x527F, 0x6559, -0x9175, 0x8F7F, 0x8F83, 0x53EB, -0x7A96, 0x63ED, 0x63A5, 0x7686, -0x79F8, 0x8857, 0x9636, 0x622A, -0x52AB, 0x8282, 0x6854, 0x6770, -0x6377, 0x776B, 0x7AED, 0x6D01, -0x7ED3, 0x89E3, 0x59D0, 0x6212, -0x85C9, 0x82A5, 0x754C, 0x501F, -0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, -0x5DFE, 0x7B4B, 0x65A4, 0x91D1, -0x4ECA, 0x6D25, 0x895F, 0x7D27, -0x9526, 0x4EC5, 0x8C28, 0x8FDB, -0x9773, 0x664B, 0x7981, 0x8FD1, -0x70EC, 0x6D78, 0x7D99, 0x7D9A, -0x7D9B, 0x7D9C, 0x7D9D, 0x7D9E, -0x7D9F, 0x7DA0, 0x7DA1, 0x7DA2, -0x7DA3, 0x7DA4, 0x7DA5, 0x7DA7, -0x7DA8, 0x7DA9, 0x7DAA, 0x7DAB, -0x7DAC, 0x7DAD, 0x7DAF, 0x7DB0, -0x7DB1, 0x7DB2, 0x7DB3, 0x7DB4, -0x7DB5, 0x7DB6, 0x7DB7, 0x7DB8, -0x7DB9, 0x7DBA, 0x7DBB, 0x7DBC, -0x7DBD, 0x7DBE, 0x7DBF, 0x7DC0, -0x7DC1, 0x7DC2, 0x7DC3, 0x7DC4, -0x7DC5, 0x7DC6, 0x7DC7, 0x7DC8, -0x7DC9, 0x7DCA, 0x7DCB, 0x7DCC, -0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, -0x7DD1, 0x7DD2, 0x7DD3, 0x7DD4, -0x7DD5, 0x7DD6, 0x7DD7, 0x7DD8, -0x7DD9, 0x7DDA, 0x7DDB, 0x7DDC, -0x7DDD, 0x7DDE, 0x7DDF, 0x7DE0, -0x7DE1, 0x7DE2, 0x7DE3, 0x7DE4, -0x7DE5, 0x7DE6, 0x7DE7, 0x7DE8, -0x7DE9, 0x7DEA, 0x7DEB, 0x7DEC, -0x7DED, 0x7DEE, 0x7DEF, 0x7DF0, -0x7DF1, 0x7DF2, 0x7DF3, 0x7DF4, -0x7DF5, 0x7DF6, 0x7DF7, 0x7DF8, -0x7DF9, 0x7DFA, 0x5C3D, 0x52B2, -0x8346, 0x5162, 0x830E, 0x775B, -0x6676, 0x9CB8, 0x4EAC, 0x60CA, -0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, -0x8B66, 0x666F, 0x9888, 0x9759, -0x5883, 0x656C, 0x955C, 0x5F84, -0x75C9, 0x9756, 0x7ADF, 0x7ADE, -0x51C0, 0x70AF, 0x7A98, 0x63EA, -0x7A76, 0x7EA0, 0x7396, 0x97ED, -0x4E45, 0x7078, 0x4E5D, 0x9152, -0x53A9, 0x6551, 0x65E7, 0x81FC, -0x8205, 0x548E, 0x5C31, 0x759A, -0x97A0, 0x62D8, 0x72D9, 0x75BD, -0x5C45, 0x9A79, 0x83CA, 0x5C40, -0x5480, 0x77E9, 0x4E3E, 0x6CAE, -0x805A, 0x62D2, 0x636E, 0x5DE8, -0x5177, 0x8DDD, 0x8E1E, 0x952F, -0x4FF1, 0x53E5, 0x60E7, 0x70AC, -0x5267, 0x6350, 0x9E43, 0x5A1F, -0x5026, 0x7737, 0x5377, 0x7EE2, -0x6485, 0x652B, 0x6289, 0x6398, -0x5014, 0x7235, 0x89C9, 0x51B3, -0x8BC0, 0x7EDD, 0x5747, 0x83CC, -0x94A7, 0x519B, 0x541B, 0x5CFB, -0x7DFB, 0x7DFC, 0x7DFD, 0x7DFE, -0x7DFF, 0x7E00, 0x7E01, 0x7E02, -0x7E03, 0x7E04, 0x7E05, 0x7E06, -0x7E07, 0x7E08, 0x7E09, 0x7E0A, -0x7E0B, 0x7E0C, 0x7E0D, 0x7E0E, -0x7E0F, 0x7E10, 0x7E11, 0x7E12, -0x7E13, 0x7E14, 0x7E15, 0x7E16, -0x7E17, 0x7E18, 0x7E19, 0x7E1A, -0x7E1B, 0x7E1C, 0x7E1D, 0x7E1E, -0x7E1F, 0x7E20, 0x7E21, 0x7E22, -0x7E23, 0x7E24, 0x7E25, 0x7E26, -0x7E27, 0x7E28, 0x7E29, 0x7E2A, -0x7E2B, 0x7E2C, 0x7E2D, 0x7E2E, -0x7E2F, 0x7E30, 0x7E31, 0x7E32, -0x7E33, 0x7E34, 0x7E35, 0x7E36, -0x7E37, 0x7E38, 0x7E39, 0x7E3A, -0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, -0x7E40, 0x7E42, 0x7E43, 0x7E44, -0x7E45, 0x7E46, 0x7E48, 0x7E49, -0x7E4A, 0x7E4B, 0x7E4C, 0x7E4D, -0x7E4E, 0x7E4F, 0x7E50, 0x7E51, -0x7E52, 0x7E53, 0x7E54, 0x7E55, -0x7E56, 0x7E57, 0x7E58, 0x7E59, -0x7E5A, 0x7E5B, 0x7E5C, 0x7E5D, -0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, -0x9A8F, 0x5580, 0x5496, 0x5361, -0x54AF, 0x5F00, 0x63E9, 0x6977, -0x51EF, 0x6168, 0x520A, 0x582A, -0x52D8, 0x574E, 0x780D, 0x770B, -0x5EB7, 0x6177, 0x7CE0, 0x625B, -0x6297, 0x4EA2, 0x7095, 0x8003, -0x62F7, 0x70E4, 0x9760, 0x5777, -0x82DB, 0x67EF, 0x68F5, 0x78D5, -0x9897, 0x79D1, 0x58F3, 0x54B3, -0x53EF, 0x6E34, 0x514B, 0x523B, -0x5BA2, 0x8BFE, 0x80AF, 0x5543, -0x57A6, 0x6073, 0x5751, 0x542D, -0x7A7A, 0x6050, 0x5B54, 0x63A7, -0x62A0, 0x53E3, 0x6263, 0x5BC7, -0x67AF, 0x54ED, 0x7A9F, 0x82E6, -0x9177, 0x5E93, 0x88E4, 0x5938, -0x57AE, 0x630E, 0x8DE8, 0x80EF, -0x5757, 0x7B77, 0x4FA9, 0x5FEB, -0x5BBD, 0x6B3E, 0x5321, 0x7B50, -0x72C2, 0x6846, 0x77FF, 0x7736, -0x65F7, 0x51B5, 0x4E8F, 0x76D4, -0x5CBF, 0x7AA5, 0x8475, 0x594E, -0x9B41, 0x5080, 0x7E5E, 0x7E5F, -0x7E60, 0x7E61, 0x7E62, 0x7E63, -0x7E64, 0x7E65, 0x7E66, 0x7E67, -0x7E68, 0x7E69, 0x7E6A, 0x7E6B, -0x7E6C, 0x7E6D, 0x7E6E, 0x7E6F, -0x7E70, 0x7E71, 0x7E72, 0x7E73, -0x7E74, 0x7E75, 0x7E76, 0x7E77, -0x7E78, 0x7E79, 0x7E7A, 0x7E7B, -0x7E7C, 0x7E7D, 0x7E7E, 0x7E7F, -0x7E80, 0x7E81, 0x7E83, 0x7E84, -0x7E85, 0x7E86, 0x7E87, 0x7E88, -0x7E89, 0x7E8A, 0x7E8B, 0x7E8C, -0x7E8D, 0x7E8E, 0x7E8F, 0x7E90, -0x7E91, 0x7E92, 0x7E93, 0x7E94, -0x7E95, 0x7E96, 0x7E97, 0x7E98, -0x7E99, 0x7E9A, 0x7E9C, 0x7E9D, -0x7E9E, 0x7EAE, 0x7EB4, 0x7EBB, -0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, -0x7EF9, 0x7F0A, 0x7F10, 0x7F1E, -0x7F37, 0x7F39, 0x7F3B, 0x7F3C, -0x7F3D, 0x7F3E, 0x7F3F, 0x7F40, -0x7F41, 0x7F43, 0x7F46, 0x7F47, -0x7F48, 0x7F49, 0x7F4A, 0x7F4B, -0x7F4C, 0x7F4D, 0x7F4E, 0x7F4F, -0x7F52, 0x7F53, 0x9988, 0x6127, -0x6E83, 0x5764, 0x6606, 0x6346, -0x56F0, 0x62EC, 0x6269, 0x5ED3, -0x9614, 0x5783, 0x62C9, 0x5587, -0x8721, 0x814A, 0x8FA3, 0x5566, -0x83B1, 0x6765, 0x8D56, 0x84DD, -0x5A6A, 0x680F, 0x62E6, 0x7BEE, -0x9611, 0x5170, 0x6F9C, 0x8C30, -0x63FD, 0x89C8, 0x61D2, 0x7F06, -0x70C2, 0x6EE5, 0x7405, 0x6994, -0x72FC, 0x5ECA, 0x90CE, 0x6717, -0x6D6A, 0x635E, 0x52B3, 0x7262, -0x8001, 0x4F6C, 0x59E5, 0x916A, -0x70D9, 0x6D9D, 0x52D2, 0x4E50, -0x96F7, 0x956D, 0x857E, 0x78CA, -0x7D2F, 0x5121, 0x5792, 0x64C2, -0x808B, 0x7C7B, 0x6CEA, 0x68F1, -0x695E, 0x51B7, 0x5398, 0x68A8, -0x7281, 0x9ECE, 0x7BF1, 0x72F8, -0x79BB, 0x6F13, 0x7406, 0x674E, -0x91CC, 0x9CA4, 0x793C, 0x8389, -0x8354, 0x540F, 0x6817, 0x4E3D, -0x5389, 0x52B1, 0x783E, 0x5386, -0x5229, 0x5088, 0x4F8B, 0x4FD0, -0x7F56, 0x7F59, 0x7F5B, 0x7F5C, -0x7F5D, 0x7F5E, 0x7F60, 0x7F63, -0x7F64, 0x7F65, 0x7F66, 0x7F67, -0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, -0x7F70, 0x7F73, 0x7F75, 0x7F76, -0x7F77, 0x7F78, 0x7F7A, 0x7F7B, -0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, -0x7F82, 0x7F83, 0x7F84, 0x7F85, -0x7F86, 0x7F87, 0x7F88, 0x7F89, -0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, -0x7F91, 0x7F92, 0x7F93, 0x7F95, -0x7F96, 0x7F97, 0x7F98, 0x7F99, -0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, -0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8, -0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, -0x7FAD, 0x7FAE, 0x7FB1, 0x7FB3, -0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, -0x7FBA, 0x7FBB, 0x7FBE, 0x7FC0, -0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, -0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, -0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, -0x7FD2, 0x7FD3, 0x7FD6, 0x7FD7, -0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, -0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, -0x75E2, 0x7ACB, 0x7C92, 0x6CA5, -0x96B6, 0x529B, 0x7483, 0x54E9, -0x4FE9, 0x8054, 0x83B2, 0x8FDE, -0x9570, 0x5EC9, 0x601C, 0x6D9F, -0x5E18, 0x655B, 0x8138, 0x94FE, -0x604B, 0x70BC, 0x7EC3, 0x7CAE, -0x51C9, 0x6881, 0x7CB1, 0x826F, -0x4E24, 0x8F86, 0x91CF, 0x667E, -0x4EAE, 0x8C05, 0x64A9, 0x804A, -0x50DA, 0x7597, 0x71CE, 0x5BE5, -0x8FBD, 0x6F66, 0x4E86, 0x6482, -0x9563, 0x5ED6, 0x6599, 0x5217, -0x88C2, 0x70C8, 0x52A3, 0x730E, -0x7433, 0x6797, 0x78F7, 0x9716, -0x4E34, 0x90BB, 0x9CDE, 0x6DCB, -0x51DB, 0x8D41, 0x541D, 0x62CE, -0x73B2, 0x83F1, 0x96F6, 0x9F84, -0x94C3, 0x4F36, 0x7F9A, 0x51CC, -0x7075, 0x9675, 0x5CAD, 0x9886, -0x53E6, 0x4EE4, 0x6E9C, 0x7409, -0x69B4, 0x786B, 0x998F, 0x7559, -0x5218, 0x7624, 0x6D41, 0x67F3, -0x516D, 0x9F99, 0x804B, 0x5499, -0x7B3C, 0x7ABF, 0x7FE4, 0x7FE7, -0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, -0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, -0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, -0x7FF9, 0x7FFA, 0x7FFD, 0x7FFE, -0x7FFF, 0x8002, 0x8007, 0x8008, -0x8009, 0x800A, 0x800E, 0x800F, -0x8011, 0x8013, 0x801A, 0x801B, -0x801D, 0x801E, 0x801F, 0x8021, -0x8023, 0x8024, 0x802B, 0x802C, -0x802D, 0x802E, 0x802F, 0x8030, -0x8032, 0x8034, 0x8039, 0x803A, -0x803C, 0x803E, 0x8040, 0x8041, -0x8044, 0x8045, 0x8047, 0x8048, -0x8049, 0x804E, 0x804F, 0x8050, -0x8051, 0x8053, 0x8055, 0x8056, -0x8057, 0x8059, 0x805B, 0x805C, -0x805D, 0x805E, 0x805F, 0x8060, -0x8061, 0x8062, 0x8063, 0x8064, -0x8065, 0x8066, 0x8067, 0x8068, -0x806B, 0x806C, 0x806D, 0x806E, -0x806F, 0x8070, 0x8072, 0x8073, -0x8074, 0x8075, 0x8076, 0x8077, -0x8078, 0x8079, 0x807A, 0x807B, -0x807C, 0x807D, 0x9686, 0x5784, -0x62E2, 0x9647, 0x697C, 0x5A04, -0x6402, 0x7BD3, 0x6F0F, 0x964B, -0x82A6, 0x5362, 0x9885, 0x5E90, -0x7089, 0x63B3, 0x5364, 0x864F, -0x9C81, 0x9E93, 0x788C, 0x9732, -0x8DEF, 0x8D42, 0x9E7F, 0x6F5E, -0x7984, 0x5F55, 0x9646, 0x622E, -0x9A74, 0x5415, 0x94DD, 0x4FA3, -0x65C5, 0x5C65, 0x5C61, 0x7F15, -0x8651, 0x6C2F, 0x5F8B, 0x7387, -0x6EE4, 0x7EFF, 0x5CE6, 0x631B, -0x5B6A, 0x6EE6, 0x5375, 0x4E71, -0x63A0, 0x7565, 0x62A1, 0x8F6E, -0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, -0x8BBA, 0x841D, 0x87BA, 0x7F57, -0x903B, 0x9523, 0x7BA9, 0x9AA1, -0x88F8, 0x843D, 0x6D1B, 0x9A86, -0x7EDC, 0x5988, 0x9EBB, 0x739B, -0x7801, 0x8682, 0x9A6C, 0x9A82, -0x561B, 0x5417, 0x57CB, 0x4E70, -0x9EA6, 0x5356, 0x8FC8, 0x8109, -0x7792, 0x9992, 0x86EE, 0x6EE1, -0x8513, 0x66FC, 0x6162, 0x6F2B, -0x807E, 0x8081, 0x8082, 0x8085, -0x8088, 0x808A, 0x808D, 0x808E, -0x808F, 0x8090, 0x8091, 0x8092, -0x8094, 0x8095, 0x8097, 0x8099, -0x809E, 0x80A3, 0x80A6, 0x80A7, -0x80A8, 0x80AC, 0x80B0, 0x80B3, -0x80B5, 0x80B6, 0x80B8, 0x80B9, -0x80BB, 0x80C5, 0x80C7, 0x80C8, -0x80C9, 0x80CA, 0x80CB, 0x80CF, -0x80D0, 0x80D1, 0x80D2, 0x80D3, -0x80D4, 0x80D5, 0x80D8, 0x80DF, -0x80E0, 0x80E2, 0x80E3, 0x80E6, -0x80EE, 0x80F5, 0x80F7, 0x80F9, -0x80FB, 0x80FE, 0x80FF, 0x8100, -0x8101, 0x8103, 0x8104, 0x8105, -0x8107, 0x8108, 0x810B, 0x810C, -0x8115, 0x8117, 0x8119, 0x811B, -0x811C, 0x811D, 0x811F, 0x8120, -0x8121, 0x8122, 0x8123, 0x8124, -0x8125, 0x8126, 0x8127, 0x8128, -0x8129, 0x812A, 0x812B, 0x812D, -0x812E, 0x8130, 0x8133, 0x8134, -0x8135, 0x8137, 0x8139, 0x813A, -0x813B, 0x813C, 0x813D, 0x813F, -0x8C29, 0x8292, 0x832B, 0x76F2, -0x6C13, 0x5FD9, 0x83BD, 0x732B, -0x8305, 0x951A, 0x6BDB, 0x77DB, -0x94C6, 0x536F, 0x8302, 0x5192, -0x5E3D, 0x8C8C, 0x8D38, 0x4E48, -0x73AB, 0x679A, 0x6885, 0x9176, -0x9709, 0x7164, 0x6CA1, 0x7709, -0x5A92, 0x9541, 0x6BCF, 0x7F8E, -0x6627, 0x5BD0, 0x59B9, 0x5A9A, -0x95E8, 0x95F7, 0x4EEC, 0x840C, -0x8499, 0x6AAC, 0x76DF, 0x9530, -0x731B, 0x68A6, 0x5B5F, 0x772F, -0x919A, 0x9761, 0x7CDC, 0x8FF7, -0x8C1C, 0x5F25, 0x7C73, 0x79D8, -0x89C5, 0x6CCC, 0x871C, 0x5BC6, -0x5E42, 0x68C9, 0x7720, 0x7EF5, -0x5195, 0x514D, 0x52C9, 0x5A29, -0x7F05, 0x9762, 0x82D7, 0x63CF, -0x7784, 0x85D0, 0x79D2, 0x6E3A, -0x5E99, 0x5999, 0x8511, 0x706D, -0x6C11, 0x62BF, 0x76BF, 0x654F, -0x60AF, 0x95FD, 0x660E, 0x879F, -0x9E23, 0x94ED, 0x540D, 0x547D, -0x8C2C, 0x6478, 0x8140, 0x8141, -0x8142, 0x8143, 0x8144, 0x8145, -0x8147, 0x8149, 0x814D, 0x814E, -0x814F, 0x8152, 0x8156, 0x8157, -0x8158, 0x815B, 0x815C, 0x815D, -0x815E, 0x815F, 0x8161, 0x8162, -0x8163, 0x8164, 0x8166, 0x8168, -0x816A, 0x816B, 0x816C, 0x816F, -0x8172, 0x8173, 0x8175, 0x8176, -0x8177, 0x8178, 0x8181, 0x8183, -0x8184, 0x8185, 0x8186, 0x8187, -0x8189, 0x818B, 0x818C, 0x818D, -0x818E, 0x8190, 0x8192, 0x8193, -0x8194, 0x8195, 0x8196, 0x8197, -0x8199, 0x819A, 0x819E, 0x819F, -0x81A0, 0x81A1, 0x81A2, 0x81A4, -0x81A5, 0x81A7, 0x81A9, 0x81AB, -0x81AC, 0x81AD, 0x81AE, 0x81AF, -0x81B0, 0x81B1, 0x81B2, 0x81B4, -0x81B5, 0x81B6, 0x81B7, 0x81B8, -0x81B9, 0x81BC, 0x81BD, 0x81BE, -0x81BF, 0x81C4, 0x81C5, 0x81C7, -0x81C8, 0x81C9, 0x81CB, 0x81CD, -0x81CE, 0x81CF, 0x81D0, 0x81D1, -0x81D2, 0x81D3, 0x6479, 0x8611, -0x6A21, 0x819C, 0x78E8, 0x6469, -0x9B54, 0x62B9, 0x672B, 0x83AB, -0x58A8, 0x9ED8, 0x6CAB, 0x6F20, -0x5BDE, 0x964C, 0x8C0B, 0x725F, -0x67D0, 0x62C7, 0x7261, 0x4EA9, -0x59C6, 0x6BCD, 0x5893, 0x66AE, -0x5E55, 0x52DF, 0x6155, 0x6728, -0x76EE, 0x7766, 0x7267, 0x7A46, -0x62FF, 0x54EA, 0x5450, 0x94A0, -0x90A3, 0x5A1C, 0x7EB3, 0x6C16, -0x4E43, 0x5976, 0x8010, 0x5948, -0x5357, 0x7537, 0x96BE, 0x56CA, -0x6320, 0x8111, 0x607C, 0x95F9, -0x6DD6, 0x5462, 0x9981, 0x5185, -0x5AE9, 0x80FD, 0x59AE, 0x9713, -0x502A, 0x6CE5, 0x5C3C, 0x62DF, -0x4F60, 0x533F, 0x817B, 0x9006, -0x6EBA, 0x852B, 0x62C8, 0x5E74, -0x78BE, 0x64B5, 0x637B, 0x5FF5, -0x5A18, 0x917F, 0x9E1F, 0x5C3F, -0x634F, 0x8042, 0x5B7D, 0x556E, -0x954A, 0x954D, 0x6D85, 0x60A8, -0x67E0, 0x72DE, 0x51DD, 0x5B81, -0x81D4, 0x81D5, 0x81D6, 0x81D7, -0x81D8, 0x81D9, 0x81DA, 0x81DB, -0x81DC, 0x81DD, 0x81DE, 0x81DF, -0x81E0, 0x81E1, 0x81E2, 0x81E4, -0x81E5, 0x81E6, 0x81E8, 0x81E9, -0x81EB, 0x81EE, 0x81EF, 0x81F0, -0x81F1, 0x81F2, 0x81F5, 0x81F6, -0x81F7, 0x81F8, 0x81F9, 0x81FA, -0x81FD, 0x81FF, 0x8203, 0x8207, -0x8208, 0x8209, 0x820A, 0x820B, -0x820E, 0x820F, 0x8211, 0x8213, -0x8215, 0x8216, 0x8217, 0x8218, -0x8219, 0x821A, 0x821D, 0x8220, -0x8224, 0x8225, 0x8226, 0x8227, -0x8229, 0x822E, 0x8232, 0x823A, -0x823C, 0x823D, 0x823F, 0x8240, -0x8241, 0x8242, 0x8243, 0x8245, -0x8246, 0x8248, 0x824A, 0x824C, -0x824D, 0x824E, 0x8250, 0x8251, -0x8252, 0x8253, 0x8254, 0x8255, -0x8256, 0x8257, 0x8259, 0x825B, -0x825C, 0x825D, 0x825E, 0x8260, -0x8261, 0x8262, 0x8263, 0x8264, -0x8265, 0x8266, 0x8267, 0x8269, -0x62E7, 0x6CDE, 0x725B, 0x626D, -0x94AE, 0x7EBD, 0x8113, 0x6D53, -0x519C, 0x5F04, 0x5974, 0x52AA, -0x6012, 0x5973, 0x6696, 0x8650, -0x759F, 0x632A, 0x61E6, 0x7CEF, -0x8BFA, 0x54E6, 0x6B27, 0x9E25, -0x6BB4, 0x85D5, 0x5455, 0x5076, -0x6CA4, 0x556A, 0x8DB4, 0x722C, -0x5E15, 0x6015, 0x7436, 0x62CD, -0x6392, 0x724C, 0x5F98, 0x6E43, -0x6D3E, 0x6500, 0x6F58, 0x76D8, -0x78D0, 0x76FC, 0x7554, 0x5224, -0x53DB, 0x4E53, 0x5E9E, 0x65C1, -0x802A, 0x80D6, 0x629B, 0x5486, -0x5228, 0x70AE, 0x888D, 0x8DD1, -0x6CE1, 0x5478, 0x80DA, 0x57F9, -0x88F4, 0x8D54, 0x966A, 0x914D, -0x4F69, 0x6C9B, 0x55B7, 0x76C6, -0x7830, 0x62A8, 0x70F9, 0x6F8E, -0x5F6D, 0x84EC, 0x68DA, 0x787C, -0x7BF7, 0x81A8, 0x670B, 0x9E4F, -0x6367, 0x78B0, 0x576F, 0x7812, -0x9739, 0x6279, 0x62AB, 0x5288, -0x7435, 0x6BD7, 0x826A, 0x826B, -0x826C, 0x826D, 0x8271, 0x8275, -0x8276, 0x8277, 0x8278, 0x827B, -0x827C, 0x8280, 0x8281, 0x8283, -0x8285, 0x8286, 0x8287, 0x8289, -0x828C, 0x8290, 0x8293, 0x8294, -0x8295, 0x8296, 0x829A, 0x829B, -0x829E, 0x82A0, 0x82A2, 0x82A3, -0x82A7, 0x82B2, 0x82B5, 0x82B6, -0x82BA, 0x82BB, 0x82BC, 0x82BF, -0x82C0, 0x82C2, 0x82C3, 0x82C5, -0x82C6, 0x82C9, 0x82D0, 0x82D6, -0x82D9, 0x82DA, 0x82DD, 0x82E2, -0x82E7, 0x82E8, 0x82E9, 0x82EA, -0x82EC, 0x82ED, 0x82EE, 0x82F0, -0x82F2, 0x82F3, 0x82F5, 0x82F6, -0x82F8, 0x82FA, 0x82FC, 0x82FD, -0x82FE, 0x82FF, 0x8300, 0x830A, -0x830B, 0x830D, 0x8310, 0x8312, -0x8313, 0x8316, 0x8318, 0x8319, -0x831D, 0x831E, 0x831F, 0x8320, -0x8321, 0x8322, 0x8323, 0x8324, -0x8325, 0x8326, 0x8329, 0x832A, -0x832E, 0x8330, 0x8332, 0x8337, -0x833B, 0x833D, 0x5564, 0x813E, -0x75B2, 0x76AE, 0x5339, 0x75DE, -0x50FB, 0x5C41, 0x8B6C, 0x7BC7, -0x504F, 0x7247, 0x9A97, 0x98D8, -0x6F02, 0x74E2, 0x7968, 0x6487, -0x77A5, 0x62FC, 0x9891, 0x8D2B, -0x54C1, 0x8058, 0x4E52, 0x576A, -0x82F9, 0x840D, 0x5E73, 0x51ED, -0x74F6, 0x8BC4, 0x5C4F, 0x5761, -0x6CFC, 0x9887, 0x5A46, 0x7834, -0x9B44, 0x8FEB, 0x7C95, 0x5256, -0x6251, 0x94FA, 0x4EC6, 0x8386, -0x8461, 0x83E9, 0x84B2, 0x57D4, -0x6734, 0x5703, 0x666E, 0x6D66, -0x8C31, 0x66DD, 0x7011, 0x671F, -0x6B3A, 0x6816, 0x621A, 0x59BB, -0x4E03, 0x51C4, 0x6F06, 0x67D2, -0x6C8F, 0x5176, 0x68CB, 0x5947, -0x6B67, 0x7566, 0x5D0E, 0x8110, -0x9F50, 0x65D7, 0x7948, 0x7941, -0x9A91, 0x8D77, 0x5C82, 0x4E5E, -0x4F01, 0x542F, 0x5951, 0x780C, -0x5668, 0x6C14, 0x8FC4, 0x5F03, -0x6C7D, 0x6CE3, 0x8BAB, 0x6390, -0x833E, 0x833F, 0x8341, 0x8342, -0x8344, 0x8345, 0x8348, 0x834A, -0x834B, 0x834C, 0x834D, 0x834E, -0x8353, 0x8355, 0x8356, 0x8357, -0x8358, 0x8359, 0x835D, 0x8362, -0x8370, 0x8371, 0x8372, 0x8373, -0x8374, 0x8375, 0x8376, 0x8379, -0x837A, 0x837E, 0x837F, 0x8380, -0x8381, 0x8382, 0x8383, 0x8384, -0x8387, 0x8388, 0x838A, 0x838B, -0x838C, 0x838D, 0x838F, 0x8390, -0x8391, 0x8394, 0x8395, 0x8396, -0x8397, 0x8399, 0x839A, 0x839D, -0x839F, 0x83A1, 0x83A2, 0x83A3, -0x83A4, 0x83A5, 0x83A6, 0x83A7, -0x83AC, 0x83AD, 0x83AE, 0x83AF, -0x83B5, 0x83BB, 0x83BE, 0x83BF, -0x83C2, 0x83C3, 0x83C4, 0x83C6, -0x83C8, 0x83C9, 0x83CB, 0x83CD, -0x83CE, 0x83D0, 0x83D1, 0x83D2, -0x83D3, 0x83D5, 0x83D7, 0x83D9, -0x83DA, 0x83DB, 0x83DE, 0x83E2, -0x83E3, 0x83E4, 0x83E6, 0x83E7, -0x83E8, 0x83EB, 0x83EC, 0x83ED, -0x6070, 0x6D3D, 0x7275, 0x6266, -0x948E, 0x94C5, 0x5343, 0x8FC1, -0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, -0x9ED4, 0x94B1, 0x94B3, 0x524D, -0x6F5C, 0x9063, 0x6D45, 0x8C34, -0x5811, 0x5D4C, 0x6B20, 0x6B49, -0x67AA, 0x545B, 0x8154, 0x7F8C, -0x5899, 0x8537, 0x5F3A, 0x62A2, -0x6A47, 0x9539, 0x6572, 0x6084, -0x6865, 0x77A7, 0x4E54, 0x4FA8, -0x5DE7, 0x9798, 0x64AC, 0x7FD8, -0x5CED, 0x4FCF, 0x7A8D, 0x5207, -0x8304, 0x4E14, 0x602F, 0x7A83, -0x94A6, 0x4FB5, 0x4EB2, 0x79E6, -0x7434, 0x52E4, 0x82B9, 0x64D2, -0x79BD, 0x5BDD, 0x6C81, 0x9752, -0x8F7B, 0x6C22, 0x503E, 0x537F, -0x6E05, 0x64CE, 0x6674, 0x6C30, -0x60C5, 0x9877, 0x8BF7, 0x5E86, -0x743C, 0x7A77, 0x79CB, 0x4E18, -0x90B1, 0x7403, 0x6C42, 0x56DA, -0x914B, 0x6CC5, 0x8D8B, 0x533A, -0x86C6, 0x66F2, 0x8EAF, 0x5C48, -0x9A71, 0x6E20, 0x83EE, 0x83EF, -0x83F3, 0x83F4, 0x83F5, 0x83F6, -0x83F7, 0x83FA, 0x83FB, 0x83FC, -0x83FE, 0x83FF, 0x8400, 0x8402, -0x8405, 0x8407, 0x8408, 0x8409, -0x840A, 0x8410, 0x8412, 0x8413, -0x8414, 0x8415, 0x8416, 0x8417, -0x8419, 0x841A, 0x841B, 0x841E, -0x841F, 0x8420, 0x8421, 0x8422, -0x8423, 0x8429, 0x842A, 0x842B, -0x842C, 0x842D, 0x842E, 0x842F, -0x8430, 0x8432, 0x8433, 0x8434, -0x8435, 0x8436, 0x8437, 0x8439, -0x843A, 0x843B, 0x843E, 0x843F, -0x8440, 0x8441, 0x8442, 0x8443, -0x8444, 0x8445, 0x8447, 0x8448, -0x8449, 0x844A, 0x844B, 0x844C, -0x844D, 0x844E, 0x844F, 0x8450, -0x8452, 0x8453, 0x8454, 0x8455, -0x8456, 0x8458, 0x845D, 0x845E, -0x845F, 0x8460, 0x8462, 0x8464, -0x8465, 0x8466, 0x8467, 0x8468, -0x846A, 0x846E, 0x846F, 0x8470, -0x8472, 0x8474, 0x8477, 0x8479, -0x847B, 0x847C, 0x53D6, 0x5A36, -0x9F8B, 0x8DA3, 0x53BB, 0x5708, -0x98A7, 0x6743, 0x919B, 0x6CC9, -0x5168, 0x75CA, 0x62F3, 0x72AC, -0x5238, 0x529D, 0x7F3A, 0x7094, -0x7638, 0x5374, 0x9E4A, 0x69B7, -0x786E, 0x96C0, 0x88D9, 0x7FA4, -0x7136, 0x71C3, 0x5189, 0x67D3, -0x74E4, 0x58E4, 0x6518, 0x56B7, -0x8BA9, 0x9976, 0x6270, 0x7ED5, -0x60F9, 0x70ED, 0x58EC, 0x4EC1, -0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, -0x8BA4, 0x5203, 0x598A, 0x7EAB, -0x6254, 0x4ECD, 0x65E5, 0x620E, -0x8338, 0x84C9, 0x8363, 0x878D, -0x7194, 0x6EB6, 0x5BB9, 0x7ED2, -0x5197, 0x63C9, 0x67D4, 0x8089, -0x8339, 0x8815, 0x5112, 0x5B7A, -0x5982, 0x8FB1, 0x4E73, 0x6C5D, -0x5165, 0x8925, 0x8F6F, 0x962E, -0x854A, 0x745E, 0x9510, 0x95F0, -0x6DA6, 0x82E5, 0x5F31, 0x6492, -0x6D12, 0x8428, 0x816E, 0x9CC3, -0x585E, 0x8D5B, 0x4E09, 0x53C1, -0x847D, 0x847E, 0x847F, 0x8480, -0x8481, 0x8483, 0x8484, 0x8485, -0x8486, 0x848A, 0x848D, 0x848F, -0x8490, 0x8491, 0x8492, 0x8493, -0x8494, 0x8495, 0x8496, 0x8498, -0x849A, 0x849B, 0x849D, 0x849E, -0x849F, 0x84A0, 0x84A2, 0x84A3, -0x84A4, 0x84A5, 0x84A6, 0x84A7, -0x84A8, 0x84A9, 0x84AA, 0x84AB, -0x84AC, 0x84AD, 0x84AE, 0x84B0, -0x84B1, 0x84B3, 0x84B5, 0x84B6, -0x84B7, 0x84BB, 0x84BC, 0x84BE, -0x84C0, 0x84C2, 0x84C3, 0x84C5, -0x84C6, 0x84C7, 0x84C8, 0x84CB, -0x84CC, 0x84CE, 0x84CF, 0x84D2, -0x84D4, 0x84D5, 0x84D7, 0x84D8, -0x84D9, 0x84DA, 0x84DB, 0x84DC, -0x84DE, 0x84E1, 0x84E2, 0x84E4, -0x84E7, 0x84E8, 0x84E9, 0x84EA, -0x84EB, 0x84ED, 0x84EE, 0x84EF, -0x84F1, 0x84F2, 0x84F3, 0x84F4, -0x84F5, 0x84F6, 0x84F7, 0x84F8, -0x84F9, 0x84FA, 0x84FB, 0x84FD, -0x84FE, 0x8500, 0x8501, 0x8502, -0x4F1E, 0x6563, 0x6851, 0x55D3, -0x4E27, 0x6414, 0x9A9A, 0x626B, -0x5AC2, 0x745F, 0x8272, 0x6DA9, -0x68EE, 0x50E7, 0x838E, 0x7802, -0x6740, 0x5239, 0x6C99, 0x7EB1, -0x50BB, 0x5565, 0x715E, 0x7B5B, -0x6652, 0x73CA, 0x82EB, 0x6749, -0x5C71, 0x5220, 0x717D, 0x886B, -0x95EA, 0x9655, 0x64C5, 0x8D61, -0x81B3, 0x5584, 0x6C55, 0x6247, -0x7F2E, 0x5892, 0x4F24, 0x5546, -0x8D4F, 0x664C, 0x4E0A, 0x5C1A, -0x88F3, 0x68A2, 0x634E, 0x7A0D, -0x70E7, 0x828D, 0x52FA, 0x97F6, -0x5C11, 0x54E8, 0x90B5, 0x7ECD, -0x5962, 0x8D4A, 0x86C7, 0x820C, -0x820D, 0x8D66, 0x6444, 0x5C04, -0x6151, 0x6D89, 0x793E, 0x8BBE, -0x7837, 0x7533, 0x547B, 0x4F38, -0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, -0x795E, 0x6C88, 0x5BA1, 0x5A76, -0x751A, 0x80BE, 0x614E, 0x6E17, -0x58F0, 0x751F, 0x7525, 0x7272, -0x5347, 0x7EF3, 0x8503, 0x8504, -0x8505, 0x8506, 0x8507, 0x8508, -0x8509, 0x850A, 0x850B, 0x850D, -0x850E, 0x850F, 0x8510, 0x8512, -0x8514, 0x8515, 0x8516, 0x8518, -0x8519, 0x851B, 0x851C, 0x851D, -0x851E, 0x8520, 0x8522, 0x8523, -0x8524, 0x8525, 0x8526, 0x8527, -0x8528, 0x8529, 0x852A, 0x852D, -0x852E, 0x852F, 0x8530, 0x8531, -0x8532, 0x8533, 0x8534, 0x8535, -0x8536, 0x853E, 0x853F, 0x8540, -0x8541, 0x8542, 0x8544, 0x8545, -0x8546, 0x8547, 0x854B, 0x854C, -0x854D, 0x854E, 0x854F, 0x8550, -0x8551, 0x8552, 0x8553, 0x8554, -0x8555, 0x8557, 0x8558, 0x855A, -0x855B, 0x855C, 0x855D, 0x855F, -0x8560, 0x8561, 0x8562, 0x8563, -0x8565, 0x8566, 0x8567, 0x8569, -0x856A, 0x856B, 0x856C, 0x856D, -0x856E, 0x856F, 0x8570, 0x8571, -0x8573, 0x8575, 0x8576, 0x8577, -0x8578, 0x857C, 0x857D, 0x857F, -0x8580, 0x8581, 0x7701, 0x76DB, -0x5269, 0x80DC, 0x5723, 0x5E08, -0x5931, 0x72EE, 0x65BD, 0x6E7F, -0x8BD7, 0x5C38, 0x8671, 0x5341, -0x77F3, 0x62FE, 0x65F6, 0x4EC0, -0x98DF, 0x8680, 0x5B9E, 0x8BC6, -0x53F2, 0x77E2, 0x4F7F, 0x5C4E, -0x9A76, 0x59CB, 0x5F0F, 0x793A, -0x58EB, 0x4E16, 0x67FF, 0x4E8B, -0x62ED, 0x8A93, 0x901D, 0x52BF, -0x662F, 0x55DC, 0x566C, 0x9002, -0x4ED5, 0x4F8D, 0x91CA, 0x9970, -0x6C0F, 0x5E02, 0x6043, 0x5BA4, -0x89C6, 0x8BD5, 0x6536, 0x624B, -0x9996, 0x5B88, 0x5BFF, 0x6388, -0x552E, 0x53D7, 0x7626, 0x517D, -0x852C, 0x67A2, 0x68B3, 0x6B8A, -0x6292, 0x8F93, 0x53D4, 0x8212, -0x6DD1, 0x758F, 0x4E66, 0x8D4E, -0x5B70, 0x719F, 0x85AF, 0x6691, -0x66D9, 0x7F72, 0x8700, 0x9ECD, -0x9F20, 0x5C5E, 0x672F, 0x8FF0, -0x6811, 0x675F, 0x620D, 0x7AD6, -0x5885, 0x5EB6, 0x6570, 0x6F31, -0x8582, 0x8583, 0x8586, 0x8588, -0x8589, 0x858A, 0x858B, 0x858C, -0x858D, 0x858E, 0x8590, 0x8591, -0x8592, 0x8593, 0x8594, 0x8595, -0x8596, 0x8597, 0x8598, 0x8599, -0x859A, 0x859D, 0x859E, 0x859F, -0x85A0, 0x85A1, 0x85A2, 0x85A3, -0x85A5, 0x85A6, 0x85A7, 0x85A9, -0x85AB, 0x85AC, 0x85AD, 0x85B1, -0x85B2, 0x85B3, 0x85B4, 0x85B5, -0x85B6, 0x85B8, 0x85BA, 0x85BB, -0x85BC, 0x85BD, 0x85BE, 0x85BF, -0x85C0, 0x85C2, 0x85C3, 0x85C4, -0x85C5, 0x85C6, 0x85C7, 0x85C8, -0x85CA, 0x85CB, 0x85CC, 0x85CD, -0x85CE, 0x85D1, 0x85D2, 0x85D4, -0x85D6, 0x85D7, 0x85D8, 0x85D9, -0x85DA, 0x85DB, 0x85DD, 0x85DE, -0x85DF, 0x85E0, 0x85E1, 0x85E2, -0x85E3, 0x85E5, 0x85E6, 0x85E7, -0x85E8, 0x85EA, 0x85EB, 0x85EC, -0x85ED, 0x85EE, 0x85EF, 0x85F0, -0x85F1, 0x85F2, 0x85F3, 0x85F4, -0x85F5, 0x85F6, 0x85F7, 0x85F8, -0x6055, 0x5237, 0x800D, 0x6454, -0x8870, 0x7529, 0x5E05, 0x6813, -0x62F4, 0x971C, 0x53CC, 0x723D, -0x8C01, 0x6C34, 0x7761, 0x7A0E, -0x542E, 0x77AC, 0x987A, 0x821C, -0x8BF4, 0x7855, 0x6714, 0x70C1, -0x65AF, 0x6495, 0x5636, 0x601D, -0x79C1, 0x53F8, 0x4E1D, 0x6B7B, -0x8086, 0x5BFA, 0x55E3, 0x56DB, -0x4F3A, 0x4F3C, 0x9972, 0x5DF3, -0x677E, 0x8038, 0x6002, 0x9882, -0x9001, 0x5B8B, 0x8BBC, 0x8BF5, -0x641C, 0x8258, 0x64DE, 0x55FD, -0x82CF, 0x9165, 0x4FD7, 0x7D20, -0x901F, 0x7C9F, 0x50F3, 0x5851, -0x6EAF, 0x5BBF, 0x8BC9, 0x8083, -0x9178, 0x849C, 0x7B97, 0x867D, -0x968B, 0x968F, 0x7EE5, 0x9AD3, -0x788E, 0x5C81, 0x7A57, 0x9042, -0x96A7, 0x795F, 0x5B59, 0x635F, -0x7B0B, 0x84D1, 0x68AD, 0x5506, -0x7F29, 0x7410, 0x7D22, 0x9501, -0x6240, 0x584C, 0x4ED6, 0x5B83, -0x5979, 0x5854, 0x85F9, 0x85FA, -0x85FC, 0x85FD, 0x85FE, 0x8600, -0x8601, 0x8602, 0x8603, 0x8604, -0x8606, 0x8607, 0x8608, 0x8609, -0x860A, 0x860B, 0x860C, 0x860D, -0x860E, 0x860F, 0x8610, 0x8612, -0x8613, 0x8614, 0x8615, 0x8617, -0x8618, 0x8619, 0x861A, 0x861B, -0x861C, 0x861D, 0x861E, 0x861F, -0x8620, 0x8621, 0x8622, 0x8623, -0x8624, 0x8625, 0x8626, 0x8628, -0x862A, 0x862B, 0x862C, 0x862D, -0x862E, 0x862F, 0x8630, 0x8631, -0x8632, 0x8633, 0x8634, 0x8635, -0x8636, 0x8637, 0x8639, 0x863A, -0x863B, 0x863D, 0x863E, 0x863F, -0x8640, 0x8641, 0x8642, 0x8643, -0x8644, 0x8645, 0x8646, 0x8647, -0x8648, 0x8649, 0x864A, 0x864B, -0x864C, 0x8652, 0x8653, 0x8655, -0x8656, 0x8657, 0x8658, 0x8659, -0x865B, 0x865C, 0x865D, 0x865F, -0x8660, 0x8661, 0x8663, 0x8664, -0x8665, 0x8666, 0x8667, 0x8668, -0x8669, 0x866A, 0x736D, 0x631E, -0x8E4B, 0x8E0F, 0x80CE, 0x82D4, -0x62AC, 0x53F0, 0x6CF0, 0x915E, -0x592A, 0x6001, 0x6C70, 0x574D, -0x644A, 0x8D2A, 0x762B, 0x6EE9, -0x575B, 0x6A80, 0x75F0, 0x6F6D, -0x8C2D, 0x8C08, 0x5766, 0x6BEF, -0x8892, 0x78B3, 0x63A2, 0x53F9, -0x70AD, 0x6C64, 0x5858, 0x642A, -0x5802, 0x68E0, 0x819B, 0x5510, -0x7CD6, 0x5018, 0x8EBA, 0x6DCC, -0x8D9F, 0x70EB, 0x638F, 0x6D9B, -0x6ED4, 0x7EE6, 0x8404, 0x6843, -0x9003, 0x6DD8, 0x9676, 0x8BA8, -0x5957, 0x7279, 0x85E4, 0x817E, -0x75BC, 0x8A8A, 0x68AF, 0x5254, -0x8E22, 0x9511, 0x63D0, 0x9898, -0x8E44, 0x557C, 0x4F53, 0x66FF, -0x568F, 0x60D5, 0x6D95, 0x5243, -0x5C49, 0x5929, 0x6DFB, 0x586B, -0x7530, 0x751C, 0x606C, 0x8214, -0x8146, 0x6311, 0x6761, 0x8FE2, -0x773A, 0x8DF3, 0x8D34, 0x94C1, -0x5E16, 0x5385, 0x542C, 0x70C3, -0x866D, 0x866F, 0x8670, 0x8672, -0x8673, 0x8674, 0x8675, 0x8676, -0x8677, 0x8678, 0x8683, 0x8684, -0x8685, 0x8686, 0x8687, 0x8688, -0x8689, 0x868E, 0x868F, 0x8690, -0x8691, 0x8692, 0x8694, 0x8696, -0x8697, 0x8698, 0x8699, 0x869A, -0x869B, 0x869E, 0x869F, 0x86A0, -0x86A1, 0x86A2, 0x86A5, 0x86A6, -0x86AB, 0x86AD, 0x86AE, 0x86B2, -0x86B3, 0x86B7, 0x86B8, 0x86B9, -0x86BB, 0x86BC, 0x86BD, 0x86BE, -0x86BF, 0x86C1, 0x86C2, 0x86C3, -0x86C5, 0x86C8, 0x86CC, 0x86CD, -0x86D2, 0x86D3, 0x86D5, 0x86D6, -0x86D7, 0x86DA, 0x86DC, 0x86DD, -0x86E0, 0x86E1, 0x86E2, 0x86E3, -0x86E5, 0x86E6, 0x86E7, 0x86E8, -0x86EA, 0x86EB, 0x86EC, 0x86EF, -0x86F5, 0x86F6, 0x86F7, 0x86FA, -0x86FB, 0x86FC, 0x86FD, 0x86FF, -0x8701, 0x8704, 0x8705, 0x8706, -0x870B, 0x870C, 0x870E, 0x870F, -0x8710, 0x8711, 0x8714, 0x8716, -0x6C40, 0x5EF7, 0x505C, 0x4EAD, -0x5EAD, 0x633A, 0x8247, 0x901A, -0x6850, 0x916E, 0x77B3, 0x540C, -0x94DC, 0x5F64, 0x7AE5, 0x6876, -0x6345, 0x7B52, 0x7EDF, 0x75DB, -0x5077, 0x6295, 0x5934, 0x900F, -0x51F8, 0x79C3, 0x7A81, 0x56FE, -0x5F92, 0x9014, 0x6D82, 0x5C60, -0x571F, 0x5410, 0x5154, 0x6E4D, -0x56E2, 0x63A8, 0x9893, 0x817F, -0x8715, 0x892A, 0x9000, 0x541E, -0x5C6F, 0x81C0, 0x62D6, 0x6258, -0x8131, 0x9E35, 0x9640, 0x9A6E, -0x9A7C, 0x692D, 0x59A5, 0x62D3, -0x553E, 0x6316, 0x54C7, 0x86D9, -0x6D3C, 0x5A03, 0x74E6, 0x889C, -0x6B6A, 0x5916, 0x8C4C, 0x5F2F, -0x6E7E, 0x73A9, 0x987D, 0x4E38, -0x70F7, 0x5B8C, 0x7897, 0x633D, -0x665A, 0x7696, 0x60CB, 0x5B9B, -0x5A49, 0x4E07, 0x8155, 0x6C6A, -0x738B, 0x4EA1, 0x6789, 0x7F51, -0x5F80, 0x65FA, 0x671B, 0x5FD8, -0x5984, 0x5A01, 0x8719, 0x871B, -0x871D, 0x871F, 0x8720, 0x8724, -0x8726, 0x8727, 0x8728, 0x872A, -0x872B, 0x872C, 0x872D, 0x872F, -0x8730, 0x8732, 0x8733, 0x8735, -0x8736, 0x8738, 0x8739, 0x873A, -0x873C, 0x873D, 0x8740, 0x8741, -0x8742, 0x8743, 0x8744, 0x8745, -0x8746, 0x874A, 0x874B, 0x874D, -0x874F, 0x8750, 0x8751, 0x8752, -0x8754, 0x8755, 0x8756, 0x8758, -0x875A, 0x875B, 0x875C, 0x875D, -0x875E, 0x875F, 0x8761, 0x8762, -0x8766, 0x8767, 0x8768, 0x8769, -0x876A, 0x876B, 0x876C, 0x876D, -0x876F, 0x8771, 0x8772, 0x8773, -0x8775, 0x8777, 0x8778, 0x8779, -0x877A, 0x877F, 0x8780, 0x8781, -0x8784, 0x8786, 0x8787, 0x8789, -0x878A, 0x878C, 0x878E, 0x878F, -0x8790, 0x8791, 0x8792, 0x8794, -0x8795, 0x8796, 0x8798, 0x8799, -0x879A, 0x879B, 0x879C, 0x879D, -0x879E, 0x87A0, 0x87A1, 0x87A2, -0x87A3, 0x87A4, 0x5DCD, 0x5FAE, -0x5371, 0x97E6, 0x8FDD, 0x6845, -0x56F4, 0x552F, 0x60DF, 0x4E3A, -0x6F4D, 0x7EF4, 0x82C7, 0x840E, -0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, -0x7EAC, 0x672A, 0x851A, 0x5473, -0x754F, 0x80C3, 0x5582, 0x9B4F, -0x4F4D, 0x6E2D, 0x8C13, 0x5C09, -0x6170, 0x536B, 0x761F, 0x6E29, -0x868A, 0x6587, 0x95FB, 0x7EB9, -0x543B, 0x7A33, 0x7D0A, 0x95EE, -0x55E1, 0x7FC1, 0x74EE, 0x631D, -0x8717, 0x6DA1, 0x7A9D, 0x6211, -0x65A1, 0x5367, 0x63E1, 0x6C83, -0x5DEB, 0x545C, 0x94A8, 0x4E4C, -0x6C61, 0x8BEC, 0x5C4B, 0x65E0, -0x829C, 0x68A7, 0x543E, 0x5434, -0x6BCB, 0x6B66, 0x4E94, 0x6342, -0x5348, 0x821E, 0x4F0D, 0x4FAE, -0x575E, 0x620A, 0x96FE, 0x6664, -0x7269, 0x52FF, 0x52A1, 0x609F, -0x8BEF, 0x6614, 0x7199, 0x6790, -0x897F, 0x7852, 0x77FD, 0x6670, -0x563B, 0x5438, 0x9521, 0x727A, -0x87A5, 0x87A6, 0x87A7, 0x87A9, -0x87AA, 0x87AE, 0x87B0, 0x87B1, -0x87B2, 0x87B4, 0x87B6, 0x87B7, -0x87B8, 0x87B9, 0x87BB, 0x87BC, -0x87BE, 0x87BF, 0x87C1, 0x87C2, -0x87C3, 0x87C4, 0x87C5, 0x87C7, -0x87C8, 0x87C9, 0x87CC, 0x87CD, -0x87CE, 0x87CF, 0x87D0, 0x87D4, -0x87D5, 0x87D6, 0x87D7, 0x87D8, -0x87D9, 0x87DA, 0x87DC, 0x87DD, -0x87DE, 0x87DF, 0x87E1, 0x87E2, -0x87E3, 0x87E4, 0x87E6, 0x87E7, -0x87E8, 0x87E9, 0x87EB, 0x87EC, -0x87ED, 0x87EF, 0x87F0, 0x87F1, -0x87F2, 0x87F3, 0x87F4, 0x87F5, -0x87F6, 0x87F7, 0x87F8, 0x87FA, -0x87FB, 0x87FC, 0x87FD, 0x87FF, -0x8800, 0x8801, 0x8802, 0x8804, -0x8805, 0x8806, 0x8807, 0x8808, -0x8809, 0x880B, 0x880C, 0x880D, -0x880E, 0x880F, 0x8810, 0x8811, -0x8812, 0x8814, 0x8817, 0x8818, -0x8819, 0x881A, 0x881C, 0x881D, -0x881E, 0x881F, 0x8820, 0x8823, -0x7A00, 0x606F, 0x5E0C, 0x6089, -0x819D, 0x5915, 0x60DC, 0x7184, -0x70EF, 0x6EAA, 0x6C50, 0x7280, -0x6A84, 0x88AD, 0x5E2D, 0x4E60, -0x5AB3, 0x559C, 0x94E3, 0x6D17, -0x7CFB, 0x9699, 0x620F, 0x7EC6, -0x778E, 0x867E, 0x5323, 0x971E, -0x8F96, 0x6687, 0x5CE1, 0x4FA0, -0x72ED, 0x4E0B, 0x53A6, 0x590F, -0x5413, 0x6380, 0x9528, 0x5148, -0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, -0x8D24, 0x8854, 0x8237, 0x95F2, -0x6D8E, 0x5F26, 0x5ACC, 0x663E, -0x9669, 0x73B0, 0x732E, 0x53BF, -0x817A, 0x9985, 0x7FA1, 0x5BAA, -0x9677, 0x9650, 0x7EBF, 0x76F8, -0x53A2, 0x9576, 0x9999, 0x7BB1, -0x8944, 0x6E58, 0x4E61, 0x7FD4, -0x7965, 0x8BE6, 0x60F3, 0x54CD, -0x4EAB, 0x9879, 0x5DF7, 0x6A61, -0x50CF, 0x5411, 0x8C61, 0x8427, -0x785D, 0x9704, 0x524A, 0x54EE, -0x56A3, 0x9500, 0x6D88, 0x5BB5, -0x6DC6, 0x6653, 0x8824, 0x8825, -0x8826, 0x8827, 0x8828, 0x8829, -0x882A, 0x882B, 0x882C, 0x882D, -0x882E, 0x882F, 0x8830, 0x8831, -0x8833, 0x8834, 0x8835, 0x8836, -0x8837, 0x8838, 0x883A, 0x883B, -0x883D, 0x883E, 0x883F, 0x8841, -0x8842, 0x8843, 0x8846, 0x8847, -0x8848, 0x8849, 0x884A, 0x884B, -0x884E, 0x884F, 0x8850, 0x8851, -0x8852, 0x8853, 0x8855, 0x8856, -0x8858, 0x885A, 0x885B, 0x885C, -0x885D, 0x885E, 0x885F, 0x8860, -0x8866, 0x8867, 0x886A, 0x886D, -0x886F, 0x8871, 0x8873, 0x8874, -0x8875, 0x8876, 0x8878, 0x8879, -0x887A, 0x887B, 0x887C, 0x8880, -0x8883, 0x8886, 0x8887, 0x8889, -0x888A, 0x888C, 0x888E, 0x888F, -0x8890, 0x8891, 0x8893, 0x8894, -0x8895, 0x8897, 0x8898, 0x8899, -0x889A, 0x889B, 0x889D, 0x889E, -0x889F, 0x88A0, 0x88A1, 0x88A3, -0x88A5, 0x88A6, 0x88A7, 0x88A8, -0x88A9, 0x88AA, 0x5C0F, 0x5B5D, -0x6821, 0x8096, 0x5578, 0x7B11, -0x6548, 0x6954, 0x4E9B, 0x6B47, -0x874E, 0x978B, 0x534F, 0x631F, -0x643A, 0x90AA, 0x659C, 0x80C1, -0x8C10, 0x5199, 0x68B0, 0x5378, -0x87F9, 0x61C8, 0x6CC4, 0x6CFB, -0x8C22, 0x5C51, 0x85AA, 0x82AF, -0x950C, 0x6B23, 0x8F9B, 0x65B0, -0x5FFB, 0x5FC3, 0x4FE1, 0x8845, -0x661F, 0x8165, 0x7329, 0x60FA, -0x5174, 0x5211, 0x578B, 0x5F62, -0x90A2, 0x884C, 0x9192, 0x5E78, -0x674F, 0x6027, 0x59D3, 0x5144, -0x51F6, 0x80F8, 0x5308, 0x6C79, -0x96C4, 0x718A, 0x4F11, 0x4FEE, -0x7F9E, 0x673D, 0x55C5, 0x9508, -0x79C0, 0x8896, 0x7EE3, 0x589F, -0x620C, 0x9700, 0x865A, 0x5618, -0x987B, 0x5F90, 0x8BB8, 0x84C4, -0x9157, 0x53D9, 0x65ED, 0x5E8F, -0x755C, 0x6064, 0x7D6E, 0x5A7F, -0x7EEA, 0x7EED, 0x8F69, 0x55A7, -0x5BA3, 0x60AC, 0x65CB, 0x7384, -0x88AC, 0x88AE, 0x88AF, 0x88B0, -0x88B2, 0x88B3, 0x88B4, 0x88B5, -0x88B6, 0x88B8, 0x88B9, 0x88BA, -0x88BB, 0x88BD, 0x88BE, 0x88BF, -0x88C0, 0x88C3, 0x88C4, 0x88C7, -0x88C8, 0x88CA, 0x88CB, 0x88CC, -0x88CD, 0x88CF, 0x88D0, 0x88D1, -0x88D3, 0x88D6, 0x88D7, 0x88DA, -0x88DB, 0x88DC, 0x88DD, 0x88DE, -0x88E0, 0x88E1, 0x88E6, 0x88E7, -0x88E9, 0x88EA, 0x88EB, 0x88EC, -0x88ED, 0x88EE, 0x88EF, 0x88F2, -0x88F5, 0x88F6, 0x88F7, 0x88FA, -0x88FB, 0x88FD, 0x88FF, 0x8900, -0x8901, 0x8903, 0x8904, 0x8905, -0x8906, 0x8907, 0x8908, 0x8909, -0x890B, 0x890C, 0x890D, 0x890E, -0x890F, 0x8911, 0x8914, 0x8915, -0x8916, 0x8917, 0x8918, 0x891C, -0x891D, 0x891E, 0x891F, 0x8920, -0x8922, 0x8923, 0x8924, 0x8926, -0x8927, 0x8928, 0x8929, 0x892C, -0x892D, 0x892E, 0x892F, 0x8931, -0x8932, 0x8933, 0x8935, 0x8937, -0x9009, 0x7663, 0x7729, 0x7EDA, -0x9774, 0x859B, 0x5B66, 0x7A74, -0x96EA, 0x8840, 0x52CB, 0x718F, -0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, -0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, -0x8BAD, 0x8BAF, 0x900A, 0x8FC5, -0x538B, 0x62BC, 0x9E26, 0x9E2D, -0x5440, 0x4E2B, 0x82BD, 0x7259, -0x869C, 0x5D16, 0x8859, 0x6DAF, -0x96C5, 0x54D1, 0x4E9A, 0x8BB6, -0x7109, 0x54BD, 0x9609, 0x70DF, -0x6DF9, 0x76D0, 0x4E25, 0x7814, -0x8712, 0x5CA9, 0x5EF6, 0x8A00, -0x989C, 0x960E, 0x708E, 0x6CBF, -0x5944, 0x63A9, 0x773C, 0x884D, -0x6F14, 0x8273, 0x5830, 0x71D5, -0x538C, 0x781A, 0x96C1, 0x5501, -0x5F66, 0x7130, 0x5BB4, 0x8C1A, -0x9A8C, 0x6B83, 0x592E, 0x9E2F, -0x79E7, 0x6768, 0x626C, 0x4F6F, -0x75A1, 0x7F8A, 0x6D0B, 0x9633, -0x6C27, 0x4EF0, 0x75D2, 0x517B, -0x6837, 0x6F3E, 0x9080, 0x8170, -0x5996, 0x7476, 0x8938, 0x8939, -0x893A, 0x893B, 0x893C, 0x893D, -0x893E, 0x893F, 0x8940, 0x8942, -0x8943, 0x8945, 0x8946, 0x8947, -0x8948, 0x8949, 0x894A, 0x894B, -0x894C, 0x894D, 0x894E, 0x894F, -0x8950, 0x8951, 0x8952, 0x8953, -0x8954, 0x8955, 0x8956, 0x8957, -0x8958, 0x8959, 0x895A, 0x895B, -0x895C, 0x895D, 0x8960, 0x8961, -0x8962, 0x8963, 0x8964, 0x8965, -0x8967, 0x8968, 0x8969, 0x896A, -0x896B, 0x896C, 0x896D, 0x896E, -0x896F, 0x8970, 0x8971, 0x8972, -0x8973, 0x8974, 0x8975, 0x8976, -0x8977, 0x8978, 0x8979, 0x897A, -0x897C, 0x897D, 0x897E, 0x8980, -0x8982, 0x8984, 0x8985, 0x8987, -0x8988, 0x8989, 0x898A, 0x898B, -0x898C, 0x898D, 0x898E, 0x898F, -0x8990, 0x8991, 0x8992, 0x8993, -0x8994, 0x8995, 0x8996, 0x8997, -0x8998, 0x8999, 0x899A, 0x899B, -0x899C, 0x899D, 0x899E, 0x899F, -0x89A0, 0x89A1, 0x6447, 0x5C27, -0x9065, 0x7A91, 0x8C23, 0x59DA, -0x54AC, 0x8200, 0x836F, 0x8981, -0x8000, 0x6930, 0x564E, 0x8036, -0x7237, 0x91CE, 0x51B6, 0x4E5F, -0x9875, 0x6396, 0x4E1A, 0x53F6, -0x66F3, 0x814B, 0x591C, 0x6DB2, -0x4E00, 0x58F9, 0x533B, 0x63D6, -0x94F1, 0x4F9D, 0x4F0A, 0x8863, -0x9890, 0x5937, 0x9057, 0x79FB, -0x4EEA, 0x80F0, 0x7591, 0x6C82, -0x5B9C, 0x59E8, 0x5F5D, 0x6905, -0x8681, 0x501A, 0x5DF2, 0x4E59, -0x77E3, 0x4EE5, 0x827A, 0x6291, -0x6613, 0x9091, 0x5C79, 0x4EBF, -0x5F79, 0x81C6, 0x9038, 0x8084, -0x75AB, 0x4EA6, 0x88D4, 0x610F, -0x6BC5, 0x5FC6, 0x4E49, 0x76CA, -0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, -0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, -0x7ECE, 0x8335, 0x836B, 0x56E0, -0x6BB7, 0x97F3, 0x9634, 0x59FB, -0x541F, 0x94F6, 0x6DEB, 0x5BC5, -0x996E, 0x5C39, 0x5F15, 0x9690, -0x89A2, 0x89A3, 0x89A4, 0x89A5, -0x89A6, 0x89A7, 0x89A8, 0x89A9, -0x89AA, 0x89AB, 0x89AC, 0x89AD, -0x89AE, 0x89AF, 0x89B0, 0x89B1, -0x89B2, 0x89B3, 0x89B4, 0x89B5, -0x89B6, 0x89B7, 0x89B8, 0x89B9, -0x89BA, 0x89BB, 0x89BC, 0x89BD, -0x89BE, 0x89BF, 0x89C0, 0x89C3, -0x89CD, 0x89D3, 0x89D4, 0x89D5, -0x89D7, 0x89D8, 0x89D9, 0x89DB, -0x89DD, 0x89DF, 0x89E0, 0x89E1, -0x89E2, 0x89E4, 0x89E7, 0x89E8, -0x89E9, 0x89EA, 0x89EC, 0x89ED, -0x89EE, 0x89F0, 0x89F1, 0x89F2, -0x89F4, 0x89F5, 0x89F6, 0x89F7, -0x89F8, 0x89F9, 0x89FA, 0x89FB, -0x89FC, 0x89FD, 0x89FE, 0x89FF, -0x8A01, 0x8A02, 0x8A03, 0x8A04, -0x8A05, 0x8A06, 0x8A08, 0x8A09, -0x8A0A, 0x8A0B, 0x8A0C, 0x8A0D, -0x8A0E, 0x8A0F, 0x8A10, 0x8A11, -0x8A12, 0x8A13, 0x8A14, 0x8A15, -0x8A16, 0x8A17, 0x8A18, 0x8A19, -0x8A1A, 0x8A1B, 0x8A1C, 0x8A1D, -0x5370, 0x82F1, 0x6A31, 0x5A74, -0x9E70, 0x5E94, 0x7F28, 0x83B9, -0x8424, 0x8425, 0x8367, 0x8747, -0x8FCE, 0x8D62, 0x76C8, 0x5F71, -0x9896, 0x786C, 0x6620, 0x54DF, -0x62E5, 0x4F63, 0x81C3, 0x75C8, -0x5EB8, 0x96CD, 0x8E0A, 0x86F9, -0x548F, 0x6CF3, 0x6D8C, 0x6C38, -0x607F, 0x52C7, 0x7528, 0x5E7D, -0x4F18, 0x60A0, 0x5FE7, 0x5C24, -0x7531, 0x90AE, 0x94C0, 0x72B9, -0x6CB9, 0x6E38, 0x9149, 0x6709, -0x53CB, 0x53F3, 0x4F51, 0x91C9, -0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, -0x6DE4, 0x4E8E, 0x76C2, 0x6986, -0x865E, 0x611A, 0x8206, 0x4F59, -0x4FDE, 0x903E, 0x9C7C, 0x6109, -0x6E1D, 0x6E14, 0x9685, 0x4E88, -0x5A31, 0x96E8, 0x4E0E, 0x5C7F, -0x79B9, 0x5B87, 0x8BED, 0x7FBD, -0x7389, 0x57DF, 0x828B, 0x90C1, -0x5401, 0x9047, 0x55BB, 0x5CEA, -0x5FA1, 0x6108, 0x6B32, 0x72F1, -0x80B2, 0x8A89, 0x8A1E, 0x8A1F, -0x8A20, 0x8A21, 0x8A22, 0x8A23, -0x8A24, 0x8A25, 0x8A26, 0x8A27, -0x8A28, 0x8A29, 0x8A2A, 0x8A2B, -0x8A2C, 0x8A2D, 0x8A2E, 0x8A2F, -0x8A30, 0x8A31, 0x8A32, 0x8A33, -0x8A34, 0x8A35, 0x8A36, 0x8A37, -0x8A38, 0x8A39, 0x8A3A, 0x8A3B, -0x8A3C, 0x8A3D, 0x8A3F, 0x8A40, -0x8A41, 0x8A42, 0x8A43, 0x8A44, -0x8A45, 0x8A46, 0x8A47, 0x8A49, -0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, -0x8A4E, 0x8A4F, 0x8A50, 0x8A51, -0x8A52, 0x8A53, 0x8A54, 0x8A55, -0x8A56, 0x8A57, 0x8A58, 0x8A59, -0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, -0x8A5E, 0x8A5F, 0x8A60, 0x8A61, -0x8A62, 0x8A63, 0x8A64, 0x8A65, -0x8A66, 0x8A67, 0x8A68, 0x8A69, -0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, -0x8A6E, 0x8A6F, 0x8A70, 0x8A71, -0x8A72, 0x8A73, 0x8A74, 0x8A75, -0x8A76, 0x8A77, 0x8A78, 0x8A7A, -0x8A7B, 0x8A7C, 0x8A7D, 0x8A7E, -0x8A7F, 0x8A80, 0x6D74, 0x5BD3, -0x88D5, 0x9884, 0x8C6B, 0x9A6D, -0x9E33, 0x6E0A, 0x51A4, 0x5143, -0x57A3, 0x8881, 0x539F, 0x63F4, -0x8F95, 0x56ED, 0x5458, 0x5706, -0x733F, 0x6E90, 0x7F18, 0x8FDC, -0x82D1, 0x613F, 0x6028, 0x9662, -0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, -0x94A5, 0x5CB3, 0x7CA4, 0x6708, -0x60A6, 0x9605, 0x8018, 0x4E91, -0x90E7, 0x5300, 0x9668, 0x5141, -0x8FD0, 0x8574, 0x915D, 0x6655, -0x97F5, 0x5B55, 0x531D, 0x7838, -0x6742, 0x683D, 0x54C9, 0x707E, -0x5BB0, 0x8F7D, 0x518D, 0x5728, -0x54B1, 0x6512, 0x6682, 0x8D5E, -0x8D43, 0x810F, 0x846C, 0x906D, -0x7CDF, 0x51FF, 0x85FB, 0x67A3, -0x65E9, 0x6FA1, 0x86A4, 0x8E81, -0x566A, 0x9020, 0x7682, 0x7076, -0x71E5, 0x8D23, 0x62E9, 0x5219, -0x6CFD, 0x8D3C, 0x600E, 0x589E, -0x618E, 0x66FE, 0x8D60, 0x624E, -0x55B3, 0x6E23, 0x672D, 0x8F67, -0x8A81, 0x8A82, 0x8A83, 0x8A84, -0x8A85, 0x8A86, 0x8A87, 0x8A88, -0x8A8B, 0x8A8C, 0x8A8D, 0x8A8E, -0x8A8F, 0x8A90, 0x8A91, 0x8A92, -0x8A94, 0x8A95, 0x8A96, 0x8A97, -0x8A98, 0x8A99, 0x8A9A, 0x8A9B, -0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, -0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3, -0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, -0x8AA8, 0x8AA9, 0x8AAA, 0x8AAB, -0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, -0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, -0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, -0x8AB8, 0x8AB9, 0x8ABA, 0x8ABB, -0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, -0x8AC0, 0x8AC1, 0x8AC2, 0x8AC3, -0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, -0x8AC8, 0x8AC9, 0x8ACA, 0x8ACB, -0x8ACC, 0x8ACD, 0x8ACE, 0x8ACF, -0x8AD0, 0x8AD1, 0x8AD2, 0x8AD3, -0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, -0x8AD8, 0x8AD9, 0x8ADA, 0x8ADB, -0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, -0x8AE0, 0x8AE1, 0x8AE2, 0x8AE3, -0x94E1, 0x95F8, 0x7728, 0x6805, -0x69A8, 0x548B, 0x4E4D, 0x70B8, -0x8BC8, 0x6458, 0x658B, 0x5B85, -0x7A84, 0x503A, 0x5BE8, 0x77BB, -0x6BE1, 0x8A79, 0x7C98, 0x6CBE, -0x76CF, 0x65A9, 0x8F97, 0x5D2D, -0x5C55, 0x8638, 0x6808, 0x5360, -0x6218, 0x7AD9, 0x6E5B, 0x7EFD, -0x6A1F, 0x7AE0, 0x5F70, 0x6F33, -0x5F20, 0x638C, 0x6DA8, 0x6756, -0x4E08, 0x5E10, 0x8D26, 0x4ED7, -0x80C0, 0x7634, 0x969C, 0x62DB, -0x662D, 0x627E, 0x6CBC, 0x8D75, -0x7167, 0x7F69, 0x5146, 0x8087, -0x53EC, 0x906E, 0x6298, 0x54F2, -0x86F0, 0x8F99, 0x8005, 0x9517, -0x8517, 0x8FD9, 0x6D59, 0x73CD, -0x659F, 0x771F, 0x7504, 0x7827, -0x81FB, 0x8D1E, 0x9488, 0x4FA6, -0x6795, 0x75B9, 0x8BCA, 0x9707, -0x632F, 0x9547, 0x9635, 0x84B8, -0x6323, 0x7741, 0x5F81, 0x72F0, -0x4E89, 0x6014, 0x6574, 0x62EF, -0x6B63, 0x653F, 0x8AE4, 0x8AE5, -0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, -0x8AEA, 0x8AEB, 0x8AEC, 0x8AED, -0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, -0x8AF2, 0x8AF3, 0x8AF4, 0x8AF5, -0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, -0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD, -0x8AFE, 0x8AFF, 0x8B00, 0x8B01, -0x8B02, 0x8B03, 0x8B04, 0x8B05, -0x8B06, 0x8B08, 0x8B09, 0x8B0A, -0x8B0B, 0x8B0C, 0x8B0D, 0x8B0E, -0x8B0F, 0x8B10, 0x8B11, 0x8B12, -0x8B13, 0x8B14, 0x8B15, 0x8B16, -0x8B17, 0x8B18, 0x8B19, 0x8B1A, -0x8B1B, 0x8B1C, 0x8B1D, 0x8B1E, -0x8B1F, 0x8B20, 0x8B21, 0x8B22, -0x8B23, 0x8B24, 0x8B25, 0x8B27, -0x8B28, 0x8B29, 0x8B2A, 0x8B2B, -0x8B2C, 0x8B2D, 0x8B2E, 0x8B2F, -0x8B30, 0x8B31, 0x8B32, 0x8B33, -0x8B34, 0x8B35, 0x8B36, 0x8B37, -0x8B38, 0x8B39, 0x8B3A, 0x8B3B, -0x8B3C, 0x8B3D, 0x8B3E, 0x8B3F, -0x8B40, 0x8B41, 0x8B42, 0x8B43, -0x8B44, 0x8B45, 0x5E27, 0x75C7, -0x90D1, 0x8BC1, 0x829D, 0x679D, -0x652F, 0x5431, 0x8718, 0x77E5, -0x80A2, 0x8102, 0x6C41, 0x4E4B, -0x7EC7, 0x804C, 0x76F4, 0x690D, -0x6B96, 0x6267, 0x503C, 0x4F84, -0x5740, 0x6307, 0x6B62, 0x8DBE, -0x53EA, 0x65E8, 0x7EB8, 0x5FD7, -0x631A, 0x63B7, 0x81F3, 0x81F4, -0x7F6E, 0x5E1C, 0x5CD9, 0x5236, -0x667A, 0x79E9, 0x7A1A, 0x8D28, -0x7099, 0x75D4, 0x6EDE, 0x6CBB, -0x7A92, 0x4E2D, 0x76C5, 0x5FE0, -0x949F, 0x8877, 0x7EC8, 0x79CD, -0x80BF, 0x91CD, 0x4EF2, 0x4F17, -0x821F, 0x5468, 0x5DDE, 0x6D32, -0x8BCC, 0x7CA5, 0x8F74, 0x8098, -0x5E1A, 0x5492, 0x76B1, 0x5B99, -0x663C, 0x9AA4, 0x73E0, 0x682A, -0x86DB, 0x6731, 0x732A, 0x8BF8, -0x8BDB, 0x9010, 0x7AF9, 0x70DB, -0x716E, 0x62C4, 0x77A9, 0x5631, -0x4E3B, 0x8457, 0x67F1, 0x52A9, -0x86C0, 0x8D2E, 0x94F8, 0x7B51, -0x8B46, 0x8B47, 0x8B48, 0x8B49, -0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D, -0x8B4E, 0x8B4F, 0x8B50, 0x8B51, -0x8B52, 0x8B53, 0x8B54, 0x8B55, -0x8B56, 0x8B57, 0x8B58, 0x8B59, -0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, -0x8B5E, 0x8B5F, 0x8B60, 0x8B61, -0x8B62, 0x8B63, 0x8B64, 0x8B65, -0x8B67, 0x8B68, 0x8B69, 0x8B6A, -0x8B6B, 0x8B6D, 0x8B6E, 0x8B6F, -0x8B70, 0x8B71, 0x8B72, 0x8B73, -0x8B74, 0x8B75, 0x8B76, 0x8B77, -0x8B78, 0x8B79, 0x8B7A, 0x8B7B, -0x8B7C, 0x8B7D, 0x8B7E, 0x8B7F, -0x8B80, 0x8B81, 0x8B82, 0x8B83, -0x8B84, 0x8B85, 0x8B86, 0x8B87, -0x8B88, 0x8B89, 0x8B8A, 0x8B8B, -0x8B8C, 0x8B8D, 0x8B8E, 0x8B8F, -0x8B90, 0x8B91, 0x8B92, 0x8B93, -0x8B94, 0x8B95, 0x8B96, 0x8B97, -0x8B98, 0x8B99, 0x8B9A, 0x8B9B, -0x8B9C, 0x8B9D, 0x8B9E, 0x8B9F, -0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, -0x8BD0, 0x8BEA, 0x8C09, 0x8C1E, -0x4F4F, 0x6CE8, 0x795D, 0x9A7B, -0x6293, 0x722A, 0x62FD, 0x4E13, -0x7816, 0x8F6C, 0x64B0, 0x8D5A, -0x7BC6, 0x6869, 0x5E84, 0x88C5, -0x5986, 0x649E, 0x58EE, 0x72B6, -0x690E, 0x9525, 0x8FFD, 0x8D58, -0x5760, 0x7F00, 0x8C06, 0x51C6, -0x6349, 0x62D9, 0x5353, 0x684C, -0x7422, 0x8301, 0x914C, 0x5544, -0x7740, 0x707C, 0x6D4A, 0x5179, -0x54A8, 0x8D44, 0x59FF, 0x6ECB, -0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, -0x7C7D, 0x6ED3, 0x5B50, 0x81EA, -0x6E0D, 0x5B57, 0x9B03, 0x68D5, -0x8E2A, 0x5B97, 0x7EFC, 0x603B, -0x7EB5, 0x90B9, 0x8D70, 0x594F, -0x63CD, 0x79DF, 0x8DB3, 0x5352, -0x65CF, 0x7956, 0x8BC5, 0x963B, -0x7EC4, 0x94BB, 0x7E82, 0x5634, -0x9189, 0x6700, 0x7F6A, 0x5C0A, -0x9075, 0x6628, 0x5DE6, 0x4F50, -0x67DE, 0x505A, 0x4F5C, 0x5750, -0x5EA7, 0xE810, 0xE811, 0xE812, -0xE813, 0xE814, 0x8C38, 0x8C39, -0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, -0x8C3E, 0x8C3F, 0x8C40, 0x8C42, -0x8C43, 0x8C44, 0x8C45, 0x8C48, -0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, -0x8C4F, 0x8C50, 0x8C51, 0x8C52, -0x8C53, 0x8C54, 0x8C56, 0x8C57, -0x8C58, 0x8C59, 0x8C5B, 0x8C5C, -0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, -0x8C63, 0x8C64, 0x8C65, 0x8C66, -0x8C67, 0x8C68, 0x8C69, 0x8C6C, -0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, -0x8C71, 0x8C72, 0x8C74, 0x8C75, -0x8C76, 0x8C77, 0x8C7B, 0x8C7C, -0x8C7D, 0x8C7E, 0x8C7F, 0x8C80, -0x8C81, 0x8C83, 0x8C84, 0x8C86, -0x8C87, 0x8C88, 0x8C8B, 0x8C8D, -0x8C8E, 0x8C8F, 0x8C90, 0x8C91, -0x8C92, 0x8C93, 0x8C95, 0x8C96, -0x8C97, 0x8C99, 0x8C9A, 0x8C9B, -0x8C9C, 0x8C9D, 0x8C9E, 0x8C9F, -0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, -0x8CA4, 0x8CA5, 0x8CA6, 0x8CA7, -0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, -0x8CAC, 0x8CAD, 0x4E8D, 0x4E0C, -0x5140, 0x4E10, 0x5EFF, 0x5345, -0x4E15, 0x4E98, 0x4E1E, 0x9B32, -0x5B6C, 0x5669, 0x4E28, 0x79BA, -0x4E3F, 0x5315, 0x4E47, 0x592D, -0x723B, 0x536E, 0x6C10, 0x56DF, -0x80E4, 0x9997, 0x6BD3, 0x777E, -0x9F17, 0x4E36, 0x4E9F, 0x9F10, -0x4E5C, 0x4E69, 0x4E93, 0x8288, -0x5B5B, 0x556C, 0x560F, 0x4EC4, -0x538D, 0x539D, 0x53A3, 0x53A5, -0x53AE, 0x9765, 0x8D5D, 0x531A, -0x53F5, 0x5326, 0x532E, 0x533E, -0x8D5C, 0x5366, 0x5363, 0x5202, -0x5208, 0x520E, 0x522D, 0x5233, -0x523F, 0x5240, 0x524C, 0x525E, -0x5261, 0x525C, 0x84AF, 0x527D, -0x5282, 0x5281, 0x5290, 0x5293, -0x5182, 0x7F54, 0x4EBB, 0x4EC3, -0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, -0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, -0x4F22, 0x4F64, 0x4EF5, 0x4F25, -0x4F27, 0x4F09, 0x4F2B, 0x4F5E, -0x4F67, 0x6538, 0x4F5A, 0x4F5D, -0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, -0x8CB2, 0x8CB3, 0x8CB4, 0x8CB5, -0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, -0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD, -0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, -0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5, -0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, -0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD, -0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, -0x8CD2, 0x8CD3, 0x8CD4, 0x8CD5, -0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, -0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD, -0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, -0x8CE2, 0x8CE3, 0x8CE4, 0x8CE5, -0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, -0x8CEA, 0x8CEB, 0x8CEC, 0x8CED, -0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, -0x8CF2, 0x8CF3, 0x8CF4, 0x8CF5, -0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, -0x8CFA, 0x8CFB, 0x8CFC, 0x8CFD, -0x8CFE, 0x8CFF, 0x8D00, 0x8D01, -0x8D02, 0x8D03, 0x8D04, 0x8D05, -0x8D06, 0x8D07, 0x8D08, 0x8D09, -0x8D0A, 0x8D0B, 0x8D0C, 0x8D0D, -0x4F5F, 0x4F57, 0x4F32, 0x4F3D, -0x4F76, 0x4F74, 0x4F91, 0x4F89, -0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, -0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, -0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, -0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, -0x4FDF, 0x4FF8, 0x5029, 0x504C, -0x4FF3, 0x502C, 0x500F, 0x502E, -0x502D, 0x4FFE, 0x501C, 0x500C, -0x5025, 0x5028, 0x507E, 0x5043, -0x5055, 0x5048, 0x504E, 0x506C, -0x507B, 0x50A5, 0x50A7, 0x50A9, -0x50BA, 0x50D6, 0x5106, 0x50ED, -0x50EC, 0x50E6, 0x50EE, 0x5107, -0x510B, 0x4EDD, 0x6C3D, 0x4F58, -0x4F65, 0x4FCE, 0x9FA0, 0x6C46, -0x7C74, 0x516E, 0x5DFD, 0x9EC9, -0x9998, 0x5181, 0x5914, 0x52F9, -0x530D, 0x8A07, 0x5310, 0x51EB, -0x5919, 0x5155, 0x4EA0, 0x5156, -0x4EB3, 0x886E, 0x88A4, 0x4EB5, -0x8114, 0x88D2, 0x7980, 0x5B34, -0x8803, 0x7FB8, 0x51AB, 0x51B1, -0x51BD, 0x51BC, 0x8D0E, 0x8D0F, -0x8D10, 0x8D11, 0x8D12, 0x8D13, -0x8D14, 0x8D15, 0x8D16, 0x8D17, -0x8D18, 0x8D19, 0x8D1A, 0x8D1B, -0x8D1C, 0x8D20, 0x8D51, 0x8D52, -0x8D57, 0x8D5F, 0x8D65, 0x8D68, -0x8D69, 0x8D6A, 0x8D6C, 0x8D6E, -0x8D6F, 0x8D71, 0x8D72, 0x8D78, -0x8D79, 0x8D7A, 0x8D7B, 0x8D7C, -0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, -0x8D82, 0x8D83, 0x8D86, 0x8D87, -0x8D88, 0x8D89, 0x8D8C, 0x8D8D, -0x8D8E, 0x8D8F, 0x8D90, 0x8D92, -0x8D93, 0x8D95, 0x8D96, 0x8D97, -0x8D98, 0x8D99, 0x8D9A, 0x8D9B, -0x8D9C, 0x8D9D, 0x8D9E, 0x8DA0, -0x8DA1, 0x8DA2, 0x8DA4, 0x8DA5, -0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, -0x8DAA, 0x8DAB, 0x8DAC, 0x8DAD, -0x8DAE, 0x8DAF, 0x8DB0, 0x8DB2, -0x8DB6, 0x8DB7, 0x8DB9, 0x8DBB, -0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, -0x8DC5, 0x8DC7, 0x8DC8, 0x8DC9, -0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, -0x8DD3, 0x8DD4, 0x51C7, 0x5196, -0x51A2, 0x51A5, 0x8BA0, 0x8BA6, -0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, -0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, -0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, -0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, -0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, -0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, -0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, -0x8BFF, 0x8C00, 0x8C02, 0x8C04, -0x8C07, 0x8C0C, 0x8C0F, 0x8C11, -0x8C12, 0x8C14, 0x8C15, 0x8C16, -0x8C19, 0x8C1B, 0x8C18, 0x8C1D, -0x8C1F, 0x8C20, 0x8C21, 0x8C25, -0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, -0x8C2F, 0x8C32, 0x8C33, 0x8C35, -0x8C36, 0x5369, 0x537A, 0x961D, -0x9622, 0x9621, 0x9631, 0x962A, -0x963D, 0x963C, 0x9642, 0x9649, -0x9654, 0x965F, 0x9667, 0x966C, -0x9672, 0x9674, 0x9688, 0x968D, -0x9697, 0x96B0, 0x9097, 0x909B, -0x909D, 0x9099, 0x90AC, 0x90A1, -0x90B4, 0x90B3, 0x90B6, 0x90BA, -0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, -0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, -0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, -0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, -0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, -0x8DFF, 0x8E00, 0x8E01, 0x8E02, -0x8E03, 0x8E04, 0x8E06, 0x8E07, -0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, -0x8E10, 0x8E11, 0x8E12, 0x8E13, -0x8E15, 0x8E16, 0x8E17, 0x8E18, -0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, -0x8E20, 0x8E21, 0x8E24, 0x8E25, -0x8E26, 0x8E27, 0x8E28, 0x8E2B, -0x8E2D, 0x8E30, 0x8E32, 0x8E33, -0x8E34, 0x8E36, 0x8E37, 0x8E38, -0x8E3B, 0x8E3C, 0x8E3E, 0x8E3F, -0x8E43, 0x8E45, 0x8E46, 0x8E4C, -0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, -0x8E53, 0x8E54, 0x8E55, 0x8E56, -0x8E57, 0x8E58, 0x8E5A, 0x8E5B, -0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, -0x8E60, 0x8E61, 0x8E62, 0x8E63, -0x8E64, 0x8E65, 0x8E67, 0x8E68, -0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, -0x90B8, 0x90B0, 0x90CF, 0x90C5, -0x90BE, 0x90D0, 0x90C4, 0x90C7, -0x90D3, 0x90E6, 0x90E2, 0x90DC, -0x90D7, 0x90DB, 0x90EB, 0x90EF, -0x90FE, 0x9104, 0x9122, 0x911E, -0x9123, 0x9131, 0x912F, 0x9139, -0x9143, 0x9146, 0x520D, 0x5942, -0x52A2, 0x52AC, 0x52AD, 0x52BE, -0x54FF, 0x52D0, 0x52D6, 0x52F0, -0x53DF, 0x71EE, 0x77CD, 0x5EF4, -0x51F5, 0x51FC, 0x9B2F, 0x53B6, -0x5F01, 0x755A, 0x5DEF, 0x574C, -0x57A9, 0x57A1, 0x587E, 0x58BC, -0x58C5, 0x58D1, 0x5729, 0x572C, -0x572A, 0x5733, 0x5739, 0x572E, -0x572F, 0x575C, 0x573B, 0x5742, -0x5769, 0x5785, 0x576B, 0x5786, -0x577C, 0x577B, 0x5768, 0x576D, -0x5776, 0x5773, 0x57AD, 0x57A4, -0x578C, 0x57B2, 0x57CF, 0x57A7, -0x57B4, 0x5793, 0x57A0, 0x57D5, -0x57D8, 0x57DA, 0x57D9, 0x57D2, -0x57B8, 0x57F4, 0x57EF, 0x57F8, -0x57E4, 0x57DD, 0x8E73, 0x8E75, -0x8E77, 0x8E78, 0x8E79, 0x8E7A, -0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, -0x8E82, 0x8E83, 0x8E84, 0x8E86, -0x8E88, 0x8E89, 0x8E8A, 0x8E8B, -0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, -0x8E92, 0x8E93, 0x8E95, 0x8E96, -0x8E97, 0x8E98, 0x8E99, 0x8E9A, -0x8E9B, 0x8E9D, 0x8E9F, 0x8EA0, -0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, -0x8EA5, 0x8EA6, 0x8EA7, 0x8EA8, -0x8EA9, 0x8EAA, 0x8EAD, 0x8EAE, -0x8EB0, 0x8EB1, 0x8EB3, 0x8EB4, -0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, -0x8EB9, 0x8EBB, 0x8EBC, 0x8EBD, -0x8EBE, 0x8EBF, 0x8EC0, 0x8EC1, -0x8EC2, 0x8EC3, 0x8EC4, 0x8EC5, -0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, -0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, -0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, -0x8ED3, 0x8ED4, 0x8ED5, 0x8ED6, -0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, -0x8EDB, 0x8EDC, 0x8EDD, 0x8EDE, -0x8EDF, 0x8EE0, 0x8EE1, 0x8EE2, -0x8EE3, 0x8EE4, 0x580B, 0x580D, -0x57FD, 0x57ED, 0x5800, 0x581E, -0x5819, 0x5844, 0x5820, 0x5865, -0x586C, 0x5881, 0x5889, 0x589A, -0x5880, 0x99A8, 0x9F19, 0x61FF, -0x8279, 0x827D, 0x827F, 0x828F, -0x828A, 0x82A8, 0x8284, 0x828E, -0x8291, 0x8297, 0x8299, 0x82AB, -0x82B8, 0x82BE, 0x82B0, 0x82C8, -0x82CA, 0x82E3, 0x8298, 0x82B7, -0x82AE, 0x82CB, 0x82CC, 0x82C1, -0x82A9, 0x82B4, 0x82A1, 0x82AA, -0x829F, 0x82C4, 0x82CE, 0x82A4, -0x82E1, 0x8309, 0x82F7, 0x82E4, -0x830F, 0x8307, 0x82DC, 0x82F4, -0x82D2, 0x82D8, 0x830C, 0x82FB, -0x82D3, 0x8311, 0x831A, 0x8306, -0x8314, 0x8315, 0x82E0, 0x82D5, -0x831C, 0x8351, 0x835B, 0x835C, -0x8308, 0x8392, 0x833C, 0x8334, -0x8331, 0x839B, 0x835E, 0x832F, -0x834F, 0x8347, 0x8343, 0x835F, -0x8340, 0x8317, 0x8360, 0x832D, -0x833A, 0x8333, 0x8366, 0x8365, -0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, -0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, -0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, -0x8EF1, 0x8EF2, 0x8EF3, 0x8EF4, -0x8EF5, 0x8EF6, 0x8EF7, 0x8EF8, -0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, -0x8EFD, 0x8EFE, 0x8EFF, 0x8F00, -0x8F01, 0x8F02, 0x8F03, 0x8F04, -0x8F05, 0x8F06, 0x8F07, 0x8F08, -0x8F09, 0x8F0A, 0x8F0B, 0x8F0C, -0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, -0x8F11, 0x8F12, 0x8F13, 0x8F14, -0x8F15, 0x8F16, 0x8F17, 0x8F18, -0x8F19, 0x8F1A, 0x8F1B, 0x8F1C, -0x8F1D, 0x8F1E, 0x8F1F, 0x8F20, -0x8F21, 0x8F22, 0x8F23, 0x8F24, -0x8F25, 0x8F26, 0x8F27, 0x8F28, -0x8F29, 0x8F2A, 0x8F2B, 0x8F2C, -0x8F2D, 0x8F2E, 0x8F2F, 0x8F30, -0x8F31, 0x8F32, 0x8F33, 0x8F34, -0x8F35, 0x8F36, 0x8F37, 0x8F38, -0x8F39, 0x8F3A, 0x8F3B, 0x8F3C, -0x8F3D, 0x8F3E, 0x8F3F, 0x8F40, -0x8F41, 0x8F42, 0x8F43, 0x8F44, -0x8368, 0x831B, 0x8369, 0x836C, -0x836A, 0x836D, 0x836E, 0x83B0, -0x8378, 0x83B3, 0x83B4, 0x83A0, -0x83AA, 0x8393, 0x839C, 0x8385, -0x837C, 0x83B6, 0x83A9, 0x837D, -0x83B8, 0x837B, 0x8398, 0x839E, -0x83A8, 0x83BA, 0x83BC, 0x83C1, -0x8401, 0x83E5, 0x83D8, 0x5807, -0x8418, 0x840B, 0x83DD, 0x83FD, -0x83D6, 0x841C, 0x8438, 0x8411, -0x8406, 0x83D4, 0x83DF, 0x840F, -0x8403, 0x83F8, 0x83F9, 0x83EA, -0x83C5, 0x83C0, 0x8426, 0x83F0, -0x83E1, 0x845C, 0x8451, 0x845A, -0x8459, 0x8473, 0x8487, 0x8488, -0x847A, 0x8489, 0x8478, 0x843C, -0x8446, 0x8469, 0x8476, 0x848C, -0x848E, 0x8431, 0x846D, 0x84C1, -0x84CD, 0x84D0, 0x84E6, 0x84BD, -0x84D3, 0x84CA, 0x84BF, 0x84BA, -0x84E0, 0x84A1, 0x84B9, 0x84B4, -0x8497, 0x84E5, 0x84E3, 0x850C, -0x750D, 0x8538, 0x84F0, 0x8539, -0x851F, 0x853A, 0x8F45, 0x8F46, -0x8F47, 0x8F48, 0x8F49, 0x8F4A, -0x8F4B, 0x8F4C, 0x8F4D, 0x8F4E, -0x8F4F, 0x8F50, 0x8F51, 0x8F52, -0x8F53, 0x8F54, 0x8F55, 0x8F56, -0x8F57, 0x8F58, 0x8F59, 0x8F5A, -0x8F5B, 0x8F5C, 0x8F5D, 0x8F5E, -0x8F5F, 0x8F60, 0x8F61, 0x8F62, -0x8F63, 0x8F64, 0x8F65, 0x8F6A, -0x8F80, 0x8F8C, 0x8F92, 0x8F9D, -0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, -0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, -0x8FAC, 0x8FAD, 0x8FAE, 0x8FAF, -0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, -0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB, -0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, -0x8FC6, 0x8FC9, 0x8FCA, 0x8FCB, -0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, -0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0, -0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, -0x8FEF, 0x8FF1, 0x8FF2, 0x8FF4, -0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, -0x8FFC, 0x8FFE, 0x8FFF, 0x9007, -0x9008, 0x900C, 0x900E, 0x9013, -0x9015, 0x9018, 0x8556, 0x853B, -0x84FF, 0x84FC, 0x8559, 0x8548, -0x8568, 0x8564, 0x855E, 0x857A, -0x77A2, 0x8543, 0x8572, 0x857B, -0x85A4, 0x85A8, 0x8587, 0x858F, -0x8579, 0x85AE, 0x859C, 0x8585, -0x85B9, 0x85B7, 0x85B0, 0x85D3, -0x85C1, 0x85DC, 0x85FF, 0x8627, -0x8605, 0x8629, 0x8616, 0x863C, -0x5EFE, 0x5F08, 0x593C, 0x5941, -0x8037, 0x5955, 0x595A, 0x5958, -0x530F, 0x5C22, 0x5C25, 0x5C2C, -0x5C34, 0x624C, 0x626A, 0x629F, -0x62BB, 0x62CA, 0x62DA, 0x62D7, -0x62EE, 0x6322, 0x62F6, 0x6339, -0x634B, 0x6343, 0x63AD, 0x63F6, -0x6371, 0x637A, 0x638E, 0x63B4, -0x636D, 0x63AC, 0x638A, 0x6369, -0x63AE, 0x63BC, 0x63F2, 0x63F8, -0x63E0, 0x63FF, 0x63C4, 0x63DE, -0x63CE, 0x6452, 0x63C6, 0x63BE, -0x6445, 0x6441, 0x640B, 0x641B, -0x6420, 0x640C, 0x6426, 0x6421, -0x645E, 0x6484, 0x646D, 0x6496, -0x9019, 0x901C, 0x9023, 0x9024, -0x9025, 0x9027, 0x9028, 0x9029, -0x902A, 0x902B, 0x902C, 0x9030, -0x9031, 0x9032, 0x9033, 0x9034, -0x9037, 0x9039, 0x903A, 0x903D, -0x903F, 0x9040, 0x9043, 0x9045, -0x9046, 0x9048, 0x9049, 0x904A, -0x904B, 0x904C, 0x904E, 0x9054, -0x9055, 0x9056, 0x9059, 0x905A, -0x905C, 0x905D, 0x905E, 0x905F, -0x9060, 0x9061, 0x9064, 0x9066, -0x9067, 0x9069, 0x906A, 0x906B, -0x906C, 0x906F, 0x9070, 0x9071, -0x9072, 0x9073, 0x9076, 0x9077, -0x9078, 0x9079, 0x907A, 0x907B, -0x907C, 0x907E, 0x9081, 0x9084, -0x9085, 0x9086, 0x9087, 0x9089, -0x908A, 0x908C, 0x908D, 0x908E, -0x908F, 0x9090, 0x9092, 0x9094, -0x9096, 0x9098, 0x909A, 0x909C, -0x909E, 0x909F, 0x90A0, 0x90A4, -0x90A5, 0x90A7, 0x90A8, 0x90A9, -0x90AB, 0x90AD, 0x90B2, 0x90B7, -0x90BC, 0x90BD, 0x90BF, 0x90C0, -0x647A, 0x64B7, 0x64B8, 0x6499, -0x64BA, 0x64C0, 0x64D0, 0x64D7, -0x64E4, 0x64E2, 0x6509, 0x6525, -0x652E, 0x5F0B, 0x5FD2, 0x7519, -0x5F11, 0x535F, 0x53F1, 0x53FD, -0x53E9, 0x53E8, 0x53FB, 0x5412, -0x5416, 0x5406, 0x544B, 0x5452, -0x5453, 0x5454, 0x5456, 0x5443, -0x5421, 0x5457, 0x5459, 0x5423, -0x5432, 0x5482, 0x5494, 0x5477, -0x5471, 0x5464, 0x549A, 0x549B, -0x5484, 0x5476, 0x5466, 0x549D, -0x54D0, 0x54AD, 0x54C2, 0x54B4, -0x54D2, 0x54A7, 0x54A6, 0x54D3, -0x54D4, 0x5472, 0x54A3, 0x54D5, -0x54BB, 0x54BF, 0x54CC, 0x54D9, -0x54DA, 0x54DC, 0x54A9, 0x54AA, -0x54A4, 0x54DD, 0x54CF, 0x54DE, -0x551B, 0x54E7, 0x5520, 0x54FD, -0x5514, 0x54F3, 0x5522, 0x5523, -0x550F, 0x5511, 0x5527, 0x552A, -0x5567, 0x558F, 0x55B5, 0x5549, -0x556D, 0x5541, 0x5555, 0x553F, -0x5550, 0x553C, 0x90C2, 0x90C3, -0x90C6, 0x90C8, 0x90C9, 0x90CB, -0x90CC, 0x90CD, 0x90D2, 0x90D4, -0x90D5, 0x90D6, 0x90D8, 0x90D9, -0x90DA, 0x90DE, 0x90DF, 0x90E0, -0x90E3, 0x90E4, 0x90E5, 0x90E9, -0x90EA, 0x90EC, 0x90EE, 0x90F0, -0x90F1, 0x90F2, 0x90F3, 0x90F5, -0x90F6, 0x90F7, 0x90F9, 0x90FA, -0x90FB, 0x90FC, 0x90FF, 0x9100, -0x9101, 0x9103, 0x9105, 0x9106, -0x9107, 0x9108, 0x9109, 0x910A, -0x910B, 0x910C, 0x910D, 0x910E, -0x910F, 0x9110, 0x9111, 0x9112, -0x9113, 0x9114, 0x9115, 0x9116, -0x9117, 0x9118, 0x911A, 0x911B, -0x911C, 0x911D, 0x911F, 0x9120, -0x9121, 0x9124, 0x9125, 0x9126, -0x9127, 0x9128, 0x9129, 0x912A, -0x912B, 0x912C, 0x912D, 0x912E, -0x9130, 0x9132, 0x9133, 0x9134, -0x9135, 0x9136, 0x9137, 0x9138, -0x913A, 0x913B, 0x913C, 0x913D, -0x913E, 0x913F, 0x9140, 0x9141, -0x9142, 0x9144, 0x5537, 0x5556, -0x5575, 0x5576, 0x5577, 0x5533, -0x5530, 0x555C, 0x558B, 0x55D2, -0x5583, 0x55B1, 0x55B9, 0x5588, -0x5581, 0x559F, 0x557E, 0x55D6, -0x5591, 0x557B, 0x55DF, 0x55BD, -0x55BE, 0x5594, 0x5599, 0x55EA, -0x55F7, 0x55C9, 0x561F, 0x55D1, -0x55EB, 0x55EC, 0x55D4, 0x55E6, -0x55DD, 0x55C4, 0x55EF, 0x55E5, -0x55F2, 0x55F3, 0x55CC, 0x55CD, -0x55E8, 0x55F5, 0x55E4, 0x8F94, -0x561E, 0x5608, 0x560C, 0x5601, -0x5624, 0x5623, 0x55FE, 0x5600, -0x5627, 0x562D, 0x5658, 0x5639, -0x5657, 0x562C, 0x564D, 0x5662, -0x5659, 0x565C, 0x564C, 0x5654, -0x5686, 0x5664, 0x5671, 0x566B, -0x567B, 0x567C, 0x5685, 0x5693, -0x56AF, 0x56D4, 0x56D7, 0x56DD, -0x56E1, 0x56F5, 0x56EB, 0x56F9, -0x56FF, 0x5704, 0x570A, 0x5709, -0x571C, 0x5E0F, 0x5E19, 0x5E14, -0x5E11, 0x5E31, 0x5E3B, 0x5E3C, -0x9145, 0x9147, 0x9148, 0x9151, -0x9153, 0x9154, 0x9155, 0x9156, -0x9158, 0x9159, 0x915B, 0x915C, -0x915F, 0x9160, 0x9166, 0x9167, -0x9168, 0x916B, 0x916D, 0x9173, -0x917A, 0x917B, 0x917C, 0x9180, -0x9181, 0x9182, 0x9183, 0x9184, -0x9186, 0x9188, 0x918A, 0x918E, -0x918F, 0x9193, 0x9194, 0x9195, -0x9196, 0x9197, 0x9198, 0x9199, -0x919C, 0x919D, 0x919E, 0x919F, -0x91A0, 0x91A1, 0x91A4, 0x91A5, -0x91A6, 0x91A7, 0x91A8, 0x91A9, -0x91AB, 0x91AC, 0x91B0, 0x91B1, -0x91B2, 0x91B3, 0x91B6, 0x91B7, -0x91B8, 0x91B9, 0x91BB, 0x91BC, -0x91BD, 0x91BE, 0x91BF, 0x91C0, -0x91C1, 0x91C2, 0x91C3, 0x91C4, -0x91C5, 0x91C6, 0x91C8, 0x91CB, -0x91D0, 0x91D2, 0x91D3, 0x91D4, -0x91D5, 0x91D6, 0x91D7, 0x91D8, -0x91D9, 0x91DA, 0x91DB, 0x91DD, -0x91DE, 0x91DF, 0x91E0, 0x91E1, -0x91E2, 0x91E3, 0x91E4, 0x91E5, -0x5E37, 0x5E44, 0x5E54, 0x5E5B, -0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, -0x5C8D, 0x5C90, 0x5C96, 0x5C88, -0x5C98, 0x5C99, 0x5C91, 0x5C9A, -0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, -0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, -0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, -0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, -0x5D03, 0x5D27, 0x5D26, 0x5D2E, -0x5D24, 0x5D1E, 0x5D06, 0x5D1B, -0x5D58, 0x5D3E, 0x5D34, 0x5D3D, -0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, -0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, -0x5D74, 0x5D82, 0x5D99, 0x5D9D, -0x8C73, 0x5DB7, 0x5DC5, 0x5F73, -0x5F77, 0x5F82, 0x5F87, 0x5F89, -0x5F8C, 0x5F95, 0x5F99, 0x5F9C, -0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, -0x8862, 0x5F61, 0x72AD, 0x72B0, -0x72B4, 0x72B7, 0x72B8, 0x72C3, -0x72C1, 0x72CE, 0x72CD, 0x72D2, -0x72E8, 0x72EF, 0x72E9, 0x72F2, -0x72F4, 0x72F7, 0x7301, 0x72F3, -0x7303, 0x72FA, 0x91E6, 0x91E7, -0x91E8, 0x91E9, 0x91EA, 0x91EB, -0x91EC, 0x91ED, 0x91EE, 0x91EF, -0x91F0, 0x91F1, 0x91F2, 0x91F3, -0x91F4, 0x91F5, 0x91F6, 0x91F7, -0x91F8, 0x91F9, 0x91FA, 0x91FB, -0x91FC, 0x91FD, 0x91FE, 0x91FF, -0x9200, 0x9201, 0x9202, 0x9203, -0x9204, 0x9205, 0x9206, 0x9207, -0x9208, 0x9209, 0x920A, 0x920B, -0x920C, 0x920D, 0x920E, 0x920F, -0x9210, 0x9211, 0x9212, 0x9213, -0x9214, 0x9215, 0x9216, 0x9217, -0x9218, 0x9219, 0x921A, 0x921B, -0x921C, 0x921D, 0x921E, 0x921F, -0x9220, 0x9221, 0x9222, 0x9223, -0x9224, 0x9225, 0x9226, 0x9227, -0x9228, 0x9229, 0x922A, 0x922B, -0x922C, 0x922D, 0x922E, 0x922F, -0x9230, 0x9231, 0x9232, 0x9233, -0x9234, 0x9235, 0x9236, 0x9237, -0x9238, 0x9239, 0x923A, 0x923B, -0x923C, 0x923D, 0x923E, 0x923F, -0x9240, 0x9241, 0x9242, 0x9243, -0x9244, 0x9245, 0x72FB, 0x7317, -0x7313, 0x7321, 0x730A, 0x731E, -0x731D, 0x7315, 0x7322, 0x7339, -0x7325, 0x732C, 0x7338, 0x7331, -0x7350, 0x734D, 0x7357, 0x7360, -0x736C, 0x736F, 0x737E, 0x821B, -0x5925, 0x98E7, 0x5924, 0x5902, -0x9963, 0x9967, 0x9968, 0x9969, -0x996A, 0x996B, 0x996C, 0x9974, -0x9977, 0x997D, 0x9980, 0x9984, -0x9987, 0x998A, 0x998D, 0x9990, -0x9991, 0x9993, 0x9994, 0x9995, -0x5E80, 0x5E91, 0x5E8B, 0x5E96, -0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, -0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, -0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, -0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, -0x5FCF, 0x6003, 0x5FEE, 0x6004, -0x5FE1, 0x5FE4, 0x5FFE, 0x6005, -0x6006, 0x5FEA, 0x5FED, 0x5FF8, -0x6019, 0x6035, 0x6026, 0x601B, -0x600F, 0x600D, 0x6029, 0x602B, -0x600A, 0x603F, 0x6021, 0x6078, -0x6079, 0x607B, 0x607A, 0x6042, -0x9246, 0x9247, 0x9248, 0x9249, -0x924A, 0x924B, 0x924C, 0x924D, -0x924E, 0x924F, 0x9250, 0x9251, -0x9252, 0x9253, 0x9254, 0x9255, -0x9256, 0x9257, 0x9258, 0x9259, -0x925A, 0x925B, 0x925C, 0x925D, -0x925E, 0x925F, 0x9260, 0x9261, -0x9262, 0x9263, 0x9264, 0x9265, -0x9266, 0x9267, 0x9268, 0x9269, -0x926A, 0x926B, 0x926C, 0x926D, -0x926E, 0x926F, 0x9270, 0x9271, -0x9272, 0x9273, 0x9275, 0x9276, -0x9277, 0x9278, 0x9279, 0x927A, -0x927B, 0x927C, 0x927D, 0x927E, -0x927F, 0x9280, 0x9281, 0x9282, -0x9283, 0x9284, 0x9285, 0x9286, -0x9287, 0x9288, 0x9289, 0x928A, -0x928B, 0x928C, 0x928D, 0x928F, -0x9290, 0x9291, 0x9292, 0x9293, -0x9294, 0x9295, 0x9296, 0x9297, -0x9298, 0x9299, 0x929A, 0x929B, -0x929C, 0x929D, 0x929E, 0x929F, -0x92A0, 0x92A1, 0x92A2, 0x92A3, -0x92A4, 0x92A5, 0x92A6, 0x92A7, -0x606A, 0x607D, 0x6096, 0x609A, -0x60AD, 0x609D, 0x6083, 0x6092, -0x608C, 0x609B, 0x60EC, 0x60BB, -0x60B1, 0x60DD, 0x60D8, 0x60C6, -0x60DA, 0x60B4, 0x6120, 0x6126, -0x6115, 0x6123, 0x60F4, 0x6100, -0x610E, 0x612B, 0x614A, 0x6175, -0x61AC, 0x6194, 0x61A7, 0x61B7, -0x61D4, 0x61F5, 0x5FDD, 0x96B3, -0x95E9, 0x95EB, 0x95F1, 0x95F3, -0x95F5, 0x95F6, 0x95FC, 0x95FE, -0x9603, 0x9604, 0x9606, 0x9608, -0x960A, 0x960B, 0x960C, 0x960D, -0x960F, 0x9612, 0x9615, 0x9616, -0x9617, 0x9619, 0x961A, 0x4E2C, -0x723F, 0x6215, 0x6C35, 0x6C54, -0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, -0x6C90, 0x6C94, 0x6C8C, 0x6C68, -0x6C69, 0x6C74, 0x6C76, 0x6C86, -0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, -0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, -0x6CB2, 0x6CE0, 0x6CD6, 0x6CFA, -0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, -0x6CEF, 0x6CFE, 0x92A8, 0x92A9, -0x92AA, 0x92AB, 0x92AC, 0x92AD, -0x92AF, 0x92B0, 0x92B1, 0x92B2, -0x92B3, 0x92B4, 0x92B5, 0x92B6, -0x92B7, 0x92B8, 0x92B9, 0x92BA, -0x92BB, 0x92BC, 0x92BD, 0x92BE, -0x92BF, 0x92C0, 0x92C1, 0x92C2, -0x92C3, 0x92C4, 0x92C5, 0x92C6, -0x92C7, 0x92C9, 0x92CA, 0x92CB, -0x92CC, 0x92CD, 0x92CE, 0x92CF, -0x92D0, 0x92D1, 0x92D2, 0x92D3, -0x92D4, 0x92D5, 0x92D6, 0x92D7, -0x92D8, 0x92D9, 0x92DA, 0x92DB, -0x92DC, 0x92DD, 0x92DE, 0x92DF, -0x92E0, 0x92E1, 0x92E2, 0x92E3, -0x92E4, 0x92E5, 0x92E6, 0x92E7, -0x92E8, 0x92E9, 0x92EA, 0x92EB, -0x92EC, 0x92ED, 0x92EE, 0x92EF, -0x92F0, 0x92F1, 0x92F2, 0x92F3, -0x92F4, 0x92F5, 0x92F6, 0x92F7, -0x92F8, 0x92F9, 0x92FA, 0x92FB, -0x92FC, 0x92FD, 0x92FE, 0x92FF, -0x9300, 0x9301, 0x9302, 0x9303, -0x9304, 0x9305, 0x9306, 0x9307, -0x9308, 0x9309, 0x6D39, 0x6D27, -0x6D0C, 0x6D43, 0x6D48, 0x6D07, -0x6D04, 0x6D19, 0x6D0E, 0x6D2B, -0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, -0x6D4F, 0x6D52, 0x6D54, 0x6D33, -0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, -0x6D5E, 0x6D93, 0x6D94, 0x6D5C, -0x6D60, 0x6D7C, 0x6D63, 0x6E1A, -0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, -0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, -0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, -0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, -0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, -0x6E86, 0x6E53, 0x6E54, 0x6E32, -0x6E25, 0x6E44, 0x6EDF, 0x6EB1, -0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, -0x6EA5, 0x6EA7, 0x6EBD, 0x6EBB, -0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, -0x6E8F, 0x6EC2, 0x6E9F, 0x6F62, -0x6F46, 0x6F47, 0x6F24, 0x6F15, -0x6EF9, 0x6F2F, 0x6F36, 0x6F4B, -0x6F74, 0x6F2A, 0x6F09, 0x6F29, -0x6F89, 0x6F8D, 0x6F8C, 0x6F78, -0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, -0x930A, 0x930B, 0x930C, 0x930D, -0x930E, 0x930F, 0x9310, 0x9311, -0x9312, 0x9313, 0x9314, 0x9315, -0x9316, 0x9317, 0x9318, 0x9319, -0x931A, 0x931B, 0x931C, 0x931D, -0x931E, 0x931F, 0x9320, 0x9321, -0x9322, 0x9323, 0x9324, 0x9325, -0x9326, 0x9327, 0x9328, 0x9329, -0x932A, 0x932B, 0x932C, 0x932D, -0x932E, 0x932F, 0x9330, 0x9331, -0x9332, 0x9333, 0x9334, 0x9335, -0x9336, 0x9337, 0x9338, 0x9339, -0x933A, 0x933B, 0x933C, 0x933D, -0x933F, 0x9340, 0x9341, 0x9342, -0x9343, 0x9344, 0x9345, 0x9346, -0x9347, 0x9348, 0x9349, 0x934A, -0x934B, 0x934C, 0x934D, 0x934E, -0x934F, 0x9350, 0x9351, 0x9352, -0x9353, 0x9354, 0x9355, 0x9356, -0x9357, 0x9358, 0x9359, 0x935A, -0x935B, 0x935C, 0x935D, 0x935E, -0x935F, 0x9360, 0x9361, 0x9362, -0x9363, 0x9364, 0x9365, 0x9366, -0x9367, 0x9368, 0x9369, 0x936B, -0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, -0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, -0x6FE0, 0x6FEF, 0x701A, 0x7023, -0x701B, 0x7039, 0x7035, 0x704F, -0x705E, 0x5B80, 0x5B84, 0x5B95, -0x5B93, 0x5BA5, 0x5BB8, 0x752F, -0x9A9E, 0x6434, 0x5BE4, 0x5BEE, -0x8930, 0x5BF0, 0x8E47, 0x8B07, -0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, -0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, -0x8FF3, 0x8FE8, 0x9005, 0x9004, -0x900B, 0x9026, 0x9011, 0x900D, -0x9016, 0x9021, 0x9035, 0x9036, -0x902D, 0x902F, 0x9044, 0x9051, -0x9052, 0x9050, 0x9068, 0x9058, -0x9062, 0x905B, 0x66B9, 0x9074, -0x907D, 0x9082, 0x9088, 0x9083, -0x908B, 0x5F50, 0x5F57, 0x5F56, -0x5F58, 0x5C3B, 0x54AB, 0x5C50, -0x5C59, 0x5B71, 0x5C63, 0x5C66, -0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, -0x8274, 0x5F3C, 0x9B3B, 0x5C6E, -0x5981, 0x5983, 0x598D, 0x59A9, -0x59AA, 0x59A3, 0x936C, 0x936D, -0x936E, 0x936F, 0x9370, 0x9371, -0x9372, 0x9373, 0x9374, 0x9375, -0x9376, 0x9377, 0x9378, 0x9379, -0x937A, 0x937B, 0x937C, 0x937D, -0x937E, 0x937F, 0x9380, 0x9381, -0x9382, 0x9383, 0x9384, 0x9385, -0x9386, 0x9387, 0x9388, 0x9389, -0x938A, 0x938B, 0x938C, 0x938D, -0x938E, 0x9390, 0x9391, 0x9392, -0x9393, 0x9394, 0x9395, 0x9396, -0x9397, 0x9398, 0x9399, 0x939A, -0x939B, 0x939C, 0x939D, 0x939E, -0x939F, 0x93A0, 0x93A1, 0x93A2, -0x93A3, 0x93A4, 0x93A5, 0x93A6, -0x93A7, 0x93A8, 0x93A9, 0x93AA, -0x93AB, 0x93AC, 0x93AD, 0x93AE, -0x93AF, 0x93B0, 0x93B1, 0x93B2, -0x93B3, 0x93B4, 0x93B5, 0x93B6, -0x93B7, 0x93B8, 0x93B9, 0x93BA, -0x93BB, 0x93BC, 0x93BD, 0x93BE, -0x93BF, 0x93C0, 0x93C1, 0x93C2, -0x93C3, 0x93C4, 0x93C5, 0x93C6, -0x93C7, 0x93C8, 0x93C9, 0x93CB, -0x93CC, 0x93CD, 0x5997, 0x59CA, -0x59AB, 0x599E, 0x59A4, 0x59D2, -0x59B2, 0x59AF, 0x59D7, 0x59BE, -0x5A05, 0x5A06, 0x59DD, 0x5A08, -0x59E3, 0x59D8, 0x59F9, 0x5A0C, -0x5A09, 0x5A32, 0x5A34, 0x5A11, -0x5A23, 0x5A13, 0x5A40, 0x5A67, -0x5A4A, 0x5A55, 0x5A3C, 0x5A62, -0x5A75, 0x80EC, 0x5AAA, 0x5A9B, -0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, -0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, -0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, -0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, -0x5B17, 0x5B16, 0x5B32, 0x5B37, -0x5B40, 0x5C15, 0x5C1C, 0x5B5A, -0x5B65, 0x5B73, 0x5B51, 0x5B53, -0x5B62, 0x9A75, 0x9A77, 0x9A78, -0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, -0x9A81, 0x9A85, 0x9A88, 0x9A8A, -0x9A90, 0x9A92, 0x9A93, 0x9A96, -0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, -0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, -0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, -0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, -0x93CE, 0x93CF, 0x93D0, 0x93D1, -0x93D2, 0x93D3, 0x93D4, 0x93D5, -0x93D7, 0x93D8, 0x93D9, 0x93DA, -0x93DB, 0x93DC, 0x93DD, 0x93DE, -0x93DF, 0x93E0, 0x93E1, 0x93E2, -0x93E3, 0x93E4, 0x93E5, 0x93E6, -0x93E7, 0x93E8, 0x93E9, 0x93EA, -0x93EB, 0x93EC, 0x93ED, 0x93EE, -0x93EF, 0x93F0, 0x93F1, 0x93F2, -0x93F3, 0x93F4, 0x93F5, 0x93F6, -0x93F7, 0x93F8, 0x93F9, 0x93FA, -0x93FB, 0x93FC, 0x93FD, 0x93FE, -0x93FF, 0x9400, 0x9401, 0x9402, -0x9403, 0x9404, 0x9405, 0x9406, -0x9407, 0x9408, 0x9409, 0x940A, -0x940B, 0x940C, 0x940D, 0x940E, -0x940F, 0x9410, 0x9411, 0x9412, -0x9413, 0x9414, 0x9415, 0x9416, -0x9417, 0x9418, 0x9419, 0x941A, -0x941B, 0x941C, 0x941D, 0x941E, -0x941F, 0x9420, 0x9421, 0x9422, -0x9423, 0x9424, 0x9425, 0x9426, -0x9427, 0x9428, 0x9429, 0x942A, -0x942B, 0x942C, 0x942D, 0x942E, -0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, -0x7EC1, 0x7EC2, 0x7EC9, 0x7ECB, -0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, -0x7EDB, 0x7EE0, 0x7EE1, 0x7EE8, -0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, -0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, -0x7EFB, 0x7EFE, 0x7F01, 0x7F02, -0x7F03, 0x7F07, 0x7F08, 0x7F0B, -0x7F0C, 0x7F0F, 0x7F11, 0x7F12, -0x7F17, 0x7F19, 0x7F1C, 0x7F1B, -0x7F1F, 0x7F21, 0x7F22, 0x7F23, -0x7F24, 0x7F25, 0x7F26, 0x7F27, -0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, -0x7F2F, 0x7F30, 0x7F31, 0x7F32, -0x7F33, 0x7F35, 0x5E7A, 0x757F, -0x5DDB, 0x753E, 0x9095, 0x738E, -0x7391, 0x73AE, 0x73A2, 0x739F, -0x73CF, 0x73C2, 0x73D1, 0x73B7, -0x73B3, 0x73C0, 0x73C9, 0x73C8, -0x73E5, 0x73D9, 0x987C, 0x740A, -0x73E9, 0x73E7, 0x73DE, 0x73BA, -0x73F2, 0x740F, 0x742A, 0x745B, -0x7426, 0x7425, 0x7428, 0x7430, -0x742E, 0x742C, 0x942F, 0x9430, -0x9431, 0x9432, 0x9433, 0x9434, -0x9435, 0x9436, 0x9437, 0x9438, -0x9439, 0x943A, 0x943B, 0x943C, -0x943D, 0x943F, 0x9440, 0x9441, -0x9442, 0x9443, 0x9444, 0x9445, -0x9446, 0x9447, 0x9448, 0x9449, -0x944A, 0x944B, 0x944C, 0x944D, -0x944E, 0x944F, 0x9450, 0x9451, -0x9452, 0x9453, 0x9454, 0x9455, -0x9456, 0x9457, 0x9458, 0x9459, -0x945A, 0x945B, 0x945C, 0x945D, -0x945E, 0x945F, 0x9460, 0x9461, -0x9462, 0x9463, 0x9464, 0x9465, -0x9466, 0x9467, 0x9468, 0x9469, -0x946A, 0x946C, 0x946D, 0x946E, -0x946F, 0x9470, 0x9471, 0x9472, -0x9473, 0x9474, 0x9475, 0x9476, -0x9477, 0x9478, 0x9479, 0x947A, -0x947B, 0x947C, 0x947D, 0x947E, -0x947F, 0x9480, 0x9481, 0x9482, -0x9483, 0x9484, 0x9491, 0x9496, -0x9498, 0x94C7, 0x94CF, 0x94D3, -0x94D4, 0x94DA, 0x94E6, 0x94FB, -0x951C, 0x9520, 0x741B, 0x741A, -0x7441, 0x745C, 0x7457, 0x7455, -0x7459, 0x7477, 0x746D, 0x747E, -0x749C, 0x748E, 0x7480, 0x7481, -0x7487, 0x748B, 0x749E, 0x74A8, -0x74A9, 0x7490, 0x74A7, 0x74D2, -0x74BA, 0x97EA, 0x97EB, 0x97EC, -0x674C, 0x6753, 0x675E, 0x6748, -0x6769, 0x67A5, 0x6787, 0x676A, -0x6773, 0x6798, 0x67A7, 0x6775, -0x67A8, 0x679E, 0x67AD, 0x678B, -0x6777, 0x677C, 0x67F0, 0x6809, -0x67D8, 0x680A, 0x67E9, 0x67B0, -0x680C, 0x67D9, 0x67B5, 0x67DA, -0x67B3, 0x67DD, 0x6800, 0x67C3, -0x67B8, 0x67E2, 0x680E, 0x67C1, -0x67FD, 0x6832, 0x6833, 0x6860, -0x6861, 0x684E, 0x6862, 0x6844, -0x6864, 0x6883, 0x681D, 0x6855, -0x6866, 0x6841, 0x6867, 0x6840, -0x683E, 0x684A, 0x6849, 0x6829, -0x68B5, 0x688F, 0x6874, 0x6877, -0x6893, 0x686B, 0x68C2, 0x696E, -0x68FC, 0x691F, 0x6920, 0x68F9, -0x9527, 0x9533, 0x953D, 0x9543, -0x9548, 0x954B, 0x9555, 0x955A, -0x9560, 0x956E, 0x9574, 0x9575, -0x9577, 0x9578, 0x9579, 0x957A, -0x957B, 0x957C, 0x957D, 0x957E, -0x9580, 0x9581, 0x9582, 0x9583, -0x9584, 0x9585, 0x9586, 0x9587, -0x9588, 0x9589, 0x958A, 0x958B, -0x958C, 0x958D, 0x958E, 0x958F, -0x9590, 0x9591, 0x9592, 0x9593, -0x9594, 0x9595, 0x9596, 0x9597, -0x9598, 0x9599, 0x959A, 0x959B, -0x959C, 0x959D, 0x959E, 0x959F, -0x95A0, 0x95A1, 0x95A2, 0x95A3, -0x95A4, 0x95A5, 0x95A6, 0x95A7, -0x95A8, 0x95A9, 0x95AA, 0x95AB, -0x95AC, 0x95AD, 0x95AE, 0x95AF, -0x95B0, 0x95B1, 0x95B2, 0x95B3, -0x95B4, 0x95B5, 0x95B6, 0x95B7, -0x95B8, 0x95B9, 0x95BA, 0x95BB, -0x95BC, 0x95BD, 0x95BE, 0x95BF, -0x95C0, 0x95C1, 0x95C2, 0x95C3, -0x95C4, 0x95C5, 0x95C6, 0x95C7, -0x95C8, 0x95C9, 0x95CA, 0x95CB, -0x6924, 0x68F0, 0x690B, 0x6901, -0x6957, 0x68E3, 0x6910, 0x6971, -0x6939, 0x6960, 0x6942, 0x695D, -0x6984, 0x696B, 0x6980, 0x6998, -0x6978, 0x6934, 0x69CC, 0x6987, -0x6988, 0x69CE, 0x6989, 0x6966, -0x6963, 0x6979, 0x699B, 0x69A7, -0x69BB, 0x69AB, 0x69AD, 0x69D4, -0x69B1, 0x69C1, 0x69CA, 0x69DF, -0x6995, 0x69E0, 0x698D, 0x69FF, -0x6A2F, 0x69ED, 0x6A17, 0x6A18, -0x6A65, 0x69F2, 0x6A44, 0x6A3E, -0x6AA0, 0x6A50, 0x6A5B, 0x6A35, -0x6A8E, 0x6A79, 0x6A3D, 0x6A28, -0x6A58, 0x6A7C, 0x6A91, 0x6A90, -0x6AA9, 0x6A97, 0x6AAB, 0x7337, -0x7352, 0x6B81, 0x6B82, 0x6B87, -0x6B84, 0x6B92, 0x6B93, 0x6B8D, -0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, -0x8F6B, 0x8F6D, 0x8F71, 0x8F72, -0x8F73, 0x8F75, 0x8F76, 0x8F78, -0x8F77, 0x8F79, 0x8F7A, 0x8F7C, -0x8F7E, 0x8F81, 0x8F82, 0x8F84, -0x8F87, 0x8F8B, 0x95CC, 0x95CD, -0x95CE, 0x95CF, 0x95D0, 0x95D1, -0x95D2, 0x95D3, 0x95D4, 0x95D5, -0x95D6, 0x95D7, 0x95D8, 0x95D9, -0x95DA, 0x95DB, 0x95DC, 0x95DD, -0x95DE, 0x95DF, 0x95E0, 0x95E1, -0x95E2, 0x95E3, 0x95E4, 0x95E5, -0x95E6, 0x95E7, 0x95EC, 0x95FF, -0x9607, 0x9613, 0x9618, 0x961B, -0x961E, 0x9620, 0x9623, 0x9624, -0x9625, 0x9626, 0x9627, 0x9628, -0x9629, 0x962B, 0x962C, 0x962D, -0x962F, 0x9630, 0x9637, 0x9638, -0x9639, 0x963A, 0x963E, 0x9641, -0x9643, 0x964A, 0x964E, 0x964F, -0x9651, 0x9652, 0x9653, 0x9656, -0x9657, 0x9658, 0x9659, 0x965A, -0x965C, 0x965D, 0x965E, 0x9660, -0x9663, 0x9665, 0x9666, 0x966B, -0x966D, 0x966E, 0x966F, 0x9670, -0x9671, 0x9673, 0x9678, 0x9679, -0x967A, 0x967B, 0x967C, 0x967D, -0x967E, 0x967F, 0x9680, 0x9681, -0x9682, 0x9683, 0x9684, 0x9687, -0x9689, 0x968A, 0x8F8D, 0x8F8E, -0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, -0x620B, 0x6217, 0x621B, 0x621F, -0x6222, 0x6221, 0x6225, 0x6224, -0x622C, 0x81E7, 0x74EF, 0x74F4, -0x74FF, 0x750F, 0x7511, 0x7513, -0x6534, 0x65EE, 0x65EF, 0x65F0, -0x660A, 0x6619, 0x6772, 0x6603, -0x6615, 0x6600, 0x7085, 0x66F7, -0x661D, 0x6634, 0x6631, 0x6636, -0x6635, 0x8006, 0x665F, 0x6654, -0x6641, 0x664F, 0x6656, 0x6661, -0x6657, 0x6677, 0x6684, 0x668C, -0x66A7, 0x669D, 0x66BE, 0x66DB, -0x66DC, 0x66E6, 0x66E9, 0x8D32, -0x8D33, 0x8D36, 0x8D3B, 0x8D3D, -0x8D40, 0x8D45, 0x8D46, 0x8D48, -0x8D49, 0x8D47, 0x8D4D, 0x8D55, -0x8D59, 0x89C7, 0x89CA, 0x89CB, -0x89CC, 0x89CE, 0x89CF, 0x89D0, -0x89D1, 0x726E, 0x729F, 0x725D, -0x7266, 0x726F, 0x727E, 0x727F, -0x7284, 0x728B, 0x728D, 0x728F, -0x7292, 0x6308, 0x6332, 0x63B0, -0x968C, 0x968E, 0x9691, 0x9692, -0x9693, 0x9695, 0x9696, 0x969A, -0x969B, 0x969D, 0x969E, 0x969F, -0x96A0, 0x96A1, 0x96A2, 0x96A3, -0x96A4, 0x96A5, 0x96A6, 0x96A8, -0x96A9, 0x96AA, 0x96AB, 0x96AC, -0x96AD, 0x96AE, 0x96AF, 0x96B1, -0x96B2, 0x96B4, 0x96B5, 0x96B7, -0x96B8, 0x96BA, 0x96BB, 0x96BF, -0x96C2, 0x96C3, 0x96C8, 0x96CA, -0x96CB, 0x96D0, 0x96D1, 0x96D3, -0x96D4, 0x96D6, 0x96D7, 0x96D8, -0x96D9, 0x96DA, 0x96DB, 0x96DC, -0x96DD, 0x96DE, 0x96DF, 0x96E1, -0x96E2, 0x96E3, 0x96E4, 0x96E5, -0x96E6, 0x96E7, 0x96EB, 0x96EC, -0x96ED, 0x96EE, 0x96F0, 0x96F1, -0x96F2, 0x96F4, 0x96F5, 0x96F8, -0x96FA, 0x96FB, 0x96FC, 0x96FD, -0x96FF, 0x9702, 0x9703, 0x9705, -0x970A, 0x970B, 0x970C, 0x9710, -0x9711, 0x9712, 0x9714, 0x9715, -0x9717, 0x9718, 0x9719, 0x971A, -0x971B, 0x971D, 0x971F, 0x9720, -0x643F, 0x64D8, 0x8004, 0x6BEA, -0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, -0x6C05, 0x6C07, 0x6C06, 0x6C0D, -0x6C15, 0x6C18, 0x6C19, 0x6C1A, -0x6C21, 0x6C29, 0x6C24, 0x6C2A, -0x6C32, 0x6535, 0x6555, 0x656B, -0x724D, 0x7252, 0x7256, 0x7230, -0x8662, 0x5216, 0x809F, 0x809C, -0x8093, 0x80BC, 0x670A, 0x80BD, -0x80B1, 0x80AB, 0x80AD, 0x80B4, -0x80B7, 0x80E7, 0x80E8, 0x80E9, -0x80EA, 0x80DB, 0x80C2, 0x80C4, -0x80D9, 0x80CD, 0x80D7, 0x6710, -0x80DD, 0x80EB, 0x80F1, 0x80F4, -0x80ED, 0x810D, 0x810E, 0x80F2, -0x80FC, 0x6715, 0x8112, 0x8C5A, -0x8136, 0x811E, 0x812C, 0x8118, -0x8132, 0x8148, 0x814C, 0x8153, -0x8174, 0x8159, 0x815A, 0x8171, -0x8160, 0x8169, 0x817C, 0x817D, -0x816D, 0x8167, 0x584D, 0x5AB5, -0x8188, 0x8182, 0x8191, 0x6ED5, -0x81A3, 0x81AA, 0x81CC, 0x6726, -0x81CA, 0x81BB, 0x9721, 0x9722, -0x9723, 0x9724, 0x9725, 0x9726, -0x9727, 0x9728, 0x9729, 0x972B, -0x972C, 0x972E, 0x972F, 0x9731, -0x9733, 0x9734, 0x9735, 0x9736, -0x9737, 0x973A, 0x973B, 0x973C, -0x973D, 0x973F, 0x9740, 0x9741, -0x9742, 0x9743, 0x9744, 0x9745, -0x9746, 0x9747, 0x9748, 0x9749, -0x974A, 0x974B, 0x974C, 0x974D, -0x974E, 0x974F, 0x9750, 0x9751, -0x9754, 0x9755, 0x9757, 0x9758, -0x975A, 0x975C, 0x975D, 0x975F, -0x9763, 0x9764, 0x9766, 0x9767, -0x9768, 0x976A, 0x976B, 0x976C, -0x976D, 0x976E, 0x976F, 0x9770, -0x9771, 0x9772, 0x9775, 0x9777, -0x9778, 0x9779, 0x977A, 0x977B, -0x977D, 0x977E, 0x977F, 0x9780, -0x9781, 0x9782, 0x9783, 0x9784, -0x9786, 0x9787, 0x9788, 0x9789, -0x978A, 0x978C, 0x978E, 0x978F, -0x9790, 0x9793, 0x9795, 0x9796, -0x9797, 0x9799, 0x979A, 0x979B, -0x979C, 0x979D, 0x81C1, 0x81A6, -0x6B24, 0x6B37, 0x6B39, 0x6B43, -0x6B46, 0x6B59, 0x98D1, 0x98D2, -0x98D3, 0x98D5, 0x98D9, 0x98DA, -0x6BB3, 0x5F40, 0x6BC2, 0x89F3, -0x6590, 0x9F51, 0x6593, 0x65BC, -0x65C6, 0x65C4, 0x65C3, 0x65CC, -0x65CE, 0x65D2, 0x65D6, 0x7080, -0x709C, 0x7096, 0x709D, 0x70BB, -0x70C0, 0x70B7, 0x70AB, 0x70B1, -0x70E8, 0x70CA, 0x7110, 0x7113, -0x7116, 0x712F, 0x7131, 0x7173, -0x715C, 0x7168, 0x7145, 0x7172, -0x714A, 0x7178, 0x717A, 0x7198, -0x71B3, 0x71B5, 0x71A8, 0x71A0, -0x71E0, 0x71D4, 0x71E7, 0x71F9, -0x721D, 0x7228, 0x706C, 0x7118, -0x7166, 0x71B9, 0x623E, 0x623D, -0x6243, 0x6248, 0x6249, 0x793B, -0x7940, 0x7946, 0x7949, 0x795B, -0x795C, 0x7953, 0x795A, 0x7962, -0x7957, 0x7960, 0x796F, 0x7967, -0x797A, 0x7985, 0x798A, 0x799A, -0x79A7, 0x79B3, 0x5FD1, 0x5FD0, -0x979E, 0x979F, 0x97A1, 0x97A2, -0x97A4, 0x97A5, 0x97A6, 0x97A7, -0x97A8, 0x97A9, 0x97AA, 0x97AC, -0x97AE, 0x97B0, 0x97B1, 0x97B3, -0x97B5, 0x97B6, 0x97B7, 0x97B8, -0x97B9, 0x97BA, 0x97BB, 0x97BC, -0x97BD, 0x97BE, 0x97BF, 0x97C0, -0x97C1, 0x97C2, 0x97C3, 0x97C4, -0x97C5, 0x97C6, 0x97C7, 0x97C8, -0x97C9, 0x97CA, 0x97CB, 0x97CC, -0x97CD, 0x97CE, 0x97CF, 0x97D0, -0x97D1, 0x97D2, 0x97D3, 0x97D4, -0x97D5, 0x97D6, 0x97D7, 0x97D8, -0x97D9, 0x97DA, 0x97DB, 0x97DC, -0x97DD, 0x97DE, 0x97DF, 0x97E0, -0x97E1, 0x97E2, 0x97E3, 0x97E4, -0x97E5, 0x97E8, 0x97EE, 0x97EF, -0x97F0, 0x97F1, 0x97F2, 0x97F4, -0x97F7, 0x97F8, 0x97F9, 0x97FA, -0x97FB, 0x97FC, 0x97FD, 0x97FE, -0x97FF, 0x9800, 0x9801, 0x9802, -0x9803, 0x9804, 0x9805, 0x9806, -0x9807, 0x9808, 0x9809, 0x980A, -0x980B, 0x980C, 0x980D, 0x980E, -0x603C, 0x605D, 0x605A, 0x6067, -0x6041, 0x6059, 0x6063, 0x60AB, -0x6106, 0x610D, 0x615D, 0x61A9, -0x619D, 0x61CB, 0x61D1, 0x6206, -0x8080, 0x807F, 0x6C93, 0x6CF6, -0x6DFC, 0x77F6, 0x77F8, 0x7800, -0x7809, 0x7817, 0x7818, 0x7811, -0x65AB, 0x782D, 0x781C, 0x781D, -0x7839, 0x783A, 0x783B, 0x781F, -0x783C, 0x7825, 0x782C, 0x7823, -0x7829, 0x784E, 0x786D, 0x7856, -0x7857, 0x7826, 0x7850, 0x7847, -0x784C, 0x786A, 0x789B, 0x7893, -0x789A, 0x7887, 0x789C, 0x78A1, -0x78A3, 0x78B2, 0x78B9, 0x78A5, -0x78D4, 0x78D9, 0x78C9, 0x78EC, -0x78F2, 0x7905, 0x78F4, 0x7913, -0x7924, 0x791E, 0x7934, 0x9F9B, -0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, -0x7704, 0x770D, 0x76F9, 0x7707, -0x7708, 0x771A, 0x7722, 0x7719, -0x772D, 0x7726, 0x7735, 0x7738, -0x7750, 0x7751, 0x7747, 0x7743, -0x775A, 0x7768, 0x980F, 0x9810, -0x9811, 0x9812, 0x9813, 0x9814, -0x9815, 0x9816, 0x9817, 0x9818, -0x9819, 0x981A, 0x981B, 0x981C, -0x981D, 0x981E, 0x981F, 0x9820, -0x9821, 0x9822, 0x9823, 0x9824, -0x9825, 0x9826, 0x9827, 0x9828, -0x9829, 0x982A, 0x982B, 0x982C, -0x982D, 0x982E, 0x982F, 0x9830, -0x9831, 0x9832, 0x9833, 0x9834, -0x9835, 0x9836, 0x9837, 0x9838, -0x9839, 0x983A, 0x983B, 0x983C, -0x983D, 0x983E, 0x983F, 0x9840, -0x9841, 0x9842, 0x9843, 0x9844, -0x9845, 0x9846, 0x9847, 0x9848, -0x9849, 0x984A, 0x984B, 0x984C, -0x984D, 0x984E, 0x984F, 0x9850, -0x9851, 0x9852, 0x9853, 0x9854, -0x9855, 0x9856, 0x9857, 0x9858, -0x9859, 0x985A, 0x985B, 0x985C, -0x985D, 0x985E, 0x985F, 0x9860, -0x9861, 0x9862, 0x9863, 0x9864, -0x9865, 0x9866, 0x9867, 0x9868, -0x9869, 0x986A, 0x986B, 0x986C, -0x986D, 0x986E, 0x7762, 0x7765, -0x777F, 0x778D, 0x777D, 0x7780, -0x778C, 0x7791, 0x779F, 0x77A0, -0x77B0, 0x77B5, 0x77BD, 0x753A, -0x7540, 0x754E, 0x754B, 0x7548, -0x755B, 0x7572, 0x7579, 0x7583, -0x7F58, 0x7F61, 0x7F5F, 0x8A48, -0x7F68, 0x7F74, 0x7F71, 0x7F79, -0x7F81, 0x7F7E, 0x76CD, 0x76E5, -0x8832, 0x9485, 0x9486, 0x9487, -0x948B, 0x948A, 0x948C, 0x948D, -0x948F, 0x9490, 0x9494, 0x9497, -0x9495, 0x949A, 0x949B, 0x949C, -0x94A3, 0x94A4, 0x94AB, 0x94AA, -0x94AD, 0x94AC, 0x94AF, 0x94B0, -0x94B2, 0x94B4, 0x94B6, 0x94B7, -0x94B8, 0x94B9, 0x94BA, 0x94BC, -0x94BD, 0x94BF, 0x94C4, 0x94C8, -0x94C9, 0x94CA, 0x94CB, 0x94CC, -0x94CD, 0x94CE, 0x94D0, 0x94D1, -0x94D2, 0x94D5, 0x94D6, 0x94D7, -0x94D9, 0x94D8, 0x94DB, 0x94DE, -0x94DF, 0x94E0, 0x94E2, 0x94E4, -0x94E5, 0x94E7, 0x94E8, 0x94EA, -0x986F, 0x9870, 0x9871, 0x9872, -0x9873, 0x9874, 0x988B, 0x988E, -0x9892, 0x9895, 0x9899, 0x98A3, -0x98A8, 0x98A9, 0x98AA, 0x98AB, -0x98AC, 0x98AD, 0x98AE, 0x98AF, -0x98B0, 0x98B1, 0x98B2, 0x98B3, -0x98B4, 0x98B5, 0x98B6, 0x98B7, -0x98B8, 0x98B9, 0x98BA, 0x98BB, -0x98BC, 0x98BD, 0x98BE, 0x98BF, -0x98C0, 0x98C1, 0x98C2, 0x98C3, -0x98C4, 0x98C5, 0x98C6, 0x98C7, -0x98C8, 0x98C9, 0x98CA, 0x98CB, -0x98CC, 0x98CD, 0x98CF, 0x98D0, -0x98D4, 0x98D6, 0x98D7, 0x98DB, -0x98DC, 0x98DD, 0x98E0, 0x98E1, -0x98E2, 0x98E3, 0x98E4, 0x98E5, -0x98E6, 0x98E9, 0x98EA, 0x98EB, -0x98EC, 0x98ED, 0x98EE, 0x98EF, -0x98F0, 0x98F1, 0x98F2, 0x98F3, -0x98F4, 0x98F5, 0x98F6, 0x98F7, -0x98F8, 0x98F9, 0x98FA, 0x98FB, -0x98FC, 0x98FD, 0x98FE, 0x98FF, -0x9900, 0x9901, 0x9902, 0x9903, -0x9904, 0x9905, 0x9906, 0x9907, -0x94E9, 0x94EB, 0x94EE, 0x94EF, -0x94F3, 0x94F4, 0x94F5, 0x94F7, -0x94F9, 0x94FC, 0x94FD, 0x94FF, -0x9503, 0x9502, 0x9506, 0x9507, -0x9509, 0x950A, 0x950D, 0x950E, -0x950F, 0x9512, 0x9513, 0x9514, -0x9515, 0x9516, 0x9518, 0x951B, -0x951D, 0x951E, 0x951F, 0x9522, -0x952A, 0x952B, 0x9529, 0x952C, -0x9531, 0x9532, 0x9534, 0x9536, -0x9537, 0x9538, 0x953C, 0x953E, -0x953F, 0x9542, 0x9535, 0x9544, -0x9545, 0x9546, 0x9549, 0x954C, -0x954E, 0x954F, 0x9552, 0x9553, -0x9554, 0x9556, 0x9557, 0x9558, -0x9559, 0x955B, 0x955E, 0x955F, -0x955D, 0x9561, 0x9562, 0x9564, -0x9565, 0x9566, 0x9567, 0x9568, -0x9569, 0x956A, 0x956B, 0x956C, -0x956F, 0x9571, 0x9572, 0x9573, -0x953A, 0x77E7, 0x77EC, 0x96C9, -0x79D5, 0x79ED, 0x79E3, 0x79EB, -0x7A06, 0x5D47, 0x7A03, 0x7A02, -0x7A1E, 0x7A14, 0x9908, 0x9909, -0x990A, 0x990B, 0x990C, 0x990E, -0x990F, 0x9911, 0x9912, 0x9913, -0x9914, 0x9915, 0x9916, 0x9917, -0x9918, 0x9919, 0x991A, 0x991B, -0x991C, 0x991D, 0x991E, 0x991F, -0x9920, 0x9921, 0x9922, 0x9923, -0x9924, 0x9925, 0x9926, 0x9927, -0x9928, 0x9929, 0x992A, 0x992B, -0x992C, 0x992D, 0x992F, 0x9930, -0x9931, 0x9932, 0x9933, 0x9934, -0x9935, 0x9936, 0x9937, 0x9938, -0x9939, 0x993A, 0x993B, 0x993C, -0x993D, 0x993E, 0x993F, 0x9940, -0x9941, 0x9942, 0x9943, 0x9944, -0x9945, 0x9946, 0x9947, 0x9948, -0x9949, 0x994A, 0x994B, 0x994C, -0x994D, 0x994E, 0x994F, 0x9950, -0x9951, 0x9952, 0x9953, 0x9956, -0x9957, 0x9958, 0x9959, 0x995A, -0x995B, 0x995C, 0x995D, 0x995E, -0x995F, 0x9960, 0x9961, 0x9962, -0x9964, 0x9966, 0x9973, 0x9978, -0x9979, 0x997B, 0x997E, 0x9982, -0x9983, 0x9989, 0x7A39, 0x7A37, -0x7A51, 0x9ECF, 0x99A5, 0x7A70, -0x7688, 0x768E, 0x7693, 0x7699, -0x76A4, 0x74DE, 0x74E0, 0x752C, -0x9E20, 0x9E22, 0x9E28, 0x9E29, -0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, -0x9E31, 0x9E36, 0x9E38, 0x9E37, -0x9E39, 0x9E3A, 0x9E3E, 0x9E41, -0x9E42, 0x9E44, 0x9E46, 0x9E47, -0x9E48, 0x9E49, 0x9E4B, 0x9E4C, -0x9E4E, 0x9E51, 0x9E55, 0x9E57, -0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, -0x9E63, 0x9E66, 0x9E67, 0x9E68, -0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, -0x9E71, 0x9E6D, 0x9E73, 0x7592, -0x7594, 0x7596, 0x75A0, 0x759D, -0x75AC, 0x75A3, 0x75B3, 0x75B4, -0x75B8, 0x75C4, 0x75B1, 0x75B0, -0x75C3, 0x75C2, 0x75D6, 0x75CD, -0x75E3, 0x75E8, 0x75E6, 0x75E4, -0x75EB, 0x75E7, 0x7603, 0x75F1, -0x75FC, 0x75FF, 0x7610, 0x7600, -0x7605, 0x760C, 0x7617, 0x760A, -0x7625, 0x7618, 0x7615, 0x7619, -0x998C, 0x998E, 0x999A, 0x999B, -0x999C, 0x999D, 0x999E, 0x999F, -0x99A0, 0x99A1, 0x99A2, 0x99A3, -0x99A4, 0x99A6, 0x99A7, 0x99A9, -0x99AA, 0x99AB, 0x99AC, 0x99AD, -0x99AE, 0x99AF, 0x99B0, 0x99B1, -0x99B2, 0x99B3, 0x99B4, 0x99B5, -0x99B6, 0x99B7, 0x99B8, 0x99B9, -0x99BA, 0x99BB, 0x99BC, 0x99BD, -0x99BE, 0x99BF, 0x99C0, 0x99C1, -0x99C2, 0x99C3, 0x99C4, 0x99C5, -0x99C6, 0x99C7, 0x99C8, 0x99C9, -0x99CA, 0x99CB, 0x99CC, 0x99CD, -0x99CE, 0x99CF, 0x99D0, 0x99D1, -0x99D2, 0x99D3, 0x99D4, 0x99D5, -0x99D6, 0x99D7, 0x99D8, 0x99D9, -0x99DA, 0x99DB, 0x99DC, 0x99DD, -0x99DE, 0x99DF, 0x99E0, 0x99E1, -0x99E2, 0x99E3, 0x99E4, 0x99E5, -0x99E6, 0x99E7, 0x99E8, 0x99E9, -0x99EA, 0x99EB, 0x99EC, 0x99ED, -0x99EE, 0x99EF, 0x99F0, 0x99F1, -0x99F2, 0x99F3, 0x99F4, 0x99F5, -0x99F6, 0x99F7, 0x99F8, 0x99F9, -0x761B, 0x763C, 0x7622, 0x7620, -0x7640, 0x762D, 0x7630, 0x763F, -0x7635, 0x7643, 0x763E, 0x7633, -0x764D, 0x765E, 0x7654, 0x765C, -0x7656, 0x766B, 0x766F, 0x7FCA, -0x7AE6, 0x7A78, 0x7A79, 0x7A80, -0x7A86, 0x7A88, 0x7A95, 0x7AA6, -0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, -0x7AB3, 0x8864, 0x8869, 0x8872, -0x887D, 0x887F, 0x8882, 0x88A2, -0x88C6, 0x88B7, 0x88BC, 0x88C9, -0x88E2, 0x88CE, 0x88E3, 0x88E5, -0x88F1, 0x891A, 0x88FC, 0x88E8, -0x88FE, 0x88F0, 0x8921, 0x8919, -0x8913, 0x891B, 0x890A, 0x8934, -0x892B, 0x8936, 0x8941, 0x8966, -0x897B, 0x758B, 0x80E5, 0x76B2, -0x76B4, 0x77DC, 0x8012, 0x8014, -0x8016, 0x801C, 0x8020, 0x8022, -0x8025, 0x8026, 0x8027, 0x8029, -0x8028, 0x8031, 0x800B, 0x8035, -0x8043, 0x8046, 0x804D, 0x8052, -0x8069, 0x8071, 0x8983, 0x9878, -0x9880, 0x9883, 0x99FA, 0x99FB, -0x99FC, 0x99FD, 0x99FE, 0x99FF, -0x9A00, 0x9A01, 0x9A02, 0x9A03, -0x9A04, 0x9A05, 0x9A06, 0x9A07, -0x9A08, 0x9A09, 0x9A0A, 0x9A0B, -0x9A0C, 0x9A0D, 0x9A0E, 0x9A0F, -0x9A10, 0x9A11, 0x9A12, 0x9A13, -0x9A14, 0x9A15, 0x9A16, 0x9A17, -0x9A18, 0x9A19, 0x9A1A, 0x9A1B, -0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, -0x9A20, 0x9A21, 0x9A22, 0x9A23, -0x9A24, 0x9A25, 0x9A26, 0x9A27, -0x9A28, 0x9A29, 0x9A2A, 0x9A2B, -0x9A2C, 0x9A2D, 0x9A2E, 0x9A2F, -0x9A30, 0x9A31, 0x9A32, 0x9A33, -0x9A34, 0x9A35, 0x9A36, 0x9A37, -0x9A38, 0x9A39, 0x9A3A, 0x9A3B, -0x9A3C, 0x9A3D, 0x9A3E, 0x9A3F, -0x9A40, 0x9A41, 0x9A42, 0x9A43, -0x9A44, 0x9A45, 0x9A46, 0x9A47, -0x9A48, 0x9A49, 0x9A4A, 0x9A4B, -0x9A4C, 0x9A4D, 0x9A4E, 0x9A4F, -0x9A50, 0x9A51, 0x9A52, 0x9A53, -0x9A54, 0x9A55, 0x9A56, 0x9A57, -0x9A58, 0x9A59, 0x9889, 0x988C, -0x988D, 0x988F, 0x9894, 0x989A, -0x989B, 0x989E, 0x989F, 0x98A1, -0x98A2, 0x98A5, 0x98A6, 0x864D, -0x8654, 0x866C, 0x866E, 0x867F, -0x867A, 0x867C, 0x867B, 0x86A8, -0x868D, 0x868B, 0x86AC, 0x869D, -0x86A7, 0x86A3, 0x86AA, 0x8693, -0x86A9, 0x86B6, 0x86C4, 0x86B5, -0x86CE, 0x86B0, 0x86BA, 0x86B1, -0x86AF, 0x86C9, 0x86CF, 0x86B4, -0x86E9, 0x86F1, 0x86F2, 0x86ED, -0x86F3, 0x86D0, 0x8713, 0x86DE, -0x86F4, 0x86DF, 0x86D8, 0x86D1, -0x8703, 0x8707, 0x86F8, 0x8708, -0x870A, 0x870D, 0x8709, 0x8723, -0x873B, 0x871E, 0x8725, 0x872E, -0x871A, 0x873E, 0x8748, 0x8734, -0x8731, 0x8729, 0x8737, 0x873F, -0x8782, 0x8722, 0x877D, 0x877E, -0x877B, 0x8760, 0x8770, 0x874C, -0x876E, 0x878B, 0x8753, 0x8763, -0x877C, 0x8764, 0x8759, 0x8765, -0x8793, 0x87AF, 0x87A8, 0x87D2, -0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, -0x9A5E, 0x9A5F, 0x9A60, 0x9A61, -0x9A62, 0x9A63, 0x9A64, 0x9A65, -0x9A66, 0x9A67, 0x9A68, 0x9A69, -0x9A6A, 0x9A6B, 0x9A72, 0x9A83, -0x9A89, 0x9A8D, 0x9A8E, 0x9A94, -0x9A95, 0x9A99, 0x9AA6, 0x9AA9, -0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, -0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, -0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, -0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, -0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, -0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, -0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4, -0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, -0x9ADA, 0x9ADB, 0x9ADC, 0x9ADD, -0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, -0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8, -0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, -0x9AF0, 0x9AF1, 0x9AF2, 0x9AF3, -0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, -0x9AF8, 0x9AFA, 0x9AFC, 0x9AFD, -0x9AFE, 0x9AFF, 0x9B00, 0x9B01, -0x9B02, 0x9B04, 0x9B05, 0x9B06, -0x87C6, 0x8788, 0x8785, 0x87AD, -0x8797, 0x8783, 0x87AB, 0x87E5, -0x87AC, 0x87B5, 0x87B3, 0x87CB, -0x87D3, 0x87BD, 0x87D1, 0x87C0, -0x87CA, 0x87DB, 0x87EA, 0x87E0, -0x87EE, 0x8816, 0x8813, 0x87FE, -0x880A, 0x881B, 0x8821, 0x8839, -0x883C, 0x7F36, 0x7F42, 0x7F44, -0x7F45, 0x8210, 0x7AFA, 0x7AFD, -0x7B08, 0x7B03, 0x7B04, 0x7B15, -0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, -0x7B38, 0x7B2A, 0x7B19, 0x7B2E, -0x7B31, 0x7B20, 0x7B25, 0x7B24, -0x7B33, 0x7B3E, 0x7B1E, 0x7B58, -0x7B5A, 0x7B45, 0x7B75, 0x7B4C, -0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, -0x7B62, 0x7B72, 0x7B71, 0x7B90, -0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, -0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, -0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, -0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, -0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, -0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, -0x7C16, 0x7C0B, 0x9B07, 0x9B09, -0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, -0x9B0E, 0x9B10, 0x9B11, 0x9B12, -0x9B14, 0x9B15, 0x9B16, 0x9B17, -0x9B18, 0x9B19, 0x9B1A, 0x9B1B, -0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, -0x9B21, 0x9B22, 0x9B24, 0x9B25, -0x9B26, 0x9B27, 0x9B28, 0x9B29, -0x9B2A, 0x9B2B, 0x9B2C, 0x9B2D, -0x9B2E, 0x9B30, 0x9B31, 0x9B33, -0x9B34, 0x9B35, 0x9B36, 0x9B37, -0x9B38, 0x9B39, 0x9B3A, 0x9B3D, -0x9B3E, 0x9B3F, 0x9B40, 0x9B46, -0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, -0x9B50, 0x9B52, 0x9B53, 0x9B55, -0x9B56, 0x9B57, 0x9B58, 0x9B59, -0x9B5A, 0x9B5B, 0x9B5C, 0x9B5D, -0x9B5E, 0x9B5F, 0x9B60, 0x9B61, -0x9B62, 0x9B63, 0x9B64, 0x9B65, -0x9B66, 0x9B67, 0x9B68, 0x9B69, -0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, -0x9B6E, 0x9B6F, 0x9B70, 0x9B71, -0x9B72, 0x9B73, 0x9B74, 0x9B75, -0x9B76, 0x9B77, 0x9B78, 0x9B79, -0x9B7A, 0x9B7B, 0x7C1F, 0x7C2A, -0x7C26, 0x7C38, 0x7C41, 0x7C40, -0x81FE, 0x8201, 0x8202, 0x8204, -0x81EC, 0x8844, 0x8221, 0x8222, -0x8223, 0x822D, 0x822F, 0x8228, -0x822B, 0x8238, 0x823B, 0x8233, -0x8234, 0x823E, 0x8244, 0x8249, -0x824B, 0x824F, 0x825A, 0x825F, -0x8268, 0x887E, 0x8885, 0x8888, -0x88D8, 0x88DF, 0x895E, 0x7F9D, -0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, -0x7FB2, 0x7C7C, 0x6549, 0x7C91, -0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, -0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, -0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, -0x7CC5, 0x7CD7, 0x7CE8, 0x826E, -0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, -0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, -0x7FEE, 0x7FF3, 0x7CF8, 0x7D77, -0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, -0x9EB8, 0x9EB4, 0x8D73, 0x8D84, -0x8D94, 0x8D91, 0x8DB1, 0x8D67, -0x8D6D, 0x8C47, 0x8C49, 0x914A, -0x9150, 0x914E, 0x914F, 0x9164, -0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, -0x9B80, 0x9B81, 0x9B82, 0x9B83, -0x9B84, 0x9B85, 0x9B86, 0x9B87, -0x9B88, 0x9B89, 0x9B8A, 0x9B8B, -0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, -0x9B90, 0x9B91, 0x9B92, 0x9B93, -0x9B94, 0x9B95, 0x9B96, 0x9B97, -0x9B98, 0x9B99, 0x9B9A, 0x9B9B, -0x9B9C, 0x9B9D, 0x9B9E, 0x9B9F, -0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, -0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, -0x9BA8, 0x9BA9, 0x9BAA, 0x9BAB, -0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, -0x9BB0, 0x9BB1, 0x9BB2, 0x9BB3, -0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, -0x9BB8, 0x9BB9, 0x9BBA, 0x9BBB, -0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, -0x9BC0, 0x9BC1, 0x9BC2, 0x9BC3, -0x9BC4, 0x9BC5, 0x9BC6, 0x9BC7, -0x9BC8, 0x9BC9, 0x9BCA, 0x9BCB, -0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, -0x9BD0, 0x9BD1, 0x9BD2, 0x9BD3, -0x9BD4, 0x9BD5, 0x9BD6, 0x9BD7, -0x9BD8, 0x9BD9, 0x9BDA, 0x9BDB, -0x9162, 0x9161, 0x9170, 0x9169, -0x916F, 0x917D, 0x917E, 0x9172, -0x9174, 0x9179, 0x918C, 0x9185, -0x9190, 0x918D, 0x9191, 0x91A2, -0x91A3, 0x91AA, 0x91AD, 0x91AE, -0x91AF, 0x91B5, 0x91B4, 0x91BA, -0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, -0x8E05, 0x8E59, 0x8E69, 0x8DB5, -0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, -0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, -0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, -0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, -0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, -0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, -0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, -0x8E3A, 0x8E40, 0x8E39, 0x8E35, -0x8E3D, 0x8E31, 0x8E49, 0x8E41, -0x8E42, 0x8E51, 0x8E52, 0x8E4A, -0x8E70, 0x8E76, 0x8E7C, 0x8E6F, -0x8E74, 0x8E85, 0x8E8F, 0x8E94, -0x8E90, 0x8E9C, 0x8E9E, 0x8C78, -0x8C82, 0x8C8A, 0x8C85, 0x8C98, -0x8C94, 0x659B, 0x89D6, 0x89DE, -0x89DA, 0x89DC, 0x9BDC, 0x9BDD, -0x9BDE, 0x9BDF, 0x9BE0, 0x9BE1, -0x9BE2, 0x9BE3, 0x9BE4, 0x9BE5, -0x9BE6, 0x9BE7, 0x9BE8, 0x9BE9, -0x9BEA, 0x9BEB, 0x9BEC, 0x9BED, -0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, -0x9BF2, 0x9BF3, 0x9BF4, 0x9BF5, -0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, -0x9BFA, 0x9BFB, 0x9BFC, 0x9BFD, -0x9BFE, 0x9BFF, 0x9C00, 0x9C01, -0x9C02, 0x9C03, 0x9C04, 0x9C05, -0x9C06, 0x9C07, 0x9C08, 0x9C09, -0x9C0A, 0x9C0B, 0x9C0C, 0x9C0D, -0x9C0E, 0x9C0F, 0x9C10, 0x9C11, -0x9C12, 0x9C13, 0x9C14, 0x9C15, -0x9C16, 0x9C17, 0x9C18, 0x9C19, -0x9C1A, 0x9C1B, 0x9C1C, 0x9C1D, -0x9C1E, 0x9C1F, 0x9C20, 0x9C21, -0x9C22, 0x9C23, 0x9C24, 0x9C25, -0x9C26, 0x9C27, 0x9C28, 0x9C29, -0x9C2A, 0x9C2B, 0x9C2C, 0x9C2D, -0x9C2E, 0x9C2F, 0x9C30, 0x9C31, -0x9C32, 0x9C33, 0x9C34, 0x9C35, -0x9C36, 0x9C37, 0x9C38, 0x9C39, -0x9C3A, 0x9C3B, 0x89E5, 0x89EB, -0x89EF, 0x8A3E, 0x8B26, 0x9753, -0x96E9, 0x96F3, 0x96EF, 0x9706, -0x9701, 0x9708, 0x970F, 0x970E, -0x972A, 0x972D, 0x9730, 0x973E, -0x9F80, 0x9F83, 0x9F85, 0x9F86, -0x9F87, 0x9F88, 0x9F89, 0x9F8A, -0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, -0x96B9, 0x96BC, 0x96BD, 0x96CE, -0x96D2, 0x77BF, 0x96E0, 0x928E, -0x92AE, 0x92C8, 0x933E, 0x936A, -0x93CA, 0x938F, 0x943E, 0x946B, -0x9C7F, 0x9C82, 0x9C85, 0x9C86, -0x9C87, 0x9C88, 0x7A23, 0x9C8B, -0x9C8E, 0x9C90, 0x9C91, 0x9C92, -0x9C94, 0x9C95, 0x9C9A, 0x9C9B, -0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, -0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, -0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, -0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, -0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, -0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, -0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, -0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, -0x9C3C, 0x9C3D, 0x9C3E, 0x9C3F, -0x9C40, 0x9C41, 0x9C42, 0x9C43, -0x9C44, 0x9C45, 0x9C46, 0x9C47, -0x9C48, 0x9C49, 0x9C4A, 0x9C4B, -0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, -0x9C50, 0x9C51, 0x9C52, 0x9C53, -0x9C54, 0x9C55, 0x9C56, 0x9C57, -0x9C58, 0x9C59, 0x9C5A, 0x9C5B, -0x9C5C, 0x9C5D, 0x9C5E, 0x9C5F, -0x9C60, 0x9C61, 0x9C62, 0x9C63, -0x9C64, 0x9C65, 0x9C66, 0x9C67, -0x9C68, 0x9C69, 0x9C6A, 0x9C6B, -0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, -0x9C70, 0x9C71, 0x9C72, 0x9C73, -0x9C74, 0x9C75, 0x9C76, 0x9C77, -0x9C78, 0x9C79, 0x9C7A, 0x9C7B, -0x9C7D, 0x9C7E, 0x9C80, 0x9C83, -0x9C84, 0x9C89, 0x9C8A, 0x9C8C, -0x9C8F, 0x9C93, 0x9C96, 0x9C97, -0x9C98, 0x9C99, 0x9C9D, 0x9CAA, -0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, -0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, -0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, -0x9CDA, 0x9CDB, 0x9CE0, 0x9CE1, -0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, -0x9CD0, 0x9CD3, 0x9CD4, 0x9CD5, -0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, -0x9CDD, 0x9CDF, 0x9CE2, 0x977C, -0x9785, 0x9791, 0x9792, 0x9794, -0x97AF, 0x97AB, 0x97A3, 0x97B2, -0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, -0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, -0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, -0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, -0x9B43, 0x9B47, 0x9B49, 0x9B48, -0x9B4D, 0x9B51, 0x98E8, 0x990D, -0x992E, 0x9955, 0x9954, 0x9ADF, -0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, -0x9AFB, 0x9AED, 0x9AF9, 0x9B08, -0x9B0F, 0x9B13, 0x9B1F, 0x9B23, -0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, -0x9E87, 0x9E88, 0x9E8B, 0x9E92, -0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, -0x9EDC, 0x9EDD, 0x9EE0, 0x9EDF, -0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, -0x9EEA, 0x9EEF, 0x9F22, 0x9F2C, -0x9F2F, 0x9F39, 0x9F37, 0x9F3D, -0x9F3E, 0x9F44, 0x9CE3, 0x9CE4, -0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, -0x9CE9, 0x9CEA, 0x9CEB, 0x9CEC, -0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, -0x9CF1, 0x9CF2, 0x9CF3, 0x9CF4, -0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, -0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, -0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, -0x9D01, 0x9D02, 0x9D03, 0x9D04, -0x9D05, 0x9D06, 0x9D07, 0x9D08, -0x9D09, 0x9D0A, 0x9D0B, 0x9D0C, -0x9D0D, 0x9D0E, 0x9D0F, 0x9D10, -0x9D11, 0x9D12, 0x9D13, 0x9D14, -0x9D15, 0x9D16, 0x9D17, 0x9D18, -0x9D19, 0x9D1A, 0x9D1B, 0x9D1C, -0x9D1D, 0x9D1E, 0x9D1F, 0x9D20, -0x9D21, 0x9D22, 0x9D23, 0x9D24, -0x9D25, 0x9D26, 0x9D27, 0x9D28, -0x9D29, 0x9D2A, 0x9D2B, 0x9D2C, -0x9D2D, 0x9D2E, 0x9D2F, 0x9D30, -0x9D31, 0x9D32, 0x9D33, 0x9D34, -0x9D35, 0x9D36, 0x9D37, 0x9D38, -0x9D39, 0x9D3A, 0x9D3B, 0x9D3C, -0x9D3D, 0x9D3E, 0x9D3F, 0x9D40, -0x9D41, 0x9D42, 0xE234, 0xE235, -0xE236, 0xE237, 0xE238, 0xE239, -0xE23A, 0xE23B, 0xE23C, 0xE23D, -0xE23E, 0xE23F, 0xE240, 0xE241, -0xE242, 0xE243, 0xE244, 0xE245, -0xE246, 0xE247, 0xE248, 0xE249, -0xE24A, 0xE24B, 0xE24C, 0xE24D, -0xE24E, 0xE24F, 0xE250, 0xE251, -0xE252, 0xE253, 0xE254, 0xE255, -0xE256, 0xE257, 0xE258, 0xE259, -0xE25A, 0xE25B, 0xE25C, 0xE25D, -0xE25E, 0xE25F, 0xE260, 0xE261, -0xE262, 0xE263, 0xE264, 0xE265, -0xE266, 0xE267, 0xE268, 0xE269, -0xE26A, 0xE26B, 0xE26C, 0xE26D, -0xE26E, 0xE26F, 0xE270, 0xE271, -0xE272, 0xE273, 0xE274, 0xE275, -0xE276, 0xE277, 0xE278, 0xE279, -0xE27A, 0xE27B, 0xE27C, 0xE27D, -0xE27E, 0xE27F, 0xE280, 0xE281, -0xE282, 0xE283, 0xE284, 0xE285, -0xE286, 0xE287, 0xE288, 0xE289, -0xE28A, 0xE28B, 0xE28C, 0xE28D, -0xE28E, 0xE28F, 0xE290, 0xE291, -0x9D43, 0x9D44, 0x9D45, 0x9D46, -0x9D47, 0x9D48, 0x9D49, 0x9D4A, -0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, -0x9D4F, 0x9D50, 0x9D51, 0x9D52, -0x9D53, 0x9D54, 0x9D55, 0x9D56, -0x9D57, 0x9D58, 0x9D59, 0x9D5A, -0x9D5B, 0x9D5C, 0x9D5D, 0x9D5E, -0x9D5F, 0x9D60, 0x9D61, 0x9D62, -0x9D63, 0x9D64, 0x9D65, 0x9D66, -0x9D67, 0x9D68, 0x9D69, 0x9D6A, -0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, -0x9D6F, 0x9D70, 0x9D71, 0x9D72, -0x9D73, 0x9D74, 0x9D75, 0x9D76, -0x9D77, 0x9D78, 0x9D79, 0x9D7A, -0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, -0x9D7F, 0x9D80, 0x9D81, 0x9D82, -0x9D83, 0x9D84, 0x9D85, 0x9D86, -0x9D87, 0x9D88, 0x9D89, 0x9D8A, -0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, -0x9D8F, 0x9D90, 0x9D91, 0x9D92, -0x9D93, 0x9D94, 0x9D95, 0x9D96, -0x9D97, 0x9D98, 0x9D99, 0x9D9A, -0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, -0x9D9F, 0x9DA0, 0x9DA1, 0x9DA2, -0xE292, 0xE293, 0xE294, 0xE295, -0xE296, 0xE297, 0xE298, 0xE299, -0xE29A, 0xE29B, 0xE29C, 0xE29D, -0xE29E, 0xE29F, 0xE2A0, 0xE2A1, -0xE2A2, 0xE2A3, 0xE2A4, 0xE2A5, -0xE2A6, 0xE2A7, 0xE2A8, 0xE2A9, -0xE2AA, 0xE2AB, 0xE2AC, 0xE2AD, -0xE2AE, 0xE2AF, 0xE2B0, 0xE2B1, -0xE2B2, 0xE2B3, 0xE2B4, 0xE2B5, -0xE2B6, 0xE2B7, 0xE2B8, 0xE2B9, -0xE2BA, 0xE2BB, 0xE2BC, 0xE2BD, -0xE2BE, 0xE2BF, 0xE2C0, 0xE2C1, -0xE2C2, 0xE2C3, 0xE2C4, 0xE2C5, -0xE2C6, 0xE2C7, 0xE2C8, 0xE2C9, -0xE2CA, 0xE2CB, 0xE2CC, 0xE2CD, -0xE2CE, 0xE2CF, 0xE2D0, 0xE2D1, -0xE2D2, 0xE2D3, 0xE2D4, 0xE2D5, -0xE2D6, 0xE2D7, 0xE2D8, 0xE2D9, -0xE2DA, 0xE2DB, 0xE2DC, 0xE2DD, -0xE2DE, 0xE2DF, 0xE2E0, 0xE2E1, -0xE2E2, 0xE2E3, 0xE2E4, 0xE2E5, -0xE2E6, 0xE2E7, 0xE2E8, 0xE2E9, -0xE2EA, 0xE2EB, 0xE2EC, 0xE2ED, -0xE2EE, 0xE2EF, 0x9DA3, 0x9DA4, -0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, -0x9DA9, 0x9DAA, 0x9DAB, 0x9DAC, -0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, -0x9DB1, 0x9DB2, 0x9DB3, 0x9DB4, -0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, -0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC, -0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, -0x9DC1, 0x9DC2, 0x9DC3, 0x9DC4, -0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, -0x9DC9, 0x9DCA, 0x9DCB, 0x9DCC, -0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, -0x9DD1, 0x9DD2, 0x9DD3, 0x9DD4, -0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, -0x9DD9, 0x9DDA, 0x9DDB, 0x9DDC, -0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, -0x9DE1, 0x9DE2, 0x9DE3, 0x9DE4, -0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, -0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, -0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, -0x9DF1, 0x9DF2, 0x9DF3, 0x9DF4, -0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, -0x9DF9, 0x9DFA, 0x9DFB, 0x9DFC, -0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, -0x9E01, 0x9E02, 0xE2F0, 0xE2F1, -0xE2F2, 0xE2F3, 0xE2F4, 0xE2F5, -0xE2F6, 0xE2F7, 0xE2F8, 0xE2F9, -0xE2FA, 0xE2FB, 0xE2FC, 0xE2FD, -0xE2FE, 0xE2FF, 0xE300, 0xE301, -0xE302, 0xE303, 0xE304, 0xE305, -0xE306, 0xE307, 0xE308, 0xE309, -0xE30A, 0xE30B, 0xE30C, 0xE30D, -0xE30E, 0xE30F, 0xE310, 0xE311, -0xE312, 0xE313, 0xE314, 0xE315, -0xE316, 0xE317, 0xE318, 0xE319, -0xE31A, 0xE31B, 0xE31C, 0xE31D, -0xE31E, 0xE31F, 0xE320, 0xE321, -0xE322, 0xE323, 0xE324, 0xE325, -0xE326, 0xE327, 0xE328, 0xE329, -0xE32A, 0xE32B, 0xE32C, 0xE32D, -0xE32E, 0xE32F, 0xE330, 0xE331, -0xE332, 0xE333, 0xE334, 0xE335, -0xE336, 0xE337, 0xE338, 0xE339, -0xE33A, 0xE33B, 0xE33C, 0xE33D, -0xE33E, 0xE33F, 0xE340, 0xE341, -0xE342, 0xE343, 0xE344, 0xE345, -0xE346, 0xE347, 0xE348, 0xE349, -0xE34A, 0xE34B, 0xE34C, 0xE34D, -0x9E03, 0x9E04, 0x9E05, 0x9E06, -0x9E07, 0x9E08, 0x9E09, 0x9E0A, -0x9E0B, 0x9E0C, 0x9E0D, 0x9E0E, -0x9E0F, 0x9E10, 0x9E11, 0x9E12, -0x9E13, 0x9E14, 0x9E15, 0x9E16, -0x9E17, 0x9E18, 0x9E19, 0x9E1A, -0x9E1B, 0x9E1C, 0x9E1D, 0x9E1E, -0x9E24, 0x9E27, 0x9E2E, 0x9E30, -0x9E34, 0x9E3B, 0x9E3C, 0x9E40, -0x9E4D, 0x9E50, 0x9E52, 0x9E53, -0x9E54, 0x9E56, 0x9E59, 0x9E5D, -0x9E5F, 0x9E60, 0x9E61, 0x9E62, -0x9E65, 0x9E6E, 0x9E6F, 0x9E72, -0x9E74, 0x9E75, 0x9E76, 0x9E77, -0x9E78, 0x9E79, 0x9E7A, 0x9E7B, -0x9E7C, 0x9E7D, 0x9E80, 0x9E81, -0x9E83, 0x9E84, 0x9E85, 0x9E86, -0x9E89, 0x9E8A, 0x9E8C, 0x9E8D, -0x9E8E, 0x9E8F, 0x9E90, 0x9E91, -0x9E94, 0x9E95, 0x9E96, 0x9E97, -0x9E98, 0x9E99, 0x9E9A, 0x9E9B, -0x9E9C, 0x9E9E, 0x9EA0, 0x9EA1, -0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, -0x9EA7, 0x9EA8, 0x9EA9, 0x9EAA, -0xE34E, 0xE34F, 0xE350, 0xE351, -0xE352, 0xE353, 0xE354, 0xE355, -0xE356, 0xE357, 0xE358, 0xE359, -0xE35A, 0xE35B, 0xE35C, 0xE35D, -0xE35E, 0xE35F, 0xE360, 0xE361, -0xE362, 0xE363, 0xE364, 0xE365, -0xE366, 0xE367, 0xE368, 0xE369, -0xE36A, 0xE36B, 0xE36C, 0xE36D, -0xE36E, 0xE36F, 0xE370, 0xE371, -0xE372, 0xE373, 0xE374, 0xE375, -0xE376, 0xE377, 0xE378, 0xE379, -0xE37A, 0xE37B, 0xE37C, 0xE37D, -0xE37E, 0xE37F, 0xE380, 0xE381, -0xE382, 0xE383, 0xE384, 0xE385, -0xE386, 0xE387, 0xE388, 0xE389, -0xE38A, 0xE38B, 0xE38C, 0xE38D, -0xE38E, 0xE38F, 0xE390, 0xE391, -0xE392, 0xE393, 0xE394, 0xE395, -0xE396, 0xE397, 0xE398, 0xE399, -0xE39A, 0xE39B, 0xE39C, 0xE39D, -0xE39E, 0xE39F, 0xE3A0, 0xE3A1, -0xE3A2, 0xE3A3, 0xE3A4, 0xE3A5, -0xE3A6, 0xE3A7, 0xE3A8, 0xE3A9, -0xE3AA, 0xE3AB, 0x9EAB, 0x9EAC, -0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, -0x9EB1, 0x9EB2, 0x9EB3, 0x9EB5, -0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, -0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, -0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, -0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, -0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, -0x9ED5, 0x9ED6, 0x9ED7, 0x9ED9, -0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, -0x9EE4, 0x9EE6, 0x9EE8, 0x9EEB, -0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, -0x9EF1, 0x9EF2, 0x9EF3, 0x9EF4, -0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, -0x9EFA, 0x9EFD, 0x9EFF, 0x9F00, -0x9F01, 0x9F02, 0x9F03, 0x9F04, -0x9F05, 0x9F06, 0x9F07, 0x9F08, -0x9F09, 0x9F0A, 0x9F0C, 0x9F0F, -0x9F11, 0x9F12, 0x9F14, 0x9F15, -0x9F16, 0x9F18, 0x9F1A, 0x9F1B, -0x9F1C, 0x9F1D, 0x9F1E, 0x9F1F, -0x9F21, 0x9F23, 0x9F24, 0x9F25, -0x9F26, 0x9F27, 0x9F28, 0x9F29, -0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, -0x9F30, 0x9F31, 0xE3AC, 0xE3AD, -0xE3AE, 0xE3AF, 0xE3B0, 0xE3B1, -0xE3B2, 0xE3B3, 0xE3B4, 0xE3B5, -0xE3B6, 0xE3B7, 0xE3B8, 0xE3B9, -0xE3BA, 0xE3BB, 0xE3BC, 0xE3BD, -0xE3BE, 0xE3BF, 0xE3C0, 0xE3C1, -0xE3C2, 0xE3C3, 0xE3C4, 0xE3C5, -0xE3C6, 0xE3C7, 0xE3C8, 0xE3C9, -0xE3CA, 0xE3CB, 0xE3CC, 0xE3CD, -0xE3CE, 0xE3CF, 0xE3D0, 0xE3D1, -0xE3D2, 0xE3D3, 0xE3D4, 0xE3D5, -0xE3D6, 0xE3D7, 0xE3D8, 0xE3D9, -0xE3DA, 0xE3DB, 0xE3DC, 0xE3DD, -0xE3DE, 0xE3DF, 0xE3E0, 0xE3E1, -0xE3E2, 0xE3E3, 0xE3E4, 0xE3E5, -0xE3E6, 0xE3E7, 0xE3E8, 0xE3E9, -0xE3EA, 0xE3EB, 0xE3EC, 0xE3ED, -0xE3EE, 0xE3EF, 0xE3F0, 0xE3F1, -0xE3F2, 0xE3F3, 0xE3F4, 0xE3F5, -0xE3F6, 0xE3F7, 0xE3F8, 0xE3F9, -0xE3FA, 0xE3FB, 0xE3FC, 0xE3FD, -0xE3FE, 0xE3FF, 0xE400, 0xE401, -0xE402, 0xE403, 0xE404, 0xE405, -0xE406, 0xE407, 0xE408, 0xE409, -0x9F32, 0x9F33, 0x9F34, 0x9F35, -0x9F36, 0x9F38, 0x9F3A, 0x9F3C, -0x9F3F, 0x9F40, 0x9F41, 0x9F42, -0x9F43, 0x9F45, 0x9F46, 0x9F47, -0x9F48, 0x9F49, 0x9F4A, 0x9F4B, -0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, -0x9F52, 0x9F53, 0x9F54, 0x9F55, -0x9F56, 0x9F57, 0x9F58, 0x9F59, -0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, -0x9F5E, 0x9F5F, 0x9F60, 0x9F61, -0x9F62, 0x9F63, 0x9F64, 0x9F65, -0x9F66, 0x9F67, 0x9F68, 0x9F69, -0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, -0x9F6E, 0x9F6F, 0x9F70, 0x9F71, -0x9F72, 0x9F73, 0x9F74, 0x9F75, -0x9F76, 0x9F77, 0x9F78, 0x9F79, -0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, -0x9F7E, 0x9F81, 0x9F82, 0x9F8D, -0x9F8E, 0x9F8F, 0x9F90, 0x9F91, -0x9F92, 0x9F93, 0x9F94, 0x9F95, -0x9F96, 0x9F97, 0x9F98, 0x9F9C, -0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, -0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, -0xF979, 0xF995, 0xF9E7, 0xF9F1, -0xE40A, 0xE40B, 0xE40C, 0xE40D, -0xE40E, 0xE40F, 0xE410, 0xE411, -0xE412, 0xE413, 0xE414, 0xE415, -0xE416, 0xE417, 0xE418, 0xE419, -0xE41A, 0xE41B, 0xE41C, 0xE41D, -0xE41E, 0xE41F, 0xE420, 0xE421, -0xE422, 0xE423, 0xE424, 0xE425, -0xE426, 0xE427, 0xE428, 0xE429, -0xE42A, 0xE42B, 0xE42C, 0xE42D, -0xE42E, 0xE42F, 0xE430, 0xE431, -0xE432, 0xE433, 0xE434, 0xE435, -0xE436, 0xE437, 0xE438, 0xE439, -0xE43A, 0xE43B, 0xE43C, 0xE43D, -0xE43E, 0xE43F, 0xE440, 0xE441, -0xE442, 0xE443, 0xE444, 0xE445, -0xE446, 0xE447, 0xE448, 0xE449, -0xE44A, 0xE44B, 0xE44C, 0xE44D, -0xE44E, 0xE44F, 0xE450, 0xE451, -0xE452, 0xE453, 0xE454, 0xE455, -0xE456, 0xE457, 0xE458, 0xE459, -0xE45A, 0xE45B, 0xE45C, 0xE45D, -0xE45E, 0xE45F, 0xE460, 0xE461, -0xE462, 0xE463, 0xE464, 0xE465, -0xE466, 0xE467, 0xFA0C, 0xFA0D, -0xFA0E, 0xFA0F, 0xFA11, 0xFA13, -0xFA14, 0xFA18, 0xFA1F, 0xFA20, -0xFA21, 0xFA23, 0xFA24, 0xFA27, -0xFA28, 0xFA29, 0x2E81, 0xE816, -0xE817, 0xE818, 0x2E84, 0x3473, -0x3447, 0x2E88, 0x2E8B, 0xE81E, -0x359E, 0x361A, 0x360E, 0x2E8C, -0x2E97, 0x396E, 0x3918, 0xE826, -0x39CF, 0x39DF, 0x3A73, 0x39D0, -0xE82B, 0xE82C, 0x3B4E, 0x3C6E, -0x3CE0, 0x2EA7, 0xE831, 0xE832, -0x2EAA, 0x4056, 0x415F, 0x2EAE, -0x4337, 0x2EB3, 0x2EB6, 0x2EB7, -0xE83B, 0x43B1, 0x43AC, 0x2EBB, -0x43DD, 0x44D6, 0x4661, 0x464C, -0xE843, 0x4723, 0x4729, 0x477C, -0x478D, 0x2ECA, 0x4947, 0x497A, -0x497D, 0x4982, 0x4983, 0x4985, -0x4986, 0x499F, 0x499B, 0x49B7, -0x49B6, 0xE854, 0xE855, 0x4CA3, -0x4C9F, 0x4CA0, 0x4CA1, 0x4C77, -0x4CA2, 0x4D13, 0x4D14, 0x4D15, -0x4D16, 0x4D17, 0x4D18, 0x4D19, -0x4DAE, 0xE864, 0xE468, 0xE469, -0xE46A, 0xE46B, 0xE46C, 0xE46D, -0xE46E, 0xE46F, 0xE470, 0xE471, -0xE472, 0xE473, 0xE474, 0xE475, -0xE476, 0xE477, 0xE478, 0xE479, -0xE47A, 0xE47B, 0xE47C, 0xE47D, -0xE47E, 0xE47F, 0xE480, 0xE481, -0xE482, 0xE483, 0xE484, 0xE485, -0xE486, 0xE487, 0xE488, 0xE489, -0xE48A, 0xE48B, 0xE48C, 0xE48D, -0xE48E, 0xE48F, 0xE490, 0xE491, -0xE492, 0xE493, 0xE494, 0xE495, -0xE496, 0xE497, 0xE498, 0xE499, -0xE49A, 0xE49B, 0xE49C, 0xE49D, -0xE49E, 0xE49F, 0xE4A0, 0xE4A1, -0xE4A2, 0xE4A3, 0xE4A4, 0xE4A5, -0xE4A6, 0xE4A7, 0xE4A8, 0xE4A9, -0xE4AA, 0xE4AB, 0xE4AC, 0xE4AD, -0xE4AE, 0xE4AF, 0xE4B0, 0xE4B1, -0xE4B2, 0xE4B3, 0xE4B4, 0xE4B5, -0xE4B6, 0xE4B7, 0xE4B8, 0xE4B9, -0xE4BA, 0xE4BB, 0xE4BC, 0xE4BD, -0xE4BE, 0xE4BF, 0xE4C0, 0xE4C1, -0xE4C2, 0xE4C3, 0xE4C4, 0xE4C5 -} ; diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_GBK.pxx opencascade-7.5.1+dfsg1/src/Resource/Resource_GBK.pxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_GBK.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_GBK.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,6002 @@ +// Created on: 2017-11-17 +// Created by: Artem NOVIKOV +// Copyright (c) 2013-2017 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +static const unsigned short gbkuni [23940] = { +0x4E02, 0x4E04, 0x4E05, 0x4E06, +0x4E0F, 0x4E12, 0x4E17, 0x4E1F, +0x4E20, 0x4E21, 0x4E23, 0x4E26, +0x4E29, 0x4E2E, 0x4E2F, 0x4E31, +0x4E33, 0x4E35, 0x4E37, 0x4E3C, +0x4E40, 0x4E41, 0x4E42, 0x4E44, +0x4E46, 0x4E4A, 0x4E51, 0x4E55, +0x4E57, 0x4E5A, 0x4E5B, 0x4E62, +0x4E63, 0x4E64, 0x4E65, 0x4E67, +0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, +0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, +0x4E74, 0x4E75, 0x4E76, 0x4E77, +0x4E78, 0x4E79, 0x4E7A, 0x4E7B, +0x4E7C, 0x4E7D, 0x4E7F, 0x4E80, +0x4E81, 0x4E82, 0x4E83, 0x4E84, +0x4E85, 0x4E87, 0x4E8A, 0x4E90, +0x4E96, 0x4E97, 0x4E99, 0x4E9C, +0x4E9D, 0x4E9E, 0x4EA3, 0x4EAA, +0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, +0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, +0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, +0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, +0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, +0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, +0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, +0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, +0x4EFC, 0x4EFE, 0x4F00, 0x4F02, +0x4F03, 0x4F04, 0x4F05, 0x4F06, +0x4F07, 0x4F08, 0x4F0B, 0x4F0C, +0x4F12, 0x4F13, 0x4F14, 0x4F15, +0x4F16, 0x4F1C, 0x4F1D, 0x4F21, +0x4F23, 0x4F28, 0x4F29, 0x4F2C, +0x4F2D, 0x4F2E, 0x4F31, 0x4F33, +0x4F35, 0x4F37, 0x4F39, 0x4F3B, +0x4F3E, 0x4F3F, 0x4F40, 0x4F41, +0x4F42, 0x4F44, 0x4F45, 0x4F47, +0x4F48, 0x4F49, 0x4F4A, 0x4F4B, +0x4F4C, 0x4F52, 0x4F54, 0x4F56, +0x4F61, 0x4F62, 0x4F66, 0x4F68, +0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, +0x4F71, 0x4F72, 0x4F75, 0x4F77, +0x4F78, 0x4F79, 0x4F7A, 0x4F7D, +0x4F80, 0x4F81, 0x4F82, 0x4F85, +0x4F86, 0x4F87, 0x4F8A, 0x4F8C, +0x4F8E, 0x4F90, 0x4F92, 0x4F93, +0x4F95, 0x4F96, 0x4F98, 0x4F99, +0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, +0x4FA1, 0x4FA2, 0x4FA4, 0x4FAB, +0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, +0x4FB3, 0x4FB4, 0x4FB6, 0x4FB7, +0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB, +0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, +0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, +0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, +0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, +0x4FD5, 0x4FD6, 0x4FD9, 0x4FDB, +0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, +0x4FE7, 0x4FEB, 0x4FEC, 0x4FF0, +0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, +0x4FF7, 0x4FF9, 0x4FFB, 0x4FFC, +0x4FFD, 0x4FFF, 0x5000, 0x5001, +0x5002, 0x5003, 0x5004, 0x5005, +0x5006, 0x5007, 0x5008, 0x5009, +0x500A, 0x500B, 0x500E, 0x5010, +0x5011, 0x5013, 0x5015, 0x5016, +0x5017, 0x501B, 0x501D, 0x501E, +0x5020, 0x5022, 0x5023, 0x5024, +0x5027, 0x502B, 0x502F, 0x5030, +0x5031, 0x5032, 0x5033, 0x5034, +0x5035, 0x5036, 0x5037, 0x5038, +0x5039, 0x503B, 0x503D, 0x503F, +0x5040, 0x5041, 0x5042, 0x5044, +0x5045, 0x5046, 0x5049, 0x504A, +0x504B, 0x504D, 0x5050, 0x5051, +0x5052, 0x5053, 0x5054, 0x5056, +0x5057, 0x5058, 0x5059, 0x505B, +0x505D, 0x505E, 0x505F, 0x5060, +0x5061, 0x5062, 0x5063, 0x5064, +0x5066, 0x5067, 0x5068, 0x5069, +0x506A, 0x506B, 0x506D, 0x506E, +0x506F, 0x5070, 0x5071, 0x5072, +0x5073, 0x5074, 0x5075, 0x5078, +0x5079, 0x507A, 0x507C, 0x507D, +0x5081, 0x5082, 0x5083, 0x5084, +0x5086, 0x5087, 0x5089, 0x508A, +0x508B, 0x508C, 0x508E, 0x508F, +0x5090, 0x5091, 0x5092, 0x5093, +0x5094, 0x5095, 0x5096, 0x5097, +0x5098, 0x5099, 0x509A, 0x509B, +0x509C, 0x509D, 0x509E, 0x509F, +0x50A0, 0x50A1, 0x50A2, 0x50A4, +0x50A6, 0x50AA, 0x50AB, 0x50AD, +0x50AE, 0x50AF, 0x50B0, 0x50B1, +0x50B3, 0x50B4, 0x50B5, 0x50B6, +0x50B7, 0x50B8, 0x50B9, 0x50BC, +0x50BD, 0x50BE, 0x50BF, 0x50C0, +0x50C1, 0x50C2, 0x50C3, 0x50C4, +0x50C5, 0x50C6, 0x50C7, 0x50C8, +0x50C9, 0x50CA, 0x50CB, 0x50CC, +0x50CD, 0x50CE, 0x50D0, 0x50D1, +0x50D2, 0x50D3, 0x50D4, 0x50D5, +0x50D7, 0x50D8, 0x50D9, 0x50DB, +0x50DC, 0x50DD, 0x50DE, 0x50DF, +0x50E0, 0x50E1, 0x50E2, 0x50E3, +0x50E4, 0x50E5, 0x50E8, 0x50E9, +0x50EA, 0x50EB, 0x50EF, 0x50F0, +0x50F1, 0x50F2, 0x50F4, 0x50F6, +0x50F7, 0x50F8, 0x50F9, 0x50FA, +0x50FC, 0x50FD, 0x50FE, 0x50FF, +0x5100, 0x5101, 0x5102, 0x5103, +0x5104, 0x5105, 0x5108, 0x5109, +0x510A, 0x510C, 0x510D, 0x510E, +0x510F, 0x5110, 0x5111, 0x5113, +0x5114, 0x5115, 0x5116, 0x5117, +0x5118, 0x5119, 0x511A, 0x511B, +0x511C, 0x511D, 0x511E, 0x511F, +0x5120, 0x5122, 0x5123, 0x5124, +0x5125, 0x5126, 0x5127, 0x5128, +0x5129, 0x512A, 0x512B, 0x512C, +0x512D, 0x512E, 0x512F, 0x5130, +0x5131, 0x5132, 0x5133, 0x5134, +0x5135, 0x5136, 0x5137, 0x5138, +0x5139, 0x513A, 0x513B, 0x513C, +0x513D, 0x513E, 0x5142, 0x5147, +0x514A, 0x514C, 0x514E, 0x514F, +0x5150, 0x5152, 0x5153, 0x5157, +0x5158, 0x5159, 0x515B, 0x515D, +0x515E, 0x515F, 0x5160, 0x5161, +0x5163, 0x5164, 0x5166, 0x5167, +0x5169, 0x516A, 0x516F, 0x5172, +0x517A, 0x517E, 0x517F, 0x5183, +0x5184, 0x5186, 0x5187, 0x518A, +0x518B, 0x518E, 0x518F, 0x5190, +0x5191, 0x5193, 0x5194, 0x5198, +0x519A, 0x519D, 0x519E, 0x519F, +0x51A1, 0x51A3, 0x51A6, 0x51A7, +0x51A8, 0x51A9, 0x51AA, 0x51AD, +0x51AE, 0x51B4, 0x51B8, 0x51B9, +0x51BA, 0x51BE, 0x51BF, 0x51C1, +0x51C2, 0x51C3, 0x51C5, 0x51C8, +0x51CA, 0x51CD, 0x51CE, 0x51D0, +0x51D2, 0x51D3, 0x51D4, 0x51D5, +0x51D6, 0x51D7, 0x51D8, 0x51D9, +0x51DA, 0x51DC, 0x51DE, 0x51DF, +0x51E2, 0x51E3, 0x51E5, 0x51E6, +0x51E7, 0x51E8, 0x51E9, 0x51EA, +0x51EC, 0x51EE, 0x51F1, 0x51F2, +0x51F4, 0x51F7, 0x51FE, 0x5204, +0x5205, 0x5209, 0x520B, 0x520C, +0x520F, 0x5210, 0x5213, 0x5214, +0x5215, 0x521C, 0x521E, 0x521F, +0x5221, 0x5222, 0x5223, 0x5225, +0x5226, 0x5227, 0x522A, 0x522C, +0x522F, 0x5231, 0x5232, 0x5234, +0x5235, 0x523C, 0x523E, 0x5244, +0x5245, 0x5246, 0x5247, 0x5248, +0x5249, 0x524B, 0x524E, 0x524F, +0x5252, 0x5253, 0x5255, 0x5257, +0x5258, 0x5259, 0x525A, 0x525B, +0x525D, 0x525F, 0x5260, 0x5262, +0x5263, 0x5264, 0x5266, 0x5268, +0x526B, 0x526C, 0x526D, 0x526E, +0x5270, 0x5271, 0x5273, 0x5274, +0x5275, 0x5276, 0x5277, 0x5278, +0x5279, 0x527A, 0x527B, 0x527C, +0x527E, 0x5280, 0x5283, 0x5284, +0x5285, 0x5286, 0x5287, 0x5289, +0x528A, 0x528B, 0x528C, 0x528D, +0x528E, 0x528F, 0x5291, 0x5292, +0x5294, 0x5295, 0x5296, 0x5297, +0x5298, 0x5299, 0x529A, 0x529C, +0x52A4, 0x52A5, 0x52A6, 0x52A7, +0x52AE, 0x52AF, 0x52B0, 0x52B4, +0x52B5, 0x52B6, 0x52B7, 0x52B8, +0x52B9, 0x52BA, 0x52BB, 0x52BC, +0x52BD, 0x52C0, 0x52C1, 0x52C2, +0x52C4, 0x52C5, 0x52C6, 0x52C8, +0x52CA, 0x52CC, 0x52CD, 0x52CE, +0x52CF, 0x52D1, 0x52D3, 0x52D4, +0x52D5, 0x52D7, 0x52D9, 0x52DA, +0x52DB, 0x52DC, 0x52DD, 0x52DE, +0x52E0, 0x52E1, 0x52E2, 0x52E3, +0x52E5, 0x52E6, 0x52E7, 0x52E8, +0x52E9, 0x52EA, 0x52EB, 0x52EC, +0x52ED, 0x52EE, 0x52EF, 0x52F1, +0x52F2, 0x52F3, 0x52F4, 0x52F5, +0x52F6, 0x52F7, 0x52F8, 0x52FB, +0x52FC, 0x52FD, 0x5301, 0x5302, +0x5303, 0x5304, 0x5307, 0x5309, +0x530A, 0x530B, 0x530C, 0x530E, +0x5311, 0x5312, 0x5313, 0x5314, +0x5318, 0x531B, 0x531C, 0x531E, +0x531F, 0x5322, 0x5324, 0x5325, +0x5327, 0x5328, 0x5329, 0x532B, +0x532C, 0x532D, 0x532F, 0x5330, +0x5331, 0x5332, 0x5333, 0x5334, +0x5335, 0x5336, 0x5337, 0x5338, +0x533C, 0x533D, 0x5340, 0x5342, +0x5344, 0x5346, 0x534B, 0x534C, +0x534D, 0x5350, 0x5354, 0x5358, +0x5359, 0x535B, 0x535D, 0x5365, +0x5368, 0x536A, 0x536C, 0x536D, +0x5372, 0x5376, 0x5379, 0x537B, +0x537C, 0x537D, 0x537E, 0x5380, +0x5381, 0x5383, 0x5387, 0x5388, +0x538A, 0x538E, 0x538F, 0x5390, +0x5391, 0x5392, 0x5393, 0x5394, +0x5396, 0x5397, 0x5399, 0x539B, +0x539C, 0x539E, 0x53A0, 0x53A1, +0x53A4, 0x53A7, 0x53AA, 0x53AB, +0x53AC, 0x53AD, 0x53AF, 0x53B0, +0x53B1, 0x53B2, 0x53B3, 0x53B4, +0x53B5, 0x53B7, 0x53B8, 0x53B9, +0x53BA, 0x53BC, 0x53BD, 0x53BE, +0x53C0, 0x53C3, 0x53C4, 0x53C5, +0x53C6, 0x53C7, 0x53CE, 0x53CF, +0x53D0, 0x53D2, 0x53D3, 0x53D5, +0x53DA, 0x53DC, 0x53DD, 0x53DE, +0x53E1, 0x53E2, 0x53E7, 0x53F4, +0x53FA, 0x53FE, 0x53FF, 0x5400, +0x5402, 0x5405, 0x5407, 0x540B, +0x5414, 0x5418, 0x5419, 0x541A, +0x541C, 0x5422, 0x5424, 0x5425, +0x542A, 0x5430, 0x5433, 0x5436, +0x5437, 0x543A, 0x543D, 0x543F, +0x5441, 0x5442, 0x5444, 0x5445, +0x5447, 0x5449, 0x544C, 0x544D, +0x544E, 0x544F, 0x5451, 0x545A, +0x545D, 0x545E, 0x545F, 0x5460, +0x5461, 0x5463, 0x5465, 0x5467, +0x5469, 0x546A, 0x546B, 0x546C, +0x546D, 0x546E, 0x546F, 0x5470, +0x5474, 0x5479, 0x547A, 0x547E, +0x547F, 0x5481, 0x5483, 0x5485, +0x5487, 0x5488, 0x5489, 0x548A, +0x548D, 0x5491, 0x5493, 0x5497, +0x5498, 0x549C, 0x549E, 0x549F, +0x54A0, 0x54A1, 0x54A2, 0x54A5, +0x54AE, 0x54B0, 0x54B2, 0x54B5, +0x54B6, 0x54B7, 0x54B9, 0x54BA, +0x54BC, 0x54BE, 0x54C3, 0x54C5, +0x54CA, 0x54CB, 0x54D6, 0x54D8, +0x54DB, 0x54E0, 0x54E1, 0x54E2, +0x54E3, 0x54E4, 0x54EB, 0x54EC, +0x54EF, 0x54F0, 0x54F1, 0x54F4, +0x54F5, 0x54F6, 0x54F7, 0x54F8, +0x54F9, 0x54FB, 0x54FE, 0x5500, +0x5502, 0x5503, 0x5504, 0x5505, +0x5508, 0x550A, 0x550B, 0x550C, +0x550D, 0x550E, 0x5512, 0x5513, +0x5515, 0x5516, 0x5517, 0x5518, +0x5519, 0x551A, 0x551C, 0x551D, +0x551E, 0x551F, 0x5521, 0x5525, +0x5526, 0x5528, 0x5529, 0x552B, +0x552D, 0x5532, 0x5534, 0x5535, +0x5536, 0x5538, 0x5539, 0x553A, +0x553B, 0x553D, 0x5540, 0x5542, +0x5545, 0x5547, 0x5548, 0x554B, +0x554C, 0x554D, 0x554E, 0x554F, +0x5551, 0x5552, 0x5553, 0x5554, +0x5557, 0x5558, 0x5559, 0x555A, +0x555B, 0x555D, 0x555E, 0x555F, +0x5560, 0x5562, 0x5563, 0x5568, +0x5569, 0x556B, 0x556F, 0x5570, +0x5571, 0x5572, 0x5573, 0x5574, +0x5579, 0x557A, 0x557D, 0x557F, +0x5585, 0x5586, 0x558C, 0x558D, +0x558E, 0x5590, 0x5592, 0x5593, +0x5595, 0x5596, 0x5597, 0x559A, +0x559B, 0x559E, 0x55A0, 0x55A1, +0x55A2, 0x55A3, 0x55A4, 0x55A5, +0x55A6, 0x55A8, 0x55A9, 0x55AA, +0x55AB, 0x55AC, 0x55AD, 0x55AE, +0x55AF, 0x55B0, 0x55B2, 0x55B4, +0x55B6, 0x55B8, 0x55BA, 0x55BC, +0x55BF, 0x55C0, 0x55C1, 0x55C2, +0x55C3, 0x55C6, 0x55C7, 0x55C8, +0x55CA, 0x55CB, 0x55CE, 0x55CF, +0x55D0, 0x55D5, 0x55D7, 0x55D8, +0x55D9, 0x55DA, 0x55DB, 0x55DE, +0x55E0, 0x55E2, 0x55E7, 0x55E9, +0x55ED, 0x55EE, 0x55F0, 0x55F1, +0x55F4, 0x55F6, 0x55F8, 0x55F9, +0x55FA, 0x55FB, 0x55FC, 0x55FF, +0x5602, 0x5603, 0x5604, 0x5605, +0x5606, 0x5607, 0x560A, 0x560B, +0x560D, 0x5610, 0x5611, 0x5612, +0x5613, 0x5614, 0x5615, 0x5616, +0x5617, 0x5619, 0x561A, 0x561C, +0x561D, 0x5620, 0x5621, 0x5622, +0x5625, 0x5626, 0x5628, 0x5629, +0x562A, 0x562B, 0x562E, 0x562F, +0x5630, 0x5633, 0x5635, 0x5637, +0x5638, 0x563A, 0x563C, 0x563D, +0x563E, 0x5640, 0x5641, 0x5642, +0x5643, 0x5644, 0x5645, 0x5646, +0x5647, 0x5648, 0x5649, 0x564A, +0x564B, 0x564F, 0x5650, 0x5651, +0x5652, 0x5653, 0x5655, 0x5656, +0x565A, 0x565B, 0x565D, 0x565E, +0x565F, 0x5660, 0x5661, 0x5663, +0x5665, 0x5666, 0x5667, 0x566D, +0x566E, 0x566F, 0x5670, 0x5672, +0x5673, 0x5674, 0x5675, 0x5677, +0x5678, 0x5679, 0x567A, 0x567D, +0x567E, 0x567F, 0x5680, 0x5681, +0x5682, 0x5683, 0x5684, 0x5687, +0x5688, 0x5689, 0x568A, 0x568B, +0x568C, 0x568D, 0x5690, 0x5691, +0x5692, 0x5694, 0x5695, 0x5696, +0x5697, 0x5698, 0x5699, 0x569A, +0x569B, 0x569C, 0x569D, 0x569E, +0x569F, 0x56A0, 0x56A1, 0x56A2, +0x56A4, 0x56A5, 0x56A6, 0x56A7, +0x56A8, 0x56A9, 0x56AA, 0x56AB, +0x56AC, 0x56AD, 0x56AE, 0x56B0, +0x56B1, 0x56B2, 0x56B3, 0x56B4, +0x56B5, 0x56B6, 0x56B8, 0x56B9, +0x56BA, 0x56BB, 0x56BD, 0x56BE, +0x56BF, 0x56C0, 0x56C1, 0x56C2, +0x56C3, 0x56C4, 0x56C5, 0x56C6, +0x56C7, 0x56C8, 0x56C9, 0x56CB, +0x56CC, 0x56CD, 0x56CE, 0x56CF, +0x56D0, 0x56D1, 0x56D2, 0x56D3, +0x56D5, 0x56D6, 0x56D8, 0x56D9, +0x56DC, 0x56E3, 0x56E5, 0x56E6, +0x56E7, 0x56E8, 0x56E9, 0x56EA, +0x56EC, 0x56EE, 0x56EF, 0x56F2, +0x56F3, 0x56F6, 0x56F7, 0x56F8, +0x56FB, 0x56FC, 0x5700, 0x5701, +0x5702, 0x5705, 0x5707, 0x570B, +0x570C, 0x570D, 0x570E, 0x570F, +0x5710, 0x5711, 0x5712, 0x5713, +0x5714, 0x5715, 0x5716, 0x5717, +0x5718, 0x5719, 0x571A, 0x571B, +0x571D, 0x571E, 0x5720, 0x5721, +0x5722, 0x5724, 0x5725, 0x5726, +0x5727, 0x572B, 0x5731, 0x5732, +0x5734, 0x5735, 0x5736, 0x5737, +0x5738, 0x573C, 0x573D, 0x573F, +0x5741, 0x5743, 0x5744, 0x5745, +0x5746, 0x5748, 0x5749, 0x574B, +0x5752, 0x5753, 0x5754, 0x5755, +0x5756, 0x5758, 0x5759, 0x5762, +0x5763, 0x5765, 0x5767, 0x576C, +0x576E, 0x5770, 0x5771, 0x5772, +0x5774, 0x5775, 0x5778, 0x5779, +0x577A, 0x577D, 0x577E, 0x577F, +0x5780, 0x5781, 0x5787, 0x5788, +0x5789, 0x578A, 0x578D, 0x578E, +0x578F, 0x5790, 0x5791, 0x5794, +0x5795, 0x5796, 0x5797, 0x5798, +0x5799, 0x579A, 0x579C, 0x579D, +0x579E, 0x579F, 0x57A5, 0x57A8, +0x57AA, 0x57AC, 0x57AF, 0x57B0, +0x57B1, 0x57B3, 0x57B5, 0x57B6, +0x57B7, 0x57B9, 0x57BA, 0x57BB, +0x57BC, 0x57BD, 0x57BE, 0x57BF, +0x57C0, 0x57C1, 0x57C4, 0x57C5, +0x57C6, 0x57C7, 0x57C8, 0x57C9, +0x57CA, 0x57CC, 0x57CD, 0x57D0, +0x57D1, 0x57D3, 0x57D6, 0x57D7, +0x57DB, 0x57DC, 0x57DE, 0x57E1, +0x57E2, 0x57E3, 0x57E5, 0x57E6, +0x57E7, 0x57E8, 0x57E9, 0x57EA, +0x57EB, 0x57EC, 0x57EE, 0x57F0, +0x57F1, 0x57F2, 0x57F3, 0x57F5, +0x57F6, 0x57F7, 0x57FB, 0x57FC, +0x57FE, 0x57FF, 0x5801, 0x5803, +0x5804, 0x5805, 0x5808, 0x5809, +0x580A, 0x580C, 0x580E, 0x580F, +0x5810, 0x5812, 0x5813, 0x5814, +0x5816, 0x5817, 0x5818, 0x581A, +0x581B, 0x581C, 0x581D, 0x581F, +0x5822, 0x5823, 0x5825, 0x5826, +0x5827, 0x5828, 0x5829, 0x582B, +0x582C, 0x582D, 0x582E, 0x582F, +0x5831, 0x5832, 0x5833, 0x5834, +0x5836, 0x5837, 0x5838, 0x5839, +0x583A, 0x583B, 0x583C, 0x583D, +0x583E, 0x583F, 0x5840, 0x5841, +0x5842, 0x5843, 0x5845, 0x5846, +0x5847, 0x5848, 0x5849, 0x584A, +0x584B, 0x584E, 0x584F, 0x5850, +0x5852, 0x5853, 0x5855, 0x5856, +0x5857, 0x5859, 0x585A, 0x585B, +0x585C, 0x585D, 0x585F, 0x5860, +0x5861, 0x5862, 0x5863, 0x5864, +0x5866, 0x5867, 0x5868, 0x5869, +0x586A, 0x586D, 0x586E, 0x586F, +0x5870, 0x5871, 0x5872, 0x5873, +0x5874, 0x5875, 0x5876, 0x5877, +0x5878, 0x5879, 0x587A, 0x587B, +0x587C, 0x587D, 0x587F, 0x5882, +0x5884, 0x5886, 0x5887, 0x5888, +0x588A, 0x588B, 0x588C, 0x588D, +0x588E, 0x588F, 0x5890, 0x5891, +0x5894, 0x5895, 0x5896, 0x5897, +0x5898, 0x589B, 0x589C, 0x589D, +0x58A0, 0x58A1, 0x58A2, 0x58A3, +0x58A4, 0x58A5, 0x58A6, 0x58A7, +0x58AA, 0x58AB, 0x58AC, 0x58AD, +0x58AE, 0x58AF, 0x58B0, 0x58B1, +0x58B2, 0x58B3, 0x58B4, 0x58B5, +0x58B6, 0x58B7, 0x58B8, 0x58B9, +0x58BA, 0x58BB, 0x58BD, 0x58BE, +0x58BF, 0x58C0, 0x58C2, 0x58C3, +0x58C4, 0x58C6, 0x58C7, 0x58C8, +0x58C9, 0x58CA, 0x58CB, 0x58CC, +0x58CD, 0x58CE, 0x58CF, 0x58D0, +0x58D2, 0x58D3, 0x58D4, 0x58D6, +0x58D7, 0x58D8, 0x58D9, 0x58DA, +0x58DB, 0x58DC, 0x58DD, 0x58DE, +0x58DF, 0x58E0, 0x58E1, 0x58E2, +0x58E3, 0x58E5, 0x58E6, 0x58E7, +0x58E8, 0x58E9, 0x58EA, 0x58ED, +0x58EF, 0x58F1, 0x58F2, 0x58F4, +0x58F5, 0x58F7, 0x58F8, 0x58FA, +0x58FB, 0x58FC, 0x58FD, 0x58FE, +0x58FF, 0x5900, 0x5901, 0x5903, +0x5905, 0x5906, 0x5908, 0x5909, +0x590A, 0x590B, 0x590C, 0x590E, +0x5910, 0x5911, 0x5912, 0x5913, +0x5917, 0x5918, 0x591B, 0x591D, +0x591E, 0x5920, 0x5921, 0x5922, +0x5923, 0x5926, 0x5928, 0x592C, +0x5930, 0x5932, 0x5933, 0x5935, +0x5936, 0x593B, 0x593D, 0x593E, +0x593F, 0x5940, 0x5943, 0x5945, +0x5946, 0x594A, 0x594C, 0x594D, +0x5950, 0x5952, 0x5953, 0x5959, +0x595B, 0x595C, 0x595D, 0x595E, +0x595F, 0x5961, 0x5963, 0x5964, +0x5966, 0x5967, 0x5968, 0x5969, +0x596A, 0x596B, 0x596C, 0x596D, +0x596E, 0x596F, 0x5970, 0x5971, +0x5972, 0x5975, 0x5977, 0x597A, +0x597B, 0x597C, 0x597E, 0x597F, +0x5980, 0x5985, 0x5989, 0x598B, +0x598C, 0x598E, 0x598F, 0x5990, +0x5991, 0x5994, 0x5995, 0x5998, +0x599A, 0x599B, 0x599C, 0x599D, +0x599F, 0x59A0, 0x59A1, 0x59A2, +0x59A6, 0x59A7, 0x59AC, 0x59AD, +0x59B0, 0x59B1, 0x59B3, 0x59B4, +0x59B5, 0x59B6, 0x59B7, 0x59B8, +0x59BA, 0x59BC, 0x59BD, 0x59BF, +0x59C0, 0x59C1, 0x59C2, 0x59C3, +0x59C4, 0x59C5, 0x59C7, 0x59C8, +0x59C9, 0x59CC, 0x59CD, 0x59CE, +0x59CF, 0x59D5, 0x59D6, 0x59D9, +0x59DB, 0x59DE, 0x59DF, 0x59E0, +0x59E1, 0x59E2, 0x59E4, 0x59E6, +0x59E7, 0x59E9, 0x59EA, 0x59EB, +0x59ED, 0x59EE, 0x59EF, 0x59F0, +0x59F1, 0x59F2, 0x59F3, 0x59F4, +0x59F5, 0x59F6, 0x59F7, 0x59F8, +0x59FA, 0x59FC, 0x59FD, 0x59FE, +0x5A00, 0x5A02, 0x5A0A, 0x5A0B, +0x5A0D, 0x5A0E, 0x5A0F, 0x5A10, +0x5A12, 0x5A14, 0x5A15, 0x5A16, +0x5A17, 0x5A19, 0x5A1A, 0x5A1B, +0x5A1D, 0x5A1E, 0x5A21, 0x5A22, +0x5A24, 0x5A26, 0x5A27, 0x5A28, +0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, +0x5A2E, 0x5A2F, 0x5A30, 0x5A33, +0x5A35, 0x5A37, 0x5A38, 0x5A39, +0x5A3A, 0x5A3B, 0x5A3D, 0x5A3E, +0x5A3F, 0x5A41, 0x5A42, 0x5A43, +0x5A44, 0x5A45, 0x5A47, 0x5A48, +0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, +0x5A4F, 0x5A50, 0x5A51, 0x5A52, +0x5A53, 0x5A54, 0x5A56, 0x5A57, +0x5A58, 0x5A59, 0x5A5B, 0x5A5C, +0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, +0x5A61, 0x5A63, 0x5A64, 0x5A65, +0x5A66, 0x5A68, 0x5A69, 0x5A6B, +0x5A6C, 0x5A6D, 0x5A6E, 0x5A6F, +0x5A70, 0x5A71, 0x5A72, 0x5A73, +0x5A78, 0x5A79, 0x5A7B, 0x5A7C, +0x5A7D, 0x5A7E, 0x5A80, 0x5A81, +0x5A82, 0x5A83, 0x5A84, 0x5A85, +0x5A86, 0x5A87, 0x5A88, 0x5A89, +0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, +0x5A8E, 0x5A8F, 0x5A90, 0x5A91, +0x5A93, 0x5A94, 0x5A95, 0x5A96, +0x5A97, 0x5A98, 0x5A99, 0x5A9C, +0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, +0x5AA1, 0x5AA2, 0x5AA3, 0x5AA4, +0x5AA5, 0x5AA6, 0x5AA7, 0x5AA8, +0x5AA9, 0x5AAB, 0x5AAC, 0x5AAD, +0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, +0x5AB4, 0x5AB6, 0x5AB7, 0x5AB9, +0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, +0x5ABF, 0x5AC0, 0x5AC3, 0x5AC4, +0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, +0x5ACA, 0x5ACB, 0x5ACD, 0x5ACE, +0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, +0x5AD5, 0x5AD7, 0x5AD9, 0x5ADA, +0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, +0x5AE2, 0x5AE4, 0x5AE5, 0x5AE7, +0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, +0x5AEE, 0x5AEF, 0x5AF0, 0x5AF2, +0x5AF3, 0x5AF4, 0x5AF5, 0x5AF6, +0x5AF7, 0x5AF8, 0x5AF9, 0x5AFA, +0x5AFB, 0x5AFC, 0x5AFD, 0x5AFE, +0x5AFF, 0x5B00, 0x5B01, 0x5B02, +0x5B03, 0x5B04, 0x5B05, 0x5B06, +0x5B07, 0x5B08, 0x5B0A, 0x5B0B, +0x5B0C, 0x5B0D, 0x5B0E, 0x5B0F, +0x5B10, 0x5B11, 0x5B12, 0x5B13, +0x5B14, 0x5B15, 0x5B18, 0x5B19, +0x5B1A, 0x5B1B, 0x5B1C, 0x5B1D, +0x5B1E, 0x5B1F, 0x5B20, 0x5B21, +0x5B22, 0x5B23, 0x5B24, 0x5B25, +0x5B26, 0x5B27, 0x5B28, 0x5B29, +0x5B2A, 0x5B2B, 0x5B2C, 0x5B2D, +0x5B2E, 0x5B2F, 0x5B30, 0x5B31, +0x5B33, 0x5B35, 0x5B36, 0x5B38, +0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, +0x5B3D, 0x5B3E, 0x5B3F, 0x5B41, +0x5B42, 0x5B43, 0x5B44, 0x5B45, +0x5B46, 0x5B47, 0x5B48, 0x5B49, +0x5B4A, 0x5B4B, 0x5B4C, 0x5B4D, +0x5B4E, 0x5B4F, 0x5B52, 0x5B56, +0x5B5E, 0x5B60, 0x5B61, 0x5B67, +0x5B68, 0x5B6B, 0x5B6D, 0x5B6E, +0x5B6F, 0x5B72, 0x5B74, 0x5B76, +0x5B77, 0x5B78, 0x5B79, 0x5B7B, +0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, +0x5B86, 0x5B8A, 0x5B8D, 0x5B8E, +0x5B90, 0x5B91, 0x5B92, 0x5B94, +0x5B96, 0x5B9F, 0x5BA7, 0x5BA8, +0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, +0x5BAF, 0x5BB1, 0x5BB2, 0x5BB7, +0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, +0x5BC1, 0x5BC3, 0x5BC8, 0x5BC9, +0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, +0x5BCF, 0x5BD1, 0x5BD4, 0x5BD5, +0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, +0x5BDA, 0x5BDB, 0x5BDC, 0x5BE0, +0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, +0x5BE9, 0x5BEA, 0x5BEB, 0x5BEC, +0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, +0x5BF3, 0x5BF4, 0x5BF5, 0x5BF6, +0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, +0x5C02, 0x5C03, 0x5C05, 0x5C07, +0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, +0x5C0E, 0x5C10, 0x5C12, 0x5C13, +0x5C17, 0x5C19, 0x5C1B, 0x5C1E, +0x5C1F, 0x5C20, 0x5C21, 0x5C23, +0x5C26, 0x5C28, 0x5C29, 0x5C2A, +0x5C2B, 0x5C2D, 0x5C2E, 0x5C2F, +0x5C30, 0x5C32, 0x5C33, 0x5C35, +0x5C36, 0x5C37, 0x5C43, 0x5C44, +0x5C46, 0x5C47, 0x5C4C, 0x5C4D, +0x5C52, 0x5C53, 0x5C54, 0x5C56, +0x5C57, 0x5C58, 0x5C5A, 0x5C5B, +0x5C5C, 0x5C5D, 0x5C5F, 0x5C62, +0x5C64, 0x5C67, 0x5C68, 0x5C69, +0x5C6A, 0x5C6B, 0x5C6C, 0x5C6D, +0x5C70, 0x5C72, 0x5C73, 0x5C74, +0x5C75, 0x5C76, 0x5C77, 0x5C78, +0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, +0x5C80, 0x5C83, 0x5C84, 0x5C85, +0x5C86, 0x5C87, 0x5C89, 0x5C8A, +0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, +0x5C93, 0x5C95, 0x5C9D, 0x5C9E, +0x5C9F, 0x5CA0, 0x5CA1, 0x5CA4, +0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8, +0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, +0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, +0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, +0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, +0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, +0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, +0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, +0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, +0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, +0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, +0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, +0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF, +0x5CF1, 0x5CF2, 0x5CF3, 0x5CF4, +0x5CF5, 0x5CF6, 0x5CF7, 0x5CF8, +0x5CF9, 0x5CFA, 0x5CFC, 0x5CFD, +0x5CFE, 0x5CFF, 0x5D00, 0x5D01, +0x5D04, 0x5D05, 0x5D08, 0x5D09, +0x5D0A, 0x5D0B, 0x5D0C, 0x5D0D, +0x5D0F, 0x5D10, 0x5D11, 0x5D12, +0x5D13, 0x5D15, 0x5D17, 0x5D18, +0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, +0x5D1F, 0x5D20, 0x5D21, 0x5D22, +0x5D23, 0x5D25, 0x5D28, 0x5D2A, +0x5D2B, 0x5D2C, 0x5D2F, 0x5D30, +0x5D31, 0x5D32, 0x5D33, 0x5D35, +0x5D36, 0x5D37, 0x5D38, 0x5D39, +0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, +0x5D40, 0x5D41, 0x5D42, 0x5D43, +0x5D44, 0x5D45, 0x5D46, 0x5D48, +0x5D49, 0x5D4D, 0x5D4E, 0x5D4F, +0x5D50, 0x5D51, 0x5D52, 0x5D53, +0x5D54, 0x5D55, 0x5D56, 0x5D57, +0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, +0x5D5F, 0x5D60, 0x5D61, 0x5D62, +0x5D63, 0x5D64, 0x5D65, 0x5D66, +0x5D67, 0x5D68, 0x5D6A, 0x5D6D, +0x5D6E, 0x5D70, 0x5D71, 0x5D72, +0x5D73, 0x5D75, 0x5D76, 0x5D77, +0x5D78, 0x5D79, 0x5D7A, 0x5D7B, +0x5D7C, 0x5D7D, 0x5D7E, 0x5D7F, +0x5D80, 0x5D81, 0x5D83, 0x5D84, +0x5D85, 0x5D86, 0x5D87, 0x5D88, +0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, +0x5D8D, 0x5D8E, 0x5D8F, 0x5D90, +0x5D91, 0x5D92, 0x5D93, 0x5D94, +0x5D95, 0x5D96, 0x5D97, 0x5D98, +0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, +0x5D9F, 0x5DA0, 0x5DA1, 0x5DA2, +0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, +0x5DA7, 0x5DA8, 0x5DA9, 0x5DAA, +0x5DAB, 0x5DAC, 0x5DAD, 0x5DAE, +0x5DAF, 0x5DB0, 0x5DB1, 0x5DB2, +0x5DB3, 0x5DB4, 0x5DB5, 0x5DB6, +0x5DB8, 0x5DB9, 0x5DBA, 0x5DBB, +0x5DBC, 0x5DBD, 0x5DBE, 0x5DBF, +0x5DC0, 0x5DC1, 0x5DC2, 0x5DC3, +0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, +0x5DC9, 0x5DCA, 0x5DCB, 0x5DCC, +0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, +0x5DD2, 0x5DD3, 0x5DD4, 0x5DD5, +0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, +0x5DDA, 0x5DDC, 0x5DDF, 0x5DE0, +0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, +0x5DED, 0x5DF0, 0x5DF5, 0x5DF6, +0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, +0x5DFC, 0x5DFF, 0x5E00, 0x5E04, +0x5E07, 0x5E09, 0x5E0A, 0x5E0B, +0x5E0D, 0x5E0E, 0x5E12, 0x5E13, +0x5E17, 0x5E1E, 0x5E1F, 0x5E20, +0x5E21, 0x5E22, 0x5E23, 0x5E24, +0x5E25, 0x5E28, 0x5E29, 0x5E2A, +0x5E2B, 0x5E2C, 0x5E2F, 0x5E30, +0x5E32, 0x5E33, 0x5E34, 0x5E35, +0x5E36, 0x5E39, 0x5E3A, 0x5E3E, +0x5E3F, 0x5E40, 0x5E41, 0x5E43, +0x5E46, 0x5E47, 0x5E48, 0x5E49, +0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, +0x5E4F, 0x5E50, 0x5E51, 0x5E52, +0x5E53, 0x5E56, 0x5E57, 0x5E58, +0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, +0x5E5F, 0x5E60, 0x5E63, 0x5E64, +0x5E65, 0x5E66, 0x5E67, 0x5E68, +0x5E69, 0x5E6A, 0x5E6B, 0x5E6C, +0x5E6D, 0x5E6E, 0x5E6F, 0x5E70, +0x5E71, 0x5E75, 0x5E77, 0x5E79, +0x5E7E, 0x5E81, 0x5E82, 0x5E83, +0x5E85, 0x5E88, 0x5E89, 0x5E8C, +0x5E8D, 0x5E8E, 0x5E92, 0x5E98, +0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, +0x5EA3, 0x5EA4, 0x5EA8, 0x5EA9, +0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, +0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, +0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, +0x5EBD, 0x5EBF, 0x5EC0, 0x5EC1, +0x5EC2, 0x5EC3, 0x5EC4, 0x5EC5, +0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, +0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF, +0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, +0x5ED8, 0x5ED9, 0x5EDA, 0x5EDC, +0x5EDD, 0x5EDE, 0x5EDF, 0x5EE0, +0x5EE1, 0x5EE2, 0x5EE3, 0x5EE4, +0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, +0x5EEB, 0x5EEC, 0x5EED, 0x5EEE, +0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, +0x5EF3, 0x5EF5, 0x5EF8, 0x5EF9, +0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, +0x5F06, 0x5F07, 0x5F09, 0x5F0C, +0x5F0D, 0x5F0E, 0x5F10, 0x5F12, +0x5F14, 0x5F16, 0x5F19, 0x5F1A, +0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, +0x5F22, 0x5F23, 0x5F24, 0x5F28, +0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, +0x5F32, 0x5F33, 0x5F34, 0x5F35, +0x5F36, 0x5F37, 0x5F38, 0x5F3B, +0x5F3D, 0x5F3E, 0x5F3F, 0x5F41, +0x5F42, 0x5F43, 0x5F44, 0x5F45, +0x5F46, 0x5F47, 0x5F48, 0x5F49, +0x5F4A, 0x5F4B, 0x5F4C, 0x5F4D, +0x5F4E, 0x5F4F, 0x5F51, 0x5F54, +0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, +0x5F5E, 0x5F5F, 0x5F60, 0x5F63, +0x5F65, 0x5F67, 0x5F68, 0x5F6B, +0x5F6E, 0x5F6F, 0x5F72, 0x5F74, +0x5F75, 0x5F76, 0x5F78, 0x5F7A, +0x5F7D, 0x5F7E, 0x5F7F, 0x5F83, +0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, +0x5F91, 0x5F93, 0x5F94, 0x5F96, +0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, +0x5F9F, 0x5FA0, 0x5FA2, 0x5FA3, +0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, +0x5FA9, 0x5FAB, 0x5FAC, 0x5FAF, +0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, +0x5FB4, 0x5FB6, 0x5FB8, 0x5FB9, +0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, +0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7, +0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, +0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA, +0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, +0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6, +0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, +0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4, +0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, +0x5FFC, 0x6007, 0x6008, 0x6009, +0x600B, 0x600C, 0x6010, 0x6011, +0x6013, 0x6017, 0x6018, 0x601A, +0x601E, 0x601F, 0x6022, 0x6023, +0x6024, 0x602C, 0x602D, 0x602E, +0x6030, 0x6031, 0x6032, 0x6033, +0x6034, 0x6036, 0x6037, 0x6038, +0x6039, 0x603A, 0x603D, 0x603E, +0x6040, 0x6044, 0x6045, 0x6046, +0x6047, 0x6048, 0x6049, 0x604A, +0x604C, 0x604E, 0x604F, 0x6051, +0x6053, 0x6054, 0x6056, 0x6057, +0x6058, 0x605B, 0x605C, 0x605E, +0x605F, 0x6060, 0x6061, 0x6065, +0x6066, 0x606E, 0x6071, 0x6072, +0x6074, 0x6075, 0x6077, 0x607E, +0x6080, 0x6081, 0x6082, 0x6085, +0x6086, 0x6087, 0x6088, 0x608A, +0x608B, 0x608E, 0x608F, 0x6090, +0x6091, 0x6093, 0x6095, 0x6097, +0x6098, 0x6099, 0x609C, 0x609E, +0x60A1, 0x60A2, 0x60A4, 0x60A5, +0x60A7, 0x60A9, 0x60AA, 0x60AE, +0x60B0, 0x60B3, 0x60B5, 0x60B6, +0x60B7, 0x60B9, 0x60BA, 0x60BD, +0x60BE, 0x60BF, 0x60C0, 0x60C1, +0x60C2, 0x60C3, 0x60C4, 0x60C7, +0x60C8, 0x60C9, 0x60CC, 0x60CD, +0x60CE, 0x60CF, 0x60D0, 0x60D2, +0x60D3, 0x60D4, 0x60D6, 0x60D7, +0x60D9, 0x60DB, 0x60DE, 0x60E1, +0x60E2, 0x60E3, 0x60E4, 0x60E5, +0x60EA, 0x60F1, 0x60F2, 0x60F5, +0x60F7, 0x60F8, 0x60FB, 0x60FC, +0x60FD, 0x60FE, 0x60FF, 0x6102, +0x6103, 0x6104, 0x6105, 0x6107, +0x610A, 0x610B, 0x610C, 0x6110, +0x6111, 0x6112, 0x6113, 0x6114, +0x6116, 0x6117, 0x6118, 0x6119, +0x611B, 0x611C, 0x611D, 0x611E, +0x6121, 0x6122, 0x6125, 0x6128, +0x6129, 0x612A, 0x612C, 0x612D, +0x612E, 0x612F, 0x6130, 0x6131, +0x6132, 0x6133, 0x6134, 0x6135, +0x6136, 0x6137, 0x6138, 0x6139, +0x613A, 0x613B, 0x613C, 0x613D, +0x613E, 0x6140, 0x6141, 0x6142, +0x6143, 0x6144, 0x6145, 0x6146, +0x6147, 0x6149, 0x614B, 0x614D, +0x614F, 0x6150, 0x6152, 0x6153, +0x6154, 0x6156, 0x6157, 0x6158, +0x6159, 0x615A, 0x615B, 0x615C, +0x615E, 0x615F, 0x6160, 0x6161, +0x6163, 0x6164, 0x6165, 0x6166, +0x6169, 0x616A, 0x616B, 0x616C, +0x616D, 0x616E, 0x616F, 0x6171, +0x6172, 0x6173, 0x6174, 0x6176, +0x6178, 0x6179, 0x617A, 0x617B, +0x617C, 0x617D, 0x617E, 0x617F, +0x6180, 0x6181, 0x6182, 0x6183, +0x6184, 0x6185, 0x6186, 0x6187, +0x6188, 0x6189, 0x618A, 0x618C, +0x618D, 0x618F, 0x6190, 0x6191, +0x6192, 0x6193, 0x6195, 0x6196, +0x6197, 0x6198, 0x6199, 0x619A, +0x619B, 0x619C, 0x619E, 0x619F, +0x61A0, 0x61A1, 0x61A2, 0x61A3, +0x61A4, 0x61A5, 0x61A6, 0x61AA, +0x61AB, 0x61AD, 0x61AE, 0x61AF, +0x61B0, 0x61B1, 0x61B2, 0x61B3, +0x61B4, 0x61B5, 0x61B6, 0x61B8, +0x61B9, 0x61BA, 0x61BB, 0x61BC, +0x61BD, 0x61BF, 0x61C0, 0x61C1, +0x61C3, 0x61C4, 0x61C5, 0x61C6, +0x61C7, 0x61C9, 0x61CC, 0x61CD, +0x61CE, 0x61CF, 0x61D0, 0x61D3, +0x61D5, 0x61D6, 0x61D7, 0x61D8, +0x61D9, 0x61DA, 0x61DB, 0x61DC, +0x61DD, 0x61DE, 0x61DF, 0x61E0, +0x61E1, 0x61E2, 0x61E3, 0x61E4, +0x61E5, 0x61E7, 0x61E8, 0x61E9, +0x61EA, 0x61EB, 0x61EC, 0x61ED, +0x61EE, 0x61EF, 0x61F0, 0x61F1, +0x61F2, 0x61F3, 0x61F4, 0x61F6, +0x61F7, 0x61F8, 0x61F9, 0x61FA, +0x61FB, 0x61FC, 0x61FD, 0x61FE, +0x6200, 0x6201, 0x6202, 0x6203, +0x6204, 0x6205, 0x6207, 0x6209, +0x6213, 0x6214, 0x6219, 0x621C, +0x621D, 0x621E, 0x6220, 0x6223, +0x6226, 0x6227, 0x6228, 0x6229, +0x622B, 0x622D, 0x622F, 0x6230, +0x6231, 0x6232, 0x6235, 0x6236, +0x6238, 0x6239, 0x623A, 0x623B, +0x623C, 0x6242, 0x6244, 0x6245, +0x6246, 0x624A, 0x624F, 0x6250, +0x6255, 0x6256, 0x6257, 0x6259, +0x625A, 0x625C, 0x625D, 0x625E, +0x625F, 0x6260, 0x6261, 0x6262, +0x6264, 0x6265, 0x6268, 0x6271, +0x6272, 0x6274, 0x6275, 0x6277, +0x6278, 0x627A, 0x627B, 0x627D, +0x6281, 0x6282, 0x6283, 0x6285, +0x6286, 0x6287, 0x6288, 0x628B, +0x628C, 0x628D, 0x628E, 0x628F, +0x6290, 0x6294, 0x6299, 0x629C, +0x629D, 0x629E, 0x62A3, 0x62A6, +0x62A7, 0x62A9, 0x62AA, 0x62AD, +0x62AE, 0x62AF, 0x62B0, 0x62B2, +0x62B3, 0x62B4, 0x62B6, 0x62B7, +0x62B8, 0x62BA, 0x62BE, 0x62C0, +0x62C1, 0x62C3, 0x62CB, 0x62CF, +0x62D1, 0x62D5, 0x62DD, 0x62DE, +0x62E0, 0x62E1, 0x62E4, 0x62EA, +0x62EB, 0x62F0, 0x62F2, 0x62F5, +0x62F8, 0x62F9, 0x62FA, 0x62FB, +0x6300, 0x6303, 0x6304, 0x6305, +0x6306, 0x630A, 0x630B, 0x630C, +0x630D, 0x630F, 0x6310, 0x6312, +0x6313, 0x6314, 0x6315, 0x6317, +0x6318, 0x6319, 0x631C, 0x6326, +0x6327, 0x6329, 0x632C, 0x632D, +0x632E, 0x6330, 0x6331, 0x6333, +0x6334, 0x6335, 0x6336, 0x6337, +0x6338, 0x633B, 0x633C, 0x633E, +0x633F, 0x6340, 0x6341, 0x6344, +0x6347, 0x6348, 0x634A, 0x6351, +0x6352, 0x6353, 0x6354, 0x6356, +0x6357, 0x6358, 0x6359, 0x635A, +0x635B, 0x635C, 0x635D, 0x6360, +0x6364, 0x6365, 0x6366, 0x6368, +0x636A, 0x636B, 0x636C, 0x636F, +0x6370, 0x6372, 0x6373, 0x6374, +0x6375, 0x6378, 0x6379, 0x637C, +0x637D, 0x637E, 0x637F, 0x6381, +0x6383, 0x6384, 0x6385, 0x6386, +0x638B, 0x638D, 0x6391, 0x6393, +0x6394, 0x6395, 0x6397, 0x6399, +0x639A, 0x639B, 0x639C, 0x639D, +0x639E, 0x639F, 0x63A1, 0x63A4, +0x63A6, 0x63AB, 0x63AF, 0x63B1, +0x63B2, 0x63B5, 0x63B6, 0x63B9, +0x63BB, 0x63BD, 0x63BF, 0x63C0, +0x63C1, 0x63C2, 0x63C3, 0x63C5, +0x63C7, 0x63C8, 0x63CA, 0x63CB, +0x63CC, 0x63D1, 0x63D3, 0x63D4, +0x63D5, 0x63D7, 0x63D8, 0x63D9, +0x63DA, 0x63DB, 0x63DC, 0x63DD, +0x63DF, 0x63E2, 0x63E4, 0x63E5, +0x63E6, 0x63E7, 0x63E8, 0x63EB, +0x63EC, 0x63EE, 0x63EF, 0x63F0, +0x63F1, 0x63F3, 0x63F5, 0x63F7, +0x63F9, 0x63FA, 0x63FB, 0x63FC, +0x63FE, 0x6403, 0x6404, 0x6406, +0x6407, 0x6408, 0x6409, 0x640A, +0x640D, 0x640E, 0x6411, 0x6412, +0x6415, 0x6416, 0x6417, 0x6418, +0x6419, 0x641A, 0x641D, 0x641F, +0x6422, 0x6423, 0x6424, 0x6425, +0x6427, 0x6428, 0x6429, 0x642B, +0x642E, 0x642F, 0x6430, 0x6431, +0x6432, 0x6433, 0x6435, 0x6436, +0x6437, 0x6438, 0x6439, 0x643B, +0x643C, 0x643E, 0x6440, 0x6442, +0x6443, 0x6449, 0x644B, 0x644C, +0x644D, 0x644E, 0x644F, 0x6450, +0x6451, 0x6453, 0x6455, 0x6456, +0x6457, 0x6459, 0x645A, 0x645B, +0x645C, 0x645D, 0x645F, 0x6460, +0x6461, 0x6462, 0x6463, 0x6464, +0x6465, 0x6466, 0x6468, 0x646A, +0x646B, 0x646C, 0x646E, 0x646F, +0x6470, 0x6471, 0x6472, 0x6473, +0x6474, 0x6475, 0x6476, 0x6477, +0x647B, 0x647C, 0x647D, 0x647E, +0x647F, 0x6480, 0x6481, 0x6483, +0x6486, 0x6488, 0x6489, 0x648A, +0x648B, 0x648C, 0x648D, 0x648E, +0x648F, 0x6490, 0x6493, 0x6494, +0x6497, 0x6498, 0x649A, 0x649B, +0x649C, 0x649D, 0x649F, 0x64A0, +0x64A1, 0x64A2, 0x64A3, 0x64A5, +0x64A6, 0x64A7, 0x64A8, 0x64AA, +0x64AB, 0x64AF, 0x64B1, 0x64B2, +0x64B3, 0x64B4, 0x64B6, 0x64B9, +0x64BB, 0x64BD, 0x64BE, 0x64BF, +0x64C1, 0x64C3, 0x64C4, 0x64C6, +0x64C7, 0x64C8, 0x64C9, 0x64CA, +0x64CB, 0x64CC, 0x64CF, 0x64D1, +0x64D3, 0x64D4, 0x64D5, 0x64D6, +0x64D9, 0x64DA, 0x64DB, 0x64DC, +0x64DD, 0x64DF, 0x64E0, 0x64E1, +0x64E3, 0x64E5, 0x64E7, 0x64E8, +0x64E9, 0x64EA, 0x64EB, 0x64EC, +0x64ED, 0x64EE, 0x64EF, 0x64F0, +0x64F1, 0x64F2, 0x64F3, 0x64F4, +0x64F5, 0x64F6, 0x64F7, 0x64F8, +0x64F9, 0x64FA, 0x64FB, 0x64FC, +0x64FD, 0x64FE, 0x64FF, 0x6501, +0x6502, 0x6503, 0x6504, 0x6505, +0x6506, 0x6507, 0x6508, 0x650A, +0x650B, 0x650C, 0x650D, 0x650E, +0x650F, 0x6510, 0x6511, 0x6513, +0x6514, 0x6515, 0x6516, 0x6517, +0x6519, 0x651A, 0x651B, 0x651C, +0x651D, 0x651E, 0x651F, 0x6520, +0x6521, 0x6522, 0x6523, 0x6524, +0x6526, 0x6527, 0x6528, 0x6529, +0x652A, 0x652C, 0x652D, 0x6530, +0x6531, 0x6532, 0x6533, 0x6537, +0x653A, 0x653C, 0x653D, 0x6540, +0x6541, 0x6542, 0x6543, 0x6544, +0x6546, 0x6547, 0x654A, 0x654B, +0x654D, 0x654E, 0x6550, 0x6552, +0x6553, 0x6554, 0x6557, 0x6558, +0x655A, 0x655C, 0x655F, 0x6560, +0x6561, 0x6564, 0x6565, 0x6567, +0x6568, 0x6569, 0x656A, 0x656D, +0x656E, 0x656F, 0x6571, 0x6573, +0x6575, 0x6576, 0x6578, 0x6579, +0x657A, 0x657B, 0x657C, 0x657D, +0x657E, 0x657F, 0x6580, 0x6581, +0x6582, 0x6583, 0x6584, 0x6585, +0x6586, 0x6588, 0x6589, 0x658A, +0x658D, 0x658E, 0x658F, 0x6592, +0x6594, 0x6595, 0x6596, 0x6598, +0x659A, 0x659D, 0x659E, 0x65A0, +0x65A2, 0x65A3, 0x65A6, 0x65A8, +0x65AA, 0x65AC, 0x65AE, 0x65B1, +0x65B2, 0x65B3, 0x65B4, 0x65B5, +0x65B6, 0x65B7, 0x65B8, 0x65BA, +0x65BB, 0x65BE, 0x65BF, 0x65C0, +0x65C2, 0x65C7, 0x65C8, 0x65C9, +0x65CA, 0x65CD, 0x65D0, 0x65D1, +0x65D3, 0x65D4, 0x65D5, 0x65D8, +0x65D9, 0x65DA, 0x65DB, 0x65DC, +0x65DD, 0x65DE, 0x65DF, 0x65E1, +0x65E3, 0x65E4, 0x65EA, 0x65EB, +0x65F2, 0x65F3, 0x65F4, 0x65F5, +0x65F8, 0x65F9, 0x65FB, 0x65FC, +0x65FD, 0x65FE, 0x65FF, 0x6601, +0x6604, 0x6605, 0x6607, 0x6608, +0x6609, 0x660B, 0x660D, 0x6610, +0x6611, 0x6612, 0x6616, 0x6617, +0x6618, 0x661A, 0x661B, 0x661C, +0x661E, 0x6621, 0x6622, 0x6623, +0x6624, 0x6626, 0x6629, 0x662A, +0x662B, 0x662C, 0x662E, 0x6630, +0x6632, 0x6633, 0x6637, 0x6638, +0x6639, 0x663A, 0x663B, 0x663D, +0x663F, 0x6640, 0x6642, 0x6644, +0x6645, 0x6646, 0x6647, 0x6648, +0x6649, 0x664A, 0x664D, 0x664E, +0x6650, 0x6651, 0x6658, 0x6659, +0x665B, 0x665C, 0x665D, 0x665E, +0x6660, 0x6662, 0x6663, 0x6665, +0x6667, 0x6669, 0x666A, 0x666B, +0x666C, 0x666D, 0x6671, 0x6672, +0x6673, 0x6675, 0x6678, 0x6679, +0x667B, 0x667C, 0x667D, 0x667F, +0x6680, 0x6681, 0x6683, 0x6685, +0x6686, 0x6688, 0x6689, 0x668A, +0x668B, 0x668D, 0x668E, 0x668F, +0x6690, 0x6692, 0x6693, 0x6694, +0x6695, 0x6698, 0x6699, 0x669A, +0x669B, 0x669C, 0x669E, 0x669F, +0x66A0, 0x66A1, 0x66A2, 0x66A3, +0x66A4, 0x66A5, 0x66A6, 0x66A9, +0x66AA, 0x66AB, 0x66AC, 0x66AD, +0x66AF, 0x66B0, 0x66B1, 0x66B2, +0x66B3, 0x66B5, 0x66B6, 0x66B7, +0x66B8, 0x66BA, 0x66BB, 0x66BC, +0x66BD, 0x66BF, 0x66C0, 0x66C1, +0x66C2, 0x66C3, 0x66C4, 0x66C5, +0x66C6, 0x66C7, 0x66C8, 0x66C9, +0x66CA, 0x66CB, 0x66CC, 0x66CD, +0x66CE, 0x66CF, 0x66D0, 0x66D1, +0x66D2, 0x66D3, 0x66D4, 0x66D5, +0x66D6, 0x66D7, 0x66D8, 0x66DA, +0x66DE, 0x66DF, 0x66E0, 0x66E1, +0x66E2, 0x66E3, 0x66E4, 0x66E5, +0x66E7, 0x66E8, 0x66EA, 0x66EB, +0x66EC, 0x66ED, 0x66EE, 0x66EF, +0x66F1, 0x66F5, 0x66F6, 0x66F8, +0x66FA, 0x66FB, 0x66FD, 0x6701, +0x6702, 0x6703, 0x6704, 0x6705, +0x6706, 0x6707, 0x670C, 0x670E, +0x670F, 0x6711, 0x6712, 0x6713, +0x6716, 0x6718, 0x6719, 0x671A, +0x671C, 0x671E, 0x6720, 0x6721, +0x6722, 0x6723, 0x6724, 0x6725, +0x6727, 0x6729, 0x672E, 0x6730, +0x6732, 0x6733, 0x6736, 0x6737, +0x6738, 0x6739, 0x673B, 0x673C, +0x673E, 0x673F, 0x6741, 0x6744, +0x6745, 0x6747, 0x674A, 0x674B, +0x674D, 0x6752, 0x6754, 0x6755, +0x6757, 0x6758, 0x6759, 0x675A, +0x675B, 0x675D, 0x6762, 0x6763, +0x6764, 0x6766, 0x6767, 0x676B, +0x676C, 0x676E, 0x6771, 0x6774, +0x6776, 0x6778, 0x6779, 0x677A, +0x677B, 0x677D, 0x6780, 0x6782, +0x6783, 0x6785, 0x6786, 0x6788, +0x678A, 0x678C, 0x678D, 0x678E, +0x678F, 0x6791, 0x6792, 0x6793, +0x6794, 0x6796, 0x6799, 0x679B, +0x679F, 0x67A0, 0x67A1, 0x67A4, +0x67A6, 0x67A9, 0x67AC, 0x67AE, +0x67B1, 0x67B2, 0x67B4, 0x67B9, +0x67BA, 0x67BB, 0x67BC, 0x67BD, +0x67BE, 0x67BF, 0x67C0, 0x67C2, +0x67C5, 0x67C6, 0x67C7, 0x67C8, +0x67C9, 0x67CA, 0x67CB, 0x67CC, +0x67CD, 0x67CE, 0x67D5, 0x67D6, +0x67D7, 0x67DB, 0x67DF, 0x67E1, +0x67E3, 0x67E4, 0x67E6, 0x67E7, +0x67E8, 0x67EA, 0x67EB, 0x67ED, +0x67EE, 0x67F2, 0x67F5, 0x67F6, +0x67F7, 0x67F8, 0x67F9, 0x67FA, +0x67FB, 0x67FC, 0x67FE, 0x6801, +0x6802, 0x6803, 0x6804, 0x6806, +0x680D, 0x6810, 0x6812, 0x6814, +0x6815, 0x6818, 0x6819, 0x681A, +0x681B, 0x681C, 0x681E, 0x681F, +0x6820, 0x6822, 0x6823, 0x6824, +0x6825, 0x6826, 0x6827, 0x6828, +0x682B, 0x682C, 0x682D, 0x682E, +0x682F, 0x6830, 0x6831, 0x6834, +0x6835, 0x6836, 0x683A, 0x683B, +0x683F, 0x6847, 0x684B, 0x684D, +0x684F, 0x6852, 0x6856, 0x6857, +0x6858, 0x6859, 0x685A, 0x685B, +0x685C, 0x685D, 0x685E, 0x685F, +0x686A, 0x686C, 0x686D, 0x686E, +0x686F, 0x6870, 0x6871, 0x6872, +0x6873, 0x6875, 0x6878, 0x6879, +0x687A, 0x687B, 0x687C, 0x687D, +0x687E, 0x687F, 0x6880, 0x6882, +0x6884, 0x6887, 0x6888, 0x6889, +0x688A, 0x688B, 0x688C, 0x688D, +0x688E, 0x6890, 0x6891, 0x6892, +0x6894, 0x6895, 0x6896, 0x6898, +0x6899, 0x689A, 0x689B, 0x689C, +0x689D, 0x689E, 0x689F, 0x68A0, +0x68A1, 0x68A3, 0x68A4, 0x68A5, +0x68A9, 0x68AA, 0x68AB, 0x68AC, +0x68AE, 0x68B1, 0x68B2, 0x68B4, +0x68B6, 0x68B7, 0x68B8, 0x68B9, +0x68BA, 0x68BB, 0x68BC, 0x68BD, +0x68BE, 0x68BF, 0x68C1, 0x68C3, +0x68C4, 0x68C5, 0x68C6, 0x68C7, +0x68C8, 0x68CA, 0x68CC, 0x68CE, +0x68CF, 0x68D0, 0x68D1, 0x68D3, +0x68D4, 0x68D6, 0x68D7, 0x68D9, +0x68DB, 0x68DC, 0x68DD, 0x68DE, +0x68DF, 0x68E1, 0x68E2, 0x68E4, +0x68E5, 0x68E6, 0x68E7, 0x68E8, +0x68E9, 0x68EA, 0x68EB, 0x68EC, +0x68ED, 0x68EF, 0x68F2, 0x68F3, +0x68F4, 0x68F6, 0x68F7, 0x68F8, +0x68FB, 0x68FD, 0x68FE, 0x68FF, +0x6900, 0x6902, 0x6903, 0x6904, +0x6906, 0x6907, 0x6908, 0x6909, +0x690A, 0x690C, 0x690F, 0x6911, +0x6913, 0x6914, 0x6915, 0x6916, +0x6917, 0x6918, 0x6919, 0x691A, +0x691B, 0x691C, 0x691D, 0x691E, +0x6921, 0x6922, 0x6923, 0x6925, +0x6926, 0x6927, 0x6928, 0x6929, +0x692A, 0x692B, 0x692C, 0x692E, +0x692F, 0x6931, 0x6932, 0x6933, +0x6935, 0x6936, 0x6937, 0x6938, +0x693A, 0x693B, 0x693C, 0x693E, +0x6940, 0x6941, 0x6943, 0x6944, +0x6945, 0x6946, 0x6947, 0x6948, +0x6949, 0x694A, 0x694B, 0x694C, +0x694D, 0x694E, 0x694F, 0x6950, +0x6951, 0x6952, 0x6953, 0x6955, +0x6956, 0x6958, 0x6959, 0x695B, +0x695C, 0x695F, 0x6961, 0x6962, +0x6964, 0x6965, 0x6967, 0x6968, +0x6969, 0x696A, 0x696C, 0x696D, +0x696F, 0x6970, 0x6972, 0x6973, +0x6974, 0x6975, 0x6976, 0x697A, +0x697B, 0x697D, 0x697E, 0x697F, +0x6981, 0x6983, 0x6985, 0x698A, +0x698B, 0x698C, 0x698E, 0x698F, +0x6990, 0x6991, 0x6992, 0x6993, +0x6996, 0x6997, 0x6999, 0x699A, +0x699D, 0x699E, 0x699F, 0x69A0, +0x69A1, 0x69A2, 0x69A3, 0x69A4, +0x69A5, 0x69A6, 0x69A9, 0x69AA, +0x69AC, 0x69AE, 0x69AF, 0x69B0, +0x69B2, 0x69B3, 0x69B5, 0x69B6, +0x69B8, 0x69B9, 0x69BA, 0x69BC, +0x69BD, 0x69BE, 0x69BF, 0x69C0, +0x69C2, 0x69C3, 0x69C4, 0x69C5, +0x69C6, 0x69C7, 0x69C8, 0x69C9, +0x69CB, 0x69CD, 0x69CF, 0x69D1, +0x69D2, 0x69D3, 0x69D5, 0x69D6, +0x69D7, 0x69D8, 0x69D9, 0x69DA, +0x69DC, 0x69DD, 0x69DE, 0x69E1, +0x69E2, 0x69E3, 0x69E4, 0x69E5, +0x69E6, 0x69E7, 0x69E8, 0x69E9, +0x69EA, 0x69EB, 0x69EC, 0x69EE, +0x69EF, 0x69F0, 0x69F1, 0x69F3, +0x69F4, 0x69F5, 0x69F6, 0x69F7, +0x69F8, 0x69F9, 0x69FA, 0x69FB, +0x69FC, 0x69FE, 0x6A00, 0x6A01, +0x6A02, 0x6A03, 0x6A04, 0x6A05, +0x6A06, 0x6A07, 0x6A08, 0x6A09, +0x6A0B, 0x6A0C, 0x6A0D, 0x6A0E, +0x6A0F, 0x6A10, 0x6A11, 0x6A12, +0x6A13, 0x6A14, 0x6A15, 0x6A16, +0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, +0x6A1D, 0x6A1E, 0x6A20, 0x6A22, +0x6A23, 0x6A24, 0x6A25, 0x6A26, +0x6A27, 0x6A29, 0x6A2B, 0x6A2C, +0x6A2D, 0x6A2E, 0x6A30, 0x6A32, +0x6A33, 0x6A34, 0x6A36, 0x6A37, +0x6A38, 0x6A39, 0x6A3A, 0x6A3B, +0x6A3C, 0x6A3F, 0x6A40, 0x6A41, +0x6A42, 0x6A43, 0x6A45, 0x6A46, +0x6A48, 0x6A49, 0x6A4A, 0x6A4B, +0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, +0x6A51, 0x6A52, 0x6A53, 0x6A54, +0x6A55, 0x6A56, 0x6A57, 0x6A5A, +0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, +0x6A60, 0x6A62, 0x6A63, 0x6A64, +0x6A66, 0x6A67, 0x6A68, 0x6A69, +0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, +0x6A6E, 0x6A6F, 0x6A70, 0x6A72, +0x6A73, 0x6A74, 0x6A75, 0x6A76, +0x6A77, 0x6A78, 0x6A7A, 0x6A7B, +0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, +0x6A82, 0x6A83, 0x6A85, 0x6A86, +0x6A87, 0x6A88, 0x6A89, 0x6A8A, +0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, +0x6A92, 0x6A93, 0x6A94, 0x6A95, +0x6A96, 0x6A98, 0x6A99, 0x6A9A, +0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E, +0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, +0x6AA4, 0x6AA5, 0x6AA6, 0x6AA7, +0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, +0x6AAF, 0x6AB0, 0x6AB1, 0x6AB2, +0x6AB3, 0x6AB4, 0x6AB5, 0x6AB6, +0x6AB7, 0x6AB8, 0x6AB9, 0x6ABA, +0x6ABB, 0x6ABC, 0x6ABD, 0x6ABE, +0x6ABF, 0x6AC0, 0x6AC1, 0x6AC2, +0x6AC3, 0x6AC4, 0x6AC5, 0x6AC6, +0x6AC7, 0x6AC8, 0x6AC9, 0x6ACA, +0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, +0x6ACF, 0x6AD0, 0x6AD1, 0x6AD2, +0x6AD3, 0x6AD4, 0x6AD5, 0x6AD6, +0x6AD7, 0x6AD8, 0x6AD9, 0x6ADA, +0x6ADB, 0x6ADC, 0x6ADD, 0x6ADE, +0x6ADF, 0x6AE0, 0x6AE1, 0x6AE2, +0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, +0x6AE7, 0x6AE8, 0x6AE9, 0x6AEA, +0x6AEB, 0x6AEC, 0x6AED, 0x6AEE, +0x6AEF, 0x6AF0, 0x6AF1, 0x6AF2, +0x6AF3, 0x6AF4, 0x6AF5, 0x6AF6, +0x6AF7, 0x6AF8, 0x6AF9, 0x6AFA, +0x6AFB, 0x6AFC, 0x6AFD, 0x6AFE, +0x6AFF, 0x6B00, 0x6B01, 0x6B02, +0x6B03, 0x6B04, 0x6B05, 0x6B06, +0x6B07, 0x6B08, 0x6B09, 0x6B0A, +0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, +0x6B0F, 0x6B10, 0x6B11, 0x6B12, +0x6B13, 0x6B14, 0x6B15, 0x6B16, +0x6B17, 0x6B18, 0x6B19, 0x6B1A, +0x6B1B, 0x6B1C, 0x6B1D, 0x6B1E, +0x6B1F, 0x6B25, 0x6B26, 0x6B28, +0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, +0x6B2D, 0x6B2E, 0x6B2F, 0x6B30, +0x6B31, 0x6B33, 0x6B34, 0x6B35, +0x6B36, 0x6B38, 0x6B3B, 0x6B3C, +0x6B3D, 0x6B3F, 0x6B40, 0x6B41, +0x6B42, 0x6B44, 0x6B45, 0x6B48, +0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, +0x6B4F, 0x6B50, 0x6B51, 0x6B52, +0x6B53, 0x6B54, 0x6B55, 0x6B56, +0x6B57, 0x6B58, 0x6B5A, 0x6B5B, +0x6B5C, 0x6B5D, 0x6B5E, 0x6B5F, +0x6B60, 0x6B61, 0x6B68, 0x6B69, +0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, +0x6B6F, 0x6B70, 0x6B71, 0x6B72, +0x6B73, 0x6B74, 0x6B75, 0x6B76, +0x6B77, 0x6B78, 0x6B7A, 0x6B7D, +0x6B7E, 0x6B7F, 0x6B80, 0x6B85, +0x6B88, 0x6B8C, 0x6B8E, 0x6B8F, +0x6B90, 0x6B91, 0x6B94, 0x6B95, +0x6B97, 0x6B98, 0x6B99, 0x6B9C, +0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, +0x6BA2, 0x6BA3, 0x6BA4, 0x6BA5, +0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, +0x6BAB, 0x6BAC, 0x6BAD, 0x6BAE, +0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, +0x6BB6, 0x6BB8, 0x6BB9, 0x6BBA, +0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, +0x6BC0, 0x6BC3, 0x6BC4, 0x6BC6, +0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, +0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1, +0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, +0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2, +0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, +0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC, +0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, +0x6BF2, 0x6BF4, 0x6BF6, 0x6BF7, +0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, +0x6BFE, 0x6BFF, 0x6C00, 0x6C01, +0x6C02, 0x6C03, 0x6C04, 0x6C08, +0x6C09, 0x6C0A, 0x6C0B, 0x6C0C, +0x6C0E, 0x6C12, 0x6C17, 0x6C1C, +0x6C1D, 0x6C1E, 0x6C20, 0x6C23, +0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, +0x6C31, 0x6C33, 0x6C36, 0x6C37, +0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, +0x6C3E, 0x6C3F, 0x6C43, 0x6C44, +0x6C45, 0x6C48, 0x6C4B, 0x6C4C, +0x6C4D, 0x6C4E, 0x6C4F, 0x6C51, +0x6C52, 0x6C53, 0x6C56, 0x6C58, +0x6C59, 0x6C5A, 0x6C62, 0x6C63, +0x6C65, 0x6C66, 0x6C67, 0x6C6B, +0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, +0x6C71, 0x6C73, 0x6C75, 0x6C77, +0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, +0x6C7F, 0x6C80, 0x6C84, 0x6C87, +0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, +0x6C91, 0x6C92, 0x6C95, 0x6C96, +0x6C97, 0x6C98, 0x6C9A, 0x6C9C, +0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, +0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, +0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, +0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, +0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, +0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, +0x6CD1, 0x6CD2, 0x6CD8, 0x6CD9, +0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, +0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, +0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, +0x6CF9, 0x6CFF, 0x6D00, 0x6D02, +0x6D03, 0x6D05, 0x6D06, 0x6D08, +0x6D09, 0x6D0A, 0x6D0D, 0x6D0F, +0x6D10, 0x6D11, 0x6D13, 0x6D14, +0x6D15, 0x6D16, 0x6D18, 0x6D1C, +0x6D1D, 0x6D1F, 0x6D20, 0x6D21, +0x6D22, 0x6D23, 0x6D24, 0x6D26, +0x6D28, 0x6D29, 0x6D2C, 0x6D2D, +0x6D2F, 0x6D30, 0x6D34, 0x6D36, +0x6D37, 0x6D38, 0x6D3A, 0x6D3F, +0x6D40, 0x6D42, 0x6D44, 0x6D49, +0x6D4C, 0x6D50, 0x6D55, 0x6D56, +0x6D57, 0x6D58, 0x6D5B, 0x6D5D, +0x6D5F, 0x6D61, 0x6D62, 0x6D64, +0x6D65, 0x6D67, 0x6D68, 0x6D6B, +0x6D6C, 0x6D6D, 0x6D70, 0x6D71, +0x6D72, 0x6D73, 0x6D75, 0x6D76, +0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, +0x6D7E, 0x6D7F, 0x6D80, 0x6D81, +0x6D83, 0x6D84, 0x6D86, 0x6D87, +0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, +0x6D90, 0x6D92, 0x6D96, 0x6D97, +0x6D98, 0x6D99, 0x6D9A, 0x6D9C, +0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, +0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, +0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, +0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, +0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, +0x6DC9, 0x6DCA, 0x6DCD, 0x6DCE, +0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, +0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, +0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, +0x6DE3, 0x6DE5, 0x6DE7, 0x6DE8, +0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, +0x6DF0, 0x6DF2, 0x6DF4, 0x6DF5, +0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, +0x6DFE, 0x6DFF, 0x6E00, 0x6E01, +0x6E02, 0x6E03, 0x6E04, 0x6E06, +0x6E07, 0x6E08, 0x6E09, 0x6E0B, +0x6E0F, 0x6E12, 0x6E13, 0x6E15, +0x6E18, 0x6E19, 0x6E1B, 0x6E1C, +0x6E1E, 0x6E1F, 0x6E22, 0x6E26, +0x6E27, 0x6E28, 0x6E2A, 0x6E2C, +0x6E2E, 0x6E30, 0x6E31, 0x6E33, +0x6E35, 0x6E36, 0x6E37, 0x6E39, +0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, +0x6E3F, 0x6E40, 0x6E41, 0x6E42, +0x6E45, 0x6E46, 0x6E47, 0x6E48, +0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, +0x6E4F, 0x6E50, 0x6E51, 0x6E52, +0x6E55, 0x6E57, 0x6E59, 0x6E5A, +0x6E5C, 0x6E5D, 0x6E5E, 0x6E60, +0x6E61, 0x6E62, 0x6E63, 0x6E64, +0x6E65, 0x6E66, 0x6E67, 0x6E68, +0x6E69, 0x6E6A, 0x6E6C, 0x6E6D, +0x6E6F, 0x6E70, 0x6E71, 0x6E72, +0x6E73, 0x6E74, 0x6E75, 0x6E76, +0x6E77, 0x6E78, 0x6E79, 0x6E7A, +0x6E7B, 0x6E7C, 0x6E7D, 0x6E80, +0x6E81, 0x6E82, 0x6E84, 0x6E87, +0x6E88, 0x6E8A, 0x6E8B, 0x6E8C, +0x6E8D, 0x6E8E, 0x6E91, 0x6E92, +0x6E93, 0x6E94, 0x6E95, 0x6E96, +0x6E97, 0x6E99, 0x6E9A, 0x6E9B, +0x6E9D, 0x6E9E, 0x6EA0, 0x6EA1, +0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, +0x6EA9, 0x6EAB, 0x6EAC, 0x6EAD, +0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, +0x6EB8, 0x6EB9, 0x6EBC, 0x6EBE, +0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, +0x6EC5, 0x6EC6, 0x6EC8, 0x6EC9, +0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, +0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, +0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, +0x6EE3, 0x6EE7, 0x6EEA, 0x6EEB, +0x6EEC, 0x6EED, 0x6EEE, 0x6EEF, +0x6EF0, 0x6EF1, 0x6EF2, 0x6EF3, +0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8, +0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, +0x6EFE, 0x6EFF, 0x6F00, 0x6F01, +0x6F03, 0x6F04, 0x6F05, 0x6F07, +0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, +0x6F0D, 0x6F0E, 0x6F10, 0x6F11, +0x6F12, 0x6F16, 0x6F17, 0x6F18, +0x6F19, 0x6F1A, 0x6F1B, 0x6F1C, +0x6F1D, 0x6F1E, 0x6F1F, 0x6F21, +0x6F22, 0x6F23, 0x6F25, 0x6F26, +0x6F27, 0x6F28, 0x6F2C, 0x6F2E, +0x6F30, 0x6F32, 0x6F34, 0x6F35, +0x6F37, 0x6F38, 0x6F39, 0x6F3A, +0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, +0x6F40, 0x6F41, 0x6F42, 0x6F43, +0x6F44, 0x6F45, 0x6F48, 0x6F49, +0x6F4A, 0x6F4C, 0x6F4E, 0x6F4F, +0x6F50, 0x6F51, 0x6F52, 0x6F53, +0x6F54, 0x6F55, 0x6F56, 0x6F57, +0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, +0x6F5F, 0x6F60, 0x6F61, 0x6F63, +0x6F64, 0x6F65, 0x6F67, 0x6F68, +0x6F69, 0x6F6A, 0x6F6B, 0x6F6C, +0x6F6F, 0x6F70, 0x6F71, 0x6F73, +0x6F75, 0x6F76, 0x6F77, 0x6F79, +0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, +0x6F80, 0x6F81, 0x6F82, 0x6F83, +0x6F85, 0x6F86, 0x6F87, 0x6F8A, +0x6F8B, 0x6F8F, 0x6F90, 0x6F91, +0x6F92, 0x6F93, 0x6F94, 0x6F95, +0x6F96, 0x6F97, 0x6F98, 0x6F99, +0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, +0x6F9F, 0x6FA0, 0x6FA2, 0x6FA3, +0x6FA4, 0x6FA5, 0x6FA6, 0x6FA8, +0x6FA9, 0x6FAA, 0x6FAB, 0x6FAC, +0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, +0x6FB1, 0x6FB2, 0x6FB4, 0x6FB5, +0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, +0x6FBC, 0x6FBD, 0x6FBE, 0x6FBF, +0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, +0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, +0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, +0x6FCF, 0x6FD0, 0x6FD3, 0x6FD4, +0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, +0x6FD9, 0x6FDA, 0x6FDB, 0x6FDC, +0x6FDD, 0x6FDF, 0x6FE2, 0x6FE3, +0x6FE4, 0x6FE5, 0x6FE6, 0x6FE7, +0x6FE8, 0x6FE9, 0x6FEA, 0x6FEB, +0x6FEC, 0x6FED, 0x6FF0, 0x6FF1, +0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, +0x6FF6, 0x6FF7, 0x6FF8, 0x6FF9, +0x6FFA, 0x6FFB, 0x6FFC, 0x6FFD, +0x6FFE, 0x6FFF, 0x7000, 0x7001, +0x7002, 0x7003, 0x7004, 0x7005, +0x7006, 0x7007, 0x7008, 0x7009, +0x700A, 0x700B, 0x700C, 0x700D, +0x700E, 0x700F, 0x7010, 0x7012, +0x7013, 0x7014, 0x7015, 0x7016, +0x7017, 0x7018, 0x7019, 0x701C, +0x701D, 0x701E, 0x701F, 0x7020, +0x7021, 0x7022, 0x7024, 0x7025, +0x7026, 0x7027, 0x7028, 0x7029, +0x702A, 0x702B, 0x702C, 0x702D, +0x702E, 0x702F, 0x7030, 0x7031, +0x7032, 0x7033, 0x7034, 0x7036, +0x7037, 0x7038, 0x703A, 0x703B, +0x703C, 0x703D, 0x703E, 0x703F, +0x7040, 0x7041, 0x7042, 0x7043, +0x7044, 0x7045, 0x7046, 0x7047, +0x7048, 0x7049, 0x704A, 0x704B, +0x704D, 0x704E, 0x7050, 0x7051, +0x7052, 0x7053, 0x7054, 0x7055, +0x7056, 0x7057, 0x7058, 0x7059, +0x705A, 0x705B, 0x705C, 0x705D, +0x705F, 0x7060, 0x7061, 0x7062, +0x7063, 0x7064, 0x7065, 0x7066, +0x7067, 0x7068, 0x7069, 0x706A, +0x706E, 0x7071, 0x7072, 0x7073, +0x7074, 0x7077, 0x7079, 0x707A, +0x707B, 0x707D, 0x7081, 0x7082, +0x7083, 0x7084, 0x7086, 0x7087, +0x7088, 0x708B, 0x708C, 0x708D, +0x708F, 0x7090, 0x7091, 0x7093, +0x7097, 0x7098, 0x709A, 0x709B, +0x709E, 0x709F, 0x70A0, 0x70A1, +0x70A2, 0x70A3, 0x70A4, 0x70A5, +0x70A6, 0x70A7, 0x70A8, 0x70A9, +0x70AA, 0x70B0, 0x70B2, 0x70B4, +0x70B5, 0x70B6, 0x70BA, 0x70BE, +0x70BF, 0x70C4, 0x70C5, 0x70C6, +0x70C7, 0x70C9, 0x70CB, 0x70CC, +0x70CD, 0x70CE, 0x70CF, 0x70D0, +0x70D1, 0x70D2, 0x70D3, 0x70D4, +0x70D5, 0x70D6, 0x70D7, 0x70DA, +0x70DC, 0x70DD, 0x70DE, 0x70E0, +0x70E1, 0x70E2, 0x70E3, 0x70E5, +0x70EA, 0x70EE, 0x70F0, 0x70F1, +0x70F2, 0x70F3, 0x70F4, 0x70F5, +0x70F6, 0x70F8, 0x70FA, 0x70FB, +0x70FC, 0x70FE, 0x70FF, 0x7100, +0x7101, 0x7102, 0x7103, 0x7104, +0x7105, 0x7106, 0x7107, 0x7108, +0x710B, 0x710C, 0x710D, 0x710E, +0x710F, 0x7111, 0x7112, 0x7114, +0x7117, 0x711B, 0x711C, 0x711D, +0x711E, 0x711F, 0x7120, 0x7121, +0x7122, 0x7123, 0x7124, 0x7125, +0x7127, 0x7128, 0x7129, 0x712A, +0x712B, 0x712C, 0x712D, 0x712E, +0x7132, 0x7133, 0x7134, 0x7135, +0x7137, 0x7138, 0x7139, 0x713A, +0x713B, 0x713C, 0x713D, 0x713E, +0x713F, 0x7140, 0x7141, 0x7142, +0x7143, 0x7144, 0x7146, 0x7147, +0x7148, 0x7149, 0x714B, 0x714D, +0x714F, 0x7150, 0x7151, 0x7152, +0x7153, 0x7154, 0x7155, 0x7156, +0x7157, 0x7158, 0x7159, 0x715A, +0x715B, 0x715D, 0x715F, 0x7160, +0x7161, 0x7162, 0x7163, 0x7165, +0x7169, 0x716A, 0x716B, 0x716C, +0x716D, 0x716F, 0x7170, 0x7171, +0x7174, 0x7175, 0x7176, 0x7177, +0x7179, 0x717B, 0x717C, 0x717E, +0x717F, 0x7180, 0x7181, 0x7182, +0x7183, 0x7185, 0x7186, 0x7187, +0x7188, 0x7189, 0x718B, 0x718C, +0x718D, 0x718E, 0x7190, 0x7191, +0x7192, 0x7193, 0x7195, 0x7196, +0x7197, 0x719A, 0x719B, 0x719C, +0x719D, 0x719E, 0x71A1, 0x71A2, +0x71A3, 0x71A4, 0x71A5, 0x71A6, +0x71A7, 0x71A9, 0x71AA, 0x71AB, +0x71AD, 0x71AE, 0x71AF, 0x71B0, +0x71B1, 0x71B2, 0x71B4, 0x71B6, +0x71B7, 0x71B8, 0x71BA, 0x71BB, +0x71BC, 0x71BD, 0x71BE, 0x71BF, +0x71C0, 0x71C1, 0x71C2, 0x71C4, +0x71C5, 0x71C6, 0x71C7, 0x71C8, +0x71C9, 0x71CA, 0x71CB, 0x71CC, +0x71CD, 0x71CF, 0x71D0, 0x71D1, +0x71D2, 0x71D3, 0x71D6, 0x71D7, +0x71D8, 0x71D9, 0x71DA, 0x71DB, +0x71DC, 0x71DD, 0x71DE, 0x71DF, +0x71E1, 0x71E2, 0x71E3, 0x71E4, +0x71E6, 0x71E8, 0x71E9, 0x71EA, +0x71EB, 0x71EC, 0x71ED, 0x71EF, +0x71F0, 0x71F1, 0x71F2, 0x71F3, +0x71F4, 0x71F5, 0x71F6, 0x71F7, +0x71F8, 0x71FA, 0x71FB, 0x71FC, +0x71FD, 0x71FE, 0x71FF, 0x7200, +0x7201, 0x7202, 0x7203, 0x7204, +0x7205, 0x7207, 0x7208, 0x7209, +0x720A, 0x720B, 0x720C, 0x720D, +0x720E, 0x720F, 0x7210, 0x7211, +0x7212, 0x7213, 0x7214, 0x7215, +0x7216, 0x7217, 0x7218, 0x7219, +0x721A, 0x721B, 0x721C, 0x721E, +0x721F, 0x7220, 0x7221, 0x7222, +0x7223, 0x7224, 0x7225, 0x7226, +0x7227, 0x7229, 0x722B, 0x722D, +0x722E, 0x722F, 0x7232, 0x7233, +0x7234, 0x723A, 0x723C, 0x723E, +0x7240, 0x7241, 0x7242, 0x7243, +0x7244, 0x7245, 0x7246, 0x7249, +0x724A, 0x724B, 0x724E, 0x724F, +0x7250, 0x7251, 0x7253, 0x7254, +0x7255, 0x7257, 0x7258, 0x725A, +0x725C, 0x725E, 0x7260, 0x7263, +0x7264, 0x7265, 0x7268, 0x726A, +0x726B, 0x726C, 0x726D, 0x7270, +0x7271, 0x7273, 0x7274, 0x7276, +0x7277, 0x7278, 0x727B, 0x727C, +0x727D, 0x7282, 0x7283, 0x7285, +0x7286, 0x7287, 0x7288, 0x7289, +0x728C, 0x728E, 0x7290, 0x7291, +0x7293, 0x7294, 0x7295, 0x7296, +0x7297, 0x7298, 0x7299, 0x729A, +0x729B, 0x729C, 0x729D, 0x729E, +0x72A0, 0x72A1, 0x72A2, 0x72A3, +0x72A4, 0x72A5, 0x72A6, 0x72A7, +0x72A8, 0x72A9, 0x72AA, 0x72AB, +0x72AE, 0x72B1, 0x72B2, 0x72B3, +0x72B5, 0x72BA, 0x72BB, 0x72BC, +0x72BD, 0x72BE, 0x72BF, 0x72C0, +0x72C5, 0x72C6, 0x72C7, 0x72C9, +0x72CA, 0x72CB, 0x72CC, 0x72CF, +0x72D1, 0x72D3, 0x72D4, 0x72D5, +0x72D6, 0x72D8, 0x72DA, 0x72DB, +0xE4C6, 0xE4C7, 0xE4C8, 0xE4C9, +0xE4CA, 0xE4CB, 0xE4CC, 0xE4CD, +0xE4CE, 0xE4CF, 0xE4D0, 0xE4D1, +0xE4D2, 0xE4D3, 0xE4D4, 0xE4D5, +0xE4D6, 0xE4D7, 0xE4D8, 0xE4D9, +0xE4DA, 0xE4DB, 0xE4DC, 0xE4DD, +0xE4DE, 0xE4DF, 0xE4E0, 0xE4E1, +0xE4E2, 0xE4E3, 0xE4E4, 0xE4E5, +0xE4E6, 0xE4E7, 0xE4E8, 0xE4E9, +0xE4EA, 0xE4EB, 0xE4EC, 0xE4ED, +0xE4EE, 0xE4EF, 0xE4F0, 0xE4F1, +0xE4F2, 0xE4F3, 0xE4F4, 0xE4F5, +0xE4F6, 0xE4F7, 0xE4F8, 0xE4F9, +0xE4FA, 0xE4FB, 0xE4FC, 0xE4FD, +0xE4FE, 0xE4FF, 0xE500, 0xE501, +0xE502, 0xE503, 0xE504, 0xE505, +0xE506, 0xE507, 0xE508, 0xE509, +0xE50A, 0xE50B, 0xE50C, 0xE50D, +0xE50E, 0xE50F, 0xE510, 0xE511, +0xE512, 0xE513, 0xE514, 0xE515, +0xE516, 0xE517, 0xE518, 0xE519, +0xE51A, 0xE51B, 0xE51C, 0xE51D, +0xE51E, 0xE51F, 0xE520, 0xE521, +0xE522, 0xE523, 0xE524, 0xE525, +0x3000, 0x3001, 0x3002, 0x00B7, +0x02C9, 0x02C7, 0x00A8, 0x3003, +0x3005, 0x2014, 0xFF5E, 0x2016, +0x2026, 0x2018, 0x2019, 0x201C, +0x201D, 0x3014, 0x3015, 0x3008, +0x3009, 0x300A, 0x300B, 0x300C, +0x300D, 0x300E, 0x300F, 0x3016, +0x3017, 0x3010, 0x3011, 0x00B1, +0x00D7, 0x00F7, 0x2236, 0x2227, +0x2228, 0x2211, 0x220F, 0x222A, +0x2229, 0x2208, 0x2237, 0x221A, +0x22A5, 0x2225, 0x2220, 0x2312, +0x2299, 0x222B, 0x222E, 0x2261, +0x224C, 0x2248, 0x223D, 0x221D, +0x2260, 0x226E, 0x226F, 0x2264, +0x2265, 0x221E, 0x2235, 0x2234, +0x2642, 0x2640, 0x00B0, 0x2032, +0x2033, 0x2103, 0xFF04, 0x00A4, +0xFFE0, 0xFFE1, 0x2030, 0x00A7, +0x2116, 0x2606, 0x2605, 0x25CB, +0x25CF, 0x25CE, 0x25C7, 0x25C6, +0x25A1, 0x25A0, 0x25B3, 0x25B2, +0x203B, 0x2192, 0x2190, 0x2191, +0x2193, 0x3013, 0xE526, 0xE527, +0xE528, 0xE529, 0xE52A, 0xE52B, +0xE52C, 0xE52D, 0xE52E, 0xE52F, +0xE530, 0xE531, 0xE532, 0xE533, +0xE534, 0xE535, 0xE536, 0xE537, +0xE538, 0xE539, 0xE53A, 0xE53B, +0xE53C, 0xE53D, 0xE53E, 0xE53F, +0xE540, 0xE541, 0xE542, 0xE543, +0xE544, 0xE545, 0xE546, 0xE547, +0xE548, 0xE549, 0xE54A, 0xE54B, +0xE54C, 0xE54D, 0xE54E, 0xE54F, +0xE550, 0xE551, 0xE552, 0xE553, +0xE554, 0xE555, 0xE556, 0xE557, +0xE558, 0xE559, 0xE55A, 0xE55B, +0xE55C, 0xE55D, 0xE55E, 0xE55F, +0xE560, 0xE561, 0xE562, 0xE563, +0xE564, 0xE565, 0xE566, 0xE567, +0xE568, 0xE569, 0xE56A, 0xE56B, +0xE56C, 0xE56D, 0xE56E, 0xE56F, +0xE570, 0xE571, 0xE572, 0xE573, +0xE574, 0xE575, 0xE576, 0xE577, +0xE578, 0xE579, 0xE57A, 0xE57B, +0xE57C, 0xE57D, 0xE57E, 0xE57F, +0xE580, 0xE581, 0xE582, 0xE583, +0xE584, 0xE585, 0x2170, 0x2171, +0x2172, 0x2173, 0x2174, 0x2175, +0x2176, 0x2177, 0x2178, 0x2179, +0xE766, 0xE767, 0xE768, 0xE769, +0xE76A, 0xE76B, 0x2488, 0x2489, +0x248A, 0x248B, 0x248C, 0x248D, +0x248E, 0x248F, 0x2490, 0x2491, +0x2492, 0x2493, 0x2494, 0x2495, +0x2496, 0x2497, 0x2498, 0x2499, +0x249A, 0x249B, 0x2474, 0x2475, +0x2476, 0x2477, 0x2478, 0x2479, +0x247A, 0x247B, 0x247C, 0x247D, +0x247E, 0x247F, 0x2480, 0x2481, +0x2482, 0x2483, 0x2484, 0x2485, +0x2486, 0x2487, 0x2460, 0x2461, +0x2462, 0x2463, 0x2464, 0x2465, +0x2466, 0x2467, 0x2468, 0x2469, +0x20AC, 0xE76D, 0x3220, 0x3221, +0x3222, 0x3223, 0x3224, 0x3225, +0x3226, 0x3227, 0x3228, 0x3229, +0xE76E, 0xE76F, 0x2160, 0x2161, +0x2162, 0x2163, 0x2164, 0x2165, +0x2166, 0x2167, 0x2168, 0x2169, +0x216A, 0x216B, 0xE770, 0xE771, +0xE586, 0xE587, 0xE588, 0xE589, +0xE58A, 0xE58B, 0xE58C, 0xE58D, +0xE58E, 0xE58F, 0xE590, 0xE591, +0xE592, 0xE593, 0xE594, 0xE595, +0xE596, 0xE597, 0xE598, 0xE599, +0xE59A, 0xE59B, 0xE59C, 0xE59D, +0xE59E, 0xE59F, 0xE5A0, 0xE5A1, +0xE5A2, 0xE5A3, 0xE5A4, 0xE5A5, +0xE5A6, 0xE5A7, 0xE5A8, 0xE5A9, +0xE5AA, 0xE5AB, 0xE5AC, 0xE5AD, +0xE5AE, 0xE5AF, 0xE5B0, 0xE5B1, +0xE5B2, 0xE5B3, 0xE5B4, 0xE5B5, +0xE5B6, 0xE5B7, 0xE5B8, 0xE5B9, +0xE5BA, 0xE5BB, 0xE5BC, 0xE5BD, +0xE5BE, 0xE5BF, 0xE5C0, 0xE5C1, +0xE5C2, 0xE5C3, 0xE5C4, 0xE5C5, +0xE5C6, 0xE5C7, 0xE5C8, 0xE5C9, +0xE5CA, 0xE5CB, 0xE5CC, 0xE5CD, +0xE5CE, 0xE5CF, 0xE5D0, 0xE5D1, +0xE5D2, 0xE5D3, 0xE5D4, 0xE5D5, +0xE5D6, 0xE5D7, 0xE5D8, 0xE5D9, +0xE5DA, 0xE5DB, 0xE5DC, 0xE5DD, +0xE5DE, 0xE5DF, 0xE5E0, 0xE5E1, +0xE5E2, 0xE5E3, 0xE5E4, 0x3000, +0xFF01, 0xFF02, 0xFF03, 0xFFE5, +0xFF05, 0xFF06, 0xFF07, 0xFF08, +0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, +0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, +0xFF11, 0xFF12, 0xFF13, 0xFF14, +0xFF15, 0xFF16, 0xFF17, 0xFF18, +0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, +0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, +0xFF21, 0xFF22, 0xFF23, 0xFF24, +0xFF25, 0xFF26, 0xFF27, 0xFF28, +0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, +0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, +0xFF31, 0xFF32, 0xFF33, 0xFF34, +0xFF35, 0xFF36, 0xFF37, 0xFF38, +0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, +0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, +0xFF41, 0xFF42, 0xFF43, 0xFF44, +0xFF45, 0xFF46, 0xFF47, 0xFF48, +0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, +0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, +0xFF51, 0xFF52, 0xFF53, 0xFF54, +0xFF55, 0xFF56, 0xFF57, 0xFF58, +0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, +0xFF5D, 0xFFE3, 0xE5E6, 0xE5E7, +0xE5E8, 0xE5E9, 0xE5EA, 0xE5EB, +0xE5EC, 0xE5ED, 0xE5EE, 0xE5EF, +0xE5F0, 0xE5F1, 0xE5F2, 0xE5F3, +0xE5F4, 0xE5F5, 0xE5F6, 0xE5F7, +0xE5F8, 0xE5F9, 0xE5FA, 0xE5FB, +0xE5FC, 0xE5FD, 0xE5FE, 0xE5FF, +0xE600, 0xE601, 0xE602, 0xE603, +0xE604, 0xE605, 0xE606, 0xE607, +0xE608, 0xE609, 0xE60A, 0xE60B, +0xE60C, 0xE60D, 0xE60E, 0xE60F, +0xE610, 0xE611, 0xE612, 0xE613, +0xE614, 0xE615, 0xE616, 0xE617, +0xE618, 0xE619, 0xE61A, 0xE61B, +0xE61C, 0xE61D, 0xE61E, 0xE61F, +0xE620, 0xE621, 0xE622, 0xE623, +0xE624, 0xE625, 0xE626, 0xE627, +0xE628, 0xE629, 0xE62A, 0xE62B, +0xE62C, 0xE62D, 0xE62E, 0xE62F, +0xE630, 0xE631, 0xE632, 0xE633, +0xE634, 0xE635, 0xE636, 0xE637, +0xE638, 0xE639, 0xE63A, 0xE63B, +0xE63C, 0xE63D, 0xE63E, 0xE63F, +0xE640, 0xE641, 0xE642, 0xE643, +0xE644, 0xE645, 0x3041, 0x3042, +0x3043, 0x3044, 0x3045, 0x3046, +0x3047, 0x3048, 0x3049, 0x304A, +0x304B, 0x304C, 0x304D, 0x304E, +0x304F, 0x3050, 0x3051, 0x3052, +0x3053, 0x3054, 0x3055, 0x3056, +0x3057, 0x3058, 0x3059, 0x305A, +0x305B, 0x305C, 0x305D, 0x305E, +0x305F, 0x3060, 0x3061, 0x3062, +0x3063, 0x3064, 0x3065, 0x3066, +0x3067, 0x3068, 0x3069, 0x306A, +0x306B, 0x306C, 0x306D, 0x306E, +0x306F, 0x3070, 0x3071, 0x3072, +0x3073, 0x3074, 0x3075, 0x3076, +0x3077, 0x3078, 0x3079, 0x307A, +0x307B, 0x307C, 0x307D, 0x307E, +0x307F, 0x3080, 0x3081, 0x3082, +0x3083, 0x3084, 0x3085, 0x3086, +0x3087, 0x3088, 0x3089, 0x308A, +0x308B, 0x308C, 0x308D, 0x308E, +0x308F, 0x3090, 0x3091, 0x3092, +0x3093, 0xE772, 0xE773, 0xE774, +0xE775, 0xE776, 0xE777, 0xE778, +0xE779, 0xE77A, 0xE77B, 0xE77C, +0xE646, 0xE647, 0xE648, 0xE649, +0xE64A, 0xE64B, 0xE64C, 0xE64D, +0xE64E, 0xE64F, 0xE650, 0xE651, +0xE652, 0xE653, 0xE654, 0xE655, +0xE656, 0xE657, 0xE658, 0xE659, +0xE65A, 0xE65B, 0xE65C, 0xE65D, +0xE65E, 0xE65F, 0xE660, 0xE661, +0xE662, 0xE663, 0xE664, 0xE665, +0xE666, 0xE667, 0xE668, 0xE669, +0xE66A, 0xE66B, 0xE66C, 0xE66D, +0xE66E, 0xE66F, 0xE670, 0xE671, +0xE672, 0xE673, 0xE674, 0xE675, +0xE676, 0xE677, 0xE678, 0xE679, +0xE67A, 0xE67B, 0xE67C, 0xE67D, +0xE67E, 0xE67F, 0xE680, 0xE681, +0xE682, 0xE683, 0xE684, 0xE685, +0xE686, 0xE687, 0xE688, 0xE689, +0xE68A, 0xE68B, 0xE68C, 0xE68D, +0xE68E, 0xE68F, 0xE690, 0xE691, +0xE692, 0xE693, 0xE694, 0xE695, +0xE696, 0xE697, 0xE698, 0xE699, +0xE69A, 0xE69B, 0xE69C, 0xE69D, +0xE69E, 0xE69F, 0xE6A0, 0xE6A1, +0xE6A2, 0xE6A3, 0xE6A4, 0xE6A5, +0x30A1, 0x30A2, 0x30A3, 0x30A4, +0x30A5, 0x30A6, 0x30A7, 0x30A8, +0x30A9, 0x30AA, 0x30AB, 0x30AC, +0x30AD, 0x30AE, 0x30AF, 0x30B0, +0x30B1, 0x30B2, 0x30B3, 0x30B4, +0x30B5, 0x30B6, 0x30B7, 0x30B8, +0x30B9, 0x30BA, 0x30BB, 0x30BC, +0x30BD, 0x30BE, 0x30BF, 0x30C0, +0x30C1, 0x30C2, 0x30C3, 0x30C4, +0x30C5, 0x30C6, 0x30C7, 0x30C8, +0x30C9, 0x30CA, 0x30CB, 0x30CC, +0x30CD, 0x30CE, 0x30CF, 0x30D0, +0x30D1, 0x30D2, 0x30D3, 0x30D4, +0x30D5, 0x30D6, 0x30D7, 0x30D8, +0x30D9, 0x30DA, 0x30DB, 0x30DC, +0x30DD, 0x30DE, 0x30DF, 0x30E0, +0x30E1, 0x30E2, 0x30E3, 0x30E4, +0x30E5, 0x30E6, 0x30E7, 0x30E8, +0x30E9, 0x30EA, 0x30EB, 0x30EC, +0x30ED, 0x30EE, 0x30EF, 0x30F0, +0x30F1, 0x30F2, 0x30F3, 0x30F4, +0x30F5, 0x30F6, 0xE77D, 0xE77E, +0xE77F, 0xE780, 0xE781, 0xE782, +0xE783, 0xE784, 0xE6A6, 0xE6A7, +0xE6A8, 0xE6A9, 0xE6AA, 0xE6AB, +0xE6AC, 0xE6AD, 0xE6AE, 0xE6AF, +0xE6B0, 0xE6B1, 0xE6B2, 0xE6B3, +0xE6B4, 0xE6B5, 0xE6B6, 0xE6B7, +0xE6B8, 0xE6B9, 0xE6BA, 0xE6BB, +0xE6BC, 0xE6BD, 0xE6BE, 0xE6BF, +0xE6C0, 0xE6C1, 0xE6C2, 0xE6C3, +0xE6C4, 0xE6C5, 0xE6C6, 0xE6C7, +0xE6C8, 0xE6C9, 0xE6CA, 0xE6CB, +0xE6CC, 0xE6CD, 0xE6CE, 0xE6CF, +0xE6D0, 0xE6D1, 0xE6D2, 0xE6D3, +0xE6D4, 0xE6D5, 0xE6D6, 0xE6D7, +0xE6D8, 0xE6D9, 0xE6DA, 0xE6DB, +0xE6DC, 0xE6DD, 0xE6DE, 0xE6DF, +0xE6E0, 0xE6E1, 0xE6E2, 0xE6E3, +0xE6E4, 0xE6E5, 0xE6E6, 0xE6E7, +0xE6E8, 0xE6E9, 0xE6EA, 0xE6EB, +0xE6EC, 0xE6ED, 0xE6EE, 0xE6EF, +0xE6F0, 0xE6F1, 0xE6F2, 0xE6F3, +0xE6F4, 0xE6F5, 0xE6F6, 0xE6F7, +0xE6F8, 0xE6F9, 0xE6FA, 0xE6FB, +0xE6FC, 0xE6FD, 0xE6FE, 0xE6FF, +0xE700, 0xE701, 0xE702, 0xE703, +0xE704, 0xE705, 0x0391, 0x0392, +0x0393, 0x0394, 0x0395, 0x0396, +0x0397, 0x0398, 0x0399, 0x039A, +0x039B, 0x039C, 0x039D, 0x039E, +0x039F, 0x03A0, 0x03A1, 0x03A3, +0x03A4, 0x03A5, 0x03A6, 0x03A7, +0x03A8, 0x03A9, 0xE785, 0xE786, +0xE787, 0xE788, 0xE789, 0xE78A, +0xE78B, 0xE78C, 0x03B1, 0x03B2, +0x03B3, 0x03B4, 0x03B5, 0x03B6, +0x03B7, 0x03B8, 0x03B9, 0x03BA, +0x03BB, 0x03BC, 0x03BD, 0x03BE, +0x03BF, 0x03C0, 0x03C1, 0x03C3, +0x03C4, 0x03C5, 0x03C6, 0x03C7, +0x03C8, 0x03C9, 0xE78D, 0xE78E, +0xE78F, 0xE790, 0xE791, 0xE792, +0xE793, 0xFE35, 0xFE36, 0xFE39, +0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, +0xFE3E, 0xFE41, 0xFE42, 0xFE43, +0xFE44, 0xE794, 0xE795, 0xFE3B, +0xFE3C, 0xFE37, 0xFE38, 0xFE31, +0xE796, 0xFE33, 0xFE34, 0xE797, +0xE798, 0xE799, 0xE79A, 0xE79B, +0xE79C, 0xE79D, 0xE79E, 0xE79F, +0xE706, 0xE707, 0xE708, 0xE709, +0xE70A, 0xE70B, 0xE70C, 0xE70D, +0xE70E, 0xE70F, 0xE710, 0xE711, +0xE712, 0xE713, 0xE714, 0xE715, +0xE716, 0xE717, 0xE718, 0xE719, +0xE71A, 0xE71B, 0xE71C, 0xE71D, +0xE71E, 0xE71F, 0xE720, 0xE721, +0xE722, 0xE723, 0xE724, 0xE725, +0xE726, 0xE727, 0xE728, 0xE729, +0xE72A, 0xE72B, 0xE72C, 0xE72D, +0xE72E, 0xE72F, 0xE730, 0xE731, +0xE732, 0xE733, 0xE734, 0xE735, +0xE736, 0xE737, 0xE738, 0xE739, +0xE73A, 0xE73B, 0xE73C, 0xE73D, +0xE73E, 0xE73F, 0xE740, 0xE741, +0xE742, 0xE743, 0xE744, 0xE745, +0xE746, 0xE747, 0xE748, 0xE749, +0xE74A, 0xE74B, 0xE74C, 0xE74D, +0xE74E, 0xE74F, 0xE750, 0xE751, +0xE752, 0xE753, 0xE754, 0xE755, +0xE756, 0xE757, 0xE758, 0xE759, +0xE75A, 0xE75B, 0xE75C, 0xE75D, +0xE75E, 0xE75F, 0xE760, 0xE761, +0xE762, 0xE763, 0xE764, 0xE765, +0x0410, 0x0411, 0x0412, 0x0413, +0x0414, 0x0415, 0x0401, 0x0416, +0x0417, 0x0418, 0x0419, 0x041A, +0x041B, 0x041C, 0x041D, 0x041E, +0x041F, 0x0420, 0x0421, 0x0422, +0x0423, 0x0424, 0x0425, 0x0426, +0x0427, 0x0428, 0x0429, 0x042A, +0x042B, 0x042C, 0x042D, 0x042E, +0x042F, 0xE7A0, 0xE7A1, 0xE7A2, +0xE7A3, 0xE7A4, 0xE7A5, 0xE7A6, +0xE7A7, 0xE7A8, 0xE7A9, 0xE7AA, +0xE7AB, 0xE7AC, 0xE7AD, 0xE7AE, +0x0430, 0x0431, 0x0432, 0x0433, +0x0434, 0x0435, 0x0451, 0x0436, +0x0437, 0x0438, 0x0439, 0x043A, +0x043B, 0x043C, 0x043D, 0x043E, +0x043F, 0x0440, 0x0441, 0x0442, +0x0443, 0x0444, 0x0445, 0x0446, +0x0447, 0x0448, 0x0449, 0x044A, +0x044B, 0x044C, 0x044D, 0x044E, +0x044F, 0xE7AF, 0xE7B0, 0xE7B1, +0xE7B2, 0xE7B3, 0xE7B4, 0xE7B5, +0xE7B6, 0xE7B7, 0xE7B8, 0xE7B9, +0xE7BA, 0xE7BB, 0x02CA, 0x02CB, +0x02D9, 0x2013, 0x2015, 0x2025, +0x2035, 0x2105, 0x2109, 0x2196, +0x2197, 0x2198, 0x2199, 0x2215, +0x221F, 0x2223, 0x2252, 0x2266, +0x2267, 0x22BF, 0x2550, 0x2551, +0x2552, 0x2553, 0x2554, 0x2555, +0x2556, 0x2557, 0x2558, 0x2559, +0x255A, 0x255B, 0x255C, 0x255D, +0x255E, 0x255F, 0x2560, 0x2561, +0x2562, 0x2563, 0x2564, 0x2565, +0x2566, 0x2567, 0x2568, 0x2569, +0x256A, 0x256B, 0x256C, 0x256D, +0x256E, 0x256F, 0x2570, 0x2571, +0x2572, 0x2573, 0x2581, 0x2582, +0x2583, 0x2584, 0x2585, 0x2586, +0x2587, 0x2588, 0x2589, 0x258A, +0x258B, 0x258C, 0x258D, 0x258E, +0x258F, 0x2593, 0x2594, 0x2595, +0x25BC, 0x25BD, 0x25E2, 0x25E3, +0x25E4, 0x25E5, 0x2609, 0x2295, +0x3012, 0x301D, 0x301E, 0xE7BC, +0xE7BD, 0xE7BE, 0xE7BF, 0xE7C0, +0xE7C1, 0xE7C2, 0xE7C3, 0xE7C4, +0xE7C5, 0xE7C6, 0x0101, 0x00E1, +0x01CE, 0x00E0, 0x0113, 0x00E9, +0x011B, 0x00E8, 0x012B, 0x00ED, +0x01D0, 0x00EC, 0x014D, 0x00F3, +0x01D2, 0x00F2, 0x016B, 0x00FA, +0x01D4, 0x00F9, 0x01D6, 0x01D8, +0x01DA, 0x01DC, 0x00FC, 0x00EA, +0x0251, 0x1E3F, 0x0144, 0x0148, +0x01F9, 0x0261, 0xE7C9, 0xE7CA, +0xE7CB, 0xE7CC, 0x3105, 0x3106, +0x3107, 0x3108, 0x3109, 0x310A, +0x310B, 0x310C, 0x310D, 0x310E, +0x310F, 0x3110, 0x3111, 0x3112, +0x3113, 0x3114, 0x3115, 0x3116, +0x3117, 0x3118, 0x3119, 0x311A, +0x311B, 0x311C, 0x311D, 0x311E, +0x311F, 0x3120, 0x3121, 0x3122, +0x3123, 0x3124, 0x3125, 0x3126, +0x3127, 0x3128, 0x3129, 0xE7CD, +0xE7CE, 0xE7CF, 0xE7D0, 0xE7D1, +0xE7D2, 0xE7D3, 0xE7D4, 0xE7D5, +0xE7D6, 0xE7D7, 0xE7D8, 0xE7D9, +0xE7DA, 0xE7DB, 0xE7DC, 0xE7DD, +0xE7DE, 0xE7DF, 0xE7E0, 0xE7E1, +0x3021, 0x3022, 0x3023, 0x3024, +0x3025, 0x3026, 0x3027, 0x3028, +0x3029, 0x32A3, 0x338E, 0x338F, +0x339C, 0x339D, 0x339E, 0x33A1, +0x33C4, 0x33CE, 0x33D1, 0x33D2, +0x33D5, 0xFE30, 0xFFE2, 0xFFE4, +0xE7E2, 0x2121, 0x3231, 0xE7E3, +0x2010, 0xE7E4, 0xE7E5, 0xE7E6, +0x30FC, 0x309B, 0x309C, 0x30FD, +0x30FE, 0x3006, 0x309D, 0x309E, +0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, +0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, +0xFE51, 0xFE52, 0xFE54, 0xFE55, +0xFE56, 0xFE57, 0xFE59, 0xFE5A, +0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, +0xFE5F, 0xFE60, 0xFE61, 0xFE62, +0xFE63, 0xFE64, 0xFE65, 0xFE66, +0xFE68, 0xFE69, 0xFE6A, 0xFE6B, +0x303E, 0x2FF0, 0x2FF1, 0x2FF2, +0x2FF3, 0x2FF4, 0x2FF5, 0x2FF6, +0x2FF7, 0x2FF8, 0x2FF9, 0x2FFA, +0x2FFB, 0x3007, 0xE7F4, 0xE7F5, +0xE7F6, 0xE7F7, 0xE7F8, 0xE7F9, +0xE7FA, 0xE7FB, 0xE7FC, 0xE7FD, +0xE7FE, 0xE7FF, 0xE800, 0x2500, +0x2501, 0x2502, 0x2503, 0x2504, +0x2505, 0x2506, 0x2507, 0x2508, +0x2509, 0x250A, 0x250B, 0x250C, +0x250D, 0x250E, 0x250F, 0x2510, +0x2511, 0x2512, 0x2513, 0x2514, +0x2515, 0x2516, 0x2517, 0x2518, +0x2519, 0x251A, 0x251B, 0x251C, +0x251D, 0x251E, 0x251F, 0x2520, +0x2521, 0x2522, 0x2523, 0x2524, +0x2525, 0x2526, 0x2527, 0x2528, +0x2529, 0x252A, 0x252B, 0x252C, +0x252D, 0x252E, 0x252F, 0x2530, +0x2531, 0x2532, 0x2533, 0x2534, +0x2535, 0x2536, 0x2537, 0x2538, +0x2539, 0x253A, 0x253B, 0x253C, +0x253D, 0x253E, 0x253F, 0x2540, +0x2541, 0x2542, 0x2543, 0x2544, +0x2545, 0x2546, 0x2547, 0x2548, +0x2549, 0x254A, 0x254B, 0xE801, +0xE802, 0xE803, 0xE804, 0xE805, +0xE806, 0xE807, 0xE808, 0xE809, +0xE80A, 0xE80B, 0xE80C, 0xE80D, +0xE80E, 0xE80F, 0x72DC, 0x72DD, +0x72DF, 0x72E2, 0x72E3, 0x72E4, +0x72E5, 0x72E6, 0x72E7, 0x72EA, +0x72EB, 0x72F5, 0x72F6, 0x72F9, +0x72FD, 0x72FE, 0x72FF, 0x7300, +0x7302, 0x7304, 0x7305, 0x7306, +0x7307, 0x7308, 0x7309, 0x730B, +0x730C, 0x730D, 0x730F, 0x7310, +0x7311, 0x7312, 0x7314, 0x7318, +0x7319, 0x731A, 0x731F, 0x7320, +0x7323, 0x7324, 0x7326, 0x7327, +0x7328, 0x732D, 0x732F, 0x7330, +0x7332, 0x7333, 0x7335, 0x7336, +0x733A, 0x733B, 0x733C, 0x733D, +0x7340, 0x7341, 0x7342, 0x7343, +0x7344, 0x7345, 0x7346, 0x7347, +0x7348, 0x7349, 0x734A, 0x734B, +0x734C, 0x734E, 0x734F, 0x7351, +0x7353, 0x7354, 0x7355, 0x7356, +0x7358, 0x7359, 0x735A, 0x735B, +0x735C, 0x735D, 0x735E, 0x735F, +0x7361, 0x7362, 0x7363, 0x7364, +0x7365, 0x7366, 0x7367, 0x7368, +0x7369, 0x736A, 0x736B, 0x736E, +0x7370, 0x7371, 0xE000, 0xE001, +0xE002, 0xE003, 0xE004, 0xE005, +0xE006, 0xE007, 0xE008, 0xE009, +0xE00A, 0xE00B, 0xE00C, 0xE00D, +0xE00E, 0xE00F, 0xE010, 0xE011, +0xE012, 0xE013, 0xE014, 0xE015, +0xE016, 0xE017, 0xE018, 0xE019, +0xE01A, 0xE01B, 0xE01C, 0xE01D, +0xE01E, 0xE01F, 0xE020, 0xE021, +0xE022, 0xE023, 0xE024, 0xE025, +0xE026, 0xE027, 0xE028, 0xE029, +0xE02A, 0xE02B, 0xE02C, 0xE02D, +0xE02E, 0xE02F, 0xE030, 0xE031, +0xE032, 0xE033, 0xE034, 0xE035, +0xE036, 0xE037, 0xE038, 0xE039, +0xE03A, 0xE03B, 0xE03C, 0xE03D, +0xE03E, 0xE03F, 0xE040, 0xE041, +0xE042, 0xE043, 0xE044, 0xE045, +0xE046, 0xE047, 0xE048, 0xE049, +0xE04A, 0xE04B, 0xE04C, 0xE04D, +0xE04E, 0xE04F, 0xE050, 0xE051, +0xE052, 0xE053, 0xE054, 0xE055, +0xE056, 0xE057, 0xE058, 0xE059, +0xE05A, 0xE05B, 0xE05C, 0xE05D, +0x7372, 0x7373, 0x7374, 0x7375, +0x7376, 0x7377, 0x7378, 0x7379, +0x737A, 0x737B, 0x737C, 0x737D, +0x737F, 0x7380, 0x7381, 0x7382, +0x7383, 0x7385, 0x7386, 0x7388, +0x738A, 0x738C, 0x738D, 0x738F, +0x7390, 0x7392, 0x7393, 0x7394, +0x7395, 0x7397, 0x7398, 0x7399, +0x739A, 0x739C, 0x739D, 0x739E, +0x73A0, 0x73A1, 0x73A3, 0x73A4, +0x73A5, 0x73A6, 0x73A7, 0x73A8, +0x73AA, 0x73AC, 0x73AD, 0x73B1, +0x73B4, 0x73B5, 0x73B6, 0x73B8, +0x73B9, 0x73BC, 0x73BD, 0x73BE, +0x73BF, 0x73C1, 0x73C3, 0x73C4, +0x73C5, 0x73C6, 0x73C7, 0x73CB, +0x73CC, 0x73CE, 0x73D2, 0x73D3, +0x73D4, 0x73D5, 0x73D6, 0x73D7, +0x73D8, 0x73DA, 0x73DB, 0x73DC, +0x73DD, 0x73DF, 0x73E1, 0x73E2, +0x73E3, 0x73E4, 0x73E6, 0x73E8, +0x73EA, 0x73EB, 0x73EC, 0x73EE, +0x73EF, 0x73F0, 0x73F1, 0x73F3, +0x73F4, 0x73F5, 0x73F6, 0x73F7, +0xE05E, 0xE05F, 0xE060, 0xE061, +0xE062, 0xE063, 0xE064, 0xE065, +0xE066, 0xE067, 0xE068, 0xE069, +0xE06A, 0xE06B, 0xE06C, 0xE06D, +0xE06E, 0xE06F, 0xE070, 0xE071, +0xE072, 0xE073, 0xE074, 0xE075, +0xE076, 0xE077, 0xE078, 0xE079, +0xE07A, 0xE07B, 0xE07C, 0xE07D, +0xE07E, 0xE07F, 0xE080, 0xE081, +0xE082, 0xE083, 0xE084, 0xE085, +0xE086, 0xE087, 0xE088, 0xE089, +0xE08A, 0xE08B, 0xE08C, 0xE08D, +0xE08E, 0xE08F, 0xE090, 0xE091, +0xE092, 0xE093, 0xE094, 0xE095, +0xE096, 0xE097, 0xE098, 0xE099, +0xE09A, 0xE09B, 0xE09C, 0xE09D, +0xE09E, 0xE09F, 0xE0A0, 0xE0A1, +0xE0A2, 0xE0A3, 0xE0A4, 0xE0A5, +0xE0A6, 0xE0A7, 0xE0A8, 0xE0A9, +0xE0AA, 0xE0AB, 0xE0AC, 0xE0AD, +0xE0AE, 0xE0AF, 0xE0B0, 0xE0B1, +0xE0B2, 0xE0B3, 0xE0B4, 0xE0B5, +0xE0B6, 0xE0B7, 0xE0B8, 0xE0B9, +0xE0BA, 0xE0BB, 0x73F8, 0x73F9, +0x73FA, 0x73FB, 0x73FC, 0x73FD, +0x73FE, 0x73FF, 0x7400, 0x7401, +0x7402, 0x7404, 0x7407, 0x7408, +0x740B, 0x740C, 0x740D, 0x740E, +0x7411, 0x7412, 0x7413, 0x7414, +0x7415, 0x7416, 0x7417, 0x7418, +0x7419, 0x741C, 0x741D, 0x741E, +0x741F, 0x7420, 0x7421, 0x7423, +0x7424, 0x7427, 0x7429, 0x742B, +0x742D, 0x742F, 0x7431, 0x7432, +0x7437, 0x7438, 0x7439, 0x743A, +0x743B, 0x743D, 0x743E, 0x743F, +0x7440, 0x7442, 0x7443, 0x7444, +0x7445, 0x7446, 0x7447, 0x7448, +0x7449, 0x744A, 0x744B, 0x744C, +0x744D, 0x744E, 0x744F, 0x7450, +0x7451, 0x7452, 0x7453, 0x7454, +0x7456, 0x7458, 0x745D, 0x7460, +0x7461, 0x7462, 0x7463, 0x7464, +0x7465, 0x7466, 0x7467, 0x7468, +0x7469, 0x746A, 0x746B, 0x746C, +0x746E, 0x746F, 0x7471, 0x7472, +0x7473, 0x7474, 0x7475, 0x7478, +0x7479, 0x747A, 0xE0BC, 0xE0BD, +0xE0BE, 0xE0BF, 0xE0C0, 0xE0C1, +0xE0C2, 0xE0C3, 0xE0C4, 0xE0C5, +0xE0C6, 0xE0C7, 0xE0C8, 0xE0C9, +0xE0CA, 0xE0CB, 0xE0CC, 0xE0CD, +0xE0CE, 0xE0CF, 0xE0D0, 0xE0D1, +0xE0D2, 0xE0D3, 0xE0D4, 0xE0D5, +0xE0D6, 0xE0D7, 0xE0D8, 0xE0D9, +0xE0DA, 0xE0DB, 0xE0DC, 0xE0DD, +0xE0DE, 0xE0DF, 0xE0E0, 0xE0E1, +0xE0E2, 0xE0E3, 0xE0E4, 0xE0E5, +0xE0E6, 0xE0E7, 0xE0E8, 0xE0E9, +0xE0EA, 0xE0EB, 0xE0EC, 0xE0ED, +0xE0EE, 0xE0EF, 0xE0F0, 0xE0F1, +0xE0F2, 0xE0F3, 0xE0F4, 0xE0F5, +0xE0F6, 0xE0F7, 0xE0F8, 0xE0F9, +0xE0FA, 0xE0FB, 0xE0FC, 0xE0FD, +0xE0FE, 0xE0FF, 0xE100, 0xE101, +0xE102, 0xE103, 0xE104, 0xE105, +0xE106, 0xE107, 0xE108, 0xE109, +0xE10A, 0xE10B, 0xE10C, 0xE10D, +0xE10E, 0xE10F, 0xE110, 0xE111, +0xE112, 0xE113, 0xE114, 0xE115, +0xE116, 0xE117, 0xE118, 0xE119, +0x747B, 0x747C, 0x747D, 0x747F, +0x7482, 0x7484, 0x7485, 0x7486, +0x7488, 0x7489, 0x748A, 0x748C, +0x748D, 0x748F, 0x7491, 0x7492, +0x7493, 0x7494, 0x7495, 0x7496, +0x7497, 0x7498, 0x7499, 0x749A, +0x749B, 0x749D, 0x749F, 0x74A0, +0x74A1, 0x74A2, 0x74A3, 0x74A4, +0x74A5, 0x74A6, 0x74AA, 0x74AB, +0x74AC, 0x74AD, 0x74AE, 0x74AF, +0x74B0, 0x74B1, 0x74B2, 0x74B3, +0x74B4, 0x74B5, 0x74B6, 0x74B7, +0x74B8, 0x74B9, 0x74BB, 0x74BC, +0x74BD, 0x74BE, 0x74BF, 0x74C0, +0x74C1, 0x74C2, 0x74C3, 0x74C4, +0x74C5, 0x74C6, 0x74C7, 0x74C8, +0x74C9, 0x74CA, 0x74CB, 0x74CC, +0x74CD, 0x74CE, 0x74CF, 0x74D0, +0x74D1, 0x74D3, 0x74D4, 0x74D5, +0x74D6, 0x74D7, 0x74D8, 0x74D9, +0x74DA, 0x74DB, 0x74DD, 0x74DF, +0x74E1, 0x74E5, 0x74E7, 0x74E8, +0x74E9, 0x74EA, 0x74EB, 0x74EC, +0x74ED, 0x74F0, 0x74F1, 0x74F2, +0xE11A, 0xE11B, 0xE11C, 0xE11D, +0xE11E, 0xE11F, 0xE120, 0xE121, +0xE122, 0xE123, 0xE124, 0xE125, +0xE126, 0xE127, 0xE128, 0xE129, +0xE12A, 0xE12B, 0xE12C, 0xE12D, +0xE12E, 0xE12F, 0xE130, 0xE131, +0xE132, 0xE133, 0xE134, 0xE135, +0xE136, 0xE137, 0xE138, 0xE139, +0xE13A, 0xE13B, 0xE13C, 0xE13D, +0xE13E, 0xE13F, 0xE140, 0xE141, +0xE142, 0xE143, 0xE144, 0xE145, +0xE146, 0xE147, 0xE148, 0xE149, +0xE14A, 0xE14B, 0xE14C, 0xE14D, +0xE14E, 0xE14F, 0xE150, 0xE151, +0xE152, 0xE153, 0xE154, 0xE155, +0xE156, 0xE157, 0xE158, 0xE159, +0xE15A, 0xE15B, 0xE15C, 0xE15D, +0xE15E, 0xE15F, 0xE160, 0xE161, +0xE162, 0xE163, 0xE164, 0xE165, +0xE166, 0xE167, 0xE168, 0xE169, +0xE16A, 0xE16B, 0xE16C, 0xE16D, +0xE16E, 0xE16F, 0xE170, 0xE171, +0xE172, 0xE173, 0xE174, 0xE175, +0xE176, 0xE177, 0x74F3, 0x74F5, +0x74F8, 0x74F9, 0x74FA, 0x74FB, +0x74FC, 0x74FD, 0x74FE, 0x7500, +0x7501, 0x7502, 0x7503, 0x7505, +0x7506, 0x7507, 0x7508, 0x7509, +0x750A, 0x750B, 0x750C, 0x750E, +0x7510, 0x7512, 0x7514, 0x7515, +0x7516, 0x7517, 0x751B, 0x751D, +0x751E, 0x7520, 0x7521, 0x7522, +0x7523, 0x7524, 0x7526, 0x7527, +0x752A, 0x752E, 0x7534, 0x7536, +0x7539, 0x753C, 0x753D, 0x753F, +0x7541, 0x7542, 0x7543, 0x7544, +0x7546, 0x7547, 0x7549, 0x754A, +0x754D, 0x7550, 0x7551, 0x7552, +0x7553, 0x7555, 0x7556, 0x7557, +0x7558, 0x755D, 0x755E, 0x755F, +0x7560, 0x7561, 0x7562, 0x7563, +0x7564, 0x7567, 0x7568, 0x7569, +0x756B, 0x756C, 0x756D, 0x756E, +0x756F, 0x7570, 0x7571, 0x7573, +0x7575, 0x7576, 0x7577, 0x757A, +0x757B, 0x757C, 0x757D, 0x757E, +0x7580, 0x7581, 0x7582, 0x7584, +0x7585, 0x7587, 0xE178, 0xE179, +0xE17A, 0xE17B, 0xE17C, 0xE17D, +0xE17E, 0xE17F, 0xE180, 0xE181, +0xE182, 0xE183, 0xE184, 0xE185, +0xE186, 0xE187, 0xE188, 0xE189, +0xE18A, 0xE18B, 0xE18C, 0xE18D, +0xE18E, 0xE18F, 0xE190, 0xE191, +0xE192, 0xE193, 0xE194, 0xE195, +0xE196, 0xE197, 0xE198, 0xE199, +0xE19A, 0xE19B, 0xE19C, 0xE19D, +0xE19E, 0xE19F, 0xE1A0, 0xE1A1, +0xE1A2, 0xE1A3, 0xE1A4, 0xE1A5, +0xE1A6, 0xE1A7, 0xE1A8, 0xE1A9, +0xE1AA, 0xE1AB, 0xE1AC, 0xE1AD, +0xE1AE, 0xE1AF, 0xE1B0, 0xE1B1, +0xE1B2, 0xE1B3, 0xE1B4, 0xE1B5, +0xE1B6, 0xE1B7, 0xE1B8, 0xE1B9, +0xE1BA, 0xE1BB, 0xE1BC, 0xE1BD, +0xE1BE, 0xE1BF, 0xE1C0, 0xE1C1, +0xE1C2, 0xE1C3, 0xE1C4, 0xE1C5, +0xE1C6, 0xE1C7, 0xE1C8, 0xE1C9, +0xE1CA, 0xE1CB, 0xE1CC, 0xE1CD, +0xE1CE, 0xE1CF, 0xE1D0, 0xE1D1, +0xE1D2, 0xE1D3, 0xE1D4, 0xE1D5, +0x7588, 0x7589, 0x758A, 0x758C, +0x758D, 0x758E, 0x7590, 0x7593, +0x7595, 0x7598, 0x759B, 0x759C, +0x759E, 0x75A2, 0x75A6, 0x75A7, +0x75A8, 0x75A9, 0x75AA, 0x75AD, +0x75B6, 0x75B7, 0x75BA, 0x75BB, +0x75BF, 0x75C0, 0x75C1, 0x75C6, +0x75CB, 0x75CC, 0x75CE, 0x75CF, +0x75D0, 0x75D1, 0x75D3, 0x75D7, +0x75D9, 0x75DA, 0x75DC, 0x75DD, +0x75DF, 0x75E0, 0x75E1, 0x75E5, +0x75E9, 0x75EC, 0x75ED, 0x75EE, +0x75EF, 0x75F2, 0x75F3, 0x75F5, +0x75F6, 0x75F7, 0x75F8, 0x75FA, +0x75FB, 0x75FD, 0x75FE, 0x7602, +0x7604, 0x7606, 0x7607, 0x7608, +0x7609, 0x760B, 0x760D, 0x760E, +0x760F, 0x7611, 0x7612, 0x7613, +0x7614, 0x7616, 0x761A, 0x761C, +0x761D, 0x761E, 0x7621, 0x7623, +0x7627, 0x7628, 0x762C, 0x762E, +0x762F, 0x7631, 0x7632, 0x7636, +0x7637, 0x7639, 0x763A, 0x763B, +0x763D, 0x7641, 0x7642, 0x7644, +0xE1D6, 0xE1D7, 0xE1D8, 0xE1D9, +0xE1DA, 0xE1DB, 0xE1DC, 0xE1DD, +0xE1DE, 0xE1DF, 0xE1E0, 0xE1E1, +0xE1E2, 0xE1E3, 0xE1E4, 0xE1E5, +0xE1E6, 0xE1E7, 0xE1E8, 0xE1E9, +0xE1EA, 0xE1EB, 0xE1EC, 0xE1ED, +0xE1EE, 0xE1EF, 0xE1F0, 0xE1F1, +0xE1F2, 0xE1F3, 0xE1F4, 0xE1F5, +0xE1F6, 0xE1F7, 0xE1F8, 0xE1F9, +0xE1FA, 0xE1FB, 0xE1FC, 0xE1FD, +0xE1FE, 0xE1FF, 0xE200, 0xE201, +0xE202, 0xE203, 0xE204, 0xE205, +0xE206, 0xE207, 0xE208, 0xE209, +0xE20A, 0xE20B, 0xE20C, 0xE20D, +0xE20E, 0xE20F, 0xE210, 0xE211, +0xE212, 0xE213, 0xE214, 0xE215, +0xE216, 0xE217, 0xE218, 0xE219, +0xE21A, 0xE21B, 0xE21C, 0xE21D, +0xE21E, 0xE21F, 0xE220, 0xE221, +0xE222, 0xE223, 0xE224, 0xE225, +0xE226, 0xE227, 0xE228, 0xE229, +0xE22A, 0xE22B, 0xE22C, 0xE22D, +0xE22E, 0xE22F, 0xE230, 0xE231, +0xE232, 0xE233, 0x7645, 0x7646, +0x7647, 0x7648, 0x7649, 0x764A, +0x764B, 0x764E, 0x764F, 0x7650, +0x7651, 0x7652, 0x7653, 0x7655, +0x7657, 0x7658, 0x7659, 0x765A, +0x765B, 0x765D, 0x765F, 0x7660, +0x7661, 0x7662, 0x7664, 0x7665, +0x7666, 0x7667, 0x7668, 0x7669, +0x766A, 0x766C, 0x766D, 0x766E, +0x7670, 0x7671, 0x7672, 0x7673, +0x7674, 0x7675, 0x7676, 0x7677, +0x7679, 0x767A, 0x767C, 0x767F, +0x7680, 0x7681, 0x7683, 0x7685, +0x7689, 0x768A, 0x768C, 0x768D, +0x768F, 0x7690, 0x7692, 0x7694, +0x7695, 0x7697, 0x7698, 0x769A, +0x769B, 0x769C, 0x769D, 0x769E, +0x769F, 0x76A0, 0x76A1, 0x76A2, +0x76A3, 0x76A5, 0x76A6, 0x76A7, +0x76A8, 0x76A9, 0x76AA, 0x76AB, +0x76AC, 0x76AD, 0x76AF, 0x76B0, +0x76B3, 0x76B5, 0x76B6, 0x76B7, +0x76B8, 0x76B9, 0x76BA, 0x76BB, +0x76BC, 0x76BD, 0x76BE, 0x76C0, +0x76C1, 0x76C3, 0x554A, 0x963F, +0x57C3, 0x6328, 0x54CE, 0x5509, +0x54C0, 0x7691, 0x764C, 0x853C, +0x77EE, 0x827E, 0x788D, 0x7231, +0x9698, 0x978D, 0x6C28, 0x5B89, +0x4FFA, 0x6309, 0x6697, 0x5CB8, +0x80FA, 0x6848, 0x80AE, 0x6602, +0x76CE, 0x51F9, 0x6556, 0x71AC, +0x7FF1, 0x8884, 0x50B2, 0x5965, +0x61CA, 0x6FB3, 0x82AD, 0x634C, +0x6252, 0x53ED, 0x5427, 0x7B06, +0x516B, 0x75A4, 0x5DF4, 0x62D4, +0x8DCB, 0x9776, 0x628A, 0x8019, +0x575D, 0x9738, 0x7F62, 0x7238, +0x767D, 0x67CF, 0x767E, 0x6446, +0x4F70, 0x8D25, 0x62DC, 0x7A17, +0x6591, 0x73ED, 0x642C, 0x6273, +0x822C, 0x9881, 0x677F, 0x7248, +0x626E, 0x62CC, 0x4F34, 0x74E3, +0x534A, 0x529E, 0x7ECA, 0x90A6, +0x5E2E, 0x6886, 0x699C, 0x8180, +0x7ED1, 0x68D2, 0x78C5, 0x868C, +0x9551, 0x508D, 0x8C24, 0x82DE, +0x80DE, 0x5305, 0x8912, 0x5265, +0x76C4, 0x76C7, 0x76C9, 0x76CB, +0x76CC, 0x76D3, 0x76D5, 0x76D9, +0x76DA, 0x76DC, 0x76DD, 0x76DE, +0x76E0, 0x76E1, 0x76E2, 0x76E3, +0x76E4, 0x76E6, 0x76E7, 0x76E8, +0x76E9, 0x76EA, 0x76EB, 0x76EC, +0x76ED, 0x76F0, 0x76F3, 0x76F5, +0x76F6, 0x76F7, 0x76FA, 0x76FB, +0x76FD, 0x76FF, 0x7700, 0x7702, +0x7703, 0x7705, 0x7706, 0x770A, +0x770C, 0x770E, 0x770F, 0x7710, +0x7711, 0x7712, 0x7713, 0x7714, +0x7715, 0x7716, 0x7717, 0x7718, +0x771B, 0x771C, 0x771D, 0x771E, +0x7721, 0x7723, 0x7724, 0x7725, +0x7727, 0x772A, 0x772B, 0x772C, +0x772E, 0x7730, 0x7731, 0x7732, +0x7733, 0x7734, 0x7739, 0x773B, +0x773D, 0x773E, 0x773F, 0x7742, +0x7744, 0x7745, 0x7746, 0x7748, +0x7749, 0x774A, 0x774B, 0x774C, +0x774D, 0x774E, 0x774F, 0x7752, +0x7753, 0x7754, 0x7755, 0x7756, +0x7757, 0x7758, 0x7759, 0x775C, +0x8584, 0x96F9, 0x4FDD, 0x5821, +0x9971, 0x5B9D, 0x62B1, 0x62A5, +0x66B4, 0x8C79, 0x9C8D, 0x7206, +0x676F, 0x7891, 0x60B2, 0x5351, +0x5317, 0x8F88, 0x80CC, 0x8D1D, +0x94A1, 0x500D, 0x72C8, 0x5907, +0x60EB, 0x7119, 0x88AB, 0x5954, +0x82EF, 0x672C, 0x7B28, 0x5D29, +0x7EF7, 0x752D, 0x6CF5, 0x8E66, +0x8FF8, 0x903C, 0x9F3B, 0x6BD4, +0x9119, 0x7B14, 0x5F7C, 0x78A7, +0x84D6, 0x853D, 0x6BD5, 0x6BD9, +0x6BD6, 0x5E01, 0x5E87, 0x75F9, +0x95ED, 0x655D, 0x5F0A, 0x5FC5, +0x8F9F, 0x58C1, 0x81C2, 0x907F, +0x965B, 0x97AD, 0x8FB9, 0x7F16, +0x8D2C, 0x6241, 0x4FBF, 0x53D8, +0x535E, 0x8FA8, 0x8FA9, 0x8FAB, +0x904D, 0x6807, 0x5F6A, 0x8198, +0x8868, 0x9CD6, 0x618B, 0x522B, +0x762A, 0x5F6C, 0x658C, 0x6FD2, +0x6EE8, 0x5BBE, 0x6448, 0x5175, +0x51B0, 0x67C4, 0x4E19, 0x79C9, +0x997C, 0x70B3, 0x775D, 0x775E, +0x775F, 0x7760, 0x7764, 0x7767, +0x7769, 0x776A, 0x776D, 0x776E, +0x776F, 0x7770, 0x7771, 0x7772, +0x7773, 0x7774, 0x7775, 0x7776, +0x7777, 0x7778, 0x777A, 0x777B, +0x777C, 0x7781, 0x7782, 0x7783, +0x7786, 0x7787, 0x7788, 0x7789, +0x778A, 0x778B, 0x778F, 0x7790, +0x7793, 0x7794, 0x7795, 0x7796, +0x7797, 0x7798, 0x7799, 0x779A, +0x779B, 0x779C, 0x779D, 0x779E, +0x77A1, 0x77A3, 0x77A4, 0x77A6, +0x77A8, 0x77AB, 0x77AD, 0x77AE, +0x77AF, 0x77B1, 0x77B2, 0x77B4, +0x77B6, 0x77B7, 0x77B8, 0x77B9, +0x77BA, 0x77BC, 0x77BE, 0x77C0, +0x77C1, 0x77C2, 0x77C3, 0x77C4, +0x77C5, 0x77C6, 0x77C7, 0x77C8, +0x77C9, 0x77CA, 0x77CB, 0x77CC, +0x77CE, 0x77CF, 0x77D0, 0x77D1, +0x77D2, 0x77D3, 0x77D4, 0x77D5, +0x77D6, 0x77D8, 0x77D9, 0x77DA, +0x77DD, 0x77DE, 0x77DF, 0x77E0, +0x77E1, 0x77E4, 0x75C5, 0x5E76, +0x73BB, 0x83E0, 0x64AD, 0x62E8, +0x94B5, 0x6CE2, 0x535A, 0x52C3, +0x640F, 0x94C2, 0x7B94, 0x4F2F, +0x5E1B, 0x8236, 0x8116, 0x818A, +0x6E24, 0x6CCA, 0x9A73, 0x6355, +0x535C, 0x54FA, 0x8865, 0x57E0, +0x4E0D, 0x5E03, 0x6B65, 0x7C3F, +0x90E8, 0x6016, 0x64E6, 0x731C, +0x88C1, 0x6750, 0x624D, 0x8D22, +0x776C, 0x8E29, 0x91C7, 0x5F69, +0x83DC, 0x8521, 0x9910, 0x53C2, +0x8695, 0x6B8B, 0x60ED, 0x60E8, +0x707F, 0x82CD, 0x8231, 0x4ED3, +0x6CA7, 0x85CF, 0x64CD, 0x7CD9, +0x69FD, 0x66F9, 0x8349, 0x5395, +0x7B56, 0x4FA7, 0x518C, 0x6D4B, +0x5C42, 0x8E6D, 0x63D2, 0x53C9, +0x832C, 0x8336, 0x67E5, 0x78B4, +0x643D, 0x5BDF, 0x5C94, 0x5DEE, +0x8BE7, 0x62C6, 0x67F4, 0x8C7A, +0x6400, 0x63BA, 0x8749, 0x998B, +0x8C17, 0x7F20, 0x94F2, 0x4EA7, +0x9610, 0x98A4, 0x660C, 0x7316, +0x77E6, 0x77E8, 0x77EA, 0x77EF, +0x77F0, 0x77F1, 0x77F2, 0x77F4, +0x77F5, 0x77F7, 0x77F9, 0x77FA, +0x77FB, 0x77FC, 0x7803, 0x7804, +0x7805, 0x7806, 0x7807, 0x7808, +0x780A, 0x780B, 0x780E, 0x780F, +0x7810, 0x7813, 0x7815, 0x7819, +0x781B, 0x781E, 0x7820, 0x7821, +0x7822, 0x7824, 0x7828, 0x782A, +0x782B, 0x782E, 0x782F, 0x7831, +0x7832, 0x7833, 0x7835, 0x7836, +0x783D, 0x783F, 0x7841, 0x7842, +0x7843, 0x7844, 0x7846, 0x7848, +0x7849, 0x784A, 0x784B, 0x784D, +0x784F, 0x7851, 0x7853, 0x7854, +0x7858, 0x7859, 0x785A, 0x785B, +0x785C, 0x785E, 0x785F, 0x7860, +0x7861, 0x7862, 0x7863, 0x7864, +0x7865, 0x7866, 0x7867, 0x7868, +0x7869, 0x786F, 0x7870, 0x7871, +0x7872, 0x7873, 0x7874, 0x7875, +0x7876, 0x7878, 0x7879, 0x787A, +0x787B, 0x787D, 0x787E, 0x787F, +0x7880, 0x7881, 0x7882, 0x7883, +0x573A, 0x5C1D, 0x5E38, 0x957F, +0x507F, 0x80A0, 0x5382, 0x655E, +0x7545, 0x5531, 0x5021, 0x8D85, +0x6284, 0x949E, 0x671D, 0x5632, +0x6F6E, 0x5DE2, 0x5435, 0x7092, +0x8F66, 0x626F, 0x64A4, 0x63A3, +0x5F7B, 0x6F88, 0x90F4, 0x81E3, +0x8FB0, 0x5C18, 0x6668, 0x5FF1, +0x6C89, 0x9648, 0x8D81, 0x886C, +0x6491, 0x79F0, 0x57CE, 0x6A59, +0x6210, 0x5448, 0x4E58, 0x7A0B, +0x60E9, 0x6F84, 0x8BDA, 0x627F, +0x901E, 0x9A8B, 0x79E4, 0x5403, +0x75F4, 0x6301, 0x5319, 0x6C60, +0x8FDF, 0x5F1B, 0x9A70, 0x803B, +0x9F7F, 0x4F88, 0x5C3A, 0x8D64, +0x7FC5, 0x65A5, 0x70BD, 0x5145, +0x51B2, 0x866B, 0x5D07, 0x5BA0, +0x62BD, 0x916C, 0x7574, 0x8E0C, +0x7A20, 0x6101, 0x7B79, 0x4EC7, +0x7EF8, 0x7785, 0x4E11, 0x81ED, +0x521D, 0x51FA, 0x6A71, 0x53A8, +0x8E87, 0x9504, 0x96CF, 0x6EC1, +0x9664, 0x695A, 0x7884, 0x7885, +0x7886, 0x7888, 0x788A, 0x788B, +0x788F, 0x7890, 0x7892, 0x7894, +0x7895, 0x7896, 0x7899, 0x789D, +0x789E, 0x78A0, 0x78A2, 0x78A4, +0x78A6, 0x78A8, 0x78A9, 0x78AA, +0x78AB, 0x78AC, 0x78AD, 0x78AE, +0x78AF, 0x78B5, 0x78B6, 0x78B7, +0x78B8, 0x78BA, 0x78BB, 0x78BC, +0x78BD, 0x78BF, 0x78C0, 0x78C2, +0x78C3, 0x78C4, 0x78C6, 0x78C7, +0x78C8, 0x78CC, 0x78CD, 0x78CE, +0x78CF, 0x78D1, 0x78D2, 0x78D3, +0x78D6, 0x78D7, 0x78D8, 0x78DA, +0x78DB, 0x78DC, 0x78DD, 0x78DE, +0x78DF, 0x78E0, 0x78E1, 0x78E2, +0x78E3, 0x78E4, 0x78E5, 0x78E6, +0x78E7, 0x78E9, 0x78EA, 0x78EB, +0x78ED, 0x78EE, 0x78EF, 0x78F0, +0x78F1, 0x78F3, 0x78F5, 0x78F6, +0x78F8, 0x78F9, 0x78FB, 0x78FC, +0x78FD, 0x78FE, 0x78FF, 0x7900, +0x7902, 0x7903, 0x7904, 0x7906, +0x7907, 0x7908, 0x7909, 0x790A, +0x790B, 0x790C, 0x7840, 0x50A8, +0x77D7, 0x6410, 0x89E6, 0x5904, +0x63E3, 0x5DDD, 0x7A7F, 0x693D, +0x4F20, 0x8239, 0x5598, 0x4E32, +0x75AE, 0x7A97, 0x5E62, 0x5E8A, +0x95EF, 0x521B, 0x5439, 0x708A, +0x6376, 0x9524, 0x5782, 0x6625, +0x693F, 0x9187, 0x5507, 0x6DF3, +0x7EAF, 0x8822, 0x6233, 0x7EF0, +0x75B5, 0x8328, 0x78C1, 0x96CC, +0x8F9E, 0x6148, 0x74F7, 0x8BCD, +0x6B64, 0x523A, 0x8D50, 0x6B21, +0x806A, 0x8471, 0x56F1, 0x5306, +0x4ECE, 0x4E1B, 0x51D1, 0x7C97, +0x918B, 0x7C07, 0x4FC3, 0x8E7F, +0x7BE1, 0x7A9C, 0x6467, 0x5D14, +0x50AC, 0x8106, 0x7601, 0x7CB9, +0x6DEC, 0x7FE0, 0x6751, 0x5B58, +0x5BF8, 0x78CB, 0x64AE, 0x6413, +0x63AA, 0x632B, 0x9519, 0x642D, +0x8FBE, 0x7B54, 0x7629, 0x6253, +0x5927, 0x5446, 0x6B79, 0x50A3, +0x6234, 0x5E26, 0x6B86, 0x4EE3, +0x8D37, 0x888B, 0x5F85, 0x902E, +0x790D, 0x790E, 0x790F, 0x7910, +0x7911, 0x7912, 0x7914, 0x7915, +0x7916, 0x7917, 0x7918, 0x7919, +0x791A, 0x791B, 0x791C, 0x791D, +0x791F, 0x7920, 0x7921, 0x7922, +0x7923, 0x7925, 0x7926, 0x7927, +0x7928, 0x7929, 0x792A, 0x792B, +0x792C, 0x792D, 0x792E, 0x792F, +0x7930, 0x7931, 0x7932, 0x7933, +0x7935, 0x7936, 0x7937, 0x7938, +0x7939, 0x793D, 0x793F, 0x7942, +0x7943, 0x7944, 0x7945, 0x7947, +0x794A, 0x794B, 0x794C, 0x794D, +0x794E, 0x794F, 0x7950, 0x7951, +0x7952, 0x7954, 0x7955, 0x7958, +0x7959, 0x7961, 0x7963, 0x7964, +0x7966, 0x7969, 0x796A, 0x796B, +0x796C, 0x796E, 0x7970, 0x7971, +0x7972, 0x7973, 0x7974, 0x7975, +0x7976, 0x7979, 0x797B, 0x797C, +0x797D, 0x797E, 0x797F, 0x7982, +0x7983, 0x7986, 0x7987, 0x7988, +0x7989, 0x798B, 0x798C, 0x798D, +0x798E, 0x7990, 0x7991, 0x7992, +0x6020, 0x803D, 0x62C5, 0x4E39, +0x5355, 0x90F8, 0x63B8, 0x80C6, +0x65E6, 0x6C2E, 0x4F46, 0x60EE, +0x6DE1, 0x8BDE, 0x5F39, 0x86CB, +0x5F53, 0x6321, 0x515A, 0x8361, +0x6863, 0x5200, 0x6363, 0x8E48, +0x5012, 0x5C9B, 0x7977, 0x5BFC, +0x5230, 0x7A3B, 0x60BC, 0x9053, +0x76D7, 0x5FB7, 0x5F97, 0x7684, +0x8E6C, 0x706F, 0x767B, 0x7B49, +0x77AA, 0x51F3, 0x9093, 0x5824, +0x4F4E, 0x6EF4, 0x8FEA, 0x654C, +0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, +0x5AE1, 0x62B5, 0x5E95, 0x5730, +0x8482, 0x7B2C, 0x5E1D, 0x5F1F, +0x9012, 0x7F14, 0x98A0, 0x6382, +0x6EC7, 0x7898, 0x70B9, 0x5178, +0x975B, 0x57AB, 0x7535, 0x4F43, +0x7538, 0x5E97, 0x60E6, 0x5960, +0x6DC0, 0x6BBF, 0x7889, 0x53FC, +0x96D5, 0x51CB, 0x5201, 0x6389, +0x540A, 0x9493, 0x8C03, 0x8DCC, +0x7239, 0x789F, 0x8776, 0x8FED, +0x8C0D, 0x53E0, 0x7993, 0x7994, +0x7995, 0x7996, 0x7997, 0x7998, +0x7999, 0x799B, 0x799C, 0x799D, +0x799E, 0x799F, 0x79A0, 0x79A1, +0x79A2, 0x79A3, 0x79A4, 0x79A5, +0x79A6, 0x79A8, 0x79A9, 0x79AA, +0x79AB, 0x79AC, 0x79AD, 0x79AE, +0x79AF, 0x79B0, 0x79B1, 0x79B2, +0x79B4, 0x79B5, 0x79B6, 0x79B7, +0x79B8, 0x79BC, 0x79BF, 0x79C2, +0x79C4, 0x79C5, 0x79C7, 0x79C8, +0x79CA, 0x79CC, 0x79CE, 0x79CF, +0x79D0, 0x79D3, 0x79D4, 0x79D6, +0x79D7, 0x79D9, 0x79DA, 0x79DB, +0x79DC, 0x79DD, 0x79DE, 0x79E0, +0x79E1, 0x79E2, 0x79E5, 0x79E8, +0x79EA, 0x79EC, 0x79EE, 0x79F1, +0x79F2, 0x79F3, 0x79F4, 0x79F5, +0x79F6, 0x79F7, 0x79F9, 0x79FA, +0x79FC, 0x79FE, 0x79FF, 0x7A01, +0x7A04, 0x7A05, 0x7A07, 0x7A08, +0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, +0x7A10, 0x7A11, 0x7A12, 0x7A13, +0x7A15, 0x7A16, 0x7A18, 0x7A19, +0x7A1B, 0x7A1C, 0x4E01, 0x76EF, +0x53EE, 0x9489, 0x9876, 0x9F0E, +0x952D, 0x5B9A, 0x8BA2, 0x4E22, +0x4E1C, 0x51AC, 0x8463, 0x61C2, +0x52A8, 0x680B, 0x4F97, 0x606B, +0x51BB, 0x6D1E, 0x515C, 0x6296, +0x6597, 0x9661, 0x8C46, 0x9017, +0x75D8, 0x90FD, 0x7763, 0x6BD2, +0x728A, 0x72EC, 0x8BFB, 0x5835, +0x7779, 0x8D4C, 0x675C, 0x9540, +0x809A, 0x5EA6, 0x6E21, 0x5992, +0x7AEF, 0x77ED, 0x953B, 0x6BB5, +0x65AD, 0x7F0E, 0x5806, 0x5151, +0x961F, 0x5BF9, 0x58A9, 0x5428, +0x8E72, 0x6566, 0x987F, 0x56E4, +0x949D, 0x76FE, 0x9041, 0x6387, +0x54C6, 0x591A, 0x593A, 0x579B, +0x8EB2, 0x6735, 0x8DFA, 0x8235, +0x5241, 0x60F0, 0x5815, 0x86FE, +0x5CE8, 0x9E45, 0x4FC4, 0x989D, +0x8BB9, 0x5A25, 0x6076, 0x5384, +0x627C, 0x904F, 0x9102, 0x997F, +0x6069, 0x800C, 0x513F, 0x8033, +0x5C14, 0x9975, 0x6D31, 0x4E8C, +0x7A1D, 0x7A1F, 0x7A21, 0x7A22, +0x7A24, 0x7A25, 0x7A26, 0x7A27, +0x7A28, 0x7A29, 0x7A2A, 0x7A2B, +0x7A2C, 0x7A2D, 0x7A2E, 0x7A2F, +0x7A30, 0x7A31, 0x7A32, 0x7A34, +0x7A35, 0x7A36, 0x7A38, 0x7A3A, +0x7A3E, 0x7A40, 0x7A41, 0x7A42, +0x7A43, 0x7A44, 0x7A45, 0x7A47, +0x7A48, 0x7A49, 0x7A4A, 0x7A4B, +0x7A4C, 0x7A4D, 0x7A4E, 0x7A4F, +0x7A50, 0x7A52, 0x7A53, 0x7A54, +0x7A55, 0x7A56, 0x7A58, 0x7A59, +0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, +0x7A5E, 0x7A5F, 0x7A60, 0x7A61, +0x7A62, 0x7A63, 0x7A64, 0x7A65, +0x7A66, 0x7A67, 0x7A68, 0x7A69, +0x7A6A, 0x7A6B, 0x7A6C, 0x7A6D, +0x7A6E, 0x7A6F, 0x7A71, 0x7A72, +0x7A73, 0x7A75, 0x7A7B, 0x7A7C, +0x7A7D, 0x7A7E, 0x7A82, 0x7A85, +0x7A87, 0x7A89, 0x7A8A, 0x7A8B, +0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, +0x7A93, 0x7A94, 0x7A99, 0x7A9A, +0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, +0x8D30, 0x53D1, 0x7F5A, 0x7B4F, +0x4F10, 0x4E4F, 0x9600, 0x6CD5, +0x73D0, 0x85E9, 0x5E06, 0x756A, +0x7FFB, 0x6A0A, 0x77FE, 0x9492, +0x7E41, 0x51E1, 0x70E6, 0x53CD, +0x8FD4, 0x8303, 0x8D29, 0x72AF, +0x996D, 0x6CDB, 0x574A, 0x82B3, +0x65B9, 0x80AA, 0x623F, 0x9632, +0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, +0x653E, 0x83F2, 0x975E, 0x5561, +0x98DE, 0x80A5, 0x532A, 0x8BFD, +0x5420, 0x80BA, 0x5E9F, 0x6CB8, +0x8D39, 0x82AC, 0x915A, 0x5429, +0x6C1B, 0x5206, 0x7EB7, 0x575F, +0x711A, 0x6C7E, 0x7C89, 0x594B, +0x4EFD, 0x5FFF, 0x6124, 0x7CAA, +0x4E30, 0x5C01, 0x67AB, 0x8702, +0x5CF0, 0x950B, 0x98CE, 0x75AF, +0x70FD, 0x9022, 0x51AF, 0x7F1D, +0x8BBD, 0x5949, 0x51E4, 0x4F5B, +0x5426, 0x592B, 0x6577, 0x80A4, +0x5B75, 0x6276, 0x62C2, 0x8F90, +0x5E45, 0x6C1F, 0x7B26, 0x4F0F, +0x4FD8, 0x670D, 0x7AA3, 0x7AA4, +0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, +0x7AAE, 0x7AAF, 0x7AB0, 0x7AB1, +0x7AB2, 0x7AB4, 0x7AB5, 0x7AB6, +0x7AB7, 0x7AB8, 0x7AB9, 0x7ABA, +0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE, +0x7AC0, 0x7AC1, 0x7AC2, 0x7AC3, +0x7AC4, 0x7AC5, 0x7AC6, 0x7AC7, +0x7AC8, 0x7AC9, 0x7ACA, 0x7ACC, +0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, +0x7AD1, 0x7AD2, 0x7AD3, 0x7AD4, +0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, +0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, +0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, +0x7AE9, 0x7AEA, 0x7AEB, 0x7AEC, +0x7AEE, 0x7AF0, 0x7AF1, 0x7AF2, +0x7AF3, 0x7AF4, 0x7AF5, 0x7AF6, +0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, +0x7AFE, 0x7B00, 0x7B01, 0x7B02, +0x7B05, 0x7B07, 0x7B09, 0x7B0C, +0x7B0D, 0x7B0E, 0x7B10, 0x7B12, +0x7B13, 0x7B16, 0x7B17, 0x7B18, +0x7B1A, 0x7B1C, 0x7B1D, 0x7B1F, +0x7B21, 0x7B22, 0x7B23, 0x7B27, +0x7B29, 0x7B2D, 0x6D6E, 0x6DAA, +0x798F, 0x88B1, 0x5F17, 0x752B, +0x629A, 0x8F85, 0x4FEF, 0x91DC, +0x65A7, 0x812F, 0x8151, 0x5E9C, +0x8150, 0x8D74, 0x526F, 0x8986, +0x8D4B, 0x590D, 0x5085, 0x4ED8, +0x961C, 0x7236, 0x8179, 0x8D1F, +0x5BCC, 0x8BA3, 0x9644, 0x5987, +0x7F1A, 0x5490, 0x5676, 0x560E, +0x8BE5, 0x6539, 0x6982, 0x9499, +0x76D6, 0x6E89, 0x5E72, 0x7518, +0x6746, 0x67D1, 0x7AFF, 0x809D, +0x8D76, 0x611F, 0x79C6, 0x6562, +0x8D63, 0x5188, 0x521A, 0x94A2, +0x7F38, 0x809B, 0x7EB2, 0x5C97, +0x6E2F, 0x6760, 0x7BD9, 0x768B, +0x9AD8, 0x818F, 0x7F94, 0x7CD5, +0x641E, 0x9550, 0x7A3F, 0x544A, +0x54E5, 0x6B4C, 0x6401, 0x6208, +0x9E3D, 0x80F3, 0x7599, 0x5272, +0x9769, 0x845B, 0x683C, 0x86E4, +0x9601, 0x9694, 0x94EC, 0x4E2A, +0x5404, 0x7ED9, 0x6839, 0x8DDF, +0x8015, 0x66F4, 0x5E9A, 0x7FB9, +0x7B2F, 0x7B30, 0x7B32, 0x7B34, +0x7B35, 0x7B36, 0x7B37, 0x7B39, +0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, +0x7B41, 0x7B42, 0x7B43, 0x7B44, +0x7B46, 0x7B48, 0x7B4A, 0x7B4D, +0x7B4E, 0x7B53, 0x7B55, 0x7B57, +0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, +0x7B61, 0x7B63, 0x7B64, 0x7B65, +0x7B66, 0x7B67, 0x7B68, 0x7B69, +0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D, +0x7B6F, 0x7B70, 0x7B73, 0x7B74, +0x7B76, 0x7B78, 0x7B7A, 0x7B7C, +0x7B7D, 0x7B7F, 0x7B81, 0x7B82, +0x7B83, 0x7B84, 0x7B86, 0x7B87, +0x7B88, 0x7B89, 0x7B8A, 0x7B8B, +0x7B8C, 0x7B8E, 0x7B8F, 0x7B91, +0x7B92, 0x7B93, 0x7B96, 0x7B98, +0x7B99, 0x7B9A, 0x7B9B, 0x7B9E, +0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, +0x7BA5, 0x7BAE, 0x7BAF, 0x7BB0, +0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, +0x7BB7, 0x7BB9, 0x7BBA, 0x7BBB, +0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, +0x7BC0, 0x7BC2, 0x7BC3, 0x7BC4, +0x57C2, 0x803F, 0x6897, 0x5DE5, +0x653B, 0x529F, 0x606D, 0x9F9A, +0x4F9B, 0x8EAC, 0x516C, 0x5BAB, +0x5F13, 0x5DE9, 0x6C5E, 0x62F1, +0x8D21, 0x5171, 0x94A9, 0x52FE, +0x6C9F, 0x82DF, 0x72D7, 0x57A2, +0x6784, 0x8D2D, 0x591F, 0x8F9C, +0x83C7, 0x5495, 0x7B8D, 0x4F30, +0x6CBD, 0x5B64, 0x59D1, 0x9F13, +0x53E4, 0x86CA, 0x9AA8, 0x8C37, +0x80A1, 0x6545, 0x987E, 0x56FA, +0x96C7, 0x522E, 0x74DC, 0x5250, +0x5BE1, 0x6302, 0x8902, 0x4E56, +0x62D0, 0x602A, 0x68FA, 0x5173, +0x5B98, 0x51A0, 0x89C2, 0x7BA1, +0x9986, 0x7F50, 0x60EF, 0x704C, +0x8D2F, 0x5149, 0x5E7F, 0x901B, +0x7470, 0x89C4, 0x572D, 0x7845, +0x5F52, 0x9F9F, 0x95FA, 0x8F68, +0x9B3C, 0x8BE1, 0x7678, 0x6842, +0x67DC, 0x8DEA, 0x8D35, 0x523D, +0x8F8A, 0x6EDA, 0x68CD, 0x9505, +0x90ED, 0x56FD, 0x679C, 0x88F9, +0x8FC7, 0x54C8, 0x7BC5, 0x7BC8, +0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, +0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, +0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, +0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, +0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, +0x7BE4, 0x7BE7, 0x7BE8, 0x7BE9, +0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, +0x7BF0, 0x7BF2, 0x7BF3, 0x7BF4, +0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, +0x7BFA, 0x7BFB, 0x7BFD, 0x7BFF, +0x7C00, 0x7C01, 0x7C02, 0x7C03, +0x7C04, 0x7C05, 0x7C06, 0x7C08, +0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, +0x7C10, 0x7C11, 0x7C12, 0x7C13, +0x7C14, 0x7C15, 0x7C17, 0x7C18, +0x7C19, 0x7C1A, 0x7C1B, 0x7C1C, +0x7C1D, 0x7C1E, 0x7C20, 0x7C21, +0x7C22, 0x7C23, 0x7C24, 0x7C25, +0x7C28, 0x7C29, 0x7C2B, 0x7C2C, +0x7C2D, 0x7C2E, 0x7C2F, 0x7C30, +0x7C31, 0x7C32, 0x7C33, 0x7C34, +0x7C35, 0x7C36, 0x7C37, 0x7C39, +0x7C3A, 0x7C3B, 0x7C3C, 0x7C3D, +0x7C3E, 0x7C42, 0x9AB8, 0x5B69, +0x6D77, 0x6C26, 0x4EA5, 0x5BB3, +0x9A87, 0x9163, 0x61A8, 0x90AF, +0x97E9, 0x542B, 0x6DB5, 0x5BD2, +0x51FD, 0x558A, 0x7F55, 0x7FF0, +0x64BC, 0x634D, 0x65F1, 0x61BE, +0x608D, 0x710A, 0x6C57, 0x6C49, +0x592F, 0x676D, 0x822A, 0x58D5, +0x568E, 0x8C6A, 0x6BEB, 0x90DD, +0x597D, 0x8017, 0x53F7, 0x6D69, +0x5475, 0x559D, 0x8377, 0x83CF, +0x6838, 0x79BE, 0x548C, 0x4F55, +0x5408, 0x76D2, 0x8C89, 0x9602, +0x6CB3, 0x6DB8, 0x8D6B, 0x8910, +0x9E64, 0x8D3A, 0x563F, 0x9ED1, +0x75D5, 0x5F88, 0x72E0, 0x6068, +0x54FC, 0x4EA8, 0x6A2A, 0x8861, +0x6052, 0x8F70, 0x54C4, 0x70D8, +0x8679, 0x9E3F, 0x6D2A, 0x5B8F, +0x5F18, 0x7EA2, 0x5589, 0x4FAF, +0x7334, 0x543C, 0x539A, 0x5019, +0x540E, 0x547C, 0x4E4E, 0x5FFD, +0x745A, 0x58F6, 0x846B, 0x80E1, +0x8774, 0x72D0, 0x7CCA, 0x6E56, +0x7C43, 0x7C44, 0x7C45, 0x7C46, +0x7C47, 0x7C48, 0x7C49, 0x7C4A, +0x7C4B, 0x7C4C, 0x7C4E, 0x7C4F, +0x7C50, 0x7C51, 0x7C52, 0x7C53, +0x7C54, 0x7C55, 0x7C56, 0x7C57, +0x7C58, 0x7C59, 0x7C5A, 0x7C5B, +0x7C5C, 0x7C5D, 0x7C5E, 0x7C5F, +0x7C60, 0x7C61, 0x7C62, 0x7C63, +0x7C64, 0x7C65, 0x7C66, 0x7C67, +0x7C68, 0x7C69, 0x7C6A, 0x7C6B, +0x7C6C, 0x7C6D, 0x7C6E, 0x7C6F, +0x7C70, 0x7C71, 0x7C72, 0x7C75, +0x7C76, 0x7C77, 0x7C78, 0x7C79, +0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, +0x7C81, 0x7C82, 0x7C83, 0x7C84, +0x7C85, 0x7C86, 0x7C87, 0x7C88, +0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, +0x7C8E, 0x7C8F, 0x7C90, 0x7C93, +0x7C94, 0x7C96, 0x7C99, 0x7C9A, +0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, +0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, +0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, +0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, +0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, +0x5F27, 0x864E, 0x552C, 0x62A4, +0x4E92, 0x6CAA, 0x6237, 0x82B1, +0x54D7, 0x534E, 0x733E, 0x6ED1, +0x753B, 0x5212, 0x5316, 0x8BDD, +0x69D0, 0x5F8A, 0x6000, 0x6DEE, +0x574F, 0x6B22, 0x73AF, 0x6853, +0x8FD8, 0x7F13, 0x6362, 0x60A3, +0x5524, 0x75EA, 0x8C62, 0x7115, +0x6DA3, 0x5BA6, 0x5E7B, 0x8352, +0x614C, 0x9EC4, 0x78FA, 0x8757, +0x7C27, 0x7687, 0x51F0, 0x60F6, +0x714C, 0x6643, 0x5E4C, 0x604D, +0x8C0E, 0x7070, 0x6325, 0x8F89, +0x5FBD, 0x6062, 0x86D4, 0x56DE, +0x6BC1, 0x6094, 0x6167, 0x5349, +0x60E0, 0x6666, 0x8D3F, 0x79FD, +0x4F1A, 0x70E9, 0x6C47, 0x8BB3, +0x8BF2, 0x7ED8, 0x8364, 0x660F, +0x5A5A, 0x9B42, 0x6D51, 0x6DF7, +0x8C41, 0x6D3B, 0x4F19, 0x706B, +0x83B7, 0x6216, 0x60D1, 0x970D, +0x8D27, 0x7978, 0x51FB, 0x573E, +0x57FA, 0x673A, 0x7578, 0x7A3D, +0x79EF, 0x7B95, 0x7CBF, 0x7CC0, +0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, +0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF, +0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, +0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB, +0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, +0x7CE3, 0x7CE4, 0x7CE5, 0x7CE6, +0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, +0x7CEC, 0x7CED, 0x7CEE, 0x7CF0, +0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, +0x7CF5, 0x7CF6, 0x7CF7, 0x7CF9, +0x7CFA, 0x7CFC, 0x7CFD, 0x7CFE, +0x7CFF, 0x7D00, 0x7D01, 0x7D02, +0x7D03, 0x7D04, 0x7D05, 0x7D06, +0x7D07, 0x7D08, 0x7D09, 0x7D0B, +0x7D0C, 0x7D0D, 0x7D0E, 0x7D0F, +0x7D10, 0x7D11, 0x7D12, 0x7D13, +0x7D14, 0x7D15, 0x7D16, 0x7D17, +0x7D18, 0x7D19, 0x7D1A, 0x7D1B, +0x7D1C, 0x7D1D, 0x7D1E, 0x7D1F, +0x7D21, 0x7D23, 0x7D24, 0x7D25, +0x7D26, 0x7D28, 0x7D29, 0x7D2A, +0x7D2C, 0x7D2D, 0x7D2E, 0x7D30, +0x7D31, 0x7D32, 0x7D33, 0x7D34, +0x7D35, 0x7D36, 0x808C, 0x9965, +0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, +0x59EC, 0x7EE9, 0x7F09, 0x5409, +0x6781, 0x68D8, 0x8F91, 0x7C4D, +0x96C6, 0x53CA, 0x6025, 0x75BE, +0x6C72, 0x5373, 0x5AC9, 0x7EA7, +0x6324, 0x51E0, 0x810A, 0x5DF1, +0x84DF, 0x6280, 0x5180, 0x5B63, +0x4F0E, 0x796D, 0x5242, 0x60B8, +0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, +0x8BB0, 0x65E2, 0x5FCC, 0x9645, +0x5993, 0x7EE7, 0x7EAA, 0x5609, +0x67B7, 0x5939, 0x4F73, 0x5BB6, +0x52A0, 0x835A, 0x988A, 0x8D3E, +0x7532, 0x94BE, 0x5047, 0x7A3C, +0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, +0x6B7C, 0x76D1, 0x575A, 0x5C16, +0x7B3A, 0x95F4, 0x714E, 0x517C, +0x80A9, 0x8270, 0x5978, 0x7F04, +0x8327, 0x68C0, 0x67EC, 0x78B1, +0x7877, 0x62E3, 0x6361, 0x7B80, +0x4FED, 0x526A, 0x51CF, 0x8350, +0x69DB, 0x9274, 0x8DF5, 0x8D31, +0x89C1, 0x952E, 0x7BAD, 0x4EF6, +0x7D37, 0x7D38, 0x7D39, 0x7D3A, +0x7D3B, 0x7D3C, 0x7D3D, 0x7D3E, +0x7D3F, 0x7D40, 0x7D41, 0x7D42, +0x7D43, 0x7D44, 0x7D45, 0x7D46, +0x7D47, 0x7D48, 0x7D49, 0x7D4A, +0x7D4B, 0x7D4C, 0x7D4D, 0x7D4E, +0x7D4F, 0x7D50, 0x7D51, 0x7D52, +0x7D53, 0x7D54, 0x7D55, 0x7D56, +0x7D57, 0x7D58, 0x7D59, 0x7D5A, +0x7D5B, 0x7D5C, 0x7D5D, 0x7D5E, +0x7D5F, 0x7D60, 0x7D61, 0x7D62, +0x7D63, 0x7D64, 0x7D65, 0x7D66, +0x7D67, 0x7D68, 0x7D69, 0x7D6A, +0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, +0x7D70, 0x7D71, 0x7D72, 0x7D73, +0x7D74, 0x7D75, 0x7D76, 0x7D78, +0x7D79, 0x7D7A, 0x7D7B, 0x7D7C, +0x7D7D, 0x7D7E, 0x7D7F, 0x7D80, +0x7D81, 0x7D82, 0x7D83, 0x7D84, +0x7D85, 0x7D86, 0x7D87, 0x7D88, +0x7D89, 0x7D8A, 0x7D8B, 0x7D8C, +0x7D8D, 0x7D8E, 0x7D8F, 0x7D90, +0x7D91, 0x7D92, 0x7D93, 0x7D94, +0x7D95, 0x7D96, 0x7D97, 0x7D98, +0x5065, 0x8230, 0x5251, 0x996F, +0x6E10, 0x6E85, 0x6DA7, 0x5EFA, +0x50F5, 0x59DC, 0x5C06, 0x6D46, +0x6C5F, 0x7586, 0x848B, 0x6868, +0x5956, 0x8BB2, 0x5320, 0x9171, +0x964D, 0x8549, 0x6912, 0x7901, +0x7126, 0x80F6, 0x4EA4, 0x90CA, +0x6D47, 0x9A84, 0x5A07, 0x56BC, +0x6405, 0x94F0, 0x77EB, 0x4FA5, +0x811A, 0x72E1, 0x89D2, 0x997A, +0x7F34, 0x7EDE, 0x527F, 0x6559, +0x9175, 0x8F7F, 0x8F83, 0x53EB, +0x7A96, 0x63ED, 0x63A5, 0x7686, +0x79F8, 0x8857, 0x9636, 0x622A, +0x52AB, 0x8282, 0x6854, 0x6770, +0x6377, 0x776B, 0x7AED, 0x6D01, +0x7ED3, 0x89E3, 0x59D0, 0x6212, +0x85C9, 0x82A5, 0x754C, 0x501F, +0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, +0x5DFE, 0x7B4B, 0x65A4, 0x91D1, +0x4ECA, 0x6D25, 0x895F, 0x7D27, +0x9526, 0x4EC5, 0x8C28, 0x8FDB, +0x9773, 0x664B, 0x7981, 0x8FD1, +0x70EC, 0x6D78, 0x7D99, 0x7D9A, +0x7D9B, 0x7D9C, 0x7D9D, 0x7D9E, +0x7D9F, 0x7DA0, 0x7DA1, 0x7DA2, +0x7DA3, 0x7DA4, 0x7DA5, 0x7DA7, +0x7DA8, 0x7DA9, 0x7DAA, 0x7DAB, +0x7DAC, 0x7DAD, 0x7DAF, 0x7DB0, +0x7DB1, 0x7DB2, 0x7DB3, 0x7DB4, +0x7DB5, 0x7DB6, 0x7DB7, 0x7DB8, +0x7DB9, 0x7DBA, 0x7DBB, 0x7DBC, +0x7DBD, 0x7DBE, 0x7DBF, 0x7DC0, +0x7DC1, 0x7DC2, 0x7DC3, 0x7DC4, +0x7DC5, 0x7DC6, 0x7DC7, 0x7DC8, +0x7DC9, 0x7DCA, 0x7DCB, 0x7DCC, +0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, +0x7DD1, 0x7DD2, 0x7DD3, 0x7DD4, +0x7DD5, 0x7DD6, 0x7DD7, 0x7DD8, +0x7DD9, 0x7DDA, 0x7DDB, 0x7DDC, +0x7DDD, 0x7DDE, 0x7DDF, 0x7DE0, +0x7DE1, 0x7DE2, 0x7DE3, 0x7DE4, +0x7DE5, 0x7DE6, 0x7DE7, 0x7DE8, +0x7DE9, 0x7DEA, 0x7DEB, 0x7DEC, +0x7DED, 0x7DEE, 0x7DEF, 0x7DF0, +0x7DF1, 0x7DF2, 0x7DF3, 0x7DF4, +0x7DF5, 0x7DF6, 0x7DF7, 0x7DF8, +0x7DF9, 0x7DFA, 0x5C3D, 0x52B2, +0x8346, 0x5162, 0x830E, 0x775B, +0x6676, 0x9CB8, 0x4EAC, 0x60CA, +0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, +0x8B66, 0x666F, 0x9888, 0x9759, +0x5883, 0x656C, 0x955C, 0x5F84, +0x75C9, 0x9756, 0x7ADF, 0x7ADE, +0x51C0, 0x70AF, 0x7A98, 0x63EA, +0x7A76, 0x7EA0, 0x7396, 0x97ED, +0x4E45, 0x7078, 0x4E5D, 0x9152, +0x53A9, 0x6551, 0x65E7, 0x81FC, +0x8205, 0x548E, 0x5C31, 0x759A, +0x97A0, 0x62D8, 0x72D9, 0x75BD, +0x5C45, 0x9A79, 0x83CA, 0x5C40, +0x5480, 0x77E9, 0x4E3E, 0x6CAE, +0x805A, 0x62D2, 0x636E, 0x5DE8, +0x5177, 0x8DDD, 0x8E1E, 0x952F, +0x4FF1, 0x53E5, 0x60E7, 0x70AC, +0x5267, 0x6350, 0x9E43, 0x5A1F, +0x5026, 0x7737, 0x5377, 0x7EE2, +0x6485, 0x652B, 0x6289, 0x6398, +0x5014, 0x7235, 0x89C9, 0x51B3, +0x8BC0, 0x7EDD, 0x5747, 0x83CC, +0x94A7, 0x519B, 0x541B, 0x5CFB, +0x7DFB, 0x7DFC, 0x7DFD, 0x7DFE, +0x7DFF, 0x7E00, 0x7E01, 0x7E02, +0x7E03, 0x7E04, 0x7E05, 0x7E06, +0x7E07, 0x7E08, 0x7E09, 0x7E0A, +0x7E0B, 0x7E0C, 0x7E0D, 0x7E0E, +0x7E0F, 0x7E10, 0x7E11, 0x7E12, +0x7E13, 0x7E14, 0x7E15, 0x7E16, +0x7E17, 0x7E18, 0x7E19, 0x7E1A, +0x7E1B, 0x7E1C, 0x7E1D, 0x7E1E, +0x7E1F, 0x7E20, 0x7E21, 0x7E22, +0x7E23, 0x7E24, 0x7E25, 0x7E26, +0x7E27, 0x7E28, 0x7E29, 0x7E2A, +0x7E2B, 0x7E2C, 0x7E2D, 0x7E2E, +0x7E2F, 0x7E30, 0x7E31, 0x7E32, +0x7E33, 0x7E34, 0x7E35, 0x7E36, +0x7E37, 0x7E38, 0x7E39, 0x7E3A, +0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, +0x7E40, 0x7E42, 0x7E43, 0x7E44, +0x7E45, 0x7E46, 0x7E48, 0x7E49, +0x7E4A, 0x7E4B, 0x7E4C, 0x7E4D, +0x7E4E, 0x7E4F, 0x7E50, 0x7E51, +0x7E52, 0x7E53, 0x7E54, 0x7E55, +0x7E56, 0x7E57, 0x7E58, 0x7E59, +0x7E5A, 0x7E5B, 0x7E5C, 0x7E5D, +0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, +0x9A8F, 0x5580, 0x5496, 0x5361, +0x54AF, 0x5F00, 0x63E9, 0x6977, +0x51EF, 0x6168, 0x520A, 0x582A, +0x52D8, 0x574E, 0x780D, 0x770B, +0x5EB7, 0x6177, 0x7CE0, 0x625B, +0x6297, 0x4EA2, 0x7095, 0x8003, +0x62F7, 0x70E4, 0x9760, 0x5777, +0x82DB, 0x67EF, 0x68F5, 0x78D5, +0x9897, 0x79D1, 0x58F3, 0x54B3, +0x53EF, 0x6E34, 0x514B, 0x523B, +0x5BA2, 0x8BFE, 0x80AF, 0x5543, +0x57A6, 0x6073, 0x5751, 0x542D, +0x7A7A, 0x6050, 0x5B54, 0x63A7, +0x62A0, 0x53E3, 0x6263, 0x5BC7, +0x67AF, 0x54ED, 0x7A9F, 0x82E6, +0x9177, 0x5E93, 0x88E4, 0x5938, +0x57AE, 0x630E, 0x8DE8, 0x80EF, +0x5757, 0x7B77, 0x4FA9, 0x5FEB, +0x5BBD, 0x6B3E, 0x5321, 0x7B50, +0x72C2, 0x6846, 0x77FF, 0x7736, +0x65F7, 0x51B5, 0x4E8F, 0x76D4, +0x5CBF, 0x7AA5, 0x8475, 0x594E, +0x9B41, 0x5080, 0x7E5E, 0x7E5F, +0x7E60, 0x7E61, 0x7E62, 0x7E63, +0x7E64, 0x7E65, 0x7E66, 0x7E67, +0x7E68, 0x7E69, 0x7E6A, 0x7E6B, +0x7E6C, 0x7E6D, 0x7E6E, 0x7E6F, +0x7E70, 0x7E71, 0x7E72, 0x7E73, +0x7E74, 0x7E75, 0x7E76, 0x7E77, +0x7E78, 0x7E79, 0x7E7A, 0x7E7B, +0x7E7C, 0x7E7D, 0x7E7E, 0x7E7F, +0x7E80, 0x7E81, 0x7E83, 0x7E84, +0x7E85, 0x7E86, 0x7E87, 0x7E88, +0x7E89, 0x7E8A, 0x7E8B, 0x7E8C, +0x7E8D, 0x7E8E, 0x7E8F, 0x7E90, +0x7E91, 0x7E92, 0x7E93, 0x7E94, +0x7E95, 0x7E96, 0x7E97, 0x7E98, +0x7E99, 0x7E9A, 0x7E9C, 0x7E9D, +0x7E9E, 0x7EAE, 0x7EB4, 0x7EBB, +0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, +0x7EF9, 0x7F0A, 0x7F10, 0x7F1E, +0x7F37, 0x7F39, 0x7F3B, 0x7F3C, +0x7F3D, 0x7F3E, 0x7F3F, 0x7F40, +0x7F41, 0x7F43, 0x7F46, 0x7F47, +0x7F48, 0x7F49, 0x7F4A, 0x7F4B, +0x7F4C, 0x7F4D, 0x7F4E, 0x7F4F, +0x7F52, 0x7F53, 0x9988, 0x6127, +0x6E83, 0x5764, 0x6606, 0x6346, +0x56F0, 0x62EC, 0x6269, 0x5ED3, +0x9614, 0x5783, 0x62C9, 0x5587, +0x8721, 0x814A, 0x8FA3, 0x5566, +0x83B1, 0x6765, 0x8D56, 0x84DD, +0x5A6A, 0x680F, 0x62E6, 0x7BEE, +0x9611, 0x5170, 0x6F9C, 0x8C30, +0x63FD, 0x89C8, 0x61D2, 0x7F06, +0x70C2, 0x6EE5, 0x7405, 0x6994, +0x72FC, 0x5ECA, 0x90CE, 0x6717, +0x6D6A, 0x635E, 0x52B3, 0x7262, +0x8001, 0x4F6C, 0x59E5, 0x916A, +0x70D9, 0x6D9D, 0x52D2, 0x4E50, +0x96F7, 0x956D, 0x857E, 0x78CA, +0x7D2F, 0x5121, 0x5792, 0x64C2, +0x808B, 0x7C7B, 0x6CEA, 0x68F1, +0x695E, 0x51B7, 0x5398, 0x68A8, +0x7281, 0x9ECE, 0x7BF1, 0x72F8, +0x79BB, 0x6F13, 0x7406, 0x674E, +0x91CC, 0x9CA4, 0x793C, 0x8389, +0x8354, 0x540F, 0x6817, 0x4E3D, +0x5389, 0x52B1, 0x783E, 0x5386, +0x5229, 0x5088, 0x4F8B, 0x4FD0, +0x7F56, 0x7F59, 0x7F5B, 0x7F5C, +0x7F5D, 0x7F5E, 0x7F60, 0x7F63, +0x7F64, 0x7F65, 0x7F66, 0x7F67, +0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, +0x7F70, 0x7F73, 0x7F75, 0x7F76, +0x7F77, 0x7F78, 0x7F7A, 0x7F7B, +0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, +0x7F82, 0x7F83, 0x7F84, 0x7F85, +0x7F86, 0x7F87, 0x7F88, 0x7F89, +0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, +0x7F91, 0x7F92, 0x7F93, 0x7F95, +0x7F96, 0x7F97, 0x7F98, 0x7F99, +0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, +0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8, +0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, +0x7FAD, 0x7FAE, 0x7FB1, 0x7FB3, +0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, +0x7FBA, 0x7FBB, 0x7FBE, 0x7FC0, +0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, +0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, +0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, +0x7FD2, 0x7FD3, 0x7FD6, 0x7FD7, +0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, +0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, +0x75E2, 0x7ACB, 0x7C92, 0x6CA5, +0x96B6, 0x529B, 0x7483, 0x54E9, +0x4FE9, 0x8054, 0x83B2, 0x8FDE, +0x9570, 0x5EC9, 0x601C, 0x6D9F, +0x5E18, 0x655B, 0x8138, 0x94FE, +0x604B, 0x70BC, 0x7EC3, 0x7CAE, +0x51C9, 0x6881, 0x7CB1, 0x826F, +0x4E24, 0x8F86, 0x91CF, 0x667E, +0x4EAE, 0x8C05, 0x64A9, 0x804A, +0x50DA, 0x7597, 0x71CE, 0x5BE5, +0x8FBD, 0x6F66, 0x4E86, 0x6482, +0x9563, 0x5ED6, 0x6599, 0x5217, +0x88C2, 0x70C8, 0x52A3, 0x730E, +0x7433, 0x6797, 0x78F7, 0x9716, +0x4E34, 0x90BB, 0x9CDE, 0x6DCB, +0x51DB, 0x8D41, 0x541D, 0x62CE, +0x73B2, 0x83F1, 0x96F6, 0x9F84, +0x94C3, 0x4F36, 0x7F9A, 0x51CC, +0x7075, 0x9675, 0x5CAD, 0x9886, +0x53E6, 0x4EE4, 0x6E9C, 0x7409, +0x69B4, 0x786B, 0x998F, 0x7559, +0x5218, 0x7624, 0x6D41, 0x67F3, +0x516D, 0x9F99, 0x804B, 0x5499, +0x7B3C, 0x7ABF, 0x7FE4, 0x7FE7, +0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, +0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, +0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, +0x7FF9, 0x7FFA, 0x7FFD, 0x7FFE, +0x7FFF, 0x8002, 0x8007, 0x8008, +0x8009, 0x800A, 0x800E, 0x800F, +0x8011, 0x8013, 0x801A, 0x801B, +0x801D, 0x801E, 0x801F, 0x8021, +0x8023, 0x8024, 0x802B, 0x802C, +0x802D, 0x802E, 0x802F, 0x8030, +0x8032, 0x8034, 0x8039, 0x803A, +0x803C, 0x803E, 0x8040, 0x8041, +0x8044, 0x8045, 0x8047, 0x8048, +0x8049, 0x804E, 0x804F, 0x8050, +0x8051, 0x8053, 0x8055, 0x8056, +0x8057, 0x8059, 0x805B, 0x805C, +0x805D, 0x805E, 0x805F, 0x8060, +0x8061, 0x8062, 0x8063, 0x8064, +0x8065, 0x8066, 0x8067, 0x8068, +0x806B, 0x806C, 0x806D, 0x806E, +0x806F, 0x8070, 0x8072, 0x8073, +0x8074, 0x8075, 0x8076, 0x8077, +0x8078, 0x8079, 0x807A, 0x807B, +0x807C, 0x807D, 0x9686, 0x5784, +0x62E2, 0x9647, 0x697C, 0x5A04, +0x6402, 0x7BD3, 0x6F0F, 0x964B, +0x82A6, 0x5362, 0x9885, 0x5E90, +0x7089, 0x63B3, 0x5364, 0x864F, +0x9C81, 0x9E93, 0x788C, 0x9732, +0x8DEF, 0x8D42, 0x9E7F, 0x6F5E, +0x7984, 0x5F55, 0x9646, 0x622E, +0x9A74, 0x5415, 0x94DD, 0x4FA3, +0x65C5, 0x5C65, 0x5C61, 0x7F15, +0x8651, 0x6C2F, 0x5F8B, 0x7387, +0x6EE4, 0x7EFF, 0x5CE6, 0x631B, +0x5B6A, 0x6EE6, 0x5375, 0x4E71, +0x63A0, 0x7565, 0x62A1, 0x8F6E, +0x4F26, 0x4ED1, 0x6CA6, 0x7EB6, +0x8BBA, 0x841D, 0x87BA, 0x7F57, +0x903B, 0x9523, 0x7BA9, 0x9AA1, +0x88F8, 0x843D, 0x6D1B, 0x9A86, +0x7EDC, 0x5988, 0x9EBB, 0x739B, +0x7801, 0x8682, 0x9A6C, 0x9A82, +0x561B, 0x5417, 0x57CB, 0x4E70, +0x9EA6, 0x5356, 0x8FC8, 0x8109, +0x7792, 0x9992, 0x86EE, 0x6EE1, +0x8513, 0x66FC, 0x6162, 0x6F2B, +0x807E, 0x8081, 0x8082, 0x8085, +0x8088, 0x808A, 0x808D, 0x808E, +0x808F, 0x8090, 0x8091, 0x8092, +0x8094, 0x8095, 0x8097, 0x8099, +0x809E, 0x80A3, 0x80A6, 0x80A7, +0x80A8, 0x80AC, 0x80B0, 0x80B3, +0x80B5, 0x80B6, 0x80B8, 0x80B9, +0x80BB, 0x80C5, 0x80C7, 0x80C8, +0x80C9, 0x80CA, 0x80CB, 0x80CF, +0x80D0, 0x80D1, 0x80D2, 0x80D3, +0x80D4, 0x80D5, 0x80D8, 0x80DF, +0x80E0, 0x80E2, 0x80E3, 0x80E6, +0x80EE, 0x80F5, 0x80F7, 0x80F9, +0x80FB, 0x80FE, 0x80FF, 0x8100, +0x8101, 0x8103, 0x8104, 0x8105, +0x8107, 0x8108, 0x810B, 0x810C, +0x8115, 0x8117, 0x8119, 0x811B, +0x811C, 0x811D, 0x811F, 0x8120, +0x8121, 0x8122, 0x8123, 0x8124, +0x8125, 0x8126, 0x8127, 0x8128, +0x8129, 0x812A, 0x812B, 0x812D, +0x812E, 0x8130, 0x8133, 0x8134, +0x8135, 0x8137, 0x8139, 0x813A, +0x813B, 0x813C, 0x813D, 0x813F, +0x8C29, 0x8292, 0x832B, 0x76F2, +0x6C13, 0x5FD9, 0x83BD, 0x732B, +0x8305, 0x951A, 0x6BDB, 0x77DB, +0x94C6, 0x536F, 0x8302, 0x5192, +0x5E3D, 0x8C8C, 0x8D38, 0x4E48, +0x73AB, 0x679A, 0x6885, 0x9176, +0x9709, 0x7164, 0x6CA1, 0x7709, +0x5A92, 0x9541, 0x6BCF, 0x7F8E, +0x6627, 0x5BD0, 0x59B9, 0x5A9A, +0x95E8, 0x95F7, 0x4EEC, 0x840C, +0x8499, 0x6AAC, 0x76DF, 0x9530, +0x731B, 0x68A6, 0x5B5F, 0x772F, +0x919A, 0x9761, 0x7CDC, 0x8FF7, +0x8C1C, 0x5F25, 0x7C73, 0x79D8, +0x89C5, 0x6CCC, 0x871C, 0x5BC6, +0x5E42, 0x68C9, 0x7720, 0x7EF5, +0x5195, 0x514D, 0x52C9, 0x5A29, +0x7F05, 0x9762, 0x82D7, 0x63CF, +0x7784, 0x85D0, 0x79D2, 0x6E3A, +0x5E99, 0x5999, 0x8511, 0x706D, +0x6C11, 0x62BF, 0x76BF, 0x654F, +0x60AF, 0x95FD, 0x660E, 0x879F, +0x9E23, 0x94ED, 0x540D, 0x547D, +0x8C2C, 0x6478, 0x8140, 0x8141, +0x8142, 0x8143, 0x8144, 0x8145, +0x8147, 0x8149, 0x814D, 0x814E, +0x814F, 0x8152, 0x8156, 0x8157, +0x8158, 0x815B, 0x815C, 0x815D, +0x815E, 0x815F, 0x8161, 0x8162, +0x8163, 0x8164, 0x8166, 0x8168, +0x816A, 0x816B, 0x816C, 0x816F, +0x8172, 0x8173, 0x8175, 0x8176, +0x8177, 0x8178, 0x8181, 0x8183, +0x8184, 0x8185, 0x8186, 0x8187, +0x8189, 0x818B, 0x818C, 0x818D, +0x818E, 0x8190, 0x8192, 0x8193, +0x8194, 0x8195, 0x8196, 0x8197, +0x8199, 0x819A, 0x819E, 0x819F, +0x81A0, 0x81A1, 0x81A2, 0x81A4, +0x81A5, 0x81A7, 0x81A9, 0x81AB, +0x81AC, 0x81AD, 0x81AE, 0x81AF, +0x81B0, 0x81B1, 0x81B2, 0x81B4, +0x81B5, 0x81B6, 0x81B7, 0x81B8, +0x81B9, 0x81BC, 0x81BD, 0x81BE, +0x81BF, 0x81C4, 0x81C5, 0x81C7, +0x81C8, 0x81C9, 0x81CB, 0x81CD, +0x81CE, 0x81CF, 0x81D0, 0x81D1, +0x81D2, 0x81D3, 0x6479, 0x8611, +0x6A21, 0x819C, 0x78E8, 0x6469, +0x9B54, 0x62B9, 0x672B, 0x83AB, +0x58A8, 0x9ED8, 0x6CAB, 0x6F20, +0x5BDE, 0x964C, 0x8C0B, 0x725F, +0x67D0, 0x62C7, 0x7261, 0x4EA9, +0x59C6, 0x6BCD, 0x5893, 0x66AE, +0x5E55, 0x52DF, 0x6155, 0x6728, +0x76EE, 0x7766, 0x7267, 0x7A46, +0x62FF, 0x54EA, 0x5450, 0x94A0, +0x90A3, 0x5A1C, 0x7EB3, 0x6C16, +0x4E43, 0x5976, 0x8010, 0x5948, +0x5357, 0x7537, 0x96BE, 0x56CA, +0x6320, 0x8111, 0x607C, 0x95F9, +0x6DD6, 0x5462, 0x9981, 0x5185, +0x5AE9, 0x80FD, 0x59AE, 0x9713, +0x502A, 0x6CE5, 0x5C3C, 0x62DF, +0x4F60, 0x533F, 0x817B, 0x9006, +0x6EBA, 0x852B, 0x62C8, 0x5E74, +0x78BE, 0x64B5, 0x637B, 0x5FF5, +0x5A18, 0x917F, 0x9E1F, 0x5C3F, +0x634F, 0x8042, 0x5B7D, 0x556E, +0x954A, 0x954D, 0x6D85, 0x60A8, +0x67E0, 0x72DE, 0x51DD, 0x5B81, +0x81D4, 0x81D5, 0x81D6, 0x81D7, +0x81D8, 0x81D9, 0x81DA, 0x81DB, +0x81DC, 0x81DD, 0x81DE, 0x81DF, +0x81E0, 0x81E1, 0x81E2, 0x81E4, +0x81E5, 0x81E6, 0x81E8, 0x81E9, +0x81EB, 0x81EE, 0x81EF, 0x81F0, +0x81F1, 0x81F2, 0x81F5, 0x81F6, +0x81F7, 0x81F8, 0x81F9, 0x81FA, +0x81FD, 0x81FF, 0x8203, 0x8207, +0x8208, 0x8209, 0x820A, 0x820B, +0x820E, 0x820F, 0x8211, 0x8213, +0x8215, 0x8216, 0x8217, 0x8218, +0x8219, 0x821A, 0x821D, 0x8220, +0x8224, 0x8225, 0x8226, 0x8227, +0x8229, 0x822E, 0x8232, 0x823A, +0x823C, 0x823D, 0x823F, 0x8240, +0x8241, 0x8242, 0x8243, 0x8245, +0x8246, 0x8248, 0x824A, 0x824C, +0x824D, 0x824E, 0x8250, 0x8251, +0x8252, 0x8253, 0x8254, 0x8255, +0x8256, 0x8257, 0x8259, 0x825B, +0x825C, 0x825D, 0x825E, 0x8260, +0x8261, 0x8262, 0x8263, 0x8264, +0x8265, 0x8266, 0x8267, 0x8269, +0x62E7, 0x6CDE, 0x725B, 0x626D, +0x94AE, 0x7EBD, 0x8113, 0x6D53, +0x519C, 0x5F04, 0x5974, 0x52AA, +0x6012, 0x5973, 0x6696, 0x8650, +0x759F, 0x632A, 0x61E6, 0x7CEF, +0x8BFA, 0x54E6, 0x6B27, 0x9E25, +0x6BB4, 0x85D5, 0x5455, 0x5076, +0x6CA4, 0x556A, 0x8DB4, 0x722C, +0x5E15, 0x6015, 0x7436, 0x62CD, +0x6392, 0x724C, 0x5F98, 0x6E43, +0x6D3E, 0x6500, 0x6F58, 0x76D8, +0x78D0, 0x76FC, 0x7554, 0x5224, +0x53DB, 0x4E53, 0x5E9E, 0x65C1, +0x802A, 0x80D6, 0x629B, 0x5486, +0x5228, 0x70AE, 0x888D, 0x8DD1, +0x6CE1, 0x5478, 0x80DA, 0x57F9, +0x88F4, 0x8D54, 0x966A, 0x914D, +0x4F69, 0x6C9B, 0x55B7, 0x76C6, +0x7830, 0x62A8, 0x70F9, 0x6F8E, +0x5F6D, 0x84EC, 0x68DA, 0x787C, +0x7BF7, 0x81A8, 0x670B, 0x9E4F, +0x6367, 0x78B0, 0x576F, 0x7812, +0x9739, 0x6279, 0x62AB, 0x5288, +0x7435, 0x6BD7, 0x826A, 0x826B, +0x826C, 0x826D, 0x8271, 0x8275, +0x8276, 0x8277, 0x8278, 0x827B, +0x827C, 0x8280, 0x8281, 0x8283, +0x8285, 0x8286, 0x8287, 0x8289, +0x828C, 0x8290, 0x8293, 0x8294, +0x8295, 0x8296, 0x829A, 0x829B, +0x829E, 0x82A0, 0x82A2, 0x82A3, +0x82A7, 0x82B2, 0x82B5, 0x82B6, +0x82BA, 0x82BB, 0x82BC, 0x82BF, +0x82C0, 0x82C2, 0x82C3, 0x82C5, +0x82C6, 0x82C9, 0x82D0, 0x82D6, +0x82D9, 0x82DA, 0x82DD, 0x82E2, +0x82E7, 0x82E8, 0x82E9, 0x82EA, +0x82EC, 0x82ED, 0x82EE, 0x82F0, +0x82F2, 0x82F3, 0x82F5, 0x82F6, +0x82F8, 0x82FA, 0x82FC, 0x82FD, +0x82FE, 0x82FF, 0x8300, 0x830A, +0x830B, 0x830D, 0x8310, 0x8312, +0x8313, 0x8316, 0x8318, 0x8319, +0x831D, 0x831E, 0x831F, 0x8320, +0x8321, 0x8322, 0x8323, 0x8324, +0x8325, 0x8326, 0x8329, 0x832A, +0x832E, 0x8330, 0x8332, 0x8337, +0x833B, 0x833D, 0x5564, 0x813E, +0x75B2, 0x76AE, 0x5339, 0x75DE, +0x50FB, 0x5C41, 0x8B6C, 0x7BC7, +0x504F, 0x7247, 0x9A97, 0x98D8, +0x6F02, 0x74E2, 0x7968, 0x6487, +0x77A5, 0x62FC, 0x9891, 0x8D2B, +0x54C1, 0x8058, 0x4E52, 0x576A, +0x82F9, 0x840D, 0x5E73, 0x51ED, +0x74F6, 0x8BC4, 0x5C4F, 0x5761, +0x6CFC, 0x9887, 0x5A46, 0x7834, +0x9B44, 0x8FEB, 0x7C95, 0x5256, +0x6251, 0x94FA, 0x4EC6, 0x8386, +0x8461, 0x83E9, 0x84B2, 0x57D4, +0x6734, 0x5703, 0x666E, 0x6D66, +0x8C31, 0x66DD, 0x7011, 0x671F, +0x6B3A, 0x6816, 0x621A, 0x59BB, +0x4E03, 0x51C4, 0x6F06, 0x67D2, +0x6C8F, 0x5176, 0x68CB, 0x5947, +0x6B67, 0x7566, 0x5D0E, 0x8110, +0x9F50, 0x65D7, 0x7948, 0x7941, +0x9A91, 0x8D77, 0x5C82, 0x4E5E, +0x4F01, 0x542F, 0x5951, 0x780C, +0x5668, 0x6C14, 0x8FC4, 0x5F03, +0x6C7D, 0x6CE3, 0x8BAB, 0x6390, +0x833E, 0x833F, 0x8341, 0x8342, +0x8344, 0x8345, 0x8348, 0x834A, +0x834B, 0x834C, 0x834D, 0x834E, +0x8353, 0x8355, 0x8356, 0x8357, +0x8358, 0x8359, 0x835D, 0x8362, +0x8370, 0x8371, 0x8372, 0x8373, +0x8374, 0x8375, 0x8376, 0x8379, +0x837A, 0x837E, 0x837F, 0x8380, +0x8381, 0x8382, 0x8383, 0x8384, +0x8387, 0x8388, 0x838A, 0x838B, +0x838C, 0x838D, 0x838F, 0x8390, +0x8391, 0x8394, 0x8395, 0x8396, +0x8397, 0x8399, 0x839A, 0x839D, +0x839F, 0x83A1, 0x83A2, 0x83A3, +0x83A4, 0x83A5, 0x83A6, 0x83A7, +0x83AC, 0x83AD, 0x83AE, 0x83AF, +0x83B5, 0x83BB, 0x83BE, 0x83BF, +0x83C2, 0x83C3, 0x83C4, 0x83C6, +0x83C8, 0x83C9, 0x83CB, 0x83CD, +0x83CE, 0x83D0, 0x83D1, 0x83D2, +0x83D3, 0x83D5, 0x83D7, 0x83D9, +0x83DA, 0x83DB, 0x83DE, 0x83E2, +0x83E3, 0x83E4, 0x83E6, 0x83E7, +0x83E8, 0x83EB, 0x83EC, 0x83ED, +0x6070, 0x6D3D, 0x7275, 0x6266, +0x948E, 0x94C5, 0x5343, 0x8FC1, +0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, +0x9ED4, 0x94B1, 0x94B3, 0x524D, +0x6F5C, 0x9063, 0x6D45, 0x8C34, +0x5811, 0x5D4C, 0x6B20, 0x6B49, +0x67AA, 0x545B, 0x8154, 0x7F8C, +0x5899, 0x8537, 0x5F3A, 0x62A2, +0x6A47, 0x9539, 0x6572, 0x6084, +0x6865, 0x77A7, 0x4E54, 0x4FA8, +0x5DE7, 0x9798, 0x64AC, 0x7FD8, +0x5CED, 0x4FCF, 0x7A8D, 0x5207, +0x8304, 0x4E14, 0x602F, 0x7A83, +0x94A6, 0x4FB5, 0x4EB2, 0x79E6, +0x7434, 0x52E4, 0x82B9, 0x64D2, +0x79BD, 0x5BDD, 0x6C81, 0x9752, +0x8F7B, 0x6C22, 0x503E, 0x537F, +0x6E05, 0x64CE, 0x6674, 0x6C30, +0x60C5, 0x9877, 0x8BF7, 0x5E86, +0x743C, 0x7A77, 0x79CB, 0x4E18, +0x90B1, 0x7403, 0x6C42, 0x56DA, +0x914B, 0x6CC5, 0x8D8B, 0x533A, +0x86C6, 0x66F2, 0x8EAF, 0x5C48, +0x9A71, 0x6E20, 0x83EE, 0x83EF, +0x83F3, 0x83F4, 0x83F5, 0x83F6, +0x83F7, 0x83FA, 0x83FB, 0x83FC, +0x83FE, 0x83FF, 0x8400, 0x8402, +0x8405, 0x8407, 0x8408, 0x8409, +0x840A, 0x8410, 0x8412, 0x8413, +0x8414, 0x8415, 0x8416, 0x8417, +0x8419, 0x841A, 0x841B, 0x841E, +0x841F, 0x8420, 0x8421, 0x8422, +0x8423, 0x8429, 0x842A, 0x842B, +0x842C, 0x842D, 0x842E, 0x842F, +0x8430, 0x8432, 0x8433, 0x8434, +0x8435, 0x8436, 0x8437, 0x8439, +0x843A, 0x843B, 0x843E, 0x843F, +0x8440, 0x8441, 0x8442, 0x8443, +0x8444, 0x8445, 0x8447, 0x8448, +0x8449, 0x844A, 0x844B, 0x844C, +0x844D, 0x844E, 0x844F, 0x8450, +0x8452, 0x8453, 0x8454, 0x8455, +0x8456, 0x8458, 0x845D, 0x845E, +0x845F, 0x8460, 0x8462, 0x8464, +0x8465, 0x8466, 0x8467, 0x8468, +0x846A, 0x846E, 0x846F, 0x8470, +0x8472, 0x8474, 0x8477, 0x8479, +0x847B, 0x847C, 0x53D6, 0x5A36, +0x9F8B, 0x8DA3, 0x53BB, 0x5708, +0x98A7, 0x6743, 0x919B, 0x6CC9, +0x5168, 0x75CA, 0x62F3, 0x72AC, +0x5238, 0x529D, 0x7F3A, 0x7094, +0x7638, 0x5374, 0x9E4A, 0x69B7, +0x786E, 0x96C0, 0x88D9, 0x7FA4, +0x7136, 0x71C3, 0x5189, 0x67D3, +0x74E4, 0x58E4, 0x6518, 0x56B7, +0x8BA9, 0x9976, 0x6270, 0x7ED5, +0x60F9, 0x70ED, 0x58EC, 0x4EC1, +0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, +0x8BA4, 0x5203, 0x598A, 0x7EAB, +0x6254, 0x4ECD, 0x65E5, 0x620E, +0x8338, 0x84C9, 0x8363, 0x878D, +0x7194, 0x6EB6, 0x5BB9, 0x7ED2, +0x5197, 0x63C9, 0x67D4, 0x8089, +0x8339, 0x8815, 0x5112, 0x5B7A, +0x5982, 0x8FB1, 0x4E73, 0x6C5D, +0x5165, 0x8925, 0x8F6F, 0x962E, +0x854A, 0x745E, 0x9510, 0x95F0, +0x6DA6, 0x82E5, 0x5F31, 0x6492, +0x6D12, 0x8428, 0x816E, 0x9CC3, +0x585E, 0x8D5B, 0x4E09, 0x53C1, +0x847D, 0x847E, 0x847F, 0x8480, +0x8481, 0x8483, 0x8484, 0x8485, +0x8486, 0x848A, 0x848D, 0x848F, +0x8490, 0x8491, 0x8492, 0x8493, +0x8494, 0x8495, 0x8496, 0x8498, +0x849A, 0x849B, 0x849D, 0x849E, +0x849F, 0x84A0, 0x84A2, 0x84A3, +0x84A4, 0x84A5, 0x84A6, 0x84A7, +0x84A8, 0x84A9, 0x84AA, 0x84AB, +0x84AC, 0x84AD, 0x84AE, 0x84B0, +0x84B1, 0x84B3, 0x84B5, 0x84B6, +0x84B7, 0x84BB, 0x84BC, 0x84BE, +0x84C0, 0x84C2, 0x84C3, 0x84C5, +0x84C6, 0x84C7, 0x84C8, 0x84CB, +0x84CC, 0x84CE, 0x84CF, 0x84D2, +0x84D4, 0x84D5, 0x84D7, 0x84D8, +0x84D9, 0x84DA, 0x84DB, 0x84DC, +0x84DE, 0x84E1, 0x84E2, 0x84E4, +0x84E7, 0x84E8, 0x84E9, 0x84EA, +0x84EB, 0x84ED, 0x84EE, 0x84EF, +0x84F1, 0x84F2, 0x84F3, 0x84F4, +0x84F5, 0x84F6, 0x84F7, 0x84F8, +0x84F9, 0x84FA, 0x84FB, 0x84FD, +0x84FE, 0x8500, 0x8501, 0x8502, +0x4F1E, 0x6563, 0x6851, 0x55D3, +0x4E27, 0x6414, 0x9A9A, 0x626B, +0x5AC2, 0x745F, 0x8272, 0x6DA9, +0x68EE, 0x50E7, 0x838E, 0x7802, +0x6740, 0x5239, 0x6C99, 0x7EB1, +0x50BB, 0x5565, 0x715E, 0x7B5B, +0x6652, 0x73CA, 0x82EB, 0x6749, +0x5C71, 0x5220, 0x717D, 0x886B, +0x95EA, 0x9655, 0x64C5, 0x8D61, +0x81B3, 0x5584, 0x6C55, 0x6247, +0x7F2E, 0x5892, 0x4F24, 0x5546, +0x8D4F, 0x664C, 0x4E0A, 0x5C1A, +0x88F3, 0x68A2, 0x634E, 0x7A0D, +0x70E7, 0x828D, 0x52FA, 0x97F6, +0x5C11, 0x54E8, 0x90B5, 0x7ECD, +0x5962, 0x8D4A, 0x86C7, 0x820C, +0x820D, 0x8D66, 0x6444, 0x5C04, +0x6151, 0x6D89, 0x793E, 0x8BBE, +0x7837, 0x7533, 0x547B, 0x4F38, +0x8EAB, 0x6DF1, 0x5A20, 0x7EC5, +0x795E, 0x6C88, 0x5BA1, 0x5A76, +0x751A, 0x80BE, 0x614E, 0x6E17, +0x58F0, 0x751F, 0x7525, 0x7272, +0x5347, 0x7EF3, 0x8503, 0x8504, +0x8505, 0x8506, 0x8507, 0x8508, +0x8509, 0x850A, 0x850B, 0x850D, +0x850E, 0x850F, 0x8510, 0x8512, +0x8514, 0x8515, 0x8516, 0x8518, +0x8519, 0x851B, 0x851C, 0x851D, +0x851E, 0x8520, 0x8522, 0x8523, +0x8524, 0x8525, 0x8526, 0x8527, +0x8528, 0x8529, 0x852A, 0x852D, +0x852E, 0x852F, 0x8530, 0x8531, +0x8532, 0x8533, 0x8534, 0x8535, +0x8536, 0x853E, 0x853F, 0x8540, +0x8541, 0x8542, 0x8544, 0x8545, +0x8546, 0x8547, 0x854B, 0x854C, +0x854D, 0x854E, 0x854F, 0x8550, +0x8551, 0x8552, 0x8553, 0x8554, +0x8555, 0x8557, 0x8558, 0x855A, +0x855B, 0x855C, 0x855D, 0x855F, +0x8560, 0x8561, 0x8562, 0x8563, +0x8565, 0x8566, 0x8567, 0x8569, +0x856A, 0x856B, 0x856C, 0x856D, +0x856E, 0x856F, 0x8570, 0x8571, +0x8573, 0x8575, 0x8576, 0x8577, +0x8578, 0x857C, 0x857D, 0x857F, +0x8580, 0x8581, 0x7701, 0x76DB, +0x5269, 0x80DC, 0x5723, 0x5E08, +0x5931, 0x72EE, 0x65BD, 0x6E7F, +0x8BD7, 0x5C38, 0x8671, 0x5341, +0x77F3, 0x62FE, 0x65F6, 0x4EC0, +0x98DF, 0x8680, 0x5B9E, 0x8BC6, +0x53F2, 0x77E2, 0x4F7F, 0x5C4E, +0x9A76, 0x59CB, 0x5F0F, 0x793A, +0x58EB, 0x4E16, 0x67FF, 0x4E8B, +0x62ED, 0x8A93, 0x901D, 0x52BF, +0x662F, 0x55DC, 0x566C, 0x9002, +0x4ED5, 0x4F8D, 0x91CA, 0x9970, +0x6C0F, 0x5E02, 0x6043, 0x5BA4, +0x89C6, 0x8BD5, 0x6536, 0x624B, +0x9996, 0x5B88, 0x5BFF, 0x6388, +0x552E, 0x53D7, 0x7626, 0x517D, +0x852C, 0x67A2, 0x68B3, 0x6B8A, +0x6292, 0x8F93, 0x53D4, 0x8212, +0x6DD1, 0x758F, 0x4E66, 0x8D4E, +0x5B70, 0x719F, 0x85AF, 0x6691, +0x66D9, 0x7F72, 0x8700, 0x9ECD, +0x9F20, 0x5C5E, 0x672F, 0x8FF0, +0x6811, 0x675F, 0x620D, 0x7AD6, +0x5885, 0x5EB6, 0x6570, 0x6F31, +0x8582, 0x8583, 0x8586, 0x8588, +0x8589, 0x858A, 0x858B, 0x858C, +0x858D, 0x858E, 0x8590, 0x8591, +0x8592, 0x8593, 0x8594, 0x8595, +0x8596, 0x8597, 0x8598, 0x8599, +0x859A, 0x859D, 0x859E, 0x859F, +0x85A0, 0x85A1, 0x85A2, 0x85A3, +0x85A5, 0x85A6, 0x85A7, 0x85A9, +0x85AB, 0x85AC, 0x85AD, 0x85B1, +0x85B2, 0x85B3, 0x85B4, 0x85B5, +0x85B6, 0x85B8, 0x85BA, 0x85BB, +0x85BC, 0x85BD, 0x85BE, 0x85BF, +0x85C0, 0x85C2, 0x85C3, 0x85C4, +0x85C5, 0x85C6, 0x85C7, 0x85C8, +0x85CA, 0x85CB, 0x85CC, 0x85CD, +0x85CE, 0x85D1, 0x85D2, 0x85D4, +0x85D6, 0x85D7, 0x85D8, 0x85D9, +0x85DA, 0x85DB, 0x85DD, 0x85DE, +0x85DF, 0x85E0, 0x85E1, 0x85E2, +0x85E3, 0x85E5, 0x85E6, 0x85E7, +0x85E8, 0x85EA, 0x85EB, 0x85EC, +0x85ED, 0x85EE, 0x85EF, 0x85F0, +0x85F1, 0x85F2, 0x85F3, 0x85F4, +0x85F5, 0x85F6, 0x85F7, 0x85F8, +0x6055, 0x5237, 0x800D, 0x6454, +0x8870, 0x7529, 0x5E05, 0x6813, +0x62F4, 0x971C, 0x53CC, 0x723D, +0x8C01, 0x6C34, 0x7761, 0x7A0E, +0x542E, 0x77AC, 0x987A, 0x821C, +0x8BF4, 0x7855, 0x6714, 0x70C1, +0x65AF, 0x6495, 0x5636, 0x601D, +0x79C1, 0x53F8, 0x4E1D, 0x6B7B, +0x8086, 0x5BFA, 0x55E3, 0x56DB, +0x4F3A, 0x4F3C, 0x9972, 0x5DF3, +0x677E, 0x8038, 0x6002, 0x9882, +0x9001, 0x5B8B, 0x8BBC, 0x8BF5, +0x641C, 0x8258, 0x64DE, 0x55FD, +0x82CF, 0x9165, 0x4FD7, 0x7D20, +0x901F, 0x7C9F, 0x50F3, 0x5851, +0x6EAF, 0x5BBF, 0x8BC9, 0x8083, +0x9178, 0x849C, 0x7B97, 0x867D, +0x968B, 0x968F, 0x7EE5, 0x9AD3, +0x788E, 0x5C81, 0x7A57, 0x9042, +0x96A7, 0x795F, 0x5B59, 0x635F, +0x7B0B, 0x84D1, 0x68AD, 0x5506, +0x7F29, 0x7410, 0x7D22, 0x9501, +0x6240, 0x584C, 0x4ED6, 0x5B83, +0x5979, 0x5854, 0x85F9, 0x85FA, +0x85FC, 0x85FD, 0x85FE, 0x8600, +0x8601, 0x8602, 0x8603, 0x8604, +0x8606, 0x8607, 0x8608, 0x8609, +0x860A, 0x860B, 0x860C, 0x860D, +0x860E, 0x860F, 0x8610, 0x8612, +0x8613, 0x8614, 0x8615, 0x8617, +0x8618, 0x8619, 0x861A, 0x861B, +0x861C, 0x861D, 0x861E, 0x861F, +0x8620, 0x8621, 0x8622, 0x8623, +0x8624, 0x8625, 0x8626, 0x8628, +0x862A, 0x862B, 0x862C, 0x862D, +0x862E, 0x862F, 0x8630, 0x8631, +0x8632, 0x8633, 0x8634, 0x8635, +0x8636, 0x8637, 0x8639, 0x863A, +0x863B, 0x863D, 0x863E, 0x863F, +0x8640, 0x8641, 0x8642, 0x8643, +0x8644, 0x8645, 0x8646, 0x8647, +0x8648, 0x8649, 0x864A, 0x864B, +0x864C, 0x8652, 0x8653, 0x8655, +0x8656, 0x8657, 0x8658, 0x8659, +0x865B, 0x865C, 0x865D, 0x865F, +0x8660, 0x8661, 0x8663, 0x8664, +0x8665, 0x8666, 0x8667, 0x8668, +0x8669, 0x866A, 0x736D, 0x631E, +0x8E4B, 0x8E0F, 0x80CE, 0x82D4, +0x62AC, 0x53F0, 0x6CF0, 0x915E, +0x592A, 0x6001, 0x6C70, 0x574D, +0x644A, 0x8D2A, 0x762B, 0x6EE9, +0x575B, 0x6A80, 0x75F0, 0x6F6D, +0x8C2D, 0x8C08, 0x5766, 0x6BEF, +0x8892, 0x78B3, 0x63A2, 0x53F9, +0x70AD, 0x6C64, 0x5858, 0x642A, +0x5802, 0x68E0, 0x819B, 0x5510, +0x7CD6, 0x5018, 0x8EBA, 0x6DCC, +0x8D9F, 0x70EB, 0x638F, 0x6D9B, +0x6ED4, 0x7EE6, 0x8404, 0x6843, +0x9003, 0x6DD8, 0x9676, 0x8BA8, +0x5957, 0x7279, 0x85E4, 0x817E, +0x75BC, 0x8A8A, 0x68AF, 0x5254, +0x8E22, 0x9511, 0x63D0, 0x9898, +0x8E44, 0x557C, 0x4F53, 0x66FF, +0x568F, 0x60D5, 0x6D95, 0x5243, +0x5C49, 0x5929, 0x6DFB, 0x586B, +0x7530, 0x751C, 0x606C, 0x8214, +0x8146, 0x6311, 0x6761, 0x8FE2, +0x773A, 0x8DF3, 0x8D34, 0x94C1, +0x5E16, 0x5385, 0x542C, 0x70C3, +0x866D, 0x866F, 0x8670, 0x8672, +0x8673, 0x8674, 0x8675, 0x8676, +0x8677, 0x8678, 0x8683, 0x8684, +0x8685, 0x8686, 0x8687, 0x8688, +0x8689, 0x868E, 0x868F, 0x8690, +0x8691, 0x8692, 0x8694, 0x8696, +0x8697, 0x8698, 0x8699, 0x869A, +0x869B, 0x869E, 0x869F, 0x86A0, +0x86A1, 0x86A2, 0x86A5, 0x86A6, +0x86AB, 0x86AD, 0x86AE, 0x86B2, +0x86B3, 0x86B7, 0x86B8, 0x86B9, +0x86BB, 0x86BC, 0x86BD, 0x86BE, +0x86BF, 0x86C1, 0x86C2, 0x86C3, +0x86C5, 0x86C8, 0x86CC, 0x86CD, +0x86D2, 0x86D3, 0x86D5, 0x86D6, +0x86D7, 0x86DA, 0x86DC, 0x86DD, +0x86E0, 0x86E1, 0x86E2, 0x86E3, +0x86E5, 0x86E6, 0x86E7, 0x86E8, +0x86EA, 0x86EB, 0x86EC, 0x86EF, +0x86F5, 0x86F6, 0x86F7, 0x86FA, +0x86FB, 0x86FC, 0x86FD, 0x86FF, +0x8701, 0x8704, 0x8705, 0x8706, +0x870B, 0x870C, 0x870E, 0x870F, +0x8710, 0x8711, 0x8714, 0x8716, +0x6C40, 0x5EF7, 0x505C, 0x4EAD, +0x5EAD, 0x633A, 0x8247, 0x901A, +0x6850, 0x916E, 0x77B3, 0x540C, +0x94DC, 0x5F64, 0x7AE5, 0x6876, +0x6345, 0x7B52, 0x7EDF, 0x75DB, +0x5077, 0x6295, 0x5934, 0x900F, +0x51F8, 0x79C3, 0x7A81, 0x56FE, +0x5F92, 0x9014, 0x6D82, 0x5C60, +0x571F, 0x5410, 0x5154, 0x6E4D, +0x56E2, 0x63A8, 0x9893, 0x817F, +0x8715, 0x892A, 0x9000, 0x541E, +0x5C6F, 0x81C0, 0x62D6, 0x6258, +0x8131, 0x9E35, 0x9640, 0x9A6E, +0x9A7C, 0x692D, 0x59A5, 0x62D3, +0x553E, 0x6316, 0x54C7, 0x86D9, +0x6D3C, 0x5A03, 0x74E6, 0x889C, +0x6B6A, 0x5916, 0x8C4C, 0x5F2F, +0x6E7E, 0x73A9, 0x987D, 0x4E38, +0x70F7, 0x5B8C, 0x7897, 0x633D, +0x665A, 0x7696, 0x60CB, 0x5B9B, +0x5A49, 0x4E07, 0x8155, 0x6C6A, +0x738B, 0x4EA1, 0x6789, 0x7F51, +0x5F80, 0x65FA, 0x671B, 0x5FD8, +0x5984, 0x5A01, 0x8719, 0x871B, +0x871D, 0x871F, 0x8720, 0x8724, +0x8726, 0x8727, 0x8728, 0x872A, +0x872B, 0x872C, 0x872D, 0x872F, +0x8730, 0x8732, 0x8733, 0x8735, +0x8736, 0x8738, 0x8739, 0x873A, +0x873C, 0x873D, 0x8740, 0x8741, +0x8742, 0x8743, 0x8744, 0x8745, +0x8746, 0x874A, 0x874B, 0x874D, +0x874F, 0x8750, 0x8751, 0x8752, +0x8754, 0x8755, 0x8756, 0x8758, +0x875A, 0x875B, 0x875C, 0x875D, +0x875E, 0x875F, 0x8761, 0x8762, +0x8766, 0x8767, 0x8768, 0x8769, +0x876A, 0x876B, 0x876C, 0x876D, +0x876F, 0x8771, 0x8772, 0x8773, +0x8775, 0x8777, 0x8778, 0x8779, +0x877A, 0x877F, 0x8780, 0x8781, +0x8784, 0x8786, 0x8787, 0x8789, +0x878A, 0x878C, 0x878E, 0x878F, +0x8790, 0x8791, 0x8792, 0x8794, +0x8795, 0x8796, 0x8798, 0x8799, +0x879A, 0x879B, 0x879C, 0x879D, +0x879E, 0x87A0, 0x87A1, 0x87A2, +0x87A3, 0x87A4, 0x5DCD, 0x5FAE, +0x5371, 0x97E6, 0x8FDD, 0x6845, +0x56F4, 0x552F, 0x60DF, 0x4E3A, +0x6F4D, 0x7EF4, 0x82C7, 0x840E, +0x59D4, 0x4F1F, 0x4F2A, 0x5C3E, +0x7EAC, 0x672A, 0x851A, 0x5473, +0x754F, 0x80C3, 0x5582, 0x9B4F, +0x4F4D, 0x6E2D, 0x8C13, 0x5C09, +0x6170, 0x536B, 0x761F, 0x6E29, +0x868A, 0x6587, 0x95FB, 0x7EB9, +0x543B, 0x7A33, 0x7D0A, 0x95EE, +0x55E1, 0x7FC1, 0x74EE, 0x631D, +0x8717, 0x6DA1, 0x7A9D, 0x6211, +0x65A1, 0x5367, 0x63E1, 0x6C83, +0x5DEB, 0x545C, 0x94A8, 0x4E4C, +0x6C61, 0x8BEC, 0x5C4B, 0x65E0, +0x829C, 0x68A7, 0x543E, 0x5434, +0x6BCB, 0x6B66, 0x4E94, 0x6342, +0x5348, 0x821E, 0x4F0D, 0x4FAE, +0x575E, 0x620A, 0x96FE, 0x6664, +0x7269, 0x52FF, 0x52A1, 0x609F, +0x8BEF, 0x6614, 0x7199, 0x6790, +0x897F, 0x7852, 0x77FD, 0x6670, +0x563B, 0x5438, 0x9521, 0x727A, +0x87A5, 0x87A6, 0x87A7, 0x87A9, +0x87AA, 0x87AE, 0x87B0, 0x87B1, +0x87B2, 0x87B4, 0x87B6, 0x87B7, +0x87B8, 0x87B9, 0x87BB, 0x87BC, +0x87BE, 0x87BF, 0x87C1, 0x87C2, +0x87C3, 0x87C4, 0x87C5, 0x87C7, +0x87C8, 0x87C9, 0x87CC, 0x87CD, +0x87CE, 0x87CF, 0x87D0, 0x87D4, +0x87D5, 0x87D6, 0x87D7, 0x87D8, +0x87D9, 0x87DA, 0x87DC, 0x87DD, +0x87DE, 0x87DF, 0x87E1, 0x87E2, +0x87E3, 0x87E4, 0x87E6, 0x87E7, +0x87E8, 0x87E9, 0x87EB, 0x87EC, +0x87ED, 0x87EF, 0x87F0, 0x87F1, +0x87F2, 0x87F3, 0x87F4, 0x87F5, +0x87F6, 0x87F7, 0x87F8, 0x87FA, +0x87FB, 0x87FC, 0x87FD, 0x87FF, +0x8800, 0x8801, 0x8802, 0x8804, +0x8805, 0x8806, 0x8807, 0x8808, +0x8809, 0x880B, 0x880C, 0x880D, +0x880E, 0x880F, 0x8810, 0x8811, +0x8812, 0x8814, 0x8817, 0x8818, +0x8819, 0x881A, 0x881C, 0x881D, +0x881E, 0x881F, 0x8820, 0x8823, +0x7A00, 0x606F, 0x5E0C, 0x6089, +0x819D, 0x5915, 0x60DC, 0x7184, +0x70EF, 0x6EAA, 0x6C50, 0x7280, +0x6A84, 0x88AD, 0x5E2D, 0x4E60, +0x5AB3, 0x559C, 0x94E3, 0x6D17, +0x7CFB, 0x9699, 0x620F, 0x7EC6, +0x778E, 0x867E, 0x5323, 0x971E, +0x8F96, 0x6687, 0x5CE1, 0x4FA0, +0x72ED, 0x4E0B, 0x53A6, 0x590F, +0x5413, 0x6380, 0x9528, 0x5148, +0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, +0x8D24, 0x8854, 0x8237, 0x95F2, +0x6D8E, 0x5F26, 0x5ACC, 0x663E, +0x9669, 0x73B0, 0x732E, 0x53BF, +0x817A, 0x9985, 0x7FA1, 0x5BAA, +0x9677, 0x9650, 0x7EBF, 0x76F8, +0x53A2, 0x9576, 0x9999, 0x7BB1, +0x8944, 0x6E58, 0x4E61, 0x7FD4, +0x7965, 0x8BE6, 0x60F3, 0x54CD, +0x4EAB, 0x9879, 0x5DF7, 0x6A61, +0x50CF, 0x5411, 0x8C61, 0x8427, +0x785D, 0x9704, 0x524A, 0x54EE, +0x56A3, 0x9500, 0x6D88, 0x5BB5, +0x6DC6, 0x6653, 0x8824, 0x8825, +0x8826, 0x8827, 0x8828, 0x8829, +0x882A, 0x882B, 0x882C, 0x882D, +0x882E, 0x882F, 0x8830, 0x8831, +0x8833, 0x8834, 0x8835, 0x8836, +0x8837, 0x8838, 0x883A, 0x883B, +0x883D, 0x883E, 0x883F, 0x8841, +0x8842, 0x8843, 0x8846, 0x8847, +0x8848, 0x8849, 0x884A, 0x884B, +0x884E, 0x884F, 0x8850, 0x8851, +0x8852, 0x8853, 0x8855, 0x8856, +0x8858, 0x885A, 0x885B, 0x885C, +0x885D, 0x885E, 0x885F, 0x8860, +0x8866, 0x8867, 0x886A, 0x886D, +0x886F, 0x8871, 0x8873, 0x8874, +0x8875, 0x8876, 0x8878, 0x8879, +0x887A, 0x887B, 0x887C, 0x8880, +0x8883, 0x8886, 0x8887, 0x8889, +0x888A, 0x888C, 0x888E, 0x888F, +0x8890, 0x8891, 0x8893, 0x8894, +0x8895, 0x8897, 0x8898, 0x8899, +0x889A, 0x889B, 0x889D, 0x889E, +0x889F, 0x88A0, 0x88A1, 0x88A3, +0x88A5, 0x88A6, 0x88A7, 0x88A8, +0x88A9, 0x88AA, 0x5C0F, 0x5B5D, +0x6821, 0x8096, 0x5578, 0x7B11, +0x6548, 0x6954, 0x4E9B, 0x6B47, +0x874E, 0x978B, 0x534F, 0x631F, +0x643A, 0x90AA, 0x659C, 0x80C1, +0x8C10, 0x5199, 0x68B0, 0x5378, +0x87F9, 0x61C8, 0x6CC4, 0x6CFB, +0x8C22, 0x5C51, 0x85AA, 0x82AF, +0x950C, 0x6B23, 0x8F9B, 0x65B0, +0x5FFB, 0x5FC3, 0x4FE1, 0x8845, +0x661F, 0x8165, 0x7329, 0x60FA, +0x5174, 0x5211, 0x578B, 0x5F62, +0x90A2, 0x884C, 0x9192, 0x5E78, +0x674F, 0x6027, 0x59D3, 0x5144, +0x51F6, 0x80F8, 0x5308, 0x6C79, +0x96C4, 0x718A, 0x4F11, 0x4FEE, +0x7F9E, 0x673D, 0x55C5, 0x9508, +0x79C0, 0x8896, 0x7EE3, 0x589F, +0x620C, 0x9700, 0x865A, 0x5618, +0x987B, 0x5F90, 0x8BB8, 0x84C4, +0x9157, 0x53D9, 0x65ED, 0x5E8F, +0x755C, 0x6064, 0x7D6E, 0x5A7F, +0x7EEA, 0x7EED, 0x8F69, 0x55A7, +0x5BA3, 0x60AC, 0x65CB, 0x7384, +0x88AC, 0x88AE, 0x88AF, 0x88B0, +0x88B2, 0x88B3, 0x88B4, 0x88B5, +0x88B6, 0x88B8, 0x88B9, 0x88BA, +0x88BB, 0x88BD, 0x88BE, 0x88BF, +0x88C0, 0x88C3, 0x88C4, 0x88C7, +0x88C8, 0x88CA, 0x88CB, 0x88CC, +0x88CD, 0x88CF, 0x88D0, 0x88D1, +0x88D3, 0x88D6, 0x88D7, 0x88DA, +0x88DB, 0x88DC, 0x88DD, 0x88DE, +0x88E0, 0x88E1, 0x88E6, 0x88E7, +0x88E9, 0x88EA, 0x88EB, 0x88EC, +0x88ED, 0x88EE, 0x88EF, 0x88F2, +0x88F5, 0x88F6, 0x88F7, 0x88FA, +0x88FB, 0x88FD, 0x88FF, 0x8900, +0x8901, 0x8903, 0x8904, 0x8905, +0x8906, 0x8907, 0x8908, 0x8909, +0x890B, 0x890C, 0x890D, 0x890E, +0x890F, 0x8911, 0x8914, 0x8915, +0x8916, 0x8917, 0x8918, 0x891C, +0x891D, 0x891E, 0x891F, 0x8920, +0x8922, 0x8923, 0x8924, 0x8926, +0x8927, 0x8928, 0x8929, 0x892C, +0x892D, 0x892E, 0x892F, 0x8931, +0x8932, 0x8933, 0x8935, 0x8937, +0x9009, 0x7663, 0x7729, 0x7EDA, +0x9774, 0x859B, 0x5B66, 0x7A74, +0x96EA, 0x8840, 0x52CB, 0x718F, +0x5FAA, 0x65EC, 0x8BE2, 0x5BFB, +0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, +0x8BAD, 0x8BAF, 0x900A, 0x8FC5, +0x538B, 0x62BC, 0x9E26, 0x9E2D, +0x5440, 0x4E2B, 0x82BD, 0x7259, +0x869C, 0x5D16, 0x8859, 0x6DAF, +0x96C5, 0x54D1, 0x4E9A, 0x8BB6, +0x7109, 0x54BD, 0x9609, 0x70DF, +0x6DF9, 0x76D0, 0x4E25, 0x7814, +0x8712, 0x5CA9, 0x5EF6, 0x8A00, +0x989C, 0x960E, 0x708E, 0x6CBF, +0x5944, 0x63A9, 0x773C, 0x884D, +0x6F14, 0x8273, 0x5830, 0x71D5, +0x538C, 0x781A, 0x96C1, 0x5501, +0x5F66, 0x7130, 0x5BB4, 0x8C1A, +0x9A8C, 0x6B83, 0x592E, 0x9E2F, +0x79E7, 0x6768, 0x626C, 0x4F6F, +0x75A1, 0x7F8A, 0x6D0B, 0x9633, +0x6C27, 0x4EF0, 0x75D2, 0x517B, +0x6837, 0x6F3E, 0x9080, 0x8170, +0x5996, 0x7476, 0x8938, 0x8939, +0x893A, 0x893B, 0x893C, 0x893D, +0x893E, 0x893F, 0x8940, 0x8942, +0x8943, 0x8945, 0x8946, 0x8947, +0x8948, 0x8949, 0x894A, 0x894B, +0x894C, 0x894D, 0x894E, 0x894F, +0x8950, 0x8951, 0x8952, 0x8953, +0x8954, 0x8955, 0x8956, 0x8957, +0x8958, 0x8959, 0x895A, 0x895B, +0x895C, 0x895D, 0x8960, 0x8961, +0x8962, 0x8963, 0x8964, 0x8965, +0x8967, 0x8968, 0x8969, 0x896A, +0x896B, 0x896C, 0x896D, 0x896E, +0x896F, 0x8970, 0x8971, 0x8972, +0x8973, 0x8974, 0x8975, 0x8976, +0x8977, 0x8978, 0x8979, 0x897A, +0x897C, 0x897D, 0x897E, 0x8980, +0x8982, 0x8984, 0x8985, 0x8987, +0x8988, 0x8989, 0x898A, 0x898B, +0x898C, 0x898D, 0x898E, 0x898F, +0x8990, 0x8991, 0x8992, 0x8993, +0x8994, 0x8995, 0x8996, 0x8997, +0x8998, 0x8999, 0x899A, 0x899B, +0x899C, 0x899D, 0x899E, 0x899F, +0x89A0, 0x89A1, 0x6447, 0x5C27, +0x9065, 0x7A91, 0x8C23, 0x59DA, +0x54AC, 0x8200, 0x836F, 0x8981, +0x8000, 0x6930, 0x564E, 0x8036, +0x7237, 0x91CE, 0x51B6, 0x4E5F, +0x9875, 0x6396, 0x4E1A, 0x53F6, +0x66F3, 0x814B, 0x591C, 0x6DB2, +0x4E00, 0x58F9, 0x533B, 0x63D6, +0x94F1, 0x4F9D, 0x4F0A, 0x8863, +0x9890, 0x5937, 0x9057, 0x79FB, +0x4EEA, 0x80F0, 0x7591, 0x6C82, +0x5B9C, 0x59E8, 0x5F5D, 0x6905, +0x8681, 0x501A, 0x5DF2, 0x4E59, +0x77E3, 0x4EE5, 0x827A, 0x6291, +0x6613, 0x9091, 0x5C79, 0x4EBF, +0x5F79, 0x81C6, 0x9038, 0x8084, +0x75AB, 0x4EA6, 0x88D4, 0x610F, +0x6BC5, 0x5FC6, 0x4E49, 0x76CA, +0x6EA2, 0x8BE3, 0x8BAE, 0x8C0A, +0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, +0x7ECE, 0x8335, 0x836B, 0x56E0, +0x6BB7, 0x97F3, 0x9634, 0x59FB, +0x541F, 0x94F6, 0x6DEB, 0x5BC5, +0x996E, 0x5C39, 0x5F15, 0x9690, +0x89A2, 0x89A3, 0x89A4, 0x89A5, +0x89A6, 0x89A7, 0x89A8, 0x89A9, +0x89AA, 0x89AB, 0x89AC, 0x89AD, +0x89AE, 0x89AF, 0x89B0, 0x89B1, +0x89B2, 0x89B3, 0x89B4, 0x89B5, +0x89B6, 0x89B7, 0x89B8, 0x89B9, +0x89BA, 0x89BB, 0x89BC, 0x89BD, +0x89BE, 0x89BF, 0x89C0, 0x89C3, +0x89CD, 0x89D3, 0x89D4, 0x89D5, +0x89D7, 0x89D8, 0x89D9, 0x89DB, +0x89DD, 0x89DF, 0x89E0, 0x89E1, +0x89E2, 0x89E4, 0x89E7, 0x89E8, +0x89E9, 0x89EA, 0x89EC, 0x89ED, +0x89EE, 0x89F0, 0x89F1, 0x89F2, +0x89F4, 0x89F5, 0x89F6, 0x89F7, +0x89F8, 0x89F9, 0x89FA, 0x89FB, +0x89FC, 0x89FD, 0x89FE, 0x89FF, +0x8A01, 0x8A02, 0x8A03, 0x8A04, +0x8A05, 0x8A06, 0x8A08, 0x8A09, +0x8A0A, 0x8A0B, 0x8A0C, 0x8A0D, +0x8A0E, 0x8A0F, 0x8A10, 0x8A11, +0x8A12, 0x8A13, 0x8A14, 0x8A15, +0x8A16, 0x8A17, 0x8A18, 0x8A19, +0x8A1A, 0x8A1B, 0x8A1C, 0x8A1D, +0x5370, 0x82F1, 0x6A31, 0x5A74, +0x9E70, 0x5E94, 0x7F28, 0x83B9, +0x8424, 0x8425, 0x8367, 0x8747, +0x8FCE, 0x8D62, 0x76C8, 0x5F71, +0x9896, 0x786C, 0x6620, 0x54DF, +0x62E5, 0x4F63, 0x81C3, 0x75C8, +0x5EB8, 0x96CD, 0x8E0A, 0x86F9, +0x548F, 0x6CF3, 0x6D8C, 0x6C38, +0x607F, 0x52C7, 0x7528, 0x5E7D, +0x4F18, 0x60A0, 0x5FE7, 0x5C24, +0x7531, 0x90AE, 0x94C0, 0x72B9, +0x6CB9, 0x6E38, 0x9149, 0x6709, +0x53CB, 0x53F3, 0x4F51, 0x91C9, +0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, +0x6DE4, 0x4E8E, 0x76C2, 0x6986, +0x865E, 0x611A, 0x8206, 0x4F59, +0x4FDE, 0x903E, 0x9C7C, 0x6109, +0x6E1D, 0x6E14, 0x9685, 0x4E88, +0x5A31, 0x96E8, 0x4E0E, 0x5C7F, +0x79B9, 0x5B87, 0x8BED, 0x7FBD, +0x7389, 0x57DF, 0x828B, 0x90C1, +0x5401, 0x9047, 0x55BB, 0x5CEA, +0x5FA1, 0x6108, 0x6B32, 0x72F1, +0x80B2, 0x8A89, 0x8A1E, 0x8A1F, +0x8A20, 0x8A21, 0x8A22, 0x8A23, +0x8A24, 0x8A25, 0x8A26, 0x8A27, +0x8A28, 0x8A29, 0x8A2A, 0x8A2B, +0x8A2C, 0x8A2D, 0x8A2E, 0x8A2F, +0x8A30, 0x8A31, 0x8A32, 0x8A33, +0x8A34, 0x8A35, 0x8A36, 0x8A37, +0x8A38, 0x8A39, 0x8A3A, 0x8A3B, +0x8A3C, 0x8A3D, 0x8A3F, 0x8A40, +0x8A41, 0x8A42, 0x8A43, 0x8A44, +0x8A45, 0x8A46, 0x8A47, 0x8A49, +0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, +0x8A4E, 0x8A4F, 0x8A50, 0x8A51, +0x8A52, 0x8A53, 0x8A54, 0x8A55, +0x8A56, 0x8A57, 0x8A58, 0x8A59, +0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, +0x8A5E, 0x8A5F, 0x8A60, 0x8A61, +0x8A62, 0x8A63, 0x8A64, 0x8A65, +0x8A66, 0x8A67, 0x8A68, 0x8A69, +0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, +0x8A6E, 0x8A6F, 0x8A70, 0x8A71, +0x8A72, 0x8A73, 0x8A74, 0x8A75, +0x8A76, 0x8A77, 0x8A78, 0x8A7A, +0x8A7B, 0x8A7C, 0x8A7D, 0x8A7E, +0x8A7F, 0x8A80, 0x6D74, 0x5BD3, +0x88D5, 0x9884, 0x8C6B, 0x9A6D, +0x9E33, 0x6E0A, 0x51A4, 0x5143, +0x57A3, 0x8881, 0x539F, 0x63F4, +0x8F95, 0x56ED, 0x5458, 0x5706, +0x733F, 0x6E90, 0x7F18, 0x8FDC, +0x82D1, 0x613F, 0x6028, 0x9662, +0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, +0x94A5, 0x5CB3, 0x7CA4, 0x6708, +0x60A6, 0x9605, 0x8018, 0x4E91, +0x90E7, 0x5300, 0x9668, 0x5141, +0x8FD0, 0x8574, 0x915D, 0x6655, +0x97F5, 0x5B55, 0x531D, 0x7838, +0x6742, 0x683D, 0x54C9, 0x707E, +0x5BB0, 0x8F7D, 0x518D, 0x5728, +0x54B1, 0x6512, 0x6682, 0x8D5E, +0x8D43, 0x810F, 0x846C, 0x906D, +0x7CDF, 0x51FF, 0x85FB, 0x67A3, +0x65E9, 0x6FA1, 0x86A4, 0x8E81, +0x566A, 0x9020, 0x7682, 0x7076, +0x71E5, 0x8D23, 0x62E9, 0x5219, +0x6CFD, 0x8D3C, 0x600E, 0x589E, +0x618E, 0x66FE, 0x8D60, 0x624E, +0x55B3, 0x6E23, 0x672D, 0x8F67, +0x8A81, 0x8A82, 0x8A83, 0x8A84, +0x8A85, 0x8A86, 0x8A87, 0x8A88, +0x8A8B, 0x8A8C, 0x8A8D, 0x8A8E, +0x8A8F, 0x8A90, 0x8A91, 0x8A92, +0x8A94, 0x8A95, 0x8A96, 0x8A97, +0x8A98, 0x8A99, 0x8A9A, 0x8A9B, +0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, +0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3, +0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, +0x8AA8, 0x8AA9, 0x8AAA, 0x8AAB, +0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, +0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, +0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, +0x8AB8, 0x8AB9, 0x8ABA, 0x8ABB, +0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, +0x8AC0, 0x8AC1, 0x8AC2, 0x8AC3, +0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, +0x8AC8, 0x8AC9, 0x8ACA, 0x8ACB, +0x8ACC, 0x8ACD, 0x8ACE, 0x8ACF, +0x8AD0, 0x8AD1, 0x8AD2, 0x8AD3, +0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, +0x8AD8, 0x8AD9, 0x8ADA, 0x8ADB, +0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, +0x8AE0, 0x8AE1, 0x8AE2, 0x8AE3, +0x94E1, 0x95F8, 0x7728, 0x6805, +0x69A8, 0x548B, 0x4E4D, 0x70B8, +0x8BC8, 0x6458, 0x658B, 0x5B85, +0x7A84, 0x503A, 0x5BE8, 0x77BB, +0x6BE1, 0x8A79, 0x7C98, 0x6CBE, +0x76CF, 0x65A9, 0x8F97, 0x5D2D, +0x5C55, 0x8638, 0x6808, 0x5360, +0x6218, 0x7AD9, 0x6E5B, 0x7EFD, +0x6A1F, 0x7AE0, 0x5F70, 0x6F33, +0x5F20, 0x638C, 0x6DA8, 0x6756, +0x4E08, 0x5E10, 0x8D26, 0x4ED7, +0x80C0, 0x7634, 0x969C, 0x62DB, +0x662D, 0x627E, 0x6CBC, 0x8D75, +0x7167, 0x7F69, 0x5146, 0x8087, +0x53EC, 0x906E, 0x6298, 0x54F2, +0x86F0, 0x8F99, 0x8005, 0x9517, +0x8517, 0x8FD9, 0x6D59, 0x73CD, +0x659F, 0x771F, 0x7504, 0x7827, +0x81FB, 0x8D1E, 0x9488, 0x4FA6, +0x6795, 0x75B9, 0x8BCA, 0x9707, +0x632F, 0x9547, 0x9635, 0x84B8, +0x6323, 0x7741, 0x5F81, 0x72F0, +0x4E89, 0x6014, 0x6574, 0x62EF, +0x6B63, 0x653F, 0x8AE4, 0x8AE5, +0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, +0x8AEA, 0x8AEB, 0x8AEC, 0x8AED, +0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, +0x8AF2, 0x8AF3, 0x8AF4, 0x8AF5, +0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, +0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD, +0x8AFE, 0x8AFF, 0x8B00, 0x8B01, +0x8B02, 0x8B03, 0x8B04, 0x8B05, +0x8B06, 0x8B08, 0x8B09, 0x8B0A, +0x8B0B, 0x8B0C, 0x8B0D, 0x8B0E, +0x8B0F, 0x8B10, 0x8B11, 0x8B12, +0x8B13, 0x8B14, 0x8B15, 0x8B16, +0x8B17, 0x8B18, 0x8B19, 0x8B1A, +0x8B1B, 0x8B1C, 0x8B1D, 0x8B1E, +0x8B1F, 0x8B20, 0x8B21, 0x8B22, +0x8B23, 0x8B24, 0x8B25, 0x8B27, +0x8B28, 0x8B29, 0x8B2A, 0x8B2B, +0x8B2C, 0x8B2D, 0x8B2E, 0x8B2F, +0x8B30, 0x8B31, 0x8B32, 0x8B33, +0x8B34, 0x8B35, 0x8B36, 0x8B37, +0x8B38, 0x8B39, 0x8B3A, 0x8B3B, +0x8B3C, 0x8B3D, 0x8B3E, 0x8B3F, +0x8B40, 0x8B41, 0x8B42, 0x8B43, +0x8B44, 0x8B45, 0x5E27, 0x75C7, +0x90D1, 0x8BC1, 0x829D, 0x679D, +0x652F, 0x5431, 0x8718, 0x77E5, +0x80A2, 0x8102, 0x6C41, 0x4E4B, +0x7EC7, 0x804C, 0x76F4, 0x690D, +0x6B96, 0x6267, 0x503C, 0x4F84, +0x5740, 0x6307, 0x6B62, 0x8DBE, +0x53EA, 0x65E8, 0x7EB8, 0x5FD7, +0x631A, 0x63B7, 0x81F3, 0x81F4, +0x7F6E, 0x5E1C, 0x5CD9, 0x5236, +0x667A, 0x79E9, 0x7A1A, 0x8D28, +0x7099, 0x75D4, 0x6EDE, 0x6CBB, +0x7A92, 0x4E2D, 0x76C5, 0x5FE0, +0x949F, 0x8877, 0x7EC8, 0x79CD, +0x80BF, 0x91CD, 0x4EF2, 0x4F17, +0x821F, 0x5468, 0x5DDE, 0x6D32, +0x8BCC, 0x7CA5, 0x8F74, 0x8098, +0x5E1A, 0x5492, 0x76B1, 0x5B99, +0x663C, 0x9AA4, 0x73E0, 0x682A, +0x86DB, 0x6731, 0x732A, 0x8BF8, +0x8BDB, 0x9010, 0x7AF9, 0x70DB, +0x716E, 0x62C4, 0x77A9, 0x5631, +0x4E3B, 0x8457, 0x67F1, 0x52A9, +0x86C0, 0x8D2E, 0x94F8, 0x7B51, +0x8B46, 0x8B47, 0x8B48, 0x8B49, +0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D, +0x8B4E, 0x8B4F, 0x8B50, 0x8B51, +0x8B52, 0x8B53, 0x8B54, 0x8B55, +0x8B56, 0x8B57, 0x8B58, 0x8B59, +0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, +0x8B5E, 0x8B5F, 0x8B60, 0x8B61, +0x8B62, 0x8B63, 0x8B64, 0x8B65, +0x8B67, 0x8B68, 0x8B69, 0x8B6A, +0x8B6B, 0x8B6D, 0x8B6E, 0x8B6F, +0x8B70, 0x8B71, 0x8B72, 0x8B73, +0x8B74, 0x8B75, 0x8B76, 0x8B77, +0x8B78, 0x8B79, 0x8B7A, 0x8B7B, +0x8B7C, 0x8B7D, 0x8B7E, 0x8B7F, +0x8B80, 0x8B81, 0x8B82, 0x8B83, +0x8B84, 0x8B85, 0x8B86, 0x8B87, +0x8B88, 0x8B89, 0x8B8A, 0x8B8B, +0x8B8C, 0x8B8D, 0x8B8E, 0x8B8F, +0x8B90, 0x8B91, 0x8B92, 0x8B93, +0x8B94, 0x8B95, 0x8B96, 0x8B97, +0x8B98, 0x8B99, 0x8B9A, 0x8B9B, +0x8B9C, 0x8B9D, 0x8B9E, 0x8B9F, +0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, +0x8BD0, 0x8BEA, 0x8C09, 0x8C1E, +0x4F4F, 0x6CE8, 0x795D, 0x9A7B, +0x6293, 0x722A, 0x62FD, 0x4E13, +0x7816, 0x8F6C, 0x64B0, 0x8D5A, +0x7BC6, 0x6869, 0x5E84, 0x88C5, +0x5986, 0x649E, 0x58EE, 0x72B6, +0x690E, 0x9525, 0x8FFD, 0x8D58, +0x5760, 0x7F00, 0x8C06, 0x51C6, +0x6349, 0x62D9, 0x5353, 0x684C, +0x7422, 0x8301, 0x914C, 0x5544, +0x7740, 0x707C, 0x6D4A, 0x5179, +0x54A8, 0x8D44, 0x59FF, 0x6ECB, +0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, +0x7C7D, 0x6ED3, 0x5B50, 0x81EA, +0x6E0D, 0x5B57, 0x9B03, 0x68D5, +0x8E2A, 0x5B97, 0x7EFC, 0x603B, +0x7EB5, 0x90B9, 0x8D70, 0x594F, +0x63CD, 0x79DF, 0x8DB3, 0x5352, +0x65CF, 0x7956, 0x8BC5, 0x963B, +0x7EC4, 0x94BB, 0x7E82, 0x5634, +0x9189, 0x6700, 0x7F6A, 0x5C0A, +0x9075, 0x6628, 0x5DE6, 0x4F50, +0x67DE, 0x505A, 0x4F5C, 0x5750, +0x5EA7, 0xE810, 0xE811, 0xE812, +0xE813, 0xE814, 0x8C38, 0x8C39, +0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, +0x8C3E, 0x8C3F, 0x8C40, 0x8C42, +0x8C43, 0x8C44, 0x8C45, 0x8C48, +0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, +0x8C4F, 0x8C50, 0x8C51, 0x8C52, +0x8C53, 0x8C54, 0x8C56, 0x8C57, +0x8C58, 0x8C59, 0x8C5B, 0x8C5C, +0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, +0x8C63, 0x8C64, 0x8C65, 0x8C66, +0x8C67, 0x8C68, 0x8C69, 0x8C6C, +0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, +0x8C71, 0x8C72, 0x8C74, 0x8C75, +0x8C76, 0x8C77, 0x8C7B, 0x8C7C, +0x8C7D, 0x8C7E, 0x8C7F, 0x8C80, +0x8C81, 0x8C83, 0x8C84, 0x8C86, +0x8C87, 0x8C88, 0x8C8B, 0x8C8D, +0x8C8E, 0x8C8F, 0x8C90, 0x8C91, +0x8C92, 0x8C93, 0x8C95, 0x8C96, +0x8C97, 0x8C99, 0x8C9A, 0x8C9B, +0x8C9C, 0x8C9D, 0x8C9E, 0x8C9F, +0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, +0x8CA4, 0x8CA5, 0x8CA6, 0x8CA7, +0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, +0x8CAC, 0x8CAD, 0x4E8D, 0x4E0C, +0x5140, 0x4E10, 0x5EFF, 0x5345, +0x4E15, 0x4E98, 0x4E1E, 0x9B32, +0x5B6C, 0x5669, 0x4E28, 0x79BA, +0x4E3F, 0x5315, 0x4E47, 0x592D, +0x723B, 0x536E, 0x6C10, 0x56DF, +0x80E4, 0x9997, 0x6BD3, 0x777E, +0x9F17, 0x4E36, 0x4E9F, 0x9F10, +0x4E5C, 0x4E69, 0x4E93, 0x8288, +0x5B5B, 0x556C, 0x560F, 0x4EC4, +0x538D, 0x539D, 0x53A3, 0x53A5, +0x53AE, 0x9765, 0x8D5D, 0x531A, +0x53F5, 0x5326, 0x532E, 0x533E, +0x8D5C, 0x5366, 0x5363, 0x5202, +0x5208, 0x520E, 0x522D, 0x5233, +0x523F, 0x5240, 0x524C, 0x525E, +0x5261, 0x525C, 0x84AF, 0x527D, +0x5282, 0x5281, 0x5290, 0x5293, +0x5182, 0x7F54, 0x4EBB, 0x4EC3, +0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, +0x4EEB, 0x4EDE, 0x4F1B, 0x4EF3, +0x4F22, 0x4F64, 0x4EF5, 0x4F25, +0x4F27, 0x4F09, 0x4F2B, 0x4F5E, +0x4F67, 0x6538, 0x4F5A, 0x4F5D, +0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, +0x8CB2, 0x8CB3, 0x8CB4, 0x8CB5, +0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, +0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD, +0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, +0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5, +0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, +0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD, +0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, +0x8CD2, 0x8CD3, 0x8CD4, 0x8CD5, +0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, +0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD, +0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, +0x8CE2, 0x8CE3, 0x8CE4, 0x8CE5, +0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, +0x8CEA, 0x8CEB, 0x8CEC, 0x8CED, +0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, +0x8CF2, 0x8CF3, 0x8CF4, 0x8CF5, +0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, +0x8CFA, 0x8CFB, 0x8CFC, 0x8CFD, +0x8CFE, 0x8CFF, 0x8D00, 0x8D01, +0x8D02, 0x8D03, 0x8D04, 0x8D05, +0x8D06, 0x8D07, 0x8D08, 0x8D09, +0x8D0A, 0x8D0B, 0x8D0C, 0x8D0D, +0x4F5F, 0x4F57, 0x4F32, 0x4F3D, +0x4F76, 0x4F74, 0x4F91, 0x4F89, +0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, +0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, +0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, +0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, +0x4FDF, 0x4FF8, 0x5029, 0x504C, +0x4FF3, 0x502C, 0x500F, 0x502E, +0x502D, 0x4FFE, 0x501C, 0x500C, +0x5025, 0x5028, 0x507E, 0x5043, +0x5055, 0x5048, 0x504E, 0x506C, +0x507B, 0x50A5, 0x50A7, 0x50A9, +0x50BA, 0x50D6, 0x5106, 0x50ED, +0x50EC, 0x50E6, 0x50EE, 0x5107, +0x510B, 0x4EDD, 0x6C3D, 0x4F58, +0x4F65, 0x4FCE, 0x9FA0, 0x6C46, +0x7C74, 0x516E, 0x5DFD, 0x9EC9, +0x9998, 0x5181, 0x5914, 0x52F9, +0x530D, 0x8A07, 0x5310, 0x51EB, +0x5919, 0x5155, 0x4EA0, 0x5156, +0x4EB3, 0x886E, 0x88A4, 0x4EB5, +0x8114, 0x88D2, 0x7980, 0x5B34, +0x8803, 0x7FB8, 0x51AB, 0x51B1, +0x51BD, 0x51BC, 0x8D0E, 0x8D0F, +0x8D10, 0x8D11, 0x8D12, 0x8D13, +0x8D14, 0x8D15, 0x8D16, 0x8D17, +0x8D18, 0x8D19, 0x8D1A, 0x8D1B, +0x8D1C, 0x8D20, 0x8D51, 0x8D52, +0x8D57, 0x8D5F, 0x8D65, 0x8D68, +0x8D69, 0x8D6A, 0x8D6C, 0x8D6E, +0x8D6F, 0x8D71, 0x8D72, 0x8D78, +0x8D79, 0x8D7A, 0x8D7B, 0x8D7C, +0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, +0x8D82, 0x8D83, 0x8D86, 0x8D87, +0x8D88, 0x8D89, 0x8D8C, 0x8D8D, +0x8D8E, 0x8D8F, 0x8D90, 0x8D92, +0x8D93, 0x8D95, 0x8D96, 0x8D97, +0x8D98, 0x8D99, 0x8D9A, 0x8D9B, +0x8D9C, 0x8D9D, 0x8D9E, 0x8DA0, +0x8DA1, 0x8DA2, 0x8DA4, 0x8DA5, +0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, +0x8DAA, 0x8DAB, 0x8DAC, 0x8DAD, +0x8DAE, 0x8DAF, 0x8DB0, 0x8DB2, +0x8DB6, 0x8DB7, 0x8DB9, 0x8DBB, +0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, +0x8DC5, 0x8DC7, 0x8DC8, 0x8DC9, +0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, +0x8DD3, 0x8DD4, 0x51C7, 0x5196, +0x51A2, 0x51A5, 0x8BA0, 0x8BA6, +0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, +0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, +0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, +0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, +0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, +0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, +0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, +0x8BFF, 0x8C00, 0x8C02, 0x8C04, +0x8C07, 0x8C0C, 0x8C0F, 0x8C11, +0x8C12, 0x8C14, 0x8C15, 0x8C16, +0x8C19, 0x8C1B, 0x8C18, 0x8C1D, +0x8C1F, 0x8C20, 0x8C21, 0x8C25, +0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, +0x8C2F, 0x8C32, 0x8C33, 0x8C35, +0x8C36, 0x5369, 0x537A, 0x961D, +0x9622, 0x9621, 0x9631, 0x962A, +0x963D, 0x963C, 0x9642, 0x9649, +0x9654, 0x965F, 0x9667, 0x966C, +0x9672, 0x9674, 0x9688, 0x968D, +0x9697, 0x96B0, 0x9097, 0x909B, +0x909D, 0x9099, 0x90AC, 0x90A1, +0x90B4, 0x90B3, 0x90B6, 0x90BA, +0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, +0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, +0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, +0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, +0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, +0x8DFF, 0x8E00, 0x8E01, 0x8E02, +0x8E03, 0x8E04, 0x8E06, 0x8E07, +0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, +0x8E10, 0x8E11, 0x8E12, 0x8E13, +0x8E15, 0x8E16, 0x8E17, 0x8E18, +0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, +0x8E20, 0x8E21, 0x8E24, 0x8E25, +0x8E26, 0x8E27, 0x8E28, 0x8E2B, +0x8E2D, 0x8E30, 0x8E32, 0x8E33, +0x8E34, 0x8E36, 0x8E37, 0x8E38, +0x8E3B, 0x8E3C, 0x8E3E, 0x8E3F, +0x8E43, 0x8E45, 0x8E46, 0x8E4C, +0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, +0x8E53, 0x8E54, 0x8E55, 0x8E56, +0x8E57, 0x8E58, 0x8E5A, 0x8E5B, +0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, +0x8E60, 0x8E61, 0x8E62, 0x8E63, +0x8E64, 0x8E65, 0x8E67, 0x8E68, +0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, +0x90B8, 0x90B0, 0x90CF, 0x90C5, +0x90BE, 0x90D0, 0x90C4, 0x90C7, +0x90D3, 0x90E6, 0x90E2, 0x90DC, +0x90D7, 0x90DB, 0x90EB, 0x90EF, +0x90FE, 0x9104, 0x9122, 0x911E, +0x9123, 0x9131, 0x912F, 0x9139, +0x9143, 0x9146, 0x520D, 0x5942, +0x52A2, 0x52AC, 0x52AD, 0x52BE, +0x54FF, 0x52D0, 0x52D6, 0x52F0, +0x53DF, 0x71EE, 0x77CD, 0x5EF4, +0x51F5, 0x51FC, 0x9B2F, 0x53B6, +0x5F01, 0x755A, 0x5DEF, 0x574C, +0x57A9, 0x57A1, 0x587E, 0x58BC, +0x58C5, 0x58D1, 0x5729, 0x572C, +0x572A, 0x5733, 0x5739, 0x572E, +0x572F, 0x575C, 0x573B, 0x5742, +0x5769, 0x5785, 0x576B, 0x5786, +0x577C, 0x577B, 0x5768, 0x576D, +0x5776, 0x5773, 0x57AD, 0x57A4, +0x578C, 0x57B2, 0x57CF, 0x57A7, +0x57B4, 0x5793, 0x57A0, 0x57D5, +0x57D8, 0x57DA, 0x57D9, 0x57D2, +0x57B8, 0x57F4, 0x57EF, 0x57F8, +0x57E4, 0x57DD, 0x8E73, 0x8E75, +0x8E77, 0x8E78, 0x8E79, 0x8E7A, +0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, +0x8E82, 0x8E83, 0x8E84, 0x8E86, +0x8E88, 0x8E89, 0x8E8A, 0x8E8B, +0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, +0x8E92, 0x8E93, 0x8E95, 0x8E96, +0x8E97, 0x8E98, 0x8E99, 0x8E9A, +0x8E9B, 0x8E9D, 0x8E9F, 0x8EA0, +0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, +0x8EA5, 0x8EA6, 0x8EA7, 0x8EA8, +0x8EA9, 0x8EAA, 0x8EAD, 0x8EAE, +0x8EB0, 0x8EB1, 0x8EB3, 0x8EB4, +0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, +0x8EB9, 0x8EBB, 0x8EBC, 0x8EBD, +0x8EBE, 0x8EBF, 0x8EC0, 0x8EC1, +0x8EC2, 0x8EC3, 0x8EC4, 0x8EC5, +0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, +0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, +0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, +0x8ED3, 0x8ED4, 0x8ED5, 0x8ED6, +0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, +0x8EDB, 0x8EDC, 0x8EDD, 0x8EDE, +0x8EDF, 0x8EE0, 0x8EE1, 0x8EE2, +0x8EE3, 0x8EE4, 0x580B, 0x580D, +0x57FD, 0x57ED, 0x5800, 0x581E, +0x5819, 0x5844, 0x5820, 0x5865, +0x586C, 0x5881, 0x5889, 0x589A, +0x5880, 0x99A8, 0x9F19, 0x61FF, +0x8279, 0x827D, 0x827F, 0x828F, +0x828A, 0x82A8, 0x8284, 0x828E, +0x8291, 0x8297, 0x8299, 0x82AB, +0x82B8, 0x82BE, 0x82B0, 0x82C8, +0x82CA, 0x82E3, 0x8298, 0x82B7, +0x82AE, 0x82CB, 0x82CC, 0x82C1, +0x82A9, 0x82B4, 0x82A1, 0x82AA, +0x829F, 0x82C4, 0x82CE, 0x82A4, +0x82E1, 0x8309, 0x82F7, 0x82E4, +0x830F, 0x8307, 0x82DC, 0x82F4, +0x82D2, 0x82D8, 0x830C, 0x82FB, +0x82D3, 0x8311, 0x831A, 0x8306, +0x8314, 0x8315, 0x82E0, 0x82D5, +0x831C, 0x8351, 0x835B, 0x835C, +0x8308, 0x8392, 0x833C, 0x8334, +0x8331, 0x839B, 0x835E, 0x832F, +0x834F, 0x8347, 0x8343, 0x835F, +0x8340, 0x8317, 0x8360, 0x832D, +0x833A, 0x8333, 0x8366, 0x8365, +0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, +0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, +0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, +0x8EF1, 0x8EF2, 0x8EF3, 0x8EF4, +0x8EF5, 0x8EF6, 0x8EF7, 0x8EF8, +0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, +0x8EFD, 0x8EFE, 0x8EFF, 0x8F00, +0x8F01, 0x8F02, 0x8F03, 0x8F04, +0x8F05, 0x8F06, 0x8F07, 0x8F08, +0x8F09, 0x8F0A, 0x8F0B, 0x8F0C, +0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, +0x8F11, 0x8F12, 0x8F13, 0x8F14, +0x8F15, 0x8F16, 0x8F17, 0x8F18, +0x8F19, 0x8F1A, 0x8F1B, 0x8F1C, +0x8F1D, 0x8F1E, 0x8F1F, 0x8F20, +0x8F21, 0x8F22, 0x8F23, 0x8F24, +0x8F25, 0x8F26, 0x8F27, 0x8F28, +0x8F29, 0x8F2A, 0x8F2B, 0x8F2C, +0x8F2D, 0x8F2E, 0x8F2F, 0x8F30, +0x8F31, 0x8F32, 0x8F33, 0x8F34, +0x8F35, 0x8F36, 0x8F37, 0x8F38, +0x8F39, 0x8F3A, 0x8F3B, 0x8F3C, +0x8F3D, 0x8F3E, 0x8F3F, 0x8F40, +0x8F41, 0x8F42, 0x8F43, 0x8F44, +0x8368, 0x831B, 0x8369, 0x836C, +0x836A, 0x836D, 0x836E, 0x83B0, +0x8378, 0x83B3, 0x83B4, 0x83A0, +0x83AA, 0x8393, 0x839C, 0x8385, +0x837C, 0x83B6, 0x83A9, 0x837D, +0x83B8, 0x837B, 0x8398, 0x839E, +0x83A8, 0x83BA, 0x83BC, 0x83C1, +0x8401, 0x83E5, 0x83D8, 0x5807, +0x8418, 0x840B, 0x83DD, 0x83FD, +0x83D6, 0x841C, 0x8438, 0x8411, +0x8406, 0x83D4, 0x83DF, 0x840F, +0x8403, 0x83F8, 0x83F9, 0x83EA, +0x83C5, 0x83C0, 0x8426, 0x83F0, +0x83E1, 0x845C, 0x8451, 0x845A, +0x8459, 0x8473, 0x8487, 0x8488, +0x847A, 0x8489, 0x8478, 0x843C, +0x8446, 0x8469, 0x8476, 0x848C, +0x848E, 0x8431, 0x846D, 0x84C1, +0x84CD, 0x84D0, 0x84E6, 0x84BD, +0x84D3, 0x84CA, 0x84BF, 0x84BA, +0x84E0, 0x84A1, 0x84B9, 0x84B4, +0x8497, 0x84E5, 0x84E3, 0x850C, +0x750D, 0x8538, 0x84F0, 0x8539, +0x851F, 0x853A, 0x8F45, 0x8F46, +0x8F47, 0x8F48, 0x8F49, 0x8F4A, +0x8F4B, 0x8F4C, 0x8F4D, 0x8F4E, +0x8F4F, 0x8F50, 0x8F51, 0x8F52, +0x8F53, 0x8F54, 0x8F55, 0x8F56, +0x8F57, 0x8F58, 0x8F59, 0x8F5A, +0x8F5B, 0x8F5C, 0x8F5D, 0x8F5E, +0x8F5F, 0x8F60, 0x8F61, 0x8F62, +0x8F63, 0x8F64, 0x8F65, 0x8F6A, +0x8F80, 0x8F8C, 0x8F92, 0x8F9D, +0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, +0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, +0x8FAC, 0x8FAD, 0x8FAE, 0x8FAF, +0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, +0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB, +0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, +0x8FC6, 0x8FC9, 0x8FCA, 0x8FCB, +0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, +0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0, +0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, +0x8FEF, 0x8FF1, 0x8FF2, 0x8FF4, +0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, +0x8FFC, 0x8FFE, 0x8FFF, 0x9007, +0x9008, 0x900C, 0x900E, 0x9013, +0x9015, 0x9018, 0x8556, 0x853B, +0x84FF, 0x84FC, 0x8559, 0x8548, +0x8568, 0x8564, 0x855E, 0x857A, +0x77A2, 0x8543, 0x8572, 0x857B, +0x85A4, 0x85A8, 0x8587, 0x858F, +0x8579, 0x85AE, 0x859C, 0x8585, +0x85B9, 0x85B7, 0x85B0, 0x85D3, +0x85C1, 0x85DC, 0x85FF, 0x8627, +0x8605, 0x8629, 0x8616, 0x863C, +0x5EFE, 0x5F08, 0x593C, 0x5941, +0x8037, 0x5955, 0x595A, 0x5958, +0x530F, 0x5C22, 0x5C25, 0x5C2C, +0x5C34, 0x624C, 0x626A, 0x629F, +0x62BB, 0x62CA, 0x62DA, 0x62D7, +0x62EE, 0x6322, 0x62F6, 0x6339, +0x634B, 0x6343, 0x63AD, 0x63F6, +0x6371, 0x637A, 0x638E, 0x63B4, +0x636D, 0x63AC, 0x638A, 0x6369, +0x63AE, 0x63BC, 0x63F2, 0x63F8, +0x63E0, 0x63FF, 0x63C4, 0x63DE, +0x63CE, 0x6452, 0x63C6, 0x63BE, +0x6445, 0x6441, 0x640B, 0x641B, +0x6420, 0x640C, 0x6426, 0x6421, +0x645E, 0x6484, 0x646D, 0x6496, +0x9019, 0x901C, 0x9023, 0x9024, +0x9025, 0x9027, 0x9028, 0x9029, +0x902A, 0x902B, 0x902C, 0x9030, +0x9031, 0x9032, 0x9033, 0x9034, +0x9037, 0x9039, 0x903A, 0x903D, +0x903F, 0x9040, 0x9043, 0x9045, +0x9046, 0x9048, 0x9049, 0x904A, +0x904B, 0x904C, 0x904E, 0x9054, +0x9055, 0x9056, 0x9059, 0x905A, +0x905C, 0x905D, 0x905E, 0x905F, +0x9060, 0x9061, 0x9064, 0x9066, +0x9067, 0x9069, 0x906A, 0x906B, +0x906C, 0x906F, 0x9070, 0x9071, +0x9072, 0x9073, 0x9076, 0x9077, +0x9078, 0x9079, 0x907A, 0x907B, +0x907C, 0x907E, 0x9081, 0x9084, +0x9085, 0x9086, 0x9087, 0x9089, +0x908A, 0x908C, 0x908D, 0x908E, +0x908F, 0x9090, 0x9092, 0x9094, +0x9096, 0x9098, 0x909A, 0x909C, +0x909E, 0x909F, 0x90A0, 0x90A4, +0x90A5, 0x90A7, 0x90A8, 0x90A9, +0x90AB, 0x90AD, 0x90B2, 0x90B7, +0x90BC, 0x90BD, 0x90BF, 0x90C0, +0x647A, 0x64B7, 0x64B8, 0x6499, +0x64BA, 0x64C0, 0x64D0, 0x64D7, +0x64E4, 0x64E2, 0x6509, 0x6525, +0x652E, 0x5F0B, 0x5FD2, 0x7519, +0x5F11, 0x535F, 0x53F1, 0x53FD, +0x53E9, 0x53E8, 0x53FB, 0x5412, +0x5416, 0x5406, 0x544B, 0x5452, +0x5453, 0x5454, 0x5456, 0x5443, +0x5421, 0x5457, 0x5459, 0x5423, +0x5432, 0x5482, 0x5494, 0x5477, +0x5471, 0x5464, 0x549A, 0x549B, +0x5484, 0x5476, 0x5466, 0x549D, +0x54D0, 0x54AD, 0x54C2, 0x54B4, +0x54D2, 0x54A7, 0x54A6, 0x54D3, +0x54D4, 0x5472, 0x54A3, 0x54D5, +0x54BB, 0x54BF, 0x54CC, 0x54D9, +0x54DA, 0x54DC, 0x54A9, 0x54AA, +0x54A4, 0x54DD, 0x54CF, 0x54DE, +0x551B, 0x54E7, 0x5520, 0x54FD, +0x5514, 0x54F3, 0x5522, 0x5523, +0x550F, 0x5511, 0x5527, 0x552A, +0x5567, 0x558F, 0x55B5, 0x5549, +0x556D, 0x5541, 0x5555, 0x553F, +0x5550, 0x553C, 0x90C2, 0x90C3, +0x90C6, 0x90C8, 0x90C9, 0x90CB, +0x90CC, 0x90CD, 0x90D2, 0x90D4, +0x90D5, 0x90D6, 0x90D8, 0x90D9, +0x90DA, 0x90DE, 0x90DF, 0x90E0, +0x90E3, 0x90E4, 0x90E5, 0x90E9, +0x90EA, 0x90EC, 0x90EE, 0x90F0, +0x90F1, 0x90F2, 0x90F3, 0x90F5, +0x90F6, 0x90F7, 0x90F9, 0x90FA, +0x90FB, 0x90FC, 0x90FF, 0x9100, +0x9101, 0x9103, 0x9105, 0x9106, +0x9107, 0x9108, 0x9109, 0x910A, +0x910B, 0x910C, 0x910D, 0x910E, +0x910F, 0x9110, 0x9111, 0x9112, +0x9113, 0x9114, 0x9115, 0x9116, +0x9117, 0x9118, 0x911A, 0x911B, +0x911C, 0x911D, 0x911F, 0x9120, +0x9121, 0x9124, 0x9125, 0x9126, +0x9127, 0x9128, 0x9129, 0x912A, +0x912B, 0x912C, 0x912D, 0x912E, +0x9130, 0x9132, 0x9133, 0x9134, +0x9135, 0x9136, 0x9137, 0x9138, +0x913A, 0x913B, 0x913C, 0x913D, +0x913E, 0x913F, 0x9140, 0x9141, +0x9142, 0x9144, 0x5537, 0x5556, +0x5575, 0x5576, 0x5577, 0x5533, +0x5530, 0x555C, 0x558B, 0x55D2, +0x5583, 0x55B1, 0x55B9, 0x5588, +0x5581, 0x559F, 0x557E, 0x55D6, +0x5591, 0x557B, 0x55DF, 0x55BD, +0x55BE, 0x5594, 0x5599, 0x55EA, +0x55F7, 0x55C9, 0x561F, 0x55D1, +0x55EB, 0x55EC, 0x55D4, 0x55E6, +0x55DD, 0x55C4, 0x55EF, 0x55E5, +0x55F2, 0x55F3, 0x55CC, 0x55CD, +0x55E8, 0x55F5, 0x55E4, 0x8F94, +0x561E, 0x5608, 0x560C, 0x5601, +0x5624, 0x5623, 0x55FE, 0x5600, +0x5627, 0x562D, 0x5658, 0x5639, +0x5657, 0x562C, 0x564D, 0x5662, +0x5659, 0x565C, 0x564C, 0x5654, +0x5686, 0x5664, 0x5671, 0x566B, +0x567B, 0x567C, 0x5685, 0x5693, +0x56AF, 0x56D4, 0x56D7, 0x56DD, +0x56E1, 0x56F5, 0x56EB, 0x56F9, +0x56FF, 0x5704, 0x570A, 0x5709, +0x571C, 0x5E0F, 0x5E19, 0x5E14, +0x5E11, 0x5E31, 0x5E3B, 0x5E3C, +0x9145, 0x9147, 0x9148, 0x9151, +0x9153, 0x9154, 0x9155, 0x9156, +0x9158, 0x9159, 0x915B, 0x915C, +0x915F, 0x9160, 0x9166, 0x9167, +0x9168, 0x916B, 0x916D, 0x9173, +0x917A, 0x917B, 0x917C, 0x9180, +0x9181, 0x9182, 0x9183, 0x9184, +0x9186, 0x9188, 0x918A, 0x918E, +0x918F, 0x9193, 0x9194, 0x9195, +0x9196, 0x9197, 0x9198, 0x9199, +0x919C, 0x919D, 0x919E, 0x919F, +0x91A0, 0x91A1, 0x91A4, 0x91A5, +0x91A6, 0x91A7, 0x91A8, 0x91A9, +0x91AB, 0x91AC, 0x91B0, 0x91B1, +0x91B2, 0x91B3, 0x91B6, 0x91B7, +0x91B8, 0x91B9, 0x91BB, 0x91BC, +0x91BD, 0x91BE, 0x91BF, 0x91C0, +0x91C1, 0x91C2, 0x91C3, 0x91C4, +0x91C5, 0x91C6, 0x91C8, 0x91CB, +0x91D0, 0x91D2, 0x91D3, 0x91D4, +0x91D5, 0x91D6, 0x91D7, 0x91D8, +0x91D9, 0x91DA, 0x91DB, 0x91DD, +0x91DE, 0x91DF, 0x91E0, 0x91E1, +0x91E2, 0x91E3, 0x91E4, 0x91E5, +0x5E37, 0x5E44, 0x5E54, 0x5E5B, +0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, +0x5C8D, 0x5C90, 0x5C96, 0x5C88, +0x5C98, 0x5C99, 0x5C91, 0x5C9A, +0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, +0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, +0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, +0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, +0x5D03, 0x5D27, 0x5D26, 0x5D2E, +0x5D24, 0x5D1E, 0x5D06, 0x5D1B, +0x5D58, 0x5D3E, 0x5D34, 0x5D3D, +0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, +0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, +0x5D74, 0x5D82, 0x5D99, 0x5D9D, +0x8C73, 0x5DB7, 0x5DC5, 0x5F73, +0x5F77, 0x5F82, 0x5F87, 0x5F89, +0x5F8C, 0x5F95, 0x5F99, 0x5F9C, +0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, +0x8862, 0x5F61, 0x72AD, 0x72B0, +0x72B4, 0x72B7, 0x72B8, 0x72C3, +0x72C1, 0x72CE, 0x72CD, 0x72D2, +0x72E8, 0x72EF, 0x72E9, 0x72F2, +0x72F4, 0x72F7, 0x7301, 0x72F3, +0x7303, 0x72FA, 0x91E6, 0x91E7, +0x91E8, 0x91E9, 0x91EA, 0x91EB, +0x91EC, 0x91ED, 0x91EE, 0x91EF, +0x91F0, 0x91F1, 0x91F2, 0x91F3, +0x91F4, 0x91F5, 0x91F6, 0x91F7, +0x91F8, 0x91F9, 0x91FA, 0x91FB, +0x91FC, 0x91FD, 0x91FE, 0x91FF, +0x9200, 0x9201, 0x9202, 0x9203, +0x9204, 0x9205, 0x9206, 0x9207, +0x9208, 0x9209, 0x920A, 0x920B, +0x920C, 0x920D, 0x920E, 0x920F, +0x9210, 0x9211, 0x9212, 0x9213, +0x9214, 0x9215, 0x9216, 0x9217, +0x9218, 0x9219, 0x921A, 0x921B, +0x921C, 0x921D, 0x921E, 0x921F, +0x9220, 0x9221, 0x9222, 0x9223, +0x9224, 0x9225, 0x9226, 0x9227, +0x9228, 0x9229, 0x922A, 0x922B, +0x922C, 0x922D, 0x922E, 0x922F, +0x9230, 0x9231, 0x9232, 0x9233, +0x9234, 0x9235, 0x9236, 0x9237, +0x9238, 0x9239, 0x923A, 0x923B, +0x923C, 0x923D, 0x923E, 0x923F, +0x9240, 0x9241, 0x9242, 0x9243, +0x9244, 0x9245, 0x72FB, 0x7317, +0x7313, 0x7321, 0x730A, 0x731E, +0x731D, 0x7315, 0x7322, 0x7339, +0x7325, 0x732C, 0x7338, 0x7331, +0x7350, 0x734D, 0x7357, 0x7360, +0x736C, 0x736F, 0x737E, 0x821B, +0x5925, 0x98E7, 0x5924, 0x5902, +0x9963, 0x9967, 0x9968, 0x9969, +0x996A, 0x996B, 0x996C, 0x9974, +0x9977, 0x997D, 0x9980, 0x9984, +0x9987, 0x998A, 0x998D, 0x9990, +0x9991, 0x9993, 0x9994, 0x9995, +0x5E80, 0x5E91, 0x5E8B, 0x5E96, +0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, +0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, +0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, +0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, +0x5FCF, 0x6003, 0x5FEE, 0x6004, +0x5FE1, 0x5FE4, 0x5FFE, 0x6005, +0x6006, 0x5FEA, 0x5FED, 0x5FF8, +0x6019, 0x6035, 0x6026, 0x601B, +0x600F, 0x600D, 0x6029, 0x602B, +0x600A, 0x603F, 0x6021, 0x6078, +0x6079, 0x607B, 0x607A, 0x6042, +0x9246, 0x9247, 0x9248, 0x9249, +0x924A, 0x924B, 0x924C, 0x924D, +0x924E, 0x924F, 0x9250, 0x9251, +0x9252, 0x9253, 0x9254, 0x9255, +0x9256, 0x9257, 0x9258, 0x9259, +0x925A, 0x925B, 0x925C, 0x925D, +0x925E, 0x925F, 0x9260, 0x9261, +0x9262, 0x9263, 0x9264, 0x9265, +0x9266, 0x9267, 0x9268, 0x9269, +0x926A, 0x926B, 0x926C, 0x926D, +0x926E, 0x926F, 0x9270, 0x9271, +0x9272, 0x9273, 0x9275, 0x9276, +0x9277, 0x9278, 0x9279, 0x927A, +0x927B, 0x927C, 0x927D, 0x927E, +0x927F, 0x9280, 0x9281, 0x9282, +0x9283, 0x9284, 0x9285, 0x9286, +0x9287, 0x9288, 0x9289, 0x928A, +0x928B, 0x928C, 0x928D, 0x928F, +0x9290, 0x9291, 0x9292, 0x9293, +0x9294, 0x9295, 0x9296, 0x9297, +0x9298, 0x9299, 0x929A, 0x929B, +0x929C, 0x929D, 0x929E, 0x929F, +0x92A0, 0x92A1, 0x92A2, 0x92A3, +0x92A4, 0x92A5, 0x92A6, 0x92A7, +0x606A, 0x607D, 0x6096, 0x609A, +0x60AD, 0x609D, 0x6083, 0x6092, +0x608C, 0x609B, 0x60EC, 0x60BB, +0x60B1, 0x60DD, 0x60D8, 0x60C6, +0x60DA, 0x60B4, 0x6120, 0x6126, +0x6115, 0x6123, 0x60F4, 0x6100, +0x610E, 0x612B, 0x614A, 0x6175, +0x61AC, 0x6194, 0x61A7, 0x61B7, +0x61D4, 0x61F5, 0x5FDD, 0x96B3, +0x95E9, 0x95EB, 0x95F1, 0x95F3, +0x95F5, 0x95F6, 0x95FC, 0x95FE, +0x9603, 0x9604, 0x9606, 0x9608, +0x960A, 0x960B, 0x960C, 0x960D, +0x960F, 0x9612, 0x9615, 0x9616, +0x9617, 0x9619, 0x961A, 0x4E2C, +0x723F, 0x6215, 0x6C35, 0x6C54, +0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, +0x6C90, 0x6C94, 0x6C8C, 0x6C68, +0x6C69, 0x6C74, 0x6C76, 0x6C86, +0x6CA9, 0x6CD0, 0x6CD4, 0x6CAD, +0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, +0x6CB2, 0x6CE0, 0x6CD6, 0x6CFA, +0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, +0x6CEF, 0x6CFE, 0x92A8, 0x92A9, +0x92AA, 0x92AB, 0x92AC, 0x92AD, +0x92AF, 0x92B0, 0x92B1, 0x92B2, +0x92B3, 0x92B4, 0x92B5, 0x92B6, +0x92B7, 0x92B8, 0x92B9, 0x92BA, +0x92BB, 0x92BC, 0x92BD, 0x92BE, +0x92BF, 0x92C0, 0x92C1, 0x92C2, +0x92C3, 0x92C4, 0x92C5, 0x92C6, +0x92C7, 0x92C9, 0x92CA, 0x92CB, +0x92CC, 0x92CD, 0x92CE, 0x92CF, +0x92D0, 0x92D1, 0x92D2, 0x92D3, +0x92D4, 0x92D5, 0x92D6, 0x92D7, +0x92D8, 0x92D9, 0x92DA, 0x92DB, +0x92DC, 0x92DD, 0x92DE, 0x92DF, +0x92E0, 0x92E1, 0x92E2, 0x92E3, +0x92E4, 0x92E5, 0x92E6, 0x92E7, +0x92E8, 0x92E9, 0x92EA, 0x92EB, +0x92EC, 0x92ED, 0x92EE, 0x92EF, +0x92F0, 0x92F1, 0x92F2, 0x92F3, +0x92F4, 0x92F5, 0x92F6, 0x92F7, +0x92F8, 0x92F9, 0x92FA, 0x92FB, +0x92FC, 0x92FD, 0x92FE, 0x92FF, +0x9300, 0x9301, 0x9302, 0x9303, +0x9304, 0x9305, 0x9306, 0x9307, +0x9308, 0x9309, 0x6D39, 0x6D27, +0x6D0C, 0x6D43, 0x6D48, 0x6D07, +0x6D04, 0x6D19, 0x6D0E, 0x6D2B, +0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, +0x6D4F, 0x6D52, 0x6D54, 0x6D33, +0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, +0x6D5E, 0x6D93, 0x6D94, 0x6D5C, +0x6D60, 0x6D7C, 0x6D63, 0x6E1A, +0x6DC7, 0x6DC5, 0x6DDE, 0x6E0E, +0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, +0x6DDD, 0x6DD9, 0x6E16, 0x6DAB, +0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, +0x6E4E, 0x6E6B, 0x6EB2, 0x6E5F, +0x6E86, 0x6E53, 0x6E54, 0x6E32, +0x6E25, 0x6E44, 0x6EDF, 0x6EB1, +0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, +0x6EA5, 0x6EA7, 0x6EBD, 0x6EBB, +0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, +0x6E8F, 0x6EC2, 0x6E9F, 0x6F62, +0x6F46, 0x6F47, 0x6F24, 0x6F15, +0x6EF9, 0x6F2F, 0x6F36, 0x6F4B, +0x6F74, 0x6F2A, 0x6F09, 0x6F29, +0x6F89, 0x6F8D, 0x6F8C, 0x6F78, +0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, +0x930A, 0x930B, 0x930C, 0x930D, +0x930E, 0x930F, 0x9310, 0x9311, +0x9312, 0x9313, 0x9314, 0x9315, +0x9316, 0x9317, 0x9318, 0x9319, +0x931A, 0x931B, 0x931C, 0x931D, +0x931E, 0x931F, 0x9320, 0x9321, +0x9322, 0x9323, 0x9324, 0x9325, +0x9326, 0x9327, 0x9328, 0x9329, +0x932A, 0x932B, 0x932C, 0x932D, +0x932E, 0x932F, 0x9330, 0x9331, +0x9332, 0x9333, 0x9334, 0x9335, +0x9336, 0x9337, 0x9338, 0x9339, +0x933A, 0x933B, 0x933C, 0x933D, +0x933F, 0x9340, 0x9341, 0x9342, +0x9343, 0x9344, 0x9345, 0x9346, +0x9347, 0x9348, 0x9349, 0x934A, +0x934B, 0x934C, 0x934D, 0x934E, +0x934F, 0x9350, 0x9351, 0x9352, +0x9353, 0x9354, 0x9355, 0x9356, +0x9357, 0x9358, 0x9359, 0x935A, +0x935B, 0x935C, 0x935D, 0x935E, +0x935F, 0x9360, 0x9361, 0x9362, +0x9363, 0x9364, 0x9365, 0x9366, +0x9367, 0x9368, 0x9369, 0x936B, +0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, +0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, +0x6FE0, 0x6FEF, 0x701A, 0x7023, +0x701B, 0x7039, 0x7035, 0x704F, +0x705E, 0x5B80, 0x5B84, 0x5B95, +0x5B93, 0x5BA5, 0x5BB8, 0x752F, +0x9A9E, 0x6434, 0x5BE4, 0x5BEE, +0x8930, 0x5BF0, 0x8E47, 0x8B07, +0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, +0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, +0x8FF3, 0x8FE8, 0x9005, 0x9004, +0x900B, 0x9026, 0x9011, 0x900D, +0x9016, 0x9021, 0x9035, 0x9036, +0x902D, 0x902F, 0x9044, 0x9051, +0x9052, 0x9050, 0x9068, 0x9058, +0x9062, 0x905B, 0x66B9, 0x9074, +0x907D, 0x9082, 0x9088, 0x9083, +0x908B, 0x5F50, 0x5F57, 0x5F56, +0x5F58, 0x5C3B, 0x54AB, 0x5C50, +0x5C59, 0x5B71, 0x5C63, 0x5C66, +0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, +0x8274, 0x5F3C, 0x9B3B, 0x5C6E, +0x5981, 0x5983, 0x598D, 0x59A9, +0x59AA, 0x59A3, 0x936C, 0x936D, +0x936E, 0x936F, 0x9370, 0x9371, +0x9372, 0x9373, 0x9374, 0x9375, +0x9376, 0x9377, 0x9378, 0x9379, +0x937A, 0x937B, 0x937C, 0x937D, +0x937E, 0x937F, 0x9380, 0x9381, +0x9382, 0x9383, 0x9384, 0x9385, +0x9386, 0x9387, 0x9388, 0x9389, +0x938A, 0x938B, 0x938C, 0x938D, +0x938E, 0x9390, 0x9391, 0x9392, +0x9393, 0x9394, 0x9395, 0x9396, +0x9397, 0x9398, 0x9399, 0x939A, +0x939B, 0x939C, 0x939D, 0x939E, +0x939F, 0x93A0, 0x93A1, 0x93A2, +0x93A3, 0x93A4, 0x93A5, 0x93A6, +0x93A7, 0x93A8, 0x93A9, 0x93AA, +0x93AB, 0x93AC, 0x93AD, 0x93AE, +0x93AF, 0x93B0, 0x93B1, 0x93B2, +0x93B3, 0x93B4, 0x93B5, 0x93B6, +0x93B7, 0x93B8, 0x93B9, 0x93BA, +0x93BB, 0x93BC, 0x93BD, 0x93BE, +0x93BF, 0x93C0, 0x93C1, 0x93C2, +0x93C3, 0x93C4, 0x93C5, 0x93C6, +0x93C7, 0x93C8, 0x93C9, 0x93CB, +0x93CC, 0x93CD, 0x5997, 0x59CA, +0x59AB, 0x599E, 0x59A4, 0x59D2, +0x59B2, 0x59AF, 0x59D7, 0x59BE, +0x5A05, 0x5A06, 0x59DD, 0x5A08, +0x59E3, 0x59D8, 0x59F9, 0x5A0C, +0x5A09, 0x5A32, 0x5A34, 0x5A11, +0x5A23, 0x5A13, 0x5A40, 0x5A67, +0x5A4A, 0x5A55, 0x5A3C, 0x5A62, +0x5A75, 0x80EC, 0x5AAA, 0x5A9B, +0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, +0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, +0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, +0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, +0x5B17, 0x5B16, 0x5B32, 0x5B37, +0x5B40, 0x5C15, 0x5C1C, 0x5B5A, +0x5B65, 0x5B73, 0x5B51, 0x5B53, +0x5B62, 0x9A75, 0x9A77, 0x9A78, +0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, +0x9A81, 0x9A85, 0x9A88, 0x9A8A, +0x9A90, 0x9A92, 0x9A93, 0x9A96, +0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, +0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, +0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, +0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, +0x93CE, 0x93CF, 0x93D0, 0x93D1, +0x93D2, 0x93D3, 0x93D4, 0x93D5, +0x93D7, 0x93D8, 0x93D9, 0x93DA, +0x93DB, 0x93DC, 0x93DD, 0x93DE, +0x93DF, 0x93E0, 0x93E1, 0x93E2, +0x93E3, 0x93E4, 0x93E5, 0x93E6, +0x93E7, 0x93E8, 0x93E9, 0x93EA, +0x93EB, 0x93EC, 0x93ED, 0x93EE, +0x93EF, 0x93F0, 0x93F1, 0x93F2, +0x93F3, 0x93F4, 0x93F5, 0x93F6, +0x93F7, 0x93F8, 0x93F9, 0x93FA, +0x93FB, 0x93FC, 0x93FD, 0x93FE, +0x93FF, 0x9400, 0x9401, 0x9402, +0x9403, 0x9404, 0x9405, 0x9406, +0x9407, 0x9408, 0x9409, 0x940A, +0x940B, 0x940C, 0x940D, 0x940E, +0x940F, 0x9410, 0x9411, 0x9412, +0x9413, 0x9414, 0x9415, 0x9416, +0x9417, 0x9418, 0x9419, 0x941A, +0x941B, 0x941C, 0x941D, 0x941E, +0x941F, 0x9420, 0x9421, 0x9422, +0x9423, 0x9424, 0x9425, 0x9426, +0x9427, 0x9428, 0x9429, 0x942A, +0x942B, 0x942C, 0x942D, 0x942E, +0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, +0x7EC1, 0x7EC2, 0x7EC9, 0x7ECB, +0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, +0x7EDB, 0x7EE0, 0x7EE1, 0x7EE8, +0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, +0x7EF2, 0x7F0D, 0x7EF6, 0x7EFA, +0x7EFB, 0x7EFE, 0x7F01, 0x7F02, +0x7F03, 0x7F07, 0x7F08, 0x7F0B, +0x7F0C, 0x7F0F, 0x7F11, 0x7F12, +0x7F17, 0x7F19, 0x7F1C, 0x7F1B, +0x7F1F, 0x7F21, 0x7F22, 0x7F23, +0x7F24, 0x7F25, 0x7F26, 0x7F27, +0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, +0x7F2F, 0x7F30, 0x7F31, 0x7F32, +0x7F33, 0x7F35, 0x5E7A, 0x757F, +0x5DDB, 0x753E, 0x9095, 0x738E, +0x7391, 0x73AE, 0x73A2, 0x739F, +0x73CF, 0x73C2, 0x73D1, 0x73B7, +0x73B3, 0x73C0, 0x73C9, 0x73C8, +0x73E5, 0x73D9, 0x987C, 0x740A, +0x73E9, 0x73E7, 0x73DE, 0x73BA, +0x73F2, 0x740F, 0x742A, 0x745B, +0x7426, 0x7425, 0x7428, 0x7430, +0x742E, 0x742C, 0x942F, 0x9430, +0x9431, 0x9432, 0x9433, 0x9434, +0x9435, 0x9436, 0x9437, 0x9438, +0x9439, 0x943A, 0x943B, 0x943C, +0x943D, 0x943F, 0x9440, 0x9441, +0x9442, 0x9443, 0x9444, 0x9445, +0x9446, 0x9447, 0x9448, 0x9449, +0x944A, 0x944B, 0x944C, 0x944D, +0x944E, 0x944F, 0x9450, 0x9451, +0x9452, 0x9453, 0x9454, 0x9455, +0x9456, 0x9457, 0x9458, 0x9459, +0x945A, 0x945B, 0x945C, 0x945D, +0x945E, 0x945F, 0x9460, 0x9461, +0x9462, 0x9463, 0x9464, 0x9465, +0x9466, 0x9467, 0x9468, 0x9469, +0x946A, 0x946C, 0x946D, 0x946E, +0x946F, 0x9470, 0x9471, 0x9472, +0x9473, 0x9474, 0x9475, 0x9476, +0x9477, 0x9478, 0x9479, 0x947A, +0x947B, 0x947C, 0x947D, 0x947E, +0x947F, 0x9480, 0x9481, 0x9482, +0x9483, 0x9484, 0x9491, 0x9496, +0x9498, 0x94C7, 0x94CF, 0x94D3, +0x94D4, 0x94DA, 0x94E6, 0x94FB, +0x951C, 0x9520, 0x741B, 0x741A, +0x7441, 0x745C, 0x7457, 0x7455, +0x7459, 0x7477, 0x746D, 0x747E, +0x749C, 0x748E, 0x7480, 0x7481, +0x7487, 0x748B, 0x749E, 0x74A8, +0x74A9, 0x7490, 0x74A7, 0x74D2, +0x74BA, 0x97EA, 0x97EB, 0x97EC, +0x674C, 0x6753, 0x675E, 0x6748, +0x6769, 0x67A5, 0x6787, 0x676A, +0x6773, 0x6798, 0x67A7, 0x6775, +0x67A8, 0x679E, 0x67AD, 0x678B, +0x6777, 0x677C, 0x67F0, 0x6809, +0x67D8, 0x680A, 0x67E9, 0x67B0, +0x680C, 0x67D9, 0x67B5, 0x67DA, +0x67B3, 0x67DD, 0x6800, 0x67C3, +0x67B8, 0x67E2, 0x680E, 0x67C1, +0x67FD, 0x6832, 0x6833, 0x6860, +0x6861, 0x684E, 0x6862, 0x6844, +0x6864, 0x6883, 0x681D, 0x6855, +0x6866, 0x6841, 0x6867, 0x6840, +0x683E, 0x684A, 0x6849, 0x6829, +0x68B5, 0x688F, 0x6874, 0x6877, +0x6893, 0x686B, 0x68C2, 0x696E, +0x68FC, 0x691F, 0x6920, 0x68F9, +0x9527, 0x9533, 0x953D, 0x9543, +0x9548, 0x954B, 0x9555, 0x955A, +0x9560, 0x956E, 0x9574, 0x9575, +0x9577, 0x9578, 0x9579, 0x957A, +0x957B, 0x957C, 0x957D, 0x957E, +0x9580, 0x9581, 0x9582, 0x9583, +0x9584, 0x9585, 0x9586, 0x9587, +0x9588, 0x9589, 0x958A, 0x958B, +0x958C, 0x958D, 0x958E, 0x958F, +0x9590, 0x9591, 0x9592, 0x9593, +0x9594, 0x9595, 0x9596, 0x9597, +0x9598, 0x9599, 0x959A, 0x959B, +0x959C, 0x959D, 0x959E, 0x959F, +0x95A0, 0x95A1, 0x95A2, 0x95A3, +0x95A4, 0x95A5, 0x95A6, 0x95A7, +0x95A8, 0x95A9, 0x95AA, 0x95AB, +0x95AC, 0x95AD, 0x95AE, 0x95AF, +0x95B0, 0x95B1, 0x95B2, 0x95B3, +0x95B4, 0x95B5, 0x95B6, 0x95B7, +0x95B8, 0x95B9, 0x95BA, 0x95BB, +0x95BC, 0x95BD, 0x95BE, 0x95BF, +0x95C0, 0x95C1, 0x95C2, 0x95C3, +0x95C4, 0x95C5, 0x95C6, 0x95C7, +0x95C8, 0x95C9, 0x95CA, 0x95CB, +0x6924, 0x68F0, 0x690B, 0x6901, +0x6957, 0x68E3, 0x6910, 0x6971, +0x6939, 0x6960, 0x6942, 0x695D, +0x6984, 0x696B, 0x6980, 0x6998, +0x6978, 0x6934, 0x69CC, 0x6987, +0x6988, 0x69CE, 0x6989, 0x6966, +0x6963, 0x6979, 0x699B, 0x69A7, +0x69BB, 0x69AB, 0x69AD, 0x69D4, +0x69B1, 0x69C1, 0x69CA, 0x69DF, +0x6995, 0x69E0, 0x698D, 0x69FF, +0x6A2F, 0x69ED, 0x6A17, 0x6A18, +0x6A65, 0x69F2, 0x6A44, 0x6A3E, +0x6AA0, 0x6A50, 0x6A5B, 0x6A35, +0x6A8E, 0x6A79, 0x6A3D, 0x6A28, +0x6A58, 0x6A7C, 0x6A91, 0x6A90, +0x6AA9, 0x6A97, 0x6AAB, 0x7337, +0x7352, 0x6B81, 0x6B82, 0x6B87, +0x6B84, 0x6B92, 0x6B93, 0x6B8D, +0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, +0x8F6B, 0x8F6D, 0x8F71, 0x8F72, +0x8F73, 0x8F75, 0x8F76, 0x8F78, +0x8F77, 0x8F79, 0x8F7A, 0x8F7C, +0x8F7E, 0x8F81, 0x8F82, 0x8F84, +0x8F87, 0x8F8B, 0x95CC, 0x95CD, +0x95CE, 0x95CF, 0x95D0, 0x95D1, +0x95D2, 0x95D3, 0x95D4, 0x95D5, +0x95D6, 0x95D7, 0x95D8, 0x95D9, +0x95DA, 0x95DB, 0x95DC, 0x95DD, +0x95DE, 0x95DF, 0x95E0, 0x95E1, +0x95E2, 0x95E3, 0x95E4, 0x95E5, +0x95E6, 0x95E7, 0x95EC, 0x95FF, +0x9607, 0x9613, 0x9618, 0x961B, +0x961E, 0x9620, 0x9623, 0x9624, +0x9625, 0x9626, 0x9627, 0x9628, +0x9629, 0x962B, 0x962C, 0x962D, +0x962F, 0x9630, 0x9637, 0x9638, +0x9639, 0x963A, 0x963E, 0x9641, +0x9643, 0x964A, 0x964E, 0x964F, +0x9651, 0x9652, 0x9653, 0x9656, +0x9657, 0x9658, 0x9659, 0x965A, +0x965C, 0x965D, 0x965E, 0x9660, +0x9663, 0x9665, 0x9666, 0x966B, +0x966D, 0x966E, 0x966F, 0x9670, +0x9671, 0x9673, 0x9678, 0x9679, +0x967A, 0x967B, 0x967C, 0x967D, +0x967E, 0x967F, 0x9680, 0x9681, +0x9682, 0x9683, 0x9684, 0x9687, +0x9689, 0x968A, 0x8F8D, 0x8F8E, +0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, +0x620B, 0x6217, 0x621B, 0x621F, +0x6222, 0x6221, 0x6225, 0x6224, +0x622C, 0x81E7, 0x74EF, 0x74F4, +0x74FF, 0x750F, 0x7511, 0x7513, +0x6534, 0x65EE, 0x65EF, 0x65F0, +0x660A, 0x6619, 0x6772, 0x6603, +0x6615, 0x6600, 0x7085, 0x66F7, +0x661D, 0x6634, 0x6631, 0x6636, +0x6635, 0x8006, 0x665F, 0x6654, +0x6641, 0x664F, 0x6656, 0x6661, +0x6657, 0x6677, 0x6684, 0x668C, +0x66A7, 0x669D, 0x66BE, 0x66DB, +0x66DC, 0x66E6, 0x66E9, 0x8D32, +0x8D33, 0x8D36, 0x8D3B, 0x8D3D, +0x8D40, 0x8D45, 0x8D46, 0x8D48, +0x8D49, 0x8D47, 0x8D4D, 0x8D55, +0x8D59, 0x89C7, 0x89CA, 0x89CB, +0x89CC, 0x89CE, 0x89CF, 0x89D0, +0x89D1, 0x726E, 0x729F, 0x725D, +0x7266, 0x726F, 0x727E, 0x727F, +0x7284, 0x728B, 0x728D, 0x728F, +0x7292, 0x6308, 0x6332, 0x63B0, +0x968C, 0x968E, 0x9691, 0x9692, +0x9693, 0x9695, 0x9696, 0x969A, +0x969B, 0x969D, 0x969E, 0x969F, +0x96A0, 0x96A1, 0x96A2, 0x96A3, +0x96A4, 0x96A5, 0x96A6, 0x96A8, +0x96A9, 0x96AA, 0x96AB, 0x96AC, +0x96AD, 0x96AE, 0x96AF, 0x96B1, +0x96B2, 0x96B4, 0x96B5, 0x96B7, +0x96B8, 0x96BA, 0x96BB, 0x96BF, +0x96C2, 0x96C3, 0x96C8, 0x96CA, +0x96CB, 0x96D0, 0x96D1, 0x96D3, +0x96D4, 0x96D6, 0x96D7, 0x96D8, +0x96D9, 0x96DA, 0x96DB, 0x96DC, +0x96DD, 0x96DE, 0x96DF, 0x96E1, +0x96E2, 0x96E3, 0x96E4, 0x96E5, +0x96E6, 0x96E7, 0x96EB, 0x96EC, +0x96ED, 0x96EE, 0x96F0, 0x96F1, +0x96F2, 0x96F4, 0x96F5, 0x96F8, +0x96FA, 0x96FB, 0x96FC, 0x96FD, +0x96FF, 0x9702, 0x9703, 0x9705, +0x970A, 0x970B, 0x970C, 0x9710, +0x9711, 0x9712, 0x9714, 0x9715, +0x9717, 0x9718, 0x9719, 0x971A, +0x971B, 0x971D, 0x971F, 0x9720, +0x643F, 0x64D8, 0x8004, 0x6BEA, +0x6BF3, 0x6BFD, 0x6BF5, 0x6BF9, +0x6C05, 0x6C07, 0x6C06, 0x6C0D, +0x6C15, 0x6C18, 0x6C19, 0x6C1A, +0x6C21, 0x6C29, 0x6C24, 0x6C2A, +0x6C32, 0x6535, 0x6555, 0x656B, +0x724D, 0x7252, 0x7256, 0x7230, +0x8662, 0x5216, 0x809F, 0x809C, +0x8093, 0x80BC, 0x670A, 0x80BD, +0x80B1, 0x80AB, 0x80AD, 0x80B4, +0x80B7, 0x80E7, 0x80E8, 0x80E9, +0x80EA, 0x80DB, 0x80C2, 0x80C4, +0x80D9, 0x80CD, 0x80D7, 0x6710, +0x80DD, 0x80EB, 0x80F1, 0x80F4, +0x80ED, 0x810D, 0x810E, 0x80F2, +0x80FC, 0x6715, 0x8112, 0x8C5A, +0x8136, 0x811E, 0x812C, 0x8118, +0x8132, 0x8148, 0x814C, 0x8153, +0x8174, 0x8159, 0x815A, 0x8171, +0x8160, 0x8169, 0x817C, 0x817D, +0x816D, 0x8167, 0x584D, 0x5AB5, +0x8188, 0x8182, 0x8191, 0x6ED5, +0x81A3, 0x81AA, 0x81CC, 0x6726, +0x81CA, 0x81BB, 0x9721, 0x9722, +0x9723, 0x9724, 0x9725, 0x9726, +0x9727, 0x9728, 0x9729, 0x972B, +0x972C, 0x972E, 0x972F, 0x9731, +0x9733, 0x9734, 0x9735, 0x9736, +0x9737, 0x973A, 0x973B, 0x973C, +0x973D, 0x973F, 0x9740, 0x9741, +0x9742, 0x9743, 0x9744, 0x9745, +0x9746, 0x9747, 0x9748, 0x9749, +0x974A, 0x974B, 0x974C, 0x974D, +0x974E, 0x974F, 0x9750, 0x9751, +0x9754, 0x9755, 0x9757, 0x9758, +0x975A, 0x975C, 0x975D, 0x975F, +0x9763, 0x9764, 0x9766, 0x9767, +0x9768, 0x976A, 0x976B, 0x976C, +0x976D, 0x976E, 0x976F, 0x9770, +0x9771, 0x9772, 0x9775, 0x9777, +0x9778, 0x9779, 0x977A, 0x977B, +0x977D, 0x977E, 0x977F, 0x9780, +0x9781, 0x9782, 0x9783, 0x9784, +0x9786, 0x9787, 0x9788, 0x9789, +0x978A, 0x978C, 0x978E, 0x978F, +0x9790, 0x9793, 0x9795, 0x9796, +0x9797, 0x9799, 0x979A, 0x979B, +0x979C, 0x979D, 0x81C1, 0x81A6, +0x6B24, 0x6B37, 0x6B39, 0x6B43, +0x6B46, 0x6B59, 0x98D1, 0x98D2, +0x98D3, 0x98D5, 0x98D9, 0x98DA, +0x6BB3, 0x5F40, 0x6BC2, 0x89F3, +0x6590, 0x9F51, 0x6593, 0x65BC, +0x65C6, 0x65C4, 0x65C3, 0x65CC, +0x65CE, 0x65D2, 0x65D6, 0x7080, +0x709C, 0x7096, 0x709D, 0x70BB, +0x70C0, 0x70B7, 0x70AB, 0x70B1, +0x70E8, 0x70CA, 0x7110, 0x7113, +0x7116, 0x712F, 0x7131, 0x7173, +0x715C, 0x7168, 0x7145, 0x7172, +0x714A, 0x7178, 0x717A, 0x7198, +0x71B3, 0x71B5, 0x71A8, 0x71A0, +0x71E0, 0x71D4, 0x71E7, 0x71F9, +0x721D, 0x7228, 0x706C, 0x7118, +0x7166, 0x71B9, 0x623E, 0x623D, +0x6243, 0x6248, 0x6249, 0x793B, +0x7940, 0x7946, 0x7949, 0x795B, +0x795C, 0x7953, 0x795A, 0x7962, +0x7957, 0x7960, 0x796F, 0x7967, +0x797A, 0x7985, 0x798A, 0x799A, +0x79A7, 0x79B3, 0x5FD1, 0x5FD0, +0x979E, 0x979F, 0x97A1, 0x97A2, +0x97A4, 0x97A5, 0x97A6, 0x97A7, +0x97A8, 0x97A9, 0x97AA, 0x97AC, +0x97AE, 0x97B0, 0x97B1, 0x97B3, +0x97B5, 0x97B6, 0x97B7, 0x97B8, +0x97B9, 0x97BA, 0x97BB, 0x97BC, +0x97BD, 0x97BE, 0x97BF, 0x97C0, +0x97C1, 0x97C2, 0x97C3, 0x97C4, +0x97C5, 0x97C6, 0x97C7, 0x97C8, +0x97C9, 0x97CA, 0x97CB, 0x97CC, +0x97CD, 0x97CE, 0x97CF, 0x97D0, +0x97D1, 0x97D2, 0x97D3, 0x97D4, +0x97D5, 0x97D6, 0x97D7, 0x97D8, +0x97D9, 0x97DA, 0x97DB, 0x97DC, +0x97DD, 0x97DE, 0x97DF, 0x97E0, +0x97E1, 0x97E2, 0x97E3, 0x97E4, +0x97E5, 0x97E8, 0x97EE, 0x97EF, +0x97F0, 0x97F1, 0x97F2, 0x97F4, +0x97F7, 0x97F8, 0x97F9, 0x97FA, +0x97FB, 0x97FC, 0x97FD, 0x97FE, +0x97FF, 0x9800, 0x9801, 0x9802, +0x9803, 0x9804, 0x9805, 0x9806, +0x9807, 0x9808, 0x9809, 0x980A, +0x980B, 0x980C, 0x980D, 0x980E, +0x603C, 0x605D, 0x605A, 0x6067, +0x6041, 0x6059, 0x6063, 0x60AB, +0x6106, 0x610D, 0x615D, 0x61A9, +0x619D, 0x61CB, 0x61D1, 0x6206, +0x8080, 0x807F, 0x6C93, 0x6CF6, +0x6DFC, 0x77F6, 0x77F8, 0x7800, +0x7809, 0x7817, 0x7818, 0x7811, +0x65AB, 0x782D, 0x781C, 0x781D, +0x7839, 0x783A, 0x783B, 0x781F, +0x783C, 0x7825, 0x782C, 0x7823, +0x7829, 0x784E, 0x786D, 0x7856, +0x7857, 0x7826, 0x7850, 0x7847, +0x784C, 0x786A, 0x789B, 0x7893, +0x789A, 0x7887, 0x789C, 0x78A1, +0x78A3, 0x78B2, 0x78B9, 0x78A5, +0x78D4, 0x78D9, 0x78C9, 0x78EC, +0x78F2, 0x7905, 0x78F4, 0x7913, +0x7924, 0x791E, 0x7934, 0x9F9B, +0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, +0x7704, 0x770D, 0x76F9, 0x7707, +0x7708, 0x771A, 0x7722, 0x7719, +0x772D, 0x7726, 0x7735, 0x7738, +0x7750, 0x7751, 0x7747, 0x7743, +0x775A, 0x7768, 0x980F, 0x9810, +0x9811, 0x9812, 0x9813, 0x9814, +0x9815, 0x9816, 0x9817, 0x9818, +0x9819, 0x981A, 0x981B, 0x981C, +0x981D, 0x981E, 0x981F, 0x9820, +0x9821, 0x9822, 0x9823, 0x9824, +0x9825, 0x9826, 0x9827, 0x9828, +0x9829, 0x982A, 0x982B, 0x982C, +0x982D, 0x982E, 0x982F, 0x9830, +0x9831, 0x9832, 0x9833, 0x9834, +0x9835, 0x9836, 0x9837, 0x9838, +0x9839, 0x983A, 0x983B, 0x983C, +0x983D, 0x983E, 0x983F, 0x9840, +0x9841, 0x9842, 0x9843, 0x9844, +0x9845, 0x9846, 0x9847, 0x9848, +0x9849, 0x984A, 0x984B, 0x984C, +0x984D, 0x984E, 0x984F, 0x9850, +0x9851, 0x9852, 0x9853, 0x9854, +0x9855, 0x9856, 0x9857, 0x9858, +0x9859, 0x985A, 0x985B, 0x985C, +0x985D, 0x985E, 0x985F, 0x9860, +0x9861, 0x9862, 0x9863, 0x9864, +0x9865, 0x9866, 0x9867, 0x9868, +0x9869, 0x986A, 0x986B, 0x986C, +0x986D, 0x986E, 0x7762, 0x7765, +0x777F, 0x778D, 0x777D, 0x7780, +0x778C, 0x7791, 0x779F, 0x77A0, +0x77B0, 0x77B5, 0x77BD, 0x753A, +0x7540, 0x754E, 0x754B, 0x7548, +0x755B, 0x7572, 0x7579, 0x7583, +0x7F58, 0x7F61, 0x7F5F, 0x8A48, +0x7F68, 0x7F74, 0x7F71, 0x7F79, +0x7F81, 0x7F7E, 0x76CD, 0x76E5, +0x8832, 0x9485, 0x9486, 0x9487, +0x948B, 0x948A, 0x948C, 0x948D, +0x948F, 0x9490, 0x9494, 0x9497, +0x9495, 0x949A, 0x949B, 0x949C, +0x94A3, 0x94A4, 0x94AB, 0x94AA, +0x94AD, 0x94AC, 0x94AF, 0x94B0, +0x94B2, 0x94B4, 0x94B6, 0x94B7, +0x94B8, 0x94B9, 0x94BA, 0x94BC, +0x94BD, 0x94BF, 0x94C4, 0x94C8, +0x94C9, 0x94CA, 0x94CB, 0x94CC, +0x94CD, 0x94CE, 0x94D0, 0x94D1, +0x94D2, 0x94D5, 0x94D6, 0x94D7, +0x94D9, 0x94D8, 0x94DB, 0x94DE, +0x94DF, 0x94E0, 0x94E2, 0x94E4, +0x94E5, 0x94E7, 0x94E8, 0x94EA, +0x986F, 0x9870, 0x9871, 0x9872, +0x9873, 0x9874, 0x988B, 0x988E, +0x9892, 0x9895, 0x9899, 0x98A3, +0x98A8, 0x98A9, 0x98AA, 0x98AB, +0x98AC, 0x98AD, 0x98AE, 0x98AF, +0x98B0, 0x98B1, 0x98B2, 0x98B3, +0x98B4, 0x98B5, 0x98B6, 0x98B7, +0x98B8, 0x98B9, 0x98BA, 0x98BB, +0x98BC, 0x98BD, 0x98BE, 0x98BF, +0x98C0, 0x98C1, 0x98C2, 0x98C3, +0x98C4, 0x98C5, 0x98C6, 0x98C7, +0x98C8, 0x98C9, 0x98CA, 0x98CB, +0x98CC, 0x98CD, 0x98CF, 0x98D0, +0x98D4, 0x98D6, 0x98D7, 0x98DB, +0x98DC, 0x98DD, 0x98E0, 0x98E1, +0x98E2, 0x98E3, 0x98E4, 0x98E5, +0x98E6, 0x98E9, 0x98EA, 0x98EB, +0x98EC, 0x98ED, 0x98EE, 0x98EF, +0x98F0, 0x98F1, 0x98F2, 0x98F3, +0x98F4, 0x98F5, 0x98F6, 0x98F7, +0x98F8, 0x98F9, 0x98FA, 0x98FB, +0x98FC, 0x98FD, 0x98FE, 0x98FF, +0x9900, 0x9901, 0x9902, 0x9903, +0x9904, 0x9905, 0x9906, 0x9907, +0x94E9, 0x94EB, 0x94EE, 0x94EF, +0x94F3, 0x94F4, 0x94F5, 0x94F7, +0x94F9, 0x94FC, 0x94FD, 0x94FF, +0x9503, 0x9502, 0x9506, 0x9507, +0x9509, 0x950A, 0x950D, 0x950E, +0x950F, 0x9512, 0x9513, 0x9514, +0x9515, 0x9516, 0x9518, 0x951B, +0x951D, 0x951E, 0x951F, 0x9522, +0x952A, 0x952B, 0x9529, 0x952C, +0x9531, 0x9532, 0x9534, 0x9536, +0x9537, 0x9538, 0x953C, 0x953E, +0x953F, 0x9542, 0x9535, 0x9544, +0x9545, 0x9546, 0x9549, 0x954C, +0x954E, 0x954F, 0x9552, 0x9553, +0x9554, 0x9556, 0x9557, 0x9558, +0x9559, 0x955B, 0x955E, 0x955F, +0x955D, 0x9561, 0x9562, 0x9564, +0x9565, 0x9566, 0x9567, 0x9568, +0x9569, 0x956A, 0x956B, 0x956C, +0x956F, 0x9571, 0x9572, 0x9573, +0x953A, 0x77E7, 0x77EC, 0x96C9, +0x79D5, 0x79ED, 0x79E3, 0x79EB, +0x7A06, 0x5D47, 0x7A03, 0x7A02, +0x7A1E, 0x7A14, 0x9908, 0x9909, +0x990A, 0x990B, 0x990C, 0x990E, +0x990F, 0x9911, 0x9912, 0x9913, +0x9914, 0x9915, 0x9916, 0x9917, +0x9918, 0x9919, 0x991A, 0x991B, +0x991C, 0x991D, 0x991E, 0x991F, +0x9920, 0x9921, 0x9922, 0x9923, +0x9924, 0x9925, 0x9926, 0x9927, +0x9928, 0x9929, 0x992A, 0x992B, +0x992C, 0x992D, 0x992F, 0x9930, +0x9931, 0x9932, 0x9933, 0x9934, +0x9935, 0x9936, 0x9937, 0x9938, +0x9939, 0x993A, 0x993B, 0x993C, +0x993D, 0x993E, 0x993F, 0x9940, +0x9941, 0x9942, 0x9943, 0x9944, +0x9945, 0x9946, 0x9947, 0x9948, +0x9949, 0x994A, 0x994B, 0x994C, +0x994D, 0x994E, 0x994F, 0x9950, +0x9951, 0x9952, 0x9953, 0x9956, +0x9957, 0x9958, 0x9959, 0x995A, +0x995B, 0x995C, 0x995D, 0x995E, +0x995F, 0x9960, 0x9961, 0x9962, +0x9964, 0x9966, 0x9973, 0x9978, +0x9979, 0x997B, 0x997E, 0x9982, +0x9983, 0x9989, 0x7A39, 0x7A37, +0x7A51, 0x9ECF, 0x99A5, 0x7A70, +0x7688, 0x768E, 0x7693, 0x7699, +0x76A4, 0x74DE, 0x74E0, 0x752C, +0x9E20, 0x9E22, 0x9E28, 0x9E29, +0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, +0x9E31, 0x9E36, 0x9E38, 0x9E37, +0x9E39, 0x9E3A, 0x9E3E, 0x9E41, +0x9E42, 0x9E44, 0x9E46, 0x9E47, +0x9E48, 0x9E49, 0x9E4B, 0x9E4C, +0x9E4E, 0x9E51, 0x9E55, 0x9E57, +0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, +0x9E63, 0x9E66, 0x9E67, 0x9E68, +0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, +0x9E71, 0x9E6D, 0x9E73, 0x7592, +0x7594, 0x7596, 0x75A0, 0x759D, +0x75AC, 0x75A3, 0x75B3, 0x75B4, +0x75B8, 0x75C4, 0x75B1, 0x75B0, +0x75C3, 0x75C2, 0x75D6, 0x75CD, +0x75E3, 0x75E8, 0x75E6, 0x75E4, +0x75EB, 0x75E7, 0x7603, 0x75F1, +0x75FC, 0x75FF, 0x7610, 0x7600, +0x7605, 0x760C, 0x7617, 0x760A, +0x7625, 0x7618, 0x7615, 0x7619, +0x998C, 0x998E, 0x999A, 0x999B, +0x999C, 0x999D, 0x999E, 0x999F, +0x99A0, 0x99A1, 0x99A2, 0x99A3, +0x99A4, 0x99A6, 0x99A7, 0x99A9, +0x99AA, 0x99AB, 0x99AC, 0x99AD, +0x99AE, 0x99AF, 0x99B0, 0x99B1, +0x99B2, 0x99B3, 0x99B4, 0x99B5, +0x99B6, 0x99B7, 0x99B8, 0x99B9, +0x99BA, 0x99BB, 0x99BC, 0x99BD, +0x99BE, 0x99BF, 0x99C0, 0x99C1, +0x99C2, 0x99C3, 0x99C4, 0x99C5, +0x99C6, 0x99C7, 0x99C8, 0x99C9, +0x99CA, 0x99CB, 0x99CC, 0x99CD, +0x99CE, 0x99CF, 0x99D0, 0x99D1, +0x99D2, 0x99D3, 0x99D4, 0x99D5, +0x99D6, 0x99D7, 0x99D8, 0x99D9, +0x99DA, 0x99DB, 0x99DC, 0x99DD, +0x99DE, 0x99DF, 0x99E0, 0x99E1, +0x99E2, 0x99E3, 0x99E4, 0x99E5, +0x99E6, 0x99E7, 0x99E8, 0x99E9, +0x99EA, 0x99EB, 0x99EC, 0x99ED, +0x99EE, 0x99EF, 0x99F0, 0x99F1, +0x99F2, 0x99F3, 0x99F4, 0x99F5, +0x99F6, 0x99F7, 0x99F8, 0x99F9, +0x761B, 0x763C, 0x7622, 0x7620, +0x7640, 0x762D, 0x7630, 0x763F, +0x7635, 0x7643, 0x763E, 0x7633, +0x764D, 0x765E, 0x7654, 0x765C, +0x7656, 0x766B, 0x766F, 0x7FCA, +0x7AE6, 0x7A78, 0x7A79, 0x7A80, +0x7A86, 0x7A88, 0x7A95, 0x7AA6, +0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, +0x7AB3, 0x8864, 0x8869, 0x8872, +0x887D, 0x887F, 0x8882, 0x88A2, +0x88C6, 0x88B7, 0x88BC, 0x88C9, +0x88E2, 0x88CE, 0x88E3, 0x88E5, +0x88F1, 0x891A, 0x88FC, 0x88E8, +0x88FE, 0x88F0, 0x8921, 0x8919, +0x8913, 0x891B, 0x890A, 0x8934, +0x892B, 0x8936, 0x8941, 0x8966, +0x897B, 0x758B, 0x80E5, 0x76B2, +0x76B4, 0x77DC, 0x8012, 0x8014, +0x8016, 0x801C, 0x8020, 0x8022, +0x8025, 0x8026, 0x8027, 0x8029, +0x8028, 0x8031, 0x800B, 0x8035, +0x8043, 0x8046, 0x804D, 0x8052, +0x8069, 0x8071, 0x8983, 0x9878, +0x9880, 0x9883, 0x99FA, 0x99FB, +0x99FC, 0x99FD, 0x99FE, 0x99FF, +0x9A00, 0x9A01, 0x9A02, 0x9A03, +0x9A04, 0x9A05, 0x9A06, 0x9A07, +0x9A08, 0x9A09, 0x9A0A, 0x9A0B, +0x9A0C, 0x9A0D, 0x9A0E, 0x9A0F, +0x9A10, 0x9A11, 0x9A12, 0x9A13, +0x9A14, 0x9A15, 0x9A16, 0x9A17, +0x9A18, 0x9A19, 0x9A1A, 0x9A1B, +0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, +0x9A20, 0x9A21, 0x9A22, 0x9A23, +0x9A24, 0x9A25, 0x9A26, 0x9A27, +0x9A28, 0x9A29, 0x9A2A, 0x9A2B, +0x9A2C, 0x9A2D, 0x9A2E, 0x9A2F, +0x9A30, 0x9A31, 0x9A32, 0x9A33, +0x9A34, 0x9A35, 0x9A36, 0x9A37, +0x9A38, 0x9A39, 0x9A3A, 0x9A3B, +0x9A3C, 0x9A3D, 0x9A3E, 0x9A3F, +0x9A40, 0x9A41, 0x9A42, 0x9A43, +0x9A44, 0x9A45, 0x9A46, 0x9A47, +0x9A48, 0x9A49, 0x9A4A, 0x9A4B, +0x9A4C, 0x9A4D, 0x9A4E, 0x9A4F, +0x9A50, 0x9A51, 0x9A52, 0x9A53, +0x9A54, 0x9A55, 0x9A56, 0x9A57, +0x9A58, 0x9A59, 0x9889, 0x988C, +0x988D, 0x988F, 0x9894, 0x989A, +0x989B, 0x989E, 0x989F, 0x98A1, +0x98A2, 0x98A5, 0x98A6, 0x864D, +0x8654, 0x866C, 0x866E, 0x867F, +0x867A, 0x867C, 0x867B, 0x86A8, +0x868D, 0x868B, 0x86AC, 0x869D, +0x86A7, 0x86A3, 0x86AA, 0x8693, +0x86A9, 0x86B6, 0x86C4, 0x86B5, +0x86CE, 0x86B0, 0x86BA, 0x86B1, +0x86AF, 0x86C9, 0x86CF, 0x86B4, +0x86E9, 0x86F1, 0x86F2, 0x86ED, +0x86F3, 0x86D0, 0x8713, 0x86DE, +0x86F4, 0x86DF, 0x86D8, 0x86D1, +0x8703, 0x8707, 0x86F8, 0x8708, +0x870A, 0x870D, 0x8709, 0x8723, +0x873B, 0x871E, 0x8725, 0x872E, +0x871A, 0x873E, 0x8748, 0x8734, +0x8731, 0x8729, 0x8737, 0x873F, +0x8782, 0x8722, 0x877D, 0x877E, +0x877B, 0x8760, 0x8770, 0x874C, +0x876E, 0x878B, 0x8753, 0x8763, +0x877C, 0x8764, 0x8759, 0x8765, +0x8793, 0x87AF, 0x87A8, 0x87D2, +0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, +0x9A5E, 0x9A5F, 0x9A60, 0x9A61, +0x9A62, 0x9A63, 0x9A64, 0x9A65, +0x9A66, 0x9A67, 0x9A68, 0x9A69, +0x9A6A, 0x9A6B, 0x9A72, 0x9A83, +0x9A89, 0x9A8D, 0x9A8E, 0x9A94, +0x9A95, 0x9A99, 0x9AA6, 0x9AA9, +0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, +0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, +0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, +0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, +0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, +0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, +0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4, +0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, +0x9ADA, 0x9ADB, 0x9ADC, 0x9ADD, +0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, +0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8, +0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, +0x9AF0, 0x9AF1, 0x9AF2, 0x9AF3, +0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, +0x9AF8, 0x9AFA, 0x9AFC, 0x9AFD, +0x9AFE, 0x9AFF, 0x9B00, 0x9B01, +0x9B02, 0x9B04, 0x9B05, 0x9B06, +0x87C6, 0x8788, 0x8785, 0x87AD, +0x8797, 0x8783, 0x87AB, 0x87E5, +0x87AC, 0x87B5, 0x87B3, 0x87CB, +0x87D3, 0x87BD, 0x87D1, 0x87C0, +0x87CA, 0x87DB, 0x87EA, 0x87E0, +0x87EE, 0x8816, 0x8813, 0x87FE, +0x880A, 0x881B, 0x8821, 0x8839, +0x883C, 0x7F36, 0x7F42, 0x7F44, +0x7F45, 0x8210, 0x7AFA, 0x7AFD, +0x7B08, 0x7B03, 0x7B04, 0x7B15, +0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, +0x7B38, 0x7B2A, 0x7B19, 0x7B2E, +0x7B31, 0x7B20, 0x7B25, 0x7B24, +0x7B33, 0x7B3E, 0x7B1E, 0x7B58, +0x7B5A, 0x7B45, 0x7B75, 0x7B4C, +0x7B5D, 0x7B60, 0x7B6E, 0x7B7B, +0x7B62, 0x7B72, 0x7B71, 0x7B90, +0x7BA6, 0x7BA7, 0x7BB8, 0x7BAC, +0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, +0x7B9C, 0x7BA2, 0x7BAB, 0x7BB4, +0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, +0x7BDA, 0x7BE5, 0x7BE6, 0x7BEA, +0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, +0x7C16, 0x7C0B, 0x9B07, 0x9B09, +0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, +0x9B0E, 0x9B10, 0x9B11, 0x9B12, +0x9B14, 0x9B15, 0x9B16, 0x9B17, +0x9B18, 0x9B19, 0x9B1A, 0x9B1B, +0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, +0x9B21, 0x9B22, 0x9B24, 0x9B25, +0x9B26, 0x9B27, 0x9B28, 0x9B29, +0x9B2A, 0x9B2B, 0x9B2C, 0x9B2D, +0x9B2E, 0x9B30, 0x9B31, 0x9B33, +0x9B34, 0x9B35, 0x9B36, 0x9B37, +0x9B38, 0x9B39, 0x9B3A, 0x9B3D, +0x9B3E, 0x9B3F, 0x9B40, 0x9B46, +0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, +0x9B50, 0x9B52, 0x9B53, 0x9B55, +0x9B56, 0x9B57, 0x9B58, 0x9B59, +0x9B5A, 0x9B5B, 0x9B5C, 0x9B5D, +0x9B5E, 0x9B5F, 0x9B60, 0x9B61, +0x9B62, 0x9B63, 0x9B64, 0x9B65, +0x9B66, 0x9B67, 0x9B68, 0x9B69, +0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, +0x9B6E, 0x9B6F, 0x9B70, 0x9B71, +0x9B72, 0x9B73, 0x9B74, 0x9B75, +0x9B76, 0x9B77, 0x9B78, 0x9B79, +0x9B7A, 0x9B7B, 0x7C1F, 0x7C2A, +0x7C26, 0x7C38, 0x7C41, 0x7C40, +0x81FE, 0x8201, 0x8202, 0x8204, +0x81EC, 0x8844, 0x8221, 0x8222, +0x8223, 0x822D, 0x822F, 0x8228, +0x822B, 0x8238, 0x823B, 0x8233, +0x8234, 0x823E, 0x8244, 0x8249, +0x824B, 0x824F, 0x825A, 0x825F, +0x8268, 0x887E, 0x8885, 0x8888, +0x88D8, 0x88DF, 0x895E, 0x7F9D, +0x7F9F, 0x7FA7, 0x7FAF, 0x7FB0, +0x7FB2, 0x7C7C, 0x6549, 0x7C91, +0x7C9D, 0x7C9C, 0x7C9E, 0x7CA2, +0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, +0x7CC7, 0x7CCC, 0x7CCD, 0x7CC8, +0x7CC5, 0x7CD7, 0x7CE8, 0x826E, +0x66A8, 0x7FBF, 0x7FCE, 0x7FD5, +0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, +0x7FEE, 0x7FF3, 0x7CF8, 0x7D77, +0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, +0x9EB8, 0x9EB4, 0x8D73, 0x8D84, +0x8D94, 0x8D91, 0x8DB1, 0x8D67, +0x8D6D, 0x8C47, 0x8C49, 0x914A, +0x9150, 0x914E, 0x914F, 0x9164, +0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, +0x9B80, 0x9B81, 0x9B82, 0x9B83, +0x9B84, 0x9B85, 0x9B86, 0x9B87, +0x9B88, 0x9B89, 0x9B8A, 0x9B8B, +0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, +0x9B90, 0x9B91, 0x9B92, 0x9B93, +0x9B94, 0x9B95, 0x9B96, 0x9B97, +0x9B98, 0x9B99, 0x9B9A, 0x9B9B, +0x9B9C, 0x9B9D, 0x9B9E, 0x9B9F, +0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, +0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, +0x9BA8, 0x9BA9, 0x9BAA, 0x9BAB, +0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, +0x9BB0, 0x9BB1, 0x9BB2, 0x9BB3, +0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, +0x9BB8, 0x9BB9, 0x9BBA, 0x9BBB, +0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, +0x9BC0, 0x9BC1, 0x9BC2, 0x9BC3, +0x9BC4, 0x9BC5, 0x9BC6, 0x9BC7, +0x9BC8, 0x9BC9, 0x9BCA, 0x9BCB, +0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, +0x9BD0, 0x9BD1, 0x9BD2, 0x9BD3, +0x9BD4, 0x9BD5, 0x9BD6, 0x9BD7, +0x9BD8, 0x9BD9, 0x9BDA, 0x9BDB, +0x9162, 0x9161, 0x9170, 0x9169, +0x916F, 0x917D, 0x917E, 0x9172, +0x9174, 0x9179, 0x918C, 0x9185, +0x9190, 0x918D, 0x9191, 0x91A2, +0x91A3, 0x91AA, 0x91AD, 0x91AE, +0x91AF, 0x91B5, 0x91B4, 0x91BA, +0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, +0x8E05, 0x8E59, 0x8E69, 0x8DB5, +0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, +0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, +0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, +0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, +0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, +0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, +0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, +0x8E3A, 0x8E40, 0x8E39, 0x8E35, +0x8E3D, 0x8E31, 0x8E49, 0x8E41, +0x8E42, 0x8E51, 0x8E52, 0x8E4A, +0x8E70, 0x8E76, 0x8E7C, 0x8E6F, +0x8E74, 0x8E85, 0x8E8F, 0x8E94, +0x8E90, 0x8E9C, 0x8E9E, 0x8C78, +0x8C82, 0x8C8A, 0x8C85, 0x8C98, +0x8C94, 0x659B, 0x89D6, 0x89DE, +0x89DA, 0x89DC, 0x9BDC, 0x9BDD, +0x9BDE, 0x9BDF, 0x9BE0, 0x9BE1, +0x9BE2, 0x9BE3, 0x9BE4, 0x9BE5, +0x9BE6, 0x9BE7, 0x9BE8, 0x9BE9, +0x9BEA, 0x9BEB, 0x9BEC, 0x9BED, +0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, +0x9BF2, 0x9BF3, 0x9BF4, 0x9BF5, +0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, +0x9BFA, 0x9BFB, 0x9BFC, 0x9BFD, +0x9BFE, 0x9BFF, 0x9C00, 0x9C01, +0x9C02, 0x9C03, 0x9C04, 0x9C05, +0x9C06, 0x9C07, 0x9C08, 0x9C09, +0x9C0A, 0x9C0B, 0x9C0C, 0x9C0D, +0x9C0E, 0x9C0F, 0x9C10, 0x9C11, +0x9C12, 0x9C13, 0x9C14, 0x9C15, +0x9C16, 0x9C17, 0x9C18, 0x9C19, +0x9C1A, 0x9C1B, 0x9C1C, 0x9C1D, +0x9C1E, 0x9C1F, 0x9C20, 0x9C21, +0x9C22, 0x9C23, 0x9C24, 0x9C25, +0x9C26, 0x9C27, 0x9C28, 0x9C29, +0x9C2A, 0x9C2B, 0x9C2C, 0x9C2D, +0x9C2E, 0x9C2F, 0x9C30, 0x9C31, +0x9C32, 0x9C33, 0x9C34, 0x9C35, +0x9C36, 0x9C37, 0x9C38, 0x9C39, +0x9C3A, 0x9C3B, 0x89E5, 0x89EB, +0x89EF, 0x8A3E, 0x8B26, 0x9753, +0x96E9, 0x96F3, 0x96EF, 0x9706, +0x9701, 0x9708, 0x970F, 0x970E, +0x972A, 0x972D, 0x9730, 0x973E, +0x9F80, 0x9F83, 0x9F85, 0x9F86, +0x9F87, 0x9F88, 0x9F89, 0x9F8A, +0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, +0x96B9, 0x96BC, 0x96BD, 0x96CE, +0x96D2, 0x77BF, 0x96E0, 0x928E, +0x92AE, 0x92C8, 0x933E, 0x936A, +0x93CA, 0x938F, 0x943E, 0x946B, +0x9C7F, 0x9C82, 0x9C85, 0x9C86, +0x9C87, 0x9C88, 0x7A23, 0x9C8B, +0x9C8E, 0x9C90, 0x9C91, 0x9C92, +0x9C94, 0x9C95, 0x9C9A, 0x9C9B, +0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, +0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, +0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, +0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, +0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, +0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, +0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, +0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, +0x9C3C, 0x9C3D, 0x9C3E, 0x9C3F, +0x9C40, 0x9C41, 0x9C42, 0x9C43, +0x9C44, 0x9C45, 0x9C46, 0x9C47, +0x9C48, 0x9C49, 0x9C4A, 0x9C4B, +0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, +0x9C50, 0x9C51, 0x9C52, 0x9C53, +0x9C54, 0x9C55, 0x9C56, 0x9C57, +0x9C58, 0x9C59, 0x9C5A, 0x9C5B, +0x9C5C, 0x9C5D, 0x9C5E, 0x9C5F, +0x9C60, 0x9C61, 0x9C62, 0x9C63, +0x9C64, 0x9C65, 0x9C66, 0x9C67, +0x9C68, 0x9C69, 0x9C6A, 0x9C6B, +0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, +0x9C70, 0x9C71, 0x9C72, 0x9C73, +0x9C74, 0x9C75, 0x9C76, 0x9C77, +0x9C78, 0x9C79, 0x9C7A, 0x9C7B, +0x9C7D, 0x9C7E, 0x9C80, 0x9C83, +0x9C84, 0x9C89, 0x9C8A, 0x9C8C, +0x9C8F, 0x9C93, 0x9C96, 0x9C97, +0x9C98, 0x9C99, 0x9C9D, 0x9CAA, +0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, +0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, +0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, +0x9CDA, 0x9CDB, 0x9CE0, 0x9CE1, +0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, +0x9CD0, 0x9CD3, 0x9CD4, 0x9CD5, +0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, +0x9CDD, 0x9CDF, 0x9CE2, 0x977C, +0x9785, 0x9791, 0x9792, 0x9794, +0x97AF, 0x97AB, 0x97A3, 0x97B2, +0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, +0x9E58, 0x9AB6, 0x9ABA, 0x9ABC, +0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, +0x9ACB, 0x9ACC, 0x9AD1, 0x9B45, +0x9B43, 0x9B47, 0x9B49, 0x9B48, +0x9B4D, 0x9B51, 0x98E8, 0x990D, +0x992E, 0x9955, 0x9954, 0x9ADF, +0x9AE1, 0x9AE6, 0x9AEF, 0x9AEB, +0x9AFB, 0x9AED, 0x9AF9, 0x9B08, +0x9B0F, 0x9B13, 0x9B1F, 0x9B23, +0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, +0x9E87, 0x9E88, 0x9E8B, 0x9E92, +0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, +0x9EDC, 0x9EDD, 0x9EE0, 0x9EDF, +0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, +0x9EEA, 0x9EEF, 0x9F22, 0x9F2C, +0x9F2F, 0x9F39, 0x9F37, 0x9F3D, +0x9F3E, 0x9F44, 0x9CE3, 0x9CE4, +0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, +0x9CE9, 0x9CEA, 0x9CEB, 0x9CEC, +0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, +0x9CF1, 0x9CF2, 0x9CF3, 0x9CF4, +0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, +0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, +0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, +0x9D01, 0x9D02, 0x9D03, 0x9D04, +0x9D05, 0x9D06, 0x9D07, 0x9D08, +0x9D09, 0x9D0A, 0x9D0B, 0x9D0C, +0x9D0D, 0x9D0E, 0x9D0F, 0x9D10, +0x9D11, 0x9D12, 0x9D13, 0x9D14, +0x9D15, 0x9D16, 0x9D17, 0x9D18, +0x9D19, 0x9D1A, 0x9D1B, 0x9D1C, +0x9D1D, 0x9D1E, 0x9D1F, 0x9D20, +0x9D21, 0x9D22, 0x9D23, 0x9D24, +0x9D25, 0x9D26, 0x9D27, 0x9D28, +0x9D29, 0x9D2A, 0x9D2B, 0x9D2C, +0x9D2D, 0x9D2E, 0x9D2F, 0x9D30, +0x9D31, 0x9D32, 0x9D33, 0x9D34, +0x9D35, 0x9D36, 0x9D37, 0x9D38, +0x9D39, 0x9D3A, 0x9D3B, 0x9D3C, +0x9D3D, 0x9D3E, 0x9D3F, 0x9D40, +0x9D41, 0x9D42, 0xE234, 0xE235, +0xE236, 0xE237, 0xE238, 0xE239, +0xE23A, 0xE23B, 0xE23C, 0xE23D, +0xE23E, 0xE23F, 0xE240, 0xE241, +0xE242, 0xE243, 0xE244, 0xE245, +0xE246, 0xE247, 0xE248, 0xE249, +0xE24A, 0xE24B, 0xE24C, 0xE24D, +0xE24E, 0xE24F, 0xE250, 0xE251, +0xE252, 0xE253, 0xE254, 0xE255, +0xE256, 0xE257, 0xE258, 0xE259, +0xE25A, 0xE25B, 0xE25C, 0xE25D, +0xE25E, 0xE25F, 0xE260, 0xE261, +0xE262, 0xE263, 0xE264, 0xE265, +0xE266, 0xE267, 0xE268, 0xE269, +0xE26A, 0xE26B, 0xE26C, 0xE26D, +0xE26E, 0xE26F, 0xE270, 0xE271, +0xE272, 0xE273, 0xE274, 0xE275, +0xE276, 0xE277, 0xE278, 0xE279, +0xE27A, 0xE27B, 0xE27C, 0xE27D, +0xE27E, 0xE27F, 0xE280, 0xE281, +0xE282, 0xE283, 0xE284, 0xE285, +0xE286, 0xE287, 0xE288, 0xE289, +0xE28A, 0xE28B, 0xE28C, 0xE28D, +0xE28E, 0xE28F, 0xE290, 0xE291, +0x9D43, 0x9D44, 0x9D45, 0x9D46, +0x9D47, 0x9D48, 0x9D49, 0x9D4A, +0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, +0x9D4F, 0x9D50, 0x9D51, 0x9D52, +0x9D53, 0x9D54, 0x9D55, 0x9D56, +0x9D57, 0x9D58, 0x9D59, 0x9D5A, +0x9D5B, 0x9D5C, 0x9D5D, 0x9D5E, +0x9D5F, 0x9D60, 0x9D61, 0x9D62, +0x9D63, 0x9D64, 0x9D65, 0x9D66, +0x9D67, 0x9D68, 0x9D69, 0x9D6A, +0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, +0x9D6F, 0x9D70, 0x9D71, 0x9D72, +0x9D73, 0x9D74, 0x9D75, 0x9D76, +0x9D77, 0x9D78, 0x9D79, 0x9D7A, +0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, +0x9D7F, 0x9D80, 0x9D81, 0x9D82, +0x9D83, 0x9D84, 0x9D85, 0x9D86, +0x9D87, 0x9D88, 0x9D89, 0x9D8A, +0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, +0x9D8F, 0x9D90, 0x9D91, 0x9D92, +0x9D93, 0x9D94, 0x9D95, 0x9D96, +0x9D97, 0x9D98, 0x9D99, 0x9D9A, +0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, +0x9D9F, 0x9DA0, 0x9DA1, 0x9DA2, +0xE292, 0xE293, 0xE294, 0xE295, +0xE296, 0xE297, 0xE298, 0xE299, +0xE29A, 0xE29B, 0xE29C, 0xE29D, +0xE29E, 0xE29F, 0xE2A0, 0xE2A1, +0xE2A2, 0xE2A3, 0xE2A4, 0xE2A5, +0xE2A6, 0xE2A7, 0xE2A8, 0xE2A9, +0xE2AA, 0xE2AB, 0xE2AC, 0xE2AD, +0xE2AE, 0xE2AF, 0xE2B0, 0xE2B1, +0xE2B2, 0xE2B3, 0xE2B4, 0xE2B5, +0xE2B6, 0xE2B7, 0xE2B8, 0xE2B9, +0xE2BA, 0xE2BB, 0xE2BC, 0xE2BD, +0xE2BE, 0xE2BF, 0xE2C0, 0xE2C1, +0xE2C2, 0xE2C3, 0xE2C4, 0xE2C5, +0xE2C6, 0xE2C7, 0xE2C8, 0xE2C9, +0xE2CA, 0xE2CB, 0xE2CC, 0xE2CD, +0xE2CE, 0xE2CF, 0xE2D0, 0xE2D1, +0xE2D2, 0xE2D3, 0xE2D4, 0xE2D5, +0xE2D6, 0xE2D7, 0xE2D8, 0xE2D9, +0xE2DA, 0xE2DB, 0xE2DC, 0xE2DD, +0xE2DE, 0xE2DF, 0xE2E0, 0xE2E1, +0xE2E2, 0xE2E3, 0xE2E4, 0xE2E5, +0xE2E6, 0xE2E7, 0xE2E8, 0xE2E9, +0xE2EA, 0xE2EB, 0xE2EC, 0xE2ED, +0xE2EE, 0xE2EF, 0x9DA3, 0x9DA4, +0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, +0x9DA9, 0x9DAA, 0x9DAB, 0x9DAC, +0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, +0x9DB1, 0x9DB2, 0x9DB3, 0x9DB4, +0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, +0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC, +0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, +0x9DC1, 0x9DC2, 0x9DC3, 0x9DC4, +0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, +0x9DC9, 0x9DCA, 0x9DCB, 0x9DCC, +0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, +0x9DD1, 0x9DD2, 0x9DD3, 0x9DD4, +0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, +0x9DD9, 0x9DDA, 0x9DDB, 0x9DDC, +0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, +0x9DE1, 0x9DE2, 0x9DE3, 0x9DE4, +0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, +0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, +0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, +0x9DF1, 0x9DF2, 0x9DF3, 0x9DF4, +0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, +0x9DF9, 0x9DFA, 0x9DFB, 0x9DFC, +0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, +0x9E01, 0x9E02, 0xE2F0, 0xE2F1, +0xE2F2, 0xE2F3, 0xE2F4, 0xE2F5, +0xE2F6, 0xE2F7, 0xE2F8, 0xE2F9, +0xE2FA, 0xE2FB, 0xE2FC, 0xE2FD, +0xE2FE, 0xE2FF, 0xE300, 0xE301, +0xE302, 0xE303, 0xE304, 0xE305, +0xE306, 0xE307, 0xE308, 0xE309, +0xE30A, 0xE30B, 0xE30C, 0xE30D, +0xE30E, 0xE30F, 0xE310, 0xE311, +0xE312, 0xE313, 0xE314, 0xE315, +0xE316, 0xE317, 0xE318, 0xE319, +0xE31A, 0xE31B, 0xE31C, 0xE31D, +0xE31E, 0xE31F, 0xE320, 0xE321, +0xE322, 0xE323, 0xE324, 0xE325, +0xE326, 0xE327, 0xE328, 0xE329, +0xE32A, 0xE32B, 0xE32C, 0xE32D, +0xE32E, 0xE32F, 0xE330, 0xE331, +0xE332, 0xE333, 0xE334, 0xE335, +0xE336, 0xE337, 0xE338, 0xE339, +0xE33A, 0xE33B, 0xE33C, 0xE33D, +0xE33E, 0xE33F, 0xE340, 0xE341, +0xE342, 0xE343, 0xE344, 0xE345, +0xE346, 0xE347, 0xE348, 0xE349, +0xE34A, 0xE34B, 0xE34C, 0xE34D, +0x9E03, 0x9E04, 0x9E05, 0x9E06, +0x9E07, 0x9E08, 0x9E09, 0x9E0A, +0x9E0B, 0x9E0C, 0x9E0D, 0x9E0E, +0x9E0F, 0x9E10, 0x9E11, 0x9E12, +0x9E13, 0x9E14, 0x9E15, 0x9E16, +0x9E17, 0x9E18, 0x9E19, 0x9E1A, +0x9E1B, 0x9E1C, 0x9E1D, 0x9E1E, +0x9E24, 0x9E27, 0x9E2E, 0x9E30, +0x9E34, 0x9E3B, 0x9E3C, 0x9E40, +0x9E4D, 0x9E50, 0x9E52, 0x9E53, +0x9E54, 0x9E56, 0x9E59, 0x9E5D, +0x9E5F, 0x9E60, 0x9E61, 0x9E62, +0x9E65, 0x9E6E, 0x9E6F, 0x9E72, +0x9E74, 0x9E75, 0x9E76, 0x9E77, +0x9E78, 0x9E79, 0x9E7A, 0x9E7B, +0x9E7C, 0x9E7D, 0x9E80, 0x9E81, +0x9E83, 0x9E84, 0x9E85, 0x9E86, +0x9E89, 0x9E8A, 0x9E8C, 0x9E8D, +0x9E8E, 0x9E8F, 0x9E90, 0x9E91, +0x9E94, 0x9E95, 0x9E96, 0x9E97, +0x9E98, 0x9E99, 0x9E9A, 0x9E9B, +0x9E9C, 0x9E9E, 0x9EA0, 0x9EA1, +0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, +0x9EA7, 0x9EA8, 0x9EA9, 0x9EAA, +0xE34E, 0xE34F, 0xE350, 0xE351, +0xE352, 0xE353, 0xE354, 0xE355, +0xE356, 0xE357, 0xE358, 0xE359, +0xE35A, 0xE35B, 0xE35C, 0xE35D, +0xE35E, 0xE35F, 0xE360, 0xE361, +0xE362, 0xE363, 0xE364, 0xE365, +0xE366, 0xE367, 0xE368, 0xE369, +0xE36A, 0xE36B, 0xE36C, 0xE36D, +0xE36E, 0xE36F, 0xE370, 0xE371, +0xE372, 0xE373, 0xE374, 0xE375, +0xE376, 0xE377, 0xE378, 0xE379, +0xE37A, 0xE37B, 0xE37C, 0xE37D, +0xE37E, 0xE37F, 0xE380, 0xE381, +0xE382, 0xE383, 0xE384, 0xE385, +0xE386, 0xE387, 0xE388, 0xE389, +0xE38A, 0xE38B, 0xE38C, 0xE38D, +0xE38E, 0xE38F, 0xE390, 0xE391, +0xE392, 0xE393, 0xE394, 0xE395, +0xE396, 0xE397, 0xE398, 0xE399, +0xE39A, 0xE39B, 0xE39C, 0xE39D, +0xE39E, 0xE39F, 0xE3A0, 0xE3A1, +0xE3A2, 0xE3A3, 0xE3A4, 0xE3A5, +0xE3A6, 0xE3A7, 0xE3A8, 0xE3A9, +0xE3AA, 0xE3AB, 0x9EAB, 0x9EAC, +0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, +0x9EB1, 0x9EB2, 0x9EB3, 0x9EB5, +0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, +0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, +0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, +0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, +0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, +0x9ED5, 0x9ED6, 0x9ED7, 0x9ED9, +0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, +0x9EE4, 0x9EE6, 0x9EE8, 0x9EEB, +0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, +0x9EF1, 0x9EF2, 0x9EF3, 0x9EF4, +0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, +0x9EFA, 0x9EFD, 0x9EFF, 0x9F00, +0x9F01, 0x9F02, 0x9F03, 0x9F04, +0x9F05, 0x9F06, 0x9F07, 0x9F08, +0x9F09, 0x9F0A, 0x9F0C, 0x9F0F, +0x9F11, 0x9F12, 0x9F14, 0x9F15, +0x9F16, 0x9F18, 0x9F1A, 0x9F1B, +0x9F1C, 0x9F1D, 0x9F1E, 0x9F1F, +0x9F21, 0x9F23, 0x9F24, 0x9F25, +0x9F26, 0x9F27, 0x9F28, 0x9F29, +0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, +0x9F30, 0x9F31, 0xE3AC, 0xE3AD, +0xE3AE, 0xE3AF, 0xE3B0, 0xE3B1, +0xE3B2, 0xE3B3, 0xE3B4, 0xE3B5, +0xE3B6, 0xE3B7, 0xE3B8, 0xE3B9, +0xE3BA, 0xE3BB, 0xE3BC, 0xE3BD, +0xE3BE, 0xE3BF, 0xE3C0, 0xE3C1, +0xE3C2, 0xE3C3, 0xE3C4, 0xE3C5, +0xE3C6, 0xE3C7, 0xE3C8, 0xE3C9, +0xE3CA, 0xE3CB, 0xE3CC, 0xE3CD, +0xE3CE, 0xE3CF, 0xE3D0, 0xE3D1, +0xE3D2, 0xE3D3, 0xE3D4, 0xE3D5, +0xE3D6, 0xE3D7, 0xE3D8, 0xE3D9, +0xE3DA, 0xE3DB, 0xE3DC, 0xE3DD, +0xE3DE, 0xE3DF, 0xE3E0, 0xE3E1, +0xE3E2, 0xE3E3, 0xE3E4, 0xE3E5, +0xE3E6, 0xE3E7, 0xE3E8, 0xE3E9, +0xE3EA, 0xE3EB, 0xE3EC, 0xE3ED, +0xE3EE, 0xE3EF, 0xE3F0, 0xE3F1, +0xE3F2, 0xE3F3, 0xE3F4, 0xE3F5, +0xE3F6, 0xE3F7, 0xE3F8, 0xE3F9, +0xE3FA, 0xE3FB, 0xE3FC, 0xE3FD, +0xE3FE, 0xE3FF, 0xE400, 0xE401, +0xE402, 0xE403, 0xE404, 0xE405, +0xE406, 0xE407, 0xE408, 0xE409, +0x9F32, 0x9F33, 0x9F34, 0x9F35, +0x9F36, 0x9F38, 0x9F3A, 0x9F3C, +0x9F3F, 0x9F40, 0x9F41, 0x9F42, +0x9F43, 0x9F45, 0x9F46, 0x9F47, +0x9F48, 0x9F49, 0x9F4A, 0x9F4B, +0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, +0x9F52, 0x9F53, 0x9F54, 0x9F55, +0x9F56, 0x9F57, 0x9F58, 0x9F59, +0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, +0x9F5E, 0x9F5F, 0x9F60, 0x9F61, +0x9F62, 0x9F63, 0x9F64, 0x9F65, +0x9F66, 0x9F67, 0x9F68, 0x9F69, +0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, +0x9F6E, 0x9F6F, 0x9F70, 0x9F71, +0x9F72, 0x9F73, 0x9F74, 0x9F75, +0x9F76, 0x9F77, 0x9F78, 0x9F79, +0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, +0x9F7E, 0x9F81, 0x9F82, 0x9F8D, +0x9F8E, 0x9F8F, 0x9F90, 0x9F91, +0x9F92, 0x9F93, 0x9F94, 0x9F95, +0x9F96, 0x9F97, 0x9F98, 0x9F9C, +0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, +0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, +0xF979, 0xF995, 0xF9E7, 0xF9F1, +0xE40A, 0xE40B, 0xE40C, 0xE40D, +0xE40E, 0xE40F, 0xE410, 0xE411, +0xE412, 0xE413, 0xE414, 0xE415, +0xE416, 0xE417, 0xE418, 0xE419, +0xE41A, 0xE41B, 0xE41C, 0xE41D, +0xE41E, 0xE41F, 0xE420, 0xE421, +0xE422, 0xE423, 0xE424, 0xE425, +0xE426, 0xE427, 0xE428, 0xE429, +0xE42A, 0xE42B, 0xE42C, 0xE42D, +0xE42E, 0xE42F, 0xE430, 0xE431, +0xE432, 0xE433, 0xE434, 0xE435, +0xE436, 0xE437, 0xE438, 0xE439, +0xE43A, 0xE43B, 0xE43C, 0xE43D, +0xE43E, 0xE43F, 0xE440, 0xE441, +0xE442, 0xE443, 0xE444, 0xE445, +0xE446, 0xE447, 0xE448, 0xE449, +0xE44A, 0xE44B, 0xE44C, 0xE44D, +0xE44E, 0xE44F, 0xE450, 0xE451, +0xE452, 0xE453, 0xE454, 0xE455, +0xE456, 0xE457, 0xE458, 0xE459, +0xE45A, 0xE45B, 0xE45C, 0xE45D, +0xE45E, 0xE45F, 0xE460, 0xE461, +0xE462, 0xE463, 0xE464, 0xE465, +0xE466, 0xE467, 0xFA0C, 0xFA0D, +0xFA0E, 0xFA0F, 0xFA11, 0xFA13, +0xFA14, 0xFA18, 0xFA1F, 0xFA20, +0xFA21, 0xFA23, 0xFA24, 0xFA27, +0xFA28, 0xFA29, 0x2E81, 0xE816, +0xE817, 0xE818, 0x2E84, 0x3473, +0x3447, 0x2E88, 0x2E8B, 0xE81E, +0x359E, 0x361A, 0x360E, 0x2E8C, +0x2E97, 0x396E, 0x3918, 0xE826, +0x39CF, 0x39DF, 0x3A73, 0x39D0, +0xE82B, 0xE82C, 0x3B4E, 0x3C6E, +0x3CE0, 0x2EA7, 0xE831, 0xE832, +0x2EAA, 0x4056, 0x415F, 0x2EAE, +0x4337, 0x2EB3, 0x2EB6, 0x2EB7, +0xE83B, 0x43B1, 0x43AC, 0x2EBB, +0x43DD, 0x44D6, 0x4661, 0x464C, +0xE843, 0x4723, 0x4729, 0x477C, +0x478D, 0x2ECA, 0x4947, 0x497A, +0x497D, 0x4982, 0x4983, 0x4985, +0x4986, 0x499F, 0x499B, 0x49B7, +0x49B6, 0xE854, 0xE855, 0x4CA3, +0x4C9F, 0x4CA0, 0x4CA1, 0x4C77, +0x4CA2, 0x4D13, 0x4D14, 0x4D15, +0x4D16, 0x4D17, 0x4D18, 0x4D19, +0x4DAE, 0xE864, 0xE468, 0xE469, +0xE46A, 0xE46B, 0xE46C, 0xE46D, +0xE46E, 0xE46F, 0xE470, 0xE471, +0xE472, 0xE473, 0xE474, 0xE475, +0xE476, 0xE477, 0xE478, 0xE479, +0xE47A, 0xE47B, 0xE47C, 0xE47D, +0xE47E, 0xE47F, 0xE480, 0xE481, +0xE482, 0xE483, 0xE484, 0xE485, +0xE486, 0xE487, 0xE488, 0xE489, +0xE48A, 0xE48B, 0xE48C, 0xE48D, +0xE48E, 0xE48F, 0xE490, 0xE491, +0xE492, 0xE493, 0xE494, 0xE495, +0xE496, 0xE497, 0xE498, 0xE499, +0xE49A, 0xE49B, 0xE49C, 0xE49D, +0xE49E, 0xE49F, 0xE4A0, 0xE4A1, +0xE4A2, 0xE4A3, 0xE4A4, 0xE4A5, +0xE4A6, 0xE4A7, 0xE4A8, 0xE4A9, +0xE4AA, 0xE4AB, 0xE4AC, 0xE4AD, +0xE4AE, 0xE4AF, 0xE4B0, 0xE4B1, +0xE4B2, 0xE4B3, 0xE4B4, 0xE4B5, +0xE4B6, 0xE4B7, 0xE4B8, 0xE4B9, +0xE4BA, 0xE4BB, 0xE4BC, 0xE4BD, +0xE4BE, 0xE4BF, 0xE4C0, 0xE4C1, +0xE4C2, 0xE4C3, 0xE4C4, 0xE4C5 +} ; diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_Manager.cxx opencascade-7.5.1+dfsg1/src/Resource/Resource_Manager.cxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_Manager.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_Manager.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -12,15 +12,14 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include #include #include #include -#include #include -#include #include #include #include @@ -54,42 +53,52 @@ static Standard_Boolean Debug; -Resource_Manager::Resource_Manager(const Standard_CString aName, - TCollection_AsciiString& aDefaultsDirectory, - TCollection_AsciiString& anUserDefaultsDirectory, - const Standard_Boolean Verbose) : myName(aName), myVerbose(Verbose) +// ======================================================================= +// function : Resource_Manager +// purpose : +// ======================================================================= +Resource_Manager::Resource_Manager (const TCollection_AsciiString& theName, + const TCollection_AsciiString& theDefaultsDirectory, + const TCollection_AsciiString& theUserDefaultsDirectory, + const Standard_Boolean theIsVerbose) +: myName (theName), + myVerbose (theIsVerbose) { - if ( !aDefaultsDirectory.IsEmpty() ) { - OSD_Path anOSDPath(aDefaultsDirectory); + if (!theDefaultsDirectory.IsEmpty()) + { + OSD_Path anOSDPath (theDefaultsDirectory); if (!anOSDPath.Name().IsEmpty()) { - anOSDPath.DownTrek (anOSDPath.Name () + anOSDPath.Extension ()); + anOSDPath.DownTrek (anOSDPath.Name() + anOSDPath.Extension()); } - anOSDPath.SetName(aName); - anOSDPath.SetExtension(""); + anOSDPath.SetName (theName); + anOSDPath.SetExtension (""); TCollection_AsciiString aPath; - anOSDPath.SystemName(aPath); - Load(aPath,myRefMap); + anOSDPath.SystemName (aPath); + Load (aPath, myRefMap); + } + else if (myVerbose) + { + std::cout << "Resource Manager Warning: aDefaultsDirectory is empty." << std::endl; } - else - if (myVerbose) - std::cout << "Resource Manager Warning: aDefaultsDirectory is empty." << std::endl; - if ( !anUserDefaultsDirectory.IsEmpty() ) { - OSD_Path anOSDPath(anUserDefaultsDirectory); + if (!theUserDefaultsDirectory.IsEmpty()) + { + OSD_Path anOSDPath (theUserDefaultsDirectory); if (!anOSDPath.Name().IsEmpty()) { - anOSDPath.DownTrek (anOSDPath.Name () + anOSDPath.Extension ()); + anOSDPath.DownTrek (anOSDPath.Name() + anOSDPath.Extension()); } - anOSDPath.SetName(aName); - anOSDPath.SetExtension(""); + anOSDPath.SetName (theName); + anOSDPath.SetExtension (""); TCollection_AsciiString aPath; - anOSDPath.SystemName(aPath); - Load(aPath,myRefMap); + anOSDPath.SystemName (aPath); + Load (aPath, myRefMap); + } + else if (myVerbose) + { + std::cout << "Resource Manager Warning: anUserDefaultsDirectory is empty." << std::endl; } - else - if (myVerbose) - std::cout << "Resource Manager Warning: anUserDefaultsDirectory is empty." << std::endl; } Resource_Manager::Resource_Manager(const Standard_CString aName, @@ -119,12 +128,16 @@ std::cout << "Resource Manager Warning: Environment variable \"CSF_" << aName << "UserDefaults\" not set." << std::endl; } -void Resource_Manager::Load(TCollection_AsciiString& aPath, +// ======================================================================= +// function : Load +// purpose : +// ======================================================================= +void Resource_Manager::Load(const TCollection_AsciiString& thePath, Resource_DataMapOfAsciiStringAsciiString& aMap) { Resource_KindOfLine aKind; TCollection_AsciiString Token1, Token2; - OSD_Path Path(aPath); + OSD_Path Path (thePath); OSD_File File = Path; TCollection_AsciiString FileName = Path.Name(); File.Open(OSD_ReadOnly,OSD_Protection()); @@ -483,6 +496,17 @@ } //======================================================================= +//function : Find +//purpose : +//======================================================================= +Standard_Boolean Resource_Manager::Find (const TCollection_AsciiString& theResource, + TCollection_AsciiString& theValue) const +{ + return myUserMap.Find (theResource, theValue) + || myRefMap .Find (theResource, theValue); +} + +//======================================================================= //function : GetResourcePath //purpose : //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_Manager.hxx opencascade-7.5.1+dfsg1/src/Resource/Resource_Manager.hxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_Manager.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_Manager.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,10 +41,9 @@ //! Defines a resource structure and its management methods. class Resource_Manager : public Standard_Transient { - + DEFINE_STANDARD_RTTIEXT(Resource_Manager,Standard_Transient) public: - //! Create a Resource manager. //! Attempts to find the two following files: //! $CSF_`aName`Defaults/aName @@ -58,8 +57,16 @@ //! lines terminated by newline characters or end of file. The //! syntax of an individual resource line is: Standard_EXPORT Resource_Manager(const Standard_CString aName, const Standard_Boolean Verbose = Standard_False); - - Standard_EXPORT Resource_Manager(const Standard_CString aName, TCollection_AsciiString& aDefaultsDirectory, TCollection_AsciiString& anUserDefaultsDirectory, const Standard_Boolean Verbose = Standard_False); + + //! Create a Resource manager. + //! @param theName [in] description file name + //! @param theDefaultsDirectory [in] default folder for looking description file + //! @param theUserDefaultsDirectory [in] user folder for looking description file + //! @param theIsVerbose [in] print verbose messages + Standard_EXPORT Resource_Manager (const TCollection_AsciiString& theName, + const TCollection_AsciiString& theDefaultsDirectory, + const TCollection_AsciiString& theUserDefaultsDirectory, + const Standard_Boolean theIsVerbose = Standard_False); //! Save the user resource structure in the specified file. //! Creates the file if it does not exist. @@ -67,7 +74,11 @@ //! returns True if the Resource does exist. Standard_EXPORT Standard_Boolean Find (const Standard_CString aResource) const; - + + //! returns True if the Resource does exist. + Standard_EXPORT Standard_Boolean Find (const TCollection_AsciiString& theResource, + TCollection_AsciiString& theValue) const; + //! Gets the value of an integer resource according to its //! instance and its type. Standard_EXPORT virtual Standard_Integer Integer (const Standard_CString aResourceName) const; @@ -105,34 +116,19 @@ //! or file doesn't exist returns empty string. Standard_EXPORT static void GetResourcePath (TCollection_AsciiString& aPath, const Standard_CString aName, const Standard_Boolean isUserDefaults); +private: - - - DEFINE_STANDARD_RTTIEXT(Resource_Manager,Standard_Transient) - -protected: - - - + Standard_EXPORT void Load (const TCollection_AsciiString& thePath, + Resource_DataMapOfAsciiStringAsciiString& aMap); private: - - Standard_EXPORT void Load (TCollection_AsciiString& aPath, Resource_DataMapOfAsciiStringAsciiString& aMap); - TCollection_AsciiString myName; Resource_DataMapOfAsciiStringAsciiString myRefMap; Resource_DataMapOfAsciiStringAsciiString myUserMap; Resource_DataMapOfAsciiStringExtendedString myExtStrMap; Standard_Boolean myVerbose; - }; - - - - - - #endif // _Resource_Manager_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_Shiftjis.h opencascade-7.5.1+dfsg1/src/Resource/Resource_Shiftjis.h --- opencascade-7.4.1+dfsg1/src/Resource/Resource_Shiftjis.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_Shiftjis.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,32788 +0,0 @@ -/* - Copyright (c) 1998-1999 Matra Datavision - Copyright (c) 1999-2014 OPEN CASCADE SAS - - This file is part of Open CASCADE Technology software library. - - This library is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License version 2.1 as published - by the Free Software Foundation, with special exception defined in the file - OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT - distribution for complete text of the license and disclaimer of any warranty. - - Alternatively, this file may be used under the terms of Open CASCADE - commercial license or contractual agreement. -*/ - -static char16 unisjis [65536] = { -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x20 , 0x21 , 0x22 , 0x23 , -0x24 , 0x25 , 0x26 , 0x27 , -0x28 , 0x29 , 0x2a , 0x2b , -0x2c , 0x2d , 0x2e , 0x2f , -0x30 , 0x31 , 0x32 , 0x33 , -0x34 , 0x35 , 0x36 , 0x37 , -0x38 , 0x39 , 0x3a , 0x3b , -0x3c , 0x3d , 0x3e , 0x3f , -0x40 , 0x41 , 0x42 , 0x43 , -0x44 , 0x45 , 0x46 , 0x47 , -0x48 , 0x49 , 0x4a , 0x4b , -0x4c , 0x4d , 0x4e , 0x4f , -0x50 , 0x51 , 0x52 , 0x53 , -0x54 , 0x55 , 0x56 , 0x57 , -0x58 , 0x59 , 0x5a , 0x5b , -0x815f , 0x5d , 0x5e , 0x5f , -0x60 , 0x61 , 0x62 , 0x63 , -0x64 , 0x65 , 0x66 , 0x67 , -0x68 , 0x69 , 0x6a , 0x6b , -0x6c , 0x6d , 0x6e , 0x6f , -0x70 , 0x71 , 0x72 , 0x73 , -0x74 , 0x75 , 0x76 , 0x77 , -0x78 , 0x79 , 0x7a , 0x7b , -0x7c , 0x7d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8191 , 0x8192 , -0x0 , 0x5c , 0x0 , 0x8198 , -0x814e , 0x0 , 0x0 , 0x0 , -0x81ca , 0x0 , 0x0 , 0x0 , -0x818b , 0x817d , 0x0 , 0x0 , -0x814c , 0x0 , 0x81f7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x817e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8180 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x839f , 0x83a0 , 0x83a1 , -0x83a2 , 0x83a3 , 0x83a4 , 0x83a5 , -0x83a6 , 0x83a7 , 0x83a8 , 0x83a9 , -0x83aa , 0x83ab , 0x83ac , 0x83ad , -0x83ae , 0x83af , 0x0 , 0x83b0 , -0x83b1 , 0x83b2 , 0x83b3 , 0x83b4 , -0x83b5 , 0x83b6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x83bf , 0x83c0 , 0x83c1 , -0x83c2 , 0x83c3 , 0x83c4 , 0x83c5 , -0x83c6 , 0x83c7 , 0x83c8 , 0x83c9 , -0x83ca , 0x83cb , 0x83cc , 0x83cd , -0x83ce , 0x83cf , 0x0 , 0x83d0 , -0x83d1 , 0x83d2 , 0x83d3 , 0x83d4 , -0x83d5 , 0x83d6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8446 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8440 , 0x8441 , 0x8442 , 0x8443 , -0x8444 , 0x8445 , 0x8447 , 0x8448 , -0x8449 , 0x844a , 0x844b , 0x844c , -0x844d , 0x844e , 0x844f , 0x8450 , -0x8451 , 0x8452 , 0x8453 , 0x8454 , -0x8455 , 0x8456 , 0x8457 , 0x8458 , -0x8459 , 0x845a , 0x845b , 0x845c , -0x845d , 0x845e , 0x845f , 0x8460 , -0x8470 , 0x8471 , 0x8472 , 0x8473 , -0x8474 , 0x8475 , 0x8477 , 0x8478 , -0x8479 , 0x847a , 0x847b , 0x847c , -0x847d , 0x847e , 0x8480 , 0x8481 , -0x8482 , 0x8483 , 0x8484 , 0x8485 , -0x8486 , 0x8487 , 0x8488 , 0x8489 , -0x848a , 0x848b , 0x848c , 0x848d , -0x848e , 0x848f , 0x8490 , 0x8491 , -0x0 , 0x8476 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x815d , 0x0 , 0x0 , 0x0 , -0x0 , 0x815c , 0x8161 , 0x0 , -0x8165 , 0x8166 , 0x0 , 0x0 , -0x8167 , 0x8168 , 0x0 , 0x0 , -0x81f5 , 0x81f6 , 0x0 , 0x0 , -0x0 , 0x8164 , 0x8163 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x81f1 , 0x0 , 0x818c , 0x818d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x81a6 , -0x0 , 0x0 , 0x7e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x818e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x81f0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x81a9 , 0x81aa , 0x81a8 , 0x81ab , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x81cb , 0x0 , -0x81cc , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x81cd , 0x0 , 0x81dd , 0x81ce , -0x0 , 0x0 , 0x0 , 0x81de , -0x81b8 , 0x0 , 0x0 , 0x81b9 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x817c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x81e3 , 0x0 , -0x0 , 0x81e5 , 0x8187 , 0x0 , -0x81da , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x81c8 , -0x81c9 , 0x81bf , 0x81be , 0x81e7 , -0x81e8 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8188 , 0x81e6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x81e4 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x81e0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8182 , 0x81df , 0x0 , 0x0 , -0x0 , 0x0 , 0x8185 , 0x8186 , -0x0 , 0x0 , 0x81e1 , 0x81e2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x81bc , 0x81bd , -0x0 , 0x0 , 0x81ba , 0x81bb , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x81db , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x81dc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x849f , 0x84aa , 0x84a0 , 0x84ab , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x84a1 , 0x0 , 0x0 , 0x84ac , -0x84a2 , 0x0 , 0x0 , 0x84ad , -0x84a4 , 0x0 , 0x0 , 0x84af , -0x84a3 , 0x0 , 0x0 , 0x84ae , -0x84a5 , 0x84ba , 0x0 , 0x0 , -0x84b5 , 0x0 , 0x0 , 0x84b0 , -0x84a7 , 0x84bc , 0x0 , 0x0 , -0x84b7 , 0x0 , 0x0 , 0x84b2 , -0x84a6 , 0x0 , 0x0 , 0x84b6 , -0x84bb , 0x0 , 0x0 , 0x84b1 , -0x84a8 , 0x0 , 0x0 , 0x84b8 , -0x84bd , 0x0 , 0x0 , 0x84b3 , -0x84a9 , 0x0 , 0x0 , 0x84b9 , -0x0 , 0x0 , 0x84be , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x84b4 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x81a1 , 0x81a0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x81a3 , 0x81a2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x81a5 , 0x81a4 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x819f , 0x819e , -0x0 , 0x0 , 0x0 , 0x819b , -0x0 , 0x0 , 0x819d , 0x819c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x81fc , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x819a , 0x8199 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x818a , 0x0 , 0x8189 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x81f4 , 0x0 , -0x0 , 0x81f3 , 0x0 , 0x81f2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8140 , 0x8141 , 0x8142 , 0x8156 , -0x0 , 0x8158 , 0x8159 , 0x815a , -0x8171 , 0x8172 , 0x8173 , 0x8174 , -0x8175 , 0x8176 , 0x8177 , 0x8178 , -0x8179 , 0x817a , 0x81a7 , 0x81ac , -0x816b , 0x816c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8160 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x829f , 0x82a0 , 0x82a1 , -0x82a2 , 0x82a3 , 0x82a4 , 0x82a5 , -0x82a6 , 0x82a7 , 0x82a8 , 0x82a9 , -0x82aa , 0x82ab , 0x82ac , 0x82ad , -0x82ae , 0x82af , 0x82b0 , 0x82b1 , -0x82b2 , 0x82b3 , 0x82b4 , 0x82b5 , -0x82b6 , 0x82b7 , 0x82b8 , 0x82b9 , -0x82ba , 0x82bb , 0x82bc , 0x82bd , -0x82be , 0x82bf , 0x82c0 , 0x82c1 , -0x82c2 , 0x82c3 , 0x82c4 , 0x82c5 , -0x82c6 , 0x82c7 , 0x82c8 , 0x82c9 , -0x82ca , 0x82cb , 0x82cc , 0x82cd , -0x82ce , 0x82cf , 0x82d0 , 0x82d1 , -0x82d2 , 0x82d3 , 0x82d4 , 0x82d5 , -0x82d6 , 0x82d7 , 0x82d8 , 0x82d9 , -0x82da , 0x82db , 0x82dc , 0x82dd , -0x82de , 0x82df , 0x82e0 , 0x82e1 , -0x82e2 , 0x82e3 , 0x82e4 , 0x82e5 , -0x82e6 , 0x82e7 , 0x82e8 , 0x82e9 , -0x82ea , 0x82eb , 0x82ec , 0x82ed , -0x82ee , 0x82ef , 0x82f0 , 0x82f1 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x814a , -0x814b , 0x8154 , 0x8155 , 0x0 , -0x0 , 0x8340 , 0x8341 , 0x8342 , -0x8343 , 0x8344 , 0x8345 , 0x8346 , -0x8347 , 0x8348 , 0x8349 , 0x834a , -0x834b , 0x834c , 0x834d , 0x834e , -0x834f , 0x8350 , 0x8351 , 0x8352 , -0x8353 , 0x8354 , 0x8355 , 0x8356 , -0x8357 , 0x8358 , 0x8359 , 0x835a , -0x835b , 0x835c , 0x835d , 0x835e , -0x835f , 0x8360 , 0x8361 , 0x8362 , -0x8363 , 0x8364 , 0x8365 , 0x8366 , -0x8367 , 0x8368 , 0x8369 , 0x836a , -0x836b , 0x836c , 0x836d , 0x836e , -0x836f , 0x8370 , 0x8371 , 0x8372 , -0x8373 , 0x8374 , 0x8375 , 0x8376 , -0x8377 , 0x8378 , 0x8379 , 0x837a , -0x837b , 0x837c , 0x837d , 0x837e , -0x8380 , 0x8381 , 0x8382 , 0x8383 , -0x8384 , 0x8385 , 0x8386 , 0x8387 , -0x8388 , 0x8389 , 0x838a , 0x838b , -0x838c , 0x838d , 0x838e , 0x838f , -0x8390 , 0x8391 , 0x8392 , 0x8393 , -0x8394 , 0x8395 , 0x8396 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8145 , -0x815b , 0x8152 , 0x8153 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x88ea , 0x929a , 0x0 , 0x8eb5 , -0x0 , 0x0 , 0x0 , 0x969c , -0x8fe4 , 0x8e4f , 0x8fe3 , 0x89ba , -0x0 , 0x9573 , 0x975e , 0x0 , -0x98a0 , 0x894e , 0x0 , 0x0 , -0x8a8e , 0x98a1 , 0x90a2 , 0x99c0 , -0x8b75 , 0x95b8 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8fe5 , 0x0 , -0x0 , 0x97bc , 0x0 , 0x0 , -0x0 , 0x0 , 0x95c0 , 0x0 , -0x0 , 0x0 , 0x98a2 , 0x0 , -0x0 , 0x9286 , 0x0 , 0x0 , -0x0 , 0x98a3 , 0x8bf8 , 0x0 , -0x0 , 0x0 , 0x98a4 , 0x0 , -0x8adb , 0x924f , 0x0 , 0x8ee5 , -0x98a5 , 0x0 , 0x0 , 0x98a6 , -0x0 , 0x0 , 0x98a7 , 0x9454 , -0x0 , 0x8b76 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9456 , -0x0 , 0x93e1 , 0x8cc1 , 0x9652 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe568 , 0x98a8 , 0x8fe6 , -0x98a9 , 0x89b3 , 0x0 , 0x0 , -0x0 , 0x8be3 , 0x8cee , 0x96e7 , -0x0 , 0x0 , 0x9ba4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9790 , 0x0 , 0x93fb , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8aa3 , 0x0 , -0x8b54 , 0x0 , 0x98aa , 0x0 , -0x0 , 0x98ab , 0x97b9 , 0x0 , -0x975c , 0x9188 , 0x98ad , 0x8e96 , -0x93f1 , 0x0 , 0x98b0 , 0x0 , -0x0 , 0x895d , 0x8cdd , 0x0 , -0x8cdc , 0x88e4 , 0x0 , 0x0 , -0x986a , 0x9869 , 0x0 , 0x8db1 , -0x889f , 0x0 , 0x98b1 , 0x98b2 , -0x98b3 , 0x9653 , 0x98b4 , 0x0 , -0x8cf0 , 0x88e5 , 0x9692 , 0x0 , -0x8b9c , 0x0 , 0x0 , 0x8b9d , -0x8b9e , 0x92e0 , 0x97ba , 0x0 , -0x98b5 , 0x0 , 0x0 , 0x98b6 , -0x0 , 0x0 , 0x98b7 , 0x0 , -0x0 , 0x0 , 0x906c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8f59 , 0x906d , 0x98bc , 0x0 , -0x98ba , 0x0 , 0x98bb , 0x8b77 , -0x0 , 0x0 , 0x8da1 , 0x89ee , -0x0 , 0x98b9 , 0x98b8 , 0x95a7 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8e65 , 0x8e64 , 0x91bc , 0x98bd , -0x9574 , 0x90e5 , 0x0 , 0x0 , -0x0 , 0x8157 , 0x98be , 0x98c0 , -0x0 , 0x0 , 0x0 , 0x91e3 , -0x97df , 0x88c8 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x98bf , 0x89bc , 0x0 , -0x8bc2 , 0x0 , 0x9287 , 0x0 , -0x0 , 0x0 , 0x8c8f , 0x98c1 , -0x0 , 0x0 , 0x0 , 0x9443 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8ae9 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x98c2 , 0x88c9 , 0x0 , -0x0 , 0x8cde , 0x8aea , 0x959a , -0x94b0 , 0x8b78 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x89ef , 0x0 , -0x98e5 , 0x9360 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x948c , -0x98c4 , 0x0 , 0x0 , 0x0 , -0x94ba , 0x0 , 0x97e0 , 0x0 , -0x904c , 0x0 , 0x8e66 , 0x0 , -0x8e97 , 0x89be , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x92cf , -0x0 , 0x0 , 0x9241 , 0x98c8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x88ca , 0x92e1 , 0x8f5a , -0x8db2 , 0x9743 , 0x0 , 0x91cc , -0x0 , 0x89bd , 0x0 , 0x98c7 , -0x0 , 0x975d , 0x98c3 , 0x98c5 , -0x8dec , 0x98c6 , 0x9b43 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x98ce , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x98d1 , -0x98cf , 0x0 , 0x0 , 0x89c0 , -0x0 , 0x95b9 , 0x98c9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x98cd , -0x8cf1 , 0x0 , 0x0 , 0x8e67 , -0x0 , 0x0 , 0x0 , 0x8aa4 , -0x0 , 0x0 , 0x98d2 , 0x0 , -0x98ca , 0x0 , 0x0 , 0x97e1 , -0x0 , 0x8e98 , 0x0 , 0x98cb , -0x0 , 0x98d0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x98d3 , 0x0 , -0x98cc , 0x0 , 0x0 , 0x8b9f , -0x0 , 0x88cb , 0x0 , 0x0 , -0x8ba0 , 0x89bf , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9b44 , -0x0 , 0x9699 , 0x958e , 0x8cf2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x904e , 0x97b5 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x95d6 , -0x0 , 0x0 , 0x8c57 , 0x91a3 , -0x89e2 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8f72 , 0x0 , -0x0 , 0x0 , 0x98d7 , 0x0 , -0x98dc , 0x98da , 0x0 , 0x0 , -0x98d5 , 0x0 , 0x0 , 0x91ad , -0x98d8 , 0x0 , 0x98db , 0x98d9 , -0x0 , 0x95db , 0x0 , 0x98d6 , -0x0 , 0x904d , 0x0 , 0x9693 , -0x98dd , 0x98de , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8f43 , 0x98eb , -0x0 , 0x0 , 0x0 , 0x946f , -0x0 , 0x9555 , 0x98e6 , 0x0 , -0x95ee , 0x0 , 0x89b4 , 0x0 , -0x0 , 0x0 , 0x98ea , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x98e4 , 0x98ed , 0x0 , -0x0 , 0x9171 , 0x0 , 0x8cc2 , -0x0 , 0x947b , 0x0 , 0xe0c5 , -0x0 , 0x98ec , 0x937c , 0x0 , -0x98e1 , 0x0 , 0x8cf4 , 0x0 , -0x0 , 0x8cf3 , 0x98df , 0x0 , -0x0 , 0x0 , 0x0 , 0x8ed8 , -0x0 , 0x98e7 , 0x0 , 0x95ed , -0x926c , 0x98e3 , 0x8c91 , 0x0 , -0x98e0 , 0x98e8 , 0x98e2 , 0x97cf , -0x98e9 , 0x9860 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8be4 , 0x0 , -0x0 , 0x8c90 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x98ee , -0x0 , 0x0 , 0x0 , 0x98ef , -0x98f3 , 0x88cc , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x95ce , -0x98f2 , 0x0 , 0x0 , 0x0 , -0x0 , 0x98f1 , 0x98f5 , 0x0 , -0x0 , 0x0 , 0x98f4 , 0x0 , -0x92e2 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8c92 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x98f6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8ec3 , 0x0 , -0x91a4 , 0x92e3 , 0x8bf4 , 0x0 , -0x98f7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8b55 , 0x0 , 0x0 , -0x98f8 , 0x0 , 0x0 , 0x0 , -0x0 , 0x98fa , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9654 , 0x0 , 0x0 , -0x0 , 0x8c86 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8e50 , 0x94f5 , 0x98f9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8dc3 , 0x9762 , 0x0 , 0x0 , -0x0 , 0x0 , 0x98fc , 0x9942 , -0x98fb , 0x8dc2 , 0x0 , 0x8f9d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8c58 , 0x0 , -0x0 , 0x0 , 0x9943 , 0x0 , -0x0 , 0x8bcd , 0x0 , 0x0 , -0x0 , 0x9940 , 0x9941 , 0x0 , -0x0 , 0x93ad , 0x0 , 0x919c , -0x0 , 0x8ba1 , 0x0 , 0x0 , -0x0 , 0x966c , 0x9944 , 0x0 , -0x0 , 0x0 , 0x97bb , 0x0 , -0x0 , 0x0 , 0x9945 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9948 , -0x0 , 0x9946 , 0x0 , 0x916d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9947 , 0x9949 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x994b , 0x0 , 0x0 , -0x0 , 0x994a , 0x0 , 0x95c6 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8b56 , 0x994d , 0x994e , 0x0 , -0x89ad , 0x0 , 0x0 , 0x0 , -0x0 , 0x994c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8ef2 , 0x0 , -0x9951 , 0x9950 , 0x994f , 0x0 , -0x98d4 , 0x0 , 0x9952 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8f9e , -0x0 , 0x9953 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9744 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x96d7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9955 , -0x0 , 0x0 , 0x9954 , 0x9957 , -0x9956 , 0x0 , 0x0 , 0x9958 , -0x9959 , 0x88f2 , 0x0 , 0x8cb3 , -0x8c5a , 0x8f5b , 0x929b , 0x8ba2 , -0x90e6 , 0x8cf5 , 0x0 , 0x8d8e , -0x995b , 0x96c6 , 0x9365 , 0x0 , -0x8e99 , 0x0 , 0x995a , 0x0 , -0x995c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x937d , 0x0 , -0x8a95 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x995d , 0x0 , -0x0 , 0x93fc , 0x0 , 0x0 , -0x9153 , 0x995f , 0x9960 , 0x94aa , -0x8cf6 , 0x985a , 0x9961 , 0x0 , -0x0 , 0x8ba4 , 0x0 , 0x0 , -0x0 , 0x95ba , 0x91b4 , 0x8bef , -0x9354 , 0x0 , 0x0 , 0x0 , -0x8c93 , 0x0 , 0x0 , 0x0 , -0x9962 , 0x0 , 0x9963 , 0x0 , -0x0 , 0x93e0 , 0x897e , 0x0 , -0x0 , 0x9966 , 0x8dfb , 0x0 , -0x9965 , 0x8dc4 , 0x0 , 0x9967 , -0xe3ec , 0x9968 , 0x9660 , 0x9969 , -0x0 , 0x996a , 0x996b , 0x8fe7 , -0x0 , 0x8eca , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8aa5 , 0x0 , 0x996e , 0x0 , -0x996c , 0x96bb , 0x996d , 0x0 , -0x9579 , 0x996f , 0x9970 , 0x9971 , -0x937e , 0x0 , 0x0 , 0x0 , -0x9975 , 0x9973 , 0x9974 , 0x9972 , -0x8de1 , 0x9976 , 0x96e8 , 0x97e2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9977 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x90a6 , 0x9978 , 0x8f79 , 0x0 , -0x0 , 0x9979 , 0x0 , 0x929c , -0x97bd , 0x9380 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x99c3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x997a , -0xeaa3 , 0x8bc3 , 0x0 , 0x0 , -0x997b , 0x967d , 0x0 , 0x0 , -0x0 , 0x0 , 0x8f88 , 0x91fa , -0x0 , 0x997d , 0x93e2 , 0x0 , -0x0 , 0x997e , 0x0 , 0x0 , -0x9980 , 0x8a4d , 0x0 , 0x0 , -0x0 , 0x9981 , 0x8ba5 , 0x0 , -0x93ca , 0x899a , 0x8f6f , 0x0 , -0x0 , 0x949f , 0x9982 , 0x0 , -0x9381 , 0x0 , 0x0 , 0x906e , -0x9983 , 0x0 , 0x95aa , 0x90d8 , -0x8aa0 , 0x0 , 0x8aa7 , 0x9984 , -0x0 , 0x0 , 0x9986 , 0x0 , -0x0 , 0x8c59 , 0x0 , 0x0 , -0x9985 , 0x0 , 0x0 , 0x97f1 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8f89 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x94bb , 0x95ca , 0x0 , 0x9987 , -0x0 , 0x9798 , 0x9988 , 0x0 , -0x0 , 0x0 , 0x9989 , 0x0 , -0x939e , 0x0 , 0x0 , 0x998a , -0x0 , 0x0 , 0x90a7 , 0x8dfc , -0x8c94 , 0x998b , 0x8e68 , 0x8d8f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x92e4 , -0x998d , 0x0 , 0x0 , 0x91a5 , -0x0 , 0x0 , 0x8ded , 0x998e , -0x998f , 0x914f , 0x0 , 0x998c , -0x0 , 0x0 , 0x0 , 0x0 , -0x9991 , 0x0 , 0x9655 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8d84 , -0x0 , 0x0 , 0x9990 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8c95 , -0x8ddc , 0x948d , 0x0 , 0x0 , -0x0 , 0x9994 , 0x9992 , 0x0 , -0x0 , 0x0 , 0x0 , 0x959b , -0x8fe8 , 0x999b , 0x8a84 , 0x9995 , -0x9993 , 0x916e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9997 , 0x0 , 0x9996 , -0x0 , 0x0 , 0x0 , 0x8a63 , -0x0 , 0x0 , 0x0 , 0x8c80 , -0x999c , 0x97ab , 0x0 , 0x0 , -0x0 , 0x9998 , 0x0 , 0x0 , -0x0 , 0x999d , 0x999a , 0x0 , -0x9999 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x97cd , -0x0 , 0x0 , 0x0 , 0x8cf7 , -0x89c1 , 0x0 , 0x0 , 0x97f2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8f95 , 0x9377 , 0x8d85 , -0x99a0 , 0x99a1 , 0x0 , 0x0 , -0x0 , 0x97e3 , 0x0 , 0x0 , -0x984a , 0x99a3 , 0x0 , 0x0 , -0x0 , 0x8cf8 , 0x0 , 0x0 , -0x99a2 , 0x0 , 0x8a4e , 0x0 , -0x0 , 0x99a4 , 0x0 , 0x9675 , -0x0 , 0x92ba , 0x0 , 0x9745 , -0x0 , 0x95d7 , 0x0 , 0x0 , -0x0 , 0x99a5 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe8d3 , 0x0 , -0x0 , 0x93ae , 0x0 , 0x99a6 , -0x8aa8 , 0x96b1 , 0x0 , 0x0 , -0x0 , 0x8f9f , 0x99a7 , 0x95e5 , -0x99ab , 0x0 , 0x90a8 , 0x99a8 , -0x8bce , 0x0 , 0x99a9 , 0x8aa9 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8c4d , 0x99ac , -0x0 , 0x99ad , 0x0 , 0x0 , -0x99ae , 0x99af , 0x8ed9 , 0x0 , -0x0 , 0x0 , 0x8cf9 , 0x96dc , -0x0 , 0x96e6 , 0x93f5 , 0x0 , -0x0 , 0x95ef , 0x99b0 , 0x0 , -0x99b1 , 0x0 , 0x0 , 0x0 , -0x0 , 0x99b3 , 0x0 , 0x99b5 , -0x99b4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x99b6 , 0x89bb , 0x966b , -0x0 , 0x8dfa , 0x99b7 , 0x0 , -0x0 , 0x9178 , 0x0 , 0x0 , -0x8fa0 , 0x8ba7 , 0x0 , 0x99b8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x94d9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x99b9 , -0x0 , 0x99ba , 0x0 , 0x99bb , -0x0 , 0x0 , 0x0 , 0x0 , -0x99bc , 0x9543 , 0x8be6 , 0x88e3 , -0x0 , 0x0 , 0x0 , 0x93bd , -0x99bd , 0x8f5c , 0x0 , 0x90e7 , -0x0 , 0x99bf , 0x99be , 0x8fa1 , -0x8cdf , 0x99c1 , 0x94bc , 0x0 , -0x0 , 0x99c2 , 0x0 , 0x0 , -0x0 , 0x94da , 0x91b2 , 0x91ec , -0x8ba6 , 0x0 , 0x0 , 0x93ec , -0x9250 , 0x0 , 0x948e , 0x0 , -0x966d , 0x0 , 0x99c4 , 0x0 , -0x90e8 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8c54 , 0x0 , -0x0 , 0x99c5 , 0x0 , 0x0 , -0x0 , 0x0 , 0x99c6 , 0x894b , -0x88f3 , 0x8aeb , 0x0 , 0x91a6 , -0x8b70 , 0x9791 , 0x0 , 0x99c9 , -0x89b5 , 0x0 , 0x0 , 0x99c8 , -0x0 , 0x0 , 0x0 , 0x8ba8 , -0x0 , 0x0 , 0x99ca , 0x0 , -0x96ef , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x99cb , 0x0 , -0x97d0 , 0x0 , 0x8cfa , 0x0 , -0x0 , 0x0 , 0x0 , 0x8cb4 , -0x99cc , 0x0 , 0x0 , 0x0 , -0x0 , 0x99ce , 0x99cd , 0x0 , -0x907e , 0x8958 , 0x0 , 0x0 , -0x0 , 0x897d , 0x99cf , 0x0 , -0x99d0 , 0x0 , 0x0 , 0x8cb5 , -0x0 , 0x0 , 0x99d1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8b8e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8e51 , 0x99d2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9694 , 0x8db3 , 0x8b79 , 0x9746 , -0x916f , 0x94bd , 0x8efb , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8f66 , 0x0 , 0x8ee6 , 0x8ef3 , -0x0 , 0x8f96 , 0x0 , 0x94be , -0x0 , 0x0 , 0x0 , 0x99d5 , -0x0 , 0x8962 , 0x9170 , 0x8cfb , -0x8cc3 , 0x8be5 , 0x0 , 0x0 , -0x99d9 , 0x9240 , 0x91fc , 0x8ba9 , -0x8fa2 , 0x99da , 0x99d8 , 0x89c2 , -0x91e4 , 0x8eb6 , 0x8e6a , 0x8945 , -0x0 , 0x0 , 0x8a90 , 0x8d86 , -0x8e69 , 0x0 , 0x99db , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x99dc , 0x0 , 0x8b68 , -0x8a65 , 0x0 , 0x0 , 0x0 , -0x8d87 , 0x8b67 , 0x92dd , 0x8944 , -0x93af , 0x96bc , 0x8d40 , 0x9799 , -0x9366 , 0x8cfc , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8c4e , -0x0 , 0x99e5 , 0x0 , 0x8be1 , -0x9669 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x94db , 0x0 , -0x0 , 0x99e4 , 0x0 , 0x8adc , -0x99df , 0x99e0 , 0x99e2 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x99e3 , 0x0 , -0x8b7a , 0x9081 , 0x0 , 0x95ab , -0x99e1 , 0x99dd , 0x8ce1 , 0x0 , -0x99de , 0x0 , 0x9843 , 0x0 , -0x0 , 0x0 , 0x95f0 , 0x0 , -0x92e6 , 0x8ce0 , 0x8d90 , 0x0 , -0x0 , 0x0 , 0x99e6 , 0x0 , -0x0 , 0x93db , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x99ea , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8efc , 0x0 , 0x8ef4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x99ed , 0x99eb , 0x0 , 0x96a1 , -0x0 , 0x99e8 , 0x99f1 , 0x99ec , -0x0 , 0x0 , 0x0 , 0x99ef , -0x8cc4 , 0x96bd , 0x0 , 0x0 , -0x99f0 , 0x0 , 0x0 , 0x0 , -0x99f2 , 0x0 , 0x99f4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8dee , -0x9861 , 0x0 , 0x99e9 , 0x99e7 , -0x99f3 , 0x0 , 0x99ee , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x99f6 , 0x0 , -0x9a42 , 0x99f8 , 0x0 , 0x0 , -0x99fc , 0x0 , 0x0 , 0x9a40 , -0x99f9 , 0x0 , 0x0 , 0x9a5d , -0x0 , 0x0 , 0x8de7 , 0x8a50 , -0x0 , 0x0 , 0x0 , 0x0 , -0x99f7 , 0x0 , 0x0 , 0x0 , -0x9a44 , 0x88f4 , 0x9a43 , 0x0 , -0x88a3 , 0x9569 , 0x9a41 , 0x0 , -0x99fa , 0x0 , 0x0 , 0x99f5 , -0x99fb , 0x8dc6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a45 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x88f5 , 0x9a4e , 0x0 , -0x0 , 0x9a46 , 0x9a47 , 0x0 , -0x8fa3 , 0x9689 , 0x0 , 0x0 , -0x0 , 0x9a4c , 0x9a4b , 0x0 , -0x0 , 0x0 , 0x934e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9a4d , 0x0 , -0x0 , 0x9a4a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8953 , 0x0 , 0x8db4 , 0x904f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9a48 , -0x9382 , 0x0 , 0x0 , 0x0 , -0x9a49 , 0x0 , 0x88a0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9a53 , 0x9742 , -0x0 , 0x8fa5 , 0x0 , 0x9a59 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a58 , 0x9a4f , 0x0 , 0x0 , -0x0 , 0x0 , 0x91c1 , 0x0 , -0x9a50 , 0x0 , 0x0 , 0x0 , -0x91ed , 0x9a55 , 0x8fa4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a52 , 0x0 , 0x0 , 0x96e2 , -0x0 , 0x0 , 0x0 , 0x8c5b , -0x0 , 0x0 , 0x9a56 , 0x9a57 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a54 , 0x9a5a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9a51 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9a60 , -0x9a65 , 0x0 , 0x9a61 , 0x0 , -0x9a5c , 0x0 , 0x0 , 0x9a66 , -0x9150 , 0x0 , 0x0 , 0x9a68 , -0x0 , 0x8d41 , 0x9a5e , 0x929d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a62 , 0x9a5b , 0x8aab , 0x0 , -0x8aec , 0x8a85 , 0x9a63 , 0x9a5f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8c96 , -0x9a69 , 0x9a67 , 0x9172 , 0x8b69 , -0x8baa , 0x0 , 0x9a64 , 0x0 , -0x8bf2 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8963 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a6d , 0x9a6b , 0x0 , 0x9aa5 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a70 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9a6a , 0x0 , -0x9a6e , 0x0 , 0x0 , 0x9a6c , -0x0 , 0x0 , 0x0 , 0x8e6b , -0x9a6f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9a72 , -0x0 , 0x9a77 , 0x0 , 0x0 , -0x0 , 0x9a75 , 0x9a74 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9251 , 0x0 , -0x0 , 0x89c3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a71 , 0x0 , 0x9a73 , 0x8fa6 , -0x8952 , 0x0 , 0x0 , 0x9a76 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x89dc , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9a82 , -0x0 , 0x8ffa , 0x9a7d , 0x0 , -0x9a7b , 0x0 , 0x9a7c , 0x0 , -0x9a7e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x895c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9158 , 0x0 , 0x9a78 , 0x0 , -0x9a79 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8a9a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a81 , 0x0 , 0x0 , 0x0 , -0x8aed , 0x0 , 0x9a84 , 0x9a80 , -0x9a83 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x95ac , 0x0 , 0x0 , 0x0 , -0x93d3 , 0x0 , 0x94b6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a86 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9a85 , 0x8a64 , -0x0 , 0x0 , 0x9a87 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9a8a , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a89 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a88 , 0x0 , 0x9458 , 0x0 , -0x0 , 0x9a8b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9a8c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a8e , 0x0 , 0x9a8d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a90 , 0x0 , 0x0 , 0x0 , -0x9a93 , 0x9a91 , 0x9a8f , 0x9a92 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9a94 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9a95 , 0x0 , -0x0 , 0x9a96 , 0x0 , 0x9a97 , -0x0 , 0x0 , 0x0 , 0x9a98 , -0x9964 , 0x0 , 0x8efa , 0x8e6c , -0x0 , 0x0 , 0x89f1 , 0x0 , -0x88f6 , 0x0 , 0x0 , 0x9263 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9a99 , 0x0 , -0x8da2 , 0x0 , 0x88cd , 0x907d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9a9a , 0x8cc5 , 0x0 , -0x0 , 0x8d91 , 0x0 , 0x9a9c , -0x9a9b , 0x0 , 0x0 , 0x95de , -0x9a9d , 0x0 , 0x0 , 0x0 , -0x9a9f , 0x9a9e , 0x0 , 0x9aa0 , -0x0 , 0x9aa1 , 0x0 , 0x8c97 , -0x0 , 0x0 , 0x8980 , 0x9aa2 , -0x0 , 0x0 , 0x9aa4 , 0x0 , -0x9aa3 , 0x0 , 0x0 , 0x0 , -0x9aa6 , 0x0 , 0x0 , 0x9379 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9aa7 , 0x88b3 , -0x8ddd , 0x0 , 0x0 , 0x0 , -0x0 , 0x8c5c , 0x0 , 0x0 , -0x926e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9aa8 , -0x9aa9 , 0x0 , 0x0 , 0x9aab , -0x0 , 0x0 , 0x0 , 0x0 , -0x9aac , 0x0 , 0x8de2 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8bcf , -0x0 , 0x0 , 0x9656 , 0x0 , -0x0 , 0x0 , 0x9aaa , 0x9aad , -0x8dbf , 0x8d42 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9ab1 , 0x0 , 0x0 , -0x8da3 , 0x0 , 0x9252 , 0x0 , -0x0 , 0x9aae , 0x92d8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9ab2 , -0x0 , 0x0 , 0x9082 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9ab0 , 0x9ab3 , 0x0 , 0x8c5e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9ab4 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9ab5 , 0x0 , 0x8d43 , 0x8a5f , -0x9ab7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9ab8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9ab9 , 0x0 , 0x0 , 0x9ab6 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9aaf , 0x0 , 0x0 , 0x9aba , -0x0 , 0x0 , 0x9abb , 0x0 , -0x0 , 0x0 , 0x0 , 0x9684 , -0x0 , 0x0 , 0x8fe9 , 0x0 , -0x0 , 0x0 , 0x9abd , 0x9abe , -0x9abc , 0x0 , 0x9ac0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9457 , 0x0 , 0x0 , 0x88e6 , -0x9575 , 0x0 , 0x0 , 0x9ac1 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8ffb , 0x0 , 0x0 , 0x8eb7 , -0x0 , 0x947c , 0x8aee , 0x0 , -0x8de9 , 0x0 , 0x0 , 0x0 , -0x9678 , 0x0 , 0x93b0 , 0x0 , -0x0 , 0x8c98 , 0x91cd , 0x0 , -0x0 , 0x0 , 0x9abf , 0x9ac2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x91c2 , 0x0 , 0x0 , -0x0 , 0x9ac3 , 0x0 , 0x0 , -0x0 , 0x9ac4 , 0x0 , 0x0 , -0x0 , 0x9ac6 , 0x0 , 0x0 , -0x92e7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8aac , 0x0 , -0x0 , 0x0 , 0x0 , 0xea9f , -0x8981 , 0x95f1 , 0x0 , 0x0 , -0x8fea , 0x9367 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8de4 , 0x0 , -0x0 , 0x9acc , 0x0 , 0x0 , -0x95bb , 0x97db , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x89f2 , 0x9ac8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9159 , 0x9acb , 0x0 , -0x9383 , 0x0 , 0x0 , 0x9368 , -0x9384 , 0x94b7 , 0x92cb , 0x0 , -0x0 , 0x0 , 0x8dc7 , 0x0 , -0x0 , 0x0 , 0x9ac7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8996 , 0x0 , 0x9355 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9ac9 , 0x0 , 0x9ac5 , 0x0 , -0x0 , 0x906f , 0x0 , 0x0 , -0x0 , 0x9acd , 0x0 , 0x0 , -0x0 , 0x0 , 0x8f6d , 0x0 , -0x0 , 0x0 , 0x0 , 0x8bab , -0x0 , 0x9ace , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x95e6 , -0x0 , 0x0 , 0x0 , 0x919d , -0x0 , 0x0 , 0x0 , 0x0 , -0x92c4 , 0x0 , 0x0 , 0x9ad0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x966e , 0x0 , 0x0 , 0x9ad1 , -0x0 , 0x0 , 0x9ad6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x95ad , -0x0 , 0x0 , 0x0 , 0x0 , -0x9ad5 , 0x9acf , 0x9ad2 , 0x9ad4 , -0x0 , 0x0 , 0x8da4 , 0x0 , -0x0 , 0x95c7 , 0x0 , 0x0 , -0x0 , 0x9ad7 , 0x0 , 0x9264 , -0x0 , 0x0 , 0x89f3 , 0x0 , -0x8feb , 0x0 , 0x0 , 0x0 , -0x0 , 0x9ad9 , 0x0 , 0x9ad8 , -0x0 , 0x8d88 , 0x0 , 0x9ada , -0x9adc , 0x9adb , 0x0 , 0x0 , -0x9ade , 0x0 , 0x9ad3 , 0x9ae0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9adf , 0x9add , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8e6d , -0x9070 , 0x0 , 0x9173 , 0x9ae1 , -0x90ba , 0x88eb , 0x9484 , 0x0 , -0x0 , 0x0 , 0x0 , 0x92d9 , -0x0 , 0x9ae3 , 0x9ae2 , 0x9ae4 , -0x9ae5 , 0x9ae6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9ae7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x95cf , 0x9ae8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x89c4 , -0x9ae9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x975b , 0x8a4f , 0x0 , -0x99c7 , 0x8f67 , 0x91bd , 0x9aea , -0x96e9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x96b2 , 0x0 , -0x0 , 0x9aec , 0x0 , 0x91e5 , -0x0 , 0x9356 , 0x91be , 0x9576 , -0x9aed , 0x9aee , 0x899b , 0x0 , -0x0 , 0x8eb8 , 0x9aef , 0x0 , -0x0 , 0x0 , 0x0 , 0x88ce , -0x9af0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9af1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8982 , 0x0 , 0x0 , 0x8aef , -0x93de , 0x95f2 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9af5 , 0x9174 , -0x9af4 , 0x8c5f , 0x0 , 0x0 , -0x967a , 0x9af3 , 0x0 , 0x9385 , -0x9af7 , 0x0 , 0x9af6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9af9 , 0x0 , 0x9af8 , 0x0 , -0x0 , 0x899c , 0x0 , 0x9afa , -0x8fa7 , 0x9afc , 0x9244 , 0x0 , -0x9afb , 0x0 , 0x95b1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8f97 , -0x937a , 0x0 , 0x0 , 0x0 , -0x9b40 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8d44 , 0x0 , 0x0 , -0x0 , 0x9b41 , 0x9440 , 0x94dc , -0x96cf , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9444 , 0x0 , -0x0 , 0x9b4a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8b57 , -0x0 , 0x0 , 0x9764 , 0x0 , -0x0 , 0x96ad , 0x0 , 0x9baa , -0x0 , 0x9b42 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9b45 , -0x0 , 0x91c3 , 0x0 , 0x0 , -0x9657 , 0x0 , 0x0 , 0x0 , -0x9369 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9b46 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9685 , 0x0 , 0x8dc8 , -0x0 , 0x0 , 0x8fa8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9b47 , 0x0 , -0x0 , 0x8e6f , 0x0 , 0x8e6e , -0x0 , 0x0 , 0x0 , 0x0 , -0x88b7 , 0x8cc6 , 0x0 , 0x90a9 , -0x88cf , 0x0 , 0x0 , 0x0 , -0x0 , 0x9b4b , 0x9b4c , 0x0 , -0x9b49 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8957 , 0x8aad , 0x0 , -0x9b48 , 0x0 , 0x96c3 , 0x9550 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x88a6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x88f7 , -0x0 , 0x0 , 0x0 , 0x8e70 , -0x0 , 0x88d0 , 0x0 , 0x88a1 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9b51 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9b4f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x96ba , 0x0 , 0x9b52 , 0x0 , -0x9b50 , 0x0 , 0x0 , 0x9b4e , -0x9050 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9b4d , 0x0 , 0x0 , -0x0 , 0x95d8 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8ce2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9b56 , 0x9b57 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8fa9 , 0x0 , 0x0 , 0x0 , -0x9b53 , 0x984b , 0x0 , 0x0 , -0x0 , 0x0 , 0x946b , 0x0 , -0x0 , 0x9b55 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8da5 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9b58 , 0x0 , -0x0 , 0x0 , 0x9577 , 0x0 , -0x0 , 0x0 , 0x9b59 , 0x0 , -0x9b54 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x96b9 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x947d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9b5a , 0x9551 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9b5b , 0x9b5f , 0x9b5c , 0x0 , -0x0 , 0x89c5 , 0x9b5e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8eb9 , 0x0 , 0x9b5d , -0x8c99 , 0x0 , 0x0 , 0x0 , -0x9b6b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9b64 , 0x9b61 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9284 , 0x0 , 0x9b60 , -0x0 , 0x0 , 0x9b62 , 0x0 , -0x0 , 0x9b63 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9b65 , 0x9b66 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8af0 , 0x0 , 0x9b68 , -0x9b67 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9b69 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8fec , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9b6c , 0x0 , -0x92da , 0x0 , 0x0 , 0x0 , -0x8964 , 0x0 , 0x9b6a , 0x0 , -0x0 , 0x0 , 0x9b6d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9b6e , 0x0 , -0x9b71 , 0x0 , 0x0 , 0x9b6f , -0x0 , 0x9b70 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8e71 , 0x9b72 , 0x0 , 0x0 , -0x8d45 , 0x9b73 , 0x0 , 0x8e9a , -0x91b6 , 0x0 , 0x9b74 , 0x9b75 , -0x8e79 , 0x8d46 , 0x0 , 0x96d0 , -0x0 , 0x0 , 0x0 , 0x8b47 , -0x8cc7 , 0x9b76 , 0x8a77 , 0x0 , -0x0 , 0x9b77 , 0x0 , 0x91b7 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9b78 , 0x9ba1 , 0x0 , 0x9b79 , -0x0 , 0x9b7a , 0x0 , 0x0 , -0x9b7b , 0x0 , 0x9b7d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9b7e , 0x0 , 0x0 , 0x9b80 , -0x0 , 0x91ee , 0x0 , 0x8946 , -0x8ee7 , 0x88c0 , 0x0 , 0x9176 , -0x8aae , 0x8eb3 , 0x0 , 0x8d47 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9386 , 0x0 , 0x8f40 , -0x8aaf , 0x9288 , 0x92e8 , 0x88b6 , -0x8b58 , 0x95f3 , 0x0 , 0x8ec0 , -0x0 , 0x0 , 0x8b71 , 0x90e9 , -0x8eba , 0x9747 , 0x9b81 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8b7b , 0x0 , -0x8dc9 , 0x0 , 0x0 , 0x8a51 , -0x8983 , 0x8faa , 0x89c6 , 0x0 , -0x9b82 , 0x9765 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8f68 , -0x0 , 0x0 , 0x8ee2 , 0x9b83 , -0x8af1 , 0x93d0 , 0x96a7 , 0x9b84 , -0x0 , 0x9b85 , 0x0 , 0x0 , -0x9578 , 0x0 , 0x0 , 0x0 , -0x9b87 , 0x0 , 0x8aa6 , 0x8bf5 , -0x9b86 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8ab0 , -0x0 , 0x9051 , 0x9b8b , 0x8e40 , -0x0 , 0x89c7 , 0x9b8a , 0x0 , -0x9b88 , 0x9b8c , 0x9b89 , 0x944a , -0x9ecb , 0x9052 , 0x0 , 0x9b8d , -0x0 , 0x0 , 0x97be , 0x0 , -0x9b8e , 0x0 , 0x0 , 0x9b90 , -0x0 , 0x929e , 0x9b8f , 0x0 , -0x90a1 , 0x0 , 0x8e9b , 0x0 , -0x0 , 0x0 , 0x91ce , 0x8ef5 , -0x0 , 0x9595 , 0x90ea , 0x0 , -0x8ecb , 0x9b91 , 0x8fab , 0x9b92 , -0x9b93 , 0x88d1 , 0x91b8 , 0x9071 , -0x0 , 0x9b94 , 0x93b1 , 0x8fac , -0x0 , 0x8fad , 0x0 , 0x9b95 , -0x0 , 0x0 , 0x90eb , 0x0 , -0x0 , 0x0 , 0x8fae , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9b96 , 0x0 , 0x9b97 , 0x0 , -0x96de , 0x0 , 0x0 , 0x0 , -0x9b98 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8bc4 , 0x0 , 0x0 , -0x0 , 0x8f41 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9b99 , 0x9b9a , 0x8eda , 0x904b , -0x93f2 , 0x9073 , 0x94f6 , 0x9441 , -0x8bc7 , 0x9b9b , 0x0 , 0x0 , -0x0 , 0x8b8f , 0x9b9c , 0x0 , -0x8bfc , 0x0 , 0x93cd , 0x89ae , -0x0 , 0x8e72 , 0x9b9d , 0x9ba0 , -0x9b9f , 0x8bfb , 0x0 , 0x9b9e , -0x0 , 0x9357 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x91ae , 0x0 , -0x936a , 0x8ec6 , 0x0 , 0x0 , -0x9177 , 0x979a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9ba2 , 0x0 , 0x9ba3 , 0x93d4 , -0x0 , 0x8e52 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9ba5 , 0x0 , -0x0 , 0x9ba6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9ba7 , 0x0 , 0x0 , 0x0 , -0x8af2 , 0x9ba8 , 0x0 , 0x0 , -0x9ba9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x89aa , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x915a , 0x8ae2 , 0x0 , 0x9bab , -0x96a6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x91d0 , 0x0 , 0x8a78 , -0x0 , 0x0 , 0x9bad , 0x9baf , -0x8add , 0x0 , 0x0 , 0x9bac , -0x9bae , 0x0 , 0x9bb1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9bb0 , 0x0 , 0x9bb2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9bb3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x93bb , 0x8bac , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x89e3 , 0x9bb4 , 0x9bb9 , 0x0 , -0x0 , 0x9bb7 , 0x0 , 0x95f5 , -0x95f4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9387 , 0x0 , -0x0 , 0x0 , 0x9bb6 , 0x8f73 , -0x0 , 0x9bb5 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9092 , -0x0 , 0x0 , 0x0 , 0x9bba , -0x0 , 0x0 , 0x8de8 , 0x0 , -0x0 , 0x9bc0 , 0x0 , 0x0 , -0x9bc1 , 0x9bbb , 0x8a52 , 0x9bbc , -0x9bc5 , 0x9bc4 , 0x9bc3 , 0x9bbf , -0x0 , 0x0 , 0x0 , 0x9bbe , -0x0 , 0x0 , 0x9bc2 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x95f6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9bc9 , -0x9bc6 , 0x0 , 0x9bc8 , 0x0 , -0x9792 , 0x0 , 0x9bc7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9bbd , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9093 , 0x0 , 0x0 , -0x9bca , 0x0 , 0x0 , 0x8db5 , -0x0 , 0x0 , 0x0 , 0x9bcb , -0x0 , 0x0 , 0x9bcc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9bcf , 0x0 , -0x9bce , 0x0 , 0x0 , 0x9bcd , -0x0 , 0x0 , 0x0 , 0x9388 , -0x9bb8 , 0x0 , 0x0 , 0x0 , -0x9bd5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9bd1 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9bd0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9bd2 , 0x0 , 0x9bd3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9bd6 , -0x0 , 0x0 , 0x97e4 , 0x0 , -0x9bd7 , 0x9bd4 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9bd8 , 0x0 , 0x0 , -0x8ade , 0x9bd9 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9bdb , 0x9bda , -0x0 , 0x0 , 0x9bdc , 0x0 , -0x0 , 0x0 , 0x0 , 0x9bdd , -0x0 , 0x90ec , 0x8f42 , 0x0 , -0x0 , 0x8f84 , 0x0 , 0x9183 , -0x0 , 0x8d48 , 0x8db6 , 0x8d49 , -0x8b90 , 0x0 , 0x0 , 0x9bde , -0x0 , 0x0 , 0x8db7 , 0x0 , -0x0 , 0x8cc8 , 0x9bdf , 0x96a4 , -0x9462 , 0x9be0 , 0x0 , 0x8d4a , -0x0 , 0x0 , 0x0 , 0x8aaa , -0x0 , 0x9246 , 0x8bd0 , 0x0 , -0x0 , 0x0 , 0x8e73 , 0x957a , -0x0 , 0x0 , 0x94bf , 0x0 , -0x0 , 0x0 , 0x0 , 0x9be1 , -0x8af3 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9be4 , 0x0 , 0x0 , -0x0 , 0x0 , 0x929f , 0x0 , -0x0 , 0x9be3 , 0x9be2 , 0x9be5 , -0x0 , 0x92e9 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9083 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8e74 , -0x0 , 0x90c8 , 0x0 , 0x91d1 , -0x8b41 , 0x0 , 0x0 , 0x92a0 , -0x0 , 0x0 , 0x9be6 , 0x9be7 , -0x8fed , 0x0 , 0x0 , 0x0 , -0x0 , 0x9658 , 0x0 , 0x0 , -0x9bea , 0x0 , 0x0 , 0x9be9 , -0x9be8 , 0x959d , 0x0 , 0x9bf1 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9679 , 0x0 , 0x9beb , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9bed , 0x968b , 0x0 , 0x9bec , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9bee , -0x0 , 0x94a6 , 0x9bef , 0x95bc , -0x9bf0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8ab1 , 0x95bd , -0x944e , 0x9bf2 , 0x9bf3 , 0x0 , -0x8d4b , 0x8ab2 , 0x9bf4 , 0x8cb6 , -0x9763 , 0x9748 , 0x8af4 , 0x9bf6 , -0x0 , 0x92a1 , 0x0 , 0x8d4c , -0x8faf , 0x0 , 0x0 , 0x94dd , -0x0 , 0x0 , 0x8fb0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8f98 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x92ea , 0x95f7 , 0x9358 , -0x0 , 0x0 , 0x8d4d , 0x0 , -0x957b , 0x0 , 0x0 , 0x0 , -0x9bf7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9378 , 0x8dc0 , -0x0 , 0x0 , 0x0 , 0x8cc9 , -0x0 , 0x92eb , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x88c1 , 0x8f8e , 0x8d4e , -0x9766 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9bf8 , 0x9bf9 , 0x9470 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9bfa , 0x97f5 , 0x984c , 0x0 , -0x0 , 0x0 , 0x0 , 0x9bfc , -0x9bfb , 0x0 , 0x0 , 0x8a66 , -0x0 , 0x0 , 0x9c40 , 0x0 , -0x0 , 0x0 , 0x9c43 , 0x9c44 , -0x0 , 0x9c42 , 0x0 , 0x955f , -0x8fb1 , 0x9c46 , 0x9c45 , 0x9c41 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9c47 , 0x9c48 , 0x0 , 0x0 , -0x9c49 , 0x0 , 0x0 , 0x0 , -0x9c4c , 0x9c4a , 0x0 , 0x9c4b , -0x9c4d , 0x0 , 0x8984 , 0x92ec , -0x9c4e , 0x0 , 0x8c9a , 0x89f4 , -0x9455 , 0x0 , 0x9c4f , 0x93f9 , -0x0 , 0x95d9 , 0x0 , 0x9c50 , -0x984d , 0x0 , 0x0 , 0x0 , -0x0 , 0x9c51 , 0x95be , 0x9c54 , -0x989f , 0x98af , 0x0 , 0x8eae , -0x93f3 , 0x9c55 , 0x0 , 0x8b7c , -0x92a2 , 0x88f8 , 0x9c56 , 0x95a4 , -0x8d4f , 0x0 , 0x0 , 0x926f , -0x0 , 0x0 , 0x0 , 0x92ed , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x96ed , 0x8cb7 , 0x8cca , -0x0 , 0x9c57 , 0x0 , 0x0 , -0x0 , 0x9c58 , 0x0 , 0x9c5e , -0x0 , 0x8ee3 , 0x0 , 0x0 , -0x0 , 0x92a3 , 0x0 , 0x8bad , -0x9c59 , 0x0 , 0x0 , 0x0 , -0x954a , 0x0 , 0x9265 , 0x0 , -0x0 , 0x9c5a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9c5b , 0x0 , 0x8bae , 0x0 , -0x9c5c , 0x0 , 0x9c5d , 0x0 , -0x0 , 0x9c5f , 0x0 , 0x9396 , -0x0 , 0x0 , 0x9c60 , 0x9c61 , -0x0 , 0x9c62 , 0x0 , 0x0 , -0x9c53 , 0x9c52 , 0x0 , 0x0 , -0x0 , 0x9c63 , 0x8c60 , 0x0 , -0x0 , 0x0 , 0x9546 , 0x0 , -0x0 , 0x8dca , 0x9556 , 0x92a4 , -0x956a , 0x9c64 , 0x0 , 0x0 , -0x8fb2 , 0x8965 , 0x0 , 0x9c65 , -0x0 , 0x0 , 0x0 , 0x9c66 , -0x0 , 0x96f0 , 0x0 , 0x0 , -0x94de , 0x0 , 0x0 , 0x9c69 , -0x899d , 0x90aa , 0x9c68 , 0x9c67 , -0x8c61 , 0x91d2 , 0x0 , 0x9c6d , -0x9c6b , 0x0 , 0x9c6a , 0x97a5 , -0x8ce3 , 0x0 , 0x0 , 0x0 , -0x8f99 , 0x9c6c , 0x936b , 0x8f5d , -0x0 , 0x0 , 0x0 , 0x93be , -0x9c70 , 0x9c6f , 0x0 , 0x0 , -0x0 , 0x0 , 0x9c6e , 0x0 , -0x9c71 , 0x8ce4 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9c72 , 0x959c , 0x8f7a , 0x0 , -0x0 , 0x9c73 , 0x94f7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x93bf , -0x92a5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x934f , 0x0 , 0x0 , -0x9c74 , 0x8b4a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9053 , -0x0 , 0x954b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8af5 , 0x9445 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9c75 , 0x8e75 , -0x9659 , 0x965a , 0x0 , 0x0 , -0x899e , 0x9c7a , 0x0 , 0x0 , -0x9289 , 0x0 , 0x0 , 0x0 , -0x9c77 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x89f5 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9cab , 0x9c79 , 0x0 , 0x0 , -0x0 , 0x944f , 0x0 , 0x0 , -0x9c78 , 0x0 , 0x0 , 0x9c76 , -0x0 , 0x8d9a , 0x0 , 0x9c7c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9c83 , 0x9c89 , -0x9c81 , 0x0 , 0x937b , 0x0 , -0x0 , 0x9c86 , 0x957c , 0x0 , -0x0 , 0x9c80 , 0x0 , 0x9c85 , -0x97e5 , 0x8e76 , 0x0 , 0x0 , -0x91d3 , 0x9c7d , 0x0 , 0x0 , -0x0 , 0x8b7d , 0x9c88 , 0x90ab , -0x8985 , 0x9c82 , 0x89f6 , 0x9c87 , -0x0 , 0x0 , 0x0 , 0x8baf , -0x0 , 0x9c84 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9c8a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9c8c , 0x9c96 , 0x9c94 , -0x0 , 0x0 , 0x9c91 , 0x0 , -0x0 , 0x0 , 0x9c90 , 0x97f6 , -0x0 , 0x9c92 , 0x0 , 0x0 , -0x8bb0 , 0x0 , 0x8d50 , 0x0 , -0x0 , 0x8f9a , 0x0 , 0x0 , -0x0 , 0x9c99 , 0x9c8b , 0x0 , -0x0 , 0x0 , 0x0 , 0x9c8f , -0x9c7e , 0x0 , 0x89f8 , 0x9c93 , -0x9c95 , 0x9270 , 0x0 , 0x0 , -0x8da6 , 0x89b6 , 0x9c8d , 0x9c98 , -0x9c97 , 0x8bb1 , 0x0 , 0x91a7 , -0x8a86 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8c62 , 0x0 , 0x9c8e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9c9a , 0x0 , 0x9c9d , -0x9c9f , 0x0 , 0x0 , 0x0 , -0x0 , 0x8ebb , 0x0 , 0x9ca5 , -0x92ee , 0x9c9b , 0x0 , 0x0 , -0x0 , 0x0 , 0x9ca3 , 0x0 , -0x89f7 , 0x0 , 0x9ca1 , 0x9ca2 , -0x0 , 0x0 , 0x9c9e , 0x9ca0 , -0x0 , 0x0 , 0x0 , 0x8ce5 , -0x9749 , 0x0 , 0x0 , 0x8ab3 , -0x0 , 0x0 , 0x8978 , 0x9ca4 , -0x0 , 0x9459 , 0x88ab , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x94df , 0x9c7b , -0x9caa , 0x9cae , 0x96e3 , 0x0 , -0x9ca7 , 0x0 , 0x0 , 0x0 , -0x9389 , 0x9cac , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8fee , 0x9cad , 0x93d5 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9866 , 0x0 , 0x9ca9 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9caf , 0x0 , 0x8d9b , 0x0 , -0x90c9 , 0x0 , 0x0 , 0x88d2 , -0x9ca8 , 0x9ca6 , 0x0 , 0x9179 , -0x0 , 0x0 , 0x0 , 0x9c9c , -0x8e53 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x91c4 , 0x9cbb , 0x0 , 0x917a , -0x9cb6 , 0x0 , 0x9cb3 , 0x9cb4 , -0x0 , 0x8ee4 , 0x9cb7 , 0x9cba , -0x0 , 0x0 , 0x0 , 0x0 , -0x9cb5 , 0x8f44 , 0x0 , 0x9cb8 , -0x0 , 0x0 , 0x9cb2 , 0x0 , -0x96fa , 0x96f9 , 0x0 , 0x0 , -0x0 , 0x9cbc , 0x9cbd , 0x88d3 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9cb1 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8bf0 , 0x88a4 , -0x0 , 0x0 , 0x0 , 0x8ab4 , -0x0 , 0x9cb9 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9cc1 , -0x9cc0 , 0x0 , 0x0 , 0x0 , -0x9cc5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9cc6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9cc4 , 0x9cc7 , 0x9cbf , 0x9cc3 , -0x0 , 0x0 , 0x9cc8 , 0x0 , -0x9cc9 , 0x0 , 0x0 , 0x9cbe , -0x8e9c , 0x0 , 0x9cc2 , 0x91d4 , -0x8d51 , 0x9cb0 , 0x9054 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9cd6 , -0x0 , 0x95e7 , 0x0 , 0x0 , -0x9ccc , 0x9ccd , 0x9cce , 0x0 , -0x0 , 0x9cd5 , 0x0 , 0x9cd4 , -0x0 , 0x0 , 0x969d , 0x8ab5 , -0x0 , 0x9cd2 , 0x0 , 0x8c64 , -0x8a53 , 0x0 , 0x0 , 0x9ccf , -0x0 , 0x0 , 0x97b6 , 0x9cd1 , -0x88d4 , 0x9cd3 , 0x0 , 0x9cca , -0x9cd0 , 0x9cd7 , 0x8c63 , 0x9ccb , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x977c , 0x0 , -0x0 , 0x0 , 0x974a , 0x0 , -0x0 , 0x0 , 0x0 , 0x9cda , -0x0 , 0x0 , 0x9cde , 0x0 , -0x0 , 0x0 , 0x919e , 0x0 , -0x97f7 , 0x9cdf , 0x0 , 0x0 , -0x9cdc , 0x0 , 0x9cd9 , 0x0 , -0x0 , 0x9cd8 , 0x9cdd , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x95ae , 0x0 , 0x0 , 0x93b2 , -0x0 , 0x8c65 , 0x0 , 0x9ce0 , -0x9cdb , 0x0 , 0x9ce1 , 0x0 , -0x0 , 0x0 , 0x8c9b , 0x0 , -0x0 , 0x0 , 0x89af , 0x0 , -0x0 , 0x0 , 0x9ce9 , 0x0 , -0x0 , 0x0 , 0x8ab6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9ce7 , -0x0 , 0x0 , 0x9ce8 , 0x8da7 , -0x9ce6 , 0x9ce4 , 0x9ce3 , 0x9cea , -0x9ce2 , 0x9cec , 0x0 , 0x0 , -0x89f9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9cee , -0x0 , 0x0 , 0x9ced , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x92a6 , 0x0 , -0x9cf1 , 0x0 , 0x9cef , 0x9ce5 , -0x8c9c , 0x0 , 0x9cf0 , 0x0 , -0x9cf4 , 0x9cf3 , 0x9cf5 , 0x9cf2 , -0x9cf6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9cf7 , 0x9cf8 , 0x95e8 , 0x0 , -0x9cfa , 0x9cf9 , 0x8f5e , 0x0 , -0x90ac , 0x89e4 , 0x89fa , 0x0 , -0x9cfb , 0x0 , 0x88bd , 0x0 , -0x0 , 0x0 , 0x90ca , 0x9cfc , -0x0 , 0xe6c1 , 0x9d40 , 0x8c81 , -0x0 , 0x9d41 , 0x0 , 0x0 , -0x0 , 0x0 , 0x90ed , 0x0 , -0x0 , 0x0 , 0x9d42 , 0x0 , -0x0 , 0x0 , 0x9d43 , 0x8b59 , -0x9d44 , 0x0 , 0x9d45 , 0x9d46 , -0x91d5 , 0x0 , 0x0 , 0x0 , -0x8ccb , 0x0 , 0x0 , 0x96df , -0x0 , 0x0 , 0x0 , 0x965b , -0x8f8a , 0x9d47 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x90ee , -0xe7bb , 0x94e0 , 0x0 , 0x8ee8 , -0x0 , 0x8dcb , 0x9d48 , 0x0 , -0x0 , 0x0 , 0x0 , 0x91c5 , -0x0 , 0x95a5 , 0x0 , 0x0 , -0x91ef , 0x0 , 0x0 , 0x9d4b , -0x0 , 0x0 , 0x9d49 , 0x0 , -0x9d4c , 0x0 , 0x0 , 0x9d4a , -0x0 , 0x0 , 0x0 , 0x0 , -0x9d4d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x95af , 0x0 , -0x0 , 0x88b5 , 0x0 , 0x0 , -0x0 , 0x0 , 0x957d , 0x0 , -0x0 , 0x94e1 , 0x0 , 0x0 , -0x9d4e , 0x0 , 0x9d51 , 0x8fb3 , -0x8b5a , 0x0 , 0x9d4f , 0x9d56 , -0x8fb4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9d50 , 0x9463 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x977d , 0x9d52 , 0x9d53 , -0x9d57 , 0x938a , 0x9d54 , 0x8d52 , -0x90dc , 0x0 , 0x0 , 0x9d65 , -0x94b2 , 0x0 , 0x91f0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x94e2 , -0x9dab , 0x0 , 0x0 , 0x0 , -0x0 , 0x95f8 , 0x0 , 0x0 , -0x0 , 0x92ef , 0x0 , 0x0 , -0x0 , 0x9695 , 0x0 , 0x9d5a , -0x899f , 0x928a , 0x0 , 0x0 , -0x0 , 0x0 , 0x9d63 , 0x0 , -0x0 , 0x9253 , 0x9d5d , 0x9d64 , -0x9d5f , 0x9d66 , 0x9d62 , 0x0 , -0x9d61 , 0x948f , 0x0 , 0x9d5b , -0x89fb , 0x9d59 , 0x8b91 , 0x91f1 , -0x9d55 , 0x0 , 0x0 , 0x9d58 , -0x8d53 , 0x90d9 , 0x0 , 0x8fb5 , -0x9d60 , 0x9471 , 0x0 , 0x0 , -0x8b92 , 0x8a67 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8a87 , 0x9040 , 0x9d68 , 0x9d6d , -0x0 , 0x9d69 , 0x0 , 0x8c9d , -0x0 , 0x9d6e , 0x8e41 , 0x8d89 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8f45 , 0x9d5c , -0x0 , 0x8e9d , 0x9d6b , 0x0 , -0x0 , 0x0 , 0x0 , 0x8e77 , -0x9d6c , 0x88c2 , 0x0 , 0x0 , -0x9d67 , 0x0 , 0x0 , 0x0 , -0x0 , 0x92a7 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8b93 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8bb2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9d6a , -0x88a5 , 0x0 , 0x0 , 0x8dc1 , -0x0 , 0x0 , 0x0 , 0x9055 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x92f0 , 0x0 , -0x0 , 0x94d2 , 0x9d70 , 0x917d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x91a8 , 0x0 , 0x0 , -0x8e4a , 0x9d71 , 0x0 , 0x9d73 , -0x9d6f , 0x0 , 0x0 , 0x0 , -0x0 , 0x95df , 0x0 , 0x92bb , -0x0 , 0x0 , 0x0 , 0x0 , -0x917b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x95f9 , -0x8ecc , 0x9d80 , 0x0 , 0x9d7e , -0x0 , 0x0 , 0x9098 , 0x0 , -0x0 , 0x0 , 0x8c9e , 0x0 , -0x0 , 0x0 , 0x9d78 , 0x8fb7 , -0x0 , 0x0 , 0x93e6 , 0x9450 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9d76 , 0x0 , 0x0 , 0x917c , -0x0 , 0x0 , 0x0 , 0x0 , -0x8ef6 , 0x9d7b , 0x0 , 0x0 , -0x8fb6 , 0x0 , 0x9d75 , 0x9d7a , -0x0 , 0x0 , 0x9472 , 0x0 , -0x0 , 0x0 , 0x9d74 , 0x0 , -0x8c40 , 0x0 , 0x0 , 0x8a7c , -0x0 , 0x0 , 0x0 , 0x9d7c , -0x97a9 , 0x8dcc , 0x9254 , 0x9d79 , -0x0 , 0x90da , 0x0 , 0x8d54 , -0x9084 , 0x8986 , 0x915b , 0x9d77 , -0x8b64 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8c66 , 0x0 , -0x92cd , 0x9d7d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x917e , -0x0 , 0x0 , 0x9d81 , 0x0 , -0x9d83 , 0x0 , 0x0 , 0x91b5 , -0x9d89 , 0x0 , 0x9d84 , 0x0 , -0x0 , 0x9d86 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9560 , -0x92f1 , 0x0 , 0x9d87 , 0x0 , -0x0 , 0x0 , 0x974b , 0x0 , -0x0 , 0x0 , 0x9767 , 0x8ab7 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x88ac , 0x0 , 0x9d85 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9d82 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8af6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8987 , 0x0 , 0x9d88 , 0x0 , -0x0 , 0x0 , 0x9768 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9d8c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x91b9 , 0x0 , 0x9d93 , -0x0 , 0x0 , 0x0 , 0x9d8d , -0x0 , 0x0 , 0x9d8a , 0x9d91 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9d72 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9d8e , 0x0 , -0x9d92 , 0x0 , 0x0 , 0x0 , -0x94c0 , 0x938b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9d8b , 0x0 , 0x9d8f , 0x0 , -0x0 , 0x0 , 0x8c67 , 0x0 , -0x0 , 0x0 , 0x8def , 0x0 , -0x0 , 0x0 , 0x90db , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9d97 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9345 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9d94 , -0x0 , 0x9680 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9d95 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9d96 , 0x0 , -0x96cc , 0x0 , 0x90a0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8c82 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9d9d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8e54 , 0x9d9a , -0x0 , 0x9d99 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9451 , 0x0 , -0x0 , 0x0 , 0x93b3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9350 , 0x9d9b , 0x0 , 0x0 , -0x0 , 0x9d9c , 0x0 , 0x958f , -0x0 , 0x9464 , 0x8e42 , 0x0 , -0x90ef , 0x0 , 0x966f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8a68 , 0x0 , 0x9da3 , -0x9d9e , 0x0 , 0x0 , 0x0 , -0x0 , 0x9769 , 0x9da5 , 0x0 , -0x0 , 0x9da1 , 0x0 , 0x9da2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9180 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9da0 , 0x0 , -0x9d5e , 0x0 , 0x0 , 0x0 , -0x9da4 , 0x0 , 0x9d9f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9da9 , 0x9daa , 0x9346 , 0x9dac , -0x0 , 0x0 , 0x8e43 , 0x9da7 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8b5b , 0x0 , 0x0 , 0x9dad , -0x0 , 0x9da6 , 0x9db1 , 0x0 , -0x9db0 , 0x0 , 0x9daf , 0x0 , -0x0 , 0x0 , 0x9db2 , 0x0 , -0x0 , 0x9db4 , 0x8fef , 0x0 , -0x9db3 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9db7 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9db5 , 0x0 , 0x0 , 0x0 , -0x9db6 , 0x9d90 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9db9 , -0x9db8 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9d98 , 0x9dba , -0x9dae , 0x0 , 0x0 , 0x8e78 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9dbb , 0x9dbc , 0x9dbe , 0x9dbd , -0x9dbf , 0x89fc , 0x0 , 0x8d55 , -0x0 , 0x0 , 0x95fa , 0x90ad , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8ccc , 0x0 , 0x0 , -0x9dc1 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9dc4 , 0x0 , 0x9571 , -0x0 , 0x8b7e , 0x0 , 0x0 , -0x0 , 0x9dc3 , 0x9dc2 , 0x9473 , -0x9dc5 , 0x8bb3 , 0x0 , 0x0 , -0x0 , 0x9dc7 , 0x9dc6 , 0x0 , -0x0 , 0x0 , 0x8ab8 , 0x8e55 , -0x0 , 0x0 , 0x93d6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8c68 , 0x0 , 0x0 , 0x0 , -0x9094 , 0x0 , 0x9dc8 , 0x0 , -0x90ae , 0x9347 , 0x0 , 0x957e , -0x9dc9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9dca , 0x9dcb , -0x0 , 0x0 , 0x0 , 0x95b6 , -0x9b7c , 0x90c4 , 0x0 , 0x0 , -0x956b , 0x0 , 0x8dd6 , 0x0 , -0x94e3 , 0x94c1 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x936c , -0x0 , 0x97bf , 0x0 , 0x9dcd , -0x8ece , 0x0 , 0x0 , 0x9dce , -0x0 , 0x88b4 , 0x0 , 0x0 , -0x8bd2 , 0x90cb , 0x0 , 0x9580 , -0x0 , 0x0 , 0x0 , 0x9dcf , -0x8e61 , 0x9266 , 0x0 , 0x8e7a , -0x9056 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9dd0 , -0x0 , 0x95fb , 0x0 , 0x0 , -0x8997 , 0x8e7b , 0x0 , 0x0 , -0x0 , 0x9dd3 , 0x0 , 0x9dd1 , -0x9dd4 , 0x97b7 , 0x9dd2 , 0x0 , -0x0 , 0x0 , 0x0 , 0x90f9 , -0x9dd5 , 0x0 , 0x0 , 0x91b0 , -0x0 , 0x0 , 0x9dd6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8af8 , -0x0 , 0x9dd8 , 0x0 , 0x9dd7 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9dd9 , 0x9dda , 0x8af9 , 0x0 , -0x0 , 0x93fa , 0x9255 , 0x8b8c , -0x8e7c , 0x9181 , 0x0 , 0x0 , -0x8f7b , 0x88ae , 0x0 , 0x0 , -0x0 , 0x9ddb , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x89a0 , 0x9ddf , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8d56 , 0x9dde , -0x0 , 0x0 , 0x8da9 , 0x8fb8 , -0x0 , 0x0 , 0x9ddd , 0x0 , -0x8fb9 , 0x0 , 0x96be , 0x8da8 , -0x0 , 0x0 , 0x0 , 0x88d5 , -0x90cc , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9de4 , 0x0 , 0x0 , 0x90af , -0x8966 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8f74 , 0x0 , 0x9686 , -0x8df0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8fba , 0x0 , 0x90a5 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9de3 , 0x9de1 , 0x9de2 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x928b , 0x0 , 0x0 , 0x9e45 , -0x0 , 0x9de8 , 0x8e9e , 0x8d57 , -0x9de6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9de7 , 0x0 , 0x9057 , -0x0 , 0x0 , 0x0 , 0x9de5 , -0x0 , 0x0 , 0x8e4e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9dea , 0x9de9 , 0x9dee , -0x0 , 0x0 , 0x9def , 0x0 , -0x9deb , 0x0 , 0x8a41 , 0x9dec , -0x9ded , 0x94d3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9581 , 0x8c69 , -0x9df0 , 0x0 , 0x0 , 0x0 , -0x90b0 , 0x0 , 0x8fbb , 0x0 , -0x0 , 0x0 , 0x9271 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8bc5 , 0x0 , 0x9df1 , -0x9df5 , 0x0 , 0x0 , 0x89c9 , -0x9df2 , 0x9df4 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9df3 , 0x0 , -0x0 , 0x8f8b , 0x0 , 0x0 , -0x0 , 0x0 , 0x9267 , 0x88c3 , -0x9df6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9df7 , 0x0 , 0x0 , -0x0 , 0x0 , 0x92a8 , 0x0 , -0x0 , 0x0 , 0x97ef , 0x0 , -0x0 , 0x0 , 0x0 , 0x8e62 , -0x0 , 0x0 , 0x95e9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x965c , 0x0 , 0x0 , 0x0 , -0x9e41 , 0x9df9 , 0x0 , 0x0 , -0x9dfc , 0x0 , 0x9dfb , 0x0 , -0x0 , 0x9df8 , 0x0 , 0x0 , -0x9e40 , 0x0 , 0x0 , 0x93dc , -0x0 , 0x9dfa , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9e42 , 0x0 , -0x0 , 0x8f8c , 0x9e43 , 0x0 , -0x976a , 0x9498 , 0x0 , 0x0 , -0x9e44 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9e46 , 0x0 , -0x0 , 0x9e47 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9e48 , 0x0 , 0x8bc8 , 0x8967 , -0x8d58 , 0x9e49 , 0x0 , 0x9e4a , -0x8f91 , 0x9182 , 0x0 , 0x0 , -0x99d6 , 0x915d , 0x915c , 0x91d6 , -0x8dc5 , 0x0 , 0x0 , 0x98f0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8c8e , 0x974c , 0x0 , 0x95fc , -0x0 , 0x959e , 0x0 , 0x9e4b , -0x0 , 0x0 , 0x0 , 0x0 , -0x8df1 , 0x92bd , 0x9e4c , 0x984e , -0x0 , 0x0 , 0x0 , 0x965d , -0x0 , 0x92a9 , 0x9e4d , 0x8afa , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9e4e , 0x9e4f , -0x96d8 , 0x0 , 0x96a2 , 0x9696 , -0x967b , 0x8e44 , 0x9e51 , 0x0 , -0x0 , 0x8ee9 , 0x0 , 0x0 , -0x9670 , 0x0 , 0x9e53 , 0x9e56 , -0x9e55 , 0x0 , 0x8af7 , 0x0 , -0x0 , 0x8b80 , 0x0 , 0x9e52 , -0x0 , 0x9e54 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9e57 , 0x0 , -0x0 , 0x9099 , 0x0 , 0x0 , -0x0 , 0x0 , 0x979b , 0x88c7 , -0x8dde , 0x91ba , 0x0 , 0x8edb , -0x0 , 0x0 , 0x8ff1 , 0x0 , -0x0 , 0x9e5a , 0x0 , 0x0 , -0x936d , 0x0 , 0x9e58 , 0x91a9 , -0x9e59 , 0x8ff0 , 0x96db , 0x9e5b , -0x9e5c , 0x9788 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9e61 , 0x0 , -0x0 , 0x8d59 , 0x0 , 0x9474 , -0x9e5e , 0x938c , 0x9ddc , 0x9de0 , -0x0 , 0x8b6e , 0x0 , 0x9466 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9e60 , 0x0 , 0x8fbc , 0x94c2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9e66 , 0x0 , 0x94f8 , -0x0 , 0x9e5d , 0x0 , 0x9e63 , -0x9e62 , 0x0 , 0x0 , 0x0 , -0x90cd , 0x0 , 0x0 , 0x0 , -0x0 , 0x968d , 0x0 , 0x97d1 , -0x0 , 0x0 , 0x9687 , 0x0 , -0x89ca , 0x8e7d , 0x0 , 0x0 , -0x9867 , 0x9e65 , 0x9095 , 0x0 , -0x0 , 0x0 , 0x9e64 , 0x0 , -0x0 , 0x9e5f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8ccd , -0x0 , 0x0 , 0x0 , 0x9e6b , -0x9e69 , 0x0 , 0x89cb , 0x9e67 , -0x9e6d , 0x9e73 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x91c6 , 0x0 , 0x0 , -0x95bf , 0x0 , 0x9e75 , 0x0 , -0x0 , 0x0 , 0x9541 , 0x0 , -0x0 , 0x0 , 0x9e74 , 0x9490 , -0x965e , 0x8ab9 , 0x0 , 0x90f5 , -0x8f5f , 0x0 , 0x0 , 0x0 , -0x92d1 , 0x0 , 0x974d , 0x0 , -0x0 , 0x9e70 , 0x9e6f , 0x0 , -0x0 , 0x0 , 0x9e71 , 0x0 , -0x9e6e , 0x0 , 0x0 , 0x9e76 , -0x0 , 0x9e6c , 0x0 , 0x0 , -0x9e6a , 0x0 , 0x9e72 , 0x9e68 , -0x0 , 0x928c , 0x0 , 0x96f6 , -0x8ec4 , 0x8df2 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8db8 , -0x0 , 0x0 , 0x968f , 0x8a60 , -0x0 , 0x0 , 0x92cc , 0x93c8 , -0x8968 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x90f0 , -0x0 , 0x0 , 0x90b2 , 0x8c49 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9e78 , 0x0 , -0x0 , 0x8d5a , 0x8a9c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9e7a , 0x8a94 , 0x9e81 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9e7d , 0x0 , -0x90f1 , 0x0 , 0x0 , 0x0 , -0x8a6a , 0x8daa , 0x0 , 0x0 , -0x8a69 , 0x8dcd , 0x0 , 0x0 , -0x9e7b , 0x8c85 , 0x8c6a , 0x938d , -0x0 , 0x0 , 0x9e79 , 0x0 , -0x88c4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9e7c , 0x9e7e , 0x0 , -0x8bcb , 0x8c4b , 0x0 , 0x8aba , -0x8b6a , 0x0 , 0x0 , 0x0 , -0x0 , 0x9e82 , 0x0 , 0x0 , -0x8df7 , 0x9691 , 0x0 , 0x8e56 , -0x0 , 0x0 , 0x0 , 0x9e83 , -0x0 , 0x0 , 0x0 , 0x954f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9e8f , 0x0 , 0x89b1 , 0x9e84 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9e95 , 0x9e85 , -0x0 , 0x97c0 , 0x0 , 0x9e8c , -0x0 , 0x947e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9e94 , 0x0 , 0x9e87 , -0x0 , 0x0 , 0x0 , 0x88b2 , -0x9e89 , 0x0 , 0x0 , 0x8d5b , -0x0 , 0x0 , 0x0 , 0x9e8b , -0x0 , 0x9e8a , 0x0 , 0x9e86 , -0x9e91 , 0x0 , 0x8fbd , 0x0 , -0x0 , 0x0 , 0x9aeb , 0x8ce6 , -0x979c , 0x0 , 0x0 , 0x0 , -0x0 , 0x9e88 , 0x0 , 0x92f2 , -0x8a42 , 0x8dab , 0x0 , 0x9e80 , -0x0 , 0x9e90 , 0x8a81 , 0x0 , -0x0 , 0x9e8e , 0x9e92 , 0x0 , -0x938e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8afc , 0x0 , 0x9eb0 , 0x0 , -0x0 , 0x96c7 , 0x9e97 , 0x8afb , -0x0 , 0x9e9e , 0x0 , 0x0 , -0x0 , 0x0 , 0x965f , 0x0 , -0x9e9f , 0x9ea1 , 0x0 , 0x9ea5 , -0x9e99 , 0x0 , 0x9249 , 0x0 , -0x0 , 0x0 , 0x0 , 0x938f , -0x9ea9 , 0x9e9c , 0x0 , 0x9ea6 , -0x0 , 0x0 , 0x0 , 0x9ea0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9058 , 0x9eaa , -0x0 , 0x0 , 0x90b1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9ea8 , 0x8abb , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x986f , 0x9e96 , 0x0 , 0x0 , -0x9ea4 , 0x88d6 , 0x0 , 0x0 , -0x9e98 , 0x0 , 0x0 , 0x96b8 , -0x9e9d , 0x9041 , 0x92c5 , 0x9e93 , -0x0 , 0x0 , 0x9ea3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x909a , 0x9ead , 0x8a91 , -0x8c9f , 0x0 , 0x0 , 0x0 , -0x0 , 0x9eaf , 0x9e9a , 0x9eae , -0x0 , 0x9ea7 , 0x9e9b , 0x0 , -0x9eab , 0x0 , 0x9eac , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9ebd , 0x0 , 0x0 , 0x0 , -0x93cc , 0x0 , 0x9ea2 , 0x0 , -0x0 , 0x9eb9 , 0x0 , 0x0 , -0x0 , 0x9ebb , 0x0 , 0x92d6 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x976b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9596 , -0x9eb6 , 0x91c8 , 0x0 , 0x0 , -0x0 , 0x9ebc , 0x915e , 0x0 , -0x9eb3 , 0x9ec0 , 0x9ebf , 0x0 , -0x93ed , 0x9ebe , 0x93e8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9ec2 , 0x9eb5 , -0x0 , 0x8bc6 , 0x9eb8 , 0x8f7c , -0x0 , 0x0 , 0x0 , 0x9480 , -0x9eba , 0x8bc9 , 0x0 , 0x9eb2 , -0x9eb4 , 0x9eb1 , 0x0 , 0x0 , -0x984f , 0x8a79 , 0x9eb7 , 0x0 , -0x0 , 0x9ec1 , 0x8a54 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8de5 , 0x0 , -0x0 , 0x0 , 0x897c , 0x0 , -0x0 , 0x9ed2 , 0x0 , 0x0 , -0x9850 , 0x9ed5 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9059 , -0x9ed4 , 0x0 , 0x0 , 0x0 , -0x9ed3 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9ed0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9ec4 , 0x0 , -0x0 , 0x9ee1 , 0x9ec3 , 0x0 , -0x9ed6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9ece , -0x0 , 0x0 , 0x9ec9 , 0x9ec6 , -0x0 , 0x9ec7 , 0x0 , 0x9ecf , -0x0 , 0x0 , 0x0 , 0xeaa0 , -0x0 , 0x0 , 0x9ecc , 0x8d5c , -0x92c6 , 0x9184 , 0x9eca , 0x0 , -0x9ec5 , 0x0 , 0x0 , 0x9ec8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x976c , 0x968a , 0x0 , 0x0 , -0x0 , 0x9ecd , 0x9ed7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9edf , -0x9ed8 , 0x0 , 0x0 , 0x9ee5 , -0x0 , 0x9ee3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9ede , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9edd , 0x0 , 0x92ce , -0x0 , 0x9185 , 0x0 , 0x9edb , -0x0 , 0x0 , 0x9ed9 , 0x0 , -0x0 , 0x9ee0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9ee6 , 0x94f3 , -0x9eec , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9ee7 , 0x9eea , -0x9ee4 , 0x0 , 0x0 , 0x9294 , -0x0 , 0x9557 , 0x0 , 0x9eda , -0x0 , 0x0 , 0x9ee2 , 0x8fbe , -0x0 , 0x96cd , 0x9ef6 , 0x9ee9 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8ca0 , 0x89a1 , 0x8a7e , -0x0 , 0x0 , 0x9ed1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8fbf , 0x9eee , 0x0 , -0x9ef5 , 0x8ef7 , 0x8a92 , 0x0 , -0x0 , 0x924d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9eeb , 0x0 , 0x0 , 0x9ef0 , -0x9ef4 , 0x0 , 0x0 , 0x8bb4 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8b6b , 0x9ef2 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8b40 , -0x0 , 0x93c9 , 0x9ef1 , 0x0 , -0x0 , 0x0 , 0x9ef3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9eed , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9eef , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8a80 , -0x9268 , 0x0 , 0x0 , 0x0 , -0x9efa , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9ef8 , 0x8ce7 , 0x0 , -0x9ef7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9f40 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9e77 , 0x0 , 0x0 , 0x0 , -0x9ef9 , 0x0 , 0x9efb , 0x9efc , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9f4b , 0x0 , -0x9f47 , 0x0 , 0x9e8d , 0x0 , -0x0 , 0x0 , 0x0 , 0x9f46 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9f45 , 0x0 , 0x0 , 0x9f42 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9ee8 , 0x9f44 , 0x9f43 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9f49 , 0x0 , 0x9845 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9f4c , 0x8bf9 , -0x0 , 0x0 , 0x9f48 , 0x9f4a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x94a5 , 0x0 , 0x9f4d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9f51 , 0x9f4e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9793 , 0x9f4f , 0x0 , 0x0 , -0x0 , 0x0 , 0x9edc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9f52 , 0x0 , -0x0 , 0x0 , 0x9f53 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8954 , 0x0 , 0x9f55 , -0x8c87 , 0x8e9f , 0x0 , 0x8bd3 , -0x0 , 0x0 , 0x0 , 0x89a2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x977e , 0x0 , -0x0 , 0x0 , 0x0 , 0x9f57 , -0x9f56 , 0x9f59 , 0x8b5c , 0x0 , -0x0 , 0x8bd4 , 0x8abc , 0x0 , -0x0 , 0x0 , 0x0 , 0x9f5c , -0x0 , 0x0 , 0x0 , 0x9f5b , -0x0 , 0x9f5d , 0x0 , 0x0 , -0x89cc , 0x0 , 0x9256 , 0x0 , -0x9f5e , 0x0 , 0x0 , 0x8abd , -0x9f60 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9f5f , 0x0 , 0x9f61 , -0x0 , 0x0 , 0x0 , 0x9f62 , -0x0 , 0x9f63 , 0x8e7e , 0x90b3 , -0x8d9f , 0x0 , 0x9590 , 0x0 , -0x0 , 0x95e0 , 0x9863 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8e95 , -0x0 , 0x0 , 0x0 , 0x8dce , -0x97f0 , 0x0 , 0x0 , 0x0 , -0x9f64 , 0x9f65 , 0x0 , 0x8e80 , -0x0 , 0x0 , 0x0 , 0x9f66 , -0x9f67 , 0x0 , 0x0 , 0x9f69 , -0x9f68 , 0x0 , 0x9677 , 0x0 , -0x0 , 0x8f7d , 0x8eea , 0x8e63 , -0x0 , 0x9f6a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9f6c , 0x9042 , 0x0 , -0x9f6b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9f6d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9f6e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9f6f , 0x9f70 , -0x0 , 0x0 , 0x0 , 0x9f71 , -0x0 , 0x9f73 , 0x9f72 , 0x9f74 , -0x89a3 , 0x9269 , 0x0 , 0x9f75 , -0x0 , 0x0 , 0x8e45 , 0x8a6b , -0x9f76 , 0x0 , 0x0 , 0x9361 , -0x9aca , 0x0 , 0x0 , 0x0 , -0x0 , 0x8b42 , 0x9f77 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9f78 , -0x0 , 0x95ea , 0x9688 , 0x0 , -0x0 , 0x0 , 0x93c5 , 0x9f79 , -0x94e4 , 0x0 , 0x0 , 0x0 , -0x94f9 , 0x0 , 0x0 , 0x96d1 , -0x0 , 0x0 , 0x0 , 0x9f7a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9f7c , -0x9f7b , 0x0 , 0x0 , 0x9f7e , -0x0 , 0x0 , 0x0 , 0x9f7d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9f81 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8e81 , -0x0 , 0x96af , 0x0 , 0x9f82 , -0x9f83 , 0x0 , 0x0 , 0x8b43 , -0x0 , 0x0 , 0x0 , 0x9f84 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9f86 , -0x9f85 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9085 , 0x0 , 0x0 , 0x9558 , -0x8969 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x94c3 , 0x0 , -0x92f3 , 0x8f60 , 0x8b81 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x94c4 , 0x0 , -0x8eac , 0x0 , 0x0 , 0x0 , -0x0 , 0x9f88 , 0x0 , 0x8abe , -0x0 , 0x0 , 0x8998 , 0x0 , -0x0 , 0x93f0 , 0x9f87 , 0x8d5d , -0x9272 , 0x0 , 0x9f89 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9f91 , 0x0 , 0x9f8a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x91bf , 0x0 , 0x8b82 , 0x9f92 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8c88 , 0x0 , -0x0 , 0x8b44 , 0x9f90 , 0x0 , -0x0 , 0x9f8e , 0x9f8b , 0x9780 , -0x0 , 0x0 , 0x0 , 0x0 , -0x92be , 0x0 , 0x0 , 0x0 , -0x93d7 , 0x9f8c , 0x0 , 0x0 , -0x9f94 , 0x0 , 0x9f93 , 0x8c42 , -0x0 , 0x0 , 0x89ab , 0x0 , -0x0 , 0x8db9 , 0x9f8d , 0x9f8f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9676 , 0x91f2 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9697 , -0x0 , 0x0 , 0x9f9c , 0x0 , -0x0 , 0x9f9d , 0x0 , 0x89cd , -0x0 , 0x0 , 0x0 , 0x0 , -0x95a6 , 0x96fb , 0x9f9f , 0x8ea1 , -0x8fc0 , 0x9f98 , 0x9f9e , 0x8988 , -0x0 , 0x8bb5 , 0x0 , 0x0 , -0x9f95 , 0x9f9a , 0x0 , 0x0 , -0x0 , 0x90f2 , 0x9491 , 0x0 , -0x94e5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9f97 , -0x0 , 0x9640 , 0x0 , 0x9f99 , -0x0 , 0x9fa2 , 0x0 , 0x9fa0 , -0x0 , 0x9f9b , 0x0 , 0x0 , -0x0 , 0x9641 , 0x9467 , 0x8b83 , -0x0 , 0x9344 , 0x0 , 0x0 , -0x928d , 0x0 , 0x9fa3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9fa1 , -0x91d7 , 0x9f96 , 0x0 , 0x896a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x976d , -0x9fae , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9fad , 0x0 , -0x0 , 0x0 , 0x0 , 0x90f4 , -0x0 , 0x9faa , 0x0 , 0x978c , -0x0 , 0x0 , 0x93b4 , 0x9fa4 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x92c3 , 0x0 , 0x0 , -0x0 , 0x896b , 0x8d5e , 0x9fa7 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8f46 , 0x9fac , -0x0 , 0x9fab , 0x9fa6 , 0x0 , -0x9fa9 , 0x0 , 0x0 , 0x8a88 , -0x0 , 0x9fa8 , 0x9468 , 0x0 , -0x0 , 0x97ac , 0x0 , 0x0 , -0x8ff2 , 0x90f3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9fb4 , 0x9fb2 , 0x0 , -0x956c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9faf , -0x9fb1 , 0x0 , 0x8959 , 0x0 , -0x0 , 0x8d5f , 0x9851 , 0x0 , -0x8a5c , 0x0 , 0x9582 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9781 , 0x0 , 0x0 , 0x8a43 , -0x905a , 0x9fb3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9fb8 , 0x0 , 0x0 , -0x8fc1 , 0x0 , 0x0 , 0x0 , -0x974f , 0x0 , 0x9fb5 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9fb0 , -0x0 , 0x9fb6 , 0x0 , 0x0 , -0x0 , 0x97dc , 0x0 , 0x9393 , -0x93c0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8a55 , -0x0 , 0x0 , 0x8974 , 0x0 , -0x0 , 0x9fbc , 0x0 , 0x0 , -0x9fbf , 0x0 , 0x0 , 0x0 , -0x97c1 , 0x0 , 0x0 , 0x0 , -0x9784 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9fc6 , 0x9fc0 , 0x9fbd , -0x0 , 0x0 , 0x0 , 0x97d2 , -0x9fc3 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8f69 , 0x9fc5 , 0x0 , -0x0 , 0x9fca , 0x0 , 0x0 , -0x9391 , 0x9fc8 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9fc2 , 0x0 , -0x0 , 0x9257 , 0x0 , 0x0 , -0x9fc9 , 0x0 , 0x9fbe , 0x0 , -0x9fc4 , 0x0 , 0x9fcb , 0x88fa , -0x9fc1 , 0x0 , 0x9fcc , 0x0 , -0x0 , 0x905b , 0x0 , 0x8f7e , -0x0 , 0x95a3 , 0x0 , 0x8dac , -0x0 , 0x9fb9 , 0x9fc7 , 0x9359 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x90b4 , 0x0 , 0x8a89 , -0x8dcf , 0x8fc2 , 0x9fbb , 0x8f61 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8c6b , -0x0 , 0x9fba , 0x0 , 0x0 , -0x0 , 0x9fd0 , 0x8f8d , 0x8cb8 , -0x0 , 0x9fdf , 0x0 , 0x9fd9 , -0x8b94 , 0x936e , 0x0 , 0x9fd4 , -0x9fdd , 0x88ad , 0x8951 , 0x0 , -0x0 , 0x89b7 , 0x0 , 0x9fd6 , -0x91aa , 0x9fcd , 0x9fcf , 0x8d60 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9fe0 , 0x0 , 0x9fdb , 0x0 , -0x0 , 0x0 , 0x9fd3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9fda , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x96a9 , 0x0 , -0x0 , 0x9fd8 , 0x9fdc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8cce , 0x0 , -0x8fc3 , 0x0 , 0x0 , 0x9258 , -0x0 , 0x0 , 0x0 , 0x9fd2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x974e , -0x0 , 0x0 , 0x0 , 0x9fd5 , -0x0 , 0x0 , 0x9fce , 0x9392 , -0x0 , 0x0 , 0x9fd1 , 0x0 , -0x0 , 0x0 , 0x9fd7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9870 , 0x8ebc , -0x969e , 0x0 , 0x9fe1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x94ac , 0x0 , 0x0 , 0x9fed , -0x8cb9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8f80 , 0x0 , -0x9fe3 , 0x0 , 0x0 , 0x0 , -0x97ad , 0x8d61 , 0x0 , 0x9ff0 , -0x0 , 0x0 , 0x88ec , 0x0 , -0x0 , 0x9fee , 0x0 , 0x0 , -0x0 , 0x0 , 0x9fe2 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9fe8 , -0x0 , 0x0 , 0x9fea , 0x0 , -0x0 , 0x0 , 0x976e , 0x9fe5 , -0x0 , 0x0 , 0x934d , 0x0 , -0x0 , 0x9fe7 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9fef , 0x0 , -0x9fe9 , 0x96c5 , 0x0 , 0x0 , -0x0 , 0x9fe4 , 0x0 , 0x8ea0 , -0x9ffc , 0x0 , 0x0 , 0x0 , -0x0 , 0x8a8a , 0x0 , 0x9fe6 , -0x9feb , 0x9fec , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x91ea , 0x91d8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9ff4 , 0x0 , 0x0 , 0x9ffa , -0x0 , 0x0 , 0x9ff8 , 0x0 , -0x9348 , 0x0 , 0x0 , 0xe042 , -0x9ff5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9ff6 , 0x9fde , -0x0 , 0x8b99 , 0x9559 , 0x0 , -0x0 , 0x0 , 0x8ebd , 0x0 , -0x0 , 0x8d97 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9852 , -0x0 , 0x9ff2 , 0x0 , 0xe041 , -0x8989 , 0x9186 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9499 , 0x0 , 0x8abf , 0x97f8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x969f , -0x92d0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9ff9 , 0x9ffb , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9151 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe040 , 0x9ff7 , -0x0 , 0x9ff1 , 0x0 , 0x0 , -0x0 , 0x8ac1 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8c89 , 0x0 , 0x0 , 0x0 , -0xe04e , 0x0 , 0x0 , 0xe049 , -0x90f6 , 0x0 , 0x0 , 0x8a83 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8f81 , 0x0 , 0xe052 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe04b , 0x92aa , 0xe048 , -0x92d7 , 0x0 , 0x0 , 0x0 , -0xe06b , 0x0 , 0x0 , 0x0 , -0xe045 , 0x0 , 0xe044 , 0x0 , -0xe04d , 0x0 , 0x0 , 0x0 , -0xe047 , 0xe046 , 0xe04c , 0x0 , -0x909f , 0x0 , 0xe043 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe04f , 0x0 , -0x0 , 0xe050 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8ac0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe055 , 0x0 , 0xe054 , -0xe056 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe059 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9362 , 0x0 , 0xe053 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe057 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8c83 , 0x91f7 , 0xe051 , 0x945a , -0x0 , 0x0 , 0xe058 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe05d , 0xe05b , 0x0 , 0x0 , -0xe05e , 0x0 , 0x0 , 0xe061 , -0x0 , 0x0 , 0x0 , 0xe05a , -0x8d8a , 0x9447 , 0x0 , 0x0 , -0x9fb7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9794 , -0xe05c , 0x0 , 0xe060 , 0x91f3 , -0x0 , 0xe05f , 0x0 , 0xe04a , -0x0 , 0x0 , 0xe889 , 0x0 , -0x0 , 0x0 , 0xe064 , 0x0 , -0x0 , 0x0 , 0xe068 , 0x0 , -0x0 , 0xe066 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe062 , 0x0 , 0xe063 , -0x0 , 0x0 , 0x0 , 0xe067 , -0x0 , 0xe065 , 0x0 , 0x0 , -0x0 , 0x956d , 0x0 , 0x0 , -0xe06d , 0x0 , 0xe06a , 0xe069 , -0x0 , 0xe06c , 0x93d2 , 0xe06e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9295 , 0x91eb , -0x0 , 0x0 , 0x0 , 0x0 , -0x90a3 , 0x0 , 0x0 , 0x0 , -0xe06f , 0x0 , 0xe071 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe070 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9ff3 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe072 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x93e5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe073 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x89ce , -0x0 , 0x0 , 0x0 , 0x9394 , -0x8a44 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8b84 , 0x0 , 0x0 , 0x0 , -0x8edc , 0x8dd0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9846 , 0x9086 , 0x0 , -0x0 , 0x0 , 0x898a , 0x0 , -0x0 , 0x0 , 0xe075 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe074 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe078 , 0x9259 , 0xe07b , 0xe076 , -0x0 , 0x0 , 0x0 , 0xe07a , -0x0 , 0x0 , 0x0 , 0x0 , -0xe079 , 0x935f , 0x88d7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x97f3 , 0x0 , 0x0 , 0xe07d , -0x0 , 0x0 , 0x0 , 0x8947 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe080 , 0x0 , 0x0 , -0x0 , 0xe07e , 0x0 , 0xe07c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe077 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9642 , 0x0 , 0x0 , -0x0 , 0xe082 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe081 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x898b , 0x0 , 0x0 , 0x0 , -0x0 , 0xe084 , 0x95b0 , 0x0 , -0xe083 , 0x0 , 0x0 , 0x0 , -0x0 , 0x96b3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8fc5 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9152 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8fc4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x97f9 , 0x0 , 0x0 , -0xe08a , 0x0 , 0x90f7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe086 , 0xe08b , 0x0 , -0x0 , 0x898c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe089 , 0x0 , -0x9481 , 0xe085 , 0xe088 , 0x8fc6 , -0x0 , 0x94cf , 0x0 , 0x0 , -0xe08c , 0x0 , 0x8ecf , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x90f8 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe08f , 0x0 , 0x0 , 0x0 , -0xe087 , 0x0 , 0x8c46 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe08d , -0x0 , 0x0 , 0x0 , 0x0 , -0x976f , 0xe090 , 0x0 , 0x0 , -0x0 , 0xeaa4 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8f6e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe091 , 0x0 , 0x0 , 0x0 , -0xe092 , 0x0 , 0x0 , 0x0 , -0x0 , 0x944d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe094 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe095 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9452 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9395 , 0xe097 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe099 , 0x0 , -0x97d3 , 0x0 , 0xe096 , 0x0 , -0xe098 , 0x898d , 0x0 , 0xe093 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9a7a , -0xe09a , 0x0 , 0x0 , 0x0 , -0x0 , 0x9187 , 0x8e57 , 0xe09c , -0x0 , 0x0 , 0x0 , 0x0 , -0xe09b , 0x9043 , 0x99d7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe09d , 0x0 , 0x0 , -0x0 , 0xe09f , 0x0 , 0xe08e , -0xe09e , 0x0 , 0x0 , 0xe0a0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x949a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe0a1 , 0x0 , 0x0 , -0xe0a2 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0a3 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe0a4 , 0x0 , 0x92dc , 0x0 , -0xe0a6 , 0xe0a5 , 0x0 , 0x0 , -0xe0a7 , 0x0 , 0xe0a8 , 0x0 , -0x0 , 0x8edd , 0x9583 , 0x0 , -0x0 , 0x0 , 0x96ea , 0xe0a9 , -0xe0aa , 0x9175 , 0x8ea2 , 0xe0ab , -0xe0ac , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0ad , 0x95d0 , -0x94c5 , 0x0 , 0x0 , 0xe0ae , -0x9476 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x92ab , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe0af , 0x89e5 , 0x0 , 0x8b8d , -0x0 , 0x96c4 , 0x0 , 0x96b4 , -0x0 , 0x89b2 , 0x9853 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9671 , -0x0 , 0x95a8 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x90b5 , 0x0 , -0xe0b0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x93c1 , 0x0 , 0x0 , -0x0 , 0x8ca1 , 0xe0b1 , 0x0 , -0x8dd2 , 0xe0b3 , 0xe0b2 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0b4 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0b5 , 0x0 , -0x0 , 0x0 , 0xe0b6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8b5d , 0x0 , 0xe0b7 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0b8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8ca2 , 0x0 , 0x0 , 0x94c6 , -0x0 , 0x0 , 0xe0ba , 0x0 , -0x0 , 0x0 , 0x8ff3 , 0x0 , -0x0 , 0xe0b9 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8bb6 , 0xe0bb , -0xe0bd , 0x0 , 0xe0bc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0be , 0x0 , -0x8ccf , 0x0 , 0xe0bf , 0x0 , -0x0 , 0x0 , 0x0 , 0x8be7 , -0x0 , 0x915f , 0x0 , 0x8d9d , -0x0 , 0x0 , 0x0 , 0x0 , -0xe0c1 , 0xe0c2 , 0xe0c0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8eeb , 0x0 , 0x0 , -0x93c6 , 0x8bb7 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0c4 , -0x924b , 0xe0c3 , 0x0 , 0x0 , -0x9854 , 0x9482 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0c7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0c9 , 0xe0c6 , -0x0 , 0x0 , 0x0 , 0x96d2 , -0xe0c8 , 0xe0ca , 0x0 , 0x97c2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe0ce , 0x0 , 0x0 , -0x0 , 0xe0cd , 0x9296 , 0x944c , -0x0 , 0x0 , 0x8ca3 , 0xe0cc , -0x0 , 0x0 , 0x0 , 0x0 , -0xe0cb , 0x0 , 0x9750 , 0x9751 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0cf , 0x898e , -0x0 , 0x0 , 0x0 , 0x0 , -0x8d96 , 0x8e82 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0d0 , 0xe0d1 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0d3 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8f62 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe0d5 , 0x0 , 0xe0d4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe0d6 , 0x0 , 0x8a6c , 0x0 , -0x0 , 0xe0d8 , 0x0 , 0x0 , -0xe0d7 , 0x0 , 0xe0da , 0xe0d9 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8cba , 0x0 , 0x0 , 0x97a6 , -0x0 , 0x8bca , 0x0 , 0x89a4 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8be8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8adf , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x97e6 , 0xe0dc , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0de , -0x0 , 0x0 , 0x0 , 0x0 , -0xe0df , 0x0 , 0x89cf , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe0db , 0x0 , 0x8e58 , 0x0 , -0x0 , 0x92bf , 0xe0dd , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0e2 , 0x0 , -0x8eec , 0x0 , 0x0 , 0x0 , -0x0 , 0xe0e0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8c5d , 0x0 , -0x0 , 0x94c7 , 0xe0e1 , 0x0 , -0x0 , 0xe0fc , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe0e7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8cbb , 0x0 , -0x0 , 0x0 , 0x0 , 0x8b85 , -0x0 , 0xe0e4 , 0x979d , 0x0 , -0x0 , 0x97ae , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x91f4 , 0x0 , -0x0 , 0xe0e6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0e8 , 0x97d4 , -0x8bd5 , 0x94fa , 0x9469 , 0x0 , -0x0 , 0x0 , 0xe0e9 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0eb , -0x0 , 0xe0ee , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe0ea , 0x0 , 0x0 , -0x0 , 0xe0ed , 0x8ce8 , 0x896c , -0xe0ef , 0x0 , 0x9090 , 0xe0ec , -0x97da , 0x0 , 0x0 , 0xe0f2 , -0xeaa2 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe0f0 , 0xe0f3 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0e5 , -0xe0f1 , 0x0 , 0x0 , 0x8dba , -0x0 , 0x0 , 0xe0f4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0f5 , 0x0 , -0x0 , 0x0 , 0x0 , 0x979e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0f6 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0f7 , 0x0 , -0x0 , 0x0 , 0xe0e3 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0f8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8ac2 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8ea3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe0f9 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe0fa , -0x0 , 0x0 , 0x0 , 0x0 , -0xe0fb , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x895a , 0x0 , 0x0 , 0x0 , -0xe140 , 0x0 , 0x955a , 0xe141 , -0x0 , 0x0 , 0x8aa2 , 0xe142 , -0x0 , 0xe143 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe144 , 0x0 , -0xe146 , 0xe147 , 0xe145 , 0x0 , -0x0 , 0x0 , 0x9572 , 0xe149 , -0xe148 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe14b , -0xe14a , 0xe14c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe14d , 0xe14f , 0xe14e , 0x0 , -0x0 , 0x8d99 , 0x0 , 0xe151 , -0x0 , 0xe150 , 0x0 , 0x0 , -0x8ac3 , 0x0 , 0x9072 , 0x0 , -0x935b , 0x0 , 0xe152 , 0x90b6 , -0x0 , 0x0 , 0x0 , 0x8e59 , -0x0 , 0x8999 , 0xe153 , 0x0 , -0x9770 , 0x0 , 0x0 , 0x95e1 , -0xe154 , 0x0 , 0x0 , 0x0 , -0x9363 , 0x9752 , 0x8d62 , 0x905c , -0x0 , 0x0 , 0x0 , 0x926a , -0x99b2 , 0x0 , 0x92ac , 0x89e6 , -0xe155 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe156 , 0x0 , 0xe15b , 0x0 , -0x0 , 0xe159 , 0xe158 , 0x9dc0 , -0x8a45 , 0xe157 , 0x0 , 0x88d8 , -0x0 , 0x94a8 , 0x0 , 0x0 , -0x94c8 , 0x0 , 0x0 , 0x0 , -0x0 , 0x97af , 0xe15c , 0xe15a , -0x927b , 0x90a4 , 0x0 , 0x0 , -0x94a9 , 0x0 , 0x954c , 0x0 , -0xe15e , 0x97aa , 0x8c6c , 0xe15f , -0x0 , 0xe15d , 0x94d4 , 0xe160 , -0x0 , 0xe161 , 0x0 , 0x0 , -0x88d9 , 0x0 , 0x0 , 0x8ff4 , -0xe166 , 0x0 , 0xe163 , 0x93eb , -0xe162 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8b45 , -0x0 , 0x0 , 0xe169 , 0x0 , -0x0 , 0x0 , 0xe164 , 0xe165 , -0x0 , 0xe168 , 0xe167 , 0x9544 , -0x0 , 0x0 , 0x9161 , 0x9160 , -0x0 , 0x8b5e , 0x0 , 0x0 , -0xe16a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe16b , 0x0 , -0x0 , 0xe16c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe16e , -0x0 , 0xe16d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8975 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe176 , 0x94e6 , 0xe170 , -0x0 , 0xe172 , 0x0 , 0x0 , -0xe174 , 0x905d , 0x0 , 0x0 , -0xe175 , 0xe173 , 0x8ebe , 0x0 , -0x0 , 0x0 , 0xe16f , 0xe171 , -0x0 , 0x9561 , 0x0 , 0x8fc7 , -0x0 , 0x0 , 0xe178 , 0x0 , -0x0 , 0xe177 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe179 , 0x0 , -0x8ea4 , 0x8dad , 0x0 , 0x0 , -0x9397 , 0xe17a , 0x0 , 0x92c9 , -0x0 , 0x0 , 0xe17c , 0x0 , -0x0 , 0x0 , 0x979f , 0xe17b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9189 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe182 , 0x0 , 0xe184 , 0xe185 , -0x9273 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe183 , 0x0 , -0xe180 , 0x0 , 0xe17d , 0xe17e , -0x0 , 0xe181 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe188 , 0x0 , 0xe186 , -0x0 , 0xe187 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe189 , -0xe18b , 0xe18c , 0xe18d , 0x0 , -0xe18e , 0x0 , 0x0 , 0xe18a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe190 , 0x0 , 0x0 , 0x0 , -0xe18f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe191 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x97c3 , 0x0 , -0x0 , 0x0 , 0xe194 , 0xe192 , -0xe193 , 0x0 , 0x0 , 0x0 , -0x8ae0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x96fc , 0x0 , -0x0 , 0x0 , 0x95c8 , 0x0 , -0xe196 , 0x0 , 0x0 , 0x0 , -0xe195 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe197 , 0xe198 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe19c , -0xe199 , 0xe19a , 0xe19b , 0x0 , -0xe19d , 0x0 , 0x0 , 0x0 , -0xe19e , 0x0 , 0xe19f , 0x0 , -0x0 , 0x0 , 0xe1a0 , 0x0 , -0xe1a1 , 0x0 , 0x94ad , 0x936f , -0xe1a2 , 0x9492 , 0x9553 , 0x0 , -0xe1a3 , 0x0 , 0x0 , 0xe1a4 , -0x9349 , 0x0 , 0x8a46 , 0x8d63 , -0xe1a5 , 0x0 , 0x0 , 0xe1a6 , -0x0 , 0x0 , 0xe1a7 , 0x0 , -0x8e48 , 0x0 , 0x0 , 0xe1a9 , -0x0 , 0x0 , 0xe1a8 , 0x0 , -0x0 , 0xe1aa , 0xe1ab , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x94e7 , 0x0 , -0xe1ac , 0x0 , 0x0 , 0x0 , -0xe1ad , 0x0 , 0x0 , 0xea89 , -0xe1ae , 0xe1af , 0xe1b0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8e4d , -0x0 , 0x0 , 0xe1b1 , 0x9475 , -0x0 , 0x0 , 0x967e , 0x0 , -0x896d , 0x0 , 0x8976 , 0x0 , -0x0 , 0xe1b2 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe1b4 , 0x0 , -0x0 , 0x0 , 0xe1b3 , 0x9390 , -0x0 , 0x0 , 0x0 , 0x90b7 , -0x9f58 , 0x0 , 0xe1b5 , 0x96bf , -0x0 , 0xe1b6 , 0x0 , 0x8ac4 , -0x94d5 , 0xe1b7 , 0x0 , 0xe1b8 , -0x0 , 0x0 , 0xe1b9 , 0x0 , -0x0 , 0x0 , 0x96da , 0x0 , -0x0 , 0x0 , 0x96d3 , 0x0 , -0x92bc , 0x0 , 0x0 , 0x0 , -0x918a , 0x0 , 0x0 , 0xe1bb , -0x0 , 0x0 , 0x8f82 , 0x0 , -0x0 , 0x8fc8 , 0x0 , 0x0 , -0xe1be , 0x0 , 0x0 , 0xe1bd , -0xe1bc , 0x94fb , 0x0 , 0x8ac5 , -0x8ca7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe1c4 , -0x0 , 0x0 , 0xe1c1 , 0x905e , -0x96b0 , 0x0 , 0x0 , 0x0 , -0xe1c0 , 0xe1c2 , 0xe1c3 , 0x0 , -0x0 , 0xe1bf , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe1c5 , -0xe1c6 , 0x0 , 0x92ad , 0x0 , -0x8ae1 , 0x0 , 0x0 , 0x0 , -0x9285 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe1c7 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe1c8 , 0xe1cb , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9087 , 0x0 , 0x93c2 , -0x0 , 0xe1cc , 0x9672 , 0x0 , -0xe1c9 , 0x0 , 0x0 , 0xe1ca , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe1cf , 0x0 , 0x0 , -0x0 , 0x0 , 0xe1ce , 0xe1cd , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe1d1 , -0x0 , 0x0 , 0xe1d0 , 0x0 , -0x0 , 0xe1d2 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe1d4 , 0x0 , -0xe1d3 , 0x0 , 0x0 , 0x0 , -0x0 , 0x95cb , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8f75 , 0x97c4 , 0x0 , 0x0 , -0xe1d5 , 0x0 , 0x0 , 0x93b5 , -0x0 , 0x0 , 0xe1d6 , 0x0 , -0x0 , 0xe1d7 , 0x0 , 0xe1db , -0xe1d9 , 0xe1da , 0x0 , 0xe1d8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe1dc , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe1dd , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe1de , -0x0 , 0x0 , 0xe1df , 0x96b5 , -0xe1e0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x96ee , 0xe1e1 , -0x0 , 0x926d , 0x0 , 0x948a , -0x0 , 0x8be9 , 0x0 , 0x0 , -0x0 , 0x925a , 0xe1e2 , 0x8bb8 , -0x0 , 0x0 , 0x0 , 0x90ce , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe1e3 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8dbb , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe1e4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe1e5 , 0x0 , -0x8ca4 , 0x8dd3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe1e7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9375 , 0x8dd4 , 0x8b6d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9643 , 0x0 , -0x946a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9376 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8d7b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe1e9 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8fc9 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x97b0 , -0x8d64 , 0x0 , 0x0 , 0x8ca5 , -0x0 , 0x0 , 0x94a1 , 0x0 , -0xe1eb , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe1ed , 0x0 , 0x0 , 0x0 , -0x0 , 0x8ce9 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe1ec , 0x92f4 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe1ef , 0x8a56 , 0xe1ea , 0x0 , -0x0 , 0x94e8 , 0x0 , 0x894f , -0x0 , 0x8dea , 0x0 , 0x9871 , -0x0 , 0x0 , 0xe1ee , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe1f0 , -0x0 , 0x0 , 0x0 , 0x95c9 , -0x0 , 0x90d7 , 0xe1f2 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe1f3 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe1f1 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8a6d , 0x0 , -0xe1f9 , 0x0 , 0xe1f8 , 0x0 , -0x0 , 0x8ea5 , 0x0 , 0x0 , -0x0 , 0xe1fa , 0xe1f5 , 0x0 , -0x0 , 0x0 , 0xe1fb , 0xe1f6 , -0x0 , 0x0 , 0x0 , 0x0 , -0x94d6 , 0xe1f4 , 0x0 , 0x0 , -0xe1f7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe241 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe240 , -0x9681 , 0x0 , 0x0 , 0x0 , -0xe1fc , 0x0 , 0x0 , 0x88e9 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe243 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe242 , 0x0 , 0x0 , -0x0 , 0x8fca , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe244 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9162 , 0x0 , -0x0 , 0xe246 , 0xe245 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe247 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe1e6 , 0x0 , -0x0 , 0x0 , 0xe1e8 , 0xe249 , -0xe248 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8ea6 , 0x0 , -0x97e7 , 0x0 , 0x8ed0 , 0x0 , -0xe24a , 0x8c56 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8b5f , -0x8b46 , 0x8e83 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9753 , 0x0 , 0x0 , 0xe250 , -0x0 , 0xe24f , 0x9163 , 0xe24c , -0x0 , 0x0 , 0xe24e , 0x0 , -0x0 , 0x8f6a , 0x905f , 0xe24d , -0xe24b , 0x0 , 0x9449 , 0x0 , -0x0 , 0x8fcb , 0x0 , 0x0 , -0x955b , 0x0 , 0x0 , 0x0 , -0x0 , 0x8dd5 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9398 , -0x0 , 0x0 , 0xe251 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe252 , -0xe268 , 0x8bd6 , 0x0 , 0x0 , -0x985c , 0x9154 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe253 , 0x0 , -0x0 , 0x89d0 , 0x92f5 , 0x959f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe254 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8b9a , 0xe255 , -0x0 , 0x0 , 0xe257 , 0x0 , -0x0 , 0x0 , 0xe258 , 0x0 , -0x9448 , 0x0 , 0x0 , 0xe259 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe25a , 0xe25b , 0x0 , -0x0 , 0x8bd7 , 0x89d1 , 0x93c3 , -0x8f47 , 0x8e84 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe25c , 0x0 , 0x8f48 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x89c8 , 0x9562 , 0x0 , -0x0 , 0xe25d , 0x0 , 0x0 , -0x94e9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9164 , -0x0 , 0xe260 , 0x0 , 0xe261 , -0x9489 , 0x0 , 0x9060 , 0xe25e , -0x0 , 0x9281 , 0x0 , 0x0 , -0xe25f , 0x0 , 0x0 , 0x0 , -0x8fcc , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x88da , -0x0 , 0x0 , 0x0 , 0x0 , -0x8b48 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe262 , 0x0 , 0x0 , 0x92f6 , -0x0 , 0xe263 , 0x90c5 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x96ab , 0x0 , 0x0 , 0x9542 , -0xe264 , 0xe265 , 0x9274 , 0x0 , -0x97c5 , 0x0 , 0x0 , 0xe267 , -0xe266 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8eed , 0x0 , -0x0 , 0xe269 , 0x88ee , 0x0 , -0x0 , 0x0 , 0x0 , 0xe26c , -0x0 , 0x0 , 0x0 , 0xe26a , -0x89d2 , 0x8c6d , 0xe26b , 0x8d65 , -0x8d92 , 0x0 , 0x95e4 , 0xe26d , -0x0 , 0x0 , 0x9673 , 0x0 , -0x0 , 0xe26f , 0x0 , 0x0 , -0x0 , 0x90cf , 0x896e , 0x89b8 , -0x88aa , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe26e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe270 , 0xe271 , 0x8ff5 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe272 , 0x0 , 0x8a6e , -0x0 , 0x0 , 0x0 , 0x0 , -0xe274 , 0x0 , 0x0 , 0x0 , -0x8c8a , 0x0 , 0x8b86 , 0x0 , -0x0 , 0xe275 , 0x8bf3 , 0x0 , -0x0 , 0xe276 , 0x0 , 0x90fa , -0x0 , 0x93cb , 0x0 , 0x90de , -0x8df3 , 0x0 , 0x0 , 0x0 , -0xe277 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9282 , 0x918b , -0x0 , 0xe279 , 0xe27b , 0xe278 , -0xe27a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8c41 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe27c , 0x8c45 , 0x0 , -0x0 , 0x0 , 0x8b87 , 0x9771 , -0xe27e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe280 , 0x0 , -0x0 , 0x0 , 0x894d , 0x0 , -0x0 , 0x0 , 0x0 , 0xe283 , -0x0 , 0x0 , 0x0 , 0x8a96 , -0xe282 , 0xe281 , 0x0 , 0xe285 , -0xe27d , 0x0 , 0xe286 , 0x97a7 , -0x0 , 0xe287 , 0x0 , 0xe288 , -0x0 , 0x0 , 0x9af2 , 0xe28a , -0x0 , 0xe289 , 0x0 , 0x0 , -0x0 , 0xe28b , 0xe28c , 0x0 , -0x97b3 , 0xe28d , 0x0 , 0xe8ed , -0x8fcd , 0xe28e , 0xe28f , 0x8f76 , -0x0 , 0x93b6 , 0xe290 , 0x0 , -0x0 , 0x0 , 0x9247 , 0x0 , -0x0 , 0xe291 , 0x0 , 0x925b , -0xe292 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8ba3 , 0x0 , -0x995e , 0x927c , 0x8eb1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8ac6 , -0x0 , 0x0 , 0xe293 , 0x0 , -0xe2a0 , 0x0 , 0xe296 , 0x0 , -0x8b88 , 0x0 , 0xe295 , 0xe2a2 , -0x0 , 0x0 , 0x0 , 0xe294 , -0x0 , 0x8fce , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe298 , 0xe299 , 0x0 , 0x934a , -0x0 , 0x0 , 0xe29a , 0x0 , -0x8a7d , 0x0 , 0x0 , 0x0 , -0x0 , 0x9079 , 0x9584 , 0x0 , -0xe29c , 0x0 , 0x0 , 0x0 , -0x91e6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe297 , -0x0 , 0xe29b , 0xe29d , 0x0 , -0x0 , 0x8df9 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe2a4 , 0x954d , 0x0 , -0x94a4 , 0x9399 , 0x0 , 0x8bd8 , -0xe2a3 , 0xe2a1 , 0x0 , 0x94b3 , -0xe29e , 0x927d , 0x939b , 0x0 , -0x939a , 0x0 , 0x8df4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe2b6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe2a6 , 0x0 , 0xe2a8 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe2ab , 0x0 , 0xe2ac , 0x0 , -0xe2a9 , 0xe2aa , 0x0 , 0x0 , -0xe2a7 , 0xe2a5 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe29f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x95cd , 0x89d3 , -0x0 , 0x0 , 0x0 , 0xe2b3 , -0x0 , 0xe2b0 , 0x0 , 0xe2b5 , -0x0 , 0x0 , 0xe2b4 , 0x0 , -0x9493 , 0x96a5 , 0x0 , 0x8e5a , -0xe2ae , 0xe2b7 , 0xe2b2 , 0x0 , -0xe2b1 , 0xe2ad , 0x0 , 0xe2af , -0x0 , 0x8ac7 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x925c , 0x0 , -0x0 , 0x90fb , 0x0 , 0x0 , -0x0 , 0x94a0 , 0x0 , 0x0 , -0xe2bc , 0x0 , 0x0 , 0x0 , -0x94a2 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x90df , 0xe2b9 , 0x0 , 0x0 , -0x94cd , 0x0 , 0xe2bd , 0x95d1 , -0x0 , 0x927a , 0x0 , 0xe2b8 , -0xe2ba , 0x0 , 0x0 , 0xe2bb , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe2be , 0x0 , 0x0 , -0x8ec2 , 0x0 , 0x0 , 0x0 , -0x93c4 , 0xe2c3 , 0xe2c2 , 0x0 , -0x0 , 0xe2bf , 0x0 , 0x0 , -0x0 , 0x9855 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe2c8 , -0x0 , 0x0 , 0xe2cc , 0xe2c9 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe2c5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe2c6 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe2cb , 0x0 , 0x0 , -0x0 , 0xe2c0 , 0x99d3 , 0xe2c7 , -0xe2c1 , 0x0 , 0x0 , 0xe2ca , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe2d0 , -0x0 , 0x8ac8 , 0x0 , 0xe2cd , -0x0 , 0x0 , 0x0 , 0xe2ce , -0x0 , 0x0 , 0xe2cf , 0xe2d2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe2d1 , -0x94f4 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe2d3 , 0x97fa , 0x95eb , -0xe2d8 , 0x0 , 0x0 , 0xe2d5 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe2d4 , 0x90d0 , 0x0 , 0xe2d7 , -0xe2d9 , 0x0 , 0x0 , 0x0 , -0xe2d6 , 0x0 , 0xe2dd , 0x0 , -0xe2da , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe2db , -0xe2c4 , 0x0 , 0x0 , 0x0 , -0xe2dc , 0xe2de , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe2df , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x95c4 , -0x0 , 0xe2e0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x96e0 , 0x0 , -0x0 , 0x8bcc , 0x8c48 , 0xe2e1 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x95b2 , 0x0 , 0x9088 , -0x0 , 0x96ae , 0x0 , 0x0 , -0xe2e2 , 0x0 , 0x97b1 , 0x0 , -0x0 , 0x9494 , 0x0 , 0x9165 , -0x9453 , 0x0 , 0x0 , 0x8f6c , -0x0 , 0x0 , 0x0 , 0x88be , -0x0 , 0xe2e7 , 0xe2e5 , 0x0 , -0xe2e3 , 0x8a9f , 0x0 , 0x8fcf , -0xe2e8 , 0x0 , 0x0 , 0xe2e6 , -0x0 , 0xe2e4 , 0xe2ec , 0x0 , -0x0 , 0xe2eb , 0xe2ea , 0xe2e9 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe2ed , 0x0 , 0x0 , -0x0 , 0xe2ee , 0x90b8 , 0x0 , -0xe2ef , 0x0 , 0xe2f1 , 0x0 , -0x0 , 0xe2f0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8cd0 , 0x0 , -0x0 , 0x0 , 0x9157 , 0x0 , -0x0 , 0x0 , 0xe2f3 , 0x0 , -0x0 , 0x0 , 0x939c , 0x0 , -0xe2f2 , 0x0 , 0x0 , 0x0 , -0xe2f4 , 0x0 , 0x95b3 , 0x918c , -0x8d66 , 0x0 , 0xe2f5 , 0x0 , -0x0 , 0x0 , 0x0 , 0x97c6 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe2f7 , -0x0 , 0x0 , 0xe2f8 , 0x0 , -0xe2f9 , 0x0 , 0xe2fa , 0x0 , -0x8e85 , 0x0 , 0xe2fb , 0x8c6e , -0x0 , 0x0 , 0x8b8a , 0x0 , -0x8b49 , 0x0 , 0xe340 , 0x0 , -0x96f1 , 0x8d67 , 0xe2fc , 0x0 , -0x0 , 0x0 , 0xe343 , 0x96e4 , -0x0 , 0x945b , 0x0 , 0x0 , -0x9552 , 0x0 , 0x0 , 0x0 , -0x8f83 , 0xe342 , 0x0 , 0x8ed1 , -0x8d68 , 0x8e86 , 0x8b89 , 0x95b4 , -0xe341 , 0x0 , 0x0 , 0x0 , -0x9166 , 0x9661 , 0x8df5 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8e87 , -0x92db , 0x0 , 0xe346 , 0x97dd , -0x8dd7 , 0x0 , 0xe347 , 0x9061 , -0x0 , 0xe349 , 0x0 , 0x0 , -0x0 , 0x8fd0 , 0x8dae , 0x0 , -0x0 , 0x0 , 0x0 , 0xe348 , -0x0 , 0x0 , 0x8f49 , 0x8cbc , -0x9167 , 0xe344 , 0xe34a , 0x0 , -0x0 , 0x0 , 0x0 , 0xe345 , -0x8c6f , 0x0 , 0xe34d , 0xe351 , -0x8c8b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe34c , 0x0 , -0x0 , 0x0 , 0x0 , 0xe355 , -0x0 , 0x0 , 0x8d69 , 0x0 , -0x0 , 0x978d , 0x88ba , 0xe352 , -0x0 , 0x0 , 0x8b8b , 0x0 , -0xe34f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe350 , 0x0 , -0x0 , 0x939d , 0xe34e , 0xe34b , -0x0 , 0x8a47 , 0x90e2 , 0x0 , -0x0 , 0x8ca6 , 0x0 , 0x0 , -0x0 , 0xe357 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe354 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe356 , -0x0 , 0x0 , 0x0 , 0xe353 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8c70 , 0x91b1 , 0xe358 , -0x918e , 0x0 , 0x0 , 0xe365 , -0x0 , 0x0 , 0xe361 , 0xe35b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe35f , -0x8ef8 , 0x88db , 0xe35a , 0xe362 , -0xe366 , 0x8d6a , 0x96d4 , 0x0 , -0x92d4 , 0xe35c , 0x0 , 0x0 , -0xe364 , 0x0 , 0xe359 , 0x925d , -0x0 , 0xe35e , 0x88bb , 0x96c8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe35d , -0x0 , 0x0 , 0x8bd9 , 0x94ea , -0x0 , 0x0 , 0x0 , 0x918d , -0x0 , 0x97ce , 0x8f8f , 0x0 , -0x0 , 0xe38e , 0x0 , 0x0 , -0xe367 , 0x0 , 0x90fc , 0x0 , -0xe363 , 0xe368 , 0xe36a , 0x0 , -0x92f7 , 0xe36d , 0x0 , 0x0 , -0xe369 , 0x0 , 0x0 , 0x0 , -0x95d2 , 0x8ac9 , 0x0 , 0x0 , -0x96c9 , 0x0 , 0x0 , 0x88dc , -0x0 , 0x0 , 0xe36c , 0x0 , -0x97fb , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe36b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x898f , 0x0 , 0x0 , -0x93ea , 0xe36e , 0x0 , 0x0 , -0x0 , 0xe375 , 0xe36f , 0xe376 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe372 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x949b , -0x0 , 0x0 , 0x8ec8 , 0xe374 , -0x0 , 0xe371 , 0xe377 , 0xe370 , -0x0 , 0x0 , 0x8f63 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9644 , -0x0 , 0x0 , 0x8f6b , 0x0 , -0x0 , 0xe373 , 0xe380 , 0x0 , -0x0 , 0xe37b , 0x0 , 0xe37e , -0x0 , 0xe37c , 0xe381 , 0xe37a , -0x0 , 0xe360 , 0x90d1 , 0x0 , -0x0 , 0x94c9 , 0x0 , 0xe37d , -0x0 , 0x0 , 0xe378 , 0x0 , -0x0 , 0x0 , 0x9140 , 0x8c71 , -0x0 , 0x8f4a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9044 , 0x9155 , 0xe384 , 0x0 , -0x0 , 0xe386 , 0xe387 , 0x0 , -0x0 , 0xe383 , 0xe385 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe379 , 0xe382 , -0x0 , 0xe38a , 0xe389 , 0x0 , -0x0 , 0x969a , 0x0 , 0x0 , -0x8c4a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe388 , 0x0 , 0xe38c , -0xe38b , 0xe38f , 0x0 , 0xe391 , -0x0 , 0x0 , 0x8e5b , 0xe38d , -0x0 , 0x0 , 0x0 , 0x0 , -0xe392 , 0xe393 , 0x0 , 0x0 , -0xe394 , 0x0 , 0xe39a , 0x935a , -0xe396 , 0x0 , 0xe395 , 0xe397 , -0xe398 , 0x0 , 0xe399 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe39b , -0xe39c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8aca , 0x0 , -0xe39d , 0x0 , 0xe39e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe39f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe3a0 , 0xe3a1 , 0xe3a2 , 0x0 , -0xe3a3 , 0xe3a4 , 0x0 , 0x0 , -0xe3a6 , 0xe3a5 , 0x0 , 0x0 , -0xe3a7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe3a8 , -0xe3a9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe3ac , -0xe3aa , 0xe3ab , 0x8ddf , 0x8c72 , -0x0 , 0x0 , 0x9275 , 0x0 , -0x94b1 , 0x0 , 0x8f90 , 0x0 , -0x0 , 0x946c , 0x0 , 0x94eb , -0xe3ad , 0x9ceb , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe3ae , 0xe3b0 , -0x0 , 0x9785 , 0xe3af , 0xe3b2 , -0xe3b1 , 0x0 , 0x9772 , 0x0 , -0xe3b3 , 0x0 , 0x94fc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe3b4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe3b7 , 0x0 , -0x0 , 0xe3b6 , 0xe3b5 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe3b8 , -0x8c51 , 0x0 , 0x0 , 0x0 , -0x9141 , 0x8b60 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe3bc , 0xe3b9 , -0x0 , 0x0 , 0xe3ba , 0x0 , -0x0 , 0x0 , 0xe3bd , 0x0 , -0xe3be , 0xe3bb , 0x0 , 0x0 , -0x0 , 0x8948 , 0x0 , 0x0 , -0x0 , 0x89a5 , 0x0 , 0x0 , -0x0 , 0xe3c0 , 0xe3c1 , 0x0 , -0x0 , 0x0 , 0xe3c2 , 0x0 , -0x9782 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8f4b , 0x0 , -0xe3c4 , 0xe3c3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9089 , 0xe3c5 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe3c6 , 0x0 , -0x0 , 0xe3c7 , 0x0 , 0x8ae3 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8acb , 0x0 , 0x0 , 0xe3c8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe3c9 , 0x0 , 0x967c , -0x9783 , 0x0 , 0x0 , 0x0 , -0x9773 , 0x9856 , 0x0 , 0x8d6c , -0xe3cc , 0x8ed2 , 0xe3cb , 0x0 , -0x0 , 0x0 , 0x0 , 0xe3cd , -0x8ea7 , 0x0 , 0x0 , 0x0 , -0x91cf , 0x0 , 0xe3ce , 0x0 , -0x0 , 0x8d6b , 0x0 , 0x96d5 , -0xe3cf , 0xe3d0 , 0x0 , 0x0 , -0xe3d1 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe3d2 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe3d3 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8ea8 , -0x0 , 0x0 , 0x96eb , 0x0 , -0x0 , 0x0 , 0x0 , 0xe3d5 , -0x0 , 0x925e , 0x0 , 0xe3d4 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe3d7 , 0x0 , -0x0 , 0x0 , 0xe3d6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe3d8 , 0x0 , -0x0 , 0x0 , 0x90b9 , 0x0 , -0xe3d9 , 0x0 , 0xe3da , 0x0 , -0x0 , 0x0 , 0x95b7 , 0xe3db , -0x0 , 0x918f , 0xe3dc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe3dd , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x97fc , -0xe3e0 , 0x0 , 0xe3df , 0xe3de , -0x92ae , 0x0 , 0xe3e1 , 0x9045 , -0x0 , 0xe3e2 , 0x0 , 0x0 , -0x0 , 0xe3e3 , 0x9857 , 0xe3e4 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe3e5 , 0xe3e7 , 0xe3e6 , 0x94a3 , -0x0 , 0x93f7 , 0x0 , 0x985d , -0x94a7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe3e9 , -0x0 , 0x0 , 0x8fd1 , 0x0 , -0x9549 , 0x0 , 0xe3ea , 0xe3e8 , -0x0 , 0x8acc , 0x0 , 0x0 , -0x0 , 0x8cd2 , 0x8e88 , 0x0 , -0x0 , 0x94ec , 0x0 , 0x0 , -0x0 , 0x8ca8 , 0x9662 , 0x0 , -0xe3ed , 0xe3eb , 0x0 , 0x8d6d , -0x0 , 0x8d6e , 0x88e7 , 0x0 , -0x8de6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9478 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x88dd , -0xe3f2 , 0x0 , 0x925f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9477 , 0x0 , 0x91d9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe3f4 , 0x0 , -0x0 , 0xe3f0 , 0xe3f3 , 0xe3ee , -0x0 , 0xe3f1 , 0x9645 , 0x0 , -0x0 , 0x8cd3 , 0x0 , 0x0 , -0x88fb , 0xe3ef , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe3f6 , -0x0 , 0xe3f7 , 0x0 , 0x0 , -0x93b7 , 0x0 , 0x0 , 0x0 , -0x8bb9 , 0x0 , 0x0 , 0x0 , -0xe445 , 0x945c , 0x0 , 0x0 , -0x0 , 0x0 , 0x8e89 , 0x0 , -0x0 , 0x8bba , 0x90c6 , 0x9865 , -0x96ac , 0xe3f5 , 0x90d2 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8b72 , 0xe3f8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe3fa , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe3f9 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe3fb , -0x0 , 0x9245 , 0x0 , 0x945d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x92af , 0x0 , 0x0 , -0x0 , 0x0 , 0xe442 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe441 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe3fc , -0x0 , 0x0 , 0x9074 , 0x0 , -0x9585 , 0xe444 , 0x0 , 0xe443 , -0x8d6f , 0x9872 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe454 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe448 , 0xe449 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8eee , -0x0 , 0x0 , 0xe447 , 0x0 , -0x8d98 , 0xe446 , 0x0 , 0x0 , -0xe44a , 0x0 , 0x0 , 0x0 , -0x92b0 , 0x95a0 , 0x9142 , 0x0 , -0x0 , 0x0 , 0x0 , 0x91da , -0xe44e , 0x0 , 0xe44f , 0xe44b , -0x0 , 0x0 , 0x0 , 0x0 , -0xe44c , 0x0 , 0xe44d , 0x0 , -0x0 , 0x0 , 0x0 , 0x8d70 , -0x0 , 0x0 , 0x0 , 0xe455 , -0x0 , 0xe451 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9586 , 0x0 , -0x968c , 0x9547 , 0x0 , 0x0 , -0xe450 , 0x0 , 0x0 , 0xe453 , -0xe452 , 0x0 , 0x0 , 0x0 , -0x9663 , 0xe456 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe457 , 0x0 , 0x0 , 0x9156 , -0x0 , 0xe458 , 0x0 , 0x0 , -0xe45a , 0x0 , 0xe45e , 0x0 , -0x0 , 0xe45b , 0xe459 , 0x945e , -0xe45c , 0x0 , 0xe45d , 0x0 , -0x0 , 0x0 , 0x89b0 , 0x0 , -0xe464 , 0xe45f , 0x0 , 0x0 , -0x0 , 0xe460 , 0x0 , 0x0 , -0x0 , 0xe461 , 0x0 , 0x919f , -0x0 , 0x0 , 0x0 , 0x0 , -0xe463 , 0xe462 , 0xe465 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe466 , -0xe467 , 0x0 , 0x0 , 0x9062 , -0x0 , 0x89e7 , 0x0 , 0xe468 , -0x97d5 , 0x0 , 0x8ea9 , 0x0 , -0x0 , 0x8f4c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8e8a , -0x9276 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe469 , 0xe46a , -0x8950 , 0x0 , 0xe46b , 0x0 , -0x0 , 0xe46c , 0xe46d , 0x0 , -0x0 , 0xe46e , 0x0 , 0xe46f , -0x8bbb , 0x9da8 , 0xe470 , 0x0 , -0x90e3 , 0xe471 , 0x8ec9 , 0x0 , -0xe472 , 0x0 , 0x98ae , 0x0 , -0x0 , 0x0 , 0xe473 , 0x95dc , -0x8ada , 0x0 , 0x0 , 0x9143 , -0x8f77 , 0x0 , 0x9591 , 0x8f4d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe474 , 0x8d71 , 0xe475 , -0x94ca , 0x0 , 0xe484 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe477 , -0x0 , 0x91c7 , 0x9495 , 0x8cbd , -0xe476 , 0x9144 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe478 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x92f8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe47a , 0xe479 , 0xe47c , 0x0 , -0x0 , 0xe47b , 0x0 , 0xe47d , -0x0 , 0x0 , 0xe480 , 0x0 , -0xe47e , 0x0 , 0x8acd , 0x0 , -0xe481 , 0x0 , 0xe482 , 0xe483 , -0x0 , 0x0 , 0x8daf , 0x97c7 , -0x0 , 0xe485 , 0x9046 , 0x0 , -0x0 , 0x0 , 0x8990 , 0xe486 , -0xe487 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe488 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x88f0 , -0x0 , 0xe489 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe48a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9587 , 0x0 , 0x0 , -0x0 , 0x8ec5 , 0x0 , 0xe48c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8a48 , 0x88b0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe48b , -0xe48e , 0x946d , 0x0 , 0x9063 , -0x0 , 0x89d4 , 0x0 , 0x9646 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8c7c , 0x8bda , 0x0 , 0xe48d , -0x0 , 0x89e8 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8aa1 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8991 , 0xe492 , 0x97e8 , -0x91db , 0x0 , 0x0 , 0x9563 , -0x0 , 0xe49e , 0x0 , 0x89d5 , -0xe49c , 0x0 , 0xe49a , 0xe491 , -0x0 , 0xe48f , 0x0 , 0xe490 , -0x0 , 0x8ee1 , 0x8bea , 0x9297 , -0x0 , 0x0 , 0x0 , 0x93cf , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8970 , 0x0 , 0xe494 , -0xe493 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe499 , 0xe495 , 0xe498 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x96ce , 0xe497 , -0x89d6 , 0x8a9d , 0xe49b , 0x0 , -0x0 , 0xe49d , 0x0 , 0x0 , -0x0 , 0x0 , 0x8c73 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe4a1 , 0xe4aa , -0xe4ab , 0x0 , 0x0 , 0x0 , -0x88a9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe4b2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x88ef , 0x0 , 0x0 , 0xe4a9 , -0x0 , 0x0 , 0x0 , 0xe4a8 , -0x0 , 0xe4a3 , 0xe4a2 , 0x0 , -0xe4a0 , 0xe49f , 0x9283 , 0x0 , -0x91f9 , 0xe4a5 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe4a4 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe4a7 , 0x0 , 0x0 , -0x0 , 0x9190 , 0x8c74 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8960 , -0xe4a6 , 0x0 , 0x8d72 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9191 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe4b8 , -0x0 , 0xe4b9 , 0x0 , 0x89d7 , -0x0 , 0x0 , 0x0 , 0x89ac , -0xe4b6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe4ac , 0x0 , 0xe4b4 , -0x0 , 0xe4bb , 0xe4b5 , 0x0 , -0x0 , 0x0 , 0xe4b3 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe496 , -0x0 , 0x0 , 0xe4b1 , 0x0 , -0x0 , 0x0 , 0xe4ad , 0x0 , -0x0 , 0x0 , 0x8ace , 0xe4af , -0xe4ba , 0x0 , 0xe4b0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe4bc , 0x0 , 0xe4ae , 0x949c , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9789 , 0x0 , 0x0 , -0x0 , 0xe4b7 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe4cd , 0x0 , 0x0 , -0x0 , 0xe4c5 , 0x0 , 0x0 , -0x0 , 0x909b , 0x0 , 0x0 , -0x0 , 0x0 , 0x8b65 , 0x0 , -0x8bdb , 0x0 , 0xe4c0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x89d9 , -0x0 , 0x0 , 0x8fd2 , 0x0 , -0xe4c3 , 0x0 , 0x0 , 0x0 , -0x8dd8 , 0x0 , 0x0 , 0x9370 , -0xe4c8 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x95ec , 0x0 , 0xe4bf , -0x0 , 0x0 , 0x0 , 0x89d8 , -0x8cd4 , 0x9548 , 0xe4c9 , 0x0 , -0xe4bd , 0x0 , 0x0 , 0xe4c6 , -0x0 , 0x0 , 0x0 , 0xe4d0 , -0x0 , 0xe4c1 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe4c2 , -0x93b8 , 0x0 , 0x0 , 0xe4c7 , -0x0 , 0x0 , 0x0 , 0xe4c4 , -0x9647 , 0xe4ca , 0x88de , 0x0 , -0x0 , 0x0 , 0x0 , 0xe4be , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe4cc , 0x0 , 0xe4cb , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x948b , 0xe4d2 , 0x0 , -0xe4dd , 0x0 , 0x0 , 0x0 , -0x0 , 0x8a9e , 0x0 , 0x0 , -0x0 , 0xe4e0 , 0x0 , 0x0 , -0xe4ce , 0x0 , 0x0 , 0x0 , -0xe4d3 , 0x978e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe4dc , 0x0 , -0x0 , 0x9774 , 0x0 , 0x0 , -0x0 , 0x0 , 0x97a8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9298 , -0x0 , 0x0 , 0x0 , 0x8a8b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9592 , 0xe4e2 , 0x939f , -0x0 , 0x0 , 0x88af , 0x0 , -0x0 , 0xe4db , 0x0 , 0xe4d7 , -0x9192 , 0xe4d1 , 0xe4d9 , 0xe4de , -0x0 , 0x944b , 0x0 , 0x0 , -0x0 , 0x88a8 , 0x0 , 0xe4d6 , -0x0 , 0xe4df , 0x9598 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe4da , 0x0 , -0xe4d5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8fd3 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8f4e , 0x0 , 0x0 , 0x0 , -0x8eaa , 0x0 , 0x0 , 0x0 , -0x0 , 0x96d6 , 0x0 , 0x0 , -0x9566 , 0x0 , 0x0 , 0xe4e5 , -0x0 , 0xe4ee , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe4d8 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8a97 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8ff6 , 0xe4e3 , 0x0 , 0xe4e8 , -0x9193 , 0x0 , 0x0 , 0xe4e4 , -0x0 , 0xe4eb , 0x0 , 0x0 , -0x927e , 0x0 , 0xe4ec , 0x0 , -0x0 , 0x9775 , 0xe4e1 , 0x8a57 , -0x0 , 0xe4e7 , 0x0 , 0x0 , -0xe4ea , 0x96aa , 0x0 , 0x0 , -0x0 , 0x0 , 0xe4ed , 0x0 , -0x0 , 0xe4e6 , 0xe4e9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9648 , 0x0 , 0x9840 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe4f1 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe4f8 , 0x0 , 0x0 , 0xe4f0 , -0x8ec1 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe4cf , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x95cc , 0x0 , 0x96a0 , -0xe4f7 , 0xe4f6 , 0x0 , 0xe4f2 , -0xe4f3 , 0x0 , 0x8955 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe4f5 , -0x0 , 0xe4ef , 0x0 , 0x0 , -0x0 , 0x0 , 0x92d3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe4f4 , 0x88fc , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x91a0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x95c1 , 0x0 , 0x0 , -0xe4f9 , 0xe540 , 0x0 , 0x94d7 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe4fc , 0x8fd4 , 0x8ec7 , 0xe542 , -0x0 , 0x0 , 0x8bbc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe543 , 0x0 , 0x9599 , -0xe4fb , 0x0 , 0xe4d4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe4fa , -0x0 , 0x0 , 0x0 , 0x0 , -0x986e , 0x93a0 , 0x9593 , 0x0 , -0x0 , 0xe54a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe550 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe551 , 0x0 , -0xe544 , 0x0 , 0x0 , 0x0 , -0x9496 , 0x0 , 0x0 , 0xe54e , -0xe546 , 0x0 , 0xe548 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe552 , 0xe547 , 0x0 , 0x0 , -0xe54b , 0x0 , 0x0 , 0x8992 , -0x0 , 0x93e3 , 0x0 , 0xe54c , -0xe54f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe545 , 0x0 , 0x9145 , 0x0 , -0xe549 , 0x8e46 , 0x9064 , 0x8c4f , -0x96f2 , 0x0 , 0x96f7 , 0x8f92 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe556 , 0xe554 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x986d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe553 , 0x0 , 0x0 , -0x0 , 0x9795 , 0x0 , 0xe555 , -0xe557 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe558 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe55b , 0xe559 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x93a1 , 0xe55a , 0x0 , 0x0 , -0x0 , 0x94cb , 0xe54d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8f93 , -0x0 , 0xe55c , 0xe561 , 0x9194 , -0x0 , 0x0 , 0xe560 , 0x0 , -0x0 , 0x0 , 0xe541 , 0x0 , -0x0 , 0x0 , 0xe562 , 0x9168 , -0x0 , 0x0 , 0xe55d , 0xe55f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe55e , -0x0 , 0x0 , 0x9f50 , 0x9f41 , -0x0 , 0x0 , 0xe564 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe563 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9796 , 0x0 , 0xe1ba , -0xe565 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe566 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe567 , 0x8cd5 , 0x0 , -0x8b73 , 0x0 , 0x0 , 0x0 , -0xe569 , 0x997c , 0x0 , 0x0 , -0x0 , 0x0 , 0x8b95 , 0x0 , -0x97b8 , 0x0 , 0x8bf1 , 0xe56a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe56b , -0x0 , 0x0 , 0x0 , 0x928e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe56c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x93f8 , 0x0 , 0x88b8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x89e1 , 0xe571 , -0xe572 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe56d , -0x0 , 0x8e5c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe56e , -0x9461 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe56f , 0xe570 , 0xe57a , -0x0 , 0x0 , 0x0 , 0xe574 , -0xe577 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe573 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe575 , 0x0 , 0xe576 , 0x8ed6 , -0x0 , 0xe578 , 0x0 , 0x9260 , -0x0 , 0x8c75 , 0x8a61 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe57b , 0x0 , 0x0 , 0x0 , -0x0 , 0x8a5e , 0x0 , 0xe581 , -0x0 , 0x0 , 0xe57c , 0xe580 , -0x0 , 0x0 , 0x0 , 0x0 , -0x94b8 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe57d , 0x0 , 0x0 , -0xe57e , 0x9567 , 0x94d8 , 0xe582 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x91fb , 0xe58c , 0x0 , 0xe588 , -0x0 , 0x0 , 0x89e9 , 0x0 , -0xe586 , 0x0 , 0x9649 , 0xe587 , -0x0 , 0x0 , 0xe584 , 0x0 , -0xe585 , 0xe58a , 0xe58d , 0x0 , -0x0 , 0xe58b , 0x0 , 0x0 , -0x0 , 0xe589 , 0xe583 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9277 , 0x0 , 0xe594 , 0x0 , -0x96a8 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe592 , 0x0 , 0x0 , -0x0 , 0xe593 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe58e , 0x0 , 0x0 , 0xe590 , -0x0 , 0x0 , 0x0 , 0xe591 , -0x0 , 0x0 , 0x0 , 0xe58f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x90e4 , 0x0 , 0x9858 , -0xe598 , 0x0 , 0xe599 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe59f , -0x0 , 0x9049 , 0x0 , 0xe59b , -0x0 , 0xe59e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe596 , -0xe595 , 0x0 , 0x0 , 0xe5a0 , -0x0 , 0x0 , 0x89da , 0x0 , -0xe59c , 0x0 , 0xe5a1 , 0x0 , -0x0 , 0x0 , 0xe59d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe59a , 0x0 , 0x92b1 , 0x0 , -0xe597 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9488 , -0x0 , 0x0 , 0xe5a5 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x975a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe5a4 , -0x0 , 0x0 , 0xe5a3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe5ac , -0x0 , 0x0 , 0x0 , 0xe5a6 , -0x0 , 0x0 , 0x0 , 0xe5ae , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9786 , 0xe5b1 , -0x0 , 0xe5a8 , 0x0 , 0x0 , -0xe5a9 , 0x0 , 0x0 , 0x0 , -0xe5ad , 0x0 , 0xe5b0 , 0xe5af , -0x0 , 0x0 , 0x0 , 0xe5a7 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe5aa , 0x0 , 0xe5bb , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe5b4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe5b2 , -0x0 , 0x0 , 0xe5b3 , 0x0 , -0x0 , 0x0 , 0xe5b8 , 0xe5b9 , -0x0 , 0x8a49 , 0x0 , 0x8b61 , -0x0 , 0x0 , 0xe5b7 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe5a2 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe5b6 , 0xe5ba , 0xe5b5 , -0x0 , 0xe5bc , 0x0 , 0x0 , -0x0 , 0xe5be , 0xe5bd , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe5c0 , 0xe5bf , 0xe579 , -0x0 , 0x0 , 0x0 , 0xe5c4 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe5c1 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe5c2 , 0x0 , -0x0 , 0xe5c3 , 0x0 , 0xe5c5 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8c8c , 0x0 , 0xe5c7 , 0x0 , -0xe5c6 , 0x0 , 0x8f4f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8d73 , 0x9fa5 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe5c8 , 0x8f70 , -0x0 , 0x0 , 0x0 , 0x8a58 , -0x0 , 0xe5c9 , 0x0 , 0x8971 , -0x0 , 0x8fd5 , 0xe5ca , 0x0 , -0x0 , 0x8d74 , 0xe5cb , 0x88df , -0x0 , 0x0 , 0x0 , 0x0 , -0x955c , 0x0 , 0x0 , 0xe5cc , -0x0 , 0x0 , 0x0 , 0x0 , -0x908a , 0x0 , 0xe5d3 , 0x0 , -0x0 , 0xe5d0 , 0x0 , 0x928f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe5d1 , 0xe5ce , 0x8bdc , -0x0 , 0xe5cd , 0xe5d4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8c55 , 0x0 , 0x0 , 0x91dc , -0x0 , 0xe5da , 0x0 , 0x0 , -0x0 , 0x0 , 0xe5d6 , 0x0 , -0x0 , 0x0 , 0x91b3 , 0xe5d5 , -0x0 , 0xe5d8 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe5cf , 0x0 , -0x0 , 0x0 , 0xe5d9 , 0x0 , -0xe5db , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x94ed , -0x0 , 0x0 , 0xe5d7 , 0x0 , -0xe5dc , 0xe5de , 0x0 , 0x0 , -0x8cd1 , 0xe5d2 , 0x0 , 0x88bf , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe5dd , -0x0 , 0x8dd9 , 0x97f4 , 0xe5df , -0xe5e0 , 0x9195 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x97a0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe5e1 , 0x9754 , 0x0 , 0x0 , -0xe5e2 , 0xe5e3 , 0x0 , 0x0 , -0x95e2 , 0xe5e4 , 0x0 , 0x8dbe , -0x0 , 0x97a1 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe5e9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe5ea , 0x8fd6 , -0xe5e8 , 0x0 , 0x0 , 0x0 , -0x9787 , 0xe5e5 , 0x0 , 0x0 , -0xe5e7 , 0x90bb , 0x909e , 0x0 , -0x0 , 0x0 , 0xe5e6 , 0x0 , -0xe5eb , 0x0 , 0x0 , 0x95a1 , -0x0 , 0x0 , 0xe5ed , 0x0 , -0xe5ec , 0x0 , 0x0 , 0x0 , -0x8a8c , 0x0 , 0x964a , 0xe5ee , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe5fa , 0xe5f0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe5f1 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe5f2 , 0xe5f3 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe5f7 , 0x0 , -0xe5f8 , 0x0 , 0x0 , 0xe5f6 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe5f4 , 0x0 , 0xe5ef , -0xe5f5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe5f9 , 0xe8b5 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x89a6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe5fc , 0x8bdd , -0xe5fb , 0x0 , 0x0 , 0x0 , -0xe641 , 0x0 , 0xe640 , 0x0 , -0x0 , 0x0 , 0xe643 , 0x0 , -0x0 , 0xe642 , 0x0 , 0xe644 , -0x0 , 0x0 , 0x8f50 , 0x0 , -0xe645 , 0x0 , 0x0 , 0xe646 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe647 , 0x90bc , -0x0 , 0x9776 , 0x0 , 0xe648 , -0x0 , 0x0 , 0x95a2 , 0x9465 , -0xe649 , 0x0 , 0xe64a , 0x8ca9 , -0x0 , 0x0 , 0x0 , 0x8b4b , -0x0 , 0x0 , 0x0 , 0xe64b , -0x0 , 0x0 , 0x8e8b , 0x9460 , -0xe64c , 0x0 , 0x8a6f , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe64d , 0x0 , 0x0 , -0x0 , 0x0 , 0xe64f , 0x9797 , -0x0 , 0xe64e , 0x9065 , 0x0 , -0xe650 , 0x0 , 0x0 , 0xe651 , -0x0 , 0x0 , 0xe652 , 0x8acf , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe653 , 0x0 , -0x0 , 0xe654 , 0x0 , 0xe655 , -0xe656 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8a70 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe657 , 0x0 , -0xe658 , 0xe659 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x89f0 , -0x0 , 0x0 , 0x9047 , 0xe65a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe65b , 0x0 , 0x0 , 0x0 , -0xe65c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8cbe , 0x0 , 0x92f9 , 0xe65d , -0x0 , 0x0 , 0x0 , 0x0 , -0x8c76 , 0x0 , 0x9075 , 0x0 , -0xe660 , 0x0 , 0x93a2 , 0x0 , -0xe65f , 0x0 , 0x0 , 0x8c50 , -0x0 , 0x0 , 0xe65e , 0x91f5 , -0x8b4c , 0x0 , 0x0 , 0xe661 , -0x0 , 0xe662 , 0x0 , 0x8fd7 , -0x0 , 0x0 , 0x0 , 0x8c8d , -0x0 , 0xe663 , 0x0 , 0x0 , -0x0 , 0x0 , 0x964b , 0x0 , -0x0 , 0x90dd , 0x0 , 0x0 , -0x0 , 0x8b96 , 0x0 , 0x96f3 , -0x9169 , 0x0 , 0xe664 , 0x0 , -0x0 , 0x0 , 0x9066 , 0x9290 , -0x8fd8 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe665 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe668 , 0x0 , -0xe669 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8dbc , 0x91c0 , 0xe667 , 0x0 , -0x8fd9 , 0x955d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe666 , -0x0 , 0x0 , 0x8e8c , 0x0 , -0x8972 , 0x0 , 0xe66d , 0x8c77 , -0x0 , 0x0 , 0x8e8e , 0x0 , -0x0 , 0x8e8d , 0x0 , 0x986c , -0xe66c , 0xe66b , 0x9146 , 0x0 , -0x8b6c , 0x9862 , 0x8a59 , 0x8fda , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe66a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe66f , 0x0 , -0xe670 , 0xe66e , 0x0 , 0x8cd6 , -0x0 , 0x975f , 0x0 , 0x0 , -0x8e8f , 0x9446 , 0x0 , 0x0 , -0x0 , 0xe673 , 0x0 , 0x90be , -0x0 , 0x9261 , 0x0 , 0x0 , -0x9755 , 0x0 , 0xe676 , 0x0 , -0x0 , 0x0 , 0x8cea , 0x0 , -0x90bd , 0xe672 , 0x0 , 0xe677 , -0x8ceb , 0xe674 , 0xe675 , 0x0 , -0xe671 , 0x0 , 0x0 , 0x0 , -0x90e0 , 0x93c7 , 0x0 , 0x0 , -0x924e , 0x0 , 0x89db , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x94ee , 0x0 , 0x0 , -0x8b62 , 0x0 , 0x0 , 0x92b2 , -0x0 , 0x0 , 0xe67a , 0x0 , -0xe678 , 0x0 , 0x0 , 0x926b , -0x0 , 0x0 , 0x0 , 0x90bf , -0x8ad0 , 0xe679 , 0x0 , 0x907a , -0x0 , 0x0 , 0x97c8 , 0x0 , -0x0 , 0x0 , 0x985f , 0x0 , -0x0 , 0x0 , 0xe67b , 0xe687 , -0x92b3 , 0x0 , 0xe686 , 0x0 , -0xe683 , 0xe68b , 0xe684 , 0x0 , -0xe680 , 0x0 , 0x92fa , 0xe67e , -0x0 , 0x0 , 0x0 , 0xe67c , -0x0 , 0x9740 , 0x8e90 , 0x0 , -0x0 , 0xe681 , 0x0 , 0xe67d , -0x0 , 0x0 , 0x0 , 0xe685 , -0x8f94 , 0x0 , 0x8cbf , 0x0 , -0x0 , 0x0 , 0x91f8 , 0x0 , -0x9664 , 0x8979 , 0x88e0 , 0x0 , -0x93a3 , 0x0 , 0x0 , 0xe689 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe688 , 0x0 , 0x93e4 , 0x0 , -0xe68d , 0x0 , 0x0 , 0x0 , -0xe682 , 0x0 , 0xe68c , 0xe68e , -0x0 , 0x8caa , 0xe68a , 0x8d75 , -0x0 , 0x8ed3 , 0x0 , 0x0 , -0xe68f , 0x9777 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe692 , 0x0 , -0xe695 , 0x0 , 0x0 , 0xe693 , -0x9554 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe690 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8bde , 0x0 , 0x0 , -0x0 , 0x0 , 0xe694 , 0x0 , -0x0 , 0xe696 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe69a , 0x0 , 0x0 , -0xe697 , 0x0 , 0xe699 , 0xe698 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe69b , 0x0 , -0x8eaf , 0x0 , 0xe69d , 0xe69c , -0x9588 , 0x0 , 0x0 , 0xe69f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8c78 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe69e , -0xe6a0 , 0x0 , 0x0 , 0xe6a1 , -0x8b63 , 0xe3bf , 0x8ff7 , 0x0 , -0xe6a2 , 0x0 , 0x0 , 0x8cec , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe6a3 , 0x0 , 0x0 , -0xe6a4 , 0x0 , 0x0 , 0x8e5d , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9dcc , 0x0 , -0xe6a5 , 0x0 , 0xe6a6 , 0x0 , -0x8f51 , 0x0 , 0xe6a7 , 0xe6a8 , -0x0 , 0x0 , 0xe6a9 , 0x0 , -0x0 , 0xe6aa , 0xe6ab , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x924a , -0x0 , 0x0 , 0xe6ac , 0x0 , -0x0 , 0x0 , 0x0 , 0xe6ae , -0x0 , 0xe6ad , 0x0 , 0x0 , -0x0 , 0x0 , 0x93a4 , 0x0 , -0xe6af , 0x0 , 0x964c , 0x0 , -0xe6b0 , 0x0 , 0xe6b1 , 0x0 , -0xe6b2 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe6b3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x93d8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8fdb , 0xe6b4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8d8b , 0x98ac , -0xe6b5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe6b6 , 0x955e , 0xe6b7 , 0x0 , -0xe6bf , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe6b8 , 0x0 , -0x0 , 0xe6ba , 0x0 , 0x0 , -0x0 , 0xe6b9 , 0xe6bb , 0x0 , -0x9665 , 0xe6bc , 0xe6bd , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe6be , 0x0 , 0x0 , 0x0 , -0xe6c0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8a4c , 0x92e5 , 0x0 , -0x9589 , 0x8de0 , 0x8d76 , 0x0 , -0x0 , 0x0 , 0x0 , 0x956e , -0x89dd , 0x94cc , 0xe6c3 , 0x8ad1 , -0x90d3 , 0xe6c2 , 0xe6c7 , 0x9299 , -0x96e1 , 0x0 , 0xe6c5 , 0xe6c6 , -0x8b4d , 0x0 , 0xe6c8 , 0x9483 , -0x91dd , 0x0 , 0x0 , 0x94ef , -0x935c , 0xe6c4 , 0x0 , 0x9666 , -0x89ea , 0xe6ca , 0x9847 , 0x92c0 , -0x9864 , 0x0 , 0x0 , 0x8e91 , -0xe6c9 , 0x0 , 0x91af , 0x0 , -0x0 , 0xe6da , 0x9147 , 0x0 , -0x0 , 0x93f6 , 0x0 , 0x956f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe6cd , 0x8e5e , -0x8e92 , 0x0 , 0x8fdc , 0x0 , -0x9485 , 0x0 , 0x8cab , 0xe6cc , -0xe6cb , 0x0 , 0x958a , 0x0 , -0x0 , 0x0 , 0x8ebf , 0x0 , -0x0 , 0x9371 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe6cf , 0xe6d0 , -0x8d77 , 0xe6ce , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe6d1 , 0xe6d2 , 0x0 , 0xe6d4 , -0x91a1 , 0x0 , 0xe6d3 , 0x8ae4 , -0x0 , 0xe6d6 , 0x0 , 0xe6d5 , -0xe6d7 , 0x0 , 0x0 , 0xe6d9 , -0xe6db , 0x0 , 0xe6dc , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x90d4 , 0x0 , 0x8ecd , 0xe6dd , -0x0 , 0x0 , 0x0 , 0x8a71 , -0x0 , 0xe6de , 0x0 , 0x0 , -0x9196 , 0xe6df , 0x0 , 0xe6e0 , -0x958b , 0x0 , 0x0 , 0x8b4e , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe6e1 , 0x0 , 0x0 , -0x0 , 0x92b4 , 0x0 , 0x0 , -0x0 , 0x0 , 0x897a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe6e2 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8eef , -0x0 , 0x0 , 0x0 , 0x0 , -0x9096 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x91ab , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe6e5 , 0x0 , -0x0 , 0x0 , 0xe6e4 , 0x0 , -0x0 , 0x0 , 0xe6e3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe6eb , -0xe6e9 , 0x0 , 0x0 , 0xe6e6 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe6e8 , 0x0 , -0x0 , 0x0 , 0xe6e7 , 0xe6ea , -0x0 , 0x8b97 , 0x0 , 0xe6ee , -0x0 , 0x90d5 , 0x0 , 0xe6ef , -0x0 , 0x0 , 0x0 , 0x0 , -0x8cd7 , 0x0 , 0xe6ec , 0xe6ed , -0x0 , 0x0 , 0x0 , 0x9848 , -0x0 , 0x0 , 0x0 , 0x92b5 , -0x0 , 0x9148 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe6f0 , 0x0 , 0x0 , 0xe6f3 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe6f1 , 0xe6f2 , 0x9778 , 0x0 , -0x0 , 0x0 , 0x0 , 0x93a5 , -0xe6f6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe6f4 , 0xe6f5 , 0xe6f7 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe748 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe6fa , 0x0 , 0x0 , 0x0 , -0xe6fb , 0xe6f9 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe6f8 , 0x0 , -0x92fb , 0x0 , 0x0 , 0xe740 , -0xe744 , 0xe741 , 0xe6fc , 0x0 , -0xe742 , 0x0 , 0x0 , 0x0 , -0xe743 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe74a , 0x0 , 0x0 , -0x0 , 0xe745 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x90d6 , -0xe747 , 0x0 , 0x0 , 0xe749 , -0xe746 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe74c , 0x0 , -0x8f52 , 0x0 , 0xe74b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe74d , 0x0 , 0x0 , 0x0 , -0x0 , 0xe74e , 0x0 , 0x0 , -0xe751 , 0xe750 , 0x0 , 0xe74f , -0x0 , 0x0 , 0xe753 , 0xe752 , -0x0 , 0x96f4 , 0x0 , 0x0 , -0x0 , 0xe755 , 0x0 , 0xe754 , -0xe756 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe757 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe759 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe758 , 0x9067 , -0xe75a , 0x0 , 0x0 , 0x8beb , -0xe75b , 0xe75d , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe75e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe75f , 0xe75c , 0x0 , -0xe760 , 0x0 , 0x8ed4 , 0xe761 , -0x8b4f , 0x8c52 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8cac , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe762 , -0x0 , 0x0 , 0x0 , 0x93ee , -0x0 , 0x0 , 0x935d , 0xe763 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe766 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8eb2 , 0x0 , 0x0 , 0xe765 , -0xe764 , 0x8c79 , 0xe767 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8a72 , -0x0 , 0xe769 , 0x0 , 0x0 , -0x0 , 0x8dda , 0xe768 , 0x0 , -0xe771 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe76b , 0xe76d , -0x95e3 , 0xe76a , 0x0 , 0x0 , -0x0 , 0xe76c , 0x0 , 0xe770 , -0xe76e , 0x8b50 , 0x0 , 0xe76f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe772 , 0x0 , -0x0 , 0x9479 , 0x97d6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8f53 , -0x0 , 0x0 , 0x0 , 0xe773 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9741 , 0xe775 , 0x0 , 0xe774 , -0x0 , 0x0 , 0xe778 , 0x9760 , -0x0 , 0x0 , 0xe777 , 0x0 , -0x8a8d , 0xe776 , 0xe77b , 0x0 , -0x0 , 0xe77a , 0x0 , 0x0 , -0xe779 , 0x9351 , 0xe77c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe77d , -0x0 , 0x0 , 0x0 , 0x0 , -0xe77e , 0x0 , 0x0 , 0x8d8c , -0x0 , 0x8c44 , 0xe780 , 0xe781 , -0xe782 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9068 , -0xe783 , 0x0 , 0x8eab , 0xe784 , -0x0 , 0x0 , 0x0 , 0xe785 , -0x0 , 0x0 , 0x0 , 0x999f , -0x999e , 0x0 , 0x0 , 0x0 , -0x0 , 0xe786 , 0xe390 , 0xe787 , -0x9243 , 0x904a , 0x945f , 0x0 , -0x0 , 0x0 , 0x0 , 0xe788 , -0x0 , 0x0 , 0x95d3 , 0x92d2 , -0x8d9e , 0x0 , 0x0 , 0x9248 , -0x0 , 0x0 , 0x8949 , 0x0 , -0x9698 , 0x9076 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8c7d , 0x0 , -0x0 , 0x8bdf , 0x0 , 0x0 , -0x95d4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe789 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe78b , 0x0 , -0x0 , 0xe78a , 0x89de , 0x0 , -0x0 , 0x93f4 , 0xe78c , 0x9497 , -0x0 , 0x9352 , 0x0 , 0xe78d , -0x8f71 , 0x0 , 0x0 , 0x0 , -0xe78f , 0x0 , 0x0 , 0x96c0 , -0xe79e , 0xe791 , 0xe792 , 0x0 , -0x0 , 0x92c7 , 0x0 , 0x0 , -0x91de , 0x9197 , 0x0 , 0x93a6 , -0x0 , 0xe790 , 0x8b74 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe799 , -0x0 , 0xe796 , 0xe7a3 , 0x93a7 , -0x9280 , 0xe793 , 0x0 , 0x92fc , -0x9372 , 0xe794 , 0xe798 , 0x9080 , -0x0 , 0x9487 , 0x92ca , 0x0 , -0x0 , 0x90c0 , 0xe797 , 0x91ac , -0x91a2 , 0xe795 , 0x88a7 , 0x9841 , -0x0 , 0x0 , 0x0 , 0xe79a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x91df , 0x0 , -0x0 , 0x8f54 , 0x9069 , 0x0 , -0x0 , 0xe79c , 0xe79b , 0x0 , -0x88ed , 0xe79d , 0x0 , 0x0 , -0x954e , 0x0 , 0xe7a5 , 0x0 , -0x0 , 0x93d9 , 0x908b , 0x0 , -0x0 , 0x9278 , 0x0 , 0x8bf6 , -0x0 , 0xe7a4 , 0x9756 , 0x895e , -0x0 , 0x95d5 , 0x89df , 0xe79f , -0xe7a0 , 0xe7a1 , 0xe7a2 , 0x93b9 , -0x9242 , 0x88e1 , 0xe7a6 , 0x0 , -0xe7a7 , 0xeaa1 , 0x0 , 0x0 , -0x91bb , 0x0 , 0xe7a8 , 0x0 , -0x8993 , 0x916b , 0x0 , 0x8cad , -0x0 , 0x9779 , 0x0 , 0x0 , -0xe7a9 , 0x934b , 0x0 , 0x0 , -0x0 , 0x9198 , 0x8ed5 , 0xe7aa , -0x0 , 0x0 , 0xe7ad , 0x0 , -0x0 , 0x8f85 , 0xe7ab , 0x914a , -0x9149 , 0x0 , 0x88e2 , 0x0 , -0x97c9 , 0xe7af , 0x0 , 0x94f0 , -0xe7b1 , 0xe7b0 , 0xe7ae , 0xe284 , -0x8ad2 , 0x0 , 0x0 , 0xe78e , -0x0 , 0xe7b3 , 0xe7b2 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe7b4 , -0x0 , 0x9757 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x93df , -0x0 , 0x0 , 0x964d , 0x0 , -0xe7b5 , 0x0 , 0x8ed7 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe7b6 , -0x0 , 0xe7b7 , 0x0 , 0x0 , -0x0 , 0xe7b8 , 0x0 , 0x0 , -0x9340 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x88e8 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8d78 , 0x0 , -0x0 , 0x0 , 0x9859 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe7bc , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8c53 , 0xe7b9 , 0x0 , -0xe7ba , 0x0 , 0x0 , 0x0 , -0x9594 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8a73 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9758 , 0x0 , 0x8bbd , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9373 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe7bd , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe7be , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe7bf , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9341 , 0x0 , 0x0 , -0xe7c1 , 0x0 , 0xe7c0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x93d1 , 0xe7c2 , 0x8f55 , -0x8ede , 0x947a , 0x9291 , 0x0 , -0x0 , 0x0 , 0x8ef0 , 0x0 , -0x908c , 0x0 , 0xe7c3 , 0x0 , -0xe7c4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x907c , 0xe7c5 , -0x0 , 0xe7c6 , 0x0 , 0x0 , -0x0 , 0xe7c7 , 0x978f , 0x0 , -0x8f56 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe7c9 , 0xe7c8 , -0x0 , 0x8d79 , 0x0 , 0x8d93 , -0x8e5f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe7cc , 0x0 , -0x0 , 0x0 , 0x0 , 0x8f86 , -0x0 , 0xe7cb , 0x0 , 0xe7ca , -0x0 , 0x91e7 , 0x0 , 0x0 , -0x8ced , 0x0 , 0x90c1 , 0x0 , -0x0 , 0x0 , 0x0 , 0x94ae , -0x0 , 0x0 , 0x0 , 0x0 , -0x8f58 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe7cd , 0x0 , -0x8fdd , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe7d0 , 0xe7ce , -0x0 , 0x0 , 0x0 , 0xe7cf , -0x0 , 0x0 , 0x0 , 0x0 , -0xe7d2 , 0xe7d1 , 0x0 , 0x0 , -0x8ff8 , 0x0 , 0xe7d3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe7d4 , 0xe7d5 , 0x0 , 0x0 , -0x0 , 0x0 , 0x94ce , 0x8dd1 , -0x8edf , 0xe7d6 , 0x0 , 0xe7d7 , -0x97a2 , 0x8f64 , 0x96ec , 0x97ca , -0xe7d8 , 0x8be0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe7d9 , 0x0 , -0x9342 , 0x0 , 0x0 , 0xe7dc , -0x8a98 , 0x906a , 0x0 , 0xe7da , -0x0 , 0xe7db , 0x0 , 0x92de , -0x0 , 0x0 , 0x9674 , 0x8bfa , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe7de , 0xe7df , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe7dd , 0x0 , 0x0 , 0xe7e1 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x93dd , 0x8a62 , 0x0 , -0x0 , 0xe7e5 , 0x0 , 0x0 , -0xe7e2 , 0xe7e4 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe7e0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe86e , 0x0 , 0x0 , -0xe7e3 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x97e9 , 0x0 , 0x0 , 0x8cd8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe7ed , -0x0 , 0x0 , 0x0 , 0x0 , -0x9353 , 0xe7e8 , 0x0 , 0x0 , -0xe7eb , 0xe7e9 , 0x0 , 0xe7ee , -0x0 , 0x0 , 0x0 , 0x0 , -0xe7ef , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe7e7 , -0x0 , 0x0 , 0xe7f4 , 0x8994 , -0x0 , 0x0 , 0xe7e6 , 0x0 , -0x0 , 0x0 , 0x94ab , 0x0 , -0xe7ea , 0x0 , 0x8fde , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8d7a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9667 , 0x0 , -0x8be2 , 0x0 , 0x0 , 0x8f65 , -0x0 , 0x93ba , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x914c , 0x0 , 0xe7f2 , -0x0 , 0xe7ec , 0xe7f1 , 0x0 , -0x96c1 , 0x0 , 0x92b6 , 0xe7f3 , -0xe7f0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x914b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe7f7 , -0x0 , 0xe7f6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe7f5 , -0x0 , 0x0 , 0x964e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8f9b , 0x0 , 0x0 , 0x0 , -0x0 , 0xe7f8 , 0x95dd , 0x0 , -0x0 , 0x8973 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9565 , 0x9292 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8b98 , 0x0 , 0xe7fa , 0x0 , -0x8d7c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8e4b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe7f9 , -0x908d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x908e , 0xe840 , 0xe842 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8ff9 , 0x0 , 0xe841 , 0xe843 , -0x0 , 0x0 , 0x8bd1 , 0x0 , -0x9564 , 0x0 , 0x0 , 0x8ee0 , -0x9842 , 0x0 , 0xe7fc , 0x8df6 , -0x0 , 0x0 , 0x985e , 0x0 , -0x0 , 0xe845 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe844 , 0xe846 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe7fb , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x93e7 , -0x0 , 0x9374 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x92d5 , 0x0 , 0xe84b , 0x0 , -0x0 , 0x0 , 0x0 , 0x9262 , -0xe847 , 0x0 , 0x0 , 0x0 , -0xe848 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8c4c , 0x0 , 0xe84a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8cae , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe849 , 0x0 , 0x8fdf , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8a99 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe84f , 0x0 , 0x8dbd , 0x9199 , -0x0 , 0x0 , 0x92c8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8a5a , -0x0 , 0x0 , 0x0 , 0x0 , -0xe84d , 0xe84e , 0x92c1 , 0x0 , -0xe84c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe850 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe856 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe859 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe858 , 0x934c , 0x0 , 0x0 , -0x0 , 0x0 , 0xe851 , 0xe852 , -0xe855 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe857 , 0x0 , 0x0 , -0x0 , 0x8bbe , 0x0 , 0x0 , -0xe85a , 0xe854 , 0x0 , 0x0 , -0xe853 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe85e , -0x0 , 0x0 , 0x0 , 0xe85f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe860 , 0x0 , 0x0 , 0xe85d , -0xe85c , 0x0 , 0x0 , 0x0 , -0x8fe0 , 0x93a8 , 0xe85b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe864 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe862 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe863 , 0xe861 , 0x0 , -0x91f6 , 0x0 , 0xe865 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe866 , 0x0 , 0x0 , -0xe868 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8ad3 , 0xe867 , 0x96f8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe873 , 0xe869 , -0x0 , 0x0 , 0xe86c , 0x0 , -0xe86a , 0x0 , 0xe86b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe86d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe86f , 0x0 , 0x0 , 0x0 , -0x0 , 0xe870 , 0x0 , 0xe871 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe874 , 0xe872 , 0xe875 , 0xe877 , -0x0 , 0xe876 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x92b7 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x96e5 , 0x0 , 0xe878 , 0x914d , -0x0 , 0x0 , 0x0 , 0xe879 , -0x0 , 0x95c2 , 0xe87a , 0x8a4a , -0x0 , 0x0 , 0x0 , 0x895b , -0x0 , 0x8ad5 , 0x0 , 0x8ad4 , -0xe87b , 0x0 , 0xe87c , 0x0 , -0xe87d , 0xe87e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe880 , 0x0 , 0x8ad6 , 0x8a74 , -0x8d7d , 0x94b4 , 0x0 , 0xe882 , -0xe881 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe883 , 0x0 , 0x0 , -0x0 , 0x0 , 0x897b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe886 , 0x0 , 0xe885 , -0xe884 , 0x0 , 0xe887 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe88a , -0x0 , 0x0 , 0x0 , 0x88c5 , -0x0 , 0x0 , 0xe888 , 0x0 , -0xe88c , 0xe88b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe88e , 0xe88d , 0xe88f , 0x0 , -0x93ac , 0x0 , 0x0 , 0x0 , -0xe890 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe891 , 0xe893 , 0x0 , -0x0 , 0xe892 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x958c , 0x0 , 0x0 , 0x0 , -0x0 , 0xe894 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe895 , 0x0 , 0x8de3 , 0x0 , -0x0 , 0x0 , 0xe896 , 0xe897 , -0x0 , 0x0 , 0x9668 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x916a , -0x0 , 0x0 , 0x0 , 0x88a2 , -0x91c9 , 0x0 , 0xe898 , 0x0 , -0x958d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe89b , -0xe899 , 0x8d7e , 0x0 , 0xe89a , -0x8cc0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x95c3 , -0xe89d , 0xe89f , 0xe89e , 0xe8a0 , -0x0 , 0x0 , 0x8940 , 0x9077 , -0x8f9c , 0x8ad7 , 0xe8a1 , 0x0 , -0x0 , 0x0 , 0x9486 , 0x0 , -0xe8a3 , 0x0 , 0x0 , 0x0 , -0x8941 , 0x0 , 0xe8a2 , 0x92c2 , -0x0 , 0x97cb , 0x93a9 , 0xe89c , -0x97a4 , 0x0 , 0x8caf , 0x0 , -0x0 , 0x977a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8bf7 , 0x97b2 , 0x0 , -0x8c47 , 0x0 , 0x91e0 , 0xe440 , -0x0 , 0xe8a4 , 0x8a4b , 0x908f , -0x0 , 0x0 , 0x0 , 0x0 , -0x8a75 , 0xe8a6 , 0x0 , 0xe8a7 , -0xe8a5 , 0x8c84 , 0x0 , 0x8ddb , -0x8fe1 , 0x0 , 0x0 , 0x0 , -0x8942 , 0x0 , 0x0 , 0x97d7 , -0x0 , 0x0 , 0x0 , 0xe8a9 , -0xe7ac , 0x0 , 0xe8a8 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe8ac , 0xe8aa , 0xe8ab , 0x0 , -0xe8ad , 0x0 , 0xe8ae , 0x97ea , -0xe8af , 0xe8b0 , 0x0 , 0x90c7 , -0x94b9 , 0x0 , 0x0 , 0x0 , -0x909d , 0x8ae5 , 0x0 , 0x0 , -0x9759 , 0x89eb , 0x8f57 , 0x8cd9 , -0x0 , 0xe8b3 , 0x0 , 0xe8b2 , -0x8e93 , 0xe8b4 , 0xe8b1 , 0x0 , -0x0 , 0x8e47 , 0x0 , 0x0 , -0x0 , 0xe8b8 , 0xe5ab , 0x0 , -0x0 , 0x99d4 , 0x0 , 0x9097 , -0xe8b6 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x97a3 , 0x93ef , -0x0 , 0x0 , 0x0 , 0x0 , -0x894a , 0x0 , 0x90e1 , 0x8eb4 , -0x0 , 0x0 , 0x0 , 0x0 , -0x95b5 , 0x0 , 0x895f , 0x0 , -0x0 , 0x0 , 0x97eb , 0x978b , -0x0 , 0xe8b9 , 0x0 , 0x9364 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8ef9 , 0x0 , 0x0 , 0x0 , -0xe8ba , 0x0 , 0xe8bb , 0x906b , -0xe8bc , 0x0 , 0x97ec , 0x0 , -0x0 , 0xe8b7 , 0xe8be , 0xe8c0 , -0x0 , 0xe8bf , 0x0 , 0xe8bd , -0x0 , 0x0 , 0xe8c1 , 0x0 , -0x0 , 0xe8c2 , 0x0 , 0x0 , -0x919a , 0x0 , 0x89e0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe8c3 , 0x0 , 0x0 , 0x96b6 , -0x0 , 0x0 , 0xe8c4 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe8c5 , 0x0 , 0x9849 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9e50 , 0xe8c6 , 0x0 , 0x0 , -0x0 , 0xe8c7 , 0xe8c8 , 0x0 , -0x0 , 0x0 , 0xe8cc , 0x0 , -0xe8c9 , 0x0 , 0xe8ca , 0x0 , -0xe8cb , 0xe8cd , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x90c2 , 0x0 , -0x0 , 0x0 , 0x96f5 , 0x0 , -0x0 , 0x90c3 , 0x0 , 0x0 , -0xe8ce , 0x0 , 0x94f1 , 0x0 , -0xe8cf , 0xea72 , 0x96ca , 0x0 , -0xe8d0 , 0x0 , 0xe8d1 , 0x0 , -0xe8d2 , 0x8a76 , 0x0 , 0xe8d4 , -0x0 , 0x9078 , 0x0 , 0x0 , -0x0 , 0xe8d5 , 0x0 , 0x0 , -0x8c43 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe8d6 , 0xe8da , 0x0 , -0xe8d8 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe8d9 , 0x0 , 0x0 , -0x8a93 , 0xe8d7 , 0xe8db , 0x0 , -0x0 , 0x0 , 0x0 , 0xe8dc , -0x0 , 0x88c6 , 0x0 , 0xe8dd , -0xe8de , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8fe2 , 0x0 , 0x0 , 0x0 , -0xe8df , 0x0 , 0x0 , 0x0 , -0x8b66 , 0x0 , 0x0 , 0xe8e2 , -0x0 , 0x0 , 0xe8e1 , 0x0 , -0xe8e0 , 0x0 , 0x0 , 0xe691 , -0x0 , 0x95da , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe8e3 , -0xe8e4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe8e5 , -0x0 , 0x0 , 0xe8e6 , 0x0 , -0xe8e7 , 0x0 , 0x0 , 0xe8e8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8ad8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe8e9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe8ea , 0x9442 , 0x0 , -0x0 , 0x0 , 0xe8ec , 0x89b9 , -0x0 , 0xe8ef , 0xe8ee , 0x0 , -0x0 , 0x0 , 0x0 , 0x8943 , -0x0 , 0x0 , 0x0 , 0x8bbf , -0x0 , 0x95c5 , 0x92b8 , 0x8da0 , -0x0 , 0x8d80 , 0x8f87 , 0x0 , -0x907b , 0x0 , 0x0 , 0x0 , -0xe8f1 , 0x0 , 0x0 , 0xe8f0 , -0x9761 , 0x8ae6 , 0x94d0 , 0x93da , -0x0 , 0x0 , 0x0 , 0x909c , -0x97cc , 0x0 , 0x8c7a , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe8f4 , 0x0 , 0x0 , -0xe8f3 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x966a , 0x93aa , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x896f , 0x0 , 0x0 , 0xe8f5 , -0xe8f2 , 0x0 , 0x0 , 0x9570 , -0x978a , 0xe8f6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe8f7 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe8f9 , -0x91e8 , 0x8a7a , 0x8a7b , 0xe8f8 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8ae7 , 0x8cb0 , 0x0 , 0x0 , -0x8ae8 , 0x0 , 0x0 , 0x935e , -0x0 , 0x0 , 0x97de , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8cda , -0x0 , 0x0 , 0x0 , 0xe8fa , -0x0 , 0x0 , 0x0 , 0xe8fb , -0xe8fc , 0xe940 , 0x0 , 0xe942 , -0xe941 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9597 , 0x0 , 0xe943 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe944 , -0x0 , 0xe945 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe946 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe948 , -0xe947 , 0x0 , 0xe949 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x94f2 , -0xe3ca , 0x0 , 0x0 , 0x9048 , -0x0 , 0x0 , 0x8b51 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe94a , 0x0 , 0xe94b , -0x0 , 0x99aa , 0x9f5a , 0x94d1 , -0x0 , 0x0 , 0x88f9 , 0x0 , -0x88b9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8e94 , 0x964f , 0x8ffc , 0x0 , -0x0 , 0x0 , 0x0 , 0xe94c , -0x0 , 0x96dd , 0x0 , 0x0 , -0x0 , 0xe94d , 0x977b , 0x0 , -0x8961 , 0x0 , 0x0 , 0x0 , -0x8e60 , 0x0 , 0xe94e , 0x89ec , -0xe94f , 0x0 , 0x0 , 0x0 , -0xe950 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe952 , 0xe953 , 0x0 , -0xe955 , 0xe951 , 0x0 , 0x0 , -0xe954 , 0x0 , 0x0 , 0x0 , -0x8ad9 , 0x0 , 0x0 , 0x0 , -0xe956 , 0x0 , 0xe957 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe958 , 0xe959 , 0x0 , -0x0 , 0x0 , 0xe95a , 0x0 , -0x0 , 0xe95c , 0x0 , 0x0 , -0x0 , 0xe95b , 0x0 , 0xe95e , -0xe961 , 0x0 , 0x0 , 0x0 , -0xe95d , 0xe95f , 0xe960 , 0x0 , -0x0 , 0xe962 , 0x0 , 0x8bc0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8ef1 , 0xe963 , -0xe964 , 0x8d81 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe965 , 0x0 , 0x0 , -0x8a5d , 0x0 , 0x0 , 0x0 , -0x946e , 0xe966 , 0xe967 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9279 , -0x93e9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe968 , 0x0 , 0x0 , 0x0 , -0x0 , 0x949d , 0x0 , 0x0 , -0x91ca , 0x8977 , 0x8bec , 0x0 , -0x8bed , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9293 , 0xe96d , 0x8bee , 0x0 , -0x0 , 0x89ed , 0x0 , 0x0 , -0xe96c , 0x0 , 0x0 , 0xe96a , -0x0 , 0xe96b , 0x0 , 0xe969 , -0x0 , 0x0 , 0xe977 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe96e , 0xe96f , 0x0 , -0x0 , 0xe970 , 0xe971 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe973 , 0x0 , 0x0 , 0xe972 , -0x0 , 0x0 , 0x0 , 0x8f78 , -0x0 , 0xe974 , 0x0 , 0x0 , -0x0 , 0xe976 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x8b52 , 0xe975 , -0x0 , 0x0 , 0x919b , 0x8cb1 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe978 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x91cb , 0x0 , 0x0 , 0xe979 , -0x0 , 0x0 , 0x0 , 0x0 , -0x93ab , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe97a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe980 , 0x0 , -0xe97d , 0x0 , 0xe97c , 0xe97e , -0x0 , 0xe97b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe982 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe981 , 0x0 , 0xe984 , -0x0 , 0x0 , 0x8bc1 , 0xe983 , -0x0 , 0x0 , 0x0 , 0xe985 , -0x0 , 0x0 , 0xe986 , 0x0 , -0xe988 , 0xe987 , 0x0 , 0x0 , -0x0 , 0xe989 , 0xe98b , 0xe98a , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8d9c , 0x0 , 0x0 , 0x0 , -0x0 , 0xe98c , 0x0 , 0x0 , -0xe98d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8a5b , 0x0 , 0x0 , 0x0 , -0xe98e , 0x0 , 0x0 , 0x0 , -0xe98f , 0x0 , 0x0 , 0x0 , -0x9091 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe990 , -0x0 , 0xe991 , 0x0 , 0xe992 , -0xe993 , 0x0 , 0x0 , 0x0 , -0x8d82 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe994 , 0xe995 , -0x0 , 0x0 , 0xe996 , 0xe997 , -0x0 , 0x0 , 0xe998 , 0x0 , -0x0 , 0x0 , 0x94af , 0xe99a , -0x0 , 0x9545 , 0xe99b , 0xe999 , -0x0 , 0xe99d , 0x0 , 0x0 , -0xe99c , 0x0 , 0x0 , 0xe99e , -0x0 , 0x0 , 0x0 , 0xe99f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe9a0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe9a1 , 0x0 , 0xe9a2 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe9a3 , -0x0 , 0x0 , 0xe9a4 , 0xe9a5 , -0x0 , 0xe9a6 , 0x0 , 0xe9a7 , -0xe9a8 , 0xe9a9 , 0xe9aa , 0x0 , -0x0 , 0x0 , 0xe9ab , 0xe9ac , -0x0 , 0x9f54 , 0xe9ad , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe2f6 , -0x8b53 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8a40 , 0x8db0 , 0xe9af , -0xe9ae , 0x96a3 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe9b1 , 0xe9b2 , 0xe9b0 , -0x0 , 0xe9b3 , 0x0 , 0x0 , -0x9682 , 0x0 , 0x0 , 0x0 , -0xe9b4 , 0x0 , 0x8b9b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9844 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe9b5 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe9b7 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x88bc , 0x0 , -0x0 , 0xe9b8 , 0x95a9 , 0xe9b6 , -0x0 , 0x0 , 0xe9b9 , 0xe9ba , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe9bb , -0xe9bc , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe9bd , 0x0 , 0x968e , 0x8e4c , -0x0 , 0x8df8 , 0x914e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe9be , 0x0 , 0x0 , 0x0 , -0x0 , 0xe9c1 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe9bf , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe9c2 , 0x0 , -0x0 , 0x8cef , 0xe9c0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe9c3 , -0x0 , 0xe9c4 , 0xe9c5 , 0x0 , -0xe9c9 , 0x0 , 0x8e49 , 0x0 , -0x0 , 0x0 , 0x0 , 0x91e2 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe9ca , 0xe9c7 , 0xe9c6 , -0xe9c8 , 0x0 , 0x0 , 0x0 , -0x8c7e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe9ce , 0xe9cd , 0xe9cc , 0x0 , -0x0 , 0x88b1 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe9d8 , 0x0 , 0xe9d4 , 0x0 , -0xe9d5 , 0xe9d1 , 0xe9d7 , 0x0 , -0xe9d3 , 0x8a82 , 0x0 , 0x0 , -0x986b , 0x0 , 0xe9d6 , 0xe9d2 , -0xe9d0 , 0xe9cf , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe9da , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xe9dd , 0x0 , 0x0 , -0xe9dc , 0xe9db , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x9568 , 0xe9d9 , 0x88f1 , -0xe9de , 0x0 , 0xe9e0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8a8f , 0xe9cb , 0x8956 , -0x0 , 0x0 , 0xe9e2 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe9e1 , 0xe9df , -0x924c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9690 , 0x0 , -0x0 , 0x0 , 0x0 , 0x97d8 , -0x0 , 0x0 , 0xe9e3 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xe9e4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe9e5 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xe9e6 , 0x0 , -0xe9e7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x92b9 , 0x0 , 0xe9e8 , -0x0 , 0x94b5 , 0x0 , 0xe9ed , -0xe9e9 , 0x0 , 0x0 , 0x0 , -0xe9ea , 0x0 , 0x0 , 0x9650 , -0x96c2 , 0x0 , 0x93ce , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xe9ee , -0x0 , 0x0 , 0xe9ef , 0x93bc , -0xe9ec , 0xe9eb , 0x0 , 0x0 , -0x0 , 0x0 , 0x89a8 , 0x0 , -0x0 , 0x0 , 0xe9f7 , 0x0 , -0x0 , 0xe9f6 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8995 , -0x0 , 0x0 , 0x0 , 0xe9f4 , -0x0 , 0x0 , 0x0 , 0xe9f3 , -0x0 , 0x0 , 0xe9f1 , 0x0 , -0x8a9b , 0x0 , 0xe9f0 , 0x8eb0 , -0x89a7 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8d83 , -0x0 , 0x0 , 0xe9fa , 0xe9f9 , -0x0 , 0xe9f8 , 0x0 , 0x0 , -0xe9f5 , 0x0 , 0xe9fb , 0x0 , -0xe9fc , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xea44 , 0xea43 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xea45 , 0x0 , 0x0 , -0x894c , 0xea40 , 0xea41 , 0x0 , -0x8d94 , 0x96b7 , 0x0 , 0x0 , -0xea42 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9651 , 0x0 , 0x0 , 0xea4a , -0x0 , 0x0 , 0xea46 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xea4b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xea48 , -0x0 , 0xea47 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8c7b , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xea4c , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xea4d , 0x0 , 0x0 , 0x0 , -0x0 , 0xea4e , 0x0 , 0xea49 , -0x0 , 0x0 , 0x0 , 0xe9f2 , -0x0 , 0x0 , 0xea4f , 0x0 , -0x92df , 0x0 , 0x0 , 0x0 , -0xea53 , 0x0 , 0xea54 , 0xea52 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xea51 , 0xea57 , 0x0 , -0xea50 , 0x0 , 0xea55 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xea56 , -0x0 , 0x0 , 0x0 , 0xea59 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xea58 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xea5b , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xea5c , 0x0 , 0xea5d , -0x0 , 0x0 , 0x9868 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xea5a , 0x91e9 , 0x8deb , 0x0 , -0x0 , 0xea5e , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xea5f , 0xea60 , -0x0 , 0x0 , 0xea61 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xea62 , 0x0 , 0x0 , -0x8cb2 , 0xea63 , 0x0 , 0x0 , -0x0 , 0xea64 , 0x0 , 0x8ead , -0x0 , 0xea65 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xea66 , 0x0 , 0x0 , 0xea67 , -0xea68 , 0x0 , 0x0 , 0x0 , -0x0 , 0xea6b , 0xea69 , 0x985b , -0x0 , 0xea6a , 0x0 , 0x97ed , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xea6c , 0x0 , 0x97d9 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xea6d , 0x949e , 0x0 , -0x0 , 0xea6e , 0xea70 , 0x0 , -0x0 , 0xea71 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xea6f , 0x8d8d , 0x96cb , 0x9683 , -0x9bf5 , 0x0 , 0x9f80 , 0x969b , -0x0 , 0x0 , 0x0 , 0x0 , -0x89a9 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xea73 , 0x8b6f , 0xea74 , 0xea75 , -0xea76 , 0x0 , 0x8d95 , 0x0 , -0xea77 , 0x0 , 0x0 , 0x0 , -0xe0d2 , 0x96d9 , 0x0 , 0x91e1 , -0xea78 , 0xea7a , 0xea79 , 0x0 , -0xea7b , 0x0 , 0x0 , 0x0 , -0x0 , 0xea7c , 0x0 , 0x0 , -0xea7d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xea7e , -0x0 , 0x0 , 0x0 , 0x0 , -0xea80 , 0x0 , 0xea81 , 0xea82 , -0x0 , 0xea83 , 0x0 , 0xea84 , -0xea85 , 0xea86 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xea87 , -0xea88 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x9343 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8cdb , -0x0 , 0xea8a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x916c , 0xea8b , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xea8c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x9540 , -0x0 , 0x0 , 0xea8d , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xea8e , 0xe256 , -0x0 , 0x0 , 0xe6d8 , 0xe8eb , -0x0 , 0x0 , 0xea8f , 0x0 , -0xea90 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xea92 , -0xea93 , 0xea94 , 0x97ee , 0xea91 , -0x0 , 0x0 , 0xea95 , 0xea96 , -0x0 , 0x0 , 0xea98 , 0x0 , -0xea97 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0xea9a , 0x0 , -0x0 , 0x0 , 0xea9b , 0xea99 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x97b4 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xea9c , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xea9d , 0xe273 , 0x0 , 0x0 , -0xea9e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x8149 , 0xa1ed , 0x8194 , -0x8190 , 0x8193 , 0x8195 , 0xa1ec , -0x8169 , 0x816a , 0x8196 , 0x817b , -0x8143 , 0xa1dd , 0x8144 , 0x815e , -0x824f , 0x8250 , 0x8251 , 0x8252 , -0x8253 , 0x8254 , 0x8255 , 0x8256 , -0x8257 , 0x8258 , 0x8146 , 0x8147 , -0x8183 , 0x8181 , 0x8184 , 0x8148 , -0x8197 , 0x8260 , 0x8261 , 0x8262 , -0x8263 , 0x8264 , 0x8265 , 0x8266 , -0x8267 , 0x8268 , 0x8269 , 0x826a , -0x826b , 0x826c , 0x826d , 0x826e , -0x826f , 0x8270 , 0x8271 , 0x8272 , -0x8273 , 0x8274 , 0x8275 , 0x8276 , -0x8277 , 0x8278 , 0x8279 , 0x816d , -0xa1a1 , 0x816e , 0x814f , 0x8151 , -0x814d , 0x8281 , 0x8282 , 0x8283 , -0x8284 , 0x8285 , 0x8286 , 0x8287 , -0x8288 , 0x8289 , 0x828a , 0x828b , -0x828c , 0x828d , 0x828e , 0x828f , -0x8290 , 0x8291 , 0x8292 , 0x8293 , -0x8294 , 0x8295 , 0x8296 , 0x8297 , -0x8298 , 0x8299 , 0x829a , 0x816f , -0x8162 , 0x8170 , 0x223d , 0xa1a1 , -0x0 , 0xa1 , 0xa2 , 0xa3 , -0xa4 , 0xa5 , 0xa6 , 0xa7 , -0xa8 , 0xa9 , 0xaa , 0xab , -0xac , 0xad , 0xae , 0xaf , -0xb0 , 0xb1 , 0xb2 , 0xb3 , -0xb4 , 0xb5 , 0xb6 , 0xb7 , -0xb8 , 0xb9 , 0xba , 0xbb , -0xbc , 0xbd , 0xbe , 0xbf , -0xc0 , 0xc1 , 0xc2 , 0xc3 , -0xc4 , 0xc5 , 0xc6 , 0xc7 , -0xc8 , 0xc9 , 0xca , 0xcb , -0xcc , 0xcd , 0xce , 0xcf , -0xd0 , 0xd1 , 0xd2 , 0xd3 , -0xd4 , 0xd5 , 0xd6 , 0xd7 , -0xd8 , 0xd9 , 0xda , 0xdb , -0xdc , 0xdd , 0xde , 0xdf , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x8150 , -0x0 , 0x818f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -} ; -static char16 sjisuni [65536] = { -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x20 , 0x21 , 0x22 , 0x23 , -0x24 , 0x25 , 0x26 , 0x27 , -0x28 , 0x29 , 0x2a , 0x2b , -0x2c , 0x2d , 0x2e , 0x2f , -0x30 , 0x31 , 0x32 , 0x33 , -0x34 , 0x35 , 0x36 , 0x37 , -0x38 , 0x39 , 0x3a , 0x3b , -0x3c , 0x3d , 0x3e , 0x3f , -0x40 , 0x41 , 0x42 , 0x43 , -0x44 , 0x45 , 0x46 , 0x47 , -0x48 , 0x49 , 0x4a , 0x4b , -0x4c , 0x4d , 0x4e , 0x4f , -0x50 , 0x51 , 0x52 , 0x53 , -0x54 , 0x55 , 0x56 , 0x57 , -0x58 , 0x59 , 0x5a , 0x5b , -0xa5 , 0x5d , 0x5e , 0x5f , -0x60 , 0x61 , 0x62 , 0x63 , -0x64 , 0x65 , 0x66 , 0x67 , -0x68 , 0x69 , 0x6a , 0x6b , -0x6c , 0x6d , 0x6e , 0x6f , -0x70 , 0x71 , 0x72 , 0x73 , -0x74 , 0x75 , 0x76 , 0x77 , -0x78 , 0x79 , 0x7a , 0x7b , -0x7c , 0x7d , 0x203e , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xff61 , 0xff62 , 0xff63 , -0xff64 , 0xff65 , 0xff66 , 0xff67 , -0xff68 , 0xff69 , 0xff6a , 0xff6b , -0xff6c , 0xff6d , 0xff6e , 0xff6f , -0xff70 , 0xff71 , 0xff72 , 0xff73 , -0xff74 , 0xff75 , 0xff76 , 0xff77 , -0xff78 , 0xff79 , 0xff7a , 0xff7b , -0xff7c , 0xff7d , 0xff7e , 0xff7f , -0xff80 , 0xff81 , 0xff82 , 0xff83 , -0xff84 , 0xff85 , 0xff86 , 0xff87 , -0xff88 , 0xff89 , 0xff8a , 0xff8b , -0xff8c , 0xff8d , 0xff8e , 0xff8f , -0xff90 , 0xff91 , 0xff92 , 0xff93 , -0xff94 , 0xff95 , 0xff96 , 0xff97 , -0xff98 , 0xff99 , 0xff9a , 0xff9b , -0xff9c , 0xff9d , 0xff9e , 0xff9f , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x3000 , 0x3001 , 0x3002 , 0xff0c , -0xff0e , 0x30fb , 0xff1a , 0xff1b , -0xff1f , 0xff01 , 0x309b , 0x309c , -0xb4 , 0xff40 , 0xa8 , 0xff3e , -0xffe3 , 0xff3f , 0x30fd , 0x30fe , -0x309d , 0x309e , 0x3003 , 0x4edd , -0x3005 , 0x3006 , 0x3007 , 0x30fc , -0x2015 , 0x2010 , 0xff0f , 0x5c , -0x301c , 0x2016 , 0xff5c , 0x2026 , -0x2025 , 0x2018 , 0x2019 , 0x201c , -0x201d , 0xff08 , 0xff09 , 0x3014 , -0x3015 , 0xff3b , 0xff3d , 0xff5b , -0xff5d , 0x3008 , 0x3009 , 0x300a , -0x300b , 0x300c , 0x300d , 0x300e , -0x300f , 0x3010 , 0x3011 , 0xff0b , -0x2212 , 0xb1 , 0xd7 , 0x0 , -0xf7 , 0xff1d , 0x2260 , 0xff1c , -0xff1e , 0x2266 , 0x2267 , 0x221e , -0x2234 , 0x2642 , 0x2640 , 0xb0 , -0x2032 , 0x2033 , 0x2103 , 0xffe5 , -0xff04 , 0xa2 , 0xa3 , 0xff05 , -0xff03 , 0xff06 , 0xff0a , 0xff20 , -0xa7 , 0x2606 , 0x2605 , 0x25cb , -0x25cf , 0x25ce , 0x25c7 , 0x25c6 , -0x25a1 , 0x25a0 , 0x25b3 , 0x25b2 , -0x25bd , 0x25bc , 0x203b , 0x3012 , -0x2192 , 0x2190 , 0x2191 , 0x2193 , -0x3013 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2208 , 0x220b , 0x2286 , 0x2287 , -0x2282 , 0x2283 , 0x222a , 0x2229 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x2227 , 0x2228 , 0xac , 0x21d2 , -0x21d4 , 0x2200 , 0x2203 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x2220 , 0x22a5 , -0x2312 , 0x2202 , 0x2207 , 0x2261 , -0x2252 , 0x226a , 0x226b , 0x221a , -0x223d , 0x221d , 0x2235 , 0x222b , -0x222c , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x212b , 0x2030 , 0x266f , 0x266d , -0x266a , 0x2020 , 0x2021 , 0xb6 , -0x0 , 0x0 , 0x0 , 0x0 , -0x25ef , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0xff10 , -0xff11 , 0xff12 , 0xff13 , 0xff14 , -0xff15 , 0xff16 , 0xff17 , 0xff18 , -0xff19 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0xff21 , 0xff22 , 0xff23 , 0xff24 , -0xff25 , 0xff26 , 0xff27 , 0xff28 , -0xff29 , 0xff2a , 0xff2b , 0xff2c , -0xff2d , 0xff2e , 0xff2f , 0xff30 , -0xff31 , 0xff32 , 0xff33 , 0xff34 , -0xff35 , 0xff36 , 0xff37 , 0xff38 , -0xff39 , 0xff3a , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0xff41 , 0xff42 , 0xff43 , -0xff44 , 0xff45 , 0xff46 , 0xff47 , -0xff48 , 0xff49 , 0xff4a , 0xff4b , -0xff4c , 0xff4d , 0xff4e , 0xff4f , -0xff50 , 0xff51 , 0xff52 , 0xff53 , -0xff54 , 0xff55 , 0xff56 , 0xff57 , -0xff58 , 0xff59 , 0xff5a , 0x0 , -0x0 , 0x0 , 0x0 , 0x3041 , -0x3042 , 0x3043 , 0x3044 , 0x3045 , -0x3046 , 0x3047 , 0x3048 , 0x3049 , -0x304a , 0x304b , 0x304c , 0x304d , -0x304e , 0x304f , 0x3050 , 0x3051 , -0x3052 , 0x3053 , 0x3054 , 0x3055 , -0x3056 , 0x3057 , 0x3058 , 0x3059 , -0x305a , 0x305b , 0x305c , 0x305d , -0x305e , 0x305f , 0x3060 , 0x3061 , -0x3062 , 0x3063 , 0x3064 , 0x3065 , -0x3066 , 0x3067 , 0x3068 , 0x3069 , -0x306a , 0x306b , 0x306c , 0x306d , -0x306e , 0x306f , 0x3070 , 0x3071 , -0x3072 , 0x3073 , 0x3074 , 0x3075 , -0x3076 , 0x3077 , 0x3078 , 0x3079 , -0x307a , 0x307b , 0x307c , 0x307d , -0x307e , 0x307f , 0x3080 , 0x3081 , -0x3082 , 0x3083 , 0x3084 , 0x3085 , -0x3086 , 0x3087 , 0x3088 , 0x3089 , -0x308a , 0x308b , 0x308c , 0x308d , -0x308e , 0x308f , 0x3090 , 0x3091 , -0x3092 , 0x3093 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x30a1 , 0x30a2 , 0x30a3 , 0x30a4 , -0x30a5 , 0x30a6 , 0x30a7 , 0x30a8 , -0x30a9 , 0x30aa , 0x30ab , 0x30ac , -0x30ad , 0x30ae , 0x30af , 0x30b0 , -0x30b1 , 0x30b2 , 0x30b3 , 0x30b4 , -0x30b5 , 0x30b6 , 0x30b7 , 0x30b8 , -0x30b9 , 0x30ba , 0x30bb , 0x30bc , -0x30bd , 0x30be , 0x30bf , 0x30c0 , -0x30c1 , 0x30c2 , 0x30c3 , 0x30c4 , -0x30c5 , 0x30c6 , 0x30c7 , 0x30c8 , -0x30c9 , 0x30ca , 0x30cb , 0x30cc , -0x30cd , 0x30ce , 0x30cf , 0x30d0 , -0x30d1 , 0x30d2 , 0x30d3 , 0x30d4 , -0x30d5 , 0x30d6 , 0x30d7 , 0x30d8 , -0x30d9 , 0x30da , 0x30db , 0x30dc , -0x30dd , 0x30de , 0x30df , 0x0 , -0x30e0 , 0x30e1 , 0x30e2 , 0x30e3 , -0x30e4 , 0x30e5 , 0x30e6 , 0x30e7 , -0x30e8 , 0x30e9 , 0x30ea , 0x30eb , -0x30ec , 0x30ed , 0x30ee , 0x30ef , -0x30f0 , 0x30f1 , 0x30f2 , 0x30f3 , -0x30f4 , 0x30f5 , 0x30f6 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x391 , -0x392 , 0x393 , 0x394 , 0x395 , -0x396 , 0x397 , 0x398 , 0x399 , -0x39a , 0x39b , 0x39c , 0x39d , -0x39e , 0x39f , 0x3a0 , 0x3a1 , -0x3a3 , 0x3a4 , 0x3a5 , 0x3a6 , -0x3a7 , 0x3a8 , 0x3a9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x3b1 , -0x3b2 , 0x3b3 , 0x3b4 , 0x3b5 , -0x3b6 , 0x3b7 , 0x3b8 , 0x3b9 , -0x3ba , 0x3bb , 0x3bc , 0x3bd , -0x3be , 0x3bf , 0x3c0 , 0x3c1 , -0x3c3 , 0x3c4 , 0x3c5 , 0x3c6 , -0x3c7 , 0x3c8 , 0x3c9 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x410 , 0x411 , 0x412 , 0x413 , -0x414 , 0x415 , 0x401 , 0x416 , -0x417 , 0x418 , 0x419 , 0x41a , -0x41b , 0x41c , 0x41d , 0x41e , -0x41f , 0x420 , 0x421 , 0x422 , -0x423 , 0x424 , 0x425 , 0x426 , -0x427 , 0x428 , 0x429 , 0x42a , -0x42b , 0x42c , 0x42d , 0x42e , -0x42f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x430 , 0x431 , 0x432 , 0x433 , -0x434 , 0x435 , 0x451 , 0x436 , -0x437 , 0x438 , 0x439 , 0x43a , -0x43b , 0x43c , 0x43d , 0x0 , -0x43e , 0x43f , 0x440 , 0x441 , -0x442 , 0x443 , 0x444 , 0x445 , -0x446 , 0x447 , 0x448 , 0x449 , -0x44a , 0x44b , 0x44c , 0x44d , -0x44e , 0x44f , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x2500 , -0x2502 , 0x250c , 0x2510 , 0x2518 , -0x2514 , 0x251c , 0x252c , 0x2524 , -0x2534 , 0x253c , 0x2501 , 0x2503 , -0x250f , 0x2513 , 0x251b , 0x2517 , -0x2523 , 0x2533 , 0x252b , 0x253b , -0x254b , 0x2520 , 0x252f , 0x2528 , -0x2537 , 0x253f , 0x251d , 0x2530 , -0x2525 , 0x2538 , 0x2542 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x4e9c , -0x5516 , 0x5a03 , 0x963f , 0x54c0 , -0x611b , 0x6328 , 0x59f6 , 0x9022 , -0x8475 , 0x831c , 0x7a50 , 0x60aa , -0x63e1 , 0x6e25 , 0x65ed , 0x8466 , -0x82a6 , 0x9bf5 , 0x6893 , 0x5727 , -0x65a1 , 0x6271 , 0x5b9b , 0x59d0 , -0x867b , 0x98f4 , 0x7d62 , 0x7dbe , -0x9b8e , 0x6216 , 0x7c9f , 0x88b7 , -0x5b89 , 0x5eb5 , 0x6309 , 0x6697 , -0x6848 , 0x95c7 , 0x978d , 0x674f , -0x4ee5 , 0x4f0a , 0x4f4d , 0x4f9d , -0x5049 , 0x56f2 , 0x5937 , 0x59d4 , -0x5a01 , 0x5c09 , 0x60df , 0x610f , -0x6170 , 0x6613 , 0x6905 , 0x70ba , -0x754f , 0x7570 , 0x79fb , 0x7dad , -0x7def , 0x80c3 , 0x840e , 0x8863 , -0x8b02 , 0x9055 , 0x907a , 0x533b , -0x4e95 , 0x4ea5 , 0x57df , 0x80b2 , -0x90c1 , 0x78ef , 0x4e00 , 0x58f1 , -0x6ea2 , 0x9038 , 0x7a32 , 0x8328 , -0x828b , 0x9c2f , 0x5141 , 0x5370 , -0x54bd , 0x54e1 , 0x56e0 , 0x59fb , -0x5f15 , 0x98f2 , 0x6deb , 0x80e4 , -0x852d , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9662 , 0x9670 , 0x96a0 , 0x97fb , -0x540b , 0x53f3 , 0x5b87 , 0x70cf , -0x7fbd , 0x8fc2 , 0x96e8 , 0x536f , -0x9d5c , 0x7aba , 0x4e11 , 0x7893 , -0x81fc , 0x6e26 , 0x5618 , 0x5504 , -0x6b1d , 0x851a , 0x9c3b , 0x59e5 , -0x53a9 , 0x6d66 , 0x74dc , 0x958f , -0x5642 , 0x4e91 , 0x904b , 0x96f2 , -0x834f , 0x990c , 0x53e1 , 0x55b6 , -0x5b30 , 0x5f71 , 0x6620 , 0x66f3 , -0x6804 , 0x6c38 , 0x6cf3 , 0x6d29 , -0x745b , 0x76c8 , 0x7a4e , 0x9834 , -0x82f1 , 0x885b , 0x8a60 , 0x92ed , -0x6db2 , 0x75ab , 0x76ca , 0x99c5 , -0x60a6 , 0x8b01 , 0x8d8a , 0x95b2 , -0x698e , 0x53ad , 0x5186 , 0x0 , -0x5712 , 0x5830 , 0x5944 , 0x5bb4 , -0x5ef6 , 0x6028 , 0x63a9 , 0x63f4 , -0x6cbf , 0x6f14 , 0x708e , 0x7114 , -0x7159 , 0x71d5 , 0x733f , 0x7e01 , -0x8276 , 0x82d1 , 0x8597 , 0x9060 , -0x925b , 0x9d1b , 0x5869 , 0x65bc , -0x6c5a , 0x7525 , 0x51f9 , 0x592e , -0x5965 , 0x5f80 , 0x5fdc , 0x62bc , -0x65fa , 0x6a2a , 0x6b27 , 0x6bb4 , -0x738b , 0x7fc1 , 0x8956 , 0x9d2c , -0x9d0e , 0x9ec4 , 0x5ca1 , 0x6c96 , -0x837b , 0x5104 , 0x5c4b , 0x61b6 , -0x81c6 , 0x6876 , 0x7261 , 0x4e59 , -0x4ffa , 0x5378 , 0x6069 , 0x6e29 , -0x7a4f , 0x97f3 , 0x4e0b , 0x5316 , -0x4eee , 0x4f55 , 0x4f3d , 0x4fa1 , -0x4f73 , 0x52a0 , 0x53ef , 0x5609 , -0x590f , 0x5ac1 , 0x5bb6 , 0x5be1 , -0x79d1 , 0x6687 , 0x679c , 0x67b6 , -0x6b4c , 0x6cb3 , 0x706b , 0x73c2 , -0x798d , 0x79be , 0x7a3c , 0x7b87 , -0x82b1 , 0x82db , 0x8304 , 0x8377 , -0x83ef , 0x83d3 , 0x8766 , 0x8ab2 , -0x5629 , 0x8ca8 , 0x8fe6 , 0x904e , -0x971e , 0x868a , 0x4fc4 , 0x5ce8 , -0x6211 , 0x7259 , 0x753b , 0x81e5 , -0x82bd , 0x86fe , 0x8cc0 , 0x96c5 , -0x9913 , 0x99d5 , 0x4ecb , 0x4f1a , -0x89e3 , 0x56de , 0x584a , 0x58ca , -0x5efb , 0x5feb , 0x602a , 0x6094 , -0x6062 , 0x61d0 , 0x6212 , 0x62d0 , -0x6539 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9b41 , 0x6666 , 0x68b0 , 0x6d77 , -0x7070 , 0x754c , 0x7686 , 0x7d75 , -0x82a5 , 0x87f9 , 0x958b , 0x968e , -0x8c9d , 0x51f1 , 0x52be , 0x5916 , -0x54b3 , 0x5bb3 , 0x5d16 , 0x6168 , -0x6982 , 0x6daf , 0x788d , 0x84cb , -0x8857 , 0x8a72 , 0x93a7 , 0x9ab8 , -0x6d6c , 0x99a8 , 0x86d9 , 0x57a3 , -0x67ff , 0x86ce , 0x920e , 0x5283 , -0x5687 , 0x5404 , 0x5ed3 , 0x62e1 , -0x64b9 , 0x683c , 0x6838 , 0x6bbb , -0x7372 , 0x78ba , 0x7a6b , 0x899a , -0x89d2 , 0x8d6b , 0x8f03 , 0x90ed , -0x95a3 , 0x9694 , 0x9769 , 0x5b66 , -0x5cb3 , 0x697d , 0x984d , 0x984e , -0x639b , 0x7b20 , 0x6a2b , 0x0 , -0x6a7f , 0x68b6 , 0x9c0d , 0x6f5f , -0x5272 , 0x559d , 0x6070 , 0x62ec , -0x6d3b , 0x6e07 , 0x6ed1 , 0x845b , -0x8910 , 0x8f44 , 0x4e14 , 0x9c39 , -0x53f6 , 0x691b , 0x6a3a , 0x9784 , -0x682a , 0x515c , 0x7ac3 , 0x84b2 , -0x91dc , 0x938c , 0x565b , 0x9d28 , -0x6822 , 0x8305 , 0x8431 , 0x7ca5 , -0x5208 , 0x82c5 , 0x74e6 , 0x4e7e , -0x4f83 , 0x51a0 , 0x5bd2 , 0x520a , -0x52d8 , 0x52e7 , 0x5dfb , 0x559a , -0x582a , 0x59e6 , 0x5b8c , 0x5b98 , -0x5bdb , 0x5e72 , 0x5e79 , 0x60a3 , -0x611f , 0x6163 , 0x61be , 0x63db , -0x6562 , 0x67d1 , 0x6853 , 0x68fa , -0x6b3e , 0x6b53 , 0x6c57 , 0x6f22 , -0x6f97 , 0x6f45 , 0x74b0 , 0x7518 , -0x76e3 , 0x770b , 0x7aff , 0x7ba1 , -0x7c21 , 0x7de9 , 0x7f36 , 0x7ff0 , -0x809d , 0x8266 , 0x839e , 0x89b3 , -0x8acc , 0x8cab , 0x9084 , 0x9451 , -0x9593 , 0x9591 , 0x95a2 , 0x9665 , -0x97d3 , 0x9928 , 0x8218 , 0x4e38 , -0x542b , 0x5cb8 , 0x5dcc , 0x73a9 , -0x764c , 0x773c , 0x5ca9 , 0x7feb , -0x8d0b , 0x96c1 , 0x9811 , 0x9854 , -0x9858 , 0x4f01 , 0x4f0e , 0x5371 , -0x559c , 0x5668 , 0x57fa , 0x5947 , -0x5b09 , 0x5bc4 , 0x5c90 , 0x5e0c , -0x5e7e , 0x5fcc , 0x63ee , 0x673a , -0x65d7 , 0x65e2 , 0x671f , 0x68cb , -0x68c4 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6a5f , 0x5e30 , 0x6bc5 , 0x6c17 , -0x6c7d , 0x757f , 0x7948 , 0x5b63 , -0x7a00 , 0x7d00 , 0x5fbd , 0x898f , -0x8a18 , 0x8cb4 , 0x8d77 , 0x8ecc , -0x8f1d , 0x98e2 , 0x9a0e , 0x9b3c , -0x4e80 , 0x507d , 0x5100 , 0x5993 , -0x5b9c , 0x622f , 0x6280 , 0x64ec , -0x6b3a , 0x72a0 , 0x7591 , 0x7947 , -0x7fa9 , 0x87fb , 0x8abc , 0x8b70 , -0x63ac , 0x83ca , 0x97a0 , 0x5409 , -0x5403 , 0x55ab , 0x6854 , 0x6a58 , -0x8a70 , 0x7827 , 0x6775 , 0x9ecd , -0x5374 , 0x5ba2 , 0x811a , 0x8650 , -0x9006 , 0x4e18 , 0x4e45 , 0x4ec7 , -0x4f11 , 0x53ca , 0x5438 , 0x5bae , -0x5f13 , 0x6025 , 0x6551 , 0x0 , -0x673d , 0x6c42 , 0x6c72 , 0x6ce3 , -0x7078 , 0x7403 , 0x7a76 , 0x7aae , -0x7b08 , 0x7d1a , 0x7cfe , 0x7d66 , -0x65e7 , 0x725b , 0x53bb , 0x5c45 , -0x5de8 , 0x62d2 , 0x62e0 , 0x6319 , -0x6e20 , 0x865a , 0x8a31 , 0x8ddd , -0x92f8 , 0x6f01 , 0x79a6 , 0x9b5a , -0x4ea8 , 0x4eab , 0x4eac , 0x4f9b , -0x4fa0 , 0x50d1 , 0x5147 , 0x7af6 , -0x5171 , 0x51f6 , 0x5354 , 0x5321 , -0x537f , 0x53eb , 0x55ac , 0x5883 , -0x5ce1 , 0x5f37 , 0x5f4a , 0x602f , -0x6050 , 0x606d , 0x631f , 0x6559 , -0x6a4b , 0x6cc1 , 0x72c2 , 0x72ed , -0x77ef , 0x80f8 , 0x8105 , 0x8208 , -0x854e , 0x90f7 , 0x93e1 , 0x97ff , -0x9957 , 0x9a5a , 0x4ef0 , 0x51dd , -0x5c2d , 0x6681 , 0x696d , 0x5c40 , -0x66f2 , 0x6975 , 0x7389 , 0x6850 , -0x7c81 , 0x50c5 , 0x52e4 , 0x5747 , -0x5dfe , 0x9326 , 0x65a4 , 0x6b23 , -0x6b3d , 0x7434 , 0x7981 , 0x79bd , -0x7b4b , 0x7dca , 0x82b9 , 0x83cc , -0x887f , 0x895f , 0x8b39 , 0x8fd1 , -0x91d1 , 0x541f , 0x9280 , 0x4e5d , -0x5036 , 0x53e5 , 0x533a , 0x72d7 , -0x7396 , 0x77e9 , 0x82e6 , 0x8eaf , -0x99c6 , 0x99c8 , 0x99d2 , 0x5177 , -0x611a , 0x865e , 0x55b0 , 0x7a7a , -0x5076 , 0x5bd3 , 0x9047 , 0x9685 , -0x4e32 , 0x6adb , 0x91e7 , 0x5c51 , -0x5c48 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6398 , 0x7a9f , 0x6c93 , 0x9774 , -0x8f61 , 0x7aaa , 0x718a , 0x9688 , -0x7c82 , 0x6817 , 0x7e70 , 0x6851 , -0x936c , 0x52f2 , 0x541b , 0x85ab , -0x8a13 , 0x7fa4 , 0x8ecd , 0x90e1 , -0x5366 , 0x8888 , 0x7941 , 0x4fc2 , -0x50be , 0x5211 , 0x5144 , 0x5553 , -0x572d , 0x73ea , 0x578b , 0x5951 , -0x5f62 , 0x5f84 , 0x6075 , 0x6176 , -0x6167 , 0x61a9 , 0x63b2 , 0x643a , -0x656c , 0x666f , 0x6842 , 0x6e13 , -0x7566 , 0x7a3d , 0x7cfb , 0x7d4c , -0x7d99 , 0x7e4b , 0x7f6b , 0x830e , -0x834a , 0x86cd , 0x8a08 , 0x8a63 , -0x8b66 , 0x8efd , 0x981a , 0x9d8f , -0x82b8 , 0x8fce , 0x9be8 , 0x0 , -0x5287 , 0x621f , 0x6483 , 0x6fc0 , -0x9699 , 0x6841 , 0x5091 , 0x6b20 , -0x6c7a , 0x6f54 , 0x7a74 , 0x7d50 , -0x8840 , 0x8a23 , 0x6708 , 0x4ef6 , -0x5039 , 0x5026 , 0x5065 , 0x517c , -0x5238 , 0x5263 , 0x55a7 , 0x570f , -0x5805 , 0x5acc , 0x5efa , 0x61b2 , -0x61f8 , 0x62f3 , 0x6372 , 0x691c , -0x6a29 , 0x727d , 0x72ac , 0x732e , -0x7814 , 0x786f , 0x7d79 , 0x770c , -0x80a9 , 0x898b , 0x8b19 , 0x8ce2 , -0x8ed2 , 0x9063 , 0x9375 , 0x967a , -0x9855 , 0x9a13 , 0x9e78 , 0x5143 , -0x539f , 0x53b3 , 0x5e7b , 0x5f26 , -0x6e1b , 0x6e90 , 0x7384 , 0x73fe , -0x7d43 , 0x8237 , 0x8a00 , 0x8afa , -0x9650 , 0x4e4e , 0x500b , 0x53e4 , -0x547c , 0x56fa , 0x59d1 , 0x5b64 , -0x5df1 , 0x5eab , 0x5f27 , 0x6238 , -0x6545 , 0x67af , 0x6e56 , 0x72d0 , -0x7cca , 0x88b4 , 0x80a1 , 0x80e1 , -0x83f0 , 0x864e , 0x8a87 , 0x8de8 , -0x9237 , 0x96c7 , 0x9867 , 0x9f13 , -0x4e94 , 0x4e92 , 0x4f0d , 0x5348 , -0x5449 , 0x543e , 0x5a2f , 0x5f8c , -0x5fa1 , 0x609f , 0x68a7 , 0x6a8e , -0x745a , 0x7881 , 0x8a9e , 0x8aa4 , -0x8b77 , 0x9190 , 0x4e5e , 0x9bc9 , -0x4ea4 , 0x4f7c , 0x4faf , 0x5019 , -0x5016 , 0x5149 , 0x516c , 0x529f , -0x52b9 , 0x52fe , 0x539a , 0x53e3 , -0x5411 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x540e , 0x5589 , 0x5751 , 0x57a2 , -0x597d , 0x5b54 , 0x5b5d , 0x5b8f , -0x5de5 , 0x5de7 , 0x5df7 , 0x5e78 , -0x5e83 , 0x5e9a , 0x5eb7 , 0x5f18 , -0x6052 , 0x614c , 0x6297 , 0x62d8 , -0x63a7 , 0x653b , 0x6602 , 0x6643 , -0x66f4 , 0x676d , 0x6821 , 0x6897 , -0x69cb , 0x6c5f , 0x6d2a , 0x6d69 , -0x6e2f , 0x6e9d , 0x7532 , 0x7687 , -0x786c , 0x7a3f , 0x7ce0 , 0x7d05 , -0x7d18 , 0x7d5e , 0x7db1 , 0x8015 , -0x8003 , 0x80af , 0x80b1 , 0x8154 , -0x818f , 0x822a , 0x8352 , 0x884c , -0x8861 , 0x8b1b , 0x8ca2 , 0x8cfc , -0x90ca , 0x9175 , 0x9271 , 0x783f , -0x92fc , 0x95a4 , 0x964d , 0x0 , -0x9805 , 0x9999 , 0x9ad8 , 0x9d3b , -0x525b , 0x52ab , 0x53f7 , 0x5408 , -0x58d5 , 0x62f7 , 0x6fe0 , 0x8c6a , -0x8f5f , 0x9eb9 , 0x514b , 0x523b , -0x544a , 0x56fd , 0x7a40 , 0x9177 , -0x9d60 , 0x9ed2 , 0x7344 , 0x6f09 , -0x8170 , 0x7511 , 0x5ffd , 0x60da , -0x9aa8 , 0x72db , 0x8fbc , 0x6b64 , -0x9803 , 0x4eca , 0x56f0 , 0x5764 , -0x58be , 0x5a5a , 0x6068 , 0x61c7 , -0x660f , 0x6606 , 0x6839 , 0x68b1 , -0x6df7 , 0x75d5 , 0x7d3a , 0x826e , -0x9b42 , 0x4e9b , 0x4f50 , 0x53c9 , -0x5506 , 0x5d6f , 0x5de6 , 0x5dee , -0x67fb , 0x6c99 , 0x7473 , 0x7802 , -0x8a50 , 0x9396 , 0x88df , 0x5750 , -0x5ea7 , 0x632b , 0x50b5 , 0x50ac , -0x518d , 0x6700 , 0x54c9 , 0x585e , -0x59bb , 0x5bb0 , 0x5f69 , 0x624d , -0x63a1 , 0x683d , 0x6b73 , 0x6e08 , -0x707d , 0x91c7 , 0x7280 , 0x7815 , -0x7826 , 0x796d , 0x658e , 0x7d30 , -0x83dc , 0x88c1 , 0x8f09 , 0x969b , -0x5264 , 0x5728 , 0x6750 , 0x7f6a , -0x8ca1 , 0x51b4 , 0x5742 , 0x962a , -0x583a , 0x698a , 0x80b4 , 0x54b2 , -0x5d0e , 0x57fc , 0x7895 , 0x9dfa , -0x4f5c , 0x524a , 0x548b , 0x643e , -0x6628 , 0x6714 , 0x67f5 , 0x7a84 , -0x7b56 , 0x7d22 , 0x932f , 0x685c , -0x9bad , 0x7b39 , 0x5319 , 0x518a , -0x5237 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5bdf , 0x62f6 , 0x64ae , 0x64e6 , -0x672d , 0x6bba , 0x85a9 , 0x96d1 , -0x7690 , 0x9bd6 , 0x634c , 0x9306 , -0x9bab , 0x76bf , 0x6652 , 0x4e09 , -0x5098 , 0x53c2 , 0x5c71 , 0x60e8 , -0x6492 , 0x6563 , 0x685f , 0x71e6 , -0x73ca , 0x7523 , 0x7b97 , 0x7e82 , -0x8695 , 0x8b83 , 0x8cdb , 0x9178 , -0x9910 , 0x65ac , 0x66ab , 0x6b8b , -0x4ed5 , 0x4ed4 , 0x4f3a , 0x4f7f , -0x523a , 0x53f8 , 0x53f2 , 0x55e3 , -0x56db , 0x58eb , 0x59cb , 0x59c9 , -0x59ff , 0x5b50 , 0x5c4d , 0x5e02 , -0x5e2b , 0x5fd7 , 0x601d , 0x6307 , -0x652f , 0x5b5c , 0x65af , 0x65bd , -0x65e8 , 0x679d , 0x6b62 , 0x0 , -0x6b7b , 0x6c0f , 0x7345 , 0x7949 , -0x79c1 , 0x7cf8 , 0x7d19 , 0x7d2b , -0x80a2 , 0x8102 , 0x81f3 , 0x8996 , -0x8a5e , 0x8a69 , 0x8a66 , 0x8a8c , -0x8aee , 0x8cc7 , 0x8cdc , 0x96cc , -0x98fc , 0x6b6f , 0x4e8b , 0x4f3c , -0x4f8d , 0x5150 , 0x5b57 , 0x5bfa , -0x6148 , 0x6301 , 0x6642 , 0x6b21 , -0x6ecb , 0x6cbb , 0x723e , 0x74bd , -0x75d4 , 0x78c1 , 0x793a , 0x800c , -0x8033 , 0x81ea , 0x8494 , 0x8f9e , -0x6c50 , 0x9e7f , 0x5f0f , 0x8b58 , -0x9d2b , 0x7afa , 0x8ef8 , 0x5b8d , -0x96eb , 0x4e03 , 0x53f1 , 0x57f7 , -0x5931 , 0x5ac9 , 0x5ba4 , 0x6089 , -0x6e7f , 0x6f06 , 0x75be , 0x8cea , -0x5b9f , 0x8500 , 0x7be0 , 0x5072 , -0x67f4 , 0x829d , 0x5c61 , 0x854a , -0x7e1e , 0x820e , 0x5199 , 0x5c04 , -0x6368 , 0x8d66 , 0x659c , 0x716e , -0x793e , 0x7d17 , 0x8005 , 0x8b1d , -0x8eca , 0x906e , 0x86c7 , 0x90aa , -0x501f , 0x52fa , 0x5c3a , 0x6753 , -0x707c , 0x7235 , 0x914c , 0x91c8 , -0x932b , 0x82e5 , 0x5bc2 , 0x5f31 , -0x60f9 , 0x4e3b , 0x53d6 , 0x5b88 , -0x624b , 0x6731 , 0x6b8a , 0x72e9 , -0x73e0 , 0x7a2e , 0x816b , 0x8da3 , -0x9152 , 0x9996 , 0x5112 , 0x53d7 , -0x546a , 0x5bff , 0x6388 , 0x6a39 , -0x7dac , 0x9700 , 0x56da , 0x53ce , -0x5468 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5b97 , 0x5c31 , 0x5dde , 0x4fee , -0x6101 , 0x62fe , 0x6d32 , 0x79c0 , -0x79cb , 0x7d42 , 0x7e4d , 0x7fd2 , -0x81ed , 0x821f , 0x8490 , 0x8846 , -0x8972 , 0x8b90 , 0x8e74 , 0x8f2f , -0x9031 , 0x914b , 0x916c , 0x96c6 , -0x919c , 0x4ec0 , 0x4f4f , 0x5145 , -0x5341 , 0x5f93 , 0x620e , 0x67d4 , -0x6c41 , 0x6e0b , 0x7363 , 0x7e26 , -0x91cd , 0x9283 , 0x53d4 , 0x5919 , -0x5bbf , 0x6dd1 , 0x795d , 0x7e2e , -0x7c9b , 0x587e , 0x719f , 0x51fa , -0x8853 , 0x8ff0 , 0x4fca , 0x5cfb , -0x6625 , 0x77ac , 0x7ae3 , 0x821c , -0x99ff , 0x51c6 , 0x5faa , 0x65ec , -0x696f , 0x6b89 , 0x6df3 , 0x0 , -0x6e96 , 0x6f64 , 0x76fe , 0x7d14 , -0x5de1 , 0x9075 , 0x9187 , 0x9806 , -0x51e6 , 0x521d , 0x6240 , 0x6691 , -0x66d9 , 0x6e1a , 0x5eb6 , 0x7dd2 , -0x7f72 , 0x66f8 , 0x85af , 0x85f7 , -0x8af8 , 0x52a9 , 0x53d9 , 0x5973 , -0x5e8f , 0x5f90 , 0x6055 , 0x92e4 , -0x9664 , 0x50b7 , 0x511f , 0x52dd , -0x5320 , 0x5347 , 0x53ec , 0x54e8 , -0x5546 , 0x5531 , 0x5617 , 0x5968 , -0x59be , 0x5a3c , 0x5bb5 , 0x5c06 , -0x5c0f , 0x5c11 , 0x5c1a , 0x5e84 , -0x5e8a , 0x5ee0 , 0x5f70 , 0x627f , -0x6284 , 0x62db , 0x638c , 0x6377 , -0x6607 , 0x660c , 0x662d , 0x6676 , -0x677e , 0x68a2 , 0x6a1f , 0x6a35 , -0x6cbc , 0x6d88 , 0x6e09 , 0x6e58 , -0x713c , 0x7126 , 0x7167 , 0x75c7 , -0x7701 , 0x785d , 0x7901 , 0x7965 , -0x79f0 , 0x7ae0 , 0x7b11 , 0x7ca7 , -0x7d39 , 0x8096 , 0x83d6 , 0x848b , -0x8549 , 0x885d , 0x88f3 , 0x8a1f , -0x8a3c , 0x8a54 , 0x8a73 , 0x8c61 , -0x8cde , 0x91a4 , 0x9266 , 0x937e , -0x9418 , 0x969c , 0x9798 , 0x4e0a , -0x4e08 , 0x4e1e , 0x4e57 , 0x5197 , -0x5270 , 0x57ce , 0x5834 , 0x58cc , -0x5b22 , 0x5e38 , 0x60c5 , 0x64fe , -0x6761 , 0x6756 , 0x6d44 , 0x72b6 , -0x7573 , 0x7a63 , 0x84b8 , 0x8b72 , -0x91b8 , 0x9320 , 0x5631 , 0x57f4 , -0x98fe , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x62ed , 0x690d , 0x6b96 , 0x71ed , -0x7e54 , 0x8077 , 0x8272 , 0x89e6 , -0x98df , 0x8755 , 0x8fb1 , 0x5c3b , -0x4f38 , 0x4fe1 , 0x4fb5 , 0x5507 , -0x5a20 , 0x5bdd , 0x5be9 , 0x5fc3 , -0x614e , 0x632f , 0x65b0 , 0x664b , -0x68ee , 0x699b , 0x6d78 , 0x6df1 , -0x7533 , 0x75b9 , 0x771f , 0x795e , -0x79e6 , 0x7d33 , 0x81e3 , 0x82af , -0x85aa , 0x89aa , 0x8a3a , 0x8eab , -0x8f9b , 0x9032 , 0x91dd , 0x9707 , -0x4eba , 0x4ec1 , 0x5203 , 0x5875 , -0x58ec , 0x5c0b , 0x751a , 0x5c3d , -0x814e , 0x8a0a , 0x8fc5 , 0x9663 , -0x976d , 0x7b25 , 0x8acf , 0x9808 , -0x9162 , 0x56f3 , 0x53a8 , 0x0 , -0x9017 , 0x5439 , 0x5782 , 0x5e25 , -0x63a8 , 0x6c34 , 0x708a , 0x7761 , -0x7c8b , 0x7fe0 , 0x8870 , 0x9042 , -0x9154 , 0x9310 , 0x9318 , 0x968f , -0x745e , 0x9ac4 , 0x5d07 , 0x5d69 , -0x6570 , 0x67a2 , 0x8da8 , 0x96db , -0x636e , 0x6749 , 0x6919 , 0x83c5 , -0x9817 , 0x96c0 , 0x88fe , 0x6f84 , -0x647a , 0x5bf8 , 0x4e16 , 0x702c , -0x755d , 0x662f , 0x51c4 , 0x5236 , -0x52e2 , 0x59d3 , 0x5f81 , 0x6027 , -0x6210 , 0x653f , 0x6574 , 0x661f , -0x6674 , 0x68f2 , 0x6816 , 0x6b63 , -0x6e05 , 0x7272 , 0x751f , 0x76db , -0x7cbe , 0x8056 , 0x58f0 , 0x88fd , -0x897f , 0x8aa0 , 0x8a93 , 0x8acb , -0x901d , 0x9192 , 0x9752 , 0x9759 , -0x6589 , 0x7a0e , 0x8106 , 0x96bb , -0x5e2d , 0x60dc , 0x621a , 0x65a5 , -0x6614 , 0x6790 , 0x77f3 , 0x7a4d , -0x7c4d , 0x7e3e , 0x810a , 0x8cac , -0x8d64 , 0x8de1 , 0x8e5f , 0x78a9 , -0x5207 , 0x62d9 , 0x63a5 , 0x6442 , -0x6298 , 0x8a2d , 0x7a83 , 0x7bc0 , -0x8aac , 0x96ea , 0x7d76 , 0x820c , -0x8749 , 0x4ed9 , 0x5148 , 0x5343 , -0x5360 , 0x5ba3 , 0x5c02 , 0x5c16 , -0x5ddd , 0x6226 , 0x6247 , 0x64b0 , -0x6813 , 0x6834 , 0x6cc9 , 0x6d45 , -0x6d17 , 0x67d3 , 0x6f5c , 0x714e , -0x717d , 0x65cb , 0x7a7f , 0x7bad , -0x7dda , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7e4a , 0x7fa8 , 0x817a , 0x821b , -0x8239 , 0x85a6 , 0x8a6e , 0x8cce , -0x8df5 , 0x9078 , 0x9077 , 0x92ad , -0x9291 , 0x9583 , 0x9bae , 0x524d , -0x5584 , 0x6f38 , 0x7136 , 0x5168 , -0x7985 , 0x7e55 , 0x81b3 , 0x7cce , -0x564c , 0x5851 , 0x5ca8 , 0x63aa , -0x66fe , 0x66fd , 0x695a , 0x72d9 , -0x758f , 0x758e , 0x790e , 0x7956 , -0x79df , 0x7c97 , 0x7d20 , 0x7d44 , -0x8607 , 0x8a34 , 0x963b , 0x9061 , -0x9f20 , 0x50e7 , 0x5275 , 0x53cc , -0x53e2 , 0x5009 , 0x55aa , 0x58ee , -0x594f , 0x723d , 0x5b8b , 0x5c64 , -0x531d , 0x60e3 , 0x60f3 , 0x635c , -0x6383 , 0x633f , 0x63bb , 0x0 , -0x64cd , 0x65e9 , 0x66f9 , 0x5de3 , -0x69cd , 0x69fd , 0x6f15 , 0x71e5 , -0x4e89 , 0x75e9 , 0x76f8 , 0x7a93 , -0x7cdf , 0x7dcf , 0x7d9c , 0x8061 , -0x8349 , 0x8358 , 0x846c , 0x84bc , -0x85fb , 0x88c5 , 0x8d70 , 0x9001 , -0x906d , 0x9397 , 0x971c , 0x9a12 , -0x50cf , 0x5897 , 0x618e , 0x81d3 , -0x8535 , 0x8d08 , 0x9020 , 0x4fc3 , -0x5074 , 0x5247 , 0x5373 , 0x606f , -0x6349 , 0x675f , 0x6e2c , 0x8db3 , -0x901f , 0x4fd7 , 0x5c5e , 0x8cca , -0x65cf , 0x7d9a , 0x5352 , 0x8896 , -0x5176 , 0x63c3 , 0x5b58 , 0x5b6b , -0x5c0a , 0x640d , 0x6751 , 0x905c , -0x4ed6 , 0x591a , 0x592a , 0x6c70 , -0x8a51 , 0x553e , 0x5815 , 0x59a5 , -0x60f0 , 0x6253 , 0x67c1 , 0x8235 , -0x6955 , 0x9640 , 0x99c4 , 0x9a28 , -0x4f53 , 0x5806 , 0x5bfe , 0x8010 , -0x5cb1 , 0x5e2f , 0x5f85 , 0x6020 , -0x614b , 0x6234 , 0x66ff , 0x6cf0 , -0x6ede , 0x80ce , 0x817f , 0x82d4 , -0x888b , 0x8cb8 , 0x9000 , 0x902e , -0x968a , 0x9edb , 0x9bdb , 0x4ee3 , -0x53f0 , 0x5927 , 0x7b2c , 0x918d , -0x984c , 0x9df9 , 0x6edd , 0x7027 , -0x5353 , 0x5544 , 0x5b85 , 0x6258 , -0x629e , 0x62d3 , 0x6ca2 , 0x6fef , -0x7422 , 0x8a17 , 0x9438 , 0x6fc1 , -0x8afe , 0x8338 , 0x51e7 , 0x86f8 , -0x53ea , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x53e9 , 0x4f46 , 0x9054 , 0x8fb0 , -0x596a , 0x8131 , 0x5dfd , 0x7aea , -0x8fbf , 0x68da , 0x8c37 , 0x72f8 , -0x9c48 , 0x6a3d , 0x8ab0 , 0x4e39 , -0x5358 , 0x5606 , 0x5766 , 0x62c5 , -0x63a2 , 0x65e6 , 0x6b4e , 0x6de1 , -0x6e5b , 0x70ad , 0x77ed , 0x7aef , -0x7baa , 0x7dbb , 0x803d , 0x80c6 , -0x86cb , 0x8a95 , 0x935b , 0x56e3 , -0x58c7 , 0x5f3e , 0x65ad , 0x6696 , -0x6a80 , 0x6bb5 , 0x7537 , 0x8ac7 , -0x5024 , 0x77e5 , 0x5730 , 0x5f1b , -0x6065 , 0x667a , 0x6c60 , 0x75f4 , -0x7a1a , 0x7f6e , 0x81f4 , 0x8718 , -0x9045 , 0x99b3 , 0x7bc9 , 0x755c , -0x7af9 , 0x7b51 , 0x84c4 , 0x0 , -0x9010 , 0x79e9 , 0x7a92 , 0x8336 , -0x5ae1 , 0x7740 , 0x4e2d , 0x4ef2 , -0x5b99 , 0x5fe0 , 0x62bd , 0x663c , -0x67f1 , 0x6ce8 , 0x866b , 0x8877 , -0x8a3b , 0x914e , 0x92f3 , 0x99d0 , -0x6a17 , 0x7026 , 0x732a , 0x82e7 , -0x8457 , 0x8caf , 0x4e01 , 0x5146 , -0x51cb , 0x558b , 0x5bf5 , 0x5e16 , -0x5e33 , 0x5e81 , 0x5f14 , 0x5f35 , -0x5f6b , 0x5fb4 , 0x61f2 , 0x6311 , -0x66a2 , 0x671d , 0x6f6e , 0x7252 , -0x753a , 0x773a , 0x8074 , 0x8139 , -0x8178 , 0x8776 , 0x8abf , 0x8adc , -0x8d85 , 0x8df3 , 0x929a , 0x9577 , -0x9802 , 0x9ce5 , 0x52c5 , 0x6357 , -0x76f4 , 0x6715 , 0x6c88 , 0x73cd , -0x8cc3 , 0x93ae , 0x9673 , 0x6d25 , -0x589c , 0x690e , 0x69cc , 0x8ffd , -0x939a , 0x75db , 0x901a , 0x585a , -0x6802 , 0x63b4 , 0x69fb , 0x4f43 , -0x6f2c , 0x67d8 , 0x8fbb , 0x8526 , -0x7db4 , 0x9354 , 0x693f , 0x6f70 , -0x576a , 0x58f7 , 0x5b2c , 0x7d2c , -0x722a , 0x540a , 0x91e3 , 0x9db4 , -0x4ead , 0x4f4e , 0x505c , 0x5075 , -0x5243 , 0x8c9e , 0x5448 , 0x5824 , -0x5b9a , 0x5e1d , 0x5e95 , 0x5ead , -0x5ef7 , 0x5f1f , 0x608c , 0x62b5 , -0x633a , 0x63d0 , 0x68af , 0x6c40 , -0x7887 , 0x798e , 0x7a0b , 0x7de0 , -0x8247 , 0x8a02 , 0x8ae6 , 0x8e44 , -0x9013 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x90b8 , 0x912d , 0x91d8 , 0x9f0e , -0x6ce5 , 0x6458 , 0x64e2 , 0x6575 , -0x6ef4 , 0x7684 , 0x7b1b , 0x9069 , -0x93d1 , 0x6eba , 0x54f2 , 0x5fb9 , -0x64a4 , 0x8f4d , 0x8fed , 0x9244 , -0x5178 , 0x586b , 0x5929 , 0x5c55 , -0x5e97 , 0x6dfb , 0x7e8f , 0x751c , -0x8cbc , 0x8ee2 , 0x985b , 0x70b9 , -0x4f1d , 0x6bbf , 0x6fb1 , 0x7530 , -0x96fb , 0x514e , 0x5410 , 0x5835 , -0x5857 , 0x59ac , 0x5c60 , 0x5f92 , -0x6597 , 0x675c , 0x6e21 , 0x767b , -0x83df , 0x8ced , 0x9014 , 0x90fd , -0x934d , 0x7825 , 0x783a , 0x52aa , -0x5ea6 , 0x571f , 0x5974 , 0x6012 , -0x5012 , 0x515a , 0x51ac , 0x0 , -0x51cd , 0x5200 , 0x5510 , 0x5854 , -0x5858 , 0x5957 , 0x5b95 , 0x5cf6 , -0x5d8b , 0x60bc , 0x6295 , 0x642d , -0x6771 , 0x6843 , 0x68bc , 0x68df , -0x76d7 , 0x6dd8 , 0x6e6f , 0x6d9b , -0x706f , 0x71c8 , 0x5f53 , 0x75d8 , -0x7977 , 0x7b49 , 0x7b54 , 0x7b52 , -0x7cd6 , 0x7d71 , 0x5230 , 0x8463 , -0x8569 , 0x85e4 , 0x8a0e , 0x8b04 , -0x8c46 , 0x8e0f , 0x9003 , 0x900f , -0x9419 , 0x9676 , 0x982d , 0x9a30 , -0x95d8 , 0x50cd , 0x52d5 , 0x540c , -0x5802 , 0x5c0e , 0x61a7 , 0x649e , -0x6d1e , 0x77b3 , 0x7ae5 , 0x80f4 , -0x8404 , 0x9053 , 0x9285 , 0x5ce0 , -0x9d07 , 0x533f , 0x5f97 , 0x5fb3 , -0x6d9c , 0x7279 , 0x7763 , 0x79bf , -0x7be4 , 0x6bd2 , 0x72ec , 0x8aad , -0x6803 , 0x6a61 , 0x51f8 , 0x7a81 , -0x6934 , 0x5c4a , 0x9cf6 , 0x82eb , -0x5bc5 , 0x9149 , 0x701e , 0x5678 , -0x5c6f , 0x60c7 , 0x6566 , 0x6c8c , -0x8c5a , 0x9041 , 0x9813 , 0x5451 , -0x66c7 , 0x920d , 0x5948 , 0x90a3 , -0x5185 , 0x4e4d , 0x51ea , 0x8599 , -0x8b0e , 0x7058 , 0x637a , 0x934b , -0x6962 , 0x99b4 , 0x7e04 , 0x7577 , -0x5357 , 0x6960 , 0x8edf , 0x96e3 , -0x6c5d , 0x4e8c , 0x5c3c , 0x5f10 , -0x8fe9 , 0x5302 , 0x8cd1 , 0x8089 , -0x8679 , 0x5eff , 0x65e5 , 0x4e73 , -0x5165 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5982 , 0x5c3f , 0x97ee , 0x4efb , -0x598a , 0x5fcd , 0x8a8d , 0x6fe1 , -0x79b0 , 0x7962 , 0x5be7 , 0x8471 , -0x732b , 0x71b1 , 0x5e74 , 0x5ff5 , -0x637b , 0x649a , 0x71c3 , 0x7c98 , -0x4e43 , 0x5efc , 0x4e4b , 0x57dc , -0x56a2 , 0x60a9 , 0x6fc3 , 0x7d0d , -0x80fd , 0x8133 , 0x81bf , 0x8fb2 , -0x8997 , 0x86a4 , 0x5df4 , 0x628a , -0x64ad , 0x8987 , 0x6777 , 0x6ce2 , -0x6d3e , 0x7436 , 0x7834 , 0x5a46 , -0x7f75 , 0x82ad , 0x99ac , 0x4ff3 , -0x5ec3 , 0x62dd , 0x6392 , 0x6557 , -0x676f , 0x76c3 , 0x724c , 0x80cc , -0x80ba , 0x8f29 , 0x914d , 0x500d , -0x57f9 , 0x5a92 , 0x6885 , 0x0 , -0x6973 , 0x7164 , 0x72fd , 0x8cb7 , -0x58f2 , 0x8ce0 , 0x966a , 0x9019 , -0x877f , 0x79e4 , 0x77e7 , 0x8429 , -0x4f2f , 0x5265 , 0x535a , 0x62cd , -0x67cf , 0x6cca , 0x767d , 0x7b94 , -0x7c95 , 0x8236 , 0x8584 , 0x8feb , -0x66dd , 0x6f20 , 0x7206 , 0x7e1b , -0x83ab , 0x99c1 , 0x9ea6 , 0x51fd , -0x7bb1 , 0x7872 , 0x7bb8 , 0x8087 , -0x7b48 , 0x6ae8 , 0x5e61 , 0x808c , -0x7551 , 0x7560 , 0x516b , 0x9262 , -0x6e8c , 0x767a , 0x9197 , 0x9aea , -0x4f10 , 0x7f70 , 0x629c , 0x7b4f , -0x95a5 , 0x9ce9 , 0x567a , 0x5859 , -0x86e4 , 0x96bc , 0x4f34 , 0x5224 , -0x534a , 0x53cd , 0x53db , 0x5e06 , -0x642c , 0x6591 , 0x677f , 0x6c3e , -0x6c4e , 0x7248 , 0x72af , 0x73ed , -0x7554 , 0x7e41 , 0x822c , 0x85e9 , -0x8ca9 , 0x7bc4 , 0x91c6 , 0x7169 , -0x9812 , 0x98ef , 0x633d , 0x6669 , -0x756a , 0x76e4 , 0x78d0 , 0x8543 , -0x86ee , 0x532a , 0x5351 , 0x5426 , -0x5983 , 0x5e87 , 0x5f7c , 0x60b2 , -0x6249 , 0x6279 , 0x62ab , 0x6590 , -0x6bd4 , 0x6ccc , 0x75b2 , 0x76ae , -0x7891 , 0x79d8 , 0x7dcb , 0x7f77 , -0x80a5 , 0x88ab , 0x8ab9 , 0x8cbb , -0x907f , 0x975e , 0x98db , 0x6a0b , -0x7c38 , 0x5099 , 0x5c3e , 0x5fae , -0x6787 , 0x6bd8 , 0x7435 , 0x7709 , -0x7f8e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9f3b , 0x67ca , 0x7a17 , 0x5339 , -0x758b , 0x9aed , 0x5f66 , 0x819d , -0x83f1 , 0x8098 , 0x5f3c , 0x5fc5 , -0x7562 , 0x7b46 , 0x903c , 0x6867 , -0x59eb , 0x5a9b , 0x7d10 , 0x767e , -0x8b2c , 0x4ff5 , 0x5f6a , 0x6a19 , -0x6c37 , 0x6f02 , 0x74e2 , 0x7968 , -0x8868 , 0x8a55 , 0x8c79 , 0x5edf , -0x63cf , 0x75c5 , 0x79d2 , 0x82d7 , -0x9328 , 0x92f2 , 0x849c , 0x86ed , -0x9c2d , 0x54c1 , 0x5f6c , 0x658c , -0x6d5c , 0x7015 , 0x8ca7 , 0x8cd3 , -0x983b , 0x654f , 0x74f6 , 0x4e0d , -0x4ed8 , 0x57e0 , 0x592b , 0x5a66 , -0x5bcc , 0x51a8 , 0x5e03 , 0x5e9c , -0x6016 , 0x6276 , 0x6577 , 0x0 , -0x65a7 , 0x666e , 0x6d6e , 0x7236 , -0x7b26 , 0x8150 , 0x819a , 0x8299 , -0x8b5c , 0x8ca0 , 0x8ce6 , 0x8d74 , -0x961c , 0x9644 , 0x4fae , 0x64ab , -0x6b66 , 0x821e , 0x8461 , 0x856a , -0x90e8 , 0x5c01 , 0x6953 , 0x98a8 , -0x847a , 0x8557 , 0x4f0f , 0x526f , -0x5fa9 , 0x5e45 , 0x670d , 0x798f , -0x8179 , 0x8907 , 0x8986 , 0x6df5 , -0x5f17 , 0x6255 , 0x6cb8 , 0x4ecf , -0x7269 , 0x9b92 , 0x5206 , 0x543b , -0x5674 , 0x58b3 , 0x61a4 , 0x626e , -0x711a , 0x596e , 0x7c89 , 0x7cde , -0x7d1b , 0x96f0 , 0x6587 , 0x805e , -0x4e19 , 0x4f75 , 0x5175 , 0x5840 , -0x5e63 , 0x5e73 , 0x5f0a , 0x67c4 , -0x4e26 , 0x853d , 0x9589 , 0x965b , -0x7c73 , 0x9801 , 0x50fb , 0x58c1 , -0x7656 , 0x78a7 , 0x5225 , 0x77a5 , -0x8511 , 0x7b86 , 0x504f , 0x5909 , -0x7247 , 0x7bc7 , 0x7de8 , 0x8fba , -0x8fd4 , 0x904d , 0x4fbf , 0x52c9 , -0x5a29 , 0x5f01 , 0x97ad , 0x4fdd , -0x8217 , 0x92ea , 0x5703 , 0x6355 , -0x6b69 , 0x752b , 0x88dc , 0x8f14 , -0x7a42 , 0x52df , 0x5893 , 0x6155 , -0x620a , 0x66ae , 0x6bcd , 0x7c3f , -0x83e9 , 0x5023 , 0x4ff8 , 0x5305 , -0x5446 , 0x5831 , 0x5949 , 0x5b9d , -0x5cf0 , 0x5cef , 0x5d29 , 0x5e96 , -0x62b1 , 0x6367 , 0x653e , 0x65b9 , -0x670b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6cd5 , 0x6ce1 , 0x70f9 , 0x7832 , -0x7e2b , 0x80de , 0x82b3 , 0x840c , -0x84ec , 0x8702 , 0x8912 , 0x8a2a , -0x8c4a , 0x90a6 , 0x92d2 , 0x98fd , -0x9cf3 , 0x9d6c , 0x4e4f , 0x4ea1 , -0x508d , 0x5256 , 0x574a , 0x59a8 , -0x5e3d , 0x5fd8 , 0x5fd9 , 0x623f , -0x66b4 , 0x671b , 0x67d0 , 0x68d2 , -0x5192 , 0x7d21 , 0x80aa , 0x81a8 , -0x8b00 , 0x8c8c , 0x8cbf , 0x927e , -0x9632 , 0x5420 , 0x982c , 0x5317 , -0x50d5 , 0x535c , 0x58a8 , 0x64b2 , -0x6734 , 0x7267 , 0x7766 , 0x7a46 , -0x91e6 , 0x52c3 , 0x6ca1 , 0x6b86 , -0x5800 , 0x5e4c , 0x5954 , 0x672c , -0x7ffb , 0x51e1 , 0x76c6 , 0x0 , -0x6469 , 0x78e8 , 0x9b54 , 0x9ebb , -0x57cb , 0x59b9 , 0x6627 , 0x679a , -0x6bce , 0x54e9 , 0x69d9 , 0x5e55 , -0x819c , 0x6795 , 0x9baa , 0x67fe , -0x9c52 , 0x685d , 0x4ea6 , 0x4fe3 , -0x53c8 , 0x62b9 , 0x672b , 0x6cab , -0x8fc4 , 0x4fad , 0x7e6d , 0x9ebf , -0x4e07 , 0x6162 , 0x6e80 , 0x6f2b , -0x8513 , 0x5473 , 0x672a , 0x9b45 , -0x5df3 , 0x7b95 , 0x5cac , 0x5bc6 , -0x871c , 0x6e4a , 0x84d1 , 0x7a14 , -0x8108 , 0x5999 , 0x7c8d , 0x6c11 , -0x7720 , 0x52d9 , 0x5922 , 0x7121 , -0x725f , 0x77db , 0x9727 , 0x9d61 , -0x690b , 0x5a7f , 0x5a18 , 0x51a5 , -0x540d , 0x547d , 0x660e , 0x76df , -0x8ff7 , 0x9298 , 0x9cf4 , 0x59ea , -0x725d , 0x6ec5 , 0x514d , 0x68c9 , -0x7dbf , 0x7dec , 0x9762 , 0x9eba , -0x6478 , 0x6a21 , 0x8302 , 0x5984 , -0x5b5f , 0x6bdb , 0x731b , 0x76f2 , -0x7db2 , 0x8017 , 0x8499 , 0x5132 , -0x6728 , 0x9ed9 , 0x76ee , 0x6762 , -0x52ff , 0x9905 , 0x5c24 , 0x623b , -0x7c7e , 0x8cb0 , 0x554f , 0x60b6 , -0x7d0b , 0x9580 , 0x5301 , 0x4e5f , -0x51b6 , 0x591c , 0x723a , 0x8036 , -0x91ce , 0x5f25 , 0x77e2 , 0x5384 , -0x5f79 , 0x7d04 , 0x85ac , 0x8a33 , -0x8e8d , 0x9756 , 0x67f3 , 0x85ae , -0x9453 , 0x6109 , 0x6108 , 0x6cb9 , -0x7652 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8aed , 0x8f38 , 0x552f , 0x4f51 , -0x512a , 0x52c7 , 0x53cb , 0x5ba5 , -0x5e7d , 0x60a0 , 0x6182 , 0x63d6 , -0x6709 , 0x67da , 0x6e67 , 0x6d8c , -0x7336 , 0x7337 , 0x7531 , 0x7950 , -0x88d5 , 0x8a98 , 0x904a , 0x9091 , -0x90f5 , 0x96c4 , 0x878d , 0x5915 , -0x4e88 , 0x4f59 , 0x4e0e , 0x8a89 , -0x8f3f , 0x9810 , 0x50ad , 0x5e7c , -0x5996 , 0x5bb9 , 0x5eb8 , 0x63da , -0x63fa , 0x64c1 , 0x66dc , 0x694a , -0x69d8 , 0x6d0b , 0x6eb6 , 0x7194 , -0x7528 , 0x7aaf , 0x7f8a , 0x8000 , -0x8449 , 0x84c9 , 0x8981 , 0x8b21 , -0x8e0a , 0x9065 , 0x967d , 0x990a , -0x617e , 0x6291 , 0x6b32 , 0x0 , -0x6c83 , 0x6d74 , 0x7fcc , 0x7ffc , -0x6dc0 , 0x7f85 , 0x87ba , 0x88f8 , -0x6765 , 0x83b1 , 0x983c , 0x96f7 , -0x6d1b , 0x7d61 , 0x843d , 0x916a , -0x4e71 , 0x5375 , 0x5d50 , 0x6b04 , -0x6feb , 0x85cd , 0x862d , 0x89a7 , -0x5229 , 0x540f , 0x5c65 , 0x674e , -0x68a8 , 0x7406 , 0x7483 , 0x75e2 , -0x88cf , 0x88e1 , 0x91cc , 0x96e2 , -0x9678 , 0x5f8b , 0x7387 , 0x7acb , -0x844e , 0x63a0 , 0x7565 , 0x5289 , -0x6d41 , 0x6e9c , 0x7409 , 0x7559 , -0x786b , 0x7c92 , 0x9686 , 0x7adc , -0x9f8d , 0x4fb6 , 0x616e , 0x65c5 , -0x865c , 0x4e86 , 0x4eae , 0x50da , -0x4e21 , 0x51cc , 0x5bee , 0x6599 , -0x6881 , 0x6dbc , 0x731f , 0x7642 , -0x77ad , 0x7a1c , 0x7ce7 , 0x826f , -0x8ad2 , 0x907c , 0x91cf , 0x9675 , -0x9818 , 0x529b , 0x7dd1 , 0x502b , -0x5398 , 0x6797 , 0x6dcb , 0x71d0 , -0x7433 , 0x81e8 , 0x8f2a , 0x96a3 , -0x9c57 , 0x9e9f , 0x7460 , 0x5841 , -0x6d99 , 0x7d2f , 0x985e , 0x4ee4 , -0x4f36 , 0x4f8b , 0x51b7 , 0x52b1 , -0x5dba , 0x601c , 0x73b2 , 0x793c , -0x82d3 , 0x9234 , 0x96b7 , 0x96f6 , -0x970a , 0x9e97 , 0x9f62 , 0x66a6 , -0x6b74 , 0x5217 , 0x52a3 , 0x70c8 , -0x88c2 , 0x5ec9 , 0x604b , 0x6190 , -0x6f23 , 0x7149 , 0x7c3e , 0x7df4 , -0x806f , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x84ee , 0x9023 , 0x932c , 0x5442 , -0x9b6f , 0x6ad3 , 0x7089 , 0x8cc2 , -0x8def , 0x9732 , 0x52b4 , 0x5a41 , -0x5eca , 0x5f04 , 0x6717 , 0x697c , -0x6994 , 0x6d6a , 0x6f0f , 0x7262 , -0x72fc , 0x7bed , 0x8001 , 0x807e , -0x874b , 0x90ce , 0x516d , 0x9e93 , -0x7984 , 0x808b , 0x9332 , 0x8ad6 , -0x502d , 0x548c , 0x8a71 , 0x6b6a , -0x8cc4 , 0x8107 , 0x60d1 , 0x67a0 , -0x9df2 , 0x4e99 , 0x4e98 , 0x9c10 , -0x8a6b , 0x85c1 , 0x8568 , 0x6900 , -0x6e7e , 0x7897 , 0x8155 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x5f0c , -0x4e10 , 0x4e15 , 0x4e2a , 0x4e31 , -0x4e36 , 0x4e3c , 0x4e3f , 0x4e42 , -0x4e56 , 0x4e58 , 0x4e82 , 0x4e85 , -0x8c6b , 0x4e8a , 0x8212 , 0x5f0d , -0x4e8e , 0x4e9e , 0x4e9f , 0x4ea0 , -0x4ea2 , 0x4eb0 , 0x4eb3 , 0x4eb6 , -0x4ece , 0x4ecd , 0x4ec4 , 0x4ec6 , -0x4ec2 , 0x4ed7 , 0x4ede , 0x4eed , -0x4edf , 0x4ef7 , 0x4f09 , 0x4f5a , -0x4f30 , 0x4f5b , 0x4f5d , 0x4f57 , -0x4f47 , 0x4f76 , 0x4f88 , 0x4f8f , -0x4f98 , 0x4f7b , 0x4f69 , 0x4f70 , -0x4f91 , 0x4f6f , 0x4f86 , 0x4f96 , -0x5118 , 0x4fd4 , 0x4fdf , 0x4fce , -0x4fd8 , 0x4fdb , 0x4fd1 , 0x4fda , -0x4fd0 , 0x4fe4 , 0x4fe5 , 0x501a , -0x5028 , 0x5014 , 0x502a , 0x5025 , -0x5005 , 0x4f1c , 0x4ff6 , 0x5021 , -0x5029 , 0x502c , 0x4ffe , 0x4fef , -0x5011 , 0x5006 , 0x5043 , 0x5047 , -0x6703 , 0x5055 , 0x5050 , 0x5048 , -0x505a , 0x5056 , 0x506c , 0x5078 , -0x5080 , 0x509a , 0x5085 , 0x50b4 , -0x50b2 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x50c9 , 0x50ca , 0x50b3 , 0x50c2 , -0x50d6 , 0x50de , 0x50e5 , 0x50ed , -0x50e3 , 0x50ee , 0x50f9 , 0x50f5 , -0x5109 , 0x5101 , 0x5102 , 0x5116 , -0x5115 , 0x5114 , 0x511a , 0x5121 , -0x513a , 0x5137 , 0x513c , 0x513b , -0x513f , 0x5140 , 0x5152 , 0x514c , -0x5154 , 0x5162 , 0x7af8 , 0x5169 , -0x516a , 0x516e , 0x5180 , 0x5182 , -0x56d8 , 0x518c , 0x5189 , 0x518f , -0x5191 , 0x5193 , 0x5195 , 0x5196 , -0x51a4 , 0x51a6 , 0x51a2 , 0x51a9 , -0x51aa , 0x51ab , 0x51b3 , 0x51b1 , -0x51b2 , 0x51b0 , 0x51b5 , 0x51bd , -0x51c5 , 0x51c9 , 0x51db , 0x51e0 , -0x8655 , 0x51e9 , 0x51ed , 0x0 , -0x51f0 , 0x51f5 , 0x51fe , 0x5204 , -0x520b , 0x5214 , 0x520e , 0x5227 , -0x522a , 0x522e , 0x5233 , 0x5239 , -0x524f , 0x5244 , 0x524b , 0x524c , -0x525e , 0x5254 , 0x526a , 0x5274 , -0x5269 , 0x5273 , 0x527f , 0x527d , -0x528d , 0x5294 , 0x5292 , 0x5271 , -0x5288 , 0x5291 , 0x8fa8 , 0x8fa7 , -0x52ac , 0x52ad , 0x52bc , 0x52b5 , -0x52c1 , 0x52cd , 0x52d7 , 0x52de , -0x52e3 , 0x52e6 , 0x98ed , 0x52e0 , -0x52f3 , 0x52f5 , 0x52f8 , 0x52f9 , -0x5306 , 0x5308 , 0x7538 , 0x530d , -0x5310 , 0x530f , 0x5315 , 0x531a , -0x5323 , 0x532f , 0x5331 , 0x5333 , -0x5338 , 0x5340 , 0x5346 , 0x5345 , -0x4e17 , 0x5349 , 0x534d , 0x51d6 , -0x535e , 0x5369 , 0x536e , 0x5918 , -0x537b , 0x5377 , 0x5382 , 0x5396 , -0x53a0 , 0x53a6 , 0x53a5 , 0x53ae , -0x53b0 , 0x53b6 , 0x53c3 , 0x7c12 , -0x96d9 , 0x53df , 0x66fc , 0x71ee , -0x53ee , 0x53e8 , 0x53ed , 0x53fa , -0x5401 , 0x543d , 0x5440 , 0x542c , -0x542d , 0x543c , 0x542e , 0x5436 , -0x5429 , 0x541d , 0x544e , 0x548f , -0x5475 , 0x548e , 0x545f , 0x5471 , -0x5477 , 0x5470 , 0x5492 , 0x547b , -0x5480 , 0x5476 , 0x5484 , 0x5490 , -0x5486 , 0x54c7 , 0x54a2 , 0x54b8 , -0x54a5 , 0x54ac , 0x54c4 , 0x54c8 , -0x54a8 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x54ab , 0x54c2 , 0x54a4 , 0x54be , -0x54bc , 0x54d8 , 0x54e5 , 0x54e6 , -0x550f , 0x5514 , 0x54fd , 0x54ee , -0x54ed , 0x54fa , 0x54e2 , 0x5539 , -0x5540 , 0x5563 , 0x554c , 0x552e , -0x555c , 0x5545 , 0x5556 , 0x5557 , -0x5538 , 0x5533 , 0x555d , 0x5599 , -0x5580 , 0x54af , 0x558a , 0x559f , -0x557b , 0x557e , 0x5598 , 0x559e , -0x55ae , 0x557c , 0x5583 , 0x55a9 , -0x5587 , 0x55a8 , 0x55da , 0x55c5 , -0x55df , 0x55c4 , 0x55dc , 0x55e4 , -0x55d4 , 0x5614 , 0x55f7 , 0x5616 , -0x55fe , 0x55fd , 0x561b , 0x55f9 , -0x564e , 0x5650 , 0x71df , 0x5634 , -0x5636 , 0x5632 , 0x5638 , 0x0 , -0x566b , 0x5664 , 0x562f , 0x566c , -0x566a , 0x5686 , 0x5680 , 0x568a , -0x56a0 , 0x5694 , 0x568f , 0x56a5 , -0x56ae , 0x56b6 , 0x56b4 , 0x56c2 , -0x56bc , 0x56c1 , 0x56c3 , 0x56c0 , -0x56c8 , 0x56ce , 0x56d1 , 0x56d3 , -0x56d7 , 0x56ee , 0x56f9 , 0x5700 , -0x56ff , 0x5704 , 0x5709 , 0x5708 , -0x570b , 0x570d , 0x5713 , 0x5718 , -0x5716 , 0x55c7 , 0x571c , 0x5726 , -0x5737 , 0x5738 , 0x574e , 0x573b , -0x5740 , 0x574f , 0x5769 , 0x57c0 , -0x5788 , 0x5761 , 0x577f , 0x5789 , -0x5793 , 0x57a0 , 0x57b3 , 0x57a4 , -0x57aa , 0x57b0 , 0x57c3 , 0x57c6 , -0x57d4 , 0x57d2 , 0x57d3 , 0x580a , -0x57d6 , 0x57e3 , 0x580b , 0x5819 , -0x581d , 0x5872 , 0x5821 , 0x5862 , -0x584b , 0x5870 , 0x6bc0 , 0x5852 , -0x583d , 0x5879 , 0x5885 , 0x58b9 , -0x589f , 0x58ab , 0x58ba , 0x58de , -0x58bb , 0x58b8 , 0x58ae , 0x58c5 , -0x58d3 , 0x58d1 , 0x58d7 , 0x58d9 , -0x58d8 , 0x58e5 , 0x58dc , 0x58e4 , -0x58df , 0x58ef , 0x58fa , 0x58f9 , -0x58fb , 0x58fc , 0x58fd , 0x5902 , -0x590a , 0x5910 , 0x591b , 0x68a6 , -0x5925 , 0x592c , 0x592d , 0x5932 , -0x5938 , 0x593e , 0x7ad2 , 0x5955 , -0x5950 , 0x594e , 0x595a , 0x5958 , -0x5962 , 0x5960 , 0x5967 , 0x596c , -0x5969 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5978 , 0x5981 , 0x599d , 0x4f5e , -0x4fab , 0x59a3 , 0x59b2 , 0x59c6 , -0x59e8 , 0x59dc , 0x598d , 0x59d9 , -0x59da , 0x5a25 , 0x5a1f , 0x5a11 , -0x5a1c , 0x5a09 , 0x5a1a , 0x5a40 , -0x5a6c , 0x5a49 , 0x5a35 , 0x5a36 , -0x5a62 , 0x5a6a , 0x5a9a , 0x5abc , -0x5abe , 0x5acb , 0x5ac2 , 0x5abd , -0x5ae3 , 0x5ad7 , 0x5ae6 , 0x5ae9 , -0x5ad6 , 0x5afa , 0x5afb , 0x5b0c , -0x5b0b , 0x5b16 , 0x5b32 , 0x5ad0 , -0x5b2a , 0x5b36 , 0x5b3e , 0x5b43 , -0x5b45 , 0x5b40 , 0x5b51 , 0x5b55 , -0x5b5a , 0x5b5b , 0x5b65 , 0x5b69 , -0x5b70 , 0x5b73 , 0x5b75 , 0x5b78 , -0x6588 , 0x5b7a , 0x5b80 , 0x0 , -0x5b83 , 0x5ba6 , 0x5bb8 , 0x5bc3 , -0x5bc7 , 0x5bc9 , 0x5bd4 , 0x5bd0 , -0x5be4 , 0x5be6 , 0x5be2 , 0x5bde , -0x5be5 , 0x5beb , 0x5bf0 , 0x5bf6 , -0x5bf3 , 0x5c05 , 0x5c07 , 0x5c08 , -0x5c0d , 0x5c13 , 0x5c20 , 0x5c22 , -0x5c28 , 0x5c38 , 0x5c39 , 0x5c41 , -0x5c46 , 0x5c4e , 0x5c53 , 0x5c50 , -0x5c4f , 0x5b71 , 0x5c6c , 0x5c6e , -0x4e62 , 0x5c76 , 0x5c79 , 0x5c8c , -0x5c91 , 0x5c94 , 0x599b , 0x5cab , -0x5cbb , 0x5cb6 , 0x5cbc , 0x5cb7 , -0x5cc5 , 0x5cbe , 0x5cc7 , 0x5cd9 , -0x5ce9 , 0x5cfd , 0x5cfa , 0x5ced , -0x5d8c , 0x5cea , 0x5d0b , 0x5d15 , -0x5d17 , 0x5d5c , 0x5d1f , 0x5d1b , -0x5d11 , 0x5d14 , 0x5d22 , 0x5d1a , -0x5d19 , 0x5d18 , 0x5d4c , 0x5d52 , -0x5d4e , 0x5d4b , 0x5d6c , 0x5d73 , -0x5d76 , 0x5d87 , 0x5d84 , 0x5d82 , -0x5da2 , 0x5d9d , 0x5dac , 0x5dae , -0x5dbd , 0x5d90 , 0x5db7 , 0x5dbc , -0x5dc9 , 0x5dcd , 0x5dd3 , 0x5dd2 , -0x5dd6 , 0x5ddb , 0x5deb , 0x5df2 , -0x5df5 , 0x5e0b , 0x5e1a , 0x5e19 , -0x5e11 , 0x5e1b , 0x5e36 , 0x5e37 , -0x5e44 , 0x5e43 , 0x5e40 , 0x5e4e , -0x5e57 , 0x5e54 , 0x5e5f , 0x5e62 , -0x5e64 , 0x5e47 , 0x5e75 , 0x5e76 , -0x5e7a , 0x9ebc , 0x5e7f , 0x5ea0 , -0x5ec1 , 0x5ec2 , 0x5ec8 , 0x5ed0 , -0x5ecf , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x5ed6 , 0x5ee3 , 0x5edd , 0x5eda , -0x5edb , 0x5ee2 , 0x5ee1 , 0x5ee8 , -0x5ee9 , 0x5eec , 0x5ef1 , 0x5ef3 , -0x5ef0 , 0x5ef4 , 0x5ef8 , 0x5efe , -0x5f03 , 0x5f09 , 0x5f5d , 0x5f5c , -0x5f0b , 0x5f11 , 0x5f16 , 0x5f29 , -0x5f2d , 0x5f38 , 0x5f41 , 0x5f48 , -0x5f4c , 0x5f4e , 0x5f2f , 0x5f51 , -0x5f56 , 0x5f57 , 0x5f59 , 0x5f61 , -0x5f6d , 0x5f73 , 0x5f77 , 0x5f83 , -0x5f82 , 0x5f7f , 0x5f8a , 0x5f88 , -0x5f91 , 0x5f87 , 0x5f9e , 0x5f99 , -0x5f98 , 0x5fa0 , 0x5fa8 , 0x5fad , -0x5fbc , 0x5fd6 , 0x5ffb , 0x5fe4 , -0x5ff8 , 0x5ff1 , 0x5fdd , 0x60b3 , -0x5fff , 0x6021 , 0x6060 , 0x0 , -0x6019 , 0x6010 , 0x6029 , 0x600e , -0x6031 , 0x601b , 0x6015 , 0x602b , -0x6026 , 0x600f , 0x603a , 0x605a , -0x6041 , 0x606a , 0x6077 , 0x605f , -0x604a , 0x6046 , 0x604d , 0x6063 , -0x6043 , 0x6064 , 0x6042 , 0x606c , -0x606b , 0x6059 , 0x6081 , 0x608d , -0x60e7 , 0x6083 , 0x609a , 0x6084 , -0x609b , 0x6096 , 0x6097 , 0x6092 , -0x60a7 , 0x608b , 0x60e1 , 0x60b8 , -0x60e0 , 0x60d3 , 0x60b4 , 0x5ff0 , -0x60bd , 0x60c6 , 0x60b5 , 0x60d8 , -0x614d , 0x6115 , 0x6106 , 0x60f6 , -0x60f7 , 0x6100 , 0x60f4 , 0x60fa , -0x6103 , 0x6121 , 0x60fb , 0x60f1 , -0x610d , 0x610e , 0x6147 , 0x613e , -0x6128 , 0x6127 , 0x614a , 0x613f , -0x613c , 0x612c , 0x6134 , 0x613d , -0x6142 , 0x6144 , 0x6173 , 0x6177 , -0x6158 , 0x6159 , 0x615a , 0x616b , -0x6174 , 0x616f , 0x6165 , 0x6171 , -0x615f , 0x615d , 0x6153 , 0x6175 , -0x6199 , 0x6196 , 0x6187 , 0x61ac , -0x6194 , 0x619a , 0x618a , 0x6191 , -0x61ab , 0x61ae , 0x61cc , 0x61ca , -0x61c9 , 0x61f7 , 0x61c8 , 0x61c3 , -0x61c6 , 0x61ba , 0x61cb , 0x7f79 , -0x61cd , 0x61e6 , 0x61e3 , 0x61f6 , -0x61fa , 0x61f4 , 0x61ff , 0x61fd , -0x61fc , 0x61fe , 0x6200 , 0x6208 , -0x6209 , 0x620d , 0x620c , 0x6214 , -0x621b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x621e , 0x6221 , 0x622a , 0x622e , -0x6230 , 0x6232 , 0x6233 , 0x6241 , -0x624e , 0x625e , 0x6263 , 0x625b , -0x6260 , 0x6268 , 0x627c , 0x6282 , -0x6289 , 0x627e , 0x6292 , 0x6293 , -0x6296 , 0x62d4 , 0x6283 , 0x6294 , -0x62d7 , 0x62d1 , 0x62bb , 0x62cf , -0x62ff , 0x62c6 , 0x64d4 , 0x62c8 , -0x62dc , 0x62cc , 0x62ca , 0x62c2 , -0x62c7 , 0x629b , 0x62c9 , 0x630c , -0x62ee , 0x62f1 , 0x6327 , 0x6302 , -0x6308 , 0x62ef , 0x62f5 , 0x6350 , -0x633e , 0x634d , 0x641c , 0x634f , -0x6396 , 0x638e , 0x6380 , 0x63ab , -0x6376 , 0x63a3 , 0x638f , 0x6389 , -0x639f , 0x63b5 , 0x636b , 0x0 , -0x6369 , 0x63be , 0x63e9 , 0x63c0 , -0x63c6 , 0x63e3 , 0x63c9 , 0x63d2 , -0x63f6 , 0x63c4 , 0x6416 , 0x6434 , -0x6406 , 0x6413 , 0x6426 , 0x6436 , -0x651d , 0x6417 , 0x6428 , 0x640f , -0x6467 , 0x646f , 0x6476 , 0x644e , -0x652a , 0x6495 , 0x6493 , 0x64a5 , -0x64a9 , 0x6488 , 0x64bc , 0x64da , -0x64d2 , 0x64c5 , 0x64c7 , 0x64bb , -0x64d8 , 0x64c2 , 0x64f1 , 0x64e7 , -0x8209 , 0x64e0 , 0x64e1 , 0x62ac , -0x64e3 , 0x64ef , 0x652c , 0x64f6 , -0x64f4 , 0x64f2 , 0x64fa , 0x6500 , -0x64fd , 0x6518 , 0x651c , 0x6505 , -0x6524 , 0x6523 , 0x652b , 0x6534 , -0x6535 , 0x6537 , 0x6536 , 0x6538 , -0x754b , 0x6548 , 0x6556 , 0x6555 , -0x654d , 0x6558 , 0x655e , 0x655d , -0x6572 , 0x6578 , 0x6582 , 0x6583 , -0x8b8a , 0x659b , 0x659f , 0x65ab , -0x65b7 , 0x65c3 , 0x65c6 , 0x65c1 , -0x65c4 , 0x65cc , 0x65d2 , 0x65db , -0x65d9 , 0x65e0 , 0x65e1 , 0x65f1 , -0x6772 , 0x660a , 0x6603 , 0x65fb , -0x6773 , 0x6635 , 0x6636 , 0x6634 , -0x661c , 0x664f , 0x6644 , 0x6649 , -0x6641 , 0x665e , 0x665d , 0x6664 , -0x6667 , 0x6668 , 0x665f , 0x6662 , -0x6670 , 0x6683 , 0x6688 , 0x668e , -0x6689 , 0x6684 , 0x6698 , 0x669d , -0x66c1 , 0x66b9 , 0x66c9 , 0x66be , -0x66bc , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x66c4 , 0x66b8 , 0x66d6 , 0x66da , -0x66e0 , 0x663f , 0x66e6 , 0x66e9 , -0x66f0 , 0x66f5 , 0x66f7 , 0x670f , -0x6716 , 0x671e , 0x6726 , 0x6727 , -0x9738 , 0x672e , 0x673f , 0x6736 , -0x6741 , 0x6738 , 0x6737 , 0x6746 , -0x675e , 0x6760 , 0x6759 , 0x6763 , -0x6764 , 0x6789 , 0x6770 , 0x67a9 , -0x677c , 0x676a , 0x678c , 0x678b , -0x67a6 , 0x67a1 , 0x6785 , 0x67b7 , -0x67ef , 0x67b4 , 0x67ec , 0x67b3 , -0x67e9 , 0x67b8 , 0x67e4 , 0x67de , -0x67dd , 0x67e2 , 0x67ee , 0x67b9 , -0x67ce , 0x67c6 , 0x67e7 , 0x6a9c , -0x681e , 0x6846 , 0x6829 , 0x6840 , -0x684d , 0x6832 , 0x684e , 0x0 , -0x68b3 , 0x682b , 0x6859 , 0x6863 , -0x6877 , 0x687f , 0x689f , 0x688f , -0x68ad , 0x6894 , 0x689d , 0x689b , -0x6883 , 0x6aae , 0x68b9 , 0x6874 , -0x68b5 , 0x68a0 , 0x68ba , 0x690f , -0x688d , 0x687e , 0x6901 , 0x68ca , -0x6908 , 0x68d8 , 0x6922 , 0x6926 , -0x68e1 , 0x690c , 0x68cd , 0x68d4 , -0x68e7 , 0x68d5 , 0x6936 , 0x6912 , -0x6904 , 0x68d7 , 0x68e3 , 0x6925 , -0x68f9 , 0x68e0 , 0x68ef , 0x6928 , -0x692a , 0x691a , 0x6923 , 0x6921 , -0x68c6 , 0x6979 , 0x6977 , 0x695c , -0x6978 , 0x696b , 0x6954 , 0x697e , -0x696e , 0x6939 , 0x6974 , 0x693d , -0x6959 , 0x6930 , 0x6961 , 0x695e , -0x695d , 0x6981 , 0x696a , 0x69b2 , -0x69ae , 0x69d0 , 0x69bf , 0x69c1 , -0x69d3 , 0x69be , 0x69ce , 0x5be8 , -0x69ca , 0x69dd , 0x69bb , 0x69c3 , -0x69a7 , 0x6a2e , 0x6991 , 0x69a0 , -0x699c , 0x6995 , 0x69b4 , 0x69de , -0x69e8 , 0x6a02 , 0x6a1b , 0x69ff , -0x6b0a , 0x69f9 , 0x69f2 , 0x69e7 , -0x6a05 , 0x69b1 , 0x6a1e , 0x69ed , -0x6a14 , 0x69eb , 0x6a0a , 0x6a12 , -0x6ac1 , 0x6a23 , 0x6a13 , 0x6a44 , -0x6a0c , 0x6a72 , 0x6a36 , 0x6a78 , -0x6a47 , 0x6a62 , 0x6a59 , 0x6a66 , -0x6a48 , 0x6a38 , 0x6a22 , 0x6a90 , -0x6a8d , 0x6aa0 , 0x6a84 , 0x6aa2 , -0x6aa3 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6a97 , 0x8617 , 0x6abb , 0x6ac3 , -0x6ac2 , 0x6ab8 , 0x6ab3 , 0x6aac , -0x6ade , 0x6ad1 , 0x6adf , 0x6aaa , -0x6ada , 0x6aea , 0x6afb , 0x6b05 , -0x8616 , 0x6afa , 0x6b12 , 0x6b16 , -0x9b31 , 0x6b1f , 0x6b38 , 0x6b37 , -0x76dc , 0x6b39 , 0x98ee , 0x6b47 , -0x6b43 , 0x6b49 , 0x6b50 , 0x6b59 , -0x6b54 , 0x6b5b , 0x6b5f , 0x6b61 , -0x6b78 , 0x6b79 , 0x6b7f , 0x6b80 , -0x6b84 , 0x6b83 , 0x6b8d , 0x6b98 , -0x6b95 , 0x6b9e , 0x6ba4 , 0x6baa , -0x6bab , 0x6baf , 0x6bb2 , 0x6bb1 , -0x6bb3 , 0x6bb7 , 0x6bbc , 0x6bc6 , -0x6bcb , 0x6bd3 , 0x6bdf , 0x6bec , -0x6beb , 0x6bf3 , 0x6bef , 0x0 , -0x9ebe , 0x6c08 , 0x6c13 , 0x6c14 , -0x6c1b , 0x6c24 , 0x6c23 , 0x6c5e , -0x6c55 , 0x6c62 , 0x6c6a , 0x6c82 , -0x6c8d , 0x6c9a , 0x6c81 , 0x6c9b , -0x6c7e , 0x6c68 , 0x6c73 , 0x6c92 , -0x6c90 , 0x6cc4 , 0x6cf1 , 0x6cd3 , -0x6cbd , 0x6cd7 , 0x6cc5 , 0x6cdd , -0x6cae , 0x6cb1 , 0x6cbe , 0x6cba , -0x6cdb , 0x6cef , 0x6cd9 , 0x6cea , -0x6d1f , 0x884d , 0x6d36 , 0x6d2b , -0x6d3d , 0x6d38 , 0x6d19 , 0x6d35 , -0x6d33 , 0x6d12 , 0x6d0c , 0x6d63 , -0x6d93 , 0x6d64 , 0x6d5a , 0x6d79 , -0x6d59 , 0x6d8e , 0x6d95 , 0x6fe4 , -0x6d85 , 0x6df9 , 0x6e15 , 0x6e0a , -0x6db5 , 0x6dc7 , 0x6de6 , 0x6db8 , -0x6dc6 , 0x6dec , 0x6dde , 0x6dcc , -0x6de8 , 0x6dd2 , 0x6dc5 , 0x6dfa , -0x6dd9 , 0x6de4 , 0x6dd5 , 0x6dea , -0x6dee , 0x6e2d , 0x6e6e , 0x6e2e , -0x6e19 , 0x6e72 , 0x6e5f , 0x6e3e , -0x6e23 , 0x6e6b , 0x6e2b , 0x6e76 , -0x6e4d , 0x6e1f , 0x6e43 , 0x6e3a , -0x6e4e , 0x6e24 , 0x6eff , 0x6e1d , -0x6e38 , 0x6e82 , 0x6eaa , 0x6e98 , -0x6ec9 , 0x6eb7 , 0x6ed3 , 0x6ebd , -0x6eaf , 0x6ec4 , 0x6eb2 , 0x6ed4 , -0x6ed5 , 0x6e8f , 0x6ea5 , 0x6ec2 , -0x6e9f , 0x6f41 , 0x6f11 , 0x704c , -0x6eec , 0x6ef8 , 0x6efe , 0x6f3f , -0x6ef2 , 0x6f31 , 0x6eef , 0x6f32 , -0x6ecc , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x6f3e , 0x6f13 , 0x6ef7 , 0x6f86 , -0x6f7a , 0x6f78 , 0x6f81 , 0x6f80 , -0x6f6f , 0x6f5b , 0x6ff3 , 0x6f6d , -0x6f82 , 0x6f7c , 0x6f58 , 0x6f8e , -0x6f91 , 0x6fc2 , 0x6f66 , 0x6fb3 , -0x6fa3 , 0x6fa1 , 0x6fa4 , 0x6fb9 , -0x6fc6 , 0x6faa , 0x6fdf , 0x6fd5 , -0x6fec , 0x6fd4 , 0x6fd8 , 0x6ff1 , -0x6fee , 0x6fdb , 0x7009 , 0x700b , -0x6ffa , 0x7011 , 0x7001 , 0x700f , -0x6ffe , 0x701b , 0x701a , 0x6f74 , -0x701d , 0x7018 , 0x701f , 0x7030 , -0x703e , 0x7032 , 0x7051 , 0x7063 , -0x7099 , 0x7092 , 0x70af , 0x70f1 , -0x70ac , 0x70b8 , 0x70b3 , 0x70ae , -0x70df , 0x70cb , 0x70dd , 0x0 , -0x70d9 , 0x7109 , 0x70fd , 0x711c , -0x7119 , 0x7165 , 0x7155 , 0x7188 , -0x7166 , 0x7162 , 0x714c , 0x7156 , -0x716c , 0x718f , 0x71fb , 0x7184 , -0x7195 , 0x71a8 , 0x71ac , 0x71d7 , -0x71b9 , 0x71be , 0x71d2 , 0x71c9 , -0x71d4 , 0x71ce , 0x71e0 , 0x71ec , -0x71e7 , 0x71f5 , 0x71fc , 0x71f9 , -0x71ff , 0x720d , 0x7210 , 0x721b , -0x7228 , 0x722d , 0x722c , 0x7230 , -0x7232 , 0x723b , 0x723c , 0x723f , -0x7240 , 0x7246 , 0x724b , 0x7258 , -0x7274 , 0x727e , 0x7282 , 0x7281 , -0x7287 , 0x7292 , 0x7296 , 0x72a2 , -0x72a7 , 0x72b9 , 0x72b2 , 0x72c3 , -0x72c6 , 0x72c4 , 0x72ce , 0x72d2 , -0x72e2 , 0x72e0 , 0x72e1 , 0x72f9 , -0x72f7 , 0x500f , 0x7317 , 0x730a , -0x731c , 0x7316 , 0x731d , 0x7334 , -0x732f , 0x7329 , 0x7325 , 0x733e , -0x734e , 0x734f , 0x9ed8 , 0x7357 , -0x736a , 0x7368 , 0x7370 , 0x7378 , -0x7375 , 0x737b , 0x737a , 0x73c8 , -0x73b3 , 0x73ce , 0x73bb , 0x73c0 , -0x73e5 , 0x73ee , 0x73de , 0x74a2 , -0x7405 , 0x746f , 0x7425 , 0x73f8 , -0x7432 , 0x743a , 0x7455 , 0x743f , -0x745f , 0x7459 , 0x7441 , 0x745c , -0x7469 , 0x7470 , 0x7463 , 0x746a , -0x7476 , 0x747e , 0x748b , 0x749e , -0x74a7 , 0x74ca , 0x74cf , 0x74d4 , -0x73f1 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x74e0 , 0x74e3 , 0x74e7 , 0x74e9 , -0x74ee , 0x74f2 , 0x74f0 , 0x74f1 , -0x74f8 , 0x74f7 , 0x7504 , 0x7503 , -0x7505 , 0x750c , 0x750e , 0x750d , -0x7515 , 0x7513 , 0x751e , 0x7526 , -0x752c , 0x753c , 0x7544 , 0x754d , -0x754a , 0x7549 , 0x755b , 0x7546 , -0x755a , 0x7569 , 0x7564 , 0x7567 , -0x756b , 0x756d , 0x7578 , 0x7576 , -0x7586 , 0x7587 , 0x7574 , 0x758a , -0x7589 , 0x7582 , 0x7594 , 0x759a , -0x759d , 0x75a5 , 0x75a3 , 0x75c2 , -0x75b3 , 0x75c3 , 0x75b5 , 0x75bd , -0x75b8 , 0x75bc , 0x75b1 , 0x75cd , -0x75ca , 0x75d2 , 0x75d9 , 0x75e3 , -0x75de , 0x75fe , 0x75ff , 0x0 , -0x75fc , 0x7601 , 0x75f0 , 0x75fa , -0x75f2 , 0x75f3 , 0x760b , 0x760d , -0x7609 , 0x761f , 0x7627 , 0x7620 , -0x7621 , 0x7622 , 0x7624 , 0x7634 , -0x7630 , 0x763b , 0x7647 , 0x7648 , -0x7646 , 0x765c , 0x7658 , 0x7661 , -0x7662 , 0x7668 , 0x7669 , 0x766a , -0x7667 , 0x766c , 0x7670 , 0x7672 , -0x7676 , 0x7678 , 0x767c , 0x7680 , -0x7683 , 0x7688 , 0x768b , 0x768e , -0x7696 , 0x7693 , 0x7699 , 0x769a , -0x76b0 , 0x76b4 , 0x76b8 , 0x76b9 , -0x76ba , 0x76c2 , 0x76cd , 0x76d6 , -0x76d2 , 0x76de , 0x76e1 , 0x76e5 , -0x76e7 , 0x76ea , 0x862f , 0x76fb , -0x7708 , 0x7707 , 0x7704 , 0x7729 , -0x7724 , 0x771e , 0x7725 , 0x7726 , -0x771b , 0x7737 , 0x7738 , 0x7747 , -0x775a , 0x7768 , 0x776b , 0x775b , -0x7765 , 0x777f , 0x777e , 0x7779 , -0x778e , 0x778b , 0x7791 , 0x77a0 , -0x779e , 0x77b0 , 0x77b6 , 0x77b9 , -0x77bf , 0x77bc , 0x77bd , 0x77bb , -0x77c7 , 0x77cd , 0x77d7 , 0x77da , -0x77dc , 0x77e3 , 0x77ee , 0x77fc , -0x780c , 0x7812 , 0x7926 , 0x7820 , -0x792a , 0x7845 , 0x788e , 0x7874 , -0x7886 , 0x787c , 0x789a , 0x788c , -0x78a3 , 0x78b5 , 0x78aa , 0x78af , -0x78d1 , 0x78c6 , 0x78cb , 0x78d4 , -0x78be , 0x78bc , 0x78c5 , 0x78ca , -0x78ec , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x78e7 , 0x78da , 0x78fd , 0x78f4 , -0x7907 , 0x7912 , 0x7911 , 0x7919 , -0x792c , 0x792b , 0x7940 , 0x7960 , -0x7957 , 0x795f , 0x795a , 0x7955 , -0x7953 , 0x797a , 0x797f , 0x798a , -0x799d , 0x79a7 , 0x9f4b , 0x79aa , -0x79ae , 0x79b3 , 0x79b9 , 0x79ba , -0x79c9 , 0x79d5 , 0x79e7 , 0x79ec , -0x79e1 , 0x79e3 , 0x7a08 , 0x7a0d , -0x7a18 , 0x7a19 , 0x7a20 , 0x7a1f , -0x7980 , 0x7a31 , 0x7a3b , 0x7a3e , -0x7a37 , 0x7a43 , 0x7a57 , 0x7a49 , -0x7a61 , 0x7a62 , 0x7a69 , 0x9f9d , -0x7a70 , 0x7a79 , 0x7a7d , 0x7a88 , -0x7a97 , 0x7a95 , 0x7a98 , 0x7a96 , -0x7aa9 , 0x7ac8 , 0x7ab0 , 0x0 , -0x7ab6 , 0x7ac5 , 0x7ac4 , 0x7abf , -0x9083 , 0x7ac7 , 0x7aca , 0x7acd , -0x7acf , 0x7ad5 , 0x7ad3 , 0x7ad9 , -0x7ada , 0x7add , 0x7ae1 , 0x7ae2 , -0x7ae6 , 0x7aed , 0x7af0 , 0x7b02 , -0x7b0f , 0x7b0a , 0x7b06 , 0x7b33 , -0x7b18 , 0x7b19 , 0x7b1e , 0x7b35 , -0x7b28 , 0x7b36 , 0x7b50 , 0x7b7a , -0x7b04 , 0x7b4d , 0x7b0b , 0x7b4c , -0x7b45 , 0x7b75 , 0x7b65 , 0x7b74 , -0x7b67 , 0x7b70 , 0x7b71 , 0x7b6c , -0x7b6e , 0x7b9d , 0x7b98 , 0x7b9f , -0x7b8d , 0x7b9c , 0x7b9a , 0x7b8b , -0x7b92 , 0x7b8f , 0x7b5d , 0x7b99 , -0x7bcb , 0x7bc1 , 0x7bcc , 0x7bcf , -0x7bb4 , 0x7bc6 , 0x7bdd , 0x7be9 , -0x7c11 , 0x7c14 , 0x7be6 , 0x7be5 , -0x7c60 , 0x7c00 , 0x7c07 , 0x7c13 , -0x7bf3 , 0x7bf7 , 0x7c17 , 0x7c0d , -0x7bf6 , 0x7c23 , 0x7c27 , 0x7c2a , -0x7c1f , 0x7c37 , 0x7c2b , 0x7c3d , -0x7c4c , 0x7c43 , 0x7c54 , 0x7c4f , -0x7c40 , 0x7c50 , 0x7c58 , 0x7c5f , -0x7c64 , 0x7c56 , 0x7c65 , 0x7c6c , -0x7c75 , 0x7c83 , 0x7c90 , 0x7ca4 , -0x7cad , 0x7ca2 , 0x7cab , 0x7ca1 , -0x7ca8 , 0x7cb3 , 0x7cb2 , 0x7cb1 , -0x7cae , 0x7cb9 , 0x7cbd , 0x7cc0 , -0x7cc5 , 0x7cc2 , 0x7cd8 , 0x7cd2 , -0x7cdc , 0x7ce2 , 0x9b3b , 0x7cef , -0x7cf2 , 0x7cf4 , 0x7cf6 , 0x7cfa , -0x7d06 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x7d02 , 0x7d1c , 0x7d15 , 0x7d0a , -0x7d45 , 0x7d4b , 0x7d2e , 0x7d32 , -0x7d3f , 0x7d35 , 0x7d46 , 0x7d73 , -0x7d56 , 0x7d4e , 0x7d72 , 0x7d68 , -0x7d6e , 0x7d4f , 0x7d63 , 0x7d93 , -0x7d89 , 0x7d5b , 0x7d8f , 0x7d7d , -0x7d9b , 0x7dba , 0x7dae , 0x7da3 , -0x7db5 , 0x7dc7 , 0x7dbd , 0x7dab , -0x7e3d , 0x7da2 , 0x7daf , 0x7ddc , -0x7db8 , 0x7d9f , 0x7db0 , 0x7dd8 , -0x7ddd , 0x7de4 , 0x7dde , 0x7dfb , -0x7df2 , 0x7de1 , 0x7e05 , 0x7e0a , -0x7e23 , 0x7e21 , 0x7e12 , 0x7e31 , -0x7e1f , 0x7e09 , 0x7e0b , 0x7e22 , -0x7e46 , 0x7e66 , 0x7e3b , 0x7e35 , -0x7e39 , 0x7e43 , 0x7e37 , 0x0 , -0x7e32 , 0x7e3a , 0x7e67 , 0x7e5d , -0x7e56 , 0x7e5e , 0x7e59 , 0x7e5a , -0x7e79 , 0x7e6a , 0x7e69 , 0x7e7c , -0x7e7b , 0x7e83 , 0x7dd5 , 0x7e7d , -0x8fae , 0x7e7f , 0x7e88 , 0x7e89 , -0x7e8c , 0x7e92 , 0x7e90 , 0x7e93 , -0x7e94 , 0x7e96 , 0x7e8e , 0x7e9b , -0x7e9c , 0x7f38 , 0x7f3a , 0x7f45 , -0x7f4c , 0x7f4d , 0x7f4e , 0x7f50 , -0x7f51 , 0x7f55 , 0x7f54 , 0x7f58 , -0x7f5f , 0x7f60 , 0x7f68 , 0x7f69 , -0x7f67 , 0x7f78 , 0x7f82 , 0x7f86 , -0x7f83 , 0x7f88 , 0x7f87 , 0x7f8c , -0x7f94 , 0x7f9e , 0x7f9d , 0x7f9a , -0x7fa3 , 0x7faf , 0x7fb2 , 0x7fb9 , -0x7fae , 0x7fb6 , 0x7fb8 , 0x8b71 , -0x7fc5 , 0x7fc6 , 0x7fca , 0x7fd5 , -0x7fd4 , 0x7fe1 , 0x7fe6 , 0x7fe9 , -0x7ff3 , 0x7ff9 , 0x98dc , 0x8006 , -0x8004 , 0x800b , 0x8012 , 0x8018 , -0x8019 , 0x801c , 0x8021 , 0x8028 , -0x803f , 0x803b , 0x804a , 0x8046 , -0x8052 , 0x8058 , 0x805a , 0x805f , -0x8062 , 0x8068 , 0x8073 , 0x8072 , -0x8070 , 0x8076 , 0x8079 , 0x807d , -0x807f , 0x8084 , 0x8086 , 0x8085 , -0x809b , 0x8093 , 0x809a , 0x80ad , -0x5190 , 0x80ac , 0x80db , 0x80e5 , -0x80d9 , 0x80dd , 0x80c4 , 0x80da , -0x80d6 , 0x8109 , 0x80ef , 0x80f1 , -0x811b , 0x8129 , 0x8123 , 0x812f , -0x814b , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x968b , 0x8146 , 0x813e , 0x8153 , -0x8151 , 0x80fc , 0x8171 , 0x816e , -0x8165 , 0x8166 , 0x8174 , 0x8183 , -0x8188 , 0x818a , 0x8180 , 0x8182 , -0x81a0 , 0x8195 , 0x81a4 , 0x81a3 , -0x815f , 0x8193 , 0x81a9 , 0x81b0 , -0x81b5 , 0x81be , 0x81b8 , 0x81bd , -0x81c0 , 0x81c2 , 0x81ba , 0x81c9 , -0x81cd , 0x81d1 , 0x81d9 , 0x81d8 , -0x81c8 , 0x81da , 0x81df , 0x81e0 , -0x81e7 , 0x81fa , 0x81fb , 0x81fe , -0x8201 , 0x8202 , 0x8205 , 0x8207 , -0x820a , 0x820d , 0x8210 , 0x8216 , -0x8229 , 0x822b , 0x8238 , 0x8233 , -0x8240 , 0x8259 , 0x8258 , 0x825d , -0x825a , 0x825f , 0x8264 , 0x0 , -0x8262 , 0x8268 , 0x826a , 0x826b , -0x822e , 0x8271 , 0x8277 , 0x8278 , -0x827e , 0x828d , 0x8292 , 0x82ab , -0x829f , 0x82bb , 0x82ac , 0x82e1 , -0x82e3 , 0x82df , 0x82d2 , 0x82f4 , -0x82f3 , 0x82fa , 0x8393 , 0x8303 , -0x82fb , 0x82f9 , 0x82de , 0x8306 , -0x82dc , 0x8309 , 0x82d9 , 0x8335 , -0x8334 , 0x8316 , 0x8332 , 0x8331 , -0x8340 , 0x8339 , 0x8350 , 0x8345 , -0x832f , 0x832b , 0x8317 , 0x8318 , -0x8385 , 0x839a , 0x83aa , 0x839f , -0x83a2 , 0x8396 , 0x8323 , 0x838e , -0x8387 , 0x838a , 0x837c , 0x83b5 , -0x8373 , 0x8375 , 0x83a0 , 0x8389 , -0x83a8 , 0x83f4 , 0x8413 , 0x83eb , -0x83ce , 0x83fd , 0x8403 , 0x83d8 , -0x840b , 0x83c1 , 0x83f7 , 0x8407 , -0x83e0 , 0x83f2 , 0x840d , 0x8422 , -0x8420 , 0x83bd , 0x8438 , 0x8506 , -0x83fb , 0x846d , 0x842a , 0x843c , -0x855a , 0x8484 , 0x8477 , 0x846b , -0x84ad , 0x846e , 0x8482 , 0x8469 , -0x8446 , 0x842c , 0x846f , 0x8479 , -0x8435 , 0x84ca , 0x8462 , 0x84b9 , -0x84bf , 0x849f , 0x84d9 , 0x84cd , -0x84bb , 0x84da , 0x84d0 , 0x84c1 , -0x84c6 , 0x84d6 , 0x84a1 , 0x8521 , -0x84ff , 0x84f4 , 0x8517 , 0x8518 , -0x852c , 0x851f , 0x8515 , 0x8514 , -0x84fc , 0x8540 , 0x8563 , 0x8558 , -0x8548 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8541 , 0x8602 , 0x854b , 0x8555 , -0x8580 , 0x85a4 , 0x8588 , 0x8591 , -0x858a , 0x85a8 , 0x856d , 0x8594 , -0x859b , 0x85ea , 0x8587 , 0x859c , -0x8577 , 0x857e , 0x8590 , 0x85c9 , -0x85ba , 0x85cf , 0x85b9 , 0x85d0 , -0x85d5 , 0x85dd , 0x85e5 , 0x85dc , -0x85f9 , 0x860a , 0x8613 , 0x860b , -0x85fe , 0x85fa , 0x8606 , 0x8622 , -0x861a , 0x8630 , 0x863f , 0x864d , -0x4e55 , 0x8654 , 0x865f , 0x8667 , -0x8671 , 0x8693 , 0x86a3 , 0x86a9 , -0x86aa , 0x868b , 0x868c , 0x86b6 , -0x86af , 0x86c4 , 0x86c6 , 0x86b0 , -0x86c9 , 0x8823 , 0x86ab , 0x86d4 , -0x86de , 0x86e9 , 0x86ec , 0x0 , -0x86df , 0x86db , 0x86ef , 0x8712 , -0x8706 , 0x8708 , 0x8700 , 0x8703 , -0x86fb , 0x8711 , 0x8709 , 0x870d , -0x86f9 , 0x870a , 0x8734 , 0x873f , -0x8737 , 0x873b , 0x8725 , 0x8729 , -0x871a , 0x8760 , 0x875f , 0x8778 , -0x874c , 0x874e , 0x8774 , 0x8757 , -0x8768 , 0x876e , 0x8759 , 0x8753 , -0x8763 , 0x876a , 0x8805 , 0x87a2 , -0x879f , 0x8782 , 0x87af , 0x87cb , -0x87bd , 0x87c0 , 0x87d0 , 0x96d6 , -0x87ab , 0x87c4 , 0x87b3 , 0x87c7 , -0x87c6 , 0x87bb , 0x87ef , 0x87f2 , -0x87e0 , 0x880f , 0x880d , 0x87fe , -0x87f6 , 0x87f7 , 0x880e , 0x87d2 , -0x8811 , 0x8816 , 0x8815 , 0x8822 , -0x8821 , 0x8831 , 0x8836 , 0x8839 , -0x8827 , 0x883b , 0x8844 , 0x8842 , -0x8852 , 0x8859 , 0x885e , 0x8862 , -0x886b , 0x8881 , 0x887e , 0x889e , -0x8875 , 0x887d , 0x88b5 , 0x8872 , -0x8882 , 0x8897 , 0x8892 , 0x88ae , -0x8899 , 0x88a2 , 0x888d , 0x88a4 , -0x88b0 , 0x88bf , 0x88b1 , 0x88c3 , -0x88c4 , 0x88d4 , 0x88d8 , 0x88d9 , -0x88dd , 0x88f9 , 0x8902 , 0x88fc , -0x88f4 , 0x88e8 , 0x88f2 , 0x8904 , -0x890c , 0x890a , 0x8913 , 0x8943 , -0x891e , 0x8925 , 0x892a , 0x892b , -0x8941 , 0x8944 , 0x893b , 0x8936 , -0x8938 , 0x894c , 0x891d , 0x8960 , -0x895e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8966 , 0x8964 , 0x896d , 0x896a , -0x896f , 0x8974 , 0x8977 , 0x897e , -0x8983 , 0x8988 , 0x898a , 0x8993 , -0x8998 , 0x89a1 , 0x89a9 , 0x89a6 , -0x89ac , 0x89af , 0x89b2 , 0x89ba , -0x89bd , 0x89bf , 0x89c0 , 0x89da , -0x89dc , 0x89dd , 0x89e7 , 0x89f4 , -0x89f8 , 0x8a03 , 0x8a16 , 0x8a10 , -0x8a0c , 0x8a1b , 0x8a1d , 0x8a25 , -0x8a36 , 0x8a41 , 0x8a5b , 0x8a52 , -0x8a46 , 0x8a48 , 0x8a7c , 0x8a6d , -0x8a6c , 0x8a62 , 0x8a85 , 0x8a82 , -0x8a84 , 0x8aa8 , 0x8aa1 , 0x8a91 , -0x8aa5 , 0x8aa6 , 0x8a9a , 0x8aa3 , -0x8ac4 , 0x8acd , 0x8ac2 , 0x8ada , -0x8aeb , 0x8af3 , 0x8ae7 , 0x0 , -0x8ae4 , 0x8af1 , 0x8b14 , 0x8ae0 , -0x8ae2 , 0x8af7 , 0x8ade , 0x8adb , -0x8b0c , 0x8b07 , 0x8b1a , 0x8ae1 , -0x8b16 , 0x8b10 , 0x8b17 , 0x8b20 , -0x8b33 , 0x97ab , 0x8b26 , 0x8b2b , -0x8b3e , 0x8b28 , 0x8b41 , 0x8b4c , -0x8b4f , 0x8b4e , 0x8b49 , 0x8b56 , -0x8b5b , 0x8b5a , 0x8b6b , 0x8b5f , -0x8b6c , 0x8b6f , 0x8b74 , 0x8b7d , -0x8b80 , 0x8b8c , 0x8b8e , 0x8b92 , -0x8b93 , 0x8b96 , 0x8b99 , 0x8b9a , -0x8c3a , 0x8c41 , 0x8c3f , 0x8c48 , -0x8c4c , 0x8c4e , 0x8c50 , 0x8c55 , -0x8c62 , 0x8c6c , 0x8c78 , 0x8c7a , -0x8c82 , 0x8c89 , 0x8c85 , 0x8c8a , -0x8c8d , 0x8c8e , 0x8c94 , 0x8c7c , -0x8c98 , 0x621d , 0x8cad , 0x8caa , -0x8cbd , 0x8cb2 , 0x8cb3 , 0x8cae , -0x8cb6 , 0x8cc8 , 0x8cc1 , 0x8ce4 , -0x8ce3 , 0x8cda , 0x8cfd , 0x8cfa , -0x8cfb , 0x8d04 , 0x8d05 , 0x8d0a , -0x8d07 , 0x8d0f , 0x8d0d , 0x8d10 , -0x9f4e , 0x8d13 , 0x8ccd , 0x8d14 , -0x8d16 , 0x8d67 , 0x8d6d , 0x8d71 , -0x8d73 , 0x8d81 , 0x8d99 , 0x8dc2 , -0x8dbe , 0x8dba , 0x8dcf , 0x8dda , -0x8dd6 , 0x8dcc , 0x8ddb , 0x8dcb , -0x8dea , 0x8deb , 0x8ddf , 0x8de3 , -0x8dfc , 0x8e08 , 0x8e09 , 0x8dff , -0x8e1d , 0x8e1e , 0x8e10 , 0x8e1f , -0x8e42 , 0x8e35 , 0x8e30 , 0x8e34 , -0x8e4a , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x8e47 , 0x8e49 , 0x8e4c , 0x8e50 , -0x8e48 , 0x8e59 , 0x8e64 , 0x8e60 , -0x8e2a , 0x8e63 , 0x8e55 , 0x8e76 , -0x8e72 , 0x8e7c , 0x8e81 , 0x8e87 , -0x8e85 , 0x8e84 , 0x8e8b , 0x8e8a , -0x8e93 , 0x8e91 , 0x8e94 , 0x8e99 , -0x8eaa , 0x8ea1 , 0x8eac , 0x8eb0 , -0x8ec6 , 0x8eb1 , 0x8ebe , 0x8ec5 , -0x8ec8 , 0x8ecb , 0x8edb , 0x8ee3 , -0x8efc , 0x8efb , 0x8eeb , 0x8efe , -0x8f0a , 0x8f05 , 0x8f15 , 0x8f12 , -0x8f19 , 0x8f13 , 0x8f1c , 0x8f1f , -0x8f1b , 0x8f0c , 0x8f26 , 0x8f33 , -0x8f3b , 0x8f39 , 0x8f45 , 0x8f42 , -0x8f3e , 0x8f4c , 0x8f49 , 0x8f46 , -0x8f4e , 0x8f57 , 0x8f5c , 0x0 , -0x8f62 , 0x8f63 , 0x8f64 , 0x8f9c , -0x8f9f , 0x8fa3 , 0x8fad , 0x8faf , -0x8fb7 , 0x8fda , 0x8fe5 , 0x8fe2 , -0x8fea , 0x8fef , 0x9087 , 0x8ff4 , -0x9005 , 0x8ff9 , 0x8ffa , 0x9011 , -0x9015 , 0x9021 , 0x900d , 0x901e , -0x9016 , 0x900b , 0x9027 , 0x9036 , -0x9035 , 0x9039 , 0x8ff8 , 0x904f , -0x9050 , 0x9051 , 0x9052 , 0x900e , -0x9049 , 0x903e , 0x9056 , 0x9058 , -0x905e , 0x9068 , 0x906f , 0x9076 , -0x96a8 , 0x9072 , 0x9082 , 0x907d , -0x9081 , 0x9080 , 0x908a , 0x9089 , -0x908f , 0x90a8 , 0x90af , 0x90b1 , -0x90b5 , 0x90e2 , 0x90e4 , 0x6248 , -0x90db , 0x9102 , 0x9112 , 0x9119 , -0x9132 , 0x9130 , 0x914a , 0x9156 , -0x9158 , 0x9163 , 0x9165 , 0x9169 , -0x9173 , 0x9172 , 0x918b , 0x9189 , -0x9182 , 0x91a2 , 0x91ab , 0x91af , -0x91aa , 0x91b5 , 0x91b4 , 0x91ba , -0x91c0 , 0x91c1 , 0x91c9 , 0x91cb , -0x91d0 , 0x91d6 , 0x91df , 0x91e1 , -0x91db , 0x91fc , 0x91f5 , 0x91f6 , -0x921e , 0x91ff , 0x9214 , 0x922c , -0x9215 , 0x9211 , 0x925e , 0x9257 , -0x9245 , 0x9249 , 0x9264 , 0x9248 , -0x9295 , 0x923f , 0x924b , 0x9250 , -0x929c , 0x9296 , 0x9293 , 0x929b , -0x925a , 0x92cf , 0x92b9 , 0x92b7 , -0x92e9 , 0x930f , 0x92fa , 0x9344 , -0x932e , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9319 , 0x9322 , 0x931a , 0x9323 , -0x933a , 0x9335 , 0x933b , 0x935c , -0x9360 , 0x937c , 0x936e , 0x9356 , -0x93b0 , 0x93ac , 0x93ad , 0x9394 , -0x93b9 , 0x93d6 , 0x93d7 , 0x93e8 , -0x93e5 , 0x93d8 , 0x93c3 , 0x93dd , -0x93d0 , 0x93c8 , 0x93e4 , 0x941a , -0x9414 , 0x9413 , 0x9403 , 0x9407 , -0x9410 , 0x9436 , 0x942b , 0x9435 , -0x9421 , 0x943a , 0x9441 , 0x9452 , -0x9444 , 0x945b , 0x9460 , 0x9462 , -0x945e , 0x946a , 0x9229 , 0x9470 , -0x9475 , 0x9477 , 0x947d , 0x945a , -0x947c , 0x947e , 0x9481 , 0x947f , -0x9582 , 0x9587 , 0x958a , 0x9594 , -0x9596 , 0x9598 , 0x9599 , 0x0 , -0x95a0 , 0x95a8 , 0x95a7 , 0x95ad , -0x95bc , 0x95bb , 0x95b9 , 0x95be , -0x95ca , 0x6ff6 , 0x95c3 , 0x95cd , -0x95cc , 0x95d5 , 0x95d4 , 0x95d6 , -0x95dc , 0x95e1 , 0x95e5 , 0x95e2 , -0x9621 , 0x9628 , 0x962e , 0x962f , -0x9642 , 0x964c , 0x964f , 0x964b , -0x9677 , 0x965c , 0x965e , 0x965d , -0x965f , 0x9666 , 0x9672 , 0x966c , -0x968d , 0x9698 , 0x9695 , 0x9697 , -0x96aa , 0x96a7 , 0x96b1 , 0x96b2 , -0x96b0 , 0x96b4 , 0x96b6 , 0x96b8 , -0x96b9 , 0x96ce , 0x96cb , 0x96c9 , -0x96cd , 0x894d , 0x96dc , 0x970d , -0x96d5 , 0x96f9 , 0x9704 , 0x9706 , -0x9708 , 0x9713 , 0x970e , 0x9711 , -0x970f , 0x9716 , 0x9719 , 0x9724 , -0x972a , 0x9730 , 0x9739 , 0x973d , -0x973e , 0x9744 , 0x9746 , 0x9748 , -0x9742 , 0x9749 , 0x975c , 0x9760 , -0x9764 , 0x9766 , 0x9768 , 0x52d2 , -0x976b , 0x9771 , 0x9779 , 0x9785 , -0x977c , 0x9781 , 0x977a , 0x9786 , -0x978b , 0x978f , 0x9790 , 0x979c , -0x97a8 , 0x97a6 , 0x97a3 , 0x97b3 , -0x97b4 , 0x97c3 , 0x97c6 , 0x97c8 , -0x97cb , 0x97dc , 0x97ed , 0x9f4f , -0x97f2 , 0x7adf , 0x97f6 , 0x97f5 , -0x980f , 0x980c , 0x9838 , 0x9824 , -0x9821 , 0x9837 , 0x983d , 0x9846 , -0x984f , 0x984b , 0x986b , 0x986f , -0x9870 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9871 , 0x9874 , 0x9873 , 0x98aa , -0x98af , 0x98b1 , 0x98b6 , 0x98c4 , -0x98c3 , 0x98c6 , 0x98e9 , 0x98eb , -0x9903 , 0x9909 , 0x9912 , 0x9914 , -0x9918 , 0x9921 , 0x991d , 0x991e , -0x9924 , 0x9920 , 0x992c , 0x992e , -0x993d , 0x993e , 0x9942 , 0x9949 , -0x9945 , 0x9950 , 0x994b , 0x9951 , -0x9952 , 0x994c , 0x9955 , 0x9997 , -0x9998 , 0x99a5 , 0x99ad , 0x99ae , -0x99bc , 0x99df , 0x99db , 0x99dd , -0x99d8 , 0x99d1 , 0x99ed , 0x99ee , -0x99f1 , 0x99f2 , 0x99fb , 0x99f8 , -0x9a01 , 0x9a0f , 0x9a05 , 0x99e2 , -0x9a19 , 0x9a2b , 0x9a37 , 0x9a45 , -0x9a42 , 0x9a40 , 0x9a43 , 0x0 , -0x9a3e , 0x9a55 , 0x9a4d , 0x9a5b , -0x9a57 , 0x9a5f , 0x9a62 , 0x9a65 , -0x9a64 , 0x9a69 , 0x9a6b , 0x9a6a , -0x9aad , 0x9ab0 , 0x9abc , 0x9ac0 , -0x9acf , 0x9ad1 , 0x9ad3 , 0x9ad4 , -0x9ade , 0x9adf , 0x9ae2 , 0x9ae3 , -0x9ae6 , 0x9aef , 0x9aeb , 0x9aee , -0x9af4 , 0x9af1 , 0x9af7 , 0x9afb , -0x9b06 , 0x9b18 , 0x9b1a , 0x9b1f , -0x9b22 , 0x9b23 , 0x9b25 , 0x9b27 , -0x9b28 , 0x9b29 , 0x9b2a , 0x9b2e , -0x9b2f , 0x9b32 , 0x9b44 , 0x9b43 , -0x9b4f , 0x9b4d , 0x9b4e , 0x9b51 , -0x9b58 , 0x9b74 , 0x9b93 , 0x9b83 , -0x9b91 , 0x9b96 , 0x9b97 , 0x9b9f , -0x9ba0 , 0x9ba8 , 0x9bb4 , 0x9bc0 , -0x9bca , 0x9bb9 , 0x9bc6 , 0x9bcf , -0x9bd1 , 0x9bd2 , 0x9be3 , 0x9be2 , -0x9be4 , 0x9bd4 , 0x9be1 , 0x9c3a , -0x9bf2 , 0x9bf1 , 0x9bf0 , 0x9c15 , -0x9c14 , 0x9c09 , 0x9c13 , 0x9c0c , -0x9c06 , 0x9c08 , 0x9c12 , 0x9c0a , -0x9c04 , 0x9c2e , 0x9c1b , 0x9c25 , -0x9c24 , 0x9c21 , 0x9c30 , 0x9c47 , -0x9c32 , 0x9c46 , 0x9c3e , 0x9c5a , -0x9c60 , 0x9c67 , 0x9c76 , 0x9c78 , -0x9ce7 , 0x9cec , 0x9cf0 , 0x9d09 , -0x9d08 , 0x9ceb , 0x9d03 , 0x9d06 , -0x9d2a , 0x9d26 , 0x9daf , 0x9d23 , -0x9d1f , 0x9d44 , 0x9d15 , 0x9d12 , -0x9d41 , 0x9d3f , 0x9d3e , 0x9d46 , -0x9d48 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x9d5d , 0x9d5e , 0x9d64 , 0x9d51 , -0x9d50 , 0x9d59 , 0x9d72 , 0x9d89 , -0x9d87 , 0x9dab , 0x9d6f , 0x9d7a , -0x9d9a , 0x9da4 , 0x9da9 , 0x9db2 , -0x9dc4 , 0x9dc1 , 0x9dbb , 0x9db8 , -0x9dba , 0x9dc6 , 0x9dcf , 0x9dc2 , -0x9dd9 , 0x9dd3 , 0x9df8 , 0x9de6 , -0x9ded , 0x9def , 0x9dfd , 0x9e1a , -0x9e1b , 0x9e1e , 0x9e75 , 0x9e79 , -0x9e7d , 0x9e81 , 0x9e88 , 0x9e8b , -0x9e8c , 0x9e92 , 0x9e95 , 0x9e91 , -0x9e9d , 0x9ea5 , 0x9ea9 , 0x9eb8 , -0x9eaa , 0x9ead , 0x9761 , 0x9ecc , -0x9ece , 0x9ecf , 0x9ed0 , 0x9ed4 , -0x9edc , 0x9ede , 0x9edd , 0x9ee0 , -0x9ee5 , 0x9ee8 , 0x9eef , 0x0 , -0x9ef4 , 0x9ef6 , 0x9ef7 , 0x9ef9 , -0x9efb , 0x9efc , 0x9efd , 0x9f07 , -0x9f08 , 0x76b7 , 0x9f15 , 0x9f21 , -0x9f2c , 0x9f3e , 0x9f4a , 0x9f52 , -0x9f54 , 0x9f63 , 0x9f5f , 0x9f60 , -0x9f61 , 0x9f66 , 0x9f67 , 0x9f6c , -0x9f6a , 0x9f77 , 0x9f72 , 0x9f76 , -0x9f95 , 0x9f9c , 0x9fa0 , 0x582f , -0x69c7 , 0x9059 , 0x7464 , 0x51dc , -0x7199 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -0x0 , 0x0 , 0x0 , 0x0 , -} ; diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_Shiftjis.pxx opencascade-7.5.1+dfsg1/src/Resource/Resource_Shiftjis.pxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_Shiftjis.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_Shiftjis.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,32788 @@ +/* + Copyright (c) 1998-1999 Matra Datavision + Copyright (c) 1999-2014 OPEN CASCADE SAS + + This file is part of Open CASCADE Technology software library. + + This library is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License version 2.1 as published + by the Free Software Foundation, with special exception defined in the file + OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT + distribution for complete text of the license and disclaimer of any warranty. + + Alternatively, this file may be used under the terms of Open CASCADE + commercial license or contractual agreement. +*/ + +static const char16 unisjis [65536] = { +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x20 , 0x21 , 0x22 , 0x23 , +0x24 , 0x25 , 0x26 , 0x27 , +0x28 , 0x29 , 0x2a , 0x2b , +0x2c , 0x2d , 0x2e , 0x2f , +0x30 , 0x31 , 0x32 , 0x33 , +0x34 , 0x35 , 0x36 , 0x37 , +0x38 , 0x39 , 0x3a , 0x3b , +0x3c , 0x3d , 0x3e , 0x3f , +0x40 , 0x41 , 0x42 , 0x43 , +0x44 , 0x45 , 0x46 , 0x47 , +0x48 , 0x49 , 0x4a , 0x4b , +0x4c , 0x4d , 0x4e , 0x4f , +0x50 , 0x51 , 0x52 , 0x53 , +0x54 , 0x55 , 0x56 , 0x57 , +0x58 , 0x59 , 0x5a , 0x5b , +0x815f , 0x5d , 0x5e , 0x5f , +0x60 , 0x61 , 0x62 , 0x63 , +0x64 , 0x65 , 0x66 , 0x67 , +0x68 , 0x69 , 0x6a , 0x6b , +0x6c , 0x6d , 0x6e , 0x6f , +0x70 , 0x71 , 0x72 , 0x73 , +0x74 , 0x75 , 0x76 , 0x77 , +0x78 , 0x79 , 0x7a , 0x7b , +0x7c , 0x7d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8191 , 0x8192 , +0x0 , 0x5c , 0x0 , 0x8198 , +0x814e , 0x0 , 0x0 , 0x0 , +0x81ca , 0x0 , 0x0 , 0x0 , +0x818b , 0x817d , 0x0 , 0x0 , +0x814c , 0x0 , 0x81f7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x817e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8180 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x839f , 0x83a0 , 0x83a1 , +0x83a2 , 0x83a3 , 0x83a4 , 0x83a5 , +0x83a6 , 0x83a7 , 0x83a8 , 0x83a9 , +0x83aa , 0x83ab , 0x83ac , 0x83ad , +0x83ae , 0x83af , 0x0 , 0x83b0 , +0x83b1 , 0x83b2 , 0x83b3 , 0x83b4 , +0x83b5 , 0x83b6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x83bf , 0x83c0 , 0x83c1 , +0x83c2 , 0x83c3 , 0x83c4 , 0x83c5 , +0x83c6 , 0x83c7 , 0x83c8 , 0x83c9 , +0x83ca , 0x83cb , 0x83cc , 0x83cd , +0x83ce , 0x83cf , 0x0 , 0x83d0 , +0x83d1 , 0x83d2 , 0x83d3 , 0x83d4 , +0x83d5 , 0x83d6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8446 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8440 , 0x8441 , 0x8442 , 0x8443 , +0x8444 , 0x8445 , 0x8447 , 0x8448 , +0x8449 , 0x844a , 0x844b , 0x844c , +0x844d , 0x844e , 0x844f , 0x8450 , +0x8451 , 0x8452 , 0x8453 , 0x8454 , +0x8455 , 0x8456 , 0x8457 , 0x8458 , +0x8459 , 0x845a , 0x845b , 0x845c , +0x845d , 0x845e , 0x845f , 0x8460 , +0x8470 , 0x8471 , 0x8472 , 0x8473 , +0x8474 , 0x8475 , 0x8477 , 0x8478 , +0x8479 , 0x847a , 0x847b , 0x847c , +0x847d , 0x847e , 0x8480 , 0x8481 , +0x8482 , 0x8483 , 0x8484 , 0x8485 , +0x8486 , 0x8487 , 0x8488 , 0x8489 , +0x848a , 0x848b , 0x848c , 0x848d , +0x848e , 0x848f , 0x8490 , 0x8491 , +0x0 , 0x8476 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x815d , 0x0 , 0x0 , 0x0 , +0x0 , 0x815c , 0x8161 , 0x0 , +0x8165 , 0x8166 , 0x0 , 0x0 , +0x8167 , 0x8168 , 0x0 , 0x0 , +0x81f5 , 0x81f6 , 0x0 , 0x0 , +0x0 , 0x8164 , 0x8163 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x81f1 , 0x0 , 0x818c , 0x818d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x81a6 , +0x0 , 0x0 , 0x7e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x818e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x81f0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x81a9 , 0x81aa , 0x81a8 , 0x81ab , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x81cb , 0x0 , +0x81cc , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x81cd , 0x0 , 0x81dd , 0x81ce , +0x0 , 0x0 , 0x0 , 0x81de , +0x81b8 , 0x0 , 0x0 , 0x81b9 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x817c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x81e3 , 0x0 , +0x0 , 0x81e5 , 0x8187 , 0x0 , +0x81da , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x81c8 , +0x81c9 , 0x81bf , 0x81be , 0x81e7 , +0x81e8 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8188 , 0x81e6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x81e4 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x81e0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8182 , 0x81df , 0x0 , 0x0 , +0x0 , 0x0 , 0x8185 , 0x8186 , +0x0 , 0x0 , 0x81e1 , 0x81e2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x81bc , 0x81bd , +0x0 , 0x0 , 0x81ba , 0x81bb , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x81db , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x81dc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x849f , 0x84aa , 0x84a0 , 0x84ab , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x84a1 , 0x0 , 0x0 , 0x84ac , +0x84a2 , 0x0 , 0x0 , 0x84ad , +0x84a4 , 0x0 , 0x0 , 0x84af , +0x84a3 , 0x0 , 0x0 , 0x84ae , +0x84a5 , 0x84ba , 0x0 , 0x0 , +0x84b5 , 0x0 , 0x0 , 0x84b0 , +0x84a7 , 0x84bc , 0x0 , 0x0 , +0x84b7 , 0x0 , 0x0 , 0x84b2 , +0x84a6 , 0x0 , 0x0 , 0x84b6 , +0x84bb , 0x0 , 0x0 , 0x84b1 , +0x84a8 , 0x0 , 0x0 , 0x84b8 , +0x84bd , 0x0 , 0x0 , 0x84b3 , +0x84a9 , 0x0 , 0x0 , 0x84b9 , +0x0 , 0x0 , 0x84be , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x84b4 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x81a1 , 0x81a0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x81a3 , 0x81a2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x81a5 , 0x81a4 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x819f , 0x819e , +0x0 , 0x0 , 0x0 , 0x819b , +0x0 , 0x0 , 0x819d , 0x819c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x81fc , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x819a , 0x8199 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x818a , 0x0 , 0x8189 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x81f4 , 0x0 , +0x0 , 0x81f3 , 0x0 , 0x81f2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8140 , 0x8141 , 0x8142 , 0x8156 , +0x0 , 0x8158 , 0x8159 , 0x815a , +0x8171 , 0x8172 , 0x8173 , 0x8174 , +0x8175 , 0x8176 , 0x8177 , 0x8178 , +0x8179 , 0x817a , 0x81a7 , 0x81ac , +0x816b , 0x816c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8160 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x829f , 0x82a0 , 0x82a1 , +0x82a2 , 0x82a3 , 0x82a4 , 0x82a5 , +0x82a6 , 0x82a7 , 0x82a8 , 0x82a9 , +0x82aa , 0x82ab , 0x82ac , 0x82ad , +0x82ae , 0x82af , 0x82b0 , 0x82b1 , +0x82b2 , 0x82b3 , 0x82b4 , 0x82b5 , +0x82b6 , 0x82b7 , 0x82b8 , 0x82b9 , +0x82ba , 0x82bb , 0x82bc , 0x82bd , +0x82be , 0x82bf , 0x82c0 , 0x82c1 , +0x82c2 , 0x82c3 , 0x82c4 , 0x82c5 , +0x82c6 , 0x82c7 , 0x82c8 , 0x82c9 , +0x82ca , 0x82cb , 0x82cc , 0x82cd , +0x82ce , 0x82cf , 0x82d0 , 0x82d1 , +0x82d2 , 0x82d3 , 0x82d4 , 0x82d5 , +0x82d6 , 0x82d7 , 0x82d8 , 0x82d9 , +0x82da , 0x82db , 0x82dc , 0x82dd , +0x82de , 0x82df , 0x82e0 , 0x82e1 , +0x82e2 , 0x82e3 , 0x82e4 , 0x82e5 , +0x82e6 , 0x82e7 , 0x82e8 , 0x82e9 , +0x82ea , 0x82eb , 0x82ec , 0x82ed , +0x82ee , 0x82ef , 0x82f0 , 0x82f1 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x814a , +0x814b , 0x8154 , 0x8155 , 0x0 , +0x0 , 0x8340 , 0x8341 , 0x8342 , +0x8343 , 0x8344 , 0x8345 , 0x8346 , +0x8347 , 0x8348 , 0x8349 , 0x834a , +0x834b , 0x834c , 0x834d , 0x834e , +0x834f , 0x8350 , 0x8351 , 0x8352 , +0x8353 , 0x8354 , 0x8355 , 0x8356 , +0x8357 , 0x8358 , 0x8359 , 0x835a , +0x835b , 0x835c , 0x835d , 0x835e , +0x835f , 0x8360 , 0x8361 , 0x8362 , +0x8363 , 0x8364 , 0x8365 , 0x8366 , +0x8367 , 0x8368 , 0x8369 , 0x836a , +0x836b , 0x836c , 0x836d , 0x836e , +0x836f , 0x8370 , 0x8371 , 0x8372 , +0x8373 , 0x8374 , 0x8375 , 0x8376 , +0x8377 , 0x8378 , 0x8379 , 0x837a , +0x837b , 0x837c , 0x837d , 0x837e , +0x8380 , 0x8381 , 0x8382 , 0x8383 , +0x8384 , 0x8385 , 0x8386 , 0x8387 , +0x8388 , 0x8389 , 0x838a , 0x838b , +0x838c , 0x838d , 0x838e , 0x838f , +0x8390 , 0x8391 , 0x8392 , 0x8393 , +0x8394 , 0x8395 , 0x8396 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8145 , +0x815b , 0x8152 , 0x8153 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x88ea , 0x929a , 0x0 , 0x8eb5 , +0x0 , 0x0 , 0x0 , 0x969c , +0x8fe4 , 0x8e4f , 0x8fe3 , 0x89ba , +0x0 , 0x9573 , 0x975e , 0x0 , +0x98a0 , 0x894e , 0x0 , 0x0 , +0x8a8e , 0x98a1 , 0x90a2 , 0x99c0 , +0x8b75 , 0x95b8 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8fe5 , 0x0 , +0x0 , 0x97bc , 0x0 , 0x0 , +0x0 , 0x0 , 0x95c0 , 0x0 , +0x0 , 0x0 , 0x98a2 , 0x0 , +0x0 , 0x9286 , 0x0 , 0x0 , +0x0 , 0x98a3 , 0x8bf8 , 0x0 , +0x0 , 0x0 , 0x98a4 , 0x0 , +0x8adb , 0x924f , 0x0 , 0x8ee5 , +0x98a5 , 0x0 , 0x0 , 0x98a6 , +0x0 , 0x0 , 0x98a7 , 0x9454 , +0x0 , 0x8b76 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9456 , +0x0 , 0x93e1 , 0x8cc1 , 0x9652 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe568 , 0x98a8 , 0x8fe6 , +0x98a9 , 0x89b3 , 0x0 , 0x0 , +0x0 , 0x8be3 , 0x8cee , 0x96e7 , +0x0 , 0x0 , 0x9ba4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9790 , 0x0 , 0x93fb , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8aa3 , 0x0 , +0x8b54 , 0x0 , 0x98aa , 0x0 , +0x0 , 0x98ab , 0x97b9 , 0x0 , +0x975c , 0x9188 , 0x98ad , 0x8e96 , +0x93f1 , 0x0 , 0x98b0 , 0x0 , +0x0 , 0x895d , 0x8cdd , 0x0 , +0x8cdc , 0x88e4 , 0x0 , 0x0 , +0x986a , 0x9869 , 0x0 , 0x8db1 , +0x889f , 0x0 , 0x98b1 , 0x98b2 , +0x98b3 , 0x9653 , 0x98b4 , 0x0 , +0x8cf0 , 0x88e5 , 0x9692 , 0x0 , +0x8b9c , 0x0 , 0x0 , 0x8b9d , +0x8b9e , 0x92e0 , 0x97ba , 0x0 , +0x98b5 , 0x0 , 0x0 , 0x98b6 , +0x0 , 0x0 , 0x98b7 , 0x0 , +0x0 , 0x0 , 0x906c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8f59 , 0x906d , 0x98bc , 0x0 , +0x98ba , 0x0 , 0x98bb , 0x8b77 , +0x0 , 0x0 , 0x8da1 , 0x89ee , +0x0 , 0x98b9 , 0x98b8 , 0x95a7 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8e65 , 0x8e64 , 0x91bc , 0x98bd , +0x9574 , 0x90e5 , 0x0 , 0x0 , +0x0 , 0x8157 , 0x98be , 0x98c0 , +0x0 , 0x0 , 0x0 , 0x91e3 , +0x97df , 0x88c8 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x98bf , 0x89bc , 0x0 , +0x8bc2 , 0x0 , 0x9287 , 0x0 , +0x0 , 0x0 , 0x8c8f , 0x98c1 , +0x0 , 0x0 , 0x0 , 0x9443 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8ae9 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x98c2 , 0x88c9 , 0x0 , +0x0 , 0x8cde , 0x8aea , 0x959a , +0x94b0 , 0x8b78 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x89ef , 0x0 , +0x98e5 , 0x9360 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x948c , +0x98c4 , 0x0 , 0x0 , 0x0 , +0x94ba , 0x0 , 0x97e0 , 0x0 , +0x904c , 0x0 , 0x8e66 , 0x0 , +0x8e97 , 0x89be , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x92cf , +0x0 , 0x0 , 0x9241 , 0x98c8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x88ca , 0x92e1 , 0x8f5a , +0x8db2 , 0x9743 , 0x0 , 0x91cc , +0x0 , 0x89bd , 0x0 , 0x98c7 , +0x0 , 0x975d , 0x98c3 , 0x98c5 , +0x8dec , 0x98c6 , 0x9b43 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x98ce , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x98d1 , +0x98cf , 0x0 , 0x0 , 0x89c0 , +0x0 , 0x95b9 , 0x98c9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x98cd , +0x8cf1 , 0x0 , 0x0 , 0x8e67 , +0x0 , 0x0 , 0x0 , 0x8aa4 , +0x0 , 0x0 , 0x98d2 , 0x0 , +0x98ca , 0x0 , 0x0 , 0x97e1 , +0x0 , 0x8e98 , 0x0 , 0x98cb , +0x0 , 0x98d0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x98d3 , 0x0 , +0x98cc , 0x0 , 0x0 , 0x8b9f , +0x0 , 0x88cb , 0x0 , 0x0 , +0x8ba0 , 0x89bf , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9b44 , +0x0 , 0x9699 , 0x958e , 0x8cf2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x904e , 0x97b5 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x95d6 , +0x0 , 0x0 , 0x8c57 , 0x91a3 , +0x89e2 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8f72 , 0x0 , +0x0 , 0x0 , 0x98d7 , 0x0 , +0x98dc , 0x98da , 0x0 , 0x0 , +0x98d5 , 0x0 , 0x0 , 0x91ad , +0x98d8 , 0x0 , 0x98db , 0x98d9 , +0x0 , 0x95db , 0x0 , 0x98d6 , +0x0 , 0x904d , 0x0 , 0x9693 , +0x98dd , 0x98de , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8f43 , 0x98eb , +0x0 , 0x0 , 0x0 , 0x946f , +0x0 , 0x9555 , 0x98e6 , 0x0 , +0x95ee , 0x0 , 0x89b4 , 0x0 , +0x0 , 0x0 , 0x98ea , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x98e4 , 0x98ed , 0x0 , +0x0 , 0x9171 , 0x0 , 0x8cc2 , +0x0 , 0x947b , 0x0 , 0xe0c5 , +0x0 , 0x98ec , 0x937c , 0x0 , +0x98e1 , 0x0 , 0x8cf4 , 0x0 , +0x0 , 0x8cf3 , 0x98df , 0x0 , +0x0 , 0x0 , 0x0 , 0x8ed8 , +0x0 , 0x98e7 , 0x0 , 0x95ed , +0x926c , 0x98e3 , 0x8c91 , 0x0 , +0x98e0 , 0x98e8 , 0x98e2 , 0x97cf , +0x98e9 , 0x9860 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8be4 , 0x0 , +0x0 , 0x8c90 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x98ee , +0x0 , 0x0 , 0x0 , 0x98ef , +0x98f3 , 0x88cc , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x95ce , +0x98f2 , 0x0 , 0x0 , 0x0 , +0x0 , 0x98f1 , 0x98f5 , 0x0 , +0x0 , 0x0 , 0x98f4 , 0x0 , +0x92e2 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8c92 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x98f6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8ec3 , 0x0 , +0x91a4 , 0x92e3 , 0x8bf4 , 0x0 , +0x98f7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8b55 , 0x0 , 0x0 , +0x98f8 , 0x0 , 0x0 , 0x0 , +0x0 , 0x98fa , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9654 , 0x0 , 0x0 , +0x0 , 0x8c86 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8e50 , 0x94f5 , 0x98f9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8dc3 , 0x9762 , 0x0 , 0x0 , +0x0 , 0x0 , 0x98fc , 0x9942 , +0x98fb , 0x8dc2 , 0x0 , 0x8f9d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8c58 , 0x0 , +0x0 , 0x0 , 0x9943 , 0x0 , +0x0 , 0x8bcd , 0x0 , 0x0 , +0x0 , 0x9940 , 0x9941 , 0x0 , +0x0 , 0x93ad , 0x0 , 0x919c , +0x0 , 0x8ba1 , 0x0 , 0x0 , +0x0 , 0x966c , 0x9944 , 0x0 , +0x0 , 0x0 , 0x97bb , 0x0 , +0x0 , 0x0 , 0x9945 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9948 , +0x0 , 0x9946 , 0x0 , 0x916d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9947 , 0x9949 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x994b , 0x0 , 0x0 , +0x0 , 0x994a , 0x0 , 0x95c6 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8b56 , 0x994d , 0x994e , 0x0 , +0x89ad , 0x0 , 0x0 , 0x0 , +0x0 , 0x994c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8ef2 , 0x0 , +0x9951 , 0x9950 , 0x994f , 0x0 , +0x98d4 , 0x0 , 0x9952 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8f9e , +0x0 , 0x9953 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9744 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x96d7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9955 , +0x0 , 0x0 , 0x9954 , 0x9957 , +0x9956 , 0x0 , 0x0 , 0x9958 , +0x9959 , 0x88f2 , 0x0 , 0x8cb3 , +0x8c5a , 0x8f5b , 0x929b , 0x8ba2 , +0x90e6 , 0x8cf5 , 0x0 , 0x8d8e , +0x995b , 0x96c6 , 0x9365 , 0x0 , +0x8e99 , 0x0 , 0x995a , 0x0 , +0x995c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x937d , 0x0 , +0x8a95 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x995d , 0x0 , +0x0 , 0x93fc , 0x0 , 0x0 , +0x9153 , 0x995f , 0x9960 , 0x94aa , +0x8cf6 , 0x985a , 0x9961 , 0x0 , +0x0 , 0x8ba4 , 0x0 , 0x0 , +0x0 , 0x95ba , 0x91b4 , 0x8bef , +0x9354 , 0x0 , 0x0 , 0x0 , +0x8c93 , 0x0 , 0x0 , 0x0 , +0x9962 , 0x0 , 0x9963 , 0x0 , +0x0 , 0x93e0 , 0x897e , 0x0 , +0x0 , 0x9966 , 0x8dfb , 0x0 , +0x9965 , 0x8dc4 , 0x0 , 0x9967 , +0xe3ec , 0x9968 , 0x9660 , 0x9969 , +0x0 , 0x996a , 0x996b , 0x8fe7 , +0x0 , 0x8eca , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8aa5 , 0x0 , 0x996e , 0x0 , +0x996c , 0x96bb , 0x996d , 0x0 , +0x9579 , 0x996f , 0x9970 , 0x9971 , +0x937e , 0x0 , 0x0 , 0x0 , +0x9975 , 0x9973 , 0x9974 , 0x9972 , +0x8de1 , 0x9976 , 0x96e8 , 0x97e2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9977 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x90a6 , 0x9978 , 0x8f79 , 0x0 , +0x0 , 0x9979 , 0x0 , 0x929c , +0x97bd , 0x9380 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x99c3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x997a , +0xeaa3 , 0x8bc3 , 0x0 , 0x0 , +0x997b , 0x967d , 0x0 , 0x0 , +0x0 , 0x0 , 0x8f88 , 0x91fa , +0x0 , 0x997d , 0x93e2 , 0x0 , +0x0 , 0x997e , 0x0 , 0x0 , +0x9980 , 0x8a4d , 0x0 , 0x0 , +0x0 , 0x9981 , 0x8ba5 , 0x0 , +0x93ca , 0x899a , 0x8f6f , 0x0 , +0x0 , 0x949f , 0x9982 , 0x0 , +0x9381 , 0x0 , 0x0 , 0x906e , +0x9983 , 0x0 , 0x95aa , 0x90d8 , +0x8aa0 , 0x0 , 0x8aa7 , 0x9984 , +0x0 , 0x0 , 0x9986 , 0x0 , +0x0 , 0x8c59 , 0x0 , 0x0 , +0x9985 , 0x0 , 0x0 , 0x97f1 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8f89 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x94bb , 0x95ca , 0x0 , 0x9987 , +0x0 , 0x9798 , 0x9988 , 0x0 , +0x0 , 0x0 , 0x9989 , 0x0 , +0x939e , 0x0 , 0x0 , 0x998a , +0x0 , 0x0 , 0x90a7 , 0x8dfc , +0x8c94 , 0x998b , 0x8e68 , 0x8d8f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x92e4 , +0x998d , 0x0 , 0x0 , 0x91a5 , +0x0 , 0x0 , 0x8ded , 0x998e , +0x998f , 0x914f , 0x0 , 0x998c , +0x0 , 0x0 , 0x0 , 0x0 , +0x9991 , 0x0 , 0x9655 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8d84 , +0x0 , 0x0 , 0x9990 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8c95 , +0x8ddc , 0x948d , 0x0 , 0x0 , +0x0 , 0x9994 , 0x9992 , 0x0 , +0x0 , 0x0 , 0x0 , 0x959b , +0x8fe8 , 0x999b , 0x8a84 , 0x9995 , +0x9993 , 0x916e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9997 , 0x0 , 0x9996 , +0x0 , 0x0 , 0x0 , 0x8a63 , +0x0 , 0x0 , 0x0 , 0x8c80 , +0x999c , 0x97ab , 0x0 , 0x0 , +0x0 , 0x9998 , 0x0 , 0x0 , +0x0 , 0x999d , 0x999a , 0x0 , +0x9999 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x97cd , +0x0 , 0x0 , 0x0 , 0x8cf7 , +0x89c1 , 0x0 , 0x0 , 0x97f2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8f95 , 0x9377 , 0x8d85 , +0x99a0 , 0x99a1 , 0x0 , 0x0 , +0x0 , 0x97e3 , 0x0 , 0x0 , +0x984a , 0x99a3 , 0x0 , 0x0 , +0x0 , 0x8cf8 , 0x0 , 0x0 , +0x99a2 , 0x0 , 0x8a4e , 0x0 , +0x0 , 0x99a4 , 0x0 , 0x9675 , +0x0 , 0x92ba , 0x0 , 0x9745 , +0x0 , 0x95d7 , 0x0 , 0x0 , +0x0 , 0x99a5 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe8d3 , 0x0 , +0x0 , 0x93ae , 0x0 , 0x99a6 , +0x8aa8 , 0x96b1 , 0x0 , 0x0 , +0x0 , 0x8f9f , 0x99a7 , 0x95e5 , +0x99ab , 0x0 , 0x90a8 , 0x99a8 , +0x8bce , 0x0 , 0x99a9 , 0x8aa9 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8c4d , 0x99ac , +0x0 , 0x99ad , 0x0 , 0x0 , +0x99ae , 0x99af , 0x8ed9 , 0x0 , +0x0 , 0x0 , 0x8cf9 , 0x96dc , +0x0 , 0x96e6 , 0x93f5 , 0x0 , +0x0 , 0x95ef , 0x99b0 , 0x0 , +0x99b1 , 0x0 , 0x0 , 0x0 , +0x0 , 0x99b3 , 0x0 , 0x99b5 , +0x99b4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x99b6 , 0x89bb , 0x966b , +0x0 , 0x8dfa , 0x99b7 , 0x0 , +0x0 , 0x9178 , 0x0 , 0x0 , +0x8fa0 , 0x8ba7 , 0x0 , 0x99b8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x94d9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x99b9 , +0x0 , 0x99ba , 0x0 , 0x99bb , +0x0 , 0x0 , 0x0 , 0x0 , +0x99bc , 0x9543 , 0x8be6 , 0x88e3 , +0x0 , 0x0 , 0x0 , 0x93bd , +0x99bd , 0x8f5c , 0x0 , 0x90e7 , +0x0 , 0x99bf , 0x99be , 0x8fa1 , +0x8cdf , 0x99c1 , 0x94bc , 0x0 , +0x0 , 0x99c2 , 0x0 , 0x0 , +0x0 , 0x94da , 0x91b2 , 0x91ec , +0x8ba6 , 0x0 , 0x0 , 0x93ec , +0x9250 , 0x0 , 0x948e , 0x0 , +0x966d , 0x0 , 0x99c4 , 0x0 , +0x90e8 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8c54 , 0x0 , +0x0 , 0x99c5 , 0x0 , 0x0 , +0x0 , 0x0 , 0x99c6 , 0x894b , +0x88f3 , 0x8aeb , 0x0 , 0x91a6 , +0x8b70 , 0x9791 , 0x0 , 0x99c9 , +0x89b5 , 0x0 , 0x0 , 0x99c8 , +0x0 , 0x0 , 0x0 , 0x8ba8 , +0x0 , 0x0 , 0x99ca , 0x0 , +0x96ef , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x99cb , 0x0 , +0x97d0 , 0x0 , 0x8cfa , 0x0 , +0x0 , 0x0 , 0x0 , 0x8cb4 , +0x99cc , 0x0 , 0x0 , 0x0 , +0x0 , 0x99ce , 0x99cd , 0x0 , +0x907e , 0x8958 , 0x0 , 0x0 , +0x0 , 0x897d , 0x99cf , 0x0 , +0x99d0 , 0x0 , 0x0 , 0x8cb5 , +0x0 , 0x0 , 0x99d1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8b8e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8e51 , 0x99d2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9694 , 0x8db3 , 0x8b79 , 0x9746 , +0x916f , 0x94bd , 0x8efb , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8f66 , 0x0 , 0x8ee6 , 0x8ef3 , +0x0 , 0x8f96 , 0x0 , 0x94be , +0x0 , 0x0 , 0x0 , 0x99d5 , +0x0 , 0x8962 , 0x9170 , 0x8cfb , +0x8cc3 , 0x8be5 , 0x0 , 0x0 , +0x99d9 , 0x9240 , 0x91fc , 0x8ba9 , +0x8fa2 , 0x99da , 0x99d8 , 0x89c2 , +0x91e4 , 0x8eb6 , 0x8e6a , 0x8945 , +0x0 , 0x0 , 0x8a90 , 0x8d86 , +0x8e69 , 0x0 , 0x99db , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x99dc , 0x0 , 0x8b68 , +0x8a65 , 0x0 , 0x0 , 0x0 , +0x8d87 , 0x8b67 , 0x92dd , 0x8944 , +0x93af , 0x96bc , 0x8d40 , 0x9799 , +0x9366 , 0x8cfc , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8c4e , +0x0 , 0x99e5 , 0x0 , 0x8be1 , +0x9669 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x94db , 0x0 , +0x0 , 0x99e4 , 0x0 , 0x8adc , +0x99df , 0x99e0 , 0x99e2 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x99e3 , 0x0 , +0x8b7a , 0x9081 , 0x0 , 0x95ab , +0x99e1 , 0x99dd , 0x8ce1 , 0x0 , +0x99de , 0x0 , 0x9843 , 0x0 , +0x0 , 0x0 , 0x95f0 , 0x0 , +0x92e6 , 0x8ce0 , 0x8d90 , 0x0 , +0x0 , 0x0 , 0x99e6 , 0x0 , +0x0 , 0x93db , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x99ea , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8efc , 0x0 , 0x8ef4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x99ed , 0x99eb , 0x0 , 0x96a1 , +0x0 , 0x99e8 , 0x99f1 , 0x99ec , +0x0 , 0x0 , 0x0 , 0x99ef , +0x8cc4 , 0x96bd , 0x0 , 0x0 , +0x99f0 , 0x0 , 0x0 , 0x0 , +0x99f2 , 0x0 , 0x99f4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8dee , +0x9861 , 0x0 , 0x99e9 , 0x99e7 , +0x99f3 , 0x0 , 0x99ee , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x99f6 , 0x0 , +0x9a42 , 0x99f8 , 0x0 , 0x0 , +0x99fc , 0x0 , 0x0 , 0x9a40 , +0x99f9 , 0x0 , 0x0 , 0x9a5d , +0x0 , 0x0 , 0x8de7 , 0x8a50 , +0x0 , 0x0 , 0x0 , 0x0 , +0x99f7 , 0x0 , 0x0 , 0x0 , +0x9a44 , 0x88f4 , 0x9a43 , 0x0 , +0x88a3 , 0x9569 , 0x9a41 , 0x0 , +0x99fa , 0x0 , 0x0 , 0x99f5 , +0x99fb , 0x8dc6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a45 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x88f5 , 0x9a4e , 0x0 , +0x0 , 0x9a46 , 0x9a47 , 0x0 , +0x8fa3 , 0x9689 , 0x0 , 0x0 , +0x0 , 0x9a4c , 0x9a4b , 0x0 , +0x0 , 0x0 , 0x934e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9a4d , 0x0 , +0x0 , 0x9a4a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8953 , 0x0 , 0x8db4 , 0x904f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9a48 , +0x9382 , 0x0 , 0x0 , 0x0 , +0x9a49 , 0x0 , 0x88a0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9a53 , 0x9742 , +0x0 , 0x8fa5 , 0x0 , 0x9a59 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a58 , 0x9a4f , 0x0 , 0x0 , +0x0 , 0x0 , 0x91c1 , 0x0 , +0x9a50 , 0x0 , 0x0 , 0x0 , +0x91ed , 0x9a55 , 0x8fa4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a52 , 0x0 , 0x0 , 0x96e2 , +0x0 , 0x0 , 0x0 , 0x8c5b , +0x0 , 0x0 , 0x9a56 , 0x9a57 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a54 , 0x9a5a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9a51 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9a60 , +0x9a65 , 0x0 , 0x9a61 , 0x0 , +0x9a5c , 0x0 , 0x0 , 0x9a66 , +0x9150 , 0x0 , 0x0 , 0x9a68 , +0x0 , 0x8d41 , 0x9a5e , 0x929d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a62 , 0x9a5b , 0x8aab , 0x0 , +0x8aec , 0x8a85 , 0x9a63 , 0x9a5f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8c96 , +0x9a69 , 0x9a67 , 0x9172 , 0x8b69 , +0x8baa , 0x0 , 0x9a64 , 0x0 , +0x8bf2 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8963 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a6d , 0x9a6b , 0x0 , 0x9aa5 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a70 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9a6a , 0x0 , +0x9a6e , 0x0 , 0x0 , 0x9a6c , +0x0 , 0x0 , 0x0 , 0x8e6b , +0x9a6f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9a72 , +0x0 , 0x9a77 , 0x0 , 0x0 , +0x0 , 0x9a75 , 0x9a74 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9251 , 0x0 , +0x0 , 0x89c3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a71 , 0x0 , 0x9a73 , 0x8fa6 , +0x8952 , 0x0 , 0x0 , 0x9a76 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x89dc , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9a82 , +0x0 , 0x8ffa , 0x9a7d , 0x0 , +0x9a7b , 0x0 , 0x9a7c , 0x0 , +0x9a7e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x895c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9158 , 0x0 , 0x9a78 , 0x0 , +0x9a79 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8a9a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a81 , 0x0 , 0x0 , 0x0 , +0x8aed , 0x0 , 0x9a84 , 0x9a80 , +0x9a83 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x95ac , 0x0 , 0x0 , 0x0 , +0x93d3 , 0x0 , 0x94b6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a86 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9a85 , 0x8a64 , +0x0 , 0x0 , 0x9a87 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9a8a , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a89 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a88 , 0x0 , 0x9458 , 0x0 , +0x0 , 0x9a8b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9a8c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a8e , 0x0 , 0x9a8d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a90 , 0x0 , 0x0 , 0x0 , +0x9a93 , 0x9a91 , 0x9a8f , 0x9a92 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9a94 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9a95 , 0x0 , +0x0 , 0x9a96 , 0x0 , 0x9a97 , +0x0 , 0x0 , 0x0 , 0x9a98 , +0x9964 , 0x0 , 0x8efa , 0x8e6c , +0x0 , 0x0 , 0x89f1 , 0x0 , +0x88f6 , 0x0 , 0x0 , 0x9263 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9a99 , 0x0 , +0x8da2 , 0x0 , 0x88cd , 0x907d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9a9a , 0x8cc5 , 0x0 , +0x0 , 0x8d91 , 0x0 , 0x9a9c , +0x9a9b , 0x0 , 0x0 , 0x95de , +0x9a9d , 0x0 , 0x0 , 0x0 , +0x9a9f , 0x9a9e , 0x0 , 0x9aa0 , +0x0 , 0x9aa1 , 0x0 , 0x8c97 , +0x0 , 0x0 , 0x8980 , 0x9aa2 , +0x0 , 0x0 , 0x9aa4 , 0x0 , +0x9aa3 , 0x0 , 0x0 , 0x0 , +0x9aa6 , 0x0 , 0x0 , 0x9379 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9aa7 , 0x88b3 , +0x8ddd , 0x0 , 0x0 , 0x0 , +0x0 , 0x8c5c , 0x0 , 0x0 , +0x926e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9aa8 , +0x9aa9 , 0x0 , 0x0 , 0x9aab , +0x0 , 0x0 , 0x0 , 0x0 , +0x9aac , 0x0 , 0x8de2 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8bcf , +0x0 , 0x0 , 0x9656 , 0x0 , +0x0 , 0x0 , 0x9aaa , 0x9aad , +0x8dbf , 0x8d42 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9ab1 , 0x0 , 0x0 , +0x8da3 , 0x0 , 0x9252 , 0x0 , +0x0 , 0x9aae , 0x92d8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9ab2 , +0x0 , 0x0 , 0x9082 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9ab0 , 0x9ab3 , 0x0 , 0x8c5e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9ab4 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9ab5 , 0x0 , 0x8d43 , 0x8a5f , +0x9ab7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9ab8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9ab9 , 0x0 , 0x0 , 0x9ab6 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9aaf , 0x0 , 0x0 , 0x9aba , +0x0 , 0x0 , 0x9abb , 0x0 , +0x0 , 0x0 , 0x0 , 0x9684 , +0x0 , 0x0 , 0x8fe9 , 0x0 , +0x0 , 0x0 , 0x9abd , 0x9abe , +0x9abc , 0x0 , 0x9ac0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9457 , 0x0 , 0x0 , 0x88e6 , +0x9575 , 0x0 , 0x0 , 0x9ac1 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8ffb , 0x0 , 0x0 , 0x8eb7 , +0x0 , 0x947c , 0x8aee , 0x0 , +0x8de9 , 0x0 , 0x0 , 0x0 , +0x9678 , 0x0 , 0x93b0 , 0x0 , +0x0 , 0x8c98 , 0x91cd , 0x0 , +0x0 , 0x0 , 0x9abf , 0x9ac2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x91c2 , 0x0 , 0x0 , +0x0 , 0x9ac3 , 0x0 , 0x0 , +0x0 , 0x9ac4 , 0x0 , 0x0 , +0x0 , 0x9ac6 , 0x0 , 0x0 , +0x92e7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8aac , 0x0 , +0x0 , 0x0 , 0x0 , 0xea9f , +0x8981 , 0x95f1 , 0x0 , 0x0 , +0x8fea , 0x9367 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8de4 , 0x0 , +0x0 , 0x9acc , 0x0 , 0x0 , +0x95bb , 0x97db , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x89f2 , 0x9ac8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9159 , 0x9acb , 0x0 , +0x9383 , 0x0 , 0x0 , 0x9368 , +0x9384 , 0x94b7 , 0x92cb , 0x0 , +0x0 , 0x0 , 0x8dc7 , 0x0 , +0x0 , 0x0 , 0x9ac7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8996 , 0x0 , 0x9355 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9ac9 , 0x0 , 0x9ac5 , 0x0 , +0x0 , 0x906f , 0x0 , 0x0 , +0x0 , 0x9acd , 0x0 , 0x0 , +0x0 , 0x0 , 0x8f6d , 0x0 , +0x0 , 0x0 , 0x0 , 0x8bab , +0x0 , 0x9ace , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x95e6 , +0x0 , 0x0 , 0x0 , 0x919d , +0x0 , 0x0 , 0x0 , 0x0 , +0x92c4 , 0x0 , 0x0 , 0x9ad0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x966e , 0x0 , 0x0 , 0x9ad1 , +0x0 , 0x0 , 0x9ad6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x95ad , +0x0 , 0x0 , 0x0 , 0x0 , +0x9ad5 , 0x9acf , 0x9ad2 , 0x9ad4 , +0x0 , 0x0 , 0x8da4 , 0x0 , +0x0 , 0x95c7 , 0x0 , 0x0 , +0x0 , 0x9ad7 , 0x0 , 0x9264 , +0x0 , 0x0 , 0x89f3 , 0x0 , +0x8feb , 0x0 , 0x0 , 0x0 , +0x0 , 0x9ad9 , 0x0 , 0x9ad8 , +0x0 , 0x8d88 , 0x0 , 0x9ada , +0x9adc , 0x9adb , 0x0 , 0x0 , +0x9ade , 0x0 , 0x9ad3 , 0x9ae0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9adf , 0x9add , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8e6d , +0x9070 , 0x0 , 0x9173 , 0x9ae1 , +0x90ba , 0x88eb , 0x9484 , 0x0 , +0x0 , 0x0 , 0x0 , 0x92d9 , +0x0 , 0x9ae3 , 0x9ae2 , 0x9ae4 , +0x9ae5 , 0x9ae6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9ae7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x95cf , 0x9ae8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x89c4 , +0x9ae9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x975b , 0x8a4f , 0x0 , +0x99c7 , 0x8f67 , 0x91bd , 0x9aea , +0x96e9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x96b2 , 0x0 , +0x0 , 0x9aec , 0x0 , 0x91e5 , +0x0 , 0x9356 , 0x91be , 0x9576 , +0x9aed , 0x9aee , 0x899b , 0x0 , +0x0 , 0x8eb8 , 0x9aef , 0x0 , +0x0 , 0x0 , 0x0 , 0x88ce , +0x9af0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9af1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8982 , 0x0 , 0x0 , 0x8aef , +0x93de , 0x95f2 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9af5 , 0x9174 , +0x9af4 , 0x8c5f , 0x0 , 0x0 , +0x967a , 0x9af3 , 0x0 , 0x9385 , +0x9af7 , 0x0 , 0x9af6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9af9 , 0x0 , 0x9af8 , 0x0 , +0x0 , 0x899c , 0x0 , 0x9afa , +0x8fa7 , 0x9afc , 0x9244 , 0x0 , +0x9afb , 0x0 , 0x95b1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8f97 , +0x937a , 0x0 , 0x0 , 0x0 , +0x9b40 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8d44 , 0x0 , 0x0 , +0x0 , 0x9b41 , 0x9440 , 0x94dc , +0x96cf , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9444 , 0x0 , +0x0 , 0x9b4a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8b57 , +0x0 , 0x0 , 0x9764 , 0x0 , +0x0 , 0x96ad , 0x0 , 0x9baa , +0x0 , 0x9b42 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9b45 , +0x0 , 0x91c3 , 0x0 , 0x0 , +0x9657 , 0x0 , 0x0 , 0x0 , +0x9369 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9b46 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9685 , 0x0 , 0x8dc8 , +0x0 , 0x0 , 0x8fa8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9b47 , 0x0 , +0x0 , 0x8e6f , 0x0 , 0x8e6e , +0x0 , 0x0 , 0x0 , 0x0 , +0x88b7 , 0x8cc6 , 0x0 , 0x90a9 , +0x88cf , 0x0 , 0x0 , 0x0 , +0x0 , 0x9b4b , 0x9b4c , 0x0 , +0x9b49 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8957 , 0x8aad , 0x0 , +0x9b48 , 0x0 , 0x96c3 , 0x9550 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x88a6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x88f7 , +0x0 , 0x0 , 0x0 , 0x8e70 , +0x0 , 0x88d0 , 0x0 , 0x88a1 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9b51 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9b4f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x96ba , 0x0 , 0x9b52 , 0x0 , +0x9b50 , 0x0 , 0x0 , 0x9b4e , +0x9050 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9b4d , 0x0 , 0x0 , +0x0 , 0x95d8 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8ce2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9b56 , 0x9b57 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8fa9 , 0x0 , 0x0 , 0x0 , +0x9b53 , 0x984b , 0x0 , 0x0 , +0x0 , 0x0 , 0x946b , 0x0 , +0x0 , 0x9b55 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8da5 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9b58 , 0x0 , +0x0 , 0x0 , 0x9577 , 0x0 , +0x0 , 0x0 , 0x9b59 , 0x0 , +0x9b54 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x96b9 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x947d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9b5a , 0x9551 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9b5b , 0x9b5f , 0x9b5c , 0x0 , +0x0 , 0x89c5 , 0x9b5e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8eb9 , 0x0 , 0x9b5d , +0x8c99 , 0x0 , 0x0 , 0x0 , +0x9b6b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9b64 , 0x9b61 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9284 , 0x0 , 0x9b60 , +0x0 , 0x0 , 0x9b62 , 0x0 , +0x0 , 0x9b63 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9b65 , 0x9b66 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8af0 , 0x0 , 0x9b68 , +0x9b67 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9b69 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8fec , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9b6c , 0x0 , +0x92da , 0x0 , 0x0 , 0x0 , +0x8964 , 0x0 , 0x9b6a , 0x0 , +0x0 , 0x0 , 0x9b6d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9b6e , 0x0 , +0x9b71 , 0x0 , 0x0 , 0x9b6f , +0x0 , 0x9b70 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8e71 , 0x9b72 , 0x0 , 0x0 , +0x8d45 , 0x9b73 , 0x0 , 0x8e9a , +0x91b6 , 0x0 , 0x9b74 , 0x9b75 , +0x8e79 , 0x8d46 , 0x0 , 0x96d0 , +0x0 , 0x0 , 0x0 , 0x8b47 , +0x8cc7 , 0x9b76 , 0x8a77 , 0x0 , +0x0 , 0x9b77 , 0x0 , 0x91b7 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9b78 , 0x9ba1 , 0x0 , 0x9b79 , +0x0 , 0x9b7a , 0x0 , 0x0 , +0x9b7b , 0x0 , 0x9b7d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9b7e , 0x0 , 0x0 , 0x9b80 , +0x0 , 0x91ee , 0x0 , 0x8946 , +0x8ee7 , 0x88c0 , 0x0 , 0x9176 , +0x8aae , 0x8eb3 , 0x0 , 0x8d47 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9386 , 0x0 , 0x8f40 , +0x8aaf , 0x9288 , 0x92e8 , 0x88b6 , +0x8b58 , 0x95f3 , 0x0 , 0x8ec0 , +0x0 , 0x0 , 0x8b71 , 0x90e9 , +0x8eba , 0x9747 , 0x9b81 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8b7b , 0x0 , +0x8dc9 , 0x0 , 0x0 , 0x8a51 , +0x8983 , 0x8faa , 0x89c6 , 0x0 , +0x9b82 , 0x9765 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8f68 , +0x0 , 0x0 , 0x8ee2 , 0x9b83 , +0x8af1 , 0x93d0 , 0x96a7 , 0x9b84 , +0x0 , 0x9b85 , 0x0 , 0x0 , +0x9578 , 0x0 , 0x0 , 0x0 , +0x9b87 , 0x0 , 0x8aa6 , 0x8bf5 , +0x9b86 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8ab0 , +0x0 , 0x9051 , 0x9b8b , 0x8e40 , +0x0 , 0x89c7 , 0x9b8a , 0x0 , +0x9b88 , 0x9b8c , 0x9b89 , 0x944a , +0x9ecb , 0x9052 , 0x0 , 0x9b8d , +0x0 , 0x0 , 0x97be , 0x0 , +0x9b8e , 0x0 , 0x0 , 0x9b90 , +0x0 , 0x929e , 0x9b8f , 0x0 , +0x90a1 , 0x0 , 0x8e9b , 0x0 , +0x0 , 0x0 , 0x91ce , 0x8ef5 , +0x0 , 0x9595 , 0x90ea , 0x0 , +0x8ecb , 0x9b91 , 0x8fab , 0x9b92 , +0x9b93 , 0x88d1 , 0x91b8 , 0x9071 , +0x0 , 0x9b94 , 0x93b1 , 0x8fac , +0x0 , 0x8fad , 0x0 , 0x9b95 , +0x0 , 0x0 , 0x90eb , 0x0 , +0x0 , 0x0 , 0x8fae , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9b96 , 0x0 , 0x9b97 , 0x0 , +0x96de , 0x0 , 0x0 , 0x0 , +0x9b98 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8bc4 , 0x0 , 0x0 , +0x0 , 0x8f41 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9b99 , 0x9b9a , 0x8eda , 0x904b , +0x93f2 , 0x9073 , 0x94f6 , 0x9441 , +0x8bc7 , 0x9b9b , 0x0 , 0x0 , +0x0 , 0x8b8f , 0x9b9c , 0x0 , +0x8bfc , 0x0 , 0x93cd , 0x89ae , +0x0 , 0x8e72 , 0x9b9d , 0x9ba0 , +0x9b9f , 0x8bfb , 0x0 , 0x9b9e , +0x0 , 0x9357 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x91ae , 0x0 , +0x936a , 0x8ec6 , 0x0 , 0x0 , +0x9177 , 0x979a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9ba2 , 0x0 , 0x9ba3 , 0x93d4 , +0x0 , 0x8e52 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9ba5 , 0x0 , +0x0 , 0x9ba6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9ba7 , 0x0 , 0x0 , 0x0 , +0x8af2 , 0x9ba8 , 0x0 , 0x0 , +0x9ba9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x89aa , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x915a , 0x8ae2 , 0x0 , 0x9bab , +0x96a6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x91d0 , 0x0 , 0x8a78 , +0x0 , 0x0 , 0x9bad , 0x9baf , +0x8add , 0x0 , 0x0 , 0x9bac , +0x9bae , 0x0 , 0x9bb1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9bb0 , 0x0 , 0x9bb2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9bb3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x93bb , 0x8bac , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x89e3 , 0x9bb4 , 0x9bb9 , 0x0 , +0x0 , 0x9bb7 , 0x0 , 0x95f5 , +0x95f4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9387 , 0x0 , +0x0 , 0x0 , 0x9bb6 , 0x8f73 , +0x0 , 0x9bb5 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9092 , +0x0 , 0x0 , 0x0 , 0x9bba , +0x0 , 0x0 , 0x8de8 , 0x0 , +0x0 , 0x9bc0 , 0x0 , 0x0 , +0x9bc1 , 0x9bbb , 0x8a52 , 0x9bbc , +0x9bc5 , 0x9bc4 , 0x9bc3 , 0x9bbf , +0x0 , 0x0 , 0x0 , 0x9bbe , +0x0 , 0x0 , 0x9bc2 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x95f6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9bc9 , +0x9bc6 , 0x0 , 0x9bc8 , 0x0 , +0x9792 , 0x0 , 0x9bc7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9bbd , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9093 , 0x0 , 0x0 , +0x9bca , 0x0 , 0x0 , 0x8db5 , +0x0 , 0x0 , 0x0 , 0x9bcb , +0x0 , 0x0 , 0x9bcc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9bcf , 0x0 , +0x9bce , 0x0 , 0x0 , 0x9bcd , +0x0 , 0x0 , 0x0 , 0x9388 , +0x9bb8 , 0x0 , 0x0 , 0x0 , +0x9bd5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9bd1 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9bd0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9bd2 , 0x0 , 0x9bd3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9bd6 , +0x0 , 0x0 , 0x97e4 , 0x0 , +0x9bd7 , 0x9bd4 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9bd8 , 0x0 , 0x0 , +0x8ade , 0x9bd9 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9bdb , 0x9bda , +0x0 , 0x0 , 0x9bdc , 0x0 , +0x0 , 0x0 , 0x0 , 0x9bdd , +0x0 , 0x90ec , 0x8f42 , 0x0 , +0x0 , 0x8f84 , 0x0 , 0x9183 , +0x0 , 0x8d48 , 0x8db6 , 0x8d49 , +0x8b90 , 0x0 , 0x0 , 0x9bde , +0x0 , 0x0 , 0x8db7 , 0x0 , +0x0 , 0x8cc8 , 0x9bdf , 0x96a4 , +0x9462 , 0x9be0 , 0x0 , 0x8d4a , +0x0 , 0x0 , 0x0 , 0x8aaa , +0x0 , 0x9246 , 0x8bd0 , 0x0 , +0x0 , 0x0 , 0x8e73 , 0x957a , +0x0 , 0x0 , 0x94bf , 0x0 , +0x0 , 0x0 , 0x0 , 0x9be1 , +0x8af3 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9be4 , 0x0 , 0x0 , +0x0 , 0x0 , 0x929f , 0x0 , +0x0 , 0x9be3 , 0x9be2 , 0x9be5 , +0x0 , 0x92e9 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9083 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8e74 , +0x0 , 0x90c8 , 0x0 , 0x91d1 , +0x8b41 , 0x0 , 0x0 , 0x92a0 , +0x0 , 0x0 , 0x9be6 , 0x9be7 , +0x8fed , 0x0 , 0x0 , 0x0 , +0x0 , 0x9658 , 0x0 , 0x0 , +0x9bea , 0x0 , 0x0 , 0x9be9 , +0x9be8 , 0x959d , 0x0 , 0x9bf1 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9679 , 0x0 , 0x9beb , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9bed , 0x968b , 0x0 , 0x9bec , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9bee , +0x0 , 0x94a6 , 0x9bef , 0x95bc , +0x9bf0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8ab1 , 0x95bd , +0x944e , 0x9bf2 , 0x9bf3 , 0x0 , +0x8d4b , 0x8ab2 , 0x9bf4 , 0x8cb6 , +0x9763 , 0x9748 , 0x8af4 , 0x9bf6 , +0x0 , 0x92a1 , 0x0 , 0x8d4c , +0x8faf , 0x0 , 0x0 , 0x94dd , +0x0 , 0x0 , 0x8fb0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8f98 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x92ea , 0x95f7 , 0x9358 , +0x0 , 0x0 , 0x8d4d , 0x0 , +0x957b , 0x0 , 0x0 , 0x0 , +0x9bf7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9378 , 0x8dc0 , +0x0 , 0x0 , 0x0 , 0x8cc9 , +0x0 , 0x92eb , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x88c1 , 0x8f8e , 0x8d4e , +0x9766 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9bf8 , 0x9bf9 , 0x9470 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9bfa , 0x97f5 , 0x984c , 0x0 , +0x0 , 0x0 , 0x0 , 0x9bfc , +0x9bfb , 0x0 , 0x0 , 0x8a66 , +0x0 , 0x0 , 0x9c40 , 0x0 , +0x0 , 0x0 , 0x9c43 , 0x9c44 , +0x0 , 0x9c42 , 0x0 , 0x955f , +0x8fb1 , 0x9c46 , 0x9c45 , 0x9c41 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9c47 , 0x9c48 , 0x0 , 0x0 , +0x9c49 , 0x0 , 0x0 , 0x0 , +0x9c4c , 0x9c4a , 0x0 , 0x9c4b , +0x9c4d , 0x0 , 0x8984 , 0x92ec , +0x9c4e , 0x0 , 0x8c9a , 0x89f4 , +0x9455 , 0x0 , 0x9c4f , 0x93f9 , +0x0 , 0x95d9 , 0x0 , 0x9c50 , +0x984d , 0x0 , 0x0 , 0x0 , +0x0 , 0x9c51 , 0x95be , 0x9c54 , +0x989f , 0x98af , 0x0 , 0x8eae , +0x93f3 , 0x9c55 , 0x0 , 0x8b7c , +0x92a2 , 0x88f8 , 0x9c56 , 0x95a4 , +0x8d4f , 0x0 , 0x0 , 0x926f , +0x0 , 0x0 , 0x0 , 0x92ed , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x96ed , 0x8cb7 , 0x8cca , +0x0 , 0x9c57 , 0x0 , 0x0 , +0x0 , 0x9c58 , 0x0 , 0x9c5e , +0x0 , 0x8ee3 , 0x0 , 0x0 , +0x0 , 0x92a3 , 0x0 , 0x8bad , +0x9c59 , 0x0 , 0x0 , 0x0 , +0x954a , 0x0 , 0x9265 , 0x0 , +0x0 , 0x9c5a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9c5b , 0x0 , 0x8bae , 0x0 , +0x9c5c , 0x0 , 0x9c5d , 0x0 , +0x0 , 0x9c5f , 0x0 , 0x9396 , +0x0 , 0x0 , 0x9c60 , 0x9c61 , +0x0 , 0x9c62 , 0x0 , 0x0 , +0x9c53 , 0x9c52 , 0x0 , 0x0 , +0x0 , 0x9c63 , 0x8c60 , 0x0 , +0x0 , 0x0 , 0x9546 , 0x0 , +0x0 , 0x8dca , 0x9556 , 0x92a4 , +0x956a , 0x9c64 , 0x0 , 0x0 , +0x8fb2 , 0x8965 , 0x0 , 0x9c65 , +0x0 , 0x0 , 0x0 , 0x9c66 , +0x0 , 0x96f0 , 0x0 , 0x0 , +0x94de , 0x0 , 0x0 , 0x9c69 , +0x899d , 0x90aa , 0x9c68 , 0x9c67 , +0x8c61 , 0x91d2 , 0x0 , 0x9c6d , +0x9c6b , 0x0 , 0x9c6a , 0x97a5 , +0x8ce3 , 0x0 , 0x0 , 0x0 , +0x8f99 , 0x9c6c , 0x936b , 0x8f5d , +0x0 , 0x0 , 0x0 , 0x93be , +0x9c70 , 0x9c6f , 0x0 , 0x0 , +0x0 , 0x0 , 0x9c6e , 0x0 , +0x9c71 , 0x8ce4 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9c72 , 0x959c , 0x8f7a , 0x0 , +0x0 , 0x9c73 , 0x94f7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x93bf , +0x92a5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x934f , 0x0 , 0x0 , +0x9c74 , 0x8b4a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9053 , +0x0 , 0x954b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8af5 , 0x9445 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9c75 , 0x8e75 , +0x9659 , 0x965a , 0x0 , 0x0 , +0x899e , 0x9c7a , 0x0 , 0x0 , +0x9289 , 0x0 , 0x0 , 0x0 , +0x9c77 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x89f5 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9cab , 0x9c79 , 0x0 , 0x0 , +0x0 , 0x944f , 0x0 , 0x0 , +0x9c78 , 0x0 , 0x0 , 0x9c76 , +0x0 , 0x8d9a , 0x0 , 0x9c7c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9c83 , 0x9c89 , +0x9c81 , 0x0 , 0x937b , 0x0 , +0x0 , 0x9c86 , 0x957c , 0x0 , +0x0 , 0x9c80 , 0x0 , 0x9c85 , +0x97e5 , 0x8e76 , 0x0 , 0x0 , +0x91d3 , 0x9c7d , 0x0 , 0x0 , +0x0 , 0x8b7d , 0x9c88 , 0x90ab , +0x8985 , 0x9c82 , 0x89f6 , 0x9c87 , +0x0 , 0x0 , 0x0 , 0x8baf , +0x0 , 0x9c84 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9c8a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9c8c , 0x9c96 , 0x9c94 , +0x0 , 0x0 , 0x9c91 , 0x0 , +0x0 , 0x0 , 0x9c90 , 0x97f6 , +0x0 , 0x9c92 , 0x0 , 0x0 , +0x8bb0 , 0x0 , 0x8d50 , 0x0 , +0x0 , 0x8f9a , 0x0 , 0x0 , +0x0 , 0x9c99 , 0x9c8b , 0x0 , +0x0 , 0x0 , 0x0 , 0x9c8f , +0x9c7e , 0x0 , 0x89f8 , 0x9c93 , +0x9c95 , 0x9270 , 0x0 , 0x0 , +0x8da6 , 0x89b6 , 0x9c8d , 0x9c98 , +0x9c97 , 0x8bb1 , 0x0 , 0x91a7 , +0x8a86 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8c62 , 0x0 , 0x9c8e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9c9a , 0x0 , 0x9c9d , +0x9c9f , 0x0 , 0x0 , 0x0 , +0x0 , 0x8ebb , 0x0 , 0x9ca5 , +0x92ee , 0x9c9b , 0x0 , 0x0 , +0x0 , 0x0 , 0x9ca3 , 0x0 , +0x89f7 , 0x0 , 0x9ca1 , 0x9ca2 , +0x0 , 0x0 , 0x9c9e , 0x9ca0 , +0x0 , 0x0 , 0x0 , 0x8ce5 , +0x9749 , 0x0 , 0x0 , 0x8ab3 , +0x0 , 0x0 , 0x8978 , 0x9ca4 , +0x0 , 0x9459 , 0x88ab , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x94df , 0x9c7b , +0x9caa , 0x9cae , 0x96e3 , 0x0 , +0x9ca7 , 0x0 , 0x0 , 0x0 , +0x9389 , 0x9cac , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8fee , 0x9cad , 0x93d5 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9866 , 0x0 , 0x9ca9 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9caf , 0x0 , 0x8d9b , 0x0 , +0x90c9 , 0x0 , 0x0 , 0x88d2 , +0x9ca8 , 0x9ca6 , 0x0 , 0x9179 , +0x0 , 0x0 , 0x0 , 0x9c9c , +0x8e53 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x91c4 , 0x9cbb , 0x0 , 0x917a , +0x9cb6 , 0x0 , 0x9cb3 , 0x9cb4 , +0x0 , 0x8ee4 , 0x9cb7 , 0x9cba , +0x0 , 0x0 , 0x0 , 0x0 , +0x9cb5 , 0x8f44 , 0x0 , 0x9cb8 , +0x0 , 0x0 , 0x9cb2 , 0x0 , +0x96fa , 0x96f9 , 0x0 , 0x0 , +0x0 , 0x9cbc , 0x9cbd , 0x88d3 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9cb1 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8bf0 , 0x88a4 , +0x0 , 0x0 , 0x0 , 0x8ab4 , +0x0 , 0x9cb9 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9cc1 , +0x9cc0 , 0x0 , 0x0 , 0x0 , +0x9cc5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9cc6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9cc4 , 0x9cc7 , 0x9cbf , 0x9cc3 , +0x0 , 0x0 , 0x9cc8 , 0x0 , +0x9cc9 , 0x0 , 0x0 , 0x9cbe , +0x8e9c , 0x0 , 0x9cc2 , 0x91d4 , +0x8d51 , 0x9cb0 , 0x9054 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9cd6 , +0x0 , 0x95e7 , 0x0 , 0x0 , +0x9ccc , 0x9ccd , 0x9cce , 0x0 , +0x0 , 0x9cd5 , 0x0 , 0x9cd4 , +0x0 , 0x0 , 0x969d , 0x8ab5 , +0x0 , 0x9cd2 , 0x0 , 0x8c64 , +0x8a53 , 0x0 , 0x0 , 0x9ccf , +0x0 , 0x0 , 0x97b6 , 0x9cd1 , +0x88d4 , 0x9cd3 , 0x0 , 0x9cca , +0x9cd0 , 0x9cd7 , 0x8c63 , 0x9ccb , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x977c , 0x0 , +0x0 , 0x0 , 0x974a , 0x0 , +0x0 , 0x0 , 0x0 , 0x9cda , +0x0 , 0x0 , 0x9cde , 0x0 , +0x0 , 0x0 , 0x919e , 0x0 , +0x97f7 , 0x9cdf , 0x0 , 0x0 , +0x9cdc , 0x0 , 0x9cd9 , 0x0 , +0x0 , 0x9cd8 , 0x9cdd , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x95ae , 0x0 , 0x0 , 0x93b2 , +0x0 , 0x8c65 , 0x0 , 0x9ce0 , +0x9cdb , 0x0 , 0x9ce1 , 0x0 , +0x0 , 0x0 , 0x8c9b , 0x0 , +0x0 , 0x0 , 0x89af , 0x0 , +0x0 , 0x0 , 0x9ce9 , 0x0 , +0x0 , 0x0 , 0x8ab6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9ce7 , +0x0 , 0x0 , 0x9ce8 , 0x8da7 , +0x9ce6 , 0x9ce4 , 0x9ce3 , 0x9cea , +0x9ce2 , 0x9cec , 0x0 , 0x0 , +0x89f9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9cee , +0x0 , 0x0 , 0x9ced , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x92a6 , 0x0 , +0x9cf1 , 0x0 , 0x9cef , 0x9ce5 , +0x8c9c , 0x0 , 0x9cf0 , 0x0 , +0x9cf4 , 0x9cf3 , 0x9cf5 , 0x9cf2 , +0x9cf6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9cf7 , 0x9cf8 , 0x95e8 , 0x0 , +0x9cfa , 0x9cf9 , 0x8f5e , 0x0 , +0x90ac , 0x89e4 , 0x89fa , 0x0 , +0x9cfb , 0x0 , 0x88bd , 0x0 , +0x0 , 0x0 , 0x90ca , 0x9cfc , +0x0 , 0xe6c1 , 0x9d40 , 0x8c81 , +0x0 , 0x9d41 , 0x0 , 0x0 , +0x0 , 0x0 , 0x90ed , 0x0 , +0x0 , 0x0 , 0x9d42 , 0x0 , +0x0 , 0x0 , 0x9d43 , 0x8b59 , +0x9d44 , 0x0 , 0x9d45 , 0x9d46 , +0x91d5 , 0x0 , 0x0 , 0x0 , +0x8ccb , 0x0 , 0x0 , 0x96df , +0x0 , 0x0 , 0x0 , 0x965b , +0x8f8a , 0x9d47 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x90ee , +0xe7bb , 0x94e0 , 0x0 , 0x8ee8 , +0x0 , 0x8dcb , 0x9d48 , 0x0 , +0x0 , 0x0 , 0x0 , 0x91c5 , +0x0 , 0x95a5 , 0x0 , 0x0 , +0x91ef , 0x0 , 0x0 , 0x9d4b , +0x0 , 0x0 , 0x9d49 , 0x0 , +0x9d4c , 0x0 , 0x0 , 0x9d4a , +0x0 , 0x0 , 0x0 , 0x0 , +0x9d4d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x95af , 0x0 , +0x0 , 0x88b5 , 0x0 , 0x0 , +0x0 , 0x0 , 0x957d , 0x0 , +0x0 , 0x94e1 , 0x0 , 0x0 , +0x9d4e , 0x0 , 0x9d51 , 0x8fb3 , +0x8b5a , 0x0 , 0x9d4f , 0x9d56 , +0x8fb4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9d50 , 0x9463 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x977d , 0x9d52 , 0x9d53 , +0x9d57 , 0x938a , 0x9d54 , 0x8d52 , +0x90dc , 0x0 , 0x0 , 0x9d65 , +0x94b2 , 0x0 , 0x91f0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x94e2 , +0x9dab , 0x0 , 0x0 , 0x0 , +0x0 , 0x95f8 , 0x0 , 0x0 , +0x0 , 0x92ef , 0x0 , 0x0 , +0x0 , 0x9695 , 0x0 , 0x9d5a , +0x899f , 0x928a , 0x0 , 0x0 , +0x0 , 0x0 , 0x9d63 , 0x0 , +0x0 , 0x9253 , 0x9d5d , 0x9d64 , +0x9d5f , 0x9d66 , 0x9d62 , 0x0 , +0x9d61 , 0x948f , 0x0 , 0x9d5b , +0x89fb , 0x9d59 , 0x8b91 , 0x91f1 , +0x9d55 , 0x0 , 0x0 , 0x9d58 , +0x8d53 , 0x90d9 , 0x0 , 0x8fb5 , +0x9d60 , 0x9471 , 0x0 , 0x0 , +0x8b92 , 0x8a67 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8a87 , 0x9040 , 0x9d68 , 0x9d6d , +0x0 , 0x9d69 , 0x0 , 0x8c9d , +0x0 , 0x9d6e , 0x8e41 , 0x8d89 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8f45 , 0x9d5c , +0x0 , 0x8e9d , 0x9d6b , 0x0 , +0x0 , 0x0 , 0x0 , 0x8e77 , +0x9d6c , 0x88c2 , 0x0 , 0x0 , +0x9d67 , 0x0 , 0x0 , 0x0 , +0x0 , 0x92a7 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8b93 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8bb2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9d6a , +0x88a5 , 0x0 , 0x0 , 0x8dc1 , +0x0 , 0x0 , 0x0 , 0x9055 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x92f0 , 0x0 , +0x0 , 0x94d2 , 0x9d70 , 0x917d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x91a8 , 0x0 , 0x0 , +0x8e4a , 0x9d71 , 0x0 , 0x9d73 , +0x9d6f , 0x0 , 0x0 , 0x0 , +0x0 , 0x95df , 0x0 , 0x92bb , +0x0 , 0x0 , 0x0 , 0x0 , +0x917b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x95f9 , +0x8ecc , 0x9d80 , 0x0 , 0x9d7e , +0x0 , 0x0 , 0x9098 , 0x0 , +0x0 , 0x0 , 0x8c9e , 0x0 , +0x0 , 0x0 , 0x9d78 , 0x8fb7 , +0x0 , 0x0 , 0x93e6 , 0x9450 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9d76 , 0x0 , 0x0 , 0x917c , +0x0 , 0x0 , 0x0 , 0x0 , +0x8ef6 , 0x9d7b , 0x0 , 0x0 , +0x8fb6 , 0x0 , 0x9d75 , 0x9d7a , +0x0 , 0x0 , 0x9472 , 0x0 , +0x0 , 0x0 , 0x9d74 , 0x0 , +0x8c40 , 0x0 , 0x0 , 0x8a7c , +0x0 , 0x0 , 0x0 , 0x9d7c , +0x97a9 , 0x8dcc , 0x9254 , 0x9d79 , +0x0 , 0x90da , 0x0 , 0x8d54 , +0x9084 , 0x8986 , 0x915b , 0x9d77 , +0x8b64 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8c66 , 0x0 , +0x92cd , 0x9d7d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x917e , +0x0 , 0x0 , 0x9d81 , 0x0 , +0x9d83 , 0x0 , 0x0 , 0x91b5 , +0x9d89 , 0x0 , 0x9d84 , 0x0 , +0x0 , 0x9d86 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9560 , +0x92f1 , 0x0 , 0x9d87 , 0x0 , +0x0 , 0x0 , 0x974b , 0x0 , +0x0 , 0x0 , 0x9767 , 0x8ab7 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x88ac , 0x0 , 0x9d85 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9d82 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8af6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8987 , 0x0 , 0x9d88 , 0x0 , +0x0 , 0x0 , 0x9768 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9d8c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x91b9 , 0x0 , 0x9d93 , +0x0 , 0x0 , 0x0 , 0x9d8d , +0x0 , 0x0 , 0x9d8a , 0x9d91 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9d72 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9d8e , 0x0 , +0x9d92 , 0x0 , 0x0 , 0x0 , +0x94c0 , 0x938b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9d8b , 0x0 , 0x9d8f , 0x0 , +0x0 , 0x0 , 0x8c67 , 0x0 , +0x0 , 0x0 , 0x8def , 0x0 , +0x0 , 0x0 , 0x90db , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9d97 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9345 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9d94 , +0x0 , 0x9680 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9d95 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9d96 , 0x0 , +0x96cc , 0x0 , 0x90a0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8c82 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9d9d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8e54 , 0x9d9a , +0x0 , 0x9d99 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9451 , 0x0 , +0x0 , 0x0 , 0x93b3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9350 , 0x9d9b , 0x0 , 0x0 , +0x0 , 0x9d9c , 0x0 , 0x958f , +0x0 , 0x9464 , 0x8e42 , 0x0 , +0x90ef , 0x0 , 0x966f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8a68 , 0x0 , 0x9da3 , +0x9d9e , 0x0 , 0x0 , 0x0 , +0x0 , 0x9769 , 0x9da5 , 0x0 , +0x0 , 0x9da1 , 0x0 , 0x9da2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9180 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9da0 , 0x0 , +0x9d5e , 0x0 , 0x0 , 0x0 , +0x9da4 , 0x0 , 0x9d9f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9da9 , 0x9daa , 0x9346 , 0x9dac , +0x0 , 0x0 , 0x8e43 , 0x9da7 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8b5b , 0x0 , 0x0 , 0x9dad , +0x0 , 0x9da6 , 0x9db1 , 0x0 , +0x9db0 , 0x0 , 0x9daf , 0x0 , +0x0 , 0x0 , 0x9db2 , 0x0 , +0x0 , 0x9db4 , 0x8fef , 0x0 , +0x9db3 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9db7 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9db5 , 0x0 , 0x0 , 0x0 , +0x9db6 , 0x9d90 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9db9 , +0x9db8 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9d98 , 0x9dba , +0x9dae , 0x0 , 0x0 , 0x8e78 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9dbb , 0x9dbc , 0x9dbe , 0x9dbd , +0x9dbf , 0x89fc , 0x0 , 0x8d55 , +0x0 , 0x0 , 0x95fa , 0x90ad , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8ccc , 0x0 , 0x0 , +0x9dc1 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9dc4 , 0x0 , 0x9571 , +0x0 , 0x8b7e , 0x0 , 0x0 , +0x0 , 0x9dc3 , 0x9dc2 , 0x9473 , +0x9dc5 , 0x8bb3 , 0x0 , 0x0 , +0x0 , 0x9dc7 , 0x9dc6 , 0x0 , +0x0 , 0x0 , 0x8ab8 , 0x8e55 , +0x0 , 0x0 , 0x93d6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8c68 , 0x0 , 0x0 , 0x0 , +0x9094 , 0x0 , 0x9dc8 , 0x0 , +0x90ae , 0x9347 , 0x0 , 0x957e , +0x9dc9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9dca , 0x9dcb , +0x0 , 0x0 , 0x0 , 0x95b6 , +0x9b7c , 0x90c4 , 0x0 , 0x0 , +0x956b , 0x0 , 0x8dd6 , 0x0 , +0x94e3 , 0x94c1 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x936c , +0x0 , 0x97bf , 0x0 , 0x9dcd , +0x8ece , 0x0 , 0x0 , 0x9dce , +0x0 , 0x88b4 , 0x0 , 0x0 , +0x8bd2 , 0x90cb , 0x0 , 0x9580 , +0x0 , 0x0 , 0x0 , 0x9dcf , +0x8e61 , 0x9266 , 0x0 , 0x8e7a , +0x9056 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9dd0 , +0x0 , 0x95fb , 0x0 , 0x0 , +0x8997 , 0x8e7b , 0x0 , 0x0 , +0x0 , 0x9dd3 , 0x0 , 0x9dd1 , +0x9dd4 , 0x97b7 , 0x9dd2 , 0x0 , +0x0 , 0x0 , 0x0 , 0x90f9 , +0x9dd5 , 0x0 , 0x0 , 0x91b0 , +0x0 , 0x0 , 0x9dd6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8af8 , +0x0 , 0x9dd8 , 0x0 , 0x9dd7 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9dd9 , 0x9dda , 0x8af9 , 0x0 , +0x0 , 0x93fa , 0x9255 , 0x8b8c , +0x8e7c , 0x9181 , 0x0 , 0x0 , +0x8f7b , 0x88ae , 0x0 , 0x0 , +0x0 , 0x9ddb , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x89a0 , 0x9ddf , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8d56 , 0x9dde , +0x0 , 0x0 , 0x8da9 , 0x8fb8 , +0x0 , 0x0 , 0x9ddd , 0x0 , +0x8fb9 , 0x0 , 0x96be , 0x8da8 , +0x0 , 0x0 , 0x0 , 0x88d5 , +0x90cc , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9de4 , 0x0 , 0x0 , 0x90af , +0x8966 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8f74 , 0x0 , 0x9686 , +0x8df0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8fba , 0x0 , 0x90a5 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9de3 , 0x9de1 , 0x9de2 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x928b , 0x0 , 0x0 , 0x9e45 , +0x0 , 0x9de8 , 0x8e9e , 0x8d57 , +0x9de6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9de7 , 0x0 , 0x9057 , +0x0 , 0x0 , 0x0 , 0x9de5 , +0x0 , 0x0 , 0x8e4e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9dea , 0x9de9 , 0x9dee , +0x0 , 0x0 , 0x9def , 0x0 , +0x9deb , 0x0 , 0x8a41 , 0x9dec , +0x9ded , 0x94d3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9581 , 0x8c69 , +0x9df0 , 0x0 , 0x0 , 0x0 , +0x90b0 , 0x0 , 0x8fbb , 0x0 , +0x0 , 0x0 , 0x9271 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8bc5 , 0x0 , 0x9df1 , +0x9df5 , 0x0 , 0x0 , 0x89c9 , +0x9df2 , 0x9df4 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9df3 , 0x0 , +0x0 , 0x8f8b , 0x0 , 0x0 , +0x0 , 0x0 , 0x9267 , 0x88c3 , +0x9df6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9df7 , 0x0 , 0x0 , +0x0 , 0x0 , 0x92a8 , 0x0 , +0x0 , 0x0 , 0x97ef , 0x0 , +0x0 , 0x0 , 0x0 , 0x8e62 , +0x0 , 0x0 , 0x95e9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x965c , 0x0 , 0x0 , 0x0 , +0x9e41 , 0x9df9 , 0x0 , 0x0 , +0x9dfc , 0x0 , 0x9dfb , 0x0 , +0x0 , 0x9df8 , 0x0 , 0x0 , +0x9e40 , 0x0 , 0x0 , 0x93dc , +0x0 , 0x9dfa , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9e42 , 0x0 , +0x0 , 0x8f8c , 0x9e43 , 0x0 , +0x976a , 0x9498 , 0x0 , 0x0 , +0x9e44 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9e46 , 0x0 , +0x0 , 0x9e47 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9e48 , 0x0 , 0x8bc8 , 0x8967 , +0x8d58 , 0x9e49 , 0x0 , 0x9e4a , +0x8f91 , 0x9182 , 0x0 , 0x0 , +0x99d6 , 0x915d , 0x915c , 0x91d6 , +0x8dc5 , 0x0 , 0x0 , 0x98f0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8c8e , 0x974c , 0x0 , 0x95fc , +0x0 , 0x959e , 0x0 , 0x9e4b , +0x0 , 0x0 , 0x0 , 0x0 , +0x8df1 , 0x92bd , 0x9e4c , 0x984e , +0x0 , 0x0 , 0x0 , 0x965d , +0x0 , 0x92a9 , 0x9e4d , 0x8afa , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9e4e , 0x9e4f , +0x96d8 , 0x0 , 0x96a2 , 0x9696 , +0x967b , 0x8e44 , 0x9e51 , 0x0 , +0x0 , 0x8ee9 , 0x0 , 0x0 , +0x9670 , 0x0 , 0x9e53 , 0x9e56 , +0x9e55 , 0x0 , 0x8af7 , 0x0 , +0x0 , 0x8b80 , 0x0 , 0x9e52 , +0x0 , 0x9e54 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9e57 , 0x0 , +0x0 , 0x9099 , 0x0 , 0x0 , +0x0 , 0x0 , 0x979b , 0x88c7 , +0x8dde , 0x91ba , 0x0 , 0x8edb , +0x0 , 0x0 , 0x8ff1 , 0x0 , +0x0 , 0x9e5a , 0x0 , 0x0 , +0x936d , 0x0 , 0x9e58 , 0x91a9 , +0x9e59 , 0x8ff0 , 0x96db , 0x9e5b , +0x9e5c , 0x9788 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9e61 , 0x0 , +0x0 , 0x8d59 , 0x0 , 0x9474 , +0x9e5e , 0x938c , 0x9ddc , 0x9de0 , +0x0 , 0x8b6e , 0x0 , 0x9466 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9e60 , 0x0 , 0x8fbc , 0x94c2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9e66 , 0x0 , 0x94f8 , +0x0 , 0x9e5d , 0x0 , 0x9e63 , +0x9e62 , 0x0 , 0x0 , 0x0 , +0x90cd , 0x0 , 0x0 , 0x0 , +0x0 , 0x968d , 0x0 , 0x97d1 , +0x0 , 0x0 , 0x9687 , 0x0 , +0x89ca , 0x8e7d , 0x0 , 0x0 , +0x9867 , 0x9e65 , 0x9095 , 0x0 , +0x0 , 0x0 , 0x9e64 , 0x0 , +0x0 , 0x9e5f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8ccd , +0x0 , 0x0 , 0x0 , 0x9e6b , +0x9e69 , 0x0 , 0x89cb , 0x9e67 , +0x9e6d , 0x9e73 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x91c6 , 0x0 , 0x0 , +0x95bf , 0x0 , 0x9e75 , 0x0 , +0x0 , 0x0 , 0x9541 , 0x0 , +0x0 , 0x0 , 0x9e74 , 0x9490 , +0x965e , 0x8ab9 , 0x0 , 0x90f5 , +0x8f5f , 0x0 , 0x0 , 0x0 , +0x92d1 , 0x0 , 0x974d , 0x0 , +0x0 , 0x9e70 , 0x9e6f , 0x0 , +0x0 , 0x0 , 0x9e71 , 0x0 , +0x9e6e , 0x0 , 0x0 , 0x9e76 , +0x0 , 0x9e6c , 0x0 , 0x0 , +0x9e6a , 0x0 , 0x9e72 , 0x9e68 , +0x0 , 0x928c , 0x0 , 0x96f6 , +0x8ec4 , 0x8df2 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8db8 , +0x0 , 0x0 , 0x968f , 0x8a60 , +0x0 , 0x0 , 0x92cc , 0x93c8 , +0x8968 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x90f0 , +0x0 , 0x0 , 0x90b2 , 0x8c49 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9e78 , 0x0 , +0x0 , 0x8d5a , 0x8a9c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9e7a , 0x8a94 , 0x9e81 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9e7d , 0x0 , +0x90f1 , 0x0 , 0x0 , 0x0 , +0x8a6a , 0x8daa , 0x0 , 0x0 , +0x8a69 , 0x8dcd , 0x0 , 0x0 , +0x9e7b , 0x8c85 , 0x8c6a , 0x938d , +0x0 , 0x0 , 0x9e79 , 0x0 , +0x88c4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9e7c , 0x9e7e , 0x0 , +0x8bcb , 0x8c4b , 0x0 , 0x8aba , +0x8b6a , 0x0 , 0x0 , 0x0 , +0x0 , 0x9e82 , 0x0 , 0x0 , +0x8df7 , 0x9691 , 0x0 , 0x8e56 , +0x0 , 0x0 , 0x0 , 0x9e83 , +0x0 , 0x0 , 0x0 , 0x954f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9e8f , 0x0 , 0x89b1 , 0x9e84 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9e95 , 0x9e85 , +0x0 , 0x97c0 , 0x0 , 0x9e8c , +0x0 , 0x947e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9e94 , 0x0 , 0x9e87 , +0x0 , 0x0 , 0x0 , 0x88b2 , +0x9e89 , 0x0 , 0x0 , 0x8d5b , +0x0 , 0x0 , 0x0 , 0x9e8b , +0x0 , 0x9e8a , 0x0 , 0x9e86 , +0x9e91 , 0x0 , 0x8fbd , 0x0 , +0x0 , 0x0 , 0x9aeb , 0x8ce6 , +0x979c , 0x0 , 0x0 , 0x0 , +0x0 , 0x9e88 , 0x0 , 0x92f2 , +0x8a42 , 0x8dab , 0x0 , 0x9e80 , +0x0 , 0x9e90 , 0x8a81 , 0x0 , +0x0 , 0x9e8e , 0x9e92 , 0x0 , +0x938e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8afc , 0x0 , 0x9eb0 , 0x0 , +0x0 , 0x96c7 , 0x9e97 , 0x8afb , +0x0 , 0x9e9e , 0x0 , 0x0 , +0x0 , 0x0 , 0x965f , 0x0 , +0x9e9f , 0x9ea1 , 0x0 , 0x9ea5 , +0x9e99 , 0x0 , 0x9249 , 0x0 , +0x0 , 0x0 , 0x0 , 0x938f , +0x9ea9 , 0x9e9c , 0x0 , 0x9ea6 , +0x0 , 0x0 , 0x0 , 0x9ea0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9058 , 0x9eaa , +0x0 , 0x0 , 0x90b1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9ea8 , 0x8abb , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x986f , 0x9e96 , 0x0 , 0x0 , +0x9ea4 , 0x88d6 , 0x0 , 0x0 , +0x9e98 , 0x0 , 0x0 , 0x96b8 , +0x9e9d , 0x9041 , 0x92c5 , 0x9e93 , +0x0 , 0x0 , 0x9ea3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x909a , 0x9ead , 0x8a91 , +0x8c9f , 0x0 , 0x0 , 0x0 , +0x0 , 0x9eaf , 0x9e9a , 0x9eae , +0x0 , 0x9ea7 , 0x9e9b , 0x0 , +0x9eab , 0x0 , 0x9eac , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9ebd , 0x0 , 0x0 , 0x0 , +0x93cc , 0x0 , 0x9ea2 , 0x0 , +0x0 , 0x9eb9 , 0x0 , 0x0 , +0x0 , 0x9ebb , 0x0 , 0x92d6 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x976b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9596 , +0x9eb6 , 0x91c8 , 0x0 , 0x0 , +0x0 , 0x9ebc , 0x915e , 0x0 , +0x9eb3 , 0x9ec0 , 0x9ebf , 0x0 , +0x93ed , 0x9ebe , 0x93e8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9ec2 , 0x9eb5 , +0x0 , 0x8bc6 , 0x9eb8 , 0x8f7c , +0x0 , 0x0 , 0x0 , 0x9480 , +0x9eba , 0x8bc9 , 0x0 , 0x9eb2 , +0x9eb4 , 0x9eb1 , 0x0 , 0x0 , +0x984f , 0x8a79 , 0x9eb7 , 0x0 , +0x0 , 0x9ec1 , 0x8a54 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8de5 , 0x0 , +0x0 , 0x0 , 0x897c , 0x0 , +0x0 , 0x9ed2 , 0x0 , 0x0 , +0x9850 , 0x9ed5 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9059 , +0x9ed4 , 0x0 , 0x0 , 0x0 , +0x9ed3 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9ed0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9ec4 , 0x0 , +0x0 , 0x9ee1 , 0x9ec3 , 0x0 , +0x9ed6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9ece , +0x0 , 0x0 , 0x9ec9 , 0x9ec6 , +0x0 , 0x9ec7 , 0x0 , 0x9ecf , +0x0 , 0x0 , 0x0 , 0xeaa0 , +0x0 , 0x0 , 0x9ecc , 0x8d5c , +0x92c6 , 0x9184 , 0x9eca , 0x0 , +0x9ec5 , 0x0 , 0x0 , 0x9ec8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x976c , 0x968a , 0x0 , 0x0 , +0x0 , 0x9ecd , 0x9ed7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9edf , +0x9ed8 , 0x0 , 0x0 , 0x9ee5 , +0x0 , 0x9ee3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9ede , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9edd , 0x0 , 0x92ce , +0x0 , 0x9185 , 0x0 , 0x9edb , +0x0 , 0x0 , 0x9ed9 , 0x0 , +0x0 , 0x9ee0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9ee6 , 0x94f3 , +0x9eec , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9ee7 , 0x9eea , +0x9ee4 , 0x0 , 0x0 , 0x9294 , +0x0 , 0x9557 , 0x0 , 0x9eda , +0x0 , 0x0 , 0x9ee2 , 0x8fbe , +0x0 , 0x96cd , 0x9ef6 , 0x9ee9 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8ca0 , 0x89a1 , 0x8a7e , +0x0 , 0x0 , 0x9ed1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8fbf , 0x9eee , 0x0 , +0x9ef5 , 0x8ef7 , 0x8a92 , 0x0 , +0x0 , 0x924d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9eeb , 0x0 , 0x0 , 0x9ef0 , +0x9ef4 , 0x0 , 0x0 , 0x8bb4 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8b6b , 0x9ef2 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8b40 , +0x0 , 0x93c9 , 0x9ef1 , 0x0 , +0x0 , 0x0 , 0x9ef3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9eed , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9eef , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8a80 , +0x9268 , 0x0 , 0x0 , 0x0 , +0x9efa , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9ef8 , 0x8ce7 , 0x0 , +0x9ef7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9f40 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9e77 , 0x0 , 0x0 , 0x0 , +0x9ef9 , 0x0 , 0x9efb , 0x9efc , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9f4b , 0x0 , +0x9f47 , 0x0 , 0x9e8d , 0x0 , +0x0 , 0x0 , 0x0 , 0x9f46 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9f45 , 0x0 , 0x0 , 0x9f42 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9ee8 , 0x9f44 , 0x9f43 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9f49 , 0x0 , 0x9845 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9f4c , 0x8bf9 , +0x0 , 0x0 , 0x9f48 , 0x9f4a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x94a5 , 0x0 , 0x9f4d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9f51 , 0x9f4e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9793 , 0x9f4f , 0x0 , 0x0 , +0x0 , 0x0 , 0x9edc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9f52 , 0x0 , +0x0 , 0x0 , 0x9f53 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8954 , 0x0 , 0x9f55 , +0x8c87 , 0x8e9f , 0x0 , 0x8bd3 , +0x0 , 0x0 , 0x0 , 0x89a2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x977e , 0x0 , +0x0 , 0x0 , 0x0 , 0x9f57 , +0x9f56 , 0x9f59 , 0x8b5c , 0x0 , +0x0 , 0x8bd4 , 0x8abc , 0x0 , +0x0 , 0x0 , 0x0 , 0x9f5c , +0x0 , 0x0 , 0x0 , 0x9f5b , +0x0 , 0x9f5d , 0x0 , 0x0 , +0x89cc , 0x0 , 0x9256 , 0x0 , +0x9f5e , 0x0 , 0x0 , 0x8abd , +0x9f60 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9f5f , 0x0 , 0x9f61 , +0x0 , 0x0 , 0x0 , 0x9f62 , +0x0 , 0x9f63 , 0x8e7e , 0x90b3 , +0x8d9f , 0x0 , 0x9590 , 0x0 , +0x0 , 0x95e0 , 0x9863 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8e95 , +0x0 , 0x0 , 0x0 , 0x8dce , +0x97f0 , 0x0 , 0x0 , 0x0 , +0x9f64 , 0x9f65 , 0x0 , 0x8e80 , +0x0 , 0x0 , 0x0 , 0x9f66 , +0x9f67 , 0x0 , 0x0 , 0x9f69 , +0x9f68 , 0x0 , 0x9677 , 0x0 , +0x0 , 0x8f7d , 0x8eea , 0x8e63 , +0x0 , 0x9f6a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9f6c , 0x9042 , 0x0 , +0x9f6b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9f6d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9f6e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9f6f , 0x9f70 , +0x0 , 0x0 , 0x0 , 0x9f71 , +0x0 , 0x9f73 , 0x9f72 , 0x9f74 , +0x89a3 , 0x9269 , 0x0 , 0x9f75 , +0x0 , 0x0 , 0x8e45 , 0x8a6b , +0x9f76 , 0x0 , 0x0 , 0x9361 , +0x9aca , 0x0 , 0x0 , 0x0 , +0x0 , 0x8b42 , 0x9f77 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9f78 , +0x0 , 0x95ea , 0x9688 , 0x0 , +0x0 , 0x0 , 0x93c5 , 0x9f79 , +0x94e4 , 0x0 , 0x0 , 0x0 , +0x94f9 , 0x0 , 0x0 , 0x96d1 , +0x0 , 0x0 , 0x0 , 0x9f7a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9f7c , +0x9f7b , 0x0 , 0x0 , 0x9f7e , +0x0 , 0x0 , 0x0 , 0x9f7d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9f81 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8e81 , +0x0 , 0x96af , 0x0 , 0x9f82 , +0x9f83 , 0x0 , 0x0 , 0x8b43 , +0x0 , 0x0 , 0x0 , 0x9f84 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9f86 , +0x9f85 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9085 , 0x0 , 0x0 , 0x9558 , +0x8969 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x94c3 , 0x0 , +0x92f3 , 0x8f60 , 0x8b81 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x94c4 , 0x0 , +0x8eac , 0x0 , 0x0 , 0x0 , +0x0 , 0x9f88 , 0x0 , 0x8abe , +0x0 , 0x0 , 0x8998 , 0x0 , +0x0 , 0x93f0 , 0x9f87 , 0x8d5d , +0x9272 , 0x0 , 0x9f89 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9f91 , 0x0 , 0x9f8a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x91bf , 0x0 , 0x8b82 , 0x9f92 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8c88 , 0x0 , +0x0 , 0x8b44 , 0x9f90 , 0x0 , +0x0 , 0x9f8e , 0x9f8b , 0x9780 , +0x0 , 0x0 , 0x0 , 0x0 , +0x92be , 0x0 , 0x0 , 0x0 , +0x93d7 , 0x9f8c , 0x0 , 0x0 , +0x9f94 , 0x0 , 0x9f93 , 0x8c42 , +0x0 , 0x0 , 0x89ab , 0x0 , +0x0 , 0x8db9 , 0x9f8d , 0x9f8f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9676 , 0x91f2 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9697 , +0x0 , 0x0 , 0x9f9c , 0x0 , +0x0 , 0x9f9d , 0x0 , 0x89cd , +0x0 , 0x0 , 0x0 , 0x0 , +0x95a6 , 0x96fb , 0x9f9f , 0x8ea1 , +0x8fc0 , 0x9f98 , 0x9f9e , 0x8988 , +0x0 , 0x8bb5 , 0x0 , 0x0 , +0x9f95 , 0x9f9a , 0x0 , 0x0 , +0x0 , 0x90f2 , 0x9491 , 0x0 , +0x94e5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9f97 , +0x0 , 0x9640 , 0x0 , 0x9f99 , +0x0 , 0x9fa2 , 0x0 , 0x9fa0 , +0x0 , 0x9f9b , 0x0 , 0x0 , +0x0 , 0x9641 , 0x9467 , 0x8b83 , +0x0 , 0x9344 , 0x0 , 0x0 , +0x928d , 0x0 , 0x9fa3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9fa1 , +0x91d7 , 0x9f96 , 0x0 , 0x896a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x976d , +0x9fae , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9fad , 0x0 , +0x0 , 0x0 , 0x0 , 0x90f4 , +0x0 , 0x9faa , 0x0 , 0x978c , +0x0 , 0x0 , 0x93b4 , 0x9fa4 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x92c3 , 0x0 , 0x0 , +0x0 , 0x896b , 0x8d5e , 0x9fa7 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8f46 , 0x9fac , +0x0 , 0x9fab , 0x9fa6 , 0x0 , +0x9fa9 , 0x0 , 0x0 , 0x8a88 , +0x0 , 0x9fa8 , 0x9468 , 0x0 , +0x0 , 0x97ac , 0x0 , 0x0 , +0x8ff2 , 0x90f3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9fb4 , 0x9fb2 , 0x0 , +0x956c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9faf , +0x9fb1 , 0x0 , 0x8959 , 0x0 , +0x0 , 0x8d5f , 0x9851 , 0x0 , +0x8a5c , 0x0 , 0x9582 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9781 , 0x0 , 0x0 , 0x8a43 , +0x905a , 0x9fb3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9fb8 , 0x0 , 0x0 , +0x8fc1 , 0x0 , 0x0 , 0x0 , +0x974f , 0x0 , 0x9fb5 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9fb0 , +0x0 , 0x9fb6 , 0x0 , 0x0 , +0x0 , 0x97dc , 0x0 , 0x9393 , +0x93c0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8a55 , +0x0 , 0x0 , 0x8974 , 0x0 , +0x0 , 0x9fbc , 0x0 , 0x0 , +0x9fbf , 0x0 , 0x0 , 0x0 , +0x97c1 , 0x0 , 0x0 , 0x0 , +0x9784 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9fc6 , 0x9fc0 , 0x9fbd , +0x0 , 0x0 , 0x0 , 0x97d2 , +0x9fc3 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8f69 , 0x9fc5 , 0x0 , +0x0 , 0x9fca , 0x0 , 0x0 , +0x9391 , 0x9fc8 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9fc2 , 0x0 , +0x0 , 0x9257 , 0x0 , 0x0 , +0x9fc9 , 0x0 , 0x9fbe , 0x0 , +0x9fc4 , 0x0 , 0x9fcb , 0x88fa , +0x9fc1 , 0x0 , 0x9fcc , 0x0 , +0x0 , 0x905b , 0x0 , 0x8f7e , +0x0 , 0x95a3 , 0x0 , 0x8dac , +0x0 , 0x9fb9 , 0x9fc7 , 0x9359 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x90b4 , 0x0 , 0x8a89 , +0x8dcf , 0x8fc2 , 0x9fbb , 0x8f61 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8c6b , +0x0 , 0x9fba , 0x0 , 0x0 , +0x0 , 0x9fd0 , 0x8f8d , 0x8cb8 , +0x0 , 0x9fdf , 0x0 , 0x9fd9 , +0x8b94 , 0x936e , 0x0 , 0x9fd4 , +0x9fdd , 0x88ad , 0x8951 , 0x0 , +0x0 , 0x89b7 , 0x0 , 0x9fd6 , +0x91aa , 0x9fcd , 0x9fcf , 0x8d60 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9fe0 , 0x0 , 0x9fdb , 0x0 , +0x0 , 0x0 , 0x9fd3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9fda , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x96a9 , 0x0 , +0x0 , 0x9fd8 , 0x9fdc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8cce , 0x0 , +0x8fc3 , 0x0 , 0x0 , 0x9258 , +0x0 , 0x0 , 0x0 , 0x9fd2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x974e , +0x0 , 0x0 , 0x0 , 0x9fd5 , +0x0 , 0x0 , 0x9fce , 0x9392 , +0x0 , 0x0 , 0x9fd1 , 0x0 , +0x0 , 0x0 , 0x9fd7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9870 , 0x8ebc , +0x969e , 0x0 , 0x9fe1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x94ac , 0x0 , 0x0 , 0x9fed , +0x8cb9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8f80 , 0x0 , +0x9fe3 , 0x0 , 0x0 , 0x0 , +0x97ad , 0x8d61 , 0x0 , 0x9ff0 , +0x0 , 0x0 , 0x88ec , 0x0 , +0x0 , 0x9fee , 0x0 , 0x0 , +0x0 , 0x0 , 0x9fe2 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9fe8 , +0x0 , 0x0 , 0x9fea , 0x0 , +0x0 , 0x0 , 0x976e , 0x9fe5 , +0x0 , 0x0 , 0x934d , 0x0 , +0x0 , 0x9fe7 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9fef , 0x0 , +0x9fe9 , 0x96c5 , 0x0 , 0x0 , +0x0 , 0x9fe4 , 0x0 , 0x8ea0 , +0x9ffc , 0x0 , 0x0 , 0x0 , +0x0 , 0x8a8a , 0x0 , 0x9fe6 , +0x9feb , 0x9fec , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x91ea , 0x91d8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9ff4 , 0x0 , 0x0 , 0x9ffa , +0x0 , 0x0 , 0x9ff8 , 0x0 , +0x9348 , 0x0 , 0x0 , 0xe042 , +0x9ff5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9ff6 , 0x9fde , +0x0 , 0x8b99 , 0x9559 , 0x0 , +0x0 , 0x0 , 0x8ebd , 0x0 , +0x0 , 0x8d97 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9852 , +0x0 , 0x9ff2 , 0x0 , 0xe041 , +0x8989 , 0x9186 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9499 , 0x0 , 0x8abf , 0x97f8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x969f , +0x92d0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9ff9 , 0x9ffb , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9151 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe040 , 0x9ff7 , +0x0 , 0x9ff1 , 0x0 , 0x0 , +0x0 , 0x8ac1 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8c89 , 0x0 , 0x0 , 0x0 , +0xe04e , 0x0 , 0x0 , 0xe049 , +0x90f6 , 0x0 , 0x0 , 0x8a83 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8f81 , 0x0 , 0xe052 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe04b , 0x92aa , 0xe048 , +0x92d7 , 0x0 , 0x0 , 0x0 , +0xe06b , 0x0 , 0x0 , 0x0 , +0xe045 , 0x0 , 0xe044 , 0x0 , +0xe04d , 0x0 , 0x0 , 0x0 , +0xe047 , 0xe046 , 0xe04c , 0x0 , +0x909f , 0x0 , 0xe043 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe04f , 0x0 , +0x0 , 0xe050 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8ac0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe055 , 0x0 , 0xe054 , +0xe056 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe059 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9362 , 0x0 , 0xe053 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe057 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8c83 , 0x91f7 , 0xe051 , 0x945a , +0x0 , 0x0 , 0xe058 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe05d , 0xe05b , 0x0 , 0x0 , +0xe05e , 0x0 , 0x0 , 0xe061 , +0x0 , 0x0 , 0x0 , 0xe05a , +0x8d8a , 0x9447 , 0x0 , 0x0 , +0x9fb7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9794 , +0xe05c , 0x0 , 0xe060 , 0x91f3 , +0x0 , 0xe05f , 0x0 , 0xe04a , +0x0 , 0x0 , 0xe889 , 0x0 , +0x0 , 0x0 , 0xe064 , 0x0 , +0x0 , 0x0 , 0xe068 , 0x0 , +0x0 , 0xe066 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe062 , 0x0 , 0xe063 , +0x0 , 0x0 , 0x0 , 0xe067 , +0x0 , 0xe065 , 0x0 , 0x0 , +0x0 , 0x956d , 0x0 , 0x0 , +0xe06d , 0x0 , 0xe06a , 0xe069 , +0x0 , 0xe06c , 0x93d2 , 0xe06e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9295 , 0x91eb , +0x0 , 0x0 , 0x0 , 0x0 , +0x90a3 , 0x0 , 0x0 , 0x0 , +0xe06f , 0x0 , 0xe071 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe070 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9ff3 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe072 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x93e5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe073 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x89ce , +0x0 , 0x0 , 0x0 , 0x9394 , +0x8a44 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8b84 , 0x0 , 0x0 , 0x0 , +0x8edc , 0x8dd0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9846 , 0x9086 , 0x0 , +0x0 , 0x0 , 0x898a , 0x0 , +0x0 , 0x0 , 0xe075 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe074 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe078 , 0x9259 , 0xe07b , 0xe076 , +0x0 , 0x0 , 0x0 , 0xe07a , +0x0 , 0x0 , 0x0 , 0x0 , +0xe079 , 0x935f , 0x88d7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x97f3 , 0x0 , 0x0 , 0xe07d , +0x0 , 0x0 , 0x0 , 0x8947 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe080 , 0x0 , 0x0 , +0x0 , 0xe07e , 0x0 , 0xe07c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe077 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9642 , 0x0 , 0x0 , +0x0 , 0xe082 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe081 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x898b , 0x0 , 0x0 , 0x0 , +0x0 , 0xe084 , 0x95b0 , 0x0 , +0xe083 , 0x0 , 0x0 , 0x0 , +0x0 , 0x96b3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8fc5 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9152 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8fc4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x97f9 , 0x0 , 0x0 , +0xe08a , 0x0 , 0x90f7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe086 , 0xe08b , 0x0 , +0x0 , 0x898c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe089 , 0x0 , +0x9481 , 0xe085 , 0xe088 , 0x8fc6 , +0x0 , 0x94cf , 0x0 , 0x0 , +0xe08c , 0x0 , 0x8ecf , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x90f8 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe08f , 0x0 , 0x0 , 0x0 , +0xe087 , 0x0 , 0x8c46 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe08d , +0x0 , 0x0 , 0x0 , 0x0 , +0x976f , 0xe090 , 0x0 , 0x0 , +0x0 , 0xeaa4 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8f6e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe091 , 0x0 , 0x0 , 0x0 , +0xe092 , 0x0 , 0x0 , 0x0 , +0x0 , 0x944d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe094 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe095 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9452 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9395 , 0xe097 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe099 , 0x0 , +0x97d3 , 0x0 , 0xe096 , 0x0 , +0xe098 , 0x898d , 0x0 , 0xe093 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9a7a , +0xe09a , 0x0 , 0x0 , 0x0 , +0x0 , 0x9187 , 0x8e57 , 0xe09c , +0x0 , 0x0 , 0x0 , 0x0 , +0xe09b , 0x9043 , 0x99d7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe09d , 0x0 , 0x0 , +0x0 , 0xe09f , 0x0 , 0xe08e , +0xe09e , 0x0 , 0x0 , 0xe0a0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x949a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe0a1 , 0x0 , 0x0 , +0xe0a2 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0a3 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe0a4 , 0x0 , 0x92dc , 0x0 , +0xe0a6 , 0xe0a5 , 0x0 , 0x0 , +0xe0a7 , 0x0 , 0xe0a8 , 0x0 , +0x0 , 0x8edd , 0x9583 , 0x0 , +0x0 , 0x0 , 0x96ea , 0xe0a9 , +0xe0aa , 0x9175 , 0x8ea2 , 0xe0ab , +0xe0ac , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0ad , 0x95d0 , +0x94c5 , 0x0 , 0x0 , 0xe0ae , +0x9476 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x92ab , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe0af , 0x89e5 , 0x0 , 0x8b8d , +0x0 , 0x96c4 , 0x0 , 0x96b4 , +0x0 , 0x89b2 , 0x9853 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9671 , +0x0 , 0x95a8 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x90b5 , 0x0 , +0xe0b0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x93c1 , 0x0 , 0x0 , +0x0 , 0x8ca1 , 0xe0b1 , 0x0 , +0x8dd2 , 0xe0b3 , 0xe0b2 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0b4 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0b5 , 0x0 , +0x0 , 0x0 , 0xe0b6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8b5d , 0x0 , 0xe0b7 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0b8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8ca2 , 0x0 , 0x0 , 0x94c6 , +0x0 , 0x0 , 0xe0ba , 0x0 , +0x0 , 0x0 , 0x8ff3 , 0x0 , +0x0 , 0xe0b9 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8bb6 , 0xe0bb , +0xe0bd , 0x0 , 0xe0bc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0be , 0x0 , +0x8ccf , 0x0 , 0xe0bf , 0x0 , +0x0 , 0x0 , 0x0 , 0x8be7 , +0x0 , 0x915f , 0x0 , 0x8d9d , +0x0 , 0x0 , 0x0 , 0x0 , +0xe0c1 , 0xe0c2 , 0xe0c0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8eeb , 0x0 , 0x0 , +0x93c6 , 0x8bb7 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0c4 , +0x924b , 0xe0c3 , 0x0 , 0x0 , +0x9854 , 0x9482 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0c7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0c9 , 0xe0c6 , +0x0 , 0x0 , 0x0 , 0x96d2 , +0xe0c8 , 0xe0ca , 0x0 , 0x97c2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe0ce , 0x0 , 0x0 , +0x0 , 0xe0cd , 0x9296 , 0x944c , +0x0 , 0x0 , 0x8ca3 , 0xe0cc , +0x0 , 0x0 , 0x0 , 0x0 , +0xe0cb , 0x0 , 0x9750 , 0x9751 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0cf , 0x898e , +0x0 , 0x0 , 0x0 , 0x0 , +0x8d96 , 0x8e82 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0d0 , 0xe0d1 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0d3 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8f62 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe0d5 , 0x0 , 0xe0d4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe0d6 , 0x0 , 0x8a6c , 0x0 , +0x0 , 0xe0d8 , 0x0 , 0x0 , +0xe0d7 , 0x0 , 0xe0da , 0xe0d9 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8cba , 0x0 , 0x0 , 0x97a6 , +0x0 , 0x8bca , 0x0 , 0x89a4 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8be8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8adf , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x97e6 , 0xe0dc , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0de , +0x0 , 0x0 , 0x0 , 0x0 , +0xe0df , 0x0 , 0x89cf , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe0db , 0x0 , 0x8e58 , 0x0 , +0x0 , 0x92bf , 0xe0dd , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0e2 , 0x0 , +0x8eec , 0x0 , 0x0 , 0x0 , +0x0 , 0xe0e0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8c5d , 0x0 , +0x0 , 0x94c7 , 0xe0e1 , 0x0 , +0x0 , 0xe0fc , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe0e7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8cbb , 0x0 , +0x0 , 0x0 , 0x0 , 0x8b85 , +0x0 , 0xe0e4 , 0x979d , 0x0 , +0x0 , 0x97ae , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x91f4 , 0x0 , +0x0 , 0xe0e6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0e8 , 0x97d4 , +0x8bd5 , 0x94fa , 0x9469 , 0x0 , +0x0 , 0x0 , 0xe0e9 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0eb , +0x0 , 0xe0ee , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe0ea , 0x0 , 0x0 , +0x0 , 0xe0ed , 0x8ce8 , 0x896c , +0xe0ef , 0x0 , 0x9090 , 0xe0ec , +0x97da , 0x0 , 0x0 , 0xe0f2 , +0xeaa2 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe0f0 , 0xe0f3 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0e5 , +0xe0f1 , 0x0 , 0x0 , 0x8dba , +0x0 , 0x0 , 0xe0f4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0f5 , 0x0 , +0x0 , 0x0 , 0x0 , 0x979e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0f6 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0f7 , 0x0 , +0x0 , 0x0 , 0xe0e3 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0f8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8ac2 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8ea3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe0f9 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe0fa , +0x0 , 0x0 , 0x0 , 0x0 , +0xe0fb , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x895a , 0x0 , 0x0 , 0x0 , +0xe140 , 0x0 , 0x955a , 0xe141 , +0x0 , 0x0 , 0x8aa2 , 0xe142 , +0x0 , 0xe143 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe144 , 0x0 , +0xe146 , 0xe147 , 0xe145 , 0x0 , +0x0 , 0x0 , 0x9572 , 0xe149 , +0xe148 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe14b , +0xe14a , 0xe14c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe14d , 0xe14f , 0xe14e , 0x0 , +0x0 , 0x8d99 , 0x0 , 0xe151 , +0x0 , 0xe150 , 0x0 , 0x0 , +0x8ac3 , 0x0 , 0x9072 , 0x0 , +0x935b , 0x0 , 0xe152 , 0x90b6 , +0x0 , 0x0 , 0x0 , 0x8e59 , +0x0 , 0x8999 , 0xe153 , 0x0 , +0x9770 , 0x0 , 0x0 , 0x95e1 , +0xe154 , 0x0 , 0x0 , 0x0 , +0x9363 , 0x9752 , 0x8d62 , 0x905c , +0x0 , 0x0 , 0x0 , 0x926a , +0x99b2 , 0x0 , 0x92ac , 0x89e6 , +0xe155 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe156 , 0x0 , 0xe15b , 0x0 , +0x0 , 0xe159 , 0xe158 , 0x9dc0 , +0x8a45 , 0xe157 , 0x0 , 0x88d8 , +0x0 , 0x94a8 , 0x0 , 0x0 , +0x94c8 , 0x0 , 0x0 , 0x0 , +0x0 , 0x97af , 0xe15c , 0xe15a , +0x927b , 0x90a4 , 0x0 , 0x0 , +0x94a9 , 0x0 , 0x954c , 0x0 , +0xe15e , 0x97aa , 0x8c6c , 0xe15f , +0x0 , 0xe15d , 0x94d4 , 0xe160 , +0x0 , 0xe161 , 0x0 , 0x0 , +0x88d9 , 0x0 , 0x0 , 0x8ff4 , +0xe166 , 0x0 , 0xe163 , 0x93eb , +0xe162 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8b45 , +0x0 , 0x0 , 0xe169 , 0x0 , +0x0 , 0x0 , 0xe164 , 0xe165 , +0x0 , 0xe168 , 0xe167 , 0x9544 , +0x0 , 0x0 , 0x9161 , 0x9160 , +0x0 , 0x8b5e , 0x0 , 0x0 , +0xe16a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe16b , 0x0 , +0x0 , 0xe16c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe16e , +0x0 , 0xe16d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8975 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe176 , 0x94e6 , 0xe170 , +0x0 , 0xe172 , 0x0 , 0x0 , +0xe174 , 0x905d , 0x0 , 0x0 , +0xe175 , 0xe173 , 0x8ebe , 0x0 , +0x0 , 0x0 , 0xe16f , 0xe171 , +0x0 , 0x9561 , 0x0 , 0x8fc7 , +0x0 , 0x0 , 0xe178 , 0x0 , +0x0 , 0xe177 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe179 , 0x0 , +0x8ea4 , 0x8dad , 0x0 , 0x0 , +0x9397 , 0xe17a , 0x0 , 0x92c9 , +0x0 , 0x0 , 0xe17c , 0x0 , +0x0 , 0x0 , 0x979f , 0xe17b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9189 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe182 , 0x0 , 0xe184 , 0xe185 , +0x9273 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe183 , 0x0 , +0xe180 , 0x0 , 0xe17d , 0xe17e , +0x0 , 0xe181 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe188 , 0x0 , 0xe186 , +0x0 , 0xe187 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe189 , +0xe18b , 0xe18c , 0xe18d , 0x0 , +0xe18e , 0x0 , 0x0 , 0xe18a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe190 , 0x0 , 0x0 , 0x0 , +0xe18f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe191 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x97c3 , 0x0 , +0x0 , 0x0 , 0xe194 , 0xe192 , +0xe193 , 0x0 , 0x0 , 0x0 , +0x8ae0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x96fc , 0x0 , +0x0 , 0x0 , 0x95c8 , 0x0 , +0xe196 , 0x0 , 0x0 , 0x0 , +0xe195 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe197 , 0xe198 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe19c , +0xe199 , 0xe19a , 0xe19b , 0x0 , +0xe19d , 0x0 , 0x0 , 0x0 , +0xe19e , 0x0 , 0xe19f , 0x0 , +0x0 , 0x0 , 0xe1a0 , 0x0 , +0xe1a1 , 0x0 , 0x94ad , 0x936f , +0xe1a2 , 0x9492 , 0x9553 , 0x0 , +0xe1a3 , 0x0 , 0x0 , 0xe1a4 , +0x9349 , 0x0 , 0x8a46 , 0x8d63 , +0xe1a5 , 0x0 , 0x0 , 0xe1a6 , +0x0 , 0x0 , 0xe1a7 , 0x0 , +0x8e48 , 0x0 , 0x0 , 0xe1a9 , +0x0 , 0x0 , 0xe1a8 , 0x0 , +0x0 , 0xe1aa , 0xe1ab , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x94e7 , 0x0 , +0xe1ac , 0x0 , 0x0 , 0x0 , +0xe1ad , 0x0 , 0x0 , 0xea89 , +0xe1ae , 0xe1af , 0xe1b0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8e4d , +0x0 , 0x0 , 0xe1b1 , 0x9475 , +0x0 , 0x0 , 0x967e , 0x0 , +0x896d , 0x0 , 0x8976 , 0x0 , +0x0 , 0xe1b2 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe1b4 , 0x0 , +0x0 , 0x0 , 0xe1b3 , 0x9390 , +0x0 , 0x0 , 0x0 , 0x90b7 , +0x9f58 , 0x0 , 0xe1b5 , 0x96bf , +0x0 , 0xe1b6 , 0x0 , 0x8ac4 , +0x94d5 , 0xe1b7 , 0x0 , 0xe1b8 , +0x0 , 0x0 , 0xe1b9 , 0x0 , +0x0 , 0x0 , 0x96da , 0x0 , +0x0 , 0x0 , 0x96d3 , 0x0 , +0x92bc , 0x0 , 0x0 , 0x0 , +0x918a , 0x0 , 0x0 , 0xe1bb , +0x0 , 0x0 , 0x8f82 , 0x0 , +0x0 , 0x8fc8 , 0x0 , 0x0 , +0xe1be , 0x0 , 0x0 , 0xe1bd , +0xe1bc , 0x94fb , 0x0 , 0x8ac5 , +0x8ca7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe1c4 , +0x0 , 0x0 , 0xe1c1 , 0x905e , +0x96b0 , 0x0 , 0x0 , 0x0 , +0xe1c0 , 0xe1c2 , 0xe1c3 , 0x0 , +0x0 , 0xe1bf , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe1c5 , +0xe1c6 , 0x0 , 0x92ad , 0x0 , +0x8ae1 , 0x0 , 0x0 , 0x0 , +0x9285 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe1c7 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe1c8 , 0xe1cb , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9087 , 0x0 , 0x93c2 , +0x0 , 0xe1cc , 0x9672 , 0x0 , +0xe1c9 , 0x0 , 0x0 , 0xe1ca , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe1cf , 0x0 , 0x0 , +0x0 , 0x0 , 0xe1ce , 0xe1cd , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe1d1 , +0x0 , 0x0 , 0xe1d0 , 0x0 , +0x0 , 0xe1d2 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe1d4 , 0x0 , +0xe1d3 , 0x0 , 0x0 , 0x0 , +0x0 , 0x95cb , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8f75 , 0x97c4 , 0x0 , 0x0 , +0xe1d5 , 0x0 , 0x0 , 0x93b5 , +0x0 , 0x0 , 0xe1d6 , 0x0 , +0x0 , 0xe1d7 , 0x0 , 0xe1db , +0xe1d9 , 0xe1da , 0x0 , 0xe1d8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe1dc , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe1dd , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe1de , +0x0 , 0x0 , 0xe1df , 0x96b5 , +0xe1e0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x96ee , 0xe1e1 , +0x0 , 0x926d , 0x0 , 0x948a , +0x0 , 0x8be9 , 0x0 , 0x0 , +0x0 , 0x925a , 0xe1e2 , 0x8bb8 , +0x0 , 0x0 , 0x0 , 0x90ce , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe1e3 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8dbb , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe1e4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe1e5 , 0x0 , +0x8ca4 , 0x8dd3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe1e7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9375 , 0x8dd4 , 0x8b6d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9643 , 0x0 , +0x946a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9376 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8d7b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe1e9 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8fc9 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x97b0 , +0x8d64 , 0x0 , 0x0 , 0x8ca5 , +0x0 , 0x0 , 0x94a1 , 0x0 , +0xe1eb , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe1ed , 0x0 , 0x0 , 0x0 , +0x0 , 0x8ce9 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe1ec , 0x92f4 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe1ef , 0x8a56 , 0xe1ea , 0x0 , +0x0 , 0x94e8 , 0x0 , 0x894f , +0x0 , 0x8dea , 0x0 , 0x9871 , +0x0 , 0x0 , 0xe1ee , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe1f0 , +0x0 , 0x0 , 0x0 , 0x95c9 , +0x0 , 0x90d7 , 0xe1f2 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe1f3 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe1f1 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8a6d , 0x0 , +0xe1f9 , 0x0 , 0xe1f8 , 0x0 , +0x0 , 0x8ea5 , 0x0 , 0x0 , +0x0 , 0xe1fa , 0xe1f5 , 0x0 , +0x0 , 0x0 , 0xe1fb , 0xe1f6 , +0x0 , 0x0 , 0x0 , 0x0 , +0x94d6 , 0xe1f4 , 0x0 , 0x0 , +0xe1f7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe241 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe240 , +0x9681 , 0x0 , 0x0 , 0x0 , +0xe1fc , 0x0 , 0x0 , 0x88e9 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe243 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe242 , 0x0 , 0x0 , +0x0 , 0x8fca , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe244 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9162 , 0x0 , +0x0 , 0xe246 , 0xe245 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe247 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe1e6 , 0x0 , +0x0 , 0x0 , 0xe1e8 , 0xe249 , +0xe248 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8ea6 , 0x0 , +0x97e7 , 0x0 , 0x8ed0 , 0x0 , +0xe24a , 0x8c56 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8b5f , +0x8b46 , 0x8e83 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9753 , 0x0 , 0x0 , 0xe250 , +0x0 , 0xe24f , 0x9163 , 0xe24c , +0x0 , 0x0 , 0xe24e , 0x0 , +0x0 , 0x8f6a , 0x905f , 0xe24d , +0xe24b , 0x0 , 0x9449 , 0x0 , +0x0 , 0x8fcb , 0x0 , 0x0 , +0x955b , 0x0 , 0x0 , 0x0 , +0x0 , 0x8dd5 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9398 , +0x0 , 0x0 , 0xe251 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe252 , +0xe268 , 0x8bd6 , 0x0 , 0x0 , +0x985c , 0x9154 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe253 , 0x0 , +0x0 , 0x89d0 , 0x92f5 , 0x959f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe254 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8b9a , 0xe255 , +0x0 , 0x0 , 0xe257 , 0x0 , +0x0 , 0x0 , 0xe258 , 0x0 , +0x9448 , 0x0 , 0x0 , 0xe259 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe25a , 0xe25b , 0x0 , +0x0 , 0x8bd7 , 0x89d1 , 0x93c3 , +0x8f47 , 0x8e84 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe25c , 0x0 , 0x8f48 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x89c8 , 0x9562 , 0x0 , +0x0 , 0xe25d , 0x0 , 0x0 , +0x94e9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9164 , +0x0 , 0xe260 , 0x0 , 0xe261 , +0x9489 , 0x0 , 0x9060 , 0xe25e , +0x0 , 0x9281 , 0x0 , 0x0 , +0xe25f , 0x0 , 0x0 , 0x0 , +0x8fcc , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x88da , +0x0 , 0x0 , 0x0 , 0x0 , +0x8b48 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe262 , 0x0 , 0x0 , 0x92f6 , +0x0 , 0xe263 , 0x90c5 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x96ab , 0x0 , 0x0 , 0x9542 , +0xe264 , 0xe265 , 0x9274 , 0x0 , +0x97c5 , 0x0 , 0x0 , 0xe267 , +0xe266 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8eed , 0x0 , +0x0 , 0xe269 , 0x88ee , 0x0 , +0x0 , 0x0 , 0x0 , 0xe26c , +0x0 , 0x0 , 0x0 , 0xe26a , +0x89d2 , 0x8c6d , 0xe26b , 0x8d65 , +0x8d92 , 0x0 , 0x95e4 , 0xe26d , +0x0 , 0x0 , 0x9673 , 0x0 , +0x0 , 0xe26f , 0x0 , 0x0 , +0x0 , 0x90cf , 0x896e , 0x89b8 , +0x88aa , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe26e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe270 , 0xe271 , 0x8ff5 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe272 , 0x0 , 0x8a6e , +0x0 , 0x0 , 0x0 , 0x0 , +0xe274 , 0x0 , 0x0 , 0x0 , +0x8c8a , 0x0 , 0x8b86 , 0x0 , +0x0 , 0xe275 , 0x8bf3 , 0x0 , +0x0 , 0xe276 , 0x0 , 0x90fa , +0x0 , 0x93cb , 0x0 , 0x90de , +0x8df3 , 0x0 , 0x0 , 0x0 , +0xe277 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9282 , 0x918b , +0x0 , 0xe279 , 0xe27b , 0xe278 , +0xe27a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8c41 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe27c , 0x8c45 , 0x0 , +0x0 , 0x0 , 0x8b87 , 0x9771 , +0xe27e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe280 , 0x0 , +0x0 , 0x0 , 0x894d , 0x0 , +0x0 , 0x0 , 0x0 , 0xe283 , +0x0 , 0x0 , 0x0 , 0x8a96 , +0xe282 , 0xe281 , 0x0 , 0xe285 , +0xe27d , 0x0 , 0xe286 , 0x97a7 , +0x0 , 0xe287 , 0x0 , 0xe288 , +0x0 , 0x0 , 0x9af2 , 0xe28a , +0x0 , 0xe289 , 0x0 , 0x0 , +0x0 , 0xe28b , 0xe28c , 0x0 , +0x97b3 , 0xe28d , 0x0 , 0xe8ed , +0x8fcd , 0xe28e , 0xe28f , 0x8f76 , +0x0 , 0x93b6 , 0xe290 , 0x0 , +0x0 , 0x0 , 0x9247 , 0x0 , +0x0 , 0xe291 , 0x0 , 0x925b , +0xe292 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8ba3 , 0x0 , +0x995e , 0x927c , 0x8eb1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8ac6 , +0x0 , 0x0 , 0xe293 , 0x0 , +0xe2a0 , 0x0 , 0xe296 , 0x0 , +0x8b88 , 0x0 , 0xe295 , 0xe2a2 , +0x0 , 0x0 , 0x0 , 0xe294 , +0x0 , 0x8fce , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe298 , 0xe299 , 0x0 , 0x934a , +0x0 , 0x0 , 0xe29a , 0x0 , +0x8a7d , 0x0 , 0x0 , 0x0 , +0x0 , 0x9079 , 0x9584 , 0x0 , +0xe29c , 0x0 , 0x0 , 0x0 , +0x91e6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe297 , +0x0 , 0xe29b , 0xe29d , 0x0 , +0x0 , 0x8df9 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe2a4 , 0x954d , 0x0 , +0x94a4 , 0x9399 , 0x0 , 0x8bd8 , +0xe2a3 , 0xe2a1 , 0x0 , 0x94b3 , +0xe29e , 0x927d , 0x939b , 0x0 , +0x939a , 0x0 , 0x8df4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe2b6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe2a6 , 0x0 , 0xe2a8 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe2ab , 0x0 , 0xe2ac , 0x0 , +0xe2a9 , 0xe2aa , 0x0 , 0x0 , +0xe2a7 , 0xe2a5 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe29f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x95cd , 0x89d3 , +0x0 , 0x0 , 0x0 , 0xe2b3 , +0x0 , 0xe2b0 , 0x0 , 0xe2b5 , +0x0 , 0x0 , 0xe2b4 , 0x0 , +0x9493 , 0x96a5 , 0x0 , 0x8e5a , +0xe2ae , 0xe2b7 , 0xe2b2 , 0x0 , +0xe2b1 , 0xe2ad , 0x0 , 0xe2af , +0x0 , 0x8ac7 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x925c , 0x0 , +0x0 , 0x90fb , 0x0 , 0x0 , +0x0 , 0x94a0 , 0x0 , 0x0 , +0xe2bc , 0x0 , 0x0 , 0x0 , +0x94a2 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x90df , 0xe2b9 , 0x0 , 0x0 , +0x94cd , 0x0 , 0xe2bd , 0x95d1 , +0x0 , 0x927a , 0x0 , 0xe2b8 , +0xe2ba , 0x0 , 0x0 , 0xe2bb , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe2be , 0x0 , 0x0 , +0x8ec2 , 0x0 , 0x0 , 0x0 , +0x93c4 , 0xe2c3 , 0xe2c2 , 0x0 , +0x0 , 0xe2bf , 0x0 , 0x0 , +0x0 , 0x9855 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe2c8 , +0x0 , 0x0 , 0xe2cc , 0xe2c9 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe2c5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe2c6 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe2cb , 0x0 , 0x0 , +0x0 , 0xe2c0 , 0x99d3 , 0xe2c7 , +0xe2c1 , 0x0 , 0x0 , 0xe2ca , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe2d0 , +0x0 , 0x8ac8 , 0x0 , 0xe2cd , +0x0 , 0x0 , 0x0 , 0xe2ce , +0x0 , 0x0 , 0xe2cf , 0xe2d2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe2d1 , +0x94f4 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe2d3 , 0x97fa , 0x95eb , +0xe2d8 , 0x0 , 0x0 , 0xe2d5 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe2d4 , 0x90d0 , 0x0 , 0xe2d7 , +0xe2d9 , 0x0 , 0x0 , 0x0 , +0xe2d6 , 0x0 , 0xe2dd , 0x0 , +0xe2da , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe2db , +0xe2c4 , 0x0 , 0x0 , 0x0 , +0xe2dc , 0xe2de , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe2df , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x95c4 , +0x0 , 0xe2e0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x96e0 , 0x0 , +0x0 , 0x8bcc , 0x8c48 , 0xe2e1 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x95b2 , 0x0 , 0x9088 , +0x0 , 0x96ae , 0x0 , 0x0 , +0xe2e2 , 0x0 , 0x97b1 , 0x0 , +0x0 , 0x9494 , 0x0 , 0x9165 , +0x9453 , 0x0 , 0x0 , 0x8f6c , +0x0 , 0x0 , 0x0 , 0x88be , +0x0 , 0xe2e7 , 0xe2e5 , 0x0 , +0xe2e3 , 0x8a9f , 0x0 , 0x8fcf , +0xe2e8 , 0x0 , 0x0 , 0xe2e6 , +0x0 , 0xe2e4 , 0xe2ec , 0x0 , +0x0 , 0xe2eb , 0xe2ea , 0xe2e9 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe2ed , 0x0 , 0x0 , +0x0 , 0xe2ee , 0x90b8 , 0x0 , +0xe2ef , 0x0 , 0xe2f1 , 0x0 , +0x0 , 0xe2f0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8cd0 , 0x0 , +0x0 , 0x0 , 0x9157 , 0x0 , +0x0 , 0x0 , 0xe2f3 , 0x0 , +0x0 , 0x0 , 0x939c , 0x0 , +0xe2f2 , 0x0 , 0x0 , 0x0 , +0xe2f4 , 0x0 , 0x95b3 , 0x918c , +0x8d66 , 0x0 , 0xe2f5 , 0x0 , +0x0 , 0x0 , 0x0 , 0x97c6 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe2f7 , +0x0 , 0x0 , 0xe2f8 , 0x0 , +0xe2f9 , 0x0 , 0xe2fa , 0x0 , +0x8e85 , 0x0 , 0xe2fb , 0x8c6e , +0x0 , 0x0 , 0x8b8a , 0x0 , +0x8b49 , 0x0 , 0xe340 , 0x0 , +0x96f1 , 0x8d67 , 0xe2fc , 0x0 , +0x0 , 0x0 , 0xe343 , 0x96e4 , +0x0 , 0x945b , 0x0 , 0x0 , +0x9552 , 0x0 , 0x0 , 0x0 , +0x8f83 , 0xe342 , 0x0 , 0x8ed1 , +0x8d68 , 0x8e86 , 0x8b89 , 0x95b4 , +0xe341 , 0x0 , 0x0 , 0x0 , +0x9166 , 0x9661 , 0x8df5 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8e87 , +0x92db , 0x0 , 0xe346 , 0x97dd , +0x8dd7 , 0x0 , 0xe347 , 0x9061 , +0x0 , 0xe349 , 0x0 , 0x0 , +0x0 , 0x8fd0 , 0x8dae , 0x0 , +0x0 , 0x0 , 0x0 , 0xe348 , +0x0 , 0x0 , 0x8f49 , 0x8cbc , +0x9167 , 0xe344 , 0xe34a , 0x0 , +0x0 , 0x0 , 0x0 , 0xe345 , +0x8c6f , 0x0 , 0xe34d , 0xe351 , +0x8c8b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe34c , 0x0 , +0x0 , 0x0 , 0x0 , 0xe355 , +0x0 , 0x0 , 0x8d69 , 0x0 , +0x0 , 0x978d , 0x88ba , 0xe352 , +0x0 , 0x0 , 0x8b8b , 0x0 , +0xe34f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe350 , 0x0 , +0x0 , 0x939d , 0xe34e , 0xe34b , +0x0 , 0x8a47 , 0x90e2 , 0x0 , +0x0 , 0x8ca6 , 0x0 , 0x0 , +0x0 , 0xe357 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe354 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe356 , +0x0 , 0x0 , 0x0 , 0xe353 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8c70 , 0x91b1 , 0xe358 , +0x918e , 0x0 , 0x0 , 0xe365 , +0x0 , 0x0 , 0xe361 , 0xe35b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe35f , +0x8ef8 , 0x88db , 0xe35a , 0xe362 , +0xe366 , 0x8d6a , 0x96d4 , 0x0 , +0x92d4 , 0xe35c , 0x0 , 0x0 , +0xe364 , 0x0 , 0xe359 , 0x925d , +0x0 , 0xe35e , 0x88bb , 0x96c8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe35d , +0x0 , 0x0 , 0x8bd9 , 0x94ea , +0x0 , 0x0 , 0x0 , 0x918d , +0x0 , 0x97ce , 0x8f8f , 0x0 , +0x0 , 0xe38e , 0x0 , 0x0 , +0xe367 , 0x0 , 0x90fc , 0x0 , +0xe363 , 0xe368 , 0xe36a , 0x0 , +0x92f7 , 0xe36d , 0x0 , 0x0 , +0xe369 , 0x0 , 0x0 , 0x0 , +0x95d2 , 0x8ac9 , 0x0 , 0x0 , +0x96c9 , 0x0 , 0x0 , 0x88dc , +0x0 , 0x0 , 0xe36c , 0x0 , +0x97fb , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe36b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x898f , 0x0 , 0x0 , +0x93ea , 0xe36e , 0x0 , 0x0 , +0x0 , 0xe375 , 0xe36f , 0xe376 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe372 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x949b , +0x0 , 0x0 , 0x8ec8 , 0xe374 , +0x0 , 0xe371 , 0xe377 , 0xe370 , +0x0 , 0x0 , 0x8f63 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9644 , +0x0 , 0x0 , 0x8f6b , 0x0 , +0x0 , 0xe373 , 0xe380 , 0x0 , +0x0 , 0xe37b , 0x0 , 0xe37e , +0x0 , 0xe37c , 0xe381 , 0xe37a , +0x0 , 0xe360 , 0x90d1 , 0x0 , +0x0 , 0x94c9 , 0x0 , 0xe37d , +0x0 , 0x0 , 0xe378 , 0x0 , +0x0 , 0x0 , 0x9140 , 0x8c71 , +0x0 , 0x8f4a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9044 , 0x9155 , 0xe384 , 0x0 , +0x0 , 0xe386 , 0xe387 , 0x0 , +0x0 , 0xe383 , 0xe385 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe379 , 0xe382 , +0x0 , 0xe38a , 0xe389 , 0x0 , +0x0 , 0x969a , 0x0 , 0x0 , +0x8c4a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe388 , 0x0 , 0xe38c , +0xe38b , 0xe38f , 0x0 , 0xe391 , +0x0 , 0x0 , 0x8e5b , 0xe38d , +0x0 , 0x0 , 0x0 , 0x0 , +0xe392 , 0xe393 , 0x0 , 0x0 , +0xe394 , 0x0 , 0xe39a , 0x935a , +0xe396 , 0x0 , 0xe395 , 0xe397 , +0xe398 , 0x0 , 0xe399 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe39b , +0xe39c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8aca , 0x0 , +0xe39d , 0x0 , 0xe39e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe39f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe3a0 , 0xe3a1 , 0xe3a2 , 0x0 , +0xe3a3 , 0xe3a4 , 0x0 , 0x0 , +0xe3a6 , 0xe3a5 , 0x0 , 0x0 , +0xe3a7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe3a8 , +0xe3a9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe3ac , +0xe3aa , 0xe3ab , 0x8ddf , 0x8c72 , +0x0 , 0x0 , 0x9275 , 0x0 , +0x94b1 , 0x0 , 0x8f90 , 0x0 , +0x0 , 0x946c , 0x0 , 0x94eb , +0xe3ad , 0x9ceb , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe3ae , 0xe3b0 , +0x0 , 0x9785 , 0xe3af , 0xe3b2 , +0xe3b1 , 0x0 , 0x9772 , 0x0 , +0xe3b3 , 0x0 , 0x94fc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe3b4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe3b7 , 0x0 , +0x0 , 0xe3b6 , 0xe3b5 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe3b8 , +0x8c51 , 0x0 , 0x0 , 0x0 , +0x9141 , 0x8b60 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe3bc , 0xe3b9 , +0x0 , 0x0 , 0xe3ba , 0x0 , +0x0 , 0x0 , 0xe3bd , 0x0 , +0xe3be , 0xe3bb , 0x0 , 0x0 , +0x0 , 0x8948 , 0x0 , 0x0 , +0x0 , 0x89a5 , 0x0 , 0x0 , +0x0 , 0xe3c0 , 0xe3c1 , 0x0 , +0x0 , 0x0 , 0xe3c2 , 0x0 , +0x9782 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8f4b , 0x0 , +0xe3c4 , 0xe3c3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9089 , 0xe3c5 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe3c6 , 0x0 , +0x0 , 0xe3c7 , 0x0 , 0x8ae3 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8acb , 0x0 , 0x0 , 0xe3c8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe3c9 , 0x0 , 0x967c , +0x9783 , 0x0 , 0x0 , 0x0 , +0x9773 , 0x9856 , 0x0 , 0x8d6c , +0xe3cc , 0x8ed2 , 0xe3cb , 0x0 , +0x0 , 0x0 , 0x0 , 0xe3cd , +0x8ea7 , 0x0 , 0x0 , 0x0 , +0x91cf , 0x0 , 0xe3ce , 0x0 , +0x0 , 0x8d6b , 0x0 , 0x96d5 , +0xe3cf , 0xe3d0 , 0x0 , 0x0 , +0xe3d1 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe3d2 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe3d3 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8ea8 , +0x0 , 0x0 , 0x96eb , 0x0 , +0x0 , 0x0 , 0x0 , 0xe3d5 , +0x0 , 0x925e , 0x0 , 0xe3d4 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe3d7 , 0x0 , +0x0 , 0x0 , 0xe3d6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe3d8 , 0x0 , +0x0 , 0x0 , 0x90b9 , 0x0 , +0xe3d9 , 0x0 , 0xe3da , 0x0 , +0x0 , 0x0 , 0x95b7 , 0xe3db , +0x0 , 0x918f , 0xe3dc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe3dd , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x97fc , +0xe3e0 , 0x0 , 0xe3df , 0xe3de , +0x92ae , 0x0 , 0xe3e1 , 0x9045 , +0x0 , 0xe3e2 , 0x0 , 0x0 , +0x0 , 0xe3e3 , 0x9857 , 0xe3e4 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe3e5 , 0xe3e7 , 0xe3e6 , 0x94a3 , +0x0 , 0x93f7 , 0x0 , 0x985d , +0x94a7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe3e9 , +0x0 , 0x0 , 0x8fd1 , 0x0 , +0x9549 , 0x0 , 0xe3ea , 0xe3e8 , +0x0 , 0x8acc , 0x0 , 0x0 , +0x0 , 0x8cd2 , 0x8e88 , 0x0 , +0x0 , 0x94ec , 0x0 , 0x0 , +0x0 , 0x8ca8 , 0x9662 , 0x0 , +0xe3ed , 0xe3eb , 0x0 , 0x8d6d , +0x0 , 0x8d6e , 0x88e7 , 0x0 , +0x8de6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9478 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x88dd , +0xe3f2 , 0x0 , 0x925f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9477 , 0x0 , 0x91d9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe3f4 , 0x0 , +0x0 , 0xe3f0 , 0xe3f3 , 0xe3ee , +0x0 , 0xe3f1 , 0x9645 , 0x0 , +0x0 , 0x8cd3 , 0x0 , 0x0 , +0x88fb , 0xe3ef , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe3f6 , +0x0 , 0xe3f7 , 0x0 , 0x0 , +0x93b7 , 0x0 , 0x0 , 0x0 , +0x8bb9 , 0x0 , 0x0 , 0x0 , +0xe445 , 0x945c , 0x0 , 0x0 , +0x0 , 0x0 , 0x8e89 , 0x0 , +0x0 , 0x8bba , 0x90c6 , 0x9865 , +0x96ac , 0xe3f5 , 0x90d2 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8b72 , 0xe3f8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe3fa , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe3f9 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe3fb , +0x0 , 0x9245 , 0x0 , 0x945d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x92af , 0x0 , 0x0 , +0x0 , 0x0 , 0xe442 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe441 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe3fc , +0x0 , 0x0 , 0x9074 , 0x0 , +0x9585 , 0xe444 , 0x0 , 0xe443 , +0x8d6f , 0x9872 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe454 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe448 , 0xe449 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8eee , +0x0 , 0x0 , 0xe447 , 0x0 , +0x8d98 , 0xe446 , 0x0 , 0x0 , +0xe44a , 0x0 , 0x0 , 0x0 , +0x92b0 , 0x95a0 , 0x9142 , 0x0 , +0x0 , 0x0 , 0x0 , 0x91da , +0xe44e , 0x0 , 0xe44f , 0xe44b , +0x0 , 0x0 , 0x0 , 0x0 , +0xe44c , 0x0 , 0xe44d , 0x0 , +0x0 , 0x0 , 0x0 , 0x8d70 , +0x0 , 0x0 , 0x0 , 0xe455 , +0x0 , 0xe451 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9586 , 0x0 , +0x968c , 0x9547 , 0x0 , 0x0 , +0xe450 , 0x0 , 0x0 , 0xe453 , +0xe452 , 0x0 , 0x0 , 0x0 , +0x9663 , 0xe456 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe457 , 0x0 , 0x0 , 0x9156 , +0x0 , 0xe458 , 0x0 , 0x0 , +0xe45a , 0x0 , 0xe45e , 0x0 , +0x0 , 0xe45b , 0xe459 , 0x945e , +0xe45c , 0x0 , 0xe45d , 0x0 , +0x0 , 0x0 , 0x89b0 , 0x0 , +0xe464 , 0xe45f , 0x0 , 0x0 , +0x0 , 0xe460 , 0x0 , 0x0 , +0x0 , 0xe461 , 0x0 , 0x919f , +0x0 , 0x0 , 0x0 , 0x0 , +0xe463 , 0xe462 , 0xe465 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe466 , +0xe467 , 0x0 , 0x0 , 0x9062 , +0x0 , 0x89e7 , 0x0 , 0xe468 , +0x97d5 , 0x0 , 0x8ea9 , 0x0 , +0x0 , 0x8f4c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8e8a , +0x9276 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe469 , 0xe46a , +0x8950 , 0x0 , 0xe46b , 0x0 , +0x0 , 0xe46c , 0xe46d , 0x0 , +0x0 , 0xe46e , 0x0 , 0xe46f , +0x8bbb , 0x9da8 , 0xe470 , 0x0 , +0x90e3 , 0xe471 , 0x8ec9 , 0x0 , +0xe472 , 0x0 , 0x98ae , 0x0 , +0x0 , 0x0 , 0xe473 , 0x95dc , +0x8ada , 0x0 , 0x0 , 0x9143 , +0x8f77 , 0x0 , 0x9591 , 0x8f4d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe474 , 0x8d71 , 0xe475 , +0x94ca , 0x0 , 0xe484 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe477 , +0x0 , 0x91c7 , 0x9495 , 0x8cbd , +0xe476 , 0x9144 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe478 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x92f8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe47a , 0xe479 , 0xe47c , 0x0 , +0x0 , 0xe47b , 0x0 , 0xe47d , +0x0 , 0x0 , 0xe480 , 0x0 , +0xe47e , 0x0 , 0x8acd , 0x0 , +0xe481 , 0x0 , 0xe482 , 0xe483 , +0x0 , 0x0 , 0x8daf , 0x97c7 , +0x0 , 0xe485 , 0x9046 , 0x0 , +0x0 , 0x0 , 0x8990 , 0xe486 , +0xe487 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe488 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x88f0 , +0x0 , 0xe489 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe48a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9587 , 0x0 , 0x0 , +0x0 , 0x8ec5 , 0x0 , 0xe48c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8a48 , 0x88b0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe48b , +0xe48e , 0x946d , 0x0 , 0x9063 , +0x0 , 0x89d4 , 0x0 , 0x9646 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8c7c , 0x8bda , 0x0 , 0xe48d , +0x0 , 0x89e8 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8aa1 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8991 , 0xe492 , 0x97e8 , +0x91db , 0x0 , 0x0 , 0x9563 , +0x0 , 0xe49e , 0x0 , 0x89d5 , +0xe49c , 0x0 , 0xe49a , 0xe491 , +0x0 , 0xe48f , 0x0 , 0xe490 , +0x0 , 0x8ee1 , 0x8bea , 0x9297 , +0x0 , 0x0 , 0x0 , 0x93cf , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8970 , 0x0 , 0xe494 , +0xe493 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe499 , 0xe495 , 0xe498 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x96ce , 0xe497 , +0x89d6 , 0x8a9d , 0xe49b , 0x0 , +0x0 , 0xe49d , 0x0 , 0x0 , +0x0 , 0x0 , 0x8c73 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe4a1 , 0xe4aa , +0xe4ab , 0x0 , 0x0 , 0x0 , +0x88a9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe4b2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x88ef , 0x0 , 0x0 , 0xe4a9 , +0x0 , 0x0 , 0x0 , 0xe4a8 , +0x0 , 0xe4a3 , 0xe4a2 , 0x0 , +0xe4a0 , 0xe49f , 0x9283 , 0x0 , +0x91f9 , 0xe4a5 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe4a4 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe4a7 , 0x0 , 0x0 , +0x0 , 0x9190 , 0x8c74 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8960 , +0xe4a6 , 0x0 , 0x8d72 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9191 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe4b8 , +0x0 , 0xe4b9 , 0x0 , 0x89d7 , +0x0 , 0x0 , 0x0 , 0x89ac , +0xe4b6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe4ac , 0x0 , 0xe4b4 , +0x0 , 0xe4bb , 0xe4b5 , 0x0 , +0x0 , 0x0 , 0xe4b3 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe496 , +0x0 , 0x0 , 0xe4b1 , 0x0 , +0x0 , 0x0 , 0xe4ad , 0x0 , +0x0 , 0x0 , 0x8ace , 0xe4af , +0xe4ba , 0x0 , 0xe4b0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe4bc , 0x0 , 0xe4ae , 0x949c , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9789 , 0x0 , 0x0 , +0x0 , 0xe4b7 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe4cd , 0x0 , 0x0 , +0x0 , 0xe4c5 , 0x0 , 0x0 , +0x0 , 0x909b , 0x0 , 0x0 , +0x0 , 0x0 , 0x8b65 , 0x0 , +0x8bdb , 0x0 , 0xe4c0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x89d9 , +0x0 , 0x0 , 0x8fd2 , 0x0 , +0xe4c3 , 0x0 , 0x0 , 0x0 , +0x8dd8 , 0x0 , 0x0 , 0x9370 , +0xe4c8 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x95ec , 0x0 , 0xe4bf , +0x0 , 0x0 , 0x0 , 0x89d8 , +0x8cd4 , 0x9548 , 0xe4c9 , 0x0 , +0xe4bd , 0x0 , 0x0 , 0xe4c6 , +0x0 , 0x0 , 0x0 , 0xe4d0 , +0x0 , 0xe4c1 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe4c2 , +0x93b8 , 0x0 , 0x0 , 0xe4c7 , +0x0 , 0x0 , 0x0 , 0xe4c4 , +0x9647 , 0xe4ca , 0x88de , 0x0 , +0x0 , 0x0 , 0x0 , 0xe4be , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe4cc , 0x0 , 0xe4cb , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x948b , 0xe4d2 , 0x0 , +0xe4dd , 0x0 , 0x0 , 0x0 , +0x0 , 0x8a9e , 0x0 , 0x0 , +0x0 , 0xe4e0 , 0x0 , 0x0 , +0xe4ce , 0x0 , 0x0 , 0x0 , +0xe4d3 , 0x978e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe4dc , 0x0 , +0x0 , 0x9774 , 0x0 , 0x0 , +0x0 , 0x0 , 0x97a8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9298 , +0x0 , 0x0 , 0x0 , 0x8a8b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9592 , 0xe4e2 , 0x939f , +0x0 , 0x0 , 0x88af , 0x0 , +0x0 , 0xe4db , 0x0 , 0xe4d7 , +0x9192 , 0xe4d1 , 0xe4d9 , 0xe4de , +0x0 , 0x944b , 0x0 , 0x0 , +0x0 , 0x88a8 , 0x0 , 0xe4d6 , +0x0 , 0xe4df , 0x9598 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe4da , 0x0 , +0xe4d5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8fd3 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8f4e , 0x0 , 0x0 , 0x0 , +0x8eaa , 0x0 , 0x0 , 0x0 , +0x0 , 0x96d6 , 0x0 , 0x0 , +0x9566 , 0x0 , 0x0 , 0xe4e5 , +0x0 , 0xe4ee , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe4d8 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8a97 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8ff6 , 0xe4e3 , 0x0 , 0xe4e8 , +0x9193 , 0x0 , 0x0 , 0xe4e4 , +0x0 , 0xe4eb , 0x0 , 0x0 , +0x927e , 0x0 , 0xe4ec , 0x0 , +0x0 , 0x9775 , 0xe4e1 , 0x8a57 , +0x0 , 0xe4e7 , 0x0 , 0x0 , +0xe4ea , 0x96aa , 0x0 , 0x0 , +0x0 , 0x0 , 0xe4ed , 0x0 , +0x0 , 0xe4e6 , 0xe4e9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9648 , 0x0 , 0x9840 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe4f1 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe4f8 , 0x0 , 0x0 , 0xe4f0 , +0x8ec1 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe4cf , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x95cc , 0x0 , 0x96a0 , +0xe4f7 , 0xe4f6 , 0x0 , 0xe4f2 , +0xe4f3 , 0x0 , 0x8955 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe4f5 , +0x0 , 0xe4ef , 0x0 , 0x0 , +0x0 , 0x0 , 0x92d3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe4f4 , 0x88fc , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x91a0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x95c1 , 0x0 , 0x0 , +0xe4f9 , 0xe540 , 0x0 , 0x94d7 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe4fc , 0x8fd4 , 0x8ec7 , 0xe542 , +0x0 , 0x0 , 0x8bbc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe543 , 0x0 , 0x9599 , +0xe4fb , 0x0 , 0xe4d4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe4fa , +0x0 , 0x0 , 0x0 , 0x0 , +0x986e , 0x93a0 , 0x9593 , 0x0 , +0x0 , 0xe54a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe550 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe551 , 0x0 , +0xe544 , 0x0 , 0x0 , 0x0 , +0x9496 , 0x0 , 0x0 , 0xe54e , +0xe546 , 0x0 , 0xe548 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe552 , 0xe547 , 0x0 , 0x0 , +0xe54b , 0x0 , 0x0 , 0x8992 , +0x0 , 0x93e3 , 0x0 , 0xe54c , +0xe54f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe545 , 0x0 , 0x9145 , 0x0 , +0xe549 , 0x8e46 , 0x9064 , 0x8c4f , +0x96f2 , 0x0 , 0x96f7 , 0x8f92 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe556 , 0xe554 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x986d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe553 , 0x0 , 0x0 , +0x0 , 0x9795 , 0x0 , 0xe555 , +0xe557 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe558 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe55b , 0xe559 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x93a1 , 0xe55a , 0x0 , 0x0 , +0x0 , 0x94cb , 0xe54d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8f93 , +0x0 , 0xe55c , 0xe561 , 0x9194 , +0x0 , 0x0 , 0xe560 , 0x0 , +0x0 , 0x0 , 0xe541 , 0x0 , +0x0 , 0x0 , 0xe562 , 0x9168 , +0x0 , 0x0 , 0xe55d , 0xe55f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe55e , +0x0 , 0x0 , 0x9f50 , 0x9f41 , +0x0 , 0x0 , 0xe564 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe563 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9796 , 0x0 , 0xe1ba , +0xe565 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe566 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe567 , 0x8cd5 , 0x0 , +0x8b73 , 0x0 , 0x0 , 0x0 , +0xe569 , 0x997c , 0x0 , 0x0 , +0x0 , 0x0 , 0x8b95 , 0x0 , +0x97b8 , 0x0 , 0x8bf1 , 0xe56a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe56b , +0x0 , 0x0 , 0x0 , 0x928e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe56c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x93f8 , 0x0 , 0x88b8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x89e1 , 0xe571 , +0xe572 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe56d , +0x0 , 0x8e5c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe56e , +0x9461 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe56f , 0xe570 , 0xe57a , +0x0 , 0x0 , 0x0 , 0xe574 , +0xe577 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe573 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe575 , 0x0 , 0xe576 , 0x8ed6 , +0x0 , 0xe578 , 0x0 , 0x9260 , +0x0 , 0x8c75 , 0x8a61 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe57b , 0x0 , 0x0 , 0x0 , +0x0 , 0x8a5e , 0x0 , 0xe581 , +0x0 , 0x0 , 0xe57c , 0xe580 , +0x0 , 0x0 , 0x0 , 0x0 , +0x94b8 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe57d , 0x0 , 0x0 , +0xe57e , 0x9567 , 0x94d8 , 0xe582 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x91fb , 0xe58c , 0x0 , 0xe588 , +0x0 , 0x0 , 0x89e9 , 0x0 , +0xe586 , 0x0 , 0x9649 , 0xe587 , +0x0 , 0x0 , 0xe584 , 0x0 , +0xe585 , 0xe58a , 0xe58d , 0x0 , +0x0 , 0xe58b , 0x0 , 0x0 , +0x0 , 0xe589 , 0xe583 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9277 , 0x0 , 0xe594 , 0x0 , +0x96a8 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe592 , 0x0 , 0x0 , +0x0 , 0xe593 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe58e , 0x0 , 0x0 , 0xe590 , +0x0 , 0x0 , 0x0 , 0xe591 , +0x0 , 0x0 , 0x0 , 0xe58f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x90e4 , 0x0 , 0x9858 , +0xe598 , 0x0 , 0xe599 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe59f , +0x0 , 0x9049 , 0x0 , 0xe59b , +0x0 , 0xe59e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe596 , +0xe595 , 0x0 , 0x0 , 0xe5a0 , +0x0 , 0x0 , 0x89da , 0x0 , +0xe59c , 0x0 , 0xe5a1 , 0x0 , +0x0 , 0x0 , 0xe59d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe59a , 0x0 , 0x92b1 , 0x0 , +0xe597 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9488 , +0x0 , 0x0 , 0xe5a5 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x975a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe5a4 , +0x0 , 0x0 , 0xe5a3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe5ac , +0x0 , 0x0 , 0x0 , 0xe5a6 , +0x0 , 0x0 , 0x0 , 0xe5ae , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9786 , 0xe5b1 , +0x0 , 0xe5a8 , 0x0 , 0x0 , +0xe5a9 , 0x0 , 0x0 , 0x0 , +0xe5ad , 0x0 , 0xe5b0 , 0xe5af , +0x0 , 0x0 , 0x0 , 0xe5a7 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe5aa , 0x0 , 0xe5bb , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe5b4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe5b2 , +0x0 , 0x0 , 0xe5b3 , 0x0 , +0x0 , 0x0 , 0xe5b8 , 0xe5b9 , +0x0 , 0x8a49 , 0x0 , 0x8b61 , +0x0 , 0x0 , 0xe5b7 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe5a2 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe5b6 , 0xe5ba , 0xe5b5 , +0x0 , 0xe5bc , 0x0 , 0x0 , +0x0 , 0xe5be , 0xe5bd , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe5c0 , 0xe5bf , 0xe579 , +0x0 , 0x0 , 0x0 , 0xe5c4 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe5c1 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe5c2 , 0x0 , +0x0 , 0xe5c3 , 0x0 , 0xe5c5 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8c8c , 0x0 , 0xe5c7 , 0x0 , +0xe5c6 , 0x0 , 0x8f4f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8d73 , 0x9fa5 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe5c8 , 0x8f70 , +0x0 , 0x0 , 0x0 , 0x8a58 , +0x0 , 0xe5c9 , 0x0 , 0x8971 , +0x0 , 0x8fd5 , 0xe5ca , 0x0 , +0x0 , 0x8d74 , 0xe5cb , 0x88df , +0x0 , 0x0 , 0x0 , 0x0 , +0x955c , 0x0 , 0x0 , 0xe5cc , +0x0 , 0x0 , 0x0 , 0x0 , +0x908a , 0x0 , 0xe5d3 , 0x0 , +0x0 , 0xe5d0 , 0x0 , 0x928f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe5d1 , 0xe5ce , 0x8bdc , +0x0 , 0xe5cd , 0xe5d4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8c55 , 0x0 , 0x0 , 0x91dc , +0x0 , 0xe5da , 0x0 , 0x0 , +0x0 , 0x0 , 0xe5d6 , 0x0 , +0x0 , 0x0 , 0x91b3 , 0xe5d5 , +0x0 , 0xe5d8 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe5cf , 0x0 , +0x0 , 0x0 , 0xe5d9 , 0x0 , +0xe5db , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x94ed , +0x0 , 0x0 , 0xe5d7 , 0x0 , +0xe5dc , 0xe5de , 0x0 , 0x0 , +0x8cd1 , 0xe5d2 , 0x0 , 0x88bf , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe5dd , +0x0 , 0x8dd9 , 0x97f4 , 0xe5df , +0xe5e0 , 0x9195 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x97a0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe5e1 , 0x9754 , 0x0 , 0x0 , +0xe5e2 , 0xe5e3 , 0x0 , 0x0 , +0x95e2 , 0xe5e4 , 0x0 , 0x8dbe , +0x0 , 0x97a1 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe5e9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe5ea , 0x8fd6 , +0xe5e8 , 0x0 , 0x0 , 0x0 , +0x9787 , 0xe5e5 , 0x0 , 0x0 , +0xe5e7 , 0x90bb , 0x909e , 0x0 , +0x0 , 0x0 , 0xe5e6 , 0x0 , +0xe5eb , 0x0 , 0x0 , 0x95a1 , +0x0 , 0x0 , 0xe5ed , 0x0 , +0xe5ec , 0x0 , 0x0 , 0x0 , +0x8a8c , 0x0 , 0x964a , 0xe5ee , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe5fa , 0xe5f0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe5f1 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe5f2 , 0xe5f3 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe5f7 , 0x0 , +0xe5f8 , 0x0 , 0x0 , 0xe5f6 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe5f4 , 0x0 , 0xe5ef , +0xe5f5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe5f9 , 0xe8b5 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x89a6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe5fc , 0x8bdd , +0xe5fb , 0x0 , 0x0 , 0x0 , +0xe641 , 0x0 , 0xe640 , 0x0 , +0x0 , 0x0 , 0xe643 , 0x0 , +0x0 , 0xe642 , 0x0 , 0xe644 , +0x0 , 0x0 , 0x8f50 , 0x0 , +0xe645 , 0x0 , 0x0 , 0xe646 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe647 , 0x90bc , +0x0 , 0x9776 , 0x0 , 0xe648 , +0x0 , 0x0 , 0x95a2 , 0x9465 , +0xe649 , 0x0 , 0xe64a , 0x8ca9 , +0x0 , 0x0 , 0x0 , 0x8b4b , +0x0 , 0x0 , 0x0 , 0xe64b , +0x0 , 0x0 , 0x8e8b , 0x9460 , +0xe64c , 0x0 , 0x8a6f , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe64d , 0x0 , 0x0 , +0x0 , 0x0 , 0xe64f , 0x9797 , +0x0 , 0xe64e , 0x9065 , 0x0 , +0xe650 , 0x0 , 0x0 , 0xe651 , +0x0 , 0x0 , 0xe652 , 0x8acf , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe653 , 0x0 , +0x0 , 0xe654 , 0x0 , 0xe655 , +0xe656 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8a70 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe657 , 0x0 , +0xe658 , 0xe659 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x89f0 , +0x0 , 0x0 , 0x9047 , 0xe65a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe65b , 0x0 , 0x0 , 0x0 , +0xe65c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8cbe , 0x0 , 0x92f9 , 0xe65d , +0x0 , 0x0 , 0x0 , 0x0 , +0x8c76 , 0x0 , 0x9075 , 0x0 , +0xe660 , 0x0 , 0x93a2 , 0x0 , +0xe65f , 0x0 , 0x0 , 0x8c50 , +0x0 , 0x0 , 0xe65e , 0x91f5 , +0x8b4c , 0x0 , 0x0 , 0xe661 , +0x0 , 0xe662 , 0x0 , 0x8fd7 , +0x0 , 0x0 , 0x0 , 0x8c8d , +0x0 , 0xe663 , 0x0 , 0x0 , +0x0 , 0x0 , 0x964b , 0x0 , +0x0 , 0x90dd , 0x0 , 0x0 , +0x0 , 0x8b96 , 0x0 , 0x96f3 , +0x9169 , 0x0 , 0xe664 , 0x0 , +0x0 , 0x0 , 0x9066 , 0x9290 , +0x8fd8 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe665 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe668 , 0x0 , +0xe669 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8dbc , 0x91c0 , 0xe667 , 0x0 , +0x8fd9 , 0x955d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe666 , +0x0 , 0x0 , 0x8e8c , 0x0 , +0x8972 , 0x0 , 0xe66d , 0x8c77 , +0x0 , 0x0 , 0x8e8e , 0x0 , +0x0 , 0x8e8d , 0x0 , 0x986c , +0xe66c , 0xe66b , 0x9146 , 0x0 , +0x8b6c , 0x9862 , 0x8a59 , 0x8fda , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe66a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe66f , 0x0 , +0xe670 , 0xe66e , 0x0 , 0x8cd6 , +0x0 , 0x975f , 0x0 , 0x0 , +0x8e8f , 0x9446 , 0x0 , 0x0 , +0x0 , 0xe673 , 0x0 , 0x90be , +0x0 , 0x9261 , 0x0 , 0x0 , +0x9755 , 0x0 , 0xe676 , 0x0 , +0x0 , 0x0 , 0x8cea , 0x0 , +0x90bd , 0xe672 , 0x0 , 0xe677 , +0x8ceb , 0xe674 , 0xe675 , 0x0 , +0xe671 , 0x0 , 0x0 , 0x0 , +0x90e0 , 0x93c7 , 0x0 , 0x0 , +0x924e , 0x0 , 0x89db , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x94ee , 0x0 , 0x0 , +0x8b62 , 0x0 , 0x0 , 0x92b2 , +0x0 , 0x0 , 0xe67a , 0x0 , +0xe678 , 0x0 , 0x0 , 0x926b , +0x0 , 0x0 , 0x0 , 0x90bf , +0x8ad0 , 0xe679 , 0x0 , 0x907a , +0x0 , 0x0 , 0x97c8 , 0x0 , +0x0 , 0x0 , 0x985f , 0x0 , +0x0 , 0x0 , 0xe67b , 0xe687 , +0x92b3 , 0x0 , 0xe686 , 0x0 , +0xe683 , 0xe68b , 0xe684 , 0x0 , +0xe680 , 0x0 , 0x92fa , 0xe67e , +0x0 , 0x0 , 0x0 , 0xe67c , +0x0 , 0x9740 , 0x8e90 , 0x0 , +0x0 , 0xe681 , 0x0 , 0xe67d , +0x0 , 0x0 , 0x0 , 0xe685 , +0x8f94 , 0x0 , 0x8cbf , 0x0 , +0x0 , 0x0 , 0x91f8 , 0x0 , +0x9664 , 0x8979 , 0x88e0 , 0x0 , +0x93a3 , 0x0 , 0x0 , 0xe689 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe688 , 0x0 , 0x93e4 , 0x0 , +0xe68d , 0x0 , 0x0 , 0x0 , +0xe682 , 0x0 , 0xe68c , 0xe68e , +0x0 , 0x8caa , 0xe68a , 0x8d75 , +0x0 , 0x8ed3 , 0x0 , 0x0 , +0xe68f , 0x9777 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe692 , 0x0 , +0xe695 , 0x0 , 0x0 , 0xe693 , +0x9554 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe690 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8bde , 0x0 , 0x0 , +0x0 , 0x0 , 0xe694 , 0x0 , +0x0 , 0xe696 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe69a , 0x0 , 0x0 , +0xe697 , 0x0 , 0xe699 , 0xe698 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe69b , 0x0 , +0x8eaf , 0x0 , 0xe69d , 0xe69c , +0x9588 , 0x0 , 0x0 , 0xe69f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8c78 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe69e , +0xe6a0 , 0x0 , 0x0 , 0xe6a1 , +0x8b63 , 0xe3bf , 0x8ff7 , 0x0 , +0xe6a2 , 0x0 , 0x0 , 0x8cec , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe6a3 , 0x0 , 0x0 , +0xe6a4 , 0x0 , 0x0 , 0x8e5d , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9dcc , 0x0 , +0xe6a5 , 0x0 , 0xe6a6 , 0x0 , +0x8f51 , 0x0 , 0xe6a7 , 0xe6a8 , +0x0 , 0x0 , 0xe6a9 , 0x0 , +0x0 , 0xe6aa , 0xe6ab , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x924a , +0x0 , 0x0 , 0xe6ac , 0x0 , +0x0 , 0x0 , 0x0 , 0xe6ae , +0x0 , 0xe6ad , 0x0 , 0x0 , +0x0 , 0x0 , 0x93a4 , 0x0 , +0xe6af , 0x0 , 0x964c , 0x0 , +0xe6b0 , 0x0 , 0xe6b1 , 0x0 , +0xe6b2 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe6b3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x93d8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8fdb , 0xe6b4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8d8b , 0x98ac , +0xe6b5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe6b6 , 0x955e , 0xe6b7 , 0x0 , +0xe6bf , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe6b8 , 0x0 , +0x0 , 0xe6ba , 0x0 , 0x0 , +0x0 , 0xe6b9 , 0xe6bb , 0x0 , +0x9665 , 0xe6bc , 0xe6bd , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe6be , 0x0 , 0x0 , 0x0 , +0xe6c0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8a4c , 0x92e5 , 0x0 , +0x9589 , 0x8de0 , 0x8d76 , 0x0 , +0x0 , 0x0 , 0x0 , 0x956e , +0x89dd , 0x94cc , 0xe6c3 , 0x8ad1 , +0x90d3 , 0xe6c2 , 0xe6c7 , 0x9299 , +0x96e1 , 0x0 , 0xe6c5 , 0xe6c6 , +0x8b4d , 0x0 , 0xe6c8 , 0x9483 , +0x91dd , 0x0 , 0x0 , 0x94ef , +0x935c , 0xe6c4 , 0x0 , 0x9666 , +0x89ea , 0xe6ca , 0x9847 , 0x92c0 , +0x9864 , 0x0 , 0x0 , 0x8e91 , +0xe6c9 , 0x0 , 0x91af , 0x0 , +0x0 , 0xe6da , 0x9147 , 0x0 , +0x0 , 0x93f6 , 0x0 , 0x956f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe6cd , 0x8e5e , +0x8e92 , 0x0 , 0x8fdc , 0x0 , +0x9485 , 0x0 , 0x8cab , 0xe6cc , +0xe6cb , 0x0 , 0x958a , 0x0 , +0x0 , 0x0 , 0x8ebf , 0x0 , +0x0 , 0x9371 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe6cf , 0xe6d0 , +0x8d77 , 0xe6ce , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe6d1 , 0xe6d2 , 0x0 , 0xe6d4 , +0x91a1 , 0x0 , 0xe6d3 , 0x8ae4 , +0x0 , 0xe6d6 , 0x0 , 0xe6d5 , +0xe6d7 , 0x0 , 0x0 , 0xe6d9 , +0xe6db , 0x0 , 0xe6dc , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x90d4 , 0x0 , 0x8ecd , 0xe6dd , +0x0 , 0x0 , 0x0 , 0x8a71 , +0x0 , 0xe6de , 0x0 , 0x0 , +0x9196 , 0xe6df , 0x0 , 0xe6e0 , +0x958b , 0x0 , 0x0 , 0x8b4e , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe6e1 , 0x0 , 0x0 , +0x0 , 0x92b4 , 0x0 , 0x0 , +0x0 , 0x0 , 0x897a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe6e2 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8eef , +0x0 , 0x0 , 0x0 , 0x0 , +0x9096 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x91ab , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe6e5 , 0x0 , +0x0 , 0x0 , 0xe6e4 , 0x0 , +0x0 , 0x0 , 0xe6e3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe6eb , +0xe6e9 , 0x0 , 0x0 , 0xe6e6 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe6e8 , 0x0 , +0x0 , 0x0 , 0xe6e7 , 0xe6ea , +0x0 , 0x8b97 , 0x0 , 0xe6ee , +0x0 , 0x90d5 , 0x0 , 0xe6ef , +0x0 , 0x0 , 0x0 , 0x0 , +0x8cd7 , 0x0 , 0xe6ec , 0xe6ed , +0x0 , 0x0 , 0x0 , 0x9848 , +0x0 , 0x0 , 0x0 , 0x92b5 , +0x0 , 0x9148 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe6f0 , 0x0 , 0x0 , 0xe6f3 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe6f1 , 0xe6f2 , 0x9778 , 0x0 , +0x0 , 0x0 , 0x0 , 0x93a5 , +0xe6f6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe6f4 , 0xe6f5 , 0xe6f7 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe748 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe6fa , 0x0 , 0x0 , 0x0 , +0xe6fb , 0xe6f9 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe6f8 , 0x0 , +0x92fb , 0x0 , 0x0 , 0xe740 , +0xe744 , 0xe741 , 0xe6fc , 0x0 , +0xe742 , 0x0 , 0x0 , 0x0 , +0xe743 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe74a , 0x0 , 0x0 , +0x0 , 0xe745 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x90d6 , +0xe747 , 0x0 , 0x0 , 0xe749 , +0xe746 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe74c , 0x0 , +0x8f52 , 0x0 , 0xe74b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe74d , 0x0 , 0x0 , 0x0 , +0x0 , 0xe74e , 0x0 , 0x0 , +0xe751 , 0xe750 , 0x0 , 0xe74f , +0x0 , 0x0 , 0xe753 , 0xe752 , +0x0 , 0x96f4 , 0x0 , 0x0 , +0x0 , 0xe755 , 0x0 , 0xe754 , +0xe756 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe757 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe759 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe758 , 0x9067 , +0xe75a , 0x0 , 0x0 , 0x8beb , +0xe75b , 0xe75d , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe75e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe75f , 0xe75c , 0x0 , +0xe760 , 0x0 , 0x8ed4 , 0xe761 , +0x8b4f , 0x8c52 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8cac , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe762 , +0x0 , 0x0 , 0x0 , 0x93ee , +0x0 , 0x0 , 0x935d , 0xe763 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe766 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8eb2 , 0x0 , 0x0 , 0xe765 , +0xe764 , 0x8c79 , 0xe767 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8a72 , +0x0 , 0xe769 , 0x0 , 0x0 , +0x0 , 0x8dda , 0xe768 , 0x0 , +0xe771 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe76b , 0xe76d , +0x95e3 , 0xe76a , 0x0 , 0x0 , +0x0 , 0xe76c , 0x0 , 0xe770 , +0xe76e , 0x8b50 , 0x0 , 0xe76f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe772 , 0x0 , +0x0 , 0x9479 , 0x97d6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8f53 , +0x0 , 0x0 , 0x0 , 0xe773 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9741 , 0xe775 , 0x0 , 0xe774 , +0x0 , 0x0 , 0xe778 , 0x9760 , +0x0 , 0x0 , 0xe777 , 0x0 , +0x8a8d , 0xe776 , 0xe77b , 0x0 , +0x0 , 0xe77a , 0x0 , 0x0 , +0xe779 , 0x9351 , 0xe77c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe77d , +0x0 , 0x0 , 0x0 , 0x0 , +0xe77e , 0x0 , 0x0 , 0x8d8c , +0x0 , 0x8c44 , 0xe780 , 0xe781 , +0xe782 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9068 , +0xe783 , 0x0 , 0x8eab , 0xe784 , +0x0 , 0x0 , 0x0 , 0xe785 , +0x0 , 0x0 , 0x0 , 0x999f , +0x999e , 0x0 , 0x0 , 0x0 , +0x0 , 0xe786 , 0xe390 , 0xe787 , +0x9243 , 0x904a , 0x945f , 0x0 , +0x0 , 0x0 , 0x0 , 0xe788 , +0x0 , 0x0 , 0x95d3 , 0x92d2 , +0x8d9e , 0x0 , 0x0 , 0x9248 , +0x0 , 0x0 , 0x8949 , 0x0 , +0x9698 , 0x9076 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8c7d , 0x0 , +0x0 , 0x8bdf , 0x0 , 0x0 , +0x95d4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe789 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe78b , 0x0 , +0x0 , 0xe78a , 0x89de , 0x0 , +0x0 , 0x93f4 , 0xe78c , 0x9497 , +0x0 , 0x9352 , 0x0 , 0xe78d , +0x8f71 , 0x0 , 0x0 , 0x0 , +0xe78f , 0x0 , 0x0 , 0x96c0 , +0xe79e , 0xe791 , 0xe792 , 0x0 , +0x0 , 0x92c7 , 0x0 , 0x0 , +0x91de , 0x9197 , 0x0 , 0x93a6 , +0x0 , 0xe790 , 0x8b74 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe799 , +0x0 , 0xe796 , 0xe7a3 , 0x93a7 , +0x9280 , 0xe793 , 0x0 , 0x92fc , +0x9372 , 0xe794 , 0xe798 , 0x9080 , +0x0 , 0x9487 , 0x92ca , 0x0 , +0x0 , 0x90c0 , 0xe797 , 0x91ac , +0x91a2 , 0xe795 , 0x88a7 , 0x9841 , +0x0 , 0x0 , 0x0 , 0xe79a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x91df , 0x0 , +0x0 , 0x8f54 , 0x9069 , 0x0 , +0x0 , 0xe79c , 0xe79b , 0x0 , +0x88ed , 0xe79d , 0x0 , 0x0 , +0x954e , 0x0 , 0xe7a5 , 0x0 , +0x0 , 0x93d9 , 0x908b , 0x0 , +0x0 , 0x9278 , 0x0 , 0x8bf6 , +0x0 , 0xe7a4 , 0x9756 , 0x895e , +0x0 , 0x95d5 , 0x89df , 0xe79f , +0xe7a0 , 0xe7a1 , 0xe7a2 , 0x93b9 , +0x9242 , 0x88e1 , 0xe7a6 , 0x0 , +0xe7a7 , 0xeaa1 , 0x0 , 0x0 , +0x91bb , 0x0 , 0xe7a8 , 0x0 , +0x8993 , 0x916b , 0x0 , 0x8cad , +0x0 , 0x9779 , 0x0 , 0x0 , +0xe7a9 , 0x934b , 0x0 , 0x0 , +0x0 , 0x9198 , 0x8ed5 , 0xe7aa , +0x0 , 0x0 , 0xe7ad , 0x0 , +0x0 , 0x8f85 , 0xe7ab , 0x914a , +0x9149 , 0x0 , 0x88e2 , 0x0 , +0x97c9 , 0xe7af , 0x0 , 0x94f0 , +0xe7b1 , 0xe7b0 , 0xe7ae , 0xe284 , +0x8ad2 , 0x0 , 0x0 , 0xe78e , +0x0 , 0xe7b3 , 0xe7b2 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe7b4 , +0x0 , 0x9757 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x93df , +0x0 , 0x0 , 0x964d , 0x0 , +0xe7b5 , 0x0 , 0x8ed7 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe7b6 , +0x0 , 0xe7b7 , 0x0 , 0x0 , +0x0 , 0xe7b8 , 0x0 , 0x0 , +0x9340 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x88e8 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8d78 , 0x0 , +0x0 , 0x0 , 0x9859 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe7bc , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8c53 , 0xe7b9 , 0x0 , +0xe7ba , 0x0 , 0x0 , 0x0 , +0x9594 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8a73 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9758 , 0x0 , 0x8bbd , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9373 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe7bd , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe7be , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe7bf , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9341 , 0x0 , 0x0 , +0xe7c1 , 0x0 , 0xe7c0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x93d1 , 0xe7c2 , 0x8f55 , +0x8ede , 0x947a , 0x9291 , 0x0 , +0x0 , 0x0 , 0x8ef0 , 0x0 , +0x908c , 0x0 , 0xe7c3 , 0x0 , +0xe7c4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x907c , 0xe7c5 , +0x0 , 0xe7c6 , 0x0 , 0x0 , +0x0 , 0xe7c7 , 0x978f , 0x0 , +0x8f56 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe7c9 , 0xe7c8 , +0x0 , 0x8d79 , 0x0 , 0x8d93 , +0x8e5f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe7cc , 0x0 , +0x0 , 0x0 , 0x0 , 0x8f86 , +0x0 , 0xe7cb , 0x0 , 0xe7ca , +0x0 , 0x91e7 , 0x0 , 0x0 , +0x8ced , 0x0 , 0x90c1 , 0x0 , +0x0 , 0x0 , 0x0 , 0x94ae , +0x0 , 0x0 , 0x0 , 0x0 , +0x8f58 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe7cd , 0x0 , +0x8fdd , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe7d0 , 0xe7ce , +0x0 , 0x0 , 0x0 , 0xe7cf , +0x0 , 0x0 , 0x0 , 0x0 , +0xe7d2 , 0xe7d1 , 0x0 , 0x0 , +0x8ff8 , 0x0 , 0xe7d3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe7d4 , 0xe7d5 , 0x0 , 0x0 , +0x0 , 0x0 , 0x94ce , 0x8dd1 , +0x8edf , 0xe7d6 , 0x0 , 0xe7d7 , +0x97a2 , 0x8f64 , 0x96ec , 0x97ca , +0xe7d8 , 0x8be0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe7d9 , 0x0 , +0x9342 , 0x0 , 0x0 , 0xe7dc , +0x8a98 , 0x906a , 0x0 , 0xe7da , +0x0 , 0xe7db , 0x0 , 0x92de , +0x0 , 0x0 , 0x9674 , 0x8bfa , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe7de , 0xe7df , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe7dd , 0x0 , 0x0 , 0xe7e1 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x93dd , 0x8a62 , 0x0 , +0x0 , 0xe7e5 , 0x0 , 0x0 , +0xe7e2 , 0xe7e4 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe7e0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe86e , 0x0 , 0x0 , +0xe7e3 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x97e9 , 0x0 , 0x0 , 0x8cd8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe7ed , +0x0 , 0x0 , 0x0 , 0x0 , +0x9353 , 0xe7e8 , 0x0 , 0x0 , +0xe7eb , 0xe7e9 , 0x0 , 0xe7ee , +0x0 , 0x0 , 0x0 , 0x0 , +0xe7ef , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe7e7 , +0x0 , 0x0 , 0xe7f4 , 0x8994 , +0x0 , 0x0 , 0xe7e6 , 0x0 , +0x0 , 0x0 , 0x94ab , 0x0 , +0xe7ea , 0x0 , 0x8fde , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8d7a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9667 , 0x0 , +0x8be2 , 0x0 , 0x0 , 0x8f65 , +0x0 , 0x93ba , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x914c , 0x0 , 0xe7f2 , +0x0 , 0xe7ec , 0xe7f1 , 0x0 , +0x96c1 , 0x0 , 0x92b6 , 0xe7f3 , +0xe7f0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x914b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe7f7 , +0x0 , 0xe7f6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe7f5 , +0x0 , 0x0 , 0x964e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8f9b , 0x0 , 0x0 , 0x0 , +0x0 , 0xe7f8 , 0x95dd , 0x0 , +0x0 , 0x8973 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9565 , 0x9292 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8b98 , 0x0 , 0xe7fa , 0x0 , +0x8d7c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8e4b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe7f9 , +0x908d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x908e , 0xe840 , 0xe842 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8ff9 , 0x0 , 0xe841 , 0xe843 , +0x0 , 0x0 , 0x8bd1 , 0x0 , +0x9564 , 0x0 , 0x0 , 0x8ee0 , +0x9842 , 0x0 , 0xe7fc , 0x8df6 , +0x0 , 0x0 , 0x985e , 0x0 , +0x0 , 0xe845 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe844 , 0xe846 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe7fb , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x93e7 , +0x0 , 0x9374 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x92d5 , 0x0 , 0xe84b , 0x0 , +0x0 , 0x0 , 0x0 , 0x9262 , +0xe847 , 0x0 , 0x0 , 0x0 , +0xe848 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8c4c , 0x0 , 0xe84a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8cae , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe849 , 0x0 , 0x8fdf , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8a99 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe84f , 0x0 , 0x8dbd , 0x9199 , +0x0 , 0x0 , 0x92c8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8a5a , +0x0 , 0x0 , 0x0 , 0x0 , +0xe84d , 0xe84e , 0x92c1 , 0x0 , +0xe84c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe850 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe856 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe859 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe858 , 0x934c , 0x0 , 0x0 , +0x0 , 0x0 , 0xe851 , 0xe852 , +0xe855 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe857 , 0x0 , 0x0 , +0x0 , 0x8bbe , 0x0 , 0x0 , +0xe85a , 0xe854 , 0x0 , 0x0 , +0xe853 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe85e , +0x0 , 0x0 , 0x0 , 0xe85f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe860 , 0x0 , 0x0 , 0xe85d , +0xe85c , 0x0 , 0x0 , 0x0 , +0x8fe0 , 0x93a8 , 0xe85b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe864 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe862 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe863 , 0xe861 , 0x0 , +0x91f6 , 0x0 , 0xe865 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe866 , 0x0 , 0x0 , +0xe868 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8ad3 , 0xe867 , 0x96f8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe873 , 0xe869 , +0x0 , 0x0 , 0xe86c , 0x0 , +0xe86a , 0x0 , 0xe86b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe86d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe86f , 0x0 , 0x0 , 0x0 , +0x0 , 0xe870 , 0x0 , 0xe871 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe874 , 0xe872 , 0xe875 , 0xe877 , +0x0 , 0xe876 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x92b7 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x96e5 , 0x0 , 0xe878 , 0x914d , +0x0 , 0x0 , 0x0 , 0xe879 , +0x0 , 0x95c2 , 0xe87a , 0x8a4a , +0x0 , 0x0 , 0x0 , 0x895b , +0x0 , 0x8ad5 , 0x0 , 0x8ad4 , +0xe87b , 0x0 , 0xe87c , 0x0 , +0xe87d , 0xe87e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe880 , 0x0 , 0x8ad6 , 0x8a74 , +0x8d7d , 0x94b4 , 0x0 , 0xe882 , +0xe881 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe883 , 0x0 , 0x0 , +0x0 , 0x0 , 0x897b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe886 , 0x0 , 0xe885 , +0xe884 , 0x0 , 0xe887 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe88a , +0x0 , 0x0 , 0x0 , 0x88c5 , +0x0 , 0x0 , 0xe888 , 0x0 , +0xe88c , 0xe88b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe88e , 0xe88d , 0xe88f , 0x0 , +0x93ac , 0x0 , 0x0 , 0x0 , +0xe890 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe891 , 0xe893 , 0x0 , +0x0 , 0xe892 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x958c , 0x0 , 0x0 , 0x0 , +0x0 , 0xe894 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe895 , 0x0 , 0x8de3 , 0x0 , +0x0 , 0x0 , 0xe896 , 0xe897 , +0x0 , 0x0 , 0x9668 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x916a , +0x0 , 0x0 , 0x0 , 0x88a2 , +0x91c9 , 0x0 , 0xe898 , 0x0 , +0x958d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe89b , +0xe899 , 0x8d7e , 0x0 , 0xe89a , +0x8cc0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x95c3 , +0xe89d , 0xe89f , 0xe89e , 0xe8a0 , +0x0 , 0x0 , 0x8940 , 0x9077 , +0x8f9c , 0x8ad7 , 0xe8a1 , 0x0 , +0x0 , 0x0 , 0x9486 , 0x0 , +0xe8a3 , 0x0 , 0x0 , 0x0 , +0x8941 , 0x0 , 0xe8a2 , 0x92c2 , +0x0 , 0x97cb , 0x93a9 , 0xe89c , +0x97a4 , 0x0 , 0x8caf , 0x0 , +0x0 , 0x977a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8bf7 , 0x97b2 , 0x0 , +0x8c47 , 0x0 , 0x91e0 , 0xe440 , +0x0 , 0xe8a4 , 0x8a4b , 0x908f , +0x0 , 0x0 , 0x0 , 0x0 , +0x8a75 , 0xe8a6 , 0x0 , 0xe8a7 , +0xe8a5 , 0x8c84 , 0x0 , 0x8ddb , +0x8fe1 , 0x0 , 0x0 , 0x0 , +0x8942 , 0x0 , 0x0 , 0x97d7 , +0x0 , 0x0 , 0x0 , 0xe8a9 , +0xe7ac , 0x0 , 0xe8a8 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe8ac , 0xe8aa , 0xe8ab , 0x0 , +0xe8ad , 0x0 , 0xe8ae , 0x97ea , +0xe8af , 0xe8b0 , 0x0 , 0x90c7 , +0x94b9 , 0x0 , 0x0 , 0x0 , +0x909d , 0x8ae5 , 0x0 , 0x0 , +0x9759 , 0x89eb , 0x8f57 , 0x8cd9 , +0x0 , 0xe8b3 , 0x0 , 0xe8b2 , +0x8e93 , 0xe8b4 , 0xe8b1 , 0x0 , +0x0 , 0x8e47 , 0x0 , 0x0 , +0x0 , 0xe8b8 , 0xe5ab , 0x0 , +0x0 , 0x99d4 , 0x0 , 0x9097 , +0xe8b6 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x97a3 , 0x93ef , +0x0 , 0x0 , 0x0 , 0x0 , +0x894a , 0x0 , 0x90e1 , 0x8eb4 , +0x0 , 0x0 , 0x0 , 0x0 , +0x95b5 , 0x0 , 0x895f , 0x0 , +0x0 , 0x0 , 0x97eb , 0x978b , +0x0 , 0xe8b9 , 0x0 , 0x9364 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8ef9 , 0x0 , 0x0 , 0x0 , +0xe8ba , 0x0 , 0xe8bb , 0x906b , +0xe8bc , 0x0 , 0x97ec , 0x0 , +0x0 , 0xe8b7 , 0xe8be , 0xe8c0 , +0x0 , 0xe8bf , 0x0 , 0xe8bd , +0x0 , 0x0 , 0xe8c1 , 0x0 , +0x0 , 0xe8c2 , 0x0 , 0x0 , +0x919a , 0x0 , 0x89e0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe8c3 , 0x0 , 0x0 , 0x96b6 , +0x0 , 0x0 , 0xe8c4 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe8c5 , 0x0 , 0x9849 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9e50 , 0xe8c6 , 0x0 , 0x0 , +0x0 , 0xe8c7 , 0xe8c8 , 0x0 , +0x0 , 0x0 , 0xe8cc , 0x0 , +0xe8c9 , 0x0 , 0xe8ca , 0x0 , +0xe8cb , 0xe8cd , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x90c2 , 0x0 , +0x0 , 0x0 , 0x96f5 , 0x0 , +0x0 , 0x90c3 , 0x0 , 0x0 , +0xe8ce , 0x0 , 0x94f1 , 0x0 , +0xe8cf , 0xea72 , 0x96ca , 0x0 , +0xe8d0 , 0x0 , 0xe8d1 , 0x0 , +0xe8d2 , 0x8a76 , 0x0 , 0xe8d4 , +0x0 , 0x9078 , 0x0 , 0x0 , +0x0 , 0xe8d5 , 0x0 , 0x0 , +0x8c43 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe8d6 , 0xe8da , 0x0 , +0xe8d8 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe8d9 , 0x0 , 0x0 , +0x8a93 , 0xe8d7 , 0xe8db , 0x0 , +0x0 , 0x0 , 0x0 , 0xe8dc , +0x0 , 0x88c6 , 0x0 , 0xe8dd , +0xe8de , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8fe2 , 0x0 , 0x0 , 0x0 , +0xe8df , 0x0 , 0x0 , 0x0 , +0x8b66 , 0x0 , 0x0 , 0xe8e2 , +0x0 , 0x0 , 0xe8e1 , 0x0 , +0xe8e0 , 0x0 , 0x0 , 0xe691 , +0x0 , 0x95da , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe8e3 , +0xe8e4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe8e5 , +0x0 , 0x0 , 0xe8e6 , 0x0 , +0xe8e7 , 0x0 , 0x0 , 0xe8e8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8ad8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe8e9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe8ea , 0x9442 , 0x0 , +0x0 , 0x0 , 0xe8ec , 0x89b9 , +0x0 , 0xe8ef , 0xe8ee , 0x0 , +0x0 , 0x0 , 0x0 , 0x8943 , +0x0 , 0x0 , 0x0 , 0x8bbf , +0x0 , 0x95c5 , 0x92b8 , 0x8da0 , +0x0 , 0x8d80 , 0x8f87 , 0x0 , +0x907b , 0x0 , 0x0 , 0x0 , +0xe8f1 , 0x0 , 0x0 , 0xe8f0 , +0x9761 , 0x8ae6 , 0x94d0 , 0x93da , +0x0 , 0x0 , 0x0 , 0x909c , +0x97cc , 0x0 , 0x8c7a , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe8f4 , 0x0 , 0x0 , +0xe8f3 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x966a , 0x93aa , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x896f , 0x0 , 0x0 , 0xe8f5 , +0xe8f2 , 0x0 , 0x0 , 0x9570 , +0x978a , 0xe8f6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe8f7 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe8f9 , +0x91e8 , 0x8a7a , 0x8a7b , 0xe8f8 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8ae7 , 0x8cb0 , 0x0 , 0x0 , +0x8ae8 , 0x0 , 0x0 , 0x935e , +0x0 , 0x0 , 0x97de , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8cda , +0x0 , 0x0 , 0x0 , 0xe8fa , +0x0 , 0x0 , 0x0 , 0xe8fb , +0xe8fc , 0xe940 , 0x0 , 0xe942 , +0xe941 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9597 , 0x0 , 0xe943 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe944 , +0x0 , 0xe945 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe946 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe948 , +0xe947 , 0x0 , 0xe949 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x94f2 , +0xe3ca , 0x0 , 0x0 , 0x9048 , +0x0 , 0x0 , 0x8b51 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe94a , 0x0 , 0xe94b , +0x0 , 0x99aa , 0x9f5a , 0x94d1 , +0x0 , 0x0 , 0x88f9 , 0x0 , +0x88b9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8e94 , 0x964f , 0x8ffc , 0x0 , +0x0 , 0x0 , 0x0 , 0xe94c , +0x0 , 0x96dd , 0x0 , 0x0 , +0x0 , 0xe94d , 0x977b , 0x0 , +0x8961 , 0x0 , 0x0 , 0x0 , +0x8e60 , 0x0 , 0xe94e , 0x89ec , +0xe94f , 0x0 , 0x0 , 0x0 , +0xe950 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe952 , 0xe953 , 0x0 , +0xe955 , 0xe951 , 0x0 , 0x0 , +0xe954 , 0x0 , 0x0 , 0x0 , +0x8ad9 , 0x0 , 0x0 , 0x0 , +0xe956 , 0x0 , 0xe957 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe958 , 0xe959 , 0x0 , +0x0 , 0x0 , 0xe95a , 0x0 , +0x0 , 0xe95c , 0x0 , 0x0 , +0x0 , 0xe95b , 0x0 , 0xe95e , +0xe961 , 0x0 , 0x0 , 0x0 , +0xe95d , 0xe95f , 0xe960 , 0x0 , +0x0 , 0xe962 , 0x0 , 0x8bc0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8ef1 , 0xe963 , +0xe964 , 0x8d81 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe965 , 0x0 , 0x0 , +0x8a5d , 0x0 , 0x0 , 0x0 , +0x946e , 0xe966 , 0xe967 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9279 , +0x93e9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe968 , 0x0 , 0x0 , 0x0 , +0x0 , 0x949d , 0x0 , 0x0 , +0x91ca , 0x8977 , 0x8bec , 0x0 , +0x8bed , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9293 , 0xe96d , 0x8bee , 0x0 , +0x0 , 0x89ed , 0x0 , 0x0 , +0xe96c , 0x0 , 0x0 , 0xe96a , +0x0 , 0xe96b , 0x0 , 0xe969 , +0x0 , 0x0 , 0xe977 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe96e , 0xe96f , 0x0 , +0x0 , 0xe970 , 0xe971 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe973 , 0x0 , 0x0 , 0xe972 , +0x0 , 0x0 , 0x0 , 0x8f78 , +0x0 , 0xe974 , 0x0 , 0x0 , +0x0 , 0xe976 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x8b52 , 0xe975 , +0x0 , 0x0 , 0x919b , 0x8cb1 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe978 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x91cb , 0x0 , 0x0 , 0xe979 , +0x0 , 0x0 , 0x0 , 0x0 , +0x93ab , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe97a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe980 , 0x0 , +0xe97d , 0x0 , 0xe97c , 0xe97e , +0x0 , 0xe97b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe982 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe981 , 0x0 , 0xe984 , +0x0 , 0x0 , 0x8bc1 , 0xe983 , +0x0 , 0x0 , 0x0 , 0xe985 , +0x0 , 0x0 , 0xe986 , 0x0 , +0xe988 , 0xe987 , 0x0 , 0x0 , +0x0 , 0xe989 , 0xe98b , 0xe98a , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8d9c , 0x0 , 0x0 , 0x0 , +0x0 , 0xe98c , 0x0 , 0x0 , +0xe98d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8a5b , 0x0 , 0x0 , 0x0 , +0xe98e , 0x0 , 0x0 , 0x0 , +0xe98f , 0x0 , 0x0 , 0x0 , +0x9091 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe990 , +0x0 , 0xe991 , 0x0 , 0xe992 , +0xe993 , 0x0 , 0x0 , 0x0 , +0x8d82 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe994 , 0xe995 , +0x0 , 0x0 , 0xe996 , 0xe997 , +0x0 , 0x0 , 0xe998 , 0x0 , +0x0 , 0x0 , 0x94af , 0xe99a , +0x0 , 0x9545 , 0xe99b , 0xe999 , +0x0 , 0xe99d , 0x0 , 0x0 , +0xe99c , 0x0 , 0x0 , 0xe99e , +0x0 , 0x0 , 0x0 , 0xe99f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe9a0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe9a1 , 0x0 , 0xe9a2 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe9a3 , +0x0 , 0x0 , 0xe9a4 , 0xe9a5 , +0x0 , 0xe9a6 , 0x0 , 0xe9a7 , +0xe9a8 , 0xe9a9 , 0xe9aa , 0x0 , +0x0 , 0x0 , 0xe9ab , 0xe9ac , +0x0 , 0x9f54 , 0xe9ad , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe2f6 , +0x8b53 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8a40 , 0x8db0 , 0xe9af , +0xe9ae , 0x96a3 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe9b1 , 0xe9b2 , 0xe9b0 , +0x0 , 0xe9b3 , 0x0 , 0x0 , +0x9682 , 0x0 , 0x0 , 0x0 , +0xe9b4 , 0x0 , 0x8b9b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9844 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe9b5 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe9b7 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x88bc , 0x0 , +0x0 , 0xe9b8 , 0x95a9 , 0xe9b6 , +0x0 , 0x0 , 0xe9b9 , 0xe9ba , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe9bb , +0xe9bc , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe9bd , 0x0 , 0x968e , 0x8e4c , +0x0 , 0x8df8 , 0x914e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe9be , 0x0 , 0x0 , 0x0 , +0x0 , 0xe9c1 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe9bf , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe9c2 , 0x0 , +0x0 , 0x8cef , 0xe9c0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe9c3 , +0x0 , 0xe9c4 , 0xe9c5 , 0x0 , +0xe9c9 , 0x0 , 0x8e49 , 0x0 , +0x0 , 0x0 , 0x0 , 0x91e2 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe9ca , 0xe9c7 , 0xe9c6 , +0xe9c8 , 0x0 , 0x0 , 0x0 , +0x8c7e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe9ce , 0xe9cd , 0xe9cc , 0x0 , +0x0 , 0x88b1 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe9d8 , 0x0 , 0xe9d4 , 0x0 , +0xe9d5 , 0xe9d1 , 0xe9d7 , 0x0 , +0xe9d3 , 0x8a82 , 0x0 , 0x0 , +0x986b , 0x0 , 0xe9d6 , 0xe9d2 , +0xe9d0 , 0xe9cf , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe9da , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xe9dd , 0x0 , 0x0 , +0xe9dc , 0xe9db , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x9568 , 0xe9d9 , 0x88f1 , +0xe9de , 0x0 , 0xe9e0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8a8f , 0xe9cb , 0x8956 , +0x0 , 0x0 , 0xe9e2 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe9e1 , 0xe9df , +0x924c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9690 , 0x0 , +0x0 , 0x0 , 0x0 , 0x97d8 , +0x0 , 0x0 , 0xe9e3 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xe9e4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe9e5 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xe9e6 , 0x0 , +0xe9e7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x92b9 , 0x0 , 0xe9e8 , +0x0 , 0x94b5 , 0x0 , 0xe9ed , +0xe9e9 , 0x0 , 0x0 , 0x0 , +0xe9ea , 0x0 , 0x0 , 0x9650 , +0x96c2 , 0x0 , 0x93ce , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xe9ee , +0x0 , 0x0 , 0xe9ef , 0x93bc , +0xe9ec , 0xe9eb , 0x0 , 0x0 , +0x0 , 0x0 , 0x89a8 , 0x0 , +0x0 , 0x0 , 0xe9f7 , 0x0 , +0x0 , 0xe9f6 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8995 , +0x0 , 0x0 , 0x0 , 0xe9f4 , +0x0 , 0x0 , 0x0 , 0xe9f3 , +0x0 , 0x0 , 0xe9f1 , 0x0 , +0x8a9b , 0x0 , 0xe9f0 , 0x8eb0 , +0x89a7 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8d83 , +0x0 , 0x0 , 0xe9fa , 0xe9f9 , +0x0 , 0xe9f8 , 0x0 , 0x0 , +0xe9f5 , 0x0 , 0xe9fb , 0x0 , +0xe9fc , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xea44 , 0xea43 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xea45 , 0x0 , 0x0 , +0x894c , 0xea40 , 0xea41 , 0x0 , +0x8d94 , 0x96b7 , 0x0 , 0x0 , +0xea42 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9651 , 0x0 , 0x0 , 0xea4a , +0x0 , 0x0 , 0xea46 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xea4b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xea48 , +0x0 , 0xea47 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8c7b , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xea4c , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xea4d , 0x0 , 0x0 , 0x0 , +0x0 , 0xea4e , 0x0 , 0xea49 , +0x0 , 0x0 , 0x0 , 0xe9f2 , +0x0 , 0x0 , 0xea4f , 0x0 , +0x92df , 0x0 , 0x0 , 0x0 , +0xea53 , 0x0 , 0xea54 , 0xea52 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xea51 , 0xea57 , 0x0 , +0xea50 , 0x0 , 0xea55 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xea56 , +0x0 , 0x0 , 0x0 , 0xea59 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xea58 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xea5b , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xea5c , 0x0 , 0xea5d , +0x0 , 0x0 , 0x9868 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xea5a , 0x91e9 , 0x8deb , 0x0 , +0x0 , 0xea5e , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xea5f , 0xea60 , +0x0 , 0x0 , 0xea61 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xea62 , 0x0 , 0x0 , +0x8cb2 , 0xea63 , 0x0 , 0x0 , +0x0 , 0xea64 , 0x0 , 0x8ead , +0x0 , 0xea65 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xea66 , 0x0 , 0x0 , 0xea67 , +0xea68 , 0x0 , 0x0 , 0x0 , +0x0 , 0xea6b , 0xea69 , 0x985b , +0x0 , 0xea6a , 0x0 , 0x97ed , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xea6c , 0x0 , 0x97d9 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xea6d , 0x949e , 0x0 , +0x0 , 0xea6e , 0xea70 , 0x0 , +0x0 , 0xea71 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xea6f , 0x8d8d , 0x96cb , 0x9683 , +0x9bf5 , 0x0 , 0x9f80 , 0x969b , +0x0 , 0x0 , 0x0 , 0x0 , +0x89a9 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xea73 , 0x8b6f , 0xea74 , 0xea75 , +0xea76 , 0x0 , 0x8d95 , 0x0 , +0xea77 , 0x0 , 0x0 , 0x0 , +0xe0d2 , 0x96d9 , 0x0 , 0x91e1 , +0xea78 , 0xea7a , 0xea79 , 0x0 , +0xea7b , 0x0 , 0x0 , 0x0 , +0x0 , 0xea7c , 0x0 , 0x0 , +0xea7d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xea7e , +0x0 , 0x0 , 0x0 , 0x0 , +0xea80 , 0x0 , 0xea81 , 0xea82 , +0x0 , 0xea83 , 0x0 , 0xea84 , +0xea85 , 0xea86 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xea87 , +0xea88 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x9343 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8cdb , +0x0 , 0xea8a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x916c , 0xea8b , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xea8c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x9540 , +0x0 , 0x0 , 0xea8d , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xea8e , 0xe256 , +0x0 , 0x0 , 0xe6d8 , 0xe8eb , +0x0 , 0x0 , 0xea8f , 0x0 , +0xea90 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xea92 , +0xea93 , 0xea94 , 0x97ee , 0xea91 , +0x0 , 0x0 , 0xea95 , 0xea96 , +0x0 , 0x0 , 0xea98 , 0x0 , +0xea97 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0xea9a , 0x0 , +0x0 , 0x0 , 0xea9b , 0xea99 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x97b4 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xea9c , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xea9d , 0xe273 , 0x0 , 0x0 , +0xea9e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x8149 , 0xa1ed , 0x8194 , +0x8190 , 0x8193 , 0x8195 , 0xa1ec , +0x8169 , 0x816a , 0x8196 , 0x817b , +0x8143 , 0xa1dd , 0x8144 , 0x815e , +0x824f , 0x8250 , 0x8251 , 0x8252 , +0x8253 , 0x8254 , 0x8255 , 0x8256 , +0x8257 , 0x8258 , 0x8146 , 0x8147 , +0x8183 , 0x8181 , 0x8184 , 0x8148 , +0x8197 , 0x8260 , 0x8261 , 0x8262 , +0x8263 , 0x8264 , 0x8265 , 0x8266 , +0x8267 , 0x8268 , 0x8269 , 0x826a , +0x826b , 0x826c , 0x826d , 0x826e , +0x826f , 0x8270 , 0x8271 , 0x8272 , +0x8273 , 0x8274 , 0x8275 , 0x8276 , +0x8277 , 0x8278 , 0x8279 , 0x816d , +0xa1a1 , 0x816e , 0x814f , 0x8151 , +0x814d , 0x8281 , 0x8282 , 0x8283 , +0x8284 , 0x8285 , 0x8286 , 0x8287 , +0x8288 , 0x8289 , 0x828a , 0x828b , +0x828c , 0x828d , 0x828e , 0x828f , +0x8290 , 0x8291 , 0x8292 , 0x8293 , +0x8294 , 0x8295 , 0x8296 , 0x8297 , +0x8298 , 0x8299 , 0x829a , 0x816f , +0x8162 , 0x8170 , 0x223d , 0xa1a1 , +0x0 , 0xa1 , 0xa2 , 0xa3 , +0xa4 , 0xa5 , 0xa6 , 0xa7 , +0xa8 , 0xa9 , 0xaa , 0xab , +0xac , 0xad , 0xae , 0xaf , +0xb0 , 0xb1 , 0xb2 , 0xb3 , +0xb4 , 0xb5 , 0xb6 , 0xb7 , +0xb8 , 0xb9 , 0xba , 0xbb , +0xbc , 0xbd , 0xbe , 0xbf , +0xc0 , 0xc1 , 0xc2 , 0xc3 , +0xc4 , 0xc5 , 0xc6 , 0xc7 , +0xc8 , 0xc9 , 0xca , 0xcb , +0xcc , 0xcd , 0xce , 0xcf , +0xd0 , 0xd1 , 0xd2 , 0xd3 , +0xd4 , 0xd5 , 0xd6 , 0xd7 , +0xd8 , 0xd9 , 0xda , 0xdb , +0xdc , 0xdd , 0xde , 0xdf , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x8150 , +0x0 , 0x818f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +} ; +static char16 sjisuni [65536] = { +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x20 , 0x21 , 0x22 , 0x23 , +0x24 , 0x25 , 0x26 , 0x27 , +0x28 , 0x29 , 0x2a , 0x2b , +0x2c , 0x2d , 0x2e , 0x2f , +0x30 , 0x31 , 0x32 , 0x33 , +0x34 , 0x35 , 0x36 , 0x37 , +0x38 , 0x39 , 0x3a , 0x3b , +0x3c , 0x3d , 0x3e , 0x3f , +0x40 , 0x41 , 0x42 , 0x43 , +0x44 , 0x45 , 0x46 , 0x47 , +0x48 , 0x49 , 0x4a , 0x4b , +0x4c , 0x4d , 0x4e , 0x4f , +0x50 , 0x51 , 0x52 , 0x53 , +0x54 , 0x55 , 0x56 , 0x57 , +0x58 , 0x59 , 0x5a , 0x5b , +0xa5 , 0x5d , 0x5e , 0x5f , +0x60 , 0x61 , 0x62 , 0x63 , +0x64 , 0x65 , 0x66 , 0x67 , +0x68 , 0x69 , 0x6a , 0x6b , +0x6c , 0x6d , 0x6e , 0x6f , +0x70 , 0x71 , 0x72 , 0x73 , +0x74 , 0x75 , 0x76 , 0x77 , +0x78 , 0x79 , 0x7a , 0x7b , +0x7c , 0x7d , 0x203e , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xff61 , 0xff62 , 0xff63 , +0xff64 , 0xff65 , 0xff66 , 0xff67 , +0xff68 , 0xff69 , 0xff6a , 0xff6b , +0xff6c , 0xff6d , 0xff6e , 0xff6f , +0xff70 , 0xff71 , 0xff72 , 0xff73 , +0xff74 , 0xff75 , 0xff76 , 0xff77 , +0xff78 , 0xff79 , 0xff7a , 0xff7b , +0xff7c , 0xff7d , 0xff7e , 0xff7f , +0xff80 , 0xff81 , 0xff82 , 0xff83 , +0xff84 , 0xff85 , 0xff86 , 0xff87 , +0xff88 , 0xff89 , 0xff8a , 0xff8b , +0xff8c , 0xff8d , 0xff8e , 0xff8f , +0xff90 , 0xff91 , 0xff92 , 0xff93 , +0xff94 , 0xff95 , 0xff96 , 0xff97 , +0xff98 , 0xff99 , 0xff9a , 0xff9b , +0xff9c , 0xff9d , 0xff9e , 0xff9f , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x3000 , 0x3001 , 0x3002 , 0xff0c , +0xff0e , 0x30fb , 0xff1a , 0xff1b , +0xff1f , 0xff01 , 0x309b , 0x309c , +0xb4 , 0xff40 , 0xa8 , 0xff3e , +0xffe3 , 0xff3f , 0x30fd , 0x30fe , +0x309d , 0x309e , 0x3003 , 0x4edd , +0x3005 , 0x3006 , 0x3007 , 0x30fc , +0x2015 , 0x2010 , 0xff0f , 0x5c , +0x301c , 0x2016 , 0xff5c , 0x2026 , +0x2025 , 0x2018 , 0x2019 , 0x201c , +0x201d , 0xff08 , 0xff09 , 0x3014 , +0x3015 , 0xff3b , 0xff3d , 0xff5b , +0xff5d , 0x3008 , 0x3009 , 0x300a , +0x300b , 0x300c , 0x300d , 0x300e , +0x300f , 0x3010 , 0x3011 , 0xff0b , +0x2212 , 0xb1 , 0xd7 , 0x0 , +0xf7 , 0xff1d , 0x2260 , 0xff1c , +0xff1e , 0x2266 , 0x2267 , 0x221e , +0x2234 , 0x2642 , 0x2640 , 0xb0 , +0x2032 , 0x2033 , 0x2103 , 0xffe5 , +0xff04 , 0xa2 , 0xa3 , 0xff05 , +0xff03 , 0xff06 , 0xff0a , 0xff20 , +0xa7 , 0x2606 , 0x2605 , 0x25cb , +0x25cf , 0x25ce , 0x25c7 , 0x25c6 , +0x25a1 , 0x25a0 , 0x25b3 , 0x25b2 , +0x25bd , 0x25bc , 0x203b , 0x3012 , +0x2192 , 0x2190 , 0x2191 , 0x2193 , +0x3013 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2208 , 0x220b , 0x2286 , 0x2287 , +0x2282 , 0x2283 , 0x222a , 0x2229 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x2227 , 0x2228 , 0xac , 0x21d2 , +0x21d4 , 0x2200 , 0x2203 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x2220 , 0x22a5 , +0x2312 , 0x2202 , 0x2207 , 0x2261 , +0x2252 , 0x226a , 0x226b , 0x221a , +0x223d , 0x221d , 0x2235 , 0x222b , +0x222c , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x212b , 0x2030 , 0x266f , 0x266d , +0x266a , 0x2020 , 0x2021 , 0xb6 , +0x0 , 0x0 , 0x0 , 0x0 , +0x25ef , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0xff10 , +0xff11 , 0xff12 , 0xff13 , 0xff14 , +0xff15 , 0xff16 , 0xff17 , 0xff18 , +0xff19 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0xff21 , 0xff22 , 0xff23 , 0xff24 , +0xff25 , 0xff26 , 0xff27 , 0xff28 , +0xff29 , 0xff2a , 0xff2b , 0xff2c , +0xff2d , 0xff2e , 0xff2f , 0xff30 , +0xff31 , 0xff32 , 0xff33 , 0xff34 , +0xff35 , 0xff36 , 0xff37 , 0xff38 , +0xff39 , 0xff3a , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0xff41 , 0xff42 , 0xff43 , +0xff44 , 0xff45 , 0xff46 , 0xff47 , +0xff48 , 0xff49 , 0xff4a , 0xff4b , +0xff4c , 0xff4d , 0xff4e , 0xff4f , +0xff50 , 0xff51 , 0xff52 , 0xff53 , +0xff54 , 0xff55 , 0xff56 , 0xff57 , +0xff58 , 0xff59 , 0xff5a , 0x0 , +0x0 , 0x0 , 0x0 , 0x3041 , +0x3042 , 0x3043 , 0x3044 , 0x3045 , +0x3046 , 0x3047 , 0x3048 , 0x3049 , +0x304a , 0x304b , 0x304c , 0x304d , +0x304e , 0x304f , 0x3050 , 0x3051 , +0x3052 , 0x3053 , 0x3054 , 0x3055 , +0x3056 , 0x3057 , 0x3058 , 0x3059 , +0x305a , 0x305b , 0x305c , 0x305d , +0x305e , 0x305f , 0x3060 , 0x3061 , +0x3062 , 0x3063 , 0x3064 , 0x3065 , +0x3066 , 0x3067 , 0x3068 , 0x3069 , +0x306a , 0x306b , 0x306c , 0x306d , +0x306e , 0x306f , 0x3070 , 0x3071 , +0x3072 , 0x3073 , 0x3074 , 0x3075 , +0x3076 , 0x3077 , 0x3078 , 0x3079 , +0x307a , 0x307b , 0x307c , 0x307d , +0x307e , 0x307f , 0x3080 , 0x3081 , +0x3082 , 0x3083 , 0x3084 , 0x3085 , +0x3086 , 0x3087 , 0x3088 , 0x3089 , +0x308a , 0x308b , 0x308c , 0x308d , +0x308e , 0x308f , 0x3090 , 0x3091 , +0x3092 , 0x3093 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x30a1 , 0x30a2 , 0x30a3 , 0x30a4 , +0x30a5 , 0x30a6 , 0x30a7 , 0x30a8 , +0x30a9 , 0x30aa , 0x30ab , 0x30ac , +0x30ad , 0x30ae , 0x30af , 0x30b0 , +0x30b1 , 0x30b2 , 0x30b3 , 0x30b4 , +0x30b5 , 0x30b6 , 0x30b7 , 0x30b8 , +0x30b9 , 0x30ba , 0x30bb , 0x30bc , +0x30bd , 0x30be , 0x30bf , 0x30c0 , +0x30c1 , 0x30c2 , 0x30c3 , 0x30c4 , +0x30c5 , 0x30c6 , 0x30c7 , 0x30c8 , +0x30c9 , 0x30ca , 0x30cb , 0x30cc , +0x30cd , 0x30ce , 0x30cf , 0x30d0 , +0x30d1 , 0x30d2 , 0x30d3 , 0x30d4 , +0x30d5 , 0x30d6 , 0x30d7 , 0x30d8 , +0x30d9 , 0x30da , 0x30db , 0x30dc , +0x30dd , 0x30de , 0x30df , 0x0 , +0x30e0 , 0x30e1 , 0x30e2 , 0x30e3 , +0x30e4 , 0x30e5 , 0x30e6 , 0x30e7 , +0x30e8 , 0x30e9 , 0x30ea , 0x30eb , +0x30ec , 0x30ed , 0x30ee , 0x30ef , +0x30f0 , 0x30f1 , 0x30f2 , 0x30f3 , +0x30f4 , 0x30f5 , 0x30f6 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x391 , +0x392 , 0x393 , 0x394 , 0x395 , +0x396 , 0x397 , 0x398 , 0x399 , +0x39a , 0x39b , 0x39c , 0x39d , +0x39e , 0x39f , 0x3a0 , 0x3a1 , +0x3a3 , 0x3a4 , 0x3a5 , 0x3a6 , +0x3a7 , 0x3a8 , 0x3a9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x3b1 , +0x3b2 , 0x3b3 , 0x3b4 , 0x3b5 , +0x3b6 , 0x3b7 , 0x3b8 , 0x3b9 , +0x3ba , 0x3bb , 0x3bc , 0x3bd , +0x3be , 0x3bf , 0x3c0 , 0x3c1 , +0x3c3 , 0x3c4 , 0x3c5 , 0x3c6 , +0x3c7 , 0x3c8 , 0x3c9 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x410 , 0x411 , 0x412 , 0x413 , +0x414 , 0x415 , 0x401 , 0x416 , +0x417 , 0x418 , 0x419 , 0x41a , +0x41b , 0x41c , 0x41d , 0x41e , +0x41f , 0x420 , 0x421 , 0x422 , +0x423 , 0x424 , 0x425 , 0x426 , +0x427 , 0x428 , 0x429 , 0x42a , +0x42b , 0x42c , 0x42d , 0x42e , +0x42f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x430 , 0x431 , 0x432 , 0x433 , +0x434 , 0x435 , 0x451 , 0x436 , +0x437 , 0x438 , 0x439 , 0x43a , +0x43b , 0x43c , 0x43d , 0x0 , +0x43e , 0x43f , 0x440 , 0x441 , +0x442 , 0x443 , 0x444 , 0x445 , +0x446 , 0x447 , 0x448 , 0x449 , +0x44a , 0x44b , 0x44c , 0x44d , +0x44e , 0x44f , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x2500 , +0x2502 , 0x250c , 0x2510 , 0x2518 , +0x2514 , 0x251c , 0x252c , 0x2524 , +0x2534 , 0x253c , 0x2501 , 0x2503 , +0x250f , 0x2513 , 0x251b , 0x2517 , +0x2523 , 0x2533 , 0x252b , 0x253b , +0x254b , 0x2520 , 0x252f , 0x2528 , +0x2537 , 0x253f , 0x251d , 0x2530 , +0x2525 , 0x2538 , 0x2542 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x4e9c , +0x5516 , 0x5a03 , 0x963f , 0x54c0 , +0x611b , 0x6328 , 0x59f6 , 0x9022 , +0x8475 , 0x831c , 0x7a50 , 0x60aa , +0x63e1 , 0x6e25 , 0x65ed , 0x8466 , +0x82a6 , 0x9bf5 , 0x6893 , 0x5727 , +0x65a1 , 0x6271 , 0x5b9b , 0x59d0 , +0x867b , 0x98f4 , 0x7d62 , 0x7dbe , +0x9b8e , 0x6216 , 0x7c9f , 0x88b7 , +0x5b89 , 0x5eb5 , 0x6309 , 0x6697 , +0x6848 , 0x95c7 , 0x978d , 0x674f , +0x4ee5 , 0x4f0a , 0x4f4d , 0x4f9d , +0x5049 , 0x56f2 , 0x5937 , 0x59d4 , +0x5a01 , 0x5c09 , 0x60df , 0x610f , +0x6170 , 0x6613 , 0x6905 , 0x70ba , +0x754f , 0x7570 , 0x79fb , 0x7dad , +0x7def , 0x80c3 , 0x840e , 0x8863 , +0x8b02 , 0x9055 , 0x907a , 0x533b , +0x4e95 , 0x4ea5 , 0x57df , 0x80b2 , +0x90c1 , 0x78ef , 0x4e00 , 0x58f1 , +0x6ea2 , 0x9038 , 0x7a32 , 0x8328 , +0x828b , 0x9c2f , 0x5141 , 0x5370 , +0x54bd , 0x54e1 , 0x56e0 , 0x59fb , +0x5f15 , 0x98f2 , 0x6deb , 0x80e4 , +0x852d , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9662 , 0x9670 , 0x96a0 , 0x97fb , +0x540b , 0x53f3 , 0x5b87 , 0x70cf , +0x7fbd , 0x8fc2 , 0x96e8 , 0x536f , +0x9d5c , 0x7aba , 0x4e11 , 0x7893 , +0x81fc , 0x6e26 , 0x5618 , 0x5504 , +0x6b1d , 0x851a , 0x9c3b , 0x59e5 , +0x53a9 , 0x6d66 , 0x74dc , 0x958f , +0x5642 , 0x4e91 , 0x904b , 0x96f2 , +0x834f , 0x990c , 0x53e1 , 0x55b6 , +0x5b30 , 0x5f71 , 0x6620 , 0x66f3 , +0x6804 , 0x6c38 , 0x6cf3 , 0x6d29 , +0x745b , 0x76c8 , 0x7a4e , 0x9834 , +0x82f1 , 0x885b , 0x8a60 , 0x92ed , +0x6db2 , 0x75ab , 0x76ca , 0x99c5 , +0x60a6 , 0x8b01 , 0x8d8a , 0x95b2 , +0x698e , 0x53ad , 0x5186 , 0x0 , +0x5712 , 0x5830 , 0x5944 , 0x5bb4 , +0x5ef6 , 0x6028 , 0x63a9 , 0x63f4 , +0x6cbf , 0x6f14 , 0x708e , 0x7114 , +0x7159 , 0x71d5 , 0x733f , 0x7e01 , +0x8276 , 0x82d1 , 0x8597 , 0x9060 , +0x925b , 0x9d1b , 0x5869 , 0x65bc , +0x6c5a , 0x7525 , 0x51f9 , 0x592e , +0x5965 , 0x5f80 , 0x5fdc , 0x62bc , +0x65fa , 0x6a2a , 0x6b27 , 0x6bb4 , +0x738b , 0x7fc1 , 0x8956 , 0x9d2c , +0x9d0e , 0x9ec4 , 0x5ca1 , 0x6c96 , +0x837b , 0x5104 , 0x5c4b , 0x61b6 , +0x81c6 , 0x6876 , 0x7261 , 0x4e59 , +0x4ffa , 0x5378 , 0x6069 , 0x6e29 , +0x7a4f , 0x97f3 , 0x4e0b , 0x5316 , +0x4eee , 0x4f55 , 0x4f3d , 0x4fa1 , +0x4f73 , 0x52a0 , 0x53ef , 0x5609 , +0x590f , 0x5ac1 , 0x5bb6 , 0x5be1 , +0x79d1 , 0x6687 , 0x679c , 0x67b6 , +0x6b4c , 0x6cb3 , 0x706b , 0x73c2 , +0x798d , 0x79be , 0x7a3c , 0x7b87 , +0x82b1 , 0x82db , 0x8304 , 0x8377 , +0x83ef , 0x83d3 , 0x8766 , 0x8ab2 , +0x5629 , 0x8ca8 , 0x8fe6 , 0x904e , +0x971e , 0x868a , 0x4fc4 , 0x5ce8 , +0x6211 , 0x7259 , 0x753b , 0x81e5 , +0x82bd , 0x86fe , 0x8cc0 , 0x96c5 , +0x9913 , 0x99d5 , 0x4ecb , 0x4f1a , +0x89e3 , 0x56de , 0x584a , 0x58ca , +0x5efb , 0x5feb , 0x602a , 0x6094 , +0x6062 , 0x61d0 , 0x6212 , 0x62d0 , +0x6539 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9b41 , 0x6666 , 0x68b0 , 0x6d77 , +0x7070 , 0x754c , 0x7686 , 0x7d75 , +0x82a5 , 0x87f9 , 0x958b , 0x968e , +0x8c9d , 0x51f1 , 0x52be , 0x5916 , +0x54b3 , 0x5bb3 , 0x5d16 , 0x6168 , +0x6982 , 0x6daf , 0x788d , 0x84cb , +0x8857 , 0x8a72 , 0x93a7 , 0x9ab8 , +0x6d6c , 0x99a8 , 0x86d9 , 0x57a3 , +0x67ff , 0x86ce , 0x920e , 0x5283 , +0x5687 , 0x5404 , 0x5ed3 , 0x62e1 , +0x64b9 , 0x683c , 0x6838 , 0x6bbb , +0x7372 , 0x78ba , 0x7a6b , 0x899a , +0x89d2 , 0x8d6b , 0x8f03 , 0x90ed , +0x95a3 , 0x9694 , 0x9769 , 0x5b66 , +0x5cb3 , 0x697d , 0x984d , 0x984e , +0x639b , 0x7b20 , 0x6a2b , 0x0 , +0x6a7f , 0x68b6 , 0x9c0d , 0x6f5f , +0x5272 , 0x559d , 0x6070 , 0x62ec , +0x6d3b , 0x6e07 , 0x6ed1 , 0x845b , +0x8910 , 0x8f44 , 0x4e14 , 0x9c39 , +0x53f6 , 0x691b , 0x6a3a , 0x9784 , +0x682a , 0x515c , 0x7ac3 , 0x84b2 , +0x91dc , 0x938c , 0x565b , 0x9d28 , +0x6822 , 0x8305 , 0x8431 , 0x7ca5 , +0x5208 , 0x82c5 , 0x74e6 , 0x4e7e , +0x4f83 , 0x51a0 , 0x5bd2 , 0x520a , +0x52d8 , 0x52e7 , 0x5dfb , 0x559a , +0x582a , 0x59e6 , 0x5b8c , 0x5b98 , +0x5bdb , 0x5e72 , 0x5e79 , 0x60a3 , +0x611f , 0x6163 , 0x61be , 0x63db , +0x6562 , 0x67d1 , 0x6853 , 0x68fa , +0x6b3e , 0x6b53 , 0x6c57 , 0x6f22 , +0x6f97 , 0x6f45 , 0x74b0 , 0x7518 , +0x76e3 , 0x770b , 0x7aff , 0x7ba1 , +0x7c21 , 0x7de9 , 0x7f36 , 0x7ff0 , +0x809d , 0x8266 , 0x839e , 0x89b3 , +0x8acc , 0x8cab , 0x9084 , 0x9451 , +0x9593 , 0x9591 , 0x95a2 , 0x9665 , +0x97d3 , 0x9928 , 0x8218 , 0x4e38 , +0x542b , 0x5cb8 , 0x5dcc , 0x73a9 , +0x764c , 0x773c , 0x5ca9 , 0x7feb , +0x8d0b , 0x96c1 , 0x9811 , 0x9854 , +0x9858 , 0x4f01 , 0x4f0e , 0x5371 , +0x559c , 0x5668 , 0x57fa , 0x5947 , +0x5b09 , 0x5bc4 , 0x5c90 , 0x5e0c , +0x5e7e , 0x5fcc , 0x63ee , 0x673a , +0x65d7 , 0x65e2 , 0x671f , 0x68cb , +0x68c4 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6a5f , 0x5e30 , 0x6bc5 , 0x6c17 , +0x6c7d , 0x757f , 0x7948 , 0x5b63 , +0x7a00 , 0x7d00 , 0x5fbd , 0x898f , +0x8a18 , 0x8cb4 , 0x8d77 , 0x8ecc , +0x8f1d , 0x98e2 , 0x9a0e , 0x9b3c , +0x4e80 , 0x507d , 0x5100 , 0x5993 , +0x5b9c , 0x622f , 0x6280 , 0x64ec , +0x6b3a , 0x72a0 , 0x7591 , 0x7947 , +0x7fa9 , 0x87fb , 0x8abc , 0x8b70 , +0x63ac , 0x83ca , 0x97a0 , 0x5409 , +0x5403 , 0x55ab , 0x6854 , 0x6a58 , +0x8a70 , 0x7827 , 0x6775 , 0x9ecd , +0x5374 , 0x5ba2 , 0x811a , 0x8650 , +0x9006 , 0x4e18 , 0x4e45 , 0x4ec7 , +0x4f11 , 0x53ca , 0x5438 , 0x5bae , +0x5f13 , 0x6025 , 0x6551 , 0x0 , +0x673d , 0x6c42 , 0x6c72 , 0x6ce3 , +0x7078 , 0x7403 , 0x7a76 , 0x7aae , +0x7b08 , 0x7d1a , 0x7cfe , 0x7d66 , +0x65e7 , 0x725b , 0x53bb , 0x5c45 , +0x5de8 , 0x62d2 , 0x62e0 , 0x6319 , +0x6e20 , 0x865a , 0x8a31 , 0x8ddd , +0x92f8 , 0x6f01 , 0x79a6 , 0x9b5a , +0x4ea8 , 0x4eab , 0x4eac , 0x4f9b , +0x4fa0 , 0x50d1 , 0x5147 , 0x7af6 , +0x5171 , 0x51f6 , 0x5354 , 0x5321 , +0x537f , 0x53eb , 0x55ac , 0x5883 , +0x5ce1 , 0x5f37 , 0x5f4a , 0x602f , +0x6050 , 0x606d , 0x631f , 0x6559 , +0x6a4b , 0x6cc1 , 0x72c2 , 0x72ed , +0x77ef , 0x80f8 , 0x8105 , 0x8208 , +0x854e , 0x90f7 , 0x93e1 , 0x97ff , +0x9957 , 0x9a5a , 0x4ef0 , 0x51dd , +0x5c2d , 0x6681 , 0x696d , 0x5c40 , +0x66f2 , 0x6975 , 0x7389 , 0x6850 , +0x7c81 , 0x50c5 , 0x52e4 , 0x5747 , +0x5dfe , 0x9326 , 0x65a4 , 0x6b23 , +0x6b3d , 0x7434 , 0x7981 , 0x79bd , +0x7b4b , 0x7dca , 0x82b9 , 0x83cc , +0x887f , 0x895f , 0x8b39 , 0x8fd1 , +0x91d1 , 0x541f , 0x9280 , 0x4e5d , +0x5036 , 0x53e5 , 0x533a , 0x72d7 , +0x7396 , 0x77e9 , 0x82e6 , 0x8eaf , +0x99c6 , 0x99c8 , 0x99d2 , 0x5177 , +0x611a , 0x865e , 0x55b0 , 0x7a7a , +0x5076 , 0x5bd3 , 0x9047 , 0x9685 , +0x4e32 , 0x6adb , 0x91e7 , 0x5c51 , +0x5c48 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6398 , 0x7a9f , 0x6c93 , 0x9774 , +0x8f61 , 0x7aaa , 0x718a , 0x9688 , +0x7c82 , 0x6817 , 0x7e70 , 0x6851 , +0x936c , 0x52f2 , 0x541b , 0x85ab , +0x8a13 , 0x7fa4 , 0x8ecd , 0x90e1 , +0x5366 , 0x8888 , 0x7941 , 0x4fc2 , +0x50be , 0x5211 , 0x5144 , 0x5553 , +0x572d , 0x73ea , 0x578b , 0x5951 , +0x5f62 , 0x5f84 , 0x6075 , 0x6176 , +0x6167 , 0x61a9 , 0x63b2 , 0x643a , +0x656c , 0x666f , 0x6842 , 0x6e13 , +0x7566 , 0x7a3d , 0x7cfb , 0x7d4c , +0x7d99 , 0x7e4b , 0x7f6b , 0x830e , +0x834a , 0x86cd , 0x8a08 , 0x8a63 , +0x8b66 , 0x8efd , 0x981a , 0x9d8f , +0x82b8 , 0x8fce , 0x9be8 , 0x0 , +0x5287 , 0x621f , 0x6483 , 0x6fc0 , +0x9699 , 0x6841 , 0x5091 , 0x6b20 , +0x6c7a , 0x6f54 , 0x7a74 , 0x7d50 , +0x8840 , 0x8a23 , 0x6708 , 0x4ef6 , +0x5039 , 0x5026 , 0x5065 , 0x517c , +0x5238 , 0x5263 , 0x55a7 , 0x570f , +0x5805 , 0x5acc , 0x5efa , 0x61b2 , +0x61f8 , 0x62f3 , 0x6372 , 0x691c , +0x6a29 , 0x727d , 0x72ac , 0x732e , +0x7814 , 0x786f , 0x7d79 , 0x770c , +0x80a9 , 0x898b , 0x8b19 , 0x8ce2 , +0x8ed2 , 0x9063 , 0x9375 , 0x967a , +0x9855 , 0x9a13 , 0x9e78 , 0x5143 , +0x539f , 0x53b3 , 0x5e7b , 0x5f26 , +0x6e1b , 0x6e90 , 0x7384 , 0x73fe , +0x7d43 , 0x8237 , 0x8a00 , 0x8afa , +0x9650 , 0x4e4e , 0x500b , 0x53e4 , +0x547c , 0x56fa , 0x59d1 , 0x5b64 , +0x5df1 , 0x5eab , 0x5f27 , 0x6238 , +0x6545 , 0x67af , 0x6e56 , 0x72d0 , +0x7cca , 0x88b4 , 0x80a1 , 0x80e1 , +0x83f0 , 0x864e , 0x8a87 , 0x8de8 , +0x9237 , 0x96c7 , 0x9867 , 0x9f13 , +0x4e94 , 0x4e92 , 0x4f0d , 0x5348 , +0x5449 , 0x543e , 0x5a2f , 0x5f8c , +0x5fa1 , 0x609f , 0x68a7 , 0x6a8e , +0x745a , 0x7881 , 0x8a9e , 0x8aa4 , +0x8b77 , 0x9190 , 0x4e5e , 0x9bc9 , +0x4ea4 , 0x4f7c , 0x4faf , 0x5019 , +0x5016 , 0x5149 , 0x516c , 0x529f , +0x52b9 , 0x52fe , 0x539a , 0x53e3 , +0x5411 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x540e , 0x5589 , 0x5751 , 0x57a2 , +0x597d , 0x5b54 , 0x5b5d , 0x5b8f , +0x5de5 , 0x5de7 , 0x5df7 , 0x5e78 , +0x5e83 , 0x5e9a , 0x5eb7 , 0x5f18 , +0x6052 , 0x614c , 0x6297 , 0x62d8 , +0x63a7 , 0x653b , 0x6602 , 0x6643 , +0x66f4 , 0x676d , 0x6821 , 0x6897 , +0x69cb , 0x6c5f , 0x6d2a , 0x6d69 , +0x6e2f , 0x6e9d , 0x7532 , 0x7687 , +0x786c , 0x7a3f , 0x7ce0 , 0x7d05 , +0x7d18 , 0x7d5e , 0x7db1 , 0x8015 , +0x8003 , 0x80af , 0x80b1 , 0x8154 , +0x818f , 0x822a , 0x8352 , 0x884c , +0x8861 , 0x8b1b , 0x8ca2 , 0x8cfc , +0x90ca , 0x9175 , 0x9271 , 0x783f , +0x92fc , 0x95a4 , 0x964d , 0x0 , +0x9805 , 0x9999 , 0x9ad8 , 0x9d3b , +0x525b , 0x52ab , 0x53f7 , 0x5408 , +0x58d5 , 0x62f7 , 0x6fe0 , 0x8c6a , +0x8f5f , 0x9eb9 , 0x514b , 0x523b , +0x544a , 0x56fd , 0x7a40 , 0x9177 , +0x9d60 , 0x9ed2 , 0x7344 , 0x6f09 , +0x8170 , 0x7511 , 0x5ffd , 0x60da , +0x9aa8 , 0x72db , 0x8fbc , 0x6b64 , +0x9803 , 0x4eca , 0x56f0 , 0x5764 , +0x58be , 0x5a5a , 0x6068 , 0x61c7 , +0x660f , 0x6606 , 0x6839 , 0x68b1 , +0x6df7 , 0x75d5 , 0x7d3a , 0x826e , +0x9b42 , 0x4e9b , 0x4f50 , 0x53c9 , +0x5506 , 0x5d6f , 0x5de6 , 0x5dee , +0x67fb , 0x6c99 , 0x7473 , 0x7802 , +0x8a50 , 0x9396 , 0x88df , 0x5750 , +0x5ea7 , 0x632b , 0x50b5 , 0x50ac , +0x518d , 0x6700 , 0x54c9 , 0x585e , +0x59bb , 0x5bb0 , 0x5f69 , 0x624d , +0x63a1 , 0x683d , 0x6b73 , 0x6e08 , +0x707d , 0x91c7 , 0x7280 , 0x7815 , +0x7826 , 0x796d , 0x658e , 0x7d30 , +0x83dc , 0x88c1 , 0x8f09 , 0x969b , +0x5264 , 0x5728 , 0x6750 , 0x7f6a , +0x8ca1 , 0x51b4 , 0x5742 , 0x962a , +0x583a , 0x698a , 0x80b4 , 0x54b2 , +0x5d0e , 0x57fc , 0x7895 , 0x9dfa , +0x4f5c , 0x524a , 0x548b , 0x643e , +0x6628 , 0x6714 , 0x67f5 , 0x7a84 , +0x7b56 , 0x7d22 , 0x932f , 0x685c , +0x9bad , 0x7b39 , 0x5319 , 0x518a , +0x5237 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5bdf , 0x62f6 , 0x64ae , 0x64e6 , +0x672d , 0x6bba , 0x85a9 , 0x96d1 , +0x7690 , 0x9bd6 , 0x634c , 0x9306 , +0x9bab , 0x76bf , 0x6652 , 0x4e09 , +0x5098 , 0x53c2 , 0x5c71 , 0x60e8 , +0x6492 , 0x6563 , 0x685f , 0x71e6 , +0x73ca , 0x7523 , 0x7b97 , 0x7e82 , +0x8695 , 0x8b83 , 0x8cdb , 0x9178 , +0x9910 , 0x65ac , 0x66ab , 0x6b8b , +0x4ed5 , 0x4ed4 , 0x4f3a , 0x4f7f , +0x523a , 0x53f8 , 0x53f2 , 0x55e3 , +0x56db , 0x58eb , 0x59cb , 0x59c9 , +0x59ff , 0x5b50 , 0x5c4d , 0x5e02 , +0x5e2b , 0x5fd7 , 0x601d , 0x6307 , +0x652f , 0x5b5c , 0x65af , 0x65bd , +0x65e8 , 0x679d , 0x6b62 , 0x0 , +0x6b7b , 0x6c0f , 0x7345 , 0x7949 , +0x79c1 , 0x7cf8 , 0x7d19 , 0x7d2b , +0x80a2 , 0x8102 , 0x81f3 , 0x8996 , +0x8a5e , 0x8a69 , 0x8a66 , 0x8a8c , +0x8aee , 0x8cc7 , 0x8cdc , 0x96cc , +0x98fc , 0x6b6f , 0x4e8b , 0x4f3c , +0x4f8d , 0x5150 , 0x5b57 , 0x5bfa , +0x6148 , 0x6301 , 0x6642 , 0x6b21 , +0x6ecb , 0x6cbb , 0x723e , 0x74bd , +0x75d4 , 0x78c1 , 0x793a , 0x800c , +0x8033 , 0x81ea , 0x8494 , 0x8f9e , +0x6c50 , 0x9e7f , 0x5f0f , 0x8b58 , +0x9d2b , 0x7afa , 0x8ef8 , 0x5b8d , +0x96eb , 0x4e03 , 0x53f1 , 0x57f7 , +0x5931 , 0x5ac9 , 0x5ba4 , 0x6089 , +0x6e7f , 0x6f06 , 0x75be , 0x8cea , +0x5b9f , 0x8500 , 0x7be0 , 0x5072 , +0x67f4 , 0x829d , 0x5c61 , 0x854a , +0x7e1e , 0x820e , 0x5199 , 0x5c04 , +0x6368 , 0x8d66 , 0x659c , 0x716e , +0x793e , 0x7d17 , 0x8005 , 0x8b1d , +0x8eca , 0x906e , 0x86c7 , 0x90aa , +0x501f , 0x52fa , 0x5c3a , 0x6753 , +0x707c , 0x7235 , 0x914c , 0x91c8 , +0x932b , 0x82e5 , 0x5bc2 , 0x5f31 , +0x60f9 , 0x4e3b , 0x53d6 , 0x5b88 , +0x624b , 0x6731 , 0x6b8a , 0x72e9 , +0x73e0 , 0x7a2e , 0x816b , 0x8da3 , +0x9152 , 0x9996 , 0x5112 , 0x53d7 , +0x546a , 0x5bff , 0x6388 , 0x6a39 , +0x7dac , 0x9700 , 0x56da , 0x53ce , +0x5468 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5b97 , 0x5c31 , 0x5dde , 0x4fee , +0x6101 , 0x62fe , 0x6d32 , 0x79c0 , +0x79cb , 0x7d42 , 0x7e4d , 0x7fd2 , +0x81ed , 0x821f , 0x8490 , 0x8846 , +0x8972 , 0x8b90 , 0x8e74 , 0x8f2f , +0x9031 , 0x914b , 0x916c , 0x96c6 , +0x919c , 0x4ec0 , 0x4f4f , 0x5145 , +0x5341 , 0x5f93 , 0x620e , 0x67d4 , +0x6c41 , 0x6e0b , 0x7363 , 0x7e26 , +0x91cd , 0x9283 , 0x53d4 , 0x5919 , +0x5bbf , 0x6dd1 , 0x795d , 0x7e2e , +0x7c9b , 0x587e , 0x719f , 0x51fa , +0x8853 , 0x8ff0 , 0x4fca , 0x5cfb , +0x6625 , 0x77ac , 0x7ae3 , 0x821c , +0x99ff , 0x51c6 , 0x5faa , 0x65ec , +0x696f , 0x6b89 , 0x6df3 , 0x0 , +0x6e96 , 0x6f64 , 0x76fe , 0x7d14 , +0x5de1 , 0x9075 , 0x9187 , 0x9806 , +0x51e6 , 0x521d , 0x6240 , 0x6691 , +0x66d9 , 0x6e1a , 0x5eb6 , 0x7dd2 , +0x7f72 , 0x66f8 , 0x85af , 0x85f7 , +0x8af8 , 0x52a9 , 0x53d9 , 0x5973 , +0x5e8f , 0x5f90 , 0x6055 , 0x92e4 , +0x9664 , 0x50b7 , 0x511f , 0x52dd , +0x5320 , 0x5347 , 0x53ec , 0x54e8 , +0x5546 , 0x5531 , 0x5617 , 0x5968 , +0x59be , 0x5a3c , 0x5bb5 , 0x5c06 , +0x5c0f , 0x5c11 , 0x5c1a , 0x5e84 , +0x5e8a , 0x5ee0 , 0x5f70 , 0x627f , +0x6284 , 0x62db , 0x638c , 0x6377 , +0x6607 , 0x660c , 0x662d , 0x6676 , +0x677e , 0x68a2 , 0x6a1f , 0x6a35 , +0x6cbc , 0x6d88 , 0x6e09 , 0x6e58 , +0x713c , 0x7126 , 0x7167 , 0x75c7 , +0x7701 , 0x785d , 0x7901 , 0x7965 , +0x79f0 , 0x7ae0 , 0x7b11 , 0x7ca7 , +0x7d39 , 0x8096 , 0x83d6 , 0x848b , +0x8549 , 0x885d , 0x88f3 , 0x8a1f , +0x8a3c , 0x8a54 , 0x8a73 , 0x8c61 , +0x8cde , 0x91a4 , 0x9266 , 0x937e , +0x9418 , 0x969c , 0x9798 , 0x4e0a , +0x4e08 , 0x4e1e , 0x4e57 , 0x5197 , +0x5270 , 0x57ce , 0x5834 , 0x58cc , +0x5b22 , 0x5e38 , 0x60c5 , 0x64fe , +0x6761 , 0x6756 , 0x6d44 , 0x72b6 , +0x7573 , 0x7a63 , 0x84b8 , 0x8b72 , +0x91b8 , 0x9320 , 0x5631 , 0x57f4 , +0x98fe , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x62ed , 0x690d , 0x6b96 , 0x71ed , +0x7e54 , 0x8077 , 0x8272 , 0x89e6 , +0x98df , 0x8755 , 0x8fb1 , 0x5c3b , +0x4f38 , 0x4fe1 , 0x4fb5 , 0x5507 , +0x5a20 , 0x5bdd , 0x5be9 , 0x5fc3 , +0x614e , 0x632f , 0x65b0 , 0x664b , +0x68ee , 0x699b , 0x6d78 , 0x6df1 , +0x7533 , 0x75b9 , 0x771f , 0x795e , +0x79e6 , 0x7d33 , 0x81e3 , 0x82af , +0x85aa , 0x89aa , 0x8a3a , 0x8eab , +0x8f9b , 0x9032 , 0x91dd , 0x9707 , +0x4eba , 0x4ec1 , 0x5203 , 0x5875 , +0x58ec , 0x5c0b , 0x751a , 0x5c3d , +0x814e , 0x8a0a , 0x8fc5 , 0x9663 , +0x976d , 0x7b25 , 0x8acf , 0x9808 , +0x9162 , 0x56f3 , 0x53a8 , 0x0 , +0x9017 , 0x5439 , 0x5782 , 0x5e25 , +0x63a8 , 0x6c34 , 0x708a , 0x7761 , +0x7c8b , 0x7fe0 , 0x8870 , 0x9042 , +0x9154 , 0x9310 , 0x9318 , 0x968f , +0x745e , 0x9ac4 , 0x5d07 , 0x5d69 , +0x6570 , 0x67a2 , 0x8da8 , 0x96db , +0x636e , 0x6749 , 0x6919 , 0x83c5 , +0x9817 , 0x96c0 , 0x88fe , 0x6f84 , +0x647a , 0x5bf8 , 0x4e16 , 0x702c , +0x755d , 0x662f , 0x51c4 , 0x5236 , +0x52e2 , 0x59d3 , 0x5f81 , 0x6027 , +0x6210 , 0x653f , 0x6574 , 0x661f , +0x6674 , 0x68f2 , 0x6816 , 0x6b63 , +0x6e05 , 0x7272 , 0x751f , 0x76db , +0x7cbe , 0x8056 , 0x58f0 , 0x88fd , +0x897f , 0x8aa0 , 0x8a93 , 0x8acb , +0x901d , 0x9192 , 0x9752 , 0x9759 , +0x6589 , 0x7a0e , 0x8106 , 0x96bb , +0x5e2d , 0x60dc , 0x621a , 0x65a5 , +0x6614 , 0x6790 , 0x77f3 , 0x7a4d , +0x7c4d , 0x7e3e , 0x810a , 0x8cac , +0x8d64 , 0x8de1 , 0x8e5f , 0x78a9 , +0x5207 , 0x62d9 , 0x63a5 , 0x6442 , +0x6298 , 0x8a2d , 0x7a83 , 0x7bc0 , +0x8aac , 0x96ea , 0x7d76 , 0x820c , +0x8749 , 0x4ed9 , 0x5148 , 0x5343 , +0x5360 , 0x5ba3 , 0x5c02 , 0x5c16 , +0x5ddd , 0x6226 , 0x6247 , 0x64b0 , +0x6813 , 0x6834 , 0x6cc9 , 0x6d45 , +0x6d17 , 0x67d3 , 0x6f5c , 0x714e , +0x717d , 0x65cb , 0x7a7f , 0x7bad , +0x7dda , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7e4a , 0x7fa8 , 0x817a , 0x821b , +0x8239 , 0x85a6 , 0x8a6e , 0x8cce , +0x8df5 , 0x9078 , 0x9077 , 0x92ad , +0x9291 , 0x9583 , 0x9bae , 0x524d , +0x5584 , 0x6f38 , 0x7136 , 0x5168 , +0x7985 , 0x7e55 , 0x81b3 , 0x7cce , +0x564c , 0x5851 , 0x5ca8 , 0x63aa , +0x66fe , 0x66fd , 0x695a , 0x72d9 , +0x758f , 0x758e , 0x790e , 0x7956 , +0x79df , 0x7c97 , 0x7d20 , 0x7d44 , +0x8607 , 0x8a34 , 0x963b , 0x9061 , +0x9f20 , 0x50e7 , 0x5275 , 0x53cc , +0x53e2 , 0x5009 , 0x55aa , 0x58ee , +0x594f , 0x723d , 0x5b8b , 0x5c64 , +0x531d , 0x60e3 , 0x60f3 , 0x635c , +0x6383 , 0x633f , 0x63bb , 0x0 , +0x64cd , 0x65e9 , 0x66f9 , 0x5de3 , +0x69cd , 0x69fd , 0x6f15 , 0x71e5 , +0x4e89 , 0x75e9 , 0x76f8 , 0x7a93 , +0x7cdf , 0x7dcf , 0x7d9c , 0x8061 , +0x8349 , 0x8358 , 0x846c , 0x84bc , +0x85fb , 0x88c5 , 0x8d70 , 0x9001 , +0x906d , 0x9397 , 0x971c , 0x9a12 , +0x50cf , 0x5897 , 0x618e , 0x81d3 , +0x8535 , 0x8d08 , 0x9020 , 0x4fc3 , +0x5074 , 0x5247 , 0x5373 , 0x606f , +0x6349 , 0x675f , 0x6e2c , 0x8db3 , +0x901f , 0x4fd7 , 0x5c5e , 0x8cca , +0x65cf , 0x7d9a , 0x5352 , 0x8896 , +0x5176 , 0x63c3 , 0x5b58 , 0x5b6b , +0x5c0a , 0x640d , 0x6751 , 0x905c , +0x4ed6 , 0x591a , 0x592a , 0x6c70 , +0x8a51 , 0x553e , 0x5815 , 0x59a5 , +0x60f0 , 0x6253 , 0x67c1 , 0x8235 , +0x6955 , 0x9640 , 0x99c4 , 0x9a28 , +0x4f53 , 0x5806 , 0x5bfe , 0x8010 , +0x5cb1 , 0x5e2f , 0x5f85 , 0x6020 , +0x614b , 0x6234 , 0x66ff , 0x6cf0 , +0x6ede , 0x80ce , 0x817f , 0x82d4 , +0x888b , 0x8cb8 , 0x9000 , 0x902e , +0x968a , 0x9edb , 0x9bdb , 0x4ee3 , +0x53f0 , 0x5927 , 0x7b2c , 0x918d , +0x984c , 0x9df9 , 0x6edd , 0x7027 , +0x5353 , 0x5544 , 0x5b85 , 0x6258 , +0x629e , 0x62d3 , 0x6ca2 , 0x6fef , +0x7422 , 0x8a17 , 0x9438 , 0x6fc1 , +0x8afe , 0x8338 , 0x51e7 , 0x86f8 , +0x53ea , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x53e9 , 0x4f46 , 0x9054 , 0x8fb0 , +0x596a , 0x8131 , 0x5dfd , 0x7aea , +0x8fbf , 0x68da , 0x8c37 , 0x72f8 , +0x9c48 , 0x6a3d , 0x8ab0 , 0x4e39 , +0x5358 , 0x5606 , 0x5766 , 0x62c5 , +0x63a2 , 0x65e6 , 0x6b4e , 0x6de1 , +0x6e5b , 0x70ad , 0x77ed , 0x7aef , +0x7baa , 0x7dbb , 0x803d , 0x80c6 , +0x86cb , 0x8a95 , 0x935b , 0x56e3 , +0x58c7 , 0x5f3e , 0x65ad , 0x6696 , +0x6a80 , 0x6bb5 , 0x7537 , 0x8ac7 , +0x5024 , 0x77e5 , 0x5730 , 0x5f1b , +0x6065 , 0x667a , 0x6c60 , 0x75f4 , +0x7a1a , 0x7f6e , 0x81f4 , 0x8718 , +0x9045 , 0x99b3 , 0x7bc9 , 0x755c , +0x7af9 , 0x7b51 , 0x84c4 , 0x0 , +0x9010 , 0x79e9 , 0x7a92 , 0x8336 , +0x5ae1 , 0x7740 , 0x4e2d , 0x4ef2 , +0x5b99 , 0x5fe0 , 0x62bd , 0x663c , +0x67f1 , 0x6ce8 , 0x866b , 0x8877 , +0x8a3b , 0x914e , 0x92f3 , 0x99d0 , +0x6a17 , 0x7026 , 0x732a , 0x82e7 , +0x8457 , 0x8caf , 0x4e01 , 0x5146 , +0x51cb , 0x558b , 0x5bf5 , 0x5e16 , +0x5e33 , 0x5e81 , 0x5f14 , 0x5f35 , +0x5f6b , 0x5fb4 , 0x61f2 , 0x6311 , +0x66a2 , 0x671d , 0x6f6e , 0x7252 , +0x753a , 0x773a , 0x8074 , 0x8139 , +0x8178 , 0x8776 , 0x8abf , 0x8adc , +0x8d85 , 0x8df3 , 0x929a , 0x9577 , +0x9802 , 0x9ce5 , 0x52c5 , 0x6357 , +0x76f4 , 0x6715 , 0x6c88 , 0x73cd , +0x8cc3 , 0x93ae , 0x9673 , 0x6d25 , +0x589c , 0x690e , 0x69cc , 0x8ffd , +0x939a , 0x75db , 0x901a , 0x585a , +0x6802 , 0x63b4 , 0x69fb , 0x4f43 , +0x6f2c , 0x67d8 , 0x8fbb , 0x8526 , +0x7db4 , 0x9354 , 0x693f , 0x6f70 , +0x576a , 0x58f7 , 0x5b2c , 0x7d2c , +0x722a , 0x540a , 0x91e3 , 0x9db4 , +0x4ead , 0x4f4e , 0x505c , 0x5075 , +0x5243 , 0x8c9e , 0x5448 , 0x5824 , +0x5b9a , 0x5e1d , 0x5e95 , 0x5ead , +0x5ef7 , 0x5f1f , 0x608c , 0x62b5 , +0x633a , 0x63d0 , 0x68af , 0x6c40 , +0x7887 , 0x798e , 0x7a0b , 0x7de0 , +0x8247 , 0x8a02 , 0x8ae6 , 0x8e44 , +0x9013 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x90b8 , 0x912d , 0x91d8 , 0x9f0e , +0x6ce5 , 0x6458 , 0x64e2 , 0x6575 , +0x6ef4 , 0x7684 , 0x7b1b , 0x9069 , +0x93d1 , 0x6eba , 0x54f2 , 0x5fb9 , +0x64a4 , 0x8f4d , 0x8fed , 0x9244 , +0x5178 , 0x586b , 0x5929 , 0x5c55 , +0x5e97 , 0x6dfb , 0x7e8f , 0x751c , +0x8cbc , 0x8ee2 , 0x985b , 0x70b9 , +0x4f1d , 0x6bbf , 0x6fb1 , 0x7530 , +0x96fb , 0x514e , 0x5410 , 0x5835 , +0x5857 , 0x59ac , 0x5c60 , 0x5f92 , +0x6597 , 0x675c , 0x6e21 , 0x767b , +0x83df , 0x8ced , 0x9014 , 0x90fd , +0x934d , 0x7825 , 0x783a , 0x52aa , +0x5ea6 , 0x571f , 0x5974 , 0x6012 , +0x5012 , 0x515a , 0x51ac , 0x0 , +0x51cd , 0x5200 , 0x5510 , 0x5854 , +0x5858 , 0x5957 , 0x5b95 , 0x5cf6 , +0x5d8b , 0x60bc , 0x6295 , 0x642d , +0x6771 , 0x6843 , 0x68bc , 0x68df , +0x76d7 , 0x6dd8 , 0x6e6f , 0x6d9b , +0x706f , 0x71c8 , 0x5f53 , 0x75d8 , +0x7977 , 0x7b49 , 0x7b54 , 0x7b52 , +0x7cd6 , 0x7d71 , 0x5230 , 0x8463 , +0x8569 , 0x85e4 , 0x8a0e , 0x8b04 , +0x8c46 , 0x8e0f , 0x9003 , 0x900f , +0x9419 , 0x9676 , 0x982d , 0x9a30 , +0x95d8 , 0x50cd , 0x52d5 , 0x540c , +0x5802 , 0x5c0e , 0x61a7 , 0x649e , +0x6d1e , 0x77b3 , 0x7ae5 , 0x80f4 , +0x8404 , 0x9053 , 0x9285 , 0x5ce0 , +0x9d07 , 0x533f , 0x5f97 , 0x5fb3 , +0x6d9c , 0x7279 , 0x7763 , 0x79bf , +0x7be4 , 0x6bd2 , 0x72ec , 0x8aad , +0x6803 , 0x6a61 , 0x51f8 , 0x7a81 , +0x6934 , 0x5c4a , 0x9cf6 , 0x82eb , +0x5bc5 , 0x9149 , 0x701e , 0x5678 , +0x5c6f , 0x60c7 , 0x6566 , 0x6c8c , +0x8c5a , 0x9041 , 0x9813 , 0x5451 , +0x66c7 , 0x920d , 0x5948 , 0x90a3 , +0x5185 , 0x4e4d , 0x51ea , 0x8599 , +0x8b0e , 0x7058 , 0x637a , 0x934b , +0x6962 , 0x99b4 , 0x7e04 , 0x7577 , +0x5357 , 0x6960 , 0x8edf , 0x96e3 , +0x6c5d , 0x4e8c , 0x5c3c , 0x5f10 , +0x8fe9 , 0x5302 , 0x8cd1 , 0x8089 , +0x8679 , 0x5eff , 0x65e5 , 0x4e73 , +0x5165 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5982 , 0x5c3f , 0x97ee , 0x4efb , +0x598a , 0x5fcd , 0x8a8d , 0x6fe1 , +0x79b0 , 0x7962 , 0x5be7 , 0x8471 , +0x732b , 0x71b1 , 0x5e74 , 0x5ff5 , +0x637b , 0x649a , 0x71c3 , 0x7c98 , +0x4e43 , 0x5efc , 0x4e4b , 0x57dc , +0x56a2 , 0x60a9 , 0x6fc3 , 0x7d0d , +0x80fd , 0x8133 , 0x81bf , 0x8fb2 , +0x8997 , 0x86a4 , 0x5df4 , 0x628a , +0x64ad , 0x8987 , 0x6777 , 0x6ce2 , +0x6d3e , 0x7436 , 0x7834 , 0x5a46 , +0x7f75 , 0x82ad , 0x99ac , 0x4ff3 , +0x5ec3 , 0x62dd , 0x6392 , 0x6557 , +0x676f , 0x76c3 , 0x724c , 0x80cc , +0x80ba , 0x8f29 , 0x914d , 0x500d , +0x57f9 , 0x5a92 , 0x6885 , 0x0 , +0x6973 , 0x7164 , 0x72fd , 0x8cb7 , +0x58f2 , 0x8ce0 , 0x966a , 0x9019 , +0x877f , 0x79e4 , 0x77e7 , 0x8429 , +0x4f2f , 0x5265 , 0x535a , 0x62cd , +0x67cf , 0x6cca , 0x767d , 0x7b94 , +0x7c95 , 0x8236 , 0x8584 , 0x8feb , +0x66dd , 0x6f20 , 0x7206 , 0x7e1b , +0x83ab , 0x99c1 , 0x9ea6 , 0x51fd , +0x7bb1 , 0x7872 , 0x7bb8 , 0x8087 , +0x7b48 , 0x6ae8 , 0x5e61 , 0x808c , +0x7551 , 0x7560 , 0x516b , 0x9262 , +0x6e8c , 0x767a , 0x9197 , 0x9aea , +0x4f10 , 0x7f70 , 0x629c , 0x7b4f , +0x95a5 , 0x9ce9 , 0x567a , 0x5859 , +0x86e4 , 0x96bc , 0x4f34 , 0x5224 , +0x534a , 0x53cd , 0x53db , 0x5e06 , +0x642c , 0x6591 , 0x677f , 0x6c3e , +0x6c4e , 0x7248 , 0x72af , 0x73ed , +0x7554 , 0x7e41 , 0x822c , 0x85e9 , +0x8ca9 , 0x7bc4 , 0x91c6 , 0x7169 , +0x9812 , 0x98ef , 0x633d , 0x6669 , +0x756a , 0x76e4 , 0x78d0 , 0x8543 , +0x86ee , 0x532a , 0x5351 , 0x5426 , +0x5983 , 0x5e87 , 0x5f7c , 0x60b2 , +0x6249 , 0x6279 , 0x62ab , 0x6590 , +0x6bd4 , 0x6ccc , 0x75b2 , 0x76ae , +0x7891 , 0x79d8 , 0x7dcb , 0x7f77 , +0x80a5 , 0x88ab , 0x8ab9 , 0x8cbb , +0x907f , 0x975e , 0x98db , 0x6a0b , +0x7c38 , 0x5099 , 0x5c3e , 0x5fae , +0x6787 , 0x6bd8 , 0x7435 , 0x7709 , +0x7f8e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9f3b , 0x67ca , 0x7a17 , 0x5339 , +0x758b , 0x9aed , 0x5f66 , 0x819d , +0x83f1 , 0x8098 , 0x5f3c , 0x5fc5 , +0x7562 , 0x7b46 , 0x903c , 0x6867 , +0x59eb , 0x5a9b , 0x7d10 , 0x767e , +0x8b2c , 0x4ff5 , 0x5f6a , 0x6a19 , +0x6c37 , 0x6f02 , 0x74e2 , 0x7968 , +0x8868 , 0x8a55 , 0x8c79 , 0x5edf , +0x63cf , 0x75c5 , 0x79d2 , 0x82d7 , +0x9328 , 0x92f2 , 0x849c , 0x86ed , +0x9c2d , 0x54c1 , 0x5f6c , 0x658c , +0x6d5c , 0x7015 , 0x8ca7 , 0x8cd3 , +0x983b , 0x654f , 0x74f6 , 0x4e0d , +0x4ed8 , 0x57e0 , 0x592b , 0x5a66 , +0x5bcc , 0x51a8 , 0x5e03 , 0x5e9c , +0x6016 , 0x6276 , 0x6577 , 0x0 , +0x65a7 , 0x666e , 0x6d6e , 0x7236 , +0x7b26 , 0x8150 , 0x819a , 0x8299 , +0x8b5c , 0x8ca0 , 0x8ce6 , 0x8d74 , +0x961c , 0x9644 , 0x4fae , 0x64ab , +0x6b66 , 0x821e , 0x8461 , 0x856a , +0x90e8 , 0x5c01 , 0x6953 , 0x98a8 , +0x847a , 0x8557 , 0x4f0f , 0x526f , +0x5fa9 , 0x5e45 , 0x670d , 0x798f , +0x8179 , 0x8907 , 0x8986 , 0x6df5 , +0x5f17 , 0x6255 , 0x6cb8 , 0x4ecf , +0x7269 , 0x9b92 , 0x5206 , 0x543b , +0x5674 , 0x58b3 , 0x61a4 , 0x626e , +0x711a , 0x596e , 0x7c89 , 0x7cde , +0x7d1b , 0x96f0 , 0x6587 , 0x805e , +0x4e19 , 0x4f75 , 0x5175 , 0x5840 , +0x5e63 , 0x5e73 , 0x5f0a , 0x67c4 , +0x4e26 , 0x853d , 0x9589 , 0x965b , +0x7c73 , 0x9801 , 0x50fb , 0x58c1 , +0x7656 , 0x78a7 , 0x5225 , 0x77a5 , +0x8511 , 0x7b86 , 0x504f , 0x5909 , +0x7247 , 0x7bc7 , 0x7de8 , 0x8fba , +0x8fd4 , 0x904d , 0x4fbf , 0x52c9 , +0x5a29 , 0x5f01 , 0x97ad , 0x4fdd , +0x8217 , 0x92ea , 0x5703 , 0x6355 , +0x6b69 , 0x752b , 0x88dc , 0x8f14 , +0x7a42 , 0x52df , 0x5893 , 0x6155 , +0x620a , 0x66ae , 0x6bcd , 0x7c3f , +0x83e9 , 0x5023 , 0x4ff8 , 0x5305 , +0x5446 , 0x5831 , 0x5949 , 0x5b9d , +0x5cf0 , 0x5cef , 0x5d29 , 0x5e96 , +0x62b1 , 0x6367 , 0x653e , 0x65b9 , +0x670b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6cd5 , 0x6ce1 , 0x70f9 , 0x7832 , +0x7e2b , 0x80de , 0x82b3 , 0x840c , +0x84ec , 0x8702 , 0x8912 , 0x8a2a , +0x8c4a , 0x90a6 , 0x92d2 , 0x98fd , +0x9cf3 , 0x9d6c , 0x4e4f , 0x4ea1 , +0x508d , 0x5256 , 0x574a , 0x59a8 , +0x5e3d , 0x5fd8 , 0x5fd9 , 0x623f , +0x66b4 , 0x671b , 0x67d0 , 0x68d2 , +0x5192 , 0x7d21 , 0x80aa , 0x81a8 , +0x8b00 , 0x8c8c , 0x8cbf , 0x927e , +0x9632 , 0x5420 , 0x982c , 0x5317 , +0x50d5 , 0x535c , 0x58a8 , 0x64b2 , +0x6734 , 0x7267 , 0x7766 , 0x7a46 , +0x91e6 , 0x52c3 , 0x6ca1 , 0x6b86 , +0x5800 , 0x5e4c , 0x5954 , 0x672c , +0x7ffb , 0x51e1 , 0x76c6 , 0x0 , +0x6469 , 0x78e8 , 0x9b54 , 0x9ebb , +0x57cb , 0x59b9 , 0x6627 , 0x679a , +0x6bce , 0x54e9 , 0x69d9 , 0x5e55 , +0x819c , 0x6795 , 0x9baa , 0x67fe , +0x9c52 , 0x685d , 0x4ea6 , 0x4fe3 , +0x53c8 , 0x62b9 , 0x672b , 0x6cab , +0x8fc4 , 0x4fad , 0x7e6d , 0x9ebf , +0x4e07 , 0x6162 , 0x6e80 , 0x6f2b , +0x8513 , 0x5473 , 0x672a , 0x9b45 , +0x5df3 , 0x7b95 , 0x5cac , 0x5bc6 , +0x871c , 0x6e4a , 0x84d1 , 0x7a14 , +0x8108 , 0x5999 , 0x7c8d , 0x6c11 , +0x7720 , 0x52d9 , 0x5922 , 0x7121 , +0x725f , 0x77db , 0x9727 , 0x9d61 , +0x690b , 0x5a7f , 0x5a18 , 0x51a5 , +0x540d , 0x547d , 0x660e , 0x76df , +0x8ff7 , 0x9298 , 0x9cf4 , 0x59ea , +0x725d , 0x6ec5 , 0x514d , 0x68c9 , +0x7dbf , 0x7dec , 0x9762 , 0x9eba , +0x6478 , 0x6a21 , 0x8302 , 0x5984 , +0x5b5f , 0x6bdb , 0x731b , 0x76f2 , +0x7db2 , 0x8017 , 0x8499 , 0x5132 , +0x6728 , 0x9ed9 , 0x76ee , 0x6762 , +0x52ff , 0x9905 , 0x5c24 , 0x623b , +0x7c7e , 0x8cb0 , 0x554f , 0x60b6 , +0x7d0b , 0x9580 , 0x5301 , 0x4e5f , +0x51b6 , 0x591c , 0x723a , 0x8036 , +0x91ce , 0x5f25 , 0x77e2 , 0x5384 , +0x5f79 , 0x7d04 , 0x85ac , 0x8a33 , +0x8e8d , 0x9756 , 0x67f3 , 0x85ae , +0x9453 , 0x6109 , 0x6108 , 0x6cb9 , +0x7652 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8aed , 0x8f38 , 0x552f , 0x4f51 , +0x512a , 0x52c7 , 0x53cb , 0x5ba5 , +0x5e7d , 0x60a0 , 0x6182 , 0x63d6 , +0x6709 , 0x67da , 0x6e67 , 0x6d8c , +0x7336 , 0x7337 , 0x7531 , 0x7950 , +0x88d5 , 0x8a98 , 0x904a , 0x9091 , +0x90f5 , 0x96c4 , 0x878d , 0x5915 , +0x4e88 , 0x4f59 , 0x4e0e , 0x8a89 , +0x8f3f , 0x9810 , 0x50ad , 0x5e7c , +0x5996 , 0x5bb9 , 0x5eb8 , 0x63da , +0x63fa , 0x64c1 , 0x66dc , 0x694a , +0x69d8 , 0x6d0b , 0x6eb6 , 0x7194 , +0x7528 , 0x7aaf , 0x7f8a , 0x8000 , +0x8449 , 0x84c9 , 0x8981 , 0x8b21 , +0x8e0a , 0x9065 , 0x967d , 0x990a , +0x617e , 0x6291 , 0x6b32 , 0x0 , +0x6c83 , 0x6d74 , 0x7fcc , 0x7ffc , +0x6dc0 , 0x7f85 , 0x87ba , 0x88f8 , +0x6765 , 0x83b1 , 0x983c , 0x96f7 , +0x6d1b , 0x7d61 , 0x843d , 0x916a , +0x4e71 , 0x5375 , 0x5d50 , 0x6b04 , +0x6feb , 0x85cd , 0x862d , 0x89a7 , +0x5229 , 0x540f , 0x5c65 , 0x674e , +0x68a8 , 0x7406 , 0x7483 , 0x75e2 , +0x88cf , 0x88e1 , 0x91cc , 0x96e2 , +0x9678 , 0x5f8b , 0x7387 , 0x7acb , +0x844e , 0x63a0 , 0x7565 , 0x5289 , +0x6d41 , 0x6e9c , 0x7409 , 0x7559 , +0x786b , 0x7c92 , 0x9686 , 0x7adc , +0x9f8d , 0x4fb6 , 0x616e , 0x65c5 , +0x865c , 0x4e86 , 0x4eae , 0x50da , +0x4e21 , 0x51cc , 0x5bee , 0x6599 , +0x6881 , 0x6dbc , 0x731f , 0x7642 , +0x77ad , 0x7a1c , 0x7ce7 , 0x826f , +0x8ad2 , 0x907c , 0x91cf , 0x9675 , +0x9818 , 0x529b , 0x7dd1 , 0x502b , +0x5398 , 0x6797 , 0x6dcb , 0x71d0 , +0x7433 , 0x81e8 , 0x8f2a , 0x96a3 , +0x9c57 , 0x9e9f , 0x7460 , 0x5841 , +0x6d99 , 0x7d2f , 0x985e , 0x4ee4 , +0x4f36 , 0x4f8b , 0x51b7 , 0x52b1 , +0x5dba , 0x601c , 0x73b2 , 0x793c , +0x82d3 , 0x9234 , 0x96b7 , 0x96f6 , +0x970a , 0x9e97 , 0x9f62 , 0x66a6 , +0x6b74 , 0x5217 , 0x52a3 , 0x70c8 , +0x88c2 , 0x5ec9 , 0x604b , 0x6190 , +0x6f23 , 0x7149 , 0x7c3e , 0x7df4 , +0x806f , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x84ee , 0x9023 , 0x932c , 0x5442 , +0x9b6f , 0x6ad3 , 0x7089 , 0x8cc2 , +0x8def , 0x9732 , 0x52b4 , 0x5a41 , +0x5eca , 0x5f04 , 0x6717 , 0x697c , +0x6994 , 0x6d6a , 0x6f0f , 0x7262 , +0x72fc , 0x7bed , 0x8001 , 0x807e , +0x874b , 0x90ce , 0x516d , 0x9e93 , +0x7984 , 0x808b , 0x9332 , 0x8ad6 , +0x502d , 0x548c , 0x8a71 , 0x6b6a , +0x8cc4 , 0x8107 , 0x60d1 , 0x67a0 , +0x9df2 , 0x4e99 , 0x4e98 , 0x9c10 , +0x8a6b , 0x85c1 , 0x8568 , 0x6900 , +0x6e7e , 0x7897 , 0x8155 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x5f0c , +0x4e10 , 0x4e15 , 0x4e2a , 0x4e31 , +0x4e36 , 0x4e3c , 0x4e3f , 0x4e42 , +0x4e56 , 0x4e58 , 0x4e82 , 0x4e85 , +0x8c6b , 0x4e8a , 0x8212 , 0x5f0d , +0x4e8e , 0x4e9e , 0x4e9f , 0x4ea0 , +0x4ea2 , 0x4eb0 , 0x4eb3 , 0x4eb6 , +0x4ece , 0x4ecd , 0x4ec4 , 0x4ec6 , +0x4ec2 , 0x4ed7 , 0x4ede , 0x4eed , +0x4edf , 0x4ef7 , 0x4f09 , 0x4f5a , +0x4f30 , 0x4f5b , 0x4f5d , 0x4f57 , +0x4f47 , 0x4f76 , 0x4f88 , 0x4f8f , +0x4f98 , 0x4f7b , 0x4f69 , 0x4f70 , +0x4f91 , 0x4f6f , 0x4f86 , 0x4f96 , +0x5118 , 0x4fd4 , 0x4fdf , 0x4fce , +0x4fd8 , 0x4fdb , 0x4fd1 , 0x4fda , +0x4fd0 , 0x4fe4 , 0x4fe5 , 0x501a , +0x5028 , 0x5014 , 0x502a , 0x5025 , +0x5005 , 0x4f1c , 0x4ff6 , 0x5021 , +0x5029 , 0x502c , 0x4ffe , 0x4fef , +0x5011 , 0x5006 , 0x5043 , 0x5047 , +0x6703 , 0x5055 , 0x5050 , 0x5048 , +0x505a , 0x5056 , 0x506c , 0x5078 , +0x5080 , 0x509a , 0x5085 , 0x50b4 , +0x50b2 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x50c9 , 0x50ca , 0x50b3 , 0x50c2 , +0x50d6 , 0x50de , 0x50e5 , 0x50ed , +0x50e3 , 0x50ee , 0x50f9 , 0x50f5 , +0x5109 , 0x5101 , 0x5102 , 0x5116 , +0x5115 , 0x5114 , 0x511a , 0x5121 , +0x513a , 0x5137 , 0x513c , 0x513b , +0x513f , 0x5140 , 0x5152 , 0x514c , +0x5154 , 0x5162 , 0x7af8 , 0x5169 , +0x516a , 0x516e , 0x5180 , 0x5182 , +0x56d8 , 0x518c , 0x5189 , 0x518f , +0x5191 , 0x5193 , 0x5195 , 0x5196 , +0x51a4 , 0x51a6 , 0x51a2 , 0x51a9 , +0x51aa , 0x51ab , 0x51b3 , 0x51b1 , +0x51b2 , 0x51b0 , 0x51b5 , 0x51bd , +0x51c5 , 0x51c9 , 0x51db , 0x51e0 , +0x8655 , 0x51e9 , 0x51ed , 0x0 , +0x51f0 , 0x51f5 , 0x51fe , 0x5204 , +0x520b , 0x5214 , 0x520e , 0x5227 , +0x522a , 0x522e , 0x5233 , 0x5239 , +0x524f , 0x5244 , 0x524b , 0x524c , +0x525e , 0x5254 , 0x526a , 0x5274 , +0x5269 , 0x5273 , 0x527f , 0x527d , +0x528d , 0x5294 , 0x5292 , 0x5271 , +0x5288 , 0x5291 , 0x8fa8 , 0x8fa7 , +0x52ac , 0x52ad , 0x52bc , 0x52b5 , +0x52c1 , 0x52cd , 0x52d7 , 0x52de , +0x52e3 , 0x52e6 , 0x98ed , 0x52e0 , +0x52f3 , 0x52f5 , 0x52f8 , 0x52f9 , +0x5306 , 0x5308 , 0x7538 , 0x530d , +0x5310 , 0x530f , 0x5315 , 0x531a , +0x5323 , 0x532f , 0x5331 , 0x5333 , +0x5338 , 0x5340 , 0x5346 , 0x5345 , +0x4e17 , 0x5349 , 0x534d , 0x51d6 , +0x535e , 0x5369 , 0x536e , 0x5918 , +0x537b , 0x5377 , 0x5382 , 0x5396 , +0x53a0 , 0x53a6 , 0x53a5 , 0x53ae , +0x53b0 , 0x53b6 , 0x53c3 , 0x7c12 , +0x96d9 , 0x53df , 0x66fc , 0x71ee , +0x53ee , 0x53e8 , 0x53ed , 0x53fa , +0x5401 , 0x543d , 0x5440 , 0x542c , +0x542d , 0x543c , 0x542e , 0x5436 , +0x5429 , 0x541d , 0x544e , 0x548f , +0x5475 , 0x548e , 0x545f , 0x5471 , +0x5477 , 0x5470 , 0x5492 , 0x547b , +0x5480 , 0x5476 , 0x5484 , 0x5490 , +0x5486 , 0x54c7 , 0x54a2 , 0x54b8 , +0x54a5 , 0x54ac , 0x54c4 , 0x54c8 , +0x54a8 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x54ab , 0x54c2 , 0x54a4 , 0x54be , +0x54bc , 0x54d8 , 0x54e5 , 0x54e6 , +0x550f , 0x5514 , 0x54fd , 0x54ee , +0x54ed , 0x54fa , 0x54e2 , 0x5539 , +0x5540 , 0x5563 , 0x554c , 0x552e , +0x555c , 0x5545 , 0x5556 , 0x5557 , +0x5538 , 0x5533 , 0x555d , 0x5599 , +0x5580 , 0x54af , 0x558a , 0x559f , +0x557b , 0x557e , 0x5598 , 0x559e , +0x55ae , 0x557c , 0x5583 , 0x55a9 , +0x5587 , 0x55a8 , 0x55da , 0x55c5 , +0x55df , 0x55c4 , 0x55dc , 0x55e4 , +0x55d4 , 0x5614 , 0x55f7 , 0x5616 , +0x55fe , 0x55fd , 0x561b , 0x55f9 , +0x564e , 0x5650 , 0x71df , 0x5634 , +0x5636 , 0x5632 , 0x5638 , 0x0 , +0x566b , 0x5664 , 0x562f , 0x566c , +0x566a , 0x5686 , 0x5680 , 0x568a , +0x56a0 , 0x5694 , 0x568f , 0x56a5 , +0x56ae , 0x56b6 , 0x56b4 , 0x56c2 , +0x56bc , 0x56c1 , 0x56c3 , 0x56c0 , +0x56c8 , 0x56ce , 0x56d1 , 0x56d3 , +0x56d7 , 0x56ee , 0x56f9 , 0x5700 , +0x56ff , 0x5704 , 0x5709 , 0x5708 , +0x570b , 0x570d , 0x5713 , 0x5718 , +0x5716 , 0x55c7 , 0x571c , 0x5726 , +0x5737 , 0x5738 , 0x574e , 0x573b , +0x5740 , 0x574f , 0x5769 , 0x57c0 , +0x5788 , 0x5761 , 0x577f , 0x5789 , +0x5793 , 0x57a0 , 0x57b3 , 0x57a4 , +0x57aa , 0x57b0 , 0x57c3 , 0x57c6 , +0x57d4 , 0x57d2 , 0x57d3 , 0x580a , +0x57d6 , 0x57e3 , 0x580b , 0x5819 , +0x581d , 0x5872 , 0x5821 , 0x5862 , +0x584b , 0x5870 , 0x6bc0 , 0x5852 , +0x583d , 0x5879 , 0x5885 , 0x58b9 , +0x589f , 0x58ab , 0x58ba , 0x58de , +0x58bb , 0x58b8 , 0x58ae , 0x58c5 , +0x58d3 , 0x58d1 , 0x58d7 , 0x58d9 , +0x58d8 , 0x58e5 , 0x58dc , 0x58e4 , +0x58df , 0x58ef , 0x58fa , 0x58f9 , +0x58fb , 0x58fc , 0x58fd , 0x5902 , +0x590a , 0x5910 , 0x591b , 0x68a6 , +0x5925 , 0x592c , 0x592d , 0x5932 , +0x5938 , 0x593e , 0x7ad2 , 0x5955 , +0x5950 , 0x594e , 0x595a , 0x5958 , +0x5962 , 0x5960 , 0x5967 , 0x596c , +0x5969 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5978 , 0x5981 , 0x599d , 0x4f5e , +0x4fab , 0x59a3 , 0x59b2 , 0x59c6 , +0x59e8 , 0x59dc , 0x598d , 0x59d9 , +0x59da , 0x5a25 , 0x5a1f , 0x5a11 , +0x5a1c , 0x5a09 , 0x5a1a , 0x5a40 , +0x5a6c , 0x5a49 , 0x5a35 , 0x5a36 , +0x5a62 , 0x5a6a , 0x5a9a , 0x5abc , +0x5abe , 0x5acb , 0x5ac2 , 0x5abd , +0x5ae3 , 0x5ad7 , 0x5ae6 , 0x5ae9 , +0x5ad6 , 0x5afa , 0x5afb , 0x5b0c , +0x5b0b , 0x5b16 , 0x5b32 , 0x5ad0 , +0x5b2a , 0x5b36 , 0x5b3e , 0x5b43 , +0x5b45 , 0x5b40 , 0x5b51 , 0x5b55 , +0x5b5a , 0x5b5b , 0x5b65 , 0x5b69 , +0x5b70 , 0x5b73 , 0x5b75 , 0x5b78 , +0x6588 , 0x5b7a , 0x5b80 , 0x0 , +0x5b83 , 0x5ba6 , 0x5bb8 , 0x5bc3 , +0x5bc7 , 0x5bc9 , 0x5bd4 , 0x5bd0 , +0x5be4 , 0x5be6 , 0x5be2 , 0x5bde , +0x5be5 , 0x5beb , 0x5bf0 , 0x5bf6 , +0x5bf3 , 0x5c05 , 0x5c07 , 0x5c08 , +0x5c0d , 0x5c13 , 0x5c20 , 0x5c22 , +0x5c28 , 0x5c38 , 0x5c39 , 0x5c41 , +0x5c46 , 0x5c4e , 0x5c53 , 0x5c50 , +0x5c4f , 0x5b71 , 0x5c6c , 0x5c6e , +0x4e62 , 0x5c76 , 0x5c79 , 0x5c8c , +0x5c91 , 0x5c94 , 0x599b , 0x5cab , +0x5cbb , 0x5cb6 , 0x5cbc , 0x5cb7 , +0x5cc5 , 0x5cbe , 0x5cc7 , 0x5cd9 , +0x5ce9 , 0x5cfd , 0x5cfa , 0x5ced , +0x5d8c , 0x5cea , 0x5d0b , 0x5d15 , +0x5d17 , 0x5d5c , 0x5d1f , 0x5d1b , +0x5d11 , 0x5d14 , 0x5d22 , 0x5d1a , +0x5d19 , 0x5d18 , 0x5d4c , 0x5d52 , +0x5d4e , 0x5d4b , 0x5d6c , 0x5d73 , +0x5d76 , 0x5d87 , 0x5d84 , 0x5d82 , +0x5da2 , 0x5d9d , 0x5dac , 0x5dae , +0x5dbd , 0x5d90 , 0x5db7 , 0x5dbc , +0x5dc9 , 0x5dcd , 0x5dd3 , 0x5dd2 , +0x5dd6 , 0x5ddb , 0x5deb , 0x5df2 , +0x5df5 , 0x5e0b , 0x5e1a , 0x5e19 , +0x5e11 , 0x5e1b , 0x5e36 , 0x5e37 , +0x5e44 , 0x5e43 , 0x5e40 , 0x5e4e , +0x5e57 , 0x5e54 , 0x5e5f , 0x5e62 , +0x5e64 , 0x5e47 , 0x5e75 , 0x5e76 , +0x5e7a , 0x9ebc , 0x5e7f , 0x5ea0 , +0x5ec1 , 0x5ec2 , 0x5ec8 , 0x5ed0 , +0x5ecf , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x5ed6 , 0x5ee3 , 0x5edd , 0x5eda , +0x5edb , 0x5ee2 , 0x5ee1 , 0x5ee8 , +0x5ee9 , 0x5eec , 0x5ef1 , 0x5ef3 , +0x5ef0 , 0x5ef4 , 0x5ef8 , 0x5efe , +0x5f03 , 0x5f09 , 0x5f5d , 0x5f5c , +0x5f0b , 0x5f11 , 0x5f16 , 0x5f29 , +0x5f2d , 0x5f38 , 0x5f41 , 0x5f48 , +0x5f4c , 0x5f4e , 0x5f2f , 0x5f51 , +0x5f56 , 0x5f57 , 0x5f59 , 0x5f61 , +0x5f6d , 0x5f73 , 0x5f77 , 0x5f83 , +0x5f82 , 0x5f7f , 0x5f8a , 0x5f88 , +0x5f91 , 0x5f87 , 0x5f9e , 0x5f99 , +0x5f98 , 0x5fa0 , 0x5fa8 , 0x5fad , +0x5fbc , 0x5fd6 , 0x5ffb , 0x5fe4 , +0x5ff8 , 0x5ff1 , 0x5fdd , 0x60b3 , +0x5fff , 0x6021 , 0x6060 , 0x0 , +0x6019 , 0x6010 , 0x6029 , 0x600e , +0x6031 , 0x601b , 0x6015 , 0x602b , +0x6026 , 0x600f , 0x603a , 0x605a , +0x6041 , 0x606a , 0x6077 , 0x605f , +0x604a , 0x6046 , 0x604d , 0x6063 , +0x6043 , 0x6064 , 0x6042 , 0x606c , +0x606b , 0x6059 , 0x6081 , 0x608d , +0x60e7 , 0x6083 , 0x609a , 0x6084 , +0x609b , 0x6096 , 0x6097 , 0x6092 , +0x60a7 , 0x608b , 0x60e1 , 0x60b8 , +0x60e0 , 0x60d3 , 0x60b4 , 0x5ff0 , +0x60bd , 0x60c6 , 0x60b5 , 0x60d8 , +0x614d , 0x6115 , 0x6106 , 0x60f6 , +0x60f7 , 0x6100 , 0x60f4 , 0x60fa , +0x6103 , 0x6121 , 0x60fb , 0x60f1 , +0x610d , 0x610e , 0x6147 , 0x613e , +0x6128 , 0x6127 , 0x614a , 0x613f , +0x613c , 0x612c , 0x6134 , 0x613d , +0x6142 , 0x6144 , 0x6173 , 0x6177 , +0x6158 , 0x6159 , 0x615a , 0x616b , +0x6174 , 0x616f , 0x6165 , 0x6171 , +0x615f , 0x615d , 0x6153 , 0x6175 , +0x6199 , 0x6196 , 0x6187 , 0x61ac , +0x6194 , 0x619a , 0x618a , 0x6191 , +0x61ab , 0x61ae , 0x61cc , 0x61ca , +0x61c9 , 0x61f7 , 0x61c8 , 0x61c3 , +0x61c6 , 0x61ba , 0x61cb , 0x7f79 , +0x61cd , 0x61e6 , 0x61e3 , 0x61f6 , +0x61fa , 0x61f4 , 0x61ff , 0x61fd , +0x61fc , 0x61fe , 0x6200 , 0x6208 , +0x6209 , 0x620d , 0x620c , 0x6214 , +0x621b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x621e , 0x6221 , 0x622a , 0x622e , +0x6230 , 0x6232 , 0x6233 , 0x6241 , +0x624e , 0x625e , 0x6263 , 0x625b , +0x6260 , 0x6268 , 0x627c , 0x6282 , +0x6289 , 0x627e , 0x6292 , 0x6293 , +0x6296 , 0x62d4 , 0x6283 , 0x6294 , +0x62d7 , 0x62d1 , 0x62bb , 0x62cf , +0x62ff , 0x62c6 , 0x64d4 , 0x62c8 , +0x62dc , 0x62cc , 0x62ca , 0x62c2 , +0x62c7 , 0x629b , 0x62c9 , 0x630c , +0x62ee , 0x62f1 , 0x6327 , 0x6302 , +0x6308 , 0x62ef , 0x62f5 , 0x6350 , +0x633e , 0x634d , 0x641c , 0x634f , +0x6396 , 0x638e , 0x6380 , 0x63ab , +0x6376 , 0x63a3 , 0x638f , 0x6389 , +0x639f , 0x63b5 , 0x636b , 0x0 , +0x6369 , 0x63be , 0x63e9 , 0x63c0 , +0x63c6 , 0x63e3 , 0x63c9 , 0x63d2 , +0x63f6 , 0x63c4 , 0x6416 , 0x6434 , +0x6406 , 0x6413 , 0x6426 , 0x6436 , +0x651d , 0x6417 , 0x6428 , 0x640f , +0x6467 , 0x646f , 0x6476 , 0x644e , +0x652a , 0x6495 , 0x6493 , 0x64a5 , +0x64a9 , 0x6488 , 0x64bc , 0x64da , +0x64d2 , 0x64c5 , 0x64c7 , 0x64bb , +0x64d8 , 0x64c2 , 0x64f1 , 0x64e7 , +0x8209 , 0x64e0 , 0x64e1 , 0x62ac , +0x64e3 , 0x64ef , 0x652c , 0x64f6 , +0x64f4 , 0x64f2 , 0x64fa , 0x6500 , +0x64fd , 0x6518 , 0x651c , 0x6505 , +0x6524 , 0x6523 , 0x652b , 0x6534 , +0x6535 , 0x6537 , 0x6536 , 0x6538 , +0x754b , 0x6548 , 0x6556 , 0x6555 , +0x654d , 0x6558 , 0x655e , 0x655d , +0x6572 , 0x6578 , 0x6582 , 0x6583 , +0x8b8a , 0x659b , 0x659f , 0x65ab , +0x65b7 , 0x65c3 , 0x65c6 , 0x65c1 , +0x65c4 , 0x65cc , 0x65d2 , 0x65db , +0x65d9 , 0x65e0 , 0x65e1 , 0x65f1 , +0x6772 , 0x660a , 0x6603 , 0x65fb , +0x6773 , 0x6635 , 0x6636 , 0x6634 , +0x661c , 0x664f , 0x6644 , 0x6649 , +0x6641 , 0x665e , 0x665d , 0x6664 , +0x6667 , 0x6668 , 0x665f , 0x6662 , +0x6670 , 0x6683 , 0x6688 , 0x668e , +0x6689 , 0x6684 , 0x6698 , 0x669d , +0x66c1 , 0x66b9 , 0x66c9 , 0x66be , +0x66bc , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x66c4 , 0x66b8 , 0x66d6 , 0x66da , +0x66e0 , 0x663f , 0x66e6 , 0x66e9 , +0x66f0 , 0x66f5 , 0x66f7 , 0x670f , +0x6716 , 0x671e , 0x6726 , 0x6727 , +0x9738 , 0x672e , 0x673f , 0x6736 , +0x6741 , 0x6738 , 0x6737 , 0x6746 , +0x675e , 0x6760 , 0x6759 , 0x6763 , +0x6764 , 0x6789 , 0x6770 , 0x67a9 , +0x677c , 0x676a , 0x678c , 0x678b , +0x67a6 , 0x67a1 , 0x6785 , 0x67b7 , +0x67ef , 0x67b4 , 0x67ec , 0x67b3 , +0x67e9 , 0x67b8 , 0x67e4 , 0x67de , +0x67dd , 0x67e2 , 0x67ee , 0x67b9 , +0x67ce , 0x67c6 , 0x67e7 , 0x6a9c , +0x681e , 0x6846 , 0x6829 , 0x6840 , +0x684d , 0x6832 , 0x684e , 0x0 , +0x68b3 , 0x682b , 0x6859 , 0x6863 , +0x6877 , 0x687f , 0x689f , 0x688f , +0x68ad , 0x6894 , 0x689d , 0x689b , +0x6883 , 0x6aae , 0x68b9 , 0x6874 , +0x68b5 , 0x68a0 , 0x68ba , 0x690f , +0x688d , 0x687e , 0x6901 , 0x68ca , +0x6908 , 0x68d8 , 0x6922 , 0x6926 , +0x68e1 , 0x690c , 0x68cd , 0x68d4 , +0x68e7 , 0x68d5 , 0x6936 , 0x6912 , +0x6904 , 0x68d7 , 0x68e3 , 0x6925 , +0x68f9 , 0x68e0 , 0x68ef , 0x6928 , +0x692a , 0x691a , 0x6923 , 0x6921 , +0x68c6 , 0x6979 , 0x6977 , 0x695c , +0x6978 , 0x696b , 0x6954 , 0x697e , +0x696e , 0x6939 , 0x6974 , 0x693d , +0x6959 , 0x6930 , 0x6961 , 0x695e , +0x695d , 0x6981 , 0x696a , 0x69b2 , +0x69ae , 0x69d0 , 0x69bf , 0x69c1 , +0x69d3 , 0x69be , 0x69ce , 0x5be8 , +0x69ca , 0x69dd , 0x69bb , 0x69c3 , +0x69a7 , 0x6a2e , 0x6991 , 0x69a0 , +0x699c , 0x6995 , 0x69b4 , 0x69de , +0x69e8 , 0x6a02 , 0x6a1b , 0x69ff , +0x6b0a , 0x69f9 , 0x69f2 , 0x69e7 , +0x6a05 , 0x69b1 , 0x6a1e , 0x69ed , +0x6a14 , 0x69eb , 0x6a0a , 0x6a12 , +0x6ac1 , 0x6a23 , 0x6a13 , 0x6a44 , +0x6a0c , 0x6a72 , 0x6a36 , 0x6a78 , +0x6a47 , 0x6a62 , 0x6a59 , 0x6a66 , +0x6a48 , 0x6a38 , 0x6a22 , 0x6a90 , +0x6a8d , 0x6aa0 , 0x6a84 , 0x6aa2 , +0x6aa3 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6a97 , 0x8617 , 0x6abb , 0x6ac3 , +0x6ac2 , 0x6ab8 , 0x6ab3 , 0x6aac , +0x6ade , 0x6ad1 , 0x6adf , 0x6aaa , +0x6ada , 0x6aea , 0x6afb , 0x6b05 , +0x8616 , 0x6afa , 0x6b12 , 0x6b16 , +0x9b31 , 0x6b1f , 0x6b38 , 0x6b37 , +0x76dc , 0x6b39 , 0x98ee , 0x6b47 , +0x6b43 , 0x6b49 , 0x6b50 , 0x6b59 , +0x6b54 , 0x6b5b , 0x6b5f , 0x6b61 , +0x6b78 , 0x6b79 , 0x6b7f , 0x6b80 , +0x6b84 , 0x6b83 , 0x6b8d , 0x6b98 , +0x6b95 , 0x6b9e , 0x6ba4 , 0x6baa , +0x6bab , 0x6baf , 0x6bb2 , 0x6bb1 , +0x6bb3 , 0x6bb7 , 0x6bbc , 0x6bc6 , +0x6bcb , 0x6bd3 , 0x6bdf , 0x6bec , +0x6beb , 0x6bf3 , 0x6bef , 0x0 , +0x9ebe , 0x6c08 , 0x6c13 , 0x6c14 , +0x6c1b , 0x6c24 , 0x6c23 , 0x6c5e , +0x6c55 , 0x6c62 , 0x6c6a , 0x6c82 , +0x6c8d , 0x6c9a , 0x6c81 , 0x6c9b , +0x6c7e , 0x6c68 , 0x6c73 , 0x6c92 , +0x6c90 , 0x6cc4 , 0x6cf1 , 0x6cd3 , +0x6cbd , 0x6cd7 , 0x6cc5 , 0x6cdd , +0x6cae , 0x6cb1 , 0x6cbe , 0x6cba , +0x6cdb , 0x6cef , 0x6cd9 , 0x6cea , +0x6d1f , 0x884d , 0x6d36 , 0x6d2b , +0x6d3d , 0x6d38 , 0x6d19 , 0x6d35 , +0x6d33 , 0x6d12 , 0x6d0c , 0x6d63 , +0x6d93 , 0x6d64 , 0x6d5a , 0x6d79 , +0x6d59 , 0x6d8e , 0x6d95 , 0x6fe4 , +0x6d85 , 0x6df9 , 0x6e15 , 0x6e0a , +0x6db5 , 0x6dc7 , 0x6de6 , 0x6db8 , +0x6dc6 , 0x6dec , 0x6dde , 0x6dcc , +0x6de8 , 0x6dd2 , 0x6dc5 , 0x6dfa , +0x6dd9 , 0x6de4 , 0x6dd5 , 0x6dea , +0x6dee , 0x6e2d , 0x6e6e , 0x6e2e , +0x6e19 , 0x6e72 , 0x6e5f , 0x6e3e , +0x6e23 , 0x6e6b , 0x6e2b , 0x6e76 , +0x6e4d , 0x6e1f , 0x6e43 , 0x6e3a , +0x6e4e , 0x6e24 , 0x6eff , 0x6e1d , +0x6e38 , 0x6e82 , 0x6eaa , 0x6e98 , +0x6ec9 , 0x6eb7 , 0x6ed3 , 0x6ebd , +0x6eaf , 0x6ec4 , 0x6eb2 , 0x6ed4 , +0x6ed5 , 0x6e8f , 0x6ea5 , 0x6ec2 , +0x6e9f , 0x6f41 , 0x6f11 , 0x704c , +0x6eec , 0x6ef8 , 0x6efe , 0x6f3f , +0x6ef2 , 0x6f31 , 0x6eef , 0x6f32 , +0x6ecc , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x6f3e , 0x6f13 , 0x6ef7 , 0x6f86 , +0x6f7a , 0x6f78 , 0x6f81 , 0x6f80 , +0x6f6f , 0x6f5b , 0x6ff3 , 0x6f6d , +0x6f82 , 0x6f7c , 0x6f58 , 0x6f8e , +0x6f91 , 0x6fc2 , 0x6f66 , 0x6fb3 , +0x6fa3 , 0x6fa1 , 0x6fa4 , 0x6fb9 , +0x6fc6 , 0x6faa , 0x6fdf , 0x6fd5 , +0x6fec , 0x6fd4 , 0x6fd8 , 0x6ff1 , +0x6fee , 0x6fdb , 0x7009 , 0x700b , +0x6ffa , 0x7011 , 0x7001 , 0x700f , +0x6ffe , 0x701b , 0x701a , 0x6f74 , +0x701d , 0x7018 , 0x701f , 0x7030 , +0x703e , 0x7032 , 0x7051 , 0x7063 , +0x7099 , 0x7092 , 0x70af , 0x70f1 , +0x70ac , 0x70b8 , 0x70b3 , 0x70ae , +0x70df , 0x70cb , 0x70dd , 0x0 , +0x70d9 , 0x7109 , 0x70fd , 0x711c , +0x7119 , 0x7165 , 0x7155 , 0x7188 , +0x7166 , 0x7162 , 0x714c , 0x7156 , +0x716c , 0x718f , 0x71fb , 0x7184 , +0x7195 , 0x71a8 , 0x71ac , 0x71d7 , +0x71b9 , 0x71be , 0x71d2 , 0x71c9 , +0x71d4 , 0x71ce , 0x71e0 , 0x71ec , +0x71e7 , 0x71f5 , 0x71fc , 0x71f9 , +0x71ff , 0x720d , 0x7210 , 0x721b , +0x7228 , 0x722d , 0x722c , 0x7230 , +0x7232 , 0x723b , 0x723c , 0x723f , +0x7240 , 0x7246 , 0x724b , 0x7258 , +0x7274 , 0x727e , 0x7282 , 0x7281 , +0x7287 , 0x7292 , 0x7296 , 0x72a2 , +0x72a7 , 0x72b9 , 0x72b2 , 0x72c3 , +0x72c6 , 0x72c4 , 0x72ce , 0x72d2 , +0x72e2 , 0x72e0 , 0x72e1 , 0x72f9 , +0x72f7 , 0x500f , 0x7317 , 0x730a , +0x731c , 0x7316 , 0x731d , 0x7334 , +0x732f , 0x7329 , 0x7325 , 0x733e , +0x734e , 0x734f , 0x9ed8 , 0x7357 , +0x736a , 0x7368 , 0x7370 , 0x7378 , +0x7375 , 0x737b , 0x737a , 0x73c8 , +0x73b3 , 0x73ce , 0x73bb , 0x73c0 , +0x73e5 , 0x73ee , 0x73de , 0x74a2 , +0x7405 , 0x746f , 0x7425 , 0x73f8 , +0x7432 , 0x743a , 0x7455 , 0x743f , +0x745f , 0x7459 , 0x7441 , 0x745c , +0x7469 , 0x7470 , 0x7463 , 0x746a , +0x7476 , 0x747e , 0x748b , 0x749e , +0x74a7 , 0x74ca , 0x74cf , 0x74d4 , +0x73f1 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x74e0 , 0x74e3 , 0x74e7 , 0x74e9 , +0x74ee , 0x74f2 , 0x74f0 , 0x74f1 , +0x74f8 , 0x74f7 , 0x7504 , 0x7503 , +0x7505 , 0x750c , 0x750e , 0x750d , +0x7515 , 0x7513 , 0x751e , 0x7526 , +0x752c , 0x753c , 0x7544 , 0x754d , +0x754a , 0x7549 , 0x755b , 0x7546 , +0x755a , 0x7569 , 0x7564 , 0x7567 , +0x756b , 0x756d , 0x7578 , 0x7576 , +0x7586 , 0x7587 , 0x7574 , 0x758a , +0x7589 , 0x7582 , 0x7594 , 0x759a , +0x759d , 0x75a5 , 0x75a3 , 0x75c2 , +0x75b3 , 0x75c3 , 0x75b5 , 0x75bd , +0x75b8 , 0x75bc , 0x75b1 , 0x75cd , +0x75ca , 0x75d2 , 0x75d9 , 0x75e3 , +0x75de , 0x75fe , 0x75ff , 0x0 , +0x75fc , 0x7601 , 0x75f0 , 0x75fa , +0x75f2 , 0x75f3 , 0x760b , 0x760d , +0x7609 , 0x761f , 0x7627 , 0x7620 , +0x7621 , 0x7622 , 0x7624 , 0x7634 , +0x7630 , 0x763b , 0x7647 , 0x7648 , +0x7646 , 0x765c , 0x7658 , 0x7661 , +0x7662 , 0x7668 , 0x7669 , 0x766a , +0x7667 , 0x766c , 0x7670 , 0x7672 , +0x7676 , 0x7678 , 0x767c , 0x7680 , +0x7683 , 0x7688 , 0x768b , 0x768e , +0x7696 , 0x7693 , 0x7699 , 0x769a , +0x76b0 , 0x76b4 , 0x76b8 , 0x76b9 , +0x76ba , 0x76c2 , 0x76cd , 0x76d6 , +0x76d2 , 0x76de , 0x76e1 , 0x76e5 , +0x76e7 , 0x76ea , 0x862f , 0x76fb , +0x7708 , 0x7707 , 0x7704 , 0x7729 , +0x7724 , 0x771e , 0x7725 , 0x7726 , +0x771b , 0x7737 , 0x7738 , 0x7747 , +0x775a , 0x7768 , 0x776b , 0x775b , +0x7765 , 0x777f , 0x777e , 0x7779 , +0x778e , 0x778b , 0x7791 , 0x77a0 , +0x779e , 0x77b0 , 0x77b6 , 0x77b9 , +0x77bf , 0x77bc , 0x77bd , 0x77bb , +0x77c7 , 0x77cd , 0x77d7 , 0x77da , +0x77dc , 0x77e3 , 0x77ee , 0x77fc , +0x780c , 0x7812 , 0x7926 , 0x7820 , +0x792a , 0x7845 , 0x788e , 0x7874 , +0x7886 , 0x787c , 0x789a , 0x788c , +0x78a3 , 0x78b5 , 0x78aa , 0x78af , +0x78d1 , 0x78c6 , 0x78cb , 0x78d4 , +0x78be , 0x78bc , 0x78c5 , 0x78ca , +0x78ec , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x78e7 , 0x78da , 0x78fd , 0x78f4 , +0x7907 , 0x7912 , 0x7911 , 0x7919 , +0x792c , 0x792b , 0x7940 , 0x7960 , +0x7957 , 0x795f , 0x795a , 0x7955 , +0x7953 , 0x797a , 0x797f , 0x798a , +0x799d , 0x79a7 , 0x9f4b , 0x79aa , +0x79ae , 0x79b3 , 0x79b9 , 0x79ba , +0x79c9 , 0x79d5 , 0x79e7 , 0x79ec , +0x79e1 , 0x79e3 , 0x7a08 , 0x7a0d , +0x7a18 , 0x7a19 , 0x7a20 , 0x7a1f , +0x7980 , 0x7a31 , 0x7a3b , 0x7a3e , +0x7a37 , 0x7a43 , 0x7a57 , 0x7a49 , +0x7a61 , 0x7a62 , 0x7a69 , 0x9f9d , +0x7a70 , 0x7a79 , 0x7a7d , 0x7a88 , +0x7a97 , 0x7a95 , 0x7a98 , 0x7a96 , +0x7aa9 , 0x7ac8 , 0x7ab0 , 0x0 , +0x7ab6 , 0x7ac5 , 0x7ac4 , 0x7abf , +0x9083 , 0x7ac7 , 0x7aca , 0x7acd , +0x7acf , 0x7ad5 , 0x7ad3 , 0x7ad9 , +0x7ada , 0x7add , 0x7ae1 , 0x7ae2 , +0x7ae6 , 0x7aed , 0x7af0 , 0x7b02 , +0x7b0f , 0x7b0a , 0x7b06 , 0x7b33 , +0x7b18 , 0x7b19 , 0x7b1e , 0x7b35 , +0x7b28 , 0x7b36 , 0x7b50 , 0x7b7a , +0x7b04 , 0x7b4d , 0x7b0b , 0x7b4c , +0x7b45 , 0x7b75 , 0x7b65 , 0x7b74 , +0x7b67 , 0x7b70 , 0x7b71 , 0x7b6c , +0x7b6e , 0x7b9d , 0x7b98 , 0x7b9f , +0x7b8d , 0x7b9c , 0x7b9a , 0x7b8b , +0x7b92 , 0x7b8f , 0x7b5d , 0x7b99 , +0x7bcb , 0x7bc1 , 0x7bcc , 0x7bcf , +0x7bb4 , 0x7bc6 , 0x7bdd , 0x7be9 , +0x7c11 , 0x7c14 , 0x7be6 , 0x7be5 , +0x7c60 , 0x7c00 , 0x7c07 , 0x7c13 , +0x7bf3 , 0x7bf7 , 0x7c17 , 0x7c0d , +0x7bf6 , 0x7c23 , 0x7c27 , 0x7c2a , +0x7c1f , 0x7c37 , 0x7c2b , 0x7c3d , +0x7c4c , 0x7c43 , 0x7c54 , 0x7c4f , +0x7c40 , 0x7c50 , 0x7c58 , 0x7c5f , +0x7c64 , 0x7c56 , 0x7c65 , 0x7c6c , +0x7c75 , 0x7c83 , 0x7c90 , 0x7ca4 , +0x7cad , 0x7ca2 , 0x7cab , 0x7ca1 , +0x7ca8 , 0x7cb3 , 0x7cb2 , 0x7cb1 , +0x7cae , 0x7cb9 , 0x7cbd , 0x7cc0 , +0x7cc5 , 0x7cc2 , 0x7cd8 , 0x7cd2 , +0x7cdc , 0x7ce2 , 0x9b3b , 0x7cef , +0x7cf2 , 0x7cf4 , 0x7cf6 , 0x7cfa , +0x7d06 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x7d02 , 0x7d1c , 0x7d15 , 0x7d0a , +0x7d45 , 0x7d4b , 0x7d2e , 0x7d32 , +0x7d3f , 0x7d35 , 0x7d46 , 0x7d73 , +0x7d56 , 0x7d4e , 0x7d72 , 0x7d68 , +0x7d6e , 0x7d4f , 0x7d63 , 0x7d93 , +0x7d89 , 0x7d5b , 0x7d8f , 0x7d7d , +0x7d9b , 0x7dba , 0x7dae , 0x7da3 , +0x7db5 , 0x7dc7 , 0x7dbd , 0x7dab , +0x7e3d , 0x7da2 , 0x7daf , 0x7ddc , +0x7db8 , 0x7d9f , 0x7db0 , 0x7dd8 , +0x7ddd , 0x7de4 , 0x7dde , 0x7dfb , +0x7df2 , 0x7de1 , 0x7e05 , 0x7e0a , +0x7e23 , 0x7e21 , 0x7e12 , 0x7e31 , +0x7e1f , 0x7e09 , 0x7e0b , 0x7e22 , +0x7e46 , 0x7e66 , 0x7e3b , 0x7e35 , +0x7e39 , 0x7e43 , 0x7e37 , 0x0 , +0x7e32 , 0x7e3a , 0x7e67 , 0x7e5d , +0x7e56 , 0x7e5e , 0x7e59 , 0x7e5a , +0x7e79 , 0x7e6a , 0x7e69 , 0x7e7c , +0x7e7b , 0x7e83 , 0x7dd5 , 0x7e7d , +0x8fae , 0x7e7f , 0x7e88 , 0x7e89 , +0x7e8c , 0x7e92 , 0x7e90 , 0x7e93 , +0x7e94 , 0x7e96 , 0x7e8e , 0x7e9b , +0x7e9c , 0x7f38 , 0x7f3a , 0x7f45 , +0x7f4c , 0x7f4d , 0x7f4e , 0x7f50 , +0x7f51 , 0x7f55 , 0x7f54 , 0x7f58 , +0x7f5f , 0x7f60 , 0x7f68 , 0x7f69 , +0x7f67 , 0x7f78 , 0x7f82 , 0x7f86 , +0x7f83 , 0x7f88 , 0x7f87 , 0x7f8c , +0x7f94 , 0x7f9e , 0x7f9d , 0x7f9a , +0x7fa3 , 0x7faf , 0x7fb2 , 0x7fb9 , +0x7fae , 0x7fb6 , 0x7fb8 , 0x8b71 , +0x7fc5 , 0x7fc6 , 0x7fca , 0x7fd5 , +0x7fd4 , 0x7fe1 , 0x7fe6 , 0x7fe9 , +0x7ff3 , 0x7ff9 , 0x98dc , 0x8006 , +0x8004 , 0x800b , 0x8012 , 0x8018 , +0x8019 , 0x801c , 0x8021 , 0x8028 , +0x803f , 0x803b , 0x804a , 0x8046 , +0x8052 , 0x8058 , 0x805a , 0x805f , +0x8062 , 0x8068 , 0x8073 , 0x8072 , +0x8070 , 0x8076 , 0x8079 , 0x807d , +0x807f , 0x8084 , 0x8086 , 0x8085 , +0x809b , 0x8093 , 0x809a , 0x80ad , +0x5190 , 0x80ac , 0x80db , 0x80e5 , +0x80d9 , 0x80dd , 0x80c4 , 0x80da , +0x80d6 , 0x8109 , 0x80ef , 0x80f1 , +0x811b , 0x8129 , 0x8123 , 0x812f , +0x814b , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x968b , 0x8146 , 0x813e , 0x8153 , +0x8151 , 0x80fc , 0x8171 , 0x816e , +0x8165 , 0x8166 , 0x8174 , 0x8183 , +0x8188 , 0x818a , 0x8180 , 0x8182 , +0x81a0 , 0x8195 , 0x81a4 , 0x81a3 , +0x815f , 0x8193 , 0x81a9 , 0x81b0 , +0x81b5 , 0x81be , 0x81b8 , 0x81bd , +0x81c0 , 0x81c2 , 0x81ba , 0x81c9 , +0x81cd , 0x81d1 , 0x81d9 , 0x81d8 , +0x81c8 , 0x81da , 0x81df , 0x81e0 , +0x81e7 , 0x81fa , 0x81fb , 0x81fe , +0x8201 , 0x8202 , 0x8205 , 0x8207 , +0x820a , 0x820d , 0x8210 , 0x8216 , +0x8229 , 0x822b , 0x8238 , 0x8233 , +0x8240 , 0x8259 , 0x8258 , 0x825d , +0x825a , 0x825f , 0x8264 , 0x0 , +0x8262 , 0x8268 , 0x826a , 0x826b , +0x822e , 0x8271 , 0x8277 , 0x8278 , +0x827e , 0x828d , 0x8292 , 0x82ab , +0x829f , 0x82bb , 0x82ac , 0x82e1 , +0x82e3 , 0x82df , 0x82d2 , 0x82f4 , +0x82f3 , 0x82fa , 0x8393 , 0x8303 , +0x82fb , 0x82f9 , 0x82de , 0x8306 , +0x82dc , 0x8309 , 0x82d9 , 0x8335 , +0x8334 , 0x8316 , 0x8332 , 0x8331 , +0x8340 , 0x8339 , 0x8350 , 0x8345 , +0x832f , 0x832b , 0x8317 , 0x8318 , +0x8385 , 0x839a , 0x83aa , 0x839f , +0x83a2 , 0x8396 , 0x8323 , 0x838e , +0x8387 , 0x838a , 0x837c , 0x83b5 , +0x8373 , 0x8375 , 0x83a0 , 0x8389 , +0x83a8 , 0x83f4 , 0x8413 , 0x83eb , +0x83ce , 0x83fd , 0x8403 , 0x83d8 , +0x840b , 0x83c1 , 0x83f7 , 0x8407 , +0x83e0 , 0x83f2 , 0x840d , 0x8422 , +0x8420 , 0x83bd , 0x8438 , 0x8506 , +0x83fb , 0x846d , 0x842a , 0x843c , +0x855a , 0x8484 , 0x8477 , 0x846b , +0x84ad , 0x846e , 0x8482 , 0x8469 , +0x8446 , 0x842c , 0x846f , 0x8479 , +0x8435 , 0x84ca , 0x8462 , 0x84b9 , +0x84bf , 0x849f , 0x84d9 , 0x84cd , +0x84bb , 0x84da , 0x84d0 , 0x84c1 , +0x84c6 , 0x84d6 , 0x84a1 , 0x8521 , +0x84ff , 0x84f4 , 0x8517 , 0x8518 , +0x852c , 0x851f , 0x8515 , 0x8514 , +0x84fc , 0x8540 , 0x8563 , 0x8558 , +0x8548 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8541 , 0x8602 , 0x854b , 0x8555 , +0x8580 , 0x85a4 , 0x8588 , 0x8591 , +0x858a , 0x85a8 , 0x856d , 0x8594 , +0x859b , 0x85ea , 0x8587 , 0x859c , +0x8577 , 0x857e , 0x8590 , 0x85c9 , +0x85ba , 0x85cf , 0x85b9 , 0x85d0 , +0x85d5 , 0x85dd , 0x85e5 , 0x85dc , +0x85f9 , 0x860a , 0x8613 , 0x860b , +0x85fe , 0x85fa , 0x8606 , 0x8622 , +0x861a , 0x8630 , 0x863f , 0x864d , +0x4e55 , 0x8654 , 0x865f , 0x8667 , +0x8671 , 0x8693 , 0x86a3 , 0x86a9 , +0x86aa , 0x868b , 0x868c , 0x86b6 , +0x86af , 0x86c4 , 0x86c6 , 0x86b0 , +0x86c9 , 0x8823 , 0x86ab , 0x86d4 , +0x86de , 0x86e9 , 0x86ec , 0x0 , +0x86df , 0x86db , 0x86ef , 0x8712 , +0x8706 , 0x8708 , 0x8700 , 0x8703 , +0x86fb , 0x8711 , 0x8709 , 0x870d , +0x86f9 , 0x870a , 0x8734 , 0x873f , +0x8737 , 0x873b , 0x8725 , 0x8729 , +0x871a , 0x8760 , 0x875f , 0x8778 , +0x874c , 0x874e , 0x8774 , 0x8757 , +0x8768 , 0x876e , 0x8759 , 0x8753 , +0x8763 , 0x876a , 0x8805 , 0x87a2 , +0x879f , 0x8782 , 0x87af , 0x87cb , +0x87bd , 0x87c0 , 0x87d0 , 0x96d6 , +0x87ab , 0x87c4 , 0x87b3 , 0x87c7 , +0x87c6 , 0x87bb , 0x87ef , 0x87f2 , +0x87e0 , 0x880f , 0x880d , 0x87fe , +0x87f6 , 0x87f7 , 0x880e , 0x87d2 , +0x8811 , 0x8816 , 0x8815 , 0x8822 , +0x8821 , 0x8831 , 0x8836 , 0x8839 , +0x8827 , 0x883b , 0x8844 , 0x8842 , +0x8852 , 0x8859 , 0x885e , 0x8862 , +0x886b , 0x8881 , 0x887e , 0x889e , +0x8875 , 0x887d , 0x88b5 , 0x8872 , +0x8882 , 0x8897 , 0x8892 , 0x88ae , +0x8899 , 0x88a2 , 0x888d , 0x88a4 , +0x88b0 , 0x88bf , 0x88b1 , 0x88c3 , +0x88c4 , 0x88d4 , 0x88d8 , 0x88d9 , +0x88dd , 0x88f9 , 0x8902 , 0x88fc , +0x88f4 , 0x88e8 , 0x88f2 , 0x8904 , +0x890c , 0x890a , 0x8913 , 0x8943 , +0x891e , 0x8925 , 0x892a , 0x892b , +0x8941 , 0x8944 , 0x893b , 0x8936 , +0x8938 , 0x894c , 0x891d , 0x8960 , +0x895e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8966 , 0x8964 , 0x896d , 0x896a , +0x896f , 0x8974 , 0x8977 , 0x897e , +0x8983 , 0x8988 , 0x898a , 0x8993 , +0x8998 , 0x89a1 , 0x89a9 , 0x89a6 , +0x89ac , 0x89af , 0x89b2 , 0x89ba , +0x89bd , 0x89bf , 0x89c0 , 0x89da , +0x89dc , 0x89dd , 0x89e7 , 0x89f4 , +0x89f8 , 0x8a03 , 0x8a16 , 0x8a10 , +0x8a0c , 0x8a1b , 0x8a1d , 0x8a25 , +0x8a36 , 0x8a41 , 0x8a5b , 0x8a52 , +0x8a46 , 0x8a48 , 0x8a7c , 0x8a6d , +0x8a6c , 0x8a62 , 0x8a85 , 0x8a82 , +0x8a84 , 0x8aa8 , 0x8aa1 , 0x8a91 , +0x8aa5 , 0x8aa6 , 0x8a9a , 0x8aa3 , +0x8ac4 , 0x8acd , 0x8ac2 , 0x8ada , +0x8aeb , 0x8af3 , 0x8ae7 , 0x0 , +0x8ae4 , 0x8af1 , 0x8b14 , 0x8ae0 , +0x8ae2 , 0x8af7 , 0x8ade , 0x8adb , +0x8b0c , 0x8b07 , 0x8b1a , 0x8ae1 , +0x8b16 , 0x8b10 , 0x8b17 , 0x8b20 , +0x8b33 , 0x97ab , 0x8b26 , 0x8b2b , +0x8b3e , 0x8b28 , 0x8b41 , 0x8b4c , +0x8b4f , 0x8b4e , 0x8b49 , 0x8b56 , +0x8b5b , 0x8b5a , 0x8b6b , 0x8b5f , +0x8b6c , 0x8b6f , 0x8b74 , 0x8b7d , +0x8b80 , 0x8b8c , 0x8b8e , 0x8b92 , +0x8b93 , 0x8b96 , 0x8b99 , 0x8b9a , +0x8c3a , 0x8c41 , 0x8c3f , 0x8c48 , +0x8c4c , 0x8c4e , 0x8c50 , 0x8c55 , +0x8c62 , 0x8c6c , 0x8c78 , 0x8c7a , +0x8c82 , 0x8c89 , 0x8c85 , 0x8c8a , +0x8c8d , 0x8c8e , 0x8c94 , 0x8c7c , +0x8c98 , 0x621d , 0x8cad , 0x8caa , +0x8cbd , 0x8cb2 , 0x8cb3 , 0x8cae , +0x8cb6 , 0x8cc8 , 0x8cc1 , 0x8ce4 , +0x8ce3 , 0x8cda , 0x8cfd , 0x8cfa , +0x8cfb , 0x8d04 , 0x8d05 , 0x8d0a , +0x8d07 , 0x8d0f , 0x8d0d , 0x8d10 , +0x9f4e , 0x8d13 , 0x8ccd , 0x8d14 , +0x8d16 , 0x8d67 , 0x8d6d , 0x8d71 , +0x8d73 , 0x8d81 , 0x8d99 , 0x8dc2 , +0x8dbe , 0x8dba , 0x8dcf , 0x8dda , +0x8dd6 , 0x8dcc , 0x8ddb , 0x8dcb , +0x8dea , 0x8deb , 0x8ddf , 0x8de3 , +0x8dfc , 0x8e08 , 0x8e09 , 0x8dff , +0x8e1d , 0x8e1e , 0x8e10 , 0x8e1f , +0x8e42 , 0x8e35 , 0x8e30 , 0x8e34 , +0x8e4a , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x8e47 , 0x8e49 , 0x8e4c , 0x8e50 , +0x8e48 , 0x8e59 , 0x8e64 , 0x8e60 , +0x8e2a , 0x8e63 , 0x8e55 , 0x8e76 , +0x8e72 , 0x8e7c , 0x8e81 , 0x8e87 , +0x8e85 , 0x8e84 , 0x8e8b , 0x8e8a , +0x8e93 , 0x8e91 , 0x8e94 , 0x8e99 , +0x8eaa , 0x8ea1 , 0x8eac , 0x8eb0 , +0x8ec6 , 0x8eb1 , 0x8ebe , 0x8ec5 , +0x8ec8 , 0x8ecb , 0x8edb , 0x8ee3 , +0x8efc , 0x8efb , 0x8eeb , 0x8efe , +0x8f0a , 0x8f05 , 0x8f15 , 0x8f12 , +0x8f19 , 0x8f13 , 0x8f1c , 0x8f1f , +0x8f1b , 0x8f0c , 0x8f26 , 0x8f33 , +0x8f3b , 0x8f39 , 0x8f45 , 0x8f42 , +0x8f3e , 0x8f4c , 0x8f49 , 0x8f46 , +0x8f4e , 0x8f57 , 0x8f5c , 0x0 , +0x8f62 , 0x8f63 , 0x8f64 , 0x8f9c , +0x8f9f , 0x8fa3 , 0x8fad , 0x8faf , +0x8fb7 , 0x8fda , 0x8fe5 , 0x8fe2 , +0x8fea , 0x8fef , 0x9087 , 0x8ff4 , +0x9005 , 0x8ff9 , 0x8ffa , 0x9011 , +0x9015 , 0x9021 , 0x900d , 0x901e , +0x9016 , 0x900b , 0x9027 , 0x9036 , +0x9035 , 0x9039 , 0x8ff8 , 0x904f , +0x9050 , 0x9051 , 0x9052 , 0x900e , +0x9049 , 0x903e , 0x9056 , 0x9058 , +0x905e , 0x9068 , 0x906f , 0x9076 , +0x96a8 , 0x9072 , 0x9082 , 0x907d , +0x9081 , 0x9080 , 0x908a , 0x9089 , +0x908f , 0x90a8 , 0x90af , 0x90b1 , +0x90b5 , 0x90e2 , 0x90e4 , 0x6248 , +0x90db , 0x9102 , 0x9112 , 0x9119 , +0x9132 , 0x9130 , 0x914a , 0x9156 , +0x9158 , 0x9163 , 0x9165 , 0x9169 , +0x9173 , 0x9172 , 0x918b , 0x9189 , +0x9182 , 0x91a2 , 0x91ab , 0x91af , +0x91aa , 0x91b5 , 0x91b4 , 0x91ba , +0x91c0 , 0x91c1 , 0x91c9 , 0x91cb , +0x91d0 , 0x91d6 , 0x91df , 0x91e1 , +0x91db , 0x91fc , 0x91f5 , 0x91f6 , +0x921e , 0x91ff , 0x9214 , 0x922c , +0x9215 , 0x9211 , 0x925e , 0x9257 , +0x9245 , 0x9249 , 0x9264 , 0x9248 , +0x9295 , 0x923f , 0x924b , 0x9250 , +0x929c , 0x9296 , 0x9293 , 0x929b , +0x925a , 0x92cf , 0x92b9 , 0x92b7 , +0x92e9 , 0x930f , 0x92fa , 0x9344 , +0x932e , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9319 , 0x9322 , 0x931a , 0x9323 , +0x933a , 0x9335 , 0x933b , 0x935c , +0x9360 , 0x937c , 0x936e , 0x9356 , +0x93b0 , 0x93ac , 0x93ad , 0x9394 , +0x93b9 , 0x93d6 , 0x93d7 , 0x93e8 , +0x93e5 , 0x93d8 , 0x93c3 , 0x93dd , +0x93d0 , 0x93c8 , 0x93e4 , 0x941a , +0x9414 , 0x9413 , 0x9403 , 0x9407 , +0x9410 , 0x9436 , 0x942b , 0x9435 , +0x9421 , 0x943a , 0x9441 , 0x9452 , +0x9444 , 0x945b , 0x9460 , 0x9462 , +0x945e , 0x946a , 0x9229 , 0x9470 , +0x9475 , 0x9477 , 0x947d , 0x945a , +0x947c , 0x947e , 0x9481 , 0x947f , +0x9582 , 0x9587 , 0x958a , 0x9594 , +0x9596 , 0x9598 , 0x9599 , 0x0 , +0x95a0 , 0x95a8 , 0x95a7 , 0x95ad , +0x95bc , 0x95bb , 0x95b9 , 0x95be , +0x95ca , 0x6ff6 , 0x95c3 , 0x95cd , +0x95cc , 0x95d5 , 0x95d4 , 0x95d6 , +0x95dc , 0x95e1 , 0x95e5 , 0x95e2 , +0x9621 , 0x9628 , 0x962e , 0x962f , +0x9642 , 0x964c , 0x964f , 0x964b , +0x9677 , 0x965c , 0x965e , 0x965d , +0x965f , 0x9666 , 0x9672 , 0x966c , +0x968d , 0x9698 , 0x9695 , 0x9697 , +0x96aa , 0x96a7 , 0x96b1 , 0x96b2 , +0x96b0 , 0x96b4 , 0x96b6 , 0x96b8 , +0x96b9 , 0x96ce , 0x96cb , 0x96c9 , +0x96cd , 0x894d , 0x96dc , 0x970d , +0x96d5 , 0x96f9 , 0x9704 , 0x9706 , +0x9708 , 0x9713 , 0x970e , 0x9711 , +0x970f , 0x9716 , 0x9719 , 0x9724 , +0x972a , 0x9730 , 0x9739 , 0x973d , +0x973e , 0x9744 , 0x9746 , 0x9748 , +0x9742 , 0x9749 , 0x975c , 0x9760 , +0x9764 , 0x9766 , 0x9768 , 0x52d2 , +0x976b , 0x9771 , 0x9779 , 0x9785 , +0x977c , 0x9781 , 0x977a , 0x9786 , +0x978b , 0x978f , 0x9790 , 0x979c , +0x97a8 , 0x97a6 , 0x97a3 , 0x97b3 , +0x97b4 , 0x97c3 , 0x97c6 , 0x97c8 , +0x97cb , 0x97dc , 0x97ed , 0x9f4f , +0x97f2 , 0x7adf , 0x97f6 , 0x97f5 , +0x980f , 0x980c , 0x9838 , 0x9824 , +0x9821 , 0x9837 , 0x983d , 0x9846 , +0x984f , 0x984b , 0x986b , 0x986f , +0x9870 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9871 , 0x9874 , 0x9873 , 0x98aa , +0x98af , 0x98b1 , 0x98b6 , 0x98c4 , +0x98c3 , 0x98c6 , 0x98e9 , 0x98eb , +0x9903 , 0x9909 , 0x9912 , 0x9914 , +0x9918 , 0x9921 , 0x991d , 0x991e , +0x9924 , 0x9920 , 0x992c , 0x992e , +0x993d , 0x993e , 0x9942 , 0x9949 , +0x9945 , 0x9950 , 0x994b , 0x9951 , +0x9952 , 0x994c , 0x9955 , 0x9997 , +0x9998 , 0x99a5 , 0x99ad , 0x99ae , +0x99bc , 0x99df , 0x99db , 0x99dd , +0x99d8 , 0x99d1 , 0x99ed , 0x99ee , +0x99f1 , 0x99f2 , 0x99fb , 0x99f8 , +0x9a01 , 0x9a0f , 0x9a05 , 0x99e2 , +0x9a19 , 0x9a2b , 0x9a37 , 0x9a45 , +0x9a42 , 0x9a40 , 0x9a43 , 0x0 , +0x9a3e , 0x9a55 , 0x9a4d , 0x9a5b , +0x9a57 , 0x9a5f , 0x9a62 , 0x9a65 , +0x9a64 , 0x9a69 , 0x9a6b , 0x9a6a , +0x9aad , 0x9ab0 , 0x9abc , 0x9ac0 , +0x9acf , 0x9ad1 , 0x9ad3 , 0x9ad4 , +0x9ade , 0x9adf , 0x9ae2 , 0x9ae3 , +0x9ae6 , 0x9aef , 0x9aeb , 0x9aee , +0x9af4 , 0x9af1 , 0x9af7 , 0x9afb , +0x9b06 , 0x9b18 , 0x9b1a , 0x9b1f , +0x9b22 , 0x9b23 , 0x9b25 , 0x9b27 , +0x9b28 , 0x9b29 , 0x9b2a , 0x9b2e , +0x9b2f , 0x9b32 , 0x9b44 , 0x9b43 , +0x9b4f , 0x9b4d , 0x9b4e , 0x9b51 , +0x9b58 , 0x9b74 , 0x9b93 , 0x9b83 , +0x9b91 , 0x9b96 , 0x9b97 , 0x9b9f , +0x9ba0 , 0x9ba8 , 0x9bb4 , 0x9bc0 , +0x9bca , 0x9bb9 , 0x9bc6 , 0x9bcf , +0x9bd1 , 0x9bd2 , 0x9be3 , 0x9be2 , +0x9be4 , 0x9bd4 , 0x9be1 , 0x9c3a , +0x9bf2 , 0x9bf1 , 0x9bf0 , 0x9c15 , +0x9c14 , 0x9c09 , 0x9c13 , 0x9c0c , +0x9c06 , 0x9c08 , 0x9c12 , 0x9c0a , +0x9c04 , 0x9c2e , 0x9c1b , 0x9c25 , +0x9c24 , 0x9c21 , 0x9c30 , 0x9c47 , +0x9c32 , 0x9c46 , 0x9c3e , 0x9c5a , +0x9c60 , 0x9c67 , 0x9c76 , 0x9c78 , +0x9ce7 , 0x9cec , 0x9cf0 , 0x9d09 , +0x9d08 , 0x9ceb , 0x9d03 , 0x9d06 , +0x9d2a , 0x9d26 , 0x9daf , 0x9d23 , +0x9d1f , 0x9d44 , 0x9d15 , 0x9d12 , +0x9d41 , 0x9d3f , 0x9d3e , 0x9d46 , +0x9d48 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x9d5d , 0x9d5e , 0x9d64 , 0x9d51 , +0x9d50 , 0x9d59 , 0x9d72 , 0x9d89 , +0x9d87 , 0x9dab , 0x9d6f , 0x9d7a , +0x9d9a , 0x9da4 , 0x9da9 , 0x9db2 , +0x9dc4 , 0x9dc1 , 0x9dbb , 0x9db8 , +0x9dba , 0x9dc6 , 0x9dcf , 0x9dc2 , +0x9dd9 , 0x9dd3 , 0x9df8 , 0x9de6 , +0x9ded , 0x9def , 0x9dfd , 0x9e1a , +0x9e1b , 0x9e1e , 0x9e75 , 0x9e79 , +0x9e7d , 0x9e81 , 0x9e88 , 0x9e8b , +0x9e8c , 0x9e92 , 0x9e95 , 0x9e91 , +0x9e9d , 0x9ea5 , 0x9ea9 , 0x9eb8 , +0x9eaa , 0x9ead , 0x9761 , 0x9ecc , +0x9ece , 0x9ecf , 0x9ed0 , 0x9ed4 , +0x9edc , 0x9ede , 0x9edd , 0x9ee0 , +0x9ee5 , 0x9ee8 , 0x9eef , 0x0 , +0x9ef4 , 0x9ef6 , 0x9ef7 , 0x9ef9 , +0x9efb , 0x9efc , 0x9efd , 0x9f07 , +0x9f08 , 0x76b7 , 0x9f15 , 0x9f21 , +0x9f2c , 0x9f3e , 0x9f4a , 0x9f52 , +0x9f54 , 0x9f63 , 0x9f5f , 0x9f60 , +0x9f61 , 0x9f66 , 0x9f67 , 0x9f6c , +0x9f6a , 0x9f77 , 0x9f72 , 0x9f76 , +0x9f95 , 0x9f9c , 0x9fa0 , 0x582f , +0x69c7 , 0x9059 , 0x7464 , 0x51dc , +0x7199 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +0x0 , 0x0 , 0x0 , 0x0 , +} ; diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_Unicode.cxx opencascade-7.5.1+dfsg1/src/Resource/Resource_Unicode.cxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_Unicode.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_Unicode.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,14 +15,16 @@ // commercial license or contractual agreement. -#include -#include #include -#include #include #include #include #include +#include +#include +#include "Resource_CodePages.pxx" +#include "Resource_GBK.pxx" +#include "Resource_Big5.pxx" #define isjis(c) (((c)>=0x21 && (c)<=0x7e)) #define iseuc(c) (((c)>=0xa1 && (c)<=0xfe)) @@ -355,14 +357,6 @@ return Standard_True; } -void Resource_Unicode::ConvertANSIToUnicode(const Standard_CString fromstr,TCollection_ExtendedString& tostr) -{ - tostr.Clear(); - - TCollection_ExtendedString curext(fromstr); - tostr.AssignCat(curext); -} - Standard_Boolean Resource_Unicode::ConvertUnicodeToSJIS(const TCollection_ExtendedString& fromstr, Standard_PCharacter& tostr, const Standard_Integer maxsize) @@ -618,9 +612,59 @@ break; } case Resource_FormatType_ANSI: + { + theToStr = TCollection_ExtendedString(theFromStr, Standard_False); + break; + } + case Resource_FormatType_CP1250: + case Resource_FormatType_CP1251: + case Resource_FormatType_CP1252: + case Resource_FormatType_CP1253: + case Resource_FormatType_CP1254: + case Resource_FormatType_CP1255: + case Resource_FormatType_CP1256: + case Resource_FormatType_CP1257: + case Resource_FormatType_CP1258: + case Resource_FormatType_iso8859_1: + case Resource_FormatType_iso8859_2: + case Resource_FormatType_iso8859_3: + case Resource_FormatType_iso8859_4: + case Resource_FormatType_iso8859_5: + case Resource_FormatType_iso8859_6: + case Resource_FormatType_iso8859_7: + case Resource_FormatType_iso8859_8: + case Resource_FormatType_iso8859_9: + { + const int aCodePageIndex = (int)theFormat - (int)Resource_FormatType_CP1250; + const Standard_ExtString aCodePage = THE_CODEPAGES_ANSI[aCodePageIndex]; + theToStr.Clear(); + for (const char* anInputPntr = theFromStr; *anInputPntr != '\0'; ++anInputPntr) + { + unsigned char anInputChar = (unsigned char)(*anInputPntr); + Standard_ExtCharacter aRes = (anInputChar & 0x80) != 0 + ? aCodePage[(0x7f & anInputChar)] + : anInputChar; + if (aRes == 0) + { + aRes = '?'; + } + theToStr.AssignCat(aRes); + } + break; + } + case Resource_FormatType_Big5: + { + ConvertBig5ToUnicode(theFromStr, theToStr); + break; + } + case Resource_FormatType_GBK: + { + ConvertGBKToUnicode(theFromStr, theToStr); + break; + } case Resource_FormatType_UTF8: { - theToStr = TCollection_ExtendedString (theFromStr, theFormat == Resource_FormatType_UTF8); + theToStr = TCollection_ExtendedString (theFromStr, Standard_True); break; } case Resource_FormatType_SystemLocale: @@ -654,7 +698,63 @@ } case Resource_FormatType_ANSI: { - return ConvertUnicodeToANSI (theFromStr, theToStr, theMaxSize); + return ConvertUnicodeToANSI(theFromStr, theToStr, theMaxSize); + } + case Resource_FormatType_CP1250: + case Resource_FormatType_CP1251: + case Resource_FormatType_CP1252: + case Resource_FormatType_CP1253: + case Resource_FormatType_CP1254: + case Resource_FormatType_CP1255: + case Resource_FormatType_CP1256: + case Resource_FormatType_CP1257: + case Resource_FormatType_CP1258: + case Resource_FormatType_iso8859_1: + case Resource_FormatType_iso8859_2: + case Resource_FormatType_iso8859_3: + case Resource_FormatType_iso8859_4: + case Resource_FormatType_iso8859_5: + case Resource_FormatType_iso8859_6: + case Resource_FormatType_iso8859_7: + case Resource_FormatType_iso8859_8: + case Resource_FormatType_iso8859_9: + { + if (theMaxSize < theFromStr.Length()) + { + return Standard_False; + } + const int aCodePageIndex = (int)theFormat - (int)Resource_FormatType_CP1250; + const Standard_ExtString aCodePage = THE_CODEPAGES_ANSI[aCodePageIndex]; + for (Standard_Integer aToCharInd = 0; aToCharInd < theMaxSize - 1; ++aToCharInd) + { + Standard_Boolean isFind = Standard_False; + Standard_ExtCharacter aFromChar = theFromStr.Value(aToCharInd + 1); + if (aFromChar == 0) + { + // zero value should be handled explicitly to avoid false conversion by + // selected code page that may have unused values (encoded as zero) + theToStr[aToCharInd] = '\0'; + } + else + { + // find the character in the code page + for (unsigned char anIndCP = 0; aFromChar != 0 && anIndCP < 128; ++anIndCP) + { + if (aCodePage[anIndCP] == aFromChar) + { + theToStr[aToCharInd] = anIndCP | 0x80; + isFind = Standard_True; + } + } + // if character is not found, put '?' + if (!isFind) + { + theToStr[aToCharInd] = '?'; + } + } + } + theToStr[theMaxSize - 1] = '\0'; + return Standard_True; } case Resource_FormatType_UTF8: { @@ -670,6 +770,11 @@ const NCollection_Utf16String aString (theFromStr.ToExtString()); return aString.ToLocale (theToStr, theMaxSize); } + case Resource_FormatType_GBK: + case Resource_FormatType_Big5: + { + throw Standard_NotImplemented("Resource_Unicode::ConvertUnicodeToFormat - convert from GBK and Big5 to Unocode is not implemented"); + } } return Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/Resource/Resource_Unicode.hxx opencascade-7.5.1+dfsg1/src/Resource/Resource_Unicode.hxx --- opencascade-7.4.1+dfsg1/src/Resource/Resource_Unicode.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Resource/Resource_Unicode.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,10 +59,6 @@ //! to Unicode ExtendedString . Standard_EXPORT static Standard_Boolean ConvertBig5ToUnicode (const Standard_CString fromstr, TCollection_ExtendedString& tostr); - //! Converts non-ASCII CString in ANSI format - //! to Unicode ExtendedString . - Standard_EXPORT static void ConvertANSIToUnicode (const Standard_CString fromstr, TCollection_ExtendedString& tostr); - //! Converts Unicode ExtendedString to non-ASCII //! CString in SJIS format, limited to //! characters. To translate the whole , use more diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/FILES opencascade-7.5.1+dfsg1/src/RWGltf/FILES --- opencascade-7.4.1+dfsg1/src/RWGltf/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,6 +1,7 @@ RWGltf_GltfAccessor.hxx RWGltf_GltfAccessorCompType.hxx RWGltf_GltfAccessorLayout.hxx +RWGltf_GltfAlphaMode.hxx RWGltf_GltfArrayType.hxx RWGltf_GltfBufferView.hxx RWGltf_GltfBufferViewTarget.hxx @@ -14,9 +15,16 @@ RWGltf_MaterialMetallicRoughness.hxx RWGltf_CafReader.cxx RWGltf_CafReader.hxx +RWGltf_CafWriter.cxx +RWGltf_CafWriter.hxx +RWGltf_GltfMaterialMap.cxx +RWGltf_GltfMaterialMap.hxx RWGltf_GltfJsonParser.cxx RWGltf_GltfJsonParser.pxx +RWGltf_GltfOStreamWriter.hxx +RWGltf_GltfSceneNodeMap.hxx RWGltf_PrimitiveArrayReader.cxx RWGltf_PrimitiveArrayReader.hxx RWGltf_TriangulationReader.cxx RWGltf_TriangulationReader.hxx +RWGltf_WriterTrsfFormat.hxx diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_CafReader.cxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_CafReader.cxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_CafReader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_CafReader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include @@ -42,13 +42,13 @@ //! Main constructor. CafReader_GltfReaderFunctor (RWGltf_CafReader* myCafReader, NCollection_Vector& theFaceList, - Message_ProgressSentry& theSentry, + const Message_ProgressRange& theProgress, const OSD_ThreadPool::Launcher& theThreadPool, const TCollection_AsciiString& theErrPrefix) : myCafReader (myCafReader), myFaceList (&theFaceList), - mySentry (&theSentry), myErrPrefix (theErrPrefix), + myProgress (theProgress, "Loading glTF triangulation", Max (1, theFaceList.Size())), myThreadPool(theThreadPool), myTlsData (theThreadPool.LowerThreadIndex(), theThreadPool.UpperThreadIndex()) { @@ -77,11 +77,11 @@ if (myThreadPool.HasThreads()) { Standard_Mutex::Sentry aLock (&myMutex); - mySentry->Next(); + myProgress.Next(); } else { - mySentry->Next(); + myProgress.Next(); } } @@ -89,13 +89,11 @@ RWGltf_CafReader* myCafReader; NCollection_Vector* myFaceList; - Message_ProgressSentry* mySentry; TCollection_AsciiString myErrPrefix; mutable Standard_Mutex myMutex; + mutable Message_ProgressScope myProgress; const OSD_ThreadPool::Launcher& myThreadPool; - mutable NCollection_Array1 - myTlsData; - + mutable NCollection_Array1 myTlsData; }; //================================================================ @@ -116,15 +114,18 @@ // Purpose : //================================================================ Standard_Boolean RWGltf_CafReader::performMesh (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress, + const Message_ProgressRange& theProgress, const Standard_Boolean theToProbe) { + Message_ProgressScope aPSentry (theProgress, "Reading glTF", 2); + aPSentry.Show(); + std::ifstream aFile; OSD_OpenStream (aFile, theFile.ToCString(), std::ios::in | std::ios::binary); if (!aFile.is_open() || !aFile.good()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("File '") + theFile + "' is not found!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("File '") + theFile + "' is not found"); return false; } @@ -144,7 +145,7 @@ { if (*aLen < 20) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("File '") + theFile + "' has broken glTF format!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("File '") + theFile + "' has broken glTF format"); return false; } @@ -160,7 +161,7 @@ aBinBodyLen = int64_t(*aLen) - aBinBodyOffset; if (*aSceneFormat != 0) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("File '") + theFile + "' is written using unsupported Scene format!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("File '") + theFile + "' is written using unsupported Scene format"); return false; } } @@ -168,7 +169,7 @@ { if (*aVer != 2) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("File '") + theFile + "' is written using unknown version " + int(*aVer) + "!", Message_Warning); + Message::SendWarning (TCollection_AsciiString ("File '") + theFile + "' is written using unknown version " + int(*aVer)); } for (int aChunkIter = 0; !aFile.eof() && aChunkIter < 2; ++aChunkIter) @@ -182,7 +183,7 @@ aFile.read (aChunkHeader2, sizeof(aChunkHeader2)); if (!aFile.good()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("File '") + theFile + "' is written using unsupported format!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("File '") + theFile + "' is written using unsupported format"); return false; } @@ -246,23 +247,23 @@ { if (aRes.Code() == rapidjson::kParseErrorDocumentEmpty) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("File '") + theFile + "' is empty!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("File '") + theFile + "' is empty"); return false; } TCollection_AsciiString anErrDesc (RWGltf_GltfJsonParser::FormatParseError (aRes.Code())); - Message::DefaultMessenger()->Send (TCollection_AsciiString ("File '") + theFile + "' defines invalid JSON document!\n" - + anErrDesc + " [at offset " + (int )aRes.Offset() + "].", Message_Fail); + Message::SendFail (TCollection_AsciiString ("File '") + theFile + "' defines invalid JSON document!\n" + + anErrDesc + " [at offset " + (int )aRes.Offset() + "]."); return false; } #endif - if (!aDoc.Parse (theProgress)) + if (!aDoc.Parse (aPSentry.Next())) { return false; } if (!theToProbe - && !readLateData (aDoc.FaceList(), theFile, theProgress)) + && !readLateData (aDoc.FaceList(), theFile, aPSentry.Next())) { return false; } @@ -286,14 +287,13 @@ //================================================================ Standard_Boolean RWGltf_CafReader::readLateData (NCollection_Vector& theFaces, const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { - Message_ProgressSentry aPSentryTris (theProgress, "Loading glTF triangulation", 0, Max (1, theFaces.Size()), 1); const Handle(OSD_ThreadPool)& aThreadPool = OSD_ThreadPool::DefaultPool(); const int aNbThreads = myToParallel ? Min (theFaces.Size(), aThreadPool->NbDefaultThreadsToLaunch()) : 1; OSD_ThreadPool::Launcher aLauncher (*aThreadPool, aNbThreads); - CafReader_GltfReaderFunctor aFunctor (this, theFaces, aPSentryTris, aLauncher, + CafReader_GltfReaderFunctor aFunctor (this, theFaces, theProgress, aLauncher, TCollection_AsciiString ("File '") + theFile + "' defines invalid glTF!\n"); aLauncher.Perform (theFaces.Lower(), theFaces.Upper() + 1, aFunctor); return Standard_True; diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_CafReader.hxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_CafReader.hxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_CafReader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_CafReader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,6 +15,7 @@ #ifndef _RWGltf_CafReader_HeaderFile #define _RWGltf_CafReader_HeaderFile +#include #include #include #include @@ -52,7 +53,7 @@ //! Read the mesh from specified file. Standard_EXPORT virtual Standard_Boolean performMesh (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress, + const Message_ProgressRange& theProgress, const Standard_Boolean theToProbe) Standard_OVERRIDE; //! Create primitive array reader context. @@ -63,7 +64,7 @@ //! Read late data from RWGltf_GltfLatePrimitiveArray stored as Poly_Triangulation within faces. Standard_EXPORT virtual Standard_Boolean readLateData (NCollection_Vector& theFaces, const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress); + const Message_ProgressRange& theProgress); protected: class CafReader_GltfReaderFunctor; diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_CafWriter.cxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_CafWriter.cxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_CafWriter.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_CafWriter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1592 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_RAPIDJSON + #include +#endif + +IMPLEMENT_STANDARD_RTTIEXT(RWGltf_CafWriter, Standard_Transient) + +namespace +{ + //! Write three float values. + static void writeVec3 (std::ostream& theStream, + const gp_XYZ& theVec3) + { + Graphic3d_Vec3 aVec3 (float(theVec3.X()), float(theVec3.Y()), float(theVec3.Z())); + theStream.write ((const char* )aVec3.GetData(), sizeof(aVec3)); + } + + //! Write three float values. + static void writeVec3 (std::ostream& theStream, + const Graphic3d_Vec3& theVec3) + { + theStream.write ((const char* )theVec3.GetData(), sizeof(theVec3)); + } + + //! Write two float values. + static void writeVec2 (std::ostream& theStream, + const gp_XY& theVec2) + { + Graphic3d_Vec2 aVec2 (float(theVec2.X()), float(theVec2.Y())); + theStream.write ((const char* )aVec2.GetData(), sizeof(aVec2)); + } + + //! Write triangle indices. + static void writeTriangle32 (std::ostream& theStream, + const Graphic3d_Vec3i& theTri) + { + theStream.write ((const char* )theTri.GetData(), sizeof(theTri)); + } + + //! Write triangle indices. + static void writeTriangle16 (std::ostream& theStream, + const NCollection_Vec3& theTri) + { + theStream.write ((const char* )theTri.GetData(), sizeof(theTri)); + } + +#ifdef HAVE_RAPIDJSON + //! Read name attribute. + static TCollection_AsciiString readNameAttribute (const TDF_Label& theRefLabel) + { + Handle(TDataStd_Name) aNodeName; + if (!theRefLabel.FindAttribute (TDataStd_Name::GetID(), aNodeName)) + { + return TCollection_AsciiString(); + } + return TCollection_AsciiString (aNodeName->Get()); + } +#endif +} + +//================================================================ +// Function : Constructor +// Purpose : +//================================================================ +RWGltf_CafWriter::RWGltf_CafWriter (const TCollection_AsciiString& theFile, + Standard_Boolean theIsBinary) +: myFile (theFile), + myTrsfFormat (RWGltf_WriterTrsfFormat_Compact), + myIsBinary (theIsBinary), + myBinDataLen64 (0) +{ + myCSTrsf.SetOutputLengthUnit (1.0); // meters + myCSTrsf.SetOutputCoordinateSystem (RWMesh_CoordinateSystem_glTF); + + TCollection_AsciiString aFolder, aFileName, aShortFileNameBase, aFileExt; + OSD_Path::FolderAndFileFromPath (theFile, aFolder, aFileName); + OSD_Path::FileNameAndExtension (aFileName, aShortFileNameBase, aFileExt); + + myBinFileNameShort = aShortFileNameBase + ".bin" + (myIsBinary ? ".tmp" : ""); + myBinFileNameFull = !aFolder.IsEmpty() ? aFolder + myBinFileNameShort : myBinFileNameShort; +} + +//================================================================ +// Function : Destructor +// Purpose : +//================================================================ +RWGltf_CafWriter::~RWGltf_CafWriter() +{ + myWriter.reset(); +} + +//================================================================ +// Function : toSkipFaceMesh +// Purpose : +//================================================================ +Standard_Boolean RWGltf_CafWriter::toSkipFaceMesh (const RWMesh_FaceIterator& theFaceIter) +{ + return theFaceIter.IsEmptyMesh(); +} + +// ======================================================================= +// function : saveNodes +// purpose : +// ======================================================================= +void RWGltf_CafWriter::saveNodes (RWGltf_GltfFace& theGltfFace, + std::ostream& theBinFile, + const RWMesh_FaceIterator& theFaceIter, + Standard_Integer& theAccessorNb) const +{ + theGltfFace.NodePos.Id = theAccessorNb++; + theGltfFace.NodePos.Count = theFaceIter.NbNodes(); + theGltfFace.NodePos.ByteOffset = (int64_t )theBinFile.tellp() - myBuffViewPos.ByteOffset; + theGltfFace.NodePos.Type = RWGltf_GltfAccessorLayout_Vec3; + theGltfFace.NodePos.ComponentType = RWGltf_GltfAccessorCompType_Float32; + + const Standard_Integer aNodeUpper = theFaceIter.NodeUpper(); + for (Standard_Integer aNodeIter = theFaceIter.NodeLower(); aNodeIter <= aNodeUpper; ++aNodeIter) + { + gp_XYZ aNode = theFaceIter.NodeTransformed (aNodeIter).XYZ(); + myCSTrsf.TransformPosition (aNode); + theGltfFace.NodePos.BndBox.Add (Graphic3d_Vec3d(aNode.X(), aNode.Y(), aNode.Z())); + writeVec3 (theBinFile, aNode); + } +} + +// ======================================================================= +// function : saveNormals +// purpose : +// ======================================================================= +void RWGltf_CafWriter::saveNormals (RWGltf_GltfFace& theGltfFace, + std::ostream& theBinFile, + RWMesh_FaceIterator& theFaceIter, + Standard_Integer& theAccessorNb) const +{ + if (!theFaceIter.HasNormals()) + { + return; + } + + theGltfFace.NodeNorm.Id = theAccessorNb++; + theGltfFace.NodeNorm.Count = theFaceIter.NbNodes(); + theGltfFace.NodeNorm.ByteOffset = (int64_t )theBinFile.tellp() - myBuffViewNorm.ByteOffset; + theGltfFace.NodeNorm.Type = RWGltf_GltfAccessorLayout_Vec3; + theGltfFace.NodeNorm.ComponentType = RWGltf_GltfAccessorCompType_Float32; + + const Standard_Integer aNodeUpper = theFaceIter.NodeUpper(); + for (Standard_Integer aNodeIter = theFaceIter.NodeLower(); aNodeIter <= aNodeUpper; ++aNodeIter) + { + const gp_Dir aNormal = theFaceIter.NormalTransformed (aNodeIter); + Graphic3d_Vec3 aVecNormal ((float )aNormal.X(), (float )aNormal.Y(), (float )aNormal.Z()); + myCSTrsf.TransformNormal (aVecNormal); + writeVec3 (theBinFile, aVecNormal); + } +} + +// ======================================================================= +// function : saveTextCoords +// purpose : +// ======================================================================= +void RWGltf_CafWriter::saveTextCoords (RWGltf_GltfFace& theGltfFace, + std::ostream& theBinFile, + const RWMesh_FaceIterator& theFaceIter, + Standard_Integer& theAccessorNb) const +{ + if (!theFaceIter.HasTexCoords()) + { + return; + } + if (!myIsForcedUVExport) + { + if (theFaceIter.FaceStyle().Material().IsNull()) + { + return; + } + + if (RWGltf_GltfMaterialMap::baseColorTexture (theFaceIter.FaceStyle().Material()).IsNull() + && theFaceIter.FaceStyle().Material()->PbrMaterial().MetallicRoughnessTexture.IsNull() + && theFaceIter.FaceStyle().Material()->PbrMaterial().EmissiveTexture.IsNull() + && theFaceIter.FaceStyle().Material()->PbrMaterial().OcclusionTexture.IsNull() + && theFaceIter.FaceStyle().Material()->PbrMaterial().NormalTexture.IsNull()) + { + return; + } + } + + theGltfFace.NodeUV.Id = theAccessorNb++; + theGltfFace.NodeUV.Count = theFaceIter.NbNodes(); + theGltfFace.NodeUV.ByteOffset = (int64_t )theBinFile.tellp() - myBuffViewTextCoord.ByteOffset; + theGltfFace.NodeUV.Type = RWGltf_GltfAccessorLayout_Vec2; + theGltfFace.NodeUV.ComponentType = RWGltf_GltfAccessorCompType_Float32; + const Standard_Integer aNodeUpper = theFaceIter.NodeUpper(); + for (Standard_Integer aNodeIter = theFaceIter.NodeLower(); aNodeIter <= aNodeUpper; ++aNodeIter) + { + gp_Pnt2d aTexCoord = theFaceIter.NodeTexCoord (aNodeIter); + aTexCoord.SetY (1.0 - aTexCoord.Y()); + writeVec2 (theBinFile, aTexCoord.XY()); + } +} + +// ======================================================================= +// function : saveIndices +// purpose : +// ======================================================================= +void RWGltf_CafWriter::saveIndices (RWGltf_GltfFace& theGltfFace, + std::ostream& theBinFile, + const RWMesh_FaceIterator& theFaceIter, + Standard_Integer& theAccessorNb) +{ + theGltfFace.Indices.Id = theAccessorNb++; + theGltfFace.Indices.Count = theFaceIter.NbTriangles() * 3; + theGltfFace.Indices.ByteOffset = (int64_t )theBinFile.tellp() - myBuffViewInd.ByteOffset; + theGltfFace.Indices.Type = RWGltf_GltfAccessorLayout_Scalar; + theGltfFace.Indices.ComponentType = theGltfFace.NodePos.Count > std::numeric_limits::max() + ? RWGltf_GltfAccessorCompType_UInt32 + : RWGltf_GltfAccessorCompType_UInt16; + + const Standard_Integer anElemLower = theFaceIter.ElemLower(); + const Standard_Integer anElemUpper = theFaceIter.ElemUpper(); + for (Standard_Integer anElemIter = anElemLower; anElemIter <= anElemUpper; ++anElemIter) + { + Poly_Triangle aTri = theFaceIter.TriangleOriented (anElemIter); + aTri(1) -= anElemLower; + aTri(2) -= anElemLower; + aTri(3) -= anElemLower; + if (theGltfFace.Indices.ComponentType == RWGltf_GltfAccessorCompType_UInt16) + { + writeTriangle16 (theBinFile, NCollection_Vec3((uint16_t)aTri(1), (uint16_t)aTri(2), (uint16_t)aTri(3))); + } + else + { + writeTriangle32 (theBinFile, Graphic3d_Vec3i (aTri(1), aTri(2), aTri(3))); + } + } + if (theGltfFace.Indices.ComponentType == RWGltf_GltfAccessorCompType_UInt16) + { + // alignment by 4 bytes + int64_t aContentLen64 = (int64_t)theBinFile.tellp(); + while (aContentLen64 % 4 != 0) + { + theBinFile.write (" ", 1); + ++aContentLen64; + } + } +} + +// ======================================================================= +// function : Perform +// purpose : +// ======================================================================= +bool RWGltf_CafWriter::Perform (const Handle(TDocStd_Document)& theDocument, + const TColStd_IndexedDataMapOfStringString& theFileInfo, + const Message_ProgressRange& theProgress) +{ + TDF_LabelSequence aRoots; + Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool (theDocument->Main()); + aShapeTool->GetFreeShapes (aRoots); + return Perform (theDocument, aRoots, NULL, theFileInfo, theProgress); +} + +// ======================================================================= +// function : Perform +// purpose : +// ======================================================================= +bool RWGltf_CafWriter::Perform (const Handle(TDocStd_Document)& theDocument, + const TDF_LabelSequence& theRootLabels, + const TColStd_MapOfAsciiString* theLabelFilter, + const TColStd_IndexedDataMapOfStringString& theFileInfo, + const Message_ProgressRange& theProgress) +{ + Message_ProgressScope aPSentry (theProgress, "Writing glTF file", 2); + if (!writeBinData (theDocument, theRootLabels, theLabelFilter, aPSentry.Next())) + { + return false; + } + + if (!aPSentry.More()) + { + return false; + } + + return writeJson (theDocument, theRootLabels, theLabelFilter, theFileInfo, aPSentry.Next()); +} + +// ======================================================================= +// function : writeBinData +// purpose : +// ======================================================================= +bool RWGltf_CafWriter::writeBinData (const Handle(TDocStd_Document)& theDocument, + const TDF_LabelSequence& theRootLabels, + const TColStd_MapOfAsciiString* theLabelFilter, + const Message_ProgressRange& theProgress) +{ + myBuffViewPos.ByteOffset = 0; + myBuffViewPos.ByteLength = 0; + myBuffViewPos.ByteStride = 12; + myBuffViewPos.Target = RWGltf_GltfBufferViewTarget_ARRAY_BUFFER; + myBuffViewNorm.ByteOffset = 0; + myBuffViewNorm.ByteLength = 0; + myBuffViewNorm.ByteStride = 12; + myBuffViewNorm.Target = RWGltf_GltfBufferViewTarget_ARRAY_BUFFER; + myBuffViewTextCoord.ByteOffset = 0; + myBuffViewTextCoord.ByteLength = 0; + myBuffViewTextCoord.ByteStride = 8; + myBuffViewTextCoord.Target = RWGltf_GltfBufferViewTarget_ARRAY_BUFFER; + myBuffViewInd.ByteOffset = 0; + myBuffViewInd.ByteLength = 0; + myBuffViewInd.Target = RWGltf_GltfBufferViewTarget_ELEMENT_ARRAY_BUFFER; + + myBinDataMap.Clear(); + myBinDataLen64 = 0; + + std::ofstream aBinFile; + OSD_OpenStream (aBinFile, myBinFileNameFull.ToCString(), std::ios::out | std::ios::binary); + if (!aBinFile.is_open() + || !aBinFile.good()) + { + Message::SendFail (TCollection_AsciiString ("File '") + myBinFileNameFull + "' can not be created"); + return false; + } + + Message_ProgressScope aPSentryBin (theProgress, "Binary data", 4); + + Standard_Integer aNbAccessors = 0; + + // write positions + myBuffViewPos.ByteOffset = aBinFile.tellp(); + for (XCAFPrs_DocumentExplorer aDocExplorer (theDocument, theRootLabels, XCAFPrs_DocumentExplorerFlags_OnlyLeafNodes); + aDocExplorer.More() && aPSentryBin.More(); aDocExplorer.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aDocExplorer.Current(); + if (theLabelFilter != NULL + && !theLabelFilter->Contains (aDocNode.Id)) + { + continue; + } + + // transformation will be stored at scene nodes + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More() && aPSentryBin.More(); aFaceIter.Next()) + { + if (myBinDataMap.IsBound (aFaceIter.Face()) + || toSkipFaceMesh (aFaceIter)) + { + continue; + } + + RWGltf_GltfFace aGltfFace; + saveNodes (aGltfFace, aBinFile, aFaceIter, aNbAccessors); + + if (!aBinFile.good()) + { + Message::SendFail (TCollection_AsciiString ("File '") + myBinFileNameFull + "' can not be written"); + return false; + } + + myBinDataMap.Bind (aFaceIter.Face(), aGltfFace); + } + } + myBuffViewPos.ByteLength = (int64_t )aBinFile.tellp() - myBuffViewPos.ByteOffset; + if (!aPSentryBin.More()) + { + return false; + } + aPSentryBin.Next(); + + // write normals + myBuffViewNorm.ByteOffset = aBinFile.tellp(); + for (XCAFPrs_DocumentExplorer aDocExplorer (theDocument, theRootLabels, XCAFPrs_DocumentExplorerFlags_OnlyLeafNodes); + aDocExplorer.More() && aPSentryBin.More(); aDocExplorer.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aDocExplorer.Current(); + if (theLabelFilter != NULL + && !theLabelFilter->Contains (aDocNode.Id)) + { + continue; + } + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More() && aPSentryBin.More(); aFaceIter.Next()) + { + if (toSkipFaceMesh (aFaceIter)) + { + continue; + } + + RWGltf_GltfFace& aGltfFace = myBinDataMap.ChangeFind (aFaceIter.Face()); + if (aGltfFace.NodeNorm.Id != RWGltf_GltfAccessor::INVALID_ID) + { + continue; + } + + saveNormals (aGltfFace, aBinFile, aFaceIter, aNbAccessors); + + if (!aBinFile.good()) + { + Message::SendFail (TCollection_AsciiString ("File '") + myBinFileNameFull + "' can not be written"); + return false; + } + } + } + myBuffViewNorm.ByteLength = (int64_t )aBinFile.tellp() - myBuffViewNorm.ByteOffset; + if (!aPSentryBin.More()) + { + return false; + } + aPSentryBin.Next(); + + // write texture coordinates + myBuffViewTextCoord.ByteOffset = aBinFile.tellp(); + for (XCAFPrs_DocumentExplorer aDocExplorer (theDocument, theRootLabels, XCAFPrs_DocumentExplorerFlags_OnlyLeafNodes); + aDocExplorer.More() && aPSentryBin.More(); aDocExplorer.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aDocExplorer.Current(); + if (theLabelFilter != NULL + && !theLabelFilter->Contains (aDocNode.Id)) + { + continue; + } + + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More() && aPSentryBin.More(); aFaceIter.Next()) + { + if (toSkipFaceMesh (aFaceIter)) + { + continue; + } + + RWGltf_GltfFace& aGltfFace = myBinDataMap.ChangeFind (aFaceIter.Face()); + if (aGltfFace.NodeUV.Id != RWGltf_GltfAccessor::INVALID_ID) + { + continue; + } + + saveTextCoords (aGltfFace, aBinFile, aFaceIter, aNbAccessors); + + if (!aBinFile.good()) + { + Message::SendFail (TCollection_AsciiString ("File '") + myBinFileNameFull + "' can not be written"); + return false; + } + } + } + myBuffViewTextCoord.ByteLength = (int64_t )aBinFile.tellp() - myBuffViewTextCoord.ByteOffset; + if (!aPSentryBin.More()) + { + return false; + } + aPSentryBin.Next(); + + // write indices + myBuffViewInd.ByteOffset = aBinFile.tellp(); + for (XCAFPrs_DocumentExplorer aDocExplorer (theDocument, theRootLabels, XCAFPrs_DocumentExplorerFlags_OnlyLeafNodes); + aDocExplorer.More() && aPSentryBin.More(); aDocExplorer.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aDocExplorer.Current(); + if (theLabelFilter != NULL + && !theLabelFilter->Contains (aDocNode.Id)) + { + continue; + } + + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More() && aPSentryBin.More(); aFaceIter.Next()) + { + if (toSkipFaceMesh (aFaceIter)) + { + continue; + } + + RWGltf_GltfFace& aGltfFace = myBinDataMap.ChangeFind (aFaceIter.Face()); + if (aGltfFace.Indices.Id != RWGltf_GltfAccessor::INVALID_ID) + { + continue; + } + + saveIndices (aGltfFace, aBinFile, aFaceIter, aNbAccessors); + + if (!aBinFile.good()) + { + Message::SendFail (TCollection_AsciiString ("File '") + myBinFileNameFull + "' can not be written"); + return false; + } + } + } + myBuffViewInd.ByteLength = (int64_t )aBinFile.tellp() - myBuffViewInd.ByteOffset; + + int aBuffViewId = 0; + if (myBuffViewPos.ByteLength > 0) + { + myBuffViewPos.Id = aBuffViewId++; + } + if (myBuffViewNorm.ByteLength > 0) + { + myBuffViewNorm.Id = aBuffViewId++; + } + if (myBuffViewTextCoord.ByteLength > 0) + { + myBuffViewTextCoord.Id = aBuffViewId++; + } + if (myBuffViewInd.ByteLength > 0) + { + myBuffViewInd.Id = aBuffViewId++; + } + + myBinDataLen64 = aBinFile.tellp(); + aBinFile.close(); + if (!aBinFile.good()) + { + Message::SendFail (TCollection_AsciiString ("File '") + myBinFileNameFull + "' can not be written"); + return false; + } + return true; +} + +//================================================================ +// Function : writeJson +// Purpose : +//================================================================ +bool RWGltf_CafWriter::writeJson (const Handle(TDocStd_Document)& theDocument, + const TDF_LabelSequence& theRootLabels, + const TColStd_MapOfAsciiString* theLabelFilter, + const TColStd_IndexedDataMapOfStringString& theFileInfo, + const Message_ProgressRange& theProgress) +{ +#ifdef HAVE_RAPIDJSON + myWriter.reset(); + + // write vertex arrays + Message_ProgressScope aPSentryBin (theProgress, "Header data", 2); + + const Standard_Integer aBinDataBufferId = 0; + const Standard_Integer aDefSamplerId = 0; + const Standard_Integer aDefSceneId = 0; + + const TCollection_AsciiString aFileNameGltf = myFile; + std::ofstream aGltfContentFile; + OSD_OpenStream (aGltfContentFile, aFileNameGltf.ToCString(), std::ios::out | std::ios::binary); + if (!aGltfContentFile.is_open() + || !aGltfContentFile.good()) + { + Message::SendFail (TCollection_AsciiString ("File '") + aFileNameGltf + "' can not be created"); + return false; + } + if (myIsBinary) + { + const char* aMagic = "glTF"; + uint32_t aVersion = 2; + uint32_t aLength = 0; + uint32_t aContentLength = 0; + uint32_t aContentType = 0x4E4F534A; + + aGltfContentFile.write (aMagic, 4); + aGltfContentFile.write ((const char* )&aVersion, sizeof(aVersion)); + aGltfContentFile.write ((const char* )&aLength, sizeof(aLength)); + aGltfContentFile.write ((const char* )&aContentLength, sizeof(aContentLength)); + aGltfContentFile.write ((const char* )&aContentType, sizeof(aContentType)); + } + + // Prepare an indexed map of scene nodes (without assemblies) in correct order. + // Note: this is also order of meshes in glTF document array. + RWGltf_GltfSceneNodeMap aSceneNodeMap; + for (XCAFPrs_DocumentExplorer aDocExplorer (theDocument, theRootLabels, XCAFPrs_DocumentExplorerFlags_OnlyLeafNodes); + aDocExplorer.More(); aDocExplorer.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aDocExplorer.Current(); + if (theLabelFilter != NULL + && !theLabelFilter->Contains (aDocNode.Id)) + { + continue; + } + aSceneNodeMap.Add (aDocNode); + } + + rapidjson::OStreamWrapper aFileStream (aGltfContentFile); + myWriter.reset (new RWGltf_GltfOStreamWriter (aFileStream)); + + myWriter->StartObject(); + + writeAccessors (aSceneNodeMap); + writeAnimations(); + writeAsset (theFileInfo); + writeBufferViews (aBinDataBufferId); + writeBuffers(); + writeExtensions (); + + RWGltf_GltfMaterialMap aMaterialMap (myFile, aDefSamplerId); + aMaterialMap.SetDefaultStyle (myDefaultStyle); + writeImages (aSceneNodeMap, aMaterialMap); + writeMaterials (aSceneNodeMap, aMaterialMap); + writeMeshes (aSceneNodeMap, aMaterialMap); + + aPSentryBin.Next(); + if (!aPSentryBin.More()) + { + return false; + } + + // root nodes indices starting from 0 + NCollection_Sequence aSceneRootNodeInds; + writeNodes (theDocument, theRootLabels, theLabelFilter, aSceneNodeMap, aSceneRootNodeInds); + writeSamplers (aMaterialMap); + writeScene (aDefSceneId); + writeScenes (aSceneRootNodeInds); + writeSkins(); + writeTextures (aSceneNodeMap, aMaterialMap); + + myWriter->EndObject(); + + if (!myIsBinary) + { + aGltfContentFile.close(); + if (!aGltfContentFile.good()) + { + Message::SendFail (TCollection_AsciiString ("File '") + aFileNameGltf + "' can not be written"); + return false; + } + return true; + } + + int64_t aContentLen64 = (int64_t )aGltfContentFile.tellp() - 20; + while (aContentLen64 % 4 != 0) + { + aGltfContentFile.write (" ", 1); + ++aContentLen64; + } + + const uint32_t aBinLength = (uint32_t )myBinDataLen64; + const uint32_t aBinType = 0x004E4942; + aGltfContentFile.write ((const char*)&aBinLength, 4); + aGltfContentFile.write ((const char*)&aBinType, 4); + + const int64_t aFullLen64 = aContentLen64 + 20 + myBinDataLen64 + 8; + if (aFullLen64 < std::numeric_limits::max()) + { + { + std::ifstream aBinFile; + OSD_OpenStream (aBinFile, myBinFileNameFull.ToCString(), std::ios::in | std::ios::binary); + if (!aBinFile.is_open() + || !aBinFile.good()) + { + Message::SendFail (TCollection_AsciiString ("File '") + myBinFileNameFull + "' cannot be opened"); + return false; + } + char aBuffer[4096]; + for (; aBinFile.good();) + { + aBinFile.read (aBuffer, 4096); + const Standard_Integer aReadLen = (Standard_Integer )aBinFile.gcount(); + if (aReadLen == 0) + { + break; + } + aGltfContentFile.write (aBuffer, aReadLen); + } + } + OSD_Path aBinFilePath (myBinFileNameFull); + OSD_File (aBinFilePath).Remove(); + if (OSD_File (aBinFilePath).Exists()) + { + Message::SendFail (TCollection_AsciiString ("Unable to remove temporary glTF content file '") + myBinFileNameFull + "'"); + } + } + else + { + Message::SendFail ("glTF file content is too big for binary format"); + return false; + } + + const uint32_t aLength = (uint32_t )aFullLen64; + const uint32_t aContentLength = (uint32_t )aContentLen64; + aGltfContentFile.seekp (8); + aGltfContentFile.write ((const char* )&aLength, 4); + aGltfContentFile.write ((const char* )&aContentLength, 4); + + aGltfContentFile.close(); + if (!aGltfContentFile.good()) + { + Message::SendFail (TCollection_AsciiString ("File '") + aFileNameGltf + "' can not be written"); + return false; + } + + myWriter.reset(); + return true; +#else + (void )theDocument; + (void )theRootLabels; + (void )theLabelFilter; + (void )theFileInfo; + (void )theProgress; + Message::SendFail ("Error: glTF writer is unavailable - OCCT has been built without RapidJSON support [HAVE_RAPIDJSON undefined]"); + return false; +#endif +} + +// ======================================================================= +// function : writeAccessors +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeAccessors (const RWGltf_GltfSceneNodeMap& theSceneNodeMap) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeAccessors()"); + + myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Accessors)); + myWriter->StartArray(); + + NCollection_Map aWrittenFaces; + for (RWGltf_GltfSceneNodeMap::Iterator aSceneNodeIter (theSceneNodeMap); aSceneNodeIter.More(); aSceneNodeIter.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aSceneNodeIter.Value(); + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More(); aFaceIter.Next()) + { + if (!aWrittenFaces.Add (aFaceIter.Face()) // skip repeating faces + || toSkipFaceMesh (aFaceIter)) + { + continue; + } + + const RWGltf_GltfFace& aGltfFace = myBinDataMap.Find (aFaceIter.Face()); + writePositions (aGltfFace); + } + } + aWrittenFaces.Clear(); + for (RWGltf_GltfSceneNodeMap::Iterator aSceneNodeIter (theSceneNodeMap); aSceneNodeIter.More(); aSceneNodeIter.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aSceneNodeIter.Value(); + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More(); aFaceIter.Next()) + { + if (!aWrittenFaces.Add (aFaceIter.Face()) // skip repeating faces + || toSkipFaceMesh (aFaceIter)) + { + continue; + } + + const RWGltf_GltfFace& aGltfFace = myBinDataMap.Find (aFaceIter.Face()); + writeNormals (aGltfFace); + } + } + aWrittenFaces.Clear(); + for (RWGltf_GltfSceneNodeMap::Iterator aSceneNodeIter (theSceneNodeMap); aSceneNodeIter.More(); aSceneNodeIter.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aSceneNodeIter.Value(); + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More(); aFaceIter.Next()) + { + if (!aWrittenFaces.Add (aFaceIter.Face()) // skip repeating faces + || toSkipFaceMesh (aFaceIter)) + { + continue; + } + + const RWGltf_GltfFace& aGltfFace = myBinDataMap.Find (aFaceIter.Face()); + writeTextCoords (aGltfFace); + } + } + aWrittenFaces.Clear(); + for (RWGltf_GltfSceneNodeMap::Iterator aSceneNodeIter (theSceneNodeMap); aSceneNodeIter.More(); aSceneNodeIter.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aSceneNodeIter.Value(); + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More(); aFaceIter.Next()) + { + if (!aWrittenFaces.Add (aFaceIter.Face()) // skip repeating faces + || toSkipFaceMesh (aFaceIter)) + { + continue; + } + + const RWGltf_GltfFace& aGltfFace = myBinDataMap.Find (aFaceIter.Face()); + writeIndices (aGltfFace); + } + } + + myWriter->EndArray(); +#else + (void )theSceneNodeMap; +#endif +} + +// ======================================================================= +// function : writePositions +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writePositions (const RWGltf_GltfFace& theGltfFace) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writePositions()"); + if (theGltfFace.NodePos.Id == RWGltf_GltfAccessor::INVALID_ID) + { + return; + } + + myWriter->StartObject(); + myWriter->Key ("bufferView"); + myWriter->Int (myBuffViewPos.Id); + myWriter->Key ("byteOffset"); + myWriter->Int64 (theGltfFace.NodePos.ByteOffset); + myWriter->Key ("componentType"); + myWriter->Int (theGltfFace.NodePos.ComponentType); + myWriter->Key ("count"); + myWriter->Int64 (theGltfFace.NodePos.Count); + + if (theGltfFace.NodePos.BndBox.IsValid()) + { + myWriter->Key ("max"); + myWriter->StartArray(); + myWriter->Double (theGltfFace.NodePos.BndBox.CornerMax().x()); + myWriter->Double (theGltfFace.NodePos.BndBox.CornerMax().y()); + myWriter->Double (theGltfFace.NodePos.BndBox.CornerMax().z()); + myWriter->EndArray(); + + myWriter->Key("min"); + myWriter->StartArray(); + myWriter->Double (theGltfFace.NodePos.BndBox.CornerMin().x()); + myWriter->Double (theGltfFace.NodePos.BndBox.CornerMin().y()); + myWriter->Double (theGltfFace.NodePos.BndBox.CornerMin().z()); + myWriter->EndArray(); + } + myWriter->Key ("type"); + myWriter->String ("VEC3"); + + myWriter->EndObject(); +#else + (void )theGltfFace; +#endif +} + +// ======================================================================= +// function : writeNormals +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeNormals (const RWGltf_GltfFace& theGltfFace) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeNormals()"); + if (theGltfFace.NodeNorm.Id == RWGltf_GltfAccessor::INVALID_ID) + { + return; + } + + myWriter->StartObject(); + myWriter->Key ("bufferView"); + myWriter->Int (myBuffViewNorm.Id); + myWriter->Key ("byteOffset"); + myWriter->Int64 (theGltfFace.NodeNorm.ByteOffset); + myWriter->Key ("componentType"); + myWriter->Int (theGltfFace.NodeNorm.ComponentType); + myWriter->Key ("count"); + myWriter->Int64 (theGltfFace.NodeNorm.Count); + // min/max values are optional, and not very useful for normals - skip them + /*{ + myWriter->Key ("max"); + myWriter->StartArray(); + myWriter->Double (1.0); + myWriter->Double (1.0); + myWriter->Double (1.0); + myWriter->EndArray(); + } + { + myWriter->Key ("min"); + myWriter->StartArray(); + myWriter->Double (0.0); + myWriter->Double (0.0); + myWriter->Double (0.0); + myWriter->EndArray(); + }*/ + myWriter->Key ("type"); + myWriter->String ("VEC3"); + + myWriter->EndObject(); +#else + (void )theGltfFace; +#endif +} + +// ======================================================================= +// function : writeTextCoords +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeTextCoords (const RWGltf_GltfFace& theGltfFace) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeTextCoords()"); + if (theGltfFace.NodeUV.Id == RWGltf_GltfAccessor::INVALID_ID) + { + return; + } + + myWriter->StartObject(); + myWriter->Key ("bufferView"); + myWriter->Int (myBuffViewTextCoord.Id); + myWriter->Key ("byteOffset"); + myWriter->Int64 (theGltfFace.NodeUV.ByteOffset); + myWriter->Key ("componentType"); + myWriter->Int (theGltfFace.NodeUV.ComponentType); + myWriter->Key ("count"); + myWriter->Int64 (theGltfFace.NodeUV.Count); + // min/max values are optional, and not very useful for UV coordinates - skip them + /*{ + myWriter->Key ("max"); + myWriter->StartArray(); + myWriter->Double (1.0); + myWriter->Double (1.0); + myWriter->Double (1.0); + myWriter->EndArray(); + } + { + myWriter->Key ("min"); + myWriter->StartArray(); + myWriter->Double (0.0); + myWriter->Double (0.0); + myWriter->Double (0.0); + myWriter->EndArray(); + }*/ + myWriter->Key ("type"); + myWriter->String ("VEC2"); + + myWriter->EndObject(); +#else + (void )theGltfFace; +#endif +} + +// ======================================================================= +// function : writeIndices +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeIndices (const RWGltf_GltfFace& theGltfFace) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeIndices()"); + if (theGltfFace.Indices.Id == RWGltf_GltfAccessor::INVALID_ID) + { + return; + } + + myWriter->StartObject(); + myWriter->Key ("bufferView"); + myWriter->Int (myBuffViewInd.Id); + myWriter->Key ("byteOffset"); + myWriter->Int64 (theGltfFace.Indices.ByteOffset); + myWriter->Key ("componentType"); + myWriter->Int (theGltfFace.Indices.ComponentType); + myWriter->Key ("count"); + myWriter->Int64 (theGltfFace.Indices.Count); + + myWriter->Key ("type"); + myWriter->String ("SCALAR"); + + myWriter->EndObject(); +#else + (void )theGltfFace; +#endif +} + +// ======================================================================= +// function : writeAnimations +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeAnimations() +{ + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeAnimations()"); + + // This section should be skipped if it doesn't contain any information but not be empty + //myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Animations)); + //myWriter->StartArray(); + //myWriter->EndArray(); +} + +// ======================================================================= +// function : writeAsset +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeAsset (const TColStd_IndexedDataMapOfStringString& theFileInfo) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeAsset()"); + + myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Asset)); + myWriter->StartObject(); + myWriter->Key ("generator"); + myWriter->String ("Open CASCADE Technology [www.opencascade.com]"); + myWriter->Key ("version"); + myWriter->String ("2.0"); // glTF format version + + bool anIsStarted = false; + for (TColStd_IndexedDataMapOfStringString::Iterator aKeyValueIter (theFileInfo); aKeyValueIter.More(); aKeyValueIter.Next()) + { + if (!anIsStarted) + { + myWriter->Key ("extras"); + myWriter->StartObject(); + anIsStarted = true; + } + myWriter->Key (aKeyValueIter.Key().ToCString()); + myWriter->String (aKeyValueIter.Value().ToCString()); + } + if (anIsStarted) + { + myWriter->EndObject(); + } + + myWriter->EndObject(); +#else + (void )theFileInfo; +#endif +} + +// ======================================================================= +// function : writeBufferViews +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeBufferViews (const Standard_Integer theBinDataBufferId) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeBufferViews()"); + + myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_BufferViews)); + myWriter->StartArray(); + if (myBuffViewPos.Id != RWGltf_GltfAccessor::INVALID_ID) + { + myWriter->StartObject(); + myWriter->Key ("buffer"); + myWriter->Int (theBinDataBufferId); + myWriter->Key ("byteLength"); + myWriter->Int64 (myBuffViewPos.ByteLength); + myWriter->Key ("byteOffset"); + myWriter->Int64 (myBuffViewPos.ByteOffset); + myWriter->Key ("byteStride"); + myWriter->Int64 (myBuffViewPos.ByteStride); + myWriter->Key ("target"); + myWriter->Int (myBuffViewPos.Target); + myWriter->EndObject(); + } + if (myBuffViewNorm.Id != RWGltf_GltfAccessor::INVALID_ID) + { + myWriter->StartObject(); + myWriter->Key ("buffer"); + myWriter->Int (theBinDataBufferId); + myWriter->Key ("byteLength"); + myWriter->Int64 (myBuffViewNorm.ByteLength); + myWriter->Key ("byteOffset"); + myWriter->Int64 (myBuffViewNorm.ByteOffset); + myWriter->Key ("byteStride"); + myWriter->Int64 (myBuffViewNorm.ByteStride); + myWriter->Key ("target"); + myWriter->Int (myBuffViewNorm.Target); + myWriter->EndObject(); + } + if (myBuffViewTextCoord.Id != RWGltf_GltfAccessor::INVALID_ID) + { + myWriter->StartObject(); + myWriter->Key ("buffer"); + myWriter->Int (theBinDataBufferId); + myWriter->Key ("byteLength"); + myWriter->Int64 (myBuffViewTextCoord.ByteLength); + myWriter->Key ("byteOffset"); + myWriter->Int64 (myBuffViewTextCoord.ByteOffset); + myWriter->Key ("byteStride"); + myWriter->Int64 (myBuffViewTextCoord.ByteStride); + myWriter->Key ("target"); + myWriter->Int (myBuffViewTextCoord.Target); + myWriter->EndObject(); + } + if (myBuffViewInd.Id != RWGltf_GltfAccessor::INVALID_ID) + { + myWriter->StartObject(); + myWriter->Key ("buffer"); + myWriter->Int (theBinDataBufferId); + myWriter->Key ("byteLength"); + myWriter->Int64 (myBuffViewInd.ByteLength); + myWriter->Key ("byteOffset"); + myWriter->Int64 (myBuffViewInd.ByteOffset); + myWriter->Key ("target"); + myWriter->Int (myBuffViewInd.Target); + myWriter->EndObject(); + } + myWriter->EndArray(); +#else + (void )theBinDataBufferId; +#endif +} + +// ======================================================================= +// function : writeBuffers +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeBuffers() +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeBuffers()"); + + myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Buffers)); + myWriter->StartArray(); + { + myWriter->StartObject(); + { + myWriter->Key ("byteLength"); + myWriter->Int64 (myBuffViewPos.ByteLength + myBuffViewNorm.ByteLength + + myBuffViewTextCoord.ByteLength + myBuffViewInd.ByteLength); + if (!myIsBinary) + { + myWriter->Key ("uri"); + myWriter->String (myBinFileNameShort.ToCString()); + } + } + myWriter->EndObject(); + } + myWriter->EndArray(); +#endif +} + +// ======================================================================= +// function : writeExtensions +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeExtensions() +{ + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeExtensions()"); +} + +// ======================================================================= +// function : writeImages +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeImages (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, + RWGltf_GltfMaterialMap& theMaterialMap) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeImages()"); + + // empty RWGltf_GltfRootElement_Images section should NOT be written to avoid validator errors + bool anIsStarted = false; + for (RWGltf_GltfSceneNodeMap::Iterator aSceneNodeIter (theSceneNodeMap); aSceneNodeIter.More(); aSceneNodeIter.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aSceneNodeIter.Value(); + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More(); aFaceIter.Next()) + { + theMaterialMap.AddImages (myWriter.get(), aFaceIter.FaceStyle(), anIsStarted); + } + } + if (anIsStarted) + { + myWriter->EndArray(); + } +#else + (void )theSceneNodeMap; + (void )theMaterialMap; +#endif +} + +// ======================================================================= +// function : writeMaterials +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeMaterials (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, + RWGltf_GltfMaterialMap& theMaterialMap) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeMaterials()"); + + // empty RWGltf_GltfRootElement_Materials section should NOT be written to avoid validator errors + bool anIsStarted = false; + for (RWGltf_GltfSceneNodeMap::Iterator aSceneNodeIter (theSceneNodeMap); aSceneNodeIter.More(); aSceneNodeIter.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aSceneNodeIter.Value(); + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More(); aFaceIter.Next()) + { + theMaterialMap.AddMaterial (myWriter.get(), aFaceIter.FaceStyle(), anIsStarted); + } + } + if (anIsStarted) + { + myWriter->EndArray(); + } +#else + (void )theSceneNodeMap; + (void )theMaterialMap; +#endif +} + +// ======================================================================= +// function : writeMeshes +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeMeshes (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, + const RWGltf_GltfMaterialMap& theMaterialMap) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeMeshes()"); + + myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Meshes)); + myWriter->StartArray(); + + for (RWGltf_GltfSceneNodeMap::Iterator aSceneNodeIter (theSceneNodeMap); aSceneNodeIter.More(); aSceneNodeIter.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aSceneNodeIter.Value(); + const TCollection_AsciiString aNodeName = readNameAttribute (aDocNode.RefLabel); + { + RWMesh_FaceIterator aFaceIter(aDocNode.RefLabel, TopLoc_Location(), false); + if (!aFaceIter.More()) + { + Message::SendWarning (TCollection_AsciiString("RWGltf_CafWriter skipped node '") + aNodeName + "' without triangulation data"); + continue; + } + } + myWriter->StartObject(); + myWriter->Key ("name"); + myWriter->String (aNodeName.ToCString()); + myWriter->Key ("primitives"); + myWriter->StartArray(); + + Standard_Integer aNbFacesInNode = 0; + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More(); aFaceIter.Next(), ++aNbFacesInNode) + { + if (toSkipFaceMesh (aFaceIter)) + { + continue; + } + + const RWGltf_GltfFace& aGltfFace = myBinDataMap.Find (aFaceIter.Face()); + const TCollection_AsciiString aMatId = theMaterialMap.FindMaterial (aFaceIter.FaceStyle()); + myWriter->StartObject(); + { + myWriter->Key ("attributes"); + myWriter->StartObject(); + { + if (aGltfFace.NodeNorm.Id != RWGltf_GltfAccessor::INVALID_ID) + { + myWriter->Key ("NORMAL"); + myWriter->Int (aGltfFace.NodeNorm.Id); + } + myWriter->Key ("POSITION"); + myWriter->Int (aGltfFace.NodePos.Id); + if (aGltfFace.NodeUV.Id != RWGltf_GltfAccessor::INVALID_ID) + { + myWriter->Key ("TEXCOORD_0"); + myWriter->Int (aGltfFace.NodeUV.Id); + } + } + myWriter->EndObject(); + + myWriter->Key ("indices"); + myWriter->Int (aGltfFace.Indices.Id); + if (!aMatId.IsEmpty()) + { + myWriter->Key ("material"); + myWriter->Int (aMatId.IntegerValue()); + } + myWriter->Key ("mode"); + myWriter->Int (RWGltf_GltfPrimitiveMode_Triangles); + } + myWriter->EndObject(); + } + myWriter->EndArray(); + myWriter->EndObject(); + } + myWriter->EndArray(); +#else + (void )theSceneNodeMap; + (void )theMaterialMap; +#endif +} + +// ======================================================================= +// function : writeNodes +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeNodes (const Handle(TDocStd_Document)& theDocument, + const TDF_LabelSequence& theRootLabels, + const TColStd_MapOfAsciiString* theLabelFilter, + const RWGltf_GltfSceneNodeMap& theSceneNodeMap, + NCollection_Sequence& theSceneRootNodeInds) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeNodes()"); + + // Prepare full indexed map of scene nodes in correct order. + RWGltf_GltfSceneNodeMap aSceneNodeMapWithChildren; // indexes starting from 1 + for (XCAFPrs_DocumentExplorer aDocExplorer (theDocument, theRootLabels, XCAFPrs_DocumentExplorerFlags_None); + aDocExplorer.More(); aDocExplorer.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aDocExplorer.Current(); + { + RWMesh_FaceIterator aFaceIter(aDocNode.RefLabel, TopLoc_Location(), false); + if (!aFaceIter.More()) + { + continue; + } + } + if (theLabelFilter != NULL + && !theLabelFilter->Contains (aDocNode.Id)) + { + continue; + } + + Standard_Integer aNodeIndex = aSceneNodeMapWithChildren.Add (aDocNode); + if (aDocExplorer.CurrentDepth() == 0) + { + // save root node index (starting from 0 not 1) + theSceneRootNodeInds.Append (aNodeIndex - 1); + } + } + + // Write scene nodes using prepared map for correct order of array members + myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Nodes)); + myWriter->StartArray(); + + for (RWGltf_GltfSceneNodeMap::Iterator aSceneNodeIter (aSceneNodeMapWithChildren); aSceneNodeIter.More(); aSceneNodeIter.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aSceneNodeIter.Value(); + + myWriter->StartObject(); + { + if (aDocNode.IsAssembly) + { + myWriter->Key ("children"); + myWriter->StartArray(); + { + for (TDF_ChildIterator aChildIter (aDocNode.RefLabel); aChildIter.More(); aChildIter.Next()) + { + const TDF_Label& aChildLabel = aChildIter.Value(); + if (aChildLabel.IsNull()) + { + continue; + } + + const TCollection_AsciiString aChildId = XCAFPrs_DocumentExplorer::DefineChildId (aChildLabel, aDocNode.Id); + Standard_Integer aChildIdx = aSceneNodeMapWithChildren.FindIndex (aChildId); + if (aChildIdx > 0) + { + myWriter->Int (aChildIdx - 1); + } + } + } + myWriter->EndArray(); + } + } + if (!aDocNode.LocalTrsf.IsIdentity()) + { + gp_Trsf aTrsf = aDocNode.LocalTrsf.Transformation(); + if (aTrsf.Form() != gp_Identity) + { + myCSTrsf.TransformTransformation (aTrsf); + const gp_Quaternion aQuaternion = aTrsf.GetRotation(); + const bool hasRotation = Abs (aQuaternion.X()) > gp::Resolution() + || Abs (aQuaternion.Y()) > gp::Resolution() + || Abs (aQuaternion.Z()) > gp::Resolution() + || Abs (aQuaternion.W() - 1.0) > gp::Resolution(); + const Standard_Real aScaleFactor = aTrsf.ScaleFactor(); + const bool hasScale = Abs (aScaleFactor - 1.0) > Precision::Confusion(); + const gp_XYZ& aTranslPart = aTrsf.TranslationPart(); + const bool hasTranslation = aTranslPart.SquareModulus() > gp::Resolution(); + + RWGltf_WriterTrsfFormat aTrsfFormat = myTrsfFormat; + if (myTrsfFormat == RWGltf_WriterTrsfFormat_Compact) + { + aTrsfFormat = hasRotation && hasScale && hasTranslation + ? RWGltf_WriterTrsfFormat_Mat4 + : RWGltf_WriterTrsfFormat_TRS; + } + + if (aTrsfFormat == RWGltf_WriterTrsfFormat_Mat4) + { + // write full matrix + Graphic3d_Mat4 aMat4; + aTrsf.GetMat4 (aMat4); + if (!aMat4.IsIdentity()) + { + myWriter->Key ("matrix"); + myWriter->StartArray(); + for (Standard_Integer aColIter = 0; aColIter < 4; ++aColIter) + { + for (Standard_Integer aRowIter = 0; aRowIter < 4; ++aRowIter) + { + myWriter->Double (aMat4.GetValue (aRowIter, aColIter)); + } + } + myWriter->EndArray(); + } + } + else //if (aTrsfFormat == RWGltf_WriterTrsfFormat_TRS) + { + if (hasRotation) + { + myWriter->Key ("rotation"); + myWriter->StartArray(); + myWriter->Double (aQuaternion.X()); + myWriter->Double (aQuaternion.Y()); + myWriter->Double (aQuaternion.Z()); + myWriter->Double (aQuaternion.W()); + myWriter->EndArray(); + } + if (hasScale) + { + myWriter->Key ("scale"); + myWriter->StartArray(); + myWriter->Double (aScaleFactor); + myWriter->Double (aScaleFactor); + myWriter->Double (aScaleFactor); + myWriter->EndArray(); + } + if (hasTranslation) + { + myWriter->Key ("translation"); + myWriter->StartArray(); + myWriter->Double (aTranslPart.X()); + myWriter->Double (aTranslPart.Y()); + myWriter->Double (aTranslPart.Z()); + myWriter->EndArray(); + } + } + } + } + if (!aDocNode.IsAssembly) + { + myWriter->Key ("mesh"); + // Mesh order of current node is equal to order of this node in scene nodes map + Standard_Integer aMeshIdx = theSceneNodeMap.FindIndex (aDocNode.Id); + if (aMeshIdx > 0) + { + myWriter->Int (aMeshIdx - 1); + } + } + { + TCollection_AsciiString aNodeName = readNameAttribute (aDocNode.Label); + if (aNodeName.IsEmpty()) + { + aNodeName = readNameAttribute (aDocNode.RefLabel); + } + myWriter->Key ("name"); + myWriter->String (aNodeName.ToCString()); + } + myWriter->EndObject(); + } + myWriter->EndArray(); +#else + (void )theDocument; + (void )theRootLabels; + (void )theLabelFilter; + (void )theSceneNodeMap; + (void )theSceneRootNodeInds; +#endif +} + +// ======================================================================= +// function : writeSamplers +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeSamplers (const RWGltf_GltfMaterialMap& theMaterialMap) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeSamplers()"); + if (theMaterialMap.NbImages() == 0) + { + return; + } + + myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Samplers)); + myWriter->StartArray(); + { + myWriter->StartObject(); + { + //myWriter->Key ("magFilter"); + //myWriter->Int (9729); + //myWriter->Key ("minFilter"); + //myWriter->Int (9729); + } + myWriter->EndObject(); + } + myWriter->EndArray(); +#else + (void )theMaterialMap; +#endif +} + +// ======================================================================= +// function : writeScene +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeScene (const Standard_Integer theDefSceneId) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeScene()"); + + myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Scene)); + myWriter->Int (theDefSceneId); +#else + (void )theDefSceneId; +#endif +} + +// ======================================================================= +// function : writeScenes +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeScenes (const NCollection_Sequence& theSceneRootNodeInds) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeScenes()"); + + myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Scenes)); + myWriter->StartArray(); + { + myWriter->StartObject(); + myWriter->Key ("nodes"); + myWriter->StartArray(); + for (NCollection_Sequence::Iterator aRootIter (theSceneRootNodeInds); aRootIter.More(); aRootIter.Next()) + { + myWriter->Int (aRootIter.Value()); + } + myWriter->EndArray(); + myWriter->EndObject(); + } + myWriter->EndArray(); +#else + (void )theSceneRootNodeInds; +#endif +} + +// ======================================================================= +// function : writeSkins +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeSkins() +{ + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeSkins()"); + + // This section should be skipped if it doesn't contain any information but not be empty + /*myWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Skins)); + myWriter->StartArray(); + myWriter->EndArray();*/ +} + +// ======================================================================= +// function : writeTextures +// purpose : +// ======================================================================= +void RWGltf_CafWriter::writeTextures (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, + RWGltf_GltfMaterialMap& theMaterialMap) +{ +#ifdef HAVE_RAPIDJSON + Standard_ProgramError_Raise_if (myWriter.get() == NULL, "Internal error: RWGltf_CafWriter::writeTextures()"); + + // empty RWGltf_GltfRootElement_Textures section should not be written to avoid validator errors + bool anIsStarted = false; + for (RWGltf_GltfSceneNodeMap::Iterator aSceneNodeIter (theSceneNodeMap); aSceneNodeIter.More(); aSceneNodeIter.Next()) + { + const XCAFPrs_DocumentNode& aDocNode = aSceneNodeIter.Value(); + for (RWMesh_FaceIterator aFaceIter (aDocNode.RefLabel, TopLoc_Location(), true, aDocNode.Style); aFaceIter.More(); aFaceIter.Next()) + { + theMaterialMap.AddTextures (myWriter.get(), aFaceIter.FaceStyle(), anIsStarted); + } + } + if (anIsStarted) + { + myWriter->EndArray(); + } +#else + (void )theSceneNodeMap; + (void )theMaterialMap; +#endif +} diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_CafWriter.hxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_CafWriter.hxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_CafWriter.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_CafWriter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,294 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWGltf_CafWriter_HeaderFiler +#define _RWGltf_CafWriter_HeaderFiler + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +class Message_ProgressRange; +class RWMesh_FaceIterator; +class RWGltf_GltfOStreamWriter; +class RWGltf_GltfMaterialMap; +class RWGltf_GltfSceneNodeMap; +class TDocStd_Document; + +//! glTF writer context from XCAF document. +class RWGltf_CafWriter : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(RWGltf_CafWriter, Standard_Transient) +public: + + //! Main constructor. + //! @param theFile [in] path to output glTF file + //! @param theIsBinary [in] flag to write into binary glTF format (.glb) + Standard_EXPORT RWGltf_CafWriter (const TCollection_AsciiString& theFile, + Standard_Boolean theIsBinary); + + //! Destructor. + Standard_EXPORT virtual ~RWGltf_CafWriter(); + + //! Return transformation from OCCT to glTF coordinate system. + const RWMesh_CoordinateSystemConverter& CoordinateSystemConverter() const { return myCSTrsf; } + + //! Return transformation from OCCT to glTF coordinate system. + RWMesh_CoordinateSystemConverter& ChangeCoordinateSystemConverter() { return myCSTrsf; } + + //! Set transformation from OCCT to glTF coordinate system. + void SetCoordinateSystemConverter (const RWMesh_CoordinateSystemConverter& theConverter) { myCSTrsf = theConverter; } + + //! Return flag to write into binary glTF format (.glb), specified within class constructor. + bool IsBinary() const { return myIsBinary; } + + //! Return preferred transformation format for writing into glTF file; RWGltf_WriterTrsfFormat_Compact by default. + RWGltf_WriterTrsfFormat TransformationFormat() const { return myTrsfFormat; } + + //! Set preferred transformation format for writing into glTF file. + void SetTransformationFormat (RWGltf_WriterTrsfFormat theFormat) { myTrsfFormat = theFormat; } + + //! Return TRUE to export UV coordinates even if there are no mapped texture; FALSE by default. + bool IsForcedUVExport() const { return myIsForcedUVExport; } + + //! Set flag to export UV coordinates even if there are no mapped texture; FALSE by default. + void SetForcedUVExport (bool theToForce) { myIsForcedUVExport = theToForce; } + + //! Return default material definition to be used for nodes with only color defined. + const XCAFPrs_Style& DefaultStyle() const { return myDefaultStyle; } + + //! Set default material definition to be used for nodes with only color defined. + void SetDefaultStyle (const XCAFPrs_Style& theStyle) { myDefaultStyle = theStyle; } + + //! Write glTF file and associated binary file. + //! Triangulation data should be precomputed within shapes! + //! @param theDocument [in] input document + //! @param theRootLabels [in] list of root shapes to export + //! @param theLabelFilter [in] optional filter with document nodes to export, + //! with keys defined by XCAFPrs_DocumentExplorer::DefineChildId() and filled recursively + //! (leaves and parent assembly nodes at all levels); + //! when not NULL, all nodes not included into the map will be ignored + //! @param theFileInfo [in] map with file metadata to put into glTF header section + //! @param theProgress [in] optional progress indicator + //! @return FALSE on file writing failure + Standard_EXPORT virtual bool Perform (const Handle(TDocStd_Document)& theDocument, + const TDF_LabelSequence& theRootLabels, + const TColStd_MapOfAsciiString* theLabelFilter, + const TColStd_IndexedDataMapOfStringString& theFileInfo, + const Message_ProgressRange& theProgress); + + //! Write glTF file and associated binary file. + //! Triangulation data should be precomputed within shapes! + //! @param theDocument [in] input document + //! @param theFileInfo [in] map with file metadata to put into glTF header section + //! @param theProgress [in] optional progress indicator + //! @return FALSE on file writing failure + Standard_EXPORT virtual bool Perform (const Handle(TDocStd_Document)& theDocument, + const TColStd_IndexedDataMapOfStringString& theFileInfo, + const Message_ProgressRange& theProgress); + +protected: + + //! Write binary data file with triangulation data. + //! Triangulation data should be precomputed within shapes! + //! @param theDocument [in] input document + //! @param theRootLabels [in] list of root shapes to export + //! @param theLabelFilter [in] optional filter with document nodes to export + //! @param theProgress [in] optional progress indicator + //! @return FALSE on file writing failure + Standard_EXPORT virtual bool writeBinData (const Handle(TDocStd_Document)& theDocument, + const TDF_LabelSequence& theRootLabels, + const TColStd_MapOfAsciiString* theLabelFilter, + const Message_ProgressRange& theProgress); + + //! Write JSON file with glTF structure (should be called after writeBinData()). + //! @param theDocument [in] input document + //! @param theRootLabels [in] list of root shapes to export + //! @param theLabelFilter [in] optional filter with document nodes to export + //! @param theFileInfo [in] map with file metadata to put into glTF header section + //! @param theProgress [in] optional progress indicator + //! @return FALSE on file writing failure + Standard_EXPORT virtual bool writeJson (const Handle(TDocStd_Document)& theDocument, + const TDF_LabelSequence& theRootLabels, + const TColStd_MapOfAsciiString* theLabelFilter, + const TColStd_IndexedDataMapOfStringString& theFileInfo, + const Message_ProgressRange& theProgress); + +protected: + + //! Return TRUE if face mesh should be skipped (e.g. because it is invalid or empty). + Standard_EXPORT virtual Standard_Boolean toSkipFaceMesh (const RWMesh_FaceIterator& theFaceIter); + + //! Write mesh nodes into binary file. + //! @param theGltfFace [out] glTF face definition + //! @param theBinFile [out] output file to write into + //! @param theFaceIter [in] current face to write + //! @param theAccessorNb [in] [out] last accessor index + Standard_EXPORT virtual void saveNodes (RWGltf_GltfFace& theGltfFace, + std::ostream& theBinFile, + const RWMesh_FaceIterator& theFaceIter, + Standard_Integer& theAccessorNb) const; + + //! Write mesh normals into binary file. + //! @param theGltfFace [out] glTF face definition + //! @param theBinFile [out] output file to write into + //! @param theFaceIter [in] current face to write + //! @param theAccessorNb [in] [out] last accessor index + Standard_EXPORT virtual void saveNormals (RWGltf_GltfFace& theGltfFace, + std::ostream& theBinFile, + RWMesh_FaceIterator& theFaceIter, + Standard_Integer& theAccessorNb) const; + + //! Write mesh texture UV coordinates into binary file. + //! @param theGltfFace [out] glTF face definition + //! @param theBinFile [out] output file to write into + //! @param theFaceIter [in] current face to write + //! @param theAccessorNb [in] [out] last accessor index + Standard_EXPORT virtual void saveTextCoords (RWGltf_GltfFace& theGltfFace, + std::ostream& theBinFile, + const RWMesh_FaceIterator& theFaceIter, + Standard_Integer& theAccessorNb) const; + + //! Write mesh indexes into binary file. + //! @param theGltfFace [out] glTF face definition + //! @param theBinFile [out] output file to write into + //! @param theFaceIter [in] current face to write + //! @param theAccessorNb [in] [out] last accessor index + Standard_EXPORT virtual void saveIndices (RWGltf_GltfFace& theGltfFace, + std::ostream& theBinFile, + const RWMesh_FaceIterator& theFaceIter, + Standard_Integer& theAccessorNb); + +protected: + + //! Write bufferView for vertex positions within RWGltf_GltfRootElement_Accessors section + //! @param theGltfFace [in] face definition to write + Standard_EXPORT virtual void writePositions (const RWGltf_GltfFace& theGltfFace); + + //! Write bufferView for vertex normals within RWGltf_GltfRootElement_Accessors section + //! @param theGltfFace [in] face definition to write + Standard_EXPORT virtual void writeNormals (const RWGltf_GltfFace& theGltfFace); + + //! Write bufferView for vertex texture coordinates within RWGltf_GltfRootElement_Accessors section + //! @param theGltfFace [in] face definition to write + Standard_EXPORT virtual void writeTextCoords (const RWGltf_GltfFace& theGltfFace); + + //! Write bufferView for triangle indexes within RWGltf_GltfRootElement_Accessors section. + //! @param theGltfFace [in] face definition to write + Standard_EXPORT virtual void writeIndices (const RWGltf_GltfFace& theGltfFace); + +protected: + + //! Write RWGltf_GltfRootElement_Accessors section. + //! @param theSceneNodeMap [in] ordered map of scene nodes + Standard_EXPORT virtual void writeAccessors (const RWGltf_GltfSceneNodeMap& theSceneNodeMap); + + //! Write RWGltf_GltfRootElement_Animations section (reserved). + Standard_EXPORT virtual void writeAnimations(); + + //! Write RWGltf_GltfRootElement_Asset section. + //! @param theFileInfo [in] optional metadata to write into file header + Standard_EXPORT virtual void writeAsset (const TColStd_IndexedDataMapOfStringString& theFileInfo); + + //! Write RWGltf_GltfRootElement_BufferViews section. + //! @param theBinDataBufferId [in] index of binary buffer with vertex data + Standard_EXPORT virtual void writeBufferViews (const Standard_Integer theBinDataBufferId); + + //! Write RWGltf_GltfRootElement_Buffers section. + Standard_EXPORT virtual void writeBuffers(); + + //! Write RWGltf_GltfRootElement_ExtensionsUsed/RWGltf_GltfRootElement_ExtensionsRequired sections (reserved). + Standard_EXPORT virtual void writeExtensions(); + + //! Write RWGltf_GltfRootElement_Images section. + //! @param theSceneNodeMap [in] ordered map of scene nodes + //! @param theMaterialMap [out] map of materials, filled with image files used by textures + Standard_EXPORT virtual void writeImages (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, + RWGltf_GltfMaterialMap& theMaterialMap); + + //! Write RWGltf_GltfRootElement_Materials section. + //! @param theSceneNodeMap [in] ordered map of scene nodes + //! @param theMaterialMap [out] map of materials, filled with materials + Standard_EXPORT virtual void writeMaterials (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, + RWGltf_GltfMaterialMap& theMaterialMap); + + //! Write RWGltf_GltfRootElement_Meshes section. + //! @param theSceneNodeMap [in] ordered map of scene nodes + //! @param theMaterialMap [in] map of materials + Standard_EXPORT virtual void writeMeshes (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, + const RWGltf_GltfMaterialMap& theMaterialMap); + + //! Write RWGltf_GltfRootElement_Nodes section. + //! @param theDocument [in] input document + //! @param theRootLabels [in] list of root shapes to export + //! @param theLabelFilter [in] optional filter with document nodes to export + //! @param theSceneNodeMap [in] ordered map of scene nodes + //! @param theSceneRootNodeInds [out] sequence of scene nodes pointing to root shapes (to be used for writeScenes()) + Standard_EXPORT virtual void writeNodes (const Handle(TDocStd_Document)& theDocument, + const TDF_LabelSequence& theRootLabels, + const TColStd_MapOfAsciiString* theLabelFilter, + const RWGltf_GltfSceneNodeMap& theSceneNodeMap, + NCollection_Sequence& theSceneRootNodeInds); + + //! Write RWGltf_GltfRootElement_Samplers section. + Standard_EXPORT virtual void writeSamplers (const RWGltf_GltfMaterialMap& theMaterialMap); + + //! Write RWGltf_GltfRootElement_Scene section. + //! @param theDefSceneId [in] index of default scene (0) + Standard_EXPORT virtual void writeScene (const Standard_Integer theDefSceneId); + + //! Write RWGltf_GltfRootElement_Scenes section. + //! @param theSceneRootNodeInds [in] sequence of scene nodes pointing to root shapes + Standard_EXPORT virtual void writeScenes (const NCollection_Sequence& theSceneRootNodeInds); + + //! Write RWGltf_GltfRootElement_Skins section (reserved). + Standard_EXPORT virtual void writeSkins(); + + //! Write RWGltf_GltfRootElement_Textures section. + //! @param theSceneNodeMap [in] ordered map of scene nodes + //! @param theMaterialMap [out] map of materials, filled with textures + Standard_EXPORT virtual void writeTextures (const RWGltf_GltfSceneNodeMap& theSceneNodeMap, + RWGltf_GltfMaterialMap& theMaterialMap); + +protected: + + TCollection_AsciiString myFile; //!< output glTF file + TCollection_AsciiString myBinFileNameFull; //!< output file with binary data (full path) + TCollection_AsciiString myBinFileNameShort; //!< output file with binary data (short path) + RWGltf_WriterTrsfFormat myTrsfFormat; //!< transformation format to write into glTF file + Standard_Boolean myIsBinary; //!< flag to write into binary glTF format (.glb) + Standard_Boolean myIsForcedUVExport; //!< export UV coordinates even if there are no mapped texture + RWMesh_CoordinateSystemConverter myCSTrsf; //!< transformation from OCCT to glTF coordinate system + XCAFPrs_Style myDefaultStyle; //!< default material definition to be used for nodes with only color defined + + opencascade::std::shared_ptr + myWriter; //!< JSON writer + RWGltf_GltfBufferView myBuffViewPos; //!< current buffer view with nodes positions + RWGltf_GltfBufferView myBuffViewNorm; //!< current buffer view with nodes normals + RWGltf_GltfBufferView myBuffViewTextCoord; //!< current buffer view with nodes UV coordinates + RWGltf_GltfBufferView myBuffViewInd; //!< current buffer view with triangulation indexes + NCollection_DataMap myBinDataMap; //!< map for TopoDS_Face to glTF face (merging duplicates) + int64_t myBinDataLen64; //!< length of binary file + +}; + +#endif // _RWGltf_CafWriter_HeaderFiler diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfAlphaMode.hxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfAlphaMode.hxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfAlphaMode.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfAlphaMode.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,46 @@ +// Author: Kirill Gavrilov +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWGltf_GltfAlphaMode_HeaderFile +#define _RWGltf_GltfAlphaMode_HeaderFile + +#include + +//! Low-level glTF enumeration defining Alpha Mode. +enum RWGltf_GltfAlphaMode +{ + RWGltf_GltfAlphaMode_Opaque, //!< alpha value is ignored and the rendered output is fully opaque + RWGltf_GltfAlphaMode_Mask, //!< rendered output is either fully opaque or fully transparent depending on the alpha value and the specified alpha cutoff value + RWGltf_GltfAlphaMode_Blend, //!< alpha value is used to composite the source and destination areas +}; + +//! Parse RWGltf_GltfAlphaMode from string. +inline RWGltf_GltfAlphaMode RWGltf_GltfParseAlphaMode (const char* theType) +{ + if (IsEqual ("OPAQUE", theType)) + { + return RWGltf_GltfAlphaMode_Opaque; + } + else if (IsEqual ("MASK", theType)) + { + return RWGltf_GltfAlphaMode_Mask; + } + else if (IsEqual ("BLEND", theType)) + { + return RWGltf_GltfAlphaMode_Blend; + } + return RWGltf_GltfAlphaMode_Opaque; +} + +#endif // _RWGltf_GltfAlphaMode_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfJsonParser.cxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfJsonParser.cxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfJsonParser.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfJsonParser.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include #include #include @@ -37,6 +37,20 @@ //! Material extension. const char THE_KHR_materials_common[] = "KHR_materials_common"; const char THE_KHR_binary_glTF[] = "KHR_binary_glTF"; + + //! Data buffer referring to a portion of another buffer. + class RWGltf_SubBuffer : public NCollection_Buffer + { + public: + RWGltf_SubBuffer (const Handle(NCollection_Buffer)& theBase, + Standard_Size theOffset, + Standard_Size theLength) + : NCollection_Buffer (Handle(NCollection_BaseAllocator)(), theLength, theBase->ChangeData() + theOffset), + myBaseBuffer (theBase) {} + + private: + Handle(NCollection_Buffer) myBaseBuffer; + }; } //! Find member of the object in a safe way. @@ -127,8 +141,7 @@ const TCollection_AsciiString aKey (aChildIter->name.GetString()); if (!myChildren.Bind (aKey, &aChildIter->value)) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Invalid glTF syntax - key '") - + aKey + "' is already defined in '" + theRootName + "'.", Message_Warning); + Message::SendWarning (TCollection_AsciiString ("Invalid glTF syntax - key '") + aKey + "' is already defined in '" + theRootName + "'."); } } } @@ -155,7 +168,7 @@ void RWGltf_GltfJsonParser::reportGltfSyntaxProblem (const TCollection_AsciiString& theMsg, Message_Gravity theGravity) { - Message::DefaultMessenger()->Send (myErrorPrefix + theMsg, theGravity); + Message::Send (myErrorPrefix + theMsg, theGravity); } // ======================================================================= @@ -166,6 +179,7 @@ : myRootShapes(&theRootShapes), myAttribMap (NULL), myExternalFiles (NULL), + myMetadata (NULL), myBinBodyOffset (0), myBinBodyLen (0), myIsBinary (false), @@ -308,6 +322,7 @@ } aMat->Id = aMatId.GetString(); myMaterialsCommon.Bind (aMat->Id, aMat); + gltfBindMaterial (Handle(RWGltf_MaterialMetallicRoughness)(), aMat); } } else if (aMatList->IsArray()) @@ -342,11 +357,99 @@ aMatCommon->Id = TCollection_AsciiString ("mat_") + aMatIndex; myMaterialsCommon.Bind (TCollection_AsciiString (aMatIndex), aMatCommon); } + + gltfBindMaterial (aMatPbr, aMatCommon); } } } // ======================================================================= +// function : gltfBindMaterial +// purpose : +// ======================================================================= +void RWGltf_GltfJsonParser::gltfBindMaterial (const Handle(RWGltf_MaterialMetallicRoughness)& theMatPbr, + const Handle(RWGltf_MaterialCommon)& theMatCommon) +{ + if (theMatPbr.IsNull() + && theMatCommon.IsNull()) + { + return; + } + + Handle(XCAFDoc_VisMaterial) aMat = new XCAFDoc_VisMaterial(); + if (!theMatCommon.IsNull()) + { + XCAFDoc_VisMaterialCommon aMatXde; + aMatXde.IsDefined = true; + aMatXde.AmbientColor = theMatCommon->AmbientColor; + aMatXde.DiffuseColor = theMatCommon->DiffuseColor; + aMatXde.SpecularColor = theMatCommon->SpecularColor; + aMatXde.EmissiveColor = theMatCommon->EmissiveColor; + aMatXde.Shininess = theMatCommon->Shininess; + aMatXde.Transparency = theMatCommon->Transparency; + aMatXde.DiffuseTexture = theMatCommon->DiffuseTexture; + if (aMatXde.DiffuseTexture.IsNull() + && !theMatCommon->AmbientTexture.IsNull()) + { + aMatXde.DiffuseTexture = theMatCommon->AmbientTexture; + } + aMat->SetCommonMaterial (aMatXde); + if (!theMatCommon->Name.IsEmpty()) + { + aMat->SetRawName (new TCollection_HAsciiString (theMatCommon->Name)); + } + } + if (!theMatPbr.IsNull()) + { + XCAFDoc_VisMaterialPBR aMatXde; + aMatXde.IsDefined = true; + aMatXde.MetallicRoughnessTexture = theMatPbr->MetallicRoughnessTexture; + aMatXde.BaseColorTexture = theMatPbr->BaseColorTexture; + aMatXde.EmissiveTexture = theMatPbr->EmissiveTexture; + aMatXde.OcclusionTexture = theMatPbr->OcclusionTexture; + aMatXde.NormalTexture = theMatPbr->NormalTexture; + aMatXde.BaseColor = theMatPbr->BaseColor; + aMatXde.EmissiveFactor = theMatPbr->EmissiveFactor; + aMatXde.Metallic = theMatPbr->Metallic; + aMatXde.Roughness = theMatPbr->Roughness; + aMat->SetPbrMaterial (aMatXde); + + Graphic3d_AlphaMode anAlphaMode = Graphic3d_AlphaMode_BlendAuto; + switch (theMatPbr->AlphaMode) + { + case RWGltf_GltfAlphaMode_Opaque: + { + anAlphaMode = Graphic3d_AlphaMode_Opaque; + if (aMatXde.BaseColor.Alpha() < 1.0f) + { + Message::SendWarning ("glTF reader - material with non-zero Transparency specifies Opaque AlphaMode"); + } + break; + } + case RWGltf_GltfAlphaMode_Mask: + { + anAlphaMode = Graphic3d_AlphaMode_Mask; + break; + } + case RWGltf_GltfAlphaMode_Blend: + { + anAlphaMode = Graphic3d_AlphaMode_Blend; + break; + } + } + aMat->SetAlphaMode (anAlphaMode, theMatPbr->AlphaCutOff); + aMat->SetDoubleSided (theMatPbr->IsDoubleSided); + + if (!theMatPbr->Name.IsEmpty()) + { + aMat->SetRawName (new TCollection_HAsciiString (theMatPbr->Name)); + } + } + + myMaterials.Bind (!theMatPbr.IsNull() ? theMatPbr->Id : theMatCommon->Id, aMat); +} + +// ======================================================================= // function : gltfParseStdMaterial // purpose : // ======================================================================= @@ -385,7 +488,7 @@ else if (gltfReadVec4 (anAmb, anAmbVal) && validateColor4 (anAmb)) { - theMat->AmbientColor = Quantity_Color (anAmb.r(), anAmb.g(), anAmb.b(), Quantity_TOC_RGB); + theMat->AmbientColor = Quantity_Color (anAmb.r(), anAmb.g(), anAmb.b(), Quantity_TOC_sRGB); } if (aDiffVal != NULL @@ -396,14 +499,14 @@ else if (gltfReadVec4 (aDiff, aDiffVal) && validateColor4 (aDiff)) { - theMat->DiffuseColor = Quantity_Color (aDiff.r(), aDiff.g(), aDiff.b(), Quantity_TOC_RGB); + theMat->DiffuseColor = Quantity_Color (aDiff.r(), aDiff.g(), aDiff.b(), Quantity_TOC_sRGB); theMat->Transparency = float(1.0 - aDiff.a()); } if (gltfReadVec4 (anEmi, anEmiVal) && validateColor4 (anEmi)) { - theMat->EmissiveColor = Quantity_Color (anEmi.r(), anEmi.g(), anEmi.b(), Quantity_TOC_RGB); + theMat->EmissiveColor = Quantity_Color (anEmi.r(), anEmi.g(), anEmi.b(), Quantity_TOC_sRGB); } if (aSpecVal != NULL @@ -414,7 +517,7 @@ if (gltfReadVec4 (aSpec, aSpecVal) && validateColor4 (aSpec)) { - theMat->SpecularColor = Quantity_Color (aSpec.r(), aSpec.g(), aSpec.b(), Quantity_TOC_RGB); + theMat->SpecularColor = Quantity_Color (aSpec.r(), aSpec.g(), aSpec.b(), Quantity_TOC_sRGB); } if (aShinVal != NULL @@ -450,6 +553,10 @@ const RWGltf_JsonValue* anEmissFactorVal = findObjectMember (theMatNode, "emissiveFactor"); const RWGltf_JsonValue* anEmissTexVal = findObjectMember (theMatNode, "emissiveTexture"); const RWGltf_JsonValue* anOcclusionTexVal = findObjectMember (theMatNode, "occlusionTexture"); + const RWGltf_JsonValue* aDoubleSidedVal = findObjectMember (theMatNode, "doubleSided"); + const RWGltf_JsonValue* anAlphaModeVal = findObjectMember (theMatNode, "alphaMode"); + const RWGltf_JsonValue* anAlphaCutoffVal = findObjectMember (theMatNode, "alphaCutoff"); + // TODO ADOBE_materials_thin_transparency extension can be used to read IOR (Index of Refraction for transparent materials) if (aMetalRoughVal == NULL) { return false; @@ -462,6 +569,22 @@ const RWGltf_JsonValue* aRoughnessFactorVal = findObjectMember (*aMetalRoughVal, "roughnessFactor"); const RWGltf_JsonValue* aMetalRoughTexVal = findObjectMember (*aMetalRoughVal, "metallicRoughnessTexture"); + if (aDoubleSidedVal != NULL + && aDoubleSidedVal->IsBool()) + { + theMat->IsDoubleSided = aDoubleSidedVal->GetBool(); + } + if (anAlphaCutoffVal != NULL + && anAlphaCutoffVal->IsNumber()) + { + theMat->AlphaCutOff = (float )anAlphaCutoffVal->GetDouble(); + } + if (anAlphaModeVal != NULL + && anAlphaModeVal->IsString()) + { + theMat->AlphaMode = RWGltf_GltfParseAlphaMode (anAlphaModeVal->GetString()); + } + if (aBaseColorTexVal != NULL && aBaseColorTexVal->IsObject()) { @@ -627,15 +750,11 @@ if (aBinVal != NULL) { - //const RWGltf_JsonValue* aMimeTypeVal = findObjectMember (*aBinVal, "mimeType"); - //const RWGltf_JsonValue* aWidthVal = findObjectMember (*aBinVal, "width"); - //const RWGltf_JsonValue* aHeightVal = findObjectMember (*aBinVal, "height"); if (aBufferViewName == NULL) { reportGltfWarning ("Invalid texture node '" + aTextureId + "' points to invalid data source."); return false; } - const RWGltf_JsonValue* aBufferView = myGltfRoots[RWGltf_GltfRootElement_BufferViews].FindChild (*aBufferViewName); if (aBufferView == NULL || !aBufferView->IsObject()) @@ -643,47 +762,33 @@ reportGltfWarning ("Invalid texture node '" + aTextureId + "' points to invalid buffer view '" + getKeyString (*aBufferViewName) + "'."); return false; } + return gltfParseTexturInGlbBuffer (theTexture, *aBinVal, getKeyString (*aBufferViewName), *aBufferView); + } + } - const RWGltf_JsonValue* aBufferName = findObjectMember (*aBufferView, "buffer"); - const RWGltf_JsonValue* aByteLength = findObjectMember (*aBufferView, "byteLength"); - const RWGltf_JsonValue* aByteOffset = findObjectMember (*aBufferView, "byteOffset"); - if (aBufferName != NULL - && aBufferName->IsString() - && !IsEqual (aBufferName->GetString(), "binary_glTF")) - { - reportGltfError ("BufferView '" + getKeyString (*aBufferViewName) + "' does not define binary_glTF buffer."); - return false; - } - - RWGltf_GltfBufferView aBuffView; - aBuffView.ByteOffset = aByteOffset != NULL && aByteOffset->IsNumber() - ? (int64_t )aByteOffset->GetDouble() - : 0; - aBuffView.ByteLength = aByteLength != NULL && aByteLength->IsNumber() - ? (int64_t )aByteLength->GetDouble() - : 0; - if (aBuffView.ByteLength < 0) - { - reportGltfError ("BufferView '" + getKeyString (*aBufferViewName) + "' defines invalid byteLength."); - return false; - } - else if (aBuffView.ByteOffset < 0) - { - reportGltfError ("BufferView '" + getKeyString (*aBufferViewName) + "' defines invalid byteOffset."); - return false; - } - + const RWGltf_JsonValue* anUriVal = findObjectMember (*anImgNode, "uri"); + if (anUriVal == NULL) + { + const RWGltf_JsonValue* aBufferViewName = findObjectMember (*anImgNode, "bufferView"); + if (aBufferViewName == NULL) + { + reportGltfWarning ("Invalid texture node '" + aTextureId + "' points to invalid data source."); + return false; + } - const int64_t anOffset = myBinBodyOffset + aBuffView.ByteOffset; - theTexture = new Image_Texture (myFilePath, anOffset, aBuffView.ByteLength); - return true; + const RWGltf_JsonValue* aBufferView = myGltfRoots[RWGltf_GltfRootElement_BufferViews].FindChild (*aBufferViewName); + if (aBufferView == NULL + || !aBufferView->IsObject()) + { + reportGltfWarning ("Invalid texture node '" + aTextureId + "' points to invalid buffer view '" + getKeyString (*aBufferViewName) + "'."); + return false; } + return gltfParseTextureInBufferView (theTexture, getKeyString (*aSrcVal), getKeyString (*aBufferViewName), *aBufferView); } - const RWGltf_JsonValue* anUriVal = findObjectMember (*anImgNode, "uri"); - if (anUriVal == NULL - || !anUriVal->IsString()) + if (!anUriVal->IsString()) { + reportGltfWarning ("Invalid texture node '" + aTextureId + "' points to invalid data source."); return false; } @@ -705,7 +810,7 @@ return true; } } - Message::DefaultMessenger()->Send ("glTF reader - embedded image has been skipped", Message_Warning); + Message::SendWarning ("glTF reader - embedded image has been skipped"); return false; } @@ -719,10 +824,154 @@ } // ======================================================================= +// function : gltfParseTexturInGlbBuffer +// purpose : +// ======================================================================= +bool RWGltf_GltfJsonParser::gltfParseTexturInGlbBuffer (Handle(Image_Texture)& theTexture, + const RWGltf_JsonValue& theBinVal, + const TCollection_AsciiString& theBufferViewId, + const RWGltf_JsonValue& theBufferView) +{ + const RWGltf_JsonValue* aMimeTypeVal = findObjectMember (theBinVal, "mimeType"); + //const RWGltf_JsonValue* aWidthVal = findObjectMember (theBinVal, "width"); + //const RWGltf_JsonValue* aHeightVal = findObjectMember (theBinVal, "height"); + (void )aMimeTypeVal; + + const RWGltf_JsonValue* aBufferName = findObjectMember (theBufferView, "buffer"); + const RWGltf_JsonValue* aByteLength = findObjectMember (theBufferView, "byteLength"); + const RWGltf_JsonValue* aByteOffset = findObjectMember (theBufferView, "byteOffset"); + if (aBufferName != NULL + && aBufferName->IsString() + && !IsEqual (aBufferName->GetString(), "binary_glTF")) + { + reportGltfError ("BufferView '" + theBufferViewId + "' does not define binary_glTF buffer."); + return false; + } + + RWGltf_GltfBufferView aBuffView; + aBuffView.ByteOffset = aByteOffset != NULL && aByteOffset->IsNumber() + ? (int64_t )aByteOffset->GetDouble() + : 0; + aBuffView.ByteLength = aByteLength != NULL && aByteLength->IsNumber() + ? (int64_t )aByteLength->GetDouble() + : 0; + if (aBuffView.ByteLength <= 0) + { + reportGltfError ("BufferView '" + theBufferViewId + "' defines invalid byteLength."); + return false; + } + else if (aBuffView.ByteOffset < 0) + { + reportGltfError ("BufferView '" + theBufferViewId + "' defines invalid byteOffset."); + return false; + } + + const int64_t anOffset = myBinBodyOffset + aBuffView.ByteOffset; + theTexture = new Image_Texture (myFilePath, anOffset, aBuffView.ByteLength); + return true; +} + +// ======================================================================= +// function : gltfParseTextureInBufferView +// purpose : +// ======================================================================= +bool RWGltf_GltfJsonParser::gltfParseTextureInBufferView (Handle(Image_Texture)& theTexture, + const TCollection_AsciiString& theSourceId, + const TCollection_AsciiString& theBufferViewId, + const RWGltf_JsonValue& theBufferView) +{ + const RWGltf_JsonValue* aBufferName = findObjectMember (theBufferView, "buffer"); + const RWGltf_JsonValue* aByteLength = findObjectMember (theBufferView, "byteLength"); + const RWGltf_JsonValue* aByteOffset = findObjectMember (theBufferView, "byteOffset"); + if (aBufferName == NULL) + { + reportGltfError ("BufferView '" + theBufferViewId + "' does not define buffer."); + return false; + } + + const TCollection_AsciiString aBufferId = getKeyString (*aBufferName); + const RWGltf_JsonValue* aBuffer = myGltfRoots[RWGltf_GltfRootElement_Buffers].FindChild (*aBufferName); + if (aBuffer == NULL + || !aBuffer->IsObject()) + { + reportGltfError ("BufferView '" + theBufferViewId + "' refers to non-existing buffer."); + return false; + } + + RWGltf_GltfBufferView aBuffView; + aBuffView.ByteOffset = aByteOffset != NULL && aByteOffset->IsNumber() + ? (int64_t )aByteOffset->GetDouble() + : 0; + aBuffView.ByteLength = aByteLength != NULL && aByteLength->IsNumber() + ? (int64_t )aByteLength->GetDouble() + : 0; + if (aBuffView.ByteLength <= 0) + { + reportGltfError ("BufferView '" + theBufferViewId + "' defines invalid byteLength."); + return false; + } + else if (aBuffView.ByteOffset < 0) + { + reportGltfError ("BufferView '" + theBufferViewId + "' defines invalid byteOffset."); + return false; + } + + const RWGltf_JsonValue* anUriVal = findObjectMember (*aBuffer, "uri"); + if (anUriVal == NULL + || !anUriVal->IsString()) + { + reportGltfError ("Buffer '" + aBufferId + "' does not define uri."); + return false; + } + + const char* anUriData = anUriVal->GetString(); + if (::strncmp (anUriData, "data:application/octet-stream;base64,", 37) == 0) + { + Handle(NCollection_Buffer) aBaseBuffer; + if (!myDecodedBuffers.Find (aBufferId, aBaseBuffer)) + { + aBaseBuffer = FSD_Base64Decoder::Decode ((const Standard_Byte* )anUriData + 37, anUriVal->GetStringLength() - 37); + myDecodedBuffers.Bind (aBufferId, aBaseBuffer); + } + + Handle(RWGltf_SubBuffer) aSubBuffer = new RWGltf_SubBuffer (aBaseBuffer, (Standard_Size )aBuffView.ByteOffset, (Standard_Size )aBuffView.ByteLength); + theTexture = new Image_Texture (aSubBuffer, myFilePath + "@" + theSourceId); + return true; + } + + const TCollection_AsciiString anUri (anUriData); + if (anUri.IsEmpty()) + { + reportGltfError ("Buffer '" + aBufferId + "' does not define uri."); + return false; + } + + const TCollection_AsciiString aPath = myFolder + anUri; + bool isFileExist = false; + if (!myProbedFiles.Find (aPath, isFileExist)) + { + isFileExist = OSD_File (aPath).Exists(); + myProbedFiles.Bind (aPath, isFileExist); + } + if (!isFileExist) + { + reportGltfError ("Buffer '" + aBufferId + "' refers to non-existing file '" + anUri + "'."); + return false; + } + + theTexture = new Image_Texture (aPath, aBuffView.ByteOffset, aBuffView.ByteLength); + if (myExternalFiles != NULL) + { + myExternalFiles->Add (aPath); + } + return true; +} + +// ======================================================================= // function : gltfParseScene // purpose : // ======================================================================= -bool RWGltf_GltfJsonParser::gltfParseScene (const Handle(Message_ProgressIndicator)& theProgress) +bool RWGltf_GltfJsonParser::gltfParseScene (const Message_ProgressRange& theProgress) { // search default scene const RWGltf_JsonValue* aDefScene = myGltfRoots[RWGltf_GltfRootElement_Scenes].FindChild (*myGltfRoots[RWGltf_GltfRootElement_Scene].Root()); @@ -749,7 +998,7 @@ // ======================================================================= bool RWGltf_GltfJsonParser::gltfParseSceneNodes (TopTools_SequenceOfShape& theShapeSeq, const RWGltf_JsonValue& theSceneNodes, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { if (!theSceneNodes.IsArray()) { @@ -757,9 +1006,9 @@ return false; } - Message_ProgressSentry aPSentry (theProgress, "Reading scene nodes", 0, theSceneNodes.Size(), 1); + Message_ProgressScope aPS (theProgress, "Reading scene nodes", theSceneNodes.Size()); for (rapidjson::Value::ConstValueIterator aSceneNodeIter = theSceneNodes.Begin(); - aSceneNodeIter != theSceneNodes.End() && aPSentry.More(); ++aSceneNodeIter, aPSentry.Next()) + aSceneNodeIter != theSceneNodes.End() && aPS.More(); ++aSceneNodeIter) { const RWGltf_JsonValue* aSceneNode = myGltfRoots[RWGltf_GltfRootElement_Nodes].FindChild (*aSceneNodeIter); if (aSceneNode == NULL) @@ -769,7 +1018,7 @@ } TopoDS_Shape aNodeShape; - if (!gltfParseSceneNode (aNodeShape, getKeyString (*aSceneNodeIter), *aSceneNode, theProgress)) + if (!gltfParseSceneNode (aNodeShape, getKeyString (*aSceneNodeIter), *aSceneNode, aPS.Next())) { return false; } @@ -796,7 +1045,7 @@ bool RWGltf_GltfJsonParser::gltfParseSceneNode (TopoDS_Shape& theNodeShape, const TCollection_AsciiString& theSceneNodeId, const RWGltf_JsonValue& theSceneNode, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { const RWGltf_JsonValue* aName = findObjectMember (theSceneNode, "name"); //const RWGltf_JsonValue* aJointName = findObjectMember (theSceneNode, "jointName"); @@ -956,9 +1205,8 @@ aMat4.GetValue (1, 0), aMat4.GetValue (1, 1), aMat4.GetValue (1, 2), aMat4.GetValue (1, 3), aMat4.GetValue (2, 0), aMat4.GetValue (2, 1), aMat4.GetValue (2, 2), aMat4.GetValue (2, 3)); - Message::DefaultMessenger()->Send (TCollection_AsciiString ("glTF reader, scene node '") - + theSceneNodeId + "' defines unsupported scaling " - + aScaleVec.x() + " " + aScaleVec.y() + " " + aScaleVec.z(), Message_Warning); + Message::SendWarning (TCollection_AsciiString ("glTF reader, scene node '") + + theSceneNodeId + "' defines unsupported scaling " + aScaleVec.x() + " " + aScaleVec.y() + " " + aScaleVec.z()); } else if (Abs (aScaleVec.x() - 1.0) > Precision::Confusion()) { @@ -995,9 +1243,8 @@ && aMeshes_1->IsArray()) { // glTF 1.0 - Message_ProgressSentry aPSentry (theProgress, "Reading scene meshes", 0, aMeshes_1->Size(), 1); for (rapidjson::Value::ConstValueIterator aMeshIter = aMeshes_1->Begin(); - aMeshIter != aMeshes_1->End() && aPSentry.More(); ++aMeshIter, aPSentry.Next()) + aMeshIter != aMeshes_1->End(); ++aMeshIter) { const RWGltf_JsonValue* aMesh = myGltfRoots[RWGltf_GltfRootElement_Meshes].FindChild (*aMeshIter); if (aMesh == NULL) @@ -1009,7 +1256,7 @@ } TopoDS_Shape aMeshShape; - if (!gltfParseMesh (aMeshShape, getKeyString (*aMeshIter), *aMesh, theProgress)) + if (!gltfParseMesh (aMeshShape, getKeyString (*aMeshIter), *aMesh)) { theNodeShape = aNodeShape; bindNodeShape (theNodeShape, aNodeLoc, theSceneNodeId, aName); @@ -1035,7 +1282,7 @@ } TopoDS_Shape aMeshShape; - if (!gltfParseMesh (aMeshShape, getKeyString (*aMesh_2), *aMesh, theProgress)) + if (!gltfParseMesh (aMeshShape, getKeyString (*aMesh_2), *aMesh)) { theNodeShape = aNodeShape; bindNodeShape (theNodeShape, aNodeLoc, theSceneNodeId, aName); @@ -1066,8 +1313,7 @@ // ======================================================================= bool RWGltf_GltfJsonParser::gltfParseMesh (TopoDS_Shape& theMeshShape, const TCollection_AsciiString& theMeshId, - const RWGltf_JsonValue& theMesh, - const Handle(Message_ProgressIndicator)& theProgress) + const RWGltf_JsonValue& theMesh) { const RWGltf_JsonValue* aName = findObjectMember (theMesh, "name"); const RWGltf_JsonValue* aPrims = findObjectMember (theMesh, "primitives"); @@ -1096,7 +1342,7 @@ } Handle(RWGltf_GltfLatePrimitiveArray) aMeshData = new RWGltf_GltfLatePrimitiveArray (theMeshId, aUserName); - if (!gltfParsePrimArray (aMeshData, theMeshId, *aPrimArrIter, theProgress)) + if (!gltfParsePrimArray (aMeshData, theMeshId, *aPrimArrIter)) { return false; } @@ -1116,7 +1362,14 @@ { RWMesh_NodeAttributes aShapeAttribs; aShapeAttribs.RawName = aUserName; - aShapeAttribs.Style.SetColorSurf (aMeshData->BaseColor()); + + // assign material and not color + //aShapeAttribs.Style.SetColorSurf (aMeshData->BaseColor()); + + Handle(XCAFDoc_VisMaterial) aMat; + myMaterials.Find (!aMeshData->MaterialPbr().IsNull() ? aMeshData->MaterialPbr()->Id : aMeshData->MaterialCommon()->Id, aMat); + aShapeAttribs.Style.SetMaterial (aMat); + myAttribMap->Bind (aFace, aShapeAttribs); } myFaceList.Append (aFace); @@ -1142,8 +1395,7 @@ // ======================================================================= bool RWGltf_GltfJsonParser::gltfParsePrimArray (const Handle(RWGltf_GltfLatePrimitiveArray)& theMeshData, const TCollection_AsciiString& theMeshId, - const RWGltf_JsonValue& thePrimArray, - const Handle(Message_ProgressIndicator)& /*theProgress*/) + const RWGltf_JsonValue& thePrimArray) { const RWGltf_JsonValue* anAttribs = findObjectMember (thePrimArray, "attributes"); const RWGltf_JsonValue* anIndices = findObjectMember (thePrimArray, "indices"); @@ -1172,8 +1424,7 @@ } if (aMode != RWGltf_GltfPrimitiveMode_Triangles) { - Message::DefaultMessenger()->Send (TCollection_AsciiString() + "Primitive array within Mesh '" - + theMeshId + "' skipped due to unsupported mode.", Message_Warning); + Message::SendWarning (TCollection_AsciiString() + "Primitive array within Mesh '" + theMeshId + "' skipped due to unsupported mode"); return true; } theMeshData->SetPrimitiveMode (aMode); @@ -1266,7 +1517,7 @@ const RWGltf_JsonValue* aTypeStr = findObjectMember (theAccessor, "type"); const RWGltf_JsonValue* aBufferViewName = findObjectMember (theAccessor, "bufferView"); const RWGltf_JsonValue* aByteOffset = findObjectMember (theAccessor, "byteOffset"); - const RWGltf_JsonValue* aByteStride = findObjectMember (theAccessor, "byteStride"); + const RWGltf_JsonValue* aByteStride = findObjectMember (theAccessor, "byteStride"); // byteStride was part of bufferView in glTF 1.0 const RWGltf_JsonValue* aCompType = findObjectMember (theAccessor, "componentType"); const RWGltf_JsonValue* aCount = findObjectMember (theAccessor, "count"); if (aTypeStr == NULL @@ -1408,6 +1659,7 @@ const RWGltf_JsonValue* aBufferName = findObjectMember (theBufferView, "buffer"); const RWGltf_JsonValue* aByteLength = findObjectMember (theBufferView, "byteLength"); const RWGltf_JsonValue* aByteOffset = findObjectMember (theBufferView, "byteOffset"); + const RWGltf_JsonValue* aByteStride = findObjectMember (theBufferView, "byteStride"); // byteStride is part of bufferView since glTF 2.0 const RWGltf_JsonValue* aTarget = findObjectMember (theBufferView, "target"); if (aBufferName == NULL) { @@ -1421,6 +1673,9 @@ aBuffView.ByteLength = aByteLength != NULL && aByteLength->IsNumber() ? (int64_t )aByteLength->GetDouble() : 0; + aBuffView.ByteStride = aByteStride != NULL && aByteStride->IsInt() + ? aByteStride->GetInt() + : 0; if (aTarget != NULL && aTarget->IsInt()) { aBuffView.Target = (RWGltf_GltfBufferViewTarget )aTarget->GetInt(); @@ -1432,7 +1687,7 @@ } } - if (aBuffView.ByteLength < 0) + if (aBuffView.ByteLength <= 0) { reportGltfError ("BufferView '" + theName + "' defines invalid byteLength."); return false; @@ -1442,6 +1697,12 @@ reportGltfError ("BufferView '" + theName + "' defines invalid byteOffset."); return false; } + else if (aBuffView.ByteStride < 0 + || aBuffView.ByteStride > 255) + { + reportGltfError ("BufferView '" + theName + "' defines invalid byteStride."); + return false; + } const RWGltf_JsonValue* aBuffer = myGltfRoots[RWGltf_GltfRootElement_Buffers].FindChild (*aBufferName); if (aBuffer == NULL @@ -1470,6 +1731,7 @@ const RWGltf_JsonValue* anUriVal = findObjectMember (theBuffer, "uri"); int64_t anOffset = theView.ByteOffset + theAccessor.ByteOffset; + const int32_t aByteStride = theAccessor.ByteStride != 0 ? theView.ByteStride : theView.ByteStride; bool isBinary = false; if (myIsBinary) { @@ -1482,6 +1744,7 @@ RWGltf_GltfPrimArrayData& aData = theMeshData->AddPrimArrayData (theType); aData.Accessor = theAccessor; + aData.Accessor.ByteStride = aByteStride; aData.StreamOffset = anOffset; aData.StreamUri = myFilePath; return true; @@ -1499,6 +1762,7 @@ { RWGltf_GltfPrimArrayData& aData = theMeshData->AddPrimArrayData (theType); aData.Accessor = theAccessor; + aData.Accessor.ByteStride = aByteStride; aData.StreamOffset = anOffset; if (!myDecodedBuffers.Find (theName, aData.StreamData)) { @@ -1532,6 +1796,7 @@ RWGltf_GltfPrimArrayData& aData = theMeshData->AddPrimArrayData (theType); aData.Accessor = theAccessor; + aData.Accessor.ByteStride = aByteStride; aData.StreamOffset = anOffset; aData.StreamUri = myFolder + anUri; if (myExternalFiles != NULL) @@ -1559,7 +1824,14 @@ if (!theLoc.IsIdentity()) { - theShape.Location (theLoc); + if (!theShape.Location().IsIdentity()) + { + theShape.Location (theLoc * theShape.Location()); + } + else + { + theShape.Location (theLoc); + } } TCollection_AsciiString aUserName; @@ -1586,7 +1858,12 @@ { if (aLateData->HasStyle()) { - aShapeAttribs.Style.SetColorSurf (aLateData->BaseColor()); + // assign material and not color + //aShapeAttribs.Style.SetColorSurf (aLateData->BaseColor()); + + Handle(XCAFDoc_VisMaterial) aMat; + myMaterials.Find (!aLateData->MaterialPbr().IsNull() ? aLateData->MaterialPbr()->Id : aLateData->MaterialCommon()->Id, aMat); + aShapeAttribs.Style.SetMaterial (aMat); } if (aShapeAttribs.Name.IsEmpty() && myUseMeshNameAsFallback) @@ -1636,9 +1913,9 @@ // function : Parse // purpose : // ======================================================================= -bool RWGltf_GltfJsonParser::Parse (const Handle(Message_ProgressIndicator)& theProgress) +bool RWGltf_GltfJsonParser::Parse (const Message_ProgressRange& theProgress) { - Message_ProgressSentry aPSentry (theProgress, "Reading Gltf", 0, 2, 1); + Message_ProgressScope aPS (theProgress, "Parsing glTF", 1); #ifdef HAVE_RAPIDJSON { if (!gltfParseRoots()) @@ -1648,19 +1925,18 @@ gltfParseAsset(); gltfParseMaterials(); - if (!gltfParseScene (theProgress)) + if (!gltfParseScene (aPS.Next())) { return false; } } - aPSentry.Next(); - if (!aPSentry.More()) + if (!aPS.More()) { return false; } return true; #else - Message::DefaultMessenger()->Send ("Error: glTF reader is unavailable - OCCT has been built without RapidJSON support.", Message_Fail); + Message::SendFail ("Error: glTF reader is unavailable - OCCT has been built without RapidJSON support [HAVE_RAPIDJSON undefined]"); return false; #endif } diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfJsonParser.pxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfJsonParser.pxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfJsonParser.pxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfJsonParser.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -112,7 +113,7 @@ void SetMeshNameAsFallback (bool theToFallback) { myUseMeshNameAsFallback = theToFallback; } //! Parse glTF document. - Standard_EXPORT bool Parse (const Handle(Message_ProgressIndicator)& theProgress); + Standard_EXPORT bool Parse (const Message_ProgressRange& theProgress); //! Return face list for loading triangulation. NCollection_Vector& FaceList() { return myFaceList; } @@ -124,7 +125,7 @@ Standard_EXPORT bool gltfParseRoots(); //! Parse default scene. - Standard_EXPORT bool gltfParseScene (const Handle(Message_ProgressIndicator)& theProgress); + Standard_EXPORT bool gltfParseScene (const Message_ProgressRange& theProgress); //! Parse document metadata. Standard_EXPORT void gltfParseAsset(); @@ -150,30 +151,44 @@ Standard_EXPORT bool gltfParseTexture (Handle(Image_Texture)& theTexture, const RWGltf_JsonValue* theTextureId); + //! Parse texture definition in binary buffer of GLB file. + Standard_EXPORT bool gltfParseTexturInGlbBuffer (Handle(Image_Texture)& theTexture, + const RWGltf_JsonValue& theBinVal, + const TCollection_AsciiString& theBufferViewId, + const RWGltf_JsonValue& theBufferViewName); + + //! Parse texture definition in binary buffer of glTF file. + Standard_EXPORT bool gltfParseTextureInBufferView (Handle(Image_Texture)& theTexture, + const TCollection_AsciiString& theSourceId, + const TCollection_AsciiString& theBufferViewhId, + const RWGltf_JsonValue& theBufferView); + + //! Bind material definition to the map. + Standard_EXPORT void gltfBindMaterial (const Handle(RWGltf_MaterialMetallicRoughness)& theMatPbr, + const Handle(RWGltf_MaterialCommon)& theMatCommon); + protected: //! Parse scene array of nodes recursively. Standard_EXPORT bool gltfParseSceneNodes (TopTools_SequenceOfShape& theShapeSeq, const RWGltf_JsonValue& theSceneNodes, - const Handle(Message_ProgressIndicator)& theProgress); + const Message_ProgressRange& theProgress); //! Parse scene node recursively. Standard_EXPORT bool gltfParseSceneNode (TopoDS_Shape& theNodeShape, const TCollection_AsciiString& theSceneNodeId, const RWGltf_JsonValue& theSceneNode, - const Handle(Message_ProgressIndicator)& theProgress); + const Message_ProgressRange& theProgress); //! Parse mesh element. Standard_EXPORT bool gltfParseMesh (TopoDS_Shape& theMeshShape, const TCollection_AsciiString& theMeshId, - const RWGltf_JsonValue& theMesh, - const Handle(Message_ProgressIndicator)& theProgress); + const RWGltf_JsonValue& theMesh); //! Parse primitive array. Standard_EXPORT bool gltfParsePrimArray (const Handle(RWGltf_GltfLatePrimitiveArray)& theMeshData, const TCollection_AsciiString& theMeshName, - const RWGltf_JsonValue& thePrimArray, - const Handle(Message_ProgressIndicator)& theProgress); + const RWGltf_JsonValue& thePrimArray); //! Parse accessor. Standard_EXPORT bool gltfParseAccessor (const Handle(RWGltf_GltfLatePrimitiveArray)& theMeshData, @@ -397,6 +412,7 @@ NCollection_DataMap myMaterialsPbr; NCollection_DataMap myMaterialsCommon; + NCollection_DataMap myMaterials; NCollection_DataMap myShapeMap[2]; NCollection_DataMap myProbedFiles; diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfMaterialMap.cxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfMaterialMap.cxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfMaterialMap.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfMaterialMap.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,461 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include + +#ifdef HAVE_RAPIDJSON + #include +#endif + +// ======================================================================= +// function : baseColorTexture +// purpose : +// ======================================================================= +const Handle(Image_Texture)& RWGltf_GltfMaterialMap::baseColorTexture (const Handle(XCAFDoc_VisMaterial)& theMat) +{ + static const Handle(Image_Texture) THE_NULL_TEXTURE; + if (theMat.IsNull()) + { + return THE_NULL_TEXTURE; + } + else if (theMat->HasPbrMaterial() + && !theMat->PbrMaterial().BaseColorTexture.IsNull()) + { + return theMat->PbrMaterial().BaseColorTexture; + } + else if (theMat->HasCommonMaterial() + && !theMat->CommonMaterial().DiffuseTexture.IsNull()) + { + return theMat->CommonMaterial().DiffuseTexture; + } + return THE_NULL_TEXTURE; +} + +// ======================================================================= +// function : RWGltf_GltfMaterialMap +// purpose : +// ======================================================================= +RWGltf_GltfMaterialMap::RWGltf_GltfMaterialMap (const TCollection_AsciiString& theFile, + const Standard_Integer theDefSamplerId) +: RWMesh_MaterialMap (theFile), + myWriter (NULL), + myDefSamplerId (theDefSamplerId), + myNbImages (0) +{ + myMatNameAsKey = false; +} + +// ======================================================================= +// function : ~RWGltf_GltfMaterialMap +// purpose : +// ======================================================================= +RWGltf_GltfMaterialMap::~RWGltf_GltfMaterialMap() +{ + // +} + +// ======================================================================= +// function : AddImages +// purpose : +// ======================================================================= +void RWGltf_GltfMaterialMap::AddImages (RWGltf_GltfOStreamWriter* theWriter, + const XCAFPrs_Style& theStyle, + Standard_Boolean& theIsStarted) +{ + if (theWriter == NULL + || theStyle.Material().IsNull() + || theStyle.Material()->IsEmpty()) + { + return; + } + + addImage (theWriter, baseColorTexture (theStyle.Material()), theIsStarted); + addImage (theWriter, theStyle.Material()->PbrMaterial().MetallicRoughnessTexture, theIsStarted); + addImage (theWriter, theStyle.Material()->PbrMaterial().NormalTexture, theIsStarted); + addImage (theWriter, theStyle.Material()->PbrMaterial().EmissiveTexture, theIsStarted); + addImage (theWriter, theStyle.Material()->PbrMaterial().OcclusionTexture, theIsStarted); +} + +// ======================================================================= +// function : addImage +// purpose : +// ======================================================================= +void RWGltf_GltfMaterialMap::addImage (RWGltf_GltfOStreamWriter* theWriter, + const Handle(Image_Texture)& theTexture, + Standard_Boolean& theIsStarted) +{ +#ifdef HAVE_RAPIDJSON + if (theTexture.IsNull() + || myImageMap.IsBound1 (theTexture) + || myImageFailMap.Contains (theTexture)) + { + return; + } + + TCollection_AsciiString aGltfImgKey = myNbImages; + ++myNbImages; + for (; myImageMap.IsBound2 (aGltfImgKey); ++myNbImages) + { + aGltfImgKey = myNbImages; + } + + TCollection_AsciiString aTextureUri; + if (!CopyTexture (aTextureUri, theTexture, aGltfImgKey)) + { + myImageFailMap.Add (theTexture); + return; + } + + myImageMap.Bind (theTexture, aGltfImgKey); + + if (!theIsStarted) + { + theWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Images)); + theWriter->StartArray(); + theIsStarted = true; + } + + theWriter->StartObject(); + { + theWriter->Key ("uri"); + theWriter->String (aTextureUri.ToCString()); + } + theWriter->EndObject(); +#else + (void )theWriter; + (void )theTexture; + (void )theIsStarted; +#endif +} + +// ======================================================================= +// function : AddMaterial +// purpose : +// ======================================================================= +void RWGltf_GltfMaterialMap::AddMaterial (RWGltf_GltfOStreamWriter* theWriter, + const XCAFPrs_Style& theStyle, + Standard_Boolean& theIsStarted) +{ +#ifdef HAVE_RAPIDJSON + if (theWriter == NULL + || ((theStyle.Material().IsNull() || theStyle.Material()->IsEmpty()) + && !theStyle.IsSetColorSurf())) + { + return; + } + + if (!theIsStarted) + { + theWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Materials)); + theWriter->StartArray(); + theIsStarted = true; + } + myWriter = theWriter; + AddMaterial (theStyle); + myWriter = NULL; +#else + (void )theWriter; + (void )theStyle; + (void )theIsStarted; +#endif +} + +// ======================================================================= +// function : AddTextures +// purpose : +// ======================================================================= +void RWGltf_GltfMaterialMap::AddTextures (RWGltf_GltfOStreamWriter* theWriter, + const XCAFPrs_Style& theStyle, + Standard_Boolean& theIsStarted) +{ + if (theWriter == NULL + || theStyle.Material().IsNull() + || theStyle.Material()->IsEmpty()) + { + return; + } + + addTexture (theWriter, baseColorTexture (theStyle.Material()), theIsStarted); + addTexture (theWriter, theStyle.Material()->PbrMaterial().MetallicRoughnessTexture, theIsStarted); + addTexture (theWriter, theStyle.Material()->PbrMaterial().NormalTexture, theIsStarted); + addTexture (theWriter, theStyle.Material()->PbrMaterial().EmissiveTexture, theIsStarted); + addTexture (theWriter, theStyle.Material()->PbrMaterial().OcclusionTexture, theIsStarted); +} + +// ======================================================================= +// function : addTexture +// purpose : +// ======================================================================= +void RWGltf_GltfMaterialMap::addTexture (RWGltf_GltfOStreamWriter* theWriter, + const Handle(Image_Texture)& theTexture, + Standard_Boolean& theIsStarted) +{ +#ifdef HAVE_RAPIDJSON + if (theTexture.IsNull() + || myTextureMap.Contains (theTexture) + || !myImageMap .IsBound1 (theTexture)) + { + return; + } + + const TCollection_AsciiString anImgKey = myImageMap.Find1 (theTexture); + myTextureMap.Add (theTexture); + if (anImgKey.IsEmpty()) + { + return; + } + + if (!theIsStarted) + { + theWriter->Key (RWGltf_GltfRootElementName (RWGltf_GltfRootElement_Textures)); + theWriter->StartArray(); + theIsStarted = true; + } + + theWriter->StartObject(); + { + theWriter->Key ("sampler"); + theWriter->Int (myDefSamplerId); // mandatory field by specs + theWriter->Key ("source"); + theWriter->Int (anImgKey.IntegerValue()); + } + theWriter->EndObject(); +#else + (void )theWriter; + (void )theTexture; + (void )theIsStarted; +#endif +} + +// ======================================================================= +// function : AddMaterial +// purpose : +// ======================================================================= +TCollection_AsciiString RWGltf_GltfMaterialMap::AddMaterial (const XCAFPrs_Style& theStyle) +{ + return RWMesh_MaterialMap::AddMaterial (theStyle); +} + +// ======================================================================= +// function : DefineMaterial +// purpose : +// ======================================================================= +void RWGltf_GltfMaterialMap::DefineMaterial (const XCAFPrs_Style& theStyle, + const TCollection_AsciiString& /*theKey*/, + const TCollection_AsciiString& theName) +{ +#ifdef HAVE_RAPIDJSON + if (myWriter == NULL) + { + Standard_ProgramError::Raise ("RWGltf_GltfMaterialMap::DefineMaterial() should be called with JSON Writer"); + return; + } + + XCAFDoc_VisMaterialPBR aPbrMat; + const bool hasMaterial = !theStyle.Material().IsNull() + && !theStyle.Material()->IsEmpty(); + if (hasMaterial) + { + aPbrMat = theStyle.Material()->ConvertToPbrMaterial(); + } + else if (!myDefaultStyle.Material().IsNull() + && myDefaultStyle.Material()->HasPbrMaterial()) + { + aPbrMat = myDefaultStyle.Material()->PbrMaterial(); + } + if (theStyle.IsSetColorSurf()) + { + aPbrMat.BaseColor.SetRGB (theStyle.GetColorSurf()); + if (theStyle.GetColorSurfRGBA().Alpha() < 1.0f) + { + aPbrMat.BaseColor.SetAlpha (theStyle.GetColorSurfRGBA().Alpha()); + } + } + myWriter->StartObject(); + { + myWriter->Key ("name"); + myWriter->String (theName.ToCString()); + + myWriter->Key ("pbrMetallicRoughness"); + myWriter->StartObject(); + { + myWriter->Key ("baseColorFactor"); + myWriter->StartArray(); + { + myWriter->Double (aPbrMat.BaseColor.GetRGB().Red()); + myWriter->Double (aPbrMat.BaseColor.GetRGB().Green()); + myWriter->Double (aPbrMat.BaseColor.GetRGB().Blue()); + myWriter->Double (aPbrMat.BaseColor.Alpha()); + } + myWriter->EndArray(); + + if (const Handle(Image_Texture)& aBaseTexture = baseColorTexture (theStyle.Material())) + { + if (myImageMap.IsBound1 (aBaseTexture)) + { + myWriter->Key ("baseColorTexture"); + myWriter->StartObject(); + { + myWriter->Key ("index"); + const TCollection_AsciiString& anImageIdx = myImageMap.Find1 (aBaseTexture); + if (!anImageIdx.IsEmpty()) + { + myWriter->Int (anImageIdx.IntegerValue()); + } + } + myWriter->EndObject(); + } + } + + if (hasMaterial + || aPbrMat.Metallic != 1.0f) + { + myWriter->Key ("metallicFactor"); + myWriter->Double (aPbrMat.Metallic); + } + + if (!aPbrMat.MetallicRoughnessTexture.IsNull() + && myImageMap.IsBound1 (aPbrMat.MetallicRoughnessTexture)) + { + myWriter->Key ("metallicRoughnessTexture"); + myWriter->StartObject(); + { + myWriter->Key ("index"); + const TCollection_AsciiString& anImageIdx = myImageMap.Find1 (aPbrMat.MetallicRoughnessTexture); + if (!anImageIdx.IsEmpty()) + { + myWriter->Int (anImageIdx.IntegerValue()); + } + } + myWriter->EndObject(); + } + + if (hasMaterial + || aPbrMat.Roughness != 1.0f) + { + myWriter->Key ("roughnessFactor"); + myWriter->Double (aPbrMat.Roughness); + } + } + myWriter->EndObject(); + + if (theStyle.Material().IsNull() + || theStyle.Material()->IsDoubleSided()) + { + myWriter->Key ("doubleSided"); + myWriter->Bool (true); + } + + const Graphic3d_AlphaMode anAlphaMode = !theStyle.Material().IsNull() ? theStyle.Material()->AlphaMode() : Graphic3d_AlphaMode_BlendAuto; + switch (anAlphaMode) + { + case Graphic3d_AlphaMode_BlendAuto: + { + if (aPbrMat.BaseColor.Alpha() < 1.0f) + { + myWriter->Key ("alphaMode"); + myWriter->String ("BLEND"); + } + break; + } + case Graphic3d_AlphaMode_Opaque: + { + break; + } + case Graphic3d_AlphaMode_Mask: + { + myWriter->Key ("alphaMode"); + myWriter->String ("MASK"); + break; + } + case Graphic3d_AlphaMode_Blend: + { + myWriter->Key ("alphaMode"); + myWriter->String ("BLEND"); + break; + } + } + if (!theStyle.Material().IsNull() + && theStyle.Material()->AlphaCutOff() != 0.5f) + { + myWriter->Key ("alphaCutoff"); + myWriter->Double (theStyle.Material()->AlphaCutOff()); + } + + if (aPbrMat.EmissiveFactor != Graphic3d_Vec3 (0.0f, 0.0f, 0.0f)) + { + myWriter->Key ("emissiveFactor"); + myWriter->StartArray(); + { + myWriter->Double (aPbrMat.EmissiveFactor.r()); + myWriter->Double (aPbrMat.EmissiveFactor.g()); + myWriter->Double (aPbrMat.EmissiveFactor.b()); + } + myWriter->EndArray(); + } + if (!aPbrMat.EmissiveTexture.IsNull() + && myImageMap.IsBound1 (aPbrMat.EmissiveTexture)) + { + myWriter->Key ("emissiveTexture"); + myWriter->StartObject(); + { + myWriter->Key ("index"); + const TCollection_AsciiString& anImageIdx = myImageMap.Find1 (aPbrMat.EmissiveTexture); + if (!anImageIdx.IsEmpty()) + { + myWriter->Int (anImageIdx.IntegerValue()); + } + } + myWriter->EndObject(); + } + + if (!aPbrMat.NormalTexture.IsNull() + && myImageMap.IsBound1 (aPbrMat.NormalTexture)) + { + myWriter->Key ("normalTexture"); + myWriter->StartObject(); + { + myWriter->Key ("index"); + const TCollection_AsciiString& anImageIdx = myImageMap.Find1 (aPbrMat.NormalTexture); + if (!anImageIdx.IsEmpty()) + { + myWriter->Int (anImageIdx.IntegerValue()); + } + } + myWriter->EndObject(); + } + + if (!aPbrMat.OcclusionTexture.IsNull() + && myImageMap.IsBound1 (aPbrMat.OcclusionTexture)) + { + myWriter->Key ("occlusionTexture"); + myWriter->StartObject(); + { + myWriter->Key ("index"); + const TCollection_AsciiString& anImageIdx = myImageMap.Find1 (aPbrMat.OcclusionTexture); + if (!anImageIdx.IsEmpty()) + { + myWriter->Int (anImageIdx.IntegerValue()); + } + } + myWriter->EndObject(); + } + } + myWriter->EndObject(); +#else + (void )theStyle; + (void )theName; +#endif +} diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfMaterialMap.hxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfMaterialMap.hxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfMaterialMap.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfMaterialMap.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,88 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWGltf_GltfMaterialMap_HeaderFile +#define _RWGltf_GltfMaterialMap_HeaderFile + +#include + +class RWGltf_GltfOStreamWriter; + +//! Material manager for exporting into glTF format. +class RWGltf_GltfMaterialMap : public RWMesh_MaterialMap +{ +public: + + //! Main constructor. + Standard_EXPORT RWGltf_GltfMaterialMap (const TCollection_AsciiString& theFile, + const Standard_Integer theDefSamplerId); + + //! Destructor. + Standard_EXPORT virtual ~RWGltf_GltfMaterialMap(); + + //! Add material images. + Standard_EXPORT void AddImages (RWGltf_GltfOStreamWriter* theWriter, + const XCAFPrs_Style& theStyle, + Standard_Boolean& theIsStarted); + + //! Add material. + Standard_EXPORT void AddMaterial (RWGltf_GltfOStreamWriter* theWriter, + const XCAFPrs_Style& theStyle, + Standard_Boolean& theIsStarted); + //! Add material textures. + Standard_EXPORT void AddTextures (RWGltf_GltfOStreamWriter* theWriter, + const XCAFPrs_Style& theStyle, + Standard_Boolean& theIsStarted); + + //! Return extent of images map. + Standard_Integer NbImages() const { return myImageMap.Extent(); } + + //! Return extent of textures map. + Standard_Integer NbTextures() const { return myTextureMap.Extent(); } + +public: + + //! Return base color texture. + Standard_EXPORT static const Handle(Image_Texture)& baseColorTexture (const Handle(XCAFDoc_VisMaterial)& theMat); + +protected: + + //! Add texture image. + Standard_EXPORT void addImage (RWGltf_GltfOStreamWriter* theWriter, + const Handle(Image_Texture)& theTexture, + Standard_Boolean& theIsStarted); + + //! Add texture. + Standard_EXPORT void addTexture (RWGltf_GltfOStreamWriter* theWriter, + const Handle(Image_Texture)& theTexture, + Standard_Boolean& theIsStarted); + + //! Add material + Standard_EXPORT virtual TCollection_AsciiString AddMaterial (const XCAFPrs_Style& theStyle) Standard_OVERRIDE; + + //! Virtual method actually defining the material (e.g. export to the file). + Standard_EXPORT virtual void DefineMaterial (const XCAFPrs_Style& theStyle, + const TCollection_AsciiString& theKey, + const TCollection_AsciiString& theName) Standard_OVERRIDE; + +protected: + + RWGltf_GltfOStreamWriter* myWriter; + NCollection_DoubleMap myImageMap; + NCollection_Map myTextureMap; + Standard_Integer myDefSamplerId; + Standard_Integer myNbImages; + +}; + +#endif // _RWGltf_GltfMaterialMap_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfOStreamWriter.hxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfOStreamWriter.hxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfOStreamWriter.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfOStreamWriter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,29 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWGltf_GltfOStreamWriter_HeaderFile +#define _RWGltf_GltfOStreamWriter_HeaderFile + +#include +#include + +//! rapidjson::Writer wrapper for forward declaration. +class RWGltf_GltfOStreamWriter : public rapidjson::Writer +{ +public: + //! Main constructor. + RWGltf_GltfOStreamWriter (rapidjson::OStreamWrapper& theOStream) + : rapidjson::Writer (theOStream) {} +}; + +#endif // _RWGltf_GltfOStreamWriter_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfSceneNodeMap.hxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfSceneNodeMap.hxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_GltfSceneNodeMap.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_GltfSceneNodeMap.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,48 @@ +// Copyright (c) 2018-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWGltf_GltfSceneNodeMap_HeaderFile +#define _RWGltf_GltfSceneNodeMap_HeaderFile + +#include +#include + +//! Indexed map of scene nodes with custom search algorithm. +class RWGltf_GltfSceneNodeMap : public NCollection_IndexedMap +{ +public: + + //! Empty constructor. + RWGltf_GltfSceneNodeMap() {} + + //! Find index from document node string identifier. + Standard_Integer FindIndex (const TCollection_AsciiString& theNodeId) const + { + if (IsEmpty()) + { + return 0; + } + + for (IndexedMapNode* aNode1Iter = (IndexedMapNode* )myData1[::HashCode (theNodeId, NbBuckets())]; aNode1Iter != NULL; aNode1Iter = (IndexedMapNode* )aNode1Iter->Next()) + { + if (::IsEqual (aNode1Iter->Key1().Id, theNodeId)) + { + return aNode1Iter->Index(); + } + } + return 0; + } + +}; + +#endif // _RWGltf_GltfSceneNodeMap_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_MaterialCommon.hxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_MaterialCommon.hxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_MaterialCommon.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_MaterialCommon.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,10 +36,10 @@ Standard_ShortReal Transparency; RWGltf_MaterialCommon() - : AmbientColor (0.1, 0.1, 0.1, Quantity_TOC_RGB), - DiffuseColor (0.8, 0.8, 0.8, Quantity_TOC_RGB), - SpecularColor(0.2, 0.2, 0.2, Quantity_TOC_RGB), - EmissiveColor(0.0, 0.0, 0.0, Quantity_TOC_RGB), + : AmbientColor (0.1, 0.1, 0.1, Quantity_TOC_sRGB), + DiffuseColor (0.8, 0.8, 0.8, Quantity_TOC_sRGB), + SpecularColor(0.2, 0.2, 0.2, Quantity_TOC_sRGB), + EmissiveColor(Quantity_NOC_BLACK), Shininess (1.0f), Transparency (0.0f) {} diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_MaterialMetallicRoughness.hxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_MaterialMetallicRoughness.hxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_MaterialMetallicRoughness.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_MaterialMetallicRoughness.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -38,12 +39,18 @@ Graphic3d_Vec3 EmissiveFactor; //!< emissive color; [0.0, 0.0, 0.0] by default Standard_ShortReal Metallic; //!< metalness (or scale factor to the texture) within range [0.0, 1.0]; 1.0 by default Standard_ShortReal Roughness; //!< roughness (or scale factor to the texture) within range [0.0, 1.0]; 1.0 by default + Standard_ShortReal AlphaCutOff; //!< alpha cutoff value; 0.5 by default + RWGltf_GltfAlphaMode AlphaMode; //!< alpha mode; RWGltf_GltfAlphaMode_Opaque by default + Standard_Boolean IsDoubleSided; //!< specifies whether the material is double sided; FALSE by default - RWGltf_MaterialMetallicRoughness() + RWGltf_MaterialMetallicRoughness() : BaseColor (1.0f, 1.0f, 1.0f, 1.0f), EmissiveFactor (0.0f, 0.0f, 0.0f), - Metallic (0.0f), - Roughness (0.0f) {} + Metallic (1.0f), + Roughness (1.0f), + AlphaCutOff (0.5f), + AlphaMode (RWGltf_GltfAlphaMode_Opaque), + IsDoubleSided (Standard_False) {} }; diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_PrimitiveArrayReader.cxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_PrimitiveArrayReader.cxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_PrimitiveArrayReader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_PrimitiveArrayReader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,7 @@ // ======================================================================= void RWGltf_PrimitiveArrayReader::reportError (const TCollection_AsciiString& theText) { - Message::DefaultMessenger()->Send (myErrorPrefix + theText, Message_Fail); + Message::SendFail (myErrorPrefix + theText); } // ======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_TriangulationReader.cxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_TriangulationReader.cxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_TriangulationReader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_TriangulationReader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -111,7 +111,7 @@ { if (theMode != RWGltf_GltfPrimitiveMode_Triangles) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Buffer '") + theName + "' skipped unsupported primitive array.", Message_Warning); + Message::SendWarning (TCollection_AsciiString("Buffer '") + theName + "' skipped unsupported primitive array"); return true; } @@ -283,7 +283,7 @@ return false; } - Standard_ReadBuffer aBuffer (theAccessor.Count * aStride, aStride); + Standard_ReadBuffer aBuffer (theAccessor.Count * aStride - (aStride - sizeof(Graphic3d_Vec3)), aStride, true); if (!myCoordSysConverter.IsEmpty()) { for (Standard_Integer aVertIter = 0; aVertIter < aNbNodes; ++aVertIter) @@ -336,7 +336,7 @@ { return false; } - Standard_ReadBuffer aBuffer (theAccessor.Count * aStride, aStride); + Standard_ReadBuffer aBuffer (theAccessor.Count * aStride - (aStride - sizeof(Graphic3d_Vec3)), aStride, true); if (!myCoordSysConverter.IsEmpty()) { for (Standard_Integer aVertIter = 0; aVertIter < aNbNodes; ++aVertIter) @@ -402,7 +402,7 @@ return false; } - Standard_ReadBuffer aBuffer (theAccessor.Count * aStride, aStride); + Standard_ReadBuffer aBuffer (theAccessor.Count * aStride - (aStride - sizeof(Graphic3d_Vec2)), aStride, true); for (int aVertIter = 0; aVertIter < aNbNodes; ++aVertIter) { Graphic3d_Vec2* aVec2 = aBuffer.ReadChunk (theStream); diff -Nru opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_WriterTrsfFormat.hxx opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_WriterTrsfFormat.hxx --- opencascade-7.4.1+dfsg1/src/RWGltf/RWGltf_WriterTrsfFormat.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWGltf/RWGltf_WriterTrsfFormat.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,26 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWGltf_WriterTrsfFormat_HeaderFile +#define _RWGltf_WriterTrsfFormat_HeaderFile + +//! Transformation format. +enum RWGltf_WriterTrsfFormat +{ + RWGltf_WriterTrsfFormat_Compact = 0, //!< automatically choose most compact representation between Mat4 and TRS + RWGltf_WriterTrsfFormat_Mat4 = 1, //!< 4x4 transformation Matrix + RWGltf_WriterTrsfFormat_TRS = 2, //!< transformation decomposed into Translation vector, Rotation quaternion and Scale factor (T * R * S) +}; +enum { RWGltf_WriterTrsfFormat_LOWER = 0, RWGltf_WriterTrsfFormat_UPPER = RWGltf_WriterTrsfFormat_TRS }; // aliases + +#endif // _RWGltf_WriterTrsfFormat_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWMesh/FILES opencascade-7.5.1+dfsg1/src/RWMesh/FILES --- opencascade-7.4.1+dfsg1/src/RWMesh/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWMesh/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -3,4 +3,8 @@ RWMesh_CoordinateSystemConverter.hxx RWMesh_CafReader.cxx RWMesh_CafReader.hxx +RWMesh_FaceIterator.cxx +RWMesh_FaceIterator.hxx +RWMesh_MaterialMap.cxx +RWMesh_MaterialMap.hxx RWMesh_NodeAttributes.hxx diff -Nru opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_CafReader.cxx opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_CafReader.cxx --- opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_CafReader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_CafReader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include #include @@ -32,6 +32,7 @@ #include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(RWMesh_CafReader, Standard_Transient) @@ -86,7 +87,7 @@ // purpose : // ======================================================================= Standard_Boolean RWMesh_CafReader::perform (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress, + const Message_ProgressRange& theProgress, const Standard_Boolean theToProbe) { Standard_Integer aNewRootsLower = 1; @@ -100,8 +101,7 @@ OSD_Timer aLoadingTimer; aLoadingTimer.Start(); const Standard_Boolean isDone = performMesh (theFile, theProgress, theToProbe); - if (theToProbe - || (!theProgress.IsNull() && theProgress->UserBreak())) + if (theToProbe || theProgress.UserBreak()) { return isDone; } @@ -140,9 +140,9 @@ aLoadingTimer.Stop(); - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Mesh ") + theFile - + "\n[" + aNbNodes + " nodes] [" + aNbElems + " 2d elements]" - + "\n[" + (!isDone ? "PARTIALLY " : "") + "read in " + aLoadingTimer.ElapsedTime() + " s]", Message_Info); + Message::SendInfo (TCollection_AsciiString ("Mesh ") + theFile + + "\n[" + aNbNodes + " nodes] [" + aNbElems + " 2d elements]" + + "\n[" + (!isDone ? "PARTIALLY " : "") + "read in " + aLoadingTimer.ElapsedTime() + " s]"); return Standard_True; } @@ -162,19 +162,114 @@ const Standard_Boolean wasAutoNaming = XCAFDoc_ShapeTool::AutoNaming(); XCAFDoc_ShapeTool::SetAutoNaming (Standard_False); const TCollection_AsciiString aRootName; // = generateRootName (theFile); + CafDocumentTools aTools; + aTools.ShapeTool = XCAFDoc_DocumentTool::ShapeTool (myXdeDoc->Main()); + aTools.ColorTool = XCAFDoc_DocumentTool::ColorTool (myXdeDoc->Main()); + aTools.VisMaterialTool = XCAFDoc_DocumentTool::VisMaterialTool (myXdeDoc->Main()); for (TopTools_SequenceOfShape::Iterator aRootIter (myRootShapes); aRootIter.More(); aRootIter.Next()) { - addShapeIntoDoc (aRootIter.Value(), TDF_Label(), aRootName); + addShapeIntoDoc (aTools, aRootIter.Value(), TDF_Label(), aRootName); } XCAFDoc_DocumentTool::ShapeTool (myXdeDoc->Main())->UpdateAssemblies(); XCAFDoc_ShapeTool::SetAutoNaming (wasAutoNaming); } // ======================================================================= +// function : setShapeName +// purpose : +// ======================================================================= +void RWMesh_CafReader::setShapeName (const TDF_Label& theLabel, + const TopAbs_ShapeEnum theShapeType, + const TCollection_AsciiString& theName, + const TDF_Label& theParentLabel, + const TCollection_AsciiString& theParentName) +{ + if (!theName.IsEmpty()) + { + TDataStd_Name::Set (theLabel, theName); + } + else if (!theParentLabel.IsNull()) + { + TDataStd_Name::Set (theLabel, shapeTypeToString (theShapeType)); + } + else if (theParentLabel.IsNull() + && !theParentName.IsEmpty()) + { + TDataStd_Name::Set (theLabel, theParentName); + } +} + +// ======================================================================= +// function : setShapeStyle +// purpose : +// ======================================================================= +void RWMesh_CafReader::setShapeStyle (const CafDocumentTools& theTools, + const TDF_Label& theLabel, + const XCAFPrs_Style& theStyle) +{ + if (theStyle.IsSetColorSurf()) + { + theTools.ColorTool->SetColor (theLabel, theStyle.GetColorSurfRGBA(), XCAFDoc_ColorSurf); + } + if (theStyle.IsSetColorCurv()) + { + theTools.ColorTool->SetColor (theLabel, theStyle.GetColorCurv(), XCAFDoc_ColorCurv); + } + if (!theStyle.Material().IsNull()) + { + TDF_Label aMaterialLabel = theStyle.Material()->Label(); + if (aMaterialLabel.IsNull()) + { + const TCollection_AsciiString aMatName = !theStyle.Material()->RawName().IsNull() + ? theStyle.Material()->RawName()->String() + : ""; + aMaterialLabel = theTools.VisMaterialTool->AddMaterial (theStyle.Material(), aMatName); + } + theTools.VisMaterialTool->SetShapeMaterial (theLabel, aMaterialLabel); + } +} + +// ======================================================================= +// function : setShapeNamedData +// purpose : +// ======================================================================= +void RWMesh_CafReader::setShapeNamedData (const CafDocumentTools& , + const TDF_Label& theLabel, + const Handle(TDataStd_NamedData)& theNameData) +{ + if (theNameData.IsNull()) + { + return; + } + + const TDF_Label aNameDataLabel = theNameData->Label(); + Handle(TDataStd_NamedData) anOtherNamedData; + if (theLabel.FindAttribute (theNameData->ID(), anOtherNamedData)) + { + if (anOtherNamedData->Label() != aNameDataLabel) + { + Message::SendAlarm ("Error! Different NamedData is already set to shape"); + } + } + else + { + if (aNameDataLabel.IsNull()) + { + theLabel.AddAttribute (theNameData); + } + else + { + Message::SendAlarm ("Error! Skipped NamedData instance shared across shapes"); + } + } +} + +// ======================================================================= // function : addShapeIntoDoc // purpose : // ======================================================================= -Standard_Boolean RWMesh_CafReader::addShapeIntoDoc (const TopoDS_Shape& theShape, +Standard_Boolean RWMesh_CafReader::addShapeIntoDoc (CafDocumentTools& theTools, + const TopoDS_Shape& theShape, const TDF_Label& theLabel, const TCollection_AsciiString& theParentName) { @@ -184,10 +279,9 @@ return Standard_False; } - Handle(XCAFDoc_ShapeTool) aShapeTool = XCAFDoc_DocumentTool::ShapeTool (myXdeDoc->Main()); - const TopAbs_ShapeEnum aShapeType = theShape.ShapeType(); TopoDS_Shape aShapeToAdd = theShape; + const TopoDS_Shape aShapeNoLoc = theShape.Located (TopLoc_Location()); Standard_Boolean toMakeAssembly = Standard_False; if (theShape.ShapeType() == TopAbs_COMPOUND) { @@ -205,9 +299,9 @@ || (myAttribMap.Find (aFace, aSubFaceAttribs) && !aSubFaceAttribs.Name.IsEmpty()); } - // create empty compound to add as assembly if (toMakeAssembly) { + // create an empty Compound to add as assembly, so that we can add children one-by-one via AddComponent() TopoDS_Compound aCompound; BRep_Builder aBuilder; aBuilder.MakeCompound (aCompound); @@ -216,21 +310,35 @@ } } - TDF_Label aNewLabel; + TDF_Label aNewLabel, anOldLabel; if (theLabel.IsNull()) { // add new shape - aNewLabel = aShapeTool->AddShape (aShapeToAdd, toMakeAssembly); + aNewLabel = theTools.ShapeTool->AddShape (aShapeToAdd, toMakeAssembly); } - else if (aShapeTool->IsAssembly (theLabel)) + else if (theTools.ShapeTool->IsAssembly (theLabel)) { // add shape as component - aNewLabel = aShapeTool->AddComponent (theLabel, aShapeToAdd, toMakeAssembly); + if (theTools.ComponentMap.Find (aShapeNoLoc, anOldLabel)) + { + aNewLabel = theTools.ShapeTool->AddComponent (theLabel, anOldLabel, theShape.Location()); + } + else + { + aNewLabel = theTools.ShapeTool->AddComponent (theLabel, aShapeToAdd, toMakeAssembly); + + TDF_Label aRefLabel = aNewLabel; + theTools.ShapeTool->GetReferredShape (aNewLabel, aRefLabel); + if (!aRefLabel.IsNull()) + { + theTools.ComponentMap.Bind (aShapeNoLoc, aRefLabel); + } + } } else { // add shape as sub-shape - aNewLabel = aShapeTool->AddSubShape (theLabel, theShape); + aNewLabel = theTools.ShapeTool->AddSubShape (theLabel, theShape); if (!aNewLabel.IsNull()) { Handle(XCAFDoc_ShapeMapTool) aShapeMapTool = XCAFDoc_ShapeMapTool::Set (aNewLabel); @@ -244,44 +352,127 @@ // if new label is a reference get referred shape TDF_Label aNewRefLabel = aNewLabel; - aShapeTool->GetReferredShape (aNewLabel, aNewRefLabel); + theTools.ShapeTool->GetReferredShape (aNewLabel, aNewRefLabel); + + RWMesh_NodeAttributes aRefShapeAttribs; + myAttribMap.Find (aShapeNoLoc, aRefShapeAttribs); + + bool hasProductName = false; + if (aNewLabel != aNewRefLabel) + { + // put attributes to the Instance (overrides Product attributes) + RWMesh_NodeAttributes aShapeAttribs; + if (!theShape.Location().IsIdentity() + && myAttribMap.Find (theShape, aShapeAttribs)) + { + if (!aShapeAttribs.Style.IsEqual (aRefShapeAttribs.Style)) + { + setShapeStyle (theTools, aNewLabel, aShapeAttribs.Style); + } + if (aShapeAttribs.NamedData != aRefShapeAttribs.NamedData) + { + setShapeNamedData (theTools, aNewLabel, aShapeAttribs.NamedData); + } + setShapeName (aNewLabel, aShapeType, aShapeAttribs.Name, theLabel, theParentName); + if (aRefShapeAttribs.Name.IsEmpty() + && !aShapeAttribs.Name.IsEmpty()) + { + // it is not nice having unnamed Product, so copy name from first Instance (probably the only one) + hasProductName = true; + setShapeName (aNewRefLabel, aShapeType, aShapeAttribs.Name, theLabel, theParentName); + } + } + else + { + // copy name from Product + setShapeName (aNewLabel, aShapeType, aRefShapeAttribs.Name, theLabel, theParentName); + } + } + + if (!anOldLabel.IsNull()) + { + // already defined in the document + return Standard_True; + } + + // put attributes to the Product (shared across Instances) + if (!hasProductName) + { + setShapeName (aNewRefLabel, aShapeType, aRefShapeAttribs.Name, theLabel, theParentName); + } + setShapeStyle (theTools, aNewRefLabel, aRefShapeAttribs.Style); + setShapeNamedData (theTools, aNewRefLabel, aRefShapeAttribs.NamedData); - // store name - RWMesh_NodeAttributes aShapeAttribs; - myAttribMap.Find (theShape, aShapeAttribs); - if (aShapeAttribs.Name.IsEmpty()) + if (theTools.ShapeTool->IsAssembly (aNewRefLabel)) { - if (theLabel.IsNull()) + // store sub-shapes (iterator is set to not inherit Location of parent object) + TCollection_AsciiString aDummyName; + for (TopoDS_Iterator aSubShapeIter (theShape, Standard_True, Standard_False); aSubShapeIter.More(); aSubShapeIter.Next()) { - aShapeAttribs.Name = theParentName; + addShapeIntoDoc (theTools, aSubShapeIter.Value(), aNewRefLabel, aDummyName); } - if (aShapeAttribs.Name.IsEmpty() - && !theLabel.IsNull()) + } + else + { + // store a plain list of sub-shapes in case if they have custom attributes (usually per-face color) + RWMesh_NodeAttributes aSubShapeAttribs; + for (TopoDS_Iterator aSubShapeIter (theShape, Standard_True, Standard_False); aSubShapeIter.More(); aSubShapeIter.Next()) { - aShapeAttribs.Name = shapeTypeToString (aShapeType); + const TopoDS_Shape& aSubShape = aSubShapeIter.Value(); + if (myAttribMap.Find (aSubShape.Located (TopLoc_Location()), aSubShapeAttribs)) + { + addSubShapeIntoDoc (theTools, aSubShape, aNewRefLabel, aSubShapeAttribs); + } } } - if (!aShapeAttribs.Name.IsEmpty()) + return Standard_True; +} + +// ======================================================================= +// function : addSubShapeIntoDoc +// purpose : +// ======================================================================= +Standard_Boolean RWMesh_CafReader::addSubShapeIntoDoc (CafDocumentTools& theTools, + const TopoDS_Shape& theShape, + const TDF_Label& theParentLabel, + const RWMesh_NodeAttributes& theAttribs) +{ + if (theShape.IsNull() + || myXdeDoc.IsNull()) { - TDataStd_Name::Set (aNewRefLabel, aShapeAttribs.Name); + return Standard_False; } - // store color - Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool (myXdeDoc->Main()); - if (aShapeAttribs.Style.IsSetColorSurf()) + const TopAbs_ShapeEnum aShapeType = theShape.ShapeType(); + TDF_Label aNewLabel = theTools.ShapeTool->AddSubShape (theParentLabel, theShape); + if (aNewLabel.IsNull()) { - aColorTool->SetColor (aNewRefLabel, aShapeAttribs.Style.GetColorSurfRGBA(), XCAFDoc_ColorSurf); + return Standard_False; } - if (aShapeAttribs.Style.IsSetColorCurv()) + { - aColorTool->SetColor (aNewRefLabel, aShapeAttribs.Style.GetColorCurv(), XCAFDoc_ColorCurv); + Handle(XCAFDoc_ShapeMapTool) aShapeMapTool = XCAFDoc_ShapeMapTool::Set (aNewLabel); + aShapeMapTool->SetShape (theShape); } - // store sub-shapes (iterator is set to ignore Location) - TCollection_AsciiString aDummyName; + // if new label is a reference get referred shape + TDF_Label aNewRefLabel = aNewLabel; + theTools.ShapeTool->GetReferredShape (aNewLabel, aNewRefLabel); + + // put attributes to the Product (shared across Instances) + static const TCollection_AsciiString anEmptyString; + setShapeName (aNewRefLabel, aShapeType, theAttribs.Name, TDF_Label(), anEmptyString); + setShapeStyle (theTools, aNewRefLabel, theAttribs.Style); + setShapeNamedData (theTools, aNewRefLabel, theAttribs.NamedData); + + RWMesh_NodeAttributes aSubShapeAttribs; for (TopoDS_Iterator aSubShapeIter (theShape, Standard_True, Standard_False); aSubShapeIter.More(); aSubShapeIter.Next()) { - addShapeIntoDoc (aSubShapeIter.Value(), aNewRefLabel, aDummyName); + const TopoDS_Shape& aSubShape = aSubShapeIter.Value(); + if (myAttribMap.Find (aSubShape.Located (TopLoc_Location()), aSubShapeAttribs)) + { + addSubShapeIntoDoc (theTools, aSubShape, theParentLabel, aSubShapeAttribs); + } } return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_CafReader.hxx opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_CafReader.hxx --- opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_CafReader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_CafReader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,6 +15,7 @@ #ifndef _RWMesh_CafReader_HeaderFile #define _RWMesh_CafReader_HeaderFile +#include #include #include #include @@ -22,8 +23,10 @@ #include #include -class Message_ProgressIndicator; class TDocStd_Document; +class XCAFDoc_ShapeTool; +class XCAFDoc_ColorTool; +class XCAFDoc_VisMaterialTool; //! Extended status bits. enum RWMesh_CafReaderStatusEx @@ -47,6 +50,17 @@ DEFINE_STANDARD_RTTIEXT(RWMesh_CafReader, Standard_Transient) public: + //! Structure holding tools for filling the document. + struct CafDocumentTools + { + Handle(XCAFDoc_ShapeTool) ShapeTool; + Handle(XCAFDoc_ColorTool) ColorTool; + Handle(XCAFDoc_VisMaterialTool) VisMaterialTool; + NCollection_DataMap ComponentMap; + }; + +public: + //! Empty constructor. Standard_EXPORT RWMesh_CafReader(); @@ -137,7 +151,7 @@ //! Read the data from specified file. //! The Document instance should be set beforehand. bool Perform (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { return perform (theFile, theProgress, Standard_False); } @@ -161,7 +175,7 @@ //! The main purpose is collecting metadata and external references - for copying model into a new location, for example. //! Can be NOT implemented (unsupported by format / reader). Standard_Boolean ProbeHeader (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress = Handle(Message_ProgressIndicator)()) + const Message_ProgressRange& theProgress = Message_ProgressRange()) { return perform (theFile, theProgress, Standard_True); } @@ -174,12 +188,12 @@ //! @param optional progress indicator //! @param theToProbe flag indicating that mesh data should be skipped and only basing information to be read Standard_EXPORT virtual Standard_Boolean perform (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress, + const Message_ProgressRange& theProgress, const Standard_Boolean theToProbe); //! Read the mesh from specified file - interface to be implemented by sub-classes. Standard_EXPORT virtual Standard_Boolean performMesh (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress, + const Message_ProgressRange& theProgress, const Standard_Boolean theToProbe) = 0; //! @name tools for filling XDE document @@ -189,10 +203,34 @@ Standard_EXPORT void fillDocument(); //! Append new shape into the document (recursively). - Standard_EXPORT Standard_Boolean addShapeIntoDoc (const TopoDS_Shape& theShape, + Standard_EXPORT Standard_Boolean addShapeIntoDoc (CafDocumentTools& theTools, + const TopoDS_Shape& theShape, const TDF_Label& theLabel, const TCollection_AsciiString& theParentName); + //! Append new sub-shape into the document (recursively). + Standard_EXPORT Standard_Boolean addSubShapeIntoDoc (CafDocumentTools& theTools, + const TopoDS_Shape& theShape, + const TDF_Label& theParentLabel, + const RWMesh_NodeAttributes& theAttribs); + + //! Put name attribute onto the label. + Standard_EXPORT void setShapeName (const TDF_Label& theLabel, + const TopAbs_ShapeEnum theShapeType, + const TCollection_AsciiString& theName, + const TDF_Label& theParentLabel, + const TCollection_AsciiString& theParentName); + + //! Put color and material attributes onto the label. + Standard_EXPORT void setShapeStyle (const CafDocumentTools& theTools, + const TDF_Label& theLabel, + const XCAFPrs_Style& theStyle); + + //! Put name data (metadata) attribute onto the label. + Standard_EXPORT void setShapeNamedData (const CafDocumentTools& theTools, + const TDF_Label& theLabel, + const Handle(TDataStd_NamedData)& theNameData); + //! Generate names for root labels starting from specified index. Standard_EXPORT void generateNames (const TCollection_AsciiString& theFile, const Standard_Integer theRootLower, diff -Nru opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_FaceIterator.cxx opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_FaceIterator.cxx --- opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_FaceIterator.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_FaceIterator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,240 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include + +// ======================================================================= +// function : RWMesh_FaceIterator +// purpose : +// ======================================================================= +RWMesh_FaceIterator::RWMesh_FaceIterator (const TDF_Label& theLabel, + const TopLoc_Location& theLocation, + const Standard_Boolean theToMapColors, + const XCAFPrs_Style& theStyle) +: myDefStyle (theStyle), + myToMapColors (theToMapColors), + mySLTool (1, 1e-12), + myNodes (NULL), + myNormals (NULL), + myNodeUVs (NULL), + myHasNormals (false), + myIsMirrored (false), + myHasFaceColor (false) +{ + TopoDS_Shape aShape; + if (!XCAFDoc_ShapeTool::GetShape (theLabel, aShape) + || aShape.IsNull()) + { + return; + } + + aShape.Location (theLocation); + myFaceIter.Init (aShape, TopAbs_FACE); + + if (theToMapColors) + { + dispatchStyles (theLabel, theLocation, theStyle); + } + + Next(); +} + +// ======================================================================= +// function : dispatchStyles +// purpose : +// ======================================================================= +void RWMesh_FaceIterator::dispatchStyles (const TDF_Label& theLabel, + const TopLoc_Location& theLocation, + const XCAFPrs_Style& theStyle) +{ + TopLoc_Location aDummyLoc; + XCAFPrs_IndexedDataMapOfShapeStyle aStyles; + XCAFPrs::CollectStyleSettings (theLabel, aDummyLoc, aStyles); + + Standard_Integer aNbTypes[TopAbs_SHAPE] = {}; + for (Standard_Integer aTypeIter = TopAbs_FACE; aTypeIter >= TopAbs_COMPOUND; --aTypeIter) + { + if (aTypeIter != TopAbs_FACE + && aNbTypes[aTypeIter] == 0) + { + continue; + } + + for (XCAFPrs_IndexedDataMapOfShapeStyle::Iterator aStyleIter (aStyles); aStyleIter.More(); aStyleIter.Next()) + { + const TopoDS_Shape& aKeyShape = aStyleIter.Key(); + const TopAbs_ShapeEnum aKeyShapeType = aKeyShape.ShapeType(); + if (aTypeIter == TopAbs_FACE) + { + ++aNbTypes[aKeyShapeType]; + } + if (aTypeIter != aKeyShapeType) + { + continue; + } + + XCAFPrs_Style aCafStyle = aStyleIter.Value(); + if (!aCafStyle.IsSetColorCurv() + && theStyle.IsSetColorCurv()) + { + aCafStyle.SetColorCurv (theStyle.GetColorCurv()); + } + if (!aCafStyle.IsSetColorSurf() + && theStyle.IsSetColorSurf()) + { + aCafStyle.SetColorSurf (theStyle.GetColorSurfRGBA()); + } + if (aCafStyle.Material().IsNull() + && !theStyle.Material().IsNull()) + { + aCafStyle.SetMaterial (theStyle.Material()); + } + + TopoDS_Shape aKeyShapeLocated = aKeyShape.Located (theLocation); + if (aKeyShapeType == TopAbs_FACE) + { + myStyles.Bind (aKeyShapeLocated, aCafStyle); + } + else + { + for (TopExp_Explorer aFaceIter (aKeyShapeLocated, TopAbs_FACE); aFaceIter.More(); aFaceIter.Next()) + { + if (!myStyles.IsBound (aFaceIter.Current())) + { + myStyles.Bind (aFaceIter.Current(), aCafStyle); + } + } + } + } + } +} + +// ======================================================================= +// function : normal +// purpose : +// ======================================================================= +gp_Dir RWMesh_FaceIterator::normal (Standard_Integer theNode) +{ + gp_Dir aNormal (gp::DZ()); + if (myNormals != NULL) + { + const Standard_Integer aNodeIndex = theNode - myNodes->Lower(); + const Graphic3d_Vec3 aNormVec3 (myNormals->Value (myNormals->Lower() + aNodeIndex * 3), + myNormals->Value (myNormals->Lower() + aNodeIndex * 3 + 1), + myNormals->Value (myNormals->Lower() + aNodeIndex * 3 + 2)); + if (aNormVec3.Modulus() != 0.0f) + { + aNormal.SetCoord (aNormVec3.x(), aNormVec3.y(), aNormVec3.z()); + } + } + else if (myHasNormals + && myNodeUVs != NULL) + { + const gp_XY& anUV = myNodeUVs->Value (theNode).XY(); + mySLTool.SetParameters (anUV.X(), anUV.Y()); + if (mySLTool.IsNormalDefined()) + { + aNormal = mySLTool.Normal(); + } + } + return aNormal; +} + +// ======================================================================= +// function : Next +// purpose : +// ======================================================================= +void RWMesh_FaceIterator::Next() +{ + for (; myFaceIter.More(); myFaceIter.Next()) + { + myFace = TopoDS::Face (myFaceIter.Current()); + myPolyTriang = BRep_Tool::Triangulation (myFace, myFaceLocation); + myTrsf = myFaceLocation.Transformation(); + if (myPolyTriang.IsNull() + || myPolyTriang->Triangles().Length() == 0) + { + resetFace(); + continue; + } + + initFace(); + myFaceIter.Next(); + return; + } + + resetFace(); +} + +// ======================================================================= +// function : initFace +// purpose : +// ======================================================================= +void RWMesh_FaceIterator::initFace() +{ + myHasNormals = false; + myHasFaceColor = false; + myIsMirrored = myTrsf.VectorialPart().Determinant() < 0.0; + myNormals = NULL; + myNodeUVs = NULL; + + myNodes = &myPolyTriang->Nodes(); + if (myPolyTriang->HasNormals()) + { + myNormals = &myPolyTriang->Normals(); + myHasNormals = true; + } + if (myPolyTriang->HasUVNodes()) + { + myNodeUVs = &myPolyTriang->UVNodes(); + if (!myHasNormals) + { + TopoDS_Face aFaceFwd = TopoDS::Face (myFace.Oriented (TopAbs_FORWARD)); + aFaceFwd.Location (TopLoc_Location()); + TopLoc_Location aLoc; + if (!BRep_Tool::Surface (aFaceFwd, aLoc).IsNull()) + { + myFaceAdaptor.Initialize (aFaceFwd, false); + mySLTool.SetSurface (myFaceAdaptor); + myHasNormals = true; + } + } + } + if (!myToMapColors) + { + return; + } + + if (!myStyles.Find (myFace, myFaceStyle)) + { + myFaceStyle = myDefStyle; + } + + if (!myFaceStyle.Material().IsNull()) + { + myHasFaceColor = true; + myFaceColor = myFaceStyle.Material()->BaseColor(); + } + else if (myFaceStyle.IsSetColorSurf()) + { + myHasFaceColor = true; + myFaceColor = myFaceStyle.GetColorSurfRGBA(); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_FaceIterator.hxx opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_FaceIterator.hxx --- opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_FaceIterator.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_FaceIterator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,205 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWMesh_FaceIterator_HeaderFile +#define _RWMesh_FaceIterator_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +class TDF_Label; + +//! Auxiliary class to iterate through triangulated faces. +class RWMesh_FaceIterator +{ +public: + + //! Main constructor. + Standard_EXPORT RWMesh_FaceIterator (const TDF_Label& theLabel, + const TopLoc_Location& theLocation, + const Standard_Boolean theToMapColors = false, + const XCAFPrs_Style& theStyle = XCAFPrs_Style()); + + //! Return true if iterator points to the valid triangulation. + bool More() const { return !myPolyTriang.IsNull(); } + + //! Find next value. + Standard_EXPORT void Next(); + + //! Return current face. + const TopoDS_Face& Face() const { return myFace; } + + //! Return current face triangulation. + const Handle(Poly_Triangulation)& Triangulation() const { return myPolyTriang; } + + //! Return true if mesh data is defined. + bool IsEmptyMesh() const + { + return myPolyTriang.IsNull() + || (myPolyTriang->NbNodes() < 1 && myPolyTriang->NbTriangles() < 1); + } + +public: + + //! Return face material. + const XCAFPrs_Style& FaceStyle() const { return myFaceStyle; } + + //! Return TRUE if face color is set. + bool HasFaceColor() const { return myHasFaceColor; } + + //! Return face color. + const Quantity_ColorRGBA& FaceColor() const { return myFaceColor; } + +public: + + //! Return number of elements of specific type for the current face. + Standard_Integer NbTriangles() const { return myPolyTriang->NbTriangles(); } + + //! Lower element index in current triangulation. + Standard_Integer ElemLower() const { return myPolyTriang->Triangles().Lower(); } + + //! Upper element index in current triangulation. + Standard_Integer ElemUpper() const { return myPolyTriang->Triangles().Upper(); } + + //! Return triangle with specified index with applied Face orientation. + Poly_Triangle TriangleOriented (Standard_Integer theElemIndex) const + { + Poly_Triangle aTri = triangle (theElemIndex); + if ((myFace.Orientation() == TopAbs_REVERSED) ^ myIsMirrored) + { + return Poly_Triangle (aTri.Value (1), aTri.Value (3), aTri.Value (2)); + } + return aTri; + } + +public: + + //! Return true if triangulation has defined normals. + bool HasNormals() const { return myHasNormals; } + + //! Return true if triangulation has defined normals. + bool HasTexCoords() const { return myNodeUVs != NULL; } + + //! Return normal at specified node index with face transformation applied and face orientation applied. + gp_Dir NormalTransformed (Standard_Integer theNode) + { + gp_Dir aNorm = normal (theNode); + if (myTrsf.Form() != gp_Identity) + { + aNorm.Transform (myTrsf); + } + if (myFace.Orientation() == TopAbs_REVERSED) + { + aNorm.Reverse(); + } + return aNorm; + } + + //! Return number of nodes for the current face. + Standard_Integer NbNodes() const + { + return !myPolyTriang.IsNull() + ? myPolyTriang->Nodes().Length() + : 0; + } + + //! Lower node index in current triangulation. + Standard_Integer NodeLower() const { return myPolyTriang->Nodes().Lower(); } + + //! Upper node index in current triangulation. + Standard_Integer NodeUpper() const { return myPolyTriang->Nodes().Upper(); } + + //! Return the node with specified index with applied transformation. + gp_Pnt NodeTransformed (const Standard_Integer theNode) const + { + gp_Pnt aNode = node (theNode); + aNode.Transform (myTrsf); + return aNode; + } + + //! Return texture coordinates for the node. + gp_Pnt2d NodeTexCoord (const Standard_Integer theNode) const + { + return myNodeUVs != NULL ? myNodeUVs->Value (theNode) : gp_Pnt2d(); + } + +public: + + //! Return the node with specified index with applied transformation. + gp_Pnt node (const Standard_Integer theNode) const { return myPolyTriang->Nodes().Value (theNode); } + + //! Return normal at specified node index without face transformation applied. + Standard_EXPORT gp_Dir normal (Standard_Integer theNode); + + //! Return triangle with specified index. + Poly_Triangle triangle (Standard_Integer theElemIndex) const { return myPolyTriang->Triangles().Value (theElemIndex); } + +private: + + //! Dispatch face styles. + void dispatchStyles (const TDF_Label& theLabel, + const TopLoc_Location& theLocation, + const XCAFPrs_Style& theStyle); + + //! Reset information for current face. + void resetFace() + { + myPolyTriang.Nullify(); + myFace.Nullify(); + myNodes = NULL; + myNormals = NULL; + myNodeUVs = NULL; + myHasNormals = false; + myHasFaceColor = false; + myFaceColor = Quantity_ColorRGBA(); + myFaceStyle = XCAFPrs_Style(); + } + + //! Initialize face properties. + void initFace(); + +private: + + NCollection_DataMap + myStyles; //!< Face -> Style map + XCAFPrs_Style myDefStyle; //!< default style for faces without dedicated style + Standard_Boolean myToMapColors; //!< flag to dispatch styles + + TopExp_Explorer myFaceIter; //!< face explorer + TopoDS_Face myFace; //!< current face + Handle(Poly_Triangulation) myPolyTriang; //!< triangulation of current face + TopLoc_Location myFaceLocation; //!< current face location + BRepLProp_SLProps mySLTool; //!< auxiliary tool for fetching normals from surface + BRepAdaptor_Surface myFaceAdaptor; //!< surface adaptor for fetching normals from surface + const TColgp_Array1OfPnt* myNodes; //!< node positions of current face + const TShort_Array1OfShortReal* myNormals; //!< node normals of current face + const TColgp_Array1OfPnt2d* myNodeUVs; //!< node UV coordinates of current face + Standard_Boolean myHasNormals; //!< flag indicating that current face has normals + gp_Trsf myTrsf; //!< current face transformation + Standard_Boolean myIsMirrored; //!< flag indicating that face triangles should be mirrored + XCAFPrs_Style myFaceStyle; //!< current face style + Quantity_ColorRGBA myFaceColor; //!< current face color + Standard_Boolean myHasFaceColor; //!< flag indicating that current face has assigned color + +}; + +#endif // _RWMesh_FaceIterator_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_MaterialMap.cxx opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_MaterialMap.cxx --- opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_MaterialMap.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_MaterialMap.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,239 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +// ======================================================================= +// function : RWMesh_MaterialMap +// purpose : +// ======================================================================= +RWMesh_MaterialMap::RWMesh_MaterialMap (const TCollection_AsciiString& theFile) +: myFileName (theFile), + myKeyPrefix ("mat_"), + myNbMaterials (0), + myIsFailed (false), + myMatNameAsKey (true) +{ + TCollection_AsciiString aFileName, aFileExt; + OSD_Path::FolderAndFileFromPath (theFile, myFolder, aFileName); + OSD_Path::FileNameAndExtension (aFileName, myShortFileNameBase, aFileExt); +} + +// ======================================================================= +// function : ~RWMesh_MaterialMap +// purpose : +// ======================================================================= +RWMesh_MaterialMap::~RWMesh_MaterialMap() +{ + // +} + +// ======================================================================= +// function : AddMaterial +// purpose : +// ======================================================================= +TCollection_AsciiString RWMesh_MaterialMap::AddMaterial (const XCAFPrs_Style& theStyle) +{ + if (myStyles.IsBound1 (theStyle)) + { + return myStyles.Find1 (theStyle); + } + + TCollection_AsciiString aMatKey, aMatName, aMatNameSuffix; + int aCounter = 0; + int* aCounterPtr = &myNbMaterials; + if (myMatNameAsKey) + { + if (!theStyle.Material().IsNull() + && !theStyle.Material()->IsEmpty()) + { + aCounterPtr = &aCounter; + Handle(TDataStd_Name) aNodeName; + if (!theStyle.Material()->Label().IsNull() + && theStyle.Material()->Label().FindAttribute (TDataStd_Name::GetID(), aNodeName)) + { + aMatName = aNodeName->Get(); + } + else + { + aMatName = "mat"; + } + aMatNameSuffix = aMatName; + } + else + { + ++myNbMaterials; + aMatNameSuffix = myKeyPrefix; + aMatName = aMatNameSuffix + myNbMaterials; + } + aMatKey = aMatName; + } + else + { + aMatKey = myNbMaterials++; // starts from 0 + aMatNameSuffix = myKeyPrefix; + aMatName = aMatNameSuffix + aMatKey; + } + + for (;; ++(*aCounterPtr)) + { + if (myStyles.IsBound2 (aMatKey)) + { + if (myMatNameAsKey) + { + aMatName = aMatNameSuffix + (*aCounterPtr); + aMatKey = aMatName; + } + else + { + aMatKey = *aCounterPtr; + aMatName = aMatNameSuffix + aMatKey; + } + continue; + } + break; + } + + myStyles.Bind (theStyle, aMatKey); + DefineMaterial (theStyle, aMatKey, aMatName); + return aMatKey; +} + +// ======================================================================= +// function : copyFileTo +// purpose : +// ======================================================================= +bool RWMesh_MaterialMap::copyFileTo (const TCollection_AsciiString& theFileSrc, + const TCollection_AsciiString& theFileDst) +{ + if (theFileSrc.IsEmpty() + || theFileDst.IsEmpty()) + { + return false; + } + else if (theFileSrc == theFileDst) + { + return true; + } + + try + { + OSD_Path aSrcPath (theFileSrc); + OSD_Path aDstPath (theFileDst); + OSD_File aFileSrc (aSrcPath); + if (!aFileSrc.Exists()) + { + Message::SendFail (TCollection_AsciiString("Failed to copy file - source file '") + theFileSrc + "' does not exist"); + return false; + } + aFileSrc.Copy (aDstPath); + return !aFileSrc.Failed(); + } + catch (Standard_Failure const& theException) + { + Message::SendFail (TCollection_AsciiString("Failed to copy file\n") + theException.GetMessageString()); + return false; + } +} + +// ======================================================================= +// function : CopyTexture +// purpose : +// ======================================================================= +bool RWMesh_MaterialMap::CopyTexture (TCollection_AsciiString& theResTexture, + const Handle(Image_Texture)& theTexture, + const TCollection_AsciiString& theKey) +{ + CreateTextureFolder(); + + TCollection_AsciiString aTexFileName; + TCollection_AsciiString aTextureSrc = theTexture->FilePath(); + if (!aTextureSrc.IsEmpty() + && theTexture->FileOffset() <= 0 + && theTexture->FileLength() <= 0) + { + TCollection_AsciiString aSrcTexFolder; + OSD_Path::FolderAndFileFromPath (aTextureSrc, aSrcTexFolder, aTexFileName); + const TCollection_AsciiString aResTexFile = myTexFolder + aTexFileName; + theResTexture = myTexFolderShort + aTexFileName; + return copyFileTo (aTextureSrc, aResTexFile); + } + + TCollection_AsciiString anExt = theTexture->ProbeImageFileFormat(); + if (anExt.IsEmpty()) + { + anExt = "bin"; + } + aTexFileName = theKey + "." + anExt; + + const TCollection_AsciiString aResTexFile = myTexFolder + aTexFileName; + theResTexture = myTexFolderShort + aTexFileName; + return theTexture->WriteImage (aResTexFile); +} + +// ======================================================================= +// function : CreateTextureFolder +// purpose : +// ======================================================================= +bool RWMesh_MaterialMap::CreateTextureFolder() +{ + if (!myTexFolder.IsEmpty()) + { + return true; + } + + myTexFolderShort = myShortFileNameBase + "_textures/"; + myTexFolder = myFolder + "/" + myTexFolderShort; + OSD_Path aTexFolderPath (myTexFolder); + OSD_Directory aTexDir (aTexFolderPath); + if (aTexDir.Exists()) + { + return true; + } + + OSD_Path aResFolderPath (myFolder); + OSD_Directory aResDir (aResFolderPath); + if (!aResDir.Exists()) + { + return false; + } + const OSD_Protection aParentProt = aResDir.Protection(); + OSD_Protection aProt = aParentProt; + if (aProt.User() == OSD_None) + { + aProt.SetUser (OSD_RWXD); + } + if (aProt.System() == OSD_None) + { + aProt.SetSystem (OSD_RWXD); + } + + aTexDir.Build (aProt); + if (aTexDir.Failed()) + { + // fallback to the same folder as output model file + myTexFolder = myFolder; + myTexFolderShort.Clear(); + return true; + } + return true; +} diff -Nru opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_MaterialMap.hxx opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_MaterialMap.hxx --- opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_MaterialMap.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_MaterialMap.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,101 @@ +// Copyright (c) 2017-2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWMesh_MaterialMap_HeaderFile +#define _RWMesh_MaterialMap_HeaderFile + +#include +#include +#include + +//! Material manager. +//! Provides an interface for collecting all materials within the document before writing it into file, +//! and for copying associated image files (textures) into sub-folder near by exported model. +class RWMesh_MaterialMap +{ +public: + + //! Main constructor. + Standard_EXPORT RWMesh_MaterialMap (const TCollection_AsciiString& theFile); + + //! Destructor. + Standard_EXPORT virtual ~RWMesh_MaterialMap(); + + //! Return default material definition to be used for nodes with only color defined. + const XCAFPrs_Style& DefaultStyle() const { return myDefaultStyle; } + + //! Set default material definition to be used for nodes with only color defined. + void SetDefaultStyle (const XCAFPrs_Style& theStyle) { myDefaultStyle = theStyle; } + + //! Find already registered material + TCollection_AsciiString FindMaterial (const XCAFPrs_Style& theStyle) const + { + if (myStyles.IsBound1 (theStyle)) + { + return myStyles.Find1 (theStyle); + } + return TCollection_AsciiString(); + } + + //! Register material and return its name identifier. + Standard_EXPORT virtual TCollection_AsciiString AddMaterial (const XCAFPrs_Style& theStyle); + + //! Create texture folder "modelName/textures"; for example: + //! MODEL: Path/ModelName.gltf + //! IMAGES: Path/ModelName/textures/ + //! Warning! Output folder is NOT cleared. + Standard_EXPORT virtual bool CreateTextureFolder(); + + //! Copy and rename texture file to the new location. + //! @param theResTexture [out] result texture file path (relative to the model) + //! @param theTexture [in] original texture + //! @param theKey [in] material key + Standard_EXPORT virtual bool CopyTexture (TCollection_AsciiString& theResTexture, + const Handle(Image_Texture)& theTexture, + const TCollection_AsciiString& theKey); + + //! Virtual method actually defining the material (e.g. export to the file). + virtual void DefineMaterial (const XCAFPrs_Style& theStyle, + const TCollection_AsciiString& theKey, + const TCollection_AsciiString& theName) = 0; + + //! Return failed flag. + bool IsFailed() const { return myIsFailed; } + +protected: + + //! Copy file to another place. + Standard_EXPORT static bool copyFileTo (const TCollection_AsciiString& theFileSrc, + const TCollection_AsciiString& theFileDst); + +protected: + + TCollection_AsciiString myFolder; //!< output folder for glTF file + TCollection_AsciiString myTexFolder; //!< output folder for images (full path) + TCollection_AsciiString myTexFolderShort; //!< output folder for images (short path) + TCollection_AsciiString myFileName; //!< output glTF file path + TCollection_AsciiString myShortFileNameBase; //!< output glTF file name without extension + TCollection_AsciiString myKeyPrefix; //!< prefix for generated keys + NCollection_DoubleMap + myStyles; //!< map of processed styles + NCollection_Map + myImageFailMap; //!< map of images failed to be copied + XCAFPrs_Style myDefaultStyle; //!< default material definition to be used for nodes with only color defined + Standard_Integer myNbMaterials; //!< number of registered materials + Standard_Boolean myIsFailed; //!< flag indicating failure + Standard_Boolean myMatNameAsKey; //!< flag indicating usage of material name as key + +}; + +#endif // _RWMesh_MaterialMap_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_NodeAttributes.hxx opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_NodeAttributes.hxx --- opencascade-7.4.1+dfsg1/src/RWMesh/RWMesh_NodeAttributes.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWMesh/RWMesh_NodeAttributes.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,12 +20,15 @@ #include #include +class TDataStd_NamedData; + //! Attributes of the node. struct RWMesh_NodeAttributes { - TCollection_AsciiString Name; //!< name for the user - TCollection_AsciiString RawName; //!< name within low-level format structure - XCAFPrs_Style Style; //!< presentation style + TCollection_AsciiString Name; //!< name for the user + TCollection_AsciiString RawName; //!< name within low-level format structure + Handle(TDataStd_NamedData) NamedData; //!< optional metadata + XCAFPrs_Style Style; //!< presentation style }; typedef NCollection_DataMap RWMesh_NodeAttributeMap; diff -Nru opencascade-7.4.1+dfsg1/src/RWObj/RWObj_CafReader.cxx opencascade-7.5.1+dfsg1/src/RWObj/RWObj_CafReader.cxx --- opencascade-7.4.1+dfsg1/src/RWObj/RWObj_CafReader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWObj/RWObj_CafReader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,8 +14,6 @@ #include -#include - IMPLEMENT_STANDARD_RTTIEXT(RWObj_CafReader, RWMesh_CafReader) //================================================================ @@ -49,7 +47,30 @@ aShapeAttribs.Name = theName; if (theMaterial != NULL) { - aShapeAttribs.Style.SetColorSurf (Quantity_ColorRGBA (theMaterial->DiffuseColor, 1.0f - theMaterial->Transparency)); + // assign material and not color + //aShapeAttribs.Style.SetColorSurf (Quantity_ColorRGBA (theMaterial->DiffuseColor, 1.0f - theMaterial->Transparency)); + + Handle(XCAFDoc_VisMaterial) aMat = new XCAFDoc_VisMaterial(); + if (!myObjMaterialMap.Find (theMaterial->Name, aMat)) // material names are used as unique keys in OBJ + { + XCAFDoc_VisMaterialCommon aMatXde; + aMatXde.IsDefined = true; + aMatXde.AmbientColor = theMaterial->AmbientColor; + aMatXde.DiffuseColor = theMaterial->DiffuseColor; + aMatXde.SpecularColor = theMaterial->SpecularColor; + aMatXde.Shininess = theMaterial->Shininess; + aMatXde.Transparency = theMaterial->Transparency; + if (!theMaterial->DiffuseTexture.IsEmpty()) + { + aMatXde.DiffuseTexture = new Image_Texture (theMaterial->DiffuseTexture); + } + + aMat = new XCAFDoc_VisMaterial(); + aMat->SetCommonMaterial (aMatXde); + aMat->SetRawName (new TCollection_HAsciiString (theMaterial->Name)); + myObjMaterialMap.Bind (theMaterial->Name, aMat); + } + aShapeAttribs.Style.SetMaterial (aMat); } myAttribMap.Bind (theShape, aShapeAttribs); @@ -74,7 +95,7 @@ // Purpose : //================================================================ Standard_Boolean RWObj_CafReader::performMesh (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress, + const Message_ProgressRange& theProgress, const Standard_Boolean theToProbe) { Handle(RWObj_TriangulationReader) aCtx = createReaderContext(); diff -Nru opencascade-7.4.1+dfsg1/src/RWObj/RWObj_CafReader.hxx opencascade-7.5.1+dfsg1/src/RWObj/RWObj_CafReader.hxx --- opencascade-7.4.1+dfsg1/src/RWObj/RWObj_CafReader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWObj/RWObj_CafReader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,28 +36,28 @@ //! Read the mesh from specified file. Standard_EXPORT virtual Standard_Boolean performMesh (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress, + const Message_ProgressRange& theProgress, const Standard_Boolean theToProbe) Standard_OVERRIDE; protected: //! Create reader context. //! Can be overridden by sub-class to read triangulation into application-specific data structures instead of Poly_Triangulation. - virtual Handle(RWObj_TriangulationReader) createReaderContext(); + Standard_EXPORT virtual Handle(RWObj_TriangulationReader) createReaderContext(); //! @param theShape shape to register //! @param theName shape name //! @param theMaterial shape material //! @param theIsRootShape indicates that this is a root object (free shape) - virtual void BindNamedShape (const TopoDS_Shape& theShape, - const TCollection_AsciiString& theName, - const RWObj_Material* theMaterial, - const Standard_Boolean theIsRootShape) Standard_OVERRIDE; + Standard_EXPORT virtual void BindNamedShape (const TopoDS_Shape& theShape, + const TCollection_AsciiString& theName, + const RWObj_Material* theMaterial, + const Standard_Boolean theIsRootShape) Standard_OVERRIDE; protected: + NCollection_DataMap myObjMaterialMap; Standard_Boolean myIsSinglePrecision; //!< flag for reading vertex data with single or double floating point precision - }; #endif // _RWObj_CafReader_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWObj/RWObj.cxx opencascade-7.5.1+dfsg1/src/RWObj/RWObj.cxx --- opencascade-7.4.1+dfsg1/src/RWObj/RWObj.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWObj/RWObj.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,7 +21,7 @@ //purpose : //============================================================================= Handle(Poly_Triangulation) RWObj::ReadFile (const Standard_CString theFile, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { RWObj_TriangulationReader aReader; aReader.SetCreateShapes (Standard_False); diff -Nru opencascade-7.4.1+dfsg1/src/RWObj/RWObj.hxx opencascade-7.5.1+dfsg1/src/RWObj/RWObj.hxx --- opencascade-7.4.1+dfsg1/src/RWObj/RWObj.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWObj/RWObj.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,7 +15,7 @@ #ifndef _RWObj_HeaderFile #define _RWObj_HeaderFile -#include +#include #include #include #include @@ -28,7 +28,7 @@ //! Read specified OBJ file and returns its content as triangulation. //! In case of error, returns Null handle. Standard_EXPORT static Handle(Poly_Triangulation) ReadFile (const Standard_CString theFile, - const Handle(Message_ProgressIndicator)& aProgInd = NULL); + const Message_ProgressRange& aProgress = Message_ProgressRange()); }; diff -Nru opencascade-7.4.1+dfsg1/src/RWObj/RWObj_Material.hxx opencascade-7.5.1+dfsg1/src/RWObj/RWObj_Material.hxx --- opencascade-7.4.1+dfsg1/src/RWObj/RWObj_Material.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWObj/RWObj_Material.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,9 +32,9 @@ Standard_ShortReal Transparency; RWObj_Material() - : AmbientColor (0.1, 0.1, 0.1, Quantity_TOC_RGB), - DiffuseColor (0.8, 0.8, 0.8, Quantity_TOC_RGB), - SpecularColor(0.2, 0.2, 0.2, Quantity_TOC_RGB), + : AmbientColor (0.1, 0.1, 0.1, Quantity_TOC_sRGB), + DiffuseColor (0.8, 0.8, 0.8, Quantity_TOC_sRGB), + SpecularColor(0.2, 0.2, 0.2, Quantity_TOC_sRGB), Shininess (1.0f), Transparency (0.0f) {} diff -Nru opencascade-7.4.1+dfsg1/src/RWObj/RWObj_MtlReader.cxx opencascade-7.5.1+dfsg1/src/RWObj/RWObj_MtlReader.cxx --- opencascade-7.4.1+dfsg1/src/RWObj/RWObj_MtlReader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWObj/RWObj_MtlReader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -114,7 +114,7 @@ myFile = OSD_OpenFile (myPath.ToCString(), "rb"); if (myFile == NULL) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("OBJ material file '") + myPath + "' is not found!", Message_Warning); + Message::Send (TCollection_AsciiString ("OBJ material file '") + myPath + "' is not found!", Message_Warning); return Standard_False; } @@ -164,7 +164,7 @@ aMat = RWObj_Material(); if (!RWObj_Tools::ReadName (aPos, aMatName)) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Empty OBJ material at line ") + myNbLines + " in file " + myPath, Message_Warning); + Message::SendWarning (TCollection_AsciiString("Empty OBJ material at line ") + myNbLines + " in file " + myPath); } } else if (::memcmp (aPos, "Ka", 2) == 0 @@ -177,7 +177,7 @@ aPos = aNext; if (validateColor (aColor)) { - aMat.AmbientColor = Quantity_Color (aColor.r(), aColor.g(), aColor.b(), Quantity_TOC_RGB); + aMat.AmbientColor = Quantity_Color (aColor.r(), aColor.g(), aColor.b(), Quantity_TOC_sRGB); hasAspect = true; } } @@ -191,7 +191,7 @@ aPos = aNext; if (validateColor (aColor)) { - aMat.DiffuseColor = Quantity_Color (aColor.r(), aColor.g(), aColor.b(), Quantity_TOC_RGB); + aMat.DiffuseColor = Quantity_Color (aColor.r(), aColor.g(), aColor.b(), Quantity_TOC_sRGB); hasAspect = true; } } @@ -205,7 +205,7 @@ aPos = aNext; if (validateColor (aColor)) { - aMat.SpecularColor = Quantity_Color (aColor.r(), aColor.g(), aColor.b(), Quantity_TOC_RGB); + aMat.SpecularColor = Quantity_Color (aColor.r(), aColor.g(), aColor.b(), Quantity_TOC_sRGB); hasAspect = true; } } @@ -319,8 +319,8 @@ { if (OSD_Path::IsAbsolutePath (theTexturePath.ToCString())) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("OBJ file specifies absolute path to the texture image file which may be inaccessible on another device\n") - + theTexturePath, Message_Warning); + Message::SendWarning (TCollection_AsciiString("OBJ file specifies absolute path to the texture image file which may be inaccessible on another device\n") + + theTexturePath); if (!OSD_File (theTexturePath).Exists()) { // workaround absolute filenames - try to find the same file at the OBJ file location @@ -346,7 +346,7 @@ if (theValue < 0.0 || theValue > 1.0) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Invalid scalar in OBJ material at line ") + myNbLines + " in file " + myPath, Message_Warning); + Message::SendWarning (TCollection_AsciiString("Invalid scalar in OBJ material at line ") + myNbLines + " in file " + myPath); return false; } return true; @@ -362,7 +362,7 @@ || theVec.g() < 0.0f || theVec.g() > 1.0f || theVec.b() < 0.0f || theVec.b() > 1.0f) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Invalid color in OBJ material at line ") + myNbLines + " in file " + myPath, Message_Warning); + Message::SendWarning (TCollection_AsciiString("Invalid color in OBJ material at line ") + myNbLines + " in file " + myPath); return false; } return true; diff -Nru opencascade-7.4.1+dfsg1/src/RWObj/RWObj_Reader.cxx opencascade-7.5.1+dfsg1/src/RWObj/RWObj_Reader.cxx --- opencascade-7.4.1+dfsg1/src/RWObj/RWObj_Reader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWObj/RWObj_Reader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,13 +21,14 @@ #include #include #include -#include +#include #include #include #include #include #include #include +#include #include #include @@ -44,25 +45,18 @@ namespace { + // The length of buffer to read (in bytes) + static const size_t THE_BUFFER_SIZE = 4 * 1024; //! Simple wrapper. struct RWObj_ReaderFile { FILE* File; - NCollection_Array1 Line; - Standard_Integer LineBuffLen; - Standard_Integer MaxLineLen; - int64_t Position; int64_t FileLen; //! Constructor opening the file. - RWObj_ReaderFile (const TCollection_AsciiString& theFile, - const Standard_Integer theMaxLineLen = 256) + RWObj_ReaderFile (const TCollection_AsciiString& theFile) : File (OSD_OpenFile (theFile.ToCString(), "rb")), - Line (0, theMaxLineLen - 1), - LineBuffLen (theMaxLineLen), - MaxLineLen (theMaxLineLen), - Position (0), FileLen (0) { if (this->File != NULL) @@ -82,59 +76,6 @@ ::fclose (File); } } - - //! Read line, also considers multi-line syntax (when last line symbol is slash). - bool ReadLine() - { - int64_t aPosPrev = this->Position; - char* aLine = &Line.ChangeFirst(); - for (; ::feof (this->File) == 0 && ::fgets (aLine, MaxLineLen - 1, this->File) != NULL; ) - { - const int64_t aPosNew = ::ftell64 (this->File); - if (aLine[0] == '#') - { - Position = aPosNew; - return true; - } - - const Standard_Integer aNbRead = Standard_Integer(aPosNew - aPosPrev); - bool toReadMore = false; - for (int aTailIter = aNbRead - 1; aTailIter >= 0; --aTailIter) - { - if (aLine[aTailIter] != '\n' - && aLine[aTailIter] != '\r' - && aLine[aTailIter] != '\0') - { - if (aLine[aTailIter] == '\\') - { - // multi-line syntax - aLine[aTailIter] = ' '; - const ptrdiff_t aFullLen = aLine + aTailIter + 1 - &this->Line.First(); - if (LineBuffLen < aFullLen + MaxLineLen) - { - LineBuffLen += MaxLineLen; - this->Line.Resize (0, LineBuffLen - 1, true); - } - aLine = &this->Line.ChangeFirst() + aFullLen; - toReadMore = true; - break; - } - break; - } - } - - if (toReadMore) - { - aPosPrev = aPosNew; - continue; - } - - Position = aPosNew; - return true; - } - return false; - } - }; //! Return TRUE if given polygon has clockwise node order. @@ -176,7 +117,7 @@ // Purpose : // ================================================================ Standard_Boolean RWObj_Reader::read (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress, + const Message_ProgressRange& theProgress, const Standard_Boolean theToProbe) { myMemEstim = 0; @@ -203,7 +144,7 @@ RWObj_ReaderFile aFile (theFile); if (aFile.File == NULL) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: file '") + theFile + "' is not found!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: file '") + theFile + "' is not found"); return Standard_False; } @@ -211,30 +152,43 @@ const int64_t aFileLen = aFile.FileLen; if (aFileLen <= 0L) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: file '") + theFile + "' is empty!", Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: file '") + theFile + "' is empty"); return Standard_False; } + Standard_ReadLineBuffer aBuffer (THE_BUFFER_SIZE); + aBuffer.SetMultilineMode (true); + const Standard_Integer aNbMiBTotal = Standard_Integer(aFileLen / (1024 * 1024)); Standard_Integer aNbMiBPassed = 0; - Message_ProgressSentry aPSentry (theProgress, "Reading text OBJ file", 0, aNbMiBTotal, 1); + Message_ProgressScope aPS (theProgress, "Reading text OBJ file", aNbMiBTotal); OSD_Timer aTimer; aTimer.Start(); bool isStart = true; - for (; aFile.ReadLine(); ) + int64_t aPosition = 0; + size_t aLineLen = 0; + int64_t aReadBytes = 0; + const char* aLine = NULL; + for (;;) { + aLine = aBuffer.ReadLine (aFile.File, aLineLen, aReadBytes); + if (aLine == NULL) + { + break; + } ++myNbLines; - const char* aLine = &aFile.Line.First(); + aPosition += aReadBytes; if (aTimer.ElapsedTime() > 1.0) { - if (!aPSentry.More()) + if (!aPS.More()) { return false; } - const Standard_Integer aNbMiBRead = Standard_Integer(aFile.Position / (1024 * 1024)); - for (; aNbMiBPassed < aNbMiBRead; ++aNbMiBPassed) { aPSentry.Next(); } + const Standard_Integer aNbMiBRead = Standard_Integer(aPosition / (1024 * 1024)); + aPS.Next (aNbMiBRead - aNbMiBPassed); + aNbMiBPassed = aNbMiBRead; aTimer.Reset(); aTimer.Start(); } @@ -267,9 +221,9 @@ if (theToProbe) { - if (::memcmp (aLine, "mtllib", 6) == 0) + if (::strncmp (aLine, "mtllib", 6) == 0) { - readMaterialLib (aLine + 7); + readMaterialLib (IsSpace (aLine[6]) ? aLine + 7 : ""); } else if (aLine[0] == 'v' && RWObj_Tools::isSpaceChar (aLine[1])) { @@ -316,13 +270,13 @@ { pushObject (aLine + 2); } - else if (::memcmp (aLine, "mtllib", 6) == 0) + else if (::strncmp (aLine, "mtllib", 6) == 0) { - readMaterialLib (aLine + 7); + readMaterialLib (IsSpace (aLine[6]) ? aLine + 7 : ""); } - else if (::memcmp (aLine, "usemtl", 6) == 0) + else if (::strncmp (aLine, "usemtl", 6) == 0) { - pushMaterial (aLine + 7); + pushMaterial (IsSpace (aLine[6]) ? aLine + 7 : ""); } if (!checkMemory()) @@ -357,11 +311,9 @@ } if (myNbElemsBig != 0) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Warning: OBJ reader, ") + myNbElemsBig - + " polygon(s) have been split into triangles.", Message_Warning); + Message::SendWarning (TCollection_AsciiString("Warning: OBJ reader, ") + myNbElemsBig + " polygon(s) have been split into triangles"); } - for (; aNbMiBPassed < aNbMiBTotal; ++aNbMiBPassed) { aPSentry.Next(); } return true; } @@ -433,8 +385,7 @@ if (a3Indices[0] < myObjVerts.Lower() || a3Indices[0] > myObjVerts.Upper()) { myToAbort = true; - Message::DefaultMessenger()->Send (TCollection_AsciiString("Error: invalid OBJ syntax at line ") + myNbLines - + ": vertex index is out of range.", Message_Fail); + Message::SendFail (TCollection_AsciiString("Error: invalid OBJ syntax at line ") + myNbLines + ": vertex index is out of range"); return; } @@ -444,13 +395,13 @@ { if (myObjVertsUV.IsEmpty()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Warning: invalid OBJ syntax at line ") + myNbLines - + ": UV index is specified but no UV nodes are defined.", Message_Warning); + Message::SendWarning (TCollection_AsciiString("Warning: invalid OBJ syntax at line ") + myNbLines + + ": UV index is specified but no UV nodes are defined"); } else if (a3Indices[1] < myObjVertsUV.Lower() || a3Indices[1] > myObjVertsUV.Upper()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Warning: invalid OBJ syntax at line ") + myNbLines - + ": UV index is out of range.", Message_Warning); + Message::SendWarning (TCollection_AsciiString("Warning: invalid OBJ syntax at line ") + myNbLines + + ": UV index is out of range"); setNodeUV (anIndex,Graphic3d_Vec2 (0.0f, 0.0f)); } else @@ -462,13 +413,13 @@ { if (myObjNorms.IsEmpty()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Warning: invalid OBJ syntax at line ") + myNbLines - + ": Normal index is specified but no Normals nodes are defined.", Message_Warning); + Message::SendWarning (TCollection_AsciiString("Warning: invalid OBJ syntax at line ") + myNbLines + + ": Normal index is specified but no Normals nodes are defined"); } else if (a3Indices[2] < myObjNorms.Lower() || a3Indices[2] > myObjNorms.Upper()) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Warning: invalid OBJ syntax at line ") + myNbLines - + ": Normal index is out of range.", Message_Warning); + Message::SendWarning (TCollection_AsciiString("Warning: invalid OBJ syntax at line ") + myNbLines + + ": Normal index is out of range"); setNodeNormal (anIndex, Graphic3d_Vec3 (0.0f, 0.0f, 1.0f)); } else @@ -696,8 +647,7 @@ } catch (Standard_Failure const& theFailure) { - Message::DefaultMessenger()->Send (TCollection_AsciiString ("Error: exception raised during polygon split\n[") - + theFailure.GetMessageString() + "]", Message_Warning); + Message::SendWarning (TCollection_AsciiString ("Error: exception raised during polygon split\n[") + theFailure.GetMessageString() + "]"); } return triangulatePolygonFan (theIndices); } @@ -751,6 +701,14 @@ { aNewSmoothGroup.Clear(); } + if (myActiveSubMesh.SmoothGroup.IsEqual (aNewSmoothGroup)) + { + // Ignore duplicated statements to workaround some weird OBJ files. + // Note that smooth groups are handled in different manner than groups and objects, + // which always flushed even with equal names. + return; + } + if (addMesh (myActiveSubMesh, RWObj_SubMeshReason_NewSmoothGroup)) { myPackedIndices.Clear(); // vertices might be duplicated after this point... @@ -771,8 +729,7 @@ } else if (!myMaterials.IsBound (aNewMat)) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Warning: use of undefined OBJ material at line ") - + myNbLines, Message_Warning); + Message::SendWarning (TCollection_AsciiString("Warning: use of undefined OBJ material at line ") + myNbLines); return; } if (myActiveSubMesh.Material.IsEqual (aNewMat)) @@ -797,8 +754,7 @@ TCollection_AsciiString aMatPath; if (!RWObj_Tools::ReadName (theFileName, aMatPath)) { - Message::DefaultMessenger()->Send (TCollection_AsciiString("Warning: invalid OBJ syntax at line ") - + myNbLines, Message_Warning); + Message::SendWarning (TCollection_AsciiString("Warning: invalid OBJ syntax at line ") + myNbLines); return; } @@ -821,9 +777,9 @@ return true; } - Message::DefaultMessenger()->Send (TCollection_AsciiString("Error: OBJ file content does not fit into ") - + Standard_Integer(myMemLimitBytes / (1024 * 1024)) + " MiB limit." - + "\nMesh data will be truncated.", Message_Fail); + Message::SendFail (TCollection_AsciiString("Error: OBJ file content does not fit into ") + + Standard_Integer(myMemLimitBytes / (1024 * 1024)) + " MiB limit." + + "\nMesh data will be truncated."); myToAbort = true; return false; } diff -Nru opencascade-7.4.1+dfsg1/src/RWObj/RWObj_Reader.hxx opencascade-7.5.1+dfsg1/src/RWObj/RWObj_Reader.hxx --- opencascade-7.4.1+dfsg1/src/RWObj/RWObj_Reader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWObj/RWObj_Reader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include #include @@ -54,7 +54,7 @@ //! Unicode paths can be given in UTF-8 encoding. //! Returns true if success, false on error or user break. Standard_Boolean Read (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { return read (theFile, theProgress, Standard_False); } @@ -66,7 +66,7 @@ //! @return TRUE if success, FALSE on error or user break. //! @sa FileComments(), ExternalFiles(), NbProbeNodes(), NbProbeElems(). Standard_Boolean Probe (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { return read (theFile, theProgress, Standard_True); } @@ -110,7 +110,7 @@ //! Unicode paths can be given in UTF-8 encoding. //! Returns true if success, false on error or user break. Standard_EXPORT Standard_Boolean read (const TCollection_AsciiString& theFile, - const Handle(Message_ProgressIndicator)& theProgress, + const Message_ProgressRange& theProgress, const Standard_Boolean theToProbe); //! @name interface methods which should be implemented by sub-class diff -Nru opencascade-7.4.1+dfsg1/src/RWStepAP214/RWStepAP214_GeneralModule.cxx opencascade-7.5.1+dfsg1/src/RWStepAP214/RWStepAP214_GeneralModule.cxx --- opencascade-7.4.1+dfsg1/src/RWStepAP214/RWStepAP214_GeneralModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepAP214/RWStepAP214_GeneralModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -532,8 +532,12 @@ #include #include #include +#include +#include +#include #include #include +#include #include #include #include @@ -1084,8 +1088,12 @@ #include #include #include +#include +#include +#include #include #include +#include #include #include #include @@ -1343,8 +1351,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -1355,8 +1363,8 @@ #include #include #include -#include -#include +#include +#include static Standard_Integer catsh,catdr,catstr,catdsc,cataux; @@ -5124,8 +5132,8 @@ break; case 715: { - DeclareAndCast(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation, anent, ent); - RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation tool; + DeclareAndCast(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel, anent, ent); + RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel tool; tool.Share(anent, iter); } break; @@ -5152,8 +5160,36 @@ break; case 719: { - DeclareAndCast(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem, anent, ent); - RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem tool; + DeclareAndCast(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem, anent, ent); + RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem tool; + tool.Share(anent, iter); + } + break; + case 720: + { + DeclareAndCast(StepVisual_SurfaceStyleTransparent, anent, ent); + RWStepVisual_RWSurfaceStyleTransparent tool; + tool.Share(anent, iter); + } + break; + case 721: + { + DeclareAndCast(StepVisual_SurfaceStyleReflectanceAmbient, anent, ent); + RWStepVisual_RWSurfaceStyleReflectanceAmbient tool; + tool.Share(anent, iter); + } + break; + case 722: + { + DeclareAndCast(StepVisual_SurfaceStyleRendering, anent, ent); + RWStepVisual_RWSurfaceStyleRendering tool; + tool.Share(anent, iter); + } + break; + case 723: + { + DeclareAndCast(StepVisual_SurfaceStyleRenderingWithProperties, anent, ent); + RWStepVisual_RWSurfaceStyleRenderingWithProperties tool; tool.Share(anent, iter); } break; @@ -7155,7 +7191,7 @@ ent = new StepRepr_CharacterizedRepresentation; break; case 715: - ent = new StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation; + ent = new StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel; break; case 716: ent = new StepVisual_CameraModelD3MultiClipping; @@ -7167,10 +7203,20 @@ ent = new StepVisual_CameraModelD3MultiClippingUnion; break; case 719: - ent = new StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem; + ent = new StepVisual_AnnotationCurveOccurrenceAndGeomReprItem; + break; + case 720: + ent = new StepVisual_SurfaceStyleTransparent; + break; + case 721: + ent = new StepVisual_SurfaceStyleReflectanceAmbient; + break; + case 722: + ent = new StepVisual_SurfaceStyleRendering; + break; + case 723: + ent = new StepVisual_SurfaceStyleRenderingWithProperties; break; - - default: return Standard_False; } @@ -7769,7 +7815,11 @@ case 717: case 718: return cataux; case 719: return catdr; - + case 720: + case 721: + case 722: + case 723: return catdr; + default : break; } return 0; diff -Nru opencascade-7.4.1+dfsg1/src/RWStepAP214/RWStepAP214_ReadWriteModule.cxx opencascade-7.5.1+dfsg1/src/RWStepAP214/RWStepAP214_ReadWriteModule.cxx --- opencascade-7.4.1+dfsg1/src/RWStepAP214/RWStepAP214_ReadWriteModule.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepAP214/RWStepAP214_ReadWriteModule.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -433,6 +433,10 @@ #include +#include +#include +#include +#include #include #include @@ -1390,8 +1394,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -1402,9 +1406,13 @@ #include #include #include -#include -#include +#include +#include +#include +#include +#include +#include // -- General Declarations (Recognize, StepType) --- @@ -2046,6 +2054,12 @@ static TCollection_AsciiString Reco_CameraModelD3MultiClipping("CAMERA_MODEL_D3_MULTI_CLIPPING"); static TCollection_AsciiString Reco_CameraModelD3MultiClippingIntersection("CAMERA_MODEL_D3_MULTI_CLIPPING_INTERSECTION"); static TCollection_AsciiString Reco_CameraModelD3MultiClippingUnion("CAMERA_MODEL_D3_MULTI_CLIPPING_UNION"); + +static TCollection_AsciiString Reco_SurfaceStyleTransparent("SURFACE_STYLE_TRANSPARENT"); +static TCollection_AsciiString Reco_SurfaceStyleReflectanceAmbient("SURFACE_STYLE_REFLECTANCE_AMBIENT"); +static TCollection_AsciiString Reco_SurfaceStyleRendering("SURFACE_STYLE_RENDERING"); +static TCollection_AsciiString Reco_SurfaceStyleRenderingWithProperties("SURFACE_STYLE_RENDERING_WITH_PROPERTIES"); + // -- Definition of the libraries -- static NCollection_DataMap typenums; @@ -2703,7 +2717,11 @@ typenums.Bind ( Reco_CameraModelD3MultiClippingIntersection, 717); typenums.Bind ( Reco_CameraModelD3MultiClippingUnion, 718); - + typenums.Bind (Reco_SurfaceStyleTransparent, 720); + typenums.Bind (Reco_SurfaceStyleReflectanceAmbient, 721); + typenums.Bind (Reco_SurfaceStyleRendering, 722); + typenums.Bind (Reco_SurfaceStyleRenderingWithProperties, 723); + // SHORT NAMES // NB : la liste est celle de AP203 // Directement exploite pour les types simples @@ -4558,6 +4576,11 @@ case 717 : return Reco_CameraModelD3MultiClippingIntersection; case 718 : return Reco_CameraModelD3MultiClippingUnion; + case 720 : return Reco_SurfaceStyleTransparent; + case 721 : return Reco_SurfaceStyleReflectanceAmbient; + case 722 : return Reco_SurfaceStyleRendering; + case 723 : return Reco_SurfaceStyleRenderingWithProperties; + default : return PasReco; } } @@ -9424,8 +9447,8 @@ break; case 715: { - DeclareAndCast(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation, anent, ent); - RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation tool; + DeclareAndCast(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel, anent, ent); + RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel tool; tool.ReadStep(data, num, ach, anent); } break; @@ -9452,12 +9475,39 @@ break; case 719: { - DeclareAndCast(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem, anent, ent); - RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem tool; + DeclareAndCast(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem, anent, ent); + RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem tool; tool.ReadStep(data, num, ach, anent); } break; - + case 720: + { + DeclareAndCast(StepVisual_SurfaceStyleTransparent, anent, ent); + RWStepVisual_RWSurfaceStyleTransparent tool; + tool.ReadStep(data, num, ach, anent); + } + break; + case 721: + { + DeclareAndCast(StepVisual_SurfaceStyleReflectanceAmbient, anent, ent); + RWStepVisual_RWSurfaceStyleReflectanceAmbient tool; + tool.ReadStep(data, num, ach, anent); + } + break; + case 722: + { + DeclareAndCast(StepVisual_SurfaceStyleRendering, anent, ent); + RWStepVisual_RWSurfaceStyleRendering tool; + tool.ReadStep(data, num, ach, anent); + } + break; + case 723: + { + DeclareAndCast(StepVisual_SurfaceStyleRenderingWithProperties, anent, ent); + RWStepVisual_RWSurfaceStyleRenderingWithProperties tool; + tool.ReadStep(data, num, ach, anent); + } + break; default: ach->AddFail("Type Mismatch when reading - Entity"); @@ -14281,8 +14331,8 @@ break; case 715: { - DeclareAndCast(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation, anent, ent); - RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation tool; + DeclareAndCast(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel, anent, ent); + RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel tool; tool.WriteStep(SW, anent); } break; @@ -14309,12 +14359,39 @@ break; case 719: { - DeclareAndCast(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem, anent, ent); - RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem tool; + DeclareAndCast(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem, anent, ent); + RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem tool; tool.WriteStep(SW, anent); } break; - + case 720: + { + DeclareAndCast(StepVisual_SurfaceStyleTransparent, anent, ent); + RWStepVisual_RWSurfaceStyleTransparent tool; + tool.WriteStep(SW, anent); + } + break; + case 721: + { + DeclareAndCast(StepVisual_SurfaceStyleReflectanceAmbient, anent, ent); + RWStepVisual_RWSurfaceStyleReflectanceAmbient tool; + tool.WriteStep(SW, anent); + } + break; + case 722: + { + DeclareAndCast(StepVisual_SurfaceStyleRendering, anent, ent); + RWStepVisual_RWSurfaceStyleRendering tool; + tool.WriteStep(SW, anent); + } + break; + case 723: + { + DeclareAndCast(StepVisual_SurfaceStyleRenderingWithProperties, anent, ent); + RWStepVisual_RWSurfaceStyleRenderingWithProperties tool; + tool.WriteStep(SW, anent); + } + break; default: return; } diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/FILES opencascade-7.5.1+dfsg1/src/RWStepVisual/FILES --- opencascade-7.4.1+dfsg1/src/RWStepVisual/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,7 @@ RWStepVisual_RWAnnotationCurveOccurrence.cxx RWStepVisual_RWAnnotationCurveOccurrence.hxx -RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.cxx -RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx +RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.cxx +RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.hxx RWStepVisual_RWAnnotationFillArea.cxx RWStepVisual_RWAnnotationFillArea.hxx RWStepVisual_RWAnnotationFillAreaOccurrence.cxx @@ -30,8 +30,8 @@ RWStepVisual_RWCameraModelD3MultiClippingUnion.hxx RWStepVisual_RWCameraUsage.cxx RWStepVisual_RWCameraUsage.hxx -RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.cxx -RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx +RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.cxx +RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.hxx RWStepVisual_RWColour.cxx RWStepVisual_RWColour.hxx RWStepVisual_RWColourRgb.cxx @@ -118,10 +118,18 @@ RWStepVisual_RWSurfaceStyleFillArea.hxx RWStepVisual_RWSurfaceStyleParameterLine.cxx RWStepVisual_RWSurfaceStyleParameterLine.hxx +RWStepVisual_RWSurfaceStyleReflectanceAmbient.cxx +RWStepVisual_RWSurfaceStyleReflectanceAmbient.hxx +RWStepVisual_RWSurfaceStyleRendering.cxx +RWStepVisual_RWSurfaceStyleRendering.hxx +RWStepVisual_RWSurfaceStyleRenderingWithProperties.cxx +RWStepVisual_RWSurfaceStyleRenderingWithProperties.hxx RWStepVisual_RWSurfaceStyleSegmentationCurve.cxx RWStepVisual_RWSurfaceStyleSegmentationCurve.hxx RWStepVisual_RWSurfaceStyleSilhouette.cxx RWStepVisual_RWSurfaceStyleSilhouette.hxx +RWStepVisual_RWSurfaceStyleTransparent.cxx +RWStepVisual_RWSurfaceStyleTransparent.hxx RWStepVisual_RWSurfaceStyleUsage.cxx RWStepVisual_RWSurfaceStyleUsage.hxx RWStepVisual_RWTemplate.cxx diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.cxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.cxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -// Created on: 2017-02-06 -// Created by: Irina KRYLOVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//======================================================================= -//function : RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem -//purpose : -//======================================================================= -RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem:: - RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem () {} - -//======================================================================= -//function : ReadStep -//purpose : -//======================================================================= -void RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem::ReadStep -(const Handle(StepData_StepReaderData)& data, -const Standard_Integer num0, -Handle(Interface_Check)& ach, -const Handle(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem)& ent) const -{ - Standard_Integer num = 0; - data->NamedForComplex("REPRESENTATION_ITEM", "RPRITM", num0, num, ach); - // Inherited field : name - Handle(TCollection_HAsciiString) aName; - data->ReadString(num, 1, "name", ach, aName); - - data->NamedForComplex("STYLED_ITEM", "STYITM", num0, num, ach); - // Inherited field : styles - Handle(StepVisual_HArray1OfPresentationStyleAssignment) aStyles; - Handle(StepVisual_PresentationStyleAssignment) anEnt; - Standard_Integer nsub; - if (data->ReadSubList(num, 1, "styles", ach, nsub)) { - Standard_Integer nb = data->NbParams(nsub); - aStyles = new StepVisual_HArray1OfPresentationStyleAssignment(1, nb); - for (Standard_Integer i = 1; i <= nb; i++) { - if (data->ReadEntity(nsub, i, "presentation_style_assignment", ach, - STANDARD_TYPE(StepVisual_PresentationStyleAssignment), anEnt)) - aStyles->SetValue(i, anEnt); - } - } - - // Inherited field : item - Handle(Standard_Transient) aItem; - data->ReadEntity(num, 2, "item", ach, STANDARD_TYPE(Standard_Transient), aItem); - - // Initialization of the read entity - ent->Init(aName, aStyles, aItem); -} - -//======================================================================= -//function : WriteStep -//purpose : -//======================================================================= -void RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem::WriteStep -(StepData_StepWriter& SW, -const Handle(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem)& ent) const -{ - SW.StartEntity("ANNOTATION_CURVE_OCCURRENCE"); - SW.StartEntity("ANNOTATION_OCCURRENCE"); - SW.StartEntity("GEOMETRIC_REPRESENTATION_ITEM"); - SW.StartEntity("REPRESENTATION_ITEM"); - //Inherited field : name - SW.Send(ent->Name()); - - SW.StartEntity("STYLED_ITEM"); - // Inherited field : styles - SW.OpenSub(); - for (Standard_Integer i = 1; i <= ent->NbStyles(); i++) { - SW.Send(ent->StylesValue(i)); - } - SW.CloseSub(); - - // Inherited field : item - SW.Send(ent->Item()); -} - -//======================================================================= -//function : Share -//purpose : -//======================================================================= -void RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem::Share( - const Handle(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem)& ent, - Interface_EntityIterator& iter) const -{ - - Standard_Integer nbElem = ent->NbStyles(); - for (Standard_Integer i = 1; i <= nbElem; i++) { - iter.GetOneItem(ent->StylesValue(i)); - } - - iter.GetOneItem(ent->Item()); -} diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -// Created on: 2017-02-06 -// Created by: Irina KRYLOVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem_HeaderFile -#define _RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem_HeaderFile - -#include -#include -#include - -#include -class StepData_StepReaderData; -class Interface_Check; -class StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem; -class StepData_StepWriter; -class Interface_EntityIterator; - -//! Read & Write Module for AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem -class RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem -{ -public: - - DEFINE_STANDARD_ALLOC - - Standard_EXPORT RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem(); - - Standard_EXPORT void ReadStep (const Handle(StepData_StepReaderData)& data, const Standard_Integer num, Handle(Interface_Check)& ach, const Handle(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem)& ent) const; - - Standard_EXPORT void WriteStep (StepData_StepWriter& SW, const Handle(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem)& ent) const; - - Standard_EXPORT void Share (const Handle(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem)& ent, Interface_EntityIterator& iter) const; -}; -#endif // _RWStepVisual_RWAnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.cxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.cxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,114 @@ +// Created on: 2017-02-06 +// Created by: Irina KRYLOVA +// Copyright (c) 2017 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem +//purpose : +//======================================================================= +RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem:: + RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem() {} + +//======================================================================= +//function : ReadStep +//purpose : +//======================================================================= +void RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem::ReadStep +(const Handle(StepData_StepReaderData)& data, +const Standard_Integer num0, +Handle(Interface_Check)& ach, +const Handle(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem)& ent) const +{ + Standard_Integer num = 0; + data->NamedForComplex("REPRESENTATION_ITEM", "RPRITM", num0, num, ach); + // Inherited field : name + Handle(TCollection_HAsciiString) aName; + data->ReadString(num, 1, "name", ach, aName); + + data->NamedForComplex("STYLED_ITEM", "STYITM", num0, num, ach); + // Inherited field : styles + Handle(StepVisual_HArray1OfPresentationStyleAssignment) aStyles; + Handle(StepVisual_PresentationStyleAssignment) anEnt; + Standard_Integer nsub; + if (data->ReadSubList(num, 1, "styles", ach, nsub)) { + Standard_Integer nb = data->NbParams(nsub); + aStyles = new StepVisual_HArray1OfPresentationStyleAssignment(1, nb); + for (Standard_Integer i = 1; i <= nb; i++) { + if (data->ReadEntity(nsub, i, "presentation_style_assignment", ach, + STANDARD_TYPE(StepVisual_PresentationStyleAssignment), anEnt)) + aStyles->SetValue(i, anEnt); + } + } + + // Inherited field : item + Handle(Standard_Transient) aItem; + data->ReadEntity(num, 2, "item", ach, STANDARD_TYPE(Standard_Transient), aItem); + + // Initialization of the read entity + ent->Init(aName, aStyles, aItem); +} + +//======================================================================= +//function : WriteStep +//purpose : +//======================================================================= +void RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem::WriteStep +(StepData_StepWriter& SW, +const Handle(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem)& ent) const +{ + SW.StartEntity("ANNOTATION_CURVE_OCCURRENCE"); + SW.StartEntity("ANNOTATION_OCCURRENCE"); + SW.StartEntity("GEOMETRIC_REPRESENTATION_ITEM"); + SW.StartEntity("REPRESENTATION_ITEM"); + //Inherited field : name + SW.Send(ent->Name()); + + SW.StartEntity("STYLED_ITEM"); + // Inherited field : styles + SW.OpenSub(); + for (Standard_Integer i = 1; i <= ent->NbStyles(); i++) { + SW.Send(ent->StylesValue(i)); + } + SW.CloseSub(); + + // Inherited field : item + SW.Send(ent->Item()); +} + +//======================================================================= +//function : Share +//purpose : +//======================================================================= +void RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem::Share( + const Handle(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem)& ent, + Interface_EntityIterator& iter) const +{ + + Standard_Integer nbElem = ent->NbStyles(); + for (Standard_Integer i = 1; i <= nbElem; i++) { + iter.GetOneItem(ent->StylesValue(i)); + } + + iter.GetOneItem(ent->Item()); +} diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.hxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.hxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,45 @@ +// Created on: 2017-02-06 +// Created by: Irina KRYLOVA +// Copyright (c) 2017 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem_HeaderFile +#define _RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem_HeaderFile + +#include +#include +#include + +#include +class StepData_StepReaderData; +class Interface_Check; +class StepVisual_AnnotationCurveOccurrenceAndGeomReprItem; +class StepData_StepWriter; +class Interface_EntityIterator; + +//! Read & Write Module for StepVisual_AnnotationCurveOccurrenceAndGeomReprItem +class RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem +{ +public: + + DEFINE_STANDARD_ALLOC + + Standard_EXPORT RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem(); + + Standard_EXPORT void ReadStep (const Handle(StepData_StepReaderData)& data, const Standard_Integer num, Handle(Interface_Check)& ach, const Handle(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem)& ent) const; + + Standard_EXPORT void WriteStep (StepData_StepWriter& SW, const Handle(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem)& ent) const; + + Standard_EXPORT void Share (const Handle(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem)& ent, Interface_EntityIterator& iter) const; +}; +#endif // _RWStepVisual_RWAnnotationCurveOccurrenceAndGeomReprItem_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.cxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.cxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,115 @@ +// Created on: 2016-08-25 +// Created by: Irina KRYLOVA +// Copyright (c) 2016 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + + +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel +//purpose : +//======================================================================= +RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel:: +RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel() +{ +} + + +//======================================================================= +//function : ReadStep +//purpose : +//======================================================================= + +void RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel::ReadStep + (const Handle(StepData_StepReaderData)& data, + const Standard_Integer num0, Handle(Interface_Check)& ach, + const Handle(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel)& ent) const +{ + Standard_Integer num = 0; + data->NamedForComplex("REPRESENTATION","RPRSNT", num0, num, ach); + if (!data->CheckNbParams(num, 3, ach, "shape_aspect")) return; + + // name + Handle(TCollection_HAsciiString) aName; + data->ReadString(num, 1, "name", ach, aName); + + // items + Handle(StepRepr_HArray1OfRepresentationItem) anItems; + Handle(StepRepr_RepresentationItem) anItem; + Standard_Integer nsub; + if (data->ReadSubList(num, 2, "items", ach, nsub)) { + Standard_Integer nb = data->NbParams(nsub); + anItems = new StepRepr_HArray1OfRepresentationItem(1, nb); + for (Standard_Integer i = 1; i <= nb; i++) { + if (data->ReadEntity(nsub, i, "representation_item", ach, + STANDARD_TYPE(StepRepr_RepresentationItem), anItem)) + anItems->SetValue(i, anItem); + } + } + + // context_of_items + Handle(StepRepr_RepresentationContext) aContextOfItems; + data->ReadEntity(num, 3, "context_of_items", ach, STANDARD_TYPE(StepRepr_RepresentationContext), aContextOfItems); + + // Initialize the entity + ent->Init(aName, anItems, aContextOfItems); +} + + +//======================================================================= +//function : WriteStep +//purpose : +//======================================================================= + +void RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel::WriteStep + (StepData_StepWriter& SW, + const Handle(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel)& ent) const +{ + SW.StartEntity("CHARACTERIZED_OBJECT"); + SW.SendDerived(); + SW.SendDerived(); + SW.StartEntity("CHARACTERIZED_REPRESENTATION"); + SW.StartEntity("DRAUGHTING_MODEL"); + SW.StartEntity("REPRESENTATION"); + SW.Send(ent->Name()); + SW.OpenSub(); + for (Standard_Integer i = 1; i <= ent->NbItems(); i++) { + SW.Send(ent->ItemsValue(i)); + } + SW.CloseSub(); + SW.Send(ent->ContextOfItems()); +} + + +//======================================================================= +//function : Share +//purpose : +//======================================================================= + +void RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel::Share +(const Handle(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel)& ent, + Interface_EntityIterator& iter) const +{ + Standard_Integer nbElem = ent->NbItems(); + for (Standard_Integer i = 1; i <= nbElem; i++) { + iter.GetOneItem(ent->ItemsValue(i)); + } + iter.GetOneItem(ent->ContextOfItems()); +} diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.hxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.hxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,51 @@ +// Created on: 2016-08-25 +// Created by: Irina KRYLOVA +// Copyright (c) 2016 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel_HeaderFile +#define _RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel_HeaderFile + +#include +#include +#include + +#include +class StepData_StepReaderData; +class Interface_Check; +class StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel; +class StepData_StepWriter; +class Interface_EntityIterator; + + +//! Read & Write Module for complex STEP entity Characterized_Object & Characterized_Representation & Draughting_Model & Representation +class RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel +{ +public: + + DEFINE_STANDARD_ALLOC + + + Standard_EXPORT RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel(); + + Standard_EXPORT void ReadStep(const Handle(StepData_StepReaderData)& data, + const Standard_Integer num, Handle(Interface_Check)& ach, + const Handle(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel)& ent) const; + + Standard_EXPORT void WriteStep(StepData_StepWriter& SW, + const Handle(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel)& ent) const; + + Standard_EXPORT void Share(const Handle(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel)& ent, + Interface_EntityIterator& iter) const; +}; +#endif // _RWStepVisual_RWCharacterizedObjAndRepresentationAndDraughtingModel_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.cxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.cxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -// Created on: 2016-08-25 -// Created by: Irina KRYLOVA -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include -#include -#include -#include -#include - -//======================================================================= -//function : RWStepVisual_RWChObjAndChReprAndDModelAndRepr -//purpose : -//======================================================================= -RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation:: - RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation() -{ -} - - -//======================================================================= -//function : ReadStep -//purpose : -//======================================================================= - -void RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation::ReadStep - (const Handle(StepData_StepReaderData)& data, - const Standard_Integer num0, Handle(Interface_Check)& ach, - const Handle(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation)& ent) const -{ - Standard_Integer num = 0; - data->NamedForComplex("REPRESENTATION","RPRSNT", num0, num, ach); - if (!data->CheckNbParams(num, 3, ach, "shape_aspect")) return; - - // name - Handle(TCollection_HAsciiString) aName; - data->ReadString(num, 1, "name", ach, aName); - - // items - Handle(StepRepr_HArray1OfRepresentationItem) anItems; - Handle(StepRepr_RepresentationItem) anItem; - Standard_Integer nsub; - if (data->ReadSubList(num, 2, "items", ach, nsub)) { - Standard_Integer nb = data->NbParams(nsub); - anItems = new StepRepr_HArray1OfRepresentationItem(1, nb); - for (Standard_Integer i = 1; i <= nb; i++) { - if (data->ReadEntity(nsub, i, "representation_item", ach, - STANDARD_TYPE(StepRepr_RepresentationItem), anItem)) - anItems->SetValue(i, anItem); - } - } - - // context_of_items - Handle(StepRepr_RepresentationContext) aContextOfItems; - data->ReadEntity(num, 3, "context_of_items", ach, STANDARD_TYPE(StepRepr_RepresentationContext), aContextOfItems); - - // Initialize the entity - ent->Init(aName, anItems, aContextOfItems); -} - - -//======================================================================= -//function : WriteStep -//purpose : -//======================================================================= - -void RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation::WriteStep - (StepData_StepWriter& SW, - const Handle(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation)& ent) const -{ - SW.StartEntity("CHARACTERIZED_OBJECT"); - SW.SendDerived(); - SW.SendDerived(); - SW.StartEntity("CHARACTERIZED_REPRESENTATION"); - SW.StartEntity("DRAUGHTING_MODEL"); - SW.StartEntity("REPRESENTATION"); - SW.Send(ent->Name()); - SW.OpenSub(); - for (Standard_Integer i = 1; i <= ent->NbItems(); i++) { - SW.Send(ent->ItemsValue(i)); - } - SW.CloseSub(); - SW.Send(ent->ContextOfItems()); -} - - -//======================================================================= -//function : Share -//purpose : -//======================================================================= - -void RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation::Share -(const Handle(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation)& ent, - Interface_EntityIterator& iter) const -{ - Standard_Integer nbElem = ent->NbItems(); - for (Standard_Integer i = 1; i <= nbElem; i++) { - iter.GetOneItem(ent->ItemsValue(i)); - } - iter.GetOneItem(ent->ContextOfItems()); -} diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -// Created on: 2016-08-25 -// Created by: Irina KRYLOVA -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation_HeaderFile -#define _RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation_HeaderFile - -#include -#include -#include - -#include -class StepData_StepReaderData; -class Interface_Check; -class StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation; -class StepData_StepWriter; -class Interface_EntityIterator; - - -//! Read & Write Module for complex STEP entity Characterized_Object & Characterized_Representation & Draughting_Model & Representation -class RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation -{ -public: - - DEFINE_STANDARD_ALLOC - - - Standard_EXPORT RWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation(); - - Standard_EXPORT void ReadStep(const Handle(StepData_StepReaderData)& data, - const Standard_Integer num, Handle(Interface_Check)& ach, - const Handle(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation)& ent) const; - - Standard_EXPORT void WriteStep(StepData_StepWriter& SW, - const Handle(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation)& ent) const; - - Standard_EXPORT void Share(const Handle(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation)& ent, - Interface_EntityIterator& iter) const; -}; -#endif // _RRWStepVisual_RWCharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleReflectanceAmbient.cxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleReflectanceAmbient.cxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleReflectanceAmbient.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleReflectanceAmbient.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,78 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : RWStepVisual_RWSurfaceStyleReflectanceAmbient +//purpose : +//======================================================================= + +RWStepVisual_RWSurfaceStyleReflectanceAmbient::RWStepVisual_RWSurfaceStyleReflectanceAmbient() {} + + +//======================================================================= +//function : ReadStep +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleReflectanceAmbient::ReadStep (const Handle(StepData_StepReaderData)& data, + const Standard_Integer num, + Handle(Interface_Check)& ach, + const Handle(StepVisual_SurfaceStyleReflectanceAmbient)& ent) const +{ + // Check number of parameters + if ( ! data->CheckNbParams(num,1,ach,"surface_style_reflectance_ambient") ) return; + + // Own fields of SurfaceStyleReflectanceAmbient + + Standard_Real aAmbientReflectance; + data->ReadReal (num, 1, "ambient_reflectance", ach, aAmbientReflectance); + + // Initialize entity + ent->Init(aAmbientReflectance); +} + +//======================================================================= +//function : WriteStep +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleReflectanceAmbient::WriteStep (StepData_StepWriter& SW, + const Handle(StepVisual_SurfaceStyleReflectanceAmbient)& ent) const +{ + + // Own fields of SurfaceStyleReflectanceAmbient + + SW.Send (ent->AmbientReflectance()); +} + +//======================================================================= +//function : Share +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleReflectanceAmbient::Share (const Handle(StepVisual_SurfaceStyleReflectanceAmbient)& , + Interface_EntityIterator& ) const +{ + + // Own fields of SurfaceStyleReflectanceAmbient +} diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleReflectanceAmbient.hxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleReflectanceAmbient.hxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleReflectanceAmbient.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleReflectanceAmbient.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,46 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWStepVisual_RWSurfaceStyleReflectanceAmbient_HeaderFile_ +#define _RWStepVisual_RWSurfaceStyleReflectanceAmbient_HeaderFile_ + +#include +#include +#include + +class StepData_StepReaderData; +class Interface_Check; +class StepData_StepWriter; +class Interface_EntityIterator; +class StepVisual_SurfaceStyleReflectanceAmbient; + +//! Read & Write tool for SurfaceStyleReflectanceAmbient +class RWStepVisual_RWSurfaceStyleReflectanceAmbient +{ +public: + + DEFINE_STANDARD_ALLOC + + Standard_EXPORT RWStepVisual_RWSurfaceStyleReflectanceAmbient(); + + Standard_EXPORT void ReadStep(const Handle(StepData_StepReaderData)& data, const Standard_Integer num, Handle(Interface_Check)& ach, const Handle(StepVisual_SurfaceStyleReflectanceAmbient)& ent) const; + + Standard_EXPORT void WriteStep(StepData_StepWriter& SW, const Handle(StepVisual_SurfaceStyleReflectanceAmbient)& ent) const; + + Standard_EXPORT void Share(const Handle(StepVisual_SurfaceStyleReflectanceAmbient)& ent, Interface_EntityIterator& iter) const; + +}; +#endif // _RWStepVisual_RWSurfaceStyleReflectanceAmbient_HeaderFile_ diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRendering.cxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRendering.cxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRendering.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRendering.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,100 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : RWStepVisual_RWSurfaceStyleRendering +//purpose : +//======================================================================= + +RWStepVisual_RWSurfaceStyleRendering::RWStepVisual_RWSurfaceStyleRendering() {} + + +//======================================================================= +//function : ReadStep +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleRendering::ReadStep (const Handle(StepData_StepReaderData)& data, + const Standard_Integer num, + Handle(Interface_Check)& ach, + const Handle(StepVisual_SurfaceStyleRendering)& ent) const +{ + // Check number of parameters + if ( ! data->CheckNbParams(num,2,ach,"surface_style_rendering") ) return; + + // Own fields of SurfaceStyleRendering + + StepVisual_ShadingSurfaceMethod aRenderingMethod = StepVisual_ssmNormalShading; + if (data->ParamType (num, 1) == Interface_ParamEnum) { + Standard_CString text = data->ParamCValue(num, 1); + if (strcmp(text, ".CONSTANT_SHADING.")) aRenderingMethod = StepVisual_ssmConstantShading; + else if (strcmp(text, ".COLOUR_SHADING.")) aRenderingMethod = StepVisual_ssmColourShading; + else if (strcmp(text, ".DOT_SHADING.")) aRenderingMethod = StepVisual_ssmDotShading; + else if (strcmp(text, ".NORMAL_SHADING.")) aRenderingMethod = StepVisual_ssmNormalShading; + else ach->AddFail("Parameter #1 (rendering_method) has not allowed value"); + } + else ach->AddFail("Parameter #1 (rendering_method) is not enumeration"); + + Handle(StepVisual_Colour) aSurfaceColour; + data->ReadEntity (num, 2, "surface_colour", ach, STANDARD_TYPE(StepVisual_Colour), aSurfaceColour); + + // Initialize entity + ent->Init(aRenderingMethod, + aSurfaceColour); +} + +//======================================================================= +//function : WriteStep +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleRendering::WriteStep (StepData_StepWriter& SW, + const Handle(StepVisual_SurfaceStyleRendering)& ent) const +{ + + // Own fields of SurfaceStyleRendering + + switch (ent->RenderingMethod()) { + case StepVisual_ssmConstantShading: SW.SendEnum (".CONSTANT_SHADING."); break; + case StepVisual_ssmColourShading: SW.SendEnum (".COLOUR_SHADING."); break; + case StepVisual_ssmDotShading: SW.SendEnum (".DOT_SHADING."); break; + case StepVisual_ssmNormalShading: SW.SendEnum (".NORMAL_SHADING."); break; + } + + SW.Send (ent->SurfaceColour()); +} + +//======================================================================= +//function : Share +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleRendering::Share (const Handle(StepVisual_SurfaceStyleRendering)& ent, + Interface_EntityIterator& iter) const +{ + + // Own fields of SurfaceStyleRendering + + iter.AddItem (ent->SurfaceColour()); +} diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRendering.hxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRendering.hxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRendering.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRendering.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,46 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWStepVisual_RWSurfaceStyleRendering_HeaderFile_ +#define _RWStepVisual_RWSurfaceStyleRendering_HeaderFile_ + +#include +#include +#include + +class StepData_StepReaderData; +class Interface_Check; +class StepData_StepWriter; +class Interface_EntityIterator; +class StepVisual_SurfaceStyleRendering; + +//! Read & Write tool for SurfaceStyleRendering +class RWStepVisual_RWSurfaceStyleRendering +{ +public: + + DEFINE_STANDARD_ALLOC + + Standard_EXPORT RWStepVisual_RWSurfaceStyleRendering(); + + Standard_EXPORT void ReadStep(const Handle(StepData_StepReaderData)& data, const Standard_Integer num, Handle(Interface_Check)& ach, const Handle(StepVisual_SurfaceStyleRendering)& ent) const; + + Standard_EXPORT void WriteStep(StepData_StepWriter& SW, const Handle(StepVisual_SurfaceStyleRendering)& ent) const; + + Standard_EXPORT void Share(const Handle(StepVisual_SurfaceStyleRendering)& ent, Interface_EntityIterator& iter) const; + +}; +#endif // _RWStepVisual_RWSurfaceStyleRendering_HeaderFile_ diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRenderingWithProperties.cxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRenderingWithProperties.cxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRenderingWithProperties.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRenderingWithProperties.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,134 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : RWStepVisual_RWSurfaceStyleRenderingWithProperties +//purpose : +//======================================================================= + +RWStepVisual_RWSurfaceStyleRenderingWithProperties::RWStepVisual_RWSurfaceStyleRenderingWithProperties() {} + + +//======================================================================= +//function : ReadStep +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleRenderingWithProperties::ReadStep (const Handle(StepData_StepReaderData)& data, + const Standard_Integer num, + Handle(Interface_Check)& ach, + const Handle(StepVisual_SurfaceStyleRenderingWithProperties)& ent) const +{ + // Check number of parameters + if ( ! data->CheckNbParams(num,3,ach,"surface_style_rendering_with_properties") ) return; + + // Inherited fields of SurfaceStyleRendering + + StepVisual_ShadingSurfaceMethod aSurfaceStyleRendering_RenderingMethod = StepVisual_ssmNormalShading; + if (data->ParamType (num, 1) == Interface_ParamEnum) { + Standard_CString text = data->ParamCValue(num, 1); + if (strcmp(text, ".CONSTANT_SHADING.")) aSurfaceStyleRendering_RenderingMethod = StepVisual_ssmConstantShading; + else if (strcmp(text, ".COLOUR_SHADING.")) aSurfaceStyleRendering_RenderingMethod = StepVisual_ssmColourShading; + else if (strcmp(text, ".DOT_SHADING.")) aSurfaceStyleRendering_RenderingMethod = StepVisual_ssmDotShading; + else if (strcmp(text, ".NORMAL_SHADING.")) aSurfaceStyleRendering_RenderingMethod = StepVisual_ssmNormalShading; + else ach->AddFail("Parameter #1 (surface_style_rendering.rendering_method) has not allowed value"); + } + else ach->AddFail("Parameter #1 (surface_style_rendering.rendering_method) is not enumeration"); + + Handle(StepVisual_Colour) aSurfaceStyleRendering_SurfaceColour; + data->ReadEntity (num, 2, "surface_style_rendering.surface_colour", ach, STANDARD_TYPE(StepVisual_Colour), aSurfaceStyleRendering_SurfaceColour); + + // Own fields of SurfaceStyleRenderingWithProperties + + Handle(StepVisual_HArray1OfRenderingPropertiesSelect) aProperties; + Standard_Integer sub3 = 0; + if ( data->ReadSubList (num, 3, "properties", ach, sub3) ) { + Standard_Integer nb0 = data->NbParams(sub3); + aProperties = new StepVisual_HArray1OfRenderingPropertiesSelect (1, nb0); + Standard_Integer num2 = sub3; + for ( Standard_Integer i0=1; i0 <= nb0; i0++ ) { + StepVisual_RenderingPropertiesSelect anIt0; + data->ReadEntity (num2, i0, "rendering_properties_select", ach, anIt0); + aProperties->SetValue(i0, anIt0); + } + } + + // Initialize entity + ent->Init(aSurfaceStyleRendering_RenderingMethod, + aSurfaceStyleRendering_SurfaceColour, + aProperties); +} + +//======================================================================= +//function : WriteStep +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleRenderingWithProperties::WriteStep (StepData_StepWriter& SW, + const Handle(StepVisual_SurfaceStyleRenderingWithProperties)& ent) const +{ + + // Own fields of SurfaceStyleRendering + + switch (ent->RenderingMethod()) { + case StepVisual_ssmConstantShading: SW.SendEnum (".CONSTANT_SHADING."); break; + case StepVisual_ssmColourShading: SW.SendEnum (".COLOUR_SHADING."); break; + case StepVisual_ssmDotShading: SW.SendEnum (".DOT_SHADING."); break; + case StepVisual_ssmNormalShading: SW.SendEnum (".NORMAL_SHADING."); break; + } + + SW.Send (ent->SurfaceColour()); + + // Own fields of SurfaceStyleRenderingWithProperties + + SW.OpenSub(); + for (Standard_Integer i2=1; i2 <= ent->Properties()->Length(); i2++ ) { + StepVisual_RenderingPropertiesSelect Var0 = ent->Properties()->Value(i2); + SW.Send (Var0.Value()); + } + SW.CloseSub(); +} + +//======================================================================= +//function : Share +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleRenderingWithProperties::Share (const Handle(StepVisual_SurfaceStyleRenderingWithProperties)& ent, + Interface_EntityIterator& iter) const +{ + + // Inherited fields of SurfaceStyleRendering + + iter.AddItem (ent->StepVisual_SurfaceStyleRendering::SurfaceColour()); + + // Own fields of SurfaceStyleRenderingWithProperties + + for (Standard_Integer i2=1; i2 <= ent->Properties()->Length(); i2++ ) { + StepVisual_RenderingPropertiesSelect Var0 = ent->Properties()->Value(i2); + iter.AddItem (Var0.Value()); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRenderingWithProperties.hxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRenderingWithProperties.hxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRenderingWithProperties.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleRenderingWithProperties.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,46 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWStepVisual_RWSurfaceStyleRenderingWithProperties_HeaderFile_ +#define _RWStepVisual_RWSurfaceStyleRenderingWithProperties_HeaderFile_ + +#include +#include +#include + +class StepData_StepReaderData; +class Interface_Check; +class StepData_StepWriter; +class Interface_EntityIterator; +class StepVisual_SurfaceStyleRenderingWithProperties; + +//! Read & Write tool for SurfaceStyleRenderingWithProperties +class RWStepVisual_RWSurfaceStyleRenderingWithProperties +{ +public: + + DEFINE_STANDARD_ALLOC + + Standard_EXPORT RWStepVisual_RWSurfaceStyleRenderingWithProperties(); + + Standard_EXPORT void ReadStep(const Handle(StepData_StepReaderData)& data, const Standard_Integer num, Handle(Interface_Check)& ach, const Handle(StepVisual_SurfaceStyleRenderingWithProperties)& ent) const; + + Standard_EXPORT void WriteStep(StepData_StepWriter& SW, const Handle(StepVisual_SurfaceStyleRenderingWithProperties)& ent) const; + + Standard_EXPORT void Share(const Handle(StepVisual_SurfaceStyleRenderingWithProperties)& ent, Interface_EntityIterator& iter) const; + +}; +#endif // _RWStepVisual_RWSurfaceStyleRenderingWithProperties_HeaderFile_ diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleTransparent.cxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleTransparent.cxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleTransparent.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleTransparent.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,79 @@ +// Created on : Tue May 12 14:11:46 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : RWStepVisual_RWSurfaceStyleTransparent +//purpose : +//======================================================================= + +RWStepVisual_RWSurfaceStyleTransparent::RWStepVisual_RWSurfaceStyleTransparent() {} + + +//======================================================================= +//function : ReadStep +//purpose : +//======================================================================= +#include + +void RWStepVisual_RWSurfaceStyleTransparent::ReadStep (const Handle(StepData_StepReaderData)& data, + const Standard_Integer num, + Handle(Interface_Check)& ach, + const Handle(StepVisual_SurfaceStyleTransparent)& ent) const +{ + // Check number of parameters + if ( ! data->CheckNbParams(num,1,ach,"surface_style_transparent") ) return; + + // Own fields of SurfaceStyleTransparent + + Standard_Real aTransparency; + data->ReadReal (num, 1, "transparency", ach, aTransparency); + + // Initialize entity + ent->Init(aTransparency); +} + +//======================================================================= +//function : WriteStep +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleTransparent::WriteStep (StepData_StepWriter& SW, + const Handle(StepVisual_SurfaceStyleTransparent)& ent) const +{ + + // Own fields of SurfaceStyleTransparent + + SW.Send (ent->Transparency()); +} + +//======================================================================= +//function : Share +//purpose : +//======================================================================= + +void RWStepVisual_RWSurfaceStyleTransparent::Share (const Handle(StepVisual_SurfaceStyleTransparent)& , + Interface_EntityIterator& ) const +{ + +} diff -Nru opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleTransparent.hxx opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleTransparent.hxx --- opencascade-7.4.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleTransparent.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStepVisual/RWStepVisual_RWSurfaceStyleTransparent.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,48 @@ +// Created on : Tue May 12 14:11:46 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _RWStepVisual_RWSurfaceStyleTransparent_HeaderFile_ +#define _RWStepVisual_RWSurfaceStyleTransparent_HeaderFile_ + +#include +#include +#include +#include + +class StepData_StepReaderData; +class Interface_Check; +class StepData_StepWriter; +class Interface_EntityIterator; +class StepVisual_SurfaceStyleTransparent; +class Interface_EntityIterator; + +//! Read & Write tool for SurfaceStyleTransparent +class RWStepVisual_RWSurfaceStyleTransparent +{ +public: + + DEFINE_STANDARD_ALLOC + + Standard_EXPORT RWStepVisual_RWSurfaceStyleTransparent(); + + Standard_EXPORT void ReadStep(const Handle(StepData_StepReaderData)& data, const Standard_Integer num, Handle(Interface_Check)& ach, const Handle(StepVisual_SurfaceStyleTransparent)& ent) const; + + Standard_EXPORT void WriteStep(StepData_StepWriter& SW, const Handle(StepVisual_SurfaceStyleTransparent)& ent) const; + + Standard_EXPORT void Share(const Handle(StepVisual_SurfaceStyleTransparent)& ent, Interface_EntityIterator& iter) const; + +}; +#endif // _RWStepVisual_RWSurfaceStyleTransparent_HeaderFile_ diff -Nru opencascade-7.4.1+dfsg1/src/RWStl/RWStl.cxx opencascade-7.5.1+dfsg1/src/RWStl/RWStl.cxx --- opencascade-7.4.1+dfsg1/src/RWStl/RWStl.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStl/RWStl.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,7 +15,7 @@ #include -#include +#include #include #include #include @@ -26,6 +26,7 @@ static const Standard_Integer THE_STL_SIZEOF_FACET = 50; static const Standard_Integer IND_THRESHOLD = 1000; // increment the indicator every 1k triangles + static const size_t THE_BUFFER_SIZE = 1024; // The length of buffer to read (in bytes) //! Writing a Little Endian 32 bits integer inline static void convertInteger (const Standard_Integer theValue, @@ -109,7 +110,7 @@ //purpose : //============================================================================= Handle(Poly_Triangulation) RWStl::ReadFile (const Standard_CString theFile, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { Reader aReader; aReader.Read (theFile, theProgress); @@ -123,7 +124,7 @@ //purpose : //============================================================================= Handle(Poly_Triangulation) RWStl::ReadFile (const OSD_Path& theFile, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { OSD_File aFile(theFile); if (!aFile.Exists()) @@ -141,7 +142,7 @@ //purpose : //============================================================================= Handle(Poly_Triangulation) RWStl::ReadBinary (const OSD_Path& theFile, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { OSD_File aFile(theFile); if (!aFile.Exists()) @@ -174,7 +175,7 @@ //purpose : //============================================================================= Handle(Poly_Triangulation) RWStl::ReadAscii (const OSD_Path& theFile, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { OSD_File aFile (theFile); if (!aFile.Exists()) @@ -199,7 +200,8 @@ aStream.seekg (0, aStream.beg); Reader aReader; - if (!aReader.ReadAscii (aStream, theEnd, theProgress)) + Standard_ReadLineBuffer aBuffer (THE_BUFFER_SIZE); + if (!aReader.ReadAscii (aStream, aBuffer, theEnd, theProgress)) { return Handle(Poly_Triangulation)(); } @@ -213,7 +215,7 @@ //============================================================================= Standard_Boolean RWStl::WriteBinary (const Handle(Poly_Triangulation)& theMesh, const OSD_Path& thePath, - const Handle(Message_ProgressIndicator)& theProgInd) + const Message_ProgressRange& theProgress) { if (theMesh.IsNull() || theMesh->NbTriangles() <= 0) { @@ -229,7 +231,7 @@ return Standard_False; } - Standard_Boolean isOK = writeBinary (theMesh, aFile, theProgInd); + Standard_Boolean isOK = writeBinary (theMesh, aFile, theProgress); fclose (aFile); return isOK; @@ -241,7 +243,7 @@ //============================================================================= Standard_Boolean RWStl::WriteAscii (const Handle(Poly_Triangulation)& theMesh, const OSD_Path& thePath, - const Handle(Message_ProgressIndicator)& theProgInd) + const Message_ProgressRange& theProgress) { if (theMesh.IsNull() || theMesh->NbTriangles() <= 0) { @@ -257,7 +259,7 @@ return Standard_False; } - Standard_Boolean isOK = writeASCII (theMesh, aFile, theProgInd); + Standard_Boolean isOK = writeASCII (theMesh, aFile, theProgress); fclose (aFile); return isOK; } @@ -268,7 +270,7 @@ //============================================================================= Standard_Boolean RWStl::writeASCII (const Handle(Poly_Triangulation)& theMesh, FILE* theFile, - const Handle(Message_ProgressIndicator)& theProgInd) + const Message_ProgressRange& theProgress) { // note that space after 'solid' is necessary for many systems if (fwrite ("solid \n", 1, 7, theFile) != 7) @@ -279,12 +281,11 @@ char aBuffer[512]; memset (aBuffer, 0, sizeof(aBuffer)); - Message_ProgressSentry aPS (theProgInd, "Triangles", 0, - theMesh->NbTriangles(), IND_THRESHOLD); + const Standard_Integer NBTriangles = theMesh->NbTriangles(); + Message_ProgressScope aPS (theProgress, "Triangles", NBTriangles); const TColgp_Array1OfPnt& aNodes = theMesh->Nodes(); const Poly_Array1OfTriangle& aTriangles = theMesh->Triangles(); - const Standard_Integer NBTriangles = theMesh->NbTriangles(); Standard_Integer anElem[3] = {0, 0, 0}; for (Standard_Integer aTriIter = 1; aTriIter <= NBTriangles; ++aTriIter) { @@ -328,7 +329,9 @@ // update progress only per 1k triangles if ((aTriIter % IND_THRESHOLD) == 0) { - aPS.Next(); + if (!aPS.More()) + return Standard_False; + aPS.Next(IND_THRESHOLD); } } @@ -346,16 +349,16 @@ //============================================================================= Standard_Boolean RWStl::writeBinary (const Handle(Poly_Triangulation)& theMesh, FILE* theFile, - const Handle(Message_ProgressIndicator)& theProgInd) + const Message_ProgressRange& theProgress) { char aHeader[80] = "STL Exported by OpenCASCADE [www.opencascade.com]"; if (fwrite (aHeader, 1, 80, theFile) != 80) { return Standard_False; } - - Message_ProgressSentry aPS (theProgInd, "Triangles", 0, - theMesh->NbTriangles(), IND_THRESHOLD); + + const Standard_Integer aNBTriangles = theMesh->NbTriangles(); + Message_ProgressScope aPS (theProgress, "Triangles", aNBTriangles); const Standard_Size aNbChunkTriangles = 4096; const Standard_Size aChunkSize = aNbChunkTriangles * THE_STL_SIZEOF_FACET; @@ -364,7 +367,6 @@ const TColgp_Array1OfPnt& aNodes = theMesh->Nodes(); const Poly_Array1OfTriangle& aTriangles = theMesh->Triangles(); - const Standard_Integer aNBTriangles = theMesh->NbTriangles(); Standard_Character aConv[4]; convertInteger (aNBTriangles, aConv); @@ -429,7 +431,9 @@ // update progress only per 1k triangles if ((aTriIter % IND_THRESHOLD) == 0) { - aPS.Next(); + if (!aPS.More()) + return Standard_False; + aPS.Next(IND_THRESHOLD); } } diff -Nru opencascade-7.4.1+dfsg1/src/RWStl/RWStl.hxx opencascade-7.5.1+dfsg1/src/RWStl/RWStl.hxx --- opencascade-7.4.1+dfsg1/src/RWStl/RWStl.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStl/RWStl.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,10 +16,10 @@ #ifndef _RWStl_HeaderFile #define _RWStl_HeaderFile -#include #include #include #include +#include //! This class provides methods to read and write triangulation from / to the STL files. class RWStl @@ -31,46 +31,46 @@ //! Returns false if the cannot be opened; Standard_EXPORT static Standard_Boolean WriteBinary (const Handle(Poly_Triangulation)& theMesh, const OSD_Path& thePath, - const Handle(Message_ProgressIndicator)& theProgInd = Handle(Message_ProgressIndicator)()); + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! write the meshing in a file following the //! Ascii format of an STL file. //! Returns false if the cannot be opened; Standard_EXPORT static Standard_Boolean WriteAscii (const Handle(Poly_Triangulation)& theMesh, const OSD_Path& thePath, - const Handle(Message_ProgressIndicator)& theProgInd = Handle(Message_ProgressIndicator)()); + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Read specified STL file and returns its content as triangulation. //! In case of error, returns Null handle. Standard_EXPORT static Handle(Poly_Triangulation) ReadFile (const OSD_Path& theFile, - const Handle(Message_ProgressIndicator)& aProgInd = Handle(Message_ProgressIndicator)()); + const Message_ProgressRange& aProgInd = Message_ProgressRange()); //! Read specified STL file and returns its content as triangulation. //! In case of error, returns Null handle. Standard_EXPORT static Handle(Poly_Triangulation) ReadFile (const Standard_CString theFile, - const Handle(Message_ProgressIndicator)& aProgInd = Handle(Message_ProgressIndicator)()); + const Message_ProgressRange& aProgInd = Message_ProgressRange()); //! Read triangulation from a binary STL file //! In case of error, returns Null handle. Standard_EXPORT static Handle(Poly_Triangulation) ReadBinary (const OSD_Path& thePath, - const Handle(Message_ProgressIndicator)& theProgInd = Handle(Message_ProgressIndicator)()); + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Read triangulation from an Ascii STL file //! In case of error, returns Null handle. Standard_EXPORT static Handle(Poly_Triangulation) ReadAscii (const OSD_Path& thePath, - const Handle(Message_ProgressIndicator)& theProgInd = Handle(Message_ProgressIndicator)()); + const Message_ProgressRange& theProgress = Message_ProgressRange()); private: //! Write ASCII version. static Standard_Boolean writeASCII (const Handle(Poly_Triangulation)& theMesh, FILE *theFile, - const Handle(Message_ProgressIndicator)& theProgInd); + const Message_ProgressRange& theProgress); //! Write binary version. static Standard_Boolean writeBinary (const Handle(Poly_Triangulation)& theMesh, FILE *theFile, - const Handle(Message_ProgressIndicator)& theProgInd); + const Message_ProgressRange& theProgress); }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/RWStl/RWStl_Reader.cxx opencascade-7.5.1+dfsg1/src/RWStl/RWStl_Reader.cxx --- opencascade-7.4.1+dfsg1/src/RWStl/RWStl_Reader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStl/RWStl_Reader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include #include #include @@ -39,6 +39,9 @@ static const size_t THE_STL_SIZEOF_FACET = 50; static const size_t THE_STL_MIN_FILE_SIZE = THE_STL_HEADER_SIZE + THE_STL_SIZEOF_FACET; + // The length of buffer to read (in bytes) + static const size_t THE_BUFFER_SIZE = 1024; + //! Auxiliary tool for merging nodes during STL reading. class MergeNodeTool { @@ -126,7 +129,7 @@ //============================================================================== Standard_Boolean RWStl_Reader::Read (const char* theFile, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { std::filebuf aBuf; OSD_OpenStream (aBuf, theFile, std::ios::in | std::ios::binary); @@ -146,20 +149,28 @@ // (80 bytes header + 4 bytes facet count + 50 bytes for one facet); // thus assume files shorter than 134 as Ascii without probing // (probing may bring stream to fail state if EOF is reached) - bool isAscii = ((size_t)theEnd < THE_STL_MIN_FILE_SIZE || IsAscii (aStream)); + bool isAscii = ((size_t)theEnd < THE_STL_MIN_FILE_SIZE || IsAscii (aStream, true)); + + Standard_ReadLineBuffer aBuffer (THE_BUFFER_SIZE); + // Note: here we are trying to handle rare but realistic case of + // STL files which are composed of several STL data blocks + // running translation in cycle. + // For this reason use infinite (logarithmic) progress scale, + // but in special mode so that the first cycle will take ~ 70% of it + Message_ProgressScope aPS (theProgress, NULL, 1, true); while (aStream.good()) { if (isAscii) { - if (!ReadAscii (aStream, theEnd, theProgress)) + if (!ReadAscii (aStream, aBuffer, theEnd, aPS.Next(2))) { break; } } else { - if (!ReadBinary (aStream, theProgress)) + if (!ReadBinary (aStream, aPS.Next(2))) { break; } @@ -174,21 +185,30 @@ //purpose : //============================================================================== -Standard_Boolean RWStl_Reader::IsAscii (Standard_IStream& theStream) +Standard_Boolean RWStl_Reader::IsAscii (Standard_IStream& theStream, + const bool isSeekgAvailable) { // read first 134 bytes to detect file format char aBuffer[THE_STL_MIN_FILE_SIZE]; std::streamsize aNbRead = theStream.read (aBuffer, THE_STL_MIN_FILE_SIZE).gcount(); if (! theStream) { - Message::DefaultMessenger()->Send ("Error: Cannot read file", Message_Fail); + Message::SendFail ("Error: Cannot read file"); return true; } - // put back the read symbols - for (std::streamsize aByteIter = aNbRead; aByteIter > 0; --aByteIter) + if (isSeekgAvailable) + { + // get back to the beginning + theStream.seekg(0, theStream.beg); + } + else { - theStream.unget(); + // put back the read symbols + for (std::streamsize aByteIter = aNbRead; aByteIter > 0; --aByteIter) + { + theStream.unget(); + } } // if file is shorter than size of binary file with 1 facet, it must be ascii @@ -268,20 +288,21 @@ //purpose : //============================================================================== Standard_Boolean RWStl_Reader::ReadAscii (Standard_IStream& theStream, + Standard_ReadLineBuffer& theBuffer, const std::streampos theUntilPos, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { // use method seekpos() to get true 64-bit offset to enable // handling of large files (VS 2010 64-bit) const int64_t aStartPos = GETPOS(theStream.tellg()); - // Note: 1 is added to theUntilPos to be sure to read the last symbol (relevant for files without EOL at the end) - const int64_t aEndPos = (theUntilPos > 0 ? 1 + GETPOS(theUntilPos) : std::numeric_limits::max()); + size_t aLineLen = 0; + const char* aLine; // skip header "solid ..." - theStream.ignore ((std::streamsize)(aEndPos - aStartPos), '\n'); - if (!theStream) + aLine = theBuffer.ReadLine (theStream, aLineLen); + if (aLine == NULL) { - Message::DefaultMessenger()->Send ("Error: premature end of file", Message_Fail); + Message::SendFail ("Error: premature end of file"); return false; } @@ -293,81 +314,86 @@ // report progress every 1 MiB of read data const int aStepB = 1024 * 1024; const Standard_Integer aNbSteps = 1 + Standard_Integer((GETPOS(theUntilPos) - aStartPos) / aStepB); - Message_ProgressSentry aPSentry (theProgress, "Reading text STL file", 0, aNbSteps, 1); - + Message_ProgressScope aPS (theProgress, "Reading text STL file", aNbSteps); int64_t aProgressPos = aStartPos + aStepB; - const int64_t LINELEN = 1024; int aNbLine = 1; - char aLine1[LINELEN], aLine2[LINELEN], aLine3[LINELEN]; - while (aPSentry.More()) + + while (aPS.More()) { if (GETPOS(theStream.tellg()) > aProgressPos) { - aPSentry.Next(); + aPS.Next(); aProgressPos += aStepB; } - char facet[LINELEN], outer[LINELEN]; - theStream.getline (facet, (std::streamsize)std::min (LINELEN, aEndPos - GETPOS(theStream.tellg()))); // "facet normal nx ny nz" - if (str_starts_with (facet, "endsolid", 8)) + aLine = theBuffer.ReadLine (theStream, aLineLen); // "facet normal nx ny nz" + if (aLine == NULL) + { + Message::SendFail ("Error: premature end of file"); + return false; + } + if (str_starts_with (aLine, "endsolid", 8)) { // end of STL code break; } - theStream.getline (outer, (std::streamsize)std::min (LINELEN, aEndPos - GETPOS(theStream.tellg()))); // "outer loop" - if (!str_starts_with (facet, "facet", 5) || !str_starts_with (outer, "outer", 5)) + if (!str_starts_with (aLine, "facet", 5)) + { + Message::SendFail (TCollection_AsciiString ("Error: unexpected format of facet at line ") + (aNbLine + 1)); + return false; + } + + aLine = theBuffer.ReadLine (theStream, aLineLen); // "outer loop" + if (aLine == NULL || !str_starts_with (aLine, "outer", 5)) { - TCollection_AsciiString aStr ("Error: unexpected format of facet at line "); - aStr += aNbLine + 1; - Message::DefaultMessenger()->Send (aStr, Message_Fail); + Message::SendFail (TCollection_AsciiString ("Error: unexpected format of facet at line ") + (aNbLine + 1)); return false; } - theStream.getline (aLine1, (std::streamsize)std::min (LINELEN, aEndPos - GETPOS(theStream.tellg()))); - theStream.getline (aLine2, (std::streamsize)std::min (LINELEN, aEndPos - GETPOS(theStream.tellg()))); - theStream.getline (aLine3, (std::streamsize)std::min (LINELEN, aEndPos - GETPOS(theStream.tellg()))); + gp_XYZ aVertex[3]; + Standard_Boolean isEOF = false; + for (Standard_Integer i = 0; i < 3; i++) + { + aLine = theBuffer.ReadLine (theStream, aLineLen); + if (aLine == NULL) + { + isEOF = true; + break; + } + gp_XYZ aReadVertex; + if (!ReadVertex (aLine, aReadVertex.ChangeCoord (1), aReadVertex.ChangeCoord (2), aReadVertex.ChangeCoord (3))) + { + Message::SendFail (TCollection_AsciiString ("Error: cannot read vertex co-ordinates at line ") + aNbLine); + return false; + } + aVertex[i] = aReadVertex; + } // stop reading if end of file is reached; // note that well-formatted file never ends by the vertex line - if (theStream.eof() || GETPOS(theStream.tellg()) >= aEndPos) + if (isEOF) { break; } - if (!theStream) - { - Message::DefaultMessenger()->Send ("Error: premature end of file", Message_Fail); - return false; - } aNbLine += 5; - Standard_Real x1, y1, z1, x2, y2, z2, x3, y3, z3; - if (! ReadVertex (aLine1, x1, y1, z1) || - ! ReadVertex (aLine2, x2, y2, z2) || - ! ReadVertex (aLine3, x3, y3, z3)) - { - TCollection_AsciiString aStr ("Error: cannot read vertex co-ordinates at line "); - aStr += aNbLine; - Message::DefaultMessenger()->Send(aStr, Message_Fail); - return false; - } - // add triangle - int n1 = aMergeTool.AddNode (x1, y1, z1); - int n2 = aMergeTool.AddNode (x2, y2, z2); - int n3 = aMergeTool.AddNode (x3, y3, z3); + int n1 = aMergeTool.AddNode (aVertex[0].X(), aVertex[0].Y(), aVertex[0].Z()); + int n2 = aMergeTool.AddNode (aVertex[1].X(), aVertex[1].Y(), aVertex[1].Z()); + int n3 = aMergeTool.AddNode (aVertex[2].X(), aVertex[2].Y(), aVertex[2].Z()); if (n1 != n2 && n2 != n3 && n3 != n1) { AddTriangle (n1, n2, n3); } - theStream.ignore ((std::streamsize)(aEndPos - GETPOS(theStream.tellg())), '\n'); // skip "endloop" - theStream.ignore ((std::streamsize)(aEndPos - GETPOS(theStream.tellg())), '\n'); // skip "endfacet" + theBuffer.ReadLine (theStream, aLineLen); // skip "endloop" + theBuffer.ReadLine (theStream, aLineLen); // skip "endfacet" aNbLine += 2; } - return aPSentry.More(); + return aPS.More(); } //============================================================================== @@ -376,7 +402,7 @@ //============================================================================== Standard_Boolean RWStl_Reader::ReadBinary (Standard_IStream& theStream, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { /* // the size of the file (minus the header size) @@ -384,7 +410,7 @@ if ((theFileLen - THE_STL_HEADER_SIZE) % THE_STL_SIZEOF_FACET != 0 || (theFileLen < THE_STL_MIN_FILE_SIZE)) { - Message::DefaultMessenger()->Send ("Error: Corrupted binary STL file (inconsistent file size)!", Message_Fail); + Message::SendFail ("Error: Corrupted binary STL file (inconsistent file size)"); return Standard_False; } const Standard_Integer aNbFacets = Standard_Integer((theFileLen - THE_STL_HEADER_SIZE) / THE_STL_SIZEOF_FACET); @@ -394,7 +420,7 @@ char aHeader[THE_STL_HEADER_SIZE + 1]; if (theStream.read (aHeader, THE_STL_HEADER_SIZE).gcount() != std::streamsize(THE_STL_HEADER_SIZE)) { - Message::DefaultMessenger()->Send ("Error: Corrupted binary STL file!", Message_Fail); + Message::SendFail ("Error: Corrupted binary STL file"); return false; } @@ -405,7 +431,7 @@ // don't trust the number of triangles which is coded in the file // sometimes it is wrong, and with this technique we don't need to swap endians for integer - Message_ProgressSentry aPSentry (theProgress, "Reading binary STL file", 0, aNbFacets, 1); + Message_ProgressScope aPS (theProgress, "Reading binary STL file", aNbFacets); Standard_Integer aNbRead = 0; // allocate buffer for 80 triangles @@ -417,8 +443,8 @@ const size_t aFaceDataLen = aVec3Size * 4 + 2; const char* aBufferPtr = aBuffer; Standard_Integer aNbFacesInBuffer = 0; - for (Standard_Integer aNbFacetRead = 0; aNbFacetRead < aNbFacets && aPSentry.More(); - ++aNbFacetRead, ++aNbRead, --aNbFacesInBuffer, aBufferPtr += aFaceDataLen, aPSentry.Next()) + for (Standard_Integer aNbFacetRead = 0; aNbFacetRead < aNbFacets && aPS.More(); + ++aNbFacetRead, ++aNbRead, --aNbFacesInBuffer, aBufferPtr += aFaceDataLen, aPS.Next()) { // read more data if (aNbFacesInBuffer <= 0) @@ -427,7 +453,7 @@ const std::streamsize aDataToRead = aNbFacesInBuffer * aFaceDataLen; if (theStream.read (aBuffer, aDataToRead).gcount() != aDataToRead) { - Message::DefaultMessenger()->Send ("Error: binary STL read failed", Message_Fail); + Message::SendFail ("Error: binary STL read failed"); return false; } aBufferPtr = aBuffer; @@ -449,5 +475,5 @@ } } - return true; + return aPS.More(); } diff -Nru opencascade-7.4.1+dfsg1/src/RWStl/RWStl_Reader.hxx opencascade-7.5.1+dfsg1/src/RWStl/RWStl_Reader.hxx --- opencascade-7.4.1+dfsg1/src/RWStl/RWStl_Reader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/RWStl/RWStl_Reader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,8 +16,11 @@ #ifndef _RWStl_Reader_HeaderFile #define _RWStl_Reader_HeaderFile -#include #include +#include +#include + +class Message_ProgressRange; //! An abstract class implementing procedure to read STL file. //! @@ -39,19 +42,22 @@ //! Format is recognized automatically by analysis of the file header. //! Returns true if success, false on error or user break. Standard_EXPORT Standard_Boolean Read (const char* theFile, - const Handle(Message_ProgressIndicator)& theProgress); + const Message_ProgressRange& theProgress); //! Guess whether the stream is an Ascii STL file, by analysis of the first bytes (~200). - //! The function attempts to put back the read symbols to the stream which thus must support ungetc(). + //! If the stream does not support seekg() then the parameter isSeekgAvailable should + //! be passed as 'false', in this case the function attempts to put back the read symbols + //! to the stream which thus must support ungetc(). //! Returns true if the stream seems to contain Ascii STL. - Standard_EXPORT Standard_Boolean IsAscii (Standard_IStream& theStream); + Standard_EXPORT Standard_Boolean IsAscii (Standard_IStream& theStream, + const bool isSeekgAvailable); //! Reads STL data from binary stream. //! The stream must be opened in binary mode. //! Stops after reading the number of triangles recorded in the file header. //! Returns true if success, false on error or user break. Standard_EXPORT Standard_Boolean ReadBinary (Standard_IStream& theStream, - const Handle(Message_ProgressIndicator)& theProgress); + const Message_ProgressRange& theProgress); //! Reads data from the stream assumed to contain Ascii STL data. //! The stream can be opened either in binary or in Ascii mode. @@ -61,8 +67,9 @@ //! If theUntilPos is non-zero, reads not more than until that position. //! Returns true if success, false on error or user break. Standard_EXPORT Standard_Boolean ReadAscii (Standard_IStream& theStream, + Standard_ReadLineBuffer& theBuffer, const std::streampos theUntilPos, - const Handle(Message_ProgressIndicator)& theProgress); + const Message_ProgressRange& theProgress); public: diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_InteriorSensitivePointSet.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_InteriorSensitivePointSet.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_InteriorSensitivePointSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_InteriorSensitivePointSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -319,7 +319,19 @@ // function : NbSubElements // purpose : Returns the amount of points in set //======================================================================= -Standard_Integer Select3D_InteriorSensitivePointSet::NbSubElements() +Standard_Integer Select3D_InteriorSensitivePointSet::NbSubElements() const { return myPlanarPolygons.Length(); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Select3D_InteriorSensitivePointSet::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveSet) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBndBox) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_InteriorSensitivePointSet.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_InteriorSensitivePointSet.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_InteriorSensitivePointSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_InteriorSensitivePointSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -68,7 +68,10 @@ Standard_EXPORT virtual gp_Pnt CenterOfGeometry() const Standard_OVERRIDE; //! Returns the amount of points in set - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; DEFINE_STANDARD_RTTIEXT(Select3D_InteriorSensitivePointSet,Select3D_SensitiveSet) diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveBox.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveBox.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveBox.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveBox.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -59,7 +59,7 @@ // function : NbSubElements // purpose : Returns the amount of sub-entities in sensitive //======================================================================= -Standard_Integer Select3D_SensitiveBox::NbSubElements() +Standard_Integer Select3D_SensitiveBox::NbSubElements() const { return 1; } @@ -120,3 +120,15 @@ { return myBox; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Select3D_SensitiveBox::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveEntity) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBox) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveBox.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveBox.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveBox.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveBox.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,7 +45,7 @@ const Standard_Real theZMax); //! Returns the amount of sub-entities in sensitive - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; Standard_EXPORT virtual Handle(Select3D_SensitiveEntity) GetConnected() Standard_OVERRIDE; @@ -70,6 +70,12 @@ //! transformation is set, it will be applied Standard_EXPORT virtual Select3D_BndBox3d BoundingBox() Standard_OVERRIDE; + //! Returns TRUE if BVH tree is in invalidated state + virtual Standard_Boolean ToBuildBVH() const Standard_OVERRIDE { return Standard_False; } + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + private: Select3D_BndBox3d myBox; //!< 3d coordinates of box corners diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveCircle.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveCircle.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveCircle.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveCircle.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,7 +16,7 @@ #include -#include +#include #include #include @@ -24,7 +24,7 @@ namespace { - static Standard_Integer GetCircleNbPoints (const Handle(Geom_Circle)& theCircle, + static Standard_Integer GetCircleNbPoints (const gp_Circ& theCircle, const Standard_Integer theNbPnts) { // Check if number of points is invalid. @@ -33,24 +33,37 @@ if (theNbPnts <= 0) return 0; - if (theCircle->Radius() > Precision::Confusion()) + if (theCircle.Radius() > Precision::Confusion()) return 2 * theNbPnts + 1; // The radius is too small and circle degenerates into point return 1; } - static Standard_Integer GetArcNbPoints (const Handle(Geom_Circle)& theCircle, - const Standard_Integer theNbPnts) - { - // There is no need to check number of points here. - // In case of invalid number of points this method returns - // -1 or smaller value. - if (theCircle->Radius() > Precision::Confusion()) - return 2 * theNbPnts - 1; + //! Definition of circle polyline + static void initCircle (Select3D_PointData& thePolygon, + const gp_Circ& theCircle, + const Standard_Real theU1, + const Standard_Real theU2, + const Standard_Integer theNbPnts) + { + const Standard_Real aStep = (theU2 - theU1) / theNbPnts; + const Standard_Real aRadius = theCircle.Radius(); + Standard_Integer aPntIdx = 0; + Standard_Real aCurU = theU1; + gp_Pnt aP1; + gp_Vec aV1; + for (Standard_Integer anIndex = 1; anIndex <= theNbPnts; ++anIndex, aCurU += aStep) + { + ElCLib::CircleD1 (aCurU, theCircle.Position(), theCircle.Radius(), aP1, aV1); + thePolygon.SetPnt (aPntIdx++, aP1); - // The radius is too small and circle degenerates into point - return 1; + aV1.Normalize(); + const gp_Pnt aP2 = aP1.XYZ() + aV1.XYZ() * Tan (aStep * 0.5) * aRadius; + thePolygon.SetPnt (aPntIdx++, aP2); + } + aP1 = ElCLib::CircleValue (theU2, theCircle.Position(), theCircle.Radius()); + thePolygon.SetPnt (theNbPnts * 2, aP1); } } @@ -59,51 +72,24 @@ //purpose : Definition of a sensitive circle //======================================================================= Select3D_SensitiveCircle::Select3D_SensitiveCircle(const Handle(SelectMgr_EntityOwner)& theOwnerId, - const Handle(Geom_Circle)& theCircle, + const gp_Circ& theCircle, const Standard_Boolean theIsFilled, const Standard_Integer theNbPnts) : Select3D_SensitivePoly (theOwnerId, !theIsFilled, GetCircleNbPoints (theCircle, theNbPnts)), myCircle (theCircle), - myStart (0), - myEnd (0) + myStart (0.0), + myEnd (2.0 * M_PI) { mySensType = theIsFilled ? Select3D_TOS_INTERIOR : Select3D_TOS_BOUNDARY; + myCenter3D = theCircle.Position().Location(); if (myPolyg.Size() != 1) { - gp_Pnt aP1, aP2; - gp_Vec aV1; - Standard_Real anUStart = theCircle->FirstParameter(); - Standard_Real anUEnd = theCircle->LastParameter(); - Standard_Real aStep = (anUEnd - anUStart) / theNbPnts; - Standard_Real aRadius = theCircle->Radius(); - Standard_Integer aPntIdx = 1; - Standard_Real aCurU = anUStart; - for (Standard_Integer anIndex = 1; anIndex <= theNbPnts; anIndex++) - { - theCircle->D1 (aCurU, aP1, aV1); - - aV1.Normalize(); - myPolyg.SetPnt (aPntIdx - 1, aP1); - aPntIdx++; - aP2 = gp_Pnt (aP1.X() + aV1.X() * tan (aStep / 2.0) * aRadius, - aP1.Y() + aV1.Y() * tan (aStep / 2.0) * aRadius, - aP1.Z() + aV1.Z() * tan (aStep / 2.0) * aRadius); - myPolyg.SetPnt (aPntIdx - 1, aP2); - aPntIdx++; - aCurU += aStep; - } - - // Copy the first point to the last point of myPolyg - myPolyg.SetPnt (theNbPnts * 2, myPolyg.Pnt (0)); - // Get myCenter3D - myCenter3D = theCircle->Location(); + initCircle (myPolyg, theCircle, myStart, myEnd, theNbPnts); } // Radius = 0.0 else { - myPolyg.SetPnt (0, theCircle->Location()); - // Get myCenter3D - myCenter3D = myPolyg.Pnt (0); + myPolyg.SetPnt (0, theCircle.Position().Location()); } if (mySensType == Select3D_TOS_BOUNDARY) @@ -117,51 +103,25 @@ //purpose : Definition of a sensitive arc //======================================================================= Select3D_SensitiveCircle::Select3D_SensitiveCircle (const Handle(SelectMgr_EntityOwner)& theOwnerId, - const Handle(Geom_Circle)& theCircle, + const gp_Circ& theCircle, const Standard_Real theU1, const Standard_Real theU2, const Standard_Boolean theIsFilled, const Standard_Integer theNbPnts) -: Select3D_SensitivePoly (theOwnerId, !theIsFilled, GetArcNbPoints (theCircle, theNbPnts)), +: Select3D_SensitivePoly (theOwnerId, !theIsFilled, GetCircleNbPoints (theCircle, theNbPnts)), myCircle (theCircle), myStart (Min (theU1, theU2)), myEnd (Max (theU1, theU2)) { mySensType = theIsFilled ? Select3D_TOS_INTERIOR : Select3D_TOS_BOUNDARY; - + myCenter3D = theCircle.Position().Location(); if (myPolyg.Size() != 1) { - gp_Pnt aP1, aP2; - gp_Vec aV1; - - Standard_Real aStep = (myEnd - myStart) / (theNbPnts - 1); - Standard_Real aRadius = theCircle->Radius(); - Standard_Integer aPntIdx = 1; - Standard_Real aCurU = myStart; - - for (Standard_Integer anIndex = 1; anIndex <= theNbPnts - 1; anIndex++) - { - theCircle->D1 (aCurU, aP1, aV1); - aV1.Normalize(); - myPolyg.SetPnt (aPntIdx - 1, aP1); - aPntIdx++; - aP2 = gp_Pnt (aP1.X() + aV1.X() * tan (aStep /2.0) * aRadius, - aP1.Y() + aV1.Y() * tan (aStep /2.0) * aRadius, - aP1.Z() + aV1.Z() * tan (aStep /2.0) * aRadius); - myPolyg.SetPnt (aPntIdx - 1, aP2); - aPntIdx++; - aCurU += aStep; - } - theCircle->D0 (myEnd, aP1); - myPolyg.SetPnt (theNbPnts * 2 - 2, aP1); - // Get myCenter3D - myCenter3D = theCircle->Location(); + initCircle (myPolyg, theCircle, myStart, myEnd, theNbPnts); } else { - myPolyg.SetPnt (0, theCircle->Location()); - // Get myCenter3D - myCenter3D = myPolyg.Pnt (0); + myPolyg.SetPnt (0, theCircle.Position().Location()); } if (mySensType == Select3D_TOS_BOUNDARY) @@ -232,6 +192,20 @@ } //======================================================================= +// function : ToBuildBVH +// purpose : +//======================================================================= +Standard_Boolean Select3D_SensitiveCircle::ToBuildBVH() const +{ + if (mySensType != Select3D_TOS_BOUNDARY) + { + return Standard_False; + } + + return Select3D_SensitivePoly::ToBuildBVH(); +} + +//======================================================================= // function : Matches // purpose : Checks whether the circle overlaps current selecting volume //======================================================================= @@ -251,6 +225,11 @@ Points3D (anArrayOfPnt); if (!theMgr.IsOverlapAllowed()) { + if (theMgr.GetActiveSelectionType() == SelectBasics_SelectingVolumeManager::Polyline) + { + SelectBasics_PickResult aDummy; + return theMgr.Overlaps (anArrayOfPnt, mySensType, aDummy); + } for (Standard_Integer aPntIdx = anArrayOfPnt->Lower(); aPntIdx <= anArrayOfPnt->Upper(); ++aPntIdx) { if (!theMgr.Overlaps (anArrayOfPnt->Value(aPntIdx))) @@ -271,25 +250,6 @@ return Standard_True; } -void Select3D_SensitiveCircle::ArrayBounds (Standard_Integer & theLow, - Standard_Integer & theUp) const -{ - theLow = 0; - theUp = myPolyg.Size() - 1; -} - -//======================================================================= -//function : GetPoint3d -//purpose : -//======================================================================= -gp_Pnt Select3D_SensitiveCircle::GetPoint3d (const Standard_Integer thePntIdx) const -{ - if (thePntIdx >= 0 && thePntIdx < myPolyg.Size()) - return myPolyg.Pnt (thePntIdx); - - return gp_Pnt(); -} - //======================================================================= //function : GetConnected //purpose : @@ -301,7 +261,7 @@ // Create a copy of this Handle(Select3D_SensitiveEntity) aNewEntity; // this was constructed using Handle(Geom_Circle) - if(!myCircle.IsNull()) + if (!Precision::IsInfinite (myCircle.Radius())) { if ((myEnd - myStart) > Precision::Confusion()) { diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveCircle.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveCircle.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveCircle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveCircle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,14 +17,11 @@ #ifndef _Select3D_SensitiveCircle_HeaderFile #define _Select3D_SensitiveCircle_HeaderFile +#include #include -#include -#include #include - -class Geom_Circle; -class Standard_ConstructionError; -class Standard_OutOfRange; +#include +#include //! A framework to define sensitive 3D arcs and circles. //! In some cases this class can raise Standard_ConstructionError and @@ -38,7 +35,7 @@ //! owner theOwnerId, the circle theCircle, the boolean //! theIsFilled and the number of points theNbPnts. Standard_EXPORT Select3D_SensitiveCircle (const Handle(SelectMgr_EntityOwner)& theOwnerId, - const Handle(Geom_Circle)& theCircle, + const gp_Circ& theCircle, const Standard_Boolean theIsFilled = Standard_False, const Standard_Integer theNbPnts = 12); @@ -47,7 +44,7 @@ //! and theU2, the boolean theIsFilled and the number of points theNbPnts. //! theU1 and theU2 define the first and last points of the arc on theCircle. Standard_EXPORT Select3D_SensitiveCircle (const Handle(SelectMgr_EntityOwner)& theOwnerId, - const Handle(Geom_Circle)& theCircle, + const gp_Circ& theCircle, const Standard_Real theU1, const Standard_Real theU2, const Standard_Boolean theIsFilled = Standard_False, @@ -75,11 +72,6 @@ Standard_EXPORT virtual Standard_Boolean Matches (SelectBasics_SelectingVolumeManager& theMgr, SelectBasics_PickResult& thePickResult) Standard_OVERRIDE; - - Standard_EXPORT void ArrayBounds (Standard_Integer & theLow, Standard_Integer & theUp) const; - - Standard_EXPORT gp_Pnt GetPoint3d (const Standard_Integer thePntIdx) const; - Standard_EXPORT virtual Handle(Select3D_SensitiveEntity) GetConnected() Standard_OVERRIDE; //! Returns center of the circle. If location @@ -89,6 +81,9 @@ //! Builds BVH tree for a circle's edge segments if needed Standard_EXPORT virtual void BVH() Standard_OVERRIDE; + //! Returns TRUE if BVH tree is in invalidated state + Standard_EXPORT virtual Standard_Boolean ToBuildBVH() const Standard_OVERRIDE; + protected: //! Calculates distance from the 3d projection of used-picked screen point @@ -104,7 +99,7 @@ Select3D_TypeOfSensitivity mySensType; //!< True if type of selection is interior, false otherwise gp_Pnt myCenter3D; //!< Center of a circle - Handle(Geom_Circle) myCircle; //!< Points of the circle + gp_Circ myCircle; //!< Points of the circle Standard_Real myStart; //!< Sensitive arc parameter Standard_Real myEnd; //!< Sensitive arc parameter }; diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveCurve.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveCurve.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,10 +15,10 @@ // commercial license or contractual agreement. #include + #include #include - IMPLEMENT_STANDARD_RTTIEXT(Select3D_SensitiveCurve,Select3D_SensitivePoly) //================================================== @@ -26,20 +26,6 @@ // Purpose : //================================================== Select3D_SensitiveCurve::Select3D_SensitiveCurve (const Handle(SelectMgr_EntityOwner)& theOwnerId, - const Handle(Geom_Curve)& theCurve, - const Standard_Integer theNbPnts) -: Select3D_SensitivePoly (theOwnerId, Standard_True, theNbPnts), - myCurve (theCurve) -{ - loadPoints (theCurve, theNbPnts); - SetSensitivityFactor (3); -} - -//================================================== -// Function: Creation -// Purpose : -//================================================== -Select3D_SensitiveCurve::Select3D_SensitiveCurve (const Handle(SelectMgr_EntityOwner)& theOwnerId, const Handle(TColgp_HArray1OfPnt)& thePoints) : Select3D_SensitivePoly (theOwnerId, thePoints, Standard_True) @@ -58,46 +44,17 @@ SetSensitivityFactor (3); } -//================================================== -// Function: loadPoints -// Purpose : -//================================================== -void Select3D_SensitiveCurve::loadPoints (const Handle(Geom_Curve)& theCurve, const Standard_Integer theNbPnts) -{ - Standard_Real aStep = (theCurve->LastParameter() - theCurve->FirstParameter()) / (theNbPnts - 1); - Standard_Real aParam = theCurve->FirstParameter(); - for (Standard_Integer aPntIdx = 0; aPntIdx < myPolyg.Size(); ++aPntIdx) - { - myPolyg.SetPnt (aPntIdx, theCurve->Value (aParam)); - aParam += aStep; - } -} - //======================================================================= //function : GetConnected //purpose : //======================================================================= Handle(Select3D_SensitiveEntity) Select3D_SensitiveCurve::GetConnected() { - // Create a copy of this - Handle(Select3D_SensitiveEntity) aNewEntity; - // this was constructed using Handle(Geom_Curve) - if (!myCurve.IsNull()) - { - aNewEntity = new Select3D_SensitiveCurve (myOwnerId, myCurve); - } - // this was constructed using TColgp_HArray1OfPnt - else + Handle(TColgp_HArray1OfPnt) aPoints = new TColgp_HArray1OfPnt (1, myPolyg.Size()); + for (Standard_Integer anIndex = 1; anIndex <= myPolyg.Size(); ++anIndex) { - Standard_Integer aSize = myPolyg.Size(); - Handle(TColgp_HArray1OfPnt) aPoints = new TColgp_HArray1OfPnt (1, aSize); - // Fill the array with points from mypolyg3d - for (Standard_Integer anIndex = 1; anIndex <= aSize; ++anIndex) - { - aPoints->SetValue (anIndex, myPolyg.Pnt (anIndex-1)); - } - aNewEntity = new Select3D_SensitiveCurve (myOwnerId, aPoints); + aPoints->SetValue (anIndex, myPolyg.Pnt (anIndex-1)); } - + Handle(Select3D_SensitiveEntity) aNewEntity = new Select3D_SensitiveCurve (myOwnerId, aPoints); return aNewEntity; -} \ No newline at end of file +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveCurve.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveCurve.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveCurve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveCurve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,9 +36,14 @@ //! Constructs a sensitive curve object defined by the //! owner theOwnerId, the curve theCurve, and the //! maximum number of points on the curve: theNbPnts. - Standard_EXPORT Select3D_SensitiveCurve (const Handle(SelectMgr_EntityOwner)& theOwnerId, - const Handle(Geom_Curve)& theCurve, - const Standard_Integer theNbPnts = 17); + Select3D_SensitiveCurve (const Handle(SelectMgr_EntityOwner)& theOwnerId, + const Handle(Geom_Curve)& theCurve, + const Standard_Integer theNbPnts = 17) + : Select3D_SensitivePoly (theOwnerId, Standard_True, theNbPnts) + { + loadPoints (theCurve, theNbPnts); + mySFactor = 3; + } //! Constructs a sensitive curve object defined by the //! owner theOwnerId and the set of points ThePoints. @@ -55,12 +60,18 @@ private: - void loadPoints (const Handle(Geom_Curve)& aCurve, - const Standard_Integer NbPoints); - -private: + void loadPoints (const Handle(Geom_Curve)& theCurve, + const Standard_Integer theNbPnts) + { + const Standard_Real aStep = (theCurve->LastParameter() - theCurve->FirstParameter()) / (theNbPnts - 1); + Standard_Real aParam = theCurve->FirstParameter(); + for (Standard_Integer aPntIdx = 0; aPntIdx < myPolyg.Size(); ++aPntIdx) + { + myPolyg.SetPnt (aPntIdx, theCurve->Value (aParam)); + aParam += aStep; + } + } - Handle(Geom_Curve) myCurve; //!< Curve points }; DEFINE_STANDARD_HANDLE(Select3D_SensitiveCurve, Select3D_SensitivePoly) diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveEntity.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveEntity.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveEntity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveEntity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,3 +30,26 @@ { // } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Select3D_SensitiveEntity::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myOwnerId.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySFactor) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, NbSubElements()); + + gp_Pnt aCenterOfGeometry = CenterOfGeometry(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &aCenterOfGeometry) + + Standard_Boolean aHasInitLocation = HasInitLocation(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aHasInitLocation) + + gp_GTrsf anInvInitLocation = InvInitLocation(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &anInvInitLocation) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveEntity.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveEntity.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveEntity.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveEntity.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,7 +70,7 @@ //! Returns the number of sub-entities or elements in sensitive entity. //! Is used to determine if entity is complex and needs to pre-build BVH at the creation of sensitive entity step //! or is light-weighted so the tree can be build on demand with unnoticeable delay. - virtual Standard_Integer NbSubElements() = 0; + virtual Standard_Integer NbSubElements() const = 0; //! Returns bounding box of a sensitive with transformation applied virtual Select3D_BndBox3d BoundingBox() = 0; @@ -81,6 +81,9 @@ //! Builds BVH tree for a sensitive if needed virtual void BVH() {} + //! Returns TRUE if BVH tree is in invalidated state + virtual Standard_Boolean ToBuildBVH() const { return Standard_True; } + //! Clears up all resources and memory virtual void Clear() { Set (Handle(SelectMgr_EntityOwner)()); } @@ -91,6 +94,9 @@ //! Otherwise, returns identity matrix. virtual gp_GTrsf InvInitLocation() const { return gp_GTrsf(); } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + protected: Standard_EXPORT Select3D_SensitiveEntity (const Handle(SelectMgr_EntityOwner)& theOwnerId); diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveFace.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveFace.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveFace.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveFace.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -139,7 +139,20 @@ // purpose : Returns the amount of sub-entities (points or planar convex // polygons) //======================================================================= -Standard_Integer Select3D_SensitiveFace::NbSubElements() +Standard_Integer Select3D_SensitiveFace::NbSubElements() const { return myFacePoints->NbSubElements(); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Select3D_SensitiveFace::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveEntity) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySensType) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myFacePoints.get()) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveFace.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveFace.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveFace.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveFace.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,8 +70,14 @@ //! Builds BVH tree for the face Standard_EXPORT virtual void BVH() Standard_OVERRIDE; + //! Returns TRUE if BVH tree is in invalidated state + virtual Standard_Boolean ToBuildBVH() const Standard_OVERRIDE { return myFacePoints->ToBuildBVH(); } + //! Returns the amount of sub-entities (points or planar convex polygons) - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; private: diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveGroup.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveGroup.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveGroup.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveGroup.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -164,7 +164,7 @@ // function : NbSubElements // purpose : Returns the amount of sub-entities //======================================================================= -Standard_Integer Select3D_SensitiveGroup::NbSubElements() +Standard_Integer Select3D_SensitiveGroup::NbSubElements() const { return myEntities.Size(); } @@ -361,3 +361,24 @@ { return theMgr.DistToGeometryCenter (CenterOfGeometry()); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Select3D_SensitiveGroup::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveSet) + + for (Select3D_IndexedMapOfEntity::Iterator anIterator (myEntities); anIterator.More(); anIterator.Next()) + { + const Handle(Select3D_SensitiveEntity)& anEntity = anIterator.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, anEntity.get()) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMustMatchAll) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToCheckOverlapAll) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBndBox) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveGroup.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveGroup.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveGroup.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveGroup.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -113,7 +113,7 @@ SelectBasics_PickResult& thePickResult) Standard_OVERRIDE; //! Returns the amount of sub-entities - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; Standard_EXPORT virtual Handle(Select3D_SensitiveEntity) GetConnected() Standard_OVERRIDE; @@ -143,6 +143,9 @@ //! Returns the length of vector of sensitive entities Standard_EXPORT virtual Standard_Integer Size() const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: //! Checks whether the entity with index theIdx overlaps the current selecting volume diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePoint.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePoint.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePoint.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePoint.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -81,7 +81,17 @@ // function : NbSubElements // purpose : Returns the amount of sub-entities in sensitive //======================================================================= -Standard_Integer Select3D_SensitivePoint::NbSubElements() +Standard_Integer Select3D_SensitivePoint::NbSubElements() const { return 1; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Select3D_SensitivePoint::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveEntity) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePoint.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePoint.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePoint.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePoint.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,7 +31,7 @@ Standard_EXPORT Select3D_SensitivePoint (const Handle(SelectMgr_EntityOwner)& theOwnerId, const gp_Pnt& thePoint); //! Returns the amount of sub-entities in sensitive - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; Standard_EXPORT virtual Handle(Select3D_SensitiveEntity) GetConnected() Standard_OVERRIDE; @@ -50,6 +50,12 @@ //! transformation is set, it will be applied Standard_EXPORT virtual Select3D_BndBox3d BoundingBox() Standard_OVERRIDE; + //! Returns TRUE if BVH tree is in invalidated state + virtual Standard_Boolean ToBuildBVH() const Standard_OVERRIDE { return Standard_False; } + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + private: gp_Pnt myPoint; //!< 3d coordinates of the point diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePoly.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePoly.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePoly.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePoly.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -254,6 +254,11 @@ } const Standard_Integer aSegmentIdx = mySegmentIndexes->Value (theElemIdx); + if (theMgr.GetActiveSelectionType() == SelectBasics_SelectingVolumeManager::Polyline) + { + SelectBasics_PickResult aDummy; + return theMgr.Overlaps (myPolyg.Pnt3d (aSegmentIdx + 0), myPolyg.Pnt3d (aSegmentIdx + 1), aDummy); + } return theMgr.Overlaps (myPolyg.Pnt3d (aSegmentIdx + 0)) && theMgr.Overlaps (myPolyg.Pnt3d (aSegmentIdx + 1)); } @@ -284,7 +289,7 @@ // Function: NbSubElements // Purpose : Returns the amount of segments in poly //================================================== -Standard_Integer Select3D_SensitivePoly::NbSubElements() +Standard_Integer Select3D_SensitivePoly::NbSubElements() const { return myPolyg.Size(); } @@ -310,3 +315,16 @@ return myCOG; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Select3D_SensitivePoly::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveSet) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBndBox) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsComputed) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePoly.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePoly.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePoly.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePoly.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -56,7 +56,7 @@ const Standard_Integer theNbPnts = 6); //! Returns the amount of segments in poly - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; //! Returns the 3D points of the array used at construction time. void Points3D (Handle(TColgp_HArray1OfPnt)& theHArrayOfPnt) @@ -69,6 +69,22 @@ } } + //! Return array bounds. + void ArrayBounds (Standard_Integer& theLow, + Standard_Integer& theUp) const + { + theLow = 0; + theUp = myPolyg.Size() - 1; + } + + //! Return point. + gp_Pnt GetPoint3d (const Standard_Integer thePntIdx) const + { + return (thePntIdx >= 0 && thePntIdx < myPolyg.Size()) + ? myPolyg.Pnt (thePntIdx) + : gp_Pnt(); + } + //! Returns bounding box of a polygon. If location //! transformation is set, it will be applied Standard_EXPORT virtual Select3D_BndBox3d BoundingBox() Standard_OVERRIDE; @@ -92,6 +108,9 @@ Standard_EXPORT virtual void Swap (const Standard_Integer theIdx1, const Standard_Integer theIdx2) Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: //! Checks whether the segment with index theIdx overlaps the current selecting volume diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePrimitiveArray.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePrimitiveArray.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePrimitiveArray.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePrimitiveArray.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1218,3 +1218,35 @@ } } } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Select3D_SensitivePrimitiveArray::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveSet) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPosStride) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPrimType) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIndexLower) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIndexUpper) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPatchSizeMax) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPatchDistance) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIs3d) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myInitLocation) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBndBox) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMinDepthElem) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMinDepthNode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMinDepthEdge) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDetectedElem) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDetectedNode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDetectedEdgeNode1) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDetectedEdgeNode2) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDetectElem) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDetectNode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToDetectEdge) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePrimitiveArray.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePrimitiveArray.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitivePrimitiveArray.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitivePrimitiveArray.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -197,6 +197,9 @@ //! Return the second node of last topmost detected edge or -1 if undefined (axis picking). Standard_Integer LastDetectedEdgeNode2() const { return myDetectedEdgeNode2; } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + public: //! Checks whether the sensitive entity is overlapped by current selecting volume. @@ -209,7 +212,7 @@ Standard_EXPORT virtual Standard_Integer Size() const Standard_OVERRIDE; //! Returns the amount of nodes in triangulation - virtual Standard_Integer NbSubElements() Standard_OVERRIDE + virtual Standard_Integer NbSubElements() const Standard_OVERRIDE { return !myGroups.IsNull() ? myGroups->Size() : myBvhIndices.NbElements; } diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveSegment.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveSegment.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveSegment.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveSegment.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -31,6 +31,7 @@ const gp_Pnt& theLastPnt) : Select3D_SensitiveEntity (theOwnerId) { + mySFactor = 3; myStart = theFirstPnt; myEnd = theLastPnt; } @@ -44,6 +45,10 @@ { if (!theMgr.IsOverlapAllowed()) // check for inclusion { + if (theMgr.GetActiveSelectionType() == SelectBasics_SelectingVolumeManager::Polyline) + { + return theMgr.Overlaps (myStart, myEnd, thePickResult); + } return theMgr.Overlaps (myStart, thePickResult) && theMgr.Overlaps (myEnd, thePickResult); } @@ -98,7 +103,23 @@ // function : NbSubElements // purpose : Returns the amount of points //======================================================================= -Standard_Integer Select3D_SensitiveSegment::NbSubElements() +Standard_Integer Select3D_SensitiveSegment::NbSubElements() const { return 2; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Select3D_SensitiveSegment::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveEntity) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myStart) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myEnd) + + Select3D_BndBox3d aBoundingBox = ((Select3D_SensitiveSegment*)this)->BoundingBox(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &aBoundingBox) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveSegment.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveSegment.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveSegment.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveSegment.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,7 +46,7 @@ const gp_Pnt& EndPoint() const { return myEnd; } //! Returns the amount of points - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; Standard_EXPORT virtual Handle(Select3D_SensitiveEntity) GetConnected() Standard_OVERRIDE; @@ -62,6 +62,9 @@ //! transformation is set, it will be applied Standard_EXPORT virtual Select3D_BndBox3d BoundingBox() Standard_OVERRIDE; + //! Returns TRUE if BVH tree is in invalidated state + virtual Standard_Boolean ToBuildBVH() const Standard_OVERRIDE { return Standard_False; } + public: //! changes the start Point of the Segment; @@ -70,6 +73,9 @@ //! changes the end point of the segment void EndPoint (const gp_Pnt& thePnt) { myEnd = thePnt; } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + private: gp_Pnt myStart; //!< Start point diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveSet.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveSet.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -79,6 +79,51 @@ } //======================================================================= +// function : processElements +// purpose : +//======================================================================= +Standard_Boolean Select3D_SensitiveSet::processElements (SelectBasics_SelectingVolumeManager& theMgr, + Standard_Integer theFirstElem, + Standard_Integer theLastElem, + Standard_Boolean theIsFullInside, + Standard_Boolean theToCheckAllInside, + SelectBasics_PickResult& thePickResult, + Standard_Integer& theMatchesNb) +{ + SelectBasics_PickResult aPickResult; + for (Standard_Integer anIdx = theFirstElem; anIdx <= theLastElem; anIdx++) + { + if (!theMgr.IsOverlapAllowed()) // inclusion test + { + if (!elementIsInside (theMgr, anIdx, theIsFullInside)) + { + if (theToCheckAllInside) + { + continue; + } + return Standard_False; + } + } + else // overlap test + { + if (!overlapsElement (aPickResult, theMgr, anIdx, theIsFullInside)) + { + continue; + } + + if (thePickResult.Depth() > aPickResult.Depth()) + { + thePickResult = aPickResult; + myDetectedIdx = anIdx; + } + } + ++theMatchesNb; + } + + return Standard_True; +} + +//======================================================================= // function : Matches // purpose : //======================================================================= @@ -87,116 +132,113 @@ Standard_Boolean theToCheckAllInside) { myDetectedIdx = -1; - const BVH_Tree* aBVH = myContent.GetBVH().get(); - if (myContent.Size() < 1 || !theMgr.Overlaps (aBVH->MinPoint (0), - aBVH->MaxPoint (0))) + + if (myContent.Size() < 1) { return Standard_False; } - NodeInStack aStack[BVH_Constants_MaxTreeDepth]; - NodeInStack aNode; + const Select3D_BndBox3d& aGlobalBox = myContent.Box(); + Standard_Boolean isFullInside = Standard_True; - Standard_Integer aHead = -1; + if (!theMgr.Overlaps(aGlobalBox.CornerMin(), + aGlobalBox.CornerMax(), + &isFullInside)) + { + return Standard_False; + } Standard_Integer aMatchesNb = -1; - SelectBasics_PickResult aPickResult; + const bool toCheckFullInside = (theMgr.GetActiveSelectionType() != SelectBasics_SelectingVolumeManager::Point); - for (;;) + if (toCheckFullInside && isFullInside) { - const BVH_Vec4i& aData = aBVH->NodeInfoBuffer()[aNode.Id]; - - if (aData.x() == 0) // is inner node + Standard_Integer aSize = myContent.Size(); + if (!processElements (theMgr, 0, aSize - 1, Standard_True, theToCheckAllInside, thePickResult, aMatchesNb)) { - NodeInStack aLeft (aData.y(), toCheckFullInside), aRight(aData.z(), toCheckFullInside); - Standard_Boolean toCheckLft = Standard_True, toCheckRgh = Standard_True; - if (!aNode.IsFullInside) - { - toCheckLft = theMgr.Overlaps (aBVH->MinPoint (aLeft.Id), aBVH->MaxPoint (aLeft.Id), toCheckFullInside ? &aLeft.IsFullInside : NULL); - if (!toCheckLft) - { - aLeft.IsFullInside = Standard_False; - } + return Standard_False; + } + } + else + { + const BVH_Tree* aBVH = myContent.GetBVH().get(); + NodeInStack aStack[BVH_Constants_MaxTreeDepth]; + NodeInStack aNode; - toCheckRgh = theMgr.Overlaps (aBVH->MinPoint (aRight.Id), aBVH->MaxPoint (aRight.Id), toCheckFullInside ? &aRight.IsFullInside : NULL); - if (!toCheckRgh) - { - aRight.IsFullInside = Standard_False; - } - } + Standard_Integer aHead = -1; + + for (;;) + { + const BVH_Vec4i& aData = aBVH->NodeInfoBuffer()[aNode.Id]; - if (!theMgr.IsOverlapAllowed()) // inclusion test + if (aData.x() == 0) // is inner node { - if (!theToCheckAllInside) + NodeInStack aLeft (aData.y(), toCheckFullInside), aRight(aData.z(), toCheckFullInside); + Standard_Boolean toCheckLft = Standard_True, toCheckRgh = Standard_True; + if (!aNode.IsFullInside) { - if (!toCheckLft || !toCheckRgh) + toCheckLft = theMgr.Overlaps (aBVH->MinPoint (aLeft.Id), aBVH->MaxPoint (aLeft.Id), toCheckFullInside ? &aLeft.IsFullInside : NULL); + if (!toCheckLft) { - return Standard_False; // no inclusion + aLeft.IsFullInside = Standard_False; } - // skip extra checks - toCheckLft &= !aLeft.IsFullInside; - toCheckRgh &= !aRight.IsFullInside; - } - } - - if (toCheckLft || toCheckRgh) - { - aNode = toCheckLft ? aLeft : aRight; - if (toCheckLft && toCheckRgh) - { - aStack[++aHead] = aRight; + toCheckRgh = theMgr.Overlaps (aBVH->MinPoint (aRight.Id), aBVH->MaxPoint (aRight.Id), toCheckFullInside ? &aRight.IsFullInside : NULL); + if (!toCheckRgh) + { + aRight.IsFullInside = Standard_False; + } } - } - else - { - if (aHead < 0) - break; - aNode = aStack[aHead--]; - } - } - else - { - for (Standard_Integer anElemIdx = aData.y(); anElemIdx <= aData.z(); ++anElemIdx) - { if (!theMgr.IsOverlapAllowed()) // inclusion test { - if (!elementIsInside (theMgr, anElemIdx, aNode.IsFullInside)) + if (!theToCheckAllInside) { - if (theToCheckAllInside) + if (!toCheckLft || !toCheckRgh) { - continue; + return Standard_False; // no inclusion } - return Standard_False; + + // skip extra checks + toCheckLft &= !aLeft.IsFullInside; + toCheckRgh &= !aRight.IsFullInside; } } - else // overlap test + + if (toCheckLft || toCheckRgh) { - if (!overlapsElement (aPickResult, theMgr, anElemIdx, aNode.IsFullInside)) + aNode = toCheckLft ? aLeft : aRight; + if (toCheckLft && toCheckRgh) { - continue; + aStack[++aHead] = aRight; } + } + else + { + if (aHead < 0) + break; - if (thePickResult.Depth() > aPickResult.Depth()) - { - thePickResult = aPickResult; - myDetectedIdx = anElemIdx; - } + aNode = aStack[aHead--]; } - ++aMatchesNb; } + else + { + if (!processElements (theMgr, aData.y(), aData.z(), aNode.IsFullInside, theToCheckAllInside, thePickResult, aMatchesNb)) + { + return Standard_False; + } - if (aHead < 0) - break; + if (aHead < 0) + break; - aNode = aStack[aHead--]; + aNode = aStack[aHead--]; + } } } if (aMatchesNb != -1) { - thePickResult.SetDistToGeomCenter(distanceToCOG(theMgr)); + thePickResult.SetDistToGeomCenter (distanceToCOG (theMgr)); } return aMatchesNb != -1 @@ -232,3 +274,20 @@ { // } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Select3D_SensitiveSet::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveEntity) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myContent) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDetectedIdx) + + Select3D_BndBox3d aBoundingBox = ((Select3D_SensitiveSet*)this)->BoundingBox(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &aBoundingBox) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveSet.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveSet.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -75,6 +75,9 @@ //! but element by element Standard_EXPORT virtual void BVH() Standard_OVERRIDE; + //! Returns TRUE if BVH tree is in invalidated state + virtual Standard_Boolean ToBuildBVH() const Standard_OVERRIDE { return myContent.IsDirty(); } + //! Sets the method (builder) used to construct BVH. void SetBuilder (const Handle(Select3D_BVHBuilder3d)& theBuilder) { myContent.SetBuilder (theBuilder); } @@ -96,6 +99,9 @@ //! Returns a number of nodes in 1 BVH leaf Standard_Integer GetLeafNodeSize() const { return myContent.Builder()->LeafNodeSize(); } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: //! Checks whether one or more entities of the set overlap current selecting volume. @@ -132,6 +138,22 @@ //! Calculates distance from the 3d projection of used-picked screen point to center of the geometry virtual Standard_Real distanceToCOG (SelectBasics_SelectingVolumeManager& theMgr) = 0; + //! Process elements overlapped by the selection volume + //! @param theMgr selection manager + //! @param theFirstElem index of the first element + //! @param theLastElem index of the last element + //! @param theIsFullInside when TRUE indicates that entire BVH node is already inside selection volume + //! @param thePickResult [OUT] picking result (for picking by ray) + //! @param theMatchesNb [OUT] number of processed elements + //! @return FALSE if some element is outside the selection volume (if IsOverlapAllowed is FALSE); TRUE otherwise + Standard_EXPORT Standard_Boolean processElements (SelectBasics_SelectingVolumeManager& theMgr, + Standard_Integer theFirstElem, + Standard_Integer theLastElem, + Standard_Boolean theIsFullInside, + Standard_Boolean theToCheckAllInside, + SelectBasics_PickResult& thePickResult, + Standard_Integer& theMatchesNb); + protected: //! The purpose of this class is to provide a link between BVH_PrimitiveSet @@ -141,7 +163,11 @@ public: //! Empty constructor. - BvhPrimitiveSet() : BVH_PrimitiveSet3d (Handle(Select3D_BVHBuilder3d)()) {} + BvhPrimitiveSet() + : BVH_PrimitiveSet3d(Handle(Select3D_BVHBuilder3d)()), + mySensitiveSet(NULL) + { + } //! Destructor. ~BvhPrimitiveSet() {} @@ -173,6 +199,10 @@ //! Returns the tree built for set of sensitives const opencascade::handle >& GetBVH() { return BVH(); } + //! Dumps the content of me into the stream + void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const + { (void)theOStream; (void)theDepth; } + protected: Select3D_SensitiveSet* mySensitiveSet; //!< Set of sensitive entities }; diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveTriangle.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveTriangle.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveTriangle.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveTriangle.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -50,6 +50,11 @@ { if (!theMgr.IsOverlapAllowed()) { + if (theMgr.GetActiveSelectionType() == SelectBasics_SelectingVolumeManager::Polyline) + { + SelectBasics_PickResult aDummy; + return theMgr.Overlaps (myPoints[0], myPoints[1], myPoints[2], mySensType, aDummy); + } return theMgr.Overlaps (myPoints[0]) && theMgr.Overlaps (myPoints[1]) && theMgr.Overlaps (myPoints[2]); @@ -93,3 +98,22 @@ Max (myPoints[0].Z(), Max (myPoints[1].Z(), myPoints[2].Z()))); return Select3D_BndBox3d (aMinPnt, aMaxPnt); } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void Select3D_SensitiveTriangle::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveEntity) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySensType) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPoints[0]) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPoints[1]) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPoints[2]) + + Select3D_BndBox3d aBoundingBox = ((Select3D_SensitiveTriangle*)this)->BoundingBox(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &aBoundingBox) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveTriangle.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveTriangle.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveTriangle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveTriangle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -62,11 +62,17 @@ //! will be applied Standard_EXPORT virtual Select3D_BndBox3d BoundingBox() Standard_OVERRIDE; + //! Returns TRUE if BVH tree is in invalidated state + virtual Standard_Boolean ToBuildBVH() const Standard_OVERRIDE { return Standard_False; } + //! Returns the amount of points - virtual Standard_Integer NbSubElements() Standard_OVERRIDE { return 3; } + virtual Standard_Integer NbSubElements() const Standard_OVERRIDE { return 3; } virtual gp_Pnt CenterOfGeometry() const Standard_OVERRIDE { return myCentroid; } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + DEFINE_STANDARD_RTTIEXT(Select3D_SensitiveTriangle,Select3D_SensitiveEntity) private: diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveTriangulation.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveTriangulation.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveTriangulation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveTriangulation.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -314,6 +314,11 @@ { const gp_Pnt& aSegmPnt1 = myTriangul->Nodes().Value (myFreeEdges->Value (aPrimitiveIdx * 2 + 1)); const gp_Pnt& aSegmPnt2 = myTriangul->Nodes().Value (myFreeEdges->Value (aPrimitiveIdx * 2 + 2)); + if (theMgr.GetActiveSelectionType() == SelectBasics_SelectingVolumeManager::Polyline) + { + SelectBasics_PickResult aDummy; + return theMgr.Overlaps (aSegmPnt1, aSegmPnt2, aDummy); + } return theMgr.Overlaps (aSegmPnt1) && theMgr.Overlaps (aSegmPnt2); } else @@ -324,6 +329,11 @@ const gp_Pnt& aPnt1 = myTriangul->Nodes().Value (aNode1); const gp_Pnt& aPnt2 = myTriangul->Nodes().Value (aNode2); const gp_Pnt& aPnt3 = myTriangul->Nodes().Value (aNode3); + if (theMgr.GetActiveSelectionType() == SelectBasics_SelectingVolumeManager::Polyline) + { + SelectBasics_PickResult aDummy; + return theMgr.Overlaps (aPnt1, aPnt2, aPnt3, mySensType, aDummy); + } return theMgr.Overlaps (aPnt1) && theMgr.Overlaps (aPnt2) && theMgr.Overlaps (aPnt3); @@ -421,7 +431,7 @@ // function : NbSubElements // purpose : Returns the amount of nodes in triangulation //======================================================================= -Standard_Integer Select3D_SensitiveTriangulation::NbSubElements() +Standard_Integer Select3D_SensitiveTriangulation::NbSubElements() const { return myTriangul->Nodes().Length(); } @@ -443,3 +453,19 @@ { return myInvInitLocation; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Select3D_SensitiveTriangulation::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveSet) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myTriangul.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myInitLocation) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySensType) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPrimitivesNb) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBndBox) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveTriangulation.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveTriangulation.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveTriangulation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveTriangulation.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,7 +55,7 @@ const Standard_Boolean theIsInterior); //! Returns the amount of nodes in triangulation - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; Standard_EXPORT Handle(Select3D_SensitiveEntity) GetConnected() Standard_OVERRIDE; @@ -93,6 +93,9 @@ const TopLoc_Location& GetInitLocation() const { return myInitLocation; } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: //! Inner function for transformation application to bounding diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveWire.cxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveWire.cxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveWire.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveWire.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -54,7 +54,7 @@ // function : NbSubElements // purpose : Returns the amount of sub-entities //======================================================================= -Standard_Integer Select3D_SensitiveWire::NbSubElements() +Standard_Integer Select3D_SensitiveWire::NbSubElements() const { return myEntities.Length(); } @@ -226,3 +226,20 @@ { return myCenter; } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void Select3D_SensitiveWire::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Select3D_SensitiveSet) + + for (NCollection_Vector::Iterator anIterator (myEntities); anIterator.More(); anIterator.Next()) + { + const Handle(Select3D_SensitiveEntity)& anEntity = anIterator.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, anEntity.get()) + } + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myBndBox) +} diff -Nru opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveWire.hxx opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveWire.hxx --- opencascade-7.4.1+dfsg1/src/Select3D/Select3D_SensitiveWire.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Select3D/Select3D_SensitiveWire.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,7 +33,7 @@ Standard_EXPORT void Add (const Handle(Select3D_SensitiveEntity)& theSensitive); //! Returns the amount of sub-entities - Standard_EXPORT virtual Standard_Integer NbSubElements() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Integer NbSubElements() const Standard_OVERRIDE; Standard_EXPORT virtual Handle(Select3D_SensitiveEntity) GetConnected() Standard_OVERRIDE; @@ -68,6 +68,9 @@ Standard_EXPORT virtual void Swap (const Standard_Integer theIdx1, const Standard_Integer theIdx2) Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + DEFINE_STANDARD_RTTIEXT(Select3D_SensitiveWire,Select3D_SensitiveSet) protected: diff -Nru opencascade-7.4.1+dfsg1/src/SelectBasics/SelectBasics_PickResult.hxx opencascade-7.5.1+dfsg1/src/SelectBasics/SelectBasics_PickResult.hxx --- opencascade-7.4.1+dfsg1/src/SelectBasics/SelectBasics_PickResult.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectBasics/SelectBasics_PickResult.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,6 +55,7 @@ { myDepth = RealLast(); myObjPickedPnt = gp_Pnt (RealLast(), 0.0, 0.0); + myNormal.SetValues (0.0f, 0.0f, 0.0f); } //! Return depth along picking ray. @@ -79,10 +80,24 @@ //! Set distance to geometry center. void SetDistToGeomCenter (Standard_Real theDistToCenter) { myDistToCenter = theDistToCenter; } + //! Return (unnormalized) surface normal at picked point or zero vector if undefined. + //! WARNING! Normal is defined in local coordinate system and should be translated into World System before usage! + const NCollection_Vec3& SurfaceNormal() const { return myNormal; } + + //! Set surface normal at picked point. + void SetSurfaceNormal (const NCollection_Vec3& theNormal) { myNormal = theNormal; } + + //! Set surface normal at picked point. + void SetSurfaceNormal (const gp_Vec& theNormal) + { + myNormal.SetValues ((float )theNormal.X(), (float )theNormal.Y(), (float )theNormal.Z()); + } + private: - gp_Pnt myObjPickedPnt; //!< User-picked selection point onto object - Standard_Real myDepth; //!< Depth to detected point - Standard_Real myDistToCenter; //!< Distance from 3d projection user-picked selection point to entity's geometry center + gp_Pnt myObjPickedPnt; //!< User-picked selection point onto object + NCollection_Vec3 myNormal; //!< surface normal + Standard_Real myDepth; //!< Depth to detected point + Standard_Real myDistToCenter; //!< Distance from 3d projection user-picked selection point to entity's geometry center }; #endif // _SelectBasics_PickResult_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/SelectBasics/SelectBasics_SelectingVolumeManager.hxx opencascade-7.5.1+dfsg1/src/SelectBasics/SelectBasics_SelectingVolumeManager.hxx --- opencascade-7.4.1+dfsg1/src/SelectBasics/SelectBasics_SelectingVolumeManager.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectBasics/SelectBasics_SelectingVolumeManager.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,7 @@ #include #include #include +#include class Bnd_Box; class gp_Pnt; @@ -37,9 +38,12 @@ public: - SelectBasics_SelectingVolumeManager() {}; + SelectBasics_SelectingVolumeManager() + : myActiveSelectionType(Unknown) + { + } - virtual ~SelectBasics_SelectingVolumeManager() {}; + virtual ~SelectBasics_SelectingVolumeManager() {} virtual Standard_Integer GetActiveSelectionType() const = 0; @@ -116,6 +120,10 @@ //! Ax + By + Cz + D = 0) to the given vector virtual void GetPlanes (NCollection_Vector >& thePlaneEquations) const = 0; + //! Dumps the content of me into the stream + virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const + { (void)theDepth; OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myActiveSelectionType) } + protected: SelectionType myActiveSelectionType; //!< Active selection type: point, box or polyline }; diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/FILES opencascade-7.5.1+dfsg1/src/SelectMgr/FILES --- opencascade-7.4.1+dfsg1/src/SelectMgr/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,13 @@ +SelectMgr.cxx +SelectMgr.hxx SelectMgr_AndFilter.cxx SelectMgr_AndFilter.hxx +SelectMgr_AndOrFilter.cxx +SelectMgr_AndOrFilter.hxx SelectMgr_BaseFrustum.cxx SelectMgr_BaseFrustum.hxx +SelectMgr_BVHThreadPool.cxx +SelectMgr_BVHThreadPool.hxx SelectMgr_CompositionFilter.cxx SelectMgr_CompositionFilter.hxx SelectMgr_CompositionFilter.lxx @@ -9,6 +15,7 @@ SelectMgr_EntityOwner.hxx SelectMgr_Filter.cxx SelectMgr_Filter.hxx +SelectMgr_FilterType.hxx SelectMgr_Frustum.hxx SelectMgr_Frustum.lxx SelectMgr_FrustumBuilder.cxx @@ -30,6 +37,8 @@ SelectMgr_SelectingVolumeManager.hxx SelectMgr_Selection.cxx SelectMgr_Selection.hxx +SelectMgr_SelectionImageFiller.cxx +SelectMgr_SelectionImageFiller.hxx SelectMgr_SelectionManager.cxx SelectMgr_SelectionManager.hxx SelectMgr_SensitiveEntity.cxx @@ -39,7 +48,6 @@ SelectMgr_SequenceOfFilter.hxx SelectMgr_SequenceOfOwner.hxx SelectMgr_SequenceOfSelection.hxx -SelectMgr_SOPtr.hxx SelectMgr_SortCriterion.hxx SelectMgr_StateOfSelection.hxx SelectMgr_ToleranceMap.hxx @@ -49,9 +57,12 @@ SelectMgr_TriangularFrustumSet.cxx SelectMgr_TriangularFrustumSet.hxx SelectMgr_TypeOfBVHUpdate.hxx +SelectMgr_TypeOfDepthTolerance.hxx SelectMgr_TypeOfUpdate.hxx SelectMgr_VectorTypes.hxx SelectMgr_ViewClipRange.cxx SelectMgr_ViewClipRange.hxx SelectMgr_ViewerSelector.cxx SelectMgr_ViewerSelector.hxx +SelectMgr_ViewerSelector3d.cxx +SelectMgr_ViewerSelector3d.hxx diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_AndOrFilter.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_AndOrFilter.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_AndOrFilter.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_AndOrFilter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,71 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_AndOrFilter, SelectMgr_CompositionFilter) + +//============================================================================= +//function : SelectMgr_AndOrFilter +//purpose : +//============================================================================= +SelectMgr_AndOrFilter::SelectMgr_AndOrFilter (const SelectMgr_FilterType theFilterType): +myFilterType (theFilterType) +{ +} + +//============================================================================= +//function : SetDisabledObjects +//purpose : +//============================================================================= +void SelectMgr_AndOrFilter::SetDisabledObjects (const Handle(Graphic3d_NMapOfTransient)& theObjects) +{ + myDisabledObjects = theObjects; +} + +//============================================================================= +//function : IsOk +//purpose : +//============================================================================= +Standard_Boolean SelectMgr_AndOrFilter::IsOk (const Handle(SelectMgr_EntityOwner)& theObj) const +{ + const SelectMgr_SelectableObject* aSelectable = theObj->Selectable().operator->(); + if (!myDisabledObjects.IsNull() && myDisabledObjects->Contains (aSelectable)) + { + return Standard_False; + } + + for (SelectMgr_ListIteratorOfListOfFilter anIter(myFilters); anIter.More();anIter.Next()) + { + Standard_Boolean isOK = anIter.Value()->IsOk(theObj); + if(isOK && myFilterType == SelectMgr_FilterType_OR) + { + return Standard_True; + } + else if (!isOK && myFilterType == SelectMgr_FilterType_AND) + { + return Standard_False; + } + } + + if (myFilterType == SelectMgr_FilterType_OR && !myFilters.IsEmpty()) + { + return Standard_False; + } + return Standard_True; +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_AndOrFilter.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_AndOrFilter.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_AndOrFilter.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_AndOrFilter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,61 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _SelectMgr_AndOrFilter_HeaderFile +#define _SelectMgr_AndOrFilter_HeaderFile + +#include +#include + +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(SelectMgr_AndOrFilter, SelectMgr_CompositionFilter) + +//! A framework to define an OR or AND selection filter. +//! To use an AND selection filter call SetUseOrFilter with False parameter. +//! By default the OR selection filter is used. +class SelectMgr_AndOrFilter : public SelectMgr_CompositionFilter +{ + +public: + + //! Constructs an empty selection filter. + Standard_EXPORT SelectMgr_AndOrFilter (const SelectMgr_FilterType theFilterType); + + //! Indicates that the selected Interactive Object passes the filter. + Standard_EXPORT virtual Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& theObj) const Standard_OVERRIDE; + + //! Disable selection of specified objects. + Standard_EXPORT void SetDisabledObjects (const Handle(Graphic3d_NMapOfTransient)& theObjects); + + //! @return a selection filter type (@sa SelectMgr_FilterType). + SelectMgr_FilterType FilterType() const { return myFilterType; } + + //! Sets a selection filter type. + //! SelectMgr_FilterType_OR selection filter is used be default. + //! @param theFilterType the filter type. + void SetFilterType (const SelectMgr_FilterType theFilterType) { myFilterType = theFilterType; } + + DEFINE_STANDARD_RTTIEXT(SelectMgr_AndOrFilter, SelectMgr_CompositionFilter) + +private: + + Handle(Graphic3d_NMapOfTransient) myDisabledObjects; //!< disabled objects. + //! Selection isn't applied to these objects. + SelectMgr_FilterType myFilterType; //!< selection filter type. SelectMgr_TypeFilter_OR by default. +}; + +#endif // _SelectMgr_AndOrFilter_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_BaseFrustum.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_BaseFrustum.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_BaseFrustum.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_BaseFrustum.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -254,12 +254,12 @@ //function : DumpJson //purpose : //======================================================================= -void SelectMgr_BaseFrustum::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const +void SelectMgr_BaseFrustum::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, SelectMgr_BaseFrustum); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPixelTolerance); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsOrthographic); - OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myBuilder); - OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myCamera); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPixelTolerance) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsOrthographic) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myBuilder) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myCamera) } diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_BaseFrustum.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_BaseFrustum.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_BaseFrustum.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_BaseFrustum.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -174,7 +174,7 @@ } //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; DEFINE_STANDARD_RTTIEXT(SelectMgr_BaseFrustum,Standard_Transient) diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_BVHThreadPool.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_BVHThreadPool.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_BVHThreadPool.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_BVHThreadPool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,180 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_BVHThreadPool, Standard_Transient) + +//================================================== +// Function: SelectMgr_BVHThreadPool +// Purpose : +//================================================== +SelectMgr_BVHThreadPool::SelectMgr_BVHThreadPool (Standard_Integer theNbThreads) +: myToStopBVHThread(Standard_False), + myWakeEvent(Standard_False), + myIdleEvent(Standard_True), + myIsStarted(Standard_False) +{ + Standard_Integer aBVHThreadsNum = Max (1, theNbThreads); + myBVHThreads.Resize (1, aBVHThreadsNum, Standard_False); + + Standard_Boolean toCatchFpe = OSD::ToCatchFloatingSignals(); + + for (Standard_Integer i = myBVHThreads.Lower(); i <= myBVHThreads.Upper(); ++i) + { + BVHThread& aThread = myBVHThreads.ChangeValue(i); + aThread.SetFunction (&BVHThread::runThread); + aThread.myPool = this; + aThread.myToCatchFpe = toCatchFpe; + } +} + +//================================================== +// Function: ~SelectMgr_BVHThreadPool +// Purpose : +//================================================== +SelectMgr_BVHThreadPool::~SelectMgr_BVHThreadPool() +{ + StopThreads(); +} + +//================================================== +// Function: StopThreads +// Purpose : +//================================================== +void SelectMgr_BVHThreadPool::StopThreads() +{ + if (!myIsStarted) + { + return; + } + myToStopBVHThread = Standard_True; + myWakeEvent.Set(); + for (Standard_Integer i = myBVHThreads.Lower(); i <= myBVHThreads.Upper(); ++i) + { + myBVHThreads.ChangeValue(i).Wait(); + } + myToStopBVHThread = Standard_False; + myIsStarted = Standard_False; +} + +//================================================== +// Function: WaitThreads +// Purpose : +//================================================== +void SelectMgr_BVHThreadPool::WaitThreads() +{ + myIdleEvent.Wait(); + + Sentry aSentry (this); +} + +//======================================================================= +//function : AddEntity +//purpose : +//======================================================================= +void SelectMgr_BVHThreadPool::AddEntity (const Handle(Select3D_SensitiveEntity)& theEntity) +{ + if (!theEntity->ToBuildBVH()) + { + return; + } + + { + Standard_Mutex::Sentry aSentry (myBVHListMutex); + myBVHToBuildList.Append (theEntity); + myWakeEvent.Set(); + myIdleEvent.Reset(); + } + + if (!myIsStarted) + { + myIsStarted = Standard_True; + for (Standard_Integer i = myBVHThreads.Lower(); i <= myBVHThreads.Upper(); ++i) + { + myBVHThreads.ChangeValue(i).Run ((Standard_Address) (&myBVHThreads.ChangeValue(i))); + } + } +} + +//======================================================================= +//function : performThread +//purpose : +//======================================================================= +void SelectMgr_BVHThreadPool::BVHThread::performThread() +{ + OSD::SetThreadLocalSignal (OSD::SignalMode(), myToCatchFpe); + + for (;;) + { + myPool->myWakeEvent.Wait(); + + if (myPool->myToStopBVHThread) + { + return; + } + + myPool->myBVHListMutex.Lock(); + if (myPool->myBVHToBuildList.IsEmpty()) + { + myPool->myWakeEvent.Reset(); + myPool->myIdleEvent.Set(); + myPool->myBVHListMutex.Unlock(); + continue; + } + Handle(Select3D_SensitiveEntity) anEntity = myPool->myBVHToBuildList.First(); + myPool->myBVHToBuildList.RemoveFirst(); + + Standard_Mutex::Sentry anEntry (myMutex); + myPool->myBVHListMutex.Unlock(); + + if (!anEntity.IsNull()) + { + try + { + OCC_CATCH_SIGNALS + anEntity->BVH(); + } + catch (Standard_Failure const& aFailure) + { + TCollection_AsciiString aMsg = TCollection_AsciiString (aFailure.DynamicType()->Name()) + + ": " + aFailure.GetMessageString(); + Message::DefaultMessenger()->SendFail (aMsg); + } + catch (std::exception& anStdException) + { + TCollection_AsciiString aMsg = TCollection_AsciiString (typeid(anStdException).name()) + + ": " + anStdException.what(); + Message::DefaultMessenger()->SendFail (aMsg); + } + catch (...) + { + Message::DefaultMessenger()->SendFail ("Error: Unknown exception"); + } + } + } +} + +// ======================================================================= +// function : runThread +// purpose : +// ======================================================================= +Standard_Address SelectMgr_BVHThreadPool::BVHThread::runThread (Standard_Address theTask) +{ + BVHThread* aThread = static_cast(theTask); + aThread->performThread(); + return NULL; +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_BVHThreadPool.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_BVHThreadPool.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_BVHThreadPool.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_BVHThreadPool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,165 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _SelectMgr_BVHThreadPool_HeaderFile +#define _SelectMgr_BVHThreadPool_HeaderFile + +#include +#include +#include +#include +#include +#include + +//! Class defining a thread pool for building BVH for the list of Select3D_SensitiveEntity within background thread(s). +class SelectMgr_BVHThreadPool : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(SelectMgr_BVHThreadPool, Standard_Transient) +public: + //! Main constructor + Standard_EXPORT SelectMgr_BVHThreadPool (Standard_Integer theNbThreads); + + //! Destructor + Standard_EXPORT virtual ~SelectMgr_BVHThreadPool(); + +public: + + //! Thread with back reference to thread pool and thread mutex in it. + class BVHThread : public OSD_Thread + { + friend class SelectMgr_BVHThreadPool; + public: + + BVHThread() + : OSD_Thread(), + myToCatchFpe (Standard_False) + { + + } + + //! Returns mutex used for BVH building + Standard_Mutex& BVHMutex() + { + return myMutex; + } + + //! Assignment operator. + BVHThread& operator= (const BVHThread& theCopy) + { + Assign (theCopy); + return *this; + } + + //! Assignment operator. + void Assign (const BVHThread& theCopy) + { + OSD_Thread::Assign (theCopy); + myPool = theCopy.myPool; + myToCatchFpe = theCopy.myToCatchFpe; + } + + private: + //! Method is executed in the context of thread. + void performThread(); + + //! Method is executed in the context of thread. + static Standard_Address runThread (Standard_Address theTask); + + private: + + SelectMgr_BVHThreadPool* myPool; + Standard_Mutex myMutex; + bool myToCatchFpe; + }; + +public: + //! Queue a sensitive entity to build its BVH + Standard_EXPORT void AddEntity (const Handle(Select3D_SensitiveEntity)& theEntity); + + //! Stops threads + Standard_EXPORT void StopThreads(); + + //! Waits for all threads finish their jobs + Standard_EXPORT void WaitThreads(); + + //! Returns array of threads + NCollection_Array1& Threads() + { + return myBVHThreads; + } + +public: + + //! Class providing a simple interface to mutexes for list of BVHThread + class Sentry + { + public: + + //! Constructor - initializes the sentry object and locks list of mutexes immediately + Sentry (const Handle(SelectMgr_BVHThreadPool)& thePool) + : myPool (thePool) + { + Lock(); + } + + //! Destructor - unlocks list of mutexes if already locked. + ~Sentry() + { + Unlock(); + } + + //! Lock list of mutexes + void Lock() + { + if (!myPool.IsNull()) + { + for (Standard_Integer i = myPool->Threads().Lower(); i <= myPool->Threads().Upper(); ++i) + { + myPool->Threads().ChangeValue(i).BVHMutex().Lock(); + } + } + } + + //! Unlock list of mutexes + void Unlock() + { + if (!myPool.IsNull()) + { + for (Standard_Integer i = myPool->Threads().Lower(); i <= myPool->Threads().Upper(); ++i) + { + myPool->Threads().ChangeValue(i).BVHMutex().Unlock(); + } + } + } + + //! This method should not be called (prohibited). + Sentry (const Sentry &); + //! This method should not be called (prohibited). + Sentry& operator = (const Sentry &); + + private: + Handle(SelectMgr_BVHThreadPool) myPool; + }; + +protected: + + NCollection_List myBVHToBuildList; //!< list of queued sensitive entities + NCollection_Array1 myBVHThreads; //!< threads to build BVH + Standard_Boolean myToStopBVHThread; //!< flag to stop BVH threads + Standard_Mutex myBVHListMutex; //!< mutex for interaction with myBVHToBuildList + Standard_Condition myWakeEvent; //!< raises when any sensitive is added to the BVH list + Standard_Condition myIdleEvent; //!< raises when BVH list become empty + Standard_Boolean myIsStarted; //!< indicates that threads are running +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,252 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + //! Compute polyline of shrunk triangle. + static Handle(TColgp_HSequenceOfPnt) shrunkTriangle (const gp_Pnt* thePnts, + const gp_XYZ& theCenter) + { + const gp_XYZ aV1 = theCenter + (thePnts[0].XYZ() - theCenter) * 0.9; + const gp_XYZ aV2 = theCenter + (thePnts[1].XYZ() - theCenter) * 0.9; + const gp_XYZ aV3 = theCenter + (thePnts[2].XYZ() - theCenter) * 0.9; + Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt(); + aPoints->Append (aV1); + aPoints->Append (aV2); + aPoints->Append (aV3); + aPoints->Append (aV1); + return aPoints; + } + + //! Fill in triangulation polylines. + static void addTriangulation (Prs3d_NListOfSequenceOfPnt& theSeqLines, + Prs3d_NListOfSequenceOfPnt& theSeqFree, + const Handle(Select3D_SensitiveTriangulation)& theTri, + const gp_Trsf& theLoc) + { + gp_Trsf aTrsf = theLoc; + if (theTri->HasInitLocation()) + { + aTrsf = theLoc * theTri->GetInitLocation(); + } + const Handle(Poly_Triangulation)& aPolyTri = theTri->Triangulation(); + for (Standard_Integer aTriIter = 1; aTriIter <= aPolyTri->NbTriangles(); ++aTriIter) + { + const Poly_Triangle& aTri = aPolyTri->Triangle (aTriIter); + const gp_Pnt aPnts[3] = + { + aPolyTri->Node (aTri (1)).Transformed (aTrsf), + aPolyTri->Node (aTri (2)).Transformed (aTrsf), + aPolyTri->Node (aTri (3)).Transformed (aTrsf) + }; + const gp_XYZ aCenter = (aPnts[0].XYZ() + aPnts[1].XYZ() + aPnts[2].XYZ()) / 3.0; + theSeqLines.Append (shrunkTriangle (aPnts, aCenter)); + } + + Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt(); + Prs3d::AddFreeEdges (*aPoints, aPolyTri, aTrsf); + if (!aPoints->IsEmpty()) + { + theSeqFree.Append (aPoints); + } + } + + //! Fill in bounding box polylines. + static void addBoundingBox (Prs3d_NListOfSequenceOfPnt& theSeqLines, + const Handle(Select3D_SensitiveBox)& theSensBox, + const gp_Trsf& theLoc) + { + Graphic3d_Vec3d aMin, aMax; + theSensBox->Box().Get (aMin.x(), aMin.y(), aMin.z(), aMax.x(), aMax.y(), aMax.z()); + gp_Pnt aPnts[8] = + { + gp_Pnt(aMin.x(), aMin.y(), aMin.z()), + gp_Pnt(aMax.x(), aMin.y(), aMin.z()), + gp_Pnt(aMax.x(), aMax.y(), aMin.z()), + gp_Pnt(aMin.x(), aMax.y(), aMin.z()), + gp_Pnt(aMin.x(), aMin.y(), aMax.z()), + gp_Pnt(aMax.x(), aMin.y(), aMax.z()), + gp_Pnt(aMax.x(), aMax.y(), aMax.z()), + gp_Pnt(aMin.x(), aMax.y(), aMax.z()) + }; + for (Standard_Integer aPntIter = 0; aPntIter <= 7; ++aPntIter) + { + aPnts[aPntIter].Transform (theLoc); + } + + { + Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt(); + for (Standard_Integer i = 0; i < 4; ++i) + { + aPoints->Append (aPnts[i]); + } + aPoints->Append (aPnts[0]); + theSeqLines.Append (aPoints); + } + { + Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt(); + for (Standard_Integer i = 4; i < 8; i++) + { + aPoints->Append (aPnts[i]); + } + aPoints->Append (aPnts[4]); + theSeqLines.Append (aPoints); + } + for (Standard_Integer i = 0; i < 4; i++) + { + Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt(); + aPoints->Append (aPnts[i]); + aPoints->Append (aPnts[i+4]); + theSeqLines.Append (aPoints); + } + } +} + +//======================================================================= +//function : ComputeSensitivePrs +//purpose : +//======================================================================= +void SelectMgr::ComputeSensitivePrs (const Handle(Graphic3d_Structure)& thePrs, + const Handle(SelectMgr_Selection)& theSel, + const gp_Trsf& theLoc, + const Handle(Graphic3d_TransformPers)& theTrsfPers) +{ + thePrs->SetTransformPersistence (theTrsfPers); + + Prs3d_NListOfSequenceOfPnt aSeqLines, aSeqFree; + TColgp_SequenceOfPnt aSeqPoints; + for (NCollection_Vector::Iterator aSelEntIter (theSel->Entities()); aSelEntIter.More(); aSelEntIter.Next()) + { + const Handle(Select3D_SensitiveEntity)& anEnt = aSelEntIter.Value()->BaseSensitive(); + if (Handle(Select3D_SensitiveBox) aSensBox = Handle(Select3D_SensitiveBox)::DownCast (anEnt)) + { + addBoundingBox (aSeqLines, aSensBox, theLoc); + } + else if (Handle(Select3D_SensitiveFace) aFace = Handle(Select3D_SensitiveFace)::DownCast(anEnt)) + { + Handle(TColgp_HArray1OfPnt) aSensPnts; + aFace->GetPoints (aSensPnts); + Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt(); + for (TColgp_HArray1OfPnt::Iterator aPntIter (*aSensPnts); aPntIter.More(); aPntIter.Next()) + { + aPoints->Append (aPntIter.Value().Transformed (theLoc)); + } + aSeqLines.Append (aPoints); + } + else if (Handle(Select3D_SensitivePoly) aSensPoly = Handle(Select3D_SensitivePoly)::DownCast (anEnt)) + { + Standard_Integer aFrom = 0, aTo = 0; + aSensPoly->ArrayBounds (aFrom, aTo); + Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt(); + for (Standard_Integer aPntIter = aFrom; aPntIter <= aTo; ++aPntIter) + { + aPoints->Append (aSensPoly->GetPoint3d (aPntIter).Transformed (theLoc)); + } + aSeqLines.Append (aPoints); + } + else if (Handle(Select3D_SensitiveWire) aWire = Handle(Select3D_SensitiveWire)::DownCast(anEnt)) + { + const NCollection_Vector& anEntities = aWire->GetEdges(); + for (NCollection_Vector::Iterator aSubIter (anEntities); aSubIter.More(); aSubIter.Next()) + { + const Handle(Select3D_SensitiveEntity)& aSubEnt = aSubIter.Value(); + if (Handle(Select3D_SensitiveSegment) aSensSeg = Handle(Select3D_SensitiveSegment)::DownCast (aSubEnt)) + { + Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt(); + aPoints->Append (aSensSeg->StartPoint().Transformed (theLoc)); + aPoints->Append (aSensSeg->EndPoint() .Transformed (theLoc)); + aSeqLines.Append (aPoints); + } + else if (Handle(Select3D_SensitivePoly) aSubSensPoly = Handle(Select3D_SensitivePoly)::DownCast (aSubEnt)) + { + Standard_Integer aFrom = 0, aTo = 0; + aSubSensPoly->ArrayBounds (aFrom, aTo); + Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt(); + for (Standard_Integer aPntIter = aFrom; aPntIter <= aTo; ++aPntIter) + { + aPoints->Append (aSubSensPoly->GetPoint3d (aPntIter).Transformed (theLoc)); + } + aSeqLines.Append (aPoints); + } + } + } + else if (Handle(Select3D_SensitiveSegment) aSensSeg = Handle(Select3D_SensitiveSegment)::DownCast(anEnt)) + { + Handle(TColgp_HSequenceOfPnt) aPoints = new TColgp_HSequenceOfPnt(); + aPoints->Append (aSensSeg->StartPoint().Transformed (theLoc)); + aPoints->Append (aSensSeg->EndPoint() .Transformed (theLoc)); + aSeqLines.Append (aPoints); + } + else if (Handle(Select3D_SensitivePoint) aSensPnt = Handle(Select3D_SensitivePoint)::DownCast(anEnt)) + { + aSeqPoints.Append (aSensPnt->Point().Transformed (theLoc)); + } + else if (Handle(Select3D_SensitiveTriangulation) aSensTri = Handle(Select3D_SensitiveTriangulation)::DownCast (anEnt)) + { + addTriangulation (aSeqLines, aSeqFree, aSensTri, theLoc); + } + else if (Handle(Select3D_SensitiveTriangle) aSensTri1 = Handle(Select3D_SensitiveTriangle)::DownCast(anEnt)) + { + gp_Pnt aPnts[3]; + aSensTri1->Points3D (aPnts[0], aPnts[1], aPnts[2]); + aPnts[0].Transform (theLoc); + aPnts[1].Transform (theLoc); + aPnts[2].Transform (theLoc); + aSeqLines.Append (shrunkTriangle (aPnts, aSensTri1->Center3D().XYZ())); + } + } + + if (!aSeqPoints.IsEmpty()) + { + Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (aSeqPoints.Size()); + for (TColgp_SequenceOfPnt::Iterator aPntIter (aSeqPoints); aPntIter.More(); aPntIter.Next()) + { + anArrayOfPoints->AddVertex (aPntIter.Value()); + } + + Handle(Graphic3d_Group) aSensPntGroup = thePrs->NewGroup(); + aSensPntGroup->SetPrimitivesAspect (new Graphic3d_AspectMarker3d (Aspect_TOM_O_PLUS, Quantity_NOC_INDIANRED3, 2.0)); + aSensPntGroup->AddPrimitiveArray (anArrayOfPoints); + } + if (!aSeqLines.IsEmpty()) + { + Prs3d::AddPrimitivesGroup (thePrs, new Prs3d_LineAspect (Quantity_NOC_AQUAMARINE1, Aspect_TOL_DASH, 1.0), aSeqLines); + } + if (!aSeqFree.IsEmpty()) + { + Prs3d::AddPrimitivesGroup (thePrs, new Prs3d_LineAspect (Quantity_NOC_GREEN, Aspect_TOL_SOLID, 2.0), aSeqFree); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_EntityOwner.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_EntityOwner.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_EntityOwner.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_EntityOwner.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -87,12 +87,14 @@ // function : DumpJson // purpose : // ======================================================================= -void SelectMgr_EntityOwner::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const +void SelectMgr_EntityOwner::DumpJson (Standard_OStream& theOStream, Standard_Integer) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, SelectMgr_EntityOwner); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, mySelectable); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mypriority); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsSelected); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFromDecomposition); + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, this) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, mySelectable) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mypriority) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsSelected) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFromDecomposition) } diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_EntityOwner.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_EntityOwner.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_EntityOwner.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_EntityOwner.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -188,7 +188,7 @@ void SetComesFromDecomposition (const Standard_Boolean theIsFromDecomposition) { myFromDecomposition = theIsFromDecomposition; } //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; public: diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_FilterType.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_FilterType.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_FilterType.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_FilterType.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,24 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _SelectMgr_FilterType_HeaderFile +#define _SelectMgr_FilterType_HeaderFile + +//! Enumeration defines the filter type. +enum SelectMgr_FilterType +{ + SelectMgr_FilterType_AND, //!< an object should be suitable for all filters. + SelectMgr_FilterType_OR //!< an object should be suitable at least one filter. +}; + +#endif // _SelectMgr_FilterType_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_Frustum.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_Frustum.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_Frustum.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_Frustum.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -56,7 +56,16 @@ { public: - SelectMgr_Frustum() : SelectMgr_BaseFrustum() {}; + SelectMgr_Frustum() : SelectMgr_BaseFrustum() + { + memset (myMaxOrthoVertsProjections, 0, sizeof (myMaxOrthoVertsProjections)); + memset (myMinOrthoVertsProjections, 0, sizeof (myMinOrthoVertsProjections)); + memset (myMaxVertsProjections, 0, sizeof (myMaxVertsProjections)); + memset (myMinVertsProjections, 0, sizeof (myMinVertsProjections)); + } + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_Frustum.lxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_Frustum.lxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_Frustum.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_Frustum.lxx 2021-02-02 08:51:56.000000000 +0000 @@ -461,3 +461,49 @@ return Standard_True; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +template +void SelectMgr_Frustum::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + const Standard_Integer anIncFactor = (myIsOrthographic && N == 4) ? 2 : 1; + for (Standard_Integer aPlaneIdx = 0; aPlaneIdx < N + 1; aPlaneIdx += anIncFactor) + { + const gp_Vec& aPlane = myPlanes[aPlaneIdx]; + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &aPlane) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMaxVertsProjections[aPlaneIdx]) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMinVertsProjections[aPlaneIdx]) + } + + for (Standard_Integer aVertIdx = 0; aVertIdx < N * 2; ++aVertIdx) + { + const gp_Pnt& aVertex = myVertices[aVertIdx]; + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &aVertex) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPixelTolerance) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsOrthographic) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myBuilder) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myCamera) + + for (Standard_Integer anIndex = 0; anIndex < 3; anIndex++) + { + Standard_Real aMaxOrthoVertsProjections = myMaxOrthoVertsProjections[anIndex]; + Standard_Real aMinOrthoVertsProjections = myMinOrthoVertsProjections[anIndex]; + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aMaxOrthoVertsProjections) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aMinOrthoVertsProjections) + } + + for (Standard_Integer anIndex = 0; anIndex < 6; anIndex++) + { + const gp_Vec& anEdgeDir = myEdgeDirs[anIndex]; + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &anEdgeDir) + } +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,37 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _SelectMgr_HeaderFile +#define _SelectMgr_HeaderFile + +#include + +class Graphic3d_Structure; +class Graphic3d_TransformPers; +class SelectMgr_Selection; +class gp_Trsf; + +//! Auxiliary tools for SelectMgr package. +class SelectMgr +{ +public: + + //! Compute debug presentation for sensitive objects. + Standard_EXPORT static void ComputeSensitivePrs (const Handle(Graphic3d_Structure)& theStructure, + const Handle(SelectMgr_Selection)& theSel, + const gp_Trsf& theLoc, + const Handle(Graphic3d_TransformPers)& theTrsfPers); + +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_OrFilter.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_OrFilter.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_OrFilter.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_OrFilter.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -15,9 +15,7 @@ #include #include -#include #include -#include #include IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_OrFilter,SelectMgr_CompositionFilter) @@ -31,27 +29,12 @@ } //============================================================================= -//function : SetDisabledObjects -//purpose : -//============================================================================= -void SelectMgr_OrFilter::SetDisabledObjects (const Handle(Graphic3d_NMapOfTransient)& theObjects) -{ - myDisabledObjects = theObjects; -} - -//============================================================================= //function : IsOk //purpose : //============================================================================= Standard_Boolean SelectMgr_OrFilter::IsOk (const Handle(SelectMgr_EntityOwner)& theObj) const { - const SelectMgr_SelectableObject* aSelectable = theObj->Selectable().operator->(); - if (!myDisabledObjects.IsNull() - && myDisabledObjects->Contains (aSelectable)) - { - return Standard_False; - } - else if (myFilters.IsEmpty()) + if (myFilters.IsEmpty()) { return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_OrFilter.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_OrFilter.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_OrFilter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_OrFilter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,6 @@ #include #include -#include #include #include class SelectMgr_EntityOwner; @@ -41,26 +40,11 @@ Standard_EXPORT SelectMgr_OrFilter(); Standard_EXPORT Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& anobj) const Standard_OVERRIDE; - - //! Disable selection of specified objects. - Standard_EXPORT void SetDisabledObjects (const Handle(Graphic3d_NMapOfTransient)& theObjects); - - - DEFINE_STANDARD_RTTIEXT(SelectMgr_OrFilter,SelectMgr_CompositionFilter) protected: - - - -private: - - - Handle(Graphic3d_NMapOfTransient) myDisabledObjects; - - }; diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_RectangularFrustum.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_RectangularFrustum.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_RectangularFrustum.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_RectangularFrustum.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,7 @@ SelectBasics_PickResult& thePickResult) const { gp_XYZ anU = theSegPnt2.XYZ() - theSegPnt1.XYZ(); - gp_XYZ aV = myViewRayDir.XYZ(); + gp_XYZ aV = myFarPickedPnt.XYZ() - myNearPickedPnt.XYZ(); // use unnormalized vector instead of myViewRayDir to clip solutions behind Far plane gp_XYZ aW = theSegPnt1.XYZ() - myNearPickedPnt.XYZ(); Standard_Real anA = anU.Dot (anU); @@ -70,7 +70,7 @@ } aTc = (Abs (aTd) < gp::Resolution() ? 0.0 : aTn / aTd); - const gp_Pnt aClosestPnt = myNearPickedPnt.XYZ() + myViewRayDir.XYZ() * aTc; + const gp_Pnt aClosestPnt = myNearPickedPnt.XYZ() + aV * aTc; thePickResult.SetDepth (myNearPickedPnt.Distance (aClosestPnt) * myScale); const gp_Vec aPickedVec = aClosestPnt.XYZ() - theSegPnt1.XYZ(); @@ -97,7 +97,7 @@ const gp_Pnt& thePntOnPlane, SelectBasics_PickResult& thePickResult) const { - gp_XYZ anU = myViewRayDir.XYZ(); + gp_XYZ anU = myFarPickedPnt.XYZ() - myNearPickedPnt.XYZ(); // use unnormalized vector instead of myViewRayDir to clip solutions behind Far plane by > 1.0 check gp_XYZ aW = myNearPickedPnt.XYZ() - thePntOnPlane.XYZ(); Standard_Real aD = thePlane.Dot (anU); Standard_Real aN = -thePlane.Dot (aW); @@ -117,7 +117,7 @@ } Standard_Real aParam = aN / aD; - if (aParam < 0.0 || aParam > 1.0) + if (aParam < 0.0 || aParam > 1.0) // > 1.0 check could be removed for an infinite ray and anU=myViewRayDir { thePickResult.Invalidate(); return false; @@ -429,7 +429,7 @@ theTrsf.Transforms (aPoint.ChangeCoord()); aRes->myFarPickedPnt = aPoint; - aRes->myViewRayDir = aRes->myFarPickedPnt.XYZ() - aRes->myNearPickedPnt.XYZ(); + aRes->myViewRayDir = aRes->myFarPickedPnt.XYZ() - aRes->myNearPickedPnt.XYZ(); for (Standard_Integer anIt = 0; anIt < 8; anIt++) { @@ -533,10 +533,9 @@ return Standard_False; gp_XYZ aV = thePnt.XYZ() - myNearPickedPnt.XYZ(); - gp_Pnt aDetectedPnt = - myNearPickedPnt.XYZ() + myViewRayDir.XYZ() * (aV.Dot (myViewRayDir.XYZ()) / myViewRayDir.Dot (myViewRayDir)); + const Standard_Real aDepth = aV.Dot (myViewRayDir.XYZ()); - thePickResult.SetDepth (aDetectedPnt.Distance (myNearPickedPnt) * myScale); + thePickResult.SetDepth (Abs (aDepth) * myScale); thePickResult.SetPickedPoint (thePnt); return !theClipRange.IsClipped (thePickResult.Depth()); @@ -648,38 +647,47 @@ { gp_Vec aTriangleNormal (gp_XYZ (RealLast(), RealLast(), RealLast())); if (!hasOverlap (thePnt1, thePnt2, thePnt3, aTriangleNormal)) + { return Standard_False; + } - // check if intersection point belongs to triangle's interior part - gp_XYZ aTrEdges[3] = { thePnt2.XYZ() - thePnt1.XYZ(), - thePnt3.XYZ() - thePnt2.XYZ(), - thePnt1.XYZ() - thePnt3.XYZ() }; + const gp_XYZ aTrEdges[3] = { thePnt2.XYZ() - thePnt1.XYZ(), + thePnt3.XYZ() - thePnt2.XYZ(), + thePnt1.XYZ() - thePnt3.XYZ() }; + if (aTriangleNormal.SquareMagnitude() < gp::Resolution()) + { + // consider degenerated triangle as point or segment + return aTrEdges[0].SquareModulus() > gp::Resolution() + ? Overlaps (thePnt1, thePnt2, theClipRange, thePickResult) + : (aTrEdges[1].SquareModulus() > gp::Resolution() + ? Overlaps (thePnt2, thePnt3, theClipRange, thePickResult) + : Overlaps (thePnt1, theClipRange, thePickResult)); + } - Standard_Real anAlpha = aTriangleNormal.Dot (myViewRayDir); + const gp_Pnt aPnts[3] = {thePnt1, thePnt2, thePnt3}; + const Standard_Real anAlpha = aTriangleNormal.XYZ().Dot (myViewRayDir.XYZ()); if (Abs (anAlpha) < gp::Resolution()) { - // handle degenerated triangles: in this case, there is no possible way to detect overlap correctly. - if (aTriangleNormal.SquareMagnitude() < gp::Resolution()) + // handle the case when triangle normal and selecting frustum direction are orthogonal + SelectBasics_PickResult aPickResult; + thePickResult.Invalidate(); + for (Standard_Integer anEdgeIter = 0; anEdgeIter < 3; ++anEdgeIter) { - return Standard_False; + const gp_Pnt& aStartPnt = aPnts[anEdgeIter]; + const gp_Pnt& anEndPnt = aPnts[anEdgeIter < 2 ? anEdgeIter + 1 : 0]; + segmentSegmentDistance (aStartPnt, anEndPnt, aPickResult); + thePickResult = SelectBasics_PickResult::Min (thePickResult, aPickResult); } - - // handle the case when triangle normal and selecting frustum direction are orthogonal: for this case, overlap - // is detected correctly, and distance to triangle's plane can be measured as distance to its arbitrary vertex. - const gp_XYZ aDiff = myNearPickedPnt.XYZ() - thePnt1.XYZ(); - thePickResult.SetDepth (aTriangleNormal.Dot (aDiff) * myScale); - thePickResult.SetPickedPoint (thePnt1); return !theClipRange.IsClipped (thePickResult.Depth()); } - gp_XYZ anEdge = (thePnt1.XYZ() - myNearPickedPnt.XYZ()) * (1.0 / anAlpha); - - Standard_Real aTime = aTriangleNormal.Dot (anEdge); - - gp_XYZ aVec = myViewRayDir.XYZ().Crossed (anEdge); + // check if intersection point belongs to triangle's interior part + const gp_XYZ anEdge = (thePnt1.XYZ() - myNearPickedPnt.XYZ()) * (1.0 / anAlpha); - Standard_Real anU = aVec.Dot (aTrEdges[2]); - Standard_Real aV = aVec.Dot (aTrEdges[0]); + const Standard_Real aTime = aTriangleNormal.Dot (anEdge); + const gp_XYZ aVec = myViewRayDir.XYZ().Crossed (anEdge); + const Standard_Real anU = aVec.Dot (aTrEdges[2]); + const Standard_Real aV = aVec.Dot (aTrEdges[0]); const Standard_Boolean isInterior = (aTime >= 0.0) && (anU >= 0.0) && (aV >= 0.0) && (anU + aV <= 1.0); const gp_Pnt aPtOnPlane = myNearPickedPnt.XYZ() + myViewRayDir.XYZ() * aTime; @@ -687,24 +695,31 @@ { thePickResult.SetDepth (myNearPickedPnt.Distance (aPtOnPlane) * myScale); thePickResult.SetPickedPoint (aPtOnPlane); + thePickResult.SetSurfaceNormal (aTriangleNormal); return !theClipRange.IsClipped (thePickResult.Depth()); } - gp_Pnt aPnts[3] = {thePnt1, thePnt2, thePnt3}; Standard_Real aMinDist = RealLast(); - Standard_Integer aNearestEdgeIdx = -1; + Standard_Integer aNearestEdgeIdx1 = -1; for (Standard_Integer anEdgeIdx = 0; anEdgeIdx < 3; ++anEdgeIdx) { gp_XYZ aW = aPtOnPlane.XYZ() - aPnts[anEdgeIdx].XYZ(); Standard_Real aCoef = aTrEdges[anEdgeIdx].Dot (aW) / aTrEdges[anEdgeIdx].Dot (aTrEdges[anEdgeIdx]); Standard_Real aDist = aPtOnPlane.Distance (aPnts[anEdgeIdx].XYZ() + aCoef * aTrEdges[anEdgeIdx]); - if (aMinDist > aDist) + if (aDist < aMinDist) { aMinDist = aDist; - aNearestEdgeIdx = anEdgeIdx; + aNearestEdgeIdx1 = anEdgeIdx; } } - segmentSegmentDistance (aPnts[aNearestEdgeIdx], aPnts[(aNearestEdgeIdx + 1) % 3], thePickResult); + Standard_Integer aNearestEdgeIdx2 = (aNearestEdgeIdx1 + 1) % 3; + const gp_Vec aVec12 (aPnts[aNearestEdgeIdx1], aPnts[aNearestEdgeIdx2]); + if (aVec12.SquareMagnitude() > gp::Resolution() + && myViewRayDir.IsParallel (aVec12, Precision::Angular())) + { + aNearestEdgeIdx2 = aNearestEdgeIdx1 == 0 ? 2 : aNearestEdgeIdx1 - 1; + } + segmentSegmentDistance (aPnts[aNearestEdgeIdx1], aPnts[aNearestEdgeIdx2], thePickResult); } return !theClipRange.IsClipped (thePickResult.Depth()); @@ -727,7 +742,7 @@ // ======================================================================= gp_Pnt SelectMgr_RectangularFrustum::DetectedPoint (const Standard_Real theDepth) const { - return myNearPickedPnt.XYZ() + myViewRayDir.Normalized().XYZ() * theDepth / myScale; + return myNearPickedPnt.XYZ() + myViewRayDir.XYZ() * theDepth / myScale; } // ======================================================================= @@ -750,3 +765,20 @@ thePlaneEquations.Append (anEquation); } } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void SelectMgr_RectangularFrustum::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, SelectMgr_RectangularFrustum) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, SelectMgr_Frustum) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myNearPickedPnt) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myFarPickedPnt) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myViewRayDir) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myMousePos) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myScale) +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_RectangularFrustum.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_RectangularFrustum.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_RectangularFrustum.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_RectangularFrustum.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -120,7 +120,7 @@ inline const gp_Pnt& GetFarPnt() const { return myFarPickedPnt; } //! Return view ray direction. - const gp_Vec& GetViewRayDirection() const { return myViewRayDir; } + const gp_Dir& GetViewRayDirection() const { return myViewRayDir; } //! Return mouse coordinates. const gp_Pnt2d& GetMousePosition() const { return myMousePos; } @@ -129,6 +129,9 @@ //! Ax + By + Cz + D = 0) to the given vector Standard_EXPORT virtual void GetPlanes (NCollection_Vector& thePlaneEquations) const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: Standard_EXPORT void segmentSegmentDistance (const gp_Pnt& theSegPnt1, @@ -153,7 +156,7 @@ gp_Pnt myNearPickedPnt; //!< 3d projection of user-picked selection point onto near view plane gp_Pnt myFarPickedPnt; //!< 3d projection of user-picked selection point onto far view plane - gp_Vec myViewRayDir; + gp_Dir myViewRayDir; gp_Pnt2d myMousePos; //!< Mouse coordinates Standard_Real myScale; //!< Scale factor of applied transformation, if there was any diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObject.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObject.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObject.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObject.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,7 +49,6 @@ SelectMgr_SelectableObject::SelectMgr_SelectableObject (const PrsMgr_TypeOfPresentation3d aTypeOfPresentation3d) : PrsMgr_PresentableObject (aTypeOfPresentation3d), myGlobalSelMode (0), - mycurrent (0), myAutoHilight (Standard_True) { // @@ -553,11 +552,21 @@ // function : DumpJson // purpose : // ======================================================================= -void SelectMgr_SelectableObject::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void SelectMgr_SelectableObject::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, SelectMgr_SelectableObject); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_BASE_CLASS (theOStream, theDepth, PrsMgr_PresentableObject); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myGlobalSelMode); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAutoHilight); + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, PrsMgr_PresentableObject) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, mySelectionPrs.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myHilightPrs.get()) + + for (SelectMgr_SequenceOfSelection::Iterator anIterator (myselections); anIterator.More(); anIterator.Next()) + { + const Handle(SelectMgr_Selection)& aSelection = anIterator.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aSelection.get()) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myGlobalSelMode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myAutoHilight) } diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObject.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObject.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObject.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObject.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -170,25 +170,7 @@ Standard_EXPORT virtual const Handle(SelectMgr_EntityOwner)& GetAssemblyOwner() const; //! Dumps the content of me into the stream - Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const Standard_OVERRIDE; - -public: - - //! Begins the iteration scanning for sensitive primitives. - Standard_DEPRECATED("Deprecated method, Selections() should be used instead") - void Init() { mycurrent = 1; } - - //! Continues the iteration scanning for sensitive primitives. - Standard_DEPRECATED("Deprecated method, Selections() should be used instead") - Standard_Boolean More() const { return mycurrent <= myselections.Length(); } - - //! Continues the iteration scanning for sensitive primitives. - Standard_DEPRECATED("Deprecated method, Selections() should be used instead") - void Next() { ++mycurrent; } - - //! Returns the current selection in this framework. - Standard_DEPRECATED("Deprecated method, Selections() should be used instead") - const Handle(SelectMgr_Selection)& CurrentSelection() const { return myselections (mycurrent); } + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; protected: @@ -214,7 +196,6 @@ Handle(Prs3d_Presentation) mySelectionPrs; //!< optional presentation for highlighting selected object Handle(Prs3d_Presentation) myHilightPrs; //!< optional presentation for highlighting detected object Standard_Integer myGlobalSelMode; //!< global selection mode - Standard_Integer mycurrent; //!< [deprecated] iterator value Standard_Boolean myAutoHilight; //!< auto-highlighting flag defining }; diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObjectSet.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObjectSet.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObjectSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObjectSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -389,3 +389,29 @@ myIsDirty[BVHSubset_3dPersistent] = Standard_True; myIsDirty[BVHSubset_2dPersistent] = Standard_True; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void SelectMgr_SelectableObjectSet::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + for (Standard_Integer aSubsetIdx = 0; aSubsetIdx < BVHSubsetNb; ++aSubsetIdx) + { + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aSubsetIdx) + + Standard_Boolean IsDirty = myIsDirty[aSubsetIdx]; + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, IsDirty) + + for (NCollection_IndexedMap::Iterator anObjectIt (myObjects[aSubsetIdx]); + anObjectIt.More(); anObjectIt.Next()) + { + const Handle(SelectMgr_SelectableObject)& SelectableObject = anObjectIt.Value(); + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, SelectableObject.get()) + } + + TCollection_AsciiString separator; + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, separator) + } + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLastWidth) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLastHeight) +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObjectSet.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObjectSet.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObjectSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectableObjectSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -180,6 +180,9 @@ return myBVH[theSubset]; } + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + private: //! Returns an appropriate subset of theObject given depending on its persistence type. diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectingVolumeManager.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectingVolumeManager.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectingVolumeManager.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectingVolumeManager.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,6 +14,7 @@ // commercial license or contractual agreement. #include +#include //======================================================================= // function : SelectMgr_SelectingVolumeManager @@ -229,6 +230,7 @@ return; mySelectingVolumes[FrustumSet]->Build (thePoints); + Handle(SelectMgr_TriangularFrustumSet)::DownCast (mySelectingVolumes[FrustumSet])->SetAllowOverlapDetection (IsOverlapAllowed()); } //======================================================================= @@ -401,7 +403,7 @@ //======================================================================= Standard_Boolean SelectMgr_SelectingVolumeManager::IsOverlapAllowed() const { - return myActiveSelectionType != Box || myToAllowOverlap; + return myToAllowOverlap || myActiveSelectionType == Point; } //======================================================================= @@ -413,8 +415,7 @@ if (myActiveSelectionType == Polyline) return NULL; - const SelectMgr_RectangularFrustum* aFr = - reinterpret_cast (mySelectingVolumes[myActiveSelectionType / 2].get()); + const SelectMgr_RectangularFrustum* aFr = static_cast (mySelectingVolumes[myActiveSelectionType / 2].get()); return aFr->GetVertices(); } @@ -427,8 +428,7 @@ if (myActiveSelectionType == Polyline) return gp_Pnt(); - const SelectMgr_RectangularFrustum* aFr = - reinterpret_cast (mySelectingVolumes[myActiveSelectionType / 2].get()); + const SelectMgr_RectangularFrustum* aFr = static_cast (mySelectingVolumes[myActiveSelectionType / 2].get()); return aFr->GetNearPnt(); } @@ -441,8 +441,7 @@ if (myActiveSelectionType == Polyline) return gp_Pnt(); - const SelectMgr_RectangularFrustum* aFr = - reinterpret_cast (mySelectingVolumes[myActiveSelectionType / 2].get()); + const SelectMgr_RectangularFrustum* aFr = static_cast (mySelectingVolumes[myActiveSelectionType / 2].get()); return aFr->GetFarPnt(); } @@ -451,14 +450,16 @@ // purpose : //======================================================================= void SelectMgr_SelectingVolumeManager::SetViewClipping (const Handle(Graphic3d_SequenceOfHClipPlane)& theViewPlanes, - const Handle(Graphic3d_SequenceOfHClipPlane)& theObjPlanes) + const Handle(Graphic3d_SequenceOfHClipPlane)& theObjPlanes, + const SelectMgr_SelectingVolumeManager* theWorldSelMgr) { myViewClipPlanes = theViewPlanes; myObjectClipPlanes = theObjPlanes; if (myActiveSelectionType != Point) return; - const SelectMgr_RectangularFrustum* aFrustum = reinterpret_cast(mySelectingVolumes[Frustum].get()); + const SelectMgr_SelectingVolumeManager* aWorldSelMgr = theWorldSelMgr != NULL ? theWorldSelMgr : this; + const SelectMgr_RectangularFrustum* aFrustum = static_cast(aWorldSelMgr->mySelectingVolumes[Frustum].get()); myViewClipRange.SetVoid(); if (!theViewPlanes.IsNull() && !theViewPlanes->IsEmpty()) @@ -482,3 +483,24 @@ myObjectClipPlanes = theOther.myObjectClipPlanes; myViewClipRange = theOther.myViewClipRange; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void SelectMgr_SelectingVolumeManager::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, SelectMgr_SelectingVolumeManager) + + for (Standard_Integer anIdx = 0; anIdx < VolumeTypesNb; ++anIdx) + { + const Handle(SelectMgr_BaseFrustum)& aSelectingVolume = mySelectingVolumes[anIdx]; + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aSelectingVolume.get()) + } + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myViewClipPlanes.get()) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myObjectClipPlanes.get()) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myViewClipRange) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToAllowOverlap) +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectingVolumeManager.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectingVolumeManager.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectingVolumeManager.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectingVolumeManager.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,7 @@ //! Creates instances of all available selecting volume types Standard_EXPORT SelectMgr_SelectingVolumeManager (Standard_Boolean theToAllocateFrustums = Standard_True); - virtual ~SelectMgr_SelectingVolumeManager() {}; + virtual ~SelectMgr_SelectingVolumeManager() {} //! IMPORTANT: Scaling makes sense only for frustum built on a single point! //! Note that this method does not perform any checks on type of the frustum. @@ -158,7 +158,6 @@ //! Throws exception if active selection type is not Point. Standard_EXPORT virtual gp_Pnt DetectedPoint (const Standard_Real theDepth) const Standard_OVERRIDE; - //! Is used for rectangular selection only //! If theIsToAllow is false, only fully included sensitives will be detected, otherwise the algorithm will //! mark both included and overlapped entities as matched Standard_EXPORT virtual void AllowOverlapDetection (const Standard_Boolean theIsToAllow); @@ -173,10 +172,12 @@ //! Valid for point selection only! //! Computes depth range for clipping planes. - //! @param theViewPlanes global view planes - //! @param theObjPlanes object planes + //! @param theViewPlanes [in] global view planes + //! @param theObjPlanes [in] object planes + //! @param theWorldSelMgr [in] selection volume in world space for computing clipping plane ranges Standard_EXPORT void SetViewClipping (const Handle(Graphic3d_SequenceOfHClipPlane)& theViewPlanes, - const Handle(Graphic3d_SequenceOfHClipPlane)& theObjPlanes); + const Handle(Graphic3d_SequenceOfHClipPlane)& theObjPlanes, + const SelectMgr_SelectingVolumeManager* theWorldSelMgr); //! Copy clipping planes from another volume manager. Standard_EXPORT void SetViewClipping (const SelectMgr_SelectingVolumeManager& theOther); @@ -236,6 +237,9 @@ return mySelectingVolumes[myActiveSelectionType / 2]->GetPlanes (thePlaneEquations); } + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + private: enum { Frustum, FrustumSet, VolumeTypesNb }; //!< Defines the amount of available selecting volumes diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_Selection.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_Selection.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_Selection.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_Selection.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,8 +26,7 @@ // Purpose : //================================================== SelectMgr_Selection::SelectMgr_Selection (const Standard_Integer theModeIdx) -: myEntityIter (0), - myMode (theModeIdx), +: myMode (theModeIdx), mySelectionState (SelectMgr_SOS_Unknown), myBVHUpdateStatus (SelectMgr_TBU_None), mySensFactor (2), @@ -116,3 +115,25 @@ anEntity->BaseSensitive()->SetSensitivityFactor (theNewSens); } } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void SelectMgr_Selection::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + for (NCollection_Vector::Iterator anIterator (myEntities); anIterator.More(); anIterator.Next()) + { + const Handle(SelectMgr_SensitiveEntity)& anEntity = anIterator.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, anEntity.get()) + } + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMode) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySelectionState) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mySensFactor) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUpdateStatus) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBVHUpdateStatus) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsCustomSens) +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_Selection.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_Selection.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_Selection.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_Selection.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -92,25 +92,6 @@ //! Return entities. NCollection_Vector& ChangeEntities() { return myEntities; } - //! Begins an iteration scanning for sensitive primitives. - Standard_DEPRECATED("Deprecated method, Entities() should be used instead") - void Init() { myEntityIter = myEntities.Lower(); } - - //! Continues the iteration scanning for sensitive - //! primitives with the mode defined in this framework. - Standard_DEPRECATED("Deprecated method, Entities() should be used instead") - Standard_Boolean More() const { return myEntityIter <= myEntities.Upper(); } - - //! Returns the next sensitive primitive found in the - //! iteration. This is a scan for entities with the mode - //! defined in this framework. - Standard_DEPRECATED("Deprecated method, Entities() should be used instead") - void Next() { ++myEntityIter; } - - //! Returns any sensitive primitive in this framework. - Standard_DEPRECATED("Deprecated method, Entities() should be used instead") - const Handle(SelectMgr_SensitiveEntity)& Sensitive() const { return myEntities.Value (myEntityIter); } - //! Returns the flag UpdateFlag. //! This flage gives the update status of this framework //! in a ViewerSelector object: @@ -139,10 +120,12 @@ //! proper updates use SelectMgr_SelectionManager::SetSelectionSensitivity method. Standard_EXPORT void SetSensitivity (const Standard_Integer theNewSens); + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + private: NCollection_Vector myEntities; - Standard_Integer myEntityIter; Standard_Integer myMode; SelectMgr_TypeOfUpdate myUpdateStatus; mutable SelectMgr_StateOfSelection mySelectionState; diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectionImageFiller.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectionImageFiller.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectionImageFiller.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectionImageFiller.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,361 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include + +namespace +{ + //! Help class for filling pixel with random color. + class GeneratedEntityColorFiller : public SelectMgr_SelectionImageFiller + { + public: + GeneratedEntityColorFiller (Image_PixMap& thePixMap, + SelectMgr_ViewerSelector* theSelector) + : SelectMgr_SelectionImageFiller (thePixMap, theSelector) + { + // generate per-entity colors in the order as they have been activated + for (SelectMgr_SelectableObjectSet::Iterator anObjIter (theSelector->SelectableObjects()); anObjIter.More(); anObjIter.Next()) + { + const Handle(SelectMgr_SelectableObject)& anObj = anObjIter.Value(); + for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next()) + { + const Handle(SelectMgr_Selection)& aSel = aSelIter.Value(); + for (NCollection_Vector::Iterator aSelEntIter (aSel->Entities()); aSelEntIter.More(); aSelEntIter.Next()) + { + const Handle(SelectMgr_SensitiveEntity)& aSens = aSelEntIter.Value(); + if (!myMapEntityColors.IsBound (aSens->BaseSensitive())) + { + Quantity_Color aColor; + randomPastelColor (aColor); + myMapEntityColors.Bind (aSens->BaseSensitive(), aColor); + } + } + } + } + } + + virtual void Fill (const Standard_Integer theCol, + const Standard_Integer theRow, + const Standard_Integer thePicked) Standard_OVERRIDE + { + if (thePicked < 1 + || thePicked > myMainSel->NbPicked()) + { + myImage->SetPixelColor (theCol, theRow, Quantity_Color(Quantity_NOC_BLACK)); + return; + } + + const Handle(Select3D_SensitiveEntity)& aPickedEntity = myMainSel->PickedEntity (thePicked); + Quantity_Color aColor (Quantity_NOC_BLACK); + myMapEntityColors.Find (aPickedEntity, aColor); + myImage->SetPixelColor (theCol, theRow, aColor); + } + + protected: + NCollection_DataMap myMapEntityColors; + }; + + //! Help class for filling pixel with normalized depth of ray. + class NormalizedDepthFiller : public SelectMgr_SelectionImageFiller + { + public: + NormalizedDepthFiller (Image_PixMap& thePixMap, + SelectMgr_ViewerSelector* theSelector, + const Standard_Boolean theToInverse) + : SelectMgr_SelectionImageFiller (thePixMap, theSelector), + myDepthMin ( RealLast()), + myDepthMax (-RealLast()), + myToInverse(theToInverse) + { + myUnnormImage.InitZero (Image_Format_GrayF, thePixMap.SizeX(), thePixMap.SizeY()); + } + + //! Accumulate the data. + virtual void Fill (const Standard_Integer theCol, + const Standard_Integer theRow, + const Standard_Integer thePicked) Standard_OVERRIDE + { + if (myUnnormImage.IsEmpty()) + { + return; + } + + if (thePicked < 1 + || thePicked > myMainSel->NbPicked()) + { + myUnnormImage.ChangeValue (theRow, theCol) = ShortRealLast(); + return; + } + + const SelectMgr_SortCriterion& aSortCriterion = myMainSel->PickedData (thePicked); + myUnnormImage.ChangeValue (theRow, theCol) = float(aSortCriterion.Depth); + myDepthMin = Min (myDepthMin, aSortCriterion.Depth); + myDepthMax = Max (myDepthMax, aSortCriterion.Depth); + } + + //! Normalize the depth values. + virtual void Flush() Standard_OVERRIDE + { + float aFrom = 0.0f; + float aDelta = 1.0f; + if (myDepthMin <= myDepthMax) + { + aFrom = float(myDepthMin); + aDelta = float(myDepthMax) - float(myDepthMin); + if (aDelta <= ShortRealEpsilon()) + { + aDelta = 1.0f; + } + } + for (Standard_Size aRowIter = 0; aRowIter < myUnnormImage.SizeY(); ++aRowIter) + { + for (Standard_Size aColIter = 0; aColIter < myUnnormImage.SizeX(); ++aColIter) + { + float aDepth = myUnnormImage.Value (aRowIter, aColIter); + if (aDepth <= -ShortRealLast() + || aDepth >= ShortRealLast()) + { + myImage->SetPixelColor (Standard_Integer(aColIter), Standard_Integer(aRowIter), + Quantity_ColorRGBA (0.0f, 0.0f, 0.0f, 1.0f)); + continue; + } + + float aNormDepth = (aDepth - aFrom) / aDelta; + if (myToInverse) + { + aNormDepth = 1.0f - aNormDepth; + } + myImage->SetPixelColor (Standard_Integer(aColIter), Standard_Integer(aRowIter), + Quantity_ColorRGBA (aNormDepth, aNormDepth, aNormDepth, 1.0f)); + } + } + } + + private: + Image_PixMap myUnnormImage; + Standard_Real myDepthMin; + Standard_Real myDepthMax; + Standard_Boolean myToInverse; + }; + + //! Help class for filling pixel with unnormalized depth of ray. + class UnnormalizedDepthFiller : public SelectMgr_SelectionImageFiller + { + public: + UnnormalizedDepthFiller (Image_PixMap& thePixMap, + SelectMgr_ViewerSelector* theSelector) + : SelectMgr_SelectionImageFiller (thePixMap, theSelector) {} + + virtual void Fill (const Standard_Integer theCol, + const Standard_Integer theRow, + const Standard_Integer thePicked) Standard_OVERRIDE + { + if (thePicked < 1 + || thePicked > myMainSel->NbPicked()) + { + myImage->SetPixelColor (theCol, theRow, Quantity_ColorRGBA (0.0f, 0.0f, 0.0f, 1.0f)); + return; + } + + const SelectMgr_SortCriterion& aSortCriterion = myMainSel->PickedData (thePicked); + const float aDepth = float(aSortCriterion.Depth); + myImage->SetPixelColor (theCol, theRow, Quantity_ColorRGBA (Graphic3d_Vec4 (aDepth, aDepth, aDepth, 1.0f))); + } + }; + + //! Help class for filling pixel with color of detected object. + class GeneratedOwnerColorFiller : public SelectMgr_SelectionImageFiller + { + public: + GeneratedOwnerColorFiller (Image_PixMap& thePixMap, + SelectMgr_ViewerSelector* theSelector) + : SelectMgr_SelectionImageFiller (thePixMap, theSelector) + { + // generate per-owner colors in the order as they have been activated + for (SelectMgr_SelectableObjectSet::Iterator anObjIter (theSelector->SelectableObjects()); anObjIter.More(); anObjIter.Next()) + { + const Handle(SelectMgr_SelectableObject)& anObj = anObjIter.Value(); + for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next()) + { + const Handle(SelectMgr_Selection)& aSel = aSelIter.Value(); + for (NCollection_Vector::Iterator aSelEntIter (aSel->Entities()); aSelEntIter.More(); aSelEntIter.Next()) + { + const Handle(SelectMgr_SensitiveEntity)& aSens = aSelEntIter.Value(); + const Handle(SelectBasics_EntityOwner)& anOwner = aSens->BaseSensitive()->OwnerId(); + if (!myMapOwnerColors.IsBound (anOwner)) + { + Quantity_Color aColor; + randomPastelColor (aColor); + myMapOwnerColors.Bind (anOwner, aColor); + } + } + } + } + } + + virtual void Fill (const Standard_Integer theCol, + const Standard_Integer theRow, + const Standard_Integer thePicked) Standard_OVERRIDE + { + if (thePicked < 1 + || thePicked > myMainSel->NbPicked()) + { + myImage->SetPixelColor (theCol, theRow, Quantity_Color(Quantity_NOC_BLACK)); + return; + } + + const Handle(SelectMgr_EntityOwner)& aPickedOwner = myMainSel->Picked (thePicked); + Quantity_Color aColor (Quantity_NOC_BLACK); + myMapOwnerColors.Find (aPickedOwner, aColor); + myImage->SetPixelColor (theCol, theRow, aColor); + } + + protected: + NCollection_DataMap myMapOwnerColors; + }; + + //! Help class for filling pixel with random color for each selection mode. + class GeneratedSelModeColorFiller : public SelectMgr_SelectionImageFiller + { + public: + GeneratedSelModeColorFiller (Image_PixMap& thePixMap, + SelectMgr_ViewerSelector* theSelector) + : SelectMgr_SelectionImageFiller (thePixMap, theSelector) + { + // generate standard modes in proper order, consider custom objects would use similar scheme + myMapSelectionModeColors.Bind ( 0, Quantity_NOC_WHITE); // default (entire object selection) + myMapSelectionModeColors.Bind ( 1, Quantity_NOC_YELLOW); // TopAbs_VERTEX + myMapSelectionModeColors.Bind ( 2, Quantity_NOC_GREEN); // TopAbs_EDGE + myMapSelectionModeColors.Bind ( 3, Quantity_NOC_RED); // TopAbs_WIRE + myMapSelectionModeColors.Bind ( 4, Quantity_NOC_BLUE1); // TopAbs_FACE + myMapSelectionModeColors.Bind ( 5, Quantity_NOC_CYAN1); // TopAbs_SHELL + myMapSelectionModeColors.Bind ( 6, Quantity_NOC_PURPLE); // TopAbs_SOLID + myMapSelectionModeColors.Bind ( 7, Quantity_NOC_MAGENTA1); // TopAbs_COMPSOLID + myMapSelectionModeColors.Bind ( 8, Quantity_NOC_BROWN); // TopAbs_COMPOUND + myMapSelectionModeColors.Bind (0x0010, Quantity_NOC_PINK); // MeshVS_SMF_Volume + myMapSelectionModeColors.Bind (0x001E, Quantity_NOC_LIMEGREEN); // MeshVS_SMF_Element + myMapSelectionModeColors.Bind (0x001F, Quantity_NOC_DARKOLIVEGREEN); // MeshVS_SMF_All + myMapSelectionModeColors.Bind (0x0100, Quantity_NOC_GOLD); // MeshVS_SMF_Group + } + + virtual void Fill (const Standard_Integer theCol, + const Standard_Integer theRow, + const Standard_Integer thePicked) Standard_OVERRIDE + { + if (thePicked < 1 + || thePicked > myMainSel->NbPicked()) + { + myImage->SetPixelColor (theCol, theRow, Quantity_Color (Quantity_NOC_BLACK)); + return; + } + + Standard_Integer aSelectionMode = -1; + const Handle(SelectMgr_SelectableObject)& aSelectable = myMainSel->Picked (thePicked)->Selectable(); + const Handle(Select3D_SensitiveEntity)& anEntity = myMainSel->PickedEntity (thePicked); + for (SelectMgr_SequenceOfSelection::Iterator aSelIter (aSelectable->Selections()); aSelIter.More(); aSelIter.Next()) + { + const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value(); + for (NCollection_Vector::Iterator aSelEntIter (aSelection->Entities()); aSelEntIter.More(); aSelEntIter.Next()) + { + if (aSelEntIter.Value()->BaseSensitive() == anEntity) + { + aSelectionMode = aSelection->Mode(); + break; + } + } + } + if (aSelectionMode == -1) + { + myImage->SetPixelColor (theCol, theRow, Quantity_Color (Quantity_NOC_BLACK)); + return; + } + + if (!myMapSelectionModeColors.IsBound (aSelectionMode)) + { + Quantity_Color aColor; + randomPastelColor (aColor); + myMapSelectionModeColors.Bind (aSelectionMode, aColor); + } + + const Quantity_Color& aColor = myMapSelectionModeColors.Find (aSelectionMode); + myImage->SetPixelColor (theCol, theRow, aColor); + } + + protected: + NCollection_DataMap myMapSelectionModeColors; + }; + + //! Help class for filling pixel with color of detected shape. + class DetectedObjectColorFiller : public SelectMgr_SelectionImageFiller + { + public: + DetectedObjectColorFiller (Image_PixMap& thePixMap, + SelectMgr_ViewerSelector* theSelector) + : SelectMgr_SelectionImageFiller (thePixMap, theSelector) {} + + virtual void Fill (const Standard_Integer theCol, + const Standard_Integer theRow, + const Standard_Integer thePicked) Standard_OVERRIDE + { + Quantity_Color aColor (Quantity_NOC_BLACK); + if (thePicked > 0 + && thePicked <= myMainSel->NbPicked()) + { + const Handle(SelectMgr_SelectableObject)& aSelectable = myMainSel->Picked (thePicked)->Selectable(); + aColor = aSelectable->Attributes()->Color(); + } + myImage->SetPixelColor (theCol, theRow, aColor); + } + }; +} + +// ======================================================================= +// function : CreateFiller +// purpose : +// ======================================================================= +Handle(SelectMgr_SelectionImageFiller) SelectMgr_SelectionImageFiller::CreateFiller (Image_PixMap& thePixMap, + SelectMgr_ViewerSelector* theSelector, + StdSelect_TypeOfSelectionImage theType) +{ + switch (theType) + { + case StdSelect_TypeOfSelectionImage_NormalizedDepth: + case StdSelect_TypeOfSelectionImage_NormalizedDepthInverted: + { + return new NormalizedDepthFiller (thePixMap, theSelector, theType == StdSelect_TypeOfSelectionImage_NormalizedDepthInverted); + } + case StdSelect_TypeOfSelectionImage_UnnormalizedDepth: + { + return new UnnormalizedDepthFiller (thePixMap, theSelector); + } + case StdSelect_TypeOfSelectionImage_ColoredDetectedObject: + { + return new DetectedObjectColorFiller (thePixMap, theSelector); + } + case StdSelect_TypeOfSelectionImage_ColoredEntity: + { + return new GeneratedEntityColorFiller (thePixMap, theSelector); + } + case StdSelect_TypeOfSelectionImage_ColoredOwner: + { + return new GeneratedOwnerColorFiller (thePixMap, theSelector); + } + case StdSelect_TypeOfSelectionImage_ColoredSelectionMode: + { + return new GeneratedSelModeColorFiller (thePixMap, theSelector); + } + } + return Handle(SelectMgr_SelectionImageFiller)(); +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectionImageFiller.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectionImageFiller.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectionImageFiller.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectionImageFiller.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,82 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _SelectMgr_SelectionImageFiller_HeaderFile +#define _SelectMgr_SelectionImageFiller_HeaderFile + +#include +#include +#include +#include +#include + +class SelectMgr_ViewerSelector; + +//! Abstract class for filling pixel with color. +//! This is internal tool for SelectMgr_ViewerSelector3d::ToPixMap(). +class SelectMgr_SelectionImageFiller : public Standard_Transient +{ +public: + //! Create filler of specified type. + static Handle(SelectMgr_SelectionImageFiller) CreateFiller (Image_PixMap& thePixMap, + SelectMgr_ViewerSelector* theSelector, + StdSelect_TypeOfSelectionImage theType); + +public: + + //! Main constructor. + SelectMgr_SelectionImageFiller (Image_PixMap& thePixMap, + SelectMgr_ViewerSelector* theSelector) + : myImage (&thePixMap), + myMainSel(theSelector) {} + + //! Fill pixel at specified position. + virtual void Fill (const Standard_Integer theCol, + const Standard_Integer theRow, + const Standard_Integer thePicked) = 0; + + //! Flush results into final image. + virtual void Flush() {} + +protected: + + //! Find the new unique random color. + void randomPastelColor (Quantity_Color& theColor) + { + for (;;) + { + nextRandomPastelColor (theColor); + if (myUniqueColors.Add (theColor)) + { + return; + } + } + } + + //! Fills the given color as random. + void nextRandomPastelColor (Quantity_Color& theColor) + { + theColor = Quantity_Color (Standard_Real(myBullardGenerator.NextInt() % 256) / 255.0, + Standard_Real(myBullardGenerator.NextInt() % 256) / 255.0, + Standard_Real(myBullardGenerator.NextInt() % 256) / 255.0, + Quantity_TOC_sRGB); + } + +protected: + Image_PixMap* myImage; + SelectMgr_ViewerSelector* myMainSel; + math_BullardGenerator myBullardGenerator; + NCollection_Map myUniqueColors; +}; + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectionManager.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectionManager.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectionManager.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectionManager.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,8 +16,10 @@ #include +#include #include #include +#include #include IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_SelectionManager,Standard_Transient) @@ -484,6 +486,8 @@ theObject->AddSelection (aNewSel, theMode); aNewSel->UpdateBVHStatus (SelectMgr_TBU_Remove); aNewSel->SetSelectionState (SelectMgr_SOS_Deactivated); + + buildBVH (aNewSel); } } return; @@ -496,6 +500,37 @@ mySelector->AddSelectionToObject (theObject, aNewSel); aNewSel->UpdateBVHStatus (SelectMgr_TBU_None); } + + buildBVH (aNewSel); +} + +//================================================== +// Function: buildBVH +// Purpose : Private Method +//================================================== +void SelectMgr_SelectionManager::buildBVH (const Handle(SelectMgr_Selection)& theSelection) +{ + if (mySelector->ToPrebuildBVH()) + { + for (NCollection_Vector::Iterator anIter (theSelection->Entities()); anIter.More(); anIter.Next()) + { + const Handle(Select3D_SensitiveEntity)& anEntity = anIter.Value()->BaseSensitive(); + mySelector->QueueBVHBuild (anEntity); + + if (Handle(Select3D_SensitiveGroup) aGroup = Handle(Select3D_SensitiveGroup)::DownCast (anEntity)) + { + for (Select3D_IndexedMapOfEntity::Iterator aSubEntitiesIter (aGroup->Entities()); aSubEntitiesIter.More(); aSubEntitiesIter.Next()) + { + const Handle(Select3D_SensitiveEntity)& aSubEntity = aSubEntitiesIter.Value(); + mySelector->QueueBVHBuild (aSubEntity); + } + } + } + } + else + { + StdSelect_BRepSelectionTool::PreBuildBVH (theSelection); + } } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectionManager.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectionManager.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SelectionManager.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SelectionManager.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,7 +35,7 @@ //! Return the Selector. const Handle(SelectMgr_ViewerSelector)& Selector() const { return mySelector; } - + //! Returns true if the manager contains the selectable object theObject. Standard_EXPORT Standard_Boolean Contains (const Handle(SelectMgr_SelectableObject)& theObject) const; @@ -117,6 +117,10 @@ Standard_EXPORT void loadMode (const Handle(SelectMgr_SelectableObject)& theObject, const Standard_Integer theMode); + //! In multi-thread mode queues sensitive entities to build its BVH in separate threads. + //! Otherwise, builds BVH for heavyweight entities immediately. + Standard_EXPORT void buildBVH (const Handle(SelectMgr_Selection)& theSelection); + private: Handle(SelectMgr_ViewerSelector) mySelector; diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntity.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntity.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,3 +39,15 @@ mySensitive->Clear(); mySensitive.Nullify(); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void SelectMgr_SensitiveEntity::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, mySensitive.get()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsActiveForSelection) +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntity.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntity.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntity.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntity.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,6 +47,9 @@ //! Marks entity as active for selection void SetActiveForSelection() const { myIsActiveForSelection = Standard_True; } + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + DEFINE_STANDARD_RTTIEXT(SelectMgr_SensitiveEntity,Standard_Transient) // Type definition private: diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntitySet.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntitySet.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntitySet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SensitiveEntitySet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,7 @@ //! Empty constructor. Standard_EXPORT SelectMgr_SensitiveEntitySet (const Handle(Select3D_BVHBuilder3d)& theBuilder); - virtual ~SelectMgr_SensitiveEntitySet() {}; + virtual ~SelectMgr_SensitiveEntitySet() {} //! Adds new entity to the set and marks BVH tree for rebuild Standard_EXPORT void Append (const Handle(SelectMgr_SensitiveEntity)& theEntity); diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SOPtr.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SOPtr.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SOPtr.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SOPtr.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -// Created on: 1995-02-06 -// Created by: Mister rmi -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _SelectMgr_SOPtr_HeaderFile -#define _SelectMgr_SOPtr_HeaderFile - -class SelectMgr_SelectableObject; -typedef SelectMgr_SelectableObject* SelectMgr_SOPtr; - -#endif // _SelectMgr_SOPtr_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SortCriterion.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SortCriterion.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_SortCriterion.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_SortCriterion.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,6 +17,7 @@ #ifndef _SelectMgr_SortCriterion_HeaderFile #define _SelectMgr_SortCriterion_HeaderFile +#include #include #include #include @@ -29,13 +30,13 @@ Handle(Select3D_SensitiveEntity) Entity; //!< detected entity gp_Pnt Point; //!< 3D point + Graphic3d_Vec3 Normal; //!< surface normal or 0 vector if undefined Standard_Real Depth; //!< distance from the view plane to the entity Standard_Real MinDist; //!< distance from the clicked point to the entity on the view plane Standard_Real Tolerance; //!< tolerance used for selecting candidates Standard_Integer Priority; //!< selection priority Standard_Integer ZLayerPosition; //!< ZLayer rendering order index, stronger than a depth Standard_Integer NbOwnerMatches; //!< overall number of entities collected for the same owner - Standard_Boolean ToPreferClosest; //!< whether closest object is preferred even if has less priority public: DEFINE_STANDARD_ALLOC @@ -46,18 +47,11 @@ MinDist (0.0), Tolerance(0.0), Priority (0), - ZLayerPosition (0), - NbOwnerMatches (0), - ToPreferClosest (Standard_True) {} + ZLayerPosition (0), + NbOwnerMatches (0) {} - //! Comparison operator. - bool operator> (const SelectMgr_SortCriterion& theOther) const { return IsGreater (theOther); } - - //! Comparison operator. - bool operator< (const SelectMgr_SortCriterion& theOther) const { return IsLower (theOther); } - - //! Compare with another item. - bool IsGreater (const SelectMgr_SortCriterion& theOther) const + //! Compare with another item by depth, priority and minDist. + bool IsCloserDepth (const SelectMgr_SortCriterion& theOther) const { // the object within different ZLayer groups can not be compared by depth if (ZLayerPosition != theOther.ZLayerPosition) @@ -65,88 +59,48 @@ return ZLayerPosition > theOther.ZLayerPosition; } - if (ToPreferClosest) + // closest object is selected unless difference is within tolerance + if (Abs (Depth - theOther.Depth) > (Tolerance + theOther.Tolerance)) { - // closest object is selected unless difference is within tolerance - if (Abs (Depth - theOther.Depth) > (Tolerance + theOther.Tolerance)) - { - return Depth < theOther.Depth; - } - - // if two objects have similar depth, select the one with higher priority - if (Priority > theOther.Priority) - { - return true; - } - - // if priorities are equal, one closest to the mouse - return Priority == theOther.Priority - && MinDist < theOther.MinDist; + return Depth < theOther.Depth; } - // old logic (OCCT version <= 6.3.1) + // if two objects have similar depth, select the one with higher priority if (Priority > theOther.Priority) { return true; } - else if (Priority != theOther.Priority) - { - return false; - } - if (Abs (Depth - theOther.Depth) <= Precision::Confusion()) - { - return MinDist < theOther.MinDist; - } - - return Depth < theOther.Depth; + // if priorities are equal, one closest to the mouse + return Priority == theOther.Priority + && MinDist < theOther.MinDist; } - //! Compare with another item. - bool IsLower (const SelectMgr_SortCriterion& theOther) const + //! Compare with another item using old logic (OCCT version <= 6.3.1) with priority considered preceding depth. + bool IsHigherPriority (const SelectMgr_SortCriterion& theOther) const { // the object within different ZLayer groups can not be compared by depth if (ZLayerPosition != theOther.ZLayerPosition) { - return ZLayerPosition < theOther.ZLayerPosition; - } - - if (ToPreferClosest) - { - // closest object is selected unless difference is within tolerance - if (ToPreferClosest - && Abs (Depth - theOther.Depth) > (Tolerance + theOther.Tolerance)) - { - return Depth > theOther.Depth; - } - - // if two objects have similar depth, select the one with higher priority - if (Priority < theOther.Priority) - { - return true; - } - - // if priorities are equal, one closest to the mouse - return Priority == theOther.Priority - && MinDist > theOther.MinDist; + return ZLayerPosition > theOther.ZLayerPosition; } - // old logic (OCCT version <= 6.3.1) if (Priority > theOther.Priority) { - return false; + return true; } else if (Priority != theOther.Priority) { - return true; + return false; } + //if (Abs (Depth - theOther.Depth) <= (Tolerance + theOther.Tolerance)) if (Abs (Depth - theOther.Depth) <= Precision::Confusion()) { - return MinDist > theOther.MinDist; + return MinDist < theOther.MinDist; } - return Depth > theOther.Depth; + return Depth < theOther.Depth; } }; diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustum.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustum.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustum.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustum.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -302,3 +302,13 @@ thePlaneEquations.Append (aPlaneEquation); } } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void SelectMgr_TriangularFrustum::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, SelectMgr_TriangularFrustum) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, SelectMgr_Frustum) +} \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustum.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustum.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustum.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustum.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -93,6 +93,9 @@ //! Ax + By + Cz + D = 0) to the given vector Standard_EXPORT virtual void GetPlanes (NCollection_Vector& thePlaneEquations) const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + private: void cacheVertexProjections (SelectMgr_TriangularFrustum* theFrustum) const; diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustumSet.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustumSet.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustumSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustumSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,14 @@ #define MEMORY_BLOCK_SIZE 512 * 7 // ======================================================================= +// function : SelectMgr_TriangularFrustumSet +// purpose : +// ======================================================================= +SelectMgr_TriangularFrustumSet::SelectMgr_TriangularFrustumSet() +: myToAllowOverlap (Standard_False) +{} + +// ======================================================================= // function : BuildSelectingVolume // purpose : Meshes polygon bounded by polyline. Than organizes a set of // triangular frustums, where each triangle's projection onto @@ -34,14 +42,20 @@ myFrustums.Clear(); Handle(NCollection_IncAllocator) anAllocator = new NCollection_IncAllocator (MEMORY_BLOCK_SIZE); - Handle(BRepMesh_DataStructureOfDelaun) aMeshStructure = new BRepMesh_DataStructureOfDelaun(anAllocator); + Handle(BRepMesh_DataStructureOfDelaun) aMeshStructure = new BRepMesh_DataStructureOfDelaun (anAllocator); Standard_Integer aPtsLower = thePoints.Lower(); Standard_Integer aPtsUpper = thePoints.Upper(); - IMeshData::VectorOfInteger anIndexes(aPtsUpper - aPtsLower, anAllocator); + IMeshData::VectorOfInteger anIndexes (thePoints.Size(), anAllocator); + myBoundaryPoints.Resize (aPtsLower, aPtsLower + 2 * (thePoints.Size()) - 1, Standard_False); + for (Standard_Integer aPtIdx = aPtsLower; aPtIdx <= aPtsUpper; ++aPtIdx) { - BRepMesh_Vertex aVertex(thePoints.Value(aPtIdx).XY(), aPtIdx, BRepMesh_Frontier); - anIndexes.Append(aMeshStructure->AddNode(aVertex)); + BRepMesh_Vertex aVertex (thePoints.Value (aPtIdx).XY(), aPtIdx, BRepMesh_Frontier); + anIndexes.Append (aMeshStructure->AddNode (aVertex)); + const gp_Pnt aNearPnt = myBuilder->ProjectPntOnViewPlane (aVertex.Coord().X(), aVertex.Coord().Y(), 0.0); + const gp_Pnt aFarPnt = myBuilder->ProjectPntOnViewPlane (aVertex.Coord().X(), aVertex.Coord().Y(), 1.0); + myBoundaryPoints.SetValue (aPtIdx, aNearPnt); + myBoundaryPoints.SetValue (aPtIdx + thePoints.Size(), aFarPnt); } Standard_Real aPtSum = 0; @@ -118,6 +132,14 @@ aRes->myFrustums.Append (Handle(SelectMgr_TriangularFrustum)::DownCast (anIter.Value()->ScaleAndTransform (theScale, theTrsf))); } + aRes->myBoundaryPoints.Resize (myBoundaryPoints.Lower(), myBoundaryPoints.Upper(), Standard_False); + for (Standard_Integer anIdx = myBoundaryPoints.Lower(); anIdx <= myBoundaryPoints.Upper(); anIdx++) + { + gp_Pnt aPoint = myBoundaryPoints.Value (anIdx); + theTrsf.Transforms (aPoint.ChangeCoord()); + aRes->myBoundaryPoints.SetValue (anIdx, aPoint); + } + return aRes; } @@ -145,12 +167,43 @@ // ======================================================================= Standard_Boolean SelectMgr_TriangularFrustumSet::Overlaps (const SelectMgr_Vec3& theMinPnt, const SelectMgr_Vec3& theMaxPnt, - Standard_Boolean* /*theInside*/) const + Standard_Boolean* theInside) const { for (SelectMgr_TriangFrustumsIter anIter (myFrustums); anIter.More(); anIter.Next()) { if (anIter.Value()->Overlaps (theMinPnt, theMaxPnt, NULL)) - return Standard_True; + { + if (myToAllowOverlap || theInside == NULL) + { + return Standard_True; + } + else + { + gp_Pnt aMinMaxPnts[2] = { gp_Pnt (theMinPnt.x(), theMinPnt.y(), theMinPnt.z()), + gp_Pnt (theMaxPnt.x(), theMaxPnt.y(), theMaxPnt.z())}; + + gp_Pnt anOffset[3] = { gp_Pnt (aMinMaxPnts[1].X() - aMinMaxPnts[0].X(), 0.0, 0.0), + gp_Pnt (0.0, aMinMaxPnts[1].Y() - aMinMaxPnts[0].Y(), 0.0), + gp_Pnt (0.0, 0.0, aMinMaxPnts[1].Z() - aMinMaxPnts[0].Z()) }; + + Standard_Integer aSign = 1; + for (Standard_Integer aPntsIdx = 0; aPntsIdx < 2; aPntsIdx++) + { + for (Standard_Integer aCoordIdx = 0; aCoordIdx < 3; aCoordIdx++) + { + gp_Pnt anOffsetPnt = aMinMaxPnts [aPntsIdx].XYZ() + aSign * anOffset [aCoordIdx].XYZ(); + if (isIntersectBoundary (aMinMaxPnts [aPntsIdx], anOffsetPnt) + || isIntersectBoundary (anOffsetPnt, anOffsetPnt.XYZ() + aSign * anOffset [(aCoordIdx + 1) % 3].XYZ())) + { + *theInside &= Standard_False; + return Standard_True; + } + } + aSign = -aSign; + } + return Standard_True; + } + } } return Standard_False; @@ -185,7 +238,25 @@ for (SelectMgr_TriangFrustumsIter anIter (myFrustums); anIter.More(); anIter.Next()) { if (anIter.Value()->Overlaps (theArrayOfPts, theSensType, theClipRange, thePickResult)) - return Standard_True; + { + if (myToAllowOverlap) + { + return Standard_True; + } + else + { + Standard_Integer aPtsLower = theArrayOfPts.Lower(); + Standard_Integer aPtsUpper = theArrayOfPts.Upper(); + for (Standard_Integer anIdx = aPtsLower; anIdx <= aPtsUpper; anIdx++) + { + if (isIntersectBoundary (theArrayOfPts.Value (anIdx), theArrayOfPts.Value (anIdx < aPtsUpper ? anIdx + 1 : aPtsLower))) + { + return Standard_False; + } + } + return Standard_True; + } + } } return Standard_False; @@ -203,7 +274,20 @@ for (SelectMgr_TriangFrustumsIter anIter (myFrustums); anIter.More(); anIter.Next()) { if (anIter.Value()->Overlaps (thePnt1, thePnt2, theClipRange, thePickResult)) - return Standard_True; + { + if (myToAllowOverlap) + { + return Standard_True; + } + else + { + if (isIntersectBoundary (thePnt1, thePnt2)) + { + return Standard_False; + } + return Standard_True; + } + } } return Standard_False; @@ -223,7 +307,22 @@ for (SelectMgr_TriangFrustumsIter anIter (myFrustums); anIter.More(); anIter.Next()) { if (anIter.Value()->Overlaps (thePnt1, thePnt2, thePnt3, theSensType, theClipRange, thePickResult)) - return Standard_True; + { + if (myToAllowOverlap) + { + return Standard_True; + } + else + { + if (isIntersectBoundary (thePnt1, thePnt2) + || isIntersectBoundary (thePnt2, thePnt3) + || isIntersectBoundary (thePnt3, thePnt1)) + { + return Standard_False; + } + return Standard_True; + } + } } return Standard_False; @@ -243,4 +342,99 @@ } } +//======================================================================= +// function : SetAllowOverlapDetection +// purpose : +//======================================================================= +void SelectMgr_TriangularFrustumSet::SetAllowOverlapDetection (const Standard_Boolean theIsToAllow) +{ + myToAllowOverlap = theIsToAllow; +} + +//======================================================================= +// function : isIntersectBoundary +// purpose : +//======================================================================= +Standard_Boolean SelectMgr_TriangularFrustumSet::isIntersectBoundary (const gp_Pnt& thePnt1, const gp_Pnt& thePnt2) const +{ + Standard_Integer aFacesNb = myBoundaryPoints.Size() / 2; + gp_Vec aDir = thePnt2.XYZ() - thePnt1.XYZ(); + gp_Pnt anOrig = thePnt1; + + for (Standard_Integer anIdx = myBoundaryPoints.Lower(); anIdx < aFacesNb + myBoundaryPoints.Lower(); anIdx++) + { + gp_Pnt aFace[4] = { myBoundaryPoints.Value (anIdx), + myBoundaryPoints.Value (anIdx + aFacesNb), + myBoundaryPoints.Value (anIdx % aFacesNb + 1 + aFacesNb), + myBoundaryPoints.Value (anIdx % aFacesNb + 1) }; + + if (segmentTriangleIntersection (anOrig, aDir, aFace[0], aFace[1], aFace[2]) + || segmentTriangleIntersection (anOrig, aDir, aFace[0], aFace[2], aFace[3])) + { + return Standard_True; + } + } + return Standard_False; +} + +//======================================================================= +// function : segmentTriangleIntersection +// purpose : Moller-Trumbore ray-triangle intersection test +//======================================================================= +Standard_Boolean SelectMgr_TriangularFrustumSet::segmentTriangleIntersection (const gp_Pnt& theOrig, const gp_Vec& theDir, + const gp_Pnt& theV1, const gp_Pnt& theV2, const gp_Pnt& theV3) const +{ + gp_Vec aPVec, aTVec, aQVec; + Standard_Real aD, aInvD, anU, aV, aT; + + gp_Vec anEdge1 = theV2.XYZ() - theV1.XYZ(); + gp_Vec anEdge2 = theV3.XYZ() - theV1.XYZ(); + + aPVec = theDir.Crossed (anEdge2); + aD = anEdge1.Dot (aPVec); + if (fabs (aD) < gp::Resolution()) + { + return Standard_False; + } + + aInvD = 1.0 / aD; + aTVec = theOrig.XYZ() - theV1.XYZ(); + anU = aInvD * aTVec.Dot (aPVec); + if (anU < 0.0 || anU > 1.0) + { + return Standard_False; + } + + aQVec = aTVec.Crossed (anEdge1); + aV = aInvD * theDir.Dot (aQVec); + if (aV < 0.0 || anU + aV > 1.0) + { + return Standard_False; + } + + aT = aInvD * anEdge2.Dot (aQVec); + if (aT < 0 || aT > 1) + { + return Standard_False; + } + + return Standard_True; +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void SelectMgr_TriangularFrustumSet::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_CLASS_BEGIN (theOStream, SelectMgr_TriangularFrustumSet) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, SelectMgr_BaseFrustum) + + for (SelectMgr_TriangFrustumsIter anIter (myFrustums); anIter.More(); anIter.Next()) + { + const Handle(SelectMgr_TriangularFrustum)& aFrustum = anIter.Value(); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, aFrustum.get()) + } +} + #undef MEMORY_BLOCK_SIZE diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustumSet.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustumSet.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustumSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_TriangularFrustumSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,7 +37,7 @@ { public: - SelectMgr_TriangularFrustumSet() {}; + SelectMgr_TriangularFrustumSet(); ~SelectMgr_TriangularFrustumSet() {}; @@ -84,9 +84,27 @@ //! Ax + By + Cz + D = 0) to the given vector Standard_EXPORT virtual void GetPlanes (NCollection_Vector& thePlaneEquations) const Standard_OVERRIDE; + //! If theIsToAllow is false, only fully included sensitives will be detected, otherwise the algorithm will + //! mark both included and overlapped entities as matched + Standard_EXPORT virtual void SetAllowOverlapDetection (const Standard_Boolean theIsToAllow); + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + +private: + + //! Checks whether the segment intersects with the boundary of the current volume selection + Standard_EXPORT Standard_Boolean isIntersectBoundary (const gp_Pnt& thePnt1, const gp_Pnt& thePnt2) const; + + //! Checks whether the triangle intersects with a segment + Standard_EXPORT Standard_Boolean segmentTriangleIntersection (const gp_Pnt &theOrig, const gp_Vec& theDir, + const gp_Pnt& theV1, const gp_Pnt& theV2, const gp_Pnt& theV3) const; + private: - SelectMgr_TriangFrustums myFrustums; + SelectMgr_TriangFrustums myFrustums; + TColgp_Array1OfPnt myBoundaryPoints; + Standard_Boolean myToAllowOverlap; }; #endif // _SelectMgr_TriangularFrustumSet_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_TypeOfDepthTolerance.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_TypeOfDepthTolerance.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_TypeOfDepthTolerance.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_TypeOfDepthTolerance.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,26 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _SelectMgr_TypeOfDepthTolerance_HeaderFile +#define _SelectMgr_TypeOfDepthTolerance_HeaderFile + +//! Define the type of depth tolerance for considering picked entities to lie on the same depth (distance from eye to entity). +//! @sa SelectMgr_SortCriterion, SelectMgr_ViewerSelector +enum SelectMgr_TypeOfDepthTolerance +{ + SelectMgr_TypeOfDepthTolerance_Uniform, //!< use a predefined tolerance value (defined in 3D world scale) to compare any entities + SelectMgr_TypeOfDepthTolerance_UniformPixels, //!< use a predefined tolerance value (defined in pixels) to compare any entities + SelectMgr_TypeOfDepthTolerance_SensitivityFactor, //!< use sensitivity factor (in pixels) assigned to specific entity +}; + +#endif // _SelectMgr_TypeOfDepthTolerance_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewClipRange.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewClipRange.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewClipRange.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewClipRange.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -107,13 +107,14 @@ // function : DumpJson // purpose : // ======================================================================= -void SelectMgr_ViewClipRange::DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth) const +void SelectMgr_ViewClipRange::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, SelectMgr_ViewClipRange); + OCCT_DUMP_CLASS_BEGIN (theOStream, SelectMgr_ViewClipRange) - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myUnclipRange); for (size_t aRangeIter = 0; aRangeIter < myClipRanges.size(); ++aRangeIter) { - OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myClipRanges[aRangeIter]); + Bnd_Range aClipRange = myClipRanges[aRangeIter]; + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &aClipRange) } + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myUnclipRange) } diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewClipRange.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewClipRange.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewClipRange.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewClipRange.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -120,7 +120,7 @@ void AddClipSubRange (const Bnd_Range& theRange) { myClipRanges.push_back (theRange); } //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; private: diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector3d.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector3d.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector3d.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector3d.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,268 @@ +// Created on: 1995-03-15 +// Created by: Robert COUBLANC +// Copyright (c) 1995-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_ViewerSelector3d, SelectMgr_ViewerSelector) + +//======================================================================= +// Function : Constructor +// Purpose : +//======================================================================= +SelectMgr_ViewerSelector3d::SelectMgr_ViewerSelector3d() +{ + // +} + +//======================================================================= +// Function: Pick +// Purpose : +//======================================================================= +void SelectMgr_ViewerSelector3d::Pick (const Standard_Integer theXPix, + const Standard_Integer theYPix, + const Handle(V3d_View)& theView) +{ + updateZLayers (theView); + if(myToUpdateTolerance) + { + mySelectingVolumeMgr.SetPixelTolerance (myTolerances.Tolerance()); + myToUpdateTolerance = Standard_False; + } + + mySelectingVolumeMgr.SetCamera (theView->Camera()); + mySelectingVolumeMgr.SetActiveSelectionType (SelectMgr_SelectingVolumeManager::Point); + Standard_Integer aWidth = 0, aHeight = 0; + theView->Window()->Size (aWidth, aHeight); + mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight); + gp_Pnt2d aMousePos (static_cast (theXPix), + static_cast (theYPix)); + mySelectingVolumeMgr.BuildSelectingVolume (aMousePos); + mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL); + + TraverseSensitives(); +} + +//======================================================================= +// Function: Pick +// Purpose : +//======================================================================= +void SelectMgr_ViewerSelector3d::Pick (const Standard_Integer theXPMin, + const Standard_Integer theYPMin, + const Standard_Integer theXPMax, + const Standard_Integer theYPMax, + const Handle(V3d_View)& theView) +{ + updateZLayers (theView); + mySelectingVolumeMgr.SetCamera (theView->Camera()); + mySelectingVolumeMgr.SetActiveSelectionType (SelectMgr_SelectingVolumeManager::Box); + Standard_Integer aWidth = 0, aHeight = 0; + theView->Window()->Size (aWidth, aHeight); + mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight); + gp_Pnt2d aMinMousePos (static_cast (theXPMin), + static_cast (theYPMin)); + gp_Pnt2d aMaxMousePos (static_cast (theXPMax), + static_cast (theYPMax)); + mySelectingVolumeMgr.BuildSelectingVolume (aMinMousePos, + aMaxMousePos); + + mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL); + + TraverseSensitives(); +} + +//======================================================================= +// Function: Pick +// Purpose : Selection using a polyline +//======================================================================= +void SelectMgr_ViewerSelector3d::Pick (const TColgp_Array1OfPnt2d& thePolyline, + const Handle(V3d_View)& theView) +{ + updateZLayers (theView); + mySelectingVolumeMgr.SetCamera (theView->Camera()); + mySelectingVolumeMgr.SetActiveSelectionType (SelectMgr_SelectingVolumeManager::Polyline); + Standard_Integer aWidth = 0, aHeight = 0; + theView->Window()->Size (aWidth, aHeight); + mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight); + mySelectingVolumeMgr.BuildSelectingVolume (thePolyline); + + mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)(), NULL); + + TraverseSensitives(); +} + +//======================================================================= +// Function: DisplaySensitive. +// Purpose : Display active primitives. +//======================================================================= +void SelectMgr_ViewerSelector3d::DisplaySensitive (const Handle(V3d_View)& theView) +{ + for (SelectMgr_SelectableObjectSet::Iterator aSelectableIt (mySelectableObjects); aSelectableIt.More(); aSelectableIt.Next()) + { + Handle(Graphic3d_Structure) aStruct = new Graphic3d_Structure (theView->Viewer()->StructureManager()); + const Handle (SelectMgr_SelectableObject)& anObj = aSelectableIt.Value(); + for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next()) + { + if (aSelIter.Value()->GetSelectionState() == SelectMgr_SOS_Activated) + { + SelectMgr::ComputeSensitivePrs (aStruct, aSelIter.Value(), anObj->Transformation(), anObj->TransformPersistence()); + } + } + + myStructs.Append (aStruct); + } + + for (Graphic3d_SequenceOfStructure::Iterator aStructIter (myStructs); aStructIter.More(); aStructIter.Next()) + { + Handle(Graphic3d_Structure)& aStruct = aStructIter.ChangeValue(); + aStruct->SetDisplayPriority (10); + aStruct->Display(); + } + + theView->Update(); +} + +//======================================================================= +// Function: ClearSensitive +// Purpose : +//======================================================================= +void SelectMgr_ViewerSelector3d::ClearSensitive (const Handle(V3d_View)& theView) +{ + for (Graphic3d_SequenceOfStructure::Iterator aStructIter (myStructs); aStructIter.More(); aStructIter.Next()) + { + const Handle(Graphic3d_Structure)& aPrs = aStructIter.ChangeValue(); + aPrs->Erase(); + aPrs->Clear(); + aPrs->Remove(); + } + myStructs.Clear(); + + if (!theView.IsNull()) + { + theView->Update(); + } +} + +//======================================================================= +//function : DisplaySenstive +//purpose : +//======================================================================= +void SelectMgr_ViewerSelector3d::DisplaySensitive (const Handle(SelectMgr_Selection)& theSel, + const gp_Trsf& theTrsf, + const Handle(V3d_View)& theView, + const Standard_Boolean theToClearOthers) +{ + if (theToClearOthers) + { + ClearSensitive (theView); + } + + Handle(Graphic3d_Structure) aStruct = new Graphic3d_Structure (theView->Viewer()->StructureManager()); + + SelectMgr::ComputeSensitivePrs (aStruct, theSel, theTrsf, Handle(Graphic3d_TransformPers)()); + + myStructs.Append (aStruct); + myStructs.Last()->SetDisplayPriority (10); + myStructs.Last()->Display(); + + theView->Update(); +} + +//======================================================================= +// Function: updateZLayers +// Purpose : +//======================================================================= +void SelectMgr_ViewerSelector3d::updateZLayers (const Handle(V3d_View)& theView) +{ + myZLayerOrderMap.Clear(); + TColStd_SequenceOfInteger aZLayers; + theView->Viewer()->GetAllZLayers (aZLayers); + Standard_Integer aPos = 0; + Standard_Boolean isPrevDepthWrite = true; + for (TColStd_SequenceOfInteger::Iterator aLayerIter (aZLayers); aLayerIter.More(); aLayerIter.Next()) + { + Graphic3d_ZLayerSettings aSettings = theView->Viewer()->ZLayerSettings (aLayerIter.Value()); + if (aSettings.ToClearDepth() + || isPrevDepthWrite != aSettings.ToEnableDepthWrite()) + { + ++aPos; + } + isPrevDepthWrite = aSettings.ToEnableDepthWrite(); + myZLayerOrderMap.Bind (aLayerIter.Value(), aPos); + } +} + +//======================================================================= +//function : ToPixMap +//purpose : +//======================================================================= +Standard_Boolean SelectMgr_ViewerSelector3d::ToPixMap (Image_PixMap& theImage, + const Handle(V3d_View)& theView, + const StdSelect_TypeOfSelectionImage theType, + const Standard_Integer thePickedIndex) +{ + if (theImage.IsEmpty()) + { + throw Standard_ProgramError("SelectMgr_ViewerSelector3d::ToPixMap() has been called with empty image"); + } + + Handle(SelectMgr_SelectionImageFiller) aFiller = SelectMgr_SelectionImageFiller::CreateFiller (theImage, this, theType); + if (aFiller.IsNull()) + { + return Standard_False; + } + + const Standard_Integer aSizeX = static_cast (theImage.SizeX()); + const Standard_Integer aSizeY = static_cast (theImage.SizeY()); + for (Standard_Integer aRowIter = 0; aRowIter < aSizeY; ++aRowIter) + { + for (Standard_Integer aColIter = 0; aColIter < aSizeX; ++aColIter) + { + Pick (aColIter, aRowIter, theView); + aFiller->Fill (aColIter, aRowIter, thePickedIndex); + } + } + aFiller->Flush(); + return Standard_True; +} + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void SelectMgr_ViewerSelector3d::DumpJson (Standard_OStream& theOStream, Standard_Integer) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myStructs.Length()) + for (Graphic3d_SequenceOfStructure::Iterator aStructsIt (myStructs); aStructsIt.More(); aStructsIt.Next()) + { + const Handle(Graphic3d_Structure)& aStructure = aStructsIt.Value(); + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, aStructure) + } +} diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector3d.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector3d.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector3d.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector3d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,96 @@ +// Created on: 1995-03-15 +// Created by: Robert COUBLANC +// Copyright (c) 1995-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _SelectMgr_ViewerSelector3d_HeaderFile +#define _SelectMgr_ViewerSelector3d_HeaderFile + +#include +#include +#include +#include + +class Graphic3d_Structure; +class Graphic3d_TransformPers; +class V3d_View; + +//! Selector Usable by Viewers from V3d +class SelectMgr_ViewerSelector3d : public SelectMgr_ViewerSelector +{ + DEFINE_STANDARD_RTTIEXT(SelectMgr_ViewerSelector3d, SelectMgr_ViewerSelector) +public: + + //! Constructs an empty 3D selector object. + Standard_EXPORT SelectMgr_ViewerSelector3d(); + + //! Picks the sensitive entity at the pixel coordinates of + //! the mouse and . The selector looks for touched areas and owners. + Standard_EXPORT void Pick (const Standard_Integer theXPix, + const Standard_Integer theYPix, + const Handle(V3d_View)& theView); + + //! Picks the sensitive entity according to the minimum + //! and maximum pixel values , , + //! and defining a 2D area for selection in the 3D view aView. + Standard_EXPORT void Pick (const Standard_Integer theXPMin, + const Standard_Integer theYPMin, + const Standard_Integer theXPMax, + const Standard_Integer theYPMax, + const Handle(V3d_View)& theView); + + //! pick action - input pixel values for polyline selection for selection. + Standard_EXPORT void Pick (const TColgp_Array1OfPnt2d& thePolyline, + const Handle(V3d_View)& theView); + + //! Dump of detection results into image. + //! This method performs axis picking for each pixel in the image + //! and generates a color depending on picking results and selection image type. + //! @param theImage result image, should be initialized + //! @param theView 3D view defining camera position + //! @param theType type of image to define + //! @param thePickedIndex index of picked entity (1 means topmost) + Standard_EXPORT Standard_Boolean ToPixMap (Image_PixMap& theImage, + const Handle(V3d_View)& theView, + const StdSelect_TypeOfSelectionImage theType, + const Standard_Integer thePickedIndex = 1); + +public: + + //! Displays sensitives in view . + Standard_EXPORT void DisplaySensitive (const Handle(V3d_View)& theView); + + Standard_EXPORT void ClearSensitive (const Handle(V3d_View)& theView); + + Standard_EXPORT void DisplaySensitive (const Handle(SelectMgr_Selection)& theSel, + const gp_Trsf& theTrsf, + const Handle(V3d_View)& theView, + const Standard_Boolean theToClearOthers = Standard_True); + + //! Dumps the content of me into the stream + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; + +protected: + + //! Update z-layers order map. + Standard_EXPORT void updateZLayers (const Handle(V3d_View)& theView); + +protected: + + Graphic3d_SequenceOfStructure myStructs; //!< list of debug presentations +}; + +DEFINE_STANDARD_HANDLE(SelectMgr_ViewerSelector3d, SelectMgr_ViewerSelector) + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector.cxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector.cxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,27 +35,35 @@ IMPLEMENT_STANDARD_RTTIEXT(SelectMgr_ViewerSelector, Standard_Transient) -namespace { - // Comparison operator for sorting selection results +namespace +{ + //! Comparison operator for sorting selection results class CompareResults { public: - - CompareResults (const SelectMgr_IndexedDataMapOfOwnerCriterion& aMapOfCriterion) - : myMapOfCriterion (aMapOfCriterion) - { - } + + CompareResults (const SelectMgr_IndexedDataMapOfOwnerCriterion& theMapOfCriterion, + bool theToPreferClosest) + : myMapOfCriterion (&theMapOfCriterion), + myToPreferClosest (theToPreferClosest) {} Standard_Boolean operator() (Standard_Integer theLeft, Standard_Integer theRight) const { - return myMapOfCriterion.FindFromIndex(theLeft) > myMapOfCriterion.FindFromIndex(theRight); + const SelectMgr_SortCriterion& anElemLeft = myMapOfCriterion->FindFromIndex (theLeft); + const SelectMgr_SortCriterion& anElemRight = myMapOfCriterion->FindFromIndex (theRight); + if (myToPreferClosest) + { + return anElemLeft.IsCloserDepth (anElemRight); + } + else + { + return anElemLeft.IsHigherPriority (anElemRight); + } } private: - void operator = (const CompareResults&); - - private: - const SelectMgr_IndexedDataMapOfOwnerCriterion& myMapOfCriterion; + const SelectMgr_IndexedDataMapOfOwnerCriterion* myMapOfCriterion; + bool myToPreferClosest; }; static const Graphic3d_Mat4d SelectMgr_ViewerSelector_THE_IDENTITY_MAT; @@ -76,9 +84,17 @@ return; } + bool hasNormal = false; if (thePickResult.HasPickedPoint()) { - theCriterion.Point = thePickResult.PickedPoint(); + theCriterion.Point = thePickResult.PickedPoint(); + theCriterion.Normal = thePickResult.SurfaceNormal(); + const float aNormLen2 = theCriterion.Normal.SquareModulus(); + if (aNormLen2 > ShortRealEpsilon()) + { + hasNormal = true; + theCriterion.Normal *= 1.0f / sqrtf (aNormLen2); + } } else if (!thePickResult.IsValid()) { @@ -97,21 +113,44 @@ } if (anInvTrsf.Form() != gp_Identity) { - anInvTrsf.Inverted().Transforms (theCriterion.Point.ChangeCoord()); + const gp_GTrsf anInvInvTrsd = anInvTrsf.Inverted(); + anInvInvTrsd.Transforms (theCriterion.Point.ChangeCoord()); + if (hasNormal) + { + Graphic3d_Mat4d aMat4; + anInvInvTrsd.GetMat4 (aMat4); + const Graphic3d_Vec4d aNormRes = aMat4 * Graphic3d_Vec4d (Graphic3d_Vec3d (theCriterion.Normal), 0.0); + theCriterion.Normal = Graphic3d_Vec3 (aNormRes.xyz()); + } } - if (mySelectingVolumeMgr.Camera().IsNull()) + const Standard_Real aSensFactor = myDepthTolType == SelectMgr_TypeOfDepthTolerance_SensitivityFactor ? theEntity->SensitivityFactor() : myDepthTolerance; + switch (myDepthTolType) { - theCriterion.Tolerance = theEntity->SensitivityFactor() / 33.0; - } - else if (mySelectingVolumeMgr.Camera()->IsOrthographic()) - { - theCriterion.Tolerance = myCameraScale * theEntity->SensitivityFactor(); - } - else - { - const Standard_Real aDistFromEye = Abs ((theCriterion.Point.XYZ() - myCameraEye.XYZ()).Dot (myCameraDir.XYZ())); - theCriterion.Tolerance = aDistFromEye * myCameraScale * theEntity->SensitivityFactor(); + case SelectMgr_TypeOfDepthTolerance_Uniform: + { + theCriterion.Tolerance = myDepthTolerance; + break; + } + case SelectMgr_TypeOfDepthTolerance_UniformPixels: + case SelectMgr_TypeOfDepthTolerance_SensitivityFactor: + { + if (mySelectingVolumeMgr.Camera().IsNull()) + { + // fallback for an arbitrary projection matrix + theCriterion.Tolerance = aSensFactor / 33.0; + } + else if (mySelectingVolumeMgr.Camera()->IsOrthographic()) + { + theCriterion.Tolerance = myCameraScale * aSensFactor; + } + else + { + const Standard_Real aDistFromEye = Abs ((theCriterion.Point.XYZ() - myCameraEye.XYZ()).Dot (myCameraDir.XYZ())); + theCriterion.Tolerance = aDistFromEye * myCameraScale * aSensFactor; + } + break; + } } } @@ -119,17 +158,41 @@ // Function: Initialize // Purpose : //================================================== -SelectMgr_ViewerSelector::SelectMgr_ViewerSelector(): -preferclosest(Standard_True), -myToUpdateTolerance (Standard_True), -myCameraScale (1.0), -myCurRank (0), -myIsLeftChildQueuedFirst (Standard_False), -myEntityIdx (0) +SelectMgr_ViewerSelector::SelectMgr_ViewerSelector() +: myDepthTolerance (0.0), + myDepthTolType (SelectMgr_TypeOfDepthTolerance_SensitivityFactor), + myToPreferClosest (Standard_True), + myToUpdateTolerance (Standard_True), + myCameraScale (1.0), + myToPrebuildBVH (Standard_False), + myCurRank (0), + myIsLeftChildQueuedFirst (Standard_False) { myEntitySetBuilder = new BVH_BinnedBuilder (BVH_Constants_LeafNodeSizeSingle, BVH_Constants_MaxTreeDepth, Standard_True); } +//======================================================================= +// Function: SetPixelTolerance +// Purpose : +//======================================================================= +void SelectMgr_ViewerSelector::SetPixelTolerance (const Standard_Integer theTolerance) +{ + if (myTolerances.Tolerance() == theTolerance) + { + return; + } + + myToUpdateTolerance = Standard_True; + if (theTolerance < 0) + { + myTolerances.ResetDefaults(); + } + else + { + myTolerances.SetCustomTolerance (theTolerance); + } +} + //================================================== // Function: Activate // Purpose : @@ -225,7 +288,6 @@ aCriterion.Priority = anOwner->Priority(); aCriterion.Depth = aPickResult.Depth(); aCriterion.MinDist = aPickResult.DistToGeomCenter(); - aCriterion.ToPreferClosest = preferclosest; if (SelectMgr_SortCriterion* aPrevCriterion = mystored.ChangeSeek (anOwner)) { @@ -233,7 +295,7 @@ aCriterion.NbOwnerMatches = aPrevCriterion->NbOwnerMatches; if (theMgr.GetActiveSelectionType() != SelectBasics_SelectingVolumeManager::Box) { - if (aCriterion > *aPrevCriterion) + if (aCriterion.IsCloserDepth (*aPrevCriterion)) { updatePoint3d (aCriterion, aPickResult, theEntity, theInversedTrsf, theMgr); *aPrevCriterion = aCriterion; @@ -348,7 +410,7 @@ if (!theObject->ClipPlanes().IsNull() && theObject->ClipPlanes()->ToOverrideGlobal()) { - aMgr.SetViewClipping (Handle(Graphic3d_SequenceOfHClipPlane)(), theObject->ClipPlanes()); + aMgr.SetViewClipping (Handle(Graphic3d_SequenceOfHClipPlane)(), theObject->ClipPlanes(), &theMgr); } else if (!theObject->TransformPersistence().IsNull()) { @@ -376,12 +438,12 @@ } } - aMgr.SetViewClipping (Handle(Graphic3d_SequenceOfHClipPlane)(), theObject->ClipPlanes()); + aMgr.SetViewClipping (Handle(Graphic3d_SequenceOfHClipPlane)(), theObject->ClipPlanes(), &theMgr); } else if (!theObject->ClipPlanes().IsNull() && !theObject->ClipPlanes()->IsEmpty()) { - aMgr.SetViewClipping (theMgr.ViewClipping(), theObject->ClipPlanes()); + aMgr.SetViewClipping (theMgr.ViewClipping(), theObject->ClipPlanes(), &theMgr); } if (!theMgr.ViewClipping().IsNull() && @@ -543,6 +605,8 @@ //======================================================================= void SelectMgr_ViewerSelector::TraverseSensitives() { + SelectMgr_BVHThreadPool::Sentry aSentry (myBVHThreadPool); + mystored.Clear(); Standard_Integer aWidth; @@ -848,28 +912,27 @@ //======================================================================= //function : SortResult -//purpose : there is a certain number of entities ranged by criteria -// (depth, size, priority, mouse distance from borders or -// CDG of the detected primitive. Parsing : -// maximum priorities . -// then a reasonable compromise between depth and distance... -// finally the ranges are stored in myindexes depending on the parsing. -// so, it is possible to only read +//purpose : //======================================================================= void SelectMgr_ViewerSelector::SortResult() { - if(mystored.IsEmpty()) return; + if (mystored.IsEmpty()) + { + return; + } const Standard_Integer anExtent = mystored.Extent(); - if(myIndexes.IsNull() || anExtent != myIndexes->Length()) + if (myIndexes.IsNull() || anExtent != myIndexes->Length()) + { myIndexes = new TColStd_HArray1OfInteger (1, anExtent); + } TColStd_Array1OfInteger& anIndexArray = myIndexes->ChangeArray1(); for (Standard_Integer anIndexIter = 1; anIndexIter <= anExtent; ++anIndexIter) { anIndexArray.SetValue (anIndexIter, anIndexIter); } - std::sort (anIndexArray.begin(), anIndexArray.end(), CompareResults (mystored)); + std::sort (anIndexArray.begin(), anIndexArray.end(), CompareResults (mystored, myToPreferClosest)); } //======================================================================= @@ -1051,21 +1114,78 @@ //function : DumpJson //purpose : //======================================================================= -void SelectMgr_ViewerSelector::DumpJson (Standard_OStream& theOStream, const Standard_Integer) const +void SelectMgr_ViewerSelector::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - OCCT_DUMP_CLASS_BEGIN (theOStream, SelectMgr_ViewerSelector); + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, preferclosest); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToUpdateTolerance); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mystored.Extent()); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToPreferClosest) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToUpdateTolerance) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, mystored.Extent()) - Standard_Integer aNbOfSelected = 0; + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &mySelectingVolumeMgr) + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, &mySelectableObjects) + + Standard_Integer aNbOfSelectableObjects = 0; for (SelectMgr_SelectableObjectSet::Iterator aSelectableIt (mySelectableObjects); aSelectableIt.More(); aSelectableIt.Next()) { - aNbOfSelected++; + aNbOfSelectableObjects++; + } + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aNbOfSelectableObjects) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTolerances.Tolerance()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTolerances.CustomTolerance()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myZLayerOrderMap.Extent()) + + OCCT_DUMP_FIELD_VALUE_POINTER (theOStream, myEntitySetBuilder.get()) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myCameraEye) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myCameraDir) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCameraScale) + + if (!myIndexes.IsNull()) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIndexes->Size()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCurRank) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsLeftChildQueuedFirst) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myMapOfObjectSensitives.Extent()) +} + +//======================================================================= +//function : SetToPrebuildBVH +//purpose : +//======================================================================= +void SelectMgr_ViewerSelector::SetToPrebuildBVH (Standard_Boolean theToPrebuild, Standard_Integer theThreadsNum) +{ + if (!theToPrebuild && !myBVHThreadPool.IsNull()) + { + myBVHThreadPool.Nullify(); + } + else if (theToPrebuild) + { + myBVHThreadPool = new SelectMgr_BVHThreadPool (theThreadsNum); + } + myToPrebuildBVH = theToPrebuild; +} + +//======================================================================= +//function : QueueBVHBuild +//purpose : +//======================================================================= +void SelectMgr_ViewerSelector::QueueBVHBuild (const Handle(Select3D_SensitiveEntity)& theEntity) +{ + if (myToPrebuildBVH) + { + myBVHThreadPool->AddEntity (theEntity); + } +} + +//======================================================================= +//function : WaitForBVHBuild +//purpose : +//======================================================================= +void SelectMgr_ViewerSelector::WaitForBVHBuild() +{ + if (myToPrebuildBVH) + { + myBVHThreadPool->WaitThreads(); } - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aNbOfSelected); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTolerances.Tolerance()); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myTolerances.CustomTolerance()); - OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myZLayerOrderMap.Size()); } diff -Nru opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector.hxx opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector.hxx --- opencascade-7.4.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SelectMgr/SelectMgr_ViewerSelector.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,9 @@ #include #include #include +#include #include +#include class SelectMgr_SelectionManager; class SelectMgr_SensitiveEntitySet; @@ -85,12 +87,20 @@ //! Empties all the tables, removes all selections... Standard_EXPORT void Clear(); - //! returns the Sensitivity of picking + //! Returns custom pixel tolerance value. + Standard_Integer CustomPixelTolerance() const { return myTolerances.CustomTolerance(); } + + //! Sets the pixel tolerance . + Standard_EXPORT void SetPixelTolerance (const Standard_Integer theTolerance); + + //! Returns the largest sensitivity of picking Standard_Real Sensitivity() const { return myTolerances.Tolerance(); } + //! Returns the largest pixel tolerance. + Standard_Integer PixelTolerance() const { return myTolerances.Tolerance(); } + //! Sorts the detected entites by priority and distance. - //! to be redefined if other criterion are used... - Standard_EXPORT void SortResult(); + Standard_EXPORT virtual void SortResult(); //! Returns the picked element with the highest priority, //! and which is the closest to the last successful mouse position. @@ -101,13 +111,32 @@ : Picked (1); } - //! Set preference of selecting one object for OnePicked() method: - //! - If True, objects with less depth (distance fron the view plane) are - //! preferred regardless of priority (priority is used then to choose among - //! objects with similar depth), - //! - If False, objects with higher priority are preferred regardless of the - //! depth which is used to choose among objects of the same priority. - void SetPickClosest (const Standard_Boolean theToPreferClosest) { preferclosest = theToPreferClosest; } + //! Return the flag determining precedence of picked depth (distance from eye to entity) over entity priority in sorted results; TRUE by default. + //! When flag is TRUE, priority will be considered only if entities have the same depth within the tolerance. + //! When flag is FALSE, entities with higher priority will be in front regardless of their depth (like x-ray). + bool ToPickClosest() const { return myToPreferClosest; } + + //! Set flag determining precedence of picked depth over entity priority in sorted results. + void SetPickClosest (bool theToPreferClosest) { myToPreferClosest = theToPreferClosest; } + + //! Return the type of tolerance for considering two entities having a similar depth (distance from eye to entity); + //! SelectMgr_TypeOfDepthTolerance_SensitivityFactor by default. + SelectMgr_TypeOfDepthTolerance DepthToleranceType() const { return myDepthTolType; } + + //! Return the tolerance for considering two entities having a similar depth (distance from eye to entity). + Standard_Real DepthTolerance() const { return myDepthTolerance; } + + //! Set the tolerance for considering two entities having a similar depth (distance from eye to entity). + //! @param theType [in] type of tolerance value + //! @param theTolerance [in] tolerance value in 3D scale (SelectMgr_TypeOfDepthTolerance_Uniform) + //! or in pixels (SelectMgr_TypeOfDepthTolerance_UniformPixels); + //! value is ignored in case of SelectMgr_TypeOfDepthTolerance_SensitivityFactor + void SetDepthTolerance (SelectMgr_TypeOfDepthTolerance theType, + Standard_Real theTolerance) + { + myDepthTolType = theType; + myDepthTolerance = theTolerance; + } //! Returns the number of detected owners. Standard_Integer NbPicked() const { return mystored.Extent(); } @@ -201,6 +230,9 @@ //! Returns instance of selecting volume manager of the viewer selector SelectMgr_SelectingVolumeManager& GetManager() { return mySelectingVolumeMgr; } + //! Return map of selectable objects. + const SelectMgr_SelectableObjectSet& SelectableObjects() const { return mySelectableObjects; } + //! Marks all added sensitive entities of all objects as non-selectable Standard_EXPORT void ResetSelectionActivationStatus(); @@ -210,7 +242,7 @@ Standard_EXPORT void AllowOverlapDetection (const Standard_Boolean theIsToAllow); //! Dumps the content of me into the stream - Standard_EXPORT void DumpJson (Standard_OStream& theOStream, const Standard_Integer theDepth = -1) const; + Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const; public: @@ -248,6 +280,23 @@ Standard_DEPRECATED("Deprecated method DetectedEntity() should be replaced by DetectedEntity(int)") Standard_EXPORT const Handle(Select3D_SensitiveEntity)& DetectedEntity() const; +public: + + //! Enables/disables building BVH for sensitives in separate threads + Standard_EXPORT void SetToPrebuildBVH(Standard_Boolean theToPrebuild, Standard_Integer theThreadsNum = -1); + + //! Queues a sensitive entity to build its BVH + Standard_EXPORT void QueueBVHBuild(const Handle(Select3D_SensitiveEntity)& theEntity); + + //! Waits BVH threads finished building + Standard_EXPORT void WaitForBVHBuild(); + + //! Returns TRUE if building BVH for sensitives in separate threads is enabled + Standard_Boolean ToPrebuildBVH() const + { + return myToPrebuildBVH; + } + protected: Standard_EXPORT SelectMgr_ViewerSelector(); @@ -327,7 +376,9 @@ protected: - Standard_Boolean preferclosest; + Standard_Real myDepthTolerance; + SelectMgr_TypeOfDepthTolerance myDepthTolType; + Standard_Boolean myToPreferClosest; Standard_Boolean myToUpdateTolerance; SelectMgr_IndexedDataMapOfOwnerCriterion mystored; SelectMgr_SelectingVolumeManager mySelectingVolumeMgr; @@ -339,12 +390,12 @@ gp_Dir myCameraDir; Standard_Real myCameraScale; -private: + Standard_Boolean myToPrebuildBVH; + Handle(SelectMgr_BVHThreadPool) myBVHThreadPool; Handle(TColStd_HArray1OfInteger) myIndexes; Standard_Integer myCurRank; Standard_Boolean myIsLeftChildQueuedFirst; - Standard_Integer myEntityIdx; SelectMgr_MapOfObjectSensitives myMapOfObjectSensitives; }; diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Declarations.glsl opencascade-7.5.1+dfsg1/src/Shaders/Declarations.glsl --- opencascade-7.4.1+dfsg1/src/Shaders/Declarations.glsl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Declarations.glsl 2021-02-02 08:51:56.000000000 +0000 @@ -21,6 +21,8 @@ #define occTexture1D texture #define occTexture2D texture #define occTexture3D texture + #define occTextureCube texture + #define occTextureCubeLod textureLod #else #define THE_ATTRIBUTE attribute #define THE_SHADER_IN varying @@ -29,10 +31,16 @@ #define occTexture1D texture1D #define occTexture2D texture2D #define occTexture3D texture3D + #define occTextureCube textureCube + #define occTextureCubeLod textureCubeLod #endif #ifdef GL_ES - #define THE_PREC_ENUM lowp // enumerations should fit into lowp range +#if (__VERSION__ >= 300) + #define THE_PREC_ENUM highp // lowp should be enough for enums but triggers driver bugs +#else + #define THE_PREC_ENUM lowp +#endif #else #define THE_PREC_ENUM #endif @@ -85,6 +93,15 @@ void occSetFragColor (in vec4 theColor); #endif +// Pi number definitions +#define PI 3.141592654 +#define PI_2 6.283185307 +#define PI_DIV_2 1.570796327 +#define PI_DIV_3 1.047197551 +#define PI_DIV_4 0.785398163 +#define INV_PI 0.318309886 +#define INV_PI_2 0.159154943 + // Matrix state uniform mat4 occWorldViewMatrix; //!< World-view matrix uniform mat4 occProjectionMatrix; //!< Projection matrix @@ -102,7 +119,16 @@ uniform mat4 occProjectionMatrixInverseTranspose; //!< Transpose of the inverse of the projection matrix uniform mat4 occModelWorldMatrixInverseTranspose; //!< Transpose of the inverse of the model-world matrix -// light type enumeration +#if defined(THE_IS_PBR) +uniform sampler2D occEnvLUT; //!< Environment Lookup Table +uniform sampler2D occDiffIBLMapSHCoeffs; //!< Packed diffuse (irradiance) IBL map's spherical harmonics coefficients +uniform samplerCube occSpecIBLMap; //!< Specular IBL map +uniform int occNbSpecIBLLevels; //!< Number of mipmap levels used in occSpecIBLMap to store different roughness values maps + +vec3 occDiffIBLMap (in vec3 theNormal); //!< Unpacks spherical harmonics coefficients to diffuse IBL map's values +#endif + +// light type enumeration (same as Graphic3d_TypeOfLightSource) const int OccLightType_Direct = 1; //!< directional light source const int OccLightType_Point = 2; //!< isotropic point light source const int OccLightType_Spot = 3; //!< spot light source @@ -111,40 +137,116 @@ uniform vec4 occLightAmbient; //!< Cumulative ambient color #if defined(THE_MAX_LIGHTS) && (THE_MAX_LIGHTS > 0) uniform THE_PREC_ENUM int occLightSourcesCount; //!< Total number of light sources -int occLight_Type (in int theId); //!< Type of light source -int occLight_IsHeadlight (in int theId); //!< Is light a headlight? -vec4 occLight_Diffuse (in int theId); //!< Diffuse intensity for specified light source -vec4 occLight_Specular (in int theId); //!< Specular intensity (currently - equals to diffuse intencity) -vec4 occLight_Position (in int theId); //!< Position of specified light source -vec4 occLight_SpotDirection (in int theId); //!< Direction of specified spot light source -float occLight_ConstAttenuation (in int theId); //!< Const attenuation factor of positional light source -float occLight_LinearAttenuation (in int theId); //!< Linear attenuation factor of positional light source -float occLight_SpotCutOff (in int theId); //!< Maximum spread angle of the spot light (in radians) -float occLight_SpotExponent (in int theId); //!< Attenuation of the spot light intensity (from 0 to 1) + +//! Type of light source, int (see OccLightType enum). +#define occLight_Type(theId) occLightSourcesTypes[theId] + +//! Specular intensity (equals to diffuse), vec3. +#define occLight_Specular(theId) occLightSources[theId * 4 + 0].rgb + +//! Intensity of light source (>= 0), float. +#define occLight_Intensity(theId) occLightSources[theId * 4 + 0].a + +//! Is light a headlight, bool? +#define occLight_IsHeadlight(theId) (occLightSources[theId * 4 + 1].w > 0.5) + +//! Position of specified light source, vec3. +#define occLight_Position(theId) occLightSources[theId * 4 + 1].xyz + +//! Direction of specified spot light source, vec3. +#define occLight_SpotDirection(theId) occLightSources[theId * 4 + 2].xyz + +//! Range on which point light source (positional or spot) can affect (>= 0), float. +#define occLight_Range(theId) occLightSources[theId * 4 + 2].w + +//! Maximum spread angle of the spot light (in radians), float. +#define occLight_SpotCutOff(theId) occLightSources[theId * 4 + 3].z + +//! Attenuation of the spot light intensity (from 0 to 1), float. +#define occLight_SpotExponent(theId) occLightSources[theId * 4 + 3].w + +#if !defined(THE_IS_PBR) +//! Diffuse intensity (equals to Specular), vec3. +#define occLight_Diffuse(theId) occLightSources[theId * 4 + 0].rgb + +//! Const attenuation factor of positional light source, float. +#define occLight_ConstAttenuation(theId) occLightSources[theId * 4 + 3].x + +//! Linear attenuation factor of positional light source, float. +#define occLight_LinearAttenuation(theId) occLightSources[theId * 4 + 3].y +#endif #endif +#if defined(THE_IS_PBR) +//! Converts roughness value from range [0, 1] to real value for calculations +float occRoughness (in float theNormalizedRoughness); + +// Front/back material properties accessors +vec4 occPBRMaterial_Color(in bool theIsFront); //!< Base color of PBR material +float occPBRMaterial_Metallic(in bool theIsFront); //!< Metallic coefficient +float occPBRMaterial_NormalizedRoughness(in bool theIsFront); //!< Normalized roughness coefficient +vec3 occPBRMaterial_Emission(in bool theIsFront); //!< Light intensity emitted by material +float occPBRMaterial_IOR(in bool theIsFront); //!< Index of refraction +#else // Front material properties accessors -vec4 occFrontMaterial_Emission(void); //!< Emission color -vec4 occFrontMaterial_Ambient(void); //!< Ambient reflection -vec4 occFrontMaterial_Diffuse(void); //!< Diffuse reflection -vec4 occFrontMaterial_Specular(void); //!< Specular reflection -float occFrontMaterial_Shininess(void); //!< Specular exponent -float occFrontMaterial_Transparency(void); //!< Transparency coefficient +vec4 occFrontMaterial_Emission(void); //!< Emission color +vec4 occFrontMaterial_Ambient(void); //!< Ambient reflection +vec4 occFrontMaterial_Diffuse(void); //!< Diffuse reflection +vec4 occFrontMaterial_Specular(void); //!< Specular reflection +float occFrontMaterial_Shininess(void); //!< Specular exponent +float occFrontMaterial_Transparency(void); //!< Transparency coefficient // Back material properties accessors -vec4 occBackMaterial_Emission(void); //!< Emission color -vec4 occBackMaterial_Ambient(void); //!< Ambient reflection -vec4 occBackMaterial_Diffuse(void); //!< Diffuse reflection -vec4 occBackMaterial_Specular(void); //!< Specular reflection -float occBackMaterial_Shininess(void); //!< Specular exponent -float occBackMaterial_Transparency(void); //!< Transparency coefficient +vec4 occBackMaterial_Emission(void); //!< Emission color +vec4 occBackMaterial_Ambient(void); //!< Ambient reflection +vec4 occBackMaterial_Diffuse(void); //!< Diffuse reflection +vec4 occBackMaterial_Specular(void); //!< Specular reflection +float occBackMaterial_Shininess(void); //!< Specular exponent +float occBackMaterial_Transparency(void); //!< Transparency coefficient +#endif #ifdef THE_HAS_DEFAULT_SAMPLER -#define occActiveSampler occSampler0 //!< alias for backward compatibility -#define occSamplerBaseColor occSampler0 //!< alias to a base color texture -uniform sampler2D occSampler0; //!< current active sampler; +#define occActiveSampler occSampler0 //!< alias for backward compatibility +#define occSamplerBaseColor occSampler0 //!< alias to a base color texture +uniform sampler2D occSampler0; //!< current active sampler; +#endif //! occSampler1, occSampler2,... should be defined in GLSL program body for multitexturing + +#if defined(THE_HAS_TEXTURE_COLOR) +#define occTextureColor(theMatColor, theTexCoord) (theMatColor * occTexture2D(occSamplerBaseColor, theTexCoord)) +#else +#define occTextureColor(theMatColor, theTexCoord) theMatColor +#endif + +#if defined(THE_HAS_TEXTURE_OCCLUSION) && defined(FRAGMENT_SHADER) +uniform sampler2D occSamplerOcclusion; //!< R occlusion texture sampler +#define occTextureOcclusion(theColor, theTexCoord) theColor *= occTexture2D(occSamplerOcclusion, theTexCoord).r; +#else +#define occTextureOcclusion(theColor, theTexCoord) +#endif + +#if defined(THE_HAS_TEXTURE_EMISSIVE) && defined(FRAGMENT_SHADER) +uniform sampler2D occSamplerEmissive; //!< RGB emissive texture sampler +#define occTextureEmissive(theMatEmis, theTexCoord) (theMatEmis * occTexture2D(occSamplerEmissive, theTexCoord).rgb) +#else +#define occTextureEmissive(theMatEmis, theTexCoord) theMatEmis +#endif + +#if defined(THE_HAS_TEXTURE_NORMAL) && defined(FRAGMENT_SHADER) +uniform sampler2D occSamplerNormal; //!< XYZ normal texture sampler with W==0 indicating no texture +#define occTextureNormal(theTexCoord) occTexture2D(occSamplerNormal, theTexCoord) +#else +#define occTextureNormal(theTexCoord) vec4(0.0) // no normal map #endif - //! occSampler1, occSampler2,... should be defined in GLSL program body for multitexturing + +#if defined(THE_HAS_TEXTURE_METALROUGHNESS) && defined(FRAGMENT_SHADER) +uniform sampler2D occSamplerMetallicRoughness; //!< BG metallic-roughness texture sampler +#define occTextureRoughness(theRoug, theTexCoord) (theRoug * occTexture2D(occSamplerMetallicRoughness, theTexCoord).g) +#define occTextureMetallic(theMet, theTexCoord) (theMet * occTexture2D(occSamplerMetallicRoughness, theTexCoord).b) +#else +#define occTextureRoughness(theRoug, theTexCoord) theRoug +#define occTextureMetallic(theMet, theTexCoord) theMet +#endif + uniform vec4 occColor; //!< color value (in case of disabled lighting) uniform THE_PREC_ENUM int occDistinguishingMode; //!< Are front and back faces distinguished? uniform THE_PREC_ENUM int occTextureEnable; //!< Is texture enabled? diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/DeclarationsImpl.glsl opencascade-7.5.1+dfsg1/src/Shaders/DeclarationsImpl.glsl --- opencascade-7.4.1+dfsg1/src/Shaders/DeclarationsImpl.glsl 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/DeclarationsImpl.glsl 2021-02-02 08:51:56.000000000 +0000 @@ -19,27 +19,49 @@ #if defined(THE_MAX_LIGHTS) && (THE_MAX_LIGHTS > 0) // arrays of light sources -uniform THE_PREC_ENUM ivec2 occLightSourcesTypes[THE_MAX_LIGHTS]; //!< packed light sources types -uniform vec4 occLightSources[THE_MAX_LIGHTS * 4]; //!< packed light sources parameters +uniform vec4 occLightSources[THE_MAX_LIGHTS * 4]; //!< packed light sources parameters +uniform THE_PREC_ENUM int occLightSourcesTypes[THE_MAX_LIGHTS]; //!< packed light sources types +#endif -// light source properties accessors -int occLight_Type (in int theId) { return occLightSourcesTypes[theId].x; } -int occLight_IsHeadlight (in int theId) { return occLightSourcesTypes[theId].y; } -vec4 occLight_Diffuse (in int theId) { return occLightSources[theId * 4 + 0]; } -vec4 occLight_Specular (in int theId) { return occLightSources[theId * 4 + 0]; } -vec4 occLight_Position (in int theId) { return occLightSources[theId * 4 + 1]; } -vec4 occLight_SpotDirection (in int theId) { return occLightSources[theId * 4 + 2]; } -float occLight_ConstAttenuation (in int theId) { return occLightSources[theId * 4 + 3].x; } -float occLight_LinearAttenuation (in int theId) { return occLightSources[theId * 4 + 3].y; } -float occLight_SpotCutOff (in int theId) { return occLightSources[theId * 4 + 3].z; } -float occLight_SpotExponent (in int theId) { return occLightSources[theId * 4 + 3].w; } +#if defined(THE_IS_PBR) +vec3 occDiffIBLMap (in vec3 theNormal) +{ + vec3 aSHCoeffs[9]; + for (int i = 0; i < 9; ++i) + { + aSHCoeffs[i] = occTexture2D (occDiffIBLMapSHCoeffs, vec2 ((float(i) + 0.5) / 9.0, 0.0)).rgb; + } + return aSHCoeffs[0] + + + aSHCoeffs[1] * theNormal.x + + aSHCoeffs[2] * theNormal.y + + aSHCoeffs[3] * theNormal.z + + + aSHCoeffs[4] * theNormal.x * theNormal.z + + aSHCoeffs[5] * theNormal.y * theNormal.z + + aSHCoeffs[6] * theNormal.x * theNormal.y + + + aSHCoeffs[7] * (3.0 * theNormal.z * theNormal.z - 1.0) + + aSHCoeffs[8] * (theNormal.x * theNormal.x - theNormal.y * theNormal.y); +} #endif -// material state +// front and back material properties accessors +#if defined(THE_IS_PBR) +uniform vec4 occPbrFrontMaterial[3]; +uniform vec4 occPbrBackMaterial[3]; + +#define MIN_ROUGHNESS 0.01 +float occRoughness (in float theNormalizedRoughness) { return theNormalizedRoughness * (1.0 - MIN_ROUGHNESS) + MIN_ROUGHNESS; } +vec4 occPBRMaterial_Color(in bool theIsFront) { return theIsFront ? occPbrFrontMaterial[0] : occPbrBackMaterial[0]; } +vec3 occPBRMaterial_Emission(in bool theIsFront) { return theIsFront ? occPbrFrontMaterial[1].rgb : occPbrBackMaterial[1].rgb; } +float occPBRMaterial_IOR(in bool theIsFront) { return theIsFront ? occPbrFrontMaterial[1].w : occPbrBackMaterial[1].w; } +float occPBRMaterial_Metallic(in bool theIsFront) { return theIsFront ? occPbrFrontMaterial[2].b : occPbrBackMaterial[2].b; } +float occPBRMaterial_NormalizedRoughness(in bool theIsFront) { return theIsFront ? occPbrFrontMaterial[2].g : occPbrBackMaterial[2].g; } +#else uniform vec4 occFrontMaterial[5]; uniform vec4 occBackMaterial[5]; -// front material properties accessors vec4 occFrontMaterial_Ambient(void) { return occFrontMaterial[0]; } vec4 occFrontMaterial_Diffuse(void) { return occFrontMaterial[1]; } vec4 occFrontMaterial_Specular(void) { return occFrontMaterial[2]; } @@ -47,13 +69,13 @@ float occFrontMaterial_Shininess(void) { return occFrontMaterial[4].x; } float occFrontMaterial_Transparency(void) { return occFrontMaterial[4].y; } -// back material properties accessors vec4 occBackMaterial_Ambient(void) { return occBackMaterial[0]; } vec4 occBackMaterial_Diffuse(void) { return occBackMaterial[1]; } vec4 occBackMaterial_Specular(void) { return occBackMaterial[2]; } vec4 occBackMaterial_Emission(void) { return occBackMaterial[3]; } float occBackMaterial_Shininess(void) { return occBackMaterial[4].x; } float occBackMaterial_Transparency(void) { return occBackMaterial[4].y; } +#endif // 2D texture coordinates transformation vec2 occTextureTrsf_Translation(void) { return occTexTrsf2d[0].xy; } diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Display.fs opencascade-7.5.1+dfsg1/src/Shaders/Display.fs --- opencascade-7.4.1+dfsg1/src/Shaders/Display.fs 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Display.fs 2021-02-02 08:51:56.000000000 +0000 @@ -144,8 +144,12 @@ aColor = ToneMappingFilmic (aColor, uWhitePoint); #endif // TONE_MAPPING +#ifdef THE_SHIFT_sRGB // apply gamma correction (we use gamma = 2) OutColor = vec4 (sqrt (aColor.rgb), 0.f); +#else + OutColor = vec4 (aColor.rgb, 0.f); +#endif #else // not PATH_TRACING diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/FILES opencascade-7.5.1+dfsg1/src/Shaders/FILES --- opencascade-7.4.1+dfsg1/src/Shaders/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,18 +1,36 @@ srcinc:::Declarations.glsl srcinc:::DeclarationsImpl.glsl +srcinc:::PBRCookTorrance.glsl +srcinc:::PBRDistribution.glsl +srcinc:::PBREnvBaking.fs +srcinc:::PBREnvBaking.vs +srcinc:::PBRFresnel.glsl +srcinc:::PBRGeometry.glsl +srcinc:::PBRIllumination.glsl srcinc:::PhongShading.fs srcinc:::PhongShading.vs +srcinc:::PointLightAttenuation.glsl srcinc:::Display.fs srcinc:::RaytraceBase.fs srcinc:::RaytraceRender.fs srcinc:::PathtraceBase.fs srcinc:::RaytraceBase.vs srcinc:::RaytraceSmooth.fs +srcinc:::TangentSpaceNormal.glsl Shaders_Declarations_glsl.pxx Shaders_DeclarationsImpl_glsl.pxx Shaders_Display_fs.pxx +Shaders_PBRCookTorrance_glsl.pxx +Shaders_PBRDistribution_glsl.pxx +Shaders_PBREnvBaking_fs.pxx +Shaders_PBREnvBaking_vs.pxx +Shaders_PBRFresnel_glsl.pxx +Shaders_PBRGeometry_glsl.pxx +Shaders_PBRIllumination_glsl.pxx +Shaders_PointLightAttenuation_glsl.pxx Shaders_RaytraceBase_fs.pxx Shaders_RaytraceRender_fs.pxx Shaders_PathtraceBase_fs.pxx Shaders_RaytraceBase_vs.pxx Shaders_RaytraceSmooth_fs.pxx +Shaders_TangentSpaceNormal_glsl.pxx diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/PathtraceBase.fs opencascade-7.5.1+dfsg1/src/Shaders/PathtraceBase.fs --- opencascade-7.4.1+dfsg1/src/Shaders/PathtraceBase.fs 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/PathtraceBase.fs 2021-02-02 08:51:56.000000000 +0000 @@ -34,20 +34,20 @@ //! Weight of coat specular/glossy BRDF. vec4 Kc; - //! Weight of base diffuse BRDF. + //! Weight of base diffuse BRDF + base color texture index in W. vec4 Kd; //! Weight of base specular/glossy BRDF. vec4 Ks; - //! Weight of base specular/glossy BTDF. - vec3 Kt; + //! Weight of base specular/glossy BTDF + metallic-roughness texture index in W. + vec4 Kt; //! Fresnel coefficients of coat layer. vec3 FresnelCoat; - //! Fresnel coefficients of base layer. - vec3 FresnelBase; + //! Fresnel coefficients of base layer + normal map texture index in W. + vec4 FresnelBase; }; /////////////////////////////////////////////////////////////////////////////////////// @@ -322,7 +322,7 @@ if (theBSDF.Ks.w > FLT_EPSILON) { - aBxDF += theBSDF.Ks.rgb * EvalBlinnReflection (theWi, theWo, theBSDF.FresnelBase, theBSDF.Ks.w); + aBxDF += theBSDF.Ks.rgb * EvalBlinnReflection (theWi, theWo, theBSDF.FresnelBase.rgb, theBSDF.Ks.w); } aBxDF *= UNIT - fresnelMedia (theWo.z, theBSDF.FresnelCoat); @@ -546,7 +546,7 @@ if (theBSDF.Ks.w < FLT_EPSILON) { - theWeight *= fresnelMedia (theWo.z, theBSDF.FresnelBase); + theWeight *= fresnelMedia (theWo.z, theBSDF.FresnelBase.rgb); theWi = vec3 (-theWo.x, -theWo.y, @@ -554,7 +554,7 @@ } else { - theWeight *= SampleGlossyBlinnReflection (theWo, theWi, theBSDF.FresnelBase, theBSDF.Ks.w, aPDF); + theWeight *= SampleGlossyBlinnReflection (theWo, theWi, theBSDF.FresnelBase.rgb, theBSDF.Ks.w, aPDF); } aPDF = mix (aPDF, MAXFLOAT, theBSDF.Ks.w < FLT_EPSILON); @@ -580,20 +580,6 @@ // Handlers and samplers for light sources ////////////////////////////////////////////////////////////////////////////////////////////// -// ======================================================================= -// function : Latlong -// purpose : Converts world direction to environment texture coordinates -// ======================================================================= -vec2 Latlong (in vec3 thePoint) -{ - float aPsi = acos (-thePoint.z); - - float aPhi = atan (thePoint.y, thePoint.x) + M_PI; - - return vec2 (aPhi * 0.1591549f, - aPsi * 0.3183098f); -} - //======================================================================= // function : SampleLight // purpose : General sampling function for directional and point lights @@ -701,14 +687,34 @@ if (thePDF == 0.f && theHitDistance == MAXFLOAT) // light source not found { - if (theDepth + uSphereMapForBack == 0) // view ray and map is hidden + if (theDepth + uEnvMapForBack == 0) // view ray and map is hidden { - aTotalRadiance = pow (BackgroundColor().rgb, vec3 (2.f)); + aTotalRadiance = BackgroundColor().rgb; } else { - aTotalRadiance = pow (FetchEnvironment (Latlong (theRay.Direct)).rgb, vec3 (2.f)); - } + #ifdef BACKGROUND_CUBEMAP + if (theDepth == 0) + { + vec2 aPixel = uEyeSize * (vPixel - vec2 (0.5)) * 2.0; + vec2 anAperturePnt = sampleUniformDisk() * uApertureRadius; + vec3 aLocalDir = normalize (vec3 (aPixel * uFocalPlaneDist - anAperturePnt, uFocalPlaneDist)); + vec3 aDirect = uEyeView * aLocalDir.z + + uEyeSide * aLocalDir.x + + uEyeVert * aLocalDir.y; + aTotalRadiance = FetchEnvironment (aDirect, 1.0, true).rgb; + } + else + { + aTotalRadiance = FetchEnvironment (theRay.Direct, 1.0, false).rgb; + } + #else + aTotalRadiance = FetchEnvironment (theRay.Direct, 1.0, theDepth == 0).rgb; + #endif + } + #ifdef THE_SHIFT_sRGB + aTotalRadiance = pow (aTotalRadiance, vec3 (2.f)); + #endif } return aTotalRadiance; @@ -754,6 +760,23 @@ } //======================================================================= +// function : NormalAdaptation +// purpose : Adapt smooth normal (which may be different from geometry normal) in order to avoid black areas in render +//======================================================================= +bool NormalAdaptation (in vec3 theView, in vec3 theGeometryNormal, inout vec3 theSmoothNormal) +{ + float aMinCos = dot(theView, theGeometryNormal); + aMinCos = 0.5 * (sqrt(1.0 - aMinCos) + sqrt(1.0 + aMinCos)); + float aCos = dot(theGeometryNormal, theSmoothNormal); + if (aCos < aMinCos) + { + theSmoothNormal = aMinCos * theGeometryNormal + normalize(theSmoothNormal - aCos * theGeometryNormal) * sqrt(1.0 - aMinCos * aMinCos); + return true; + } + return false; +} + +//======================================================================= // function : PathTrace // purpose : Calculates radiance along the given ray //======================================================================= @@ -774,12 +797,12 @@ { SIntersect aHit = SIntersect (MAXFLOAT, vec2 (ZERO), ZERO); - ivec4 aTriIndex = SceneNearestHit (theRay, theInverse, aHit, aTransfID); + STriangle aTriangle = SceneNearestHit (theRay, theInverse, aHit, aTransfID); // check implicit path vec3 aLe = IntersectLight (theRay, aDepth, aHit.Time, aExpPDF); - if (any (greaterThan (aLe, ZERO)) || aTriIndex.x == -1) + if (any (greaterThan (aLe, ZERO)) || aTriangle.TriIndex.x == -1) { float aMIS = (aDepth == 0 || aImpPDF == MAXFLOAT) ? 1.f : aImpPDF * aImpPDF / (aExpPDF * aExpPDF + aImpPDF * aImpPDF); @@ -810,49 +833,79 @@ SBSDF aBSDF; // fetch BxDF weights - aBSDF.Kc = texelFetch (uRaytraceMaterialTexture, MATERIAL_KC (aTriIndex.w)); - aBSDF.Kd = texelFetch (uRaytraceMaterialTexture, MATERIAL_KD (aTriIndex.w)); - aBSDF.Ks = texelFetch (uRaytraceMaterialTexture, MATERIAL_KS (aTriIndex.w)); - aBSDF.Kt = texelFetch (uRaytraceMaterialTexture, MATERIAL_KT (aTriIndex.w)).rgb; + aBSDF.Kc = texelFetch (uRaytraceMaterialTexture, MATERIAL_KC (aTriangle.TriIndex.w)); + aBSDF.Kd = texelFetch (uRaytraceMaterialTexture, MATERIAL_KD (aTriangle.TriIndex.w)); + aBSDF.Ks = texelFetch (uRaytraceMaterialTexture, MATERIAL_KS (aTriangle.TriIndex.w)); + aBSDF.Kt = texelFetch (uRaytraceMaterialTexture, MATERIAL_KT (aTriangle.TriIndex.w)); - // compute smooth normal (in parallel with fetch) - vec3 aNormal = SmoothNormal (aHit.UV, aTriIndex); + // fetch Fresnel reflectance for both layers + aBSDF.FresnelCoat = texelFetch (uRaytraceMaterialTexture, MATERIAL_FRESNEL_COAT (aTriangle.TriIndex.w)).xyz; + aBSDF.FresnelBase = texelFetch (uRaytraceMaterialTexture, MATERIAL_FRESNEL_BASE (aTriangle.TriIndex.w)); + vec4 anLE = texelFetch (uRaytraceMaterialTexture, MATERIAL_LE (aTriangle.TriIndex.w)); + + // compute smooth normal (in parallel with fetch) + vec3 aNormal = SmoothNormal (aHit.UV, aTriangle.TriIndex); aNormal = normalize (vec3 (dot (aInvTransf0, aNormal), dot (aInvTransf1, aNormal), dot (aInvTransf2, aNormal))); - SLocalSpace aSpace = buildLocalSpace (aNormal); - #ifdef USE_TEXTURES - if (aBSDF.Kd.w >= 0.f) + if (aBSDF.Kd.w >= 0.0 || aBSDF.Kt.w >= 0.0 || aBSDF.FresnelBase.w >=0.0 || anLE.w >= 0.0) { - vec4 aTexCoord = vec4 (SmoothUV (aHit.UV, aTriIndex), 0.f, 1.f); - - vec4 aTrsfRow1 = texelFetch ( - uRaytraceMaterialTexture, MATERIAL_TRS1 (aTriIndex.w)); - vec4 aTrsfRow2 = texelFetch ( - uRaytraceMaterialTexture, MATERIAL_TRS2 (aTriIndex.w)); - + vec2 aUVs[3]; + vec4 aTexCoord = vec4 (SmoothUV (aHit.UV, aTriangle.TriIndex, aUVs), 0.f, 1.f); + vec4 aTrsfRow1 = texelFetch (uRaytraceMaterialTexture, MATERIAL_TRS1 (aTriangle.TriIndex.w)); + vec4 aTrsfRow2 = texelFetch (uRaytraceMaterialTexture, MATERIAL_TRS2 (aTriangle.TriIndex.w)); aTexCoord.st = vec2 (dot (aTrsfRow1, aTexCoord), dot (aTrsfRow2, aTexCoord)); - vec4 aTexColor = textureLod ( - sampler2D (uTextureSamplers[int (aBSDF.Kd.w)]), aTexCoord.st, 0.f); - - aBSDF.Kd.rgb *= (aTexColor.rgb * aTexColor.rgb) * aTexColor.w; // de-gamma correction (for gamma = 2) - - if (aTexColor.w != 1.0f) + if (anLE.w >= 0.0) { - // mix transparency BTDF with texture alpha-channel - aBSDF.Kt = (UNIT - aTexColor.www) + aTexColor.w * aBSDF.Kt; + anLE.rgb *= textureLod (sampler2D (uTextureSamplers[int (anLE.w)]), aTexCoord.st, 0.0).rgb; } + if (aBSDF.Kt.w >= 0.0) + { + vec2 aTexMetRough = textureLod (sampler2D (uTextureSamplers[int (aBSDF.Kt.w)]), aTexCoord.st, 0.0).bg; + float aPbrMetal = aTexMetRough.x; + float aPbrRough2 = aTexMetRough.y * aTexMetRough.y; + aBSDF.Ks.a *= aPbrRough2; + // when using metal-roughness texture, global metalness of material (encoded in FresnelBase) is expected to be 1.0 so that Kd will be 0.0 + aBSDF.Kd.rgb = aBSDF.FresnelBase.rgb * (1.0 - aPbrMetal); + aBSDF.FresnelBase.rgb *= aPbrMetal; + } + if (aBSDF.Kd.w >= 0.0) + { + vec4 aTexColor = textureLod (sampler2D (uTextureSamplers[int (aBSDF.Kd.w)]), aTexCoord.st, 0.0); + vec3 aDiff = aTexColor.rgb * aTexColor.a; + aBSDF.Kd.rgb *= aDiff; + aBSDF.FresnelBase.rgb *= aDiff; + if (aTexColor.a != 1.0) + { + // mix transparency BTDF with texture alpha-channel + aBSDF.Ks.rgb *= aTexColor.a; + aBSDF.Kt.rgb = (UNIT - aTexColor.aaa) + aTexColor.a * aBSDF.Kt.rgb; + } + } + #ifndef IGNORE_NORMAL_MAP + if (aBSDF.FresnelBase.w >= 0.0) + { + for (int i = 0 ; i < 3; ++i) + { + aUVs[i] = vec2 (dot (aTrsfRow1, vec4(aUVs[i], 0.0, 1.0)), + dot (aTrsfRow2, vec4(aUVs[i], 0.0, 1.0))); + } + vec3 aMapNormalValue = textureLod (sampler2D (uTextureSamplers[int (aBSDF.FresnelBase.w)]), aTexCoord.st, 0.0).xyz; + mat2 aDeltaUVMatrix = mat2 (aUVs[1] - aUVs[0], aUVs[1] - aUVs[2]); + mat2x3 aDeltaVectorMatrix = mat2x3 (aTriangle.Points[1] - aTriangle.Points[0], aTriangle.Points[1] - aTriangle.Points[2]); + aNormal = TangentSpaceNormal (aDeltaUVMatrix, aDeltaVectorMatrix, aMapNormalValue, aNormal, true); + } + #endif } #endif - - // fetch Fresnel reflectance for both layers - aBSDF.FresnelCoat = texelFetch (uRaytraceMaterialTexture, MATERIAL_FRESNEL_COAT (aTriIndex.w)).xyz; - aBSDF.FresnelBase = texelFetch (uRaytraceMaterialTexture, MATERIAL_FRESNEL_BASE (aTriIndex.w)).xyz; + NormalAdaptation (-theRay.Direct, aHit.Normal, aNormal); + aHit.Normal = aNormal; + SLocalSpace aSpace = buildLocalSpace (aNormal); if (uLightCount > 0 && IsNotZero (aBSDF, aThroughput)) { @@ -897,11 +950,11 @@ } // account for self-emission - aRadiance += aThroughput * texelFetch (uRaytraceMaterialTexture, MATERIAL_LE (aTriIndex.w)).rgb; + aRadiance += aThroughput * anLE.rgb; if (aInMedium) // handle attenuation { - vec4 aScattering = texelFetch (uRaytraceMaterialTexture, MATERIAL_ABSORPT_BASE (aTriIndex.w)); + vec4 aScattering = texelFetch (uRaytraceMaterialTexture, MATERIAL_ABSORPT_BASE (aTriangle.TriIndex.w)); aThroughput *= exp (-aHit.Time * aScattering.w * (UNIT - aScattering.rgb)); } diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/PBRCookTorrance.glsl opencascade-7.5.1+dfsg1/src/Shaders/PBRCookTorrance.glsl --- opencascade-7.4.1+dfsg1/src/Shaders/PBRCookTorrance.glsl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/PBRCookTorrance.glsl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,20 @@ +//! Calculates Cook-Torrance BRDF. +vec3 occPBRCookTorrance (in vec3 theView, + in vec3 theLight, + in vec3 theNormal, + in vec3 theBaseColor, + in float theMetallic, + in float theRoughness, + in float theIOR) +{ + vec3 aHalf = normalize (theView + theLight); + float aCosV = max(dot(theView, theNormal), 0.0); + float aCosL = max(dot(theLight, theNormal), 0.0); + float aCosH = max(dot(aHalf, theNormal), 0.0); + float aCosVH = max(dot(aHalf, theView), 0.0); + vec3 aCookTorrance = occPBRDistribution (aCosH, theRoughness) + * occPBRGeometry (aCosV, aCosL, theRoughness) + * occPBRFresnel (theBaseColor, theMetallic, theIOR, aCosVH); + aCookTorrance /= 4.0; + return aCookTorrance; +} diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/PBRDistribution.glsl opencascade-7.5.1+dfsg1/src/Shaders/PBRDistribution.glsl --- opencascade-7.4.1+dfsg1/src/Shaders/PBRDistribution.glsl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/PBRDistribution.glsl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,9 @@ +//! Calculates micro facet normals distribution. +float occPBRDistribution (in float theCosH, + in float theRoughness) +{ + float aDistribution = theRoughness * theRoughness; + aDistribution = aDistribution / (theCosH * theCosH * (aDistribution * aDistribution - 1.0) + 1.0); + aDistribution = INV_PI * aDistribution * aDistribution; + return aDistribution; +} diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/PBREnvBaking.fs opencascade-7.5.1+dfsg1/src/Shaders/PBREnvBaking.fs --- opencascade-7.4.1+dfsg1/src/Shaders/PBREnvBaking.fs 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/PBREnvBaking.fs 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,162 @@ +THE_SHADER_IN vec3 ViewDirection; //!< direction of fetching from environment cubemap + +uniform int uSamplesNum; //!< number of samples in Monte-Carlo integration +uniform int uCurrentLevel; //!< current level of specular IBL map (ignored in case of diffuse map's processing) +uniform int uEnvMapSize; //!< one edge's size of source environtment map's zero mipmap level +uniform int uYCoeff; //!< coefficient of Y controlling horizontal flip of cubemap +uniform int uZCoeff; //!< coefficient of Z controlling vertical flip of cubemap +uniform samplerCube uEnvMap; //!< source of baking (environment cubemap) + +//! Returns coordinates of point theNumber from Hammersley point set having size theSize. +vec2 hammersley (in int theNumber, + in int theSize) +{ + int aDenominator = 2; + int aNumber = theNumber; + float aVanDerCorput = 0.0; + for (int i = 0; i < 32; ++i) + { + if (aNumber > 0) + { + aVanDerCorput += float(aNumber % 2) / float(aDenominator); + aNumber /= 2; + aDenominator *= 2; + } + } + return vec2(float(theNumber) / float(theSize), aVanDerCorput); +} + +//! This function does importance sampling on hemisphere surface using GGX normal distribution function +//! in tangent space (positive z axis is surface normal direction). +vec3 importanceSample (in vec2 theHammersleyPoint, + in float theRoughness) +{ + float aPhi = PI_2 * theHammersleyPoint.x; + theRoughness *= theRoughness; + theRoughness *= theRoughness; + float aCosTheta = sqrt((1.0 - theHammersleyPoint.y) / (1.0 + (theRoughness - 1.0) * theHammersleyPoint.y)); + float aSinTheta = sqrt(1.0 - aCosTheta * aCosTheta); + return vec3(aSinTheta * cos(aPhi), + aSinTheta * sin(aPhi), + aCosTheta); +} + +//! This function uniformly generates samples on whole sphere. +vec3 sphereUniformSample (in vec2 theHammersleyPoint) +{ + float aPhi = PI_2 * theHammersleyPoint.x; + float aCosTheta = 2.0 * theHammersleyPoint.y - 1.0; + float aSinTheta = sqrt(1.0 - aCosTheta * aCosTheta); + return vec3(aSinTheta * cos(aPhi), + aSinTheta * sin(aPhi), + aCosTheta); +} + +//! Transforms resulted sampled direction from tangent space to world space considering the surface normal. +vec3 fromTangentSpace (in vec3 theVector, + in vec3 theNormal) +{ + vec3 anUp = (abs(theNormal.z) < 0.999) ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); + vec3 anX = normalize(cross(anUp, theNormal)); + vec3 anY = cross(theNormal, anX); + return anX * theVector.x + anY * theVector.y + theNormal * theVector.z; +} + +const float aSHBasisFuncCoeffs[9] = float[9] +( + 0.282095 * 0.282095, + 0.488603 * 0.488603, + 0.488603 * 0.488603, + 0.488603 * 0.488603, + 1.092548 * 1.092548, + 1.092548 * 1.092548, + 1.092548 * 1.092548, + 0.315392 * 0.315392, + 0.546274 * 0.546274 +); + +const float aSHCosCoeffs[9] = float[9] +( + 3.141593, + 2.094395, + 2.094395, + 2.094395, + 0.785398, + 0.785398, + 0.785398, + 0.785398, + 0.785398 +); + +//! Bakes diffuse IBL map's spherical harmonics coefficients. +vec3 bakeDiffuseSH() +{ + int anIndex = int(gl_FragCoord.x); + vec3 aResult = vec3 (0.0); + for (int aSampleIter = 0; aSampleIter < uSamplesNum; ++aSampleIter) + { + vec2 aHammersleyPoint = hammersley (aSampleIter, uSamplesNum); + vec3 aDirection = sphereUniformSample (aHammersleyPoint); + + vec3 aValue = occTextureCube (uEnvMap, cubemapVectorTransform (aDirection, uYCoeff, uZCoeff)).rgb; + + float aBasisFunc[9]; + aBasisFunc[0] = 1.0; + + aBasisFunc[1] = aDirection.x; + aBasisFunc[2] = aDirection.y; + aBasisFunc[3] = aDirection.z; + + aBasisFunc[4] = aDirection.x * aDirection.z; + aBasisFunc[5] = aDirection.y * aDirection.z; + aBasisFunc[6] = aDirection.x * aDirection.y; + + aBasisFunc[7] = 3.0 * aDirection.z * aDirection.z - 1.0; + aBasisFunc[8] = aDirection.x * aDirection.x - aDirection.y * aDirection.y; + + aResult += aValue * aBasisFunc[anIndex]; + } + + aResult *= 4.0 * aSHCosCoeffs[anIndex] * aSHBasisFuncCoeffs[anIndex] / float(uSamplesNum); + return aResult; +} + +//! Bakes specular IBL map. +vec3 bakeSpecularMap (in vec3 theNormal, + in float theRoughness) +{ + vec3 aResult = vec3(0.0); + float aWeightSum = 0.0; + int aSamplesNum = (theRoughness == 0.0) ? 1 : uSamplesNum; + float aSolidAngleSource = 4.0 * PI / (6.0 * float(uEnvMapSize * uEnvMapSize)); + for (int aSampleIter = 0; aSampleIter < aSamplesNum; ++aSampleIter) + { + vec2 aHammersleyPoint = hammersley (aSampleIter, aSamplesNum); + vec3 aHalf = importanceSample (aHammersleyPoint, occRoughness (theRoughness)); + float aHdotV = aHalf.z; + aHalf = fromTangentSpace (aHalf, theNormal); + vec3 aLight = -reflect (theNormal, aHalf); + float aNdotL = dot (aLight, theNormal); + if (aNdotL > 0.0) + { + float aSolidAngleSample = 1.0 / (float(aSamplesNum) * (occPBRDistribution (aHdotV, theRoughness) * 0.25 + 0.0001) + 0.0001); + float aLod = (theRoughness == 0.0) ? 0.0 : 0.5 * log2 (aSolidAngleSample / aSolidAngleSource); + aResult += occTextureCubeLod (uEnvMap, aLight, aLod).rgb * aNdotL; + aWeightSum += aNdotL; + } + } + return aResult / aWeightSum; +} + +void main() +{ + vec3 aViewDirection = normalize (ViewDirection); + if (occNbSpecIBLLevels == 0) + { + occSetFragColor (vec4 (bakeDiffuseSH (), 1.0)); + } + else + { + occSetFragColor (vec4 (bakeSpecularMap (aViewDirection, float(uCurrentLevel) / float(occNbSpecIBLLevels - 1)), 1.0)); + } +} diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/PBREnvBaking.vs opencascade-7.5.1+dfsg1/src/Shaders/PBREnvBaking.vs --- opencascade-7.4.1+dfsg1/src/Shaders/PBREnvBaking.vs 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/PBREnvBaking.vs 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,35 @@ +THE_SHADER_OUT vec3 ViewDirection; //!< direction of fetching from environment cubemap + +uniform int uCurrentSide; //!< current side of cubemap +uniform int uYCoeff; //!< coefficient of Y controlling horizontal flip of cubemap +uniform int uZCoeff; //!< coefficient of Z controlling vertical flip of cubemap + +const mat2 cubemapDirectionMatrices[6] = mat2[] +( + mat2 ( 0, -1, -1, 0), + mat2 ( 0, 1, -1, 0), + mat2 ( 0, 1, 1, 0), + mat2 ( 0, 1, -1, 0), + mat2 ( 1, 0, 0, -1), + mat2 (-1, 0, 0, -1) +); + +//! Generates environment map fetching direction considering current index of side. +vec3 cubemapBakingViewDirection (in int theSide, + in vec2 theScreenCoord) +{ + int anAxis = theSide / 2; + vec3 aDirection = vec3(0.0); + aDirection[anAxis] = float(-(int(theSide) % 2) * 2 + 1); + theScreenCoord = cubemapDirectionMatrices[theSide] * theScreenCoord; + aDirection[(anAxis + 1) % 3] = theScreenCoord.x; + aDirection[(anAxis + 2) % 3] = theScreenCoord.y; + return aDirection; +} + +void main() +{ + ViewDirection = cubemapBakingViewDirection (uCurrentSide, occVertex.xy); + ViewDirection = cubemapVectorTransform (ViewDirection, uYCoeff, uZCoeff); + gl_Position = vec4 (occVertex.xy, 0.0, 1.0); +} diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/PBRFresnel.glsl opencascade-7.5.1+dfsg1/src/Shaders/PBRFresnel.glsl --- opencascade-7.4.1+dfsg1/src/Shaders/PBRFresnel.glsl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/PBRFresnel.glsl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,36 @@ +//! Functions to calculate fresnel coefficient and approximate zero fresnel value. +vec3 occPBRFresnel (in vec3 theBaseColor, + in float theMetallic, + in float theIOR) +{ + theIOR = (1.0 - theIOR) / (1.0 + theIOR); + theIOR *= theIOR; + vec3 f0 = vec3(theIOR); + f0 = mix (f0, theBaseColor.rgb, theMetallic); + return f0; +} + +vec3 occPBRFresnel (in vec3 theBaseColor, + in float theMetallic, + in float theIOR, + in float theCosVH) +{ + vec3 f0 = occPBRFresnel (theBaseColor, theMetallic, theIOR); + theCosVH = 1.0 - theCosVH; + theCosVH *= theCosVH; + theCosVH *= theCosVH * theCosVH * theCosVH * theCosVH; + return f0 + (vec3 (1.0) - f0) * theCosVH; +} + +vec3 occPBRFresnel (in vec3 theBaseColor, + in float theMetallic, + in float theRoughness, + in float theIOR, + in float theCosV) +{ + vec3 f0 = occPBRFresnel (theBaseColor, theMetallic, theIOR); + theCosV = 1.0 - theCosV; + theCosV *= theCosV; + theCosV *= theCosV * theCosV * theCosV * theCosV; + return f0 + (max(vec3(1.0 - theRoughness), f0) - f0) * theCosV; +} diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/PBRGeometry.glsl opencascade-7.5.1+dfsg1/src/Shaders/PBRGeometry.glsl --- opencascade-7.4.1+dfsg1/src/Shaders/PBRGeometry.glsl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/PBRGeometry.glsl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,13 @@ +//! Calculates geometry factor for Cook-Torrance BRDF. +float occPBRGeometry (in float theCosV, + in float theCosL, + in float theRoughness) +{ + float k = theRoughness + 1.0; + k *= 0.125 * k; + float g1 = 1.0; + g1 /= theCosV * (1.0 - k) + k; + float g2 = 1.0; + g2 /= theCosL * (1.0 - k) + k; + return g1 * g2; +} diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/PBRIllumination.glsl opencascade-7.5.1+dfsg1/src/Shaders/PBRIllumination.glsl --- opencascade-7.4.1+dfsg1/src/Shaders/PBRIllumination.glsl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/PBRIllumination.glsl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,28 @@ +//! Calculates direct illumination using Cook-Torrance BRDF. +vec3 occPBRIllumination (in vec3 theView, + in vec3 theLight, + in vec3 theNormal, + in vec4 theBaseColor, + in float theMetallic, + in float theRoughness, + in float theIOR, + in vec3 theLightColor, + in float theLightIntensity) +{ + vec3 aHalf = normalize (theView + theLight); + float aCosVH = max(dot(theView, aHalf), 0.0); + vec3 aFresnel = occPBRFresnel (theBaseColor.rgb, theMetallic, theIOR, aCosVH); + vec3 aSpecular = occPBRCookTorrance (theView, + theLight, + theNormal, + theBaseColor.rgb, + theMetallic, + theRoughness, + theIOR); + vec3 aDiffuse = vec3(1.0) - aFresnel; + aDiffuse *= 1.0 - theMetallic; + aDiffuse *= INV_PI; + aDiffuse *= theBaseColor.rgb; + aDiffuse = mix (vec3(0.0), aDiffuse, theBaseColor.a); + return (aDiffuse + aSpecular) * theLightColor * theLightIntensity * max(0.0, dot(theLight, theNormal)); +} diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/PhongShading.fs opencascade-7.5.1+dfsg1/src/Shaders/PhongShading.fs --- opencascade-7.4.1+dfsg1/src/Shaders/PhongShading.fs 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/PhongShading.fs 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,7 @@ in vec3 thePoint) { vec3 aLight = occLight_Position (theId).xyz; - if (occLight_IsHeadlight (theId) == 0) + if (!occLight_IsHeadlight (theId)) { aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 1.0)); } diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/PointLightAttenuation.glsl opencascade-7.5.1+dfsg1/src/Shaders/PointLightAttenuation.glsl --- opencascade-7.4.1+dfsg1/src/Shaders/PointLightAttenuation.glsl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/PointLightAttenuation.glsl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,35 @@ +//! Returns point light source attenuation factor +float occRangedPointLightAttenuation (in float theDistance, in float theRange) +{ + if (theDistance <= theRange) + { + float aResult = theDistance / theRange; + aResult *= aResult; + aResult *= aResult; + aResult = 1.0 - aResult; + aResult = clamp(aResult, 0.0, 1.0); + aResult /= max(0.0001, theDistance * theDistance); + return aResult; + } + return -1.0; +} + +//! Returns point light source attenuation factor with quadratic attenuation in case of zero range. +float occPointLightAttenuation (in float theDistance, in float theRange) +{ + if (theRange == 0.0) + { + return 1.0 / max(0.0001, theDistance * theDistance); + } + return occRangedPointLightAttenuation (theDistance, theRange); +} + +//! Returns point light source attenuation factor with linear attenuation in case of zero range. +float occPointLightAttenuation (in float theDistance, in float theRange, in float theLinearAttenuation, in float theConstAttenuation) +{ + if (theRange == 0.0) + { + return 1.0 / (theConstAttenuation + theLinearAttenuation * theDistance); + } + return occRangedPointLightAttenuation (theDistance, theRange); +} diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/RaytraceBase.fs opencascade-7.5.1+dfsg1/src/Shaders/RaytraceBase.fs --- opencascade-7.4.1+dfsg1/src/Shaders/RaytraceBase.fs 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/RaytraceBase.fs 2021-02-02 08:51:56.000000000 +0000 @@ -70,8 +70,18 @@ uniform samplerBuffer uRaytraceMaterialTexture; //! Texture buffer of light source properties. uniform samplerBuffer uRaytraceLightSrcTexture; -//! Environment map texture. -uniform sampler2D uEnvironmentMapTexture; + +#ifdef BACKGROUND_CUBEMAP + //! Environment cubemap texture. + uniform samplerCube uEnvMapTexture; + //! Coefficient of Y controlling horizontal flip of cubemap + uniform int uYCoeff; + //! Coefficient of Z controlling vertical flip of cubemap + uniform int uZCoeff; +#else + //! Environment map texture. + uniform sampler2D uEnvMapTexture; +#endif //! Total number of light sources. uniform int uLightCount; @@ -82,10 +92,10 @@ uniform int uShadowsEnabled; //! Enables/disables specular reflections. uniform int uReflectEnabled; -//! Enables/disables spherical environment map. -uniform int uSphereMapEnabled; +//! Enables/disables environment map lighting. +uniform int uEnvMapEnabled; //! Enables/disables environment map background. -uniform int uSphereMapForBack; +uniform int uEnvMapForBack; //! Radius of bounding sphere of the scene. uniform float uSceneRadius; @@ -160,6 +170,14 @@ vec3 Normal; }; +//! Stores triangle's vertex indexes and vertexes itself +struct STriangle +{ + ivec4 TriIndex; + + vec3 Points[3]; +}; + ///////////////////////////////////////////////////////////////////////////////////////// // Some useful constants @@ -452,7 +470,7 @@ #define TRG_OFFSET(treelet) treelet.SubData.w //! Identifies the absence of intersection. -#define INALID_HIT ivec4 (-1) +#define INVALID_HIT ivec4 (-1) //! Global stack shared between traversal functions. int Stack[STACK_SIZE]; @@ -488,9 +506,9 @@ // function : SceneNearestHit // purpose : Finds intersection with nearest scene triangle // ======================================================================= -ivec4 SceneNearestHit (in SRay theRay, in vec3 theInverse, inout SIntersect theHit, out int theTrsfId) +STriangle SceneNearestHit (in SRay theRay, in vec3 theInverse, inout SIntersect theHit, out int theTrsfId) { - ivec4 aTriIndex = INALID_HIT; + STriangle aTriangle = STriangle (INVALID_HIT, vec3[](vec3(0.0), vec3(0.0), vec3(0.0))); int aNode = 0; // node to traverse int aHead = -1; // pointer of stack @@ -597,17 +615,22 @@ for (int anIdx = aData.y; anIdx <= aData.z; ++anIdx) { - ivec4 aTriangle = texelFetch (uGeometryTriangTexture, anIdx + TRG_OFFSET (aSubTree)); + ivec4 aTriIndex = texelFetch (uGeometryTriangTexture, anIdx + TRG_OFFSET (aSubTree)); + vec3 aPoints[3]; - vec3 aPoint0 = texelFetch (uGeometryVertexTexture, aTriangle.x += VRT_OFFSET (aSubTree)).xyz; - vec3 aPoint1 = texelFetch (uGeometryVertexTexture, aTriangle.y += VRT_OFFSET (aSubTree)).xyz; - vec3 aPoint2 = texelFetch (uGeometryVertexTexture, aTriangle.z += VRT_OFFSET (aSubTree)).xyz; + aPoints[0] = texelFetch (uGeometryVertexTexture, aTriIndex.x += VRT_OFFSET (aSubTree)).xyz; + aPoints[1] = texelFetch (uGeometryVertexTexture, aTriIndex.y += VRT_OFFSET (aSubTree)).xyz; + aPoints[2] = texelFetch (uGeometryVertexTexture, aTriIndex.z += VRT_OFFSET (aSubTree)).xyz; - IntersectTriangle (aSubTree.TrsfRay, aPoint0, aPoint1, aPoint2, aTimeUV, aNormal); + IntersectTriangle (aSubTree.TrsfRay, aPoints[0], aPoints[1], aPoints[2], aTimeUV, aNormal); if (aTimeUV.x < theHit.Time) { - aTriIndex = aTriangle; + aTriangle.TriIndex = aTriIndex; + for (int i = 0; i < 3; ++i) + { + aTriangle.Points[i] = aPoints[i]; + } theTrsfId = TRS_OFFSET (aSubTree); @@ -654,7 +677,7 @@ } } - return aTriIndex; + return aTriangle; } // ======================================================================= @@ -848,6 +871,17 @@ aPsi * 0.3183098f); } +#ifdef BACKGROUND_CUBEMAP +//! Transform texture coordinates for cubemap lookup. +vec3 cubemapVectorTransform (in vec3 theVec, in float theRadius) +{ + vec3 aVec = theVec.yzx; + aVec.y *= float(uYCoeff); + aVec.z *= float(uZCoeff); + return aVec; +} +#endif + // ======================================================================= // function : SmoothNormal // purpose : Interpolates normal across the triangle @@ -893,15 +927,21 @@ // purpose : Interpolates UV coordinates across the triangle // ======================================================================= #ifdef USE_TEXTURES +vec2 SmoothUV (in vec2 theUV, in ivec4 theTriangle, out vec2[3] theUVs) +{ + theUVs[0] = texelFetch (uGeometryTexCrdTexture, theTriangle.x).st; + theUVs[1] = texelFetch (uGeometryTexCrdTexture, theTriangle.y).st; + theUVs[2] = texelFetch (uGeometryTexCrdTexture, theTriangle.z).st; + + return theUVs[1] * theUV.x + + theUVs[2] * theUV.y + + theUVs[0] * (1.0f - theUV.x - theUV.y); +} + vec2 SmoothUV (in vec2 theUV, in ivec4 theTriangle) { - vec2 aTexCrd0 = texelFetch (uGeometryTexCrdTexture, theTriangle.x).st; - vec2 aTexCrd1 = texelFetch (uGeometryTexCrdTexture, theTriangle.y).st; - vec2 aTexCrd2 = texelFetch (uGeometryTexCrdTexture, theTriangle.z).st; - - return aTexCrd1 * theUV.x + - aTexCrd2 * theUV.y + - aTexCrd0 * (1.0f - theUV.x - theUV.y); + vec2 aUVs[3]; + return SmoothUV (theUV, theTriangle, aUVs); } #endif @@ -909,10 +949,25 @@ // function : FetchEnvironment // purpose : // ======================================================================= -vec4 FetchEnvironment (in vec2 theTexCoord) +vec4 FetchEnvironment (in vec3 theTexCoord, in float theRadius, in bool theIsBackground) { - return uSphereMapEnabled == 0 ? - vec4 (0.f, 0.f, 0.f, 1.f) : textureLod (uEnvironmentMapTexture, theTexCoord, 0.f); + if (uEnvMapEnabled == 0) + { +#ifdef PATH_TRACING + return theIsBackground ? vec4 (0.0, 0.0, 0.0, 1.0) : uGlobalAmbient; +#else + return vec4 (0.0, 0.0, 0.0, 1.0); +#endif + } + + vec4 anAmbScale = theIsBackground ? vec4(1.0) : uGlobalAmbient; + vec4 anEnvColor = +#ifdef BACKGROUND_CUBEMAP + textureLod (uEnvMapTexture, cubemapVectorTransform (theTexCoord, theRadius), 0.0); +#else + textureLod (uEnvMapTexture, Latlong (theTexCoord, theRadius), 0.0); +#endif + return anEnvColor * anAmbScale; } // ======================================================================= @@ -968,23 +1023,42 @@ int aTrsfId; float aRaytraceDepth = MAXFLOAT; + float aRefractionIdx = 0.0; for (int aDepth = 0; aDepth < NB_BOUNCES; ++aDepth) { SIntersect aHit = SIntersect (MAXFLOAT, vec2 (ZERO), ZERO); - ivec4 aTriIndex = SceneNearestHit (theRay, theInverse, aHit, aTrsfId); + ivec4 aTriIndex = SceneNearestHit (theRay, theInverse, aHit, aTrsfId).TriIndex; if (aTriIndex.x == -1) { vec4 aColor = vec4 (0.0); - if (bool(uSphereMapForBack) || aWeight.w == 0.0f /* reflection */) + if (bool(uEnvMapForBack) || aWeight.w == 0.0 /* reflection */) { - float aTime = IntersectSphere (theRay, uSceneRadius); + float aRadius = uSceneRadius; + vec3 aTexCoord = vec3 (0.0); + + if (aDepth == 0 || (aRefractionIdx == 1.0 && aWeight.w != 0.0)) + { + vec2 aPixel = uEyeSize * (vPixel - vec2 (0.5)) * 2.0; + vec2 anAperturePnt = sampleUniformDisk() * uApertureRadius; + vec3 aLocalDir = normalize (vec3 (aPixel * uFocalPlaneDist - anAperturePnt, uFocalPlaneDist)); + vec3 aDirect = uEyeView * aLocalDir.z + + uEyeSide * aLocalDir.x + + uEyeVert * aLocalDir.y; + + aTexCoord = aDirect * uSceneRadius; + aRadius = length (aTexCoord); + } + else + { + float aTime = IntersectSphere (theRay, uSceneRadius); + aTexCoord = theRay.Direct * aTime + theRay.Origin; + } - aColor = FetchEnvironment (Latlong ( - theRay.Direct * aTime + theRay.Origin, uSceneRadius)); + aColor = FetchEnvironment (aTexCoord, aRadius, aWeight.w != 0.0); } else { @@ -1113,6 +1187,7 @@ if (aOpacity.x != 1.0f) { aWeight *= aOpacity.y; + aRefractionIdx = aOpacity.z; if (aOpacity.z != 1.0f) { diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_Declarations_glsl.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_Declarations_glsl.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_Declarations_glsl.pxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_Declarations_glsl.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ " #define occTexture1D texture\n" " #define occTexture2D texture\n" " #define occTexture3D texture\n" + " #define occTextureCube texture\n" + " #define occTextureCubeLod textureLod\n" "#else\n" " #define THE_ATTRIBUTE attribute\n" " #define THE_SHADER_IN varying\n" @@ -32,10 +34,16 @@ " #define occTexture1D texture1D\n" " #define occTexture2D texture2D\n" " #define occTexture3D texture3D\n" + " #define occTextureCube textureCube\n" + " #define occTextureCubeLod textureCubeLod\n" "#endif\n" "\n" "#ifdef GL_ES\n" - " #define THE_PREC_ENUM lowp // enumerations should fit into lowp range\n" + "#if (__VERSION__ >= 300)\n" + " #define THE_PREC_ENUM highp // lowp should be enough for enums but triggers driver bugs\n" + "#else\n" + " #define THE_PREC_ENUM lowp\n" + "#endif\n" "#else\n" " #define THE_PREC_ENUM\n" "#endif\n" @@ -88,6 +96,15 @@ " void occSetFragColor (in vec4 theColor);\n" "#endif\n" "\n" + "// Pi number definitions\n" + "#define PI 3.141592654\n" + "#define PI_2 6.283185307\n" + "#define PI_DIV_2 1.570796327\n" + "#define PI_DIV_3 1.047197551\n" + "#define PI_DIV_4 0.785398163\n" + "#define INV_PI 0.318309886\n" + "#define INV_PI_2 0.159154943\n" + "\n" "// Matrix state\n" "uniform mat4 occWorldViewMatrix; //!< World-view matrix\n" "uniform mat4 occProjectionMatrix; //!< Projection matrix\n" @@ -105,7 +122,16 @@ "uniform mat4 occProjectionMatrixInverseTranspose; //!< Transpose of the inverse of the projection matrix\n" "uniform mat4 occModelWorldMatrixInverseTranspose; //!< Transpose of the inverse of the model-world matrix\n" "\n" - "// light type enumeration\n" + "#if defined(THE_IS_PBR)\n" + "uniform sampler2D occEnvLUT; //!< Environment Lookup Table\n" + "uniform sampler2D occDiffIBLMapSHCoeffs; //!< Packed diffuse (irradiance) IBL map's spherical harmonics coefficients\n" + "uniform samplerCube occSpecIBLMap; //!< Specular IBL map\n" + "uniform int occNbSpecIBLLevels; //!< Number of mipmap levels used in occSpecIBLMap to store different roughness values maps\n" + "\n" + "vec3 occDiffIBLMap (in vec3 theNormal); //!< Unpacks spherical harmonics coefficients to diffuse IBL map's values\n" + "#endif\n" + "\n" + "// light type enumeration (same as Graphic3d_TypeOfLightSource)\n" "const int OccLightType_Direct = 1; //!< directional light source\n" "const int OccLightType_Point = 2; //!< isotropic point light source\n" "const int OccLightType_Spot = 3; //!< spot light source\n" @@ -114,40 +140,116 @@ "uniform vec4 occLightAmbient; //!< Cumulative ambient color\n" "#if defined(THE_MAX_LIGHTS) && (THE_MAX_LIGHTS > 0)\n" "uniform THE_PREC_ENUM int occLightSourcesCount; //!< Total number of light sources\n" - "int occLight_Type (in int theId); //!< Type of light source\n" - "int occLight_IsHeadlight (in int theId); //!< Is light a headlight?\n" - "vec4 occLight_Diffuse (in int theId); //!< Diffuse intensity for specified light source\n" - "vec4 occLight_Specular (in int theId); //!< Specular intensity (currently - equals to diffuse intencity)\n" - "vec4 occLight_Position (in int theId); //!< Position of specified light source\n" - "vec4 occLight_SpotDirection (in int theId); //!< Direction of specified spot light source\n" - "float occLight_ConstAttenuation (in int theId); //!< Const attenuation factor of positional light source\n" - "float occLight_LinearAttenuation (in int theId); //!< Linear attenuation factor of positional light source\n" - "float occLight_SpotCutOff (in int theId); //!< Maximum spread angle of the spot light (in radians)\n" - "float occLight_SpotExponent (in int theId); //!< Attenuation of the spot light intensity (from 0 to 1)\n" + "\n" + "//! Type of light source, int (see OccLightType enum).\n" + "#define occLight_Type(theId) occLightSourcesTypes[theId]\n" + "\n" + "//! Specular intensity (equals to diffuse), vec3.\n" + "#define occLight_Specular(theId) occLightSources[theId * 4 + 0].rgb\n" + "\n" + "//! Intensity of light source (>= 0), float.\n" + "#define occLight_Intensity(theId) occLightSources[theId * 4 + 0].a\n" + "\n" + "//! Is light a headlight, bool?\n" + "#define occLight_IsHeadlight(theId) (occLightSources[theId * 4 + 1].w > 0.5)\n" + "\n" + "//! Position of specified light source, vec3.\n" + "#define occLight_Position(theId) occLightSources[theId * 4 + 1].xyz\n" + "\n" + "//! Direction of specified spot light source, vec3.\n" + "#define occLight_SpotDirection(theId) occLightSources[theId * 4 + 2].xyz\n" + "\n" + "//! Range on which point light source (positional or spot) can affect (>= 0), float.\n" + "#define occLight_Range(theId) occLightSources[theId * 4 + 2].w\n" + "\n" + "//! Maximum spread angle of the spot light (in radians), float.\n" + "#define occLight_SpotCutOff(theId) occLightSources[theId * 4 + 3].z\n" + "\n" + "//! Attenuation of the spot light intensity (from 0 to 1), float.\n" + "#define occLight_SpotExponent(theId) occLightSources[theId * 4 + 3].w\n" + "\n" + "#if !defined(THE_IS_PBR)\n" + "//! Diffuse intensity (equals to Specular), vec3.\n" + "#define occLight_Diffuse(theId) occLightSources[theId * 4 + 0].rgb\n" + "\n" + "//! Const attenuation factor of positional light source, float.\n" + "#define occLight_ConstAttenuation(theId) occLightSources[theId * 4 + 3].x\n" + "\n" + "//! Linear attenuation factor of positional light source, float.\n" + "#define occLight_LinearAttenuation(theId) occLightSources[theId * 4 + 3].y\n" + "#endif\n" "#endif\n" "\n" + "#if defined(THE_IS_PBR)\n" + "//! Converts roughness value from range [0, 1] to real value for calculations\n" + "float occRoughness (in float theNormalizedRoughness);\n" + "\n" + "// Front/back material properties accessors\n" + "vec4 occPBRMaterial_Color(in bool theIsFront); //!< Base color of PBR material\n" + "float occPBRMaterial_Metallic(in bool theIsFront); //!< Metallic coefficient\n" + "float occPBRMaterial_NormalizedRoughness(in bool theIsFront); //!< Normalized roughness coefficient\n" + "vec3 occPBRMaterial_Emission(in bool theIsFront); //!< Light intensity emitted by material\n" + "float occPBRMaterial_IOR(in bool theIsFront); //!< Index of refraction\n" + "#else\n" "// Front material properties accessors\n" - "vec4 occFrontMaterial_Emission(void); //!< Emission color\n" - "vec4 occFrontMaterial_Ambient(void); //!< Ambient reflection\n" - "vec4 occFrontMaterial_Diffuse(void); //!< Diffuse reflection\n" - "vec4 occFrontMaterial_Specular(void); //!< Specular reflection\n" - "float occFrontMaterial_Shininess(void); //!< Specular exponent\n" - "float occFrontMaterial_Transparency(void); //!< Transparency coefficient\n" + "vec4 occFrontMaterial_Emission(void); //!< Emission color\n" + "vec4 occFrontMaterial_Ambient(void); //!< Ambient reflection\n" + "vec4 occFrontMaterial_Diffuse(void); //!< Diffuse reflection\n" + "vec4 occFrontMaterial_Specular(void); //!< Specular reflection\n" + "float occFrontMaterial_Shininess(void); //!< Specular exponent\n" + "float occFrontMaterial_Transparency(void); //!< Transparency coefficient\n" "\n" "// Back material properties accessors\n" - "vec4 occBackMaterial_Emission(void); //!< Emission color\n" - "vec4 occBackMaterial_Ambient(void); //!< Ambient reflection\n" - "vec4 occBackMaterial_Diffuse(void); //!< Diffuse reflection\n" - "vec4 occBackMaterial_Specular(void); //!< Specular reflection\n" - "float occBackMaterial_Shininess(void); //!< Specular exponent\n" - "float occBackMaterial_Transparency(void); //!< Transparency coefficient\n" + "vec4 occBackMaterial_Emission(void); //!< Emission color\n" + "vec4 occBackMaterial_Ambient(void); //!< Ambient reflection\n" + "vec4 occBackMaterial_Diffuse(void); //!< Diffuse reflection\n" + "vec4 occBackMaterial_Specular(void); //!< Specular reflection\n" + "float occBackMaterial_Shininess(void); //!< Specular exponent\n" + "float occBackMaterial_Transparency(void); //!< Transparency coefficient\n" + "#endif\n" "\n" "#ifdef THE_HAS_DEFAULT_SAMPLER\n" - "#define occActiveSampler occSampler0 //!< alias for backward compatibility\n" - "#define occSamplerBaseColor occSampler0 //!< alias to a base color texture\n" - "uniform sampler2D occSampler0; //!< current active sampler;\n" + "#define occActiveSampler occSampler0 //!< alias for backward compatibility\n" + "#define occSamplerBaseColor occSampler0 //!< alias to a base color texture\n" + "uniform sampler2D occSampler0; //!< current active sampler;\n" + "#endif //! occSampler1, occSampler2,... should be defined in GLSL program body for multitexturing\n" + "\n" + "#if defined(THE_HAS_TEXTURE_COLOR)\n" + "#define occTextureColor(theMatColor, theTexCoord) (theMatColor * occTexture2D(occSamplerBaseColor, theTexCoord))\n" + "#else\n" + "#define occTextureColor(theMatColor, theTexCoord) theMatColor\n" + "#endif\n" + "\n" + "#if defined(THE_HAS_TEXTURE_OCCLUSION) && defined(FRAGMENT_SHADER)\n" + "uniform sampler2D occSamplerOcclusion; //!< R occlusion texture sampler\n" + "#define occTextureOcclusion(theColor, theTexCoord) theColor *= occTexture2D(occSamplerOcclusion, theTexCoord).r;\n" + "#else\n" + "#define occTextureOcclusion(theColor, theTexCoord)\n" + "#endif\n" + "\n" + "#if defined(THE_HAS_TEXTURE_EMISSIVE) && defined(FRAGMENT_SHADER)\n" + "uniform sampler2D occSamplerEmissive; //!< RGB emissive texture sampler\n" + "#define occTextureEmissive(theMatEmis, theTexCoord) (theMatEmis * occTexture2D(occSamplerEmissive, theTexCoord).rgb)\n" + "#else\n" + "#define occTextureEmissive(theMatEmis, theTexCoord) theMatEmis\n" + "#endif\n" + "\n" + "#if defined(THE_HAS_TEXTURE_NORMAL) && defined(FRAGMENT_SHADER)\n" + "uniform sampler2D occSamplerNormal; //!< XYZ normal texture sampler with W==0 indicating no texture\n" + "#define occTextureNormal(theTexCoord) occTexture2D(occSamplerNormal, theTexCoord)\n" + "#else\n" + "#define occTextureNormal(theTexCoord) vec4(0.0) // no normal map\n" "#endif\n" - " //! occSampler1, occSampler2,... should be defined in GLSL program body for multitexturing\n" + "\n" + "#if defined(THE_HAS_TEXTURE_METALROUGHNESS) && defined(FRAGMENT_SHADER)\n" + "uniform sampler2D occSamplerMetallicRoughness; //!< BG metallic-roughness texture sampler\n" + "#define occTextureRoughness(theRoug, theTexCoord) (theRoug * occTexture2D(occSamplerMetallicRoughness, theTexCoord).g)\n" + "#define occTextureMetallic(theMet, theTexCoord) (theMet * occTexture2D(occSamplerMetallicRoughness, theTexCoord).b)\n" + "#else\n" + "#define occTextureRoughness(theRoug, theTexCoord) theRoug\n" + "#define occTextureMetallic(theMet, theTexCoord) theMet\n" + "#endif\n" + "\n" "uniform vec4 occColor; //!< color value (in case of disabled lighting)\n" "uniform THE_PREC_ENUM int occDistinguishingMode; //!< Are front and back faces distinguished?\n" "uniform THE_PREC_ENUM int occTextureEnable; //!< Is texture enabled?\n" diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_DeclarationsImpl_glsl.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_DeclarationsImpl_glsl.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_DeclarationsImpl_glsl.pxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_DeclarationsImpl_glsl.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,27 +22,49 @@ "\n" "#if defined(THE_MAX_LIGHTS) && (THE_MAX_LIGHTS > 0)\n" "// arrays of light sources\n" - "uniform THE_PREC_ENUM ivec2 occLightSourcesTypes[THE_MAX_LIGHTS]; //!< packed light sources types\n" - "uniform vec4 occLightSources[THE_MAX_LIGHTS * 4]; //!< packed light sources parameters\n" + "uniform vec4 occLightSources[THE_MAX_LIGHTS * 4]; //!< packed light sources parameters\n" + "uniform THE_PREC_ENUM int occLightSourcesTypes[THE_MAX_LIGHTS]; //!< packed light sources types\n" + "#endif\n" "\n" - "// light source properties accessors\n" - "int occLight_Type (in int theId) { return occLightSourcesTypes[theId].x; }\n" - "int occLight_IsHeadlight (in int theId) { return occLightSourcesTypes[theId].y; }\n" - "vec4 occLight_Diffuse (in int theId) { return occLightSources[theId * 4 + 0]; }\n" - "vec4 occLight_Specular (in int theId) { return occLightSources[theId * 4 + 0]; }\n" - "vec4 occLight_Position (in int theId) { return occLightSources[theId * 4 + 1]; }\n" - "vec4 occLight_SpotDirection (in int theId) { return occLightSources[theId * 4 + 2]; }\n" - "float occLight_ConstAttenuation (in int theId) { return occLightSources[theId * 4 + 3].x; }\n" - "float occLight_LinearAttenuation (in int theId) { return occLightSources[theId * 4 + 3].y; }\n" - "float occLight_SpotCutOff (in int theId) { return occLightSources[theId * 4 + 3].z; }\n" - "float occLight_SpotExponent (in int theId) { return occLightSources[theId * 4 + 3].w; }\n" + "#if defined(THE_IS_PBR)\n" + "vec3 occDiffIBLMap (in vec3 theNormal)\n" + "{\n" + " vec3 aSHCoeffs[9];\n" + " for (int i = 0; i < 9; ++i)\n" + " {\n" + " aSHCoeffs[i] = occTexture2D (occDiffIBLMapSHCoeffs, vec2 ((float(i) + 0.5) / 9.0, 0.0)).rgb;\n" + " }\n" + " return aSHCoeffs[0]\n" + "\n" + " + aSHCoeffs[1] * theNormal.x\n" + " + aSHCoeffs[2] * theNormal.y\n" + " + aSHCoeffs[3] * theNormal.z\n" + "\n" + " + aSHCoeffs[4] * theNormal.x * theNormal.z\n" + " + aSHCoeffs[5] * theNormal.y * theNormal.z\n" + " + aSHCoeffs[6] * theNormal.x * theNormal.y\n" + "\n" + " + aSHCoeffs[7] * (3.0 * theNormal.z * theNormal.z - 1.0)\n" + " + aSHCoeffs[8] * (theNormal.x * theNormal.x - theNormal.y * theNormal.y);\n" + "}\n" "#endif\n" "\n" - "// material state\n" + "// front and back material properties accessors\n" + "#if defined(THE_IS_PBR)\n" + "uniform vec4 occPbrFrontMaterial[3];\n" + "uniform vec4 occPbrBackMaterial[3];\n" + "\n" + "#define MIN_ROUGHNESS 0.01\n" + "float occRoughness (in float theNormalizedRoughness) { return theNormalizedRoughness * (1.0 - MIN_ROUGHNESS) + MIN_ROUGHNESS; }\n" + "vec4 occPBRMaterial_Color(in bool theIsFront) { return theIsFront ? occPbrFrontMaterial[0] : occPbrBackMaterial[0]; }\n" + "vec3 occPBRMaterial_Emission(in bool theIsFront) { return theIsFront ? occPbrFrontMaterial[1].rgb : occPbrBackMaterial[1].rgb; }\n" + "float occPBRMaterial_IOR(in bool theIsFront) { return theIsFront ? occPbrFrontMaterial[1].w : occPbrBackMaterial[1].w; }\n" + "float occPBRMaterial_Metallic(in bool theIsFront) { return theIsFront ? occPbrFrontMaterial[2].b : occPbrBackMaterial[2].b; }\n" + "float occPBRMaterial_NormalizedRoughness(in bool theIsFront) { return theIsFront ? occPbrFrontMaterial[2].g : occPbrBackMaterial[2].g; }\n" + "#else\n" "uniform vec4 occFrontMaterial[5];\n" "uniform vec4 occBackMaterial[5];\n" "\n" - "// front material properties accessors\n" "vec4 occFrontMaterial_Ambient(void) { return occFrontMaterial[0]; }\n" "vec4 occFrontMaterial_Diffuse(void) { return occFrontMaterial[1]; }\n" "vec4 occFrontMaterial_Specular(void) { return occFrontMaterial[2]; }\n" @@ -50,13 +72,13 @@ "float occFrontMaterial_Shininess(void) { return occFrontMaterial[4].x; }\n" "float occFrontMaterial_Transparency(void) { return occFrontMaterial[4].y; }\n" "\n" - "// back material properties accessors\n" "vec4 occBackMaterial_Ambient(void) { return occBackMaterial[0]; }\n" "vec4 occBackMaterial_Diffuse(void) { return occBackMaterial[1]; }\n" "vec4 occBackMaterial_Specular(void) { return occBackMaterial[2]; }\n" "vec4 occBackMaterial_Emission(void) { return occBackMaterial[3]; }\n" "float occBackMaterial_Shininess(void) { return occBackMaterial[4].x; }\n" "float occBackMaterial_Transparency(void) { return occBackMaterial[4].y; }\n" + "#endif\n" "\n" "// 2D texture coordinates transformation\n" "vec2 occTextureTrsf_Translation(void) { return occTexTrsf2d[0].xy; }\n" diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_Display_fs.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_Display_fs.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_Display_fs.pxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_Display_fs.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -147,8 +147,12 @@ " aColor = ToneMappingFilmic (aColor, uWhitePoint);\n" "#endif // TONE_MAPPING\n" "\n" + "#ifdef THE_SHIFT_sRGB\n" " // apply gamma correction (we use gamma = 2)\n" " OutColor = vec4 (sqrt (aColor.rgb), 0.f);\n" + "#else\n" + " OutColor = vec4 (aColor.rgb, 0.f);\n" + "#endif\n" "\n" "#else // not PATH_TRACING\n" "\n" diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PathtraceBase_fs.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PathtraceBase_fs.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PathtraceBase_fs.pxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PathtraceBase_fs.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,20 +37,20 @@ " //! Weight of coat specular/glossy BRDF.\n" " vec4 Kc;\n" "\n" - " //! Weight of base diffuse BRDF.\n" + " //! Weight of base diffuse BRDF + base color texture index in W.\n" " vec4 Kd;\n" "\n" " //! Weight of base specular/glossy BRDF.\n" " vec4 Ks;\n" "\n" - " //! Weight of base specular/glossy BTDF.\n" - " vec3 Kt;\n" + " //! Weight of base specular/glossy BTDF + metallic-roughness texture index in W.\n" + " vec4 Kt;\n" "\n" " //! Fresnel coefficients of coat layer.\n" " vec3 FresnelCoat;\n" "\n" - " //! Fresnel coefficients of base layer.\n" - " vec3 FresnelBase;\n" + " //! Fresnel coefficients of base layer + normal map texture index in W.\n" + " vec4 FresnelBase;\n" "};\n" "\n" "///////////////////////////////////////////////////////////////////////////////////////\n" @@ -325,7 +325,7 @@ "\n" " if (theBSDF.Ks.w > FLT_EPSILON)\n" " {\n" - " aBxDF += theBSDF.Ks.rgb * EvalBlinnReflection (theWi, theWo, theBSDF.FresnelBase, theBSDF.Ks.w);\n" + " aBxDF += theBSDF.Ks.rgb * EvalBlinnReflection (theWi, theWo, theBSDF.FresnelBase.rgb, theBSDF.Ks.w);\n" " }\n" "\n" " aBxDF *= UNIT - fresnelMedia (theWo.z, theBSDF.FresnelCoat);\n" @@ -549,7 +549,7 @@ "\n" " if (theBSDF.Ks.w < FLT_EPSILON)\n" " {\n" - " theWeight *= fresnelMedia (theWo.z, theBSDF.FresnelBase);\n" + " theWeight *= fresnelMedia (theWo.z, theBSDF.FresnelBase.rgb);\n" "\n" " theWi = vec3 (-theWo.x,\n" " -theWo.y,\n" @@ -557,7 +557,7 @@ " }\n" " else\n" " {\n" - " theWeight *= SampleGlossyBlinnReflection (theWo, theWi, theBSDF.FresnelBase, theBSDF.Ks.w, aPDF);\n" + " theWeight *= SampleGlossyBlinnReflection (theWo, theWi, theBSDF.FresnelBase.rgb, theBSDF.Ks.w, aPDF);\n" " }\n" "\n" " aPDF = mix (aPDF, MAXFLOAT, theBSDF.Ks.w < FLT_EPSILON);\n" @@ -583,20 +583,6 @@ "// Handlers and samplers for light sources\n" "//////////////////////////////////////////////////////////////////////////////////////////////\n" "\n" - "// =======================================================================\n" - "// function : Latlong\n" - "// purpose : Converts world direction to environment texture coordinates\n" - "// =======================================================================\n" - "vec2 Latlong (in vec3 thePoint)\n" - "{\n" - " float aPsi = acos (-thePoint.z);\n" - "\n" - " float aPhi = atan (thePoint.y, thePoint.x) + M_PI;\n" - "\n" - " return vec2 (aPhi * 0.1591549f,\n" - " aPsi * 0.3183098f);\n" - "}\n" - "\n" "//=======================================================================\n" "// function : SampleLight\n" "// purpose : General sampling function for directional and point lights\n" @@ -704,14 +690,34 @@ "\n" " if (thePDF == 0.f && theHitDistance == MAXFLOAT) // light source not found\n" " {\n" - " if (theDepth + uSphereMapForBack == 0) // view ray and map is hidden\n" + " if (theDepth + uEnvMapForBack == 0) // view ray and map is hidden\n" " {\n" - " aTotalRadiance = pow (BackgroundColor().rgb, vec3 (2.f));\n" + " aTotalRadiance = BackgroundColor().rgb;\n" " }\n" " else\n" " {\n" - " aTotalRadiance = pow (FetchEnvironment (Latlong (theRay.Direct)).rgb, vec3 (2.f));\n" - " }\n" + " #ifdef BACKGROUND_CUBEMAP\n" + " if (theDepth == 0)\n" + " {\n" + " vec2 aPixel = uEyeSize * (vPixel - vec2 (0.5)) * 2.0;\n" + " vec2 anAperturePnt = sampleUniformDisk() * uApertureRadius;\n" + " vec3 aLocalDir = normalize (vec3 (aPixel * uFocalPlaneDist - anAperturePnt, uFocalPlaneDist));\n" + " vec3 aDirect = uEyeView * aLocalDir.z +\n" + " uEyeSide * aLocalDir.x +\n" + " uEyeVert * aLocalDir.y;\n" + " aTotalRadiance = FetchEnvironment (aDirect, 1.0, true).rgb;\n" + " }\n" + " else\n" + " {\n" + " aTotalRadiance = FetchEnvironment (theRay.Direct, 1.0, false).rgb;\n" + " }\n" + " #else\n" + " aTotalRadiance = FetchEnvironment (theRay.Direct, 1.0, theDepth == 0).rgb;\n" + " #endif\n" + " }\n" + " #ifdef THE_SHIFT_sRGB\n" + " aTotalRadiance = pow (aTotalRadiance, vec3 (2.f));\n" + " #endif\n" " }\n" " \n" " return aTotalRadiance;\n" @@ -757,6 +763,23 @@ "}\n" "\n" "//=======================================================================\n" + "// function : NormalAdaptation\n" + "// purpose : Adapt smooth normal (which may be different from geometry normal) in order to avoid black areas in render\n" + "//=======================================================================\n" + "bool NormalAdaptation (in vec3 theView, in vec3 theGeometryNormal, inout vec3 theSmoothNormal)\n" + "{\n" + " float aMinCos = dot(theView, theGeometryNormal);\n" + " aMinCos = 0.5 * (sqrt(1.0 - aMinCos) + sqrt(1.0 + aMinCos));\n" + " float aCos = dot(theGeometryNormal, theSmoothNormal);\n" + " if (aCos < aMinCos)\n" + " {\n" + " theSmoothNormal = aMinCos * theGeometryNormal + normalize(theSmoothNormal - aCos * theGeometryNormal) * sqrt(1.0 - aMinCos * aMinCos);\n" + " return true;\n" + " }\n" + " return false;\n" + "}\n" + "\n" + "//=======================================================================\n" "// function : PathTrace\n" "// purpose : Calculates radiance along the given ray\n" "//=======================================================================\n" @@ -777,12 +800,12 @@ " {\n" " SIntersect aHit = SIntersect (MAXFLOAT, vec2 (ZERO), ZERO);\n" "\n" - " ivec4 aTriIndex = SceneNearestHit (theRay, theInverse, aHit, aTransfID);\n" + " STriangle aTriangle = SceneNearestHit (theRay, theInverse, aHit, aTransfID);\n" "\n" " // check implicit path\n" " vec3 aLe = IntersectLight (theRay, aDepth, aHit.Time, aExpPDF);\n" "\n" - " if (any (greaterThan (aLe, ZERO)) || aTriIndex.x == -1)\n" + " if (any (greaterThan (aLe, ZERO)) || aTriangle.TriIndex.x == -1)\n" " {\n" " float aMIS = (aDepth == 0 || aImpPDF == MAXFLOAT) ? 1.f :\n" " aImpPDF * aImpPDF / (aExpPDF * aExpPDF + aImpPDF * aImpPDF);\n" @@ -813,49 +836,79 @@ " SBSDF aBSDF;\n" "\n" " // fetch BxDF weights\n" - " aBSDF.Kc = texelFetch (uRaytraceMaterialTexture, MATERIAL_KC (aTriIndex.w));\n" - " aBSDF.Kd = texelFetch (uRaytraceMaterialTexture, MATERIAL_KD (aTriIndex.w));\n" - " aBSDF.Ks = texelFetch (uRaytraceMaterialTexture, MATERIAL_KS (aTriIndex.w));\n" - " aBSDF.Kt = texelFetch (uRaytraceMaterialTexture, MATERIAL_KT (aTriIndex.w)).rgb;\n" + " aBSDF.Kc = texelFetch (uRaytraceMaterialTexture, MATERIAL_KC (aTriangle.TriIndex.w));\n" + " aBSDF.Kd = texelFetch (uRaytraceMaterialTexture, MATERIAL_KD (aTriangle.TriIndex.w));\n" + " aBSDF.Ks = texelFetch (uRaytraceMaterialTexture, MATERIAL_KS (aTriangle.TriIndex.w));\n" + " aBSDF.Kt = texelFetch (uRaytraceMaterialTexture, MATERIAL_KT (aTriangle.TriIndex.w));\n" "\n" - " // compute smooth normal (in parallel with fetch)\n" - " vec3 aNormal = SmoothNormal (aHit.UV, aTriIndex);\n" + " // fetch Fresnel reflectance for both layers\n" + " aBSDF.FresnelCoat = texelFetch (uRaytraceMaterialTexture, MATERIAL_FRESNEL_COAT (aTriangle.TriIndex.w)).xyz;\n" + " aBSDF.FresnelBase = texelFetch (uRaytraceMaterialTexture, MATERIAL_FRESNEL_BASE (aTriangle.TriIndex.w));\n" "\n" + " vec4 anLE = texelFetch (uRaytraceMaterialTexture, MATERIAL_LE (aTriangle.TriIndex.w));\n" + "\n" + " // compute smooth normal (in parallel with fetch)\n" + " vec3 aNormal = SmoothNormal (aHit.UV, aTriangle.TriIndex);\n" " aNormal = normalize (vec3 (dot (aInvTransf0, aNormal),\n" " dot (aInvTransf1, aNormal),\n" " dot (aInvTransf2, aNormal)));\n" "\n" - " SLocalSpace aSpace = buildLocalSpace (aNormal);\n" - "\n" "#ifdef USE_TEXTURES\n" - " if (aBSDF.Kd.w >= 0.f)\n" + " if (aBSDF.Kd.w >= 0.0 || aBSDF.Kt.w >= 0.0 || aBSDF.FresnelBase.w >=0.0 || anLE.w >= 0.0)\n" " {\n" - " vec4 aTexCoord = vec4 (SmoothUV (aHit.UV, aTriIndex), 0.f, 1.f);\n" - "\n" - " vec4 aTrsfRow1 = texelFetch (\n" - " uRaytraceMaterialTexture, MATERIAL_TRS1 (aTriIndex.w));\n" - " vec4 aTrsfRow2 = texelFetch (\n" - " uRaytraceMaterialTexture, MATERIAL_TRS2 (aTriIndex.w));\n" - "\n" + " vec2 aUVs[3];\n" + " vec4 aTexCoord = vec4 (SmoothUV (aHit.UV, aTriangle.TriIndex, aUVs), 0.f, 1.f);\n" + " vec4 aTrsfRow1 = texelFetch (uRaytraceMaterialTexture, MATERIAL_TRS1 (aTriangle.TriIndex.w));\n" + " vec4 aTrsfRow2 = texelFetch (uRaytraceMaterialTexture, MATERIAL_TRS2 (aTriangle.TriIndex.w));\n" " aTexCoord.st = vec2 (dot (aTrsfRow1, aTexCoord),\n" " dot (aTrsfRow2, aTexCoord));\n" "\n" - " vec4 aTexColor = textureLod (\n" - " sampler2D (uTextureSamplers[int (aBSDF.Kd.w)]), aTexCoord.st, 0.f);\n" - "\n" - " aBSDF.Kd.rgb *= (aTexColor.rgb * aTexColor.rgb) * aTexColor.w; // de-gamma correction (for gamma = 2)\n" - "\n" - " if (aTexColor.w != 1.0f)\n" + " if (anLE.w >= 0.0)\n" " {\n" - " // mix transparency BTDF with texture alpha-channel\n" - " aBSDF.Kt = (UNIT - aTexColor.www) + aTexColor.w * aBSDF.Kt;\n" + " anLE.rgb *= textureLod (sampler2D (uTextureSamplers[int (anLE.w)]), aTexCoord.st, 0.0).rgb;\n" " }\n" + " if (aBSDF.Kt.w >= 0.0)\n" + " {\n" + " vec2 aTexMetRough = textureLod (sampler2D (uTextureSamplers[int (aBSDF.Kt.w)]), aTexCoord.st, 0.0).bg;\n" + " float aPbrMetal = aTexMetRough.x;\n" + " float aPbrRough2 = aTexMetRough.y * aTexMetRough.y;\n" + " aBSDF.Ks.a *= aPbrRough2;\n" + " // when using metal-roughness texture, global metalness of material (encoded in FresnelBase) is expected to be 1.0 so that Kd will be 0.0\n" + " aBSDF.Kd.rgb = aBSDF.FresnelBase.rgb * (1.0 - aPbrMetal);\n" + " aBSDF.FresnelBase.rgb *= aPbrMetal;\n" + " }\n" + " if (aBSDF.Kd.w >= 0.0)\n" + " {\n" + " vec4 aTexColor = textureLod (sampler2D (uTextureSamplers[int (aBSDF.Kd.w)]), aTexCoord.st, 0.0);\n" + " vec3 aDiff = aTexColor.rgb * aTexColor.a;\n" + " aBSDF.Kd.rgb *= aDiff;\n" + " aBSDF.FresnelBase.rgb *= aDiff;\n" + " if (aTexColor.a != 1.0)\n" + " {\n" + " // mix transparency BTDF with texture alpha-channel\n" + " aBSDF.Ks.rgb *= aTexColor.a;\n" + " aBSDF.Kt.rgb = (UNIT - aTexColor.aaa) + aTexColor.a * aBSDF.Kt.rgb;\n" + " }\n" + " }\n" + " #ifndef IGNORE_NORMAL_MAP\n" + " if (aBSDF.FresnelBase.w >= 0.0)\n" + " {\n" + " for (int i = 0 ; i < 3; ++i)\n" + " {\n" + " aUVs[i] = vec2 (dot (aTrsfRow1, vec4(aUVs[i], 0.0, 1.0)),\n" + " dot (aTrsfRow2, vec4(aUVs[i], 0.0, 1.0)));\n" + " }\n" + " vec3 aMapNormalValue = textureLod (sampler2D (uTextureSamplers[int (aBSDF.FresnelBase.w)]), aTexCoord.st, 0.0).xyz;\n" + " mat2 aDeltaUVMatrix = mat2 (aUVs[1] - aUVs[0], aUVs[1] - aUVs[2]);\n" + " mat2x3 aDeltaVectorMatrix = mat2x3 (aTriangle.Points[1] - aTriangle.Points[0], aTriangle.Points[1] - aTriangle.Points[2]);\n" + " aNormal = TangentSpaceNormal (aDeltaUVMatrix, aDeltaVectorMatrix, aMapNormalValue, aNormal, true);\n" + " }\n" + " #endif\n" " }\n" "#endif\n" - "\n" - " // fetch Fresnel reflectance for both layers\n" - " aBSDF.FresnelCoat = texelFetch (uRaytraceMaterialTexture, MATERIAL_FRESNEL_COAT (aTriIndex.w)).xyz;\n" - " aBSDF.FresnelBase = texelFetch (uRaytraceMaterialTexture, MATERIAL_FRESNEL_BASE (aTriIndex.w)).xyz;\n" + " NormalAdaptation (-theRay.Direct, aHit.Normal, aNormal);\n" + " aHit.Normal = aNormal;\n" + " SLocalSpace aSpace = buildLocalSpace (aNormal);\n" "\n" " if (uLightCount > 0 && IsNotZero (aBSDF, aThroughput))\n" " {\n" @@ -900,11 +953,11 @@ " }\n" "\n" " // account for self-emission\n" - " aRadiance += aThroughput * texelFetch (uRaytraceMaterialTexture, MATERIAL_LE (aTriIndex.w)).rgb;\n" + " aRadiance += aThroughput * anLE.rgb;\n" "\n" " if (aInMedium) // handle attenuation\n" " {\n" - " vec4 aScattering = texelFetch (uRaytraceMaterialTexture, MATERIAL_ABSORPT_BASE (aTriIndex.w));\n" + " vec4 aScattering = texelFetch (uRaytraceMaterialTexture, MATERIAL_ABSORPT_BASE (aTriangle.TriIndex.w));\n" "\n" " aThroughput *= exp (-aHit.Time * aScattering.w * (UNIT - aScattering.rgb));\n" " }\n" diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBRCookTorrance_glsl.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBRCookTorrance_glsl.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBRCookTorrance_glsl.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBRCookTorrance_glsl.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,23 @@ +// This file has been automatically generated from resource file src/Shaders/PBRCookTorrance.glsl + +static const char Shaders_PBRCookTorrance_glsl[] = + "//! Calculates Cook-Torrance BRDF.\n" + "vec3 occPBRCookTorrance (in vec3 theView,\n" + " in vec3 theLight,\n" + " in vec3 theNormal,\n" + " in vec3 theBaseColor,\n" + " in float theMetallic,\n" + " in float theRoughness,\n" + " in float theIOR)\n" + "{\n" + " vec3 aHalf = normalize (theView + theLight);\n" + " float aCosV = max(dot(theView, theNormal), 0.0);\n" + " float aCosL = max(dot(theLight, theNormal), 0.0);\n" + " float aCosH = max(dot(aHalf, theNormal), 0.0);\n" + " float aCosVH = max(dot(aHalf, theView), 0.0);\n" + " vec3 aCookTorrance = occPBRDistribution (aCosH, theRoughness)\n" + " * occPBRGeometry (aCosV, aCosL, theRoughness)\n" + " * occPBRFresnel (theBaseColor, theMetallic, theIOR, aCosVH);\n" + " aCookTorrance /= 4.0;\n" + " return aCookTorrance;\n" + "}\n"; diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBRDistribution_glsl.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBRDistribution_glsl.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBRDistribution_glsl.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBRDistribution_glsl.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,12 @@ +// This file has been automatically generated from resource file src/Shaders/PBRDistribution.glsl + +static const char Shaders_PBRDistribution_glsl[] = + "//! Calculates micro facet normals distribution.\n" + "float occPBRDistribution (in float theCosH,\n" + " in float theRoughness)\n" + "{\n" + " float aDistribution = theRoughness * theRoughness;\n" + " aDistribution = aDistribution / (theCosH * theCosH * (aDistribution * aDistribution - 1.0) + 1.0);\n" + " aDistribution = INV_PI * aDistribution * aDistribution;\n" + " return aDistribution;\n" + "}\n"; diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBREnvBaking_fs.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBREnvBaking_fs.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBREnvBaking_fs.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBREnvBaking_fs.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,165 @@ +// This file has been automatically generated from resource file src/Shaders/PBREnvBaking.fs + +static const char Shaders_PBREnvBaking_fs[] = + "THE_SHADER_IN vec3 ViewDirection; //!< direction of fetching from environment cubemap\n" + "\n" + "uniform int uSamplesNum; //!< number of samples in Monte-Carlo integration\n" + "uniform int uCurrentLevel; //!< current level of specular IBL map (ignored in case of diffuse map's processing)\n" + "uniform int uEnvMapSize; //!< one edge's size of source environtment map's zero mipmap level\n" + "uniform int uYCoeff; //!< coefficient of Y controlling horizontal flip of cubemap\n" + "uniform int uZCoeff; //!< coefficient of Z controlling vertical flip of cubemap\n" + "uniform samplerCube uEnvMap; //!< source of baking (environment cubemap)\n" + "\n" + "//! Returns coordinates of point theNumber from Hammersley point set having size theSize.\n" + "vec2 hammersley (in int theNumber,\n" + " in int theSize)\n" + "{\n" + " int aDenominator = 2;\n" + " int aNumber = theNumber;\n" + " float aVanDerCorput = 0.0;\n" + " for (int i = 0; i < 32; ++i)\n" + " {\n" + " if (aNumber > 0)\n" + " {\n" + " aVanDerCorput += float(aNumber % 2) / float(aDenominator);\n" + " aNumber /= 2;\n" + " aDenominator *= 2;\n" + " }\n" + " }\n" + " return vec2(float(theNumber) / float(theSize), aVanDerCorput);\n" + "}\n" + "\n" + "//! This function does importance sampling on hemisphere surface using GGX normal distribution function\n" + "//! in tangent space (positive z axis is surface normal direction).\n" + "vec3 importanceSample (in vec2 theHammersleyPoint,\n" + " in float theRoughness)\n" + "{\n" + " float aPhi = PI_2 * theHammersleyPoint.x;\n" + " theRoughness *= theRoughness;\n" + " theRoughness *= theRoughness;\n" + " float aCosTheta = sqrt((1.0 - theHammersleyPoint.y) / (1.0 + (theRoughness - 1.0) * theHammersleyPoint.y));\n" + " float aSinTheta = sqrt(1.0 - aCosTheta * aCosTheta);\n" + " return vec3(aSinTheta * cos(aPhi),\n" + " aSinTheta * sin(aPhi),\n" + " aCosTheta);\n" + "}\n" + "\n" + "//! This function uniformly generates samples on whole sphere.\n" + "vec3 sphereUniformSample (in vec2 theHammersleyPoint)\n" + "{\n" + " float aPhi = PI_2 * theHammersleyPoint.x;\n" + " float aCosTheta = 2.0 * theHammersleyPoint.y - 1.0;\n" + " float aSinTheta = sqrt(1.0 - aCosTheta * aCosTheta);\n" + " return vec3(aSinTheta * cos(aPhi),\n" + " aSinTheta * sin(aPhi),\n" + " aCosTheta);\n" + "}\n" + "\n" + "//! Transforms resulted sampled direction from tangent space to world space considering the surface normal.\n" + "vec3 fromTangentSpace (in vec3 theVector,\n" + " in vec3 theNormal)\n" + "{\n" + " vec3 anUp = (abs(theNormal.z) < 0.999) ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n" + " vec3 anX = normalize(cross(anUp, theNormal));\n" + " vec3 anY = cross(theNormal, anX);\n" + " return anX * theVector.x + anY * theVector.y + theNormal * theVector.z;\n" + "}\n" + "\n" + "const float aSHBasisFuncCoeffs[9] = float[9]\n" + "(\n" + " 0.282095 * 0.282095,\n" + " 0.488603 * 0.488603,\n" + " 0.488603 * 0.488603,\n" + " 0.488603 * 0.488603,\n" + " 1.092548 * 1.092548,\n" + " 1.092548 * 1.092548,\n" + " 1.092548 * 1.092548,\n" + " 0.315392 * 0.315392,\n" + " 0.546274 * 0.546274\n" + ");\n" + "\n" + "const float aSHCosCoeffs[9] = float[9]\n" + "(\n" + " 3.141593,\n" + " 2.094395,\n" + " 2.094395,\n" + " 2.094395,\n" + " 0.785398,\n" + " 0.785398,\n" + " 0.785398,\n" + " 0.785398,\n" + " 0.785398\n" + ");\n" + "\n" + "//! Bakes diffuse IBL map's spherical harmonics coefficients.\n" + "vec3 bakeDiffuseSH()\n" + "{\n" + " int anIndex = int(gl_FragCoord.x);\n" + " vec3 aResult = vec3 (0.0);\n" + " for (int aSampleIter = 0; aSampleIter < uSamplesNum; ++aSampleIter)\n" + " {\n" + " vec2 aHammersleyPoint = hammersley (aSampleIter, uSamplesNum);\n" + " vec3 aDirection = sphereUniformSample (aHammersleyPoint);\n" + "\n" + " vec3 aValue = occTextureCube (uEnvMap, cubemapVectorTransform (aDirection, uYCoeff, uZCoeff)).rgb;\n" + "\n" + " float aBasisFunc[9];\n" + " aBasisFunc[0] = 1.0;\n" + "\n" + " aBasisFunc[1] = aDirection.x;\n" + " aBasisFunc[2] = aDirection.y;\n" + " aBasisFunc[3] = aDirection.z;\n" + "\n" + " aBasisFunc[4] = aDirection.x * aDirection.z;\n" + " aBasisFunc[5] = aDirection.y * aDirection.z;\n" + " aBasisFunc[6] = aDirection.x * aDirection.y;\n" + "\n" + " aBasisFunc[7] = 3.0 * aDirection.z * aDirection.z - 1.0;\n" + " aBasisFunc[8] = aDirection.x * aDirection.x - aDirection.y * aDirection.y;\n" + "\n" + " aResult += aValue * aBasisFunc[anIndex];\n" + " }\n" + "\n" + " aResult *= 4.0 * aSHCosCoeffs[anIndex] * aSHBasisFuncCoeffs[anIndex] / float(uSamplesNum);\n" + " return aResult;\n" + "}\n" + "\n" + "//! Bakes specular IBL map.\n" + "vec3 bakeSpecularMap (in vec3 theNormal,\n" + " in float theRoughness)\n" + "{\n" + " vec3 aResult = vec3(0.0);\n" + " float aWeightSum = 0.0;\n" + " int aSamplesNum = (theRoughness == 0.0) ? 1 : uSamplesNum;\n" + " float aSolidAngleSource = 4.0 * PI / (6.0 * float(uEnvMapSize * uEnvMapSize));\n" + " for (int aSampleIter = 0; aSampleIter < aSamplesNum; ++aSampleIter)\n" + " {\n" + " vec2 aHammersleyPoint = hammersley (aSampleIter, aSamplesNum);\n" + " vec3 aHalf = importanceSample (aHammersleyPoint, occRoughness (theRoughness));\n" + " float aHdotV = aHalf.z;\n" + " aHalf = fromTangentSpace (aHalf, theNormal);\n" + " vec3 aLight = -reflect (theNormal, aHalf);\n" + " float aNdotL = dot (aLight, theNormal);\n" + " if (aNdotL > 0.0)\n" + " {\n" + " float aSolidAngleSample = 1.0 / (float(aSamplesNum) * (occPBRDistribution (aHdotV, theRoughness) * 0.25 + 0.0001) + 0.0001);\n" + " float aLod = (theRoughness == 0.0) ? 0.0 : 0.5 * log2 (aSolidAngleSample / aSolidAngleSource);\n" + " aResult += occTextureCubeLod (uEnvMap, aLight, aLod).rgb * aNdotL;\n" + " aWeightSum += aNdotL;\n" + " }\n" + " }\n" + " return aResult / aWeightSum;\n" + "}\n" + "\n" + "void main()\n" + "{\n" + " vec3 aViewDirection = normalize (ViewDirection);\n" + " if (occNbSpecIBLLevels == 0)\n" + " {\n" + " occSetFragColor (vec4 (bakeDiffuseSH (), 1.0));\n" + " }\n" + " else\n" + " {\n" + " occSetFragColor (vec4 (bakeSpecularMap (aViewDirection, float(uCurrentLevel) / float(occNbSpecIBLLevels - 1)), 1.0));\n" + " }\n" + "}\n"; diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBREnvBaking_vs.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBREnvBaking_vs.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBREnvBaking_vs.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBREnvBaking_vs.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,38 @@ +// This file has been automatically generated from resource file src/Shaders/PBREnvBaking.vs + +static const char Shaders_PBREnvBaking_vs[] = + "THE_SHADER_OUT vec3 ViewDirection; //!< direction of fetching from environment cubemap\n" + "\n" + "uniform int uCurrentSide; //!< current side of cubemap\n" + "uniform int uYCoeff; //!< coefficient of Y controlling horizontal flip of cubemap\n" + "uniform int uZCoeff; //!< coefficient of Z controlling vertical flip of cubemap\n" + "\n" + "const mat2 cubemapDirectionMatrices[6] = mat2[]\n" + "(\n" + " mat2 ( 0, -1, -1, 0),\n" + " mat2 ( 0, 1, -1, 0),\n" + " mat2 ( 0, 1, 1, 0),\n" + " mat2 ( 0, 1, -1, 0),\n" + " mat2 ( 1, 0, 0, -1),\n" + " mat2 (-1, 0, 0, -1)\n" + ");\n" + "\n" + "//! Generates environment map fetching direction considering current index of side.\n" + "vec3 cubemapBakingViewDirection (in int theSide,\n" + " in vec2 theScreenCoord)\n" + "{\n" + " int anAxis = theSide / 2;\n" + " vec3 aDirection = vec3(0.0);\n" + " aDirection[anAxis] = float(-(int(theSide) % 2) * 2 + 1);\n" + " theScreenCoord = cubemapDirectionMatrices[theSide] * theScreenCoord;\n" + " aDirection[(anAxis + 1) % 3] = theScreenCoord.x;\n" + " aDirection[(anAxis + 2) % 3] = theScreenCoord.y;\n" + " return aDirection;\n" + "}\n" + "\n" + "void main()\n" + "{\n" + " ViewDirection = cubemapBakingViewDirection (uCurrentSide, occVertex.xy);\n" + " ViewDirection = cubemapVectorTransform (ViewDirection, uYCoeff, uZCoeff);\n" + " gl_Position = vec4 (occVertex.xy, 0.0, 1.0);\n" + "}\n"; diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBRFresnel_glsl.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBRFresnel_glsl.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBRFresnel_glsl.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBRFresnel_glsl.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,39 @@ +// This file has been automatically generated from resource file src/Shaders/PBRFresnel.glsl + +static const char Shaders_PBRFresnel_glsl[] = + "//! Functions to calculate fresnel coefficient and approximate zero fresnel value.\n" + "vec3 occPBRFresnel (in vec3 theBaseColor,\n" + " in float theMetallic,\n" + " in float theIOR)\n" + "{\n" + " theIOR = (1.0 - theIOR) / (1.0 + theIOR);\n" + " theIOR *= theIOR;\n" + " vec3 f0 = vec3(theIOR);\n" + " f0 = mix (f0, theBaseColor.rgb, theMetallic);\n" + " return f0;\n" + "}\n" + "\n" + "vec3 occPBRFresnel (in vec3 theBaseColor,\n" + " in float theMetallic,\n" + " in float theIOR,\n" + " in float theCosVH)\n" + "{\n" + " vec3 f0 = occPBRFresnel (theBaseColor, theMetallic, theIOR);\n" + " theCosVH = 1.0 - theCosVH;\n" + " theCosVH *= theCosVH;\n" + " theCosVH *= theCosVH * theCosVH * theCosVH * theCosVH;\n" + " return f0 + (vec3 (1.0) - f0) * theCosVH;\n" + "}\n" + "\n" + "vec3 occPBRFresnel (in vec3 theBaseColor,\n" + " in float theMetallic,\n" + " in float theRoughness,\n" + " in float theIOR,\n" + " in float theCosV)\n" + "{\n" + " vec3 f0 = occPBRFresnel (theBaseColor, theMetallic, theIOR);\n" + " theCosV = 1.0 - theCosV;\n" + " theCosV *= theCosV;\n" + " theCosV *= theCosV * theCosV * theCosV * theCosV;\n" + " return f0 + (max(vec3(1.0 - theRoughness), f0) - f0) * theCosV;\n" + "}\n"; diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBRGeometry_glsl.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBRGeometry_glsl.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBRGeometry_glsl.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBRGeometry_glsl.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,16 @@ +// This file has been automatically generated from resource file src/Shaders/PBRGeometry.glsl + +static const char Shaders_PBRGeometry_glsl[] = + "//! Calculates geometry factor for Cook-Torrance BRDF.\n" + "float occPBRGeometry (in float theCosV,\n" + " in float theCosL,\n" + " in float theRoughness)\n" + "{\n" + " float k = theRoughness + 1.0;\n" + " k *= 0.125 * k;\n" + " float g1 = 1.0;\n" + " g1 /= theCosV * (1.0 - k) + k;\n" + " float g2 = 1.0;\n" + " g2 /= theCosL * (1.0 - k) + k;\n" + " return g1 * g2;\n" + "}\n"; diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBRIllumination_glsl.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBRIllumination_glsl.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PBRIllumination_glsl.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PBRIllumination_glsl.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,31 @@ +// This file has been automatically generated from resource file src/Shaders/PBRIllumination.glsl + +static const char Shaders_PBRIllumination_glsl[] = + "//! Calculates direct illumination using Cook-Torrance BRDF.\n" + "vec3 occPBRIllumination (in vec3 theView,\n" + " in vec3 theLight,\n" + " in vec3 theNormal,\n" + " in vec4 theBaseColor,\n" + " in float theMetallic,\n" + " in float theRoughness,\n" + " in float theIOR,\n" + " in vec3 theLightColor,\n" + " in float theLightIntensity)\n" + "{\n" + " vec3 aHalf = normalize (theView + theLight);\n" + " float aCosVH = max(dot(theView, aHalf), 0.0);\n" + " vec3 aFresnel = occPBRFresnel (theBaseColor.rgb, theMetallic, theIOR, aCosVH);\n" + " vec3 aSpecular = occPBRCookTorrance (theView,\n" + " theLight,\n" + " theNormal,\n" + " theBaseColor.rgb,\n" + " theMetallic,\n" + " theRoughness,\n" + " theIOR);\n" + " vec3 aDiffuse = vec3(1.0) - aFresnel;\n" + " aDiffuse *= 1.0 - theMetallic;\n" + " aDiffuse *= INV_PI;\n" + " aDiffuse *= theBaseColor.rgb;\n" + " aDiffuse = mix (vec3(0.0), aDiffuse, theBaseColor.a);\n" + " return (aDiffuse + aSpecular) * theLightColor * theLightIntensity * max(0.0, dot(theLight, theNormal));\n" + "}\n"; diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PointLightAttenuation_glsl.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PointLightAttenuation_glsl.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_PointLightAttenuation_glsl.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_PointLightAttenuation_glsl.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,38 @@ +// This file has been automatically generated from resource file src/Shaders/PointLightAttenuation.glsl + +static const char Shaders_PointLightAttenuation_glsl[] = + "//! Returns point light source attenuation factor\n" + "float occRangedPointLightAttenuation (in float theDistance, in float theRange)\n" + "{\n" + " if (theDistance <= theRange)\n" + " {\n" + " float aResult = theDistance / theRange;\n" + " aResult *= aResult;\n" + " aResult *= aResult;\n" + " aResult = 1.0 - aResult;\n" + " aResult = clamp(aResult, 0.0, 1.0);\n" + " aResult /= max(0.0001, theDistance * theDistance);\n" + " return aResult;\n" + " }\n" + " return -1.0;\n" + "}\n" + "\n" + "//! Returns point light source attenuation factor with quadratic attenuation in case of zero range.\n" + "float occPointLightAttenuation (in float theDistance, in float theRange)\n" + "{\n" + " if (theRange == 0.0)\n" + " {\n" + " return 1.0 / max(0.0001, theDistance * theDistance);\n" + " }\n" + " return occRangedPointLightAttenuation (theDistance, theRange);\n" + "}\n" + "\n" + "//! Returns point light source attenuation factor with linear attenuation in case of zero range.\n" + "float occPointLightAttenuation (in float theDistance, in float theRange, in float theLinearAttenuation, in float theConstAttenuation)\n" + "{\n" + " if (theRange == 0.0)\n" + " {\n" + " return 1.0 / (theConstAttenuation + theLinearAttenuation * theDistance);\n" + " }\n" + " return occRangedPointLightAttenuation (theDistance, theRange);\n" + "}\n"; diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_RaytraceBase_fs.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_RaytraceBase_fs.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_RaytraceBase_fs.pxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_RaytraceBase_fs.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -73,8 +73,18 @@ "uniform samplerBuffer uRaytraceMaterialTexture;\n" "//! Texture buffer of light source properties.\n" "uniform samplerBuffer uRaytraceLightSrcTexture;\n" - "//! Environment map texture.\n" - "uniform sampler2D uEnvironmentMapTexture;\n" + "\n" + "#ifdef BACKGROUND_CUBEMAP\n" + " //! Environment cubemap texture.\n" + " uniform samplerCube uEnvMapTexture;\n" + " //! Coefficient of Y controlling horizontal flip of cubemap\n" + " uniform int uYCoeff;\n" + " //! Coefficient of Z controlling vertical flip of cubemap\n" + " uniform int uZCoeff;\n" + "#else\n" + " //! Environment map texture.\n" + " uniform sampler2D uEnvMapTexture;\n" + "#endif\n" "\n" "//! Total number of light sources.\n" "uniform int uLightCount;\n" @@ -85,10 +95,10 @@ "uniform int uShadowsEnabled;\n" "//! Enables/disables specular reflections.\n" "uniform int uReflectEnabled;\n" - "//! Enables/disables spherical environment map.\n" - "uniform int uSphereMapEnabled;\n" + "//! Enables/disables environment map lighting.\n" + "uniform int uEnvMapEnabled;\n" "//! Enables/disables environment map background.\n" - "uniform int uSphereMapForBack;\n" + "uniform int uEnvMapForBack;\n" "\n" "//! Radius of bounding sphere of the scene.\n" "uniform float uSceneRadius;\n" @@ -163,6 +173,14 @@ " vec3 Normal;\n" "};\n" "\n" + "//! Stores triangle's vertex indexes and vertexes itself\n" + "struct STriangle\n" + "{\n" + " ivec4 TriIndex;\n" + "\n" + " vec3 Points[3];\n" + "};\n" + "\n" "/////////////////////////////////////////////////////////////////////////////////////////\n" "// Some useful constants\n" "\n" @@ -455,7 +473,7 @@ "#define TRG_OFFSET(treelet) treelet.SubData.w\n" "\n" "//! Identifies the absence of intersection.\n" - "#define INALID_HIT ivec4 (-1)\n" + "#define INVALID_HIT ivec4 (-1)\n" "\n" "//! Global stack shared between traversal functions.\n" "int Stack[STACK_SIZE];\n" @@ -491,9 +509,9 @@ "// function : SceneNearestHit\n" "// purpose : Finds intersection with nearest scene triangle\n" "// =======================================================================\n" - "ivec4 SceneNearestHit (in SRay theRay, in vec3 theInverse, inout SIntersect theHit, out int theTrsfId)\n" + "STriangle SceneNearestHit (in SRay theRay, in vec3 theInverse, inout SIntersect theHit, out int theTrsfId)\n" "{\n" - " ivec4 aTriIndex = INALID_HIT;\n" + " STriangle aTriangle = STriangle (INVALID_HIT, vec3[](vec3(0.0), vec3(0.0), vec3(0.0)));\n" "\n" " int aNode = 0; // node to traverse\n" " int aHead = -1; // pointer of stack\n" @@ -600,17 +618,22 @@ "\n" " for (int anIdx = aData.y; anIdx <= aData.z; ++anIdx)\n" " {\n" - " ivec4 aTriangle = texelFetch (uGeometryTriangTexture, anIdx + TRG_OFFSET (aSubTree));\n" + " ivec4 aTriIndex = texelFetch (uGeometryTriangTexture, anIdx + TRG_OFFSET (aSubTree));\n" + " vec3 aPoints[3];\n" "\n" - " vec3 aPoint0 = texelFetch (uGeometryVertexTexture, aTriangle.x += VRT_OFFSET (aSubTree)).xyz;\n" - " vec3 aPoint1 = texelFetch (uGeometryVertexTexture, aTriangle.y += VRT_OFFSET (aSubTree)).xyz;\n" - " vec3 aPoint2 = texelFetch (uGeometryVertexTexture, aTriangle.z += VRT_OFFSET (aSubTree)).xyz;\n" + " aPoints[0] = texelFetch (uGeometryVertexTexture, aTriIndex.x += VRT_OFFSET (aSubTree)).xyz;\n" + " aPoints[1] = texelFetch (uGeometryVertexTexture, aTriIndex.y += VRT_OFFSET (aSubTree)).xyz;\n" + " aPoints[2] = texelFetch (uGeometryVertexTexture, aTriIndex.z += VRT_OFFSET (aSubTree)).xyz;\n" "\n" - " IntersectTriangle (aSubTree.TrsfRay, aPoint0, aPoint1, aPoint2, aTimeUV, aNormal);\n" + " IntersectTriangle (aSubTree.TrsfRay, aPoints[0], aPoints[1], aPoints[2], aTimeUV, aNormal);\n" "\n" " if (aTimeUV.x < theHit.Time)\n" " {\n" - " aTriIndex = aTriangle;\n" + " aTriangle.TriIndex = aTriIndex;\n" + " for (int i = 0; i < 3; ++i)\n" + " {\n" + " aTriangle.Points[i] = aPoints[i];\n" + " }\n" "\n" " theTrsfId = TRS_OFFSET (aSubTree);\n" "\n" @@ -657,7 +680,7 @@ " }\n" " }\n" "\n" - " return aTriIndex;\n" + " return aTriangle;\n" "}\n" "\n" "// =======================================================================\n" @@ -851,6 +874,17 @@ " aPsi * 0.3183098f);\n" "}\n" "\n" + "#ifdef BACKGROUND_CUBEMAP\n" + "//! Transform texture coordinates for cubemap lookup.\n" + "vec3 cubemapVectorTransform (in vec3 theVec, in float theRadius)\n" + "{\n" + " vec3 aVec = theVec.yzx;\n" + " aVec.y *= float(uYCoeff);\n" + " aVec.z *= float(uZCoeff);\n" + " return aVec;\n" + "}\n" + "#endif\n" + "\n" "// =======================================================================\n" "// function : SmoothNormal\n" "// purpose : Interpolates normal across the triangle\n" @@ -896,15 +930,21 @@ "// purpose : Interpolates UV coordinates across the triangle\n" "// =======================================================================\n" "#ifdef USE_TEXTURES\n" + "vec2 SmoothUV (in vec2 theUV, in ivec4 theTriangle, out vec2[3] theUVs)\n" + "{\n" + " theUVs[0] = texelFetch (uGeometryTexCrdTexture, theTriangle.x).st;\n" + " theUVs[1] = texelFetch (uGeometryTexCrdTexture, theTriangle.y).st;\n" + " theUVs[2] = texelFetch (uGeometryTexCrdTexture, theTriangle.z).st;\n" + "\n" + " return theUVs[1] * theUV.x +\n" + " theUVs[2] * theUV.y +\n" + " theUVs[0] * (1.0f - theUV.x - theUV.y);\n" + "}\n" + "\n" "vec2 SmoothUV (in vec2 theUV, in ivec4 theTriangle)\n" "{\n" - " vec2 aTexCrd0 = texelFetch (uGeometryTexCrdTexture, theTriangle.x).st;\n" - " vec2 aTexCrd1 = texelFetch (uGeometryTexCrdTexture, theTriangle.y).st;\n" - " vec2 aTexCrd2 = texelFetch (uGeometryTexCrdTexture, theTriangle.z).st;\n" - "\n" - " return aTexCrd1 * theUV.x +\n" - " aTexCrd2 * theUV.y +\n" - " aTexCrd0 * (1.0f - theUV.x - theUV.y);\n" + " vec2 aUVs[3];\n" + " return SmoothUV (theUV, theTriangle, aUVs);\n" "}\n" "#endif\n" "\n" @@ -912,10 +952,25 @@ "// function : FetchEnvironment\n" "// purpose :\n" "// =======================================================================\n" - "vec4 FetchEnvironment (in vec2 theTexCoord)\n" + "vec4 FetchEnvironment (in vec3 theTexCoord, in float theRadius, in bool theIsBackground)\n" "{\n" - " return uSphereMapEnabled == 0 ?\n" - " vec4 (0.f, 0.f, 0.f, 1.f) : textureLod (uEnvironmentMapTexture, theTexCoord, 0.f);\n" + " if (uEnvMapEnabled == 0)\n" + " {\n" + "#ifdef PATH_TRACING\n" + " return theIsBackground ? vec4 (0.0, 0.0, 0.0, 1.0) : uGlobalAmbient;\n" + "#else\n" + " return vec4 (0.0, 0.0, 0.0, 1.0);\n" + "#endif\n" + " }\n" + "\n" + " vec4 anAmbScale = theIsBackground ? vec4(1.0) : uGlobalAmbient;\n" + " vec4 anEnvColor =\n" + "#ifdef BACKGROUND_CUBEMAP\n" + " textureLod (uEnvMapTexture, cubemapVectorTransform (theTexCoord, theRadius), 0.0);\n" + "#else\n" + " textureLod (uEnvMapTexture, Latlong (theTexCoord, theRadius), 0.0);\n" + "#endif\n" + " return anEnvColor * anAmbScale;\n" "}\n" "\n" "// =======================================================================\n" @@ -971,23 +1026,42 @@ " int aTrsfId;\n" "\n" " float aRaytraceDepth = MAXFLOAT;\n" + " float aRefractionIdx = 0.0;\n" "\n" " for (int aDepth = 0; aDepth < NB_BOUNCES; ++aDepth)\n" " {\n" " SIntersect aHit = SIntersect (MAXFLOAT, vec2 (ZERO), ZERO);\n" "\n" - " ivec4 aTriIndex = SceneNearestHit (theRay, theInverse, aHit, aTrsfId);\n" + " ivec4 aTriIndex = SceneNearestHit (theRay, theInverse, aHit, aTrsfId).TriIndex;\n" "\n" " if (aTriIndex.x == -1)\n" " {\n" " vec4 aColor = vec4 (0.0);\n" "\n" - " if (bool(uSphereMapForBack) || aWeight.w == 0.0f /* reflection */)\n" + " if (bool(uEnvMapForBack) || aWeight.w == 0.0 /* reflection */)\n" " {\n" - " float aTime = IntersectSphere (theRay, uSceneRadius);\n" + " float aRadius = uSceneRadius;\n" + " vec3 aTexCoord = vec3 (0.0);\n" + "\n" + " if (aDepth == 0 || (aRefractionIdx == 1.0 && aWeight.w != 0.0))\n" + " {\n" + " vec2 aPixel = uEyeSize * (vPixel - vec2 (0.5)) * 2.0;\n" + " vec2 anAperturePnt = sampleUniformDisk() * uApertureRadius;\n" + " vec3 aLocalDir = normalize (vec3 (aPixel * uFocalPlaneDist - anAperturePnt, uFocalPlaneDist));\n" + " vec3 aDirect = uEyeView * aLocalDir.z +\n" + " uEyeSide * aLocalDir.x +\n" + " uEyeVert * aLocalDir.y;\n" + " \n" + " aTexCoord = aDirect * uSceneRadius;\n" + " aRadius = length (aTexCoord);\n" + " }\n" + " else\n" + " {\n" + " float aTime = IntersectSphere (theRay, uSceneRadius);\n" + " aTexCoord = theRay.Direct * aTime + theRay.Origin;\n" + " }\n" "\n" - " aColor = FetchEnvironment (Latlong (\n" - " theRay.Direct * aTime + theRay.Origin, uSceneRadius));\n" + " aColor = FetchEnvironment (aTexCoord, aRadius, aWeight.w != 0.0);\n" " }\n" " else\n" " {\n" @@ -1116,6 +1190,7 @@ " if (aOpacity.x != 1.0f)\n" " {\n" " aWeight *= aOpacity.y;\n" + " aRefractionIdx = aOpacity.z;\n" "\n" " if (aOpacity.z != 1.0f)\n" " {\n" diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/Shaders_TangentSpaceNormal_glsl.pxx opencascade-7.5.1+dfsg1/src/Shaders/Shaders_TangentSpaceNormal_glsl.pxx --- opencascade-7.4.1+dfsg1/src/Shaders/Shaders_TangentSpaceNormal_glsl.pxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/Shaders_TangentSpaceNormal_glsl.pxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,20 @@ +// This file has been automatically generated from resource file src/Shaders/TangentSpaceNormal.glsl + +static const char Shaders_TangentSpaceNormal_glsl[] = + "//! Calculates transformation from tangent space and apply it to value from normal map to get normal in object space\n" + "vec3 TangentSpaceNormal (in mat2 theDeltaUVMatrix,\n" + " in mat2x3 theDeltaVectorMatrix,\n" + " in vec3 theNormalMapValue,\n" + " in vec3 theNormal,\n" + " in bool theIsInverse)\n" + "{\n" + " theNormalMapValue = normalize(theNormalMapValue * 2.0 - vec3(1.0));\n" + " // Inverse matrix\n" + " theDeltaUVMatrix = mat2 (theDeltaUVMatrix[1][1], -theDeltaUVMatrix[0][1], -theDeltaUVMatrix[1][0], theDeltaUVMatrix[0][0]);\n" + " theDeltaVectorMatrix = theDeltaVectorMatrix * theDeltaUVMatrix;\n" + " // Gram-Schmidt orthogonalization\n" + " theDeltaVectorMatrix[1] = normalize(theDeltaVectorMatrix[1] - dot(theNormal, theDeltaVectorMatrix[1]) * theNormal);\n" + " theDeltaVectorMatrix[0] = cross(theDeltaVectorMatrix[1], theNormal);\n" + " float aDirection = theIsInverse ? -1.0 : 1.0;\n" + " return mat3 (aDirection * theDeltaVectorMatrix[0], aDirection * theDeltaVectorMatrix[1], theNormal) * theNormalMapValue;\n" + "}\n"; diff -Nru opencascade-7.4.1+dfsg1/src/Shaders/TangentSpaceNormal.glsl opencascade-7.5.1+dfsg1/src/Shaders/TangentSpaceNormal.glsl --- opencascade-7.4.1+dfsg1/src/Shaders/TangentSpaceNormal.glsl 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Shaders/TangentSpaceNormal.glsl 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,17 @@ +//! Calculates transformation from tangent space and apply it to value from normal map to get normal in object space +vec3 TangentSpaceNormal (in mat2 theDeltaUVMatrix, + in mat2x3 theDeltaVectorMatrix, + in vec3 theNormalMapValue, + in vec3 theNormal, + in bool theIsInverse) +{ + theNormalMapValue = normalize(theNormalMapValue * 2.0 - vec3(1.0)); + // Inverse matrix + theDeltaUVMatrix = mat2 (theDeltaUVMatrix[1][1], -theDeltaUVMatrix[0][1], -theDeltaUVMatrix[1][0], theDeltaUVMatrix[0][0]); + theDeltaVectorMatrix = theDeltaVectorMatrix * theDeltaUVMatrix; + // Gram-Schmidt orthogonalization + theDeltaVectorMatrix[1] = normalize(theDeltaVectorMatrix[1] - dot(theNormal, theDeltaVectorMatrix[1]) * theNormal); + theDeltaVectorMatrix[0] = cross(theDeltaVectorMatrix[1], theNormal); + float aDirection = theIsInverse ? -1.0 : 1.0; + return mat3 (aDirection * theDeltaVectorMatrix[0], aDirection * theDeltaVectorMatrix[1], theNormal) * theNormalMapValue; +} diff -Nru opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis.cxx opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis.cxx --- opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -241,9 +241,10 @@ //======================================================================= //function : OuterBound -//purpose : replacement of bad BRepTools::OuterBound() +//purpose : replacement of bad BRepTools::OuterBound(), to be merged +// - skips internal vertices in face, if any, without exception +// - returns positively oriented wire rather than greater one //======================================================================= -//:n3 TopoDS_Wire ShapeAnalysis::OuterWire(const TopoDS_Face& face) { @@ -251,21 +252,26 @@ F.Orientation(TopAbs_FORWARD); BRep_Builder B; - TopoDS_Wire W; - TopoDS_Iterator exp (F, Standard_False); - while ( exp.More() ) { - if(exp.Value().ShapeType() != TopAbs_WIRE) + TopoDS_Iterator anIt (F, Standard_False); + while (anIt.More()) + { + TopoDS_Shape aWire = anIt.Value(); + anIt.Next(); + + // skip possible internal vertices in face + if (aWire.ShapeType() != TopAbs_WIRE) continue; - W = TopoDS::Wire ( exp.Value() ); - exp.Next(); - if ( ! exp.More() ) return W; - //szv#4:S4163:12Mar99 SGI warns - TopoDS_Shape sh = F.EmptyCopied(); - TopoDS_Face fc = TopoDS::Face( sh ); - B.Add ( fc, W ); - if ( ShapeAnalysis::IsOuterBound ( fc ) ) return W; + + // if current wire is the last one, return it without analysis + if (! anIt.More()) + return TopoDS::Wire (aWire); + + TopoDS_Shape aTestFace = F.EmptyCopied(); + B.Add (aTestFace, aWire); + if (ShapeAnalysis::IsOuterBound (TopoDS::Face (aTestFace))) + return TopoDS::Wire (aWire); } - return W; + return TopoDS_Wire(); } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Geom.cxx opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Geom.cxx --- opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Geom.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Geom.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -128,8 +128,12 @@ gp_GTrsf gtrsf; for (Standard_Integer i = 1; i <= 3; i ++) + { for (Standard_Integer j = 1; j <= 4; j ++) + { gtrsf.SetValue (i,j, coefs->Value(i,j)); + } + } //try { //szv#4:S4163:12Mar99 waste try //// trsf = gtrsf.Trsf(); diff -Nru opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Shell.cxx opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Shell.cxx --- opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Shell.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Shell.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,15 @@ #include //======================================================================= +//function : ShapeAnalysis_Shell +//purpose : +//======================================================================= +ShapeAnalysis_Shell::ShapeAnalysis_Shell() +: myConex(Standard_False) +{ +} + +//======================================================================= //function : Clear //purpose : //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Shell.hxx opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Shell.hxx --- opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Shell.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Shell.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,6 +37,9 @@ DEFINE_STANDARD_ALLOC + //! Empty constructor + Standard_EXPORT ShapeAnalysis_Shell(); + //! Clears data about loaded shells and performed checks Standard_EXPORT void Clear(); diff -Nru opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Surface.cxx opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Surface.cxx --- opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Surface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_Surface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,7 +44,6 @@ #include #include #include -#include #include #include #include diff -Nru opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_TransferParametersProj.cxx opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_TransferParametersProj.cxx --- opencascade-7.4.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_TransferParametersProj.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeAnalysis/ShapeAnalysis_TransferParametersProj.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -58,6 +58,7 @@ //purpose : //======================================================================= ShapeAnalysis_TransferParametersProj::ShapeAnalysis_TransferParametersProj() +: myPrecision(0.0) { myMaxTolerance = 1; //Precision::Infinite(); ?? pdn myForceProj = Standard_False; diff -Nru opencascade-7.4.1+dfsg1/src/ShapeCustom/ShapeCustom_BSplineRestriction.cxx opencascade-7.5.1+dfsg1/src/ShapeCustom/ShapeCustom_BSplineRestriction.cxx --- opencascade-7.4.1+dfsg1/src/ShapeCustom/ShapeCustom_BSplineRestriction.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeCustom/ShapeCustom_BSplineRestriction.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -641,7 +641,7 @@ /*if(aSurf->IsVPeriodic()) { Standard_Real aDelta = (VL > VF ? VL - VF : VF - VL ); - v1 = (aDelta > 2.*M_PI ? 0. : VF + ShapeAnalysis::AdjustByPeriod(VF,0.5*(UL+UF),2*M_PI)); ; + v1 = (aDelta > 2.*M_PI ? 0. : VF + ShapeAnalysis::AdjustByPeriod(VF,0.5*(UL+UF),2*M_PI)); v2 = (aDelta > 2.*M_PI ? 2.* M_PI : v1 + aDelta); }*/ if(!aSurf->IsVPeriodic()) {//else diff -Nru opencascade-7.4.1+dfsg1/src/ShapeCustom/ShapeCustom.cxx opencascade-7.5.1+dfsg1/src/ShapeCustom/ShapeCustom.cxx --- opencascade-7.4.1+dfsg1/src/ShapeCustom/ShapeCustom.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeCustom/ShapeCustom.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,8 +35,7 @@ #include #include -#include -#include +#include //======================================================================= //function : ApplyModifier @@ -47,7 +46,7 @@ const Handle(BRepTools_Modification) &M, TopTools_DataMapOfShapeShape &context, BRepTools_Modifier& MD, - const Handle(Message_ProgressIndicator) & aProgress, + const Message_ProgressRange& theProgress, const Handle(ShapeBuild_ReShape) & aReShape) { // protect against INTERNAL/EXTERNAL shapes @@ -61,16 +60,17 @@ B.MakeCompound ( C ); Standard_Integer aShapeCount = SF.NbChildren(); - Message_ProgressSentry aPSentry(aProgress, "Applying Modifier For Solids", 0, aShapeCount, 1); - for ( TopoDS_Iterator it(SF); it.More() && aPSentry.More(); it.Next(), aPSentry.Next() ) { + Message_ProgressScope aPS(theProgress, "Applying Modifier For Solids", aShapeCount); + for ( TopoDS_Iterator it(SF); it.More() && aPS.More(); it.Next()) { TopoDS_Shape shape = it.Value(); TopLoc_Location L = shape.Location(), nullLoc; shape.Location ( nullLoc ); TopoDS_Shape res; + Message_ProgressRange aRange = aPS.Next(); if ( context.IsBound ( shape ) ) res = context.Find ( shape ).Oriented ( shape.Orientation() ); else - res = ApplyModifier ( shape, M, context ,MD, aProgress); + res = ApplyModifier ( shape, M, context ,MD, aRange); if ( ! res.IsSame ( shape ) ) { context.Bind ( shape, res ); @@ -80,7 +80,7 @@ B.Add ( C, res ); } - if ( !aPSentry.More() ) + if ( !aPS.More() ) { // Was cancelled return S; @@ -91,12 +91,12 @@ return C.Oriented ( S.Orientation() ); } - Message_ProgressSentry aPSentry(aProgress, "Modify the Shape", 0, 1, 1); + Message_ProgressScope aPS(theProgress, "Modify the Shape", 1); // Modify the shape MD.Init(SF); - MD.Perform(M, aProgress); + MD.Perform(M, aPS.Next()); - if ( !aPSentry.More() || !MD.IsDone() ) return S; + if ( !aPS.More() || !MD.IsDone() ) return S; if ( !aReShape.IsNull() ) { for(TopoDS_Iterator theIterator(SF,Standard_False);theIterator.More();theIterator.Next()) diff -Nru opencascade-7.4.1+dfsg1/src/ShapeCustom/ShapeCustom.hxx opencascade-7.5.1+dfsg1/src/ShapeCustom/ShapeCustom.hxx --- opencascade-7.4.1+dfsg1/src/ShapeCustom/ShapeCustom.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeCustom/ShapeCustom.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,10 +26,11 @@ #include #include #include +#include + class TopoDS_Shape; class BRepTools_Modification; class BRepTools_Modifier; -class Message_ProgressIndicator; class ShapeBuild_ReShape; class ShapeCustom_RestrictionParameters; class ShapeCustom_Surface; @@ -66,7 +67,11 @@ //! Applies modifier to shape and checks sharing in the case assemblies. - Standard_EXPORT static TopoDS_Shape ApplyModifier (const TopoDS_Shape& S, const Handle(BRepTools_Modification)& M, TopTools_DataMapOfShapeShape& context, BRepTools_Modifier& MD, const Handle(Message_ProgressIndicator)& aProgress = NULL, const Handle(ShapeBuild_ReShape)& aReShape = NULL); + Standard_EXPORT static TopoDS_Shape ApplyModifier + (const TopoDS_Shape& S, const Handle(BRepTools_Modification)& M, + TopTools_DataMapOfShapeShape& context, BRepTools_Modifier& MD, + const Message_ProgressRange& theProgress = Message_ProgressRange(), + const Handle(ShapeBuild_ReShape)& aReShape = NULL); //! Returns a new shape without indirect surfaces. Standard_EXPORT static TopoDS_Shape DirectFaces (const TopoDS_Shape& S); diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_ComposeShell.cxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_ComposeShell.cxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_ComposeShell.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_ComposeShell.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -634,7 +634,7 @@ Standard_Integer i; // svv #1 for ( i=begInd; ; i++ ) { if ( i > nb ) i = 1; - TopoDS_Edge edge = wire->Edge ( i );; + TopoDS_Edge edge = wire->Edge ( i ); Handle(Geom2d_Curve) c2d; Standard_Real f, l; @@ -868,7 +868,6 @@ // Collect data on edge Standard_Real tolEdge = BRep_Tool::Tolerance(edge); - Standard_Real tol = LimitTolerance( tolEdge ); TopoDS_Vertex prevV = sae.FirstVertex(edge); TopoDS_Vertex lastV = sae.LastVertex(edge); Standard_Real prevVTol = LimitTolerance( BRep_Tool::Tolerance(prevV) ); @@ -984,43 +983,48 @@ currPnt2d = C2d->Value(currPar); currPnt = myGrid->Value ( currPnt2d ); if ( currPnt.Distance ( lastVPnt ) <= lastVTol && - lastPnt.Distance ( currPnt ) <= tol && + // Tolerance is increased to prevent degenerated cuts in cases where all vertex + // tolerance is covered by distance of the edge curve from vertex point. + // Doubled to prevent edge being fully covered by its vertices tolerance (invalid edge). CheckByCurve3d ( lastVPnt, c3d, f3d+(currPar-firstPar)*(l3d-f3d)/span2d, - T, lastVTol ) && - lastPnt.Distance ( myGrid->Value ( C2d->Value(0.5*(currPar+lastPar)) ) ) <= tol ) { + T, lastVTol + 2 * Precision::Confusion() ) && + lastPnt.Distance (myGrid->Value (C2d->Value(0.5*(currPar+lastPar)))) <= lastVTol) { V = lastV; Standard_Real uRes = myUResolution; Standard_Real vRes = myVResolution; if(isCutByU) { - Standard_Real gridRes = GetGridResolution(myGrid->UJointValues(),cutIndex)/tol; + Standard_Real gridRes = GetGridResolution(myGrid->UJointValues(), cutIndex) / lastVTol; uRes = Min(myUResolution,gridRes); } else { - Standard_Real gridRes = GetGridResolution(myGrid->VJointValues(),cutIndex)/tol; + Standard_Real gridRes = GetGridResolution(myGrid->VJointValues(), cutIndex) / lastVTol; vRes = Min(myVResolution,gridRes); } - if ( IsCoincided ( lastPnt2d, currPnt2d, uRes, vRes, tol ) && - IsCoincided ( lastPnt2d, C2d->Value(0.5*(currPar+lastPar)), uRes, vRes, tol ) ) + if (IsCoincided(lastPnt2d, currPnt2d, uRes, vRes, lastVTol) && + IsCoincided(lastPnt2d, C2d->Value(0.5*(currPar + lastPar)), uRes, vRes, lastVTol)) doCut = Standard_False; } else if ( currPnt.Distance ( prevVPnt ) <= prevVTol && - prevPnt.Distance ( currPnt ) <= tol && + // Tolerance is increased to prevent degenerated cuts in cases where all vertex + // tolerance is covered by distance of the edge curve from vertex point. + // Doubled to prevent edge being fully covered by its vertices tolerance (invalid edge). CheckByCurve3d ( prevVPnt, c3d, f3d+(currPar-firstPar)*(l3d-f3d)/span2d, - T, prevVTol ) && - prevPnt.Distance ( myGrid->Value ( C2d->Value(0.5*(currPar+prevPar)) ) ) <= tol ) { + T, prevVTol + 2 * Precision::Confusion()) && + prevPnt.Distance (myGrid->Value (C2d->Value(0.5*(currPar+prevPar)))) <= prevVTol) { V = prevV; Standard_Real uRes = myUResolution; Standard_Real vRes = myVResolution; if(isCutByU) { - Standard_Real gridRes = GetGridResolution(myGrid->UJointValues(),cutIndex)/tol; + Standard_Real gridRes = GetGridResolution(myGrid->UJointValues(), cutIndex) / prevVTol; uRes = Min(myUResolution,gridRes); } else { - Standard_Real gridRes = GetGridResolution(myGrid->VJointValues(),cutIndex)/tol; + Standard_Real gridRes = GetGridResolution(myGrid->VJointValues(), cutIndex) / prevVTol; vRes = Min(myVResolution,gridRes); } - if ( IsCoincided ( prevPnt2d, currPnt2d, uRes, vRes, tol ) && - IsCoincided ( prevPnt2d, C2d->Value(0.5*(currPar+prevPar)), uRes, vRes, tol ) ) { + if (IsCoincided(prevPnt2d, currPnt2d, uRes, vRes, prevVTol) && + IsCoincided(prevPnt2d, C2d->Value(0.5*(currPar + prevPar)), uRes, vRes, prevVTol)) { + vertices.Append ( prevV ); code = SegmentCodes ( j ); // classification code - update for next segment continue; // no splitting at this point, go to next one @@ -1253,6 +1257,7 @@ Standard_Real f, l; Handle(Geom2d_Curve) c2d; if ( ! sae.PCurve ( E, myFace, c2d, f, l, Standard_False ) ) continue; + Handle(Geom2d_Curve) c2d_sav = c2d; // get end points gp_Pnt2d posf = c2d->Value(f), posl = c2d->Value(l); @@ -1283,8 +1288,9 @@ pppf.SetX ( pppf.X() + shift ); pppl.SetX ( pppl.X() + shift ); } - shiftNext.SetX ( -myUPeriod ); - nbIter = (Standard_Integer)( 1 + Abs ( umax + shift - x ) / myUPeriod ); + Standard_Real dUmax = umax + shift - x; + shiftNext.SetX (dUmax > 0 ? -myUPeriod : myUPeriod); + nbIter = (Standard_Integer)(1 + Abs (dUmax) / myUPeriod); shift = ShapeAnalysis::AdjustByPeriod ( posf.X(), x, myUPeriod ); posf.SetX ( posf.X() + shift ); shift = ShapeAnalysis::AdjustByPeriod ( posl.X(), x, myUPeriod ); @@ -1300,8 +1306,9 @@ pppf.SetY ( pppf.Y() + shift ); pppl.SetY ( pppl.Y() + shift ); } - shiftNext.SetY ( -myVPeriod ); - nbIter = (Standard_Integer)( 1 + Abs ( umax + shift - y ) / myVPeriod ); + Standard_Real dVmax = vmax + shift - y; + shiftNext.SetY (dVmax > 0 ? -myVPeriod : myVPeriod); + nbIter = (Standard_Integer)(1 + Abs (dVmax) / myVPeriod); shift = ShapeAnalysis::AdjustByPeriod ( posf.Y(), y, myVPeriod ); posf.SetY ( posf.Y() + shift ); shift = ShapeAnalysis::AdjustByPeriod ( posl.Y(), y, myVPeriod ); @@ -1342,8 +1349,11 @@ Standard_Integer i; for ( i = 1; i <= Inter.NbPoints(); i++ ) { IntRes2d_IntersectionPoint IP = Inter.Point (i); - IntLinePar.Append ( IP.ParamOnFirst() ); - IntEdgePar.Append ( IP.ParamOnSecond() ); + if (IP.TransitionOfSecond().PositionOnCurve() == IntRes2d_Middle || (code != IOR_UNDEF && prevCode != IOR_UNDEF) ) + { + IntLinePar.Append (IP.ParamOnFirst()); + IntEdgePar.Append (IP.ParamOnSecond()); + } } for ( i = 1; i <= Inter.NbSegments(); i++ ) { IntRes2d_IntersectionSegment IS = Inter.Segment (i); @@ -1629,8 +1639,19 @@ TopoDS_Shape tmpV2 = Context()->Apply ( SplitLineVertex(i) ); TopoDS_Vertex V1 = TopoDS::Vertex ( tmpV1 ); TopoDS_Vertex V2 = TopoDS::Vertex ( tmpV2 ); - // protection against creating null-length edges - if ( SplitLinePar(i) - SplitLinePar(i-1) < ::Precision::PConfusion() ) { + // protection against creating null-length edges or edges lying inside tolerance of vertices + //first and last vertices for split line can not be merged to each other + Standard_Boolean canbeMerged = ( /*myClosedMode &&*/ (i -1 > 1 || i < SplitLinePar.Length())); + Standard_Real aMaxTol = MaxTolerance(); + //case when max tolerance is not defined tolerance of vertices will be used as is + if( aMaxTol <= 2. *Precision::Confusion() ) + aMaxTol = Precision::Infinite(); + Standard_Real aTol1 = Min(BRep_Tool::Tolerance(V1), aMaxTol); + Standard_Real aTol2 = Min(BRep_Tool::Tolerance(V2), aMaxTol); + gp_Pnt aP1 = BRep_Tool::Pnt(V1); + gp_Pnt aP2 = BRep_Tool::Pnt(V2); + Standard_Real aD = aP1.SquareDistance(aP2); + if (SplitLinePar(i) - SplitLinePar(i-1) < ::Precision::PConfusion() || ( canbeMerged && ( aD <= (aTol1 * aTol1) || aD <= (aTol2 * aTol2)))) {// BRepTools::Compare(V1, V2)) ) { #ifdef OCCT_DEBUG std::cout << "Info: ShapeFix_ComposeShell::SplitByLine: Short segment ignored" << std::endl; @@ -2142,7 +2163,7 @@ // for coincidence (instead of vertex tolerance) in order // this check to be in agreement with check for position of wire segments // thus avoiding bad effects on overlapping edges - Standard_Real ctol = Max ( edgeTol, BRep_Tool::Tolerance(lastEdge) ); + Standard_Real ctol = Max (edgeTol, BRep_Tool::Tolerance(endV/*lastEdge*/)); Standard_Boolean conn = IsCoincided ( endPnt, lPnt, myUResolution, myVResolution, ctol ); Standard_Real dist = endPnt.SquareDistance ( lPnt ); diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix.cxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix.cxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -67,7 +67,7 @@ #include #include -#include +#include #include #include @@ -79,7 +79,7 @@ Standard_Boolean ShapeFix::SameParameter(const TopoDS_Shape& shape, const Standard_Boolean enforce, const Standard_Real preci, - const Handle(Message_ProgressIndicator)& theProgress, + const Message_ProgressRange& theProgress, const Handle(ShapeExtend_BasicMsgRegistrator)& theMsgReg) { // Calculate number of edges @@ -106,16 +106,16 @@ Message_Msg doneMsg("FixEdge.SameParameter.MSG0"); // Start progress scope (no need to check if progress exists -- it is safe) - Message_ProgressSentry aPSentryForSameParam(theProgress, "Fixing same parameter problem", 0, 2, 1); + Message_ProgressScope aPSForSameParam(theProgress, "Fixing same parameter problem", 2); { // Start progress scope (no need to check if progress exists -- it is safe) - Message_ProgressSentry aPSentry(theProgress, "Fixing edge", 0, aNbEdges, 1); + Message_ProgressScope aPS (aPSForSameParam.Next(), "Fixing edge", aNbEdges); while ( ex.More() ) { TopoDS_Edge E; - while ( ex.More() && aPSentry.More() ) + while ( ex.More() && aPS.More() ) { numedge ++; int ierr = 0; @@ -161,25 +161,23 @@ } // Complete step in current progress scope - aPSentry.Next(); + aPS.Next(); } // -- end while // Halt algorithm in case of user's abort - if ( !aPSentry.More() ) + if ( !aPS.More() ) return Standard_False; } } - // Switch to "Update tolerances" step - aPSentryForSameParam.Next(); { // Start progress scope (no need to check if progress exists -- it is safe) - Message_ProgressSentry aPSentry(theProgress, "Update tolerances", 0, aNbFaces, 1); + Message_ProgressScope aPS (aPSForSameParam.Next(), "Update tolerances", aNbFaces); //:i2 abv 21 Aug 98: ProSTEP TR8 Motor.rle face 710: // Update tolerance of edges on planes (no pcurves are stored) - for ( TopExp_Explorer exp ( shape, TopAbs_FACE ); exp.More() && aPSentry.More(); exp.Next(), aPSentry.Next() ) + for ( TopExp_Explorer exp ( shape, TopAbs_FACE ); exp.More() && aPS.More(); exp.Next(), aPS.Next() ) { TopoDS_Face face = TopoDS::Face ( exp.Current() ); Handle(Geom_Surface) Surf = BRep_Tool::Surface ( face ); @@ -202,7 +200,7 @@ if ( crv.IsNull() ) continue; - Handle(Geom2d_Curve) c2d = BRep_Tool::CurveOnSurface ( edge, face, f, l );; + Handle(Geom2d_Curve) c2d = BRep_Tool::CurveOnSurface ( edge, face, f, l ); if ( c2d.IsNull() ) continue; Handle(Geom2dAdaptor_HCurve) GHPC = new Geom2dAdaptor_HCurve ( c2d, f, l ); Adaptor3d_CurveOnSurface ACS(GHPC,AS); @@ -238,11 +236,10 @@ } } } - - // Halt algorithm in case of user's abort - if ( !aPSentry.More() ) - return Standard_False; } + // Halt algorithm in case of user's abort + if (!aPS.More()) + return Standard_False; } if (!status) { diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Edge.cxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Edge.cxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Edge.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Edge.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -862,7 +862,7 @@ //purpose : //======================================================================= -inline Handle(ShapeBuild_ReShape) ShapeFix_Edge::Context() const +Handle(ShapeBuild_ReShape) ShapeFix_Edge::Context() const { return myContext; } diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_EdgeProjAux.cxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_EdgeProjAux.cxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_EdgeProjAux.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_EdgeProjAux.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -53,8 +53,11 @@ //purpose : //======================================================================= ShapeFix_EdgeProjAux::ShapeFix_EdgeProjAux () +: myFirstParam(0.0), + myLastParam(0.0), + myFirstDone(Standard_False), + myLastDone(Standard_False) { - myFirstDone = myLastDone = Standard_False; } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Face.cxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Face.cxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Face.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Face.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -1863,13 +1863,56 @@ mySurf = new ShapeAnalysis_Surface ( RTS ); myResult = CompShell.Result(); -// if ( myFace.Orientation() == TopAbs_REVERSED ) res.Reverse(); + Context()->Replace ( myFace, myResult ); + + // Remove small wires and / or faces that can be generated by ComposeShell + // (see tests bugs step bug30052_4, de step_3 E6) + Standard_Integer nbFaces = 0; + TopExp_Explorer expF ( myResult, TopAbs_FACE ); + for (; expF.More(); expF.Next() ) + { + TopoDS_Face aFace = TopoDS::Face(expF.Value()); + TopExp_Explorer aExpW(aFace, TopAbs_WIRE); + Standard_Integer nbWires = 0; + for( ;aExpW.More(); aExpW.Next() ) + { + ShapeFix_Wire aSfw(TopoDS::Wire(aExpW.Value()), aFace, Precision()); + aSfw.SetContext(Context()); + if(aSfw.NbEdges()) + aSfw.FixSmall (Standard_True, Precision()); + if(!aSfw.NbEdges()) + { + Context()->Remove(aExpW.Value()); + continue; + } + nbWires++; + } + if(!nbWires) + { + Context()->Remove(aFace); + continue; + } + nbFaces++; + } + + myResult = Context()->Apply(myResult); for (TopExp_Explorer exp ( myResult, TopAbs_FACE ); exp.More(); exp.Next() ) { - myFace = TopoDS::Face ( exp.Current() ); + myFace = TopoDS::Face ( Context()->Apply(exp.Current() )); + if( myFace.IsNull()) + continue; + if(nbFaces > 1) + { + FixSmallAreaWire(Standard_True); + TopoDS_Shape aShape = Context()->Apply(myFace); + if(aShape.IsNull() ) + continue; + myFace = TopoDS::Face(aShape); + } BRepTools::Update(myFace); //:p4 } - + myResult = Context()->Apply(myResult); + SendWarning ( Message_Msg ( "FixAdvFace.FixMissingSeam.MSG0" ) );// Missing seam-edge added return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_FreeBounds.cxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_FreeBounds.cxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_FreeBounds.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_FreeBounds.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,14 @@ //function : ShapeFix_FreeBounds //purpose : //======================================================================= -ShapeFix_FreeBounds::ShapeFix_FreeBounds() {} +ShapeFix_FreeBounds::ShapeFix_FreeBounds() +: myShared(Standard_False), + mySewToler(0.0), + myCloseToler(0.0), + mySplitClosed(Standard_False), + mySplitOpen(Standard_False) +{ +} //======================================================================= //function : ShapeFix_FreeBounds diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix.hxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix.hxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,11 +24,10 @@ #include #include -#include #include +#include class TopoDS_Shape; -class Message_ProgressIndicator; class ShapeExtend_BasicMsgRegistrator; class ShapeBuild_ReShape; class ShapeFix_Root; @@ -78,7 +77,11 @@ //! been processed. The passed progress indicator allows user //! to consult the current progress stage and abort algorithm //! if needed. - Standard_EXPORT static Standard_Boolean SameParameter (const TopoDS_Shape& shape, const Standard_Boolean enforce, const Standard_Real preci = 0.0, const Handle(Message_ProgressIndicator)& theProgress = 0, const Handle(ShapeExtend_BasicMsgRegistrator)& theMsgReg = 0); + Standard_EXPORT static Standard_Boolean SameParameter + (const TopoDS_Shape& shape, const Standard_Boolean enforce, + const Standard_Real preci = 0.0, + const Message_ProgressRange& theProgress = Message_ProgressRange(), + const Handle(ShapeExtend_BasicMsgRegistrator)& theMsgReg = 0); //! Runs EncodeRegularity from BRepLib taking into account //! shared components of assemblies, so that each component diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Shape.cxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Shape.cxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Shape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Shape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,8 +17,7 @@ #include #include -#include -#include +#include #include #include #include @@ -98,7 +97,7 @@ //purpose : //======================================================================= -Standard_Boolean ShapeFix_Shape::Perform(const Handle(Message_ProgressIndicator)& theProgress) +Standard_Boolean ShapeFix_Shape::Perform(const Message_ProgressRange& theProgress) { Standard_Integer savFixSmallAreaWireMode = 0; Standard_Integer savFixVertexTolMode = myFixVertexTolMode; @@ -138,7 +137,7 @@ // Open progress indication scope for the following fix stages: // - Fix on Solid or Shell; // - Fix same parameterization; - Message_ProgressSentry aPSentry(theProgress, "Fixing stage", 0, 2, 1); + Message_ProgressScope aPS(theProgress, "Fixing stage", 2); switch ( st ) { case TopAbs_COMPOUND: @@ -150,14 +149,14 @@ Standard_Integer aShapesNb = S.NbChildren(); // Open progress indication scope for sub-shape fixing - Message_ProgressSentry aPSentrySubShape(theProgress, "Fixing sub-shape", 0, aShapesNb, 1); - for ( TopoDS_Iterator anIter(S); anIter.More() && aPSentrySubShape.More(); anIter.Next(), aPSentrySubShape.Next() ) + Message_ProgressScope aPSSubShape(aPS.Next(), "Fixing sub-shape", aShapesNb); + for ( TopoDS_Iterator anIter(S); anIter.More() && aPSSubShape.More(); anIter.Next()) { myShape = anIter.Value(); - if ( Perform(theProgress) ) + if (Perform (aPSSubShape.Next())) status = Standard_True; } - if ( !aPSentrySubShape.More() ) + if ( !aPSSubShape.More() ) return Standard_False; // aborted execution myFixSameParameterMode = savFixSameParameterMode; @@ -171,7 +170,7 @@ myFixSolid->Init(TopoDS::Solid(S)); myFixSolid->SetContext(Context()); - if ( myFixSolid->Perform(theProgress) ) + if (myFixSolid->Perform (aPS.Next())) status = Standard_True; myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE4 ); @@ -184,7 +183,7 @@ sfsh->Init( TopoDS::Shell(S) ); sfsh->SetContext( Context() ); - if ( sfsh->Perform(theProgress) ) + if (sfsh->Perform (aPS.Next())) status = Standard_True; myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE4 ); @@ -236,15 +235,16 @@ case TopAbs_SHAPE : default : break; } - - // Switch to the second progress indication scope if it exists - aPSentry.Next(); + if (!aPS.More()) + return Standard_False; // aborted execution myResult = Context()->Apply(S); if ( NeedFix(myFixSameParameterMode) ) { - SameParameter(myResult, Standard_False, theProgress); + SameParameter (myResult, Standard_False, aPS.Next()); + if (!aPS.More()) + return Standard_False; // aborted execution } if( NeedFix( myFixVertexTolMode)) { @@ -284,7 +284,7 @@ void ShapeFix_Shape::SameParameter(const TopoDS_Shape& sh, const Standard_Boolean enforce, - const Handle(Message_ProgressIndicator)& theProgress) + const Message_ProgressRange& theProgress) { ShapeFix::SameParameter(sh, enforce, 0.0, theProgress); } diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Shape.hxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Shape.hxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Shape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Shape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,11 +27,9 @@ #include #include #include - -#include +#include class ShapeFix_Solid; -class Message_ProgressIndicator; class ShapeFix_Shell; class ShapeFix_Face; class ShapeFix_Wire; @@ -63,7 +61,7 @@ Standard_EXPORT void Init (const TopoDS_Shape& shape); //! Iterates on sub- shape and performs fixes - Standard_EXPORT Standard_Boolean Perform (const Handle(Message_ProgressIndicator)& theProgress = 0); + Standard_EXPORT Standard_Boolean Perform (const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Returns resulting shape Standard_EXPORT TopoDS_Shape Shape() const; @@ -144,7 +142,8 @@ //! Fixes same parameterization problem on the passed shape //! by updating tolerances of the corresponding topological //! entitites. - Standard_EXPORT void SameParameter (const TopoDS_Shape& shape, const Standard_Boolean enforce, const Handle(Message_ProgressIndicator)& theProgress = 0); + Standard_EXPORT void SameParameter (const TopoDS_Shape& shape, const Standard_Boolean enforce, + const Message_ProgressRange& theProgress = Message_ProgressRange()); TopoDS_Shape myResult; Handle(ShapeFix_Solid) myFixSolid; diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Shell.cxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Shell.cxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Shell.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Shell.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,8 +22,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -105,7 +104,7 @@ //purpose : //======================================================================= -Standard_Boolean ShapeFix_Shell::Perform(const Handle(Message_ProgressIndicator)& theProgress) +Standard_Boolean ShapeFix_Shell::Perform(const Message_ProgressRange& theProgress) { Standard_Boolean status = Standard_False; if ( Context().IsNull() ) @@ -120,9 +119,9 @@ Standard_Integer aNbFaces = S.NbChildren(); // Start progress scope (no need to check if progress exists -- it is safe) - Message_ProgressSentry aPSentry(theProgress, "Fixing face", 0, aNbFaces, 1); + Message_ProgressScope aPS(theProgress, "Fixing face", aNbFaces); - for( TopoDS_Iterator iter(S); iter.More() && aPSentry.More(); iter.Next(), aPSentry.Next() ) + for( TopoDS_Iterator iter(S); iter.More() && aPS.More(); iter.Next(), aPS.Next() ) { TopoDS_Shape sh = iter.Value(); TopoDS_Face tmpFace = TopoDS::Face(sh); @@ -135,7 +134,7 @@ } // Halt algorithm in case of user's abort - if ( !aPSentry.More() ) + if ( !aPS.More() ) return Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Shell.hxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Shell.hxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Shell.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Shell.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,11 +19,11 @@ #include -#include #include #include #include #include +#include class ShapeFix_Face; class ShapeExtend_BasicMsgRegistrator; @@ -57,7 +57,7 @@ //! then calls FixFaceOrientation). The passed progress //! indicator allows user to consult the current progress //! stage and abort algorithm if needed. - Standard_EXPORT Standard_Boolean Perform (const Handle(Message_ProgressIndicator)& theProgress = 0); + Standard_EXPORT Standard_Boolean Perform (const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Fixes orientation of faces in shell. //! Changes orientation of face in the shell, if it is oriented opposite diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Solid.cxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Solid.cxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Solid.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Solid.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,8 +20,7 @@ #include #include #include -#include -#include +#include #include #include #include @@ -386,7 +385,7 @@ //purpose : //======================================================================= -Standard_Boolean ShapeFix_Solid::Perform(const Handle(Message_ProgressIndicator)& theProgress) +Standard_Boolean ShapeFix_Solid::Perform(const Message_ProgressRange& theProgress) { Standard_Boolean status = Standard_False; @@ -403,20 +402,20 @@ aNbShells++; // Start progress scope (no need to check if progress exists -- it is safe) - Message_ProgressSentry aPSentry(theProgress, "Fixing solid stage", 0, 2, 1); + Message_ProgressScope aPS(theProgress, "Fixing solid stage", 2); if ( NeedFix(myFixShellMode) ) { // Start progress scope (no need to check if progress exists -- it is safe) - Message_ProgressSentry aPSentryFixShell(theProgress, "Fixing shell", 0, aNbShells, 1); + Message_ProgressScope aPSFixShell(aPS.Next(), "Fixing shell", aNbShells); // Fix shell by shell using ShapeFix_Shell tool - for ( TopExp_Explorer aExpSh(S, TopAbs_SHELL); aExpSh.More() && aPSentryFixShell.More(); aExpSh.Next(), aPSentryFixShell.Next() ) + for ( TopExp_Explorer aExpSh(S, TopAbs_SHELL); aExpSh.More() && aPSFixShell.More(); aExpSh.Next()) { TopoDS_Shape sh = aExpSh.Current(); myFixShell->Init( TopoDS::Shell(sh) ); - if ( myFixShell->Perform(theProgress) ) + if (myFixShell->Perform (aPSFixShell.Next())) { status = Standard_True; myStatus |= ShapeExtend::EncodeStatus ( ShapeExtend_DONE1 ); @@ -425,7 +424,7 @@ } // Halt algorithm in case of user's abort - if ( !aPSentryFixShell.More() ) + if ( !aPSFixShell.More() ) return Standard_False; } else @@ -433,9 +432,6 @@ NbShells = aNbShells; } - // Switch to the second stage - aPSentry.Next(); - if (!NeedFix(myFixShellOrientationMode)) { myShape = Context()->Apply(myShape); @@ -511,10 +507,9 @@ BRep_Builder aB; TopoDS_Compound aComp; aB.MakeCompound(aComp); - Message_ProgressSentry aPSentryCreatingSolid(theProgress, "Creating solid", - 0, aMapSolids.Extent(), 1); - for(Standard_Integer i =1; (i <= aMapSolids.Extent()) && (aPSentryCreatingSolid.More()); - i++, aPSentryCreatingSolid.Next()) + Message_ProgressScope aPSCreatingSolid (aPS.Next(), "Creating solid", aMapSolids.Extent()); + for(Standard_Integer i =1; (i <= aMapSolids.Extent()) && (aPSCreatingSolid.More()); + i++, aPSCreatingSolid.Next()) { TopoDS_Shape aResSh =aMapSolids.FindKey(i); if(aResShape.ShapeType() == TopAbs_SHELL && myCreateOpenSolidMode) { @@ -530,7 +525,7 @@ aB.Add(aComp,aResSh); } - if ( !aPSentryCreatingSolid.More() ) + if ( !aPSCreatingSolid.More() ) return Standard_False; // aborted execution Context()->Replace(aResShape,aComp); } diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Solid.hxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Solid.hxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Solid.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Solid.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,7 @@ #include class ShapeFix_Shell; class TopoDS_Solid; -class Message_ProgressIndicator; +class Message_ProgressScope; class TopoDS_Shell; class ShapeExtend_BasicMsgRegistrator; @@ -61,7 +61,7 @@ //! (calls ShapeFix_Shell for each subshell). The passed //! progress indicator allows user to consult the current //! progress stage and abort algorithm if needed. - Standard_EXPORT virtual Standard_Boolean Perform (const Handle(Message_ProgressIndicator)& theProgress = 0); + Standard_EXPORT virtual Standard_Boolean Perform (const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Calls MakeSolid and orients the solid to be "not infinite" Standard_EXPORT TopoDS_Solid SolidFromShell (const TopoDS_Shell& shell); diff -Nru opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Wire.cxx opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Wire.cxx --- opencascade-7.4.1+dfsg1/src/ShapeFix/ShapeFix_Wire.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeFix/ShapeFix_Wire.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -394,9 +394,9 @@ if (myFixTailMode != 0) { - Fixed |= FixTails(); - if (Fixed) + if (FixTails()) { + Fixed =Standard_True; FixShifted(); } } @@ -1421,7 +1421,7 @@ ShapeBuild_Edge sbe; Standard_Integer nb = sbwd->NbEdges(); - Standard_Boolean end = (nb == 0), degstop = Standard_False;; + Standard_Boolean end = (nb == 0), degstop = Standard_False; Standard_Integer stop = nb; Standard_Integer degn2 = 0; gp_Pnt pdeg; @@ -2239,7 +2239,7 @@ if (myRemoveLoopMode<1) { for ( Standard_Integer iter=0; iter < 30; iter++ ) { - Standard_Boolean loopRemoved = Standard_False;; + Standard_Boolean loopRemoved = Standard_False; Standard_Real prevFirst = 0 , prevLast = 0; for ( Standard_Integer i=1; i<=points2d.Length(); i++ ) { gp_Pnt pint = points3d.Value(i); diff -Nru opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_BRep.hxx opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_BRep.hxx --- opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_BRep.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_BRep.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -43,6 +43,11 @@ friend class ShapePersistent_BRep; public: + //! Empty constructor. + PointRepresentation() + : myParameter(0.0) + { + } //! Read persistent data from a file. Standard_EXPORT virtual void Read (StdObjMgt_ReadData& theReadData); //! Write persistent data to a file. @@ -114,6 +119,10 @@ friend class ShapePersistent_BRep; public: + PointOnSurface() + : myParameter2(0.0) + { + } virtual void Read (StdObjMgt_ReadData& theReadData); virtual void Write (StdObjMgt_WriteData& theWriteData) const; virtual Standard_CString PName() const { return "PBRep_PointOnSurface"; } @@ -154,6 +163,11 @@ friend class ShapePersistent_BRep; public: + GCurve() + : myFirst(0.0), + myLast(0.0) + { + } virtual void Read (StdObjMgt_ReadData& theReadData); virtual void Write (StdObjMgt_WriteData& theWriteData) const; virtual Standard_CString PName() const { return "PBRep_GCurve"; } @@ -201,6 +215,10 @@ friend class ShapePersistent_BRep; public: + CurveOnClosedSurface() + : myContinuity(0) + { + } virtual void Read (StdObjMgt_ReadData& theReadData); virtual void Write (StdObjMgt_WriteData& theWriteData) const; virtual void PChildren(StdObjMgt_Persistent::SequenceOfPersistent& theChildren) const; @@ -296,6 +314,10 @@ friend class ShapePersistent_BRep; public: + CurveOn2Surfaces() + : myContinuity(0) + { + } virtual void Read (StdObjMgt_ReadData& theReadData); virtual void Write (StdObjMgt_WriteData& theWriteData) const; virtual void PChildren(StdObjMgt_Persistent::SequenceOfPersistent& theChildren) const; @@ -315,6 +337,10 @@ friend class ShapePersistent_BRep; public: + pTVertex() + : myTolerance(0.0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { pTBase::Read (theReadData); @@ -347,6 +373,11 @@ friend class ShapePersistent_BRep; public: + pTEdge() + : myTolerance(0.0), + myFlags(0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { pTBase::Read (theReadData); @@ -379,6 +410,11 @@ friend class ShapePersistent_BRep; public: + pTFace() + : myTolerance(0.0), + myNaturalRestriction(Standard_False) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { pTBase::Read (theReadData); diff -Nru opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom2d_Curve.hxx opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom2d_Curve.hxx --- opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom2d_Curve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom2d_Curve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,6 +48,10 @@ friend class ShapePersistent_Geom2d_Curve; public: + pBezier() + : myRational(Standard_False) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myRational >> myPoles >> myWeights; } inline void Write (StdObjMgt_WriteData& theWriteData) const @@ -73,6 +77,12 @@ friend class ShapePersistent_Geom2d_Curve; public: + pBSpline() + : myRational(Standard_False), + myPeriodic(Standard_False), + mySpineDegree(0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myRational >> myPeriodic >> mySpineDegree; @@ -110,6 +120,11 @@ friend class ShapePersistent_Geom2d_Curve; public: + pTrimmed() + : myFirstU(0.0), + myLastU(0.0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myBasisCurve >> myFirstU >> myLastU; } inline void Write (StdObjMgt_WriteData& theWriteData) const @@ -132,6 +147,10 @@ friend class ShapePersistent_Geom2d_Curve; public: + pOffset() + : myOffsetValue(0.0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myBasisCurve >> myOffsetValue; } inline void Write (StdObjMgt_WriteData& theWriteData) const diff -Nru opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom_Curve.hxx opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom_Curve.hxx --- opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom_Curve.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom_Curve.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,6 +49,10 @@ friend class ShapePersistent_Geom_Curve; public: + pBezier() + : myRational(Standard_False) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myRational >> myPoles >> myWeights; } inline void Write(StdObjMgt_WriteData& theWriteData) @@ -73,6 +77,12 @@ friend class ShapePersistent_Geom_Curve; public: + pBSpline() + : myRational(Standard_False), + myPeriodic(Standard_False), + mySpineDegree(0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myRational >> myPeriodic >> mySpineDegree; @@ -109,6 +119,11 @@ friend class ShapePersistent_Geom_Curve; public: + pTrimmed() + : myFirstU(0.0), + myLastU(0.0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myBasisCurve >> myFirstU >> myLastU; } inline void Write (StdObjMgt_WriteData& theWriteData) const @@ -130,6 +145,10 @@ friend class ShapePersistent_Geom_Curve; public: + pOffset() + : myOffsetValue(0.0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myBasisCurve >> myOffsetDirection >> myOffsetValue; } inline void Write (StdObjMgt_WriteData& theWriteData) const diff -Nru opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom_Surface.hxx opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom_Surface.hxx --- opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom_Surface.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_Geom_Surface.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -112,6 +112,11 @@ friend class ShapePersistent_Geom_Surface; public: + pBezier() + : myURational(Standard_False), + myVRational(Standard_False) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myURational >> myVRational >> myPoles >> myWeights; } inline void Write (StdObjMgt_WriteData& theWriteData) const @@ -138,6 +143,15 @@ friend class ShapePersistent_Geom_Surface; public: + pBSpline() + : myURational(Standard_False), + myVRational(Standard_False), + myUPeriodic(Standard_False), + myVPeriodic(Standard_False), + myUSpineDegree(0), + myVSpineDegree(0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myURational >> myVRational; @@ -192,6 +206,13 @@ friend class ShapePersistent_Geom_Surface; public: + pRectangularTrimmed() + : myFirstU(0.0), + myLastU(0.0), + myFirstV(0.0), + myLastV(0.0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myBasisSurface; @@ -222,6 +243,10 @@ friend class ShapePersistent_Geom_Surface; public: + pOffset() + : myOffsetValue(0.0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myBasisSurface >> myOffsetValue; } inline void Write (StdObjMgt_WriteData& theWriteData) const diff -Nru opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_HSequence.hxx opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_HSequence.hxx --- opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_HSequence.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_HSequence.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -72,6 +72,12 @@ typedef node Node; public: + //! Empty constructor. + instance() + : mySize(0) + { + } + //! Read persistent data from a file. Standard_EXPORT virtual void Read (StdObjMgt_ReadData& theReadData); diff -Nru opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_Poly.hxx opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_Poly.hxx --- opencascade-7.4.1+dfsg1/src/ShapePersistent/ShapePersistent_Poly.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapePersistent/ShapePersistent_Poly.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -35,6 +35,10 @@ friend class ShapePersistent_Poly; public: + pPolygon2D() + : myDeflection(0.0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myDeflection >> myNodes; } inline void Write (StdObjMgt_WriteData& theWriteData) const @@ -74,6 +78,10 @@ friend class ShapePersistent_Poly; public: + pPolygonOnTriangulation() + : myDeflection(0.0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myDeflection >> myNodes >> myParameters; } inline void Write (StdObjMgt_WriteData& theWriteData) const @@ -94,6 +102,10 @@ friend class ShapePersistent_Poly; public: + pTriangulation() + : myDeflection(0.0) + { + } inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myDeflection >> myNodes >> myUVNodes >> myTriangles; } inline void Write (StdObjMgt_WriteData& theWriteData) const diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_Context.cxx opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_Context.cxx --- opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_Context.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_Context.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,7 +16,6 @@ #include #include -#include #include #include #include @@ -404,26 +403,6 @@ } //======================================================================= -//function : SetProgress -//purpose : -//======================================================================= - -void ShapeProcess_Context::SetProgress (const Handle(Message_ProgressIndicator)& progress) -{ - myProgress = progress; -} - -//======================================================================= -//function : Progress -//purpose : -//======================================================================= - -Handle(Message_ProgressIndicator) ShapeProcess_Context::Progress() const -{ - return myProgress; -} - -//======================================================================= //function : SetTraceLevel //purpose : //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_Context.hxx opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_Context.hxx --- opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_Context.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_Context.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,6 @@ #include class Resource_Manager; class Message_Messenger; -class Message_ProgressIndicator; class TCollection_AsciiString; @@ -103,12 +102,6 @@ //! Returns Messenger used for outputting messages. Standard_EXPORT Handle(Message_Messenger) Messenger() const; - //! Sets Progress Indicator. - Standard_EXPORT void SetProgress (const Handle(Message_ProgressIndicator)& theProgress); - - //! Returns Progress Indicator. - Standard_EXPORT Handle(Message_ProgressIndicator) Progress() const; - //! Sets trace level used for outputting messages //! - 0: no trace at all //! - 1: errors @@ -136,7 +129,6 @@ Handle(Resource_Manager) myRC; Handle(TColStd_HSequenceOfHAsciiString) myScope; Handle(Message_Messenger) myMessenger; - Handle(Message_ProgressIndicator) myProgress; Standard_Integer myTraceLev; diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess.cxx opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess.cxx --- opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -67,7 +68,8 @@ //======================================================================= Standard_Boolean ShapeProcess::Perform (const Handle(ShapeProcess_Context)& context, - const Standard_CString seq) + const Standard_CString seq, + const Message_ProgressRange& theProgress) { context->SetScope ( seq ); @@ -107,8 +109,11 @@ // iterate on operators in the sequence Standard_Boolean isDone = Standard_False; - for (i=1; i<=sequenceOfOperators.Length(); i++) { + Message_ProgressScope aPS(theProgress, NULL, sequenceOfOperators.Length()); + for (i = 1; i<=sequenceOfOperators.Length() && aPS.More(); i++) + { oper = sequenceOfOperators.Value(i); + Message_ProgressRange aRange = aPS.Next(); if ( context->TraceLevel() >=2 ) { Message_Msg SMSG5 ("SP.Sequence.Info.Operator"); //Operator %d/%d: %s @@ -128,7 +133,7 @@ context->SetScope ( oper.ToCString() ); try { OCC_CATCH_SIGNALS - if ( op->Perform(context) ) + if (op->Perform(context, aRange)) isDone = Standard_True; } catch (Standard_Failure const& anException) { diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess.hxx opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess.hxx --- opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -22,6 +22,8 @@ #include #include +#include + class ShapeProcess_Operator; class ShapeProcess_Context; class ShapeProcess_Context; @@ -52,7 +54,10 @@ //! Performs a specified sequence of operators on Context //! Resource file and other data should be already loaded //! to Context (including description of sequence seq) - Standard_EXPORT static Standard_Boolean Perform (const Handle(ShapeProcess_Context)& context, const Standard_CString seq); + Standard_EXPORT static Standard_Boolean Perform + (const Handle(ShapeProcess_Context)& context, + const Standard_CString seq, + const Message_ProgressRange& theProgress = Message_ProgressRange()); diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_Operator.hxx opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_Operator.hxx --- opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_Operator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_Operator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,9 +21,9 @@ #include #include -class ShapeProcess_Context; - +#include +class ShapeProcess_Context; class ShapeProcess_Operator; DEFINE_STANDARD_HANDLE(ShapeProcess_Operator, Standard_Transient) @@ -37,7 +37,9 @@ //! Performs operation and eventually records //! changes in the context - Standard_EXPORT virtual Standard_Boolean Perform (const Handle(ShapeProcess_Context)& context) = 0; + Standard_EXPORT virtual Standard_Boolean Perform + (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange& theProgress = Message_ProgressRange()) = 0; diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_OperFunc.hxx opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_OperFunc.hxx --- opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_OperFunc.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_OperFunc.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,9 @@ #include -typedef Standard_Boolean (*ShapeProcess_OperFunc) (const Handle(ShapeProcess_Context)& context); +class Message_ProgressRange; + +typedef Standard_Boolean (*ShapeProcess_OperFunc) (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange& theProgress); #endif diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_OperLibrary.cxx opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_OperLibrary.cxx --- opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_OperLibrary.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_OperLibrary.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #include @@ -109,7 +109,8 @@ //purpose : //======================================================================= -static Standard_Boolean directfaces (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean directfaces (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -133,7 +134,8 @@ //purpose : //======================================================================= -static Standard_Boolean sameparam (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean sameparam (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -145,7 +147,7 @@ ShapeFix::SameParameter ( ctx->Result(), ctx->BooleanVal ( "Force", Standard_False ), ctx->RealVal ( "Tolerance3d", Precision::Confusion() /* -1 */), - NULL, msg ); + Message_ProgressRange(), msg ); if ( !msg.IsNull() ) { @@ -162,7 +164,8 @@ //purpose : //======================================================================= -static Standard_Boolean settol (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean settol (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -192,7 +195,8 @@ //purpose : //======================================================================= -static Standard_Boolean splitangle (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean splitangle (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -223,7 +227,8 @@ //purpose : //======================================================================= -static Standard_Boolean bsplinerestriction (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean bsplinerestriction (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -286,7 +291,8 @@ //purpose : //======================================================================= -static Standard_Boolean torevol (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean torevol (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -310,7 +316,8 @@ //purpose : //======================================================================= -static Standard_Boolean swepttoelem (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean swepttoelem (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -334,7 +341,8 @@ //purpose : //======================================================================= -static Standard_Boolean shapetobezier (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean shapetobezier (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -398,7 +406,8 @@ //purpose : //======================================================================= -static Standard_Boolean converttobspline (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean converttobspline (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -430,7 +439,8 @@ //purpose : Split by Continuity //======================================================================= -static Standard_Boolean splitcontinuity (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean splitcontinuity (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -474,7 +484,8 @@ //purpose : //======================================================================= -static Standard_Boolean splitclosedfaces (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean splitclosedfaces (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -516,7 +527,8 @@ //purpose : //======================================================================= -static Standard_Boolean fixfacesize (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean fixfacesize (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -551,7 +563,8 @@ //purpose : //======================================================================= -static Standard_Boolean fixwgaps (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean fixwgaps (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -582,7 +595,8 @@ //purpose : //======================================================================= -static Standard_Boolean dropsmallsolids (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean dropsmallsolids (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast (context); @@ -656,7 +670,8 @@ //purpose : //======================================================================= -static Standard_Boolean mergesmalledges (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean mergesmalledges (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -685,7 +700,8 @@ //purpose : //======================================================================= -static Standard_Boolean fixshape (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean fixshape (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange& theProgress) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; @@ -758,13 +774,14 @@ sfw->FixSelfIntersectingEdgeMode() = ctx->IntegerVal ( "FixSelfIntersectingEdgeMode", -1 ); sfw->FixIntersectingEdgesMode() = ctx->IntegerVal ( "FixIntersectingEdgesMode", -1 ); sfw->FixNonAdjacentIntersectingEdgesMode() = ctx->IntegerVal ( "FixNonAdjacentIntersectingEdgesMode", -1 ); + Message_ProgressScope aPS(theProgress, NULL, 2); if (sfw->FixTailMode() == 1) { sfw->FixTailMode() = 0; sfs->Init(ctx->Result()); - sfs->Perform(ctx->Progress()); + sfs->Perform (aPS.Next()); sfw->FixTailMode() = 1; - if (!ctx->Progress().IsNull() && ctx->Progress()->UserBreak()) + if (aPS.UserBreak()) { return Standard_False; } @@ -779,8 +796,8 @@ } sfs->Init(ctx->Result()); - sfs->Perform(ctx->Progress()); - if (!ctx->Progress().IsNull() && ctx->Progress()->UserBreak()) + sfs->Perform (aPS.Next()); + if (aPS.UserBreak()) { return Standard_False; } @@ -801,7 +818,8 @@ //purpose : //======================================================================= -static Standard_Boolean spltclosededges (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean spltclosededges (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); @@ -836,7 +854,8 @@ // and isn't valid in STEP => before writing into STEP it is necessary // to split this vertex (each wire must has one vertex) //======================================================================= -static Standard_Boolean splitcommonvertex (const Handle(ShapeProcess_Context)& context) +static Standard_Boolean splitcommonvertex (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange&) { Handle(ShapeProcess_ShapeContext) ctx = Handle(ShapeProcess_ShapeContext)::DownCast ( context ); if ( ctx.IsNull() ) return Standard_False; diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_UOperator.cxx opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_UOperator.cxx --- opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_UOperator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_UOperator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,7 +33,8 @@ //purpose : //======================================================================= -Standard_Boolean ShapeProcess_UOperator::Perform (const Handle(ShapeProcess_Context)& context) +Standard_Boolean ShapeProcess_UOperator::Perform (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange& theProgress) { - return myFunc ( context ); + return myFunc(context, theProgress); } diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_UOperator.hxx opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_UOperator.hxx --- opencascade-7.4.1+dfsg1/src/ShapeProcess/ShapeProcess_UOperator.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcess/ShapeProcess_UOperator.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,7 +42,9 @@ Standard_EXPORT ShapeProcess_UOperator(const ShapeProcess_OperFunc func); //! Performs operation and records changes in the context - Standard_EXPORT virtual Standard_Boolean Perform (const Handle(ShapeProcess_Context)& context) Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Boolean Perform + (const Handle(ShapeProcess_Context)& context, + const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcessAPI/ShapeProcessAPI_ApplySequence.cxx opencascade-7.5.1+dfsg1/src/ShapeProcessAPI/ShapeProcessAPI_ApplySequence.cxx --- opencascade-7.4.1+dfsg1/src/ShapeProcessAPI/ShapeProcessAPI_ApplySequence.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcessAPI/ShapeProcessAPI_ApplySequence.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -61,7 +61,8 @@ TopoDS_Shape ShapeProcessAPI_ApplySequence::PrepareShape(const TopoDS_Shape& shape, const Standard_Boolean /*fillmap*/, - const TopAbs_ShapeEnum /*until*/) + const TopAbs_ShapeEnum /*until*/, + const Message_ProgressRange& theProgress) { if (shape.IsNull()) return shape; @@ -71,7 +72,7 @@ TCollection_AsciiString str(mySeq); str += ".exec.op"; if ( rsc->Find ( str.ToCString() ) ) { - ShapeProcess::Perform ( myContext, mySeq.ToCString() ); + ShapeProcess::Perform(myContext, mySeq.ToCString(), theProgress); } return myContext->Result(); @@ -122,29 +123,29 @@ // mapping Message_Msg EPMSG100 ("PrResult.Print.MSG100"); //Mapping: - aMessenger->Send (EPMSG100, Message_Info, Standard_True); + aMessenger->Send (EPMSG100, Message_Info); Message_Msg TPMSG50 ("PrResult.Print.MSG50"); // Shells: - aMessenger->Send (TPMSG50, Message_Info, Standard_True); + aMessenger->Send (TPMSG50, Message_Info); Message_Msg EPMSG110 ("PrResult.Print.MSG110"); // Result is Shell : %d EPMSG110.Arg (SS); - aMessenger->Send (EPMSG110, Message_Info, Standard_True); + aMessenger->Send (EPMSG110, Message_Info); Message_Msg EPMSG150 ("PrResult.Print.MSG150"); // No Result : %d EPMSG150.Arg (SN); - aMessenger->Send (EPMSG150, Message_Info, Standard_True); + aMessenger->Send (EPMSG150, Message_Info); TCollection_AsciiString tmp110 (EPMSG110.Original()), tmp150 (EPMSG150.Original()); EPMSG110.Set (tmp110.ToCString()); EPMSG150.Set (tmp150.ToCString()); Message_Msg TPMSG55 ("PrResult.Print.MSG55"); // Faces: - aMessenger->Send (TPMSG55, Message_Info, Standard_True); + aMessenger->Send (TPMSG55, Message_Info); Message_Msg EPMSG115 ("PrResult.Print.MSG115"); // Result is Face : %d EPMSG115.Arg (FF); - aMessenger->Send (EPMSG115, Message_Info, Standard_True); + aMessenger->Send (EPMSG115, Message_Info); EPMSG110.Arg (FS); - aMessenger->Send (EPMSG110, Message_Info, Standard_True); + aMessenger->Send (EPMSG110, Message_Info); EPMSG150.Arg (FN); - aMessenger->Send (EPMSG150, Message_Info, Standard_True); + aMessenger->Send (EPMSG150, Message_Info); // preparation ratio Standard_Real SPR = 1, FPR = 1; @@ -153,12 +154,12 @@ if (NbS > 0) SPR = 1. * (NbS - SN) / NbS; if (NbF > 0) FPR = 1. * (NbF - FN) / NbF; Message_Msg PMSG200 ("PrResult.Print.MSG200"); //Preparation ratio: - aMessenger->Send (PMSG200, Message_Info, Standard_True); + aMessenger->Send (PMSG200, Message_Info); Message_Msg PMSG205 ("PrResult.Print.MSG205"); // Shells: %d per cent PMSG205.Arg ((Standard_Integer) (100 * SPR)); - aMessenger->Send (PMSG205, Message_Info, Standard_True); + aMessenger->Send (PMSG205, Message_Info); Message_Msg PMSG210 ("PrResult.Print.MSG210"); // Faces : %d per cent PMSG210.Arg ((Standard_Integer) (100 * FPR)); - aMessenger->Send (PMSG210, Message_Info, Standard_True); + aMessenger->Send (PMSG210, Message_Info); } diff -Nru opencascade-7.4.1+dfsg1/src/ShapeProcessAPI/ShapeProcessAPI_ApplySequence.hxx opencascade-7.5.1+dfsg1/src/ShapeProcessAPI/ShapeProcessAPI_ApplySequence.hxx --- opencascade-7.4.1+dfsg1/src/ShapeProcessAPI/ShapeProcessAPI_ApplySequence.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeProcessAPI/ShapeProcessAPI_ApplySequence.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,10 +26,11 @@ #include #include #include +#include + class ShapeProcess_ShapeContext; class TopoDS_Shape; - //! Applies one of the sequence read from resource file. class ShapeProcessAPI_ApplySequence { @@ -50,7 +51,10 @@ //! If is True adds history "shape-shape" into myMap //! for shape and its subshapes until level (included). //! If is TopAbs_SHAPE, all the subshapes are considered. - Standard_EXPORT TopoDS_Shape PrepareShape (const TopoDS_Shape& shape, const Standard_Boolean fillmap = Standard_False, const TopAbs_ShapeEnum until = TopAbs_SHAPE); + Standard_EXPORT TopoDS_Shape PrepareShape (const TopoDS_Shape& shape, + const Standard_Boolean fillmap = Standard_False, + const TopAbs_ShapeEnum until = TopAbs_SHAPE, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Clears myMap with accumulated history. Standard_EXPORT void ClearMap(); diff -Nru opencascade-7.4.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_SplitCurve.cxx opencascade-7.5.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_SplitCurve.cxx --- opencascade-7.4.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_SplitCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_SplitCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,9 @@ //function : ShapeUpgrade_SplitCurve //purpose : //======================================================================= -ShapeUpgrade_SplitCurve::ShapeUpgrade_SplitCurve() : myStatus(0) +ShapeUpgrade_SplitCurve::ShapeUpgrade_SplitCurve() +: myNbCurves(0), + myStatus(0) { } diff -Nru opencascade-7.4.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_SplitSurfaceContinuity.cxx opencascade-7.5.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_SplitSurfaceContinuity.cxx --- opencascade-7.4.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_SplitSurfaceContinuity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_SplitSurfaceContinuity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,6 +40,7 @@ //purpose : //======================================================================= ShapeUpgrade_SplitSurfaceContinuity::ShapeUpgrade_SplitSurfaceContinuity() +: myCont(0) { myCriterion = GeomAbs_C1; myTolerance = Precision::Confusion(); @@ -176,7 +177,7 @@ default : case GeomAbs_C1 : BasCriterion = GeomAbs_C2; break; case GeomAbs_C2 : BasCriterion = GeomAbs_C3; break; - case GeomAbs_C3 : //if (ShapeUpgrade::Debug()) std::cout<<". this criterion is not suitable for a Offset Surface"< #include #include +#include +#include +#include +#include +#include +#include IMPLEMENT_STANDARD_RTTIEXT(ShapeUpgrade_UnifySameDomain,Standard_Transient) @@ -489,8 +495,9 @@ const TopoDS_Face& theFrefFace, const TopoDS_Vertex& theCurVertex, const gp_Pnt2d& theCurPoint, - const Standard_Real theUperiod, - const Standard_Real theFaceUmin, + const Standard_Real thePeriod, + const Standard_Real theFaceCoordMin, + const Standard_Boolean theIsU, const Standard_Real theCoordTol, TopoDS_Edge& theNextEdge, TopoDS_Wire& theNewWire, @@ -501,16 +508,24 @@ { Handle(Geom_Surface) RefSurf = BRep_Tool::Surface(theFrefFace); - GeomAbs_Shape aContinuity = (RefSurf->IsUPeriodic())? GeomAbs_CN : GeomAbs_C0; + GeomAbs_Shape aContinuity; + if (theIsU) + aContinuity = (RefSurf->IsUPeriodic())? GeomAbs_CN : GeomAbs_C0; + else + aContinuity = (RefSurf->IsVPeriodic())? GeomAbs_CN : GeomAbs_C0; + + Standard_Integer IndCoord = theIsU? 1 : 2; - Standard_Real Ydir = 1.; //up - if (Abs(theCurPoint.X() - theFaceUmin) <= theCoordTol) - Ydir = -1.; //down + Standard_Real SeamDir = 1.; //up or right + if (theIsU && Abs(theCurPoint.Coord(IndCoord) - theFaceCoordMin) <= theCoordTol) + SeamDir = -1.; //down + else if (!theIsU && Abs(theCurPoint.Coord(IndCoord) - theFaceCoordMin) > theCoordTol) + SeamDir = -1.; //left //Consider as the candidate to be next edge: - //only the edge that has first point with X-coordinate close to X-coordinate of theCurPoint - //Choose from candidates the edge that is closest to theCurPoint in the defined direction Ydir - Standard_Real MinDeltaY = RealLast(); + //only the edge that has first point with X(or Y)-coordinate close to X(or Y)-coordinate of theCurPoint + //Choose from candidates the edge that is closest to theCurPoint in the defined direction SeamDir + Standard_Real MinDeltaSeamCoord = RealLast(); for (Standard_Integer ind = 1; ind <= theEdges.Length(); ind++) { const TopoDS_Edge& aCandidate = TopoDS::Edge(theEdges(ind)); @@ -520,17 +535,17 @@ Standard_Real CandParam = (aCandidate.Orientation() == TopAbs_FORWARD)? BAcurve2d.FirstParameter() : BAcurve2d.LastParameter(); gp_Pnt2d CandPoint = BAcurve2d.Value(CandParam); - Standard_Real DeltaX = Abs(CandPoint.X() - theCurPoint.X()); - if (DeltaX > theCoordTol) + Standard_Real DeltaCoord = Abs(CandPoint.Coord(IndCoord) - theCurPoint.Coord(IndCoord)); + if (DeltaCoord > theCoordTol) continue; - Standard_Real DeltaY = CandPoint.Y() - theCurPoint.Y(); - DeltaY *= Ydir; - if (DeltaY < 0.) //on the other side from CurPoint + Standard_Real DeltaSeamCoord = CandPoint.Coord(3-IndCoord) - theCurPoint.Coord(3-IndCoord); + DeltaSeamCoord *= SeamDir; + if (DeltaSeamCoord < 0.) //on the other side from CurPoint continue; - if (DeltaY < MinDeltaY) + if (DeltaSeamCoord < MinDeltaSeamCoord) { - MinDeltaY = DeltaY; + MinDeltaSeamCoord = DeltaSeamCoord; theNextEdge = aCandidate; theStartOfNextEdge = CandPoint; } @@ -539,58 +554,68 @@ //Build missed seam edge theLastVertexOfSeam = TopExp::FirstVertex(theNextEdge, Standard_True); //with orientation TopoDS_Vertex V1, V2; - Standard_Real Param1, Param2, anU = 0.; - Handle(Geom_Curve) Uiso; + Standard_Real Param1, Param2, aCoord = 0.; + Handle(Geom_Curve) Iso; TopoDS_Edge aRemovedEdge; //try to find it in for (Standard_Integer i = 1; i <= theRemovedEdges.Length(); i++) { const TopoDS_Edge& anEdge = TopoDS::Edge(theRemovedEdges(i)); + Handle(Geom2d_Curve) aPC = BRep_Tool::CurveOnSurface(anEdge, theFrefFace, Param1, Param2); + if (aPC.IsNull()) + continue; + + GeomAbs_Shape aContOnRefFace = BRep_Tool::Continuity(anEdge, theFrefFace, theFrefFace); + if (aContOnRefFace > aContinuity) + aContinuity = aContOnRefFace; + TopoDS_Vertex aV1, aV2; TopExp::Vertices(anEdge, aV1, aV2); if ((aV1.IsSame(theCurVertex) && aV2.IsSame(theLastVertexOfSeam)) || (aV1.IsSame(theLastVertexOfSeam) && aV2.IsSame(theCurVertex))) { - Handle(Geom2d_Curve) aPC = BRep_Tool::CurveOnSurface(anEdge, theFrefFace, Param1, Param2); - if (!aPC.IsNull()) - { - aRemovedEdge = anEdge; - break; - } + aRemovedEdge = anEdge; + break; } } if (aRemovedEdge.IsNull()) { Standard_Real CurTol = BRep_Tool::Tolerance(theCurVertex); Standard_Real LastTol = BRep_Tool::Tolerance(theLastVertexOfSeam); - anU = (CurTol < LastTol)? theCurPoint.X() : theStartOfNextEdge.X(); - Uiso = RefSurf->UIso(anU); - if (Ydir > 0) + aCoord = (CurTol < LastTol)? theCurPoint.Coord(IndCoord) : theStartOfNextEdge.Coord(IndCoord); + Iso = (theIsU)? RefSurf->UIso(aCoord) : RefSurf->VIso(aCoord); + if (SeamDir > 0) { V1 = theCurVertex; V2 = theLastVertexOfSeam; - Param1 = theCurPoint.Y(); Param2 = theStartOfNextEdge.Y(); + Param1 = theCurPoint.Coord(3-IndCoord); Param2 = theStartOfNextEdge.Coord(3-IndCoord); } else { V1 = theLastVertexOfSeam; V2 = theCurVertex; - Param1 = theStartOfNextEdge.Y(); Param2 = theCurPoint.Y(); + Param1 = theStartOfNextEdge.Coord(3-IndCoord); Param2 = theCurPoint.Coord(3-IndCoord); } } else { TopExp::Vertices(aRemovedEdge, V1, V2); - Uiso = BRep_Tool::Curve(aRemovedEdge, Param1, Param2); + Iso = BRep_Tool::Curve(aRemovedEdge, Param1, Param2); } - TopoDS_Edge MissedSeam = BRepLib_MakeEdge(Uiso, V1, V2, Param1, Param2); + TopoDS_Edge MissedSeam = BRepLib_MakeEdge(Iso, V1, V2, Param1, Param2); BRep_Builder BB; - gp_Vec2d Offset(theUperiod, 0.); + //gp_Vec2d Offset(theUperiod, 0.); + gp_Vec2d Offset; + if (theIsU) + Offset.SetCoord(thePeriod, 0.); + else + Offset.SetCoord(0., thePeriod); if (aRemovedEdge.IsNull()) { - Standard_Real Vorigin = 0.; + Standard_Real SeamCoordOrigin = 0.; //Correct Param1 and Param2 if needed: - //when Uiso-curve is periodic and Param1 and Param2 do not fit into V-range of surface, + //when iso-curve is periodic and Param1 and Param2 do not fit into SeamCoord-range of surface, + //(for example, V-range of sphere) //BRepLib_MakeEdge may shift Param1 and Param2 Standard_Real InitialParam1 = Param1, InitialParam2 = Param2; Handle(Geom_Curve) MissedCurve = BRep_Tool::Curve(MissedSeam, Param1, Param2); @@ -598,21 +623,29 @@ MissedCurve->IsPeriodic()) { //Vorigin = -(MissedCurve->Period()); - Vorigin = -(Param1 - InitialParam1); + SeamCoordOrigin = -(Param1 - InitialParam1); } ///////////////////////////////////// - Handle(Geom2d_Line) PC1 = new Geom2d_Line(gp_Pnt2d(anU, Vorigin), gp_Dir2d(0., 1.)); + //Handle(Geom2d_Line) PC1 = new Geom2d_Line(gp_Pnt2d(anU, Vorigin), gp_Dir2d(0., 1.)); + Handle(Geom2d_Line) PC1; + if (theIsU) + PC1 = new Geom2d_Line(gp_Pnt2d(aCoord, SeamCoordOrigin), gp_Dir2d(0., 1.)); + else + PC1 = new Geom2d_Line(gp_Pnt2d(SeamCoordOrigin, aCoord), gp_Dir2d(1., 0.)); + Handle(Geom2d_Curve) PC2 = Handle(Geom2d_Curve)::DownCast(PC1->Copy()); - if (Ydir > 0) + if (theIsU && SeamDir > 0) + Offset *= -1; + else if (!theIsU && SeamDir < 0) Offset *= -1; PC2->Translate(Offset); - if (Ydir > 0) + if (SeamDir > 0) BB.UpdateEdge(MissedSeam, PC1, PC2, theFrefFace, 0.); else BB.UpdateEdge(MissedSeam, PC2, PC1, theFrefFace, 0.); - if (Ydir < 0) + if (SeamDir < 0) MissedSeam.Reverse(); } else @@ -625,19 +658,19 @@ Standard_Boolean IsSeam = (PC1 != PC2); if (!IsSeam) //it was not a seam { - anU = theCurPoint.X(); + aCoord = theCurPoint.Coord(IndCoord); gp_Pnt2d PointOnRemovedEdge = PC1->Value(Param1); - Standard_Real Uremovededge = PointOnRemovedEdge.X(); - if (Abs(anU - Uremovededge) > theUperiod/2) + Standard_Real CoordOfRemovededge = PointOnRemovedEdge.Coord(IndCoord); + if (Abs(aCoord - CoordOfRemovededge) > thePeriod/2) { - Standard_Real Sign = (anU > Uremovededge)? 1 : -1; + Standard_Real Sign = (aCoord > CoordOfRemovededge)? 1 : -1; Offset *= Sign; PC1 = Handle(Geom2d_Curve)::DownCast(PC2->Copy()); PC1->Translate(Offset); } else { - if (Ydir > 0) + if (SeamDir > 0) Offset *= -1; PC2 = Handle(Geom2d_Curve)::DownCast(PC1->Copy()); PC2->Translate(Offset); @@ -669,6 +702,142 @@ } //======================================================================= +//function : SameSurf +//purpose : auxilary +//======================================================================= +static Standard_Boolean SameSurf(const Handle(Geom_Surface)& theS1, const Handle(Geom_Surface)& theS2) +{ + static Standard_Real aCoefs[2] = { 0.3399811, 0.7745966 }; + + Standard_Real uf1, ul1, vf1, vl1, uf2, ul2, vf2, vl2; + theS1->Bounds(uf1, ul1, vf1, vl1); + theS2->Bounds(uf2, ul2, vf2, vl2); + Standard_Real aPTol = Precision::PConfusion(); + if (Precision::IsNegativeInfinite(uf1)) + { + if (!Precision::IsNegativeInfinite(uf2)) + { + return Standard_False; + } + else + { + uf1 = Min(-1., (ul1 - 1.)); + } + } + else + { + if (Precision::IsNegativeInfinite(uf2)) + { + return Standard_False; + } + else + { + if (Abs(uf1 - uf2) > aPTol) + { + return Standard_False; + } + } + } + // + if (Precision::IsNegativeInfinite(vf1)) + { + if (!Precision::IsNegativeInfinite(vf2)) + { + return Standard_False; + } + else + { + vf1 = Min(-1., (vl1 - 1.)); + } + } + else + { + if (Precision::IsNegativeInfinite(vf2)) + { + return Standard_False; + } + else + { + if (Abs(vf1 - vf2) > aPTol) + { + return Standard_False; + } + } + } + // + if (Precision::IsPositiveInfinite(ul1)) + { + if (!Precision::IsPositiveInfinite(ul2)) + { + return Standard_False; + } + else + { + ul1 = Max(1., (uf1 + 1.)); + } + } + else + { + if (Precision::IsPositiveInfinite(ul2)) + { + return Standard_False; + } + else + { + if (Abs(ul1 - ul2) > aPTol) + { + return Standard_False; + } + } + } + // + if (Precision::IsPositiveInfinite(vl1)) + { + if (!Precision::IsPositiveInfinite(vl2)) + { + return Standard_False; + } + else + { + vl1 = Max(1., (vf1 + 1.)); + } + } + else + { + if (Precision::IsPositiveInfinite(vl2)) + { + return Standard_False; + } + else + { + if (Abs(vl1 - vl2) > aPTol) + { + return Standard_False; + } + } + } + // + + Standard_Real u, v, du = (ul1 - uf1), dv = (vl1 - vf1); + Standard_Integer i, j; + for (i = 0; i < 2; ++i) + { + u = uf1 + aCoefs[i] * du; + for (j = 0; j < 2; ++j) + { + v = vf1 + aCoefs[j] * dv; + gp_Pnt aP1 = theS1->Value(u, v); + gp_Pnt aP2 = theS2->Value(u, v); + if (!aP1.IsEqual(aP2, aPTol)) + { + return Standard_False; + } + } + } + + return Standard_True; +} +//======================================================================= //function : TransformPCurves //purpose : auxilary //======================================================================= @@ -685,9 +854,13 @@ SurfFace = (Handle(Geom_RectangularTrimmedSurface)::DownCast(SurfFace))->BasisSurface(); Standard_Boolean ToModify = Standard_False, - ToTranslate = Standard_False, Y_Reverse = Standard_False; + ToTranslate = Standard_False, + ToRotate = Standard_False, + X_Reverse = Standard_False, + Y_Reverse = Standard_False, + ToProject = Standard_False; - gp_Vec2d Translation(0.,0.); + Standard_Real aTranslation = 0., anAngle = 0.; //Get axes of surface of face and of surface of RefFace Handle(Geom_ElementarySurface) ElemSurfFace = Handle(Geom_ElementarySurface)::DownCast(SurfFace); @@ -703,27 +876,44 @@ Standard_Real aParam = ElCLib::LineParameter(AxisOfSurfFace.Axis(), OriginRefSurf); if (Abs(aParam) > Precision::PConfusion()) - Translation.SetY(-aParam); + aTranslation = -aParam; gp_Dir VdirSurfFace = AxisOfSurfFace.Direction(); gp_Dir VdirRefSurf = AxisOfRefSurf.Direction(); gp_Dir XdirSurfFace = AxisOfSurfFace.XDirection(); gp_Dir XdirRefSurf = AxisOfRefSurf.XDirection(); - Standard_Real anAngle = XdirRefSurf.AngleWithRef(XdirSurfFace, VdirRefSurf); - if (!AxisOfRefSurf.Direct()) - anAngle *= -1; - - if (Abs(anAngle) > Precision::PConfusion()) - Translation.SetX(anAngle); + gp_Dir CrossProd1 = AxisOfRefSurf.XDirection() ^ AxisOfRefSurf.YDirection(); + gp_Dir CrossProd2 = AxisOfSurfFace.XDirection() ^ AxisOfSurfFace.YDirection(); + if (CrossProd1 * CrossProd2 < 0.) + X_Reverse = Standard_True; Standard_Real ScalProd = VdirSurfFace * VdirRefSurf; if (ScalProd < 0.) Y_Reverse = Standard_True; - ToTranslate = !(Translation.XY().IsEqual(gp_XY(0.,0.), Precision::PConfusion())); + if (!X_Reverse && !Y_Reverse) + { + gp_Dir DirRef = VdirRefSurf; + if (!AxisOfRefSurf.Direct()) + DirRef.Reverse(); + anAngle = XdirRefSurf.AngleWithRef(XdirSurfFace, DirRef); + } + else + anAngle = XdirRefSurf.Angle(XdirSurfFace); + + ToRotate = (Abs(anAngle) > Precision::PConfusion()); - ToModify = ToTranslate || Y_Reverse; + ToTranslate = (Abs(aTranslation) > Precision::PConfusion()); + + ToModify = ToTranslate || ToRotate || X_Reverse || Y_Reverse; + } + else + { + if (!SameSurf(RefSurf, SurfFace)) + { + ToProject = Standard_True; + } } BRep_Builder BB; @@ -738,15 +928,35 @@ Standard_Real fpar, lpar; Handle(Geom2d_Curve) PCurveOnRef = BRep_Tool::CurveOnSurface(anEdge, theRefFace, fpar, lpar); - if (!PCurveOnRef.IsNull() && !ToModify) + if (!PCurveOnRef.IsNull() && !(ToModify || ToProject)) continue; Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(anEdge, theFace, fpar, lpar); - Handle(Geom2d_Curve) aNewPCurve = Handle(Geom2d_Curve)::DownCast(aPCurve->Copy()); + Handle(Geom2d_Curve) aNewPCurve; + if (ToProject) + { + Handle(Geom_Curve) aC3d = BRep_Tool::Curve(anEdge, fpar, lpar); + aC3d = new Geom_TrimmedCurve(aC3d, fpar, lpar); + Standard_Real tol = BRep_Tool::Tolerance(anEdge); + tol = Min(tol, Precision::Approximation()); + aNewPCurve = + GeomProjLib::Curve2d(aC3d, RefSurf); + } + else + { + aNewPCurve = Handle(Geom2d_Curve)::DownCast(aPCurve->Copy()); + } if (ToTranslate) - aNewPCurve->Translate(Translation); + aNewPCurve->Translate(gp_Vec2d(0., aTranslation)); if (Y_Reverse) aNewPCurve->Mirror(gp::OX2d()); + if (X_Reverse) + { + aNewPCurve->Mirror(gp::OY2d()); + aNewPCurve->Translate(gp_Vec2d(2*M_PI, 0.)); + } + if (ToRotate) + aNewPCurve->Translate(gp_Vec2d(anAngle, 0.)); theMapEdgesWithTemporaryPCurves.Add(anEdge); @@ -955,7 +1165,8 @@ static Standard_Boolean IsSameDomain(const TopoDS_Face& aFace, const TopoDS_Face& aCheckedFace, const Standard_Real theLinTol, - const Standard_Real theAngTol) + const Standard_Real theAngTol, + ShapeUpgrade_UnifySameDomain::DataMapOfFacePlane& theFacePlaneMap) { //checking the same handles TopLoc_Location L1, L2; @@ -989,7 +1200,19 @@ gp_Pln aPln2 = aPlanarityChecker2.Plan(); if (aPln1.Position().Direction().IsParallel(aPln2.Position().Direction(), theAngTol) && - aPln1.Distance(aPln2) < theLinTol) { + aPln1.Distance(aPln2) < theLinTol) + { + Handle(Geom_Plane) aPlaneOfFaces; + if (theFacePlaneMap.IsBound(aFace)) + aPlaneOfFaces = theFacePlaneMap(aFace); + else if (theFacePlaneMap.IsBound(aCheckedFace)) + aPlaneOfFaces = theFacePlaneMap(aCheckedFace); + else + aPlaneOfFaces = new Geom_Plane(aPln1); + + theFacePlaneMap.Bind(aFace, aPlaneOfFaces); + theFacePlaneMap.Bind(aCheckedFace, aPlaneOfFaces); + return Standard_True; } } @@ -1919,6 +2142,7 @@ myContext->Clear(); myKeepShapes.Clear(); + myFacePlaneMap.Clear(); myHistory->Clear(); } @@ -2053,7 +2277,7 @@ // surface and location to construct result TopLoc_Location aBaseLocation; - Handle(Geom_Surface) aBaseSurface = BRep_Tool::Surface(aFace,aBaseLocation); + Handle(Geom_Surface) aBaseSurface = BRep_Tool::Surface(aFace); aBaseSurface = ClearRts(aBaseSurface); TopAbs_Orientation RefFaceOrientation = aFace.Orientation(); @@ -2066,6 +2290,7 @@ //these edges may be updated by temporary pcurves Standard_Real Uperiod = (aBaseSurface->IsUPeriodic())? aBaseSurface->UPeriod() : 0.; + Standard_Real Vperiod = (aBaseSurface->IsVPeriodic())? aBaseSurface->VPeriod() : 0.; // find adjacent faces to union Standard_Integer i; @@ -2125,7 +2350,7 @@ } } // - if (IsSameDomain(aFace,aCheckedFace, myLinTol, myAngTol)) { + if (IsSameDomain(aFace,aCheckedFace, myLinTol, myAngTol, myFacePlaneMap)) { if (AddOrdinaryEdges(edges, aCheckedFace, dummy, RemovedEdges)) { // sequence edges is modified @@ -2140,6 +2365,12 @@ } if (faces.Length() > 1) { + if (myFacePlaneMap.IsBound(faces(1))) + { + const Handle(Geom_Plane)& aPlane = myFacePlaneMap(faces(1)); + TopLoc_Location aLoc; + BB.UpdateFace(RefFace, aPlane, aLoc, Precision::Confusion()); + } //Add correct pcurves for the reference surface to the edges of other faces TopoDS_Face F_RefFace = RefFace; F_RefFace.Orientation(TopAbs_FORWARD); @@ -2280,6 +2511,10 @@ if (faces.Length() > 1) { Standard_Real CoordTol = Precision::Confusion(); + TopTools_MapOfShape edgesMap; + CoordTol = ComputeMinEdgeSize(edges, F_RefFace, edgesMap); + CoordTol /= 10.; + CoordTol = Max(CoordTol, Precision::Confusion()); TopTools_IndexedDataMapOfShapeListOfShape VEmap; for (Standard_Integer ind = 1; ind <= edges.Length(); ind++) @@ -2289,11 +2524,6 @@ //Define boundaries in 2d space of RefFace if (Uperiod != 0.) { - TopTools_MapOfShape edgesMap; - CoordTol = ComputeMinEdgeSize(edges, F_RefFace, edgesMap); - CoordTol /= 10.; - CoordTol = Max(CoordTol, Precision::Confusion()); - //try to find a real seam edge - if it exists, do nothing Standard_Boolean SeamFound = Standard_False; for (Standard_Integer ii = 1; ii <= faces.Length(); ii++) @@ -2395,32 +2625,41 @@ TopTools_SequenceOfShape NewFaces, NewWires; - if (Uperiod == 0) + if (Uperiod == 0 || Vperiod == 0) { - //Set the "period" for closed non-periodic surface + //Set the "periods" for closed non-periodic surface TopLoc_Location aLoc; Handle(Geom_Surface) aSurf = BRep_Tool::Surface(RefFace, aLoc); if (aSurf->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) aSurf = (Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurf))->BasisSurface(); Standard_Real Ufirst, Ulast, Vfirst, Vlast; aSurf->Bounds(Ufirst, Ulast, Vfirst, Vlast); - if (aSurf->IsUClosed()) + if (Uperiod == 0 && aSurf->IsUClosed()) Uperiod = Ulast - Ufirst; + if (Vperiod == 0 && aSurf->IsVClosed()) + Vperiod = Vlast - Vfirst; } TopTools_MapOfShape UsedEdges; Standard_Real FaceUmin = RealLast(); + Standard_Real FaceVmin = RealLast(); for (Standard_Integer ii = 1; ii <= edges.Length(); ii++) { const TopoDS_Edge& anEdge = TopoDS::Edge(edges(ii)); BRepAdaptor_Curve2d aBAcurve(anEdge, F_RefFace); gp_Pnt2d aFirstPoint = aBAcurve.Value(aBAcurve.FirstParameter()); gp_Pnt2d aLastPoint = aBAcurve.Value(aBAcurve.LastParameter()); + if (aFirstPoint.X() < FaceUmin) FaceUmin = aFirstPoint.X(); if (aLastPoint.X() < FaceUmin) FaceUmin = aLastPoint.X(); + + if (aFirstPoint.Y() < FaceVmin) + FaceVmin = aFirstPoint.Y(); + if (aLastPoint.Y() < FaceVmin) + FaceVmin = aLastPoint.Y(); } //Building new wires from @@ -2478,7 +2717,18 @@ gp_Pnt2d StartOfNextEdge; TopoDS_Vertex LastVertexOfSeam; ReconstructMissedSeam(edges, RemovedEdges, UsedEdges, F_RefFace, CurVertex, - CurPoint, Uperiod, FaceUmin, CoordTol, + CurPoint, Uperiod, FaceUmin, Standard_True, CoordTol, + NextEdge, aNewWire, NextPoint, + StartOfNextEdge, LastVertexOfSeam, VEmap); + } + else if (Vperiod != 0. && + Abs(StartPoint.Y() - CurPoint.Y()) > Vperiod/2) //end of parametric space + { + // do not contain seams => we must reconstruct the seam up to + gp_Pnt2d StartOfNextEdge; + TopoDS_Vertex LastVertexOfSeam; + ReconstructMissedSeam(edges, RemovedEdges, UsedEdges, F_RefFace, CurVertex, + CurPoint, Vperiod, FaceVmin, Standard_False, CoordTol, NextEdge, aNewWire, NextPoint, StartOfNextEdge, LastVertexOfSeam, VEmap); } @@ -2506,7 +2756,7 @@ TmpElist.Append(anEdge); } if (TmpElist.Extent() <= 1 || - Uperiod != 0.) + (Uperiod != 0. || Vperiod != 0)) TrueElist.Assign(TmpElist); else { @@ -2549,20 +2799,25 @@ Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface(anEdge, F_RefFace, fpar, lpar); Standard_Real aParam = (anEdge.Orientation() == TopAbs_FORWARD)? fpar : lpar; gp_Pnt2d aPoint = aPCurve->Value(aParam); - Standard_Real Diff = Abs(aPoint.X() - CurPoint.X()); + Standard_Real DiffU = Abs(aPoint.X() - CurPoint.X()); + Standard_Real DiffV = Abs(aPoint.Y() - CurPoint.Y()); if (Uperiod != 0. && - Diff > CoordTol && - Abs(Diff - Uperiod) > CoordTol) //may be is is a deg.vertex + DiffU > CoordTol && + Abs(DiffU - Uperiod) > CoordTol) //may be is is a deg.vertex + continue; + if (Vperiod != 0. && + DiffV > CoordTol && + Abs(DiffV - Vperiod) > CoordTol) //may be is is a deg.vertex continue; //Check: may be and are on Period from each other - if (Uperiod != 0. && Diff > Uperiod/2) //end of parametric space + if (Uperiod != 0. && DiffU > Uperiod/2) //end of parametric space { // do not contain seams => we must reconstruct the seam up to gp_Pnt2d StartOfNextEdge; TopoDS_Vertex LastVertexOfSeam; ReconstructMissedSeam(edges, RemovedEdges, UsedEdges, F_RefFace, CurVertex, - CurPoint, Uperiod, FaceUmin, CoordTol, + CurPoint, Uperiod, FaceUmin, Standard_True, CoordTol, NextEdge, aNewWire, NextPoint, StartOfNextEdge, LastVertexOfSeam, VEmap); @@ -2573,6 +2828,23 @@ break; } //if (Uperiod != 0. && Abs(aPoint.X() - CurPoint.X()) > Uperiod/2) + else if (Vperiod != 0. && DiffV > Vperiod/2) //end of parametric space + { + // do not contain seams => we must reconstruct the seam up to + gp_Pnt2d StartOfNextEdge; + TopoDS_Vertex LastVertexOfSeam; + ReconstructMissedSeam(edges, RemovedEdges, UsedEdges, F_RefFace, CurVertex, + CurPoint, Vperiod, FaceVmin, Standard_False, CoordTol, + NextEdge, aNewWire, NextPoint, + StartOfNextEdge, LastVertexOfSeam, VEmap); + + //Check: may be it is the end + if (LastVertexOfSeam.IsSame(StartVertex) && + Abs(StartPoint.Y() - StartOfNextEdge.Y()) < Vperiod/2) + EndOfWire = Standard_True; + + break; + } else { NextEdge = anEdge; diff -Nru opencascade-7.4.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.hxx opencascade-7.5.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.hxx --- opencascade-7.4.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/ShapeUpgrade/ShapeUpgrade_UnifySameDomain.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,6 +27,8 @@ #include #include #include +#include +#include class ShapeBuild_ReShape; class TopoDS_Shape; @@ -66,6 +68,9 @@ { public: + + typedef NCollection_DataMap DataMapOfFacePlane; + //! Empty constructor Standard_EXPORT ShapeUpgrade_UnifySameDomain(); @@ -177,6 +182,7 @@ TopoDS_Shape myShape; Handle(ShapeBuild_ReShape) myContext; TopTools_MapOfShape myKeepShapes; + DataMapOfFacePlane myFacePlaneMap; Handle(BRepTools_History) myHistory; //!< The history. }; diff -Nru opencascade-7.4.1+dfsg1/src/Standard/FILES opencascade-7.5.1+dfsg1/src/Standard/FILES --- opencascade-7.4.1+dfsg1/src/Standard/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -33,6 +33,7 @@ Standard_ExtString.hxx Standard_Failure.cxx Standard_Failure.hxx +Standard_WarningDisableFunctionCast.hxx Standard_GUID.cxx Standard_GUID.hxx Standard_Handle.hxx diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Atomic.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Atomic.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Atomic.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Atomic.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,7 +44,7 @@ inline bool Standard_Atomic_CompareAndSwap (volatile int* theValue, int theOldValue, int theNewValue); // Platform-dependent implementation -#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) +#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || defined(__EMSCRIPTEN__) // gcc explicitly defines the macros __GCC_HAVE_SYNC_COMPARE_AND_SWAP_* // starting with version 4.4+, although built-in functions // are available since 4.1.x. However unless __GCC_HAVE_SYNC_COMPARE_AND_SWAP_* diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_CString.cxx opencascade-7.5.1+dfsg1/src/Standard/Standard_CString.cxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_CString.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_CString.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -133,3 +133,9 @@ va_end(argp); return result; } + +int Vsprintf (char* theBuffer, const char* theFormat, va_list theArgList) +{ + SAVE_TL(); + return vsprintf_l(theBuffer, Standard_CLocaleSentry::GetCLocale(), theFormat, theArgList); +} diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_CString.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_CString.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_CString.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_CString.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -12,15 +12,17 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -//!@file Functions working with plain C strings +//!@file +//! Functions working with plain C strings #ifndef _Standard_CString_HeaderFile -# define _Standard_CString_HeaderFile +#define _Standard_CString_HeaderFile #include -# include -# include +#include +#include +#include # if defined(_MSC_VER) && ! defined(strcasecmp) # define strcasecmp _stricmp @@ -84,6 +86,15 @@ //! Equivalent of standard C function sprintf() that always uses C locale Standard_EXPORT int Sprintf (char* theBuffer, const char* theFormat, ...); +//! Equivalent of standard C function vsprintf() that always uses C locale. +//! Note that this function does not check buffer bounds and should be used with precaution measures +//! (only with format fitting into the buffer of known size). +//! @param theBuffer [in] [out] string buffer to fill +//! @param theFormat [in] format to apply +//! @param theArgList [in] argument list for specified format +//! @return the total number of characters written, or a negative number on error +Standard_EXPORT int Vsprintf (char* theBuffer, const char* theFormat, va_list theArgList); + #ifdef __cplusplus } #endif /* __cplusplus */ diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard.cxx opencascade-7.5.1+dfsg1/src/Standard/Standard.cxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,7 @@ #if defined(_MSC_VER) || defined(__ANDROID__) || defined(__QNX__) #include -#elif (defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 1 && (defined(__i386) || defined(__x86_64))) +#elif (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && (defined(__i386) || defined(__x86_64))) #include #else extern "C" int posix_memalign (void** thePtr, size_t theAlign, size_t theSize); @@ -101,14 +101,14 @@ aVar = getenv ("MMGT_OPT"); Standard_Integer anAllocId = (aVar ? atoi (aVar): OCCT_MMGT_OPT_DEFAULT); -#if defined(_WIN32) && !defined(_WIN64) && !defined(__MINGW32__) - static const DWORD _SSE2_FEATURE_BIT(0x04000000); - if ( anAllocId == 2 ) +#if defined(HAVE_TBB) && defined(_M_IX86) + if (anAllocId == 2) { - // CR25396: Check if SSE2 instructions are supported, if not then use MMgrRaw - // instead of MMgrTBBalloc. It is to avoid runtime crash when running on a - // CPU that supports SSE but does not support SSE2 (some modifications of - // AMD Sempron). + // CR25396: Check if SSE2 instructions are supported on 32-bit x86 processor on Windows platform, + // if not then use MMgrRaw instead of MMgrTBBalloc. + // It is to avoid runtime crash when running on a CPU + // that supports SSE but does not support SSE2 (some modifications of AMD Sempron). + static const DWORD _SSE2_FEATURE_BIT(0x04000000); DWORD volatile dwFeature; _asm { @@ -283,7 +283,7 @@ return _aligned_malloc (theSize, theAlign); #elif defined(__ANDROID__) || defined(__QNX__) return memalign (theAlign, theSize); -#elif (defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 1 && (defined(__i386) || defined(__x86_64))) +#elif (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && (defined(__i386) || defined(__x86_64))) return _mm_malloc (theSize, theAlign); #else void* aPtr; @@ -306,7 +306,7 @@ _aligned_free (thePtrAligned); #elif defined(__ANDROID__) || defined(__QNX__) free (thePtrAligned); -#elif (defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 1 && (defined(__i386) || defined(__x86_64))) +#elif (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && (defined(__i386) || defined(__x86_64))) _mm_free (thePtrAligned); #else free (thePtrAligned); diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Dump.cxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Dump.cxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Dump.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Dump.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,25 +16,6 @@ #include // ======================================================================= -// function : Constructor -// purpose : -// ======================================================================= -Standard_DumpSentry::Standard_DumpSentry (Standard_OStream& theOStream, const char* theClassName) -: myOStream (&theOStream) -{ - (*myOStream) << "\"" << theClassName << "\": {"; -} - -// ======================================================================= -// function : Destructor -// purpose : -// ======================================================================= -Standard_DumpSentry::~Standard_DumpSentry() -{ - (*myOStream) << "}"; -} - -// ======================================================================= // function : AddValuesSeparator // purpose : // ======================================================================= @@ -43,7 +24,7 @@ Standard_SStream aStream; aStream << theOStream.rdbuf(); TCollection_AsciiString aStreamStr = Standard_Dump::Text (aStream); - if (!aStreamStr.EndsWith ("{")) + if (!aStreamStr.IsEmpty() && !aStreamStr.EndsWith ("{")) theOStream << ", "; } @@ -52,7 +33,7 @@ //purpose : //======================================================================= void Standard_Dump::DumpKeyToClass (Standard_OStream& theOStream, - const char* theKey, + const TCollection_AsciiString& theKey, const TCollection_AsciiString& theField) { AddValuesSeparator (theOStream); @@ -93,6 +74,135 @@ va_end(vl); } +//======================================================================= +//function : ProcessStreamName +//purpose : +//======================================================================= +Standard_Boolean Standard_Dump::ProcessStreamName (const TCollection_AsciiString& theStreamStr, + const TCollection_AsciiString& theName, + Standard_Integer& theStreamPos) +{ + if (theStreamStr.IsEmpty()) + return Standard_False; + + if (theStreamStr.Length () < theStreamPos) + return Standard_False; + + TCollection_AsciiString aSubText = theStreamStr.SubString (theStreamPos, theStreamStr.Length()); + if (aSubText.StartsWith (JsonKeyToString (Standard_JsonKey_SeparatorValueToValue))) + { + theStreamPos += JsonKeyLength (Standard_JsonKey_SeparatorValueToValue); + aSubText = theStreamStr.SubString (theStreamPos, theStreamStr.Length()); + } + TCollection_AsciiString aKeyName = TCollection_AsciiString (JsonKeyToString (Standard_JsonKey_Quote)) + + theName + + TCollection_AsciiString (JsonKeyToString (Standard_JsonKey_Quote)) + + JsonKeyToString (Standard_JsonKey_SeparatorKeyToValue); + Standard_Boolean aResult = aSubText.StartsWith (aKeyName); + if (aResult) + theStreamPos += aKeyName.Length(); + + return aResult; +} + +//======================================================================= +//function : ProcessFieldName +//purpose : +//======================================================================= +Standard_Boolean Standard_Dump::ProcessFieldName (const TCollection_AsciiString& theStreamStr, + const TCollection_AsciiString& theName, + Standard_Integer& theStreamPos) +{ + if (theStreamStr.IsEmpty()) + return Standard_False; + + TCollection_AsciiString aSubText = theStreamStr.SubString (theStreamPos, theStreamStr.Length()); + if (aSubText.StartsWith (JsonKeyToString (Standard_JsonKey_SeparatorValueToValue))) + { + theStreamPos += JsonKeyLength (Standard_JsonKey_SeparatorValueToValue); + aSubText = theStreamStr.SubString (theStreamPos, theStreamStr.Length()); + } + + TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (theName.ToCString()); + TCollection_AsciiString aKeyName = TCollection_AsciiString (JsonKeyToString (Standard_JsonKey_Quote)) + + aName + + TCollection_AsciiString (JsonKeyToString (Standard_JsonKey_Quote)) + + JsonKeyToString (Standard_JsonKey_SeparatorKeyToValue); + + Standard_Boolean aResult = aSubText.StartsWith (aKeyName); + if (aResult) + theStreamPos += aKeyName.Length(); + + return aResult; +} + +//======================================================================= +//function : InitRealValues +//purpose : +//======================================================================= +Standard_Boolean Standard_Dump::InitRealValues (const TCollection_AsciiString& theStreamStr, + Standard_Integer& theStreamPos, + int theCount, ...) +{ + Standard_Integer aStreamPos = theStreamPos + JsonKeyLength (Standard_JsonKey_OpenContainer); + + TCollection_AsciiString aSubText = theStreamStr.SubString (aStreamPos, theStreamStr.Length()); + + va_list vl; + va_start(vl, theCount); + aStreamPos = 1; + Standard_Integer aClosePos = aSubText.Location (JsonKeyToString (Standard_JsonKey_CloseContainer), aStreamPos, aSubText.Length()); + for(int i = 0; i < theCount; ++i) + { + Standard_Integer aNextPos = (i < theCount-1) ? aSubText.Location (JsonKeyToString (Standard_JsonKey_SeparatorValueToValue), aStreamPos, aSubText.Length()) + : aClosePos; + + TCollection_AsciiString aValueText = aSubText.SubString (aStreamPos, aNextPos - 1); + + if (!aValueText.IsRealValue()) + return Standard_False; + + Standard_Real aValue = aValueText.RealValue(); + *(va_arg(vl, Standard_Real*)) = aValue; + + aStreamPos = aNextPos + JsonKeyLength (Standard_JsonKey_SeparatorValueToValue); + } + va_end(vl); + aClosePos = theStreamStr.Location (JsonKeyToString (Standard_JsonKey_CloseContainer), theStreamPos, theStreamStr.Length()); + theStreamPos = aClosePos + JsonKeyLength (Standard_JsonKey_CloseContainer); + + return Standard_True; +} + +//======================================================================= +//function : InitValue +//purpose : +//======================================================================= +Standard_Boolean Standard_Dump::InitValue (const TCollection_AsciiString& theStreamStr, + Standard_Integer& theStreamPos, + TCollection_AsciiString& theValue) +{ + Standard_Integer aStreamPos = theStreamPos; + + TCollection_AsciiString aSubText = theStreamStr.SubString (aStreamPos, theStreamStr.Length()); + + aStreamPos = 1; + Standard_Integer aNextPos = aSubText.Location (JsonKeyToString (Standard_JsonKey_SeparatorValueToValue), aStreamPos, aSubText.Length()); + Standard_JsonKey aNextKey = Standard_JsonKey_SeparatorValueToValue; + + Standard_Integer aCloseChildPos = aSubText.Location (JsonKeyToString (Standard_JsonKey_CloseChild), aStreamPos, aSubText.Length()); + Standard_Boolean isUseClosePos = (aNextPos > 0 && aCloseChildPos > 0 && aCloseChildPos < aNextPos) || !aNextPos; + if (isUseClosePos) + { + aNextPos = aCloseChildPos; + aNextKey = Standard_JsonKey_CloseChild; + } + + theValue = aNextPos ? aSubText.SubString (aStreamPos, aNextPos - 1) : aSubText; + theStreamPos = aNextPos ? (theStreamPos + (aNextPos - aStreamPos) + JsonKeyLength (aNextKey)) : theStreamStr.Length(); + return Standard_True; +} + // ======================================================================= // function : GetPointerInfo // purpose : @@ -112,6 +222,9 @@ // ======================================================================= TCollection_AsciiString Standard_Dump::GetPointerInfo (const void* thePointer, const bool isShortInfo) { + if (!thePointer) + return TCollection_AsciiString(); + std::ostringstream aPtrStr; aPtrStr << thePointer; if (!isShortInfo) @@ -133,17 +246,35 @@ // ======================================================================= // DumpFieldToName // ======================================================================= -const char* Standard_Dump::DumpFieldToName (const char* theField) +TCollection_AsciiString Standard_Dump::DumpFieldToName (const TCollection_AsciiString& theField) { - const char* aName = theField; + TCollection_AsciiString aName = theField; + if (theField.StartsWith ('&')) + { + aName.Remove (1, 1); + } - if (aName[0] == '&') + if (aName.Length() > 1 && aName.Value (1) == 'a') { - aName = aName + 1; + if (aName.Length() > 2 && aName.Value (2) == 'n') + { + aName.Remove (1, 2); + } + else + aName.Remove (1, 1); } - if (::LowerCase (aName[0]) == 'm' && aName[1] == 'y') + else if (aName.Length() > 2 && ::LowerCase (aName.Value (1)) == 'm' && aName.Value (2) == 'y') { - aName = aName + 2; + aName.Remove (1, 2); + } + + if (aName.EndsWith (".get()")) + { + aName = aName.SubString (1, aName.Length() - TCollection_AsciiString (".get()").Length()); + } + else if (aName.EndsWith ("()")) + { + aName = aName.SubString (1, aName.Length() - TCollection_AsciiString ("()").Length()); } return aName; } @@ -222,3 +353,270 @@ } return aText; } + +// ======================================================================= +// SplitJson +// ======================================================================= +Standard_Boolean Standard_Dump::SplitJson (const TCollection_AsciiString& theStreamStr, + NCollection_IndexedDataMap& theKeyToValues) +{ + Standard_Integer aNextIndex = 1; + while (aNextIndex < theStreamStr.Length()) + { + Standard_JsonKey aKey = Standard_JsonKey_None; + if (!jsonKey (theStreamStr, aNextIndex, aNextIndex, aKey)) + return Standard_False; + + Standard_Boolean aProcessed = Standard_False; + switch (aKey) + { + case Standard_JsonKey_Quote: + { + aProcessed = splitKeyToValue (theStreamStr, aNextIndex, aNextIndex, theKeyToValues); + break; + } + case Standard_JsonKey_OpenChild: + { + Standard_Integer aStartIndex = aNextIndex; + Standard_Integer aClosePos = nextClosePosition (theStreamStr, aStartIndex, Standard_JsonKey_OpenChild, Standard_JsonKey_CloseChild); + if (aClosePos == 0) + return Standard_False; + + TCollection_AsciiString aSubStreamStr = theStreamStr.SubString (aStartIndex + JsonKeyLength (aKey), aNextIndex - 2); + if (!SplitJson (aSubStreamStr, theKeyToValues)) + return Standard_False; + + aNextIndex = aClosePos + Standard_Integer (JsonKeyLength (Standard_JsonKey_CloseChild)); + break; + } + case Standard_JsonKey_SeparatorValueToValue: + { + continue; + } + default: + break; + } + if (!aProcessed) + return Standard_False; + } + return Standard_True; +} + +// ======================================================================= +// HierarchicalValueIndices +// ======================================================================= +NCollection_List Standard_Dump::HierarchicalValueIndices ( + const NCollection_IndexedDataMap& theValues) +{ + NCollection_List anIndices; + + for (Standard_Integer anIndex = 1; anIndex <= theValues.Extent(); anIndex++) + { + if (HasChildKey (theValues.FindFromIndex (anIndex))) + anIndices.Append (anIndex); + } + return anIndices; +} + +// ======================================================================= +// splitKeyToValue +// ======================================================================= +Standard_Boolean Standard_Dump::splitKeyToValue (const TCollection_AsciiString& theStreamStr, + Standard_Integer theStartIndex, + Standard_Integer& theNextIndex, + NCollection_IndexedDataMap& theValues) +{ + // find key value: "key" + Standard_Integer aStartIndex = theStartIndex; + Standard_Integer aCloseIndex = nextClosePosition (theStreamStr, aStartIndex + 1, Standard_JsonKey_None, Standard_JsonKey_Quote); + if (aCloseIndex == 0) + return Standard_False; + + TCollection_AsciiString aSplitKey = theStreamStr.SubString (aStartIndex, aCloseIndex - 1); + + // key to value + aStartIndex = aCloseIndex + 1; + Standard_JsonKey aKey = Standard_JsonKey_None; + if (!jsonKey (theStreamStr, aStartIndex, aCloseIndex, aKey)) + return Standard_False; + + // find value + aStartIndex = aCloseIndex; + aKey = Standard_JsonKey_None; + jsonKey (theStreamStr, aStartIndex, aCloseIndex, aKey); + aStartIndex = aCloseIndex; + + TCollection_AsciiString aSplitValue; + theNextIndex = -1; + switch (aKey) + { + case Standard_JsonKey_OpenChild: + { + aCloseIndex = nextClosePosition (theStreamStr, aStartIndex, Standard_JsonKey_OpenChild, Standard_JsonKey_CloseChild); + if (aCloseIndex > aStartIndex) + aSplitValue = theStreamStr.SubString (aStartIndex, aCloseIndex); + theNextIndex = aCloseIndex + 1; + break; + } + case Standard_JsonKey_OpenContainer: + { + aCloseIndex = nextClosePosition (theStreamStr, aStartIndex, Standard_JsonKey_OpenContainer, Standard_JsonKey_CloseContainer); + if (aCloseIndex > aStartIndex) + aSplitValue = theStreamStr.SubString (aStartIndex, aCloseIndex - 1); + theNextIndex = aCloseIndex + 1; + break; + } + case Standard_JsonKey_Quote: + { + Standard_JsonKey aKeyTmp = Standard_JsonKey_None; + if (jsonKey (theStreamStr, aStartIndex, aCloseIndex, aKeyTmp) && aKeyTmp == Standard_JsonKey_Quote) // emptyValue + { + aSplitValue = ""; + theNextIndex = aCloseIndex; + } + else + { + aCloseIndex = nextClosePosition (theStreamStr, aStartIndex + 1, Standard_JsonKey_None, Standard_JsonKey_Quote); + aSplitValue = theStreamStr.SubString (aStartIndex, aCloseIndex - 1); + theNextIndex = aCloseIndex + 1; + } + break; + } + case Standard_JsonKey_None: + { + if (aStartIndex == theStreamStr.Length()) + { + aSplitValue = aStartIndex <= aCloseIndex ? theStreamStr.SubString (aStartIndex, aCloseIndex) : ""; + aSplitValue = theStreamStr.SubString (aStartIndex, aCloseIndex); + aCloseIndex = aStartIndex; + } + else + { + Standard_Integer aCloseIndex1 = nextClosePosition (theStreamStr, aStartIndex, Standard_JsonKey_None, Standard_JsonKey_CloseChild) - 1; + Standard_Integer aCloseIndex2 = nextClosePosition (theStreamStr, aStartIndex, Standard_JsonKey_None, Standard_JsonKey_SeparatorValueToValue) - 1; + aCloseIndex = aCloseIndex1 < aCloseIndex2 ? aCloseIndex1 : aCloseIndex2; + aSplitValue = aStartIndex <= aCloseIndex ? theStreamStr.SubString (aStartIndex, aCloseIndex) : ""; + } + theNextIndex = aCloseIndex + 1; + break; + } + default: + return Standard_False; + } + + Standard_DumpValue aValue; + if (theValues.FindFromKey (aSplitKey, aValue)) + { + Standard_Integer anIndex = 1; + // increment key until the new key does not exist in the container + TCollection_AsciiString anIndexedSuffix = TCollection_AsciiString ("_") + TCollection_AsciiString (anIndex); + while (theValues.FindFromKey (TCollection_AsciiString (aSplitKey + anIndexedSuffix), aValue)) + { + anIndex++; + anIndexedSuffix = TCollection_AsciiString ("_") + TCollection_AsciiString (anIndex); + } + aSplitKey = aSplitKey + anIndexedSuffix; + } + + theValues.Add (aSplitKey, Standard_DumpValue (aSplitValue, aStartIndex)); + return Standard_True; +} + +// ======================================================================= +// jsonKey +// ======================================================================= +Standard_Boolean Standard_Dump::jsonKey (const TCollection_AsciiString& theStreamStr, + Standard_Integer theStartIndex, + Standard_Integer& theNextIndex, + Standard_JsonKey& theKey) +{ + TCollection_AsciiString aSubStreamStr = theStreamStr.SubString (theStartIndex, theStreamStr.Length()); + for (Standard_Integer aKeyId = (Standard_Integer)Standard_JsonKey_OpenChild; aKeyId <= Standard_JsonKey_SeparatorValueToValue; aKeyId++) + { + Standard_JsonKey aKey = (Standard_JsonKey)aKeyId; + Standard_CString aKeyToStr = JsonKeyToString (aKey); + if (!aSubStreamStr.StartsWith (aKeyToStr)) + continue; + + theNextIndex = theStartIndex + Standard_Integer (JsonKeyLength (aKey)); + theKey = aKey; + return Standard_True; + } + return Standard_False; +} + +// ======================================================================= +// HasChildKey +// ======================================================================= +Standard_Boolean Standard_Dump::HasChildKey (const TCollection_AsciiString& theSourceValue) +{ + return theSourceValue.Search (JsonKeyToString (Standard_JsonKey_SeparatorKeyToValue)) >= 0; +} + +// ======================================================================= +// JsonKeyToString +// ======================================================================= +Standard_CString Standard_Dump::JsonKeyToString (const Standard_JsonKey theKey) +{ + switch (theKey) + { + case Standard_JsonKey_None: return ""; + case Standard_JsonKey_OpenChild: return "{"; + case Standard_JsonKey_CloseChild: return "}"; + case Standard_JsonKey_OpenContainer: return "["; + case Standard_JsonKey_CloseContainer: return "]"; + case Standard_JsonKey_Quote: return "\""; + case Standard_JsonKey_SeparatorKeyToValue: return ": "; + case Standard_JsonKey_SeparatorValueToValue: return ", "; + } + + return ""; +} + +// ======================================================================= +// JsonKeyLength +// ======================================================================= +Standard_Integer Standard_Dump::JsonKeyLength (const Standard_JsonKey theKey) +{ + return (Standard_Integer)strlen (JsonKeyToString (theKey)); +} + +// ======================================================================= +// nextClosePosition +// ======================================================================= +Standard_Integer Standard_Dump::nextClosePosition (const TCollection_AsciiString& theSourceValue, + const Standard_Integer theStartPosition, + const Standard_JsonKey theOpenKey, + const Standard_JsonKey theCloseKey) +{ + Standard_CString anOpenKey = JsonKeyToString (theOpenKey); + Standard_CString aCloseKeyStr = JsonKeyToString (theCloseKey); + + Standard_Integer aStartPos = theStartPosition; + Standard_Integer aDepthKey = 0; + + while (aStartPos < theSourceValue.Length()) + { + Standard_Integer anOpenKeyPos = theSourceValue.Location (anOpenKey, aStartPos, theSourceValue.Length()); + Standard_Integer aCloseKeyPos = theSourceValue.Location (aCloseKeyStr, aStartPos, theSourceValue.Length()); + if (aCloseKeyPos == 0) + break; + + if (anOpenKeyPos != 0 && anOpenKeyPos <= aCloseKeyPos) + { + aDepthKey++; + aStartPos = anOpenKeyPos + 1; + } + else + { + if (aDepthKey == 0) + return aCloseKeyPos; + else + { + aDepthKey--; + aStartPos = aCloseKeyPos + 1; + } + } + } + return theSourceValue.Length(); +} diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Dump.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Dump.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Dump.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Dump.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,12 +14,14 @@ #ifndef _Standard_Dump_HeaderFile #define _Standard_Dump_HeaderFile +#include +#include #include #include -class Standard_DumpSentry; - +//!@file //! The file contains interface to prepare dump output for OCCT objects. Format of the dump is JSON. +//! //! To prepare this output, implement method DumpJson in the object and use macro functions from this file. //! Macros have one parameter for both, key and the value. It is a field of the current class. Macro has internal analyzer that //! uses the variable name to generate key. If the parameter has prefix symbols "&", "*" and "my", it is cut. @@ -50,23 +52,68 @@ //! Creates an instance of Sentry to cover the current Dump implementation with keys of start and end. //! This row should be inserted before other macros. The end key will be added by the sentry remove, //! (exit of the method). -#define OCCT_DUMP_CLASS_BEGIN(theOStream, theName) \ - Standard_DumpSentry aSentry (theOStream, OCCT_CLASS_NAME(theName)); +#define OCCT_DUMP_CLASS_BEGIN(theOStream, theField) \ +{ \ + const char* className = OCCT_CLASS_NAME(theField); \ + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, className) \ +} + +//! @def OCCT_DUMP_TRANSIENT_CLASS_BEGIN +//! Creates an instance of Sentry to cover the current Dump implementation with keys of start and end. +//! This row should be inserted before other macros. The end key will be added by the sentry remove, +//! (exit of the method). +#define OCCT_DUMP_TRANSIENT_CLASS_BEGIN(theOStream) \ +{ \ + const char* className = get_type_name(); \ + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, className) \ +} //! @def OCCT_DUMP_FIELD_VALUE_NUMERICAL //! Append into output value: "Name": Field #define OCCT_DUMP_FIELD_VALUE_NUMERICAL(theOStream, theField) \ { \ - const char* aName = Standard_Dump::DumpFieldToName (#theField); \ + TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (#theField); \ Standard_Dump::AddValuesSeparator (theOStream); \ theOStream << "\"" << aName << "\": " << theField; \ } +//! @def OCCT_INIT_FIELD_VALUE_REAL +//! Append vector values into output value: "Name": [value_1, value_2, ...] +//! This macro is intended to have only one row for dumped object in Json. +//! It's possible to use it without necessity of OCCT_DUMP_CLASS_BEGIN call, but pay attention that it should be only one row in the object dump. +#define OCCT_INIT_FIELD_VALUE_REAL(theOStream, theStreamPos, theField) \ +{ \ + Standard_Integer aStreamPos = theStreamPos; \ + if (!Standard_Dump::ProcessFieldName (theOStream, #theField, aStreamPos)) \ + return Standard_False; \ + TCollection_AsciiString aValueText; \ + if (!Standard_Dump::InitValue (theOStream, aStreamPos, aValueText) || !aValueText.IsRealValue()) \ + return Standard_False; \ + theField = aValueText.RealValue(); \ + theStreamPos = aStreamPos; \ +} + +//! @def OCCT_INIT_FIELD_VALUE_NUMERICAL +//! Append vector values into output value: "Name": [value_1, value_2, ...] +//! This macro is intended to have only one row for dumped object in Json. +//! It's possible to use it without necessity of OCCT_DUMP_CLASS_BEGIN call, but pay attention that it should be only one row in the object dump. +#define OCCT_INIT_FIELD_VALUE_INTEGER(theOStream, theStreamPos, theField) \ +{ \ + Standard_Integer aStreamPos = theStreamPos; \ + if (!Standard_Dump::ProcessFieldName (theOStream, #theField, aStreamPos)) \ + return Standard_False; \ + TCollection_AsciiString aValueText; \ + if (!Standard_Dump::InitValue (theOStream, aStreamPos, aValueText) || !aValueText.IsIntegerValue()) \ + return Standard_False; \ + theField = aValueText.IntegerValue(); \ + theStreamPos = aStreamPos; \ +} + //! @def OCCT_DUMP_FIELD_VALUE_STRING //! Append into output value: "Name": "Field" #define OCCT_DUMP_FIELD_VALUE_STRING(theOStream, theField) \ { \ - const char* aName = Standard_Dump::DumpFieldToName (#theField); \ + TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (#theField); \ Standard_Dump::AddValuesSeparator (theOStream); \ theOStream << "\"" << aName << "\": \"" << theField << "\""; \ } @@ -75,11 +122,22 @@ //! Append into output value: "Name": "address of the pointer" #define OCCT_DUMP_FIELD_VALUE_POINTER(theOStream, theField) \ { \ - const char* aName = Standard_Dump::DumpFieldToName (#theField); \ + TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (#theField); \ Standard_Dump::AddValuesSeparator (theOStream); \ theOStream << "\"" << aName << "\": \"" << Standard_Dump::GetPointerInfo (theField) << "\""; \ } +//! @def OCCT_DUMP_FIELD_VALUE_STRING +//! Append into output value: "Name": "Field" +#define OCCT_DUMP_FIELD_VALUE_GUID(theOStream, theField) \ +{ \ + TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (#theField); \ + Standard_Dump::AddValuesSeparator (theOStream); \ + char aStr[Standard_GUID_SIZE_ALLOC]; \ + theField.ToCString (aStr); \ + theOStream << "\"" << aName << "\": \"" << aStr << "\""; \ +} + //! @def OCCT_DUMP_FIELD_VALUES_DUMPED //! Append into output value: "Name": { field dumped values } //! It computes Dump of the fields. The expected field is a pointer. @@ -88,16 +146,27 @@ //! Depth = -1 is the default value, dump here is unlimited. #define OCCT_DUMP_FIELD_VALUES_DUMPED(theOStream, theDepth, theField) \ { \ - if (theDepth != 0) \ + if (theDepth != 0 && (void*)(theField) != NULL) \ { \ Standard_SStream aFieldStream; \ - if ((theField) != NULL) \ - (theField)->DumpJson (aFieldStream, theDepth - 1); \ - const char* aName = Standard_Dump::DumpFieldToName (#theField); \ + (theField)->DumpJson (aFieldStream, theDepth - 1); \ + TCollection_AsciiString aName = Standard_Dump::DumpFieldToName (#theField); \ Standard_Dump::DumpKeyToClass (theOStream, aName, Standard_Dump::Text (aFieldStream)); \ } \ } +//! @def OCCT_INIT_FIELD_VALUES_DUMPED +//! Append into output value: "Name": { field dumped values } +//! It computes Dump of the fields. The expected field is a pointer. +//! Use this macro for fields of the dumped class which has own Dump implementation. +//! The macros is recursive. Recursion is stopped when the depth value becomes equal to zero. +//! Depth = -1 is the default value, dump here is unlimited. +#define OCCT_INIT_FIELD_VALUES_DUMPED(theSStream, theStreamPos, theField) \ +{ \ + if ((theField) == NULL || !(theField)->InitFromJson (theSStream, theStreamPos)) \ + return Standard_False; \ +} + //! @def OCCT_DUMP_FIELD_VALUES_NUMERICAL //! Append real values into output values in an order: [value_1, value_2, ...] //! It computes Dump of the parent. The expected field is a parent class name to call ClassName::Dump. @@ -130,10 +199,8 @@ { \ if (theDepth != 0) \ { \ - Standard_SStream aFieldStream; \ - theField::DumpJson (aFieldStream, theDepth - 1); \ - const char* aName = Standard_Dump::DumpFieldToName (#theField); \ - Standard_Dump::DumpKeyToClass (theOStream, aName, Standard_Dump::Text (aFieldStream)); \ + Standard_Dump::AddValuesSeparator (theOStream); \ + theField::DumpJson (theOStream, theDepth - 1); \ } \ } @@ -143,26 +210,48 @@ //! It's possible to use it without necessity of OCCT_DUMP_CLASS_BEGIN call, but pay attention that it should be only one row in the object dump. #define OCCT_DUMP_VECTOR_CLASS(theOStream, theName, theCount, ...) \ { \ - theOStream << "\"" << OCCT_CLASS_NAME(theName) << "\": ["; \ + Standard_Dump::AddValuesSeparator (theOStream); \ + theOStream << "\"" << theName << "\": ["; \ Standard_Dump::DumpRealValues (theOStream, theCount, __VA_ARGS__);\ theOStream << "]"; \ } -//! @brief Simple sentry class providing convenient interface to dump. -//! Appends start and last rows in dump with class name key. -//! An example of the using: for ClassName, the result is: "ClassName" { ... } -//! Create instance of that class in the first row of Dump. -class Standard_DumpSentry +//! @def OCCT_INIT_VECTOR_CLASS +//! Append vector values into output value: "Name": [value_1, value_2, ...] +//! This macro is intended to have only one row for dumped object in Json. +//! It's possible to use it without necessity of OCCT_DUMP_CLASS_BEGIN call, but pay attention that it should be only one row in the object dump. +#define OCCT_INIT_VECTOR_CLASS(theOStream, theName, theStreamPos, theCount, ...) \ +{ \ + Standard_Integer aStreamPos = theStreamPos; \ + if (!Standard_Dump::ProcessStreamName (theOStream, theName, aStreamPos)) \ + return Standard_False; \ + if (!Standard_Dump::InitRealValues (theOStream, aStreamPos, theCount, __VA_ARGS__)) \ + return Standard_False; \ + theStreamPos = aStreamPos; \ +} + +//! Kind of key in Json string +enum Standard_JsonKey { -public: - //! Constructor - add parameters of start class name definition in the stream - Standard_EXPORT Standard_DumpSentry (Standard_OStream& theOStream, const char* theClassName); + Standard_JsonKey_None, //!< no key + Standard_JsonKey_OpenChild, //!< "{" + Standard_JsonKey_CloseChild, //!< "}" + Standard_JsonKey_OpenContainer, //!< "[" + Standard_JsonKey_CloseContainer, //!< "]" + Standard_JsonKey_Quote, //!< "\"" + Standard_JsonKey_SeparatorKeyToValue, //!< ": " + Standard_JsonKey_SeparatorValueToValue //!< ", " +}; - //! Destructor - add parameters of stop class name definition in the stream - Standard_EXPORT ~Standard_DumpSentry(); +//! Type for storing a dump value with the stream position +struct Standard_DumpValue +{ + Standard_DumpValue() : myStartPosition (0) {} + Standard_DumpValue (const TCollection_AsciiString& theValue, const Standard_Integer theStartPos) + : myValue (theValue), myStartPosition (theStartPos) {} -private: - Standard_OStream* myOStream; //!< modified stream + TCollection_AsciiString myValue; //!< current string value + Standard_Integer myStartPosition; //!< position of the value first char in the whole stream }; //! This interface has some tool methods for stream (in JSON format) processing. @@ -183,12 +272,38 @@ //! @return text presentation Standard_EXPORT static TCollection_AsciiString FormatJson (const Standard_SStream& theStream, const Standard_Integer theIndent = 3); - //! Add Json values separator if the stream last symbol is not an open brace. - //! @param theStream source value + //! Converts stream into map of values. + //! + //! The one level stream example: 'key_1: value_1, key_2: value_2' + //! In output: values contain 'key_1: value_1' and 'key_2: value_2'. + //! + //! The two level stream example: 'key_1: value_1, key_2: value_2, key_3: {sublevel_key_1: sublevel_value_1}, key_4: value_4' + //! In output values contain 'key_1: value_1', 'key_2: value_2', 'key_3: {sublevel_key_1: sublevel_value_1}' and 'key_4: value_4'. + //! The sublevel value might be processed later using the same method. + //! + //! @param theStreamStr stream value + //! @param theKeyToValues [out] container of split values. It contains key to value and position of the value in the stream text + Standard_EXPORT static Standard_Boolean SplitJson (const TCollection_AsciiString& theStreamStr, + NCollection_IndexedDataMap& theKeyToValues); + + //! Returns container of indices in values, that has hierarchical value + Standard_EXPORT static NCollection_List HierarchicalValueIndices ( + const NCollection_IndexedDataMap& theValues); + + //! Returns true if the value has bracket key + Standard_EXPORT static Standard_Boolean HasChildKey (const TCollection_AsciiString& theSourceValue); + + //! Returns key value for enum type + Standard_EXPORT static Standard_CString JsonKeyToString (const Standard_JsonKey theKey); + + //! Returns length value for enum type + Standard_EXPORT static Standard_Integer JsonKeyLength (const Standard_JsonKey theKey); + + //! @param theOStream source value static Standard_EXPORT void AddValuesSeparator (Standard_OStream& theOStream); //! Returns default prefix added for each pointer info string if short presentation of pointer used - Standard_EXPORT static TCollection_AsciiString GetPointerPrefix() { return "0x"; } + static TCollection_AsciiString GetPointerPrefix() { return "0x"; } //! Convert handle pointer to address of the pointer. If the handle is NULL, the result is an empty string. //! @param thePointer a pointer @@ -209,24 +324,83 @@ //! @param theKey a source value //! @param theField stream value Standard_EXPORT static void DumpKeyToClass (Standard_OStream& theOStream, - const char* theKey, + const TCollection_AsciiString& theKey, const TCollection_AsciiString& theField); //! Unite values in one value using template: "value_1", "value_2", ..., "value_n" //! @param theOStream [out] stream to be fill with values - //! @param theCount numer of values + //! @param theCount [in] number of values Standard_EXPORT static void DumpCharacterValues (Standard_OStream& theOStream, int theCount, ...); //! Unite values in one value using template: value_1, value_2, ..., value_n //! @param theOStream [out] stream to be fill with values - //! @param theCount numer of values + //! @param theCount [in] number of values Standard_EXPORT static void DumpRealValues (Standard_OStream& theOStream, int theCount, ...); + //! Check whether the parameter name is equal to the name in the stream at position + //! @param theSStream [in] stream with values + //! @param theName [in] stream key value + //! @param theStreamPos [out] current position in the stream + Standard_EXPORT static Standard_Boolean ProcessStreamName (const TCollection_AsciiString& theStreamStr, + const TCollection_AsciiString& theName, + Standard_Integer& theStreamPos); + + //! Check whether the field name is equal to the name in the stream at position + //! @param theSStream [in] stream with values + //! @param theName [in] stream key field value + //! @param theStreamPos [out] current position in the stream + Standard_EXPORT static Standard_Boolean ProcessFieldName (const TCollection_AsciiString& theStreamStr, + const TCollection_AsciiString& theName, + Standard_Integer& theStreamPos); + + //! Unite values in one value using template: value_1, value_2, ..., value_n + //! @param theSStream [in] stream with values + //! @param theStreamPos [out] current position in the stream + //! @param theCount [in] number of values + Standard_EXPORT static Standard_Boolean InitRealValues (const TCollection_AsciiString& theStreamStr, + Standard_Integer& theStreamPos, + int theCount, ...); + + //! Returns real value + //! @param theSStream [in] stream with values + //! @param theStreamPos [out] current position in the stream + //! @param theValue [out] stream value + Standard_EXPORT static Standard_Boolean InitValue (const TCollection_AsciiString& theStreamStr, + Standard_Integer& theStreamPos, + TCollection_AsciiString& theValue); + //! Convert field name into dump text value, removes "&" and "my" prefixes //! An example, for field myValue, theName is Value, for &myCLass, the name is Class //! @param theField a source value - //! @param theName [out] an updated name - Standard_EXPORT static const char* DumpFieldToName (const char* theField); + Standard_EXPORT static TCollection_AsciiString DumpFieldToName (const TCollection_AsciiString& theField); + +private: + //! Extracts from the string value a pair (key, value), add it into output container, update index value + //! Example: + //! stream string starting the index position contains: ..."key": ... + //! a pair key, value will be added into theValues + //! at beginning theIndex is the position of the quota before , after the index is the next position after the value + //! splitDumped(aString) gives theSplitValue = "abc", theTailValue = "defg", theKey = "key" + Standard_EXPORT static Standard_Boolean splitKeyToValue (const TCollection_AsciiString& theStreamStr, + Standard_Integer theStartIndex, + Standard_Integer& theNextIndex, + NCollection_IndexedDataMap& theValues); + + + //! Returns key of json in the index position. Incement the index position to the next symbol in the row + Standard_EXPORT static Standard_Boolean jsonKey (const TCollection_AsciiString& theStreamStr, + Standard_Integer theStartIndex, + Standard_Integer& theNextIndex, + Standard_JsonKey& theKey); + + //! Find position in the source string of the symbol close after the start position. + //! Ignore combination ... between the close symbol. + //! Example, for case ... { ... { ... } ...} ... } it returns the position of the forth brace + Standard_EXPORT static Standard_Integer nextClosePosition (const TCollection_AsciiString& theSourceValue, + const Standard_Integer theStartPosition, + const Standard_JsonKey theCloseKey, + const Standard_JsonKey theOpenKey); + }; #endif // _Standard_Dump_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_ErrorHandler.cxx opencascade-7.5.1+dfsg1/src/Standard/Standard_ErrorHandler.cxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_ErrorHandler.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_ErrorHandler.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -39,10 +39,16 @@ //==== The top of the Errors Stack =========================================== static Standard_ErrorHandler* Top = 0; -// A mutex to protect from concurrent access to Top -// Note that we should NOT use Sentry while in this class, as Sentry -// would register mutex as callback in the current exception handler -static Standard_Mutex theMutex; +//! A mutex to protect from concurrent access to Top. +//! Mutex is defined as function to avoid issues caused by +//! an undefined static variables initialization order across compilation units (@sa #0031681 bug). +//! Note that we should NOT use Sentry while in this class, as Sentry +//! would register mutex as callback in the current exception handler. +static Standard_Mutex& GetMutex() +{ + static Standard_Mutex theMutex; + return theMutex; +} static inline Standard_ThreadId GetThreadID() { @@ -64,10 +70,10 @@ myThread = GetThreadID(); memset (&myLabel, 0, sizeof(myLabel)); - theMutex.Lock(); + GetMutex().Lock(); myPrevious = Top; Top = this; - theMutex.Unlock(); + GetMutex().Unlock(); } @@ -94,7 +100,7 @@ void Standard_ErrorHandler::Unlink() { // put a lock on the stack - theMutex.Lock(); + GetMutex().Lock(); Standard_ErrorHandler* aPrevious = 0; Standard_ErrorHandler* aCurrent = Top; @@ -106,7 +112,7 @@ } if(aCurrent==0) { - theMutex.Unlock(); + GetMutex().Unlock(); return; } @@ -118,7 +124,7 @@ aPrevious->myPrevious=aCurrent->myPrevious; } myPrevious = 0; - theMutex.Unlock(); + GetMutex().Unlock(); // unlink and destroy all registered callbacks Standard_Address aPtr = aCurrent->myCallbackPtr; @@ -217,7 +223,7 @@ const Standard_Boolean theUnlink) { // lock the stack - theMutex.Lock(); + GetMutex().Lock(); // Find the current ErrorHandler Accordin tread Standard_ErrorHandler* aPrevious = 0; @@ -262,7 +268,7 @@ aStop = Standard_True; } } - theMutex.Unlock(); + GetMutex().Unlock(); return anActive; } @@ -307,4 +313,4 @@ ((Standard_ErrorHandler*)myHandler)->myCallbackPtr = (Standard_ErrorHandler::Callback*)myNext; myHandler = myNext = myPrev = 0; } -#endif \ No newline at end of file +#endif diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_ErrorHandler.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_ErrorHandler.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_ErrorHandler.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_ErrorHandler.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -202,6 +202,8 @@ } inline Standard_ErrorHandler::Callback::~Callback () { + (void)myHandler; + (void)myPrev; } inline void Standard_ErrorHandler::Callback::RegisterCallback () { diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Failure.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Failure.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Failure.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Failure.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -54,14 +54,10 @@ //! Destructor Standard_EXPORT ~Standard_Failure(); - //! Prints on the stream the exception name followed by - //! the error message. - //! Level: Advanced - //! Warning: - //! The operator "OStream& operator<< (Standard_OStream&, - //! Handle(Standard_Failure)&)" - //! is implemented. (This operator uses the method Print) - Standard_EXPORT void Print (Standard_OStream& s) const; + //! Prints on the stream @p theStream the exception name followed by the error message. + //! + //! Note: there is a short-cut @c operator<< (Standard_OStream&, Handle(Standard_Failure)&) + Standard_EXPORT void Print (Standard_OStream& theStream) const; //! Returns error message Standard_EXPORT virtual Standard_CString GetMessageString() const; diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Handle.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Handle.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Handle.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Handle.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -407,8 +407,7 @@ #define Handle(Class) opencascade::handle //! Computes a hash code for the standard handle, in the range [1, theUpperBound] -//! @param TheTransientType the type of the object the handle is referred to -//! @param theHandle the standard handle which hash code is to be computed +//! @param theHandle the handle which hash code is to be computed //! @param theUpperBound the upper bound of the range a computing hash code must be within //! @return a computed hash code, in the range [1, theUpperBound] template diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Macro.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Macro.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Macro.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Macro.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -147,14 +147,14 @@ #if defined(__ICL) || defined (__INTEL_COMPILER) #define Standard_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:1478)) #define Standard_ENABLE_DEPRECATION_WARNINGS __pragma(warning(pop)) -#elif defined(_MSC_VER) - #define Standard_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:4996)) - #define Standard_ENABLE_DEPRECATION_WARNINGS __pragma(warning(pop)) #elif (defined(__GNUC__) && __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) || defined(__clang__) // available since at least gcc 4.2 (maybe earlier), however only gcc 4.6+ supports this pragma inside the function body // CLang also supports this gcc syntax (in addition to "clang diagnostic ignored") #define Standard_DISABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") #define Standard_ENABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic warning \"-Wdeprecated-declarations\"") +#elif defined(_MSC_VER) + #define Standard_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:4996)) + #define Standard_ENABLE_DEPRECATION_WARNINGS __pragma(warning(pop)) #else #define Standard_DISABLE_DEPRECATION_WARNINGS #define Standard_ENABLE_DEPRECATION_WARNINGS diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Mutex.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Mutex.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Mutex.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Mutex.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,7 +24,6 @@ #include #else #include - ///#include #include #include #endif diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_ReadBuffer.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_ReadBuffer.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_ReadBuffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_ReadBuffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,8 @@ //! Constructor with initialization. Standard_ReadBuffer (int64_t theDataLen, - size_t theChunkLen) + size_t theChunkLen, + bool theIsPartialPayload = false) : myBufferPtr(NULL), myBufferEnd(NULL), myDataLen (0), @@ -34,17 +35,28 @@ myNbChunks (0), myBufferLen(0) { - Init (theDataLen, theChunkLen); + Init (theDataLen, theChunkLen, theIsPartialPayload); } //! Initialize the buffer. - //! @param theDataLen the full length of input data to read from stream. - //! @param theChunkLen the length of single chunk to read + //! @param theDataLen [in] the full length of input data to read from stream. + //! @param theChunkLen [in] the length of single chunk to read + //! @param theIsPartialPayload [in] when FALSE, theDataLen will be automatically aligned to the multiple of theChunkLen; + //! when TRUE, last chunk will be read from stream exactly till theDataLen + //! allowing portion of chunk to be uninitialized (useful for interleaved data) void Init (int64_t theDataLen, - size_t theChunkLen) + size_t theChunkLen, + bool theIsPartialPayload = false) { myDataRead = 0; - myDataLen = theDataLen - theDataLen % int64_t(theChunkLen); + if (theIsPartialPayload) + { + myDataLen = theDataLen; + } + else + { + myDataLen = theDataLen - theDataLen % int64_t(theChunkLen); + } myChunkLen = theChunkLen; myNbChunks = sizeof(myBuffer) / theChunkLen; myBufferLen = theChunkLen * myNbChunks; @@ -88,6 +100,11 @@ template char* readRawDataChunk (Stream_T& theStream) { + if (myBufferPtr == NULL) + { + return NULL; + } + myBufferPtr += myChunkLen; if (myBufferPtr < myBufferEnd) { @@ -95,7 +112,7 @@ } const int64_t aDataLeft = myDataLen - myDataRead; - if (aDataLeft == 0) // myDataLen should be multiple of myChunkLen + if (aDataLeft <= 0) // myDataLen is normally multiple of myChunkLen, but can be smaller in interleaved data { myBufferPtr = NULL; return NULL; diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_ReadLineBuffer.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_ReadLineBuffer.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_ReadLineBuffer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_ReadLineBuffer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,8 @@ //! @param theMaxBufferSizeBytes the length of buffer to read (in bytes) Standard_ReadLineBuffer (size_t theMaxBufferSizeBytes) : myUseReadBufferLastStr(false), + myIsMultilineMode (false), + myToPutGapInMultiline (true), myBufferPos (0), myBytesLastRead (0) { @@ -41,6 +43,8 @@ { myReadBufferLastStr.clear(); myUseReadBufferLastStr = false; + myIsMultilineMode = false; + myToPutGapInMultiline = true; myBufferPos = 0; myBytesLastRead = 0; } @@ -49,6 +53,7 @@ //! @return pointer to the line or NULL on error / end of reading buffer //! (in case of NULL result theStream should be checked externally to identify the presence of errors). //! Empty lines will be returned also with zero length. + //! @param theStream [inout] - the stream to read from. //! @param theLineLength [out] - output parameter defined length of returned line. template const char* ReadLine (Stream_T& theStream, @@ -62,6 +67,7 @@ //! @return pointer to the line or NULL on error / end of reading buffer //! (in case of NULL result theStream should be checked externally to identify the presence of errors). //! Empty lines will be returned also with zero length. + //! @param theStream [inout] - the stream to read from. //! @param theLineLength [out] - output parameter defined length of returned line. //! @param theReadData [out] - output parameter defined the number of elements successfully read from the stream during this call, //! it can be zero if no data was read and the line is taken from the buffer. @@ -71,6 +77,7 @@ int64_t& theReadData) { char* aResultLine = NULL; + bool isMultiline = false; theLineLength = 0; theReadData = 0; @@ -97,7 +104,7 @@ if (myUseReadBufferLastStr) { theLineLength = myReadBufferLastStr.size(); - aResultLine = myReadBufferLastStr.data(); + aResultLine = &myReadBufferLastStr.front(); myUseReadBufferLastStr = false; } break; @@ -110,9 +117,74 @@ // read next line from myReadBuffer while (myBufferPos < myBytesLastRead) { - if (myReadBuffer[myBufferPos] == '\n') + if (myIsMultilineMode + && myReadBuffer[myBufferPos] == '\\') { - isEndLineFound = true; + // multi-line syntax + if (myBufferPos + 1 == myBytesLastRead + || (myBufferPos + 2 == myBytesLastRead + && myReadBuffer[myBufferPos + 1] == '\r')) + { + isMultiline = true; + if (myToPutGapInMultiline) + { + myReadBuffer[myBufferPos] = ' '; + if (myBufferPos + 1 != myBytesLastRead) + { + myReadBuffer[myBufferPos + 1] = ' '; + } + } + } + else if (myReadBuffer[myBufferPos + 1] == '\n' + ||(myReadBuffer[myBufferPos + 1] == '\r' + && myReadBuffer[myBufferPos + 2] == '\n')) + { + size_t aBufferPos = myBufferPos; + myBufferPos = aBufferPos + (myReadBuffer[aBufferPos + 1] == '\r' ? 2 : 1); + if (myToPutGapInMultiline) + { + myReadBuffer[aBufferPos] = ' '; + ++aBufferPos; + } + + if (myUseReadBufferLastStr) + { + myReadBufferLastStr.insert (myReadBufferLastStr.end(), myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + aBufferPos); + } + else + { + myReadBufferLastStr = std::vector(myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + aBufferPos); + myUseReadBufferLastStr = true; + } + + aStartLinePos = myBufferPos + 1; + } + } + else if (myReadBuffer[myBufferPos] == '\n') + { + if (!isMultiline) + { + isEndLineFound = true; + } + else if (myBufferPos == 1 && myReadBuffer[0] == '\r') + { + myReadBufferLastStr.erase (myReadBufferLastStr.end() - 1); + aStartLinePos += 2; + isMultiline = false; + } + else if (myBufferPos == 0) + { + aStartLinePos += 1; + if (myReadBufferLastStr[myReadBufferLastStr.size() - 1] == '\\') + { + myReadBufferLastStr.erase (myReadBufferLastStr.end() - 1); + } + else + { + myReadBufferLastStr.erase (myReadBufferLastStr.end() - 2, myReadBufferLastStr.end()); + } + isMultiline = false; + } } ++myBufferPos; @@ -128,7 +200,7 @@ myReadBufferLastStr.insert (myReadBufferLastStr.end(), myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + myBufferPos); myUseReadBufferLastStr = false; theLineLength = myReadBufferLastStr.size(); - aResultLine = myReadBufferLastStr.data(); + aResultLine = &myReadBufferLastStr.front(); } else { @@ -137,7 +209,7 @@ myReadBufferLastStr.clear(); } theLineLength = myBufferPos - aStartLinePos; - aResultLine = myReadBuffer.data() + aStartLinePos; + aResultLine = &myReadBuffer.front() + aStartLinePos; } // make string null terminated by replacing '\n' or '\r' (before '\n') symbol to null character. if (theLineLength > 1 && aResultLine[theLineLength - 2] == '\r') @@ -156,14 +228,48 @@ // save "unfinished" part of string to additional buffer if (aStartLinePos != myBufferPos) { - myReadBufferLastStr = std::vector(myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + myBufferPos); - myUseReadBufferLastStr = true; + if (myUseReadBufferLastStr) + { + myReadBufferLastStr.insert (myReadBufferLastStr.end(), myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + myBufferPos); + } + else + { + myReadBufferLastStr = std::vector(myReadBuffer.begin() + aStartLinePos, myReadBuffer.begin() + myBufferPos); + myUseReadBufferLastStr = true; + } } } } return aResultLine; } + //! Returns TRUE when the Multiline Mode is on; FALSE by default. + //! Multiline modes joins several lines in file having \ at the end of line: + //! @code + //! Line starts here, \ // line continuation character without this comment + //! continues \ // line continuation character without this comment + //! and ends. + //! @endcode + bool IsMultilineMode() const { return myIsMultilineMode; } + + //! Put gap space while merging lines within multiline syntax, so that the following sample: + //! @code + //! 1/2/3\ // line continuation character without this comment + //! 4/5/6 + //! @endcode + //! Will become "1/2/3 4/5/6" when flag is TRUE, and "1/2/35/5/6" otherwise. + bool ToPutGapInMultiline() const { return myToPutGapInMultiline; } + + //! Sets or unsets the multi-line mode. + //! @param theMultilineMode [in] multiline mode flag + //! @param theToPutGap [in] put gap space while connecting lines (no gap otherwise) + void SetMultilineMode (bool theMultilineMode, + bool theToPutGap = true) + { + myIsMultilineMode = theMultilineMode; + myToPutGapInMultiline = theToPutGap; + } + protected: //! Read from stl stream. @@ -172,7 +278,7 @@ size_t theLen, size_t& theReadLen) { - theReadLen = (size_t )theStream.read (myReadBuffer.data(), theLen).gcount(); + theReadLen = (size_t )theStream.read (&myReadBuffer.front(), theLen).gcount(); return !theStream.bad(); } @@ -182,7 +288,7 @@ size_t theLen, size_t& theReadLen) { - theReadLen = ::fread (myReadBuffer.data(), 1, theLen, theStream); + theReadLen = ::fread (&myReadBuffer.front(), 1, theLen, theStream); return ::ferror (theStream) == 0; } @@ -191,6 +297,8 @@ std::vector myReadBuffer; //!< Temp read buffer std::vector myReadBufferLastStr; //!< Part of last string of myReadBuffer bool myUseReadBufferLastStr; //!< Flag to use myReadBufferLastStr during next line reading + bool myIsMultilineMode; //!< Flag to process of the special multi-line case at the end of the line + bool myToPutGapInMultiline; //!< Flag to put gap space while joining lines in multi-line syntax size_t myBufferPos; //!< Current position in myReadBuffer size_t myBytesLastRead; //!< The number of characters that were read last time from myReadBuffer. }; diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Transient.cxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Transient.cxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Transient.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Transient.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -75,11 +75,11 @@ // Increment reference counter void Standard_Transient::IncrementRefCounter() const { - Standard_Atomic_Increment (&count); + Standard_Atomic_Increment (&myRefCount_); } // Decrement reference counter Standard_Integer Standard_Transient::DecrementRefCounter() const { - return Standard_Atomic_Decrement (&count); + return Standard_Atomic_Decrement(&myRefCount_); } diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Transient.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Transient.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Transient.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Transient.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,10 +37,10 @@ public: //! Empty constructor - Standard_Transient() : count(0) {} + Standard_Transient() : myRefCount_(0) {} //! Copy constructor -- does nothing - Standard_Transient (const Standard_Transient&) : count(0) {} + Standard_Transient (const Standard_Transient&) : myRefCount_(0) {} //! Assignment operator, needed to avoid copying reference counter Standard_Transient& operator= (const Standard_Transient&) { return *this; } @@ -90,7 +90,7 @@ //!@name Reference counting, for use by handle<> //! Get the reference counter of this object - Standard_Integer GetRefCount() const { return count; } + Standard_Integer GetRefCount() const { return myRefCount_; } //! Increments the reference counter of this object Standard_EXPORT void IncrementRefCounter() const; @@ -101,8 +101,10 @@ private: - //! Reference counter - mutable volatile Standard_Integer count; + //! Reference counter. + //! Note use of underscore, aimed to reduce probability + //! of conflict with names of members of derived classes. + mutable volatile Standard_Integer myRefCount_; }; diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Type.cxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Type.cxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Type.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Type.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -98,6 +98,9 @@ static registry_type theRegistry; return theRegistry; } + + // To initialize theRegistry map as soon as possible to be destoryed the latest + Handle(Standard_Type) theType = STANDARD_TYPE(Standard_Transient); } Standard_Type* Standard_Type::Register (const char* theSystemName, const char* theName, diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_Version.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_Version.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_Version.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_Version.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,20 +34,20 @@ // Primary definitions #define OCC_VERSION_MAJOR 7 -#define OCC_VERSION_MINOR 4 -#define OCC_VERSION_MAINTENANCE 0 +#define OCC_VERSION_MINOR 5 +#define OCC_VERSION_MAINTENANCE 1 //! This macro must be commented in official release, and set to non-empty //! string in other situations, to identify specifics of the version, e.g.: -//! - "dev" for official (certified) version (master branch) between releases +//! - "dev" for development version between releases //! - "beta..." or "rc..." for beta releases or release candidates //! - "project..." for version containing project-specific fixes -//#define OCC_VERSION_DEVELOPMENT "beta" +//#define OCC_VERSION_DEVELOPMENT "dev" // Derived (manually): version as real and string (major.minor) -#define OCC_VERSION 7.4 -#define OCC_VERSION_STRING "7.4" -#define OCC_VERSION_COMPLETE "7.4.0" +#define OCC_VERSION 7.5 +#define OCC_VERSION_STRING "7.5" +#define OCC_VERSION_COMPLETE "7.5.1" //! Derived: extended version as string ("major.minor.maintenance.dev") #ifdef OCC_VERSION_DEVELOPMENT diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_WarningDisableFunctionCast.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_WarningDisableFunctionCast.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_WarningDisableFunctionCast.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_WarningDisableFunctionCast.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,33 @@ +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Standard_WarningDisableFunctionCast_HeaderFile +#define _Standard_WarningDisableFunctionCast_HeaderFile + +//! @file +//! Include this file to disable GCC warning -Wcast-function-type introduced in GCC 8.1. +//! +//! This diagnostic warns when a function pointer is cast to an incompatible function pointer. +//! Existing APIs loading function pointer from library (like dlsym() or wglGetProcAddress()) have no +//! possibility to return function of specified type nor to verify that exported symbol actually +//! matches the expected function signature, so that unsafe function cast is unavoidable. +//! There is no way to prevent this warning at OCCT level (until safer APIs is introduced), thus +//! suppressing it is the only feasible way to avoid it. As this warning still can point out broken +//! places, it should be suppressed only locally, where usage of function cast has been verified. +#if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__) +# if (__GNUC__ > 8) || ((__GNUC__ == 8) && (__GNUC_MINOR__ >= 1)) +# pragma GCC diagnostic ignored "-Wcast-function-type" +# endif +#endif + +#endif // _Standard_WarningDisableFunctionCast_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_WarningsDisable.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_WarningsDisable.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_WarningsDisable.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_WarningsDisable.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -11,7 +11,8 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -//!@file Supresses compiler warnings. +//!@file +//! Supresses compiler warnings. //! //! Standard_WarningsDisable.hxx disables all compiler warnings. //! Standard_WarningsRestore.hxx restore the previous state of warnings. @@ -20,9 +21,11 @@ //! header files to avoid compiler warnings to be generated for these files. //! They should always be used in pair: //! +//! @code //! #include //! #include // some header that can generate warnings //! #include +//! @endcode #if defined(__clang__) #pragma clang diagnostic push @@ -37,6 +40,7 @@ #pragma GCC diagnostic ignored "-Wunused-variable" #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wenum-compare" + #pragma GCC diagnostic ignored "-Wreorder" #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #endif diff -Nru opencascade-7.4.1+dfsg1/src/Standard/Standard_WarningsRestore.hxx opencascade-7.5.1+dfsg1/src/Standard/Standard_WarningsRestore.hxx --- opencascade-7.4.1+dfsg1/src/Standard/Standard_WarningsRestore.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Standard/Standard_WarningsRestore.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -11,7 +11,8 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -//!@file Restores compiler warnings suppressed by inclusion of Standard_WarningsDisable.hxx. +//!@file +//! Restores compiler warnings suppressed by inclusion of Standard_WarningsDisable.hxx. //! //! Standard_WarningsDisable.hxx disables all compiler warnings. //! Standard_WarningsRestore.hxx restore the previous state of warnings. @@ -20,9 +21,11 @@ //! header files to avoid compiler warnings to be generated for these files. //! They should always be used in pair: //! +//! @code //! #include //! #include // some header that can generate warnings //! #include +//! @endcode #if defined(__clang__) #pragma clang diagnostic pop diff -Nru opencascade-7.4.1+dfsg1/src/StdLDrivers/StdLDrivers_DocumentRetrievalDriver.cxx opencascade-7.5.1+dfsg1/src/StdLDrivers/StdLDrivers_DocumentRetrievalDriver.cxx --- opencascade-7.4.1+dfsg1/src/StdLDrivers/StdLDrivers_DocumentRetrievalDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdLDrivers/StdLDrivers_DocumentRetrievalDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,6 +34,7 @@ #include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT (StdLDrivers_DocumentRetrievalDriver, PCDM_RetrievalDriver) @@ -52,7 +53,8 @@ //======================================================================= void StdLDrivers_DocumentRetrievalDriver::Read (const TCollection_ExtendedString& theFileName, const Handle(CDM_Document)& theNewDocument, - const Handle(CDM_Application)&) + const Handle(CDM_Application)& , + const Message_ProgressRange& /*theRange*/) { // Read header data and persistent document Storage_HeaderData aHeaderData; @@ -79,20 +81,18 @@ Standard_Integer i; // Create a driver appropriate for the given file - PCDM_BaseDriverPointer aFileDriverPtr; - if (PCDM::FileDriverType (TCollection_AsciiString (theFileName), aFileDriverPtr) == PCDM_TOFD_Unknown) + Handle(Storage_BaseDriver) aFileDriver; + if (PCDM::FileDriverType (TCollection_AsciiString (theFileName), aFileDriver) == PCDM_TOFD_Unknown) { myReaderStatus = PCDM_RS_UnknownFileDriver; return NULL; } - NCollection_Handle aFileDriver (aFileDriverPtr); - // Try to open the file try { OCC_CATCH_SIGNALS - PCDM_ReadWriter::Open (*aFileDriver, theFileName, Storage_VSRead); + PCDM_ReadWriter::Open (aFileDriver, theFileName, Storage_VSRead); myReaderStatus = PCDM_RS_OK; } catch (Standard_Failure const& anException) @@ -105,17 +105,17 @@ } // Read header section - if (!theHeaderData.Read (*aFileDriver)) + if (!theHeaderData.Read (aFileDriver)) raiseOnStorageError (theHeaderData.ErrorStatus()); // Read type section Storage_TypeData aTypeData; - if (!aTypeData.Read (*aFileDriver)) + if (!aTypeData.Read (aFileDriver)) raiseOnStorageError (aTypeData.ErrorStatus()); // Read root section Storage_RootData aRootData; - if (!aRootData.Read (*aFileDriver)) + if (!aRootData.Read (aFileDriver)) raiseOnStorageError (aRootData.ErrorStatus()); if (aRootData.NumberOfRoots() < 1) @@ -143,6 +143,14 @@ aCurTypeName = aTypeData.Type (i); aCurTypeNum = aTypeData.Type (aCurTypeName); + TCollection_AsciiString newName; + if (Storage_Schema::CheckTypeMigration(aCurTypeName, newName)) { +#ifdef OCCT_DEBUG + std::cout << "CheckTypeMigration:OldType = " << aCurTypeName << " Len = " << aCurTypeNum << std::endl; + std::cout << "CheckTypeMigration:NewType = " << newName << " Len = " << newName.Length() << std::endl; +#endif + aCurTypeName = newName; + } StdObjMgt_Persistent::Instantiator anInstantiator; if (aMapOfInst.Find(aCurTypeName, anInstantiator)) anInstantiators (aCurTypeNum) = anInstantiator; @@ -169,7 +177,7 @@ } // Read and parse reference section - StdObjMgt_ReadData aReadData (*aFileDriver, theHeaderData.NumberOfObjects()); + StdObjMgt_ReadData aReadData (aFileDriver, theHeaderData.NumberOfObjects()); raiseOnStorageError (aFileDriver->BeginReadRefSection()); @@ -229,7 +237,8 @@ void StdLDrivers_DocumentRetrievalDriver::Read (Standard_IStream& /*theIStream*/, const Handle(Storage_Data)& /*theStorageData*/, const Handle(CDM_Document)& /*theDoc*/, - const Handle(CDM_Application)& /*theApplication*/) + const Handle(CDM_Application)& /*theApplication*/, + const Message_ProgressRange& /*theRange*/) { throw Standard_NotImplemented("Reading from stream is not supported by StdLDrivers_DocumentRetrievalDriver"); } diff -Nru opencascade-7.4.1+dfsg1/src/StdLDrivers/StdLDrivers_DocumentRetrievalDriver.hxx opencascade-7.5.1+dfsg1/src/StdLDrivers/StdLDrivers_DocumentRetrievalDriver.hxx --- opencascade-7.4.1+dfsg1/src/StdLDrivers/StdLDrivers_DocumentRetrievalDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdLDrivers/StdLDrivers_DocumentRetrievalDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,13 +30,15 @@ //! Retrieve the content of a file into a new document. Standard_EXPORT virtual void Read (const TCollection_ExtendedString& theFileName, const Handle(CDM_Document)& theNewDocument, - const Handle(CDM_Application)& theApplication) Standard_OVERRIDE; + const Handle(CDM_Application)& theApplication, + const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; //! Override pure virtual method (raises exception Standard_NotImplemented) Standard_EXPORT virtual void Read (Standard_IStream& theIStream, const Handle(Storage_Data)& theStorageData, const Handle(CDM_Document)& theDoc, - const Handle(CDM_Application)& theApplication) Standard_OVERRIDE; + const Handle(CDM_Application)& theApplication, + const Message_ProgressRange& theRange = Message_ProgressRange()) Standard_OVERRIDE; DEFINE_STANDARD_RTTIEXT (StdLDrivers_DocumentRetrievalDriver, PCDM_RetrievalDriver) diff -Nru opencascade-7.4.1+dfsg1/src/StdLPersistent/StdLPersistent_Collection.hxx opencascade-7.5.1+dfsg1/src/StdLPersistent/StdLPersistent_Collection.hxx --- opencascade-7.4.1+dfsg1/src/StdLPersistent/StdLPersistent_Collection.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdLPersistent/StdLPersistent_Collection.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,6 +46,13 @@ class booleanArrayBase : public Base { public: + //! Empty constructor. + booleanArrayBase() + : myLower(0), + myUpper(0) + { + } + //! Read persistent data from a file. virtual void Read (StdObjMgt_ReadData& theReadData) { @@ -116,6 +123,12 @@ class instance_1 : public Instance { public: + //! Empty constructor. + instance_1() + : myDelta(Standard_False) + { + } + //! Read persistent data from a file. Standard_EXPORT virtual void Read (StdObjMgt_ReadData& theReadData); diff -Nru opencascade-7.4.1+dfsg1/src/StdLPersistent/StdLPersistent_Data.hxx opencascade-7.5.1+dfsg1/src/StdLPersistent/StdLPersistent_Data.hxx --- opencascade-7.4.1+dfsg1/src/StdLPersistent/StdLPersistent_Data.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdLPersistent/StdLPersistent_Data.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,11 @@ class StdLPersistent_Data : public StdObjMgt_Persistent { public: + //! Empty constructor. + StdLPersistent_Data() + : myVersion(0) + { + } //! Read persistent data from a file. Standard_EXPORT virtual void Read (StdObjMgt_ReadData& theReadData); //! Write persistent data to a file. diff -Nru opencascade-7.4.1+dfsg1/src/StdLPersistent/StdLPersistent_Function.hxx opencascade-7.5.1+dfsg1/src/StdLPersistent/StdLPersistent_Function.hxx --- opencascade-7.4.1+dfsg1/src/StdLPersistent/StdLPersistent_Function.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdLPersistent/StdLPersistent_Function.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,11 @@ class StdLPersistent_Function : public StdObjMgt_Attribute { public: + //! Empty constructor. + StdLPersistent_Function() + : myFailure(0) + { + } //! Read persistent data from a file. inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myDriverGUID >> myFailure; } diff -Nru opencascade-7.4.1+dfsg1/src/StdLPersistent/StdLPersistent_Real.hxx opencascade-7.5.1+dfsg1/src/StdLPersistent/StdLPersistent_Real.hxx --- opencascade-7.4.1+dfsg1/src/StdLPersistent/StdLPersistent_Real.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdLPersistent/StdLPersistent_Real.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -23,6 +23,12 @@ class StdLPersistent_Real : public StdObjMgt_Attribute { public: + //! Empty constructor. + StdLPersistent_Real() + : myValue(0.0), + myDimension(0) + { + } //! Read persistent data from a file. inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myValue >> myDimension; } diff -Nru opencascade-7.4.1+dfsg1/src/StdLPersistent/StdLPersistent_Variable.hxx opencascade-7.5.1+dfsg1/src/StdLPersistent/StdLPersistent_Variable.hxx --- opencascade-7.4.1+dfsg1/src/StdLPersistent/StdLPersistent_Variable.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdLPersistent/StdLPersistent_Variable.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,11 @@ class StdLPersistent_Variable : public StdObjMgt_Attribute { public: + //! Empty constructor. + StdLPersistent_Variable() + : myIsConstant(Standard_False) + { + } //! Read persistent data from a file. inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myIsConstant >> myUnit; } diff -Nru opencascade-7.4.1+dfsg1/src/StdObject/StdObject_Shape.hxx opencascade-7.5.1+dfsg1/src/StdObject/StdObject_Shape.hxx --- opencascade-7.4.1+dfsg1/src/StdObject/StdObject_Shape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdObject/StdObject_Shape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,6 +28,9 @@ friend class ShapePersistent_TopoDS; public: + //! Empty constructor. + StdObject_Shape() : myOrient(0) {} + //! Import transient object from the persistent data. Standard_EXPORT TopoDS_Shape Import() const; diff -Nru opencascade-7.4.1+dfsg1/src/StdObjMgt/StdObjMgt_ReadData.cxx opencascade-7.5.1+dfsg1/src/StdObjMgt/StdObjMgt_ReadData.cxx --- opencascade-7.4.1+dfsg1/src/StdObjMgt/StdObjMgt_ReadData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdObjMgt/StdObjMgt_ReadData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,8 +18,8 @@ StdObjMgt_ReadData::StdObjMgt_ReadData - (Storage_BaseDriver& theDriver, const Standard_Integer theNumberOfObjects) - : myDriver (&theDriver) + (const Handle(Storage_BaseDriver)& theDriver, const Standard_Integer theNumberOfObjects) + : myDriver (theDriver) , myPersistentObjects (1, theNumberOfObjects) {} void StdObjMgt_ReadData::ReadPersistentObject (const Standard_Integer theRef) diff -Nru opencascade-7.4.1+dfsg1/src/StdObjMgt/StdObjMgt_ReadData.hxx opencascade-7.5.1+dfsg1/src/StdObjMgt/StdObjMgt_ReadData.hxx --- opencascade-7.4.1+dfsg1/src/StdObjMgt/StdObjMgt_ReadData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdObjMgt/StdObjMgt_ReadData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -46,7 +46,7 @@ }; Standard_EXPORT StdObjMgt_ReadData - (Storage_BaseDriver& theDriver, const Standard_Integer theNumberOfObjects); + (const Handle(Storage_BaseDriver)& theDriver, const Standard_Integer theNumberOfObjects); template void CreatePersistentObject @@ -101,7 +101,7 @@ { return ReadValue (theValue); } private: - Storage_BaseDriver* myDriver; + Handle(Storage_BaseDriver) myDriver; NCollection_Array1 myPersistentObjects; }; diff -Nru opencascade-7.4.1+dfsg1/src/StdObjMgt/StdObjMgt_WriteData.cxx opencascade-7.5.1+dfsg1/src/StdObjMgt/StdObjMgt_WriteData.cxx --- opencascade-7.4.1+dfsg1/src/StdObjMgt/StdObjMgt_WriteData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdObjMgt/StdObjMgt_WriteData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,8 +17,8 @@ #include -StdObjMgt_WriteData::StdObjMgt_WriteData (Storage_BaseDriver& theDriver) - : myDriver (&theDriver) +StdObjMgt_WriteData::StdObjMgt_WriteData (const Handle(Storage_BaseDriver)& theDriver) + : myDriver (theDriver) { } diff -Nru opencascade-7.4.1+dfsg1/src/StdObjMgt/StdObjMgt_WriteData.hxx opencascade-7.5.1+dfsg1/src/StdObjMgt/StdObjMgt_WriteData.hxx --- opencascade-7.4.1+dfsg1/src/StdObjMgt/StdObjMgt_WriteData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdObjMgt/StdObjMgt_WriteData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -44,11 +44,9 @@ ObjectSentry& operator = (const ObjectSentry&); }; - Standard_EXPORT StdObjMgt_WriteData - (Storage_BaseDriver& theDriver); + Standard_EXPORT StdObjMgt_WriteData (const Handle(Storage_BaseDriver)& theDriver); - Standard_EXPORT void WritePersistentObject - (const Handle(StdObjMgt_Persistent)& thePersistent); + Standard_EXPORT void WritePersistentObject (const Handle(StdObjMgt_Persistent)& thePersistent); template StdObjMgt_WriteData& operator << (const Handle(Persistent)& thePersistent) @@ -85,7 +83,7 @@ { return WriteValue(theValue); } private: - Storage_BaseDriver* myDriver; + Handle(Storage_BaseDriver) myDriver; }; Standard_EXPORT StdObjMgt_WriteData& operator << diff -Nru opencascade-7.4.1+dfsg1/src/StdPersistent/StdPersistent_TopoDS.hxx opencascade-7.5.1+dfsg1/src/StdPersistent/StdPersistent_TopoDS.hxx --- opencascade-7.4.1+dfsg1/src/StdPersistent/StdPersistent_TopoDS.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPersistent/StdPersistent_TopoDS.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,6 +32,7 @@ DEFINE_STANDARD_RTTI_INLINE(pTShape, Standard_Transient) public: + pTShape() : myFlags(0) {} inline void Read (StdObjMgt_ReadData& theReadData) { theReadData >> myShapes >> myFlags; } inline void Write (StdObjMgt_WriteData& theWriteData) const diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/FILES opencascade-7.5.1+dfsg1/src/StdPrs/FILES --- opencascade-7.4.1+dfsg1/src/StdPrs/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,4 +1,7 @@ -StdPrs_BndBox.cxx +StdPrs_BRepFont.cxx +StdPrs_BRepFont.hxx +StdPrs_BRepTextBuilder.cxx +StdPrs_BRepTextBuilder.hxx StdPrs_BndBox.hxx StdPrs_Curve.cxx StdPrs_Curve.hxx @@ -8,6 +11,8 @@ StdPrs_HLRPolyShape.hxx StdPrs_HLRShape.cxx StdPrs_HLRShape.hxx +StdPrs_HLRShapeI.cxx +StdPrs_HLRShapeI.hxx StdPrs_HLRToolShape.cxx StdPrs_HLRToolShape.hxx StdPrs_Isolines.cxx @@ -21,6 +26,8 @@ StdPrs_ShadedShape.hxx StdPrs_ShadedSurface.cxx StdPrs_ShadedSurface.hxx +StdPrs_ShapeTool.cxx +StdPrs_ShapeTool.hxx StdPrs_ToolPoint.cxx StdPrs_ToolPoint.hxx StdPrs_ToolRFace.cxx diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BndBox.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BndBox.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BndBox.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BndBox.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -// Created on: 2014-10-14 -// Created by: Anton POLETAEV -// Copyright (c) 2013-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -#include - -//======================================================================= -//function : Add -//purpose : -//======================================================================= -void StdPrs_BndBox::Add (const Handle(Prs3d_Presentation)& thePresentation, - const Bnd_Box& theBndBox, - const Handle(Prs3d_Drawer)& theDrawer) -{ - if (!theBndBox.IsVoid()) - { - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePresentation); - aGroup->SetGroupPrimitivesAspect (new Graphic3d_AspectLine3d (theDrawer->LineAspect()->Aspect()->Color(), - Aspect_TOL_DOTDASH, - theDrawer->LineAspect()->Aspect()->Width())); - aGroup->AddPrimitiveArray (FillSegments (theBndBox)); - } -} - -//======================================================================= -//function : Add -//purpose : -//======================================================================= -void StdPrs_BndBox::Add (const Handle(Prs3d_Presentation)& thePresentation, - const Bnd_OBB& theBndBox, - const Handle(Prs3d_Drawer)& theDrawer) -{ - if (!theBndBox.IsVoid()) - { - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePresentation); - aGroup->SetGroupPrimitivesAspect (new Graphic3d_AspectLine3d (theDrawer->LineAspect()->Aspect()->Color(), - Aspect_TOL_DOTDASH, - theDrawer->LineAspect()->Aspect()->Width())); - aGroup->AddPrimitiveArray (FillSegments (theBndBox)); - } -} diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BndBox.hxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BndBox.hxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BndBox.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BndBox.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,6 +1,4 @@ -// Created on: 2014-10-14 -// Created by: Anton POLETAEV -// Copyright (c) 2013-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -16,133 +14,8 @@ #ifndef _StdPrs_BndBox_H__ #define _StdPrs_BndBox_H__ -#include -#include -#include -#include -#include -#include +#include -//! Tool for computing bounding box presentation. -class StdPrs_BndBox : public Prs3d_Root -{ -public: - - //! Computes presentation of a bounding box. - //! @param thePresentation [in] the presentation. - //! @param theBndBox [in] the bounding box. - //! @param theDrawer [in] the drawer. - Standard_EXPORT static void Add (const Handle(Prs3d_Presentation)& thePresentation, - const Bnd_Box& theBndBox, - const Handle(Prs3d_Drawer)& theDrawer); - - //! Computes presentation of a bounding box. - //! @param thePresentation [in] the presentation. - //! @param theBndBox [in] the bounding box. - //! @param theDrawer [in] the drawer. - Standard_EXPORT static void Add (const Handle(Prs3d_Presentation)& thePresentation, - const Bnd_OBB& theBndBox, - const Handle(Prs3d_Drawer)& theDrawer); - -public: - - //! Create primitive array with line segments for displaying a box. - //! @param theBox [in] the box to add - static Handle(Graphic3d_ArrayOfSegments) FillSegments (const Bnd_OBB& theBox) - { - if (theBox.IsVoid()) - { - return Handle(Graphic3d_ArrayOfSegments)(); - } - - Handle(Graphic3d_ArrayOfSegments) aSegs = new Graphic3d_ArrayOfSegments (8, 12 * 2); - FillSegments (aSegs, theBox); - return aSegs; - } - - //! Create primitive array with line segments for displaying a box. - //! @param theBox [in] the box to add - static Handle(Graphic3d_ArrayOfSegments) FillSegments (const Bnd_Box& theBox) - { - if (theBox.IsVoid()) - { - return Handle(Graphic3d_ArrayOfSegments)(); - } - - Handle(Graphic3d_ArrayOfSegments) aSegs = new Graphic3d_ArrayOfSegments (8, 12 * 2); - FillSegments (aSegs, theBox); - return aSegs; - } - - //! Create primitive array with line segments for displaying a box. - //! @param theSegments [in] [out] primitive array to be filled; - //! should be at least 8 nodes and 24 edges in size - //! @param theBox [in] the box to add - static void FillSegments (const Handle(Graphic3d_ArrayOfSegments)& theSegments, const Bnd_OBB& theBox) - { - if (!theBox.IsVoid()) - { - gp_Pnt aXYZ[8]; - theBox.GetVertex (aXYZ); - fillSegments (theSegments, aXYZ); - } - } - - //! Create primitive array with line segments for displaying a box. - //! @param theSegments [in] [out] primitive array to be filled; - //! should be at least 8 nodes and 24 edges in size - //! @param theBox [in] the box to add - static void FillSegments (const Handle(Graphic3d_ArrayOfSegments)& theSegments, const Bnd_Box& theBox) - { - if (!theBox.IsVoid()) - { - const gp_Pnt aMin = theBox.CornerMin(); - const gp_Pnt aMax = theBox.CornerMax(); - const gp_Pnt aXYZ[8] = - { - gp_Pnt (aMin.X(), aMin.Y(), aMin.Z()), - gp_Pnt (aMax.X(), aMin.Y(), aMin.Z()), - gp_Pnt (aMin.X(), aMax.Y(), aMin.Z()), - gp_Pnt (aMax.X(), aMax.Y(), aMin.Z()), - gp_Pnt (aMin.X(), aMin.Y(), aMax.Z()), - gp_Pnt (aMax.X(), aMin.Y(), aMax.Z()), - gp_Pnt (aMin.X(), aMax.Y(), aMax.Z()), - gp_Pnt (aMax.X(), aMax.Y(), aMax.Z()), - }; - fillSegments (theSegments, aXYZ); - } - } - -public: - - //! Create primitive array with line segments for displaying a box. - //! @param theSegments [in] [out] primitive array to be filled; - //! should be at least 8 nodes and 24 edges in size - //! @param theBox [in] the box to add - static void fillSegments (const Handle(Graphic3d_ArrayOfSegments)& theSegments, const gp_Pnt* theBox) - { - const Standard_Integer aFrom = theSegments->VertexNumber(); - for (int aVertIter = 0; aVertIter < 8; ++aVertIter) - { - theSegments->AddVertex (theBox[aVertIter]); - } - - theSegments->AddEdges (aFrom + 1, aFrom + 2); - theSegments->AddEdges (aFrom + 3, aFrom + 4); - theSegments->AddEdges (aFrom + 5, aFrom + 6); - theSegments->AddEdges (aFrom + 7, aFrom + 8); - // - theSegments->AddEdges (aFrom + 1, aFrom + 3); - theSegments->AddEdges (aFrom + 2, aFrom + 4); - theSegments->AddEdges (aFrom + 5, aFrom + 7); - theSegments->AddEdges (aFrom + 6, aFrom + 8); - // - theSegments->AddEdges (aFrom + 1, aFrom + 5); - theSegments->AddEdges (aFrom + 2, aFrom + 6); - theSegments->AddEdges (aFrom + 3, aFrom + 7); - theSegments->AddEdges (aFrom + 4, aFrom + 8); - } - -}; +typedef Prs3d_BndBox StdPrs_BndBox; #endif // _StdPrs_BndBox_H__ diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BRepFont.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BRepFont.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BRepFont.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BRepFont.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,672 @@ +// Created on: 2013-09-16 +// Copyright (c) 2013-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include FT_FREETYPE_H +#include FT_OUTLINE_H + +IMPLEMENT_STANDARD_RTTIEXT(StdPrs_BRepFont, Standard_Transient) + +namespace +{ + // pre-defined font rendering options + static const unsigned int THE_FONT_SIZE = 72; + static const unsigned int THE_RESOLUTION_DPI = 4800; + static const Font_FTFontParams THE_FONT_PARAMS (THE_FONT_SIZE, THE_RESOLUTION_DPI); + + // compute scaling factor for specified font size + inline Standard_Real getScale (const Standard_Real theSize) + { + return theSize / Standard_Real(THE_FONT_SIZE) * 72.0 / Standard_Real(THE_RESOLUTION_DPI); + } + + //! Auxiliary method to convert FT_Vector to gp_XY + static gp_XY readFTVec (const FT_Vector& theVec, + const Standard_Real theScaleUnits, + const Standard_Real theWidthScaling = 1.0) + { + return gp_XY (theScaleUnits * Standard_Real(theVec.x) * theWidthScaling / 64.0, theScaleUnits * Standard_Real(theVec.y) / 64.0); + } + + //! Auxiliary method for classification wire theW2 with respect to wire theW1 + static TopAbs_State classifyWW (const TopoDS_Wire& theW1, + const TopoDS_Wire& theW2, + const TopoDS_Face& theF) + { + TopAbs_State aRes = TopAbs_UNKNOWN; + + TopoDS_Face aF = TopoDS::Face (theF.EmptyCopied()); + aF.Orientation (TopAbs_FORWARD); + BRep_Builder aB; + aB.Add (aF, theW1); + BRepTopAdaptor_FClass2d aClass2d (aF, ::Precision::PConfusion()); + for (TopoDS_Iterator anEdgeIter (theW2); anEdgeIter.More(); anEdgeIter.Next()) + { + const TopoDS_Edge& anEdge = TopoDS::Edge (anEdgeIter.Value()); + Standard_Real aPFirst = 0.0, aPLast = 0.0; + Handle(Geom2d_Curve) aCurve2d = BRep_Tool::CurveOnSurface (anEdge, theF, aPFirst, aPLast); + if (aCurve2d.IsNull()) + { + continue; + } + + gp_Pnt2d aPnt2d = aCurve2d->Value ((aPFirst + aPLast) / 2.0); + TopAbs_State aState = aClass2d.Perform (aPnt2d, Standard_False); + if (aState == TopAbs_OUT + || aState == TopAbs_IN) + { + if (aRes == TopAbs_UNKNOWN) + { + aRes = aState; + } + else if (aRes != aState) + { + return TopAbs_UNKNOWN; + } + } + } + return aRes; + } + +} + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= +StdPrs_BRepFont::StdPrs_BRepFont () +: myPrecision (Precision::Confusion()), + myScaleUnits (1.0), + myIsCompositeCurve (Standard_False), + my3Poles (1, 3), + my4Poles (1, 4) +{ + myFTFont = new Font_FTFont(); + init(); +} + +// ======================================================================= +// function : init +// purpose : +// ======================================================================= +void StdPrs_BRepFont::init() +{ + mySurface = new Geom_Plane (gp_Pln (gp::XOY())); + myCurve2dAdaptor = new Geom2dAdaptor_HCurve(); + Handle(Adaptor3d_HSurface) aSurfAdaptor = new GeomAdaptor_HSurface (mySurface); + myCurvOnSurf.Load (aSurfAdaptor); +} + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= +StdPrs_BRepFont::StdPrs_BRepFont (const NCollection_String& theFontPath, + const Standard_Real theSize, + const Standard_Integer theFaceId) +: myPrecision (Precision::Confusion()), + myScaleUnits (1.0), + myIsCompositeCurve (Standard_False), + my3Poles (1, 3), + my4Poles (1, 4) +{ + init(); + if (theSize <= myPrecision * 100.0) + { + return; + } + + myScaleUnits = getScale (theSize); + myFTFont = new Font_FTFont(); + myFTFont->Init (theFontPath.ToCString(), THE_FONT_PARAMS, theFaceId); +} + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= +StdPrs_BRepFont::StdPrs_BRepFont (const NCollection_String& theFontName, + const Font_FontAspect theFontAspect, + const Standard_Real theSize, + const Font_StrictLevel theStrictLevel) +: myPrecision (Precision::Confusion()), + myScaleUnits (1.0), + myIsCompositeCurve (Standard_False), + my3Poles (1, 3), + my4Poles (1, 4) +{ + init(); + if (theSize <= myPrecision * 100.0) + { + return; + } + + myScaleUnits = getScale (theSize); + myFTFont = new Font_FTFont(); + myFTFont->FindAndInit (theFontName.ToCString(), theFontAspect, THE_FONT_PARAMS, theStrictLevel); +} + +// ======================================================================= +// function : Release +// purpose : +// ======================================================================= +void StdPrs_BRepFont::Release() +{ + myCache.Clear(); + myFTFont->Release(); +} + +// ======================================================================= +// function : FindAndCreate +// purpose : +// ======================================================================= +Handle(StdPrs_BRepFont) StdPrs_BRepFont::FindAndCreate (const TCollection_AsciiString& theFontName, + const Font_FontAspect theFontAspect, + const Standard_Real theSize, + const Font_StrictLevel theStrictLevel) +{ + Handle(StdPrs_BRepFont) aFont = new StdPrs_BRepFont(); + + if (aFont->FindAndInit (theFontName, theFontAspect, theSize, theStrictLevel)) + return aFont; + + return Handle(StdPrs_BRepFont)(); +} + +// ======================================================================= +// function : SetCompositeCurveMode +// purpose : +// ======================================================================= +void StdPrs_BRepFont::SetCompositeCurveMode (const Standard_Boolean theToConcatenate) +{ + if (myIsCompositeCurve != theToConcatenate) + { + myIsCompositeCurve = theToConcatenate; + myCache.Clear(); + } +} + +// ======================================================================= +// function : Init +// purpose : +// ======================================================================= +bool StdPrs_BRepFont::Init (const NCollection_String& theFontPath, + const Standard_Real theSize, + const Standard_Integer theFaceId) +{ + if (theSize <= myPrecision * 100.0) + { + return false; + } + + myScaleUnits = getScale (theSize); + myCache.Clear(); + return myFTFont->Init (theFontPath.ToCString(), THE_FONT_PARAMS, theFaceId); +} + +// ======================================================================= +// function : FindAndInit +// purpose : +// ======================================================================= +bool StdPrs_BRepFont::FindAndInit (const TCollection_AsciiString& theFontName, + const Font_FontAspect theFontAspect, + const Standard_Real theSize, + const Font_StrictLevel theStrictLevel) +{ + if (theSize <= myPrecision * 100.0) + { + return false; + } + + myScaleUnits = getScale (theSize); + myCache.Clear(); + return myFTFont->FindAndInit (theFontName.ToCString(), theFontAspect, THE_FONT_PARAMS, theStrictLevel); +} + +// ======================================================================= +// function : RenderGlyph +// purpose : +// ======================================================================= +TopoDS_Shape StdPrs_BRepFont::RenderGlyph (const Standard_Utf32Char& theChar) +{ + TopoDS_Shape aShape; + Standard_Mutex::Sentry aSentry (myMutex); + renderGlyph (theChar, aShape); + return aShape; +} + +// ======================================================================= +// function : to3d +// purpose : +// ======================================================================= +bool StdPrs_BRepFont::to3d (const Handle(Geom2d_Curve)& theCurve2d, + const GeomAbs_Shape theContinuity, + Handle(Geom_Curve)& theCurve3d) +{ + Standard_Real aMaxDeviation = 0.0; + Standard_Real anAverDeviation = 0.0; + myCurve2dAdaptor->ChangeCurve2d().Load (theCurve2d); + const Handle(Adaptor2d_HCurve2d)& aCurve = myCurve2dAdaptor; // to avoid ambiguity + myCurvOnSurf.Load (aCurve); + GeomLib::BuildCurve3d (myPrecision, myCurvOnSurf, + myCurve2dAdaptor->FirstParameter(), myCurve2dAdaptor->LastParameter(), + theCurve3d, aMaxDeviation, anAverDeviation, theContinuity); + return !theCurve3d.IsNull(); +} + + +// ======================================================================= +// function : buildFaces +// purpose : +// ======================================================================= +Standard_Boolean StdPrs_BRepFont::buildFaces (const NCollection_Sequence& theWires, + TopoDS_Shape& theRes) +{ + // classify wires + NCollection_DataMap, TopTools_ShapeMapHasher> aMapOutInts; + TopTools_DataMapOfShapeInteger aMapNbOuts; + TopoDS_Face aF; + myBuilder.MakeFace (aF, mySurface, myPrecision); + Standard_Integer aWireIter1Index = 1; + for (NCollection_Sequence::Iterator aWireIter1 (theWires); aWireIter1.More(); ++aWireIter1Index, aWireIter1.Next()) + { + const TopoDS_Wire& aW1 = aWireIter1.Value(); + if (!aMapNbOuts.IsBound (aW1)) + { + const Standard_Integer aNbOuts = 0; + aMapNbOuts.Bind (aW1, aNbOuts); + } + + NCollection_Sequence* anIntWs = aMapOutInts.Bound (aW1, NCollection_Sequence()); + Standard_Integer aWireIter2Index = 1; + for (NCollection_Sequence::Iterator aWireIter2 (theWires); aWireIter2.More(); ++aWireIter2Index, aWireIter2.Next()) + { + if (aWireIter1Index == aWireIter2Index) + { + continue; + } + + const TopoDS_Wire& aW2 = aWireIter2.Value(); + const TopAbs_State aClass = classifyWW (aW1, aW2, aF); + if (aClass == TopAbs_IN) + { + anIntWs->Append (aW2); + if (Standard_Integer* aNbOutsPtr = aMapNbOuts.ChangeSeek (aW2)) + { + ++(*aNbOutsPtr); + } + else + { + const Standard_Integer aNbOuts = 1; + aMapNbOuts.Bind (aW2, aNbOuts); + } + } + } + } + + // check out wires and remove "not out" wires from maps + for (TopTools_DataMapIteratorOfDataMapOfShapeInteger anOutIter (aMapNbOuts); anOutIter.More(); anOutIter.Next()) + { + const Standard_Integer aTmp = anOutIter.Value() % 2; + if (aTmp > 0) + { + // not out wire + aMapOutInts.UnBind (anOutIter.Key()); + } + } + + // create faces for out wires + TopTools_MapOfShape anUsedShapes; + TopoDS_Compound aFaceComp; + myBuilder.MakeCompound (aFaceComp); + for (; !aMapOutInts.IsEmpty(); ) + { + // find out wire with max number of outs + TopoDS_Shape aW; + Standard_Integer aMaxNbOuts = -1; + for (NCollection_DataMap, TopTools_ShapeMapHasher>::Iterator itMOI (aMapOutInts); + itMOI.More(); itMOI.Next()) + { + const TopoDS_Shape& aKey = itMOI.Key(); + const Standard_Integer aNbOuts = aMapNbOuts.Find (aKey); + if (aNbOuts > aMaxNbOuts) + { + aMaxNbOuts = aNbOuts; + aW = aKey; + } + } + + // create face for selected wire + TopoDS_Face aNewF; + myBuilder.MakeFace (aNewF, mySurface, myPrecision); + myBuilder.Add (aNewF, aW); + anUsedShapes.Add (aW); + const NCollection_Sequence& anIns = aMapOutInts.Find (aW); + for (NCollection_Sequence::Iterator aWireIter (anIns); aWireIter.More(); aWireIter.Next()) + { + TopoDS_Wire aWin = aWireIter.Value(); + if (anUsedShapes.Contains (aWin)) + { + continue; + } + + aWin.Reverse(); + myBuilder.Add (aNewF, aWin); + anUsedShapes.Add (aWin); + } + + myBuilder.Add (aFaceComp, aNewF); + aMapOutInts.UnBind (aW); + } + + if (aFaceComp.NbChildren() == 0) + { + return Standard_False; + } + + if (aFaceComp.NbChildren() == 1) + { + theRes = TopoDS_Iterator (aFaceComp).Value(); + } + else + { + theRes = aFaceComp; + } + return Standard_True; +} + +// ======================================================================= +// function : renderGlyph +// purpose : +// ======================================================================= +Standard_Boolean StdPrs_BRepFont::renderGlyph (const Standard_Utf32Char theChar, + TopoDS_Shape& theShape) +{ + theShape.Nullify(); + + const FT_Outline* anOutline = myFTFont->renderGlyphOutline (theChar); + if (!anOutline) + { + return Standard_False; + } + else if (myCache.Find (theChar, theShape)) + { + return !theShape.IsNull(); + } + + if (!anOutline->n_contours) + return Standard_False; + + TopLoc_Location aLoc; + NCollection_Sequence aWires; + TopoDS_Compound aFaceCompDraft; + + // Get orientation is useless since it doesn't retrieve any in-font information and just computes orientation. + // Because it fails in some cases - leave this to ShapeFix. + //const FT_Orientation anOrient = FT_Outline_Get_Orientation (&anOutline); + for (short aContour = 0, aStartIndex = 0; aContour < anOutline->n_contours; ++aContour) + { + const FT_Vector* aPntList = &anOutline->points[aStartIndex]; + const char* aTags = &anOutline->tags[aStartIndex]; + const short anEndIndex = anOutline->contours[aContour]; + const short aPntsNb = (anEndIndex - aStartIndex) + 1; + aStartIndex = anEndIndex + 1; + if (aPntsNb < 3 && !myFTFont->IsSingleStrokeFont()) + { + // closed contour can not be constructed from < 3 points + continue; + } + + BRepBuilderAPI_MakeWire aWireMaker; + + gp_XY aPntPrev; + gp_XY aPntCurr = readFTVec (aPntList[aPntsNb - 1], myScaleUnits, myFTFont->WidthScaling()); + gp_XY aPntNext = readFTVec (aPntList[0], myScaleUnits, myFTFont->WidthScaling()); + + bool isLineSeg = !myFTFont->IsSingleStrokeFont() + && FT_CURVE_TAG(aTags[aPntsNb - 1]) == FT_Curve_Tag_On; + gp_XY aPntLine1 = aPntCurr; + + // see http://freetype.sourceforge.net/freetype2/docs/glyphs/glyphs-6.html + // for a full description of FreeType tags. + for (short aPntId = 0; aPntId < aPntsNb; ++aPntId) + { + aPntPrev = aPntCurr; + aPntCurr = aPntNext; + aPntNext = readFTVec (aPntList[(aPntId + 1) % aPntsNb], myScaleUnits, myFTFont->WidthScaling()); + + // process tags + if (FT_CURVE_TAG(aTags[aPntId]) == FT_Curve_Tag_On) + { + if (!isLineSeg) + { + aPntLine1 = aPntCurr; + isLineSeg = true; + continue; + } + + const gp_XY aDirVec = aPntCurr - aPntLine1; + const Standard_Real aLen = aDirVec.Modulus(); + if (aLen <= myPrecision) + { + aPntLine1 = aPntCurr; + isLineSeg = true; + continue; + } + + if (myIsCompositeCurve) + { + Handle(Geom2d_TrimmedCurve) aLine = GCE2d_MakeSegment (gp_Pnt2d (aPntLine1), gp_Pnt2d (aPntCurr)); + myConcatMaker.Add (aLine, myPrecision); + } + else + { + Handle(Geom_Curve) aCurve3d; + Handle(Geom2d_Line) aCurve2d = new Geom2d_Line (gp_Pnt2d (aPntLine1), gp_Dir2d (aDirVec)); + if (to3d (aCurve2d, GeomAbs_C1, aCurve3d)) + { + TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d, 0.0, aLen); + myBuilder.UpdateEdge (anEdge, aCurve2d, mySurface, aLoc, myPrecision); + aWireMaker.Add (anEdge); + } + } + aPntLine1 = aPntCurr; + } + else if (FT_CURVE_TAG(aTags[aPntId]) == FT_Curve_Tag_Conic) + { + isLineSeg = false; + gp_XY aPntPrev2 = aPntPrev; + gp_XY aPntNext2 = aPntNext; + + // previous point is either the real previous point (an "on" point), + // or the midpoint between the current one and the previous "conic off" point + if (FT_CURVE_TAG(aTags[(aPntId - 1 + aPntsNb) % aPntsNb]) == FT_Curve_Tag_Conic) + { + aPntPrev2 = (aPntCurr + aPntPrev) * 0.5; + } + + // next point is either the real next point or the midpoint + if (FT_CURVE_TAG(aTags[(aPntId + 1) % aPntsNb]) == FT_Curve_Tag_Conic) + { + aPntNext2 = (aPntCurr + aPntNext) * 0.5; + } + + my3Poles.SetValue (1, aPntPrev2); + my3Poles.SetValue (2, aPntCurr); + my3Poles.SetValue (3, aPntNext2); + Handle(Geom2d_BezierCurve) aBezierArc = new Geom2d_BezierCurve (my3Poles); + if (myIsCompositeCurve) + { + myConcatMaker.Add (aBezierArc, myPrecision); + } + else + { + Handle(Geom_Curve) aCurve3d; + if (to3d (aBezierArc, GeomAbs_C1, aCurve3d)) + { + TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d); + myBuilder.UpdateEdge (anEdge, aBezierArc, mySurface, aLoc, myPrecision); + aWireMaker.Add (anEdge); + } + } + } + else if (FT_CURVE_TAG(aTags[aPntId]) == FT_Curve_Tag_Cubic + && FT_CURVE_TAG(aTags[(aPntId + 1) % aPntsNb]) == FT_Curve_Tag_Cubic) + { + isLineSeg = false; + my4Poles.SetValue (1, aPntPrev); + my4Poles.SetValue (2, aPntCurr); + my4Poles.SetValue (3, aPntNext); + my4Poles.SetValue (4, gp_Pnt2d(readFTVec (aPntList[(aPntId + 2) % aPntsNb], myScaleUnits, myFTFont->WidthScaling()))); + Handle(Geom2d_BezierCurve) aBezier = new Geom2d_BezierCurve (my4Poles); + if (myIsCompositeCurve) + { + myConcatMaker.Add (aBezier, myPrecision); + } + else + { + Handle(Geom_Curve) aCurve3d; + if (to3d (aBezier, GeomAbs_C1, aCurve3d)) + { + TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d); + myBuilder.UpdateEdge (anEdge, aBezier, mySurface, aLoc, myPrecision); + aWireMaker.Add (anEdge); + } + } + } + } + + if (myIsCompositeCurve) + { + Handle(Geom2d_BSplineCurve) aDraft2d = myConcatMaker.BSplineCurve(); + if (aDraft2d.IsNull()) + { + continue; + } + + const gp_Pnt2d aFirstPnt = aDraft2d->StartPoint(); + const gp_Pnt2d aLastPnt = aDraft2d->EndPoint(); + if (!myFTFont->IsSingleStrokeFont() + && !aFirstPnt.IsEqual (aLastPnt, myPrecision)) + { + Handle(Geom2d_TrimmedCurve) aLine = GCE2d_MakeSegment (aLastPnt, aFirstPnt); + myConcatMaker.Add (aLine, myPrecision); + } + + Handle(Geom2d_BSplineCurve) aCurve2d = myConcatMaker.BSplineCurve(); + Handle(Geom_Curve) aCurve3d; + if (to3d (aCurve2d, GeomAbs_C0, aCurve3d)) + { + TopoDS_Edge anEdge = BRepLib_MakeEdge (aCurve3d); + myBuilder.UpdateEdge (anEdge, aCurve2d, mySurface, aLoc, myPrecision); + aWireMaker.Add (anEdge); + } + myConcatMaker.Clear(); + } + else + { + if (!aWireMaker.IsDone()) + { + continue; + } + + TopoDS_Vertex aFirstV, aLastV; + TopExp::Vertices (aWireMaker.Wire(), aFirstV, aLastV); + gp_Pnt aFirstPoint = BRep_Tool::Pnt (aFirstV); + gp_Pnt aLastPoint = BRep_Tool::Pnt (aLastV); + if (!myFTFont->IsSingleStrokeFont() + && !aFirstPoint.IsEqual (aLastPoint, myPrecision)) + { + aWireMaker.Add (BRepLib_MakeEdge (aFirstV, aLastV)); + } + } + + if (!aWireMaker.IsDone()) + { + continue; + } + + TopoDS_Wire aWireDraft = aWireMaker.Wire(); + if (!myFTFont->IsSingleStrokeFont()) + { + // collect all wires and set CCW orientation + TopoDS_Face aFace; + myBuilder.MakeFace (aFace, mySurface, myPrecision); + myBuilder.Add (aFace, aWireDraft); + BRepTopAdaptor_FClass2d aClass2d (aFace, ::Precision::PConfusion()); + TopAbs_State aState = aClass2d.PerformInfinitePoint(); + if (aState != TopAbs_OUT) + { + // need to reverse + aWireDraft.Reverse(); + } + aWires.Append (aWireDraft); + } + else + { + if (aFaceCompDraft.IsNull()) + { + myBuilder.MakeCompound (aFaceCompDraft); + } + myBuilder.Add (aFaceCompDraft, aWireDraft); + } + } + + if (!aWires.IsEmpty()) + { + buildFaces (aWires, theShape); + } + else if (!aFaceCompDraft.IsNull()) + { + theShape = aFaceCompDraft; + } + + myCache.Bind (theChar, theShape); + return !theShape.IsNull(); +} diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BRepFont.hxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BRepFont.hxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BRepFont.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BRepFont.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,256 @@ +// Created on: 2013-09-16 +// Copyright (c) 2013-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StdPrs_BRepFont_H__ +#define _StdPrs_BRepFont_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE(StdPrs_BRepFont, Standard_Transient) + +//! This tool provides basic services for rendering of vectorized text glyphs as BRep shapes. +//! Single instance initialize single font for sequential glyphs rendering with implicit caching of already rendered glyphs. +//! Thus position of each glyph in the text is specified by shape location. +//! +//! Please notice that this implementation uses mutex for thread-safety access, +//! thus may lead to performance penalties in case of concurrent access. +//! Although caching should eliminate this issue after rendering of sufficient number of glyphs. +class StdPrs_BRepFont : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(StdPrs_BRepFont, Standard_Transient) +public: + + //! Find the font Initialize the font. + //! @param theFontName the font name + //! @param theFontAspect the font style + //! @param theSize the face size in model units + //! @param theStrictLevel search strict level for using aliases and fallback + //! @return true on success + Standard_EXPORT static Handle(StdPrs_BRepFont) FindAndCreate (const TCollection_AsciiString& theFontName, + const Font_FontAspect theFontAspect, + const Standard_Real theSize, + const Font_StrictLevel theStrictLevel = Font_StrictLevel_Any); + + //! Empty constructor + Standard_EXPORT StdPrs_BRepFont(); + + //! Constructor with initialization. + //! @param theFontPath FULL path to the font + //! @param theSize the face size in model units + //! @param theFaceId face id within the file (0 by default) + Standard_EXPORT StdPrs_BRepFont (const NCollection_String& theFontPath, + const Standard_Real theSize, + const Standard_Integer theFaceId = 0); + + //! Constructor with initialization. + //! @param theFontName the font name + //! @param theFontAspect the font style + //! @param theSize the face size in model units + //! @param theStrictLevel search strict level for using aliases and fallback + Standard_EXPORT StdPrs_BRepFont (const NCollection_String& theFontName, + const Font_FontAspect theFontAspect, + const Standard_Real theSize, + const Font_StrictLevel theStrictLevel = Font_StrictLevel_Any); + + //! Release currently loaded font. + Standard_EXPORT virtual void Release(); + + //! Initialize the font. + //! @param theFontPath FULL path to the font + //! @param theSize the face size in model units + //! @param theFaceId face id within the file (0 by default) + //! @return true on success + Standard_EXPORT bool Init (const NCollection_String& theFontPath, + const Standard_Real theSize, + const Standard_Integer theFaceId); + + //! Find (using Font_FontMgr) and initialize the font from the given name. + //! Please take into account that size is specified NOT in typography points (pt.). + //! If you need to specify size in points, value should be converted. + //! Formula for pt. -> m conversion: + //! aSizeMeters = 0.0254 * theSizePt / 72.0 + //! @param theFontName the font name + //! @param theFontAspect the font style + //! @param theSize the face size in model units + //! @param theStrictLevel search strict level for using aliases and fallback + //! @return true on success + Standard_EXPORT bool FindAndInit (const TCollection_AsciiString& theFontName, + const Font_FontAspect theFontAspect, + const Standard_Real theSize, + const Font_StrictLevel theStrictLevel = Font_StrictLevel_Any); + + //! Return wrapper over FreeType font. + const Handle(Font_FTFont)& FTFont() const { return myFTFont; } + + //! Render single glyph as TopoDS_Shape. + //! @param theChar glyph identifier + //! @return rendered glyph within cache, might be NULL shape + Standard_EXPORT TopoDS_Shape RenderGlyph (const Standard_Utf32Char& theChar); + + //! Setup glyph geometry construction mode. + //! By default algorithm creates independent TopoDS_Edge + //! for each original curve in the glyph (line segment or Bezie curve). + //! Algorithm might optionally create composite BSpline curve for each contour + //! which reduces memory footprint but limits curve class to C0. + //! Notice that altering this flag clears currently accumulated cache! + Standard_EXPORT void SetCompositeCurveMode (const Standard_Boolean theToConcatenate); + + //! Setup glyph scaling along X-axis. + //! By default glyphs are not scaled (scaling factor = 1.0) + void SetWidthScaling (const float theScaleFactor) + { + myFTFont->SetWidthScaling (theScaleFactor); + } + +public: + + //! @return vertical distance from the horizontal baseline to the highest character coordinate. + Standard_Real Ascender() const + { + return myScaleUnits * Standard_Real(myFTFont->Ascender()); + } + + //! @return vertical distance from the horizontal baseline to the lowest character coordinate. + Standard_Real Descender() const + { + return myScaleUnits * Standard_Real(myFTFont->Descender()); + } + + //! @return default line spacing (the baseline-to-baseline distance). + Standard_Real LineSpacing() const + { + return myScaleUnits * Standard_Real(myFTFont->LineSpacing()); + } + + //! Configured point size + Standard_Real PointSize() const + { + return myScaleUnits * Standard_Real(myFTFont->PointSize()); + } + + //! Compute advance to the next character with kerning applied when applicable. + //! Assuming text rendered horizontally. + Standard_Real AdvanceX (const Standard_Utf32Char theUCharNext) + { + return myScaleUnits * Standard_Real(myFTFont->AdvanceX (theUCharNext)); + } + + //! Compute advance to the next character with kerning applied when applicable. + //! Assuming text rendered horizontally. + Standard_Real AdvanceX (const Standard_Utf32Char theUChar, + const Standard_Utf32Char theUCharNext) + { + return myScaleUnits * Standard_Real(myFTFont->AdvanceX (theUChar, theUCharNext)); + } + + //! Compute advance to the next character with kerning applied when applicable. + //! Assuming text rendered vertically. + Standard_Real AdvanceY (const Standard_Utf32Char theUCharNext) + { + return myScaleUnits * Standard_Real(myFTFont->AdvanceY (theUCharNext)); + } + + //! Compute advance to the next character with kerning applied when applicable. + //! Assuming text rendered vertically. + Standard_Real AdvanceY (const Standard_Utf32Char theUChar, + const Standard_Utf32Char theUCharNext) + { + return myScaleUnits * Standard_Real(myFTFont->AdvanceY (theUChar, theUCharNext)); + } + + //! Returns scaling factor for current font size. + Standard_Real Scale() const + { + return myScaleUnits; + } + + //! Returns mutex. + Standard_Mutex& Mutex() + { + return myMutex; + } + +public: + + //! Find (using Font_FontMgr) and initialize the font from the given name. + //! Alias for FindAndInit() for backward compatibility. + bool Init (const NCollection_String& theFontName, + const Font_FontAspect theFontAspect, + const Standard_Real theSize) + { + return FindAndInit (theFontName.ToCString(), theFontAspect, theSize, Font_StrictLevel_Any); + } + +protected: + + //! Render single glyph as TopoDS_Shape. This method does not lock the mutex. + //! @param theChar glyph identifier + //! @param theShape rendered glyph within cache, might be NULL shape + //! @return true if glyph's geometry is available + Standard_EXPORT Standard_Boolean renderGlyph (const Standard_Utf32Char theChar, + TopoDS_Shape& theShape); + +private: + + //! Initialize class fields + void init(); + + //! Auxiliary method to create 3D curve + bool to3d (const Handle(Geom2d_Curve)& theCurve2d, + const GeomAbs_Shape theContinuity, + Handle(Geom_Curve)& theCurve3d); + + //! Auxiliary method for creation faces from sequence of wires. + //! Splits to few faces (if it is needed) and updates orientation of wires. + Standard_Boolean buildFaces (const NCollection_Sequence& theWires, + TopoDS_Shape& theRes); + +protected: //! @name Protected fields + + Handle(Font_FTFont) myFTFont; //!< wrapper over FreeType font + NCollection_DataMap + myCache; //!< glyphs cache + Standard_Mutex myMutex; //!< lock for thread-safety + Handle(Geom_Surface) mySurface; //!< surface to place glyphs on to + Standard_Real myPrecision; //!< algorithm precision + Standard_Real myScaleUnits; //!< scale font rendering units into model units + Standard_Boolean myIsCompositeCurve; //!< flag to merge C1 curves of each contour into single C0 curve, OFF by default + +protected: //! @name Shared temporary variables for glyph construction + + Adaptor3d_CurveOnSurface myCurvOnSurf; + Handle(Geom2dAdaptor_HCurve) myCurve2dAdaptor; + Geom2dConvert_CompCurveToBSplineCurve myConcatMaker; + TColgp_Array1OfPnt2d my3Poles; + TColgp_Array1OfPnt2d my4Poles; + BRep_Builder myBuilder; + +}; + +#endif // _StdPrs_BRepFont_H__ diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BRepTextBuilder.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BRepTextBuilder.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BRepTextBuilder.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BRepTextBuilder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,77 @@ +// Created on: 2015-08-10 +// Created by: Ilya SEVRIKOV +// Copyright (c) 2013-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include + +// ======================================================================= +// Function : Perfrom +// Purpose : +// ======================================================================= +TopoDS_Shape StdPrs_BRepTextBuilder::Perform (StdPrs_BRepFont& theFont, + const Handle(Font_TextFormatter)& theFormatter, + const gp_Ax3& thePenLoc) +{ + gp_Trsf aTrsf; + gp_XYZ aPen; + TopoDS_Shape aGlyphShape; + TopoDS_Compound aResult; + Standard_Mutex::Sentry aSentry (theFont.Mutex()); + + myBuilder.MakeCompound (aResult); + + Standard_Real aScaleUnits = theFont.Scale(); + for (Font_TextFormatter::Iterator aFormatterIt (*theFormatter, Font_TextFormatter::IterationFilter_ExcludeInvisible); + aFormatterIt.More(); aFormatterIt.Next()) + { + const NCollection_Vec2& aCorner = theFormatter->BottomLeft (aFormatterIt.SymbolPosition()); + + aPen.SetCoord (aCorner.x() * aScaleUnits, aCorner.y() * aScaleUnits, 0.0); + aGlyphShape = theFont.RenderGlyph (aFormatterIt.Symbol()); + if (!aGlyphShape.IsNull()) + { + aTrsf.SetTranslation (gp_Vec (aPen)); + aGlyphShape.Move (aTrsf); + myBuilder.Add (aResult, aGlyphShape); + } + } + + aTrsf.SetTransformation (thePenLoc, gp_Ax3 (gp::XOY())); + aResult.Move (aTrsf); + + return aResult; +} + +// ======================================================================= +// Function : Perform +// Purpose : +// ======================================================================= +TopoDS_Shape StdPrs_BRepTextBuilder::Perform (StdPrs_BRepFont& theFont, + const NCollection_String& theString, + const gp_Ax3& thePenLoc, + const Graphic3d_HorizontalTextAlignment theHAlign, + const Graphic3d_VerticalTextAlignment theVAlign) +{ + Handle(Font_TextFormatter) aFormatter = new Font_TextFormatter(); + + aFormatter->Reset(); + aFormatter->SetupAlignment (theHAlign, theVAlign); + + aFormatter->Append (theString, *theFont.FTFont()); + aFormatter->Format(); + + return Perform (theFont, aFormatter, thePenLoc); +} diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BRepTextBuilder.hxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BRepTextBuilder.hxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_BRepTextBuilder.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_BRepTextBuilder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,50 @@ +// Created on: 2015-08-10 +// Created by: Ilya SEVRIKOV +// Copyright (c) 2013-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef StdPrs_BRepTextBuilder_Header +#define StdPrs_BRepTextBuilder_Header + +#include +#include +#include + +//! Represents class for applying text formatting. +class StdPrs_BRepTextBuilder +{ +public: + //! Render text as BRep shape. + //! @param theFormatter formatter which defines aligned text + //! @param thePenLoc start position and orientation on the baseline + //! @return result shape with pen transformation applied as shape location + Standard_EXPORT TopoDS_Shape Perform (StdPrs_BRepFont& theFont, + const Handle(Font_TextFormatter)& theFormatter, + const gp_Ax3& thePenLoc = gp_Ax3()); + //! Render text as BRep shape. + //! @param theString text in UTF-8 encoding + //! @param thePenLoc start position and orientation on the baseline + //! @param theHAlign horizontal alignment of the text + //! @param theVAlign vertical alignment of the text + //! @return result shape with pen transformation applied as shape location + Standard_EXPORT TopoDS_Shape Perform (StdPrs_BRepFont& theFont, + const NCollection_String& theString, + const gp_Ax3& thePenLoc = gp_Ax3(), + const Graphic3d_HorizontalTextAlignment theHAlign = Graphic3d_HTA_LEFT, + const Graphic3d_VerticalTextAlignment theVAlign = Graphic3d_VTA_BOTTOM); + +protected: + BRep_Builder myBuilder; +}; + +#endif // StdPrs_BRepTextBuilder_Header diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_Curve.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_Curve.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_Curve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_Curve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -219,20 +219,20 @@ const Handle (Prs3d_Drawer)& aDrawer, const Standard_Boolean drawCurve) { - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(aDrawer->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(aDrawer->LineAspect()->Aspect()); Standard_Real V1, V2; FindLimits(aCurve, aDrawer->MaximalParameterValue(), V1, V2); const Standard_Integer NbPoints = aDrawer->Discretisation(); TColgp_SequenceOfPnt Pnts; - DrawCurve(aCurve,Prs3d_Root::CurrentGroup(aPresentation),NbPoints,V1,V2,Pnts,drawCurve); + DrawCurve(aCurve,aPresentation->CurrentGroup(),NbPoints,V1,V2,Pnts,drawCurve); if (aDrawer->LineArrowDraw()) { gp_Pnt Location; gp_Vec Direction; aCurve.D1(aCurve.LastParameter(),Location,Direction); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), Location, gp_Dir(Direction), + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), Location, gp_Dir(Direction), aDrawer->ArrowAspect()->Angle(), aDrawer->ArrowAspect()->Length()); } @@ -253,7 +253,7 @@ FindLimits(aCurve, aDrawer->MaximalParameterValue(), V1, V2); const Standard_Integer NbPoints = aDrawer->Discretisation(); - DrawCurve(aCurve,Prs3d_Root::CurrentGroup(aPresentation),NbPoints,V1,V2,Points,drawCurve); + DrawCurve(aCurve,aPresentation->CurrentGroup(),NbPoints,V1,V2,Points,drawCurve); } //================================================================== @@ -268,7 +268,7 @@ const Standard_Integer NbPoints, const Standard_Boolean drawCurve) { - DrawCurve(aCurve,Prs3d_Root::CurrentGroup(aPresentation),NbPoints,U1,U2,Points,drawCurve); + DrawCurve(aCurve,aPresentation->CurrentGroup(),NbPoints,U1,U2,Points,drawCurve); } //================================================================== @@ -282,7 +282,7 @@ const Handle (Prs3d_Drawer)& aDrawer, const Standard_Boolean drawCurve) { - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(aDrawer->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(aDrawer->LineAspect()->Aspect()); Standard_Real V1 = U1; Standard_Real V2 = U2; @@ -292,13 +292,13 @@ const Standard_Integer NbPoints = aDrawer->Discretisation(); TColgp_SequenceOfPnt Pnts; - DrawCurve(aCurve,Prs3d_Root::CurrentGroup(aPresentation),NbPoints,V1,V2,Pnts,drawCurve); + DrawCurve(aCurve,aPresentation->CurrentGroup(),NbPoints,V1,V2,Pnts,drawCurve); if (aDrawer->LineArrowDraw()) { gp_Pnt Location; gp_Vec Direction; aCurve.D1(aCurve.LastParameter(),Location,Direction); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), Location, gp_Dir(Direction), + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), Location, gp_Dir(Direction), aDrawer->ArrowAspect()->Angle(), aDrawer->ArrowAspect()->Length()); } diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_DeflectionCurve.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_DeflectionCurve.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_DeflectionCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_DeflectionCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -288,7 +288,7 @@ Handle(Graphic3d_Group) aGroup; if (theToDrawCurve) { - aGroup = Prs3d_Root::CurrentGroup(aPresentation); + aGroup = aPresentation->CurrentGroup(); aGroup->SetPrimitivesAspect (aDrawer->LineAspect()->Aspect()); } @@ -332,7 +332,7 @@ Handle(Graphic3d_Group) aGroup; if (theToDrawCurve) { - aGroup = Prs3d_Root::CurrentGroup (aPresentation); + aGroup = aPresentation->CurrentGroup(); aGroup->SetPrimitivesAspect(aDrawer->LineAspect()->Aspect()); } @@ -379,7 +379,7 @@ Handle(Graphic3d_Group) aGroup; if (theToDrawCurve) { - aGroup = Prs3d_Root::CurrentGroup (aPresentation); + aGroup = aPresentation->CurrentGroup(); } drawCurve (aCurve, aGroup, aDeflection, anAngle, U1, U2, Points); @@ -405,7 +405,7 @@ Handle(Graphic3d_Group) aGroup; if (theToDrawCurve) { - aGroup = Prs3d_Root::CurrentGroup (aPresentation); + aGroup = aPresentation->CurrentGroup(); } TColgp_SequenceOfPnt Points; @@ -433,7 +433,7 @@ Handle(Graphic3d_Group) aGroup; if (theToDrawCurve) { - aGroup = Prs3d_Root::CurrentGroup (aPresentation); + aGroup = aPresentation->CurrentGroup(); } drawCurve (aCurve, aGroup, aDeflection, aDrawer->DeviationAngle(), V1, V2, Points); } diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRPolyShape.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRPolyShape.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRPolyShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRPolyShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include #include @@ -41,17 +41,25 @@ #define PntY2 ((Standard_Real*)Coordinates)[4] #define PntZ2 ((Standard_Real*)Coordinates)[5] +IMPLEMENT_STANDARD_RTTIEXT(StdPrs_HLRPolyShape, StdPrs_HLRShapeI) + //======================================================================= //function : Add -//purpose : +//purpose : //======================================================================= - -void StdPrs_HLRPolyShape::Add(const Handle (Prs3d_Presentation)& aPresentation, - const TopoDS_Shape& aShape, - const Handle (Prs3d_Drawer)& aDrawer, - const Handle (Prs3d_Projector)& aProjector) +void StdPrs_HLRPolyShape::ComputeHLR (const Handle(Prs3d_Presentation)& aPresentation, + const TopoDS_Shape& aShape, + const Handle(Prs3d_Drawer)& aDrawer, + const Handle(Graphic3d_Camera)& theProjector) const { - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup(aPresentation); + gp_Dir aBackDir = -theProjector->Direction(); + gp_Dir aXpers = theProjector->Up().Crossed (aBackDir); + gp_Ax3 anAx3 (theProjector->Center(), aBackDir, aXpers); + gp_Trsf aTrsf; + aTrsf.SetTransformation (anAx3); + const HLRAlgo_Projector aProj (aTrsf, !theProjector->IsOrthographic(), theProjector->Scale()); + + Handle(Graphic3d_Group) aGroup = aPresentation->CurrentGroup(); TopExp_Explorer ex; @@ -66,19 +74,11 @@ if (aDrawer->IsAutoTriangulation()) { - const Standard_Boolean aRel = aDrawer->TypeOfDeflection() == Aspect_TOD_RELATIVE; - Standard_Real aDef = aRel ? aDrawer->HLRDeviationCoefficient() : aDrawer->MaximalChordialDeviation(); - IMeshTools_Parameters aMeshParams; - aMeshParams.Relative = aRel; - aMeshParams.Angle = aDrawer->HLRAngle(); - aMeshParams.Deflection = aDef; - BRepMesh_IncrementalMesh mesh(aShape, aMeshParams); + StdPrs_ToolTriangulatedShape::Tessellate (aShape, aDrawer); } Handle(HLRBRep_PolyAlgo) hider = new HLRBRep_PolyAlgo(aShape); - - hider->Projector(aProjector->Projector()); - hider->Angle(aDrawer->HLRAngle()); + hider->Projector (aProj); hider->Update(); Standard_Real sta,end,dx,dy,dz; Standard_ShortReal tolsta, tolend; diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRPolyShape.hxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRPolyShape.hxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRPolyShape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRPolyShape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,59 +17,26 @@ #ifndef _StdPrs_HLRPolyShape_HeaderFile #define _StdPrs_HLRPolyShape_HeaderFile -#include -#include +#include -class TopoDS_Shape; -class Prs3d_Projector; - -//! Instantiates Prs3d_PolyHLRShape to define a -//! display of a shape where hidden and visible lines are -//! identified with respect to a given projection. -//! StdPrs_HLRPolyShape works with a polyhedral -//! simplification of the shape whereas -//! StdPrs_HLRShape takes the shape itself into -//! account. When you use StdPrs_HLRShape, you -//! obtain an exact result, whereas, when you use -//! StdPrs_HLRPolyShape, you reduce computation -//! time but obtain polygonal segments. +//! Instantiates Prs3d_PolyHLRShape to define a display of a shape where hidden +//! and visible lines are identified with respect to a given projection. +//! StdPrs_HLRPolyShape works with a polyhedral simplification of the shape whereas +//! StdPrs_HLRShape takes the shape itself into account. +//! When you use StdPrs_HLRShape, you obtain an exact result, whereas, when you use StdPrs_HLRPolyShape, +//! you reduce computation time but obtain polygonal segments. //! The polygonal algorithm is used. -class StdPrs_HLRPolyShape : public Prs3d_Root +class StdPrs_HLRPolyShape : public StdPrs_HLRShapeI { + DEFINE_STANDARD_RTTIEXT(StdPrs_HLRPolyShape, StdPrs_HLRShapeI) public: - - DEFINE_STANDARD_ALLOC - - //! Defines the hidden line removal display of the - //! topology aShape in the projection defined by - //! aProjector. The shape and the projection are added - //! to the display aPresentation, and the attributes of the - //! elements present in the aPresentation are defined by - //! the attribute manager aDrawer. - Standard_EXPORT static void Add (const Handle(Prs3d_Presentation)& aPresentation, const TopoDS_Shape& aShape, const Handle(Prs3d_Drawer)& aDrawer, const Handle(Prs3d_Projector)& aProjector); - - - - -protected: - - - - - -private: - - - - + //! Compute presentation for specified shape. + Standard_EXPORT virtual void ComputeHLR (const Handle(Prs3d_Presentation)& thePrs, + const TopoDS_Shape& theShape, + const Handle(Prs3d_Drawer)& theDrawer, + const Handle(Graphic3d_Camera)& theProjector) const Standard_OVERRIDE; }; - - - - - - #endif // _StdPrs_HLRPolyShape_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRShape.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRShape.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -11,35 +11,44 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include + #include #include #include #include #include -#include -#include #include #include #include #include +#include + +IMPLEMENT_STANDARD_RTTIEXT(StdPrs_HLRShape, StdPrs_HLRShapeI) //======================================================================= -//function : Add -//purpose : +//function : ComputeHLR +//purpose : //======================================================================= - -void StdPrs_HLRShape::Add (const Handle(Prs3d_Presentation)& thePresentation, - const TopoDS_Shape& theShape, - const Handle(Prs3d_Drawer)& theDrawer, - const Handle(Prs3d_Projector)& theProjector) +void StdPrs_HLRShape::ComputeHLR (const Handle(Prs3d_Presentation)& thePresentation, + const TopoDS_Shape& theShape, + const Handle(Prs3d_Drawer)& theDrawer, + const Handle(Graphic3d_Camera)& theProjector) const { - StdPrs_HLRToolShape aTool(theShape, theProjector->Projector()); + gp_Dir aBackDir = -theProjector->Direction(); + gp_Dir aXpers = theProjector->Up().Crossed (aBackDir); + gp_Ax3 anAx3 (theProjector->Center(), aBackDir, aXpers); + gp_Trsf aTrsf; + aTrsf.SetTransformation (anAx3); + const HLRAlgo_Projector aProj (aTrsf, !theProjector->IsOrthographic(), theProjector->Scale()); + + StdPrs_HLRToolShape aTool(theShape, aProj); Standard_Integer aNbEdges = aTool.NbEdges(); Standard_Integer anI; Standard_Real anU1, anU2; BRepAdaptor_Curve aCurve; Standard_Real aDeviation = theDrawer->MaximalChordialDeviation(); - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup(thePresentation); + Handle(Graphic3d_Group) aGroup = thePresentation->CurrentGroup(); aGroup->SetPrimitivesAspect(theDrawer->SeenLineAspect()->Aspect()); diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRShape.hxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRShape.hxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRShape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRShape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,26 +14,20 @@ #ifndef _StdPrs_HLRFace_H__ #define _StdPrs_HLRFace_H__ -#include -#include -#include -#include +#include -// Computes the presentation of objects with -// removal of their hidden lines for a specific -// projector. The exact algorithm is used. - -class StdPrs_HLRShape: public Prs3d_Root +//! Computes the presentation of objects with removal of their hidden lines for a specific projector. +//! The exact algorithm is used. +class StdPrs_HLRShape : public StdPrs_HLRShapeI { + DEFINE_STANDARD_RTTIEXT(StdPrs_HLRShape, StdPrs_HLRShapeI) public: - DEFINE_STANDARD_ALLOC - - Standard_EXPORT static void Add - (const Handle(Prs3d_Presentation)& thePresentation, - const TopoDS_Shape& theShape, - const Handle(Prs3d_Drawer)& theDrawer, - const Handle(Prs3d_Projector)& theProjector); + //! Compute presentation for specified shape. + Standard_EXPORT virtual void ComputeHLR (const Handle(Prs3d_Presentation)& thePrs, + const TopoDS_Shape& theShape, + const Handle(Prs3d_Drawer)& theDrawer, + const Handle(Graphic3d_Camera)& theProjector) const Standard_OVERRIDE; }; #endif diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRShapeI.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRShapeI.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRShapeI.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRShapeI.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,16 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(StdPrs_HLRShapeI, Standard_Transient) diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRShapeI.hxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRShapeI.hxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_HLRShapeI.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_HLRShapeI.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,39 @@ +// Copyright (c) 2020 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StdPrs_HLRShapeI_HeaderFile +#define _StdPrs_HLRShapeI_HeaderFile + +#include +#include +#include + +class TopoDS_Shape; +class Prs3d_Drawer; +class Graphic3d_Camera; + +//! Computes the presentation of objects with removal of their hidden lines for a specific projector. +class StdPrs_HLRShapeI : public Standard_Transient +{ + DEFINE_STANDARD_RTTIEXT(StdPrs_HLRShapeI, Standard_Transient) +public: + + //! Compute presentation for specified shape. + virtual void ComputeHLR (const Handle(Prs3d_Presentation)& thePrs, + const TopoDS_Shape& theShape, + const Handle(Prs3d_Drawer)& theDrawer, + const Handle(Graphic3d_Camera)& theProjector) const = 0; + +}; + +#endif // _StdPrs_HLRShapeI_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_Isolines.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_Isolines.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_Isolines.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_Isolines.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -479,6 +480,24 @@ } } + // re-calculate UV-range basing on p-curves tessellation + Bnd_Range aTrimU, aTrimV; + for (Standard_Integer anI = 1; anI <= aTrimPoints.Length(); ++anI) + { + const gp_Pnt2d& aTrimPnt = aTrimPoints.Value (anI); + aTrimU.Add (aTrimPnt.X()); + aTrimV.Add (aTrimPnt.Y()); + } + // ignore p-curves tessellation under sampler deflection - it might clamp range + if (!aTrimU.IsVoid() && aTrimU.Delta() <= aSamplerDeflection) + { + aTrimU.SetVoid(); + } + if (!aTrimV.IsVoid() && aTrimV.Delta() <= aSamplerDeflection) + { + aTrimV.SetVoid(); + } + // Compute a hatching tolerance. aHatchingTolerance *= 0.1; aHatchingTolerance = Max (Precision::Confusion(), aHatchingTolerance); @@ -489,11 +508,21 @@ for (Standard_Integer anIso = 1; anIso <= theUIsoParams.Length(); ++anIso) { - aHatcher.AddXLine (theUIsoParams.Value (anIso)); + const Standard_Real anIsoParamU = theUIsoParams.Value (anIso); + if (aTrimU.IsVoid() + || !aTrimU.IsOut (anIsoParamU)) + { + aHatcher.AddXLine (anIsoParamU); + } } for (Standard_Integer anIso = 1; anIso <= theVIsoParams.Length(); ++anIso) { - aHatcher.AddYLine (theVIsoParams.Value (anIso)); + const Standard_Real anIsoParamV = theVIsoParams.Value (anIso); + if (aTrimV.IsVoid() + || !aTrimV.IsOut (anIsoParamV)) + { + aHatcher.AddYLine (anIsoParamV); + } } // Trim hatching region. diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_Plane.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_Plane.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_Plane.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_Plane.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,8 +36,8 @@ const Adaptor3d_Surface& aPlane, const Handle (Prs3d_Drawer)& aDrawer) { -// Prs3d_Root::NewGroup(aPresentation); - Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation); +// aPresentation->NewGroup(); + Handle(Graphic3d_Group) TheGroup = aPresentation->CurrentGroup(); if (aPlane.GetType() != GeomAbs_Plane) return; Handle(Geom_Plane) thegeom = new Geom_Plane(aPlane.Plane()); @@ -95,7 +95,7 @@ aPrims->AddVertex(loc); aPrims->AddVertex(p1); TheGroup->AddPrimitiveArray(aPrims); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), p1, norm, ang, len); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), p1, norm, ang, len); } if (theaspect->DisplayEdgesArrows()) { Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(8); @@ -104,25 +104,25 @@ p1 = loc.Translated(trans); aPrims->AddVertex(loc); aPrims->AddVertex(p1); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), p1, norm, ang, len); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), p1, norm, ang, len); // thegeom->D0(-Xmax,Ymax,loc); p1 = loc.Translated(trans); aPrims->AddVertex(loc); aPrims->AddVertex(p1); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), p1, norm, ang, len); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), p1, norm, ang, len); // thegeom->D0(Xmax,Ymax,loc); p1 = loc.Translated(trans); aPrims->AddVertex(loc); aPrims->AddVertex(p1); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), p1, norm, ang, len); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), p1, norm, ang, len); // thegeom->D0(Xmax,-Ymax,loc); p1 = loc.Translated(trans); aPrims->AddVertex(loc); aPrims->AddVertex(p1); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), p1, norm, ang, len); + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), p1, norm, ang, len); // TheGroup->AddPrimitiveArray(aPrims); } diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_PoleCurve.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_PoleCurve.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_PoleCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_PoleCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -38,7 +38,7 @@ const Adaptor3d_Curve& aCurve, const Handle (Prs3d_Drawer)& aDrawer) { - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(aDrawer->LineAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(aDrawer->LineAspect()->Aspect()); GeomAbs_CurveType CType = aCurve.GetType(); if (CType == GeomAbs_BezierCurve || CType == GeomAbs_BSplineCurve) { @@ -49,7 +49,7 @@ Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(Nb); for (i = 1; i <= Nb; i++) aPrims->AddVertex(Bz->Pole(i)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } else if (CType == GeomAbs_BSplineCurve) { Handle(Geom_BSplineCurve) Bs = aCurve.BSpline(); @@ -57,7 +57,7 @@ Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(Nb); for (i = 1; i <= Nb; i++) aPrims->AddVertex(Bs->Pole(i)); - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } } @@ -65,7 +65,7 @@ gp_Pnt Location; gp_Vec Direction; aCurve.D1(aCurve.LastParameter(),Location,Direction); - Prs3d_Arrow::Draw (Prs3d_Root::CurrentGroup (aPresentation), + Prs3d_Arrow::Draw (aPresentation->CurrentGroup(), Location, gp_Dir(Direction), aDrawer->ArrowAspect()->Angle(), diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ShadedShape.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ShadedShape.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ShadedShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ShadedShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,7 +28,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -295,7 +297,7 @@ return Standard_False; } - Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup (thePrs); + Handle(Graphic3d_Group) aGroup = thePrs->NewGroup(); aGroup->SetClosed (theIsClosed); aGroup->SetGroupPrimitivesAspect (theDrawer->ShadingAspect()->Aspect()); aGroup->AddPrimitiveArray (aPArray); @@ -312,14 +314,20 @@ Standard_Integer aNbPolylines = 0; TopLoc_Location aTrsf; - TColgp_SequenceOfPnt aSeqPntsExtra; + + Handle(NCollection_Shared) aSeqPntsExtra; for (TopExp_Explorer aFaceIter (theShape, TopAbs_FACE); aFaceIter.More(); aFaceIter.Next()) { const TopoDS_Face& aFace = TopoDS::Face (aFaceIter.Current()); if (aFace.NbChildren() == 0) { // handle specifically faces without boundary definition (triangulation-only) - StdPrs_WFShape::AddEdgesOnTriangulation (aSeqPntsExtra, aFace, Standard_False); + if (aSeqPntsExtra.IsNull()) + { + Handle(NCollection_IncAllocator) anIncAlloc = new NCollection_IncAllocator(); + aSeqPntsExtra = new NCollection_Shared (anIncAlloc); + } + StdPrs_WFShape::AddEdgesOnTriangulation (*aSeqPntsExtra, aFace, Standard_False); } } @@ -358,26 +366,25 @@ ++aNbPolylines; } } + const Standard_Integer aNbExtra = !aSeqPntsExtra.IsNull() ? aSeqPntsExtra->Size() : 0; if (aNodeNumber == 0) { - if (aSeqPntsExtra.Size() < 2) + if (aNbExtra < 2) { return Handle(Graphic3d_ArrayOfSegments)(); } - Standard_Integer aNbVertices = aSeqPntsExtra.Size(); - Handle(Graphic3d_ArrayOfSegments) aSegments = new Graphic3d_ArrayOfSegments (aNbVertices); - for (Standard_Integer aPntIter = 1; aPntIter <= aNbVertices; aPntIter += 2) + Handle(Graphic3d_ArrayOfSegments) aSegments = new Graphic3d_ArrayOfSegments (aNbExtra); + for (TColgp_SequenceOfPnt::Iterator aPntIter (*aSeqPntsExtra); aPntIter.More(); aPntIter.Next()) { - aSegments->AddVertex (aSeqPntsExtra.Value (aPntIter)); - aSegments->AddVertex (aSeqPntsExtra.Value (aPntIter + 1)); + aSegments->AddVertex (aPntIter.Value()); } return aSegments; } // create indexed segments array to pack polylines from different edges into single array const Standard_Integer aSegmentEdgeNb = (aNodeNumber - aNbPolylines) * 2; - Handle(Graphic3d_ArrayOfSegments) aSegments = new Graphic3d_ArrayOfSegments (aNodeNumber + aSeqPntsExtra.Size(), aSegmentEdgeNb + aSeqPntsExtra.Size()); + Handle(Graphic3d_ArrayOfSegments) aSegments = new Graphic3d_ArrayOfSegments (aNodeNumber + aNbExtra, aSegmentEdgeNb + aNbExtra); for (TopTools_IndexedDataMapOfShapeListOfShape::Iterator anEdgeIter (anEdgesMap); anEdgeIter.More(); anEdgeIter.Next()) { if (anEdgeIter.Value().Extent() == 0) @@ -433,14 +440,12 @@ } } + if (!aSeqPntsExtra.IsNull()) { Standard_Integer aSegmentEdge = aSegments->VertexNumber(); - const Standard_Integer aNbVertices = aSeqPntsExtra.Size(); - for (Standard_Integer aPntIter = 1; aPntIter <= aNbVertices; aPntIter += 2) + for (TColgp_SequenceOfPnt::Iterator aPntIter (*aSeqPntsExtra); aPntIter.More(); aPntIter.Next()) { - aSegments->AddVertex (aSeqPntsExtra.Value (aPntIter)); - aSegments->AddEdge (++aSegmentEdge); - aSegments->AddVertex (aSeqPntsExtra.Value (aPntIter + 1)); + aSegments->AddVertex (aPntIter.Value()); aSegments->AddEdge (++aSegmentEdge); } } @@ -542,9 +547,6 @@ return; } - // add wireframe presentation for isolated edges and vertices - wireframeFromShape (thePrs, theShape, theDrawer); - // Use automatic re-triangulation with deflection-check logic only if this feature is enable if (theDrawer->IsAutoTriangulation()) { @@ -552,6 +554,9 @@ StdPrs_ToolTriangulatedShape::Tessellate (theShape, theDrawer); } + // add wireframe presentation for isolated edges and vertices + wireframeFromShape (thePrs, theShape, theDrawer); + // add special wireframe presentation for faces without triangulation wireframeNoTriangFacesFromShape (thePrs, theShape, theDrawer); diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ShadedSurface.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ShadedSurface.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ShadedSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ShadedSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -42,7 +42,7 @@ N2 = N2 < 3 ? 3 : N2; // If the surface is closed, the faces from back-side are not traced: - Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup (thePrs); + Handle(Graphic3d_Group) aGroup = thePrs->CurrentGroup(); aGroup->SetGroupPrimitivesAspect (theDrawer->ShadingAspect()->Aspect()); aGroup->SetClosed (theSurface.IsUClosed() && theSurface.IsVClosed()); diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ShapeTool.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ShapeTool.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ShapeTool.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ShapeTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,200 @@ +// Created on: 1995-08-07 +// Created by: Modelistation +// Copyright (c) 1995-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//======================================================================= +//function : StdPrs_ShapeTool +//purpose : +//======================================================================= +StdPrs_ShapeTool::StdPrs_ShapeTool (const TopoDS_Shape& theShape, + const Standard_Boolean theAllVertices) +: myShape (theShape) +{ + myEdgeMap.Clear(); + myVertexMap.Clear(); + TopExp::MapShapesAndAncestors (theShape,TopAbs_EDGE,TopAbs_FACE, myEdgeMap); + + TopExp_Explorer anExpl; + if (theAllVertices) + { + for (anExpl.Init (theShape, TopAbs_VERTEX); anExpl.More(); anExpl.Next()) + { + myVertexMap.Add (anExpl.Current()); + } + } + else + { + // Extracting isolated vertices + for (anExpl.Init (theShape, TopAbs_VERTEX, TopAbs_EDGE); anExpl.More(); anExpl.Next()) + { + myVertexMap.Add (anExpl.Current()); + } + + // Extracting internal vertices + for (anExpl.Init (theShape, TopAbs_EDGE); anExpl.More(); anExpl.Next()) + { + TopoDS_Iterator aIt (anExpl.Current(), Standard_False, Standard_True); + for (; aIt.More(); aIt.Next()) + { + const TopoDS_Shape& aV = aIt.Value(); + if (aV.Orientation() == TopAbs_INTERNAL) + { + myVertexMap.Add (aV); + } + } + } + } +} + +//======================================================================= +//function : FaceBound +//purpose : +//======================================================================= +Bnd_Box StdPrs_ShapeTool::FaceBound() const +{ + const TopoDS_Face& F = TopoDS::Face(myFaceExplorer.Current()); + Bnd_Box B; + BRepBndLib::Add(F, B); + return B; +} + +//======================================================================= +//function : IsPlanarFace +//purpose : +//======================================================================= +Standard_Boolean StdPrs_ShapeTool::IsPlanarFace (const TopoDS_Face& theFace) +{ + TopLoc_Location l; + const Handle(Geom_Surface)& S = BRep_Tool::Surface(theFace, l); + if (S.IsNull()) + { + return Standard_False; + } + + Handle(Standard_Type) TheType = S->DynamicType(); + + if (TheType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) { + Handle(Geom_RectangularTrimmedSurface) + RTS = Handle(Geom_RectangularTrimmedSurface)::DownCast (S); + TheType = RTS->BasisSurface()->DynamicType(); + } + return (TheType == STANDARD_TYPE(Geom_Plane)); +} + +//======================================================================= +//function : CurveBound +//purpose : +//======================================================================= +Bnd_Box StdPrs_ShapeTool::CurveBound() const +{ + const TopoDS_Edge& E = TopoDS::Edge(myEdgeMap.FindKey(myEdge)); + Bnd_Box B; + BRepBndLib::Add(E, B); + return B; +} + +//======================================================================= +//function : Neighbours +//purpose : +//======================================================================= +Standard_Integer StdPrs_ShapeTool::Neighbours() const +{ + const TopTools_ListOfShape& L = myEdgeMap.FindFromIndex(myEdge); + return L.Extent(); +} + +//======================================================================= +//function : FacesOfEdge +//purpose : +//======================================================================= +Handle(TopTools_HSequenceOfShape) StdPrs_ShapeTool::FacesOfEdge() const +{ + Handle(TopTools_HSequenceOfShape) H = new TopTools_HSequenceOfShape(); + const TopTools_ListOfShape& L = myEdgeMap.FindFromIndex(myEdge); + for (TopTools_ListIteratorOfListOfShape LI (L); LI.More(); LI.Next()) + { + H->Append(LI.Value()); + } + return H; +} + +//======================================================================= +//function : HasSurface +//purpose : +//======================================================================= +Standard_Boolean StdPrs_ShapeTool::HasSurface() const +{ + TopLoc_Location l; + const Handle(Geom_Surface)& S = BRep_Tool::Surface(GetFace(), l); + return !S.IsNull(); +} + +//======================================================================= +//function : CurrentTriangulation +//purpose : +//======================================================================= +Handle(Poly_Triangulation) StdPrs_ShapeTool::CurrentTriangulation(TopLoc_Location& l) const +{ + return BRep_Tool::Triangulation(GetFace(), l); +} + +//======================================================================= +//function : HasCurve +//purpose : +//======================================================================= +Standard_Boolean StdPrs_ShapeTool::HasCurve() const +{ + return BRep_Tool::IsGeometric(GetCurve()); +} + +//======================================================================= +//function : PolygonOnTriangulation +//purpose : +//======================================================================= +void StdPrs_ShapeTool::PolygonOnTriangulation (Handle(Poly_PolygonOnTriangulation)& Indices, + Handle(Poly_Triangulation)& T, + TopLoc_Location& l) const +{ + BRep_Tool::PolygonOnTriangulation(GetCurve(), Indices, T, l); +} + +//======================================================================= +//function : Polygon3D +//purpose : +//======================================================================= +Handle(Poly_Polygon3D) StdPrs_ShapeTool::Polygon3D(TopLoc_Location& l) const +{ + return BRep_Tool::Polygon3D(GetCurve(), l); +} diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ShapeTool.hxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ShapeTool.hxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ShapeTool.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ShapeTool.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,110 @@ +// Created on: 1993-01-27 +// Created by: Jean-Louis Frenkel +// Copyright (c) 1993-1999 Matra Datavision +// Copyright (c) 1999-2014 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StdPrs_ShapeTool_HeaderFile +#define _StdPrs_ShapeTool_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Bnd_Box; +class Poly_Triangulation; +class Poly_PolygonOnTriangulation; +class Poly_Polygon3D; + +//! Describes the behaviour requested for a wireframe shape presentation. +class StdPrs_ShapeTool +{ +public: + DEFINE_STANDARD_ALLOC + + //! Constructs the tool and initializes it using theShape and theAllVertices + //! (optional) arguments. By default, only isolated and internal vertices are considered, + //! however if theAllVertices argument is equal to True, all shape's vertices are taken into account. + Standard_EXPORT StdPrs_ShapeTool (const TopoDS_Shape& theShape, const Standard_Boolean theAllVertices = Standard_False); + + void InitFace() { myFaceExplorer.Init(myShape,TopAbs_FACE); } + + Standard_Boolean MoreFace() const { return myFaceExplorer.More(); } + + void NextFace() { myFaceExplorer.Next(); } + + const TopoDS_Face& GetFace() const { return TopoDS::Face(myFaceExplorer.Current()); } + + Standard_EXPORT Bnd_Box FaceBound() const; + + Standard_Boolean IsPlanarFace() const + { + const TopoDS_Face& aFace = TopoDS::Face (myFaceExplorer.Current()); + return IsPlanarFace (aFace); + } + + void InitCurve() { myEdge = 1; } + + Standard_Boolean MoreCurve() const { return myEdge <= myEdgeMap.Extent(); } + + void NextCurve() { ++myEdge; } + + const TopoDS_Edge& GetCurve() const { return TopoDS::Edge(myEdgeMap.FindKey(myEdge)); } + + Standard_EXPORT Bnd_Box CurveBound() const; + + Standard_EXPORT Standard_Integer Neighbours() const; + + Standard_EXPORT Handle(TopTools_HSequenceOfShape) FacesOfEdge() const; + + void InitVertex() { myVertex = 1; } + + Standard_Boolean MoreVertex() const { return myVertex <= myVertexMap.Extent(); } + + void NextVertex() { ++myVertex; } + + const TopoDS_Vertex& GetVertex() const { return TopoDS::Vertex (myVertexMap.FindKey(myVertex)); } + + Standard_EXPORT Standard_Boolean HasSurface() const; + + Standard_EXPORT Handle(Poly_Triangulation) CurrentTriangulation (TopLoc_Location& l) const; + + Standard_EXPORT Standard_Boolean HasCurve() const; + + Standard_EXPORT void PolygonOnTriangulation (Handle(Poly_PolygonOnTriangulation)& Indices, Handle(Poly_Triangulation)& T, TopLoc_Location& l) const; + + Standard_EXPORT Handle(Poly_Polygon3D) Polygon3D (TopLoc_Location& l) const; + +public: + + Standard_EXPORT static Standard_Boolean IsPlanarFace (const TopoDS_Face& theFace); + +private: + + TopoDS_Shape myShape; + TopExp_Explorer myFaceExplorer; + TopTools_IndexedDataMapOfShapeListOfShape myEdgeMap; + TopTools_IndexedMapOfShape myVertexMap; + Standard_Integer myEdge; + Standard_Integer myVertex; + +}; + +#endif // _StdPrs_ShapeTool_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ToolRFace.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ToolRFace.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ToolRFace.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ToolRFace.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,6 +40,15 @@ } //======================================================================= +//function : Edge +//purpose : +//======================================================================= +const TopoDS_Edge& StdPrs_ToolRFace::Edge() const +{ + return TopoDS::Edge (myExplorer.Current()); +} + +//======================================================================= //function : next //purpose : //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ToolRFace.hxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ToolRFace.hxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ToolRFace.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ToolRFace.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,6 +26,7 @@ #include #include class BRepAdaptor_HSurface; +class TopoDS_Edge; //! Iterator over 2D curves restricting a face (skipping internal/external edges). //! In addition, the algorithm skips NULL curves - IsInvalidGeometry() can be checked if this should be handled within algorithm. @@ -64,6 +65,9 @@ //! Return current curve. const Adaptor2d_Curve2d& Value() const { return myCurve; } + //! Return current edge. + Standard_EXPORT const TopoDS_Edge& Edge() const; + //! Return current edge orientation. TopAbs_Orientation Orientation() const { return myExplorer.Current().Orientation(); } diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ToolTriangulatedShape.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ToolTriangulatedShape.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ToolTriangulatedShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ToolTriangulatedShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,6 +16,7 @@ #include +#include #include #include #include @@ -234,13 +235,46 @@ } //======================================================================= +//function : GetDeflection +//purpose : +//======================================================================= +Standard_Real StdPrs_ToolTriangulatedShape::GetDeflection (const TopoDS_Shape& theShape, + const Handle(Prs3d_Drawer)& theDrawer) +{ + if (theDrawer->TypeOfDeflection() != Aspect_TOD_RELATIVE) + { + return theDrawer->MaximalChordialDeviation(); + } + + Bnd_Box aBndBox; + BRepBndLib::Add (theShape, aBndBox, Standard_False); + if (aBndBox.IsVoid()) + { + return theDrawer->MaximalChordialDeviation(); + } + else if (aBndBox.IsOpen()) + { + if (!aBndBox.HasFinitePart()) + { + return theDrawer->MaximalChordialDeviation(); + } + aBndBox = aBndBox.FinitePart(); + } + + // store computed relative deflection of shape as absolute deviation coefficient in case relative type to use it later on for sub-shapes + const Standard_Real aDeflection = Prs3d::GetDeflection (aBndBox, theDrawer->DeviationCoefficient(), theDrawer->MaximalChordialDeviation()); + theDrawer->SetMaximalChordialDeviation (aDeflection); + return aDeflection; +} + +//======================================================================= //function : IsTessellated //purpose : //======================================================================= Standard_Boolean StdPrs_ToolTriangulatedShape::IsTessellated (const TopoDS_Shape& theShape, const Handle(Prs3d_Drawer)& theDrawer) { - return BRepTools::Triangulation (theShape, Prs3d::GetDeflection (theShape, theDrawer)); + return BRepTools::Triangulation (theShape, GetDeflection (theShape, theDrawer), true); } // ======================================================================= @@ -257,12 +291,12 @@ return wasRecomputed; } - Standard_Real aDeflection = Prs3d::GetDeflection (theShape, theDrawer); + const Standard_Real aDeflection = GetDeflection (theShape, theDrawer); // retrieve meshing tool from Factory Handle(BRepMesh_DiscretRoot) aMeshAlgo = BRepMesh_DiscretFactory::Get().Discret (theShape, aDeflection, - theDrawer->HLRAngle()); + theDrawer->DeviationAngle()); if (!aMeshAlgo.IsNull()) { aMeshAlgo->Perform(); diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ToolTriangulatedShape.hxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ToolTriangulatedShape.hxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_ToolTriangulatedShape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_ToolTriangulatedShape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -68,6 +68,20 @@ Poly_Connect& thePolyConnect, TColgp_Array1OfDir& theNormals); + //! Computes the absolute deflection value depending on the type of deflection in theDrawer: + //!
    + //!
  • Aspect_TOD_RELATIVE: the absolute deflection is computed using the relative + //! deviation coefficient from theDrawer and the shape's bounding box;
  • + //!
  • Aspect_TOD_ABSOLUTE: the maximal chordial deviation from theDrawer is returned.
  • + //!
+ //! In case of the type of deflection in theDrawer computed relative deflection for shape is stored as absolute deflection. + //! It is necessary to use it later on for sub-shapes. + //! This function should always be used to compute the deflection value for building + //! discrete representations of the shape (triangualtion, wireframe) to avoid incosistencies + //! between different representations of the shape and undesirable visual artifacts. + Standard_EXPORT static Standard_Real GetDeflection (const TopoDS_Shape& theShape, + const Handle(Prs3d_Drawer)& theDrawer); + //! Checks whether the shape is properly triangulated for a given display settings. //! @param theShape [in] the shape. //! @param theDrawer [in] the display settings. diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_WFDeflectionSurface.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_WFDeflectionSurface.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_WFDeflectionSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_WFDeflectionSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -170,9 +170,7 @@ // ********************* // if ( !(UClosed && VClosed) ) { - - (Prs3d_Root::CurrentGroup(aPresentation))->SetPrimitivesAspect - (aDrawer->FreeBoundaryAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aDrawer->FreeBoundaryAspect()->Aspect()); if ( !UClosed ) { anIso.Load(GeomAbs_IsoU,U1,V1,V2); @@ -194,9 +192,7 @@ // Standard_Integer fin = aDrawer->UIsoAspect()->Number(); if ( fin != 0) { - - (Prs3d_Root::CurrentGroup(aPresentation))->SetPrimitivesAspect - (aDrawer->UIsoAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aDrawer->UIsoAspect()->Aspect()); Standard_Real du= UClosed ? (U2-U1)/fin : (U2-U1)/(1+fin); for (Standard_Integer i=1; i<=fin;i++){ @@ -206,9 +202,7 @@ } fin = aDrawer->VIsoAspect()->Number(); if ( fin != 0) { - - (Prs3d_Root::CurrentGroup(aPresentation))->SetPrimitivesAspect - (aDrawer->VIsoAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aDrawer->VIsoAspect()->Aspect()); Standard_Real dv= VClosed ?(V2-V1)/fin : (V2-V1)/(1+fin); for (Standard_Integer i=1; i<=fin;i++){ @@ -217,7 +211,3 @@ } } } - - - - diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_WFPoleSurface.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_WFPoleSurface.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_WFPoleSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_WFPoleSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -33,23 +33,23 @@ const Standard_Integer n = A.ColLength(); const Standard_Integer m = A.RowLength(); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(aDrawer->UIsoAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(aDrawer->UIsoAspect()->Aspect()); Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(n*m,n); for (i=1; i<=n; i++){ aPrims->AddBound(m); for (j=1; j<=m; j++) aPrims->AddVertex(A(i,j)); } - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); - Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(aDrawer->VIsoAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect(aDrawer->VIsoAspect()->Aspect()); aPrims = new Graphic3d_ArrayOfPolylines(n*m,m); for (j=1; j<=m; j++){ aPrims->AddBound(n); for (i=1; i<=n; i++) aPrims->AddVertex(A(i,j)); } - Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims); + aPresentation->CurrentGroup()->AddPrimitiveArray(aPrims); } diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_WFShape.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_WFShape.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_WFShape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_WFShape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,13 +21,12 @@ #include #include #include -#include #include +#include +#include #include -#include #include #include -#include #include #include #include @@ -100,6 +99,11 @@ return; } + if (theDrawer->IsAutoTriangulation()) + { + StdPrs_ToolTriangulatedShape::Tessellate (theShape, theDrawer); + } + // draw triangulation-only edges if (Handle(Graphic3d_ArrayOfPrimitives) aTriFreeEdges = AddEdgesOnTriangulation (theShape, Standard_True)) { @@ -110,7 +114,7 @@ Prs3d_NListOfSequenceOfPnt aCommonPolylines; const Handle(Prs3d_LineAspect)& aWireAspect = theDrawer->WireAspect(); - const Standard_Real aShapeDeflection = Prs3d::GetDeflection (theShape, theDrawer); + const Standard_Real aShapeDeflection = StdPrs_ToolTriangulatedShape::GetDeflection (theShape, theDrawer); // Draw isolines { @@ -149,7 +153,7 @@ for (TopExp_Explorer aFaceExplorer (theShape, TopAbs_FACE); aFaceExplorer.More(); aFaceExplorer.Next()) { const TopoDS_Face& aFace = TopoDS::Face (aFaceExplorer.Current()); - if (theDrawer->IsoOnPlane() || !Prs3d_ShapeTool::IsPlanarFace (aFace)) + if (theDrawer->IsoOnPlane() || !StdPrs_ShapeTool::IsPlanarFace (aFace)) { aFaces[aNbFaces++] = aFace; } @@ -165,7 +169,7 @@ for (TopExp_Explorer aFaceExplorer (theShape, TopAbs_FACE); aFaceExplorer.More(); aFaceExplorer.Next()) { const TopoDS_Face& aFace = TopoDS::Face (aFaceExplorer.Current()); - if (theDrawer->IsoOnPlane() || !Prs3d_ShapeTool::IsPlanarFace (aFace)) + if (theDrawer->IsoOnPlane() || !StdPrs_ShapeTool::IsPlanarFace (aFace)) { StdPrs_Isolines::Add (aFace, theDrawer, aShapeDeflection, *aUPolylinesPtr, *aVPolylinesPtr); } @@ -225,7 +229,7 @@ Handle(Graphic3d_ArrayOfPrimitives) StdPrs_WFShape::AddAllEdges (const TopoDS_Shape& theShape, const Handle(Prs3d_Drawer)& theDrawer) { - const Standard_Real aShapeDeflection = Prs3d::GetDeflection (theShape, theDrawer); + const Standard_Real aShapeDeflection = StdPrs_ToolTriangulatedShape::GetDeflection (theShape, theDrawer); Prs3d_NListOfSequenceOfPnt aPolylines; addEdges (theShape, theDrawer, aShapeDeflection, &aPolylines, &aPolylines, &aPolylines); @@ -429,78 +433,9 @@ continue; } } - const Handle(Poly_Triangulation)& T = BRep_Tool::Triangulation (aFace, aLocation); - if (T.IsNull()) - { - continue; - } - - const TColgp_Array1OfPnt& aNodes = T->Nodes(); - - // Build the connect tool. - Poly_Connect aPolyConnect (T); - - Standard_Integer aNbTriangles = T->NbTriangles(); - Standard_Integer aT[3]; - Standard_Integer aN[3]; - - // Count the free edges. - Standard_Integer aNbFree = 0; - for (Standard_Integer anI = 1; anI <= aNbTriangles; ++anI) - { - aPolyConnect.Triangles (anI, aT[0], aT[1], aT[2]); - for (Standard_Integer aJ = 0; aJ < 3; ++aJ) - { - if (aT[aJ] == 0) - { - ++aNbFree; - } - } - } - - if (aNbFree == 0) + if (const Handle(Poly_Triangulation)& aPolyTri = BRep_Tool::Triangulation (aFace, aLocation)) { - continue; - } - - // Allocate the arrays. - TColStd_Array1OfInteger aFree (1, 2 * aNbFree); - Standard_Integer aNbInternal = (3 * aNbTriangles - aNbFree) / 2; - TColStd_Array1OfInteger anInternal (0, 2 * aNbInternal); - - Standard_Integer aFreeIndex = 1, anIntIndex = 1; - const Poly_Array1OfTriangle& aTriangles = T->Triangles(); - for (Standard_Integer anI = 1; anI <= aNbTriangles; ++anI) - { - aPolyConnect.Triangles (anI, aT[0], aT[1], aT[2]); - aTriangles (anI).Get (aN[0], aN[1], aN[2]); - for (Standard_Integer aJ = 0; aJ < 3; aJ++) - { - Standard_Integer k = (aJ + 1) % 3; - if (aT[aJ] == 0) - { - aFree (aFreeIndex) = aN[aJ]; - aFree (aFreeIndex + 1) = aN[k]; - aFreeIndex += 2; - } - // internal edge if this triangle has a lower index than the adjacent. - else if (anI < aT[aJ]) - { - anInternal (anIntIndex) = aN[aJ]; - anInternal (anIntIndex + 1) = aN[k]; - anIntIndex += 2; - } - } - } - - // free edges - Standard_Integer aFreeHalfNb = aFree.Length() / 2; - for (Standard_Integer anI = 1; anI <= aFreeHalfNb; ++anI) - { - gp_Pnt aPoint1 = aNodes (aFree (2 * anI - 1)).Transformed (aLocation); - gp_Pnt aPoint2 = aNodes (aFree (2 * anI )).Transformed (aLocation); - theSegments.Append (aPoint1); - theSegments.Append (aPoint2); + Prs3d::AddFreeEdges (theSegments, aPolyTri, aLocation); } } } diff -Nru opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_WFSurface.cxx opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_WFSurface.cxx --- opencascade-7.4.1+dfsg1/src/StdPrs/StdPrs_WFSurface.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdPrs/StdPrs_WFSurface.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -154,7 +154,7 @@ // if (!(UClosed && VClosed)) { - Prs3d_Root::CurrentGroup (aPresentation)->SetPrimitivesAspect (aDrawer->FreeBoundaryAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aDrawer->FreeBoundaryAspect()->Aspect()); if (!UClosed) { anIso.Load (GeomAbs_IsoU, U1, V1, V2); @@ -187,7 +187,7 @@ Standard_Integer fin = aDrawer->UIsoAspect()->Number(); if (fin != 0) { - Prs3d_Root::CurrentGroup (aPresentation)->SetPrimitivesAspect (aDrawer->UIsoAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aDrawer->UIsoAspect()->Aspect()); Standard_Real du= UClosed ? (U2-U1) / fin : (U2-U1) / (1 + fin); for (Standard_Integer i = 1; i <= fin; i++) @@ -201,7 +201,7 @@ fin = aDrawer->VIsoAspect()->Number(); if (fin != 0) { - Prs3d_Root::CurrentGroup (aPresentation)->SetPrimitivesAspect (aDrawer->VIsoAspect()->Aspect()); + aPresentation->CurrentGroup()->SetPrimitivesAspect (aDrawer->VIsoAspect()->Aspect()); Standard_Real dv = VClosed ? (V2 - V1) / fin : (V2 - V1) / (1 + fin); for (Standard_Integer i = 1; i <= fin; i++) @@ -228,7 +228,7 @@ for(int i=1; i<=Pnts->Length(); i++) UIsoArray->AddVertex(Pnts->Value(i)); } - Handle(Graphic3d_Group) TheGroup = Prs3d_Root::NewGroup(aPresentation); + Handle(Graphic3d_Group) TheGroup = aPresentation->NewGroup(); TheGroup->SetPrimitivesAspect(aDrawer->UIsoAspect()->Aspect()); TheGroup->AddPrimitiveArray(UIsoArray); } @@ -246,7 +246,7 @@ for(int i=1; i<=Pnts->Length(); i++) VIsoArray->AddVertex(Pnts->Value(i)); } - Handle(Graphic3d_Group) TheGroup = Prs3d_Root::NewGroup(aPresentation); + Handle(Graphic3d_Group) TheGroup = aPresentation->NewGroup(); TheGroup->SetPrimitivesAspect(aDrawer->VIsoAspect()->Aspect()); TheGroup->AddPrimitiveArray(VIsoArray); } @@ -263,7 +263,7 @@ for(int i=1; i<=Pnts->Length(); i++) freeArray->AddVertex(Pnts->Value(i)); } - Handle(Graphic3d_Group) TheGroup = Prs3d_Root::NewGroup(aPresentation); + Handle(Graphic3d_Group) TheGroup = aPresentation->NewGroup(); TheGroup->SetPrimitivesAspect(aDrawer->FreeBoundaryAspect()->Aspect()); TheGroup->AddPrimitiveArray(freeArray); } diff -Nru opencascade-7.4.1+dfsg1/src/StdResource/MigrationSheet.txt opencascade-7.5.1+dfsg1/src/StdResource/MigrationSheet.txt --- opencascade-7.4.1+dfsg1/src/StdResource/MigrationSheet.txt 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdResource/MigrationSheet.txt 2021-02-02 08:51:56.000000000 +0000 @@ -8,5 +8,14 @@ TDataStd_Placement TDataXtd_Placement TDataStd_PatternStd TDataXtd_PatternStd TPrsStd_AISPresentation TDataXtd_Presentation +PDataStd_Shape PDataXtd_Shape +PDataStd_Constraint PDataXtd_Constraint +PDataStd_Geometry PDataXtd_Geometry +PDataStd_Axis PDataXtd_Axis +PDataStd_Point PDataXtd_Point +PDataStd_Plane PDataXtd_Plane +PDataStd_Position PDataXtd_Position +PDataStd_Placement PDataXtd_Placement +PDataStd_PatternStd PDataXtd_PatternStd diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/FILES opencascade-7.5.1+dfsg1/src/StdSelect/FILES --- opencascade-7.4.1+dfsg1/src/StdSelect/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -2,27 +2,17 @@ StdSelect.hxx StdSelect_BRepOwner.cxx StdSelect_BRepOwner.hxx -StdSelect_BRepOwner.lxx StdSelect_BRepSelectionTool.cxx StdSelect_BRepSelectionTool.hxx -StdSelect_DisplayMode.hxx StdSelect_EdgeFilter.cxx StdSelect_EdgeFilter.hxx StdSelect_FaceFilter.cxx StdSelect_FaceFilter.hxx -StdSelect_IndexedDataMapOfOwnerPrs.hxx -StdSelect_Prs.cxx -StdSelect_Prs.hxx -StdSelect_Prs.lxx -StdSelect_SensitivityMode.hxx StdSelect_Shape.cxx StdSelect_Shape.hxx StdSelect_ShapeTypeFilter.cxx StdSelect_ShapeTypeFilter.hxx -StdSelect_ShapeTypeFilter.lxx StdSelect_TypeOfEdge.hxx StdSelect_TypeOfFace.hxx -StdSelect_TypeOfResult.hxx StdSelect_TypeOfSelectionImage.hxx -StdSelect_ViewerSelector3d.cxx StdSelect_ViewerSelector3d.hxx diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.cxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.cxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -182,3 +182,17 @@ theManager->UpdateHighlightTrsf (theViewer, Selectable(), theDispMode, myPrsSh); } + +// ======================================================================= +// function : DumpJson +// purpose : +// ======================================================================= +void StdSelect_BRepOwner::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myShape) + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myPrsSh.get()) + + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myCurMode) +} diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.hxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.hxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -117,6 +117,9 @@ const Handle(PrsMgr_PresentationManager3d)& theManager, const Standard_Integer theDispMode) Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + protected: TopoDS_Shape myShape; diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.lxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.lxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_BRepOwner.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -inline Standard_Boolean StdSelect_BRepOwner::HasHilightMode() const -{return myCurMode == -1;} - -inline void StdSelect_BRepOwner::SetHilightMode(const Standard_Integer HiMod) -{myCurMode=HiMod;} -inline void StdSelect_BRepOwner::ResetHilightMode() -{myCurMode =-1;} -inline Standard_Integer StdSelect_BRepOwner::HilightMode() const -{return myCurMode;} - -inline const TopoDS_Shape& StdSelect_BRepOwner::Shape() const -{return myShape;} - -inline Standard_Boolean StdSelect_BRepOwner::HasShape() const -{return !myShape.IsNull();} - -inline Standard_Boolean StdSelect_BRepOwner::ComesFromDecomposition() const -{return myFromDecomposition;} - - diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_BRepSelectionTool.cxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_BRepSelectionTool.cxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_BRepSelectionTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_BRepSelectionTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -113,8 +112,8 @@ const Standard_Real theMaxParam) { Standard_Integer aPriority = (thePriority == -1) ? GetStandardPriority (theShape, theType) : thePriority; - - if( isAutoTriangulation && !BRepTools::Triangulation (theShape, Precision::Infinite()) ) + if (isAutoTriangulation + && !BRepTools::Triangulation (theShape, Precision::Infinite(), true)) { BRepMesh_IncrementalMesh aMesher(theShape, theDeflection, Standard_False, theDeviationAngle); } @@ -193,8 +192,6 @@ const Handle(SelectMgr_EntityOwner)& anOwner = aSelEntIter.Value()->BaseSensitive()->OwnerId(); anOwner->SetSelectable (theSelectableObj); } - - PreBuildBVH (theSelection); } //================================================== @@ -448,7 +445,15 @@ if (!aPoints.IsNull() && !aPoints->IsEmpty()) { - theSensitive = new Select3D_SensitiveCurve (theOwner, aPoints); + if (aPoints->Length() == 2) + { + // don't waste memory, create a segment + theSensitive = new Select3D_SensitiveSegment (theOwner, aPoints->First(), aPoints->Last()); + } + else + { + theSensitive = new Select3D_SensitiveCurve (theOwner, aPoints); + } return; } @@ -474,10 +479,10 @@ } case GeomAbs_Circle: { - Handle (Geom_Circle) aCircle = new Geom_Circle (cu3d.Circle()); - if (aCircle->Radius() <= Precision::Confusion()) + const gp_Circ aCircle = cu3d.Circle(); + if (aCircle.Radius() <= Precision::Confusion()) { - theSelection->Add (new Select3D_SensitivePoint (theOwner, aCircle->Location())); + theSelection->Add (new Select3D_SensitivePoint (theOwner, aCircle.Location())); } else { @@ -696,7 +701,7 @@ } else { - theSensitiveList.Append (new Select3D_SensitiveCircle (theOwner, new Geom_Circle (cu3d.Circle()), theInteriorFlag, 16)); + theSensitiveList.Append (new Select3D_SensitiveCircle (theOwner, cu3d.Circle(), theInteriorFlag, 16)); } } } diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect.cxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect.cxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,23 +14,10 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include #include -#include //======================================================================= //function : SetDrawerForBRepOwner diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_DisplayMode.hxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_DisplayMode.hxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_DisplayMode.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_DisplayMode.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -// Created on: 1995-03-08 -// Created by: Mister rmi -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _StdSelect_DisplayMode_HeaderFile -#define _StdSelect_DisplayMode_HeaderFile - - -enum StdSelect_DisplayMode -{ -StdSelect_DM_Wireframe, -StdSelect_DM_Shading, -StdSelect_DM_HLR -}; - -#endif // _StdSelect_DisplayMode_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect.hxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect.hxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,20 +17,8 @@ #ifndef _StdSelect_HeaderFile #define _StdSelect_HeaderFile -#include -#include -#include - #include #include -class StdSelect_BRepSelectionTool; -class StdSelect_BRepOwner; -class StdSelect_EdgeFilter; -class StdSelect_FaceFilter; -class StdSelect_ShapeTypeFilter; -class StdSelect_Prs; -class StdSelect_Shape; - //! The StdSelect package provides the following services //! - the definition of selection modes for topological shapes @@ -58,39 +46,10 @@ DEFINE_STANDARD_ALLOC - //! puts The same drawer in every BRepOwner Of SensitivePrimitive //! Used Only for hilight Of BRepOwner... Standard_EXPORT static void SetDrawerForBRepOwner (const Handle(SelectMgr_Selection)& aSelection, const Handle(Prs3d_Drawer)& aDrawer); - - - -protected: - - - - - -private: - - - - -friend class StdSelect_BRepSelectionTool; -friend class StdSelect_BRepOwner; -friend class StdSelect_EdgeFilter; -friend class StdSelect_FaceFilter; -friend class StdSelect_ShapeTypeFilter; -friend class StdSelect_Prs; -friend class StdSelect_Shape; - }; - - - - - - #endif // _StdSelect_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_IndexedDataMapOfOwnerPrs.hxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_IndexedDataMapOfOwnerPrs.hxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_IndexedDataMapOfOwnerPrs.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_IndexedDataMapOfOwnerPrs.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -// Created on: 1995-03-08 -// Created by: Mister rmi -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef StdSelect_IndexedDataMapOfOwnerPrs_HeaderFile -#define StdSelect_IndexedDataMapOfOwnerPrs_HeaderFile - -#include -#include -#include -#include - -typedef NCollection_IndexedDataMap StdSelect_IndexedDataMapOfOwnerPrs; - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_Prs.cxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_Prs.cxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_Prs.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_Prs.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -// Created on: 1995-03-17 -// Created by: Robert COUBLANC -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - -#include -#include -#include - -IMPLEMENT_STANDARD_RTTIEXT(StdSelect_Prs,Prs3d_Presentation) - -StdSelect_Prs:: -StdSelect_Prs(const Handle(Graphic3d_StructureManager)& aStructureManager): -Prs3d_Presentation(aStructureManager), -myManager(aStructureManager){} - diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_Prs.hxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_Prs.hxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_Prs.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_Prs.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -// Created on: 1995-03-17 -// Created by: Robert COUBLANC -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _StdSelect_Prs_HeaderFile -#define _StdSelect_Prs_HeaderFile - -#include -#include - -#include -class Graphic3d_StructureManager; - - -class StdSelect_Prs; -DEFINE_STANDARD_HANDLE(StdSelect_Prs, Prs3d_Presentation) - -//! allows entities owners to be hilighted -//! independantly from PresentableObjects -class StdSelect_Prs : public Prs3d_Presentation -{ - -public: - - - Standard_EXPORT StdSelect_Prs(const Handle(Graphic3d_StructureManager)& aStructureManager); - - const Handle(Graphic3d_StructureManager)& Manager() const; - - - - - DEFINE_STANDARD_RTTIEXT(StdSelect_Prs,Prs3d_Presentation) - -protected: - - - - -private: - - - Handle(Graphic3d_StructureManager) myManager; - - -}; - - -#include - - - - - -#endif // _StdSelect_Prs_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_Prs.lxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_Prs.lxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_Prs.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_Prs.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -inline const Handle(Graphic3d_StructureManager)& StdSelect_Prs:: -Manager() const {return myManager;} diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_SensitivityMode.hxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_SensitivityMode.hxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_SensitivityMode.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_SensitivityMode.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -// Created on: 1995-03-08 -// Created by: Mister rmi -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _StdSelect_SensitivityMode_HeaderFile -#define _StdSelect_SensitivityMode_HeaderFile - -//! Selection sensitivity mode. SM_WINDOW mode uses the -//! specified pixel tolerance to compute the sensitivity value, -//! SM_VIEW mode allows to define the sensitivity manually. -enum StdSelect_SensitivityMode -{ -StdSelect_SM_WINDOW, -StdSelect_SM_VIEW -}; - -#endif // _StdSelect_SensitivityMode_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_Shape.cxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_Shape.cxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_Shape.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_Shape.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,10 +16,8 @@ #include -#include #include #include -#include #include #include #include @@ -58,16 +56,11 @@ StdPrs_WFShape::Add (P, mysh, myDrawer); } -void StdSelect_Shape::Compute(const Handle(Prs3d_Projector)& aProjector , - const Handle(Geom_Transformation)& aGeomTrans, - const Handle(Prs3d_Presentation)& aPresentation ) +void StdSelect_Shape::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const { - PrsMgr_PresentableObject::Compute(aProjector,aGeomTrans,aPresentation); -} + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, PrsMgr_PresentableObject) -void StdSelect_Shape::Compute(const Handle(Prs3d_Projector)& aProjector, - const Handle(Prs3d_Presentation)& aPresentation) -{ - PrsMgr_PresentableObject::Compute(aProjector,aPresentation); + OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &mysh) } diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_Shape.hxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_Shape.hxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_Shape.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_Shape.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,23 +32,13 @@ Standard_EXPORT StdSelect_Shape(const TopoDS_Shape& theShape, const Handle(Prs3d_Drawer)& theDrawer = Handle(Prs3d_Drawer)()); Standard_EXPORT void Compute (const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, const Handle(Prs3d_Presentation)& aPresentation, const Standard_Integer aMode = 0) Standard_OVERRIDE; - - //! computes the presentation according to a point of view - //! given by . - //! To be Used when the associated degenerated Presentations - //! have been transformed by which is not a Pure - //! Translation. The HLR Prs can't be deducted automatically - //! WARNING : must be applied - //! to the object to display before computation !!! - Standard_EXPORT virtual void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Geom_Transformation)& aTrsf, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; const TopoDS_Shape& Shape() const { return mysh; } void Shape (const TopoDS_Shape& theShape) { mysh = theShape; } -private: - - Standard_EXPORT void Compute (const Handle(Prs3d_Projector)& aProjector, const Handle(Prs3d_Presentation)& aPresentation) Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; private: diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_ShapeTypeFilter.hxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_ShapeTypeFilter.hxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_ShapeTypeFilter.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_ShapeTypeFilter.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,67 +17,33 @@ #ifndef _StdSelect_ShapeTypeFilter_HeaderFile #define _StdSelect_ShapeTypeFilter_HeaderFile -#include -#include - #include #include -#include -class SelectMgr_EntityOwner; +class SelectMgr_EntityOwner; -class StdSelect_ShapeTypeFilter; DEFINE_STANDARD_HANDLE(StdSelect_ShapeTypeFilter, SelectMgr_Filter) -//! A filter framework which allows you to define a filter -//! for a specific shape type. The types available include: -//! - compound -//! - compsolid -//! - solid -//! - shell -//! - face -//! - wire -//! - edge -//! - vertex. +//! A filter framework which allows you to define a filter for a specific shape type. class StdSelect_ShapeTypeFilter : public SelectMgr_Filter { - + DEFINE_STANDARD_RTTIEXT(StdSelect_ShapeTypeFilter, SelectMgr_Filter) public: - //! Constructs a filter object defined by the shape type aType. Standard_EXPORT StdSelect_ShapeTypeFilter(const TopAbs_ShapeEnum aType); - - Standard_EXPORT virtual Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& anobj) const Standard_OVERRIDE; - - //! Returns the type of shape selected by the filter. - TopAbs_ShapeEnum Type() const; - - Standard_EXPORT virtual Standard_Boolean ActsOn (const TopAbs_ShapeEnum aStandardMode) const Standard_OVERRIDE; - - - - - DEFINE_STANDARD_RTTIEXT(StdSelect_ShapeTypeFilter,SelectMgr_Filter) - -protected: + //! Returns the type of shape selected by the filter. + TopAbs_ShapeEnum Type() const {return myType;} + Standard_EXPORT virtual Standard_Boolean IsOk (const Handle(SelectMgr_EntityOwner)& anobj) const Standard_OVERRIDE; + Standard_EXPORT virtual Standard_Boolean ActsOn (const TopAbs_ShapeEnum aStandardMode) const Standard_OVERRIDE; private: - TopAbs_ShapeEnum myType; - }; - -#include - - - - - #endif // _StdSelect_ShapeTypeFilter_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_ShapeTypeFilter.lxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_ShapeTypeFilter.lxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_ShapeTypeFilter.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_ShapeTypeFilter.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Created on: 1997-03-06 -// Created by: Robert COUBLANC -// Copyright (c) 1997-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -inline TopAbs_ShapeEnum StdSelect_ShapeTypeFilter::Type() const -{return myType;} diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_TypeOfResult.hxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_TypeOfResult.hxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_TypeOfResult.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_TypeOfResult.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -// Created on: 1995-03-08 -// Created by: Mister rmi -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _StdSelect_TypeOfResult_HeaderFile -#define _StdSelect_TypeOfResult_HeaderFile - -//! Provides values for type of result. -//! These are used to specify whether the result is to -//! be simple or whether it may be multiple. -enum StdSelect_TypeOfResult -{ -StdSelect_TOR_SIMPLE, -StdSelect_TOR_MULTIPLE -}; - -#endif // _StdSelect_TypeOfResult_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_ViewerSelector3d.cxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_ViewerSelector3d.cxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_ViewerSelector3d.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_ViewerSelector3d.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,1088 +0,0 @@ -// Created on: 1995-03-15 -// Created by: Robert COUBLANC -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - - -IMPLEMENT_STANDARD_RTTIEXT(StdSelect_ViewerSelector3d,SelectMgr_ViewerSelector) - -static Standard_Integer StdSel_NumberOfFreeEdges (const Handle(Poly_Triangulation)& Trg) -{ - Standard_Integer nFree = 0; - Poly_Connect pc(Trg); - Standard_Integer t[3]; - Standard_Integer i, j; - for (i = 1; i <= Trg->NbTriangles(); i++) - { - pc.Triangles (i, t[0], t[1], t[2]); - for (j = 0; j < 3; j++) - if (t[j] == 0) nFree++; - } - return nFree; -} - -//======================================================================= -// Function : Constructor -// Purpose : -//======================================================================= -StdSelect_ViewerSelector3d::StdSelect_ViewerSelector3d() {} - -//======================================================================= -// Function: SetPixelTolerance -// Purpose : -//======================================================================= -void StdSelect_ViewerSelector3d::SetPixelTolerance (const Standard_Integer theTolerance) -{ - if (myTolerances.Tolerance() != theTolerance) - { - if (theTolerance < 0) - myTolerances.ResetDefaults(); - else - myTolerances.SetCustomTolerance (theTolerance); - myToUpdateTolerance = Standard_True; - } -} - -//======================================================================= -// Function: Pick -// Purpose : -//======================================================================= -void StdSelect_ViewerSelector3d::Pick (const Standard_Integer theXPix, - const Standard_Integer theYPix, - const Handle(V3d_View)& theView) -{ - updateZLayers (theView); - if(myToUpdateTolerance) - { - mySelectingVolumeMgr.SetPixelTolerance (myTolerances.Tolerance()); - myToUpdateTolerance = Standard_False; - } - - mySelectingVolumeMgr.SetCamera (theView->Camera()); - mySelectingVolumeMgr.SetActiveSelectionType (SelectMgr_SelectingVolumeManager::Point); - Standard_Integer aWidth = 0, aHeight = 0; - theView->Window()->Size (aWidth, aHeight); - mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight); - gp_Pnt2d aMousePos (static_cast (theXPix), - static_cast (theYPix)); - mySelectingVolumeMgr.BuildSelectingVolume (aMousePos); - mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)()); - - TraverseSensitives(); -} - -//======================================================================= -// Function: Pick -// Purpose : -//======================================================================= -void StdSelect_ViewerSelector3d::Pick (const Standard_Integer theXPMin, - const Standard_Integer theYPMin, - const Standard_Integer theXPMax, - const Standard_Integer theYPMax, - const Handle(V3d_View)& theView) -{ - updateZLayers (theView); - mySelectingVolumeMgr.SetCamera (theView->Camera()); - mySelectingVolumeMgr.SetActiveSelectionType (SelectMgr_SelectingVolumeManager::Box); - Standard_Integer aWidth = 0, aHeight = 0; - theView->Window()->Size (aWidth, aHeight); - mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight); - gp_Pnt2d aMinMousePos (static_cast (theXPMin), - static_cast (theYPMin)); - gp_Pnt2d aMaxMousePos (static_cast (theXPMax), - static_cast (theYPMax)); - mySelectingVolumeMgr.BuildSelectingVolume (aMinMousePos, - aMaxMousePos); - - mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)()); - - TraverseSensitives(); -} - -//======================================================================= -// Function: Pick -// Purpose : Selection using a polyline -//======================================================================= -void StdSelect_ViewerSelector3d::Pick (const TColgp_Array1OfPnt2d& thePolyline, - const Handle(V3d_View)& theView) -{ - updateZLayers (theView); - mySelectingVolumeMgr.SetCamera (theView->Camera()); - mySelectingVolumeMgr.SetActiveSelectionType (SelectMgr_SelectingVolumeManager::Polyline); - Standard_Integer aWidth = 0, aHeight = 0; - theView->Window()->Size (aWidth, aHeight); - mySelectingVolumeMgr.SetWindowSize (aWidth, aHeight); - mySelectingVolumeMgr.BuildSelectingVolume (thePolyline); - - mySelectingVolumeMgr.SetViewClipping (theView->ClipPlanes(), Handle(Graphic3d_SequenceOfHClipPlane)()); - - TraverseSensitives(); -} - -//======================================================================= -// Function: DisplaySensitive. -// Purpose : Display active primitives. -//======================================================================= -void StdSelect_ViewerSelector3d::DisplaySensitive (const Handle(V3d_View)& theView) -{ - for (SelectMgr_SelectableObjectSet::Iterator aSelectableIt (mySelectableObjects); aSelectableIt.More(); aSelectableIt.Next()) - { - Handle(Graphic3d_Structure) aStruct = new Graphic3d_Structure (theView->Viewer()->StructureManager()); - const Handle (SelectMgr_SelectableObject)& anObj = aSelectableIt.Value(); - for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next()) - { - if (aSelIter.Value()->GetSelectionState() == SelectMgr_SOS_Activated) - { - computeSensitivePrs (aStruct, aSelIter.Value(), anObj->Transformation(), Handle(Graphic3d_TransformPers)()); - } - } - - myStructs.Append (aStruct); - } - - for (Graphic3d_SequenceOfStructure::Iterator aStructIter (myStructs); aStructIter.More(); aStructIter.Next()) - { - Handle(Graphic3d_Structure)& aStruct = aStructIter.ChangeValue(); - aStruct->SetDisplayPriority (10); - aStruct->Display(); - } - - theView->Update(); -} - -//======================================================================= -// Function: ClearSensitive -// Purpose : -//======================================================================= -void StdSelect_ViewerSelector3d::ClearSensitive (const Handle(V3d_View)& theView) -{ - for (Graphic3d_SequenceOfStructure::Iterator aStructIter (myStructs); aStructIter.More(); aStructIter.Next()) - { - aStructIter.ChangeValue()->Remove(); - } - myStructs.Clear(); - - if (!theView.IsNull()) - { - theView->Update(); - } -} - -//======================================================================= -//function : DisplaySenstive -//purpose : -//======================================================================= -void StdSelect_ViewerSelector3d::DisplaySensitive (const Handle(SelectMgr_Selection)& theSel, - const gp_Trsf& theTrsf, - const Handle(V3d_View)& theView, - const Standard_Boolean theToClearOthers) -{ - if (theToClearOthers) - { - ClearSensitive (theView); - } - - Handle(Graphic3d_Structure) aStruct = new Graphic3d_Structure (theView->Viewer()->StructureManager()); - - computeSensitivePrs (aStruct, theSel, theTrsf, Handle(Graphic3d_TransformPers)()); - - myStructs.Append (aStruct); - myStructs.Last()->SetDisplayPriority (10); - myStructs.Last()->Display(); - - theView->Update(); -} - -//======================================================================= -//function : computeSensitivePrs -//purpose : -//======================================================================= -void StdSelect_ViewerSelector3d::computeSensitivePrs (const Handle(Graphic3d_Structure)& theStructure, - const Handle(SelectMgr_Selection)& theSel, - const gp_Trsf& theLoc, - const Handle(Graphic3d_TransformPers)& theTrsfPers) -{ - theStructure->SetTransformPersistence (theTrsfPers); - - Handle(Graphic3d_Group) aSensGroup = theStructure->NewGroup(); - - Quantity_Color aColor (Quantity_NOC_INDIANRED3); - Handle(Graphic3d_AspectMarker3d) aMarkerAspect =new Graphic3d_AspectMarker3d (Aspect_TOM_O_PLUS, aColor, 2.0); - - aSensGroup->SetPrimitivesAspect (aMarkerAspect); - aSensGroup->SetPrimitivesAspect (new Graphic3d_AspectLine3d (Quantity_NOC_GRAY40, Aspect_TOL_SOLID, 2.0)); - - Handle(Graphic3d_Group) anAreaGroup = theStructure->NewGroup(); - - anAreaGroup->SetPrimitivesAspect (new Graphic3d_AspectLine3d (Quantity_NOC_AQUAMARINE1, Aspect_TOL_DASH, 1.0)); - - TColgp_SequenceOfPnt aSeqLines, aSeqFree; - TColStd_SequenceOfInteger aSeqBnds; - for (NCollection_Vector::Iterator aSelEntIter (theSel->Entities()); aSelEntIter.More(); aSelEntIter.Next()) - { - const Handle(Select3D_SensitiveEntity)& Ent = aSelEntIter.Value()->BaseSensitive(); - const Standard_Boolean hasloc = theLoc.Form() != gp_Identity; - - //============== - // Box - //============= - - if (Ent->DynamicType()==STANDARD_TYPE(Select3D_SensitiveBox)) - { - const Bnd_Box& B = Handle(Select3D_SensitiveBox)::DownCast (Ent)->Box(); - Standard_Real xmin, ymin, zmin, xmax, ymax, zmax; - B.Get (xmin, ymin, zmin, xmax, ymax, zmax); - Standard_Integer i; - gp_Pnt theboxpoint[8] = - { - gp_Pnt(xmin,ymin,zmin), - gp_Pnt(xmax,ymin,zmin), - gp_Pnt(xmax,ymax,zmin), - gp_Pnt(xmin,ymax,zmin), - gp_Pnt(xmin,ymin,zmax), - gp_Pnt(xmax,ymin,zmax), - gp_Pnt(xmax,ymax,zmax), - gp_Pnt(xmin,ymax,zmax) - }; - if(hasloc) - { - for (i = 0; i <= 7; i++) - theboxpoint[i].Transform (theLoc); - } - - aSeqBnds.Append(5); - for (i = 0; i < 4; i++) - aSeqLines.Append(theboxpoint[i]); - aSeqLines.Append(theboxpoint[0]); - - aSeqBnds.Append(5); - for (i = 4; i < 8; i++) - aSeqLines.Append(theboxpoint[i]); - aSeqLines.Append(theboxpoint[4]); - - for (i = 0; i < 4; i++) - { - aSeqBnds.Append(2); - aSeqLines.Append(theboxpoint[i]); - aSeqLines.Append(theboxpoint[i+4]); - } - } - //============== - // Face - //============= - else if (Ent->DynamicType()==STANDARD_TYPE(Select3D_SensitiveFace)) - { - Handle(Select3D_SensitiveFace) aFace = Handle(Select3D_SensitiveFace)::DownCast(Ent); - Handle(TColgp_HArray1OfPnt) TheHPts; - aFace->GetPoints(TheHPts); - const TColgp_Array1OfPnt& ThePts = TheHPts->Array1(); - - aSeqBnds.Append(ThePts.Length()); - for (Standard_Integer I = ThePts.Lower(); I <= ThePts.Upper(); I++) - { - if (hasloc) - aSeqLines.Append(ThePts(I).Transformed (theLoc)); - else - aSeqLines.Append(ThePts(I)); - } - } - //============== - // Curve - //============= - else if (Ent->DynamicType()==STANDARD_TYPE(Select3D_SensitiveCurve)) - { - Handle(Select3D_SensitiveCurve) aCurve = Handle(Select3D_SensitiveCurve)::DownCast(Ent); - Handle(TColgp_HArray1OfPnt) TheHPts; - aCurve->Points3D(TheHPts); - const TColgp_Array1OfPnt& ThePts = TheHPts->Array1(); - - aSeqBnds.Append(ThePts.Length()); - for (Standard_Integer I = ThePts.Lower(); I <= ThePts.Upper(); I++) - { - if (hasloc) - aSeqLines.Append(ThePts(I).Transformed (theLoc)); - else - aSeqLines.Append(ThePts(I)); - } - } - //============== - // Wire - //============= - else if (Ent->DynamicType()==STANDARD_TYPE(Select3D_SensitiveWire)) - { - Handle(Select3D_SensitiveWire) aWire = Handle(Select3D_SensitiveWire)::DownCast(Ent); - const NCollection_Vector& anEntities = aWire->GetEdges(); - - for (int i = 0; i < anEntities.Length(); i++) - { - Handle(Select3D_SensitiveEntity) SubEnt = anEntities.Value(i); - - //Segment - if (SubEnt->DynamicType()==STANDARD_TYPE(Select3D_SensitiveSegment)) - { - gp_Pnt P1 (Handle(Select3D_SensitiveSegment)::DownCast(SubEnt)->StartPoint().XYZ()); - gp_Pnt P2 (Handle(Select3D_SensitiveSegment)::DownCast(SubEnt)->EndPoint().XYZ()); - if (hasloc) - { - P1.Transform(theLoc); - P2.Transform(theLoc); - } - aSeqBnds.Append(2); - aSeqLines.Append(P1); - aSeqLines.Append(P2); - } - - //circle - if (SubEnt->DynamicType()==STANDARD_TYPE(Select3D_SensitiveCircle)) - { - Handle(Select3D_SensitiveCircle) aCircle = Handle(Select3D_SensitiveCircle)::DownCast(SubEnt); - Standard_Integer aFrom, aTo; - aCircle->ArrayBounds (aFrom, aTo); - aTo -= 2; - for (Standard_Integer aPntIter = aFrom; aPntIter <= aTo; aPntIter += 2) - { - gp_Pnt aPnts[3] = - { - gp_Pnt (aCircle->GetPoint3d (aPntIter + 0).XYZ()), - gp_Pnt (aCircle->GetPoint3d (aPntIter + 1).XYZ()), - gp_Pnt (aCircle->GetPoint3d (aPntIter + 2).XYZ()) - }; - - if (hasloc) - { - aPnts[0].Transform (theLoc); - aPnts[1].Transform (theLoc); - aPnts[2].Transform (theLoc); - } - - aSeqBnds.Append (4); - aSeqLines.Append (aPnts[0]); - aSeqLines.Append (aPnts[1]); - aSeqLines.Append (aPnts[2]); - aSeqLines.Append (aPnts[0]); - } - } - - //curve - if (SubEnt->DynamicType()==STANDARD_TYPE(Select3D_SensitiveCurve)) - { - Handle(Select3D_SensitiveCurve) aCurve = Handle(Select3D_SensitiveCurve)::DownCast(SubEnt); - Handle(TColgp_HArray1OfPnt) TheHPts; - aCurve->Points3D (TheHPts); - const TColgp_Array1OfPnt& ThePts = TheHPts->Array1(); - - aSeqBnds.Append(ThePts.Length()); - for (Standard_Integer I = ThePts.Lower(); I <= ThePts.Upper(); I++) - { - if (hasloc) - aSeqLines.Append(ThePts(I).Transformed (theLoc)); - else - aSeqLines.Append(ThePts(I)); - } - } - } - } - //============== - // Segment - //============= - else if (Ent->DynamicType()==STANDARD_TYPE(Select3D_SensitiveSegment)) - { - gp_Pnt P1 (Handle(Select3D_SensitiveSegment)::DownCast(Ent)->StartPoint().XYZ()); - gp_Pnt P2 (Handle(Select3D_SensitiveSegment)::DownCast(Ent)->EndPoint().XYZ()); - if (hasloc) - { - P1.Transform (theLoc); - P2.Transform (theLoc); - } - aSeqBnds.Append(2); - aSeqLines.Append(P1); - aSeqLines.Append(P2); - } - //============== - // Circle - //============= - else if (Ent->DynamicType()==STANDARD_TYPE(Select3D_SensitiveCircle)) - { - Handle(Select3D_SensitiveCircle) aCircle = Handle(Select3D_SensitiveCircle)::DownCast(Ent); - Standard_Integer aFrom, aTo; - aCircle->ArrayBounds (aFrom, aTo); - aTo -= 2; - for (Standard_Integer aPntIter = aFrom; aPntIter <= aTo; aPntIter += 2) - { - gp_Pnt aPnts[3] = - { - gp_Pnt (aCircle->GetPoint3d (aPntIter + 0).XYZ()), - gp_Pnt (aCircle->GetPoint3d (aPntIter + 1).XYZ()), - gp_Pnt (aCircle->GetPoint3d (aPntIter + 2).XYZ()) - }; - - if (hasloc) - { - aPnts[0].Transform (theLoc); - aPnts[1].Transform (theLoc); - aPnts[2].Transform (theLoc); - } - - aSeqBnds.Append (4); - aSeqLines.Append (aPnts[0]); - aSeqLines.Append (aPnts[1]); - aSeqLines.Append (aPnts[2]); - aSeqLines.Append (aPnts[0]); - } - } - //============== - // Point - //============= - else if (Ent->DynamicType()==STANDARD_TYPE(Select3D_SensitivePoint)) - { - gp_Pnt P = hasloc ? - Handle(Select3D_SensitivePoint)::DownCast(Ent)->Point() : - Handle(Select3D_SensitivePoint)::DownCast(Ent)->Point().Transformed (theLoc); - Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1); - anArrayOfPoints->AddVertex (P.X(), P.Y(), P.Z()); - aSensGroup->AddPrimitiveArray (anArrayOfPoints); - } - //============================================================ - // Triangulation : On met un petit offset ves l'interieur... - //========================================================== - else if (Ent->DynamicType()==STANDARD_TYPE(Select3D_SensitiveTriangulation)) - { - Handle(Poly_Triangulation) PT (Handle(Select3D_SensitiveTriangulation)::DownCast (Ent)->Triangulation()); - - const Poly_Array1OfTriangle& triangles = PT->Triangles(); - const TColgp_Array1OfPnt& Nodes = PT->Nodes(); - Standard_Integer n[3]; - - TopLoc_Location iloc, bidloc; - if (Handle(Select3D_SensitiveTriangulation)::DownCast (Ent)->HasInitLocation()) - bidloc = Handle(Select3D_SensitiveTriangulation)::DownCast (Ent)->GetInitLocation(); - - if (bidloc.IsIdentity()) - iloc = theLoc; - else - iloc = theLoc * bidloc; - - Standard_Integer i; - for (i = 1; i <= PT->NbTriangles(); i++) - { - triangles (i).Get (n[0], n[1], n[2]); - gp_Pnt P1 (Nodes (n[0]).Transformed (iloc)); - gp_Pnt P2 (Nodes (n[1]).Transformed (iloc)); - gp_Pnt P3 (Nodes (n[2]).Transformed (iloc)); - gp_XYZ V1 (P1.XYZ()); - gp_XYZ V2 (P2.XYZ()); - gp_XYZ V3 (P3.XYZ()); - gp_XYZ CDG (P1.XYZ()); CDG += (P2.XYZ()); CDG += (P3.XYZ()); CDG /= 3.0; - V1 -= CDG; V2 -= CDG; V3 -= CDG; - V1 *= 0.9; V2 *= 0.9; V3 *= 0.9; - V1 += CDG; V2 += CDG; V3 += CDG; - - aSeqBnds.Append(4); - aSeqLines.Append(gp_Pnt(V1)); - aSeqLines.Append(gp_Pnt(V2)); - aSeqLines.Append(gp_Pnt(V3)); - aSeqLines.Append(gp_Pnt(V1)); - } - - // recherche des bords libres... - - Handle(TColStd_HArray1OfInteger) FreeEdges = new TColStd_HArray1OfInteger (1, 2 * StdSel_NumberOfFreeEdges (PT)); - TColStd_Array1OfInteger& FreeE = FreeEdges->ChangeArray1(); - Poly_Connect pc (PT); - Standard_Integer t[3]; - Standard_Integer j; - Standard_Integer fr (1); - for (i = 1; i <= PT->NbTriangles(); i++) - { - pc.Triangles (i, t[0], t[1], t[2]); - triangles (i).Get (n[0], n[1], n[2]); - for (j = 0; j < 3; j++) - { - Standard_Integer k = (j + 1) % 3; - if (t[j] == 0) - { - FreeE (fr) = n[j]; - FreeE (fr + 1)= n[k]; - fr += 2; - } - } - } - for (Standard_Integer ifri = 1; ifri <= FreeE.Length(); ifri += 2) - { - gp_Pnt pe1 (Nodes (FreeE (ifri)).Transformed (iloc)), pe2 (Nodes (FreeE (ifri + 1)).Transformed (iloc)); - aSeqFree.Append(pe1); - aSeqFree.Append(pe2); - } - } - else if (Ent->DynamicType()==STANDARD_TYPE(Select3D_SensitiveTriangle)) - { - Handle(Select3D_SensitiveTriangle) Str = Handle(Select3D_SensitiveTriangle)::DownCast(Ent); - gp_Pnt P1, P2, P3; - Str->Points3D (P1, P2, P3); - gp_Pnt CDG = Str->Center3D(); - - gp_XYZ V1 (P1.XYZ()); V1 -= (CDG.XYZ()); - gp_XYZ V2 (P2.XYZ()); V2 -= (CDG.XYZ()); - gp_XYZ V3 (P3.XYZ()); V3 -= (CDG.XYZ()); - V1 *= 0.9; V2 *= 0.9; V3 *= 0.9; - V1 += CDG.XYZ(); V2 += CDG.XYZ(); V3 += CDG.XYZ(); - - aSeqBnds.Append(4); - aSeqLines.Append(gp_Pnt(V1)); - aSeqLines.Append(gp_Pnt(V2)); - aSeqLines.Append(gp_Pnt(V3)); - aSeqLines.Append(gp_Pnt(V1)); - } - } - - Standard_Integer i; - - if (aSeqLines.Length()) - { - Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(aSeqLines.Length(),aSeqBnds.Length()); - for (i = 1; i <= aSeqLines.Length(); i++) - aPrims->AddVertex(aSeqLines(i)); - for (i = 1; i <= aSeqBnds.Length(); i++) - aPrims->AddBound(aSeqBnds(i)); - anAreaGroup->AddPrimitiveArray(aPrims); - } - - if (aSeqFree.Length()) - { - aSensGroup->SetPrimitivesAspect (new Graphic3d_AspectLine3d (Quantity_NOC_GREEN, Aspect_TOL_SOLID, 2.0)); - Handle(Graphic3d_ArrayOfPolylines) aPrims = new Graphic3d_ArrayOfPolylines(aSeqFree.Length(),aSeqFree.Length()/2); - for (i = 1; i <= aSeqFree.Length(); i++) - { - aPrims->AddBound(2); - aPrims->AddVertex(aSeqLines(i++)); - aPrims->AddVertex(aSeqLines(i)); - } - aSensGroup->AddPrimitiveArray(aPrims); - aSensGroup->SetPrimitivesAspect (new Graphic3d_AspectLine3d (Quantity_NOC_GRAY40, Aspect_TOL_SOLID, 2.0)); - } -} - -//======================================================================= -// Function: updateZLayers -// Purpose : -//======================================================================= -void StdSelect_ViewerSelector3d::updateZLayers (const Handle(V3d_View)& theView) -{ - myZLayerOrderMap.Clear(); - TColStd_SequenceOfInteger aZLayers; - theView->Viewer()->GetAllZLayers (aZLayers); - Standard_Integer aPos = 0; - Standard_Boolean isPrevDepthWrite = true; - for (TColStd_SequenceOfInteger::Iterator aLayerIter (aZLayers); aLayerIter.More(); aLayerIter.Next()) - { - Graphic3d_ZLayerSettings aSettings = theView->Viewer()->ZLayerSettings (aLayerIter.Value()); - if (aSettings.ToClearDepth() - || isPrevDepthWrite != aSettings.ToEnableDepthWrite()) - { - ++aPos; - } - isPrevDepthWrite = aSettings.ToEnableDepthWrite(); - myZLayerOrderMap.Bind (aLayerIter.Value(), aPos); - } -} - -namespace -{ - //! Abstract class for filling pixel with color. - class BaseFiller : public Standard_Transient - { - DEFINE_STANDARD_RTTI_INLINE(BaseFiller, Standard_Transient) - public: - - //! Main constructor. - BaseFiller (Image_PixMap& thePixMap, - StdSelect_ViewerSelector3d* theSelector) - : myImage (&thePixMap), - myMainSel(theSelector) {} - - //! Fill pixel at specified position. - virtual void Fill (const Standard_Integer theCol, - const Standard_Integer theRow, - const Standard_Integer thePicked) = 0; - - //! Flush results into final image. - virtual void Flush() {} - - protected: - - //! Find the new unique random color. - void randomPastelColor (Quantity_Color& theColor) - { - for (;;) - { - nextRandomPastelColor (theColor); - if (myUniqueColors.Add (theColor)) - { - return; - } - } - } - - //! Fills the given color as random. - void nextRandomPastelColor (Quantity_Color& theColor) - { - theColor = Quantity_Color (Standard_Real(myBullardGenerator.NextInt() % 256) / 255.0, - Standard_Real(myBullardGenerator.NextInt() % 256) / 255.0, - Standard_Real(myBullardGenerator.NextInt() % 256) / 255.0, - Quantity_TOC_RGB); - } - - protected: - Image_PixMap* myImage; - StdSelect_ViewerSelector3d* myMainSel; - math_BullardGenerator myBullardGenerator; - NCollection_Map myUniqueColors; - }; - - //! Help class for filling pixel with random color. - class GeneratedEntityColorFiller : public BaseFiller - { - DEFINE_STANDARD_RTTI_INLINE(GeneratedEntityColorFiller, BaseFiller) - public: - GeneratedEntityColorFiller (Image_PixMap& thePixMap, - StdSelect_ViewerSelector3d* theSelector, - const SelectMgr_SelectableObjectSet& theSelObjects) - : BaseFiller (thePixMap, theSelector) - { - // generate per-entity colors in the order as they have been activated - for (SelectMgr_SelectableObjectSet::Iterator anObjIter (theSelObjects); anObjIter.More(); anObjIter.Next()) - { - const Handle(SelectMgr_SelectableObject)& anObj = anObjIter.Value(); - for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next()) - { - const Handle(SelectMgr_Selection)& aSel = aSelIter.Value(); - for (NCollection_Vector::Iterator aSelEntIter (aSel->Entities()); aSelEntIter.More(); aSelEntIter.Next()) - { - const Handle(SelectMgr_SensitiveEntity)& aSens = aSelEntIter.Value(); - if (!myMapEntityColors.IsBound (aSens->BaseSensitive())) - { - Quantity_Color aColor; - randomPastelColor (aColor); - myMapEntityColors.Bind (aSens->BaseSensitive(), aColor); - } - } - } - } - } - - virtual void Fill (const Standard_Integer theCol, - const Standard_Integer theRow, - const Standard_Integer thePicked) Standard_OVERRIDE - { - if (thePicked < 1 - || thePicked > myMainSel->NbPicked()) - { - myImage->SetPixelColor (theCol, theRow, Quantity_Color(Quantity_NOC_BLACK)); - return; - } - - const Handle(Select3D_SensitiveEntity)& aPickedEntity = myMainSel->PickedEntity (thePicked); - Quantity_Color aColor (Quantity_NOC_BLACK); - myMapEntityColors.Find (aPickedEntity, aColor); - myImage->SetPixelColor (theCol, theRow, aColor); - } - - protected: - NCollection_DataMap myMapEntityColors; - }; - - //! Help class for filling pixel with normalized depth of ray. - class NormalizedDepthFiller : public BaseFiller - { - DEFINE_STANDARD_RTTI_INLINE(NormalizedDepthFiller, BaseFiller) - public: - NormalizedDepthFiller (Image_PixMap& thePixMap, - StdSelect_ViewerSelector3d* theSelector, - const Standard_Boolean theToInverse) - : BaseFiller (thePixMap, theSelector), - myDepthMin ( RealLast()), - myDepthMax (-RealLast()), - myToInverse(theToInverse) - { - myUnnormImage.InitZero (Image_Format_GrayF, thePixMap.SizeX(), thePixMap.SizeY()); - } - - //! Accumulate the data. - virtual void Fill (const Standard_Integer theCol, - const Standard_Integer theRow, - const Standard_Integer thePicked) Standard_OVERRIDE - { - if (myUnnormImage.IsEmpty()) - { - return; - } - - if (thePicked < 1 - || thePicked > myMainSel->NbPicked()) - { - myUnnormImage.ChangeValue (theRow, theCol) = ShortRealLast(); - return; - } - - const SelectMgr_SortCriterion& aSortCriterion = myMainSel->PickedData (thePicked); - myUnnormImage.ChangeValue (theRow, theCol) = float(aSortCriterion.Depth); - myDepthMin = Min (myDepthMin, aSortCriterion.Depth); - myDepthMax = Max (myDepthMax, aSortCriterion.Depth); - } - - //! Normalize the depth values. - virtual void Flush() Standard_OVERRIDE - { - float aFrom = 0.0f; - float aDelta = 1.0f; - if (myDepthMin <= myDepthMax) - { - aFrom = float(myDepthMin); - aDelta = float(myDepthMax) - float(myDepthMin); - if (aDelta <= ShortRealEpsilon()) - { - aDelta = 1.0f; - } - } - for (Standard_Size aRowIter = 0; aRowIter < myUnnormImage.SizeY(); ++aRowIter) - { - for (Standard_Size aColIter = 0; aColIter < myUnnormImage.SizeX(); ++aColIter) - { - float aDepth = myUnnormImage.Value (aRowIter, aColIter); - if (aDepth <= -ShortRealLast() - || aDepth >= ShortRealLast()) - { - myImage->SetPixelColor (Standard_Integer(aColIter), Standard_Integer(aRowIter), - Quantity_ColorRGBA (0.0f, 0.0f, 0.0f, 1.0f)); - continue; - } - - float aNormDepth = (aDepth - aFrom) / aDelta; - if (myToInverse) - { - aNormDepth = 1.0f - aNormDepth; - } - myImage->SetPixelColor (Standard_Integer(aColIter), Standard_Integer(aRowIter), - Quantity_ColorRGBA (aNormDepth, aNormDepth, aNormDepth, 1.0f)); - } - } - } - - private: - Image_PixMap myUnnormImage; - Standard_Real myDepthMin; - Standard_Real myDepthMax; - Standard_Boolean myToInverse; - }; - - //! Help class for filling pixel with unnormalized depth of ray. - class UnnormalizedDepthFiller : public BaseFiller - { - DEFINE_STANDARD_RTTI_INLINE(UnnormalizedDepthFiller, BaseFiller) - public: - UnnormalizedDepthFiller (Image_PixMap& thePixMap, - StdSelect_ViewerSelector3d* theSelector) - : BaseFiller (thePixMap, theSelector) {} - - virtual void Fill (const Standard_Integer theCol, - const Standard_Integer theRow, - const Standard_Integer thePicked) Standard_OVERRIDE - { - if (thePicked < 1 - || thePicked > myMainSel->NbPicked()) - { - myImage->SetPixelColor (theCol, theRow, Quantity_ColorRGBA (0.0f, 0.0f, 0.0f, 1.0f)); - return; - } - - const SelectMgr_SortCriterion& aSortCriterion = myMainSel->PickedData (thePicked); - const float aDepth = float(aSortCriterion.Depth); - myImage->SetPixelColor (theCol, theRow, Quantity_ColorRGBA (Graphic3d_Vec4 (aDepth, aDepth, aDepth, 1.0f))); - } - }; - - //! Help class for filling pixel with color of detected object. - class GeneratedOwnerColorFiller : public BaseFiller - { - DEFINE_STANDARD_RTTI_INLINE(GeneratedOwnerColorFiller, BaseFiller) - public: - GeneratedOwnerColorFiller (Image_PixMap& thePixMap, - StdSelect_ViewerSelector3d* theSelector, - const SelectMgr_SelectableObjectSet& theSelObjects) - : BaseFiller (thePixMap, theSelector) - { - // generate per-owner colors in the order as they have been activated - for (SelectMgr_SelectableObjectSet::Iterator anObjIter (theSelObjects); anObjIter.More(); anObjIter.Next()) - { - const Handle(SelectMgr_SelectableObject)& anObj = anObjIter.Value(); - for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next()) - { - const Handle(SelectMgr_Selection)& aSel = aSelIter.Value(); - for (NCollection_Vector::Iterator aSelEntIter (aSel->Entities()); aSelEntIter.More(); aSelEntIter.Next()) - { - const Handle(SelectMgr_SensitiveEntity)& aSens = aSelEntIter.Value(); - const Handle(SelectBasics_EntityOwner)& anOwner = aSens->BaseSensitive()->OwnerId(); - if (!myMapOwnerColors.IsBound (anOwner)) - { - Quantity_Color aColor; - randomPastelColor (aColor); - myMapOwnerColors.Bind (anOwner, aColor); - } - } - } - } - } - - virtual void Fill (const Standard_Integer theCol, - const Standard_Integer theRow, - const Standard_Integer thePicked) Standard_OVERRIDE - { - if (thePicked < 1 - || thePicked > myMainSel->NbPicked()) - { - myImage->SetPixelColor (theCol, theRow, Quantity_Color(Quantity_NOC_BLACK)); - return; - } - - const Handle(SelectMgr_EntityOwner)& aPickedOwner = myMainSel->Picked (thePicked); - Quantity_Color aColor (Quantity_NOC_BLACK); - myMapOwnerColors.Find (aPickedOwner, aColor); - myImage->SetPixelColor (theCol, theRow, aColor); - } - - protected: - NCollection_DataMap myMapOwnerColors; - }; - - //! Help class for filling pixel with random color for each selection mode. - class GeneratedSelModeColorFiller : public BaseFiller - { - DEFINE_STANDARD_RTTI_INLINE(GeneratedSelModeColorFiller, BaseFiller) - public: - GeneratedSelModeColorFiller (Image_PixMap& thePixMap, - StdSelect_ViewerSelector3d* theSelector) - : BaseFiller (thePixMap, theSelector) - { - // generate standard modes in proper order, consider custom objects would use similar scheme - myMapSelectionModeColors.Bind ( 0, Quantity_NOC_WHITE); // default (entire object selection) - myMapSelectionModeColors.Bind ( 1, Quantity_NOC_YELLOW); // TopAbs_VERTEX - myMapSelectionModeColors.Bind ( 2, Quantity_NOC_GREEN); // TopAbs_EDGE - myMapSelectionModeColors.Bind ( 3, Quantity_NOC_RED); // TopAbs_WIRE - myMapSelectionModeColors.Bind ( 4, Quantity_NOC_BLUE1); // TopAbs_FACE - myMapSelectionModeColors.Bind ( 5, Quantity_NOC_CYAN1); // TopAbs_SHELL - myMapSelectionModeColors.Bind ( 6, Quantity_NOC_PURPLE); // TopAbs_SOLID - myMapSelectionModeColors.Bind ( 7, Quantity_NOC_MAGENTA1); // TopAbs_COMPSOLID - myMapSelectionModeColors.Bind ( 8, Quantity_NOC_BROWN); // TopAbs_COMPOUND - myMapSelectionModeColors.Bind (0x0010, Quantity_NOC_PINK); // MeshVS_SMF_Volume - myMapSelectionModeColors.Bind (0x001E, Quantity_NOC_LIMEGREEN); // MeshVS_SMF_Element - myMapSelectionModeColors.Bind (0x001F, Quantity_NOC_DARKOLIVEGREEN); // MeshVS_SMF_All - myMapSelectionModeColors.Bind (0x0100, Quantity_NOC_GOLD); // MeshVS_SMF_Group - } - - virtual void Fill (const Standard_Integer theCol, - const Standard_Integer theRow, - const Standard_Integer thePicked) Standard_OVERRIDE - { - if (thePicked < 1 - || thePicked > myMainSel->NbPicked()) - { - myImage->SetPixelColor (theCol, theRow, Quantity_Color (Quantity_NOC_BLACK)); - return; - } - - Standard_Integer aSelectionMode = -1; - const Handle(SelectMgr_SelectableObject)& aSelectable = myMainSel->Picked (thePicked)->Selectable(); - const Handle(Select3D_SensitiveEntity)& anEntity = myMainSel->PickedEntity (thePicked); - for (SelectMgr_SequenceOfSelection::Iterator aSelIter (aSelectable->Selections()); aSelIter.More(); aSelIter.Next()) - { - const Handle(SelectMgr_Selection)& aSelection = aSelIter.Value(); - for (NCollection_Vector::Iterator aSelEntIter (aSelection->Entities()); aSelEntIter.More(); aSelEntIter.Next()) - { - if (aSelEntIter.Value()->BaseSensitive() == anEntity) - { - aSelectionMode = aSelection->Mode(); - break; - } - } - } - if (aSelectionMode == -1) - { - myImage->SetPixelColor (theCol, theRow, Quantity_Color (Quantity_NOC_BLACK)); - return; - } - - if (!myMapSelectionModeColors.IsBound (aSelectionMode)) - { - Quantity_Color aColor; - randomPastelColor (aColor); - myMapSelectionModeColors.Bind (aSelectionMode, aColor); - } - - const Quantity_Color& aColor = myMapSelectionModeColors.Find (aSelectionMode); - myImage->SetPixelColor (theCol, theRow, aColor); - } - - protected: - NCollection_DataMap myMapSelectionModeColors; - }; - - //! Help class for filling pixel with color of detected shape. - class DetectedObjectColorFiller : public BaseFiller - { - DEFINE_STANDARD_RTTI_INLINE(DetectedObjectColorFiller, BaseFiller) - public: - DetectedObjectColorFiller (Image_PixMap& thePixMap, - StdSelect_ViewerSelector3d* theSelector) - : BaseFiller (thePixMap, theSelector) {} - - virtual void Fill (const Standard_Integer theCol, - const Standard_Integer theRow, - const Standard_Integer thePicked) Standard_OVERRIDE - { - Quantity_Color aColor (Quantity_NOC_BLACK); - if (thePicked > 0 - && thePicked <= myMainSel->NbPicked()) - { - const Handle(SelectMgr_SelectableObject)& aSelectable = myMainSel->Picked (thePicked)->Selectable(); - aColor = aSelectable->Attributes()->Color(); - } - myImage->SetPixelColor (theCol, theRow, aColor); - } - }; - -} - -//======================================================================= -//function : ToPixMap -//purpose : -//======================================================================= -Standard_Boolean StdSelect_ViewerSelector3d::ToPixMap (Image_PixMap& theImage, - const Handle(V3d_View)& theView, - const StdSelect_TypeOfSelectionImage theType, - const Standard_Integer thePickedIndex) -{ - if (theImage.IsEmpty()) - { - throw Standard_ProgramError("StdSelect_ViewerSelector3d::ToPixMap() has been called with empty image"); - } - - Handle(BaseFiller) aFiller; - switch (theType) - { - case StdSelect_TypeOfSelectionImage_NormalizedDepth: - case StdSelect_TypeOfSelectionImage_NormalizedDepthInverted: - { - aFiller = new NormalizedDepthFiller (theImage, this, - theType == StdSelect_TypeOfSelectionImage_NormalizedDepthInverted); - break; - } - case StdSelect_TypeOfSelectionImage_UnnormalizedDepth: - { - aFiller = new UnnormalizedDepthFiller (theImage, this); - break; - } - case StdSelect_TypeOfSelectionImage_ColoredDetectedObject: - { - aFiller = new DetectedObjectColorFiller (theImage, this); - break; - } - case StdSelect_TypeOfSelectionImage_ColoredEntity: - { - aFiller = new GeneratedEntityColorFiller (theImage, this, mySelectableObjects); - break; - } - case StdSelect_TypeOfSelectionImage_ColoredOwner: - { - aFiller = new GeneratedOwnerColorFiller (theImage, this, mySelectableObjects); - break; - } - case StdSelect_TypeOfSelectionImage_ColoredSelectionMode: - { - aFiller = new GeneratedSelModeColorFiller (theImage, this); - break; - } - } - if (aFiller.IsNull()) - { - return Standard_False; - } - - const Standard_Integer aSizeX = static_cast (theImage.SizeX()); - const Standard_Integer aSizeY = static_cast (theImage.SizeY()); - for (Standard_Integer aRowIter = 0; aRowIter < aSizeY; ++aRowIter) - { - for (Standard_Integer aColIter = 0; aColIter < aSizeX; ++aColIter) - { - Pick (aColIter, aRowIter, theView); - aFiller->Fill (aColIter, aRowIter, thePickedIndex); - } - } - aFiller->Flush(); - return Standard_True; -} diff -Nru opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_ViewerSelector3d.hxx opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_ViewerSelector3d.hxx --- opencascade-7.4.1+dfsg1/src/StdSelect/StdSelect_ViewerSelector3d.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdSelect/StdSelect_ViewerSelector3d.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,4 @@ -// Created on: 1995-03-15 -// Created by: Robert COUBLANC -// Copyright (c) 1995-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS +// Copyright (c) 2020 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // @@ -17,99 +14,8 @@ #ifndef _StdSelect_ViewerSelector3d_HeaderFile #define _StdSelect_ViewerSelector3d_HeaderFile -#include -#include -#include +#include -#include -#include -#include -#include -#include -#include -#include +typedef SelectMgr_ViewerSelector3d StdSelect_ViewerSelector3d; -class Graphic3d_Group; -class Graphic3d_Structure; -class Graphic3d_TransformPers; -class V3d_View; -class SelectMgr_EntityOwner; -class SelectMgr_SelectableObjectSet; - - -//! Selector Usable by Viewers from V3d -class StdSelect_ViewerSelector3d : public SelectMgr_ViewerSelector -{ - -public: - - //! Constructs an empty 3D selector object. - Standard_EXPORT StdSelect_ViewerSelector3d(); - - //! Sets the pixel tolerance . - Standard_EXPORT void SetPixelTolerance (const Standard_Integer theTolerance); - - //! Returns the pixel tolerance. - Standard_Integer PixelTolerance() const { return myTolerances.Tolerance(); } - - //! Picks the sensitive entity at the pixel coordinates of - //! the mouse and . The selector looks for touched areas and owners. - Standard_EXPORT void Pick (const Standard_Integer theXPix, - const Standard_Integer theYPix, - const Handle(V3d_View)& theView); - - //! Picks the sensitive entity according to the minimum - //! and maximum pixel values , , - //! and defining a 2D area for selection in the 3D view aView. - Standard_EXPORT void Pick (const Standard_Integer theXPMin, - const Standard_Integer theYPMin, - const Standard_Integer theXPMax, - const Standard_Integer theYPMax, - const Handle(V3d_View)& theView); - - //! pick action - input pixel values for polyline selection for selection. - Standard_EXPORT void Pick (const TColgp_Array1OfPnt2d& thePolyline, - const Handle(V3d_View)& theView); - - //! Dump of detection results into image. - //! This method performs axis picking for each pixel in the image - //! and generates a color depending on picking results and selection image type. - //! @param theImage result image, should be initialized - //! @param theView 3D view defining camera position - //! @param theType type of image to define - //! @param thePickedIndex index of picked entity (1 means topmost) - Standard_EXPORT Standard_Boolean ToPixMap (Image_PixMap& theImage, - const Handle(V3d_View)& theView, - const StdSelect_TypeOfSelectionImage theType, - const Standard_Integer thePickedIndex = 1); - - //! Displays sensitives in view . - Standard_EXPORT void DisplaySensitive (const Handle(V3d_View)& theView); - - Standard_EXPORT void ClearSensitive (const Handle(V3d_View)& theView); - - Standard_EXPORT void DisplaySensitive (const Handle(SelectMgr_Selection)& theSel, - const gp_Trsf& theTrsf, - const Handle(V3d_View)& theView, - const Standard_Boolean theToClearOthers = Standard_True); - - DEFINE_STANDARD_RTTIEXT(StdSelect_ViewerSelector3d,SelectMgr_ViewerSelector) - -protected: - - Standard_EXPORT void computeSensitivePrs (const Handle(Graphic3d_Structure)& theStructure, - const Handle(SelectMgr_Selection)& theSel, - const gp_Trsf& theLoc, - const Handle(Graphic3d_TransformPers)& theTrsfPers); - - //! Update z-layers order map. - Standard_EXPORT void updateZLayers (const Handle(V3d_View)& theView); - -protected: - - Graphic3d_SequenceOfStructure myStructs; -}; - -DEFINE_STANDARD_HANDLE(StdSelect_ViewerSelector3d, SelectMgr_ViewerSelector) - -#endif +#endif // _StdSelect_ViewerSelector3d_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage.cxx opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage.cxx --- opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -54,31 +54,29 @@ Handle(StdStorage_Data)& theData) { // Create a driver appropriate for the given file - PCDM_BaseDriverPointer aDriverPtr; - if (PCDM::FileDriverType(theFileName, aDriverPtr) == PCDM_TOFD_Unknown) + Handle(Storage_BaseDriver) aDriver; + if (PCDM::FileDriverType(theFileName, aDriver) == PCDM_TOFD_Unknown) return Storage_VSWrongFileDriver; - NCollection_Handle aDriver(aDriverPtr); - // Try to open the file try { OCC_CATCH_SIGNALS - PCDM_ReadWriter::Open(*aDriver, theFileName, Storage_VSRead); + PCDM_ReadWriter::Open(aDriver, theFileName, Storage_VSRead); } catch (Standard_Failure const&) { return Storage_VSOpenError; } - return Read(*aDriver, theData); + return Read(aDriver, theData); } //======================================================================= // StdStorage::Read // Reads data from a pre-opened for reading driver //======================================================================= -Storage_Error StdStorage::Read(Storage_BaseDriver& theDriver, +Storage_Error StdStorage::Read(const Handle(Storage_BaseDriver)& theDriver, Handle(StdStorage_Data)& theData) { if (theData.IsNull()) @@ -120,18 +118,18 @@ // Read and parse reference section StdObjMgt_ReadData aReadData(theDriver, aHeaderData->NumberOfObjects()); - anError = theDriver.BeginReadRefSection(); + anError = theDriver->BeginReadRefSection(); if (anError != Storage_VSOk) return anError; - Standard_Integer aNbRefs = theDriver.RefSectionSize(); + Standard_Integer aNbRefs = theDriver->RefSectionSize(); for (Standard_Integer i = 1; i <= aNbRefs; i++) { Standard_Integer aRef = 0, aType = 0; try { OCC_CATCH_SIGNALS - theDriver.ReadReferenceType(aRef, aType); + theDriver->ReadReferenceType(aRef, aType); anError = Storage_VSOk; } catch (Storage_StreamTypeMismatchError const&) @@ -145,12 +143,12 @@ aReadData.CreatePersistentObject(aRef, anInstantiators(aType)); } - anError = theDriver.EndReadRefSection(); + anError = theDriver->EndReadRefSection(); if (anError != Storage_VSOk) return anError; // Read and parse data section - anError = theDriver.BeginReadDataSection(); + anError = theDriver->BeginReadDataSection(); if (anError != Storage_VSOk) return anError; @@ -170,7 +168,7 @@ return anError; } - anError = theDriver.EndReadDataSection(); + anError = theDriver->EndReadDataSection(); if (anError != Storage_VSOk) return anError; @@ -211,7 +209,7 @@ //======================================================================= // StdStorage::Write //======================================================================= -Storage_Error StdStorage::Write(Storage_BaseDriver& theDriver, +Storage_Error StdStorage::Write(const Handle(Storage_BaseDriver)& theDriver, const Handle(StdStorage_Data)& theData) { Standard_NullObject_Raise_if(theData.IsNull(), "Null storage data"); @@ -278,24 +276,24 @@ Storage_Error anError; // Write reference section - anError = theDriver.BeginWriteRefSection(); + anError = theDriver->BeginWriteRefSection(); if (anError != Storage_VSOk) return anError; - theDriver.SetRefSectionSize(aPObjs.Length()); + theDriver->SetRefSectionSize(aPObjs.Length()); for (StdStorage_BucketIterator anIt(&aPObjs); anIt.More(); anIt.Next()) { Handle(StdObjMgt_Persistent) aPObj = anIt.Value(); if (!aPObj.IsNull()) - theDriver.WriteReferenceType(aPObj->RefNum(), aPObj->TypeNum()); + theDriver->WriteReferenceType(aPObj->RefNum(), aPObj->TypeNum()); } - anError = theDriver.EndWriteRefSection(); + anError = theDriver->EndWriteRefSection(); if (anError != Storage_VSOk) return anError; // Write data section - anError = theDriver.BeginWriteDataSection(); + anError = theDriver->BeginWriteDataSection(); if (anError != Storage_VSOk) return anError; @@ -307,7 +305,7 @@ aWriteData.WritePersistentObject(aPObj); } - anError = theDriver.EndWriteDataSection(); + anError = theDriver->EndWriteDataSection(); if (anError != Storage_VSOk) return anError; } diff -Nru opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_HeaderData.cxx opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_HeaderData.cxx --- opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_HeaderData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_HeaderData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,11 +26,11 @@ { } -Standard_Boolean StdStorage_HeaderData::Read(Storage_BaseDriver& theDriver) +Standard_Boolean StdStorage_HeaderData::Read(const Handle(Storage_BaseDriver)& theDriver) { // Check driver open mode - if (theDriver.OpenMode() != Storage_VSRead - && theDriver.OpenMode() != Storage_VSReadWrite) + if (theDriver->OpenMode() != Storage_VSRead + && theDriver->OpenMode() != Storage_VSReadWrite) { myErrorStatus = Storage_VSModeError; myErrorStatusExt = "OpenMode"; @@ -38,7 +38,7 @@ } // Read info section - myErrorStatus = theDriver.BeginReadInfoSection(); + myErrorStatus = theDriver->BeginReadInfoSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginReadInfoSection"; @@ -48,15 +48,8 @@ try { OCC_CATCH_SIGNALS - theDriver.ReadInfo(myNBObj, - myStorageVersion, - myDate, - mySchemaName, - mySchemaVersion, - myApplicationName, - myApplicationVersion, - myDataType, - myUserInfo); + theDriver->ReadInfo(myNBObj, myStorageVersion, myDate, mySchemaName, mySchemaVersion, + myApplicationName, myApplicationVersion, myDataType, myUserInfo); } catch (Storage_StreamTypeMismatchError const&) { @@ -71,7 +64,7 @@ return Standard_False; } - myErrorStatus = theDriver.EndReadInfoSection(); + myErrorStatus = theDriver->EndReadInfoSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndReadInfoSection"; @@ -79,7 +72,7 @@ } // Read comment section - myErrorStatus = theDriver.BeginReadCommentSection(); + myErrorStatus = theDriver->BeginReadCommentSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginReadCommentSection"; @@ -89,7 +82,7 @@ try { OCC_CATCH_SIGNALS - theDriver.ReadComment(myComments); + theDriver->ReadComment(myComments); } catch (Storage_StreamTypeMismatchError const&) { @@ -104,7 +97,7 @@ return Standard_False; } - myErrorStatus = theDriver.EndReadCommentSection(); + myErrorStatus = theDriver->EndReadCommentSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndReadCommentSection"; @@ -114,11 +107,11 @@ return Standard_True; } -Standard_Boolean StdStorage_HeaderData::Write(Storage_BaseDriver& theDriver) +Standard_Boolean StdStorage_HeaderData::Write(const Handle(Storage_BaseDriver)& theDriver) { // Check driver open mode - if (theDriver.OpenMode() != Storage_VSWrite - && theDriver.OpenMode() != Storage_VSReadWrite) + if (theDriver->OpenMode() != Storage_VSWrite + && theDriver->OpenMode() != Storage_VSReadWrite) { myErrorStatus = Storage_VSModeError; myErrorStatusExt = "OpenMode"; @@ -126,7 +119,7 @@ } // Write info section - myErrorStatus = theDriver.BeginWriteInfoSection(); + myErrorStatus = theDriver->BeginWriteInfoSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginWriteInfoSection"; @@ -136,15 +129,8 @@ try { OCC_CATCH_SIGNALS - theDriver.WriteInfo(myNBObj, - myStorageVersion, - myDate, - mySchemaName, - mySchemaVersion, - myApplicationName, - myApplicationVersion, - myDataType, - myUserInfo); + theDriver->WriteInfo(myNBObj, myStorageVersion, myDate, mySchemaName, mySchemaVersion, + myApplicationName, myApplicationVersion, myDataType, myUserInfo); } catch (Storage_StreamTypeMismatchError const&) { @@ -159,7 +145,7 @@ return Standard_False; } - myErrorStatus = theDriver.EndWriteInfoSection(); + myErrorStatus = theDriver->EndWriteInfoSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndWriteInfoSection"; @@ -167,7 +153,7 @@ } // Write comment section - myErrorStatus = theDriver.BeginWriteCommentSection(); + myErrorStatus = theDriver->BeginWriteCommentSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginWriteCommentSection"; @@ -177,7 +163,7 @@ try { OCC_CATCH_SIGNALS - theDriver.WriteComment(myComments); + theDriver->WriteComment(myComments); } catch (Storage_StreamTypeMismatchError const&) { @@ -192,7 +178,7 @@ return Standard_False; } - myErrorStatus = theDriver.EndWriteCommentSection(); + myErrorStatus = theDriver->EndWriteCommentSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndWriteCommentSection"; diff -Nru opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_HeaderData.hxx opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_HeaderData.hxx --- opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_HeaderData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_HeaderData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,13 +47,13 @@ //! Returns Standard_True in case of success. Otherwise, one need to get //! an error code and description using ErrorStatus and ErrorStatusExtension //! functions correspondingly. - Standard_EXPORT Standard_Boolean Read(Storage_BaseDriver& theDriver); + Standard_EXPORT Standard_Boolean Read(const Handle(Storage_BaseDriver)& theDriver); //! Writes the header data section to the container defined by theDriver. //! Returns Standard_True in case of success. Otherwise, one need to get //! an error code and description using ErrorStatus and ErrorStatusExtension //! functions correspondingly. - Standard_EXPORT Standard_Boolean Write(Storage_BaseDriver& theDriver); + Standard_EXPORT Standard_Boolean Write(const Handle(Storage_BaseDriver)& theDriver); //! Return the creation date Standard_EXPORT TCollection_AsciiString CreationDate() const; diff -Nru opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage.hxx opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage.hxx --- opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,14 +57,14 @@ //! These data are aggregated in a StdStorage_Data object which may be //! browsed in order to extract the root objects from the container. //! Note: - theData object will be created if it is null or cleared otherwise. - Standard_EXPORT static Storage_Error Read(Storage_BaseDriver& theDriver, + Standard_EXPORT static Storage_Error Read(const Handle(Storage_BaseDriver)& theDriver, Handle(StdStorage_Data)& theData); //! Writes the data aggregated in theData object into the container defined by //! theDriver. The storage format is compartible with legacy persistent one. //! Note: - theData may aggregate several root objects to be stored together. //! - createion date specified in the srorage header will be overwritten. - Standard_EXPORT static Storage_Error Write(Storage_BaseDriver& theDriver, + Standard_EXPORT static Storage_Error Write(const Handle(Storage_BaseDriver)& theDriver, const Handle(StdStorage_Data)& theData); }; diff -Nru opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_RootData.cxx opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_RootData.cxx --- opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_RootData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_RootData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,11 +28,11 @@ { } -Standard_Boolean StdStorage_RootData::Read(Storage_BaseDriver& theDriver) +Standard_Boolean StdStorage_RootData::Read(const Handle(Storage_BaseDriver)& theDriver) { // Check driver open mode - if (theDriver.OpenMode() != Storage_VSRead - && theDriver.OpenMode() != Storage_VSReadWrite) + if (theDriver->OpenMode() != Storage_VSRead + && theDriver->OpenMode() != Storage_VSReadWrite) { myErrorStatus = Storage_VSModeError; myErrorStatusExt = "OpenMode"; @@ -40,7 +40,7 @@ } // Read root section - myErrorStatus = theDriver.BeginReadRootSection(); + myErrorStatus = theDriver->BeginReadRootSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginReadRootSection"; @@ -50,13 +50,13 @@ TCollection_AsciiString aRootName, aTypeName; Standard_Integer aRef; - Standard_Integer len = theDriver.RootSectionSize(); + Standard_Integer len = theDriver->RootSectionSize(); for (Standard_Integer i = 1; i <= len; i++) { try { OCC_CATCH_SIGNALS - theDriver.ReadRoot(aRootName, aRef, aTypeName); + theDriver->ReadRoot(aRootName, aRef, aTypeName); } catch (Storage_StreamTypeMismatchError const&) { @@ -69,7 +69,7 @@ myObjects.Add(aRootName, aRoot); } - myErrorStatus = theDriver.EndReadRootSection(); + myErrorStatus = theDriver->EndReadRootSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndReadRootSection"; @@ -79,11 +79,11 @@ return Standard_True; } -Standard_Boolean StdStorage_RootData::Write(Storage_BaseDriver& theDriver) +Standard_Boolean StdStorage_RootData::Write(const Handle(Storage_BaseDriver)& theDriver) { // Check driver open mode - if (theDriver.OpenMode() != Storage_VSWrite - && theDriver.OpenMode() != Storage_VSReadWrite) + if (theDriver->OpenMode() != Storage_VSWrite + && theDriver->OpenMode() != Storage_VSReadWrite) { myErrorStatus = Storage_VSModeError; myErrorStatusExt = "OpenMode"; @@ -91,21 +91,21 @@ } // Write root section - myErrorStatus = theDriver.BeginWriteRootSection(); + myErrorStatus = theDriver->BeginWriteRootSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginWriteRootSection"; return Standard_False; } - theDriver.SetRootSectionSize(NumberOfRoots()); + theDriver->SetRootSectionSize(NumberOfRoots()); for (StdStorage_MapOfRoots::Iterator anIt(myObjects); anIt.More(); anIt.Next()) { const Handle(StdStorage_Root)& aRoot = anIt.Value(); try { OCC_CATCH_SIGNALS - theDriver.WriteRoot(aRoot->Name(), aRoot->Reference(), aRoot->Type()); + theDriver->WriteRoot(aRoot->Name(), aRoot->Reference(), aRoot->Type()); } catch (Storage_StreamTypeMismatchError const&) { @@ -115,7 +115,7 @@ } } - myErrorStatus = theDriver.EndWriteRootSection(); + myErrorStatus = theDriver->EndWriteRootSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndWriteRootSection"; diff -Nru opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_RootData.hxx opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_RootData.hxx --- opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_RootData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_RootData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -48,13 +48,13 @@ //! Returns Standard_True in case of success. Otherwise, one need to get //! an error code and description using ErrorStatus and ErrorStatusExtension //! functions correspondingly. - Standard_EXPORT Standard_Boolean Read(Storage_BaseDriver& theDriver); + Standard_EXPORT Standard_Boolean Read(const Handle(Storage_BaseDriver)& theDriver); //! Writes the root data section to the container defined by theDriver. //! Returns Standard_True in case of success. Otherwise, one need to get //! an error code and description using ErrorStatus and ErrorStatusExtension //! functions correspondingly. - Standard_EXPORT Standard_Boolean Write(Storage_BaseDriver& theDriver); + Standard_EXPORT Standard_Boolean Write(const Handle(Storage_BaseDriver)& theDriver); //! Returns the number of roots. Standard_EXPORT Standard_Integer NumberOfRoots() const; diff -Nru opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_TypeData.cxx opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_TypeData.cxx --- opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_TypeData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_TypeData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -28,11 +28,11 @@ StdDrivers::BindTypes(myMapOfPInst); } -Standard_Boolean StdStorage_TypeData::Read(Storage_BaseDriver& theDriver) +Standard_Boolean StdStorage_TypeData::Read(const Handle(Storage_BaseDriver)& theDriver) { // Check driver open mode - if (theDriver.OpenMode() != Storage_VSRead - && theDriver.OpenMode() != Storage_VSReadWrite) + if (theDriver->OpenMode() != Storage_VSRead + && theDriver->OpenMode() != Storage_VSReadWrite) { myErrorStatus = Storage_VSModeError; myErrorStatusExt = "OpenMode"; @@ -40,7 +40,7 @@ } // Read type section - myErrorStatus = theDriver.BeginReadTypeSection(); + myErrorStatus = theDriver->BeginReadTypeSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginReadTypeSection"; @@ -50,13 +50,13 @@ Standard_Integer aTypeNum; TCollection_AsciiString aTypeName; - Standard_Integer len = theDriver.TypeSectionSize(); + Standard_Integer len = theDriver->TypeSectionSize(); for (Standard_Integer i = 1; i <= len; i++) { try { OCC_CATCH_SIGNALS - theDriver.ReadTypeInformations (aTypeNum, aTypeName); + theDriver->ReadTypeInformations (aTypeNum, aTypeName); } catch (Storage_StreamTypeMismatchError const&) { @@ -68,7 +68,7 @@ myPt.Add (aTypeName, aTypeNum); } - myErrorStatus = theDriver.EndReadTypeSection(); + myErrorStatus = theDriver->EndReadTypeSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndReadTypeSection"; @@ -78,11 +78,11 @@ return Standard_True; } -Standard_Boolean StdStorage_TypeData::Write(Storage_BaseDriver& theDriver) +Standard_Boolean StdStorage_TypeData::Write(const Handle(Storage_BaseDriver)& theDriver) { // Check driver open mode - if (theDriver.OpenMode() != Storage_VSWrite - && theDriver.OpenMode() != Storage_VSReadWrite) + if (theDriver->OpenMode() != Storage_VSWrite + && theDriver->OpenMode() != Storage_VSReadWrite) { myErrorStatus = Storage_VSModeError; myErrorStatusExt = "OpenMode"; @@ -90,7 +90,7 @@ } // Write type section - myErrorStatus = theDriver.BeginWriteTypeSection(); + myErrorStatus = theDriver->BeginWriteTypeSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginWriteTypeSection"; @@ -98,13 +98,13 @@ } Standard_Integer len = NumberOfTypes(); - theDriver.SetTypeSectionSize(len); + theDriver->SetTypeSectionSize(len); for (Standard_Integer i = 1; i <= len; i++) { try { OCC_CATCH_SIGNALS - theDriver.WriteTypeInformations(i, Type(i)); + theDriver->WriteTypeInformations(i, Type(i)); } catch (Storage_StreamTypeMismatchError const&) { @@ -114,7 +114,7 @@ } } - myErrorStatus = theDriver.EndWriteTypeSection(); + myErrorStatus = theDriver->EndWriteTypeSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndWriteTypeSection"; diff -Nru opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_TypeData.hxx opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_TypeData.hxx --- opencascade-7.4.1+dfsg1/src/StdStorage/StdStorage_TypeData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StdStorage/StdStorage_TypeData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,13 +47,13 @@ //! Returns Standard_True in case of success. Otherwise, one need to get //! an error code and description using ErrorStatus and ErrorStatusExtension //! functions correspondingly. - Standard_EXPORT Standard_Boolean Read(Storage_BaseDriver& theDriver); + Standard_EXPORT Standard_Boolean Read(const Handle(Storage_BaseDriver)& theDriver); //! Writes the type data section to the container defined by theDriver. //! Returns Standard_True in case of success. Otherwise, one need to get //! an error code and description using ErrorStatus and ErrorStatusExtension //! functions correspondingly. - Standard_EXPORT Standard_Boolean Write(Storage_BaseDriver& theDriver); + Standard_EXPORT Standard_Boolean Write(const Handle(Storage_BaseDriver)& theDriver); //! Returns the number of registered types Standard_EXPORT Standard_Integer NumberOfTypes() const; diff -Nru opencascade-7.4.1+dfsg1/src/StepAP214/StepAP214_Protocol.cxx opencascade-7.5.1+dfsg1/src/StepAP214/StepAP214_Protocol.cxx --- opencascade-7.4.1+dfsg1/src/StepAP214/StepAP214_Protocol.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepAP214/StepAP214_Protocol.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -742,13 +742,18 @@ #include #include #include -#include +#include #include #include #include #include #include -#include +#include + +#include +#include +#include +#include static int THE_StepAP214_Protocol_init = 0; static Interface_DataMapOfTransientInteger types(800); @@ -1454,11 +1459,15 @@ types.Bind (STANDARD_TYPE(StepRepr_ConstructiveGeometryRepresentation), 712); types.Bind (STANDARD_TYPE(StepRepr_ConstructiveGeometryRepresentationRelationship), 713); types.Bind (STANDARD_TYPE(StepRepr_CharacterizedRepresentation), 714); - types.Bind (STANDARD_TYPE(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation), 715); + types.Bind (STANDARD_TYPE(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel), 715); types.Bind (STANDARD_TYPE(StepVisual_CameraModelD3MultiClipping), 716); types.Bind (STANDARD_TYPE(StepVisual_CameraModelD3MultiClippingIntersection), 717); types.Bind (STANDARD_TYPE(StepVisual_CameraModelD3MultiClippingUnion), 718); - types.Bind (STANDARD_TYPE(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem), 719); + types.Bind (STANDARD_TYPE(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem), 719); + types.Bind (STANDARD_TYPE(StepVisual_SurfaceStyleTransparent), 720); + types.Bind (STANDARD_TYPE(StepVisual_SurfaceStyleReflectanceAmbient), 721); + types.Bind (STANDARD_TYPE(StepVisual_SurfaceStyleRendering), 722); + types.Bind (STANDARD_TYPE(StepVisual_SurfaceStyleRenderingWithProperties), 723); } diff -Nru opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Controller.cxx opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Controller.cxx --- opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Controller.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Controller.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -69,17 +69,5 @@ Interface_Static::Init ("stepcaf", "read.stepcaf.subshapes.name", '&', "eval On"); // 1 Interface_Static::SetIVal("read.stepcaf.subshapes.name", 0); // Disabled by default - // STEP file encoding for names translation - // Note: the numbers should be consistent with Resource_FormatType enumeration - Interface_Static::Init ("step", "read.stepcaf.codepage", 'e', ""); - Interface_Static::Init ("step", "read.stepcaf.codepage", '&', "enum 0"); - Interface_Static::Init ("step", "read.stepcaf.codepage", '&', "eval SJIS"); // Resource_FormatType_SJIS - Interface_Static::Init ("step", "read.stepcaf.codepage", '&', "eval EUC"); // Resource_FormatType_EUC - Interface_Static::Init ("step", "read.stepcaf.codepage", '&', "eval ANSI"); // Resource_FormatType_ANSI - Interface_Static::Init ("step", "read.stepcaf.codepage", '&', "eval GB"); // Resource_FormatType_GB - Interface_Static::Init ("step", "read.stepcaf.codepage", '&', "eval UTF8"); // Resource_FormatType_UTF8 - Interface_Static::Init ("step", "read.stepcaf.codepage", '&', "eval SystemLocale"); // Resource_FormatType_SystemLocale - Interface_Static::SetCVal ("read.stepcaf.codepage", "UTF8"); - return Standard_True; } diff -Nru opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_GDTProperty.cxx opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_GDTProperty.cxx --- opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_GDTProperty.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_GDTProperty.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -404,13 +404,12 @@ theHolle = Standard_True; } Handle(TCollection_HAsciiString) aStr = new TCollection_HAsciiString("01"); - if(aGrade->IsSameString(aStr)) + theG = XCAFDimTolObjects_DimensionGrade_IT01; + if (!aGrade.IsNull() + && !aGrade->String().IsEqual("01") + && aGrade->IsIntegerValue()) { - theG = XCAFDimTolObjects_DimensionGrade_IT01; - } - else - { - theG = (XCAFDimTolObjects_DimensionGrade)(aGrade->IntegerValue()+1); + theG = (XCAFDimTolObjects_DimensionGrade)(aGrade->IntegerValue() + 1); } } diff -Nru opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Reader.cxx opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Reader.cxx --- opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Reader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Reader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,6 +13,7 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include @@ -23,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -44,13 +46,13 @@ #include #include #include +#include #include #include #include #include #include #include -#include #include #include #include @@ -279,7 +281,6 @@ #include #include #include -#include // skl 21.08.2003 for reading G&DT //#include @@ -319,8 +320,7 @@ //======================================================================= STEPCAFControl_Reader::STEPCAFControl_Reader() -: mySourceCodePage (Resource_FormatType_UTF8), - myColorMode(Standard_True), +: myColorMode(Standard_True), myNameMode(Standard_True), myLayerMode(Standard_True), myPropsMode(Standard_True), @@ -330,7 +330,6 @@ myViewMode(Standard_True) { STEPCAFControl_Controller::Init(); - mySourceCodePage = (Resource_FormatType )Interface_Static::IVal ("read.stepcaf.codepage"); } @@ -341,8 +340,7 @@ STEPCAFControl_Reader::STEPCAFControl_Reader(const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch) -: mySourceCodePage (Resource_FormatType_UTF8), - myColorMode(Standard_True), +: myColorMode(Standard_True), myNameMode(Standard_True), myLayerMode(Standard_True), myPropsMode(Standard_True), @@ -352,10 +350,17 @@ myViewMode(Standard_True) { STEPCAFControl_Controller::Init(); - mySourceCodePage = (Resource_FormatType )Interface_Static::IVal ("read.stepcaf.codepage"); Init(WS, scratch); } +//======================================================================= +//function : ~STEPCAFControl_Reader +//purpose : +//======================================================================= +STEPCAFControl_Reader::~STEPCAFControl_Reader() +{ + // +} //======================================================================= //function : Init @@ -376,9 +381,10 @@ //======================================================================= TCollection_ExtendedString STEPCAFControl_Reader::convertName (const TCollection_AsciiString& theName) const { - TCollection_ExtendedString aName; - Resource_Unicode::ConvertFormatToUnicode (mySourceCodePage, theName.ToCString(), aName); - return aName; + // If source code page is not a NoConversion + // the string is treated as having UTF-8 coding, + // else each character is copied to ExtCharacter. + return TCollection_ExtendedString (theName, myReader.StepModel()->SourceCodePage() != Resource_FormatType_NoConversion); } //======================================================================= @@ -408,11 +414,12 @@ //purpose : //======================================================================= -Standard_Boolean STEPCAFControl_Reader::TransferOneRoot(const Standard_Integer num, - Handle(TDocStd_Document) &doc) +Standard_Boolean STEPCAFControl_Reader::TransferOneRoot (const Standard_Integer num, + Handle(TDocStd_Document) &doc, + const Message_ProgressRange& theProgress) { TDF_LabelSequence Lseq; - return Transfer(myReader, num, doc, Lseq); + return Transfer (myReader, num, doc, Lseq, Standard_False, theProgress); } @@ -421,10 +428,11 @@ //purpose : //======================================================================= -Standard_Boolean STEPCAFControl_Reader::Transfer(Handle(TDocStd_Document) &doc) +Standard_Boolean STEPCAFControl_Reader::Transfer (Handle(TDocStd_Document) &doc, + const Message_ProgressRange& theProgress) { TDF_LabelSequence Lseq; - return Transfer(myReader, 0, doc, Lseq); + return Transfer (myReader, 0, doc, Lseq, Standard_False, theProgress); } @@ -433,11 +441,15 @@ //purpose : //======================================================================= -Standard_Boolean STEPCAFControl_Reader::Perform(const Standard_CString filename, - Handle(TDocStd_Document) &doc) +Standard_Boolean STEPCAFControl_Reader::Perform (const Standard_CString filename, + Handle(TDocStd_Document) &doc, + const Message_ProgressRange& theProgress) { - if (ReadFile(filename) != IFSelect_RetDone) return Standard_False; - return Transfer(doc); + if (ReadFile (filename) != IFSelect_RetDone) + { + return Standard_False; + } + return Transfer (doc, theProgress); } @@ -446,11 +458,15 @@ //purpose : //======================================================================= -Standard_Boolean STEPCAFControl_Reader::Perform(const TCollection_AsciiString &filename, - Handle(TDocStd_Document) &doc) +Standard_Boolean STEPCAFControl_Reader::Perform (const TCollection_AsciiString &filename, + Handle(TDocStd_Document) &doc, + const Message_ProgressRange& theProgress) { - if (ReadFile(filename.ToCString()) != IFSelect_RetDone) return Standard_False; - return Transfer(doc); + if ( ReadFile (filename.ToCString()) != IFSelect_RetDone) + { + return Standard_False; + } + return Transfer (doc, theProgress); } @@ -525,25 +541,34 @@ //purpose : basic working method //======================================================================= -Standard_Boolean STEPCAFControl_Reader::Transfer(STEPControl_Reader &reader, - const Standard_Integer nroot, - Handle(TDocStd_Document) &doc, - TDF_LabelSequence &Lseq, - const Standard_Boolean asOne) +Standard_Boolean STEPCAFControl_Reader::Transfer (STEPControl_Reader &reader, + const Standard_Integer nroot, + Handle(TDocStd_Document) &doc, + TDF_LabelSequence &Lseq, + const Standard_Boolean asOne, + const Message_ProgressRange& theProgress) { reader.ClearShapes(); Standard_Integer i; // Read all shapes Standard_Integer num = reader.NbRootsForTransfer(); - if (num <= 0) return Standard_False; + if (num <=0) return Standard_False; + + Message_ProgressScope aPSRoot (theProgress, NULL, 2); + if (nroot) { if (nroot > num) return Standard_False; - reader.TransferOneRoot(nroot); + reader.TransferOneRoot (nroot, aPSRoot.Next()); } else { - for (i = 1; i <= num; i++) reader.TransferOneRoot(i); + Message_ProgressScope aPS (aPSRoot.Next(), NULL, num); + for (i = 1; i <= num && aPS.More(); i++) + reader.TransferOneRoot (i, aPS.Next()); } + if (aPSRoot.UserBreak()) + return Standard_False; + num = reader.NbShapes(); if (num <= 0) return Standard_False; @@ -595,8 +620,10 @@ } } - // get directory name of the main file + // get file name and directory name of the main file OSD_Path mainfile(reader.WS()->LoadedFile()); + TCollection_AsciiString aMainName; + aMainName = mainfile.Name() + mainfile.Extension(); mainfile.SetName(""); mainfile.SetExtension(""); TCollection_AsciiString dpath; @@ -606,7 +633,10 @@ // and fill map SDR -> extern file STEPConstruct_ExternRefs ExtRefs(reader.WS()); ExtRefs.LoadExternRefs(); - for (i = 1; i <= ExtRefs.NbExternRefs(); i++) { + Message_ProgressScope aPSE (aPSRoot.Next(), NULL, ExtRefs.NbExternRefs()); + for (i = 1; i <= ExtRefs.NbExternRefs() && aPSE.More(); i++) + { + Message_ProgressRange aRange = aPSE.Next(); // check extern ref format Handle(TCollection_HAsciiString) format = ExtRefs.Format(i); if (!format.IsNull()) { @@ -643,6 +673,13 @@ TCollection_AsciiString fullname = OSD_Path::AbsolutePath(dpath, filename); if (fullname.Length() <= 0) fullname = filename; + // check for not the same file + TCollection_AsciiString aMainFullName = OSD_Path::AbsolutePath(dpath, aMainName); + if (TCollection_AsciiString::IsSameString(aMainFullName,fullname,Standard_False)) { + TP->AddWarning(ExtRefs.DocFile(i), "External reference file is the same main file"); + continue; // not a valid extern ref + } + /* char fullname[1024]; char *mainfile = reader.WS()->LoadedFile(); @@ -660,9 +697,9 @@ if (!PDFileMap.IsBound(PD)) continue; // this PD is not concerned by current transfer // read extern file (or use existing data) and record its data - Handle(STEPCAFControl_ExternFile) EF = - ReadExternFile(filename, fullname.ToCString(), doc); - PDFileMap.Bind(PD, EF); + Handle(STEPCAFControl_ExternFile) EF = + ReadExternFile (filename, fullname.ToCString(), doc, aRange); + PDFileMap.Bind (PD, EF); } // and insert them to the document @@ -810,7 +847,9 @@ TDF_Label subL = AddShape(Sub0, STool, NewShapesMap, ShapePDMap, PDFileMap, ShapeLabelMap); if (!subL.IsNull()) { TDF_Label instL = STool->AddComponent(L, subL, it.Value().Location()); - ShapeLabelMap.Bind(it.Value(), instL); + if (!ShapeLabelMap.IsBound(it.Value())) { + ShapeLabelMap.Bind(it.Value(), instL); + } } } if (SHAS.Length() > 0) STool->SetExternRefs(L, SHAS); @@ -825,9 +864,10 @@ //purpose : //======================================================================= -Handle(STEPCAFControl_ExternFile) STEPCAFControl_Reader::ReadExternFile(const Standard_CString file, - const Standard_CString fullname, - Handle(TDocStd_Document)& doc) +Handle(STEPCAFControl_ExternFile) STEPCAFControl_Reader::ReadExternFile (const Standard_CString file, + const Standard_CString fullname, + Handle(TDocStd_Document)& doc, + const Message_ProgressRange& theProgress) { // if the file is already read, associate it with SDR if (myFiles.IsBound(file)) { @@ -854,8 +894,8 @@ // transfer in single-result mode if (EF->GetLoadStatus() == IFSelect_RetDone) { TDF_LabelSequence labels; - EF->SetTransferStatus(Transfer(sr, 0, doc, labels, Standard_True)); - if (labels.Length() > 0) EF->SetLabel(labels.Value(1)); + EF->SetTransferStatus (Transfer (sr, 0, doc, labels, Standard_False, theProgress)); + if (labels.Length() > 0) EF->SetLabel (labels.Value(1)); } // add read file to dictionary @@ -968,10 +1008,11 @@ break; } - Handle(StepVisual_Colour) SurfCol, BoundCol, CurveCol; + Handle(StepVisual_Colour) SurfCol, BoundCol, CurveCol, RenderCol; + Standard_Real RenderTransp; // check if it is component style Standard_Boolean IsComponent = Standard_False; - if (!Styles.GetColors(style, SurfCol, BoundCol, CurveCol, IsComponent) && IsVisible) + if (!Styles.GetColors(style, SurfCol, BoundCol, CurveCol, RenderCol, RenderTransp, IsComponent) && IsVisible) continue; // collect styled items @@ -1042,23 +1083,30 @@ if (S.IsNull()) continue; - if (!SurfCol.IsNull() || !BoundCol.IsNull() || !CurveCol.IsNull() || !IsVisible) + if (!SurfCol.IsNull() || !BoundCol.IsNull() || !CurveCol.IsNull() || !RenderCol.IsNull() || !IsVisible) { TDF_Label aL; Standard_Boolean isFound = STool->SearchUsingMap(S, aL, Standard_False, Standard_True); - if (!SurfCol.IsNull() || !BoundCol.IsNull() || !CurveCol.IsNull()) + if (!SurfCol.IsNull() || !BoundCol.IsNull() || !CurveCol.IsNull() || !RenderCol.IsNull()) { - Quantity_Color aSCol, aBCol, aCCol; - if (!SurfCol.IsNull()) + Quantity_Color aSCol, aBCol, aCCol, aRCol; + Quantity_ColorRGBA aFullSCol; + if (!SurfCol.IsNull()) { Styles.DecodeColor(SurfCol, aSCol); + aFullSCol = Quantity_ColorRGBA(aSCol); + } if (!BoundCol.IsNull()) Styles.DecodeColor(BoundCol, aBCol); if (!CurveCol.IsNull()) Styles.DecodeColor(CurveCol, aCCol); + if (!RenderCol.IsNull()) { + Styles.DecodeColor(RenderCol, aRCol); + aFullSCol = Quantity_ColorRGBA(aRCol, static_cast(1.0f - RenderTransp)); + } if (isFound) { - if (!SurfCol.IsNull()) - CTool->SetColor(aL, aSCol, XCAFDoc_ColorSurf); + if (!SurfCol.IsNull() || !RenderCol.IsNull()) + CTool->SetColor(aL, aFullSCol, XCAFDoc_ColorSurf); if (!BoundCol.IsNull()) CTool->SetColor(aL, aBCol, XCAFDoc_ColorCurv); if (!CurveCol.IsNull()) @@ -1071,8 +1119,8 @@ TDF_Label aL1; if (STool->SearchUsingMap(it.Value(), aL1, Standard_False, Standard_True)) { - if (!SurfCol.IsNull()) - CTool->SetColor(aL1, aSCol, XCAFDoc_ColorSurf); + if (!SurfCol.IsNull() || !RenderCol.IsNull()) + CTool->SetColor(aL1, aFullSCol, XCAFDoc_ColorSurf); if (!BoundCol.IsNull()) CTool->SetColor(aL1, aBCol, XCAFDoc_ColorCurv); if (!CurveCol.IsNull()) @@ -1622,10 +1670,11 @@ break; } - Handle(StepVisual_Colour) SurfCol, BoundCol, CurveCol; + Handle(StepVisual_Colour) SurfCol, BoundCol, CurveCol, RenderCol; + Standard_Real RenderTransp; // check if it is component style Standard_Boolean IsComponent = Standard_False; - if (!Styles.GetColors(style, SurfCol, BoundCol, CurveCol, IsComponent) && IsVisible) + if (!Styles.GetColors(style, SurfCol, BoundCol, CurveCol, RenderCol, RenderTransp, IsComponent) && IsVisible) continue; if (!IsComponent) continue; @@ -1660,10 +1709,18 @@ continue; } // now set the style to the SHUO main label. - if (!SurfCol.IsNull()) { + if (!SurfCol.IsNull() || !RenderCol.IsNull()) { Quantity_Color col; - Styles.DecodeColor(SurfCol, col); - CTool->SetColor(aLabelForStyle, col, XCAFDoc_ColorSurf); + Quantity_ColorRGBA colRGBA; + if (!SurfCol.IsNull()) { + Styles.DecodeColor(SurfCol, col); + colRGBA = Quantity_ColorRGBA(col); + } + if (!RenderCol.IsNull()) { + Styles.DecodeColor(RenderCol, col); + colRGBA = Quantity_ColorRGBA(col, static_cast(1.0 - RenderTransp)); + } + CTool->SetColor(aLabelForStyle, colRGBA, XCAFDoc_ColorSurf); } if (!BoundCol.IsNull()) { Quantity_Color col; @@ -2339,7 +2396,10 @@ Handle(XCAFDimTolObjects_DatumObject) aDatTargetObj = new XCAFDimTolObjects_DatumObject(); XCAFDimTolObjects_DatumTargetType aType; if (!STEPCAFControl_GDTProperty::GetDatumTargetType(aDT->Description(), aType)) + { + aTP->AddWarning(aDT, "Unknown datum target type"); continue; + } aDatTargetObj->SetDatumTargetType(aType); Standard_Boolean isValidDT = Standard_False; @@ -2385,13 +2445,16 @@ if (aType == XCAFDimTolObjects_DatumTargetType_Area) { // Area datum target - Interface_EntityIterator anIterDTF = aGraph.Shareds(aDT); + if (aRelationship.IsNull()) + continue; + Handle(StepRepr_ShapeAspect) aSA = aRelationship->RelatingShapeAspect(); + Interface_EntityIterator aSAIter = aGraph.Sharings(aSA); Handle(StepAP242_GeometricItemSpecificUsage) aGISU; - for (; anIterDTF.More() && aGISU.IsNull(); anIterDTF.Next()) { - aGISU = Handle(StepAP242_GeometricItemSpecificUsage)::DownCast(anIterDTF.Value()); + for (; aSAIter.More() && aGISU.IsNull(); aSAIter.Next()) { + aGISU = Handle(StepAP242_GeometricItemSpecificUsage)::DownCast(aSAIter.Value()); } Handle(StepRepr_RepresentationItem) anItem; - if (aGISU->NbIdentifiedItem() > 0) + if (!aGISU.IsNull() && aGISU->NbIdentifiedItem() > 0) anItem = aGISU->IdentifiedItemValue(1); if (anItem.IsNull()) continue; @@ -2464,7 +2527,7 @@ // Create datum target object if (isValidDT) { - TDF_Label aDatL = aDGTTool->AddDatum(); + TDF_Label aDatL = aDGTTool->AddDatum(theDat->Name(), theDat->Description(), theDat->Identification()); myGDTMap.Bind(aDT, aDatL); aDGTTool->Lock(aDatL); aDat = XCAFDoc_Datum::Set(aDatL); @@ -2486,7 +2549,7 @@ if (aShapeLabels.Length() > 0 || !isExistDatumTarget) { // Create object for datum - TDF_Label aDatL = aDGTTool->AddDatum(); + TDF_Label aDatL = aDGTTool->AddDatum(theDat->Name(), theDat->Description(), theDat->Identification()); myGDTMap.Bind(theDat, aDatL); // bind datum label with all reference datum_feature entities for (Standard_Integer i = 1; i <= aSAs.Length(); i++) { @@ -4354,8 +4417,10 @@ for (; anIter.More(); anIter.Next()) { if (anIter.Value()->IsKind(STANDARD_TYPE(StepRepr_MappedItem))) { Handle(StepRepr_MappedItem) anItem = Handle(StepRepr_MappedItem)::DownCast(anIter.Value()); - Handle(StepRepr_Representation) aRepr = anItem->MappingSource()->MappedRepresentation(); - collectViewShapes(theWS, theDoc, aRepr, aShapes); + if (Handle(StepRepr_Representation) aRepr = anItem->MappingSource()->MappedRepresentation()) + { + collectViewShapes(theWS, theDoc, aRepr, aShapes); + } } else if (anIter.Value()->IsKind(STANDARD_TYPE(StepVisual_AnnotationOccurrence)) || anIter.Value()->IsKind(STANDARD_TYPE(StepVisual_DraughtingCallout))) { diff -Nru opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Reader.hxx opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Reader.hxx --- opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Reader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Reader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -70,7 +70,10 @@ //! Creates a reader tool and attaches it to an already existing Session //! Clears the session if it was not yet set for STEP Standard_EXPORT STEPCAFControl_Reader(const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch = Standard_True); - + + //! Destructor. + Standard_EXPORT virtual ~STEPCAFControl_Reader(); + //! Clears the internal data structures and attaches to a new session //! Clears the session if it was not yet set for STEP Standard_EXPORT void Init (const Handle(XSControl_WorkSession)& WS, const Standard_Boolean scratch = Standard_True); @@ -86,18 +89,25 @@ //! Translates currently loaded STEP file into the document //! Returns True if succeeded, and False in case of fail //! Provided for use like single-file reader - Standard_EXPORT Standard_Boolean TransferOneRoot (const Standard_Integer num, Handle(TDocStd_Document)& doc); + Standard_EXPORT Standard_Boolean TransferOneRoot (const Standard_Integer num, + Handle(TDocStd_Document)& doc, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Translates currently loaded STEP file into the document //! Returns True if succeeded, and False in case of fail //! Provided for use like single-file reader - Standard_EXPORT Standard_Boolean Transfer (Handle(TDocStd_Document)& doc); + Standard_EXPORT Standard_Boolean Transfer (Handle(TDocStd_Document)& doc, + const Message_ProgressRange& theProgress = Message_ProgressRange()); - Standard_EXPORT Standard_Boolean Perform (const TCollection_AsciiString& filename, Handle(TDocStd_Document)& doc); + Standard_EXPORT Standard_Boolean Perform (const TCollection_AsciiString& filename, + Handle(TDocStd_Document)& doc, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Translate STEP file given by filename into the document //! Return True if succeeded, and False in case of fail - Standard_EXPORT Standard_Boolean Perform (const Standard_CString filename, Handle(TDocStd_Document)& doc); + Standard_EXPORT Standard_Boolean Perform (const Standard_CString filename, + Handle(TDocStd_Document)& doc, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Returns data on external files //! Returns Null handle if no external files are read @@ -131,13 +141,6 @@ Standard_EXPORT Standard_Boolean GetNameMode() const; - //! Return the encoding of STEP file for converting names into UNICODE. - //! Initialized from "read.stepcaf.codepage" variable by constructor, which is Resource_UTF8 by default. - Resource_FormatType SourceCodePage() const { return mySourceCodePage; } - - //! Return the encoding of STEP file for converting names into UNICODE. - void SetSourceCodePage (Resource_FormatType theCode) { mySourceCodePage = theCode; } - //! Set LayerMode for indicate read Layers or not. Standard_EXPORT void SetLayerMode (const Standard_Boolean layermode); @@ -181,7 +184,12 @@ //! Returns True if succeeded, and False in case of fail //! If asOne is True, in case of multiple results composes //! them into assembly. Fills sequence of produced labels - Standard_EXPORT Standard_Boolean Transfer (STEPControl_Reader& rd, const Standard_Integer num, Handle(TDocStd_Document)& doc, TDF_LabelSequence& Lseq, const Standard_Boolean asOne = Standard_False); + Standard_EXPORT Standard_Boolean Transfer (STEPControl_Reader& rd, + const Standard_Integer num, + Handle(TDocStd_Document)& doc, + TDF_LabelSequence& Lseq, + const Standard_Boolean asOne = Standard_False, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Add a shape to a document //! Depending on a case, this shape can be added as one, or @@ -191,7 +199,10 @@ //! Reads (or if returns already read) extern file with //! given name - Standard_EXPORT Handle(STEPCAFControl_ExternFile) ReadExternFile (const Standard_CString file, const Standard_CString fullpath, Handle(TDocStd_Document)& doc); + Standard_EXPORT Handle(STEPCAFControl_ExternFile) ReadExternFile (const Standard_CString file, + const Standard_CString fullpath, + Handle(TDocStd_Document)& doc, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Reads style assignments from STEP model and sets //! corresponding color assignments in the DECAF document @@ -283,7 +294,6 @@ STEPControl_Reader myReader; NCollection_DataMap myFiles; - Resource_FormatType mySourceCodePage; Standard_Boolean myColorMode; Standard_Boolean myNameMode; Standard_Boolean myLayerMode; diff -Nru opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Writer.cxx opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Writer.cxx --- opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Writer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Writer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,6 +20,8 @@ // (analysis of SDRs which the CDSR links should be done) // Names and validation props are supported for top-level shapes only +#include + #include #include #include @@ -27,8 +29,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -51,7 +53,6 @@ #include #include #include -#include #include #include #include @@ -60,7 +61,6 @@ #include #include #include -#include #include #include #include @@ -233,6 +233,8 @@ #include #include #include +#include +#include #include #include #include @@ -256,11 +258,10 @@ TCollection_ExtendedString name = N->Get(); if ( name.Length() <=0 ) return Standard_False; - // set name, converting it to Ascii and removing spaces - TCollection_AsciiString buf ( name, '?' ); + // set name, removing spaces around it + TCollection_AsciiString buf(name); buf.LeftAdjust(); buf.RightAdjust(); - buf.ChangeAll(' ','_'); str->AssignCat ( buf.ToCString() ); return Standard_True; } @@ -364,16 +365,17 @@ //purpose : //======================================================================= -Standard_Boolean STEPCAFControl_Writer::Transfer( const Handle(TDocStd_Document) &doc, - const STEPControl_StepModelType mode, - const Standard_CString multi ) +Standard_Boolean STEPCAFControl_Writer::Transfer(const Handle(TDocStd_Document) &doc, + const STEPControl_StepModelType mode, + const Standard_CString multi, + const Message_ProgressRange& theProgress) { Handle(XCAFDoc_ShapeTool) STool = XCAFDoc_DocumentTool::ShapeTool( doc->Main() ); if ( STool.IsNull() ) return Standard_False; TDF_LabelSequence labels; STool->GetFreeShapes ( labels ); - return Transfer ( myWriter, labels, mode, multi ); + return Transfer(myWriter, labels, mode, multi, Standard_False, theProgress); } @@ -382,13 +384,14 @@ //purpose : //======================================================================= -Standard_Boolean STEPCAFControl_Writer::Transfer( const TDF_Label& L, - const STEPControl_StepModelType mode, - const Standard_CString multi ) +Standard_Boolean STEPCAFControl_Writer::Transfer(const TDF_Label& L, + const STEPControl_StepModelType mode, + const Standard_CString multi, + const Message_ProgressRange& theProgress) { TDF_LabelSequence labels; labels.Append ( L ); - return Transfer ( myWriter, labels, mode, multi ); + return Transfer(myWriter, labels, mode, multi, Standard_False, theProgress); } //======================================================================= @@ -396,11 +399,12 @@ //purpose : //======================================================================= -Standard_Boolean STEPCAFControl_Writer::Transfer( const TDF_LabelSequence& labels, - const STEPControl_StepModelType mode, - const Standard_CString multi ) +Standard_Boolean STEPCAFControl_Writer::Transfer(const TDF_LabelSequence& labels, + const STEPControl_StepModelType mode, + const Standard_CString multi, + const Message_ProgressRange& theProgress) { - return Transfer( myWriter, labels, mode, multi ); + return Transfer(myWriter, labels, mode, multi, Standard_False, theProgress); } //======================================================================= @@ -409,9 +413,10 @@ //======================================================================= Standard_Boolean STEPCAFControl_Writer::Perform (const Handle(TDocStd_Document) &doc, - const Standard_CString filename) + const Standard_CString filename, + const Message_ProgressRange& theProgress) { - if ( ! Transfer ( doc ) ) return Standard_False; + if (!Transfer(doc, STEPControl_AsIs, 0L, theProgress)) return Standard_False; return Write ( filename ) == IFSelect_RetDone; } @@ -422,9 +427,10 @@ //======================================================================= Standard_Boolean STEPCAFControl_Writer::Perform (const Handle(TDocStd_Document) &doc, - const TCollection_AsciiString &filename) + const TCollection_AsciiString &filename, + const Message_ProgressRange& theProgress) { - if ( ! Transfer ( doc ) ) return Standard_False; + if ( ! Transfer ( doc, STEPControl_AsIs, 0L, theProgress ) ) return Standard_False; return Write ( filename.ToCString() ) == IFSelect_RetDone; } @@ -499,10 +505,11 @@ //======================================================================= Standard_Boolean STEPCAFControl_Writer::Transfer (STEPControl_Writer &writer, - const TDF_LabelSequence &labels, - const STEPControl_StepModelType mode, - const Standard_CString multi, - const Standard_Boolean isExternFile) + const TDF_LabelSequence &labels, + const STEPControl_StepModelType mode, + const Standard_CString multi, + const Standard_Boolean isExternFile, + const Message_ProgressRange& theProgress) { if ( labels.Length() <=0 ) return Standard_False; @@ -512,7 +519,10 @@ // translate free top-level shapes of the DECAF document Standard_Integer ap = Interface_Static::IVal ("write.step.schema"); TDF_LabelSequence sublabels; - for ( Standard_Integer i=1; i <= labels.Length(); i++ ) { + Message_ProgressScope aPS(theProgress, "Labels", labels.Length()); + for ( Standard_Integer i=1; i <= labels.Length() && aPS.More(); i++) + { + Message_ProgressRange aRange = aPS.Next(); TDF_Label L = labels.Value(i); if ( myLabels.IsBound ( L ) ) continue; // already processed @@ -575,12 +585,15 @@ if ( XCAFDoc_ShapeTool::IsAssembly ( L ) || XCAFDoc_ShapeTool::IsReference ( L ) ) Actor->RegisterAssembly ( shape ); - writer.Transfer(shape,mode,Standard_False); + writer.Transfer(shape, mode, Standard_False, aRange); Actor->SetStdMode ( Standard_True ); // restore default behaviour } else { // translate final solids - TopoDS_Shape Sass = TransferExternFiles ( L, mode, sublabels, multi ); + Message_ProgressScope aPS1 (aRange, NULL, 2); + TopoDS_Shape Sass = TransferExternFiles(L, mode, sublabels, multi, aPS1.Next()); + if (aPS1.UserBreak()) + return Standard_False; // translate main assembly structure /* @@ -602,11 +615,13 @@ */ Standard_Integer assemblymode = Interface_Static::IVal ("write.step.assembly"); Interface_Static::SetCVal ("write.step.assembly", "On"); - writer.Transfer ( Sass, STEPControl_AsIs ); + writer.Transfer ( Sass, STEPControl_AsIs, Standard_True, aPS1.Next()); Interface_Static::SetIVal ("write.step.assembly", assemblymode); Interface_Static::SetIVal ("write.step.schema", ap); } } + if (aPS.UserBreak()) + return Standard_False; writer.WS()->ComputeGraph(Standard_True );// added by skl 03.11.2003 since we use // writer.Transfer() wihtout compute graph @@ -715,9 +730,10 @@ //======================================================================= TopoDS_Shape STEPCAFControl_Writer::TransferExternFiles (const TDF_Label &L, - const STEPControl_StepModelType mode, - TDF_LabelSequence &labels, - const Standard_CString prefix) + const STEPControl_StepModelType mode, + TDF_LabelSequence &labels, + const Standard_CString prefix, + const Message_ProgressRange& theProgress) { // if label already translated, just return the shape if ( myLabels.IsBound ( L ) ) { @@ -762,7 +778,7 @@ Standard_Integer assemblymode = Interface_Static::IVal ("write.step.assembly"); Interface_Static::SetCVal ("write.step.assembly", "Off"); const Standard_CString multi = 0; - EF->SetTransferStatus ( Transfer ( sw, Lseq, mode, multi, Standard_True ) ); + EF->SetTransferStatus ( Transfer ( sw, Lseq, mode, multi, Standard_True, theProgress) ); Interface_Static::SetIVal ("write.step.assembly", assemblymode); myLabEF.Bind ( L, EF ); myFiles.Bind ( name->ToCString(), EF ); @@ -786,11 +802,12 @@ XCAFDoc_ShapeTool::GetComponents ( L, comp, Standard_False ); labels.Append ( aCurL ); - for ( Standard_Integer k=1; k <= comp.Length(); k++ ) { + Message_ProgressScope aPS(theProgress, NULL, comp.Length()); + for ( Standard_Integer k=1; k <= comp.Length() && aPS.More(); k++ ) { TDF_Label lab = comp(k); TDF_Label ref; if ( ! XCAFDoc_ShapeTool::GetReferredShape ( lab, ref ) ) continue; - TopoDS_Shape Scomp = TransferExternFiles ( ref, mode, labels, prefix ); + TopoDS_Shape Scomp = TransferExternFiles(ref, mode, labels, prefix, aPS.Next()); Scomp.Location ( XCAFDoc_ShapeTool::GetLocation ( lab ) ); B.Add ( C, Scomp ); } @@ -1060,13 +1077,17 @@ XCAFPrs_Style own = settings.FindFromKey(S); if ( !own.IsVisible() ) style.SetVisibility ( Standard_False ); if ( own.IsSetColorCurv() ) style.SetColorCurv ( own.GetColorCurv() ); - if ( own.IsSetColorSurf() ) style.SetColorSurf ( own.GetColorSurf() ); + if ( own.IsSetColorSurf() ) style.SetColorSurf ( own.GetColorSurfRGBA() ); } // translate colors to STEP Handle(StepVisual_Colour) surfColor, curvColor; - if ( style.IsSetColorSurf() ) - surfColor = Styles.EncodeColor(style.GetColorSurf(),DPDCs,ColRGBs); + Standard_Real RenderTransp = 0.0; + if ( style.IsSetColorSurf() ) { + Quantity_ColorRGBA sCol = style.GetColorSurfRGBA(); + RenderTransp = 1.0 - sCol.Alpha(); + surfColor = Styles.EncodeColor(sCol.GetRGB(),DPDCs,ColRGBs); + } if ( style.IsSetColorCurv() ) curvColor = Styles.EncodeColor(style.GetColorCurv(),DPDCs,ColRGBs); @@ -1094,12 +1115,12 @@ Handle(StepRepr_RepresentationItem)::DownCast(seqRI(i)); Handle(StepVisual_PresentationStyleAssignment) PSA; if ( style.IsVisible() || !surfColor.IsNull() || !curvColor.IsNull() ) { - PSA = Styles.MakeColorPSA ( item, surfColor, curvColor, isComponent ); + PSA = Styles.MakeColorPSA ( item, surfColor, curvColor, surfColor, RenderTransp, isComponent ); } else { // default white color - surfColor = Styles.EncodeColor(Quantity_Color(1,1,1,Quantity_TOC_RGB),DPDCs,ColRGBs); - PSA = Styles.MakeColorPSA ( item, surfColor, curvColor, isComponent ); + surfColor = Styles.EncodeColor(Quantity_Color(Quantity_NOC_WHITE),DPDCs,ColRGBs); + PSA = Styles.MakeColorPSA ( item, surfColor, curvColor, surfColor, 0.0, isComponent ); if ( isComponent ) setDefaultInstanceColor( override, PSA); @@ -1163,6 +1184,7 @@ // Iterate on shapes in the document Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool( labels(1) ); + Handle(XCAFDoc_VisMaterialTool) aMatTool = XCAFDoc_DocumentTool::VisMaterialTool( labels(1) ); if ( CTool.IsNull() ) return Standard_False; STEPConstruct_Styles Styles ( WS ); @@ -1216,7 +1238,7 @@ for ( Standard_Integer j = 1; j <= seq.Length(); j++ ) { TDF_Label lab = seq.Value(j); XCAFPrs_Style style; - Quantity_Color C; + Quantity_ColorRGBA C; if ( lab == L ) { // check for invisible status of object on label if ( !CTool->IsVisible( lab ) ) { @@ -1225,13 +1247,23 @@ } } if ( CTool->GetColor ( lab, XCAFDoc_ColorGen, C ) ) { - style.SetColorCurv ( C ); + style.SetColorCurv ( C.GetRGB() ); style.SetColorSurf ( C ); } if ( CTool->GetColor ( lab, XCAFDoc_ColorSurf, C ) ) style.SetColorSurf ( C ); if ( CTool->GetColor ( lab, XCAFDoc_ColorCurv, C ) ) - style.SetColorCurv ( C ); + style.SetColorCurv ( C.GetRGB() ); + if (!style.IsSetColorSurf()) + { + Handle(XCAFDoc_VisMaterial) aVisMat = aMatTool->GetShapeMaterial (lab); + if (!aVisMat.IsNull() + && !aVisMat->IsEmpty()) + { + // only color can be stored in STEP + style.SetColorSurf (aVisMat->BaseColor()); + } + } // commented, cause we are need to take reference from // if ( isComponent && lab == L && !isVisible) @@ -1607,7 +1639,7 @@ Standard_Integer nb = FindEntities ( FP, oneShape, Loc, seqRI ); if ( nb <=0 ) - FP->Messenger() << "Warning: Cannot find RI for " << oneShape.TShape()->DynamicType()->Name() << Message_EndLine; + FP->Messenger()->SendInfo() << "Warning: Cannot find RI for " << oneShape.TShape()->DynamicType()->Name() << std::endl; } if ( seqRI.Length() <= 0 ) continue; @@ -1619,7 +1651,7 @@ if (L.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr)) { descr = new TCollection_HAsciiString ("invisible"); #ifdef OCCT_DEBUG - FP->Messenger() << "\tLayer \"" << hName->String().ToCString() << "\" is invisible"<String().ToCString() << "\" is invisible"<GetColor ( aSHUOlab, XCAFDoc_ColorCurv, C ) ) SHUOstyle.SetColorCurv ( C ); + if (!SHUOstyle.IsSetColorSurf()) + { + Handle(XCAFDoc_VisMaterial) aVisMat = theMatTool->GetShapeMaterial (aSHUOlab); + if (!aVisMat.IsNull() + && !aVisMat->IsEmpty()) + { + // only color can be stored in STEP + SHUOstyle.SetColorSurf (aVisMat->BaseColor()); + } + } } if ( !SHUOstyle.IsSetColorCurv() && !SHUOstyle.IsSetColorSurf() && @@ -1848,8 +1891,12 @@ STEPConstruct_Styles Styles( WS ); // translate colors to STEP Handle(StepVisual_Colour) surfColor, curvColor; - if ( style.IsSetColorSurf() ) - surfColor = Styles.EncodeColor ( style.GetColorSurf() ); + Standard_Real RenderTransp = 0.0; + if ( style.IsSetColorSurf() ) { + Quantity_ColorRGBA sCol = style.GetColorSurfRGBA(); + RenderTransp = 1.0 - sCol.Alpha(); + surfColor = Styles.EncodeColor ( sCol.GetRGB() ); + } if ( style.IsSetColorCurv() ) curvColor = Styles.EncodeColor ( style.GetColorCurv() ); Standard_Boolean isComponent = Standard_True;// cause need to get PSBC @@ -1857,11 +1904,11 @@ // set default color for invisible SHUO. Standard_Boolean isSetDefaultColor = Standard_False; if (surfColor.IsNull() && curvColor.IsNull() && !style.IsVisible() ) { - surfColor = Styles.EncodeColor ( Quantity_Color( 1, 1, 1, Quantity_TOC_RGB ) ); + surfColor = Styles.EncodeColor ( Quantity_Color(Quantity_NOC_WHITE) ); isSetDefaultColor = Standard_True; } Handle(StepVisual_PresentationStyleAssignment) PSA = - Styles.MakeColorPSA ( item, surfColor, curvColor, isComponent ); + Styles.MakeColorPSA ( item, surfColor, curvColor, surfColor, RenderTransp, isComponent ); Handle(StepVisual_StyledItem) override; //null styled item // find the repr item of the shape @@ -1892,7 +1939,7 @@ FindEntities ( FP, Sh, L, seqRI ); #ifdef OCCT_DEBUG if ( seqRI.Length() <=0 ) - FP->Messenger() << "Warning: Cannot find RI for " << Sh.TShape()->DynamicType()->Name() << Message_EndLine; + std::cout << "Warning: Cannot find RI for " << Sh.TShape()->DynamicType()->Name() << std::endl; #endif item = Handle(StepRepr_RepresentationItem)::DownCast(seqRI(1)); //get overridden styled item @@ -1977,6 +2024,7 @@ // get working data Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool( labels(1) ); + Handle(XCAFDoc_VisMaterialTool) aMatTool = XCAFDoc_DocumentTool::VisMaterialTool( labels(1) ); if (CTool.IsNull() ) return Standard_False; // map of transfered SHUO @@ -2009,7 +2057,7 @@ aMapOfMainSHUO.Add( aSHUO ); // check if it is styled SHUO XCAFPrs_Style SHUOstyle; - if ( !getSHUOstyle ( aSHUOlab, CTool, SHUOstyle ) ) { + if ( !getSHUOstyle ( aSHUOlab, CTool, aMatTool, SHUOstyle ) ) { #ifdef OCCT_DEBUG std::cout << "Warning: " << __FILE__ << ": do not store SHUO without any style to the STEP model" << std::endl; #endif @@ -2320,7 +2368,7 @@ TColStd_SequenceOfTransient aSeqRI; FindEntities( FP, theShape, aLoc, aSeqRI ); if ( aSeqRI.Length() <= 0 ) { - FP->Messenger() << "Warning: Cannot find RI for "<DynamicType()->Name()<Messenger()->SendInfo() << "Warning: Cannot find RI for "<DynamicType()->Name()<Get(), '?')); + aName = new TCollection_HAsciiString(TCollection_AsciiString(aNameAttr->Get())); Standard_Integer aFirstSpace = aName->Search(" "); if (aFirstSpace != -1) aName = aName->SubString(aFirstSpace + 1, aName->Length()); @@ -2492,7 +2540,7 @@ aShape = XCAFDoc_ShapeTool::GetShape(theShapeL.Value(i)); FindEntities(FP, aShape, aLoc, aSeqRI); if (aSeqRI.Length() <= 0) { - FP->Messenger() << "Warning: Cannot find RI for " << aShape.TShape()->DynamicType()->Name() << Message_EndLine; + FP->Messenger()->SendInfo() << "Warning: Cannot find RI for " << aShape.TShape()->DynamicType()->Name() << std::endl; continue; } anEnt = aSeqRI.Value(1); @@ -3404,7 +3452,7 @@ TColStd_SequenceOfTransient seqRI; FindEntities( FP, aShape, Loc, seqRI ); if ( seqRI.Length() <= 0 ) { - FP->Messenger() << "Warning: Cannot find RI for "<DynamicType()->Name()<Messenger()->SendInfo() << "Warning: Cannot find RI for "<DynamicType()->Name()<GetName(); - Handle(TCollection_HAsciiString) aDescription = DatumAttr->GetDescription(); Handle(TCollection_HAsciiString) anIdentification = DatumAttr->GetIdentification(); + Handle(TCollection_HAsciiString) aDescription = DatumAttr->GetDescription(); + if (aDescription.IsNull()) + { + aDescription = new TCollection_HAsciiString(); + } Handle(StepDimTol_DatumFeature) DF = new StepDimTol_DatumFeature; Handle(StepDimTol_Datum) aDatum = new StepDimTol_Datum; DF->Init(aName, new TCollection_HAsciiString, PDS, StepData_LTrue); @@ -3486,7 +3538,7 @@ TColStd_SequenceOfTransient seqRI; FindEntities( FP, aShape, Loc, seqRI ); if ( seqRI.Length() <= 0 ) { - FP->Messenger() << "Warning: Cannot find RI for "<DynamicType()->Name()<Messenger()->SendInfo() << "Warning: Cannot find RI for "<DynamicType()->Name()<SetValue(1, aStyles.MakeColorPSA(anItem, aCurvColor, aCurvColor)); + myGDTPrsCurveStyle->SetValue(1, aStyles.MakeColorPSA(anItem, aCurvColor, aCurvColor, aCurvColor, 0.0)); Interface_EntityIterator aModelIter = aModel->Entities(); for (; aModelIter.More() && myGDTCommonPDS.IsNull(); aModelIter.Next()) myGDTCommonPDS = Handle(StepRepr_ProductDefinitionShape)::DownCast(aModelIter.Value()); diff -Nru opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Writer.hxx opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Writer.hxx --- opencascade-7.4.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Writer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPCAFControl/STEPCAFControl_Writer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,19 +16,15 @@ #ifndef _STEPCAFControl_Writer_HeaderFile #define _STEPCAFControl_Writer_HeaderFile -#include +#include +#include +#include #include #include - -#include #include #include -#include -#include -#include -#include #include -#include +#include #include #include #include @@ -36,14 +32,13 @@ #include #include #include +#include #include class XSControl_WorkSession; class TDocStd_Document; -class TDF_Label; class TCollection_AsciiString; class STEPCAFControl_ExternFile; -class STEPControl_Writer; class TopoDS_Shape; //! Provides a tool to write DECAF document to the @@ -86,16 +81,26 @@ //! mode (with external refs), and string pointed by //! gives prefix for names of extern files (can be empty string) //! Returns True if translation is OK - Standard_EXPORT Standard_Boolean Transfer (const Handle(TDocStd_Document)& doc, const STEPControl_StepModelType mode = STEPControl_AsIs, const Standard_CString multi = 0); + Standard_EXPORT Standard_Boolean Transfer (const Handle(TDocStd_Document)& doc, + const STEPControl_StepModelType mode = STEPControl_AsIs, + const Standard_CString multi = 0, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Method to transfer part of the document specified by label - Standard_EXPORT Standard_Boolean Transfer (const TDF_Label& L, const STEPControl_StepModelType mode = STEPControl_AsIs, const Standard_CString multi = 0 ); - - Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc, const TCollection_AsciiString& filename); + Standard_EXPORT Standard_Boolean Transfer (const TDF_Label& L, + const STEPControl_StepModelType mode = STEPControl_AsIs, + const Standard_CString multi = 0, + const Message_ProgressRange& theProgress = Message_ProgressRange()); + + Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc, + const TCollection_AsciiString& filename, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfers a document and writes it to a STEP file //! Returns True if translation is OK - Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc, const Standard_CString filename); + Standard_EXPORT Standard_Boolean Perform (const Handle(TDocStd_Document)& doc, + const Standard_CString filename, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Returns data on external files //! Returns Null handle if no external files are read @@ -155,12 +160,20 @@ protected: //! Mehod to writing sequence of root assemblies or part of the file specified by use by one label - Standard_EXPORT Standard_Boolean Transfer (const TDF_LabelSequence& L, const STEPControl_StepModelType mode = STEPControl_AsIs, const Standard_CString multi = 0); + Standard_EXPORT Standard_Boolean Transfer (const TDF_LabelSequence& L, + const STEPControl_StepModelType mode = STEPControl_AsIs, + const Standard_CString multi = 0, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Transfers labels to a STEP model //! Returns True if translation is OK //! isExternFile setting from TransferExternFiles method - Standard_EXPORT Standard_Boolean Transfer (STEPControl_Writer& wr, const TDF_LabelSequence& labels, const STEPControl_StepModelType mode = STEPControl_AsIs, const Standard_CString multi = 0, const Standard_Boolean isExternFile = Standard_False) ; + Standard_EXPORT Standard_Boolean Transfer (STEPControl_Writer& wr, + const TDF_LabelSequence& labels, + const STEPControl_StepModelType mode = STEPControl_AsIs, + const Standard_CString multi = 0, + const Standard_Boolean isExternFile = Standard_False, + const Message_ProgressRange& theProgress = Message_ProgressRange()) ; //! Parses assembly structure of label L, writes all the simple //! shapes each to its own file named by name of its label plus @@ -168,7 +181,11 @@ //! Returns shape representing that assembly structure //! in the form of nested empty compounds (and a sequence of //! labels which are newly written nodes of this assembly) - Standard_EXPORT TopoDS_Shape TransferExternFiles (const TDF_Label& L, const STEPControl_StepModelType mode, TDF_LabelSequence& Lseq, const Standard_CString prefix = ""); + Standard_EXPORT TopoDS_Shape TransferExternFiles (const TDF_Label& L, + const STEPControl_StepModelType mode, + TDF_LabelSequence& Lseq, + const Standard_CString prefix = "", + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Write external references to STEP Standard_EXPORT Standard_Boolean WriteExternRefs (const Handle(XSControl_WorkSession)& WS, const TDF_LabelSequence& labels) const; diff -Nru opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_ExternRefs.cxx opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_ExternRefs.cxx --- opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_ExternRefs.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_ExternRefs.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -469,6 +469,16 @@ } //======================================================================= +//function : DocFile +//purpose : +//======================================================================= + +Handle(StepBasic_DocumentFile) STEPConstruct_ExternRefs::DocFile(const Standard_Integer num) const +{ + return Handle(StepBasic_DocumentFile)::DownCast(myDocFiles.Value(num)); +} + +//======================================================================= //function : Format //purpose : //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_ExternRefs.hxx opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_ExternRefs.hxx --- opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_ExternRefs.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_ExternRefs.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -82,6 +82,11 @@ //! is not associated to SDR in a proper way. Standard_EXPORT Handle(StepBasic_ProductDefinition) ProdDef (const Standard_Integer num) const; + //! Returns DocumentFile to which numth extern reference + //! is associated. + //! Returns Null if cannot be detected. + Standard_EXPORT Handle(StepBasic_DocumentFile) DocFile (const Standard_Integer num) const; + //! Returns format identification string for the extern document //! Returns Null handle if format is not defined Standard_EXPORT Handle(TCollection_HAsciiString) Format (const Standard_Integer num) const; diff -Nru opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_Styles.cxx opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_Styles.cxx --- opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_Styles.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_Styles.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -66,6 +66,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -429,6 +433,8 @@ Handle(StepVisual_PresentationStyleAssignment) STEPConstruct_Styles::MakeColorPSA (const Handle(StepRepr_RepresentationItem) &/*item*/, const Handle(StepVisual_Colour) &SurfCol, const Handle(StepVisual_Colour) &CurveCol, + const Handle(StepVisual_Colour) &RenderCol, + const Standard_Real RenderTransp, const Standard_Boolean isForNAUO) const { Handle(StepVisual_PresentationStyleAssignment) PSA; @@ -456,10 +462,29 @@ StepVisual_SurfaceStyleElementSelect SES; SES.SetValue ( SSFA ); - Handle(StepVisual_HArray1OfSurfaceStyleElementSelect) SSESs = - new StepVisual_HArray1OfSurfaceStyleElementSelect ( 1, 1 ); + Handle(StepVisual_HArray1OfSurfaceStyleElementSelect) SSESs; + if (RenderTransp == 0.0) { + SSESs = new StepVisual_HArray1OfSurfaceStyleElementSelect ( 1, 1 ); + } else { + Handle(StepVisual_SurfaceStyleTransparent) SST = new StepVisual_SurfaceStyleTransparent; + SST->Init(RenderTransp); + StepVisual_RenderingPropertiesSelect RPS; + RPS.SetValue(SST); + Handle(StepVisual_HArray1OfRenderingPropertiesSelect) HARP = new + StepVisual_HArray1OfRenderingPropertiesSelect (1, 1); + HARP->SetValue(1, RPS); + Handle(StepVisual_SurfaceStyleRenderingWithProperties) SSRWP = new StepVisual_SurfaceStyleRenderingWithProperties; + + SSRWP->Init(StepVisual_ssmNormalShading, RenderCol, HARP); + + StepVisual_SurfaceStyleElementSelect SESR; + SESR.SetValue (SSRWP); + + SSESs = new StepVisual_HArray1OfSurfaceStyleElementSelect ( 1, 2 ); + SSESs->SetValue ( 2, SESR ); + } SSESs->SetValue ( 1, SES ); - + Handle(TCollection_HAsciiString) SSSName = new TCollection_HAsciiString ( "" ); Handle(StepVisual_SurfaceSideStyle) SSS = new StepVisual_SurfaceSideStyle; SSS->Init ( SSSName, SSESs ); @@ -533,7 +558,7 @@ DownCast(myMapOfStyles.FindFromKey(Col)); } else { - PSA = MakeColorPSA ( item, Col, Col ); + PSA = MakeColorPSA ( item, Col, Col, Col, 0.0 ); myMapOfStyles.Add(Col,PSA); } return PSA; @@ -549,11 +574,14 @@ Handle(StepVisual_Colour) &SurfCol, Handle(StepVisual_Colour) &BoundCol, Handle(StepVisual_Colour) &CurveCol, + Handle(StepVisual_Colour) &RenderCol, + Standard_Real& RenderTransp, Standard_Boolean& IsComponent) const { SurfCol.Nullify(); BoundCol.Nullify(); CurveCol.Nullify(); + RenderCol.Nullify(); // parse on styles for(Standard_Integer j=1; j<=style->NbStyles(); j++ ) { @@ -591,6 +619,27 @@ if ( ! CS.IsNull() ) BoundCol = CS->CurveColour(); continue; } + // try rendering color and transparency + Handle(StepVisual_SurfaceStyleRendering) SSR = SSES.SurfaceStyleRendering(); + if (!SSR.IsNull()) { + RenderCol = SSR->SurfaceColour(); + RenderTransp = 0.0; + Handle(StepVisual_SurfaceStyleRenderingWithProperties) SSRWP = + Handle(StepVisual_SurfaceStyleRenderingWithProperties)::DownCast(SSR); + if (!SSRWP.IsNull()) { + Handle(StepVisual_HArray1OfRenderingPropertiesSelect) HARP = SSRWP->Properties(); + if (!HARP.IsNull()) + { + for (Standard_Integer aPropIndex = 1; aPropIndex <= HARP->Length(); ++aPropIndex) { + Handle(StepVisual_SurfaceStyleTransparent) SST = HARP->Value(aPropIndex).SurfaceStyleTransparent(); + if (!SST.IsNull()) { + RenderTransp = SST->Transparency(); + } + } + } + } + } + } continue; } @@ -600,7 +649,7 @@ if ( ! CS.IsNull() ) CurveCol = CS->CurveColour(); } } - return ! SurfCol.IsNull() || ! BoundCol.IsNull() || ! CurveCol.IsNull(); + return ! SurfCol.IsNull() || ! BoundCol.IsNull() || ! CurveCol.IsNull() || ! RenderCol.IsNull(); } @@ -632,7 +681,9 @@ else { Handle(TCollection_HAsciiString) ColName = new TCollection_HAsciiString ( "" ); Handle(StepVisual_ColourRgb) ColRGB = new StepVisual_ColourRgb; - ColRGB->Init ( ColName, C.Red(), C.Green(), C.Blue() ); + NCollection_Vec3 aColor_sRGB; + C.Values (aColor_sRGB.r(), aColor_sRGB.g(), aColor_sRGB.b(), Quantity_TOC_sRGB); + ColRGB->Init ( ColName, aColor_sRGB.r(), aColor_sRGB.g(), aColor_sRGB.b() ); return ColRGB; } } @@ -675,14 +726,18 @@ } else { Handle(StepVisual_ColourRgb) ColRGB; - gp_Pnt P(C.Red(),C.Green(),C.Blue()); + gp_Pnt P; + C.Values (P.ChangeCoord().ChangeData()[0], + P.ChangeCoord().ChangeData()[1], + P.ChangeCoord().ChangeData()[2], + Quantity_TOC_sRGB); if(ColRGBs.IsBound(P)) { ColRGB = Handle(StepVisual_ColourRgb)::DownCast(ColRGBs.Find(P)); if(!ColRGB.IsNull()) return ColRGB; } Handle(TCollection_HAsciiString) ColName = new TCollection_HAsciiString ( "" ); ColRGB = new StepVisual_ColourRgb; - ColRGB->Init ( ColName, C.Red(), C.Green(), C.Blue() ); + ColRGB->Init ( ColName, P.Coord (1), P.Coord (2), P.Coord (3) ); ColRGBs.Bind(P,ColRGB); return ColRGB; } @@ -703,10 +758,10 @@ if(normGreen()) norm = rgb->Green(); if(normBlue()) norm = rgb->Blue(); Col.SetValues(rgb->Red()/norm, rgb->Green()/norm, - rgb->Blue()/norm, Quantity_TOC_RGB); + rgb->Blue()/norm, Quantity_TOC_sRGB); } else - Col.SetValues(rgb->Red(), rgb->Green(), rgb->Blue(), Quantity_TOC_RGB); + Col.SetValues(rgb->Red(), rgb->Green(), rgb->Blue(), Quantity_TOC_sRGB); return Standard_True; } else if ( Colour->IsKind (STANDARD_TYPE(StepVisual_PreDefinedColour)) ) { diff -Nru opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_Styles.hxx opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_Styles.hxx --- opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_Styles.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_Styles.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -117,7 +117,7 @@ //! Create a PresentationStyleAssignment entity which defines //! two colors (for filling surfaces and curves) //! if isForNAUO true then returns PresentationStyleByContext - Standard_EXPORT Handle(StepVisual_PresentationStyleAssignment) MakeColorPSA (const Handle(StepRepr_RepresentationItem)& item, const Handle(StepVisual_Colour)& SurfCol, const Handle(StepVisual_Colour)& CurveCol, const Standard_Boolean isForNAUO = Standard_False) const; + Standard_EXPORT Handle(StepVisual_PresentationStyleAssignment) MakeColorPSA (const Handle(StepRepr_RepresentationItem)& item, const Handle(StepVisual_Colour)& SurfCol, const Handle(StepVisual_Colour)& CurveCol, const Handle(StepVisual_Colour) &RenderCol, const Standard_Real RenderTransp, const Standard_Boolean isForNAUO = Standard_False) const; //! Returns a PresentationStyleAssignment entity which defines //! surface and curve colors as Col. This PSA is either created @@ -129,7 +129,7 @@ //! For each type of color supported, result can be either //! NULL if it is not defined by that style, or last //! definition (if they are 1 or more) - Standard_EXPORT Standard_Boolean GetColors (const Handle(StepVisual_StyledItem)& style, Handle(StepVisual_Colour)& SurfCol, Handle(StepVisual_Colour)& BoundCol, Handle(StepVisual_Colour)& CurveCol, Standard_Boolean& IsComponent) const; + Standard_EXPORT Standard_Boolean GetColors (const Handle(StepVisual_StyledItem)& style, Handle(StepVisual_Colour)& SurfCol, Handle(StepVisual_Colour)& BoundCol, Handle(StepVisual_Colour)& CurveCol, Handle(StepVisual_Colour)& RenderCol, Standard_Real& RenderTransp, Standard_Boolean& IsComponent) const; //! Create STEP color entity by given Quantity_Color //! The analysis is performed for whether the color corresponds to diff -Nru opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_UnitContext.cxx opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_UnitContext.cxx --- opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_UnitContext.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_UnitContext.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -55,7 +55,13 @@ //function : STEPConstruct_UnitContext //purpose : //======================================================================= -STEPConstruct_UnitContext::STEPConstruct_UnitContext() : done(Standard_False) +STEPConstruct_UnitContext::STEPConstruct_UnitContext() +: done(Standard_False), + lengthFactor(0.0), + planeAngleFactor(0.0), + solidAngleFactor(0.0), + areaFactor(0.0), + volumeFactor(0.0) { lengthDone = planeAngleDone = solidAngleDone = hasUncertainty = areaDone = volumeDone = Standard_False; diff -Nru opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_ValidationProps.cxx opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_ValidationProps.cxx --- opencascade-7.4.1+dfsg1/src/STEPConstruct/STEPConstruct_ValidationProps.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPConstruct/STEPConstruct_ValidationProps.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -530,10 +530,10 @@ Handle(StepRepr_ShapeAspect) SA = CD.ShapeAspect(); if ( SA.IsNull() ) { #ifdef OCCT_DEBUG - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout << "Error: Cannot find target entity (SA) for geometric_validation_property "; - Model()->PrintLabel ( PD, sout ); - sout << Message_EndLine; + Model()->PrintLabel (PD, sout); + sout << std::endl; #endif return ProdDef; } @@ -555,10 +555,10 @@ } #ifdef OCCT_DEBUG if ( ProdDef.IsNull() ) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout << "Error: Cannot find target entity (SDR) for geometric_validation_property "; - Model()->PrintLabel ( PD, sout ); - sout << Message_EndLine; + Model()->PrintLabel (PD, sout); + sout << std::endl; } #endif return ProdDef; @@ -608,10 +608,10 @@ //} #ifdef OCCT_DEBUG if ( S.IsNull() ) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout << "Warning: Entity "; - Model()->PrintLabel ( ProdDef, sout ); - sout << " is not mapped to shape" << Message_EndLine; + Model()->PrintLabel (ProdDef, sout); + sout << " is not mapped to shape" << std::endl; } #endif return S; @@ -707,7 +707,7 @@ #ifdef OCCT_DEBUG std::cout << "Warning: Point " << Model()->StringLabel ( P )->String() << " is not valid for centroid" << std::endl; #endif - return Standard_False;; + return Standard_False; } gp_Pnt pos ( P->CoordinatesValue(1), P->CoordinatesValue(2), P->CoordinatesValue(3) ); diff -Nru opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_ActorRead.cxx opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_ActorRead.cxx --- opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_ActorRead.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_ActorRead.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include @@ -112,6 +112,9 @@ #include #include #include +#include +#include +#include IMPLEMENT_STANDARD_RTTIEXT(STEPControl_ActorRead,Transfer_ActorOfTransientProcess) @@ -200,8 +203,11 @@ // Purpose : Empty constructor // ============================================================================ -STEPControl_ActorRead::STEPControl_ActorRead() {} - +STEPControl_ActorRead::STEPControl_ActorRead() +: myPrecision(0.0), + myMaxTol(0.0) +{ +} // ============================================================================ // Method : STEPControl_ActorRead::Recognize // Purpose : tells if an entity is valid for transfer by this Actor @@ -272,7 +278,8 @@ Handle(Transfer_Binder) STEPControl_ActorRead::Transfer (const Handle(Standard_Transient)& start, - const Handle(Transfer_TransientProcess)& TP) + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { // [BEGIN] Get version of preprocessor (to detect I-Deas case) (ssv; 23.11.2010) Handle(StepData_StepModel) aStepModel = Handle(StepData_StepModel)::DownCast ( TP->Model() ); @@ -296,7 +303,8 @@ } } // [END] Get version of preprocessor (to detect I-Deas case) (ssv; 23.11.2010) - return TransferShape (start,TP); + Standard_Boolean aTrsfUse = (Interface_Static::IVal("read.step.root.transformation") == 0); + return TransferShape(start, TP, Standard_True, aTrsfUse, theProgress); } @@ -462,11 +470,14 @@ //function : TransferEntity //purpose : //======================================================================= - Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Handle(StepBasic_ProductDefinition)& PD, - const Handle(Transfer_TransientProcess)& TP) + Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity + (const Handle(StepBasic_ProductDefinition)& PD, + const Handle(Transfer_TransientProcess)& TP, + const Standard_Boolean theUseTrsf, + const Message_ProgressRange& theProgress) { - Handle(Message_Messenger) sout = TP->Messenger(); + Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo(); Handle(TransferBRep_ShapeBinder) shbinder; TopoDS_Compound Cund; @@ -504,6 +515,7 @@ // should be taken into account Standard_Integer readSRR = Interface_Static::IVal("read.step.shape.relationship"); + Standard_Integer readConstructiveGeomRR = Interface_Static::IVal("read.step.constructivegeom.relationship"); // Flag indicating whether SDRs associated with the product`s main SDR // by SAs (which correspond to hybrid model representation in AP203 before 1998) // should be taken into account @@ -532,20 +544,21 @@ return shbinder; // common progress indicator for translation of own shapes and sub-assemblies - Message_ProgressSentry PS ( TP->GetProgress(), "Part", 0, nbEnt, 1 ); + Message_ProgressScope PS(theProgress, "Part", nbEnt); Standard_Integer nbComponents=0, nbShapes=0; // translate sub-assemblies - for ( Standard_Integer nbNauo =1; nbNauo <= listNAUO->Length() && PS.More(); nbNauo++, PS.Next()) { + for ( Standard_Integer nbNauo =1; nbNauo <= listNAUO->Length() && PS.More(); nbNauo++) { Handle(StepRepr_NextAssemblyUsageOccurrence) NAUO = Handle(StepRepr_NextAssemblyUsageOccurrence)::DownCast(listNAUO->Value(nbNauo)); #ifdef TRANSLOG if (TP->TraceLevel() > 1) - sout<<" -- Actor : Ent.n0 "<Model()->Number(PD)<<" -> Shared Ent.no"<Model()->Number(NAUO)<Model()->Number(PD)<<" -> Shared Ent.no"<Model()->Number(NAUO)<IsBound(NAUO)) binder = TransferEntity(NAUO,TP); + Message_ProgressRange aRange = PS.Next(); + if (!TP->IsBound(NAUO)) binder = TransferEntity(NAUO,TP, aRange); else binder = TP->Find(NAUO); TopoDS_Shape theResult = TransferBRep::ShapeResult (binder); @@ -569,18 +582,24 @@ } // translate shapes assigned directly - for(Standard_Integer i=1; i <= listSDR->Length() && PS.More(); i++, PS.Next()) { + for(Standard_Integer i=1; i <= listSDR->Length() && PS.More(); i++) { Handle(StepShape_ShapeDefinitionRepresentation) sdr = Handle(StepShape_ShapeDefinitionRepresentation)::DownCast(listSDR->Value(i)); Handle(StepShape_ShapeRepresentation) rep = Handle(StepShape_ShapeRepresentation)::DownCast(sdr->UsedRepresentation()); if ( rep.IsNull() ) continue; + Message_ProgressScope aPS1(PS.Next(), NULL, 2); + // translate SDR representation Standard_Boolean isBound = Standard_True; + // SKL for bug 29068: transformation need to applied only for "main" ShapeDefinitionRepresentation. + // Part of listSDR given by ShapeAspect must be ignored because all needed transformations will be + // applied during its transfer. Therefore flag for using Trsf must be updated. + Standard_Boolean useTrsf = theUseTrsf && (i <= nbNotAspect); Handle(Transfer_Binder) binder = TP->Find(rep); if (binder.IsNull()) - binder = TransferEntity(rep,TP,isBound); + binder = TransferEntity(rep, TP, isBound, useTrsf, aPS1.Next()); // if SDR is obtained from ShapeAspect and representation items have already been tramnslated, // this means that that ShapeAspect is used to refer to sub-shape of the main shape @@ -620,16 +639,35 @@ Handle(Standard_Type) tSRR = STANDARD_TYPE(StepRepr_ShapeRepresentationRelationship); for (subs1.Start(); subs1.More(); subs1.Next()) { Handle(Standard_Transient) anitem = subs1.Value(); - if ( anitem->DynamicType() != tSRR ) continue; - Handle(StepRepr_ShapeRepresentationRelationship) SRR = - Handle(StepRepr_ShapeRepresentationRelationship)::DownCast(anitem); - Standard_Integer nbrep = ( rep == SRR->Rep1() ? 2 : 1 ); - binder = TransferEntity(SRR, TP, nbrep); - if ( ! binder.IsNull() ) { - theResult = TransferBRep::ShapeResult (binder); - Result1 = theResult; - B.Add(Cund, theResult); - nbShapes++; + if( !anitem->IsKind(STANDARD_TYPE(StepRepr_RepresentationRelationship))) + continue; + if (anitem->DynamicType() == tSRR) + { + Handle(StepRepr_ShapeRepresentationRelationship) SRR = + Handle(StepRepr_ShapeRepresentationRelationship)::DownCast(anitem); + Standard_Integer nbrep = (rep == SRR->Rep1() ? 2 : 1); + // SKL for bug 29068: parameter useTrsf is used because if root entity has connection with other + // by ShapeRepresentationRelationship then result after such transferring need to transform also. + // This case is from test "bugs modalg_7 bug30196" + binder = TransferEntity(SRR, TP, nbrep, useTrsf, aPS1.Next()); + if (! binder.IsNull()) { + theResult = TransferBRep::ShapeResult (binder); + Result1 = theResult; + B.Add(Cund, theResult); + nbShapes++; + } + } + else if(readConstructiveGeomRR && anitem->IsKind(STANDARD_TYPE(StepRepr_ConstructiveGeometryRepresentationRelationship))) + { + Handle(StepRepr_ConstructiveGeometryRepresentationRelationship) aCSRR = + Handle(StepRepr_ConstructiveGeometryRepresentationRelationship)::DownCast(anitem); + binder = TransferEntity(aCSRR, TP); + if (! binder.IsNull()) + { + Result1 = TransferBRep::ShapeResult (binder); + B.Add(Cund, Result1); + nbShapes++; + } } } } @@ -655,10 +693,12 @@ //purpose : //======================================================================= -Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Handle(StepRepr_NextAssemblyUsageOccurrence)& NAUO , - const Handle(Transfer_TransientProcess)& TP) +Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity + (const Handle(StepRepr_NextAssemblyUsageOccurrence)& NAUO, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { - Handle(TransferBRep_ShapeBinder) shbinder; + Handle(TransferBRep_ShapeBinder) shbinder; Handle(StepBasic_ProductDefinition) PD; const Interface_Graph& graph = TP->Graph(); gp_Trsf Trsf; @@ -713,10 +753,11 @@ shbinder.Nullify(); if(IsDepend) { - + Message_ProgressScope aPS(theProgress, NULL, 2); + if(!PD.IsNull()) { binder = TP->Find(PD); - if ( binder.IsNull() ) binder = TransferEntity(PD,TP); + if (binder.IsNull()) binder = TransferEntity(PD, TP, Standard_False, aPS.Next()); theResult = TransferBRep::ShapeResult(binder); if (!theResult.IsNull()) { if (iatrsf) { @@ -730,7 +771,7 @@ if ( theResult.IsNull() && !SRR.IsNull() ) { binder = TP->Find(SRR); if ( binder.IsNull() ) { - binder = TransferEntity(SRR,TP); + binder = TransferEntity(SRR, TP, 0, Standard_False, aPS.Next()); theResult = TransferBRep::ShapeResult (binder); if (!theResult.IsNull()) shbinder = new TransferBRep_ShapeBinder (theResult); @@ -747,9 +788,12 @@ //purpose : //======================================================================= -Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Handle(StepShape_ShapeRepresentation)& sr, - const Handle(Transfer_TransientProcess)& TP, - Standard_Boolean& isBound) +Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity( + const Handle(StepShape_ShapeRepresentation)& sr, + const Handle(Transfer_TransientProcess)& TP, + Standard_Boolean& isBound, + const Standard_Boolean theUseTrsf, + const Message_ProgressRange& theProgress) { NM_DETECTED = Standard_False; Handle(TransferBRep_ShapeBinder) shbinder; @@ -759,10 +803,10 @@ Standard_Integer nb = sr->NbItems(); // Used in XSAlgo::AlgoContainer()->ProcessShape (ssv; 13.11.2010) Standard_Integer nbTPitems = TP->NbMapped(); - Handle(Message_Messenger) sout = TP->Messenger(); + Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo(); #ifdef TRANSLOG if (TP->TraceLevel() > 2) - sout<<" -- Actor : case ShapeRepr. NbItems="<TraceLevel() > 2) - sout<<" -- Actor, shape_representation.item n0. "<ItemsValue(i); + if(anitem.IsNull()) + continue; + if (theUseTrsf) + { + if (anitem->IsKind(STANDARD_TYPE(StepGeom_Axis2Placement3d))) + { + const Interface_Graph& graph = TP->Graph(); + Interface_EntityIterator subs3 = graph.Sharings(anitem); + for (subs3.Start(); subs3.More(); subs3.Next()) { + Handle(StepRepr_ItemDefinedTransformation) IDT = + Handle(StepRepr_ItemDefinedTransformation)::DownCast(subs3.Value()); + if (!IDT.IsNull()) + { + // current Axis2Placement is used for related ShapeRepresentation => ignore it + break; + } + } + if (!subs3.More()) + { + Handle(StepGeom_Axis2Placement3d) aCS = Handle(StepGeom_Axis2Placement3d)::DownCast(anitem); + Handle(Geom_Axis2Placement) aTargAP = StepToGeom::MakeAxis2Placement(aCS); + if (!aTargAP.IsNull()) + { + const gp_Ax3 ax3Orig(gp_Pnt(0., 0., 0), gp_Vec(0., 0., 1.), gp_Vec(1., 0., 0.)); + const gp_Ax3 ax3Targ(aTargAP->Ax2()); + if (ax3Targ.Location().SquareDistance(ax3Orig.Location()) < Precision::SquareConfusion() && + ax3Targ.Direction().IsEqual(ax3Orig.Direction(), Precision::Angular()) && + ax3Targ.XDirection().IsEqual(ax3Orig.XDirection(), Precision::Angular())) + { + continue; + } + aTrsf.SetTransformation(ax3Targ, ax3Orig); + } + continue; + } + } + } Handle(Transfer_Binder) binder; if (!TP->IsBound(anitem)) { - binder = TransferShape(anitem, TP, isManifold); + binder = TransferShape(anitem, TP, isManifold, Standard_False, aRange); } else { isBound = Standard_True; @@ -832,6 +916,7 @@ // [BEGIN] Proceed with non-manifold topology (ssv; 12.11.2010) if (!isManifold) { + Message_ProgressScope aPS1 (aPSRoot.Next(), "Process", 1); Handle(Standard_Transient) info; // IMPORTANT: any fixing on non-manifold topology must be done after the shape is transferred from STEP @@ -839,7 +924,7 @@ XSAlgo::AlgoContainer()->ProcessShape( comp, myPrecision, myMaxTol, "read.step.resource.name", "read.step.sequence", info, - TP->GetProgress(), Standard_True); + aPS1.Next(), Standard_True); XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems); if (fixedResult.ShapeType() == TopAbs_COMPOUND) @@ -910,9 +995,28 @@ } // Bind the resulting shape - if (nsh == 0) shbinder.Nullify(); - else if (nsh == 1) shbinder = new TransferBRep_ShapeBinder (OneResult); - else shbinder = new TransferBRep_ShapeBinder (comp); + //if (nsh == 0) shbinder.Nullify(); + //else if (nsh == 1) shbinder = new TransferBRep_ShapeBinder (OneResult); + //else shbinder = new TransferBRep_ShapeBinder (comp); + if (nsh == 0) shbinder.Nullify(); + else if (nsh == 1) + { + if (aTrsf.Form() != gp_Identity) + { + TopLoc_Location aLoc(aTrsf); + OneResult.Move(aLoc); + } + shbinder = new TransferBRep_ShapeBinder(OneResult); + } + else + { + if (aTrsf.Form() != gp_Identity) + { + TopLoc_Location aLoc(aTrsf); + comp.Move(aLoc); + } + shbinder = new TransferBRep_ShapeBinder(comp); + } PrepareUnits ( oldSRContext, TP ); //:S4136 TP->Bind(sr, shbinder); @@ -930,8 +1034,10 @@ //purpose : //======================================================================= -Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Handle(StepShape_ContextDependentShapeRepresentation)& CDSR, - const Handle(Transfer_TransientProcess)& TP) +Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity + (const Handle(StepShape_ContextDependentShapeRepresentation)& CDSR, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { Handle(TransferBRep_ShapeBinder) shbinder; //:j2: treat SRRs here in order to compare them with NAUO @@ -952,9 +1058,9 @@ Handle(Transfer_Binder) binder; Standard_Boolean isBound = Standard_False; - if (!TP->IsBound(rep)) binder = TransferEntity(rep,TP,isBound); - else binder = TP->Find(rep); - theResult = TransferBRep::ShapeResult (binder); + if (!TP->IsBound(rep)) binder = TransferEntity(rep, TP, isBound, Standard_False, theProgress); + else binder = TP->Find(rep); + theResult = TransferBRep::ShapeResult(binder); if ( ! theResult.IsNull() ) { if ( iatrsf ) { @@ -973,9 +1079,12 @@ //purpose : //======================================================================= -Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Handle(StepRepr_ShapeRepresentationRelationship)& und, - const Handle(Transfer_TransientProcess)& TP, - const Standard_Integer nbrep) +Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity( + const Handle(StepRepr_ShapeRepresentationRelationship)& und, + const Handle(Transfer_TransientProcess)& TP, + const Standard_Integer nbrep, + const Standard_Boolean theUseTrsf, + const Message_ProgressRange& theProgress) { // REPRESENTATION_RELATIONSHIP et la famille Handle(TransferBRep_ShapeBinder) shbinder; @@ -995,8 +1104,10 @@ Standard_Boolean iatrsf = ComputeSRRWT ( und, TP, Trsf ); // Transfert : que faut-il prendre au juste ? - - for (Standard_Integer i = 1; i <= 2; i ++) { + Message_ProgressScope aPS(theProgress, NULL, 2); + for (Standard_Integer i = 1; i <= 2 && aPS.More(); i++) + { + Message_ProgressRange aRange = aPS.Next(); if(nbrep && nbrep != i) continue; Handle(StepRepr_Representation) anitemt; @@ -1005,8 +1116,8 @@ Handle(StepShape_ShapeRepresentation) anitem = Handle(StepShape_ShapeRepresentation)::DownCast(anitemt); Handle(Transfer_Binder) binder; Standard_Boolean isBound = Standard_False; - if (!TP->IsBound(anitem)) binder = TransferEntity(anitem,TP,isBound); - else binder = TP->Find(anitem); + if (!TP->IsBound(anitem)) binder = TransferEntity(anitem, TP, isBound, theUseTrsf, aRange); + else binder = TP->Find(anitem); TopoDS_Shape theResult = TransferBRep::ShapeResult (binder); if (!theResult.IsNull()) { OneResult = theResult; @@ -1032,6 +1143,70 @@ } //======================================================================= +//function : TransferEntity +//purpose : +//======================================================================= + + +Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity( + const Handle(StepRepr_ConstructiveGeometryRepresentationRelationship)& theCGRR, + const Handle(Transfer_TransientProcess)& theTP) +{ + + Handle(TransferBRep_ShapeBinder) shbinder; + if (theCGRR.IsNull()) + return shbinder; + Standard_Boolean resetUnits = Standard_False; + Handle(StepRepr_Representation) oldSRContext = mySRContext; + TopoDS_Compound aComp; + BRep_Builder aB; + aB.MakeCompound(aComp); + for (Standard_Integer i = 1; i <= 2; i ++) + { + Handle(StepRepr_ConstructiveGeometryRepresentation) aCRepr = + Handle(StepRepr_ConstructiveGeometryRepresentation)::DownCast(i == 1 ? theCGRR->Rep1() : theCGRR->Rep2() ); + if(aCRepr.IsNull()) + continue; + if(mySRContext.IsNull() || aCRepr->ContextOfItems() != mySRContext->ContextOfItems()) + { + PrepareUnits(aCRepr,theTP); + resetUnits = Standard_True; + } + Standard_Integer j =1; + Handle(StepGeom_Axis2Placement3d) anAxis1; + Handle(StepGeom_Axis2Placement3d) anAxis2; + for( ; j <= aCRepr->NbItems(); j++ ) + { + Handle(StepRepr_RepresentationItem) anItem = aCRepr->ItemsValue(j); + Handle(StepGeom_Axis2Placement3d) aStepAxis = + Handle(StepGeom_Axis2Placement3d)::DownCast(anItem); + if( !aStepAxis.IsNull()) + { + Handle(Geom_Axis2Placement) anAxis = StepToGeom::MakeAxis2Placement (aStepAxis); + if(anAxis.IsNull()) + continue; + Handle(Geom_Plane) aPlane = new Geom_Plane(gp_Ax3(anAxis->Ax2())); + TopoDS_Face aPlaneFace; + aB.MakeFace(aPlaneFace, aPlane, Precision::Confusion()); + Handle(TransferBRep_ShapeBinder) axisbinder = new TransferBRep_ShapeBinder (aPlaneFace); + theTP->Bind(aStepAxis, axisbinder); + aB.Add(aComp, aPlaneFace); + } + } + + } + shbinder = new TransferBRep_ShapeBinder (aComp); + mySRContext = oldSRContext; + if(oldSRContext.IsNull() || resetUnits) + PrepareUnits(oldSRContext,theTP); + + theTP->Bind(theCGRR, shbinder); + + return shbinder; + +} + +//======================================================================= //function : IsNeedRepresentation //purpose : //======================================================================= @@ -1076,10 +1251,12 @@ //purpose : //======================================================================= -Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::OldWay(const Handle(Standard_Transient)& start, - const Handle(Transfer_TransientProcess)& TP) +Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::OldWay + (const Handle(Standard_Transient)& start, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { - Handle(Message_Messenger) sout = TP->Messenger(); + Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo(); const Interface_Graph& graph = TP->Graph(); Handle(TransferBRep_ShapeBinder) shbinder; DeclareAndCast(StepShape_ShapeDefinitionRepresentation,sdr,start); @@ -1097,12 +1274,22 @@ } } + Message_ProgressScope aPSRoot(theProgress, NULL, 2); + #ifdef TRANSLOG if (TP->TraceLevel() > 2) - sout<<" -- Actor : case shape_definition_representation."<Find(rep); - if (binder.IsNull()) binder = TP->Transferring(rep); + { + Message_ProgressRange aRange = aPSRoot.Next(); + if (binder.IsNull()) + { + binder = TP->Transferring(rep, aRange); + } + } + if (aPSRoot.UserBreak()) + return shbinder; //:j2 if (!binder.IsNull()) return binder; // SDR designant des CDSR (lien implicite, via la UsedRepr) @@ -1132,18 +1319,20 @@ Handle(Standard_Type) tSRR = STANDARD_TYPE(StepRepr_ShapeRepresentationRelationship); Standard_Integer nbitem=0; for (subs.Start();subs.More();subs.Next()) nbitem++; - Message_ProgressSentry PS ( TP->GetProgress(), "Sub", 0, nbitem, 1 ); - for (subs.Start(); subs.More() && PS.More(); subs.Next() ,PS.Next()) { + Message_ProgressScope PS (aPSRoot.Next(), "Sub", nbitem); + for (subs.Start(); subs.More() && PS.More(); subs.Next()) + { + Message_ProgressRange aRange = PS.Next(); Handle(Standard_Transient) anitem = subs.Value(); if ( anitem->DynamicType() != tCDSR && anitem->DynamicType() != tSRR ) continue; // DeclareAndCast(StepShape_ContextDependentShapeRepresentation,anitem,subs.Value()); // if (anitem.IsNull()) continue; #ifdef TRANSLOG if (TP->TraceLevel() > 1) - sout<<" -- Actor : Ent.n0 "<Model()->Number(start)<<" -> Shared Ent.no"<Model()->Number(anitem)<Model()->Number(start)<<" -> Shared Ent.no"<Model()->Number(anitem)<IsBound(anitem)) binder = TP->Transferring(anitem); + if (!TP->IsBound(anitem)) binder = TP->Transferring(anitem, aRange); else binder = TP->Find(anitem); TopoDS_Shape theResult = TransferBRep::ShapeResult (binder); if (!theResult.IsNull()) { @@ -1165,11 +1354,13 @@ //purpose : //======================================================================= -Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Handle(StepGeom_GeometricRepresentationItem)& start, - const Handle(Transfer_TransientProcess)& TP, - const Standard_Boolean isManifold) +Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity + (const Handle(StepGeom_GeometricRepresentationItem)& start, + const Handle(Transfer_TransientProcess)& TP, + const Standard_Boolean isManifold, + const Message_ProgressRange& theProgress) { - Handle(Message_Messenger) sout = TP->Messenger(); + Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo(); Handle(TransferBRep_ShapeBinder) shbinder; Standard_Boolean found = Standard_False; StepToTopoDS_Builder myShapeBuilder; @@ -1179,7 +1370,7 @@ OSD_Timer chrono; if (TP->TraceLevel() > 2) sout << "Begin transfer STEP -> CASCADE, Type " - << start->DynamicType()->Name() << Message_EndLine; + << start->DynamicType()->Name() << std::endl; chrono.Start(); #endif @@ -1197,50 +1388,52 @@ myShapeBuilder.SetMaxTol(myMaxTol); // Start progress scope (no need to check if progress exists -- it is safe) - Message_ProgressSentry aPSentry(TP->GetProgress(), "Transfer stage", 0, 2, 1); + Message_ProgressScope aPS(theProgress, "Transfer stage", isManifold ? 2 : 1); try { OCC_CATCH_SIGNALS - if (start->IsKind(STANDARD_TYPE(StepShape_FacetedBrep))) { - myShapeBuilder.Init(GetCasted(StepShape_FacetedBrep, start), TP); - found = Standard_True; - } - else if (start->IsKind(STANDARD_TYPE(StepShape_BrepWithVoids))) { - myShapeBuilder.Init(GetCasted(StepShape_BrepWithVoids, start), TP); - found = Standard_True; - } - else if (start->IsKind(STANDARD_TYPE(StepShape_ManifoldSolidBrep))) { - myShapeBuilder.Init(GetCasted(StepShape_ManifoldSolidBrep, start), TP); - found = Standard_True; - } - else if (start->IsKind(STANDARD_TYPE(StepShape_ShellBasedSurfaceModel))) { - myShapeBuilder.Init(GetCasted(StepShape_ShellBasedSurfaceModel, start), TP, myNMTool); - found = Standard_True; - } - else if (start->IsKind(STANDARD_TYPE(StepShape_FacetedBrepAndBrepWithVoids))) { - myShapeBuilder.Init(GetCasted(StepShape_FacetedBrepAndBrepWithVoids, start), TP); - found = Standard_True; - } - else if (start->IsKind(STANDARD_TYPE(StepShape_GeometricSet))) { - myShapeBuilder.Init(GetCasted(StepShape_GeometricSet, start), TP, this, isManifold); - found = Standard_True; - } - else if (start->IsKind(STANDARD_TYPE(StepShape_EdgeBasedWireframeModel))) { - myShapeBuilder.Init(GetCasted(StepShape_EdgeBasedWireframeModel, start), TP); - found = Standard_True; - } - else if (start->IsKind(STANDARD_TYPE(StepShape_FaceBasedSurfaceModel))) { - myShapeBuilder.Init(GetCasted(StepShape_FaceBasedSurfaceModel, start), TP); - found = Standard_True; + Message_ProgressRange aRange = aPS.Next(); + if (start->IsKind(STANDARD_TYPE(StepShape_FacetedBrep))) { + myShapeBuilder.Init(GetCasted(StepShape_FacetedBrep, start), TP, aRange); + found = Standard_True; + } + else if (start->IsKind(STANDARD_TYPE(StepShape_BrepWithVoids))) { + myShapeBuilder.Init(GetCasted(StepShape_BrepWithVoids, start), TP, aRange); + found = Standard_True; + } + else if (start->IsKind(STANDARD_TYPE(StepShape_ManifoldSolidBrep))) { + myShapeBuilder.Init(GetCasted(StepShape_ManifoldSolidBrep, start), TP, aRange); + found = Standard_True; + } + else if (start->IsKind(STANDARD_TYPE(StepShape_ShellBasedSurfaceModel))) { + myShapeBuilder.Init(GetCasted(StepShape_ShellBasedSurfaceModel, start), TP, myNMTool, aRange); + found = Standard_True; + } + else if (start->IsKind(STANDARD_TYPE(StepShape_FacetedBrepAndBrepWithVoids))) { + myShapeBuilder.Init(GetCasted(StepShape_FacetedBrepAndBrepWithVoids, start), TP, aRange); + found = Standard_True; + } + else if (start->IsKind(STANDARD_TYPE(StepShape_GeometricSet))) { + myShapeBuilder.Init(GetCasted(StepShape_GeometricSet, start), TP, this, isManifold, aRange); + found = Standard_True; + } + else if (start->IsKind(STANDARD_TYPE(StepShape_EdgeBasedWireframeModel))) { + myShapeBuilder.Init(GetCasted(StepShape_EdgeBasedWireframeModel, start), TP); + found = Standard_True; + } + else if (start->IsKind(STANDARD_TYPE(StepShape_FaceBasedSurfaceModel))) { + myShapeBuilder.Init(GetCasted(StepShape_FaceBasedSurfaceModel, start), TP); + found = Standard_True; + } } -} catch(Standard_Failure const&) { TP->AddFail(start,"Exeption is raised. Entity was not translated."); TP->Bind(start, shbinder); return shbinder; } - aPSentry.Next(); + if (aPS.UserBreak()) + return shbinder; if (found && myShapeBuilder.IsDone()) { mappedShape = myShapeBuilder.Value(); @@ -1251,7 +1444,7 @@ XSAlgo::AlgoContainer()->ProcessShape( mappedShape, myPrecision, myMaxTol, "read.step.resource.name", "read.step.sequence", info, - TP->GetProgress() ); + aPS.Next()); XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems); } } @@ -1260,7 +1453,7 @@ #ifdef TRANSLOG chrono.Stop(); if (TP->TraceLevel() > 2) - sout<<"End transfer STEP -> CASCADE :" << (found ? "OK" : " : no result")< CASCADE :" << (found ? "OK" : " : no result")<TraceLevel() > 2) chrono.Show(); #endif @@ -1276,8 +1469,10 @@ //purpose : //======================================================================= -Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Handle(StepRepr_MappedItem)& mapit, - const Handle(Transfer_TransientProcess)& TP) +Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity + (const Handle(StepRepr_MappedItem)& mapit, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { Handle(TransferBRep_ShapeBinder) shbinder; @@ -1294,7 +1489,7 @@ DownCast(mapit->MappingSource()->MappedRepresentation()); Standard_Boolean isBound = Standard_False; Handle(Transfer_Binder) binder = TP->Find(maprep); - if (binder.IsNull()) binder = TransferEntity(maprep,TP,isBound); + if (binder.IsNull()) binder = TransferEntity(maprep,TP,isBound, Standard_False, theProgress); shbinder = Handle(TransferBRep_ShapeBinder)::DownCast(binder); if (shbinder.IsNull()) TP->AddWarning(mapit,"No Shape Produced"); else { @@ -1340,8 +1535,10 @@ //purpose : //======================================================================= -Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity(const Handle(StepShape_FaceSurface)& fs, - const Handle(Transfer_TransientProcess)& TP) +Handle(TransferBRep_ShapeBinder) STEPControl_ActorRead::TransferEntity + (const Handle(StepShape_FaceSurface)& fs, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { // Cas bien utile meme si non reconnu explicitement @@ -1381,7 +1578,7 @@ TopoDS_Shape shape = XSAlgo::AlgoContainer()->ProcessShape(S, myPrecision, myMaxTol, "read.step.resource.name", "read.step.sequence", info, - TP->GetProgress()); + theProgress); // TopoDS_Shape shape = XSAlgo::AlgoContainer()->PerformFixShape( S, TP, myPrecision, myMaxTol ); if (shape != S) sb->SetResult(shape); @@ -1408,18 +1605,21 @@ //purpose : //======================================================================= -Handle(Transfer_Binder) STEPControl_ActorRead::TransferShape(const Handle(Standard_Transient)& start, - const Handle(Transfer_TransientProcess)& TP, - const Standard_Boolean isManifold) +Handle(Transfer_Binder) STEPControl_ActorRead::TransferShape( + const Handle(Standard_Transient)& start, + const Handle(Transfer_TransientProcess)& TP, + const Standard_Boolean isManifold, + const Standard_Boolean theUseTrsf, + const Message_ProgressRange& theProgress) { if (start.IsNull()) return NullResult(); XSAlgo::AlgoContainer()->PrepareForTransfer(); - Handle(Message_Messenger) sout = TP->Messenger(); + Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo(); #ifdef TRANSLOG // POUR MISE AU POINT, a supprimer ensuite if (TP->TraceLevel() > 1) - sout<<" -- Actor : Transfer Ent.n0 "<Model()->Number(start)<<" Type "<DynamicType()->Name()<Model()->Number(start)<<" Type "<DynamicType()->Name()<IsKind(STANDARD_TYPE(StepShape_ShapeDefinitionRepresentation))) - shbinder = OldWay(start,TP); + shbinder = OldWay(start,TP, theProgress); //skl else if (start->IsKind(STANDARD_TYPE(StepBasic_ProductDefinition))) { Handle(StepBasic_ProductDefinition) PD = Handle(StepBasic_ProductDefinition)::DownCast(start); - shbinder = TransferEntity(PD, TP); + shbinder = TransferEntity(PD, TP, theUseTrsf, theProgress); } // NextAssemblyUsageOccurrence else if (start->IsKind(STANDARD_TYPE(StepRepr_NextAssemblyUsageOccurrence))) { Handle(StepRepr_NextAssemblyUsageOccurrence) NAUO = Handle(StepRepr_NextAssemblyUsageOccurrence)::DownCast(start); - shbinder = TransferEntity(NAUO, TP); + shbinder = TransferEntity(NAUO, TP, theProgress); } //end skl @@ -1452,7 +1652,7 @@ else if (start->IsKind(STANDARD_TYPE(StepShape_ShapeRepresentation))) { DeclareAndCast(StepShape_ShapeRepresentation,sr,start); Standard_Boolean isBound = Standard_False; - shbinder = TransferEntity(sr,TP,isBound); + shbinder = TransferEntity(sr,TP,isBound, Standard_False, theProgress); } // -------------------------------------------------------------- @@ -1462,29 +1662,29 @@ else if (start->IsKind(STANDARD_TYPE(StepShape_ContextDependentShapeRepresentation))) { DeclareAndCast(StepShape_ContextDependentShapeRepresentation,CDSR,start); - shbinder = TransferEntity(CDSR,TP); + shbinder = TransferEntity(CDSR,TP, theProgress); } else if (start->IsKind (STANDARD_TYPE(StepRepr_ShapeRepresentationRelationship)) ) { // REPRESENTATION_RELATIONSHIP et la famille DeclareAndCast(StepRepr_ShapeRepresentationRelationship,und,start); - shbinder = TransferEntity(und,TP); + shbinder = TransferEntity(und,TP, 0, Standard_False, theProgress); } else if (start->IsKind (STANDARD_TYPE(StepGeom_GeometricRepresentationItem)) ) { // Here starts the entity to be treated : Shape Representation Subtype // It can be also other Root entities DeclareAndCast(StepGeom_GeometricRepresentationItem,git,start); - shbinder = TransferEntity(git, TP, isManifold); + shbinder = TransferEntity(git, TP, isManifold, theProgress); } else if (start->IsKind(STANDARD_TYPE(StepRepr_MappedItem))) { DeclareAndCast(StepRepr_MappedItem,mapit,start); - shbinder= TransferEntity(mapit,TP); + shbinder= TransferEntity(mapit,TP, theProgress); } else if (start->IsKind(STANDARD_TYPE(StepShape_FaceSurface))) { DeclareAndCast(StepShape_FaceSurface,fs,start); - shbinder = TransferEntity(fs,TP); + shbinder = TransferEntity(fs,TP, theProgress); } // if (!shbinder.IsNull()) TP->Bind(start,binder); @@ -1576,7 +1776,7 @@ // Assign uncertainty #ifdef TRANSLOG if (TP->TraceLevel() > 1) - TP->Messenger() <<" Cc1ToTopoDS : Length Unit = "< #include #include +#include #include #include #include @@ -446,7 +447,8 @@ //======================================================================= Handle(Transfer_Binder) STEPControl_ActorWrite::Transfer (const Handle(Transfer_Finder)& start, - const Handle(Transfer_FinderProcess)& FP) + const Handle(Transfer_FinderProcess)& FP, + const Message_ProgressRange& theProgress) { XSAlgo::AlgoContainer()->PrepareForTransfer(); @@ -473,7 +475,7 @@ Handle(StepShape_ShapeDefinitionRepresentation) sdr = SDRTool.SDRValue(); // transfer shape - Handle(Transfer_Binder) resbind = TransferShape (mapper,sdr,FP); + Handle(Transfer_Binder) resbind = TransferShape (mapper,sdr,FP, 0L, Standard_True, theProgress); // Handle(StepShape_ShapeRepresentation) resultat; // FP->GetTypedTransient (resbind,STANDARD_TYPE(StepShape_ShapeRepresentation),resultat); @@ -607,11 +609,13 @@ } -Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape (const Handle(Transfer_Finder)& start, - const Handle(StepShape_ShapeDefinitionRepresentation)& SDR0, - const Handle(Transfer_FinderProcess)& FP, - const Handle(TopTools_HSequenceOfShape)& shapeGroup, - const Standard_Boolean isManifold) +Handle(Transfer_Binder) STEPControl_ActorWrite::TransferShape + (const Handle(Transfer_Finder)& start, + const Handle(StepShape_ShapeDefinitionRepresentation)& SDR0, + const Handle(Transfer_FinderProcess)& FP, + const Handle(TopTools_HSequenceOfShape)& shapeGroup, + const Standard_Boolean isManifold, + const Message_ProgressRange& theProgress) { STEPControl_StepModelType mymode = Mode(); Handle(TransferBRep_ShapeMapper) mapper = Handle(TransferBRep_ShapeMapper)::DownCast(start); @@ -640,7 +644,9 @@ // MODE ASSEMBLY : if Compound, (sub-)assembly if ( IsAssembly(theShape) ) - return TransferCompound(start, SDR0, FP); + return TransferCompound(start, SDR0, FP, theProgress); + + Message_ProgressScope aPSRoot(theProgress, NULL, 2); // [BEGIN] Separate manifold topology from non-manifold in group mode 0 (ssv; 18.11.2010) Standard_Boolean isNMMode = Interface_Static::IVal("write.step.nonmanifold") != 0; @@ -745,9 +751,10 @@ // Complete SDR with shape representations. // NOTE: aNMBinder is connected now with this SDR. It will be added to the resulting // binder in the end of this invocation of TransferShape - for (Standard_Integer i = 1; i <= aNMItemsNb; i++) { + Message_ProgressScope aPS (aPSRoot.Next(), NULL, aNMItemsNb); + for (Standard_Integer i = 1; i <= aNMItemsNb && aPS.More(); i++) { Handle(TransferBRep_ShapeMapper) aMapper = TransferBRep::ShapeMapper( FP, RepItemSeq->Value(i) ); - TransferShape(aMapper, sdr, FP, NonManifoldGroup, Standard_False); + TransferShape(aMapper, sdr, FP, NonManifoldGroup, Standard_False, aPS.Next()); } // Nothing else needed for pure non-manifold topology, return @@ -759,6 +766,9 @@ } // [END] Separate manifold topology from non-manifold in group mode 0 (ssv; 18.11.2010) + if (aPSRoot.UserBreak()) + return Handle(Transfer_Binder)(); + // create a list of items to translate Handle(TopTools_HSequenceOfShape) RepItemSeq = new TopTools_HSequenceOfShape(); @@ -840,7 +850,7 @@ else if (theShape.ShapeType() == TopAbs_COMPSOLID) { FP->AddWarning(start,"NonManifold COMPSOLID was translated like a set of SOLIDs"); if ( GroupMode() > 0) - return TransferCompound(start, SDR0, FP); + return TransferCompound(start, SDR0, FP, aPSRoot.Next()); else { TopExp_Explorer SolidExp; for (SolidExp.Init(theShape, TopAbs_SOLID); @@ -871,7 +881,8 @@ //ptv 10.11.00: allow to write empty Compound: if (GroupMode() >0) ItemSeq->Append (myContext.GetDefaultAxis()); STEPControl_StepModelType trmode = mymode; - for (Standard_Integer i = 1; i <= nbs; i++) { + Message_ProgressScope aPS (aPSRoot.Next(), NULL, nbs); + for (Standard_Integer i = 1; i <= nbs && aPS.More(); i++) { TopoDS_Shape xShape = RepItemSeq->Value(i); if(mymode == STEPControl_AsIs) { @@ -896,11 +907,16 @@ Handle(Standard_Transient) info; Standard_Real maxTol = Interface_Static::RVal("read.maxprecision.val"); + Message_ProgressScope aPS1 (aPS.Next(), NULL, 2); + TopoDS_Shape aShape; aShape = XSAlgo::AlgoContainer()->ProcessShape(xShape, Tol, maxTol, "write.step.resource.name", "write.step.sequence", info, - FP->GetProgress() ); + aPS1.Next()); + if (aPS1.UserBreak()) + return Handle(Transfer_Binder)(); + if (!isManifold) { mergeInfoForNM(FP, info); } @@ -920,7 +936,7 @@ for ( TopoDS_Iterator It ( aSolid ); It.More(); It.Next() ) if (It.Value().ShapeType() == TopAbs_SHELL) nbShells++; if ( nbShells >1 ) { - TopoDSToStep_MakeBrepWithVoids MkBRepWithVoids(aSolid,FP); + TopoDSToStep_MakeBrepWithVoids MkBRepWithVoids(aSolid,FP, aPS1.Next()); MkBRepWithVoids.Tolerance() = Tol; if (MkBRepWithVoids.IsDone()) { item = MkBRepWithVoids.Value(); @@ -929,7 +945,7 @@ } if ( nbShells ==1 ) { - TopoDSToStep_MakeManifoldSolidBrep MkManifoldSolidBrep(aSolid,FP); + TopoDSToStep_MakeManifoldSolidBrep MkManifoldSolidBrep(aSolid,FP, aPS1.Next()); MkManifoldSolidBrep.Tolerance() = Tol; if (MkManifoldSolidBrep.IsDone()) { item = MkManifoldSolidBrep.Value(); @@ -938,7 +954,7 @@ } else if (aShape.ShapeType() == TopAbs_SHELL) { TopoDS_Shell aShell = TopoDS::Shell(aShape); - TopoDSToStep_MakeManifoldSolidBrep MkManifoldSolidBrep(aShell,FP); + TopoDSToStep_MakeManifoldSolidBrep MkManifoldSolidBrep(aShell,FP, aPS1.Next()); MkManifoldSolidBrep.Tolerance() = Tol; if (MkManifoldSolidBrep.IsDone()) { item = MkManifoldSolidBrep.Value(); @@ -950,7 +966,7 @@ { if (aShape.ShapeType() == TopAbs_SOLID) { TopoDS_Solid aSolid = TopoDS::Solid(aShape); - TopoDSToStep_MakeBrepWithVoids MkBRepWithVoids(aSolid,FP); + TopoDSToStep_MakeBrepWithVoids MkBRepWithVoids(aSolid,FP, aPS1.Next()); MkBRepWithVoids.Tolerance() = Tol; if (MkBRepWithVoids.IsDone()) { item = MkBRepWithVoids.Value(); @@ -973,7 +989,7 @@ } if (aShape.ShapeType() == TopAbs_SOLID) { TopoDS_Solid aSolid = TopoDS::Solid(aShape); - TopoDSToStep_MakeFacetedBrep MkFacetedBrep(aSolid,FP); + TopoDSToStep_MakeFacetedBrep MkFacetedBrep(aSolid,FP, aPS1.Next()); MkFacetedBrep.Tolerance() = Tol; if (MkFacetedBrep.IsDone()) { item = MkFacetedBrep.Value(); @@ -997,7 +1013,7 @@ if (aShape.ShapeType() == TopAbs_SOLID) { TopoDS_Solid aSolid = TopoDS::Solid(aShape); TopoDSToStep_MakeFacetedBrepAndBrepWithVoids - MkFacetedBrepAndBrepWithVoids(aSolid,FP); + MkFacetedBrepAndBrepWithVoids(aSolid,FP, aPS1.Next()); MkFacetedBrepAndBrepWithVoids.Tolerance() = Tol; if (MkFacetedBrepAndBrepWithVoids.IsDone()) { item = MkFacetedBrepAndBrepWithVoids.Value(); @@ -1010,7 +1026,7 @@ if (aShape.ShapeType() == TopAbs_SOLID) { TopoDS_Solid aSolid = TopoDS::Solid(aShape); TopoDSToStep_MakeShellBasedSurfaceModel - MkShellBasedSurfaceModel(aSolid, FP); + MkShellBasedSurfaceModel(aSolid, FP, aPS1.Next()); MkShellBasedSurfaceModel.Tolerance() = Tol; if (MkShellBasedSurfaceModel.IsDone()) { item = MkShellBasedSurfaceModel.Value(); @@ -1019,7 +1035,7 @@ else if (aShape.ShapeType() == TopAbs_SHELL) { TopoDS_Shell aShell = TopoDS::Shell(aShape); // Non-manifold topology is stored via NMSSR containing series of SBSM (ssv; 13.11.2010) - TopoDSToStep_MakeShellBasedSurfaceModel MkShellBasedSurfaceModel(aShell, FP); + TopoDSToStep_MakeShellBasedSurfaceModel MkShellBasedSurfaceModel(aShell, FP, aPS1.Next()); MkShellBasedSurfaceModel.Tolerance() = Tol; if (MkShellBasedSurfaceModel.IsDone()) { item = MkShellBasedSurfaceModel.Value(); @@ -1028,7 +1044,7 @@ else if (aShape.ShapeType() == TopAbs_FACE) { TopoDS_Face aFace = TopoDS::Face(aShape); TopoDSToStep_MakeShellBasedSurfaceModel - MkShellBasedSurfaceModel(aFace, FP); + MkShellBasedSurfaceModel(aFace, FP, aPS1.Next()); MkShellBasedSurfaceModel.Tolerance() = Tol; if (MkShellBasedSurfaceModel.IsDone()) { item = MkShellBasedSurfaceModel.Value(); @@ -1268,9 +1284,11 @@ //purpose : //======================================================================= -Handle(Transfer_Binder) STEPControl_ActorWrite::TransferCompound (const Handle(Transfer_Finder)& start, - const Handle(StepShape_ShapeDefinitionRepresentation)& SDR0, - const Handle(Transfer_FinderProcess)& FP) +Handle(Transfer_Binder) STEPControl_ActorWrite::TransferCompound + (const Handle(Transfer_Finder)& start, + const Handle(StepShape_ShapeDefinitionRepresentation)& SDR0, + const Handle(Transfer_FinderProcess)& FP, + const Message_ProgressRange& theProgress) { Handle(TransferBRep_ShapeMapper) mapper = Handle(TransferBRep_ShapeMapper)::DownCast(start); Handle(Transfer_Binder) binder; @@ -1315,7 +1333,9 @@ NonManifoldGroup->Append(aSubShell); } } - else if (!isManifold && (aSubShape.ShapeType() == TopAbs_SHELL) ) { + else if (!isManifold && + (aSubShape.ShapeType() == TopAbs_SHELL || aSubShape.ShapeType() == TopAbs_FACE)) + { RepItemSeq->Append(aSubShape); NonManifoldGroup->Append(aSubShape); } @@ -1348,11 +1368,12 @@ Handle(TColStd_HSequenceOfTransient) ItemSeq = new TColStd_HSequenceOfTransient(); ItemSeq->Append (myContext.GetDefaultAxis()); myContext.NextLevel(); - for ( i = 1; i <= nbs; i ++) { + Message_ProgressScope aPS(theProgress, NULL, nbs); + for (i = 1; i <= nbs && aPS.More(); i++) { Handle(TransferBRep_ShapeMapper) subs = TransferBRep::ShapeMapper (FP,RepItemSeq->Value(i)); Handle(StepGeom_Axis2Placement3d) AX1; - Handle(Transfer_Binder) bnd = TransferSubShape(subs, SDR0, AX1, FP, NonManifoldGroup, isManifold); + Handle(Transfer_Binder) bnd = TransferSubShape(subs, SDR0, AX1, FP, NonManifoldGroup, isManifold, aPS.Next()); if (!AX1.IsNull()) ItemSeq->Append (AX1); // copy binders so as to have all roots in upper binder, but do not conflict @@ -1396,12 +1417,14 @@ //purpose : //======================================================================= -Handle(Transfer_Binder) STEPControl_ActorWrite::TransferSubShape (const Handle(Transfer_Finder)& start, - const Handle(StepShape_ShapeDefinitionRepresentation)& SDR0, - Handle(StepGeom_Axis2Placement3d)& AX1, - const Handle(Transfer_FinderProcess)& FP, - const Handle(TopTools_HSequenceOfShape)& shapeGroup, - const Standard_Boolean isManifold) +Handle(Transfer_Binder) STEPControl_ActorWrite::TransferSubShape + (const Handle(Transfer_Finder)& start, + const Handle(StepShape_ShapeDefinitionRepresentation)& SDR0, + Handle(StepGeom_Axis2Placement3d)& AX1, + const Handle(Transfer_FinderProcess)& FP, + const Handle(TopTools_HSequenceOfShape)& shapeGroup, + const Standard_Boolean isManifold, + const Message_ProgressRange& theProgress) { Handle(TransferBRep_ShapeMapper) mapper = Handle(TransferBRep_ShapeMapper)::DownCast(start); if (mapper.IsNull()) return NullResult(); @@ -1442,7 +1465,7 @@ //:abv 20.05.02: see comment in TransferShape(): added "! iasdr ||" Handle(Transfer_Binder) resprod = TransientResult(sdr); //KA - OCC7141(skl 10.11.2004) if ( ! iasdr || resbind.IsNull() ) { - resbind = TransferShape(mapper, sdr, FP, shapeGroup, isManifold); + resbind = TransferShape(mapper, sdr, FP, shapeGroup, isManifold, theProgress); Handle(Transfer_Binder) oldbind = FP->Find ( mapper ); if ( ! oldbind.IsNull() && !resbind.IsNull()) resbind->AddResult ( oldbind ); FP->Bind (mapper,resbind); diff -Nru opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_ActorWrite.hxx opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_ActorWrite.hxx --- opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_ActorWrite.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_ActorWrite.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -51,13 +51,33 @@ Standard_EXPORT virtual Standard_Boolean Recognize (const Handle(Transfer_Finder)& start) Standard_OVERRIDE; - Standard_EXPORT virtual Handle(Transfer_Binder) Transfer (const Handle(Transfer_Finder)& start, const Handle(Transfer_FinderProcess)& FP) Standard_OVERRIDE; - - Standard_EXPORT Handle(Transfer_Binder) TransferSubShape (const Handle(Transfer_Finder)& start, const Handle(StepShape_ShapeDefinitionRepresentation)& SDR, Handle(StepGeom_Axis2Placement3d)& AX1, const Handle(Transfer_FinderProcess)& FP, const Handle(TopTools_HSequenceOfShape)& shapeGroup = NULL, const Standard_Boolean isManifold = Standard_True); - - Standard_EXPORT Handle(Transfer_Binder) TransferShape (const Handle(Transfer_Finder)& start, const Handle(StepShape_ShapeDefinitionRepresentation)& SDR, const Handle(Transfer_FinderProcess)& FP, const Handle(TopTools_HSequenceOfShape)& shapeGroup = NULL, const Standard_Boolean isManifold = Standard_True); - - Standard_EXPORT Handle(Transfer_Binder) TransferCompound (const Handle(Transfer_Finder)& start, const Handle(StepShape_ShapeDefinitionRepresentation)& SDR, const Handle(Transfer_FinderProcess)& FP); + Standard_EXPORT virtual Handle(Transfer_Binder) Transfer + (const Handle(Transfer_Finder)& start, + const Handle(Transfer_FinderProcess)& FP, + const Message_ProgressRange& theProgress = Message_ProgressRange()) Standard_OVERRIDE; + + Standard_EXPORT Handle(Transfer_Binder) TransferSubShape + (const Handle(Transfer_Finder)& start, + const Handle(StepShape_ShapeDefinitionRepresentation)& SDR, + Handle(StepGeom_Axis2Placement3d)& AX1, + const Handle(Transfer_FinderProcess)& FP, + const Handle(TopTools_HSequenceOfShape)& shapeGroup = NULL, + const Standard_Boolean isManifold = Standard_True, + const Message_ProgressRange& theProgress = Message_ProgressRange()); + + Standard_EXPORT Handle(Transfer_Binder) TransferShape + (const Handle(Transfer_Finder)& start, + const Handle(StepShape_ShapeDefinitionRepresentation)& SDR, + const Handle(Transfer_FinderProcess)& FP, + const Handle(TopTools_HSequenceOfShape)& shapeGroup = NULL, + const Standard_Boolean isManifold = Standard_True, + const Message_ProgressRange& theProgress = Message_ProgressRange()); + + Standard_EXPORT Handle(Transfer_Binder) TransferCompound + (const Handle(Transfer_Finder)& start, + const Handle(StepShape_ShapeDefinitionRepresentation)& SDR, + const Handle(Transfer_FinderProcess)& FP, + const Message_ProgressRange& theProgress = Message_ProgressRange()); Standard_EXPORT void SetMode (const STEPControl_StepModelType M); diff -Nru opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Controller.cxx opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Controller.cxx --- opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Controller.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Controller.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -199,6 +199,56 @@ Interface_Static::Init("step", "read.step.all.shapes", '&', "eval On"); Interface_Static::SetIVal("read.step.all.shapes", 0); + // Mode for reading constructive geometry representation relationship to read + //StepRepr_ConstructiveGeometryRepresentation method implemented only for StepGeom_MakeAxis2Placement3d + //for axis placements representing axis for suplemented geometry. Axis placements are translated to planar faces with CS + //equal to translated axis placements + Interface_Static::Init("step","read.step.constructivegeom.relationship",'e',""); + Interface_Static::Init("step","read.step.constructivegeom.relationship",'&',"enum 0"); + Interface_Static::Init("step","read.step.constructivegeom.relationship",'&',"eval OFF"); + Interface_Static::Init("step","read.step.constructivegeom.relationship",'&',"eval ON"); + Interface_Static::SetCVal("read.step.constructivegeom.relationship","OFF"); + + // Mode to variate apply or not transformation placed in the root shape representation. + // Issues #29068 and #31491. + Interface_Static::Init("step", "read.step.root.transformation", 'e', ""); + Interface_Static::Init("step", "read.step.root.transformation", '&', "enum 0"); + Interface_Static::Init("step", "read.step.root.transformation", '&', "eval ON"); + Interface_Static::Init("step", "read.step.root.transformation", '&', "eval OFF"); + Interface_Static::SetCVal("read.step.root.transformation", "ON"); + + // STEP file encoding for names translation + // Note: the numbers should be consistent with Resource_FormatType enumeration + Interface_Static::Init("step", "read.step.codepage", 'e', ""); + Interface_Static::Init("step", "read.step.codepage", '&', "enum 0"); + Interface_Static::Init("step", "read.step.codepage", '&', "eval SJIS"); // Resource_FormatType_SJIS + Interface_Static::Init("step", "read.step.codepage", '&', "eval EUC"); // Resource_FormatType_EUC + Interface_Static::Init("step", "read.step.codepage", '&', "eval NoConversion"); // Resource_FormatType_NoConversion + Interface_Static::Init("step", "read.step.codepage", '&', "eval GB"); // Resource_FormatType_GB + Interface_Static::Init("step", "read.step.codepage", '&', "eval UTF8"); // Resource_FormatType_UTF8 + Interface_Static::Init("step", "read.step.codepage", '&', "eval SystemLocale"); // Resource_FormatType_SystemLocale + Interface_Static::Init("step", "read.step.codepage", '&', "eval CP1250"); // Resource_FormatType_CP1250 + Interface_Static::Init("step", "read.step.codepage", '&', "eval CP1251"); // Resource_FormatType_CP1251 + Interface_Static::Init("step", "read.step.codepage", '&', "eval CP1252"); // Resource_FormatType_CP1252 + Interface_Static::Init("step", "read.step.codepage", '&', "eval CP1253"); // Resource_FormatType_CP1253 + Interface_Static::Init("step", "read.step.codepage", '&', "eval CP1254"); // Resource_FormatType_CP1254 + Interface_Static::Init("step", "read.step.codepage", '&', "eval CP1255"); // Resource_FormatType_CP1255 + Interface_Static::Init("step", "read.step.codepage", '&', "eval CP1256"); // Resource_FormatType_CP1256 + Interface_Static::Init("step", "read.step.codepage", '&', "eval CP1257"); // Resource_FormatType_CP1257 + Interface_Static::Init("step", "read.step.codepage", '&', "eval CP1258"); // Resource_FormatType_CP1258 + Interface_Static::Init("step", "read.step.codepage", '&', "eval iso8859-1"); // Resource_FormatType_iso8859_1 + Interface_Static::Init("step", "read.step.codepage", '&', "eval iso8859-2"); // Resource_FormatType_iso8859_2 + Interface_Static::Init("step", "read.step.codepage", '&', "eval iso8859-3"); // Resource_FormatType_iso8859_3 + Interface_Static::Init("step", "read.step.codepage", '&', "eval iso8859-4"); // Resource_FormatType_iso8859_4 + Interface_Static::Init("step", "read.step.codepage", '&', "eval iso8859-5"); // Resource_FormatType_iso8859_5 + Interface_Static::Init("step", "read.step.codepage", '&', "eval iso8859-6"); // Resource_FormatType_iso8859_6 + Interface_Static::Init("step", "read.step.codepage", '&', "eval iso8859-7"); // Resource_FormatType_iso8859_7 + Interface_Static::Init("step", "read.step.codepage", '&', "eval iso8859-8"); // Resource_FormatType_iso8859_8 + Interface_Static::Init("step", "read.step.codepage", '&', "eval iso8859-9"); // Resource_FormatType_iso8859_9 + Interface_Static::SetCVal("read.step.codepage", "UTF8"); + + Standard_STATIC_ASSERT((int)Resource_FormatType_iso8859_9 - (int)Resource_FormatType_CP1250 == 17); // "Error: Invalid Codepage Enumeration" + init = Standard_True; } @@ -291,7 +341,8 @@ (const TopoDS_Shape& shape, const Handle(Transfer_FinderProcess)& FP, const Handle(Interface_InterfaceModel)& model, - const Standard_Integer modeshape) const + const Standard_Integer modeshape, + const Message_ProgressRange& theProgress) const { if (modeshape < 0 || modeshape > 4) return IFSelect_RetError; Handle(STEPControl_ActorWrite) ActWrite = @@ -300,7 +351,7 @@ if (!ActWrite.IsNull()) ActWrite->SetGroupMode (Interface_Static::IVal("write.step.assembly")); - return XSControl_Controller::TransferWriteShape (shape,FP,model,modeshape); + return XSControl_Controller::TransferWriteShape(shape, FP, model, modeshape, theProgress); } Standard_Boolean STEPControl_Controller::Init () diff -Nru opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Controller.hxx opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Controller.hxx --- opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Controller.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Controller.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,7 +57,12 @@ //! Returns a status : 0 OK 1 No result 2 Fail -1 bad modeshape //! -2 bad model (requires a StepModel) //! modeshape : 1 Facetted BRep, 2 Shell, 3 Manifold Solid - Standard_EXPORT virtual IFSelect_ReturnStatus TransferWriteShape (const TopoDS_Shape& shape, const Handle(Transfer_FinderProcess)& FP, const Handle(Interface_InterfaceModel)& model, const Standard_Integer modetrans = 0) const Standard_OVERRIDE; + Standard_EXPORT virtual IFSelect_ReturnStatus TransferWriteShape + (const TopoDS_Shape& shape, + const Handle(Transfer_FinderProcess)& FP, + const Handle(Interface_InterfaceModel)& model, + const Standard_Integer modetrans = 0, + const Message_ProgressRange& theProgress = Message_ProgressRange()) const Standard_OVERRIDE; //! Standard Initialisation. It creates a Controller for STEP //! and records it to various names, available to select it later diff -Nru opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Reader.cxx opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Reader.cxx --- opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Reader.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Reader.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -106,9 +106,10 @@ //purpose : //======================================================================= -Standard_Boolean STEPControl_Reader::TransferRoot (const Standard_Integer num) +Standard_Boolean STEPControl_Reader::TransferRoot (const Standard_Integer num, + const Message_ProgressRange& theProgress) { - return TransferOneRoot (num); + return TransferOneRoot(num, theProgress); } //======================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Reader.hxx opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Reader.hxx --- opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Reader.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Reader.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -89,7 +89,8 @@ //! Default is the first one //! Returns True if a shape has resulted, false else //! Same as inherited TransferOneRoot, kept for compatibility - Standard_EXPORT Standard_Boolean TransferRoot (const Standard_Integer num = 1); + Standard_EXPORT Standard_Boolean TransferRoot (const Standard_Integer num = 1, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Determines the list of root entities from Model which are candidate for //! a transfer to a Shape (type of entities is PRODUCT) diff -Nru opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Writer.cxx opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Writer.cxx --- opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Writer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Writer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -11,13 +11,12 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include -#include #include #include -#include #include #include #include @@ -121,8 +120,10 @@ //======================================================================= IFSelect_ReturnStatus STEPControl_Writer::Transfer - (const TopoDS_Shape& sh, const STEPControl_StepModelType mode, - const Standard_Boolean compgraph) + (const TopoDS_Shape& sh, + const STEPControl_StepModelType mode, + const Standard_Boolean compgraph, + const Message_ProgressRange& theProgress) { Standard_Integer mws = -1; switch (mode) { @@ -136,16 +137,7 @@ if (mws < 0) return IFSelect_RetError; // cas non reconnu thesession->TransferWriter()->SetTransferMode (mws); - // for progress indicator. - Handle(Message_ProgressIndicator) progress = WS()->TransferWriter()->FinderProcess()->GetProgress(); - if ( ! progress.IsNull() ) { - Standard_Integer nbfaces=0; - for( TopExp_Explorer exp(sh, TopAbs_FACE); exp.More(); exp.Next()) nbfaces++; - progress->SetScale ( "Face", 0, nbfaces, 1 ); - progress->Show(); - } - - return thesession->TransferWriteShape(sh,compgraph); + return thesession->TransferWriteShape(sh, compgraph, theProgress); } diff -Nru opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Writer.hxx opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Writer.hxx --- opencascade-7.4.1+dfsg1/src/STEPControl/STEPControl_Writer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/STEPControl/STEPControl_Writer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,6 +27,8 @@ #include #include #include +#include + class XSControl_WorkSession; class StepData_StepModel; class TopoDS_Shape; @@ -83,7 +85,11 @@ //! shell_based_surface_model entity. //! - STEPControlStd_GeometricCurveSet translates a shape into a STEP //! geometric_curve_set entity. - Standard_EXPORT IFSelect_ReturnStatus Transfer (const TopoDS_Shape& sh, const STEPControl_StepModelType mode, const Standard_Boolean compgraph = Standard_True); + Standard_EXPORT IFSelect_ReturnStatus Transfer + (const TopoDS_Shape& sh, + const STEPControl_StepModelType mode, + const Standard_Boolean compgraph = Standard_True, + const Message_ProgressRange& theProgress = Message_ProgressRange()); //! Writes a STEP model in the file identified by filename. Standard_EXPORT IFSelect_ReturnStatus Write (const Standard_CString filename); diff -Nru opencascade-7.4.1+dfsg1/src/StepData/StepData_Field.hxx opencascade-7.5.1+dfsg1/src/StepData/StepData_Field.hxx --- opencascade-7.4.1+dfsg1/src/StepData/StepData_Field.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepData/StepData_Field.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -57,7 +57,14 @@ //! Gets the copy of the values of another field Standard_EXPORT void CopyFrom (const StepData_Field& other); - + + //! Assignment + StepData_Field& operator= (const StepData_Field& theOther) + { + CopyFrom (theOther); + return *this; + } + //! Clears the field, to set it as "no value defined" //! Just before SetList, predeclares it as "any" //! A Kind can be directly set here to declare a type diff -Nru opencascade-7.4.1+dfsg1/src/StepData/StepData_StepDumper.cxx opencascade-7.5.1+dfsg1/src/StepData/StepData_StepDumper.cxx --- opencascade-7.4.1+dfsg1/src/StepData/StepData_StepDumper.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepData/StepData_StepDumper.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,7 +45,7 @@ Standard_Boolean StepData_StepDumper::Dump - (const Handle(Message_Messenger)& S, const Handle(Standard_Transient)& ent, + (Standard_OStream& S, const Handle(Standard_Transient)& ent, const Standard_Integer level) { Standard_Integer i, nb = themodel->NbEntities(); @@ -64,18 +64,18 @@ TColStd_SequenceOfAsciiString listypes; if (!module->ComplexType(CN,listypes)) S << "(Complex Type : ask level > 0) cdl = " - << ent->DynamicType()->Name() << " (...);" << Message_EndLine; + << ent->DynamicType()->Name() << " (...);" << std::endl; else { Standard_Integer n = listypes.Length(); for (i = 1; i <= n; i ++) S << listypes.Value(i) << " (...)"; - S << Message_EndLine; + S << std::endl; } } - else S << module->StepType(CN) << " (...);" << Message_EndLine; + else S << module->StepType(CN) << " (...);" << std::endl; } else S << "(Unrecognized Type for protocol) cdl = " - << ent->DynamicType()->Name() << " (...);" << Message_EndLine; - if (nlab > 0) S << "/* Ident in file for "<DynamicType()->Name() << " (...);" << std::endl; + if (nlab > 0) S << "/* Ident in file for "< 0) nbi ++; } if (nbe > 0) { -// S <<" -- Displayed nums:"< 0) { - S<<" (no ident): "; + S <<" (no ident): "; for (i = 1; i <= nb; i ++) - { if (ids.Value(i) >= 0) continue; S<<" #"<= 0) continue; S <<" #"< 0) { - S<<" (ident = num): "; - for (i = 1; i <= nb; i ++) { if (ids.Value(i) == i) S<<" #"< 79) { nbl = nbc; S< 79) { nbl = nbc; S < 0; nbr0 --) S << " "; } - S< 79) { S<#"< 5) { nbl = nbr = 0; S< 0) S< 0) S < 0) S<<"In dump, iii:#jjj means : entity rank iii has step ident #jjj"< 0) S <<"In dump, iii:#jjj means : entity rank iii has step ident #jjj"< 0) { - Standard_SStream aStream; - thewriter.Print(aStream); - S << aStream; + thewriter.Print (S); } return Standard_True; } Standard_Boolean StepData_StepDumper::Dump - (const Handle(Message_Messenger)& S, const Standard_Integer num, + (Standard_OStream& S, const Standard_Integer num, const Standard_Integer level) { if (num <= 0 || num > themodel->NbEntities()) return Standard_False; diff -Nru opencascade-7.4.1+dfsg1/src/StepData/StepData_StepDumper.hxx opencascade-7.5.1+dfsg1/src/StepData/StepData_StepDumper.hxx --- opencascade-7.4.1+dfsg1/src/StepData/StepData_StepDumper.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepData/StepData_StepDumper.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,9 +30,6 @@ class Interface_InterfaceMismatch; class StepData_Protocol; class StepData_StepWriter; -class Message_Messenger; -class Standard_Transient; - //! Provides a way to dump entities processed through STEP, with //! these features : @@ -79,12 +76,12 @@ //! //! For levels 1,2,3, the numbers displayed (form #nnn) are the //! numbers of the corresponding entities in the Model - Standard_EXPORT Standard_Boolean Dump (const Handle(Message_Messenger)& S, const Handle(Standard_Transient)& ent, const Standard_Integer level); + Standard_EXPORT Standard_Boolean Dump (Standard_OStream& S, const Handle(Standard_Transient)& ent, const Standard_Integer level); //! Works as Dump with a Transient, but directly takes the //! entity designated by its number in the Model //! Returns False, also if is out of range - Standard_EXPORT Standard_Boolean Dump (const Handle(Message_Messenger)& S, const Standard_Integer num, const Standard_Integer level); + Standard_EXPORT Standard_Boolean Dump (Standard_OStream& S, const Standard_Integer num, const Standard_Integer level); diff -Nru opencascade-7.4.1+dfsg1/src/StepData/StepData_StepModel.cxx opencascade-7.5.1+dfsg1/src/StepData/StepData_StepModel.cxx --- opencascade-7.4.1+dfsg1/src/StepData/StepData_StepModel.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepData/StepData_StepModel.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -29,12 +28,14 @@ #include #include #include +#include #include IMPLEMENT_STANDARD_RTTIEXT(StepData_StepModel,Interface_InterfaceModel) // Entete de fichier : liste d entites -StepData_StepModel::StepData_StepModel () { } +StepData_StepModel::StepData_StepModel () :mySourceCodePage((Resource_FormatType)Interface_Static::IVal("read.step.codepage")) +{} Handle(Standard_Transient) StepData_StepModel::Entity @@ -103,14 +104,13 @@ } -void StepData_StepModel::DumpHeader -(const Handle(Message_Messenger)& S, const Standard_Integer /*level*/) const +void StepData_StepModel::DumpHeader (Standard_OStream& S, const Standard_Integer /*level*/) const { // NB : level n est pas utilise Handle(StepData_Protocol) stepro = StepData::HeaderProtocol(); Standard_Boolean iapro = !stepro.IsNull(); - if (!iapro) S<<" -- WARNING : StepModel DumpHeader, Protocol not defined\n"; + if (!iapro) S <<" -- WARNING : StepModel DumpHeader, Protocol not defined\n"; Interface_EntityIterator iter = Header(); Standard_Integer nb = iter.NbEntities(); @@ -119,16 +119,14 @@ S << " " << iter.Value()->DynamicType()->Name() << "\n"; } if (!iapro || nb == 0) return; - S << " -- -- STEP MODEL HEADER CONTENT -- --" << Message_EndLine; + S << " -- -- STEP MODEL HEADER CONTENT -- --" << "\n"; S << " -- Dumped with Protocol : " << stepro->DynamicType()->Name() - << " --"<Value(num)); - if (nid > 0) S<<"#"< 0) S<<"(#"< 0) S <<"#"< 0) S <<"(#"< -#include - #include #include #include -#include -#include -#include +#include + class Standard_NoSuchObject; class Standard_Transient; class Interface_InterfaceModel; class Interface_EntityIterator; class Interface_Check; -class Message_Messenger; class TCollection_HAsciiString; - class StepData_StepModel; DEFINE_STANDARD_HANDLE(StepData_StepModel, Interface_InterfaceModel) @@ -83,7 +77,7 @@ //! prints its Type. Else sends the Header under the form of //! HEADER Section of an Ascii Step File //! is not used because Header is not so big - Standard_EXPORT void DumpHeader (const Handle(Message_Messenger)& S, const Standard_Integer level = 0) const Standard_OVERRIDE; + Standard_EXPORT void DumpHeader (Standard_OStream& S, const Standard_Integer level = 0) const Standard_OVERRIDE; //! erases specific labels, i.e. clears the map (entity-ident) Standard_EXPORT void ClearLabels() Standard_OVERRIDE; @@ -98,13 +92,18 @@ //! Prints label specific to STEP norm for a given entity, i.e. //! if a LabelIdent has been recorded, its value with '#', else //! the number in the model with '#' and between () - Standard_EXPORT void PrintLabel (const Handle(Standard_Transient)& ent, const Handle(Message_Messenger)& S) const Standard_OVERRIDE; + Standard_EXPORT void PrintLabel (const Handle(Standard_Transient)& ent, Standard_OStream& S) const Standard_OVERRIDE; //! Returns a string with the label attached to a given entity, //! same form as for PrintLabel Standard_EXPORT Handle(TCollection_HAsciiString) StringLabel (const Handle(Standard_Transient)& ent) const Standard_OVERRIDE; + //! Return the encoding of STEP file for converting names into UNICODE. + //! Initialized from "read.step.codepage" variable by constructor, which is Resource_UTF8 by default. + Resource_FormatType SourceCodePage() const { return mySourceCodePage; } + //! Return the encoding of STEP file for converting names into UNICODE. + void SetSourceCodePage (Resource_FormatType theCode) { mySourceCodePage = theCode; } DEFINE_STANDARD_RTTIEXT(StepData_StepModel,Interface_InterfaceModel) @@ -119,6 +118,7 @@ Interface_EntityList theheader; Handle(TColStd_HArray1OfInteger) theidnums; + Resource_FormatType mySourceCodePage; }; diff -Nru opencascade-7.4.1+dfsg1/src/StepData/StepData_StepReaderData.cxx opencascade-7.5.1+dfsg1/src/StepData/StepData_StepReaderData.cxx --- opencascade-7.4.1+dfsg1/src/StepData/StepData_StepReaderData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepData/StepData_StepReaderData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,8 @@ #include #include #include +#include +#include #include #include #include @@ -46,6 +49,7 @@ #include #include #include +#include #include IMPLEMENT_STANDARD_RTTIEXT(StepData_StepReaderData, Interface_FileReaderData) @@ -61,7 +65,6 @@ static Standard_Boolean initstr = Standard_False; - #define Maxlst 64 //static TCollection_AsciiString subl[Maxlst]; // Maxlst : minimum 10 @@ -69,36 +72,231 @@ // ---------- Fonctions Utilitaires ---------- +//! Convert unsigned character to hexadecimal system, +//! if character hasn't representation in this system, returns 0. +static Standard_Integer convertCharacterTo16bit(const unsigned char theCharacter) +{ + switch (theCharacter) + { + case '0': return 0; + case '1': return 1; + case '2': return 2; + case '3': return 3; + case '4': return 4; + case '5': return 5; + case '6': return 6; + case '7': return 7; + case '8': return 8; + case '9': return 9; + case 'A': return 10; + case 'B': return 11; + case 'C': return 12; + case 'D': return 13; + case 'E': return 14; + case 'F': return 15; + default : return 0; + } +} + //======================================================================= -//function : CleanText +//function : cleanText //purpose : //======================================================================= -static void CleanText(const Handle(TCollection_HAsciiString)& val) + +void StepData_StepReaderData::cleanText(const Handle(TCollection_HAsciiString)& theVal) const { - Standard_Integer n = val->Length(); // avant reduction - val->Remove(n); - val->Remove(1); - // Ne pas oublier de traiter les caracteres speciaux + Standard_Integer n = theVal->Length(); // string size before reduction + theVal->Remove(n); + theVal->Remove(1); + // Don't forget to treat the special characters for (Standard_Integer i = n - 2; i > 0; i--) { - char uncar = val->Value(i); - if (uncar == '\n') - { val->Remove(i); if (i < n-2) uncar = val->Value(i); } - if (uncar == '\'' && i < n - 2) { - if (val->Value(i + 1) == '\'') { val->Remove(i + 1); continue; } - } - if (uncar == '\\' && i < n - 2) { - if (val->Value(i + 1) == '\\') { val->Remove(i + 1); continue; } - } - else if (uncar == '\\' && i < n - 3) { - if (val->Value(i + 2) == '\\') { - if (val->Value(i + 1) == 'N') - { val->SetValue(i,'\n'); val->Remove(i+1,2); continue; } - if (val->Value(i + 1) == 'T') - { val->SetValue(i,'\t'); val->Remove(i+1,2); continue; } + char aChar = theVal->Value(i); + if (aChar == '\n') + { theVal->Remove(i); if (i < n-2) aChar = theVal->Value(i); } + if (aChar == '\'' && i < n - 2) { + if (theVal->Value(i + 1) == '\'') { theVal->Remove(i + 1); continue; } + } + if (aChar == '\\' && i < n - 3) { + if (theVal->Value(i + 2) == '\\') { + if (theVal->Value(i + 1) == 'N') + { theVal->SetValue(i,'\n'); theVal->Remove(i+1,2); continue; } + if (theVal->Value(i + 1) == 'T') + { theVal->SetValue(i,'\t'); theVal->Remove(i+1,2); continue; } + } + } + } + + // pass through without conversion the control directives + if (mySourceCodePage == Resource_FormatType_NoConversion) + return; + + Standard_Integer aFirstCharInd = 1; // begin index of substring to conversion before the control directives + Standard_Integer aLastCharInd = 1; // end index of substring to conversion before the control directives + TCollection_ExtendedString aTempExtString; // string for characters within control directives + TCollection_ExtendedString anOutputExtString; // string for conversion in UTF-8 + Resource_FormatType aLocalFormatType = Resource_FormatType_iso8859_1; // a code page for a "\S\" control directive + for (Standard_Integer i = 1; i <= theVal->Length(); ++i) + { + unsigned char aChar = theVal->Value(i); + if (aChar != '\\' || (theVal->Length() - i) < 3) // does not contain the control directive + { + continue; + } + Standard_Integer aLocalLastCharInd = i - 1; + Standard_Boolean isConverted = Standard_False; + // Encoding ISO 8859 characters within a string; + // ("\P{N}\") control directive; + // indicates code page for ("\S\") control directive; + // {N}: "A", "B", "C", "D", "E", "F", "G", "H", "I"; + // "A" identifies ISO 8859-1; "B" identifies ISO 8859-2, etc. + if (theVal->Value(i + 1) == 'P' && theVal->Length() - i > 3 && theVal->Value(i + 3) == '\\') + { + Standard_Character aPageId = UpperCase (theVal->Value(i + 2)); + if (aPageId >= 'A' && aPageId <= 'I') + { + aLocalFormatType = (Resource_FormatType)(Resource_FormatType_iso8859_1 + (aPageId - 'A')); + } + else + { + thecheck->AddWarning("String control directive \\P*\\ with an unsupported symbol in place of *"); + } + + isConverted = Standard_True; + i += 3; + } + // Encoding ISO 8859 characters within a string; + // ("\S\") control directive; + // converts followed a LATIN CODEPOINT character. + else if (theVal->Value(i + 1) == 'S' && theVal->Length() - i > 2 && theVal->Value(i + 2) == '\\') + { + Standard_Character aResChar = theVal->Value(i + 3) | 0x80; + const char aStrForCovert[2] = { aResChar, '\0' }; + Resource_Unicode::ConvertFormatToUnicode(aLocalFormatType, aStrForCovert, aTempExtString); + isConverted = Standard_True; + i += 3; + } + // Encoding U+0000 to U+00FF in a string + // ("\X\") control directive; + // converts followed two hexadecimal character. + else if (theVal->Value(i + 1) == 'X' && theVal->Length() - i > 3 && theVal->Value(i + 2) == '\\') + { + Standard_Character aResChar = (char)convertCharacterTo16bit(theVal->Value(i + 3)); + aResChar = (aResChar << 4) | (char)convertCharacterTo16bit(theVal->Value(i + 4)); + const char aStrForCovert[2] = { aResChar, '\0' }; + aTempExtString = TCollection_ExtendedString(aStrForCovert, Standard_False); // pass through without conversion + isConverted = Standard_True; + i += 4; + } + // Encoding ISO 10646 characters within a string + // ("\X{N}\") control directive; + // {N}: "0", "2", "4"; + // "\X2\" or "\X4\" converts followed a hexadecimal character sequence; + // "\X0\" indicate the end of the "\X2\" or "\X4\". + else if (theVal->Value(i + 1) == 'X' && theVal->Length() - i > 2 && theVal->Value(i + 3) == '\\') + { + Standard_Integer aFirstInd = i + 3; + Standard_Integer aLastInd = i; + Standard_Boolean isClosed = Standard_False; + for (; i <= theVal->Length() && !isClosed; ++i) // find the end of the "\X2\" or "\X4\" by an external "i" + { + if (theVal->Length() - i > 2 && theVal->Value(i) == '\\' && theVal->Value(i + 1) == 'X' && theVal->Value(i + 2) == '0' && theVal->Value(i + 3) == '\\') + { + aLastInd = i - 1; + i = i + 2; + isClosed = Standard_True; } } + if (!isClosed) // "\X0\" not exists + { + aLastInd = theVal->Length(); + } + TCollection_AsciiString aBitString; + aBitString = TCollection_AsciiString(theVal->ToCString() + aFirstInd, aLastInd - aFirstInd); + aBitString.UpperCase(); // make valid for conversion into 16-bit + // "\X2\" control directive; + // followed by multiples of four or three hexadecimal characters. + // Encoding in UTF-16 + if (theVal->Value(aFirstInd - 1) == '2' && theVal->Length() - aFirstInd > 3) + { + Standard_Integer anIterStep = (aBitString.Length() % 4 == 0) ? 4 : 3; + if (aBitString.Length() % anIterStep) + { + aTempExtString.AssignCat('?'); + thecheck->AddWarning("String control directive \\X2\\ is followed by number of digits not multiple of 4"); + } + else + { + Standard_Integer aStrLen = aBitString.Length() / anIterStep; + Standard_Utf16Char aUtfCharacter = '\0'; + for (Standard_Integer aCharInd = 1; aCharInd <= aStrLen * anIterStep; ++aCharInd) + { + aUtfCharacter |= convertCharacterTo16bit(aBitString.Value(aCharInd)); + if (aCharInd % anIterStep == 0) + { + aTempExtString.AssignCat(aUtfCharacter); + aUtfCharacter = '\0'; + } + aUtfCharacter = aUtfCharacter << 4; + } + } + } + // "\X4\" control directive; + // followed by multiples of eight hexadecimal characters. + // Encoding in UTF-32 + else if (theVal->Value(aFirstInd - 1) == '4' && theVal->Length() - aFirstInd > 7) + { + if (aBitString.Length() % 8) + { + aTempExtString.AssignCat('?'); + thecheck->AddWarning("String control directive \\X4\\ is followed by number of digits not multiple of 8"); + } + else + { + Standard_Integer aStrLen = aBitString.Length() / 8; + Standard_Utf32Char aUtfCharacter[2] = {'\0', '\0'}; + for (Standard_Integer aCharInd = 1; aCharInd <= aStrLen * 8; ++aCharInd) + { + aUtfCharacter[0] |= convertCharacterTo16bit(aBitString.Value(aCharInd)); + if (aCharInd % 8 == 0) + { + NCollection_Utf32Iter aUtfIter(aUtfCharacter); + Standard_Utf16Char aStringBuffer[3]; + Standard_Utf16Char* aUtfPntr = aUtfIter.GetUtf16(aStringBuffer); + *aUtfPntr++ = '\0'; + TCollection_ExtendedString aUtfString(aStringBuffer); + aTempExtString.AssignCat(aUtfString); + aUtfCharacter[0] = '\0'; + } + aUtfCharacter[0] = aUtfCharacter[0] << 4; + } + } + } + isConverted = Standard_True; } + if (isConverted) // find the control directive + { + TCollection_ExtendedString anExtString; + if (aFirstCharInd <= aLocalLastCharInd) + { + Resource_Unicode::ConvertFormatToUnicode(mySourceCodePage, theVal->SubString(aFirstCharInd, aLocalLastCharInd)->ToCString(), anExtString); + } + anOutputExtString.AssignCat(anExtString); + anOutputExtString.AssignCat(aTempExtString); + aFirstCharInd = i + 1; + aLastCharInd = aFirstCharInd; + aTempExtString.Clear(); + } + } + if (aLastCharInd <= theVal->Length()) + { + Resource_Unicode::ConvertFormatToUnicode(mySourceCodePage, theVal->ToCString() + aLastCharInd - 1, aTempExtString); + anOutputExtString.AssignCat(aTempExtString); } + theVal->Clear(); + TCollection_AsciiString aTmpString(anOutputExtString, 0); + theVal->AssignCat(aTmpString.ToCString()); +} + // ------------- METHODES ------------- @@ -109,9 +307,9 @@ StepData_StepReaderData::StepData_StepReaderData (const Standard_Integer nbheader, const Standard_Integer nbtotal, - const Standard_Integer nbpar) + const Standard_Integer nbpar, const Resource_FormatType theSourceCodePage) : Interface_FileReaderData(nbtotal, nbpar), theidents(1, nbtotal), - thetypes(1, nbtotal) //, themults (1,nbtotal) + thetypes(1, nbtotal), mySourceCodePage(theSourceCodePage) //, themults (1,nbtotal) { // char textnum[10]; thenbscop = 0; thenbents = 0; thelastn = 0; thenbhead = nbheader; @@ -187,11 +385,11 @@ while (theidents(prev) <= 0) { prev--; if (prev <= 0) break; } - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout << " *** Error on Record " << num << " (on " << NbRecords() << " -> " << num * 100 / NbRecords() << " % in File) ***"; if (prev > 0) sout << " Ident #" << theidents(prev); - sout << "\n" << errm << Message_EndLine; + sout << "\n" << errm << std::endl; #endif thecheck->AddWarning(errm.ToCString(), "Complex Type incorrect : "); } @@ -564,7 +762,9 @@ case 6: { if (FT != Interface_ParamText) { kod = 0; break; } Handle(TCollection_HAsciiString) txt = new TCollection_HAsciiString(str); - CleanText(txt); hst->SetValue(ip, txt); break; + cleanText(txt); + hst->SetValue(ip, txt); + break; } case 7: { Handle(Standard_Transient) ent = BoundEntity(FP.EntityNumber()); @@ -636,7 +836,9 @@ case Interface_ParamLogical: break; case Interface_ParamText: { Handle(TCollection_HAsciiString) txt = new TCollection_HAsciiString(str); - CleanText(txt); htr->SetValue(ip, txt); break; + cleanText(txt); + htr->SetValue(ip, txt); + break; } case Interface_ParamSub: { Handle(Standard_Transient) sub; @@ -714,7 +916,9 @@ case Interface_ParamVoid: break; case Interface_ParamText: txt = new TCollection_HAsciiString(str); - CleanText(txt); fild.Set(txt); break; + cleanText(txt); + fild.Set(txt); + break; case Interface_ParamEnum: if (!strcmp(str, ".T.")) fild.SetLogical(StepData_LTrue); else if (!strcmp(str, ".F.")) fild.SetLogical(StepData_LFalse); @@ -841,7 +1045,7 @@ case Interface_ParamLogical: break; case Interface_ParamText: { Handle(TCollection_HAsciiString) txt = new TCollection_HAsciiString(str); - CleanText(txt); + cleanText(txt); // PDN May 2000: for reading SOURCE_ITEM (external references) if (!val.IsNull()) { @@ -1038,7 +1242,7 @@ if (entent.IsNull() || !entent->IsKind(atype)) { errmess = new String("Parameter n0.%d (%s) : Entity has illegal type"); - if (entent->IsKind(STANDARD_TYPE(StepData_UndefinedEntity))) + if (!entent.IsNull() && entent->IsKind(STANDARD_TYPE(StepData_UndefinedEntity))) ent = entent; } else ent = entent; @@ -1087,7 +1291,7 @@ { errmess = new String("Parameter n0.%d (%s) : Entity has illegal type"); //fot not suppported STEP entity - if (entent->IsKind(STANDARD_TYPE(StepData_UndefinedEntity))) + if (!entent.IsNull() && entent->IsKind(STANDARD_TYPE(StepData_UndefinedEntity))) sel.SetValue(entent); } else @@ -1242,7 +1446,7 @@ CleanText (val); }*/ val = new TCollection_HAsciiString(FP.CValue()); - CleanText(val); + cleanText(val); } else { if (acceptvoid && FP.ParamType() == Interface_ParamVoid) warn = Standard_True; errmess = new String("Parameter n0.%d (%s) not a quoted String"); @@ -1526,7 +1730,7 @@ void StepData_StepReaderData::SetEntityNumbers(const Standard_Boolean withmap) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); // Passe initiale : Resolution directe par Map // si tout passe (pas de collision), OK. Sinon, autres passes a prevoir // On resoud du meme coup les sous-listes @@ -1571,7 +1775,7 @@ if (letype == Interface_ParamSub) { Standard_Integer numsub = FP.EntityNumber(); if (numsub > thelastn) { - sout << "Bad Sub.N0, Record " << num << " Param " << na << ":$" << numsub << Message_EndLine; + sout << "Bad Sub.N0, Record " << num << " Param " << na << ":$" << numsub << std::endl; continue; } FP.SetEntityNumber(subn(numsub)); @@ -1583,8 +1787,10 @@ if (num0 > 0) FP.SetEntityNumber(num0); // ET VOILA, on a resolu else FP.SetEntityNumber(-id); // CONFLIT -> faudra resoudre ... } else { // NON RESOLU, si pas pbmap, le dire - FP.SetEntityNumber(-id); - if (pbmap) continue; // pbmap : on se retrouvera + if (pbmap) { + FP.SetEntityNumber(-id); + continue; // pbmap : on se retrouvera + } char failmess[100]; // ... Construire le Check ... sprintf(failmess, @@ -1594,7 +1800,7 @@ // ... Et sortir message un peu plus complet sout << "*** ERR StepReaderData *** Pour Entite #" << ident << "\n Type:" << RecordType(num) - << " Param.n0 " << na << ": #" << id << " Non trouve" << Message_EndLine; + << " Param.n0 " << na << ": #" << id << " Non trouve" << std::endl; } // FIN Mapping } // FIN Traitement Reference } // FIN Boucle Parametres @@ -1661,7 +1867,7 @@ char ligne[80]; sprintf(ligne, "Ident defined SEVERAL TIMES : #%d", ident); thecheck->AddFail(ligne, "Ident defined SEVERAL TIMES : #%d"); - sout << "StepReaderData:SetEntityNumbers, " << ligne << Message_EndLine; + sout << "StepReaderData:SetEntityNumbers, " << ligne << std::endl; } if (indm(indmap) > 0) indm(indmap) = -indm(indmap); // Pas pour Map // Cas Normal pour la Map @@ -1854,7 +2060,7 @@ sout << "*** ERR StepReaderData *** Pour Entite " << nument << ", a " << (nr * 100) / nbseq << "% de DATA : #" << ident << "\n Type:" << RecordType(num) - << " Param.n0 " << na << ": #" << id << " Non trouve" << Message_EndLine; + << " Param.n0 " << na << ": #" << id << " Non trouve" << std::endl; FP.SetEntityNumber(0); // -> Reference non resolue } } diff -Nru opencascade-7.4.1+dfsg1/src/StepData/StepData_StepReaderData.hxx opencascade-7.5.1+dfsg1/src/StepData/StepData_StepReaderData.hxx --- opencascade-7.4.1+dfsg1/src/StepData/StepData_StepReaderData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepData/StepData_StepReaderData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -63,7 +64,7 @@ //! creation time, because it contains arrays) //! nbheader is nb of records for Header, nbtotal for Header+Data //! and nbpar gives the total count of parameters - Standard_EXPORT StepData_StepReaderData(const Standard_Integer nbheader, const Standard_Integer nbtotal, const Standard_Integer nbpar); + Standard_EXPORT StepData_StepReaderData(const Standard_Integer nbheader, const Standard_Integer nbtotal, const Standard_Integer nbpar, const Resource_FormatType theSourceCodePage = Resource_FormatType_UTF8); //! Fills the fields of a record Standard_EXPORT void SetRecord (const Standard_Integer num, const Standard_CString ident, const Standard_CString type, const Standard_Integer nbpar); @@ -349,6 +350,16 @@ //! If found, returns its EntityNumber, else returns Zero. Standard_EXPORT Standard_Integer FindEntityNumber (const Standard_Integer num, const Standard_Integer id) const; + //! Prepare string to use in OCCT exchange structure. + //! If code page is Resource_FormatType_NoConversion, + //! clean only special characters without conversion; + //! else convert a string to UTF8 using the code page + //! and handle the control directives. + Standard_EXPORT void cleanText(const Handle(TCollection_HAsciiString)& theVal) const; + +private: + + TColStd_Array1OfInteger theidents; TColStd_Array1OfInteger thetypes; Interface_IndexedMapOfAsciiString thenametypes; @@ -358,6 +369,7 @@ Standard_Integer thenbhead; Standard_Integer thenbscop; Handle(Interface_Check) thecheck; + Resource_FormatType mySourceCodePage; }; diff -Nru opencascade-7.4.1+dfsg1/src/StepData/StepData_StepReaderTool.cxx opencascade-7.5.1+dfsg1/src/StepData/StepData_StepReaderTool.cxx --- opencascade-7.4.1+dfsg1/src/StepData/StepData_StepReaderTool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepData/StepData_StepReaderTool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -98,7 +98,7 @@ SetEntities(); } catch(Standard_Failure const& anException) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); sout << " Exception Raised during Preparation :\n"; sout << anException.GetMessageString(); sout << "\n Now, trying to continue, but with presomption of failure\n"; @@ -159,7 +159,7 @@ void StepData_StepReaderTool::BeginRead (const Handle(Interface_InterfaceModel)& amodel) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); DeclareAndCast(StepData_StepModel,model,amodel); DeclareAndCast(StepData_StepReaderData,stepdat,Data()); @@ -184,7 +184,7 @@ Handle(Interface_Check) mch = model->GlobalCheck(); Standard_Integer nbmess = ach->NbWarnings(); sout<DynamicType()->Name() << Message_EndLine; + if (!ent.IsNull()) sout << ent->DynamicType()->Name() << std::endl; for (Standard_Integer nf = 1; nf <= nbmess; nf ++) sout << ach->CWarning(nf) << "\n"; } @@ -192,7 +192,7 @@ Handle(Interface_Check) mch = model->GlobalCheck(); Standard_Integer nbmess = ach->NbFails(); sout << " Errors on Reading Header Entity N0."<DynamicType()->Name() << Message_EndLine; + if (!ent.IsNull()) sout << ent->DynamicType()->Name() << std::endl; for (Standard_Integer nf = 1; nf <= nbmess; nf ++) sout << ach->CFail(nf) << "\n"; } diff -Nru opencascade-7.4.1+dfsg1/src/StepData/StepData_UndefinedEntity.cxx opencascade-7.5.1+dfsg1/src/StepData/StepData_UndefinedEntity.cxx --- opencascade-7.4.1+dfsg1/src/StepData/StepData_UndefinedEntity.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepData/StepData_UndefinedEntity.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -67,13 +67,16 @@ Standard_Integer nume = 0; if (partyp == Interface_ParamIdent) { nume = SR->ParamNumber(num,i); + if (nume > 0) { + anent = SR->BoundEntity(nume); + if (anent.IsNull()) { + nume = 0; + } + } if (nume <= 0) { ach->AddFail("A reference to another entity is unresolved"); partyp = Interface_ParamVoid; } - else { - anent = SR->BoundEntity(nume); - } } else if (partyp == Interface_ParamSub) { nume = SR->ParamNumber(num,i); diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/FILES opencascade-7.5.1+dfsg1/src/StepFile/FILES --- opencascade-7.4.1+dfsg1/src/StepFile/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,15 +1,13 @@ -lex.step.c +lex.step.cxx recfile.pc recfile.ph -step.tab.c -step.tab.h -StepFile_CallFailure.cxx -StepFile_CallFailure.hxx +step.tab.cxx +step.tab.hxx StepFile_Read.cxx StepFile_Read.hxx -StepFile_Transfer.hxx -stepread.c +stepread.cxx stepread.ph step.lex step.yacc - +FlexLexer.h +location.hh diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/FlexLexer.h opencascade-7.5.1+dfsg1/src/StepFile/FlexLexer.h --- opencascade-7.4.1+dfsg1/src/StepFile/FlexLexer.h 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/FlexLexer.h 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,220 @@ +// -*-C++-*- +// FlexLexer.h -- define interfaces for lexical analyzer classes generated +// by flex + +// Copyright (c) 1993 The Regents of the University of California. +// All rights reserved. +// +// This code is derived from software contributed to Berkeley by +// Kent Williams and Tom Epperly. +// +// 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. + +// Neither the name of the University nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. + +// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE. + +// This file defines FlexLexer, an abstract class which specifies the +// external interface provided to flex C++ lexer objects, and yyFlexLexer, +// which defines a particular lexer class. +// +// If you want to create multiple lexer classes, you use the -P flag +// to rename each yyFlexLexer to some other xxFlexLexer. You then +// include in your other sources once per lexer class: +// +// #undef yyFlexLexer +// #define yyFlexLexer xxFlexLexer +// #include +// +// #undef yyFlexLexer +// #define yyFlexLexer zzFlexLexer +// #include +// ... + +#ifndef __FLEX_LEXER_H +// Never included before - need to define base class. +#define __FLEX_LEXER_H + +#include + +extern "C++" { + +struct yy_buffer_state; +typedef int yy_state_type; + +class FlexLexer +{ +public: + virtual ~FlexLexer() { } + + const char* YYText() const { return yytext; } + int YYLeng() const { return yyleng; } + + virtual void + yy_switch_to_buffer( yy_buffer_state* new_buffer ) = 0; + virtual yy_buffer_state* yy_create_buffer( std::istream* s, int size ) = 0; + virtual yy_buffer_state* yy_create_buffer( std::istream& s, int size ) = 0; + virtual void yy_delete_buffer( yy_buffer_state* b ) = 0; + virtual void yyrestart( std::istream* s ) = 0; + virtual void yyrestart( std::istream& s ) = 0; + + virtual int yylex() = 0; + + // Call yylex with new input/output sources. + int yylex( std::istream& new_in, std::ostream& new_out ) + { + switch_streams( new_in, new_out ); + return yylex(); + } + + int yylex( std::istream* new_in, std::ostream* new_out = 0) + { + switch_streams( new_in, new_out ); + return yylex(); + } + + // Switch to new input/output streams. A nil stream pointer + // indicates "keep the current one". + virtual void switch_streams( std::istream* new_in, + std::ostream* new_out ) = 0; + virtual void switch_streams( std::istream& new_in, + std::ostream& new_out ) = 0; + + int lineno() const { return yylineno; } + + int debug() const { return yy_flex_debug; } + void set_debug( int flag ) { yy_flex_debug = flag; } + +protected: + char* yytext; + int yyleng; + int yylineno; // only maintained if you use %option yylineno + int yy_flex_debug; // only has effect with -d or "%option debug" +}; + +} +#endif // FLEXLEXER_H + +#if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce) +// Either this is the first time through (yyFlexLexerOnce not defined), +// or this is a repeated include to define a different flavor of +// yyFlexLexer, as discussed in the flex manual. +# define yyFlexLexerOnce + +extern "C++" { + +class yyFlexLexer : public FlexLexer { +public: + // arg_yyin and arg_yyout default to the cin and cout, but we + // only make that assignment when initializing in yylex(). + yyFlexLexer( std::istream& arg_yyin, std::ostream& arg_yyout ); + yyFlexLexer( std::istream* arg_yyin = 0, std::ostream* arg_yyout = 0 ); +private: + void ctor_common(); + +public: + + virtual ~yyFlexLexer(); + + void yy_switch_to_buffer( yy_buffer_state* new_buffer ); + yy_buffer_state* yy_create_buffer( std::istream* s, int size ); + yy_buffer_state* yy_create_buffer( std::istream& s, int size ); + void yy_delete_buffer( yy_buffer_state* b ); + void yyrestart( std::istream* s ); + void yyrestart( std::istream& s ); + + void yypush_buffer_state( yy_buffer_state* new_buffer ); + void yypop_buffer_state(); + + virtual int yylex(); + virtual void switch_streams( std::istream& new_in, std::ostream& new_out ); + virtual void switch_streams( std::istream* new_in = 0, std::ostream* new_out = 0 ); + virtual int yywrap(); + +protected: + virtual int LexerInput( char* buf, int max_size ); + virtual void LexerOutput( const char* buf, int size ); + virtual void LexerError( const char* msg ); + + void yyunput( int c, char* buf_ptr ); + int yyinput(); + + void yy_load_buffer_state(); + void yy_init_buffer( yy_buffer_state* b, std::istream& s ); + void yy_flush_buffer( yy_buffer_state* b ); + + int yy_start_stack_ptr; + int yy_start_stack_depth; + int* yy_start_stack; + + void yy_push_state( int new_state ); + void yy_pop_state(); + int yy_top_state(); + + yy_state_type yy_get_previous_state(); + yy_state_type yy_try_NUL_trans( yy_state_type current_state ); + int yy_get_next_buffer(); + + std::istream yyin; // input source for default LexerInput + std::ostream yyout; // output sink for default LexerOutput + + // yy_hold_char holds the character lost when yytext is formed. + char yy_hold_char; + + // Number of characters read into yy_ch_buf. + int yy_n_chars; + + // Points to current character in buffer. + char* yy_c_buf_p; + + int yy_init; // whether we need to initialize + int yy_start; // start state number + + // Flag which is used to allow yywrap()'s to do buffer switches + // instead of setting up a fresh yyin. A bit of a hack ... + int yy_did_buffer_switch_on_eof; + + + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + yy_buffer_state ** yy_buffer_stack; /**< Stack as an array. */ + void yyensure_buffer_stack(void); + + // The following are not always needed, but may be depending + // on use of certain flex features (like REJECT or yymore()). + + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + yy_state_type* yy_state_buf; + yy_state_type* yy_state_ptr; + + char* yy_full_match; + int* yy_full_state; + int yy_full_lp; + + int yy_lp; + int yy_looking_for_trail_begin; + + int yy_more_flag; + int yy_more_len; + int yy_more_offset; + int yy_prev_more_offset; +}; + +} + +#endif // yyFlexLexer || ! yyFlexLexerOnce diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/lex.step.c opencascade-7.5.1+dfsg1/src/StepFile/lex.step.c --- opencascade-7.4.1+dfsg1/src/StepFile/lex.step.c 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/lex.step.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1842 +0,0 @@ -#define yy_create_buffer step_create_buffer -#define yy_delete_buffer step_delete_buffer -#define yy_scan_buffer step_scan_buffer -#define yy_scan_string step_scan_string -#define yy_scan_bytes step_scan_bytes -#define yy_flex_debug step_flex_debug -#define yy_init_buffer step_init_buffer -#define yy_flush_buffer step_flush_buffer -#define yy_load_buffer_state step_load_buffer_state -#define yy_switch_to_buffer step_switch_to_buffer -#define yyin stepin -#define yyleng stepleng -#define yylex steplex -#define yyout stepout -#define yyrestart steprestart -#define yytext steptext -#define yywrap stepwrap - -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.89 96/05/25 21:02:21 vern Exp $ - */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 - -#include - -#ifdef _MSC_VER -# include -# include -#endif /* _MSC_VER */ - - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include -#include - -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef __TURBOC__ - #pragma warn -rch - #pragma warn -use -#include -#include -#define YY_USE_CONST -#define YY_USE_PROTOS -#endif - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yy_start = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yy_start - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#define YY_BUF_SIZE 16384 - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -extern int yyleng; -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, yytext_ptr ) - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ -typedef unsigned int yy_size_t; - - -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - }; - -static YY_BUFFER_STATE yy_current_buffer = 0; - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) - - -#define YY_USES_REJECT -typedef unsigned char YY_CHAR; -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; -typedef int yy_state_type; -extern char *yytext; -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yy_c_buf_p = yy_cp; - -#define YY_NUM_RULES 37 -#define YY_END_OF_BUFFER 38 -static yyconst short int yy_acclist[146] = - { 0, - 38, 36, 37, 1, 36, 37, 3, 36, 37, 4, - 36, 37, 2, 36, 37, 36, 37, 36, 37, 36, - 37, 18, 36, 37, 36, 37, 36, 37, 15, 36, - 37, 16, 37, 36, 37, 9, 36, 37, 17, 36, - 37, 36, 37, 31, 36, 37, 9, 34, 36, 37, - 20, 36, 37, 19, 36, 37, 34, 36, 37, 34, - 36, 37, 34, 36, 37, 34, 36, 37, 34, 36, - 37, 34, 36, 37, 5, 36, 37, 35, 8,16391, - 12, 22, 10, 9, 10, 10, 21, 9, 10, 34, - 34, 34, 34, 34, 34, 34, 5, 13, 6, 8199, - - 10, 14, 14, 34, 34, 34, 34, 34, 34, 8199, - 11, 11, 11, 34, 34, 34, 34, 34, 30, 34, - 11, 11, 11, 34, 26, 34, 34, 34, 34, 23, - 32, 34, 34, 34, 34, 34, 25, 34, 24, 29, - 33, 34, 27, 28, 28 - } ; - -static yyconst short int yy_accept[109] = - { 0, - 1, 1, 1, 2, 4, 7, 10, 13, 16, 18, - 20, 22, 25, 27, 29, 32, 34, 36, 39, 42, - 44, 47, 51, 54, 57, 60, 63, 66, 69, 72, - 75, 78, 79, 79, 81, 81, 81, 81, 82, 83, - 84, 86, 87, 87, 88, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 99, 101, 101, 101, 103, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 111, 112, - 113, 115, 116, 116, 117, 118, 118, 119, 120, 121, - 121, 122, 123, 125, 126, 126, 127, 128, 129, 130, - 131, 132, 132, 133, 134, 135, 136, 136, 137, 138, - - 139, 140, 140, 141, 143, 145, 146, 146 - } ; - -static yyconst int yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 6, 7, 8, 9, 10, 4, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 4, 22, 4, - 23, 4, 4, 4, 24, 25, 26, 27, 28, 25, - 29, 30, 31, 29, 29, 29, 29, 32, 33, 34, - 29, 35, 36, 37, 29, 29, 29, 29, 29, 29, - 4, 4, 4, 4, 29, 4, 38, 38, 38, 38, - - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 4, 4, 4, 4, 1, 1, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4 - } ; - -static yyconst int yy_meta[40] = - { 0, - 1, 2, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 5, 2, 2, 5, 5, 5, 5, 5, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 7, 2 - } ; - -static yyconst short int yy_base[114] = - { 0, - 0, 0, 209, 210, 210, 210, 210, 210, 0, 0, - 187, 210, 171, 37, 210, 210, 186, 22, 210, 23, - 190, 26, 210, 210, 185, 27, 29, 31, 33, 34, - 164, 0, 194, 52, 175, 52, 53, 188, 210, 49, - 53, 57, 180, 210, 61, 179, 47, 60, 38, 64, - 67, 158, 210, 86, 210, 163, 75, 79, 83, 210, - 87, 91, 93, 94, 98, 99, 210, 161, 173, 103, - 104, 41, 158, 108, 107, 110, 0, 210, 118, 139, - 144, 120, 123, 210, 125, 119, 124, 127, 95, 210, - 210, 61, 128, 129, 130, 134, 136, 140, 210, 141, - - 210, 148, 210, 71, 0, 0, 210, 166, 62, 172, - 176, 179, 186 - } ; - -static yyconst short int yy_def[114] = - { 0, - 107, 1, 107, 107, 107, 107, 107, 107, 108, 109, - 107, 107, 107, 110, 107, 107, 107, 107, 107, 111, - 107, 112, 107, 107, 112, 112, 112, 112, 112, 112, - 107, 108, 109, 107, 107, 110, 110, 107, 107, 107, - 107, 111, 111, 107, 112, 112, 112, 112, 112, 112, - 112, 107, 107, 107, 107, 107, 107, 107, 111, 107, - 112, 112, 112, 112, 112, 112, 107, 107, 107, 111, - 112, 112, 107, 112, 112, 107, 65, 107, 112, 107, - 107, 111, 112, 107, 107, 112, 112, 112, 112, 107, - 107, 107, 112, 112, 112, 112, 107, 112, 107, 112, - - 107, 107, 107, 112, 113, 113, 0, 107, 107, 107, - 107, 107, 107 - } ; - -static yyconst short int yy_nxt[250] = - { 0, - 4, 5, 6, 4, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 18, 20, 21, - 22, 23, 24, 25, 25, 25, 26, 27, 25, 28, - 29, 25, 25, 25, 25, 30, 25, 25, 31, 37, - 40, 40, 41, 42, 40, 107, 45, 107, 38, 107, - 47, 107, 107, 54, 37, 37, 107, 54, 49, 107, - 48, 64, 84, 38, 38, 107, 33, 40, 50, 40, - 51, 40, 34, 41, 55, 58, 57, 42, 107, 40, - 57, 45, 107, 62, 59, 107, 63, 54, 61, 107, - 69, 54, 69, 97, 66, 69, 65, 40, 69, 40, - - 69, 60, 69, 70, 69, 107, 57, 71, 67, 107, - 73, 107, 107, 107, 72, 76, 107, 107, 77, 78, - 75, 60, 107, 82, 83, 107, 107, 76, 74, 96, - 76, 78, 79, 86, 89, 87, 107, 107, 60, 90, - 82, 107, 107, 83, 88, 107, 107, 107, 107, 94, - 99, 93, 107, 102, 95, 101, 102, 103, 107, 107, - 92, 98, 105, 100, 81, 102, 91, 104, 102, 103, - 32, 32, 32, 36, 36, 36, 36, 36, 36, 43, - 43, 43, 46, 46, 46, 46, 106, 106, 85, 106, - 106, 106, 106, 81, 80, 68, 52, 107, 60, 36, - - 56, 53, 52, 107, 44, 39, 35, 34, 107, 3, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107 - } ; - -static yyconst short int yy_chk[250] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, - 18, 20, 18, 20, 22, 26, 22, 27, 14, 28, - 26, 29, 30, 34, 36, 37, 49, 34, 28, 72, - 27, 49, 72, 36, 37, 47, 109, 40, 29, 40, - 30, 41, 34, 41, 34, 42, 40, 42, 48, 45, - 41, 45, 50, 47, 42, 51, 48, 54, 45, 104, - 57, 54, 57, 92, 51, 57, 50, 58, 59, 58, - - 59, 59, 61, 59, 61, 61, 58, 61, 54, 62, - 63, 63, 64, 89, 62, 65, 65, 66, 65, 65, - 64, 70, 71, 70, 71, 75, 74, 76, 63, 89, - 76, 76, 66, 74, 75, 74, 79, 86, 82, 79, - 82, 83, 87, 83, 74, 88, 93, 94, 95, 87, - 94, 86, 96, 97, 88, 96, 97, 97, 98, 100, - 85, 93, 100, 95, 81, 102, 80, 98, 102, 102, - 108, 108, 108, 110, 110, 110, 110, 110, 110, 111, - 111, 111, 112, 112, 112, 112, 113, 113, 73, 113, - 113, 113, 113, 69, 68, 56, 52, 46, 43, 38, - - 35, 33, 31, 25, 21, 17, 13, 11, 3, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107 - } ; - -static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; -static char *yy_full_match; -static int yy_lp; -static int yy_looking_for_trail_begin = 0; -static int yy_full_lp; -static int *yy_full_state; -#define YY_TRAILING_MASK 0x2000 -#define YY_TRAILING_HEAD_MASK 0x4000 -#define REJECT \ -{ \ -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ -yy_cp = yy_full_match; /* restore poss. backed-over text */ \ -yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \ -yy_state_ptr = yy_full_state; /* restore orig. state */ \ -yy_current_state = *yy_state_ptr; /* restore curr. state */ \ -++yy_lp; \ -goto find_rule; \ -} -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *yytext; -#define INITIAL 0 -/* - Copyright (c) 1999-2014 OPEN CASCADE SAS - - This file is part of Open CASCADE Technology software library. - - This library is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License version 2.1 as published - by the Free Software Foundation, with special exception defined in the file - OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT - distribution for complete text of the license and disclaimer of any warranty. - - Alternatively, this file may be used under the terms of Open CASCADE - commercial license or contractual agreement. -*/ -#include "step.tab.h" -#include "recfile.ph" -#include "stdio.h" -#include - -/* skl 31.01.2002 for OCC133(OCC96,97) - uncorrect -long string in files Henri.stp and 401.stp*/ -#define YY_FATAL_ERROR(msg) StepFile_CallFailure( msg ) - -/* abv 07.06.02: force inclusion of stdlib.h on WNT to avoid warnings */ -#include - -/* -void steperror ( FILE *input_file ); -void steprestart ( FILE *input_file ); -*/ -void rec_restext(char *newtext, int lentext); -void rec_typarg(int argtype); - - int steplineno; /* Comptage de ligne (ben oui, fait tout faire) */ - - int modcom = 0; /* Commentaires type C */ - int modend = 0; /* Flag for finishing of the STEP file */ - void resultat () /* Resultat alloue dynamiquement, "jete" une fois lu */ - { if (modcom == 0) rec_restext(yytext,yyleng); } - -// MSVC specifics -#ifdef _MSC_VER - -// disable MSVC warnings in flex code -// Note that Intel compiler also defines _MSC_VER but has different warning ids -#if defined(__INTEL_COMPILER) -#pragma warning(disable:177 1786 1736) -#else -#pragma warning(disable:4131 4244 4273 4267 4127) -#endif - -// Avoid includion of unistd.h if parser is generated on Linux (flex 2.5.35) -#define YY_NO_UNISTD_H - -#endif - -// disable GCC warnings in flex code -#ifdef __GNUC__ -#pragma GCC diagnostic ignored "-Wunused-function" -#endif - - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); -#else -extern int yywrap YY_PROTO(( void )); -#endif -#endif - -#ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen YY_PROTO(( yyconst char * )); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -#endif - -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ - -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( yy_current_buffer->yy_is_interactive ) \ - { \ - int c = '*', n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ - && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL int yylex YY_PROTO(( void )) -#endif - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - - - - if ( yy_init ) - { - yy_init = 0; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = yy_start; - yy_state_ptr = yy_state_buf; - *yy_state_ptr++ = yy_current_state; -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 108 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - *yy_state_ptr++ = yy_current_state; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 210 ); - -yy_find_action: - yy_current_state = *--yy_state_ptr; - yy_lp = yy_accept[yy_current_state]; -find_rule: /* we branch to this label when backing up */ - for ( ; ; ) /* until we find what rule we matched */ - { - if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) - { - yy_act = yy_acclist[yy_lp]; - if ( yy_act & YY_TRAILING_HEAD_MASK || - yy_looking_for_trail_begin ) - { - if ( yy_act == yy_looking_for_trail_begin ) - { - yy_looking_for_trail_begin = 0; - yy_act &= ~YY_TRAILING_HEAD_MASK; - break; - } - } - else if ( yy_act & YY_TRAILING_MASK ) - { - yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK; - yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK; - } - else - { - yy_full_match = yy_cp; - yy_full_state = yy_state_ptr; - yy_full_lp = yy_lp; - break; - } - ++yy_lp; - goto find_rule; - } - --yy_cp; - yy_current_state = *--yy_state_ptr; - yy_lp = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - -do_action: /* This label is used only to access EOF actions. */ - - - switch ( yy_act ) - { /* beginning of action switch */ -case 1: -YY_RULE_SETUP -{;} - YY_BREAK -case 2: -YY_RULE_SETUP -{;} - YY_BREAK -case 3: -YY_RULE_SETUP -{ steplineno ++; } - YY_BREAK -case 4: -YY_RULE_SETUP -{;} /* abv 30.06.00: for reading DOS files */ - YY_BREAK -case 5: -YY_RULE_SETUP -{;} /* fix from C21. for test load e3i file with line 15 with null symbols */ - YY_BREAK -case 6: -*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ -yy_c_buf_p = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up yytext again */ -YY_RULE_SETUP -{ resultat(); if (modcom == 0) return(ENTITY); } - YY_BREAK -case 7: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) return(ENTITY); } - YY_BREAK -case 8: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) return(IDENT); } - YY_BREAK -case 9: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) { rec_typarg(rec_argInteger); return(QUID); } } - YY_BREAK -case 10: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) { rec_typarg(rec_argFloat); return(QUID); } } - YY_BREAK -case 11: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) { rec_typarg(rec_argFloat); return(QUID); } } - YY_BREAK -case 12: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) { rec_typarg(rec_argText); return(QUID); } } - YY_BREAK -case 13: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) { rec_typarg(rec_argHexa); return(QUID); } } - YY_BREAK -case 14: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) { rec_typarg(rec_argEnum); return(QUID); } } - YY_BREAK -case 15: -YY_RULE_SETUP -{ if (modcom == 0) return ('('); } - YY_BREAK -case 16: -YY_RULE_SETUP -{ if (modcom == 0) return (')'); } - YY_BREAK -case 17: -YY_RULE_SETUP -{ if (modcom == 0) return (','); } - YY_BREAK -case 18: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) { rec_typarg(rec_argNondef); return(QUID); } } - YY_BREAK -case 19: -YY_RULE_SETUP -{ if (modcom == 0) return ('='); } - YY_BREAK -case 20: -YY_RULE_SETUP -{ if (modcom == 0) return (';'); } - YY_BREAK -case 21: -YY_RULE_SETUP -{ modcom = 1; } - YY_BREAK -case 22: -YY_RULE_SETUP -{ if (modend == 0) modcom = 0; } - YY_BREAK -case 23: -YY_RULE_SETUP -{ if (modcom == 0) return(STEP); } - YY_BREAK -case 24: -YY_RULE_SETUP -{ if (modcom == 0) return(HEADER); } - YY_BREAK -case 25: -YY_RULE_SETUP -{ if (modcom == 0) return(ENDSEC); } - YY_BREAK -case 26: -YY_RULE_SETUP -{ if (modcom == 0) return(DATA); } - YY_BREAK -case 27: -YY_RULE_SETUP -{ if (modend == 0) {modcom = 0; return(ENDSTEP);} } - YY_BREAK -case 28: -YY_RULE_SETUP -{ if (modend == 0) {modcom = 0; return(ENDSTEP);} } - YY_BREAK -case 29: -YY_RULE_SETUP -{ modcom = 1; modend = 1; return(ENDSTEP); } - YY_BREAK -case 30: -YY_RULE_SETUP -{ if (modend == 0) {modcom = 0; return(STEP); } } - YY_BREAK -case 31: -YY_RULE_SETUP -{ if (modcom == 0) return ('/'); } - YY_BREAK -case 32: -YY_RULE_SETUP -{ if (modcom == 0) return(SCOPE); } - YY_BREAK -case 33: -YY_RULE_SETUP -{ if (modcom == 0) return(ENDSCOPE); } - YY_BREAK -case 34: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) return(TYPE); } - YY_BREAK -case 35: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) return(TYPE); } - YY_BREAK -case 36: -YY_RULE_SETUP -{ resultat(); if (modcom == 0) { rec_typarg(rec_argMisc); return(QUID); } } - YY_BREAK -case 37: -YY_RULE_SETUP -ECHO; - YY_BREAK - case YY_STATE_EOF(INITIAL): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yy_hold_char; - YY_RESTORE_YY_MORE_OFFSET - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between yy_current_buffer and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yy_n_chars = yy_current_buffer->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yy_c_buf_p; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = - yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of yylex */ - - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ - -static int yy_get_next_buffer() - { - register char *dest = yy_current_buffer->yy_ch_buf; - register char *source = yytext_ptr; - register int number_to_move, i; - int ret_val; - - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( yy_current_buffer->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - yy_n_chars = 0; - - else - { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = yy_current_buffer; - - int yy_c_buf_p_offset = - (int) (yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yy_flex_realloc( (void *) b->yy_ch_buf, - b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = yy_current_buffer->yy_buf_size - - number_to_move - 1; -#endif - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - } - - if ( yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; - - return ret_val; - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -static yy_state_type yy_get_previous_state() - { - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = yy_start; - yy_state_ptr = yy_state_buf; - *yy_state_ptr++ = yy_current_state; - - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 39); - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 108 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - *yy_state_ptr++ = yy_current_state; - } - - return yy_current_state; - } - - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif - { - register int yy_is_jam; - - register YY_CHAR yy_c = 39; - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 108 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 107); - if ( ! yy_is_jam ) - *yy_state_ptr++ = yy_current_state; - - return yy_is_jam ? 0 : yy_current_state; - } - - -#ifndef YY_NO_UNPUT -#ifdef YY_USE_PROTOS -static void yyunput( int c, register char *yy_bp ) -#else -static void yyunput( c, yy_bp ) -int c; -register char *yy_bp; -#endif - { - register char *yy_cp = yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - register int number_to_move = yy_n_chars + 2; - register char *dest = &yy_current_buffer->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; - register char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; - - while ( source > yy_current_buffer->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - yy_n_chars = yy_current_buffer->yy_buf_size; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - - yytext_ptr = yy_bp; - yy_hold_char = *yy_cp; - yy_c_buf_p = yy_cp; - } -#endif /* ifndef YY_NO_UNPUT */ - - -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif - { - int c; - - *yy_c_buf_p = yy_hold_char; - - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* This was really a NUL. */ - *yy_c_buf_p = '\0'; - - else - { /* need more input */ - int offset = yy_c_buf_p - yytext_ptr; - ++yy_c_buf_p; - - switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - { - yy_c_buf_p = yytext_ptr + offset; - return EOF; - } - - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + offset; - break; - - case EOB_ACT_LAST_MATCH: -#ifdef __cplusplus - YY_FATAL_ERROR( - "unexpected last match in yyinput()" ); -#else - YY_FATAL_ERROR( - "unexpected last match in input()" ); -#endif - } - } - } - - c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ - *yy_c_buf_p = '\0'; /* preserve yytext */ - yy_hold_char = *++yy_c_buf_p; - - - return c; - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - { - if ( yy_current_buffer == new_buffer ) - return; - - if ( yy_current_buffer ) - { - /* Flush out information for old buffer. */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file ); - - return b; - } - - -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - { - if ( ! b ) - return; - - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); - - yy_flex_free( (void *) b ); - } - - -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - - - { - yy_flush_buffer( b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif - } - - -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#endif - - { - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == yy_current_buffer ) - yy_load_buffer_state(); - } - - -#ifndef YY_NO_SCAN_BUFFER -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b ); - - return b; - } -#endif - - -#ifndef YY_NO_SCAN_STRING -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *str ) -#else -YY_BUFFER_STATE yy_scan_string( str ) -yyconst char *str; -#endif - { - int len; - for ( len = 0; str[len]; ++len ) - ; - - return yy_scan_bytes( str, len ); - } -#endif - - -#ifndef YY_NO_SCAN_BYTES -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; - } -#endif - - -#ifndef YY_NO_PUSH_STATE -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; -#endif - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); - - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); - - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); - - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } - - yy_start_stack[yy_start_stack_ptr++] = YY_START; - - BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -static void yy_pop_state() - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -static int yy_top_state() - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } - - - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - - -/* Internal utility routines. */ - -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; - } -#endif - -#ifdef YY_NEED_STRLEN -#ifdef YY_USE_PROTOS -static int yy_flex_strlen( yyconst char *s ) -#else -static int yy_flex_strlen( s ) -yyconst char *s; -#endif - { - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; - } -#endif - - -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); - } - -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } - -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/lex.step.cxx opencascade-7.5.1+dfsg1/src/StepFile/lex.step.cxx --- opencascade-7.4.1+dfsg1/src/StepFile/lex.step.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/lex.step.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,2193 @@ +#line 30 "D:/ABV/OCCT/occt/src/StepFile/step.lex" +// This file is part of Open CASCADE Technology software library. +// This file is generated, do not modify it directly; edit source file step.lex instead. + +// Pre-include stdlib.h to avoid redefinition of integer type macros (INT8_MIN and similar in generated code) +#if !defined(_MSC_VER) || (_MSC_VER >= 1600) // Visual Studio 2010+ +#include "stdint.h" +#endif + + + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + + + + + + + + + + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + + + + + + + + + + + + + + /* The c++ scanner is a mess. The FlexLexer.h header file relies on the + * following macro. This is required in order to pass the c++-multiple-scanners + * test in the regression suite. We get reports that it breaks inheritance. + * We will address this in a future release of flex, or omit the C++ scanner + * altogether. + */ + #define yyFlexLexer stepFlexLexer + + + + + + + +#ifdef yyalloc +#define stepalloc_ALREADY_DEFINED +#else +#define yyalloc stepalloc +#endif + + +#ifdef yyrealloc +#define steprealloc_ALREADY_DEFINED +#else +#define yyrealloc steprealloc +#endif + + +#ifdef yyfree +#define stepfree_ALREADY_DEFINED +#else +#define yyfree stepfree +#endif + + + + + + + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + + +/* begin standard C++ headers. */ +#include +#include +#include +#include +#include +/* end standard C++ headers. */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + + +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. + */ +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) +#define YY_END_OF_BUFFER_CHAR 0 + + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + + + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +extern int yyleng; + + + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) +#define unput(c) yyunput( c, (yytext_ptr) ) + + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + + std::streambuf* yy_input_file; + + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + + + + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + + + + +void *yyalloc ( yy_size_t ); +void *yyrealloc ( void *, yy_size_t ); +void yyfree ( void * ); + + +#define yy_new_buffer yy_create_buffer +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + + +/* Begin user sect3 */ +#define YY_SKIP_YYWRAP +typedef flex_uint8_t YY_CHAR; + +#define yytext_ptr yytext +#define YY_INTERACTIVE + + +#include + +int yyFlexLexer::yywrap() { return 1; } +int yyFlexLexer::yylex() + { + LexerError( "yyFlexLexer::yylex invoked but %option yyclass used" ); + return 0; + } + +#define YY_DECL int step::scanner::yylex() + + + + + + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + (yytext_ptr) -= (yy_more_len); \ + yyleng = (int) (yy_cp - (yytext_ptr)); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; +#define YY_NUM_RULES 44 +#define YY_END_OF_BUFFER 45 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static const flex_int16_t yy_acclist[166] = + { 0, + 2, 2, 45, 42, 44, 10, 42, 44, 12, 42, + 44, 13, 42, 44, 11, 42, 44, 42, 44, 42, + 44, 42, 44, 26, 42, 44, 42, 44, 5, 42, + 44, 23, 42, 44, 24, 44, 18, 42, 44, 25, + 42, 44, 42, 44, 37, 42, 44, 18, 40, 42, + 44, 28, 42, 44, 27, 42, 44, 40, 42, 44, + 40, 42, 44, 40, 42, 44, 40, 42, 44, 40, + 42, 44, 40, 42, 44, 14, 42, 44, 2, 44, + 12, 44, 3, 44, 43, 44, 8, 44, 6, 12, + 44, 7, 44, 41, 17,16400, 19, 18, 19, 19, + + 1, 18, 19, 40, 40, 40, 40, 40, 40, 40, + 14, 2, 3, 3, 4, 8, 9, 21, 15, 8208, + 19, 22, 22, 40, 40, 40, 40, 40, 40, 8208, + 20, 20, 20, 40, 40, 40, 40, 40, 36, 40, + 20, 20, 20, 40, 32, 40, 40, 40, 40, 29, + 38, 40, 40, 40, 40, 40, 31, 40, 30, 35, + 39, 40, 33, 34, 34 + } ; + +static const flex_int16_t yy_accept[124] = + { 0, + 1, 1, 1, 2, 3, 3, 3, 3, 3, 4, + 6, 9, 12, 15, 18, 20, 22, 24, 27, 29, + 32, 35, 37, 40, 43, 45, 48, 52, 55, 58, + 61, 64, 67, 70, 73, 76, 79, 81, 83, 85, + 87, 89, 92, 94, 95, 95, 97, 97, 98, 100, + 101, 101, 102, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 117, 118, 119, 119, + 121, 121, 121, 123, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 131, 132, 133, 135, 136, 136, 137, + 138, 138, 139, 140, 141, 141, 142, 143, 145, 146, + + 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, + 155, 156, 156, 157, 158, 159, 160, 160, 161, 163, + 165, 166, 166 + } ; + +static const YY_CHAR yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 5, 6, 7, 8, 9, 1, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 1, 21, 1, + 22, 1, 1, 1, 23, 24, 25, 26, 27, 24, + 28, 29, 30, 28, 28, 28, 28, 31, 32, 33, + 28, 34, 35, 36, 28, 28, 28, 28, 28, 28, + 1, 1, 1, 1, 28, 1, 37, 37, 37, 37, + + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static const YY_CHAR yy_meta[39] = + { 0, + 1, 1, 2, 3, 3, 1, 3, 1, 1, 1, + 4, 1, 3, 5, 1, 3, 1, 6, 1, 7, + 1, 1, 7, 7, 7, 7, 7, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 9, 1 + } ; + +static const flex_int16_t yy_base[135] = + { 0, + 0, 0, 36, 37, 264, 263, 38, 41, 265, 268, + 268, 268, 268, 268, 0, 0, 244, 268, 228, 268, + 268, 268, 25, 268, 28, 248, 35, 268, 268, 243, + 24, 36, 38, 39, 40, 222, 0, 268, 45, 268, + 0, 268, 47, 0, 252, 64, 233, 50, 53, 61, + 239, 268, 65, 238, 54, 69, 71, 43, 64, 217, + 0, 79, 82, 268, 0, 84, 268, 268, 97, 268, + 222, 88, 86, 92, 268, 100, 93, 104, 105, 107, + 96, 268, 213, 217, 112, 115, 116, 205, 118, 120, + 129, 0, 268, 123, 199, 200, 122, 133, 268, 182, + + 130, 134, 137, 44, 268, 268, 144, 138, 139, 140, + 145, 148, 143, 268, 154, 268, 157, 268, 149, 0, + 0, 268, 178, 187, 196, 199, 119, 203, 206, 215, + 224, 233, 241, 244 + } ; + +static const flex_int16_t yy_def[135] = + { 0, + 122, 1, 123, 123, 124, 124, 125, 125, 122, 122, + 122, 122, 122, 122, 126, 127, 122, 122, 122, 122, + 122, 122, 122, 122, 128, 122, 129, 122, 122, 129, + 129, 129, 129, 129, 129, 122, 130, 122, 131, 122, + 132, 122, 133, 126, 127, 122, 122, 122, 122, 128, + 128, 122, 129, 129, 129, 129, 129, 129, 129, 122, + 130, 131, 131, 122, 132, 133, 122, 122, 122, 122, + 122, 122, 122, 128, 122, 129, 129, 129, 129, 129, + 129, 122, 122, 122, 128, 129, 129, 122, 129, 129, + 122, 80, 122, 129, 122, 122, 128, 129, 122, 122, + + 129, 129, 129, 129, 122, 122, 122, 129, 129, 129, + 129, 122, 129, 122, 129, 122, 122, 122, 129, 134, + 134, 0, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122 + } ; + +static const flex_int16_t yy_nxt[307] = + { 0, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 10, 23, 24, 23, 25, 26, 27, + 28, 29, 30, 30, 30, 31, 32, 30, 33, 34, + 30, 30, 30, 30, 35, 30, 30, 36, 38, 38, + 42, 122, 48, 42, 49, 48, 55, 50, 43, 39, + 39, 43, 48, 122, 53, 122, 122, 122, 63, 67, + 122, 122, 67, 64, 57, 69, 56, 48, 69, 48, + 48, 122, 49, 58, 80, 59, 72, 111, 73, 72, + 50, 122, 48, 46, 53, 70, 122, 74, 122, 77, + 81, 76, 122, 79, 78, 63, 67, 122, 69, 67, + + 64, 69, 84, 48, 84, 48, 84, 84, 84, 75, + 122, 85, 72, 122, 84, 87, 84, 122, 82, 86, + 88, 122, 122, 91, 122, 45, 92, 93, 94, 75, + 90, 97, 122, 122, 98, 122, 99, 122, 89, 75, + 122, 97, 101, 105, 102, 91, 104, 122, 91, 93, + 122, 122, 98, 103, 122, 122, 122, 122, 109, 114, + 122, 108, 122, 110, 117, 116, 122, 117, 118, 119, + 113, 122, 115, 117, 120, 112, 117, 118, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, + + 41, 41, 41, 41, 41, 44, 44, 44, 51, 51, + 51, 54, 54, 54, 54, 61, 107, 61, 61, 96, + 61, 61, 61, 61, 62, 106, 62, 62, 62, 62, + 62, 62, 62, 65, 100, 65, 96, 65, 65, 65, + 65, 65, 66, 66, 121, 95, 121, 121, 121, 121, + 121, 121, 121, 83, 60, 122, 75, 71, 68, 60, + 122, 52, 47, 46, 122, 38, 38, 9, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + + 122, 122, 122, 122, 122, 122 + } ; + +static const flex_int16_t yy_chk[307] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 4, + 7, 31, 23, 8, 23, 25, 31, 25, 7, 3, + 4, 8, 27, 32, 27, 33, 34, 35, 39, 43, + 58, 104, 43, 39, 33, 46, 32, 48, 46, 48, + 49, 55, 49, 34, 58, 35, 48, 104, 50, 49, + 50, 59, 53, 46, 53, 46, 56, 50, 57, 55, + 59, 53, 62, 57, 56, 63, 66, 62, 69, 66, + + 63, 69, 72, 73, 72, 73, 74, 72, 74, 74, + 77, 74, 73, 81, 76, 77, 76, 76, 69, 76, + 78, 78, 79, 80, 80, 127, 80, 80, 81, 85, + 79, 85, 86, 87, 86, 89, 87, 90, 78, 97, + 94, 97, 89, 94, 89, 91, 90, 101, 91, 91, + 98, 102, 98, 89, 103, 108, 109, 110, 102, 109, + 113, 101, 111, 103, 112, 111, 119, 112, 112, 113, + 108, 115, 110, 117, 115, 107, 117, 117, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, + + 125, 125, 125, 125, 125, 126, 126, 126, 128, 128, + 128, 129, 129, 129, 129, 130, 100, 130, 130, 96, + 130, 130, 130, 130, 131, 95, 131, 131, 131, 131, + 131, 131, 131, 132, 88, 132, 84, 132, 132, 132, + 132, 132, 133, 133, 134, 83, 134, 134, 134, 134, + 134, 134, 134, 71, 60, 54, 51, 47, 45, 36, + 30, 26, 19, 17, 9, 6, 5, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + + 122, 122, 122, 122, 122, 122 + } ; + + +#define YY_TRAILING_MASK 0x2000 +#define YY_TRAILING_HEAD_MASK 0x4000 +#define REJECT \ +{ \ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ +yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ +(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \ +(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \ +yy_current_state = *(yy_state_ptr); /* restore curr. state */ \ +++(yy_lp); \ +goto find_rule; \ +} + + +#define yymore() ((yy_more_flag) = 1) +#define YY_MORE_ADJ (yy_more_len) +#define YY_RESTORE_YY_MORE_OFFSET +/* + Copyright (c) 1999-2014 OPEN CASCADE SAS + + This file is part of Open CASCADE Technology software library. + + This library is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License version 2.1 as published + by the Free Software Foundation, with special exception defined in the file + OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT + distribution for complete text of the license and disclaimer of any warranty. + + Alternatively, this file may be used under the terms of Open CASCADE + commercial license or contractual agreement. +*/ +/* + c++ generate C++ parser class + 8bit don't fail on 8-bit input characters + warn warn about inconsistencies + nodefault don't create default echo-all rule + noyywrap don't use yywrap() function + yyclass define name of the scanner class +*/ + +#include "step.tab.hxx" +#include "recfile.ph" +#include "stdio.h" + +// Tell flex which function to define +#ifdef YY_DECL +# undef YY_DECL +#endif +#define YY_DECL int step::scanner::lex (step::parser::semantic_type* /*yylval*/, step::parser::location_type* /*yylloc*/) + +typedef step::parser::token token; + +/* skl 31.01.2002 for OCC133(OCC96,97) - uncorrect +long string in files Henri.stp and 401.stp*/ +#include +#define YY_FATAL_ERROR(msg) Standard_Failure::Raise(msg); + +/* abv 07.06.02: force inclusion of stdlib.h on WNT to avoid warnings */ +#ifdef _MSC_VER +// add includes for flex 2.91 (Linux version) +#include +#include + +// Avoid includion of unistd.h if parser is generated on Linux (flex 2.5.35) +#ifndef YY_NO_UNISTD_H +#define YY_NO_UNISTD_H +#endif + +// disable MSVC warnings in flex 2.89 and 2.5.35 code +// Note that Intel compiler also defines _MSC_VER but has different warning ids +#if defined(__INTEL_COMPILER) +#pragma warning(disable:177 1786 1736) +#elif defined(__clang__) +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma GCC diagnostic ignored "-Winconsistent-dllimport" +#pragma GCC diagnostic ignored "-Wunneeded-internal-declaration" +#else +#pragma warning(disable:4131 4244 4273 4127 4267) +#endif + +#endif /* MSC_VER */ + +void rec_restext(const char *constnewtext, int lentext); +void rec_typarg(int argtype); + +// disable GCC warnings in flex code +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + + + +#define INITIAL 0 +#define Com 1 +#define End 2 +#define Text 3 + + + + + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + + + + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + + + + + +#ifndef yytext_ptr +static void yy_flex_strncpy ( char *, const char *, int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen ( const char * ); +#endif + +#ifndef YY_NO_INPUT + +#endif + + + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +#define ECHO LexerOutput( yytext, yyleng ) +#endif + + + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ +\ + if ( (int)(result = LexerInput( (char *) buf, max_size )) < 0 ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); + +#endif + + + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) LexerError( msg ) +#endif + + + +/* end tables serialization structures and prototypes */ + + + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 +#define YY_DECL int yyFlexLexer::yylex() +#endif /* !YY_DECL */ + + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + + + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK /*LINTED*/break; +#endif + + + +#define YY_RULE_SETUP \ + YY_USER_ACTION + + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + + + + + + + + + + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + + /* Create the reject buffer large enough to save one state per allowed character. */ + if ( ! (yy_state_buf) ) + (yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE ); + if ( ! (yy_state_buf) ) + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin.rdbuf(std::cin.rdbuf()); + + if ( ! yyout ) + yyout.rdbuf(std::cout.rdbuf()); + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + { + + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + { + (yy_more_len) = 0; + if ( (yy_more_flag) ) + { + (yy_more_len) = (int) ((yy_c_buf_p) - (yytext_ptr)); + (yy_more_flag) = 0; + } + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + +yy_match: + do + { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 123 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + *(yy_state_ptr)++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 268 ); + +yy_find_action: + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[(yy_lp)]; + if ( yy_act & YY_TRAILING_HEAD_MASK || + (yy_looking_for_trail_begin) ) + { + if ( yy_act == (yy_looking_for_trail_begin) ) + { + (yy_looking_for_trail_begin) = 0; + yy_act &= ~YY_TRAILING_HEAD_MASK; + break; + } + } + else if ( yy_act & YY_TRAILING_MASK ) + { + (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK; + (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK; + } + else + { + (yy_full_match) = yy_cp; + (yy_full_state) = (yy_state_ptr); + (yy_full_lp) = (yy_lp); + break; + } + ++(yy_lp); + goto find_rule; + } + --yy_cp; + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +YY_RULE_SETUP +{ BEGIN(Com); } /* start of comment - put the scanner in the "Com" state */ + YY_BREAK +case 2: +YY_RULE_SETUP +{;} /* in comment, skip any characters except asterisk (and newline, handled by its own rule) */ + YY_BREAK +case 3: +YY_RULE_SETUP +{;} /* in comment, skip any sequence of asterisks followed by other symbols (except slash or newline) */ + YY_BREAK +case 4: +YY_RULE_SETUP +{ BEGIN(INITIAL); } /* end of comment - reset the scanner to initial state */ + YY_BREAK +case 5: +YY_RULE_SETUP +{ BEGIN(Text); yymore(); } /* start of quoted text string - put the scanner in the "Text" state, but keep ' as part of yytext */ + YY_BREAK +case 6: +/* rule 6 can match eol */ +YY_RULE_SETUP +{ yymore(); yylineno ++; } /* newline in text string - increment line counter and keep collecting yytext */ + YY_BREAK +case 7: +YY_RULE_SETUP +{ yymore(); } /* single ' inside text string - keep collecting yytext*/ + YY_BREAK +case 8: +YY_RULE_SETUP +{ yymore(); } /* a sequence of any characters except ' and \n - keep collecting yytext */ + YY_BREAK +case 9: +/* rule 9 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +YY_LINENO_REWIND_TO(yy_bp + 1); +(yy_c_buf_p) = yy_cp = yy_bp + 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +{ BEGIN(INITIAL); rec_restext(YYText(),YYLeng()); rec_typarg(rec_argText); return(token::QUID); } /* end of string (apostrophe followed by comma or closing parenthesis) - reset the scanner to initial state, record the value of all yytext collected */ + YY_BREAK +case 10: +YY_RULE_SETUP +{;} + YY_BREAK +case 11: +YY_RULE_SETUP +{;} + YY_BREAK +case 12: +/* rule 12 can match eol */ +YY_RULE_SETUP +{ yylineno ++; } /* count lines (one rule for all start conditions) */ + YY_BREAK +case 13: +YY_RULE_SETUP +{;} /* abv 30.06.00: for reading DOS files */ + YY_BREAK +case 14: +YY_RULE_SETUP +{;} /* fix from C21. for test load e3i file with line 15 with null symbols */ + YY_BREAK +case 15: +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); return(token::ENTITY); } + YY_BREAK +case 16: +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); return(token::ENTITY); } + YY_BREAK +case 17: +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); return(token::IDENT); } + YY_BREAK +case 18: +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); rec_typarg(rec_argInteger); return(token::QUID); } + YY_BREAK +case 19: +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); rec_typarg(rec_argFloat); return(token::QUID); } + YY_BREAK +case 20: +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); rec_typarg(rec_argFloat); return(token::QUID); } + YY_BREAK +case 21: +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); rec_typarg(rec_argHexa); return(token::QUID); } + YY_BREAK +case 22: +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); rec_typarg(rec_argEnum); return(token::QUID); } + YY_BREAK +case 23: +YY_RULE_SETUP +{ return ('('); } + YY_BREAK +case 24: +YY_RULE_SETUP +{ return (')'); } + YY_BREAK +case 25: +YY_RULE_SETUP +{ return (','); } + YY_BREAK +case 26: +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); rec_typarg(rec_argNondef); return(token::QUID); } + YY_BREAK +case 27: +YY_RULE_SETUP +{ return ('='); } + YY_BREAK +case 28: +YY_RULE_SETUP +{ return (';'); } + YY_BREAK +case 29: +YY_RULE_SETUP +{ return(token::STEP); } + YY_BREAK +case 30: +YY_RULE_SETUP +{ return(token::HEADER); } + YY_BREAK +case 31: +YY_RULE_SETUP +{ return(token::ENDSEC); } + YY_BREAK +case 32: +YY_RULE_SETUP +{ return(token::DATA); } + YY_BREAK +case 33: +YY_RULE_SETUP +{ return(token::ENDSTEP);} + YY_BREAK +case 34: +YY_RULE_SETUP +{ return(token::ENDSTEP);} + YY_BREAK +case 35: +YY_RULE_SETUP +{ BEGIN(End); return(token::ENDSTEP); } /* at the end of the STEP data, enter dedicated start condition "End" to skip everything that follows */ + YY_BREAK +case 36: +YY_RULE_SETUP +{ return(token::STEP); } + YY_BREAK +case 37: +YY_RULE_SETUP +{ return ('/'); } + YY_BREAK +case 38: +YY_RULE_SETUP +{ return(token::SCOPE); } + YY_BREAK +case 39: +YY_RULE_SETUP +{ return(token::ENDSCOPE); } + YY_BREAK +case 40: +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); return(token::TYPE); } + YY_BREAK +case 41: +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); return(token::TYPE); } + YY_BREAK +case 42: +/* rule 42 can match eol */ +YY_RULE_SETUP +{ rec_restext(YYText(),YYLeng()); rec_typarg(rec_argMisc); return(token::QUID); } + YY_BREAK +case 43: +YY_RULE_SETUP +{;} /* skip any characters (except newlines) */ + YY_BREAK +case 44: +YY_RULE_SETUP +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK + case YY_STATE_EOF(INITIAL): + case YY_STATE_EOF(Com): + case YY_STATE_EOF(End): + case YY_STATE_EOF(Text): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin.rdbuf(); + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + + +/* The contents of this function are C++ specific, so the () macro is not used. + * This constructor simply maintains backward compatibility. + * DEPRECATED + */ +yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ): + yyin(arg_yyin ? arg_yyin->rdbuf() : std::cin.rdbuf()), + yyout(arg_yyout ? arg_yyout->rdbuf() : std::cout.rdbuf()) +{ + ctor_common(); +} + +/* The contents of this function are C++ specific, so the () macro is not used. + */ +yyFlexLexer::yyFlexLexer( std::istream& arg_yyin, std::ostream& arg_yyout ): + yyin(arg_yyin.rdbuf()), + yyout(arg_yyout.rdbuf()) +{ + ctor_common(); +} + +/* The contents of this function are C++ specific, so the () macro is not used. + */ +void yyFlexLexer::ctor_common() +{ + yy_c_buf_p = 0; + yy_init = 0; + yy_start = 0; + yy_flex_debug = 0; + yylineno = 1; // this will only get updated if %option yylineno + + yy_did_buffer_switch_on_eof = 0; + + yy_looking_for_trail_begin = 0; + yy_more_flag = 0; + yy_more_len = 0; + yy_more_offset = yy_prev_more_offset = 0; + + yy_start_stack_ptr = yy_start_stack_depth = 0; + yy_start_stack = NULL; + + yy_buffer_stack = NULL; + yy_buffer_stack_top = 0; + yy_buffer_stack_max = 0; + + + + yy_state_buf = new yy_state_type[YY_STATE_BUF_SIZE]; + +} + +/* The contents of this function are C++ specific, so the () macro is not used. + */ +yyFlexLexer::~yyFlexLexer() +{ + delete [] yy_state_buf; + yyfree( yy_start_stack ); + yy_delete_buffer( YY_CURRENT_BUFFER ); + yyfree( yy_buffer_stack ); +} + +/* The contents of this function are C++ specific, so the () macro is not used. + */ +void yyFlexLexer::switch_streams( std::istream& new_in, std::ostream& new_out ) +{ + // was if( new_in ) + yy_delete_buffer( YY_CURRENT_BUFFER ); + yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); + + // was if( new_out ) + yyout.rdbuf(new_out.rdbuf()); +} + +/* The contents of this function are C++ specific, so the () macro is not used. + */ +void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) +{ + if( ! new_in ) { + new_in = &yyin; + } + + if ( ! new_out ) { + new_out = &yyout; + } + + switch_streams(*new_in, *new_out); +} + +#ifdef YY_INTERACTIVE +int yyFlexLexer::LexerInput( char* buf, int /* max_size */ ) +#else +int yyFlexLexer::LexerInput( char* buf, int max_size ) +#endif +{ + if ( yyin.eof() || yyin.fail() ) + return 0; + +#ifdef YY_INTERACTIVE + yyin.get( buf[0] ); + + if ( yyin.eof() ) + return 0; + + if ( yyin.bad() ) + return -1; + + return 1; + +#else + (void) yyin.read( buf, max_size ); + + if ( yyin.bad() ) + return -1; + else + return yyin.gcount(); +#endif +} + +void yyFlexLexer::LexerOutput( const char* buf, int size ) +{ + (void) yyout.write( buf, size ); +} + + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +int yyFlexLexer::yy_get_next_buffer() +{ + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + yy_state_type yyFlexLexer::yy_get_previous_state() +{ + yy_state_type yy_current_state; + char *yy_cp; + + yy_current_state = (yy_start); + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 38); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 123 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + *(yy_state_ptr)++ = yy_current_state; + } + + return yy_current_state; +} + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) +{ + int yy_is_jam; + + YY_CHAR yy_c = 38; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 123 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_is_jam = (yy_current_state == 122); + if ( ! yy_is_jam ) + *(yy_state_ptr)++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; +} + + +#ifndef YY_NO_UNPUT + void yyFlexLexer::yyunput( int c, char* yy_bp) +{ + char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + int number_to_move = (yy_n_chars) + 2; + char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} +#endif + + int yyFlexLexer::yyinput() +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + return 0; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + + return c; +} + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyFlexLexer::yyrestart( std::istream& input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE ); + } + + yy_init_buffer( YY_CURRENT_BUFFER, input_file ); + yy_load_buffer_state( ); +} + +/** Delegate to the new version that takes an istream reference. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ +void yyFlexLexer::yyrestart( std::istream* input_file ) +{ + if( ! input_file ) { + input_file = &yyin; + } + yyrestart( *input_file ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + + + void yyFlexLexer::yy_load_buffer_state() +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin.rdbuf(YY_CURRENT_BUFFER_LVALUE->yy_input_file); + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream& file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; +} + +/** Delegate creation of buffers to the new version that takes an istream reference. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) +{ + return yy_create_buffer( *file, size ); +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree( (void *) b->yy_ch_buf ); + + yyfree( (void *) b ); +} + + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream& file ) + +{ + int oerrno = errno; + + yy_flush_buffer( b ); + + b->yy_input_file = file.rdbuf(); + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = 0; + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yyFlexLexer::yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +void yyFlexLexer::yyensure_buffer_stack(void) +{ + yy_size_t num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + + + + + + + + + + + + + + + + + + void yyFlexLexer::yy_push_state( int _new_state ) +{ + if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) + { + yy_size_t new_size; + + (yy_start_stack_depth) += YY_START_STACK_INCR; + new_size = (yy_size_t) (yy_start_stack_depth) * sizeof( int ); + + if ( ! (yy_start_stack) ) + (yy_start_stack) = (int *) yyalloc( new_size ); + + else + (yy_start_stack) = (int *) yyrealloc( + (void *) (yy_start_stack), new_size ); + + if ( ! (yy_start_stack) ) + YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); + } + + (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; + + BEGIN(_new_state); +} + + + + + void yyFlexLexer::yy_pop_state() +{ + if ( --(yy_start_stack_ptr) < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); +} + + + + + int yyFlexLexer::yy_top_state() +{ + return (yy_start_stack)[(yy_start_stack_ptr) - 1]; +} + + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +void yyFlexLexer::LexerError( const char* msg ) +{ + std::cerr << msg << std::endl; + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + + + +/* Accessor methods (get/set functions) to struct members. */ + + + + + + + + +/* + * Internal utility routines. + */ + + + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, const char * s2, int n ) +{ + + int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + + + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (const char * s ) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + + + +void *yyalloc (yy_size_t size ) +{ + return malloc(size); +} + + + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); +} + + + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + + +#define YYTABLES_NAME "yytables" + + + + + + + + +step::scanner::scanner(std::istream* in, std::ostream* out) + : stepFlexLexer(in, out) +{ +} + diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/location.hh opencascade-7.5.1+dfsg1/src/StepFile/location.hh --- opencascade-7.4.1+dfsg1/src/StepFile/location.hh 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/location.hh 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,302 @@ +// A Bison parser, made by GNU Bison 3.7.1. + +// Locations for Bison parsers in C++ + +// Copyright (C) 2002-2015, 2018-2020 Free Software Foundation, Inc. + +// 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 . + +// As a special exception, you may create a larger work that contains +// part or all of the Bison parser skeleton and distribute that work +// under terms of your choice, so long as that work isn't itself a +// parser generator using the skeleton or a modified version thereof +// as a parser skeleton. Alternatively, if you modify or redistribute +// the parser skeleton itself, you may (at your option) remove this +// special exception, which will cause the skeleton and the resulting +// Bison output files to be licensed under the GNU General Public +// License without this special exception. + +// This special exception was added by the Free Software Foundation in +// version 2.2 of Bison. + +/** + ** \file StepFile/location.hh + ** Define the step::location class. + */ + +#ifndef YY_STEP_STEPFILE_LOCATION_HH_INCLUDED +# define YY_STEP_STEPFILE_LOCATION_HH_INCLUDED + +# include +# include + +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +namespace step { + + /// A point in a source file. + class position + { + public: + /// Type for file name. + typedef const std::string filename_type; + /// Type for line and column numbers. + typedef int counter_type; + + /// Construct a position. + explicit position (filename_type* f = YY_NULLPTR, + counter_type l = 1, + counter_type c = 1) + : filename (f) + , line (l) + , column (c) + {} + + + /// Initialization. + void initialize (filename_type* fn = YY_NULLPTR, + counter_type l = 1, + counter_type c = 1) + { + filename = fn; + line = l; + column = c; + } + + /** \name Line and Column related manipulators + ** \{ */ + /// (line related) Advance to the COUNT next lines. + void lines (counter_type count = 1) + { + if (count) + { + column = 1; + line = add_ (line, count, 1); + } + } + + /// (column related) Advance to the COUNT next columns. + void columns (counter_type count = 1) + { + column = add_ (column, count, 1); + } + /** \} */ + + /// File name to which this position refers. + filename_type* filename; + /// Current line number. + counter_type line; + /// Current column number. + counter_type column; + + private: + /// Compute max (min, lhs+rhs). + static counter_type add_ (counter_type lhs, counter_type rhs, counter_type min) + { + return lhs + rhs < min ? min : lhs + rhs; + } + }; + + /// Add \a width columns, in place. + inline position& + operator+= (position& res, position::counter_type width) + { + res.columns (width); + return res; + } + + /// Add \a width columns. + inline position + operator+ (position res, position::counter_type width) + { + return res += width; + } + + /// Subtract \a width columns, in place. + inline position& + operator-= (position& res, position::counter_type width) + { + return res += -width; + } + + /// Subtract \a width columns. + inline position + operator- (position res, position::counter_type width) + { + return res -= width; + } + + /** \brief Intercept output stream redirection. + ** \param ostr the destination output stream + ** \param pos a reference to the position to redirect + */ + template + std::basic_ostream& + operator<< (std::basic_ostream& ostr, const position& pos) + { + if (pos.filename) + ostr << *pos.filename << ':'; + return ostr << pos.line << '.' << pos.column; + } + + /// Two points in a source file. + class location + { + public: + /// Type for file name. + typedef position::filename_type filename_type; + /// Type for line and column numbers. + typedef position::counter_type counter_type; + + /// Construct a location from \a b to \a e. + location (const position& b, const position& e) + : begin (b) + , end (e) + {} + + /// Construct a 0-width location in \a p. + explicit location (const position& p = position ()) + : begin (p) + , end (p) + {} + + /// Construct a 0-width location in \a f, \a l, \a c. + explicit location (filename_type* f, + counter_type l = 1, + counter_type c = 1) + : begin (f, l, c) + , end (f, l, c) + {} + + + /// Initialization. + void initialize (filename_type* f = YY_NULLPTR, + counter_type l = 1, + counter_type c = 1) + { + begin.initialize (f, l, c); + end = begin; + } + + /** \name Line and Column related manipulators + ** \{ */ + public: + /// Reset initial location to final location. + void step () + { + begin = end; + } + + /// Extend the current location to the COUNT next columns. + void columns (counter_type count = 1) + { + end += count; + } + + /// Extend the current location to the COUNT next lines. + void lines (counter_type count = 1) + { + end.lines (count); + } + /** \} */ + + + public: + /// Beginning of the located region. + position begin; + /// End of the located region. + position end; + }; + + /// Join two locations, in place. + inline location& + operator+= (location& res, const location& end) + { + res.end = end.end; + return res; + } + + /// Join two locations. + inline location + operator+ (location res, const location& end) + { + return res += end; + } + + /// Add \a width columns to the end position, in place. + inline location& + operator+= (location& res, location::counter_type width) + { + res.columns (width); + return res; + } + + /// Add \a width columns to the end position. + inline location + operator+ (location res, location::counter_type width) + { + return res += width; + } + + /// Subtract \a width columns to the end position, in place. + inline location& + operator-= (location& res, location::counter_type width) + { + return res += -width; + } + + /// Subtract \a width columns to the end position. + inline location + operator- (location res, location::counter_type width) + { + return res -= width; + } + + /** \brief Intercept output stream redirection. + ** \param ostr the destination output stream + ** \param loc a reference to the location to redirect + ** + ** Avoid duplicate information. + */ + template + std::basic_ostream& + operator<< (std::basic_ostream& ostr, const location& loc) + { + location::counter_type end_col + = 0 < loc.end.column ? loc.end.column - 1 : 0; + ostr << loc.begin; + if (loc.end.filename + && (!loc.begin.filename + || *loc.begin.filename != *loc.end.filename)) + ostr << '-' << loc.end.filename << ':' << loc.end.line << '.' << end_col; + else if (loc.begin.line < loc.end.line) + ostr << '-' << loc.end.line << '.' << end_col; + else if (loc.begin.column < end_col) + ostr << '-' << end_col; + return ostr; + } + +} // step + +#endif // !YY_STEP_STEPFILE_LOCATION_HH_INCLUDED diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/recfile.pc opencascade-7.5.1+dfsg1/src/StepFile/recfile.pc --- opencascade-7.4.1+dfsg1/src/StepFile/recfile.pc 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/recfile.pc 2021-02-02 08:51:56.000000000 +0000 @@ -50,31 +50,31 @@ static char* restext = NULL ; /* texte courant (allocation dynamique) */ /* static int resalloc = 0 ;*/ /* alloue (memoire a liberer) ou non */ -static char txt_cart_p[] = "CARTESIAN_POINT"; - -void rec_restext(char* newtext, int lentext) /* destine a etre appele de l'exterieur */ +void rec_restext(const char* theNewText, int theLenText) /* destine a etre appele de l'exterieur */ { - char *res, *text; - if(strcmp(newtext,txt_cart_p)==0) { + // optimization for most frequent entity, CARTESIAN_POINT + static char txt_cart_p[] = "CARTESIAN_POINT"; + if(strcmp(theNewText,txt_cart_p)==0) { restext = txt_cart_p; return; } - if (onecarpage->used > Maxcar-lentext-1) { /* allouer nouvelle page */ + if (onecarpage->used > Maxcar-theLenText-1) { /* allouer nouvelle page */ struct carpage *newpage; int sizepage = sizeof(struct carpage); - if (lentext >= Maxcar) sizepage += (lentext+1 - Maxcar); + if (theLenText >= Maxcar) sizepage += (theLenText+1 - Maxcar); newpage = (struct carpage*) malloc (sizepage); newpage->next = onecarpage; onecarpage = newpage; onecarpage->used = 0; } restext = onecarpage->cars + onecarpage->used; - onecarpage->used += (lentext + 1); + onecarpage->used += (theLenText + 1); /* strcpy */ - res = restext ; text = newtext; - while (*text != '\0') { *res=*text ; res++ ; text++ ; } - *res = '\0' ; + char *aRes = restext ; + const char *aText = theNewText; + while (*aText != '\0') { *aRes=*aText ; aRes++ ; aText++ ; } + *aRes = '\0' ; } void rec_gettext(char* *r) @@ -167,21 +167,18 @@ /* Trace pour controle */ + +#ifdef __cplusplus +extern "C" { +#endif + void recfile_modeprint(int mode) { modeprint = mode; } -static int lastno; -extern int steplineno; -extern int modcom; -extern int modend; - -void rec_inityyll () -{ - steplineno = 0; - modcom = 0; - modend = 0; - lastno = -1; +#ifdef __cplusplus } +#endif + /* INITIALISATION */ @@ -200,7 +197,6 @@ curscope = NULL ; oneargpage = (struct argpage*) malloc ( sizeof(struct argpage) ); oneargpage->next = NULL; oneargpage->used = 0; - rec_inityyll(); } /* INTERMEDIAIRE : passage de Header a Data */ @@ -482,7 +478,9 @@ La liberation de la memoire est faite par lir_file_fin, en une fois */ - +#ifdef __cplusplus +extern "C" { +#endif void lir_file_nbr(int* nbh, int* nbr, int* nbp) /* initialise le traitement et retourne la taille du directory et du header */ { @@ -562,6 +560,9 @@ return (1) ; } +#ifdef __cplusplus +} +#endif /* Verification de l'integrite des donnees */ @@ -599,6 +600,3 @@ ("Liste des records pourrie, nb note %d relu %d\n",nbrec,nr) ; } -void steperror (char *mess); -int steplex (void); - diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/recfile.ph opencascade-7.5.1+dfsg1/src/StepFile/recfile.ph --- opencascade-7.4.1+dfsg1/src/StepFile/recfile.ph 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/recfile.ph 2021-02-02 08:51:56.000000000 +0000 @@ -13,6 +13,9 @@ commercial license or contractual agreement. */ +#ifndef StepFile_recfile_HeaderFile +#define StepFile_recfile_HeaderFile + /*Types d'arguments (parametres) d'entites STEP (sans entrer dans le detail) */ #define rec_argSub 0 #define rec_argInteger 1 @@ -24,3 +27,36 @@ #define rec_argHexa 7 #define rec_argBinary 8 #define rec_argMisc 9 + +#ifdef __cplusplus + +// Define stepFlexLexer class by inclusion of FlexLexer.h, +// but only if this has not been done yet, to avoid redefinition +#if !defined(yyFlexLexer) && !defined(FlexLexerOnce) +#define yyFlexLexer stepFlexLexer +#include +#endif + +#include "step.tab.hxx" + +namespace step +{ + // To feed data back to bison, the yylex method needs yylval and + // yylloc parameters. Since the stepFlexLexer class is defined in the + // system header the signature of its yylex() method + // can not be changed anymore. This makes it necessary to derive a + // scanner class that provides a method with the desired signature: + + class scanner : public stepFlexLexer + { + public: + explicit scanner(std::istream* in = 0, std::ostream* out = 0); + + int lex(step::parser::semantic_type* /*yylval*/, + step::parser::location_type* /*yylloc*/); + }; +} + +#endif /* __cplusplus */ + +#endif // _StepFile_recfile_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/StepFile_CallFailure.cxx opencascade-7.5.1+dfsg1/src/StepFile/StepFile_CallFailure.cxx --- opencascade-7.4.1+dfsg1/src/StepFile/StepFile_CallFailure.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/StepFile_CallFailure.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -// Created on: 2002-02-05 -// Created by: Sergey KUUL -// Copyright (c) 2002-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include - -void StepFile_CallFailure(char * const message) -{ - throw Standard_Failure(message); -} diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/StepFile_CallFailure.hxx opencascade-7.5.1+dfsg1/src/StepFile/StepFile_CallFailure.hxx --- opencascade-7.4.1+dfsg1/src/StepFile/StepFile_CallFailure.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/StepFile_CallFailure.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifdef __cplusplus -extern "C" -#endif -void StepFile_CallFailure(char * const message); diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/StepFile_Read.cxx opencascade-7.5.1+dfsg1/src/StepFile/StepFile_Read.cxx --- opencascade-7.4.1+dfsg1/src/StepFile/StepFile_Read.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/StepFile_Read.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,12 +25,10 @@ // Compilation conditionnelle : concerne les mesures de performances - #include +#include #include "recfile.ph" #include "stepread.ph" -extern "C" void recfile_modeprint (int mode); // controle trace recfile - // recfile_modeprint est declare a part #include #include @@ -48,15 +46,17 @@ #include #include +#include +#include + #ifdef OCCT_DEBUG #define CHRONOMESURE -#ifdef CHRONOMESURE -# include -#endif #endif // ## ## ## ## ON SAURA AU MOINS TRAITER UndefinedEntity ## ## ## ## +extern "C" void recfile_modeprint (int mode); // controle trace recfile + static Handle(Interface_Check) checkread = new Interface_Check; static Standard_Integer modepr = 1; @@ -65,96 +65,68 @@ modepr = mode; // recfile_modeprint est rappele a chaque lecture de fichier } - -static Standard_Integer StepFile_Read - (char* nomfic, - const Handle(StepData_StepModel)& stepmodel, - const Handle(StepData_Protocol)& protocol, - const Handle(StepData_FileRecognizer)& recoheader, - const Handle(StepData_FileRecognizer)& recodata); - - -Standard_Integer StepFile_Read - (char* nomfic, - const Handle(StepData_StepModel)& stepmodel, - const Handle(StepData_FileRecognizer)& recoheader, - const Handle(StepData_FileRecognizer)& recodata) -{ - return StepFile_Read - (nomfic,stepmodel, - Handle(StepData_Protocol)::DownCast(Interface_Protocol::Active()), - recoheader,recodata); -} - -Standard_Integer StepFile_Read - (char* nomfic, - const Handle(StepData_StepModel)& stepmodel, - const Handle(StepData_FileRecognizer)& recoheader, - const Handle(StepData_Protocol)& protocol) -{ - Handle(StepData_FileRecognizer) nulreco; - return StepFile_Read (nomfic,stepmodel,protocol,recoheader,nulreco); -} - -Standard_Integer StepFile_Read - (char* nomfic, - const Handle(StepData_StepModel)& stepmodel, - const Handle(StepData_Protocol)& protocol) -{ - Handle(StepData_FileRecognizer) nulreco; - return StepFile_Read (nomfic,stepmodel,protocol,nulreco,nulreco); -} - // ## ## ## ## ## ## Corps de la Routine ## ## ## ## ## ## static Interface_ParamType LesTypes[10]; // passage types (recstep/Interface) -Standard_Integer StepFile_Read - (char* nomfic, - const Handle(StepData_StepModel)& stepmodel, - const Handle(StepData_Protocol)& protocol, - const Handle(StepData_FileRecognizer)& recoheader, - const Handle(StepData_FileRecognizer)& recodata) - +static Standard_Integer StepFile_Read (const char* theName, + std::istream* theIStream, + const Handle(StepData_StepModel)& stepmodel, + const Handle(StepData_Protocol)& protocol, + const Handle(StepData_FileRecognizer)& recoheader, + const Handle(StepData_FileRecognizer)& recodata) { - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - char *ficnom = nomfic ; // because const (non reconnu par C) - checkread->Clear(); recfile_modeprint ( (modepr > 0 ? modepr-1 : 0) ); - FILE* newin = stepread_setinput(ficnom); - if (!newin) return -1; + + // if stream is not provided, open file stream here + std::istream *aStreamPtr = theIStream; + std::ifstream aFileStream; + if (!aStreamPtr) { + OSD_OpenStream(aFileStream, theName, std::ios_base::in | std::ios_base::binary); + aStreamPtr = &aFileStream; + } + + if (aStreamPtr->bad()) + { + return -1; + } + #ifdef CHRONOMESURE - Standard_Integer n ; - OSD_Timer c ; - c.Reset () ; + OSD_Timer c; + c.Reset(); c.Start(); - sout << " ... Step File Reading : " << ficnom << "" << Message_EndLine; + Message::SendInfo() << " ... Step File Reading : '" << theName << "'"; #endif try { OCC_CATCH_SIGNALS - if (stepread () != 0) { lir_file_fin(3); stepread_endinput (newin,ficnom); return 1; } + if (stepread(*aStreamPtr) != 0) { + lir_file_fin(3); + return 1; + } } catch (Standard_Failure const& anException) { #ifdef OCCT_DEBUG - sout << " ... Exception Raised while reading Step File : " << ficnom << ":\n" << Message_EndLine; - sout << anException.GetMessageString(); - sout << " ..." << Message_EndLine; + Message::SendAlarm() << " ... Exception Raised while reading Step File : '" << theName << "':\n" + << anException.GetMessageString() + << " ..."; #endif (void)anException; lir_file_fin(3); - stepread_endinput (newin,ficnom); return 1; } - // Continue reading of file despite of possible fails - //if (checkread->HasFailed()) { lir_file_fin(3); stepread_endinput (newin,ficnom); return 1; } + +// Continue reading of file despite of possible fails +// if (checkread->HasFailed()) { lir_file_fin(3); stepread_endinput(newifstream, ficnom); return 1; } #ifdef CHRONOMESURE - sout << " ... STEP File Read ... " << Message_EndLine; - c.Show(); + { + Message_Messenger::StreamBuffer sout = Message::SendInfo(); + sout << " ... STEP File Read ...\n"; + c.Show (sout); + } #endif - // Creation du StepReaderData LesTypes[rec_argNondef] = Interface_ParamVoid ; @@ -171,7 +143,7 @@ Standard_Integer nbhead, nbrec, nbpar; lir_file_nbr (&nbhead,&nbrec,&nbpar); // renvoi par lex/yacc Handle(StepData_StepReaderData) undirec = - new StepData_StepReaderData(nbhead,nbrec,nbpar); // creation tableau de records + new StepData_StepReaderData(nbhead,nbrec,nbpar, stepmodel->SourceCodePage()); // creation tableau de records for ( Standard_Integer nr = 1; nr <= nbrec; nr ++) { int nbarg; char* ident; char* typrec = 0; @@ -193,10 +165,12 @@ // on a undirec pret pour la suite #ifdef CHRONOMESURE - sout << " ... Step File loaded ... " << Message_EndLine; - c.Show(); - sout << " "<< undirec->NbRecords () << - " records (entities,sub-lists,scopes), "<< nbpar << " parameters\n" << Message_EndLine; + { + Message_Messenger::StreamBuffer sout = Message::SendInfo(); + sout << " ... Step File loaded ...\n"; + c.Show (sout); + sout << " "<< undirec->NbRecords() << " records (entities,sub-lists,scopes), "<< nbpar << " parameters"; + } #endif // Analyse : par StepReaderTool @@ -208,8 +182,11 @@ readtool.Prepare(recodata); // Data. reco nul -> pour Protocol #ifdef CHRONOMESURE - sout << " ... Parameters prepared ... "; - c.Show(); + { + Message_Messenger::StreamBuffer sout = Message::SendInfo(); + sout << " ... Parameters prepared ...\n"; + c.Show (sout); + } #endif readtool.LoadModel(stepmodel); @@ -219,20 +196,31 @@ readtool.Clear(); undirec.Nullify(); #ifdef CHRONOMESURE - sout << " ... Objets analysed ... " << Message_EndLine; - c.Show(); - n = stepmodel->NbEntities() ; - sout << " STEP Loading done : " << n << " Entities" << Message_EndLine; + { + Message_Messenger::StreamBuffer sout = Message::SendInfo(); + sout << " ... Objets analysed ...\n"; + c.Show (sout); + Standard_Integer n = stepmodel->NbEntities(); + sout << " STEP Loading done : " << n << " Entities"; + } #endif - - stepread_endinput (newin,ficnom); return 0 ; + return 0; +} + +Standard_Integer StepFile_Read(const char* theName, + std::istream* theIStream, + const Handle(StepData_StepModel)& stepmodel, + const Handle(StepData_Protocol)& protocol) +{ + Handle(StepData_FileRecognizer) nulreco; + return StepFile_Read (theName,theIStream,stepmodel,protocol,nulreco,nulreco); } void StepFile_Interrupt (char* mess) { #ifdef OCCT_DEBUG - Handle(Message_Messenger) sout = Message::DefaultMessenger(); - sout << " **** StepFile Error : " << mess << " ****" << Message_EndLine; + Message_Messenger::StreamBuffer sout = Message::SendInfo(); + sout << " **** StepFile Error : " << mess << " ****" << std::endl; #endif checkread->AddFail(mess); } diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/StepFile_Read.hxx opencascade-7.5.1+dfsg1/src/StepFile/StepFile_Read.hxx --- opencascade-7.4.1+dfsg1/src/StepFile/StepFile_Read.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/StepFile_Read.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,30 +27,24 @@ #ifndef StepFile_Read_HeaderFile #define StepFile_Read_HeaderFile +#include //# include : sauf recfile_modeprint, declare ici # include # include # include - Standard_EXPORT void StepFile_ReadTrace (const Standard_Integer mode); // Modal : 0 pas de trace, 1 trace LoadModel, 2 & 3 + trace interne lex-yac -Standard_EXPORT Standard_Integer StepFile_Read - (char* nomfic, - const Handle(StepData_StepModel)& stepmodel, - const Handle(StepData_FileRecognizer)& recoheader, // Reconnait le Header - const Handle(StepData_FileRecognizer)& recodata); // Entites du Data - -Standard_EXPORT Standard_Integer StepFile_Read - (char* nomfic, - const Handle(StepData_StepModel)& stepmodel, - const Handle(StepData_FileRecognizer)& recoheader, // Reconnait le Header - const Handle(StepData_Protocol)& protocol); // Entites du Data - -Standard_EXPORT Standard_Integer StepFile_Read - (char* nomfic, - const Handle(StepData_StepModel)& stepmodel, - const Handle(StepData_Protocol)& protocol); // Header & Data +//! Working function reading STEP file or stream. +//! @param theName - name of the file or stream +//! @param theIStream - pointer to stream to read; if null, file theName will be opened +//! @param theModel - STEP model +//! @param theProtocol - STEP protocol object +//! @return 0 on success, -1 if stream fails, 1 in case of parsing error +Standard_EXPORT Standard_Integer StepFile_Read (const char* theName, + std::istream* theIStream, + const Handle(StepData_StepModel)& theModel, + const Handle(StepData_Protocol)& theProtocol); #endif diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/StepFile_Transfer.hxx opencascade-7.5.1+dfsg1/src/StepFile/StepFile_Transfer.hxx --- opencascade-7.4.1+dfsg1/src/StepFile/StepFile_Transfer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/StepFile_Transfer.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -// General Purpose Include file -// provides all required Include directives to Load and Transfer (to Cas.Cade) -// the content of a Step File - -#include -#include -#include -//#include -//#include -#include - -// and, to allow easy DownCasting : -#include diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/step.lex opencascade-7.5.1+dfsg1/src/StepFile/step.lex --- opencascade-7.4.1+dfsg1/src/StepFile/step.lex 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/step.lex 2021-02-02 08:51:56.000000000 +0000 @@ -13,92 +13,135 @@ commercial license or contractual agreement. */ +/* + c++ generate C++ parser class + 8bit don't fail on 8-bit input characters + warn warn about inconsistencies + nodefault don't create default echo-all rule + noyywrap don't use yywrap() function + yyclass define name of the scanner class +*/ +%option c++ +%option 8bit warn nodefault +%option noyywrap +%option yyclass="step::scanner" + +%top{ +// This file is part of Open CASCADE Technology software library. +// This file is generated, do not modify it directly; edit source file step.lex instead. + +// Pre-include stdlib.h to avoid redefinition of integer type macros (INT8_MIN and similar in generated code) +#if !defined(_MSC_VER) || (_MSC_VER >= 1600) // Visual Studio 2010+ +#include "stdint.h" +#endif +} + %{ -#include "step.tab.h" +#include "step.tab.hxx" #include "recfile.ph" #include "stdio.h" -#include + +// Tell flex which function to define +#ifdef YY_DECL +# undef YY_DECL +#endif +#define YY_DECL int step::scanner::lex (step::parser::semantic_type* /*yylval*/, step::parser::location_type* /*yylloc*/) + +typedef step::parser::token token; /* skl 31.01.2002 for OCC133(OCC96,97) - uncorrect long string in files Henri.stp and 401.stp*/ -#define YY_FATAL_ERROR(msg) StepFile_CallFailure( msg ) +#include +#define YY_FATAL_ERROR(msg) Standard_Failure::Raise(msg); /* abv 07.06.02: force inclusion of stdlib.h on WNT to avoid warnings */ +#ifdef _MSC_VER +// add includes for flex 2.91 (Linux version) #include +#include -/* -void steperror ( FILE *input_file ); -void steprestart ( FILE *input_file ); -*/ -void rec_restext(char *newtext, int lentext); -void rec_typarg(int argtype); - - int steplineno; /* Comptage de ligne (ben oui, fait tout faire) */ - - int modcom = 0; /* Commentaires type C */ - int modend = 0; /* Flag for finishing of the STEP file */ - void resultat () /* Resultat alloue dynamiquement, "jete" une fois lu */ - { if (modcom == 0) rec_restext(yytext,yyleng); } - -// MSVC specifics -#ifdef _MSC_VER +// Avoid includion of unistd.h if parser is generated on Linux (flex 2.5.35) +#ifndef YY_NO_UNISTD_H +#define YY_NO_UNISTD_H +#endif -// disable MSVC warnings in flex code +// disable MSVC warnings in flex 2.89 and 2.5.35 code // Note that Intel compiler also defines _MSC_VER but has different warning ids #if defined(__INTEL_COMPILER) #pragma warning(disable:177 1786 1736) +#elif defined(__clang__) +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma GCC diagnostic ignored "-Winconsistent-dllimport" +#pragma GCC diagnostic ignored "-Wunneeded-internal-declaration" #else -#pragma warning(disable:4131 4244 4273 4267 4127) +#pragma warning(disable:4131 4244 4273 4127 4267) #endif -// Avoid includion of unistd.h if parser is generated on Linux (flex 2.5.35) -#define YY_NO_UNISTD_H +#endif /* MSC_VER */ -#endif +void rec_restext(const char *constnewtext, int lentext); +void rec_typarg(int argtype); // disable GCC warnings in flex code #ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wunused-function" #endif - %} +%x Com End Text %% +"/*" { BEGIN(Com); } /* start of comment - put the scanner in the "Com" state */ +[^*\n]* {;} /* in comment, skip any characters except asterisk (and newline, handled by its own rule) */ +[*]+[^*/\n]* {;} /* in comment, skip any sequence of asterisks followed by other symbols (except slash or newline) */ +[*]+[/] { BEGIN(INITIAL); } /* end of comment - reset the scanner to initial state */ + +['] { BEGIN(Text); yymore(); } /* start of quoted text string - put the scanner in the "Text" state, but keep ' as part of yytext */ +[\n] { yymore(); yylineno ++; } /* newline in text string - increment line counter and keep collecting yytext */ +['] { yymore(); } /* single ' inside text string - keep collecting yytext*/ +[^\n']+ { yymore(); } /* a sequence of any characters except ' and \n - keep collecting yytext */ +[']/[" "\n\r]*[\)\,] { BEGIN(INITIAL); rec_restext(YYText(),YYLeng()); rec_typarg(rec_argText); return(token::QUID); } /* end of string (apostrophe followed by comma or closing parenthesis) - reset the scanner to initial state, record the value of all yytext collected */ + " " {;} " " {;} -[\n] { steplineno ++; } -[\r] {;} /* abv 30.06.00: for reading DOS files */ +<*>[\n] { yylineno ++; } /* count lines (one rule for all start conditions) */ +[\r] {;} /* abv 30.06.00: for reading DOS files */ [\0]+ {;} /* fix from C21. for test load e3i file with line 15 with null symbols */ -#[0-9]+/= { resultat(); if (modcom == 0) return(ENTITY); } -#[0-9]+/[ ]*= { resultat(); if (modcom == 0) return(ENTITY); } -#[0-9]+ { resultat(); if (modcom == 0) return(IDENT); } -[-+0-9][0-9]* { resultat(); if (modcom == 0) { rec_typarg(rec_argInteger); return(QUID); } } -[-+\.0-9][\.0-9]+ { resultat(); if (modcom == 0) { rec_typarg(rec_argFloat); return(QUID); } } -[-+\.0-9][\.0-9]+E[-+0-9][0-9]* { resultat(); if (modcom == 0) { rec_typarg(rec_argFloat); return(QUID); } } -[\']([\n]|[\000\011-\046\050-\176\201-\237\240-\777]|[\047][\047])*[\'] { resultat(); if (modcom == 0) { rec_typarg(rec_argText); return(QUID); } } -["][0-9A-F]+["] { resultat(); if (modcom == 0) { rec_typarg(rec_argHexa); return(QUID); } } -[.][A-Z0-9_]+[.] { resultat(); if (modcom == 0) { rec_typarg(rec_argEnum); return(QUID); } } -[(] { if (modcom == 0) return ('('); } -[)] { if (modcom == 0) return (')'); } -[,] { if (modcom == 0) return (','); } -[$] { resultat(); if (modcom == 0) { rec_typarg(rec_argNondef); return(QUID); } } -[=] { if (modcom == 0) return ('='); } -[;] { if (modcom == 0) return (';'); } -"/*" { modcom = 1; } -"*/" { if (modend == 0) modcom = 0; } - -STEP; { if (modcom == 0) return(STEP); } -HEADER; { if (modcom == 0) return(HEADER); } -ENDSEC; { if (modcom == 0) return(ENDSEC); } -DATA; { if (modcom == 0) return(DATA); } -ENDSTEP; { if (modend == 0) {modcom = 0; return(ENDSTEP);} } -"ENDSTEP;".* { if (modend == 0) {modcom = 0; return(ENDSTEP);} } -END-ISO[0-9\-]*; { modcom = 1; modend = 1; return(ENDSTEP); } -ISO[0-9\-]*; { if (modend == 0) {modcom = 0; return(STEP); } } - -[/] { if (modcom == 0) return ('/'); } -&SCOPE { if (modcom == 0) return(SCOPE); } -ENDSCOPE { if (modcom == 0) return(ENDSCOPE); } -[a-zA-Z0-9_]+ { resultat(); if (modcom == 0) return(TYPE); } -![a-zA-Z0-9_]+ { resultat(); if (modcom == 0) return(TYPE); } -[^)] { resultat(); if (modcom == 0) { rec_typarg(rec_argMisc); return(QUID); } } +#[0-9]+/= { rec_restext(YYText(),YYLeng()); return(token::ENTITY); } +#[0-9]+/[ ]*= { rec_restext(YYText(),YYLeng()); return(token::ENTITY); } +#[0-9]+ { rec_restext(YYText(),YYLeng()); return(token::IDENT); } +[-+0-9][0-9]* { rec_restext(YYText(),YYLeng()); rec_typarg(rec_argInteger); return(token::QUID); } +[-+\.0-9][\.0-9]+ { rec_restext(YYText(),YYLeng()); rec_typarg(rec_argFloat); return(token::QUID); } +[-+\.0-9][\.0-9]+E[-+0-9][0-9]* { rec_restext(YYText(),YYLeng()); rec_typarg(rec_argFloat); return(token::QUID); } +["][0-9A-F]+["] { rec_restext(YYText(),YYLeng()); rec_typarg(rec_argHexa); return(token::QUID); } +[.][A-Z0-9_]+[.] { rec_restext(YYText(),YYLeng()); rec_typarg(rec_argEnum); return(token::QUID); } +[(] { return ('('); } +[)] { return (')'); } +[,] { return (','); } +[$] { rec_restext(YYText(),YYLeng()); rec_typarg(rec_argNondef); return(token::QUID); } +[=] { return ('='); } +[;] { return (';'); } + +STEP; { return(token::STEP); } +HEADER; { return(token::HEADER); } +ENDSEC; { return(token::ENDSEC); } +DATA; { return(token::DATA); } +ENDSTEP; { return(token::ENDSTEP);} +"ENDSTEP;".* { return(token::ENDSTEP);} +END-ISO[0-9\-]*; { BEGIN(End); return(token::ENDSTEP); } /* at the end of the STEP data, enter dedicated start condition "End" to skip everything that follows */ +ISO[0-9\-]*; { return(token::STEP); } + +[/] { return ('/'); } +&SCOPE { return(token::SCOPE); } +ENDSCOPE { return(token::ENDSCOPE); } +[a-zA-Z0-9_]+ { rec_restext(YYText(),YYLeng()); return(token::TYPE); } +![a-zA-Z0-9_]+ { rec_restext(YYText(),YYLeng()); return(token::TYPE); } +[^)] { rec_restext(YYText(),YYLeng()); rec_typarg(rec_argMisc); return(token::QUID); } + +[^\n] {;} /* skip any characters (except newlines) */ + +%% + +step::scanner::scanner(std::istream* in, std::ostream* out) + : stepFlexLexer(in, out) +{ +} diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/stepread.c opencascade-7.5.1+dfsg1/src/StepFile/stepread.c --- opencascade-7.4.1+dfsg1/src/StepFile/stepread.c 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/stepread.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -/* - Copyright (c) 1999-2014 OPEN CASCADE SAS - - This file is part of Open CASCADE Technology software library. - - This library is free software; you can redistribute it and/or modify it under - the terms of the GNU Lesser General Public License version 2.1 as published - by the Free Software Foundation, with special exception defined in the file - OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT - distribution for complete text of the license and disclaimer of any warranty. - - Alternatively, this file may be used under the terms of Open CASCADE - commercial license or contractual agreement. -*/ - -/* pdn PRO16162: do restart in order to restore after possible crash or wrong data -*/ -/*rln 10.01.99 - transmission of define's into this file -*/ -/** -*/ - -#include -#include -#include -#include "recfile.ph" -#include - -/* StepFile_Error.c - - Ce programme substitue au yyerror standard, qui fait "exit" (brutal !) - une action plus adaptee a un fonctionnement en process : - - Affichage de la ligne qui a provoque l' erreur, - Preparation d'un eventuel appel suivant (vu qu on ne fait plus exit), - en pour le retour, on s'arrange pour lever une exception - (c-a-d qu on provoque un plantage) - - Adaptation pour flex (flex autorise d avoir plusieurs lex dans un meme - executable) : les fonctions et variables sont renommees; et la - continuation a change -*/ - -static int lastno; -extern int steplineno; - -extern void StepFile_Interrupt (char* nomfic); /* rln 13.09.00 port on HP*/ -int stepparse(void); -void rec_debfile(); -void steprestart(FILE *input_file); -void rec_finfile(); - -void steperror (char *mess) -{ - char newmess[80]; - if (steplineno == lastno) return; - lastno = steplineno; - sprintf (newmess,"At line %d, %s",steplineno+1,mess); - -/* yysbuf[0] = '\0'; - yysptr = yysbuf; - * yylineno = 0; */ - - StepFile_Interrupt(newmess); -} - -/* But de ce mini-programme : appeler yyparse et si besoin preciser un - fichier d'entree - StepFile_Error redefinit yyerror pour ne pas stopper (s'y reporter) -*/ - -extern FILE* stepin ; /* input de yyparse (executeur de lex-yacc) */ -extern int steplineno; /* compteur de ligne lex (pour erreurs) */ - - -/* Designation d'un fichier de lecture - (par defaut, c'est l'entree standard) - - Appel : iflag = stepread_setinput ("...") ou (char[] ...) ; - stepread_setinput ("") [longueur nulle] laisse en standard - iflag retourne vaut 0 si c'est OK, 1 sinon -*/ - -FILE* stepread_setinput (char* nomfic) -{ - FILE* newin ; - if (strlen(nomfic) == 0) return stepin ; - newin = OSD_OpenFile(nomfic,"r"); - - if (newin == NULL) { - return NULL ; - } else { - stepin = newin ; return newin ; - } -} - -void stepread_endinput (FILE* infic, char* nomfic) -{ - if (!infic) return; - if (strlen(nomfic) == 0) return; - fclose (infic); -} - -/* Lecture d'un fichier ia grammaire lex-yacc - Appel : i = stepread() ; i est la valeur retournee par yyparse - (0 si OK, 1 si erreur) -*/ -int stepread () -{ - int letat; - lastno = 0; - steplineno = 0; - rec_debfile() ; - steprestart(stepin); - letat = stepparse() ; - rec_finfile() ; - return letat; -} - -int stepwrap () { return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/stepread.cxx opencascade-7.5.1+dfsg1/src/StepFile/stepread.cxx --- opencascade-7.4.1+dfsg1/src/StepFile/stepread.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/stepread.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,46 @@ +/* + Copyright (c) 1999-2014 OPEN CASCADE SAS + + This file is part of Open CASCADE Technology software library. + + This library is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License version 2.1 as published + by the Free Software Foundation, with special exception defined in the file + OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT + distribution for complete text of the license and disclaimer of any warranty. + + Alternatively, this file may be used under the terms of Open CASCADE + commercial license or contractual agreement. +*/ + +/* + pdn PRO16162: do restart in order to restore after possible crash or wrong data + rln 10.01.99 - transmission of define's into this file +*/ + +#include +#include +#include +#include +#include "recfile.ph" + +void rec_debfile(); +void rec_finfile(); + +/* + Lecture d'un fichier ia grammaire lex-yacc + Appel : i = stepread() ; i est la valeur retournee par yyparse + (0 si OK, 1 si erreur) +*/ + +int stepread(std::istream& theStream) +{ + int aLetat = 0; + rec_debfile(); + step::scanner aScanner(&theStream); + aScanner.yyrestart(theStream); + step::parser aParser(&aScanner); + aLetat = aParser.parse(); + rec_finfile(); + return aLetat; +} \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/stepread.ph opencascade-7.5.1+dfsg1/src/StepFile/stepread.ph --- opencascade-7.4.1+dfsg1/src/StepFile/stepread.ph 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/stepread.ph 2021-02-02 08:51:56.000000000 +0000 @@ -16,18 +16,24 @@ // stepread.h /* lecture du fichier STEP (par appel a lex+yac) */ +#include +#ifdef __cplusplus +extern "C" { +#endif -extern "C" FILE* stepread_setinput (char* nomfic) ; -extern "C" void stepread_endinput (FILE* infic, char* nomfic); -extern "C" int stepread() ; -extern "C" void recfile_modeprint (int mode) ; /* controle trace recfile */ - +void recfile_modeprint (int mode) ; /* controle trace recfile */ /* creation du Direc a partir de recfile : entrys connues de c++ */ -extern "C" void lir_file_nbr(int* nbh, int* nbr, int* nbp) ; -extern "C" int lir_file_rec(char* *ident , char* *type , int* nbarg) ; -extern "C" void lir_file_finrec() ; -extern "C" int lir_file_arg(int* type , char* *val) ; -extern "C" void lir_file_fin(int mode); +void lir_file_nbr(int* nbh, int* nbr, int* nbp) ; +int lir_file_rec(char* *ident , char* *type , int* nbarg) ; +void lir_file_finrec() ; +int lir_file_arg(int* type , char* *val) ; +void lir_file_fin(int mode); /* Interruption passant par C++ */ -extern "C" void StepFile_Interrupt (char* nomfic); + +#ifdef __cplusplus +} +#endif + +int stepread(std::istream& theStream); +void StepFile_Interrupt (char* theNomfic); \ No newline at end of file diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/step.tab.c opencascade-7.5.1+dfsg1/src/StepFile/step.tab.c --- opencascade-7.4.1+dfsg1/src/StepFile/step.tab.c 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/step.tab.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1799 +0,0 @@ -/* A Bison parser, made by GNU Bison 2.7. */ - -/* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. - - 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 . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.7" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - - -/* Substitute the variable and function names. */ -#define yyparse stepparse -#define yylex steplex -#define yyerror steperror -#define yylval steplval -#define yychar stepchar -#define yydebug stepdebug -#define yynerrs stepnerrs - -/* Copy the first part of user declarations. */ -/* Line 371 of yacc.c */ -#line 18 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - -#include "recfile.ph" /* definitions des types d'arguments */ -#include "recfile.pc" /* la-dedans, tout y est */ -/* -#define stepparse STEPparse -#define steplex STEPlex -#define stepwrap STEPwrap -#define steprestart STEPrestart -#define steplex STEPlex -#define steplval STEPlval -#define stepval STEPval -#define stepchar STEPchar -#define stepdebug STEPdebug -#define stepnerrs STEPnerrs -#define steperror STEPerror -*/ -#define stepclearin yychar = -1 -#define steperrok yyerrflag = 0 - -/* -#define stepin STEPin -#define yyerrflag STEPerrflag -#define yyerrstatus STEPerrflag -*/ - -/* ABV 19.12.00: merging porting modifications by POP (for WNT, AIX) */ -#if defined(_WIN32) && !defined(MSDOS) -#define MSDOS _WIN32 -#endif -#if defined(_AIX) -#include -#define alloca malloc -#endif - - -// disable MSVC warnings in bison code -#ifdef _MSC_VER -#pragma warning(disable:4244 4131 4127 4702) -#define YYMALLOC malloc -#define YYFREE free -#endif - - -/* Line 371 of yacc.c */ -#line 119 "step.tab.c" - -# ifndef YY_NULL -# if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULL nullptr -# else -# define YY_NULL 0 -# endif -# endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* In a future release of Bison, this section will be replaced - by #include "step.tab.h". */ -#ifndef YY_STEP_STEP_TAB_H_INCLUDED -# define YY_STEP_STEP_TAB_H_INCLUDED -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int stepdebug; -#endif - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - STEP = 258, - HEADER = 259, - ENDSEC = 260, - DATA = 261, - ENDSTEP = 262, - SCOPE = 263, - ENDSCOPE = 264, - ENTITY = 265, - TYPE = 266, - INTEGER = 267, - FLOAT = 268, - IDENT = 269, - TEXT = 270, - NONDEF = 271, - ENUM = 272, - HEXA = 273, - QUID = 274 - }; -#endif - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - -extern YYSTYPE steplval; - -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int stepparse (void *YYPARSE_PARAM); -#else -int stepparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int stepparse (void); -#else -int stepparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - -#endif /* !YY_STEP_STEP_TAB_H_INCLUDED */ - -/* Copy the second part of user declarations. */ - -/* Line 390 of yacc.c */ -#line 204 "step.tab.c" - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(Msgid) dgettext ("bison-runtime", Msgid) -# endif -# endif -# ifndef YY_ -# define YY_(Msgid) Msgid -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) -#else -# define YYUSE(E) /* empty */ -#endif - -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(N) (N) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int yyi) -#else -static int -YYID (yyi) - int yyi; -#endif -{ - return yyi; -} -#endif - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ - /* Use EXIT_SUCCESS as a witness for stdlib.h. */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined EXIT_SUCCESS \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss_alloc; - YYSTYPE yyvs_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -# define YYCOPY_NEEDED 1 - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) - -#endif - -#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from SRC to DST. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) -# else -# define YYCOPY(Dst, Src, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (Dst)[yyi] = (Src)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif -#endif /* !YYCOPY_NEEDED */ - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 7 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 81 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 27 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 27 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 49 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 85 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 274 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 20, 2, 2, 2, 2, 2, 2, 2, - 22, 23, 2, 2, 24, 2, 2, 26, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, - 2, 25, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19 -}; - -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint8 yyprhs[] = -{ - 0, 0, 3, 5, 8, 10, 13, 22, 30, 37, - 39, 41, 43, 45, 48, 52, 54, 56, 58, 60, - 62, 65, 67, 69, 71, 73, 76, 80, 83, 85, - 89, 92, 94, 97, 102, 110, 117, 119, 122, 126, - 129, 133, 135, 137, 139, 143, 145, 147, 152, 154 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 33, 0, -1, 20, -1, 28, 20, -1, 7, -1, - 7, 28, -1, 3, 4, 34, 5, 36, 43, 5, - 29, -1, 3, 4, 5, 36, 43, 5, 7, -1, - 3, 4, 5, 36, 43, 1, -1, 30, -1, 31, - -1, 32, -1, 35, -1, 34, 35, -1, 53, 41, - 21, -1, 1, -1, 6, -1, 14, -1, 19, -1, - 41, -1, 38, 41, -1, 1, -1, 11, -1, 22, - -1, 23, -1, 39, 40, -1, 39, 42, 40, -1, - 39, 1, -1, 37, -1, 42, 24, 37, -1, 42, - 1, -1, 44, -1, 43, 44, -1, 52, 25, 46, - 21, -1, 52, 25, 47, 43, 51, 46, 21, -1, - 52, 25, 47, 51, 46, 21, -1, 1, -1, 53, - 41, -1, 45, 53, 41, -1, 53, 41, -1, 22, - 45, 23, -1, 8, -1, 14, -1, 48, -1, 49, - 24, 48, -1, 26, -1, 9, -1, 9, 50, 49, - 26, -1, 10, -1, 11, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint8 yyrline[] = -{ - 0, 64, 64, 65, 66, 67, 68, 69, 70, 71, - 71, 71, 74, 75, 77, 78, 80, 83, 84, 85, - 86, 87, 91, 94, 97, 102, 103, 104, 106, 107, - 108, 110, 111, 113, 114, 115, 116, 118, 119, 121, - 122, 124, 127, 130, 131, 133, 136, 138, 143, 146 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || 0 -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "STEP", "HEADER", "ENDSEC", "DATA", - "ENDSTEP", "SCOPE", "ENDSCOPE", "ENTITY", "TYPE", "INTEGER", "FLOAT", - "IDENT", "TEXT", "NONDEF", "ENUM", "HEXA", "QUID", "' '", "';'", "'('", - "')'", "','", "'='", "'/'", "$accept", "finvide", "finstep", "stepf1", - "stepf2", "stepf3", "stepf", "headl", "headent", "endhead", "unarg", - "listype", "deblist", "finlist", "listarg", "arglist", "model", "bloc", - "plex", "unent", "debscop", "unid", "export", "debexp", "finscop", - "entlab", "enttype", YY_NULL -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 32, 59, 40, 41, 44, 61, 47 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 27, 28, 28, 29, 29, 30, 31, 32, 33, - 33, 33, 34, 34, 35, 35, 36, 37, 37, 37, - 37, 37, 38, 39, 40, 41, 41, 41, 42, 42, - 42, 43, 43, 44, 44, 44, 44, 45, 45, 46, - 46, 47, 48, 49, 49, 50, 51, 51, 52, 53 -}; - -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 1, 2, 1, 2, 8, 7, 6, 1, - 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, - 2, 1, 1, 1, 1, 2, 3, 2, 1, 3, - 2, 1, 2, 4, 7, 6, 1, 2, 3, 2, - 3, 1, 1, 1, 3, 1, 1, 4, 1, 1 -}; - -/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 0, 0, 9, 10, 11, 0, 0, 1, 15, 0, - 49, 0, 12, 0, 16, 0, 0, 13, 23, 0, - 0, 36, 48, 0, 31, 0, 0, 21, 22, 17, - 18, 24, 28, 0, 25, 19, 0, 14, 36, 0, - 32, 0, 0, 20, 30, 0, 26, 7, 41, 0, - 0, 0, 0, 0, 21, 29, 0, 0, 33, 46, - 0, 0, 39, 4, 6, 40, 0, 37, 45, 0, - 0, 0, 2, 5, 38, 42, 43, 0, 0, 35, - 3, 0, 47, 34, 44 -}; - -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int8 yydefgoto[] = -{ - -1, 73, 64, 2, 3, 4, 5, 11, 12, 15, - 32, 33, 19, 34, 35, 36, 23, 24, 56, 50, - 51, 76, 77, 69, 61, 25, 52 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -26 -static const yytype_int8 yypact[] = -{ - 27, 30, -26, -26, -26, 31, 36, -26, -26, 55, - -26, 49, -26, 14, -26, 41, 55, -26, -26, 10, - 42, -26, -26, 9, -26, 37, 41, -3, -26, -26, - -26, -26, -26, 14, -26, -26, 4, -26, 65, 59, - -26, 1, 54, -26, -26, 24, -26, -26, -26, 56, - 48, 47, 14, 61, -26, -26, -7, 14, -26, 44, - 47, -5, -26, 51, -26, -26, 14, -26, -26, 58, - -5, 52, -26, 57, -26, -26, -26, -11, 53, -26, - -26, 58, -26, -26, -26 -}; - -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] = -{ - -26, -26, -26, -26, -26, -26, -26, -26, 64, 60, - 33, -26, -26, 43, -13, -26, -25, -20, -26, -12, - -26, -1, -26, -26, 21, -26, -4 -}; - -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -28 -static const yytype_int8 yytable[] = -{ - 20, 42, 13, 40, 10, 44, 10, 13, -27, 48, - 38, 27, 10, 81, 39, 82, 65, 49, -27, 22, - 43, 28, 40, 49, 29, 54, 60, 31, 45, 30, - 1, 7, 18, 31, 6, 28, 18, 8, 29, 62, - 40, 9, 21, 30, 67, 57, 18, 10, 21, 71, - 8, 22, 66, 74, 16, 21, 59, 22, 78, 53, - 10, 14, 41, 37, 22, -8, 47, 10, 63, 58, - 68, 72, 75, 79, 83, 17, 26, 80, 55, 46, - 84, 70 -}; - -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-26))) - -#define yytable_value_is_error(Yytable_value) \ - YYID (0) - -static const yytype_uint8 yycheck[] = -{ - 13, 26, 6, 23, 11, 1, 11, 11, 11, 8, - 1, 1, 11, 24, 5, 26, 23, 22, 21, 10, - 33, 11, 42, 22, 14, 1, 51, 23, 24, 19, - 3, 0, 22, 23, 4, 11, 22, 1, 14, 52, - 60, 5, 1, 19, 57, 49, 22, 11, 1, 61, - 1, 10, 56, 66, 5, 1, 9, 10, 70, 5, - 11, 6, 25, 21, 10, 0, 7, 11, 7, 21, - 26, 20, 14, 21, 21, 11, 16, 20, 45, 36, - 81, 60 -}; - -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 3, 30, 31, 32, 33, 4, 0, 1, 5, - 11, 34, 35, 53, 6, 36, 5, 35, 22, 39, - 41, 1, 10, 43, 44, 52, 36, 1, 11, 14, - 19, 23, 37, 38, 40, 41, 42, 21, 1, 5, - 44, 25, 43, 41, 1, 24, 40, 7, 8, 22, - 46, 47, 53, 5, 1, 37, 45, 53, 21, 9, - 43, 51, 41, 7, 29, 23, 53, 41, 26, 50, - 51, 46, 20, 28, 41, 14, 48, 49, 46, 21, - 20, 24, 26, 21, 48 -}; - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. However, - YYFAIL appears to be in use. Nevertheless, it is formally deprecated - in Bison 2.4.2's NEWS entry, where a plan to phase it out is - discussed. */ - -#define YYFAIL goto yyerrlab -#if defined YYFAIL - /* This is here to suppress warnings from the GCC cpp's - -Wunused-macros. Normally we don't worry about that warning, but - some users do, and we want to make it easy for users to remove - YYFAIL uses, which will produce warnings from Bison 2.5. */ -#endif - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - -/* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* This macro is provided for backward compatibility. */ -#ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -#endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - FILE *yyo = yyoutput; - YYUSE (yyo); - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -#else -static void -yy_stack_print (yybottom, yytop) - yytype_int16 *yybottom; - yytype_int16 *yytop; -#endif -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <= yytop; yybottom++) - { - int yybot = *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message - about the unexpected token YYTOKEN for the state stack whose top is - YYSSP. - - Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is - not large enough to hold the message. In that case, also set - *YYMSG_ALLOC to the required number of bytes. Return 2 if the - required number of bytes is too large to store. */ -static int -yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, - yytype_int16 *yyssp, int yytoken) -{ - YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); - YYSIZE_T yysize = yysize0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - /* Internationalized format string. */ - const char *yyformat = YY_NULL; - /* Arguments of yyformat. */ - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - /* Number of reported tokens (one for the "unexpected", one per - "expected"). */ - int yycount = 0; - - /* There are many possibilities here to consider: - - Assume YYFAIL is not used. It's too flawed to consider. See - - for details. YYERROR is fine as it does not invoke this - function. - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yychar) is if - this state is a consistent state with a default action. Thus, - detecting the absence of a lookahead is sufficient to determine - that there is no unexpected or expected token to report. In that - case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is a - consistent state with a default action. There might have been a - previous inconsistent state, consistent state with a non-default - action, or user semantic action that manipulated yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state merging - (from LALR or IELR) and default reductions corrupt the expected - token list. However, the list is correct for canonical LR with - one exception: it will still contain any token that will not be - accepted due to an error action in a later state. - */ - if (yytoken != YYEMPTY) - { - int yyn = yypact[*yyssp]; - yyarg[yycount++] = yytname[yytoken]; - if (!yypact_value_is_default (yyn)) - { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yyx; - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR - && !yytable_value_is_error (yytable[yyx + yyn])) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - break; - } - yyarg[yycount++] = yytname[yyx]; - { - YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - } - } - } - - switch (yycount) - { -# define YYCASE_(N, S) \ - case N: \ - yyformat = S; \ - break - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -# undef YYCASE_ - } - - { - YYSIZE_T yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } - - if (*yymsg_alloc < yysize) - { - *yymsg_alloc = 2 * yysize; - if (! (yysize <= *yymsg_alloc - && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) - *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; - return 1; - } - - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - { - char *yyp = *yymsg; - int yyi = 0; - while ((*yyp = *yyformat) != '\0') - if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyformat += 2; - } - else - { - yyp++; - yyformat++; - } - } - return 0; -} -#endif /* YYERROR_VERBOSE */ - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif -{ - YYUSE (yyvaluep); - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - - default: - break; - } -} - - - - -/* The lookahead symbol. */ -int yychar; - - -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval YY_INITIAL_VALUE(yyval_default); - -/* Number of syntax errors so far. */ -int yynerrs; - - -/*----------. -| yyparse. | -`----------*/ - -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () - -#endif -#endif -{ - int yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - `yyss': related to states. - `yyvs': related to semantic values. - - Refer to the stacks through separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - YYSIZE_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken = 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yyssp = yyss = yyssa; - yyvsp = yyvs = yyvsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yypact_value_is_default (yyn)) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yytable_value_is_error (yyn)) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar = YYEMPTY; - - yystate = yyn; - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 11: -/* Line 1792 of yacc.c */ -#line 72 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_finfile(); return(0); /* fini pour celui-la */ } - break; - - case 16: -/* Line 1792 of yacc.c */ -#line 81 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_finhead(); } - break; - - case 17: -/* Line 1792 of yacc.c */ -#line 83 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_typarg(rec_argIdent); rec_newarg(); } - break; - - case 18: -/* Line 1792 of yacc.c */ -#line 84 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { /* deja fait par lex*/ rec_newarg(); } - break; - - case 19: -/* Line 1792 of yacc.c */ -#line 85 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_newarg(); } - break; - - case 20: -/* Line 1792 of yacc.c */ -#line 86 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_newarg(); } - break; - - case 21: -/* Line 1792 of yacc.c */ -#line 87 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_typarg(rec_argMisc); rec_newarg(); - yyerrstatus = 1; yyclearin; } - break; - - case 22: -/* Line 1792 of yacc.c */ -#line 92 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_listype(); } - break; - - case 23: -/* Line 1792 of yacc.c */ -#line 95 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_deblist(); } - break; - - case 24: -/* Line 1792 of yacc.c */ -#line 98 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { if (modeprint > 0) - { printf("Record no : %d -- ",nbrec+1); rec_print(currec); } - rec_newent (); yyerrstatus = 0; } - break; - - case 41: -/* Line 1792 of yacc.c */ -#line 125 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { scope_debut(); } - break; - - case 42: -/* Line 1792 of yacc.c */ -#line 128 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_typarg(rec_argIdent); rec_newarg(); } - break; - - case 45: -/* Line 1792 of yacc.c */ -#line 134 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_deblist(); } - break; - - case 46: -/* Line 1792 of yacc.c */ -#line 137 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { scope_fin(); } - break; - - case 47: -/* Line 1792 of yacc.c */ -#line 139 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { printf("*** Warning : Export List not yet processed\n"); - rec_newent(); scope_fin() ; } - break; - - case 48: -/* Line 1792 of yacc.c */ -#line 144 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_ident(); } - break; - - case 49: -/* Line 1792 of yacc.c */ -#line 147 "D:/ABV/OCCT/occt7/src/StepFile/step.yacc" - { rec_type (); } - break; - - -/* Line 1792 of yacc.c */ -#line 1570 "step.tab.c" - default: break; - } - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action invokes - YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or - if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an - incorrect destructor might then be invoked immediately. In the - case of YYERROR or YYBACKUP, subsequent parser actions might lead - to an incorrect destructor call or verbose syntax error message - before the lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); - - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else -# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ - yyssp, yytoken) - { - char const *yymsgp = YY_("syntax error"); - int yysyntax_error_status; - yysyntax_error_status = YYSYNTAX_ERROR; - if (yysyntax_error_status == 0) - yymsgp = yymsg; - else if (yysyntax_error_status == 1) - { - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); - if (!yymsg) - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - yysyntax_error_status = 2; - } - else - { - yysyntax_error_status = YYSYNTAX_ERROR; - yymsgp = yymsg; - } - } - yyerror (yymsgp); - if (yysyntax_error_status == 2) - goto yyexhaustedlab; - } -# undef YYSYNTAX_ERROR -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#if !defined yyoverflow || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEMPTY) - { - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = YYTRANSLATE (yychar); - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - } - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} - - diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/step.tab.cxx opencascade-7.5.1+dfsg1/src/StepFile/step.tab.cxx --- opencascade-7.4.1+dfsg1/src/StepFile/step.tab.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/step.tab.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,1113 @@ +// A Bison parser, made by GNU Bison 3.7.1. + +// Skeleton implementation for Bison LALR(1) parsers in C++ + +// Copyright (C) 2002-2015, 2018-2020 Free Software Foundation, Inc. + +// 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 . + +// As a special exception, you may create a larger work that contains +// part or all of the Bison parser skeleton and distribute that work +// under terms of your choice, so long as that work isn't itself a +// parser generator using the skeleton or a modified version thereof +// as a parser skeleton. Alternatively, if you modify or redistribute +// the parser skeleton itself, you may (at your option) remove this +// special exception, which will cause the skeleton and the resulting +// Bison output files to be licensed under the GNU General Public +// License without this special exception. + +// This special exception was added by the Free Software Foundation in +// version 2.2 of Bison. + +// DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, +// especially those whose name start with YY_ or yy_. They are +// private implementation details that can be changed or removed. + +// "%code top" blocks. + +// This file is part of Open CASCADE Technology software library. +// This file is generated, do not modify it directly; edit source file step.yacc instead. + + +// Take the name prefix into account. +#define yylex steplex + + + +#include "step.tab.hxx" + + +// Unqualified %code blocks. + +#include "recfile.ph" /* definitions des types d'arguments */ +#include "recfile.pc" /* la-dedans, tout y est */ + +#undef yylex +#define yylex scanner->lex + +#define stepclearin yychar = -1 +#define steperrok yyerrflag = 0 + +// disable MSVC warnings in bison code +#ifdef _MSC_VER +#pragma warning(disable:4065 4244 4131 4127 4702) +#define YYMALLOC malloc +#define YYFREE free +#endif +void StepFile_Interrupt (char* nomfic); /* rln 13.09.00 port on HP*/ + + + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include // FIXME: INFRINGES ON USER NAME SPACE. +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + + +// Whether we are compiled with exception support. +#ifndef YY_EXCEPTIONS +# if defined __GNUC__ && !defined __EXCEPTIONS +# define YY_EXCEPTIONS 0 +# else +# define YY_EXCEPTIONS 1 +# endif +#endif + +#define YYRHSLOC(Rhs, K) ((Rhs)[K].location) +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +# ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).begin = YYRHSLOC (Rhs, 1).begin; \ + (Current).end = YYRHSLOC (Rhs, N).end; \ + } \ + else \ + { \ + (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \ + } \ + while (false) +# endif + + +// Enable debugging if requested. +#if YYDEBUG + +// A pseudo ostream that takes yydebug_ into account. +# define YYCDEBUG if (yydebug_) (*yycdebug_) + +# define YY_SYMBOL_PRINT(Title, Symbol) \ + do { \ + if (yydebug_) \ + { \ + *yycdebug_ << Title << ' '; \ + yy_print_ (*yycdebug_, Symbol); \ + *yycdebug_ << '\n'; \ + } \ + } while (false) + +# define YY_REDUCE_PRINT(Rule) \ + do { \ + if (yydebug_) \ + yy_reduce_print_ (Rule); \ + } while (false) + +# define YY_STACK_PRINT() \ + do { \ + if (yydebug_) \ + yy_stack_print_ (); \ + } while (false) + +#else // !YYDEBUG + +# define YYCDEBUG if (false) std::cerr +# define YY_SYMBOL_PRINT(Title, Symbol) YYUSE (Symbol) +# define YY_REDUCE_PRINT(Rule) static_cast (0) +# define YY_STACK_PRINT() static_cast (0) + +#endif // !YYDEBUG + +#define yyerrok (yyerrstatus_ = 0) +#define yyclearin (yyla.clear ()) + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab +#define YYRECOVERING() (!!yyerrstatus_) + +namespace step { + + /// Build a parser object. + parser::parser (step::scanner* scanner_yyarg) +#if YYDEBUG + : yydebug_ (false), + yycdebug_ (&std::cerr), +#else + : +#endif + scanner (scanner_yyarg) + {} + + parser::~parser () + {} + + parser::syntax_error::~syntax_error () YY_NOEXCEPT YY_NOTHROW + {} + + /*---------------. + | symbol kinds. | + `---------------*/ + + // basic_symbol. + template + parser::basic_symbol::basic_symbol (const basic_symbol& that) + : Base (that) + , value (that.value) + , location (that.location) + {} + + + /// Constructor for valueless symbols. + template + parser::basic_symbol::basic_symbol (typename Base::kind_type t, YY_MOVE_REF (location_type) l) + : Base (t) + , value () + , location (l) + {} + + template + parser::basic_symbol::basic_symbol (typename Base::kind_type t, YY_RVREF (semantic_type) v, YY_RVREF (location_type) l) + : Base (t) + , value (YY_MOVE (v)) + , location (YY_MOVE (l)) + {} + + template + parser::symbol_kind_type + parser::basic_symbol::type_get () const YY_NOEXCEPT + { + return this->kind (); + } + + template + bool + parser::basic_symbol::empty () const YY_NOEXCEPT + { + return this->kind () == symbol_kind::S_YYEMPTY; + } + + template + void + parser::basic_symbol::move (basic_symbol& s) + { + super_type::move (s); + value = YY_MOVE (s.value); + location = YY_MOVE (s.location); + } + + // by_kind. + parser::by_kind::by_kind () + : kind_ (symbol_kind::S_YYEMPTY) + {} + +#if 201103L <= YY_CPLUSPLUS + parser::by_kind::by_kind (by_kind&& that) + : kind_ (that.kind_) + { + that.clear (); + } +#endif + + parser::by_kind::by_kind (const by_kind& that) + : kind_ (that.kind_) + {} + + parser::by_kind::by_kind (token_kind_type t) + : kind_ (yytranslate_ (t)) + {} + + void + parser::by_kind::clear () + { + kind_ = symbol_kind::S_YYEMPTY; + } + + void + parser::by_kind::move (by_kind& that) + { + kind_ = that.kind_; + that.clear (); + } + + parser::symbol_kind_type + parser::by_kind::kind () const YY_NOEXCEPT + { + return kind_; + } + + parser::symbol_kind_type + parser::by_kind::type_get () const YY_NOEXCEPT + { + return this->kind (); + } + + + // by_state. + parser::by_state::by_state () YY_NOEXCEPT + : state (empty_state) + {} + + parser::by_state::by_state (const by_state& that) YY_NOEXCEPT + : state (that.state) + {} + + void + parser::by_state::clear () YY_NOEXCEPT + { + state = empty_state; + } + + void + parser::by_state::move (by_state& that) + { + state = that.state; + that.clear (); + } + + parser::by_state::by_state (state_type s) YY_NOEXCEPT + : state (s) + {} + + parser::symbol_kind_type + parser::by_state::kind () const YY_NOEXCEPT + { + if (state == empty_state) + return symbol_kind::S_YYEMPTY; + else + return YY_CAST (symbol_kind_type, yystos_[+state]); + } + + parser::stack_symbol_type::stack_symbol_type () + {} + + parser::stack_symbol_type::stack_symbol_type (YY_RVREF (stack_symbol_type) that) + : super_type (YY_MOVE (that.state), YY_MOVE (that.value), YY_MOVE (that.location)) + { +#if 201103L <= YY_CPLUSPLUS + // that is emptied. + that.state = empty_state; +#endif + } + + parser::stack_symbol_type::stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) that) + : super_type (s, YY_MOVE (that.value), YY_MOVE (that.location)) + { + // that is emptied. + that.kind_ = symbol_kind::S_YYEMPTY; + } + +#if YY_CPLUSPLUS < 201103L + parser::stack_symbol_type& + parser::stack_symbol_type::operator= (const stack_symbol_type& that) + { + state = that.state; + value = that.value; + location = that.location; + return *this; + } + + parser::stack_symbol_type& + parser::stack_symbol_type::operator= (stack_symbol_type& that) + { + state = that.state; + value = that.value; + location = that.location; + // that is emptied. + that.state = empty_state; + return *this; + } +#endif + + template + void + parser::yy_destroy_ (const char* yymsg, basic_symbol& yysym) const + { + if (yymsg) + YY_SYMBOL_PRINT (yymsg, yysym); + + // User destructor. + YYUSE (yysym.kind ()); + } + +#if YYDEBUG + template + void + parser::yy_print_ (std::ostream& yyo, const basic_symbol& yysym) const + { + std::ostream& yyoutput = yyo; + YYUSE (yyoutput); + if (yysym.empty ()) + yyo << "empty symbol"; + else + { + symbol_kind_type yykind = yysym.kind (); + yyo << (yykind < YYNTOKENS ? "token" : "nterm") + << ' ' << yysym.name () << " (" + << yysym.location << ": "; + YYUSE (yykind); + yyo << ')'; + } + } +#endif + + void + parser::yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym) + { + if (m) + YY_SYMBOL_PRINT (m, sym); + yystack_.push (YY_MOVE (sym)); + } + + void + parser::yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym) + { +#if 201103L <= YY_CPLUSPLUS + yypush_ (m, stack_symbol_type (s, std::move (sym))); +#else + stack_symbol_type ss (s, sym); + yypush_ (m, ss); +#endif + } + + void + parser::yypop_ (int n) + { + yystack_.pop (n); + } + +#if YYDEBUG + std::ostream& + parser::debug_stream () const + { + return *yycdebug_; + } + + void + parser::set_debug_stream (std::ostream& o) + { + yycdebug_ = &o; + } + + + parser::debug_level_type + parser::debug_level () const + { + return yydebug_; + } + + void + parser::set_debug_level (debug_level_type l) + { + yydebug_ = l; + } +#endif // YYDEBUG + + parser::state_type + parser::yy_lr_goto_state_ (state_type yystate, int yysym) + { + int yyr = yypgoto_[yysym - YYNTOKENS] + yystate; + if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate) + return yytable_[yyr]; + else + return yydefgoto_[yysym - YYNTOKENS]; + } + + bool + parser::yy_pact_value_is_default_ (int yyvalue) + { + return yyvalue == yypact_ninf_; + } + + bool + parser::yy_table_value_is_error_ (int yyvalue) + { + return yyvalue == yytable_ninf_; + } + + int + parser::operator() () + { + return parse (); + } + + int + parser::parse () + { + int yyn; + /// Length of the RHS of the rule being reduced. + int yylen = 0; + + // Error handling. + int yynerrs_ = 0; + int yyerrstatus_ = 0; + + /// The lookahead symbol. + symbol_type yyla; + + /// The locations where the error started and ended. + stack_symbol_type yyerror_range[3]; + + /// The return value of parse (). + int yyresult; + +#if YY_EXCEPTIONS + try +#endif // YY_EXCEPTIONS + { + YYCDEBUG << "Starting parse\n"; + + + /* Initialize the stack. The initial state will be set in + yynewstate, since the latter expects the semantical and the + location values to have been already stored, initialize these + stacks with a primary value. */ + yystack_.clear (); + yypush_ (YY_NULLPTR, 0, YY_MOVE (yyla)); + + /*-----------------------------------------------. + | yynewstate -- push a new symbol on the stack. | + `-----------------------------------------------*/ + yynewstate: + YYCDEBUG << "Entering state " << int (yystack_[0].state) << '\n'; + YY_STACK_PRINT (); + + // Accept? + if (yystack_[0].state == yyfinal_) + YYACCEPT; + + goto yybackup; + + + /*-----------. + | yybackup. | + `-----------*/ + yybackup: + // Try to take a decision without lookahead. + yyn = yypact_[+yystack_[0].state]; + if (yy_pact_value_is_default_ (yyn)) + goto yydefault; + + // Read a lookahead token. + if (yyla.empty ()) + { + YYCDEBUG << "Reading a token\n"; +#if YY_EXCEPTIONS + try +#endif // YY_EXCEPTIONS + { + yyla.kind_ = yytranslate_ (yylex (&yyla.value, &yyla.location)); + } +#if YY_EXCEPTIONS + catch (const syntax_error& yyexc) + { + YYCDEBUG << "Caught exception: " << yyexc.what() << '\n'; + error (yyexc); + goto yyerrlab1; + } +#endif // YY_EXCEPTIONS + } + YY_SYMBOL_PRINT ("Next token is", yyla); + + if (yyla.kind () == symbol_kind::S_YYerror) + { + // The scanner already issued an error message, process directly + // to error recovery. But do not keep the error token as + // lookahead, it is too special and may lead us to an endless + // loop in error recovery. */ + yyla.kind_ = symbol_kind::S_YYUNDEF; + goto yyerrlab1; + } + + /* If the proper action on seeing token YYLA.TYPE is to reduce or + to detect an error, take that action. */ + yyn += yyla.kind (); + if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.kind ()) + { + goto yydefault; + } + + // Reduce or error. + yyn = yytable_[yyn]; + if (yyn <= 0) + { + if (yy_table_value_is_error_ (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + // Count tokens shifted since error; after three, turn off error status. + if (yyerrstatus_) + --yyerrstatus_; + + // Shift the lookahead token. + yypush_ ("Shifting", state_type (yyn), YY_MOVE (yyla)); + goto yynewstate; + + + /*-----------------------------------------------------------. + | yydefault -- do the default action for the current state. | + `-----------------------------------------------------------*/ + yydefault: + yyn = yydefact_[+yystack_[0].state]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + + /*-----------------------------. + | yyreduce -- do a reduction. | + `-----------------------------*/ + yyreduce: + yylen = yyr2_[yyn]; + { + stack_symbol_type yylhs; + yylhs.state = yy_lr_goto_state_ (yystack_[yylen].state, yyr1_[yyn]); + /* If YYLEN is nonzero, implement the default value of the + action: '$$ = $1'. Otherwise, use the top of the stack. + + Otherwise, the following line sets YYLHS.VALUE to garbage. + This behavior is undocumented and Bison users should not rely + upon it. */ + if (yylen) + yylhs.value = yystack_[yylen - 1].value; + else + yylhs.value = yystack_[0].value; + + // Default location. + { + stack_type::slice range (yystack_, yylen); + YYLLOC_DEFAULT (yylhs.location, range, yylen); + yyerror_range[1].location = yylhs.location; + } + + // Perform the reduction. + YY_REDUCE_PRINT (yyn); +#if YY_EXCEPTIONS + try +#endif // YY_EXCEPTIONS + { + switch (yyn) + { + case 11: // stepf: stepf3 + { rec_finfile(); return(0); /* fini pour celui-la */ } + break; + + case 16: // endhead: DATA + { rec_finhead(); } + break; + + case 17: // unarg: IDENT + { rec_typarg(rec_argIdent); rec_newarg(); } + break; + + case 18: // unarg: QUID + { /* deja fait par lex*/ rec_newarg(); } + break; + + case 19: // unarg: listarg + { rec_newarg(); } + break; + + case 20: // unarg: listype listarg + { rec_newarg(); } + break; + + case 21: // unarg: error + { rec_typarg(rec_argMisc); rec_newarg(); + yyerrstatus_ = 1; yyclearin; } + break; + + case 22: // listype: TYPE + { rec_listype(); } + break; + + case 23: // deblist: '(' + { rec_deblist(); } + break; + + case 24: // finlist: ')' + { if (modeprint > 0) + { printf("Record no : %d -- ",nbrec+1); rec_print(currec); } + rec_newent (); yyerrstatus_ = 0; } + break; + + case 42: // debscop: SCOPE + { scope_debut(); } + break; + + case 43: // unid: IDENT + { rec_typarg(rec_argIdent); rec_newarg(); } + break; + + case 46: // debexp: '/' + { rec_deblist(); } + break; + + case 47: // finscop: ENDSCOPE + { scope_fin(); } + break; + + case 48: // finscop: ENDSCOPE debexp export '/' + { printf("*** Warning : Export List not yet processed\n"); + rec_newent(); scope_fin() ; } + break; + + case 49: // entlab: ENTITY + { rec_ident(); } + break; + + case 50: // enttype: TYPE + { rec_type (); } + break; + + + + default: + break; + } + } +#if YY_EXCEPTIONS + catch (const syntax_error& yyexc) + { + YYCDEBUG << "Caught exception: " << yyexc.what() << '\n'; + error (yyexc); + YYERROR; + } +#endif // YY_EXCEPTIONS + YY_SYMBOL_PRINT ("-> $$ =", yylhs); + yypop_ (yylen); + yylen = 0; + + // Shift the result of the reduction. + yypush_ (YY_NULLPTR, YY_MOVE (yylhs)); + } + goto yynewstate; + + + /*--------------------------------------. + | yyerrlab -- here on detecting error. | + `--------------------------------------*/ + yyerrlab: + // If not already recovering from an error, report this error. + if (!yyerrstatus_) + { + ++yynerrs_; + std::string msg = YY_("syntax error"); + error (yyla.location, YY_MOVE (msg)); + } + + + yyerror_range[1].location = yyla.location; + if (yyerrstatus_ == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + // Return failure if at end of input. + if (yyla.kind () == symbol_kind::S_YYEOF) + YYABORT; + else if (!yyla.empty ()) + { + yy_destroy_ ("Error: discarding", yyla); + yyla.clear (); + } + } + + // Else will try to reuse lookahead token after shifting the error token. + goto yyerrlab1; + + + /*---------------------------------------------------. + | yyerrorlab -- error raised explicitly by YYERROR. | + `---------------------------------------------------*/ + yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and + the label yyerrorlab therefore never appears in user code. */ + if (false) + YYERROR; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + yypop_ (yylen); + yylen = 0; + YY_STACK_PRINT (); + goto yyerrlab1; + + + /*-------------------------------------------------------------. + | yyerrlab1 -- common code for both syntax error and YYERROR. | + `-------------------------------------------------------------*/ + yyerrlab1: + yyerrstatus_ = 3; // Each real token shifted decrements this. + // Pop stack until we find a state that shifts the error token. + for (;;) + { + yyn = yypact_[+yystack_[0].state]; + if (!yy_pact_value_is_default_ (yyn)) + { + yyn += symbol_kind::S_YYerror; + if (0 <= yyn && yyn <= yylast_ + && yycheck_[yyn] == symbol_kind::S_YYerror) + { + yyn = yytable_[yyn]; + if (0 < yyn) + break; + } + } + + // Pop the current state because it cannot handle the error token. + if (yystack_.size () == 1) + YYABORT; + + yyerror_range[1].location = yystack_[0].location; + yy_destroy_ ("Error: popping", yystack_[0]); + yypop_ (); + YY_STACK_PRINT (); + } + { + stack_symbol_type error_token; + + yyerror_range[2].location = yyla.location; + YYLLOC_DEFAULT (error_token.location, yyerror_range, 2); + + // Shift the error token. + error_token.state = state_type (yyn); + yypush_ ("Shifting", YY_MOVE (error_token)); + } + goto yynewstate; + + + /*-------------------------------------. + | yyacceptlab -- YYACCEPT comes here. | + `-------------------------------------*/ + yyacceptlab: + yyresult = 0; + goto yyreturn; + + + /*-----------------------------------. + | yyabortlab -- YYABORT comes here. | + `-----------------------------------*/ + yyabortlab: + yyresult = 1; + goto yyreturn; + + + /*-----------------------------------------------------. + | yyreturn -- parsing is finished, return the result. | + `-----------------------------------------------------*/ + yyreturn: + if (!yyla.empty ()) + yy_destroy_ ("Cleanup: discarding lookahead", yyla); + + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + yypop_ (yylen); + YY_STACK_PRINT (); + while (1 < yystack_.size ()) + { + yy_destroy_ ("Cleanup: popping", yystack_[0]); + yypop_ (); + } + + return yyresult; + } +#if YY_EXCEPTIONS + catch (...) + { + YYCDEBUG << "Exception caught: cleaning lookahead and stack\n"; + // Do not try to display the values of the reclaimed symbols, + // as their printers might throw an exception. + if (!yyla.empty ()) + yy_destroy_ (YY_NULLPTR, yyla); + + while (1 < yystack_.size ()) + { + yy_destroy_ (YY_NULLPTR, yystack_[0]); + yypop_ (); + } + throw; + } +#endif // YY_EXCEPTIONS + } + + void + parser::error (const syntax_error& yyexc) + { + error (yyexc.location, yyexc.what ()); + } + +#if YYDEBUG || 0 + const char * + parser::symbol_name (symbol_kind_type yysymbol) + { + return yytname_[yysymbol]; + } +#endif // #if YYDEBUG || 0 + + + + + + const signed char parser::yypact_ninf_ = -24; + + const signed char parser::yytable_ninf_ = -29; + + const signed char + parser::yypact_[] = + { + 6, 9, -24, -24, -24, 10, 30, -24, -24, 23, + -24, 31, -24, 21, -24, 14, 23, -24, -24, 11, + 25, -24, -24, 52, -24, -8, 14, 27, -24, -24, + -24, -24, -24, 21, -24, -24, 3, -24, 49, 44, + -24, -3, 55, -24, -24, 36, -24, -24, -24, 56, + 45, 60, 21, 61, -24, -24, -24, 0, 21, -24, + 48, 60, -4, -24, 51, -24, -24, 21, -24, -24, + 62, -4, 54, -24, 57, -24, -24, -24, -10, 58, + -24, -24, 62, -24, -24, -24 + }; + + const signed char + parser::yydefact_[] = + { + 0, 0, 9, 10, 11, 0, 0, 1, 15, 0, + 50, 0, 12, 0, 16, 0, 0, 13, 23, 0, + 0, 37, 49, 0, 32, 0, 0, 21, 22, 17, + 18, 24, 29, 0, 25, 19, 0, 14, 37, 0, + 33, 0, 0, 20, 31, 0, 26, 7, 42, 0, + 0, 0, 0, 0, 21, 30, 27, 0, 0, 34, + 47, 0, 0, 40, 4, 6, 41, 0, 38, 46, + 0, 0, 0, 2, 5, 39, 43, 44, 0, 0, + 36, 3, 0, 48, 35, 45 + }; + + const signed char + parser::yypgoto_[] = + { + -24, -24, -24, -24, -24, -24, -24, -24, 67, 64, + 37, -24, -24, 28, -13, -24, -23, -21, -24, 1, + -24, -1, -24, -24, 22, -24, -5 + }; + + const signed char + parser::yydefgoto_[] = + { + -1, 74, 65, 2, 3, 4, 5, 11, 12, 15, + 32, 33, 19, 34, 35, 36, 23, 24, 57, 50, + 51, 77, 78, 70, 62, 25, 52 + }; + + const signed char + parser::yytable_[] = + { + 20, 13, 40, 42, 44, 48, 13, 10, 10, 1, + 7, 10, 27, 6, 82, 21, 83, 41, 49, 49, + 43, 40, 28, 66, 22, 29, 31, 45, 61, 14, + 30, 8, 8, 18, 31, 9, 16, 54, -28, 63, + 40, 10, 10, 18, 58, 68, 37, 28, -28, -8, + 29, 47, 67, 38, 75, 30, 21, 39, 18, 31, + 53, 21, 22, 72, 46, 22, 59, 10, 64, 60, + 22, 73, 79, 56, 69, 80, 76, 81, 17, 84, + 26, 85, 55, 71 + }; + + const signed char + parser::yycheck_[] = + { + 13, 6, 23, 26, 1, 8, 11, 11, 11, 3, + 0, 11, 1, 4, 24, 1, 26, 25, 22, 22, + 33, 42, 11, 23, 10, 14, 23, 24, 51, 6, + 19, 1, 1, 22, 23, 5, 5, 1, 11, 52, + 61, 11, 11, 22, 49, 58, 21, 11, 21, 0, + 14, 7, 57, 1, 67, 19, 1, 5, 22, 23, + 5, 1, 10, 62, 36, 10, 21, 11, 7, 9, + 10, 20, 71, 45, 26, 21, 14, 20, 11, 21, + 16, 82, 45, 61 + }; + + const signed char + parser::yystos_[] = + { + 0, 3, 30, 31, 32, 33, 4, 0, 1, 5, + 11, 34, 35, 53, 6, 36, 5, 35, 22, 39, + 41, 1, 10, 43, 44, 52, 36, 1, 11, 14, + 19, 23, 37, 38, 40, 41, 42, 21, 1, 5, + 44, 25, 43, 41, 1, 24, 40, 7, 8, 22, + 46, 47, 53, 5, 1, 37, 40, 45, 53, 21, + 9, 43, 51, 41, 7, 29, 23, 53, 41, 26, + 50, 51, 46, 20, 28, 41, 14, 48, 49, 46, + 21, 20, 24, 26, 21, 48 + }; + + const signed char + parser::yyr1_[] = + { + 0, 27, 28, 28, 29, 29, 30, 31, 32, 33, + 33, 33, 34, 34, 35, 35, 36, 37, 37, 37, + 37, 37, 38, 39, 40, 41, 41, 41, 41, 42, + 42, 42, 43, 43, 44, 44, 44, 44, 45, 45, + 46, 46, 47, 48, 49, 49, 50, 51, 51, 52, + 53 + }; + + const signed char + parser::yyr2_[] = + { + 0, 2, 1, 2, 1, 2, 8, 7, 6, 1, + 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 2, 3, 4, 2, 1, + 3, 2, 1, 2, 4, 7, 6, 1, 2, 3, + 2, 3, 1, 1, 1, 3, 1, 1, 4, 1, + 1 + }; + + +#if YYDEBUG + // YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + // First, the terminals, then, starting at \a YYNTOKENS, nonterminals. + const char* + const parser::yytname_[] = + { + "\"end of file\"", "error", "\"invalid token\"", "STEP", "HEADER", + "ENDSEC", "DATA", "ENDSTEP", "SCOPE", "ENDSCOPE", "ENTITY", "TYPE", + "INTEGER", "FLOAT", "IDENT", "TEXT", "NONDEF", "ENUM", "HEXA", "QUID", + "' '", "';'", "'('", "')'", "','", "'='", "'/'", "$accept", "finvide", + "finstep", "stepf1", "stepf2", "stepf3", "stepf", "headl", "headent", + "endhead", "unarg", "listype", "deblist", "finlist", "listarg", + "arglist", "model", "bloc", "plex", "unent", "debscop", "unid", "export", + "debexp", "finscop", "entlab", "enttype", YY_NULLPTR + }; +#endif + + +#if YYDEBUG + const unsigned char + parser::yyrline_[] = + { + 0, 71, 71, 72, 73, 74, 75, 76, 77, 78, + 78, 78, 81, 82, 84, 85, 87, 90, 91, 92, + 93, 94, 98, 101, 104, 109, 110, 111, 112, 114, + 115, 116, 118, 119, 121, 122, 123, 124, 126, 127, + 129, 130, 132, 135, 138, 139, 141, 144, 146, 151, + 154 + }; + + void + parser::yy_stack_print_ () const + { + *yycdebug_ << "Stack now"; + for (stack_type::const_iterator + i = yystack_.begin (), + i_end = yystack_.end (); + i != i_end; ++i) + *yycdebug_ << ' ' << int (i->state); + *yycdebug_ << '\n'; + } + + void + parser::yy_reduce_print_ (int yyrule) const + { + int yylno = yyrline_[yyrule]; + int yynrhs = yyr2_[yyrule]; + // Print the symbols being reduced, and their result. + *yycdebug_ << "Reducing stack by rule " << yyrule - 1 + << " (line " << yylno << "):\n"; + // The symbols being reduced. + for (int yyi = 0; yyi < yynrhs; yyi++) + YY_SYMBOL_PRINT (" $" << yyi + 1 << " =", + yystack_[(yynrhs) - (yyi + 1)]); + } +#endif // YYDEBUG + + parser::symbol_kind_type + parser::yytranslate_ (int t) + { + // YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to + // TOKEN-NUM as returned by yylex. + static + const signed char + translate_table[] = + { + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 20, 2, 2, 2, 2, 2, 2, 2, + 22, 23, 2, 2, 24, 2, 2, 26, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, + 2, 25, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19 + }; + // Last valid token kind. + const int code_max = 274; + + if (t <= 0) + return symbol_kind::S_YYEOF; + else if (t <= code_max) + return YY_CAST (symbol_kind_type, translate_table[t]); + else + return symbol_kind::S_YYUNDEF; + } + +} // step + + + +void step::parser::error(const location_type& /*loc*/, const std::string& m) +{ + char newmess[80]; + sprintf(newmess, "At line %d : %s", scanner->lineno() + 1, m.c_str()); + StepFile_Interrupt(newmess); +} diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/step.tab.h opencascade-7.5.1+dfsg1/src/StepFile/step.tab.h --- opencascade-7.4.1+dfsg1/src/StepFile/step.tab.h 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/step.tab.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -/* A Bison parser, made by GNU Bison 2.7. */ - -/* Bison interface for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc. - - 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 . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -#ifndef YY_STEP_STEP_TAB_H_INCLUDED -# define YY_STEP_STEP_TAB_H_INCLUDED -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int stepdebug; -#endif - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - STEP = 258, - HEADER = 259, - ENDSEC = 260, - DATA = 261, - ENDSTEP = 262, - SCOPE = 263, - ENDSCOPE = 264, - ENTITY = 265, - TYPE = 266, - INTEGER = 267, - FLOAT = 268, - IDENT = 269, - TEXT = 270, - NONDEF = 271, - ENUM = 272, - HEXA = 273, - QUID = 274 - }; -#endif - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - -extern YYSTYPE steplval; - -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int stepparse (void *YYPARSE_PARAM); -#else -int stepparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int stepparse (void); -#else -int stepparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - -#endif /* !YY_STEP_STEP_TAB_H_INCLUDED */ diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/step.tab.hxx opencascade-7.5.1+dfsg1/src/StepFile/step.tab.hxx --- opencascade-7.4.1+dfsg1/src/StepFile/step.tab.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/step.tab.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,829 @@ +// A Bison parser, made by GNU Bison 3.7.1. + +// Skeleton interface for Bison LALR(1) parsers in C++ + +// Copyright (C) 2002-2015, 2018-2020 Free Software Foundation, Inc. + +// 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 . + +// As a special exception, you may create a larger work that contains +// part or all of the Bison parser skeleton and distribute that work +// under terms of your choice, so long as that work isn't itself a +// parser generator using the skeleton or a modified version thereof +// as a parser skeleton. Alternatively, if you modify or redistribute +// the parser skeleton itself, you may (at your option) remove this +// special exception, which will cause the skeleton and the resulting +// Bison output files to be licensed under the GNU General Public +// License without this special exception. + +// This special exception was added by the Free Software Foundation in +// version 2.2 of Bison. + + +/** + ** \file StepFile/step.tab.hxx + ** Define the step::parser class. + */ + +// C++ LALR(1) parser skeleton written by Akim Demaille. + +// DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, +// especially those whose name start with YY_ or yy_. They are +// private implementation details that can be changed or removed. + +#ifndef YY_STEP_STEPFILE_STEP_TAB_HXX_INCLUDED +# define YY_STEP_STEPFILE_STEP_TAB_HXX_INCLUDED +// "%code requires" blocks. + +// This file is part of Open CASCADE Technology software library. +// This file is generated, do not modify it directly; edit source file step.yacc instead. + +namespace step { + class scanner; +}; + +#ifdef _MSC_VER +// disable MSVC warning C4522: 'step::parser::stack_symbol_type': multiple assignment operators +#pragma warning(disable: 4522) +// disable MSVC warning C4512: 'step::parser::stack::slice' : assignment operator could not be generated +#pragma warning(disable: 4512) +#endif + + + + +# include // std::abort +# include +# include +# include +# include + +#if defined __cplusplus +# define YY_CPLUSPLUS __cplusplus +#else +# define YY_CPLUSPLUS 199711L +#endif + +// Support move semantics when possible. +#if 201103L <= YY_CPLUSPLUS +# define YY_MOVE std::move +# define YY_MOVE_OR_COPY move +# define YY_MOVE_REF(Type) Type&& +# define YY_RVREF(Type) Type&& +# define YY_COPY(Type) Type +#else +# define YY_MOVE +# define YY_MOVE_OR_COPY copy +# define YY_MOVE_REF(Type) Type& +# define YY_RVREF(Type) const Type& +# define YY_COPY(Type) const Type& +#endif + +// Support noexcept when possible. +#if 201103L <= YY_CPLUSPLUS +# define YY_NOEXCEPT noexcept +# define YY_NOTHROW +#else +# define YY_NOEXCEPT +# define YY_NOTHROW throw () +#endif + +// Support constexpr when possible. +#if 201703 <= YY_CPLUSPLUS +# define YY_CONSTEXPR constexpr +#else +# define YY_CONSTEXPR +#endif +# include "location.hh" + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(E) ((void) (E)) +#else +# define YYUSE(E) /* empty */ +#endif + +#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +namespace step { + + + + + /// A Bison parser. + class parser + { + public: +#ifndef YYSTYPE + /// Symbol semantic values. + typedef int semantic_type; +#else + typedef YYSTYPE semantic_type; +#endif + /// Symbol locations. + typedef location location_type; + + /// Syntax errors thrown from user actions. + struct syntax_error : std::runtime_error + { + syntax_error (const location_type& l, const std::string& m) + : std::runtime_error (m) + , location (l) + {} + + syntax_error (const syntax_error& s) + : std::runtime_error (s.what ()) + , location (s.location) + {} + + ~syntax_error () YY_NOEXCEPT YY_NOTHROW; + + location_type location; + }; + + /// Token kinds. + struct token + { + enum token_kind_type + { + YYEMPTY = -2, + YYEOF = 0, // "end of file" + YYerror = 256, // error + YYUNDEF = 257, // "invalid token" + STEP = 258, // STEP + HEADER = 259, // HEADER + ENDSEC = 260, // ENDSEC + DATA = 261, // DATA + ENDSTEP = 262, // ENDSTEP + SCOPE = 263, // SCOPE + ENDSCOPE = 264, // ENDSCOPE + ENTITY = 265, // ENTITY + TYPE = 266, // TYPE + INTEGER = 267, // INTEGER + FLOAT = 268, // FLOAT + IDENT = 269, // IDENT + TEXT = 270, // TEXT + NONDEF = 271, // NONDEF + ENUM = 272, // ENUM + HEXA = 273, // HEXA + QUID = 274 // QUID + }; + /// Backward compatibility alias (Bison 3.6). + typedef token_kind_type yytokentype; + }; + + /// Token kind, as returned by yylex. + typedef token::yytokentype token_kind_type; + + /// Backward compatibility alias (Bison 3.6). + typedef token_kind_type token_type; + + /// Symbol kinds. + struct symbol_kind + { + enum symbol_kind_type + { + YYNTOKENS = 27, ///< Number of tokens. + S_YYEMPTY = -2, + S_YYEOF = 0, // "end of file" + S_YYerror = 1, // error + S_YYUNDEF = 2, // "invalid token" + S_STEP = 3, // STEP + S_HEADER = 4, // HEADER + S_ENDSEC = 5, // ENDSEC + S_DATA = 6, // DATA + S_ENDSTEP = 7, // ENDSTEP + S_SCOPE = 8, // SCOPE + S_ENDSCOPE = 9, // ENDSCOPE + S_ENTITY = 10, // ENTITY + S_TYPE = 11, // TYPE + S_INTEGER = 12, // INTEGER + S_FLOAT = 13, // FLOAT + S_IDENT = 14, // IDENT + S_TEXT = 15, // TEXT + S_NONDEF = 16, // NONDEF + S_ENUM = 17, // ENUM + S_HEXA = 18, // HEXA + S_QUID = 19, // QUID + S_20_ = 20, // ' ' + S_21_ = 21, // ';' + S_22_ = 22, // '(' + S_23_ = 23, // ')' + S_24_ = 24, // ',' + S_25_ = 25, // '=' + S_26_ = 26, // '/' + S_YYACCEPT = 27, // $accept + S_finvide = 28, // finvide + S_finstep = 29, // finstep + S_stepf1 = 30, // stepf1 + S_stepf2 = 31, // stepf2 + S_stepf3 = 32, // stepf3 + S_stepf = 33, // stepf + S_headl = 34, // headl + S_headent = 35, // headent + S_endhead = 36, // endhead + S_unarg = 37, // unarg + S_listype = 38, // listype + S_deblist = 39, // deblist + S_finlist = 40, // finlist + S_listarg = 41, // listarg + S_arglist = 42, // arglist + S_model = 43, // model + S_bloc = 44, // bloc + S_plex = 45, // plex + S_unent = 46, // unent + S_debscop = 47, // debscop + S_unid = 48, // unid + S_export = 49, // export + S_debexp = 50, // debexp + S_finscop = 51, // finscop + S_entlab = 52, // entlab + S_enttype = 53 // enttype + }; + }; + + /// (Internal) symbol kind. + typedef symbol_kind::symbol_kind_type symbol_kind_type; + + /// The number of tokens. + static const symbol_kind_type YYNTOKENS = symbol_kind::YYNTOKENS; + + /// A complete symbol. + /// + /// Expects its Base type to provide access to the symbol kind + /// via kind (). + /// + /// Provide access to semantic value and location. + template + struct basic_symbol : Base + { + /// Alias to Base. + typedef Base super_type; + + /// Default constructor. + basic_symbol () + : value () + , location () + {} + +#if 201103L <= YY_CPLUSPLUS + /// Move constructor. + basic_symbol (basic_symbol&& that) + : Base (std::move (that)) + , value (std::move (that.value)) + , location (std::move (that.location)) + {} +#endif + + /// Copy constructor. + basic_symbol (const basic_symbol& that); + /// Constructor for valueless symbols. + basic_symbol (typename Base::kind_type t, + YY_MOVE_REF (location_type) l); + + /// Constructor for symbols with semantic value. + basic_symbol (typename Base::kind_type t, + YY_RVREF (semantic_type) v, + YY_RVREF (location_type) l); + + /// Destroy the symbol. + ~basic_symbol () + { + clear (); + } + + /// Destroy contents, and record that is empty. + void clear () + { + Base::clear (); + } + +#if YYDEBUG || 0 + /// The user-facing name of this symbol. + const char *name () const YY_NOEXCEPT + { + return parser::symbol_name (this->kind ()); + } +#endif // #if YYDEBUG || 0 + + + /// Backward compatibility (Bison 3.6). + symbol_kind_type type_get () const YY_NOEXCEPT; + + /// Whether empty. + bool empty () const YY_NOEXCEPT; + + /// Destructive move, \a s is emptied into this. + void move (basic_symbol& s); + + /// The semantic value. + semantic_type value; + + /// The location. + location_type location; + + private: +#if YY_CPLUSPLUS < 201103L + /// Assignment operator. + basic_symbol& operator= (const basic_symbol& that); +#endif + }; + + /// Type access provider for token (enum) based symbols. + struct by_kind + { + /// Default constructor. + by_kind (); + +#if 201103L <= YY_CPLUSPLUS + /// Move constructor. + by_kind (by_kind&& that); +#endif + + /// Copy constructor. + by_kind (const by_kind& that); + + /// The symbol kind as needed by the constructor. + typedef token_kind_type kind_type; + + /// Constructor from (external) token numbers. + by_kind (kind_type t); + + /// Record that this symbol is empty. + void clear (); + + /// Steal the symbol kind from \a that. + void move (by_kind& that); + + /// The (internal) type number (corresponding to \a type). + /// \a empty when empty. + symbol_kind_type kind () const YY_NOEXCEPT; + + /// Backward compatibility (Bison 3.6). + symbol_kind_type type_get () const YY_NOEXCEPT; + + /// The symbol kind. + /// \a S_YYEMPTY when empty. + symbol_kind_type kind_; + }; + + /// Backward compatibility for a private implementation detail (Bison 3.6). + typedef by_kind by_type; + + /// "External" symbols: returned by the scanner. + struct symbol_type : basic_symbol + {}; + + /// Build a parser object. + parser (step::scanner* scanner_yyarg); + virtual ~parser (); + +#if 201103L <= YY_CPLUSPLUS + /// Non copyable. + parser (const parser&) = delete; + /// Non copyable. + parser& operator= (const parser&) = delete; +#endif + + /// Parse. An alias for parse (). + /// \returns 0 iff parsing succeeded. + int operator() (); + + /// Parse. + /// \returns 0 iff parsing succeeded. + virtual int parse (); + +#if YYDEBUG + /// The current debugging stream. + std::ostream& debug_stream () const YY_ATTRIBUTE_PURE; + /// Set the current debugging stream. + void set_debug_stream (std::ostream &); + + /// Type for debugging levels. + typedef int debug_level_type; + /// The current debugging level. + debug_level_type debug_level () const YY_ATTRIBUTE_PURE; + /// Set the current debugging level. + void set_debug_level (debug_level_type l); +#endif + + /// Report a syntax error. + /// \param loc where the syntax error is found. + /// \param msg a description of the syntax error. + virtual void error (const location_type& loc, const std::string& msg); + + /// Report a syntax error. + void error (const syntax_error& err); + +#if YYDEBUG || 0 + /// The user-facing name of the symbol whose (internal) number is + /// YYSYMBOL. No bounds checking. + static const char *symbol_name (symbol_kind_type yysymbol); +#endif // #if YYDEBUG || 0 + + + + + private: +#if YY_CPLUSPLUS < 201103L + /// Non copyable. + parser (const parser&); + /// Non copyable. + parser& operator= (const parser&); +#endif + + + /// Stored state numbers (used for stacks). + typedef signed char state_type; + + /// Compute post-reduction state. + /// \param yystate the current state + /// \param yysym the nonterminal to push on the stack + static state_type yy_lr_goto_state_ (state_type yystate, int yysym); + + /// Whether the given \c yypact_ value indicates a defaulted state. + /// \param yyvalue the value to check + static bool yy_pact_value_is_default_ (int yyvalue); + + /// Whether the given \c yytable_ value indicates a syntax error. + /// \param yyvalue the value to check + static bool yy_table_value_is_error_ (int yyvalue); + + static const signed char yypact_ninf_; + static const signed char yytable_ninf_; + + /// Convert a scanner token kind \a t to a symbol kind. + /// In theory \a t should be a token_kind_type, but character literals + /// are valid, yet not members of the token_type enum. + static symbol_kind_type yytranslate_ (int t); + +#if YYDEBUG || 0 + /// For a symbol, its name in clear. + static const char* const yytname_[]; +#endif // #if YYDEBUG || 0 + + + // Tables. + // YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + // STATE-NUM. + static const signed char yypact_[]; + + // YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + // Performed when YYTABLE does not specify something else to do. Zero + // means the default is an error. + static const signed char yydefact_[]; + + // YYPGOTO[NTERM-NUM]. + static const signed char yypgoto_[]; + + // YYDEFGOTO[NTERM-NUM]. + static const signed char yydefgoto_[]; + + // YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + // positive, shift that token. If negative, reduce the rule whose + // number is the opposite. If YYTABLE_NINF, syntax error. + static const signed char yytable_[]; + + static const signed char yycheck_[]; + + // YYSTOS[STATE-NUM] -- The (internal number of the) accessing + // symbol of state STATE-NUM. + static const signed char yystos_[]; + + // YYR1[YYN] -- Symbol number of symbol that rule YYN derives. + static const signed char yyr1_[]; + + // YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. + static const signed char yyr2_[]; + + +#if YYDEBUG + // YYRLINE[YYN] -- Source line where rule number YYN was defined. + static const unsigned char yyrline_[]; + /// Report on the debug stream that the rule \a r is going to be reduced. + virtual void yy_reduce_print_ (int r) const; + /// Print the state stack on the debug stream. + virtual void yy_stack_print_ () const; + + /// Debugging level. + int yydebug_; + /// Debug stream. + std::ostream* yycdebug_; + + /// \brief Display a symbol kind, value and location. + /// \param yyo The output stream. + /// \param yysym The symbol. + template + void yy_print_ (std::ostream& yyo, const basic_symbol& yysym) const; +#endif + + /// \brief Reclaim the memory associated to a symbol. + /// \param yymsg Why this token is reclaimed. + /// If null, print nothing. + /// \param yysym The symbol. + template + void yy_destroy_ (const char* yymsg, basic_symbol& yysym) const; + + private: + /// Type access provider for state based symbols. + struct by_state + { + /// Default constructor. + by_state () YY_NOEXCEPT; + + /// The symbol kind as needed by the constructor. + typedef state_type kind_type; + + /// Constructor. + by_state (kind_type s) YY_NOEXCEPT; + + /// Copy constructor. + by_state (const by_state& that) YY_NOEXCEPT; + + /// Record that this symbol is empty. + void clear () YY_NOEXCEPT; + + /// Steal the symbol kind from \a that. + void move (by_state& that); + + /// The symbol kind (corresponding to \a state). + /// \a symbol_kind::S_YYEMPTY when empty. + symbol_kind_type kind () const YY_NOEXCEPT; + + /// The state number used to denote an empty symbol. + /// We use the initial state, as it does not have a value. + enum { empty_state = 0 }; + + /// The state. + /// \a empty when empty. + state_type state; + }; + + /// "Internal" symbol: element of the stack. + struct stack_symbol_type : basic_symbol + { + /// Superclass. + typedef basic_symbol super_type; + /// Construct an empty symbol. + stack_symbol_type (); + /// Move or copy construction. + stack_symbol_type (YY_RVREF (stack_symbol_type) that); + /// Steal the contents from \a sym to build this. + stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) sym); +#if YY_CPLUSPLUS < 201103L + /// Assignment, needed by push_back by some old implementations. + /// Moves the contents of that. + stack_symbol_type& operator= (stack_symbol_type& that); + + /// Assignment, needed by push_back by other implementations. + /// Needed by some other old implementations. + stack_symbol_type& operator= (const stack_symbol_type& that); +#endif + }; + + /// A stack with random access from its top. + template > + class stack + { + public: + // Hide our reversed order. + typedef typename S::iterator iterator; + typedef typename S::const_iterator const_iterator; + typedef typename S::size_type size_type; + typedef typename std::ptrdiff_t index_type; + + stack (size_type n = 200) + : seq_ (n) + {} + +#if 201103L <= YY_CPLUSPLUS + /// Non copyable. + stack (const stack&) = delete; + /// Non copyable. + stack& operator= (const stack&) = delete; +#endif + + /// Random access. + /// + /// Index 0 returns the topmost element. + const T& + operator[] (index_type i) const + { + return seq_[size_type (size () - 1 - i)]; + } + + /// Random access. + /// + /// Index 0 returns the topmost element. + T& + operator[] (index_type i) + { + return seq_[size_type (size () - 1 - i)]; + } + + /// Steal the contents of \a t. + /// + /// Close to move-semantics. + void + push (YY_MOVE_REF (T) t) + { + seq_.push_back (T ()); + operator[] (0).move (t); + } + + /// Pop elements from the stack. + void + pop (std::ptrdiff_t n = 1) YY_NOEXCEPT + { + for (; 0 < n; --n) + seq_.pop_back (); + } + + /// Pop all elements from the stack. + void + clear () YY_NOEXCEPT + { + seq_.clear (); + } + + /// Number of elements on the stack. + index_type + size () const YY_NOEXCEPT + { + return index_type (seq_.size ()); + } + + /// Iterator on top of the stack (going downwards). + const_iterator + begin () const YY_NOEXCEPT + { + return seq_.begin (); + } + + /// Bottom of the stack. + const_iterator + end () const YY_NOEXCEPT + { + return seq_.end (); + } + + /// Present a slice of the top of a stack. + class slice + { + public: + slice (const stack& stack, index_type range) + : stack_ (stack) + , range_ (range) + {} + + const T& + operator[] (index_type i) const + { + return stack_[range_ - i]; + } + + private: + const stack& stack_; + index_type range_; + }; + + private: +#if YY_CPLUSPLUS < 201103L + /// Non copyable. + stack (const stack&); + /// Non copyable. + stack& operator= (const stack&); +#endif + /// The wrapped container. + S seq_; + }; + + + /// Stack type. + typedef stack stack_type; + + /// The stack. + stack_type yystack_; + + /// Push a new state on the stack. + /// \param m a debug message to display + /// if null, no trace is output. + /// \param sym the symbol + /// \warning the contents of \a s.value is stolen. + void yypush_ (const char* m, YY_MOVE_REF (stack_symbol_type) sym); + + /// Push a new look ahead token on the state on the stack. + /// \param m a debug message to display + /// if null, no trace is output. + /// \param s the state + /// \param sym the symbol (for its value and location). + /// \warning the contents of \a sym.value is stolen. + void yypush_ (const char* m, state_type s, YY_MOVE_REF (symbol_type) sym); + + /// Pop \a n symbols from the stack. + void yypop_ (int n = 1); + + /// Constants. + enum + { + yylast_ = 83, ///< Last index in yytable_. + yynnts_ = 27, ///< Number of nonterminal symbols. + yyfinal_ = 7 ///< Termination state number. + }; + + + // User arguments. + step::scanner* scanner; + + }; + + +} // step + + + + +#endif // !YY_STEP_STEPFILE_STEP_TAB_HXX_INCLUDED diff -Nru opencascade-7.4.1+dfsg1/src/StepFile/step.yacc opencascade-7.5.1+dfsg1/src/StepFile/step.yacc --- opencascade-7.4.1+dfsg1/src/StepFile/step.yacc 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepFile/step.yacc 2021-02-02 08:51:56.000000000 +0000 @@ -13,51 +13,60 @@ commercial license or contractual agreement. */ +%code top { +// This file is part of Open CASCADE Technology software library. +// This file is generated, do not modify it directly; edit source file step.yacc instead. +} + +%language "C++" +%require "3.2" + +/* C++ parser interface */ +%skeleton "lalr1.cc" + +%parse-param {step::scanner* scanner} + +%locations + %token STEP HEADER ENDSEC DATA ENDSTEP SCOPE ENDSCOPE ENTITY TYPE INTEGER FLOAT IDENT TEXT NONDEF ENUM HEXA QUID %start stepf -%{ + +%code requires { +// This file is part of Open CASCADE Technology software library. +// This file is generated, do not modify it directly; edit source file step.yacc instead. + +namespace step { + class scanner; +}; + +#ifdef _MSC_VER +// disable MSVC warning C4522: 'step::parser::stack_symbol_type': multiple assignment operators +#pragma warning(disable: 4522) +// disable MSVC warning C4512: 'step::parser::stack::slice' : assignment operator could not be generated +#pragma warning(disable: 4512) +#endif + +} + +%code { #include "recfile.ph" /* definitions des types d'arguments */ #include "recfile.pc" /* la-dedans, tout y est */ -/* -#define stepparse STEPparse -#define steplex STEPlex -#define stepwrap STEPwrap -#define steprestart STEPrestart -#define steplex STEPlex -#define steplval STEPlval -#define stepval STEPval -#define stepchar STEPchar -#define stepdebug STEPdebug -#define stepnerrs STEPnerrs -#define steperror STEPerror -*/ -#define stepclearin yychar = -1 -#define steperrok yyerrflag = 0 -/* -#define stepin STEPin -#define yyerrflag STEPerrflag -#define yyerrstatus STEPerrflag -*/ - -/* ABV 19.12.00: merging porting modifications by POP (for WNT, AIX) */ -#if defined(WNT) && !defined(MSDOS) -#define MSDOS WNT -#endif -#if defined(_AIX) -#include -#define alloca malloc -#endif +#undef yylex +#define yylex scanner->lex +#define stepclearin yychar = -1 +#define steperrok yyerrflag = 0 // disable MSVC warnings in bison code #ifdef _MSC_VER -#pragma warning(disable:4244 4131 4127 4702) +#pragma warning(disable:4065 4244 4131 4127 4702) #define YYMALLOC malloc #define YYFREE free #endif +void StepFile_Interrupt (char* nomfic); /* rln 13.09.00 port on HP*/ +} -%} %% /* N.B. : les commentaires sont filtres par LEX */ /* La fin vide (selon systeme emetteur) est filtree ici */ @@ -85,7 +94,7 @@ | listarg /* rec_newent lors du ')' */ { rec_newarg(); } | listype listarg /* liste typee */ { rec_newarg(); } | error { rec_typarg(rec_argMisc); rec_newarg(); - yyerrstatus = 1; yyclearin; } + yyerrstatus_ = 1; yyclearin; } /* Erreur sur Parametre : tacher de le noter sans jeter l'Entite */ ; listype : TYPE @@ -97,10 +106,11 @@ finlist : ')' { if (modeprint > 0) { printf("Record no : %d -- ",nbrec+1); rec_print(currec); } - rec_newent (); yyerrstatus = 0; } + rec_newent (); yyerrstatus_ = 0; } ; listarg : deblist finlist /* liste vide (peut y en avoir) */ | deblist arglist finlist /* liste normale, non vide */ + | deblist arglist ',' finlist /* broken list with missing last parameter, see #31756 */ | deblist error ; arglist : unarg @@ -146,3 +156,11 @@ enttype : TYPE { rec_type (); } ; +%% + +void step::parser::error(const location_type& /*loc*/, const std::string& m) +{ + char newmess[80]; + sprintf(newmess, "At line %d : %s", scanner->lineno() + 1, m.c_str()); + StepFile_Interrupt(newmess); +} diff -Nru opencascade-7.4.1+dfsg1/src/StepSelect/StepSelect_WorkLibrary.cxx opencascade-7.5.1+dfsg1/src/StepSelect/StepSelect_WorkLibrary.cxx --- opencascade-7.4.1+dfsg1/src/StepSelect/StepSelect_WorkLibrary.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepSelect/StepSelect_WorkLibrary.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -73,8 +73,22 @@ Handle(StepData_StepModel) stepmodel = new StepData_StepModel; model = stepmodel; StepFile_ReadTrace (0); - char *pName=(char *)name; - status = StepFile_Read (pName,stepmodel,stepro); + status = StepFile_Read(name, 0, stepmodel, stepro); + return status; +} + +Standard_Integer StepSelect_WorkLibrary::ReadStream (const Standard_CString theName, + std::istream& theIStream, + Handle(Interface_InterfaceModel)& model, + const Handle(Interface_Protocol)& protocol) const +{ + long status = 1; + DeclareAndCast(StepData_Protocol, stepro, protocol); + if (stepro.IsNull()) return 1; + Handle(StepData_StepModel) stepmodel = new StepData_StepModel; + model = stepmodel; + StepFile_ReadTrace(0); + status = StepFile_Read(theName, &theIStream, stepmodel, stepro); return status; } @@ -83,7 +97,7 @@ (IFSelect_ContextWrite& ctx) const { // Preparation - Handle(Message_Messenger) sout = Message::DefaultMessenger(); + Message_Messenger::StreamBuffer sout = Message::SendInfo(); DeclareAndCast(StepData_StepModel,stepmodel,ctx.Model()); DeclareAndCast(StepData_Protocol,stepro,ctx.Protocol()); if (stepmodel.IsNull() || stepro.IsNull()) return Standard_False; @@ -93,7 +107,7 @@ if (!fout || !fout.is_open()) { ctx.CCheck(0)->AddFail("Step File could not be created"); - sout<<" Step File could not be created : " << ctx.FileName() << Message_EndLine; return 0; + sout<<" Step File could not be created : " << ctx.FileName() << std::endl; return 0; } sout << " Step File Name : "<GetMessages(chl.Value()); sout<<" Write "; Standard_Boolean isGood = SW.Print(fout); - sout<<" Done"<Number(entity); if (nument <= 0 || nument > model->NbEntities()) return; Standard_Boolean iserr = model->IsRedefinedContent(nument); Handle(Standard_Transient) ent, con; ent = entity; - S<<" --- (STEP) Entity "; model->Print(entity,S); + S <<" --- (STEP) Entity "; model->Print(entity, S); if (iserr) con = model->ReportEntity(nument)->Content(); - if (entity.IsNull()) { S<<" Null"<DynamicType()->Name() << Message_EndLine; + S << " Type cdl : " << entity->DynamicType()->Name() << std::endl; if (iserr) - S<<" *** NOT WELL LOADED : CONTENT FROM FILE ***"<IsUnknownEntity(nument)) - S<<" *** UNKNOWN TYPE ***"< "Null" in case of Error //! Returns 0 if OK, 1 if Read Error, -1 if File not opened Standard_EXPORT Standard_Integer ReadFile (const Standard_CString name, Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol) const Standard_OVERRIDE; - + + //! Reads a STEP File from stream and returns a STEP Model (into ), + //! or lets "Null" in case of Error + //! Returns 0 if OK, 1 if Read Error, -1 if File not opened + Standard_EXPORT Standard_Integer ReadStream(const Standard_CString theName, + std::istream& theIStream, + Handle(Interface_InterfaceModel)& model, + const Handle(Interface_Protocol)& protocol) const Standard_OVERRIDE; + //! Writes a File from a STEP Model //! Returns False (and writes no file) if does not bring a //! STEP Model @@ -75,7 +80,7 @@ //! Level 0 just displays type; level 1 displays the entity itself //! and level 2 displays the entity plus its shared ones (one //! sub-level : immediately shared entities) - Standard_EXPORT void DumpEntity (const Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol, const Handle(Standard_Transient)& entity, const Handle(Message_Messenger)& S, const Standard_Integer level) const Standard_OVERRIDE; + Standard_EXPORT virtual void DumpEntity (const Handle(Interface_InterfaceModel)& model, const Handle(Interface_Protocol)& protocol, const Handle(Standard_Transient)& entity, Standard_OStream& S, const Standard_Integer level) const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/StepShape/StepShape_GeometricSet.cxx opencascade-7.5.1+dfsg1/src/StepShape/StepShape_GeometricSet.cxx --- opencascade-7.4.1+dfsg1/src/StepShape/StepShape_GeometricSet.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepShape/StepShape_GeometricSet.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -49,5 +49,7 @@ Standard_Integer StepShape_GeometricSet::NbElements () const { + if (elements.IsNull()) + return 0; return elements->Length(); } diff -Nru opencascade-7.4.1+dfsg1/src/StepToGeom/FILES opencascade-7.5.1+dfsg1/src/StepToGeom/FILES --- opencascade-7.4.1+dfsg1/src/StepToGeom/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToGeom/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,3 +1,2 @@ StepToGeom.cxx StepToGeom.hxx -StepToGeom_MakeBSplineCurve.pxx diff -Nru opencascade-7.4.1+dfsg1/src/StepToGeom/StepToGeom.cxx opencascade-7.5.1+dfsg1/src/StepToGeom/StepToGeom.cxx --- opencascade-7.4.1+dfsg1/src/StepToGeom/StepToGeom.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToGeom/StepToGeom.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -623,28 +623,178 @@ } //============================================================================= +// Template function for use in MakeBSplineCurve / MakeBSplineCurve2d +//============================================================================= + +template +< + class TPntArray, + class TCartesianPoint, + class TGpPnt, + class TBSplineCurve +> +Handle(TBSplineCurve) MakeBSplineCurveCommon +( + const Handle(StepGeom_BSplineCurve)& theStepGeom_BSplineCurve, + TGpPnt(TCartesianPoint::* thePntGetterFunction)() const, + Handle(TCartesianPoint) (*thePointMakerFunction)(const Handle(StepGeom_CartesianPoint)&) +) +{ + Handle(StepGeom_BSplineCurveWithKnots) aBSplineCurveWithKnots; + Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve) aBSplineCurveWithKnotsAndRationalBSplineCurve; + + if (theStepGeom_BSplineCurve->IsKind(STANDARD_TYPE(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve))) + { + aBSplineCurveWithKnotsAndRationalBSplineCurve = + Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve)::DownCast(theStepGeom_BSplineCurve); + aBSplineCurveWithKnots = aBSplineCurveWithKnotsAndRationalBSplineCurve->BSplineCurveWithKnots(); + } + else + aBSplineCurveWithKnots = Handle(StepGeom_BSplineCurveWithKnots)::DownCast(theStepGeom_BSplineCurve); + + const Standard_Integer aDegree = aBSplineCurveWithKnots->Degree(); + const Standard_Integer NbPoles = aBSplineCurveWithKnots->NbControlPointsList(); + const Standard_Integer NbKnots = aBSplineCurveWithKnots->NbKnotMultiplicities(); + + const Handle(TColStd_HArray1OfInteger)& aKnotMultiplicities = aBSplineCurveWithKnots->KnotMultiplicities(); + const Handle(TColStd_HArray1OfReal)& aKnots = aBSplineCurveWithKnots->Knots(); + + // Count number of unique knots + Standard_Integer NbUniqueKnots = 0; + Standard_Real lastKnot = RealFirst(); + for (Standard_Integer i = 1; i <= NbKnots; ++i) + { + if (aKnots->Value(i) - lastKnot > Epsilon(Abs(lastKnot))) + { + NbUniqueKnots++; + lastKnot = aKnots->Value(i); + } + } + if (NbUniqueKnots <= 1) + { + return 0; + } + TColStd_Array1OfReal aUniqueKnots(1, NbUniqueKnots); + TColStd_Array1OfInteger aUniqueKnotMultiplicities(1, NbUniqueKnots); + lastKnot = aKnots->Value(1); + aUniqueKnots.SetValue(1, aKnots->Value(1)); + aUniqueKnotMultiplicities.SetValue(1, aKnotMultiplicities->Value(1)); + Standard_Integer aKnotPosition = 1; + for (Standard_Integer i = 2; i <= NbKnots; i++) + { + if (aKnots->Value(i) - lastKnot > Epsilon(Abs(lastKnot))) + { + aKnotPosition++; + aUniqueKnots.SetValue(aKnotPosition, aKnots->Value(i)); + aUniqueKnotMultiplicities.SetValue(aKnotPosition, aKnotMultiplicities->Value(i)); + lastKnot = aKnots->Value(i); + } + else + { + // Knot not unique, increase multiplicity + Standard_Integer aCurrentMultiplicity = aUniqueKnotMultiplicities.Value(aKnotPosition); + aUniqueKnotMultiplicities.SetValue(aKnotPosition, aCurrentMultiplicity + aKnotMultiplicities->Value(i)); + } + } + + Standard_Integer aFirstMuultypisityDifference = 0; + Standard_Integer aLastMuultypisityDifference = 0; + for (Standard_Integer i = 1; i <= NbUniqueKnots; ++i) + { + Standard_Integer aCurrentVal = aUniqueKnotMultiplicities.Value(i); + if (aCurrentVal > aDegree + 1) + { + if (i == 1) + aFirstMuultypisityDifference = aCurrentVal - aDegree - 1; + if (i == NbUniqueKnots) + aLastMuultypisityDifference = aCurrentVal - aDegree - 1; +#ifdef OCCT_DEBUG + std::cout << "\nWrong multiplicity " << aCurrentVal << " on " << i + << " knot!" << "\nChanged to " << aDegree + 1 << std::endl; +#endif + aCurrentVal = aDegree + 1; + } + aUniqueKnotMultiplicities.SetValue(i, aCurrentVal); + } + + const Handle(StepGeom_HArray1OfCartesianPoint)& aControlPointsList = aBSplineCurveWithKnots->ControlPointsList(); + Standard_Integer aSummaryMuultypisityDifference = aFirstMuultypisityDifference + aLastMuultypisityDifference; + Standard_Integer NbUniquePoles = NbPoles - aSummaryMuultypisityDifference; + if (NbUniquePoles <= 0) + { + return 0; + } + TPntArray Poles(1, NbPoles - aSummaryMuultypisityDifference); + + for (Standard_Integer i = 1 + aFirstMuultypisityDifference; i <= NbPoles - aLastMuultypisityDifference; ++i) + { + Handle(TCartesianPoint) aPoint = (*thePointMakerFunction)(aControlPointsList->Value(i)); + if (!aPoint.IsNull()) + { + TCartesianPoint* pPoint = aPoint.get(); + TGpPnt aGpPnt = (pPoint->*thePntGetterFunction)(); + Poles.SetValue(i - aFirstMuultypisityDifference, aGpPnt); + } + else + { + return 0; + } + } + + // --- Does the Curve descriptor LOOKS like a periodic descriptor ? --- + Standard_Integer aSummaryMuultypisity = 0; + for (Standard_Integer i = 1; i <= NbUniqueKnots; i++) + { + aSummaryMuultypisity += aUniqueKnotMultiplicities.Value(i); + } + + Standard_Boolean shouldBePeriodic; + if (aSummaryMuultypisity == (NbPoles + aDegree + 1)) + { + shouldBePeriodic = Standard_False; + } + else if ((aUniqueKnotMultiplicities.Value(1) == aUniqueKnotMultiplicities.Value(NbUniqueKnots)) && + ((aSummaryMuultypisity - aUniqueKnotMultiplicities.Value(1)) == NbPoles)) + { + shouldBePeriodic = Standard_True; + } + else + { + // --- What is that ??? --- + shouldBePeriodic = Standard_False; + } + + Handle(TBSplineCurve) aBSplineCurve; + if (theStepGeom_BSplineCurve->IsKind(STANDARD_TYPE(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve))) + { + const Handle(TColStd_HArray1OfReal)& aWeights = aBSplineCurveWithKnotsAndRationalBSplineCurve->WeightsData(); + TColStd_Array1OfReal aUniqueWeights(1, NbPoles - aSummaryMuultypisityDifference); + for (Standard_Integer i = 1 + aFirstMuultypisityDifference; i <= NbPoles - aLastMuultypisityDifference; ++i) + aUniqueWeights.SetValue(i - aFirstMuultypisityDifference, aWeights->Value(i)); + aBSplineCurve = new TBSplineCurve(Poles, aUniqueWeights, aUniqueKnots, aUniqueKnotMultiplicities, aDegree, shouldBePeriodic); + } + else + { + aBSplineCurve = new TBSplineCurve(Poles, aUniqueKnots, aUniqueKnotMultiplicities, aDegree, shouldBePeriodic); + } + + // abv 04.07.00 CAX-IF TRJ4: trj4_k1_top-md-203.stp #716 (face #581): + // force periodicity on closed curves + if (theStepGeom_BSplineCurve->ClosedCurve() && aBSplineCurve->Degree() > 1 && aBSplineCurve->IsClosed()) + { + aBSplineCurve->SetPeriodic(); + } + return aBSplineCurve; +} + +//============================================================================= // Creation d' une BSplineCurve de Geom a partir d' une BSplineCurve de Step //============================================================================= -Handle(Geom_BSplineCurve) StepToGeom::MakeBSplineCurve (const Handle(StepGeom_BSplineCurve)& SC) +Handle(Geom_BSplineCurve) StepToGeom::MakeBSplineCurve (const Handle(StepGeom_BSplineCurve)& theStepGeom_BSplineCurve) { -#define Array1OfPnt_gen TColgp_Array1OfPnt -#define Pnt_gen gp_Pnt -#define Pnt_fonc Pnt -#define CartesianPoint_gen Handle(Geom_CartesianPoint) -#define MakeCartesianPoint_gen MakeCartesianPoint -#define BSplineCurve_gen Geom_BSplineCurve -#define BSplineCurve_retour Handle(Geom_BSplineCurve) -#define MakeBSplineCurve_gen MakeBSplineCurve -#include "StepToGeom_MakeBSplineCurve.pxx" -#undef Array1OfPnt_gen -#undef Pnt_gen -#undef Pnt_fonc -#undef CartesianPoint_gen -#undef MakeCartesianPoint_gen -#undef BSplineCurve_gen -#undef MakeBSplineCurve_gen -#undef BSplineCurve_retour + return MakeBSplineCurveCommon + (theStepGeom_BSplineCurve, &Geom_CartesianPoint::Pnt, &MakeCartesianPoint); } //============================================================================= @@ -652,25 +802,10 @@ // BSplineCurveWithKnotsAndRationalBSplineCurve de Step //============================================================================= -Handle(Geom2d_BSplineCurve) StepToGeom::MakeBSplineCurve2d (const Handle(StepGeom_BSplineCurve)& SC) +Handle(Geom2d_BSplineCurve) StepToGeom::MakeBSplineCurve2d (const Handle(StepGeom_BSplineCurve)& theStepGeom_BSplineCurve) { -#define Array1OfPnt_gen TColgp_Array1OfPnt2d -#define Pnt_gen gp_Pnt2d -#define CartesianPoint_gen Handle(Geom2d_CartesianPoint) -#define MakeCartesianPoint_gen MakeCartesianPoint2d -#define Pnt_fonc Pnt2d -#define BSplineCurve_gen Geom2d_BSplineCurve -#define BSplineCurve_retour Handle(Geom2d_BSplineCurve) -#define MakeBSplineCurve_gen MakeBSplineCurve2d -#include "StepToGeom_MakeBSplineCurve.pxx" -#undef Array1OfPnt_gen -#undef Pnt_gen -#undef CartesianPoint_gen -#undef MakeCartesianPoint_gen -#undef Pnt_fonc -#undef BSplineCurve_gen -#undef MakeBSplineCurve_gen -#undef BSplineCurve_retour + return MakeBSplineCurveCommon + (theStepGeom_BSplineCurve, &Geom2d_CartesianPoint::Pnt2d, &MakeCartesianPoint2d); } //============================================================================= diff -Nru opencascade-7.4.1+dfsg1/src/StepToGeom/StepToGeom_MakeBSplineCurve.pxx opencascade-7.5.1+dfsg1/src/StepToGeom/StepToGeom_MakeBSplineCurve.pxx --- opencascade-7.4.1+dfsg1/src/StepToGeom/StepToGeom_MakeBSplineCurve.pxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToGeom/StepToGeom_MakeBSplineCurve.pxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ -// Created on: 1993-07-02 -// Created by: Martine LANGLOIS -// Copyright (c) 1993-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - - Handle(StepGeom_BSplineCurveWithKnots) BSCW; - Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve) BSCWR; - - if (SC->IsKind(STANDARD_TYPE(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve))) { - BSCWR = Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve)::DownCast(SC); - BSCW = BSCWR->BSplineCurveWithKnots(); - } - else - BSCW = Handle(StepGeom_BSplineCurveWithKnots)::DownCast(SC); - - const Standard_Integer Deg = BSCW->Degree(); - const Standard_Integer NbPoles = BSCW->NbControlPointsList(); - const Standard_Integer NbKnots = BSCW->NbKnotMultiplicities(); - - //aKnotMultiplicities = new TColStd_HArray1OfInteger(1,NbKnots); - const Handle(TColStd_HArray1OfInteger)& aKnotMultiplicities = BSCW->KnotMultiplicities(); - //aKnots = new TColStd_HArray1OfReal(1,NbKnots); - const Handle(TColStd_HArray1OfReal)& aKnots = BSCW->Knots(); - - // Count number of unique knots - Standard_Integer i; - Standard_Integer NbUniqueKnots = 0; - Standard_Real lastKnot = RealFirst(); - for (i=1; i<=NbKnots; ++i) { - if (aKnots->Value(i) - lastKnot > Epsilon (Abs(lastKnot))) { - NbUniqueKnots++; - lastKnot = aKnots->Value(i); - } - } - if(NbUniqueKnots <= 1) - { - return 0; - } - TColStd_Array1OfReal Kn(1,NbUniqueKnots); - TColStd_Array1OfInteger Mult(1,NbUniqueKnots); - lastKnot = aKnots->Value(1); - Kn.SetValue(1, aKnots->Value(1)); - Mult.SetValue(1, aKnotMultiplicities->Value(1)); - Standard_Integer pos = 1; - for (i=2; i<=NbKnots; i++) { - if (aKnots->Value(i) - lastKnot > Epsilon (Abs(lastKnot))) { - pos++; - Kn.SetValue(pos, aKnots->Value(i)); - Mult.SetValue(pos, aKnotMultiplicities->Value(i)); - lastKnot = aKnots->Value(i); - } - else { - // Knot not unique, increase multiplicity - Standard_Integer curMult = Mult.Value(pos); - Mult.SetValue(pos, curMult + aKnotMultiplicities->Value(i)); - } - } - - Standard_Integer aFMulDiff = 0,aLMulDiff = 0; - for (i=1; i<=NbUniqueKnots; ++i) { - Standard_Integer aCurrentVal = Mult.Value(i); - if (aCurrentVal > Deg + 1) - { - if (i == 1) aFMulDiff = aCurrentVal - Deg - 1; - if (i == NbUniqueKnots) aLMulDiff = aCurrentVal - Deg - 1; -#ifdef OCCT_DEBUG - std::cout << "\nWrong multiplicity " << aCurrentVal << " on " << i - << " knot!" << "\nChanged to " << Deg + 1 << std::endl; -#endif - aCurrentVal = Deg + 1; - } - Mult.SetValue(i,aCurrentVal); - } - - //aControlPointsList = new StepGeom_HArray1OfCartesianPoint(1,NbPoles); - const Handle(StepGeom_HArray1OfCartesianPoint)& aControlPointsList = BSCW->ControlPointsList(); - Standard_Integer aSumMulDiff = aFMulDiff + aLMulDiff; - Standard_Integer nbP = NbPoles - aSumMulDiff; - if( nbP <= 0) - { - return 0; - } - Array1OfPnt_gen Poles(1,NbPoles - aSumMulDiff); - - for (i = 1 + aFMulDiff; i<= NbPoles - aLMulDiff; ++i) - { - CartesianPoint_gen P = MakeCartesianPoint_gen (aControlPointsList->Value(i)); - if (! P.IsNull()) - Poles.SetValue(i - aFMulDiff,P->Pnt_fonc()); - else - return 0; - } - - // --- Does the Curve descriptor LOOKS like a periodic descriptor ? --- - - Standard_Integer SumMult = 0; - for (i=1; i<=NbUniqueKnots; i++) { - SumMult += Mult.Value(i); - } - - Standard_Boolean shouldBePeriodic; - if (SumMult == (NbPoles + Deg + 1)) { - shouldBePeriodic = Standard_False; - } - else if ((Mult.Value(1) == - Mult.Value(NbUniqueKnots)) && - ((SumMult - Mult.Value(1)) == NbPoles)) { - shouldBePeriodic = Standard_True; - } - else { // --- What is that ??? --- - shouldBePeriodic = Standard_False; - //cout << "Strange BSpline Curve Descriptor" << endl; - } - - BSplineCurve_retour CC; - if (SC->IsKind(STANDARD_TYPE(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve))) { - const Handle(TColStd_HArray1OfReal)& aWeight = BSCWR->WeightsData(); - TColStd_Array1OfReal W(1,NbPoles); - for (i=1; i<=NbPoles; i++) - W.SetValue(i,aWeight->Value(i)); - CC = new BSplineCurve_gen(Poles, W, Kn, Mult, Deg, shouldBePeriodic); - } - else - CC = new BSplineCurve_gen(Poles, Kn, Mult, Deg, shouldBePeriodic); - - // abv 04.07.00 CAX-IF TRJ4: trj4_k1_top-md-203.stp #716 (face #581): - // force periodicity on closed curves - if ( SC->ClosedCurve() && CC->Degree() >1 && CC->IsClosed() ) { - CC->SetPeriodic(); - } - return CC; diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Builder.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Builder.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Builder.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Builder.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include #include @@ -105,81 +105,22 @@ // ============================================================================ StepToTopoDS_Builder::StepToTopoDS_Builder() +: myError(StepToTopoDS_BuilderOther) { done = Standard_False; } // ============================================================================ -// Method : StepToTopoDS_Builder::StepToTopoDS_Builder -// Purpose : Constructor with a ManifoldSolidBrep -// ============================================================================ - -StepToTopoDS_Builder::StepToTopoDS_Builder -(const Handle(StepShape_ManifoldSolidBrep)& aManifoldSolid, - const Handle(Transfer_TransientProcess)& TP) -{ - Init(aManifoldSolid, TP); -} - -// ============================================================================ -// Method : StepToTopoDS_Builder::StepToTopoDS_Builder -// Purpose : Constructor woth a BrepWithVoids -// ============================================================================ - -StepToTopoDS_Builder::StepToTopoDS_Builder -(const Handle(StepShape_BrepWithVoids)& aBRepWithVoids, - const Handle(Transfer_TransientProcess)& TP) -{ - Init(aBRepWithVoids, TP); -} - -// ============================================================================ -// Method : StepToTopoDS_Builder::StepToTopoDS_Builder -// Purpose : Constructor with a FacetedBrep -// ============================================================================ - -StepToTopoDS_Builder::StepToTopoDS_Builder -(const Handle(StepShape_FacetedBrep)& aFB, - const Handle(Transfer_TransientProcess)& TP) -{ - Init(aFB, TP); -} - -// ============================================================================ -// Method : StepToTopoDS_Builder::StepToTopoDS_Builder -// Purpose : Constructor with a FacetedBrepAndBrepWithVoids -// ============================================================================ - -StepToTopoDS_Builder::StepToTopoDS_Builder -(const Handle(StepShape_FacetedBrepAndBrepWithVoids)& aFBABWV, - const Handle(Transfer_TransientProcess)& TP) -{ - Init(aFBABWV, TP); -} - -// ============================================================================ -// Method : StepToTopoDS_Builder::StepToTopoDS_Builder -// Purpose : Constructor with a ShellBasedSurfaceModel -// ============================================================================ - -StepToTopoDS_Builder::StepToTopoDS_Builder -(const Handle(StepShape_ShellBasedSurfaceModel)& aSBSM, - const Handle(Transfer_TransientProcess)& TP, - StepToTopoDS_NMTool& NMTool) -{ - Init(aSBSM, TP, NMTool); -} - -// ============================================================================ // Method : Init // Purpose : Init with a ManifoldSolidBrep // ============================================================================ void StepToTopoDS_Builder::Init (const Handle(StepShape_ManifoldSolidBrep)& aManifoldSolid, - const Handle(Transfer_TransientProcess)& TP) + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { - Handle(Message_Messenger) sout = TP->Messenger(); + Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo(); // Initialisation of the Tool StepToTopoDS_Tool myTool; @@ -197,7 +138,7 @@ myTranShell.SetMaxTol(MaxTol()); // Non-manifold topology is not referenced by ManifoldSolidBrep (ssv; 14.11.2010) StepToTopoDS_NMTool dummyNMTool; - myTranShell.Init(aShell, myTool, dummyNMTool); + myTranShell.Init(aShell, myTool, dummyNMTool, theProgress); if (myTranShell.IsDone()) { TopoDS_Shape Sh = myTranShell.Value(); @@ -215,16 +156,16 @@ if ( TP->TraceLevel() > 2 ) { - sout << "Geometric Statitics : " << Message_EndLine; - sout << " Surface Continuity : - C0 : " << myTool.C0Surf() << Message_EndLine; - sout << " - C1 : " << myTool.C1Surf() << Message_EndLine; - sout << " - C2 : " << myTool.C2Surf() << Message_EndLine; - sout << " Curve Continuity : - C0 : " << myTool.C0Cur3() << Message_EndLine; - sout << " - C1 : " << myTool.C1Cur3() << Message_EndLine; - sout << " - C2 : " << myTool.C2Cur3() << Message_EndLine; - sout << " PCurve Continuity : - C0 : " << myTool.C0Cur2() << Message_EndLine; - sout << " - C1 : " << myTool.C1Cur2() << Message_EndLine; - sout << " - C2 : " << myTool.C2Cur2() << Message_EndLine; + sout << "Geometric Statitics : " << std::endl; + sout << " Surface Continuity : - C0 : " << myTool.C0Surf() << std::endl; + sout << " - C1 : " << myTool.C1Surf() << std::endl; + sout << " - C2 : " << myTool.C2Surf() << std::endl; + sout << " Curve Continuity : - C0 : " << myTool.C0Cur3() << std::endl; + sout << " - C1 : " << myTool.C1Cur3() << std::endl; + sout << " - C2 : " << myTool.C2Cur3() << std::endl; + sout << " PCurve Continuity : - C0 : " << myTool.C0Cur2() << std::endl; + sout << " - C1 : " << myTool.C1Cur2() << std::endl; + sout << " - C2 : " << myTool.C2Cur2() << std::endl; } //:S4136 ShapeFix::SameParameter (S,Standard_False); @@ -244,9 +185,10 @@ void StepToTopoDS_Builder::Init (const Handle(StepShape_BrepWithVoids)& aBRepWithVoids, - const Handle(Transfer_TransientProcess)& TP) + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { - Handle(Message_Messenger) sout = TP->Messenger(); + Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo(); // Initialisation of the Tool StepToTopoDS_Tool myTool; StepToTopoDS_DataMapOfTRI aMap; @@ -262,7 +204,7 @@ BRep_Builder B; B.MakeSolid(S); - Message_ProgressSentry PS ( TP->GetProgress(), "Shell", 0, Nb+1, 1 ); + Message_ProgressScope PS (theProgress, "Shell", Nb+1); StepToTopoDS_TranslateShell myTranShell; @@ -273,9 +215,7 @@ aCShell = Handle(StepShape_ClosedShell)::DownCast(aBRepWithVoids->Outer()); // Non-manifold topology is not referenced by BrepWithVoids (ssv; 14.11.2010) StepToTopoDS_NMTool dummyNMTool; - myTranShell.Init(aCShell, myTool, dummyNMTool); - - PS.Next(); + myTranShell.Init(aCShell, myTool, dummyNMTool, PS.Next()); if (myTranShell.IsDone()) { Sh = myTranShell.Value(); @@ -296,10 +236,10 @@ // Voids - for (Standard_Integer i=1; i<=Nb && PS.More(); i++, PS.Next()) { + for (Standard_Integer i=1; i<=Nb && PS.More(); i++) { aCShell = aBRepWithVoids->VoidsValue(i); - myTranShell.Init(aCShell, myTool, dummyNMTool); + myTranShell.Init(aCShell, myTool, dummyNMTool, PS.Next()); if (myTranShell.IsDone()) { Sh = myTranShell.Value(); Sh.Closed(Standard_True); @@ -323,16 +263,16 @@ if ( TP->TraceLevel() > 2 ) { - sout << "Geometric Statitics : " << Message_EndLine; - sout << " Surface Continuity : - C0 : " << myTool.C0Surf() << Message_EndLine; - sout << " - C1 : " << myTool.C1Surf() << Message_EndLine; - sout << " - C2 : " << myTool.C2Surf() << Message_EndLine; - sout << " Curve Continuity : - C0 : " << myTool.C0Cur3() << Message_EndLine; - sout << " - C1 : " << myTool.C1Cur3() << Message_EndLine; - sout << " - C2 : " << myTool.C2Cur3() << Message_EndLine; - sout << " PCurve Continuity : - C0 : " << myTool.C0Cur2() << Message_EndLine; - sout << " - C1 : " << myTool.C1Cur2() << Message_EndLine; - sout << " - C2 : " << myTool.C2Cur2() << Message_EndLine; + sout << "Geometric Statitics : " << std::endl; + sout << " Surface Continuity : - C0 : " << myTool.C0Surf() << std::endl; + sout << " - C1 : " << myTool.C1Surf() << std::endl; + sout << " - C2 : " << myTool.C2Surf() << std::endl; + sout << " Curve Continuity : - C0 : " << myTool.C0Cur3() << std::endl; + sout << " - C1 : " << myTool.C1Cur3() << std::endl; + sout << " - C2 : " << myTool.C2Cur3() << std::endl; + sout << " PCurve Continuity : - C0 : " << myTool.C0Cur2() << std::endl; + sout << " - C1 : " << myTool.C1Cur2() << std::endl; + sout << " - C2 : " << myTool.C2Cur2() << std::endl; } //:S4136 ShapeFix::SameParameter (S,Standard_False); @@ -345,7 +285,8 @@ // ============================================================================ void StepToTopoDS_Builder::Init(const Handle(StepShape_FacetedBrep)& aFB, - const Handle(Transfer_TransientProcess)& TP) + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { // Initialisation of the Tool @@ -365,7 +306,7 @@ myTranShell.SetMaxTol(MaxTol()); // Non-manifold topology is not referenced by FacetedBrep (ss; 14.11.2010) StepToTopoDS_NMTool dummyNMTool; - myTranShell.Init(aCShell, myTool, dummyNMTool); + myTranShell.Init(aCShell, myTool, dummyNMTool, theProgress); if (myTranShell.IsDone()) { Sh = myTranShell.Value(); @@ -396,7 +337,8 @@ void StepToTopoDS_Builder::Init (const Handle(StepShape_FacetedBrepAndBrepWithVoids)& aFBABWV, - const Handle(Transfer_TransientProcess)& TP) + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { // Initialisation of the Tool @@ -411,12 +353,14 @@ aCShell = Handle(StepShape_ClosedShell)::DownCast(aFBABWV->Outer()); TopoDS_Shape Sh; + Message_ProgressScope aPSRoot(theProgress, NULL, 2); + StepToTopoDS_TranslateShell myTranShell; myTranShell.SetPrecision(Precision()); //gka myTranShell.SetMaxTol(MaxTol()); // Non-manifold topology is not referenced by FacetedBrepAndBrepWithVoids (ss; 14.11.2010) StepToTopoDS_NMTool dummyNMTool; - myTranShell.Init(aCShell, myTool, dummyNMTool); + myTranShell.Init(aCShell, myTool, dummyNMTool, aPSRoot.Next()); if (myTranShell.IsDone()) { Sh = myTranShell.Value(); @@ -428,9 +372,10 @@ B.Add(S,Sh); Standard_Integer Nb, i; Nb = aFBABWV->NbVoids(); - for ( i=1; i<=Nb; i++ ) { + Message_ProgressScope aPS (aPSRoot.Next(), NULL, Nb); + for ( i=1; i<=Nb && aPS.More(); i++) { aCShell = aFBABWV->VoidsValue(i); - myTranShell.Init(aCShell, myTool, dummyNMTool); + myTranShell.Init(aCShell, myTool, dummyNMTool, aPS.Next()); if (myTranShell.IsDone()) { Sh = myTranShell.Value(); Sh.Closed(Standard_True); @@ -462,9 +407,10 @@ void StepToTopoDS_Builder::Init (const Handle(StepShape_ShellBasedSurfaceModel)& aSBSM, const Handle(Transfer_TransientProcess)& TP, - StepToTopoDS_NMTool& NMTool) + StepToTopoDS_NMTool& NMTool, + const Message_ProgressRange& theProgress) { - Handle(Message_Messenger) sout = TP->Messenger(); + Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo(); // Initialisation of the Tool StepToTopoDS_Tool myTool; @@ -489,13 +435,15 @@ myTranShell.SetPrecision(Precision()); myTranShell.SetMaxTol(MaxTol()); - Message_ProgressSentry PS ( TP->GetProgress(), "Shell", 0, Nb, 1 ); - for (Standard_Integer i = 1; i <= Nb && PS.More(); i++, PS.Next()) { + Message_ProgressScope PS ( theProgress, "Shell", Nb); + for (Standard_Integer i = 1; i <= Nb && PS.More(); i++) + { + Message_ProgressRange aRange = PS.Next(); aShell = aSBSM->SbsmBoundaryValue(i); aOpenShell = aShell.OpenShell(); aClosedShell = aShell.ClosedShell(); if (!aOpenShell.IsNull()) { - myTranShell.Init(aOpenShell, myTool, NMTool); + myTranShell.Init(aOpenShell, myTool, NMTool, aRange); if (myTranShell.IsDone()) { Shl = TopoDS::Shell(myTranShell.Value()); Shl.Closed(Standard_False); @@ -507,7 +455,7 @@ } } else if (!aClosedShell.IsNull()) { - myTranShell.Init(aClosedShell, myTool, NMTool); + myTranShell.Init(aClosedShell, myTool, NMTool, aRange); if (myTranShell.IsDone()) { Shl = TopoDS::Shell(myTranShell.Value()); Shl.Closed(Standard_True); @@ -530,16 +478,16 @@ if ( TP->TraceLevel() > 2 ) { - sout << "Geometric Statitics : " << Message_EndLine; - sout << " Surface Continuity : - C0 : " << myTool.C0Surf() << Message_EndLine; - sout << " - C1 : " << myTool.C1Surf() << Message_EndLine; - sout << " - C2 : " << myTool.C2Surf() << Message_EndLine; - sout << " Curve Continuity : - C0 : " << myTool.C0Cur3() << Message_EndLine; - sout << " - C1 : " << myTool.C1Cur3() << Message_EndLine; - sout << " - C2 : " << myTool.C2Cur3() << Message_EndLine; - sout << " PCurve Continuity : - C0 : " << myTool.C0Cur2() << Message_EndLine; - sout << " - C1 : " << myTool.C1Cur2() << Message_EndLine; - sout << " - C2 : " << myTool.C2Cur2() << Message_EndLine; + sout << "Geometric Statitics : " << std::endl; + sout << " Surface Continuity : - C0 : " << myTool.C0Surf() << std::endl; + sout << " - C1 : " << myTool.C1Surf() << std::endl; + sout << " - C2 : " << myTool.C2Surf() << std::endl; + sout << " Curve Continuity : - C0 : " << myTool.C0Cur3() << std::endl; + sout << " - C1 : " << myTool.C1Cur3() << std::endl; + sout << " - C2 : " << myTool.C2Cur3() << std::endl; + sout << " PCurve Continuity : - C0 : " << myTool.C0Cur2() << std::endl; + sout << " - C1 : " << myTool.C1Cur2() << std::endl; + sout << " - C2 : " << myTool.C2Cur2() << std::endl; } //:S4136 ShapeFix::SameParameter (S,Standard_False); @@ -709,7 +657,8 @@ (const Handle(StepShape_GeometricSet)& GCS, const Handle(Transfer_TransientProcess)& TP, const Handle(Transfer_ActorOfTransientProcess)& RA, - const Standard_Boolean isManifold) + const Standard_Boolean isManifold, + const Message_ProgressRange& theProgress) { // Start Mapping TopoDS_Compound S; @@ -720,7 +669,10 @@ Standard_Real preci = Precision(); //gka Standard_Real maxtol = MaxTol(); Standard_Integer nbElem = GCS->NbElements(); - for (i = 1; i <= nbElem ; i++) { + Message_ProgressScope aPS(theProgress, NULL, nbElem); + for (i = 1; i <= nbElem && aPS.More(); i++) + { + Message_ProgressRange aRange = aPS.Next(); StepShape_GeometricSetSelect aGSS = GCS->ElementsValue(i); Handle(Standard_Transient) ent = aGSS.Value(); @@ -770,9 +722,9 @@ aGeomCrv = StepToGeom::MakeCurve(aCrv); } catch (Standard_Failure const& anException) { - Handle(Message_Messenger) sout = TP->Messenger(); + Message_Messenger::StreamBuffer sout = TP->Messenger()->SendInfo(); sout << "StepToTopoDS, GeometricSet, elem " << i << " of " << nbElem << ": exception "; - sout << anException.GetMessageString() << Message_EndLine; + sout << anException.GetMessageString() << std::endl; } if (!aGeomCrv.IsNull()) { BRepBuilderAPI_MakeEdge anEdge(aGeomCrv, aGeomCrv->FirstParameter(), aGeomCrv->LastParameter()); @@ -833,7 +785,7 @@ Handle(STEPControl_ActorRead) anActor = Handle(STEPControl_ActorRead)::DownCast(RA); Handle(Transfer_Binder) binder; if( !anActor.IsNull()) - binder = anActor->TransferShape(GRI, TP, isManifold); + binder = anActor->TransferShape(GRI, TP, isManifold, Standard_False, aRange); if (!binder.IsNull()) { res = TransferBRep::ShapeResult(binder); diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Builder.hxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Builder.hxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Builder.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Builder.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -25,6 +25,8 @@ #include #include #include +#include + class StdFail_NotDone; class StepShape_ManifoldSolidBrep; class Transfer_TransientProcess; @@ -50,33 +52,38 @@ Standard_EXPORT StepToTopoDS_Builder(); - Standard_EXPORT StepToTopoDS_Builder(const Handle(StepShape_ManifoldSolidBrep)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT StepToTopoDS_Builder(const Handle(StepShape_BrepWithVoids)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT StepToTopoDS_Builder(const Handle(StepShape_FacetedBrep)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT StepToTopoDS_Builder(const Handle(StepShape_FacetedBrepAndBrepWithVoids)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT StepToTopoDS_Builder(const Handle(StepShape_ShellBasedSurfaceModel)& S, const Handle(Transfer_TransientProcess)& TP, StepToTopoDS_NMTool& NMTool); - - Standard_EXPORT StepToTopoDS_Builder(const Handle(StepShape_GeometricSet)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT void Init (const Handle(StepShape_ManifoldSolidBrep)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT void Init (const Handle(StepShape_BrepWithVoids)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT void Init (const Handle(StepShape_FacetedBrep)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT void Init (const Handle(StepShape_FacetedBrepAndBrepWithVoids)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT void Init (const Handle(StepShape_ShellBasedSurfaceModel)& S, const Handle(Transfer_TransientProcess)& TP, StepToTopoDS_NMTool& NMTool); - - Standard_EXPORT void Init (const Handle(StepShape_EdgeBasedWireframeModel)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT void Init (const Handle(StepShape_FaceBasedSurfaceModel)& S, const Handle(Transfer_TransientProcess)& TP); - - Standard_EXPORT void Init (const Handle(StepShape_GeometricSet)& S, const Handle(Transfer_TransientProcess)& TP, const Handle(Transfer_ActorOfTransientProcess)& RA = NULL, const Standard_Boolean isManifold = Standard_False); + Standard_EXPORT void Init (const Handle(StepShape_ManifoldSolidBrep)& S, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress = Message_ProgressRange()); + + Standard_EXPORT void Init (const Handle(StepShape_BrepWithVoids)& S, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress = Message_ProgressRange()); + + Standard_EXPORT void Init (const Handle(StepShape_FacetedBrep)& S, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress = Message_ProgressRange()); + + Standard_EXPORT void Init (const Handle(StepShape_FacetedBrepAndBrepWithVoids)& S, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress = Message_ProgressRange()); + + Standard_EXPORT void Init (const Handle(StepShape_ShellBasedSurfaceModel)& S, + const Handle(Transfer_TransientProcess)& TP, + StepToTopoDS_NMTool& NMTool, + const Message_ProgressRange& theProgress = Message_ProgressRange()); + + Standard_EXPORT void Init (const Handle(StepShape_EdgeBasedWireframeModel)& S, + const Handle(Transfer_TransientProcess)& TP); + + Standard_EXPORT void Init (const Handle(StepShape_FaceBasedSurfaceModel)& S, + const Handle(Transfer_TransientProcess)& TP); + + Standard_EXPORT void Init (const Handle(StepShape_GeometricSet)& S, + const Handle(Transfer_TransientProcess)& TP, + const Handle(Transfer_ActorOfTransientProcess)& RA = NULL, + const Standard_Boolean isManifold = Standard_False, + const Message_ProgressRange& theProgress = Message_ProgressRange()); Standard_EXPORT const TopoDS_Shape& Value() const; diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_MakeTransformed.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_MakeTransformed.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_MakeTransformed.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_MakeTransformed.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -116,7 +116,8 @@ TopoDS_Shape StepToTopoDS_MakeTransformed::TranslateMappedItem (const Handle(StepRepr_MappedItem)& mapit, - const Handle(Transfer_TransientProcess)& TP) + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress) { TopoDS_Shape theResult; @@ -142,7 +143,7 @@ // La Shape, et la mise en position Handle(StepRepr_Representation) maprep = mapit->MappingSource()->MappedRepresentation(); Handle(Transfer_Binder) binder = TP->Find(maprep); - if (binder.IsNull()) binder = TP->Transferring(maprep); + if (binder.IsNull()) binder = TP->Transferring(maprep, theProgress); Handle(TransferBRep_ShapeBinder) shbinder = Handle(TransferBRep_ShapeBinder)::DownCast(binder); if (shbinder.IsNull()) TP->AddWarning(mapit,"No Shape Produced"); diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_MakeTransformed.hxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_MakeTransformed.hxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_MakeTransformed.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_MakeTransformed.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ #include #include #include +#include + class StepGeom_Axis2Placement3d; class StepGeom_CartesianTransformationOperator3d; class gp_Trsf; @@ -31,7 +33,6 @@ class StepRepr_MappedItem; class Transfer_TransientProcess; - //! Produces instances by Transformation of a basic item class StepToTopoDS_MakeTransformed : public StepToTopoDS_Root { @@ -68,7 +69,9 @@ //! Hence, the transformation from MappingOrigin and MappingTarget //! is computed, the MappedRepr. is converted to a Shape, then //! transformed as an instance of this Shape - Standard_EXPORT TopoDS_Shape TranslateMappedItem (const Handle(StepRepr_MappedItem)& mapit, const Handle(Transfer_TransientProcess)& TP); + Standard_EXPORT TopoDS_Shape TranslateMappedItem (const Handle(StepRepr_MappedItem)& mapit, + const Handle(Transfer_TransientProcess)& TP, + const Message_ProgressRange& theProgress = Message_ProgressRange()); diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Tool.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Tool.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Tool.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_Tool.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -34,7 +34,19 @@ // Method : StepToTopoDS_Tool::StepToTopoDS_Tool // Purpose : Empty Constructor // ============================================================================ -StepToTopoDS_Tool::StepToTopoDS_Tool() {} +StepToTopoDS_Tool::StepToTopoDS_Tool() +: myComputePC(Standard_False), + myNbC0Surf(0), + myNbC1Surf(0), + myNbC2Surf(0), + myNbC0Cur2(0), + myNbC1Cur2(0), + myNbC2Cur2(0), + myNbC0Cur3(0), + myNbC1Cur3(0), + myNbC2Cur3(0) +{ +} // ============================================================================ // Method : StepToTopoDS_Tool::StepToTopoDS_Tool diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateCompositeCurve.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateCompositeCurve.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateCompositeCurve.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateCompositeCurve.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,7 +47,10 @@ //function : Create //purpose : //======================================================================= -StepToTopoDS_TranslateCompositeCurve::StepToTopoDS_TranslateCompositeCurve () {} +StepToTopoDS_TranslateCompositeCurve::StepToTopoDS_TranslateCompositeCurve () +: myInfiniteSegment(Standard_False) +{ +} //======================================================================= //function : Create diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateEdge.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateEdge.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateEdge.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateEdge.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -171,6 +171,7 @@ // ============================================================================ StepToTopoDS_TranslateEdge::StepToTopoDS_TranslateEdge() +: myError(StepToTopoDS_TranslateEdgeOther) { done = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateEdgeLoop.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateEdgeLoop.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateEdgeLoop.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateEdgeLoop.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -184,6 +184,7 @@ // ============================================================================ StepToTopoDS_TranslateEdgeLoop::StepToTopoDS_TranslateEdgeLoop() +: myError(StepToTopoDS_TranslateEdgeLoopOther) { done = Standard_False; } @@ -284,6 +285,12 @@ for (j=1; j<=NbEdge; j++) { OrEdge1 = EL->EdgeListValue(j); + if (OrEdge1.IsNull() || OrEdge1->EdgeElement().IsNull()) + { + TP->AddWarning(OrEdge1, "Incorrect Oriented_Edge is not translated. Oriented_Edge definition is not correct"); + continue; + } + // see bug #29979: oriented edge contains another oriented edge if (OrEdge1->EdgeElement()->IsKind (STANDARD_TYPE(StepShape_OrientedEdge))) OrEdge1 = Handle(StepShape_OrientedEdge)::DownCast (OrEdge1->EdgeElement()); @@ -369,6 +376,9 @@ for (j=1; j<=NbEdge; j++) { OrEdge1 = EL->EdgeListValue (j); OrEdge2 = EL->EdgeListValue (j < NbEdge ? j + 1 : 1); + if (OrEdge1.IsNull() || OrEdge2.IsNull()) + continue; + Handle(StepShape_EdgeCurve) EC1 = Handle(StepShape_EdgeCurve)::DownCast (OrEdge1->EdgeElement()); Handle(StepShape_EdgeCurve) EC2 = @@ -424,6 +434,8 @@ #endif OrEdge1 = EL->EdgeListValue(j); + if (OrEdge1.IsNull() || OrEdge1->EdgeElement().IsNull()) + continue; // see bug #29979: oriented edge contains another oriented edge if (OrEdge1->EdgeElement()->IsKind (STANDARD_TYPE(StepShape_OrientedEdge))) diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateFace.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateFace.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateFace.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateFace.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -96,6 +96,7 @@ // Purpose : Empty Constructor // ============================================================================ StepToTopoDS_TranslateFace::StepToTopoDS_TranslateFace() +: myError(StepToTopoDS_TranslateFaceOther) { done = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslatePolyLoop.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslatePolyLoop.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslatePolyLoop.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslatePolyLoop.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,6 +47,7 @@ // Purpose : // ============================================================================ StepToTopoDS_TranslatePolyLoop::StepToTopoDS_TranslatePolyLoop() +: myError(StepToTopoDS_TranslatePolyLoopOther) { done = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateShell.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateShell.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateShell.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateShell.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,8 +17,7 @@ //: gka 09.04.99: S4136: improving tolerance management #include -#include -#include +#include #include #include #include @@ -37,28 +36,21 @@ // Purpose : Empty Constructor // ============================================================================ StepToTopoDS_TranslateShell::StepToTopoDS_TranslateShell() +: myError(StepToTopoDS_TranslateShellOther) { done = Standard_False; } // ============================================================================ -// Method : StepToTopoDS_TranslateShell::StepToTopoDS_TranslateShell() -// Purpose : Constructor with a ConnectedFaceSet and a Tool -// ============================================================================ - -StepToTopoDS_TranslateShell::StepToTopoDS_TranslateShell -(const Handle(StepShape_ConnectedFaceSet)& CFS, StepToTopoDS_Tool& T, StepToTopoDS_NMTool& NMTool) -{ - Init(CFS, T, NMTool); -} - -// ============================================================================ // Method : Init // Purpose : Init with a ConnectedFaceSet and a Tool // ============================================================================ void StepToTopoDS_TranslateShell::Init -(const Handle(StepShape_ConnectedFaceSet)& CFS, StepToTopoDS_Tool& aTool, StepToTopoDS_NMTool& NMTool) +(const Handle(StepShape_ConnectedFaceSet)& CFS, + StepToTopoDS_Tool& aTool, + StepToTopoDS_NMTool& NMTool, + const Message_ProgressRange& theProgress) { //bug15697 if(CFS.IsNull()) @@ -80,7 +72,7 @@ myTranFace.SetPrecision(Precision()); //gka myTranFace.SetMaxTol(MaxTol()); - Message_ProgressSentry PS ( TP->GetProgress(), "Face", 0, NbFc, 1 ); + Message_ProgressScope PS ( theProgress, "Face", NbFc); for (Standard_Integer i = 1; i <= NbFc && PS.More(); i++, PS.Next()) { #ifdef OCCT_DEBUG std::cout << "Processing Face : " << i << std::endl; diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateShell.hxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateShell.hxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateShell.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateShell.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,6 +24,8 @@ #include #include #include +#include + class StdFail_NotDone; class StepShape_ConnectedFaceSet; class StepToTopoDS_Tool; @@ -41,9 +43,10 @@ Standard_EXPORT StepToTopoDS_TranslateShell(); - Standard_EXPORT StepToTopoDS_TranslateShell(const Handle(StepShape_ConnectedFaceSet)& CFS, StepToTopoDS_Tool& T, StepToTopoDS_NMTool& NMTool); - - Standard_EXPORT void Init (const Handle(StepShape_ConnectedFaceSet)& CFS, StepToTopoDS_Tool& T, StepToTopoDS_NMTool& NMTool); + Standard_EXPORT void Init (const Handle(StepShape_ConnectedFaceSet)& CFS, + StepToTopoDS_Tool& T, + StepToTopoDS_NMTool& NMTool, + const Message_ProgressRange& theProgress = Message_ProgressRange()); Standard_EXPORT const TopoDS_Shape& Value() const; diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateVertex.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateVertex.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateVertex.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateVertex.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -40,6 +40,7 @@ // Purpose : Empty Constructor // ============================================================================ StepToTopoDS_TranslateVertex::StepToTopoDS_TranslateVertex() +: myError(StepToTopoDS_TranslateVertexOther) { done = Standard_False; } diff -Nru opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateVertexLoop.cxx opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateVertexLoop.cxx --- opencascade-7.4.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateVertexLoop.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepToTopoDS/StepToTopoDS_TranslateVertexLoop.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -37,6 +37,7 @@ // Purpose : Empty Constructor // ============================================================================ StepToTopoDS_TranslateVertexLoop::StepToTopoDS_TranslateVertexLoop() +: myError(StepToTopoDS_TranslateVertexLoopOther) { } diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/FILES opencascade-7.5.1+dfsg1/src/StepVisual/FILES --- opencascade-7.4.1+dfsg1/src/StepVisual/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -1,7 +1,7 @@ StepVisual_AnnotationCurveOccurrence.cxx StepVisual_AnnotationCurveOccurrence.hxx -StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.cxx -StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx +StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.cxx +StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.hxx StepVisual_AnnotationFillArea.cxx StepVisual_AnnotationFillArea.hxx StepVisual_AnnotationFillAreaOccurrence.cxx @@ -32,6 +32,7 @@ StepVisual_Array1OfLayeredItem.hxx StepVisual_Array1OfPresentationStyleAssignment.hxx StepVisual_Array1OfPresentationStyleSelect.hxx +StepVisual_Array1OfRenderingPropertiesSelect.hxx StepVisual_Array1OfStyleContextSelect.hxx StepVisual_Array1OfSurfaceStyleElementSelect.hxx StepVisual_Array1OfTextOrCharacter.hxx @@ -64,8 +65,8 @@ StepVisual_CameraUsage.cxx StepVisual_CameraUsage.hxx StepVisual_CentralOrParallel.hxx -StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.cxx -StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx +StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.cxx +StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.hxx StepVisual_Colour.cxx StepVisual_Colour.hxx StepVisual_ColourRgb.cxx @@ -126,6 +127,7 @@ StepVisual_HArray1OfLayeredItem.hxx StepVisual_HArray1OfPresentationStyleAssignment.hxx StepVisual_HArray1OfPresentationStyleSelect.hxx +StepVisual_HArray1OfRenderingPropertiesSelect.hxx StepVisual_HArray1OfStyleContextSelect.hxx StepVisual_HArray1OfSurfaceStyleElementSelect.hxx StepVisual_HArray1OfTextOrCharacter.hxx @@ -193,6 +195,9 @@ StepVisual_PresentedItem.hxx StepVisual_PresentedItemRepresentation.cxx StepVisual_PresentedItemRepresentation.hxx +StepVisual_RenderingPropertiesSelect.cxx +StepVisual_RenderingPropertiesSelect.hxx +StepVisual_ShadingSurfaceMethod.hxx StepVisual_StyleContextSelect.cxx StepVisual_StyleContextSelect.hxx StepVisual_StyledItem.cxx @@ -212,10 +217,18 @@ StepVisual_SurfaceStyleFillArea.hxx StepVisual_SurfaceStyleParameterLine.cxx StepVisual_SurfaceStyleParameterLine.hxx +StepVisual_SurfaceStyleReflectanceAmbient.cxx +StepVisual_SurfaceStyleReflectanceAmbient.hxx +StepVisual_SurfaceStyleRendering.cxx +StepVisual_SurfaceStyleRendering.hxx +StepVisual_SurfaceStyleRenderingWithProperties.cxx +StepVisual_SurfaceStyleRenderingWithProperties.hxx StepVisual_SurfaceStyleSegmentationCurve.cxx StepVisual_SurfaceStyleSegmentationCurve.hxx StepVisual_SurfaceStyleSilhouette.cxx StepVisual_SurfaceStyleSilhouette.hxx +StepVisual_SurfaceStyleTransparent.cxx +StepVisual_SurfaceStyleTransparent.hxx StepVisual_SurfaceStyleUsage.cxx StepVisual_SurfaceStyleUsage.hxx StepVisual_Template.cxx diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.cxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.cxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Created on: 2017-02-06 -// Created by: Irina KRYLOVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -IMPLEMENT_STANDARD_RTTIEXT(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem, StepVisual_AnnotationCurveOccurrence) - -//======================================================================= -//function : StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem -//purpose : -//======================================================================= -StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem::StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem() { } diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -// Created on: 2017-02-06 -// Created by: Irina KRYLOVA -// Copyright (c) 2017 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem_HeaderFile -#define _StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem_HeaderFile - -#include -#include - -#include - -class StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem; -DEFINE_STANDARD_HANDLE(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem, StepVisual_AnnotationCurveOccurrence) -//! Added for Dimensional Tolerances -//! Complex STEP entity AnnotationCurveOccurrence & AnnotationOccurrence & GeometricRepresentationItem & RepresentationItem & StyledItem -class StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem : public StepVisual_AnnotationCurveOccurrence -{ - -public: - - Standard_EXPORT StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem(); - - DEFINE_STANDARD_RTTIEXT(StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem, StepVisual_AnnotationCurveOccurrence) - -}; -#endif // _StepVisual_AnnotationCurveOccurrenceAndAnnotationOccurrenceAndGeomReprItemAndReprItemAndStyledItem_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.cxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.cxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,24 @@ +// Created on: 2017-02-06 +// Created by: Irina KRYLOVA +// Copyright (c) 2017 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem, StepVisual_AnnotationCurveOccurrence) + +//======================================================================= +//function : StepVisual_AnnotationCurveOccurrenceAndGeomReprItem +//purpose : +//======================================================================= +StepVisual_AnnotationCurveOccurrenceAndGeomReprItem::StepVisual_AnnotationCurveOccurrenceAndGeomReprItem() { } diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_AnnotationCurveOccurrenceAndGeomReprItem.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,38 @@ +// Created on: 2017-02-06 +// Created by: Irina KRYLOVA +// Copyright (c) 2017 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StepVisual_AnnotationCurveOccurrenceAndGeomReprItem_HeaderFile +#define _StepVisual_AnnotationCurveOccurrenceAndGeomReprItem_HeaderFile + +#include +#include + +#include + +class StepVisual_AnnotationCurveOccurrenceAndGeomReprItem; +DEFINE_STANDARD_HANDLE(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem, StepVisual_AnnotationCurveOccurrence) +//! Added for Dimensional Tolerances +//! Complex STEP entity AnnotationCurveOccurrence & AnnotationOccurrence & GeometricRepresentationItem & RepresentationItem & StyledItem +class StepVisual_AnnotationCurveOccurrenceAndGeomReprItem : public StepVisual_AnnotationCurveOccurrence +{ + +public: + + Standard_EXPORT StepVisual_AnnotationCurveOccurrenceAndGeomReprItem(); + + DEFINE_STANDARD_RTTIEXT(StepVisual_AnnotationCurveOccurrenceAndGeomReprItem, StepVisual_AnnotationCurveOccurrence) + +}; +#endif // _StepVisual_AnnotationCurveOccurrenceAndGeomReprItem_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_Array1OfRenderingPropertiesSelect.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_Array1OfRenderingPropertiesSelect.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_Array1OfRenderingPropertiesSelect.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_Array1OfRenderingPropertiesSelect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,26 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef StepVisual_Array1OfRenderingPropertiesSelect_HeaderFile +#define StepVisual_Array1OfRenderingPropertiesSelect_HeaderFile + +#include +#include + +typedef NCollection_Array1 StepVisual_Array1OfRenderingPropertiesSelect; + + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.cxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.cxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,24 @@ +// Created on: 2016-08-25 +// Created by: Irina KRYLOVA +// Copyright (c) 2016 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel, StepVisual_DraughtingModel) + +//======================================================================= +//function : StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel +//purpose : +//======================================================================= +StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel::StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel() { } diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,38 @@ +// Created on: 2016-08-25 +// Created by: Irina KRYLOVA +// Copyright (c) 2016 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StepVisual_StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel_HeaderFile +#define _StepVisual_StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel_HeaderFile + +#include +#include + +#include + +class StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel; +DEFINE_STANDARD_HANDLE(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel, StepVisual_DraughtingModel) +//! Added for Dimensional Tolerances +//! Complex STEP entity Characterized_Object & Characterized_Representation & Draughting_Model & Representation +class StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel : public StepVisual_DraughtingModel +{ + +public: + + Standard_EXPORT StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel(); + + DEFINE_STANDARD_RTTIEXT(StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel, StepVisual_DraughtingModel) + +}; +#endif // _StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.cxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.cxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.cxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Created on: 2016-08-25 -// Created by: Irina KRYLOVA -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include - -IMPLEMENT_STANDARD_RTTIEXT(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation, StepVisual_DraughtingModel) - -//======================================================================= -//function : StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation -//purpose : -//======================================================================= -StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation::StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation() { } diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -// Created on: 2016-08-25 -// Created by: Irina KRYLOVA -// Copyright (c) 2016 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef _StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation_HeaderFile -#define _StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation_HeaderFile - -#include -#include - -#include - -class StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation; -DEFINE_STANDARD_HANDLE(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation, StepVisual_DraughtingModel) -//! Added for Dimensional Tolerances -//! Complex STEP entity Characterized_Object & Characterized_Representation & Draughting_Model & Representation -class StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation : public StepVisual_DraughtingModel -{ - -public: - - Standard_EXPORT StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation(); - - DEFINE_STANDARD_RTTIEXT(StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation, StepVisual_DraughtingModel) - -}; -#endif // _StepVisual_CharacterizedObjectAndCharacterizedRepresentationAndDraughtingModelAndRepresentation_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_CoordinatesList.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_CoordinatesList.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_CoordinatesList.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_CoordinatesList.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,7 +36,7 @@ Standard_EXPORT Handle(TColgp_HArray1OfXYZ) Points() const; - DEFINE_STANDARD_RTTIEXT(StepVisual_CoordinatesList,StepVisual_TessellatedItem); + DEFINE_STANDARD_RTTIEXT(StepVisual_CoordinatesList,StepVisual_TessellatedItem) private: diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_HArray1OfRenderingPropertiesSelect.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_HArray1OfRenderingPropertiesSelect.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_HArray1OfRenderingPropertiesSelect.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_HArray1OfRenderingPropertiesSelect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,27 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef StepVisual_HArray1OfRenderingPropertiesSelect_HeaderFile +#define StepVisual_HArray1OfRenderingPropertiesSelect_HeaderFile + +#include +#include +#include + +DEFINE_HARRAY1(StepVisual_HArray1OfRenderingPropertiesSelect, StepVisual_Array1OfRenderingPropertiesSelect) + + +#endif diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_RenderingPropertiesSelect.cxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_RenderingPropertiesSelect.cxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_RenderingPropertiesSelect.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_RenderingPropertiesSelect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,61 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include +#include +#include + +//======================================================================= +//function : StepVisual_RenderingPropertiesSelect +//purpose : +//======================================================================= + +StepVisual_RenderingPropertiesSelect::StepVisual_RenderingPropertiesSelect () +{ +} + +//======================================================================= +//function : CaseNum +//purpose : +//======================================================================= + +Standard_Integer StepVisual_RenderingPropertiesSelect::CaseNum (const Handle(Standard_Transient)& ent) const +{ + if (ent.IsNull()) return 0; + if (ent->IsKind(STANDARD_TYPE(StepVisual_SurfaceStyleReflectanceAmbient))) return 1; + if (ent->IsKind(STANDARD_TYPE(StepVisual_SurfaceStyleTransparent))) return 2; + return 0; +} + +//======================================================================= +//function : SurfaceStyleReflectanceAmbient +//purpose : +//======================================================================= + +Handle(StepVisual_SurfaceStyleReflectanceAmbient) StepVisual_RenderingPropertiesSelect::SurfaceStyleReflectanceAmbient () const +{ + return Handle(StepVisual_SurfaceStyleReflectanceAmbient)::DownCast(Value()); +} + +//======================================================================= +//function : SurfaceStyleTransparent +//purpose : +//======================================================================= + +Handle(StepVisual_SurfaceStyleTransparent) StepVisual_RenderingPropertiesSelect::SurfaceStyleTransparent () const +{ + return Handle(StepVisual_SurfaceStyleTransparent)::DownCast(Value()); +} diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_RenderingPropertiesSelect.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_RenderingPropertiesSelect.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_RenderingPropertiesSelect.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_RenderingPropertiesSelect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,53 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StepVisual_RenderingPropertiesSelect_HeaderFile +#define _StepVisual_RenderingPropertiesSelect_HeaderFile + +#include +#include +#include +#include +#include + +class Standard_Transient; +class StepVisual_SurfaceStyleReflectanceAmbient; +class StepVisual_SurfaceStyleTransparent; + +//! Representation of STEP SELECT type RenderingPropertiesSelect +class StepVisual_RenderingPropertiesSelect : public StepData_SelectType +{ + +public: + + DEFINE_STANDARD_ALLOC + + //! Empty constructor + Standard_EXPORT StepVisual_RenderingPropertiesSelect(); + + //! Recognizes a kind of RenderingPropertiesSelect select type + //! -- 1 -> SurfaceStyleReflectanceAmbient + //! -- 2 -> SurfaceStyleTransparent + Standard_EXPORT Standard_Integer CaseNum (const Handle(Standard_Transient)& ent) const Standard_OVERRIDE; + + //! Returns Value as SurfaceStyleReflectanceAmbient (or Null if another type) + Standard_EXPORT Handle(StepVisual_SurfaceStyleReflectanceAmbient) SurfaceStyleReflectanceAmbient() const; + + //! Returns Value as SurfaceStyleTransparent (or Null if another type) + Standard_EXPORT Handle(StepVisual_SurfaceStyleTransparent) SurfaceStyleTransparent() const; + +}; +#endif // _StepVisual_RenderingPropertiesSelect_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_ShadingSurfaceMethod.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_ShadingSurfaceMethod.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_ShadingSurfaceMethod.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_ShadingSurfaceMethod.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,27 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StepVisual_ShadingSurfaceMethod_HeaderFile +#define _StepVisual_ShadingSurfaceMethod_HeaderFile + +enum StepVisual_ShadingSurfaceMethod +{ + StepVisual_ssmConstantShading, + StepVisual_ssmColourShading, + StepVisual_ssmDotShading, + StepVisual_ssmNormalShading +}; +#endif // _StepVisual_ShadingSurfaceMethod_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleElementSelect.cxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleElementSelect.cxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleElementSelect.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleElementSelect.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,6 +21,7 @@ #include #include #include +#include StepVisual_SurfaceStyleElementSelect::StepVisual_SurfaceStyleElementSelect () { } @@ -33,6 +34,7 @@ // if (ent->IsKind(STANDARD_TYPE(StepVisual_SurfaceStyleSilhouette))) return 4; // if (ent->IsKind(STANDARD_TYPE(StepVisual_SurfaceStyleSegmentationCurve))) return 5; // if (ent->IsKind(STANDARD_TYPE(StepVisual_SurfaceStyleControlGrid))) return 6; + if (ent->IsKind(STANDARD_TYPE(StepVisual_SurfaceStyleRendering))) return 7; return 0; } @@ -50,3 +52,8 @@ { return GetCasted(StepVisual_SurfaceStyleParameterLine,Value()); } + +Handle(StepVisual_SurfaceStyleRendering) StepVisual_SurfaceStyleElementSelect::SurfaceStyleRendering () const +{ + return GetCasted(StepVisual_SurfaceStyleRendering,Value()); +} diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleElementSelect.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleElementSelect.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleElementSelect.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleElementSelect.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,7 +27,7 @@ class StepVisual_SurfaceStyleFillArea; class StepVisual_SurfaceStyleBoundary; class StepVisual_SurfaceStyleParameterLine; - +class StepVisual_SurfaceStyleRendering; class StepVisual_SurfaceStyleElementSelect : public StepData_SelectType @@ -47,6 +47,7 @@ //! 4 -> SurfaceStyleSilhouette //! 5 -> SurfaceStyleSegmentationCurve //! 6 -> SurfaceStyleControlGrid + //! 7 -> SurfaceStyleRendering //! 0 else Standard_EXPORT Standard_Integer CaseNum (const Handle(Standard_Transient)& ent) const; @@ -59,6 +60,8 @@ //! returns Value as a SurfaceStyleParameterLine (Null if another type) Standard_EXPORT Handle(StepVisual_SurfaceStyleParameterLine) SurfaceStyleParameterLine() const; + //! returns Value as a SurfaceStyleRendering (Null if another type) + Standard_EXPORT Handle(StepVisual_SurfaceStyleRendering) SurfaceStyleRendering() const; diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleReflectanceAmbient.cxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleReflectanceAmbient.cxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleReflectanceAmbient.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleReflectanceAmbient.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,59 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(StepVisual_SurfaceStyleReflectanceAmbient, Standard_Transient) + +//======================================================================= +//function : StepVisual_SurfaceStyleReflectanceAmbient +//purpose : +//======================================================================= + +StepVisual_SurfaceStyleReflectanceAmbient::StepVisual_SurfaceStyleReflectanceAmbient () +{ +} + +//======================================================================= +//function : Init +//purpose : +//======================================================================= + +void StepVisual_SurfaceStyleReflectanceAmbient::Init (const Standard_Real theAmbientReflectance) +{ + + myAmbientReflectance = theAmbientReflectance; +} + +//======================================================================= +//function : AmbientReflectance +//purpose : +//======================================================================= + +Standard_Real StepVisual_SurfaceStyleReflectanceAmbient::AmbientReflectance () const +{ + return myAmbientReflectance; +} + +//======================================================================= +//function : SetAmbientReflectance +//purpose : +//======================================================================= + +void StepVisual_SurfaceStyleReflectanceAmbient::SetAmbientReflectance (const Standard_Real theAmbientReflectance) +{ + myAmbientReflectance = theAmbientReflectance; +} diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleReflectanceAmbient.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleReflectanceAmbient.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleReflectanceAmbient.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleReflectanceAmbient.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,49 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StepVisual_SurfaceStyleReflectanceAmbient_HeaderFile_ +#define _StepVisual_SurfaceStyleReflectanceAmbient_HeaderFile_ + +#include +#include +#include + +class StepVisual_SurfaceStyleReflectanceAmbient; +DEFINE_STANDARD_HANDLE(StepVisual_SurfaceStyleReflectanceAmbient, Standard_Transient) + +//! Representation of STEP entity SurfaceStyleReflectanceAmbient +class StepVisual_SurfaceStyleReflectanceAmbient : public Standard_Transient +{ +public : + + //! default constructor + Standard_EXPORT StepVisual_SurfaceStyleReflectanceAmbient(); + + //! Initialize all fields (own and inherited) + Standard_EXPORT void Init(const Standard_Real theAmbientReflectance); + + //! Returns field AmbientReflectance + Standard_EXPORT Standard_Real AmbientReflectance() const; + //! Sets field AmbientReflectance + Standard_EXPORT void SetAmbientReflectance (const Standard_Real theAmbientReflectance); + +DEFINE_STANDARD_RTTIEXT(StepVisual_SurfaceStyleReflectanceAmbient, Standard_Transient) + +private: + Standard_Real myAmbientReflectance; + +}; +#endif // _StepVisual_SurfaceStyleReflectanceAmbient_HeaderFile_ diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRendering.cxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRendering.cxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRendering.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRendering.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,82 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(StepVisual_SurfaceStyleRendering, Standard_Transient) + +//======================================================================= +//function : StepVisual_SurfaceStyleRendering +//purpose : +//======================================================================= + +StepVisual_SurfaceStyleRendering::StepVisual_SurfaceStyleRendering () +{ +} + +//======================================================================= +//function : Init +//purpose : +//======================================================================= + +void StepVisual_SurfaceStyleRendering::Init (const StepVisual_ShadingSurfaceMethod theRenderingMethod, + const Handle(StepVisual_Colour)& theSurfaceColour) +{ + + myRenderingMethod = theRenderingMethod; + + mySurfaceColour = theSurfaceColour; +} + +//======================================================================= +//function : RenderingMethod +//purpose : +//======================================================================= + +StepVisual_ShadingSurfaceMethod StepVisual_SurfaceStyleRendering::RenderingMethod () const +{ + return myRenderingMethod; +} + +//======================================================================= +//function : SetRenderingMethod +//purpose : +//======================================================================= + +void StepVisual_SurfaceStyleRendering::SetRenderingMethod (const StepVisual_ShadingSurfaceMethod theRenderingMethod) +{ + myRenderingMethod = theRenderingMethod; +} + +//======================================================================= +//function : SurfaceColour +//purpose : +//======================================================================= + +Handle(StepVisual_Colour) StepVisual_SurfaceStyleRendering::SurfaceColour () const +{ + return mySurfaceColour; +} + +//======================================================================= +//function : SetSurfaceColour +//purpose : +//======================================================================= + +void StepVisual_SurfaceStyleRendering::SetSurfaceColour (const Handle(StepVisual_Colour)& theSurfaceColour) +{ + mySurfaceColour = theSurfaceColour; +} diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRendering.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRendering.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRendering.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRendering.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,59 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StepVisual_SurfaceStyleRendering_HeaderFile_ +#define _StepVisual_SurfaceStyleRendering_HeaderFile_ + +#include +#include +#include + +#include +#include + +class StepVisual_SurfaceStyleRendering; +DEFINE_STANDARD_HANDLE(StepVisual_SurfaceStyleRendering, Standard_Transient) + +//! Representation of STEP entity SurfaceStyleRendering +class StepVisual_SurfaceStyleRendering : public Standard_Transient +{ +public : + + //! default constructor + Standard_EXPORT StepVisual_SurfaceStyleRendering(); + + //! Initialize all fields (own and inherited) + Standard_EXPORT void Init(const StepVisual_ShadingSurfaceMethod theRenderingMethod, + const Handle(StepVisual_Colour)& theSurfaceColour); + + //! Returns field RenderingMethod + Standard_EXPORT StepVisual_ShadingSurfaceMethod RenderingMethod() const; + //! Sets field RenderingMethod + Standard_EXPORT void SetRenderingMethod (const StepVisual_ShadingSurfaceMethod theRenderingMethod); + + //! Returns field SurfaceColour + Standard_EXPORT Handle(StepVisual_Colour) SurfaceColour() const; + //! Sets field SurfaceColour + Standard_EXPORT void SetSurfaceColour (const Handle(StepVisual_Colour)& theSurfaceColour); + +DEFINE_STANDARD_RTTIEXT(StepVisual_SurfaceStyleRendering, Standard_Transient) + +private: + StepVisual_ShadingSurfaceMethod myRenderingMethod; + Handle(StepVisual_Colour) mySurfaceColour; + +}; +#endif // _StepVisual_SurfaceStyleRendering_HeaderFile_ diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRenderingWithProperties.cxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRenderingWithProperties.cxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRenderingWithProperties.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRenderingWithProperties.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,63 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(StepVisual_SurfaceStyleRenderingWithProperties, StepVisual_SurfaceStyleRendering) + +//======================================================================= +//function : StepVisual_SurfaceStyleRenderingWithProperties +//purpose : +//======================================================================= + +StepVisual_SurfaceStyleRenderingWithProperties::StepVisual_SurfaceStyleRenderingWithProperties () +{ +} + +//======================================================================= +//function : Init +//purpose : +//======================================================================= + +void StepVisual_SurfaceStyleRenderingWithProperties::Init (const StepVisual_ShadingSurfaceMethod theSurfaceStyleRendering_RenderingMethod, + const Handle(StepVisual_Colour)& theSurfaceStyleRendering_SurfaceColour, + const Handle(StepVisual_HArray1OfRenderingPropertiesSelect)& theProperties) +{ + StepVisual_SurfaceStyleRendering::Init(theSurfaceStyleRendering_RenderingMethod, + theSurfaceStyleRendering_SurfaceColour); + + myProperties = theProperties; +} + +//======================================================================= +//function : Properties +//purpose : +//======================================================================= + +Handle(StepVisual_HArray1OfRenderingPropertiesSelect) StepVisual_SurfaceStyleRenderingWithProperties::Properties () const +{ + return myProperties; +} + +//======================================================================= +//function : SetProperties +//purpose : +//======================================================================= + +void StepVisual_SurfaceStyleRenderingWithProperties::SetProperties (const Handle(StepVisual_HArray1OfRenderingPropertiesSelect)& theProperties) +{ + myProperties = theProperties; +} diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRenderingWithProperties.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRenderingWithProperties.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRenderingWithProperties.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleRenderingWithProperties.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,55 @@ +// Created on : Thu May 14 15:13:19 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StepVisual_SurfaceStyleRenderingWithProperties_HeaderFile_ +#define _StepVisual_SurfaceStyleRenderingWithProperties_HeaderFile_ + +#include +#include +#include + +#include +#include +#include + +class StepVisual_SurfaceStyleRenderingWithProperties; +DEFINE_STANDARD_HANDLE(StepVisual_SurfaceStyleRenderingWithProperties, StepVisual_SurfaceStyleRendering) + +//! Representation of STEP entity SurfaceStyleRenderingWithProperties +class StepVisual_SurfaceStyleRenderingWithProperties : public StepVisual_SurfaceStyleRendering +{ +public : + + //! default constructor + Standard_EXPORT StepVisual_SurfaceStyleRenderingWithProperties(); + + //! Initialize all fields (own and inherited) + Standard_EXPORT void Init(const StepVisual_ShadingSurfaceMethod theSurfaceStyleRendering_RenderingMethod, + const Handle(StepVisual_Colour)& theSurfaceStyleRendering_SurfaceColour, + const Handle(StepVisual_HArray1OfRenderingPropertiesSelect)& theProperties); + + //! Returns field Properties + Standard_EXPORT Handle(StepVisual_HArray1OfRenderingPropertiesSelect) Properties() const; + //! Sets field Properties + Standard_EXPORT void SetProperties (const Handle(StepVisual_HArray1OfRenderingPropertiesSelect)& theProperties); + +DEFINE_STANDARD_RTTIEXT(StepVisual_SurfaceStyleRenderingWithProperties, StepVisual_SurfaceStyleRendering) + +private: + Handle(StepVisual_HArray1OfRenderingPropertiesSelect) myProperties; + +}; +#endif // _StepVisual_SurfaceStyleRenderingWithProperties_HeaderFile_ diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleTransparent.cxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleTransparent.cxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleTransparent.cxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleTransparent.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,59 @@ +// Created on : Tue May 12 14:11:46 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +IMPLEMENT_STANDARD_RTTIEXT(StepVisual_SurfaceStyleTransparent, Standard_Transient) + +//======================================================================= +//function : StepVisual_SurfaceStyleTransparent +//purpose : +//======================================================================= + +StepVisual_SurfaceStyleTransparent::StepVisual_SurfaceStyleTransparent () +{ +} + +//======================================================================= +//function : Init +//purpose : +//======================================================================= + +void StepVisual_SurfaceStyleTransparent::Init (const Standard_Real theTransparency) +{ + + myTransparency = theTransparency; +} + +//======================================================================= +//function : Transparency +//purpose : +//======================================================================= + +Standard_Real StepVisual_SurfaceStyleTransparent::Transparency () const +{ + return myTransparency; +} + +//======================================================================= +//function : SetTransparency +//purpose : +//======================================================================= + +void StepVisual_SurfaceStyleTransparent::SetTransparency (const Standard_Real theTransparency) +{ + myTransparency = theTransparency; +} diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleTransparent.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleTransparent.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleTransparent.hxx 1970-01-01 00:00:00.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_SurfaceStyleTransparent.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -0,0 +1,49 @@ +// Created on : Tue May 12 14:11:46 2020 +// Created by: Igor KHOZHANOV +// Generator: Express (EXPRESS -> CASCADE/XSTEP Translator) V2.0 +// Copyright (c) Open CASCADE 2020 +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _StepVisual_SurfaceStyleTransparent_HeaderFile_ +#define _StepVisual_SurfaceStyleTransparent_HeaderFile_ + +#include +#include +#include + +class StepVisual_SurfaceStyleTransparent; +DEFINE_STANDARD_HANDLE(StepVisual_SurfaceStyleTransparent, Standard_Transient) + +//! Representation of STEP entity SurfaceStyleTransparent +class StepVisual_SurfaceStyleTransparent : public Standard_Transient +{ +public : + + //! default constructor + Standard_EXPORT StepVisual_SurfaceStyleTransparent(); + + //! Initialize all fields (own and inherited) + Standard_EXPORT void Init(const Standard_Real theTransparency); + + //! Returns field Transparency + Standard_EXPORT Standard_Real Transparency() const; + //! Sets field Transparency + Standard_EXPORT void SetTransparency (const Standard_Real theTransparency); + +DEFINE_STANDARD_RTTIEXT(StepVisual_SurfaceStyleTransparent, Standard_Transient) + +private: + Standard_Real myTransparency; + +}; +#endif // _StepVisual_SurfaceStyleTransparent_HeaderFile_ diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_TessellatedCurveSet.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_TessellatedCurveSet.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_TessellatedCurveSet.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_TessellatedCurveSet.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -30,7 +30,7 @@ typedef NCollection_Vector StepVisual_VectorOfHSequenceOfInteger; -DEFINE_STANDARD_HANDLE(StepVisual_TessellatedCurveSet, StepVisual_TessellatedItem); +DEFINE_STANDARD_HANDLE(StepVisual_TessellatedCurveSet, StepVisual_TessellatedItem) class StepVisual_TessellatedCurveSet : public StepVisual_TessellatedItem @@ -55,6 +55,6 @@ NCollection_Handle myCurves; public : - DEFINE_STANDARD_RTTIEXT(StepVisual_TessellatedCurveSet,StepVisual_TessellatedItem); + DEFINE_STANDARD_RTTIEXT(StepVisual_TessellatedCurveSet,StepVisual_TessellatedItem) }; #endif // StepVisual_TessellatedCurveSet diff -Nru opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_TessellatedItem.hxx opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_TessellatedItem.hxx --- opencascade-7.4.1+dfsg1/src/StepVisual/StepVisual_TessellatedItem.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StepVisual/StepVisual_TessellatedItem.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -32,6 +32,6 @@ //! Returns a DraughtingCalloutElement select type Standard_EXPORT StepVisual_TessellatedItem(); - DEFINE_STANDARD_RTTIEXT(StepVisual_TessellatedItem,StepGeom_GeometricRepresentationItem); + DEFINE_STANDARD_RTTIEXT(StepVisual_TessellatedItem,StepGeom_GeometricRepresentationItem) }; #endif // StepVisual_TessellatedItem diff -Nru opencascade-7.4.1+dfsg1/src/StlAPI/StlAPI_Writer.cxx opencascade-7.5.1+dfsg1/src/StlAPI/StlAPI_Writer.cxx --- opencascade-7.4.1+dfsg1/src/StlAPI/StlAPI_Writer.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StlAPI/StlAPI_Writer.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -41,7 +41,8 @@ //purpose : //============================================================================= Standard_Boolean StlAPI_Writer::Write (const TopoDS_Shape& theShape, - const Standard_CString theFileName) + const Standard_CString theFileName, + const Message_ProgressRange& theProgress) { Standard_Integer aNbNodes = 0; Standard_Integer aNbTriangles = 0; @@ -125,8 +126,8 @@ OSD_Path aPath (theFileName); Standard_Boolean isDone = (myASCIIMode - ? RWStl::WriteAscii (aMesh, aPath) - : RWStl::WriteBinary (aMesh, aPath)); + ? RWStl::WriteAscii(aMesh, aPath, theProgress) + : RWStl::WriteBinary(aMesh, aPath, theProgress)); if (isDone && (aNbFacesNoTri > 0)) { @@ -136,7 +137,7 @@ TCollection_AsciiString (aNbFacesNoTri) + TCollection_AsciiString ((aNbFacesNoTri == 1) ? " face has" : " faces have") + TCollection_AsciiString (" been skipped due to null triangulation"); - Message::DefaultMessenger()->Send (aWarningMsg, Message_Warning); + Message::SendWarning (aWarningMsg); } return isDone; diff -Nru opencascade-7.4.1+dfsg1/src/StlAPI/StlAPI_Writer.hxx opencascade-7.5.1+dfsg1/src/StlAPI/StlAPI_Writer.hxx --- opencascade-7.4.1+dfsg1/src/StlAPI/StlAPI_Writer.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/StlAPI/StlAPI_Writer.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -16,12 +16,8 @@ #ifndef _StlAPI_Writer_HeaderFile #define _StlAPI_Writer_HeaderFile -#include -#include -#include -#include -#include -#include +#include +#include class TopoDS_Shape; @@ -45,7 +41,8 @@ //! Converts a given shape to STL format and writes it to file with a given filename. //! \return the error state. Standard_EXPORT Standard_Boolean Write (const TopoDS_Shape& theShape, - const Standard_CString theFileName); + const Standard_CString theFileName, + const Message_ProgressRange& theProgress = Message_ProgressRange()); private: Standard_Boolean myASCIIMode; diff -Nru opencascade-7.4.1+dfsg1/src/Storage/FILES opencascade-7.5.1+dfsg1/src/Storage/FILES --- opencascade-7.4.1+dfsg1/src/Storage/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -4,7 +4,6 @@ Storage_ArrayOfSchema.hxx Storage_BaseDriver.cxx Storage_BaseDriver.hxx -Storage_BaseDriver.lxx Storage_BucketOfPersistent.hxx Storage_CallBack.cxx Storage_CallBack.hxx @@ -36,7 +35,6 @@ Storage_RootData.hxx Storage_Schema.cxx Storage_Schema.hxx -Storage_Schema.lxx Storage_SeqOfRoot.hxx Storage_SolveMode.hxx Storage_StreamExtCharParityError.hxx diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_BaseDriver.cxx opencascade-7.5.1+dfsg1/src/Storage/Storage_BaseDriver.cxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_BaseDriver.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_BaseDriver.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -21,6 +21,8 @@ #include #include +IMPLEMENT_STANDARD_RTTIEXT(Storage_BaseDriver, Standard_Transient) + Storage_BaseDriver::Storage_BaseDriver() : myOpenMode(Storage_VSNone) { } diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_BaseDriver.hxx opencascade-7.5.1+dfsg1/src/Storage/Storage_BaseDriver.hxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_BaseDriver.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_BaseDriver.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,23 +17,16 @@ #ifndef _Storage_BaseDriver_HeaderFile #define _Storage_BaseDriver_HeaderFile -#include -#include -#include +#include #include -#include #include -#include #include #include -#include +#include #include #include -#include -#include -#include -#include + class Storage_StreamTypeMismatchError; class Storage_StreamFormatError; class Storage_StreamWriteError; @@ -41,27 +34,32 @@ class TCollection_AsciiString; class TCollection_ExtendedString; +DEFINE_STANDARD_HANDLE(Storage_BaseDriver,Standard_Transient) //! Root class for drivers. A driver assigns a physical container //! to data to be stored or retrieved, for instance a file. //! The FSD package provides two derived concrete classes : //! - FSD_File is a general driver which defines a //! file as the container of data. -class Storage_BaseDriver +class Storage_BaseDriver : public Standard_Transient { public: + DEFINE_STANDARD_RTTIEXT(Storage_BaseDriver,Standard_Transient) - DEFINE_STANDARD_ALLOC +public: Standard_EXPORT virtual ~Storage_BaseDriver(); - Standard_EXPORT virtual Storage_Error Open (const TCollection_AsciiString& aName, const Storage_OpenMode aMode) = 0; + TCollection_AsciiString Name() const { return myName; } - TCollection_AsciiString Name() const; + Storage_OpenMode OpenMode() const { return myOpenMode; } + + Standard_EXPORT static TCollection_AsciiString ReadMagicNumber(Standard_IStream& theIStream); - Storage_OpenMode OpenMode() const; +public: + //!@name Virtual methods, to be provided by descendants - Standard_EXPORT static TCollection_AsciiString ReadMagicNumber (Standard_IStream& theIStream); + Standard_EXPORT virtual Storage_Error Open (const TCollection_AsciiString& aName, const Storage_OpenMode aMode) = 0; //! returns True if we are at end of the stream Standard_EXPORT virtual Standard_Boolean IsEnd() = 0; @@ -173,114 +171,102 @@ Standard_EXPORT virtual void SkipObject() = 0; + Standard_EXPORT virtual Storage_Error Close() = 0; + +public: + //!@name Ouput methods + Standard_EXPORT virtual Storage_BaseDriver& PutReference (const Standard_Integer aValue) = 0; Standard_EXPORT virtual Storage_BaseDriver& PutCharacter (const Standard_Character aValue) = 0; -Storage_BaseDriver& operator << (const Standard_Character aValue) -{ - return PutCharacter(aValue); -} - - Standard_EXPORT virtual Storage_BaseDriver& PutExtCharacter (const Standard_ExtCharacter aValue) = 0; -Storage_BaseDriver& operator << (const Standard_ExtCharacter aValue) -{ - return PutExtCharacter(aValue); -} - - Standard_EXPORT virtual Storage_BaseDriver& PutInteger (const Standard_Integer aValue) = 0; -Storage_BaseDriver& operator << (const Standard_Integer aValue) -{ - return PutInteger(aValue); -} - - Standard_EXPORT virtual Storage_BaseDriver& PutBoolean (const Standard_Boolean aValue) = 0; -Storage_BaseDriver& operator << (const Standard_Boolean aValue) -{ - return PutBoolean(aValue); -} - - Standard_EXPORT virtual Storage_BaseDriver& PutReal (const Standard_Real aValue) = 0; -Storage_BaseDriver& operator << (const Standard_Real aValue) -{ - return PutReal(aValue); -} - - Standard_EXPORT virtual Storage_BaseDriver& PutShortReal (const Standard_ShortReal aValue) = 0; -Storage_BaseDriver& operator << (const Standard_ShortReal aValue) -{ - return PutShortReal(aValue); -} - + Storage_BaseDriver& operator << (const Standard_Character aValue) + { + return PutCharacter(aValue); + } + + Standard_EXPORT virtual Storage_BaseDriver& PutExtCharacter(const Standard_ExtCharacter aValue) = 0; + Storage_BaseDriver& operator << (const Standard_ExtCharacter aValue) + { + return PutExtCharacter(aValue); + } + + Standard_EXPORT virtual Storage_BaseDriver& PutInteger(const Standard_Integer aValue) = 0; + Storage_BaseDriver& operator << (const Standard_Integer aValue) + { + return PutInteger(aValue); + } + + Standard_EXPORT virtual Storage_BaseDriver& PutBoolean(const Standard_Boolean aValue) = 0; + Storage_BaseDriver& operator << (const Standard_Boolean aValue) + { + return PutBoolean(aValue); + } + + Standard_EXPORT virtual Storage_BaseDriver& PutReal(const Standard_Real aValue) = 0; + Storage_BaseDriver& operator << (const Standard_Real aValue) + { + return PutReal(aValue); + } + + Standard_EXPORT virtual Storage_BaseDriver& PutShortReal(const Standard_ShortReal aValue) = 0; + Storage_BaseDriver& operator << (const Standard_ShortReal aValue) + { + return PutShortReal(aValue); + } + +public: + //!@name Input methods + Standard_EXPORT virtual Storage_BaseDriver& GetReference (Standard_Integer& aValue) = 0; Standard_EXPORT virtual Storage_BaseDriver& GetCharacter (Standard_Character& aValue) = 0; -Storage_BaseDriver& operator >> (Standard_Character& aValue) -{ - return GetCharacter(aValue); -} - - Standard_EXPORT virtual Storage_BaseDriver& GetExtCharacter (Standard_ExtCharacter& aValue) = 0; -Storage_BaseDriver& operator >> (Standard_ExtCharacter& aValue) -{ - return GetExtCharacter(aValue); -} - - Standard_EXPORT virtual Storage_BaseDriver& GetInteger (Standard_Integer& aValue) = 0; -Storage_BaseDriver& operator >> (Standard_Integer& aValue) -{ - return GetInteger(aValue); -} - - Standard_EXPORT virtual Storage_BaseDriver& GetBoolean (Standard_Boolean& aValue) = 0; -Storage_BaseDriver& operator >> (Standard_Boolean& aValue) -{ - return GetBoolean(aValue); -} - - Standard_EXPORT virtual Storage_BaseDriver& GetReal (Standard_Real& aValue) = 0; -Storage_BaseDriver& operator >> (Standard_Real& aValue) -{ - return GetReal(aValue); -} - - Standard_EXPORT virtual Storage_BaseDriver& GetShortReal (Standard_ShortReal& aValue) = 0; -Storage_BaseDriver& operator >> (Standard_ShortReal& aValue) -{ - return GetShortReal(aValue); -} - - Standard_EXPORT virtual Storage_Error Close() = 0; - - - + Storage_BaseDriver& operator >> (Standard_Character& aValue) + { + return GetCharacter(aValue); + } + + Standard_EXPORT virtual Storage_BaseDriver& GetExtCharacter(Standard_ExtCharacter& aValue) = 0; + Storage_BaseDriver& operator >> (Standard_ExtCharacter& aValue) + { + return GetExtCharacter(aValue); + } + + Standard_EXPORT virtual Storage_BaseDriver& GetInteger(Standard_Integer& aValue) = 0; + Storage_BaseDriver& operator >> (Standard_Integer& aValue) + { + return GetInteger(aValue); + } + + Standard_EXPORT virtual Storage_BaseDriver& GetBoolean(Standard_Boolean& aValue) = 0; + Storage_BaseDriver& operator >> (Standard_Boolean& aValue) + { + return GetBoolean(aValue); + } + + Standard_EXPORT virtual Storage_BaseDriver& GetReal(Standard_Real& aValue) = 0; + Storage_BaseDriver& operator >> (Standard_Real& aValue) + { + return GetReal(aValue); + } + + Standard_EXPORT virtual Storage_BaseDriver& GetShortReal(Standard_ShortReal& aValue) = 0; + Storage_BaseDriver& operator >> (Standard_ShortReal& aValue) + { + return GetShortReal(aValue); + } protected: - Standard_EXPORT Storage_BaseDriver(); - void SetName (const TCollection_AsciiString& aName); - - void SetOpenMode (const Storage_OpenMode aMode); - - + void SetName(const TCollection_AsciiString& aName) { myName = aName; } + void SetOpenMode(const Storage_OpenMode aMode) { myOpenMode = aMode; } private: - - Storage_OpenMode myOpenMode; TCollection_AsciiString myName; - - }; - -#include - - - - - #endif // _Storage_BaseDriver_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_BaseDriver.lxx opencascade-7.5.1+dfsg1/src/Storage/Storage_BaseDriver.lxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_BaseDriver.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_BaseDriver.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -inline TCollection_AsciiString Storage_BaseDriver::Name() const -{ - return myName; -} - -inline Storage_OpenMode Storage_BaseDriver::OpenMode() const -{ - return myOpenMode; -} - -inline void Storage_BaseDriver::SetName(const TCollection_AsciiString& aName) -{ - myName = aName; -} - -inline void Storage_BaseDriver::SetOpenMode(const Storage_OpenMode aMode) -{ - myOpenMode = aMode; -} - diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_CallBack.hxx opencascade-7.5.1+dfsg1/src/Storage/Storage_CallBack.hxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_CallBack.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_CallBack.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,42 +29,24 @@ class Storage_CallBack; DEFINE_STANDARD_HANDLE(Storage_CallBack, Standard_Transient) - class Storage_CallBack : public Standard_Transient { - public: - Standard_EXPORT virtual Handle(Standard_Persistent) New() const = 0; Standard_EXPORT virtual void Add (const Handle(Standard_Persistent)& aPers, const Handle(Storage_Schema)& aSchema) const = 0; - Standard_EXPORT virtual void Write (const Handle(Standard_Persistent)& aPers, Storage_BaseDriver& aDriver, const Handle(Storage_Schema)& aSchema) const = 0; + Standard_EXPORT virtual void Write (const Handle(Standard_Persistent)& aPers, + const Handle(Storage_BaseDriver)& aDriver, + const Handle(Storage_Schema)& aSchema) const = 0; - Standard_EXPORT virtual void Read (const Handle(Standard_Persistent)& aPers, Storage_BaseDriver& aDriver, const Handle(Storage_Schema)& aSchema) const = 0; - - - + Standard_EXPORT virtual void Read (const Handle(Standard_Persistent)& aPers, + const Handle(Storage_BaseDriver)& aDriver, + const Handle(Storage_Schema)& aSchema) const = 0; DEFINE_STANDARD_RTTIEXT(Storage_CallBack,Standard_Transient) -protected: - - - - -private: - - - - }; - - - - - - #endif // _Storage_CallBack_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_DefaultCallBack.cxx opencascade-7.5.1+dfsg1/src/Storage/Storage_DefaultCallBack.cxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_DefaultCallBack.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_DefaultCallBack.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,11 +36,15 @@ { } -void Storage_DefaultCallBack::Write(const Handle(Standard_Persistent)&,Storage_BaseDriver&,const Handle(Storage_Schema)&) const +void Storage_DefaultCallBack::Write(const Handle(Standard_Persistent)&, + const Handle(Storage_BaseDriver)&, + const Handle(Storage_Schema)&) const { } -void Storage_DefaultCallBack::Read(const Handle(Standard_Persistent)&,Storage_BaseDriver& f,const Handle(Storage_Schema)&) const +void Storage_DefaultCallBack::Read(const Handle(Standard_Persistent)&, + const Handle(Storage_BaseDriver)& theDriver, + const Handle(Storage_Schema)&) const { - f.SkipObject(); + theDriver->SkipObject(); } diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_DefaultCallBack.hxx opencascade-7.5.1+dfsg1/src/Storage/Storage_DefaultCallBack.hxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_DefaultCallBack.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_DefaultCallBack.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -24,49 +24,30 @@ class Standard_Persistent; class Storage_Schema; class Storage_BaseDriver; - - class Storage_DefaultCallBack; -DEFINE_STANDARD_HANDLE(Storage_DefaultCallBack, Storage_CallBack) +DEFINE_STANDARD_HANDLE(Storage_DefaultCallBack, Storage_CallBack) class Storage_DefaultCallBack : public Storage_CallBack { - public: - - + Standard_EXPORT Storage_DefaultCallBack(); Standard_EXPORT Handle(Standard_Persistent) New() const Standard_OVERRIDE; - Standard_EXPORT void Add (const Handle(Standard_Persistent)& aPers, const Handle(Storage_Schema)& aSchema) const Standard_OVERRIDE; + Standard_EXPORT void Add (const Handle(Standard_Persistent)& thePers, + const Handle(Storage_Schema)& theSchema) const Standard_OVERRIDE; - Standard_EXPORT void Write (const Handle(Standard_Persistent)& aPers, Storage_BaseDriver& aDriver, const Handle(Storage_Schema)& aSchema) const Standard_OVERRIDE; + Standard_EXPORT void Write (const Handle(Standard_Persistent)& thePers, + const Handle(Storage_BaseDriver)& theDriver, + const Handle(Storage_Schema)& theSchema) const Standard_OVERRIDE; - Standard_EXPORT void Read (const Handle(Standard_Persistent)& aPers, Storage_BaseDriver& aDriver, const Handle(Storage_Schema)& aSchema) const Standard_OVERRIDE; - - - + Standard_EXPORT void Read (const Handle(Standard_Persistent)& thePers, + const Handle(Storage_BaseDriver)& theDriver, + const Handle(Storage_Schema)& theSchema) const Standard_OVERRIDE; DEFINE_STANDARD_RTTIEXT(Storage_DefaultCallBack,Storage_CallBack) - -protected: - - - - -private: - - - - }; - - - - - - #endif // _Storage_DefaultCallBack_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_HeaderData.cxx opencascade-7.5.1+dfsg1/src/Storage/Storage_HeaderData.cxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_HeaderData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_HeaderData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -27,11 +27,11 @@ { } -Standard_Boolean Storage_HeaderData::Read (Storage_BaseDriver& theDriver) +Standard_Boolean Storage_HeaderData::Read (const Handle(Storage_BaseDriver)& theDriver) { // Check driver open mode - if (theDriver.OpenMode() != Storage_VSRead - && theDriver.OpenMode() != Storage_VSReadWrite) + if (theDriver->OpenMode() != Storage_VSRead + && theDriver->OpenMode() != Storage_VSReadWrite) { myErrorStatus = Storage_VSModeError; myErrorStatusExt = "OpenMode"; @@ -39,7 +39,7 @@ } // Read info section - myErrorStatus = theDriver.BeginReadInfoSection(); + myErrorStatus = theDriver->BeginReadInfoSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginReadInfoSection"; @@ -50,15 +50,8 @@ try { OCC_CATCH_SIGNALS - theDriver.ReadInfo (myNBObj, - myStorageVersion, - myDate, - mySchemaName, - mySchemaVersion, - myApplicationName, - myApplicationVersion, - myDataType, - myUserInfo); + theDriver->ReadInfo (myNBObj, myStorageVersion, myDate, mySchemaName, mySchemaVersion, + myApplicationName, myApplicationVersion, myDataType, myUserInfo); } catch (Storage_StreamTypeMismatchError const&) { @@ -74,7 +67,7 @@ } } - myErrorStatus = theDriver.EndReadInfoSection(); + myErrorStatus = theDriver->EndReadInfoSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndReadInfoSection"; @@ -82,7 +75,7 @@ } // Read comment section - myErrorStatus = theDriver.BeginReadCommentSection(); + myErrorStatus = theDriver->BeginReadCommentSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginReadCommentSection"; @@ -93,7 +86,7 @@ try { OCC_CATCH_SIGNALS - theDriver.ReadComment (myComments); + theDriver->ReadComment (myComments); } catch (Storage_StreamTypeMismatchError const&) { @@ -109,7 +102,7 @@ } } - myErrorStatus = theDriver.EndReadCommentSection(); + myErrorStatus = theDriver->EndReadCommentSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndReadCommentSection"; diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_HeaderData.hxx opencascade-7.5.1+dfsg1/src/Storage/Storage_HeaderData.hxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_HeaderData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_HeaderData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,7 +45,7 @@ Standard_EXPORT Storage_HeaderData(); - Standard_EXPORT Standard_Boolean Read (Storage_BaseDriver& theDriver); + Standard_EXPORT Standard_Boolean Read (const Handle(Storage_BaseDriver)& theDriver); //! return the creation date Standard_EXPORT TCollection_AsciiString CreationDate() const; diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_RootData.cxx opencascade-7.5.1+dfsg1/src/Storage/Storage_RootData.cxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_RootData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_RootData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -29,11 +29,11 @@ { } -Standard_Boolean Storage_RootData::Read (Storage_BaseDriver& theDriver) +Standard_Boolean Storage_RootData::Read (const Handle(Storage_BaseDriver)& theDriver) { // Check driver open mode - if (theDriver.OpenMode() != Storage_VSRead - && theDriver.OpenMode() != Storage_VSReadWrite) + if (theDriver->OpenMode() != Storage_VSRead + && theDriver->OpenMode() != Storage_VSReadWrite) { myErrorStatus = Storage_VSModeError; myErrorStatusExt = "OpenMode"; @@ -41,7 +41,7 @@ } // Read root section - myErrorStatus = theDriver.BeginReadRootSection(); + myErrorStatus = theDriver->BeginReadRootSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginReadRootSection"; @@ -51,13 +51,13 @@ TCollection_AsciiString aRootName, aTypeName; Standard_Integer aRef; - Standard_Integer len = theDriver.RootSectionSize(); + Standard_Integer len = theDriver->RootSectionSize(); for (Standard_Integer i = 1; i <= len; i++) { try { OCC_CATCH_SIGNALS - theDriver.ReadRoot (aRootName, aRef, aTypeName); + theDriver->ReadRoot (aRootName, aRef, aTypeName); } catch (Storage_StreamTypeMismatchError const&) { @@ -70,7 +70,7 @@ myObjects.Bind (aRootName, aRoot); } - myErrorStatus = theDriver.EndReadRootSection(); + myErrorStatus = theDriver->EndReadRootSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndReadRootSection"; diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_RootData.hxx opencascade-7.5.1+dfsg1/src/Storage/Storage_RootData.hxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_RootData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_RootData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -47,7 +47,7 @@ Standard_EXPORT Storage_RootData(); - Standard_EXPORT Standard_Boolean Read (Storage_BaseDriver& theDriver); + Standard_EXPORT Standard_Boolean Read (const Handle(Storage_BaseDriver)& theDriver); //! returns the number of roots. Standard_EXPORT Standard_Integer NumberOfRoots() const; diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_Schema.cxx opencascade-7.5.1+dfsg1/src/Storage/Storage_Schema.cxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_Schema.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_Schema.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -205,6 +205,9 @@ Storage_BucketIterator::Storage_BucketIterator (Storage_BucketOfPersistent* aBucketManager) +: myBucket(0), myCurrentBucket(0), + myCurrentBucketIndex(0), myCurrentIndex(0), + myBucketNumber(0), myMoreObject(Standard_False) { if (aBucketManager) { myBucket = aBucketManager; @@ -214,7 +217,6 @@ myCurrentIndex = 0; myMoreObject = Standard_True; } - else myMoreObject = Standard_False; } //======================================================================= @@ -338,9 +340,8 @@ // VSReadWrite //======================================================================= -void Storage_Schema::Write - (Storage_BaseDriver& f, - const Handle(Storage_Data)& aData) const +void Storage_Schema::Write (const Handle(Storage_BaseDriver)& theDriver, + const Handle(Storage_Data)& aData) const { if (aData.IsNull()) return; @@ -382,42 +383,42 @@ aData->HeaderData()->SetSchemaName(myName); aData->HeaderData()->SetSchemaVersion(myVersion); - if ((f.OpenMode() == Storage_VSWrite) || (f.OpenMode() == Storage_VSReadWrite)) { + if ((theDriver->OpenMode() == Storage_VSWrite) || (theDriver->OpenMode() == Storage_VSReadWrite)) { try { OCC_CATCH_SIGNALS errorContext = "BeginWriteInfoSection"; - f.BeginWriteInfoSection(); + theDriver->BeginWriteInfoSection(); errorContext = "WriteInfo"; - f.WriteInfo(aData->NumberOfObjects(), - aData->StorageVersion(), - aData->CreationDate(), - aData->SchemaName(), - aData->SchemaVersion(), - aData->ApplicationName(), - aData->ApplicationVersion(), - aData->DataType(), - aData->UserInfo()); + theDriver->WriteInfo(aData->NumberOfObjects(), + aData->StorageVersion(), + aData->CreationDate(), + aData->SchemaName(), + aData->SchemaVersion(), + aData->ApplicationName(), + aData->ApplicationVersion(), + aData->DataType(), + aData->UserInfo()); errorContext = "EndWriteInfoSection"; - f.EndWriteInfoSection(); + theDriver->EndWriteInfoSection(); errorContext = "BeginWriteCommentSection"; - f.BeginWriteCommentSection(); + theDriver->BeginWriteCommentSection(); errorContext = "WriteComment"; - f.WriteComment(aData->Comments()); + theDriver->WriteComment(aData->Comments()); errorContext = "EndWriteCommentSection"; - f.EndWriteCommentSection(); + theDriver->EndWriteCommentSection(); Handle(TColStd_HSequenceOfAsciiString) tlist; tlist = aData->Types(); errorContext = "BeginWriteTypeSection"; - f.BeginWriteTypeSection(); + theDriver->BeginWriteTypeSection(); len = aData->NumberOfTypes(); Handle(Storage_HArrayOfCallBack) WFunc = new Storage_HArrayOfCallBack(1,len); - f.SetTypeSectionSize(len); + theDriver->SetTypeSectionSize(len); Storage_DataMapIteratorOfMapOfCallBack cbit(iData->myTypeBinding); Handle(Storage_TypedCallBack) atcallBack; @@ -429,42 +430,42 @@ errorContext = "WriteTypeInformations"; for (i = 1; i <= len; i++) { - f.WriteTypeInformations(i,tlist->Value(i).ToCString()); + theDriver->WriteTypeInformations(i,tlist->Value(i).ToCString()); } errorContext = "EndWriteTypeSection"; - f.EndWriteTypeSection(); + theDriver->EndWriteTypeSection(); errorContext = "BeginWriteRootSection"; - f.BeginWriteRootSection(); - f.SetRootSectionSize(plist->Length()); + theDriver->BeginWriteRootSection(); + theDriver->SetRootSectionSize(plist->Length()); errorContext = "WriteRoot"; for (i = 1; i <= plist->Length(); i++) { - f.WriteRoot(plist->Value(i)->Name(),i,"PDocStd_Document"); + theDriver->WriteRoot(plist->Value(i)->Name(),i,"PDocStd_Document"); } errorContext = "EndWriteRootSection"; - f.EndWriteRootSection(); + theDriver->EndWriteRootSection(); errorContext = "BeginWriteRefSection"; - f.BeginWriteRefSection(); - f.SetRefSectionSize(iData->myObjId - 1); + theDriver->BeginWriteRefSection(); + theDriver->SetRefSectionSize(iData->myObjId - 1); errorContext = "WriteReferenceType"; Storage_BucketIterator bit(&iData->myPtoA); while(bit.More()) { p = bit.Value(); - if (!p.IsNull()) f.WriteReferenceType(p->_refnum,p->_typenum); + if (!p.IsNull()) theDriver->WriteReferenceType(p->_refnum,p->_typenum); bit.Next(); } errorContext = "EndWriteRefSection"; - f.EndWriteRefSection(); + theDriver->EndWriteRefSection(); errorContext = "BeginWriteDataSection"; - f.BeginWriteDataSection(); + theDriver->BeginWriteDataSection(); Handle(Storage_Schema) me = this; @@ -475,14 +476,14 @@ while(bit.More()) { p = bit.Value(); if (!p.IsNull()) { - WFunc->Value(p->_typenum)->Write(p,f,me); + WFunc->Value(p->_typenum)->Write(p, theDriver, me); p->_typenum = 0; } bit.Next(); } errorContext = "EndWriteDataSection"; - f.EndWriteDataSection(); + theDriver->EndWriteDataSection(); } catch(Storage_StreamWriteError const&) { aData->SetErrorStatus(Storage_VSWriteError); @@ -772,17 +773,26 @@ } else { - // hard-code migration table for known types - aDMap.Bind("TDataStd_Shape", "TDataXtd_Shape"); - aDMap.Bind("TDataStd_Constraint", "TDataXtd_Constraint"); + // hard-code migration table for known types + aDMap.Bind("TDataStd_Shape", "TDataXtd_Shape"); + aDMap.Bind("TDataStd_Constraint", "TDataXtd_Constraint"); aDMap.Bind("TDataStd_Geometry", "TDataXtd_Geometry"); - aDMap.Bind("TDataStd_Axis", "TDataXtd_Axis"); - aDMap.Bind("TDataStd_Point", "TDataXtd_Point"); - aDMap.Bind("TDataStd_Plane", "TDataXtd_Plane"); - aDMap.Bind("TDataStd_Position", "TDataXtd_Position"); - aDMap.Bind("TDataStd_Placement", "TDataXtd_Placement"); - aDMap.Bind("TDataStd_PatternStd", "TDataXtd_PatternStd"); - aDMap.Bind("TPrsStd_AISPresentation", "TDataXtd_Presentation"); + aDMap.Bind("TDataStd_Axis", "TDataXtd_Axis"); + aDMap.Bind("TDataStd_Point", "TDataXtd_Point"); + aDMap.Bind("TDataStd_Plane", "TDataXtd_Plane"); + aDMap.Bind("TDataStd_Position", "TDataXtd_Position"); + aDMap.Bind("TDataStd_Placement", "TDataXtd_Placement"); + aDMap.Bind("TDataStd_PatternStd", "TDataXtd_PatternStd"); + aDMap.Bind("TPrsStd_AISPresentation", "TDataXtd_Presentation"); + aDMap.Bind("PDataStd_Shape", "PDataXtd_Shape"); + aDMap.Bind("PDataStd_Constraint", "PDataXtd_Constraint"); + aDMap.Bind("PDataStd_Geometry", "PDataXtd_Geometry"); + aDMap.Bind("PDataStd_Axis", "PDataXtd_Axis"); + aDMap.Bind("PDataStd_Point", "PDataXtd_Point"); + aDMap.Bind("PDataStd_Plane", "PDataXtd_Plane"); + aDMap.Bind("PDataStd_Position", "PDataXtd_Position"); + aDMap.Bind("PDataStd_Placement", "PDataXtd_Placement"); + aDMap.Bind("PDataStd_PatternStd", "PDataXtd_PatternStd"); } #ifdef OCCT_DEBUG std::cout << "Storage_Sheme:: aDataMap.Size = " << aDMap.Extent() << std::endl; diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_Schema.hxx opencascade-7.5.1+dfsg1/src/Storage/Storage_Schema.hxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_Schema.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_Schema.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -17,18 +17,15 @@ #ifndef _Storage_Schema_HeaderFile #define _Storage_Schema_HeaderFile -#include -#include - +#include +#include +#include #include -#include +#include #include -#include -#include #include #include -#include -#include + class Storage_CallBack; class Storage_StreamFormatError; class TCollection_AsciiString; @@ -105,7 +102,7 @@ //! schema with which this algorithm is working. //! Note: aData may aggregate several root objects //! to be stored together. - Standard_EXPORT void Write (Storage_BaseDriver& s, const Handle(Storage_Data)& aData) const; + Standard_EXPORT void Write (const Handle(Storage_BaseDriver)& s, const Handle(Storage_Data)& aData) const; //! return a current date string Standard_EXPORT static TCollection_AsciiString ICreationDate(); @@ -160,22 +157,28 @@ //! UseDefaultCallBack() is set. Standard_EXPORT Handle(Storage_CallBack) DefaultCallBack() const; - void WritePersistentObjectHeader (const Handle(Standard_Persistent)& sp, Storage_BaseDriver& s); - - void WritePersistentReference (const Handle(Standard_Persistent)& sp, Storage_BaseDriver& s); + void WritePersistentObjectHeader(const Handle(Standard_Persistent)& sp, const Handle(Storage_BaseDriver)& theDriver) + { + theDriver->WritePersistentObjectHeader(sp->_refnum, sp->_typenum); + } + + void WritePersistentReference(const Handle(Standard_Persistent)& sp, const Handle(Storage_BaseDriver)& theDriver) + { + theDriver->PutReference(sp.IsNull() ? 0 : sp->_refnum); + } Standard_EXPORT Standard_Boolean AddPersistent (const Handle(Standard_Persistent)& sp, const Standard_CString tName) const; Standard_EXPORT Standard_Boolean PersistentToAdd (const Handle(Standard_Persistent)& sp) const; - - - DEFINE_STANDARD_RTTIEXT(Storage_Schema,Standard_Transient) protected: - Standard_Boolean HasTypeBinding (const TCollection_AsciiString& aTypeName) const; + Standard_Boolean HasTypeBinding(const TCollection_AsciiString& aTypeName) const + { + return Storage_Schema::ICurrentData()->InternalData()->myTypeBinding.IsBound(aTypeName); + } Standard_EXPORT void BindType (const TCollection_AsciiString& aTypeName, const Handle(Storage_CallBack)& aCallBack) const; @@ -198,11 +201,4 @@ TCollection_AsciiString myVersion; }; - -#include - - - - - #endif // _Storage_Schema_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_Schema.lxx opencascade-7.5.1+dfsg1/src/Storage/Storage_Schema.lxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_Schema.lxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_Schema.lxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -// Copyright (c) 1998-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#include -#include -#include - - -inline void Storage_Schema::WritePersistentObjectHeader(const Handle(Standard_Persistent)& sp,Storage_BaseDriver& f) -{ - f.WritePersistentObjectHeader(sp->_refnum,sp->_typenum); -} - -inline Standard_Boolean Storage_Schema::HasTypeBinding(const TCollection_AsciiString& aTypeName) const -{ - return Storage_Schema::ICurrentData()->InternalData()->myTypeBinding.IsBound(aTypeName); -} - -inline void Storage_Schema::WritePersistentReference(const Handle(Standard_Persistent)& sp,Storage_BaseDriver& f) -{ - if (!sp.IsNull()) { - f.PutReference(sp->_refnum); - } - else { - f.PutReference(0); - } -} - diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_TypeData.cxx opencascade-7.5.1+dfsg1/src/Storage/Storage_TypeData.cxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_TypeData.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_TypeData.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,11 +26,11 @@ { } -Standard_Boolean Storage_TypeData::Read (Storage_BaseDriver& theDriver) +Standard_Boolean Storage_TypeData::Read (const Handle(Storage_BaseDriver)& theDriver) { // Check driver open mode - if (theDriver.OpenMode() != Storage_VSRead - && theDriver.OpenMode() != Storage_VSReadWrite) + if (theDriver->OpenMode() != Storage_VSRead + && theDriver->OpenMode() != Storage_VSReadWrite) { myErrorStatus = Storage_VSModeError; myErrorStatusExt = "OpenMode"; @@ -38,7 +38,7 @@ } // Read type section - myErrorStatus = theDriver.BeginReadTypeSection(); + myErrorStatus = theDriver->BeginReadTypeSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "BeginReadTypeSection"; @@ -48,13 +48,13 @@ Standard_Integer aTypeNum; TCollection_AsciiString aTypeName; - Standard_Integer len = theDriver.TypeSectionSize(); + Standard_Integer len = theDriver->TypeSectionSize(); for (Standard_Integer i = 1; i <= len; i++) { try { OCC_CATCH_SIGNALS - theDriver.ReadTypeInformations (aTypeNum, aTypeName); + theDriver->ReadTypeInformations (aTypeNum, aTypeName); } catch (const Storage_StreamTypeMismatchError&) { @@ -66,7 +66,7 @@ myPt.Add (aTypeName, aTypeNum); } - myErrorStatus = theDriver.EndReadTypeSection(); + myErrorStatus = theDriver->EndReadTypeSection(); if (myErrorStatus != Storage_VSOk) { myErrorStatusExt = "EndReadTypeSection"; diff -Nru opencascade-7.4.1+dfsg1/src/Storage/Storage_TypeData.hxx opencascade-7.5.1+dfsg1/src/Storage/Storage_TypeData.hxx --- opencascade-7.4.1+dfsg1/src/Storage/Storage_TypeData.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Storage/Storage_TypeData.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -45,7 +45,7 @@ Standard_EXPORT Storage_TypeData(); - Standard_EXPORT Standard_Boolean Read (Storage_BaseDriver& theDriver); + Standard_EXPORT Standard_Boolean Read (const Handle(Storage_BaseDriver)& theDriver); Standard_EXPORT Standard_Integer NumberOfTypes() const; diff -Nru opencascade-7.4.1+dfsg1/src/SWDRAW/SWDRAW_ShapeAnalysis.cxx opencascade-7.5.1+dfsg1/src/SWDRAW/SWDRAW_ShapeAnalysis.cxx --- opencascade-7.4.1+dfsg1/src/SWDRAW/SWDRAW_ShapeAnalysis.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SWDRAW/SWDRAW_ShapeAnalysis.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -830,66 +830,6 @@ } -//======================================================================= -//function : MyVISEDG -//purpose : -//======================================================================= -static Standard_Integer MyVISEDG (Draw_Interpretor& /*di*/, - Standard_Integer n, const char** a) -{ - if (n >4) return 1; - TopoDS_Shape MaListe = DBRep::Get(a[1]); - if (MaListe.IsNull()) return 1; - TopoDS_Compound TheList = TopoDS::Compound(MaListe); - if (TheList.IsNull()) return 1; - Standard_Real toler = 0.001; - int create = 0; - if ( n >= 3) toler = Draw::Atof(a[2]); - if (n == 4 && !strcmp(a[3],"C")) create = 1; - ShapeAnalysis_FreeBounds F(TheList,toler); - // - // - // - char name[100]; - char num[5]; - if (!create) - { - TopoDS_Compound Wires = F.GetClosedWires(); - TopoDS_Iterator S(Wires); - Standard_Integer iwire = 0; - while (S.More()) - { - Sprintf (num,"%d",iwire); - name[0] = 'w'; - name[1] = '\0'; - strncat(name,num,strlen(num)); - name[strlen(name)] = '\0'; - DBRep::Set(name,S.Value()); - S.Next(); - iwire++; - } - iwire = 0; - TopoDS_Compound Edges = F.GetOpenWires(); - S.Initialize(Edges); - iwire = 0; - while (S.More()) - { - Sprintf (num,"%d",iwire); - name[0] = 'E'; - name[1] = '\0'; - strncat(name,num,strlen(num)); - name[strlen(name)] = '\0'; - DBRep::Set(name,S.Value()); - S.Next(); - iwire++; - } - } - else - { - } - return 0; -} - static Standard_Integer getareacontour (Draw_Interpretor& di, Standard_Integer n, const char** a) { @@ -1076,9 +1016,6 @@ theCommands.Add("fbclose", "shp sewtoler closetoler [splitclosed [splitopen]] - closes free bounds; use sewtoler <= 0 for shells (no sewing call)", __FILE__, closefreebounds, groupold); - theCommands.Add("K_VISEDG", - "K_VISEDG Visu of free edge of a compound of faces.", - __FILE__, MyVISEDG, groupold); theCommands.Add("getareacontour","wire ",__FILE__, getareacontour, groupold); theCommands.Add ("checkselfintersection","wire [face]", __FILE__,checkselfintersection,g); diff -Nru opencascade-7.4.1+dfsg1/src/SWDRAW/SWDRAW_ShapeFix.cxx opencascade-7.5.1+dfsg1/src/SWDRAW/SWDRAW_ShapeFix.cxx --- opencascade-7.4.1+dfsg1/src/SWDRAW/SWDRAW_ShapeFix.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SWDRAW/SWDRAW_ShapeFix.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -484,7 +484,7 @@ } Handle(Draw_ProgressIndicator) aProgress = new Draw_ProgressIndicator (di, 1); - sfs->Perform (aProgress); + sfs->Perform (aProgress->Start()); DBRep::Set (res,sfs->Shape()); if ( mess ) @@ -629,7 +629,7 @@ aSfwr->CheckSmallEdges(theSmallEdges,theEdgeToFaces,theFaceWithSmall, theMultyEdges); aSfwr->MergeSmallEdges (theSmallEdges,theEdgeToFaces,theFaceWithSmall, theMultyEdges, aModeDrop,tolang); //aSfwr->FixSmallEdges(); - TopoDS_Shape resShape = aSfwr->Shape();; + TopoDS_Shape resShape = aSfwr->Shape(); DBRep::Set ( a[1], resShape ); return 0; } @@ -643,7 +643,7 @@ { if (theArgc < 3) { - std::cerr << "Use: " << theArgv[0] << " result shape [tolerance]" << std::endl; + theDI << "Use: " << theArgv[0] << " result shape [tolerance]"; return 1; } @@ -746,9 +746,15 @@ di<<"Invalid arguments\n"; return 1; } + Standard_Real tol = Precision::Confusion(); + if (n > 4) + { + tol = Atof(a[4]); + } + TopoDS_Face aFace = TopoDS::Face(Sh1); gp_Pnt2d p2d(ucoord,vcoord); - BRepTopAdaptor_FClass2d f2d(aFace,Precision::Confusion()); + BRepTopAdaptor_FClass2d f2d(aFace, tol); TopAbs_State stat = f2d.Perform(p2d); if(stat == TopAbs_OUT) di<<"Point is OUT\n"; @@ -864,7 +870,7 @@ __FILE__,fixsmallfaces,g); theCommands.Add ("checkoverlapedges","edge1 edge2 [toler domaindist]", __FILE__,checkoverlapedges,g); - theCommands.Add ("checkfclass2d","face ucoord vcoord", + theCommands.Add ("checkfclass2d","face ucoord vcoord [tol]", __FILE__,checkfclass2d,g); theCommands.Add ("connectedges","res shape [toler shared]", __FILE__,connectedges,g); diff -Nru opencascade-7.4.1+dfsg1/src/SWDRAW/SWDRAW_ShapeUpgrade.cxx opencascade-7.5.1+dfsg1/src/SWDRAW/SWDRAW_ShapeUpgrade.cxx --- opencascade-7.4.1+dfsg1/src/SWDRAW/SWDRAW_ShapeUpgrade.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/SWDRAW/SWDRAW_ShapeUpgrade.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -56,6 +57,7 @@ #include #include #include +#include #include #include #include @@ -1401,14 +1403,14 @@ { if ( theArgc < 4 ) { - std::cout << "Error: wrong number of arguments. Type 'help " << theArgv[0] << "'\n"; + Message::SendFail() << "Error: wrong number of arguments. Type 'help " << theArgv[0] << "'"; return 1; } TopoDS_Shape aSource = DBRep::Get(theArgv[2]); if ( aSource.IsNull() ) { - std::cout << "Error: source shape ('" << theArgv[2] << "') is null\n"; + Message::SendFail() << "Error: source shape ('" << theArgv[2] << "') is null"; return 1; } @@ -1427,21 +1429,21 @@ { if ( theArgc - i < 3 ) { - std::cout << "Error: not enough arguments for replacement\n"; + Message::SendFail() << "Error: not enough arguments for replacement"; return 1; } TopoDS_Shape aWhat = DBRep::Get(theArgv[++i]); if ( aWhat.IsNull() ) { - std::cout << "Error: argument shape ('" << theArgv[i] << "') is null\n"; + Message::SendFail() << "Error: argument shape ('" << theArgv[i] << "') is null"; return 1; } TopoDS_Shape aWith = DBRep::Get(theArgv[++i]); if ( aWith.IsNull() ) { - std::cout << "Error: replacement shape ('" << theArgv[i] << "') is null\n"; + Message::SendFail() << "Error: replacement shape ('" << theArgv[i] << "') is null"; return 1; } @@ -1451,14 +1453,14 @@ { if ( theArgc - i < 2 ) { - std::cout << "Error: not enough arguments for removal\n"; + Message::SendFail() << "Error: not enough arguments for removal"; return 1; } TopoDS_Shape aWhat = DBRep::Get(theArgv[++i]); if ( aWhat.IsNull() ) { - std::cout << "Error: shape to remove ('" << theArgv[i] << "') is null\n"; + Message::SendFail() << "Error: shape to remove ('" << theArgv[i] << "') is null"; return 1; } @@ -1468,7 +1470,7 @@ { if (theArgc - i < 2) { - std::cout << "Error: not enough arguments for level specification\n"; + Message::SendFail() << "Error: not enough arguments for level specification"; return 1; } @@ -1504,13 +1506,13 @@ aShapeLevel = TopAbs_SHAPE; else { - std::cout << "Error: unknown shape type '" << theArgv[i] << "'\n"; + Message::SendFail() << "Error: unknown shape type '" << theArgv[i] << "'"; return 1; } } else { - std::cout << "Error: invalid syntax at " << anOpt << "\n" ; + Message::SendFail() << "Error: invalid syntax at " << anOpt; return 1; } } @@ -1519,7 +1521,7 @@ TopoDS_Shape aResult = aReShaper->Apply(aSource, aShapeLevel); if ( aResult.IsNull() ) { - std::cout << "Error: result shape is null\n"; + Message::SendFail() << "Error: result shape is null"; return 1; } diff -Nru opencascade-7.4.1+dfsg1/src/Sweep/Sweep_NumShapeIterator.cxx opencascade-7.5.1+dfsg1/src/Sweep/Sweep_NumShapeIterator.cxx --- opencascade-7.4.1+dfsg1/src/Sweep/Sweep_NumShapeIterator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/Sweep/Sweep_NumShapeIterator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -26,7 +26,9 @@ //======================================================================= Sweep_NumShapeIterator::Sweep_NumShapeIterator(): myNumShape(0,TopAbs_SHAPE), - myCurrentNumShape(0,TopAbs_SHAPE) + myCurrentNumShape(0,TopAbs_SHAPE), + myCurrentRange(0), + myMore(Standard_False) { } diff -Nru opencascade-7.4.1+dfsg1/src/TCollection/TCollection_ExtendedString.cxx opencascade-7.5.1+dfsg1/src/TCollection/TCollection_ExtendedString.cxx --- opencascade-7.4.1+dfsg1/src/TCollection/TCollection_ExtendedString.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TCollection/TCollection_ExtendedString.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -258,12 +258,13 @@ // Create an extendedstring from an AsciiString //--------------------------------------------------------------------------- TCollection_ExtendedString::TCollection_ExtendedString - (const TCollection_AsciiString& theString) + (const TCollection_AsciiString& theString, + const Standard_Boolean isMultiByte) { mylength = nbSymbols (theString.ToCString()); mystring = allocateExtChars (mylength); mystring[mylength] = 0; - if (ConvertToUnicode (theString.ToCString())) + if (isMultiByte && ConvertToUnicode (theString.ToCString())) { return; } @@ -305,6 +306,20 @@ } // ---------------------------------------------------------------------------- +// AssignCat +// ---------------------------------------------------------------------------- +void TCollection_ExtendedString::AssignCat(const Standard_Utf16Char theChar) +{ + if (theChar != '\0') + { + mystring = reallocateExtChars(mystring, mylength + 1); + mystring[mylength] = theChar; + mylength += 1; + mystring[mylength] = '\0'; + } +} + +// ---------------------------------------------------------------------------- // Cat // ---------------------------------------------------------------------------- TCollection_ExtendedString TCollection_ExtendedString::Cat diff -Nru opencascade-7.4.1+dfsg1/src/TCollection/TCollection_ExtendedString.hxx opencascade-7.5.1+dfsg1/src/TCollection/TCollection_ExtendedString.hxx --- opencascade-7.4.1+dfsg1/src/TCollection/TCollection_ExtendedString.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TCollection/TCollection_ExtendedString.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -114,8 +114,9 @@ //! Creation by converting an Ascii string to an extended //! string. The string is treated as having UTF-8 coding. - //! If it is not a UTF-8 then each character is copied to ExtCharacter. - Standard_EXPORT TCollection_ExtendedString(const TCollection_AsciiString& astring); + //! If it is not a UTF-8 or multi byte then + //! each character is copied to ExtCharacter. + Standard_EXPORT TCollection_ExtendedString(const TCollection_AsciiString& astring, const Standard_Boolean isMultiByte = Standard_True); //! Appends the other extended string to this extended string. //! Note that this method is an alias of operator +=. @@ -125,6 +126,9 @@ { AssignCat(other); } + + //! Appends the utf16 char to this extended string. + Standard_EXPORT void AssignCat (const Standard_Utf16Char theChar); //! Appends to me. Standard_EXPORT TCollection_ExtendedString Cat (const TCollection_ExtendedString& other) const; diff -Nru opencascade-7.4.1+dfsg1/src/TCollection/TCollection_HAsciiString.hxx opencascade-7.5.1+dfsg1/src/TCollection/TCollection_HAsciiString.hxx --- opencascade-7.4.1+dfsg1/src/TCollection/TCollection_HAsciiString.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TCollection/TCollection_HAsciiString.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -72,17 +72,16 @@ //! Initializes a HAsciiString with a real value Standard_EXPORT TCollection_HAsciiString(const Standard_Real value); - //! Initializes a HAsciiString with a HAsciiString. + //! Initializes a HAsciiString with a AsciiString. Standard_EXPORT TCollection_HAsciiString(const TCollection_AsciiString& aString); //! Initializes a HAsciiString with a HAsciiString. Standard_EXPORT TCollection_HAsciiString(const Handle(TCollection_HAsciiString)& aString); - //! Initializes a HAsciiString with a HAsciiString. + //! Initializes a HAsciiString with a HExtendedString. //! If replaceNonAscii is non-null charecter, it will be used //! in place of any non-ascii character found in the source string. - //! Otherwise, raises OutOfRange exception if at least one character - //! in the source string is not in the "Ascii range". + //! Otherwise, creates UTF-8 unicode string. Standard_EXPORT TCollection_HAsciiString(const Handle(TCollection_HExtendedString)& aString, const Standard_Character replaceNonAscii); //! Appends to me. diff -Nru opencascade-7.4.1+dfsg1/src/TColQuantity/FILES opencascade-7.5.1+dfsg1/src/TColQuantity/FILES --- opencascade-7.4.1+dfsg1/src/TColQuantity/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TColQuantity/FILES 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -TColQuantity_Array1OfLength.hxx -TColQuantity_Array2OfLength.hxx -TColQuantity_HArray1OfLength.hxx -TColQuantity_HArray2OfLength.hxx diff -Nru opencascade-7.4.1+dfsg1/src/TColQuantity/TColQuantity_Array1OfLength.hxx opencascade-7.5.1+dfsg1/src/TColQuantity/TColQuantity_Array1OfLength.hxx --- opencascade-7.4.1+dfsg1/src/TColQuantity/TColQuantity_Array1OfLength.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TColQuantity/TColQuantity_Array1OfLength.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -// Created on: 1994-03-03 -// Created by: Jean Louis FRENKEL -// Copyright (c) 1994-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TColQuantity_Array1OfLength_HeaderFile -#define TColQuantity_Array1OfLength_HeaderFile - -#include -#include - -typedef NCollection_Array1 TColQuantity_Array1OfLength; - - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/TColQuantity/TColQuantity_Array2OfLength.hxx opencascade-7.5.1+dfsg1/src/TColQuantity/TColQuantity_Array2OfLength.hxx --- opencascade-7.4.1+dfsg1/src/TColQuantity/TColQuantity_Array2OfLength.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TColQuantity/TColQuantity_Array2OfLength.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -// Created on: 1994-03-03 -// Created by: Jean Louis FRENKEL -// Copyright (c) 1994-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TColQuantity_Array2OfLength_HeaderFile -#define TColQuantity_Array2OfLength_HeaderFile - -#include -#include - -typedef NCollection_Array2 TColQuantity_Array2OfLength; - - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/TColQuantity/TColQuantity_HArray1OfLength.hxx opencascade-7.5.1+dfsg1/src/TColQuantity/TColQuantity_HArray1OfLength.hxx --- opencascade-7.4.1+dfsg1/src/TColQuantity/TColQuantity_HArray1OfLength.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TColQuantity/TColQuantity_HArray1OfLength.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -// Created on: 1994-03-03 -// Created by: Jean Louis FRENKEL -// Copyright (c) 1994-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TColQuantity_HArray1OfLength_HeaderFile -#define TColQuantity_HArray1OfLength_HeaderFile - -#include -#include -#include - -DEFINE_HARRAY1(TColQuantity_HArray1OfLength, TColQuantity_Array1OfLength) - - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/TColQuantity/TColQuantity_HArray2OfLength.hxx opencascade-7.5.1+dfsg1/src/TColQuantity/TColQuantity_HArray2OfLength.hxx --- opencascade-7.4.1+dfsg1/src/TColQuantity/TColQuantity_HArray2OfLength.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TColQuantity/TColQuantity_HArray2OfLength.hxx 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -// Created on: 1994-03-03 -// Created by: Jean Louis FRENKEL -// Copyright (c) 1994-1999 Matra Datavision -// Copyright (c) 1999-2014 OPEN CASCADE SAS -// -// This file is part of Open CASCADE Technology software library. -// -// This library is free software; you can redistribute it and/or modify it under -// the terms of the GNU Lesser General Public License version 2.1 as published -// by the Free Software Foundation, with special exception defined in the file -// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT -// distribution for complete text of the license and disclaimer of any warranty. -// -// Alternatively, this file may be used under the terms of Open CASCADE -// commercial license or contractual agreement. - -#ifndef TColQuantity_HArray2OfLength_HeaderFile -#define TColQuantity_HArray2OfLength_HeaderFile - -#include -#include -#include - -DEFINE_HARRAY2(TColQuantity_HArray2OfLength, TColQuantity_Array2OfLength) - - -#endif diff -Nru opencascade-7.4.1+dfsg1/src/TColStd/TColStd_PackedMapOfInteger.cxx opencascade-7.5.1+dfsg1/src/TColStd/TColStd_PackedMapOfInteger.cxx --- opencascade-7.4.1+dfsg1/src/TColStd/TColStd_PackedMapOfInteger.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TColStd/TColStd_PackedMapOfInteger.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -319,7 +319,7 @@ aData[aHashCode] = new TColStd_intMapNode (p->Mask(), p->Data(), aData[aHashCode]); Increment(); - p = reinterpret_cast (p->Next()); + p = static_cast (p->Next()); } } // TColStd_MapIteratorOfPackedMapOfInteger anIt (theOther); @@ -414,7 +414,7 @@ // break; goto finish; // goto saves us 4 CPU clocks or 4% performance } - p = reinterpret_cast (p->Next()); + p = static_cast (p->Next()); } // if (!p) { // not needed, as long as we exit the loop by goto data[aHashCode] = new TColStd_intMapNode(aKey, aBucketHead); @@ -444,7 +444,7 @@ aResult = (p->HasValue (aKey) != 0); break; } - p = reinterpret_cast (p->Next()); + p = static_cast (p->Next()); } } return aResult; @@ -472,14 +472,14 @@ if (p->HasValues() == Standard_False) { Decrement(); if (q) q->Next() = p->Next(); - else aBucketHead = reinterpret_cast(p->Next()); + else aBucketHead = static_cast(p->Next()); delete p; } } break; } q = p; - p = reinterpret_cast (p->Next()); + p = static_cast (p->Next()); } } return aResult; @@ -498,11 +498,10 @@ const TColStd_intMapNode * pFoundNode = 0L; for (Standard_Integer i = 0; i <= NbBuckets(); i++) { for (const TCollection_MapNode * p = aData[i]; p != 0L; p = p->Next()) { - const Standard_Integer aKey = - reinterpret_cast (p)->Key(); + const Standard_Integer aKey = static_cast (p)->Key(); if (aResult > aKey) { aResult = aKey; - pFoundNode = reinterpret_cast(p); + pFoundNode = static_cast(p); } } } @@ -527,11 +526,10 @@ const TColStd_intMapNode * pFoundNode = 0L; for (Standard_Integer i = 0; i <= NbBuckets(); i++) { for (const TCollection_MapNode * p = aData[i]; p != 0L; p = p->Next()) { - const Standard_Integer aKey = - reinterpret_cast (p)->Key(); + const Standard_Integer aKey = static_cast (p)->Key(); if (aResult < aKey) { aResult = aKey; - pFoundNode = reinterpret_cast(p); + pFoundNode = static_cast(p); } } } @@ -585,7 +583,7 @@ nValues = TColStd_Population (aNewMask, aNewData); break; } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } // Store the block - result of operation if (Resizable()) { @@ -597,7 +595,7 @@ aData[aHashCode]); Increment(); myExtent += nValues; - p1 = reinterpret_cast (p1->Next()); + p1 = static_cast (p1->Next()); } } // Iteration of the 2nd map. @@ -610,7 +608,7 @@ while (p1) { if (p1->IsEqual(*p2)) break; - p1 = reinterpret_cast (p1->Next()); + p1 = static_cast (p1->Next()); } // Add the block from the 2nd map only in the case when the similar // block has not been found in the 1st map @@ -625,7 +623,7 @@ Increment(); myExtent += p2->NbValues(); } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } } } @@ -669,7 +667,7 @@ } break; } - p1 = reinterpret_cast (p1->Next()); + p1 = static_cast (p1->Next()); } // If the block is not found in the 1st map, add it to the 1st map if (p1 == 0L) { @@ -683,7 +681,7 @@ Increment(); aNewExtent += p2->NbValues(); } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } } Standard_Boolean isChanged = ( myExtent != aNewExtent ); @@ -749,9 +747,9 @@ } break; } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } - p1 = reinterpret_cast (p1->Next()); + p1 = static_cast (p1->Next()); } } } @@ -802,10 +800,9 @@ } break; } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } - TColStd_intMapNode* pNext = - reinterpret_cast (p1->Next()); + TColStd_intMapNode* pNext = static_cast (p1->Next()); // If p2!=NULL, then the map node is kept and we move to the next one // Otherwise we should remove the current node if (p2) @@ -870,7 +867,7 @@ nValues = TColStd_Population (aNewMask, aNewData); break; } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } // Store the block - result of operation if (aNewData) { @@ -884,7 +881,7 @@ Increment(); myExtent += nValues; } - p1 = reinterpret_cast (p1->Next()); + p1 = static_cast (p1->Next()); } } } @@ -915,8 +912,7 @@ TColStd_intMapNode * q = 0L; TColStd_intMapNode * p1 = aData[i]; while (p1 != 0L) { - TColStd_intMapNode* pNext = - reinterpret_cast (p1->Next()); + TColStd_intMapNode* pNext = static_cast (p1->Next()); // Find the corresponding block in the 2nd map const TColStd_intMapNode * p2 = aData2 [p1->HashCode (nBuckets2)]; @@ -942,7 +938,7 @@ } break; } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } if (p2 == 0L) { aNewExtent += p1->NbValues(); @@ -1000,7 +996,7 @@ nValues = TColStd_Population (aNewMask, aNewData); break; } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } // Store the block - result of operation if (aNewData) { @@ -1014,7 +1010,7 @@ Increment(); myExtent += nValues; } - p1 = reinterpret_cast (p1->Next()); + p1 = static_cast (p1->Next()); } } @@ -1028,7 +1024,7 @@ while (p1) { if (p1->IsEqual(*p2)) break; - p1 = reinterpret_cast (p1->Next()); + p1 = static_cast (p1->Next()); } // Add the block from the 2nd map only in the case when the similar // block has not been found in the 1st map @@ -1043,7 +1039,7 @@ Increment(); myExtent += p2->NbValues(); } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } } } @@ -1082,8 +1078,7 @@ // Find the corresponding block in the 1st map TColStd_intMapNode * p1 = aData1[p2->HashCode (NbBuckets())]; - TColStd_intMapNode* pNext = - reinterpret_cast (p1->Next()); + TColStd_intMapNode* pNext = static_cast (p1->Next()); while (p1) { if (p1->IsEqual(*p2)) { @@ -1121,7 +1116,7 @@ aNewExtent += p2->NbValues(); isChanged = Standard_True; } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } } myExtent = aNewExtent; @@ -1152,8 +1147,7 @@ for (; i <= NbBuckets(); i++) { const TColStd_intMapNode * p1 = aData1[i]; while (p1 != 0L) { - TColStd_intMapNode* pNext = - reinterpret_cast (p1->Next()); + TColStd_intMapNode* pNext = static_cast (p1->Next()); // Find the corresponding block in the 2nd map const TColStd_intMapNode * p2 = aData2 [p1->HashCode (nBuckets2)]; @@ -1163,7 +1157,7 @@ return Standard_False; break; } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } // if the same block not found, maps are different if (p2 == 0L) @@ -1201,8 +1195,7 @@ for (; i <= NbBuckets(); i++) { const TColStd_intMapNode * p1 = aData1[i]; while (p1 != 0L) { - TColStd_intMapNode* pNext = - reinterpret_cast (p1->Next()); + TColStd_intMapNode* pNext = static_cast (p1->Next()); // Find the corresponding block in the 2nd map const TColStd_intMapNode * p2 = aData2 [p1->HashCode (nBuckets2)]; @@ -1214,7 +1207,7 @@ return Standard_False; break; } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } p1 = pNext; } @@ -1244,8 +1237,7 @@ for (; i <= NbBuckets(); i++) { const TColStd_intMapNode * p1 = aData1[i]; while (p1 != 0L) { - TColStd_intMapNode* pNext = - reinterpret_cast (p1->Next()); + TColStd_intMapNode* pNext = static_cast (p1->Next()); // Find the corresponding block in the 2nd map const TColStd_intMapNode * p2 = aData2 [p1->HashCode (nBuckets2)]; @@ -1255,7 +1247,7 @@ return Standard_True; break; } - p2 = reinterpret_cast (p2->Next()); + p2 = static_cast (p2->Next()); } p1 = pNext; } diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/FILES opencascade-7.5.1+dfsg1/src/TDataStd/FILES --- opencascade-7.4.1+dfsg1/src/TDataStd/FILES 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/FILES 2021-02-02 08:51:56.000000000 +0000 @@ -14,6 +14,10 @@ TDataStd_Comment.hxx TDataStd_Current.cxx TDataStd_Current.hxx +TDataStd_GenericEmpty.cxx +TDataStd_GenericEmpty.hxx +TDataStd_GenericExtString.cxx +TDataStd_GenericExtString.hxx TDataStd_DataMapIteratorOfDataMapOfStringByte.hxx TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfInteger.hxx TDataStd_DataMapIteratorOfDataMapOfStringHArray1OfReal.hxx @@ -72,7 +76,6 @@ TDataStd_Name.hxx TDataStd_NamedData.cxx TDataStd_NamedData.hxx -TDataStd_NamedData.lxx TDataStd_NoteBook.cxx TDataStd_NoteBook.hxx TDataStd_PtrTreeNode.hxx diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_AsciiString.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_AsciiString.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_AsciiString.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_AsciiString.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,11 +13,12 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include +#include #include #include #include -#include #include #include #include @@ -199,3 +200,17 @@ anOS << sguid << "|" < +#include #include #include -#include #include #include #include @@ -320,3 +321,23 @@ anOS <Array1()); aValueIt.More(); aValueIt.Next()) + { + const Standard_Byte& aValue = aValueIt.Value(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aValue) + } + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLower) + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUpper) + OCCT_DUMP_FIELD_VALUE_GUID (theOStream, myID) +} diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_BooleanArray.hxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_BooleanArray.hxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_BooleanArray.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_BooleanArray.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -99,6 +99,9 @@ Standard_EXPORT virtual Standard_OStream& Dump (Standard_OStream& OS) const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_BooleanList.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_BooleanList.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_BooleanList.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_BooleanList.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,10 +13,11 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include +#include #include #include -#include #include #include #include @@ -306,3 +307,21 @@ anOS << std::endl; return anOS; } + +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void TDataStd_BooleanList::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDF_Attribute) + + for (TDataStd_ListOfByte::Iterator aListIt (myList); aListIt.More(); aListIt.Next()) + { + const Standard_Byte& aValue = aListIt.Value(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aValue) + } + OCCT_DUMP_FIELD_VALUE_GUID (theOStream, myID) +} diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_BooleanList.hxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_BooleanList.hxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_BooleanList.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_BooleanList.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -100,6 +100,9 @@ Standard_EXPORT virtual Standard_OStream& Dump (Standard_OStream& anOS) const Standard_OVERRIDE; + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; + diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_ByteArray.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_ByteArray.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_ByteArray.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_ByteArray.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,10 +13,11 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include +#include #include #include -#include #include #include #include @@ -309,3 +310,21 @@ else return new TDF_DefaultDeltaOnModification(OldAttribute); } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void TDataStd_ByteArray::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDF_Attribute) + + for (TColStd_Array1OfByte::Iterator aValueIt (myValue->Array1()); aValueIt.More(); aValueIt.Next()) + { + const Standard_Byte& aValue = aValueIt.Value(); + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aValue) + } + OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myIsDelta) + OCCT_DUMP_FIELD_VALUE_GUID (theOStream, myID) +} diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_ByteArray.hxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_ByteArray.hxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_ByteArray.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_ByteArray.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -123,6 +123,9 @@ //! Makes a DeltaOnModification between and //! . Standard_EXPORT virtual Handle(TDF_DeltaOnModification) DeltaOnModification (const Handle(TDF_Attribute)& anOldAttribute) const Standard_OVERRIDE; + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; private: diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_ChildNodeIterator.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_ChildNodeIterator.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_ChildNodeIterator.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_ChildNodeIterator.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,8 +13,8 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - #include + #include #define ChildNodeIterator_UpToBrother \ diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_Comment.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_Comment.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_Comment.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_Comment.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,25 +14,12 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. - -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -IMPLEMENT_STANDARD_RTTIEXT(TDataStd_Comment,TDF_Attribute) +#include +#include -#define lid1 45 -#define lid2 36 +IMPLEMENT_DERIVED_ATTRIBUTE(TDataStd_Comment, TDataStd_GenericExtString) //======================================================================= //function : GetID @@ -45,8 +32,6 @@ return TDataStd_CommentID; } - - //======================================================================= //function : Set //purpose : @@ -64,7 +49,6 @@ return A; } - //======================================================================= //function : Set //purpose : @@ -80,78 +64,51 @@ return A; } - //======================================================================= //function : TDataStd_Comment //purpose : //======================================================================= -TDataStd_Comment::TDataStd_Comment () { } - +TDataStd_Comment::TDataStd_Comment () { + myID = GetID(); +} //======================================================================= //function : Set -//purpose : +//purpose : //======================================================================= -void TDataStd_Comment::Set (const TCollection_ExtendedString& S) + +void TDataStd_Comment::Set (const TCollection_ExtendedString& S) { // OCC2932 correction if(myString == S) return; Backup(); - myString = S; } - - -//======================================================================= -//function : Get -//purpose : -//======================================================================= -const TCollection_ExtendedString& TDataStd_Comment::Get () const -{ - return myString; -} - -//======================================================================= -//function : ID -//purpose : -//======================================================================= - -const Standard_GUID& TDataStd_Comment::ID () const { return GetID(); } - - //======================================================================= -//function : NewEmpty -//purpose : +//function : SetID +//purpose : //======================================================================= -Handle(TDF_Attribute) TDataStd_Comment::NewEmpty () const +void TDataStd_Comment::SetID( const Standard_GUID& theGuid) { - return new TDataStd_Comment(); -} + if(myID == theGuid) return; -//======================================================================= -//function : Restore -//purpose : -//======================================================================= - -void TDataStd_Comment::Restore(const Handle(TDF_Attribute)& with) -{ - myString = Handle(TDataStd_Comment)::DownCast (with)->Get (); - return; + Backup(); + myID = theGuid; } //======================================================================= -//function : Paste -//purpose : +//function : SetID +//purpose : sets default ID //======================================================================= -void TDataStd_Comment::Paste (const Handle(TDF_Attribute)& into, - const Handle(TDF_RelocationTable)& /*RT*/) const +void TDataStd_Comment::SetID() { - Handle(TDataStd_Comment)::DownCast (into)->Set (myString); + Backup(); + myID = GetID(); } //======================================================================= @@ -162,11 +119,6 @@ Standard_OStream& TDataStd_Comment::Dump (Standard_OStream& anOS) const { TDF_Attribute::Dump(anOS); - anOS << "Comment=|"< -#include - -#include -#include -#include -#include -class Standard_GUID; -class TDF_Label; -class TCollection_ExtendedString; -class TDF_Attribute; -class TDF_RelocationTable; - +#include class TDataStd_Comment; -DEFINE_STANDARD_HANDLE(TDataStd_Comment, TDF_Attribute) +DEFINE_STANDARD_HANDLE(TDataStd_Comment, TDataStd_GenericExtString) //! Comment attribute. may be associated to any label //! to store user comment. -class TDataStd_Comment : public TDF_Attribute +class TDataStd_Comment : public TDataStd_GenericExtString { public: @@ -58,47 +46,19 @@ Standard_EXPORT static Handle(TDataStd_Comment) Set (const TDF_Label& label, const TCollection_ExtendedString& string); Standard_EXPORT TDataStd_Comment(); - - Standard_EXPORT void Set (const TCollection_ExtendedString& S); - - - //! Returns the comment attribute. - Standard_EXPORT const TCollection_ExtendedString& Get() const; - - Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE; - - Standard_EXPORT void Restore (const Handle(TDF_Attribute)& with) Standard_OVERRIDE; - - Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE; - - Standard_EXPORT void Paste (const Handle(TDF_Attribute)& into, const Handle(TDF_RelocationTable)& RT) const Standard_OVERRIDE; - - Standard_EXPORT virtual Standard_OStream& Dump (Standard_OStream& anOS) const Standard_OVERRIDE; - - Standard_EXPORT Standard_Boolean AfterRetrieval (const Standard_Boolean forceIt = Standard_False) Standard_OVERRIDE; - - + Standard_EXPORT void Set (const TCollection_ExtendedString& S) Standard_OVERRIDE; - DEFINE_STANDARD_RTTIEXT(TDataStd_Comment,TDF_Attribute) + //! Sets the explicit user defined GUID to the attribute. + Standard_EXPORT void SetID (const Standard_GUID& guid) Standard_OVERRIDE; -protected: - - - - -private: - - - TCollection_ExtendedString myString; + //! Sets default GUID for the attribute. + Standard_EXPORT void SetID() Standard_OVERRIDE; + Standard_EXPORT virtual Standard_OStream& Dump (Standard_OStream& anOS) const Standard_OVERRIDE; + + DEFINE_DERIVED_ATTRIBUTE(TDataStd_Comment, TDataStd_GenericExtString) }; - - - - - - #endif // _TDataStd_Comment_HeaderFile diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_Current.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_Current.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_Current.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_Current.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,15 +14,17 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include +#include #include #include -#include #include #include #include #include +#include IMPLEMENT_STANDARD_RTTIEXT(TDataStd_Current,TDF_Attribute) @@ -165,4 +167,18 @@ return anOS; } +//======================================================================= +//function : DumpJson +//purpose : +//======================================================================= +void TDataStd_Current::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const +{ + OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream) + + OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDF_Attribute) + + TCollection_AsciiString aLabel; + TDF_Tool::Entry (myLabel, aLabel); + OCCT_DUMP_FIELD_VALUE_STRING (theOStream, aLabel) +} diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_Current.hxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_Current.hxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_Current.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_Current.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -72,6 +72,9 @@ Standard_EXPORT void Paste (const Handle(TDF_Attribute)& Into, const Handle(TDF_RelocationTable)& RT) const Standard_OVERRIDE; Standard_EXPORT virtual Standard_OStream& Dump (Standard_OStream& anOS) const Standard_OVERRIDE; + + //! Dumps the content of me into the stream + Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE; diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,9 +14,9 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include -#include #include #include #include diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfByteArray.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfByteArray.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfByteArray.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfByteArray.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,6 +13,7 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include @@ -20,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -36,7 +36,9 @@ //======================================================================= TDataStd_DeltaOnModificationOfByteArray::TDataStd_DeltaOnModificationOfByteArray(const Handle(TDataStd_ByteArray)& OldAtt) -: TDF_DeltaOnModification(OldAtt) +: TDF_DeltaOnModification(OldAtt), + myUp1(0), + myUp2(0) { Handle(TDataStd_ByteArray) CurrAtt; if (Label().FindAttribute(OldAtt->ID(),CurrAtt)) { diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfExtStringArray.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfExtStringArray.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfExtStringArray.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfExtStringArray.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,12 +13,12 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include #include #include -#include #include #include #include @@ -35,7 +35,9 @@ //======================================================================= TDataStd_DeltaOnModificationOfExtStringArray::TDataStd_DeltaOnModificationOfExtStringArray(const Handle(TDataStd_ExtStringArray)& OldAtt) -: TDF_DeltaOnModification(OldAtt) +: TDF_DeltaOnModification(OldAtt), + myUp1(0), + myUp2(0) { Handle(TDataStd_ExtStringArray) CurrAtt; if (Label().FindAttribute(OldAtt->ID(),CurrAtt)) { diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfIntArray.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfIntArray.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfIntArray.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfIntArray.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,12 +13,12 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include #include #include -#include #include #include #include @@ -35,7 +35,9 @@ //======================================================================= TDataStd_DeltaOnModificationOfIntArray::TDataStd_DeltaOnModificationOfIntArray(const Handle(TDataStd_IntegerArray)& OldAtt) -: TDF_DeltaOnModification(OldAtt) +: TDF_DeltaOnModification(OldAtt), + myUp1(0), + myUp2(0) { Handle(TDataStd_IntegerArray) CurrAtt; if (Label().FindAttribute(OldAtt->ID(),CurrAtt)) { diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfIntPackedMap.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfIntPackedMap.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfIntPackedMap.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfIntPackedMap.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,12 +13,12 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include #include #include -#include #include #include #include diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfRealArray.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfRealArray.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfRealArray.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_DeltaOnModificationOfRealArray.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -13,12 +13,12 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include #include #include #include -#include #include #include #include @@ -36,7 +36,9 @@ TDataStd_DeltaOnModificationOfRealArray:: TDataStd_DeltaOnModificationOfRealArray(const Handle(TDataStd_RealArray)& OldAtt) -: TDF_DeltaOnModification(OldAtt) +: TDF_DeltaOnModification(OldAtt), + myUp1(0), + myUp2(0) { Handle(TDataStd_RealArray) CurrAtt; if (Label().FindAttribute(OldAtt->ID(),CurrAtt)) { diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_Directory.cxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_Directory.cxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_Directory.cxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_Directory.cxx 2021-02-02 08:51:56.000000000 +0000 @@ -14,19 +14,19 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. +#include #include +#include #include #include #include -#include -#include #include #include #include #include -IMPLEMENT_STANDARD_RTTIEXT(TDataStd_Directory,TDF_Attribute) +IMPLEMENT_DERIVED_ATTRIBUTE(TDataStd_Directory,TDataStd_GenericEmpty) //======================================================================= //function : Find @@ -114,7 +114,6 @@ { } - //======================================================================= //function : ID //purpose : @@ -129,38 +128,10 @@ //purpose : //======================================================================= -Handle(TDF_Attribute) TDataStd_Directory::NewEmpty () const -{ - return new TDataStd_Directory(); -} - -//======================================================================= -//function : Restore -//purpose : -//======================================================================= - -void TDataStd_Directory::Restore(const Handle(TDF_Attribute)&) -{ -} - -//======================================================================= -//function : Paste -//purpose : -//======================================================================= - -void TDataStd_Directory::Paste (const Handle(TDF_Attribute)&, - const Handle(TDF_RelocationTable)& ) const -{ -} - -//======================================================================= -//function : References -//purpose : -//======================================================================= - -void TDataStd_Directory::References (const Handle(TDF_DataSet)&) const -{ -} +//Handle(TDF_Attribute) TDataStd_Directory::NewEmpty () const +//{ +// return new TDataStd_Directory(); +//} //======================================================================= //function : Dump @@ -172,5 +143,3 @@ anOS << "Directory"; return anOS; } - - diff -Nru opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_Directory.hxx opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_Directory.hxx --- opencascade-7.4.1+dfsg1/src/TDataStd/TDataStd_Directory.hxx 2020-04-01 13:52:54.000000000 +0000 +++ opencascade-7.5.1+dfsg1/src/TDataStd/TDataStd_Directory.hxx 2021-02-02 08:51:56.000000000 +0000 @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include class TDF_Label; @@ -31,13 +31,13 @@ class TDataStd_Directory; -DEFINE_STANDARD_HANDLE(TDataStd_Directory, TDF_Attribute) +DEFINE_STANDARD_HANDLE(TDataStd_Directory, TDataStd_GenericEmpty) //! Associates a directory in the data framework with //! a TDataStd_TagSource attribute. //! You can create a new directory label and add //! sub-directory or object labels to it, -class TDataStd_Directory : public TDF_Attribute +class TDataStd_Directory : public TDataStd_GenericEmpty { public: @@ -51,7 +51,7 @@ //! and the attribute found is set as D. Standard_EXPORT static Standard_Boolean Find (const TDF_Label& current, Handle(TDataStd_Directory)& D); - //! Creates an enpty Directory attribute, located at + //! Creates an empty Directory attribute, located at //!